Skip to content

Commit e6be7ec

Browse files
authored
Merge pull request #2161 from HDR-Development/Ledges
Small Ledge Refactor
2 parents 812f6da + 15bddbb commit e6be7ec

File tree

7 files changed

+38
-30
lines changed

7 files changed

+38
-30
lines changed

dynamic/src/consts.rs

+6-4
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,8 @@ pub mod vars {
209209
pub const LEFT_STICK_FLICK_X: i32 = 0x000F;
210210
pub const LEFT_STICK_FLICK_Y: i32 = 0x0010;
211211

212+
pub const LEDGE_ID: i32 = 0x0011;
213+
212214
// floats
213215

214216
pub const LAST_ATTACK_DAMAGE_DEALT: i32 = 0x0000;
@@ -223,10 +225,10 @@ pub mod vars {
223225
pub const CURRENT_MOMENTUM_SPECIALS: i32 = 0x0007;
224226
pub const DOUBLE_JUMP_TIMER: i32 = 0x0008; // Only used by Lucas, and it's commented out, goes unused.
225227
pub const ROLL_SPEED: i32 = 0x0009;
226-
pub const LEDGE_POS: i32 = 0x000A;
227-
pub const LEDGE_POS_X: i32 = 0x000A;
228-
pub const LEDGE_POS_Y: i32 = 0x000B;
229-
pub const LEDGE_POS_Z: i32 = 0x000C;
228+
// pub const LEDGE_POS: i32 = 0x000A;
229+
// pub const LEDGE_POS_X: i32 = 0x000A;
230+
// pub const LEDGE_POS_Y: i32 = 0x000B;
231+
// pub const LEDGE_POS_Z: i32 = 0x000C;
230232
pub const GET_DIST_TO_FLOOR: i32 = 0x000D;
231233
pub const ECB_BOTTOM_Y_OFFSET: i32 = 0x000E;
232234
pub const CURR_DASH_SPEED: i32 = 0x000F;

fighters/common/src/function_hooks/change_status.rs

+6-8
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,16 @@ unsafe fn change_status_request_hook(boma: &mut BattleObjectModuleAccessor, stat
1010
if boma.is_status_one_of(&[*FIGHTER_STATUS_KIND_AIR_LASSO, *FIGHTER_STATUS_KIND_AIR_LASSO_REACH, *FIGHTER_STATUS_KIND_AIR_LASSO_HANG, *FIGHTER_STATUS_KIND_AIR_LASSO_REWIND])
1111
&& [*FIGHTER_STATUS_KIND_CLIFF_CATCH, *FIGHTER_STATUS_KIND_CLIFF_CATCH_MOVE, *FIGHTER_STATUS_KIND_CLIFF_WAIT].contains(&next_status) {
1212
let player_number = WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_ENTRY_ID) as u32;
13-
let pos = GroundModule::hang_cliff_pos_3f(boma);
13+
let cliff_id = GroundModule::get_cliff_id_uint32(boma);
1414

1515
for object_id in util::get_all_active_battle_object_ids() {
1616
let object = ::utils::util::get_battle_object_from_id(object_id);
1717
if !object.is_null() {
18-
if WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_ENTRY_ID) == WorkModule::get_int(&mut *(*object).module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_ENTRY_ID)
19-
|| VarModule::get_float(object, vars::common::instance::LEDGE_POS_X) == 0.0 {
18+
if WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_ENTRY_ID) == WorkModule::get_int(&mut *(*object).module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_ENTRY_ID) {
2019
continue;
2120
}
2221

23-
if pos.x == VarModule::get_float(object, vars::common::instance::LEDGE_POS_X) && pos.y == VarModule::get_float(object, vars::common::instance::LEDGE_POS_Y) {
22+
if VarModule::get_int(object, vars::common::instance::LEDGE_ID) == cliff_id as i32 {
2423
next_status = *FIGHTER_STATUS_KIND_CLIFF_ROBBED;
2524
}
2625
}
@@ -71,17 +70,16 @@ unsafe fn change_status_request_from_script_hook(boma: &mut BattleObjectModuleAc
7170
else if boma.is_status_one_of(&[*FIGHTER_STATUS_KIND_AIR_LASSO, *FIGHTER_STATUS_KIND_AIR_LASSO_REACH, *FIGHTER_STATUS_KIND_AIR_LASSO_HANG, *FIGHTER_STATUS_KIND_AIR_LASSO_REWIND])
7271
&& [*FIGHTER_STATUS_KIND_CLIFF_CATCH, *FIGHTER_STATUS_KIND_CLIFF_CATCH_MOVE, *FIGHTER_STATUS_KIND_CLIFF_WAIT].contains(&next_status) {
7372
let player_number = WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_ENTRY_ID) as u32;
74-
let pos = GroundModule::hang_cliff_pos_3f(boma);
73+
let cliff_id = GroundModule::get_cliff_id_uint32(boma);
7574

7675
for object_id in util::get_all_active_battle_object_ids() {
7776
let object = ::utils::util::get_battle_object_from_id(object_id);
7877
if !object.is_null() {
79-
if WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_ENTRY_ID) == WorkModule::get_int(&mut *(*object).module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_ENTRY_ID)
80-
|| VarModule::get_float(object, vars::common::instance::LEDGE_POS_X) == 0.0 {
78+
if WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_ENTRY_ID) == WorkModule::get_int(&mut *(*object).module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_ENTRY_ID) {
8179
continue;
8280
}
8381

84-
if pos.x == VarModule::get_float(object, vars::common::instance::LEDGE_POS_X) && pos.y == VarModule::get_float(object, vars::common::instance::LEDGE_POS_Y) {
82+
if VarModule::get_int(object, vars::common::instance::LEDGE_ID) == cliff_id as i32 {
8583
next_status = *FIGHTER_STATUS_KIND_CLIFF_ROBBED;
8684
}
8785
}

fighters/common/src/function_hooks/init_settings.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,10 @@ unsafe fn init_settings_hook(boma: &mut BattleObjectModuleAccessor, mut situatio
6767
if boma.is_status_one_of(&[
6868
*FIGHTER_STATUS_KIND_CLIFF_CATCH,
6969
*FIGHTER_STATUS_KIND_CLIFF_CATCH_MOVE,
70-
*FIGHTER_STATUS_KIND_CLIFF_WAIT]) {
71-
VarModule::set_vec3(boma.object(), vars::common::instance::LEDGE_POS, GroundModule::hang_cliff_pos_3f(boma));
70+
*FIGHTER_STATUS_KIND_CLIFF_WAIT]
71+
) {
72+
let cliff_id = GroundModule::get_cliff_id_uint32(boma);
73+
VarModule::set_int(boma.object(), vars::common::instance::LEDGE_ID, cliff_id as i32);
7274
}
7375

7476
// heavy item pickup should keep momentum and be affected by gravity in the air

fighters/common/src/function_hooks/ledges.rs

+4-6
Original file line numberDiff line numberDiff line change
@@ -45,17 +45,16 @@ unsafe fn can_entry_cliff_hook(boma: &mut BattleObjectModuleAccessor) -> u64 {
4545

4646

4747
// Ledgehog code
48-
let pos = GroundModule::hang_cliff_pos_3f(boma);
48+
let cliff_id = GroundModule::get_cliff_id_uint32(boma);
4949
let entry_id = WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_ENTRY_ID) as u32;
5050
for object_id in util::get_all_active_battle_object_ids() {
5151
let object = ::utils::util::get_battle_object_from_id(object_id);
5252
if !object.is_null() {
53-
if WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_ENTRY_ID) == WorkModule::get_int(&mut *(*object).module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_ENTRY_ID)
54-
|| VarModule::get_float(object, vars::common::instance::LEDGE_POS_X) == 0.0 {
53+
if WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_ENTRY_ID) == WorkModule::get_int(&mut *(*object).module_accessor, *FIGHTER_INSTANCE_WORK_ID_INT_ENTRY_ID) {
5554
continue;
5655
}
5756

58-
if pos.x == VarModule::get_float(object, vars::common::instance::LEDGE_POS_X) && pos.y == VarModule::get_float(object, vars::common::instance::LEDGE_POS_Y) {
57+
if VarModule::get_int(object, vars::common::instance::LEDGE_ID) == cliff_id as i32 {
5958
if !((tether_zair || tether_special || tether_aerial) && WorkModule::is_flag(boma, *FIGHTER_STATUS_AIR_LASSO_FLAG_CHECK)) {
6059
return 0;
6160
}
@@ -95,8 +94,7 @@ unsafe fn can_entry_cliff_hook(boma: &mut BattleObjectModuleAccessor) -> u64 {
9594
//=================================================================
9695
#[skyline::hook(replace=GroundModule::leave_cliff)]
9796
unsafe fn leave_cliff_hook(boma: &mut BattleObjectModuleAccessor) -> u64 {
98-
let entry_id = WorkModule::get_int(boma, *FIGHTER_INSTANCE_WORK_ID_INT_ENTRY_ID) as usize;
99-
VarModule::set_vec3(boma.object(), vars::common::instance::LEDGE_POS, Vector3f {x: 0.0, y: 0.0, z: 0.0});
97+
VarModule::set_int(boma.object(), vars::common::instance::LEDGE_ID, -1);
10098
original!()(boma)
10199
}
102100

fighters/common/src/general_statuses/cliff.rs

+9-9
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ unsafe fn status_CliffCatchMove(fighter: &mut L2CFighterCommon) -> L2CValue {
3737
#[skyline::hook(replace = smash::lua2cpp::L2CFighterCommon_status_end_CliffCatchMove)]
3838
unsafe fn status_end_CliffCatchMove(fighter: &mut L2CFighterCommon) -> L2CValue {
3939
if StatusModule::status_kind_next(fighter.module_accessor) != *FIGHTER_STATUS_KIND_CLIFF_CATCH {
40-
VarModule::set_vec3(fighter.object(), vars::common::instance::LEDGE_POS, Vector3f {x: 0.0, y: 0.0, z: 0.0});
40+
VarModule::set_int(fighter.object(), vars::common::instance::LEDGE_ID, -1);
4141
HitModule::set_xlu_frame_global(fighter.module_accessor, 0, 0);
4242
}
4343
call_original!(fighter)
@@ -46,7 +46,7 @@ unsafe fn status_end_CliffCatchMove(fighter: &mut L2CFighterCommon) -> L2CValue
4646
#[skyline::hook(replace = smash::lua2cpp::L2CFighterCommon_status_end_CliffCatch)]
4747
unsafe fn status_end_CliffCatch(fighter: &mut L2CFighterCommon) -> L2CValue {
4848
if StatusModule::status_kind_next(fighter.module_accessor) != *FIGHTER_STATUS_KIND_CLIFF_WAIT {
49-
VarModule::set_vec3(fighter.object(), vars::common::instance::LEDGE_POS, Vector3f {x: 0.0, y: 0.0, z: 0.0});
49+
VarModule::set_int(fighter.object(), vars::common::instance::LEDGE_ID, -1);
5050
}
5151
call_original!(fighter)
5252
}
@@ -57,48 +57,48 @@ unsafe fn status_end_CliffWait(fighter: &mut L2CFighterCommon) -> L2CValue {
5757
*FIGHTER_STATUS_KIND_CLIFF_CLIMB,
5858
*FIGHTER_STATUS_KIND_CLIFF_ESCAPE,
5959
*FIGHTER_STATUS_KIND_CLIFF_JUMP1].contains(&StatusModule::status_kind_next(fighter.module_accessor)) {
60-
VarModule::set_vec3(fighter.object(), vars::common::instance::LEDGE_POS, Vector3f {x: 0.0, y: 0.0, z: 0.0});
60+
VarModule::set_int(fighter.object(), vars::common::instance::LEDGE_ID, -1);
6161
}
6262
call_original!(fighter)
6363
}
6464

6565
#[skyline::hook(replace = smash::lua2cpp::L2CFighterCommon_status_end_CliffAttack)]
6666
unsafe fn status_end_CliffAttack(fighter: &mut L2CFighterCommon) -> L2CValue {
67-
VarModule::set_vec3(fighter.object(), vars::common::instance::LEDGE_POS, Vector3f {x: 0.0, y: 0.0, z: 0.0});
67+
VarModule::set_int(fighter.object(), vars::common::instance::LEDGE_ID, -1);
6868
call_original!(fighter)
6969
}
7070

7171
#[skyline::hook(replace = smash::lua2cpp::L2CFighterCommon_status_end_CliffClimb)]
7272
unsafe fn status_end_CliffClimb(fighter: &mut L2CFighterCommon) -> L2CValue {
73-
VarModule::set_vec3(fighter.object(), vars::common::instance::LEDGE_POS, Vector3f {x: 0.0, y: 0.0, z: 0.0});
73+
VarModule::set_int(fighter.object(), vars::common::instance::LEDGE_ID, -1);
7474
call_original!(fighter)
7575
}
7676

7777
#[skyline::hook(replace = smash::lua2cpp::L2CFighterCommon_status_end_CliffEscape)]
7878
unsafe fn status_end_CliffEscape(fighter: &mut L2CFighterCommon) -> L2CValue {
79-
VarModule::set_vec3(fighter.object(), vars::common::instance::LEDGE_POS, Vector3f {x: 0.0, y: 0.0, z: 0.0});
79+
VarModule::set_int(fighter.object(), vars::common::instance::LEDGE_ID, -1);
8080
call_original!(fighter)
8181
}
8282

8383
#[skyline::hook(replace = smash::lua2cpp::L2CFighterCommon_status_end_CliffJump1)]
8484
unsafe fn status_end_CliffJump1(fighter: &mut L2CFighterCommon) -> L2CValue {
8585
if StatusModule::status_kind_next(fighter.module_accessor) != *FIGHTER_STATUS_KIND_CLIFF_JUMP2 {
86-
VarModule::set_vec3(fighter.object(), vars::common::instance::LEDGE_POS, Vector3f {x: 0.0, y: 0.0, z: 0.0});
86+
VarModule::set_int(fighter.object(), vars::common::instance::LEDGE_ID, -1);
8787
}
8888
call_original!(fighter)
8989
}
9090

9191
#[skyline::hook(replace = smash::lua2cpp::L2CFighterCommon_status_end_CliffJump2)]
9292
unsafe fn status_end_CliffJump2(fighter: &mut L2CFighterCommon) -> L2CValue {
9393
if StatusModule::status_kind_next(fighter.module_accessor) != *FIGHTER_STATUS_KIND_CLIFF_JUMP3 {
94-
VarModule::set_vec3(fighter.object(), vars::common::instance::LEDGE_POS, Vector3f {x: 0.0, y: 0.0, z: 0.0});
94+
VarModule::set_int(fighter.object(), vars::common::instance::LEDGE_ID, -1);
9595
}
9696
call_original!(fighter)
9797
}
9898

9999
#[skyline::hook(replace = smash::lua2cpp::L2CFighterCommon_status_end_CliffJump3)]
100100
unsafe fn status_end_CliffJump3(fighter: &mut L2CFighterCommon) -> L2CValue {
101-
VarModule::set_vec3(fighter.object(), vars::common::instance::LEDGE_POS, Vector3f {x: 0.0, y: 0.0, z: 0.0});
101+
VarModule::set_int(fighter.object(), vars::common::instance::LEDGE_ID, -1);
102102
call_original!(fighter)
103103
}
104104

fighters/common/src/lib.rs

+8
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ pub mod function_hooks;
2828
pub mod shoto_status;
2929
// pub mod tag;
3030

31+
#[smashline::fighter_init]
32+
fn common_init(fighter: &mut L2CFighterCommon) {
33+
VarModule::set_int(fighter.battle_object, vars::common::instance::LEDGE_ID, -1);
34+
}
3135

3236
pub fn install() {
3337
djc::install();
@@ -36,4 +40,8 @@ pub fn install() {
3640
general_statuses::install();
3741
function_hooks::install();
3842
opff::install();
43+
44+
smashline::install_agent_init_callbacks!(
45+
common_init
46+
);
3947
}

fighters/common/src/opff/ledges.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ unsafe fn occupy_ledge(boma: &mut BattleObjectModuleAccessor, status_kind: i32,
4141
*FIGHTER_STATUS_KIND_CLIFF_JUMP2,
4242
*FIGHTER_STATUS_KIND_CLIFF_JUMP3])
4343
&& MotionModule::frame(boma) > (FighterMotionModuleImpl::get_cancel_frame(boma, Hash40::new_raw(MotionModule::motion_kind(boma)), true) * 0.9) {
44-
VarModule::set_vec3(boma.object(), vars::common::instance::LEDGE_POS, Vector3f {x: 0.0, y: 0.0, z: 0.0});
44+
VarModule::set_int(boma.object(), vars::common::instance::LEDGE_ID, -1);
4545
}
4646
}
4747

0 commit comments

Comments
 (0)