Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Misc Adjustments 5 #2239

Merged
merged 10 commits into from
Feb 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions dynamic/src/consts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -305,6 +305,7 @@ pub mod vars {
// ints
pub const NUM_RECOVERY_RESOURCE_USED: i32 = 0x0100;
pub const FAIR_STATE: i32 = 0x0101;
pub const SPECIAL_S_FRAME: i32 = 0x0102;
}
pub mod status {
// floats
Expand Down Expand Up @@ -517,6 +518,7 @@ pub mod vars {

// flags
pub const IS_INVALID_TELEPORT: i32 = 0x1101;
pub const GROUNDED_TELEPORT: i32 = 0x1102;
}
}

Expand Down Expand Up @@ -658,6 +660,7 @@ pub mod vars {
// copy ability
// flags
pub const SHOULD_CYCLE_MATERIAL: i32 = 0x01F4;
pub use super::super::ridley::instance::SPECIAL_N_EXPLODE;

// ints
pub const MATERIAL_INDEX: i32 = 0x01F5;
Expand Down Expand Up @@ -1198,6 +1201,7 @@ pub mod vars {
// flags
pub const LUNAR_LAUNCH_AIR_USED: i32 = 0x0100;
pub const DETONATE_READY: i32 = 0x0101;
pub const BOOSTED_DAIR_AIRTIME: i32 = 0x0102;

// ints
pub const LUNAR_LAUNCH_EFF_HANDLER: i32 = 0x0100;
Expand Down Expand Up @@ -1237,6 +1241,7 @@ pub mod vars {
// flags
pub const IS_DREAMLAND_EXPRESS: i32 = 0x0100;
pub const IS_LATE_DLE_INPUT: i32 = 0x0101;
pub const KO_MOTION_AIRTIME: i32 = 0x0102;

// floats
pub const CURRENT_DAMAGE: i32 = 0x0100;
Expand Down Expand Up @@ -1317,6 +1322,7 @@ pub mod vars {
pub const SPECIAL_LW_ENABLE_LANDING: i32 = 0x0102;
pub const SPECIAL_LW_IS_LANDING: i32 = 0x0103;
pub const SPECIAL_LW_ENABLE_BOUNCE: i32 = 0x0104;
pub const SPECIAL_N_EXPLODE: i32 = 0x0105;

// floats
pub const SPECIAL_LW_BOUNCE_PREV_POS: i32 = 0x0100; //vector, requires two indexes
Expand Down Expand Up @@ -1494,5 +1500,6 @@ pub mod statuses {

pub mod bayonetta {
pub const SPECIAL_S_KICK: i32 = 0;
pub const SPECIAL_S_EDGE: i32 = 1;
}
}
68 changes: 36 additions & 32 deletions fighters/bayonetta/src/acmd/ground.rs

Large diffs are not rendered by default.

72 changes: 67 additions & 5 deletions fighters/bayonetta/src/acmd/specials.rs
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,65 @@ unsafe fn bayonetta_special_s_game(fighter: &mut L2CAgentBase) {
}
}

#[acmd_script( agent = "bayonetta", script = "game_specialsedge", category = ACMD_GAME, low_priority )]
unsafe fn bayonetta_special_s_edge_game(fighter: &mut L2CAgentBase) {
let lua_state = fighter.lua_state_agent;
let boma = fighter.boma();
frame(lua_state, 1.0);
if is_excute(fighter) {
fighter.off_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_S_FLAG_WALL_CHECK);
notify_event_msc_cmd!(fighter, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_LEG, false, false, true, 10, 0, 20, 0, false);
ATTACK(fighter, 0, 0, Hash40::new("footr"), 7.0, 62, 8, 0, 69, 4.0, 0.0, 0.0, 0.0, Some(-8.0), Some(0.0), Some(0.0), 0.9, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_NO_FLOOR, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK);
}
frame(lua_state, 16.0);
if is_excute(fighter) {
AttackModule::clear_all(boma);
fighter.set_int(*FIGHTER_BAYONETTA_SHOOTING_STEP_WAIT_END, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_SHOOTING_STEP);
//fighter.off_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION);
}
frame(lua_state, 24.0);
if is_excute(fighter) {
KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL);
}
}

#[acmd_script( agent = "bayonetta", script = "effect_specialsedge", category = ACMD_EFFECT, low_priority )]
unsafe fn bayonetta_special_s_edge_effect(fighter: &mut L2CAgentBase) {
let lua_state = fighter.lua_state_agent;
let boma = fighter.boma();
frame(lua_state, 1.0);
if is_excute(fighter) {
EFFECT_FOLLOW_NO_STOP(fighter, Hash40::new("bayonetta_heelslide_burst"), Hash40::new("kneer"), 9.5, 0, 0, 0, 90, 0, 1.1, true);
EffectModule::enable_sync_init_pos_last(boma);
if WorkModule::get_int(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_COSTUME_KIND) == 2 {LAST_EFFECT_SET_COLOR(fighter, 1, 0.118, 0.118); }
else {LAST_EFFECT_SET_COLOR(fighter, 0.059, 0.38, 1); }
}
frame(lua_state, 14.0);
if is_excute(fighter) {
EFFECT_OFF_KIND(fighter, Hash40::new("bayonetta_heelslide_burst"), false, false);
}
}

#[acmd_script( agent = "bayonetta", script = "sound_specialsedge", category = ACMD_SOUND, low_priority )]
unsafe fn bayonetta_special_s_edge_sound(fighter: &mut L2CAgentBase) {
}

#[acmd_script( agent = "bayonetta", script = "expression_specialsedge", category = ACMD_EXPRESSION, low_priority )]
unsafe fn bayonetta_special_s_edge_expression(fighter: &mut L2CAgentBase) {
let lua_state = fighter.lua_state_agent;
let boma = fighter.boma();
frame(lua_state, 1.0);
if is_excute(fighter) {
ControlModule::set_rumble(boma, Hash40::new("rbkind_dash"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32);
slope!(fighter, *MA_MSC_CMD_SLOPE_SLOPE_INTP, *SLOPE_STATUS_TOP, 2, true);
}
frame(lua_state, 16.0);
if is_excute(fighter) {
ControlModule::set_rumble(boma, Hash40::new("rbkind_lands"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32);
slope!(fighter, *MA_MSC_CMD_SLOPE_SLOPE_INTP, *SLOPE_STATUS_LR, 6);
}
}

#[acmd_script( agent = "bayonetta", script = "game_specialsholdend", category = ACMD_GAME, low_priority )]
unsafe fn bayonetta_special_s_hold_end_game(fighter: &mut L2CAgentBase) {
let lua_state = fighter.lua_state_agent;
Expand Down Expand Up @@ -302,15 +361,14 @@ unsafe fn bayonetta_special_hi_game(fighter: &mut L2CAgentBase) {
if is_excute(fighter) {
AttackModule::clear_all(boma);
fighter.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_CHECK_END);
KineticModule::add_speed_outside(fighter.module_accessor, *KINETIC_OUTSIDE_ENERGY_TYPE_WIND_NO_ADDITION, &Vector3f::new( 0.0, 4.0, 0.0));
if fighter.is_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_HI_FLAG_REUSE) {
VarModule::on_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_CANCEL);
ATTACK(fighter, 0, 0, Hash40::new("top"), 3.5, 22, 35, 0, 40, 4.6, 0.0, 23.1, 0.0, Some(0.0), Some(18.4), Some(0.0), 1.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH);
} else {
ATTACK(fighter, 0, 0, Hash40::new("top"), 3.5, 42, 55, 0, 45, 4.6, 0.0, 23.1, 0.0, Some(0.0), Some(18.4), Some(0.0), 1.3, 1.0, *ATTACK_SETOFF_KIND_OFF, *ATTACK_LR_CHECK_F, true, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_PUNCH);
}
}
frame(lua_state, 22.0);
frame(lua_state, 23.0);
if is_excute(fighter) {
AttackModule::clear_all(boma);
notify_event_msc_cmd!(fighter, Hash40::new_raw(0x2bfb02b69a), true);
Expand All @@ -324,14 +382,14 @@ unsafe fn bayonetta_special_hi_game(fighter: &mut L2CAgentBase) {
CancelModule::enable_cancel(fighter.module_accessor);
}
}
frame(lua_state, 35.0);
frame(lua_state, 32.0);
if is_excute(fighter) {
notify_event_msc_cmd!(fighter, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES);
KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL);
}
}

