1
0
Fork 0
mirror of https://github.com/jugeeya/UltimateTrainingModpack.git synced 2025-03-23 06:46:11 +00:00

Shield Flash Workaround (#134)

* Fix Shield Buffer

Shield doesn't work with cat_flags

* Move unsafe declaration inwards
This commit is contained in:
sidschingis 2020-08-13 23:20:56 +02:00 committed by GitHub
parent 9b70b502e5
commit 8feab4cf17
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 78 additions and 51 deletions

View file

@ -42,41 +42,52 @@ pub fn get_category(module_accessor: &mut app::BattleObjectModuleAccessor) -> i3
return (module_accessor.info >> 28) as u8 as i32; return (module_accessor.info >> 28) as u8 as i32;
} }
pub unsafe fn get_module_accessor(fighter_id: FighterId) -> *mut app::BattleObjectModuleAccessor { pub fn get_module_accessor(fighter_id: FighterId) -> *mut app::BattleObjectModuleAccessor {
let entry_id_int = fighter_id as i32; let entry_id_int = fighter_id as i32;
let entry_id = app::FighterEntryID(entry_id_int); let entry_id = app::FighterEntryID(entry_id_int);
let mgr = *(FIGHTER_MANAGER_ADDR as *mut *mut app::FighterManager); unsafe {
let fighter_entry = FighterManager::get_fighter_entry(mgr, entry_id) as *mut app::FighterEntry; let mgr = *(FIGHTER_MANAGER_ADDR as *mut *mut app::FighterManager);
let current_fighter_id = FighterEntry::current_fighter_id(fighter_entry); let fighter_entry =
app::sv_battle_object::module_accessor(current_fighter_id as u32) FighterManager::get_fighter_entry(mgr, entry_id) as *mut app::FighterEntry;
let current_fighter_id = FighterEntry::current_fighter_id(fighter_entry);
app::sv_battle_object::module_accessor(current_fighter_id as u32)
}
} }
pub unsafe fn is_fighter(module_accessor: &mut app::BattleObjectModuleAccessor) -> bool { pub fn is_fighter(module_accessor: &mut app::BattleObjectModuleAccessor) -> bool {
get_category(module_accessor) == BATTLE_OBJECT_CATEGORY_FIGHTER get_category(module_accessor) == BATTLE_OBJECT_CATEGORY_FIGHTER
} }
pub unsafe fn is_operation_cpu(module_accessor: &mut app::BattleObjectModuleAccessor) -> bool { pub fn is_operation_cpu(module_accessor: &mut app::BattleObjectModuleAccessor) -> bool {
if !is_fighter(module_accessor) { unsafe {
return false; if !is_fighter(module_accessor) {
return false;
}
let entry_id_int =
WorkModule::get_int(module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_ENTRY_ID) as i32;
let entry_id = app::FighterEntryID(entry_id_int);
let mgr = *(FIGHTER_MANAGER_ADDR as *mut *mut app::FighterManager);
let fighter_information =
FighterManager::get_fighter_information(mgr, entry_id) as *mut app::FighterInformation;
FighterInformation::is_operation_cpu(fighter_information)
} }
let entry_id_int =
WorkModule::get_int(module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_ENTRY_ID) as i32;
let entry_id = app::FighterEntryID(entry_id_int);
let mgr = *(FIGHTER_MANAGER_ADDR as *mut *mut app::FighterManager);
let fighter_information =
FighterManager::get_fighter_information(mgr, entry_id) as *mut app::FighterInformation;
FighterInformation::is_operation_cpu(fighter_information)
} }
pub unsafe fn is_grounded(module_accessor: &mut app::BattleObjectModuleAccessor) -> bool { pub fn is_grounded(module_accessor: &mut app::BattleObjectModuleAccessor) -> bool {
let situation_kind = StatusModule::situation_kind(module_accessor) as i32; let situation_kind;
unsafe {
situation_kind = StatusModule::situation_kind(module_accessor) as i32;
}
situation_kind == SITUATION_KIND_GROUND situation_kind == SITUATION_KIND_GROUND
} }
pub unsafe fn is_airborne(module_accessor: &mut app::BattleObjectModuleAccessor) -> bool { pub fn is_airborne(module_accessor: &mut app::BattleObjectModuleAccessor) -> bool {
let situation_kind = StatusModule::situation_kind(module_accessor) as i32; let situation_kind;
unsafe {
situation_kind = StatusModule::situation_kind(module_accessor) as i32;
}
situation_kind == SITUATION_KIND_AIR situation_kind == SITUATION_KIND_AIR
} }
@ -110,9 +121,15 @@ pub fn is_shielding(module_accessor: *mut app::BattleObjectModuleAccessor) -> bo
} }
} }
pub unsafe fn is_in_shieldstun(module_accessor: &mut app::BattleObjectModuleAccessor) -> bool { pub fn is_in_shieldstun(module_accessor: &mut app::BattleObjectModuleAccessor) -> bool {
let status_kind = StatusModule::status_kind(module_accessor); let status_kind;
let prev_status = StatusModule::prev_status_kind(module_accessor, 0); let prev_status;
unsafe {
status_kind = StatusModule::status_kind(module_accessor);
prev_status = StatusModule::prev_status_kind(module_accessor, 0);
}
// If we are taking shield damage or we are droping shield from taking shield damage we are in hitstun // If we are taking shield damage or we are droping shield from taking shield damage we are in hitstun
status_kind == FIGHTER_STATUS_KIND_GUARD_DAMAGE status_kind == FIGHTER_STATUS_KIND_GUARD_DAMAGE
|| (prev_status == FIGHTER_STATUS_KIND_GUARD_DAMAGE || (prev_status == FIGHTER_STATUS_KIND_GUARD_DAMAGE

View file

@ -67,10 +67,8 @@ unsafe fn get_angle(module_accessor: &mut app::BattleObjectModuleAccessor) -> f6
} }
fn is_correct_status(module_accessor: &mut app::BattleObjectModuleAccessor) -> bool { fn is_correct_status(module_accessor: &mut app::BattleObjectModuleAccessor) -> bool {
let air_dodge_condition; let air_dodge_condition= is_airborne(module_accessor) && is_in_hitstun(module_accessor);
unsafe {
air_dodge_condition = is_airborne(module_accessor) && is_in_hitstun(module_accessor);
}
if air_dodge_condition { if air_dodge_condition {
return true; return true;
} }
@ -78,7 +76,7 @@ fn is_correct_status(module_accessor: &mut app::BattleObjectModuleAccessor) -> b
return false; return false;
} }
unsafe fn pick_angle(direction: Direction) -> f64 { fn pick_angle(direction: Direction) -> f64 {
if direction == Direction::Random { if direction == Direction::Random {
let rand_direction = get_random_direction(); let rand_direction = get_random_direction();
return direction_to_angle(rand_direction); return direction_to_angle(rand_direction);
@ -87,7 +85,7 @@ unsafe fn pick_angle(direction: Direction) -> f64 {
direction_to_angle(direction) direction_to_angle(direction)
} }
unsafe fn get_random_direction() -> Direction { fn get_random_direction() -> Direction {
let rand = get_random_int(8); let rand = get_random_int(8);
Direction::from(rand) Direction::from(rand)
} }

View file

@ -195,21 +195,19 @@ pub fn mash_to_action(mash: Mash) -> Action {
fn get_random_action(module_accessor: &mut app::BattleObjectModuleAccessor) -> Action { fn get_random_action(module_accessor: &mut app::BattleObjectModuleAccessor) -> Action {
let mut random_cmds = vec![Mash::Jump, Mash::Attack]; let mut random_cmds = vec![Mash::Jump, Mash::Attack];
unsafe { if is_airborne(module_accessor) {
if is_airborne(module_accessor) { random_cmds.push(Mash::Airdodge);
random_cmds.push(Mash::Airdodge);
}
if is_grounded(module_accessor) {
random_cmds.push(Mash::RollBack);
random_cmds.push(Mash::RollForward);
random_cmds.push(Mash::Spotdodge);
}
let random_cmd_index = get_random_int(random_cmds.len() as i32) as usize;
mash_to_action(random_cmds[random_cmd_index])
} }
if is_grounded(module_accessor) {
random_cmds.push(Mash::RollBack);
random_cmds.push(Mash::RollForward);
random_cmds.push(Mash::Spotdodge);
}
let random_cmd_index = get_random_int(random_cmds.len() as i32) as usize;
mash_to_action(random_cmds[random_cmd_index])
} }
fn attack_to_action(attack: Attack) -> Action { fn attack_to_action(attack: Attack) -> Action {
@ -248,6 +246,10 @@ unsafe fn perform_action(module_accessor: &mut app::BattleObjectModuleAccessor)
let command_flag; let command_flag;
// Shield if grounded instead // Shield if grounded instead
if is_grounded(module_accessor) { if is_grounded(module_accessor) {
/*
Doesn't actually cause the shield, but will clear the buffer once shield is possible.
Shield hold is performed through shield::should_hold_shield and request_shield
*/
expected_status = *FIGHTER_STATUS_KIND_GUARD_ON; expected_status = *FIGHTER_STATUS_KIND_GUARD_ON;
command_flag = *FIGHTER_PAD_CMD_CAT1_FLAG_AIR_ESCAPE; command_flag = *FIGHTER_PAD_CMD_CAT1_FLAG_AIR_ESCAPE;
} else { } else {
@ -284,7 +286,7 @@ unsafe fn perform_action(module_accessor: &mut app::BattleObjectModuleAccessor)
Shield => { Shield => {
/* /*
Doesn't actually cause the shield, but will clear the buffer once shield is possible. Doesn't actually cause the shield, but will clear the buffer once shield is possible.
Shield hold is performed through shield::should_hold_shield Shield hold is performed through shield::should_hold_shield and request_shield
*/ */
return get_flag( return get_flag(
module_accessor, module_accessor,
@ -296,6 +298,16 @@ unsafe fn perform_action(module_accessor: &mut app::BattleObjectModuleAccessor)
} }
} }
pub fn request_shield(module_accessor: &mut app::BattleObjectModuleAccessor) -> bool {
match get_current_buffer() {
Action::Shield => return true,
Action::Airdodge => return is_grounded(module_accessor),
_ => {}
}
return false;
}
unsafe fn update_jump_flag(module_accessor: &mut app::BattleObjectModuleAccessor) -> i32 { unsafe fn update_jump_flag(module_accessor: &mut app::BattleObjectModuleAccessor) -> i32 {
let check_flag = if is_grounded(module_accessor) { let check_flag = if is_grounded(module_accessor) {
*FIGHTER_STATUS_KIND_JUMP_SQUAT *FIGHTER_STATUS_KIND_JUMP_SQUAT
@ -438,9 +450,9 @@ unsafe fn get_aerial_flag(
* We always trigger attack and change it later into the correct aerial * We always trigger attack and change it later into the correct aerial
* @see get_attack_air_kind() * @see get_attack_air_kind()
*/ */
let command_flag: i32 = match action { let command_flag: i32 = match action {
Nair | Fair | Bair | UpAir | Dair => *FIGHTER_PAD_CMD_CAT1_FLAG_ATTACK_N, Nair | Fair | Bair | UpAir | Dair => *FIGHTER_PAD_CMD_CAT1_FLAG_ATTACK_N,
_ => 0 _ => 0,
}; };
set_aerial(action); set_aerial(action);

View file

@ -130,9 +130,9 @@ pub unsafe fn get_param_float(
None None
} }
pub fn should_hold_shield() -> bool { pub fn should_hold_shield(module_accessor: &mut app::BattleObjectModuleAccessor) -> bool {
// Mash shield // Mash shield
if mash::get_current_buffer() == Action::Shield { if mash::request_shield(module_accessor) {
return true; return true;
} }
@ -343,7 +343,7 @@ unsafe fn should_return_none_in_check_button(
return true; return true;
} }
if !should_hold_shield() { if !should_hold_shield(module_accessor) {
return true; return true;
} }