/* finalize a game and free anything allocated by init process */ void client_game_finalize() { players_clear(); if ( game && game->game_type == GT_LOCAL ) { game_delete( &local_game ); levelset_delete( &game_set ); } game_delete( &game ); }
Test(Player, look_up) { player_t *pl = player_create_at((vector2d_t){9, 9}); game_t *gm = game_create(20, 20, 7, 5); cr_assert(pl); cr_assert(gm); game_add_team(gm, "pandas"); pl->p_teamname = strdup("pandas"); cr_assert_neq(game_register_player(gm, pl), -1); pl->p_dir = (vector2d_t){0, -1}; board_put_resource(gm->ga_board, (vector2d_t){9, 9}, SIBUR); board_put_resource(gm->ga_board, (vector2d_t){8, 8}, THYSTAME); board_put_resource(gm->ga_board, (vector2d_t){9, 8}, LINEMATE); board_put_resource(gm->ga_board, (vector2d_t){10, 8}, DERAUMERE); board_inc_food(gm->ga_board, (vector2d_t){10, 8}); board_inc_food(gm->ga_board, (vector2d_t){10, 8}); dynbuf_t *buf = player_look(pl, gm); cr_assert(buf); cr_log_info(buf->b_data); cr_assert(strstr(buf->b_data, "player")); cr_assert_eq(count_char(buf->b_data, ','), 3); cr_assert_str_eq(buf->b_data, "[sibur player,thystame,linemate,food food deraumere]"); dynbuf_delete(buf); game_delete(gm); }
Test(Player, look_empty) { player_t *pl = player_create_at((vector2d_t){9, 9}); game_t *gm = game_create(20, 20, 7, 5); cr_assert(pl); cr_assert(gm); game_add_team(gm, "pandas"); pl->p_teamname = strdup("pandas"); cr_assert_neq(game_register_player(gm, pl), -1); dynbuf_t *buf = player_look(pl, gm); cr_assert(buf); cr_log_info(buf->b_data); cr_assert(strstr(buf->b_data, "player")); cr_assert_eq(count_char(buf->b_data, ','), 3); pl->p_lvl = 2; dynbuf_delete(buf); buf = player_look(pl, gm); cr_log_info(buf->b_data); cr_assert(strstr(buf->b_data, "player")); cr_assert_eq(count_char(buf->b_data, ','), 8); dynbuf_delete(buf); pl->p_lvl = 3; buf = player_look(pl, gm); cr_log_info(buf->b_data); cr_assert(strstr(buf->b_data, "player")); cr_assert_eq(count_char(buf->b_data, ','), 15); dynbuf_delete(buf); game_delete(gm); }
Test(Player, eject) { player_t *pl1 = player_create_at((vector2d_t){9, 9}); player_t *pl2 = player_create_at((vector2d_t){9, 9}); player_t *pl3 = player_create_at((vector2d_t){9, 9}); player_t *pl4 = player_create_at((vector2d_t){9, 15}); game_t *gm = game_create(20, 20, 7, 5); cr_assert(pl1); cr_assert(pl2); cr_assert(pl2); cr_assert(gm); game_add_team(gm, "pandas"); game_add_team(gm, "red-pandas"); pl1->p_teamname = strdup("pandas"); pl3->p_teamname = strdup("pandas"); pl2->p_teamname = strdup("red-pandas"); pl4->p_teamname = strdup("red-pandas"); cr_assert_neq(game_register_player(gm, pl1), -1); cr_assert_neq(game_register_player(gm, pl2), -1); cr_assert_neq(game_register_player(gm, pl3), -1); cr_assert_neq(game_register_player(gm, pl4), -1); pl2->p_dir = (vector2d_t){-1, 0}; player_eject(pl1, gm->ga_players, gm->ga_board); cr_expect_eq(pl2->p_pos.v_x, 8); cr_expect_eq(pl2->p_pos.v_y, 9); cr_expect_eq(pl3->p_pos.v_x, 10); cr_expect_eq(pl3->p_pos.v_y, 9); player_eject(pl1, gm->ga_players, gm->ga_board); cr_expect_eq(pl2->p_pos.v_x, 8); cr_expect_eq(pl2->p_pos.v_y, 9); cr_expect_eq(pl3->p_pos.v_x, 10); cr_expect_eq(pl3->p_pos.v_y, 9); player_delete(pl1); player_delete(pl2); player_delete(pl3); game_delete(gm); }
/* * adjudicate * * Usage: adjudicate white_player black_player result * * Adjudicates a saved (stored) game between white_player and black_player. * The result is one of: abort, draw, white, black. "Abort" cancels the game * (no win, loss or draw), "white" gives white_player the win, "black" gives * black_player the win, and "draw" gives a draw. */ int com_adjudicate(int p, param_list param) { int wp, wconnected, bp, bconnected, g, inprogress, confused = 0; if (!FindPlayer(p, param[0].val.word, &wp, &wconnected)) return COM_OK; if (!FindPlayer(p, param[1].val.word, &bp, &bconnected)) { if (!wconnected) player_remove(wp); return COM_OK; } inprogress = ((player_globals.parray[wp].game >=0) &&(player_globals.parray[wp].opponent == bp)); if (inprogress) { g = player_globals.parray[wp].game; } else { g = game_new(); if (game_read(g, wp, bp) < 0) { confused = 1; pprintf(p, "There is no stored game %s vs. %s\n", player_globals.parray[wp].name, player_globals.parray[bp].name); } else { game_globals.garray[g].white = wp; game_globals.garray[g].black = bp; } } if (!confused) { if (strstr("abort", param[2].val.word) != NULL) { game_ended(g, WHITE, END_ADJABORT); pcommand(p, "message %s Your game \"%s vs. %s\" has been aborted.", player_globals.parray[wp].name, player_globals.parray[wp].name, player_globals.parray[bp].name); pcommand(p, "message %s Your game \"%s vs. %s\" has been aborted.", player_globals.parray[bp].name, player_globals.parray[wp].name, player_globals.parray[bp].name); } else if (strstr("draw", param[2].val.word) != NULL) { game_ended(g, WHITE, END_ADJDRAW); pcommand(p, "message %s Your game \"%s vs. %s\" has been adjudicated " "as a draw", player_globals.parray[wp].name, player_globals.parray[wp].name, player_globals.parray[bp].name); pcommand(p, "message %s Your game \"%s vs. %s\" has been adjudicated " "as a draw", player_globals.parray[bp].name, player_globals.parray[wp].name, player_globals.parray[bp].name); } else if (strstr("white", param[2].val.word) != NULL) { game_ended(g, WHITE, END_ADJWIN); pcommand(p, "message %s Your game \"%s vs. %s\" has been adjudicated " "as a win", player_globals.parray[wp].name, player_globals.parray[wp].name, player_globals.parray[bp].name); pcommand(p, "message %s Your game \"%s vs. %s\" has been adjudicated " "as a loss", player_globals.parray[bp].name, player_globals.parray[wp].name, player_globals.parray[bp].name); } else if (strstr("black", param[2].val.word) != NULL) { game_ended(g, BLACK, END_ADJWIN); pcommand(p, "message %s Your game \"%s vs. %s\" has been adjudicated " "as a loss", player_globals.parray[wp].name, player_globals.parray[wp].name, player_globals.parray[bp].name); pcommand(p, "message %s Your game \"%s vs. %s\" has been adjudicated " "as a win", player_globals.parray[bp].name, player_globals.parray[wp].name, player_globals.parray[bp].name); } else { confused = 1; pprintf(p, "Result must be one of: abort draw white black\n"); } } if (!confused) { pprintf(p, "Game adjudicated.\n"); if (!inprogress) { game_delete(wp, bp); } else { return (COM_OK); } } game_remove(g); if (!wconnected) player_remove(wp); if (!bconnected) player_remove(bp); return COM_OK; }
int accept_match(struct pending *pend, int p, int p1) { struct player *pp = &player_globals.parray[p]; int wt, winc, bt, binc, rated, white; char category[50], board[50]; char tmp[100]; int bh = 0, partner = 0, pp1 = 0, g1; unobserveAll(p); /* stop observing when match starts */ unobserveAll(p1); wt = pend->wtime; winc = pend->winc; bt = pend->btime; binc = pend->binc; rated = pend->rated; strcpy (category, pend->category); strcpy (board, pend->board_type); white = (pend->seek_color == -1) ? -1 : 1 - pend->seek_color; pprintf(p, "You accept the challenge of %s.\n", player_globals.parray[p1].name); pprintf(p1, "\n%s accepts your challenge.\n", pp->name); if(!pend->status) delete_pending(pend); withdraw_seeks(p); withdraw_seeks(p1); pend_join_match (p,p1); player_globals.parray[p1].last_category = strdup(category); player_globals.parray[p1].last_board = strdup(board); player_globals.parray[p].last_category = strdup(category); player_globals.parray[p].last_board = strdup(board); if (game_isblitz(category,board) == TYPE_BUGHOUSE) { bh = 1; if ((partner = pp->partner) >= 0 && (pp1 = player_globals.parray[p1].partner) >= 0) { unobserveAll(partner); /* stop observing when match starts */ unobserveAll(pp1); pprintf(partner, "\nYour partner accepts the challenge of %s.\n", player_globals.parray[p1].name); pprintf(pp1, "\n%s accepts your partner's challenge.\n", pp->name); pend_join_match (partner,pp1); } else { return COM_OK; } } g1 = game_new(); /* create a game structure */ if (g1 < 0) { sprintf(tmp, "There was a problem creating the new match.\n"); pprintf(p, tmp); pprintf_prompt(p1, tmp); } if (game_read(g1, p1, p) >= 0) { int swap; swap = p; p = p1; p1 = swap; pp = &player_globals.parray[p]; } else if (game_read(g1, p, p1) < 0) { /* so no adjourned game */ // Alex Guo: this is creating the match too early. If we are doing bughouse, // we need to first create the other board, and THEN create the match //if (create_new_match(g1,p, p1, wt, winc, bt, binc, rated, category, board, white,0) == COM_FAILED) { // return COM_OK; //} /* create first game */ int g2=-1; int g1_white = white; if (bh) { /* do bughouse creation */ g2 = game_new(); if (g2 < 0) return BugMatchErrorHandler(g1, pp1, partner); game_globals.garray[g1].link = g2; /* link the games */ game_globals.garray[g2].link = g1; game_globals.garray[g1].databaseLink= g2; game_globals.garray[g2].databaseLink = g1; if (create_new_match(g1,p, p1, wt, winc, bt, binc, rated, category, board, g1_white,0) == COM_FAILED) return COM_OK; white = (pp->side == WHITE ? 0 : 1); player_globals.parray[partner].last_category = strdup(category); player_globals.parray[partner].last_board = strdup(board); player_globals.parray[pp1].last_category = strdup(category); player_globals.parray[pp1].last_board = strdup(board); if ((create_new_match(g2,partner, pp1, wt, winc, bt, binc, rated, category, board,white,0) == COM_FAILED)) return BugMatchErrorHandler(g1, pp1, partner); sprintf(tmp, "\nYour partner is playing game %d (%s vs. %s).\n", g2 + 1, game_globals.garray[g2].white_name, game_globals.garray[g2].black_name); pprintf(p, tmp); pprintf(p1, tmp); sprintf(tmp, "\nYour partner is playing game %d (%s vs. %s).\n", g1 + 1, game_globals.garray[g1].white_name, game_globals.garray[g1].black_name); pprintf(partner, tmp); pprintf(pp1, tmp); pfollow_start(partner, pp1); pfollow_start(p, p1); } else { if (create_new_match(g1,p, p1, wt, winc, bt, binc, rated, category, board, g1_white,0) == COM_FAILED) return COM_OK; } // Alex Guo: now here, send the information to the clients. //if (g1 >= 0) { // gameinfo(p, g1); // gameinfo(p1, g1); // send_boards(g1); //} //if (g2 >= 0) { // gameinfo(partner, g2); // gameinfo(pp1, g2); // send_boards(g2); //} return COM_OK; } /* resume adjourned game */ game_delete(p, p1); /* remove the game from disk */ sprintf(tmp, "{Game %d (%s vs. %s) Continuing %s %s match.}\n", g1+1, pp->name, player_globals.parray[p1].name, rstr[game_globals.garray[g1].rated], bstr[game_globals.garray[g1].type]); pprintf(p, tmp); pprintf(p1, tmp); output_match_messages(p, p1, g1, "Continuing"); game_globals.garray[g1].white = p; game_globals.garray[g1].black = p1; game_globals.garray[g1].status = GAME_ACTIVE; game_globals.garray[g1].result = END_NOTENDED; game_globals.garray[g1].startTime = tenth_secs2(); game_globals.garray[g1].lastMoveTime = game_globals.garray[g1].startTime; game_globals.garray[g1].lastDecTime = game_globals.garray[g1].startTime; pp->game = g1; pp->opponent = p1; pp->side = WHITE; player_globals.parray[p1].game = g1; player_globals.parray[p1].opponent = p; player_globals.parray[p1].side = BLACK; send_boards(g1); /* obey any 'follow' lists */ //follow_start(p,p1); return COM_OK; }