ChessBuilder/Systems/PieceContainer.gd
2025-02-11 16:22:40 -06:00

82 lines
2.3 KiB
GDScript

class_name PieceContainer extends Button
var piece: Pawn = null
var effects: Node # Keep effects as a sub-node
var overlay_nodes: Array[Node] = []
func _init() -> void:
# Setup effects node
effects = Node.new()
effects.name = "Effects"
add_child(effects)
func animate_movement(source_container: PieceContainer, moving_piece: Pawn) -> void :
await set_piece(moving_piece)
source_container.remove_piece(true)
remove_piece(true)
set_piece(moving_piece, false)
func set_piece(new_piece: Pawn, animate: bool = true) -> void:
remove_piece() # Clean up any existing piece
piece = new_piece
if new_piece != null:
if animate:
print("POS ", get_global_position())
var targetPos = get_global_position() + Vector2(25, 25)
if new_piece.get_parent():
new_piece.reparent(self)
else:
add_child(new_piece)
await new_piece.animate_movement(targetPos)
else:
if new_piece.get_parent():
new_piece.reparent(self)
else:
add_child(new_piece)
new_piece.position = Vector2(25, 25)
func get_piece() -> Pawn:
return piece
func remove_piece(keep_piece: bool = false) -> Pawn:
var old_piece = piece
if piece != null:
if piece.get_parent() == self:
remove_child(piece)
if !keep_piece:
piece.queue_free()
old_piece = null
piece = null
return old_piece
func add_overlay(overlay: Node) -> void:
if overlay is ColorRect:
overlay.size = size
overlay.position = Vector2.ZERO
overlay.mouse_filter = Control.MOUSE_FILTER_IGNORE
add_child(overlay)
overlay_nodes.append(overlay)
func remove_overlay(overlay_name: String) -> void:
for overlay in overlay_nodes:
if overlay != null and overlay.name == overlay_name:
remove_child(overlay)
overlay_nodes.erase(overlay)
overlay.queue_free()
break
func get_overlay(overlay_name: String) -> Node:
for overlay in overlay_nodes:
if overlay.name == overlay_name:
return overlay
return null
func has_piece() -> bool:
return piece != null