From 455835d3310eb38dced9229564b629f455201af2 Mon Sep 17 00:00:00 2001 From: Varylios Date: Sun, 14 Sep 2025 22:54:54 +0200 Subject: [PATCH] refactor: change projectile logic --- Enemies/Scenes/boss-james.tscn | 22 +-- Enemies/boss.gd | 6 +- Enemies/enemy.tscn | 1 + Levels/Scripts/Resource/Troop.gd | 2 +- Levels/test_map.tscn | 3 +- .../Projectiles/{ => Draft}/ImpactPierre.tscn | 0 .../{ => Draft}/ProjectilePierre.tscn | 0 .../Projectiles/{ => Draft}/impact_pierre.gd | 0 .../{ => Draft}/impact_pierre.gd.uid | 0 .../{ => Draft}/projectile_pierre.gd | 0 .../{ => Draft}/projectile_pierre.gd.uid | 0 Towers/Projectiles/Projectile.gd | 183 +++++++++--------- Towers/Projectiles/ProjectileResource.gd | 19 -- Towers/Projectiles/ProjectileResource.gd.uid | 1 - .../Projectiles/Scenes/projectile-Aline.tscn | 21 ++ .../Projectiles/Scenes/projectile-James.tscn | 19 ++ .../Projectiles/Scenes/projectile-Pierre.tscn | 10 + .../Scenes/projectile-Victoria.tscn | 20 ++ Towers/Projectiles/projectile.tscn | 9 +- Towers/Scenes/aline.tscn | 22 +-- Towers/Scenes/evan.tscn | 21 +- Towers/Scenes/geraldine.tscn | 2 - Towers/Scenes/maxence.tscn | 19 +- Towers/Scenes/pierre.tscn | 18 +- Towers/Scenes/victoria.tscn | 27 +-- Towers/Tower.gd | 6 +- Towers/TowerManager.gd | 6 +- UI/InfoPanel.gd | 2 +- Upgrades/TowerUpgrade.gd | 6 +- 29 files changed, 216 insertions(+), 229 deletions(-) rename Towers/Projectiles/{ => Draft}/ImpactPierre.tscn (100%) rename Towers/Projectiles/{ => Draft}/ProjectilePierre.tscn (100%) rename Towers/Projectiles/{ => Draft}/impact_pierre.gd (100%) rename Towers/Projectiles/{ => Draft}/impact_pierre.gd.uid (100%) rename Towers/Projectiles/{ => Draft}/projectile_pierre.gd (100%) rename Towers/Projectiles/{ => Draft}/projectile_pierre.gd.uid (100%) delete mode 100644 Towers/Projectiles/ProjectileResource.gd delete mode 100644 Towers/Projectiles/ProjectileResource.gd.uid create mode 100644 Towers/Projectiles/Scenes/projectile-Aline.tscn create mode 100644 Towers/Projectiles/Scenes/projectile-James.tscn create mode 100644 Towers/Projectiles/Scenes/projectile-Pierre.tscn create mode 100644 Towers/Projectiles/Scenes/projectile-Victoria.tscn diff --git a/Enemies/Scenes/boss-james.tscn b/Enemies/Scenes/boss-james.tscn index 705ccf1..3372013 100644 --- a/Enemies/Scenes/boss-james.tscn +++ b/Enemies/Scenes/boss-james.tscn @@ -1,24 +1,9 @@ -[gd_scene load_steps=10 format=3 uid="uid://dyl4wiga2goi"] +[gd_scene load_steps=7 format=3 uid="uid://dyl4wiga2goi"] [ext_resource type="PackedScene" uid="uid://dg8bjkjuddnhg" path="res://Enemies/enemy.tscn" id="1_ohyx6"] [ext_resource type="Script" uid="uid://dw53e0rr7qc02" path="res://Enemies/boss.gd" id="2_vnmiq"] [ext_resource type="Texture2D" uid="uid://d38rvmky1mr5f" path="res://Assets/Characters/72 Character Free/Char 5/Character 5.png" id="3_831fr"] -[ext_resource type="Script" uid="uid://ddgbr0n8kic3y" path="res://Towers/Projectiles/ProjectileResource.gd" id="3_vnmiq"] -[ext_resource type="Texture2D" uid="uid://b7jiyk3w5tl02" path="res://Assets/Icones/Spritesheet_Cakes_WITH_OUTLINE.png" id="4_831fr"] - -[sub_resource type="AtlasTexture" id="AtlasTexture_tviqb"] -atlas = ExtResource("4_831fr") -region = Rect2(161, 33, 28, 31) - -[sub_resource type="Resource" id="Resource_831fr"] -script = ExtResource("3_vnmiq") -speed = 2 -damage = 3 -maxTargets = 1 -type = 4 -allowedTargets = 2 -sprite = SubResource("AtlasTexture_tviqb") -metadata/_custom_type_script = "uid://ddgbr0n8kic3y" +[ext_resource type="PackedScene" uid="uid://c6i3437fhurkh" path="res://Towers/Projectiles/Scenes/projectile-James.tscn" id="3_vnmiq"] [sub_resource type="ViewportTexture" id="ViewportTexture_mw235"] viewport_path = NodePath("Enemy/HealthBar3D/SubViewport") @@ -31,7 +16,8 @@ radius = 2.0 [node name="Enemy" parent="." index="0"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.32, 0) script = ExtResource("2_vnmiq") -projectile = SubResource("Resource_831fr") +projectileScene = ExtResource("3_vnmiq") +disableTime = 3.0 speed = 0.7 base_attack_damage = 10 max_life = 300 diff --git a/Enemies/boss.gd b/Enemies/boss.gd index 63b8b76..159038a 100644 --- a/Enemies/boss.gd +++ b/Enemies/boss.gd @@ -2,7 +2,8 @@ extends Enemy class_name Boss -@export var projectile : ProjectileResource +@export_range(0.1, 15, 0.05, "or_greater") var disableTime : float +@export var projectileScene : PackedScene func attack() -> bool: @@ -12,8 +13,11 @@ func attack() -> bool: var towerTargets : Array[Node3D] = targets.filter(func(b): return b is Tower) if $AttackCooldown.is_stopped() && not towerTargets.is_empty(): + var projectile : Projectile = projectileScene.instantiate() + projectile.amount = disableTime projectile.shoot(towerTargets[0], global_position) targets.erase(towerTargets[0]) $AttackCooldown.start() + return true return false diff --git a/Enemies/enemy.tscn b/Enemies/enemy.tscn index 4e470b3..b325e35 100644 --- a/Enemies/enemy.tscn +++ b/Enemies/enemy.tscn @@ -5,6 +5,7 @@ [ext_resource type="Script" uid="uid://blnmjxmusrsa7" path="res://UI/GameStyleBoxFlat.gd" id="3_07tka"] [sub_resource type="SphereShape3D" id="SphereShape3D_7frlh"] +radius = 0.3 [sub_resource type="ViewportTexture" id="ViewportTexture_cmo2f"] viewport_path = NodePath("Enemy/HealthBar3D/SubViewport") diff --git a/Levels/Scripts/Resource/Troop.gd b/Levels/Scripts/Resource/Troop.gd index d8af363..8b1fa11 100644 --- a/Levels/Scripts/Resource/Troop.gd +++ b/Levels/Scripts/Resource/Troop.gd @@ -5,4 +5,4 @@ class_name Troop @export var number_to_spawn : int = 1 @export var lane_to_spawn : int = 0 @export var spawn_delay : float = 1 -@export var pack_delay : float = .15 +@export_range(.15, 5, .01, "or_greater") var pack_delay : float = .15 diff --git a/Levels/test_map.tscn b/Levels/test_map.tscn index 030c3ec..4c0a560 100644 --- a/Levels/test_map.tscn +++ b/Levels/test_map.tscn @@ -13,7 +13,7 @@ [sub_resource type="Curve3D" id="Curve3D_f1wxt"] _data = { -"points": PackedVector3Array(0, 0, 0, 0, 0, 0, 9.5, 0.25, -5.5, 0, 0, 0, 0, 0, 0, 0.5, 0.25, -5.5, 0, 0, 0, 0, 0, 0, 0.5, 0.25, 0.5, 0, 0, 0, 0, 0, 0, 9.5, 0.25, 0.5), +"points": PackedVector3Array(0, 0, 0, 0, 0, 0, 9.5, 0, -5.5, 0, 0, 0, 0, 0, 0, 0.5, 0, -5.5, 0, 0, 0, 0, 0, 0, 0.5, 0, 0.5, 0, 0, 0, 0, 0, 0, 9.5, 0, 0.5), "tilts": PackedFloat32Array(0, 0, 0, 0) } point_count = 4 @@ -279,6 +279,7 @@ transform = Transform3D(-1.31134e-07, 0, -3, 0, 3, 0, 3, 0, -1.31134e-07, 3.9764 transform = Transform3D(-2, 0, -1.74846e-07, 0, 2, 0, 1.74846e-07, 0, -2, 9.6873, 0, -5.90881) [node name="Paths" type="Node3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.2, 0) [node name="Path 1" type="Path3D" parent="Paths"] curve = SubResource("Curve3D_f1wxt") diff --git a/Towers/Projectiles/ImpactPierre.tscn b/Towers/Projectiles/Draft/ImpactPierre.tscn similarity index 100% rename from Towers/Projectiles/ImpactPierre.tscn rename to Towers/Projectiles/Draft/ImpactPierre.tscn diff --git a/Towers/Projectiles/ProjectilePierre.tscn b/Towers/Projectiles/Draft/ProjectilePierre.tscn similarity index 100% rename from Towers/Projectiles/ProjectilePierre.tscn rename to Towers/Projectiles/Draft/ProjectilePierre.tscn diff --git a/Towers/Projectiles/impact_pierre.gd b/Towers/Projectiles/Draft/impact_pierre.gd similarity index 100% rename from Towers/Projectiles/impact_pierre.gd rename to Towers/Projectiles/Draft/impact_pierre.gd diff --git a/Towers/Projectiles/impact_pierre.gd.uid b/Towers/Projectiles/Draft/impact_pierre.gd.uid similarity index 100% rename from Towers/Projectiles/impact_pierre.gd.uid rename to Towers/Projectiles/Draft/impact_pierre.gd.uid diff --git a/Towers/Projectiles/projectile_pierre.gd b/Towers/Projectiles/Draft/projectile_pierre.gd similarity index 100% rename from Towers/Projectiles/projectile_pierre.gd rename to Towers/Projectiles/Draft/projectile_pierre.gd diff --git a/Towers/Projectiles/projectile_pierre.gd.uid b/Towers/Projectiles/Draft/projectile_pierre.gd.uid similarity index 100% rename from Towers/Projectiles/projectile_pierre.gd.uid rename to Towers/Projectiles/Draft/projectile_pierre.gd.uid diff --git a/Towers/Projectiles/Projectile.gd b/Towers/Projectiles/Projectile.gd index edcba2d..0a51792 100644 --- a/Towers/Projectiles/Projectile.gd +++ b/Towers/Projectiles/Projectile.gd @@ -1,137 +1,136 @@ extends CharacterBody3D class_name Projectile -const TARGET_ENEMY : int = 1 ## Flag to target enemy -const TARGET_ALLY : int = 2 ## Flag to target ally - -enum TYPE { ## Types of projectiles - - ## One target - BASIC, - - ## Multiple targets[br]work with [member ProjectileResource.damageArea] - AOE, - - ## Piercing through enemies[br]work with [member ProjectileResource.maxTarets] and [member ProjectileResource.damageArea] - PIERCING, - - ## Bouncing over enemies[br]work with [member ProjectileResource.maxTarets] and [member ProjectileResource.damageArea] - BOUNCING, - - ## Disable ally tower for [param damage] duration [br]Usable on [Boss] projectiles - DISABLING, +enum MODE { + FOLLOW, ## Follow Entity + LOCATION, ## Go to entity location + HITSCAN, ## DANGER NOT implemented yet } -var type : TYPE = TYPE.BASIC -var speed : int = 20 -var allowedTargets : int = TARGET_ENEMY +enum TYPE { ## Types of projectiles + BASIC, ## One target + AOE, ## Multiple targets[br]work with [member damageArea] + PIERCING, ## Piercing through enemies[br]work with [member maxTarets] and [member damageArea] + BOUNCING, ## Bouncing over enemies[br]work with [member maxTarets] and [member damageArea] + DISABLING, ## Disable ally tower for [member damage] duration [br]Usable on [Boss] projectiles +} + + +@export var type : TYPE = TYPE.BASIC +@export var mode : MODE = MODE.FOLLOW +@export var speed : int +@export var maxTargets : int = 1 + + +var amount : float var target : PhysicsBody3D var vectorTarget : Vector3 -var maxTargets : int = 1 -var damage : int = 1 -var bodiesInRange : Array[Enemy] -var affectedTarget : Array[Enemy] +var bodiesInRange : Array[Node3D] +var affectedTarget : Array[Node3D] func _physics_process(_delta: float) -> void: + if mode == MODE.LOCATION && vectorTarget.distance_squared_to(global_position) < .4: + resolveContact() + maxTargets = 0 # Ensure queue free in next if + if shouldQueueFree(): queue_free() return var globalPos : Vector3 = vectorTarget if vectorTarget else target.global_position - if target is Tower: + if target: globalPos.y += Helper.getHitBoxLocation(target, Helper.POSITION.CENTER) - velocity = global_position.direction_to(globalPos) * speed look_at(globalPos) + velocity = global_position.direction_to(globalPos) * speed move_and_slide() func shouldQueueFree() -> bool: - match type: - TYPE.PIERCING: return vectorTarget.distance_squared_to(global_position) < .4 - _ when allowedTargets & TARGET_ALLY && target is Tower: return not target.visible - _ when !is_instance_valid(target): return true + if maxTargets < 1: + return true + + if !is_instance_valid(target): + return mode == MODE.FOLLOW + elif target is Tower: + return not target.visible return false func onBodyEnteredDamageArea(body: Node3D) -> void: if type != TYPE.BASIC && targetable(body): + addBodyInRange(body) if type == TYPE.PIERCING: - resolveContact(body) - elif not bodiesInRange.has(body): - bodiesInRange.append(body) + resolveContact() func onBodyCollideWithProjectile(body: Node3D) -> void: - if (body == target || type == TYPE.PIERCING && targetable(body)): - resolveContact(body) + if mode != MODE.LOCATION && (body == target || type == TYPE.PIERCING) && targetable(body): + addBodyInRange(body, true) + resolveContact() + + +func addBodyInRange(body: Node3D, pushFront: bool = false) -> void: + var idx : int = bodiesInRange.find(body) + + if pushFront: + if idx != -1: + bodiesInRange.remove_at(idx) + bodiesInRange.push_front(body) + elif idx == -1: + bodiesInRange.push_back(body) func targetable(body: Node3D) -> bool: - if body is Enemy: - return TARGET_ENEMY & allowedTargets && not affectedTarget.has(body) - if body is Tower || body is TheCube: - return TARGET_ALLY & allowedTargets - - return false + return not affectedTarget.has(body) -func resolveContact(body: Node3D) -> void: - if body is Enemy: - resolveEnemyDamages(body) - if body is Tower || body is TheCube: - resolveAllyEffects(body) +func resolveContact() -> void: + if bodiesInRange.is_empty(): + return + + resolveEffect(bodiesInRange[0]) + + match type: + TYPE.AOE: + for _body in bodiesInRange: + if is_instance_valid(_body): + resolveEffect(_body) + + TYPE.BOUNCING: + print(bodiesInRange) + target = null if bodiesInRange.is_empty() else bodiesInRange[0] -func resolveEnemyDamages(enemy: Enemy) -> void: - damageEnemy(enemy) +func resolveEffect(body : Node3D) -> void: + bodiesInRange.erase(body) + if affectedTarget.has(body) || body is GameTile: + return - if type == TYPE.AOE: - for body in bodiesInRange: - if is_instance_valid(body): - damageEnemy(body) + if type == TYPE.DISABLING && body.has_method("disable"): + body.disable(amount) + elif body.has_method("take_damage"): + body.take_damage(amount) - if maxTargets < 1 || type == TYPE.AOE: - return queue_free() - - if type == TYPE.BOUNCING: - bodiesInRange.erase(enemy) - if bodiesInRange.size(): - target = bodiesInRange.pop_front() - else: - queue_free() - - -func resolveAllyEffects(ally: Node3D) -> void: - if ally is Tower && type == TYPE.DISABLING: - ally.disable(damage) - queue_free() - - -func damageEnemy(enemy: Enemy) -> void: - if not affectedTarget.has(enemy): - maxTargets -= 1 - enemy.take_damage(damage) - affectedTarget.append(enemy) - - -func loadProjectile(resource: ProjectileResource, _target: PhysicsBody3D) -> void: - target = _target - type = resource.type - if type == TYPE.PIERCING: - vectorTarget = target.global_position - # NOTE removing colision layer for pierce effect - $HitBox.collision_layer = 0 - speed = resource.speed - maxTargets = resource.maxTargets - damage = resource.damage - allowedTargets = resource.allowedTargets - $Sprite3D.texture = resource.sprite - if [TYPE.AOE, TYPE.PIERCING, TYPE.BOUNCING].has(type) && resource.damageArea: - $DamageArea/ProjectileArea.shape = resource.damageArea + affectedTarget.append(body) + maxTargets -= 1 func removeTarget(body: Node3D) -> void: bodiesInRange.erase(body) + + +func shoot(_target: Node3D, globalPos: Vector3) -> void: + target = _target + + match mode: + Projectile.MODE.HITSCAN: + globalPos = target.global_position + globalPos.y += Helper.getHitBoxLocation(target, Helper.POSITION.CENTER) + Projectile.MODE.LOCATION: + vectorTarget = target.global_position + vectorTarget.y += Helper.getHitBoxLocation(target, Helper.POSITION.CENTER) + + EventBus.projectile_shooted.emit(self, globalPos) diff --git a/Towers/Projectiles/ProjectileResource.gd b/Towers/Projectiles/ProjectileResource.gd deleted file mode 100644 index aeb3177..0000000 --- a/Towers/Projectiles/ProjectileResource.gd +++ /dev/null @@ -1,19 +0,0 @@ -extends Resource -class_name ProjectileResource - -const projectileScene : PackedScene = preload("res://Towers/Projectiles/projectile.tscn") - -@export var speed : int = 20 -@export var damage : int = 1 -@export var maxTargets : int = 1 ## Usefull when [enum Projectile.TYPE] is [param PIERCING] or [param BOUNCING] -@export var type : Projectile.TYPE = Projectile.TYPE.BASIC -@export_flags("Enemies", "AlliƩs") var allowedTargets : int = 1 -## Usefull when [enum Projectile.TYPE] is [param AOE], [param PIERCING] or [param BOUNCING] -## When [enum Projectile.TYPE] is [param BOUNCING] the shape is for target new entity in range -@export var damageArea : Shape3D -@export var sprite : Texture2D = load("res://Assets/Emotes/emote_star.png") - -func shoot(target: Node3D, gobalPos: Vector3) -> void: - var projectile : Projectile = projectileScene.instantiate() - projectile.loadProjectile(self, target) - EventBus.projectile_shooted.emit(projectile, gobalPos) diff --git a/Towers/Projectiles/ProjectileResource.gd.uid b/Towers/Projectiles/ProjectileResource.gd.uid deleted file mode 100644 index eac2883..0000000 --- a/Towers/Projectiles/ProjectileResource.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://ddgbr0n8kic3y diff --git a/Towers/Projectiles/Scenes/projectile-Aline.tscn b/Towers/Projectiles/Scenes/projectile-Aline.tscn new file mode 100644 index 0000000..55f013c --- /dev/null +++ b/Towers/Projectiles/Scenes/projectile-Aline.tscn @@ -0,0 +1,21 @@ +[gd_scene load_steps=3 format=3 uid="uid://dcnm6rjht0rew"] + +[ext_resource type="PackedScene" uid="uid://oykrff3g74eo" path="res://Towers/Projectiles/projectile.tscn" id="1_4tmpc"] + +[sub_resource type="SphereShape3D" id="SphereShape3D_k24mn"] +radius = 0.3 + +[node name="Projectile" instance=ExtResource("1_4tmpc")] +type = 1 +mode = 1 +speed = 3 +damage = 6 + +[node name="HitBox" parent="." index="2"] +collision_mask = 2 + +[node name="DamageArea" parent="." index="3"] +collision_mask = 2 + +[node name="Node" type="CollisionShape3D" parent="DamageArea" index="0"] +shape = SubResource("SphereShape3D_k24mn") diff --git a/Towers/Projectiles/Scenes/projectile-James.tscn b/Towers/Projectiles/Scenes/projectile-James.tscn new file mode 100644 index 0000000..cae25ab --- /dev/null +++ b/Towers/Projectiles/Scenes/projectile-James.tscn @@ -0,0 +1,19 @@ +[gd_scene load_steps=3 format=3 uid="uid://c6i3437fhurkh"] + +[ext_resource type="PackedScene" uid="uid://oykrff3g74eo" path="res://Towers/Projectiles/projectile.tscn" id="1_do0ca"] +[ext_resource type="Texture2D" uid="uid://b7jiyk3w5tl02" path="res://Assets/Icones/Spritesheet_Cakes_WITH_OUTLINE.png" id="2_ckawd"] + +[node name="Projectile" instance=ExtResource("1_do0ca")] +type = 4 +speed = 2 +damage = 3 + +[node name="Sprite3D" parent="." index="1"] +transform = Transform3D(1.3, 0, 0, 0, 1.3, 0, 0, 0, 1.3, 0, 0, 0) +texture = ExtResource("2_ckawd") +hframes = 6 +vframes = 2 +frame = 11 + +[node name="HitBox" parent="." index="2"] +collision_mask = 4 diff --git a/Towers/Projectiles/Scenes/projectile-Pierre.tscn b/Towers/Projectiles/Scenes/projectile-Pierre.tscn new file mode 100644 index 0000000..dffdf83 --- /dev/null +++ b/Towers/Projectiles/Scenes/projectile-Pierre.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=2 format=3 uid="uid://dy755v20lqu7q"] + +[ext_resource type="PackedScene" uid="uid://oykrff3g74eo" path="res://Towers/Projectiles/projectile.tscn" id="1_d01p1"] + +[node name="Projectile" instance=ExtResource("1_d01p1")] +speed = 15 +damage = 2 + +[node name="HitBox" parent="." index="2"] +collision_mask = 2 diff --git a/Towers/Projectiles/Scenes/projectile-Victoria.tscn b/Towers/Projectiles/Scenes/projectile-Victoria.tscn new file mode 100644 index 0000000..6720a02 --- /dev/null +++ b/Towers/Projectiles/Scenes/projectile-Victoria.tscn @@ -0,0 +1,20 @@ +[gd_scene load_steps=3 format=3 uid="uid://df8u7dogl4wi0"] + +[ext_resource type="PackedScene" uid="uid://oykrff3g74eo" path="res://Towers/Projectiles/projectile.tscn" id="1_suva6"] + +[sub_resource type="SphereShape3D" id="SphereShape3D_k24mn"] +radius = 1.5 + +[node name="Projectile" instance=ExtResource("1_suva6")] +type = 3 +speed = 5 +maxTargets = 3 + +[node name="HitBox" parent="." index="2"] +collision_mask = 2 + +[node name="DamageArea" parent="." index="3"] +collision_mask = 2 + +[node name="Node" type="CollisionShape3D" parent="DamageArea" index="0"] +shape = SubResource("SphereShape3D_k24mn") diff --git a/Towers/Projectiles/projectile.tscn b/Towers/Projectiles/projectile.tscn index cc83a93..3c9310b 100644 --- a/Towers/Projectiles/projectile.tscn +++ b/Towers/Projectiles/projectile.tscn @@ -10,6 +10,8 @@ radius = 0.1 radius = 0.1 [node name="Projectile" type="CharacterBody3D"] +collision_layer = 0 +collision_mask = 0 script = ExtResource("1_ggq0q") [node name="CollisionShape3D" type="CollisionShape3D" parent="."] @@ -22,7 +24,7 @@ texture = ExtResource("2_08w86") [node name="HitBox" type="Area3D" parent="."] collision_layer = 0 -collision_mask = 6 +collision_mask = 0 [node name="ProjectileSize" type="CollisionShape3D" parent="HitBox"] shape = SubResource("SphereShape3D_dsts2") @@ -30,10 +32,7 @@ debug_color = Color(0.926858, 0.237749, 0.335021, 0.42) [node name="DamageArea" type="Area3D" parent="."] collision_layer = 0 -collision_mask = 6 - -[node name="ProjectileArea" type="CollisionShape3D" parent="DamageArea"] -debug_color = Color(0.926858, 0.237749, 0.335021, 0.42) +collision_mask = 0 [connection signal="body_entered" from="HitBox" to="." method="onBodyCollideWithProjectile" flags=3] [connection signal="body_entered" from="DamageArea" to="." method="onBodyEnteredDamageArea"] diff --git a/Towers/Scenes/aline.tscn b/Towers/Scenes/aline.tscn index 5bf0912..bcfb979 100644 --- a/Towers/Scenes/aline.tscn +++ b/Towers/Scenes/aline.tscn @@ -1,24 +1,9 @@ -[gd_scene load_steps=10 format=3 uid="uid://ck1qryleu80s"] +[gd_scene load_steps=7 format=3 uid="uid://ck1qryleu80s"] [ext_resource type="PackedScene" uid="uid://trg7ag3dqr2l" path="res://Towers/tower.tscn" id="1_gvvig"] [ext_resource type="Texture2D" uid="uid://cob1lydkirn20" path="res://Assets/Icones/raccoon-head.svg" id="3_6h033"] -[ext_resource type="Script" uid="uid://ddgbr0n8kic3y" path="res://Towers/Projectiles/ProjectileResource.gd" id="4_ck6a3"] +[ext_resource type="PackedScene" uid="uid://dcnm6rjht0rew" path="res://Towers/Projectiles/Scenes/projectile-Aline.tscn" id="5_6bcjo"] [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.2 - -[sub_resource type="Resource" id="Resource_lhd8w"] -script = ExtResource("4_ck6a3") -speed = 3 -damage = 6 -maxTargets = 1 -type = 1 -allowedTargets = 1 -damageArea = SubResource("SphereShape3D_lhd8w") -sprite = ExtResource("5_lhd8w") -metadata/_custom_type_script = "uid://ddgbr0n8kic3y" [sub_resource type="SphereShape3D" id="SphereShape3D_6bcjo"] radius = 3.0 @@ -32,7 +17,8 @@ type = 2 icone = ExtResource("3_6h033") bio = "" price = 150 -projectile = SubResource("Resource_lhd8w") +damage = 6 +projectileScene = ExtResource("5_6bcjo") towerRange = SubResource("SphereShape3D_6bcjo") action_cooldown = 2.5 max_energy = 100.0 diff --git a/Towers/Scenes/evan.tscn b/Towers/Scenes/evan.tscn index 9930454..23c8b88 100644 --- a/Towers/Scenes/evan.tscn +++ b/Towers/Scenes/evan.tscn @@ -1,27 +1,20 @@ -[gd_scene load_steps=7 format=3 uid="uid://c4ta0aynybpis"] +[gd_scene load_steps=5 format=3 uid="uid://c4ta0aynybpis"] [ext_resource type="PackedScene" uid="uid://trg7ag3dqr2l" path="res://Towers/tower.tscn" id="1_yctfx"] [ext_resource type="Texture2D" uid="uid://dwwgho6f8f4kj" path="res://Assets/Icones/penguin.svg" id="2_5uh04"] -[ext_resource type="Script" uid="uid://ddgbr0n8kic3y" path="res://Towers/Projectiles/ProjectileResource.gd" id="3_gr7yf"] -[ext_resource type="Script" uid="uid://bg0x4egeu17qb" path="res://Upgrades/TowerUpgrade.gd" id="4_v32j5"] - -[sub_resource type="Resource" id="Resource_mf185"] -script = ExtResource("3_gr7yf") -speed = 20 -damage = 1 -maxTargets = 1 -type = 1 -allowedTargets = 1 -metadata/_custom_type_script = "uid://ddgbr0n8kic3y" [sub_resource type="SphereShape3D" id="SphereShape3D_y05yr"] radius = 4.0 +[sub_resource type="ViewportTexture" id="ViewportTexture_fegyx"] +viewport_path = NodePath("EnergyBar3D/SubViewport") + [node name="Evan" instance=ExtResource("1_yctfx")] tower_name = "Evan" type = 5 icone = ExtResource("2_5uh04") bio = "" -projectile = SubResource("Resource_mf185") towerRange = SubResource("SphereShape3D_y05yr") -tower_shop = Array[ExtResource("4_v32j5")]([]) + +[node name="EnergyBar3D" parent="." index="6"] +texture = SubResource("ViewportTexture_fegyx") diff --git a/Towers/Scenes/geraldine.tscn b/Towers/Scenes/geraldine.tscn index 04213ad..aaf9713 100644 --- a/Towers/Scenes/geraldine.tscn +++ b/Towers/Scenes/geraldine.tscn @@ -2,7 +2,6 @@ [ext_resource type="PackedScene" uid="uid://trg7ag3dqr2l" path="res://Towers/tower.tscn" id="1_bw8ui"] [ext_resource type="Texture2D" uid="uid://d4pdmbhhlphc" path="res://Assets/Icones/seated-mouse.svg" id="2_1pop4"] -[ext_resource type="Script" uid="uid://bg0x4egeu17qb" path="res://Upgrades/TowerUpgrade.gd" id="4_nxn76"] [ext_resource type="Texture2D" uid="uid://315k07rsgf6t" path="res://Assets/Characters/Female1.png" id="5_kbhva"] [node name="Geraldine" instance=ExtResource("1_bw8ui")] @@ -10,7 +9,6 @@ tower_name = "Geraldine" type = 7 icone = ExtResource("2_1pop4") bio = "" -tower_shop = Array[ExtResource("4_nxn76")]([]) [node name="Sprite3D" parent="." index="5"] texture = ExtResource("5_kbhva") diff --git a/Towers/Scenes/maxence.tscn b/Towers/Scenes/maxence.tscn index c85bac0..2edd650 100644 --- a/Towers/Scenes/maxence.tscn +++ b/Towers/Scenes/maxence.tscn @@ -1,22 +1,8 @@ -[gd_scene load_steps=8 format=3 uid="uid://b1pg1hgysx3am"] +[gd_scene load_steps=5 format=3 uid="uid://b1pg1hgysx3am"] [ext_resource type="PackedScene" uid="uid://trg7ag3dqr2l" path="res://Towers/tower.tscn" id="1_laam8"] -[ext_resource type="Script" uid="uid://ddgbr0n8kic3y" path="res://Towers/Projectiles/ProjectileResource.gd" id="2_7fox5"] [ext_resource type="Texture2D" uid="uid://boxdrq4nrq7hv" path="res://Assets/Icones/flamingo.svg" id="2_sciv6"] -[sub_resource type="SphereShape3D" id="SphereShape3D_sciv6"] -radius = 0.2 - -[sub_resource type="Resource" id="Resource_sciv6"] -script = ExtResource("2_7fox5") -speed = 40 -damage = 10 -maxTargets = 5 -type = 2 -allowedTargets = 1 -damageArea = SubResource("SphereShape3D_sciv6") -metadata/_custom_type_script = "uid://ddgbr0n8kic3y" - [sub_resource type="SphereShape3D" id="SphereShape3D_pw4mj"] radius = 10.0 @@ -29,10 +15,11 @@ type = 3 icone = ExtResource("2_sciv6") bio = "" price = 200 -projectile = SubResource("Resource_sciv6") +damage = 10 towerRange = SubResource("SphereShape3D_pw4mj") action_cooldown = 3.0 max_energy = 50.0 +energy_regen = 10.0 energy_cost = 25.0 [node name="Sprite3D" parent="." index="5"] diff --git a/Towers/Scenes/pierre.tscn b/Towers/Scenes/pierre.tscn index 4101da5..c917ac7 100644 --- a/Towers/Scenes/pierre.tscn +++ b/Towers/Scenes/pierre.tscn @@ -1,22 +1,11 @@ -[gd_scene load_steps=14 format=3 uid="uid://bj6srer7ghf7p"] +[gd_scene load_steps=12 format=3 uid="uid://bj6srer7ghf7p"] [ext_resource type="PackedScene" uid="uid://trg7ag3dqr2l" path="res://Towers/tower.tscn" id="1_s6dfo"] [ext_resource type="Texture2D" uid="uid://bb4wihq1n1wm7" path="res://Assets/Icones/labrador-head.svg" id="2_lcjqw"] -[ext_resource type="Script" uid="uid://ddgbr0n8kic3y" path="res://Towers/Projectiles/ProjectileResource.gd" id="3_5tgsk"] -[ext_resource type="Texture2D" uid="uid://dqyhhvxpwtpsy" path="res://Assets/Emotes/emote_star.png" id="4_r52mr"] +[ext_resource type="PackedScene" uid="uid://dy755v20lqu7q" path="res://Towers/Projectiles/Scenes/projectile-Pierre.tscn" id="5_wnw3f"] [ext_resource type="Script" uid="uid://bg0x4egeu17qb" path="res://Upgrades/TowerUpgrade.gd" id="5_wvh05"] [ext_resource type="Texture2D" uid="uid://dqvou7t7o1t5d" path="res://Assets/Icones/medal2.png" id="6_wnw3f"] -[sub_resource type="Resource" id="Resource_r52mr"] -script = ExtResource("3_5tgsk") -speed = 15 -damage = 2 -maxTargets = 1 -type = 0 -allowedTargets = 1 -sprite = ExtResource("4_r52mr") -metadata/_custom_type_script = "uid://ddgbr0n8kic3y" - [sub_resource type="SphereShape3D" id="SphereShape3D_c55ds"] radius = 2.0 @@ -86,7 +75,8 @@ tower_name = "Pierre" type = 1 icone = ExtResource("2_lcjqw") price = 100 -projectile = SubResource("Resource_r52mr") +damage = 2 +projectileScene = ExtResource("5_wnw3f") towerRange = SubResource("SphereShape3D_c55ds") action_cooldown = 1.0 max_energy = 25.0 diff --git a/Towers/Scenes/victoria.tscn b/Towers/Scenes/victoria.tscn index c87a606..4ef9582 100644 --- a/Towers/Scenes/victoria.tscn +++ b/Towers/Scenes/victoria.tscn @@ -1,23 +1,10 @@ -[gd_scene load_steps=9 format=3 uid="uid://db6aq2wdrcjtp"] +[gd_scene load_steps=7 format=3 uid="uid://db6aq2wdrcjtp"] [ext_resource type="PackedScene" uid="uid://trg7ag3dqr2l" path="res://Towers/tower.tscn" id="1_ki73m"] [ext_resource type="Texture2D" uid="uid://m6jwakrus50v" path="res://Assets/Icones/sea-star.svg" id="2_n34tq"] -[ext_resource type="Script" uid="uid://ddgbr0n8kic3y" path="res://Towers/Projectiles/ProjectileResource.gd" id="3_sf52i"] +[ext_resource type="PackedScene" uid="uid://df8u7dogl4wi0" path="res://Towers/Projectiles/Scenes/projectile-Victoria.tscn" id="4_sf52i"] [ext_resource type="Texture2D" uid="uid://315k07rsgf6t" path="res://Assets/Characters/Female1.png" id="5_2rqsg"] -[sub_resource type="SphereShape3D" id="SphereShape3D_rbuca"] -radius = 3.0 - -[sub_resource type="Resource" id="Resource_c1yif"] -script = ExtResource("3_sf52i") -speed = 5 -damage = 5 -maxTargets = 3 -type = 3 -allowedTargets = 1 -damageArea = SubResource("SphereShape3D_rbuca") -metadata/_custom_type_script = "uid://ddgbr0n8kic3y" - [sub_resource type="SphereShape3D" id="SphereShape3D_sf52i"] radius = 4.0 @@ -29,10 +16,14 @@ tower_name = "Victoria" type = 4 icone = ExtResource("2_n34tq") bio = "" -projectile = SubResource("Resource_c1yif") +price = 666 +damage = 5 +projectileScene = ExtResource("4_sf52i") towerRange = SubResource("SphereShape3D_sf52i") -energy_regen = 25.0 -energy_cost = 20.0 +action_cooldown = 1.5 +max_energy = 50.0 +energy_regen = 50.0 +energy_cost = 50.0 [node name="Sprite3D" parent="." index="5"] texture = ExtResource("5_2rqsg") diff --git a/Towers/Tower.gd b/Towers/Tower.gd index 87e5db7..555f499 100644 --- a/Towers/Tower.gd +++ b/Towers/Tower.gd @@ -22,7 +22,8 @@ enum TYPE { NONE, PIERRE, ALINE, MAXENCE, VICTORIA, EVAN, ALEX, GERALDINE } @export var price : int @export_group("Attack") -@export var projectile : ProjectileResource +@export var damage : int +@export var projectileScene : PackedScene @export var towerRange : Shape3D @export var action_cooldown : float = 0.3 : set(value): @@ -106,6 +107,8 @@ func shoot() -> void: return energy -= energy_cost + var projectile : Projectile = projectileScene.instantiate() + projectile.amount = damage projectile.shoot(target, $Aim.global_position) $AttackCooldown.start(action_cooldown) @@ -134,6 +137,7 @@ func build() -> bool: sprite.modulate = "ffffffff" $EnergyBar3D.visible = true $PriceTag.visible = false + energyBar.max_value = max_energy state = STATE.ACTION in_action() changed.emit() diff --git a/Towers/TowerManager.gd b/Towers/TowerManager.gd index 90519b0..9675fae 100644 --- a/Towers/TowerManager.gd +++ b/Towers/TowerManager.gd @@ -52,13 +52,11 @@ func _process(_delta: float) -> void: if Input.is_action_just_pressed("rest"): if tower: moveTower(tower, Vector3.INF) + if tower != selected_tower: + EventBus.tower_selected.emit(tower.type) else: EventBus.tower_selected.emit(Tower.TYPE.NONE) - if Input.is_action_just_pressed("test"): - if tower: - tower.disable(2) - func _input(event: InputEvent) -> void: if event is InputEventKey: diff --git a/UI/InfoPanel.gd b/UI/InfoPanel.gd index 9cec65d..4305cfb 100644 --- a/UI/InfoPanel.gd +++ b/UI/InfoPanel.gd @@ -43,7 +43,7 @@ func onTowerChange() -> void: onEnergyChange() %TowerIcon.texture = tower.icone %TowerName.text = tower.tower_name - %TowerDamage.text = "Dmg : %d" % tower.projectile.damage + %TowerDamage.text = "Dmg : %d" % tower.damage %TowerCooldown.text = "cooldown : %.1f" % tower.action_cooldown # TODO Check for better UI to display it #%TowerBio.text = tower.bio diff --git a/Upgrades/TowerUpgrade.gd b/Upgrades/TowerUpgrade.gd index 71217b6..03606f5 100644 --- a/Upgrades/TowerUpgrade.gd +++ b/Upgrades/TowerUpgrade.gd @@ -7,7 +7,7 @@ enum TYPE { ENERGY_REGEN, ENERGY_COST, DAMAGE, - AOE_INCREASE, + AOE_INCREASE, ## NOT WORKING COOLDOWN, } @@ -23,8 +23,8 @@ func upgrade(tower: Tower = null) -> bool: TYPE.MAX_ENERGY: upgradeProperty(tower, "max_energy") TYPE.ENERGY_REGEN: upgradeProperty(tower, "energy_regen") TYPE.ENERGY_COST: upgradeProperty(tower, "energy_cost") - TYPE.DAMAGE: upgradeProperty(tower.projectile, "damage") - TYPE.AOE_INCREASE: upgradeProperty(tower.projectile.damageArea, "radius") + TYPE.DAMAGE: upgradeProperty(tower, "damage") + #TYPE.AOE_INCREASE: upgradeProperty(tower.projectile.damageArea, "radius") TYPE.COOLDOWN: upgradeProperty(tower, "action_cooldown") upgradeUpgrade()