Zappy - Year end project 2
This is a project that Epitech asked us to create in order to allow us to reveiw the notions of the current year.
Loading...
Searching...
No Matches
game_data_initialization.c
Go to the documentation of this file.
1/*
2** EPITECH PROJECT, 2024
3** my_zappy
4** File description:
5** game_data_initialization
6*/
7
8#include <string.h>
9
10#include "show.h"
11#include "utils.h"
12#include "server_handler.h"
13#include "client_management.h"
14
15static void init_map_size(server_handler_t *server, struct arg_s **arguments)
16{
17 char *value = NULL;
18
19 value = find_value_by_param((const struct arg_s **)arguments, "-x");
20 server->game_data.map_size[0] = atoi(value);
21 value = find_value_by_param((const struct arg_s **)arguments, "-y");
22 server->game_data.map_size[1] = atoi(value);
23}
24
25static void init_ressources_quantity(server_handler_t *server)
26{
27 int basic = server->game_data.map_size[0] * server->game_data.map_size[1];
28 int food = basic * FOOD_DENSITY;
29 int linemate = basic * LINEMATE_DENSITY;
30 int deraumere = basic * DERAUMERE_DENSITY;
31 int sibur = basic * SIBUR_DENSITY;
32 int mendiane = basic * MENDIANE_DENSITY;
33 int phiras = basic * PHIRAS_DENSITY;
34 int thystame = basic * THYSTAME_DENSITY;
35
37 server->game_data.ressources_quantity.linemate_nb = linemate;
38 server->game_data.ressources_quantity.deraumere_nb = deraumere;
40 server->game_data.ressources_quantity.mendiane_nb = mendiane;
42 server->game_data.ressources_quantity.thystame_nb = thystame;
43 server->game_data.total_ressources = DEFAULT_RESSOURCES;
44}
45
46static int search_unfilled_index(cli_t client[MAX_CLIENT])
47{
48 int index = 0;
49
50 for (; client[index].client_num != UNKNOWN; index++);
51 return index;
52}
53
54static bool check_if_already_taken_pos(cli_t clients[MAX_CLIENT], const int x,
55 const int y)
56{
57 for (int i = 0; i < MAX_CLIENT; i++) {
58 if (clients[i].pos[0] == x && clients[i].pos[1] == y) {
59 return true;
60 }
61 }
62 return false;
63}
64
65static void randomize_player_pos_and_dir(server_handler_t *server,
66 const int index)
67{
68 int x = 0;
69 int y = 0;
70 int dir = 0;
71
72 while (check_if_already_taken_pos(server->game_data.clients,
73 x, y) == true) {
74 for (int i = 0; i < 10; i++) {
75 x = rand() % server->game_data.map_size[0];
76 y = rand() % server->game_data.map_size[1];
77 dir = rand() % 4;
78 }
79 }
80 server->game_data.clients[index].pos[0] = x;
81 server->game_data.clients[index].pos[1] = y;
82 server->game_data.clients[index].direction = dir + 1;
83}
84
85static int init_player(server_handler_t *server, const int total, const int i)
86{
87 int index = 0;
88 int time_life = PLAYER_TIME / server->game_data.frequence;
89 static int num = 1;
90
91 for (int x = 0; x < MAX_CLIENT; x++)
92 server->game_data.teams[i].client_num_list[x] = UNKNOWN;
93 for (int nb = 0; nb < total; nb++) {
94 server->game_data.teams[i].client_num_list[nb] = num;
95 index = search_unfilled_index(server->game_data.clients);
96 server->game_data.clients[index].client_num = num;
97 server->game_data.clients[index].team_name =
98 strdup(server->game_data.teams[i].team_name);
99 if (server->game_data.clients[index].team_name == NULL)
100 return (-1);
101 server->game_data.clients[index].level = 1;
102 server->game_data.clients[index].time_life = time_life;
103 randomize_player_pos_and_dir(server, index);
104 num++;
105 }
106 return (0);
107}
108
109static int init_team_data(server_handler_t *server, struct arg_s **arguments)
110{
111 int index = find_index_by_param((const struct arg_s **)arguments, "-n");
112 int nb_value = arguments[index]->nb_value;
113 char **names = arguments[index]->value;
114 char *value = find_value_by_param((const struct arg_s **)arguments, "-c");
115
116 server->game_data.teams = malloc(sizeof(team_t) * (nb_value + 1));
117 if (server->game_data.teams == NULL)
118 return (-1);
119 server->game_data.teams[nb_value].team_name = NULL;
120 for (int i = 0; i < nb_value; i++) {
121 server->game_data.teams[i].team_name = strdup(names[i]);
122 if (server->game_data.teams[i].team_name == NULL)
123 return (-1);
124 server->game_data.teams[i].client_total = atoi(value);
125 if (init_player(server,
126 server->game_data.teams[i].client_total, i) == -1)
127 return (-1);
128 }
129 return (0);
130}
131
132static int init_map_content(server_handler_t *server)
133{
134 int x = server->game_data.map_size[0];
135 int y = server->game_data.map_size[1];
136
137 server->game_data.map = malloc(sizeof(map_t *) * (y + 1));
138 if (server->game_data.map == NULL) {
139 return (-1);
140 }
141 server->game_data.map[y] = NULL;
142 for (int j = 0; j < y; j++) {
143 server->game_data.map[j] = malloc(sizeof(map_t) * x);
144 if (server->game_data.map[j] == NULL) {
145 return (-1);
146 }
147 for (int i = 0; i < x; i++) {
148 server->game_data.map[j][i].player_nb = 0;
149 server->game_data.map[j][i].ressources = DEFAULT_RESSOURCES;
150 }
151 }
152 fill_map(server);
153 return (0);
154}
155
156int init_game_data(server_handler_t *server, struct arg_s **arguments)
157{
158 char *value = find_value_by_param((const struct arg_s **)arguments, "-f");
159
160 server->game_data.map = NULL;
161 server->game_data.teams = NULL;
162 if (value != NULL) {
163 server->game_data.frequence = atoi(value);
164 } else {
166 }
168 init_map_size(server, arguments);
169 init_ressources_quantity(server);
170 if (init_team_data(server, arguments) == -1) {
171 return (write_error_msg("Error: Internal server error.\n"));
172 }
173 if (init_map_content(server) == -1) {
174 return (write_error_msg("Error: Internal server error.\n"));
175 }
176 return (show_game_data(server, true));
177}
void init_client(cli_t client[MAX_CLIENT])
The function to initialize the cli_t structure.
#define SIBUR_DENSITY
Definition constants.h:34
#define LINEMATE_DENSITY
Definition constants.h:32
#define MENDIANE_DENSITY
Definition constants.h:35
#define THYSTAME_DENSITY
Definition constants.h:37
#define DEFAULT_FREQUENCE
! INITIALIZATION VALUE CONSTANTS !!
Definition constants.h:27
#define DERAUMERE_DENSITY
Definition constants.h:33
#define MAX_CLIENT
Definition constants.h:15
#define PHIRAS_DENSITY
Definition constants.h:36
#define UNKNOWN
Definition constants.h:16
#define FOOD_DENSITY
Definition constants.h:31
#define PLAYER_TIME
Definition constants.h:42
int init_game_data(server_handler_t *server, struct arg_s **arguments)
The function to initialize every game data.
int show_game_data(server_handler_t *server, bool need_to_show)
A function to display every data of the game.
void * value
Definition arg_parse.h:19
size_t nb_value
Definition arg_parse.h:18
A structure to store every client/player data.
int client_num
int pos[2]
char * team_name
direction_t direction
int time_life
ressources_t total_ressources
cli_t clients[MAX_CLIENT]
ressources_t ressources_quantity
A structure to store every tiles content (Must be an 2D array)
int player_nb
ressources_t ressources
A structure to store server general data.
game_data_t game_data
A structure to store every team data.
int client_num_list[MAX_CLIENT]
char * team_name
int client_total
void * find_value_by_param(const struct arg_s **arguments, char *param)
! FINDER !!
int find_index_by_param(const struct arg_s **arguments, char *param)
Find the index where a parameter is in the arg_s structure by his parameter.
void fill_map(server_handler_t *server)
Fill the map with ressources (use in initialization)
Definition fill.c:68
int write_error_msg(const char *str)
! WRITTER !!
Definition writer.c:11