diff --git a/Globals/EventBus.gd b/Globals/EventBus.gd index d7324b6..615eb63 100644 --- a/Globals/EventBus.gd +++ b/Globals/EventBus.gd @@ -3,11 +3,11 @@ extends Node ## [b]Emitter[/b] : [method TowerButton._ready][br] -## [b]Subscriber[/b] : [method PlayerManager._init] +## [b]Subscriber[/b] : [method TowerManager._init] signal tower_selected(towerType : Tower.TYPE) -## [b]Emitter[/b] : [PlayerManager][br] +## [b]Emitter[/b] : [TowerManager][br] ## [b]Subscriber[/b] hero_icon.gd: signal tower_builded(tower : Tower) @@ -27,16 +27,16 @@ signal cube_integrity_changed(_value : int, _max_value : int) signal money_changed(_value : int) -## [b]Emitter[/b] : [PlayerManager][br] +## [b]Emitter[/b] : [TowerManager][br] ## [b]Subscriber[/b] : label_team.gd signal tower_count_changed(_value : int) -## [b]Emitter[/b] : [PlayerManager][br] +## [b]Emitter[/b] : [TowerManager][br] ## [b]Subscriber[/b] : label_team.gd, label_tower_on_terrain.gd signal team_in_action_changed(_value : int) -## [b]Emitter[/b] : [PlayerManager][br] +## [b]Emitter[/b] : [TowerManager][br] ## [b]Subscriber[/b] : label_tower_in_cube[TheCube] signal team_in_rest_changed(_value : int) @@ -52,7 +52,7 @@ signal projectile_shooted(_value : Projectile) signal money_received(_value : int) -## [b]Emitter[/b] : [PlayerManager][br] +## [b]Emitter[/b] : [TowerManager][br] ## [b]Subscriber[/b] : [TheCube] signal money_spent(_value : int) @@ -64,11 +64,11 @@ signal player_has_won() ## [b]Subscriber[/b] : [WaveManager] signal player_defeated() -## [b]Emitter[/b] : [PlayerManager][br] +## [b]Emitter[/b] : [TowerManager][br] ## [b]Subscriber[/b] : [code]null[/code] signal open_shop() -## [b]Emitter[/b] : [PlayerManager][br] +## [b]Emitter[/b] : [TowerManager][br] ## [b]Subscriber[/b] : [code]null[/code] signal close_shop() diff --git a/Levels/level_2.tres b/Levels/level_2.tres index 9483d64..4a24e54 100644 --- a/Levels/level_2.tres +++ b/Levels/level_2.tres @@ -1,30 +1,10 @@ [gd_resource type="Resource" script_class="Level" load_steps=3 format=3 uid="uid://hlv6kd67wipi"] -[sub_resource type="GDScript" id="GDScript_5jnuq"] -script/source = "@tool -extends Resource -class_name Level - -@export var waves : Array[Wave] -@export var auto_start : bool = false -@export var allowedTowers : Array[Tower.TYPES] : set = allowedTowersHasChanged - - -func allowedTowersHasChanged(value) -> void: - allowedTowers = value - if Engine.is_editor_hint(): - EventBus.allowedTowerHasChange.emit(allowedTowers) -" - -[sub_resource type="GDScript" id="GDScript_h3rs5"] -script/source = "extends Resource -class_name Wave - -@export var troops : Array[Troop] -" +[ext_resource type="Script" uid="uid://cuhq6u67cbbqm" path="res://Scripts/Level/Level.gd" id="1_e3k30"] +[ext_resource type="Script" uid="uid://chu8s12rtdeqx" path="res://Scripts/Level/Wave.gd" id="2_8ao5l"] [resource] -script = SubResource("GDScript_5jnuq") -waves = Array[SubResource("GDScript_h3rs5")]([]) +script = ExtResource("1_e3k30") +waves = Array[ExtResource("2_8ao5l")]([]) auto_start = false allowedTowers = Array[int]([]) diff --git a/Levels/world.gd b/Levels/world.gd index 2a0f3ae..2f1d5c7 100644 --- a/Levels/world.gd +++ b/Levels/world.gd @@ -4,3 +4,8 @@ var selected_collider : CollisionObject3D func _ready() -> void: $WaveManager.spawn_next_wave() + EventBus.projectile_shooted.connect(onProjectileShooted) + + +func onProjectileShooted(projectile : Projectile) -> void: + add_child(projectile) diff --git a/Levels/world.tscn b/Levels/world.tscn index c3c1a83..9e1259d 100644 --- a/Levels/world.tscn +++ b/Levels/world.tscn @@ -1,13 +1,12 @@ -[gd_scene load_steps=14 format=3 uid="uid://ky0uewndeuwv"] +[gd_scene load_steps=13 format=3 uid="uid://ky0uewndeuwv"] [ext_resource type="Script" uid="uid://qqid42jkpkmv" path="res://Levels/world.gd" id="1_fj7yv"] [ext_resource type="Texture2D" uid="uid://o83munu8dibp" path="res://Assets/Icones/kenney_game_icons_vector.svg" id="3_ikoig"] -[ext_resource type="Script" uid="uid://caf3yamufmhd4" path="res://Scripts/PlayerManager.gd" id="3_ju8gl"] +[ext_resource type="Script" uid="uid://caf3yamufmhd4" path="res://Scripts/TowerManager.gd" id="3_ju8gl"] [ext_resource type="Script" uid="uid://tpon511km4al" path="res://Scripts/WaveManager.gd" id="5_036b0"] [ext_resource type="Resource" uid="uid://ob41fnhkjr3o" path="res://Levels/level_1.tres" id="8_44brb"] [ext_resource type="PackedScene" uid="uid://gp46cl8euhyf" path="res://Levels/map_1.tscn" id="8_rljl1"] [ext_resource type="PackedScene" uid="uid://p6a6rb7sgeqd" path="res://UI/gui.tscn" id="12_ikoig"] -[ext_resource type="Script" uid="uid://xkk2pxkrwsq8" path="res://bullet_container.gd" id="12_k3n1d"] [sub_resource type="Animation" id="Animation_oyb16"] length = 0.001 @@ -114,9 +113,6 @@ light_energy = 0.0 [node name="GUI" parent="CanvasLayer" instance=ExtResource("12_ikoig")] -[node name="BulletContainer" type="Node3D" parent="."] -script = ExtResource("12_k3n1d") - [node name="Towers" type="Node3D" parent="."] [node name="Map1" parent="." instance=ExtResource("8_rljl1")] diff --git a/Levels/world_1.tscn b/Levels/world_1.tscn index 07c1679..a5224bb 100644 --- a/Levels/world_1.tscn +++ b/Levels/world_1.tscn @@ -1,13 +1,12 @@ -[gd_scene load_steps=14 format=3 uid="uid://iqbfpj8uwgfg"] +[gd_scene load_steps=13 format=3 uid="uid://iqbfpj8uwgfg"] [ext_resource type="Script" uid="uid://qqid42jkpkmv" path="res://Levels/world.gd" id="1_2lxla"] -[ext_resource type="Script" uid="uid://caf3yamufmhd4" path="res://Scripts/PlayerManager.gd" id="2_8rc3q"] +[ext_resource type="Script" uid="uid://caf3yamufmhd4" path="res://Scripts/TowerManager.gd" id="2_8rc3q"] [ext_resource type="PackedScene" uid="uid://gp46cl8euhyf" path="res://Levels/map_1.tscn" id="2_i3h8e"] [ext_resource type="Texture2D" uid="uid://o83munu8dibp" path="res://Assets/Icones/kenney_game_icons_vector.svg" id="3_i3h8e"] [ext_resource type="Script" uid="uid://tpon511km4al" path="res://Scripts/WaveManager.gd" id="4_fonyy"] [ext_resource type="Resource" uid="uid://ob41fnhkjr3o" path="res://Levels/level_1.tres" id="5_o5evx"] [ext_resource type="PackedScene" uid="uid://p6a6rb7sgeqd" path="res://UI/gui.tscn" id="6_dinfn"] -[ext_resource type="Script" uid="uid://xkk2pxkrwsq8" path="res://bullet_container.gd" id="7_3rsx3"] [sub_resource type="Animation" id="Animation_oyb16"] length = 0.001 @@ -75,11 +74,11 @@ transform = Transform3D(0.998593, -0.0233153, 0.0476287, -0.00234758, 0.877843, [node name="Map1" parent="." instance=ExtResource("2_i3h8e")] -[node name="PlayerManager" type="Node3D" parent="."] +[node name="TowerManager" type="Node3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.73017, 0.728414, 0) script = ExtResource("2_8rc3q") -[node name="Sprite3DSelection" type="Sprite3D" parent="PlayerManager"] +[node name="Sprite3DSelection" type="Sprite3D" parent="TowerManager"] modulate = Color(0.966071, 0.695469, 0, 1) pixel_size = 0.03 axis = 1 @@ -91,7 +90,7 @@ vframes = 7 frame = 44 region_rect = Rect2(703, 96, 21, 30) -[node name="AnimationPlayer" type="AnimationPlayer" parent="PlayerManager"] +[node name="AnimationPlayer" type="AnimationPlayer" parent="TowerManager"] libraries = { &"": SubResource("AnimationLibrary_43wwi") } @@ -116,7 +115,4 @@ light_energy = 0.0 [node name="GUI" parent="CanvasLayer" instance=ExtResource("6_dinfn")] -[node name="BulletContainer" type="Node3D" parent="."] -script = ExtResource("7_3rsx3") - [node name="Towers" type="Node3D" parent="."] diff --git a/Projectiles/Projectile.gd b/Projectiles/Projectile.gd index cac978d..c7b9e2a 100644 --- a/Projectiles/Projectile.gd +++ b/Projectiles/Projectile.gd @@ -1,32 +1,20 @@ extends CharacterBody3D class_name Projectile -const ENEMY : int = 1 -const ALLY : int = 2 +const TARGET_ENEMY : int = 1 ## Flag to target enemy +const TARGET_ALLY : int = 2 ## Flag to target ally const MINIMUN_AREA : float = .1 -@export var speed : int = 20 -@export_range(MINIMUN_AREA, 1000) var radius : float = MINIMUN_AREA -@export var isAOE := false -@export_flags("Enemies", "Alliés") var allowedTargets : int = ENEMY - - -@onready var projectileArea : CollisionShape3D = $Impact/ProjectileArea -@onready var projectileSize : CollisionShape3D = $Impact/ProjectileSize - - +var speed : int = 20 +var isAOE : bool = false +var allowedTargets : int = TARGET_ENEMY var target : PhysicsBody3D var damage : int = 1 -var bodiesInRange : Array[Node3D] var enemiesInRange : Array[Enemy] var allyInRange : Array[Tower] -func _ready() -> void: - enemiesInRange.append(target) - - func _physics_process(delta: float) -> void: if is_instance_valid(target): velocity = global_position.direction_to(target.global_position) * speed @@ -38,7 +26,6 @@ func _physics_process(delta: float) -> void: func onBodyEnteredDamageArea(body: Node3D) -> void: - print(body.get_class()) if isAOE && targetable(body): if body is Enemy: enemiesInRange.append(body) @@ -46,29 +33,40 @@ func onBodyEnteredDamageArea(body: Node3D) -> void: allyInRange.append(body) -func OnBodyExitedDamageArea(body: Node3D) -> void: +func onBodyExitedDamageArea(body: Node3D) -> void: if body is Enemy: enemiesInRange.erase(body) if body is Tower: allyInRange.erase(body) -func onBodyCollideWithProjectile(body : Node3D) -> void: +func onBodyCollideWithProjectile(body: Node3D) -> void: if body == target: resolveDamages() func targetable(body: Node3D) -> bool: if body is Enemy: - return ENEMY & allowedTargets + return TARGET_ENEMY & allowedTargets if body is Tower: - return ALLY & allowedTargets + return TARGET_ALLY & allowedTargets return false func resolveDamages() -> void: - print(enemiesInRange) for enemy in enemiesInRange: enemy.take_damage(damage) queue_free() + + +func loadProjectile(resource : ProjectileResource, startPosition: Vector3, _target: PhysicsBody3D) -> void: + target = _target + enemiesInRange.append(target) + global_position = startPosition + speed = resource.speed + isAOE = resource.isAOE + allowedTargets = resource.allowedTargets + $Sprite3D.texture = resource.sprite + if isAOE && resource.damageArea: + $DamageArea/ProjectileArea.shape = resource.damageArea diff --git a/Projectiles/ProjectileResource.gd b/Projectiles/ProjectileResource.gd new file mode 100644 index 0000000..71a0b71 --- /dev/null +++ b/Projectiles/ProjectileResource.gd @@ -0,0 +1,10 @@ +extends Resource +class_name ProjectileResource + + +@export var speed : int = 20 +@export var damage : int = 1 +@export var isAOE : bool = false +@export_flags("Enemies", "Alliés") var allowedTargets : int = 1 +@export var damageArea : Shape3D +@export var sprite : Texture2D diff --git a/Projectiles/ProjectileResource.gd.uid b/Projectiles/ProjectileResource.gd.uid new file mode 100644 index 0000000..eac2883 --- /dev/null +++ b/Projectiles/ProjectileResource.gd.uid @@ -0,0 +1 @@ +uid://ddgbr0n8kic3y diff --git a/Projectiles/projectile.tscn b/Projectiles/projectile.tscn index c4dde35..1233ee7 100644 --- a/Projectiles/projectile.tscn +++ b/Projectiles/projectile.tscn @@ -7,11 +7,10 @@ radius = 0.1 [sub_resource type="SphereShape3D" id="SphereShape3D_dsts2"] -radius = 1.5 +radius = 0.1 [node name="Projectile" type="CharacterBody3D"] script = ExtResource("1_ggq0q") -speed = 10 [node name="CollisionShape3D" type="CollisionShape3D" parent="."] shape = SubResource("SphereShape3D_r5o86") @@ -34,9 +33,8 @@ collision_layer = 4 collision_mask = 4 [node name="ProjectileArea" type="CollisionShape3D" parent="DamageArea"] -shape = SubResource("SphereShape3D_dsts2") debug_color = Color(0.926858, 0.237749, 0.335021, 0.42) [connection signal="body_entered" from="HitBox" to="." method="onBodyCollideWithProjectile" flags=3] [connection signal="body_entered" from="DamageArea" to="." method="onBodyEnteredDamageArea"] -[connection signal="body_exited" from="DamageArea" to="." method="OnBodyExitedDamageArea"] +[connection signal="body_exited" from="DamageArea" to="." method="onBodyExitedDamageArea"] diff --git a/Scripts/PlayerManager.gd b/Scripts/TowerManager.gd similarity index 95% rename from Scripts/PlayerManager.gd rename to Scripts/TowerManager.gd index b442d11..4f7f098 100644 --- a/Scripts/PlayerManager.gd +++ b/Scripts/TowerManager.gd @@ -1,16 +1,16 @@ extends Node3D -class_name PlayerManager +class_name TowerManager -const towerListResource := preload("res://Towers/towers.tres") +const towerListResource : TowerListResource = preload("res://Towers/towers.tres") enum STATE { IDLE, PLACING } -var _state := STATE.IDLE +var _state : int = STATE.IDLE @onready var selected_tower : Tower = null var selected_tower_type : Tower.TYPE = Tower.TYPE.NONE @onready var cam : Camera3D = $"../Camera3D" -@onready var the_cube : TheCube = %TheCube +@onready var the_cube : TheCube = $"../Map1/TheCube" @onready var selection_icon : Sprite3D = $Sprite3DSelection var towers : Dictionary diff --git a/Scripts/PlayerManager.gd.uid b/Scripts/TowerManager.gd.uid similarity index 100% rename from Scripts/PlayerManager.gd.uid rename to Scripts/TowerManager.gd.uid diff --git a/Scripts/WaveManager.gd b/Scripts/WaveManager.gd index 0189b15..76d2c36 100644 --- a/Scripts/WaveManager.gd +++ b/Scripts/WaveManager.gd @@ -11,7 +11,7 @@ var enemies_to_spawn : int = 0 var wave : int = 0 var enemies_alive : int = 0 -@onready var troopTimer := $TroopTimer +@onready var troopTimer : Timer = $TroopTimer func _ready() -> void: @@ -42,10 +42,10 @@ func spawn_troop() -> void: func spawnEnemy(delay : float) -> void: - var enemy := createEnemy() + var enemy : PathFollow3D = createEnemy() if delay > 0: - var enemyTimer := createTimer(delay) + var enemyTimer : Timer = createTimer(delay) enemyTimer.timeout.connect( func(): add_child(enemy) @@ -91,7 +91,7 @@ func clearLevel() -> void: func createTimer(delay : float, oneShot = true, autoStart = true) -> Timer : - var timer := Timer.new() + var timer : Timer = Timer.new() timer.wait_time = delay timer.one_shot = oneShot timer.autostart = autoStart diff --git a/Towers/Aline/aline.tscn b/Towers/Aline/aline.tscn index 332b1d9..89bb3c4 100644 --- a/Towers/Aline/aline.tscn +++ b/Towers/Aline/aline.tscn @@ -1,10 +1,25 @@ -[gd_scene load_steps=6 format=3 uid="uid://ck1qryleu80s"] +[gd_scene load_steps=10 format=3 uid="uid://ck1qryleu80s"] [ext_resource type="PackedScene" uid="uid://trg7ag3dqr2l" path="res://Towers/tower.tscn" id="1_gvvig"] [ext_resource type="Script" uid="uid://16hafh01iv" path="res://Towers/Aline/aline.gd" id="2_6sjqq"] [ext_resource type="Texture2D" uid="uid://cob1lydkirn20" path="res://Assets/Icones/raccoon-head.svg" id="3_6h033"] [ext_resource type="Script" uid="uid://bg0x4egeu17qb" path="res://Scripts/Upgrades/TowerUpgrade.gd" id="3_p2nb1"] +[ext_resource type="Script" uid="uid://ddgbr0n8kic3y" path="res://Projectiles/ProjectileResource.gd" id="4_ck6a3"] [ext_resource type="Texture2D" uid="uid://315k07rsgf6t" path="res://Assets/Characters/Female1.png" id="5_l514g"] +[ext_resource type="Texture2D" uid="uid://dqyhhvxpwtpsy" path="res://Assets/Emotes/emote_star.png" id="5_lhd8w"] + +[sub_resource type="SphereShape3D" id="SphereShape3D_lhd8w"] +radius = 0.6 + +[sub_resource type="Resource" id="Resource_lhd8w"] +script = ExtResource("4_ck6a3") +speed = 20 +damage = 10 +isAOE = true +allowedTargets = 1 +damageArea = SubResource("SphereShape3D_lhd8w") +sprite = ExtResource("5_lhd8w") +metadata/_custom_type_script = "uid://ddgbr0n8kic3y" [node name="Aline" instance=ExtResource("1_gvvig")] script = ExtResource("2_6sjqq") @@ -13,10 +28,11 @@ tower_type = 2 icone = ExtResource("3_6h033") bio = "" price = 150 -bullet_damage = 10 +projectileRessource = SubResource("Resource_lhd8w") +action_cooldown = 2.5 energy_cost = 25.0 tower_shop = Array[ExtResource("3_p2nb1")]([]) -[node name="Sprite3D" parent="." index="6"] +[node name="Sprite3D" parent="." index="5"] texture = ExtResource("5_l514g") frame = 10 diff --git a/Towers/Evan/evan.tscn b/Towers/Evan/evan.tscn index 7a89eaa..74a6d10 100644 --- a/Towers/Evan/evan.tscn +++ b/Towers/Evan/evan.tscn @@ -1,9 +1,20 @@ -[gd_scene load_steps=5 format=3 uid="uid://c4ta0aynybpis"] +[gd_scene load_steps=8 format=3 uid="uid://c4ta0aynybpis"] [ext_resource type="PackedScene" uid="uid://trg7ag3dqr2l" path="res://Towers/tower.tscn" id="1_yctfx"] [ext_resource type="Script" uid="uid://cyxxauybvvfyj" path="res://Towers/Evan/evan.gd" id="2_fuecn"] [ext_resource type="Texture2D" uid="uid://dwwgho6f8f4kj" path="res://Assets/Icones/penguin.svg" id="3_nvfjk"] +[ext_resource type="Script" uid="uid://ddgbr0n8kic3y" path="res://Projectiles/ProjectileResource.gd" id="4_el20i"] [ext_resource type="Script" uid="uid://bg0x4egeu17qb" path="res://Scripts/Upgrades/TowerUpgrade.gd" id="4_v32j5"] +[ext_resource type="Texture2D" uid="uid://dqyhhvxpwtpsy" path="res://Assets/Emotes/emote_star.png" id="5_el20i"] + +[sub_resource type="Resource" id="Resource_ykufo"] +script = ExtResource("4_el20i") +speed = 20 +damage = 1 +isAOE = false +allowedTargets = 1 +sprite = ExtResource("5_el20i") +metadata/_custom_type_script = "uid://ddgbr0n8kic3y" [node name="Evan" instance=ExtResource("1_yctfx")] script = ExtResource("2_fuecn") @@ -11,5 +22,5 @@ tower_name = "Evan" tower_type = 5 icone = ExtResource("3_nvfjk") bio = "" -bullet_damage = 1 +projectileRessource = SubResource("Resource_ykufo") tower_shop = Array[ExtResource("4_v32j5")]([]) diff --git a/Towers/Pierre/pierre.tscn b/Towers/Pierre/pierre.tscn index 8d09d62..d933294 100644 --- a/Towers/Pierre/pierre.tscn +++ b/Towers/Pierre/pierre.tscn @@ -1,8 +1,19 @@ -[gd_scene load_steps=4 format=3 uid="uid://bj6srer7ghf7p"] +[gd_scene load_steps=7 format=3 uid="uid://bj6srer7ghf7p"] [ext_resource type="PackedScene" uid="uid://trg7ag3dqr2l" path="res://Towers/tower.tscn" id="1_7f7qx"] [ext_resource type="Script" uid="uid://q4o384wv3ijj" path="res://Towers/Pierre/pierre.gd" id="1_v16mf"] [ext_resource type="Texture2D" uid="uid://bb4wihq1n1wm7" path="res://Assets/Icones/labrador-head.svg" id="3_odfqx"] +[ext_resource type="Script" uid="uid://ddgbr0n8kic3y" path="res://Projectiles/ProjectileResource.gd" id="4_3juah"] +[ext_resource type="Texture2D" uid="uid://dqyhhvxpwtpsy" path="res://Assets/Emotes/emote_star.png" id="5_p33h4"] + +[sub_resource type="Resource" id="Resource_3ht5a"] +script = ExtResource("4_3juah") +speed = 20 +damage = 5 +isAOE = false +allowedTargets = 1 +sprite = ExtResource("5_p33h4") +metadata/_custom_type_script = "uid://ddgbr0n8kic3y" [node name="Pierre" instance=ExtResource("1_7f7qx")] script = ExtResource("1_v16mf") @@ -10,6 +21,7 @@ tower_name = "Pierre" tower_type = 1 icone = ExtResource("3_odfqx") bio = null +projectileRessource = SubResource("Resource_3ht5a") action_cooldown = 1.0 max_energy = 50.0 energy_regen = 5.0 diff --git a/Towers/TowerListResource.gd b/Towers/TowerListResource.gd index 6cb3612..ddf29b8 100644 --- a/Towers/TowerListResource.gd +++ b/Towers/TowerListResource.gd @@ -5,7 +5,7 @@ class_name TowerListResource @export var towers : Array[TowerResource] : set = towersHasChanged func getTowerSceneById(towerType : Tower.TYPE) -> PackedScene : - var towerIndex := towers.find_custom(func(towerResource): return towerResource.towerType == towerType) + var towerIndex : int = towers.find_custom(func(towerResource): return towerResource.towerType == towerType) return towers[towerIndex].towerScene diff --git a/Towers/tower.gd b/Towers/tower.gd index d7ddd74..7213bb0 100644 --- a/Towers/tower.gd +++ b/Towers/tower.gd @@ -5,25 +5,23 @@ class_name Tower # DANGER "NONE" Should always be first enum TYPE { NONE, PIERRE, ALINE, MAXENCE, VICTORIA, EVAN, ALEX, GERALDINE } -var projectile : PackedScene = preload("res://Projectiles/projectile.tscn") +var projectileScene : PackedScene = preload("res://Projectiles/projectile.tscn") + @export var tower_name : String = "None" @export var tower_type : TYPE @export var icone : Texture2D @export var bio : String - @export var price : int = 100 @export_group("Attack") -@export var projectile_damage : int = 1 +@export var projectileRessource : ProjectileResource @export var action_cooldown : float = 1.5: set(value): action_cooldown = clamp(value, 0.3, 999) $Cooldown.wait_time = action_cooldown @export_group("Energy") -@export var max_energy : float = 100.0: - set(value): - max_energy = value +@export var max_energy : float = 100.0 @export var energy_regen : float = 10.0 @export var energy_cost : float = 50.0 @@ -88,6 +86,7 @@ func _ready() -> void: energy_bar.set_up(energy, max_energy) energy_bar.set_max_value(max_energy) $Cooldown.wait_time = action_cooldown + EventBus.energy_has_changed.emit(self) func _process(delta: float) -> void: if is_rest: @@ -103,10 +102,8 @@ func _process(delta: float) -> void: func shoot() -> void: energy -= energy_cost - var projectile : Projectile = projectile.instantiate() - projectile.target = current - projectile.damage = projectile_damage - projectile.global_position = $Aim.global_position + var projectile : Projectile = projectileScene.instantiate() + projectile.loadProjectile(projectileRessource, $Aim.global_position, current) EventBus.projectile_shooted.emit(projectile) diff --git a/Towers/tower.tscn b/Towers/tower.tscn index ddca15d..56002ff 100644 --- a/Towers/tower.tscn +++ b/Towers/tower.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=10 format=3 uid="uid://trg7ag3dqr2l"] -[ext_resource type="Script" uid="uid://8kpvuurr5h5n" path="res://Towers/tower.gd" id="1_egfuc"] +[ext_resource type="Script" uid="uid://8kpvuurr5h5n" path="res://Towers/Tower.gd" id="1_egfuc"] [ext_resource type="Texture2D" uid="uid://bn6ikwol6x8r0" path="res://Assets/Characters/Male1.png" id="2_egfuc"] [ext_resource type="Texture2D" uid="uid://uptdcefxlv4c" path="res://Assets/Icones/ppdf_bio_image_placeholder_2.png" id="2_mnaic"] [ext_resource type="Script" uid="uid://bg0x4egeu17qb" path="res://Scripts/Upgrades/TowerUpgrade.gd" id="3_5dr1v"] diff --git a/UI/gui.gd b/UI/gui.gd index ec84c0c..bd764df 100644 --- a/UI/gui.gd +++ b/UI/gui.gd @@ -3,8 +3,8 @@ extends Control const BUTTON_QTY = 12 -const towerButton := preload("res://UI/tower_button.tscn") -var towerListResource := preload("res://Towers/towers.tres") +const towerButton : PackedScene = preload("res://UI/tower_button.tscn") +var towerListResource : TowerListResource = preload("res://Towers/towers.tres") @onready var buttonContainer = $HBoxContainer/ControlPanelBase/MarginContainer/GridContainer @@ -30,8 +30,8 @@ func _on_button_quit_game_pressed() -> void: get_tree().quit() -func allowedTowerHasChange(allowedTowers : Array[Tower.TYPE]) -> void: - self.allowedTowers = allowedTowers +func allowedTowerHasChange(_allowedTowers : Array[Tower.TYPE]) -> void: + allowedTowers = _allowedTowers if is_node_ready(): addTowerButtonNodes() @@ -47,7 +47,7 @@ func addTowerButtonNodes() -> void: additionalPlaceholder += 1 continue - var towerBtn := towerButton.instantiate() + var towerBtn : TowerButton = towerButton.instantiate() var tower : Tower = towerResource.towerScene.instantiate() towerBtn.towerType = tower.tower_type towerBtn.tooltip_text = tower.name @@ -57,7 +57,7 @@ func addTowerButtonNodes() -> void: buttonContainer.add_child(towerBtn) for i in BUTTON_QTY - towerListResource.towers.size() + additionalPlaceholder: - var placeholderBtn := Button.new() + var placeholderBtn : Button = Button.new() placeholderBtn.set_meta("dynamicButton", true) placeholderBtn.custom_minimum_size = Vector2(80, 80) buttonContainer.add_child(placeholderBtn) diff --git a/UI/tower_button.gd b/UI/tower_button.gd index fbbbc51..88f937a 100644 --- a/UI/tower_button.gd +++ b/UI/tower_button.gd @@ -9,6 +9,7 @@ func _ready() -> void: if not Engine.is_editor_hint(): pressed.connect(EventBus.tower_selected.emit.bind(towerType)) EventBus.energy_has_changed.connect(changeEnergy) + EventBus.tower_builded.connect(towerBuilded) func changeEnergy(tower : Tower) -> void: @@ -16,5 +17,10 @@ func changeEnergy(tower : Tower) -> void: $ProgressBar.value = tower.energy +func towerBuilded(tower : Tower) -> void : + if tower.tower_type == towerType: + $ProgressBar.max_value = tower.max_energy + + func setButtonTexture(texture : Texture2D) -> void: $TextureRect.texture = texture diff --git a/addons/LevelEditor/UI/CustomOptionButton.gd b/addons/LevelEditor/UI/CustomOptionButton.gd index 5210d0d..333d4c0 100644 --- a/addons/LevelEditor/UI/CustomOptionButton.gd +++ b/addons/LevelEditor/UI/CustomOptionButton.gd @@ -20,7 +20,7 @@ func setOptions(options : Dictionary, defaultSelectedValue : String = "") -> voi selectItemByValue(defaultSelectedValue) -func addOption(value : String, displayName : String, autoSelect := false) -> void: +func addOption(value : String, displayName : String, autoSelect : bool = false) -> void: add_item(displayName) options.set(value, displayName) @@ -30,14 +30,14 @@ func addOption(value : String, displayName : String, autoSelect := false) -> voi func itemHasBeenSelected(index : int) -> void: - var value := options.get(get_item_text(index)) + var value = options.get(get_item_text(index)) if selectedValue != value: selectedValue = value onValueChanged.emit(selectedValue) func selectItemByValue(value : String) -> void: - var name := options.find_key(value) + var name = options.find_key(value) for i in item_count: if get_item_text(i) == name: selected = i diff --git a/addons/LevelEditor/WaveMaker.gd b/addons/LevelEditor/WaveMaker.gd index dffd336..bf43fe2 100644 --- a/addons/LevelEditor/WaveMaker.gd +++ b/addons/LevelEditor/WaveMaker.gd @@ -16,10 +16,10 @@ enum DIRECTION { UP, DOWN, TOP, LEFT, VERTICAL, HORIZONTAL} var enemies : Dictionary -@onready var autoLaunchLevel := $VBoxContainer2/ButtonContainer2/AutoLaunchLevel -@onready var levelSelect := $VBoxContainer2/HBoxContainer/LevelSelect +@onready var autoLaunchLevel : CheckButton = $VBoxContainer2/ButtonContainer2/AutoLaunchLevel +@onready var levelSelect : CustomOptionButton = $VBoxContainer2/HBoxContainer/LevelSelect @onready var waveTabContainer : TabContainer = $VBoxContainer2/ScrollContainer/WaveContainer -@onready var towerSelector := $VBoxContainer2/ButtonContainer5/TowerSelector +@onready var towerSelector : ItemList = $VBoxContainer2/ButtonContainer5/TowerSelector var level : Level var currentWave : int = -1 @@ -66,7 +66,7 @@ func manageAllowedTowers() -> void: func buildWave(wave : Wave) -> VBoxContainer: - var troopContainer := VBoxContainer.new() + var troopContainer : VBoxContainer = VBoxContainer.new() for i in wave.troops.size(): var troop : Troop = wave.troops[i] @@ -76,7 +76,7 @@ func buildWave(wave : Wave) -> VBoxContainer: troopContainer.add_child(HSeparator.new()) if troop.spawn_delay: - var timeSeparator := buildInputLabel( + var timeSeparator : HBoxContainer = buildInputLabel( func(newValue): troop.spawn_delay = newValue if newValue == 0: @@ -99,11 +99,11 @@ func buildWave(wave : Wave) -> VBoxContainer: nodeToAppend = troopContainer.get_child(troopContainer.get_child_count() - 1) nodeToAppend.add_child(VSeparator.new()) - var ennemyContainer := VBoxContainer.new() + var ennemyContainer : VBoxContainer = VBoxContainer.new() ennemyContainer.add_child(createSection("Troop N°" + str(i + 1), removeTroop.bind(troop, wave), TROOP_LABEL_SETTINGS)) if troop.spawn_delay == 0: - var button := Button.new() + var button : Button = Button.new() button.text = "Séparer" button.pressed.connect( func(): @@ -115,7 +115,7 @@ func buildWave(wave : Wave) -> VBoxContainer: buildTroop(troop, ennemyContainer) nodeToAppend.add_child(ennemyContainer) - var addTroopBtn := Button.new() + var addTroopBtn : Button = Button.new() addTroopBtn.text = "Ajouter une troupe" addTroopBtn.pressed.connect(addTroop.bind(wave)) troopContainer.add_child(addTroopBtn) @@ -125,16 +125,16 @@ func buildWave(wave : Wave) -> VBoxContainer: func buildTroop(troop : Troop, ennemyContainer : VBoxContainer) -> void: - var qtyEdit := buildInputLabel( + var qtyEdit : HBoxContainer = buildInputLabel( func(newValue): troop.number_to_spawn = newValue, troop.number_to_spawn, CustomLineEdit.TYPE.INT, "x" ) - var enemySelector := CustomOptionButton.new() + var enemySelector : CustomOptionButton = CustomOptionButton.new() enemySelector.onValueChanged.connect(func(resourcePath): troop.enemy = load(resourcePath)) - var enemy := troop.enemy.resource_path if troop.enemy else "" + var enemy : String = troop.enemy.resource_path if troop.enemy else "" enemySelector.setOptions(enemies, enemy) qtyEdit.add_child(enemySelector) @@ -142,18 +142,18 @@ func buildTroop(troop : Troop, ennemyContainer : VBoxContainer) -> void: func buildInputLabel(updateCallback : Callable, delay : float, type : CustomLineEdit.TYPE, text : String = "") -> HBoxContainer: - var container := HBoxContainer.new() + var container : HBoxContainer = HBoxContainer.new() container.size_flags_vertical = Control.SIZE_SHRINK_CENTER container.alignment = BoxContainer.ALIGNMENT_CENTER - var timeEdit := CustomLineEdit.new() + var timeEdit : CustomLineEdit = CustomLineEdit.new() timeEdit.inputType = type timeEdit.setValue(delay) timeEdit.valueHasChanged.connect(updateCallback) container.add_child(timeEdit) if text: - var label := Label.new() + var label : Label = Label.new() label.text = text label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER label.label_settings = BASE_LABEL_SETTINGS @@ -163,13 +163,13 @@ func buildInputLabel(updateCallback : Callable, delay : float, type : CustomLine func createSection(sectionName : String, BtnCallback : Callable, settings : LabelSettings = BASE_LABEL_SETTINGS) -> HSplitContainer : - var container := HSplitContainer.new() + var container : HSplitContainer = HSplitContainer.new() - var label := Label.new() + var label : Label = Label.new() label.text = sectionName label.label_settings = settings - var button := Button.new() + var button : Button = Button.new() button.text = "Supprimer" button.pressed.connect(BtnCallback) @@ -196,10 +196,10 @@ func removeTroop(troop : Troop, fromWave : Wave) -> void: func refreshWaveNode(wave : Wave, waveIdx : int) -> void: - var waveNode := waveTabContainer.get_child(waveIdx) + var waveNode : VBoxContainer = waveTabContainer.get_child(waveIdx) waveTabContainer.remove_child(waveNode) waveNode.queue_free() - var waveUI := buildWave(wave) + var waveUI : = buildWave(wave) waveTabContainer.add_child(waveUI) waveTabContainer.move_child(waveUI, waveIdx) recreateTabBar() @@ -219,14 +219,14 @@ func resetApp() -> void: func removeWave() -> void: level.waves.remove_at(currentWave) - var wave := waveTabContainer.get_child(currentWave) + var wave : VBoxContainer = waveTabContainer.get_child(currentWave) waveTabContainer.remove_child(wave) wave.queue_free() recreateTabBar() func addWave() -> void: - var wave := Wave.new() + var wave : Wave = Wave.new() level.waves.append(wave) waveTabContainer.add_child(buildWave(wave)) recreateTabBar() @@ -282,10 +282,10 @@ func onSelectedTowerChange(index: int, selected: int) -> void: func getOptionsFromFile(path : String, regexPattern : String) -> Dictionary : var files = {} - var regex := RegEx.create_from_string(regexPattern) - var dir := DirAccess.open(path) + var regex : RegEx = RegEx.create_from_string(regexPattern) + var dir : DirAccess = DirAccess.open(path) for file in dir.get_files(): - var fileMatch := regex.search(file) + var fileMatch : RegExMatch = regex.search(file) if fileMatch: files.set(fileMatch.strings[1], path + "/" + file) @@ -293,7 +293,7 @@ func getOptionsFromFile(path : String, regexPattern : String) -> Dictionary : func recreateTabBar() -> void: - var waveTabBar := waveTabContainer.get_tab_bar() + var waveTabBar : TabBar = waveTabContainer.get_tab_bar() for i in waveTabBar.tab_count: if i < waveTabContainer.get_child_count(): diff --git a/bullet_container.gd b/bullet_container.gd deleted file mode 100644 index d233cb9..0000000 --- a/bullet_container.gd +++ /dev/null @@ -1,8 +0,0 @@ -extends Node3D - -func _ready() -> void: - EventBus.projectile_shooted.connect(_on_EventBus_projectile_shooted) - - -func _on_EventBus_projectile_shooted(projectile : Projectile) -> void: - add_child(projectile) diff --git a/bullet_container.gd.uid b/bullet_container.gd.uid deleted file mode 100644 index 7de4c9b..0000000 --- a/bullet_container.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://xkk2pxkrwsq8