diff --git a/fighters/ganon/src/acmd/ground.rs b/fighters/ganon/src/acmd/ground.rs index 4402de34bf..e68ed3677a 100644 --- a/fighters/ganon/src/acmd/ground.rs +++ b/fighters/ganon/src/acmd/ground.rs @@ -9,7 +9,7 @@ unsafe extern "C" fn game_attack11(agent: &mut L2CAgentBase) { FT_MOTION_RATE(agent, 1.0); frame(lua_state, 6.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 50, 40, 0, 95, 5.0, 0.0, 12.0, 7.0, Some(0.0), Some(15.5), Some(7.0), 1.0, 1.5, *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_elec"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); + ATTACK(agent, 0, 0, Hash40::new("top"), 5.0, 50, 40, 0, 95, 4.3, 2.5, 12.0, 5.0, Some(0.0), Some(15.5), Some(5.0), 1.0, 1.5, *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_elec"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); ATTACK(agent, 1, 0, Hash40::new("top"), 5.0, 50, 40, 0, 95, 3.5, 0.0, 12.5, 12.0, Some(0.0), Some(15.5), Some(12.0), 1.0, 1.5, *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_elec"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); ATTACK(agent, 2, 0, Hash40::new("top"), 5.0, 50, 40, 0, 95, 2.0, 0.0, 13.0, 15.5, Some(0.0), Some(15.5), Some(15.5), 1.0, 1.5, *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_elec"), *ATTACK_SOUND_LEVEL_S, *COLLISION_SOUND_ATTR_HEAVY, *ATTACK_REGION_PUNCH); ATK_SET_SHIELD_SETOFF_MUL(agent, 0, 2.0); diff --git a/fighters/ganon/src/acmd/other.rs b/fighters/ganon/src/acmd/other.rs index c45bd380e6..9c58fe7948 100644 --- a/fighters/ganon/src/acmd/other.rs +++ b/fighters/ganon/src/acmd/other.rs @@ -76,6 +76,13 @@ unsafe extern "C" fn game_appealhir(agent: &mut L2CAgentBase) { if is_excute(agent) { damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_ALWAYS, 0); } + frame(lua_state, 61.0); + if is_excute(agent) { + if agent.is_button_on(Buttons::Special) { + WorkModule::enable_transition_term(boma, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_SPECIAL_N); + StatusModule::change_status_force(boma, *FIGHTER_STATUS_KIND_SPECIAL_N, false); + } + } frame(lua_state, 65.0); if is_excute(agent) { damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_NORMAL, 0); @@ -89,12 +96,79 @@ unsafe extern "C" fn game_appealhil(agent: &mut L2CAgentBase) { if is_excute(agent) { damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_ALWAYS, 0); } + frame(lua_state, 61.0); + if is_excute(agent) { + if agent.is_button_on(Buttons::Special) { + WorkModule::enable_transition_term(boma, *FIGHTER_STATUS_TRANSITION_TERM_ID_CONT_SPECIAL_N); + StatusModule::change_status_force(boma, *FIGHTER_STATUS_KIND_SPECIAL_N, false); + } + } frame(lua_state, 65.0); if is_excute(agent) { damage!(agent, *MA_MSC_DAMAGE_DAMAGE_NO_REACTION, *DAMAGE_NO_REACTION_MODE_NORMAL, 0); } } +unsafe extern "C" fn effect_appealhil(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 20.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_whirlwind_l"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + LAST_EFFECT_SET_ALPHA(agent, 0.4); + } + frame(lua_state, 26.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_whirlwind_l"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, false); + LAST_EFFECT_SET_ALPHA(agent, 0.8); + } + frame(lua_state, 44.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_crown"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + LANDING_EFFECT(agent, Hash40::new("null"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 42.0); + for _ in 0..5 { + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("ganon_entry_aura"), Hash40::new("emit"), 0, 0, 0, 0, 0, 0, 1, true); + } + } + frame(lua_state, 66.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("ganon_entry_aura"), false, false); + } +} + +unsafe extern "C" fn effect_appealhir(agent: &mut L2CAgentBase) { + let lua_state = agent.lua_state_agent; + let boma = agent.boma(); + frame(lua_state, 20.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_whirlwind_l"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + LAST_EFFECT_SET_ALPHA(agent, 0.4); + } + frame(lua_state, 26.0); + if is_excute(agent) { + LANDING_EFFECT(agent, Hash40::new("sys_whirlwind_l"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1.2, 0, 0, 0, 0, 0, 0, false); + LAST_EFFECT_SET_ALPHA(agent, 0.8); + } + frame(lua_state, 41.0); + if is_excute(agent) { + EFFECT(agent, Hash40::new("sys_crown"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + LANDING_EFFECT(agent, Hash40::new("null"), Hash40::new("top"), 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, false); + } + frame(lua_state, 42.0); + for _ in 0..5 { + if is_excute(agent) { + EFFECT_FOLLOW(agent, Hash40::new("ganon_entry_aura"), Hash40::new("emit"), 0, 0, 0, 0, 0, 0, 1, true); + } + } + frame(lua_state, 66.0); + if is_excute(agent) { + EFFECT_OFF_KIND(agent, Hash40::new("ganon_entry_aura"), false, false); + } +} + unsafe extern "C" fn game_appeallwr(agent: &mut L2CAgentBase) { let lua_state = agent.lua_state_agent; let boma = agent.boma(); @@ -158,6 +232,9 @@ pub fn install(agent: &mut Agent) { agent.acmd("game_appealhir", game_appealhir, Priority::Low); agent.acmd("game_appealhil", game_appealhil, Priority::Low); + agent.acmd("effect_appealhir", effect_appealhir, Priority::Low); + agent.acmd("effect_appealhil", effect_appealhil, Priority::Low); + agent.acmd("game_appeallwr", game_appeallwr, Priority::Low); agent.acmd("game_appeallwl", game_appeallwl, Priority::Low); diff --git a/fighters/ganon/src/acmd/specials.rs b/fighters/ganon/src/acmd/specials.rs index 605f1f5077..aaa48b4b10 100644 --- a/fighters/ganon/src/acmd/specials.rs +++ b/fighters/ganon/src/acmd/specials.rs @@ -246,7 +246,7 @@ unsafe extern "C" fn game_specialairs(agent: &mut L2CAgentBase) { } wait(lua_state, 4.0); if is_excute(agent) { - ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 270, 30, 0, 64, 4.5, 0.0, 3.0, 6.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_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_BOMB, *ATTACK_REGION_NONE); + ATTACK(agent, 0, 0, Hash40::new("top"), 6.0, 282, 30, 0, 64, 4.5, 0.0, 3.0, 6.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_G, *COLLISION_CATEGORY_MASK_ALL, *COLLISION_PART_MASK_ALL, false, Hash40::new("collision_attr_normal"), *ATTACK_SOUND_LEVEL_M, *COLLISION_SOUND_ATTR_BOMB, *ATTACK_REGION_NONE); } wait(lua_state, 1.0); if is_excute(agent) { diff --git a/romfs/source/fighter/ganon/motion/body/motion_patch.yaml b/romfs/source/fighter/ganon/motion/body/motion_patch.yaml index ec8bc997b0..a4c51550d7 100644 --- a/romfs/source/fighter/ganon/motion/body/motion_patch.yaml +++ b/romfs/source/fighter/ganon/motion/body/motion_patch.yaml @@ -331,6 +331,9 @@ float_air_start: special_hi_throw: extra: cancel_frame: 37 +special_air_s: + extra: + cancel_frame: 32 catch: extra: cancel_frame: 38