using Godot; public class Player { private VirtualBoard board; private SelectedPiece selectedNode; private MoveRecords moveRecords; public enum PlayerType { Human, AI } public Player(VirtualBoard board, PlayerType type = PlayerType.Human) { this.board = board; this.selectedNode = new SelectedPiece(board); this.moveRecords = new MoveRecords(onUndoRecordCallback: (newNode, oldNode, newPos, oldPos) => { GD.Print("Undo: ", newNode, "->", oldNode, ":", newPos, "->", oldPos); VirtualPiece newPiece = newNode; VirtualPiece oldPiece = oldNode; this.board.MovePiece(newPos, oldPos); if (newPiece != null) { this.board.InsertPiece(newPiece, newPos); } }); } public void HandleBoardPosClick(Vector2 clickPos) { if (board.ArrPosOutOfRange(clickPos)) return; GD.Print($"VirtualBoard {clickPos} clicked"); VirtualPiece clickChess = board.GetPiece(clickPos); if (!selectedNode.HasSelected()) { // Select piece if (clickChess == null) { // selectedNode.Clear(); return; } selectedNode.SetPos(clickPos); } else if (clickChess == selectedNode.GetPiece()) { // Unselect piece selectedNode.Clear(); } else { // Move piece GD.Print("default MoveFunc Move: ", selectedNode.GetPos(), "->", clickPos); MoveAndRecord(clickPos, selectedNode.GetPos()); } } public void MoveAndRecord(Vector2 toPos, Vector2 fromPos) { GD.Print($"{fromPos} move to {toPos}"); VirtualPiece toChess = board.GetPiece(toPos); VirtualPiece fromChess = board.GetPiece(fromPos); fromChess?.Selected(false); VirtualPiece NowNode; if (toChess != null) { NowNode = toChess; board.RemovePiece(toPos); } else { NowNode = toChess; } moveRecords.AddRecord(NowNode, fromChess, toPos, fromPos); board.MovePiece(fromPos, toPos); selectedNode.Clear(); } public void Undo() { // ChessPiece selected = selectedNode.GetPiece(); // selected?.DeSelected(); selectedNode.Clear(); moveRecords.Undo(); } public void ReInit() { moveRecords.Clear(); board.Clear(); selectedNode.Clear(); // board.InitChessBoard(); } private class SelectedPiece { // Called when the node enters the scene tree for the first time. private Vector2 selectedNodePos = Vector2.Inf; private VirtualPiece piece; private VirtualBoard board; public SelectedPiece(VirtualBoard board) { this.board = board; } public void Clear() { if (selectedNodePos != Vector2.Inf) { selectedNodePos = Vector2.Inf; piece.Selected(false); } } public void SetPos(Vector2 pos) { // piece = board.GetNodeFromBoard(pos) as VirtualPiece; selectedNodePos = pos; piece = board.GetPiece(selectedNodePos); piece.Selected(true); } public VirtualPiece GetPiece() { return piece; } public Vector2 GetPos() { return selectedNodePos; } public bool HasSelected() { return selectedNodePos != Vector2.Inf; } } }