diff --git a/src/training/charge.rs b/src/training/charge.rs index 6e45fd5..5068b7f 100644 --- a/src/training/charge.rs +++ b/src/training/charge.rs @@ -16,6 +16,17 @@ fn copy_setup( bool_2: bool, ); +#[derive(Serialize, Deserialize, Default, Copy, Clone, Debug)] +pub struct RobinCharges { + pub thunder_kind: i32, + pub yellow_book: i32, + pub red_book: f32, + pub green_book: i32, + pub purple_book: i32, + pub levin_charge: i32, + pub levin_recharge: i32, +} + #[derive(Serialize, Deserialize, Default, Copy, Clone, Debug)] pub struct ChargeState { pub int_x: Option, @@ -25,6 +36,7 @@ pub struct ChargeState { pub float_y: Option, pub float_z: Option, pub has_charge: Option, + pub robin_charges: Option, } impl ChargeState { @@ -70,6 +82,11 @@ impl ChargeState { self } + fn set_robin(mut self, robin_charges: RobinCharges) -> Self { + self.robin_charges = Some(robin_charges); + self + } + pub fn has_charge(mut self, has_charge: bool) -> Self { self.has_charge = Some(has_charge); self @@ -237,11 +254,46 @@ pub unsafe fn get_charge( } // Robin Thunder Tome Spells else if fighter_kind == FIGHTER_KIND_REFLET { - let my_charge = WorkModule::get_int( + let thunder_kind = WorkModule::get_int( module_accessor, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_N_THUNDER_KIND, ); - charge_state.int_x(my_charge) + let yellow_book = WorkModule::get_int( + module_accessor, + *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_N_CURRENT_POINT, + ); + let red_book = WorkModule::get_float( + module_accessor, + *FIGHTER_REFLET_INSTANCE_WORK_ID_FLOAT_SPECIAL_S_CURRENT_POINT, + ); + let green_book = WorkModule::get_int( + module_accessor, + *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_HI_CURRENT_POINT, + ); + let purple_book = WorkModule::get_int( + module_accessor, + *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_LW_CURRENT_POINT, + ); + let levin_charge = WorkModule::get_int( + module_accessor, + *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_THUNDER_SWORD_CURRENT_POINT, + ); + // Might be worth forcing Levin charge full on L+R+A restart for Robin, if we find Robin's reset function. + // Until then, this is to make it more convenient if a player starts up training mode and instantly saves state. + let levin_recharge = WorkModule::get_int( + module_accessor, + *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_THUNDER_SWORD_REVIVAL_COUNT, + ); + let robin_charges = RobinCharges { + thunder_kind, + yellow_book, + red_book, + green_book, + purple_book, + levin_charge, + levin_recharge, + }; + charge_state.set_robin(robin_charges) } // Plant Poison Breath else if fighter_kind == FIGHTER_KIND_PACKUN { @@ -785,13 +837,13 @@ pub unsafe fn handle_charge( } // Robin Thunder Tome Spells - 0 to 3 else if fighter_kind == FIGHTER_KIND_REFLET { - charge.int_x.map(|thunder_kind| { + charge.robin_charges.map(|robin_charges| { WorkModule::set_int( module_accessor, - thunder_kind, + robin_charges.thunder_kind, *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_N_THUNDER_KIND, ); - if thunder_kind == 3 { + if robin_charges.thunder_kind == 3 { EffectModule::req_common(module_accessor, Hash40::new("charge_max"), 0.0); let reflet_hash = Hash40::new("reflet_thunder_max"); let joint_hash = Hash40::new("handl"); @@ -822,6 +874,36 @@ pub unsafe fn handle_charge( false, ); } + WorkModule::set_int( + module_accessor, + robin_charges.yellow_book, + *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_N_CURRENT_POINT, + ); + WorkModule::set_float( + module_accessor, + robin_charges.red_book, + *FIGHTER_REFLET_INSTANCE_WORK_ID_FLOAT_SPECIAL_S_CURRENT_POINT, + ); + WorkModule::set_int( + module_accessor, + robin_charges.green_book, + *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_HI_CURRENT_POINT, + ); + WorkModule::set_int( + module_accessor, + robin_charges.purple_book, + *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_SPECIAL_LW_CURRENT_POINT, + ); + WorkModule::set_int( + module_accessor, + robin_charges.levin_charge, + *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_THUNDER_SWORD_CURRENT_POINT, + ); + WorkModule::set_int( + module_accessor, + robin_charges.levin_recharge, + *FIGHTER_REFLET_INSTANCE_WORK_ID_INT_THUNDER_SWORD_REVIVAL_COUNT, + ); }); } // Mii Gunner Charge Blast - 0 to 120 diff --git a/src/training/save_states.rs b/src/training/save_states.rs index d452581..80b352e 100644 --- a/src/training/save_states.rs +++ b/src/training/save_states.rs @@ -107,6 +107,7 @@ macro_rules! default_save_state { float_y: None, float_z: None, has_charge: None, + robin_charges: None, }, steve_state: Some(steve::SteveState { mat_g1: 36,