summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbd <bdunahu@operationnull.com>2025-05-29 17:07:41 -0400
committerbd <bdunahu@operationnull.com>2025-05-29 17:07:41 -0400
commit8ec9e91860722288f844e01938b7b6489aff122a (patch)
treec04663d0e7fa8df245172520acb3a6ddbb1b34c9
parent4a24041fdadcef8548da302922095ca2d359941a (diff)
Add visible tower range on hover
-rw-r--r--resources/game_stats_config.tres2
-rw-r--r--scenes/game.tscn1
-rw-r--r--scenes/warlock.tscn2
-rw-r--r--scenes/wyvern.tscn2
-rw-r--r--scripts/base_defender.gd27
-rw-r--r--scripts/game_data.gd5
-rw-r--r--scripts/player.gd24
-rw-r--r--scripts/tower_manager.gd6
8 files changed, 56 insertions, 13 deletions
diff --git a/resources/game_stats_config.tres b/resources/game_stats_config.tres
index 8495fab..f2ade17 100644
--- a/resources/game_stats_config.tres
+++ b/resources/game_stats_config.tres
@@ -4,7 +4,7 @@
[resource]
script = ExtResource("1_t0c0a")
-starting_life = 20
+starting_life = 40
starting_morale = 10
wave_data = [{
15: {
diff --git a/scenes/game.tscn b/scenes/game.tscn
index 56152fc..2960967 100644
--- a/scenes/game.tscn
+++ b/scenes/game.tscn
@@ -58,6 +58,7 @@ script = ExtResource("4_gee14")
script = SubResource("GDScript_rarhs")
[node name="PanelContainer" parent="." instance=ExtResource("5_0tnpc")]
+z_index = 1
offset_top = 224.0
offset_right = 320.0
offset_bottom = 241.0
diff --git a/scenes/warlock.tscn b/scenes/warlock.tscn
index 2f88a74..66f1425 100644
--- a/scenes/warlock.tscn
+++ b/scenes/warlock.tscn
@@ -22,6 +22,8 @@ position = Vector2(6, -5)
[node name="CollisionShape2D" type="CollisionShape2D" parent="Tower"]
shape = SubResource("CircleShape2D_pbm03")
+[node name="Line2D" type="Line2D" parent="Tower"]
+
[node name="ProjectileContainer" type="Node" parent="."]
[node name="FireTimer" type="Timer" parent="."]
diff --git a/scenes/wyvern.tscn b/scenes/wyvern.tscn
index dca36fd..30c5f97 100644
--- a/scenes/wyvern.tscn
+++ b/scenes/wyvern.tscn
@@ -23,6 +23,8 @@ position = Vector2(6, 4)
[node name="CollisionShape2D" type="CollisionShape2D" parent="Tower"]
shape = SubResource("CircleShape2D_rpypk")
+[node name="Line2D" type="Line2D" parent="Tower"]
+
[node name="FireTimer" type="Timer" parent="."]
wait_time = 2.0
diff --git a/scripts/base_defender.gd b/scripts/base_defender.gd
index 782fd2a..7f13a0f 100644
--- a/scripts/base_defender.gd
+++ b/scripts/base_defender.gd
@@ -4,6 +4,9 @@ extends StaticBody2D
@onready var util = preload("res://scripts/util.gd")
@onready var game_stats_config = preload("res://resources/game_stats_config.tres")
+@onready var _collision_shape = $Tower/CollisionShape2D
+@onready var _visual_shape = $Tower/Line2D
+
var tower_data : Dictionary
var tower_key : String
@@ -13,15 +16,18 @@ var _idle_texture : Texture
var _attack_texture : Texture
func set_tower_stats(tower_index : int):
- var collision_shape = $Tower/CollisionShape2D
- collision_shape.shape = CircleShape2D.new()
+ _collision_shape.shape = CircleShape2D.new()
tower_data = game_stats_config.defenders[tower_index].duplicate(true)
tower_key = tower_data["desc"]
+ _visual_shape.width = 1.0
+ _visual_shape.closed = true
+ _visual_shape.set_default_color(Color("#0f6b8a"))
reset_tower_range()
func reset_tower_range():
$Tower/CollisionShape2D.shape.radius = tower_data["range"]
+ _update_visual_circle()
func reset_tower_sprite():
_idle_texture = util.get_tile_texture(tower_data["sprite_idle"])
@@ -76,6 +82,23 @@ func apply_upgrade(effects: Dictionary):
reset_tower_range()
reset_tower_sprite()
+func _update_visual_circle() -> void:
+ var radius = _collision_shape.shape.radius
+ var points = []
+ var segments = 36 # Number of segments to approximate the circle
+ for i in range(segments):
+ var angle = (i / float(segments)) * 2 * PI
+ var x = radius * cos(angle)
+ var y = radius * sin(angle)
+ points.append(Vector2(x, y))
+ _visual_shape.points = points
+
+func hide_collision() -> void:
+ _visual_shape.hide()
+
+func show_collision() -> void:
+ _visual_shape.show()
+
# extending classes should override below
func _on_fire_timer_timeout() -> void:
pass
diff --git a/scripts/game_data.gd b/scripts/game_data.gd
index 1c788ae..d050e25 100644
--- a/scripts/game_data.gd
+++ b/scripts/game_data.gd
@@ -48,8 +48,9 @@ func get_is_spawning() -> bool:
return _is_spawning
func start_spawning():
- if !_is_spawning && _current_wave < game_stats_config.wave_data.size():
- _current_wave += 1
+ if !_is_spawning:
+ _current_wave += 1
+ if _current_wave < game_stats_config.wave_data.size():
_is_spawning = true
emit_signal("wave_started", _current_wave)
diff --git a/scripts/player.gd b/scripts/player.gd
index 4a37965..3289796 100644
--- a/scripts/player.gd
+++ b/scripts/player.gd
@@ -7,6 +7,8 @@ var game_stats_config = preload("res://resources/game_stats_config.tres")
var _max_x : int
var _max_y : int
+var _hovered_tower : StaticBody2D
+
var dirs = {
"move_right": Vector2.RIGHT,
"move_left": Vector2.LEFT,
@@ -40,7 +42,7 @@ func _unhandled_input(event):
_tm.handle_tower_key(tower_ids[id], global_position)
if event.is_action_pressed("advance_wave"):
GameData.start_spawning()
- emit_signal("curr_tile", _get_tile_state())
+ _update_ui()
func handle_move(dir):
position += dir * map_config.tile_size
@@ -49,13 +51,25 @@ func handle_move(dir):
position.x = min(position.x, _max_x - (map_config.tile_size / 2))
position.y = min(position.y, _max_y - (map_config.tile_size / 2))
+func _update_ui():
+ var curr_hovered = _tm.get_tower_at(position)
+ if curr_hovered != _hovered_tower:
+ if _hovered_tower:
+ _hovered_tower.hide_collision()
+ _hovered_tower = curr_hovered
+ if _hovered_tower:
+ _hovered_tower.show_collision()
+
+ emit_signal("curr_tile", _get_tile_upgrades())
+
+
# this method of getting uniform menu for the panel
# was specifically designed that way in game stats config
-# it may be inefficient and is somewhat messy
-func _get_tile_state():
+# it is somewhat unconventional
+func _get_tile_upgrades():
var tile_info = null
- if _tm.is_tile_occupied(position):
- tile_info = _tm.get_upgrades_at(position)
+ if _hovered_tower:
+ tile_info = _hovered_tower.tower_data["upgrades"]
elif _tm.is_valid_placement_tile(position):
tile_info = game_stats_config.defenders
return tile_info
diff --git a/scripts/tower_manager.gd b/scripts/tower_manager.gd
index 808052e..4fbebf6 100644
--- a/scripts/tower_manager.gd
+++ b/scripts/tower_manager.gd
@@ -44,10 +44,10 @@ func _handle_place_tower(tower_index : int, tile_position : Vector2i):
tmp.global_position = tile_position
_occupy_tile(tile_position, tmp)
-func get_upgrades_at(tile_position : Vector2i) -> Array:
+func get_tower_at(tile_position : Vector2i):
if _towers.has(tile_position):
- return _towers[tile_position].tower_data["upgrades"]
- return []
+ return _towers[tile_position]
+ return null
func is_valid_placement_tile(tile_position : Vector2i):
var tile_coords = _tiles.get_cell_atlas_coords(_tiles.local_to_map(tile_position))