summaryrefslogtreecommitdiff
path: root/web/web_match.c
blob: 93ebf76a713b2c19d7f9427b7dc418efb41130e7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include "web_match.h"

#include "match.h"

#include <stdbool.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>

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->m = match_init();
}

void free_state()
{
	free(state->m);
	free(state);
	state = NULL;
}

void match_opts_new()
{
	if (match_opts) match_opts_free();

	match_opts = calloc(1, sizeof(*match_opts));
	match_opts->start_pts = 501;

	match_opts->size_players = 2;
	match_opts->players = malloc(
		match_opts->size_players * sizeof(*(match_opts->players)));
}

void match_opts_add_player(enum player_type type, char *name)
{
	if (match_opts->num_players == match_opts->size_players) {
		match_opts->size_players +=
			match_opts->size_players ?
				match_opts->size_players : 1;
		match_opts->players = realloc(match_opts->players,
			match_opts->size_players *
				sizeof(*(match_opts->players)));
	}

	int pn = ++match_opts->num_players;
	if (!match_opts->throws_first)
		match_opts->throws_first = pn;

	match_opts->players[pn - 1].type = type;
	match_opts->players[pn - 1].name = strdup(name);
}

void match_opts_remove_player(int pn)
{
	if (match_opts->throws_first == pn)
		match_opts->throws_first = match_opts->num_players > 1 ? 1 : 0;
	else if (match_opts->throws_first > pn)
		--match_opts->throws_first;

	free(match_opts->players[pn - 1].name);
	for (int i = pn; i < match_opts->num_players; ++i)
		match_opts->players[i - 1] = match_opts->players[i];
	--match_opts->num_players;
}

void match_opts_free()
{
	if (!match_opts)
		return;

	for (int i = 0; i < match_opts->num_players; ++i)
		free(match_opts->players[i].name);
	free(match_opts->players);
	free(match_opts);
	match_opts = NULL;
}

bool match_player_is_comp(int pn)
{
	return state->m->players[pn - 1].type == PT_COMP;
}