summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMegaMech <MegaMech@users.noreply.github.com>2023-08-10 20:54:11 -0600
committerGitHub <noreply@github.com>2023-08-10 20:54:11 -0600
commitbaaa2f930df781ae8bb6d0f9c448f4b1ae14f97d (patch)
tree9b04616c6d0bff80e492289c350113654b037bf2 /src
parent04e9e00227b763cce40e300f40efc18fa76f2904 (diff)
Match Segment 3 -> Matched code_80280650.c (#363)
* Match & doc code_80280650.c * Update readme
Diffstat (limited to 'src')
-rw-r--r--src/camera_junk.c4
-rw-r--r--src/camera_junk.h2
-rw-r--r--src/ceremony_and_credits.c2
-rw-r--r--src/code_80280650.c479
-rw-r--r--src/code_80280650.h105
-rw-r--r--src/code_80281780.c14
-rw-r--r--src/code_80281780.h3
-rw-r--r--src/code_80281C40.c15
-rw-r--r--src/code_80281C40.h9
-rw-r--r--src/debug/all_variables.h2
-rw-r--r--src/main.c4
-rw-r--r--src/podium_ceremony_actors.c484
-rw-r--r--src/podium_ceremony_actors.h108
13 files changed, 624 insertions, 607 deletions
diff --git a/src/camera_junk.c b/src/camera_junk.c
index 5c2dd4eec..6b95eafe0 100644
--- a/src/camera_junk.c
+++ b/src/camera_junk.c
@@ -6,7 +6,7 @@
#include "math_util.h"
#include "ceremony_and_credits.h"
-void setup_camera_ending_sequence(void) {
+void setup_camera_podium_ceremony(void) {
Camera *camera;
f32 x_dist;
f32 y_dist;
@@ -23,7 +23,7 @@ void setup_camera_ending_sequence(void) {
camera->rot[2] = 0;
}
-// GP Ending sequence camera settings?
+// GP podium ceremony camera settings?
void func_802816B8(void) {
cameras[0].pos[0] = -3133.0f;
cameras[0].pos[1] = 19.0f;
diff --git a/src/camera_junk.h b/src/camera_junk.h
index 402ef8ae1..f11ffaa63 100644
--- a/src/camera_junk.h
+++ b/src/camera_junk.h
@@ -3,7 +3,7 @@
/* Function Prototypes */
-void setup_camera_ending_sequence();
+void setup_camera_podium_ceremony();
void func_802816B8();
// guPerspective params
diff --git a/src/ceremony_and_credits.c b/src/ceremony_and_credits.c
index 3241c79bf..2aeedc0da 100644
--- a/src/ceremony_and_credits.c
+++ b/src/ceremony_and_credits.c
@@ -17,7 +17,7 @@
#include "camera.h"
#include "audio/external.h"
#include <sounds.h>
-#include "code_80280650.h"
+#include "podium_ceremony_actors.h"
#include "code_80091750.h"
extern f32 D_80150130[];
diff --git a/src/code_80280650.c b/src/code_80280650.c
deleted file mode 100644
index 894f44cb7..000000000
--- a/src/code_80280650.c
+++ /dev/null
@@ -1,479 +0,0 @@
-#include <ultra64.h>
-#include <macros.h>
-#include <types.h>
-#include <debug.h>
-#include <common_structs.h>
-#include "main.h"
-#include "memory.h"
-#include "variables.h"
-#include "common_textures.h"
-#include "code_8001F980.h"
-#include "hud_renderer.h"
-#include "code_80280650.h"
-#include "camera_junk.h"
-#include "code_80027D00.h"
-#include "code_80057C60.h"
-#include "code_80005FD0.h"
-#include "code_80281C40.h"
-
-void func_80280650(void) {
-
-}
-
-void func_80280658(struct UnkStruct_80280658 *arg0) {
- struct UnkStruct_80280658_2 *temp_v0 = arg0->unk28;
-
- arg0->unk10 = temp_v0->unk2;
- arg0->unk14 = temp_v0->unk4;
- arg0->unk18 = temp_v0->unk6;
- arg0->unkA = temp_v0->unk8 << 8;
- arg0->unkC = temp_v0->unk9 << 8;
- arg0->unkE = temp_v0->unkA << 8;
- arg0->unk4 = temp_v0->unk0;
-}
-
-struct UnkStruct_80280658 *func_802806C8(void) {
- UNUSED s32 pad[2];
- struct UnkStruct_80280658 *phi_a0 = D_802874F8;
- s32 i;
-
- for (i = 0; i < 0xC8 ; i++) {
-
- if ((phi_a0->unk0 & 1) == 0) {
- bzero(phi_a0, 0x4C);
- phi_a0->unk0 = 1;
- phi_a0->unk24 = 1.0f;
- return phi_a0;
- }
-
- phi_a0++;
- }
- return NULL;
-}
-
-struct UnkStruct_80280658 *func_80280734(struct UnkStruct_80280658 *arg0) {
- struct UnkStruct_80280658 *temp_v0 = func_802806C8();
-
- temp_v0->unk28 = (struct UnkStruct_80280658_2 *) arg0;
- func_80280658(temp_v0);
- return temp_v0;
-}
-
-extern u16 sRandomSeed16; // = 0; todo: import
-
-u16 random_u16_credits(void) {
- u16 temp1, temp2;
-
- if (sRandomSeed16 == 22026) {
- sRandomSeed16 = 0;
- }
-
- temp1 = (sRandomSeed16 & 0x00FF) << 8;
- temp1 = temp1 ^ sRandomSeed16;
-
- sRandomSeed16 = ((temp1 & 0x00FF) << 8) + ((temp1 & 0xFF00) >> 8);
-
- temp1 = ((temp1 & 0x00FF) << 1) ^ sRandomSeed16;
- temp2 = (temp1 >> 1) ^ 0xFF80;
-
- if ((temp1 & 1) == 0) {
- if (temp2 == 43605) {
- sRandomSeed16 = 0;
- } else {
- sRandomSeed16 = temp2 ^ 0x1FF4;
- }
- } else {
- sRandomSeed16 = temp2 ^ 0x8180;
- }
-
- return sRandomSeed16;
-}
-
-f32 random_float_between_0_and_1(void) {
- return random_u16_credits() / 65536.0f;
-}
-
-f32 func_80280850(f32 arg0) {
- return (random_float_between_0_and_1() * arg0) - (arg0 * 0.5f);
-}
-
-void func_80280884(void) {
-
-}
-
-#ifdef NON_MATCHING
-//generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307
-f32 sins(u16);
-extern f32 D_80286B70;
-extern s16 D_802874CA;
-
-void func_8028088C(struct UnkStruct_8028088C *arg0) {
- f32 temp_f0;
- s32 temp_at;
- s32 temp_t3;
-
- func_8006BB34(arg0+1, 0x3F800000, arg0->unk2E, arg0->unk2C);
- arg0->unk14 += D_80286B70;
- temp_f0 = sins(arg0->unk30);
- temp_t3 = arg0->unk3C + 1;
- temp_at = temp_t3 < 0x321;
- arg0->unk30 += arg0->unk32;
- arg0->unk3C = temp_t3;
- arg0->unk2E = temp_f0 * arg0->unk34;
- if (temp_at == 0) {
- arg0->unk0 = 0;
- }
- if (D_802874CA == 1) {
- arg0->unk0 = 0;
- }
-}
-#else
-GLOBAL_ASM("asm/non_matchings/code_80280650/func_8028088C.s")
-#endif
-
-s32 D_80284E40[] = {
- 0x00FF4080, 0x008040FF, 0x0040FF40, 0x00FFFF40
-};
-
-void func_8028093C(struct UnkStruct_80280658 *arg0) {
- struct UnkStruct_80280658 *temp_v0;
-
- if (arg0->unk44 < 0x1E) {
- arg0->unk14 += 2.5f;
- arg0->unk10 += func_80280850(0.2f);
- arg0->unk18 += func_80280850(0.2f);
- } else if (arg0->unk2C == 4) {
- temp_v0 = func_80280734((struct UnkStruct_80280658 *)&D_80284E7C);
- temp_v0->unk10 = arg0->unk10;
- temp_v0->unk14 = arg0->unk14;
- temp_v0->unk18 = arg0->unk18;
- temp_v0->unk30 = D_80284E40[arg0->unk48];
- temp_v0->unk3C = 0xFF;
- temp_v0->unk40 = -0x11;
- temp_v0->unk44 = 0x64;
- temp_v0->unk34 = 1.8700001f;
- temp_v0->unk38 = 1.8700001f;
- }
-}
-
-void func_80280A28(Vec3f arg0, Vec3s arg1, f32 arg2) {
- Mat4 sp20;
-
- func_80021E10(sp20, arg0, arg1);
- sp20[0][0] = D_80287500[0][0] * arg2;
- sp20[0][1] = D_80287500[1][0] * arg2;
- sp20[0][2] = D_80287500[2][0] * arg2;
- sp20[1][0] = D_80287500[0][1] * arg2;
- sp20[1][1] = D_80287500[1][1] * arg2;
- sp20[1][2] = D_80287500[2][1] * arg2;
- sp20[2][0] = D_80287500[0][2] * arg2;
- sp20[2][1] = D_80287500[1][2] * arg2;
- sp20[2][2] = D_80287500[2][2] * arg2;
- func_80022180(&gGfxPool->mtxPool[D_80164AF0 + 0x3EB], sp20);
- gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPool[D_80164AF0 + 0x3EB]), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
-}
-
-void func_80280B50(Vec3f arg0, f32 arg1, s32 rgb, s16 alpha) {
- Vec3f sp4C;
- Vec3s sp44;
- s16 red;
- s16 green;
- s16 blue;
-
- sp4C[0] = arg0[0];
- sp4C[1] = arg0[1];
- sp4C[2] = arg0[2];
- sp44[0] = 0;
- sp44[1] = camera1->rot[1];
- sp44[2] = 0;
- func_80280A28(sp4C, sp44, arg1);
- gSPDisplayList(gDisplayListHead++, D_0D008DB8);
- gDPLoadTextureBlock(gDisplayListHead++, D_8018D48C, G_IM_FMT_IA, G_IM_SIZ_8b, 32, 32, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
- // ???????????????????????????????????
- red = ((rgb >> 0x10) & 0xFF) & 0xFF;
- green = ((rgb >> 0x08) & 0xFF) & 0xFF;
- blue = ((rgb >> 0x00) & 0xFF) & 0xFF;
- // ???????????????????????????????????
- func_8004B35C(red, green, blue, alpha);
- gSPDisplayList(gDisplayListHead++, D_0D008E48);
- D_80164AF0 += 1;
-}
-
-#ifdef MIPS_TO_C
-//generated by m2c commit d9d3d6575355663122de59f6b2882d8f174e2355 on Dec-10-2022
-static s32 D_80284E50[4] = { 0x007F2040, 0x0040207F, 0x00207F20, 0x007F7F20 };
-
-void func_80280D1C(void *arg0) {
- f32 sp60;
- f32 sp5C;
- f32 sp58;
- f32 temp_f0;
- s32 temp_v0;
- s32 var_s0;
- s32 var_s1;
- s32 var_v1;
-
- var_s0 = 0;
- var_s1 = 0;
- if (arg0->unk44 < 0x1E) {
- do {
- sp58 = arg0->unk10;
- sp5C = arg0->unk14 - (f32) var_s1;
- sp60 = arg0->unk18;
- func_80280B50(&sp58, ((f32) (0xA - var_s0) / 10.0f) * 2.0f, D_80284E50[arg0->unk48], (s16) (s32) ((f32) ((0x1E - arg0->unk44) * 0x64) / 30.0f));
- var_s0 += 1;
- var_s1 += 2;
- } while (var_s0 != 0xA);
- } else {
- temp_v0 = arg0->unk2C;
- if (temp_v0 < 5) {
- var_v1 = arg0->unk3C + (arg0->unk40 * 2);
- arg0->unk3C = var_v1;
- arg0->unk34 = (f32) (arg0->unk34 + (arg0->unk38 * 2.0f));
- } else {
- temp_f0 = 1.0f + ((f32) ((temp_v0 * 7) - 0x23) / 10.0f);
- var_v1 = (s32) ((f32) arg0->unk3C + ((f32) arg0->unk40 / temp_f0));
- arg0->unk3C = var_v1;
- arg0->unk34 = (f32) (arg0->unk34 + (arg0->unk38 / temp_f0));
- if (var_v1 < 0) {
- arg0->unk3C = 0;
- var_v1 = 0;
- }
- }
- arg0->unk2C = (s32) (arg0->unk2C + 1);
- if ((var_v1 <= 0) || !(arg0->unk34 > 0.0f)) {
- if (arg0->unk2C < 0x1E) {
- goto block_12;
- }
- arg0->unk0 = 0;
- } else {
-block_12:
- func_80280B50(arg0 + 0x10, arg0->unk34, arg0->unk30, (s16) var_v1);
- }
- }
- arg0->unk44 = (s32) (arg0->unk44 + 1);
-}
-#else
-GLOBAL_ASM("asm/non_matchings/code_80280650/func_80280D1C.s")
-#endif
-
-void func_80280FA0(UNUSED s32 arg0) {
-
-}
-
-void func_80280FA8(UNUSED s32 arg0) {
-
-}
-
-void func_80280FB0(void) {
- D_802874E0 = 0;
- D_802874F8 = (struct UnkStruct_80280658 *) get_next_available_memory_addr(0x3B60);
- bzero(D_802874F8, 0x3B60);
- func_80280734((struct UnkStruct_80280658 *)&D_80284E88);
-}
-
-void func_80280FFC(void) {
- D_802874F4 = 1;
-}
-
-void func_8028100C(UNUSED s32 arg0, UNUSED s32 arg1, UNUSED s32 arg2) {
-
-}
-
-#ifdef MIPS_TO_C
-//generated by m2c commit 8267401fa4ef7a38942dcca43353cc1bcc6efabc
-static struct UnkStruct_80280658 D_80284E64; /* type too large by 0x40; unable to generate initializer */
-static f32 D_80286B80 = 3000.0f;
-
-void func_8028101C(s32 arg0, s32 arg1, s32 arg2) {
- f32 sp64;
- f32 sp60;
- f32 sp5C;
- s32 var_s1;
- struct UnkStruct_80280658 *temp_s0;
-
- var_s1 = 0;
- sp5C = (f32) arg2;
- sp60 = (f32) arg1;
- sp64 = (f32) arg0;
- do {
- temp_s0 = func_80280734(&D_80284E64);
- temp_s0->unk10 = func_80280850(200.0f) + sp64;
- temp_s0->unk14 = func_80280850(380.0f) + sp60;
- temp_s0->unk18 = func_80280850(600.0f) + sp5C;
- temp_s0->unk2C = (s16) (s32) (random_float_between_0_and_1() * 7.0f);
- temp_s0->unk30 = random_u16_credits();
- temp_s0->unk32 = (s16) (s32) (func_80280850(400.0f) + 900.0f);
- var_s1 += 1;
- temp_s0->unk34 = (s16) (s32) (func_80280850(2000.0f) + D_80286B80);
- } while (var_s1 != 0x64);
-}
-#else
-GLOBAL_ASM("asm/non_matchings/code_80280650/func_8028101C.s")
-#endif
-
-#ifdef MIPS_TO_C
-//generated by m2c commit 8267401fa4ef7a38942dcca43353cc1bcc6efabc
-extern s16 D_802874BE;
-extern s16 D_802874C6;
-extern s16 D_802874C8;
-extern s32 D_80287540;
-static s32 D_80284E50[4] = { 0x007F2040, 0x0040207F, 0x00207F20, 0x007F7F20 };
-static struct UnkStruct_80280658 D_80284E70; /* type too large by 0x40; unable to generate initializer */
-static f32 D_80286B84 = 1.1f;
-
-void func_8028118C(s32 arg0, s32 arg1, s32 arg2) {
- f32 temp_f0;
- f32 temp_f2;
- s32 temp_v0;
- s32 temp_v1;
- struct UnkStruct_80280658 *temp_s0;
-
- if (((f32) (D_802874BE + 0xD) * random_float_between_0_and_1()) < 1.0f) {
- temp_s0 = func_80280734(&D_80284E70);
- temp_s0->unk10 = func_80280850(0.0f) + (f32) arg0;
- temp_s0->unk14 = func_80280850((f32) (D_802874C6 + 0x64)) + (f32) arg1;
- temp_f0 = func_80280850((f32) (D_802874C8 + 0x2BC));
- temp_v1 = D_80287540;
- temp_f2 = D_80286B84;
- temp_v0 = temp_v1 & 3;
- temp_s0->unk48 = temp_v0;
- temp_s0->unk18 = temp_f0 + (f32) arg2;
- temp_s0->unk3C = 0x000000FF;
- temp_s0->unk40 = -0x00000011;
- temp_s0->unk34 = temp_f2;
- temp_s0->unk38 = temp_f2;
- temp_s0->unk30 = D_80284E50[temp_v0];
- D_80287540 = temp_v1 + 1;
- }
-}
-#else
-GLOBAL_ASM("asm/non_matchings/code_80280650/func_8028118C.s")
-#endif
-
-#ifdef MIPS_TO_C
-//generated by m2c commit 3b40ab93768f52ac241c5ae84ef58ef6bc4cb1de
-void func_8028101C(?, s32, ?); /* extern */
-void func_8028118C(?, s32, ?); /* extern */
-void guLookAtF(? *, f32, f32, f32, f32, f32, f32, f32, f32, f32); /* extern */
-extern s16 D_802874C4;
-extern s32 D_802874E0;
-extern Mat4 D_80287500;
-
-void func_802812C8(void) {
- f32 temp_f0;
- s32 var_v0;
-
- guLookAtF(&D_80287500, cameras->pos[0], cameras->pos[1], cameras->pos[2], cameras->lookAt[0], cameras->lookAt[1], cameras->lookAt[2], cameras->up[0], cameras->up[1], cameras->up[2]);
- if (D_802874F5 < 3) {
- var_v0 = D_802874E0;
- if (var_v0 < 0x12C) {
- temp_f0 = cameras->lookAt[1];
- func_8028118C(-0xE0E, (s32) (((temp_f0 - cameras->pos[1]) * 1.5f) + temp_f0), -0x258);
- var_v0 = D_802874E0;
- }
- if (var_v0 == 0x00000078) {
- func_8028101C(-0xC6C, (s32) ((f32) D_802874C4 + 210.0f), -0x1EF);
- goto block_7;
- }
- } else {
- var_v0 = D_802874E0;
- if (var_v0 == 2) {
- func_8028101C(-0xC6C, (s32) ((f32) D_802874C4 + 210.0f), -0x1EF);
-block_7:
- var_v0 = D_802874E0;
- }
- }
- D_802874E0 = var_v0 + 1;
-}
-#else
-GLOBAL_ASM("asm/non_matchings/code_80280650/func_802812C8.s")
-#endif
-
-#ifdef MIPS_TO_C
-//generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307
-void func_802812C8(); // extern
-extern ? D_80284E94;
-extern s16 D_802874D0;
-extern void *D_802874F8;
-
-void func_80281438(void) {
- ? (*temp_v0)(void *);
- s32 temp_s1;
- s32 temp_s2;
- void *phi_s0;
- s32 phi_s2;
- s32 phi_s1;
-
- func_802812C8();
- D_802874D0 = 0;
- phi_s2 = 0;
- do {
- phi_s0 = D_802874F8;
- phi_s1 = 0;
-loop_2:
- if ((phi_s0->unk0 & 1) != 0) {
- temp_v0 = *(&D_80284E94 + (phi_s0->unk4 * 0xC) + (phi_s2 * 4));
- if (temp_v0 != 0) {
- temp_v0(phi_s0);
- }
- }
- temp_s1 = phi_s1 + 1;
- phi_s0 += 0x4C;
- phi_s1 = temp_s1;
- if (temp_s1 != 0xC8) {
- goto loop_2;
- }
- temp_s2 = phi_s2 + 1;
- phi_s2 = temp_s2;
- } while (temp_s2 != 3);
-}
-#else
-GLOBAL_ASM("asm/non_matchings/code_80280650/func_80281438.s")
-#endif
-
-void func_8028150C(void) {
- D_802874D4 = gDisplayListHead;
-}
-
-void func_80281520(void) {
-
-}
-
-void func_80281528(void) {
-
-}
-
-void func_80281530(void) {
-
-}
-
-void func_80281538(void) {
-
-}
-
-void func_80281540(void) {
-
-}
-
-void ending_sequence_loop(void) {
- D_80150112 = 0;
- D_802874FC = 0;
- setup_camera_ending_sequence();
- func_80028F70();
- func_80022744();
- func_80059AC8();
- func_80059AC8();
- func_8005A070();
- if (D_802874F4 != 0) {
- func_8001C14C();
- func_800097E0();
- }
- func_80281D00();
- func_80281540();
-#if VARIABLE_WATCH_DEBUG_LIST
- display_dvdl();
-#endif
- gDPFullSync(gDisplayListHead++);
- gSPEndDisplayList(gDisplayListHead++);
-}
diff --git a/src/code_80280650.h b/src/code_80280650.h
deleted file mode 100644
index 7798a718d..000000000
--- a/src/code_80280650.h
+++ /dev/null
@@ -1,105 +0,0 @@
-#ifndef CODE_80280650_H
-#define CODE_80280650_H
-
-#include "common_structs.h"
-
-struct UnkStruct_80280658 {
- s32 unk0;
- s16 unk4;
- s16 unk6;
- s8 unk8;
- s8 unk9;
- s16 unkA;
- s16 unkC;
- s16 unkE;
- f32 unk10;
- f32 unk14;
- f32 unk18;
- f32 unk1C;
- f32 unk20;
- f32 unk24;
- struct UnkStruct_80280658_2 *unk28;
- s32 unk2C;
- s32 unk30;
- f32 unk34;
- f32 unk38;
- s32 unk3C;
- s32 unk40;
- s32 unk44;
- s32 unk48;
-};
-
-struct UnkStruct_80280658_2 {
- s16 unk0;
- s16 unk2;
- s16 unk4;
- s16 unk6;
- s8 unk8;
- s8 unk9;
- s8 unkA;
- f32 unkC;
-};
-
-struct UnkStruct_8028088C {
- s32 unk0;
- s16 unk4;
- s16 unk6;
- s8 unk8;
- s8 unk9;
- s16 unkA;
- s16 unkC;
- s16 unkE;
- f32 unk10;
- f32 unk14;
- f32 unk18;
- f32 unk1C;
- f32 unk20;
- f32 unk24;
- struct UnkStruct_80280658_2 *unk28;
- s16 unk2C;
- s16 unk2E;
- s16 unk30;
- s16 unk32;
- s16 unk34;
- s16 unk36;
- s32 unk38;
- s32 unk3C;
-};
-
-void func_80281438(void);
-void func_80280650();
-void func_80280658(struct UnkStruct_80280658*);
-struct UnkStruct_80280658 *func_802806C8();
-struct UnkStruct_80280658 *func_80280734(struct UnkStruct_80280658*);
-u16 random_u16_credits();
-f32 random_float_between_0_and_1();
-f32 func_80280850(f32);
-void func_80280884();
-void func_8028093C(struct UnkStruct_80280658*);
-void func_80280A28(Vec3f, Vec3s, f32 );
-void func_80280B50(Vec3f, f32, s32, s16);
-void func_80280FA0(s32);
-void func_80280FA8(s32);
-void func_80280FB0();
-void func_80280FFC();
-void func_8028100C(s32, s32, s32);
-void func_8028150C();
-void func_80281520();
-void func_80281528();
-void func_80281530();
-void func_80281538();
-void func_80281540();
-void ending_sequence_loop();
-
-extern struct UnkStruct_80280658 *D_802874F8;
-extern struct UnkStruct_80280658 *D_80284E7C;
-extern struct UnkStruct_80280658 *D_80284E88;
-
-extern s32 D_802874E0;
-extern s8 D_802874F4;
-extern Gfx *D_802874D4;
-extern s32 D_802874FC;
-extern Mat4 D_80287500;
-extern s16 D_80164AF0;
-
-#endif
diff --git a/src/code_80281780.c b/src/code_80281780.c
index 9e0b322d9..ccdfdf014 100644
--- a/src/code_80281780.c
+++ b/src/code_80281780.c
@@ -9,10 +9,15 @@
#include "spawn_players.h"
#include "skybox_and_splitscreen.h"
#include "code_8006E9C0.h"
-#include "code_80280650.h"
+#include "podium_ceremony_actors.h"
#include "code_80281780.h"
#include "code_80005FD0.h"
#include "code_802AAA70.h"
+#include "code_80281C40.h"
+
+u8 defaultCharacterIds[] = {
+ 1, 2, 3, 4, 5, 6, 7, 0
+};
void debug_switch_character_ceremony_cutscene(void) {
if (gEnableDebugMode) {
@@ -41,8 +46,9 @@ void debug_switch_character_ceremony_cutscene(void) {
} else {
gCharacterSelections[0] = MARIO;
}
- // D_80284ED0 appears to be unused.
- bcopy(&D_80284ED0, &gCharacterIdByGPOverallRank, 8);
+ // todo: confirm this.
+ // Resets gCharacterIdByGPOverallRank to default?
+ bcopy(&defaultCharacterIds, &gCharacterIdByGPOverallRank, 8);
}
}
}
@@ -137,7 +143,7 @@ void load_ceremony_cutscene(void) {
func_8003D080();
func_8006E9C0();
func_8001C05C();
- func_80280FB0();
+ balloons_and_fireworks_init();
func_802816B8();
func_80093E60();
D_801625F8 = (s32) gHeapEndPtr - gNextFreeMemoryAddress;
diff --git a/src/code_80281780.h b/src/code_80281780.h
index 949ba8d73..63fdf5830 100644
--- a/src/code_80281780.h
+++ b/src/code_80281780.h
@@ -29,7 +29,6 @@ extern u16 D_800DC5BC;
extern u16 D_800DC5C8;
extern struct UnkStruct_800DC5EC *D_800DC5EC;
-extern u32 gMenuSelectionFromEndingSequence; //D_80287550;
extern s32 D_80287554;
extern f32 D_801647A4;
extern f32 D_80150130[];
@@ -61,7 +60,7 @@ extern struct Controller *gControllerOne;
extern s8 gCharacterSelections[];
extern u16 gEnableDebugMode;
-extern void *D_80284ED0;
+extern u8 defaultCharacterIds[];
extern s8 gGPOverallRanks[8];
extern s8 D_8018EDF3;
diff --git a/src/code_80281C40.c b/src/code_80281C40.c
index 2f751c3c5..0f6e3aba3 100644
--- a/src/code_80281C40.c
+++ b/src/code_80281C40.c
@@ -7,11 +7,24 @@
#include "hud_renderer.h"
#include "code_80057C60.h"
#include "code_80091750.h"
-#include "code_80280650.h"
+#include "podium_ceremony_actors.h"
#include "code_80281C40.h"
#include "ceremony_and_credits.h"
#include "code_8001F980.h"
+struct UnkStruct80287560 {
+ s16 unk0;
+ s16 unk2;
+ s32 unk4;
+ s32 unk8;
+}; // 0xC
+
+/** bss **/
+u32 gMenuSelectionFromEndingSequence;
+s32 D_80287554;
+s32 D_80281C40_pad[2];
+struct UnkStruct80287560 D_80287560[30];
+
void func_80281C40(void) {
s32 i;
diff --git a/src/code_80281C40.h b/src/code_80281C40.h
index d150bb76d..fc6dd8816 100644
--- a/src/code_80281C40.h
+++ b/src/code_80281C40.h
@@ -1,24 +1,15 @@
#ifndef CODE_80281C40_H
#define CODE_80281C40_h
-struct UnkStruct80287560 {
- s16 unk0;
- s16 unk2;
- s32 unk4;
- s32 unk8;
-}; // 0xC
-
/* Function Prototypes */
void func_80281C40();
void func_80281CB4(s32, s32, s32, s32);
void func_80281D00();
-extern struct UnkStruct80287560 D_80287560[];
extern s32 D_802874FC;
extern u32 gMenuSelectionFromEndingSequence;
-extern s32 D_80287554;
extern u16 gIsInQuitToMenuTransition;
extern Gfx D_00284F70[];
extern Gfx D_00284EE0[];
diff --git a/src/debug/all_variables.h b/src/debug/all_variables.h
index fd05a271b..85f2b4679 100644
--- a/src/debug/all_variables.h
+++ b/src/debug/all_variables.h
@@ -26,7 +26,7 @@
#include <code_800AF9B0.h>
#include <code_800B45E0.h>
#include <code_80280000.h>
-#include <code_80280650.h>
+#include <podium_ceremony_actors.h>
#include <code_80281780.h>
#include <code_80281C40.h>
#include <code_802AAA70.h>
diff --git a/src/main.c b/src/main.c
index 4e3737f37..06e243f63 100644
--- a/src/main.c
+++ b/src/main.c
@@ -23,7 +23,7 @@
#include "audio/external.h"
#include "code_800029B0.h"
#include "code_80280000.h"
-#include "code_80280650.h"
+#include "podium_ceremony_actors.h"
#include "code_80091750.h"
#include "code_80057C60.h"
#include "profiler.h"
@@ -872,7 +872,7 @@ void game_state_handler(void) {
race_logic_loop();
break;
case ENDING_SEQUENCE:
- ending_sequence_loop();
+ podium_ceremony_loop();
break;
case CREDITS_SEQUENCE:
credits_loop();
diff --git a/src/podium_ceremony_actors.c b/src/podium_ceremony_actors.c
new file mode 100644
index 000000000..3bda653d0
--- /dev/null
+++ b/src/podium_ceremony_actors.c
@@ -0,0 +1,484 @@
+#include <ultra64.h>
+#include <macros.h>
+#include <PR/gu.h>
+#include <mk64.h>
+#include <types.h>
+#include <debug.h>
+#include <common_structs.h>
+#include "main.h"
+#include "memory.h"
+#include "variables.h"
+#include "common_textures.h"
+#include "code_8001F980.h"
+#include "hud_renderer.h"
+#include "podium_ceremony_actors.h"
+#include "camera_junk.h"
+#include "code_80027D00.h"
+#include "code_80057C60.h"
+#include "code_80005FD0.h"
+#include "code_80281C40.h"
+#include "math_util.h"
+
+s32 fireworkConeColour[] = {
+ 0x00FF4080, // pink
+ 0x008040FF, // purple
+ 0x0040FF40, // green
+ 0x00FFFF40 // yellow
+};
+
+/**
+ * Mainly colours the explosion effect.
+ * Appears to colour the cones as well.
+*/
+s32 fireworkColour[] = {
+ 0x007F2040, // red
+ 0x0040207F, // purple
+ 0x00207F20, // green
+ 0x007F7F20 // gold/yellow
+};
+
+u16 sRandomSeed16 = 0;
+
+UnkStruct_80284E64 D_80284E64 = {
+ 1,
+ 0xF3AF,
+ 34,
+ 0xFE2D,
+ 0,
+ 0,
+ 0,
+ 0,
+};
+
+UnkStruct_80284E64 D_80284E70 = {
+ 3,
+ 0xF3AF,
+ 34,
+ 0xFE2D,
+ 0,
+ 0,
+ 0,
+ 0,
+};
+
+UnkStruct_80284E64 D_80284E7C = {
+ 2,
+ 0xF3AF,
+ 34,
+ 0xFE2D,
+ 0,
+ 0,
+ 0,
+ 0,
+};
+
+UnkStruct_80284E64 D_80284E88 = {
+ 0,
+ 0xF2CC,
+ 250,
+ 0xFE11,
+ 0,
+ 0,
+ 0,
+ 0,
+};
+
+void func_80280650(void) {
+
+}
+
+void set_actor_with_next(struct UnkStruct_80280658 *arg0) {
+ UnkStruct_80284E64 *temp_v0 = arg0->unk28;
+
+ arg0->unk10[0] = temp_v0->unk2;
+ arg0->unk10[1] = temp_v0->unk4;
+ arg0->unk10[2] = temp_v0->unk6;
+
+ // Place value in the high bits of s16.
+ // Example: 85, 0b01010101 -> 0b0101010100000000
+ arg0->unkA = temp_v0->unk8 << 8;
+ arg0->unkC = temp_v0->unk9 << 8;
+ arg0->unkE = temp_v0->unkA << 8;
+ arg0->unk4 = temp_v0->unk0;
+}
+
+struct UnkStruct_80280658 *find_available_entry(void) {
+ UNUSED s32 pad[2];
+ struct UnkStruct_80280658 *phi_a0 = D_802874F8;
+ s32 i;
+
+ for (i = 0; i < 200 ; i++) {
+
+ // Find an unused actor, initialize and return it.
+ if ((phi_a0->unk0 & 1) == 0) {
+ bzero(phi_a0, 0x4C);
+ phi_a0->unk0 = 1;
+ phi_a0->unk24 = 1.0f;
+ return phi_a0;
+ }
+
+ phi_a0++;
+ }
+ return NULL;
+}
+
+struct UnkStruct_80280658 *new_actor(UnkStruct_80284E64 *arg0) {
+ struct UnkStruct_80280658 *actor = find_available_entry();
+
+ // @bug No null check.
+ // todo: What am I even supposed to return here?
+ // I guess the other funcs need checks too
+ #ifdef AVOID_UB
+ if (actor == NULL) {
+ // Something has gone terribly wrongg
+ while(1);
+ return NULL; // prevent warnings
+ }
+ #endif
+
+ // Linked list?
+ actor->unk28 = arg0;
+ set_actor_with_next(actor);
+ return actor;
+}
+
+u16 random_u16_credits(void) {
+ u16 temp1, temp2;
+
+ if (sRandomSeed16 == 22026) {
+ sRandomSeed16 = 0;
+ }
+
+ temp1 = (sRandomSeed16 & 0x00FF) << 8;
+ temp1 = temp1 ^ sRandomSeed16;
+
+ sRandomSeed16 = ((temp1 & 0x00FF) << 8) + ((temp1 & 0xFF00) >> 8);
+
+ temp1 = ((temp1 & 0x00FF) << 1) ^ sRandomSeed16;
+ temp2 = (temp1 >> 1) ^ 0xFF80;
+
+ if ((temp1 & 1) == 0) {
+ if (temp2 == 43605) {
+ sRandomSeed16 = 0;
+ } else {
+ sRandomSeed16 = temp2 ^ 0x1FF4;
+ }
+ } else {
+ sRandomSeed16 = temp2 ^ 0x8180;
+ }
+
+ return sRandomSeed16;
+}
+
+f32 random_float_between_0_and_1(void) {
+ return random_u16_credits() / 65536.0f;
+}
+
+f32 random_who_knows(f32 arg0) {
+ return (random_float_between_0_and_1() * arg0) - (arg0 * 0.5f);
+}
+
+void func_80280884(void) {
+
+}
+
+extern s16 D_802874CA;
+
+void func_8028088C(struct UnkStruct_80280658 *arg0) {
+ func_8006BB34(arg0->unk10, 1.0f, arg0->unk2E, arg0->unk2C);
+ arg0->unk10[1] += 0.8f;
+ arg0->unk2E = sins(arg0->unk30) * arg0->unk34;
+ arg0->unk30 += arg0->unk32;
+ arg0->unk3C++;
+ if (arg0->unk3C >= 0x321) {
+ arg0->unk0 = 0;
+ }
+ if (D_802874CA == 1) {
+ arg0->unk0 = 0;
+ }
+}
+
+/**
+ * Spawns an aerial shell that ascends into the sky.
+ * (note that the explode effect is a different actor)
+*/
+void spawn_firework_cone(Firework *cone) {
+ Firework *actor;
+
+ if (cone->unk44 < 0x1E) {
+ cone->unk10[1] += 2.5f;
+ cone->unk10[0] += random_who_knows(0.2f);
+ cone->unk10[2] += random_who_knows(0.2f);
+ } else if (cone->unk2C == 4) {
+ actor = (Firework *) new_actor(&D_80284E7C);
+ actor->unk10[0] = cone->unk10[0];
+ actor->unk10[1] = cone->unk10[1];
+ actor->unk10[2] = cone->unk10[2];
+ actor->unk30 = fireworkConeColour[cone->unk48];
+ actor->unk3C = 0xFF;
+ actor->unk40 = -0x11;
+ actor->unk44 = 0x64;
+ actor->unk34 = 1.8700001f;
+ actor->unk38 = 1.8700001f;
+ }
+}
+
+Mat4 D_80287500;
+
+void func_80280A28(Vec3f arg0, Vec3s arg1, f32 arg2) {
+ Mat4 sp20;
+
+ func_80021E10(sp20, arg0, arg1);
+ sp20[0][0] = D_80287500[0][0] * arg2;
+ sp20[0][1] = D_80287500[1][0] * arg2;
+ sp20[0][2] = D_80287500[2][0] * arg2;
+ sp20[1][0] = D_80287500[0][1] * arg2;
+ sp20[1][1] = D_80287500[1][1] * arg2;
+ sp20[1][2] = D_80287500[2][1] * arg2;
+ sp20[2][0] = D_80287500[0][2] * arg2;
+ sp20[2][1] = D_80287500[1][2] * arg2;
+ sp20[2][2] = D_80287500[2][2] * arg2;
+ func_80022180(&gGfxPool->mtxPool[D_80164AF0 + 0x3EB], sp20);
+ gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPool[D_80164AF0 + 0x3EB]), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+}
+
+void render_fireworks(Vec3f arg0, f32 arg1, s32 rgb, s16 alpha) {
+ Vec3f sp4C;
+ Vec3s sp44;
+ s16 red;
+ s16 green;
+ s16 blue;
+
+ sp4C[0] = arg0[0];
+ sp4C[1] = arg0[1];
+ sp4C[2] = arg0[2];
+ sp44[0] = 0;
+ sp44[1] = camera1->rot[1];
+ sp44[2] = 0;
+ func_80280A28(sp4C, sp44, arg1);
+ gSPDisplayList(gDisplayListHead++, D_0D008DB8);
+ gDPLoadTextureBlock(gDisplayListHead++, D_8018D48C, G_IM_FMT_IA, G_IM_SIZ_8b, 32, 32, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
+ // ???????????????????????????????????
+ red = ((rgb >> 0x10) & 0xFF) & 0xFF;
+ green = ((rgb >> 0x08) & 0xFF) & 0xFF;
+ blue = ((rgb >> 0x00) & 0xFF) & 0xFF;
+ // ???????????????????????????????????
+ func_8004B35C(red, green, blue, alpha);
+ gSPDisplayList(gDisplayListHead++, D_0D008E48);
+ D_80164AF0 += 1;
+}
+
+void func_80280D1C(Firework *actor) {
+ s32 i;
+ Vec3f sp58;
+ if (actor->unk44 < 30) {
+ for (i = 0; i < 10; i++) {
+ sp58[0] = actor->unk10[0];
+ sp58[1] = actor->unk10[1] - i * 2;
+ sp58[2] = actor->unk10[2];
+ render_fireworks(sp58, ((10 - i) / 10.0f) * 2, fireworkColour[actor->unk48], ( ((((30 - actor->unk44) * 100)) / 30.0f)));
+ }
+
+ } else {
+ if (actor->unk2C < 5) {
+ actor->unk3C += actor->unk40 * 2;
+ actor->unk34 += actor->unk38 * 2;
+ } else {
+ actor->unk3C += actor->unk40 / ( 1.0f + ( ( (actor->unk2C * 7) - 0x23 ) / 10.0f ) );
+ actor->unk34 += actor->unk38 / ( 1.0f + ( ( (actor->unk2C * 7) - 0x23 ) / 10.0f ) );
+ if (actor->unk3C < 0) {
+ actor->unk3C = 0;
+ }
+ }
+ actor->unk2C += 1;
+ if (((actor->unk3C > 0) && ((actor->unk34 > 0.0f))) || (actor->unk2C < 30)) {
+ render_fireworks(actor->unk10, actor->unk34, actor->unk30, (s16) actor->unk3C);
+ } else {
+ actor->unk0 = 0;
+ }
+ }
+ actor->unk44 += 1;
+}
+
+void func_80280FA0(UNUSED s32 arg0) {
+
+}
+
+void func_80280FA8(UNUSED s32 arg0) {
+
+}
+
+void balloons_and_fireworks_init(void) {
+ D_802874E0 = 0;
+ D_802874F8 = (struct UnkStruct_80280658 *) get_next_available_memory_addr(0x3B60);
+ bzero(D_802874F8, 0x3B60);
+ new_actor(&D_80284E88);
+}
+
+void func_80280FFC(void) {
+ D_802874F4 = 1;
+}
+
+void func_8028100C(UNUSED s32 arg0, UNUSED s32 arg1, UNUSED s32 arg2) {
+
+}
+
+/**
+ * Spawn balloons!
+ * The floats passed to random_who_knows appears to effect the spread of the balloons
+*/
+void spawn_balloons(s32 arg0, s32 arg1, s32 arg2) {
+ s32 i;
+
+ for (i = 0; i < 100; i++) {
+ struct UnkStruct_80280658 *balloon;
+ balloon = new_actor(&D_80284E64);
+ balloon->unk10[0] = random_who_knows(200.0f) + arg0;
+ balloon->unk10[1] = random_who_knows(380.0f) + arg1;
+ balloon->unk10[2] = random_who_knows(600.0f) + arg2;
+ balloon->unk2C = (s16) (s32) (random_float_between_0_and_1() * 7.0f);
+ balloon->unk30 = random_u16_credits();
+ balloon->unk32 = (s16) (s32) (random_who_knows(400.0f) + 900.0f);
+ balloon->unk34 = (s16) (s32) (random_who_knows(2000.0f) + 3000.0f);
+ }
+}
+
+extern s16 D_802874BE[];
+extern s16 D_802874C6;
+extern s16 D_802874C8;
+extern s32 fireworkColour[];
+
+/**
+ * The explosive effect when the firework's charge detonates
+ * resulting in a small variety of amusing colours.
+*/
+void spawn_firework_burst(s32 arg0, s32 arg1, s32 arg2) {
+ f32 num;
+ static u32 D_80287540;
+
+ if (((f32) random_float_between_0_and_1() * (D_802874BE[0] + 0xD)) < 1.0f) {
+ Firework *burst;
+ burst = (Firework *) new_actor(&D_80284E70);
+ burst->unk10[0] = random_who_knows(0.0f) + arg0;
+ burst->unk10[1] = random_who_knows((f32) (D_802874C6 + 100)) + (f32) arg1;
+ burst->unk10[2] = random_who_knows((f32) (D_802874C8 + 700)) + (f32) arg2;
+
+ num = 1.1f;
+
+ // Wrap the counter from zero to three
+ burst->unk48 = D_80287540 % 4U;
+ burst->unk30 = fireworkColour[D_80287540 % 4U];
+ burst->unk34 = num;
+ burst->unk38 = num;
+ D_80287540 += 1;
+ burst->unk3C = 0xFF;
+ burst->unk40 = -0x11;
+ }
+}
+
+extern s16 D_802874C4;
+extern s32 D_802874E0;
+extern Mat4 D_80287500;
+
+extern s8 D_802874F5;
+
+/**
+ * Allegedly controls fireworks movement.
+*/
+void fireworks_update(void) {
+ Camera *camera = &cameras[0];
+ f32 temp_f0;
+
+ guLookAtF(D_80287500, camera->pos[0], camera->pos[1], camera->pos[2], camera->lookAt[0], camera->lookAt[1], camera->lookAt[2], camera->up[0], camera->up[1], camera->up[2]);
+ if (D_802874F5 < 3) {
+ if (D_802874E0 < 300) {
+ temp_f0 = camera->lookAt[1];
+ spawn_firework_burst(-0xE0E, (s32) (((temp_f0 - camera->pos[1]) * 1.5f) + temp_f0), -0x258);
+ }
+ if (D_802874E0 == 120) {
+ spawn_balloons(-0xC6C, (s32) ((f32) D_802874C4 + 210.0f), -0x1EF);
+ }
+ } else if (D_802874E0 == 2) {
+ spawn_balloons(-0xC6C, (s32) ((f32) D_802874C4 + 210.0f), -0x1EF);
+ }
+
+ D_802874E0 += 1;
+}
+
+void *D_80284E94[][3] = {
+ {func_80280FA8, func_80280FA0, 0},
+ {func_80280FA8, func_8028088C, 0},
+ {func_80280FA8, func_80280D1C, 0},
+ {spawn_firework_cone, 0, func_80280D1C},
+};
+
+extern s16 D_802874D0;
+
+void func_80281438(void) {
+ void (*func)(void *);
+ struct UnkStruct_80280658 *phi_s0;
+ s32 i;
+ s32 j;
+ fireworks_update();
+ D_802874D0 = 0;
+ for (i = 0; i < 3; i++) {
+ phi_s0 = D_802874F8;
+ for (j = 0; j < 200; j++) {
+ if ((phi_s0->unk0 & 1) != 0) {
+
+ func = D_80284E94[phi_s0->unk4][i];
+
+ if (func != 0) {
+ func(phi_s0);
+ }
+ }
+ phi_s0++;
+ }
+ }
+}
+
+void func_8028150C(void) {
+ D_802874D4 = gDisplayListHead;
+}
+
+void func_80281520(void) {
+
+}
+
+void func_80281528(void) {
+
+}
+
+void func_80281530(void) {
+
+}
+
+void func_80281538(void) {
+
+}
+
+void func_80281540(void) {
+
+}
+
+void podium_ceremony_loop(void) {
+ D_80150112 = 0;
+ D_802874FC = 0;
+ setup_camera_podium_ceremony();
+ func_80028F70();
+ func_80022744();
+ func_80059AC8();
+ func_80059AC8();
+ func_8005A070();
+ if (D_802874F4 != 0) {
+ func_8001C14C();
+ func_800097E0();
+ }
+ func_80281D00();
+ func_80281540();
+#if VARIABLE_WATCH_DEBUG_LIST
+ display_dvdl();
+#endif
+ gDPFullSync(gDisplayListHead++);
+ gSPEndDisplayList(gDisplayListHead++);
+}
diff --git a/src/podium_ceremony_actors.h b/src/podium_ceremony_actors.h
new file mode 100644
index 000000000..7acd78051
--- /dev/null
+++ b/src/podium_ceremony_actors.h
@@ -0,0 +1,108 @@
+#ifndef podium_ceremony_actors_H
+#define podium_ceremony_actors_H
+
+#include "common_structs.h"
+
+typedef struct {
+ s16 unk0;
+ s16 unk2;
+ s16 unk4;
+ s16 unk6;
+ s8 unk8;
+ s8 unk9;
+ s8 unkA;
+ s8 unkB;
+} UnkStruct_80284E64;
+
+struct UnkStruct_80280658 {
+ /* 0x00 */ s32 unk0;
+ /* 0x04 */ s16 unk4;
+ /* 0x06 */ s16 unk6;
+ /* 0x08 */ s8 unk8;
+ /* 0x09 */ s8 unk9;
+ /* 0x0A */ s16 unkA;
+ /* 0x0C */ s16 unkC;
+ /* 0x0E */ s16 unkE;
+ /* 0x10 */ Vec3f unk10;
+ /* 0x1C */ f32 unk1C;
+ /* 0x20 */ f32 unk20;
+ /* 0x24 */ f32 unk24;
+ /* 0x28 */ UnkStruct_80284E64 *unk28;
+ /* 0x2C */ s16 unk2C;
+ /* 0x2E */ s16 unk2E;
+ /* 0x30 */ s16 unk30;
+ /* 0x32 */ s16 unk32;
+ /* 0x34 */ s16 unk34;
+ /* 0x36 */ s16 unk36;
+ /* 0x38 */ f32 unk38;
+ /* 0x3C */ s32 unk3C;
+ /* 0x40 */ s32 unk40;
+ /* 0x44 */ s32 unk44;
+ /* 0x48 */ s32 unk48;
+};
+
+typedef struct {
+ /* 0x00 */ s32 unk0;
+ /* 0x04 */ s16 unk4;
+ /* 0x06 */ s16 unk6;
+ /* 0x08 */ s8 unk8;
+ /* 0x09 */ s8 unk9;
+ /* 0x0A */ s16 unkA;
+ /* 0x0C */ s16 unkC;
+ /* 0x0E */ s16 unkE;
+ /* 0x10 */ Vec3f unk10;
+ /* 0x1C */ f32 unk1C;
+ /* 0x20 */ f32 unk20;
+ /* 0x24 */ f32 unk24;
+ /* 0x28 */ UnkStruct_80284E64 *unk28;
+ /* 0x2C */ s32 unk2C;
+ /* 0x30 */ s32 unk30; // s32 instead of s16
+ /* 0x34 */ f32 unk34; // f32 instead of s16
+ /* 0x38 */ f32 unk38;
+ /* 0x3C */ s32 unk3C;
+ /* 0x40 */ s32 unk40;
+ /* 0x44 */ s32 unk44;
+ /* 0x48 */ s32 unk48;
+} Firework;
+
+void func_80281438(void);
+void func_80280650();
+void set_actor_with_next(struct UnkStruct_80280658*);
+struct UnkStruct_80280658 *find_available_entry();
+struct UnkStruct_80280658 *new_actor(UnkStruct_80284E64*);
+u16 random_u16_credits();
+f32 random_float_between_0_and_1();
+f32 random_who_knows(f32);
+void func_80280884();
+void spawn_firework_cone(Firework *);
+void func_80280A28(Vec3f, Vec3s, f32 );
+void render_fireworks(Vec3f, f32, s32, s16);
+void func_80280FA0(s32);
+void func_80280FA8(s32);
+void balloons_and_fireworks_init();
+void func_80280FFC();
+void func_8028100C(s32, s32, s32);
+void func_8028150C();
+void func_80281520();
+void func_80281528();
+void func_80281530();
+void func_80281538();
+void func_80281540();
+void podium_ceremony_loop();
+
+
+extern struct UnkStruct_80280658 *D_802874F8;
+
+extern UnkStruct_80284E64 D_80284E64;
+extern UnkStruct_80284E64 D_80284E7C;
+extern UnkStruct_80284E64 D_80284E88;
+extern UnkStruct_80284E64 D_80284E70;
+
+extern s32 D_802874E0;
+extern s8 D_802874F4;
+extern Gfx *D_802874D4;
+extern s32 D_802874FC;
+extern Mat4 D_80287500;
+extern s16 D_80164AF0;
+
+#endif