Add CLI option to load a save state (#681)

* Add CLI option to load a save state

* more

* more

* more
This commit is contained in:
Logan McNaughton
2026-03-19 14:06:53 +01:00
committed by GitHub
parent e7dfd02e17
commit 72df783d8c
9 changed files with 37 additions and 3 deletions
+2 -2
View File
@@ -300,7 +300,7 @@ static ImageHandle create_message_image(Vulkan::Device &device, int width, const
return handle;
}
void rdp_init(void *_window, GFX_INFO _gfx_info, const void *font, size_t font_size)
void rdp_init(void *_window, GFX_INFO _gfx_info, const void *font, size_t font_size, uint32_t save_state_slot)
{
memset(&rdp_device, 0, sizeof(RDP_DEVICE));
@@ -365,7 +365,7 @@ void rdp_init(void *_window, GFX_INFO _gfx_info, const void *font, size_t font_s
callback.emu_running = true;
callback.enable_speedlimiter = true;
callback.paused = false;
callback.save_state_slot = 0;
callback.save_state_slot = save_state_slot;
crop_letterbox = false;
messages = std::queue<std::string>();
+1 -1
View File
@@ -38,7 +38,7 @@ extern "C"
uint32_t save_state_slot;
} CALL_BACK;
void rdp_init(void *_window, GFX_INFO _gfx_info, const void *font, size_t font_size);
void rdp_init(void *_window, GFX_INFO _gfx_info, const void *font, size_t font_size, uint32_t save_state_slot);
void rdp_close();
void rdp_set_vi_register(uint32_t reg, uint32_t value);
void rdp_update_screen();
+4
View File
@@ -50,6 +50,10 @@ pub fn run_game(device: &mut Device, rom_contents: Vec<u8>, game_settings: ui::g
if game_settings.disable_expansion_pak {
device.rdram.size = 0x400000;
}
if let Some(slot) = game_settings.load_savestate_slot {
device.ui.storage.save_state_slot = slot;
device.load_state = true;
}
init_rng(device);
+14
View File
@@ -72,6 +72,13 @@ struct Args {
help = "Clear all input profile bindings and controller assignments"
)]
clear_input_bindings: bool,
#[arg(
short = 's',
long,
value_name = "SLOT",
help = "Load savestate from slot 0-9 when starting the game"
)]
load_state: Option<u32>,
}
fn main() -> std::io::Result<()> {
@@ -98,6 +105,12 @@ fn main() -> std::io::Result<()> {
)));
};
if let Some(slot) = args.load_state
&& slot > 9
{
return Err(Error::other("Savestate slot must be between 0 and 9"));
}
let handle = runtime.spawn(async move {
let mut device = device::Device::new();
let overclock = device.ui.config.emulation.overclock;
@@ -116,6 +129,7 @@ fn main() -> std::io::Result<()> {
overclock,
disable_expansion_pak,
cheats: game_cheats,
load_savestate_slot: args.load_state,
},
);
});
+8
View File
@@ -219,6 +219,14 @@ pub fn load_savestate(device: &mut device::Device) {
),
);
}
} else {
ui::video::onscreen_message(
&device.ui,
&format!(
"Could not find savestate in slot {}",
device.ui.storage.save_state_slot
),
);
}
}
+2
View File
@@ -30,6 +30,7 @@ pub struct GameSettings {
pub overclock: bool,
pub disable_expansion_pak: bool,
pub cheats: std::collections::HashMap<String, Option<String>>,
pub load_savestate_slot: Option<u32>,
}
fn check_latest_version(weak: slint::Weak<AppWindow>) {
@@ -458,6 +459,7 @@ fn open_rom(app: &AppWindow, usb: ui::Usb) {
overclock,
disable_expansion_pak,
cheats: std::collections::HashMap::new(), // will be filled in later
load_savestate_slot: None,
},
None,
usb,
+4
View File
@@ -704,6 +704,7 @@ fn create_session(
overclock: overclock.parse().unwrap(),
disable_expansion_pak: disable_expansion_pak.parse().unwrap(),
cheats: serde_json::from_str(cheats).unwrap(),
load_savestate_slot: None,
},
handle.get_peer_addr(),
weak_app,
@@ -821,6 +822,7 @@ fn join_session(
overclock: overclock.parse().unwrap(),
disable_expansion_pak: disable_expansion_pak.parse().unwrap(),
cheats: serde_json::from_str(cheats).unwrap(),
load_savestate_slot: None,
},
handle.get_peer_addr(),
weak_app,
@@ -1083,6 +1085,7 @@ fn setup_wait_window(
overclock: game_settings.overclock,
disable_expansion_pak: game_settings.disable_expansion_pak,
cheats: game_settings.cheats,
load_savestate_slot: None,
},
Some(NetplayDevice {
peer_addr: socket_addr,
@@ -1203,6 +1206,7 @@ pub fn netplay_window(app: &AppWindow, controller_paths: &[Option<String>]) {
overclock: handle.get_overclock_n64_cpu(),
disable_expansion_pak: handle.get_disable_expansion_pak(),
cheats: std::collections::HashMap::new(), // not used here
load_savestate_slot: None,
},
handle.get_rom_dir(),
weak_app,
+1
View File
@@ -52,6 +52,7 @@ fn upload_rom(
overclock: handle.get_overclock_n64_cpu(),
disable_expansion_pak: handle.get_disable_expansion_pak(),
cheats: std::collections::HashMap::new(), // will be filled in later
load_savestate_slot: None,
},
None,
ui::Usb {
+1
View File
@@ -81,6 +81,7 @@ pub fn init(device: &mut device::Device) {
gfx_info,
font_bytes.as_ptr() as *const std::ffi::c_void,
font_bytes.len(),
device.ui.storage.save_state_slot,
)
}
}