From ceeff46b5ce45ea931a206424a7fbba0d3ca9bd2 Mon Sep 17 00:00:00 2001 From: AlexKnauth Date: Sun, 18 Feb 2024 23:31:53 -0500 Subject: [PATCH] Start on OnObtainGhostRevek --- src/lib.rs | 13 ++++++++----- src/splits.rs | 16 +++++++++++++--- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 594d1158..688381fe 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -49,8 +49,9 @@ async fn main() { let mut load_remover = Box::new(TimingMethodLoadRemover::new(timing_method)); next_tick().await; - let game_manager_finder = Box::new(GameManagerFinder::wait_attach(&process).await); + let mut game_manager_finder = Box::new(GameManagerFinder::wait_attach(&process).await); let mut player_data_store = Box::new(PlayerDataStore::new()); + let mut scene_data_store = Box::new(SceneDataStore::new()); #[cfg(debug_assertions)] asr::print_message(&format!("geo: {:?}", game_manager_finder.get_geo(&process))); @@ -70,7 +71,7 @@ async fn main() { let mut last_timer_state = TimerState::Unknown; let mut i = 0; loop { - tick_action(&process, &splits, &mut last_timer_state, &mut i, auto_reset, &game_manager_finder, &mut scene_store, &mut player_data_store, &mut load_remover).await; + tick_action(&process, &splits, &mut last_timer_state, &mut i, auto_reset, &mut game_manager_finder, &mut scene_store, &mut player_data_store, &mut scene_data_store, &mut load_remover).await; load_remover.load_removal(&process, &game_manager_finder, i); @@ -114,9 +115,10 @@ async fn tick_action( last_timer_state: &mut TimerState, i: &mut usize, auto_reset: bool, - game_manager_finder: &GameManagerFinder, + game_manager_finder: &mut GameManagerFinder, scene_store: &mut SceneStore, player_data_store: &mut PlayerDataStore, + scene_data_store: &mut SceneDataStore, load_remover: &mut TimingMethodLoadRemover, ) { match asr::timer::state() { @@ -146,7 +148,7 @@ async fn tick_action( let n = splits.len(); let trans_now = scene_store.transition_now(&process, &game_manager_finder); loop { - let a = splits::splits(&splits[*i], &process, &game_manager_finder, trans_now, scene_store, player_data_store); + let a = splits::splits(&splits[*i], &process, game_manager_finder, trans_now, scene_store, player_data_store, scene_data_store); match a { SplitterAction::Split | SplitterAction::ManualSplit => { splitter_action(a, i, n, load_remover); @@ -160,7 +162,7 @@ async fn tick_action( } SplitterAction::Pass => { if auto_reset { - let a0 = splits::splits(&splits[0], &process, &game_manager_finder, trans_now, scene_store, player_data_store); + let a0 = splits::splits(&splits[0], &process, game_manager_finder, trans_now, scene_store, player_data_store, scene_data_store); match a0 { SplitterAction::Split | SplitterAction::Reset => { *i = 0; @@ -177,6 +179,7 @@ async fn tick_action( if trans_now { if scene_store.pair().old == MENU_TITLE { player_data_store.reset(); + scene_data_store.reset(); } else { player_data_store.clean_on_entry(); } diff --git a/src/splits.rs b/src/splits.rs index 6e42eb86..487cdebf 100644 --- a/src/splits.rs +++ b/src/splits.rs @@ -1586,6 +1586,10 @@ pub enum Split { /// /// Splits when obtaining the essence from Hive Queen Vespa OnObtainGhostVespa, + /// Dream Nail Revek (Obtain) + /// + /// Splits when obtaining essence in Spirits' Glade after Revek is obtainable + OnObtainGhostRevek, // endregion: Essence, Trees, and Ghosts // region: Maps and Cornifer @@ -3461,7 +3465,7 @@ pub fn transition_once_splits(s: &Split, p: &Pair<&str>, prc: &Process, g: &Game } } -pub fn continuous_splits(s: &Split, p: &Process, g: &GameManagerFinder, pds: &mut PlayerDataStore) -> SplitterAction { +pub fn continuous_splits(s: &Split, p: &Process, g: &mut GameManagerFinder, pds: &mut PlayerDataStore, sds: &mut SceneDataStore) -> SplitterAction { match s { Split::ManualSplit => SplitterAction::ManualSplit, Split::RandoWake => should_split(g.disable_pause(p).is_some_and(|d| !d) @@ -3877,6 +3881,12 @@ pub fn continuous_splits(s: &Split, p: &Process, g: &GameManagerFinder, pds: &mu // make sure both PlayerDataStore methods are evaluated before the `&&` so it doesn't short-circuit should_split(d && o && g.get_scene_name(p).is_some_and(|s| s == "Hive_05")) } + Split::OnObtainGhostRevek => { + let d = sds.glade_ghosts_killed(p, g).is_some_and(|k| 18 <= k); + let o = pds.incremented_dream_orbs(p, g); + // make sure both SceneDataStore and PlayerDataStore methods are evaluated before the `&&` so it doesn't short-circuit + should_split(d && o && g.get_scene_name(p).is_some_and(|s| s == "RestingGrounds_08")) + } // endregion: Essence, Trees, and Ghosts // region: Maps and Cornifer @@ -4186,10 +4196,10 @@ pub fn continuous_splits(s: &Split, p: &Process, g: &GameManagerFinder, pds: &mu } } -pub fn splits(s: &Split, prc: &Process, g: &GameManagerFinder, trans_now: bool, ss: &mut SceneStore, pds: &mut PlayerDataStore) -> SplitterAction { +pub fn splits(s: &Split, prc: &Process, g: &mut GameManagerFinder, trans_now: bool, ss: &mut SceneStore, pds: &mut PlayerDataStore, sds: &mut SceneDataStore) -> SplitterAction { #[cfg(debug_assertions)] pds.get_game_state(prc, g); - let a1 = continuous_splits(s, prc, g, pds).or_else(|| { + let a1 = continuous_splits(s, prc, g, pds, sds).or_else(|| { let pair = ss.pair(); let a2 = if !ss.split_this_transition { transition_once_splits(s, &pair, prc, g, pds)