From b9aa1085df08c4a8901ca0433de25a170b33e6d6 Mon Sep 17 00:00:00 2001 From: Loic Guegan Date: Tue, 10 Jan 2023 16:01:26 +0100 Subject: [PATCH] Improve pawn promotion code --- src/game_tab/Game.cpp | 4 +- src/game_tab/Game.hpp | 2 +- src/game_tab/left_panel/GameTabLeftPanel.cpp | 9 +++- src/game_tab/left_panel/GameTabLeftPanel.hpp | 1 + src/game_tab/left_panel/board/BoardCanvas.cpp | 41 ++++++++++++++++--- src/game_tab/left_panel/board/BoardCanvas.hpp | 2 + 6 files changed, 48 insertions(+), 11 deletions(-) diff --git a/src/game_tab/Game.cpp b/src/game_tab/Game.cpp index 53be08f..def179c 100644 --- a/src/game_tab/Game.cpp +++ b/src/game_tab/Game.cpp @@ -100,11 +100,11 @@ bool Game::IsCheckmate(bool forBlack){ return !arbiter.IsBlackTurn() && arbiter.IsCheckMate(); } -bool Game::Play(std::string move) { +bool Game::Play(std::string move,char promotion) { wxLogDebug("Playing move %s", move); std::string fen = GetFen(); arbiter.Setup(fen); - if (arbiter.Play(move)) { + if (arbiter.Play(move,promotion)) { HalfMove *m = new HalfMove(move, arbiter.GetSAN(), arbiter.GetFEN()); char capture = arbiter.GetCapture(); if (capture != ' ') { diff --git a/src/game_tab/Game.hpp b/src/game_tab/Game.hpp index 0590027..2fa9bcd 100644 --- a/src/game_tab/Game.hpp +++ b/src/game_tab/Game.hpp @@ -29,7 +29,7 @@ public: HalfMove *GetMoves(); std::string GetFen(); std::string GetResult(); - bool Play(std::string move); + bool Play(std::string move,char promotion='q'); bool IsBlackToPlay(); bool IsCheckmate(bool forBlack); void Previous(); diff --git a/src/game_tab/left_panel/GameTabLeftPanel.cpp b/src/game_tab/left_panel/GameTabLeftPanel.cpp index d034115..65d77f0 100644 --- a/src/game_tab/left_panel/GameTabLeftPanel.cpp +++ b/src/game_tab/left_panel/GameTabLeftPanel.cpp @@ -25,6 +25,7 @@ GameTabLeftPanel::GameTabLeftPanel(wxFrame *parent, std::shared_ptr game) // Bind events: Bind(PLAY_MOVE_EVENT, &GameTabLeftPanel::OnPlay, this, wxID_ANY); + Bind(PLAY_PROMOTE, &GameTabLeftPanel::OnPromote,this); Bind(wxEVT_BUTTON, [bc=board_canvas](wxCommandEvent &event){bc->Zoom(10);}, ZOOM_IN_BTN); Bind(wxEVT_BUTTON, [bc=board_canvas](wxCommandEvent &event){bc->Zoom(-10);}, ZOOM_OUT_BTN); Bind(wxEVT_BUTTON, [bc=board_canvas](wxCommandEvent &event){bc->Swap();}, SWAP_BTN); @@ -59,10 +60,14 @@ GameTabLeftPanel::GameTabLeftPanel(wxFrame *parent, std::shared_ptr game) }); } +void GameTabLeftPanel::OnPromote(wxCommandEvent &event){ + char piece=event.GetString()[0]; + wxLogDebug("Promote to %c",piece); +} void GameTabLeftPanel::OnPlay(wxCommandEvent &event) { - wxLogDebug("Game tab received PLAY_MOVE_EVENT"); - if (game->Play(event.GetString().ToStdString())) { + std::string move=event.GetString().ToStdString(); + if (game->Play(move)) { // Notify other classes wxCommandEvent event(GAME_CHANGE, GetId()); event.SetEventObject(this); diff --git a/src/game_tab/left_panel/GameTabLeftPanel.hpp b/src/game_tab/left_panel/GameTabLeftPanel.hpp index 6bd6b38..8a40e38 100644 --- a/src/game_tab/left_panel/GameTabLeftPanel.hpp +++ b/src/game_tab/left_panel/GameTabLeftPanel.hpp @@ -21,6 +21,7 @@ public: void OnPlay(wxCommandEvent &event); void OnGotoMove(wxCommandEvent &event); void OnRefreshBoard(wxCommandEvent &event); + void OnPromote(wxCommandEvent &event); void ApplyPreferences(); void SetSaveToolEnable(bool state){game_toolbar->EnableTool(0,state);}; void SetEngineArrows(std::vector arrows); diff --git a/src/game_tab/left_panel/board/BoardCanvas.cpp b/src/game_tab/left_panel/board/BoardCanvas.cpp index 8a017c8..7f045f9 100644 --- a/src/game_tab/left_panel/board/BoardCanvas.cpp +++ b/src/game_tab/left_panel/board/BoardCanvas.cpp @@ -9,6 +9,7 @@ tmp=rot_m.TransformPoint(tmp); \ (PT).x+=xsrc;(PT).y+=ysrc;} wxDEFINE_EVENT(PLAY_MOVE_EVENT, wxCommandEvent); +wxDEFINE_EVENT(PLAY_PROMOTE, wxCommandEvent); BoardCanvas::BoardCanvas(wxFrame *parent) : wxPanel(parent), black_side(false), frozen(false), @@ -134,6 +135,7 @@ void BoardCanvas::SetupBoard(const GameState &new_gs) { gs.white_time=new_gs.white_time; gs.squares_hl=new_gs.squares_hl; gs.arrows=new_gs.arrows; + gs.promotion=new_gs.promotion; Refresh(); } @@ -421,11 +423,10 @@ void BoardCanvas::DrawBoard(wxDC &dc) { } } // Ask for promotion - /*std::string s="f8"; - { - std::uint8_t sfile = s[0]-'a'; - std::uint8_t srank = s[1]-'1'; - bool is_black_promotion=s[1]=='1'; + if(gs.promotion.size()==2){ + std::uint8_t sfile = gs.promotion[0]-'a'; + std::uint8_t srank = gs.promotion[1]-'1'; + bool is_black_promotion=gs.promotion[1]=='1'; if (!black_side) { srank = 7 - srank; sfile = 7 - sfile; @@ -451,7 +452,7 @@ void BoardCanvas::DrawBoard(wxDC &dc) { else offset++; } - }*/ + } } void BoardCanvas::MouseEvent(wxMouseEvent &event) { @@ -459,6 +460,34 @@ void BoardCanvas::MouseEvent(wxMouseEvent &event) { if(frozen) return; + // If ask for promotion just wait for the user reply + if(gs.promotion.size()==2){ + if(event.LeftDown()){ + REFRESH_MOUSE_LOCATION(); + INIT_CURRENT_SQUARE(); + if (IsCurrentSquareValid) { + if((char)('a' + file)==gs.promotion[0]){ + std::uint8_t prank=abs((int)gs.promotion[1]-(int)(char)('1' + rank)); + if(prank<=3){ + wxLogDebug("%d",(int)prank); + wxCommandEvent event(PLAY_PROMOTE, GetId()); + event.SetEventObject(this); + if(prank==1) + event.SetString("r"); + else if(prank==2) + event.SetString("b"); + else if(prank==3) + event.SetString("n"); + else + event.SetString("q"); + ProcessEvent(event); + } + } + } + } + return; + } + // Just redraw if a piece is currently being moved: if (event.Dragging() && valid_drag) { is_dragging = true; diff --git a/src/game_tab/left_panel/board/BoardCanvas.hpp b/src/game_tab/left_panel/board/BoardCanvas.hpp index bc850b7..efd917b 100644 --- a/src/game_tab/left_panel/board/BoardCanvas.hpp +++ b/src/game_tab/left_panel/board/BoardCanvas.hpp @@ -12,6 +12,7 @@ // Local events wxDECLARE_EVENT(PLAY_MOVE_EVENT, wxCommandEvent); +wxDECLARE_EVENT(PLAY_PROMOTE, wxCommandEvent); #define REFRESH_MOUSE_LOCATION() \ { \ @@ -74,6 +75,7 @@ typedef struct GameState { } Square; std::string white, black; std::string board; + std::string promotion; std::map captures; std::vector squares_hl; std::vector arrows;