diff --git a/inc/map.h b/inc/map.h index 1b8c01c..91fb664 100644 --- a/inc/map.h +++ b/inc/map.h @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* ::: :::::::: */ -/* map.h :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: qmennen +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2025/04/17 19:19:19 by qmennen #+# #+# */ -/* Updated: 2025/04/22 17:24:47 by qmennen ### ########.fr */ +/* :::::::: */ +/* map.h :+: :+: */ +/* +:+ */ +/* By: qmennen +#+ */ +/* +#+ */ +/* Created: 2025/04/17 19:19:19 by qmennen #+# #+# */ +/* Updated: 2025/04/23 12:26:56 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -17,7 +17,16 @@ int map_create(t_game **game, const char *mapfile); void map_free(t_map *map); -void print_map(t_map *map); +void print_map(t_map *map); t_tile get_tile(t_map * map, int x, int y); +int enclosed_map(t_map *map); +void grid_free(t_tile **grid, int height); +t_tile **copy_map(t_tile **grid, int width, int height); +int parse_args(const char *mapfile, t_map *map); +t_tile **create_grid(int width, int height); +int find_player_or_empty(t_map *map, int *x, int *y); + +int floodfill(t_map *map, int x, int y); + #endif diff --git a/inc/parser.h b/inc/parser.h index 11b59bc..8caecf6 100644 --- a/inc/parser.h +++ b/inc/parser.h @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/04/19 14:41:55 by whaffman #+# #+# */ -/* Updated: 2025/04/22 13:18:20 by whaffman ######## odam.nl */ +/* Updated: 2025/04/23 12:28:37 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -15,9 +15,8 @@ # include "cub3d.h" # include "libft.h" -size_t count_chars(const char *str, char c); - -ssize_t get_file_size(const char *filename); +size_t count_chars(const char *str, char c); +ssize_t get_file_size(const char *filename); char *read_map_file(const char *filename); int is_map_line(const char *line); unsigned int parse_color(const char *color_str); @@ -30,5 +29,4 @@ void print_config(t_map *map); t_tile **copy_map(t_tile **grid, int width, int height); char **pointer_lines(char *buffer, char c); - #endif \ No newline at end of file diff --git a/src/map.c b/src/map.c deleted file mode 100644 index ab68bc1..0000000 --- a/src/map.c +++ /dev/null @@ -1,238 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* :::::::: */ -/* map.c :+: :+: */ -/* +:+ */ -/* By: whaffman +#+ */ -/* +#+ */ -/* Created: 2025/04/22 13:20:51 by whaffman #+# #+# */ -/* Updated: 2025/04/23 12:00:48 by whaffman ######## odam.nl */ -/* */ -/* ************************************************************************** */ - -#include -#include -#include -#include "cub3d.h" -#include "libft.h" -#include "types.h" - -#define FAILURE 0 -#define SUCCESS 1 - - -void print_map(t_map *map) -{ - const int chars[] = {'X', ' ', '.', '#', 'P'}; - int i = 0; - while (i < map->height) - { - int j = 0; - while (j < map->width) - { - printf("%c ", chars[map->grid[i][j] + 2]); - j++; - } - printf("\n"); - i++; - } -} - - -int find_player_or_empty(t_map *map, int *x, int *y) -{ - int i; - int j; - - if (!map || !x || !y) - return 0; - i = 0; - while (i < map->height) - { - j = 0; - while(j < map->width) - { - if (map->grid[i][j] == TILE_PLAYER || map->grid[i][j] == TILE_EMPTY) - { - *x = j; - *y = i; - return 1; - } - j++; - } - i++; - } - return 0; -} - -int floodfill(t_map *map, int x, int y) -{ - if (!map || x < 0 || y < 0 || x >= map->width || y >= map->height) - return (FAILURE); - if (map->grid[y][x] == TILE_VOID) - return (FAILURE); - if (map->grid[y][x] == TILE_WALL || map->grid[y][x] == TILE_VISITED) - return (SUCCESS); - map->grid[y][x] = TILE_VISITED; - if (!floodfill(map, x + 1, y) || - !floodfill(map, x, y - 1) || - !floodfill(map, x, y + 1) || - !floodfill(map, x - 1, y)) - return (FAILURE); - return (SUCCESS); -} - -int enclosed_map(t_map *map) -{ - int x; - int y; - - - if (!map) - return FAILURE; - if (!find_player_or_empty(map, &x, &y)) - return SUCCESS; - if (!floodfill(map, x, y)) - return FAILURE; - if (!enclosed_map(map)) - return (FAILURE); - return SUCCESS; -} - -static int parse_args(const char *mapfile, t_map *map) -{ - char *buffer; - - buffer = read_map_file(mapfile); - if (!buffer) - { - perror("Error reading map file"); - return (FAILURE); - } - if (!parse_file(buffer, map)) - { - ft_putstr_fd("Error parsing map file\n", 2); - free(buffer); - return (FAILURE); - } - free(buffer); - return (SUCCESS); -} -t_tile **create_grid(int width, int height) -{ - t_tile **grid; - int i; - - grid = malloc(sizeof(t_tile *) * height); - if (!grid) - return (NULL); - i = 0; - while (i < height) - { - grid[i] = malloc(sizeof(t_tile) * width); - if (!grid[i]) - { - while (--i >= 0) - free(grid[i]); - free(grid); - return (NULL); - } - i++; - } - return (grid); -} - -t_tile **copy_map(t_tile** grid, int width, int height) -{ - t_tile **copy; - int i; - int j; - - copy = create_grid(width, height); - if (!copy) - return (NULL); - i = 0; - while (i < height) - { - j = 0; - while (j < width) - { - copy[i][j] = grid[i][j]; - j++; - } - i++; - } - return (copy); -} - -void grid_free(t_tile **grid, int height) -{ - int i; - - if (!grid) - return; - i = 0; - while (i < height) - { - free(grid[i]); - i++; - } - free(grid); -} - -int map_create(t_game **game, const char *mapfile) - -{ - t_map *map; - t_tile **grid; - - if (!game || !*game) - return (FAILURE); - map = malloc(sizeof(t_map)); - if (!map) - { - perror("Error allocating memory for map"); - return (FAILURE); - } - parse_args(mapfile, map); - print_map(map); - grid = copy_map(map->grid, map->width, map->height); - if (!grid) - { - perror("Error copying map"); - free(map); - return (FAILURE); - } - if(!enclosed_map(map)) - { - fprintf(stderr, "NOT GOOD MAP FRIEND\n"); - grid_free(grid, map->height); - map_free(map); - return (FAILURE); - } - grid_free(map->grid, map->height); - map->grid = grid; - print_config(map); - - (*game)->map = map; - return (SUCCESS); -} - - -void map_free(t_map *map) -{ - grid_free(map->grid, map->height); - //free(map->grid); - free(map->NO_texture); - free(map->SO_texture); - free(map->WE_texture); - free(map->EA_texture); - free(map); -} - -t_tile get_tile(t_map * map, int x, int y) -{ - if (x < 0 || y < 0 || x >= map->width || y >= map->height) - return (TILE_WALL); - return (map->grid[y][x]); -} diff --git a/src/map/copy_map.c b/src/map/copy_map.c new file mode 100644 index 0000000..294fa3f --- /dev/null +++ b/src/map/copy_map.c @@ -0,0 +1,36 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* copy_map.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/04/23 12:19:15 by whaffman #+# #+# */ +/* Updated: 2025/04/23 12:19:57 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "cub3d.h" + +t_tile **copy_map(t_tile **grid, int width, int height) +{ + t_tile **copy; + int i; + int j; + + copy = create_grid(width, height); + if (!copy) + return (NULL); + i = 0; + while (i < height) + { + j = 0; + while (j < width) + { + copy[i][j] = grid[i][j]; + j++; + } + i++; + } + return (copy); +} diff --git a/src/map/create_grid.c b/src/map/create_grid.c new file mode 100644 index 0000000..399f04e --- /dev/null +++ b/src/map/create_grid.c @@ -0,0 +1,38 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* create_grid.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/04/23 12:18:31 by whaffman #+# #+# */ +/* Updated: 2025/04/23 12:20:25 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include +#include "cub3d.h" + +t_tile **create_grid(int width, int height) +{ + t_tile **grid; + int i; + + grid = malloc(sizeof(t_tile *) * height); + if (!grid) + return (NULL); + i = 0; + while (i < height) + { + grid[i] = malloc(sizeof(t_tile) * width); + if (!grid[i]) + { + while (--i >= 0) + free(grid[i]); + free(grid); + return (NULL); + } + i++; + } + return (grid); +} diff --git a/src/map/enclosed_map.c b/src/map/enclosed_map.c new file mode 100644 index 0000000..8357861 --- /dev/null +++ b/src/map/enclosed_map.c @@ -0,0 +1,29 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* enclosed_map.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/04/23 12:16:47 by whaffman #+# #+# */ +/* Updated: 2025/04/23 12:20:23 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "cub3d.h" + +int enclosed_map(t_map *map) +{ + int x; + int y; + + if (!map) + return (FAILURE); + if (!find_player_or_empty(map, &x, &y)) + return (SUCCESS); + if (!floodfill(map, x, y)) + return (FAILURE); + if (!enclosed_map(map)) + return (FAILURE); + return (SUCCESS); +} diff --git a/src/map/find_player_or_empty.c b/src/map/find_player_or_empty.c new file mode 100644 index 0000000..5050733 --- /dev/null +++ b/src/map/find_player_or_empty.c @@ -0,0 +1,39 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* find_player_or_empty.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/04/23 12:13:50 by whaffman #+# #+# */ +/* Updated: 2025/04/23 12:20:20 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "cub3d.h" + +int find_player_or_empty(t_map *map, int *x, int *y) +{ + int i; + int j; + + if (!map || !x || !y) + return (FAILURE); + i = 0; + while (i < map->height) + { + j = 0; + while (j < map->width) + { + if (map->grid[i][j] == TILE_PLAYER || map->grid[i][j] == TILE_EMPTY) + { + *x = j; + *y = i; + return (SUCCESS); + } + j++; + } + i++; + } + return (FAILURE); +} diff --git a/src/map/floodfill.c b/src/map/floodfill.c new file mode 100644 index 0000000..9ec6ec7 --- /dev/null +++ b/src/map/floodfill.c @@ -0,0 +1,30 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* floodfill.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/04/23 12:14:58 by whaffman #+# #+# */ +/* Updated: 2025/04/23 12:20:18 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "cub3d.h" + +int floodfill(t_map *map, int x, int y) +{ + if (!map || x < 0 || y < 0 || x >= map->width || y >= map->height) + return (FAILURE); + if (map->grid[y][x] == TILE_VOID) + return (FAILURE); + if (map->grid[y][x] == TILE_WALL || map->grid[y][x] == TILE_VISITED) + return (SUCCESS); + map->grid[y][x] = TILE_VISITED; + if (!floodfill(map, x + 1, y) + || !floodfill(map, x, y - 1) + || !floodfill(map, x, y + 1) + || !floodfill(map, x - 1, y)) + return (FAILURE); + return (SUCCESS); +} diff --git a/src/map/get_tile.c b/src/map/get_tile.c new file mode 100644 index 0000000..196d0fe --- /dev/null +++ b/src/map/get_tile.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* get_tile.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/04/23 12:23:05 by whaffman #+# #+# */ +/* Updated: 2025/04/23 12:23:14 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "cub3d.h" + +t_tile get_tile(t_map *map, int x, int y) +{ + if (x < 0 || y < 0 || x >= map->width || y >= map->height) + return (TILE_WALL); + return (map->grid[y][x]); +} diff --git a/src/map/grid_free.c b/src/map/grid_free.c new file mode 100644 index 0000000..4919e25 --- /dev/null +++ b/src/map/grid_free.c @@ -0,0 +1,29 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* grid_free.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/04/23 12:20:38 by whaffman #+# #+# */ +/* Updated: 2025/04/23 12:21:00 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include +#include "cub3d.h" + +void grid_free(t_tile **grid, int height) +{ + int i; + + if (!grid) + return ; + i = 0; + while (i < height) + { + free(grid[i]); + i++; + } + free(grid); +} diff --git a/src/map/map_create.c b/src/map/map_create.c new file mode 100644 index 0000000..a6e6cbb --- /dev/null +++ b/src/map/map_create.c @@ -0,0 +1,52 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* map_create.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/04/23 12:21:13 by whaffman #+# #+# */ +/* Updated: 2025/04/23 12:22:15 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include +#include "cub3d.h" + + +int map_create(t_game **game, const char *mapfile) +{ + t_map *map; + t_tile **grid; + + if (!game || !*game) + return (FAILURE); + map = malloc(sizeof(t_map)); + if (!map) + { + perror("Error allocating memory for map"); + return (FAILURE); + } + parse_args(mapfile, map); + print_map(map); + grid = copy_map(map->grid, map->width, map->height); + if (!grid) + { + perror("Error copying map"); + free(map); + return (FAILURE); + } + if (!enclosed_map(map)) + { + fprintf(stderr, "NOT GOOD MAP FRIEND\n"); + grid_free(grid, map->height); + map_free(map); + return (FAILURE); + } + grid_free(map->grid, map->height); + map->grid = grid; + print_config(map); + + (*game)->map = map; + return (SUCCESS); +} \ No newline at end of file diff --git a/src/map/map_free.c b/src/map/map_free.c new file mode 100644 index 0000000..e74435a --- /dev/null +++ b/src/map/map_free.c @@ -0,0 +1,25 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* map_free.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/04/23 12:22:28 by whaffman #+# #+# */ +/* Updated: 2025/04/23 12:22:49 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include +#include "cub3d.h" + +void map_free(t_map *map) +{ + grid_free(map->grid, map->height); + // free(map->grid); + free(map->NO_texture); + free(map->SO_texture); + free(map->WE_texture); + free(map->EA_texture); + free(map); +} \ No newline at end of file diff --git a/src/map/parse_args.c b/src/map/parse_args.c new file mode 100644 index 0000000..89cb746 --- /dev/null +++ b/src/map/parse_args.c @@ -0,0 +1,33 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* parse_args.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/04/23 12:17:49 by whaffman #+# #+# */ +/* Updated: 2025/04/23 12:26:24 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "cub3d.h" + +int parse_args(const char *mapfile, t_map *map) +{ + char *buffer; + + buffer = read_map_file(mapfile); + if (!buffer) + { + perror("Error reading map file"); + return (FAILURE); + } + if (!parse_file(buffer, map)) + { + ft_putstr_fd("Error parsing map file\n", 2); + free(buffer); + return (FAILURE); + } + free(buffer); + return (SUCCESS); +} diff --git a/src/map/print_map.c b/src/map/print_map.c new file mode 100644 index 0000000..9d1ede5 --- /dev/null +++ b/src/map/print_map.c @@ -0,0 +1,39 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* print_map.c :+: :+: */ +/* +:+ */ +/* By: whaffman +#+ */ +/* +#+ */ +/* Created: 2025/04/23 12:11:12 by whaffman #+# #+# */ +/* Updated: 2025/04/23 12:20:12 by whaffman ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "cub3d.h" + +void print_map(t_map *map) +{ + const int chars[] = {'X', ' ', '.', '#', 'P'}; + int i; + int j; + + if (!map) + return ; + if (!map->grid) + return ; + if (map->width <= 0 || map->height <= 0) + return ; + i = 0; + while (i < map->height) + { + j = 0; + while (j < map->width) + { + printf("%c ", chars[map->grid[i][j] + 2]); + j++; + } + printf("\n"); + i++; + } +} diff --git a/test.cub b/test.cub index 6a1b216..1af187b 100644 --- a/test.cub +++ b/test.cub @@ -18,7 +18,7 @@ C 100,100,10 1111111 111 1111 111111 1111111111 111111 -1000001110111001 100001 w 1000001001 10001 +1000001110111001 100001 1000001001 10001 1000000000000001 100001 100000110111100011 1000001110000001110011111111 110000001000000001 1000001 10001000000010000001 100000001000000001