Skip to content

Commit 826e4cd

Browse files
authored
Merge pull request #2240 from jaccob101/beyo_experiment
Bayonetta Improvements: Jab, Side and Up Special
2 parents 5256523 + e27c6fd commit 826e4cd

File tree

6 files changed

+222
-70
lines changed

6 files changed

+222
-70
lines changed

dynamic/src/consts.rs

+2
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,7 @@ pub mod vars {
305305
// ints
306306
pub const NUM_RECOVERY_RESOURCE_USED: i32 = 0x0100;
307307
pub const FAIR_STATE: i32 = 0x0101;
308+
pub const SPECIAL_S_FRAME: i32 = 0x0102;
308309
}
309310
pub mod status {
310311
// floats
@@ -1499,5 +1500,6 @@ pub mod statuses {
14991500

15001501
pub mod bayonetta {
15011502
pub const SPECIAL_S_KICK: i32 = 0;
1503+
pub const SPECIAL_S_EDGE: i32 = 1;
15021504
}
15031505
}

fighters/bayonetta/src/acmd/ground.rs

+36-32
Large diffs are not rendered by default.

fighters/bayonetta/src/acmd/specials.rs

+66-5
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,64 @@ unsafe fn bayonetta_special_s_game(fighter: &mut L2CAgentBase) {
6363
}
6464
}
6565

66+
#[acmd_script( agent = "bayonetta", script = "game_specialsedge", category = ACMD_GAME, low_priority )]
67+
unsafe fn bayonetta_special_s_edge_game(fighter: &mut L2CAgentBase) {
68+
let lua_state = fighter.lua_state_agent;
69+
let boma = fighter.boma();
70+
frame(lua_state, 1.0);
71+
if is_excute(fighter) {
72+
fighter.off_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_S_FLAG_WALL_CHECK);
73+
notify_event_msc_cmd!(fighter, Hash40::new_raw(0x2d51fcdb09), *FIGHTER_BAYONETTA_SHOOTING_SLOT_R_LEG, false, false, true, 10, 0, 20, 0, false);
74+
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);
75+
}
76+
frame(lua_state, 16.0);
77+
if is_excute(fighter) {
78+
AttackModule::clear_all(boma);
79+
fighter.set_int(*FIGHTER_BAYONETTA_SHOOTING_STEP_WAIT_END, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_SHOOTING_STEP);
80+
//fighter.off_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_ACTION);
81+
}
82+
frame(lua_state, 24.0);
83+
if is_excute(fighter) {
84+
KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL);
85+
}
86+
}
87+
88+
#[acmd_script( agent = "bayonetta", script = "effect_specialsedge", category = ACMD_EFFECT, low_priority )]
89+
unsafe fn bayonetta_special_s_edge_effect(fighter: &mut L2CAgentBase) {
90+
let lua_state = fighter.lua_state_agent;
91+
let boma = fighter.boma();
92+
frame(lua_state, 1.0);
93+
if is_excute(fighter) {
94+
EFFECT_FOLLOW_NO_STOP(fighter, Hash40::new("bayonetta_heelslide_burst"), Hash40::new("kneer"), 9.5, 0, 0, 0, 90, 0, 1.1, true);
95+
EffectModule::enable_sync_init_pos_last(boma);
96+
if fighter.get_int(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_COSTUME_KIND) != 2 {LAST_PARTICLE_SET_COLOR(fighter, 0.048, 0.452, 1); }
97+
}
98+
frame(lua_state, 14.0);
99+
if is_excute(fighter) {
100+
EFFECT_OFF_KIND(fighter, Hash40::new("bayonetta_heelslide_burst"), false, false);
101+
}
102+
}
103+
104+
#[acmd_script( agent = "bayonetta", script = "sound_specialsedge", category = ACMD_SOUND, low_priority )]
105+
unsafe fn bayonetta_special_s_edge_sound(fighter: &mut L2CAgentBase) {
106+
}
107+
108+
#[acmd_script( agent = "bayonetta", script = "expression_specialsedge", category = ACMD_EXPRESSION, low_priority )]
109+
unsafe fn bayonetta_special_s_edge_expression(fighter: &mut L2CAgentBase) {
110+
let lua_state = fighter.lua_state_agent;
111+
let boma = fighter.boma();
112+
frame(lua_state, 1.0);
113+
if is_excute(fighter) {
114+
ControlModule::set_rumble(boma, Hash40::new("rbkind_dash"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32);
115+
slope!(fighter, *MA_MSC_CMD_SLOPE_SLOPE_INTP, *SLOPE_STATUS_TOP, 2, true);
116+
}
117+
frame(lua_state, 16.0);
118+
if is_excute(fighter) {
119+
ControlModule::set_rumble(boma, Hash40::new("rbkind_lands"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32);
120+
slope!(fighter, *MA_MSC_CMD_SLOPE_SLOPE_INTP, *SLOPE_STATUS_LR, 6);
121+
}
122+
}
123+
66124
#[acmd_script( agent = "bayonetta", script = "game_specialsholdend", category = ACMD_GAME, low_priority )]
67125
unsafe fn bayonetta_special_s_hold_end_game(fighter: &mut L2CAgentBase) {
68126
let lua_state = fighter.lua_state_agent;
@@ -302,15 +360,14 @@ unsafe fn bayonetta_special_hi_game(fighter: &mut L2CAgentBase) {
302360
if is_excute(fighter) {
303361
AttackModule::clear_all(boma);
304362
fighter.on_flag(*FIGHTER_BAYONETTA_INSTANCE_WORK_ID_FLAG_SHOOTING_CHECK_END);
305-
KineticModule::add_speed_outside(fighter.module_accessor, *KINETIC_OUTSIDE_ENERGY_TYPE_WIND_NO_ADDITION, &Vector3f::new( 0.0, 4.0, 0.0));
306363
if fighter.is_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_HI_FLAG_REUSE) {
307364
VarModule::on_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_CANCEL);
308365
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);
309366
} else {
310367
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);
311368
}
312369
}
313-
frame(lua_state, 22.0);
370+
frame(lua_state, 23.0);
314371
if is_excute(fighter) {
315372
AttackModule::clear_all(boma);
316373
notify_event_msc_cmd!(fighter, Hash40::new_raw(0x2bfb02b69a), true);
@@ -324,14 +381,14 @@ unsafe fn bayonetta_special_hi_game(fighter: &mut L2CAgentBase) {
324381
CancelModule::enable_cancel(fighter.module_accessor);
325382
}
326383
}
327-
frame(lua_state, 35.0);
384+
frame(lua_state, 32.0);
328385
if is_excute(fighter) {
329386
notify_event_msc_cmd!(fighter, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES);
330387
KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL);
331388
}
332389
}
333390

