diff --git a/src/event_manager.odin b/src/event_manager.odin index 4ae6f36..dc3174e 100644 --- a/src/event_manager.odin +++ b/src/event_manager.odin @@ -2,12 +2,19 @@ package game // all possible game events Event_Type :: enum { + // game state Game_Start, Game_Over, Game_Quit, Game_Pause, Game_Resume, Game_Main_Menu, + Game_Settings, + + // ui events + UI_Select, + + // gameplay Score_Change, Ball_Collision, } @@ -27,4 +34,42 @@ emit_event :: proc(event: Event) { flush_events :: proc() { clear(&GLOBAL_EVENTS) +} + +process_events :: proc(game: ^Game) { + for event in GLOBAL_EVENTS { + #partial switch event.type { + case .Game_Start: + game.overlay_scene = nil + game.scene = make_gameplay_scene() + audio_fade_in(&game.audio, duration = 1.5) + + case .Game_Pause: + game.overlay_scene = make_pause_overlay() + + case .Game_Resume: + game.overlay_scene = nil + + case .Game_Main_Menu: + game.overlay_scene = nil + game.scene = make_main_menu() + audio_fade_out(&game.audio, duration = 1.0) + + case .Game_Settings: + game.overlay_scene = nil + game.overlay_scene = make_settings_menu(&game.audio) + + case .Game_Over: + game.overlay_scene = make_game_over_overlay(event.winner_is_player) + + case .Game_Quit: + game.should_close = true + + case .UI_Select: + audio_play_sfx(&game.audio, .UI_Select) + + case .Ball_Collision: + audio_play_sfx(&game.audio, .Ball_Collision) + } + } } \ No newline at end of file diff --git a/src/scene_manager.odin b/src/scene_manager.odin index a2931da..7adb565 100644 --- a/src/scene_manager.odin +++ b/src/scene_manager.odin @@ -267,69 +267,4 @@ make_gameplay_scene :: proc() -> Scene { type = .Gameplay, level = init_level(), } -} - -// ------------------------------------------------------------------------------ -// Unified Scene Dispatchers -// ------------------------------------------------------------------------------ -scene_render :: proc(scene: ^Scene) { - if level, ok := scene.level.?; ok { - render_level(level) - render_hud(level) - } - - #partial switch scene.type { - case .Pause_Menu: - render_pause_menu(scene^) - case .Game_Over: - render_game_over(scene^) - case .Main_Menu: - render_main_menu(scene^) - } -} - -scene_update :: proc(scene: ^Scene, game: ^Game, input: Input_Event, dt: f32) { - #partial switch scene.type { - case .Main_Menu: - update_main_menu(scene, input) - - case .Pause_Menu: - update_pause_menu(scene, input) - - case .Gameplay: - level, level_ok := &scene.level.? - assert(level_ok, "scene_update: .Gameplay scene is missing a Level component") - update_level(level, input, dt) - - if input.pause_pressed { - emit_event(Event{ type = .Game_Pause }) - } - - case .Game_Over: - update_game_over(scene, input) - } - - for event in GLOBAL_EVENTS { - #partial switch event.type { - case .Game_Start: - game.overlay_scene = nil - game.scene = make_gameplay_scene() - - case .Game_Pause: - game.overlay_scene = make_pause_overlay() - - case .Game_Resume: - game.overlay_scene = nil - - case .Game_Main_Menu: - game.overlay_scene = nil - game.scene = make_main_menu() - - case .Game_Over: - game.overlay_scene = make_game_over_overlay(event.winner_is_player) - - case .Game_Quit: - game.should_close = true - } - } } \ No newline at end of file