diff --git a/Makefile b/Makefile index 3a43709..14ff1f5 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: qmennen +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2024/10/15 11:48:46 by whaffman #+# #+# # -# Updated: 2025/06/03 21:48:38 by qmennen ### ########.fr # +# Updated: 2025/06/04 18:16:27 by qmennen ### ########.fr # # # # **************************************************************************** # diff --git a/assets/door.png b/assets/door.png new file mode 100644 index 0000000..7cf7541 Binary files /dev/null and b/assets/door.png differ diff --git a/inc/player.h b/inc/player.h index 3fbfc64..4054091 100644 --- a/inc/player.h +++ b/inc/player.h @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* player.h :+: :+: */ -/* +:+ */ -/* By: qmennen +#+ */ -/* +#+ */ -/* Created: 2025/04/15 18:53:27 by qmennen #+# #+# */ -/* Updated: 2025/06/04 16:39:57 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* player.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/04/15 18:53:27 by qmennen #+# #+# */ +/* Updated: 2025/06/04 18:42:25 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,5 +19,6 @@ int player_create(t_game **game); void player_update(t_game *game, double delta_time); void visit_area(t_game *game); void rotate(t_player *player, double rot_speed, double delta); +void interact_door(t_game *game); #endif diff --git a/inc/render.h b/inc/render.h index d1b830f..e325d7a 100644 --- a/inc/render.h +++ b/inc/render.h @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* render.h :+: :+: */ -/* +:+ */ -/* By: qmennen +#+ */ -/* +#+ */ -/* Created: 2025/04/15 16:28:16 by qmennen #+# #+# */ -/* Updated: 2025/06/03 14:47:34 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* render.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/04/15 16:28:16 by qmennen #+# #+# */ +/* Updated: 2025/06/04 18:15:26 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,7 +19,7 @@ void render_map(t_game *game); t_render cast_ray(t_game *game, int x); void cast_rays(t_game *game); void render_sprites(t_render *render, t_game *game); -double dda(t_vec2 ray_dir, t_vec2 pos, t_map *map); +double dda(t_render *render, t_vec2 ray_dir, t_vec2 pos, t_map *map); void draw_floor(t_game *game); void draw_line(t_game *game, t_render render, int x); unsigned int get_texture_color(mlx_texture_t *texture, diff --git a/inc/types.h b/inc/types.h index a8f474d..75f3816 100644 --- a/inc/types.h +++ b/inc/types.h @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/15 15:52:44 by qmennen #+# #+# */ -/* Updated: 2025/06/03 21:55:47 by qmennen ### ########.fr */ +/* Updated: 2025/06/04 18:14:36 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,6 +22,8 @@ typedef enum TILE TILE_EMPTY = 0, TILE_WALL = 1, TILE_PLAYER = 2, + TILE_DOOR = 3, + TILE_DOOR_OPEN = 4, } t_tile; typedef enum SPRITE_TYPE @@ -94,7 +96,7 @@ typedef struct s_map t_tile **grid; mlx_texture_t *texture_floor; mlx_texture_t *texture_ceiling; - mlx_texture_t *textures[4]; + mlx_texture_t *textures[5]; t_sprite *sprites; t_sprite_lib *sprite_lib; unsigned int n_sprites; @@ -134,6 +136,7 @@ typedef enum e_side SIDE_SOUTH, SIDE_WEST, SIDE_EAST, + SIDE_DOOR, } t_side; typedef enum e_game_state @@ -146,6 +149,8 @@ typedef enum e_game_state typedef struct s_render { double perp_dist; + int sign; + int door; t_side side; double wall_x; } t_render; diff --git a/src/game/collision.c b/src/game/collision.c index 07563c5..80c9750 100644 --- a/src/game/collision.c +++ b/src/game/collision.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/22 14:40:59 by qmennen #+# #+# */ -/* Updated: 2025/06/03 22:12:38 by qmennen ### ########.fr */ +/* Updated: 2025/06/04 18:35:34 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -60,7 +60,7 @@ int collision_horizontal(t_map *map, t_player *player, double xa) t_tile tile; tile = get_tile(map, (int)((player->pos.x + xa)), (int)((player->pos.y))); - return (tile != TILE_WALL && tile != TILE_VOID); + return (tile != TILE_WALL && tile != TILE_VOID && tile != TILE_DOOR); } int collision_vertical(t_map *map, t_player *player, double ya) @@ -68,5 +68,5 @@ int collision_vertical(t_map *map, t_player *player, double ya) t_tile tile; tile = get_tile(map, (int)((player->pos.x)), (int)((player->pos.y + ya))); - return (tile != TILE_WALL && tile != TILE_VOID); + return (tile != TILE_WALL && tile != TILE_VOID && tile != TILE_DOOR); } diff --git a/src/game/flash.c b/src/game/flash.c index 02641bc..09096bd 100644 --- a/src/game/flash.c +++ b/src/game/flash.c @@ -6,18 +6,21 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/06/03 15:53:32 by qmennen #+# #+# */ -/* Updated: 2025/06/03 22:18:26 by qmennen ### ########.fr */ +/* Updated: 2025/06/04 18:42:45 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ -#include "game.h" +#include "cub3d.h" void handle_flash(t_sprite *sprite, t_game *game) { + if (game->screen->flash != 1) + return ; if (sprite->type == SPRITE_TYPE_ENEMY && game->screen->flash == 1 && sprite->dist < 2.0) { sprite->type = SPRITE_TYPE_DISABLED; game->scoreboard->enemies++; } + } \ No newline at end of file diff --git a/src/game/moves.c b/src/game/moves.c index 45d13f2..b75db67 100644 --- a/src/game/moves.c +++ b/src/game/moves.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* moves.c :+: :+: */ -/* +:+ */ -/* By: qmennen +#+ */ -/* +#+ */ -/* Created: 2025/05/14 20:08:27 by whaffman #+# #+# */ -/* Updated: 2025/06/04 16:39:34 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* moves.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/05/14 20:08:27 by whaffman #+# #+# */ +/* Updated: 2025/06/04 18:42:35 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -95,6 +95,7 @@ void player_update(t_game *game, double delta_time) { game->screen->flash = 3; game->player->battery -= 0.1f; + interact_door(game); } if (game->player->hit_timer > 0) game->player->hit_timer -= .1f; diff --git a/src/game/player.c b/src/game/player.c index 5c26e52..76c3dc3 100644 --- a/src/game/player.c +++ b/src/game/player.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/15 18:53:19 by qmennen #+# #+# */ -/* Updated: 2025/06/03 15:18:22 by qmennen ### ########.fr */ +/* Updated: 2025/06/04 18:42:13 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -28,3 +28,16 @@ int player_create(t_game **game) (*game)->player = player; return (SUCCESS); } + +void interact_door(t_game *game) +{ + t_vec2_int pos; + + pos = vec2_to_int(add(game->player->pos, game->player->dir)); + printf("Tile to flash: (%d, %d), type %d\n", pos.x, pos.y, game->map->grid[pos.y][pos.x]); + if (game->map->grid[pos.y][pos.x] == TILE_DOOR) + { + game->map->grid[pos.y][pos.x] = TILE_EMPTY; + game->scoreboard->tiles_visited++; + } +} \ No newline at end of file diff --git a/src/parser/parse_config_line.c b/src/parser/parse_config_line.c index 0b77ec3..ace18f2 100644 --- a/src/parser/parse_config_line.c +++ b/src/parser/parse_config_line.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/22 13:10:06 by whaffman #+# #+# */ -/* Updated: 2025/06/03 16:16:56 by qmennen ### ########.fr */ +/* Updated: 2025/06/04 17:57:29 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -29,10 +29,10 @@ mlx_texture_t *load_texture(const char *path) t_token_handler handle_config_token(const char *token, t_map *map) { const char *config_tokens[] = { - "NO", "SO", "WE", "EA", "F", "C", "FT", "CT", "-c", "-s", "-e", NULL + "NO", "SO", "WE", "EA", "D", "F", "C", "FT", "CT", "-c", "-s", "-e", NULL }; const t_token_handler handlers[] = { - handle_wall, handle_wall, handle_wall, handle_wall, + handle_wall, handle_wall, handle_wall, handle_wall, handle_wall, handle_fc_color, handle_fc_color, handle_fc_texture, handle_fc_texture, handle_sprite, handle_sprite, handle_sprite, NULL }; diff --git a/src/parser/parse_handlers.c b/src/parser/parse_handlers.c index 549a57f..fe23b88 100644 --- a/src/parser/parse_handlers.c +++ b/src/parser/parse_handlers.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* parse_handlers.c :+: :+: */ -/* +:+ */ -/* By: whaffman +#+ */ -/* +#+ */ -/* Created: 2025/06/03 14:38:12 by whaffman #+# #+# */ -/* Updated: 2025/06/03 14:54:00 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* parse_handlers.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/06/03 14:38:12 by whaffman #+# #+# */ +/* Updated: 2025/06/04 17:57:18 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,7 +15,7 @@ int handle_wall(char *token, t_map *map) { const char *wall_tokens[] = { - "NO", "SO", "WE", "EA", NULL + "NO", "SO", "WE", "EA", "D", NULL }; char *texture_path; int i; diff --git a/src/parser/parse_tile.c b/src/parser/parse_tile.c index 4e8112e..a999979 100644 --- a/src/parser/parse_tile.c +++ b/src/parser/parse_tile.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* parse_tile.c :+: :+: */ -/* +:+ */ -/* By: whaffman +#+ */ -/* +#+ */ -/* Created: 2025/04/22 13:12:31 by whaffman #+# #+# */ -/* Updated: 2025/05/25 11:49:44 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* parse_tile.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/04/22 13:12:31 by whaffman #+# #+# */ +/* Updated: 2025/06/04 17:50:07 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,6 +22,8 @@ int parse_tile(char c) return (TILE_VOID); else if (c == 'N' || c == 'S' || c == 'E' || c == 'W') return (TILE_PLAYER); + else if (c == 'D') + return (TILE_DOOR); else if (c >= 'a' && c <= 'z') return (TILE_EMPTY); else diff --git a/src/render/dda.c b/src/render/dda.c index 510fecf..67ceb76 100644 --- a/src/render/dda.c +++ b/src/render/dda.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* dda.c :+: :+: */ -/* +:+ */ -/* By: whaffman +#+ */ -/* +#+ */ -/* Created: 2025/05/02 11:58:09 by whaffman #+# #+# */ -/* Updated: 2025/05/22 18:50:43 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* dda.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/05/02 11:58:09 by whaffman #+# #+# */ +/* Updated: 2025/06/04 18:32:57 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -74,15 +74,18 @@ int dda_main(t_vec2 ray_dir, t_vec2_int map_pos, t_vec2 *side_dist, t_map *map) printf("Out of bounds: %d %d\n", map_pos.x, map_pos.y); if (map->grid[map_pos.y][map_pos.x] == TILE_EMPTY) map->grid[map_pos.y][map_pos.x] = TILE_VISITED; - hit = (map->grid[map_pos.y][map_pos.x] == TILE_WALL); + hit = (map->grid[map_pos.y][map_pos.x] == TILE_WALL) - (map->grid[map_pos.y][map_pos.x] == TILE_DOOR); } + side = -1 * (1 - side) + side; + if (hit == -1) + side *= 2; return (side); } // Returns the distance to the wall hit if the wall is hit in y // direction the result is negative, if the wall is hit // in x direction the result is positive -double dda(t_vec2 ray_dir, t_vec2 pos, t_map *map) +double dda(t_render *render, t_vec2 ray_dir, t_vec2 pos, t_map *map) { const t_vec2 delta_dist = get_delta_dist(ray_dir); t_vec2 side_dist; @@ -93,6 +96,12 @@ double dda(t_vec2 ray_dir, t_vec2 pos, t_map *map) (t_vec2_int){(int)pos.x, (int)pos.y}, &side_dist, map); + if (abs(side) == 2) + { + render->door = 1; + side /= 2; + } + side = (side + 1)/2; return ((1 - side) * (side_dist.x - delta_dist.x) - side * (side_dist.y - delta_dist.y)); } diff --git a/src/render/render_walls.c b/src/render/render_walls.c index 70cdd59..27f2e85 100644 --- a/src/render/render_walls.c +++ b/src/render/render_walls.c @@ -1,19 +1,21 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* render_walls.c :+: :+: */ -/* +:+ */ -/* By: whaffman +#+ */ -/* +#+ */ -/* Created: 2025/05/14 13:05:28 by whaffman #+# #+# */ -/* Updated: 2025/05/18 12:05:07 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* render_walls.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/05/14 13:05:28 by whaffman #+# #+# */ +/* Updated: 2025/06/04 18:17:33 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ #include "cub3d.h" -t_side get_side(t_vec2 ray_dir, double perp_dist) +t_side get_side(t_render *render, t_vec2 ray_dir, double perp_dist) { + if (render->door) + return (SIDE_DOOR); if (perp_dist > 0) { if (ray_dir.x > 0) @@ -37,13 +39,14 @@ t_render cast_ray(t_game *game, int x) t_render render; double perp_dist; + render.door = 0; ray_dir = add(game->player->dir, mul(game->player->camera, (2.0f * x / (double)game->screen->width - 1))); pos = game->player->pos; - perp_dist = dda(ray_dir, pos, game->map); + perp_dist = dda(&render, ray_dir, pos, game->map); render.perp_dist = fabs(perp_dist); - render.side = get_side(ray_dir, perp_dist); + render.side = get_side(&render, ray_dir, perp_dist); if (perp_dist < 0) render.wall_x = pos.x + ray_dir.x * render.perp_dist; else diff --git a/test.cub b/test.cub index 8da759b..47a73a1 100644 --- a/test.cub +++ b/test.cub @@ -6,6 +6,7 @@ WE ./assets/bricks2.png SO ./assets/stonewall256.png EA ./assets/bricksx64.png +D ./assets/door.png F 90,30,30 @@ -20,7 +21,7 @@ CT ./assets/ceiling64x64.png -s p ./assets/plant.png -s m ./assets/broken_mirror.png -s t ./assets/test.png --e e ./assets/flying_eye.png +-s e ./assets/flying_eye.png 1111111 111 1111 111111 1111111111 111111 1000001110111001 100001 1000000001 10001 @@ -30,7 +31,7 @@ CT ./assets/ceiling64x64.png 100m00111000100000b00000b00111110p00000100p00m001 10b0e0bb00001111111111100000000000111111000000001 1000t0bW00001 1000011111111 1000001001 -10p0011111001 111111100001 1111111111110001 +10p0011111DD1 111111100001 1111111111110001 100001 1001 1p00000000011111111000010111 10b01 111111 1001 10000010000000000010b0000101 100001 1b01 10000p1111111111111000010001 10b00m1