#include "web_match.h" #include "match.h" #include #include #include struct match_state *state; struct match_opts *match_opts; void free_state() { state->legs[1]->n_visits += state->boat_undone; // avoid memory leak leg_free(state->legs[0]); leg_free(state->legs[1]); free(state); state = NULL; } void match_opts_free() { free(match_opts); match_opts = NULL; } struct leg *state_active_leg() { return state->legs[state->active_player - 1]; } int match_num_players() { if (state->mode == M_P) return 1; return 2; } int match_winning_player() { for (int i = 0; i < match_num_players(); ++i) { if (state->legs[i]->rem == 0) return i + 1; } return -1; } bool match_is_over() { return match_winning_player() != -1; } int match_prev_player() { if (state->active_player == 1) return match_num_players(); else return state->active_player - 1; } int match_next_player() { if (state->active_player == match_num_players()) return 1; else return state->active_player + 1; } int match_prev_throw_player() { if (match_is_over()) return state->active_player; return match_prev_player(); } bool match_player_is_comp(int pn) { return state->mode == M_PVC && pn == 2; } bool match_first_user_has_thrown() { for (int i = 0, np = match_num_players(); i < np; ++i) { int pn = match_opts->throws_first + i; if (pn > np) pn -= np; if (!match_player_is_comp(pn)) return !!state->legs[pn - 1]->n_visits; } return false; }