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/GameBase.hpp6
-rw-r--r--src/base_tab/gamebase/PGNGameBase.cpp63
-rw-r--r--src/base_tab/gamebase/PGNGameBase.hpp4
3 files changed, 60 insertions, 13 deletions
diff --git a/src/base_tab/gamebase/GameBase.hpp b/src/base_tab/gamebase/GameBase.hpp
index 828248c..db58bcc 100644
--- a/src/base_tab/gamebase/GameBase.hpp
+++ b/src/base_tab/gamebase/GameBase.hpp
@@ -1,10 +1,16 @@
#pragma once
#include "game_tab/Game.hpp"
+#include <algorithm>
+#include <vector>
class GameBase {
public:
virtual Game *GetGame(std::uint32_t id) = 0;
+ virtual void Save(std::vector<std::uint32_t> to_ignore,
+ std::vector<GameBase *> new_games_bases,
+ std::vector<Game *> new_games) = 0;
+ virtual Game *GetCurrentGame() = 0;
virtual bool NextGame() = 0;
virtual std::string GetTag(std::string tag) = 0;
virtual void Reset() = 0;
diff --git a/src/base_tab/gamebase/PGNGameBase.cpp b/src/base_tab/gamebase/PGNGameBase.cpp
index 8f9974d..69dcc4f 100644
--- a/src/base_tab/gamebase/PGNGameBase.cpp
+++ b/src/base_tab/gamebase/PGNGameBase.cpp
@@ -1,4 +1,5 @@
#include "PGNGameBase.hpp"
+#include <wx/stdpaths.h>
PGNGameBase::PGNGameBase(std::string pgn_file) : pgn(new pgnp::PGN()) {
file = pgn_file;
@@ -23,6 +24,22 @@ std::string PGNGameBase::GetTag(std::string 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, 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();
@@ -34,21 +51,41 @@ Game *PGNGameBase::GetGame(std::uint32_t id) {
std::uint32_t curid = 0;
while (NextGame()) {
if (id == curid) {
- 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, fen);
- Game *g = new Game(m, fen);
- for (std::string &s : pgn->GetTagList()) {
- g->SetTag(s, pgn->GetTagValue(s));
- }
- return (g);
+ return (GetCurrentGame());
}
curid++;
}
return (NULL);
}
+
+void PGNGameBase::Save(std::vector<std::uint32_t> to_ignore,
+ std::vector<GameBase *> new_games_bases,
+ std::vector<Game *> 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;
+ while (NextGame()) {
+ if (std::find(to_ignore.begin(), to_ignore.end(), id) == to_ignore.end()) {
+ Game *g = GetCurrentGame();
+ new_pgn.Write(g->GetPGN());
+ new_pgn.Write("\n\n");
+ delete g;
+ }
+ id++;
+ }
+
+ // Now add new games
+ // new_games->Reset();
+ // while (new_games->NextGame()) {
+ // Game *g = new_games->GetCurrentGame();
+ // new_pgn.Write(g->GetPGN());
+ // delete g;
+ // }
+
+ new_pgn.Close();
+ wxCopyFile(tmp, file);
+ wxRemoveFile(tmp);
+}
diff --git a/src/base_tab/gamebase/PGNGameBase.hpp b/src/base_tab/gamebase/PGNGameBase.hpp
index 1ad58a1..7a1a63d 100644
--- a/src/base_tab/gamebase/PGNGameBase.hpp
+++ b/src/base_tab/gamebase/PGNGameBase.hpp
@@ -10,6 +10,10 @@ public:
PGNGameBase(std::string pgn_file);
Game *GetGame(std::uint32_t id);
bool NextGame();
+ Game *GetCurrentGame();
std::string GetTag(std::string tag);
+ void Save(std::vector<std::uint32_t> to_ignore,
+ std::vector<GameBase *> new_games_bases,
+ std::vector<Game *> new_games);
void Reset();
}; \ No newline at end of file