From 13048fa616bdfe4f3be760afac4677d9394ec7d7 Mon Sep 17 00:00:00 2001 From: asimon-1 <40246417+asimon-1@users.noreply.github.com> Date: Sun, 21 Sep 2025 17:57:02 -0400 Subject: [PATCH] Adjust check_status to account for certain moves. --- src/training/character_specific/bowser.rs | 37 -------------- src/training/character_specific/mod.rs | 59 +++++++++++++++++++++-- src/training/mash.rs | 6 ++- 3 files changed, 60 insertions(+), 42 deletions(-) delete mode 100644 src/training/character_specific/bowser.rs diff --git a/src/training/character_specific/bowser.rs b/src/training/character_specific/bowser.rs deleted file mode 100644 index 1ec919c42..000000000 --- a/src/training/character_specific/bowser.rs +++ /dev/null @@ -1,37 +0,0 @@ -use smash::app::{self}; -use smash::lib::lua_const::*; - -pub fn check_up_b( - module_accessor: &mut app::BattleObjectModuleAccessor, - current_status: i32, - expected_status: i32, -) -> bool { - if !is_bowser(module_accessor) { - return false; - } - - if expected_status != *FIGHTER_STATUS_KIND_SPECIAL_HI { - return false; - } - - // Grounded up B - if current_status == *FIGHTER_KOOPA_STATUS_KIND_SPECIAL_HI_G { - return true; - } - - // Aerial up B - if current_status == *FIGHTER_KOOPA_STATUS_KIND_SPECIAL_HI_A { - return true; - } - - false -} - -fn is_bowser(module_accessor: &mut app::BattleObjectModuleAccessor) -> bool { - let fighter_id; - unsafe { - fighter_id = app::utility::get_kind(module_accessor); - } - - fighter_id == *FIGHTER_KIND_KOOPA -} diff --git a/src/training/character_specific/mod.rs b/src/training/character_specific/mod.rs index 448df88f5..d7f78c52b 100644 --- a/src/training/character_specific/mod.rs +++ b/src/training/character_specific/mod.rs @@ -1,22 +1,73 @@ use smash::app::{self}; +use smash::lib::lua_const::*; -mod bowser; pub mod items; pub mod kirby; pub mod pikmin; pub mod ptrainer; pub mod steve; +use std::collections::HashMap; +use training_mod_sync::LazyLock; + +static CHARACTER_SPECIFIC_STATUS_MAP: LazyLock>> = + LazyLock::new(|| { + HashMap::from([ + ( + // Bowser Up b + (*FIGHTER_KIND_KOOPA, *FIGHTER_STATUS_KIND_SPECIAL_HI), + vec![ + *FIGHTER_KOOPA_STATUS_KIND_SPECIAL_HI_G, + *FIGHTER_KOOPA_STATUS_KIND_SPECIAL_HI_A, + ], + ), + ( + // Sora Neutral B + (*FIGHTER_KIND_TRAIL, *FIGHTER_STATUS_KIND_SPECIAL_N), + vec![ + *FIGHTER_TRAIL_STATUS_KIND_SPECIAL_N1, + *FIGHTER_TRAIL_STATUS_KIND_SPECIAL_N1_SHOOT, + *FIGHTER_TRAIL_STATUS_KIND_SPECIAL_N1_END, + *FIGHTER_TRAIL_STATUS_KIND_SPECIAL_N2, + *FIGHTER_TRAIL_STATUS_KIND_SPECIAL_N3, + ], + ), + ( + // Sora Nair / Fair + (*FIGHTER_KIND_TRAIL, *FIGHTER_STATUS_KIND_ATTACK_AIR), + vec![ + *FIGHTER_TRAIL_STATUS_KIND_ATTACK_AIR_N, + *FIGHTER_TRAIL_STATUS_KIND_ATTACK_AIR_F, + ], + ), + ( + // Krool Sideb + (*FIGHTER_KIND_KROOL, *FIGHTER_STATUS_KIND_SPECIAL_S), + vec![ + *FIGHTER_KROOL_STATUS_KIND_SPECIAL_S_THROW, + *FIGHTER_KROOL_STATUS_KIND_SPECIAL_S_CATCH, + *FIGHTER_KROOL_STATUS_KIND_SPECIAL_S_FAILURE, + *FIGHTER_KROOL_STATUS_KIND_SPECIAL_S_GET, + ], + ), + ]) + }); + /** * Checks if the current status matches the expected status + * Returns true if the current_status matches a character-specific status for the expected_status + * Returns false if it does not match or if there are no character-specific statuses for the expected_status */ -pub fn check_status( +pub unsafe fn check_character_specific_status( module_accessor: &mut app::BattleObjectModuleAccessor, current_status: i32, expected_status: i32, ) -> bool { - if bowser::check_up_b(module_accessor, current_status, expected_status) { - return true; + let fighter_kind = app::utility::get_kind(module_accessor); + if let Some(statuses) = CHARACTER_SPECIFIC_STATUS_MAP.get(&(fighter_kind, expected_status)) { + if statuses.contains(¤t_status) { + return true; + } } false diff --git a/src/training/mash.rs b/src/training/mash.rs index fa4e2d134..4fa5bb95b 100644 --- a/src/training/mash.rs +++ b/src/training/mash.rs @@ -608,7 +608,11 @@ unsafe fn get_flag( } // Workaround for Character specific status - if character_specific::check_status(module_accessor, current_status, expected_status) { + if character_specific::check_character_specific_status( + module_accessor, + current_status, + expected_status, + ) { reset(); }