#include "PGNGameBase.hpp" #include PGNGameBase::PGNGameBase(std::string pgn_file) : pgn(new pgnp::PGN()) { file = pgn_file; pgn->FromFile(pgn_file); } PGNGameBase::~PGNGameBase() { delete pgn; // Should never fail since pgn is never NULL } bool PGNGameBase::NextGame() { bool game_found = false; try { pgn->ParseNextGame(); game_found = true; } catch (...) { game_found = false; } return (game_found); } std::string PGNGameBase::GetTag(std::string tag) { if (pgn->HasTag(tag)) { return (pgn->GetTagValue(tag)); } return (""); } Game *PGNGameBase::GetCurrentGame() { pgnp::HalfMove *pgnp_moves = new pgnp::HalfMove(); pgn->GetMoves(pgnp_moves); std::string fen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"; if (pgn->HasTag("FEN")) { fen = pgn->GetTagValue("FEN"); } HalfMove *m = new HalfMove(pgnp_moves); m->SetFen(fen); Game *g = new Game(m, fen); for (std::string &s : pgn->GetTagList()) { g->SetTag(s, pgn->GetTagValue(s)); } g->SetResult(pgn->GetResult()); return (g); } void PGNGameBase::Reset() { delete pgn; pgn = new pgnp::PGN(); pgn->FromFile(file); } Game *PGNGameBase::GetGame(std::uint32_t id) { Reset(); std::uint32_t curid = 0; while (NextGame()) { if (id == curid) { return (GetCurrentGame()); } curid++; } return (NULL); } void PGNGameBase::Save(std::vector to_ignore, std::vector new_games_bases, std::vector new_games) { wxStandardPaths stdPaths = wxStandardPaths::Get(); wxString tmp = stdPaths.GetTempDir() + "/save_pgn_tmp.pgn"; wxFile new_pgn(tmp, wxFile::write); Reset(); std::uint32_t id = 0; bool several = false; while (NextGame()) { if (std::find(to_ignore.begin(), to_ignore.end(), id) == to_ignore.end()) { if (several) { new_pgn.Write("\n\n"); } else { several = true; } Game *g = GetCurrentGame(); new_pgn.Write(g->GetPGN()); delete g; } id++; } // Now add new games for (GameBase *current : new_games_bases) { current->Reset(); while (current->NextGame()) { if (several) { new_pgn.Write("\n\n"); } else { several = true; } Game *g = current->GetCurrentGame(); new_pgn.Write(g->GetPGN()); delete g; } } for (Game *g : new_games) { if (several) { new_pgn.Write("\n\n"); } else { several = true; } new_pgn.Write(g->GetPGN()); } new_pgn.Close(); wxCopyFile(tmp, file); wxRemoveFile(tmp); } void PGNGameBase::Export(GameBase *base) { wxFile new_pgn(file, wxFile::write); base->Reset(); bool several = false; while (base->NextGame()) { if (several) { new_pgn.Write("\n\n"); } else { several = true; } Game *g = base->GetCurrentGame(); new_pgn.Write(g->GetPGN()); delete g; } new_pgn.Close(); }