ochess/src/game_tab/Game.cpp
2022-02-25 13:38:49 +01:00

154 lines
3.2 KiB
C++

#include "Game.hpp"
Game::Game() : current(NULL), moves(NULL) {
tags["White"] = "";
tags["Black"] = "";
initial_fen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1";
board = "rnbqkbnrpppppppp PPPPPPPPRNBQKBNR";
}
Game::Game(std::string fen) : current(NULL), moves(NULL) {
tags["White"] = "";
tags["Black"] = "";
tags["FEN"] = fen;
initial_fen = fen;
board = chessarbiter::FENParser::Parse(fen).board;
}
Game::Game(HalfMove *m, std::string initial_fen) {
moves = m;
current = m;
this->initial_fen = initial_fen;
board = chessarbiter::FENParser::Parse(initial_fen).board;
}
std::string Game::GetBoard() { return (board); }
std::string Game::GetTag(std::string tagname) { return (tags[tagname]); }
void Game::SetTag(std::string tagname, std::string value) {
tags[tagname] = value;
}
bool Game::IsBlackToPlay() {
if (current == NULL) {
return (false);
}
return (!current->IsBlack);
}
void Game::DeleteTag(std::string tagname) { tags.erase(tagname); }
void Game::DeleteMove(HalfMove *m) {
if (moves == m) {
current = NULL;
moves = NULL;
delete m;
} else {
if (m != NULL) {
current = m->GetParent();
if (current != NULL) {
current->RemoveChild(m);
}
delete m;
}
}
}
HalfMove *Game::GetCurrentMove() { return (current); }
HalfMove *Game::GetMoves() { return (moves); }
void Game::PromoteMove(HalfMove *m) {
if (m != NULL) {
current = m;
m->Promote();
}
}
void Game::SetMoveAsMainline(HalfMove *m) {
if (m != NULL) {
current = m;
m->SetAsMainline();
}
}
bool Game::Play(std::string move) {
wxLogDebug("Playing move %s", move);
std::string fen = GetFen();
arbiter.Setup(fen);
if (arbiter.Play(move)) {
HalfMove *m = new HalfMove(arbiter.GetSAN(), arbiter.GetFEN());
char capture = arbiter.GetCapture();
if (capture != ' ') {
wxLogDebug("%c", capture);
m->SetCapture(capture);
}
if (current != NULL) {
current->AddMove(m);
} else if (moves != NULL) {
moves->AddVariation(m);
}
current = m;
if (moves == NULL) {
moves = m;
}
wxLogDebug("%s", GetPGN());
return (true);
}
return (false);
}
void Game::Previous() {
if (current != NULL) {
current = current->GetParent();
}
}
std::vector<std::string> Game::ListTags() {
std::vector<std::string> keys;
for (auto const &element : tags) {
keys.push_back(element.first);
}
return (keys);
}
void Game::Next() {
if (current != NULL) {
HalfMove *m = current->GetMainline();
if (m != NULL) {
current = m;
}
} else {
current = moves;
}
}
void Game::SetCurrent(HalfMove *m) { current = m; }
std::string Game::GetFen() {
if (current == NULL) {
return (initial_fen);
}
return (current->GetFen());
}
std::string Game::GetPGN() {
std::string pgn;
if (moves != NULL) {
for (auto const &element : tags) {
pgn += '[' + element.first + " \"" + element.second + "\"]\n";
}
pgn += moves->GetPGN();
}
pgn += " " + result;
return (pgn);
}
void Game::SetResult(std::string result) { this->result = result; }
void Game::BuildAndVerify() {
if (moves != NULL) {
moves->BuildAndVerify(GetFen());
}
}