From 40c6df0e7c3f17204a6187eb2bc241f396720272 Mon Sep 17 00:00:00 2001 From: Loic Guegan Date: Thu, 24 Feb 2022 12:09:21 +0100 Subject: Improve BaseTab implementation for PGN files --- src/base_tab/gamebase/PGNGameBase.cpp | 36 ++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) (limited to 'src/base_tab/gamebase/PGNGameBase.cpp') diff --git a/src/base_tab/gamebase/PGNGameBase.cpp b/src/base_tab/gamebase/PGNGameBase.cpp index 09d87d8..39775d1 100644 --- a/src/base_tab/gamebase/PGNGameBase.cpp +++ b/src/base_tab/gamebase/PGNGameBase.cpp @@ -1,5 +1,35 @@ #include "PGNGameBase.hpp" -PGNGameBase::PGNGameBase(std::string pgn_file) { - -} \ No newline at end of file +PGNGameBase::PGNGameBase(std::string pgn_file) + : pgn(new pgnp::PGN()), hasNextGame(false) { + pgn->FromFile(pgn_file); + ParseNextGame(); +} + +bool PGNGameBase::HasNextGame() { return (hasNextGame); } + +void PGNGameBase::ParseNextGame() { + try { + pgn->ParseNextGame(); + hasNextGame = true; + } catch (...) { + hasNextGame = false; + } +} + +Game *PGNGameBase::GetNextGame() { + 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)); + } + + ParseNextGame(); + return (g); +} -- cgit v1.2.3