#pragma once #include "CGEditor.hpp" #include "ChessArbiter.hpp" #include "ochess.hpp" #include "pgnp.hpp" #include #include /** * @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 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 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); };