Line |
Branch |
Exec |
Source |
1 |
|
|
/* |
2 |
|
|
** EPITECH PROJECT, 2024 |
3 |
|
|
** zappy |
4 |
|
|
** File description: |
5 |
|
|
** meteors.c |
6 |
|
|
*/ |
7 |
|
|
|
8 |
|
|
#include "flags.h" |
9 |
|
|
#include "server.h" |
10 |
|
|
|
11 |
|
✗ |
static info_map_t get_tile(server_t *server, size_t x, size_t y) |
12 |
|
|
{ |
13 |
|
✗ |
tile_t tile = server->map[x + y * server->proprieties.width]; |
14 |
|
|
info_map_t info = {0}; |
15 |
|
|
|
16 |
|
✗ |
for (size_t i = 0; i < tile.num_objects; i++) { |
17 |
|
✗ |
info.food += tile.objects[i] == FOOD; |
18 |
|
✗ |
info.linemate += tile.objects[i] == LINEMATE; |
19 |
|
✗ |
info.deraumere += tile.objects[i] == DERAUMERE; |
20 |
|
✗ |
info.sibur += tile.objects[i] == SIBUR; |
21 |
|
✗ |
info.mendiane += tile.objects[i] == MENDIANE; |
22 |
|
✗ |
info.phiras += tile.objects[i] == PHIRAS; |
23 |
|
✗ |
info.thystame += tile.objects[i] == THYSTAME; |
24 |
|
|
} |
25 |
|
✗ |
return info; |
26 |
|
|
} |
27 |
|
|
|
28 |
|
✗ |
static void add_object(server_t *server, int max, int value, int obj_enum) |
29 |
|
|
{ |
30 |
|
✗ |
int diff = max - value; |
31 |
|
✗ |
int x = server->proprieties.width; |
32 |
|
✗ |
int y = server->proprieties.height; |
33 |
|
|
int x_rand = 0; |
34 |
|
|
int y_rand = 0; |
35 |
|
|
info_map_t in = {0}; |
36 |
|
|
|
37 |
|
✗ |
for (int i = diff; i >= 0; i--) { |
38 |
|
✗ |
x_rand = rand_p(x); |
39 |
|
✗ |
y_rand = rand_p(y); |
40 |
|
✗ |
add_element_to_map(server, x_rand, y_rand, obj_enum); |
41 |
|
✗ |
in = get_tile(server, x_rand, y_rand); |
42 |
|
✗ |
if (in.food >= max || in.linemate >= max || in.deraumere >= max || |
43 |
|
✗ |
in.sibur >= max || in.mendiane >= max || in.phiras >= max || |
44 |
|
|
in.thystame >= max) |
45 |
|
|
break; |
46 |
|
✗ |
message_to_graphicals(server, "bct %d %d %d %d %d %d %d %d %d\n", |
47 |
|
|
x_rand, y_rand, in.food, in.linemate, in.deraumere, |
48 |
|
|
in.sibur, in.mendiane, in.phiras, in.thystame); |
49 |
|
|
} |
50 |
|
✗ |
} |
51 |
|
|
|
52 |
|
✗ |
static void fill_objects(server_t *server, info_map_t *max, info_map_t *map) |
53 |
|
|
{ |
54 |
|
✗ |
add_object(server, max->food, map->food, FOOD); |
55 |
|
✗ |
add_object(server, max->linemate, map->linemate, LINEMATE); |
56 |
|
✗ |
add_object(server, max->deraumere, map->deraumere, DERAUMERE); |
57 |
|
✗ |
add_object(server, max->sibur, map->sibur, SIBUR); |
58 |
|
✗ |
add_object(server, max->mendiane, map->mendiane, MENDIANE); |
59 |
|
✗ |
add_object(server, max->phiras, map->phiras, PHIRAS); |
60 |
|
✗ |
add_object(server, max->thystame, map->thystame, THYSTAME); |
61 |
|
✗ |
} |
62 |
|
|
|
63 |
|
✗ |
void handle_meteors(server_t *server) |
64 |
|
|
{ |
65 |
|
✗ |
struct timespec current = server->current_time; |
66 |
|
✗ |
struct timespec meteor_time = server->meteor_last_time; |
67 |
|
✗ |
double interval = METEORS_LIMIT / (double)server->proprieties.frequency; |
68 |
|
✗ |
time_t sec_sus = (current.tv_sec - meteor_time.tv_sec); |
69 |
|
✗ |
time_t nsec_sus = (current.tv_nsec - meteor_time.tv_nsec); |
70 |
|
✗ |
double elapsed = sec_sus + nsec_sus / NANOSECONDS_IN_SECOND; |
71 |
|
✗ |
info_map_t map; |
72 |
|
✗ |
info_map_t max_map = server->proprieties.max_map; |
73 |
|
|
|
74 |
|
✗ |
if (elapsed >= interval) { |
75 |
|
✗ |
map = get_map_density(server); |
76 |
|
✗ |
clock_gettime(CLOCK_REALTIME, &server->meteor_last_time); |
77 |
|
✗ |
if (map.thystame != max_map.thystame || map.phiras != max_map.phiras || |
78 |
|
✗ |
map.mendiane != max_map.mendiane || map.sibur != max_map.sibur || |
79 |
|
✗ |
map.linemate != max_map.linemate || map.food != max_map.food || |
80 |
|
✗ |
map.deraumere != max_map.deraumere) |
81 |
|
✗ |
fill_objects(server, &max_map, &map); |
82 |
|
|
} |
83 |
|
✗ |
} |
84 |
|
|
|