#[acmd_script( agent = "bayonetta", scripts = ["effect_specialairhi", "effect_specialhi"], category = ACMD_EFFECT, low_priority )]
#[acmd_script( agent = "bayonetta", script = "effect_specialhi", category = ACMD_EFFECT, low_priority )]
unsafe fn bayonetta_special_hi_effect(fighter: &mut L2CAgentBase) {
frame(fighter.lua_state_agent, 6.0);
if is_excute(fighter) {
Expand Down Expand Up @@ -362,7 +420,7 @@ unsafe fn bayonetta_special_hi_effect(fighter: &mut L2CAgentBase) {
}
}

#[acmd_script( agent = "bayonetta", scripts = ["sound_specialhi", "sound_specialairhi"], category = ACMD_SOUND, low_priority )]
#[acmd_script( agent = "bayonetta", script = "sound_specialhi", category = ACMD_SOUND, low_priority )]
unsafe fn bayonetta_special_hi_sound(fighter: &mut L2CAgentBase) {
let lua_state = fighter.lua_state_agent;
let boma = fighter.boma();
Expand Down Expand Up @@ -430,6 +488,10 @@ pub fn install() {
bayonetta_special_n_end_game,
bayonetta_special_n_start_game,
bayonetta_special_s_game,
bayonetta_special_s_edge_game,
bayonetta_special_s_edge_effect,
bayonetta_special_s_edge_sound,
bayonetta_special_s_edge_expression,
bayonetta_special_s_hold_end_game,
bayonetta_special_air_s_u_game,
bayonetta_special_air_s_u_effect,
Expand Down
11 changes: 8 additions & 3 deletions fighters/bayonetta/src/opff.rs
Original file line number Diff line number Diff line change
Expand Up @@ -80,9 +80,14 @@ unsafe fn resources(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModul
VarModule::on_flag(fighter.battle_object, vars::common::instance::SIDE_SPECIAL_CANCEL);
VarModule::on_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_CANCEL);
}
//hit-flag
if !VarModule::is_flag(fighter.battle_object, vars::bayonetta::instance::IS_HIT) && AttackModule::is_infliction(boma, *COLLISION_KIND_MASK_HIT) && VarModule::get_int(fighter.battle_object, vars::common::instance::LAST_ATTACK_HITBOX_ID) < 6 {
VarModule::on_flag(fighter.battle_object, vars::bayonetta::instance::IS_HIT);
//hit-flag to filter bullets
if !VarModule::is_flag(fighter.battle_object, vars::bayonetta::instance::IS_HIT) && VarModule::get_int(fighter.battle_object, vars::common::instance::LAST_ATTACK_HITBOX_ID) < 6 {
//hit cancel moves (filter shield)
if fighter.is_status_one_of(&[*FIGHTER_STATUS_KIND_ATTACK_AIR, *FIGHTER_BAYONETTA_STATUS_KIND_ATTACK_AIR_F, *FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_AIR_S_U, *FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_AIR_S_D, *FIGHTER_STATUS_KIND_SPECIAL_HI, *FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_HI_JUMP]) {
if AttackModule::is_infliction(boma, *COLLISION_KIND_MASK_HIT) {VarModule::on_flag(fighter.battle_object, vars::bayonetta::instance::IS_HIT); }
} else { //other moves
if AttackModule::is_infliction(boma, *COLLISION_KIND_MASK_HIT | *COLLISION_KIND_MASK_SHIELD) {VarModule::on_flag(fighter.battle_object, vars::bayonetta::instance::IS_HIT); }
}
}
}

Expand Down
102 changes: 74 additions & 28 deletions fighters/bayonetta/src/status/specials.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,14 @@ pub fn install_custom() {
.with_main(bayonetta_special_s_kick_main)
.with_end(bayonetta_special_s_kick_end)
);
CustomStatusManager::add_new_agent_status_script(
Hash40::new("fighter_kind_bayonetta"),
statuses::bayonetta::SPECIAL_S_EDGE,
StatusInfo::new()
.with_pre(bayonetta_special_s_edge_pre)
.with_main(bayonetta_special_s_edge_main)
.with_end(bayonetta_special_s_edge_end)
);
}

// FIGHTER_STATUS_KIND_SPECIAL_S //
Expand All @@ -39,22 +47,17 @@ unsafe extern "C" fn bayonetta_special_s_main_loop(fighter: &mut L2CFighterCommo
if CancelModule::is_enable_cancel(fighter.module_accessor) && (fighter.sub_wait_ground_check_common(false.into()).get_bool() || fighter.sub_air_check_fall_common().get_bool()) {
return 1.into();
}
let frame = fighter.global_table[CURRENT_FRAME].get_i32() + 1;
VarModule::set_int(fighter.battle_object, vars::bayonetta::instance::SPECIAL_S_FRAME, frame);
if fighter.global_table[SITUATION_KIND] == SITUATION_KIND_GROUND { //gr checks
bayonetta_special_s_slow_hit(fighter);
if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_HIT | *COLLISION_KIND_MASK_SHIELD)
&& !fighter.is_in_hitlag()
&& VarModule::get_int(fighter.battle_object, vars::common::instance::LAST_ATTACK_HITBOX_ID) < 3 {
if fighter.is_cat_flag(Cat1::SpecialAny | Cat1::AttackN)
&& fighter.global_table[CURRENT_FRAME].get_i32() >= 20
&& fighter.global_table[CURRENT_FRAME].get_i32() <= 35 {
if VarModule::is_flag(fighter.battle_object, vars::bayonetta::instance::IS_HIT) && !fighter.is_in_hitlag() {
if fighter.is_cat_flag(Cat1::SpecialAny | Cat1::AttackN) && frame >= 20 && frame <= 35 {
GroundModule::set_correct(fighter.module_accessor, app::GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP));
fighter.change_to_custom_status(statuses::bayonetta::SPECIAL_S_KICK, true, false);
}
}
if MotionModule::is_end(fighter.module_accessor) {
fighter.off_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_S_FLAG_HIT_CANCEL_OK);
fighter.change_status(FIGHTER_STATUS_KIND_WAIT.into(), false.into());
}
if MotionModule::is_end(fighter.module_accessor) {fighter.change_status(FIGHTER_STATUS_KIND_WAIT.into(), false.into());}
if fighter.is_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_S_FLAG_WALL_CHECK) {
let mut touch_wall = false;
if PostureModule::lr(fighter.module_accessor) > 0.0 {
Expand All @@ -65,30 +68,73 @@ unsafe extern "C" fn bayonetta_special_s_main_loop(fighter: &mut L2CFighterCommo
if touch_wall {fighter.change_status(FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_AIR_S_WALL_END.into(), false.into()); }
}
} else { //slide-off
if MotionModule::is_end(fighter.module_accessor) {fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into());}
if frame >= 45 {fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); }
if StatusModule::is_situation_changed(fighter.module_accessor) {
fighter.set_situation(SITUATION_KIND_AIR.into());
GroundModule::set_correct(fighter.module_accessor, app::GroundCorrectKind(*GROUND_CORRECT_KIND_AIR));
KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION_AIR);
KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY);
sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, 0.45);
sv_kinetic_energy!(set_speed_mul, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, 0.67);
}
EFFECT_OFF_KIND(fighter, Hash40::new("sys_run_smoke"), false, false);
EFFECT_OFF_KIND(fighter, Hash40::new("bayonetta_heelslide_trace"), false, false);
if fighter.motion_frame() >= 45.0 {
fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into());
if frame < 45 {fighter.change_to_custom_status(statuses::bayonetta::SPECIAL_S_EDGE, false, false);}
}
}
0.into()
}

// FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_S_edge //

unsafe extern "C" fn bayonetta_special_s_edge_pre(fighter: &mut L2CFighterCommon) -> L2CValue {
StatusModule::init_settings(
fighter.module_accessor,
app::SituationKind(*SITUATION_KIND_AIR),
*FIGHTER_KINETIC_TYPE_MOTION_AIR,
*GROUND_CORRECT_KIND_KEEP as u32,
app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE),
true,
*FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLAG,
*FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_INT,
*FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLOAT,
*FS_SUCCEEDS_KEEP_ATTACK
);
FighterStatusModuleImpl::set_fighter_status_data(
fighter.module_accessor,
false,
*FIGHTER_TREADED_KIND_NO_REAC,
false,
false,
false,
(*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_S | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK | *FIGHTER_LOG_MASK_FLAG_ACTION_TRIGGER_ON) as u64,
0,
*FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_S as u32,
0
);
0.into()
}

unsafe extern "C" fn bayonetta_special_s_edge_main(fighter: &mut L2CFighterCommon) -> L2CValue {
let frame = VarModule::get_int(fighter.battle_object, vars::bayonetta::instance::SPECIAL_S_FRAME) as f32 - 18.0;
MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_s_edge"), frame.clamp(0.0, 16.0), 1.0, false, 0.0, false, false);
fighter.sub_shift_status_main(L2CValue::Ptr(bayonetta_special_s_edge_main_loop as *const () as _))
}

