WIP local save file component

This commit is contained in:
lif 2021-12-07 18:10:49 -08:00
parent ed3b78eaa1
commit 56729dac15
4 changed files with 50 additions and 0 deletions

View File

@ -92,6 +92,8 @@ pub fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
save_path: Some(std::env::temp_dir()),
})?;
emu.register_component(LocalFileSaveComponent::default())?;
emu.init()?;
emu.load_game(&opt.rom)?;
if let Some(state) = opt.state {

View File

@ -61,6 +61,7 @@ pub trait RetroComponent: RetroCallbacks + Any {
fn post_load_game(&mut self, retro: &mut LibretroWrapper, rom: &Path) -> Result<()> { Ok(()) }
fn pre_run(&mut self, retro: &mut LibretroWrapper) -> ControlFlow { ControlFlow::Continue }
fn post_run(&mut self, retro: &mut LibretroWrapper) -> ControlFlow { ControlFlow::Continue }
fn pre_drop(&mut self, retro: &mut LibretroWrapper) {}
}
impl RetroComponentBase {
@ -608,6 +609,9 @@ impl RetroCallbacks for RetroComponentBase {
impl Drop for RetroComponentBase {
fn drop(&mut self) {
for comp in &mut self.components {
comp.pre_drop(&mut self.retro);
}
ferretro_base::retro::unset_handler(self.handler_id.unwrap()).unwrap();
}
}

View File

@ -7,6 +7,7 @@ mod input;
mod logs;
mod memory;
mod paths;
mod saves;
mod variables;
pub use camera::CameraInfoComponent;
@ -16,4 +17,5 @@ pub use logs::StderrCallTraceComponent;
pub use logs::StderrLogComponent;
pub use logs::StderrSysInfoLogComponent;
pub use paths::PathBufComponent;
pub use saves::LocalFileSaveComponent;
pub use variables::VariableStoreComponent;

View File

@ -0,0 +1,42 @@
use std::error::Error;
use std::fs::File;
use std::io::{Read, Write};
use std::path::{Path, PathBuf};
use crate::prelude::{LibretroWrapper, RetroCallbacks, RetroComponent};
use ferretro_base::retro::ffi::MEMORY_SAVE_RAM;
#[derive(Default)]
pub struct LocalFileSaveComponent {
rom_path: PathBuf,
initial_sram: Vec<u8>,
}
impl LocalFileSaveComponent {
fn save_path(&self) -> PathBuf {
self.rom_path.with_extension(".sav")
}
}
impl RetroComponent for LocalFileSaveComponent {
fn post_load_game(&mut self, retro: &mut LibretroWrapper, rom: &Path) -> Result<(), Box<dyn Error + Send + Sync>> {
self.rom_path = rom.to_path_buf();
let save = self.save_path();
if save.is_file() {
File::open(save)?.read(retro.mut_memory(MEMORY_SAVE_RAM))?;
}
self.initial_sram = retro.get_memory(MEMORY_SAVE_RAM).to_vec();
Ok(())
}
fn pre_drop(&mut self, retro: &mut LibretroWrapper) {
let final_sram = retro.get_memory(MEMORY_SAVE_RAM);
if &self.initial_sram != final_sram {
let save = self.save_path();
if let Ok(mut f) = File::create(save) {
let _ = f.write(final_sram);
}
}
}
}
impl RetroCallbacks for LocalFileSaveComponent {}