mirror of
https://github.com/n64decomp/mk64
synced 2026-08-14 12:23:49 -04:00
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:
@@ -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
@@ -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
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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
|
||||
@@ -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 すたっふ"
|
||||
};
|
||||
@@ -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
|
||||
@@ -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(),
|
||||
};
|
||||
@@ -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++);
|
||||
}
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user