summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorscw <scw@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2005-08-20 12:11:10 +0800
committerscw <scw@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2005-08-20 12:11:10 +0800
commit6976aea4703c91fbfe7fd6c3a6a1094ae98e2002 (patch)
treea4304fb922243842eacfcb6cd7c3f0939e23d904
parentef982e5c13120616dbfb32552d74deba348c27a1 (diff)
downloadpttbbs-6976aea4703c91fbfe7fd6c3a6a1094ae98e2002.tar
pttbbs-6976aea4703c91fbfe7fd6c3a6a1094ae98e2002.tar.gz
pttbbs-6976aea4703c91fbfe7fd6c3a6a1094ae98e2002.tar.bz2
pttbbs-6976aea4703c91fbfe7fd6c3a6a1094ae98e2002.tar.lz
pttbbs-6976aea4703c91fbfe7fd6c3a6a1094ae98e2002.tar.xz
pttbbs-6976aea4703c91fbfe7fd6c3a6a1094ae98e2002.tar.zst
pttbbs-6976aea4703c91fbfe7fd6c3a6a1094ae98e2002.zip
Wrong winner on rule-violating step.
git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@3066 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
-rw-r--r--include/chess.h2
-rw-r--r--mbbsd/chc.c8
-rw-r--r--mbbsd/chess.c14
-rw-r--r--mbbsd/gomo.c6
4 files changed, 20 insertions, 10 deletions
diff --git a/include/chess.h b/include/chess.h
index 19ac4f61..8a151ace 100644
--- a/include/chess.h
+++ b/include/chess.h
@@ -130,7 +130,7 @@ typedef struct ChessActions {
int (*select) (ChessInfo* info, rc_t location,
ChessGameResult* result);
void (*prepare_step)(ChessInfo* info, const void* step);
- int (*apply_step) (void* board, const void* step);
+ ChessGameResult (*apply_step) (void* board, const void* step);
void (*drawstep) (ChessInfo* info, const void* step);
/* ending */
diff --git a/mbbsd/chc.c b/mbbsd/chc.c
index f1339e14..45c2bb47 100644
--- a/mbbsd/chc.c
+++ b/mbbsd/chc.c
@@ -44,7 +44,7 @@ static void chc_movecur(int r, int c);
static void chc_prepare_play(ChessInfo* info);
static int chc_select(ChessInfo* info, rc_t scrloc, ChessGameResult* result);
static void chc_prepare_step(ChessInfo* info, const void* step);
-static int chc_movechess(board_t board, const drc_t* move);
+static ChessGameResult chc_movechess(board_t board, const drc_t* move);
static void chc_drawstep(ChessInfo* info, const drc_t* move);
static void chc_gameend(ChessInfo* info, ChessGameResult result);
static void chc_genlog(ChessInfo* info, FILE* fp, ChessGameResult result);
@@ -105,7 +105,7 @@ static const ChessActions chc_actions = {
&chc_prepare_play,
&chc_select,
&chc_prepare_step,
- (int (*) (void*, const void*)) &chc_movechess,
+ (ChessGameResult (*) (void*, const void*)) &chc_movechess,
(void (*)(ChessInfo*, const void*)) &chc_drawstep,
&chc_gameend,
&chc_genlog
@@ -383,7 +383,7 @@ chc_prepare_step(ChessInfo* info, const void* step)
&move->from, &move->to, info->last_movestr);
}
-static int
+static ChessGameResult
chc_movechess(board_t board, const drc_t* move)
{
int end = (CHE_P(board[move->to.r][move->to.c]) == KIND_K);
@@ -391,7 +391,7 @@ chc_movechess(board_t board, const drc_t* move)
board[move->to.r][move->to.c] = board[move->from.r][move->from.c];
board[move->from.r][move->from.c] = 0;
- return end;
+ return end ? CHESS_RESULT_WIN : CHESS_RESULT_CONTINUE;
}
static void
diff --git a/mbbsd/chess.c b/mbbsd/chess.c
index 226feadf..55199d9c 100644
--- a/mbbsd/chess.c
+++ b/mbbsd/chess.c
@@ -561,8 +561,18 @@ ChessPlayFuncHis(ChessInfo* info)
ChessDrawLine(info, CHESS_DRAWING_WARN_ROW);
} else if (result == CHESS_STEP_NORMAL) {
info->actions->prepare_step(info, &info->step_tmp);
- if (info->actions->apply_step(info->board, &info->step_tmp))
- game_result = CHESS_RESULT_LOST;
+ switch (info->actions->apply_step(info->board, &info->step_tmp)) {
+ case CHESS_RESULT_LOST:
+ game_result = CHESS_RESULT_WIN;
+ break;
+
+ case CHESS_RESULT_WIN:
+ game_result = CHESS_RESULT_LOST;
+ break;
+
+ default:
+ game_result = CHESS_RESULT_CONTINUE;
+ }
endturn = 1;
info->hepass = 0;
ChessStepMade(info, 1);
diff --git a/mbbsd/gomo.c b/mbbsd/gomo.c
index 0e30bd88..86a03463 100644
--- a/mbbsd/gomo.c
+++ b/mbbsd/gomo.c
@@ -34,7 +34,7 @@ static void gomo_prepare_play(ChessInfo* info);
static int gomo_select(ChessInfo* info, rc_t location,
ChessGameResult* result);
static void gomo_prepare_step(ChessInfo* info, const gomo_step_t* step);
-static int gomo_apply_step(board_t board, const gomo_step_t* step);
+static ChessGameResult gomo_apply_step(board_t board, const gomo_step_t* step);
static void gomo_drawstep(ChessInfo* info, const gomo_step_t* step);
static void gomo_gameend(ChessInfo* info, ChessGameResult result);
static void gomo_genlog(ChessInfo* info, FILE* fp, ChessGameResult result);
@@ -360,7 +360,7 @@ gomo_prepare_step(ChessInfo* info, const gomo_step_t* step)
}
}
-static int
+static ChessGameResult
gomo_apply_step(board_t board, const gomo_step_t* step)
{
int style;
@@ -368,7 +368,7 @@ gomo_apply_step(board_t board, const gomo_step_t* step)
style = getstyle(board, step->loc.r, step->loc.c,
step->color, step->color == BLK);
board[step->loc.r][step->loc.c] = step->color;
- return (chkwin(style, step->color == BLK) != CHESS_RESULT_CONTINUE);
+ return chkwin(style, step->color == BLK);
}
static void