#include "common.h" #include "battle/battle.h" #include "script_api/battle.h" #include "sprite/npc/BattleLakilester.h" #include "effects.h" #define NAMESPACE b_area_flo2_spike extern EvtScript N(init); extern EvtScript N(takeTurn); extern EvtScript N(idle); extern EvtScript N(handleEvent); s32 N(IdleAnimations)[] = { STATUS_NORMAL, ANIM_BattleLakilester_Idle, STATUS_STONE, ANIM_BattleLakilester_Still, STATUS_SLEEP, ANIM_BattleLakilester_Block, STATUS_POISON, ANIM_BattleLakilester_Idle, STATUS_STOP, ANIM_BattleLakilester_Still, STATUS_STATIC, ANIM_BattleLakilester_Idle, STATUS_PARALYZE, ANIM_BattleLakilester_Still, STATUS_DIZZY, ANIM_BattleLakilester_Injured, STATUS_FEAR, ANIM_BattleLakilester_Idle, STATUS_END, }; s32 N(IdleAnimations_spiny)[] = { STATUS_NORMAL, ANIM_BattleLakilester_Spiny, STATUS_END, }; s32 N(DefenseTable)[] = { ELEMENT_NORMAL, 0, ELEMENT_END, }; s32 N(StatusTable)[] = { STATUS_NORMAL, 0, STATUS_DEFAULT, 0, STATUS_SLEEP, 40, STATUS_POISON, 50, STATUS_FROZEN, 0, STATUS_DIZZY, 50, STATUS_FEAR, 0, STATUS_STATIC, 50, STATUS_PARALYZE, 40, STATUS_SHRINK, 50, STATUS_STOP, 50, STATUS_DEFAULT_TURN_MOD, 0, STATUS_SLEEP_TURN_MOD, -1, STATUS_POISON_TURN_MOD, 0, STATUS_FROZEN_TURN_MOD, 0, STATUS_DIZZY_TURN_MOD, 0, STATUS_FEAR_TURN_MOD, 0, STATUS_STATIC_TURN_MOD, 0, STATUS_PARALYZE_TURN_MOD, -1, STATUS_SHRINK_TURN_MOD, -1, STATUS_STOP_TURN_MOD, -1, STATUS_END, }; ActorPartBlueprint N(parts)[] = { { .flags = ACTOR_PART_FLAG_MULTI_TARGET, .index = 1, .posOffset = { 0, 0, 0 }, .targetOffset = { -5, 35 }, .opacity = 255, .idleAnimations = N(IdleAnimations), .defenseTable = N(DefenseTable), .eventFlags = 0, .elementImmunityFlags = 0, .projectileTargetOffset = { 0, -13 }, }, { .flags = ACTOR_PART_FLAG_INVISIBLE | ACTOR_PART_FLAG_NO_TARGET | ACTOR_PART_FLAG_USE_ABSOLUTE_POSITION, .index = 2, .posOffset = { 0, 0, 0 }, .targetOffset = { 0, 0 }, .opacity = 255, .idleAnimations = N(IdleAnimations_spiny), .defenseTable = N(DefenseTable), .eventFlags = 0, .elementImmunityFlags = 0, .projectileTargetOffset = { 0, 0 }, }, }; ActorBlueprint NAMESPACE = { .flags = ACTOR_FLAG_FLYING, .type = ACTOR_TYPE_SPIKE, .level = 40, .maxHP = 50, .partCount = ARRAY_COUNT(N(parts)), .partsData = N(parts), .initScript = &N(init), .statusTable = N(StatusTable), .escapeChance = 0, .airLiftChance = 0, .hurricaneChance = 0, .spookChance = 0, .upAndAwayChance = 0, .spinSmashReq = 0, .powerBounceChance = 75, .coinReward = 0, .size = { 32, 40 }, .hpBarOffset = { 0, 0 }, .statusIconOffset = { -14, 20 }, .statusMessageOffset = { 6, 32 }, }; EvtScript N(init) = { EVT_CALL(BindTakeTurn, ACTOR_SELF, EVT_PTR(N(takeTurn))) EVT_CALL(BindIdle, ACTOR_SELF, EVT_PTR(N(idle))) EVT_CALL(BindHandleEvent, ACTOR_SELF, EVT_PTR(N(handleEvent))) EVT_RETURN EVT_END }; EvtScript N(idle) = { EVT_RETURN EVT_END }; EvtScript N(returnHome) = { EVT_CALL(SetAnimation, ACTOR_SELF, 1, ANIM_BattleLakilester_Run) EVT_CALL(SetGoalToHome, ACTOR_SELF) EVT_CALL(SetActorSpeed, ACTOR_SELF, EVT_FLOAT(7.0)) EVT_CALL(FlyToGoal, ACTOR_SELF, 0, 0, EASING_SIN_OUT) EVT_CALL(SetAnimation, ACTOR_SELF, 1, ANIM_BattleLakilester_Idle) EVT_RETURN EVT_END }; EvtScript N(handleEvent) = { EVT_CALL(UseIdleAnimation, ACTOR_SELF, FALSE) EVT_CALL(EnableIdleScript, ACTOR_SELF, 0) EVT_CALL(GetLastEvent, ACTOR_SELF, LVar0) EVT_SWITCH(LVar0) EVT_CASE_OR_EQ(EVENT_HIT_COMBO) EVT_CASE_OR_EQ(EVENT_HIT) EVT_SET_CONST(LVar0, 1) EVT_SET_CONST(LVar1, ANIM_BattleLakilester_Hurt) EVT_EXEC_WAIT(EVS_DoNormalHit) EVT_END_CASE_GROUP EVT_CASE_EQ(EVENT_BURN_HIT) EVT_SET_CONST(LVar0, 1) EVT_SET_CONST(LVar1, ANIM_BattleLakilester_BurnHurt) EVT_SET_CONST(LVar2, ANIM_BattleLakilester_BurnStill) EVT_EXEC_WAIT(DoBurnHit) EVT_CASE_EQ(EVENT_BURN_DEATH) EVT_SET_CONST(LVar0, 1) EVT_SET_CONST(LVar1, ANIM_BattleLakilester_BurnHurt) EVT_SET_CONST(LVar2, ANIM_BattleLakilester_BurnStill) EVT_EXEC_WAIT(DoBurnHit) EVT_SET_CONST(LVar0, 1) EVT_SET_CONST(LVar1, ANIM_BattleLakilester_BurnStill) EVT_EXEC_WAIT(EVS_DoDeath) EVT_RETURN EVT_CASE_EQ(EVENT_SPIN_SMASH_HIT) EVT_SET_CONST(LVar0, 1) EVT_SET_CONST(LVar1, ANIM_BattleLakilester_Hurt) EVT_EXEC_WAIT(DoSpinSmashHit) EVT_CASE_EQ(EVENT_SPIN_SMASH_DEATH) EVT_SET_CONST(LVar0, 1) EVT_SET_CONST(LVar1, ANIM_BattleLakilester_Hurt) EVT_EXEC_WAIT(DoSpinSmashHit) EVT_SET_CONST(LVar0, 1) EVT_SET_CONST(LVar1, ANIM_BattleLakilester_Dead) EVT_EXEC_WAIT(EVS_DoDeath) EVT_RETURN EVT_CASE_EQ(EVENT_SHOCK_HIT) EVT_SET_CONST(LVar0, 1) EVT_SET_CONST(LVar1, ANIM_BattleLakilester_Hurt) EVT_EXEC_WAIT(DoShockHit) EVT_SET_CONST(LVar0, 1) EVT_SET_CONST(LVar1, ANIM_BattleLakilester_Hurt) EVT_EXEC_WAIT(DoJumpBack) EVT_EXEC_WAIT(N(returnHome)) EVT_CASE_EQ(EVENT_SHOCK_DEATH) EVT_SET_CONST(LVar0, 1) EVT_SET_CONST(LVar1, ANIM_BattleLakilester_Hurt) EVT_EXEC_WAIT(DoShockHit) EVT_SET_CONST(LVar0, 1) EVT_SET_CONST(LVar1, ANIM_BattleLakilester_Dead) EVT_EXEC_WAIT(EVS_DoDeath) EVT_RETURN EVT_CASE_OR_EQ(EVENT_ZERO_DAMAGE) EVT_CASE_OR_EQ(EVENT_IMMUNE) EVT_CASE_OR_EQ(EVENT_AIR_LIFT_FAILED) EVT_SET_CONST(LVar0, 1) EVT_SET_CONST(LVar1, ANIM_BattleLakilester_Idle) EVT_EXEC_WAIT(DoImmune) EVT_END_CASE_GROUP EVT_CASE_EQ(EVENT_DEATH) EVT_SET_CONST(LVar0, 1) EVT_SET_CONST(LVar1, ANIM_BattleLakilester_Hurt) EVT_EXEC_WAIT(EVS_DoNormalHit) EVT_WAIT(10) EVT_SET_CONST(LVar0, 1) EVT_SET_CONST(LVar1, ANIM_BattleLakilester_Dead) EVT_EXEC_WAIT(EVS_DoDeath) EVT_RETURN EVT_CASE_EQ(EVENT_BEGIN_FIRST_STRIKE) EVT_CALL(SetActorPos, ACTOR_SELF, 20, 0, 0) EVT_CALL(HPBarToCurrent, ACTOR_SELF) EVT_CASE_EQ(EVENT_END_FIRST_STRIKE) EVT_EXEC_WAIT(N(returnHome)) EVT_CALL(HPBarToHome, ACTOR_SELF) EVT_CASE_EQ(EVENT_RECOVER_STATUS) EVT_SET_CONST(LVar0, 1) EVT_SET_CONST(LVar1, ANIM_BattleLakilester_Idle) EVT_EXEC_WAIT(DoRecover) EVT_CASE_EQ(EVENT_SCARE_AWAY) EVT_SET_CONST(LVar0, 1) EVT_SET_CONST(LVar1, ANIM_BattleLakilester_Run) EVT_SET_CONST(LVar2, ANIM_BattleLakilester_Hurt) EVT_EXEC_WAIT(DoScareAway) EVT_RETURN EVT_CASE_EQ(EVENT_BEGIN_AIR_LIFT) EVT_SET_CONST(LVar0, 1) EVT_SET_CONST(LVar1, ANIM_BattleLakilester_Hurt) EVT_EXEC_WAIT(DoAirLift) EVT_CASE_EQ(EVENT_BLOW_AWAY) EVT_SET_CONST(LVar0, 1) EVT_SET_CONST(LVar1, ANIM_BattleLakilester_Hurt) EVT_EXEC_WAIT(DoBlowAway) EVT_RETURN EVT_CASE_DEFAULT EVT_END_SWITCH EVT_CALL(EnableIdleScript, ACTOR_SELF, 1) EVT_CALL(UseIdleAnimation, ACTOR_SELF, TRUE) EVT_RETURN EVT_END }; EvtScript N(attack) = { EVT_CALL(UseIdleAnimation, ACTOR_SELF, FALSE) EVT_CALL(EnableIdleScript, ACTOR_SELF, 0) EVT_CALL(SetTargetActor, ACTOR_SELF, ACTOR_PLAYER) EVT_CALL(UseBattleCamPreset, BTL_CAM_ENEMY_APPROACH) EVT_CALL(BattleCamTargetActor, ACTOR_SELF) EVT_CALL(func_8024ECF8, BTL_CAM_MODEY_MINUS_1, BTL_CAM_MODEX_1, FALSE) EVT_CALL(SetAnimation, ACTOR_SELF, 1, ANIM_BattleLakilester_Run) EVT_CALL(GetActorPos, ACTOR_SELF, LVar0, LVar1, LVar2) EVT_CALL(SetGoalPos, ACTOR_SELF, 20, 30, LVar2) EVT_CALL(FlyToGoal, ACTOR_SELF, 30, 0, EASING_COS_IN_OUT) EVT_CALL(SetAnimation, ACTOR_SELF, 1, ANIM_BattleLakilester_Idle) EVT_CALL(GetActorPos, ACTOR_SELF, LVar0, LVar1, LVar2) EVT_CALL(GetStatusFlags, ACTOR_SELF, LVarA) EVT_IF_FLAG(LVarA, STATUS_FLAG_SHRINK) EVT_ADD(LVar0, -1) EVT_ADD(LVar1, 4) EVT_ADD(LVar2, 2) EVT_CALL(SetPartScale, ACTOR_SELF, 2, EVT_FLOAT(0.4), EVT_FLOAT(0.4), EVT_FLOAT(0.4)) EVT_ELSE EVT_ADD(LVar0, -3) EVT_ADD(LVar1, 10) EVT_ADD(LVar2, 5) EVT_CALL(SetPartScale, ACTOR_SELF, 2, EVT_FLOAT(1.0), EVT_FLOAT(1.0), EVT_FLOAT(1.0)) EVT_END_IF EVT_CALL(SetPartPos, ACTOR_SELF, 2, LVar0, LVar1, LVar2) EVT_WAIT(1) EVT_CALL(SetPartFlagBits, ACTOR_SELF, 2, ACTOR_PART_FLAG_INVISIBLE, FALSE) EVT_CALL(SetAnimation, ACTOR_SELF, 2, ANIM_BattleLakilester_Spiny) EVT_CALL(SetAnimation, ACTOR_SELF, 1, ANIM_BattleLakilester_LiftSpiny) EVT_LOOP(4) EVT_CALL(GetStatusFlags, ACTOR_SELF, LVarA) EVT_IF_FLAG(LVarA, STATUS_FLAG_SHRINK) EVT_ADDF(LVar1, EVT_FLOAT(2.4)) EVT_ELSE EVT_ADD(LVar1, 6) EVT_END_IF EVT_CALL(SetPartPos, ACTOR_SELF, 2, LVar0, LVar1, LVar2) EVT_WAIT(1) EVT_END_LOOP EVT_CALL(GetActorPos, ACTOR_SELF, LVar0, LVar1, LVar2) EVT_CALL(GetStatusFlags, ACTOR_SELF, LVarA) EVT_IF_FLAG(LVarA, STATUS_FLAG_SHRINK) EVT_ADD(LVar0, -3) EVT_ADD(LVar1, 16) EVT_ADD(LVar2, 2) EVT_SETF(LVar3, EVT_FLOAT(0.4)) EVT_ELSE EVT_ADD(LVar0, -8) EVT_ADD(LVar1, 40) EVT_ADD(LVar2, 5) EVT_SETF(LVar3, EVT_FLOAT(1.0)) EVT_END_IF EVT_PLAY_EFFECT(EFFECT_ENERGY_IN_OUT, 0, LVar0, LVar1, LVar2, LVar3, 30, 0) EVT_CALL(PlaySoundAtActor, ACTOR_SELF, SOUND_2C5) EVT_THREAD EVT_LOOP(15) EVT_CALL(SetActorDispOffset, ACTOR_SELF, 1, 0, 0) EVT_CALL(SetPartDispOffset, ACTOR_SELF, 2, 1, 0, 0) EVT_WAIT(1) EVT_CALL(SetActorDispOffset, ACTOR_SELF, -1, 0, 0) EVT_CALL(SetPartDispOffset, ACTOR_SELF, 2, -1, 0, 0) EVT_WAIT(1) EVT_END_LOOP EVT_CALL(SetActorDispOffset, ACTOR_SELF, 0, 0, 0) EVT_CALL(SetPartDispOffset, ACTOR_SELF, 2, 0, 0, 0) EVT_END_THREAD EVT_CALL(SetGoalToTarget, ACTOR_SELF) EVT_WAIT(10) EVT_CALL(SetAnimation, ACTOR_SELF, 1, ANIM_BattleLakilester_HoldSpiny) EVT_WAIT(10) EVT_CALL(SetAnimation, ACTOR_SELF, 1, ANIM_BattleLakilester_StrainHoldSpiny) EVT_WAIT(10) EVT_CALL(SetAnimation, ACTOR_SELF, 1, ANIM_BattleLakilester_ThrowSpiny) EVT_WAIT(3) EVT_CALL(PlaySoundAtPart, ACTOR_SELF, 2, SOUND_2C6) EVT_CALL(SetPartSounds, ACTOR_SELF, 2, ACTOR_SOUND_JUMP, 0, 0) EVT_CALL(EnemyTestTarget, ACTOR_SELF, LVar0, 0, 0, 1, BS_FLAGS1_10) EVT_SWITCH(LVar0) EVT_CASE_OR_EQ(HIT_RESULT_MISS) EVT_CASE_OR_EQ(HIT_RESULT_LUCKY) EVT_SET(LVarA, LVar0) EVT_CALL(SetAnimation, ACTOR_SELF, 2, ANIM_BattleLakilester_SpinySpin) EVT_CALL(SetPartJumpGravity, ACTOR_SELF, 2, EVT_FLOAT(1.5)) EVT_CALL(SetGoalToTarget, ACTOR_SELF) EVT_CALL(GetGoalPos, ACTOR_SELF, LVar0, LVar1, LVar2) EVT_CALL(RandInt, 100, LVar3) EVT_SUB(LVar3, 50) EVT_ADD(LVar0, LVar3) EVT_CALL(JumpPartTo, ACTOR_SELF, 2, LVar0, 0, LVar2, 20, TRUE) EVT_CALL(ResetAllActorSounds, ACTOR_SELF) EVT_THREAD EVT_ADD(LVar0, -50) EVT_CALL(JumpPartTo, ACTOR_SELF, 2, LVar0, 0, LVar2, 15, TRUE) EVT_CALL(SetPartFlagBits, ACTOR_SELF, 2, ACTOR_PART_FLAG_INVISIBLE, TRUE) EVT_END_THREAD EVT_IF_EQ(LVarA, HIT_RESULT_LUCKY) EVT_CALL(EnemyTestTarget, ACTOR_SELF, LVarA, DAMAGE_TYPE_TRIGGER_LUCKY, 0, 0, 0) EVT_END_IF EVT_WAIT(15) EVT_CALL(YieldTurn) EVT_CALL(UseBattleCamPreset, BTL_CAM_DEFAULT) EVT_CALL(AddActorDecoration, ACTOR_SELF, 1, 0, ACTOR_DECORATION_SWEAT) EVT_CALL(SetActorYaw, ACTOR_SELF, 180) EVT_EXEC_WAIT(N(returnHome)) EVT_CALL(SetActorYaw, ACTOR_SELF, 0) EVT_CALL(RemoveActorDecoration, ACTOR_SELF, 1, 0) EVT_CALL(EnableIdleScript, ACTOR_SELF, 1) EVT_CALL(UseIdleAnimation, ACTOR_SELF, TRUE) EVT_RETURN EVT_END_CASE_GROUP EVT_END_SWITCH EVT_CALL(SetAnimation, ACTOR_SELF, 2, ANIM_BattleLakilester_SpinySpin) EVT_CALL(SetPartJumpGravity, ACTOR_SELF, 2, EVT_FLOAT(1.5)) EVT_CALL(SetGoalToTarget, ACTOR_SELF) EVT_CALL(GetGoalPos, ACTOR_SELF, LVar0, LVar1, LVar2) EVT_CALL(JumpPartTo, ACTOR_SELF, 2, LVar0, LVar1, LVar2, 20, TRUE) EVT_CALL(ResetAllActorSounds, ACTOR_SELF) EVT_THREAD EVT_ADD(LVar0, -50) EVT_CALL(JumpPartTo, ACTOR_SELF, 2, LVar0, 0, LVar2, 15, TRUE) EVT_CALL(SetPartFlagBits, ACTOR_SELF, 2, ACTOR_PART_FLAG_INVISIBLE, TRUE) EVT_END_THREAD EVT_WAIT(2) EVT_CALL(EnemyDamageTarget, ACTOR_SELF, LVar0, DAMAGE_TYPE_NO_CONTACT, 0, 0, 4, BS_FLAGS1_SP_EVT_ACTIVE) EVT_SWITCH(LVar0) EVT_CASE_OR_EQ(HIT_RESULT_HIT) EVT_CASE_OR_EQ(HIT_RESULT_NO_DAMAGE) EVT_CALL(UseBattleCamPreset, BTL_CAM_DEFAULT) EVT_WAIT(15) EVT_CALL(YieldTurn) EVT_EXEC_WAIT(N(returnHome)) EVT_END_CASE_GROUP EVT_END_SWITCH EVT_CALL(EnableIdleScript, ACTOR_SELF, 1) EVT_CALL(UseIdleAnimation, ACTOR_SELF, TRUE) EVT_RETURN EVT_END }; EvtScript N(takeTurn) = { EVT_EXEC_WAIT(N(attack)) EVT_RETURN EVT_END };