59 lines
1.6 KiB
GDScript
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)
|