Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
fire_breath.c File Reference

Go to the source code of this file.

Functions

void fire_breath_init (EffectInstance *effect)
 
void fire_breath_update (EffectInstance *effect)
 
void fire_breath_render (EffectInstance *effect)
 
void fire_breath_appendGfx (void *effect)
 
EffectInstancefire_breath_main (s32 type, f32 startX, f32 startY, f32 startZ, f32 endX, f32 endY, f32 endZ, s32 numExtra, s32 spawnDelay, s32 duration)
 

Variables

Gfx D_09000A00_373DE0 []
 
Gfx D_09000B88_373F68 []
 
Gfx D_09000C00_373FE0 []
 
Gfx D_09000C20_374000 []
 
GfxD_E006EC00 [] = { D_09000B88_373F68, D_09000B88_373F68, D_09000B88_373F68 }
 
GfxD_E006EC0C [] = { D_09000A00_373DE0, D_09000A00_373DE0, D_09000A00_373DE0 }
 

Function Documentation

◆ fire_breath_init()

void fire_breath_init ( EffectInstance * effect)

Definition at line 89 of file fire_breath.c.

89 {
90}

Referenced by fire_breath_main().

◆ fire_breath_update()

void fire_breath_update ( EffectInstance * effect)

Definition at line 92 of file fire_breath.c.

92 {
93 FireBreathFXData* data = effect->data.fireBreath;
94 s32 duration;
95 s32 timeLeft;
96 s32 lifetime;
97
98 data->timeLeft--;
99 data->animTime = (data->lifetime * 4.0f) / 10.0f;
100 data->lifetime++;
101
102 if (data->timeLeft < 0) {
103 remove_effect(effect);
104 return;
105 }
106
107 timeLeft = data->timeLeft;
108 duration = data->duration;
109 lifetime = data->lifetime;
110
111 if (timeLeft >= 6 && data->type == FIRE_BREATH_LARGE) {
112 data->scale += (2.5 - data->scale) * 0.05;
113 }
114
115 data->pos.x = data->initPos.x + (((data->endPos.x - data->initPos.x + data->offsetPos.x) * lifetime) / duration);
116 data->pos.y = data->initPos.y + (((data->endPos.y - data->initPos.y + data->offsetPos.y) * lifetime) / duration);
117 data->pos.z = data->initPos.z + (((data->endPos.z - data->initPos.z + data->offsetPos.z) * lifetime) / duration);
118
119 if (data->type == FIRE_BREATH_SMALL) {
120 data->velY += (f32) lifetime * 0.01;
121 data->pos.y += data->velY;
122 }
123
124 if (lifetime == data->spawnDelay + 1 && data->numChildren > 0) {
126
129 data->type, data->initPos.x, data->initPos.y, data->initPos.z, data->endPos.x, data->endPos.y,
130 data->endPos.z, data->numChildren - 1, data->spawnDelay, duration
131 );
132
133 spawned->data.fireBreath->primR = data->primR;
134 spawned->data.fireBreath->primG = data->primG;
135 spawned->data.fireBreath->primB = data->primB;
136 spawned->data.fireBreath->envR = data->envR;
137 spawned->data.fireBreath->envG = data->envG;
138 spawned->data.fireBreath->envB = data->envB;
139 spawned->data.fireBreath->initialScale = spawned->data.fireBreath->scale = data->initialScale;
140 spawned->data.fireBreath->targetScale = data->targetScale;
141 spawned->data.fireBreath->scaleChangeRate = data->scaleChangeRate;
142 }
143
145 data->alpha = timeLeft * 25;
146 }
147
148 if (data->type == FIRE_BREATH_SMALL) {
149 data->scale += (0.3 - data->scale) * 0.008;
150 data->alpha = (timeLeft * 224) / duration;
151 }
152
153 if (data->type == FIRE_BREATH_TINY) {
154 data->scale += (data->targetScale - data->scale) * data->scaleChangeRate;
155 data->alpha = (timeLeft * 224) / duration;
156 }
157}
BSS s32 PopupMenu_SelectedIndex
#define remove_effect
#define load_effect
@ FIRE_BREATH_TINY
Definition effects.h:2681
@ FIRE_BREATH_LARGE
Definition effects.h:2679
@ FIRE_BREATH_SMALL
Definition effects.h:2680
EffectInstanceDataPtr data
Definition effects.h:2605
struct FireBreathFXData * fireBreath
Definition effects.h:2519
EffectInstance * fire_breath_main(s32 type, f32 startX, f32 startY, f32 startZ, f32 endX, f32 endY, f32 endZ, s32 numExtra, s32 spawnDelay, s32 duration)
Definition fire_breath.c:17

