From 8521bfa7e4a977a66e60b6e90812e95c817ba25e Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Wed, 28 May 2025 14:23:42 +0200 Subject: [PATCH 1/9] feat: menu items and action callbacks --- inc/game_menu.h | 13 ++++--- inc/types.h | 31 ++++++++++------- src/game.c | 16 ++++----- src/main.c | 15 ++++----- src/manager/game_manager.c | 7 ++-- src/manager/game_manager_utils.c | 31 ++--------------- src/map/grid_free.c | 15 ++++----- src/map/map_create.c | 16 ++++----- src/map/map_free.c | 19 +++++------ src/menu/main_menu.c | 58 ++++++++++++++++++++++++++++++++ src/menu/menu.c | 31 ++++++++--------- src/menu/menu_item.c | 27 +++++++++++++++ src/screen.c | 3 +- 13 files changed, 174 insertions(+), 108 deletions(-) create mode 100644 src/menu/main_menu.c create mode 100644 src/menu/menu_item.c diff --git a/inc/game_menu.h b/inc/game_menu.h index 0eff555..ffd8d66 100644 --- a/inc/game_menu.h +++ b/inc/game_menu.h @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/27 15:07:48 by qmennen #+# #+# */ -/* Updated: 2025/05/27 18:41:31 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 14:15:18 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,9 +15,12 @@ # include "cub3d.h" -void menu_display(t_menu *menu, t_screen *screen); -t_menu *menu_create(t_game_manager *manager, char *background_path, const char *options[]); -void menu_free(t_menu *menu, t_screen *screen); -void menu_toggle(t_menu *menu, t_screen *screen); +void menu_display(t_menu *menu, t_screen *screen); +t_menu *create_main_menu(t_game_manager *manager); +t_menu *menu_create(t_game_manager *manager, char *background_path, const t_menu_item *options[]); +t_menu_item *menu_item_create(const char *text, + void (*act)(struct s_menu_item *item, t_game_manager *manager)); +void menu_free(t_menu *menu, t_screen *screen); +void menu_toggle(t_menu *menu, t_screen *screen); #endif \ No newline at end of file diff --git a/inc/types.h b/inc/types.h index 2f984cc..d011f86 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/05/27 18:42:09 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 14:17:55 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -147,27 +147,34 @@ typedef struct s_game t_keyboard *keyboard; int framecount; int fps; - t_game_state state; } t_game; +typedef struct s_game_manager +{ + t_game_state state; + t_game *game; + struct s_menu *menu; + struct s_menu *end_screen; + struct s_menu **active_menu; +} t_game_manager; + +typedef struct s_menu_item +{ + char *text; + mlx_image_t *image; + void (*act)(struct s_menu_item *item, t_game_manager *manager); +} t_menu_item; typedef struct s_menu { int selected_option; int num_options; int hidden; - char *options[MAX_MENU_OPTIONS]; - mlx_image_t *option_images[MAX_MENU_OPTIONS]; + t_menu_item *items[MAX_MENU_OPTIONS]; + // char *options[MAX_MENU_OPTIONS]; + // mlx_image_t *option_images[MAX_MENU_OPTIONS]; mlx_image_t *selector; mlx_image_t *background_image; } t_menu; -typedef struct s_game_manager -{ - t_game *game; - t_menu *menu; - t_menu *end_screen; - t_menu **active_menu; -} t_game_manager; - #endif diff --git a/src/game.c b/src/game.c index e842cbf..7afd721 100644 --- a/src/game.c +++ b/src/game.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/15 15:46:08 by qmennen #+# #+# */ -/* Updated: 2025/05/27 15:11:11 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 14:20:43 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,8 +19,8 @@ int game_create(t_game **game) *game = malloc(sizeof(t_game)); if (!game) return (FAILURE); - memset(*game, 0, sizeof(t_game)); - (*game)->state = GAME_STATE_MENU; + ft_memset(*game, 0, sizeof(t_game)); + // (*game)->state = GAME_STATE_MENU; (*game)->fps = 20; return (SUCCESS); } @@ -157,13 +157,13 @@ void game_run(t_game *game) void game_free(t_game *game) { - if (game->screen->hud) - { - mlx_delete_image(game->screen->mlx, game->screen->hud); - game->screen->hud = NULL; - } if (game->screen) { + if (game->screen->hud) + { + mlx_delete_image(game->screen->mlx, game->screen->hud); + game->screen->hud = NULL; + } mlx_delete_image(game->screen->mlx, game->screen->img); mlx_close_window(game->screen->mlx); mlx_terminate(game->screen->mlx); diff --git a/src/main.c b/src/main.c index b89981a..894136d 100644 --- a/src/main.c +++ b/src/main.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/15 16:01:29 by qmennen #+# #+# */ -/* Updated: 2025/05/27 18:40:16 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 14:15:30 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,8 +14,8 @@ int main(int argc, char **argv) { - t_game_manager *manager; - t_game *game; + t_game_manager *manager; + t_game *game; errno = 0; game = NULL; @@ -28,12 +28,9 @@ int main(int argc, char **argv) game_free(game); return (EXIT_FAILURE); } - manager = game_manager_create(game); - manager->menu = menu_create(manager, "./assets/menu_background.png", - (const char *[]){"Start Game", "Scoreboard", "Exit", NULL}); - manager->end_screen = menu_create(manager, "./assets/menu_background.png", - (const char *[]){"Game Over", "Exit", NULL}); - manager->active_menu = &manager->end_screen; + manager = game_manager_create(game); + manager->menu = create_main_menu(manager); + manager->active_menu = &manager->menu; mlx_key_hook(game->screen->mlx, keyhandle, game); mlx_loop_hook(game->screen->mlx, game_manager_update, manager); mlx_loop(game->screen->mlx); diff --git a/src/manager/game_manager.c b/src/manager/game_manager.c index 6f867ee..2fb0b20 100644 --- a/src/manager/game_manager.c +++ b/src/manager/game_manager.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/27 13:48:18 by qmennen #+# #+# */ -/* Updated: 2025/05/27 18:39:36 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 14:20:57 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,6 +20,7 @@ t_game_manager *game_manager_create(t_game *game) return (NULL); manager->game = game; manager->menu = NULL; + manager->state = GAME_STATE_MENU; return (manager); } @@ -30,11 +31,11 @@ void game_manager_display(t_game_manager *manager) if (!manager || !manager->game) return; game = manager->game; - if (game->state == GAME_STATE_MENU) + if (manager->state == GAME_STATE_MENU) { menu_display(*(manager->active_menu), game->screen); } - else if (game->state == GAME_STATE_PLAYING) + else if (manager->state == GAME_STATE_PLAYING) { game_run(game); } diff --git a/src/manager/game_manager_utils.c b/src/manager/game_manager_utils.c index c9230ad..b0b7a21 100644 --- a/src/manager/game_manager_utils.c +++ b/src/manager/game_manager_utils.c @@ -6,44 +6,19 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/27 15:22:15 by qmennen #+# #+# */ -/* Updated: 2025/05/27 18:40:45 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 14:23:14 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ #include "game_manager.h" -static void game_start(t_game *game) -{ - t_screen *screen; - - screen = game->screen; - if (mlx_image_to_window(screen->mlx, screen->minimap, 175, 575) < 0) - { - printf(RED "Failed to display buffer image\n" RESET); - game_terminate(game); - } - if (mlx_image_to_window(screen->mlx, screen->hud, 0, 0) < 0) - { - printf(RED "Failed to display buffer image\n" RESET); - game_terminate(game); - } - game->state = GAME_STATE_PLAYING; -} - void game_manager_select(t_game_manager *manager) { int selected_option; - int menu_screen; - menu_screen = manager->game->state == GAME_STATE_MENU; selected_option = (*manager->active_menu)->selected_option; - if (menu_screen && selected_option == 0) - { - menu_toggle(*(manager->active_menu), manager->game->screen); - game_start(manager->game); - return ; - } - + (*manager->active_menu)->items[selected_option]->act( + (*manager->active_menu)->items[selected_option], manager); } void game_manager_handle_input(t_game_manager *manager) diff --git a/src/map/grid_free.c b/src/map/grid_free.c index da78d2a..38cd0b1 100644 --- a/src/map/grid_free.c +++ b/src/map/grid_free.c @@ -1,16 +1,15 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* grid_free.c :+: :+: */ -/* +:+ */ -/* By: whaffman +#+ */ -/* +#+ */ -/* Created: 2025/04/23 12:20:38 by whaffman #+# #+# */ -/* Updated: 2025/05/25 18:57:09 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* grid_free.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/04/23 12:20:38 by whaffman #+# #+# */ +/* Updated: 2025/05/28 13:09:39 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ -#include #include "cub3d.h" void grid_free(t_tile **grid, int height) diff --git a/src/map/map_create.c b/src/map/map_create.c index a148990..e532831 100644 --- a/src/map/map_create.c +++ b/src/map/map_create.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* map_create.c :+: :+: */ -/* +:+ */ -/* By: whaffman +#+ */ -/* +#+ */ -/* Created: 2025/04/23 12:21:13 by whaffman #+# #+# */ -/* Updated: 2025/05/25 13:58:34 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* map_create.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/04/23 12:21:13 by whaffman #+# #+# */ +/* Updated: 2025/05/28 13:20:00 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,7 +20,7 @@ static int map_allocate(t_game **game) perror("Error allocating memory for (*game)->map"); return (FAILURE); } - ft_memset((*game)->map, 0, sizeof((*game)->map)); + ft_memset((*game)->map, 0, sizeof(t_map)); (*game)->map->sprite_lib = malloc(sizeof(t_sprite_lib) * 26); if (!(*game)->map->sprite_lib) { diff --git a/src/map/map_free.c b/src/map/map_free.c index 95e52ad..3b8ad20 100644 --- a/src/map/map_free.c +++ b/src/map/map_free.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* map_free.c :+: :+: */ -/* +:+ */ -/* By: whaffman +#+ */ -/* +#+ */ -/* Created: 2025/04/23 12:22:28 by whaffman #+# #+# */ -/* Updated: 2025/05/25 18:56:27 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* map_free.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/04/23 12:22:28 by whaffman #+# #+# */ +/* Updated: 2025/05/28 13:18:25 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,11 +16,8 @@ void map_free(t_map *map) { int i; + grid_free(map->grid, map->height); - // free(map->north_texture); - // free(map->south_texture); - // free(map->west_texture); - // free(map->east_texture); if(map->texture_floor) mlx_delete_texture(map->texture_floor); if(map->texture_ceiling) diff --git a/src/menu/main_menu.c b/src/menu/main_menu.c new file mode 100644 index 0000000..9717e13 --- /dev/null +++ b/src/menu/main_menu.c @@ -0,0 +1,58 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* main_menu.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/05/28 14:14:11 by qmennen #+# #+# */ +/* Updated: 2025/05/28 14:22:31 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "game_menu.h" + +static void game_exit(struct s_menu_item *item, t_game_manager *manager) +{ + (void)item; + game_manager_destroy(manager); +} + +static void game_start(struct s_menu_item *item, t_game_manager *manager) +{ + t_game *game; + t_screen *screen; + + (void)item; + game = manager->game; + screen = game->screen; + if (mlx_image_to_window(screen->mlx, screen->minimap, 175, 575) < 0) + { + printf(RED "Failed to display buffer image\n" RESET); + game_terminate(game); + } + if (mlx_image_to_window(screen->mlx, screen->hud, 0, 0) < 0) + { + printf(RED "Failed to display buffer image\n" RESET); + game_terminate(game); + } + menu_toggle(*(manager->active_menu), screen); + manager->state = GAME_STATE_PLAYING; +} + + +t_menu *create_main_menu(t_game_manager *manager) +{ + const t_menu_item *menu_items[] = { + menu_item_create("Start Game", game_start), + menu_item_create("Scoreboard", NULL), + menu_item_create("Exit", game_exit), + NULL + }; + t_menu *menu; + + menu = menu_create(manager, "./assets/menu_background.png", menu_items); + if (!menu) + return (NULL); + return (menu); +} \ No newline at end of file diff --git a/src/menu/menu.c b/src/menu/menu.c index db85e45..7aa8535 100644 --- a/src/menu/menu.c +++ b/src/menu/menu.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/27 14:31:53 by qmennen #+# #+# */ -/* Updated: 2025/05/27 18:37:03 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 14:12:58 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -29,13 +29,15 @@ static mlx_image_t *menu_load_background(mlx_t *mlx, char *background_path) return (mlx_delete_texture(background_texture), background_image); } -t_menu *menu_create(t_game_manager *manager, char *background_path, const char *options[]) +t_menu *menu_create(t_game_manager *manager, char *background_path, const t_menu_item *options[]) { t_menu *menu; int i; + menu = malloc(sizeof(t_menu)); if (!menu) return (NULL); + ft_memset(menu, 0, sizeof(t_menu)); menu->background_image = menu_load_background(manager->game->screen->mlx, background_path); if (mlx_image_to_window(manager->game->screen->mlx, menu->background_image, 0, 0) < 0) { @@ -44,17 +46,16 @@ t_menu *menu_create(t_game_manager *manager, char *background_path, const char * return (free(menu), NULL); } menu->background_image->instances[0].enabled = false; - ft_memset(menu->option_images, 0, sizeof(menu->option_images)); menu->selector = 0; menu->selected_option = 0; menu->num_options = 0; menu->hidden = 1; i = -1; - while (options[++i] != NULL) + while (options[++i]) { - menu->options[i] = (char *)options[i]; - menu->num_options++; + menu->items[i] = (t_menu_item *) options[i]; } + menu->num_options = 3; return (menu); } @@ -68,7 +69,7 @@ void menu_display(t_menu *menu, t_screen *screen) } if (menu->selector == 0) { - menu->selector = mlx_put_string(screen->mlx, ">", screen->width / 2 - 100, 0); + menu->selector = mlx_put_string(screen->mlx, ">", screen->width / 2 - 100, (screen->height - 100) / 2 + menu->selected_option * 50); } i = 0; while (i < menu->num_options) @@ -77,10 +78,10 @@ void menu_display(t_menu *menu, t_screen *screen) { menu->selector->instances[0].y = (screen->height - 100) / 2 + i * 50; } - if (menu->option_images[i] == 0) + if (menu->items[i]->image == 0) { - menu->option_images[i] = mlx_put_string(screen->mlx, menu->options[i], - (screen->width - ft_strlen(menu->options[i]) * 10) / 2, + menu->items[i]->image = mlx_put_string(screen->mlx, menu->items[i]->text, + (screen->width - ft_strlen(menu->items[i]->text) * 10) / 2, (screen->height - 100) / 2 + i * 50); } i++; @@ -103,11 +104,11 @@ void menu_toggle(t_menu *menu, t_screen *screen) menu->background_image->instances[0].enabled = !menu->hidden; } i = -1; - while (i++ < menu->num_options) + while (++i < menu->num_options) { - if (menu->option_images[i]) + if (menu->items[i]->image) { - menu->option_images[i]->instances[0].enabled = !menu->hidden; + menu->items[i]->image->instances[0].enabled = !menu->hidden; } } } @@ -121,9 +122,9 @@ void menu_free(t_menu *menu, t_screen *screen) return; while (i < menu->num_options) { - if (menu->option_images[i]) + if (menu->items[i]->image) { - mlx_delete_image(screen->mlx, menu->option_images[i]); + mlx_delete_image(screen->mlx, menu->items[i]->image); } i++; } diff --git a/src/menu/menu_item.c b/src/menu/menu_item.c new file mode 100644 index 0000000..6f6ea21 --- /dev/null +++ b/src/menu/menu_item.c @@ -0,0 +1,27 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* menu_item.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/05/28 13:50:14 by qmennen #+# #+# */ +/* Updated: 2025/05/28 14:16:33 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "game_menu.h" + +t_menu_item *menu_item_create(const char *text, + void (*act)(struct s_menu_item *item, t_game_manager *manager)) +{ + t_menu_item *item; + + item = malloc(sizeof(t_menu_item)); + if (!item) + return (NULL); + ft_memset(item, 0, sizeof(t_menu_item)); + item->text = (char *)text; + item->act = act; + return (item); +} \ No newline at end of file diff --git a/src/screen.c b/src/screen.c index 1660d6a..dce1f0f 100644 --- a/src/screen.c +++ b/src/screen.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/15 15:30:27 by qmennen #+# #+# */ -/* Updated: 2025/05/27 16:59:17 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 13:04:33 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,6 +20,7 @@ int screen_create(t_game **game) screen = malloc(sizeof(t_screen)); if (!screen) return (FAILURE); + ft_memset(screen, 0, sizeof(t_screen)); screen->width = WIDTH; screen->height = HEIGHT; mlx_set_setting(MLX_FULLSCREEN, 0); From dc8abaa9ab7fb6020a43c75f40471c906157b090 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Wed, 28 May 2025 15:05:57 +0200 Subject: [PATCH 2/9] now mostly norminette compliant --- inc/game.h | 4 +- inc/game_menu.h | 8 ++- inc/types.h | 4 +- src/{ => game}/game.c | 100 ++-------------------------- src/game/game_hud.c | 101 +++++++++++++++++++++++++++++ src/main.c | 4 +- src/manager/game_manager.c | 27 ++++---- src/manager/game_manager_utils.c | 11 ++-- src/map/map_free.c | 11 ++-- src/menu/main_menu.c | 19 +++--- src/menu/menu.c | 108 +++++++++++-------------------- src/menu/menu_item.c | 8 ++- src/menu/menu_util.c | 30 +++++++++ src/parser/parse_config_line.c | 23 +++---- src/parser/parse_map.c | 30 +++++---- src/render/render_sprite.c | 17 ++--- src/screen.c | 3 +- src/shader/shaders.c | 50 ++++++++++---- src/util/initialize.c | 11 ++-- src/util/keyboard.c | 9 +-- src/util/score.c | 24 +++---- 21 files changed, 319 insertions(+), 283 deletions(-) rename src/{ => game}/game.c (60%) create mode 100644 src/game/game_hud.c create mode 100644 src/menu/menu_util.c diff --git a/inc/game.h b/inc/game.h index 0be522e..ea3d605 100644 --- a/inc/game.h +++ b/inc/game.h @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/15 15:46:16 by qmennen #+# #+# */ -/* Updated: 2025/05/27 13:58:21 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 14:28:02 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,5 +22,7 @@ void game_terminate(t_game *game); void free_game(t_game **game); void print_scores(t_game *game); void game_run(t_game *game); +void handle_battery(t_game *game); +void handle_record(t_game *game); #endif diff --git a/inc/game_menu.h b/inc/game_menu.h index ffd8d66..b769198 100644 --- a/inc/game_menu.h +++ b/inc/game_menu.h @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/27 15:07:48 by qmennen #+# #+# */ -/* Updated: 2025/05/28 14:15:18 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 14:53:54 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,9 +16,11 @@ # include "cub3d.h" void menu_display(t_menu *menu, t_screen *screen); +mlx_image_t *menu_load_background(mlx_t *mlx, char *background_path); t_menu *create_main_menu(t_game_manager *manager); -t_menu *menu_create(t_game_manager *manager, char *background_path, const t_menu_item *options[]); -t_menu_item *menu_item_create(const char *text, +t_menu *menu_create(t_game_manager *manager, char *b_path, + const t_menu_item *options[]); +t_menu_item *menu_item_create(t_screen *screen, const char *text, void (*act)(struct s_menu_item *item, t_game_manager *manager)); void menu_free(t_menu *menu, t_screen *screen); void menu_toggle(t_menu *menu, t_screen *screen); diff --git a/inc/types.h b/inc/types.h index d011f86..71c661a 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/05/28 14:17:55 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 14:40:50 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -173,7 +173,7 @@ typedef struct s_menu // char *options[MAX_MENU_OPTIONS]; // mlx_image_t *option_images[MAX_MENU_OPTIONS]; mlx_image_t *selector; - mlx_image_t *background_image; + mlx_image_t *background; } t_menu; diff --git a/src/game.c b/src/game/game.c similarity index 60% rename from src/game.c rename to src/game/game.c index 7afd721..0803437 100644 --- a/src/game.c +++ b/src/game/game.c @@ -6,13 +6,13 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/15 15:46:08 by qmennen #+# #+# */ -/* Updated: 2025/05/28 14:20:43 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 14:28:16 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ -#include "cub3d.h" -#include "glad.h" -#include "MLX42_Int.h" +#include "game.h" +// #include "glad.h" +// #include "MLX42_Int.h" int game_create(t_game **game) { @@ -20,7 +20,6 @@ int game_create(t_game **game) if (!game) return (FAILURE); ft_memset(*game, 0, sizeof(t_game)); - // (*game)->state = GAME_STATE_MENU; (*game)->fps = 20; return (SUCCESS); } @@ -39,97 +38,6 @@ void free_game(t_game **game) } } -int battery_color(float battery) -{ - if (battery > 0.5f) - return (0x00FF0066); - else if (battery > 0.25f) - return (0xFFFF0066); - else - return (0xFF000066); -} - -void draw_battery(mlx_image_t *img, float battery) -{ - int x; - int y; - - x = 1340; - while (x < 1350) - { - y = 265; - while (y < 285) - { - mlx_put_pixel(img, x, y, battery_color(battery)); - y++; - } - x++; - } - x = 1350; - while (x < 1450) - { - y = 250; - while (y < 300) - { - mlx_put_pixel(img, x, y, battery_color(battery)); - y++; - } - x++; - } -} - -void handle_battery(t_game *game) -{ - static mlx_image_t *bat_img = NULL; - - game->player->battery -= game->screen->mlx->delta_time / 50; - if (game->player->battery < 0.20) - { - //if (bat_img == NULL) - bat_img = mlx_put_string( - game->screen->mlx, "Battery LOW!", 960, 512); - } - else - { - if (bat_img != NULL) - { - mlx_delete_image(game->screen->mlx, bat_img); - bat_img = NULL; - } - - } - draw_battery(game->screen->minimap, game->player->battery); - -} - -void handle_record(t_game *game) -{ - static int flash = 0; - int x; - int y; - - flash = (game->framecount / 30) % 2; - y = -15; - while (y <= 15) - { - x = -15; - while (x <= 15) - { - if (x * x + y * y <= 225) - { - if (flash) - mlx_put_pixel( - game->screen->hud, 1530 + x, 212 + y, 0xFF000055); - else - mlx_put_pixel( - game->screen->hud, 1530 + x, 212 + y, 0x00000066); - } - x++; - } - y++; - } -} - void game_run(t_game *game) { static int fps = 0; diff --git a/src/game/game_hud.c b/src/game/game_hud.c new file mode 100644 index 0000000..010e56f --- /dev/null +++ b/src/game/game_hud.c @@ -0,0 +1,101 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* game_hud.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/05/28 14:26:29 by qmennen #+# #+# */ +/* Updated: 2025/05/28 14:28:40 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "game.h" + +static int battery_color(float battery) +{ + if (battery > 0.5f) + return (0x00FF0066); + else if (battery > 0.25f) + return (0xFFFF0066); + else + return (0xFF000066); +} + +static void draw_battery(mlx_image_t *img, float battery) +{ + int x; + int y; + + x = 1340; + while (x < 1350) + { + y = 265; + while (y < 285) + { + mlx_put_pixel(img, x, y, battery_color(battery)); + y++; + } + x++; + } + x = 1350; + while (x < 1450) + { + y = 250; + while (y < 300) + { + mlx_put_pixel(img, x, y, battery_color(battery)); + y++; + } + x++; + } +} + +void handle_battery(t_game *game) +{ + static mlx_image_t *bat_img = NULL; + + game->player->battery -= game->screen->mlx->delta_time / 50; + if (game->player->battery < 0.20) + { + bat_img = mlx_put_string( + game->screen->mlx, "Battery LOW!", 960, 512); + } + else + { + if (bat_img != NULL) + { + mlx_delete_image(game->screen->mlx, bat_img); + bat_img = NULL; + } + } + draw_battery(game->screen->minimap, game->player->battery); +} + +void handle_record(t_game *game) +{ + static int flash = 0; + int x; + int y; + + flash = (game->framecount / 30) % 2; + y = -15; + while (y <= 15) + { + x = -15; + while (x <= 15) + { + if (x * x + y * y <= 225) + { + if (flash) + mlx_put_pixel( + game->screen->hud, 1530 + x, 212 + y, 0xFF000055); + else + mlx_put_pixel( + game->screen->hud, 1530 + x, 212 + y, 0x00000066); + } + x++; + } + y++; + } +} diff --git a/src/main.c b/src/main.c index 894136d..3ba4a1e 100644 --- a/src/main.c +++ b/src/main.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/15 16:01:29 by qmennen #+# #+# */ -/* Updated: 2025/05/28 14:15:30 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 14:24:29 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -28,7 +28,7 @@ int main(int argc, char **argv) game_free(game); return (EXIT_FAILURE); } - manager = game_manager_create(game); + manager = game_manager_create(game); manager->menu = create_main_menu(manager); manager->active_menu = &manager->menu; mlx_key_hook(game->screen->mlx, keyhandle, game); diff --git a/src/manager/game_manager.c b/src/manager/game_manager.c index 2fb0b20..ad80d4b 100644 --- a/src/manager/game_manager.c +++ b/src/manager/game_manager.c @@ -6,15 +6,16 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/27 13:48:18 by qmennen #+# #+# */ -/* Updated: 2025/05/28 14:20:57 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 15:02:30 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ #include "game_manager.h" -t_game_manager *game_manager_create(t_game *game) +t_game_manager *game_manager_create(t_game *game) { - t_game_manager *manager; + t_game_manager *manager; + manager = malloc(sizeof(t_game_manager)); if (!manager) return (NULL); @@ -24,12 +25,12 @@ t_game_manager *game_manager_create(t_game *game) return (manager); } -void game_manager_display(t_game_manager *manager) +void game_manager_display(t_game_manager *manager) { - t_game *game; + t_game *game; if (!manager || !manager->game) - return; + return ; game = manager->game; if (manager->state == GAME_STATE_MENU) { @@ -41,20 +42,20 @@ void game_manager_display(t_game_manager *manager) } } -void game_manager_update(void *param) +void game_manager_update(void *param) { - t_game_manager *manager; - + t_game_manager *manager; + manager = (t_game_manager *)param; game_manager_handle_input(manager); game_manager_display(manager); keyboard_update(manager->game); } -void game_manager_destroy(t_game_manager *manager) +void game_manager_destroy(t_game_manager *manager) { if (!manager) - return; + return ; if (manager->menu) menu_free(manager->menu, manager->game->screen); if (manager->end_screen) @@ -62,8 +63,8 @@ void game_manager_destroy(t_game_manager *manager) print_scores(manager->game); if (manager->game) { - game_free(manager->game); + game_free(manager->game); } free(manager); exit(EXIT_SUCCESS); -} \ No newline at end of file +} diff --git a/src/manager/game_manager_utils.c b/src/manager/game_manager_utils.c index b0b7a21..5b4b3d6 100644 --- a/src/manager/game_manager_utils.c +++ b/src/manager/game_manager_utils.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/27 15:22:15 by qmennen #+# #+# */ -/* Updated: 2025/05/28 14:23:14 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 15:03:04 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,14 +14,14 @@ void game_manager_select(t_game_manager *manager) { - int selected_option; + int selected_option; selected_option = (*manager->active_menu)->selected_option; (*manager->active_menu)->items[selected_option]->act( (*manager->active_menu)->items[selected_option], manager); } -void game_manager_handle_input(t_game_manager *manager) +void game_manager_handle_input(t_game_manager *manager) { if (get_key_down(manager->game, MLX_KEY_ENTER)) { @@ -31,7 +31,8 @@ void game_manager_handle_input(t_game_manager *manager) if (get_key_up(manager->game, MLX_KEY_DOWN)) { (*manager->active_menu)->selected_option++; - if ((*manager->active_menu)->selected_option >= (*manager->active_menu)->num_options) + if ((*manager->active_menu)->selected_option >= (*manager->active_menu) + ->num_options) (*manager->active_menu)->selected_option = 0; } if (get_key_up(manager->game, MLX_KEY_UP)) @@ -40,4 +41,4 @@ void game_manager_handle_input(t_game_manager *manager) if (manager->menu->selected_option < 0) manager->menu->selected_option = manager->menu->num_options - 1; } -} \ No newline at end of file +} diff --git a/src/map/map_free.c b/src/map/map_free.c index 3b8ad20..0f8e022 100644 --- a/src/map/map_free.c +++ b/src/map/map_free.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/23 12:22:28 by whaffman #+# #+# */ -/* Updated: 2025/05/28 13:18:25 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 14:30:16 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,12 +15,12 @@ void map_free(t_map *map) { - int i; - + int i; + grid_free(map->grid, map->height); - if(map->texture_floor) + if (map->texture_floor) mlx_delete_texture(map->texture_floor); - if(map->texture_ceiling) + if (map->texture_ceiling) mlx_delete_texture(map->texture_ceiling); i = 0; while (i < 26) @@ -38,6 +38,5 @@ void map_free(t_map *map) if (map->textures[i]) mlx_delete_texture(map->textures[i]); } - // free(map->textures); free(map); } diff --git a/src/menu/main_menu.c b/src/menu/main_menu.c index 9717e13..4640c09 100644 --- a/src/menu/main_menu.c +++ b/src/menu/main_menu.c @@ -6,22 +6,22 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/28 14:14:11 by qmennen #+# #+# */ -/* Updated: 2025/05/28 14:22:31 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 15:00:41 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ #include "game_menu.h" -static void game_exit(struct s_menu_item *item, t_game_manager *manager) +static void game_exit(struct s_menu_item *item, t_game_manager *manager) { (void)item; game_manager_destroy(manager); } -static void game_start(struct s_menu_item *item, t_game_manager *manager) +static void game_start(struct s_menu_item *item, t_game_manager *manager) { - t_game *game; - t_screen *screen; + t_game *game; + t_screen *screen; (void)item; game = manager->game; @@ -40,13 +40,12 @@ static void game_start(struct s_menu_item *item, t_game_manager *manager) manager->state = GAME_STATE_PLAYING; } - t_menu *create_main_menu(t_game_manager *manager) { const t_menu_item *menu_items[] = { - menu_item_create("Start Game", game_start), - menu_item_create("Scoreboard", NULL), - menu_item_create("Exit", game_exit), + menu_item_create(manager->game->screen, "Start Game", game_start), + menu_item_create(manager->game->screen, "Scoreboard", NULL), + menu_item_create(manager->game->screen, "Exit", game_exit), NULL }; t_menu *menu; @@ -55,4 +54,4 @@ t_menu *create_main_menu(t_game_manager *manager) if (!menu) return (NULL); return (menu); -} \ No newline at end of file +} diff --git a/src/menu/menu.c b/src/menu/menu.c index 7aa8535..0371843 100644 --- a/src/menu/menu.c +++ b/src/menu/menu.c @@ -6,120 +6,88 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/27 14:31:53 by qmennen #+# #+# */ -/* Updated: 2025/05/28 14:12:58 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 15:00:00 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ -# include "game_menu.h" +#include "game_menu.h" -static mlx_image_t *menu_load_background(mlx_t *mlx, char *background_path) +t_menu *menu_create(t_game_manager *manager, char *b_path, + const t_menu_item *options[]) { - mlx_texture_t *background_texture; - mlx_image_t *background_image; - - if (!background_path) - return (NULL); - background_texture = mlx_load_png(background_path); - if (!background_texture) - { - printf("Failed to load background texture from %s\n", background_path); - return (NULL); - } - background_image = mlx_texture_to_image(mlx, background_texture); - return (mlx_delete_texture(background_texture), background_image); -} - -t_menu *menu_create(t_game_manager *manager, char *background_path, const t_menu_item *options[]) -{ - t_menu *menu; - int i; + t_menu *menu; + int i; menu = malloc(sizeof(t_menu)); if (!menu) return (NULL); ft_memset(menu, 0, sizeof(t_menu)); - menu->background_image = menu_load_background(manager->game->screen->mlx, background_path); - if (mlx_image_to_window(manager->game->screen->mlx, menu->background_image, 0, 0) < 0) + if (b_path) + menu->background = menu_load_background( + manager->game->screen->mlx, b_path); + if (mlx_image_to_window( + manager->game->screen->mlx, menu->background, 0, 0) < 0) { - printf("Failed to display background image\n"); - mlx_delete_image(manager->game->screen->mlx, menu->background_image); + mlx_delete_image(manager->game->screen->mlx, menu->background); return (free(menu), NULL); } - menu->background_image->instances[0].enabled = false; - menu->selector = 0; - menu->selected_option = 0; - menu->num_options = 0; + menu->background->instances[0].enabled = false; menu->hidden = 1; i = -1; while (options[++i]) - { - menu->items[i] = (t_menu_item *) options[i]; - } - menu->num_options = 3; + menu->items[i] = (t_menu_item *)options[i]; + menu->selector = mlx_put_string(manager->game->screen->mlx, ">", 0, 0); + menu->selector->instances[0].enabled = false; + menu->num_options = i; return (menu); } -void menu_display(t_menu *menu, t_screen *screen) +void menu_display(t_menu *menu, t_screen *screen) { - int i; + int i; + int half_w; + int half_h; + half_w = screen->width / 2; + half_h = screen->height / 2; if (menu->hidden) - { menu_toggle(menu, screen); - } - if (menu->selector == 0) - { - menu->selector = mlx_put_string(screen->mlx, ">", screen->width / 2 - 100, (screen->height - 100) / 2 + menu->selected_option * 50); - } + menu->selector->instances[0].x = half_w - 100; + menu->selector->instances[0].y = half_h + menu->selected_option * 50; i = 0; while (i < menu->num_options) { - if (i == menu->selected_option && menu->selector) - { - menu->selector->instances[0].y = (screen->height - 100) / 2 + i * 50; - } - if (menu->items[i]->image == 0) - { - menu->items[i]->image = mlx_put_string(screen->mlx, menu->items[i]->text, - (screen->width - ft_strlen(menu->items[i]->text) * 10) / 2, - (screen->height - 100) / 2 + i * 50); - } + menu->items[i]->image = mlx_put_string( + screen->mlx, menu->items[i]->text, + (screen->width - ft_strlen(menu->items[i]->text) * 10) / 2, + half_h + i * 50); i++; } } void menu_toggle(t_menu *menu, t_screen *screen) { - int i; + int i; if (!menu) - return; + return ; menu->hidden = !menu->hidden; if (menu->selector) - { menu->selector->instances[0].enabled = !menu->hidden; - } - if (menu->background_image) - { - menu->background_image->instances[0].enabled = !menu->hidden; - } + if (menu->background) + menu->background->instances[0].enabled = !menu->hidden; i = -1; while (++i < menu->num_options) - { - if (menu->items[i]->image) - { - menu->items[i]->image->instances[0].enabled = !menu->hidden; - } - } + menu->items[i]->image->instances[0].enabled = !menu->hidden; } void menu_free(t_menu *menu, t_screen *screen) { - int i; + int i; i = 0; if (!menu) - return; + return ; while (i < menu->num_options) { if (menu->items[i]->image) @@ -130,7 +98,7 @@ void menu_free(t_menu *menu, t_screen *screen) } if (menu->selector) mlx_delete_image(screen->mlx, menu->selector); - if (menu->background_image) - mlx_delete_image(screen->mlx, menu->background_image); + if (menu->background) + mlx_delete_image(screen->mlx, menu->background); free(menu); } diff --git a/src/menu/menu_item.c b/src/menu/menu_item.c index 6f6ea21..7556a91 100644 --- a/src/menu/menu_item.c +++ b/src/menu/menu_item.c @@ -6,13 +6,13 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/28 13:50:14 by qmennen #+# #+# */ -/* Updated: 2025/05/28 14:16:33 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 15:00:07 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ #include "game_menu.h" -t_menu_item *menu_item_create(const char *text, +t_menu_item *menu_item_create(t_screen *screen, const char *text, void (*act)(struct s_menu_item *item, t_game_manager *manager)) { t_menu_item *item; @@ -23,5 +23,7 @@ t_menu_item *menu_item_create(const char *text, ft_memset(item, 0, sizeof(t_menu_item)); item->text = (char *)text; item->act = act; + item->image = mlx_put_string(screen->mlx, text, 0, 0); + item->image->instances[0].enabled = false; return (item); -} \ No newline at end of file +} diff --git a/src/menu/menu_util.c b/src/menu/menu_util.c new file mode 100644 index 0000000..01a6a63 --- /dev/null +++ b/src/menu/menu_util.c @@ -0,0 +1,30 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* menu_util.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/05/28 14:45:59 by qmennen #+# #+# */ +/* Updated: 2025/05/28 14:46:31 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "game_menu.h" + +mlx_image_t *menu_load_background(mlx_t *mlx, char *background_path) +{ + mlx_texture_t *background_texture; + mlx_image_t *background_image; + + if (!background_path) + return (NULL); + background_texture = mlx_load_png(background_path); + if (!background_texture) + { + printf("Failed to load background texture from %s\n", background_path); + return (NULL); + } + background_image = mlx_texture_to_image(mlx, background_texture); + return (mlx_delete_texture(background_texture), background_image); +} diff --git a/src/parser/parse_config_line.c b/src/parser/parse_config_line.c index 9949d20..6ca5b3f 100644 --- a/src/parser/parse_config_line.c +++ b/src/parser/parse_config_line.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* parse_config_line.c :+: :+: */ -/* +:+ */ -/* By: whaffman +#+ */ -/* +#+ */ -/* Created: 2025/04/22 13:10:06 by whaffman #+# #+# */ -/* Updated: 2025/05/25 11:13:53 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* parse_config_line.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/04/22 13:10:06 by whaffman #+# #+# */ +/* Updated: 2025/05/28 14:32:43 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -101,12 +101,12 @@ int handle_fc_texture(char *token, t_map *map) int handle_sprite(char *token, t_map *map) { t_sprite_lib sprite; - char symbol; + char symbol; char *texture_path; - + if (token[1] == 'c') sprite.collectible = 1; - else + else sprite.collectible = 0; symbol = *ft_strtok(NULL, " "); if (symbol < 'a' || symbol > 'z') @@ -120,7 +120,8 @@ int handle_sprite(char *token, t_map *map) if (sprite.texture == NULL) return (FAILURE); if (map->sprite_lib[symbol - 'a'].texture != NULL) - return (ft_putstr_fd("Error: Sprite already defined for this symbol\n", 2), FAILURE); + return (ft_putstr_fd( + "Error: Sprite already defined for this symbol\n", 2), FAILURE); map->sprite_lib[symbol - 'a'] = sprite; return (SUCCESS); } diff --git a/src/parser/parse_map.c b/src/parser/parse_map.c index 1472648..775df35 100644 --- a/src/parser/parse_map.c +++ b/src/parser/parse_map.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* parse_map.c :+: :+: */ -/* +:+ */ -/* By: whaffman +#+ */ -/* +#+ */ -/* Created: 2025/04/22 13:12:04 by whaffman #+# #+# */ -/* Updated: 2025/05/25 18:54:20 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* parse_map.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/04/22 13:12:04 by whaffman #+# #+# */ +/* Updated: 2025/05/28 14:34:38 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -74,7 +74,7 @@ int parse_map_line(char **lines, t_game *game, int y) return (SUCCESS); } -int count_sprites(char *line) +int count_sprites(char *line) { int count; int i; @@ -89,7 +89,8 @@ int count_sprites(char *line) } return (count); } -int prepare_map(char **lines, t_game *game) + +int prepare_map(char **lines, t_game *game) { int y; t_map *map; @@ -113,14 +114,14 @@ int prepare_map(char **lines, t_game *game) map->sprites = malloc(sizeof(t_sprite) * (map->n_sprites_max + 1)); if (!map->sprites) return (FAILURE); - ft_memset(map->sprites, 0, sizeof(t_sprite) * (map->n_sprites_max+ 1)); + ft_memset(map->sprites, 0, sizeof(t_sprite) * (map->n_sprites_max + 1)); return (SUCCESS); } -int parse_map_line_sprites(char *line, t_game *game, int y) +int parse_map_line_sprites(char *line, t_game *game, int y) { - int x; - t_map *map; + int x; + t_map *map; t_sprite_lib *sprite_lib; map = game->map; @@ -145,6 +146,7 @@ int parse_map_line_sprites(char *line, t_game *game, int y) } return (SUCCESS); } + int parse_map(char **lines, t_game *game) { int y; @@ -152,7 +154,7 @@ int parse_map(char **lines, t_game *game) map = game->map; if (!prepare_map(lines, game)) - return (FAILURE); + return (FAILURE); y = 0; while (y < map->height) { diff --git a/src/render/render_sprite.c b/src/render/render_sprite.c index e84f73d..d72a4b4 100644 --- a/src/render/render_sprite.c +++ b/src/render/render_sprite.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* render_sprite.c :+: :+: */ -/* +:+ */ -/* By: whaffman +#+ */ -/* +#+ */ -/* Created: 2025/05/08 12:23:17 by qmennen #+# #+# */ -/* Updated: 2025/05/26 12:53:24 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* render_sprite.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/05/08 12:23:17 by qmennen #+# #+# */ +/* Updated: 2025/05/28 15:05:38 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,7 +17,8 @@ static void get_start_end(t_game *game, { double sprite_scale; - sprite_scale = game->screen->height / sprite->dist / sprite->texture->height; + sprite_scale = game->screen->height / sprite->dist + / sprite->texture->height; start->x = 0.5 * (game->screen->width * (1.0 + sprite->cam_frac) - sprite->texture->width / sprite->n_frames * sprite_scale); start->y = 0.5 * (game->screen->height diff --git a/src/screen.c b/src/screen.c index dce1f0f..48d21a8 100644 --- a/src/screen.c +++ b/src/screen.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/15 15:30:27 by qmennen #+# #+# */ -/* Updated: 2025/05/28 13:04:33 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 14:24:41 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -23,7 +23,6 @@ int screen_create(t_game **game) ft_memset(screen, 0, sizeof(t_screen)); screen->width = WIDTH; screen->height = HEIGHT; - mlx_set_setting(MLX_FULLSCREEN, 0); mlx_set_setting(MLX_STRETCH_IMAGE, 1); mlx = mlx_init(WIDTH, HEIGHT, TITLE, true); if (!mlx) diff --git a/src/shader/shaders.c b/src/shader/shaders.c index 6becdce..ace3982 100644 --- a/src/shader/shaders.c +++ b/src/shader/shaders.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/08 18:27:59 by qmennen #+# #+# */ -/* Updated: 2025/05/27 18:45:57 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 14:37:33 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -27,17 +27,13 @@ void set_uniforms(t_game *game) game->screen->width, game->screen->height); } -const char *read_shader(int type) +static const char *read_vertex_shader(void) { - char *shader; - char *target; - int fd; - size_t bytes_read; + const char *target = "./assets/shaders/vert.glsl"; + char *shader; + int fd; + size_t bytes_read; - if (type == 1) - target = "./assets/shaders/vert.glsl"; - else - target = "./assets/shaders/frag.glsl"; fd = open(target, O_RDONLY); if (fd < 0) { @@ -51,7 +47,35 @@ const char *read_shader(int type) bytes_read = read(fd, shader, 4096); if (bytes_read < 0) { - return (perror("Error reading shader file"), free(shader), close(fd), NULL); + return (perror("Error reading shader file"), + free(shader), close(fd), NULL); + } + shader[bytes_read] = '\0'; + return (close(fd), shader); +} + +static const char *read_fragment_shader(void) +{ + const char *target = "./assets/shaders/frag.glsl"; + char *shader; + int fd; + size_t bytes_read; + + fd = open(target, O_RDONLY); + if (fd < 0) + { + return (perror("Error opening shader file"), NULL); + } + shader = malloc(4096); + if (!shader) + { + return (perror("Error allocating memory for shader"), close(fd), NULL); + } + bytes_read = read(fd, shader, 4096); + if (bytes_read < 0) + { + return (perror("Error reading shader file"), + free(shader), close(fd), NULL); } shader[bytes_read] = '\0'; return (close(fd), shader); @@ -59,10 +83,10 @@ const char *read_shader(int type) int shader_init(t_game **game) { - vert_shader = read_shader(1); + vert_shader = read_vertex_shader(); if (!vert_shader) return (FAILURE); - frag_shader = read_shader(2); + frag_shader = read_fragment_shader(); if (!frag_shader) return (FAILURE); return (SUCCESS); diff --git a/src/util/initialize.c b/src/util/initialize.c index 8d17682..9b554ae 100644 --- a/src/util/initialize.c +++ b/src/util/initialize.c @@ -6,13 +6,14 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/22 17:08:26 by qmennen #+# #+# */ -/* Updated: 2025/05/27 15:12:33 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 15:05:21 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ #include "cub3d.h" -t_sprite make_sprite(mlx_texture_t *texture, double x, double y, int collectible) +t_sprite make_sprite(mlx_texture_t *texture, double x, double y, + int collectible) { t_sprite sprite; @@ -38,8 +39,8 @@ t_sprite make_sprite(mlx_texture_t *texture, double x, double y, int collectible static int init_temp(t_game **game) { + mlx_texture_t *hud_texture; // t_sprite *sprites; - // (*game)->map->sprites = malloc(sizeof(t_sprite) * 10); // if (!(*game)->map->sprites) // return (FAILURE); @@ -54,9 +55,7 @@ static int init_temp(t_game **game) // sprites[7] = make_sprite("./assets/battery.png", 2.5, 7.5, 1); // sprites[8] = make_sprite("./assets/broken_mirror.png", 42.5, 4.5, 0); // sprites[9] = make_sprite("./assets/lamp.png", 9.5, 10.5, 0); - // (*game)->map->n_sprites = 10; - mlx_texture_t *hud_texture; - + // (*game)->map->n_sprites = 10; hud_texture = mlx_load_png("./assets/overlay2.png"); (*game)->screen->hud = mlx_texture_to_image((*game)->screen->mlx, hud_texture); diff --git a/src/util/keyboard.c b/src/util/keyboard.c index 08e08f0..68d12dd 100644 --- a/src/util/keyboard.c +++ b/src/util/keyboard.c @@ -6,13 +6,12 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/17 19:29:29 by qmennen #+# #+# */ -/* Updated: 2025/05/27 15:19:38 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 15:04:21 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ #include "keyboard.h" -// TODO: Better int keyboard_create(t_game **game) { t_keyboard *keyboard; @@ -22,11 +21,10 @@ int keyboard_create(t_game **game) if (!keyboard) return (FAILURE); (*game)->keyboard = keyboard; - i = 0; - while (i < NUM_KEYS) + i = -1; + while (++i < NUM_KEYS) { (*game)->keyboard->keys[i] = 0; - i++; } return (SUCCESS); } @@ -55,6 +53,5 @@ int get_key_down(t_game *game, int k) int get_key_up(t_game *game, int k) { - // printf("get_key_up: %d, last_keys %d\n", k, game->keyboard->last_keys[k]); return (!get_key(game, k) && game->keyboard->last_keys[k]); } diff --git a/src/util/score.c b/src/util/score.c index 3fe40c8..4cb0f79 100644 --- a/src/util/score.c +++ b/src/util/score.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* score.c :+: :+: */ -/* +:+ */ -/* By: whaffman +#+ */ -/* +#+ */ -/* Created: 2025/05/25 20:54:23 by whaffman #+# #+# */ -/* Updated: 2025/05/25 21:00:49 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* score.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/05/25 20:54:23 by whaffman #+# #+# */ +/* Updated: 2025/05/28 15:03:53 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -40,7 +40,7 @@ int count_collected(t_game *game) int i; i = 0; - collected = 0; + collected = 0; while (i < game->map->n_sprites) { if (game->map->sprites[i].collectible && !game->map->sprites[i].visible) @@ -52,9 +52,9 @@ int count_collected(t_game *game) void print_scores(t_game *game) { - int empty; - int visited; - int collected; + int empty; + int visited; + int collected; empty = count_tiles(game->map, TILE_EMPTY); visited = count_tiles(game->map, TILE_VISITED); @@ -62,4 +62,4 @@ void print_scores(t_game *game) printf("Score:\n"); printf("Seen %d of %d tiles\n", visited, visited + empty); printf("Collected items: %d\n", collected); -} \ No newline at end of file +} From 10d8544c619198874e684f22d9aa9cc1f5d9a3e9 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Wed, 28 May 2025 15:21:44 +0200 Subject: [PATCH 3/9] text depth for menu items --- src/manager/game_manager.c | 6 +----- src/menu/menu.c | 12 +++++++----- src/menu/menu_item.c | 2 +- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/manager/game_manager.c b/src/manager/game_manager.c index ad80d4b..8ca1a9e 100644 --- a/src/manager/game_manager.c +++ b/src/manager/game_manager.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/27 13:48:18 by qmennen #+# #+# */ -/* Updated: 2025/05/28 15:02:30 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 15:07:38 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -33,13 +33,9 @@ void game_manager_display(t_game_manager *manager) return ; game = manager->game; if (manager->state == GAME_STATE_MENU) - { menu_display(*(manager->active_menu), game->screen); - } else if (manager->state == GAME_STATE_PLAYING) - { game_run(game); - } } void game_manager_update(void *param) diff --git a/src/menu/menu.c b/src/menu/menu.c index 0371843..8218c9d 100644 --- a/src/menu/menu.c +++ b/src/menu/menu.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/27 14:31:53 by qmennen #+# #+# */ -/* Updated: 2025/05/28 15:00:00 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 15:21:30 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -57,10 +57,9 @@ void menu_display(t_menu *menu, t_screen *screen) i = 0; while (i < menu->num_options) { - menu->items[i]->image = mlx_put_string( - screen->mlx, menu->items[i]->text, - (screen->width - ft_strlen(menu->items[i]->text) * 10) / 2, - half_h + i * 50); + menu->items[i]->image->instances[0].x = (screen->width + - ft_strlen(menu->items[i]->text) * 10) / 2; + menu->items[i]->image->instances[0].y = half_h + i * 50; i++; } } @@ -78,7 +77,10 @@ void menu_toggle(t_menu *menu, t_screen *screen) menu->background->instances[0].enabled = !menu->hidden; i = -1; while (++i < menu->num_options) + { menu->items[i]->image->instances[0].enabled = !menu->hidden; + mlx_set_instance_depth(menu->items[i]->image->instances, 7); + } } void menu_free(t_menu *menu, t_screen *screen) diff --git a/src/menu/menu_item.c b/src/menu/menu_item.c index 7556a91..cae2fb4 100644 --- a/src/menu/menu_item.c +++ b/src/menu/menu_item.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/28 13:50:14 by qmennen #+# #+# */ -/* Updated: 2025/05/28 15:00:07 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 15:12:45 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ From c252a9bed1b99963024a0ad863e203c11e686982 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Wed, 28 May 2025 17:01:09 +0200 Subject: [PATCH 4/9] added an enemy --- assets/flying_eye.png | Bin 0 -> 3508 bytes assets/mushroom.png | Bin 0 -> 6803 bytes inc/types.h | 5 +++-- src/game/game.c | 27 +++++++++++---------------- src/game/game_hud.c | 4 ++-- src/parser/parse_config_line.c | 2 +- src/render/render_sprite.c | 4 ++-- src/util/initialize.c | 3 ++- test.cub | 3 ++- 9 files changed, 23 insertions(+), 25 deletions(-) create mode 100644 assets/flying_eye.png create mode 100644 assets/mushroom.png diff --git a/assets/flying_eye.png b/assets/flying_eye.png new file mode 100644 index 0000000000000000000000000000000000000000..cd6d5de12b083ea15567adb42c94e0a6b4b0d0ad GIT binary patch literal 3508 zcmeHJXIE3{8qFw38w5u~lQMXb7Mc(NsS*t+B1H+E(3>i!Kq%6y z3f}E*4pnr``M2z%}w}u#drY#0RQ!C zS8o9T9JTD{OzsoxbtDh5$HtM@uNqlLy`aw;`ik31a&0zC3tlw6EDLWD6qVuD?i)Oo zxU*t8(b_4?p;e_ScP(A#W=|GwGW*j?E{M{9u0@Yq^Q!Ud6H=N!JY1e`_wgX=9m3tY zd*IxheEZ=qrW%C;BGaTh7eTSxKfW`Ek<#qO|G)l$fp@+^5#DNAx*FNc@G(hsP5@xc z?FJv~{$uHIOinHvQ~8O#;0QK5Jl5vBOZw{S@1yGEpm#Q6PvG8Um*mr6a(}63g$+Ro zr2T3T+|c-HOlt590C4w@FzjD2?{h8ecO~VWvw8SxxV>b6UbLi&a)HE;_9{ldCmZK- z)I~1Pmbd>UHFdRVBBu>?XymK@x0(5Lz(r{x=#>-&0KoM?r{O@(|6CM(h0uu~NDvgW z7X|Y1Uyqd1=VNpqnz!slwQF=IH9dxo-$?TL8y)Hc;ZA>Rqx6^eGIoQ}Pt73OaJ$(# zVQ~^fe;nl3jygIG$3Q{?ngx1N=1g0Hl0d!9<%@M>X@5vdQ`htj_}R*-jUPtAfw2u* z$pK!=rm4mH6Vs+i{o`%qR6K=beK<5c@_Q~E@jCzzP8&+_WK$?8=L!;DO+3zQ!Ad9C zHWL#z?=@ceV47Gzk={e4YOp9o|D~|JuqI3hv>osCLP|yh7&pZx`gNh|_o~eK*bf+k z);okSBydK7b!sU$FJIISb`k(CPe1;ITBMJO-)nhhIZoGsehpeTok49)00`)cd}VeC ze$jUpJ>C%z*c~MbdC3rhRuI;h9-K-~J(d^0Uv|0b>~00-h!q6z+9f(^N3IOIb_LW) zGcIj^JjBLgcmeAHFlEg%`jKf)jkiBA;?mGohc1mKPIbZ%CL<<|6HhHxtbc!Uo!Lh+ zpt&~6%UO*ZIoZ@`sI-bzhZ-i-qyH+~>8q8uiyoEOYsW11IIkiPlGCdMNkDO9pz$(x z*4WGc5A=B08|}_TlwaLijt|A%*Pdwb&J{0VZt7+&_0b?4FLY75EQshN+Z?%nkXZOI z?r7ufC^gBHihW_;xsTxEmlmHJl}{LdO^*6X=_4E`nR9Q;$YH$rN<-fBFL~o0_sY{X z6p!Bo)?rS97j_h8%rlfV#Vf~BhB6)9EV|n;C9(-%X`E_1;`2!A!0useD=p}NBr6^g;w zd4)7Kbw$g>+2iCPweA)C7)*&5Z^?iHxJ;v3U$>J6SHO;4&UY`E0DYRw(P`hYkBVTx zX3jg(g>8>AMVl*y`>(=6cW1K-CB7Z3ZIt@_RDX58R?}B#`Fm&IG1pVQOQotzZKX z))kM^S{+)o4J}2MwVNWCy`2LlT*T6lGczyoJaBkT5Tz}&>`}%LgYsplXc!3&gJzWY zX8eY-GSsHMvu?eUc-?~gZA^Ee7Akl#Ejxu;4M%X!@6HH33^dLtfrW5>(sGGC)y4WT z;MPQ{NxKeD>XnzaehU-7?UlT+Xi9AY5+K|Q$$l<9GM+#&(p-JYZVTV)$nQrn+wXR^tdBE-?woh3!nRjDx(4=>lg67H7xLtBKewGyvr`(cddSwZX zKE!2>3NXfqwAFeUsmKLN&gN*`cjbglMaR57M&hU;Yky3n`em%Oi2m$PPp@+gbAp8e zdp`$MR|hjU4DJc3ywE*OrUmdhO-9KXY_kz0)dJ7~aG|X!za!eWa zJM=xnhl0Jukvt7z%8!hzORoEn3Syt!@0Ni<1Xh~Haz`o-^Xb3JJPQ)g?cBc`v{l2O_2d*Fc^{i z>c;F6vuWe}Bn*~hXAd1tw1`YRVr9)sqAd&@^uBI&>mGrIto0PktzOO0hG4>B8~syO zzJf}$5;fD)X54-coW?m=f8JCJsvP{On4$F@`@ow+HtM$aBu^|I&g@*ExP#q~}Zem^5=Fe_0YSvhza76NtN ziSLo=AFh7Ow2Iz-?Seu+KeTe}muF8@H-Det?5cg^BB$h)M9V*I)(CI|!|#+g>8pQ7 z<~PhqymC`6ec7VHGbdff69PR=#pqCz2~TE->0KFWxR)7PQf70I!Z7x{RqwyHo; zCt_0SZB#}CjF%M?{%(BqxmhZVNhOVRenRjFg`l`Aq}Wg{!oU*x-DITYJU(+TDq_^c~dg`G2c2RlqWQo4ou_K!mZB zj@_}C6vf4}=%1ltVsX0m=P+-!-Kx9b=*&1CxCrl^fW&S7XlEp}KPvzlsEF3mg;lR` z6Et}Pm^AHSw$?LseO(;q#e>vDr5d)V(I00G*8=HZZf=~rw8c(10$j%Hth4OYFv>cu zJIMZ-6RPt&-Q;+sJLd2akw-X@o4~apOQj?lC&|#7?9A3_(dK(rzHH&z zvB$)Uw~uktZFT^fHMr*Y)A?ZshIAmTFF@2~oWmoMCVRWI^Aep;JJ~p}g&)>;xVnt- zn`V6I4vi<9e6^Q$!w*9ZRw!+_W! literal 0 HcmV?d00001 diff --git a/assets/mushroom.png b/assets/mushroom.png new file mode 100644 index 0000000000000000000000000000000000000000..a2d40b0c36c4b9bb82654994a9ff081b4646c02d GIT binary patch literal 6803 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 literal 0 HcmV?d00001 diff --git a/inc/types.h b/inc/types.h index 71c661a..067d9ec 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/05/28 14:40:50 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 16:44:33 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -61,6 +61,7 @@ typedef struct s_player typedef struct s_sprite { int n_frames; + int animation_speed; double dist; double cam_frac; int alpha; @@ -145,7 +146,7 @@ typedef struct s_game t_player *player; t_screen *screen; t_keyboard *keyboard; - int framecount; + double elapsed_time; int fps; } t_game; typedef struct s_game_manager diff --git a/src/game/game.c b/src/game/game.c index 0803437..5922e7d 100644 --- a/src/game/game.c +++ b/src/game/game.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/15 15:46:08 by qmennen #+# #+# */ -/* Updated: 2025/05/28 14:28:16 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 16:40:12 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,7 +14,7 @@ // #include "glad.h" // #include "MLX42_Int.h" -int game_create(t_game **game) +int game_create(t_game **game) { *game = malloc(sizeof(t_game)); if (!game) @@ -24,7 +24,7 @@ int game_create(t_game **game) return (SUCCESS); } -void free_game(t_game **game) +void free_game(t_game **game) { if (game && *game) { @@ -38,32 +38,27 @@ void free_game(t_game **game) } } -void game_run(t_game *game) +void game_run(t_game *game) { - static int fps = 0; + static int fps = 0; - game->framecount++; + game->elapsed_time += game->screen->mlx->delta_time; fps += (int)(1.f / game->screen->mlx->delta_time); set_uniforms(game); - if (game->framecount % 20 == 0) - { - game->fps = (int)(fps / 20); - fprintf(stderr, "FPS: %d\n", fps / 20); - fps = 0; - } + player_update(game, game->screen->mlx->delta_time); cast_rays(game); render_map(game); if (game->player->is_moving) { - game->screen->img->instances[0].x = sin(game->framecount / 6.0) * 20; - game->screen->img->instances[0].y = cos(game->framecount / 3.0) * 10; + game->screen->img->instances[0].x = sin(game->elapsed_time * 10) * 20; + game->screen->img->instances[0].y = cos(game->elapsed_time * 18) * 10; } handle_battery(game); handle_record(game); } -void game_free(t_game *game) +void game_free(t_game *game) { if (game->screen) { @@ -86,7 +81,7 @@ void game_free(t_game *game) free(game); } -void game_terminate(t_game *game) +void game_terminate(t_game *game) { print_scores(game); game_free(game); diff --git a/src/game/game_hud.c b/src/game/game_hud.c index 010e56f..394d53d 100644 --- a/src/game/game_hud.c +++ b/src/game/game_hud.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/28 14:26:29 by qmennen #+# #+# */ -/* Updated: 2025/05/28 14:28:40 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 16:03:03 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -78,7 +78,7 @@ void handle_record(t_game *game) int x; int y; - flash = (game->framecount / 30) % 2; + flash = ((int) game->elapsed_time) % 2; y = -15; while (y <= 15) { diff --git a/src/parser/parse_config_line.c b/src/parser/parse_config_line.c index 6ca5b3f..e1bba70 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/05/28 14:32:43 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 16:42:59 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/src/render/render_sprite.c b/src/render/render_sprite.c index d72a4b4..2a1549a 100644 --- a/src/render/render_sprite.c +++ b/src/render/render_sprite.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/08 12:23:17 by qmennen #+# #+# */ -/* Updated: 2025/05/28 15:05:38 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 16:45:20 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -60,7 +60,7 @@ static void draw_sprite_column( tex.y = (y - column.start.y) * sprite->texture->height; tex.y *= inv_range.y; color = sample_texture_color(sprite, tex, - (int)(game->framecount / 20) % sprite->n_frames); + (int)(game->elapsed_time * sprite->animation_speed) % sprite->n_frames); if (y > 0 && y < game->screen->height && (color & 0xFF) != 0) mlx_put_pixel(game->screen->img, column.x, y, color); y++; diff --git a/src/util/initialize.c b/src/util/initialize.c index 9b554ae..d526ee9 100644 --- a/src/util/initialize.c +++ b/src/util/initialize.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/22 17:08:26 by qmennen #+# #+# */ -/* Updated: 2025/05/28 15:05:21 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 16:44:40 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -30,6 +30,7 @@ t_sprite make_sprite(mlx_texture_t *texture, double x, double y, // exit(EXIT_FAILURE); // } sprite.n_frames = sprite.texture->width / sprite.texture->height; + sprite.animation_speed = 10; sprite.pos.x = x; sprite.pos.y = y; sprite.visible = 1; diff --git a/test.cub b/test.cub index d56d505..e1fec73 100644 --- a/test.cub +++ b/test.cub @@ -18,12 +18,13 @@ CT ./assets/ceiling64x64.png -s a ./assets/lamp.png -c b ./assets/accu.png -s p ./assets/plant.png +-s g ./assets/mushroom.png -s m ./assets/broken_mirror.png -s t ./assets/test.png 1111111 111 1111 111111 1111111111 111111 1000001110111001 100001 1000000001 10001 -10010000000b0001 100001 100000110111100011 +1001000g000b0001 100001 100000110111100011 10b0001110000001110011111111 1100b0001000000001 1000001 1000100a000010000001 10000000100b000001 100m00111000100000b00000b00111110p00000100p00m001 From e3ae7b10929cd77236659c551ff1e8942cf1a1f9 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Wed, 28 May 2025 17:08:10 +0200 Subject: [PATCH 5/9] add sprite types --- inc/map.h | 16 ++++++++-------- inc/types.h | 12 +++++++++++- src/game/game_hud.c | 2 +- src/main.c | 2 +- src/parser/parse_config_line.c | 8 +++++++- src/parser/parse_map.c | 7 +++---- src/util/initialize.c | 9 ++++----- 7 files changed, 35 insertions(+), 21 deletions(-) diff --git a/inc/map.h b/inc/map.h index a4be9c9..c829674 100644 --- a/inc/map.h +++ b/inc/map.h @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* map.h :+: :+: */ -/* +:+ */ -/* By: whaffman +#+ */ -/* +#+ */ -/* Created: 2025/04/17 19:19:19 by qmennen #+# #+# */ -/* Updated: 2025/05/25 13:39:13 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* map.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/04/17 19:19:19 by qmennen #+# #+# */ +/* Updated: 2025/05/28 17:07:28 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -26,6 +26,6 @@ int parse_args(const char *mapfile, t_game *game); 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); -t_sprite make_sprite(mlx_texture_t *texture, double x, double y, int collectible); +t_sprite make_sprite(t_sprite_lib *def, double x, double y); #endif diff --git a/inc/types.h b/inc/types.h index 067d9ec..af6249b 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/05/28 16:44:33 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 17:04:35 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -24,6 +24,14 @@ typedef enum TILE TILE_PLAYER = 2, } t_tile; +typedef enum SPRITE_TYPE +{ + SPRITE_TYPE_DEFAULT = 0, + SPRITE_TYPE_COLLECTIBLE = 1, + SPRITE_TYPE_COLLECTED = 2, + SPRITE_TYPE_ENEMY = 3, +} t_sprite_type; + typedef struct s_vec2 { double x; @@ -68,12 +76,14 @@ typedef struct s_sprite int visible; int collectible; mlx_texture_t *texture; + t_sprite_type type; t_vec2 pos; } t_sprite; typedef struct s_sprite_lib { mlx_texture_t *texture; + t_sprite_type type; int collectible; } t_sprite_lib; diff --git a/src/game/game_hud.c b/src/game/game_hud.c index 394d53d..888c1d2 100644 --- a/src/game/game_hud.c +++ b/src/game/game_hud.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/28 14:26:29 by qmennen #+# #+# */ -/* Updated: 2025/05/28 16:03:03 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 17:01:42 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/src/main.c b/src/main.c index 3ba4a1e..b7bd77d 100644 --- a/src/main.c +++ b/src/main.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/15 16:01:29 by qmennen #+# #+# */ -/* Updated: 2025/05/28 14:24:29 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 17:02:03 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/src/parser/parse_config_line.c b/src/parser/parse_config_line.c index e1bba70..36e6fc0 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/05/28 16:42:59 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 17:04:39 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -105,9 +105,15 @@ int handle_sprite(char *token, t_map *map) char *texture_path; if (token[1] == 'c') + { sprite.collectible = 1; + sprite.type = SPRITE_TYPE_COLLECTIBLE; + } else + { sprite.collectible = 0; + sprite.type = SPRITE_TYPE_DEFAULT; + } symbol = *ft_strtok(NULL, " "); if (symbol < 'a' || symbol > 'z') return (ft_putstr_fd("Error: Invalid sprite symbol\n", 2), FAILURE); diff --git a/src/parser/parse_map.c b/src/parser/parse_map.c index 775df35..4634813 100644 --- a/src/parser/parse_map.c +++ b/src/parser/parse_map.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/22 13:12:04 by whaffman #+# #+# */ -/* Updated: 2025/05/28 14:34:38 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 17:07:32 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -137,9 +137,8 @@ int parse_map_line_sprites(char *line, t_game *game, int y) return (FAILURE); } map->sprites[map->n_sprites] = make_sprite( - sprite_lib[line[x] - 'a'].texture, - (double)x + 0.5f, (double)y + 0.5f, - sprite_lib[line[x] - 'a'].collectible); + &sprite_lib[line[x] - 'a'], + (double)x + 0.5f, (double)y + 0.5f); map->n_sprites++; } x++; diff --git a/src/util/initialize.c b/src/util/initialize.c index d526ee9..3713a9f 100644 --- a/src/util/initialize.c +++ b/src/util/initialize.c @@ -6,19 +6,18 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/22 17:08:26 by qmennen #+# #+# */ -/* Updated: 2025/05/28 16:44:40 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 17:07:26 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ #include "cub3d.h" -t_sprite make_sprite(mlx_texture_t *texture, double x, double y, - int collectible) +t_sprite make_sprite(t_sprite_lib *def, double x, double y) { t_sprite sprite; ft_memset(&sprite, 0, sizeof(t_sprite)); - sprite.texture = texture; + sprite.texture = def->texture; // if (sprite.texture->width % 64 != 0) // { // ft_putstr_fd("Error: Texture width is not a multiple of 64\n", 2); @@ -34,7 +33,7 @@ t_sprite make_sprite(mlx_texture_t *texture, double x, double y, sprite.pos.x = x; sprite.pos.y = y; sprite.visible = 1; - sprite.collectible = collectible; + sprite.collectible = def->type == SPRITE_TYPE_COLLECTIBLE; return (sprite); } From 20b0c461b0e3780f2073abee48c34e62548ae5ab Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Wed, 28 May 2025 17:15:22 +0200 Subject: [PATCH 6/9] refactor to sprite type --- inc/types.h | 4 +--- src/collision.c | 19 ++++++++++--------- src/parser/parse_config_line.c | 2 +- src/render/render_sprite.c | 4 ++-- src/util/initialize.c | 5 ++--- src/util/score.c | 4 ++-- 6 files changed, 18 insertions(+), 20 deletions(-) diff --git a/inc/types.h b/inc/types.h index af6249b..ca6ee21 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/05/28 17:04:35 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 17:14:28 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -73,8 +73,6 @@ typedef struct s_sprite double dist; double cam_frac; int alpha; - int visible; - int collectible; mlx_texture_t *texture; t_sprite_type type; t_vec2 pos; diff --git a/src/collision.c b/src/collision.c index b7f70c7..69e2b04 100644 --- a/src/collision.c +++ b/src/collision.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ -/* :::::::: */ -/* collision.c :+: :+: */ -/* +:+ */ -/* By: qmennen +#+ */ -/* +#+ */ -/* Created: 2025/04/22 14:40:59 by qmennen #+# #+# */ -/* Updated: 2025/05/23 17:29:23 by whaffman ######## odam.nl */ +/* ::: :::::::: */ +/* collision.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/04/22 14:40:59 by qmennen #+# #+# */ +/* Updated: 2025/05/28 17:13:24 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -28,12 +28,13 @@ int collision_sprite(t_map *map, t_player *player, double xa, double ya) i = 0; while (i < map->n_sprites) { - if (sprites[i].visible && sprites[i].collectible) + if (sprites[i].type == SPRITE_TYPE_COLLECTIBLE) { + if (fabs(player->pos.x + xa - sprites[i].pos.x) < 0.5 && fabs(player->pos.y + ya - sprites[i].pos.y) < 0.5) { - sprites[i].visible = 0; + sprites[i].type = SPRITE_TYPE_COLLECTED; collect(player); return (1); } diff --git a/src/parser/parse_config_line.c b/src/parser/parse_config_line.c index 36e6fc0..86898ca 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/05/28 17:04:39 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 17:13:29 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/src/render/render_sprite.c b/src/render/render_sprite.c index 2a1549a..8803b8e 100644 --- a/src/render/render_sprite.c +++ b/src/render/render_sprite.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/08 12:23:17 by qmennen #+# #+# */ -/* Updated: 2025/05/28 16:45:20 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 17:13:59 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -100,7 +100,7 @@ void render_sprites(t_render *render, t_game *game) i = 0; while (i < game->map->n_sprites) { - if (!game->map->sprites[i].visible) + if (game->map->sprites[i].type == SPRITE_TYPE_COLLECTED) { i++; continue ; diff --git a/src/util/initialize.c b/src/util/initialize.c index 3713a9f..76eb3a5 100644 --- a/src/util/initialize.c +++ b/src/util/initialize.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/22 17:08:26 by qmennen #+# #+# */ -/* Updated: 2025/05/28 17:07:26 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 17:15:03 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -32,8 +32,7 @@ t_sprite make_sprite(t_sprite_lib *def, double x, double y) sprite.animation_speed = 10; sprite.pos.x = x; sprite.pos.y = y; - sprite.visible = 1; - sprite.collectible = def->type == SPRITE_TYPE_COLLECTIBLE; + sprite.type = def->type; return (sprite); } diff --git a/src/util/score.c b/src/util/score.c index 4cb0f79..9a4ad57 100644 --- a/src/util/score.c +++ b/src/util/score.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/25 20:54:23 by whaffman #+# #+# */ -/* Updated: 2025/05/28 15:03:53 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 17:14:53 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -43,7 +43,7 @@ int count_collected(t_game *game) collected = 0; while (i < game->map->n_sprites) { - if (game->map->sprites[i].collectible && !game->map->sprites[i].visible) + if (game->map->sprites[i].type == SPRITE_TYPE_COLLECTED) collected++; i++; } From 5d47d033c3d4680a72ad9e33f6cbc432353db400 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Wed, 28 May 2025 17:45:49 +0200 Subject: [PATCH 7/9] monsters --- Makefile | 2 +- inc/cub3d.h | 3 ++- inc/monster.h | 20 ++++++++++++++++++ monster.cub | 24 +++++++++++++++++++++ src/game/game.c | 4 ++-- src/monster/monster.c | 38 ++++++++++++++++++++++++++++++++++ src/parser/parse_config_line.c | 4 ++-- 7 files changed, 89 insertions(+), 6 deletions(-) create mode 100644 inc/monster.h create mode 100644 monster.cub create mode 100644 src/monster/monster.c diff --git a/Makefile b/Makefile index bc23d75..5067e68 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: qmennen +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2024/10/15 11:48:46 by whaffman #+# #+# # -# Updated: 2025/05/27 17:00:58 by qmennen ### ########.fr # +# Updated: 2025/05/28 17:44:58 by qmennen ### ########.fr # # # # **************************************************************************** # diff --git a/inc/cub3d.h b/inc/cub3d.h index 90306e3..8cdb116 100644 --- a/inc/cub3d.h +++ b/inc/cub3d.h @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/15 12:22:29 by qmennen #+# #+# */ -/* Updated: 2025/05/27 18:14:06 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 17:30:51 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -60,6 +60,7 @@ # include "texture.h" # include "game_manager.h" # include "game_menu.h" +# include "monster.h" int initialize_cub3d(t_game **game, const char *mapfile); int shader_init(t_game **game); diff --git a/inc/monster.h b/inc/monster.h new file mode 100644 index 0000000..c6eeeb4 --- /dev/null +++ b/inc/monster.h @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* monster.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/05/28 17:16:29 by qmennen #+# #+# */ +/* Updated: 2025/05/28 17:16:43 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef MONSTER_H +# define MONSTER_H + +# include "cub3d.h" + +void update_monsters(t_game *game); + +#endif \ No newline at end of file diff --git a/monster.cub b/monster.cub new file mode 100644 index 0000000..79abf5a --- /dev/null +++ b/monster.cub @@ -0,0 +1,24 @@ + + +NO ./assets/tiles256.png + +WE ./assets/bricks2.png + +SO ./assets/stonewall256.png +EA ./assets/bricksx64.png + +F 90,30,30 + + +C 100,100,200 + +FT ./assets/tiles3.png +CT ./assets/ceiling64x64.png + +-s a ./assets/flying_eye.png + +11111111 +1000a001 +10000001 +100N0001 +11111111 \ No newline at end of file diff --git a/src/game/game.c b/src/game/game.c index 5922e7d..8e5b2c6 100644 --- a/src/game/game.c +++ b/src/game/game.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/15 15:46:08 by qmennen #+# #+# */ -/* Updated: 2025/05/28 16:40:12 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 17:39:24 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -45,9 +45,9 @@ void game_run(t_game *game) game->elapsed_time += game->screen->mlx->delta_time; fps += (int)(1.f / game->screen->mlx->delta_time); set_uniforms(game); - player_update(game, game->screen->mlx->delta_time); cast_rays(game); + update_monsters(game); render_map(game); if (game->player->is_moving) { diff --git a/src/monster/monster.c b/src/monster/monster.c new file mode 100644 index 0000000..ffc5345 --- /dev/null +++ b/src/monster/monster.c @@ -0,0 +1,38 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* monster.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/05/28 17:15:52 by qmennen #+# #+# */ +/* Updated: 2025/05/28 17:45:37 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +# include "cub3d.h" + +void update_monsters(t_game *game) +{ + int i; + double dx; + double dy; + t_sprite *sprite; + + i = -1; + while (++i < game->map->n_sprites) + { + sprite = &game->map->sprites[i]; + if (sprite->type != SPRITE_TYPE_ENEMY) + continue; + dx = game->player->pos.x - sprite->pos.x; + dy = game->player->pos.y - sprite->pos.y; + double dist_squared = dx * dx + dy * dy; + if (dist_squared > 0) + { + double inv_dist = 1.0 / sqrt(dist_squared); + sprite->pos.x += dx * inv_dist * .05f; + sprite->pos.y += dy * inv_dist * .05f; + } + } +} \ No newline at end of file diff --git a/src/parser/parse_config_line.c b/src/parser/parse_config_line.c index 86898ca..cf1bdc1 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/05/28 17:13:29 by qmennen ### ########.fr */ +/* Updated: 2025/05/28 17:32:08 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -112,7 +112,7 @@ int handle_sprite(char *token, t_map *map) else { sprite.collectible = 0; - sprite.type = SPRITE_TYPE_DEFAULT; + sprite.type = SPRITE_TYPE_ENEMY; } symbol = *ft_strtok(NULL, " "); if (symbol < 'a' || symbol > 'z') From 4d623fd7a0b8c45f4aba55c298583679e98eca64 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Wed, 28 May 2025 17:49:16 +0200 Subject: [PATCH 8/9] long creepy hallway --- Makefile | 4 ++-- monster.cub | 26 +++++++++++++++++++++----- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index 5067e68..a6eb94e 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: qmennen +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2024/10/15 11:48:46 by whaffman #+# #+# # -# Updated: 2025/05/28 17:44:58 by qmennen ### ########.fr # +# Updated: 2025/05/28 17:48:28 by qmennen ### ########.fr # # # # **************************************************************************** # @@ -53,7 +53,7 @@ debug_CFLAGS = -Wall -Werror -Werror -g3 -DDEBUG -DDBG='fprintf(stderr, RED "DEB asan_CFLAGS = -Wall -Werror -Werror -fsanitize=address,leak,undefined -g3 tsan_CFLAGS = -Wall -Werror -Werror -fsanitize=thread -g3 -RUN_ARGS=test.cub +RUN_ARGS=monster.cub # Targets for each build configuration define BUILD_TARGETS diff --git a/monster.cub b/monster.cub index 79abf5a..e31fe50 100644 --- a/monster.cub +++ b/monster.cub @@ -17,8 +17,24 @@ CT ./assets/ceiling64x64.png -s a ./assets/flying_eye.png -11111111 -1000a001 -10000001 -100N0001 -11111111 \ No newline at end of file +1111 +1a01 +1001 +1001 +1001 +1001 +1001 +1001 +1001 +1001 +1001 +1001 +1001 +1001 +1001 +1001 +1001 +1001 +1001 +10N1 +1111 From b6edfa9f2277cece80ad5e668e97d1be717de3d8 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Wed, 28 May 2025 17:50:50 +0200 Subject: [PATCH 9/9] mushroooom --- monster.cub | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/monster.cub b/monster.cub index e31fe50..96f247d 100644 --- a/monster.cub +++ b/monster.cub @@ -16,11 +16,12 @@ FT ./assets/tiles3.png CT ./assets/ceiling64x64.png -s a ./assets/flying_eye.png +-s b ./assets/mushroom.png 1111 1a01 1001 -1001 +10b1 1001 1001 1001 @@ -37,4 +38,4 @@ CT ./assets/ceiling64x64.png 1001 1001 10N1 -1111 +1111 \ No newline at end of file