private static void CompileNode(GoGame game, SGFTree tree) { var singleBranch = true; while (singleBranch) { if (IsMoveNode(tree)) { var node = new GoMoveNode(game.CurrentNode, FindStone(tree), game.MoveNumber % BoardStorageStepConfiguration == 0); game.AddNode(node); } else { GoSetupNode node; if (game.CurrentNode is GoRootNode && useRoot) { node = game.CurrentNode as GoRootNode; } else { node = new GoSetupNode(game.CurrentNode); } foreach (var property in tree.Properties) { var name = property.Name.ToUpper(); switch (name) { case "AB": case "AW": foreach (var stone in CompilePointValues(property.Value)) { stone.IsBlack = name == "AB"; node.AddStone(stone); } break; case "AE": foreach (var stone in CompilePointValues(property.Value)) { node.RemoveStone(stone); } break; case "PL": node.SetPlayer(property.Value.StartsWith("B")); break; } } if (!(game.CurrentNode is GoRootNode && useRoot)) { game.AddNode(node); } else { useRoot = false; } } CompileProperties(game.CurrentNode, tree); if (tree.ChildNodes.Count == 1) { tree = tree.ChildNodes[0]; } else { singleBranch = false; } } var move = game.MoveNumber; foreach (var branch in tree.ChildNodes) { CompileNode(game, branch); game.ToMove(move); } }