mirror of
https://github.com/a-b-street/abstreet.git
synced 2024-12-29 17:34:58 +03:00
menu to load any savestate
This commit is contained in:
parent
b1c92fa867
commit
bf5c45cd72
@ -62,6 +62,10 @@ pub fn path1_bin(map_name: &str, category: &str, instance: &str) -> String {
|
|||||||
format!("../data/{}/{}/{}.bin", category, map_name, instance)
|
format!("../data/{}/{}/{}.bin", category, map_name, instance)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn path2_dir(map_name: &str, category: &str, dir: &str) -> String {
|
||||||
|
format!("../data/{}/{}/{}/", category, map_name, dir)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn path2_bin(map_name: &str, category: &str, dir: &str, instance: &str) -> String {
|
pub fn path2_bin(map_name: &str, category: &str, dir: &str, instance: &str) -> String {
|
||||||
format!("../data/{}/{}/{}/{}.bin", category, map_name, dir, instance)
|
format!("../data/{}/{}/{}/{}.bin", category, map_name, dir, instance)
|
||||||
}
|
}
|
||||||
|
@ -10,7 +10,9 @@ use crate::debug::DebugMode;
|
|||||||
use crate::edit::EditMode;
|
use crate::edit::EditMode;
|
||||||
use crate::game::{State, Transition};
|
use crate::game::{State, Transition};
|
||||||
use crate::ui::{ShowEverything, UI};
|
use crate::ui::{ShowEverything, UI};
|
||||||
use ezgui::{hotkey, lctrl, EventCtx, EventLoopMode, GfxCtx, Key, ModalMenu, Text};
|
use ezgui::{
|
||||||
|
hotkey, lctrl, EventCtx, EventLoopMode, GfxCtx, Key, ModalMenu, Text, Wizard, WrappedWizard,
|
||||||
|
};
|
||||||
use geom::Duration;
|
use geom::Duration;
|
||||||
use sim::Sim;
|
use sim::Sim;
|
||||||
|
|
||||||
@ -46,6 +48,7 @@ impl SandboxMode {
|
|||||||
(hotkey(Key::O), "save sim state"),
|
(hotkey(Key::O), "save sim state"),
|
||||||
(hotkey(Key::Y), "load previous sim state"),
|
(hotkey(Key::Y), "load previous sim state"),
|
||||||
(hotkey(Key::U), "load next sim state"),
|
(hotkey(Key::U), "load next sim state"),
|
||||||
|
(None, "pick a savestate to load"),
|
||||||
(hotkey(Key::X), "reset sim"),
|
(hotkey(Key::X), "reset sim"),
|
||||||
(hotkey(Key::S), "start a scenario"),
|
(hotkey(Key::S), "start a scenario"),
|
||||||
],
|
],
|
||||||
@ -180,6 +183,12 @@ impl State for SandboxMode {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
if self.menu.action("pick a savestate to load") {
|
||||||
|
return Transition::Push(Box::new(LoadSavestate {
|
||||||
|
path: ui.primary.sim.save_dir(),
|
||||||
|
wizard: Wizard::new(),
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
if let Some(t) = time_controls(ctx, ui, &mut self.menu) {
|
if let Some(t) = time_controls(ctx, ui, &mut self.menu) {
|
||||||
return t;
|
return t;
|
||||||
@ -213,3 +222,42 @@ impl State for SandboxMode {
|
|||||||
self.speed.pause();
|
self.speed.pause();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct LoadSavestate {
|
||||||
|
path: String,
|
||||||
|
wizard: Wizard,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl State for LoadSavestate {
|
||||||
|
fn event(&mut self, ctx: &mut EventCtx, ui: &mut UI) -> Transition {
|
||||||
|
if let Some(ss) = pick_savestate(&self.path, &mut self.wizard.wrap(ctx)) {
|
||||||
|
ctx.loading_screen("load savestate", |ctx, mut timer| {
|
||||||
|
ui.primary.sim = Sim::load_savestate(ss, &mut timer).unwrap();
|
||||||
|
ui.recalculate_current_selection(ctx);
|
||||||
|
});
|
||||||
|
return Transition::Pop;
|
||||||
|
} else if self.wizard.aborted() {
|
||||||
|
return Transition::Pop;
|
||||||
|
}
|
||||||
|
Transition::Keep
|
||||||
|
}
|
||||||
|
|
||||||
|
fn draw(&self, g: &mut GfxCtx, _: &UI) {
|
||||||
|
self.wizard.draw(g);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn pick_savestate(path: &str, wizard: &mut WrappedWizard) -> Option<String> {
|
||||||
|
let path_copy = path.to_string();
|
||||||
|
wizard
|
||||||
|
.choose_something_no_keys::<()>(
|
||||||
|
"Load which savestate?",
|
||||||
|
Box::new(move || {
|
||||||
|
abstutil::list_dir(std::path::Path::new(&path_copy))
|
||||||
|
.into_iter()
|
||||||
|
.map(|f| (f, ()))
|
||||||
|
.collect()
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
.map(|(f, _)| f)
|
||||||
|
}
|
||||||
|
@ -567,6 +567,14 @@ impl Sim {
|
|||||||
|
|
||||||
// Savestating
|
// Savestating
|
||||||
impl Sim {
|
impl Sim {
|
||||||
|
pub fn save_dir(&self) -> String {
|
||||||
|
abstutil::path2_dir(
|
||||||
|
&self.map_name,
|
||||||
|
abstutil::SAVE,
|
||||||
|
&format!("{}_{}", self.edits_name, self.run_name),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
fn save_path(&self, base_time: Duration) -> String {
|
fn save_path(&self, base_time: Duration) -> String {
|
||||||
// If we wanted to be even more reproducible, we'd encode RNG seed, version of code, etc,
|
// If we wanted to be even more reproducible, we'd encode RNG seed, version of code, etc,
|
||||||
// but that's overkill right now.
|
// but that's overkill right now.
|
||||||
|
Loading…
Reference in New Issue
Block a user