Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
embers.c
Go to the documentation of this file.
1#include "common.h"
2#include "effects_internal.h"
3
6
8
10 0.01f, 0.05f, 0.1f, 0.2f, 0.35f, 0.5f,
11 0.65f, 0.8f, 0.95f, 1.0f, 1.0f, 1.0f,
12 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
13 1.0f, 1.0f, 1.0f, 0.95f, 0.8f, 0.65f,
14 0.5f, 0.35f, 0.2f, 0.1f, 0.05f, 0.01f
15};
16
17void embers_init(EffectInstance* effect);
18void embers_update(EffectInstance* effect);
19void embers_render(EffectInstance* effect);
20void embers_appendGfx(void* effect);
21
23 s32 arg0,
24 f32 arg1,
25 f32 arg2,
26 f32 arg3,
27 f32 arg4,
28 f32 arg5,
29 f32 arg6,
30 s32 arg7,
31 s32 arg8,
32 f32 arg9,
33 f32 argA
34) {
36 EffectInstance* effect;
38 f32 temp1;
39 s32 i;
40
41 arg7++;
42
43 bp.init = embers_init;
44 bp.update = embers_update;
45 bp.renderScene = embers_render;
46 bp.unk_00 = 0;
47 bp.renderUI = nullptr;
48 bp.effectID = EFFECT_EMBERS;
49
50 effect = create_effect_instance(&bp);
51 effect->numParts = arg7;
52 part = effect->data.embers = general_heap_malloc(arg7 * sizeof(*part));
53 ASSERT(effect->data.embers != nullptr);
54
55 part->unk_00 = arg0;
56 part->lifetime = 0;
57 if (arg8 <= 0) {
58 part->timeLeft = 1000;
59 } else {
60 part->timeLeft = arg8;
61 }
62 part->unk_2C = 0;
63 part->unk_04 = arg1;
64 part->unk_08 = arg2;
65 part->unk_0C = arg3;
66 part->unk_40 = arg6;
67 part->unk_10 = arg4;
68 part->unk_14 = arg5;
69 part->unk_68 = arg9;
70 part->unk_6C = argA;
71 part->unk_20 = 127;
72 part->unk_24 = 0;
73 part->unk_28 = 0;
74 part->unk_30 = 127;
75 part->unk_34 = 127;
76 part->unk_38 = 0;
77 part->unk_3C = 255;
78
79 temp1 = 30.0f / (arg7 - 1);
80 temp1 *= 0.5;
81
82 part++;
83 for (i = 1; i < arg7; i++, part++) {
84 s32 temp_f0 = -(f32) i * temp1;
85 part->unk_64 = temp_f0 - 1;
86 }
87
88 return effect;
89}
90
92}
93
95 EmbersFXData* part = effect->data.embers;
96 f32 unk_10;
97 f32 unk_14;
98 s32 time;
99 f32 unk_68;
100 f32 unk_6C;
101 s32 i;
102
103 if (effect->flags & FX_INSTANCE_FLAG_DISMISS) {
105 part->timeLeft = 16;
106 }
107
108 if (part->timeLeft < 1000) {
109 part->timeLeft--;
110 }
111
112 part->lifetime++;
113 if (part->lifetime > 324000) {
114 part->lifetime = 256;
115 }
116
117 if (part->timeLeft < 0) {
118 remove_effect(effect);
119 return;
120 }
121
122 time = part->lifetime;
123
124 if (part->timeLeft < 16) {
125 part->unk_2C = part->timeLeft * 16;
126 }
127
128 if (time < 16) {
129 part->unk_2C = time * 16 + 15;
130 }
131
132 unk_10 = part->unk_10;
133 unk_14 = part->unk_14;
134 unk_68 = part->unk_68;
135 unk_6C = part->unk_6C;
136
137 part++;
138 for (i = 1; i < effect->numParts; i++, part++) {
139 part->unk_64++;
140 if (part->unk_64 >= 30) {
141 part->unk_64 = 0;
142 }
143
144 if (part->unk_64 >= 0) {
145 if (part->unk_64 == 0) {
146 part->unk_04 = rand_int(unk_10) - unk_10 * 0.5;
147 part->unk_08 = rand_int(unk_14);
148 part->unk_0C = 0.0f;
149 part->unk_44 = (f32) (rand_int(20) - 10) * 0.05;
150 part->unk_48 = (rand_int(40) - 1) * unk_68 * 0.05;
151 part->unk_4C = 0.0f;
152 part->unk_50 = (f32) (rand_int(20) - 10) * 0.05;
153 part->unk_54 = (rand_int(30) - 1) * unk_6C * 0.05;
154 part->unk_58 = 0.0f;
155 part->unk_5C = rand_int(15);
156 part->unk_60 = rand_int(15);
157 }
158 part->unk_40 = D_E00E0A48[part->unk_64];
159 part->unk_04 += part->unk_44;
160 part->unk_08 += part->unk_48;
161 part->unk_0C += part->unk_4C;
162 part->unk_5C += 0.1;
163 part->unk_60 += 0.3;
164 part->unk_44 += (part->unk_50 - part->unk_44) * 0.04;
165 part->unk_48 += (part->unk_54 - part->unk_48) * 0.04;
166 part->unk_4C += (part->unk_58 - part->unk_4C) * 0.04;
167 }
168 }
169}
170
174
176 renderTask.appendGfxArg = effect;
177 renderTask.dist = 10;
179
182}
183
184void func_E00E05F8(void) {
185}
186
187void embers_appendGfx(void* effect) {
188 EmbersFXData* part = ((EffectInstance*)effect)->data.embers;
190 s32 unk_2C = part->unk_2C;
193 s32 i;
194
196 gSPSegment(gMainGfxPos++, 0x09, VIRTUAL_TO_PHYSICAL(((EffectInstance*)effect)->shared->graphics));
197
198 guTranslateF(sp10, part->unk_04, part->unk_08, part->unk_0C);
199 guScaleF(sp50, part->unk_40, part->unk_40, part->unk_40);
202
205 gDPSetPrimColor(gMainGfxPos++, 0, 0, part->unk_20, part->unk_24, part->unk_28, unk_2C);
206 gDPSetEnvColor(gMainGfxPos++, part->unk_30, part->unk_34, part->unk_38, part->unk_3C);
208
209 part++;
210 for (i = 1; i < ((EffectInstance*)effect)->numParts; i++, part++) {
211 if (part->unk_64 >= 0) {
212 guTranslateF(sp10, part->unk_04, part->unk_08, part->unk_0C);
214
216 gDPSetTileSize(gMainGfxPos++, G_TX_RENDERTILE, 0, (i % 4) * 16 * 4, 15 * 4, ((i % 4) * 16 + 15) * 4);
217 gDPSetTileSize(gMainGfxPos++, 1, (s32) part->unk_5C * 4, (s32) part->unk_60 * 4, ((s32) part->unk_5C + 15) * 4, ((s32) part->unk_60 + 15) * 4);
220 }
221 }
222
224}
BSS s32 PopupMenu_SelectedIndex
Mtx matrixStack[0x200]
f32 Matrix4f[4][4]
s8 unk_14
Definition demo_api.c:19
#define general_heap_malloc
#define queue_render_task
#define guMtxF2L
#define guTranslateF
#define guMtxCatF
#define remove_effect
#define rand_int
#define create_effect_instance
#define guScaleF
EffectInstanceDataPtr data
Definition effects.h:2605
struct EmbersFXData * embers
Definition effects.h:2576
#define ASSERT(condition)
void func_E00E05F8(void)
Definition embers.c:184
f32 D_E00E0A48[]
Definition embers.c:9
void embers_render(EffectInstance *effect)
Definition embers.c:171
Gfx D_09000280_3DC1C0[]
void embers_appendGfx(void *effect)
Definition embers.c:187
void embers_init(EffectInstance *effect)
Definition embers.c:91
Gfx D_090003B0_3DC2F0[]
Gfx * D_E00E0A40[]
Definition embers.c:7
EffectInstance * embers_main(s32 arg0, f32 arg1, f32 arg2, f32 arg3, f32 arg4, f32 arg5, f32 arg6, s32 arg7, s32 arg8, f32 arg9, f32 argA)
Definition embers.c:22
void embers_update(EffectInstance *effect)
Definition embers.c:94
@ FX_INSTANCE_FLAG_DISMISS
Definition enums.h:3551
@ RENDER_TASK_FLAG_REFLECT_FLOOR
Definition enums.h:3352
@ RENDER_MODE_CLOUD_NO_ZCMP
Definition enums.h:3345
#define VIRTUAL_TO_PHYSICAL(addr)
Definition macros.h:46
void(* appendGfx)(void *)
Camera gCameras[4]
Definition cam_main.c:16
Gfx * gMainGfxPos
Definition cam_main.c:14
u16 gMatrixListPos
Definition main_loop.c:44
s32 gCurrentCameraID
Definition cam_math.c:5
DisplayContext * gDisplayContext
Definition cam_main.c:15