Skip to content

Commit 0316bba

Browse files
Crawl Tilt
Added Crawl Tilt
1 parent cd44b5c commit 0316bba

File tree

5 files changed

+263
-7
lines changed

5 files changed

+263
-7
lines changed

fighters/duckhunt/src/acmd/smashes.rs

+89-4
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,98 @@ unsafe fn duckhunt_attack_hi4_game(fighter: &mut L2CAgentBase) {
1010
}
1111
frame(lua_state, 7.0);
1212
if is_excute(fighter) {
13-
WorkModule::set_int(boma, 5, *FIGHTER_DUCKHUNT_STATUS_ATTACK_INT_SMASH_DELAY_FRAME,);
14-
WorkModule::set_int(boma, 6, *FIGHTER_DUCKHUNT_STATUS_ATTACK_INT_SMASH_RETICLE_DISPLAY_FRAME,);
13+
WorkModule::set_int(
14+
boma,
15+
5,
16+
*FIGHTER_DUCKHUNT_STATUS_ATTACK_INT_SMASH_DELAY_FRAME,
17+
);
18+
WorkModule::set_int(
19+
boma,
20+
6,
21+
*FIGHTER_DUCKHUNT_STATUS_ATTACK_INT_SMASH_RETICLE_DISPLAY_FRAME,
22+
);
1523
FT_MOTION_RATE_RANGE(fighter, 17.0, 57.0, 28.0);
16-
ATTACK(fighter, /*ID*/ 0, /*Part*/ 0, /*Bone*/ Hash40::new("top"), /*Damage*/ 5.0, /*Angle*/ 127, /*KBG*/ 0, /*FKB*/ 0, /*BKB*/ 110, /*Size*/ 5.3, /*X*/ 0.0, /*Y*/ 6.0, /*Z*/ 9.0, /*X2*/ None, /*Y2*/ None, /*Z2*/ None, /*Hitlag*/ 1.0, /*SDI*/ 0.5, /*Clang_Rebound*/ *ATTACK_SETOFF_KIND_THRU, /*FacingRestrict*/ *ATTACK_LR_CHECK_POS, /*SetWeight*/ false, /*ShieldDamage*/ 0, /*Trip*/ 0.0, /*Rehit*/ 0, /*Reflectable*/ false, /*Absorbable*/ false, /*Flinchless*/ false, /*DisableHitlag*/ false, /*Direct_Hitbox*/ true, /*Ground_or_Air*/ *COLLISION_SITUATION_MASK_GA, /*Hitbits*/ *COLLISION_CATEGORY_MASK_ALL, /*CollisionPart*/ *COLLISION_PART_MASK_ALL, /*FriendlyFire*/ false, /*Effect*/ Hash40::new("collision_attr_fire"), /*SFXLevel*/ *ATTACK_SOUND_LEVEL_M, /*SFXType*/ *COLLISION_SOUND_ATTR_PUNCH, /*Type*/ *ATTACK_REGION_NONE,);
24+
ATTACK(
25+
fighter,
26+
/*ID*/ 0,
27+
/*Part*/ 0,
28+
/*Bone*/ Hash40::new("top"),
29+
/*Damage*/ 5.0,
30+
/*Angle*/ 127,
31+
/*KBG*/ 0,
32+
/*FKB*/ 0,
33+
/*BKB*/ 110,
34+
/*Size*/ 5.3,
35+
/*X*/ 0.0,
36+
/*Y*/ 6.0,
37+
/*Z*/ 9.0,
38+
/*X2*/ None,
39+
/*Y2*/ None,
40+
/*Z2*/ None,
41+
/*Hitlag*/ 1.0,
42+
/*SDI*/ 0.5,
43+
/*Clang_Rebound*/ *ATTACK_SETOFF_KIND_THRU,
44+
/*FacingRestrict*/ *ATTACK_LR_CHECK_POS,
45+
/*SetWeight*/ false,
46+
/*ShieldDamage*/ 0,
47+
/*Trip*/ 0.0,
48+
/*Rehit*/ 0,
49+
/*Reflectable*/ false,
50+
/*Absorbable*/ false,
51+
/*Flinchless*/ false,
52+
/*DisableHitlag*/ false,
53+
/*Direct_Hitbox*/ true,
54+
/*Ground_or_Air*/ *COLLISION_SITUATION_MASK_GA,
55+
/*Hitbits*/ *COLLISION_CATEGORY_MASK_ALL,
56+
/*CollisionPart*/ *COLLISION_PART_MASK_ALL,
57+
/*FriendlyFire*/ false,
58+
/*Effect*/ Hash40::new("collision_attr_fire"),
59+
/*SFXLevel*/ *ATTACK_SOUND_LEVEL_M,
60+
/*SFXType*/ *COLLISION_SOUND_ATTR_PUNCH,
61+
/*Type*/ *ATTACK_REGION_NONE,
62+
);
1763
}
1864
frame(lua_state, 15.0);
1965
if is_excute(fighter) {
20-
ATTACK(fighter, /*ID*/ 1, /*Part*/ 0, /*Bone*/ Hash40::new("top"), /*Damage*/ 11.5, /*Angle*/ 85, /*KBG*/ 120, /*FKB*/ 0, /*BKB*/ 50, /*Size*/ 9.3, /*X*/ 0.0, /*Y*/ 16.0, /*Z*/ 0.0, /*X2*/ None, /*Y2*/ None, /*Z2*/ None, /*Hitlag*/ 1.0, /*SDI*/ 1.0, /*Clang_Rebound*/ *ATTACK_SETOFF_KIND_THRU, /*FacingRestrict*/ *ATTACK_LR_CHECK_POS, /*SetWeight*/ false, /*ShieldDamage*/ 0, /*Trip*/ 0.0, /*Rehit*/ 0, /*Reflectable*/ false, /*Absorbable*/ false, /*Flinchless*/ false, /*DisableHitlag*/ false, /*Direct_Hitbox*/ true, /*Ground_or_Air*/ *COLLISION_SITUATION_MASK_GA, /*Hitbits*/ *COLLISION_CATEGORY_MASK_ALL, /*CollisionPart*/ *COLLISION_PART_MASK_ALL, /*FriendlyFire*/ false, /*Effect*/ Hash40::new("collision_attr_fire"), /*SFXLevel*/ *ATTACK_SOUND_LEVEL_L, /*SFXType*/ *COLLISION_SOUND_ATTR_KICK, /*Type*/ *ATTACK_REGION_NONE,);
66+
ATTACK(
67+
fighter,
68+
/*ID*/ 1,
69+
/*Part*/ 0,
70+
/*Bone*/ Hash40::new("top"),
71+
/*Damage*/ 11.5,
72+
/*Angle*/ 85,
73+
/*KBG*/ 120,
74+
/*FKB*/ 0,
75+
/*BKB*/ 50,
76+
/*Size*/ 9.3,
77+
/*X*/ 0.0,
78+
/*Y*/ 16.0,
79+
/*Z*/ 0.0,
80+
/*X2*/ None,
81+
/*Y2*/ None,
82+
/*Z2*/ None,
83+
/*Hitlag*/ 1.0,
84+
/*SDI*/ 1.0,
85+
/*Clang_Rebound*/ *ATTACK_SETOFF_KIND_THRU,
86+
/*FacingRestrict*/ *ATTACK_LR_CHECK_POS,
87+
/*SetWeight*/ false,
88+
/*ShieldDamage*/ 0,
89+
/*Trip*/ 0.0,
90+
/*Rehit*/ 0,
91+
/*Reflectable*/ false,
92+
/*Absorbable*/ false,
93+
/*Flinchless*/ false,
94+
/*DisableHitlag*/ false,
95+
/*Direct_Hitbox*/ true,
96+
/*Ground_or_Air*/ *COLLISION_SITUATION_MASK_GA,
97+
/*Hitbits*/ *COLLISION_CATEGORY_MASK_ALL,
98+
/*CollisionPart*/ *COLLISION_PART_MASK_ALL,
99+
/*FriendlyFire*/ false,
100+
/*Effect*/ Hash40::new("collision_attr_fire"),
101+
/*SFXLevel*/ *ATTACK_SOUND_LEVEL_L,
102+
/*SFXType*/ *COLLISION_SOUND_ATTR_KICK,
103+
/*Type*/ *ATTACK_REGION_NONE,
104+
);
21105
}
22106
}
23107

