aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLoic Guegan <manzerbredes@mailbox.org>2023-01-10 16:01:26 +0100
committerLoic Guegan <manzerbredes@mailbox.org>2023-01-10 16:01:26 +0100
commitb9aa1085df08c4a8901ca0433de25a170b33e6d6 (patch)
tree72034a2ff87c3187529a0dc6ffdece212b6134a6
parent840e68807cfbb23fcc2718496d07a6d3ec5fc8ed (diff)
Improve pawn promotion code
-rw-r--r--src/game_tab/Game.cpp4
-rw-r--r--src/game_tab/Game.hpp2
-rw-r--r--src/game_tab/left_panel/GameTabLeftPanel.cpp9
-rw-r--r--src/game_tab/left_panel/GameTabLeftPanel.hpp1
-rw-r--r--src/game_tab/left_panel/board/BoardCanvas.cpp41
-rw-r--r--src/game_tab/left_panel/board/BoardCanvas.hpp2
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> 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> 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<std::string> 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<char, std::uint8_t> captures;
std::vector<Square> squares_hl;
std::vector<Arrow> arrows;