/* ************************************************************************** */ /* */ /* :::::::: */ /* parse_map.c :+: :+: */ /* +:+ */ /* By: qmennen +#+ */ /* +#+ */ /* Created: 2025/04/22 13:12:04 by whaffman #+# #+# */ /* Updated: 2025/06/10 19:14:51 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ #include "cub3d.h" #include 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); }