Skip to content

Commit 6dea02d

Browse files
authored
Merge pull request #2239 from HDR-Development/small-fixes
Misc Adjustments 5
2 parents a2cda5a + f15cb81 commit 6dea02d

File tree

81 files changed

+1625
-946
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

81 files changed

+1625
-946
lines changed

dynamic/src/consts.rs

+7
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
@@ -517,6 +518,7 @@ pub mod vars {
517518

518519
// flags
519520
pub const IS_INVALID_TELEPORT: i32 = 0x1101;
521+
pub const GROUNDED_TELEPORT: i32 = 0x1102;
520522
}
521523
}
522524

@@ -658,6 +660,7 @@ pub mod vars {
658660
// copy ability
659661
// flags
660662
pub const SHOULD_CYCLE_MATERIAL: i32 = 0x01F4;
663+
pub use super::super::ridley::instance::SPECIAL_N_EXPLODE;
661664

662665
// ints
663666
pub const MATERIAL_INDEX: i32 = 0x01F5;
@@ -1199,6 +1202,7 @@ pub mod vars {
11991202
// flags
12001203
pub const LUNAR_LAUNCH_AIR_USED: i32 = 0x0100;
12011204
pub const DETONATE_READY: i32 = 0x0101;
1205+
pub const BOOSTED_DAIR_AIRTIME: i32 = 0x0102;
12021206

12031207
// ints
12041208
pub const LUNAR_LAUNCH_EFF_HANDLER: i32 = 0x0100;
@@ -1238,6 +1242,7 @@ pub mod vars {
12381242
// flags
12391243
pub const IS_DREAMLAND_EXPRESS: i32 = 0x0100;
12401244
pub const IS_LATE_DLE_INPUT: i32 = 0x0101;
1245+
pub const KO_MOTION_AIRTIME: i32 = 0x0102;
12411246

12421247
// floats
12431248
pub const CURRENT_DAMAGE: i32 = 0x0100;
@@ -1318,6 +1323,7 @@ pub mod vars {
13181323
pub const SPECIAL_LW_ENABLE_LANDING: i32 = 0x0102;
13191324
pub const SPECIAL_LW_IS_LANDING: i32 = 0x0103;
13201325
pub const SPECIAL_LW_ENABLE_BOUNCE: i32 = 0x0104;
1326+
pub const SPECIAL_N_EXPLODE: i32 = 0x0105;
13211327

13221328
// floats
13231329
pub const SPECIAL_LW_BOUNCE_PREV_POS: i32 = 0x0100; //vector, requires two indexes
@@ -1495,5 +1501,6 @@ pub mod statuses {
14951501

14961502
pub mod bayonetta {
14971503
pub const SPECIAL_S_KICK: i32 = 0;
1504+
pub const SPECIAL_S_EDGE: i32 = 1;
14981505
}
14991506
}

fighters/bayonetta/src/acmd/ground.rs

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

fighters/bayonetta/src/acmd/specials.rs

+67-5
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,65 @@ 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 WorkModule::get_int(boma, *FIGHTER_BAYONETTA_INSTANCE_WORK_ID_INT_COSTUME_KIND) == 2 {LAST_EFFECT_SET_COLOR(fighter, 1, 0.118, 0.118); }
97+
else {LAST_EFFECT_SET_COLOR(fighter, 0.059, 0.38, 1); }
98+
}
99+
frame(lua_state, 14.0);
100+
if is_excute(fighter) {
101+
EFFECT_OFF_KIND(fighter, Hash40::new("bayonetta_heelslide_burst"), false, false);
102+
}
103+
}
104+
105+
#[acmd_script( agent = "bayonetta", script = "sound_specialsedge", category = ACMD_SOUND, low_priority )]
106+
unsafe fn bayonetta_special_s_edge_sound(fighter: &mut L2CAgentBase) {
107+
}
108+
109+
#[acmd_script( agent = "bayonetta", script = "expression_specialsedge", category = ACMD_EXPRESSION, low_priority )]
110+
unsafe fn bayonetta_special_s_edge_expression(fighter: &mut L2CAgentBase) {
111+
let lua_state = fighter.lua_state_agent;
112+
let boma = fighter.boma();
113+
frame(lua_state, 1.0);
114+
if is_excute(fighter) {
115+
ControlModule::set_rumble(boma, Hash40::new("rbkind_dash"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32);
116+
slope!(fighter, *MA_MSC_CMD_SLOPE_SLOPE_INTP, *SLOPE_STATUS_TOP, 2, true);
117+
}
118+
frame(lua_state, 16.0);
119+
if is_excute(fighter) {
120+
ControlModule::set_rumble(boma, Hash40::new("rbkind_lands"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32);
121+
slope!(fighter, *MA_MSC_CMD_SLOPE_SLOPE_INTP, *SLOPE_STATUS_LR, 6);
122+
}
123+
}
124+
66125
#[acmd_script( agent = "bayonetta", script = "game_specialsholdend", category = ACMD_GAME, low_priority )]
67126
unsafe fn bayonetta_special_s_hold_end_game(fighter: &mut L2CAgentBase) {
68127
let lua_state = fighter.lua_state_agent;
@@ -302,15 +361,14 @@ unsafe fn bayonetta_special_hi_game(fighter: &mut L2CAgentBase) {
302361
if is_excute(fighter) {
303362
AttackModule::clear_all(boma);
304363
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));
306364
if fighter.is_flag(*FIGHTER_BAYONETTA_STATUS_WORK_ID_SPECIAL_HI_FLAG_REUSE) {
307365
VarModule::on_flag(fighter.battle_object, vars::common::instance::UP_SPECIAL_CANCEL);
308366
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);
309367
} else {
310368
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);
311369
}
312370
}
313-
frame(lua_state, 22.0);
371+
frame(lua_state, 23.0);
314372
if is_excute(fighter) {
315373
AttackModule::clear_all(boma);
316374
notify_event_msc_cmd!(fighter, Hash40::new_raw(0x2bfb02b69a), true);
@@ -324,14 +382,14 @@ unsafe fn bayonetta_special_hi_game(fighter: &mut L2CAgentBase) {
324382
CancelModule::enable_cancel(fighter.module_accessor);
325383
}
326384
}
327-
frame(lua_state, 35.0);
385+
frame(lua_state, 32.0);
328386
if is_excute(fighter) {
329387
notify_event_msc_cmd!(fighter, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES);
330388
KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL);
331389
}
332390
}
333391

