Files
SpaghettiKart/src/code_8006E9C0.c
T
MegaMech 19410f2825 Code Segments Shiftable (#566)
his PR cleans up segment related code in main.c.
Also cleans up the linker a bit.

    Add memory pool to linker as .bss to validate that it exists properly.

    Move framebuffers, gfx, and audio buffers out of racing segment and make its own segment.

    Rename framebuffers.c to buffers.c as it contains more than just framebuffers.

    Import asserts from sm64 to validate that code segments are not overlapping

    Rename segNoload to segmentNoload

    Rename 802BA370 segment to trigTables

    Rename gMenuSelectionFromEndingSequence to gGotoMenu

    Rename gMenuSelectionFromQuit to gGotoMode

    Rename SEG_ENDING_SEQUENCES to SEG_ENDING

    Rename data_821D10 to ceremonyData

    Rename data_825800 to startupLogo
2024-02-05 17:08:29 -07:00

1434 lines
45 KiB
C

#include <ultra64.h>
#include <macros.h>
#include <memory.h>
#include <defines.h>
#include "code_800029B0.h"
#include "code_80005FD0.h"
#include "code_80057C60.h"
#include "code_8006E9C0.h"
#include "code_80086E70.h"
#include "code_80071F00.h"
#include "objects.h"
#include "bomb_kart.h"
#include "save.h"
#include "common_textures.h"
#include <sounds.h>
#include <decode.h>
#include "audio/external.h"
#include "courses/all_course_data.h"
#include "main.h"
#include "menus.h"
#include "data/other_textures.h"
#include "hud_renderer.h"
#include "code_80091750.h"
void init_object_list(void) {
reset_object_variable();
func_8006FA94();
switch (gScreenModeSelection) {
case SCREEN_MODE_1P:
init_hud_one_player();
break;
case SCREEN_MODE_2P_SPLITSCREEN_VERTICAL:
init_hud_two_player_vertical();
break;
case SCREEN_MODE_2P_SPLITSCREEN_HORIZONTAL:
init_hud_two_player_horizontal();
break;
case SCREEN_MODE_3P_4P_SPLITSCREEN:
init_hud_three_four_player();
break;
}
func_80070148();
}
void reset_object_variable(void) {
s32 i;
s32 j;
func_8006EB10();
clear_object_list();
bzero(playerHUD, HUD_PLAYERS_SIZE * sizeof(hud_player));
for (i = 0; i < HUD_PLAYERS_SIZE; i++) {
playerHUD[i].lapCount = 0;
playerHUD[i].alsoLapCount = 0;
playerHUD[i].unk_81 = 0;
}
for (j = 0; j < HUD_PLAYERS_SIZE; j++) {
playerHUD[j].raceCompleteBool = 0;
}
}
void func_8006EB10(void) {
s32 i;
for (i = 0; i < gObjectParticle1_SIZE; i++) {
gObjectParticle1[i] = NULL_OBJECT_ID;
}
for (i = 0; i < gObjectParticle2_SIZE; i++) {
gObjectParticle2[i] = NULL_OBJECT_ID;
}
for (i = 0; i < gObjectParticle3_SIZE; i++) {
gObjectParticle3[i] = NULL_OBJECT_ID;
}
for (i = 0; i < gObjectParticle4_SIZE; i++) {
gObjectParticle4[i] = NULL_OBJECT_ID;
}
// Has to be on one line, because IDO hates you :)
for (i = 0; i < gLeafParticle_SIZE; i++) { gLeafParticle[i] = NULL_OBJECT_ID; }
D_8018CFA8 = 0;
D_8018CF90 = D_8018CFA8;
D_8018CF78 = D_8018CF90;
D_8018CF60 = D_8018CF78;
D_8018CF48 = D_8018CF60;
D_8018CF20 = D_8018CF48;
D_8018CF18 = D_8018CF20;
D_8018CFE0 = 0;
D_8018CFD8 = D_8018CFE0;
D_8018CFD0 = D_8018CFD8;
D_8018CFC8 = D_8018CFD0;
D_8018CFC0 = D_8018CFC8;
D_8018CFB8 = D_8018CFC0;
D_8018CFB0 = D_8018CFB8;
D_8018D018 = 0;
D_8018D010 = 0;
D_8018D008 = 0;
D_8018D000 = 0;
D_8018CFF8 = 0;
D_8018CFF0 = 0;
D_8018CFE8 = 0;
D_8018D110 = 0;
D_8018D0E8 = 0;
D_8018D0C0 = 0;
D_8018D098 = 0;
D_8018D070 = D_8018D098;
D_8018D048 = D_8018D070;
D_8018D020 = D_8018D048;
gNextFreeLeafParticle = 0;
gNextFreeObjectParticle4 = gNextFreeLeafParticle;
gNextFreeObjectParticle3 = gNextFreeObjectParticle4;
gNextFreeObjectParticle2 = gNextFreeObjectParticle3;
gNextFreeObjectParticle1 = gNextFreeObjectParticle2;
}
void clear_object_list() {
bzero(gObjectList, OBJECT_LIST_SIZE * sizeof(Objects));
objectListSize = -1;
}
u8 *func_8006ED94(u8 *devAddr, u8 *baseAddress, u32 size, u32 offset)
{
u8 **tempAddress;
u8 *address;
address = baseAddress + offset;
size = ALIGN16(size);
osInvalDCache(address, (size));
osPiStartDma(&gDmaIoMesg, 0, 0, (uintptr_t)&_other_texturesSegmentRomStart[((u32) devAddr) & 0xFFFFFF], address, size, &gDmaMesgQueue);
osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, 1);
tempAddress = &address;
mio0decode(*tempAddress, (u8 *) baseAddress);
return baseAddress;
}
void func_8006EE44(void) {
D_8018D1E0 = func_8006ED94((u8 *)&gTextureLogoMarioKart64, (u8 *) D_8018D9B0, 0x79E1, 0x20000);
}
// Some kind of initalization for the Item Window part of the HUD
void init_item_window(s32 objectIndex) {
ItemWindowObjects *temp_v0;
temp_v0 = &gObjectList[objectIndex];
temp_v0->currentItem = ITEM_NONE;
temp_v0->itemDisplay = temp_v0->currentItem;
temp_v0->tlutList = (s32 *) common_tlut_item_window_none;
temp_v0->activeTLUT = (s32 *) common_tlut_item_window_none;
temp_v0->textureList = common_texture_item_window_none;
temp_v0->activeTexture = common_texture_item_window_none;
temp_v0->unk_04C = -1;
temp_v0->unk_09C = 0x00A0; // Screen X position
temp_v0->unk_09E = -0x0020; // Screen Y position
temp_v0->sizeScaling = 1.0f;
}
void func_8006EEE8(s32 courseId) {
D_8018D240 = dma_textures(gCourseOutlineTextures[courseId], D_800E5520[courseId], D_800E5520[courseId]);
// This is incredibly dumb. D_800E5548 ought to be something more like
// `u16 D_800E5548[][2]` but that doesn't match for some insane reason
D_8018D2B0 = D_800E5548[courseId * 2];
D_8018D2B8 = D_800E5548[courseId * 2 + 1];
}
#ifdef NON_MATCHING
// I really really don't know what D_8018D9B4 is supposed to be
// Its value is a pointer that seems to point to compressesed data
// of some variety (sometimes TKMK, sometimes MIO0)
extern u8 *D_8018D9B4;
void func_8006EF60(void) {
s32 i;
for (i = 0; i < 0x14; i++) {
D_8018D248[i] = func_8006ED94(gCourseOutlineTextures[i], D_8018D9B4, D_800E5520[i], D_800E5520[i]);
D_8018D9B4 += D_800E5520[i];
}
}
#else
GLOBAL_ASM("asm/non_matchings/code_8006E9C0/func_8006EF60.s")
#endif
void func_8006F008(void) {
D_801655C8 = 0;
xOrientation = 1.0f;
if (gIsMirrorMode != 0) {
xOrientation = -1.0f;
}
D_8018D2C0[0] = 257;
D_8018D2D8[0] = 170;
D_8018D300 = 255;
D_8018D308 = 255;
D_8018D310 = 255;
D_8018D318 = 255;
if (gCurrentCourseId < NUM_COURSES - 1) {
func_8006EEE8((s32) gCurrentCourseId);
}
switch (gCurrentCourseId) {
case COURSE_MARIO_RACEWAY:
D_8018D220 = dma_textures(gTextureExhaust5, 0x443, 0x1000);
D_8018D2A0 = 0.022f;
D_8018D2E0 = 6;
D_8018D2E8 = 28;
D_8018D2C0[0] = 260;
D_8018D2D8[0] = 170;
D_80165718 = 0;
D_80165720 = 5;
D_80165728 = -240;
break;
case COURSE_CHOCO_MOUNTAIN:
D_8018D2A0 = 0.022f;
D_8018D2C0[0] = 265;
D_8018D2E0 = 19;
D_8018D2E8 = 37;
break;
case COURSE_BOWSER_CASTLE:
D_8018D2C0[0] = 265;
D_8018D2A0 = 0.0174f;
D_8018D2E0 = 12;
D_8018D2E8 = 48;
break;
case COURSE_BANSHEE_BOARDWALK:
D_80165880 = dma_textures(gTextureGhosts, 0x4CC2, 0xD980);
D_8018D2A0 = 0.016f;
D_8018D2C0[0] = 0x0106;
D_8018D2E0 = 55;
D_8018D2E8 = 39;
break;
case COURSE_YOSHI_VALLEY:
D_8018D220 = dma_textures(gTextureExhaust0, 0x479, 0xC00);
D_8018D2A0 = 0.018f;
D_8018D2E0 = 61;
D_8018D2E8 = 38;
break;
case COURSE_FRAPPE_SNOWLAND:
D_8018D2C0[0] = 262;
D_8018D2A0 = 0.016f;
D_8018D2E0 = 36;
D_8018D2E8 = 40;
D_8018D300 = 72;
D_8018D308 = 100;
D_8018D310 = 255;
break;
case COURSE_KOOPA_BEACH:
D_8018D220 = dma_textures(gTextureExhaust3, 0x3C8U, 0x1000);
D_8018D2A0 = 0.014f;
D_8018D2C0[0] = 268;
D_8018D2E0 = 40;
D_8018D2E8 = 21;
break;
case COURSE_ROYAL_RACEWAY:
D_8018D220 = dma_textures(gTextureExhaust4, 0x3F8, 0x1000);
D_8018D2C0[0] = 262;
D_8018D2A0 = 0.014f;
D_8018D2E0 = 37;
D_8018D2E8 = 50;
D_80165718 = -64;
D_80165720 = 5;
D_80165728 = -330;
break;
case COURSE_LUIGI_RACEWAY:
D_8018D220 = dma_textures(gTextureExhaust2, 0x4F4U, 0xC00);
D_8018D2A0 = 0.0155f;
D_8018D2C0[0] = 271;
D_8018D2E0 = 45;
D_8018D2E8 = 60;
D_80165718 = -140;
D_80165720 = -44;
D_80165728 = -215;
break;
case COURSE_MOO_MOO_FARM:
D_8018D220 = dma_textures(gTextureExhaust0, 0x479, 0xC00);
D_8018D2A0 = 0.0155f;
D_8018D2C0[0] = 271;
D_8018D2E0 = 18;
D_8018D2E8 = 36;
break;
case COURSE_TOADS_TURNPIKE:
D_8018D2A0 = 0.013f;
D_8018D2C0[0] = 252;
D_8018D2E0 = 57;
D_8018D2E8 = 44;
break;
case COURSE_KALAMARI_DESERT:
D_8018D2C0[0] = 263;
D_8018D2D8[0] = 165;
D_8018D220 = dma_textures(gTextureExhaust5, 0x443, 0x1000);
D_8018D2A0 = 0.015f;
D_8018D2E0 = 55;
D_8018D2E8 = 27;
break;
case COURSE_SHERBET_LAND:
D_8018D220 = dma_textures(gTextureExhaust1, 0x485, 0xC00);
D_8018D2A0 = 0.015f;
D_8018D2C0[0] = 262;
D_8018D2E0 = 52;
D_8018D2E8 = 33;
D_8018D300 = 72;
D_8018D308 = 100;
D_8018D310 = 255;
break;
case COURSE_RAINBOW_ROAD:
D_8018D2A0 = 0.0103f;
D_8018D2C0[0] = 261;
D_8018D2D8[0] = 166;
D_8018D2E0 = 39;
D_8018D2E8 = 55;
break;
case COURSE_WARIO_STADIUM:
D_8018D2A0 = 0.0155f;
D_8018D2C0[0] = 0x0106;
D_8018D2E0 = 53;
D_8018D2E8 = 35;
break;
case COURSE_BLOCK_FORT:
D_8018D2A0 = 0.0335f;
D_8018D2E0 = 32;
D_8018D2E8 = 32;
break;
case COURSE_SKYSCRAPER:
D_8018D2A0 = 0.0445f;
D_8018D2E0 = 32;
D_8018D2E8 = 32;
break;
case COURSE_DOUBLE_DECK:
D_8018D2A0 = 0.0285f;
D_8018D2E0 = 32;
D_8018D2E8 = 32;
break;
case COURSE_DK_JUNGLE:
D_8018D2A0 = 0.0155f;
D_8018D2C0[0] = 255;
D_8018D2E0 = 29;
D_8018D2E8 = 47;
break;
case COURSE_BIG_DONUT:
D_8018D2A0 = 0.0257f;
D_8018D2E0 = 32;
D_8018D2E8 = 31;
}
if (gIsMirrorMode != 0) {
D_8018D2E0 = D_8018D2B0 - D_8018D2E0;
}
if (gPlayerCount == 4) {
D_8018D2C0[0] = 160;
D_8018D2D8[0] = 120;
return;
}
if (gPlayerCount == 3) {
D_8018D2C0[0] = 235;
D_8018D2D8[0] = 175;
return;
}
if (gPlayerCount == 2) {
if (gCurrentCourseId != 10) {
D_8018D2C0[1] = 265;
D_8018D2C0[0] = D_8018D2C0[1];
} else {
D_8018D2C0[1] = 255;
D_8018D2C0[0] = D_8018D2C0[1];
}
D_8018D2D8[0] = 65;
D_8018D2D8[1] = 180;
}
}
void func_8006F824(s32 arg0) {
D_80165808 = D_801657E4;
D_80165810 = D_801657E6;
D_80165820 = D_801657F0;
D_80165818 = D_801657E8;
D_80165828 = D_801657F8;
D_80165832[0] = D_80165800[0];
D_80165832[1] = D_80165800[1];
if ((arg0 != 0) && (gIsGamePaused == 0)) {
play_sound2(SOUND_ACTION_PING);
}
}
void func_8006F8CC(void) {
if (D_8018EDFC == 0) {
D_8018EDFC = 1;
D_801657E4 = 0;
D_801657E6 = 0;
D_801657F0 = 0;
D_801657E8 = 1;
D_80165800[0] = D_80165800[1] = 1;
if (gPlayerCount == 4) {
if (gModeSelection != 3) {
D_801657E4 = 1;
D_801657F0 = 1;
D_801657F8 = 1;
D_80165800[0] = D_80165800[1] = 0;
} else {
D_801657F8 = 0;
D_80165800[0] = D_80165800[1] = 1;
}
} else if (gPlayerCount == 3) {
D_801657E8 = 0;
D_801657F8 = 1;
} else if (gPlayerCount == 2) {
if (gModeSelection != (s32) 3) {
D_801657E4 = 1;
D_801657F0 = 1;
D_80165800[0] = D_80165800[1] = 0;
}
D_8018D2D8[0] = 0x0041;
D_8018D2D8[1] = 0x00B4;
}
func_8006F824(0);
} else {
D_801657E4 = D_80165808;
D_801657E6 = D_80165810;
D_801657F0 = D_80165820;
D_801657E8 = D_80165818;
D_801657F8 = D_80165828;
D_80165800[0] = D_80165832[0];
D_80165800[1] = D_80165832[1];
}
if (gDemoMode != 0) {
D_801657F0 = 0;
}
}
#ifdef MIPS_TO_C
//generated by m2c commit beb457dabfc7a01ec6540a5404a6a05097a13602 on Dec-30-2023
extern s8 D_8016576A;
extern s8 D_8016579C;
extern s8 D_801657E1;
extern s32 D_801657FC;
extern s32 D_80165804;
extern s32 D_8016580C;
extern s32 D_80165814;
extern s32 D_8016581C;
extern s8 D_801658E4;
extern s8 D_801658EC;
extern ? D_8018CFAC;
extern ? D_8018CFB4;
extern ? D_8018CFBC;
extern ? D_8018CFC4;
extern ? D_8018D0F0;
extern s16 D_8018D16C;
extern s16 D_8018D184;
extern s16 D_8018D18C;
extern s32 D_8018D1C4;
extern s32 D_8018D1DC;
extern s32 D_8018D2B4;
void func_8006FA94(void) {
? *var_a0_2;
? *var_a1;
? *var_a2;
? *var_a2_2;
? *var_v1;
Player **var_t0;
Player *temp_v0;
Player *temp_v0_2;
Player *temp_v0_3;
Player *var_v0;
f32 *var_a1_2;
s16 *var_a3;
s16 var_a0;
struct_D_8018CE10 *var_v1_2;
func_8006F8CC();
func_8006F008();
osSetTime(/* u64+0x0 */ 0, /* u64+0x4 */ 0);
D_8018D170 = 0;
D_8018D190 = 0;
gIsHUDVisible = 0;
D_8018D178 = 0;
D_8018D1CC = 0;
D_801657E2 = 0;
D_80165730 = 0;
D_801658FE = 0;
D_801657E5 = 0;
D_801657E3 = D_801657E5;
D_801657E1 = D_801657E3;
D_801658D6 = 0;
D_801658E4 = D_801658D6;
D_801658F4 = D_801658E4;
D_801658EC = D_801658F4;
D_801658DC = D_801658EC;
D_801658CE = D_801658DC;
D_801658C6 = D_801658CE;
D_80165658->unk8 = 0;
D_80165658->unk4 = 0;
D_80165658->unk0 = 0;
D_801658BC = D_801658C6;
switch (gPlayerCount) { /* irregular */
case 1:
if (gModeSelection == 0) {
D_8018D114 = 0;
D_8018D178 = 0x00000096;
D_8018D114 = 0x000000F0;
} else {
D_8018D114 = 1;
D_8018D178 = 0x0000000A;
D_8018D180 = 0;
}
break;
case 2:
if (gScreenModeSelection == 1) {
if (gModeSelection == 0) {
D_8018D114 = 2;
D_8018D178 = 0x00000096;
D_8018D180 = 0x000000F0;
D_8018D2AC = 0x0000003C;
} else if (gModeSelection == 2) {
D_8018D114 = 3;
D_8018D178 = 0x0000001E;
D_8018D180 = 0x0000001E;
D_8018D2AC = 0x0000003C;
} else {
D_8018D114 = 4;
D_8018D178 = 0x00000028;
D_8018D180 = 0x00000028;
D_8018D2AC = 0x0000003C;
}
} else if (gModeSelection == 0) {
D_8018D114 = 5;
} else if (gModeSelection == 2) {
D_8018D114 = 6;
} else {
D_8018D114 = 7;
}
break;
case 3:
if (gModeSelection == 2) {
D_8018D114 = 8;
D_8018D178 = 0x00000064;
D_8018D180 = 0x00000096;
D_8018D2AC = 0x0000003C;
} else {
D_8018D180 = 9;
D_8018D178 = 0x00000064;
D_8018D180 = 0x00000096;
D_8018D2AC = 0x0000003C;
}
break;
case 4:
if (gModeSelection == 2) {
D_8018D114 = 0x0000000A;
D_8018D178 = 0x0000001E;
D_8018D180 = 0x0000001E;
} else {
D_8018D114 = 0x0000000B;
D_8018D178 = 0x0000001E;
D_8018D180 = 0x0000001E;
}
D_8018D2AC = 0x0000000A;
break;
}
if (gEnableDebugMode == 0) {
D_8016576A = 0;
D_8016579C = 0;
}
var_a0 = 0;
if (gPlayerCount > 0) {
var_a0_2 = &D_8018CFB4;
var_a2 = &D_8018CFC4;
var_a1 = &D_8018CFAC;
var_v1 = &D_8018CFBC;
do {
var_a0_2 += 1;
var_v1 += 1;
var_a1 += 1;
var_a2 += 1;
var_v1->unk-1 = 0;
var_a1->unk-1 = 0;
var_a2->unk-1 = 0;
var_a0_2->unk-1 = 0;
} while ((u32) var_a0_2 < (u32) (gPlayerCount + &D_8018CFB4));
var_a0 = 0;
}
D_8018D204 = 1;
D_8018D1FC = 0;
D_8018D224 = 0;
D_8018D1F8 = 0;
D_8018D1F0 = 0;
D_8018D228 = 0xFF;
D_80165628 = 0;
D_80165618 = 0;
D_80165608 = D_80165618;
D_801655F8 = D_80165618;
D_801655E8 = D_80165618;
D_801655D8 = D_80165618;
D_8018D160 = 0;
D_8018D1DC = 0;
D_8018D1C4 = 0;
D_8018D1B4 = 0;
D_8018D1A0 = 0;
D_8018D168 = 0;
D_801656F0 = 0;
D_801657B2 = 0;
D_801657D8 = D_801657B2;
D_8018D214 = (s32) D_801657D8;
D_801657B0 = (s8) D_8018D214;
D_801657AE = D_801657B0;
D_8018D20C = 0;
D_8018D2F8 = 0;
D_8018D2F0 = D_8018D2F8;
D_8018D320 = 3;
D_8018D2AC = 0;
D_8018D2BC = 0;
D_8018D2B4 = D_8018D2BC;
D_8018D2A4 = D_8018D2B4;
D_8018D2C8->unk0 = 0;
D_8018D2C8->unk4 = 0;
D_8018D2C8->unk8 = 0;
D_8018D2C8->unkC = 0;
D_8016581C = 0;
D_8016580C = 0;
D_80165814 = 0;
D_80165804 = 0;
D_801657FC = 0;
D_8018D18C = -1;
D_8018D184 = D_8018D18C;
D_8018D16C = D_8018D18C;
D_8018D17C = D_8018D18C;
D_8018D174 = D_8018D18C;
var_v0 = gPlayerOne;
var_t0 = D_8018CF28;
var_a3 = D_8018CF50;
var_v1_2 = D_8018CE10;
var_a2_2 = &D_8018D0F0;
var_a1_2 = D_8018D050;
do {
var_a1_2->unk0 = -32.0f;
var_a2_2->unk0 = -32.0f;
var_v1_2->unk_04[2] = 0.0f;
var_v1_2->unk_04[1] = 0.0f;
var_v1_2->unk_04[0] = 0.0f;
var_a3->unk0 = var_a0;
var_t0->unk0 = var_v0;
var_v0->unk_040 = -1;
temp_v0 = var_v0 + 0xDD8;
var_t0->unk4 = temp_v0;
var_a3->unk2 = (s16) (var_a0 + 1);
var_v1_2->unk24 = 0.0f;
var_v1_2->unk28 = 0.0f;
var_v1_2->unk2C = 0.0f;
var_a2_2->unk4 = -32.0f;
var_a1_2->unk4 = -32.0f;
temp_v0->unk_040 = -1;
temp_v0_2 = temp_v0 + 0xDD8;
var_a3->unk4 = (s16) (var_a0 + 2);
var_t0->unk8 = temp_v0_2;
var_v1_2->unk44 = 0.0f;
var_v1_2->unk48 = 0.0f;
var_v1_2->unk4C = 0.0f;
var_a2_2->unk8 = -32.0f;
var_a1_2->unk8 = -32.0f;
temp_v0_2->unk_040 = -1;
temp_v0_3 = temp_v0_2 + 0xDD8;
var_t0->unkC = temp_v0_3;
var_a3->unk6 = (s16) (var_a0 + 3);
var_a0 += 4;
var_v1_2->unk64 = 0.0f;
var_v1_2->unk68 = 0.0f;
var_v1_2->unk6C = 0.0f;
var_a2_2->unkC = -32.0f;
var_a1_2->unkC = -32.0f;
temp_v0_3->unk_040 = -1;
var_v0 = temp_v0_3 + 0xDD8;
var_a1_2 += 0x10;
var_a2_2 += 0x10;
var_v1_2 += 0x80;
var_a3 += 8;
var_t0 += 0x10;
} while (var_a0 != (s16) 8);
}
#else
GLOBAL_ASM("asm/non_matchings/code_8006E9C0/func_8006FA94.s")
#endif
void func_80070148(void) {
s32 var_s0;
for (var_s0 = 0; var_s0 < 8; var_s0++) {
find_unused_obj_index(&D_8018CE10[var_s0].objectIndex);
}
}
void init_object_list_index(void) {
s32 loopIndex;
for(loopIndex = 0; loopIndex < SOME_OBJECT_INDEX_LIST_SIZE; loopIndex++) {
find_unused_obj_index(&indexObjectList1[loopIndex]);
find_unused_obj_index(&indexObjectList2[loopIndex]);
find_unused_obj_index(&indexObjectList3[loopIndex]);
find_unused_obj_index(&indexObjectList4[loopIndex]);
}
for(loopIndex = 0; loopIndex < NUM_BOMB_KARTS_VERSUS; loopIndex++) {
find_unused_obj_index(&D_80183DD8[loopIndex]);
}
}
void func_80070250(s32 objectIndex, s32 arg1, StarSpawn *arg2) {
ItemWindowObjects *temp_v0;
init_object(objectIndex, arg1);
temp_v0 = &gObjectList[objectIndex];
temp_v0->unk_0D5 = arg2->id;
temp_v0->currentItem = ITEM_NONE;
temp_v0->direction_angle[1] = arg2->pos[0];
temp_v0->unk_09E = arg2->pos[1];
temp_v0->sizeScaling = (f32) arg2->pos[2] / 100.0;
temp_v0->activeTexture = &D_8018D220[arg2->id];
func_80073404(objectIndex, 0x40U, 0x20U, &D_0D005FB0);
temp_v0->unk_0A0 = 0x00FF;
}
void func_80070328(StarSpawn *arg0) {
s32 var_s0 = 0;
StarSpawn *test = arg0;
do {
if(1) {}
func_80070250(find_unused_obj_index(&D_8018CC80[D_8018D1F8 + var_s0]), 1, test);
var_s0++;
test++;
} while (test->pos[0] != 0xFFFF);
D_8018D1F8 += var_s0;
D_8018D1F0 = var_s0;
D_8018D230 = 0;
}
/**
* This function is part of the spawning for the "stars" in some stages
*
* arg2 is a pointer to some type of spawn data for the stars, although it not super clear
* what types each element is. It seems like its a bunch of u16's, so maybe a Vec4su?
*
* The stars in Wario's Stadium, Toad's Turnpike, and Rainbow Road are not part of the skybox.
* They are instead objects that seemingly hover in the air around the player
* They have no true x/y/z position, instead they seem to be kept in a position relative to the
* player they hang around. There is however an x/y position for where they should be on screen
* when they are visbile (unk_09E[0] and [1]).
* sizeScaling is some sort of size scaling on the start texture.
* unk_0A2 is an alpha value, used to make the star twinkle.
**/
void func_800703E0(s32 objectIndex, s32 arg1, StarSpawn *arg2) {
ItemWindowObjects *temp_v0;
init_object(objectIndex, arg1);
temp_v0 = &gObjectList[objectIndex];
temp_v0->unk_0D5 = arg2->id; // No idea, all 0's for stars
temp_v0->currentItem = ITEM_BANANA;
temp_v0->direction_angle[1] = arg2->pos[0]; // No idea
temp_v0->unk_09E = arg2->pos[1]; // screen Y position
temp_v0->sizeScaling = (f32)arg2->pos[2] / 100.0; // some type of scaling on the texture
temp_v0->activeTexture = D_0D0293D8;
func_80073404(objectIndex, 0x10U, 0x10U, common_vtx_rectangle);
}
void func_800704A0(StarSpawn *arg0) {
s32 var_s0 = 0;
StarSpawn *test = arg0;
do {
if(1) {}
func_800703E0(find_unused_obj_index(&D_8018CC80[D_8018D1F8 + var_s0]), 1, test);
var_s0++;
test++;
} while (test->pos[0] != 0xFFFF);
D_8018D1F8 += var_s0;
D_8018D1F0 = var_s0;
D_8018D230 = 1;
}
void func_8007055C(void) {
s32 var_s0;
s32 var_s4;
switch (gCurrentCourseId) {
case COURSE_MARIO_RACEWAY:
func_80070328(&D_800E6C10);
break;
case COURSE_YOSHI_VALLEY:
func_80070328(&D_800E6AA8);
break;
case COURSE_FRAPPE_SNOWLAND:
if (gPlayerCount == 1) {
var_s4 = 0x32;
} else {
var_s4 = 0x19;
}
for (var_s0 = 0; var_s0 < var_s4; var_s0++) {
find_unused_obj_index(&D_8018CC80[D_8018D1F8 + var_s0]);
}
D_8018D1F8 += var_s0;
D_8018D1F0 = var_s0;
break;
case COURSE_KOOPA_BEACH:
func_80070328(D_800E6B00);
break;
case COURSE_ROYAL_RACEWAY:
func_80070328(D_800E6B38);
break;
case COURSE_LUIGI_RACEWAY:
func_80070328(D_800E6A38);
break;
case COURSE_MOO_MOO_FARM:
func_80070328(D_800E6AA8);
break;
case COURSE_TOADS_TURNPIKE:
func_800704A0(D_800E6C80);
break;
case COURSE_KALAMARI_DESERT:
func_80070328(D_800E6C10);
break;
case COURSE_SHERBET_LAND:
func_80070328(D_800E6BA8);
break;
case COURSE_RAINBOW_ROAD:
func_800704A0(D_800E6C80);
break;
case COURSE_WARIO_STADIUM:
func_800704A0(D_800E6DE0);
break;
}
func_8008C23C();
}
void func_80070714(void) {
D_80165730 = 1;
if (gPlayerCount == ONE_PLAYERS_SELECTED) {
D_80165738 = 0x64;
D_80165740 = 0x3C;
D_80165748 = 0x1E;
return;
}
D_80165738 = 0x32;
D_80165740 = 0x1E;
D_80165748 = 0xA;
}
void init_course_object(void) {
s32 objectId;
s32 i;
switch (gCurrentCourseId) {
case COURSE_MARIO_RACEWAY:
if (gGamestate != 9) {
if (gModeSelection == GRAND_PRIX) {
func_80070714();
}
for (i = 0; i < D_80165738; i++) {
find_unused_obj_index(&gObjectParticle3[i]);
init_object(gObjectParticle3[i], 0);
}
}
break;
case COURSE_BOWSER_CASTLE:
gNumActiveThwomps = NUM_THWOMPS_100CC_EXTRA;
gThowmpSpawnList = gThwompSpawns100CCExtra;
switch (gCCSelection) { /* switch 1; irregular */
case CC_100: /* switch 1 */
case CC_EXTRA: /* switch 1 */
break;
case CC_50: /* switch 1 */
gNumActiveThwomps = NUM_THWOMPS_50CC;
gThowmpSpawnList = gThomwpSpawns50CC;
break;
case CC_150: /* switch 1 */
gNumActiveThwomps = NUM_THWOMPS_150CC;
gThowmpSpawnList = gThomwpSpawns150CC;
break;
}
for (i = 0; i < gNumActiveThwomps; i++) {
objectId = indexObjectList1[i];
init_object(objectId, 0);
gObjectList[objectId].origin_pos[0] = gThowmpSpawnList[i].startX * xOrientation;
gObjectList[objectId].origin_pos[2] = gThowmpSpawnList[i].startZ;
gObjectList[objectId].unk_0D5 = gThowmpSpawnList[i].unk_4;
gObjectList[objectId].unk_0A0 = gThowmpSpawnList[i].unk_6;
}
// Handle the big statue's fire breath
objectId = indexObjectList2[0];
init_object(objectId, 0);
gObjectList[objectId].pos[0] = -68.0 * xOrientation;
gObjectList[objectId].pos[1] = 80.0f;
gObjectList[objectId].pos[2] = -1840.0f;
// Handle the smaller statues' fire breath
for (i = 0; i < NUM_FIRE_BREATHS; i++) {
objectId = indexObjectList3[i];
init_object(objectId, 0);
gObjectList[objectId].pos[0] = gFireBreathsSpawns[i][0] * xOrientation;
gObjectList[objectId].pos[1] = gFireBreathsSpawns[i][1];
gObjectList[objectId].pos[2] = gFireBreathsSpawns[i][2];
gObjectList[objectId].direction_angle[1] = 0;
if (i % 2U) {
gObjectList[objectId].direction_angle[1] += 0x8000;
}
}
for (i = 0; i < 32; i++) {
delete_object(&indexObjectList4[i]);
}
break;
case COURSE_BANSHEE_BOARDWALK:
if (gGamestate != 9) {
objectId = indexObjectList1[0];
init_texture_object(objectId, d_course_banshee_boardwalk_bat_tlut, *d_course_banshee_boardwalk_bat, 0x20U, (u16) 0x00000040);
gObjectList[objectId].orientation[0] = 0;
gObjectList[objectId].orientation[1] = 0;
gObjectList[objectId].orientation[2] = 0x8000;
init_object(indexObjectList1[1], 0);
init_object(indexObjectList1[2], 0);
}
break;
case COURSE_YOSHI_VALLEY:
for (i = 0; i < 4; i++) {
init_object(indexObjectList1[i], 0);
}
if (gGamestate != 9) {
for (i = 0; i < NUM_HEDGEHOGS; i++) {
objectId = indexObjectList2[i];
init_object(objectId, 0);
gObjectList[objectId].pos[0] = gObjectList[objectId].origin_pos[0] = gHedgehogSpawns[i].pos[0] * xOrientation;
gObjectList[objectId].pos[1] = gObjectList[objectId].unk_044 = gHedgehogSpawns[i].pos[1] + 6.0;
gObjectList[objectId].pos[2] = gObjectList[objectId].origin_pos[2] = gHedgehogSpawns[i].pos[2];
gObjectList[objectId].unk_0D5 = gHedgehogSpawns[i].unk_06;
gObjectList[objectId].unk_09C = gHedgehogPatrolPoints[i][0] * xOrientation;
gObjectList[objectId].unk_09E = gHedgehogPatrolPoints[i][2];
}
}
break;
case COURSE_FRAPPE_SNOWLAND:
for (i = 0; i < NUM_SNOWFLAKES; i++) {
find_unused_obj_index(&gObjectParticle1[i]);
}
if (gGamestate != 9) {
for (i = 0; i < NUM_SNOWMEN; i++) {
objectId = indexObjectList2[i];
init_object(objectId, 0);
gObjectList[objectId].origin_pos[0] = gSnowmanSpawns[i].pos[0] * xOrientation;
gObjectList[objectId].origin_pos[1] = gSnowmanSpawns[i].pos[1] + 5.0 + 3.0;
gObjectList[objectId].origin_pos[2] = gSnowmanSpawns[i].pos[2];
objectId = indexObjectList1[i];
init_object(objectId, 0);
gObjectList[objectId].origin_pos[0] = gSnowmanSpawns[i].pos[0] * xOrientation;
gObjectList[objectId].origin_pos[1] = gSnowmanSpawns[i].pos[1] + 3.0;
gObjectList[objectId].origin_pos[2] = gSnowmanSpawns[i].pos[2];
gObjectList[objectId].unk_0D5 = gSnowmanSpawns[i].unk_6;
}
}
break;
case COURSE_KOOPA_BEACH:
if (gGamestate != 9) {
for (i = 0; i < NUM_CRABS; i++) {
objectId = indexObjectList1[i];
init_object(objectId, 0);
gObjectList[objectId].pos[0] = gObjectList[objectId].origin_pos[0] = gCrabSpawns[i].startX * xOrientation;
gObjectList[objectId].unk_01C[0] = gCrabSpawns[i].patrolX * xOrientation;
gObjectList[objectId].pos[2] = gObjectList[objectId].origin_pos[2] = gCrabSpawns[i].startZ;
gObjectList[objectId].unk_01C[2] = gCrabSpawns[i].patrolZ;
}
}
for (i = 0; i < NUM_SEAGULLS; i++) {
objectId = indexObjectList2[i];
init_object(objectId, 0);
if (i < (NUM_SEAGULLS / 2)) {
gObjectList[objectId].unk_0D5 = 0;
} else {
gObjectList[objectId].unk_0D5 = 1;
}
}
break;
case COURSE_ROYAL_RACEWAY:
if (gGamestate != 9) {
if (gModeSelection == GRAND_PRIX) {
func_80070714();
}
for (i = 0; i < D_80165738; i++) {
find_unused_obj_index(&gObjectParticle3[i]);
init_object(gObjectParticle3[i], 0);
}
}
break;
case COURSE_LUIGI_RACEWAY:
if (gGamestate != 9) {
if (gModeSelection == GRAND_PRIX) {
func_80070714();
}
D_80165898 = 0;
init_object(indexObjectList1[0], 0);
for (i = 0; i < D_80165738; i++) {
find_unused_obj_index(&gObjectParticle3[i]);
init_object(gObjectParticle3[i], 0);
}
}
break;
case COURSE_MOO_MOO_FARM:
if (gGamestate != 9) {
if ((gPlayerCount == 1) || ((gPlayerCount == 2) && (gModeSelection == VERSUS))) {
switch (gCCSelection) { /* switch 2; irregular */
case CC_50: /* switch 2 */
D_8018D1C8 = 4;
D_8018D1D0 = 6;
D_8018D1D8 = 6;
break;
case CC_100: /* switch 2 */
D_8018D1C8 = 5;
D_8018D1D0 = 8;
D_8018D1D8 = 8;
break;
case CC_150: /* switch 2 */
D_8018D1C8 = 5;
D_8018D1D0 = 8;
D_8018D1D8 = 10;
break;
case CC_EXTRA: /* switch 2 */
D_8018D1C8 = 5;
D_8018D1D0 = 8;
D_8018D1D8 = 8;
break;
}
} else {
D_8018D1C8 = 4;
D_8018D1D0 = 6;
D_8018D1D8 = 6;
}
for (i = 0; i < NUM_GROUP1_MOLES; i++) {
D_8018D198[i] = 0;
find_unused_obj_index(&indexObjectList1[i]);
}
for (i = 0; i < NUM_GROUP2_MOLES; i++) {
D_8018D1A8[i] = 0;
find_unused_obj_index(&indexObjectList1[i]);
}
for (i = 0; i < NUM_GROUP3_MOLES; i++) {
D_8018D1B8[i] = 0;
find_unused_obj_index(&indexObjectList1[i]);
}
for (i = 0; i < NUM_MAX_MOLES; i++) {
find_unused_obj_index(&gObjectParticle1[i]);
objectId = gObjectParticle1[i];
init_object(objectId, 0);
gObjectList[objectId].pos[0] = gMoleSpawns[i][0] * xOrientation;
gObjectList[objectId].pos[2] = gMoleSpawns[i][2];
func_800887C0(objectId);
gObjectList[objectId].sizeScaling = 0.7f;
}
for (i = 0; i < gObjectParticle2_SIZE; i++) {
find_unused_obj_index(&gObjectParticle2[i]);
}
}
break;
case COURSE_KALAMARI_DESERT:
if (gGamestate != 9) {
find_unused_obj_index(&D_8018CF10);
init_object(D_8018CF10, 0);
for (i = 0; i < 50; i++) {
find_unused_obj_index(&gObjectParticle1[i]);
}
for (i = 0; i < 5; i++) {
find_unused_obj_index(&gObjectParticle2[i]);
}
for (i = 0; i < 32; i++) {
find_unused_obj_index(&gObjectParticle3[i]);
}
}
break;
case COURSE_SHERBET_LAND:
for (i = 0; i < NUM_PENGUINS; i++) {
init_object(indexObjectList1[i], 0);
}
break;
case COURSE_RAINBOW_ROAD:
if (gGamestate != 9) {
for (i = 0; i < NUM_NEON_SIGNS; i++) {
init_object(indexObjectList1[i], 0);
}
for (i = 0; i < NUM_CHAIN_CHOMPS; i++) {
init_object(indexObjectList2[i], 0);
}
}
break;
case COURSE_DK_JUNGLE:
for (i = 0; i < NUM_TORCHES; i++) {
func_800770F0(i);
// wtf?
if (D_8018CF10){}
}
break;
default:
break;
}
}
void init_hud_one_player(void) {
s32 someIndex;
f32 something;
// permuter magic
long long why;
s32 one = 1;
D_8018D140 = 0;
D_8018D150 = 0;
D_8018CFCC = 1.0f;
find_unused_obj_index(&D_80183DA0);
find_unused_obj_index(&gIndexLakituList[0]);
find_unused_obj_index(&gIndexLakituList[1]);
find_unused_obj_index(&gItemWindowObjectByPlayerId[0]);
find_unused_obj_index(&gItemWindowObjectByPlayerId[1]);
init_object_list_index();
func_8007055C();
func_8007055C();
init_course_object();
playerHUD[PLAYER_ONE].speedometerX = 0x0156;
playerHUD[PLAYER_ONE].speedometerY = 0x0106;
D_8018CFEC = playerHUD[PLAYER_ONE].speedometerX + 0x18;
D_8018CFF4 = playerHUD[PLAYER_ONE].speedometerY + 6;
D_8016579E = 0xDD00;
playerHUD[PLAYER_ONE].rankX = 0x0034;
playerHUD[PLAYER_ONE].rankY = 0x00C8;
playerHUD[PLAYER_ONE].slideRankX = 0;
playerHUD[PLAYER_ONE].slideRankY = 0;
playerHUD[PLAYER_ONE].stagingPosition = gGPCurrentRaceRankByPlayerId[0];
playerHUD[PLAYER_ONE].timerX = 0x012C;
playerHUD[PLAYER_ONE].lapCompletionTimeXs[0] = 0x012C;
playerHUD[PLAYER_ONE].lapCompletionTimeXs[1] = 0x012C;
playerHUD[PLAYER_ONE].timerY = 0x0011;
playerHUD[PLAYER_ONE].lapX = -0x0028;
playerHUD[PLAYER_ONE].lapAfterImage1X = -0x0028;
playerHUD[PLAYER_ONE].lapAfterImage2X = -0x0028;
playerHUD[PLAYER_ONE].lapY = 0x0019;
playerHUD[PLAYER_ONE].itemBoxX = 0x00A0;
playerHUD[PLAYER_ONE].itemBoxY = -0x0020;
playerHUD[PLAYER_ONE].slideItemBoxX = 0;
playerHUD[PLAYER_ONE].slideItemBoxY = 0;
// permuter magic
why = 0x000000A0;
init_item_window(gItemWindowObjectByPlayerId[0]);
for (someIndex = 0, something = 35.0f; someIndex < 8; someIndex++, something+= 32.0) {
D_8018D0C8[someIndex] = 40.0f;
D_8018D028[someIndex] = -24.0f;
D_8018D050[someIndex] = something;
D_8018D0F0[someIndex] = something;
D_8018D0A0[someIndex] = 0.0f;
D_8018D078[someIndex] = 0.0f;
}
D_8018CFD4 = 1.0f;
D_8018D3D4 = D_8018D3D8 = D_8018D3DC = 0x000000FF;
D_8018D3E0 = why;
D_8018D3E4 = 0x000000FF;
D_8018D3E8 = 0x000000FF;
D_8018D3EC = 0x000000FF;
D_8018D3F0 = 0x000000FF;
D_8018D3F4 = one;
playerHUD[PLAYER_ONE].unk_4C = 0x0078;
playerHUD[PLAYER_ONE].unk_4A = 0x00A0;
playerHUD[PLAYER_ONE].rankScaling = 0.5f;
D_801656B0 = 0;
D_80165708 = 0x0028;
D_8018D00C = 5.0f;
D_8018D388 = 4;
D_8018D380 = 0x00A0;
D_8018D384 = 0x0078;
D_8018D3C4 = 0x00000032;
D_8018D3BC = 0x0028;
D_8018D3C0 = 0x00000050;
D_801657A2 = 0x0333;
switch (gModeSelection) { /* irregular */
case 0:
D_8018D158 = 8;
break;
case 1:
D_80165638 = (func_800B4F2C() & 0xFFFFF) - 1;
D_80165648 = func_800B4E24(0) & 0xFFFFF;
D_80165888 = 1;
D_80165890 = 1;
D_8018D158 = 1;
break;
}
}
void init_hud_two_player_vertical(void) {
find_unused_obj_index(&D_80183DA0);
find_unused_obj_index(&gIndexLakituList[0]);
find_unused_obj_index(&gIndexLakituList[1]);
find_unused_obj_index(&gItemWindowObjectByPlayerId[0]);
find_unused_obj_index(&gItemWindowObjectByPlayerId[1]);
init_object_list_index();
func_8007055C();
func_8007055C();
init_course_object();
playerHUD[PLAYER_ONE].itemBoxX = -0x52;
playerHUD[PLAYER_ONE].itemBoxY = 0x32;
playerHUD[PLAYER_ONE].slideItemBoxX = 0;
playerHUD[PLAYER_ONE].slideItemBoxY = 0;
playerHUD[PLAYER_ONE].unk_4A = 0x50;
playerHUD[PLAYER_ONE].unk_4C = 0x78;
playerHUD[PLAYER_ONE].rankX = 0x32;
playerHUD[PLAYER_ONE].rankY = 0xD2;
playerHUD[PLAYER_ONE].slideRankX = 0;
playerHUD[PLAYER_ONE].slideRankY = 0;
playerHUD[PLAYER_ONE].timerX = 0x4B;
playerHUD[PLAYER_ONE].timerY = 0x10;
playerHUD[PLAYER_ONE].lapX = 0x67;
playerHUD[PLAYER_ONE].lapY = 0x28;
init_item_window(gItemWindowObjectByPlayerId[PLAYER_ONE]);
playerHUD[PLAYER_TWO].itemBoxX = 0x43;
playerHUD[PLAYER_TWO].itemBoxY = 0x32;
playerHUD[PLAYER_TWO].slideItemBoxX = 0;
playerHUD[PLAYER_TWO].slideItemBoxY = 0;
playerHUD[PLAYER_TWO].unk_4A = 0xF0;
playerHUD[PLAYER_TWO].unk_4C = 0x78;
playerHUD[PLAYER_TWO].rankX = 0xC8;
playerHUD[PLAYER_TWO].rankY = 0xD2;
playerHUD[PLAYER_TWO].slideRankX = 0;
playerHUD[PLAYER_TWO].slideRankY = 0;
playerHUD[PLAYER_TWO].timerX = 0xDC;
playerHUD[PLAYER_TWO].timerY = 0x10;
playerHUD[PLAYER_TWO].lapX = 0xF7;
playerHUD[PLAYER_TWO].lapY = 0x28;
init_item_window(gItemWindowObjectByPlayerId[PLAYER_TWO]);
playerHUD[PLAYER_ONE].stagingPosition = (s16) gGPCurrentRaceRankByPlayerId[0];
playerHUD[PLAYER_TWO].stagingPosition = (s16) gGPCurrentRaceRankByPlayerId[1];
playerHUD[PLAYER_ONE].rankScaling = playerHUD[PLAYER_TWO].rankScaling = 0.5f;
D_8018D3C4 = 0x1E;
D_8018D3BC = 0x18;
D_8018D3C0 = 0x28;
D_801657A2 = 0x666;
switch (gModeSelection) { /* irregular */
case GRAND_PRIX:
D_8018D158 = 8;
break;
case VERSUS:
D_8018D158 = 2;
break;
case BATTLE:
D_8018D158 = 2;
break;
}
}
void init_hud_two_player_horizontal() {
find_unused_obj_index(&D_80183DA0);
find_unused_obj_index(&gIndexLakituList[0]);
find_unused_obj_index(&gIndexLakituList[1]);
find_unused_obj_index(&gItemWindowObjectByPlayerId[0]);
find_unused_obj_index(&gItemWindowObjectByPlayerId[1]);
init_object_list_index();
func_8007055C();
func_8007055C();
init_course_object();
playerHUD[PLAYER_ONE].itemBoxY = 0x22;
playerHUD[PLAYER_ONE].itemBoxX = -0x53;
playerHUD[PLAYER_ONE].slideItemBoxX = 0;
playerHUD[PLAYER_ONE].slideItemBoxY = 0;
playerHUD[PLAYER_ONE].unk_4A = 0xA0;
playerHUD[PLAYER_ONE].unk_4C = 0x3C;
playerHUD[PLAYER_ONE].rankX = 0x34;
playerHUD[PLAYER_ONE].rankY = 0x62;
playerHUD[PLAYER_ONE].slideRankX = 0;
playerHUD[PLAYER_ONE].slideRankY = 0;
playerHUD[PLAYER_ONE].timerX = 0xEA;
playerHUD[PLAYER_ONE].timerY = 0x10;
playerHUD[PLAYER_ONE].lapX = 0x101;
playerHUD[PLAYER_ONE].lapY = 0x6A;
playerHUD[PLAYER_TWO].itemBoxX = -0x53;
playerHUD[PLAYER_TWO].itemBoxY = 0x8F;
playerHUD[PLAYER_TWO].slideItemBoxX = 0;
playerHUD[PLAYER_TWO].slideItemBoxY = 0;
playerHUD[PLAYER_TWO].unk_4A = 0xA0;
playerHUD[PLAYER_TWO].unk_4C = 0xB4;
playerHUD[PLAYER_TWO].rankX = 0x34;
playerHUD[PLAYER_TWO].rankY = 0xD2;
playerHUD[PLAYER_TWO].slideRankX = 0;
playerHUD[PLAYER_TWO].slideRankY = 0;
playerHUD[PLAYER_TWO].timerX = 0xEA;
playerHUD[PLAYER_TWO].timerY = 0x7F;
playerHUD[PLAYER_TWO].lapX = 0x101;
playerHUD[PLAYER_TWO].lapY = 0xDA;
if (gModeSelection == BATTLE) {
playerHUD[PLAYER_ONE].itemBoxY = 0x5E;
playerHUD[PLAYER_TWO].itemBoxY = 0xD0;
}
playerHUD[PLAYER_ONE].rankScaling = playerHUD[PLAYER_TWO].rankScaling = 0.5f;
playerHUD[PLAYER_ONE].stagingPosition = (s16) gGPCurrentRaceRankByPlayerId[0];
playerHUD[PLAYER_TWO].stagingPosition = (s16) gGPCurrentRaceRankByPlayerId[1];
init_item_window(gItemWindowObjectByPlayerId[0]);
init_item_window((gItemWindowObjectByPlayerId[1]));
D_8018D3C4 = 0x1E;
D_8018D3BC = 0x18;
D_8018D3C0 = 0x28;
D_801657A2 = 0x666;
switch (gModeSelection) { /* irregular */
case GRAND_PRIX:
D_8018D158 = 8;
return;
case VERSUS:
D_8018D158 = 2;
return;
case BATTLE:
D_8018D158 = 2;
return;
}
}
void init_hud_three_four_player(void) {
find_unused_obj_index(&D_80183DA0);
find_unused_obj_index(&gIndexLakituList[0]);
find_unused_obj_index(&gIndexLakituList[1]);
find_unused_obj_index(&gIndexLakituList[2]);
find_unused_obj_index(&gIndexLakituList[3]);
find_unused_obj_index(&gItemWindowObjectByPlayerId[0]);
find_unused_obj_index(&gItemWindowObjectByPlayerId[1]);
find_unused_obj_index(&gItemWindowObjectByPlayerId[2]);
find_unused_obj_index(&gItemWindowObjectByPlayerId[3]);
init_object_list_index();
init_course_object();
playerHUD[PLAYER_ONE].itemBoxX = -0x36;
playerHUD[PLAYER_ONE].itemBoxY = 0x36;
playerHUD[PLAYER_ONE].slideItemBoxX = 0;
playerHUD[PLAYER_ONE].slideItemBoxY = 0;
playerHUD[PLAYER_ONE].unk_4A = 0x50;
playerHUD[PLAYER_ONE].unk_4C = 0x3C;
playerHUD[PLAYER_ONE].rankX = 0x25;
playerHUD[PLAYER_ONE].rankY = 0x64;
playerHUD[PLAYER_ONE].slideRankX = 0;
playerHUD[PLAYER_ONE].slideRankY = 0;
playerHUD[PLAYER_ONE].lapX = 0x8C;
playerHUD[PLAYER_ONE].lapY = 0x60;
playerHUD[PLAYER_ONE].unk_6C = 0xDE;
playerHUD[PLAYER_ONE].unk_6E = 0xC8;
playerHUD[PLAYER_TWO].itemBoxX = 0x175;
playerHUD[PLAYER_TWO].itemBoxY = 0x36;
playerHUD[PLAYER_TWO].slideItemBoxX = 0;
playerHUD[PLAYER_TWO].slideItemBoxY = 0;
playerHUD[PLAYER_TWO].unk_4A = 0xF0;
playerHUD[PLAYER_TWO].unk_4C = 0x3C;
playerHUD[PLAYER_TWO].rankX = 0x11A;
playerHUD[PLAYER_TWO].rankY = 0x64;
playerHUD[PLAYER_TWO].slideRankX = 0;
playerHUD[PLAYER_TWO].slideRankY = 0;
playerHUD[PLAYER_TWO].lapX = 0xB4;
playerHUD[PLAYER_TWO].lapY = 0x60;
playerHUD[PLAYER_TWO].unk_6C = 0xC8;
playerHUD[PLAYER_TWO].unk_6E = 0xC8;
playerHUD[PLAYER_THREE].itemBoxX = -0x36;
playerHUD[PLAYER_THREE].itemBoxY = 0x2D;
playerHUD[PLAYER_THREE].slideItemBoxX = 0;
playerHUD[PLAYER_THREE].slideItemBoxY = 0;
playerHUD[PLAYER_THREE].unk_4A = 0x50;
playerHUD[PLAYER_THREE].unk_4C = 0xB4;
playerHUD[PLAYER_THREE].rankX = 0x25;
playerHUD[PLAYER_THREE].rankY = 0xD2;
playerHUD[PLAYER_THREE].slideRankX = 0;
playerHUD[PLAYER_THREE].slideRankY = 0;
playerHUD[PLAYER_THREE].lapX = 0x8C;
playerHUD[PLAYER_THREE].lapY = 0xD4;
playerHUD[PLAYER_THREE].unk_6C = 0xDE;
playerHUD[PLAYER_THREE].unk_6E = 0xC0;
playerHUD[PLAYER_FOUR].itemBoxX = 0x175;
playerHUD[PLAYER_FOUR].itemBoxY = 0x2D;
playerHUD[PLAYER_FOUR].slideItemBoxX = 0;
playerHUD[PLAYER_FOUR].slideItemBoxY = 0;
playerHUD[PLAYER_FOUR].unk_4A = 0xF0;
playerHUD[PLAYER_FOUR].unk_4C = 0xB4;
playerHUD[PLAYER_FOUR].rankX = 0x11A;
playerHUD[PLAYER_FOUR].rankY = 0xD2;
playerHUD[PLAYER_FOUR].slideRankX = 0;
playerHUD[PLAYER_FOUR].slideRankY = 0;
playerHUD[PLAYER_FOUR].lapX = 0xB4;
playerHUD[PLAYER_FOUR].lapY = 0xD4;
playerHUD[PLAYER_FOUR].unk_6C = 0xC8;
playerHUD[PLAYER_FOUR].unk_6E = 0xC0;
if (gModeSelection == BATTLE) {
playerHUD[PLAYER_ONE].itemBoxY = 0xC8;
playerHUD[PLAYER_TWO].itemBoxY = 0xC8;
playerHUD[PLAYER_THREE].itemBoxY = 0xB8;
playerHUD[PLAYER_FOUR].itemBoxY = 0xB8;
}
playerHUD[PLAYER_ONE].rankScaling = playerHUD[PLAYER_TWO].rankScaling = playerHUD[PLAYER_THREE].rankScaling = playerHUD[PLAYER_FOUR].rankScaling = 0.5f;
playerHUD[PLAYER_ONE].stagingPosition = (s16) gGPCurrentRaceRankByPlayerId[0];
playerHUD[PLAYER_TWO].stagingPosition = (s16) gGPCurrentRaceRankByPlayerId[1];
playerHUD[PLAYER_THREE].stagingPosition = (s16) gGPCurrentRaceRankByPlayerId[2];
playerHUD[PLAYER_FOUR].stagingPosition = (s16) gGPCurrentRaceRankByPlayerId[3];
init_item_window(gItemWindowObjectByPlayerId[0]);
init_item_window(gItemWindowObjectByPlayerId[1]);
init_item_window(gItemWindowObjectByPlayerId[2]);
init_item_window(gItemWindowObjectByPlayerId[3]);
playerHUD[PLAYER_ONE].unknownScaling = playerHUD[PLAYER_TWO].unknownScaling = playerHUD[PLAYER_THREE].unknownScaling = playerHUD[PLAYER_FOUR].unknownScaling = 1.5f;
D_8018D158 = (s32) gPlayerCount;
D_8018D3C4 = 0x00000014;
D_8018D3BC = 0x00000010;
D_8018D3C0 = 0x0000001E;
D_801657A2 = 0x0888;
}