summaryrefslogtreecommitdiffstats
path: root/include/chess.h
diff options
context:
space:
mode:
authorscw <scw@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2005-08-08 04:21:12 +0800
committerscw <scw@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2005-08-08 04:21:12 +0800
commitf9f4c71a8beec3d7c2931a266d3df20d00abaeba (patch)
treee4ca0bb95cc1a5bbd1dd0724ba73348112c7b604 /include/chess.h
parentb3bb4b2108f3c2d60bb005fd63dafc5e8a72045a (diff)
downloadpttbbs-f9f4c71a8beec3d7c2931a266d3df20d00abaeba.tar
pttbbs-f9f4c71a8beec3d7c2931a266d3df20d00abaeba.tar.gz
pttbbs-f9f4c71a8beec3d7c2931a266d3df20d00abaeba.tar.bz2
pttbbs-f9f4c71a8beec3d7c2931a266d3df20d00abaeba.tar.lz
pttbbs-f9f4c71a8beec3d7c2931a266d3df20d00abaeba.tar.xz
pttbbs-f9f4c71a8beec3d7c2931a266d3df20d00abaeba.tar.zst
pttbbs-f9f4c71a8beec3d7c2931a266d3df20d00abaeba.zip
New chess framework
* Provides common parts of all chess games * Chinese chess fully ported * Improved watching * Leaving possibility to implement replaying !!!NOTE!!! Protocal not backward compatible, STOP ALL clients before upgrade. git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@3002 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
Diffstat (limited to 'include/chess.h')
-rw-r--r--include/chess.h175
1 files changed, 175 insertions, 0 deletions
diff --git a/include/chess.h b/include/chess.h
new file mode 100644
index 00000000..82b72a6e
--- /dev/null
+++ b/include/chess.h
@@ -0,0 +1,175 @@
+/* $Id$ */
+
+#ifndef INCLUDE_CHESS_H
+#define INCLUDE_CHESS_H
+
+#define CHESS_DRAWING_TIME_ROW 128
+#define CHESS_DRAWING_TURN_ROW 129
+#define CHESS_DRAWING_WARN_ROW 130
+#define CHESS_DRAWING_STEP_ROW 131
+#define CHESS_DRAWING_HELP_ROW 132
+
+#define CHESS_PHOTO_LINE 15
+#define CHESS_PHOTO_COLUMN (256 + 25)
+
+struct ChessBroadcastList;
+struct ChessActions;
+struct ChessConstants;
+
+#define const
+#define static
+#define private
+
+typedef struct {
+ char userid[IDLEN + 1];
+ int win;
+ int lose;
+ int tie;
+ unsigned short rating;
+ unsigned short orig_rating; // 原始 rating, 因為遊戲開始先算輸一場, rating 值就跑掉了
+} ChessUser;
+
+private typedef struct {
+ int used;
+ int size;
+ void *body;
+} ChessHistory;
+
+private typedef struct ChessBroadcastListNode {
+ int sock;
+ struct ChessBroadcastListNode *next;
+} ChessBroadcastListNode;
+
+private typedef struct ChessBroadcastList {
+ struct ChessBroadcastListNode head; /* dummy node */
+} ChessBroadcastList;
+
+
+typedef struct {
+ int limit_hand;
+ int limit_time;
+ int free_time;
+ enum {
+ CHESS_TIMEMODE_MULTIHAND, /* 限時限步 */
+ CHESS_TIMEMODE_COUNTING /* 讀秒 */
+ } time_mode;
+} ChessTimeLimit;
+
+typedef enum {
+ CHESS_MODE_VERSUS, /* 對奕 */
+ CHESS_MODE_WATCH, /* 觀棋 */
+ CHESS_MODE_PERSONAL, /* 打譜 */
+ CHESS_MODE_REPLAY /* 看譜 */
+} ChessGameMode;
+
+typedef enum {
+ CHESS_RESULT_CONTINUE,
+ CHESS_RESULT_WIN,
+ CHESS_RESULT_LOST,
+ CHESS_RESULT_TIE,
+ CHESS_RESULT_END /* watching or replaying */
+} ChessGameResult;
+
+typedef struct ChessInfo {
+ private const static
+ struct ChessActions* actions; /* vtable */
+ private const static
+ struct ChessConstants* constants;
+
+ rc_t cursor;
+
+ /* 計時用, [0] = mine, [1] = his */
+ int lefttime[2];
+ int lefthand[2]; /* 限時限步時用, = 0 表為自由時間或非限時限步模式 */
+ const ChessTimeLimit* timelimit;
+
+ const ChessGameMode mode;
+ const ChessUser user1;
+ const ChessUser user2;
+ const char my; /* 我方顏色 */
+
+ char turn;
+ char ipass, hepass;
+ char warnmsg[64];
+ char last_movestr[36];
+ char *photo;
+
+ void *board;
+ void *tag;
+
+ private int sock;
+ private ChessHistory history;
+ private ChessBroadcastList broadcast_list;
+ private ChessGameResult (*play_func[2])(struct ChessInfo* info);
+
+ private int current_step; /* used by watch and replay */
+ private char step_tmp[0];
+} ChessInfo;
+
+#undef const
+#undef static
+#undef private
+
+typedef struct ChessActions {
+ /* initial */
+ void (*init_user) (const userec_t* rec, ChessUser* user);
+ void (*init_board) (const ChessInfo* info, void* board);
+
+ /* playing */
+ void (*drawline) (const ChessInfo* info, int line);
+ void (*movecur) (int r, int c);
+ void (*prepare_play)(ChessInfo* info);
+ 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);
+ void (*drawstep) (ChessInfo* info, const void* step);
+
+ /* ending */
+ void (*gameend) (ChessInfo* info, ChessGameResult result);
+ void (*genlog) (ChessInfo* info, FILE* fp, ChessGameResult result);
+} ChessActions;
+
+typedef struct ChessConstants {
+ int step_entry_size;
+ int traditional_timeout;
+ int board_height;
+ int board_width;
+ char *photo_file_name;
+ char *log_board;
+ char *turn_color[2];
+ char *turn_str[2];
+} ChessConstants;
+
+typedef enum {
+ CHESS_STEP_NORMAL, CHESS_STEP_PASS,
+ CHESS_STEP_DROP, CHESS_STEP_FAILURE,
+ CHESS_STEP_NOP /* for wake up */
+} ChessStepType;
+
+
+int ChessTimeCountDown(ChessInfo* info, int who, int length);
+void ChessStepMade(ChessInfo* info, int who);
+
+ChessStepType ChessStepReceive(ChessInfo* info, void* step);
+int ChessStepSendOpposite(ChessInfo* info, const void* step);
+void ChessStepBroadcast(ChessInfo* info, const void* step);
+int ChessStepSend(ChessInfo* info, const void* step);
+
+void ChessHistoryAppend(ChessInfo* info, void* step);
+const void* ChessHistoryRetrieve(ChessInfo* info, int n);
+
+void ChessPlay(ChessInfo* info);
+int ChessStartGame(char func_char, int sig, const char* title);
+int ChessWatchGame(void (*play)(int, ChessGameMode),
+ int game, const char* title);
+
+ChessInfo* NewChessInfo(const ChessActions* actions,
+ const ChessConstants* constants, int sock, ChessGameMode mode);
+void DeleteChessInfo(ChessInfo* info);
+
+void ChessEstablishRequest(int sock);
+void ChessAcceptingRequest(int sock);
+void ChessShowRequest(void);
+
+#endif /* INCLUDE_CHESS_H */