334-
#[acmd_script( agent = "bayonetta", scripts = ["effect_specialairhi", "effect_specialhi"], category = ACMD_EFFECT, low_priority )]
391+
#[acmd_script( agent = "bayonetta", script = "effect_specialhi", category = ACMD_EFFECT, low_priority )]
335392
unsafe fn bayonetta_special_hi_effect(fighter: &mut L2CAgentBase) {
336393
frame(fighter.lua_state_agent, 6.0);
337394
if is_excute(fighter) {
@@ -362,7 +419,7 @@ unsafe fn bayonetta_special_hi_effect(fighter: &mut L2CAgentBase) {
362419
}
363420
}
364421

365-
#[acmd_script( agent = "bayonetta", scripts = ["sound_specialhi", "sound_specialairhi"], category = ACMD_SOUND, low_priority )]
422+
#[acmd_script( agent = "bayonetta", script = "sound_specialhi", category = ACMD_SOUND, low_priority )]
366423
unsafe fn bayonetta_special_hi_sound(fighter: &mut L2CAgentBase) {
367424
let lua_state = fighter.lua_state_agent;
368425
let boma = fighter.boma();
@@ -430,6 +487,10 @@ pub fn install() {
430487
bayonetta_special_n_end_game,
431488
bayonetta_special_n_start_game,
432489
bayonetta_special_s_game,
490+
bayonetta_special_s_edge_game,
491+
bayonetta_special_s_edge_effect,
492+
bayonetta_special_s_edge_sound,
493+
bayonetta_special_s_edge_expression,
433494
bayonetta_special_s_hold_end_game,
434495
bayonetta_special_air_s_u_game,
435496
bayonetta_special_air_s_u_effect,

fighters/bayonetta/src/opff.rs

+8-3
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,14 @@ unsafe fn resources(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModul
8080
VarModule::on_flag(fighter.battle_object, vars::common::instance::SIDE_SPECIAL_CANCEL);
8181
VarModule::on_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_CANCEL);
8282
}
83-
//hit-flag
84-
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 {
85-
VarModule::on_flag(fighter.battle_object, vars::bayonetta::instance::IS_HIT);
83+
//hit-flag to filter bullets
84+
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 {
85+
//hit cancel moves (filter shield)
86+
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]) {
87+
if AttackModule::is_infliction(boma, *COLLISION_KIND_MASK_HIT) {VarModule::on_flag(fighter.battle_object, vars::bayonetta::instance::IS_HIT); }
88+
} else { //other moves
89+
if AttackModule::is_infliction(boma, *COLLISION_KIND_MASK_HIT | *COLLISION_KIND_MASK_SHIELD) {VarModule::on_flag(fighter.battle_object, vars::bayonetta::instance::IS_HIT); }
90+
}
8691
}
8792
}
8893

