diff options
-rw-r--r-- | resources/game_stats_config.tres | 2 | ||||
-rw-r--r-- | scenes/game.tscn | 1 | ||||
-rw-r--r-- | scenes/warlock.tscn | 2 | ||||
-rw-r--r-- | scenes/wyvern.tscn | 2 | ||||
-rw-r--r-- | scripts/base_defender.gd | 27 | ||||
-rw-r--r-- | scripts/game_data.gd | 5 | ||||
-rw-r--r-- | scripts/player.gd | 24 | ||||
-rw-r--r-- | scripts/tower_manager.gd | 6 |
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)) |