Starship/src/overlays/ovl_menu/fox_option.c
2024-11-16 00:23:55 -06:00

4655 lines
147 KiB
C

/*
* File: fox_option.c
* System: Option
* Description: Starfox Option Menu Handler
*/
#include "mods.h"
#include "prevent_bss_reordering.h"
#include "global.h"
#include "fox_option.h"
#include "assets/ast_text.h"
#include "assets/ast_font_3d.h"
#include "assets/ast_option.h"
#include "assets/ast_vs_menu.h"
#include "assets/ast_map.h"
#include "port/interpolation/FrameInterpolation.h"
extern s32 gRankingTeamAlive[][3];
extern Gfx gMapVenomCloudDL[];
extern Gfx gMapKatinaDL[];
extern Gfx gMapMacbethDL[];
extern Gfx gMapZonessDL[];
extern Gfx gMapCorneriaDL[];
extern Gfx gMapTitaniaDL[];
extern Gfx gMapAquasDL[];
extern Gfx gMapFortunaDL[];
extern Gfx gMapKatinaDL[];
extern Gfx gMapVenomDL[];
extern f32 D_menu_801CD818[9];
s32 D_menu_801B9090;
s32 sRankInPos;
s32 D_menu_801B9098;
s32 D_menu_801B90A0[3];
s32 D_menu_801B90B0[3];
f32 D_menu_801B90C0[3];
f32 D_menu_801B90D0[3];
f32 D_menu_801B90E0[3];
f32 D_menu_801B90F0[3];
f32 D_menu_801B9100[3];
f32 D_menu_801B9110[3];
f32 sNameEntryLightXrot;
f32 sNameEntryLightYrot;
OptionId sMenuEntryState;
s32 D_menu_801B9128;
s32 sMainMenuState;
s32 D_menu_801B9130;
s32 D_menu_801B9134;
s32 D_menu_801B9138;
s32 D_menu_801B913C;
s32 D_menu_801B9140[3];
s32 D_menu_801B914C;
u8 D_menu_801B9150[3][2];
s32 D_menu_801B9158;
StickInput D_menu_801B9160[3];
s32 D_menu_801B9178; // timer of some kind
s32 D_menu_801B917C; // timer of some kind
StickInput D_menu_801B9180;
StickInput D_menu_801B9188;
StickInput D_menu_801B9190;
StickInput D_menu_801B9198;
s32 D_menu_801B91A0;
s32 sMainMenuCursor; // Position of the cursor in the main menu.
s32 sVsMenuCursor; // Position of the cursor in the versus menu.
s32 sExpertSoundCursor; // Whether the Expert Sound options are selected in the menu.
s32 sExpertModeCursor; // Whether the Expert Main Game mode is selected in the menu.
s32 D_menu_801B91B4; // Set to 0 and never used.
s32 D_menu_801B91B8;
bool sDrawCursor;
s32 D_menu_801B91C0;
s32 D_menu_801B91C4;
bool sExpertModesEnabled;
s32 D_menu_801B91CC;
s32 D_menu_801B91D0;
f32 D_menu_801B91D4;
f32 D_menu_801B91D8;
f32 D_menu_801B91DC;
f32 D_menu_801B91E0;
f32 D_menu_801B91E4;
f32 D_menu_801B91E8;
f32 sOkConfirmTimer; // Time before going to the next screen after confirming "OK?" in the versus menu.
bool sVsSubMenuFirstState; // Whether the first sub menu option has yet to be selected
f32 D_menu_801B91F4;
f32 D_menu_801B91F8;
f32 sRightArwingCursorYrot;
f32 sLeftArwingCursorYrot;
f32 sLightningXpos;
f32 sLightningYpos;
f32 sLightningXScale;
f32 sLightningYScale;
s32 D_menu_801B9214;
f32 D_menu_801B9218;
f32 D_menu_801B921C;
f32 D_menu_801B9220;
f32 sArwingLightXrot;
f32 sArwingLightYrot;
s32 sArwingLightColR;
s32 sArwingLightColG;
s32 sArwingLightColB;
s32 sArwingLightAmbR;
s32 sArwingLightAmbG;
s32 sArwingLightAmbB;
bool sMainMenuFromCancel;
bool sVsSubMenuFromCancel;
u8 D_menu_801B924C;
StickInput D_menu_801B9250;
StickInput D_menu_801B9258;
StickInput D_menu_801B9260;
StickInput D_menu_801B9268;
f32 D_menu_801B9270[5];
s32 D_menu_801B9284;
s32 D_menu_801B9288;
StickInput D_menu_801B9290;
f32 D_menu_801B9298[32];
s32 sSpectrumAnalyzerMode;
s32 D_menu_801B931C;
bool sMusicPlaying; // Music is playing status in the expert sound options
extern s32 BSS_PAD_0;
s32 D_menu_801B9330[2];
s32 D_menu_801B933C;
s32 D_menu_801B9340;
s32 D_menu_801B9348[4];
f32 D_menu_801B9358[4];
f32 D_menu_801B9368;
s32 sPointConfirmTimer;
f32 D_menu_801B9370;
s32 sStageSelectConfirmTimer;
f32 D_menu_801B9378;
s32 sTimeTrialConfirmTimer;
StickInput D_menu_801B9380[4];
StickInput D_menu_801B93A0[4];
u8 D_menu_801B93C4;
extern s32 BSS_PAD_1;
s32 sVsMenuSelection;
s32 D_menu_801B93D4;
s32 D_menu_801B93D8;
s32 D_menu_801B93DC;
bool sRanking2ndPage;
s32 D_menu_801B93E4;
s32 D_menu_801B93E8;
s32 D_menu_801B93EC;
f32 D_menu_801B93F0;
f32 D_menu_801B93F4;
f32 D_menu_801B93F8;
StickInput D_menu_801B9400;
StickInput D_menu_801B9408;
#include "prevent_bss_reordering2.h"
struct BssPad0 {
int x;
};
struct BssPad1 {
int x;
};
// struct BssPad2 {int x;};
// struct BssPad3 {int x;};
// struct BssPad4 {int x;};
extern s32 BSS_PAD_2;
f32 sOptionCardPosY[] = { 60.0f, 36.0f, 12.0f, -12.0f, -36.0f, -60.0f };
f32 sOptionCardTextPosX[] = { 124.0f, 118.0f, 145.0f, 125.0f, 133.0f, 118.0f };
f32 sOptionCardTextPosY[] = { 54.0f, 78.0f, 103.0f, 126.0f, 151.0f, 175.0f };
f32 sOptionCardCurTextPosX[] = { 124.0f, 118.0f, 145.0f, 125.0f, 133.0f, 118.0f };
f32 sOptionCardCurTextPosY[] = { 54.0f, 78.0f, 103.0f, 126.0f, 151.0f, 175.0f };
f32 D_menu_801AE5E8[] = { 124.0f, 125.0f };
f32 D_menu_801AE5F0[] = { 54.0f, 55.0f };
f32 D_menu_801AE5F8[] = { 133.0f, 125.0f };
f32 D_menu_801AE600[] = { 151.0f, 151.0f };
f32 D_menu_801AE608[] = { 8.0f, 8.0f, 8.0f, 8.0f, 8.0f, 8.0f };
f32 D_menu_801AE620[] = { 1.9f, 2.4f, 0.9f, 1.9f, 1.8f, 2.4f };
OptionEntry sOptionCardList[] = {
{
{ 0, 0, aMainGameCardTex, 0, 72, 12, 126.0f, 46.0f, 1.0f, 1.0f, 20, 0, 75, 255 },
{ 0.0f, 30.0f, -130.0f, 0.2f, 0.11f },
{ -40.0f, 27.0f, 80.0f },
1,
1,
},
{
{ 0, 0, aTrainingCardTex, 0, 80, 12, 126.0f, 184.0f, 1.0f, 1.0f, 20, 0, 75, 255 },
{ 0.0f, 18.0f, -130.0f, 0.2f, 0.11f },
{ -40.0f, 16.0f, 80.0f },
1,
1,
},
{
{ 0, 0, aVsCardTex, 0, 32, 10, 126.0f, 184.0f, 1.0f, 1.0f, 20, 0, 75, 255 },
{ 0.0f, 6.0f, -130.0f, 0.2f, 0.11f },
{ -40.0f, 6.0f, 80.0f },
1,
1,
},
{
{ 0, 0, aRankingCardTex, 0, 64, 12, 110.0f, 91.0f, 1.0f, 1.0f, 20, 0, 75, 255 },
{ 0.0f, -6.0f, -130.0f, 0.2f, 0.11f },
{ -40.0f, -5.0f, 80.0f },
1,
1,
},
{
{ 0, 0, aSoundCardTex, 0, 64, 10, 110.0f, 116.0f, 1.0f, 1.0f, 20, 0, 75, 255 },
{ 0.0f, -18.0f, -130.0f, 0.2f, 0.11f },
{ -40.0f, -16.0f, 80.0f },
1,
1,
},
{
{ 0, 0, aDataCardTex, 0, 80, 10, 126.0f, 184.0f, 1.0f, 1.0f, 20, 0, 75, 255 },
{ 0.0f, -30.0f, -130.0f, 0.2f, 0.11f },
{ -40.0f, -27.0f, 80.0f },
1,
1,
},
};
OptionEntry sOptionVSCardList[] = {
{
{ 0, 0, aVsPointMatchCardTex, 0, 96, 13, 110.0f, 91.0f, 1.0f, 1.0f, 20, 0, 75, 255 },
{ 0.0f, 11.0f, -130.0f, 0.2f, 0.11f },
{ -40.0f, 11.0f, 80.0f },
1,
1,
},
{
{ 0, 0, aVsBattleRoyalCardTex, 0, 96, 10, 110.0f, 116.0f, 1.0f, 1.0f, 20, 0, 75, 255 },
{ 0.0f, 0.0f, -130.0f, 0.2f, 0.11f },
{ -40.0f, 0.0f, 80.0f },
1,
1,
},
{
{ 0, 0, aVsTimeTrialCardTex, 0, 96, 10, 110.0f, 138.0f, 1.0f, 1.0f, 20, 0, 75, 255 },
{ 0.0f, -11.0f, -130.0f, 0.2f, 0.11f },
{ -40.0f, -11.0f, 80.0f },
1,
1,
},
};
u8 sSoundMode[] = { SOUNDMODE_STEREO, SOUNDMODE_MONO, SOUNDMODE_HEADSET };
u8 D_menu_801AE99C[] = { 0, 1, 2 };
f32 D_menu_801AE9A0[4] = { 62.0f, 222.0f, 75.0f, 235.0f };
f32 D_menu_801AE9B0[4] = { 43.0f, 43.0f, 46.0f, 46.0f };
OptionCardTexture D_menu_801AE9C0[4] = {
{ 2, 0, aSpeakerTex, aSpeakerTLUT, 32, 32, 56.0f, 175.0f, 1.0f, 1.0f, 255, 255, 255, 255 },
{ 2, 0, aSpeakerTex, aSpeakerTLUT, 32, 32, 216.0f, 175.0f, 1.0f, 1.0f, 255, 255, 255, 255 },
{ 1, 0, aSpeakerCenterTex, aSpeakerCenterTLUT, 16, 16, 69.0f, 178.0f, 1.0f, 1.0f, 255, 255, 255, 255 },
{ 1, 0, aSpeakerCenterTex, aSpeakerCenterTLUT, 16, 16, 229.0f, 178.0f, 1.0f, 1.0f, 255, 255, 255, 255 },
};
OptionCardTexture D_menu_801AEAA0[3] = {
{ 3, 0, aSliderFrameTex, 0, 104, 10, 151.0f, 135.0f, 1.05f, 1.0f, 255, 255, 255, 255 },
{ 3, 0, aSliderFrameTex, 0, 104, 10, 151.0f, 161.0f, 1.05f, 1.0f, 255, 255, 255, 255 },
{ 3, 0, aSliderFrameTex, 0, 104, 10, 151.0f, 188.0f, 1.05f, 1.0f, 255, 255, 255, 255 },
};
OptionCardTexture D_menu_801AEB48[3] = {
{ 3, 0, aSliderTex, 0, 16, 16, 245.0f, 132.0f, 1.0f, 1.0f, 255, 255, 255, 255 },
{ 3, 0, aSliderTex, 0, 16, 16, 245.0f, 158.0f, 1.0f, 1.0f, 255, 255, 255, 255 },
{ 3, 0, aSliderTex, 0, 16, 16, 245.0f, 185.0f, 1.0f, 1.0f, 255, 255, 255, 255 },
};
Vtx D_menu_801AEBF0[] = {
{ 1, 1, 0, 0, 0, 0, 255, 255, 255, 255 },
{ -1, 1, 0, 0, 0, 0, 255, 255, 255, 255 },
{ -1, 0, 0, 0, 0, 0, 255, 255, 255, 255 },
{ 1, 0, 0, 0, 0, 0, 255, 255, 255, 255 },
};
Gfx D_menu_801AEC30[] = {
gsSPVertex(D_menu_801AEBF0, 4, 0),
gsSP1Quadrangle(1, 2, 3, 0, 0),
gsSPEndDisplayList(),
};
Vtx D_menu_801AEC48[] = {
{ 1, 0, 0, 0, 0, 0, 255, 255, 255, 255 },
{ -1, 0, 0, 0, 0, 0, 255, 255, 255, 255 },
{ -1, -1, 0, 0, 0, 0, 255, 255, 255, 255 },
{ 1, -1, 0, 0, 0, 0, 255, 255, 255, 255 },
};
Gfx D_menu_801AEC88[] = {
gsSPVertex(D_menu_801AEC48, 4, 0),
gsSP1Quadrangle(1, 2, 3, 0, 0),
gsSPEndDisplayList(),
};
Vtx D_menu_801AECA0[] = {
{ 1, 1, 0, 0, 0, 0, 255, 255, 255, 255 },
{ -1, 1, 0, 0, 0, 0, 255, 255, 255, 255 },
{ -1, -1, 0, 0, 0, 0, 255, 255, 255, 255 },
{ 1, -1, 0, 0, 0, 0, 255, 255, 255, 255 },
};
Gfx D_menu_801AECE0[] = {
gsSPVertex(D_menu_801AECA0, 4, 0),
gsSP1Quadrangle(1, 2, 3, 0, 0),
gsSPEndDisplayList(),
};
u8* D_menu_801AECF8[10] = {
aLargeText_0, aLargeText_1, aLargeText_2, aLargeText_3, aLargeText_4,
aLargeText_5, aLargeText_6, aLargeText_7, aLargeText_8, aLargeText_9,
};
f32 D_menu_801AED20[2] = { 255.0f, 255.0f };
// TF is this? seems unused
s32 D_menu_801AED28[] = {
/* EE73E8 801AED28 00000038 */ 56,
/* EE73EC 801AED2C 00000043 */ 67,
/* EE73F0 801AED30 0000004E */ 78,
/* EE73F4 801AED34 00000059 */ 89,
/* EE73F8 801AED38 0000005B */ 91,
};
s32 D_menu_801AED3C[4] = { 0, 0, 0, 0 };
RouteColoredLine sRouteColoredLine[24] = {
{ 9, 0, 0 }, { 0, 12, 0 }, { 12, 4, 0 }, { 4, 10, 0 }, { 10, 2, 0 }, { 6, 4, 0 }, { 7, 2, 0 }, { 3, 2, 0 },
{ 2, 14, 0 }, { 5, 6, 1 }, { 6, 13, 1 }, { 13, 7, 1 }, { 4, 7, 1 }, { 12, 13, 1 }, { 8, 7, 1 }, { 9, 5, 2 },
{ 5, 11, 2 }, { 11, 8, 2 }, { 8, 3, 2 }, { 3, 1, 2 }, { 7, 1, 2 }, { 1, 14, 2 }, { 0, 6, 3 }, { 4, 3, 4 },
};
Gfx* D_menu_801AEE6C[16] = {
aMapMeteorDL, aMapArea6DL, aMapBolseDL, aMapSectorZDL, aMapSectorXDL, aMapSectorYDL,
gMapKatinaDL, gMapMacbethDL, gMapZonessDL, gMapCorneriaDL, gMapTitaniaDL, gMapAquasDL,
gMapFortunaDL, aMapSolarDL, gMapVenomDL, gMapVenomDL,
};
char* D_menu_801AEEAC[] = {
"ME", "A6", "BO", "SZ", "SX", "SY", "KA", "MA", "ZO", "CO", "TI", "AQ", "FO", "SO", "VE", "VE",
};
s32 PAD_menu_801AEEEC = 0;
Vtx D_menu_801AEEF0[] = {
{ -11, -11, 0, 0, 0, 255, 0, 0, 0, 0 },
{ 11, -11, 0, 0, 255, 255, 0, 0, 0, 0 },
{ 11, 11, 0, 0, 255, 0, 0, 0, 0, 0 },
{ -11, 11, 0, 0, 0, 0, 0, 0, 0, 0 },
};
Gfx D_menu_801AEF30[] = {
gsSPVertex(D_menu_801AEEF0, 4, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(0, 2, 3, 0),
gsSPEndDisplayList(),
};
s32 PAD_menu_801AEF50[] = { 0, 0, 0 };
char sCharMap[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.";
f32 D_menu_801AEF84[] = { 24.0f, 0.0f, -24.0f };
f32 D_menu_801AEF90[] = { 111.0f, 112.0f, 121.0f };
f32 D_menu_801AEF9C[] = { 89.0f, 115.0f, 139.0f };
void Option_Setup(void) {
bool enableExpertModes;
bool playedExpertMode;
s32 i;
#if MODS_LEVEL_SELECT == 1
for (i = 0; i < ARRAY_COUNT(gSaveFile.save.data.planet); i++) {
gSaveFile.save.data.planet[i].expertClear = 1;
gSaveFile.save.data.planet[i].normalClear = 1;
gSaveFile.save.data.planet[i].normalMedal = 1;
gSaveFile.save.data.planet[i].expertMedal = 1;
gSaveFile.save.data.planet[i].played = 1;
}
Save_Write();
#endif
gVIsPerFrame = 2;
sOptionCardList[OPTION_MAP].tex.texture = aMainGameCardTex;
sOptionCardList[OPTION_MAP].tex.width = 72;
sOptionCardList[OPTION_MAP].tex.height = 12;
sOptionCardList[OPTION_SOUND].tex.texture = aSoundCardTex;
sOptionCardList[OPTION_SOUND].tex.width = 64;
sOptionCardList[OPTION_SOUND].tex.height = 10;
for (i = 0; i < ARRAY_COUNT(sOptionCardList); i++) {
sOptionCardCurTextPosX[i] = sOptionCardTextPosX[i];
sOptionCardCurTextPosY[i] = sOptionCardTextPosY[i];
}
enableExpertModes = true;
for (i = 0; i < ARRAY_COUNT(gSaveFile.save.data.planet); i++) {
if (i == SAVE_SLOT_VENOM_1) {
continue;
}
if (!(gSaveFile.save.data.planet[i].normalMedal & 1)) {
if (CVarGetInteger("gLevelSelector", 0) || CVarGetInteger("gSfxJukebox", 0)) {
enableExpertModes = true;
} else {
enableExpertModes = false;
}
break;
}
}
sExpertModesEnabled = enableExpertModes;
gFillScreenRed = 0;
gFillScreenGreen = 0;
gFillScreenBlue = 0;
gFillScreenAlpha = 0;
gBlurAlpha = 255;
gBgColor = 0;
sMainMenuCursor = OPTION_MAP;
if ((gLastGameState == GSTATE_PLAY) && (gCurrentLevel == LEVEL_TRAINING)) {
gLastGameState = GSTATE_NONE;
sMainMenuCursor = OPTION_TRAINING;
}
sVsMenuCursor = 0;
sExpertSoundCursor = 0;
sExpertModeCursor = 0;
playedExpertMode = gExpertMode;
gExpertMode = false;
gGameFrameCount = 0;
sWipeHeight = 0;
D_menu_801B9178 = 0;
D_menu_801B917C = 0;
sMenuEntryState = OPTION_MAIN_MENU;
if ((gLastGameState == GSTATE_GAME_OVER) || (gLastGameState == GSTATE_ENDING)) {
if (gLastGameState == GSTATE_ENDING) {
gMissionPlanet[gMissionNumber] = PLANET_VENOM;
if (gLeveLClearStatus[LEVEL_VENOM_ANDROSS] == 1) {
gSaveFile.save.data.planet[SAVE_SLOT_VENOM_1].played = 1;
if (playedExpertMode) {
gSaveFile.save.data.planet[SAVE_SLOT_VENOM_1].expertClear = 1;
} else {
gSaveFile.save.data.planet[SAVE_SLOT_VENOM_1].normalClear = 1;
}
Save_Write();
} else if (gLeveLClearStatus[LEVEL_VENOM_ANDROSS] == 2) {
gMissionMedal[gMissionNumber] = 1;
gSaveFile.save.data.planet[SAVE_SLOT_VENOM_2].played = 1;
if (playedExpertMode) {
gSaveFile.save.data.planet[SAVE_SLOT_VENOM_2].expertClear = 1;
gSaveFile.save.data.planet[SAVE_SLOT_VENOM_2].expertMedal = 1;
} else {
gSaveFile.save.data.planet[SAVE_SLOT_VENOM_2].normalClear = 1;
gSaveFile.save.data.planet[SAVE_SLOT_VENOM_2].normalMedal = 1;
}
Save_Write();
}
}
Title_GetRankTotalHits();
sRankInPos = Option_RankInPos_Check();
if (sRankInPos != -1) {
sMenuEntryState = OPTION_NAME_ENTRY;
} else {
sMenuEntryState = OPTION_SCORE;
}
} else if (D_game_800D2870) {
sMainMenuCursor = OPTION_VERSUS;
sVsMenuCursor = gVsMatchType;
for (i = 0; i < ARRAY_COUNT(sOptionCardList); i++) {
if (i == OPTION_VERSUS) {
continue;
}
sOptionCardList[i].frame.xScale = 0.01f;
sOptionCardList[i].frame.yScale = 0.21f;
sOptionCardList[i].frame.y = sOptionCardPosY[i];
sOptionCardList[i].frame.x = 0.0f;
sOptionCardList[i].frame.z = 0.0f;
sOptionCardList[i].drawFrame = false;
sOptionCardList[i].tex.xScale = 0.01f;
sOptionCardList[i].tex.yScale = 1.0f;
sOptionCardList[i].tex.xPos = 158.0f;
sOptionCardList[i].tex.yPos = sOptionCardCurTextPosY[i];
sOptionCardList[i].drawTex = false;
}
sOptionCardList[OPTION_VERSUS].frame.x = 0.0f;
sOptionCardList[OPTION_VERSUS].frame.z = 0.0f;
sOptionCardList[OPTION_VERSUS].frame.y = 90.0f;
sOptionCardList[OPTION_VERSUS].frame.xScale = 0.4f;
sOptionCardList[OPTION_VERSUS].frame.yScale = 0.21f;
sOptionCardList[OPTION_VERSUS].drawFrame = true;
sOptionCardList[OPTION_VERSUS].tex.xScale = 1.0f;
sOptionCardList[OPTION_VERSUS].tex.yScale = 1.0f;
sOptionCardList[OPTION_VERSUS].tex.xPos = 145.0f;
sOptionCardList[OPTION_VERSUS].tex.yPos = 25.0f;
sOptionCardList[OPTION_VERSUS].drawTex = true;
sMenuEntryState = OPTION_VERSUS;
} else {
sMenuEntryState = OPTION_MAIN_MENU;
}
sMainMenuState = 0;
D_menu_801B9134 = 0;
D_menu_801B913C = 0;
gOptionMenuStatus = OPTION_UPDATE;
Memory_FreeAll();
gStarfieldX = SCREEN_WIDTH;
gStarfieldY = SCREEN_HEIGHT;
Play_GenerateStarfield();
gCsCamEyeX = 0.0f;
gCsCamEyeY = 0.0f;
gCsCamEyeZ = 10.0f;
gCsCamAtX = 0.0f;
gCsCamAtY = 0.0f;
gCsCamAtZ = 0.0f;
sArwingLightXrot = -80.0f;
sArwingLightYrot = 0.0f;
sArwingLightColR = 225;
sArwingLightColG = 225;
sArwingLightColB = 225;
sArwingLightAmbR = 30;
sArwingLightAmbG = 30;
sArwingLightAmbB = 30;
D_menu_801B91F8 = 0.1f;
D_menu_801B91F4 = -130.0f;
sRightArwingCursorYrot = 0.0f;
sLeftArwingCursorYrot = 0.0f;
sOkConfirmTimer = 0;
sMainMenuFromCancel = false;
sVsSubMenuFromCancel = false;
AUDIO_PLAY_BGM(NA_BGM_SELECT);
}
void Option_Main(void) {
#if 0 // Docs debug
{
RCP_SetupDL(&gMasterDisp, SETUPDL_83);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 0, 255);
Graphics_DisplaySmallNumber(80, 220, sVsSubMenuFromCancel);
}
#endif
if (D_menu_801B9178 > 0) {
D_menu_801B9178--;
}
if (D_menu_801B917C > 0) {
D_menu_801B917C--;
}
switch (gOptionMenuStatus) {
case OPTION_WAIT:
if (gNextGameStateTimer == 0) {
gOptionMenuStatus = OPTION_SETUP;
AUDIO_SET_SPEC(SFXCHAN_0, AUDIOSPEC_23);
}
break;
case OPTION_SETUP:
gDrawMode = DRAW_NONE;
Option_Setup();
break;
case OPTION_UPDATE:
gDrawMode = DRAW_OPTION;
Option_Entry_Update();
break;
}
gGameFrameCount++;
}
void Option_Entry_Update(void) {
switch (sMenuEntryState) {
case OPTION_MAIN_MENU:
Option_MainMenu_Update();
break;
case OPTION_MAP:
Option_Map_Update();
break;
case OPTION_TRAINING:
Option_Training_Update();
break;
case OPTION_VERSUS:
Option_Versus_Update();
break;
case OPTION_RANKING:
Option_Ranking_Update();
break;
case OPTION_SOUND:
Option_Sound_Update();
break;
case OPTION_DATA:
Option_Data_Update();
break;
case OPTION_EXPERT_SOUND:
Option_ExpertSound_Update();
break;
case OPTION_VERSUS_STAGE:
Option_VersusStage_Update();
break;
case OPTION_POINT_MATCH:
case OPTION_BR_MATCH:
case OPTION_TT_MATCH:
Option_VersusMenu_Update();
break;
case OPTION_NAME_ENTRY:
Option_NameEntry_Update();
break;
case OPTION_SCORE:
Option_Score_Update();
break;
case OPTION_INVOICE:
Option_Invoice_Update();
break;
}
if (sDrawCursor) {
sRightArwingCursorYrot += 3.8f;
sLeftArwingCursorYrot += 4.2f;
}
}
void Option_Entry_Draw(void) {
switch (sMenuEntryState) {
case OPTION_MAIN_MENU:
Option_MainMenu_Draw();
break;
case OPTION_VERSUS:
Option_Versus_Draw();
break;
case OPTION_RANKING:
Option_Ranking_Draw();
break;
case OPTION_SOUND:
Option_Sound_Draw();
break;
case OPTION_EXPERT_SOUND:
Option_ExpertSound_Draw();
break;
case OPTION_DATA:
Option_Data_Draw();
break;
case OPTION_VERSUS_STAGE:
Option_VersusStage_Draw();
break;
case OPTION_POINT_MATCH:
case OPTION_BR_MATCH:
case OPTION_TT_MATCH:
Option_VersusMenu_Draw();
break;
case OPTION_NAME_ENTRY:
Option_NameEntry_Draw();
break;
case OPTION_SCORE:
Option_Score_Draw();
break;
case OPTION_INVOICE:
Option_InvoiceDraw();
break;
}
if (sLevelStartState) {
Option_Menu_Push();
Wipe_Draw(WIPE_VERTICAL, sWipeHeight);
Matrix_Pop(&gGfxMatrix);
}
}
void Option_Entry_Setup(void) {
gBlurAlpha = 255;
sMainMenuState = 0;
switch (sMenuEntryState) {
case OPTION_MAP:
gDrawMode = DRAW_NONE;
break;
case OPTION_POINT_MATCH:
case OPTION_BR_MATCH:
case OPTION_TT_MATCH:
Option_VersusMenu_Setup();
break;
case OPTION_VERSUS_STAGE:
Option_VersusStage_Setup();
break;
case OPTION_RANKING:
Option_Ranking_Setup();
break;
case OPTION_SOUND:
Option_Sound_Setup();
break;
case OPTION_EXPERT_SOUND:
Option_ExpertSound_Setup();
break;
case OPTION_DATA:
Option_Data_Setup();
break;
}
}
// Initialize the Planet textures before any drawing occurs
void Option_PlanetTextures_Setup(void) {
s32 i;
D_menu_801B93E8 = 0;
D_menu_801B93EC = 0;
for (i = 0; i < (96 * 96); i++) {
// Planet Textures
gMapCorneriaTex[i] = 106;
gMapFortunaTex[i] = 84;
gMapAquasTex[i] = 75;
gMapVenomTex[i] = 81;
gMapTitaniaTex[i] = 55;
gMapKatinaTex[i] = 82;
gMapMacbethTex[i] = 68;
gMapZonessTex[i] = 52;
gMapVenomCloudTex[i] = 0;
}
for (i = 0; i < ARRAY_COUNT(gBSSMapPlanetTextures); i++) {
D_menu_801CD818[i] = 0.0f;
Map_Texture_Sphere(gBSSMapPlanetTextures[i], SEGMENTED_TO_VIRTUAL(gAssetMapPlanetTextures[i]),
&D_menu_801CD818[i]);
}
}
void Option_ScrollPlanetTexture(void) {
if (D_menu_801B93E8 == 5) {
Map_Texture_Sphere(gBSSMapPlanetTextures[8], SEGMENTED_TO_VIRTUAL(gAssetMapPlanetTextures[8]),
&D_menu_801CD818[8]);
D_menu_801B93E8 = 0;
} else {
D_menu_801B93E8++;
}
Map_Texture_Sphere(gBSSMapPlanetTextures[D_menu_801B93EC * 2],
SEGMENTED_TO_VIRTUAL(gAssetMapPlanetTextures[D_menu_801B93EC * 2]),
&D_menu_801CD818[D_menu_801B93EC * 2]);
Map_Texture_Sphere(gBSSMapPlanetTextures[(D_menu_801B93EC * 2) + 1],
SEGMENTED_TO_VIRTUAL(gAssetMapPlanetTextures[(D_menu_801B93EC * 2) + 1]),
&D_menu_801CD818[(D_menu_801B93EC * 2) + 1]);
D_menu_801B93EC++;
if (D_menu_801B93EC >= 4) {
D_menu_801B93EC = 0;
}
}
void Option_Map_Update(void) {
if (gFillScreenAlpha == 255) {
gStarCount = 0;
sMenuEntryState = 100;
gGameState = GSTATE_MAP;
gNextGameStateTimer = 2;
gMapState = 0;
gDrawMode = DRAW_NONE;
gControllerLock = 3;
} else {
gFillScreenAlpha += 32;
if (gFillScreenAlpha > 255) {
gFillScreenAlpha = 255;
}
}
}
void Option_Training_Update(void) {
if (gFillScreenAlpha == 255) {
gCurrentLevel = LEVEL_TRAINING;
gGameState = GSTATE_PLAY;
gNextGameStateTimer = 2;
gPlayState = PLAY_STANDBY;
gDrawMode = DRAW_NONE;
Play_Setup();
gSavedObjectLoadIndex = 0;
gSavedPathProgress = 0.0f;
D_ctx_8017782C = true;
gControllerLock = 3;
AUDIO_SET_SPEC(SFXCHAN_0, AUDIOSPEC_28);
} else {
gFillScreenAlpha += 32;
if (gFillScreenAlpha > 255) {
gFillScreenAlpha = 255;
}
}
}
void Option_MainMenu_Setup(void) {
s32 i;
D_game_800D2870 = false;
gBlurAlpha = 255;
gControllerLock = 0;
gStarCount = 800;
sVsSubMenuFromCancel = false;
if (!sMainMenuFromCancel) {
sDrawCursor = true;
for (i = 0; i < ARRAY_COUNT(sOptionCardList); i++) {
sOptionCardList[i].tex.xPos = sOptionCardCurTextPosX[i];
sOptionCardList[i].tex.yPos = sOptionCardCurTextPosY[i];
sOptionCardList[i].tex.xScale = 1.0f;
sOptionCardList[i].tex.yScale = 1.0f;
sOptionCardList[i].drawTex = true;
sOptionCardList[i].frame.xScale = 0.4f;
sOptionCardList[i].frame.yScale = 0.21f;
sOptionCardList[i].frame.y = sOptionCardPosY[i];
sOptionCardList[i].frame.z = 0.0f;
sOptionCardList[i].drawFrame = true;
}
} else {
sDrawCursor = false;
for (i = 0; i < ARRAY_COUNT(sOptionCardList); i++) {
sOptionCardList[i].tex.yScale = 1.0f;
sOptionCardList[i].frame.yScale = 0.21f;
sOptionCardList[i].frame.z = 0.0f;
sOptionCardList[i].drawFrame = true;
sOptionCardList[i].drawTex = true;
}
}
sLightningXpos = -45.0f;
D_menu_801B9214 = 0;
D_menu_801B9180.unk_0 = 0;
D_menu_801B9180.unk_4 = 0;
D_menu_801B9190.unk_0 = 0;
D_menu_801B9190.unk_4 = 0;
D_menu_801B9198.unk_0 = 0;
D_menu_801B9198.unk_4 = 0;
}
void Option_MainMenu_Update(void) {
s32 i;
f32 var_fs0;
f32 var_fs1;
switch (sMainMenuState) {
case 0:
Option_MainMenu_Setup();
if (!sMainMenuFromCancel) {
sMainMenuState++;
} else {
sOptionCardCurTextPosX[0] = D_menu_801AE5E8[sExpertModeCursor];
sOptionCardCurTextPosY[0] = D_menu_801AE5F0[sExpertModeCursor];
sOptionCardCurTextPosX[4] = D_menu_801AE5F8[sExpertSoundCursor];
sOptionCardCurTextPosY[4] = D_menu_801AE600[sExpertSoundCursor];
sMainMenuState = 1000;
}
break;
case 1000:
for (i = 0; i < ARRAY_COUNT(sOptionCardList); i++) {
if (sOptionCardList[i].frame.xScale < 0.4f) {
sOptionCardList[i].frame.xScale += 0.04f;
if (sOptionCardList[i].frame.xScale > 0.4f) {
sOptionCardList[i].frame.xScale = 0.4f;
}
}
if (sOptionCardList[i].tex.xScale < 1.0f) {
sOptionCardList[i].tex.xScale += 0.1f;
if (sOptionCardList[i].tex.xScale > 1.0f) {
sOptionCardList[i].tex.xScale = 1.0f;
}
}
Math_SmoothStepToF(&sOptionCardList[i].tex.yPos, sOptionCardCurTextPosY[i], 0.15f, 100.0f, 0.1f);
Math_SmoothStepToF(&sOptionCardList[i].frame.y, sOptionCardPosY[i], 0.15f, 100.0f, 0.1f);
Math_SmoothStepToF(&sOptionCardList[i].tex.xPos, sOptionCardCurTextPosX[i], 0.2f, D_menu_801AE620[i],
0.1f);
}
gBlurAlpha += 4;
if (sOptionCardList[sMainMenuCursor].frame.y == sOptionCardPosY[sMainMenuCursor]) {
for (i = 0; i < ARRAY_COUNT(sOptionCardList); i++) {
sOptionCardList[i].tex.xScale = 1.0f;
sOptionCardList[i].tex.xPos = sOptionCardCurTextPosX[i];
sOptionCardList[i].tex.yPos = sOptionCardCurTextPosY[i];
}
sDrawCursor = true;
gBlurAlpha = 255;
sMainMenuState = 1;
}
break;
case 1:
// clang-format off
if (Option_Input_MoveCursor_Y(&sMainMenuCursor, ARRAY_COUNT(sOptionCardList) - 1, 1, 0, 20, 5, 4, gMainController, &D_menu_801B9180)) { \
AUDIO_PLAY_SFX(NA_SE_ARWING_CURSOR, gDefaultSfxSource, 4);
}
// clang-format on
if ((sMainMenuCursor == OPTION_MAP) && sExpertModesEnabled &&
Option_Input_MoveCursor_Y(&sExpertModeCursor, 1, 0, 0, 20, 5, 4, gMainController, &D_menu_801B9190)) {
AUDIO_PLAY_SFX(NA_SE_ARWING_CURSOR, gDefaultSfxSource, 4);
if (sExpertModeCursor) {
sOptionCardList[OPTION_MAP].tex.texture = aExpertCardTex;
sOptionCardList[OPTION_MAP].tex.width = 80;
sOptionCardList[OPTION_MAP].tex.height = 12;
sOptionCardList[OPTION_MAP].tex.xPos = 125.0f;
sOptionCardList[OPTION_MAP].tex.yPos = 55.0f;
} else {
sOptionCardList[OPTION_MAP].tex.texture = aMainGameCardTex;
sOptionCardList[OPTION_MAP].tex.width = 72;
sOptionCardList[OPTION_MAP].tex.height = 12;
sOptionCardList[OPTION_MAP].tex.xPos = 124.0f;
sOptionCardList[OPTION_MAP].tex.yPos = 54.0f;
}
gExpertMode = sExpertModeCursor;
}
if ((sMainMenuCursor == OPTION_SOUND) && sExpertModesEnabled &&
Option_Input_MoveCursor_Y(&sExpertSoundCursor, 1, 0, 0, 20, 5, 4, gMainController, &D_menu_801B9198)) {
AUDIO_PLAY_SFX(NA_SE_ARWING_CURSOR, gDefaultSfxSource, 4);
if (sExpertSoundCursor) {
sOptionCardList[OPTION_SOUND].tex.texture = aExpertCardTex;
sOptionCardList[OPTION_SOUND].tex.width = 80;
sOptionCardList[OPTION_SOUND].tex.height = 12;
sOptionCardList[OPTION_SOUND].tex.xPos = 125.0f;
sOptionCardList[OPTION_SOUND].tex.yPos = 151.0f;
} else {
sOptionCardList[OPTION_SOUND].tex.texture = aSoundCardTex;
sOptionCardList[OPTION_SOUND].tex.width = 64;
sOptionCardList[OPTION_SOUND].tex.height = 10;
sOptionCardList[OPTION_SOUND].tex.xPos = 133.0f;
sOptionCardList[OPTION_SOUND].tex.yPos = 151.0f;
}
}
if (gControllerPress[gMainController].button & (A_BUTTON | START_BUTTON)) {
AUDIO_PLAY_SFX(NA_SE_ARWING_DECIDE, gDefaultSfxSource, 4);
sLightningYpos = sOptionCardPosY[sMainMenuCursor];
sDrawCursor = false;
sMainMenuState = 11;
}
if (gControllerPress[gMainController].button & B_BUTTON) {
AUDIO_PLAY_SFX(NA_SE_ARWING_CANCEL, gDefaultSfxSource, 4);
sWipeHeight = 0;
sLevelStartState = 1;
sMainMenuState = 100;
}
break;
case 11:
gBlurAlpha = 16;
D_menu_801B9178 = 3;
sOptionCardList[sMainMenuCursor].frame.xScale -= 0.01f;
sOptionCardList[sMainMenuCursor].frame.yScale -= 0.01f;
sOptionCardList[sMainMenuCursor].tex.xScale -= 0.1f;
sOptionCardList[sMainMenuCursor].tex.yScale -= 0.1f;
sOptionCardList[sMainMenuCursor].tex.xPos += 4.0f;
D_menu_801B917C = 3;
sMainMenuState++;
break;
case 12:
if (D_menu_801B9178 == 1) {
sOptionCardList[sMainMenuCursor].frame.xScale += 0.01f;
sOptionCardList[sMainMenuCursor].frame.yScale += 0.01f;
sOptionCardList[sMainMenuCursor].tex.xScale += 0.1f;
sOptionCardList[sMainMenuCursor].tex.yScale += 0.1f;
sOptionCardList[sMainMenuCursor].tex.xPos -= 4.0f;
D_menu_801B9214 = 1;
}
for (i = 0; i < ARRAY_COUNT(sOptionCardList); i++) {
if (i == sMainMenuCursor) {
continue;
}
if (sOptionCardList[i].frame.xScale > 0.01f) {
sOptionCardList[i].frame.xScale -= 0.05f;
sOptionCardList[i].tex.xScale -= 0.19f;
Math_SmoothStepToF(&sOptionCardList[i].tex.xPos, 158.0f, 0.2f, D_menu_801AE608[i], 0.1f);
} else {
sOptionCardList[i].drawFrame = false;
sOptionCardList[i].drawTex = false;
}
}
if (D_menu_801B917C == 0) {
var_fs0 = 25.0f;
var_fs1 = 90.0f;
if ((sMainMenuCursor == OPTION_MAP) || (sMainMenuCursor == OPTION_TRAINING)) {
var_fs0 = 0.0f;
var_fs1 = 120.0f;
}
Math_SmoothStepToF(&sOptionCardList[sMainMenuCursor].tex.yPos, var_fs0, 0.25f, 100.0f, 0.1f);
Math_SmoothStepToF(&sOptionCardList[sMainMenuCursor].frame.y, var_fs1, 0.25f, 100.0f, 0.1f);
gBlurAlpha += 4;
if ((sOptionCardList[sMainMenuCursor].tex.yPos == var_fs0) &&
(sOptionCardList[sMainMenuCursor].frame.y == var_fs1)) {
gBlurAlpha += 255;
sMenuEntryState = sMainMenuCursor;
if ((sMainMenuCursor == OPTION_SOUND) && sExpertSoundCursor) {
sMenuEntryState = OPTION_EXPERT_SOUND;
}
Option_Entry_Setup();
}
}
break;
case 100:
if (sWipeHeight < 120) {
sWipeHeight += 18;
} else {
gStarCount = 0;
gGameState = GSTATE_TITLE;
gNextGameStateTimer = 2;
gTitleState = 0;
gGoToTitle = true;
gDrawMode = DRAW_NONE;
sLevelStartState = 0;
sWipeHeight = 0;
gControllerLock = 3;
}
break;
}
}
void Option_MainMenu_Draw(void) {
s32 i;
Option_Menu_Push();
for (i = 0; i < ARRAY_COUNT(sOptionCardList); i++) {
if (sOptionCardList[i].drawFrame) {
Option_DrawMenuCard(sOptionCardList[i].frame);
}
}
Option_DrawMenuArwing(sOptionCardList[sMainMenuCursor].pos);
Matrix_Pop(&gGfxMatrix);
for (i = 0; i < ARRAY_COUNT(sOptionCardList); i++) {
if (!(sOptionCardList[i].drawTex) || (sOptionCardList[i].tex.xScale) <= 0.0f) {
continue;
}
if ((i == 0) && sExpertModesEnabled && ((sMainMenuState == 0) || (sMainMenuState == 1))) {
Option_VsSelectionArrows_Draw(106.0f, 56.0f, 98.0f, 20, 0, 75);
}
if ((i == 4) && sExpertModesEnabled && ((sMainMenuState == 0) || (sMainMenuState == 1))) {
Option_VsSelectionArrows_Draw(106.0f, 152.0f, 98.0f, 20, 0, 75);
}
Option_DrawCardLabel(sOptionCardList[i].tex);
}
Option_CardLightning_Update();
}
void Option_Versus_Setup(void) {
s32 i;
gBlurAlpha = 255;
gControllerLock = 0;
gStarCount = 800;
if (!sVsSubMenuFromCancel) {
sDrawCursor = true;
for (i = 0; i < ARRAY_COUNT(sOptionVSCardList); i++) {
sOptionVSCardList[i].tex.xPos = D_menu_801AEF90[i];
sOptionVSCardList[i].tex.yPos = D_menu_801AEF9C[i];
sOptionVSCardList[i].tex.xScale = 1.0f;
sOptionVSCardList[i].tex.yScale = 1.0f;
sOptionVSCardList[i].drawTex = true;
sOptionVSCardList[i].frame.xScale = 0.4f;
sOptionVSCardList[i].frame.yScale = 0.21f;
sOptionVSCardList[i].frame.y = D_menu_801AEF84[i];
sOptionVSCardList[i].frame.z = 0.0f;
sOptionVSCardList[i].drawFrame = true;
}
} else {
sDrawCursor = false;
for (i = 0; i < ARRAY_COUNT(sOptionVSCardList); i++) {
sOptionVSCardList[i].tex.yScale = 1.0f;
sOptionVSCardList[i].frame.yScale = 0.21f;
sOptionVSCardList[i].frame.z = 0.0f;
sOptionVSCardList[i].drawTex = true;
sOptionVSCardList[i].drawFrame = true;
}
}
sLightningXpos = -45.0f;
D_menu_801B9214 = 0;
D_menu_801B9188.unk_0 = 0;
D_menu_801B9188.unk_4 = 0;
}
void Option_Versus_Update(void) {
f32 var_fs0;
s32 i;
switch (sMainMenuState) {
case 0:
Option_Versus_Setup();
if (!sVsSubMenuFromCancel) {
sMainMenuState++;
} else {
sMainMenuState = 1000;
}
break;
case 1000:
for (i = 0; i < ARRAY_COUNT(sOptionVSCardList); i++) {
if (sOptionVSCardList[i].frame.xScale < 0.4f) {
sOptionVSCardList[i].frame.xScale += 0.04f;
if (sOptionVSCardList[i].frame.xScale > 0.4f) {
sOptionVSCardList[i].frame.xScale = 0.4f;
}
}
if (sOptionVSCardList[i].tex.xScale < 1.0f) {
sOptionVSCardList[i].tex.xScale += 0.15f;
if (sOptionVSCardList[i].tex.xScale > 1.0f) {
sOptionVSCardList[i].tex.xScale = 1.0f;
}
}
Math_SmoothStepToF(&sOptionVSCardList[i].frame.y, D_menu_801AEF84[i], 0.15f, 100.0f, 0.1f);
Math_SmoothStepToF(&sOptionVSCardList[i].tex.xPos, D_menu_801AEF90[i], 0.2f, 3.1f, 0.1f);
Math_SmoothStepToF(&sOptionVSCardList[i].tex.yPos, D_menu_801AEF9C[i], 0.15f, 100.0f, 0.1f);
}
Math_SmoothStepToF(&sOptionCardList[sMainMenuCursor].tex.yPos, 25.0f, 0.25f, 100.0f, 0.1f);
Math_SmoothStepToF(&sOptionCardList[sMainMenuCursor].frame.y, 90.0f, 0.25f, 100.0f, 0.1f);
gBlurAlpha += 4;
if (sOptionVSCardList[sVsMenuCursor].frame.y == D_menu_801AEF84[sVsMenuCursor]) {
for (i = 0; i < ARRAY_COUNT(sOptionVSCardList); i++) {
sOptionVSCardList[i].tex.xScale = 1.0f;
sOptionVSCardList[i].tex.yPos = D_menu_801AEF9C[i];
sOptionVSCardList[i].tex.xPos = D_menu_801AEF90[i];
}
sOptionCardList[sMainMenuCursor].tex.yPos = 25.0f;
sOptionCardList[sMainMenuCursor].frame.y = 90.0f;
sDrawCursor = true;
gBlurAlpha = 255;
sMainMenuState = 1;
}
break;
case 1:
// clang-format off
if (Option_Input_MoveCursor_Y(&sVsMenuCursor, 2, 1, 0, 20, 5, 4, gMainController, &D_menu_801B9188)) {\
AUDIO_PLAY_SFX(NA_SE_ARWING_CURSOR, gDefaultSfxSource, 4);\
}
// clang-format on
if (gControllerPress[gMainController].button & (A_BUTTON | START_BUTTON)) {
AUDIO_PLAY_SFX(NA_SE_ARWING_DECIDE, gDefaultSfxSource, 4);
sLightningYpos = D_menu_801AEF84[sVsMenuCursor];
sDrawCursor = false;
sMainMenuState = 11;
}
if (gControllerPress[gMainController].button & B_BUTTON) {
AUDIO_PLAY_SFX(NA_SE_ARWING_CANCEL, gDefaultSfxSource, 4);
sMainMenuState = 0;
sMenuEntryState = OPTION_MAIN_MENU;
gDrawMode = DRAW_NONE;
sMainMenuFromCancel = true;
}
break;
case 11:
gBlurAlpha = 16;
D_menu_801B9178 = 5;
sOptionVSCardList[sVsMenuCursor].frame.xScale -= 0.01f;
sOptionVSCardList[sVsMenuCursor].frame.yScale -= 0.01f;
sOptionVSCardList[sVsMenuCursor].tex.xScale -= 0.1f;
sOptionVSCardList[sVsMenuCursor].tex.yScale -= 0.1f;
sOptionVSCardList[sVsMenuCursor].tex.xPos += 4.0f;
D_menu_801B917C = 5;
sMainMenuState++;
break;
case 12:
if (D_menu_801B9178 == 1) {
sOptionVSCardList[sVsMenuCursor].frame.xScale += 0.01f;
sOptionVSCardList[sVsMenuCursor].frame.yScale += 0.01f;
sOptionVSCardList[sVsMenuCursor].tex.xScale += 0.1f;
sOptionVSCardList[sVsMenuCursor].tex.yScale += 0.1f;
sOptionVSCardList[sVsMenuCursor].tex.xPos -= 4.0f;
D_menu_801B9214 = 1;
}
for (i = 0; i < ARRAY_COUNT(sOptionVSCardList); i++) {
if (i == sVsMenuCursor) {
continue;
}
if (sOptionVSCardList[i].frame.xScale > 0.01f) {
sOptionVSCardList[i].frame.xScale -= 0.05f;
sOptionVSCardList[i].tex.xScale -= 0.19f;
Math_SmoothStepToF(&sOptionVSCardList[i].tex.xPos, 158.0f, 0.2f, D_menu_801AE608[i + 1], 0.1f);
} else {
sOptionVSCardList[i].drawFrame = false;
sOptionVSCardList[i].drawTex = false;
}
}
if (D_menu_801B917C == 0) {
if (sVsMenuCursor == 0) {
var_fs0 = 129.0f;
} else {
var_fs0 = 131.0f;
}
Math_SmoothStepToF(&sOptionVSCardList[sVsMenuCursor].tex.yPos, var_fs0, 0.25f, 100.0f, 0.1f);
Math_SmoothStepToF(&sOptionVSCardList[sVsMenuCursor].frame.y, -15.5f, 0.25f, 100.0f, 0.1f);
Math_SmoothStepToF(&sOptionCardList[sMainMenuCursor].tex.yPos, -10.0f, 0.35f, 100.0f, 0.1f);
Math_SmoothStepToF(&sOptionCardList[sMainMenuCursor].frame.y, 150.0f, 0.35f, 100.0f, 0.1f);
gBlurAlpha += 4;
if ((var_fs0 == sOptionVSCardList[sVsMenuCursor].tex.yPos) &&
(sOptionVSCardList[sVsMenuCursor].frame.y == -15.5f)) {
gBlurAlpha += 255;
sMenuEntryState = (sVsMenuCursor + 1) * 10;
gVsMatchType = sVsMenuCursor;
D_menu_801B91C4 = 1;
Option_Entry_Setup();
}
}
break;
}
}
void Option_Versus_Draw(void) {
s32 i;
Option_DrawMenuLabel();
Option_Menu_Push();
for (i = 0; i < ARRAY_COUNT(sOptionVSCardList); i++) {
if (sOptionVSCardList[i].drawFrame) {
Option_DrawMenuCard(sOptionVSCardList[i].frame);
}
}
Option_DrawMenuArwing(sOptionVSCardList[sVsMenuCursor].pos);
Matrix_Pop(&gGfxMatrix);
for (i = 0; i < ARRAY_COUNT(sOptionVSCardList); i++) {
if ((sOptionVSCardList[i].drawTex) && !(sOptionVSCardList[i].tex.xScale <= 0.0f)) {
Option_DrawCardLabel(sOptionVSCardList[i].tex);
}
}
Option_CardLightning_Update();
}
void Option_Sound_Setup(void) {
s32 i;
gStarCount = 800;
D_menu_801B91B4 = 0;
D_menu_801B91B8 = 0;
sDrawCursor = true;
D_menu_801B91A0 = 0;
gOptionSoundMode = gSaveFile.save.data.soundMode;
SEQCMD_SET_SOUND_MODE(sSoundMode[gOptionSoundMode]);
gVolumeSettings[AUDIO_TYPE_MUSIC] = gSaveFile.save.data.musicVolume;
gVolumeSettings[AUDIO_TYPE_VOICE] = gSaveFile.save.data.voiceVolume;
gVolumeSettings[AUDIO_TYPE_SFX] = gSaveFile.save.data.sfxVolume;
if (gVolumeSettings[AUDIO_TYPE_MUSIC] > 99) {
gVolumeSettings[AUDIO_TYPE_MUSIC] = 99;
}
if (gVolumeSettings[AUDIO_TYPE_VOICE] > 99) {
gVolumeSettings[AUDIO_TYPE_VOICE] = 99;
}
if (gVolumeSettings[AUDIO_TYPE_SFX] > 99) {
gVolumeSettings[AUDIO_TYPE_SFX] = 99;
}
Audio_SetVolume(AUDIO_TYPE_MUSIC, gVolumeSettings[AUDIO_TYPE_MUSIC]);
Audio_SetVolume(AUDIO_TYPE_VOICE, gVolumeSettings[AUDIO_TYPE_VOICE]);
Audio_SetVolume(AUDIO_TYPE_SFX, gVolumeSettings[AUDIO_TYPE_SFX]);
D_menu_801AEB48[0].xPos = gVolumeSettings[AUDIO_TYPE_MUSIC] + 146.0f;
D_menu_801AEB48[1].xPos = gVolumeSettings[AUDIO_TYPE_VOICE] + 146.0f;
D_menu_801AEB48[2].xPos = gVolumeSettings[AUDIO_TYPE_SFX] + 146.0f;
D_menu_801B9288 = 0;
D_menu_801B9284 = 0;
D_menu_801B914C = 0;
D_menu_801B9158 = 0;
D_menu_801B9178 = 0;
D_menu_801B917C = 0;
// clang-format off
for (i = 0; i < ARRAY_COUNT(D_menu_801B9270); i++) { D_menu_801B9270[i] = 255.0f; }
// clang-format on
D_menu_801B91E4 = 255.0f;
D_menu_801B9218 = 56.0f;
D_menu_801B921C = -43.0f;
D_menu_801B9220 = 0.0f;
D_menu_801B9250.unk_0 = 0;
D_menu_801B9250.unk_4 = 0;
D_menu_801B9258.unk_0 = 0;
D_menu_801B9258.unk_4 = 0;
D_menu_801B9260.unk_0 = 0;
D_menu_801B9260.unk_4 = 0;
D_menu_801B9268.unk_0 = 0;
D_menu_801B9268.unk_4 = 0;
}
void Option_Sound_Update(void) {
s32 sp34 = D_menu_801B9288;
if (Option_Input_MoveCursor_Y(&D_menu_801B9288, 3, 1, 0, 20, 5, 4, gMainController, &D_menu_801B9250)) {
D_menu_801B9270[sp34] = 255.0f;
AUDIO_PLAY_SFX(NA_SE_CURSOR, gDefaultSfxSource, 4);
}
if (D_menu_801B9288 == 0) {
Option_Sound_SetSoundMode();
} else {
Option_Sound_SetVolumeLevels();
}
// Test sound
if (gControllerPress[gMainController].button & R_TRIG) {
D_menu_801B9284 ^= 1;
Audio_PlaySoundTest(D_menu_801B9284);
}
if (gControllerPress[gMainController].button & A_BUTTON) {
AUDIO_PLAY_SFX(NA_SE_DECIDE, gDefaultSfxSource, 4);
D_menu_801B9288 = (D_menu_801B9288 + 1) % 4U;
}
if (gControllerPress[gMainController].button & B_BUTTON) {
AUDIO_PLAY_SFX(NA_SE_ARWING_CANCEL, gDefaultSfxSource, 4);
if (D_menu_801B9284 == 1) {
D_menu_801B9284 = 0;
Audio_PlaySoundTest(D_menu_801B9284);
}
Save_Write();
gDrawMode = DRAW_NONE;
sMenuEntryState = OPTION_MAIN_MENU;
sMainMenuState = 0;
sMainMenuFromCancel = true;
}
}
void Option_Sound_SetSoundMode(void) {
s32 sp3C = gOptionSoundMode;
s32 pad;
if (Option_Input_MoveCursor_Y(&sp3C, 2, 0, 0, 20, 5, 4, gMainController, &D_menu_801B9260)) {
AUDIO_PLAY_SFX(NA_SE_CURSOR, gDefaultSfxSource, 4);
gOptionSoundMode = sp3C;
if (gOptionSoundMode >= OPTIONSOUND_MAX) {
gOptionSoundMode = OPTIONSOUND_STEREO;
}
gSaveFile.save.data.soundMode = gOptionSoundMode;
SEQCMD_SET_SOUND_MODE(sSoundMode[gOptionSoundMode]);
}
}
void Option_Sound_SetVolumeLevels(void) {
s32 var_v1;
D_menu_801B924C = D_menu_801AE99C[D_menu_801B9288 - 1];
if (Option_Input_Sound_X(&(D_menu_801AEB48[D_menu_801B9288 - 1].xPos), 146.0f, 245.0f, &D_menu_801B9268)) {
var_v1 = D_menu_801AEB48[D_menu_801B9288 - 1].xPos - 146.0f;
gVolumeSettings[D_menu_801B9288 - 1] = var_v1;
if (var_v1 > 99) {
var_v1 = 99;
}
switch (D_menu_801B9288 - 1) {
case 0:
gSaveFile.save.data.musicVolume = var_v1;
CVarSetFloat("gMainMusicVolume", var_v1 / 100.0f);
break;
case 1:
gSaveFile.save.data.voiceVolume = var_v1;
CVarSetFloat("gVoiceVolume", var_v1 / 100.0f);
break;
case 2:
gSaveFile.save.data.sfxVolume = var_v1;
CVarSetFloat("gSFXMusicVolume", var_v1 / 100.0f);
break;
}
Audio_SetVolume(D_menu_801B924C, var_v1);
}
}
void Option_Sound_Draw(void) {
s32 i;
s32 colorGB;
static f32 D_menu_801AEFA8[11] = {
48.0f, 103.0f, 77.0f, 55.0f, 71.0f, 87.0f, 143.0f, 244.0f, 169.0f, 170.0f, 157.0f
};
static f32 D_menu_801AEFD4[11] = {
79.0f, 52.0f, 99.0f, 131.0f, 157.0f, 186.0f, 102.0f, 102.0f, 98.0f, 99.0f, 98.0f
};
static f32 D_menu_801AF000 = 27.5f;
Option_DrawMenuLabel();
Option_Sound_Speaker_Draw();
RCP_SetupDL(&gMasterDisp, SETUPDL_76);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, 255);
Lib_TextureRect_RGBA16(&gMasterDisp, aMapWhiteSquareTex, 8, 8, D_menu_801AEFA8[0], D_menu_801AEFD4[0],
D_menu_801AF000, 0.2f);
RCP_SetupDL(&gMasterDisp, SETUPDL_83);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, 255);
Lib_TextureRect_IA8(&gMasterDisp, D_OPT_8005CD0, 112, 13, D_menu_801AEFA8[1], D_menu_801AEFD4[1], 1.0f, 1.0f);
for (i = 0; i < 4; i++) {
if (D_menu_801B9288 == i) {
Option_Color_FlashRed(&D_menu_801B9270[i]);
} else {
D_menu_801B9270[i] = 255.0f;
}
}
colorGB = D_menu_801B9270[0];
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, colorGB, colorGB, 255);
Lib_TextureRect_IA8(&gMasterDisp, D_OPT_8006280, 48, 13, D_menu_801AEFA8[2], D_menu_801AEFD4[2], 1.0f, 1.0f);
colorGB = D_menu_801B9270[1];
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, colorGB, colorGB, 255);
Lib_TextureRect_IA8(&gMasterDisp, D_OPT_80064F0, 88, 14, D_menu_801AEFA8[3], D_menu_801AEFD4[3], 1.0f, 1.0f);
colorGB = D_menu_801B9270[2];
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, colorGB, colorGB, 255);
Lib_TextureRect_IA8(&gMasterDisp, D_OPT_80069C0, 56, 15, D_menu_801AEFA8[4], D_menu_801AEFD4[4], 1.0f, 1.0f);
colorGB = D_menu_801B9270[3];
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, colorGB, colorGB, 255);
Lib_TextureRect_IA8(&gMasterDisp, D_OPT_8006D10, 24, 13, D_menu_801AEFA8[5], D_menu_801AEFD4[5], 1.0f, 1.0f);
if (D_menu_801B9288 == 0) {
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, 255);
Lib_TextureRect_IA8_MirX(&gMasterDisp, aArrowTex, 8, 8, D_menu_801AEFA8[6], D_menu_801AEFD4[6], 1.0f, 1.0f);
Lib_TextureRect_IA8(&gMasterDisp, aArrowTex, 8, 8, D_menu_801AEFA8[7], D_menu_801AEFD4[7], 1.0f, 1.0f);
}
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, 255);
switch (gOptionSoundMode) {
case OPTIONSOUND_STEREO:
Lib_TextureRect_IA8(&gMasterDisp, D_OPT_800CD90, 56, 13, D_menu_801AEFA8[8], D_menu_801AEFD4[8], 1.0f,
1.0f);
break;
case OPTIONSOUND_MONO:
Lib_TextureRect_IA8(&gMasterDisp, D_OPT_80076E0, 56, 14, D_menu_801AEFA8[9], D_menu_801AEFD4[9], 1.0f,
1.0f);
break;
case OPTIONSOUND_HEADSET:
Lib_TextureRect_IA8(&gMasterDisp, D_OPT_8007210, 88, 14, D_menu_801AEFA8[10], D_menu_801AEFD4[10], 1.0f,
1.0f);
break;
}
Lib_TextureRect_IA8(&gMasterDisp, aBtoCancelTex, 96, 10, 166.0f, 213.0f, 1.0f, 1.0f);
for (i = 0; i < ARRAY_COUNT(D_menu_801AEAA0); i++) {
Option_DrawCardLabel(D_menu_801AEAA0[i]);
Option_DrawCardLabel(D_menu_801AEB48[i]);
}
}
void Option_Sound_Speaker_Draw(void) {
s32 i;
if (D_menu_801B9284 == 1) {
switch (D_menu_801B914C) {
case 0:
D_menu_801B914C++;
break;
case 1:
if (D_menu_801B9178 != 0) {
break; // looks fake, but isn't
}
for (i = 2; i < ARRAY_COUNT(D_menu_801AE9C0); i++) {
D_menu_801AE9C0[i].xScale += 0.02f;
D_menu_801AE9C0[i].yScale += 0.02f;
D_menu_801AE9C0[i].xPos -= 0.1f;
}
D_menu_801B9178 = 2;
D_menu_801B914C++;
break;
case 2:
if (D_menu_801B9178 == 0) {
for (i = 2; i < ARRAY_COUNT(D_menu_801AE9C0); i++) {
D_menu_801AE9C0[i].xScale -= 0.02f;
D_menu_801AE9C0[i].yScale -= 0.02f;
D_menu_801AE9C0[i].xPos += 0.1f;
}
D_menu_801B914C++;
}
break;
case 3:
D_menu_801B9178 = RAND_INT(15.0f);
D_menu_801B914C = 1;
break;
}
switch (D_menu_801B9158) {
case 0:
if (D_menu_801B917C == 0) {
for (i = 0; i < ARRAY_COUNT(D_menu_801AE9C0); i++) {
D_menu_801AE9C0[i].xScale += 0.08f;
D_menu_801AE9C0[i].yScale += 0.08f;
D_menu_801AE9C0[i].xPos -= 0.4f;
D_menu_801AE9C0[i].yPos -= 0.4f;
}
D_menu_801B917C = 2;
D_menu_801B9158++;
}
break;
case 1:
if (D_menu_801B917C == 0) {
for (i = 0; i < ARRAY_COUNT(D_menu_801AE9C0); i++) {
D_menu_801AE9C0[i].xScale -= 0.08f;
D_menu_801AE9C0[i].yScale -= 0.08f;
D_menu_801AE9C0[i].xPos += 0.4f;
D_menu_801AE9C0[i].yPos += 0.4f;
}
D_menu_801B917C = 2;
D_menu_801B9158++;
}
break;
case 2:
if (D_menu_801B917C == 0) {
D_menu_801B917C = RAND_INT(30.0f);
D_menu_801B9158 = 0;
}
break;
}
} else {
for (i = 0; i < ARRAY_COUNT(D_menu_801AE9C0); i++) {
D_menu_801AE9C0[i].xScale = 1.0f;
D_menu_801AE9C0[i].yScale = 1.0f;
D_menu_801AE9C0[i].xPos = D_menu_801AE9A0[i];
D_menu_801AE9C0[i].yPos = D_menu_801AE9B0[i];
}
}
for (i = 0; i < 2; i++) {
Option_DrawCardLabel(D_menu_801AE9C0[i]);
}
for (i = 2; i < ARRAY_COUNT(D_menu_801AE9C0); i++) {
if (D_menu_801B914C != 3) {
Option_DrawCardLabel(D_menu_801AE9C0[i]);
}
}
}
void Option_ExpertSound_Setup(void) {
s32 i;
gStarCount = 800;
D_menu_801B931C = 0;
D_menu_801B9290.unk_0 = 0;
D_menu_801B9290.unk_4 = 0;
sSpectrumAnalyzerMode = 0;
sMusicPlaying = false;
// clang-format off
for (i = 0; i < ARRAY_COUNT(D_menu_801B9298); i++) { D_menu_801B9298[i] = 0.0f; }
// clang-format on
}
#include "../../mods/sfxjukebox2.c"
// Expert Sound Options
void Option_ExpertSound_Update(void) {
s32 pad;
f32 sp28 = D_menu_801B931C;
if (CVarGetInteger("gSfxJukebox", 0) == 1) {
if (gControllerPress[gMainController].button & L_TRIG) {
showJukebox ^= 1;
}
if (showJukebox) {
Jukebox_Update();
return;
}
}
if (Option_Input_Sound_X(&sp28, 0.0f, 49.0f, &D_menu_801B9290) != 0) {
AUDIO_PLAY_SFX(NA_SE_CURSOR, gDefaultSfxSource, 4);
D_menu_801B931C = sp28;
}
if (gControllerPress[gMainController].button & A_BUTTON) {
Audio_PlaySoundTestTrack(D_menu_801B931C);
sMusicPlaying = true;
}
if (gControllerPress[gMainController].button & B_BUTTON) {
if (!sMusicPlaying) {
AUDIO_PLAY_SFX(NA_SE_ARWING_CANCEL, gDefaultSfxSource, 4);
AUDIO_PLAY_BGM(NA_BGM_SELECT);
gDrawMode = DRAW_NONE;
sMenuEntryState = OPTION_MAIN_MENU;
sMainMenuState = 0;
sMainMenuFromCancel = true;
} else {
AUDIO_PLAY_SFX(NA_SE_CANCEL, gDefaultSfxSource, 4);
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM, 1);
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_FANFARE, 1);
sMusicPlaying = false;
}
}
// Spectrum Analyzer mode selector
if (gControllerPress[gMainController].button & R_CBUTTONS) {
sSpectrumAnalyzerMode++;
if (sSpectrumAnalyzerMode > 2) {
sSpectrumAnalyzerMode = 0;
}
}
}
void Option_ExpertSound_Draw(void) {
u8* temp_v0_4;
f32 var_fs0;
f32 var_fv1;
s32 i;
f32 r;
f32 g;
f32 b;
static f32 D_menu_801AF004 = -125.0f;
static f32 D_menu_801AF008 = 0.0f;
static f32 D_menu_801AF00C = 2.0f;
static f32 D_menu_801AF010 = 8.0f;
static f32 D_menu_801AF014[4] = { 30.0f, 30.0f, 28.0f, 288.0f };
static f32 D_menu_801AF024[4] = { 125.0f, 197.0f, 125.0f, 125.0f };
static f32 D_menu_801AF034[4] = { 32.3f, 32.3f, 0.2f, 0.2f };
static f32 D_menu_801AF044[4] = { 0.2f, 0.2f, 9.2f, 9.2f };
static f32 D_menu_801AF054 = 255.0f;
static f32 D_menu_801AF058 = 100.0f;
static f32 D_menu_801AF05C = 255.0f;
static f32 D_menu_801AF060 = 100.0f;
static f32 D_menu_801AF064 = 255.0f;
static f32 D_menu_801AF068 = 100.0f;
static Gfx* D_menu_801AF06C[] = {
D_menu_801AEC30,
D_menu_801AEC88,
D_menu_801AECE0,
};
static f32 D_menu_801AF078[] = { -73.0f, -13.0f, -43.0f };
Option_DrawMenuLabel();
#if MODS_SFX_JUKEBOX == 1
if (!showJukebox) {
#endif
RCP_SetupDL(&gMasterDisp, SETUPDL_83);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, 255);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, 255);
Lib_TextureRect_IA8(&gMasterDisp, D_OPT_80079F0, 128, 14, 49.0f, 81.0f, 1.0f, 1.0f);
Lib_TextureRect_IA8(&gMasterDisp, D_menu_801AECF8[D_menu_801B931C / 10], 16, 15, 230.0f, 82.0f, 1.0f, 1.0f);
Lib_TextureRect_IA8(&gMasterDisp, D_menu_801AECF8[D_menu_801B931C % 10], 16, 15, 244.0f, 82.0f, 1.0f, 1.0f);
#if MODS_SFX_JUKEBOX == 1
}
#endif
Option_AcceptCancel_Draw();
RCP_SetupDL(&gMasterDisp, SETUPDL_76);
gDPSetPrimColor(gMasterDisp++, 0, 0, 50, 50, 200, 255);
for (i = 0; i < 4; i++) {
Lib_TextureRect_RGBA16(&gMasterDisp, aMapWhiteSquareTex, 8, 8, D_menu_801AF014[i], D_menu_801AF024[i],
D_menu_801AF034[i], D_menu_801AF044[i]);
}
if (sMusicPlaying) {
temp_v0_4 = Audio_UpdateFrequencyAnalysis();
var_fv1 = 60.0f;
if (sSpectrumAnalyzerMode == 2) {
var_fv1 = 30.0f;
}
for (i = 0; i < ARRAY_COUNT(D_menu_801B9298); i++) {
if ((sSpectrumAnalyzerMode == 0) || (sSpectrumAnalyzerMode == 2)) {
D_menu_801B9298[i] = (var_fv1 / 255.0f) * temp_v0_4[i];
} else {
D_menu_801B9298[i] = var_fv1 - ((var_fv1 / 255.0f) * temp_v0_4[i]);
}
}
} else {
for (i = 0; i < ARRAY_COUNT(D_menu_801B9298); i++) {
Math_SmoothStepToF(&D_menu_801B9298[i], 0.0f, 0.2f, 100.0f, 0.1f);
}
}
Lib_InitOrtho(&gMasterDisp);
RCP_SetupDL(&gMasterDisp, SETUPDL_5);
Matrix_Push(&gGfxMatrix);
Matrix_LookAt(gGfxMatrix, 0.0f, 0.0f, 100.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, MTXF_APPLY);
Matrix_SetGfxMtx(&gMasterDisp);
for (var_fs0 = D_menu_801AF004, i = 0; i < ARRAY_COUNT(D_menu_801B9298); i++, var_fs0 += D_menu_801AF010) {
r = D_menu_801AF054 + ((D_menu_801AF060 - D_menu_801AF054) / 31.0f) * i;
g = D_menu_801AF058 + ((D_menu_801AF064 - D_menu_801AF058) / 31.0f) * i;
b = D_menu_801AF05C + ((D_menu_801AF068 - D_menu_801AF05C) / 31.0f) * i;
gDPSetPrimColor(gMasterDisp++, 0, 0, (s32) r, (s32) g, (s32) b, 255);
Matrix_Push(&gGfxMatrix);
Matrix_Translate(gGfxMatrix, var_fs0, D_menu_801AF078[sSpectrumAnalyzerMode], D_menu_801AF008, MTXF_APPLY);
Matrix_Scale(gGfxMatrix, D_menu_801AF00C, D_menu_801B9298[i], 1.0f, MTXF_APPLY);
Matrix_SetGfxMtx(&gMasterDisp);
gSPDisplayList(gMasterDisp++, D_menu_801AF06C[sSpectrumAnalyzerMode]);
Matrix_Pop(&gGfxMatrix);
}
Matrix_Pop(&gGfxMatrix);
Lib_InitPerspective(&gMasterDisp);
}
void Option_Data_Setup(void) {
gStarCount = 800;
D_menu_801B91E4 = 255.0f;
D_menu_801B9330[0] = 0;
D_menu_801B9330[1] = 0;
D_menu_801B91C0 = 0;
D_menu_801B91CC = 0;
}
void Option_Data_Update(void) {
f32 temp_fv0;
s32 i;
switch (sMainMenuState) {
case 0:
Option_Data_Select();
break;
case 2:
if (D_menu_801B9330[D_menu_801B91C0] != 0) {
break; // looks fake, but isn't
}
D_menu_801B91CC = 0;
D_menu_801B91C0 = 0;
sMainMenuState = 0;
break;
case 3:
if (D_menu_801B9330[D_menu_801B91C0] == 0) {
gDrawMode = DRAW_NONE;
sMenuEntryState = OPTION_MAIN_MENU;
sMainMenuState = 0;
sMainMenuFromCancel = true;
}
break;
case 4:
if (D_menu_801B9330[D_menu_801B91C0] == 0) {
switch (D_menu_801B91CC) {
case 0:
D_menu_801B91CC = 1;
D_menu_801B91C0 = 0;
sMainMenuState = 0;
break;
case 1:
D_menu_801B91CC = 2;
AUDIO_PLAY_SFX(NA_SE_BACKUP_CLEAR, gDefaultSfxSource, 4);
D_ctx_801779A8[gMainController] = 50.0f;
D_ctx_80177990[gMainController] = 0;
break;
case 2:
D_ctx_80177990[gMainController] += (s32) D_ctx_801779A8[gMainController];
temp_fv0 = Math_SmoothStepToF(&D_ctx_801779A8[gMainController], 100.0f, 0.05f, 100.0f, 0.1f);
if (D_ctx_80177990[gMainController] >= 100) {
D_ctx_80177990[gMainController] -= 100;
gControllerRumbleFlags[gMainController] = 1;
}
if (temp_fv0 == 0.0f) {
D_menu_801B91CC = 3;
gSaveFile = *(SaveFile*) &gDefaultSave;
Save_Write();
sExpertSoundCursor = 0;
sExpertModeCursor = 0;
sExpertModesEnabled = false;
gExpertMode = false;
sOptionCardList[OPTION_MAP].tex.texture = aMainGameCardTex;
sOptionCardList[OPTION_MAP].tex.width = 72;
sOptionCardList[OPTION_MAP].tex.height = 12;
sOptionCardList[OPTION_SOUND].tex.texture = aSoundCardTex;
sOptionCardList[OPTION_SOUND].tex.width = 64;
sOptionCardList[OPTION_SOUND].tex.height = 10;
for (i = 0; i < ARRAY_COUNT(sOptionCardList); i++) {
sOptionCardCurTextPosX[i] = sOptionCardTextPosX[i];
sOptionCardCurTextPosY[i] = sOptionCardTextPosY[i];
}
Title_GetRankTotalHits();
}
break;
case 3:
sMainMenuState = 0;
break;
}
}
break;
}
}
void Option_Data_Select(void) {
if ((D_menu_801B91CC == 0) || (D_menu_801B91CC == 1)) {
if (Option_Input_DataSelect_X(&D_menu_801B91C0) != 0) {
AUDIO_PLAY_SFX(NA_SE_CURSOR, gDefaultSfxSource, 4);
}
if (1) {}
}
if (gControllerPress[gMainController].button & A_BUTTON) {
if (D_menu_801B91CC == 3) {
AUDIO_PLAY_SFX(NA_SE_ARWING_CANCEL, gDefaultSfxSource, 4);
sMainMenuState = 3;
} else {
D_menu_801B9330[D_menu_801B91C0] = 10;
if (D_menu_801B91C0 == 0) {
if (D_menu_801B91CC == 1) {
AUDIO_PLAY_SFX(NA_SE_DECIDE, gDefaultSfxSource, 4);
sMainMenuState = 2;
} else {
AUDIO_PLAY_SFX(NA_SE_ARWING_CANCEL, gDefaultSfxSource, 4);
sMainMenuState = 3;
}
} else {
AUDIO_PLAY_SFX(NA_SE_DECIDE, gDefaultSfxSource, 4);
sMainMenuState = 4;
}
}
} else if (gControllerPress[gMainController].button & B_BUTTON) {
if (D_menu_801B91CC == 1) {
AUDIO_PLAY_SFX(NA_SE_CANCEL, gDefaultSfxSource, 4);
sMainMenuState = 2;
} else {
AUDIO_PLAY_SFX(NA_SE_ARWING_CANCEL, gDefaultSfxSource, 4);
sMainMenuState = 3;
}
}
}
void Option_Data_Draw(void) {
s32 i;
s32 sp7C[2];
s32 mask[2];
static f32 D_menu_801AF084[2] = { 172.0f, 76.0f };
static f32 D_menu_801AF08C[2] = { 228.0f, 121.0f };
static f32 D_menu_801AF094[6] = { 72.0f, 88.0f, 185.0f, 80.0f, 84.0f, 88.0f };
static f32 D_menu_801AF0AC[6] = { 53.0f, 137.0f, 137.0f, 90.0f, 80.0f, 97.0f };
Option_DrawMenuLabel();
RCP_SetupDL(&gMasterDisp, SETUPDL_83);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, 255);
for (i = 0; i < 2; i++) {
Lib_TextureRect_IA8(&gMasterDisp, D_OPT_80084B0 + (176 * 4 * i), 176, 4, D_menu_801AF094[0],
D_menu_801AF0AC[0] + (4.0f * i), 1.0f, 1.0f);
}
Lib_TextureRect_IA8(&gMasterDisp, D_OPT_80084B0 + 176 * 4 * 2, 176, 5, D_menu_801AF094[0],
D_menu_801AF0AC[0] + 8.0f, 1.0f, 1.0f);
if (D_menu_801B91CC < 2) {
Lib_TextureRect_IA8_MirX(&gMasterDisp, aArrowTex, 8, 8, D_menu_801AF084[D_menu_801B91C0], 140.0f, 1.0f, 1.0f);
Lib_TextureRect_IA8(&gMasterDisp, aArrowTex, 8, 8, D_menu_801AF08C[D_menu_801B91C0], 140.0f, 1.0f, 1.0f);
Option_Color_FlashRed(&D_menu_801AED20[D_menu_801B91C0]);
D_menu_801AED20[!D_menu_801B91C0] = 255.0f;
mask[0] = mask[1] = 0xFFFFFFFF;
for (i = 0; i < ARRAY_COUNT(D_menu_801B9330); i++) {
if (D_menu_801B9330[i] != 0) {
mask[i] = 1;
sp7C[i] = 255;
D_menu_801B9330[i]--;
}
}
if ((gGameFrameCount & mask[1]) != 0) {
sp7C[1] = D_menu_801AED20[1];
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, sp7C[1], sp7C[1], 255);
Lib_TextureRect_IA8(&gMasterDisp, D_OPT_8009980, 32, 12, D_menu_801AF094[1], D_menu_801AF0AC[1], 1.0f,
1.0f);
}
if ((gGameFrameCount & mask[0]) != 0) {
sp7C[0] = D_menu_801AED20[0];
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, sp7C[0], sp7C[0], 255);
Lib_TextureRect_IA8(&gMasterDisp, D_OPT_8009B00, 40, 12, D_menu_801AF094[2], D_menu_801AF0AC[2], 1.0f,
1.0f);
}
}
switch (D_menu_801B91CC) {
case 0:
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, 255);
{
for (i = 0; i < 9; i++) {
Lib_TextureRect_IA8(&gMasterDisp, D_OPT_8008DA0 + (160 * 2 * i), 160, 2, D_menu_801AF094[3],
D_menu_801AF0AC[3] + (2.0f * i), 1.0f, 1.0f);
}
Lib_TextureRect_IA8(&gMasterDisp, D_OPT_8008DA0 + 160 * 2 * 9, 160, 1, D_menu_801AF094[3],
D_menu_801AF0AC[3] + 18.0f, 1.0f, 1.0f);
}
break;
case 1:
case 2:
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, 255);
{
for (i = 0; i < 20; i++) {
Lib_TextureRect_IA8(&gMasterDisp, D_OPT_8009CE0 + (160 * 2 * i), 160, 2, D_menu_801AF094[4],
D_menu_801AF0AC[4] + (2.0f * i), 1.0f, 1.0f);
}
Lib_TextureRect_IA8(&gMasterDisp, D_OPT_8009CE0 + 160 * 2 * 20, 160, 1, D_menu_801AF094[4],
D_menu_801AF0AC[4] + 40.0f, 1.0f, 1.0f);
}
break;
case 3:
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 32, 32, 255);
Lib_TextureRect_IA8(&gMasterDisp, D_OPT_800B680, 144, 28, D_menu_801AF094[5], D_menu_801AF0AC[5], 1.0f,
1.0f);
Lib_TextureRect_IA8(&gMasterDisp, D_OPT_800B680 + 4032, 144, 13, D_menu_801AF094[5],
D_menu_801AF0AC[5] + 28.0f, 1.0f, 1.0f);
break;
}
Option_AcceptCancel_Draw();
}
char* sTeamLetter[3] = { "P", "S", "F" };
s32 sTeamAlivePrimR[3] = { 255, 0, 30 };
s32 sTeamAlivePrimG[3] = { 30, 179, 30 };
s32 sTeamAlivePrimB[3] = { 0, 67, 255 };
void Option_Ranking_Setup(void) {
Title_GetRankTotalHits();
gStarCount = 800;
D_menu_801B91D0 = 1;
D_menu_801B93E4 = 0;
D_menu_801B91D4 = 114.0f;
D_menu_801B91DC = 114.0f;
D_menu_801B91D8 = -6.0f;
D_menu_801B91E0 = -6.0f;
sRanking2ndPage = false;
sTitleRankMaxRecords = 10;
D_menu_801B9400.unk_0 = 0;
D_menu_801B9400.unk_4 = 0;
D_menu_801B9408.unk_0 = 0;
D_menu_801B9408.unk_4 = 0;
Option_PlanetTextures_Setup();
}
void Option_Ranking_Update(void) {
Option_Ranking_Select();
if (gControllerPress[gMainController].button & B_BUTTON) {
AUDIO_PLAY_SFX(NA_SE_ARWING_CANCEL, gDefaultSfxSource, 4);
gDrawMode = DRAW_NONE;
sMenuEntryState = OPTION_MAIN_MENU;
sMainMenuState = 0;
sMainMenuFromCancel = true;
}
}
void Option_Ranking_Draw(void) {
Option_RankingMenu_Draw();
Option_DrawMenuLabel();
}
void Option_Ranking_Select(void) {
// Press A to go to the 2nd page
if (gControllerPress[gMainController].button & A_BUTTON) {
AUDIO_PLAY_SFX(NA_SE_DECIDE, gDefaultSfxSource, 4);
sRanking2ndPage ^= 1;
}
if (sRanking2ndPage) {
Option_Ranking2_Cursor();
return;
}
Option_Ranking_Cursor();
}
void Option_Ranking_Cursor(void) {
if (Option_Input_MoveCursor_Y(&D_menu_801B93E4, 9, 1, 0, 20, 5, 4, gMainController, &D_menu_801B9400)) {
AUDIO_PLAY_SFX(NA_SE_CURSOR, gDefaultSfxSource, 4);
D_menu_801B91D4 = 114.0f - D_menu_801B93E4 * 130.0f;
D_menu_801B91DC = 114.0f - D_menu_801B93E4 * 130.0f;
D_menu_801B91D8 = -6.0f + D_menu_801B93E4 * 130.0f;
D_menu_801B91E0 = -6.0f + D_menu_801B93E4 * 130.0f;
}
}
void Option_Ranking2_Cursor(void) {
s32 pad;
f32 sp30;
f32 temp_fv0_2;
s32 temp;
s32 temp2;
if (D_menu_801B91D0 != 0) {
if (Option_Input_MoveCursor_Y(&D_menu_801B93E4, 9, 1, 1, 20, 2, 9, gMainController, &D_menu_801B9408) !=
0.00f) {
AUDIO_PLAY_SFX(NA_SE_CURSOR, gDefaultSfxSource, 4);
D_menu_801B91DC = 114.0f - D_menu_801B93E4 * 130.0f;
D_menu_801B91E0 = -6.0f + D_menu_801B93E4 * 130.0f;
D_menu_801B91D0 = 0;
}
} else {
sp30 = Math_SmoothStepToF(&D_menu_801B91D8, D_menu_801B91E0, 0.5f, 100.0f, 1.0f);
temp_fv0_2 = Math_SmoothStepToF(&D_menu_801B91D4, D_menu_801B91DC, 0.5f, 100.0f, 1.0f);
if ((sp30 == 0.0f) && (temp_fv0_2 == 0.0f)) {
D_menu_801B91D0 = 1;
}
}
temp = D_menu_801B91D4;
temp2 = D_menu_801B91D8;
D_menu_801B91D4 = temp;
D_menu_801B91D8 = temp2;
if (D_menu_801B91D4 >= 114.0f) {
D_menu_801B91D4 = 114.0f;
}
if (D_menu_801B91D4 <= -1056.0f) {
D_menu_801B91D4 = -1056.0f;
}
if (D_menu_801B91D8 <= -6.0f) {
D_menu_801B91D8 = -6.0f;
}
if (D_menu_801B91D8 >= 1164.0f) {
D_menu_801B91D8 = 1164.0f;
}
}
void Option_RankingMenu_Draw(void) {
s32 colorGB;
if (sRanking2ndPage) {
Option_RankingMenu2_Draw();
} else {
Title_RankingData_Draw();
RCP_SetupDL(&gMasterDisp, SETUPDL_83);
Option_Color_FlashRed(&D_menu_801B93F0);
colorGB = D_menu_801B93F0;
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, colorGB, colorGB, 255);
Lib_TextureRect_IA8(&gMasterDisp, D_VS_MENU_7004010, 8, 8, 70.0f, (D_menu_801B93E4 * 17.0f) + 55.0f, 1.0f,
1.0f);
}
RCP_SetupDL(&gMasterDisp, SETUPDL_83);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 0, 255);
Graphics_DisplaySmallText(242, 215, 1.0f, 1.0f, "PUSH A");
}
// 2nd page and more detailed version of the Ranking
void Option_RankingMenu2_Draw(void) {
f32 var_fs0;
f32 var_fs1;
s32 colorGB;
s32 i;
static f32 D_menu_801AF0F4 = 130.0f;
static f32 D_menu_801AF0F8[] = { 48.0f, 175.0f };
var_fs0 = D_menu_801B91D4;
var_fs1 = D_menu_801B91D8;
for (i = 0; i < RANKING_MAX; i++) {
if ((var_fs0 > 69.0f) && (var_fs0 < 230.0f)) {
Option_OrdinalNumbers_Draw(i, 41, var_fs0);
Option_RankingName_Draw(i, 75, var_fs0 - 25.0f);
Option_RankingTotalHits_Draw(i, 130, (var_fs0 - 26.0f));
Map_RemainingLives_Draw(210, (var_fs0 - 24.0f), gSaveFile.save.data.rankingLives[i]);
Option_RankingTeamAlive_Draw(i, 258, var_fs0 - 25.0f);
}
Option_RankingRoute_Draw(i, var_fs0, var_fs1);
var_fs0 += D_menu_801AF0F4;
var_fs1 -= D_menu_801AF0F4;
}
Option_Menu_Push();
Option_80197914();
Matrix_Pop(&gGfxMatrix);
RCP_SetupDL(&gMasterDisp, SETUPDL_76);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, 255);
Lib_TextureRect_IA8(&gMasterDisp, D_OPT_800D170, 8, 16, 0.0f, D_menu_801AF0F8[0], 40.0f, 1.5f);
Lib_TextureRect_IA8_MirY(&gMasterDisp, D_OPT_800D170, 8, 16, 0.0f, D_menu_801AF0F8[1], 40.0f, 1.5f);
Background_DrawPartialStarfield(0, 70);
Background_DrawPartialStarfield(170, 239);
RCP_SetupDL(&gMasterDisp, SETUPDL_83);
if (D_menu_801B91D4 >= 114.0f) {
gDPSetPrimColor(gMasterDisp++, 0, 0, 32, 32, 32, 255);
} else {
Option_Color_FlashRed(&D_menu_801B93F4);
colorGB = D_menu_801B93F4;
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, colorGB, colorGB, 255);
}
Lib_TextureRect_IA8(&gMasterDisp, D_OPT_800D070, 16, 16, 150.0f, 44.0f, 1.0f, 1.0f);
if (D_menu_801B91D4 <= -1055.0f) {
gDPSetPrimColor(gMasterDisp++, 0, 0, 32, 32, 32, 255);
} else {
Option_Color_FlashRed(&D_menu_801B93F8);
colorGB = D_menu_801B93F8;
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, colorGB, colorGB, 255);
}
Lib_TextureRect_IA8_MirY(&gMasterDisp, D_OPT_800D070, 16, 16, 150.0f, 200.0f, 1.0f, 1.0f);
}
Vec3f D_menu_801AF100[2] = { { 0.0f, 167.0f, 0.0f }, { 0.0f, -167.0f, 0.0f } };
Vec3f D_menu_801AF118[2] = { { 25.0f, 3.6f, 0.0f }, { 25.0f, 3.6f, 0.0f } };
void Option_80197914(void) {
Vec3f* vec1;
Vec3f* vec2;
s32 i;
RCP_SetupDL(&gMasterDisp, SETUPDL_0);
for (i = 0, vec1 = D_menu_801AF100, vec2 = D_menu_801AF118; i < 2; i++, vec1++, vec2++) {
Matrix_Push(&gGfxMatrix);
Matrix_Translate(gGfxMatrix, vec1->x, vec1->y, -500.0f, MTXF_APPLY);
Matrix_Scale(gGfxMatrix, vec2->x, vec2->y, 1.0f, MTXF_APPLY);
Matrix_SetGfxMtx(&gMasterDisp);
gSPDisplayList(gMasterDisp++, D_menu_801AEF30);
Matrix_Pop(&gGfxMatrix);
}
}
void Option_OrdinalNumbers_Draw(s32 ordinalType, s32 xPos, s32 yPos) {
RCP_SetupDL(&gMasterDisp, SETUPDL_83);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, 255);
if (ordinalType != 9) {
Lib_TextureRect_IA8(&gMasterDisp, D_menu_801AECF8[ordinalType + 1], 16, 15, xPos, yPos - 25.0f, 1.0f, 1.0f);
} else {
Lib_TextureRect_IA8(&gMasterDisp, aLargeText_1, 16, 15, xPos - 14.0f, yPos - 25.0f, 1.0f, 1.0f);
Lib_TextureRect_IA8(&gMasterDisp, aLargeText_0, 16, 15, xPos, yPos - 25.0f, 1.0f, 1.0f);
}
RCP_SetupDL(&gMasterDisp, SETUPDL_85);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, 255);
switch (ordinalType) {
case 0: // st
Lib_TextureRect_CI4(&gMasterDisp, aStTex, aStTLUT, 16, 9, xPos + 17.0f, yPos - 19.0f, 1.0f, 1.0f);
break;
case 1: // nd
Lib_TextureRect_CI4(&gMasterDisp, aNdTex, aNdTLUT, 16, 10, xPos + 17.0f, yPos - 19.0f, 1.0f, 1.0f);
break;
case 2: // rd
Lib_TextureRect_CI4(&gMasterDisp, aRdTex, aRdTLUT, 16, 11, xPos + 17.0f, yPos - 20.0f, 1.0f, 1.0f);
break;
default: // th
Lib_TextureRect_CI4(&gMasterDisp, aThTex, aThTLUT, 16, 9, xPos + 17.0f, yPos - 19.0f, 1.0f, 1.0f);
break;
}
}
void Option_RankingName_Draw(s32 rankIdx, s32 xPos, s32 yPos) {
char rankName[4];
RCP_SetupDL(&gMasterDisp, SETUPDL_83);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 0, 255);
rankName[0] = gSaveFile.save.data.rankNameEntry[rankIdx][0] & 0xFF;
rankName[1] = gSaveFile.save.data.rankNameEntry[rankIdx][1] & 0xFF;
rankName[2] = gSaveFile.save.data.rankNameEntry[rankIdx][2] & 0xFF;
rankName[3] = '\0';
Graphics_DisplayLargeText(xPos, yPos, 1.0f, 1.0f, rankName);
}
void Option_RankingTotalHits_Draw(s32 rankIdx, s32 xPos, s32 yPos) {
RCP_SetupDL(&gMasterDisp, SETUPDL_83);
gDPSetPrimColor(gMasterDisp++, 0, 0, 60, 60, 255, 170);
Lib_TextureRect_IA8(&gMasterDisp, aMapOptionBgTex, 24, 17, xPos, yPos, 3.17f, 1.05f);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 0, 255);
Graphics_DisplaySmallText(xPos, yPos, 1.0f, 1.0f, "TOTAL HITS");
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, 255);
Graphics_DisplaySmallNumber((xPos + 40.0f) - ((HUD_CountDigits(gTotalHitsRanking[rankIdx]) * 8) - 8), (yPos + 9.0f),
gTotalHitsRanking[rankIdx]);
}
void Option_RankingTeamAlive_Draw(s32 rankIdx, s32 xPos, s32 yPos) {
f32 xOffset;
s32 i;
RCP_SetupDL(&gMasterDisp, SETUPDL_83);
for (xOffset = 0.0f, i = 0; i < ARRAY_COUNT(sTeamAlivePrimR); i++, xOffset += 12.0f) {
gDPSetPrimColor(gMasterDisp++, 0, 0, sTeamAlivePrimR[i], sTeamAlivePrimG[i], sTeamAlivePrimB[i], 255);
Graphics_DisplaySmallText(xOffset + xPos, yPos, 1.0f, 1.0f, sTeamLetter[i]);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, 255);
Graphics_DisplaySmallNumber(xPos + xOffset - ((HUD_CountDigits(gRankingTeamAlive[rankIdx][i]) - 1) * 8),
yPos + 9.0f, gRankingTeamAlive[rankIdx][i]);
}
}
void Option_RankingRoute_Draw(s32 rankIdx, f32 arg1, f32 arg2) {
f32 temp = 16.0f;
s32 routeMax = gSaveFile.save.data.rankingRoute[rankIdx];
f32 var_fs2;
s32 i;
for (var_fs2 = 0.0f, i = 0; i < ROUTE_MAX; i++, var_fs2 += 24.0f + temp) {
Option_RankingRouteFrame_Draw(rankIdx, i, 28.0f + var_fs2, arg1, routeMax);
if (i < routeMax) {
Option_RankingPlanetName_Draw(rankIdx, i, 28.0f + var_fs2, arg1);
Option_RankingHitCount_Draw(rankIdx, i, 28.0f + var_fs2, arg1);
Option_RankingTeamPresence_Draw(rankIdx, i, 28.0f + var_fs2, arg1);
}
}
if ((arg2 < 75.0f) && (arg2 > -80.0f)) {
Option_RankingPlanetRoute_Draw(rankIdx, arg2, routeMax);
}
}
void Option_RankingRouteFrame_Draw(s32 rankIdx, s32 routeIdx, f32 xPos, f32 yPos, s32 arg4) {
s32 r;
s32 g;
s32 b;
s32 routeLineColor;
PlanetId start;
PlanetId end;
if ((yPos > 30.0f) && (yPos < 200.0f)) {
RCP_SetupDL(&gMasterDisp, SETUPDL_76);
if (routeIdx < 6) {
r = g = b = 255;
if (routeIdx < (arg4 - 1)) {
start = gSaveFile.save.data.stats[rankIdx][routeIdx].planetId & 0xF;
end = gSaveFile.save.data.stats[rankIdx][routeIdx + 1].planetId & 0xF;
routeLineColor = Option_GetRouteLineColor(start, end);
r = g = b = 255; // white by default
switch (routeLineColor) {
case 0:
r = 16;
g = 64;
break;
case 1:
case 3:
g = 175;
b = 0;
break;
case 2:
case 4:
b = 0;
g = 0;
break;
}
}
gDPSetPrimColor(gMasterDisp++, 0, 0, r, g, b, 255);
Lib_TextureRect_RGBA16(&gMasterDisp, aMapWhiteSquareTex, 8, 8, xPos + 24.0f, yPos + 11.0f, 2.0f, 0.2f);
}
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, 255);
Lib_TextureRect_RGBA16(&gMasterDisp, aMapPathBoxTex, 24, 24, xPos, yPos, 1.0f, 1.0f);
}
}
void Option_RankingHitCount_Draw(s32 rankIdx, s32 routeIdx, f32 xPos, f32 yPos) {
s32 hitCount;
if ((yPos > 22.0f) && (yPos < 162.0f)) {
RCP_SetupDL(&gMasterDisp, SETUPDL_83);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 0, 255);
hitCount = (gSaveFile.save.data.stats[rankIdx][routeIdx].unk_C & 1) << 8;
hitCount |= gSaveFile.save.data.stats[rankIdx][routeIdx].hitCount;
Graphics_DisplaySmallNumber(xPos + 15.0f - (HUD_CountDigits(hitCount) - 1) * 8, yPos + 24.0f + 1.0f, hitCount);
}
}
void Option_RankingTeamPresence_Draw(s32 rankIdx, s32 routeIdx, f32 xPos, f32 yPos) {
f32 xOffset;
s32 teamAlive[3];
s32 i;
if ((yPos > 12.0f) && (yPos < 154.0f)) {
RCP_SetupDL(&gMasterDisp, SETUPDL_83);
teamAlive[0] = gSaveFile.save.data.stats[rankIdx][routeIdx].peppyAlive & 1;
teamAlive[1] = gSaveFile.save.data.stats[rankIdx][routeIdx].slippyAlive & 1;
teamAlive[2] = gSaveFile.save.data.stats[rankIdx][routeIdx].falcoAlive & 1;
for (xOffset = 0.0f, i = 0; i < ARRAY_COUNT(teamAlive); i++, xOffset += 9.0f) {
if (teamAlive[i] == 0) {
continue;
}
gDPSetPrimColor(gMasterDisp++, 0, 0, sTeamAlivePrimR[i], sTeamAlivePrimG[i], sTeamAlivePrimB[i], 255);
Graphics_DisplaySmallText(xPos + xOffset - 1.0f, yPos + 24.0f + 8.0f + 1.0f, 1.0f, 1.0f, sTeamLetter[i]);
}
}
}
void Option_RankingPlanetName_Draw(s32 rankIdx, s32 routeIdx, f32 xPos, f32 yPos) {
PlanetId planetIdx;
char* planetName;
f32 textWidth;
if ((yPos > 58.0f) && (yPos < 197.0f)) {
planetIdx = gSaveFile.save.data.stats[rankIdx][routeIdx].planetId & 0xF;
planetName = D_menu_801AEEAC[planetIdx];
RCP_SetupDL(&gMasterDisp, SETUPDL_83);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 0, 255);
textWidth = Graphics_GetSmallTextWidth(planetName) / 2.0f;
Graphics_DisplaySmallText(xPos + 12.0f - textWidth, yPos - 8.0f, 1.0f, 1.0f, planetName);
}
}
void Option_RankingPlanetRoute_Draw(s32 rankIdx, f32 y, s32 routeMax) {
static f32 zAngle = 0.0f;
static f32 xStart = -121.0f;
static f32 xAdvance = 40.1f;
s32 i;
PlanetId planet;
bool gotMedal;
bool drawPlanetMedal;
f32 x;
s32 pad[2];
Matrix_Push(&gGfxMatrix);
Matrix_LookAt(gGfxMatrix, 0.0f, 0.0f, 100.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, MTXF_APPLY);
Matrix_SetGfxMtx(&gMasterDisp);
Lib_InitOrtho(&gMasterDisp);
gotMedal = gSaveFile.save.data.rankingMedal[rankIdx];
for (x = xStart, i = 0; i < routeMax; i++, x += xAdvance) {
planet = gSaveFile.save.data.stats[rankIdx][i].planetId & 0xF;
switch (planet) {
case SAVE_SLOT_SOLAR:
RCP_SetupDL(&gMasterDisp, SETUPDL_67);
gDPSetPrimColor(gMasterDisp++, 0, 0, 240, 0, 0, 255);
gDPSetEnvColor(gMasterDisp++, 31, 0, 0, 0);
Matrix_Push(&gGfxMatrix);
Matrix_Translate(gGfxMatrix, x, y, 0.0f, MTXF_APPLY);
Matrix_RotateZ(gGfxMatrix, M_DTOR * zAngle, MTXF_APPLY);
Matrix_Scale(gGfxMatrix, 0.3f, 0.3f, 0.3f, MTXF_APPLY);
Matrix_SetGfxMtx(&gMasterDisp);
gSPDisplayList(gMasterDisp++, D_menu_801AEE6C[planet]);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, 128);
gDPSetEnvColor(gMasterDisp++, 31, 0, 0, 0);
Matrix_Scale(gGfxMatrix, 0.8f, 0.8f, 0.8f, MTXF_APPLY);
Matrix_SetGfxMtx(&gMasterDisp);
gSPDisplayList(gMasterDisp++, D_menu_801AEE6C[planet]);
Matrix_Pop(&gGfxMatrix);
break;
case PLANET_METEO:
RCP_SetupDL(&gMasterDisp, SETUPDL_62);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, 255);
Matrix_Push(&gGfxMatrix);
Matrix_Translate(gGfxMatrix, x - 1.0f, y + 4.0f, 0.0f, MTXF_APPLY);
Matrix_Scale(gGfxMatrix, 0.3f, 0.3f, 0.3f, MTXF_APPLY);
Matrix_SetGfxMtx(&gMasterDisp);
gSPDisplayList(gMasterDisp++, D_menu_801AEE6C[planet]);
Matrix_Translate(gGfxMatrix, 18.0f, -20.0f, 0.0f, MTXF_APPLY);
Matrix_SetGfxMtx(&gMasterDisp);
gSPDisplayList(gMasterDisp++, D_menu_801AEE6C[planet]);
Matrix_Pop(&gGfxMatrix);
break;
case PLANET_SECTOR_X:
case PLANET_SECTOR_Y:
case PLANET_SECTOR_Z:
RCP_SetupDL(&gMasterDisp, SETUPDL_62);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, 144);
Matrix_Push(&gGfxMatrix);
Matrix_Translate(gGfxMatrix, x, y, 0.0f, MTXF_APPLY);
Matrix_Scale(gGfxMatrix, 0.3f, 0.3f, 0.3f, MTXF_APPLY);
Matrix_SetGfxMtx(&gMasterDisp);
gSPDisplayList(gMasterDisp++, D_menu_801AEE6C[planet]);
Matrix_Pop(&gGfxMatrix);
break;
case PLANET_BOLSE:
RCP_SetupDL(&gMasterDisp, SETUPDL_23);
Lights_SetOneLight(&gMasterDisp, 0, 0, 100, 100, 100, 70, 100, 100, 100);
Matrix_Push(&gGfxMatrix);
Matrix_Translate(gGfxMatrix, x, y, 0.0f, MTXF_APPLY);
Matrix_RotateX(gGfxMatrix, M_DTOR * 20.0f, MTXF_APPLY);
Matrix_Scale(gGfxMatrix, 0.01f, 0.01f, 0.01f, MTXF_APPLY);
Matrix_SetGfxMtx(&gMasterDisp);
gSPDisplayList(gMasterDisp++, D_menu_801AEE6C[planet]);
Matrix_Pop(&gGfxMatrix);
break;
case PLANET_AREA_6:
RCP_SetupDL(&gMasterDisp, SETUPDL_23);
Lights_SetOneLight(&gMasterDisp, 0, 0, 100, 100, 100, 70, 100, 100, 100);
Matrix_Push(&gGfxMatrix);
Matrix_Translate(gGfxMatrix, x, y, 0.0f, MTXF_APPLY);
Matrix_RotateX(gGfxMatrix, M_DTOR * 20.0f, MTXF_APPLY);
Matrix_Scale(gGfxMatrix, 0.01f, 0.01f, 0.01f, MTXF_APPLY);
Matrix_SetGfxMtx(&gMasterDisp);
gSPDisplayList(gMasterDisp++, D_menu_801AEE6C[planet]);
Matrix_Pop(&gGfxMatrix);
break;
default:
RCP_SetupDL(&gMasterDisp, SETUPDL_62);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, 255);
Matrix_Push(&gGfxMatrix);
Matrix_Translate(gGfxMatrix, x, y, 0.0f, MTXF_APPLY);
Matrix_Scale(gGfxMatrix, 0.3f, 0.3f, 0.3f, MTXF_APPLY);
Matrix_SetGfxMtx(&gMasterDisp);
gSPDisplayList(gMasterDisp++, D_menu_801AEE6C[planet]);
if ((planet != SAVE_SLOT_VENOM_1) && (planet != SAVE_SLOT_VENOM_2) && (planet != PLANET_AQUAS)) {
if (planet == PLANET_MACBETH) {
gDPSetPrimColor(gMasterDisp++, 0, 0, 64, 64, 64, 255);
} else {
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, 255);
}
Matrix_SetGfxMtx(&gMasterDisp);
gSPDisplayList(gMasterDisp++, gMapVenomCloudDL);
}
Matrix_Scale(gGfxMatrix, 1.6f, 1.6f, 1.6f, MTXF_APPLY);
Matrix_SetGfxMtx(&gMasterDisp);
gSPDisplayList(gMasterDisp++, D_MAP_605C230);
Matrix_Pop(&gGfxMatrix);
break;
}
drawPlanetMedal = (gotMedal >> i) & 1;
if (drawPlanetMedal) {
Option_RankingRouteMedal_Draw(x, y, 0.0f);
}
}
Matrix_Pop(&gGfxMatrix);
Option_ScrollPlanetTexture();
zAngle += 0.1f;
Lib_InitPerspective(&gMasterDisp);
}
f32 D_menu_801AF13C = 0.7f;
f32 D_menu_801AF140 = 11.0f;
f32 D_menu_801AF144 = 2.7f;
void Option_RankingRouteMedal_Draw(f32 xPos, f32 yPos, f32 zPos) {
RCP_SetupDL(&gMasterDisp, SETUPDL_53);
Matrix_Push(&gGfxMatrix);
Matrix_Translate(gGfxMatrix, xPos - D_menu_801AF140, yPos + D_menu_801AF144, zPos, MTXF_APPLY);
Matrix_Scale(gGfxMatrix, D_menu_801AF13C, D_menu_801AF13C, D_menu_801AF13C, MTXF_APPLY);
Matrix_SetGfxMtx(&gMasterDisp);
gSPDisplayList(gMasterDisp++, aMapMedalDL);
Matrix_Pop(&gGfxMatrix);
}
s32 Option_GetRouteLineColor(PlanetId start, PlanetId end) {
s32 i;
for (i = 0; i < ARRAY_COUNT(sRouteColoredLine); i++) {
if ((sRouteColoredLine[i].start == start) && (sRouteColoredLine[i].end == end)) {
break;
}
}
return sRouteColoredLine[i].color;
}
void Option_VersusMenu_Setup(void) {
s32 i;
if (D_menu_801B91C4) {
AUDIO_PLAY_BGM(NA_BGM_VS_SELECT);
}
sVsMenuSelection = sMenuEntryState;
if (D_game_800D2870) {
sOptionCardList[OPTION_TRAINING].tex.yPos = 129.0f;
sOptionCardList[OPTION_TRAINING].frame.y = -7.5f;
}
gVsPointsToWin = 3;
D_menu_801B9340 = 2;
gVsMenuSelection = 0;
gStarCount = 0;
D_menu_801B93C4 = 0;
for (i = 0; i < ARRAY_COUNT(gControllerPlugged); i++) {
gPlayerInactive[i] = false;
if (gControllerPlugged[i] == 0) {
gPlayerInactive[i] = true;
D_menu_801B93C4 |= 1 << i;
}
D_menu_801B9358[i] = 255.0f;
D_menu_801B93A0[i].unk_0 = 0;
D_menu_801B93A0[i].unk_4 = 0;
}
D_menu_801B91E8 = 255.0f;
}
void Option_VersusMenu_Update(void) {
switch (sMainMenuState) {
case 0:
Option_VersusMenu_Cursor();
break;
case 1:
if (sOkConfirmTimer == 0.0f) {
sMenuEntryState = OPTION_VERSUS_STAGE;
Option_Entry_Setup();
}
break;
}
}
void Option_VersusMenu_Cursor(void) {
s32 i;
for (i = 0; i < ARRAY_COUNT(gControllerPress); i++) {
if (!(D_menu_801B93C4 & (1 << i))) {
Option_Color_FlashRed(&D_menu_801B9358[i]);
if (Option_Input_MoveCursor_Y(&D_menu_801AED3C[i], 2, 0, 0, 20, 2, 4, i, &D_menu_801B93A0[i])) {
AUDIO_PLAY_SFX(NA_SE_CURSOR, gDefaultSfxSource, 4);
}
}
if (gControllerPress[i].button & A_BUTTON) {
if (D_menu_801B93C4 == 15) {
AUDIO_PLAY_SFX(NA_SE_DECIDE, gDefaultSfxSource, 4);
sOkConfirmTimer = 10;
sMainMenuState++;
break;
} else {
if (!(D_menu_801B93C4 & (1 << i))) {
AUDIO_PLAY_SFX(NA_SE_DECIDE, gDefaultSfxSource, 4);
gHandicap[i] = D_menu_801AED3C[i];
D_menu_801B9358[i] = 255.0f;
D_menu_801B9348[i] = 10;
D_menu_801B93C4 = D_menu_801B93C4 | (1 << i);
}
}
}
if (gControllerPress[i].button & B_BUTTON) {
if (D_menu_801B93C4 & (1 << i)) {
AUDIO_PLAY_SFX(NA_SE_CANCEL, gDefaultSfxSource, 4);
D_menu_801B93C4 &= (1 << i) ^ 15;
} else {
AUDIO_PLAY_BGM(NA_BGM_SELECT);
AUDIO_PLAY_SFX(NA_SE_ARWING_CANCEL, gDefaultSfxSource, 4);
Option_VsBackToSubMenu(2);
sVsSubMenuFromCancel = true;
break;
}
}
}
}
void Option_VersusMenu_Draw(void) {
s32 i;
Option_VsMenuCard_Draw();
Option_VS_N64Console_Draw();
for (i = 0; i < ARRAY_COUNT(gControllerPlugged); i++) {
if (gControllerPlugged[i] == 1) {
Option_VS_HandicapSet_Draw(i);
}
}
if (D_menu_801B93C4 == 15) {
Option_VsOKConfirm_Draw();
}
}
f32 sVsHandicapFrameXpos[4] = { 30.0f, 214.0f, 30.0f, 215.0f };
f32 sVsHandicapFrameYpos[4] = { 18.0f, 18.0f, 151.0f, 151.0f };
s32 sCharNameWidth[4] = { 56, 48, 56, 48 };
s32 sCharNameHeight[4] = { 8, 10, 10, 8 };
f32 sCharNameXoffsetPos[4] = { 12.0f, 16.0f, 12.0f, 18.0f };
f32 sCharNameYoffsetPos = -1.0f;
f32 D_menu_801AF19C[4] = { 46.0f, 41.0f, 41.0f, 41.0f };
f32 D_menu_801AF1AC = 24.0f;
f32 D_menu_801AF1B0 = 1.4f;
f32 sPlayerFaceXoffsetPos = 5.0f;
f32 sPlayerFaceYoffsetPos = 11.0f;
f32 D_menu_801AF1BC = 8.0f;
f32 D_menu_801AF1C0 = 45.0f;
f32 D_menu_801AF1C4 = 20.0f;
f32 D_menu_801AF1C8 = 55.0f;
f32 D_menu_801AF1CC = 37.0f;
f32 D_menu_801AF1D0 = 11.0f;
f32 D_menu_801AF1D4 = 7.0f;
f32 D_menu_801AF1D8 = 59.0f;
f32 D_menu_801AF1DC = 58.0f;
void Option_VS_HandicapSet_Draw(s32 PlayerIdx) {
s32 mask;
s32 width;
s32 colorGB;
s32 i;
static u8* sVsHandicapLvlTex[3] = {
aVsHandicapLvl1Tex,
aVsHandicapLvl2Tex,
aVsHandicapLvl3Tex,
};
static u8* sVsCharNameTex[4] = {
aVsFoxNameTex,
aVsPeppyNameTex,
aVsSlippyNameTex,
aVsFalcoNameTex,
};
static u16* sVsCharNameTLUT[4] = {
aVsFoxNameTLUT,
aVsPeppyNameTLUT,
aVsSlippyNameTLUT,
aVsFalcoNameTLUT,
};
static u16* sVsPlayerFaceTex[4] = {
aVsFoxFaceTex,
aVsPeppyFaceTex,
aVsSlippyFaceTex,
aVsFalcoFaceTex,
};
static u8* sVsPlayerNumTex[4] = {
aVsPlayerNum1Tex,
aVsPlayerNum2Tex,
aVsPlayerNum3Tex,
aVsPlayerNum4Tex,
};
static s32 sCharNameR[4] = { 177, 255, 0, 30 };
static s32 sCharNameG[4] = { 242, 30, 255, 30 };
static s32 sCharNameB[4] = { 12, 0, 67, 255 };
RCP_SetupDL(&gMasterDisp, SETUPDL_85);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, 255);
Lib_TextureRect_CI4(&gMasterDisp, aVsHandicapFrameTex, aVsHandicapFrameTLUT, 80, 71,
sVsHandicapFrameXpos[PlayerIdx], sVsHandicapFrameYpos[PlayerIdx], 1.0f, 1.0f);
Lib_TextureRect_CI8(&gMasterDisp, sVsCharNameTex[PlayerIdx], sVsCharNameTLUT[PlayerIdx], sCharNameWidth[PlayerIdx],
sCharNameHeight[PlayerIdx], sVsHandicapFrameXpos[PlayerIdx] + sCharNameXoffsetPos[PlayerIdx],
sVsHandicapFrameYpos[PlayerIdx] + sCharNameYoffsetPos, 1.0f, 1.0f);
RCP_SetupDL(&gMasterDisp, SETUPDL_83);
mask = 0xFFFFFFFF;
if (D_menu_801B9348[PlayerIdx] != 0) {
mask = 0x00000001;
D_menu_801B9348[PlayerIdx]--;
}
if ((gGameFrameCount & mask) != 0) {
colorGB = D_menu_801B9358[PlayerIdx];
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, colorGB, colorGB, 255);
Lib_TextureRect_IA8(&gMasterDisp, D_VS_MENU_7001030, 64, 9, sVsHandicapFrameXpos[PlayerIdx] + D_menu_801AF1BC,
sVsHandicapFrameYpos[PlayerIdx] + D_menu_801AF1C0, 1.0f, 1.0f);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, colorGB, colorGB, 255);
Lib_TextureRect_IA8(&gMasterDisp, sVsHandicapLvlTex[D_menu_801AED3C[PlayerIdx]], 40, 12,
sVsHandicapFrameXpos[PlayerIdx] + D_menu_801AF1C4,
sVsHandicapFrameYpos[PlayerIdx] + D_menu_801AF1C8, 1.0f, 1.0f);
}
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, 255);
Lib_TextureRect_IA8_MirX(&gMasterDisp, aArrowTex, 8, 8, sVsHandicapFrameXpos[PlayerIdx] + D_menu_801AF1D4,
sVsHandicapFrameYpos[PlayerIdx] + D_menu_801AF1DC, 1.0f, 1.0f);
Lib_TextureRect_IA8(&gMasterDisp, aArrowTex, 8, 8, sVsHandicapFrameXpos[PlayerIdx] + D_menu_801AF1D8,
sVsHandicapFrameYpos[PlayerIdx] + D_menu_801AF1DC, 1.0f, 1.0f);
Lib_TextureRect_IA8(&gMasterDisp, aVsTextContTex, 40, 7, sVsHandicapFrameXpos[PlayerIdx] + D_menu_801AF1CC,
sVsHandicapFrameYpos[PlayerIdx] + D_menu_801AF1D0, 1.0f, 1.0f);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, 255);
Lib_TextureRect_RGBA16(&gMasterDisp, sVsPlayerFaceTex[PlayerIdx], 44, 44,
sVsHandicapFrameXpos[PlayerIdx] + sPlayerFaceXoffsetPos,
sVsHandicapFrameYpos[PlayerIdx] + sPlayerFaceYoffsetPos, 0.7f, 0.7f);
width = 24;
if (PlayerIdx == 0) {
width = 16;
}
gDPSetPrimColor(gMasterDisp++, 0, 0, sCharNameR[PlayerIdx], sCharNameG[PlayerIdx], sCharNameB[PlayerIdx], 255);
Lib_TextureRect_IA8(&gMasterDisp, sVsPlayerNumTex[PlayerIdx], width, 13,
sVsHandicapFrameXpos[PlayerIdx] + D_menu_801AF19C[PlayerIdx],
sVsHandicapFrameYpos[PlayerIdx] + D_menu_801AF1AC, D_menu_801AF1B0, D_menu_801AF1B0);
}
void Option_VS_N64Console_Draw(void) {
s32 i;
RCP_SetupDL_76();
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, 255);
Lib_TextureRect_RGBA16(&gMasterDisp, aVsN64ConsoleTex, 144, 42, 87.0f, 84, 1.0f, 1.0f);
}
void Option_VersusStage_Setup(void) {
s32 i;
gStarCount = 0;
D_menu_801B933C = 0;
D_menu_801B91E8 = 255.0f;
D_menu_801B93D4 = gVsPointsToWin - 1;
D_menu_801B93D8 = gVsMenuSelection;
D_menu_801B93DC = D_menu_801B9340;
gVsTimeTrialLimit = D_menu_801B93DC;
// clang-format off
for (i = 0; i < ARRAY_COUNT(D_menu_801B9358); i++) { \
D_menu_801B9358[i] = 0;
}
// clang-format on
sPointConfirmTimer = 0;
sStageSelectConfirmTimer = 0;
sTimeTrialConfirmTimer = 0;
sOkConfirmTimer = 0;
sVsSubMenuFirstState = false;
D_menu_801B9368 = 255.0f;
D_menu_801B9370 = 255.0f;
D_menu_801B9378 = 255.0f;
Option_8019A080();
}
void Option_8019A080(void) {
s32 i;
for (i = 0; i < ARRAY_COUNT(D_menu_801B9380); i++) {
D_menu_801B9380[i].unk_0 = 0;
D_menu_801B9380[i].unk_4 = 0;
}
}
void Option_VersusStage_Update(void) {
switch (sVsMenuSelection) {
case OPTION_POINT_MATCH:
Option_Vs_PointMatch_Update();
break;
case OPTION_BR_MATCH:
Option_Vs_BattleRoyal_Update();
break;
case OPTION_TT_MATCH:
Option_Vs_TimeTrial_Update();
break;
}
}
void Option_Vs_PointMatch_Update(void) {
switch (sMainMenuState) {
case 0:
Option_Vs_Point_Selection();
break;
case 1:
Option_VsStageSelection();
break;
case 2:
Option_VsConfirmSelection();
break;
case 3:
Option_Vs_StartMatch();
break;
}
}
void Option_Vs_BattleRoyal_Update(void) {
switch (sMainMenuState) {
case 0:
Option_VsStageSelection();
break;
case 1:
Option_VsConfirmSelection();
break;
case 2:
Option_Vs_StartMatch();
break;
}
}
void Option_Vs_TimeTrial_Update(void) {
switch (sMainMenuState) {
case 0:
Option_VsTimeSelection();
break;
case 1:
Option_VsStageSelection();
break;
case 2:
Option_VsConfirmSelection();
break;
case 3:
Option_Vs_StartMatch();
break;
}
}
void Option_Vs_StartMatch(void) {
if (sOkConfirmTimer == 0.0f) {
gGameState = GSTATE_VS_INIT;
gNextGameStateTimer = 2;
gOptionMenuStatus = OPTION_WAIT;
gDrawMode = DRAW_NONE;
}
}
void Option_Vs_Point_Selection(void) {
s32 i;
if (sPointConfirmTimer != 0) {
return;
}
if (sVsSubMenuFirstState) {
sMainMenuState++;
sVsSubMenuFirstState = false;
return;
}
for (i = 0; i < ARRAY_COUNT(gControllerPlugged); i++) {
if (gControllerPlugged[i] == 0) {
continue;
}
if (Option_Input_MoveCursor_Y(&D_menu_801B93D4, 4, 0, 0, 20, 2, 4, i, &D_menu_801B9380[i])) {
AUDIO_PLAY_SFX(NA_SE_CURSOR, gDefaultSfxSource, 4);
gVsPointsToWin = D_menu_801B93D4 + 1;
}
if (gControllerPress[i].button & A_BUTTON) {
AUDIO_PLAY_SFX(NA_SE_DECIDE, gDefaultSfxSource, 4);
Option_8019A080();
sPointConfirmTimer = 10;
break;
}
if (gControllerPress[i].button & B_BUTTON) {
AUDIO_PLAY_SFX(NA_SE_CANCEL, gDefaultSfxSource, 4);
sMenuEntryState = sVsMenuSelection;
D_menu_801B91C4 = 0;
Option_Entry_Setup();
break;
}
}
}
void Option_VsTimeSelection(void) {
s32 i;
if (sTimeTrialConfirmTimer != 0) {
return;
}
if (sVsSubMenuFirstState) {
sMainMenuState++;
sVsSubMenuFirstState = false;
return;
}
for (i = 0; i < ARRAY_COUNT(gControllerPlugged); i++) {
if (!gControllerPlugged[i]) {
continue;
}
if (Option_Input_MoveCursor_Y(&D_menu_801B93DC, 4, 0, 0, 20, 2, 4, i, &D_menu_801B9380[i])) {
AUDIO_PLAY_SFX(NA_SE_CURSOR, gDefaultSfxSource, 4);
D_menu_801B9340 = D_menu_801B93DC;
gVsTimeTrialLimit = D_menu_801B93DC;
}
if (gControllerPress[i].button & A_BUTTON) {
AUDIO_PLAY_SFX(NA_SE_DECIDE, gDefaultSfxSource, 4);
Option_8019A080();
sTimeTrialConfirmTimer = 10;
break;
}
if (gControllerPress[i].button & B_BUTTON) {
AUDIO_PLAY_SFX(NA_SE_CANCEL, gDefaultSfxSource, 4);
sMenuEntryState = sVsMenuSelection;
D_menu_801B91C4 = 0;
Option_Entry_Setup();
break;
}
}
}
void Option_VsStageSelection(void) {
s32 i;
if (sStageSelectConfirmTimer != 0) {
return;
}
if (sVsSubMenuFirstState) {
D_menu_801B933C = 1;
sVsSubMenuFirstState = false;
sMainMenuState++;
return;
}
for (i = 0; i < ARRAY_COUNT(gControllerPlugged); i++) {
if (gControllerPlugged[i] == 0) {
continue;
}
if (Option_Input_MoveCursor_Y(&D_menu_801B93D8, 1, 0, 1, 20, 2, 4, i, &D_menu_801B9380[i])) {
AUDIO_PLAY_SFX(NA_SE_CURSOR, gDefaultSfxSource, 4);
gVsMenuSelection = D_menu_801B93D8;
}
if (gControllerPress[i].button & A_BUTTON) {
AUDIO_PLAY_SFX(NA_SE_DECIDE, gDefaultSfxSource, 4);
if (gVsMenuSelection == 0) {
gVersusStage = VS_STAGE_CORNERIA;
if (sVsMenuSelection == OPTION_TT_MATCH) {
gVersusStage = VS_STAGE_KATINA;
}
} else {
gVersusStage = VS_STAGE_SECTOR_Z;
}
sStageSelectConfirmTimer = 10;
Option_8019A080();
break;
}
if (gControllerPress[i].button & B_BUTTON) {
AUDIO_PLAY_SFX(NA_SE_CANCEL, gDefaultSfxSource, 4);
if (sVsMenuSelection == OPTION_BR_MATCH) {
sMenuEntryState = sVsMenuSelection;
D_menu_801B91C4 = 0;
Option_Entry_Setup();
} else {
Option_8019A080();
sVsSubMenuFirstState = false;
sMainMenuState--;
}
break;
}
}
}
void Option_VsConfirmSelection(void) {
s32 i;
if (sOkConfirmTimer != 0) {
return;
}
if (sVsSubMenuFirstState) {
sVsSubMenuFirstState = false;
sMainMenuState++;
return;
}
for (i = 0; i < ARRAY_COUNT(gControllerPlugged); i++) {
if (gControllerPlugged[i] == 0) {
continue;
}
if (gControllerPress[i].button & A_BUTTON) {
AUDIO_PLAY_SFX(NA_SE_DECIDE, gDefaultSfxSource, 4);
sOkConfirmTimer = 10;
break;
}
if (gControllerPress[i].button & B_BUTTON) {
AUDIO_PLAY_SFX(NA_SE_CANCEL, gDefaultSfxSource, 4);
Option_8019A080();
D_menu_801B933C = 0;
sVsSubMenuFirstState = false;
sMainMenuState--;
break;
}
}
}
void Option_VersusStage_Draw(void) {
switch (sVsMenuSelection) {
case OPTION_BR_MATCH:
break;
case OPTION_POINT_MATCH:
Option_VsPointMatch_Draw();
break;
case OPTION_TT_MATCH:
Option_VsTimeTrial_Draw();
break;
}
Option_VsStageSelect_Draw();
if (D_menu_801B933C != 0) {
Option_VsOKConfirm_Draw();
}
}
void Option_VsPointMatch_Draw(void) {
s32 pad[5];
s32 colorGB;
s32 sp44 = gVsPointsToWin;
s32 mask;
RCP_SetupDL(&gMasterDisp, SETUPDL_83);
gDPSetPrimColor(gMasterDisp++, 0, 0, 60, 60, 255, 190);
Lib_TextureRect_IA8(&gMasterDisp, aMapOptionBgTex, 24, 17, 94.0f, 43.0f, 5.0f, 1.1f);
if (sMainMenuState == 0) {
Option_VsSelectionArrows_Draw(97.0f, 50.0f, 107.0f, 255, 255, 255);
Option_Color_FlashRed(&D_menu_801B9368);
} else {
D_menu_801B9368 = 255.0f;
}
colorGB = D_menu_801B9368;
mask = 0xFFFFFFFF;
if (sPointConfirmTimer != 0) {
colorGB = 255;
mask = 0x00000001;
sPointConfirmTimer--;
if (sPointConfirmTimer == 0) {
sVsSubMenuFirstState = true;
}
}
if ((gGameFrameCount & mask) != 0) {
RCP_SetupDL(&gMasterDisp, SETUPDL_83);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, colorGB, colorGB, 255);
Lib_TextureRect_IA8(&gMasterDisp, D_menu_801AECF8[sp44], 16, 15, 109.0f, 45.0f, 1.0f, 1.0f);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, colorGB, colorGB, 255);
Lib_TextureRect_IA8(&gMasterDisp, D_VS_MENU_7001DF0, 80, 10, 122.0f, 49.0f, 1.0f, 1.0f);
}
}
void Option_VsTimeTrial_Draw(void) {
static f32 D_menu_801AF25C[6] = { 156.0f, 112.0f, 112.0f, 112.0f, 112.0f, 112.0f };
static f32 D_menu_801AF274[6] = { 46.0f, 43.0f, 43.0f, 43.0f, 43.0f, 43.0f };
static f32 D_menu_801B9324;
static f32 D_menu_801B9328;
static f32 D_menu_801B9338;
s32 pad[2];
s32 colorGB;
s32 mask;
static u8* sTimeTrialMinuteTextures[] = { D_VS_MENU_70024D0, D_VS_MENU_7002730, D_VS_MENU_7002990,
D_VS_MENU_7002BF0, D_VS_MENU_7002E50 };
RCP_SetupDL(&gMasterDisp, SETUPDL_83);
gDPSetPrimColor(gMasterDisp++, 0, 0, 60, 60, 255, 190);
Lib_TextureRect_IA8(&gMasterDisp, aMapOptionBgTex, 24, 17, 93.0f, 42.0f, 5.1f, 1.1f);
if (sMainMenuState == 0) {
D_menu_801B9324 = 97.0f;
D_menu_801B9328 = 49.0f;
D_menu_801B9338 = 107.0f;
Option_VsSelectionArrows_Draw(D_menu_801B9324, D_menu_801B9328, D_menu_801B9338, 255, 255, 255);
Option_Color_FlashRed(&D_menu_801B9378);
} else {
D_menu_801B9378 = 255.0f;
}
colorGB = D_menu_801B9378;
mask = 0xFFFFFFFF;
if (sTimeTrialConfirmTimer != 0) {
colorGB = 255;
mask = 0x00000001;
sTimeTrialConfirmTimer--;
if (sTimeTrialConfirmTimer == 0) {
sVsSubMenuFirstState = true;
}
}
if ((gGameFrameCount & mask) != 0) {
RCP_SetupDL(&gMasterDisp, SETUPDL_83);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, colorGB, colorGB, 255);
Lib_TextureRect_IA8(&gMasterDisp, sTimeTrialMinuteTextures[D_menu_801B9340], 40, 15,
D_menu_801AF25C[D_menu_801B9340 + 1], D_menu_801AF274[D_menu_801B9340 + 1], 1.0f, 1.0f);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, colorGB, colorGB, 255);
Lib_TextureRect_IA8(&gMasterDisp, D_VS_MENU_7002110, 80, 12, D_menu_801AF25C[0], D_menu_801AF274[0], 1.0f,
1.0f);
}
}
void Option_VsStageSelect_Draw(void) {
static f32 D_menu_801B93C0;
static f32 D_menu_801B93C8;
static f32 D_menu_801B93CC;
static f32 D_menu_801AF2A0 = 101.0f;
static f32 D_menu_801AF2A4 = 86.0f;
s32 mask;
s32 colorGB;
if (((sMainMenuState == 0) && (sVsMenuSelection == OPTION_BR_MATCH)) ||
((sMainMenuState == 1) && (sVsMenuSelection != OPTION_BR_MATCH))) {
D_menu_801B93C0 = 94.0f;
D_menu_801B93C8 = 88.0f;
D_menu_801B93CC = 114.0f;
RCP_SetupDL(&gMasterDisp, SETUPDL_83);
Option_VsSelectionArrows_Draw(D_menu_801B93C0, D_menu_801B93C8, D_menu_801B93CC, 255, 255, 255);
Option_Color_FlashRed(&D_menu_801B9370);
} else {
D_menu_801B9370 = 255.0f;
}
colorGB = D_menu_801B9370;
mask = 0xFFFFFFFF;
if (sStageSelectConfirmTimer != 0) {
mask = 0x00000001;
colorGB = 255;
sStageSelectConfirmTimer--;
if (sStageSelectConfirmTimer == 0) {
sVsSubMenuFirstState = true;
}
}
if ((gGameFrameCount & mask) != 0) {
RCP_SetupDL(&gMasterDisp, SETUPDL_83);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, colorGB, colorGB, 255);
Lib_TextureRect_IA8(&gMasterDisp, D_VS_MENU_7001270, 112, 12, D_menu_801AF2A0, D_menu_801AF2A4, 1.0f, 1.0f);
}
if (sVsMenuSelection == OPTION_TT_MATCH) {
Option_VsTimeTrialStageSelect_Draw();
} else {
Option_VsStageSelect2_Draw();
}
}
void Option_VsTimeTrialStageSelect_Draw(void) {
static f32 D_menu_801AF2A8 = 69.0f;
static f32 D_menu_801AF2AC = 110.0f;
static f32 D_menu_801AF2B0 = 123.0f;
static f32 D_menu_801AF2B4[] = { 72.0f, 189.0f };
f32 xPos;
s32 i;
s32 width;
s32 alpha[2];
static u8* sVsTextLevelTex[] = { aVsTextKatinaTex, aVsTextSectorZTex };
static u8* sVsLevelTex[] = { aVsKatinaTex, aVsSectorZTex };
static u16* sVsLevelTLUT[] = { aVsKatinaTLUT, aVsSectorZTLUT };
for (xPos = D_menu_801AF2A8, i = 0; i < ARRAY_COUNT(sVsTextLevelTex); i++, xPos += D_menu_801AF2B0) {
if (i == gVsMenuSelection) {
alpha[i] = 255;
} else {
alpha[i] = 32;
}
RCP_SetupDL(&gMasterDisp, SETUPDL_85);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, alpha[i]);
Lib_TextureRect_CI8(&gMasterDisp, sVsLevelTex[i], sVsLevelTLUT[i], 48, 38, xPos, D_menu_801AF2AC, 1.0f, 1.0f);
width = 48;
if (i == 1) {
width = 56;
}
RCP_SetupDL(&gMasterDisp, SETUPDL_83);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, alpha[i]);
Lib_TextureRect_IA8(&gMasterDisp, sVsTextLevelTex[i], width, 10, D_menu_801AF2B4[i], D_menu_801AF2AC + 40.0f,
1.0f, 1.0f);
}
}
void Option_VsStageSelect2_Draw(void) {
static f32 D_menu_801AF2D4 = 69.0f;
static f32 D_menu_801AF2D8 = 110.0f;
static f32 D_menu_801AF2DC = 123.0f;
static f32 D_menu_801AF2E0[] = { 66.0f, 189.0f };
f32 xPos;
s32 i;
s32 alpha[3];
static u8* sVsTextLevelTex[] = {
aVsTextCorneriaTex,
aVsTextSectorZTex,
};
static u8* sVsLevelTex[] = {
aVsCorneriaTex,
aVsSectorZTex,
};
static u16* sVsLevelTLUT[] = {
aVsCorneriaTLUT,
aVsSectorZTLUT,
};
for (xPos = D_menu_801AF2D4, i = 0; i < ARRAY_COUNT(sVsTextLevelTex); i++, xPos += D_menu_801AF2DC) {
if (i == gVsMenuSelection) {
alpha[i] = 255;
} else {
alpha[i] = 32;
}
RCP_SetupDL(&gMasterDisp, SETUPDL_85);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, alpha[i]);
Lib_TextureRect_CI8(&gMasterDisp, sVsLevelTex[i], sVsLevelTLUT[i], 48, 38, xPos, D_menu_801AF2D8, 1.0f, 1.0f);
RCP_SetupDL(&gMasterDisp, SETUPDL_83);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, alpha[i]);
Lib_TextureRect_IA8(&gMasterDisp, sVsTextLevelTex[i], 56, 10, D_menu_801AF2E0[i], D_menu_801AF2D8 + 40.0f, 1.0f,
1.0f);
}
}
void Option_VsOKConfirm_Draw(void) {
s32 pad[2];
s32 colorGB;
s32 bitmask;
Option_Color_FlashRed(&D_menu_801B91E8);
colorGB = D_menu_801B91E8;
bitmask = 0xFFFFFFFF;
if (sOkConfirmTimer != 0) {
colorGB = 255;
bitmask = 0x00000001;
sOkConfirmTimer--;
if (sOkConfirmTimer == 0) {
sVsSubMenuFirstState = true;
}
}
if (gGameFrameCount & bitmask) {
RCP_SetupDL(&gMasterDisp, SETUPDL_83);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, colorGB, colorGB, 255);
Lib_TextureRect_IA8(&gMasterDisp, D_VS_MENU_7003650, 40, 12, 143.0f, 210.0f, 1.0f, 1.0f);
}
}
void Option_VsSelectionArrows_Draw(f32 xPos, f32 yPos, f32 offset, s32 r, s32 g, s32 b) {
RCP_SetupDL(&gMasterDisp, SETUPDL_83);
gDPSetPrimColor(gMasterDisp++, 0, 0, r, g, b, 255);
Lib_TextureRect_IA8_MirX(&gMasterDisp, D_VS_MENU_7004010, 8, 8, xPos, yPos, 1.0f, 1.0f);
Lib_TextureRect_IA8(&gMasterDisp, D_VS_MENU_7004010, 8, 8, xPos + offset, yPos, 1.0f, 1.0f);
}
void Option_AcceptCancel_Draw(void) {
RCP_SetupDL(&gMasterDisp, SETUPDL_83);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, 255);
Lib_TextureRect_IA8(&gMasterDisp, aAtoConfirmTex, 96, 10, 62.0f, 213.0f, 1.0f, 1.0f);
Lib_TextureRect_IA8(&gMasterDisp, aBtoCancelTex, 96, 10, 166.0f, 213.0f, 1.0f, 1.0f);
}
void Option_VsBackToSubMenu(OptionId menuEntryState) {
sMenuEntryState = menuEntryState;
gDrawMode = DRAW_NONE;
sMainMenuState = 0;
D_menu_801B91B4 = 0;
}
// Menu card drawned below the N64 console
void Option_VsMenuCard_Draw(void) {
Option_Menu_Push();
Option_DrawMenuCard(sOptionVSCardList[sVsMenuCursor].frame);
Matrix_Pop(&gGfxMatrix);
Option_DrawCardLabel(sOptionVSCardList[sVsMenuCursor].tex);
}
void Option_DrawMenuLabel(void) {
Option_Menu_Push();
Option_DrawMenuCard(sOptionCardList[sMainMenuCursor].frame);
Matrix_Pop(&gGfxMatrix);
Option_DrawCardLabel(sOptionCardList[sMainMenuCursor].tex);
}
void Option_DrawMenuCard(OptionCardFrame arg0) {
RCP_SetupDL(&gMasterDisp, SETUPDL_17);
Lib_InitOrtho(&gMasterDisp);
Matrix_Push(&gGfxMatrix);
Matrix_Translate(gGfxMatrix, arg0.x, arg0.y, arg0.z, MTXF_APPLY);
Matrix_Scale(gGfxMatrix, arg0.xScale, arg0.yScale, 1.0f, MTXF_APPLY);
Matrix_RotateX(gGfxMatrix, M_DTOR * 90.0f, MTXF_APPLY);
Matrix_SetGfxMtx(&gMasterDisp);
gSPDisplayList(gMasterDisp++, D_OPT_8015550);
Matrix_Pop(&gGfxMatrix);
Lib_InitPerspective(&gMasterDisp);
}
void Option_DrawMenuArwing(ArwingCursorPos arwing) {
if (sDrawCursor) {
Option_DrawArwing(arwing.x, arwing.y, D_menu_801B91F4, sLeftArwingCursorYrot, 90.0f, D_menu_801B91F8, 0);
Option_DrawArwing(arwing.x + arwing.range, arwing.y, D_menu_801B91F4, sRightArwingCursorYrot, -90.0f,
D_menu_801B91F8, 1);
}
}
void Option_DrawArwing(f32 x, f32 y, f32 z, f32 yRot, f32 zRot, f32 scale, s32 index) {
f32 dirX;
f32 dirY;
f32 dirZ;
static int arwingCursorPrevPos = 0;
bool interpolationEnabled;
if (arwingCursorPrevPos != sMainMenuCursor) {
// @port Skip interpolation
FrameInterpolation_ShouldInterpolateFrame(false);
interpolationEnabled = false;
} else {
// @port renable interpolation
FrameInterpolation_ShouldInterpolateFrame(true);
interpolationEnabled = true;
// @port: Tag the transform.
FrameInterpolation_RecordOpenChild("Option_DrawArwing", index);
}
Option_SetMenuLightPos(sArwingLightXrot, sArwingLightYrot, 100.0f, &dirX, &dirY, &dirZ);
Lights_SetOneLight(&gMasterDisp, dirX, dirY, dirZ, sArwingLightColR, sArwingLightColG, sArwingLightColB,
sArwingLightAmbR, sArwingLightAmbG, sArwingLightAmbB);
Matrix_Push(&gGfxMatrix);
Matrix_Translate(gGfxMatrix, x, y, z, MTXF_APPLY);
Matrix_Scale(gGfxMatrix, scale, scale, scale, MTXF_APPLY);
Matrix_RotateZ(gGfxMatrix, M_DTOR * zRot, MTXF_APPLY);
Matrix_RotateY(gGfxMatrix, M_DTOR * yRot, MTXF_APPLY);
Matrix_SetGfxMtx(&gMasterDisp);
RCP_SetupDL_55();
gSPDisplayList(gMasterDisp++, aMapArwingDL);
Matrix_Pop(&gGfxMatrix);
if (interpolationEnabled) {
// @port Pop the transform id.
FrameInterpolation_RecordCloseChild();
} else {
// @port renable interpolation
FrameInterpolation_ShouldInterpolateFrame(true);
}
arwingCursorPrevPos = sMainMenuCursor;
}
void Option_Menu_Push(void) {
Matrix_Push(&gGfxMatrix);
Matrix_LookAt(gGfxMatrix, gCsCamEyeX, gCsCamEyeY, gCsCamEyeZ, gCsCamAtX, gCsCamAtY, gCsCamAtZ, 0.0f, 1.0f, 0.0f,
MTXF_APPLY);
}
void Option_SetMenuLightPos(f32 xRot, f32 yRot, f32 zSrc, f32* dirX, f32* dirY, f32* dirZ) {
Vec3f dest;
Vec3f src;
src.x = 0.0f;
src.y = 0.0f;
src.z = zSrc;
Matrix_RotateY(gCalcMatrix, M_DTOR * yRot, MTXF_NEW);
Matrix_RotateX(gCalcMatrix, M_DTOR * xRot, MTXF_APPLY);
Matrix_MultVec3f(gCalcMatrix, &src, &dest);
*dirX = dest.x;
*dirY = dest.y;
*dirZ = dest.z;
}
void Option_CardLightning_Update(void) {
s32 i;
f32 savedLightningXpos;
if (D_menu_801B9214 != 0) {
savedLightningXpos = sLightningXpos;
Option_Menu_Push();
for (i = 0; i < 3; i++) {
sLightningXScale = RAND_FLOAT(0.5f);
sLightningYScale = 0.5f;
Option_CardLightning_Draw();
sLightningXpos += 6.0f;
}
Matrix_Pop(&gGfxMatrix);
sLightningXpos = savedLightningXpos;
if (sLightningXpos < 23.0f) {
sLightningXpos += 18.0f;
} else {
sLightningXpos = 23.0f;
D_menu_801B9214 = 0;
}
}
}
void Option_CardLightning_Draw(void) {
RCP_SetupDL(&gMasterDisp, SETUPDL_36);
Lib_InitOrtho(&gMasterDisp);
Matrix_Push(&gGfxMatrix);
Matrix_Translate(gGfxMatrix, sLightningXpos, sLightningYpos, 0.0f, MTXF_APPLY);
Matrix_Scale(gGfxMatrix, sLightningXScale, sLightningYScale, 1.0f, MTXF_APPLY);
Matrix_SetGfxMtx(&gMasterDisp);
gSPDisplayList(gMasterDisp++, aLightningDL);
Matrix_Pop(&gGfxMatrix);
Lib_InitPerspective(&gMasterDisp);
}
//! TODO: Enum for Texture types
void Option_DrawCardLabel(OptionCardTexture tex) {
if (!(tex.xScale <= 0.0f) && !(tex.yScale <= 0.0f)) {
switch (tex.type) {
case 1:
RCP_SetupDL(&gMasterDisp, SETUPDL_78);
gDPSetPrimColor(gMasterDisp++, 0, 0, tex.red, tex.green, tex.blue, tex.alpha);
Lib_TextureRect_CI4(&gMasterDisp, tex.texture, tex.palette, tex.width, tex.height, tex.xPos, tex.yPos,
tex.xScale, tex.yScale);
break;
case 2:
RCP_SetupDL(&gMasterDisp, SETUPDL_78);
gDPSetPrimColor(gMasterDisp++, 0, 0, tex.red, tex.green, tex.blue, tex.alpha);
Lib_TextureRect_CI8(&gMasterDisp, tex.texture, tex.palette, tex.width, tex.height, tex.xPos, tex.yPos,
tex.xScale, tex.yScale);
break;
case 0:
RCP_SetupDL(&gMasterDisp, SETUPDL_76);
gDPSetPrimColor(gMasterDisp++, 0, 0, tex.red, tex.green, tex.blue, tex.alpha);
Lib_TextureRect_IA8(&gMasterDisp, tex.texture, tex.width, tex.height, tex.xPos, tex.yPos, tex.xScale,
tex.yScale);
break;
case 3:
RCP_SetupDL(&gMasterDisp, SETUPDL_76);
gDPSetPrimColor(gMasterDisp++, 0, 0, tex.red, tex.green, tex.blue, tex.alpha);
Lib_TextureRect_RGBA16(&gMasterDisp, tex.texture, tex.width, tex.height, tex.xPos, tex.yPos, tex.xScale,
tex.yScale);
break;
}
}
}
// Input for vertical movement of the cursor
bool Option_Input_MoveCursor_Y(s32* arg0, s32 arg1, bool arg2, s32 arg3, s32 arg4, s32 arg5, s32 arg6, s32 arg7,
StickInput* stick) {
s32 axis;
s32 x;
s32 y;
s32 temp;
bool ret = false;
if (arg1 == 0) {
return ret;
}
temp = *arg0;
x = gControllerPress[arg7].stick_x;
y = -gControllerPress[arg7].stick_y;
if (arg2 == true) {
axis = y;
if ((x > 40) || (x < -40)) {
return ret;
}
} else {
axis = x;
if ((y > 40) || (y < -40)) {
return ret;
}
}
if ((axis < arg4) && (axis > -arg4)) {
axis = 0;
}
if (!(stick->unk_4)) {
if (axis != 0) {
if (axis > 0) {
(*arg0)++;
if (*arg0 > arg1) {
if (arg3 == 0) {
*arg0 = 0;
} else {
*arg0 = arg1;
}
}
}
if (axis < 0) {
(*arg0)--;
if (*arg0 < 0) {
if (arg3 == 0) {
*arg0 = arg1;
} else {
*arg0 = 0;
}
}
}
stick->unk_4 = arg5 + stick->unk_0;
if (stick->unk_0 > 0) {
stick->unk_0 -= arg6;
}
} else {
stick->unk_4 = 0;
stick->unk_0 = arg6;
}
}
if (((gControllerPress[0].button & D_JPAD) || (gControllerPress[0].button & U_JPAD)) && (arg2 == true)) {
if (gControllerPress[0].button & D_JPAD) {
(*arg0)++;
if (*arg0 > arg1) {
if (arg3 == 0) {
*arg0 = 0;
} else {
*arg0 = arg1;
}
}
}
if (gControllerPress[0].button & U_JPAD) {
(*arg0)--;
if (*arg0 < 0) {
if (arg3 == 0) {
*arg0 = arg1;
} else {
*arg0 = 0;
}
}
}
stick->unk_4 = arg5 + stick->unk_0;
if (stick->unk_0 > 0) {
stick->unk_0 -= arg6;
}
} else if (((gControllerPress[0].button & L_JPAD) || (gControllerPress[0].button & R_JPAD)) && (arg2 == false)) {
if (gControllerPress[0].button & R_JPAD) {
(*arg0)++;
if (*arg0 > arg1) {
if (arg3 == 0) {
*arg0 = 0;
} else {
*arg0 = arg1;
}
}
}
if (gControllerPress[0].button & L_JPAD) {
(*arg0)--;
if (*arg0 < 0) {
if (arg3 == 0) {
*arg0 = arg1;
} else {
*arg0 = 0;
}
}
}
stick->unk_4 = arg5 + stick->unk_0;
if (stick->unk_0 > 0) {
stick->unk_0 -= arg6;
}
}
if (stick->unk_4 > 0) {
stick->unk_4--;
}
if (temp != *arg0) {
ret = true;
}
return ret;
}
// Input for horizontal selection in DataSelect
s32 Option_Input_DataSelect_X(s32* arg0) {
s32 ret = 0;
s32 temp = *arg0;
s32 x = +gControllerPress[gMainController].stick_x;
s32 y = -gControllerPress[gMainController].stick_y;
if ((y > 40) || (y < -40)) {
return ret;
}
if ((x < 30) && (x > -30)) {
x = 0;
}
if (D_menu_801B91A0 == 0) {
// @port: D_PAD control
if (gControllerPress[0].button & R_JPAD) {
*arg0 = 0;
ret = 1;
D_menu_801B91A0 = 6;
} else if (gControllerPress[0].button & L_JPAD) {
*arg0 = 1;
ret = -1;
D_menu_801B91A0 = 6;
}
if (x != 0) {
if (x > 0) {
*arg0 = 0;
ret = 1;
}
if (x < 0) {
*arg0 = 1;
ret = -1;
}
D_menu_801B91A0 = 6;
}
}
if (D_menu_801B91A0 > 0) {
D_menu_801B91A0--;
}
if (temp == *arg0) {
ret = 0;
}
return ret;
}
// Input for horizontal selection in Sound menus
bool Option_Input_Sound_X(f32* arg0, f32 arg1, f32 arg2, StickInput* arg3) {
f32 var_fv1;
f32 temp2;
bool var_a2 = false;
f32 temp = *arg0;
s32 stickX = +gControllerPress[gMainController].stick_x;
s32 stickY = -gControllerPress[gMainController].stick_y;
static int holdTimer = 0;
if (gControllerHold[gMainController].button & (L_JPAD | R_JPAD)) {
holdTimer++;
} else {
holdTimer = 0;
}
if ((stickY > 10) || (stickY < -10)) {
return 0;
}
if ((stickX < 10) && (stickX > -10)) {
stickX = 0;
} else if (stickX < 0) {
stickX += 10;
} else {
stickX -= 10;
}
if (arg3->unk_4 == 0) {
if (stickX != 0) {
var_fv1 = stickX / 20.0f;
arg3->unk_4 = arg3->unk_0;
if (arg3->unk_0 != 0) {
arg3->unk_0 -= 7;
}
if (arg3->unk_4 != 0) {
if (stickX > 0) {
var_fv1 = 1.0f;
} else {
var_fv1 = -1.0f;
}
}
*arg0 += var_fv1;
if (arg2 < *arg0) {
*arg0 = arg2;
}
if (*arg0 < arg1) {
*arg0 = arg1;
}
} else {
arg3->unk_4 = 0;
arg3->unk_0 = 7;
}
}
if (gControllerPress[gMainController].button & R_JPAD) {
stickX += 10;
} else if (gControllerPress[gMainController].button & L_JPAD) {
stickX -= 10;
}
if (holdTimer > 15) {
if (gControllerHold[gMainController].button & L_JPAD) {
var_fv1 = -1.0f;
} else if (gControllerHold[gMainController].button & R_JPAD) {
var_fv1 = 1.0f;
}
*arg0 += var_fv1;
if (arg2 < *arg0) {
*arg0 = arg2;
}
if (*arg0 < arg1) {
*arg0 = arg1;
}
}
if (gControllerPress[gMainController].button & L_JPAD) {
var_fv1 = -1.0f;
*arg0 += var_fv1;
if (arg2 < *arg0) {
*arg0 = arg2;
}
if (*arg0 < arg1) {
*arg0 = arg1;
}
} else if (gControllerPress[gMainController].button & R_JPAD) {
var_fv1 = 1.0f;
*arg0 += var_fv1;
if (arg2 < *arg0) {
*arg0 = arg2;
}
if (*arg0 < arg1) {
*arg0 = arg1;
}
}
if (arg3->unk_4 > 0) {
arg3->unk_4--;
}
temp2 = *arg0;
if ((s32) temp2 != (s32) temp) {
AUDIO_PLAY_SFX(NA_SE_COUNT_UP, gDefaultSfxSource, 4);
var_a2 = true;
}
return var_a2;
}
void Option_Color_FlashRed(f32* color) {
if ((s32) Math_SmoothStepToF(color, D_menu_801B91E4, 0.5f, 100.0f, 1.0f) == 0.0f) {
if (*color == 32.0f) {
D_menu_801B91E4 = 255.0f;
} else {
D_menu_801B91E4 = 32.0f;
}
}
}
s32 Option_RankInPos_Check(void) {
s32 i;
s32 j;
s32 k;
s32 m;
s32 rankInPos;
s32 missionTeamStatus = 0;
s32 rankingTeamAlive = 0;
s32 rankingLives[10];
for (i = 0; i < gMissionNumber + 1; i++) {
missionTeamStatus += ((gMissionTeamStatus[i] & TEAMSTATUS_PEPPY) >> 16) & 1;
missionTeamStatus += ((gMissionTeamStatus[i] & TEAMSTATUS_SLIPPY) >> 8) & 1;
missionTeamStatus += (gMissionTeamStatus[i] & TEAMSTATUS_FALCO) & 1;
}
for (i = 0; i < RANKING_MAX; i++) {
rankingLives[i] = gSaveFile.save.data.rankingLives[i];
}
rankInPos = -1; // Didn't get into the ranking
// Ranking
for (i = 0; i < RANKING_MAX; i++) {
if (gTotalHitsRanking[i] <= gTotalHits) {
if (gTotalHitsRanking[i] == gTotalHits) {
for (j = i; j < RANKING_MAX; j++) {
if (gTotalHitsRanking[j] != gTotalHits) {
rankInPos = j;
break;
}
// Lives count
if (rankingLives[j] <= gLifeCount[gPlayerNum]) {
if (rankingLives[j] == gLifeCount[gPlayerNum]) {
for (k = j; k < RANKING_MAX; k++) {
if ((rankingLives[k] != gLifeCount[gPlayerNum]) ||
(gTotalHitsRanking[k] != gTotalHits)) {
rankInPos = k;
break;
}
// Team count
for (rankingTeamAlive = 0, m = 0; m < 3; m++) {
rankingTeamAlive += gRankingTeamAlive[k][m];
}
if (missionTeamStatus > rankingTeamAlive) {
rankInPos = k;
break;
}
}
} else {
rankInPos = j;
}
break;
}
}
} else {
rankInPos = i;
}
break;
}
}
return rankInPos;
}
void Option_NameEntry_Update(void) {
switch (sMainMenuState) {
case 0:
Option_NameEntry_Setup();
sMainMenuState++;
break;
case 1:
Option_NameEntry_Select();
break;
case 2:
Option_Ranking_SaveData();
Title_GetRankTotalHits();
D_menu_801B917C = 15;
sMainMenuState++;
break;
case 3:
if (D_menu_801B917C == 0) {
gBlurAlpha = 255;
gDrawMode = DRAW_NONE;
sMainMenuState = 0;
sMenuEntryState = OPTION_SCORE;
}
break;
}
}
void Option_NameEntry_Setup(void) {
s32 temp;
s32 i;
AUDIO_PLAY_BGM(NA_BGM_SELECT);
gBlurAlpha = 208;
gStarCount = 800;
D_menu_801B9130 = 1;
D_menu_801B9128 = 0;
sNameEntryLightXrot = 0.0f;
sNameEntryLightYrot = 70.0f;
temp = gSaveFile.save.data.unk_EA & 0xFF;
if (temp < 10) {
D_menu_801B9098 = 3;
D_menu_801B9138 = 1;
D_menu_801B9150[0][0] = gSaveFile.save.data.rankNameEntry[temp][0] & 0xFF;
D_menu_801B9150[1][0] = gSaveFile.save.data.rankNameEntry[temp][1] & 0xFF;
D_menu_801B9150[2][0] = gSaveFile.save.data.rankNameEntry[temp][2] & 0xFF;
for (i = 0; i < 3; i++) {
D_menu_801B90A0[i] = Option_GetCharIndex(D_menu_801B9150[i][0]);
D_menu_801B90B0[i] = 1;
D_menu_801B9150[i][1] = 0;
}
} else {
D_menu_801B9098 = 0;
D_menu_801B9138 = 0;
for (i = 0; i < 3; i++) {
D_menu_801B90B0[i] = 0;
D_menu_801B90A0[i] = 0;
D_menu_801B9150[i][0] = 65;
D_menu_801B9150[i][1] = 0;
}
}
Option_PlanetTextures_Setup();
}
void Option_NameEntry_Select(void) {
switch (D_menu_801B9128) {
case 0:
if ((D_menu_801B9138 == 0) &&
(Option_Input_MoveCursor_Y(&D_menu_801B90A0[D_menu_801B9098], 36, 0, 0, 50, 5, 10, gMainController,
&D_menu_801B9160[D_menu_801B9098]))) {
AUDIO_PLAY_SFX(NA_SE_CURSOR, gDefaultSfxSource, 4);
D_menu_801B9150[D_menu_801B9098][0] = sCharMap[D_menu_801B90A0[D_menu_801B9098]];
D_menu_801B90D0[D_menu_801B9098] = 0.0f;
D_menu_801B9100[D_menu_801B9098] = 0.0f;
}
if (gControllerPress[gMainController].button & A_BUTTON) {
D_menu_801B90D0[D_menu_801B9098] = 0.0f;
if (D_menu_801B9138 != 0) {
AUDIO_PLAY_SFX(NA_SE_DECIDE, gDefaultSfxSource, 4);
D_menu_801B9140[0] = 10;
D_menu_801B9140[1] = 10;
D_menu_801B9140[2] = 10;
D_menu_801B9138 = -1;
D_menu_801B9128 = 2;
break;
}
if (D_menu_801B9098 < 3) {
AUDIO_PLAY_SFX(NA_SE_DECIDE, gDefaultSfxSource, 4);
D_menu_801B90D0[D_menu_801B9098] = 0.0f;
D_menu_801B9140[D_menu_801B9098] = 15;
D_menu_801B9128 = 1;
break;
}
}
if ((gControllerPress[gMainController].button & B_BUTTON) && (D_menu_801B9098 != 0)) {
AUDIO_PLAY_SFX(NA_SE_CANCEL, gDefaultSfxSource, 4);
if (D_menu_801B9138 != 0) {
D_menu_801B9138 = 0;
}
D_menu_801B9098--;
D_menu_801B9140[D_menu_801B9098] = 15;
D_menu_801B9128 = 10;
}
break;
case 10:
D_menu_801B9140[D_menu_801B9098]--;
if (D_menu_801B9140[D_menu_801B9098] == 0) {
D_menu_801B9128 = 0;
}
break;
case 1:
D_menu_801B9140[D_menu_801B9098]--;
if (D_menu_801B9140[D_menu_801B9098] == 0) {
if ((D_menu_801B9098 + 1) > 2) {
D_menu_801B9138 = 1;
}
D_menu_801B9098++;
D_menu_801B9128 = 0;
}
break;
case 2:
D_menu_801B9140[0]--;
D_menu_801B9140[1]--;
D_menu_801B9140[2]--;
if (D_menu_801B9140[0] != 0) {
break; // looks fake
}
D_menu_801B917C = 20;
D_menu_801B9128 = 3;
break;
case 3:
if (D_menu_801B917C == 0) {
sMainMenuState = 2;
}
break;
}
}
void Option_NameEntry_Draw(void) {
static f32 D_menu_801AF300[] = { -120.0f, 0.0f, 120.0f };
f32 dirX;
f32 dirY;
f32 dirZ;
s32 bitmask[3];
s32 i;
static f32 D_menu_801AF30C[6] = { 51.0f, 138.0f, 118.0f, 166.0f, 138.0f, 267.0f };
static f32 D_menu_801AF324[6] = { 29.0f, 49.0f, 145.0f, 155.0f, 87.0f, 127.0f };
RCP_SetupDL(&gMasterDisp, SETUPDL_76);
if (gLastGameState == GSTATE_ENDING) {
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, 255);
Graphics_DisplayLargeText(D_menu_801AF30C[0], D_menu_801AF324[0], 1.0f, 1.0f, "CONGRATULATIONS");
}
if (D_menu_801B9178 != 0) {
return;
}
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 0, 255);
Graphics_DisplaySmallText(D_menu_801AF30C[1], D_menu_801AF324[1], 1.0f, 1.0f, "RANK");
Graphics_DisplaySmallText(D_menu_801AF30C[2], D_menu_801AF324[2], 1.0f, 1.0f, "TOTAL HITS");
PRINTF("p:%d x:%f y:%f\n");
if (D_menu_801B9138 == 1) {
if ((gGameFrameCount & 0x10) != 0) {
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 0, 255);
Lib_TextureRect_IA8(&gMasterDisp, aTextEnd, 32, 8, D_menu_801AF30C[5], D_menu_801AF324[5], 1.0f, 1.0f);
}
}
Option_OrdinalNumbers_Draw(sRankInPos, D_menu_801AF30C[4], D_menu_801AF324[4]);
RCP_SetupDL(&gMasterDisp, SETUPDL_76);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, 255);
Graphics_DisplayLargeNumber(D_menu_801AF30C[3] - ((HUD_CountDigits(gTotalHits) - 1) * 13), D_menu_801AF324[3],
gTotalHits);
Map_801A9FD4(true);
Option_ScrollPlanetTexture();
for (i = 0; i < 3; i++) {
if (i == D_menu_801B9098) {
D_menu_801B9100[i] += 1.0f;
} else {
D_menu_801B9100[i] = 0.0f;
}
bitmask[i] = 0xFFFFFFFF;
if (D_menu_801B9140[i] != 0) {
bitmask[i] = 0x00000001;
D_menu_801B9100[i] = 0.0f;
}
}
Option_SetMenuLightPos(sNameEntryLightXrot, sNameEntryLightYrot, 127.0f, &dirX, &dirY, &dirZ);
Lights_SetOneLight(&gMasterDisp, dirX, dirY, dirZ, 255, 255, 255, 65, 70, 48);
Matrix_Push(&gGfxMatrix);
Matrix_LookAt(gGfxMatrix, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -100.0f, 0.0f, 1.0f, 0.0f, MTXF_APPLY);
Matrix_SetGfxMtx(&gMasterDisp);
for (i = 0; i < 3; i++) {
if (gGameFrameCount & bitmask[i]) {
Option_3DFont_Draw(D_menu_801B9150[i][0], D_menu_801AF300[i], 18.0f, -455.0f, 1.0f,
D_menu_801B90C0[i] + D_menu_801B90F0[i], D_menu_801B90D0[i] + D_menu_801B9100[i],
D_menu_801B90E0[i] + D_menu_801B9110[i]);
}
}
Matrix_Pop(&gGfxMatrix);
}
void Option_Ranking_SaveData(void) {
s32 i;
s32 j;
s32 missionHitCount;
s32 originalRankIdx;
PlanetId planetId;
s32 currentRankIdx;
u8 rankNameEntry[11][3];
u8 rankingRoute[11];
u8 rankingLives[11];
u8 rankingMedal[11];
PlanetStats planetStats[11][7];
rankNameEntry[10][0] = D_menu_801B9150[0][0];
rankNameEntry[10][1] = D_menu_801B9150[1][0];
rankNameEntry[10][2] = D_menu_801B9150[2][0];
rankingRoute[10] = gMissionNumber + 1;
rankingLives[10] = gLifeCount[0];
rankingMedal[10] = 0;
for (i = 0; i < ROUTE_MAX; i++) {
rankingMedal[10] |= (gMissionMedal[i] << i);
}
for (j = 0; j < ROUTE_MAX; j++) {
planetStats[10][j].unk_C = 0;
missionHitCount = gMissionHitCount[j];
if (missionHitCount > 255) {
missionHitCount -= 256;
planetStats[10][j].unk_C = 1;
}
planetStats[10][j].hitCount = missionHitCount;
planetId = gMissionPlanet[j];
if (gMissionPlanet[j] == PLANET_VENOM) {
planetId = SAVE_SLOT_VENOM_1;
}
if (gMissionPlanet[j] == PLANET_SOLAR) {
planetId = SAVE_SLOT_SOLAR;
}
planetStats[10][j].planetId = planetId;
planetStats[10][j].peppyAlive = ((gMissionTeamStatus[j] & TEAMSTATUS_PEPPY) >> 16) & 1;
planetStats[10][j].slippyAlive = ((gMissionTeamStatus[j] & TEAMSTATUS_SLIPPY) >> 8) & 1;
planetStats[10][j].falcoAlive = (gMissionTeamStatus[j] & TEAMSTATUS_FALCO) & 1;
}
for (i = 0; i < RANKING_MAX; i++) {
rankNameEntry[i][0] = gSaveFile.save.data.rankNameEntry[i][0];
rankNameEntry[i][1] = gSaveFile.save.data.rankNameEntry[i][1];
rankNameEntry[i][2] = gSaveFile.save.data.rankNameEntry[i][2];
rankingRoute[i] = gSaveFile.save.data.rankingRoute[i];
rankingLives[i] = gSaveFile.save.data.rankingLives[i];
rankingMedal[i] = gSaveFile.save.data.rankingMedal[i];
for (j = 0; j < ROUTE_MAX; j++) {
planetStats[i][j].hitCount = gSaveFile.save.data.stats[i][j].hitCount;
planetStats[i][j].planetId = gSaveFile.save.data.stats[i][j].planetId;
planetStats[i][j].unk_C = gSaveFile.save.data.stats[i][j].unk_C;
planetStats[i][j].peppyAlive = gSaveFile.save.data.stats[i][j].peppyAlive;
planetStats[i][j].falcoAlive = gSaveFile.save.data.stats[i][j].falcoAlive;
planetStats[i][j].slippyAlive = gSaveFile.save.data.stats[i][j].slippyAlive;
}
}
for (currentRankIdx = 0, i = 0; i < RANKING_MAX; i++) {
if (i == sRankInPos) {
originalRankIdx = currentRankIdx;
currentRankIdx = 10;
}
gSaveFile.save.data.rankNameEntry[i][0] = rankNameEntry[currentRankIdx][0];
gSaveFile.save.data.rankNameEntry[i][1] = rankNameEntry[currentRankIdx][1];
gSaveFile.save.data.rankNameEntry[i][2] = rankNameEntry[currentRankIdx][2];
gSaveFile.save.data.rankingRoute[i] = rankingRoute[currentRankIdx];
gSaveFile.save.data.rankingLives[i] = rankingLives[currentRankIdx];
gSaveFile.save.data.rankingMedal[i] = rankingMedal[currentRankIdx];
for (j = 0; j < ROUTE_MAX; j++) {
gSaveFile.save.data.stats[i][j].hitCount = planetStats[currentRankIdx][j].hitCount;
gSaveFile.save.data.stats[i][j].planetId = planetStats[currentRankIdx][j].planetId;
gSaveFile.save.data.stats[i][j].unk_C = planetStats[currentRankIdx][j].unk_C;
gSaveFile.save.data.stats[i][j].peppyAlive = planetStats[currentRankIdx][j].peppyAlive;
gSaveFile.save.data.stats[i][j].falcoAlive = planetStats[currentRankIdx][j].falcoAlive;
gSaveFile.save.data.stats[i][j].slippyAlive = planetStats[currentRankIdx][j].slippyAlive;
}
if (i == sRankInPos) {
currentRankIdx = originalRankIdx;
} else {
currentRankIdx++;
}
}
gSaveFile.save.data.unk_EA = sRankInPos;
Save_Write();
}
void Option_3DFont_Draw(s32 character, f32 x, f32 y, f32 z, f32 scale, f32 xAngle, f32 yAngle, f32 zAngle) {
static Gfx* s3DFont[37] = {
aFont3D_A, aFont3D_B, aFont3D_C, aFont3D_D, aFont3D_E, aFont3D_F, aFont3D_G, aFont3D_H, aFont3D_I, aFont3D_J,
aFont3D_K, aFont3D_L, aFont3D_M, aFont3D_N, aFont3D_O, aFont3D_P, aFont3D_Q, aFont3D_R, aFont3D_S, aFont3D_T,
aFont3D_U, aFont3D_V, aFont3D_W, aFont3D_X, aFont3D_Y, aFont3D_Z, aFont3D_0, aFont3D_1, aFont3D_2, aFont3D_3,
aFont3D_4, aFont3D_5, aFont3D_6, aFont3D_7, aFont3D_8, aFont3D_9, aFont3D_DOT,
};
s32 i;
s32 charIndex = -1;
for (i = 0; sCharMap[i] != NULL; i++) {
if (character == sCharMap[i]) {
charIndex = i;
break;
}
}
if (charIndex == -1) {
return;
}
RCP_SetupDL(&gMasterDisp, SETUPDL_23);
gSPTexture(gMasterDisp++, 2500, 200, 0, G_TX_RENDERTILE, G_ON);
gSPSetGeometryMode(gMasterDisp++, G_TEXTURE_GEN);
Matrix_Push(&gGfxMatrix);
Matrix_Translate(gGfxMatrix, x, y, z, MTXF_APPLY);
Matrix_RotateZ(gGfxMatrix, M_DTOR * zAngle, MTXF_APPLY);
Matrix_RotateX(gGfxMatrix, M_DTOR * xAngle, MTXF_APPLY);
Matrix_RotateY(gGfxMatrix, M_DTOR * yAngle, MTXF_APPLY);
Matrix_Scale(gGfxMatrix, scale, scale, scale, MTXF_APPLY);
Matrix_SetGfxMtx(&gMasterDisp);
gSPDisplayList(gMasterDisp++, s3DFont[charIndex]);
Matrix_Pop(&gGfxMatrix);
}
s32 Option_GetCharIndex(s32 character) {
s32 charIdx = 0;
// 'for()' causes instruction reorder
while (sCharMap[charIdx] != 0) {
if (sCharMap[charIdx] == character) {
break;
}
charIdx++;
}
if (sCharMap[charIdx] == 0) {
charIdx = 0;
}
return charIdx;
}
void Option_Score_Update(void) {
switch (sMainMenuState) {
case 0:
Option_Ranking_Setup();
D_menu_801B93E4 = sRankInPos;
if ((sRankInPos < 0) || (sRankInPos >= 10)) {
D_menu_801B93E4 = 0;
}
D_menu_801B91D4 = 114.0f - D_menu_801B93E4 * 130.0f;
D_menu_801B91D8 = -6.0f + D_menu_801B93E4 * 130.0f;
sOptionCardList[3].tex.xPos = sOptionCardCurTextPosX[3];
sOptionCardList[3].tex.yPos = 23.0f;
sOptionCardList[3].tex.xScale = 1.0f;
sOptionCardList[3].tex.yScale = 1.0f;
sOptionCardList[3].drawTex = true;
sOptionCardList[3].frame.y = 90.0f;
sOptionCardList[3].frame.xScale = 0.4f;
sOptionCardList[3].frame.yScale = 0.21f;
sOptionCardList[3].drawFrame = true;
sMainMenuState++;
break;
case 1:
Option_Score_Update2();
break;
}
}
void Option_Score_Update2(void) {
Option_Ranking2_Cursor();
if (gControllerPress[gMainController].button &
(START_BUTTON | A_BUTTON | B_BUTTON | D_CBUTTONS | L_CBUTTONS | U_CBUTTONS)) {
AUDIO_PLAY_SFX(NA_SE_DECIDE, gDefaultSfxSource, 4);
gDrawMode = DRAW_NONE;
sMainMenuState = 0;
if (gLastGameState == GSTATE_GAME_OVER) {
gStarCount = 0;
gGameState = GSTATE_INIT;
gLifeCount[0] = 2;
gTotalHits = 0;
} else if (gLastGameState == GSTATE_ENDING) {
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM, 1);
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_FANFARE, 1);
sMenuEntryState = OPTION_INVOICE;
}
}
}
void Option_Score_Draw(void) {
Option_RankingMenu2_Draw();
Option_Menu_Push();
Option_DrawMenuCard(sOptionCardList[3].frame);
Matrix_Pop(&gGfxMatrix);
Option_DrawCardLabel(sOptionCardList[3].tex);
}
void Option_Invoice_Update(void) {
switch (sMainMenuState) {
case 0:
gStarCount = 0;
gBgColor = 0;
gFillScreenRed = 0;
gFillScreenGreen = 0;
gFillScreenBlue = 0;
gFillScreenAlpha = 0;
D_menu_801B9090 = 0;
D_menu_801B9178 = 30;
sMainMenuState++;
break;
case 1:
if (D_menu_801B9178 == 0) {
if (((gTotalHits * 64) >= 50000) && ((gTotalHits * 64) < 70000)) {
AUDIO_PLAY_SFX(NA_SE_VO_PEPPER_CONSENT, gDefaultSfxSource, 4);
}
if ((gTotalHits * 64) >= 70000) {
AUDIO_PLAY_SFX(NA_SE_VO_PEPPER_SURPRISE, gDefaultSfxSource, 4);
}
D_menu_801B9178 = 20;
sMainMenuState++;
}
break;
case 2:
if ((D_menu_801B9178 == 0) &&
(gControllerPress[gMainController].button &
(START_BUTTON | A_BUTTON | B_BUTTON | D_CBUTTONS | L_CBUTTONS | U_CBUTTONS))) {
AUDIO_PLAY_SFX(NA_SE_STARFOX_SEAL, gDefaultSfxSource, 4);
D_menu_801B9090 = 1;
D_menu_801B9178 = 60;
sMainMenuState++;
}
break;
case 3:
if (D_menu_801B9178 == 0) {
gStarCount = 0;
gGameState = GSTATE_INIT;
gDrawMode = DRAW_NONE;
*gLifeCount = 2;
gTotalHits = 0;
}
break;
}
}
void Option_InvoiceDraw(void) {
s32 i;
s32 temp_a0;
static f32 D_menu_801AF3D0[8] = { 96.0f, 31.0f, 32.0f, 80.0f, 86.0f, 213.0f, 275.0f, 276.0f };
static f32 D_menu_801AF3F0[8] = { 24.0f, 57.0f, 92.0f, 162.0f, 163.0f, 171.0f, 103.0f, 131.0f };
static s32 D_menu_801AF410 = 0;
Graphics_FillRectangle(&gMasterDisp, 25, 18, SCREEN_WIDTH - 25, SCREEN_HEIGHT - 18, 255, 255, 255, 255);
RCP_SetupDL(&gMasterDisp, SETUPDL_78);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, 255);
Lib_TextureRect_CI4(&gMasterDisp, D_OPT_8000000, D_OPT_8000680, 128, 16, D_menu_801AF3D0[0], D_menu_801AF3F0[0],
1.0f, 1.0f);
Lib_TextureRect_CI4(&gMasterDisp, D_OPT_8000000 + 128 * 16 / 2, D_OPT_8000680, 128, 10, D_menu_801AF3D0[0],
D_menu_801AF3F0[0] + 16.0f, 1.0f, 1.0f);
for (i = 0; i < 2; i++) {
Lib_TextureRect_CI4(&gMasterDisp, D_OPT_80006A0 + (256 * 16 * i) / 2, D_OPT_80017A0, 256, 16,
D_menu_801AF3D0[1], D_menu_801AF3F0[1] + (16 * i), 1.0f, 1.0f);
}
Lib_TextureRect_CI4(&gMasterDisp, D_OPT_80006A0 + 256 * 32 / 2, D_OPT_80017A0, 256, 2, D_menu_801AF3D0[1],
D_menu_801AF3F0[1] + 32.0f, 1.0f, 1.0f);
for (i = 0; i < 4; i++) {
Lib_TextureRect_CI4(&gMasterDisp, D_OPT_80017C0 + (256 * 16 * i) / 2, D_OPT_80038C0, 256, 16,
D_menu_801AF3D0[2], D_menu_801AF3F0[2] + (16 * i), 1.0f, 1.0f);
}
Lib_TextureRect_CI4(&gMasterDisp, D_OPT_80017C0 + 256 * 16 * 4 / 2, D_OPT_80038C0, 256, 2, D_menu_801AF3D0[2],
D_menu_801AF3F0[2] + 64.0f, 1.0f, 1.0f);
RCP_SetupDL(&gMasterDisp, SETUPDL_76);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, 255);
for (i = 0; i < 30; i++) {
Lib_TextureRect_RGBA16(&gMasterDisp, D_OPT_800E170 + (188 * 2 * i), 188, 2, D_menu_801AF3D0[3],
D_menu_801AF3F0[3] + (2.0f * i), 1.0f, 1.0f);
}
gDPSetPrimColor(gMasterDisp++, 0, 0, 0, 0, 0, 255);
Graphics_DisplayLargeNumber(D_menu_801AF3D0[6] - ((HUD_CountDigits(gTotalHits) - 1) * 13), D_menu_801AF3F0[6],
gTotalHits);
temp_a0 = gTotalHits * 64;
Graphics_DisplayLargeNumber(D_menu_801AF3D0[7] - ((HUD_CountDigits(temp_a0) - 1) * 13), D_menu_801AF3F0[7],
temp_a0);
if (D_menu_801B9090) {
gDPSetPrimColor(gMasterDisp++, 0, 0, 120, 0, 0, 192);
for (i = 0; i < 3; i++) {
Lib_TextureRect_IA8(&gMasterDisp, D_OPT_800D1F0 + (80 * 16 * i), 80, 16, D_menu_801AF3D0[5],
D_menu_801AF3F0[5] + (16.0f * i), 1.0f, 1.0f);
}
}
/**
* Debug: The following code was probably left out by mistake,
* It lets you move the graphics on the bill at the end with the 4th controller,
* programmers probably used it to know which position values to hardcode in place.
*/
if (gControllerPress[3].button & R_TRIG) {
D_menu_801AF410++;
if (D_menu_801AF410 > 7) {
D_menu_801AF410 = 0;
}
}
if (gControllerPress[3].button & L_TRIG) {
D_menu_801AF410--;
if (D_menu_801AF410 < 0) {
D_menu_801AF410 = 7;
}
}
if (gControllerHold[3].button & U_JPAD) {
D_menu_801AF3F0[D_menu_801AF410] -= 1.0f;
}
if (gControllerHold[3].button & D_JPAD) {
D_menu_801AF3F0[D_menu_801AF410] += 1.0f;
}
if (gControllerHold[3].button & L_JPAD) {
D_menu_801AF3D0[D_menu_801AF410] -= 1.0f;
}
if (gControllerHold[3].button & R_JPAD) {
D_menu_801AF3D0[D_menu_801AF410] += 1.0f;
}
}