src/game.c

changeset 51
84f2e380a434
parent 50
41017d0a72c5
child 53
78b580bfde33
equal deleted inserted replaced
50:41017d0a72c5 51:84f2e380a434
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 }

mercurial