Referenced by fire_breath_main().

◆ fire_breath_render()

void fire_breath_render ( EffectInstance * effect)

Definition at line 159 of file fire_breath.c.

159 {
160 FireBreathFXData* data = effect->data.fireBreath;
164
166 renderTask.appendGfxArg = effect;
167
169 renderTask.dist = data->pos.z + 1000.0f;
170 } else {
171 renderTask.dist = 0;
172 }
173
177}
#define queue_render_task
@ RENDER_TASK_FLAG_REFLECT_FLOOR
Definition enums.h:3352
@ CONTEXT_BATTLE
Definition enums.h:3563
@ RENDER_MODE_CLOUD_NO_ZCMP
Definition enums.h:3345
void fire_breath_appendGfx(void *effect)
void(* appendGfx)(void *)
GameStatus * gGameStatusPtr
Definition main_loop.c:31

Referenced by fire_breath_main().

◆ fire_breath_appendGfx()

void fire_breath_appendGfx ( void * effect)

Definition at line 179 of file fire_breath.c.

179 {
180 Matrix4f transformMtx;
182 FireBreathFXData* data = ((EffectInstance*)effect)->data.fireBreath;
183 s32 type = data->type;
184 s32 envAlpha = (data->animTime - (s32)data->animTime) * 256.0f;
185 Gfx* dlist = D_E006EC00[type];
186 Gfx* dlist2 = D_E006EC0C[type];
187 s32 imgFrame = data->animTime;
188
190 gSPSegment(gMainGfxPos++, 0x09, VIRTUAL_TO_PHYSICAL(((EffectInstance*)effect)->shared->graphics));
191
192 if (type == FIRE_BREATH_SMALL) {
193 guTranslateF(transformMtx, data->initPos.x, data->initPos.y, data->initPos.z);
194 guRotateF(tempMtx, -gCameras[gCurrentCameraID].curYaw, 0.0f, 1.0f, 0.0f);
195 guMtxCatF(tempMtx, transformMtx, transformMtx);
197
203 }
204
206 gDPSetPrimColor(gMainGfxPos++, 0, 0, data->primR, data->primG, data->primB, data->alpha);
207 gDPSetEnvColor(gMainGfxPos++, data->envR, data->envG, data->envB, envAlpha);
208 gDPSetTileSize(gMainGfxPos++, G_TX_RENDERTILE, ((imgFrame * 32) + 0) * 4, 0, ((imgFrame * 32) + 32) * 4, 128);
209 gDPSetTileSize(gMainGfxPos++, 1, ((imgFrame * 32) + 32) * 4, 0, ((imgFrame * 32) + 64) * 4, 128);
210
211 guTranslateF(transformMtx, data->pos.x, data->pos.y, data->pos.z);
212 guRotateF(tempMtx, -gCameras[gCurrentCameraID].curYaw, 0.0f, 1.0f, 0.0f);
213 guMtxCatF(tempMtx, transformMtx, transformMtx);
214 guScaleF(tempMtx, data->scale, data->scale, 0.0f);
215 guMtxCatF(tempMtx, transformMtx, transformMtx);
217
220 gSPDisplayList(gMainGfxPos++, dlist);
222}
Mtx matrixStack[0x200]
f32 Matrix4f[4][4]
#define guRotateF
#define guMtxF2L
#define guTranslateF
#define guMtxCatF
#define guScaleF
Gfx D_09000C20_374000[]
Gfx * D_E006EC0C[]
Definition fire_breath.c:10
Gfx * D_E006EC00[]
Definition fire_breath.c:9
Gfx D_09000C00_373FE0[]
#define VIRTUAL_TO_PHYSICAL(addr)
Definition macros.h:46
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