unsafe extern "C" fn bayonetta_special_s_edge_end(fighter: &mut L2CFighterCommon) -> L2CValue {
0.into()
}

unsafe extern "C" fn bayonetta_special_s_edge_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue {
if CancelModule::is_enable_cancel(fighter.module_accessor) && (fighter.sub_wait_ground_check_common(false.into()).get_bool() || fighter.sub_air_check_fall_common().get_bool()) {
return 1.into();
}
if MotionModule::is_end(fighter.module_accessor) {fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); }
0.into()
}

// FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_S_KICK //

unsafe extern "C" fn bayonetta_special_s_kick_pre(fighter: &mut L2CFighterCommon) -> L2CValue {
StatusModule::init_settings(
fighter.module_accessor,
app::SituationKind(*SITUATION_KIND_GROUND),
*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP,
*GROUND_CORRECT_KIND_KEEP as u32,
*FIGHTER_KINETIC_TYPE_MOTION,
*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP as u32,
app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE),
true,
*FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLAG,
Expand All @@ -103,7 +149,7 @@ unsafe extern "C" fn bayonetta_special_s_kick_pre(fighter: &mut L2CFighterCommon
false,
false,
false,
(*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_S | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK) as u64,
(*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_S | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK | *FIGHTER_LOG_MASK_FLAG_ACTION_TRIGGER_ON) as u64,
0,
*FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_S as u32,
0
Expand All @@ -112,10 +158,10 @@ unsafe extern "C" fn bayonetta_special_s_kick_pre(fighter: &mut L2CFighterCommon
}

unsafe extern "C" fn bayonetta_special_s_kick_main(fighter: &mut L2CFighterCommon) -> L2CValue {
KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION);
MotionModule::change_motion(fighter.module_accessor, Hash40::new_raw(0x12b6d89003), 0.0, 1.0, false, 0.0, false, false);
KineticModule::clear_speed_energy_id(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_MOTION);
sv_kinetic_energy!(set_speed_mul, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, 1.1);
MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_s_hold_end"), 0.0, 1.0, false, 0.0, false, false);
let frame = VarModule::get_int(fighter.battle_object, vars::bayonetta::instance::SPECIAL_S_FRAME) - 20;
let speed = 1.12 - (0.016 * frame as f32); //instant kick = 1.12, last second kick ~ 0.88
sv_kinetic_energy!(set_speed_mul, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, speed);
fighter.sub_shift_status_main(L2CValue::Ptr(bayonetta_special_s_kick_main_loop as *const () as _))
}

Expand All @@ -137,10 +183,10 @@ unsafe extern "C" fn bayonetta_special_s_kick_main_loop(fighter: &mut L2CFighter
unsafe extern "C" fn bayonetta_special_s_slow_hit(fighter: &mut L2CFighterCommon) -> L2CValue {
let mul_x = fighter.get_param_float("param_special_s", "hs_shooting_speed_mul_x");
let shield_x = fighter.get_param_float("param_special_s", "guard_speed_mul_x");
if VarModule::get_int(fighter.battle_object, vars::common::instance::LAST_ATTACK_HITBOX_ID) < 3 {
if VarModule::is_flag(fighter.battle_object, vars::bayonetta::instance::IS_HIT) {
if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_SHIELD) {
sv_kinetic_energy!(set_speed_mul, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, shield_x);
} else if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_HIT) {
} else {
sv_kinetic_energy!(set_speed_mul, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, mul_x);
}
}
Expand Down
Loading
Loading