| Line |
Branch |
Exec |
Source |
| 1 |
|
|
/* |
| 2 |
|
|
** EPITECH PROJECT, 2024 |
| 3 |
|
|
** zappy |
| 4 |
|
|
** File description: |
| 5 |
|
|
** incantation.c |
| 6 |
|
|
*/ |
| 7 |
|
|
|
| 8 |
|
|
#include "server.h" |
| 9 |
|
|
|
| 10 |
|
|
static const int required_resources[7][7] = { |
| 11 |
|
|
{1, 1, 0, 0, 0, 0, 0}, |
| 12 |
|
|
{2, 1, 1, 1, 0, 0, 0}, |
| 13 |
|
|
{2, 2, 0, 1, 0, 2, 0}, |
| 14 |
|
|
{4, 1, 1, 2, 0, 1, 0}, |
| 15 |
|
|
{4, 1, 2, 1, 3, 0, 0}, |
| 16 |
|
|
{6, 1, 2, 3, 0, 1, 0}, |
| 17 |
|
|
{6, 2, 2, 2, 2, 2, 1} |
| 18 |
|
|
}; |
| 19 |
|
|
|
| 20 |
|
8 |
static info_map_t get_tile(server_t *server, size_t x, size_t y) |
| 21 |
|
|
{ |
| 22 |
|
8 |
tile_t tile = server->map[x + y * server->proprieties.width]; |
| 23 |
|
|
info_map_t info = {0}; |
| 24 |
|
|
|
| 25 |
2/2
✓ Branch 0 taken 34 times.
✓ Branch 1 taken 8 times.
|
42 |
for (size_t i = 0; i < tile.num_objects; i++) { |
| 26 |
|
34 |
info.food += tile.objects[i] == FOOD; |
| 27 |
|
34 |
info.linemate += tile.objects[i] == LINEMATE; |
| 28 |
|
34 |
info.deraumere += tile.objects[i] == DERAUMERE; |
| 29 |
|
34 |
info.sibur += tile.objects[i] == SIBUR; |
| 30 |
|
34 |
info.mendiane += tile.objects[i] == MENDIANE; |
| 31 |
|
34 |
info.phiras += tile.objects[i] == PHIRAS; |
| 32 |
|
34 |
info.thystame += tile.objects[i] == THYSTAME; |
| 33 |
|
|
} |
| 34 |
|
8 |
return info; |
| 35 |
|
|
} |
| 36 |
|
|
|
| 37 |
|
8 |
static bool check_requirements_met( |
| 38 |
|
|
const info_map_t resource_count, |
| 39 |
|
|
int players_on_tile, |
| 40 |
|
|
size_t required_level |
| 41 |
|
|
) |
| 42 |
|
|
{ |
| 43 |
|
8 |
const int *req = required_resources[required_level - 1]; |
| 44 |
|
|
|
| 45 |
|
|
return ( |
| 46 |
|
15 |
players_on_tile >= req[0] && |
| 47 |
1/2
✓ Branch 0 taken 7 times.
✗ Branch 1 not taken.
|
7 |
resource_count.linemate >= req[1] && |
| 48 |
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 1 times.
|
7 |
resource_count.deraumere >= req[2] && |
| 49 |
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
|
6 |
resource_count.sibur >= req[3] && |
| 50 |
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
|
6 |
resource_count.mendiane >= req[4] && |
| 51 |
3/4
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
|
14 |
resource_count.phiras >= req[5] && |
| 52 |
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
|
6 |
resource_count.thystame >= req[6] |
| 53 |
|
|
); |
| 54 |
|
|
} |
| 55 |
|
|
|
| 56 |
|
24 |
static void remove_resource_from_tile( |
| 57 |
|
|
tile_t *tile, |
| 58 |
|
|
size_t resource_type, |
| 59 |
|
|
size_t *resource_count |
| 60 |
|
|
) |
| 61 |
|
|
{ |
| 62 |
2/2
✓ Branch 0 taken 134 times.
✓ Branch 1 taken 9 times.
|
143 |
for (size_t j = 0; j < tile->num_objects; j++) { |
| 63 |
2/2
✓ Branch 0 taken 15 times.
✓ Branch 1 taken 119 times.
|
134 |
if (tile->objects[j] == resource_type) { |
| 64 |
|
15 |
tile->objects[j] = tile->objects[tile->num_objects - 1]; |
| 65 |
|
15 |
resource_count[resource_type]--; |
| 66 |
|
15 |
break; |
| 67 |
|
|
} |
| 68 |
|
|
} |
| 69 |
|
24 |
} |
| 70 |
|
|
|
| 71 |
|
3 |
static void remove_resources( |
| 72 |
|
|
tile_t *tile, |
| 73 |
|
|
info_map_t resources, |
| 74 |
|
|
size_t required_level |
| 75 |
|
|
) |
| 76 |
|
|
{ |
| 77 |
|
3 |
size_t resource_count[7] = { |
| 78 |
|
3 |
resources.food, |
| 79 |
|
3 |
resources.linemate, |
| 80 |
|
3 |
resources.deraumere, |
| 81 |
|
3 |
resources.sibur, |
| 82 |
|
3 |
resources.mendiane, |
| 83 |
|
3 |
resources.phiras, |
| 84 |
|
3 |
resources.thystame |
| 85 |
|
|
}; |
| 86 |
|
|
|
| 87 |
2/2
✓ Branch 0 taken 21 times.
✓ Branch 1 taken 3 times.
|
24 |
for (size_t i = 0; i < 7; i++) { |
| 88 |
|
|
for (int j = 0; |
| 89 |
2/2
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 21 times.
|
45 |
j < required_resources[required_level - 1][i]; j++) { |
| 90 |
|
24 |
remove_resource_from_tile(tile, i, resource_count); |
| 91 |
|
|
} |
| 92 |
|
|
} |
| 93 |
|
3 |
} |
| 94 |
|
|
|
| 95 |
|
8 |
static size_t get_nb_players_on_tile(client_t *client, server_t *server) |
| 96 |
|
|
{ |
| 97 |
|
|
size_t players_on_tile = 0; |
| 98 |
|
|
client_list_t *client_entry = NULL; |
| 99 |
|
|
|
| 100 |
2/4
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
|
8 |
if (client == NULL || TAILQ_EMPTY(&server->clients)) |
| 101 |
|
|
return 0; |
| 102 |
2/2
✓ Branch 0 taken 21 times.
✓ Branch 1 taken 8 times.
|
29 |
TAILQ_FOREACH(client_entry, &server->clients, entries) { |
| 103 |
1/2
✓ Branch 0 taken 21 times.
✗ Branch 1 not taken.
|
21 |
if (client_entry->client |
| 104 |
1/2
✓ Branch 0 taken 21 times.
✗ Branch 1 not taken.
|
21 |
&& client_entry->client->is_graphic == false |
| 105 |
|
|
&& client_entry->client->x == client->x |
| 106 |
1/2
✓ Branch 0 taken 21 times.
✗ Branch 1 not taken.
|
21 |
&& client_entry->client->y == client->y |
| 107 |
1/2
✓ Branch 0 taken 21 times.
✗ Branch 1 not taken.
|
21 |
&& client_entry->client->level == client->level) |
| 108 |
|
21 |
players_on_tile++; |
| 109 |
|
|
} |
| 110 |
|
|
return players_on_tile; |
| 111 |
|
|
} |
| 112 |
|
|
|
| 113 |
|
12 |
static void run_logic_on_group( |
| 114 |
|
|
client_t *client, |
| 115 |
|
|
server_t *server, |
| 116 |
|
|
size_t required_level, |
| 117 |
|
|
void (*func)(client_t *client, server_t *server) |
| 118 |
|
|
) |
| 119 |
|
|
{ |
| 120 |
|
|
client_list_t *client_entry = NULL; |
| 121 |
|
|
|
| 122 |
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 12 times.
|
48 |
TAILQ_FOREACH(client_entry, &server->clients, entries) { |
| 123 |
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
|
36 |
if (client_entry->client |
| 124 |
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
|
36 |
&& client_entry->client->is_graphic == false |
| 125 |
|
|
&& client_entry->client->x == client->x |
| 126 |
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
|
36 |
&& client_entry->client->y == client->y |
| 127 |
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
|
36 |
&& client_entry->client->level == required_level) |
| 128 |
|
36 |
func(client_entry->client, server); |
| 129 |
|
|
} |
| 130 |
|
12 |
} |
| 131 |
|
|
|
| 132 |
|
8 |
static bool are_requierment_met_encapsulation( |
| 133 |
|
|
client_t *client, |
| 134 |
|
|
info_map_t resource_count, |
| 135 |
|
|
size_t players_on_tile, |
| 136 |
|
|
size_t required_level |
| 137 |
|
|
) |
| 138 |
|
|
{ |
| 139 |
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
|
8 |
if (!check_requirements_met( |
| 140 |
|
|
resource_count, |
| 141 |
|
|
players_on_tile, |
| 142 |
|
|
required_level) |
| 143 |
|
|
) { |
| 144 |
|
2 |
dprintf(client->fd, "ko\n"); |
| 145 |
|
2 |
client->is_incanting = false; |
| 146 |
|
2 |
return false; |
| 147 |
|
|
} |
| 148 |
|
|
return true; |
| 149 |
|
|
} |
| 150 |
|
|
|
| 151 |
|
5 |
void incantation(client_t *client, server_t *server) |
| 152 |
|
|
{ |
| 153 |
|
5 |
info_map_t resource_count = get_tile(server, client->x, client->y); |
| 154 |
|
5 |
size_t players_on_tile = get_nb_players_on_tile(client, server); |
| 155 |
|
|
|
| 156 |
2/2
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 3 times.
|
5 |
if (!are_requierment_met_encapsulation(client, resource_count, |
| 157 |
|
|
players_on_tile, client->level)) |
| 158 |
|
2 |
return; |
| 159 |
|
3 |
run_logic_on_group(client, server, client->level, callback_freeze); |
| 160 |
|
3 |
run_logic_on_group(client, server, client->level, |
| 161 |
|
|
callback_start_incantation_set_payload); |
| 162 |
|
3 |
send_start_incantation_to_graphicals(client, server); |
| 163 |
|
3 |
client_time_handler(client, INCANTATION); |
| 164 |
|
|
} |
| 165 |
|
|
|
| 166 |
|
3 |
void incantation_callback_end_of_command(client_t *c, server_t *s) |
| 167 |
|
|
{ |
| 168 |
|
3 |
info_map_t resource_count = get_tile(s, c->x, c->y); |
| 169 |
|
3 |
size_t players_on_tile = get_nb_players_on_tile(c, s); |
| 170 |
|
3 |
tile_t *tile = &s->map[c->x + c->y * s->proprieties.width]; |
| 171 |
|
|
|
| 172 |
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
|
3 |
if (c->is_incanting == false) |
| 173 |
|
✗ |
return; |
| 174 |
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
|
3 |
if (!are_requierment_met_encapsulation(c, resource_count, |
| 175 |
|
|
players_on_tile, c->level)) { |
| 176 |
|
✗ |
run_logic_on_group(c, s, c->level, callback_unfreeze); |
| 177 |
|
✗ |
message_to_graphicals(s, "pie %hhd %hhd %d\n", c->x, c->y, 0); |
| 178 |
|
✗ |
return; |
| 179 |
|
|
} |
| 180 |
|
3 |
remove_resources(tile, resource_count, c->level); |
| 181 |
|
3 |
run_logic_on_group(c, s, c->level, callback_level_up); |
| 182 |
|
3 |
run_logic_on_group(c, s, c->level, |
| 183 |
|
|
callback_end_incantation_set_payload); |
| 184 |
|
3 |
message_to_graphicals(s, "pie %hhd %hhd %d\n", c->x, c->y, 1); |
| 185 |
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
|
3 |
if (c->level == LAST_LEVEL) |
| 186 |
|
1 |
message_to_graphicals(s, "seg %s\n", c->team_name); |
| 187 |
|
|
} |
| 188 |
|
|
|