42_solong/bonus/map.c
2023-01-16 18:38:47 +01:00

140 lines
3.1 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* map.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: cchauvet <cchauvet@student.42angouleme.fr +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/01/05 13:51:49 by cchauvet #+# #+# */
/* Updated: 2023/01/13 13:56:07 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_map *map)
{
size_t x;
size_t y;
y = 1;
while (map->patern[y + 1] != NULL)
{
x = 0;
while (x < ft_strlen(map->patern[y]))
{
if (map->patern[y][x] == 'P')
{
map->player_pos[0] = x;
map->player_pos[1] = y;
}
if (map->patern[y][x] == 'E')
{
map->exit_pos[0] = x;
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)
{
ft_freer_tab_ultimate(1, map->patern);
free(map);
return (NULL);
}
return (map);
}
static char *ft_get_line(const char *line, ssize_t player_x)
{
char *out;
ssize_t start;
ssize_t stop;
ssize_t i;
ssize_t y;
out = ft_strgen('0', RENDER_DISTANCE * 2 + 1);
if (out == NULL)
return (NULL);
start = player_x - (RENDER_DISTANCE);
if (start < 0)
start = 0;
stop = player_x + RENDER_DISTANCE + 1;
if (stop > (ssize_t) ft_strlen(line))
stop = ft_strlen(line);
i = 0;
y = player_x - RENDER_DISTANCE - start;
if (y < 0)
y = -y;
while (start + i < stop)
{
out[y + i] = line[i + start];
i++;
}
return (out);
}
char **ft_get_player_map(t_map map)
{
char **player_map;
ssize_t y;
ssize_t i;
player_map = ft_calloc(RENDER_DISTANCE * 2 + 2, sizeof(char *));
if (player_map == NULL)
return (NULL);
i = map.player_pos[1] - RENDER_DISTANCE;
if (i < 0)
i = 0;
y = -1;
while (++y < RENDER_DISTANCE * 2 + 1)
{
if (map.player_pos[1] + y >= RENDER_DISTANCE && map.patern[i] != NULL)
player_map[y] = ft_get_line(map.patern[i++], map.player_pos[0]);
else
player_map[y] = ft_strgen('0', RENDER_DISTANCE * 2 + 1);
if (player_map[y] == NULL)
{
ft_cancel(player_map, y);
return (NULL);
}
}
player_map[y] = NULL;
return (player_map);
}