Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
fx_api.c
Go to the documentation of this file.
1#include "common.h"
2#include "effects.h"
3
5 fx_stars_shimmer(1, x, y, z, amt + 30, amt + 30, (amt / 2) + 10, 30);
6}
7
8void show_recovery_shimmer(f32 x, f32 y, f32 z, s32 amt) {
9 fx_stars_shimmer(2, x, y, z, amt + 30, amt + 30, (amt / 2) + 10, 30);
10}
11
12API_CALLABLE(ShowStartRecoveryShimmer) {
13 Bytecode* args = script->ptrReadPos;
14 f32 x = evt_get_float_variable(script, *args++);
15 f32 y = evt_get_float_variable(script, *args++);
16 f32 z = evt_get_float_variable(script, *args++);
17
20 return ApiStatus_DONE2;
21}
22
23API_CALLABLE(ShowRecoveryShimmer) {
24 Bytecode* args = script->ptrReadPos;
25 f32 x = evt_get_float_variable(script, *args++);
26 f32 y = evt_get_float_variable(script, *args++);
27 f32 z = evt_get_float_variable(script, *args++);
28
31 return ApiStatus_DONE2;
32}
33
34API_CALLABLE(func_802D7690) {
35 Bytecode* args = script->ptrReadPos;
36 f32 posX = evt_get_float_variable(script, *args++);
37 f32 posY = evt_get_float_variable(script, *args++);
38 f32 posZ = evt_get_float_variable(script, *args++);
39 f32 angle = evt_get_float_variable(script, *args++);
41 s32 duration = evt_get_variable(script, *args++);
42 f32 offsetX, offsetY, offsetZ;
43 f32 sinA, cosA;
44
45 if (isInitialCall) {
46 script->functionTemp[0] = 0;
47 }
48
49 offsetX = rand_int(10) - 5;
50 offsetZ = rand_int(10) - 5;
51 offsetY = -2.0f - ((SQ(offsetX) + SQ(offsetZ)) / 5.0f);
52 sinA = sin_rad(DEG_TO_RAD(angle));
53 cosA = cos_rad(DEG_TO_RAD(angle));
55 posX + ((sinA * magnitude * script->functionTemp[0]) / duration) + offsetX,
56 posY + 15.5f + offsetY,
57 posZ + ((-cosA * magnitude * script->functionTemp[0]) / duration) + offsetZ,
58 0.0f
59 );
60
61 script->functionTemp[0]++;
62 if (script->functionTemp[0] < duration) {
63 return ApiStatus_BLOCK;
64 } else {
65 return ApiStatus_DONE2;
66 }
67}
68
69API_CALLABLE(ShowEmote) {
70 Bytecode* args = script->ptrReadPos;
71 s32 npcID = evt_get_variable(script, *args++);
72 s32 emoteType = evt_get_variable(script, *args++);
73 f32 pitch = evt_get_float_variable(script, *args++);
74 s32 duration = evt_get_variable(script, *args++);
75 s32 emoterType = evt_get_variable(script, *args++);
79 f32 radius = evt_get_float_variable(script, *args++);
80
81 Npc* npc;
83 f32 x, y, z, r;
84
85 switch (emoterType) {
86 case EMOTER_PLAYER:
87 // show emote from player
88 npc = (Npc*)-1;
89 x = 0.0f;
90 y = (gPlayerStatus.colliderHeight * 2) / 3;
91 z = 0.0f;
93 break;
94 case EMOTER_NPC:
95 // show emote from NPC
96 npc = resolve_npc(script, npcID);
97 if (npc == NULL) {
98 return ApiStatus_DONE2;
99 }
100 x = 0.0f;
101 y = (npc->collisionHeight * 4) / 5;
102 z = 0.0f;
103 r = npc->collisionHeight / 3;
104 break;
105 default:
106 // show emote at arbitrary position
107 x = dX;
108 y = dY;
109 z = dZ;
110 r = radius;
111 npc = NULL;
112 break;
113 }
114
115 fx_emote(emoteType, npc, x, y, z, r, pitch, duration, &emoteHandle);
116 return ApiStatus_DONE2;
117}
118
119API_CALLABLE(RemoveEffect) {
120 Bytecode* args = script->ptrReadPos;
121
123 return ApiStatus_DONE2;
124}
125
126API_CALLABLE(DismissEffect) {
127 Bytecode* args = script->ptrReadPos;
129
131 return ApiStatus_DONE2;
132}
133
134API_CALLABLE(DismissItemOutline) {
135 Bytecode* args = script->ptrReadPos;
137
138 effect->data.gotItemOutline->timeLeft = 10;
139 return ApiStatus_DONE2;
140}
141
142API_CALLABLE(func_802D7B74) {
143 Bytecode* args = script->ptrReadPos;
145
146 // function is never called, so the effect type can't be inferred
147 effect->data.any[12] = 5;
148 return ApiStatus_DONE2;
149}
150
151API_CALLABLE(InterpMotionBlurParams) {
152 s32 centerX0 = script->varTable[1];
153 s32 centerY0 = script->varTable[2];
154 s32 centerX1 = script->varTable[3];
155 s32 centerY1 = script->varTable[4];
156 s32 finalAmt = script->varTable[5];
157 s32 duration = script->varTable[6];
158 s32 delta;
161
162 if (isInitialCall) {
163 script->functionTemp[0] = duration;
165 script->functionTemp[1] = initialAmt;
168 }
169
171 // lerp from initialAmt (stored in functionTemp[1]) to finalAmt (stored in varTable[5])
172 delta = (script->functionTemp[1] - finalAmt);
173 set_screen_overlay_params_back(OVERLAY_BLUR, (delta * script->functionTemp[0] / duration) + finalAmt);
174
175 script->functionTemp[0]--;
176 if (script->functionTemp[0] < 0) {
178 return ApiStatus_DONE2;
179 }
180 return ApiStatus_BLOCK;
181}
182
188
189API_CALLABLE(SetMotionBlurParams) {
190 Bytecode* args = script->ptrReadPos;
191 s32 var0 = evt_get_variable(script, *args++);
192 s32 centerX0 = evt_get_variable(script, *args++);
193 s32 centerY0 = evt_get_variable(script, *args++);
194 s32 centerX1 = evt_get_variable(script, *args++);
195 s32 centerY1 = evt_get_variable(script, *args++);
196 s32 finalAmt = evt_get_variable(script, *args++);
197 s32 duration = evt_get_variable(script, *args++);
198
200 blurEvt->varTable[0] = var0;
201 blurEvt->varTable[1] = centerX0;
202 blurEvt->varTable[2] = centerY0;
203 blurEvt->varTable[3] = centerX1;
204 blurEvt->varTable[4] = centerY1;
205 blurEvt->varTable[5] = finalAmt;
206 blurEvt->varTable[6] = duration;
207
208 return ApiStatus_DONE2;
209}
210
211API_CALLABLE(ShowSweat) {
212 Bytecode* args = script->ptrReadPos;
213 s32 npcID = evt_get_variable(script, *args++);
214 s32 type = evt_get_variable(script, *args++);
215 f32 pitch = evt_get_float_variable(script, *args++);
216 s32 emoterType = evt_get_variable(script, *args++);
217 f32 posX = evt_get_float_variable(script, *args++);
218 f32 posY = evt_get_float_variable(script, *args++);
219 f32 posZ = evt_get_float_variable(script, *args++);
220 f32 radius = evt_get_float_variable(script, *args++);
221 s32 duration = evt_get_variable(script, *args++);
222
223 Npc* npc;
224 f32 x, y, z, r;
225
226 switch (emoterType) {
227 case EMOTER_PLAYER:
228 x = gPlayerStatus.pos.x;
230 z = gPlayerStatus.pos.z;
232 break;
233 case EMOTER_NPC:
234 npc = resolve_npc(script, npcID);
235 if (npc == NULL) {
236 return ApiStatus_DONE2;
237 }
238 x = npc->pos.x;
239 y = npc->pos.y + (npc->collisionHeight * 2) / 3;
240 z = npc->pos.z;
241 r = npc->collisionHeight / 3;
242 break;
243 default:
244 x = posX;
245 y = posY;
246 z = posZ;
247 r = radius;
248 break;
249 }
250
251 fx_sweat(type, x, y, z, r, pitch, duration);
252 return ApiStatus_DONE2;
253}
254
255API_CALLABLE(ShowSleepBubble) {
256 Bytecode* args = script->ptrReadPos;
257 s32 npcID = evt_get_variable(script, *args++);
258 s32 type = evt_get_variable(script, *args++);
259 f32 pitch = evt_get_float_variable(script, *args++);
260 s32 emoterType = evt_get_variable(script, *args++);
261 f32 posX = evt_get_float_variable(script, *args++);
262 f32 posY = evt_get_float_variable(script, *args++);
263 f32 posZ = evt_get_float_variable(script, *args++);
264 f32 radius = evt_get_float_variable(script, *args++);
265 s32 outVar = *args++;
266
267 Npc* npc;
268 f32 x, y, z, r;
270
271 switch (emoterType) {
272 case EMOTER_PLAYER:
273 x = gPlayerStatus.pos.x;
275 z = gPlayerStatus.pos.z;
277 break;
278 case EMOTER_NPC:
279 npc = resolve_npc(script, npcID);
280 if (npc == NULL) {
281 return ApiStatus_DONE2;
282 }
283 x = npc->pos.x;
284 y = npc->pos.y + (npc->collisionHeight * 2) / 3;
285 z = npc->pos.z;
286 r = npc->collisionHeight / 3;
287 break;
288 default:
289 x = posX;
290 y = posY;
291 z = posZ;
292 r = radius;
293 break;
294 }
295
296 fx_sleep_bubble(type, x, y, z, r, pitch, &effectHandle);
298 return ApiStatus_DONE2;
299}
300
301API_CALLABLE(SetSleepBubbleTimeLeft) {
302 Bytecode* args = script->ptrReadPos;
304 s32 value = evt_get_variable(script, *args++);
305
306 effect->data.sleepBubble->timeLeft = value;
307 return ApiStatus_DONE2;
308}
309
310API_CALLABLE(PlayEffect_impl) {
311 Bytecode* intArgs = script->ptrReadPos;
312 Bytecode* floatArgs = script->ptrReadPos;
313 Bytecode* args = script->ptrReadPos;
314
315 s32 effectID = evt_get_variable(script, *intArgs++);
317 s32 new_var;
318
319 s32 iVar1, iVar2, iVar3, iVar4, iVar5;
320 s32 iVar6, iVar7, iVar8, iVar9, iVar10;
321
324
329
330 s32 a2, a6, a7, a8, a9;
331
333 evt_get_variable(script, *args++);
334
348
362
363 args++;
364 a2 = *args++;
365 args++;
366 args++;
367 args++;
368 a6 = *args++;
369 a7 = *args++;
370 a8 = *args++;
371 a9 = *args++;
372
373 iVar1 = new_var;
374
375 switch (effectID) {
376 case EFFECT_00:
377 fx_blast(0, fVar1, fVar2, fVar3, 3.0f, iVar5);
378 break;
381 break;
384 break;
387 break;
390 break;
393 break;
396 break;
399 break;
400 case EFFECT_FOOTPRINT:
402 break;
405 break;
406 case EFFECT_SNOWFLAKE:
408 break;
409 case EFFECT_STAR:
411 break;
412 case EFFECT_EMOTE:
415 break;
416 case EFFECT_SPARKLES:
418 break;
421 break;
424 break;
427 break;
428 case EFFECT_DUST:
430 break;
433 break;
436 break;
439 break;
440 case EFFECT_EXPLOSION:
442 break;
445 break;
449 break;
452 break;
455 break;
459 break;
462 break;
465 break;
468 break;
471 break;
474 break;
475 case EFFECT_SHOCKWAVE:
477 break;
480 break;
483 break;
484 case EFFECT_SWEAT:
486 break;
490 break;
493 break;
494 case EFFECT_FLAME:
497 break;
500 break;
503 break;
506 break;
510 break;
513 break;
514 case EFFECT_DEBUFF:
516 break;
519 break;
522 break;
526 break;
530 break;
531 case EFFECT_LIGHTNING:
533 break;
536 break;
539 break;
542 break;
545 break;
546 case EFFECT_AURA:
549 break;
550 case EFFECT_BULB_GLOW:
553 break;
554 case EFFECT_3D:
557 break;
558 case EFFECT_BLAST:
560 break;
563 break;
564 case EFFECT_RECOVER:
566 break;
567 case EFFECT_DISABLE_X:
569 break;
572 break;
573 case EFFECT_FIREWORK:
575 break;
576 case EFFECT_CONFETTI:
578 break;
579 case EFFECT_SNOWFALL:
581 break;
582 case EFFECT_46:
584 break;
587 break;
590 break;
593 break;
596 break;
597 case EFFECT_BALLOON:
599 break;
602 break;
605 break;
608 break;
611 break;
614 break;
617 break;
620 break;
623 break;
626 break;
629 break;
630 case EFFECT_SQUIRT:
632 break;
635 break;
636 case EFFECT_WATERFALL:
638 break;
641 break;
644 break;
647 break;
650 break;
653 break;
656 break;
659 break;
660 case EFFECT_63:
662 break;
665 break;
666 case EFFECT_65:
668 break;
671 break;
672 case EFFECT_WHIRLWIND:
674 break;
677 break;
680 break;
683 break;
686 break;
689 break;
692 break;
695 break;
696 case EFFECT_EMBERS:
698 break;
701 break;
704 break;
707 break;
710 break;
711 case EFFECT_75:
713 break;
716 break;
719 break;
722 break;
725 break;
726 case EFFECT_ICE_SHARD:
728 break;
731 break;
732 case EFFECT_LIL_OINK:
734 break;
737 break;
740 break;
743 break;
746 break;
749 break;
750 case EFFECT_SUN:
752 break;
755 break;
758 break;
761 break;
762 case EFFECT_86:
764 break;
765 default:
766 PANIC();
767 }
768
769 if (effectRet != NULL) {
771 }
772
773 return ApiStatus_DONE2;
774}
BSS s32 PopupMenu_SelectedIndex
Bytecode EvtScript[]
#define sfx_play_sound_at_position
#define remove_effect
#define rand_int
struct SleepBubbleFXData * sleepBubble
Definition effects.h:2505
EffectInstanceDataPtr data
Definition effects.h:2605
struct GotItemOutlineFXData * gotItemOutline
Definition effects.h:2491
@ FX_INSTANCE_FLAG_DISMISS
Definition enums.h:3517
@ OVERLAY_BLUR
Definition enums.h:2400
@ SCREEN_LAYER_BACK
Definition enums.h:2383
@ EMOTER_PLAYER
Definition enums.h:504
@ EMOTER_NPC
Definition enums.h:505
@ SOUND_START_RECOVERY
Definition enums.h:1385
@ SOUND_RECOVERY_SHMMER
Definition enums.h:1192
@ SOUND_SPACE_DEFAULT
Definition enums.h:1737
@ EVT_PRIORITY_1
Definition evt.h:152
#define ApiStatus_DONE2
Definition evt.h:118
s32 Bytecode
Definition evt.h:7
#define ApiStatus_BLOCK
Definition evt.h:116
void set_screen_overlay_params_back(u8, f32)
s32 evt_get_variable(Evt *script, Bytecode var)
Definition evt.c:1689
s32 evt_set_variable(Evt *script, Bytecode var, s32 value)
Definition evt.c:1846
f32 cos_rad(f32 x)
Definition 43F0.c:716
Evt * start_script(EvtScript *source, s32 priority, s32 initialState)
void set_screen_overlay_center(s32, s32, s32, s32)
Npc * resolve_npc(Evt *script, s32 npcIdOrPtr)
Definition npc_api.c:8
void get_screen_overlay_params(s32, u8 *type, f32 *zoom)
f32 evt_get_float_variable(Evt *script, Bytecode var)
Definition evt.c:1929
f32 sin_rad(f32 x)
Definition 43F0.c:712
void show_recovery_shimmer(f32 x, f32 y, f32 z, s32 amt)
Definition fx_api.c:8
void show_start_recovery_shimmer(f32 x, f32 y, f32 z, s32 amt)
Definition fx_api.c:4
EvtScript EVS_UpdateMotionBlurParams
Definition fx_api.c:183
ApiStatus SetSleepBubbleTimeLeft(Evt *script, b32 isInitialCall)
ApiStatus ShowRecoveryShimmer(Evt *script, b32 isInitialCall)
ApiStatus ShowSweat(Evt *script, b32 isInitialCall)
ApiStatus SetMotionBlurParams(Evt *script, b32 isInitialCall)
ApiStatus func_802D7B74(Evt *script, b32 isInitialCall)
ApiStatus RemoveEffect(Evt *script, b32 isInitialCall)
ApiStatus InterpMotionBlurParams(Evt *script, b32 isInitialCall)
ApiStatus func_802D7690(Evt *script, b32 isInitialCall)
ApiStatus ShowStartRecoveryShimmer(Evt *script, b32 isInitialCall)
ApiStatus PlayEffect_impl(Evt *script, b32 isInitialCall)
ApiStatus ShowEmote(Evt *script, b32 isInitialCall)
ApiStatus DismissItemOutline(Evt *script, b32 isInitialCall)
ApiStatus ShowSleepBubble(Evt *script, b32 isInitialCall)
ApiStatus DismissEffect(Evt *script, b32 isInitialCall)
#define LVarF
Definition macros.h:163
#define End
Signals the end of EVT script data. A script missing this will likely crash on load.
Definition macros.h:213
#define PANIC()
Definition macros.h:55
#define DEG_TO_RAD(deg)
Definition macros.h:138
#define SQ(x)
Definition macros.h:170
#define Call(FUNC, ARGS...)
Calls a given C EVT API function with any number of arguments.
Definition macros.h:576
#define Return
Kills the current EVT thread.
Definition macros.h:217
s16 collisionHeight
Vec3f pos
PlayerStatus gPlayerStatus
Definition 77480.c:39
void fx_damage_stars(s32, f32, f32, f32, f32, f32, f32, s32)