cub3d/src/parser/parse_map.c

114 lines
3.0 KiB
C

/* ************************************************************************** */
/* */
/* :::::::: */
/* parse_map.c :+: :+: */
/* +:+ */
/* By: qmennen <qmennen@student.codam.nl> +#+ */
/* +#+ */
/* Created: 2025/04/22 13:12:04 by whaffman #+# #+# */
/* Updated: 2025/06/10 19:14:51 by whaffman ######## odam.nl */
/* */
/* ************************************************************************** */
#include "cub3d.h"
#include <math.h>
int parse_player(t_game *game, int y, int x, char c)
{
t_player *player;
player = game->player;
if (player->pos.x != -1 || player->pos.y != -1)
{
ft_putstr_fd("Error: Multiple players found\n", 2);
return (FAILURE);
}
player->pos.x = ((double)x + 0.5f);
player->pos.y = ((double)y + 0.5f);
if (c == 'N')
player->dir = (t_vec2){0.0, -1.0};
else if (c == 'E')
player->dir = (t_vec2){1.0, 0.0};
else if (c == 'S')
player->dir = (t_vec2){0.0, 1.0};
else if (c == 'W')
player->dir = (t_vec2){-1.0, 0.0};
player->camera = rot(player->dir, 0.5f * M_PI);
return (SUCCESS);
}
int parse_map_line(char **lines, t_game *game, int y)
{
unsigned int x;
t_map *map;
map = game->map;
map->grid[y] = malloc(sizeof(t_tile) * (map->width + 1));
if (!map->grid[y])
return (FAILURE);
x = 0;
while (x < map->width)
{
if (x >= ft_strlen(lines[y]))
map->grid[y][x] = TILE_VOID;
else
map->grid[y][x] = parse_tile(game, lines[y][x]);
if (map->grid[y][x] == TILE_PLAYER)
{
if (!parse_player(game, y, x, lines[y][x]))
return (FAILURE);
}
if (map->grid[y][x] == -2)
return (FAILURE);
x++;
}
return (SUCCESS);
}
int prepare_map(char **lines, t_game *game)
{
int y;
t_map *map;
map = game->map;
y = 0;
map->n_sprites_max = 0;
map->n_sprites = 0;
while (lines[y])
{
map->n_sprites_max += count_sprites(lines[y]);
y++;
}
map->height = y;
map->width = map_width(lines);
map->grid = malloc(sizeof(t_tile *) * (map->height + 1));
if (!map->grid)
return (FAILURE);
ft_memset(map->grid, 0, sizeof(t_tile *) * (map->height + 1));
map->sprites = malloc(sizeof(t_sprite) * (map->n_sprites_max + 1));
if (!map->sprites)
return (FAILURE);
ft_memset(map->sprites, 0, sizeof(t_sprite) * (map->n_sprites_max + 1));
return (SUCCESS);
}
int parse_map(char **lines, t_game *game)
{
unsigned int y;
t_map *map;
map = game->map;
if (!prepare_map(lines, game))
return (FAILURE);
y = 0;
while (y < map->height)
{
if (!parse_map_line(lines, game, y))
return (FAILURE);
if (!parse_map_line_sprites(lines[y], game, y))
return (FAILURE);
y++;
}
return (SUCCESS);
}