142 lines
3.2 KiB
C
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);
|
|
}
|