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 }