summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbd <bdunahu@operationnull.com>2025-05-21 16:24:59 -0400
committerbd <bdunahu@operationnull.com>2025-05-21 16:24:59 -0400
commitbae54d556e064414eb1823764b5368a300f1d1e1 (patch)
treee422bcd840eba617a0e9cd18b9cd94912888a270
parentec10e5fe6222773fd59d7854ed172f5319dc9a4e (diff)
Refactor tower firing and enemy detection
-rw-r--r--scenes/crawlers/soldier.gd2
-rw-r--r--scenes/defenders/base_defender.gd59
-rw-r--r--scenes/defenders/warlock.gd8
-rw-r--r--scenes/defenders/warlock.tscn1
-rw-r--r--scenes/defenders/warlock_projectile.gd25
-rw-r--r--scenes/defenders/warlock_projectile.tscn2
-rw-r--r--scenes/defenders/wyvern.tscn7
7 files changed, 58 insertions, 46 deletions
diff --git a/scenes/crawlers/soldier.gd b/scenes/crawlers/soldier.gd
index 8cce02c..2db3f60 100644
--- a/scenes/crawlers/soldier.gd
+++ b/scenes/crawlers/soldier.gd
@@ -1,7 +1,7 @@
extends CharacterBody2D
@export var speed = 50.0
-@export var health = 30
+@export var health = 40
func _process(delta):
get_parent().set_progress(get_parent().get_progress() + speed * delta)
diff --git a/scenes/defenders/base_defender.gd b/scenes/defenders/base_defender.gd
index 14d6249..66be11d 100644
--- a/scenes/defenders/base_defender.gd
+++ b/scenes/defenders/base_defender.gd
@@ -2,35 +2,48 @@ extends StaticBody2D
@onready var sprite_node = $Sprite2D
-var defender_range: float
-var damage: int
-var curr : PathFollow2D
+var defender_range : float
+var fire_rate : float
+var damage : int
+var target : CharacterBody2D
-func _on_tower_body_entered(_body: Node2D):
- select_target(get_node("Tower").get_overlapping_bodies())
- handle_animation()
+func _on_fire_timer_timeout() -> void:
+ # extending classes override here
+ pass
-func _on_tower_body_exited(_body: Node2D):
- select_target(get_node("Tower").get_overlapping_bodies())
- handle_animation()
-
-func handle_animation():
- if (curr == null):
- sprite_node.idle_state()
- else:
- sprite_node.attack_state()
-
-func select_target(targets):
- var tmp = []
- for i in targets:
- if "Crawler" in i.name:
- tmp.append(i)
+func select_target() -> void:
+ var targets : Array = _find_targets()
# this is all to select the furthest target on the track
- curr = null
- for i in tmp:
+ var curr : PathFollow2D = null
+ for i in targets:
if curr == null:
curr = i.get_node("../")
else:
if i.get_parent().get_progress() > curr.get_progress():
curr = i.get_node("../")
+
+ _update_state_machine(curr)
+
+func _find_targets() -> Array:
+ var targets : Array = get_node("Tower").get_overlapping_bodies()
+ var tmp : Array = []
+ for i in targets:
+ if "Crawler" in i.name:
+ tmp.append(i)
+ return tmp
+
+func _update_state_machine(curr : PathFollow2D) -> void:
+ if (curr == null):
+ target = null
+ sprite_node.idle_state()
+ else:
+ target = curr.get_child(0)
+ sprite_node.attack_state()
+
+func _on_tower_body_entered(_body: Node2D) -> void:
+ var old_target : CharacterBody2D = target
+ select_target()
+ if old_target == null && old_target != target:
+ $FireTimer.start(fire_rate)
+ _on_fire_timer_timeout()
diff --git a/scenes/defenders/warlock.gd b/scenes/defenders/warlock.gd
index 724a081..afac86c 100644
--- a/scenes/defenders/warlock.gd
+++ b/scenes/defenders/warlock.gd
@@ -4,11 +4,15 @@ var projectile: PackedScene = preload("res://scenes/defenders/warlock_projectile
func _ready():
damage = 5
+ fire_rate = 1.0
func _on_fire_timer_timeout():
- if (curr != null):
+ select_target()
+ if (target != null):
var tmp_projectile = projectile.instantiate()
- tmp_projectile.curr = curr
+ tmp_projectile.target = target
tmp_projectile.projectile_damage = damage
get_node("ProjectileContainer").call_deferred("add_child", tmp_projectile)
tmp_projectile.global_position = $Aim.global_position
+ else:
+ $FireTimer.stop()
diff --git a/scenes/defenders/warlock.tscn b/scenes/defenders/warlock.tscn
index 6c97d4a..b92f543 100644
--- a/scenes/defenders/warlock.tscn
+++ b/scenes/defenders/warlock.tscn
@@ -34,5 +34,4 @@ region_rect = Rect2(496, 16, 16, 16)
script = ExtResource("2_rpypk")
[connection signal="body_entered" from="Tower" to="." method="_on_tower_body_entered"]
-[connection signal="body_exited" from="Tower" to="." method="_on_tower_body_exited"]
[connection signal="timeout" from="FireTimer" to="." method="_on_fire_timer_timeout"]
diff --git a/scenes/defenders/warlock_projectile.gd b/scenes/defenders/warlock_projectile.gd
index 2188c38..9645a2c 100644
--- a/scenes/defenders/warlock_projectile.gd
+++ b/scenes/defenders/warlock_projectile.gd
@@ -1,26 +1,23 @@
extends CharacterBody2D
-var target
-var speed = 100
-var curr = ""
-var projectile_damage
+var target : CharacterBody2D
+var speed : int = 100
+var projectile_damage : int
func _physics_process(_delta: float):
- var path_spawner_node = get_tree().get_root().get_node("Main/PathSpawner")
- for i in path_spawner_node.get_child_count():
- if path_spawner_node.get_child(i).name == curr.get_parent().name:
- target = path_spawner_node.get_child(i).get_child(0).get_child(0)
-
- # another tower destroyed this target
if !is_instance_valid(target):
queue_free()
else:
- target = target.global_position
- velocity = global_position.direction_to(target) * speed
- look_at(target)
- move_and_slide()
+ _move_projectile()
func _on_area_2d_body_entered(body: Node2D):
if "Crawler" in body.name:
body.health -= projectile_damage
queue_free()
+
+func _move_projectile():
+ var pos : Vector2
+ pos = target.global_position
+ velocity = global_position.direction_to(pos) * speed
+ look_at(pos)
+ move_and_slide()
diff --git a/scenes/defenders/warlock_projectile.tscn b/scenes/defenders/warlock_projectile.tscn
index ab71e50..34204bc 100644
--- a/scenes/defenders/warlock_projectile.tscn
+++ b/scenes/defenders/warlock_projectile.tscn
@@ -6,7 +6,7 @@
[sub_resource type="CircleShape2D" id="CircleShape2D_0ilu8"]
radius = 8.0
-[node name="WarlockBullet" type="CharacterBody2D"]
+[node name="WarlockProjectile" type="CharacterBody2D"]
script = ExtResource("1_jonmr")
[node name="Sprite2D" type="Sprite2D" parent="."]
diff --git a/scenes/defenders/wyvern.tscn b/scenes/defenders/wyvern.tscn
index 19a5302..cdd5c97 100644
--- a/scenes/defenders/wyvern.tscn
+++ b/scenes/defenders/wyvern.tscn
@@ -1,6 +1,6 @@
[gd_scene load_steps=5 format=3 uid="uid://d37i2dwyynqdw"]
-[ext_resource type="Script" uid="uid://dvhqpgw6vhayu" path="res://scenes/defenders/warlock.gd" id="1_6c73s"]
+[ext_resource type="Script" uid="uid://cfhnd8k1sy116" path="res://scenes/defenders/wyvern.gd" id="1_6c73s"]
[ext_resource type="Script" uid="uid://dl7a53e1auku7" path="res://scenes/defenders/wyvern_animation_handler.gd" id="2_6c73s"]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_wu3n4"]
@@ -17,16 +17,15 @@ shape = SubResource("RectangleShape2D_wu3n4")
disabled = true
[node name="Aim" type="Marker2D" parent="."]
-position = Vector2(6, -2)
+position = Vector2(7, -0.5)
[node name="Tower" type="Area2D" parent="."]
[node name="CollisionShape2D" type="CollisionShape2D" parent="Tower"]
shape = SubResource("CircleShape2D_rpypk")
-[node name="ProjectileContainer" type="Node" parent="."]
-
[node name="FireTimer" type="Timer" parent="."]
+wait_time = 2.0
[node name="Sprite2D" type="Sprite2D" parent="."]
region_rect = Rect2(496, 16, 16, 16)