Skip to content

Commit a461daa

Browse files
authored
Merge branch 'dev' into roy-fair-and-others
2 parents acc64fe + 0edd364 commit a461daa

File tree

89 files changed

+2001
-1346
lines changed

Some content is hidden

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

89 files changed

+2001
-1346
lines changed

dynamic/src/consts.rs

+4
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,8 @@ pub mod vars {
287287

288288
pub const FLOAT_INHERIT_AERIAL: i32 = 0x1000;
289289

290+
pub const ENABLE_SPECIAL_WALLJUMP: i32 = 0x1050;
291+
290292
// ints
291293

292294
pub const DOWN_STAND_FB_KIND: i32 = 0x1000;
@@ -591,6 +593,7 @@ pub mod vars {
591593
// flags
592594
pub const SET_ATTACK: i32 = 0x1100;
593595
pub const SET_EFFECT: i32 = 0x1101;
596+
pub const REFLECTOR_CONTINUE: i32 = 0x1102;
594597

595598
// ints
596599
pub const SPECIAL_LW_STOP_Y_FRAME: i32 = 0x1100;
@@ -1653,6 +1656,7 @@ pub mod statuses {
16531656
pub mod falco {
16541657
pub const SPECIAL_LW_LOOP: i32 = 0x1e8;
16551658
pub const SPECIAL_LW_END: i32 = 0x1e9;
1659+
pub const SPECIAL_LW_HIT: i32 = 0x1ea;
16561660
}
16571661

16581662
pub mod gamewatch {

dynamic/src/ext.rs

+22-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::consts::globals::*;
1+
use crate::consts::{globals::*, vars};
22
use bitflags::bitflags;
33
use modular_bitfield::specifiers::*;
44
use smash::app::{
@@ -511,6 +511,8 @@ pub trait BomaExt {
511511
unsafe fn check_airdodge_cancel(&mut self) -> bool;
512512
// Checks for status and enables transition to dash
513513
unsafe fn check_dash_cancel(&mut self) -> bool;
514+
// Checks for status and enables transition to wall jump
515+
unsafe fn check_wall_jump_cancel(&mut self) -> bool;
514516

515517
/// check for hitfall (should be called once per frame)
516518
unsafe fn check_hitfall(&mut self);
@@ -1052,6 +1054,20 @@ impl BomaExt for BattleObjectModuleAccessor {
10521054
false
10531055
}
10541056

1057+
unsafe fn check_wall_jump_cancel(&mut self) -> bool {
1058+
if crate::VarModule::is_flag(self.object(), vars::common::instance::SPECIAL_WALL_JUMP) {
1059+
return false;
1060+
}
1061+
crate::VarModule::on_flag(self.object(), vars::common::status::ENABLE_SPECIAL_WALLJUMP);
1062+
let fighter = crate::util::get_fighter_common_from_accessor(self);
1063+
if fighter.sub_transition_group_check_air_wall_jump().get_bool() {
1064+
crate::VarModule::on_flag(self.object(), vars::common::instance::SPECIAL_WALL_JUMP);
1065+
return true;
1066+
}
1067+
crate::VarModule::off_flag(self.object(), vars::common::status::ENABLE_SPECIAL_WALLJUMP);
1068+
false
1069+
}
1070+
10551071
/// Sets the position of the front/red ledge-grab box (see [`set_center_cliff_hangdata`](BomaExt::set_center_cliff_hangdata) for more information)
10561072
///
10571073
/// # Arguments
@@ -1225,7 +1241,11 @@ impl BomaExt for BattleObjectModuleAccessor {
12251241
);
12261242
}
12271243

1228-
CancelModule::enable_cancel(self);
1244+
if self.motion_frame() >= 4.0
1245+
&& !CancelModule::is_enable_cancel(self) {
1246+
CancelModule::enable_cancel(self);
1247+
}
1248+
12291249
if self.is_situation(*SITUATION_KIND_AIR) {
12301250
let fighter = crate::util::get_fighter_common_from_accessor(self);
12311251
fighter.sub_air_check_fall_common();

fighters/chrom/src/acmd/specials.rs

+14-16
Original file line numberDiff line numberDiff line change
@@ -541,10 +541,10 @@ pub unsafe extern "C" fn game_specialhi1(agent: &mut L2CAgentBase) {
541541
ATTACK(agent, 1, 0, Hash40::new("top"), 6.0, 89, 100, 150, 0, 4.8, 0.0, 5.0, 8.0, None, None, None, 1.2, 2.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, 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_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD);
542542
ATTACK(agent, 2, 0, Hash40::new("top"), 6.0, 90, 100, 145, 0, 4.8, 0.0, 12.5, 8.0, None, None, None, 1.2, 2.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, 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_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD);
543543
ATTACK(agent, 3, 0, Hash40::new("top"), 6.0, 91, 100, 145, 0, 4.8, 0.0, 12.5, 16.0, None, None, None, 1.2, 2.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, 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_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD);
544-
AttackModule::set_vec_target_pos(boma, 0, Hash40::new("top"), &Vector2f::new(5.0, 60.0), 15, false);
545-
AttackModule::set_vec_target_pos(boma, 1, Hash40::new("top"), &Vector2f::new(5.0, 60.0), 15, false);
546-
AttackModule::set_vec_target_pos(boma, 2, Hash40::new("top"), &Vector2f::new(5.0, 60.0), 15, false);
547-
AttackModule::set_vec_target_pos(boma, 3, Hash40::new("top"), &Vector2f::new(5.0, 60.0), 15, false);
544+
AttackModule::set_vec_target_pos(boma, 0, Hash40::new("top"), &Vector2f::new(10.0, 55.0), 15, false);
545+
AttackModule::set_vec_target_pos(boma, 1, Hash40::new("top"), &Vector2f::new(10.0, 55.0), 15, false);
546+
AttackModule::set_vec_target_pos(boma, 2, Hash40::new("top"), &Vector2f::new(10.0, 55.0), 15, false);
547+
AttackModule::set_vec_target_pos(boma, 3, Hash40::new("top"), &Vector2f::new(10.0, 55.0), 15, false);
548548
AttackModule::set_no_damage_fly_smoke_all(boma, true, false);
549549
}
550550
frame(lua_state, 18.0);
@@ -657,11 +657,7 @@ pub unsafe extern "C" fn expression_specialhi2(agent: &mut L2CAgentBase) {
657657
}
658658

659659
pub unsafe extern "C" fn game_specialhi3start(agent: &mut L2CAgentBase) {
660-
let lua_state = agent.lua_state_agent;
661-
let boma = agent.boma();
662-
if is_excute(agent) {
663-
notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_NONE);
664-
}
660+
665661
}
666662

667663
pub unsafe extern "C" fn effect_specialhi3start(agent: &mut L2CAgentBase) {
@@ -695,10 +691,8 @@ pub unsafe extern "C" fn game_specialhi3(agent: &mut L2CAgentBase) {
695691
let lua_state = agent.lua_state_agent;
696692
let boma = agent.boma();
697693
if is_excute(agent) {
698-
ATTACK(agent, 0, 0, Hash40::new("rot"), 1.1, 365, 50, 85, 50, 10.0, 0.0, 2.0, 2.25, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 7, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD);
694+
ATTACK(agent, 0, 0, Hash40::new("rot"), 1.1, 366, 100, 85, 0, 10.0, 0.0, 2.0, 2.25, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 7, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD);
699695
ATTACK(agent, 1, 0, Hash40::new("rot"), 1.1, 20, 50, 125, 50, 10.0, 0.0, 2.0, 2.25, None, None, None, 0.5, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, true, 0, 0.0, 7, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD);
700-
AttackModule::set_add_reaction_frame(boma, 0, 3.0, false);
701-
AttackModule::set_add_reaction_frame(boma, 1, 3.0, false);
702696
AttackModule::set_no_damage_fly_smoke_all(boma, true, false);
703697
}
704698
frame(lua_state, 5.0);
@@ -756,11 +750,15 @@ pub unsafe extern "C" fn game_specialhi3_attack(agent: &mut L2CAgentBase) {
756750
if is_excute(agent){
757751
AttackModule::clear_all(boma);
758752
}
753+
frame(lua_state, 2.0);
754+
if is_excute(agent) {
755+
ATTACK(agent, 0, 0, Hash40::new("sword1"), 10.0, 361, 85, 0, 70, 3.8, 0.0, 0.0, 1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 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_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD);
756+
ATTACK(agent, 1, 0, Hash40::new("sword1"), 10.0, 361, 85, 0, 70, 3.2, 0.0, 0.0, 7.4, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 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_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD);
757+
ATTACK(agent, 2, 0, Hash40::new("hip"), 10.0, 361, 85, 0, 70, 5.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 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_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD);
758+
}
759759
frame(lua_state, 3.0);
760760
if is_excute(agent) {
761-
ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 361, 85, 0, 70, 9.0, 0.0, 10.0, 10.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 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_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD);
762-
ATTACK(agent, 1, 0, Hash40::new("sword1"), 10.0, 361, 85, 0, 70, 3.8, 0.0, 0.0, 1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 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_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD);
763-
ATTACK(agent, 2, 0, Hash40::new("sword1"), 10.0, 361, 85, 0, 70, 3.2, 0.0, 0.0, 7.4, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 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_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD);
761+
ATTACK(agent, 3, 0, Hash40::new("top"), 10.0, 361, 85, 0, 70, 9.0, 0.0, 10.0, 10.2, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 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_cutup"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_CHROM_HIT, *ATTACK_REGION_SWORD);
764762
}
765763
frame(lua_state, 6.0);
766764
if is_excute(agent){
@@ -806,7 +804,7 @@ pub unsafe extern "C" fn expression_specialhi3_attack(agent: &mut L2CAgentBase)
806804
if is_excute(agent) {
807805
ItemModule::set_have_item_visibility(boma, false, 0);
808806
}
809-
frame(lua_state, 3.0);
807+
frame(lua_state, 2.0);
810808
if is_excute(agent) {
811809
RUMBLE_HIT(agent, Hash40::new("rbkind_slashm"), 8);
812810
ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitm"), 5, false, *BATTLE_OBJECT_ID_INVALID as u32);

fighters/chrom/src/status/special_hi.rs

+12-5
Original file line numberDiff line numberDiff line change
@@ -239,9 +239,15 @@ pub unsafe extern "C" fn special_hi_end(fighter: &mut L2CFighterCommon) -> L2CVa
239239
}
240240

241241
pub unsafe extern "C" fn special_hi_exit(fighter: &mut L2CFighterCommon) -> L2CValue {
242-
fighter.clear_lua_stack();
243-
lua_args!(fighter, MA_MSC_CMD_EFFECT_AFTER_IMAGE_OFF, 0);
244-
sv_module_access::effect(fighter.lua_state_agent);
242+
if !(&[
243+
*FIGHTER_STATUS_KIND_SPECIAL_HI,
244+
*FIGHTER_ROY_STATUS_KIND_SPECIAL_HI_2,
245+
*FIGHTER_ROY_STATUS_KIND_SPECIAL_HI_3,
246+
statuses::chrom::SPECIAL_HI_FLIP,
247+
statuses::chrom::SPECIAL_HI_DIVE
248+
]).contains(&StatusModule::status_kind_next(fighter.module_accessor)) {
249+
EffectModule::remove_all_after_image(fighter.module_accessor, 0, 0);
250+
}
245251
WorkModule::inc_int(fighter.module_accessor, *FIGHTER_ROY_INSTANCE_WORK_ID_INT_SPECIAL_HI_CLIFF_NUM);
246252
0.into()
247253
}
@@ -252,7 +258,7 @@ pub unsafe extern "C" fn special_hi_2_pre(fighter: &mut L2CFighterCommon) -> L2C
252258
app::SituationKind(*SITUATION_KIND_AIR),
253259
*FIGHTER_KINETIC_TYPE_UNIQ,
254260
*GROUND_CORRECT_KIND_AIR as u32,
255-
app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_ALWAYS),
261+
app::GroundCliffCheckKind(*GROUND_CLIFF_CHECK_KIND_NONE),
256262
true,
257263
*FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_FLAG,
258264
*FIGHTER_STATUS_WORK_KEEP_FLAG_ALL_INT,
@@ -345,7 +351,6 @@ pub unsafe extern "C" fn special_hi_3_main(fighter: &mut L2CFighterCommon) -> L2
345351
let landing_frame = ParamModule::get_float(fighter.battle_object, ParamType::Agent, "param_special_hi.dive_landing_frame");
346352
WorkModule::set_float(fighter.module_accessor, landing_frame, *FIGHTER_INSTANCE_WORK_ID_FLOAT_LANDING_FRAME);
347353

348-
fighter.sub_fighter_cliff_check(L2CValue::I32(*GROUND_CLIFF_CHECK_KIND_ON_DROP));
349354
fighter.sub_shift_status_main(L2CValue::Ptr(special_hi_3_main_loop as *const () as _))
350355
}
351356

@@ -403,7 +408,9 @@ pub fn install(agent: &mut smashline::Agent) {
403408
agent.status(Init, statuses::chrom::SPECIAL_HI_FLIP, special_hi_2_init);
404409
agent.status(Main, statuses::chrom::SPECIAL_HI_FLIP, special_hi_2_main);
405410
agent.status(Exec, statuses::chrom::SPECIAL_HI_FLIP, special_hi_2_exec);
411+
agent.status(Exit, statuses::chrom::SPECIAL_HI_FLIP, special_hi_exit);
406412

413+
agent.status(Pre, statuses::chrom::SPECIAL_HI_DIVE, special_hi_2_pre);
407414
agent.status(Init, statuses::chrom::SPECIAL_HI_DIVE, special_hi_3_init);
408415
agent.status(Main, statuses::chrom::SPECIAL_HI_DIVE, special_hi_3_main);
409416
agent.status(CheckAttack, statuses::chrom::SPECIAL_HI_DIVE, special_hi_3_attack);

fighters/common/src/general_statuses/mod.rs

+34
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ fn nro_hook(info: &skyline::nro::NroInfo) {
114114
status_pre_landing_fall_special,
115115
sub_air_transition_group_check_air_attack_hook,
116116
sub_transition_group_check_air_lasso,
117+
sub_transition_group_check_air_wall_jump,
117118
sub_transition_group_check_ground_jump_mini_attack,
118119
change_status_jump_mini_attack,
119120
sub_transition_group_check_ground_attack,
@@ -243,6 +244,39 @@ unsafe fn sub_transition_group_check_air_lasso(fighter: &mut L2CFighterCommon) -
243244
return false.into();
244245
}
245246

247+
#[skyline::hook(replace = L2CFighterCommon_sub_transition_group_check_air_wall_jump)]
248+
unsafe fn sub_transition_group_check_air_wall_jump(fighter: &mut L2CFighterCommon) -> L2CValue {
249+
if fighter.global_table[0x31].get_bool() {
250+
let callable: extern "C" fn(&mut L2CFighterCommon) -> L2CValue = std::mem::transmute(fighter.global_table[0x31].get_ptr());
251+
if callable(fighter).get_bool() {
252+
return true.into();
253+
}
254+
}
255+
256+
// basic validity checks
257+
if fighter.global_table[SITUATION_KIND].get_i32() != *SITUATION_KIND_AIR {
258+
return false.into();
259+
}
260+
261+
// unused since we removed wall clings but y'know just in case
262+
let attach_wall_type = WorkModule::get_param_int(fighter.module_accessor, hash40("attach_wall_type"), 0);
263+
if attach_wall_type == *FIGHTER_ATTACH_WALL_TYPE_NORMAL
264+
&& fighter.sub_fighter_general_term_is_can_attach_wall().get_bool() {
265+
fighter.change_status(FIGHTER_STATUS_KIND_ATTACH_WALL.into(), true.into());
266+
return true.into();
267+
}
268+
269+
let wall_jump_type = WorkModule::get_param_int(fighter.module_accessor, hash40("wall_jump_type"), 0);
270+
if (wall_jump_type == *FIGHTER_WALL_JUMP_TYPE_NORMAL
271+
|| VarModule::is_flag(fighter.battle_object, vars::common::status::ENABLE_SPECIAL_WALLJUMP))
272+
&& fighter.sub_fighter_general_term_is_can_wall_jump().get_bool() {
273+
fighter.change_status(FIGHTER_STATUS_KIND_WALL_JUMP.into(), true.into());
274+
return true.into();
275+
}
276+
277+
return false.into();
278+
}
279+
246280
#[skyline::hook(replace = L2CFighterCommon_sub_transition_group_check_ground_jump_mini_attack)]
247281
unsafe fn sub_transition_group_check_ground_jump_mini_attack(fighter: &mut L2CFighterCommon) -> L2CValue {
248282
if fighter.global_table[SITUATION_KIND].get_i32() == *SITUATION_KIND_GROUND {

0 commit comments

Comments
 (0)