diff options
| author | Loic Guegan <manzerbredes@mailbox.org> | 2022-03-01 15:58:02 +0100 |
|---|---|---|
| committer | Loic Guegan <manzerbredes@mailbox.org> | 2022-03-01 15:58:02 +0100 |
| commit | cb4f5ada5c91629e96f1daecaf85dc92bee5359d (patch) | |
| tree | ed25b0652a44596f72d034ad9cbb2b7331e3fac9 /src/base_tab/gamebase | |
| parent | 9cba705e6631216bfcb8c95940bcf097a7888da2 (diff) | |
Move PGN export to the right place
Diffstat (limited to 'src/base_tab/gamebase')
| -rw-r--r-- | src/base_tab/gamebase/PGNGameBase.cpp | 56 | ||||
| -rw-r--r-- | src/base_tab/gamebase/PGNGameBase.hpp | 2 |
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 |
