mirror of
https://gitlab.com/manzerbredes/ochess.git
synced 2025-04-07 02:26:29 +02:00
154 lines
3.2 KiB
C++
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());
|
|
}
|
|
}
|