@@ -275,6 +359,7 @@ unsafe fn duckhunt_attack_lw4_game(fighter: &mut L2CAgentBase) {
275359
}
276360
}
277361

362+
278363
pub fn install() {
279364
install_acmd_scripts!(
280365
duckhunt_attack_hi4_game,

fighters/duckhunt/src/acmd/tilts.rs

+95
Original file line numberDiff line numberDiff line change
@@ -131,11 +131,106 @@ unsafe fn duckhunt_attack_lw3_game(fighter: &mut L2CAgentBase) {
131131

132132
}
133133

134+
// Squat Attack
135+
#[acmd_script( agent = "duckhunt", script = "game_attacksquats3" , category = ACMD_GAME , low_priority)]
136+
unsafe fn duckhunt_attack_squat_s3_game(fighter: &mut L2CAgentBase) {
137+
let lua_state = fighter.lua_state_agent;
138+
let boma = fighter.boma();
139+
frame(lua_state, 1.0);
140+
if is_excute(fighter) {
141+
FT_MOTION_RATE_RANGE(fighter, 1.0, 6.0, 7.0);
142+
}
143+
frame(lua_state, 6.0);
144+
if is_excute(fighter) {
145+
// Inside Hitbox
146+
ATTACK(fighter, 0, 0, Hash40::new("top"), 5.0, 60, 45, 0, 35, 3.5, 0.0, 1.0, 5.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 1, 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_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD);
147+
ATTACK(fighter, 1, 0, Hash40::new("top"), 5.0, 60, 45, 0, 35, 3.5, 0.0, 1.0, 10.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 1, 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_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_HEAD);
148+
// Tipper Hitbox
149+
ATTACK(fighter, 2, 0, Hash40::new("top"), 8.0, 70, 45, 0, 45, 4.5, 0.0, 1.0, 15.5, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, false, 1, 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_sting"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_HEAD);
150+
AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false);
151+
}
152+
frame(lua_state, 8.0);
153+
if is_excute(fighter) {
154+
AttackModule::clear_all(boma);
155+
}
156+
frame(lua_state, 21.0);
157+
if is_excute(fighter) {
158+
CancelModule::enable_cancel(fighter.boma());
159+
}
160+
}
161+
162+
#[acmd_script( agent = "duckhunt", script = "effect_attacksquats3" , category = ACMD_EFFECT , low_priority)]
163+
unsafe fn duckhunt_attack_squat_s3_effect(agent: &mut L2CAgentBase) {
164+
let lua_state = agent.lua_state_agent;
165+
let boma = agent.boma();
166+
frame(lua_state, 4.0);
167+
if is_excute(agent) {
168+
FOOT_EFFECT(agent, Hash40::new("sys_run_smoke"), Hash40::new("top"), -4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false);
169+
}
170+
frame(lua_state, 5.0);
171+
if is_excute(agent) {
172+
EFFECT_FOLLOW_FLIP(agent, Hash40::new("duckhunt_attack_line"), Hash40::new("duckhunt_attack_line"), Hash40::new("top"), 0, 0, 9, 0, 0, 0, 1, true, *EF_FLIP_YZ);
173+
EFFECT_FOLLOW_FLIP(agent, Hash40::new("sys_attack_line_b"), Hash40::new("sys_attack_line_b"), Hash40::new("top"), 0, 2, 3.5, 0, 0, 0, 0.8, true, *EF_FLIP_YZ);
174+
LAST_EFFECT_SET_COLOR(agent, 1, 0.941, 0.392);
175+
}
176+
}
177+
178+
#[acmd_script( agent = "duckhunt", script = "sound_attacksquats3" , category = ACMD_SOUND , low_priority)]
179+
unsafe fn duckhunt_attack_squat_s3_sound(agent: &mut L2CAgentBase) {
180+
let lua_state = agent.lua_state_agent;
181+
let boma = agent.boma();
182+
frame(lua_state, 1.0);
183+
if is_excute(agent) {
184+
PLAY_SE(agent, Hash40::new("se_duckhunt_appeal_s01"));
185+
PLAY_SE(agent, Hash40::new("se_duckhunt_appeal_s02"));
186+
}
187+
frame(lua_state, 4.0);
188+
if is_excute(agent) {
189+
PLAY_SE(agent, Hash40::new("se_duckhunt_attackhard_l01"));
190+
PLAY_SEQUENCE(agent, Hash40::new("seq_duckhunt_rnd_attack_duck"));
191+
}
192+
frame(lua_state, 8.0);
193+
if is_excute(agent) {
194+
PLAY_STATUS(agent, Hash40::new("se_duckhunt_appeal_s04"));
195+
}
196+
}
197+
198+
#[acmd_script( agent = "duckhunt", script = "expression_attacksquats3" , category = ACMD_EXPRESSION , low_priority)]
199+
unsafe fn duckhunt_attack_squat_s3_expression(agent: &mut L2CAgentBase) {
200+
let lua_state = agent.lua_state_agent;
201+
let boma = agent.boma();
202+
if is_excute(agent) {
203+
AttackModule::set_attack_reference_joint_id(boma, Hash40::new("top"), AttackDirectionAxis(*ATTACK_DIRECTION_Z), AttackDirectionAxis(*ATTACK_DIRECTION_Y), AttackDirectionAxis(*ATTACK_DIRECTION_X));
204+
slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE_INTP, *SLOPE_STATUS_TOP, 4);
205+
VisibilityModule::set_int64(boma, hash40("body") as i64, hash40("body_normal") as i64);
206+
}
207+
frame(lua_state, 1.0);
208+
if is_excute(agent) {
209+
VisibilityModule::set_int64(boma, hash40("body") as i64, hash40("body_openwing") as i64);
210+
}
211+
frame(lua_state, 3.0);
212+
if is_excute(agent) {
213+
ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitm"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32);
214+
}
215+
frame(lua_state, 5.0);
216+
if is_excute(agent) {
217+
RUMBLE_HIT(agent, Hash40::new("rbkind_attackm"), 0);
218+
}
219+
frame(lua_state, 22.0);
220+
if is_excute(agent) {
221+
VisibilityModule::set_int64(boma, hash40("body") as i64, hash40("body_normal") as i64);
222+
}
223+
}
224+
134225
pub fn install() {
135226
install_acmd_scripts!(
136227
duckhunt_attack_s3_hi_game,
137228
duckhunt_attack_s3_game,
138229
duckhunt_attack_s3_lw_game,
230+
duckhunt_attack_squat_s3_game,
231+
duckhunt_attack_squat_s3_effect,
232+
duckhunt_attack_squat_s3_sound,
233+
duckhunt_attack_squat_s3_expression,
139234
duckhunt_attack_hi3_game,
140235
duckhunt_attack_hi3_expression,
141236
duckhunt_attack_lw3_game,
+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
2+
use super::*;
3+
use globals::*;
4+
5+
6+
// FIGHTER_STATUS_KIND_ATTACK_S3
7+
8+
#[status_script(agent = "duckhunt", status = FIGHTER_STATUS_KIND_ATTACK_S3, condition = LUA_SCRIPT_STATUS_FUNC_STATUS_MAIN)]
9+
unsafe extern "C" fn attack_s3_main(fighter: &mut L2CFighterCommon) -> L2CValue {
10+
fighter.status_AttackS3Common();
11+
fighter.main_shift(attack_s3_main_loop)
12+
}
13+
14+
unsafe extern "C" fn attack_s3_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue {
15+
// <HDR>
16+
if fighter.is_motion(Hash40::new("attack_squat_s3"))
17+
&& MotionModule::is_end(fighter.module_accessor) {
18+
fighter.change_status_req(*FIGHTER_STATUS_KIND_SQUAT_WAIT, true);
19+
return 1.into();
20+
}
21+
// </HDR>
22+
23+
if fighter.status_AttackS3_Main().get_bool() {
24+
// <HDR>
25+
if StatusModule::status_kind_next(fighter.module_accessor) == *FIGHTER_STATUS_KIND_SQUAT {
26+
fighter.change_status_req(*FIGHTER_STATUS_KIND_SQUAT_WAIT, true);
27+
}
28+
// </HDR>
29+
return 1.into();
30+
}
31+
32+
// <HDR>
33+
if StatusModule::is_changing(fighter.module_accessor)
34+
&& fighter.stick_y() <= -0.4 {
35+
WorkModule::unable_transition_term_group_ex(fighter.module_accessor, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_SQUAT);
36+
MotionModule::change_motion(fighter.module_accessor, Hash40::new("attack_squat_s3"), 0.0, 1.0, false, 0.0, false, false);
37+
}
38+
39+
0.into()
40+
}
41+
42+
pub fn install() {
43+
install_status_scripts!(
44+
attack_s3_main
45+
);
46+
}

fighters/duckhunt/src/status/mod.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@ use super::*;
22

33
mod special_n;
44
mod special_s;
5-
5+
mod attacks3;
66

77
pub fn install() {
88
special_n::install();
99
special_s::install();
10-
}
10+
attacks3::install();
11+
}

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

+30-1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,35 @@ attack_lw3:
3131
attack_hi3:
3232
extra:
3333
cancel_frame: 31
34+
attack_squat_s3:
35+
game_script: game_attacksquats3
36+
flags:
37+
turn: false
38+
loop: false
39+
move: false
40+
fix_trans: false
41+
fix_rot: false
42+
fix_scale: false
43+
unk_40: false
44+
unk_80: true
45+
unk_100: false
46+
unk_200: false
47+
unk_400: false
48+
unk_800: false
49+
unk_1000: false
50+
unk_2000: false
51+
blend_frames: 0
52+
animations:
53+
- name: c07attacksquats3.nuanmb
54+
scripts:
55+
- expression_attacksquats3
56+
- sound_attacksquats3
57+
- effect_attacksquats3
58+
extra:
59+
intangible_start_frame: 0
60+
intangible_end_frame: 0
61+
cancel_frame: 27
62+
freeze_during_hitstop: false
3463
fall_aerial:
3564
blend_frames: 5
3665
fall_special:
@@ -55,4 +84,4 @@ catch_attack:
5584
cancel_frame: 0
5685
furafura_end:
5786
extra:
58-
cancel_frame: 10
87+
cancel_frame: 10

0 commit comments

Comments
 (0)