114 lines
3.0 KiB
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);
|
|
}
|