172 clrtoeol(); |
172 clrtoeol(); |
173 refresh(); |
173 refresh(); |
174 |
174 |
175 char filename[64]; |
175 char filename[64]; |
176 int y = getcury(stdscr); |
176 int y = getcury(stdscr); |
177 if (getnstr(filename, 64) == OK) { |
177 if (getnstr(filename, 64) == OK && filename[0] != '\0') { |
178 move(y, 0); |
178 move(y, 0); |
179 FILE *file = fopen(filename, "w"); |
179 FILE *file = fopen(filename, "w"); |
180 if (file) { |
180 if (file) { |
181 write_pgn(file, gamestate, gameinfo); |
181 write_pgn(file, gamestate, gameinfo); |
182 fclose(file); |
182 fclose(file); |
320 } else { |
320 } else { |
321 Move move; |
321 Move move; |
322 int eval_result = eval_move(gamestate, movestr, &move, mycolor); |
322 int eval_result = eval_move(gamestate, movestr, &move, mycolor); |
323 switch (eval_result) { |
323 switch (eval_result) { |
324 case VALID_MOVE_SYNTAX: |
324 case VALID_MOVE_SYNTAX: |
325 net_send_data(opponent, NETCODE_MOVE, &move, |
325 net_send_data(opponent, NETCODE_MOVE, &move, sizeof(Move)); |
326 sizeof(Move)-8); |
|
327 code = net_recieve_code(opponent); |
326 code = net_recieve_code(opponent); |
328 move.check = code == NETCODE_CHECK || |
327 move.check = code == NETCODE_CHECK || |
329 code == NETCODE_CHECKMATE; |
328 code == NETCODE_CHECKMATE; |
330 gamestate->checkmate = code == NETCODE_CHECKMATE; |
329 gamestate->checkmate = code == NETCODE_CHECKMATE; |
331 gamestate->stalemate = code == NETCODE_STALEMATE; |
330 gamestate->stalemate = code == NETCODE_STALEMATE; |
421 } else { |
420 } else { |
422 net_send_code(opponent, NETCODE_DECLINE); |
421 net_send_code(opponent, NETCODE_DECLINE); |
423 } |
422 } |
424 break; |
423 break; |
425 case NETCODE_MOVE: |
424 case NETCODE_MOVE: |
426 net_recieve_data(opponent, &move, sizeof(Move)-8); |
425 net_recieve_data(opponent, &move, sizeof(Move)); |
427 code = validate_move(gamestate, &move); |
426 code = validate_move(gamestate, &move); |
428 if (code == VALID_MOVE_SEMANTICS) { |
427 if (code == VALID_MOVE_SEMANTICS) { |
429 apply_move(gamestate, &move); |
428 apply_move(gamestate, &move); |
430 if (move.check) { |
429 if (gamestate->checkmate) { |
431 net_send_code(opponent, NETCODE_CHECK); |
|
432 } else if (gamestate->checkmate) { |
|
433 net_send_code(opponent, NETCODE_CHECKMATE); |
430 net_send_code(opponent, NETCODE_CHECKMATE); |
434 printw("\rCheckmate!"); |
431 printw("\rCheckmate!"); |
435 clrtoeol(); |
432 clrtoeol(); |
436 return 1; |
433 return 1; |
437 } else if (gamestate->stalemate) { |
434 } else if (gamestate->stalemate) { |
438 net_send_code(opponent, NETCODE_STALEMATE); |
435 net_send_code(opponent, NETCODE_STALEMATE); |
439 printw("\rStalemate!"); |
436 printw("\rStalemate!"); |
440 clrtoeol(); |
437 clrtoeol(); |
441 return 1; |
438 return 1; |
|
439 } else if (move.check) { |
|
440 net_send_code(opponent, NETCODE_CHECK); |
442 } else { |
441 } else { |
443 net_send_code(opponent, NETCODE_ACCEPT); |
442 net_send_code(opponent, NETCODE_ACCEPT); |
444 } |
443 } |
445 return 0; |
444 return 0; |
446 } else { |
445 } else { |
521 } while (running); |
520 } while (running); |
522 |
521 |
523 post_game(&gamestate, &(settings->gameinfo)); |
522 post_game(&gamestate, &(settings->gameinfo)); |
524 } |
523 } |
525 |
524 |
526 void game_start(Settings *settings, int opponent) { |
525 void game_continue(Settings *settings, int opponent, GameState *gamestate) { |
527 inputy = getmaxy(stdscr) - 6; |
526 inputy = getmaxy(stdscr) - 6; |
528 |
527 |
529 _Bool myturn = is_server(settings) == |
528 uint8_t mycolor = is_server(settings) ? settings->gameinfo.servercolor : |
530 (settings->gameinfo.servercolor == WHITE); |
529 opponent_color(settings->gameinfo.servercolor); |
531 uint8_t mycolor = myturn ? WHITE : BLACK; |
530 |
532 |
531 _Bool myturn = (gamestate->lastmove ? |
533 GameState gamestate; |
532 (gamestate->lastmove->move.piece & COLOR_MASK) : WHITE) != mycolor; |
534 gamestate_init(&gamestate); |
|
535 |
533 |
536 _Bool running; |
534 _Bool running; |
537 do { |
535 do { |
538 clear(); |
536 clear(); |
539 draw_board(&gamestate, mycolor); |
537 draw_board(gamestate, mycolor); |
540 if (myturn) { |
538 if (myturn) { |
541 running = !sendmove(&gamestate, &(settings->gameinfo), |
539 running = !sendmove(gamestate, &(settings->gameinfo), |
542 opponent, mycolor); |
540 opponent, mycolor); |
543 } else { |
541 } else { |
544 running = !recvmove(&gamestate, &(settings->gameinfo), opponent); |
542 running = !recvmove(gamestate, &(settings->gameinfo), opponent); |
545 } |
543 } |
546 myturn ^= TRUE; |
544 myturn ^= TRUE; |
547 } while (running); |
545 } while (running); |
548 |
546 |
549 post_game(&gamestate, &(settings->gameinfo)); |
547 post_game(gamestate, &(settings->gameinfo)); |
550 } |
548 } |
|
549 |
|
550 void game_start(Settings *settings, int opponent) { |
|
551 GameState gamestate; |
|
552 gamestate_init(&gamestate); |
|
553 |
|
554 game_continue(settings, opponent, &gamestate); |
|
555 } |