## TowerSlot.gd ## A cell on the lane grid where a tower can be placed. ## Uses Area2D input_event for click detection. class_name TowerSlot extends Area2D var player_id: int = 0 var _tower: Node = null signal slot_clicked(slot: TowerSlot) func _ready() -> void: input_pickable = true input_event.connect(_on_input_event) # Tint the visual based on state _refresh_visual() func _on_input_event(_viewport, event: InputEvent, _shape_idx: int) -> void: if event is InputEventMouseButton \ and event.pressed \ and event.button_index == MOUSE_BUTTON_LEFT: slot_clicked.emit(self) func is_empty() -> bool: return _tower == null func place_tower(tower_data: Dictionary, pid: int) -> bool: if not is_empty(): return false var tower_scene := load("res://scenes/gameplay/Tower.tscn") as PackedScene if not tower_scene: push_error("TowerSlot: Tower.tscn not found") return false _tower = tower_scene.instantiate() _tower.setup(tower_data, pid) add_child(_tower) _refresh_visual() EventBus.tower_placed.emit(pid, tower_data.get("id", ""), self) return true func upgrade_tower(new_tower_data: Dictionary) -> bool: if is_empty() or not _tower.can_upgrade(): return false _tower.setup(new_tower_data, _tower.player_id) _refresh_visual() EventBus.tower_upgraded.emit(_tower.player_id, _tower, new_tower_data.get("id", "")) return true func get_tower() -> Node: return _tower func _refresh_visual() -> void: var vis := get_node_or_null("SlotVisual") as ColorRect if not vis: return if is_empty(): vis.color = Color(0.2, 0.2, 0.2, 0.5) else: vis.color = Color(0.1, 0.35, 0.15, 0.7)