summaryrefslogtreecommitdiff
path: root/src/code/z_effect.c
diff options
context:
space:
mode:
authorengineer124 <47598039+engineer124@users.noreply.github.com>2021-06-10 22:13:43 +1000
committerGitHub <noreply@github.com>2021-06-10 08:13:43 -0400
commite9eb4d4e0a581958e90604bb628a7f81e56bf16e (patch)
tree2347d8f61071cf20f840c9fda1ff6884d2c1015e /src/code/z_effect.c
parentaae3c6f89565bf94659d66432d1dfd9ec92f8d7f (diff)
Match z_effect.c (#176)
Diffstat (limited to 'src/code/z_effect.c')
-rw-r--r--src/code/z_effect.c314
1 files changed, 314 insertions, 0 deletions
diff --git a/src/code/z_effect.c b/src/code/z_effect.c
new file mode 100644
index 000000000..d857dec90
--- /dev/null
+++ b/src/code/z_effect.c
@@ -0,0 +1,314 @@
+#include <ultra64.h>
+#include <global.h>
+
+EffInfo sEffInfoTable[] = {
+ {
+ sizeof(EffSparkParams),
+ (eff_init_func)EffectSpark_Init,
+ (eff_destroy_func)EffectSpark_Destroy,
+ (eff_update_func)EffectSpark_Update,
+ (eff_draw_func)EffectSpark_Draw,
+ },
+ {
+ sizeof(EffectBlure),
+ (eff_init_func)EffectBlure_Init1,
+ (eff_destroy_func)EffectBlure_Destroy,
+ (eff_update_func)EffectBlure_Update,
+ (eff_draw_func)EffectBlure_Draw,
+ },
+ {
+ sizeof(EffectBlure),
+ (eff_init_func)EffectBlure_Init2,
+ (eff_destroy_func)EffectBlure_Destroy,
+ (eff_update_func)EffectBlure_Update,
+ (eff_draw_func)EffectBlure_Draw,
+ },
+ {
+ sizeof(EffShieldParticleParams),
+ (eff_init_func)EffectShieldParticle_Init,
+ (eff_destroy_func)EffectShieldParticle_Destroy,
+ (eff_update_func)EffectShieldParticle_Update,
+ (eff_draw_func)EffectShieldParticle_Draw,
+ },
+ {
+ sizeof(EffTireMarkParams),
+ (eff_init_func)EffectTireMark_Init,
+ (eff_destroy_func)EffectTireMark_Destroy,
+ (eff_update_func)EffectTireMark_Update,
+ (eff_draw_func)EffectTireMark_Draw,
+ },
+};
+
+GlobalContext* Effect_GetContext(void) {
+ return sEffTable.globalCtx;
+}
+
+void* Effect_GetParams(s32 index) {
+ if (index == TOTAL_EFFECT_COUNT) {
+ return NULL;
+ }
+
+ if (index < SPARK_COUNT) {
+ if (sEffTable.sparks[index].base.active == 1) {
+ return &sEffTable.sparks[index].params;
+ } else {
+ return NULL;
+ }
+ }
+
+ index -= SPARK_COUNT;
+ if (index < BLURE_COUNT) {
+ if (sEffTable.blures[index].base.active == 1) {
+ return &sEffTable.blures[index].params;
+ } else {
+ return NULL;
+ }
+ }
+
+ index -= BLURE_COUNT;
+ if (index < SHIELD_PARTICLE_COUNT) {
+ if (sEffTable.shieldParticles[index].base.active == 1) {
+ return &sEffTable.shieldParticles[index].params;
+ } else {
+ return NULL;
+ }
+ }
+
+ index -= SHIELD_PARTICLE_COUNT;
+ if (index < TIRE_MARK_COUNT) {
+ if (sEffTable.tireMarks[index].base.active == 1) {
+ return &sEffTable.tireMarks[index].params;
+ } else {
+ return NULL;
+ }
+ }
+
+ return NULL;
+}
+
+void Effect_InitCommon(EffCommon* common) {
+ common->active = 0;
+ common->unk1 = 0;
+ common->unk2 = 0;
+}
+
+void Effect_Init(GlobalContext* globalCtx) {
+ s32 i;
+
+ for (i = 0; i < SPARK_COUNT; i++) {
+ Effect_InitCommon(&sEffTable.sparks[i].base);
+ }
+
+ for (i = 0; i < BLURE_COUNT; i++) {
+ Effect_InitCommon(&sEffTable.blures[i].base);
+ }
+
+ //! @bug This is probably supposed to loop over shieldParticles, not blures again
+ for (i = 0; i < SHIELD_PARTICLE_COUNT; i++) {
+ Effect_InitCommon(&sEffTable.blures[i].base);
+ }
+
+ for (i = 0; i < TIRE_MARK_COUNT; i++) {
+ Effect_InitCommon(&sEffTable.tireMarks[i].base);
+ }
+
+ sEffTable.globalCtx = globalCtx;
+}
+
+void Effect_Add(GlobalContext* globalCtx, s32* index, s32 type, u8 param_4, u8 param_5, void* initParams) {
+ u32 slotFound;
+ s32 i;
+ void* params;
+ EffCommon* common;
+
+ params = NULL;
+ *index = TOTAL_EFFECT_COUNT;
+ common = NULL;
+
+ if (func_8016A01C(globalCtx) != 1) {
+ slotFound = 0;
+ switch (type) {
+ case 0:
+ for (i = 0; i < SPARK_COUNT; i++) {
+ if (sEffTable.sparks[i].base.active == 0) {
+ slotFound = 1;
+ *index = i;
+ params = &sEffTable.sparks[i].params;
+ common = &sEffTable.sparks[i].base;
+ break;
+ }
+ }
+ break;
+ case 1:
+ case 2:
+ for (i = 0; i < BLURE_COUNT; i++) {
+ if (sEffTable.blures[i].base.active == 0) {
+ slotFound = 1;
+ *index = i + 3;
+ params = &sEffTable.blures[i].params;
+ common = &sEffTable.blures[i].base;
+ break;
+ }
+ }
+ break;
+ case 3:
+ for (i = 0; i < SHIELD_PARTICLE_COUNT; i++) {
+ if (sEffTable.shieldParticles[i].base.active == 0) {
+ slotFound = 1;
+ *index = i + 28;
+ params = &sEffTable.shieldParticles[i].params;
+ common = &sEffTable.shieldParticles[i].base;
+ break;
+ }
+ }
+ break;
+ case 4:
+ for (i = 0; i < TIRE_MARK_COUNT; i++) {
+ if (sEffTable.tireMarks[i].base.active == 0) {
+ slotFound = 1;
+ *index = i + 31;
+ params = &sEffTable.tireMarks[i].params;
+ common = &sEffTable.tireMarks[i].base;
+ break;
+ }
+ }
+ break;
+ }
+
+ if (slotFound) {
+ sEffInfoTable[type].init(params, initParams);
+ common->unk2 = param_4;
+ common->unk1 = param_5;
+ common->active = 1;
+ }
+ }
+}
+
+void Effect_DrawAll(GraphicsContext* gfxCtx) {
+ s32 i;
+
+ for (i = 0; i < SPARK_COUNT; i++) {
+ if (1) {} // necessary to match
+ if (sEffTable.sparks[i].base.active) {
+ sEffInfoTable[0].draw(&sEffTable.sparks[i].params, gfxCtx);
+ }
+ }
+
+ for (i = 0; i < BLURE_COUNT; i++) {
+ if (1) { if (gfxCtx) {} } // necessary to match
+ if (sEffTable.blures[i].base.active) {
+ sEffInfoTable[1].draw(&sEffTable.blures[i].params, gfxCtx);
+ }
+ }
+
+ for (i = 0; i < SHIELD_PARTICLE_COUNT; i++) {
+ if (1) {} // necessary to match
+ if (sEffTable.shieldParticles[i].base.active) {
+ sEffInfoTable[3].draw(&sEffTable.shieldParticles[i].params, gfxCtx);
+ }
+ }
+
+ if (1) {} // necessary to match
+ for (i = 0; i < TIRE_MARK_COUNT; i++) {
+ if (sEffTable.tireMarks[i].base.active) {
+ sEffInfoTable[4].draw(&sEffTable.tireMarks[i].params, gfxCtx);
+ }
+ }
+}
+
+void Effect_UpdateAll(GlobalContext* globalCtx) {
+ s32 i;
+
+ for (i = 0; i < SPARK_COUNT; i++) {
+ if (1) {} // necessary to match
+ if (sEffTable.sparks[i].base.active) {
+ if (sEffInfoTable[0].update(&sEffTable.sparks[i].params) == 1) {
+ Effect_Destroy(globalCtx, i);
+ }
+ }
+ }
+
+ for (i = 0; i < BLURE_COUNT; i++) {
+ if (1) {} // necessary to match
+ if (sEffTable.blures[i].base.active) {
+ if (sEffInfoTable[1].update(&sEffTable.blures[i].params) == 1) {
+ Effect_Destroy(globalCtx, i + 3);
+ }
+ }
+ }
+
+ for (i = 0; i < SHIELD_PARTICLE_COUNT; i++) {
+ if (1) {} // necessary to match
+ if (sEffTable.shieldParticles[i].base.active) {
+ if (sEffInfoTable[3].update(&sEffTable.shieldParticles[i].params) == 1) {
+ Effect_Destroy(globalCtx, i + 28);
+ }
+ }
+ }
+
+ for (i = 0; i < TIRE_MARK_COUNT; i++) {
+ if (1) {} // necessary to match
+ if (sEffTable.tireMarks[i].base.active) {
+ if (sEffInfoTable[4].update(&sEffTable.tireMarks[i].params) == 1) {
+ Effect_Destroy(globalCtx, i + 31);
+ }
+ }
+ }
+}
+
+void Effect_Destroy(GlobalContext* globalCtx, s32 index) {
+ if (index == TOTAL_EFFECT_COUNT) {
+ return;
+ }
+
+ if (index < SPARK_COUNT) {
+ sEffTable.sparks[index].base.active = 0;
+ sEffInfoTable[0].destroy(&sEffTable.sparks[index].params);
+ return;
+ }
+
+ index -= SPARK_COUNT;
+ if (index < BLURE_COUNT) {
+ sEffTable.blures[index].base.active = 0;
+ sEffInfoTable[1].destroy(&sEffTable.blures[index].params);
+ return;
+ }
+
+ index -= BLURE_COUNT;
+ if (index < SHIELD_PARTICLE_COUNT) {
+ sEffTable.shieldParticles[index].base.active = 0;
+ sEffInfoTable[3].destroy(&sEffTable.shieldParticles[index].params);
+ return;
+ }
+
+ index -= SHIELD_PARTICLE_COUNT;
+ if (index < TIRE_MARK_COUNT) {
+ sEffTable.tireMarks[index].base.active = 0;
+ sEffInfoTable[4].destroy(&sEffTable.tireMarks[index].params);
+ return;
+ }
+}
+
+void Effect_DestroyAll(GlobalContext* globalCtx) {
+ s32 i;
+
+ for (i = 0; i < SPARK_COUNT; i++) {
+ sEffTable.sparks[i].base.active = 0;
+ sEffInfoTable[0].destroy(&sEffTable.sparks[i].params);
+ }
+
+ for (i = 0; i < BLURE_COUNT; i++) {
+ sEffTable.blures[i].base.active = 0;
+ sEffInfoTable[1].destroy(&sEffTable.blures[i].params);
+ }
+
+ for (i = 0; i < SHIELD_PARTICLE_COUNT; i++) {
+ sEffTable.shieldParticles[i].base.active = 0;
+ sEffInfoTable[3].destroy(&sEffTable.shieldParticles[i].params);
+ }
+
+ for (i = 0; i < TIRE_MARK_COUNT; i++) {
+ sEffTable.tireMarks[i].base.active = 0;
+ sEffInfoTable[4].destroy(&sEffTable.tireMarks[i].params);
+ }
+}