Skip to content

Commit 8ba0975

Browse files
committed
Kirb, but edgy
Added params are hardcoded for Kirby until they can be accessed in a better way (smashline-2)
1 parent 8598d95 commit 8ba0975

File tree

6 files changed

+221
-10
lines changed

6 files changed

+221
-10
lines changed

fighters/edge/src/status/edge_fire_fly.rs

+10-9
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use super::*;
22
use globals::*;
3-
use utils::consts::vars::edge;
43

54
#[status_script(agent = "edge_fire", status = WEAPON_EDGE_FIRE_STATUS_KIND_FLY_S, condition = LUA_SCRIPT_STATUS_FUNC_STATUS_MAIN)]
65
unsafe fn fly_s_main(fighter: &mut L2CWeaponCommon) -> L2CValue {
@@ -10,14 +9,15 @@ unsafe fn fly_s_main(fighter: &mut L2CWeaponCommon) -> L2CValue {
109
let owner_id = WorkModule::get_int(fighter.module_accessor, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER) as u32;
1110
let edge = utils::util::get_battle_object_from_id(owner_id);
1211
let stick_y = (&mut *(*edge).module_accessor).stick_y();
12+
let kirb = (&mut *(*edge).module_accessor).kind() == *FIGHTER_KIND_KIRBY;
1313
let facing = PostureModule::lr(fighter.module_accessor);
14-
let speed_x_stick_y_sub = ParamModule::get_float(edge, ParamType::Agent, "param_fire.speed_x_s_stick_y_sub") * stick_y.abs();
14+
let speed_x_stick_y_sub = if kirb { 0.3 } else { ParamModule::get_float(edge, ParamType::Agent, "param_fire.speed_x_s_stick_y_sub") * stick_y.abs() };
1515
let speed_x = WorkModule::get_param_float(fighter.module_accessor, hash40("param_fire"), hash40("speed_x_s")) * facing;
1616
let accel_x = WorkModule::get_param_float(fighter.module_accessor, hash40("param_fire"), hash40("accel_x_s")) * facing;
1717
let max_speed_x = WorkModule::get_param_float(fighter.module_accessor, hash40("param_fire"), hash40("max_speed_x_s")) - speed_x_stick_y_sub;
18-
let speed_y = ParamModule::get_float(edge, ParamType::Agent, "param_fire.speed_y_s") * stick_y;
19-
let accel_y = ParamModule::get_float(edge, ParamType::Agent, "param_fire.accel_y_s") * stick_y;
20-
let max_speed_y = ParamModule::get_float(edge, ParamType::Agent, "param_fire.max_speed_y_s");
18+
let speed_y = if kirb { 0.01 } else { ParamModule::get_float(edge, ParamType::Agent, "param_fire.speed_y_s") } * stick_y;
19+
let accel_y = if kirb { 1.0 } else { ParamModule::get_float(edge, ParamType::Agent, "param_fire.accel_y_s") } * stick_y;
20+
let max_speed_y = if kirb { 0.6 } else { ParamModule::get_float(edge, ParamType::Agent, "param_fire.max_speed_y_s") };
2121
sv_kinetic_energy!(set_speed, fighter, WEAPON_KINETIC_ENERGY_RESERVE_ID_NORMAL, speed_x, speed_y);
2222
sv_kinetic_energy!(set_accel, fighter, WEAPON_KINETIC_ENERGY_RESERVE_ID_NORMAL, accel_x, accel_y);
2323
sv_kinetic_energy!(set_limit_speed, fighter, WEAPON_KINETIC_ENERGY_RESERVE_ID_NORMAL, max_speed_x, max_speed_y);
@@ -37,14 +37,15 @@ unsafe fn fly_m_main(fighter: &mut L2CWeaponCommon) -> L2CValue {
3737
let owner_id = WorkModule::get_int(fighter.module_accessor, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER) as u32;
3838
let edge = utils::util::get_battle_object_from_id(owner_id);
3939
let stick_y = (&mut *(*edge).module_accessor).stick_y();
40+
let kirb = (&mut *(*edge).module_accessor).kind() == *FIGHTER_KIND_KIRBY;
4041
let facing = PostureModule::lr(fighter.module_accessor);
41-
let speed_x_stick_y_sub = ParamModule::get_float(edge, ParamType::Agent, "param_fire.speed_x_m_stick_y_sub") * stick_y.abs();
42+
let speed_x_stick_y_sub = if kirb { 0.3 } else { ParamModule::get_float(edge, ParamType::Agent, "param_fire.speed_x_m_stick_y_sub") } * stick_y.abs();
4243
let speed_x = WorkModule::get_param_float(fighter.module_accessor, hash40("param_fire"), hash40("speed_x_m")) * facing;
4344
let accel_x = WorkModule::get_param_float(fighter.module_accessor, hash40("param_fire"), hash40("accel_x_m")) * facing;
4445
let max_speed_x = WorkModule::get_param_float(fighter.module_accessor, hash40("param_fire"), hash40("max_speed_x_m")) - speed_x_stick_y_sub;
45-
let speed_y = ParamModule::get_float(edge, ParamType::Agent, "param_fire.speed_y_m") * stick_y;
46-
let accel_y = ParamModule::get_float(edge, ParamType::Agent, "param_fire.accel_y_m") * stick_y;
47-
let max_speed_y = ParamModule::get_float(edge, ParamType::Agent, "param_fire.max_speed_y_m");
46+
let speed_y = if kirb { 0.01 } else { ParamModule::get_float(edge, ParamType::Agent, "param_fire.speed_y_m") } * stick_y;
47+
let accel_y = if kirb { 1.0 } else { ParamModule::get_float(edge, ParamType::Agent, "param_fire.accel_y_m") } * stick_y;
48+
let max_speed_y = if kirb { 0.5 } else { ParamModule::get_float(edge, ParamType::Agent, "param_fire.max_speed_y_m") };
4849
sv_kinetic_energy!(set_speed, fighter, WEAPON_KINETIC_ENERGY_RESERVE_ID_NORMAL, speed_x, speed_y);
4950
sv_kinetic_energy!(set_accel, fighter, WEAPON_KINETIC_ENERGY_RESERVE_ID_NORMAL, accel_x, accel_y);
5051
sv_kinetic_energy!(set_limit_speed, fighter, WEAPON_KINETIC_ENERGY_RESERVE_ID_NORMAL, max_speed_x, max_speed_y);

fighters/edge/src/status/special_n.rs

-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use super::*;
22
use globals::*;
3-
use utils::consts::vars::edge;
43

54
#[status_script(agent = "edge", status = FIGHTER_STATUS_KIND_SPECIAL_N, condition = LUA_SCRIPT_STATUS_FUNC_STATUS_MAIN)]
65
unsafe fn special_n_main(fighter: &mut L2CFighterCommon) -> L2CValue {

fighters/kirby/src/acmd/copyspecials.rs

+83
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,86 @@ unsafe fn diddy_special_air_n_cancel_expression(fighter: &mut L2CAgentBase) {
6666
let boma = fighter.boma();
6767
}
6868

69+
#[acmd_script( agent = "kirby", scripts = ["game_edgespecialnstart", "game_edgespecialairnstart"] , category = ACMD_GAME , low_priority)]
70+
unsafe fn edge_special_n_start(fighter: &mut L2CAgentBase) {
71+
let lua_state = fighter.lua_state_agent;
72+
let boma = fighter.boma();
73+
frame(lua_state, 20.0);
74+
FT_MOTION_RATE_RANGE(fighter, 20.0, 32.0, 8.0);
75+
if is_excute(fighter) {
76+
WorkModule::set_int(boma, *FIGHTER_EDGE_SPECIAL_N_S, *FIGHTER_EDGE_STATUS_SPECIAL_N_WORK_INT_CHARGE_KIND);
77+
}
78+
frame(lua_state, 32.0);
79+
FT_MOTION_RATE_RANGE(fighter, 32.0, 79.0, 51.0);
80+
if is_excute(fighter) {
81+
WorkModule::set_int(boma, *FIGHTER_EDGE_SPECIAL_N_M, *FIGHTER_EDGE_STATUS_SPECIAL_N_WORK_INT_CHARGE_KIND);
82+
}
83+
frame(lua_state, 79.0);
84+
FT_MOTION_RATE(fighter, 1.2);
85+
frame(lua_state, 99.0);
86+
FT_MOTION_RATE(fighter, 1.0);
87+
frame(lua_state, 100.0);
88+
if is_excute(fighter) {
89+
WorkModule::set_int(boma, *FIGHTER_EDGE_SPECIAL_N_L, *FIGHTER_EDGE_STATUS_SPECIAL_N_WORK_INT_CHARGE_KIND);
90+
}
91+
frame(lua_state, 105.0);
92+
FT_MOTION_RATE(fighter, 1.6);
93+
frame(lua_state, 115.0);
94+
FT_MOTION_RATE(fighter, 1.0);
95+
frame(lua_state, 120.0);
96+
if is_excute(fighter) {
97+
ArticleModule::generate_article(boma, *FIGHTER_EDGE_GENERATE_ARTICLE_FIRE, false, -1);
98+
}
99+
frame(lua_state, 140.0);
100+
if is_excute(fighter) {
101+
WorkModule::on_flag(boma, *FIGHTER_EDGE_STATUS_SPECIAL_N_FLAG_ENABLE_FALL_SPEED);
102+
}
103+
}
104+
105+
#[acmd_script( agent = "kirby", scripts = ["game_edgespecialn1", "game_edgespecialairn1"] , category = ACMD_GAME , low_priority)]
106+
unsafe fn edge_special_n1_game(fighter: &mut L2CAgentBase) {
107+
let lua_state = fighter.lua_state_agent;
108+
let boma = fighter.boma();
109+
frame(lua_state, 1.0);
110+
FT_MOTION_RATE_RANGE(fighter, 1.0, 11.0, 13.0);
111+
frame(lua_state, 11.0);
112+
FT_MOTION_RATE(fighter, 1.0);
113+
frame(lua_state, 13.0);
114+
if is_excute(fighter) {
115+
ArticleModule::generate_article(boma, *FIGHTER_EDGE_GENERATE_ARTICLE_FIRE, false, 0);
116+
}
117+
frame(lua_state, 15.0);
118+
FT_MOTION_RATE_RANGE(fighter, 15.0, 35.0, 5.0);
119+
frame(lua_state, 35.0);
120+
FT_MOTION_RATE(fighter, 1.0);
121+
if is_excute(fighter) {
122+
WorkModule::on_flag(boma, *FIGHTER_EDGE_STATUS_SPECIAL_N_FLAG_ENABLE_FALL_SPEED);
123+
}
124+
125+
}
126+
127+
#[acmd_script( agent = "kirby", scripts = ["game_edgespecialn2", "game_edgespecialairn2"] , category = ACMD_GAME , low_priority)]
128+
unsafe fn edge_special_n2_game(fighter: &mut L2CAgentBase) {
129+
let lua_state = fighter.lua_state_agent;
130+
let boma = fighter.boma();
131+
frame(lua_state, 1.0);
132+
FT_MOTION_RATE_RANGE(fighter, 1.0, 11.0, 13.0);
133+
frame(lua_state, 11.0);
134+
FT_MOTION_RATE(fighter, 1.0);
135+
frame(lua_state, 13.0);
136+
if is_excute(fighter) {
137+
ArticleModule::generate_article(boma, *FIGHTER_EDGE_GENERATE_ARTICLE_FIRE, false, 0);
138+
}
139+
frame(lua_state, 35.0);
140+
FT_MOTION_RATE(fighter, 0.4);
141+
if is_excute(fighter) {
142+
WorkModule::on_flag(boma, *FIGHTER_EDGE_STATUS_SPECIAL_N_FLAG_ENABLE_FALL_SPEED);
143+
}
144+
frame(lua_state, 60.0);
145+
FT_MOTION_RATE(fighter, 1.0);
146+
147+
}
148+
69149
#[acmd_script( agent = "kirby", script = "game_ganonfloatstart" , category = ACMD_GAME , low_priority)]
70150
unsafe fn ganon_float_start_game(fighter: &mut L2CAgentBase) {
71151
let lua_state = fighter.lua_state_agent;
@@ -1678,6 +1758,9 @@ pub fn install() {
16781758
diddy_special_air_n_cancel_effect,
16791759
diddy_special_air_n_cancel_sound,
16801760
diddy_special_air_n_cancel_expression,
1761+
edge_special_n_start,
1762+
edge_special_n1_game,
1763+
edge_special_n2_game,
16811764
ganon_float_start_game,
16821765
ganon_float_start_effect,
16831766
ganon_float_start_expression,

fighters/kirby/src/status.rs

+2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ mod littlemac_special_n_cancel;
1313
mod diddy_special_n_cancel;
1414
mod lucas_special_n;
1515
mod sonic;
16+
mod edge_special_n;
1617

1718
pub fn install() {
1819
smashline::install_agent_init_callbacks!(kirby_init);
@@ -34,6 +35,7 @@ pub fn install() {
3435
mariod_special_n::install();
3536
lucas_special_n::install();
3637
sonic::install();
38+
edge_special_n::install();
3739
}
3840

3941
pub fn add_statuses() {
+114
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
use super::*;
2+
use globals::*;
3+
4+
#[status_script(agent = "kirby", status = FIGHTER_KIRBY_STATUS_KIND_EDGE_SPECIAL_N, condition = LUA_SCRIPT_STATUS_FUNC_STATUS_MAIN)]
5+
unsafe fn special_n_main(fighter: &mut L2CFighterCommon) -> L2CValue {
6+
fighter.sub_change_motion_by_situation(Hash40::new("edge_special_n_start").into(), Hash40::new("edge_special_air_n_start").into(), false.into());
7+
fighter.sub_set_special_start_common_kinetic_setting(hash40("param_special_n").into());
8+
special_hi_set_kinetics(fighter, true);
9+
WorkModule::set_int(fighter.module_accessor, *FIGHTER_EDGE_SPECIAL_N_NONE, *FIGHTER_EDGE_STATUS_SPECIAL_N_WORK_INT_CHARGE_KIND);
10+
WorkModule::off_flag(fighter.module_accessor, *FIGHTER_EDGE_STATUS_SPECIAL_N_FLAG_REQUEST_SHOOT);
11+
WorkModule::set_int(fighter.module_accessor, -1, *FIGHTER_EDGE_STATUS_SPECIAL_N_WORK_INT_CANCEL_STATUS);
12+
WorkModule::enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_GROUP_CHK_GROUND_GUARD);
13+
WorkModule::enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_GROUP_CHK_GROUND_JUMP);
14+
WorkModule::enable_transition_term(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_GROUP_CHK_AIR_ESCAPE);
15+
ControlModule::set_add_jump_mini_button_life(fighter.module_accessor, 8);
16+
fighter.main_shift(special_n_main_loop)
17+
}
18+
19+
unsafe extern "C" fn special_n_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue {
20+
if !StatusModule::is_changing(fighter.module_accessor) {
21+
fighter.sub_change_motion_by_situation(Hash40::new("edge_special_n_start").into(), Hash40::new("edge_special_air_n_start").into(), true.into());
22+
fighter.sub_exec_special_start_common_kinetic_setting(hash40("param_special_n").into());
23+
special_hi_set_kinetics(fighter, false);
24+
}
25+
if ControlModule::check_button_off(fighter.module_accessor, *CONTROL_PAD_BUTTON_SPECIAL) {
26+
println!("off");
27+
WorkModule::on_flag(fighter.module_accessor, *FIGHTER_EDGE_STATUS_SPECIAL_N_FLAG_REQUEST_SHOOT);
28+
}
29+
if WorkModule::is_flag(fighter.module_accessor, *FIGHTER_EDGE_STATUS_SPECIAL_N_FLAG_REQUEST_SHOOT) {
30+
println!("shoot request");
31+
println!("work: {}", WorkModule::get_int(fighter.module_accessor, *FIGHTER_EDGE_STATUS_SPECIAL_N_WORK_INT_CHARGE_KIND));
32+
println!("work?: {}", WorkModule::get_int(fighter.module_accessor, *FIGHTER_EDGE_STATUS_SPECIAL_N_WORK_INT_CHARGE_KIND) != *FIGHTER_EDGE_SPECIAL_N_NONE);
33+
if WorkModule::get_int(fighter.module_accessor, *FIGHTER_EDGE_STATUS_SPECIAL_N_WORK_INT_CHARGE_KIND) != *FIGHTER_EDGE_SPECIAL_N_NONE {
34+
println!("shoot");
35+
fighter.change_status(FIGHTER_KIRBY_STATUS_KIND_EDGE_SPECIAL_N_SHOOT.into(), false.into());
36+
return 0.into()
37+
}
38+
}
39+
if MotionModule::is_end(fighter.module_accessor) {
40+
let status = if fighter.is_situation(*SITUATION_KIND_GROUND) { *FIGHTER_STATUS_KIND_WAIT } else { *FIGHTER_STATUS_KIND_FALL };
41+
fighter.change_status(status.into(), false.into());
42+
}
43+
let cancel_start_frame = WorkModule::get_param_int(fighter.module_accessor, hash40("param_special_n"), hash40("cancel_start_frame"));
44+
if cancel_start_frame > fighter.status_frame() {
45+
if fighter.is_situation(*SITUATION_KIND_AIR) {
46+
let mut speed_y = KineticModule::get_sum_speed_y(fighter.module_accessor, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN);
47+
let unk1 = WorkModule::get_param_float(fighter.module_accessor, hash40("param_special_n"), 0x18ecc76f9d);
48+
if unk1 < speed_y {
49+
speed_y = unk1;
50+
}
51+
sv_kinetic_energy!(set_speed, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, speed_y);
52+
}
53+
}
54+
else {
55+
if fighter.sub_check_command_guard().get_bool() {
56+
if fighter.is_situation(*SITUATION_KIND_GROUND) {
57+
WorkModule::set_int(fighter.module_accessor, *FIGHTER_STATUS_KIND_GUARD_ON, *FIGHTER_EDGE_STATUS_SPECIAL_N_WORK_INT_CANCEL_STATUS);
58+
fighter.change_status(FIGHTER_KIRBY_STATUS_KIND_EDGE_SPECIAL_N_CANCEL.into(), false.into());
59+
return 1.into()
60+
}
61+
else {
62+
if !WorkModule::is_flag(fighter.module_accessor, *FIGHTER_INSTANCE_WORK_ID_FLAG_DISABLE_ESCAPE_AIR) {
63+
WorkModule::set_int(fighter.module_accessor, *FIGHTER_STATUS_KIND_ESCAPE_AIR, *FIGHTER_EDGE_STATUS_SPECIAL_N_WORK_INT_CANCEL_STATUS);
64+
fighter.change_status(FIGHTER_KIRBY_STATUS_KIND_EDGE_SPECIAL_N_CANCEL.into(), false.into());
65+
return 1.into()
66+
}
67+
}
68+
}
69+
else {
70+
if fighter.is_situation(*SITUATION_KIND_AIR) {
71+
if fighter.sub_check_jump_in_charging().get_bool() {
72+
WorkModule::set_int(fighter.module_accessor, *FIGHTER_STATUS_KIND_JUMP_AERIAL, *FIGHTER_EDGE_STATUS_SPECIAL_N_WORK_INT_CANCEL_STATUS);
73+
fighter.change_status(FIGHTER_KIRBY_STATUS_KIND_EDGE_SPECIAL_N_CANCEL.into(), true.into());
74+
}
75+
}
76+
else {
77+
if (fighter.is_cat_flag(Cat1::JumpButton) || (ControlModule::is_enable_flick_jump(fighter.module_accessor) && fighter.is_cat_flag(Cat1::Jump) && fighter.sub_check_button_frick().get_bool())) {
78+
WorkModule::set_int(fighter.module_accessor, *FIGHTER_STATUS_KIND_JUMP_SQUAT, *FIGHTER_EDGE_STATUS_SPECIAL_N_WORK_INT_CANCEL_STATUS);
79+
fighter.change_status(FIGHTER_KIRBY_STATUS_KIND_EDGE_SPECIAL_N_CANCEL.into(), true.into());
80+
}
81+
else {
82+
if fighter.is_cat_flag(Cat2::StickEscapeF) {
83+
WorkModule::set_int(fighter.module_accessor, *FIGHTER_STATUS_KIND_ESCAPE_F, *FIGHTER_EDGE_STATUS_SPECIAL_N_WORK_INT_CANCEL_STATUS);
84+
fighter.change_status(FIGHTER_KIRBY_STATUS_KIND_EDGE_SPECIAL_N_CANCEL.into(), true.into());
85+
}
86+
else if fighter.is_cat_flag(Cat2::StickEscapeB) {
87+
WorkModule::set_int(fighter.module_accessor, *FIGHTER_STATUS_KIND_ESCAPE_B, *FIGHTER_EDGE_STATUS_SPECIAL_N_WORK_INT_CANCEL_STATUS);
88+
fighter.change_status(FIGHTER_KIRBY_STATUS_KIND_EDGE_SPECIAL_N_CANCEL.into(), true.into());
89+
}
90+
}
91+
}
92+
}
93+
}
94+
95+
return 0.into()
96+
}
97+
98+
unsafe extern "C" fn special_hi_set_kinetics(fighter: &mut L2CFighterCommon, param_1: bool) {
99+
if fighter.is_situation(*SITUATION_KIND_AIR) {
100+
if !param_1 && fighter.is_prev_situation(*SITUATION_KIND_AIR) {
101+
return;
102+
}
103+
sv_kinetic_energy!(set_needs_set_param, fighter, FIGHTER_KINETIC_ENERGY_ID_GRAVITY, false);
104+
if KineticModule::is_enable_energy(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_CONTROL) {
105+
sv_kinetic_energy!(set_needs_set_param, fighter, FIGHTER_KINETIC_ENERGY_ID_CONTROL, false);
106+
}
107+
}
108+
}
109+
110+
pub fn install() {
111+
install_status_scripts!(
112+
special_n_main,
113+
);
114+
}

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

+12
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,18 @@ donkey_special_n_cancel:
412412
donkey_special_air_n_cancel:
413413
extra:
414414
cancel_frame: 9
415+
edge_special_n1:
416+
extra:
417+
cancel_frame: 46
418+
edge_special_air_n1:
419+
extra:
420+
cancel_frame: 46
421+
edge_special_n2:
422+
extra:
423+
cancel_frame: 60
424+
edge_special_air_n2:
425+
extra:
426+
cancel_frame: 60
415427
falco_special_n_end:
416428
extra:
417429
cancel_frame: 19

0 commit comments

Comments
 (0)