aboutsummaryrefslogtreecommitdiff
path: root/src/base_tab/gamebase/PGNGameBase.cpp
blob: 8f9974dde782a6791db42eb8ad5db976ab169d6e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include "PGNGameBase.hpp"

PGNGameBase::PGNGameBase(std::string pgn_file) : pgn(new pgnp::PGN()) {
  file = pgn_file;
  pgn->FromFile(pgn_file);
}

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 ("");
}

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) {
      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);
    }
    curid++;
  }
  return (NULL);
}