83 lines
2.3 KiB
GDScript
83 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] = []
|
|
var location: String
|
|
|
|
func _init(loc: String) -> void:
|
|
location = loc
|
|
# 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
|