Some train decomp and move seg2 files to ending (#423)

* Some train decomp

* Move seg2 to ending/

* move racing code files into racing folder

* Fix progress

* Rename segments
This commit is contained in:
MegaMech
2023-09-17 16:57:18 -06:00
committed by GitHub
parent 3f221d6f25
commit 91fc8ea473
52 changed files with 429 additions and 1219 deletions
+42
View File
@@ -0,0 +1,42 @@
#include <ultra64.h>
#include <macros.h>
#include <common_structs.h>
#include "camera.h"
#include "camera_junk.h"
#include "math_util.h"
#include "ceremony_and_credits.h"
void setup_camera_podium_ceremony(void) {
Camera *camera;
f32 x_dist;
f32 y_dist;
f32 z_dist;
camera = &cameras[0];
func_80283648(camera);
x_dist = camera->lookAt[0] - camera->pos[0];
y_dist = camera->lookAt[1] - camera->pos[1];
z_dist = camera->lookAt[2] - camera->pos[2];
camera->rot[1] = atan2s(x_dist, z_dist);
camera->rot[0] = atan2s(sqrtf((x_dist * x_dist) + (z_dist * z_dist)), y_dist);
camera->rot[2] = 0;
}
// GP podium ceremony camera settings?
void func_802816B8(void) {
cameras[0].pos[0] = -3133.0f;
cameras[0].pos[1] = 19.0f;
cameras[0].pos[2] = -467.0f;
cameras[0].lookAt[0] = -3478.0f;
cameras[0].lookAt[1] = 21.0f;
cameras[0].lookAt[2] = -528.0f;
cameras[0].up[0] = 0.0f;
cameras[0].up[1] = 1.0f;
cameras[0].up[2] = 0.0f;
D_80150130[0] = 40.0f;
D_80150148 = 1.33333333f;
D_80150150 = 3.0f;
D_8015014C = 6800.0f;
init_cinematic_camera();
}
File diff suppressed because it is too large Load Diff
+245
View File
@@ -0,0 +1,245 @@
#ifndef CEREMONY_AND_CREDITS_H
#define CEREMONY_AND_CREDITS_H
#include "common_structs.h"
#include "camera.h"
struct struct_80283431 {
Vec3f unk0;
Vec3s unkC;
};
struct struct_80283430 {
s8 unk0; // index
s8 unk1; // speed
u16 unk2; // point
s8 unk4;
s8 unk5;
Vec3s unk6;
};
struct credits_data_1FA0 {
Vec3f unk0;
s8 pad[0x10];
s8 unk1C;
s8 unk1D;
s16 unk1E;
f32 unk20;
s8 pad2[0x24];
s16 unk48[3];
s16 unk4E[2];
s16 un52;
s16 unk54[2];
s16 unk58;
s16 unk5A[2];
s16 unk5E;
s16 unk60;
s16 unk62;
f32 unk64;
f32 unk68;
s16 unk6C;
s16 unk6E;
};
// Cinematic camera? Camera rails?
// CutsceneVariable?
/**
* Struct used to store cutscene info, like the camera's target position/focus.
*
* See the sCutsceneVars[] array in camera.c for more details.
*/
struct CinematicCamera {
/* 0x00 */ Vec3f pos;
/* 0x0C */ Vec3f lookAt;
/* 0x18 */ f32 unk18;
/* 0x1C */ u8 cutscene;
/* 0x20 */ f32 unk20;
/* 0x24 */ Vec3f unk24;
/* 0x30 */ Vec3f unk30;
/* 0x3C */ Vec3f unk3C;
/* 0x48 */ Vec3s unk48;
/* 0x4E */ Vec3s unk4E;
/* 0x54 */ Vec3s unk54;
/* 0x5A */ Vec3s unk5A;
/* 0x60 */ s16 unk60;
/* 0x62 */ s16 unk62;
/* 0x64 */ f32 unk64;
/* 0x68 */ f32 unk68;
/* 0x6C */ s16 unk6C;
/* 0x6E */ s16 unk6E;
}; // size = 0x70
struct struct_80282C40 {
s8 unk0;
s8 unk1;
s8 unk2;
u8 unk3;
s8 unk4;
s8 unk5;
Vec3s unk6;
};
struct struct_80285D80 {
u8 unk0[6];
Vec3s unk6;
};
struct struct_80286A04 {
u8 unk0;
u8 unk1;
struct struct_80285D80 *unk4;
struct struct_80285D80 *unk8;
u16 unkC;
};
struct CutsceneSplinePoint {
s8 index;
u8 speed;
Vec3s point;
};
struct Cutscene {
/* 0x0 */ void (*shot)(struct CinematicCamera*);
/* 0x4 */ s16 duration;
/* 0x6 */ //s16 pad;
}; /* size = 0x8 */
/* Function Prototypes */
void init_cinematic_camera(void);
s32 func_80283648(Camera*);
void vec3f_set_dupe(Vec3f, f32, f32, f32);
void vec3s_set_dupe(Vec3s, s16, s16, s16);
void vec3f_clear(Vec3f);
void vec3s_clear(Vec3s);
void vec3f_copy_dupe(Vec3f, Vec3f);
void vec3s_copy_dupe(Vec3s, Vec3s);
void func_80282040(void);
void func_80282048(void);
void func_80282050(Vec3f, Vec3f, s16);
void func_802820F8(Vec3f, Vec3f, s16);
s32 f32_lerp(f32*, f32, f32);
s32 func_80282200(s16*, s16, s16);
s32 set_transition_colour_fade_alpha_ending(f32*, f32, f32);
s32 func_80282364(s16*, s16, s16);
void reset_spline(void);
void func_80282434(struct CinematicCamera*);
void func_80282454(Vec3f, Vec3f, f32*, s16*, s16*);
void func_80282504(Vec3f, Vec3f, f32, s16, s16);
void func_802825C8(Vec3f, Vec3f, Vec3f, Vec3s);
void func_80282700(f32, Vec3f, f32*, f32[], f32[], f32[], f32[]);
s32 move_point_along_spline(Vec3f, f32*, struct struct_80283430[], s16*, f32*);
void func_80282BE4(struct struct_80283430*, s8, u8, s8, Vec3s, s32);
void func_80282C40(struct struct_80283430*, struct struct_80282C40*, s32);
s32 func_80282D90(struct CinematicCamera*, struct struct_80286A04*, struct struct_80286A04*, s32);
void func_80282E58(struct CinematicCamera*, struct struct_80282C40*, s32);
void func_80282EAC(s32, struct CinematicCamera*, s16, s16, s16);
void func_80282F00(s16*, s16);
void func_80282F44(s32, struct CinematicCamera*, Camera*);
void func_802830B4(struct CinematicCamera*, s16, s16, s16);
void func_80283100(struct CinematicCamera*, f32*);
void func_80283240(s16);
s32 cutscene_event(CameraEvent event, struct CinematicCamera*, s16, s16);
s32 func_80283330(s32);
s32 func_8028336C(struct CinematicCamera*, Camera*);
s32 func_80283428(void);
void func_80283968(struct CinematicCamera*);
void func_80283994(struct CinematicCamera*);
void func_802839B4(struct CinematicCamera*);
void func_802839CC(struct CinematicCamera*);
void func_802839E0(struct CinematicCamera*);
void play_sound_welcome(struct CinematicCamera*);
void func_80283A34(struct CinematicCamera*);
void play_sound_congratulation(struct CinematicCamera*);
void play_sound_balloon_pop(struct CinematicCamera*);
void play_sound_fish(struct CinematicCamera*);
void play_sound_fish_2(struct CinematicCamera*);
void play_sound_shoot_trophy(struct CinematicCamera*);
void play_sound_podium(struct CinematicCamera*);
void play_sound_trophy(struct CinematicCamera*);
void func_80283A54(struct CinematicCamera*);
void func_80283A7C(struct CinematicCamera*);
void func_80283B6C(struct CinematicCamera*);
void func_80283BA4(struct CinematicCamera*);
void func_80283BF0(struct CinematicCamera*);
void func_80283C14(struct CinematicCamera*);
void func_80283C38(struct CinematicCamera*);
void func_80283C58(struct CinematicCamera*);
void func_80283C78(struct CinematicCamera*);
void func_80283CA8(struct CinematicCamera*);
void func_80283CD0(struct CinematicCamera*);
void play_sound_farewell(struct CinematicCamera*);
void func_80283D2C(struct CinematicCamera*);
void func_80283EA0(struct CinematicCamera*);
void func_80283ED0(struct CinematicCamera*);
void func_80283EF8(struct CinematicCamera*);
void func_80283F6C(struct CinematicCamera*);
void func_80283FCC(struct CinematicCamera*);
void func_80283FF4(struct CinematicCamera*);
void func_80284068(struct CinematicCamera*);
void func_802840C8(struct CinematicCamera*);
void func_80284154(struct CinematicCamera*);
void func_80284184(struct CinematicCamera*);
void func_802841E8(struct CinematicCamera*);
void func_8028422C(struct CinematicCamera*);
void func_802842A8(struct CinematicCamera*);
void func_802842D8(struct CinematicCamera*);
void func_80284308(struct CinematicCamera*);
void func_80284418(struct CinematicCamera*);
void func_80284494(struct CinematicCamera*);
void func_802844FC(struct CinematicCamera*);
void func_8028454C(struct CinematicCamera*);
void func_802845EC(struct CinematicCamera*);
void func_8028461C(struct CinematicCamera*);
void func_80284648(struct CinematicCamera*);
void func_802846AC(void);
void func_802846B4(struct CinematicCamera*);
void func_802846E4(struct CinematicCamera*);
void func_802847CC(struct CinematicCamera*);
void play_cutscene(struct CinematicCamera*);
void transition_sliding_borders(void);
/* This is where I'd put my static data, if I had any */
extern u16 D_800DC5E4;
extern s32 D_80283FCC;
extern s32 D_80283FF4;
extern f32 D_802856B0;
extern f32 D_802856B4;
extern f32 D_802856B8;
extern f32 D_802856BC;
extern f32 D_802856C0;
extern struct struct_80282C40 D_802856DC[];
extern struct struct_80282C40 D_80285718[];
extern struct struct_80282C40 D_80285754[];
extern struct struct_80282C40 D_80285784[];
extern struct struct_80282C40 D_802857B4[];
extern struct struct_80282C40 D_802857CC[];
extern struct struct_80282C40 D_802857F0[];
extern struct struct_80282C40 D_80285850[];
extern struct struct_80282C40 D_802858B0[];
extern struct struct_80282C40 D_802858C8[];
extern struct struct_80282C40 D_80285910[];
extern struct struct_80282C40 D_80285928[];
extern struct struct_80282C40 D_80285940[];
extern struct struct_80282C40 D_80285A10[];
extern struct struct_80282C40 D_80285A4C[];
extern struct struct_80282C40 D_80285A88[];
extern struct struct_80282C40 D_80285AB8[];
extern struct struct_80282C40 D_80285AE8[];
extern struct struct_80282C40 D_80285B00[];
extern struct struct_80282C40 D_80285B18[];
extern struct struct_80282C40 D_80285B54[];
extern struct struct_80282C40 D_80285B90[];
extern struct struct_80282C40 D_80285BA8[];
extern struct struct_80282C40 D_80285C38[];
extern struct struct_80282C40 D_80285C74[];
extern struct Cutscene D_80285D10[];
extern s16 D_80285D14;
extern s32 D_802876D4;
extern s32 D_802876D8;
//extern struct credits_data_1FA0 *D_802876E0;
#endif // CEREMONY_AND_CREDITS_H
+172
View File
@@ -0,0 +1,172 @@
#include <ultra64.h>
#include <macros.h>
#include <defines.h>
#include <debug.h>
#include <PR/gu.h>
#include <main.h>
#include <code_800029B0.h>
#include <variables.h>
#include <types.h>
#include "camera.h"
#include "memory.h"
#include "math_util.h"
#include "code_80280000.h"
#include "code_80281780.h"
#include "skybox_and_splitscreen.h"
#include <config.h>
#include "code_80091750.h"
#include "code_8006E9C0.h"
#include "code_800029B0.h"
#include "ceremony_and_credits.h"
#include "podium_ceremony_actors.h"
#include "code_80281C40.h"
#include "code_80057C60.h"
#include "actors.h"
#include "render_courses.h"
s32 D_802874A0;
//s32 D_802874A4[5];
void func_80280000(void) {
func_802966A0();
func_80059AC8();
func_80059AC8();
func_8005A070();
}
void func_80280038(void) {
u16 perspNorm;
Camera *camera = &cameras[0];
UNUSED s32 pad;
Mat4 matrix;
gMatrixObjectCount = 0;
gMatrixEffectCount = 0;
gMatrixHudCount = 0;
init_rdp();
func_802A53A4();
init_rdp();
func_80057FC4(0);
gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH);
guPerspective(&gGfxPool->mtxPersp[0], &perspNorm, D_80150130[0], D_80150148, D_80150150, D_8015014C, 1.0f);
gSPPerspNormalize(gDisplayListHead++, perspNorm);
gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[0]), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION);
guLookAt(&gGfxPool->mtxLookAt[0], 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]);
gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[0]), G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION);
gCurrentCourseId = gCreditsCourseId;
mtxf_identity(matrix);
func_802B4FF8(matrix, 0);
func_80295A38(D_800DC5EC);
func_802A3008(D_800DC5EC);
func_80058090(0);
func_80058538(0);
transition_sliding_borders();
func_80281C40();
init_rdp();
func_80093F10();
init_rdp();
}
void func_80280268(s32 arg0) {
gIsInQuitToMenuTransition = 1;
gQuitToMenuTransitionCounter = 5;
D_802874A0 = 1;
if ((arg0 < 0) || ((arg0 >= 20))) {
arg0 = 0;
}
gCreditsCourseId = arg0;
}
void credits_loop(void) {
Camera *camera = &cameras[0];
f32 temp_f12;
f32 temp;
f32 temp_f14;
D_802874A0 = 0;
if (gIsInQuitToMenuTransition) {
gQuitToMenuTransitionCounter--;
if (gQuitToMenuTransitionCounter == 0) {
gIsInQuitToMenuTransition = 0;
gGamestateNext = CREDITS_SEQUENCE;
gGamestate = 255;
}
} else {
D_802874FC = 0;
func_80283648(camera);
temp_f12 = camera->lookAt[0] - camera->pos[0];
temp = camera->lookAt[1] - camera->pos[1];
temp_f14 = camera->lookAt[2] - camera->pos[2];
camera->rot[1] = atan2s(temp_f12, temp_f14);
camera->rot[0] = atan2s(sqrtf((temp_f12 * temp_f12) + (temp_f14 * temp_f14)), temp);
camera->rot[2] = 0;
if (D_802874A0 != 0) {
D_800DC5E4++;
} else {
func_80280000();
func_80280038();
#if DVDL
display_dvdl();
#endif
gDPFullSync(gDisplayListHead++);
gSPEndDisplayList(gDisplayListHead++);
}
}
}
void load_credits(void) {
Camera *camera = &cameras[0];
gCurrentCourseId = gCreditsCourseId;
D_800DC5B4 = 1;
D_800DC518 = 1;
func_802A4D18();
func_802A74BC();
camera->unk_B4 = 60.0f;
D_80150130[0] = 60.0f;
D_800DC5EC->screenWidth = SCREEN_WIDTH;
D_800DC5EC->screenHeight = SCREEN_HEIGHT;
D_800DC5EC->screenStartX = 160;
D_800DC5EC->screenStartY = 120;
gScreenModeSelection = SCREEN_MODE_1P;
gActiveScreenMode = SCREEN_MODE_1P;
gNextFreeMemoryAddress = gFreeMemoryResetAnchor;
load_course(gCurrentCourseId);
D_8015F730 = gNextFreeMemoryAddress;
set_segment_base_addr(0xB, (void *) decompress_segments((u8 *)&_data_821D10SegmentRomStart, (u8 *)&_data_825800SegmentRomStart));
D_8015F6EA = -0x15A1;
D_8015F6EE = -0x15A1;
D_8015F6F2 = -0x15A1;
D_8015F6E8 = 0x15A1;
D_8015F6EC = 0x15A1;
D_8015F6F0 = 0x15A1;
D_8015F59C = 0;
D_8015F5A0 = 0;
D_8015F58C = 0;
D_8015F588 = 0;
D_800DC5BC = 0;
D_800DC5C8 = 0;
gSurfaceMap = (mk64_surface_map_ram *) gNextFreeMemoryAddress;
camera->pos[0] = 1400.0f;
camera->pos[1] = 300.0f;
camera->pos[2] = 1400.0f;
camera->lookAt[0] = 0.0f;
camera->lookAt[1] = 0.0f;
camera->lookAt[2] = 0.0f;
camera->up[0] = 0.0f;
camera->up[1] = 1.0f;
camera->up[2] = 0.0f;
init_cinematic_camera();
func_80003040();
func_8006E9C0();
func_80093E60();
func_80092688();
if (D_800DC5EC) {}
D_801625F8 = ((s32)gHeapEndPtr - gNextFreeMemoryAddress);
D_801625FC = ((f32)D_801625F8 / 1000.0f);
}
+30
View File
@@ -0,0 +1,30 @@
#ifndef CODE_80280000_H
#define CODE_80280000_H
#include "common_structs.h"
/* Function Prototypes */
void func_80280000(void);
void func_80280038(void);
void func_80280268(s32 arg0);
void credits_loop(void);
void load_credits(void);
extern Gfx *gDisplayListHead;
extern f32 D_80150148, D_8015014C, D_80150150;
extern f32 D_80150130[4];
extern s16 gCreditsCourseId;
extern u16 gMatrixObjectCount;
extern s16 gMatrixEffectCount;
extern u16 gIsInQuitToMenuTransition, gQuitToMenuTransitionCounter;
extern s32 D_802874A0;
extern u16 D_80164714, D_80164716, D_80164718;
extern u16 D_800DC5E4;
extern u16 D_800DC518;
#endif
+152
View File
@@ -0,0 +1,152 @@
#include <ultra64.h>
#include <macros.h>
#include "types.h"
#include "variables.h"
#include <defines.h>
#include <config.h>
#include "memory.h"
#include "camera.h"
#include "spawn_players.h"
#include "skybox_and_splitscreen.h"
#include "code_8006E9C0.h"
#include "podium_ceremony_actors.h"
#include "code_80281780.h"
#include "code_80005FD0.h"
#include "collision.h"
#include "code_80281C40.h"
#include <code_800029B0.h>
u8 defaultCharacterIds[] = {
1, 2, 3, 4, 5, 6, 7, 0
};
void debug_switch_character_ceremony_cutscene(void) {
if (gEnableDebugMode) {
if (gControllerOne->button & HOLD_ALL_DPAD_AND_C_BUTTONS) {
// Allows to switch character in debug mode?
if (gControllerOne->button & U_CBUTTONS) {
gCharacterSelections[0] = LUIGI;
}
else if (gControllerOne->button & L_CBUTTONS) {
gCharacterSelections[0] = YOSHI;
}
else if (gControllerOne->button & R_CBUTTONS) {
gCharacterSelections[0] = TOAD;
}
else if (gControllerOne->button & D_CBUTTONS) {
gCharacterSelections[0] = DK;
}
else if (gControllerOne->button & U_JPAD) {
gCharacterSelections[0] = WARIO;
}
else if (gControllerOne->button & L_JPAD) {
gCharacterSelections[0] = PEACH;
}
else if (gControllerOne->button & R_JPAD) {
gCharacterSelections[0] = BOWSER;
} else {
gCharacterSelections[0] = MARIO;
}
// todo: confirm this.
// Resets gCharacterIdByGPOverallRank to default?
bcopy(&defaultCharacterIds, &gCharacterIdByGPOverallRank, 8);
}
}
}
s32 func_80281880(s32 arg0) {
s32 i;
for (i = 0; i < 8; i++) {
if (gCharacterIdByGPOverallRank[i] == gCharacterSelections[arg0]) break;
}
return i;
}
void func_802818BC(void) {
s32 temp_v0;
UNUSED s32 pad;
s32 sp1C;
s32 temp_v0_2;
if (D_8018EDF3 != TWO_PLAYERS_SELECTED) {
D_802874D8.unk1D = func_80281880(0);
D_802874D8.unk1E = gCharacterSelections[0];
return;
}
// weird pattern but if it matches it matches
temp_v0 = sp1C = func_80281880(0);
temp_v0_2 = func_80281880(1);
if (sp1C < temp_v0_2) {
D_802874D8.unk1E = gCharacterSelections[0];
D_802874D8.unk1D = temp_v0;
} else {
D_802874D8.unk1E = gCharacterSelections[1];
D_802874D8.unk1D = temp_v0_2;
}
}
void load_ceremony_cutscene(void) {
Camera *camera = &cameras[0];
gCurrentCourseId = COURSE_ROYAL_RACEWAY;
D_800DC5B4 = (u16)1;
gIsMirrorMode = 0;
gMenuSelectionFromEndingSequence = 0xFFFF;
D_80287554 = 0;
func_802A4D18();
func_802A74BC();
camera->unk_B4 = 60.0f;
D_80150130[0] = 60.0f;
D_800DC5EC->screenWidth = SCREEN_WIDTH;
D_800DC5EC->screenHeight = SCREEN_HEIGHT;
D_800DC5EC->screenStartX = 160;
D_800DC5EC->screenStartY = 120;
gScreenModeSelection = SCREEN_MODE_1P;
gNextFreeMemoryAddress = (s32) gFreeMemoryResetAnchor;
gActiveScreenMode = SCREEN_MODE_1P;
gModeSelection = GRAND_PRIX;
load_course(gCurrentCourseId);
D_8015F730 = (s32) gNextFreeMemoryAddress;
set_segment_base_addr(0xB, (void *) decompress_segments((u8 *) &_data_821D10SegmentRomStart, (u8 *) &_data_825800SegmentRomStart));
set_segment_base_addr(6, (void *) decompress_segments((u8 *) &_course_banshee_boardwalk_dl_mio0SegmentRomStart, (u8 *) &_course_yoshi_valley_dl_mio0SegmentRomStart));
D_8015F8E4 = -2000.0f;
D_8015F6EA = -0x15A1;
D_8015F6EE = -0x15A1;
D_8015F6F2 = -0x15A1;
D_8015F6E8 = 0x15A1;
D_8015F6EC = 0x15A1;
D_8015F6F0 = 0x15A1;
D_8015F59C = 0;
D_8015F5A0 = 0;
D_8015F58C = 0;
D_8015F588 = (u16)0;
D_800DC5BC = (u16)0;
D_800DC5C8 = (u16)0;
gSurfaceMap = (mk64_surface_map_ram *) gNextFreeMemoryAddress;
// @bug these segmented addresses need to be symbols for mobility
// This syntax is required to match
set_vertex_data_with_default_section_id(0x70067E8, -1);
set_vertex_data_with_default_section_id(0x700AEF8, -1);
set_vertex_data_with_default_section_id(0x700A970, 8);
set_vertex_data_with_default_section_id(0x700AC30, 8);
set_vertex_data_with_default_section_id(0x7000CE0, 0x10);
set_vertex_data_with_default_section_id(0x7000E88, 0x10);
set_vertex_data_with_default_section_id(0x700A618, -1);
set_vertex_data_with_default_section_id(0x700A618, -1);
set_vertex_data_with_default_section_id(0x70023F8, 1);
set_vertex_data_with_default_section_id(0x7002478, 1);
func_80295C6C();
debug_switch_character_ceremony_cutscene();
func_802818BC();
func_8003D080();
func_8006E9C0();
func_8001C05C();
balloons_and_fireworks_init();
func_802816B8();
func_80093E60();
D_801625F8 = (s32) gHeapEndPtr - gNextFreeMemoryAddress;
D_801625FC = ((f32) D_801625F8 / 1000.0f);
}
+54
View File
@@ -0,0 +1,54 @@
#ifndef CODE_80281780_H
#define CODE_80281780_H
/* Function Prototypes */
void debug_switch_character_ceremony_cutscene(void);
s32 func_80281880(s32 arg0);
void func_802818BC(void);
void load_ceremony_cutscene(void);
extern void func_80093E60(void);
extern void func_802816B8(void);
extern void func_80295C6C(void);
extern void func_802A4D18(void);
extern s16 gCurrentCourseId;
extern u16 D_800DC5B4;
extern s32 gIsMirrorMode;
extern s32 gScreenModeSelection;
extern s32 gActiveScreenMode;
extern s32 gModeSelection;
extern u16 D_800DC5BC;
extern u16 D_800DC5C8;
extern struct UnkStruct_800DC5EC *D_800DC5EC;
extern s32 D_80287554;
extern f32 D_801647A4;
extern f32 D_80150130[];
extern s32 D_8015F5A0;
extern s32 D_00821D10;
extern s32 D_00825800;
extern s32 D_00831DC0;
extern s32 D_00835BA0;
extern struct Controller *gControllerOne;
extern s8 gCharacterSelections[];
extern u16 gEnableDebugMode;
extern u8 defaultCharacterIds[];
extern s8 gGPOverallRanks[8];
extern s8 D_8018EDF3;
extern u8 *_data_821D10SegmentRomStart;
extern u8 *_data_825800SegmentRomStart;
extern s32 _course_banshee_boardwalk_dl_mio0SegmentRomStart;
extern s32 _course_yoshi_valley_dl_mio0SegmentRomStart;
#endif // CODE_80281780_H
+88
View File
@@ -0,0 +1,88 @@
#include <ultra64.h>
#include <PR/gu.h>
#include <macros.h>
#include "main.h"
#include "math_util.h"
#include "skybox_and_splitscreen.h"
#include "hud_renderer.h"
#include "code_80057C60.h"
#include "code_80091750.h"
#include "podium_ceremony_actors.h"
#include "code_80281C40.h"
#include "ceremony_and_credits.h"
#include "podium_ceremony_actors.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;
for (i = 0; i < D_802874FC; i++) {
func_800579F8(D_80287560[i].unk0, D_80287560[i].unk2, (s8 *) D_80287560[i].unk8, D_80287560[i].unk4);
}
}
void func_80281CB4(s32 arg0, s32 arg1, s32 arg2, s32 arg3) {
if (D_802874FC < 0x1E) {
D_80287560[D_802874FC].unk0 = arg0;
D_80287560[D_802874FC].unk2 = arg1;
D_80287560[D_802874FC].unk4 = arg3;
D_80287560[D_802874FC].unk8 = arg2;
D_802874FC++;
}
}
extern Gfx D_80284F70[];
extern Gfx D_80284EE0[];
void func_80281D00(void) {
Camera *camera = &cameras[0];
UNUSED s32 pad[3];
u16 perspNorm;
Mat4 matrix;
UNUSED s32 pad2[3];
func_802A53A4();
init_rdp();
if (gMenuSelectionFromEndingSequence != 0xFFFF) {
clear_framebuffer(0);
if (D_80287554 >= 4) {
gIsInQuitToMenuTransition = 0;
gGamestateNext = gMenuSelectionFromEndingSequence;
}
D_80287554++;
return;
}
func_8028150C();
gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER | G_SHADE | G_CULL_BACK | G_SHADING_SMOOTH);
guPerspective((Mtx*) &gGfxPool->mtxPersp[0], &perspNorm, D_80150130[0], D_80150148, D_80150150, D_8015014C, 1.0f);
gSPPerspNormalize(gDisplayListHead++, perspNorm);
gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxPersp[0]), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION);
guLookAt((Mtx*) &gGfxPool->mtxLookAt[0], 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]);
gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxLookAt[0]), G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION);
mtxf_identity(matrix);
func_802B4FF8(matrix, 0);
gSPDisplayList(gDisplayListHead++, VIRTUAL_TO_PHYSICAL2(&D_80284F70));
func_800212B4();
gSPDisplayList(gDisplayListHead++, VIRTUAL_TO_PHYSICAL2(&D_80284EE0));
update_actors_loop();
func_80058090(0);
func_80021B0C();
gSPDisplayList(gDisplayListHead++, VIRTUAL_TO_PHYSICAL2(&D_80284EE0));
func_80093F10();
transition_sliding_borders();
func_80281C40();
init_rdp();
}
+19
View File
@@ -0,0 +1,19 @@
#ifndef CODE_80281C40_H
#define CODE_80281C40_h
/* Function Prototypes */
void func_80281C40(void);
void func_80281CB4(s32, s32, s32, s32);
void func_80281D00(void);
extern u32 gMenuSelectionFromEndingSequence;
extern u16 gIsInQuitToMenuTransition;
extern Gfx D_00284F70[];
extern Gfx D_00284EE0[];
extern f32 D_80150148, D_8015014C, D_80150150;
extern f32 D_80150130[];
#endif
+201
View File
@@ -0,0 +1,201 @@
#include "credits.h"
#include "defines.h"
struct_802850C0_entry D_802850C0[] = {
{0.80f, -200, 38, 160, 30, SLIDE_RIGHT, TEXT_BLUE_GREEN_RED_CYCLE_1, 0},
{0.90f, 520, 200, 160, 200, SLIDE_LEFT, TEXT_BLUE, 0},
{0.80f, -200, 38, 160, 30, SLIDE_RIGHT, TEXT_BLUE_GREEN_RED_CYCLE_1, 0},
{0.90f, 520, 200, 160, 200, SLIDE_LEFT, TEXT_YELLOW, 0},
{0.80f, -200, 38, 160, 30, SLIDE_RIGHT, TEXT_BLUE_GREEN_RED_CYCLE_1, 0},
{0.90f, 520, 200, 160, 200, SLIDE_LEFT, TEXT_RED, 0},
{0.80f, -200, 38, 160, 30, SLIDE_RIGHT, TEXT_BLUE_GREEN_RED_CYCLE_1, 0},
{0.90f, 520, 200, 160, 200, SLIDE_LEFT, TEXT_GREEN, 0},
{0.80f, -200, 38, 160, 30, SLIDE_RIGHT, TEXT_BLUE_GREEN_RED_CYCLE_1, 0},
{0.80f, 520, 175, 160, 175, SLIDE_LEFT, TEXT_BLUE, 0},
{0.80f, 620, 195, 160, 195, SLIDE_LEFT, TEXT_YELLOW, 0},
{0.80f, 720, 215, 160, 215, SLIDE_LEFT, TEXT_RED, 0},
{0.80f, 520, 175, 160, 175, SLIDE_LEFT, TEXT_GREEN, 0},
{0.80f, 620, 195, 160, 195, SLIDE_LEFT, TEXT_BLUE, 0},
{0.80f, 720, 215, 160, 215, SLIDE_LEFT, TEXT_YELLOW, 0},
{0.80f, -200, 38, 152, 30, SLIDE_RIGHT, TEXT_BLUE_GREEN_RED_CYCLE_1, 0},
{0.80f, -200, 38, 160, 30, SLIDE_RIGHT, TEXT_BLUE_GREEN_RED_CYCLE_1, 0},
{0.90f, 520, 180, 160, 180, SLIDE_LEFT, TEXT_RED, 0},
{0.90f, 620, 210, 160, 210, SLIDE_LEFT, TEXT_GREEN, 0},
{0.80f, -200, 38, 160, 30, SLIDE_RIGHT, TEXT_BLUE_GREEN_RED_CYCLE_1, 0},
{0.90f, 520, 200, 160, 200, SLIDE_LEFT, TEXT_BLUE, 0},
{0.80f, -200, 38, 152, 30, SLIDE_RIGHT, TEXT_BLUE_GREEN_RED_CYCLE_1, 0},
{0.80f, -200, 38, 160, 30, SLIDE_RIGHT, TEXT_BLUE_GREEN_RED_CYCLE_1, 0},
{0.80f, 520, 175, 160, 175, SLIDE_LEFT, TEXT_YELLOW, 0},
{0.80f, 620, 195, 160, 195, SLIDE_LEFT, TEXT_RED, 0},
{0.80f, 720, 215, 160, 215, SLIDE_LEFT, TEXT_GREEN, 0},
{0.80f, 520, 175, 160, 175, SLIDE_LEFT, TEXT_BLUE, 0},
{0.80f, 620, 195, 160, 195, SLIDE_LEFT, TEXT_YELLOW, 0},
{0.80f, 720, 215, 160, 215, SLIDE_LEFT, TEXT_RED, 0},
{0.80f, -200, 38, 160, 30, SLIDE_RIGHT, TEXT_BLUE_GREEN_RED_CYCLE_1, 0},
{0.80f, 520, 175, 160, 175, SLIDE_LEFT, TEXT_GREEN, 0},
{0.80f, 620, 195, 160, 195, SLIDE_LEFT, TEXT_BLUE, 0},
{0.80f, 720, 215, 160, 215, SLIDE_LEFT, TEXT_YELLOW, 0},
{0.80f, -200, 38, 160, 30, SLIDE_RIGHT, TEXT_BLUE_GREEN_RED_CYCLE_1, 0},
{0.90f, 520, 200, 160, 200, SLIDE_LEFT, TEXT_RED, 0},
{0.80f, -200, 38, 160, 30, SLIDE_RIGHT, TEXT_BLUE_GREEN_RED_CYCLE_1, 0},
{0.90f, 520, 180, 160, 180, SLIDE_LEFT, TEXT_GREEN, 0},
{0.90f, 620, 210, 160, 210, SLIDE_LEFT, TEXT_BLUE, 0},
{0.80f, -200, 38, 160, 30, SLIDE_RIGHT, TEXT_BLUE_GREEN_RED_CYCLE_1, 0},
{0.80f, 520, 175, 160, 175, SLIDE_LEFT, TEXT_GREEN, 0},
{0.80f, 620, 195, 160, 195, SLIDE_LEFT, TEXT_BLUE, 0},
{0.80f, 720, 215, 160, 215, SLIDE_LEFT, TEXT_YELLOW, 0},
{0.65f, 820, 195, 220, 195, SLIDE_LEFT, TEXT_BLUE, 0},
{0.65f, 720, 215, 100, 215, SLIDE_LEFT, TEXT_BLUE, 0},
{0.65f, 920, 215, 220, 215, SLIDE_LEFT, TEXT_RED, 0},
{0.80f, -200, 38, 160, 30, SLIDE_RIGHT, TEXT_BLUE_GREEN_RED_CYCLE_1, 0},
{0.80f, 520, 175, 160, 175, SLIDE_LEFT, TEXT_GREEN, 0},
{0.80f, 620, 195, 160, 195, SLIDE_LEFT, TEXT_BLUE, 0},
{0.80f, 720, 215, 160, 215, SLIDE_LEFT, TEXT_YELLOW, 0},
{0.80f, -200, 38, 160, 30, SLIDE_RIGHT, TEXT_BLUE_GREEN_RED_CYCLE_1, 0},
{0.90f, 520, 180, 160, 180, SLIDE_LEFT, TEXT_RED, 0},
{0.90f, 620, 210, 160, 210, SLIDE_LEFT, TEXT_GREEN, 0},
{0.80f, -200, 38, 160, 30, SLIDE_RIGHT, TEXT_BLUE_GREEN_RED_CYCLE_1, 0},
{0.70f, 520, 70, 160, 70, SLIDE_LEFT, TEXT_BLUE, 0},
{0.70f, 520, 90, 160, 90, SLIDE_LEFT, TEXT_YELLOW, 0},
{0.70f, 520, 110, 160, 110, SLIDE_LEFT, TEXT_RED, 0},
{0.70f, 520, 130, 160, 130, SLIDE_LEFT, TEXT_GREEN, 0},
{0.70f, 520, 150, 160, 150, SLIDE_LEFT, TEXT_BLUE, 0},
{0.70f, 520, 170, 160, 170, SLIDE_LEFT, TEXT_YELLOW, 0},
{0.70f, 520, 190, 160, 190, SLIDE_LEFT, TEXT_RED, 0},
{0.45f, 520, 207, 160, 207, SLIDE_LEFT, TEXT_GREEN, 0},
{2.00f, 2925, 210, 150, 210, SLIDE_LEFT, TEXT_BLUE_GREEN_RED_CYCLE_1, 0},
{0.90f, 520, 130, 160, 130, SLIDE_LEFT, TEXT_YELLOW, 0},
};
char *D_802854B0[] = {
// English Credits
"executive producer",
"hiroshi yamauchi",
"producer",
"shigeru miyamoto",
"director",
"hideki konno",
"assistant director",
"yasuyuki oyagi",
"programmer",
"masato kimura",
"kenji yamamoto",
"yasuhiro kawaguchi",
"yuzuru ogawa",
"masahiro kawano",
"hirohito yoshimoto",
"demo sequence programmer",
"",
"hajime yajima",
"takumi kawagoe",
"visual director",
"tadashi sugiyama",
"c.g.character designer",
"",
"tomoaki kuroume",
"hiroaki takenaka",
"tokihiko toyoda",
"shigefumi hino",
"masanao arimoto",
"hisashi nogami",
"c.g.map designer",
"makoto miyanaga",
"naoki mori",
"hiroyasu kuwabara",
"music composer",
"kenta nagata",
"sound programmer",
"taro bando",
"yoji inagaki",
"sampling voice",
"charles martinet",
"leslie swan",
"isaac marshall",
"",
"",
"",
"technical support",
"takao sawano",
"tsuyoshi takahashi",
"hirohito yada",
"progress management",
"kimiyoshi fukui",
"keizo kato",
"special thanks",
"yasuhiro sakai",
"yoshitaka nishikawa",
"hideki fujii",
"yusuke nakano",
"wataru yamaguchi",
"phil sandhop",
"super mario club",
"Donkey Kong 3-D Model Provided Courtesy of Rare U.K.",
"the end",
"mariokart64 staff",
// Japanese Credits
// Note that these are EUC-JP encoded, see:
// https://en.wikipedia.org/wiki/Extended_Unix_Code#EUC-JP
"エグゼクティブ プロデューサー",
"やまうち ひろし",
"プロデューサー",
"みやもと しげる",
"ディレクター",
"こんの ひでき",
"アシスタント ディレクター",
"おおやぎ やすゆき",
"プログラマー",
"きむら まさと",
"やまもと けんじ",
"かわぐち やすひろ",
"おがわ ゆずる",
"かわの まさひろ",
"よしもと ひろひと",
"デモ シーケンス プログラマー",
"",
"やじま はじめ",
"かわごえ たくみ",
"ビジュアル ディレクター",
"すぎやま ただし",
"cg キャラクター デザイナー",
"",
"くろうめ ともあき",
"たけなか ひろあき",
"とよだ ときひこ",
"ひの しげふみ",
"ありもと まさなお",
"のがみ ひさし",
"cg マップ デザイナー",
"みやなが まこと",
"もり なおき",
"くわばら ひろやす",
"ミュージック コンポーザー",
"ながた けんた",
"サウンド プログラマー",
"ばんどう たろう",
"いながき ようじ",
"サンプリンング ボイス",
"こうづき あさこ",
"まるの ともこ",
"ちゃーるず まるてぃね",
"じゅりあん ばるだこふ",
"とます すぴんどらー",
"じょん ひゅーらとん",
"テクニカル サポート",
"さわの たかお",
"たかはし つよし",
"やだ ひろひと",
"プログレス マネージメント",
"ふくい きみよし",
"かとう けいぞう",
"スペシャル サンクス",
"さかい やすひろ",
"にしかわ よしたか",
"ふじい ひでき",
"なかの ゆうすけ",
"やまぐち わたる",
"にんてんどう じょーかい",
"すーぱー まりお くらぶ",
"れあ りみてっど",
" おしまい",
" まりおかーと64 すたっふ"
};
+27
View File
@@ -0,0 +1,27 @@
#ifndef CREDITS_H
#define CREDITS_H
#include "PR/ultratypes.h"
#define SLIDE_RIGHT 0
#define SLIDE_LEFT 1
// In some way dictates how the text is written during the credit sequence
typedef struct {
// Scaling factor that affects the x/y scaling and tracking of printed text
/* 0x00 */ f32 textScaling;
// Column to start sliding in from
/* 0x04 */ s16 startingColumn;
/* 0x06 */ s16 row;
// Extra distance added to the destination column
/* 0x08 */ s16 columnExtra;
/* 0x0A */ s16 unknown; // No idea what this is for, has a value but never seems to be read
/* 0x0C */ s8 slideDirection; // 0 for slide right, 1 for slide left. May have other uses/effects
/* 0x0D */ s8 textColor;
/* 0x0E */ s16 padding; // Always seems to be 0, never read (that I can see)
} struct_802850C0_entry; // size = 0x10
extern struct_802850C0_entry D_802850C0[]; // D_802850C0
extern char *D_802854B0[];
#endif
+105
View File
@@ -0,0 +1,105 @@
#include <types.h>
#include <PR/gbi.h>
extern Gfx D_070067E8[];
extern Gfx D_0700AEF8[];
extern Gfx D_0700A970[];
extern Gfx D_0700AC30[];
extern Gfx D_07000CE0[];
extern Gfx D_07000E88[];
extern Gfx D_0700A618[];
extern Gfx D_070023F8[];
extern Gfx D_07002478[];
extern Gfx D_07001438[];
extern Gfx D_07003728[];
extern Gfx D_070036B8[];
extern Gfx D_07003628[];
extern Gfx D_07003540[];
extern Gfx D_07003DC0[];
extern Gfx D_07003E50[];
extern Gfx D_07003F18[];
extern Gfx D_070050B0[];
extern Gfx D_07005138[];
extern Gfx D_070055D0[];
extern Gfx D_07005B50[];
extern Gfx D_07005C00[];
extern Gfx D_07005D18[];
extern Gfx D_07005DC8[];
extern Gfx D_07005EF8[];
extern Gfx D_07005740[];
extern Gfx D_070057F0[];
extern Gfx D_070058E8[];
extern Gfx D_07001788[];
extern Gfx D_07001AA0[];
extern Gfx D_07001A30[];
extern Gfx D_07003790[];
extern Gfx D_070006D0[];
extern Gfx D_070004D0[];
extern Gfx D_07000840[];
// Init RDP - RSP (Ceremony)
Gfx D_80284EE0[] = {
gsDPSetCycleType(G_CYC_1CYCLE),
gsDPPipelineMode(G_PM_1PRIMITIVE),
gsDPSetTextureLOD(G_TL_TILE),
gsDPSetTextureLUT(G_TT_NONE),
gsDPSetTextureDetail(G_TD_CLAMP),
gsDPSetTexturePersp(G_TP_PERSP),
gsDPSetTextureFilter(G_TF_BILERP),
gsDPSetTextureConvert(G_TC_FILT),
gsDPSetCombineKey(G_CK_NONE),
gsDPSetAlphaCompare(G_AC_NONE),
gsDPSetColorDither(G_CD_DISABLE),
gsDPSetColorDither(G_CD_MAGICSQ),
gsDPSetRenderMode(G_RM_OPA_SURF, G_RM_OPA_SURF2),
gsDPSetCombineMode(G_CC_SHADE, G_CC_SHADE),
gsSPClearGeometryMode(G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD),
gsSPSetGeometryMode(G_SHADE | G_SHADING_SMOOTH),
gsSPTexture(0, 0, 0, G_TX_RENDERTILE, G_OFF),
gsSPEndDisplayList(),
};
// Peach's Castle (Ceremony)
Gfx D_80284F70[] = {
gsDPSetCombineMode(G_CC_MODULATEIA, G_CC_MODULATEIA),
gsDPSetRenderMode(G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2),
gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
gsSPDisplayList(D_070067E8),
gsSPDisplayList(D_0700AEF8),
gsSPDisplayList(D_07001438),
gsSPDisplayList(D_0700A970),
gsSPDisplayList(D_07000CE0),
gsSPDisplayList(D_07000E88),
gsSPDisplayList(D_0700A618),
gsSPDisplayList(D_0700AC30),
gsSPDisplayList(D_07003728),
gsSPDisplayList(D_070036B8),
gsSPDisplayList(D_07003628),
gsSPDisplayList(D_07003540),
gsSPDisplayList(D_07003DC0),
gsSPDisplayList(D_07003E50),
gsSPDisplayList(D_07003F18),
gsSPDisplayList(D_070050B0),
gsSPDisplayList(D_07005138),
gsSPDisplayList(D_070055D0),
gsSPDisplayList(D_07005B50),
gsSPDisplayList(D_07005C00),
gsSPDisplayList(D_07005D18),
gsSPDisplayList(D_07005DC8),
gsSPDisplayList(D_07005EF8),
gsSPDisplayList(D_07005740),
gsSPDisplayList(D_070057F0),
gsSPDisplayList(D_070058E8),
gsSPDisplayList(D_07001788),
gsSPDisplayList(D_07001AA0),
gsSPDisplayList(D_07001A30),
gsSPDisplayList(D_070023F8),
gsSPDisplayList(D_07002478),
gsSPDisplayList(D_07003790),
gsDPSetCombineMode(G_CC_MODULATEIDECALA, G_CC_MODULATEIDECALA),
gsDPSetRenderMode(G_RM_AA_ZB_TEX_EDGE, G_RM_AA_ZB_TEX_EDGE2),
gsSPDisplayList(D_070006D0),
gsSPDisplayList(D_070004D0),
gsSPDisplayList(D_07000840),
gsSPEndDisplayList(),
};
+484
View File
@@ -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 "player_controller.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;
ActorInitParams initBalloon = {
Balloon,
{ 0xF3AF, 34, 0xFE2D },
0, 0, 0, 0,
};
ActorInitParams initBurst = {
FireworkBurst,
{ 0xF3AF, 34, 0xFE2D },
0, 0, 0, 0,
};
ActorInitParams initCone = {
FireworkCone,
{ 0xF3AF, 34, 0xFE2D },
0, 0, 0, 0,
};
// This appears to be a dummy actor placed in index 0 of the actor list.
ActorInitParams initDummy = {
Initial,
{ 0xF2CC, 250, 0xFE11 },
0, 0, 0, 0,
};
// This array appears to always be zero.
// This may not be an array, it appears to contain uninitialized random values to seed the random generator.
// The first index used; D_802874BE (7), requires to be an array.
// Based on that, the whole thing is now an array.
s16 D_802874B0[17];
Gfx *D_802874D4; // ptr to gDisplayListHead
struct_D_802874D8 D_802874D8; // 31 bytes
//s32 sActorTimer;
//u8 D_802874F4;
//u8 D_802874F5;
//u8 D_802874F6;
CeremonyActor *sPodiumActorList;
s32 D_802874FC;
void func_80280650(void) {
}
void set_initial_position(CeremonyActor *actor) {
ActorInitParams *params = actor->initParams;
actor->pos[0] = params->unk2[0];
actor->pos[1] = params->unk2[1];
actor->pos[2] = params->unk2[2];
// Place value in the high bits of s16.
// Example: 85, 0b01010101 -> 0b0101010100000000
actor->unkA = params->unk8 << 8;
actor->unkC = params->unk9 << 8;
actor->unkE = params->unkA << 8;
actor->type = params->type;
}
CeremonyActor *find_available_entry(void) {
UNUSED s32 pad[2];
CeremonyActor *actor = sPodiumActorList;
s32 i;
for (i = 0; i < 200 ; i++) {
// Find an inactive actor.
if ((actor->isActive & 1) == 0) {
bzero(actor, sizeof(CeremonyActor));
actor->isActive = 1;
actor->unk24 = 1.0f;
return actor;
}
actor++;
}
return NULL;
}
CeremonyActor *new_actor(ActorInitParams *arg0) {
CeremonyActor *actor = find_available_entry();
// @bug No null check.
// todo: More indepth error checking/return value
#ifdef AVOID_UB
if (actor == NULL) {
return (CeremonyActor*) &sPodiumActorList[0]; // Return first actor to prevent crash
}
#endif
actor->initParams = arg0;
set_initial_position(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 balloon_update(CeremonyActor *actor) {
render_balloon(actor->pos, 1.0f, actor->unk2E, actor->unk2C);
actor->pos[1] += 0.8f;
actor->unk2E = sins(actor->unk30) * actor->unk34;
actor->unk30 += actor->unk32;
actor->timer++;
// Delete actor
if (actor->timer > 800) {
actor->isActive = 0;
}
if (D_802874B0[13] == 1) {
actor->isActive = 0;
}
}
/**
* Spawns an aerial shell that ascends into the sky.
* (note that the explode effect is a different actor)
*/
void firework_cone_update_and_spawn_burst(Firework *cone) {
if (cone->unk44 < 30) {
cone->pos[1] += 2.5f;
cone->pos[0] += random_who_knows(0.2f);
cone->pos[2] += random_who_knows(0.2f);
} else if (cone->unk2C == 4) {
Firework *burst = (Firework *) new_actor(&initCone);
burst->pos[0] = cone->pos[0];
burst->pos[1] = cone->pos[1];
burst->pos[2] = cone->pos[2];
burst->unk30 = fireworkConeColour[cone->unk48];
burst->unk3C = 0xFF;
burst->unk40 = -0x11;
burst->unk44 = 0x64;
burst->unk34 = 1.8700001f;
burst->unk38 = 1.8700001f;
}
}
Mat4 D_80287500;
void func_80280A28(Vec3f arg0, Vec3s arg1, f32 arg2) {
Mat4 mtx;
func_80021E10(mtx, arg0, arg1);
mtx[0][0] = D_80287500[0][0] * arg2;
mtx[0][1] = D_80287500[1][0] * arg2;
mtx[0][2] = D_80287500[2][0] * arg2;
mtx[1][0] = D_80287500[0][1] * arg2;
mtx[1][1] = D_80287500[1][1] * arg2;
mtx[1][2] = D_80287500[2][1] * arg2;
mtx[2][0] = D_80287500[0][2] * arg2;
mtx[2][1] = D_80287500[1][2] * arg2;
mtx[2][2] = D_80287500[2][2] * arg2;
func_80022180(&gGfxPool->mtxEffect[gMatrixEffectCount], mtx);
gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxEffect[gMatrixEffectCount]), 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);
gMatrixEffectCount += 1;
}
void firework_update(Firework *actor) {
s32 i;
Vec3f pos;
if (actor->unk44 < 30) {
for (i = 0; i < 10; i++) {
pos[0] = actor->pos[0];
pos[1] = actor->pos[1] - i * 2;
pos[2] = actor->pos[2];
render_fireworks(pos, ((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->pos, actor->unk34, actor->unk30, (s16) actor->unk3C);
} else {
actor->isActive = 0;
}
}
actor->unk44 += 1;
}
void unused_80280FA0(UNUSED CeremonyActor *actor) {
}
void unused_80280FA8(UNUSED CeremonyActor *actor) {
}
void balloons_and_fireworks_init(void) {
D_802874D8.actorTimer = 0;
sPodiumActorList = (CeremonyActor *) get_next_available_memory_addr(sizeof(CeremonyActor) * 200);
bzero(sPodiumActorList, (sizeof(CeremonyActor) * 200));
new_actor(&initDummy);
}
void func_80280FFC(void) {
D_802874D8.unk1C = 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++) {
CeremonyActor *balloon;
balloon = new_actor(&initBalloon);
balloon->pos[0] = random_who_knows(200.0f) + arg0;
balloon->pos[1] = random_who_knows(380.0f) + arg1;
balloon->pos[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[3];
//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.
* D_802874BE appears to be zero.
*/
void spawn_firework_cone(s32 arg0, s32 arg1, s32 arg2) {
f32 num;
static u32 D_80287540;
if (((f32) random_float_between_0_and_1() * (D_802874B0[7] + 0xD)) < 1.0f) {
Firework *cone;
cone = (Firework *) new_actor(&initBurst);
cone->pos[0] = random_who_knows(0.0f) + arg0;
cone->pos[1] = random_who_knows((f32) (D_802874B0[11] + 100)) + (f32) arg1;
cone->pos[2] = random_who_knows((f32) (D_802874B0[12] + 700)) + (f32) arg2;
num = 1.1f;
// Wrap the counter from zero to three
cone->unk48 = D_80287540 % 4U;
cone->unk30 = fireworkColour[D_80287540 % 4U];
cone->unk34 = num;
cone->unk38 = num;
D_80287540 += 1;
cone->unk3C = 0xFF;
cone->unk40 = -0x11;
}
}
//extern s16 D_802874C4;
//extern s32 sActorTimer;
extern Mat4 D_80287500;
/**
* Allegedly controls fireworks movement.
*/
void spawn_timer(void) {
Camera *camera = &cameras[0];
f32 lookAtY;
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_802874D8.unk1D < 3) {
if (D_802874D8.actorTimer < 300) {
lookAtY = camera->lookAt[1];
spawn_firework_cone(-0xE0E, (s32) (((lookAtY - camera->pos[1]) * 1.5f) + lookAtY), -0x258);
}
if (D_802874D8.actorTimer == 120) {
spawn_balloons(-0xC6C, (s32) ((f32) D_802874B0[10] + 210.0f), -0x1EF);
}
} else if (D_802874D8.actorTimer == 2) {
spawn_balloons(-0xC6C, (s32) ((f32) D_802874B0[10] + 210.0f), -0x1EF);
}
D_802874D8.actorTimer += 1;
}
void *sUpdate[][3] = {
// Dummy actor
{unused_80280FA8, unused_80280FA0, 0},
// Balloon
{unused_80280FA8, balloon_update, 0},
// Firework Cone
{unused_80280FA8, firework_update, 0},
// Firework Burst
{firework_cone_update_and_spawn_burst, 0, firework_update},
};
//extern s16 D_802874D0;
void update_actors_loop(void) {
void (*func)(void *);
s32 i;
s32 j;
spawn_timer();
D_802874B0[16] = 0;
// Why do we loop over the actor list three times?
// Actors don't with no loop. fireworks don't spawn if the iterator is 2.
for (i = 0; i < 3; i++) {
CeremonyActor *actor = sPodiumActorList;
for (j = 0; j < 200; j++) {
if (actor->isActive & 1) {
func = sUpdate[actor->type][i];
if (func != 0) {
func(actor);
}
}
actor++;
}
}
}
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) {
gMatrixObjectCount = 0;
D_802874FC = 0;
setup_camera_podium_ceremony();
func_80028F70();
func_80022744();
func_80059AC8();
func_80059AC8();
func_8005A070();
if (D_802874D8.unk1C != 0) {
func_8001C14C();
func_800097E0();
}
func_80281D00();
func_80281540();
#if DVDL
display_dvdl();
#endif
gDPFullSync(gDisplayListHead++);
gSPEndDisplayList(gDisplayListHead++);
}
+122
View File
@@ -0,0 +1,122 @@
#ifndef podium_ceremony_actors_H
#define podium_ceremony_actors_H
#include "common_structs.h"
enum ActorType {
Initial,
Balloon,
FireworkCone,
FireworkBurst
};
// unk
typedef struct {
/* 0x00 */ s32 unk0;
/* 0x04 */ s32 unk4;
/* 0x08 */ s32 actorTimer;
/* 0x0C */ u8 unk[16]; // 10 bytes
/* 0x1C */ s8 unk1C;
/* 0x1D */ s8 unk1D;
/* 0x1E */ s8 unk1E; // gCharacterSelections
} struct_D_802874D8;
typedef struct {
s16 type;
Vec3s unk2;
s8 unk8;
s8 unk9;
s8 unkA;
s8 unkB;
} ActorInitParams;
// A generic actor, usually a balloon.
typedef struct {
/* 0x00 */ s32 isActive;
/* 0x04 */ s16 type;
/* 0x06 */ s16 unk6;
/* 0x08 */ s8 unk8;
/* 0x09 */ s8 unk9;
/* 0x0A */ s16 unkA;
/* 0x0C */ s16 unkC;
/* 0x0E */ s16 unkE;
/* 0x10 */ Vec3f pos;
/* 0x1C */ f32 unk1C;
/* 0x20 */ f32 unk20;
/* 0x24 */ f32 unk24;
/* 0x28 */ ActorInitParams *initParams;
/* 0x2C */ s16 unk2C;
/* 0x2E */ s16 unk2E;
/* 0x30 */ s16 unk30;
/* 0x32 */ s16 unk32;
/* 0x34 */ s16 unk34;
/* 0x36 */ s16 unk36;
/* 0x38 */ f32 unk38;
/* 0x3C */ s32 timer; // Used to delete the actor after some time.
/* 0x40 */ s32 unk40;
/* 0x44 */ s32 unk44;
/* 0x48 */ s32 unk48;
} CeremonyActor;
typedef struct {
/* 0x00 */ s32 isActive;
/* 0x04 */ s16 type;
/* 0x06 */ s16 unk6;
/* 0x08 */ s8 unk8;
/* 0x09 */ s8 unk9;
/* 0x0A */ s16 unkA;
/* 0x0C */ s16 unkC;
/* 0x0E */ s16 unkE;
/* 0x10 */ Vec3f pos;
/* 0x1C */ f32 unk1C;
/* 0x20 */ f32 unk20;
/* 0x24 */ f32 unk24;
/* 0x28 */ ActorInitParams *initParams;
/* 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 update_actors_loop(void);
void func_80280650(void);
void set_initial_position(CeremonyActor*);
CeremonyActor *find_available_entry(void);
CeremonyActor *new_actor(ActorInitParams*);
u16 random_u16_credits(void);
f32 random_float_between_0_and_1(void);
f32 random_who_knows(f32);
void func_80280884(void);
void firework_cone_update_and_spawn_burst(Firework *);
void func_80280A28(Vec3f, Vec3s, f32 );
void render_fireworks(Vec3f, f32, s32, s16);
void balloons_and_fireworks_init(void);
void func_80280FFC(void);
void func_8028100C(s32, s32, s32);
void func_8028150C(void);
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);
extern struct_D_802874D8 D_802874D8;
extern CeremonyActor *sPodiumActorList;
extern s32 D_802874FC;
extern ActorInitParams initBalloon;
extern ActorInitParams initCone;
extern ActorInitParams initInitUnk;
extern ActorInitParams initBurst;
extern Gfx *D_802874D4;
extern s32 D_802874FC;
extern Mat4 D_80287500;
extern s16 gMatrixEffectCount;
#endif