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