97 lines
2.4 KiB
C
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);
|
|
}
|