Line |
Branch |
Exec |
Source |
1 |
|
|
/* |
2 |
|
|
** EPITECH PROJECT, 2024 |
3 |
|
|
** zappy |
4 |
|
|
** File description: |
5 |
|
|
** init.c |
6 |
|
|
*/ |
7 |
|
|
|
8 |
|
|
#include "server.h" |
9 |
|
|
#include <string.h> |
10 |
|
|
#include <stdio.h> |
11 |
|
|
|
12 |
|
✗ |
static struct sockaddr_in init_socket_address(size_t port) |
13 |
|
|
{ |
14 |
|
|
struct sockaddr_in info; |
15 |
|
|
|
16 |
|
|
memset(&info, 0, sizeof(info)); |
17 |
|
✗ |
info.sin_family = AF_INET; |
18 |
|
✗ |
info.sin_port = htons(port); |
19 |
|
|
info.sin_addr.s_addr = htonl(INADDR_ANY); |
20 |
|
✗ |
return info; |
21 |
|
|
} |
22 |
|
|
|
23 |
|
✗ |
static bool init_teams(server_t *server) |
24 |
|
|
{ |
25 |
|
✗ |
char **teams = server->proprieties.names; |
26 |
|
✗ |
int nb_clients = server->proprieties.nb_clients; |
27 |
|
✗ |
int width = server->proprieties.width; |
28 |
|
✗ |
int height = server->proprieties.height; |
29 |
|
|
team_list_t *new_team; |
30 |
|
|
|
31 |
|
✗ |
for (size_t i = 0; teams[i] != NULL; i++) { |
32 |
|
✗ |
new_team = malloc(sizeof(team_list_t)); |
33 |
|
✗ |
if (new_team == NULL) |
34 |
|
|
return false; |
35 |
|
✗ |
new_team->team = init_team(teams[i], nb_clients, width, height); |
36 |
|
✗ |
if (new_team->team == NULL) |
37 |
|
|
return false; |
38 |
|
✗ |
TAILQ_INSERT_TAIL(&server->teams, new_team, entries); |
39 |
|
|
} |
40 |
|
|
return true; |
41 |
|
|
} |
42 |
|
|
|
43 |
|
✗ |
static tile_t *init_map(int width, int height) |
44 |
|
|
{ |
45 |
|
✗ |
tile_t *map = calloc(height * width, sizeof(tile_t)); |
46 |
|
|
|
47 |
|
✗ |
if (map == NULL) |
48 |
|
|
return NULL; |
49 |
|
✗ |
for (int i = 0; i < height * width; i++) { |
50 |
|
✗ |
map[i].num_objects = 0; |
51 |
|
✗ |
map[i].objects = NULL; |
52 |
|
|
} |
53 |
|
|
return map; |
54 |
|
|
} |
55 |
|
|
|
56 |
|
✗ |
static void add_object(int obj, int obj_enum, server_t *server) |
57 |
|
|
{ |
58 |
|
✗ |
int x = server->proprieties.width; |
59 |
|
✗ |
int y = server->proprieties.height; |
60 |
|
|
|
61 |
|
✗ |
for (int i = obj; i >= 0; i--) |
62 |
|
✗ |
add_element_to_map(server, rand_p(x), rand_p(y), obj_enum); |
63 |
|
✗ |
} |
64 |
|
|
|
65 |
|
✗ |
static void init_meteor(server_t *server) |
66 |
|
|
{ |
67 |
|
✗ |
info_map_t objs = server->proprieties.max_map; |
68 |
|
|
|
69 |
|
✗ |
add_object(objs.food, FOOD, server); |
70 |
|
✗ |
add_object(objs.linemate, LINEMATE, server); |
71 |
|
✗ |
add_object(objs.deraumere, DERAUMERE, server); |
72 |
|
✗ |
add_object(objs.sibur, SIBUR, server); |
73 |
|
✗ |
add_object(objs.mendiane, MENDIANE, server); |
74 |
|
✗ |
add_object(objs.phiras, PHIRAS, server); |
75 |
|
✗ |
add_object(objs.thystame, THYSTAME, server); |
76 |
|
✗ |
clock_gettime(CLOCK_REALTIME, &server->meteor_last_time); |
77 |
|
✗ |
} |
78 |
|
|
|
79 |
|
✗ |
bool init_server(server_t *server, const char **args) |
80 |
|
|
{ |
81 |
|
✗ |
if (init_flags(&server->proprieties, args) == false) |
82 |
|
|
return false; |
83 |
|
✗ |
TAILQ_INIT(&server->teams); |
84 |
|
✗ |
if (init_teams(server) == false) |
85 |
|
|
return false; |
86 |
|
✗ |
TAILQ_INIT(&server->clients); |
87 |
|
✗ |
print_teams_infos(&server->teams); |
88 |
|
✗ |
server->info = init_socket_address((size_t)server->proprieties.port); |
89 |
|
✗ |
server->fd = socket(AF_INET, SOCK_STREAM, 0); |
90 |
|
✗ |
server->addrlen = sizeof(struct sockaddr_in); |
91 |
|
✗ |
if (server->fd < 0) |
92 |
|
|
return false; |
93 |
|
✗ |
FD_ZERO(&server->current_sockets); |
94 |
|
✗ |
FD_SET(server->fd, &server->current_sockets); |
95 |
|
✗ |
server->timeout.tv_sec = 0; |
96 |
|
✗ |
server->timeout.tv_usec = 0; |
97 |
|
✗ |
server->map = init_map(server->proprieties.width, |
98 |
|
|
server->proprieties.height); |
99 |
|
✗ |
init_meteor(server); |
100 |
|
✗ |
return true; |
101 |
|
|
} |
102 |
|
|
|