diff options
Diffstat (limited to 'web/web_match.c')
-rw-r--r-- | web/web_match.c | 46 |
1 files changed, 42 insertions, 4 deletions
diff --git a/web/web_match.c b/web/web_match.c index aabea4d..bdd049d 100644 --- a/web/web_match.c +++ b/web/web_match.c @@ -8,12 +8,50 @@ struct match_state *state; struct match_opts *match_opts; +static int curr_id = 0; + +void match_new() +{ + if (state) free_state(); + + state = calloc(1, sizeof(*state)); + state->id = ++curr_id; + state->mode = match_opts->mode; + + state->size_players = 2; + state->legs = malloc(state->size_players * sizeof(*(state->legs))); + state->player_types = malloc(state->size_players * + sizeof(*(state->player_types))); + state->comp_undone = malloc(state->size_players * + sizeof(*(state->comp_undone))); +} + +void match_add_player(int start_pts, enum player_type type, char *name) +{ + if (state->num_players == state->size_players) { + state->size_players += + state->size_players ? state->size_players : 1; + state->legs = realloc(state->legs, + state->size_players * sizeof(*(state->legs))); + state->player_types = realloc(state->player_types, + state->size_players * sizeof(*(state->player_types))); + state->comp_undone = realloc(state->comp_undone, + state->size_players * sizeof(*(state->comp_undone))); + } + + state->legs[state->num_players] = leg_init(start_pts, name); + state->player_types[state->num_players] = type; + state->comp_undone[state->num_players++] = 0; +} void free_state() { - state->legs[1]->n_visits += state->boat_undone; // avoid memory leak - leg_free(state->legs[0]); - leg_free(state->legs[1]); + for (int i = 0; i < state->num_players; ++i) { + // undone visits readded before free to avoid memory leak + state->legs[i]->n_visits += state->comp_undone[i]; + leg_free(state->legs[i]); + } + free(state->legs); free(state); state = NULL; } @@ -78,7 +116,7 @@ int match_prev_throw_player() bool match_player_is_comp(int pn) { - return state->mode == M_PVC && pn == 2; + return state->player_types[pn - 1] == PT_COMP; } bool match_first_user_has_thrown() |