cub3d/src/map/map_create.c
2025-05-28 14:23:42 +02:00

80 lines
2.4 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* map_create.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/04/23 12:21:13 by whaffman #+# #+# */
/* Updated: 2025/05/28 13:20:00 by qmennen ### ########.fr */
/* */
/* ************************************************************************** */
#include "cub3d.h"
static int map_allocate(t_game **game)
{
(*game)->map = malloc(sizeof(t_map));
if (!(*game)->map)
{
perror("Error allocating memory for (*game)->map");
return (FAILURE);
}
ft_memset((*game)->map, 0, sizeof(t_map));
(*game)->map->sprite_lib = malloc(sizeof(t_sprite_lib) * 26);
if (!(*game)->map->sprite_lib)
{
perror("Error allocating memory for (*game)->map->sprite_lib");
free((*game)->map);
return (FAILURE);
}
ft_memset((*game)->map->sprite_lib, 0, sizeof(t_sprite_lib) * 26);
return (SUCCESS);
}
static int map_parse_and_copy(t_game **game,
const char *mapfile, t_tile ***out_grid)
{
t_tile **grid;
if (!parse_args(mapfile, (*game)))
return (FAILURE);
grid = copy_map((*game)->map->grid,
(*game)->map->width, (*game)->map->height);
if (!grid)
{
perror("Error copying (*game)->map");
free((*game)->map);
return (FAILURE);
}
*out_grid = grid;
return (SUCCESS);
}
static int map_validate_and_finalize(t_game **game, t_tile **grid)
{
if (!enclosed_map((*game)->map))
{
ft_putendl_fd("Map is not enclosed", STDERR_FILENO);
grid_free(grid, (*game)->map->height);
map_free((*game)->map);
return (FAILURE);
}
grid_free((*game)->map->grid, (*game)->map->height);
(*game)->map->grid = grid;
return (SUCCESS);
}
int map_create(t_game **game, const char *mapfile)
{
t_tile **grid;
if (!(*game))
return (FAILURE);
if (map_allocate(game) == FAILURE)
return (FAILURE);
if (map_parse_and_copy(game, mapfile, &grid) == FAILURE)
return (FAILURE);
return (map_validate_and_finalize(game, grid));
}