aboutsummaryrefslogtreecommitdiff
path: root/src/base_tab/gamebase
diff options
context:
space:
mode:
Diffstat (limited to 'src/base_tab/gamebase')
-rw-r--r--src/base_tab/gamebase/PGNGameBase.cpp56
-rw-r--r--src/base_tab/gamebase/PGNGameBase.hpp2
2 files changed, 54 insertions, 4 deletions
diff --git a/src/base_tab/gamebase/PGNGameBase.cpp b/src/base_tab/gamebase/PGNGameBase.cpp
index e0fe3b9..bb7955d 100644
--- a/src/base_tab/gamebase/PGNGameBase.cpp
+++ b/src/base_tab/gamebase/PGNGameBase.cpp
@@ -81,7 +81,7 @@ void PGNGameBase::Save(std::vector<std::uint32_t> to_ignore,
several = true;
}
std::shared_ptr<Game> g = GetCurrentGame();
- new_pgn.Write(g->GetPGN());
+ new_pgn.Write(GetPGN(g));
}
id++;
}
@@ -96,7 +96,7 @@ void PGNGameBase::Save(std::vector<std::uint32_t> to_ignore,
several = true;
}
std::shared_ptr<Game> g = current->GetCurrentGame();
- new_pgn.Write(g->GetPGN());
+ new_pgn.Write(GetPGN(g));
}
}
@@ -106,7 +106,7 @@ void PGNGameBase::Save(std::vector<std::uint32_t> to_ignore,
} else {
several = true;
}
- new_pgn.Write(g->GetPGN());
+ new_pgn.Write(GetPGN(g));
}
new_pgn.Close();
@@ -126,8 +126,56 @@ void PGNGameBase::Export(std::shared_ptr<GameBase> base) {
several = true;
}
std::shared_ptr<Game> g = base->GetCurrentGame();
- new_pgn.Write(g->GetPGN());
+ new_pgn.Write(GetPGN(g));
}
new_pgn.Close();
}
+
+std::string PGNGameBase::GetPGN(std::shared_ptr<Game> g) {
+ std::string pgn;
+ HalfMove *m=g->GetMoves();
+
+ for (auto const &element : g->ListTags()) {
+ pgn += '[' + element + " \"" + g->GetTag(element) + "\"]\n";
+ }
+ pgn += GetMovesPGN(m,m->IsABlackMove());
+
+ pgn += " " + g->GetResult();
+ return (pgn);
+}
+
+std::string PGNGameBase::GetMovesPGN(HalfMove *m, bool needDots) {
+ std::string part;
+ bool newNeedDots = false;
+
+ if (!m->IsABlackMove() || needDots) {
+ part += std::to_string(m->Number) + ".";
+ if (needDots) {
+ part += "..";
+ }
+ }
+ part += m->move;
+
+ if (m->GetNbLineComment() > 0) {
+ part += " {";
+ part += m->GetComment();
+ part += "}";
+ newNeedDots = true;
+ }
+
+ if (m->GetVariations().size() > 0) {
+ newNeedDots = true;
+ for (HalfMove *v : m->GetVariations()) {
+ part += " (";
+ part += GetMovesPGN(v, m->IsABlackMove());
+ part += ")";
+ }
+ }
+
+ if (m->GetMainline() != NULL) {
+ part += " " + GetMovesPGN(m->GetMainline(), !m->IsABlackMove() && newNeedDots);
+ }
+
+ return (part);
+} \ No newline at end of file
diff --git a/src/base_tab/gamebase/PGNGameBase.hpp b/src/base_tab/gamebase/PGNGameBase.hpp
index 507a29a..ee1c99b 100644
--- a/src/base_tab/gamebase/PGNGameBase.hpp
+++ b/src/base_tab/gamebase/PGNGameBase.hpp
@@ -18,4 +18,6 @@ public:
std::vector<std::shared_ptr<Game>> new_games);
void Reset();
void Export(std::shared_ptr<GameBase> base);
+ static std::string GetMovesPGN(HalfMove *m, bool needDots);
+ static std::string GetPGN(std::shared_ptr<Game> g);
}; \ No newline at end of file