|
|
@@ -217,118 +217,128 @@ uint8_t flipchess_turn(FlipChessScene1Model* model) {
|
|
|
|
|
|
if(model->game.state != SCL_GAME_STATE_PLAYING) {
|
|
|
model->paramExit = FlipChessStatusNone;
|
|
|
- return model->paramExit;
|
|
|
- }
|
|
|
-
|
|
|
- char movePromote = 'q';
|
|
|
-
|
|
|
- if(flipchess_isPlayerTurn(model)) {
|
|
|
- // if(stringsEqual(string, "undo", 5))
|
|
|
- // moveType = FlipChessStatusMoveUndo;
|
|
|
- // else if(stringsEqual(string, "quit", 5))
|
|
|
- // break;
|
|
|
-
|
|
|
- if(model->turnState == 0 && model->squareSelected != 255) {
|
|
|
- model->squareFrom = model->squareSelected;
|
|
|
- model->turnState = 1;
|
|
|
- } else if(model->turnState == 1 && model->squareSelected != 255) {
|
|
|
- model->squareTo = model->squareSelected;
|
|
|
- model->turnState = 2;
|
|
|
- model->squareSelectedLast = model->squareSelected;
|
|
|
- //model->squareSelected = 255;
|
|
|
- }
|
|
|
|
|
|
- if(model->turnState == 1 && model->squareFrom != 255) {
|
|
|
- if((model->game.board[model->squareFrom] != '.') &&
|
|
|
- (SCL_pieceIsWhite(model->game.board[model->squareFrom]) ==
|
|
|
- SCL_boardWhitesTurn(model->game.board))) {
|
|
|
- SCL_boardGetMoves(model->game.board, model->squareFrom, model->moveHighlight);
|
|
|
+ } else {
|
|
|
+ char movePromote = 'q';
|
|
|
+
|
|
|
+ if(flipchess_isPlayerTurn(model)) {
|
|
|
+ // if(stringsEqual(string, "undo", 5))
|
|
|
+ // moveType = FlipChessStatusMoveUndo;
|
|
|
+ // else if(stringsEqual(string, "quit", 5))
|
|
|
+ // break;
|
|
|
+
|
|
|
+ if(model->turnState == 0 && model->squareSelected != 255) {
|
|
|
+ model->squareFrom = model->squareSelected;
|
|
|
+ model->turnState = 1;
|
|
|
+ } else if(model->turnState == 1 && model->squareSelected != 255) {
|
|
|
+ model->squareTo = model->squareSelected;
|
|
|
+ model->turnState = 2;
|
|
|
+ model->squareSelectedLast = model->squareSelected;
|
|
|
+ //model->squareSelected = 255;
|
|
|
}
|
|
|
- } else if(model->turnState == 2) {
|
|
|
- if(SCL_squareSetContains(model->moveHighlight, model->squareTo)) {
|
|
|
- moveType = FlipChessStatusMovePlayer;
|
|
|
+
|
|
|
+ if(model->turnState == 1 && model->squareFrom != 255) {
|
|
|
+ if((model->game.board[model->squareFrom] != '.') &&
|
|
|
+ (SCL_pieceIsWhite(model->game.board[model->squareFrom]) ==
|
|
|
+ SCL_boardWhitesTurn(model->game.board))) {
|
|
|
+ SCL_boardGetMoves(model->game.board, model->squareFrom, model->moveHighlight);
|
|
|
+ }
|
|
|
+ } else if(model->turnState == 2) {
|
|
|
+ if(SCL_squareSetContains(model->moveHighlight, model->squareTo)) {
|
|
|
+ moveType = FlipChessStatusMovePlayer;
|
|
|
+ }
|
|
|
+ model->turnState = 0;
|
|
|
+ SCL_squareSetClear(model->moveHighlight);
|
|
|
}
|
|
|
+
|
|
|
+ } else {
|
|
|
+ model->squareSelected = 255;
|
|
|
+ flipchess_makeAIMove(
|
|
|
+ model->game.board, &(model->squareFrom), &(model->squareTo), &movePromote, model);
|
|
|
+ moveType = FlipChessStatusMoveAI;
|
|
|
model->turnState = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(moveType == FlipChessStatusMovePlayer || moveType == FlipChessStatusMoveAI) {
|
|
|
+ flipchess_shiftMessages(model);
|
|
|
+
|
|
|
+ SCL_moveToString(
|
|
|
+ model->game.board,
|
|
|
+ model->squareFrom,
|
|
|
+ model->squareTo,
|
|
|
+ movePromote,
|
|
|
+ model->moveString);
|
|
|
+
|
|
|
+ SCL_gameMakeMove(&(model->game), model->squareFrom, model->squareTo, movePromote);
|
|
|
+
|
|
|
+ SCL_squareSetClear(model->moveHighlight);
|
|
|
+ SCL_squareSetAdd(model->moveHighlight, model->squareFrom);
|
|
|
+ SCL_squareSetAdd(model->moveHighlight, model->squareTo);
|
|
|
+ } else if(moveType == FlipChessStatusMoveUndo) {
|
|
|
+ flipchess_shiftMessages(model);
|
|
|
+
|
|
|
+ if(model->paramPlayerW != 0 || model->paramPlayerB != 0)
|
|
|
+ SCL_gameUndoMove(&(model->game));
|
|
|
+
|
|
|
+ SCL_gameUndoMove(&(model->game));
|
|
|
SCL_squareSetClear(model->moveHighlight);
|
|
|
}
|
|
|
|
|
|
- } else {
|
|
|
- model->squareSelected = 255;
|
|
|
- flipchess_makeAIMove(
|
|
|
- model->game.board, &(model->squareFrom), &(model->squareTo), &movePromote, model);
|
|
|
- moveType = FlipChessStatusMoveAI;
|
|
|
- model->turnState = 0;
|
|
|
- }
|
|
|
+ switch(model->game.state) {
|
|
|
+ case SCL_GAME_STATE_WHITE_WIN:
|
|
|
+ model->msg = "white wins";
|
|
|
+ model->paramExit = FlipChessStatusReturn;
|
|
|
+ break;
|
|
|
|
|
|
- if(moveType == FlipChessStatusMovePlayer || moveType == FlipChessStatusMoveAI) {
|
|
|
- flipchess_shiftMessages(model);
|
|
|
+ case SCL_GAME_STATE_BLACK_WIN:
|
|
|
+ model->msg = "black wins";
|
|
|
+ model->paramExit = FlipChessStatusReturn;
|
|
|
+ break;
|
|
|
|
|
|
- SCL_moveToString(
|
|
|
- model->game.board, model->squareFrom, model->squareTo, movePromote, model->moveString);
|
|
|
+ case SCL_GAME_STATE_DRAW_STALEMATE:
|
|
|
+ model->msg = "stalemate";
|
|
|
+ model->paramExit = FlipChessStatusReturn;
|
|
|
+ break;
|
|
|
|
|
|
- SCL_gameMakeMove(&(model->game), model->squareFrom, model->squareTo, movePromote);
|
|
|
+ case SCL_GAME_STATE_DRAW_REPETITION:
|
|
|
+ model->msg = "draw-repetition";
|
|
|
+ model->paramExit = FlipChessStatusReturn;
|
|
|
+ break;
|
|
|
|
|
|
- SCL_squareSetClear(model->moveHighlight);
|
|
|
- SCL_squareSetAdd(model->moveHighlight, model->squareFrom);
|
|
|
- SCL_squareSetAdd(model->moveHighlight, model->squareTo);
|
|
|
- } else if(moveType == FlipChessStatusMoveUndo) {
|
|
|
- flipchess_shiftMessages(model);
|
|
|
+ case SCL_GAME_STATE_DRAW_DEAD:
|
|
|
+ model->msg = "draw-dead pos.";
|
|
|
+ model->paramExit = FlipChessStatusReturn;
|
|
|
+ break;
|
|
|
|
|
|
- if(model->paramPlayerW != 0 || model->paramPlayerB != 0) SCL_gameUndoMove(&(model->game));
|
|
|
+ case SCL_GAME_STATE_DRAW:
|
|
|
+ model->msg = "draw";
|
|
|
+ model->paramExit = FlipChessStatusReturn;
|
|
|
+ break;
|
|
|
|
|
|
- SCL_gameUndoMove(&(model->game));
|
|
|
- SCL_squareSetClear(model->moveHighlight);
|
|
|
- }
|
|
|
+ case SCL_GAME_STATE_DRAW_50:
|
|
|
+ model->msg = "draw-50 moves";
|
|
|
+ model->paramExit = FlipChessStatusReturn;
|
|
|
+ break;
|
|
|
|
|
|
- switch(model->game.state) {
|
|
|
- case SCL_GAME_STATE_WHITE_WIN:
|
|
|
- model->msg = "white wins";
|
|
|
- model->paramExit = FlipChessStatusReturn;
|
|
|
- break;
|
|
|
-
|
|
|
- case SCL_GAME_STATE_BLACK_WIN:
|
|
|
- model->msg = "black wins";
|
|
|
- model->paramExit = FlipChessStatusReturn;
|
|
|
- break;
|
|
|
-
|
|
|
- case SCL_GAME_STATE_DRAW_STALEMATE:
|
|
|
- model->msg = "draw (stalemate)";
|
|
|
- model->paramExit = FlipChessStatusReturn;
|
|
|
- break;
|
|
|
-
|
|
|
- case SCL_GAME_STATE_DRAW_REPETITION:
|
|
|
- model->msg = "draw (repetition)";
|
|
|
- model->paramExit = FlipChessStatusReturn;
|
|
|
- break;
|
|
|
-
|
|
|
- case SCL_GAME_STATE_DRAW_DEAD:
|
|
|
- model->msg = "draw (dead pos.)";
|
|
|
- model->paramExit = FlipChessStatusReturn;
|
|
|
- break;
|
|
|
-
|
|
|
- case SCL_GAME_STATE_DRAW:
|
|
|
- model->msg = "draw";
|
|
|
- model->paramExit = FlipChessStatusReturn;
|
|
|
- break;
|
|
|
-
|
|
|
- case SCL_GAME_STATE_DRAW_50:
|
|
|
- model->msg = "draw (50 moves)";
|
|
|
- model->paramExit = FlipChessStatusReturn;
|
|
|
- break;
|
|
|
-
|
|
|
- default:
|
|
|
- if(model->game.ply > 0) {
|
|
|
- model->msg =
|
|
|
- (SCL_boardWhitesTurn(model->game.board) ? "black played" : "white played");
|
|
|
-
|
|
|
- uint8_t s0, s1;
|
|
|
- char p;
|
|
|
-
|
|
|
- SCL_recordGetMove(model->game.record, model->game.ply - 1, &s0, &s1, &p);
|
|
|
- SCL_moveToString(model->game.board, s0, s1, p, model->moveString);
|
|
|
+ default:
|
|
|
+ if(model->game.ply > 0) {
|
|
|
+ const uint8_t whitesTurn = SCL_boardWhitesTurn(model->game.board);
|
|
|
+
|
|
|
+ if(SCL_boardCheck(model->game.board, whitesTurn)) {
|
|
|
+ model->msg = (whitesTurn ? "black: check!" : "white: check!");
|
|
|
+ } else {
|
|
|
+ model->msg = (whitesTurn ? "black played" : "white played");
|
|
|
+ }
|
|
|
+
|
|
|
+ uint8_t s0, s1;
|
|
|
+ char p;
|
|
|
+
|
|
|
+ SCL_recordGetMove(model->game.record, model->game.ply - 1, &s0, &s1, &p);
|
|
|
+ SCL_moveToString(model->game.board, s0, s1, p, model->moveString);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ model->paramExit = moveType;
|
|
|
}
|
|
|
- break;
|
|
|
- model->paramExit = moveType;
|
|
|
}
|
|
|
|
|
|
model->thinking = 0;
|
|
|
@@ -681,9 +691,9 @@ void flipchess_scene_1_enter(void* context) {
|
|
|
}
|
|
|
|
|
|
// if return status, return from scene immediately
|
|
|
- if(init == FlipChessStatusReturn) {
|
|
|
- instance->callback(FlipChessCustomEventScene1Back, instance->context);
|
|
|
- }
|
|
|
+ // if(init == FlipChessStatusReturn) {
|
|
|
+ // instance->callback(FlipChessCustomEventScene1Back, instance->context);
|
|
|
+ // }
|
|
|
},
|
|
|
true);
|
|
|
}
|
|
|
@@ -714,4 +724,4 @@ void flipchess_scene_1_free(FlipChessScene1* instance) {
|
|
|
View* flipchess_scene_1_get_view(FlipChessScene1* instance) {
|
|
|
furi_assert(instance);
|
|
|
return instance->view;
|
|
|
-}
|
|
|
+}
|