diff --git a/src/main/java/featurecat/lizzie/rules/SGFParser.java b/src/main/java/featurecat/lizzie/rules/SGFParser.java index 3cc146e50..41070ccd7 100644 --- a/src/main/java/featurecat/lizzie/rules/SGFParser.java +++ b/src/main/java/featurecat/lizzie/rules/SGFParser.java @@ -19,6 +19,7 @@ import java.util.HashMap; import java.util.Map; import java.util.Optional; +import java.util.Stack; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -652,8 +653,30 @@ private static void saveToStream(Board board, Writer writer) throws IOException // * with 'xy' = coordinates ; or 'tt' for pass. // Write variation tree - builder.append(generateNode(board, history.getCurrentHistoryNode())); - + BoardHistoryNode markerBeg = new BoardHistoryNode(null); + BoardHistoryNode markerEnd = new BoardHistoryNode(null); + Stack stack = new Stack<>(); + stack.push(history.getCurrentHistoryNode()); + while (!stack.isEmpty()) { + BoardHistoryNode cur = stack.pop(); + if (cur == markerBeg) { + builder.append('('); + continue; + } + if (cur == markerEnd) { + builder.append(')'); + continue; + } + builder.append(generateNode(board, cur)); + boolean hasBrothers = (cur.numberOfChildren() > 1); + if (cur.numberOfChildren() >= 1) { + for (int i = cur.numberOfChildren() - 1; i >= 0; i--) { + if (hasBrothers) stack.push(markerEnd); + stack.push(cur.getVariations().get(i)); + if (hasBrothers) stack.push(markerBeg); + } + } + } // close file builder.append(')'); writer.append(builder.toString()); @@ -698,19 +721,6 @@ private static String generateNode(Board board, BoardHistoryNode node) throws IO builder.append(String.format("LZ[%s]", formatNodeData(node))); } } - - if (node.numberOfChildren() > 1) { - // Variation - for (BoardHistoryNode sub : node.getVariations()) { - builder.append("("); - builder.append(generateNode(board, sub)); - builder.append(")"); - } - } else if (node.numberOfChildren() == 1) { - builder.append(generateNode(board, node.next().orElse(null))); - } else { - return builder.toString(); - } } return builder.toString();