norm - new files

This commit is contained in:
kinou-p 2022-06-16 16:41:31 +02:00
parent be9d7df71d
commit 87f97833cf
8 changed files with 305 additions and 245 deletions

View File

@ -6,7 +6,7 @@
# By: apommier <apommier@student.42.fr> +#+ +:+ +#+ # # By: apommier <apommier@student.42.fr> +#+ +:+ +#+ #
# +#+#+#+#+#+ +#+ # # +#+#+#+#+#+ +#+ #
# Created: 2022/02/13 16:27:49 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/cub_utils.c\
srcs/utils/quit_game.c\ srcs/utils/quit_game.c\
srcs/parsing/parse_map.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/utils_parsing.c\
srcs/parsing/check_color_texture.c srcs/parsing/check_color_texture.c
OBJS = ${SRCS:.c=.o} OBJS = ${SRCS:.c=.o}
CC = gcc CC = gcc
LIB = -L ./mlx -lmlx -lXext -lX11 -lm LIB = -L ./mlx -lmlx -lXext -lX11 -lm
CFLAGS = -Wall -Wextra -g CFLAGS = -Wall -Wextra -Werror -g
RM = rm -rf RM = rm -rf
LIBFT = ./libft LIBFT = ./libft

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2022/02/13 16:30:59 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 vx;
double vy; double vy;
int count; int count;
double aTan; double tan;
int nb_ray; int nb_ray;
int my; int my;
int mx; int mx;
@ -142,12 +142,25 @@ typedef struct draw_ray_var {
char horizontal_type; char horizontal_type;
} t_var_draw_ray; } t_var_draw_ray;
char *transform_map(char **double_map, t_data *img); char *transform_map(char **double_map, t_data *img);
int check_texture_color(char **tab, t_data *img); int check_texture_color(char **tab, t_data *img);
int check_map(char **av, t_data *img); int check_map(char **av, t_data *img);
void ft_exit(char *str, 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); void set_back(t_data *img);
unsigned char *get_texture(char type, char *path, t_data *img); unsigned char *get_texture(char type, char *path, t_data *img);
int get_color(char one, char two, char three); int get_color(char one, char two, char three);

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2022/06/16 16:15:16 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) void horizontal_ray(t_var_draw_ray *hr, t_data *img)
{ {
hr->count = 0; 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) if (sin(deg_to_rad(hr->ray_angle)) > 0.001)
{ {
hr->ray_y = (((int)img->player.y >> 6) << 6) - 0.0001; 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_y = -64;
hr->next_x = -hr->next_y * hr->aTan; hr->next_x = -hr->next_y * hr->tan;
hr->horizontal_type = 'N'; hr->horizontal_type = 'N';
} }
else if (sin(deg_to_rad(hr->ray_angle)) < -0.001) else if (sin(deg_to_rad(hr->ray_angle)) < -0.001)
{ {
hr->ray_y = (((int)img->player.y >> 6) << 6) + 64; 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_y = 64;
hr->next_x = -hr->next_y * hr->aTan; hr->next_x = -hr->next_y * hr->tan;
hr->horizontal_type = 'S'; hr->horizontal_type = 'S';
} }
else 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) 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) if (cos(deg_to_rad(vr->ray_angle)) > 0.001)
{ {
vr->ray_x = (((int)img->player.x >> 6) << 6) + 64; 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_x = 64;
vr->next_y = -vr->next_x * vr->aTan; vr->next_y = -vr->next_x * vr->tan;
vr->vertical_type = 'E'; vr->vertical_type = 'E';
} }
else if (cos(deg_to_rad(vr->ray_angle)) < -0.001) else if (cos(deg_to_rad(vr->ray_angle)) < -0.001)
{ {
vr->ray_x = (((int)img->player.x >> 6) << 6) - 0.0001; 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_x = -64;
vr->next_y = -vr->next_x * vr->aTan; vr->next_y = -vr->next_x * vr->tan;
vr->vertical_type = 'W'; vr->vertical_type = 'W';
} }
else else
@ -134,7 +134,7 @@ void set_info_draw(t_var_draw_ray *info)
info->vx = 0; info->vx = 0;
info->vy = 0; info->vy = 0;
info->count = 0; info->count = 0;
info->aTan = 0; info->tan = 0;
info->nb_ray = -1; info->nb_ray = -1;
info->my = 0; info->my = 0;
info->mx = 0; info->mx = 0;

92
srcs/parsing/check_map.c Normal file
View File

@ -0,0 +1,92 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* check_map.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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;
}

View File

@ -0,0 +1,102 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* check_map_utils.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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);
}

52
srcs/parsing/is_a_file.c Normal file
View File

@ -0,0 +1,52 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* is_a_file.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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);
}

View File

@ -6,51 +6,12 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2022/05/10 17:54:25 by sadjigui #+# #+# */ /* 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" #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 *charge_new(t_data *img, char **map, char **tmp_map)
{ {
char *str; char *str;
@ -90,153 +51,6 @@ int reverse_comp(char *s1, char *s2)
return (0); 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) int is_in_charset(char c, char *charset)
{ {
while (*charset) while (*charset)
@ -266,45 +80,6 @@ int detect_map_line(char *line)
return (1); 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) int check_map(char **av, t_data *img)
{ {
img->map.x = 0; img->map.x = 0;
@ -325,6 +100,6 @@ int check_map(char **av, t_data *img)
error_msg(img); error_msg(img);
quit_game(img); quit_game(img);
} }
verifie_texture_color(img); verify_texture_color(img);
return (0); return (0);
} }

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */ /* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2022/06/15 23:34:49 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; img->map.simple_map = map;
return (0); 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;
}