1.1 --- a/src/game.c Mon Mar 31 14:08:00 2014 +0200 1.2 +++ b/src/game.c Mon Mar 31 15:03:25 2014 +0200 1.3 @@ -35,12 +35,12 @@ 1.4 1.5 static const uint8_t boardx = 10, boardy = 10; 1.6 1.7 -static void draw_board(Board board, MoveListRoot *movelist, uint8_t mycolor) { 1.8 +static void draw_board(GameState *gamestate) { 1.9 1.10 for (uint8_t y = 0 ; y < 8 ; y++) { 1.11 for (uint8_t x = 0 ; x < 8 ; x++) { 1.12 - uint8_t col = board[y][x] & COLOR_MASK; 1.13 - uint8_t piece = board[y][x] & PIECE_MASK; 1.14 + uint8_t col = gamestate->board[y][x] & COLOR_MASK; 1.15 + uint8_t piece = gamestate->board[y][x] & PIECE_MASK; 1.16 char piecec; 1.17 if (piece) { 1.18 piecec = piece == PAWN ? 'P' : getpiecechr(piece); 1.19 @@ -51,8 +51,8 @@ 1.20 attrset((col == WHITE ? A_BOLD : A_DIM) | 1.21 COLOR_PAIR((y&1)==(x&1) ? COL_WB : COL_BW)); 1.22 1.23 - int cy = mycolor == WHITE ? boardy-y : boardy-7+y; 1.24 - int cx = mycolor == WHITE ? boardx+x*3 : boardx+21-x*3; 1.25 + int cy = gamestate->mycolor == WHITE ? boardy-y : boardy-7+y; 1.26 + int cx = gamestate->mycolor == WHITE ? boardx+x*3 : boardx+21-x*3; 1.27 mvaddch(cy, cx, ' '); 1.28 mvaddch(cy, cx+1, piecec); 1.29 mvaddch(cy, cx+2, ' '); 1.30 @@ -61,8 +61,8 @@ 1.31 1.32 attrset(A_NORMAL); 1.33 for (uint8_t i = 0 ; i < 8 ; i++) { 1.34 - int x = mycolor == WHITE ? boardx+i*3+1 : boardx+22-i*3; 1.35 - int y = mycolor == WHITE ? boardy-i : boardy-7+i; 1.36 + int x = gamestate->mycolor == WHITE ? boardx+i*3+1 : boardx+22-i*3; 1.37 + int y = gamestate->mycolor == WHITE ? boardy-i : boardy-7+i; 1.38 mvaddch(boardy+1, x, 'a'+i); 1.39 mvaddch(y, boardx-2, '1'+i); 1.40 } 1.41 @@ -72,14 +72,14 @@ 1.42 uint8_t logy = 0; 1.43 const uint8_t logx = boardx + 30; 1.44 int logi = 1; 1.45 - MoveList *logelem = movelist->first; 1.46 + MoveList *logelem = gamestate->movelist; 1.47 1.48 while (logelem) { 1.49 logi++; 1.50 if (logi % 2 == 0) { 1.51 if ((logi - 2) % 4 == 0) { 1.52 logy++; 1.53 - wmove(tchess_window, logy, logx); 1.54 + move(logy, logx); 1.55 } 1.56 printw("%d. ", logi / 2); 1.57 } 1.58 @@ -108,15 +108,14 @@ 1.59 } 1.60 1.61 1.62 -static int sendmove(Board board, MoveListRoot *movelist, 1.63 - uint8_t mycolor, int opponent) { 1.64 +static int sendmove(GameState *gamestate, int opponent) { 1.65 1.66 const size_t buflen = 8; 1.67 char movestr[buflen]; 1.68 _Bool remisrejected = FALSE; 1.69 uint8_t code; 1.70 1.71 - int inputy = getmaxy(tchess_window) - 6; 1.72 + int inputy = getmaxy(stdscr) - 6; 1.73 while (1) { 1.74 move(inputy, 0); 1.75 if (remisrejected) { 1.76 @@ -156,7 +155,7 @@ 1.77 } 1.78 } else { 1.79 Move move; 1.80 - int eval_result = eval_move(board, mycolor, movestr, &move); 1.81 + int eval_result = eval_move(gamestate, movestr, &move); 1.82 switch (eval_result) { 1.83 case VALID_MOVE_SYNTAX: 1.84 net_send_data(opponent, NETCODE_MOVE, &move, sizeof(Move)); 1.85 @@ -166,8 +165,7 @@ 1.86 if (code == NETCODE_DECLINE) { 1.87 printw("Invalid move."); 1.88 } else { 1.89 - apply_move(board, &move); 1.90 - addmove(movelist, &move); 1.91 + apply_move(gamestate, &move); 1.92 if (move.checkmate) { 1.93 printw("Checkmate!"); 1.94 clrtoeol(); 1.95 @@ -194,9 +192,9 @@ 1.96 } 1.97 } 1.98 1.99 -static int recvmove(Board board, MoveListRoot *movelist, int opponent) { 1.100 +static int recvmove(GameState *gamestate, int opponent) { 1.101 1.102 - int inputy = getmaxy(tchess_window) - 6; 1.103 + int inputy = getmaxy(stdscr) - 6; 1.104 while (1) { 1.105 move(inputy, 0); 1.106 printw("Awaiting opponent move..."); 1.107 @@ -225,9 +223,8 @@ 1.108 break; 1.109 case NETCODE_MOVE: 1.110 net_recieve_data(opponent, &move, sizeof(Move)); 1.111 - if (validate_move(board, &move)) { 1.112 - apply_move(board, &move); 1.113 - addmove(movelist, &move); 1.114 + if (validate_move(gamestate, &move)) { 1.115 + apply_move(gamestate, &move); 1.116 if (move.check) { 1.117 net_send_code(opponent, NETCODE_CHECK); 1.118 } else if (move.checkmate) { 1.119 @@ -243,40 +240,12 @@ 1.120 } 1.121 } 1.122 1.123 -void freemovelist(MoveListRoot* list) { 1.124 - MoveList *elem; 1.125 - elem = list->first; 1.126 - while (elem) { 1.127 - MoveList *cur = elem; 1.128 - elem = elem->next; 1.129 - free(cur); 1.130 - }; 1.131 - free(list); 1.132 -} 1.133 - 1.134 -void addmove(MoveListRoot* list, Move *move) { 1.135 - MoveList *elem = malloc(sizeof(MoveList)); 1.136 - elem->next = NULL; 1.137 - elem->move = *move; 1.138 - 1.139 - if (list->last) { 1.140 - list->last->next = elem; 1.141 - list->last = elem; 1.142 - } else { 1.143 - list->first = list->last = elem; 1.144 - } 1.145 -} 1.146 - 1.147 void game_start(Settings *settings, int opponent) { 1.148 _Bool myturn = is_server(settings) == 1.149 (settings->gameinfo.servercolor == WHITE); 1.150 - uint8_t mycolor = myturn ? WHITE:BLACK; 1.151 1.152 - _Bool running; 1.153 - 1.154 - MoveListRoot* movelist = calloc(1, sizeof(MoveListRoot)); 1.155 - 1.156 - Board board = { 1.157 + GameState gamestate; 1.158 + Board initboard = { 1.159 {WROOK, WKNIGHT, WBISHOP, WQUEEN, WKING, WBISHOP, WKNIGHT, WROOK}, 1.160 {WPAWN, WPAWN, WPAWN, WPAWN, WPAWN, WPAWN, WPAWN, WPAWN}, 1.161 {0, 0, 0, 0, 0, 0, 0, 0}, 1.162 @@ -286,22 +255,26 @@ 1.163 {BPAWN, BPAWN, BPAWN, BPAWN, BPAWN, BPAWN, BPAWN, BPAWN}, 1.164 {BROOK, BKNIGHT, BBISHOP, BQUEEN, BKING, BBISHOP, BKNIGHT, BROOK} 1.165 }; 1.166 + memcpy(gamestate.board, initboard, sizeof(Board)); 1.167 + gamestate.mycolor = myturn ? WHITE:BLACK; 1.168 + gamestate.movelist = gamestate.lastmove = NULL; 1.169 1.170 + _Bool running; 1.171 do { 1.172 clear(); 1.173 - draw_board(board, movelist, mycolor); 1.174 + draw_board(&gamestate); 1.175 if (myturn) { 1.176 - running = !sendmove(board, movelist, mycolor, opponent); 1.177 + running = !sendmove(&gamestate, opponent); 1.178 } else { 1.179 - running = !recvmove(board, movelist, opponent); 1.180 + running = !recvmove(&gamestate, opponent); 1.181 flushinp(); // flush any input the user hacked in while waiting 1.182 } 1.183 myturn ^= TRUE; 1.184 } while (running); 1.185 1.186 - freemovelist(movelist); 1.187 + gamestate_cleanup(&gamestate); 1.188 1.189 - mvaddstr(getmaxy(tchess_window)-1, 0, 1.190 + mvaddstr(getmaxy(stdscr)-1, 0, 1.191 "Game has ended. Press any key to leave..."); 1.192 getch(); 1.193 }