refactor: change projectile logic

This commit is contained in:
Varylios 2025-09-14 22:54:54 +02:00
parent d7bcd07d13
commit 455835d331
29 changed files with 216 additions and 229 deletions

View file

@ -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

View file

@ -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

View file

@ -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")

View file

@ -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

View file

@ -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")

View file

@ -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)

View file

@ -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)

View file

@ -1 +0,0 @@
uid://ddgbr0n8kic3y

View file

@ -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")

View file

@ -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

View file

@ -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

View file

@ -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")

View file

@ -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"]

View file

@ -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

View file

@ -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")

View file

@ -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")

View file

@ -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"]

View file

@ -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

View file

@ -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")

View file

@ -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()

View file

@ -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:

View file

@ -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

View file

@ -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()