diff options
Diffstat (limited to 'scripts')
-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 |
4 files changed, 50 insertions, 12 deletions
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)) |