using System; using Vector2 = Godot.Vector2; public class VirtualBoard { private readonly int Rows; private readonly int Cols; private readonly VirtualPiece[,] pieces; public class SetPiecePosEventArgs : EventArgs { public VirtualPiece OldPiece { get; set; } public VirtualPiece NewPiece { get; set; } } public class MoveEventArgs : EventArgs { public Vector2 From { get; set; } public Vector2 To { get; set; } } public event EventHandler OnSetPiecePos; public event EventHandler OnInsert; public event EventHandler OnRemove; public event EventHandler OnMove; public VirtualBoard(int rows, int cols) { this.Rows = rows; this.Cols = cols; pieces = new VirtualPiece[rows, cols]; } public bool ArrPosOutOfRange(Vector2 arrayPos) { return arrayPos.X < 0 || arrayPos.X >= Rows || arrayPos.Y < 0 || arrayPos.Y >= Cols; } public VirtualPiece GetPiece(Vector2 arrayPos) { if (ArrPosOutOfRange(arrayPos)) return null; return pieces[(int)arrayPos.X, (int)arrayPos.Y]; } public VirtualPiece SetPiecePos(VirtualPiece piece, Vector2 arrayPos) { if (ArrPosOutOfRange(arrayPos)) return null; VirtualPiece oldPiece = pieces[(int)arrayPos.X, (int)arrayPos.Y]; pieces[(int)arrayPos.X, (int)arrayPos.Y] = piece; OnSetPiecePos?.Invoke(this, new SetPiecePosEventArgs { OldPiece = oldPiece, NewPiece = piece }); piece?.Move(arrayPos); return oldPiece; } public bool InsertPiece(VirtualPiece piece, Vector2 arrayPos) { if (GetPiece(arrayPos) != null) { return false; } OnInsert?.Invoke(this, piece); SetPiecePos(piece, arrayPos); return true; } public bool MovePiece(Vector2 from, Vector2 to) { if (ArrPosOutOfRange(to) || ArrPosOutOfRange(from)) { return false; } if (GetPiece(to) != null) { return false; } OnMove?.Invoke(this, new MoveEventArgs { From = from, To = to }); SetPiecePos(SetPiecePos(null, from), to); return true; } public bool RemovePiece(Vector2 pos) { VirtualPiece piece = GetPiece(pos); if (piece == null) { return false; } OnRemove?.Invoke(this, piece); return SetPiecePos(null, pos) != null; } public void Clear() { for (int i = 0; i < Rows; i++) { for (int j = 0; j < Cols; j++) { RemovePiece(new Vector2(i, j)); } } } }