From 9ca84013b71cb83b77719c7c71ea0e39b71e1ea0 Mon Sep 17 00:00:00 2001 From: jugeeya Date: Sat, 18 Feb 2023 10:37:04 -0800 Subject: [PATCH] PT Load State Fix: After Training Mode Reset (#485) * Damage percent fix * PT is fixed! * Fix ICs --- src/training/save_states.rs | 142 +++++++++++++++++++----------------- src/training/ui/damage.rs | 8 +- 2 files changed, 81 insertions(+), 69 deletions(-) diff --git a/src/training/save_states.rs b/src/training/save_states.rs index 68696b8..1a95e59 100644 --- a/src/training/save_states.rs +++ b/src/training/save_states.rs @@ -39,6 +39,7 @@ enum SaveState { Save, NoAction, KillPlayer, + WaitForAlive, PosMove, NanaPosMove, ApplyBuff, @@ -151,7 +152,8 @@ unsafe fn save_state_cpu() -> &'static mut SavedState { static mut MIRROR_STATE: f32 = 1.0; pub unsafe fn is_killing() -> bool { - save_state_player().state == KillPlayer || save_state_cpu().state == KillPlayer + (save_state_player().state == KillPlayer || save_state_player().state == WaitForAlive) + || (save_state_cpu().state == KillPlayer || save_state_cpu().state == WaitForAlive) } pub unsafe fn is_loading() -> bool { @@ -190,7 +192,7 @@ pub unsafe fn get_param_int( if param_hash == hash40("rebirth_move_frame") { return Some(0); } - if param_hash == hash40("rebirth_move_frame_trainer") && is_killing() { + if param_hash == hash40("rebirth_move_frame_trainer") && is_loading() { return Some(0); } if param_hash == hash40("rebirth_wait_frame") { @@ -205,7 +207,7 @@ pub unsafe fn get_param_int( } if param_type == hash40("param_mball") && param_hash == hash40("change_fly_frame") - && is_killing() + && is_loading() { return Some(0); } @@ -268,6 +270,62 @@ unsafe fn on_ptrainer_death(module_accessor: &mut app::BattleObjectModuleAccesso } } +unsafe fn on_death(fighter_kind: i32, module_accessor: &mut app::BattleObjectModuleAccessor) { + SoundModule::stop_all_sound(module_accessor); + // Try moving off-screen so we don't see effects. + let pos = Vector3f { + x: -300.0, + y: -100.0, + z: 0.0, + }; + PostureModule::set_pos(module_accessor, &pos); + + // All articles have ID <= 0x25 + (0..=0x25) + // Don't remove crafting table + .filter(|article_idx| { + !(fighter_kind == *FIGHTER_KIND_PICKEL + && *article_idx == *FIGHTER_PICKEL_GENERATE_ARTICLE_TABLE) + }) + .for_each(|article_idx| { + if ArticleModule::is_exist(module_accessor, article_idx) { + let article: u64 = ArticleModule::get_article(module_accessor, article_idx); + let article_object_id = Article::get_battle_object_id(article as *mut app::Article); + ArticleModule::remove_exist_object_id(module_accessor, article_object_id as u32); + } + }); + let item_mgr = *(ITEM_MANAGER_ADDR as *mut *mut app::ItemManager); + (0..ItemManager::get_num_of_active_item_all(item_mgr)).for_each(|item_idx| { + let item = ItemManager::get_active_item(item_mgr, item_idx); + if item != 0 { + let item = item as *mut Item; + let item_battle_object_id = app::lua_bind::Item::get_battle_object_id(item) as u32; + ItemManager::remove_item_from_id(item_mgr, item_battle_object_id); + } + }); + MotionAnimcmdModule::set_sleep(module_accessor, true); + SoundModule::pause_se_all(module_accessor, true); + ControlModule::stop_rumble(module_accessor, true); + SoundModule::stop_all_sound(module_accessor); + // Return camera to normal when loading save state + SlowModule::clear_whole(module_accessor); + CameraModule::zoom_out(module_accessor, 0); + // Remove blue effect (but does not remove darkened screen) + EffectModule::kill_kind( + module_accessor, + Hash40::new("sys_bg_criticalhit"), + false, + false, + ); + // Removes the darkened screen from special zooms + // If there's a crit that doesn't get removed, it's likely bg_criticalhit2. + EffectModule::remove_screen(module_accessor, Hash40::new("bg_criticalhit"), 0); + // Remove all quakes to prevent screen shake lingering through load. + for quake_kind in *CAMERA_QUAKE_KIND_NONE..=*CAMERA_QUAKE_KIND_MAX { + CameraModule::stop_quake(module_accessor, quake_kind); + } +} + pub unsafe fn save_states(module_accessor: &mut app::BattleObjectModuleAccessor) { if MENU.save_state_enable == OnOff::Off { return; @@ -354,78 +412,30 @@ pub unsafe fn save_states(module_accessor: &mut app::BattleObjectModuleAccessor) return; } - // move to camera bounds + // Kill the fighter and move them to camera bounds if save_state.state == KillPlayer { on_ptrainer_death(module_accessor); - SoundModule::stop_all_sound(module_accessor); - if status == FIGHTER_STATUS_KIND_REBIRTH || status == FIGHTER_STATUS_KIND_WAIT { - save_state.state = PosMove; - } else if !is_dead(module_accessor) && !fighter_is_nana { + if !is_dead(module_accessor) && // Don't kill Nana again, since she already gets killed by the game from Popo's death - // Try moving off-screen so we don't see effects. - let pos = Vector3f { - x: -300.0, - y: -100.0, - z: 0.0, - }; - PostureModule::set_pos(module_accessor, &pos); - - // All articles have ID <= 0x25 - (0..=0x25) - // Don't remove crafting table - .filter(|article_idx| { - !(fighter_kind == *FIGHTER_KIND_PICKEL - && *article_idx == *FIGHTER_PICKEL_GENERATE_ARTICLE_TABLE) - }) - .for_each(|article_idx| { - if ArticleModule::is_exist(module_accessor, article_idx) { - let article: u64 = ArticleModule::get_article(module_accessor, article_idx); - let article_object_id = - Article::get_battle_object_id(article as *mut app::Article); - ArticleModule::remove_exist_object_id( - module_accessor, - article_object_id as u32, - ); - } - }); - let item_mgr = *(ITEM_MANAGER_ADDR as *mut *mut app::ItemManager); - (0..ItemManager::get_num_of_active_item_all(item_mgr)).for_each(|item_idx| { - let item = ItemManager::get_active_item(item_mgr, item_idx); - if item != 0 { - let item = item as *mut Item; - let item_battle_object_id = - app::lua_bind::Item::get_battle_object_id(item) as u32; - ItemManager::remove_item_from_id(item_mgr, item_battle_object_id); - } - }); - MotionAnimcmdModule::set_sleep(module_accessor, true); - SoundModule::pause_se_all(module_accessor, true); - ControlModule::stop_rumble(module_accessor, true); - SoundModule::stop_all_sound(module_accessor); - // Return camera to normal when loading save state - SlowModule::clear_whole(module_accessor); - CameraModule::zoom_out(module_accessor, 0); - // Remove blue effect (but does not remove darkened screen) - EffectModule::kill_kind( - module_accessor, - Hash40::new("sys_bg_criticalhit"), - false, - false, - ); - // Removes the darkened screen from special zooms - // If there's a crit that doesn't get removed, it's likely bg_criticalhit2. - EffectModule::remove_screen(module_accessor, Hash40::new("bg_criticalhit"), 0); - // Remove all quakes to prevent screen shake lingering through load. - for quake_kind in *CAMERA_QUAKE_KIND_NONE..=*CAMERA_QUAKE_KIND_MAX { - CameraModule::stop_quake(module_accessor, quake_kind); - } - + !fighter_is_nana + { + on_death(fighter_kind, module_accessor); StatusModule::change_status_request(module_accessor, *FIGHTER_STATUS_KIND_DEAD, false); } + save_state.state = WaitForAlive; + return; } + if save_state.state == WaitForAlive { + on_ptrainer_death(module_accessor); + if !is_dead(module_accessor) && !fighter_is_nana { + on_death(fighter_kind, module_accessor); + save_state.state = PosMove; + } + } + // move to correct pos if save_state.state == PosMove || save_state.state == NanaPosMove { let status_kind = StatusModule::status_kind(module_accessor); diff --git a/src/training/ui/damage.rs b/src/training/ui/damage.rs index cccb94d..437f611 100644 --- a/src/training/ui/damage.rs +++ b/src/training/ui/damage.rs @@ -120,7 +120,8 @@ pub unsafe fn draw(root_pane: &mut Pane, layout_name: &str) { } if dmg_num.alpha != 255 || dmg_num.global_alpha != 255 { - dmg_num.set_visible(true); + dmg_num.alpha = 255; + dmg_num.global_alpha = 255; if !has_altered_anim_list { iterate_anim_list(anim_list, Some(player_name)); has_altered_anim_list = true; @@ -138,10 +139,11 @@ pub unsafe fn draw(root_pane: &mut Pane, layout_name: &str) { if let Some(death_explosion) = parent.find_pane_by_name_recursive(death_explosion_s) { - death_explosion.set_visible(false); + death_explosion.alpha = 0; + death_explosion.global_alpha = 0; } } } } } -} \ No newline at end of file +}