use crate::firmware::firmware_state::{ AppCrashesStep, FirmwareState, GameRunningStep, ShellRunningStep, }; use crate::firmware::prometeu_context::PrometeuContext; use prometeu_hal::app_mode::AppMode; use prometeu_hal::cartridge::Cartridge; use prometeu_hal::color::Color; use prometeu_hal::log::{LogLevel, LogSource}; use prometeu_hal::primitives::Rect; use prometeu_system::CrashReport; use prometeu_system::windows::WindowOwner; #[derive(Debug, Clone)] pub struct LoadCartridgeStep { pub cartridge: Cartridge, init_error: Option, } impl LoadCartridgeStep { pub fn new(cartridge: Cartridge) -> Self { Self { cartridge, init_error: None } } pub fn on_enter(&mut self, ctx: &mut PrometeuContext) { ctx.os.log( LogLevel::Info, LogSource::Pos, 0, format!("Loading cartridge: {}", self.cartridge.title), ); // Initialize Asset Manager ctx.hw.assets_mut().initialize_for_cartridge( self.cartridge.asset_table.clone(), self.cartridge.preload.clone(), self.cartridge.assets.clone(), ); self.init_error = ctx.os.vm().initialize(ctx.vm, &self.cartridge).err(); } pub fn on_update(&mut self, ctx: &mut PrometeuContext) -> Option { if let Some(report) = self.init_error.take() { return Some(FirmwareState::AppCrashes(AppCrashesStep { report })); } if self.cartridge.app_mode == AppMode::Shell { let task_id = ctx .os .sessions() .create_vm_shell_task(self.cartridge.app_id, self.cartridge.title.clone()); let id = ctx.os.windows().add_window( self.cartridge.title.clone(), WindowOwner::Task(task_id), Rect { x: 40, y: 20, w: 240, h: 140 }, Color::WHITE, ); ctx.os.windows().set_focus(id); return Some(FirmwareState::ShellRunning(ShellRunningStep::new(task_id))); } let task_id = ctx .os .sessions() .create_vm_game_task(self.cartridge.app_id, self.cartridge.title.clone()); Some(FirmwareState::GameRunning(GameRunningStep::new(task_id))) } pub fn on_exit(&mut self, _ctx: &mut PrometeuContext) {} }