using Gameboard.ShogiUI.Sockets.ServiceModels.Types; using System.Numerics; namespace Gameboard.ShogiUI.Sockets.Repositories.CouchModels { public class Move { /// /// A board coordinate, like A3 or G6. When null, look for PieceFromHand to exist. /// public string? From { get; set; } public bool IsPromotion { get; set; } /// /// The piece placed from the player's hand. /// public WhichPiece? PieceFromHand { get; set; } /// /// A board coordinate, like A3 or G6. /// public string To { get; set; } /// /// Default constructor and setters are for deserialization. /// public Move() { To = string.Empty; } public Move(Models.Move move) { if (move.From.HasValue) { From = ToBoardNotation(move.From.Value); } IsPromotion = move.IsPromotion; To = ToBoardNotation(move.To); PieceFromHand = move.PieceFromHand; } private static readonly char A = 'A'; private static string ToBoardNotation(Vector2 vector) { var file = (char)(vector.X + A); var rank = vector.Y + 1; return $"{file}{rank}"; } public Models.Move ToDomainModel() => PieceFromHand.HasValue ? new(PieceFromHand.Value, To) : new(From!, To, IsPromotion); } }