/ src / parsing_map.c
parsing_map.c
  1  /* ************************************************************************** */
  2  /*                                                                            */
  3  /*                                                        :::      ::::::::   */
  4  /*   parsing_map.c                                      :+:      :+:    :+:   */
  5  /*                                                    +:+ +:+         +:+     */
  6  /*   By: ll-hotel <ll-hotel@student.42.fr>          +#+  +:+       +#+        */
  7  /*                                                +#+#+#+#+#+   +#+           */
  8  /*   Created: 2024/07/26 17:36:00 by ll-hotel          #+#    #+#             */
  9  /*   Updated: 2024/11/12 16:58:21 by ll-hotel         ###   ########.fr       */
 10  /*                                                                            */
 11  /* ************************************************************************** */
 12  
 13  #include "ft_dprintf.h"
 14  #include "ft_ptr.h"
 15  #include "parsing.h"
 16  #include "ft_basics.h"
 17  #include <errno.h>
 18  #include <stddef.h>
 19  #include <stdlib.h>
 20  #include <string.h>
 21  
 22  int			cell_is_player(int c);
 23  static char	**create_grid_from_lines(t_line *lines);
 24  static int	store_map_grid(t_cube *cube, char **grid);
 25  static int	store_player(t_cube *cube, char **grid);
 26  
 27  int	parsing_map(t_cube *cube, t_line *lines)
 28  {
 29  	char	**grid;
 30  
 31  	grid = create_grid_from_lines(lines);
 32  	if (grid == NULL)
 33  		return (0);
 34  	if (!grid_values_check(grid) || \
 35  			!grid_stretch_lines(grid) || \
 36  			!grid_wall_check(grid))
 37  	{
 38  		ft_free2((void **)grid, free);
 39  		return (0);
 40  	}
 41  	store_player(cube, grid);
 42  	return (store_map_grid(cube, grid));
 43  }
 44  
 45  static char	**create_grid_from_lines(t_line *lines)
 46  {
 47  	char	**grid;
 48  	int		size;
 49  	int		i;
 50  
 51  	i = -1;
 52  	while (lines[++i].ptr && !ft_isdigit(lines[i].key[0]))
 53  		if (lines[i].key[0] != 0 && ft_strcmp(lines[i].key, "NO") && \
 54  				ft_strcmp(lines[i].key, "SO") && ft_strcmp(lines[i].key, "EA") \
 55  				&& ft_strcmp(lines[i].key, "WE") && \
 56  				ft_strcmp(lines[i].key, "F") && ft_strcmp(lines[i].key, "C"))
 57  			return (ft_dprintf(2, "Error\nUnexpected key '%s'\n", \
 58  						lines[i].key), NULL);
 59  	size = 0;
 60  	while (lines[i + size].ptr != NULL)
 61  		size += 1;
 62  	grid = ft_calloc(size + 1, sizeof(*grid));
 63  	if (!grid)
 64  		return (NULL);
 65  	size = -1;
 66  	while (lines[i + ++size].ptr != NULL)
 67  	{
 68  		grid[size] = lines[i + size].ptr;
 69  		lines[i + size].ptr = NULL;
 70  	}
 71  	return (grid);
 72  }
 73  
 74  static int	store_player(t_cube *cube, char **grid)
 75  {
 76  	ulong	y;
 77  	ulong	x;
 78  
 79  	y = -1;
 80  	x = 0;
 81  	while (grid[++y])
 82  	{
 83  		x = 0;
 84  		while (grid[y][x] && !cell_is_player(grid[y][x]))
 85  			x += 1;
 86  		if (cell_is_player(grid[y][x]))
 87  			break ;
 88  	}
 89  	cube->player.pos.x = x + 0.5;
 90  	cube->player.pos.y = y + 0.5;
 91  	if (grid[y][x] == 'E')
 92  		cube->player.axis = 0;
 93  	else if (grid[y][x] == 'N')
 94  		cube->player.axis = PI * 0.5;
 95  	else if (grid[y][x] == 'W')
 96  		cube->player.axis = PI;
 97  	else if (grid[y][x] == 'S')
 98  		cube->player.axis = PI * 1.5;
 99  	grid[y][x] = FLOOR;
100  	return (1);
101  }
102  
103  static int	store_map_grid(t_cube *cube, char **grid)
104  {
105  	u_long	grid_size;
106  
107  	grid_size = 0;
108  	while (grid[grid_size] != NULL)
109  		grid_size += 1;
110  	cube->map.cells = ft_calloc(grid_size + 1, sizeof(*cube->map.cells));
111  	if (!cube->map.cells)
112  		return (ft_dprintf(2, "Error\n%s\n", strerror(errno)), 0);
113  	cube->map.height = grid_size;
114  	cube->map.width = ft_strlen(grid[0]);
115  	while (grid_size-- > 0)
116  		cube->map.cells[grid_size] = grid[grid_size];
117  	free(grid);
118  	return (1);
119  }