fighters/bayonetta/src/status/specials.rs

+73-27
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,14 @@ pub fn install_custom() {
1717
.with_main(bayonetta_special_s_kick_main)
1818
.with_end(bayonetta_special_s_kick_end)
1919
);
20+
CustomStatusManager::add_new_agent_status_script(
21+
Hash40::new("fighter_kind_bayonetta"),
22+
statuses::bayonetta::SPECIAL_S_EDGE,
23+
StatusInfo::new()
24+
.with_pre(bayonetta_special_s_edge_pre)
25+
.with_main(bayonetta_special_s_edge_main)
26+
.with_end(bayonetta_special_s_edge_end)
27+
);
2028
}
2129

2230
// FIGHTER_STATUS_KIND_SPECIAL_S //
@@ -39,22 +47,17 @@ unsafe extern "C" fn bayonetta_special_s_main_loop(fighter: &mut L2CFighterCommo
3947
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()) {
4048
return 1.into();
4149
}
50+
let frame = fighter.global_table[CURRENT_FRAME].get_i32() + 1;
51+
VarModule::set_int(fighter.battle_object, vars::bayonetta::instance::SPECIAL_S_FRAME, frame);
4252
if fighter.global_table[SITUATION_KIND] == SITUATION_KIND_GROUND { //gr checks
4353
bayonetta_special_s_slow_hit(fighter);
44-
if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_HIT | *COLLISION_KIND_MASK_SHIELD)
45-
&& !fighter.is_in_hitlag()
46-
&& VarModule::get_int(fighter.battle_object, vars::common::instance::LAST_ATTACK_HITBOX_ID) < 3 {
47-
if fighter.is_cat_flag(Cat1::SpecialAny | Cat1::AttackN)
48-
&& fighter.global_table[CURRENT_FRAME].get_i32() >= 20
49-
&& fighter.global_table[CURRENT_FRAME].get_i32() <= 35 {
54+
if VarModule::is_flag(fighter.battle_object, vars::bayonetta::instance::IS_HIT) && !fighter.is_in_hitlag() {
55+
if fighter.is_cat_flag(Cat1::SpecialAny | Cat1::AttackN) && frame >= 20 && frame <= 35 {
5056
GroundModule::set_correct(fighter.module_accessor, app::GroundCorrectKind(*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP));
5157
fighter.change_to_custom_status(statuses::bayonetta::SPECIAL_S_KICK, true, false);
5258
}
5359
}
54-
if MotionModule::is_end(fighter.module_accessor) {
55-
fighter.off_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_S_FLAG_HIT_CANCEL_OK);
56-
fighter.change_status(FIGHTER_STATUS_KIND_WAIT.into(), false.into());
57-
}
60+
if MotionModule::is_end(fighter.module_accessor) {fighter.change_status(FIGHTER_STATUS_KIND_WAIT.into(), false.into());}
5861
if fighter.is_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_S_FLAG_WALL_CHECK) {
5962
let mut touch_wall = false;
6063
if PostureModule::lr(fighter.module_accessor) > 0.0 {
@@ -65,30 +68,73 @@ unsafe extern "C" fn bayonetta_special_s_main_loop(fighter: &mut L2CFighterCommo
6568
if touch_wall {fighter.change_status(FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_AIR_S_WALL_END.into(), false.into()); }
6669
}
6770
} else { //slide-off
71+
if MotionModule::is_end(fighter.module_accessor) {fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into());}
72+
if frame >= 45 {fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); }
6873
if StatusModule::is_situation_changed(fighter.module_accessor) {
74+
fighter.set_situation(SITUATION_KIND_AIR.into());
6975
GroundModule::set_correct(fighter.module_accessor, app::GroundCorrectKind(*GROUND_CORRECT_KIND_AIR));
70-
KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_MOTION_AIR);
71-
KineticModule::enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY);
72-
sv_kinetic_energy!(set_stable_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, 0.45);
73-
sv_kinetic_energy!(set_speed_mul, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, 0.67);
74-
}
75-
EFFECT_OFF_KIND(fighter, Hash40::new("sys_run_smoke"), false, false);
76-
EFFECT_OFF_KIND(fighter, Hash40::new("bayonetta_heelslide_trace"), false, false);
77-
if fighter.motion_frame() >= 45.0 {
78-
fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into());
76+
if frame < 45 {fighter.change_to_custom_status(statuses::bayonetta::SPECIAL_S_EDGE, false, false);}
7977
}
8078
}
8179
0.into()
8280
}
8381

