Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
bullet_bill.inc.c
Go to the documentation of this file.
1#include "common.h"
2#include "effects.h"
3#include "battle/battle.h"
4#include "script_api/battle.h"
5#include "sprite/npc/BulletBill.h"
6
7#define NAMESPACE A(bullet_bill)
8
9extern s32 N(DefaultAnims)[];
10extern EvtScript N(EVS_Init);
11extern EvtScript N(EVS_Idle);
12extern EvtScript N(EVS_TakeTurn);
13extern EvtScript N(EVS_HandleEvent);
14extern EvtScript N(EVS_MakeExplosionFX);
15
16enum N(ActorPartIDs) {
17 PRT_MAIN = 1,
18};
19
20enum N(ActorVars) {
21 AVAR_FiredFromBlaster = 0,
22 AVAR_BlasterID = 1, // actorID of Bill Blaster that fired this Bullet Bill
23};
24
25enum N(ActorParams) {
26 DMG_IMPACT = 2,
27};
28
29s32 N(DefenseTable)[] = {
32};
33
34s32 N(StatusTable)[] = {
57};
58
59ActorPartBlueprint N(ActorParts)[] = {
60 {
62 .index = PRT_MAIN,
63 .posOffset = { 0, 0, 0 },
64 .targetOffset = { 0, 16 },
65 .opacity = 255,
66 .idleAnimations = N(DefaultAnims),
67 .defenseTable = N(DefenseTable),
69 .elementImmunityFlags = 0,
70 .projectileTargetOffset = { 0, -6 },
71 },
72};
73
74ActorBlueprint NAMESPACE = {
75 .flags = ACTOR_FLAG_FLYING,
76 .type = ACTOR_TYPE_BULLET_BILL,
77 .level = ACTOR_LEVEL_BULLET_BILL,
78 .maxHP = 2,
79 .partCount = ARRAY_COUNT(N(ActorParts)),
80 .partsData = N(ActorParts),
81 .initScript = &N(EVS_Init),
82 .statusTable = N(StatusTable),
83 .escapeChance = 50,
84 .airLiftChance = 100,
85 .hurricaneChance = 100,
86 .spookChance = 0,
87 .upAndAwayChance = 95,
88 .spinSmashReq = 0,
89 .powerBounceChance = 85,
90 .coinReward = 0,
91 .size = { 28, 22 },
92 .healthBarOffset = { 0, 0 },
93 .statusIconOffset = { -10, 20 },
94 .statusTextOffset = { 10, 20 },
95};
96
97s32 N(DefaultAnims)[] = {
98 STATUS_KEY_NORMAL, ANIM_BulletBill_Idle,
99 STATUS_KEY_STONE, ANIM_BulletBill_Still,
100 STATUS_KEY_STOP, ANIM_BulletBill_Still,
101 STATUS_KEY_PARALYZE, ANIM_BulletBill_Still,
103};
104
105EvtScript N(EVS_Init) = {
106 Call(BindTakeTurn, ACTOR_SELF, Ref(N(EVS_TakeTurn)))
107 Call(BindIdle, ACTOR_SELF, Ref(N(EVS_Idle)))
108 Call(BindHandleEvent, ACTOR_SELF, Ref(N(EVS_HandleEvent)))
109 Call(GetActorVar, ACTOR_SELF, AVAR_FiredFromBlaster, LVar0)
111 Call(GetActorPos, ACTOR_SELF, LVar0, LVar1, LVar2)
112 Add(LVar1, 16)
113 Call(SetActorPos, ACTOR_SELF, LVar0, LVar1, LVar2)
114 Call(ForceHomePos, ACTOR_SELF, LVar0, LVar1, LVar2)
115 Call(HPBarToHome, ACTOR_SELF)
116 Else
117 Call(GetActorVar, ACTOR_SELF, AVAR_BlasterID, LVar0)
118 Call(GetActorPos, LVar0, LVar1, LVar2, LVar3)
119 Call(GetStatusFlags, LVar0, LVar4)
121 Set(LVar5, -13)
122 Set(LVar6, 4)
123 Else
124 Set(LVar5, -33)
125 Set(LVar6, 11)
126 EndIf
127 Add(LVar1, LVar5)
128 Add(LVar2, LVar6)
129 Call(SetActorPos, ACTOR_SELF, LVar1, LVar2, LVar3)
130 Call(CopyStatusEffects, LVar0, ACTOR_SELF)
131 Call(CopyBuffs, LVar0, ACTOR_SELF)
132 Call(SetActorSounds, ACTOR_SELF, ACTOR_SOUND_JUMP, SOUND_NONE, 0)
133 Call(GetActorPos, LVar0, LVar1, LVarB, LVarC)
134 Sub(LVar1, 90)
135 Call(SetActorJumpGravity, ACTOR_SELF, Float(0.01))
136 Call(SetAnimation, ACTOR_SELF, PRT_MAIN, ANIM_BulletBill_Tense)
137 Call(SetGoalPos, ACTOR_SELF, LVar1, LVar2, LVar3)
138 Call(JumpToGoal, ACTOR_SELF, 5, FALSE, TRUE, FALSE)
139 Call(SetAnimation, ACTOR_SELF, PRT_MAIN, ANIM_BulletBill_Idle)
140 Call(ForceHomePos, ACTOR_SELF, LVar1, LVar2, LVar3)
141 Call(HPBarToHome, ACTOR_SELF)
142 EndIf
143 Return
144 End
145};
146
147EvtScript N(EVS_Idle) = {
148 Return
149 End
150};
151
152EvtScript N(EVS_Explode) = {
153 ExecWait(N(EVS_MakeExplosionFX))
154 SetConst(LVar0, PRT_MAIN)
155 SetConst(LVar1, ANIM_BulletBill_BurnHurt)
158 Return
159 End
160};
161
162EvtScript N(EVS_HandleEvent) = {
163 Call(UseIdleAnimation, ACTOR_SELF, FALSE)
164 Call(EnableIdleScript, ACTOR_SELF, IDLE_SCRIPT_DISABLE)
165 Call(GetLastEvent, ACTOR_SELF, LVar0)
168 SetConst(LVar0, PRT_MAIN)
169 SetConst(LVar1, ANIM_BulletBill_Hurt)
172 SetConst(LVar0, PRT_MAIN)
173 SetConst(LVar1, ANIM_BulletBill_Hurt)
176 ExecWait(N(EVS_Explode))
177 Return
179 ExecWait(N(EVS_Explode))
180 Return
182 ExecWait(N(EVS_Explode))
183 Return
185 ExecWait(N(EVS_Explode))
186 Return
188 SetConst(LVar0, PRT_MAIN)
189 SetConst(LVar1, ANIM_BulletBill_Hurt)
191 ExecWait(N(EVS_Explode))
192 Return
194 SetConst(LVar0, PRT_MAIN)
195 SetConst(LVar1, ANIM_BulletBill_Hurt)
197 ExecWait(N(EVS_Explode))
198 Return
202 SetConst(LVar0, PRT_MAIN)
203 SetConst(LVar1, ANIM_BulletBill_Idle)
207 SetConst(LVar0, PRT_MAIN)
208 SetConst(LVar1, ANIM_BulletBill_Hurt)
210 ExecWait(N(EVS_Explode))
211 Return
213 ExecWait(N(EVS_Explode))
214 Return
216 SetConst(LVar0, PRT_MAIN)
217 SetConst(LVar1, ANIM_BulletBill_Idle)
220 SetConst(LVar0, PRT_MAIN)
221 SetConst(LVar1, ANIM_BulletBill_Hurt)
223 ExecWait(N(EVS_Explode))
224 Return
226 SetConst(LVar0, PRT_MAIN)
227 SetConst(LVar1, ANIM_BulletBill_Tense)
230 SetConst(LVar0, PRT_MAIN)
231 SetConst(LVar1, ANIM_BulletBill_Tense)
233 Return
236 Call(EnableIdleScript, ACTOR_SELF, IDLE_SCRIPT_ENABLE)
237 Call(UseIdleAnimation, ACTOR_SELF, TRUE)
238 Return
239 End
240};
241
242EvtScript N(EVS_TakeTurn) = {
243 Call(UseIdleAnimation, ACTOR_SELF, FALSE)
244 Call(EnableIdleScript, ACTOR_SELF, IDLE_SCRIPT_DISABLE)
245 Call(SetTargetActor, ACTOR_SELF, ACTOR_PLAYER)
246 Call(SetGoalToTarget, ACTOR_SELF)
247 Call(UseBattleCamPreset, BTL_CAM_ENEMY_APPROACH)
248 Call(BattleCamTargetActor, ACTOR_SELF)
249 Call(SetBattleCamTargetingModes, BTL_CAM_YADJ_TARGET, BTL_CAM_XADJ_AVG, FALSE)
250 Call(SetAnimation, ACTOR_SELF, PRT_MAIN, ANIM_BulletBill_Fire)
251 Call(SetActorDispOffset, ACTOR_SELF, 0, -1, 0)
252 Wait(1)
253 Call(SetActorDispOffset, ACTOR_SELF, 0, -2, 0)
254 Wait(15)
255 Call(UseBattleCamPresetImmediately, BTL_CAM_REPOSITION)
256 Call(EnemyTestTarget, ACTOR_SELF, LVar0, 0, 0, 2, BS_FLAGS1_INCLUDE_POWER_UPS)
260 Set(LVarA, LVar0)
261 Call(GetActorPos, ACTOR_SELF, LVar0, LVar1, LVar2)
262 Set(LVar3, LVar1)
263 Call(GetActorPos, ACTOR_PLAYER, LVar0, LVar1, LVar2)
264 Set(LVar1, LVar3)
265 Sub(LVar0, 90)
266 Call(SetActorJumpGravity, ACTOR_SELF, Float(0.01))
267 Call(SetGoalPos, ACTOR_SELF, LVar0, LVar1, LVar2)
268 Call(JumpToGoal, ACTOR_SELF, 18, FALSE, TRUE, FALSE)
270 Call(EnemyTestTarget, ACTOR_SELF, LVar0, DAMAGE_TYPE_TRIGGER_LUCKY, 0, 0, 0)
271 EndIf
272 Call(UseBattleCamPreset, BTL_CAM_DEFAULT)
273 Call(YieldTurn)
274 Call(HideHealthBar, ACTOR_SELF)
275 Call(UseIdleAnimation, ACTOR_SELF, FALSE)
276 Call(RemoveActor, ACTOR_SELF)
277 Return
280 Call(GetActorPos, ACTOR_SELF, LVar0, LVar1, LVar2)
281 Set(LVar3, LVar1)
282 Call(GetActorPos, ACTOR_PLAYER, LVar0, LVar1, LVar2)
283 Set(LVar1, LVar3)
284 Add(LVar0, 10)
285 Call(SetActorJumpGravity, ACTOR_SELF, Float(0.01))
286 Call(SetGoalPos, ACTOR_SELF, LVar0, LVar1, LVar2)
287 Call(JumpToGoal, ACTOR_SELF, 12, FALSE, TRUE, FALSE)
288 ExecWait(N(EVS_MakeExplosionFX))
289 Call(SetGoalToTarget, ACTOR_SELF)
290 Wait(2)
291 Call(EnemyDamageTarget, ACTOR_SELF, LVar0, DAMAGE_TYPE_IGNORE_DEFENSE, 0, 0, DMG_IMPACT, BS_FLAGS1_TRIGGER_EVENTS)
292 Call(UseBattleCamPreset, BTL_CAM_DEFAULT)
293 Call(YieldTurn)
294 SetConst(LVar0, PRT_MAIN)
295 SetConst(LVar1, ANIM_BulletBill_BurnHurt)
298 Return
299 End
300};
301
302EvtScript N(EVS_MakeExplosionFX) = {
303 Call(GetActorPos, ACTOR_SELF, LVar0, LVar1, LVar2)
304 Add(LVar2, 2)
305 PlayEffect(EFFECT_SMOKE_RING, 0, LVar0, LVar1, LVar2, 0)
306 Add(LVar1, 16)
307 Add(LVar2, 2)
308 PlayEffect(EFFECT_BLAST, 0, LVar0, LVar1, LVar2, Float(3.0), 30, 0)
310 Call(StartRumble, BTL_RUMBLE_PLAYER_MAX)
311 Thread
312 Call(ShakeCam, CAM_BATTLE, 0, 5, Float(1.0))
314 Return
315 End
316};
Bytecode EvtScript[]
@ BTL_CAM_XADJ_AVG
Definition enums.h:4900
@ ACTOR_SOUND_JUMP
Definition enums.h:2036
@ 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
@ ACTOR_EVENT_FLAG_FIRE_EXPLODE
Fire attacks trigger an explosion, used only by bullet/bombshell bills.
Definition enums.h:3378
@ 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_LUCKY
Definition enums.h:1955
@ HIT_RESULT_MISS
Definition enums.h:1956
@ BTL_CAM_DEFAULT
Definition enums.h:4824
@ BTL_CAM_REPOSITION
Definition enums.h:4841
@ BTL_CAM_ENEMY_APPROACH
Definition enums.h:4885
@ IDLE_SCRIPT_ENABLE
Definition enums.h:6408
@ IDLE_SCRIPT_DISABLE
Definition enums.h:6407
@ STATUS_FLAG_SHRINK
Definition enums.h:2819
@ SOUND_NONE
Definition enums.h:547
@ SOUND_BULLET_BILL_EXPLODE_A
Definition enums.h:1416
@ BTL_RUMBLE_PLAYER_MAX
Definition enums.h:4263
@ ACTOR_PLAYER
Definition enums.h:2085
@ ACTOR_SELF
Definition enums.h:2084
@ ACTOR_FLAG_FLYING
Quake Hammer can't hit.
Definition enums.h:3329
@ BTL_CAM_YADJ_TARGET
Definition enums.h:4905
@ 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_EXPLODE_TRIGGER
Definition enums.h:2155
@ 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_IGNORE_DEFENSE
Definition enums.h:2877
@ DAMAGE_TYPE_TRIGGER_LUCKY
Definition enums.h:2881
EvtScript EVS_Enemy_Hit
EvtScript EVS_Enemy_Death
EvtScript EVS_Enemy_ShockHit
EvtScript EVS_Enemy_AirLift
EvtScript EVS_Enemy_BlowAway
EvtScript EVS_Enemy_Recover
EvtScript EVS_Enemy_NoDamageHit
ApiStatus ShakeCam(Evt *script, b32 isInitialCall)
#define Else
Marks the end of an if statement and the start of the else block.
Definition macros.h:295
#define Switch(LVAR)
Marks the start of a switch statement.
Definition macros.h:311
#define LVar6
Definition macros.h:154
#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 Sub(VAR, INT_VALUE)
Definition macros.h:377
#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 IfFalse(b)
Definition macros.h:646
#define EndCaseGroup
Marks the end of a switch case group (CaseOrEq and/or CaseAndEq), stopping fallthrough.
Definition macros.h:352
#define LVarC
Definition macros.h:160
#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 LVar5
Definition macros.h:153
#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 LVarB
Definition macros.h:159
#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 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 LVar4
Definition macros.h:152
#define LVar3
Definition macros.h:151
#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 EXEC_DEATH_NO_SPINNING
Definition battle.h:263