From bae54d556e064414eb1823764b5368a300f1d1e1 Mon Sep 17 00:00:00 2001 From: bd Date: Wed, 21 May 2025 16:24:59 -0400 Subject: Refactor tower firing and enemy detection --- scenes/crawlers/soldier.gd | 2 +- scenes/defenders/base_defender.gd | 59 +++++++++++++++++++------------- scenes/defenders/warlock.gd | 8 +++-- scenes/defenders/warlock.tscn | 1 - scenes/defenders/warlock_projectile.gd | 25 ++++++-------- scenes/defenders/warlock_projectile.tscn | 2 +- scenes/defenders/wyvern.tscn | 7 ++-- 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) -- cgit v1.2.3