diff --git a/Cargo.lock b/Cargo.lock
index f3a477ca62..2b92a990d0 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -5,7 +5,7 @@ version = 3
[[package]]
name = "acmd-engine"
version = "0.1.0"
-source = "git+https://github.com/HDR-Development/smashline#f45fcf6d05314686d2c48e39fe3af7e0613a70ec"
+source = "git+https://github.com/HDR-Development/smashline#3ad6eccb0739de4d52c23cf204245ed68b73a81b"
dependencies = [
"hash40 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
"locks",
@@ -57,9 +57,9 @@ checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"
[[package]]
name = "autocfg"
-version = "1.1.0"
+version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80"
[[package]]
name = "bayonetta"
@@ -250,7 +250,7 @@ version = "0.1.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e"
dependencies = [
- "getrandom 0.2.12",
+ "getrandom 0.2.14",
"once_cell",
"tiny-keccak",
]
@@ -521,9 +521,9 @@ dependencies = [
[[package]]
name = "getrandom"
-version = "0.2.12"
+version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5"
+checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c"
dependencies = [
"cfg-if 1.0.0",
"libc",
@@ -753,9 +753,9 @@ dependencies = [
[[package]]
name = "indexmap"
-version = "2.2.5"
+version = "2.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4"
+checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26"
dependencies = [
"equivalent",
"hashbrown 0.14.3",
@@ -789,9 +789,9 @@ checksum = "d3b7357d2bbc5ee92f8e899ab645233e43d21407573cceb37fed8bc3dede2c02"
[[package]]
name = "itoa"
-version = "1.0.10"
+version = "1.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c"
+checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
[[package]]
name = "jack"
@@ -940,8 +940,8 @@ dependencies = [
[[package]]
name = "locks"
-version = "1.2.5"
-source = "git+https://github.com/HDR-Development/smashline#f45fcf6d05314686d2c48e39fe3af7e0613a70ec"
+version = "1.2.6"
+source = "git+https://github.com/HDR-Development/smashline#3ad6eccb0739de4d52c23cf204245ed68b73a81b"
dependencies = [
"skyline 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
@@ -1066,9 +1066,9 @@ dependencies = [
[[package]]
name = "memchr"
-version = "2.7.1"
+version = "2.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149"
+checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d"
[[package]]
name = "memoffset"
@@ -1407,7 +1407,7 @@ dependencies = [
"phf_shared",
"proc-macro2",
"quote",
- "syn 2.0.53",
+ "syn 2.0.58",
]
[[package]]
@@ -1909,14 +1909,14 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.53",
+ "syn 2.0.58",
]
[[package]]
name = "serde_json"
-version = "1.0.114"
+version = "1.0.115"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0"
+checksum = "12dc5c46daa8e9fdf4f5e71b6cf9a53f2487da0e86e55808e2d35539666497dd"
dependencies = [
"itoa",
"ryu 1.0.17",
@@ -1934,11 +1934,11 @@ dependencies = [
[[package]]
name = "serde_yaml"
-version = "0.9.33"
+version = "0.9.34+deprecated"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a0623d197252096520c6f2a5e1171ee436e5af99a5d7caa2891e55e61950e6d9"
+checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47"
dependencies = [
- "indexmap 2.2.5",
+ "indexmap 2.2.6",
"itoa",
"ryu 1.0.17",
"serde",
@@ -2123,7 +2123,7 @@ dependencies = [
[[package]]
name = "smashline"
version = "0.1.0"
-source = "git+https://github.com/HDR-Development/smashline#f45fcf6d05314686d2c48e39fe3af7e0613a70ec"
+source = "git+https://github.com/HDR-Development/smashline#3ad6eccb0739de4d52c23cf204245ed68b73a81b"
dependencies = [
"acmd-engine",
"locks",
@@ -2135,7 +2135,7 @@ dependencies = [
[[package]]
name = "smashline-macro"
version = "0.1.0"
-source = "git+https://github.com/HDR-Development/smashline#f45fcf6d05314686d2c48e39fe3af7e0613a70ec"
+source = "git+https://github.com/HDR-Development/smashline#3ad6eccb0739de4d52c23cf204245ed68b73a81b"
dependencies = [
"proc-macro-crate",
"proc-macro-error",
@@ -2186,9 +2186,9 @@ dependencies = [
[[package]]
name = "syn"
-version = "2.0.53"
+version = "2.0.58"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7383cd0e49fff4b6b90ca5670bfd3e9d6a733b3f90c686605aa7eec8c4996032"
+checksum = "44cfb93f38070beee36b3fef7d4f5a16f27751d94b187b666a5cc5e9b0d30687"
dependencies = [
"proc-macro2",
"quote",
@@ -2234,7 +2234,7 @@ checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.53",
+ "syn 2.0.58",
]
[[package]]
@@ -2273,7 +2273,7 @@ version = "0.19.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
dependencies = [
- "indexmap 2.2.5",
+ "indexmap 2.2.6",
"serde",
"serde_spanned",
"toml_datetime",
@@ -2378,7 +2378,7 @@ version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0"
dependencies = [
- "getrandom 0.2.12",
+ "getrandom 0.2.14",
]
[[package]]
diff --git a/dynamic/src/consts.rs b/dynamic/src/consts.rs
index 9af6aa14d1..afc52c6012 100644
--- a/dynamic/src/consts.rs
+++ b/dynamic/src/consts.rs
@@ -981,6 +981,10 @@ pub mod vars {
pub const UP_SPECIAL_FREEFALL: i32 = 0x0100;
pub const SPECIAL_N_LAND_CANCEL: i32 = 0x0101;
}
+ pub mod status {
+ // flags
+ pub const D_TILT_JUMP_BUFFER: i32 = 0x1150;
+ }
}
pub mod rockman {
diff --git a/fighters/richter/src/acmd/aerials.rs b/fighters/richter/src/acmd/aerials.rs
index beb6d00ff0..c6238f5ee6 100644
--- a/fighters/richter/src/acmd/aerials.rs
+++ b/fighters/richter/src/acmd/aerials.rs
@@ -250,15 +250,15 @@ unsafe extern "C" fn game_attackairb(agent: &mut L2CAgentBase) {
}
frame(lua_state, 13.0);
if is_excute(agent) {
- ATTACK(agent, 0, 0, Hash40::new("top"), 13.0, 361, 90, 0, 35, 3.0, 0.0, 12.4, -5.6, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, 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_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH);
- ATTACK(agent, 1, 0, Hash40::new("top"), 13.0, 361, 90, 0, 35, 3.5, 0.0, 10.0, -8.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, 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_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH);
- ATTACK(agent, 2, 0, Hash40::new("top"), 15.0, 361, 90, 0, 35, 4.5, 0.0, 7.9, -14.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, 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_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH);
+ ATTACK(agent, 0, 0, Hash40::new("top"), 13.0, 361, 90, 0, 35, 3.5, 0.0, 11.4, -4.4, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, 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_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH);
+ ATTACK(agent, 1, 0, Hash40::new("top"), 13.0, 361, 90, 0, 35, 3.8, 0.0, 9.4, -8.4, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, 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_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH);
+ ATTACK(agent, 2, 0, Hash40::new("top"), 15.0, 361, 90, 0, 35, 4.9, 0.0, 7.1, -13.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, 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_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH);
}
frame(lua_state, 16.0);
if is_excute(agent) {
- ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 361, 90, 0, 35, 2.5, 0.0, 12.4, -5.6, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, 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_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH);
- ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 361, 90, 0, 35, 3.0, 0.0, 10.0, -8.8, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, 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_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH);
- ATTACK(agent, 2, 0, Hash40::new("top"), 10.0, 361, 90, 0, 35, 3.5, 0.0, 7.9, -14.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, 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_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH);
+ ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 361, 90, 0, 35, 3.2, 0.0, 11.4, -4.4, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, 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_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH);
+ ATTACK(agent, 1, 0, Hash40::new("top"), 10.0, 361, 90, 0, 35, 3.5, 0.0, 9.4, -8.4, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, 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_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH);
+ ATTACK(agent, 2, 0, Hash40::new("top"), 10.0, 361, 90, 0, 35, 4.0, 0.0, 7.1, -13.7, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_POS, 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_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH);
}
frame(lua_state, 22.0);
if is_excute(agent) {
@@ -279,13 +279,13 @@ unsafe extern "C" fn effect_attackairb(agent: &mut L2CAgentBase) {
}
frame(lua_state, 14.0);
if is_excute(agent) {
- EFFECT_FOLLOW_ALPHA(agent, Hash40::new("sys_attack_speedline"), Hash40::new("top"), -1, 12, -5.7, -216, 9, 0, 0.5, true, 0.8);
+ EFFECT_FOLLOW_ALPHA(agent, Hash40::new("sys_attack_speedline"), Hash40::new("top"), -1, 11.4, -5.7, -213, 9, 0, 0.65, true, 1.0);
LAST_EFFECT_SET_RATE(agent, 1.0);
LAST_EFFECT_SET_COLOR(agent, 0.769, 0.769, 0.769);
}
frame(lua_state, 14.0);
if is_excute(agent) {
- EFFECT_FOLLOW_ALPHA(agent, Hash40::new("sys_attack_impact"), Hash40::new("top"), 0, 7.4, -13.9, 0, 0, 0, 1.0, true, 0.9);
+ EFFECT_FOLLOW_ALPHA(agent, Hash40::new("sys_attack_impact"), Hash40::new("top"), 0, 7.2, -13.9, 0, 0, 0, 1.0, true, 1.0);
LAST_EFFECT_SET_COLOR(agent, 0.769, 0.769, 0.769);
}
}
@@ -317,6 +317,15 @@ unsafe extern "C" fn expression_attackairb(agent: &mut L2CAgentBase) {
}
}
+unsafe extern "C" fn effect_landingairb(agent: &mut L2CAgentBase) {
+ let lua_state = agent.lua_state_agent;
+ let boma = agent.boma();
+ if is_excute(agent) {
+ EffectModule::kill_kind(boma, Hash40::new("sys_attack_impact"), true, true);
+ EffectModule::kill_kind(boma, Hash40::new("sys_attack_speedline"), true, true);
+ }
+}
+
unsafe extern "C" fn game_attackairhi(agent: &mut L2CAgentBase) {
let lua_state = agent.lua_state_agent;
let boma = agent.boma();
@@ -344,9 +353,9 @@ unsafe extern "C" fn effect_attackairhi(agent: &mut L2CAgentBase) {
let boma = agent.boma();
frame(lua_state, 6.0);
if is_excute(agent) {
- EFFECT_FOLLOW(agent, Hash40::new("sys_attack_arc_d"), Hash40::new("top"), 0, 11.5, 1.5, 0, 60, 90, 0.85, true);
+ EFFECT_FOLLOW(agent, Hash40::new("sys_attack_arc_d"), Hash40::new("top"), 0, 11.5, 1.1, 0, 60, 90, 0.80, true);
LAST_EFFECT_SET_COLOR(agent, 0.902, 0.784, 0.333);
- LAST_EFFECT_SET_RATE(agent, 1.0);
+ LAST_EFFECT_SET_RATE(agent, 1.2);
}
frame(lua_state, 14.0);
if is_excute(agent) {
@@ -390,6 +399,11 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) {
frame(lua_state, 4.0);
if is_excute(agent) {
WorkModule::on_flag(boma, *FIGHTER_STATUS_ATTACK_AIR_FLAG_ENABLE_LANDING);
+ FT_MOTION_RATE(agent, 0.5);
+ }
+ frame(lua_state, 5.0);
+ if is_excute(agent) {
+ FT_MOTION_RATE(agent, 1.0);
}
frame(lua_state, 15.0);
if is_excute(agent) {
@@ -401,14 +415,24 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) {
frame(lua_state, 16.0);
if is_excute(agent) {
/* Ground-only */
- ATTACK(agent, 0, 0, Hash40::new("top"), 12.0, 280, 85, 0, 35, 5.5, 0.0, 1.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK);
+ ATTACK(agent, 0, 0, Hash40::new("legl"), 12.0, 280, 85, 0, 35, 3.4, 0.0, -0.2, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK);
+ ATTACK(agent, 1, 0, Hash40::new("kneel"), 12.0, 280, 85, 0, 35, 3.2, 0.0, -0.5, 0.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK);
+ ATTACK(agent, 2, 0, Hash40::new("footl"), 12.0, 280, 85, 0, 35, 2.9, 0.0, 0.0, -0.1, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK);
/* Air-only */
- ATTACK(agent, 1, 0, Hash40::new("top"), 12.0, 280, 53, 0, 35, 5.5, 0.0, 0.0, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK);
+ ATTACK(agent, 3, 0, Hash40::new("legl"), 12.0, 280, 53, 0, 35, 3.4, 0.0, -0.2, 0.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK);
+ ATTACK(agent, 4, 0, Hash40::new("kneel"), 12.0, 280, 53, 0, 35, 3.2, 0.0, -0.5, 0.5, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK);
+ ATTACK(agent, 5, 0, Hash40::new("footl"), 12.0, 280, 53, 0, 35, 2.9, 0.0, 0.0, -0.1, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 0, 0.0, 0, false, false, false, false, true, *COLLISION_SITUATION_MASK_A, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK);
+
}
wait(lua_state, 2.0);
if is_excute(agent) {
- AttackModule::clear(boma, 1, false);
- ATTACK(agent, 0, 0, Hash40::new("top"), 9.0, 72, 55, 0, 88, 6.5, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *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_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK);
+ AttackModule::clear(boma, 3, false);
+ AttackModule::clear(boma, 4, false);
+ AttackModule::clear(boma, 5, false);
+ ATTACK(agent, 0, 0, Hash40::new("legl"), 9.0, 72, 55, 0, 88, 3.4, 0.0, -0.2, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *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_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK);
+ ATTACK(agent, 1, 0, Hash40::new("kneel"), 9.0, 72, 55, 0, 88, 3.2, 0.0, -0.5, 0.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *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_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK);
+ ATTACK(agent, 2, 0, Hash40::new("footl"), 9.0, 72, 55, 0, 88, 2.9, 0.0, 0.0, -0.1, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *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_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK);
+
}
frame(lua_state, 40.0);
if is_excute(agent) {
@@ -423,6 +447,22 @@ unsafe extern "C" fn game_attackairlw(agent: &mut L2CAgentBase) {
}
}
+unsafe extern "C" fn game_attackairlw2(agent: &mut L2CAgentBase) {
+ let lua_state = agent.lua_state_agent;
+ let boma = agent.boma();
+ if is_excute(agent) {
+ FT_MOTION_RATE(agent, 1.0);
+ AttackModule::clear_all(boma);
+ SET_SPEED_EX(agent, 0.0, 2.55, *KINETIC_ENERGY_RESERVE_ATTRIBUTE_MAIN);
+ WorkModule::off_flag(boma, *FIGHTER_STATUS_WORK_ID_FLAG_RESERVE_GRAVITY_STABLE_UNABLE);
+ KineticModule::resume_energy(boma, *FIGHTER_KINETIC_ENERGY_ID_CONTROL);
+ }
+ frame(lua_state, 39.0);
+ if is_excute(agent) {
+ notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS_BOTH_SIDES);
+ }
+}
+
unsafe extern "C" fn effect_attackairlw2(agent: &mut L2CAgentBase) {
let lua_state = agent.lua_state_agent;
let boma = agent.boma();
@@ -470,6 +510,7 @@ pub fn install(agent: &mut Agent) {
agent.acmd("effect_attackairblw", effect_attackairb);
agent.acmd("sound_attackairblw", sound_attackairb);
agent.acmd("expression_attackairblw", expression_attackairb);
+ agent.acmd("effect_landingairb", effect_landingairb);
agent.acmd("game_attackairhi", game_attackairhi);
agent.acmd("effect_attackairhi", effect_attackairhi);
@@ -477,5 +518,6 @@ pub fn install(agent: &mut Agent) {
agent.acmd("expression_attackairhi", expression_attackairhi);
agent.acmd("game_attackairlw", game_attackairlw);
+ agent.acmd("game_attackairlw2", game_attackairlw2);
agent.acmd("effect_attackairlw2", effect_attackairlw2);
}
\ No newline at end of file
diff --git a/fighters/richter/src/acmd/ground.rs b/fighters/richter/src/acmd/ground.rs
index 4c5717f5f1..b9afded714 100644
--- a/fighters/richter/src/acmd/ground.rs
+++ b/fighters/richter/src/acmd/ground.rs
@@ -33,6 +33,10 @@ unsafe extern "C" fn effect_attack11(agent: &mut L2CAgentBase) {
EFFECT_FOLLOW(agent, Hash40::new("sys_attack_arc_d"), Hash40::new("top"), 1, 9.5, 2.2, 13, -29, 154, 0.8, true);
LAST_EFFECT_SET_RATE(agent, 2.0);
}
+ frame(lua_state, 8.0);
+ if is_excute(agent) {
+ EffectModule::kill_kind(boma, Hash40::new("sys_attack_arc_d"), true, true);
+ }
}
unsafe extern "C" fn sound_attack11(agent: &mut L2CAgentBase) {
@@ -84,7 +88,7 @@ unsafe extern "C" fn effect_attack12(agent: &mut L2CAgentBase) {
}
frame(lua_state, 5.0);
if is_excute(agent) {
- EFFECT_FOLLOW(agent, Hash40::new("sys_attack_speedline"), Hash40::new("top"), 0, 4, 2.5, 9, -6.2, 0, 0.45, true);
+ EFFECT_FOLLOW(agent, Hash40::new("sys_attack_speedline"), Hash40::new("top"), 0, 4.5, 2.5, 9, -6.2, 0, 0.57, true);
LAST_EFFECT_SET_COLOR(agent, 0.902, 0.784, 0.333);
COL_NORMAL(agent);
}
@@ -104,13 +108,13 @@ unsafe extern "C" fn game_attack13(agent: &mut L2CAgentBase) {
let boma = agent.boma();
frame(lua_state, 4.0);
if is_excute(agent) {
- ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 65, 80, 0, 60, 4.0, 0.0, 9.8, 10.0, Some(0.0), Some(6.0), Some(7.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *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_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_WHIP);
+ ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 65, 80, 0, 60, 4.0, 0.0, 10.8, 10.0, Some(0.0), Some(6.0), Some(7.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *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_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_WHIP);
}
frame(lua_state, 5.0);
if is_excute(agent) {
- ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 65, 80, 0, 60, 4.0, 0.0, 21.0, 9.0, Some(0.0), Some(10.0), Some(7.75), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *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_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_WHIP);
+ ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 65, 80, 0, 60, 4.0, 0.0, 22.5, 9.0, Some(0.0), Some(10.0), Some(7.75), 1.0, 1.0, *ATTACK_SETOFF_KIND_OFF, *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_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_WHIP);
}
- frame(lua_state, 12.0);
+ frame(lua_state, 10.0);
if is_excute(agent) {
AttackModule::clear_all(boma);
}
@@ -129,17 +133,17 @@ unsafe extern "C" fn richter_attack_13_effect(agent: &mut L2CAgentBase) {
}
frame(lua_state, 4.0);
if is_excute(agent) {
- EFFECT_FLW_POS(agent, Hash40::new("richter_upper"), Hash40::new("havel"), 0, 0, 0, 0, 0, 0, 0.6, true);
- LAST_EFFECT_SET_RATE(agent, 1.0);
+ EFFECT_FLW_POS(agent, Hash40::new("richter_upper"), Hash40::new("havel"), 0, 0, 0, 0, 0, 0, 0.57, true);
+ LAST_EFFECT_SET_RATE(agent, 1.2);
LAST_EFFECT_SET_ALPHA(agent, 0.5);
FOOT_EFFECT(agent, Hash40::new("sys_atk_smoke2"), Hash40::new("top"), 0, 0, -1.0, 0, 0, 0, 0.6, 0, 0, 0, 0, 0, 0, false);
LAST_EFFECT_SET_RATE(agent, 1.0);
COL_NORMAL(agent);
}
- frame(lua_state, 12.0);
+ frame(lua_state, 10.0);
if is_excute(agent) {
- EFFECT_OFF_KIND(agent, Hash40::new("richter_upper"), true, true);
+ EffectModule::kill_kind(boma, Hash40::new("richter_upper"), true, true);
}
frame(lua_state, 18.0);
if is_excute(agent) {
@@ -187,7 +191,6 @@ unsafe extern "C" fn game_attackdash(agent: &mut L2CAgentBase) {
ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 55, 79, 0, 59, 4.0, 0.0, 9.5, 2.5, Some(0.0), Some(12.5), Some(10.0), 1.0, 1.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_normal"), *ATTACK_SOUND_LEVEL_L, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK);
}
frame(lua_state, 15.0);
- sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 0.9);
if is_excute(agent) {
AttackModule::clear_all(boma);
}
@@ -240,7 +243,7 @@ unsafe extern "C" fn effect_attackdash(agent: &mut L2CAgentBase) {
if is_excute(agent) {
COL_NORMAL(agent);
}
- frame(lua_state, 29.0);
+ frame(lua_state, 28.0);
if is_excute(agent) {
EFFECT_FOLLOW(agent, Hash40::new("sys_whirlwind_r"), Hash40::new("top"), 0, 0, -0.5, 0, 0, 0, 0.8, false);
LAST_EFFECT_SET_RATE(agent, 1.3);
@@ -260,7 +263,7 @@ unsafe extern "C" fn sound_attackdash(agent: &mut L2CAgentBase) {
PLAY_SE(agent, Hash40::new("se_common_punch_kick_swing_l"));
}
- frame(lua_state, 29.0);
+ frame(lua_state, 28.0);
if is_excute(agent) {
PLAY_SE(agent, Hash40::new("se_richter_landing01"));
}
diff --git a/fighters/richter/src/acmd/smashes.rs b/fighters/richter/src/acmd/smashes.rs
index a6881a56d0..1e38a05d1e 100644
--- a/fighters/richter/src/acmd/smashes.rs
+++ b/fighters/richter/src/acmd/smashes.rs
@@ -240,15 +240,12 @@ unsafe extern "C" fn effect_attackhi4(agent: &mut L2CAgentBase) {
if is_excute(agent) {
EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("top"), 0, 17, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false);
}
- frame(lua_state, 15.0);
+ frame(lua_state, 17.0);
if is_excute(agent) {
EFFECT_FOLLOW(agent, Hash40::new("sys_whirlwind_l"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.8, false);
LAST_EFFECT_SET_RATE(agent, 1.0);
LAST_EFFECT_SET_ALPHA(agent, 1.0);
- }
- frame(lua_state, 16.0);
- if is_excute(agent) {
- EFFECT(agent, Hash40::new("richter_whip_hi3"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1.025, 0, 0, 0, 0, 0, 0, true);
+ EFFECT(agent, Hash40::new("richter_whip_hi3"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1.0, 0, 0, 0, 0, 0, 0, true);
LAST_EFFECT_SET_COLOR(agent, 1.0, 1.0, 1.0);
}
}
@@ -259,11 +256,11 @@ unsafe extern "C" fn sound_attackhi4(agent: &mut L2CAgentBase) {
if is_excute(agent) {
PLAY_SE(agent, Hash40::new("se_richter_whip_holding"));
}
- frame(lua_state, 14.0);
+ frame(lua_state, 16.0);
if is_excute(agent) {
PLAY_SE(agent, Hash40::new("se_richter_attackhard_h01"));
}
- frame(lua_state, 16.0);
+ frame(lua_state, 17.0);
if is_excute(agent) {
PLAY_SE(agent, Hash40::new("vc_richter_attack05"));
PLAY_SE(agent, Hash40::new("se_richter_attackhard_s01"));
diff --git a/fighters/richter/src/acmd/specials.rs b/fighters/richter/src/acmd/specials.rs
index 5a55c275be..d2b95f139d 100644
--- a/fighters/richter/src/acmd/specials.rs
+++ b/fighters/richter/src/acmd/specials.rs
@@ -106,6 +106,7 @@ unsafe extern "C" fn game_specials1(agent: &mut L2CAgentBase) {
if agent.is_situation(*SITUATION_KIND_AIR) {
KineticModule::enable_energy(agent.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY);
KineticModule::change_kinetic(agent.module_accessor, *FIGHTER_KINETIC_TYPE_FALL);
+ VarModule::on_flag(agent.object(), vars::common::instance::SIDE_SPECIAL_CANCEL_NO_HIT);
}
}
frame(lua_state, 40.0);
@@ -203,23 +204,45 @@ unsafe extern "C" fn game_specialhi(agent: &mut L2CAgentBase) {
}
frame(lua_state, 6.0);
if is_excute(agent) {
- ATTACK(agent, 0, 0, Hash40::new("handl"), 13.0, 71, 78, 0, 67, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_THRU, *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_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_WHIP);
- ATTACK(agent, 1, 0, Hash40::new("havel"), 13.0, 71, 78, 0, 67, 4.0, 5.0, 0.0, 0.0, None, None, None, 1.2, 1.0, *ATTACK_SETOFF_KIND_THRU, *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_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_WHIP);
+ ATTACK(agent, 0, 0, Hash40::new("top"), 13.0, 71, 78, 0, 67, 5.9, 0.0, 9.8, 10.7, None, None, None, 1.0, 0.5, *ATTACK_SETOFF_KIND_THRU, *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_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_WHIP);
}
frame(lua_state, 7.0);
if is_excute(agent) {
WorkModule::on_flag(boma, *FIGHTER_MARTH_STATUS_SPECIAL_HI_FLAG_TRANS_MOVE);
+ ATTACK(agent, 0, 0, Hash40::new("top"), 13.0, 71, 78, 0, 67, 4.0, 0.0, 19.0, 11.9, Some(0.0), Some(11.0), Some(9.9), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *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_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_WHIP);
}
frame(lua_state, 8.0);
if is_excute(agent) {
- ATTACK(agent, 0, 0, Hash40::new("handl"), 7.0, 71, 90, 0, 65, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *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_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_WHIP);
- ATTACK(agent, 1, 0, Hash40::new("havel"), 7.0, 71, 90, 0, 65, 4.0, 5.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *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_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_WHIP);
+ ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 71, 90, 0, 65, 3.8, 0.0, 23.3, 11.2, Some(0.0), Some(11.5), Some(10.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *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_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_WHIP);
notify_event_msc_cmd!(agent, Hash40::new_raw(0x2127e37c07), *GROUND_CLIFF_CHECK_KIND_ALWAYS);
}
frame(lua_state, 9.0);
if is_excute(agent) {
- ATTACK(agent, 1, 0, Hash40::new("havel"), 7.0, 71, 90, 0, 65, 4.0, 5.0, 3.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *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_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_WHIP);
- ATTACK(agent, 2, 0, Hash40::new("top"), 7.0, 71, 90, 0, 65, 2.5, 0.0, 17.0, 6.0, Some(0.0), Some(17.0), Some(9.0), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *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_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_WHIP);
+ ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 71, 90, 0, 65, 3.6, 0.0, 26.0, 9.6, Some(0.0), Some(12.8), Some(7.5), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *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_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_WHIP);
+ }
+ frame(lua_state, 10.0);
+ if is_excute(agent) {
+ ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 71, 90, 0, 65, 3.5, 0.0, 28.5, 9.9, Some(0.0), Some(13.8), Some(7.8), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *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_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_WHIP);
+ }
+ frame(lua_state, 11.0);
+ if is_excute(agent) {
+ ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 71, 90, 0, 65, 3.5, 0.0, 30.0, 9.7, Some(0.0), Some(14.8), Some(7.6), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *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_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_WHIP);
+ }
+ frame(lua_state, 12.0);
+ if is_excute(agent) {
+ ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 71, 90, 0, 65, 3.3, 0.0, 31.5, 9.6, Some(0.0), Some(15.8), Some(7.6), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *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_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_WHIP);
+ }
+ frame(lua_state, 15.0);
+ if is_excute(agent) {
+ ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 71, 90, 0, 65, 3.3, 0.0, 30.0, 9.5, Some(0.0), Some(15.5), Some(7.6), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *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_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_WHIP);
+ }
+ frame(lua_state, 16.0);
+ if is_excute(agent) {
+ ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 71, 90, 0, 65, 3.5, 0.0, 29.0, 9.3, Some(0.0), Some(14.5), Some(7.3), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *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_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_WHIP);
+ }
+ frame(lua_state, 18.0);
+ if is_excute(agent) {
+ ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 71, 90, 0, 65, 3.0, 0.0, 28.0, 9.3, Some(0.0), Some(14.5), Some(7.3), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *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_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_WHIP);
}
frame(lua_state, 20.0);
if is_excute(agent) {
diff --git a/fighters/richter/src/acmd/tilts.rs b/fighters/richter/src/acmd/tilts.rs
index 6c1298d5c0..bb43db5edf 100644
--- a/fighters/richter/src/acmd/tilts.rs
+++ b/fighters/richter/src/acmd/tilts.rs
@@ -84,7 +84,7 @@ unsafe extern "C" fn game_attacksquats3(agent: &mut L2CAgentBase) {
let boma = agent.boma();
frame(lua_state, 12.0);
if is_excute(agent) {
- ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 110, 45, 0, 75, 3.8, 0.0, 7.0, 31.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 1.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_aura"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_WHIP);
+ ATTACK(agent, 0, 0, Hash40::new("top"), 10.0, 120, 45, 0, 75, 3.8, 0.0, 7.0, 31.0, None, None, None, 1.1, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_F, false, 1.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_aura"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_FIRE, *ATTACK_REGION_WHIP);
ATTACK(agent, 1, 0, Hash40::new("top"), 4.0, 361, 50, 0, 50, 4.6, 0.0, 7.0, 7.0, None, None, None, 0.8, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, 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_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_PUNCH, *ATTACK_REGION_PUNCH);
ATTACK(agent, 2, 0, Hash40::new("top"), 6.0, 361, 40, 0, 60, 2.3, 0.0, 7.0, 7.0, Some(0.0), Some(7.0), Some(29.0), 0.8, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, 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_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP);
}
@@ -159,7 +159,15 @@ unsafe extern "C" fn game_attackhi3(agent: &mut L2CAgentBase) {
let boma = agent.boma();
frame(lua_state, 11.0);
if is_excute(agent) {
- ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 100, 80, 0, 50, 4.5, 0.0, 9.5, 8.5, Some(0.0), Some(13.0), Some(8.6), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, 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_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP);
+ ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 100, 80, 0, 50, 4.5, 0.0, 7.5, 8.5, Some(0.0), Some(10.0), Some(8.6), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, 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_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP);
+ }
+ frame(lua_state, 12.0);
+ if is_excute(agent) {
+ ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 100, 80, 0, 50, 4.5, 0.0, 10.0, 8.5, Some(0.0), Some(14.5), Some(8.6), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, 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_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP);
+ }
+ frame(lua_state, 13.0);
+ if is_excute(agent) {
+ ATTACK(agent, 0, 0, Hash40::new("top"), 7.0, 100, 80, 0, 50, 4.5, 0.0, 14.7, 7.4, Some(0.0), Some(20.5), Some(5.7), 1.0, 1.0, *ATTACK_SETOFF_KIND_THRU, *ATTACK_LR_CHECK_POS, 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_whip"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_RICHTER_WHIP, *ATTACK_REGION_WHIP);
}
frame(lua_state, 14.0);
if is_excute(agent) {
@@ -250,61 +258,118 @@ unsafe extern "C" fn sound_attackhi3(agent: &mut L2CAgentBase) {
unsafe extern "C" fn game_attacklw3(agent: &mut L2CAgentBase) {
let lua_state = agent.lua_state_agent;
let boma = agent.boma();
- frame(lua_state, 1.0);
- FT_MOTION_RATE_RANGE(agent, 1.0, 7.0, 9.0);
- frame(lua_state, 7.0);
- FT_MOTION_RATE(agent, 1.0);
+ frame(lua_state, 10.0);
if is_excute(agent) {
- ATTACK(agent, 0, 0, Hash40::new("kneel"), 9.0, 72, 65, 0, 70, 3.0, 0.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *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_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK);
- ATTACK(agent, 1, 0, Hash40::new("footl"), 9.0, 72, 65, 0, 70, 3.0, 0.0, 0.0, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *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_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK);
+ WorkModule::on_flag(boma, *FIGHTER_SIMON_STATUS_ATTACK_FLAG_ENABLE_COMBO);
+ ATTACK(agent, 0, 0, Hash40::new("kneel"), 5.0, 60, 70, 0, 60, 3.0, 0.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *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_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK);
+ ATTACK(agent, 1, 0, Hash40::new("footl"), 5.0, 60, 70, 0, 60, 3.0, 0.0, 0.0, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *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_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK);
AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false);
}
- frame(lua_state, 12.0);
+ frame(lua_state, 16.0);
if is_excute(agent) {
- ATTACK(agent, 0, 0, Hash40::new("kneel"), 5.0, 72, 80, 0, 50, 2.5, 0.0, 0.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *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_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK);
- ATTACK(agent, 1, 0, Hash40::new("footl"), 5.0, 72, 80, 0, 50, 2.5, 0.0, 0.0, -1.5, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *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_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK);
- AttackModule::set_attack_height_all(boma, app::AttackHeight(*ATTACK_HEIGHT_LOW), false);
+ AttackModule::clear_all(boma);
+ WorkModule::off_flag(boma, *FIGHTER_SIMON_STATUS_ATTACK_FLAG_ENABLE_COMBO);
}
- frame(lua_state, 22.0);
+}
+
+unsafe extern "C" fn effect_attacklw3(agent: &mut L2CAgentBase) {
+ let lua_state = agent.lua_state_agent;
+ let boma = agent.boma();
+ frame(lua_state, 6.0);
if is_excute(agent) {
- AttackModule::clear_all(boma);
+ LANDING_EFFECT(agent, Hash40::new("sys_atk_smoke"), Hash40::new("top"), 8, 0, 0, 0, 0, 0, 0.4, 0, 0, 0, 0, 0, 0, false);
+ LAST_EFFECT_SET_RATE(agent, 1.0);
+ }
+ frame(lua_state, 10.0);
+ if is_excute(agent) {
+ LANDING_EFFECT(agent, Hash40::new("sys_sliding_smoke"), Hash40::new("top"), 7, 0, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, false);
+ }
+ frame(lua_state, 18.0);
+ if is_excute(agent) {
+ EFFECT_FOLLOW(agent, Hash40::new("sys_turn_smoke"), Hash40::new("top"), 2, 0, -5.0, 0, 0, 0, 1.0, true);
}
}
-unsafe extern "C" fn game_attacklw32(agent: &mut L2CAgentBase) {
+unsafe extern "C" fn sound_attacklw3(agent: &mut L2CAgentBase) {
let lua_state = agent.lua_state_agent;
let boma = agent.boma();
- frame(lua_state, 1.0);
- FT_MOTION_RATE_RANGE(agent, 1.0, 5.0, 6.0);
+ frame(lua_state, 8.0);
+ if is_excute(agent) {
+ PLAY_SE(agent, Hash40::new("se_richter_attackhard_l01"));
+ }
+}
+
+unsafe extern "C" fn expression_attacklw3(agent: &mut L2CAgentBase) {
+ let lua_state = agent.lua_state_agent;
+ let boma = agent.boma();
+ if is_excute(agent) {
+ slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE_INTP, *SLOPE_STATUS_TOP, 5);
+ }
frame(lua_state, 5.0);
- FT_MOTION_RATE(agent, 1.0);
+ if is_excute(agent) {
+ slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE_INTP, *SLOPE_STATUS_TOP, 2, true);
+ }
+ frame(lua_state, 10.0);
+ if is_excute(agent) {
+ RUMBLE_HIT(agent, Hash40::new("rbkind_attackm"), 0);
+ ControlModule::set_rumble(boma, Hash40::new("rbkind_nohitm"), 9, false, *BATTLE_OBJECT_ID_INVALID as u32);
+ }
+ frame(lua_state, 16.0);
+ if is_excute(agent) {
+ ControlModule::set_rumble(boma, Hash40::new("rbkind_dash"), 0, false, *BATTLE_OBJECT_ID_INVALID as u32);
+ }
+ frame(lua_state, 27.0);
+ if is_excute(agent) {
+ slope!(agent, *MA_MSC_CMD_SLOPE_SLOPE_INTP, *SLOPE_STATUS_LR, 6);
+ }
+}
+
+unsafe extern "C" fn game_attacklw32(agent: &mut L2CAgentBase) {
+ let lua_state = agent.lua_state_agent;
+ let boma = agent.boma();
frame(lua_state, 6.0);
if is_excute(agent) {
JostleModule::set_status(boma, false);
WorkModule::on_flag(boma, *FIGHTER_SIMON_STATUS_ATTACK_LW32_WORK_ID_FLAG_LANDING_AIR);
}
- frame(lua_state, 7.0);
- sv_kinetic_energy!(set_speed_mul, agent, FIGHTER_KINETIC_ENERGY_ID_MOTION, 0.8);
- FT_MOTION_RATE_RANGE(agent, 7.0, 34.0, 18.0);
frame(lua_state, 8.0);
if is_excute(agent) {
- ATTACK(agent, 0, 0, Hash40::new("kneel"), 12.0, 55, 90, 0, 60, 3.5, 0.0, 1.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 1.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_KICK);
- ATTACK(agent, 1, 0, Hash40::new("footl"), 12.0, 55, 90, 0, 60, 3.0, 0.0, 1.5, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 1.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_KICK);
- ATTACK(agent, 2, 0, Hash40::new("hip"), 12.0, 55, 90, 0, 60, 4.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_F, false, 1.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_KICK);
+ ATTACK(agent, 0, 0, Hash40::new("kneel"), 5.5, 75, 60, 0, 88, 3.2, 0.0, 1.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *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_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK);
+ ATTACK(agent, 1, 0, Hash40::new("footl"), 5.5, 75, 60, 0, 88, 2.9, 0.0, 1.5, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *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_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK);
+ ATTACK(agent, 2, 0, Hash40::new("hip"), 5.5, 75, 60, 0, 88, 3.4, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *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_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK);
}
- frame(lua_state, 19.0);
+ frame(lua_state, 14.0);
if is_excute(agent) {
- ATTACK(agent, 0, 0, Hash40::new("kneel"), 9.0, 72, 24, 0, 63, 3.5, 0.0, 1.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *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_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK);
- ATTACK(agent, 1, 0, Hash40::new("footl"), 9.0, 72, 24, 0, 63, 3.0, 0.0, 1.5, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *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_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK);
- AttackModule::clear(boma, 2, false);
+ AttackModule::clear(agent.module_accessor, 2, false);
}
- frame(lua_state, 26.0);
+ frame(lua_state, 18.0);
+ if is_excute(agent) {
+ ATTACK(agent, 0, 0, Hash40::new("kneel"), 3.5, 80, 60, 0, 88, 3.2, 0.0, 1.0, -1.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *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_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK);
+ ATTACK(agent, 1, 0, Hash40::new("footl"), 3.5, 80, 60, 0, 88, 2.9, 0.0, 1.5, -2.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *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_normal"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_KICK, *ATTACK_REGION_KICK);
+ }
+ frame(lua_state, 22.0);
if is_excute(agent) {
AttackModule::clear_all(boma);
JostleModule::set_status(boma, true);
}
- frame(lua_state, 34.0);
- FT_MOTION_RATE(agent, 1.0);
+}
+
+unsafe extern "C" fn effect_attacklw32(agent: &mut L2CAgentBase) {
+ let lua_state = agent.lua_state_agent;
+ let boma = agent.boma();
+ frame(lua_state, 1.0);
+ if is_excute(agent) {
+ EFFECT(agent, Hash40::new("sys_smash_flash"), Hash40::new("kneel"), 0, 0, 0, 0, 0, 0, 0.5, 0, 0, 0, 0, 0, 0, true);
+ }
+ frame(lua_state, 5.0);
+ if is_excute(agent) {
+ LANDING_EFFECT(agent, Hash40::new("sys_landing_smoke"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 0, 0, false);
+ LAST_EFFECT_SET_RATE(agent, 1.2);
+ }
+ frame(lua_state, 6.0);
+ if is_excute(agent) {
+ EFFECT(agent, Hash40::new("richter_sliding"), Hash40::new("top"), 0, 0, -5, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, true);
+ }
}
pub fn install(agent: &mut Agent) {
@@ -324,5 +389,9 @@ pub fn install(agent: &mut Agent) {
agent.acmd("expression_attackhi3", expression_attackhi3);
agent.acmd("game_attacklw3", game_attacklw3);
+ agent.acmd("effect_attacklw3", effect_attacklw3);
+ agent.acmd("sound_attacklw3", sound_attacklw3);
+ agent.acmd("expression_attacklw3", expression_attacklw3);
agent.acmd("game_attacklw32", game_attacklw32);
+ agent.acmd("effect_attacklw32", effect_attacklw32);
}
\ No newline at end of file
diff --git a/fighters/richter/src/axe/acmd.rs b/fighters/richter/src/axe/acmd.rs
index fef93b8399..67fe1af3b5 100644
--- a/fighters/richter/src/axe/acmd.rs
+++ b/fighters/richter/src/axe/acmd.rs
@@ -5,14 +5,22 @@ unsafe extern "C" fn richter_axe_game(fighter: &mut L2CAgentBase) {
let boma = fighter.boma();
let lr = PostureModule::lr(fighter.module_accessor);
let axe_owner = &mut *sv_battle_object::module_accessor((WorkModule::get_int(boma, *WEAPON_INSTANCE_WORK_ID_INT_LINK_OWNER)) as u32);
- let offset = &Vector2f::new(0.0 * lr, if axe_owner.kind() == *FIGHTER_KIND_KIRBY { -12.2 } else { -4.2 });
+ let offset = &Vector2f::new(0.0 * lr, if axe_owner.kind() == *FIGHTER_KIND_KIRBY { -13.2 } else { -5.2 });
PostureModule::set_rot(boma, &Vector3f::new(0.0, 0.0, if axe_owner.is_situation(*SITUATION_KIND_AIR) { -128.0 } else { -90.0 } * lr), 0);
PostureModule::set_scale(boma, 1.12, false);
PostureModule::add_pos_2d(boma, offset);
frame(lua_state, 1.0);
- if is_excute(fighter) {
- ATTACK(fighter, 0, 0, Hash40::new("axe"), 3.5, 50, 80, 0, 32, 2.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT);
- AttackModule::enable_safe_pos(boma);
+ if axe_owner.is_situation(*SITUATION_KIND_AIR){
+ if is_excute(fighter) {
+ ATTACK(fighter, 0, 0, Hash40::new("axe"), 3.5, 50, 80, 0, 32, 2.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT);
+ AttackModule::enable_safe_pos(boma);
+ }
+ } else
+ if axe_owner.is_situation(*SITUATION_KIND_GROUND){
+ if is_excute(fighter) {
+ ATTACK(fighter, 0, 0, Hash40::new("axe"), 4.5, 77, 80, 0, 32, 2.0, 0.0, 0.0, 0.0, None, None, None, 1.0, 1.0, *ATTACK_SETOFF_KIND_ON, *ATTACK_LR_CHECK_SPEED, false, 0, 0.0, 0, true, false, false, false, false, *COLLISION_SITUATION_MASK_GA, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_cutup"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_CUTUP, *ATTACK_REGION_OBJECT);
+ AttackModule::enable_safe_pos(boma);
+ }
}
}
diff --git a/fighters/richter/src/opff.rs b/fighters/richter/src/opff.rs
index ac9f98411f..d578e66635 100644
--- a/fighters/richter/src/opff.rs
+++ b/fighters/richter/src/opff.rs
@@ -4,6 +4,43 @@ use super::*;
use globals::*;
use skyline_smash::app::lua_bind::ControlModule::clear_command_one;
+//dtilt1 crossup prevention
+unsafe fn dtilt1_crossup_prevention(fighter: &mut L2CFighterCommon) {
+ if fighter.is_motion(Hash40::new("attack_lw3"))
+ && AttackModule::is_infliction(fighter.module_accessor, *COLLISION_KIND_MASK_SHIELD) {
+ sv_kinetic_energy!(set_speed_mul, fighter, FIGHTER_KINETIC_ENERGY_ID_MOTION, 0.0);
+ }
+}
+
+// dtilt bounce
+unsafe fn dtilt_bounce(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor){
+ if fighter.is_motion(Hash40::new("attack_lw32")) && fighter.motion_frame() > 1.0 {
+ let mut speed = -0.2;
+ if fighter.motion_frame() < 18.0 {
+ speed = -0.1;
+ }
+ if AttackModule::is_infliction(fighter.module_accessor, *COLLISION_KIND_MASK_HIT | *COLLISION_KIND_MASK_SHIELD) {
+ MotionModule::change_motion(fighter.module_accessor, Hash40::new("attack_air_lw2"), 0.0, 1.0, false, 0.0, false, false);
+ KineticModule::clear_speed_energy_id(fighter.module_accessor, *FIGHTER_KINETIC_ENERGY_ID_GRAVITY);
+ KineticModule::add_speed(fighter.module_accessor, &Vector3f::new(0.0, speed, 0.0));
+ KineticModule::change_kinetic(fighter.module_accessor, *FIGHTER_KINETIC_TYPE_FALL);
+ sv_kinetic_energy!(controller_set_accel_x_mul, fighter, 0.02/*Base Air Acceleration*/);
+ sv_kinetic_energy!(controller_set_accel_x_add, fighter, 0.01/*Additional Air Acceleration*/);
+ sv_kinetic_energy!(set_limit_speed, fighter, *FIGHTER_KINETIC_ENERGY_ID_CONTROL, 0.9/*Maximum Horizontal Air Speed*/, 0.0);
+ WorkModule::off_flag(boma, *FIGHTER_SIMON_STATUS_ATTACK_LW32_WORK_ID_FLAG_LANDING_AIR);
+ }
+ }
+}
+
+// dair bounce height and accel
+unsafe fn dair_bounce(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor){
+ if fighter.is_motion(Hash40::new("attack_air_lw2")) && fighter.motion_frame() > 1.0 {
+ sv_kinetic_energy!(controller_set_accel_x_mul, fighter, 0.02/*Base Air Acceleration*/);
+ sv_kinetic_energy!(controller_set_accel_x_add, fighter, 0.01/*Additional Air Acceleration*/);
+ sv_kinetic_energy!(set_limit_speed, fighter, *FIGHTER_KINETIC_ENERGY_ID_CONTROL, 0.9/*Maximum Horizontal Air Speed*/, 0.0);
+ }
+}
+
// knife drift
unsafe fn knife_drift(boma: &mut BattleObjectModuleAccessor) {
if boma.is_status(*FIGHTER_STATUS_KIND_SPECIAL_N)
@@ -13,26 +50,26 @@ unsafe fn knife_drift(boma: &mut BattleObjectModuleAccessor) {
}
// knife land cancel
-unsafe fn knife_lc(boma: &mut BattleObjectModuleAccessor) {
- if StatusModule::is_changing(boma) {
- return;
- }
- if boma.is_status(*FIGHTER_STATUS_KIND_SPECIAL_N)
- && VarModule::is_flag(boma.object(), vars::richter::instance::SPECIAL_N_LAND_CANCEL)
- && boma.is_situation(*SITUATION_KIND_GROUND) {
- // remove the unthrown knife from richter's hand
- if (2.0..13.0).contains(&boma.motion_frame())
- && ArticleModule::is_exist(boma, *FIGHTER_SIMON_GENERATE_ARTICLE_AXE){
- ArticleModule::remove_exist(boma, *FIGHTER_SIMON_GENERATE_ARTICLE_AXE, ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL));
- }
-
- let landing_lag = 10.0; // amount of frames until richter can act when landing
- let rate = 27.0 / landing_lag;
- MotionModule::change_motion(boma, Hash40::new("landing_fall_special"), 0.0, rate, false, 0.0, false, false);
- VarModule::off_flag(boma.object(), vars::richter::instance::SPECIAL_N_LAND_CANCEL);
- EffectModule::kill_kind(boma, Hash40::new("sys_sp_flash"), true, true);
- }
-}
+//unsafe fn knife_lc(boma: &mut BattleObjectModuleAccessor) {
+// if StatusModule::is_changing(boma) {
+// return;
+// }
+// if boma.is_status(*FIGHTER_STATUS_KIND_SPECIAL_N)
+// && VarModule::is_flag(boma.object(), vars::richter::instance::SPECIAL_N_LAND_CANCEL)
+// && boma.is_situation(*SITUATION_KIND_GROUND) {
+// // remove the unthrown knife from richter's hand
+// if (2.0..13.0).contains(&boma.motion_frame())
+// && ArticleModule::is_exist(boma, *FIGHTER_SIMON_GENERATE_ARTICLE_AXE){
+// ArticleModule::remove_exist(boma, *FIGHTER_SIMON_GENERATE_ARTICLE_AXE, ArticleOperationTarget(*ARTICLE_OPE_TARGET_ALL));
+// }
+//
+// let landing_lag = 10.0; // amount of frames until richter can act when landing
+// let rate = 27.0 / landing_lag;
+// MotionModule::change_motion(boma, Hash40::new("landing_fall_special"), 0.0, rate, false, 0.0, false, false);
+// VarModule::off_flag(boma.object(), vars::richter::instance::SPECIAL_N_LAND_CANCEL);
+// EffectModule::kill_kind(boma, Hash40::new("sys_sp_flash"), true, true);
+// }
+//}
// allow fair and bair to transition into their angled variants when the stick is angled up/down
unsafe fn whip_angling(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor, frame: f32, stick_y: f32) {
@@ -92,8 +129,11 @@ unsafe fn fastfall_specials(fighter: &mut L2CFighterCommon) {
}
pub unsafe fn moveset(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor, id: usize, cat: [i32 ; 4], status_kind: i32, situation_kind: i32, motion_kind: u64, stick_x: f32, stick_y: f32, facing: f32, frame: f32) {
+ dtilt1_crossup_prevention(fighter);
+ dtilt_bounce(fighter, boma);
+ dair_bounce(fighter, boma);
knife_drift(boma);
- knife_lc(boma);
+// knife_lc(boma);
whip_angling(fighter, boma, frame, stick_y);
fastfall_specials(fighter);
}
diff --git a/fighters/richter/src/status/attacklw3.rs b/fighters/richter/src/status/attacklw3.rs
index 0d6bf484f6..038c59876d 100644
--- a/fighters/richter/src/status/attacklw3.rs
+++ b/fighters/richter/src/status/attacklw3.rs
@@ -9,11 +9,19 @@ unsafe extern "C" fn attack_lw3_main(fighter: &mut L2CFighterCommon) -> L2CValue
unsafe extern "C" fn attack_lw3_main_loop(fighter: &mut L2CFighterCommon) -> L2CValue {
if !StatusModule::is_changing(fighter.module_accessor) {
- if fighter.status_frame() == 8 && ControlModule::check_button_on(fighter.module_accessor, *CONTROL_PAD_BUTTON_ATTACK) {
- fighter.change_status(FIGHTER_SIMON_STATUS_KIND_ATTACK_LW32.into(), true.into());
- return 1.into()
+ if (8..=15).contains(&fighter.status_frame()) {
+ if ControlModule::check_button_trigger(fighter.module_accessor, *CONTROL_PAD_BUTTON_JUMP) {
+ VarModule::on_flag(fighter.battle_object, vars::richter::status::D_TILT_JUMP_BUFFER);
}
+ else if ControlModule::check_button_trigger(fighter.module_accessor, *CONTROL_PAD_BUTTON_ATTACK) {
+ VarModule::on_flag(fighter.battle_object, vars::richter::status::D_TILT_JUMP_BUFFER);
+ }
+ }
+ if fighter.status_frame() == 15 && VarModule::is_flag(fighter.battle_object, vars::richter::status::D_TILT_JUMP_BUFFER) {
+ fighter.change_status(FIGHTER_SIMON_STATUS_KIND_ATTACK_LW32.into(), true.into());
+ return 1.into()
}
+}
fighter.status_AttackLw3_Main();
return 0.into()
}
diff --git a/romfs/source/fighter/common/hdr/param/fighter_param.xml b/romfs/source/fighter/common/hdr/param/fighter_param.xml
index ea1f7021b0..b2b4475198 100644
--- a/romfs/source/fighter/common/hdr/param/fighter_param.xml
+++ b/romfs/source/fighter/common/hdr/param/fighter_param.xml
@@ -412,8 +412,8 @@
RICHTER
-1.0
- 1.0
- 1.0
+ 1.21
+ 1.21
KROOL
diff --git a/romfs/source/fighter/richter/motion/body/motion_patch.yaml b/romfs/source/fighter/richter/motion/body/motion_patch.yaml
index fa7156cf3c..308169d416 100644
--- a/romfs/source/fighter/richter/motion/body/motion_patch.yaml
+++ b/romfs/source/fighter/richter/motion/body/motion_patch.yaml
@@ -46,7 +46,7 @@ attack_lw4:
cancel_frame: 50
attack_hi4:
extra:
- cancel_frame: 52
+ cancel_frame: 53
attack_hi3:
extra:
cancel_frame: 36
@@ -117,12 +117,12 @@ special_n:
flags:
move: false
extra:
- cancel_frame: 37
+ cancel_frame: 36
special_air_n:
flags:
move: false
extra:
- cancel_frame: 37
+ cancel_frame: 36
special_s1:
flags:
move: true
@@ -132,7 +132,7 @@ special_air_s1:
flags:
move: true
extra:
- cancel_frame: 45
+ cancel_frame: 40
special_lw:
flags:
move: true
@@ -152,7 +152,7 @@ attack_air_hi:
attack_air_lw2:
blend_frames: 8
extra:
- cancel_frame: 25
+ cancel_frame: 30
throw_hi:
extra:
cancel_frame: 35