Referenced by fire_breath_render().

◆ fire_breath_main()

EffectInstance * fire_breath_main ( s32 type,
f32 startX,
f32 startY,
f32 startZ,
f32 endX,
f32 endY,
f32 endZ,
s32 numExtra,
s32 spawnDelay,
s32 duration )

Definition at line 17 of file fire_breath.c.

22 {
24 FireBreathFXData* data;
25 EffectInstance* effect;
26 s32 numParts = 1;
27
28 bp.unk_00 = 0;
29 bp.init = fire_breath_init;
30 bp.update = fire_breath_update;
31 bp.renderScene = fire_breath_render;
32 bp.renderUI = nullptr;
34
35 effect = create_effect_instance(&bp);
36 effect->numParts = numParts;
37 data = effect->data.fireBreath = general_heap_malloc(numParts * sizeof(*data));
38 ASSERT(effect->data.fireBreath != nullptr);
39
40 data->type = type;
41 data->numChildren = numExtra;
42 data->spawnDelay = spawnDelay;
43 data->pos.x = startX;
44 data->pos.y = startY;
45 data->pos.z = startZ;
46 data->initPos.x = startX;
47 data->initPos.y = startY;
48 data->initPos.z = startZ;
49 data->endPos.x = endX;
50 data->endPos.y = endY;
51 data->endPos.z = endZ;
52
53 if (type == FIRE_BREATH_LARGE) {
54 data->scale = 0.05f;
55 } else {
56 data->scale = 0.04f;
57 }
58
59 data->initialScale = data->scale;
60 data->duration = duration;
61 data->timeLeft = duration;
62 data->lifetime = 0;
63 data->alpha = 255;
64 data->animTime = 0.0f;
65 data->scaleChangeRate = 0.1f;
66 data->targetScale = data->initialScale;
67
68 if (type == FIRE_BREATH_LARGE) {
69 data->offsetPos.x = (endX - startX) * 0.2 * (effect_simple_rand(10, spawnDelay + 0) - 5) * 0.2;
70 data->offsetPos.y = (endY - startY) * 0.2 * (effect_simple_rand(10, spawnDelay + 1) - 5) * 0.2;
71 data->offsetPos.z = (endZ - startZ) * 0.2 * (effect_simple_rand(10, spawnDelay + 2) - 5) * 0.2;
72 } else {
73 data->offsetPos.x = (endX - startX) * 0.2 * (effect_simple_rand(10, spawnDelay + 3) - 5);
74 data->offsetPos.y = (endY - startY) * 0.2 * (effect_simple_rand(10, spawnDelay + 4) - 5);
75 data->offsetPos.z = (endZ - startZ) * 0.2 * (effect_simple_rand(10, spawnDelay + 5) - 5);
76 }
77
78 data->primR = 255;
79 data->primG = 170;
80 data->primB = 42;
81 data->velY = 0.0f;
82 data->envR = 243;
83 data->envG = 48;
84 data->envB = 0;
85
86 return effect;
87}
#define general_heap_malloc
#define create_effect_instance
s32 effect_simple_rand(s32, s32)
#define ASSERT(condition)
void fire_breath_update(EffectInstance *effect)
Definition fire_breath.c:92
void fire_breath_render(EffectInstance *effect)
void fire_breath_init(EffectInstance *effect)
Definition fire_breath.c:89

Referenced by fire_breath_update().

Variable Documentation

◆ D_09000A00_373DE0

Gfx D_09000A00_373DE0[]
extern

◆ D_09000B88_373F68

Gfx D_09000B88_373F68[]
extern

◆ D_09000C00_373FE0

Gfx D_09000C00_373FE0[]
extern

Referenced by fire_breath_appendGfx().

◆ D_09000C20_374000

Gfx D_09000C20_374000[]
extern

Referenced by fire_breath_appendGfx().

◆ D_E006EC00

Definition at line 9 of file fire_breath.c.

Referenced by fire_breath_appendGfx().

◆ D_E006EC0C

Definition at line 10 of file fire_breath.c.

Referenced by fire_breath_appendGfx().