xanarch-td/scripts/gameplay/TowerSlot.gd
2026-06-03 21:53:16 -04:00

59 lines
1.6 KiB
GDScript

## 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)