Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
ghost_bombette.inc.c
Go to the documentation of this file.
1#include "battle/battle.h"
2#include "script_api/battle.h"
3#include "sprite/npc/BattleBombette.h"
4
5#define NAMESPACE A(bombette_clone)
6
7extern EvtScript N(EVS_Init);
8extern EvtScript N(EVS_Idle);
9extern EvtScript N(EVS_TakeTurn);
10extern EvtScript N(EVS_HandleEvent);
11
12s32 N(DefaultAnims)[] = {
13 STATUS_KEY_NORMAL, ANIM_BattleBombette_Idle,
14 STATUS_KEY_STONE, ANIM_BattleBombette_Still,
15 STATUS_KEY_SLEEP, ANIM_BattleBombette_Still,
16 STATUS_KEY_POISON, ANIM_BattleBombette_Idle,
17 STATUS_KEY_STOP, ANIM_BattleBombette_Still,
18 STATUS_KEY_STATIC, ANIM_BattleBombette_Idle,
19 STATUS_KEY_PARALYZE, ANIM_BattleBombette_Still,
20 STATUS_KEY_DIZZY, ANIM_BattleBombette_Injured,
21 STATUS_KEY_FEAR, ANIM_BattleBombette_Injured,
23};
24
25s32 N(DefenseTable)[] = {
28};
29
30s32 N(StatusTable)[] = {
53};
54
55ActorPartBlueprint N(ActorParts)[] = {
56 {
58 .index = PRT_MAIN,
59 .posOffset = { 0, 0, 0 },
60 .targetOffset = { 0, 22 },
61 .opacity = 255,
62 .idleAnimations = N(DefaultAnims),
63 .defenseTable = N(DefenseTable),
64 .eventFlags = 0,
65 .elementImmunityFlags = 0,
66 .projectileTargetOffset = { -2, -7 },
67 },
68};
69
70ActorBlueprint NAMESPACE = {
71 .flags = 0,
72 .type = ACTOR_TYPE_GHOST_BOMBETTE,
73 .level = ACTOR_LEVEL_GHOST_BOMBETTE,
74 .maxHP = 15,
75 .partCount = ARRAY_COUNT(N(ActorParts)),
76 .partsData = N(ActorParts),
77 .initScript = &N(EVS_Init),
78 .statusTable = N(StatusTable),
79 .escapeChance = 50,
80 .airLiftChance = 80,
81 .hurricaneChance = 70,
82 .spookChance = 50,
83 .upAndAwayChance = 95,
84 .spinSmashReq = 0,
85 .powerBounceChance = 90,
86 .coinReward = 2,
87 .size = { 30, 28 },
88 .healthBarOffset = { 0, 0 },
89 .statusIconOffset = { -10, 20 },
90 .statusTextOffset = { 10, 20 },
91};
92
93EvtScript N(EVS_Init) = {
94 Call(BindTakeTurn, ACTOR_SELF, Ref(N(EVS_TakeTurn)))
95 Call(BindIdle, ACTOR_SELF, Ref(N(EVS_Idle)))
96 Call(BindHandleEvent, ACTOR_SELF, Ref(N(EVS_HandleEvent)))
97 Return
98 End
99};
100
101EvtScript N(EVS_Idle) = {
102 Return
103 End
104};
105
106EvtScript N(EVS_PlayDetonateFX) = {
107 Thread
108 Call(ShakeCam, CAM_BATTLE, 0, 2, Float(0.75))
109 Call(ShakeCam, CAM_BATTLE, 0, 5, Float(3.0))
110 Call(ShakeCam, CAM_BATTLE, 0, 10, Float(4.5))
111 Call(ShakeCam, CAM_BATTLE, 0, 5, Float(3.0))
113 Call(GetActorPos, ACTOR_SELF, LVar0, LVar1, LVar2)
114 Add(LVar2, 2)
115 PlayEffect(EFFECT_SMOKE_RING, 0, LVar0, LVar1, LVar2, 0)
116 Add(LVar1, 20)
117 Add(LVar2, 2)
118 PlayEffect(EFFECT_EXPLOSION, 0, LVar0, LVar1, LVar2, 0)
119 Call(PlaySoundAtActor, ACTOR_SELF, SOUND_BOMB_BLAST)
120 Return
121 End
122};
123
124EvtScript N(EVS_HandleEvent) = {
125 Call(UseIdleAnimation, ACTOR_SELF, FALSE)
126 Call(EnableIdleScript, ACTOR_SELF, IDLE_SCRIPT_DISABLE)
127 Call(GetLastEvent, ACTOR_SELF, LVar0)
130 SetConst(LVar0, PRT_MAIN)
131 SetConst(LVar1, ANIM_BattleBombette_Hurt)
134 SetConst(LVar0, PRT_MAIN)
135 SetConst(LVar1, ANIM_BattleBombette_Hurt)
137 Call(GetLastElement, LVar1)
139 Call(SetAnimation, ACTOR_SELF, PRT_MAIN, ANIM_BattleBombette_BurnHurt)
140 Wait(20)
141 ExecWait(N(EVS_PlayDetonateFX))
142 ExecWait(A(EVS_Duplighost_OnDeath))
143 Call(UseBattleCamPreset, BTL_CAM_DEFAULT)
144 SetConst(LVar0, PRT_MAIN)
145 SetConst(LVar1, ANIM_BattleBombette_BurnStill)
148 Return
149 EndIf
151 SetConst(LVar0, PRT_MAIN)
152 SetConst(LVar1, ANIM_BattleBombette_BurnHurt)
153 SetConst(LVar2, ANIM_BattleBombette_BurnStill)
155 ExecWait(N(EVS_PlayDetonateFX))
156 ExecWait(A(EVS_Duplighost_OnDeath))
157 SetConst(LVar0, PRT_MAIN)
158 SetConst(LVar1, ANIM_BattleBombette_BurnStill)
161 Return
163 SetConst(LVar0, PRT_MAIN)
164 SetConst(LVar1, ANIM_BattleBombette_BurnHurt)
165 SetConst(LVar2, ANIM_BattleBombette_BurnStill)
167 ExecWait(N(EVS_PlayDetonateFX))
168 ExecWait(A(EVS_Duplighost_OnDeath))
169 SetConst(LVar0, PRT_MAIN)
170 SetConst(LVar1, ANIM_BattleBombette_BurnStill)
173 Return
175 SetConst(LVar0, PRT_MAIN)
176 SetConst(LVar1, ANIM_BattleBombette_Hurt)
179 ExecWait(A(EVS_Duplighost_OnDeath))
180 SetConst(LVar0, PRT_MAIN)
181 SetConst(LVar1, ANIM_BattleBombette_Hurt)
183 SetConst(LVar0, PRT_MAIN)
184 SetConst(LVar1, ANIM_BattleBombette_Hurt)
186 Return
189 Call(HPBarToCurrent, ACTOR_SELF)
190 Call(SetAnimation, ACTOR_SELF, PRT_MAIN, ANIM_BattleBombette_BurnHurt)
191 Wait(20)
192 ExecWait(N(EVS_PlayDetonateFX))
193 ExecWait(A(EVS_Duplighost_OnDeath))
194 Call(UseBattleCamPreset, BTL_CAM_DEFAULT)
195 SetConst(LVar0, PRT_MAIN)
196 SetConst(LVar1, ANIM_BattleBombette_BurnStill)
199 Return
204 SetConst(LVar0, PRT_MAIN)
205 SetConst(LVar1, ANIM_BattleBombette_Idle)
209 ExecWait(A(EVS_Duplighost_OnDeath))
210 SetConst(LVar0, PRT_MAIN)
211 SetConst(LVar1, ANIM_BattleBombette_Hurt)
213 Wait(10)
214 SetConst(LVar0, PRT_MAIN)
215 SetConst(LVar1, ANIM_BattleBombette_Hurt)
217 Return
219 SetConst(LVar0, PRT_MAIN)
220 SetConst(LVar1, ANIM_BattleBombette_Idle)
223 SetConst(LVar0, PRT_MAIN)
224 SetConst(LVar1, ANIM_BattleBombette_Run)
225 SetConst(LVar2, ANIM_BattleBombette_Hurt)
227 Return
229 SetConst(LVar0, PRT_MAIN)
230 SetConst(LVar1, ANIM_BattleBombette_Run)
233 SetConst(LVar0, PRT_MAIN)
234 SetConst(LVar1, ANIM_BattleBombette_Hurt)
236 Return
239 Call(EnableIdleScript, ACTOR_SELF, IDLE_SCRIPT_ENABLE)
240 Call(UseIdleAnimation, ACTOR_SELF, TRUE)
241 Return
242 End
243};
244
245#include "common/UnkActorPosFunc.inc.c"
246
247EvtScript N(EVS_TakeTurn) = {
248 Call(UseIdleAnimation, ACTOR_SELF, FALSE)
249 Call(EnableIdleScript, ACTOR_SELF, IDLE_SCRIPT_DISABLE)
250 Wait(10)
251 Call(UseBattleCamPreset, BTL_CAM_ENEMY_APPROACH)
252 Call(BattleCamTargetActor, ACTOR_SELF)
253 Call(SetTargetActor, ACTOR_SELF, ACTOR_PLAYER)
254 Call(SetGoalToTarget, ACTOR_SELF)
255 Call(AddGoalPos, ACTOR_SELF, 40, 0, 0)
256 Call(MoveBattleCamOver, 30)
257 Call(SetAnimation, ACTOR_SELF, PRT_MAIN, ANIM_BattleBombette_Run)
258 Call(RunToGoal, ACTOR_SELF, 30, FALSE)
259 Call(SetAnimation, ACTOR_SELF, PRT_MAIN, ANIM_BattleBombette_Idle)
260 Call(SetAnimation, ACTOR_SELF, PRT_MAIN, ANIM_BattleBombette_Brace)
261 Wait(15)
263 Call(PlaySoundAtActor, ACTOR_SELF, SOUND_BOMBETTE_BODY_SLAM)
264 Call(EnemyTestTarget, ACTOR_SELF, LVar0, 0, 0, 1, BS_FLAGS1_INCLUDE_POWER_UPS)
268 Set(LVarA, LVar0)
269 Call(SetGoalToTarget, ACTOR_SELF)
270 Call(AddGoalPos, ACTOR_SELF, -10, 0, 0)
271 Call(SetAnimation, ACTOR_SELF, PRT_MAIN, ANIM_BattleBombette_BodySlam)
272 Call(RunToGoal, ACTOR_SELF, 5, FALSE)
273 Call(SetAnimation, ACTOR_SELF, PRT_MAIN, ANIM_BattleBombette_Idle)
274 Thread
275 Call(SetActorRotationOffset, ACTOR_SELF, 0, 15, 0)
276 Set(LVar0, 0)
277 Loop(10)
278 Add(LVar0, 72)
279 Call(SetActorRotation, ACTOR_SELF, 0, 0, LVar0)
280 Wait(1)
281 EndLoop
282 Call(SetActorRotationOffset, ACTOR_SELF, 0, 0, 0)
284 Call(AddGoalPos, ACTOR_SELF, -60, 0, 0)
285 Call(RunToGoal, ACTOR_SELF, 10, FALSE)
286 Call(SetAnimation, ACTOR_SELF, PRT_MAIN, ANIM_BattleBombette_Idle)
287 Thread
288 Call(N(UnkActorPosFunc))
291 Call(EnemyTestTarget, ACTOR_SELF, LVar0, DAMAGE_TYPE_TRIGGER_LUCKY, 0, 0, 0)
292 EndIf
293 Wait(20)
294 Call(UseBattleCamPreset, BTL_CAM_DEFAULT)
295 Call(YieldTurn)
296 Call(SetAnimation, ACTOR_SELF, PRT_MAIN, ANIM_BattleBombette_Run)
297 Call(SetGoalToHome, ACTOR_SELF)
298 Call(SetActorSpeed, ACTOR_SELF, Float(5.0))
299 Call(RunToGoal, ACTOR_SELF, 0, FALSE)
300 Call(EnableIdleScript, ACTOR_SELF, IDLE_SCRIPT_ENABLE)
301 Call(UseIdleAnimation, ACTOR_SELF, TRUE)
302 Return
305 Set(LVarA, LVar0)
306 Call(SetGoalToTarget, ACTOR_SELF)
307 Call(SetAnimation, ACTOR_SELF, PRT_MAIN, ANIM_BattleBombette_BodySlam)
308 Call(RunToGoal, ACTOR_SELF, 4, FALSE)
309 Call(GetActorVar, ACTOR_SELF, AVAR_Copy_PartnerLevel, LVar9)
312 Wait(2)
313#if VERSION_JP
314 Call(EnemyDamageTarget, ACTOR_SELF, LVar0, 0, 0, 0, 1, BS_FLAGS1_TRIGGER_EVENTS)
315#else
316 Call(EnemyDamageTarget, ACTOR_SELF, LVar0, 0, 0, 0, 2, BS_FLAGS1_TRIGGER_EVENTS)
317#endif
319 Wait(2)
320 Call(EnemyDamageTarget, ACTOR_SELF, LVar0, 0, 0, 0, 3, BS_FLAGS1_TRIGGER_EVENTS)
322 Wait(2)
323 Call(EnemyDamageTarget, ACTOR_SELF, LVar0, 0, 0, 0, 5, BS_FLAGS1_TRIGGER_EVENTS)
328 Call(SetAnimation, ACTOR_SELF, PRT_MAIN, ANIM_BattleBombette_Idle)
329 Call(UseBattleCamPreset, BTL_CAM_DEFAULT)
330 Call(MoveBattleCamOver, 8)
331 Call(SetAnimation, ACTOR_SELF, PRT_MAIN, ANIM_BattleBombette_Backfire2)
332 Call(GetGoalPos, ACTOR_SELF, LVar0, LVar1, LVar2)
333 Add(LVar0, 40)
334 Set(LVar1, 0)
335 Call(SetActorJumpGravity, ACTOR_SELF, Float(1.4))
336 Call(SetGoalPos, ACTOR_SELF, LVar0, LVar1, LVar2)
337 Call(JumpToGoal, ACTOR_SELF, 20, FALSE, TRUE, FALSE)
338 Call(SetAnimation, ACTOR_SELF, PRT_MAIN, ANIM_BattleBombette_Backfire1)
339 Wait(1)
340 Call(SetAnimation, ACTOR_SELF, PRT_MAIN, ANIM_BattleBombette_Backfire2)
341 Add(LVar0, 40)
342 Call(SetGoalPos, ACTOR_SELF, LVar0, LVar1, LVar2)
343 Call(JumpToGoal, ACTOR_SELF, 8, FALSE, TRUE, FALSE)
344 Call(SetAnimation, ACTOR_SELF, PRT_MAIN, ANIM_BattleBombette_Backfire1)
345 Wait(1)
346 Call(SetAnimation, ACTOR_SELF, PRT_MAIN, ANIM_BattleBombette_Backfire2)
347 Add(LVar0, 20)
348 Call(SetGoalPos, ACTOR_SELF, LVar0, LVar1, LVar2)
349 Call(JumpToGoal, ACTOR_SELF, 6, FALSE, TRUE, FALSE)
350 Call(SetAnimation, ACTOR_SELF, PRT_MAIN, ANIM_BattleBombette_Backfire1)
351 Wait(1)
352 Call(SetAnimation, ACTOR_SELF, PRT_MAIN, ANIM_BattleBombette_Backfire2)
353 Add(LVar0, 10)
354 Call(SetGoalPos, ACTOR_SELF, LVar0, LVar1, LVar2)
355 Call(JumpToGoal, ACTOR_SELF, 4, FALSE, TRUE, FALSE)
356 Call(SetAnimation, ACTOR_SELF, PRT_MAIN, ANIM_BattleBombette_Backfire1)
357 Wait(1)
358 Call(SetAnimation, ACTOR_SELF, PRT_MAIN, ANIM_BattleBombette_Idle)
359 Wait(8)
360 Call(YieldTurn)
361 Call(SetAnimation, ACTOR_SELF, PRT_MAIN, ANIM_BattleBombette_Run)
362 Call(SetGoalToHome, ACTOR_SELF)
363 Call(SetActorSpeed, ACTOR_SELF, Float(5.0))
364 Call(RunToGoal, ACTOR_SELF, 0, FALSE)
367 Call(EnableIdleScript, ACTOR_SELF, IDLE_SCRIPT_ENABLE)
368 Call(UseIdleAnimation, ACTOR_SELF, TRUE)
369 Return
370 End
371};
372
373Formation A(BombetteCloneFormation) = {
374 ACTOR_BY_POS(NAMESPACE, A(DuplighostSummonPos), 0),
375};
Bytecode EvtScript[]
@ ACTOR_SOUND_WALK
Definition enums.h:2034
@ BS_FLAGS1_TRIGGER_EVENTS
Definition enums.h:3575
@ BS_FLAGS1_INCLUDE_POWER_UPS
Definition enums.h:3571
@ ELEMENT_END
Definition enums.h:2114
@ ELEMENT_NORMAL
Definition enums.h:2115
@ STATUS_KEY_PARALYZE
Definition enums.h:2201
@ STATUS_TURN_MOD_DEFAULT
Definition enums.h:2227
@ STATUS_TURN_MOD_PARALYZE
Definition enums.h:2234
@ STATUS_KEY_FROZEN
Definition enums.h:2203
@ STATUS_TURN_MOD_SLEEP
Definition enums.h:2228
@ STATUS_TURN_MOD_DIZZY
Definition enums.h:2232
@ STATUS_KEY_STATIC
Definition enums.h:2207
@ STATUS_END
Definition enums.h:2196
@ STATUS_TURN_MOD_POISON
Definition enums.h:2233
@ STATUS_KEY_FEAR
Definition enums.h:2199
@ STATUS_TURN_MOD_STOP
Definition enums.h:2237
@ STATUS_KEY_SLEEP
Definition enums.h:2202
@ STATUS_KEY_STONE
Definition enums.h:2208
@ STATUS_KEY_STOP
Definition enums.h:2204
@ STATUS_TURN_MOD_FROZEN
Definition enums.h:2230
@ STATUS_KEY_SHRINK
Definition enums.h:2206
@ STATUS_KEY_DIZZY
Definition enums.h:2200
@ STATUS_KEY_POISON
Definition enums.h:2205
@ STATUS_TURN_MOD_STATIC
Definition enums.h:2229
@ STATUS_TURN_MOD_FEAR
Definition enums.h:2231
@ STATUS_KEY_NORMAL
Definition enums.h:2197
@ STATUS_TURN_MOD_SHRINK
Definition enums.h:2235
@ STATUS_KEY_DEFAULT
Definition enums.h:2198
@ HIT_RESULT_NO_DAMAGE
Definition enums.h:1952
@ HIT_RESULT_HIT
Definition enums.h:1950
@ HIT_RESULT_LUCKY
Definition enums.h:1955
@ HIT_RESULT_MISS
Definition enums.h:1956
@ BTL_CAM_DEFAULT
Definition enums.h:4824
@ BTL_CAM_ENEMY_APPROACH
Definition enums.h:4885
@ IDLE_SCRIPT_ENABLE
Definition enums.h:6408
@ IDLE_SCRIPT_DISABLE
Definition enums.h:6407
@ PARTNER_RANK_NORMAL
Definition enums.h:2018
@ PARTNER_RANK_SUPER
Definition enums.h:2019
@ PARTNER_RANK_ULTRA
Definition enums.h:2020
@ SOUND_NONE
Definition enums.h:547
@ SOUND_BOMB_BLAST
Definition enums.h:1415
@ SOUND_BOMBETTE_BODY_SLAM
Definition enums.h:1341
@ ACTOR_PLAYER
Definition enums.h:2085
@ ACTOR_SELF
Definition enums.h:2084
@ EVENT_HIT
Definition enums.h:2132
@ EVENT_SCARE_AWAY
Definition enums.h:2174
@ EVENT_BURN_HIT
Definition enums.h:2136
@ EVENT_IMMUNE
Definition enums.h:2146
@ EVENT_BURN_DEATH
Definition enums.h:2157
@ EVENT_ZERO_DAMAGE
Definition enums.h:2144
@ EVENT_SHOCK_DEATH
Definition enums.h:2159
@ EVENT_SPIN_SMASH_HIT
Definition enums.h:2133
@ EVENT_SPIN_SMASH_DEATH
Definition enums.h:2154
@ EVENT_HIT_COMBO
Definition enums.h:2131
@ EVENT_AIR_LIFT_FAILED
Definition enums.h:2152
@ EVENT_BEGIN_AIR_LIFT
Definition enums.h:2175
@ EVENT_DEATH
Definition enums.h:2153
@ EVENT_SHOCK_HIT
Definition enums.h:2165
@ EVENT_RECOVER_STATUS
Definition enums.h:2167
@ EVENT_BLOW_AWAY
Definition enums.h:2143
@ ACTOR_PART_FLAG_PRIMARY_TARGET
Definition enums.h:3362
@ CAM_BATTLE
Definition enums.h:1801
@ DAMAGE_TYPE_SHOCK
Definition enums.h:2856
@ DAMAGE_TYPE_TRIGGER_LUCKY
Definition enums.h:2881
EvtScript EVS_Enemy_ScareAway
EvtScript EVS_Enemy_Hit
EvtScript EVS_Enemy_Death
EvtScript EVS_Enemy_SpinSmashHit
EvtScript EVS_Enemy_AirLift
EvtScript EVS_Enemy_BlowAway
EvtScript EVS_Enemy_Recover
EvtScript EVS_Enemy_BurnHit
EvtScript EVS_Enemy_NoDamageHit
ApiStatus ShakeCam(Evt *script, b32 isInitialCall)
#define Switch(LVAR)
Marks the start of a switch statement.
Definition macros.h:311
#define Ref(sym)
Address/pointer constant.
Definition macros.h:60
#define Set(VAR, INT_VALUE)
Sets the given variable to a given value casted to an integer.
Definition macros.h:365
#define CaseEq(RVAR)
Marks the start of a switch case that executes only if LVAR == RVAR. It also marks the end of any pre...
Definition macros.h:319
#define End
Signals the end of EVT script data. A script missing this will likely crash on load.
Definition macros.h:213
#define Add(VAR, INT_VALUE)
Definition macros.h:376
#define EndLoop
Marks the end of a loop.
Definition macros.h:248
#define EndCaseGroup
Marks the end of a switch case group (CaseOrEq and/or CaseAndEq), stopping fallthrough.
Definition macros.h:352
#define ARRAY_COUNT(arr)
Definition macros.h:40
#define Float(DOUBLE)
Definition macros.h:51
#define CaseOrEq(RVAR)
Marks the start of a switch case that executes only if LVAR == RVAR.
Definition macros.h:341
#define EndIf
Marks the end of an if statement or an else block.
Definition macros.h:298
#define CaseDefault
Marks the start of a switch case that executes unconditionally. It also marks the end of any previous...
Definition macros.h:337
#define ExecWait(EVT_SOURCE)
Launches a new child thread.
Definition macros.h:475
#define Thread
Marks the start of a thread block.
Definition macros.h:544
#define EndThread
Marks the end of a thread block.
Definition macros.h:547
#define IfFlag(LVAR, RVAR)
Marks the beginning of an if statement that only executes if the RVAR flag is set on LVAR,...
Definition macros.h:288
#define LVar2
Definition macros.h:150
#define LVar1
Definition macros.h:149
#define LVarA
Definition macros.h:158
#define Wait(NUM_FRAMES)
Blocks for the given number of frames.
Definition macros.h:254
#define LVar9
Definition macros.h:157
#define A(sym)
Definition macros.h:36
#define PlayEffect(args...)
Definition macros.h:807
#define EndSwitch
Marks the end of a switch statement and any case.
Definition macros.h:362
#define IfEq(LVAR, RVAR)
Marks the beginning of an if statement that only executes if LVAR == RVAR.
Definition macros.h:269
#define Call(FUNC, ARGS...)
Calls a given C EVT API function with any number of arguments.
Definition macros.h:576
#define Loop(TIMES)
Marks the beginning of a loop.
Definition macros.h:245
#define LVar0
Definition macros.h:148
#define SetConst(VAR, CONST)
Sets the given variable to a given value, skipping the evt_get_variable call.
Definition macros.h:370
#define Return
Kills the current EVT thread.
Definition macros.h:217
#define ACTOR_BY_POS(_name, _pos, _priority, args...)
Definition battle.h:230
#define EXEC_DEATH_NO_SPINNING
Definition battle.h:263
FormationRow Formation[]
Definition battle.h:167