cub3d/src/parser/parse_map.c
2025-05-04 17:03:40 +02:00

97 lines
2.4 KiB
C

/* ************************************************************************** */
/* */
/* :::::::: */
/* parse_map.c :+: :+: */
/* +:+ */
/* By: whaffman <whaffman@student.codam.nl> +#+ */
/* +#+ */
/* Created: 2025/04/22 13:12:04 by whaffman #+# #+# */
/* Updated: 2025/05/04 15:07:44 by whaffman ######## odam.nl */
/* */
/* ************************************************************************** */
#include "cub3d.h"
#include <math.h>
t_vec2 parse_dir(int x, int y)
{
t_vec2 dir;
dir.x = (float)x;
dir.y = (float)y;
return (dir);
}
int parse_player(t_game *game, int y, int x, char c)
{
t_player *player;
player = game->player;
player->pos.x = ((float)x + 0.5f);
player->pos.y = ((float)y + 0.5f);
if (c == 'N')
player->dir = parse_dir(0, -1);
else if (c == 'E')
player->dir = parse_dir(1, 0);
else if (c == 'S')
player->dir = parse_dir(0, 1);
else if (c == 'W')
player->dir = parse_dir(-1, 0);
player->camera = rot(player->dir, 0.5f * M_PI);
return (SUCCESS);
}
int parse_map_line(char **lines, t_game *game, int y)
{
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(lines[y][x]);
if (map->grid[y][x] == TILE_PLAYER)
parse_player(game, y, x, lines[y][x]);
else if (map->grid[y][x] == -2)
return (FAILURE);
if (map->grid[y][x] == -2)
return (FAILURE);
x++;
}
return (SUCCESS);
}
int parse_map(char **lines, t_game *game)
{
int y;
t_map *map;
y = 0;
while (lines[y])
y++;
map = game->map;
map->height = y;
map->width = map_width(lines);
map->grid = malloc(sizeof(t_tile *) * (map->height + 1));
if (!map->grid)
return (FAILURE);
y = 0;
while (y < map->height)
{
if (!parse_map_line(lines, game, y))
return (map_free(map), FAILURE);
y++;
}
map->grid[y] = NULL;
return (SUCCESS);
}