diff --git a/Makefile b/Makefile index ec45ebf..1d9e69a 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: apommier +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2022/02/13 16:27:49 by apommier #+# #+# # -# Updated: 2022/06/16 16:16:21 by apommier ### ########.fr # +# Updated: 2022/06/16 16:38:38 by apommier ### ########.fr # # # # **************************************************************************** # @@ -22,13 +22,16 @@ SRCS = srcs/main.c\ srcs/utils/cub_utils.c\ srcs/utils/quit_game.c\ srcs/parsing/parse_map.c\ + srcs/parsing/is_a_file.c\ + srcs/parsing/check_map.c\ + srcs/parsing/check_map_utils.c\ srcs/parsing/utils_parsing.c\ srcs/parsing/check_color_texture.c OBJS = ${SRCS:.c=.o} CC = gcc LIB = -L ./mlx -lmlx -lXext -lX11 -lm -CFLAGS = -Wall -Wextra -g +CFLAGS = -Wall -Wextra -Werror -g RM = rm -rf LIBFT = ./libft diff --git a/includes/Cub3D.h b/includes/Cub3D.h index aa4c214..91531f3 100644 --- a/includes/Cub3D.h +++ b/includes/Cub3D.h @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/02/13 16:30:59 by apommier #+# #+# */ -/* Updated: 2022/06/16 16:18:45 by apommier ### ########.fr */ +/* Updated: 2022/06/16 16:38:18 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -133,7 +133,7 @@ typedef struct draw_ray_var { double vx; double vy; int count; - double aTan; + double tan; int nb_ray; int my; int mx; @@ -142,12 +142,25 @@ typedef struct draw_ray_var { char horizontal_type; } t_var_draw_ray; - char *transform_map(char **double_map, t_data *img); int check_texture_color(char **tab, t_data *img); int check_map(char **av, t_data *img); void ft_exit(char *str, t_data *img); +void find_angle(char c, t_data *img); +void size_line(char *str, t_data *img); +void check_inner(char **map, t_data *img); +void check_border(char **tab, t_data *img); + +void verify_texture_color(t_data *img); +void error_msg(t_data *img); +void inter_map(char **split, char **tmp, t_data *img); +void check_empty_line(char **split, t_data *img, int *i); +void check_zero_one(char **split, t_data *img); + +char *charge_new(t_data *img, char **map, char **tmp_map); +char **isafile(char **av, t_data *img); + void set_back(t_data *img); unsigned char *get_texture(char type, char *path, t_data *img); int get_color(char one, char two, char three); diff --git a/srcs/cast_ray/find_wall.c b/srcs/cast_ray/find_wall.c index 61c824d..ce9b7c5 100644 --- a/srcs/cast_ray/find_wall.c +++ b/srcs/cast_ray/find_wall.c @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/06/16 16:15:16 by apommier #+# #+# */ -/* Updated: 2022/06/16 16:19:20 by apommier ### ########.fr */ +/* Updated: 2022/06/16 16:21:20 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -40,21 +40,21 @@ void find_horizontal_wall(t_var_draw_ray *info, t_data *img) void horizontal_ray(t_var_draw_ray *hr, t_data *img) { hr->count = 0; - hr->aTan = 1.0 / hr->aTan; + hr->tan = 1.0 / hr->tan; if (sin(deg_to_rad(hr->ray_angle)) > 0.001) { hr->ray_y = (((int)img->player.y >> 6) << 6) - 0.0001; - hr->ray_x = (img->player.y - hr->ray_y) * hr->aTan + img->player.x; + hr->ray_x = (img->player.y - hr->ray_y) * hr->tan + img->player.x; hr->next_y = -64; - hr->next_x = -hr->next_y * hr->aTan; + hr->next_x = -hr->next_y * hr->tan; hr->horizontal_type = 'N'; } else if (sin(deg_to_rad(hr->ray_angle)) < -0.001) { hr->ray_y = (((int)img->player.y >> 6) << 6) + 64; - hr->ray_x = (img->player.y - hr->ray_y) * hr->aTan + img->player.x; + hr->ray_x = (img->player.y - hr->ray_y) * hr->tan + img->player.x; hr->next_y = 64; - hr->next_x = -hr->next_y * hr->aTan; + hr->next_x = -hr->next_y * hr->tan; hr->horizontal_type = 'S'; } else @@ -95,21 +95,21 @@ void find_vertical_wall(t_var_draw_ray *info, t_data *img) void vertical_ray(t_var_draw_ray *vr, t_data *img) { - vr->aTan = tan(deg_to_rad(vr->ray_angle)); + vr->tan = tan(deg_to_rad(vr->ray_angle)); if (cos(deg_to_rad(vr->ray_angle)) > 0.001) { vr->ray_x = (((int)img->player.x >> 6) << 6) + 64; - vr->ray_y = (img->player.x - vr->ray_x) * vr->aTan + img->player.y; + vr->ray_y = (img->player.x - vr->ray_x) * vr->tan + img->player.y; vr->next_x = 64; - vr->next_y = -vr->next_x * vr->aTan; + vr->next_y = -vr->next_x * vr->tan; vr->vertical_type = 'E'; } else if (cos(deg_to_rad(vr->ray_angle)) < -0.001) { vr->ray_x = (((int)img->player.x >> 6) << 6) - 0.0001; - vr->ray_y = (img->player.x - vr->ray_x) * vr->aTan + img->player.y; + vr->ray_y = (img->player.x - vr->ray_x) * vr->tan + img->player.y; vr->next_x = -64; - vr->next_y = -vr->next_x * vr->aTan; + vr->next_y = -vr->next_x * vr->tan; vr->vertical_type = 'W'; } else @@ -134,7 +134,7 @@ void set_info_draw(t_var_draw_ray *info) info->vx = 0; info->vy = 0; info->count = 0; - info->aTan = 0; + info->tan = 0; info->nb_ray = -1; info->my = 0; info->mx = 0; diff --git a/srcs/parsing/check_map.c b/srcs/parsing/check_map.c new file mode 100644 index 0000000..3ba046c --- /dev/null +++ b/srcs/parsing/check_map.c @@ -0,0 +1,92 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* check_map.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: apommier +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/06/16 16:26:58 by apommier #+# #+# */ +/* Updated: 2022/06/16 16:29:06 by apommier ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../../includes/Cub3D.h" + +void close_or_not(char **tab, int i, int j, t_data *img) +{ + if (tab[i + 1][j] == '3' || tab[i - 1][j] == '3') + img->map.error = 1; + if (tab[i][j + 1] == '3' || tab[i][j - 1] == '3') + img->map.error = 1; + if (tab[i + 1][j + 1] == '3' || tab[i + 1][j - 1] == '3') + img->map.error = 1; + if (tab[i - 1][j + 1] == '3' || tab[i - 1][j - 1] == '3') + img->map.error = 1; + if (img->map.error != 1) + img->map.error = 0; +} + +void check_border(char **tab, t_data *img) +{ + int i; + int j; + + i = 0; + while (tab[i]) + { + j = 0; + while (tab[i][j]) + { + if (tab[i][j] == '0' || tab[i][j] == 'W' || tab[i][j] == 'N' + || tab[i][j] == 'S' || tab[i][j] == 'E') + close_or_not(tab, i, j, img); + j++; + } + i++; + } +} + +int check_inner_utils(char *line, t_data *img) +{ + int i; + int player; + + i = 0; + player = 0; + while (line[i]) + { + if (line[i] == 'N' || line[i] == 'S' + || line[i] == 'E' || line[i] == 'W') + { + find_angle(line[i], img); + img->player.x = i * 64 - 32; + player++; + } + else if (line[i] != '3' && line[i] != '0' && line[i] != '1') + return (100); + i++; + } + return (player); +} + +void check_inner(char **map, t_data *img) +{ + int i; + int player; + + i = 0; + player = 0; + while (map[i]) + { + player += check_inner_utils(map[i], img); + if (player == 1 && !img->player.y) + img->player.y = i * 64 - 32; + i++; + } + if (player == 0) + img->map.error = 2; + if (player > 1 && player < 100) + img->map.error = 3; + if (player >= 100) + img->map.error = -1; +} diff --git a/srcs/parsing/check_map_utils.c b/srcs/parsing/check_map_utils.c new file mode 100644 index 0000000..19d6705 --- /dev/null +++ b/srcs/parsing/check_map_utils.c @@ -0,0 +1,102 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* check_map_utils.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: apommier +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/06/16 16:30:52 by apommier #+# #+# */ +/* Updated: 2022/06/16 16:32:55 by apommier ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../../includes/Cub3D.h" + +void verify_texture_color(t_data *img) +{ + if (img->map.texture.north == NULL) + ft_exit("Error\nTexture isn't loaded properly\n", img); + if (img->map.texture.east == NULL) + ft_exit("Error\nTexture isn't loaded properly\n", img); + if (img->map.texture.south == NULL) + ft_exit("Error\nTexture isn't loaded properly\n", img); + if (img->map.texture.west == NULL) + ft_exit("Error\nTexture isn't loaded properly\n", img); + if (img->map.floor.set != 1) + ft_exit("Error\nColor not set properly\n", img); + if (img->map.sky.set != 1) + ft_exit("Error\nColor not set properly\n", img); +} + +void error_msg(t_data *img) +{ + if (img->map.error == 1) + ft_exit("Error\nMap isn't closed\n", img); + if (img->map.error == 2) + ft_exit("Error\nMissing player\n", img); + if (img->map.error == 3) + ft_exit("Error\nToo many players\n", img); + if (img->map.error == -1) + ft_exit("Error\nBad character in map\n", img); +} + +void inter_map(char **split, char **tmp, t_data *img) +{ + int i; + int j; + + i = 0; + while (split[i]) + { + j = 0; + while (split[i][j]) + { + if (split[i][j] == '3') + img->map.error = -1; + else if (split[i][j] != ' ') + tmp[i + 1][j + 1] = split[i][j]; + j++; + } + i++; + } +} + +void check_empty_line(char **split, t_data *img, int *i) +{ + while (split[*i]) + { + if (!ft_strchr(split[*i], '1')) + ft_exit("Error\nInvalid line in map file\n", img); + size_line(split[*i], img); + (*i)++; + } +} + +void check_zero_one(char **split, t_data *img) +{ + char **tmp; + int i; + + i = 0; + check_empty_line(split, img, &i); + img->map.y = i; + tmp = malloc(sizeof(char *) * (i + 3)); + if (!tmp) + quit_game(img); + i = 0; + while (i < img->map.y + 2) + { + tmp[i] = charge_new(img, split, tmp); + i++; + } + tmp[i] = NULL; + inter_map(split, tmp, img); + if (img->map.error == -1) + { + free_double(tmp); + return ; + } + check_border(tmp, img); + check_inner(tmp, img); + free_double(tmp); +} diff --git a/srcs/parsing/is_a_file.c b/srcs/parsing/is_a_file.c new file mode 100644 index 0000000..597179d --- /dev/null +++ b/srcs/parsing/is_a_file.c @@ -0,0 +1,52 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* is_a_file.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: apommier +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/06/16 16:37:43 by apommier #+# #+# */ +/* Updated: 2022/06/16 16:38:57 by apommier ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../../includes/Cub3D.h" + +char **fill_tab(char *swap, int count, char **ret, int fd) +{ + while (swap || !count) + { + swap = get_next_line(fd); + if (ft_strlen(swap) >= 1 && swap[ft_strlen(swap) - 1] == '\n') + swap[ft_strlen(swap) - 1] = 0; + ret[count] = swap; + count++; + } + return (ret); +} + +char **isafile(char **av, t_data *img) +{ + int fd; + char **ret; + int count; + int pass; + + count = 0; + get_map_size(av[1], img, &count, 0); + ret = ft_calloc(sizeof(char *), count); + if (!ret) + quit_game(img); + img->to_be_free.tab = ret; + fd = open(av[1], O_RDONLY); + if (fd == -1) + ft_exit("Error\nBad texture file", img); + ret = fill_tab(0, 0, ret, fd); + close(fd); + pass = check_texture_color(ret, img); + check_zero_one(ret + pass, img); + transform_map(ret + pass, img); + free_double(ret); + img->to_be_free.tab = 0; + return (0); +} diff --git a/srcs/parsing/parse_map.c b/srcs/parsing/parse_map.c index bbd3abc..dd1140e 100644 --- a/srcs/parsing/parse_map.c +++ b/srcs/parsing/parse_map.c @@ -6,51 +6,12 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/05/10 17:54:25 by sadjigui #+# #+# */ -/* Updated: 2022/06/15 23:33:19 by apommier ### ########.fr */ +/* Updated: 2022/06/16 16:38:05 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ #include "../../includes/Cub3D.h" -void verifie_texture_color(t_data *img) -{ - if (img->map.texture.north == NULL) - ft_exit("Error\nTexture isn't loaded properly\n", img); - if (img->map.texture.east == NULL) - ft_exit("Error\nTexture isn't loaded properly\n", img); - if (img->map.texture.south == NULL) - ft_exit("Error\nTexture isn't loaded properly\n", img); - if (img->map.texture.west == NULL) - ft_exit("Error\nTexture isn't loaded properly\n", img); - if (img->map.floor.set != 1) - ft_exit("Error\nColor not set properly\n", img); - if (img->map.sky.set != 1) - ft_exit("Error\nColor not set properly\n", img); -} - -void error_msg(t_data *img) -{ - if (img->map.error == 1) - ft_exit("Error\nMap isn't closed\n", img); - if (img->map.error == 2) - ft_exit("Error\nMissing player\n", img); - if (img->map.error == 3) - ft_exit("Error\nToo many players\n", img); - if (img->map.error == -1) - ft_exit("Error\nBad character in map\n", img); -} - -void size_line(char *str, t_data *img) -{ - int i; - - i = 0; - while (str[i]) - i++; - if (i > img->map.x) - img->map.x = i; -} - char *charge_new(t_data *img, char **map, char **tmp_map) { char *str; @@ -90,153 +51,6 @@ int reverse_comp(char *s1, char *s2) return (0); } -void inter_map(char **split, char **tmp, t_data *img) -{ - int i; - int j; - - i = 0; - while (split[i]) - { - j = 0; - while (split[i][j]) - { - if (split[i][j] == '3') - img->map.error = -1; - else if (split[i][j] != ' ') - tmp[i + 1][j + 1] = split[i][j]; - j++; - } - i++; - } -} - -void close_or_not(char **tab, int i, int j, t_data *img) -{ - if (tab[i + 1][j] == '3' || tab[i - 1][j] == '3') - img->map.error = 1; - if (tab[i][j + 1] == '3' || tab[i][j - 1] == '3') - img->map.error = 1; - if (tab[i + 1][j + 1] == '3' || tab[i + 1][j - 1] == '3') - img->map.error = 1; - if (tab[i - 1][j + 1] == '3' || tab[i - 1][j - 1] == '3') - img->map.error = 1; - if (img->map.error != 1) - img->map.error = 0; -} - -void find_angle(char c, t_data *img) -{ - if (c == 'N') - img->player.angle = 90; - if (c == 'E') - img->player.angle = 0; - if (c == 'S') - img->player.angle = 270; - if (c == 'W') - img->player.angle = 180; -} - -int check_inner_utils(char *line, t_data *img) -{ - int i; - int player; - - i = 0; - player = 0; - while (line[i]) - { - if (line[i] == 'N' || line[i] == 'S' - || line[i] == 'E' || line[i] == 'W') - { - find_angle(line[i], img); - img->player.x = i * 64 - 32; - player++; - } - else if (line[i] != '3' && line[i] != '0' && line[i] != '1') - return (100); - i++; - } - return (player); -} - -void check_inner(char **map, t_data *img) -{ - int i; - int player; - - i = 0; - player = 0; - while (map[i]) - { - player += check_inner_utils(map[i], img); - if (player == 1 && !img->player.y) - img->player.y = i * 64 - 32; - i++; - } - if (player == 0) - img->map.error = 2; - if (player > 1 && player < 100) - img->map.error = 3; - if (player >= 100) - img->map.error = -1; -} - -void check_border(char **tab, t_data *img) -{ - int i; - int j; - - i = 0; - while (tab[i]) - { - j = 0; - while (tab[i][j]) - { - if (tab[i][j] == '0' || tab[i][j] == 'W' || tab[i][j] == 'N' - || tab[i][j] == 'S' || tab[i][j] == 'E') - close_or_not(tab, i, j, img); - j++; - } - i++; - } -} - -void check_zero_one(char **split, t_data *img) -{ - char **tmp; - int i; - - i = 0; - while (split[i]) - { - if (!ft_strchr(split[i], '1')) - ft_exit("Error\nInvalid line in map file\n", img); - size_line(split[i], img); - i++; - } - img->map.y = i; - tmp = malloc(sizeof(char *) * (i + 3)); - if (!tmp) - quit_game(img); - i = 0; - while (i < img->map.y + 2) - { - tmp[i] = charge_new(img, split, tmp); - i++; - } - tmp[i] = NULL; - inter_map(split, tmp, img); - if (img->map.error == -1) - { - free_double(tmp); - return ; - } - check_border(tmp, img); - check_inner(tmp, img); - free_double(tmp); -} - int is_in_charset(char c, char *charset) { while (*charset) @@ -266,45 +80,6 @@ int detect_map_line(char *line) return (1); } -char **fill_tab(char *swap, int count, char **ret, int fd) -{ - while (swap || !count) - { - swap = get_next_line(fd); - if (ft_strlen(swap) >= 1 && swap[ft_strlen(swap) - 1] == '\n') - swap[ft_strlen(swap) - 1] = 0; - ret[count] = swap; - count++; - } - return (ret); -} - -char **isafile(char **av, t_data *img) -{ - int fd; - char **ret; - int count; - int pass; - - count = 0; - get_map_size(av[1], img, &count, 0); - ret = ft_calloc(sizeof(char *), count); - if (!ret) - quit_game(img); - img->to_be_free.tab = ret; - fd = open(av[1], O_RDONLY); - if (fd == -1) - ft_exit("Error\nBad texture file", img); - ret = fill_tab(0, 0, ret, fd); - close(fd); - pass = check_texture_color(ret, img); - check_zero_one(ret + pass, img); - transform_map(ret + pass, img); - free_double(ret); - img->to_be_free.tab = 0; - return (0); -} - int check_map(char **av, t_data *img) { img->map.x = 0; @@ -325,6 +100,6 @@ int check_map(char **av, t_data *img) error_msg(img); quit_game(img); } - verifie_texture_color(img); + verify_texture_color(img); return (0); } diff --git a/srcs/parsing/utils_parsing.c b/srcs/parsing/utils_parsing.c index a01f173..d415434 100644 --- a/srcs/parsing/utils_parsing.c +++ b/srcs/parsing/utils_parsing.c @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/06/15 23:34:49 by apommier #+# #+# */ -/* Updated: 2022/06/15 23:38:38 by apommier ### ########.fr */ +/* Updated: 2022/06/16 16:25:36 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -51,3 +51,26 @@ char *transform_map(char **double_map, t_data *img) img->map.simple_map = map; return (0); } + +void find_angle(char c, t_data *img) +{ + if (c == 'N') + img->player.angle = 90; + if (c == 'E') + img->player.angle = 0; + if (c == 'S') + img->player.angle = 270; + if (c == 'W') + img->player.angle = 180; +} + +void size_line(char *str, t_data *img) +{ + int i; + + i = 0; + while (str[i]) + i++; + if (i > img->map.x) + img->map.x = i; +}