public static Game CreateGame(this PgnEditor pgnEditor, PgnGameSyntax gameSyntax) { var game = new Game(); foreach (PgnPlySyntax ply in gameSyntax.PlyList.Plies) { // For now, invalidate the remainder of the game if seeing a null or unrecognized move. if (ply.Move == null) { break; } PgnMoveSyntax moveSyntax = ply.Move.PlyContentNode.ContentNode; if (moveSyntax.IsUnrecognizedMove) { break; } var sideToMove = game.SideToMove; MoveInfo moveInfo = GetMoveInfo(game, pgnEditor.GetTextRange(moveSyntax.AbsoluteStart, moveSyntax.Length), sideToMove); game.TryMakeMove(ref moveInfo, true); // Also invalidate on illegal move. if (sideToMove == game.SideToMove) { break; } } return(game); }
public UIActionState TryOpenGame(PgnEditor pgnEditor, bool perform) { PgnGameSyntax gameSyntax = pgnEditor.GameAtOrBeforePosition(pgnEditor.SelectionStart); if (gameSyntax == null) { return(UIActionVisibility.Disabled); } if (perform) { StandardChessBoard chessBoard = OpenGames.GetOrAdd(gameSyntax, key => { const string WhiteTagName = "White"; const string BlackTagName = "Black"; const string WhiteEloTagName = "WhiteElo"; const string BlackEloTagName = "BlackElo"; // Look in the game's tags for these 4 values. string white = null; string black = null; string whiteElo = null; string blackElo = null; foreach (PgnTagPairSyntax tagPairSyntax in gameSyntax.TagSection.TagPairNodes) { string tagName = null; string tagValue = null; foreach (PgnTagElementSyntax tagElementSyntax in tagPairSyntax.TagElementNodes.Select(x => x.ContentNode)) { if (tagElementSyntax is PgnTagNameSyntax tagNameSyntax) { tagName = pgnEditor.GetTextRange(tagNameSyntax.AbsoluteStart, tagNameSyntax.Length); } else if (tagElementSyntax is PgnTagValueSyntax tagValueSyntax) { tagValue = tagValueSyntax.Value; } } if (tagName != null && tagValue != null) { if (tagName.Equals(WhiteTagName, StringComparison.OrdinalIgnoreCase)) { white = tagValue; } else if (tagName.Equals(BlackTagName, StringComparison.OrdinalIgnoreCase)) { black = tagValue; } else if (tagName.Equals(WhiteEloTagName, StringComparison.OrdinalIgnoreCase)) { whiteElo = tagValue; } else if (tagName.Equals(BlackEloTagName, StringComparison.OrdinalIgnoreCase)) { blackElo = tagValue; } } } StandardChessBoard newChessBoard = OpenChessBoard(pgnEditor, pgnEditor.CreateGame(gameSyntax), white, black, whiteElo, blackElo); newChessBoard.Disposed += (_, __) => OpenGames.Remove(gameSyntax); return(newChessBoard); }); chessBoard.EnsureActivated(); } return(UIActionVisibility.Enabled); }