334-
#[acmd_script( agent = "bayonetta", scripts = ["effect_specialairhi", "effect_specialhi"], category = ACMD_EFFECT, low_priority )]
392+
#[acmd_script( agent = "bayonetta", script = "effect_specialhi", category = ACMD_EFFECT, low_priority )]
335393
unsafe fn bayonetta_special_hi_effect(fighter: &mut L2CAgentBase) {
336394
frame(fighter.lua_state_agent, 6.0);
337395
if is_excute(fighter) {
@@ -362,7 +420,7 @@ unsafe fn bayonetta_special_hi_effect(fighter: &mut L2CAgentBase) {
362420
}
363421
}
364422

365-
#[acmd_script( agent = "bayonetta", scripts = ["sound_specialhi", "sound_specialairhi"], category = ACMD_SOUND, low_priority )]
423+
#[acmd_script( agent = "bayonetta", script = "sound_specialhi", category = ACMD_SOUND, low_priority )]
366424
unsafe fn bayonetta_special_hi_sound(fighter: &mut L2CAgentBase) {
367425
let lua_state = fighter.lua_state_agent;
368426
let boma = fighter.boma();
@@ -430,6 +488,10 @@ pub fn install() {
430488
bayonetta_special_n_end_game,
431489
bayonetta_special_n_start_game,
432490
bayonetta_special_s_game,
491+
bayonetta_special_s_edge_game,
492+
bayonetta_special_s_edge_effect,
493+
bayonetta_special_s_edge_sound,
494+
bayonetta_special_s_edge_expression,
433495
bayonetta_special_s_hold_end_game,
434496
bayonetta_special_air_s_u_game,
435497
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

+74-28
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,
@@ -103,7 +149,7 @@ unsafe extern "C" fn bayonetta_special_s_kick_pre(fighter: &mut L2CFighterCommon
103149
false,
104150
false,
105151
false,
106-
(*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_S | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK) as u64,
152+
(*FIGHTER_LOG_MASK_FLAG_ATTACK_KIND_SPECIAL_S | *FIGHTER_LOG_MASK_FLAG_ACTION_CATEGORY_ATTACK | *FIGHTER_LOG_MASK_FLAG_ACTION_TRIGGER_ON) as u64,
107153
0,
108154
*FIGHTER_POWER_UP_ATTACK_BIT_SPECIAL_S as u32,
109155
0
@@ -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
}

0 commit comments

Comments
 (0)