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

65 lines
1.8 KiB
C++

#pragma once
#include "CGEditor.hpp"
#include "ChessArbiter.hpp"
#include "ochess.hpp"
#include "pgnp.hpp"
#include <map>
#include <vector>
/**
* @brief Create your custom half move class
*
* The implementation of the class should give you
* an overview of how to keep your move sync with the one of CGEditor
*
*/
class HalfMove : public cgeditor::CGEHalfMove {
HalfMove *parent = NULL;
HalfMove *mainline = NULL;
chessarbiter::ChessArbiter arbiter;
std::vector<HalfMove *> variations;
std::string fen;
char capture;
std::string GetPGN(bool needDots);
void BuildAndVerify(HalfMove *m, std::string fen);
public:
HalfMove(std::string move);
HalfMove(std::string move, std::string fen);
HalfMove(pgnp::HalfMove *m);
~HalfMove();
/// @brief Add variation to current move
void AddVariation(HalfMove *m);
/// @brief Remove the specified child from mainline and/or variations
void RemoveChild(HalfMove *m);
void AddMove(HalfMove *m);
/// @brief Set value of the mailine
void SetMainline(HalfMove *m);
/// @brief Set this move as mainline
void SetAsMainline();
/// @brief Promote the current move and submove
void Promote();
/// @brief Check if current half move is within a variation
bool IsVariation();
/// @brief Get the root of a variation
HalfMove *GetRoot();
/// @brief Get parent of the current move
HalfMove *GetParent();
HalfMove *GetMainline();
std::map<char, std::uint8_t> GetLineCaptures();
/// @brief Set parent of the current move
void SetParent(HalfMove *m);
std::string GetFen();
void SetFen(std::string fen);
void SetCapture(char c);
std::string GetPGN();
/**
* @brief Build current move
* Verify and play all the moves in the game
* while building the fen for each move
*/
void BuildAndVerify(std::string initial_fen);
};