diff --git a/Makefile b/Makefile index 80de5a6..867ffa6 100644 --- a/Makefile +++ b/Makefile @@ -18,6 +18,7 @@ SRCS = $(SRCDIR)/main.c \ $(SRCDIR)/utils/utils.c \ $(SRCDIR)/utils/init.c \ $(SRCDIR)/utils/debug.c \ + $(SRCDIR)/parsing/check_map.c \ INCS = $(INCDIR)/parsing.h \ $(INCDIR)/cub.h \ diff --git a/cub3d b/cub3d index 660c7d5..e85885a 100755 Binary files a/cub3d and b/cub3d differ diff --git a/includes/cub.h b/includes/cub.h index 9375c66..cfafdc9 100644 --- a/includes/cub.h +++ b/includes/cub.h @@ -18,7 +18,8 @@ typedef struct s_data //////utils///// //utils void ft_error(char *message); -void free_char_array(char **array); +void free_char_array(char **array); +int ft_arrlen(char **arr); //init int init_data(t_data *data, char *path); void free_data(t_data *data); diff --git a/includes/messages.h b/includes/messages.h index 97b4559..dc6648b 100644 --- a/includes/messages.h +++ b/includes/messages.h @@ -20,7 +20,12 @@ #define ERROR_INIT_PARS "Initialization of the parsing structure failed." #define ERROR_EMPTY "You have provided an empty file." #define ERROR_COL "The RGB values provided are not valid." - +#define ERROR_NULL_P "Player not found or multiple players." +#define ERROR_BAD_CHAR "Invalid character in map." +#define ERROR_POS "Player position not found." +#define ERROR_ALLOC "Allocation failed." +#define ERROR_PLAYER "Player not found or multiple players." +#define ERROR_CHAR "Invalid character in map." +#define ERROR_NOT_CLOSE "Map is not closed by walls." #define DEBUG "test" - #endif \ No newline at end of file diff --git a/includes/parsing.h b/includes/parsing.h index c1c46a6..9714ac9 100644 --- a/includes/parsing.h +++ b/includes/parsing.h @@ -36,6 +36,7 @@ typedef struct s_data_parsing char **raw_map; int fd_map; int fd_map_dup; + int player[3]; } t_data_parsing; //parsing @@ -69,4 +70,7 @@ int get_rgb_values(char *line, int rgb[3]); //check_colors int check_colors(t_textures *texture); int is_rgb(int color[3]); + +// check_mao +int validate_map(char **map, int *player); #endif \ No newline at end of file diff --git a/libft/libft.a b/libft/libft.a index e187b83..e7c4b91 100644 Binary files a/libft/libft.a and b/libft/libft.a differ diff --git a/libft/obj/ft_atoi.o b/libft/obj/ft_atoi.o index ca72c3c..3049d5c 100644 Binary files a/libft/obj/ft_atoi.o and b/libft/obj/ft_atoi.o differ diff --git a/libft/obj/ft_atoll.o b/libft/obj/ft_atoll.o index 37c372c..a13c20a 100644 Binary files a/libft/obj/ft_atoll.o and b/libft/obj/ft_atoll.o differ diff --git a/libft/obj/ft_bzero.o b/libft/obj/ft_bzero.o index be086ff..cba45f1 100644 Binary files a/libft/obj/ft_bzero.o and b/libft/obj/ft_bzero.o differ diff --git a/libft/obj/ft_calloc.o b/libft/obj/ft_calloc.o index de633bf..ee13491 100644 Binary files a/libft/obj/ft_calloc.o and b/libft/obj/ft_calloc.o differ diff --git a/libft/obj/ft_isalnum.o b/libft/obj/ft_isalnum.o index 121d636..6f856ee 100644 Binary files a/libft/obj/ft_isalnum.o and b/libft/obj/ft_isalnum.o differ diff --git a/libft/obj/ft_isalpha.o b/libft/obj/ft_isalpha.o index ae2efe8..249afe4 100644 Binary files a/libft/obj/ft_isalpha.o and b/libft/obj/ft_isalpha.o differ diff --git a/libft/obj/ft_isascii.o b/libft/obj/ft_isascii.o index 6119c28..e28cafb 100644 Binary files a/libft/obj/ft_isascii.o and b/libft/obj/ft_isascii.o differ diff --git a/libft/obj/ft_isdigit.o b/libft/obj/ft_isdigit.o index bf0722d..87e05b9 100644 Binary files a/libft/obj/ft_isdigit.o and b/libft/obj/ft_isdigit.o differ diff --git a/libft/obj/ft_isprint.o b/libft/obj/ft_isprint.o index c72f58e..1e8a716 100644 Binary files a/libft/obj/ft_isprint.o and b/libft/obj/ft_isprint.o differ diff --git a/libft/obj/ft_itoa.o b/libft/obj/ft_itoa.o index 8c24108..57025c2 100644 Binary files a/libft/obj/ft_itoa.o and b/libft/obj/ft_itoa.o differ diff --git a/libft/obj/ft_lstadd_back_bonus.o b/libft/obj/ft_lstadd_back_bonus.o index 67c1f2e..a97b101 100644 Binary files a/libft/obj/ft_lstadd_back_bonus.o and b/libft/obj/ft_lstadd_back_bonus.o differ diff --git a/libft/obj/ft_lstadd_front_bonus.o b/libft/obj/ft_lstadd_front_bonus.o index 30a9e4f..f28ae9e 100644 Binary files a/libft/obj/ft_lstadd_front_bonus.o and b/libft/obj/ft_lstadd_front_bonus.o differ diff --git a/libft/obj/ft_lstclear_bonus.o b/libft/obj/ft_lstclear_bonus.o index 32ee2ef..6f6d6c7 100644 Binary files a/libft/obj/ft_lstclear_bonus.o and b/libft/obj/ft_lstclear_bonus.o differ diff --git a/libft/obj/ft_lstdelone_bonus.o b/libft/obj/ft_lstdelone_bonus.o index 953015a..fff510e 100644 Binary files a/libft/obj/ft_lstdelone_bonus.o and b/libft/obj/ft_lstdelone_bonus.o differ diff --git a/libft/obj/ft_lstiter_bonus.o b/libft/obj/ft_lstiter_bonus.o index 9933fd3..a51bda5 100644 Binary files a/libft/obj/ft_lstiter_bonus.o and b/libft/obj/ft_lstiter_bonus.o differ diff --git a/libft/obj/ft_lstlast_bonus.o b/libft/obj/ft_lstlast_bonus.o index e3f8e88..c9569a9 100644 Binary files a/libft/obj/ft_lstlast_bonus.o and b/libft/obj/ft_lstlast_bonus.o differ diff --git a/libft/obj/ft_lstmap_bonus.o b/libft/obj/ft_lstmap_bonus.o index 5f758e0..4d7d2bb 100644 Binary files a/libft/obj/ft_lstmap_bonus.o and b/libft/obj/ft_lstmap_bonus.o differ diff --git a/libft/obj/ft_lstnew_bonus.o b/libft/obj/ft_lstnew_bonus.o index 299d50d..5374b3d 100644 Binary files a/libft/obj/ft_lstnew_bonus.o and b/libft/obj/ft_lstnew_bonus.o differ diff --git a/libft/obj/ft_lstsize_bonus.o b/libft/obj/ft_lstsize_bonus.o index 5032c79..d7eb61a 100644 Binary files a/libft/obj/ft_lstsize_bonus.o and b/libft/obj/ft_lstsize_bonus.o differ diff --git a/libft/obj/ft_memchr.o b/libft/obj/ft_memchr.o index c3f003f..7df2b12 100644 Binary files a/libft/obj/ft_memchr.o and b/libft/obj/ft_memchr.o differ diff --git a/libft/obj/ft_memcmp.o b/libft/obj/ft_memcmp.o index 6275aad..eeaea53 100644 Binary files a/libft/obj/ft_memcmp.o and b/libft/obj/ft_memcmp.o differ diff --git a/libft/obj/ft_memcpy.o b/libft/obj/ft_memcpy.o index 795ca66..78b03bb 100644 Binary files a/libft/obj/ft_memcpy.o and b/libft/obj/ft_memcpy.o differ diff --git a/libft/obj/ft_memmove.o b/libft/obj/ft_memmove.o index f2a2d83..6cb3598 100644 Binary files a/libft/obj/ft_memmove.o and b/libft/obj/ft_memmove.o differ diff --git a/libft/obj/ft_memset.o b/libft/obj/ft_memset.o index 25fbb68..72099e8 100644 Binary files a/libft/obj/ft_memset.o and b/libft/obj/ft_memset.o differ diff --git a/libft/obj/ft_putchar_fd.o b/libft/obj/ft_putchar_fd.o index 7f16461..611135a 100644 Binary files a/libft/obj/ft_putchar_fd.o and b/libft/obj/ft_putchar_fd.o differ diff --git a/libft/obj/ft_putendl_fd.o b/libft/obj/ft_putendl_fd.o index 45e092e..ede5fe9 100644 Binary files a/libft/obj/ft_putendl_fd.o and b/libft/obj/ft_putendl_fd.o differ diff --git a/libft/obj/ft_putnbr_fd.o b/libft/obj/ft_putnbr_fd.o index 6dd260e..ae4c7e0 100644 Binary files a/libft/obj/ft_putnbr_fd.o and b/libft/obj/ft_putnbr_fd.o differ diff --git a/libft/obj/ft_putstr_fd.o b/libft/obj/ft_putstr_fd.o index 70dfe77..34af8ad 100644 Binary files a/libft/obj/ft_putstr_fd.o and b/libft/obj/ft_putstr_fd.o differ diff --git a/libft/obj/ft_split.o b/libft/obj/ft_split.o index 8bbdd52..bf1faac 100644 Binary files a/libft/obj/ft_split.o and b/libft/obj/ft_split.o differ diff --git a/libft/obj/ft_straddchar.o b/libft/obj/ft_straddchar.o index 457b929..7086024 100644 Binary files a/libft/obj/ft_straddchar.o and b/libft/obj/ft_straddchar.o differ diff --git a/libft/obj/ft_strchr.o b/libft/obj/ft_strchr.o index 5c63d94..bcf3a07 100644 Binary files a/libft/obj/ft_strchr.o and b/libft/obj/ft_strchr.o differ diff --git a/libft/obj/ft_strcmp.o b/libft/obj/ft_strcmp.o index d23b9c1..0ec078f 100644 Binary files a/libft/obj/ft_strcmp.o and b/libft/obj/ft_strcmp.o differ diff --git a/libft/obj/ft_strcpy.o b/libft/obj/ft_strcpy.o index 360c3a7..2155ac2 100644 Binary files a/libft/obj/ft_strcpy.o and b/libft/obj/ft_strcpy.o differ diff --git a/libft/obj/ft_strdup.o b/libft/obj/ft_strdup.o index f9669a9..1e68a64 100644 Binary files a/libft/obj/ft_strdup.o and b/libft/obj/ft_strdup.o differ diff --git a/libft/obj/ft_striteri.o b/libft/obj/ft_striteri.o index 1341711..354eef1 100644 Binary files a/libft/obj/ft_striteri.o and b/libft/obj/ft_striteri.o differ diff --git a/libft/obj/ft_strjoin.o b/libft/obj/ft_strjoin.o index f67b4ef..f784d14 100644 Binary files a/libft/obj/ft_strjoin.o and b/libft/obj/ft_strjoin.o differ diff --git a/libft/obj/ft_strlcat.o b/libft/obj/ft_strlcat.o index 94339c9..20ccf96 100644 Binary files a/libft/obj/ft_strlcat.o and b/libft/obj/ft_strlcat.o differ diff --git a/libft/obj/ft_strlcpy.o b/libft/obj/ft_strlcpy.o index 040be82..938d5e6 100644 Binary files a/libft/obj/ft_strlcpy.o and b/libft/obj/ft_strlcpy.o differ diff --git a/libft/obj/ft_strlen.o b/libft/obj/ft_strlen.o index 2b75faf..05d939b 100644 Binary files a/libft/obj/ft_strlen.o and b/libft/obj/ft_strlen.o differ diff --git a/libft/obj/ft_strmapi.o b/libft/obj/ft_strmapi.o index 87c09a4..8387053 100644 Binary files a/libft/obj/ft_strmapi.o and b/libft/obj/ft_strmapi.o differ diff --git a/libft/obj/ft_strncmp.o b/libft/obj/ft_strncmp.o index fb4b9f4..2d114f2 100644 Binary files a/libft/obj/ft_strncmp.o and b/libft/obj/ft_strncmp.o differ diff --git a/libft/obj/ft_strnstr.o b/libft/obj/ft_strnstr.o index b13c723..1e89f1b 100644 Binary files a/libft/obj/ft_strnstr.o and b/libft/obj/ft_strnstr.o differ diff --git a/libft/obj/ft_strrchr.o b/libft/obj/ft_strrchr.o index 482fbe3..e963234 100644 Binary files a/libft/obj/ft_strrchr.o and b/libft/obj/ft_strrchr.o differ diff --git a/libft/obj/ft_strtrim.o b/libft/obj/ft_strtrim.o index 09ca38f..eb359fd 100644 Binary files a/libft/obj/ft_strtrim.o and b/libft/obj/ft_strtrim.o differ diff --git a/libft/obj/ft_substr.o b/libft/obj/ft_substr.o index e8b22b9..b00a21e 100644 Binary files a/libft/obj/ft_substr.o and b/libft/obj/ft_substr.o differ diff --git a/libft/obj/ft_tolower.o b/libft/obj/ft_tolower.o index 874f0c6..497a66a 100644 Binary files a/libft/obj/ft_tolower.o and b/libft/obj/ft_tolower.o differ diff --git a/srcs/parsing/check_map.c b/srcs/parsing/check_map.c new file mode 100644 index 0000000..1f45fd2 --- /dev/null +++ b/srcs/parsing/check_map.c @@ -0,0 +1,157 @@ +#include "cub.h" + +int has_playable_neighbor(int x, int y, char **map) +{ + if (map[y] && map[y][x + 1] && + (map[y][x + 1] == '0' || map[y][x + 1] == 'N' || + map[y][x + 1] == 'S' || map[y][x + 1] == 'E' || + map[y][x + 1] == 'W')) + return (1); + if (x > 0 && map[y][x - 1] && + (map[y][x - 1] == '0' || map[y][x - 1] == 'N' || + map[y][x - 1] == 'S' || map[y][x - 1] == 'E' || + map[y][x - 1] == 'W')) + return (1); + if (map[y + 1] && map[y + 1][x] && + (map[y + 1][x] == '0' || map[y + 1][x] == 'N' || + map[y + 1][x] == 'S' || map[y + 1][x] == 'E' || + map[y + 1][x] == 'W')) + return (1); + if (y > 0 && map[y - 1] && map[y - 1][x] && + (map[y - 1][x] == '0' || map[y - 1][x] == 'N' || + map[y - 1][x] == 'S' || map[y - 1][x] == 'E' || + map[y - 1][x] == 'W')) + return (1); + return (0); +} + +int check_isolated_walls(char **map) +{ + int i = 0; + int j; + + while (map[i]) + { + j = 0; + while (map[i][j]) + { + if (map[i][j] == '1') + { + if (!has_playable_neighbor(j, i, map)) + return (0); // '1' isolé détecté + } + j++; + } + i++; + } + return (1); // Pas de '1' isolé +} + +int check_map_char(char **map) +{ + int i = 0; + int j; + int p = 0; + + while (map[i]) + { + j = 0; + while (map[i][j]) + { + if (map[i][j] == '1' || map[i][j] == '0' || + map[i][j] == ' ' || map[i][j] == '\n') + j++; + else if (map[i][j] == 'S' || map[i][j] == 'N' || + map[i][j] == 'E' || map[i][j] == 'W') + { + j++; + p++; + } + else + return (2); + } + i++; + } + if (p != 1) + return (1); + return (0); +} + +void find_player_pos(char **map, int *player) +{ + int i = 0; + int j; + + while (map[i]) + { + j = 0; + while (map[i][j]) + { + if (map[i][j] == 'S' || map[i][j] == 'N' || + map[i][j] == 'E' || map[i][j] == 'W') + { + player[0] = j; + player[1] = i; + player[2] = map[i][j]; + return; + } + j++; + } + i++; + } +} + +int is_closed_at(int x, int y, char **map) +{ + if (!map[y] || !map[y][x] || map[y][x] == '\0') + return (0); + if (map[y][x] == ' ') + return (0); + return (1); +} + +int check_walls(char **map) +{ + int i = 0; + int j; + + while (map[i]) + { + j = 0; + while (map[i][j]) + { + if (map[i][j] == '0' || map[i][j] == 'N' || + map[i][j] == 'S' || map[i][j] == 'E' || map[i][j] == 'W') + { + if (!is_closed_at(j + 1, i, map) || + !is_closed_at(j - 1, i, map) || + !is_closed_at(j, i + 1, map) || + !is_closed_at(j, i - 1, map)) + return (0); + } + j++; + } + i++; + } + return (1); +} + +int validate_map(char **map, int *player) +{ + int result; + + result = check_map_char(map); + if (result == 1) + return (ft_error(ERROR_PLAYER), 1); + if (result == 2) + return (ft_error(ERROR_CHAR), 1); + + find_player_pos(map, player); + + if (!check_walls(map)) + return (ft_error(ERROR_NOT_CLOSE), 1); + // if (!check_isolated_walls(map)) + // return (ft_error("Isolated wall detected"), 1); + return (0); +} + diff --git a/srcs/parsing/parsing.c b/srcs/parsing/parsing.c index 65ebb8f..9d2287a 100644 --- a/srcs/parsing/parsing.c +++ b/srcs/parsing/parsing.c @@ -20,5 +20,7 @@ int parsing(t_data *data) close(data->parsing.fd_map_dup); if (check_colors(data->texture) == 1) return (1); + if (validate_map(data->parsing.raw_map, data->parsing.player) == 0) + return (1); return (0); -} \ No newline at end of file +} diff --git a/srcs/utils/init.c b/srcs/utils/init.c index 5316358..bae7a86 100644 --- a/srcs/utils/init.c +++ b/srcs/utils/init.c @@ -32,4 +32,3 @@ void free_data(t_data *data) if (data->texture) free(data->texture); } - diff --git a/srcs/utils/utils.c b/srcs/utils/utils.c index 5f30607..8254fc6 100644 --- a/srcs/utils/utils.c +++ b/srcs/utils/utils.c @@ -34,4 +34,12 @@ void free_char_array(char **array) while (array[i]) free(array[i++]); free(array); +} + +int ft_arrlen(char **arr) +{ + int i; + while(arr[i]) + i++; + return (i); } \ No newline at end of file diff --git a/test.cub b/test.cub index 71edc13..e9e371b 100644 --- a/test.cub +++ b/test.cub @@ -18,16 +18,17 @@ NO textures/test/north.xpm WE textures/test/west.xpm C 200,200,200 - 11111 +F 200,200,200 + 11 + 1001 +10S01 10001 -10S01 +10101 10001 -10001 -10001 -11001 +10001 10001 10001 10001 10001 10001 -11111 + 11