summaryrefslogtreecommitdiff
path: root/src/code_800029B0.h
blob: 4ea0028da6af89d8bf0a537a4aa46e752bdb8101 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
#ifndef CODE_800029B0_H
#define CODE_800029B0_H

#include <macros.h>
#include <libultraship.h>
#include <actor_types.h>
#include "camera.h"

/**
 * To include in C++, you must include libultraship.h
 * and place this file in extern "C"
 */

typedef struct {
    /* 0x00 */ struct Controller* controllers; // gControllers ptr 800F6910
    /* 0x04 */ Camera* camera;                 // The active camera
    /*      */ Camera* raceCamera;
    /*      */ Camera* lookBehindCamera;       // The lookBehind camera
               Camera* freeCamera;
    /*      */ Camera* pendingCamera;          // The camera to switch too next frame
    /* 0x08 */ Player* player;                 // Player ptr 800F6990
    /* 0x0C */ s32* unkC;                      // unk struct?
    /* 0x10 */ Vp viewport;
    /* 0x20 */ s32 pad[2];
    /* 0x28 */ s16 cameraHeight;
    /* 0x2A */ s16 unk;
    /* 0x2C */ s16 screenWidth;
    /* 0x2E */ s16 screenHeight;
    /* 0x30 */ s16 screenStartX;
    /* 0x32 */ s16 screenStartY;
    /* 0x34 */ s16 unk3C;
    /* 0x36 */ s16 playerDirection;
    /* 0x38 */ s16 pathCounter;
    /* 0x3A */ s16 unk42;
    /* 0x3C */ s32 pad2;
} ScreenContext;

/* Function Prototypes */

void func_800029B0(void);
void setup_race(void);
void setup_editor(void);
void func_80002DAC(void);
void clear_nmi_buffer(void);
void credits_spawn_actors(void);

extern s16 gCurrentCourseId; // D_800DC5A0
extern uintptr_t gCurrentlyLoadedTrackAddr;
extern u16 D_800DC5A8;
extern s32 D_800DC5AC;
extern u16 D_800DC5B0;
extern bool bDrawSkybox;
extern u16 D_800DC5B8;
extern bool bFog;
extern u16 gIsInQuitToMenuTransition;
extern u16 gQuitToMenuTransitionCounter;
extern u16 D_800DC5C8;
extern u16 D_800DC5CC;
extern s32 D_800DC5D0;
extern s32 D_800DC5D4;
extern s32 D_800DC5D8;
extern s32 D_800DC5DC;
extern s32 D_800DC5E0;
// This is tracking which credit "state" we're in, decides which credits are shown (and probably other stuff)
extern u16 D_800DC5E4;
extern s32 gPlayerWinningIndex;

extern ScreenContext gScreenContexts[4];
extern ScreenContext* gScreenOneCtx;
extern ScreenContext* gScreenTwoCtx;
extern ScreenContext* gScreenThreeCtx;
extern ScreenContext* gScreenFourCtx;
extern u16 gIsGamePaused;
extern u8* pAppNmiBuffer;
extern s32 gIsMirrorMode; // D_800DC604
extern void set_mirror_mode(s32 mirror);
extern s16 gCreditsCourseId;
extern s16 gPlaceItemBoxes;
extern Vec3f gVtxStretch;

extern CollisionTriangle* gCollisionMesh;
extern u16* gCollisionIndices;
extern u16 gCollisionMeshCount;
extern u16 gNumCollisionTriangles;
extern u32 D_8015F58C;

extern Vec3f D_8015F590;
extern s32 D_8015F59C;
extern s32 D_8015F5A0;
extern s32 D_8015F5A4;

extern Vtx* vtxBuffer[];
extern s16 gTrackMaxX;
extern s16 gTrackMinX;

extern s16 gTrackMaxY;
extern s16 gTrackMinY;

extern s16 gTrackMaxZ;
extern s16 gTrackMinZ;
extern s16 D_8015F6F4;
extern s16 D_8015F6F6;
extern u16 D_8015F6F8;
extern s16 D_8015F6FA;
extern s16 D_8015F6FC;
extern u16 gNumSpawnedShells;

extern u16 D_8015F700;
extern u16 D_8015F702;
extern f32 D_8015F704;
extern Vec3f D_8015F708;
extern UNUSED u32 D_8015F718[3];
extern size_t gFreeMemorySize;
extern uintptr_t gNextFreeMemoryAddress;
extern uintptr_t gHeapEndPtr;

/**
 * This repoints gNextFreeMemoryAddress to the point in the memory pool just after a track was loaded.
 * This allows players to retry or reset a track without reloading the whole track.
 * Memory allocated after track load is not zeroed or reset. But should get overwritten by future allocations.
 *
 * This is a relatively unsafe way to architect a memory pool as old memory could accidentally be used if future allocations do not zero or fully overwrite their free memory.
 */
extern uintptr_t gFreeMemoryCourseAnchor;
extern uintptr_t gFreeMemoryResetAnchor;
extern Vec3f D_8015F738;
extern Vec3f D_8015F748;
extern Vec3f D_8015F758;
extern Vec3f D_8015F768;
extern Vec3f D_8015F778;

extern f32 gTrackDirection;
extern s32 gNumScreens;

extern s32 D_8015F790[];
extern u16 D_8015F890;
extern u16 D_8015F892;
extern u16 D_8015F894;
extern f32 gTimePlayerLastTouchedFinishLine[];

extern u8* gNmiUnknown1;
extern u8* gNmiUnknown2;
extern u8* gNmiUnknown3;
extern u8* gNmiUnknown4;
extern u8* gNmiUnknown5;
extern u8* gNmiUnknown6;

extern Vec3f D_8015F8D0;
extern s32 D_8015F8DC;

extern s32 D_8015F8E0;
extern f32 gWaterLevel;
extern f32 gWaterVelocity;
extern s16 gPlayerPositionLUT[]; // Player index at each position
extern u16 gNumPermanentActors;

extern UNUSED u8 D_80162578[];
extern s16 gDebugPathCount;
extern s16 sIsController1Unplugged;
extern struct RGBA8 gFogColour;
extern uintptr_t D_801625F8;
extern f32 D_801625FC;

#endif