82+
// FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_S_edge //
83+
84+
unsafe extern "C" fn bayonetta_special_s_edge_pre(fighter: &mut L2CFighterCommon) -> L2CValue {
85+
StatusModule::init_settings(
86+
fighter.module_accessor,
87+
app::SituationKind(*SITUATION_KIND_AIR),
88+
*FIGHTER_KINETIC_TYPE_MOTION_AIR,
89+
*GROUND_CORRECT_KIND_KEEP as u32,
90+
app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE),
91+
true,
92+
*FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLAG,
93+
*FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_INT,
94+
*FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLOAT,
95+
*FS_SUCCEEDS_KEEP_ATTACK
96+
);
97+
FighterStatusModuleImpl::set_fighter_status_data(
98+
fighter.module_accessor,
99+
false,
100+
*FIGHTER_TREADED_KIND_NO_REAC,
101+
false,
102+
false,
103+
false,
104+
(*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_S | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK | *FIGHTER_LOG_MASK_FLAG_ACTION_TRIGGER_ON) as u64,
105+
0,
106+
*FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_S as u32,
107+
0
108+
);
109+
0.into()
110+
}
111+
112+
unsafe extern "C" fn bayonetta_special_s_edge_main(fighter: &mut L2CFighterCommon) -> L2CValue {
113+
let frame = VarModule::get_int(fighter.battle_object, vars::bayonetta::instance::SPECIAL_S_FRAME) as f32 - 18.0;
114+
MotionModule::change_motion(fighter.module_accessor, Hash40::new("special_s_edge"), frame.clamp(0.0, 16.0), 1.0, false, 0.0, false, false);
115+
fighter.sub_shift_status_main(L2CValue::Ptr(bayonetta_special_s_edge_main_loop as *const () as _))
116+
}
117+
118+
unsafe extern "C" fn bayonetta_special_s_edge_end(fighter: &mut L2CFighterCommon) -> L2CValue {
119+
0.into()
120+
}
121+
122+
unsafe extern "C" fn bayonetta_special_s_edge_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue {
123+
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()) {
124+
return 1.into();
125+
}
126+
if MotionModule::is_end(fighter.module_accessor) {fighter.change_status(FIGHTER_STATUS_KIND_FALL.into(), false.into()); }
127+
0.into()
128+
}
129+
84130
// FIGHTER_BAYONETTA_STATUS_KIND_SPECIAL_S_KICK //
85131

