1
0
Fork 0
mirror of https://github.com/jugeeya/UltimateTrainingModpack.git synced 2024-11-24 02:44:17 +00:00

PT Load State Fix: After Training Mode Reset (#485)

* Damage percent fix

* PT is fixed!

* Fix ICs
This commit is contained in:
jugeeya 2023-02-18 10:37:04 -08:00 committed by GitHub
parent 10221973fa
commit 9ca84013b7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 81 additions and 69 deletions

View file

@ -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);

View file

@ -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;
}
}
}
}
}
}
}