42_solong/map.c
Camille Chauvet 195f7bc66a ca marche
2023-01-09 20:41:06 +01:00

142 lines
3.2 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* map.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: cchauvet <cchauvet@student.42angouleme.fr +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/01/05 13:51:49 by cchauvet #+# #+# */
/* Updated: 2023/01/09 19:56:25 by cchauvet ### ########.fr */
/* */
/* ************************************************************************** */
#include "solong.h"
char **ft_readfile(char *path)
{
char **map;
int fd;
size_t nb_line;
fd = open(path, O_RDONLY);
nb_line = 1;
map = ft_calloc(sizeof(char *), 2);
if (map == NULL)
return (NULL);
map[0] = get_next_line(fd);
while (map[nb_line - 1] != NULL)
{
ft_strchr(map[nb_line - 1], '\n')[0] = '\0';
map[nb_line] = get_next_line(fd);
map = ft_tabrealloc(map, nb_line + 1, nb_line + 2);
if (map == NULL)
return (NULL);
nb_line++;
}
return (map);
}
void ft_fill_pos(t_data *data)
{
size_t x;
size_t y;
y = 0;
while (data->map->patern[y] != NULL)
{
x = 0;
while (x < ft_strlen(data->map->patern[y]))
{
if (data->map->patern[y][x] == 'P')
{
data->map->player_pos[0] = x;
data->map->player_pos[1] = y;
}
if (data->map->patern[y][x] == 'E')
{
data->map->exit_pos[0] = x;
data->map->exit_pos[1] = y;
}
x++;
}
y++;
}
}
t_map *ft_getmap(char *path)
{
t_map *map;
map = ft_calloc(sizeof(t_map), 1);
if (map == NULL)
return (NULL);
map->patern = ft_readfile(path);
if (ft_map_is_correct(map) == 0)
return (NULL);
return (map);
}
static char *ft_get_line(const char *line, size_t player_x)
{
char *out;
size_t start;
size_t stop;
size_t temp;
size_t i;
temp = ft_strlen(line);
if (player_x + RENDER_DISTANCE > temp)
stop = temp;
else
stop = player_x + RENDER_DISTANCE;
if (player_x < RENDER_DISTANCE + 1)
start = RENDER_DISTANCE - player_x;
else
start = player_x - RENDER_DISTANCE;
if (RENDER_DISTANCE > player_x)
temp = 0;
else
temp = player_x - RENDER_DISTANCE;
out = ft_strgen('0', RENDER_DISTANCE * 2 + 1);
if (out == NULL)
return (NULL);
i = 0;
while (i < stop + 1)
{
out[start + i] = line[temp + i];
i++;
}
return (out);
}
char **ft_get_player_map(t_map map)
{
char **player_map;
size_t y;
size_t i;
player_map = ft_calloc(RENDER_DISTANCE * 2 + 2, sizeof(char *));
if (player_map == NULL)
return (NULL);
i = 0;
y = 0;
while (y < RENDER_DISTANCE * 2 + 1)
{
player_map[y] = ft_strgen('0', RENDER_DISTANCE * 2 + 1);
if (map.player_pos[1] + y >= RENDER_DISTANCE && map.patern[i] != NULL)
{
free(player_map[y]);
player_map[y] = ft_get_line(map.patern[i], map.player_pos[0]);
i++;
}
if (player_map[y] == NULL)
{
ft_cancel(player_map, y);
return (NULL);
}
y++;
}
player_map[y] = NULL;
return (player_map);
}