summaryrefslogtreecommitdiffstats
path: root/mbbsd/chc_play.c
diff options
context:
space:
mode:
Diffstat (limited to 'mbbsd/chc_play.c')
-rw-r--r--mbbsd/chc_play.c312
1 files changed, 0 insertions, 312 deletions
diff --git a/mbbsd/chc_play.c b/mbbsd/chc_play.c
deleted file mode 100644
index 36992ae8..00000000
--- a/mbbsd/chc_play.c
+++ /dev/null
@@ -1,312 +0,0 @@
-/* $Id$ */
-#include "bbs.h"
-typedef int (*play_func_t) (int, chcusr_t *, chcusr_t *, board_t, board_t);
-
-static int chc_ipass = 0, chc_hepass = 0;
-
-#define CHC_TIMEOUT 300
-#define SIDE_ROW 10
-#define TURN_ROW 11
-#define STEP_ROW 12
-#define TIME_ROW 13
-#define WARN_ROW 15
-#define MYWIN_ROW 17
-#define HISWIN_ROW 18
-
-static void
-chcusr_put(userec_t *userec, chcusr_t *user)
-{
- userec->chc_win = user->win;
- userec->chc_lose = user->lose;
- userec->chc_tie = user->tie;
-}
-
-static void
-chcusr_get(userec_t *userec, chcusr_t *user)
-{
- strlcpy(user->userid, userec->userid, sizeof(user->userid));
- user->win = userec->chc_win;
- user->lose = userec->chc_lose;
- user->tie = userec->chc_tie;
-}
-
-static int
-hisplay(int s, chcusr_t *user1, chcusr_t *user2, board_t board, board_t tmpbrd)
-{
- int start_time;
- int endgame = 0, endturn = 0;
-
- start_time = now;
- while (!endturn) {
- chc_lefttime = CHC_TIMEOUT - (now - start_time);
- if (chc_lefttime < 0) {
- chc_lefttime = 0;
-
- /* to make him break out igetkey() */
- chc_from.r = -2;
- chc_sendmove(s);
- }
- chc_drawline(board, user1, user2, TIME_ROW);
- move(1, 0);
- oflush();
- switch (igetkey()) {
- case 'q':
- endgame = 2;
- endturn = 1;
- break;
- case 'p':
- if (chc_hepass) {
- chc_from.r = -1;
- chc_sendmove(s);
- endgame = 3;
- endturn = 1;
- }
- break;
- case I_OTHERDATA:
- if (chc_recvmove(s)) { /* disconnect */
- endturn = 1;
- endgame = 1;
- } else {
- if (chc_from.r == -1) {
- chc_hepass = 1;
- strlcpy(chc_warnmsg, "\033[1;33m要求和局!\033[m", sizeof(chc_warnmsg));
- chc_drawline(board, user1, user2, WARN_ROW);
- } else {
- chc_from.r = 9 - chc_from.r, chc_from.c = 8 - chc_from.c;
- chc_to.r = 9 - chc_to.r, chc_to.c = 8 - chc_to.c;
- chc_cursor = chc_to;
- if (CHE_P(board[chc_to.r][chc_to.c]) == 1)
- endgame = 2;
- endturn = 1;
- chc_hepass = 0;
- chc_drawline(board, user1, user2, STEP_ROW);
- chc_movechess(board);
- chc_drawline(board, user1, user2, LTR(chc_from.r));
- chc_drawline(board, user1, user2, LTR(chc_to.r));
- }
- }
- break;
- }
- }
- return endgame;
-}
-
-static int
-myplay(int s, chcusr_t *user1, chcusr_t *user2, board_t board, board_t tmpbrd)
-{
- int ch, start_time;
- int endgame = 0, endturn = 0;
-
- chc_ipass = 0, chc_selected = 0;
- start_time = now;
- chc_lefttime = CHC_TIMEOUT - (now - start_time);
- bell();
- while (!endturn) {
- chc_drawline(board, user1, user2, TIME_ROW);
- chc_movecur(chc_cursor.r, chc_cursor.c);
- oflush();
- ch = igetkey();
- chc_lefttime = CHC_TIMEOUT - (now - start_time);
- if (chc_lefttime < 0)
- ch = 'q';
- switch (ch) {
- case I_OTHERDATA:
- if (chc_recvmove(s)) { /* disconnect */
- endgame = 1;
- endturn = 1;
- } else if (chc_from.r == -1 && chc_ipass) {
- endgame = 3;
- endturn = 1;
- }
- break;
- case KEY_UP:
- chc_cursor.r--;
- if (chc_cursor.r < 0)
- chc_cursor.r = BRD_ROW - 1;
- break;
- case KEY_DOWN:
- chc_cursor.r++;
- if (chc_cursor.r >= BRD_ROW)
- chc_cursor.r = 0;
- break;
- case KEY_LEFT:
- chc_cursor.c--;
- if (chc_cursor.c < 0)
- chc_cursor.c = BRD_COL - 1;
- break;
- case KEY_RIGHT:
- chc_cursor.c++;
- if (chc_cursor.c >= BRD_COL)
- chc_cursor.c = 0;
- break;
- case 'q':
- endgame = 2;
- endturn = 1;
- break;
- case 'p':
- chc_ipass = 1;
- chc_from.r = -1;
- chc_sendmove(s);
- strlcpy(chc_warnmsg, "\033[1;33m要求和棋!\033[m", sizeof(chc_warnmsg));
- chc_drawline(board, user1, user2, WARN_ROW);
- bell();
- break;
- case '\r':
- case '\n':
- case ' ':
- if (chc_selected) {
- if (chc_cursor.r == chc_select.r &&
- chc_cursor.c == chc_select.c) {
- chc_selected = 0;
- chc_drawline(board, user1, user2, LTR(chc_cursor.r));
- } else if (chc_canmove(board, chc_select, chc_cursor)) {
- if (CHE_P(board[chc_cursor.r][chc_cursor.c]) == 1)
- endgame = 1;
- chc_from = chc_select;
- chc_to = chc_cursor;
- if (!endgame) {
- memcpy(tmpbrd, board, sizeof(board_t));
- chc_movechess(tmpbrd);
- }
- if (endgame || !chc_iskfk(tmpbrd)) {
- chc_drawline(board, user1, user2, STEP_ROW);
- chc_movechess(board);
- chc_sendmove(s);
- chc_selected = 0;
- chc_drawline(board, user1, user2, LTR(chc_from.r));
- chc_drawline(board, user1, user2, LTR(chc_to.r));
- endturn = 1;
- } else {
- strlcpy(chc_warnmsg, "\033[1;33m不可以王見王\033[m", sizeof(chc_warnmsg));
- bell();
- chc_drawline(board, user1, user2, WARN_ROW);
- }
- }
- } else if (board[chc_cursor.r][chc_cursor.c] &&
- CHE_O(board[chc_cursor.r][chc_cursor.c]) == chc_turn) {
- chc_selected = 1;
- chc_select = chc_cursor;
- chc_drawline(board, user1, user2, LTR(chc_cursor.r));
- }
- break;
- }
- }
- return endgame;
-}
-
-static void
-mainloop(int s, chcusr_t *user1, chcusr_t *user2, board_t board, play_func_t play_func[2])
-{
- int endgame;
- board_t tmpbrd;
-
- play_func[chc_my] = myplay;
- if(s != 0)
- play_func[chc_my ^ 1] = hisplay;
- else /* 跟自己下棋 */
- play_func[chc_my ^ 1] = myplay;
-
- for (chc_turn = 1, endgame = 0; !endgame; chc_turn ^= 1) {
- chc_firststep = 0;
- chc_drawline(board, user1, user2, TURN_ROW);
- if (chc_ischeck(board, chc_turn)) {
- strlcpy(chc_warnmsg, "\033[1;31m將軍!\033[m", sizeof(chc_warnmsg));
- bell();
- } else
- chc_warnmsg[0] = 0;
- chc_drawline(board, user1, user2, WARN_ROW);
- endgame = play_func[chc_turn] (s, user1, user2, board, tmpbrd);
- }
-
- if (s != 0) {
- if (endgame == 1) {
- strlcpy(chc_warnmsg, "對方認輸了!", sizeof(chc_warnmsg));
- user1->win++;
- currutmp->chc_win++;
- } else if (endgame == 2) {
- strlcpy(chc_warnmsg, "你認輸了!", sizeof(chc_warnmsg));
- user1->lose++;
- currutmp->chc_lose++;
- } else {
- strlcpy(chc_warnmsg, "和棋", sizeof(chc_warnmsg));
- user1->tie++;
- currutmp->chc_tie++;
- }
- }
- else {
- strlcpy(chc_warnmsg, "結束打譜", sizeof(chc_warnmsg));
- }
- user1->lose--;
-
- // if not watching
- chcusr_put(&cuser, user1);
- passwd_update(usernum, &cuser);
- chc_drawline(board, user1, user2, WARN_ROW);
- bell();
- oflush();
-}
-
-static void
-chc_init(int s, chcusr_t *user1, chcusr_t *user2, board_t board)
-{
- userinfo_t *my = currutmp;
-
- setutmpmode(CHC);
- clear();
- chc_warnmsg[0] = 0;
- if(s != 0){ // XXX mateid -> user2
- chc_my = my->turn;
- chc_mateid = my->mateid;
- }
- else{
- chc_my = 1;
- chc_mateid = cuser.userid;
- }
- chc_firststep = 1;
- chc_init_board(board);
- chc_redraw(user1, user2, board);
- chc_cursor.r = 9, chc_cursor.c = 0;
- add_io(s, 0);
-
- if (my->turn)
- chc_recvmove(s);
-
- user1->lose++;
- // if not watching
- passwd_query(usernum, &xuser);
- chcusr_put(&xuser, user1);
- passwd_update(usernum, &xuser);
-
- if (!my->turn) {
- chc_sendmove(s);
- user2->lose++;
- }
- chc_redraw(user1, user2, board);
-}
-
-static void
-chc_userinit(char *userid1, char *userid2, chcusr_t *user1, chcusr_t *user2, play_func_t play_func[2])
-{
- getuser(userid1);
- chcusr_get(&xuser, user1);
-
- getuser(userid2);
- chcusr_get(&xuser, user2);
-}
-
-void
-chc(int s, int type)
-{
- board_t board;
- chcusr_t user1, user2;
- play_func_t play_func[2];
-
- chc_userinit(cuser.userid, currutmp->mateid, &user1, &user2, play_func);
- chc_init(s, &user1, &user2, board);
- mainloop(s, &user1, &user2, board, play_func);
- if (type == CHC_VERSUS)
- close(s);
- add_io(0, 0);
- if (chc_my)
- pressanykey();
-}