86132
unsafe extern "C" fn bayonetta_special_s_kick_pre(fighter: &mut L2CFighterCommon) -> L2CValue {
87133
StatusModule::init_settings(
88134
fighter.module_accessor,
89135
app::SituationKind(*SITUATION_KIND_GROUND),
90-
*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP,
91-
*GROUND_CORRECT_KIND_KEEP as u32,
136+
*FIGHTER_KINETIC_TYPE_MOTION,
137+
*GROUND_CORRECT_KIND_GROUND_CLIFF_STOP as u32,
92138
app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE),
93139
true,
94140
*FIGHTER_STATUS_WORK_KEEP_FLAG_NONE_FLAG,
@@ -112,10 +158,10 @@ unsafe extern "C" fn bayonetta_special_s_kick_pre(fighter: &mut L2CFighterCommon
112158
}
113159

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

@@ -137,10 +183,10 @@ unsafe extern "C" fn bayonetta_special_s_kick_main_loop(fighter: &mut L2CFighter
137183
unsafe extern "C" fn bayonetta_special_s_slow_hit(fighter: &mut L2CFighterCommon) -> L2CValue {
138184
let mul_x = fighter.get_param_float("param_special_s", "hs_shooting_speed_mul_x");
139185
let shield_x = fighter.get_param_float("param_special_s", "guard_speed_mul_x");
140-
if VarModule::get_int(fighter.battle_object, vars::common::instance::LAST_ATTACK_HITBOX_ID) < 3 {
186+
if VarModule::is_flag(fighter.battle_object, vars::bayonetta::instance::IS_HIT) {
141187
if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_SHIELD) {
142188
sv_kinetic_energy!(set_speed_mul, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, shield_x);
143-
} else if AttackModule::is_infliction_status(fighter.module_accessor, *COLLISION_KIND_MASK_HIT) {
189+
} else {
144190
sv_kinetic_energy!(set_speed_mul, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, mul_x);
145191
}
146192
}

romfs/source/fighter/bayonetta/motion/body/motion_patch.yaml

+37-3
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,13 @@ throw_hi:
1919
cancel_frame: 35
2020
attack_12:
2121
extra:
22-
cancel_frame: 25
22+
cancel_frame: 27
2323
attack_13:
2424
extra:
2525
cancel_frame: 27
2626
attack_11:
2727
extra:
28-
cancel_frame: 25
28+
cancel_frame: 27
2929
attack_lw3:
3030
flags:
3131
move: false
@@ -103,6 +103,12 @@ attack_100_end:
103103
extra:
104104
cancel_frame: 41
105105
special_air_hi:
106+
animations:
107+
- name: d02specialhi.nuanmb
108+
scripts:
109+
- expression_specialhi
110+
- sound_specialhi
111+
- effect_specialhi
106112
extra:
107113
cancel_frame: 38
108114
special_air_s_u:
@@ -111,11 +117,39 @@ special_air_s_u:
111117
special_s:
112118
extra:
113119
cancel_frame: 62
120+
special_s_edge:
121+
game_script: game_specialsedge
122+
flags:
123+
turn: false
124+
loop: false
125+
move: true
126+
fix_trans: false
127+
fix_rot: false
128+
fix_scale: false
129+
unk_40: false
130+
unk_80: true
131+
unk_100: false
132+
unk_200: false
133+
unk_400: false
134+
unk_800: false
135+
unk_1000: false
136+
unk_2000: false
137+
blend_frames: 5
138+
animations:
139+
- name: d01specialsedge.nuanmb
140+
scripts:
141+
- expression_specialsedge
142+
- sound_specialsedge
143+
- effect_specialsedge
144+
extra:
145+
intangible_start_frame: 0
146+
intangible_end_frame: 0
147+
cancel_frame: 25
148+
freeze_during_hitstop: false
114149
special_s_hold_end:
115150
extra:
116151
cancel_frame: 61
117152
special_air_s_d:
118-
blend_frames: 1
119153
special_air_s_d_hit:
120154
extra:
121155
cancel_frame: 32

0 commit comments

Comments
 (0)