mirror of
https://github.com/HarbourMasters/Starship.git
synced 2025-03-14 20:04:01 +03:00
577 lines
23 KiB
C
577 lines
23 KiB
C
#include "prevent_bss_reordering.h"
|
|
#include "global.h"
|
|
#include "sf64dma.h"
|
|
#include "assets/ast_logo.h"
|
|
|
|
f32 D_game_80161A10;
|
|
f32 D_game_80161A14;
|
|
s32 gPlayerInactive[4];
|
|
s32 D_game_80161A28;
|
|
u8 D_game_80161A2C;
|
|
u16 gNextLevelStage;
|
|
u16 gNextLevel;
|
|
u16 gNextGameState;
|
|
u16 D_game_80161A34;
|
|
u16 gBgColor;
|
|
u8 gBlurAlpha;
|
|
u8 D_game_80161A39;
|
|
f32 D_game_80161A3C;
|
|
f32 D_game_80161A40;
|
|
f32 D_game_80161A44;
|
|
|
|
s32 gShowCrosshairs[4] = { true, true, true, true };
|
|
s32 D_game_800D2870 = 0;
|
|
static s32 sVsCameraULx[] = { 0, SCREEN_WIDTH / 2, 0, SCREEN_WIDTH / 2 };
|
|
static s32 sVsCameraLRx[] = { SCREEN_WIDTH / 2 - 1, SCREEN_WIDTH - 1, SCREEN_WIDTH / 2 - 1, SCREEN_WIDTH - 1 };
|
|
static s32 sVsCameraULy[] = { 0, 0, SCREEN_HEIGHT / 2, SCREEN_HEIGHT / 2 };
|
|
static s32 sVsCameraLRy[] = { SCREEN_HEIGHT / 2 - 1, SCREEN_HEIGHT / 2 - 1, SCREEN_HEIGHT - 1, SCREEN_HEIGHT - 1 };
|
|
static s32 sOverlaySetups[] = {
|
|
/* LEVEL_CORNERIA */ OVL_SETUP_CORNERIA,
|
|
/* LEVEL_METEO */ OVL_SETUP_METEO,
|
|
/* LEVEL_SECTOR_X */ OVL_SETUP_SECTOR_X,
|
|
/* LEVEL_AREA_6 */ OVL_SETUP_AREA_6,
|
|
/* LEVEL_UNK_4 */ OVL_SETUP_UNK_4,
|
|
/* LEVEL_SECTOR_Y */ OVL_SETUP_SECTOR_Y,
|
|
/* LEVEL_VENOM_1 */ OVL_SETUP_VENOM_1,
|
|
/* LEVEL_SOLAR */ OVL_SETUP_SOLAR,
|
|
/* LEVEL_ZONESS */ OVL_SETUP_ZONESS,
|
|
/* LEVEL_VENOM_ANDROSS */ OVL_SETUP_VENOM_ANDROSS,
|
|
/* LEVEL_TRAINING */ OVL_SETUP_TRAINING,
|
|
/* LEVEL_MACBETH */ OVL_SETUP_MACBETH,
|
|
/* LEVEL_TITANIA */ OVL_SETUP_TITANIA,
|
|
/* LEVEL_AQUAS */ OVL_SETUP_AQUAS,
|
|
/* LEVEL_FORTUNA */ OVL_SETUP_FORTUNA,
|
|
/* LEVEL_UNK_15 */ OVL_SETUP_TITLE,
|
|
/* LEVEL_KATINA */ OVL_SETUP_KATINA,
|
|
/* LEVEL_BOLSE */ OVL_SETUP_BOLSE,
|
|
/* LEVEL_SECTOR_Z */ OVL_SETUP_SECTOR_Z,
|
|
/* LEVEL_VENOM_2 */ OVL_SETUP_VENOM_2,
|
|
/* LEVEL_VERSUS */ OVL_SETUP_VERSUS,
|
|
};
|
|
|
|
void Game_Initialize(void) {
|
|
Memory_FreeAll();
|
|
Rand_Init();
|
|
Rand_SetSeed(1, 29000, 9876);
|
|
gGameState = GSTATE_BOOT;
|
|
gNextGameStateTimer = 0;
|
|
gBgColor = 0;
|
|
gBlurAlpha = 255;
|
|
D_game_80161A3C = 45.0f;
|
|
D_game_80161A40 = 10.0f;
|
|
D_game_80161A44 = 12800.0f;
|
|
D_game_80161A10 = D_game_80161A14 = 0.0f;
|
|
gOverlaySetup = OVL_SETUP_LOGO;
|
|
gOverlayStage = 0;
|
|
Overlay_InitDma();
|
|
D_game_80161A39 = true;
|
|
}
|
|
|
|
void Game_SetGameState(void) {
|
|
D_game_80161A14 = D_game_80161A10;
|
|
|
|
if (gNextGameState == GSTATE_NONE) {
|
|
return;
|
|
}
|
|
|
|
switch (gNextGameState) {
|
|
case GSTATE_PLAY:
|
|
gCurrentLevel = gNextLevel;
|
|
Play_Setup();
|
|
gPlayState = PLAY_STANDBY;
|
|
gLevelStage = gNextLevelStage;
|
|
gNextLevelStage = 0;
|
|
if ((gLevelStage != 0) && (gCurrentLevel != LEVEL_VENOM_ANDROSS)) {
|
|
D_ctx_8017782C = 0;
|
|
}
|
|
break;
|
|
case GSTATE_MAP:
|
|
D_ctx_80177B40 = 0;
|
|
break;
|
|
case GSTATE_GAME_OVER:
|
|
D_ctx_80177868 = 0;
|
|
break;
|
|
}
|
|
Memory_FreeAll();
|
|
func_play_800A6148();
|
|
gGameState = gNextGameState;
|
|
gNextGameStateTimer = 3;
|
|
gAllRangeCheckpoint = 0;
|
|
gNextGameState = GSTATE_NONE;
|
|
gOverlayStage = 0;
|
|
gFillScreenColor = gBgColor = 0;
|
|
D_ctx_80177D20 = 0.0f;
|
|
if ((gCurrentLevel == LEVEL_VENOM_2) && (gLevelStage == 2)) {
|
|
gFillScreenColor = gBgColor = 0xFFFF; // 248, 248, 248
|
|
gFillScreenRed = gFillScreenGreen = gFillScreenBlue = 255;
|
|
} else {
|
|
gFillScreenRed = gFillScreenGreen = gFillScreenBlue = 0;
|
|
Audio_FadeOutAll(1);
|
|
}
|
|
gFillScreenAlpha = 255;
|
|
gPlayerFillScreenAlphas[0] = 0;
|
|
gRadioState = 0;
|
|
D_ctx_80178428 = 0.0f;
|
|
gBlurAlpha = 255;
|
|
gDrawMode = DRAW_NONE;
|
|
Audio_ClearVoice();
|
|
Audio_SetBaseSfxReverb(0);
|
|
}
|
|
|
|
bool func_game_800A1B6C(void) {
|
|
static u8 sHoldTimer = 0;
|
|
static u8 sOverlaySelect = 99;
|
|
static u8 sCurrentOverlay = 99;
|
|
static u8 sCurrentStage = 99;
|
|
|
|
if (gOverlaySetup != sCurrentOverlay) {
|
|
sHoldTimer = 2;
|
|
sCurrentOverlay = gOverlaySetup;
|
|
}
|
|
if (sHoldTimer == 0) {
|
|
sOverlaySelect = sCurrentOverlay;
|
|
sCurrentStage = gOverlayStage;
|
|
}
|
|
Overlay_Load(sOverlaySelect, sCurrentStage);
|
|
|
|
if (sHoldTimer) {
|
|
sHoldTimer--;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
void func_game_800A1C14(Gfx** dList) {
|
|
gSPDisplayList((*dList)++, gRcpInitDL);
|
|
gDPSetScissor((*dList)++, G_SC_NON_INTERLACE, SCREEN_MARGIN, SCREEN_MARGIN, SCREEN_WIDTH - SCREEN_MARGIN,
|
|
SCREEN_HEIGHT - SCREEN_MARGIN);
|
|
gDPSetDepthImage((*dList)++, &gZBuffer);
|
|
gDPSetColorImage((*dList)++, G_IM_FMT_RGBA, G_IM_SIZ_16b, SCREEN_WIDTH, &gZBuffer);
|
|
gDPSetFillColor((*dList)++, FILL_COLOR(GPACK_ZDZ(G_MAXFBZ, 0)));
|
|
gDPFillRectangle((*dList)++, SCREEN_MARGIN, SCREEN_MARGIN, SCREEN_WIDTH - SCREEN_MARGIN - 1,
|
|
SCREEN_HEIGHT - SCREEN_MARGIN - 1);
|
|
gDPSetColorImage((*dList)++, G_IM_FMT_RGBA, G_IM_SIZ_16b, SCREEN_WIDTH, gFrameBuffer);
|
|
|
|
if (gBlurAlpha < 255) {
|
|
gDPPipeSync((*dList)++);
|
|
gDPSetCycleType((*dList)++, G_CYC_1CYCLE);
|
|
gDPSetCombineMode((*dList)++, G_CC_PRIMITIVE, G_CC_PRIMITIVE);
|
|
gDPSetRenderMode((*dList)++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
|
|
gDPSetPrimColor((*dList)++, 0x00, 0x00, RGBA16_RED(gBgColor) * 8, RGBA16_GRN(gBgColor) * 8,
|
|
RGBA16_BLU(gBgColor) * 8, gBlurAlpha);
|
|
} else {
|
|
gDPSetFillColor((*dList)++, FILL_COLOR(gBgColor | 1));
|
|
}
|
|
gDPFillRectangle((*dList)++, SCREEN_MARGIN, SCREEN_MARGIN, SCREEN_WIDTH - SCREEN_MARGIN - 1,
|
|
SCREEN_HEIGHT - SCREEN_MARGIN);
|
|
gDPPipeSync((*dList)++);
|
|
gDPSetColorDither((*dList)++, G_CD_MAGICSQ);
|
|
}
|
|
|
|
void func_game_800A1E68(Gfx** arg0) {
|
|
gSPDisplayList((*arg0)++, gRcpInitDL);
|
|
gDPSetScissor((*arg0)++, G_SC_NON_INTERLACE, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT * 3);
|
|
gDPSetFillColor((*arg0)++, FILL_COLOR(0x0001));
|
|
gDPSetColorImage((*arg0)++, G_IM_FMT_RGBA, G_IM_SIZ_16b, SCREEN_WIDTH, gFrameBuffers[0].data);
|
|
gDPFillRectangle((*arg0)++, 0, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT * 3 - 1);
|
|
gDPPipeSync((*arg0)++);
|
|
gDPSetColorDither((*arg0)++, G_CD_MAGICSQ);
|
|
}
|
|
|
|
void func_game_800A1F44(void) {
|
|
gViewport->vp.vscale[0] = gViewport->vp.vtrans[0] = SCREEN_WIDTH * 2;
|
|
gViewport->vp.vscale[1] = gViewport->vp.vtrans[1] = SCREEN_HEIGHT * 2;
|
|
gViewport->vp.vscale[2] = gViewport->vp.vtrans[2] = G_MAXZ / 2;
|
|
gViewport->vp.vscale[3] = gViewport->vp.vtrans[3] = 0;
|
|
}
|
|
|
|
void func_game_800A1FB0(Gfx** arg0, u8 arg1, u8 arg2) {
|
|
if ((arg1 != 1) && (arg1 == 4)) {
|
|
switch (arg2) {
|
|
case 0:
|
|
gViewport->vp.vscale[0] = SCREEN_WIDTH * (D_game_80161A14 - 1.0f) * 2;
|
|
gViewport->vp.vscale[1] = SCREEN_HEIGHT * (D_game_80161A14 - 1.0f) * 2;
|
|
gViewport->vp.vscale[2] = G_MAXZ / 2;
|
|
gViewport->vp.vscale[3] = 0;
|
|
gViewport->vp.vtrans[0] = SCREEN_WIDTH * (2.0f - D_game_80161A14) * 2;
|
|
gViewport->vp.vtrans[1] = SCREEN_HEIGHT * (2.0f - D_game_80161A14) * 2;
|
|
gViewport->vp.vtrans[2] = G_MAXZ / 2;
|
|
gViewport->vp.vtrans[3] = 0;
|
|
gDPSetScissor((*arg0)++, G_SC_NON_INTERLACE, SCREEN_MARGIN, SCREEN_MARGIN, SCREEN_WIDTH / 2,
|
|
SCREEN_HEIGHT / 2);
|
|
break;
|
|
case 1:
|
|
gViewport->vp.vscale[0] = SCREEN_WIDTH * (D_game_80161A14 - 1.0f) * 2;
|
|
gViewport->vp.vscale[1] = SCREEN_HEIGHT * (D_game_80161A14 - 1.0f) * 2;
|
|
gViewport->vp.vscale[2] = G_MAXZ / 2;
|
|
gViewport->vp.vscale[3] = 0;
|
|
gViewport->vp.vtrans[0] = SCREEN_WIDTH * D_game_80161A14 * 2;
|
|
gViewport->vp.vtrans[1] = SCREEN_HEIGHT * (2.0f - D_game_80161A14) * 2;
|
|
gViewport->vp.vtrans[2] = G_MAXZ / 2;
|
|
gViewport->vp.vtrans[3] = 0;
|
|
gDPSetScissor((*arg0)++, G_SC_NON_INTERLACE, SCREEN_WIDTH / 2, SCREEN_MARGIN,
|
|
SCREEN_WIDTH - SCREEN_MARGIN, SCREEN_HEIGHT / 2);
|
|
break;
|
|
case 2:
|
|
gViewport->vp.vscale[0] = SCREEN_WIDTH * (D_game_80161A14 - 1.0f) * 2;
|
|
gViewport->vp.vscale[1] = SCREEN_HEIGHT * (D_game_80161A14 - 1.0f) * 2;
|
|
gViewport->vp.vscale[2] = G_MAXZ / 2;
|
|
gViewport->vp.vscale[3] = 0;
|
|
gViewport->vp.vtrans[0] = SCREEN_WIDTH * (2.0f - D_game_80161A14) * 2;
|
|
gViewport->vp.vtrans[1] = SCREEN_HEIGHT * D_game_80161A14 * 2;
|
|
gViewport->vp.vtrans[2] = G_MAXZ / 2;
|
|
gViewport->vp.vtrans[3] = 0;
|
|
gDPSetScissor((*arg0)++, G_SC_NON_INTERLACE, SCREEN_MARGIN, SCREEN_HEIGHT / 2, SCREEN_WIDTH / 2,
|
|
SCREEN_HEIGHT - SCREEN_MARGIN);
|
|
break;
|
|
case 3:
|
|
gViewport->vp.vscale[0] = SCREEN_WIDTH * (D_game_80161A14 - 1.0f) * 2;
|
|
gViewport->vp.vscale[1] = SCREEN_HEIGHT * (D_game_80161A14 - 1.0f) * 2;
|
|
gViewport->vp.vscale[2] = G_MAXZ / 2;
|
|
gViewport->vp.vscale[3] = 0;
|
|
gViewport->vp.vtrans[0] = SCREEN_WIDTH * D_game_80161A14 * 2;
|
|
gViewport->vp.vtrans[1] = SCREEN_HEIGHT * D_game_80161A14 * 2;
|
|
gViewport->vp.vtrans[2] = G_MAXZ / 2;
|
|
gViewport->vp.vtrans[3] = 0;
|
|
gDPSetScissor((*arg0)++, G_SC_NON_INTERLACE, SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2,
|
|
SCREEN_WIDTH - SCREEN_MARGIN, SCREEN_HEIGHT - SCREEN_MARGIN);
|
|
break;
|
|
default:
|
|
func_game_800A1F44();
|
|
break;
|
|
}
|
|
} else {
|
|
func_game_800A1F44();
|
|
if (1) {}
|
|
}
|
|
gSPViewport((*arg0)++, gViewport++);
|
|
}
|
|
|
|
void Game_Draw(s32 playerNum) {
|
|
switch (gDrawMode) {
|
|
case DRAW_NONE:
|
|
break;
|
|
case DRAW_TITLE:
|
|
func_bg_8003DAF0();
|
|
OvlMenu_CallFunction(104, NULL);
|
|
break;
|
|
case DRAW_OPTION:
|
|
func_bg_8003DAF0();
|
|
OvlMenu_CallFunction(108, NULL);
|
|
break;
|
|
case DRAW_MAP:
|
|
func_bg_8003DAF0();
|
|
OvlMenu_CallFunction(106, NULL);
|
|
break;
|
|
case DRAW_PLAY:
|
|
gPlayerNum = playerNum;
|
|
Play_Draw();
|
|
break;
|
|
case DRAW_UNK_MAP:
|
|
func_bg_8003DAF0();
|
|
OvlMenu_CallFunction(110, NULL);
|
|
break;
|
|
case DRAW_UNK_VS:
|
|
func_versus_800C2190();
|
|
break;
|
|
case DRAW_UNK_7:
|
|
gPlayerNum = playerNum;
|
|
func_800A3CA0();
|
|
break;
|
|
case DRAW_ENDING:
|
|
func_bg_8003DAF0();
|
|
gPlayerNum = playerNum;
|
|
Ending_8018AAC4();
|
|
break;
|
|
}
|
|
}
|
|
|
|
void func_game_800A25DC(void) {
|
|
switch (gGameState) {
|
|
case GSTATE_INIT:
|
|
gOverlaySetup = OVL_SETUP_TITLE;
|
|
gOverlayStage = 0;
|
|
break;
|
|
case GSTATE_TITLE:
|
|
gOverlaySetup = OVL_SETUP_TITLE;
|
|
gOverlayStage = 0;
|
|
break;
|
|
case GSTATE_MENU:
|
|
gOverlaySetup = OVL_SETUP_MENU;
|
|
gOverlayStage = 0;
|
|
break;
|
|
case GSTATE_MAP:
|
|
gOverlaySetup = OVL_SETUP_MAP;
|
|
gOverlayStage = 0;
|
|
return;
|
|
case GSTATE_VS_INIT:
|
|
gOverlaySetup = OVL_SETUP_VERSUS;
|
|
break;
|
|
case GSTATE_PLAY:
|
|
gOverlaySetup = sOverlaySetups[gCurrentLevel];
|
|
break;
|
|
case GSTATE_GAME_OVER:
|
|
gOverlaySetup = OVL_SETUP_GAME_OVER;
|
|
gOverlayStage = 0;
|
|
break;
|
|
case GSTATE_ENDING:
|
|
gOverlaySetup = OVL_SETUP_CREDITS;
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Game_Update(void) {
|
|
s32 i;
|
|
u8 spBB;
|
|
u8 var_v0_3;
|
|
|
|
Game_SetGameState();
|
|
if (D_game_80161A39) {
|
|
func_game_800A1E68(&gUnkDisp1);
|
|
D_game_80161A39 = false;
|
|
return;
|
|
}
|
|
func_game_800A1C14(&gUnkDisp1);
|
|
func_game_800A25DC();
|
|
if (func_game_800A1B6C() != true) {
|
|
Lib_InitPerspective(&gUnkDisp1);
|
|
func_game_800A1FB0(&gUnkDisp1, gCamCount, 0);
|
|
if (gNextGameStateTimer != 0) {
|
|
gNextGameStateTimer--;
|
|
}
|
|
switch (gGameState) {
|
|
case GSTATE_BOOT:
|
|
gNextGameStateTimer = 2;
|
|
gGameState++;
|
|
break;
|
|
case GSTATE_BOOT_WAIT:
|
|
if (gNextGameStateTimer == 0) {
|
|
gGameState++;
|
|
}
|
|
break;
|
|
case GSTATE_SHOW_LOGO:
|
|
RCP_SetupDL(&gMasterDisp, 0x4C);
|
|
gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 255, 255, 255);
|
|
TextureRect_8bIA(&gMasterDisp, &gNintendoLogo[128 * 16 * 0], 128, 16, 100.0f, 86.0f, 1.0f, 1.0f);
|
|
TextureRect_8bIA(&gMasterDisp, &gNintendoLogo[128 * 16 * 1], 128, 16, 100.0f, 102.0f, 1.0f, 1.0f);
|
|
TextureRect_8bIA(&gMasterDisp, &gNintendoLogo[128 * 16 * 2], 128, 16, 100.0f, 118.0f, 1.0f, 1.0f);
|
|
TextureRect_8bIA(&gMasterDisp, &gNintendoLogo[128 * 16 * 3], 128, 16, 100.0f, 134.0f, 1.0f, 1.0f);
|
|
TextureRect_8bIA(&gMasterDisp, &gNintendoLogo[128 * 16 * 4], 128, 10, 100.0f, 150.0f, 1.0f, 1.0f);
|
|
gGameState++;
|
|
break;
|
|
case GSTATE_CHECK_SAVE:
|
|
if (Save_Read() != 0) {
|
|
gSaveFile = *((SaveFile*) &gDefaultSave);
|
|
Save_Write();
|
|
}
|
|
gGameState++;
|
|
Timer_CreateTask(MSEC_TO_CYCLES(1000), Timer_Increment, (s32*) &gGameState, 1);
|
|
/* fallthrough */
|
|
case GSTATE_LOGO_WAIT:
|
|
RCP_SetupDL(&gMasterDisp, 0x4C);
|
|
gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 255, 255, 255);
|
|
TextureRect_8bIA(&gMasterDisp, &gNintendoLogo[128 * 16 * 0], 128, 16, 100.0f, 86.0f, 1.0f, 1.0f);
|
|
TextureRect_8bIA(&gMasterDisp, &gNintendoLogo[128 * 16 * 1], 128, 16, 100.0f, 102.0f, 1.0f, 1.0f);
|
|
TextureRect_8bIA(&gMasterDisp, &gNintendoLogo[128 * 16 * 2], 128, 16, 100.0f, 118.0f, 1.0f, 1.0f);
|
|
TextureRect_8bIA(&gMasterDisp, &gNintendoLogo[128 * 16 * 3], 128, 16, 100.0f, 134.0f, 1.0f, 1.0f);
|
|
TextureRect_8bIA(&gMasterDisp, &gNintendoLogo[128 * 16 * 4], 128, 10, 100.0f, 150.0f, 1.0f, 1.0f);
|
|
break;
|
|
case GSTATE_START:
|
|
gGameState = GSTATE_INIT;
|
|
gOverlaySetup = OVL_SETUP_TITLE;
|
|
gOverlayStage = 0;
|
|
break;
|
|
case GSTATE_INIT:
|
|
gGameState = GSTATE_TITLE;
|
|
D_ctx_80177AE0 = 1;
|
|
D_ctx_80177824 = 1;
|
|
Memory_FreeAll();
|
|
func_play_800A6148();
|
|
gCamCount = 1;
|
|
gLifeCount[0] = 2;
|
|
D_ctx_80177D20 = 0.0f;
|
|
D_hud_8016170C = gCsFrameCount = D_ctx_80177830 = gLevelStatusScreenTimer = gLevelClearScreenTimer =
|
|
D_versus_80178754 = gVersusMode = D_ctx_80177AE0 = D_ctx_80178410 = D_ctx_80177B40 = gPlayState =
|
|
gOptionMenuStatus = gDrawMode = gShowBossHealth = D_game_80161A2C = gBgColor =
|
|
gFillScreenAlpha = 0;
|
|
gNextGameState = D_ctx_80177C94 = D_ctx_80177CAC = D_ctx_80177CB4 = D_ctx_80177CBC = D_ctx_80177CC4 =
|
|
D_ctx_80177C9C = D_ctx_80177CA4 = D_play_80161A5C = D_game_80161A34 = 0;
|
|
for (i = 0; i < 4; i++) {
|
|
gBoostButton[i] = L_CBUTTONS;
|
|
gBrakeButton[i] = D_CBUTTONS;
|
|
gShootButton[i] = A_BUTTON;
|
|
gBombButton[i] = B_BUTTON;
|
|
|
|
D_ctx_80177958[i] = 1.0f;
|
|
|
|
D_ctx_80177858[i] = 3;
|
|
D_ctx_80177870[i] = 0;
|
|
gShowCrosshairs[i] = true;
|
|
gPlayerFillScreenAlphas[i] = 0;
|
|
}
|
|
gVersusStage = 0;
|
|
D_ctx_801778A4 = 3;
|
|
gBlurAlpha = 255;
|
|
for (i = 0; i < 30; i++) {
|
|
D_play_800D3180[i] = 0;
|
|
}
|
|
gExpertMode = false;
|
|
gSoundMode = gSaveFile.save.data.soundMode;
|
|
switch (gSoundMode) {
|
|
case OPTIONSOUND_STEREO:
|
|
var_v0_3 = SOUNDMODE_STEREO;
|
|
break;
|
|
case OPTIONSOUND_MONO:
|
|
var_v0_3 = SOUNDMODE_MONO;
|
|
break;
|
|
case OPTIONSOUND_HEADSET:
|
|
var_v0_3 = SOUNDMODE_HEADSET;
|
|
break;
|
|
default:
|
|
gSoundMode = OPTIONSOUND_STEREO;
|
|
var_v0_3 = SOUNDMODE_STEREO;
|
|
break;
|
|
}
|
|
SEQCMD_SET_SOUND_MODE(var_v0_3);
|
|
gVolumeSettings[0] = gSaveFile.save.data.musicVolume;
|
|
gVolumeSettings[1] = gSaveFile.save.data.voiceVolume;
|
|
gVolumeSettings[2] = gSaveFile.save.data.sfxVolume;
|
|
if (gVolumeSettings[0] > 99) {
|
|
gVolumeSettings[0] = 99;
|
|
}
|
|
if (gVolumeSettings[1] > 99) {
|
|
gVolumeSettings[1] = 99;
|
|
}
|
|
if (gVolumeSettings[2] > 99) {
|
|
gVolumeSettings[2] = 99;
|
|
}
|
|
func_8001D8A8(0, gVolumeSettings[0]);
|
|
func_8001D8A8(1, gVolumeSettings[1]);
|
|
func_8001D8A8(2, gVolumeSettings[2]);
|
|
break;
|
|
case GSTATE_TITLE:
|
|
OvlMenu_CallFunction(103, NULL);
|
|
break;
|
|
case GSTATE_MENU:
|
|
OvlMenu_CallFunction(107, NULL);
|
|
break;
|
|
case GSTATE_MAP:
|
|
Map_8019E8D0();
|
|
break;
|
|
case GSTATE_VS_INIT:
|
|
func_versus_800C20B0();
|
|
break;
|
|
case GSTATE_PLAY:
|
|
Play_Main();
|
|
break;
|
|
case GSTATE_GAME_OVER:
|
|
OvlMenu_CallFunction(109, NULL);
|
|
break;
|
|
case GSTATE_ENDING:
|
|
gDrawMode = DRAW_ENDING;
|
|
Ending_8018A96C();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
Game_Draw(0);
|
|
if (gCamCount == 2) {
|
|
func_game_800A1FB0(&gMasterDisp, gCamCount, 1);
|
|
Game_Draw(1);
|
|
gDPPipeSync(gMasterDisp++);
|
|
gDPSetScissor(gMasterDisp++, G_SC_NON_INTERLACE, SCREEN_MARGIN, SCREEN_MARGIN, SCREEN_WIDTH - SCREEN_MARGIN,
|
|
SCREEN_HEIGHT - SCREEN_MARGIN);
|
|
} else if ((gCamCount == 4) && (gDrawMode != DRAW_NONE)) {
|
|
func_game_800A1FB0(&gMasterDisp, gCamCount, 3);
|
|
Game_Draw(3);
|
|
func_game_800A1FB0(&gMasterDisp, gCamCount, 2);
|
|
Game_Draw(2);
|
|
func_game_800A1FB0(&gMasterDisp, gCamCount, 1);
|
|
Game_Draw(1);
|
|
gDPPipeSync(gMasterDisp++);
|
|
gDPSetScissor(gMasterDisp++, G_SC_NON_INTERLACE, SCREEN_MARGIN, SCREEN_MARGIN, SCREEN_WIDTH - SCREEN_MARGIN,
|
|
SCREEN_HEIGHT - SCREEN_MARGIN);
|
|
gDPSetColorDither(gMasterDisp++, G_CD_NOISE);
|
|
gDPSetAlphaDither(gMasterDisp++, G_AD_NOISE);
|
|
gDPSetCycleType(gMasterDisp++, G_CYC_1CYCLE);
|
|
gDPSetCombineMode(gMasterDisp++, G_CC_PRIMITIVE, G_CC_PRIMITIVE);
|
|
gDPSetRenderMode(gMasterDisp++, G_RM_XLU_SURF, G_RM_XLU_SURF2);
|
|
gDPSetPrimColor(gMasterDisp++, 0x00, 0x0, 0, 0, 0, 0);
|
|
gDPFillRectangle(gMasterDisp++, SCREEN_WIDTH / 2 - 2 - 1, SCREEN_MARGIN, SCREEN_WIDTH / 2 + 2,
|
|
SCREEN_HEIGHT - SCREEN_MARGIN);
|
|
gDPFillRectangle(gMasterDisp++, SCREEN_MARGIN, SCREEN_HEIGHT / 2 - 2 - 1, SCREEN_WIDTH - SCREEN_MARGIN,
|
|
SCREEN_HEIGHT / 2 + 2);
|
|
|
|
if (gLevelType == LEVELTYPE_PLANET) {
|
|
gDPSetPrimColor(gMasterDisp++, 0x00, 0x0, 0, 0, 0, 255);
|
|
} else {
|
|
gDPSetPrimColor(gMasterDisp++, 0x00, 0x0, 100, 100, 255, 255);
|
|
}
|
|
gDPFillRectangle(gMasterDisp++, SCREEN_WIDTH / 2 - 1 - 1, SCREEN_MARGIN, SCREEN_WIDTH / 2 + 1,
|
|
SCREEN_HEIGHT - SCREEN_MARGIN);
|
|
gDPFillRectangle(gMasterDisp++, SCREEN_MARGIN, SCREEN_HEIGHT / 2 - 1 - 1, SCREEN_WIDTH - SCREEN_MARGIN,
|
|
SCREEN_HEIGHT / 2 + 1);
|
|
|
|
func_hud_8008CB8C();
|
|
}
|
|
spBB = 0;
|
|
if (gCamCount == 1) {
|
|
Graphics_FillRectangle(&gMasterDisp, 0, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1, gPlayerFillScreenReds[0],
|
|
gPlayerFillScreenGreens[0], gPlayerFillScreenBlues[0], gPlayerFillScreenAlphas[0]);
|
|
if ((gDrawMode == DRAW_PLAY) || (gDrawMode == DRAW_ENDING)) {
|
|
func_radio_800BB5D0();
|
|
if (D_game_80161A2C != 0) {
|
|
func_hud_8008FA84();
|
|
func_hud_8008CA44();
|
|
}
|
|
func_hud_8008DE68();
|
|
}
|
|
} else {
|
|
for (i = 0; i < gCamCount; i++) {
|
|
if (gPlayer[i].timer_224 != 0) {
|
|
|
|
Graphics_FillRectangle(&gMasterDisp, sVsCameraULx[i], sVsCameraULy[i], sVsCameraLRx[i],
|
|
sVsCameraLRy[i], gFillScreenRed, gFillScreenGreen, gFillScreenBlue,
|
|
gFillScreenAlpha);
|
|
spBB = 1;
|
|
} else {
|
|
Graphics_FillRectangle(&gMasterDisp, sVsCameraULx[i], sVsCameraULy[i], sVsCameraLRx[i],
|
|
sVsCameraLRy[i], gPlayerFillScreenReds[i], gPlayerFillScreenGreens[i],
|
|
gPlayerFillScreenBlues[i], gPlayerFillScreenAlphas[i]);
|
|
}
|
|
}
|
|
}
|
|
func_bg_80040CDC();
|
|
func_hud_8008865C();
|
|
AllRange_UpdateCountdown();
|
|
if ((gGameState == GSTATE_PLAY) && gVersusMode) {
|
|
func_versus_800C1ED4();
|
|
}
|
|
func_fade_80084688(0, D_ctx_80177C50);
|
|
if (spBB == 0) {
|
|
Graphics_FillRectangle(&gMasterDisp, 0, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1, gFillScreenRed,
|
|
gFillScreenGreen, gFillScreenBlue, gFillScreenAlpha);
|
|
}
|
|
func_80016A50();
|
|
}
|
|
}
|
|
|
|
Actor* func_game_800A3608(ObjectId objId) {
|
|
Actor* actor = gActors;
|
|
s32 i;
|
|
|
|
for (i = 0; i < ARRAY_COUNT(gActors); i++, actor++) {
|
|
if (actor->obj.status == OBJ_FREE) {
|
|
Actor_Initialize(actor);
|
|
actor->obj.status = OBJ_INIT;
|
|
actor->obj.id = objId;
|
|
Object_SetInfo(&actor->info, actor->obj.id);
|
|
break;
|
|
}
|
|
}
|
|
if (i == ARRAY_COUNT(gActors)) {
|
|
actor = NULL;
|
|
}
|
|
return actor;
|
|
}
|