summaryrefslogtreecommitdiffstats
path: root/mbbsd/chc_draw.c
diff options
context:
space:
mode:
Diffstat (limited to 'mbbsd/chc_draw.c')
-rw-r--r--mbbsd/chc_draw.c187
1 files changed, 187 insertions, 0 deletions
diff --git a/mbbsd/chc_draw.c b/mbbsd/chc_draw.c
new file mode 100644
index 00000000..b3bd216f
--- /dev/null
+++ b/mbbsd/chc_draw.c
@@ -0,0 +1,187 @@
+/* $Id: chc_draw.c,v 1.1 2002/03/07 15:13:48 in2 Exp $ */
+#include <stdio.h>
+#include <sys/types.h>
+#include "config.h"
+#include "pttstruct.h"
+#include "common.h"
+#include "proto.h"
+
+#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
+
+extern char chc_warnmsg[64], *chc_mateid;
+extern rc_t chc_from, chc_to, chc_select;
+extern int chc_selected, chc_my, chc_turn, chc_firststep;
+extern int chc_lefttime;
+extern int chc_hiswin, chc_hislose, chc_histie;
+
+static char *turn_str[2] = {"黑的", "紅的"};
+
+static char *num_str[10] = {
+ "", "一", "二", "三", "四", "五", "六", "七", "八", "九"
+};
+
+static char *chess_str[2][8] = {
+ /* 0 1 2 3 4 5 6 7 */
+ {" ", "將", "士", "象", "車", "馬", "包", "卒"},
+ {" ", "帥", "仕", "相", "車", "傌", "炮", "兵"}
+};
+
+static char *chess_brd[BRD_ROW * 2 - 1] = {
+ /*0 1 2 3 4 5 6 7 8*/
+ "┌─┬─┬─┬─┬─┬─┬─┬─┐", /* 0 */
+ "│ │ │ │\│/│ │ │ │",
+ "├─┼─┼─┼─┼─┼─┼─┼─┤", /* 1 */
+ "│ │ │ │/│\│ │ │ │",
+ "├─┼─┼─┼─┼─┼─┼─┼─┤", /* 2 */
+ "│ │ │ │ │ │ │ │ │",
+ "├─┼─┼─┼─┼─┼─┼─┼─┤", /* 3 */
+ "│ │ │ │ │ │ │ │ │",
+ "├─┴─┴─┴─┴─┴─┴─┴─┤", /* 4 */
+ "│ 楚 河 漢 界 │",
+ "├─┬─┬─┬─┬─┬─┬─┬─┤", /* 5 */
+ "│ │ │ │ │ │ │ │ │",
+ "├─┼─┼─┼─┼─┼─┼─┼─┤", /* 6 */
+ "│ │ │ │ │ │ │ │ │",
+ "├─┼─┼─┼─┼─┼─┼─┼─┤", /* 7 */
+ "│ │ │ │\│/│ │ │ │",
+ "├─┼─┼─┼─┼─┼─┼─┼─┤", /* 8 */
+ "│ │ │ │/│\│ │ │ │",
+ "└─┴─┴─┴─┴─┴─┴─┴─┘" /* 9 */
+};
+
+static char *hint_str[] = {
+ " q 認輸離開",
+ " p 要求和棋",
+ "方向鍵 移動遊標",
+ "Enter 選擇/移動"
+};
+
+void chc_movecur(int r, int c) {
+ move(r * 2 + 3, c * 4 + 4);
+}
+
+#define BLACK_COLOR "\033[1;36m"
+#define RED_COLOR "\033[1;31m"
+#define BLACK_REVERSE "\033[1;37;46m"
+#define RED_REVERSE "\033[1;37;41m"
+#define TURN_COLOR "\033[1;33m"
+
+static void showstep(board_t board) {
+ int turn, fc, tc, eatten;
+ char *dir;
+
+ turn = CHE_O(board[chc_from.r][chc_from.c]);
+ fc = (turn == (chc_my ^ 1) ? chc_from.c + 1 : 9 - chc_from.c);
+ tc = (turn == (chc_my ^ 1) ? chc_to.c + 1 : 9 - chc_to.c);
+ if(chc_from.r == chc_to.r)
+ dir = "平";
+ else {
+ if(chc_from.c == chc_to.c)
+ tc = chc_from.r - chc_to.r;
+ if(tc < 0) tc = -tc;
+
+ if((turn == (chc_my ^ 1) && chc_to.r > chc_from.r) ||
+ (turn == chc_my && chc_to.r < chc_from.r))
+ dir = "進";
+ else
+ dir = "退";
+ }
+ prints("%s%s%s%s%s",
+ turn == 0 ? BLACK_COLOR : RED_COLOR,
+ chess_str[turn][CHE_P(board[chc_from.r][chc_from.c])],
+ num_str[fc], dir, num_str[tc]);
+ eatten = board[chc_to.r][chc_to.c];
+ if(eatten)
+ prints(": %s%s",
+ CHE_O(eatten) == 0 ? BLACK_COLOR : RED_COLOR,
+ chess_str[CHE_O(eatten)][CHE_P(eatten)]);
+ prints("\033[m");
+}
+
+extern userec_t cuser;
+
+void chc_drawline(board_t board, int line) {
+ int i, j;
+
+ move(line, 0);
+ clrtoeol();
+ if(line == 0) {
+ prints("\033[1;46m 象棋對戰 \033[45m%30s VS %-30s\033[m",
+ cuser.userid, chc_mateid);
+ } else if(line >= 3 && line <= 21) {
+ outs(" ");
+ for(i = 0; i < 9; i++) {
+ j = board[RTL(line)][i];
+ if((line & 1) == 1 && j) {
+ if(chc_selected &&
+ chc_select.r == RTL(line) && chc_select.c == i)
+ prints("%s%s\033[m",
+ CHE_O(j) == 0 ? BLACK_REVERSE : RED_REVERSE,
+ chess_str[CHE_O(j)][CHE_P(j)]);
+ else
+ prints("%s%s\033[m",
+ CHE_O(j) == 0 ? BLACK_COLOR : RED_COLOR,
+ chess_str[CHE_O(j)][CHE_P(j)]);
+ } else
+ prints("%c%c", chess_brd[line - 3][i * 4],
+ chess_brd[line - 3][i * 4 + 1]);
+ if(i != 8)
+ prints("%c%c", chess_brd[line - 3][i * 4 + 2],
+ chess_brd[line - 3][i * 4 + 3]);
+ }
+ outs(" ");
+
+ if(line >= 3 && line < 3 + dim(hint_str)) {
+ outs(hint_str[line - 3]);
+ } else if(line == SIDE_ROW) {
+ prints("\033[1m你是%s%s\033[m",
+ chc_my == 0 ? BLACK_COLOR : RED_COLOR,
+ turn_str[chc_my]);
+ } else if(line == TURN_ROW) {
+ prints("%s%s\033[m",
+ TURN_COLOR,
+ chc_my == chc_turn ? "輪到你下棋了" : "等待對方下棋");
+ } else if(line == STEP_ROW && !chc_firststep) {
+ showstep(board);
+ } else if(line == TIME_ROW) {
+ prints("剩餘時間 %d:%02d", chc_lefttime / 60, chc_lefttime % 60);
+ } else if(line == WARN_ROW) {
+ outs(chc_warnmsg);
+ } else if(line == MYWIN_ROW) {
+ prints("\033[1;33m%12.12s "
+ "\033[1;31m%2d\033[37m勝 "
+ "\033[34m%2d\033[37m敗 "
+ "\033[36m%2d\033[37m和\033[m",
+ cuser.userid,
+ cuser.chc_win, cuser.chc_lose - 1, cuser.chc_tie);
+ } else if(line == HISWIN_ROW) {
+ prints("\033[1;33m%12.12s "
+ "\033[1;31m%2d\033[37m勝 "
+ "\033[34m%2d\033[37m敗 "
+ "\033[36m%2d\033[37m和\033[m",
+ chc_mateid,
+ chc_hiswin, chc_hislose - 1, chc_histie);
+ }
+ } else if(line == 2 || line == 22) {
+ outs(" ");
+ if(line == 2)
+ for(i = 1; i <= 9; i++)
+ prints("%s ", num_str[i]);
+ else
+ for(i = 9; i >= 1; i--)
+ prints("%s ", num_str[i]);
+ }
+}
+
+void chc_redraw(board_t board) {
+ int i;
+
+ for(i = 0; i <= 22; i++)
+ chc_drawline(board, i);
+}