use prometeu_hal::RuntimePlatform; use prometeu_hal::app_mode::AppMode; use prometeu_hal::log::LogSource; use prometeu_system::task::TaskId; use prometeu_system::{LifecycleError, SystemOS}; #[derive(Debug, Clone, PartialEq, Eq)] pub(crate) enum ResidentGameTerminationOutcome { NoResidentGame, Terminated { task_id: TaskId, title: String }, } pub(crate) fn terminate_resident_game( os: &mut SystemOS, platform: &mut dyn RuntimePlatform, log_manual_hub_kill: bool, ) -> Result { let Some(task_id) = os.lifecycle().resident_game_task() else { return Ok(ResidentGameTerminationOutcome::NoResidentGame); }; let title = os .sessions() .vm_session_for_task(task_id) .map(|session| session.title.clone()) .unwrap_or_else(|| "".to_string()); let terminated = os.lifecycle().terminate_resident_game()?; let Some(task_id) = terminated else { return Ok(ResidentGameTerminationOutcome::NoResidentGame); }; os.vm().transition_render_owner(AppMode::Shell, 0); platform.game2d_frame_composer().unbind_scene(); platform.assets_mut().shutdown(); if log_manual_hub_kill { os.info(LogSource::Hub, format!("Resident game killed from Hub: {title}")); } Ok(ResidentGameTerminationOutcome::Terminated { task_id, title }) }