/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* game.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/15 15:46:08 by qmennen #+# #+# */ /* Updated: 2025/06/11 19:05:43 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ #include "game.h" int game_create(t_game **game) { *game = malloc(sizeof(t_game)); if (!game) return (FAILURE); ft_memset(*game, 0, sizeof(t_game)); (*game)->fps = 20; (*game)->scoreboard = malloc(sizeof(t_scoreboard)); ft_memset((*game)->scoreboard, 0, sizeof(t_scoreboard)); if (!(*game)->scoreboard) return (free(*game), FAILURE); return (SUCCESS); } void game_over(t_game_manager *manager) { t_game *game; game = manager->game; game->screen->hud->instances[0].enabled = false; game->screen->minimap->instances[0].enabled = false; game->screen->img->instances[0].enabled = false; game->scoreboard->end_time = mlx_get_time(); manager->state = GAME_STATE_END_SCREEN; manager->active_menu = &manager->end_screen; ft_memset(game->audio->stop_queue, 1, SND_SIZE * sizeof(char)); game->audio->stop_queue[SND_DEATH] = 0; game->audio->play_queue[SND_DEATH] = 1; audio_handle_queues(game->audio); set_uniforms(game); } static void handle_sound(t_game *game) { t_audio *audio; audio = game->audio; if (!audio) return ; if (game->player->is_moving) audio->play_queue[SND_WALK] = 1; else audio->stop_queue[SND_WALK] = 1; if (game->player->hit_timer > 0) audio->play_queue[SND_DAMAGE] = 1; else audio->stop_queue[SND_DAMAGE] = 1; audio_handle_queues(audio); } void game_run(t_game *game) { static int fps = 0; fps += (int)(1.f / game->screen->mlx->delta_time); handle_sound(game); set_uniforms(game); player_update(game, game->screen->mlx->delta_time); cast_rays(game); update_monsters(game); render_map(game); handle_battery(game); handle_record(game); handle_mouse(game); collision_sprite(game, 0, 0); if (game->player->battery <= 0 || count_tiles(game->map, TILE_EMPTY) == 0) game_over(game->manager); } void game_free(t_game *game) { if (game->scoreboard) free(game->scoreboard); if (game->screen) free(game->screen); if (game->player) free(game->player); if (game->map) map_free(game->map); if (game->keyboard) free(game->keyboard); game->scoreboard = NULL; free(game); }