2024-03-27 15:06:28 -05:00
|
|
|
#include "prevent_bss_reordering.h"
|
2023-11-12 16:49:03 -06:00
|
|
|
#include "global.h"
|
2023-12-04 12:50:52 -06:00
|
|
|
#include "sf64dma.h"
|
2024-02-17 20:19:18 -06:00
|
|
|
#include "assets/ast_logo.h"
|
2024-05-08 13:57:11 -05:00
|
|
|
#include "mods.h"
|
2024-10-16 11:53:41 -06:00
|
|
|
#include "port/interpolation/FrameInterpolation.h"
|
2024-11-12 13:21:26 -03:00
|
|
|
typedef struct {
|
|
|
|
/* 0x00 */ s16 count;
|
|
|
|
/* 0x02 */ u16 samplingFrequency; // Target sampling rate in Hz
|
|
|
|
/* 0x04 */ u16 aiSamplingFrequency; // True sampling rate of the audio interface (AI), see `osAiSetFrequency`
|
|
|
|
/* 0x06 */ s16 samplesPerFrameTarget;
|
|
|
|
/* 0x08 */ s16 maxAiBufferLength;
|
|
|
|
/* 0x0A */ s16 minAiBufferLength;
|
|
|
|
/* 0x0C */ s16 ticksPerUpdate; // for each audio thread update, number of ticks to process audio
|
|
|
|
/* 0x0E */ s16 samplesPerTick;
|
|
|
|
/* 0x10 */ s16 samplesPerTickMax;
|
|
|
|
/* 0x12 */ s16 samplesPerTickMin;
|
|
|
|
/* 0x14 */ f32 resampleRate;
|
|
|
|
/* 0x18 */ f32 ticksPerUpdateInv; // inverse (reciprocal) of ticksPerUpdate
|
|
|
|
/* 0x1C */ f32 ticksPerUpdateInvScaled; // ticksPerUpdateInv scaled down by a factor of 256
|
|
|
|
} AudioBufferParameters; // size = 0x20
|
2024-05-11 15:53:37 -05:00
|
|
|
f32 gNextVsViewScale;
|
|
|
|
f32 gVsViewScale;
|
2023-12-24 13:28:35 -06:00
|
|
|
s32 gPlayerInactive[4];
|
2024-05-11 15:53:37 -05:00
|
|
|
s32 gVsMenuSelection;
|
2024-04-15 18:38:19 -05:00
|
|
|
u8 gShowHud;
|
2024-04-22 21:51:20 -05:00
|
|
|
u16 gNextLevelPhase;
|
2023-12-14 08:41:43 -06:00
|
|
|
u16 gNextLevel;
|
|
|
|
u16 gNextGameState;
|
2024-05-11 15:53:37 -05:00
|
|
|
u16 gLastGameState;
|
2023-12-14 08:41:43 -06:00
|
|
|
u16 gBgColor;
|
|
|
|
u8 gBlurAlpha;
|
2024-04-22 21:51:20 -05:00
|
|
|
u8 gGameStandby;
|
2024-04-20 14:18:31 -05:00
|
|
|
f32 gFovY;
|
|
|
|
f32 gProjectNear;
|
|
|
|
f32 gProjectFar;
|
2023-12-09 12:53:24 -06:00
|
|
|
|
2024-08-12 11:58:54 -03:00
|
|
|
bool gShowReticles[4] = { true, true, true, true };
|
2024-05-11 15:53:37 -05:00
|
|
|
bool D_game_800D2870 = false;
|
2024-08-27 16:13:18 -03:00
|
|
|
s32 sVsCameraULx[] = { 0, SCREEN_WIDTH / 2, 0, SCREEN_WIDTH / 2 };
|
|
|
|
s32 sVsCameraLRx[] = { SCREEN_WIDTH / 2 - 1, SCREEN_WIDTH - 1, SCREEN_WIDTH / 2 - 1, SCREEN_WIDTH - 1 };
|
|
|
|
s32 sVsCameraULy[] = { 0, 0, SCREEN_HEIGHT / 2, SCREEN_HEIGHT / 2 };
|
|
|
|
s32 sVsCameraLRy[] = { SCREEN_HEIGHT / 2 - 1, SCREEN_HEIGHT / 2 - 1, SCREEN_HEIGHT - 1, SCREEN_HEIGHT - 1 };
|
|
|
|
s32 sLevelSceneIds[] = {
|
2024-04-22 21:51:20 -05:00
|
|
|
/* LEVEL_CORNERIA */ SCENE_CORNERIA,
|
|
|
|
/* LEVEL_METEO */ SCENE_METEO,
|
|
|
|
/* LEVEL_SECTOR_X */ SCENE_SECTOR_X,
|
|
|
|
/* LEVEL_AREA_6 */ SCENE_AREA_6,
|
|
|
|
/* LEVEL_UNK_4 */ SCENE_UNK_4,
|
|
|
|
/* LEVEL_SECTOR_Y */ SCENE_SECTOR_Y,
|
|
|
|
/* LEVEL_VENOM_1 */ SCENE_VENOM_1,
|
|
|
|
/* LEVEL_SOLAR */ SCENE_SOLAR,
|
|
|
|
/* LEVEL_ZONESS */ SCENE_ZONESS,
|
|
|
|
/* LEVEL_VENOM_ANDROSS */ SCENE_VENOM_ANDROSS,
|
|
|
|
/* LEVEL_TRAINING */ SCENE_TRAINING,
|
|
|
|
/* LEVEL_MACBETH */ SCENE_MACBETH,
|
|
|
|
/* LEVEL_TITANIA */ SCENE_TITANIA,
|
|
|
|
/* LEVEL_AQUAS */ SCENE_AQUAS,
|
|
|
|
/* LEVEL_FORTUNA */ SCENE_FORTUNA,
|
|
|
|
/* LEVEL_UNK_15 */ SCENE_TITLE,
|
|
|
|
/* LEVEL_KATINA */ SCENE_KATINA,
|
|
|
|
/* LEVEL_BOLSE */ SCENE_BOLSE,
|
|
|
|
/* LEVEL_SECTOR_Z */ SCENE_SECTOR_Z,
|
|
|
|
/* LEVEL_VENOM_2 */ SCENE_VENOM_2,
|
|
|
|
/* LEVEL_VERSUS */ SCENE_VERSUS,
|
2023-11-26 15:27:05 -06:00
|
|
|
};
|
2023-10-19 10:57:03 -05:00
|
|
|
|
2023-12-14 08:41:43 -06:00
|
|
|
void Game_Initialize(void) {
|
2023-11-24 13:11:20 -06:00
|
|
|
Memory_FreeAll();
|
2023-11-12 16:49:03 -06:00
|
|
|
Rand_Init();
|
|
|
|
Rand_SetSeed(1, 29000, 9876);
|
2023-12-14 08:41:43 -06:00
|
|
|
gGameState = GSTATE_BOOT;
|
2024-05-08 13:57:11 -05:00
|
|
|
#ifdef MODS_BOOT_STATE
|
|
|
|
gNextGameState = GSTATE_INIT;
|
|
|
|
if (Save_Read() != 0) {
|
|
|
|
#ifdef AVOID_UB
|
|
|
|
gSaveFile.save = gDefaultSave;
|
|
|
|
gSaveFile.backup = gDefaultSave;
|
|
|
|
#else
|
|
|
|
gSaveFile = *((SaveFile*) &gDefaultSave);
|
|
|
|
#endif
|
|
|
|
Save_Write();
|
|
|
|
}
|
|
|
|
#endif
|
2024-04-08 17:25:56 -05:00
|
|
|
gNextGameStateTimer = 0;
|
2023-12-14 08:41:43 -06:00
|
|
|
gBgColor = 0;
|
2024-04-05 15:11:36 -05:00
|
|
|
gBlurAlpha = 255;
|
2024-04-20 14:18:31 -05:00
|
|
|
gFovY = 45.0f;
|
|
|
|
gProjectNear = 10.0f;
|
|
|
|
gProjectFar = 12800.0f;
|
2024-05-11 15:53:37 -05:00
|
|
|
gNextVsViewScale = gVsViewScale = 0.0f;
|
2024-04-22 21:51:20 -05:00
|
|
|
gSceneId = SCENE_LOGO;
|
|
|
|
gSceneSetup = 0;
|
|
|
|
Load_InitDmaAndMsg();
|
|
|
|
gGameStandby = true;
|
2023-11-12 16:49:03 -06:00
|
|
|
}
|
|
|
|
|
2023-12-14 08:41:43 -06:00
|
|
|
void Game_SetGameState(void) {
|
2024-05-11 15:53:37 -05:00
|
|
|
gVsViewScale = gNextVsViewScale;
|
2023-11-12 16:49:03 -06:00
|
|
|
|
2023-12-14 08:41:43 -06:00
|
|
|
if (gNextGameState == GSTATE_NONE) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch (gNextGameState) {
|
|
|
|
case GSTATE_PLAY:
|
|
|
|
gCurrentLevel = gNextLevel;
|
2024-04-08 17:25:56 -05:00
|
|
|
Play_Setup();
|
|
|
|
gPlayState = PLAY_STANDBY;
|
2024-04-22 21:51:20 -05:00
|
|
|
gLevelPhase = gNextLevelPhase;
|
|
|
|
gNextLevelPhase = 0;
|
|
|
|
if ((gLevelPhase != 0) && (gCurrentLevel != LEVEL_VENOM_ANDROSS)) {
|
2024-07-06 09:47:49 -03:00
|
|
|
D_ctx_8017782C = false;
|
2023-11-12 16:49:03 -06:00
|
|
|
}
|
|
|
|
break;
|
2023-12-14 08:41:43 -06:00
|
|
|
case GSTATE_MAP:
|
2024-04-25 17:01:25 -05:00
|
|
|
gMapState = 0;
|
2023-11-12 16:49:03 -06:00
|
|
|
break;
|
2023-12-24 13:28:35 -06:00
|
|
|
case GSTATE_GAME_OVER:
|
2024-04-02 18:20:08 -05:00
|
|
|
D_ctx_80177868 = 0;
|
2023-11-12 16:49:03 -06:00
|
|
|
break;
|
|
|
|
}
|
2023-11-24 13:11:20 -06:00
|
|
|
Memory_FreeAll();
|
2024-04-20 14:18:31 -05:00
|
|
|
Play_ClearObjectData();
|
2023-12-14 08:41:43 -06:00
|
|
|
gGameState = gNextGameState;
|
2024-04-08 17:25:56 -05:00
|
|
|
gNextGameStateTimer = 3;
|
|
|
|
gAllRangeCheckpoint = 0;
|
2023-12-14 08:41:43 -06:00
|
|
|
gNextGameState = GSTATE_NONE;
|
2024-04-22 21:51:20 -05:00
|
|
|
gSceneSetup = 0;
|
2023-12-14 08:41:43 -06:00
|
|
|
gFillScreenColor = gBgColor = 0;
|
2024-05-02 15:46:51 -05:00
|
|
|
gPathProgress = 0.0f;
|
2024-04-22 21:51:20 -05:00
|
|
|
if ((gCurrentLevel == LEVEL_VENOM_2) && (gLevelPhase == 2)) {
|
2024-03-27 15:06:28 -05:00
|
|
|
gFillScreenColor = gBgColor = 0xFFFF; // 248, 248, 248
|
2024-04-08 17:25:56 -05:00
|
|
|
gFillScreenRed = gFillScreenGreen = gFillScreenBlue = 255;
|
2023-11-12 16:49:03 -06:00
|
|
|
} else {
|
2024-04-08 17:25:56 -05:00
|
|
|
gFillScreenRed = gFillScreenGreen = gFillScreenBlue = 0;
|
2024-03-01 12:57:44 -06:00
|
|
|
Audio_FadeOutAll(1);
|
2023-11-12 16:49:03 -06:00
|
|
|
}
|
2024-04-08 17:25:56 -05:00
|
|
|
gFillScreenAlpha = 255;
|
2024-04-22 21:51:20 -05:00
|
|
|
gPlayerGlareAlphas[0] = 0;
|
2023-12-24 13:28:35 -06:00
|
|
|
gRadioState = 0;
|
2024-04-22 21:51:20 -05:00
|
|
|
gStarfieldRoll = 0.0f;
|
2023-12-14 08:41:43 -06:00
|
|
|
gBlurAlpha = 255;
|
2024-04-08 17:25:56 -05:00
|
|
|
gDrawMode = DRAW_NONE;
|
2024-03-01 12:57:44 -06:00
|
|
|
Audio_ClearVoice();
|
2024-04-24 23:14:49 -05:00
|
|
|
Audio_SetEnvSfxReverb(0);
|
2023-11-12 16:49:03 -06:00
|
|
|
}
|
|
|
|
|
2024-04-22 21:51:20 -05:00
|
|
|
bool Game_ChangeScene(void) {
|
2023-11-29 20:44:42 -06:00
|
|
|
static u8 sHoldTimer = 0;
|
2024-04-22 21:51:20 -05:00
|
|
|
static u8 sSceneSelect = SCENE_LOGO;
|
|
|
|
static u8 sCurrentSceneId = SCENE_LOGO;
|
|
|
|
static u8 sCurrentSetup = SCENE_LOGO;
|
2023-11-12 16:49:03 -06:00
|
|
|
|
2024-04-22 21:51:20 -05:00
|
|
|
if (gSceneId != sCurrentSceneId) {
|
2023-11-29 20:44:42 -06:00
|
|
|
sHoldTimer = 2;
|
2024-04-22 21:51:20 -05:00
|
|
|
sCurrentSceneId = gSceneId;
|
2023-11-12 16:49:03 -06:00
|
|
|
}
|
2023-11-29 20:44:42 -06:00
|
|
|
if (sHoldTimer == 0) {
|
2024-04-22 21:51:20 -05:00
|
|
|
sSceneSelect = sCurrentSceneId;
|
|
|
|
sCurrentSetup = gSceneSetup;
|
2023-11-12 16:49:03 -06:00
|
|
|
}
|
2024-04-22 21:51:20 -05:00
|
|
|
Load_SceneSetup(sSceneSelect, sCurrentSetup);
|
2023-11-12 16:49:03 -06:00
|
|
|
|
2023-11-29 20:44:42 -06:00
|
|
|
if (sHoldTimer) {
|
|
|
|
sHoldTimer--;
|
2023-12-04 12:50:52 -06:00
|
|
|
return true;
|
2023-11-12 16:49:03 -06:00
|
|
|
}
|
2023-12-04 12:50:52 -06:00
|
|
|
return false;
|
2023-11-12 16:49:03 -06:00
|
|
|
}
|
|
|
|
|
2024-05-27 15:27:19 -06:00
|
|
|
#define LEFT_MARGIN OTRGetRectDimensionFromLeftEdge(SCREEN_MARGIN)
|
|
|
|
#define RIGHT_MARGIN OTRGetRectDimensionFromRightEdge(SCREEN_WIDTH - SCREEN_MARGIN)
|
|
|
|
|
2024-04-22 21:51:20 -05:00
|
|
|
void Game_InitMasterDL(Gfx** dList) {
|
2024-04-11 11:55:32 -05:00
|
|
|
gSPDisplayList((*dList)++, gRcpInitDL);
|
|
|
|
gDPSetScissor((*dList)++, G_SC_NON_INTERLACE, SCREEN_MARGIN, SCREEN_MARGIN, SCREEN_WIDTH - SCREEN_MARGIN,
|
|
|
|
SCREEN_HEIGHT - SCREEN_MARGIN);
|
|
|
|
gDPSetDepthImage((*dList)++, &gZBuffer);
|
2024-05-27 15:27:19 -06:00
|
|
|
gDPSetColorImage((*dList)++, G_IM_FMT_RGBA, G_IM_SIZ_16b, RIGHT_MARGIN, &gZBuffer);
|
2024-04-11 11:55:32 -05:00
|
|
|
gDPSetFillColor((*dList)++, FILL_COLOR(GPACK_ZDZ(G_MAXFBZ, 0)));
|
2024-11-12 13:21:26 -03:00
|
|
|
gDPFillWideRectangle((*dList)++, LEFT_MARGIN, SCREEN_MARGIN, RIGHT_MARGIN, SCREEN_HEIGHT - SCREEN_MARGIN);
|
2024-05-27 15:27:19 -06:00
|
|
|
gDPSetColorImage((*dList)++, G_IM_FMT_RGBA, G_IM_SIZ_16b, RIGHT_MARGIN, gFrameBuffer);
|
2023-10-19 10:57:03 -05:00
|
|
|
|
2024-04-05 15:11:36 -05:00
|
|
|
if (gBlurAlpha < 255) {
|
2024-04-11 11:55:32 -05:00
|
|
|
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,
|
2023-12-14 08:41:43 -06:00
|
|
|
RGBA16_BLU(gBgColor) * 8, gBlurAlpha);
|
2023-11-12 16:49:03 -06:00
|
|
|
} else {
|
2024-04-11 11:55:32 -05:00
|
|
|
gDPSetFillColor((*dList)++, FILL_COLOR(gBgColor | 1));
|
2023-11-12 16:49:03 -06:00
|
|
|
}
|
2024-11-12 13:21:26 -03:00
|
|
|
gDPFillWideRectangle((*dList)++, LEFT_MARGIN, SCREEN_MARGIN, RIGHT_MARGIN, SCREEN_HEIGHT - SCREEN_MARGIN);
|
2024-04-11 11:55:32 -05:00
|
|
|
gDPPipeSync((*dList)++);
|
|
|
|
gDPSetColorDither((*dList)++, G_CD_MAGICSQ);
|
2023-11-12 16:49:03 -06:00
|
|
|
}
|
2023-10-19 10:57:03 -05:00
|
|
|
|
2024-04-22 21:51:20 -05:00
|
|
|
void Game_InitStandbyDL(Gfx** dList) {
|
|
|
|
gSPDisplayList((*dList)++, gRcpInitDL);
|
|
|
|
gDPSetScissor((*dList)++, G_SC_NON_INTERLACE, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT * 3);
|
|
|
|
gDPSetFillColor((*dList)++, FILL_COLOR(0x0001));
|
2024-05-27 15:27:19 -06:00
|
|
|
gDPSetColorImage((*dList)++, G_IM_FMT_RGBA, G_IM_SIZ_16b, RIGHT_MARGIN, gFrameBuffers[0].data);
|
2024-11-12 13:21:26 -03:00
|
|
|
gDPFillWideRectangle((*dList)++, OTRGetDimensionFromLeftEdge(0), 0, OTRGetRectDimensionFromRightEdge(0),
|
|
|
|
SCREEN_HEIGHT * 3 - 1);
|
2024-04-22 21:51:20 -05:00
|
|
|
gDPPipeSync((*dList)++);
|
|
|
|
gDPSetColorDither((*dList)++, G_CD_MAGICSQ);
|
2023-11-12 16:49:03 -06:00
|
|
|
}
|
2023-10-19 10:57:03 -05:00
|
|
|
|
2024-04-22 21:51:20 -05:00
|
|
|
void Game_InitFullViewport(void) {
|
2023-11-29 20:44:42 -06:00
|
|
|
gViewport->vp.vscale[0] = gViewport->vp.vtrans[0] = SCREEN_WIDTH * 2;
|
|
|
|
gViewport->vp.vscale[1] = gViewport->vp.vtrans[1] = SCREEN_HEIGHT * 2;
|
2023-11-14 21:34:10 -06:00
|
|
|
gViewport->vp.vscale[2] = gViewport->vp.vtrans[2] = G_MAXZ / 2;
|
2023-11-12 16:49:03 -06:00
|
|
|
gViewport->vp.vscale[3] = gViewport->vp.vtrans[3] = 0;
|
|
|
|
}
|
2023-10-19 10:57:03 -05:00
|
|
|
|
2024-04-22 21:51:20 -05:00
|
|
|
void Game_InitViewport(Gfx** dList, u8 camCount, u8 camIndex) {
|
2024-05-14 09:44:12 -05:00
|
|
|
switch (camCount) {
|
|
|
|
case 4:
|
|
|
|
switch (camIndex) {
|
|
|
|
case 0:
|
|
|
|
gViewport->vp.vscale[0] = SCREEN_WIDTH * (gVsViewScale - 1.0f) * 2;
|
|
|
|
gViewport->vp.vscale[1] = SCREEN_HEIGHT * (gVsViewScale - 1.0f) * 2;
|
|
|
|
gViewport->vp.vscale[2] = G_MAXZ / 2;
|
|
|
|
gViewport->vp.vscale[3] = 0;
|
|
|
|
gViewport->vp.vtrans[0] = SCREEN_WIDTH * (2.0f - gVsViewScale) * 2;
|
|
|
|
gViewport->vp.vtrans[1] = SCREEN_HEIGHT * (2.0f - gVsViewScale) * 2;
|
|
|
|
gViewport->vp.vtrans[2] = G_MAXZ / 2;
|
|
|
|
gViewport->vp.vtrans[3] = 0;
|
|
|
|
gDPSetScissor((*dList)++, G_SC_NON_INTERLACE, SCREEN_MARGIN, SCREEN_MARGIN, SCREEN_WIDTH / 2,
|
|
|
|
SCREEN_HEIGHT / 2);
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
gViewport->vp.vscale[0] = SCREEN_WIDTH * (gVsViewScale - 1.0f) * 2;
|
|
|
|
gViewport->vp.vscale[1] = SCREEN_HEIGHT * (gVsViewScale - 1.0f) * 2;
|
|
|
|
gViewport->vp.vscale[2] = G_MAXZ / 2;
|
|
|
|
gViewport->vp.vscale[3] = 0;
|
|
|
|
gViewport->vp.vtrans[0] = SCREEN_WIDTH * gVsViewScale * 2;
|
|
|
|
gViewport->vp.vtrans[1] = SCREEN_HEIGHT * (2.0f - gVsViewScale) * 2;
|
|
|
|
gViewport->vp.vtrans[2] = G_MAXZ / 2;
|
|
|
|
gViewport->vp.vtrans[3] = 0;
|
|
|
|
gDPSetScissor((*dList)++, 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 * (gVsViewScale - 1.0f) * 2;
|
|
|
|
gViewport->vp.vscale[1] = SCREEN_HEIGHT * (gVsViewScale - 1.0f) * 2;
|
|
|
|
gViewport->vp.vscale[2] = G_MAXZ / 2;
|
|
|
|
gViewport->vp.vscale[3] = 0;
|
|
|
|
gViewport->vp.vtrans[0] = SCREEN_WIDTH * (2.0f - gVsViewScale) * 2;
|
|
|
|
gViewport->vp.vtrans[1] = SCREEN_HEIGHT * gVsViewScale * 2;
|
|
|
|
gViewport->vp.vtrans[2] = G_MAXZ / 2;
|
|
|
|
gViewport->vp.vtrans[3] = 0;
|
|
|
|
gDPSetScissor((*dList)++, 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 * (gVsViewScale - 1.0f) * 2;
|
|
|
|
gViewport->vp.vscale[1] = SCREEN_HEIGHT * (gVsViewScale - 1.0f) * 2;
|
|
|
|
gViewport->vp.vscale[2] = G_MAXZ / 2;
|
|
|
|
gViewport->vp.vscale[3] = 0;
|
|
|
|
gViewport->vp.vtrans[0] = SCREEN_WIDTH * gVsViewScale * 2;
|
|
|
|
gViewport->vp.vtrans[1] = SCREEN_HEIGHT * gVsViewScale * 2;
|
|
|
|
gViewport->vp.vtrans[2] = G_MAXZ / 2;
|
|
|
|
gViewport->vp.vtrans[3] = 0;
|
|
|
|
gDPSetScissor((*dList)++, G_SC_NON_INTERLACE, SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2,
|
|
|
|
SCREEN_WIDTH - SCREEN_MARGIN, SCREEN_HEIGHT - SCREEN_MARGIN);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
Game_InitFullViewport();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
default:
|
|
|
|
Game_InitFullViewport();
|
|
|
|
break;
|
2023-11-12 16:49:03 -06:00
|
|
|
}
|
2024-04-22 21:51:20 -05:00
|
|
|
gSPViewport((*dList)++, gViewport++);
|
2023-11-12 16:49:03 -06:00
|
|
|
}
|
2023-10-19 10:57:03 -05:00
|
|
|
|
2024-04-08 17:25:56 -05:00
|
|
|
void Game_Draw(s32 playerNum) {
|
2024-10-16 11:53:41 -06:00
|
|
|
FrameInterpolation_StartRecord();
|
2023-12-24 13:28:35 -06:00
|
|
|
switch (gDrawMode) {
|
2024-04-08 17:25:56 -05:00
|
|
|
case DRAW_NONE:
|
2023-11-12 16:49:03 -06:00
|
|
|
break;
|
2024-04-08 17:25:56 -05:00
|
|
|
case DRAW_TITLE:
|
2024-04-22 21:51:20 -05:00
|
|
|
Background_DrawStarfield();
|
2024-04-15 18:38:19 -05:00
|
|
|
OvlMenu_CallFunction(OVLCALL_TITLE_DRAW, NULL);
|
2023-11-12 16:49:03 -06:00
|
|
|
break;
|
2024-04-08 17:25:56 -05:00
|
|
|
case DRAW_OPTION:
|
2024-04-22 21:51:20 -05:00
|
|
|
Background_DrawStarfield();
|
2024-04-15 18:38:19 -05:00
|
|
|
OvlMenu_CallFunction(OVLCALL_OPTION_DRAW, NULL);
|
2023-11-12 16:49:03 -06:00
|
|
|
break;
|
2024-01-01 19:55:06 -03:00
|
|
|
case DRAW_MAP:
|
2024-04-22 21:51:20 -05:00
|
|
|
Background_DrawStarfield();
|
2024-04-15 18:38:19 -05:00
|
|
|
OvlMenu_CallFunction(OVLCALL_MAP_DRAW, NULL);
|
2023-11-12 16:49:03 -06:00
|
|
|
break;
|
2024-04-08 17:25:56 -05:00
|
|
|
case DRAW_PLAY:
|
|
|
|
gPlayerNum = playerNum;
|
2024-08-12 11:58:54 -03:00
|
|
|
Display_Update();
|
2023-11-12 16:49:03 -06:00
|
|
|
break;
|
2024-04-22 21:51:20 -05:00
|
|
|
case DRAW_UNK_MAP: // likely game over
|
|
|
|
Background_DrawStarfield();
|
2024-04-15 18:38:19 -05:00
|
|
|
OvlMenu_CallFunction(OVLCALL_UNKMAP_DRAW, NULL);
|
2023-11-12 16:49:03 -06:00
|
|
|
break;
|
2024-04-08 17:25:56 -05:00
|
|
|
case DRAW_UNK_VS:
|
2024-04-02 18:20:08 -05:00
|
|
|
func_versus_800C2190();
|
2023-11-12 16:49:03 -06:00
|
|
|
break;
|
2024-04-08 17:25:56 -05:00
|
|
|
case DRAW_UNK_7:
|
|
|
|
gPlayerNum = playerNum;
|
2024-05-14 09:44:12 -05:00
|
|
|
func_pause_800A3CA0();
|
2023-11-12 16:49:03 -06:00
|
|
|
break;
|
2024-04-08 17:25:56 -05:00
|
|
|
case DRAW_ENDING:
|
2024-04-22 21:51:20 -05:00
|
|
|
Background_DrawStarfield();
|
2024-04-08 17:25:56 -05:00
|
|
|
gPlayerNum = playerNum;
|
2024-04-22 21:51:20 -05:00
|
|
|
Ending_Draw();
|
2023-11-12 16:49:03 -06:00
|
|
|
break;
|
|
|
|
}
|
2024-10-16 11:53:41 -06:00
|
|
|
FrameInterpolation_StopRecord();
|
2023-11-12 16:49:03 -06:00
|
|
|
}
|
|
|
|
|
2024-04-22 21:51:20 -05:00
|
|
|
void Game_SetScene(void) {
|
2023-12-14 08:41:43 -06:00
|
|
|
switch (gGameState) {
|
2024-03-16 23:06:28 -05:00
|
|
|
case GSTATE_INIT:
|
2024-04-22 21:51:20 -05:00
|
|
|
gSceneId = SCENE_TITLE;
|
|
|
|
gSceneSetup = 0;
|
2023-11-12 16:49:03 -06:00
|
|
|
break;
|
2024-03-16 23:06:28 -05:00
|
|
|
case GSTATE_TITLE:
|
2024-04-22 21:51:20 -05:00
|
|
|
gSceneId = SCENE_TITLE;
|
|
|
|
gSceneSetup = 0;
|
2023-11-12 16:49:03 -06:00
|
|
|
break;
|
2024-03-16 23:06:28 -05:00
|
|
|
case GSTATE_MENU:
|
2024-04-22 21:51:20 -05:00
|
|
|
gSceneId = SCENE_MENU;
|
|
|
|
gSceneSetup = 0;
|
2023-11-12 16:49:03 -06:00
|
|
|
break;
|
2024-03-16 23:06:28 -05:00
|
|
|
case GSTATE_MAP:
|
2024-04-22 21:51:20 -05:00
|
|
|
gSceneId = SCENE_MAP;
|
|
|
|
gSceneSetup = 0;
|
2023-11-12 16:49:03 -06:00
|
|
|
return;
|
2024-03-16 23:06:28 -05:00
|
|
|
case GSTATE_VS_INIT:
|
2024-04-22 21:51:20 -05:00
|
|
|
gSceneId = SCENE_VERSUS;
|
2023-11-12 16:49:03 -06:00
|
|
|
break;
|
2024-03-16 23:06:28 -05:00
|
|
|
case GSTATE_PLAY:
|
2024-04-22 21:51:20 -05:00
|
|
|
gSceneId = sLevelSceneIds[gCurrentLevel];
|
2023-11-12 16:49:03 -06:00
|
|
|
break;
|
2024-03-16 23:06:28 -05:00
|
|
|
case GSTATE_GAME_OVER:
|
2024-04-22 21:51:20 -05:00
|
|
|
gSceneId = SCENE_GAME_OVER;
|
|
|
|
gSceneSetup = 0;
|
2023-11-12 16:49:03 -06:00
|
|
|
break;
|
2024-04-08 17:25:56 -05:00
|
|
|
case GSTATE_ENDING:
|
2024-04-22 21:51:20 -05:00
|
|
|
gSceneId = SCENE_CREDITS;
|
2023-11-12 16:49:03 -06:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2024-11-12 13:21:26 -03:00
|
|
|
extern u8 gAudioSpecId;
|
2024-11-12 20:48:19 -03:00
|
|
|
extern int audBuffer;
|
2024-11-12 13:21:26 -03:00
|
|
|
extern AudioBufferParameters gAudioBufferParams;
|
2024-11-14 20:23:27 -03:00
|
|
|
extern int countermin;
|
2024-11-15 19:32:24 -03:00
|
|
|
|
|
|
|
extern unsigned short samples_high;
|
|
|
|
extern unsigned short samples_low;
|
|
|
|
|
2024-02-16 16:04:22 -06:00
|
|
|
void Game_Update(void) {
|
2023-11-14 21:34:10 -06:00
|
|
|
s32 i;
|
2024-04-22 21:51:20 -05:00
|
|
|
u8 partialFill;
|
|
|
|
u8 soundMode;
|
2023-11-14 21:34:10 -06:00
|
|
|
|
2023-12-14 08:41:43 -06:00
|
|
|
Game_SetGameState();
|
2024-04-22 21:51:20 -05:00
|
|
|
if (gGameStandby) {
|
|
|
|
Game_InitStandbyDL(&gUnkDisp1);
|
|
|
|
gGameStandby = false;
|
2023-11-14 21:34:10 -06:00
|
|
|
return;
|
|
|
|
}
|
2024-08-12 11:58:54 -03:00
|
|
|
|
2024-04-22 21:51:20 -05:00
|
|
|
Game_InitMasterDL(&gUnkDisp1);
|
|
|
|
Game_SetScene();
|
2024-08-12 11:58:54 -03:00
|
|
|
|
2024-04-22 21:51:20 -05:00
|
|
|
if (Game_ChangeScene() != true) {
|
2024-04-08 17:25:56 -05:00
|
|
|
Lib_InitPerspective(&gUnkDisp1);
|
2024-04-22 21:51:20 -05:00
|
|
|
Game_InitViewport(&gUnkDisp1, gCamCount, 0);
|
2024-08-12 11:58:54 -03:00
|
|
|
|
2024-04-08 17:25:56 -05:00
|
|
|
if (gNextGameStateTimer != 0) {
|
|
|
|
gNextGameStateTimer--;
|
2023-11-14 21:34:10 -06:00
|
|
|
}
|
2024-04-06 04:25:11 -06:00
|
|
|
|
2023-12-14 08:41:43 -06:00
|
|
|
switch (gGameState) {
|
|
|
|
case GSTATE_BOOT:
|
2024-04-08 17:25:56 -05:00
|
|
|
gNextGameStateTimer = 2;
|
2023-12-14 08:41:43 -06:00
|
|
|
gGameState++;
|
2023-11-14 21:34:10 -06:00
|
|
|
break;
|
2024-08-12 11:58:54 -03:00
|
|
|
|
2023-12-14 08:41:43 -06:00
|
|
|
case GSTATE_BOOT_WAIT:
|
2024-04-08 17:25:56 -05:00
|
|
|
if (gNextGameStateTimer == 0) {
|
2023-12-14 08:41:43 -06:00
|
|
|
gGameState++;
|
2023-11-14 21:34:10 -06:00
|
|
|
}
|
|
|
|
break;
|
2024-08-12 11:58:54 -03:00
|
|
|
|
2023-12-14 08:41:43 -06:00
|
|
|
case GSTATE_SHOW_LOGO:
|
2024-11-20 19:22:25 -03:00
|
|
|
RCP_SetupDL(&gMasterDisp, SETUPDL_76_POINT);
|
2023-11-14 21:34:10 -06:00
|
|
|
gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 255, 255, 255);
|
2024-04-08 18:05:46 -06:00
|
|
|
Lib_TextureRect_IA8(&gMasterDisp, gNintendoLogo, 128, 74, 100.0f, 86.0f, 1.0f, 1.0f);
|
2023-12-14 08:41:43 -06:00
|
|
|
gGameState++;
|
2023-11-14 21:34:10 -06:00
|
|
|
break;
|
2024-08-12 11:58:54 -03:00
|
|
|
|
2023-12-14 08:41:43 -06:00
|
|
|
case GSTATE_CHECK_SAVE:
|
2023-11-24 13:11:20 -06:00
|
|
|
if (Save_Read() != 0) {
|
2024-05-08 13:57:11 -05:00
|
|
|
#ifdef AVOID_UB
|
|
|
|
gSaveFile.save = gDefaultSave;
|
|
|
|
gSaveFile.backup = gDefaultSave;
|
|
|
|
#else
|
2023-11-26 15:27:05 -06:00
|
|
|
gSaveFile = *((SaveFile*) &gDefaultSave);
|
2024-05-08 13:57:11 -05:00
|
|
|
#endif
|
2023-11-24 13:11:20 -06:00
|
|
|
Save_Write();
|
2023-11-14 21:34:10 -06:00
|
|
|
}
|
2023-12-14 08:41:43 -06:00
|
|
|
gGameState++;
|
2024-01-02 15:33:26 -06:00
|
|
|
Timer_CreateTask(MSEC_TO_CYCLES(1000), Timer_Increment, (s32*) &gGameState, 1);
|
2023-12-14 08:41:43 -06:00
|
|
|
/* fallthrough */
|
|
|
|
case GSTATE_LOGO_WAIT:
|
2024-11-20 19:22:25 -03:00
|
|
|
RCP_SetupDL(&gMasterDisp, SETUPDL_76_POINT);
|
2023-11-14 21:34:10 -06:00
|
|
|
gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 255, 255, 255);
|
2024-04-08 18:05:46 -06:00
|
|
|
Lib_TextureRect_IA8(&gMasterDisp, gNintendoLogo, 128, 74, 100.0f, 86.0f, 1.0f, 1.0f);
|
2023-11-14 21:34:10 -06:00
|
|
|
break;
|
2024-08-12 11:58:54 -03:00
|
|
|
|
2023-12-14 08:41:43 -06:00
|
|
|
case GSTATE_START:
|
|
|
|
gGameState = GSTATE_INIT;
|
2024-04-22 21:51:20 -05:00
|
|
|
gSceneId = SCENE_TITLE;
|
|
|
|
gSceneSetup = 0;
|
2023-11-14 21:34:10 -06:00
|
|
|
break;
|
2024-08-12 11:58:54 -03:00
|
|
|
|
2023-12-14 08:41:43 -06:00
|
|
|
case GSTATE_INIT:
|
|
|
|
gGameState = GSTATE_TITLE;
|
2024-04-25 17:01:25 -05:00
|
|
|
gTitleState = 1;
|
2024-05-25 12:17:03 -05:00
|
|
|
gClearPlayerInfo = true;
|
2023-11-24 13:11:20 -06:00
|
|
|
Memory_FreeAll();
|
2024-04-20 14:18:31 -05:00
|
|
|
Play_ClearObjectData();
|
2023-12-14 08:41:43 -06:00
|
|
|
gCamCount = 1;
|
|
|
|
gLifeCount[0] = 2;
|
2024-05-02 15:46:51 -05:00
|
|
|
gPathProgress = 0.0f;
|
2024-04-22 21:51:20 -05:00
|
|
|
D_hud_8016170C = gCsFrameCount = gShowLevelClearStatusScreen = gLevelStartStatusScreenTimer =
|
2024-04-25 17:01:25 -05:00
|
|
|
gLevelClearScreenTimer = gVsMatchState = gVersusMode = gTitleState = gStarCount = gMapState =
|
|
|
|
gPlayState = gOptionMenuStatus = gDrawMode = gShowBossHealth = gShowHud = gBgColor =
|
|
|
|
gFillScreenAlpha = 0;
|
2024-04-02 18:20:08 -05:00
|
|
|
gNextGameState = D_ctx_80177C94 = D_ctx_80177CAC = D_ctx_80177CB4 = D_ctx_80177CBC = D_ctx_80177CC4 =
|
2024-05-11 15:53:37 -05:00
|
|
|
D_ctx_80177C9C = D_ctx_80177CA4 = D_play_80161A5C = gLastGameState = GSTATE_NONE;
|
2024-05-08 13:57:11 -05:00
|
|
|
#ifdef MODS_BOOT_STATE
|
|
|
|
gNextGameState = MODS_BOOT_STATE;
|
|
|
|
#endif
|
2024-11-16 00:23:55 -06:00
|
|
|
CVarSetFloat("gMainMusicVolume", gSaveFile.save.data.musicVolume / 100.0f);
|
|
|
|
CVarSetFloat("gVoiceVolume", gSaveFile.save.data.voiceVolume / 100.0f);
|
|
|
|
CVarSetFloat("gSFXMusicVolume", gSaveFile.save.data.sfxVolume / 100.0f);
|
2023-11-14 21:34:10 -06:00
|
|
|
for (i = 0; i < 4; i++) {
|
2023-12-24 13:28:35 -06:00
|
|
|
gBoostButton[i] = L_CBUTTONS;
|
|
|
|
gBrakeButton[i] = D_CBUTTONS;
|
|
|
|
gShootButton[i] = A_BUTTON;
|
|
|
|
gBombButton[i] = B_BUTTON;
|
2023-11-14 21:34:10 -06:00
|
|
|
|
2024-04-02 18:20:08 -05:00
|
|
|
D_ctx_80177958[i] = 1.0f;
|
2023-11-14 21:34:10 -06:00
|
|
|
|
2024-04-02 18:20:08 -05:00
|
|
|
D_ctx_80177858[i] = 3;
|
2024-04-22 21:51:20 -05:00
|
|
|
gPlayerForms[i] = FORM_ARWING;
|
2024-08-12 11:58:54 -03:00
|
|
|
gShowReticles[i] = true;
|
2024-04-22 21:51:20 -05:00
|
|
|
gPlayerGlareAlphas[i] = 0;
|
2023-11-14 21:34:10 -06:00
|
|
|
}
|
2024-08-12 11:58:54 -03:00
|
|
|
|
2023-12-20 13:32:50 -06:00
|
|
|
gVersusStage = 0;
|
2024-04-25 17:01:25 -05:00
|
|
|
gVsPointsToWin = 3;
|
2023-12-14 08:41:43 -06:00
|
|
|
gBlurAlpha = 255;
|
2024-05-05 21:29:59 +01:00
|
|
|
for (i = 0; i < ARRAY_COUNT(gLeveLClearStatus); i++) {
|
2024-04-24 23:14:49 -05:00
|
|
|
gLeveLClearStatus[i] = 0;
|
2023-11-14 21:34:10 -06:00
|
|
|
}
|
2024-08-12 11:58:54 -03:00
|
|
|
|
2023-12-06 18:16:49 -06:00
|
|
|
gExpertMode = false;
|
2024-04-22 21:51:20 -05:00
|
|
|
gOptionSoundMode = gSaveFile.save.data.soundMode;
|
|
|
|
switch (gOptionSoundMode) {
|
2024-03-16 23:06:28 -05:00
|
|
|
case OPTIONSOUND_STEREO:
|
2024-04-22 21:51:20 -05:00
|
|
|
soundMode = SOUNDMODE_STEREO;
|
2023-11-14 21:34:10 -06:00
|
|
|
break;
|
2024-03-16 23:06:28 -05:00
|
|
|
case OPTIONSOUND_MONO:
|
2024-04-22 21:51:20 -05:00
|
|
|
soundMode = SOUNDMODE_MONO;
|
2023-11-14 21:34:10 -06:00
|
|
|
break;
|
2024-03-16 23:06:28 -05:00
|
|
|
case OPTIONSOUND_HEADSET:
|
2024-04-22 21:51:20 -05:00
|
|
|
soundMode = SOUNDMODE_HEADSET;
|
2023-11-14 21:34:10 -06:00
|
|
|
break;
|
|
|
|
default:
|
2024-04-22 21:51:20 -05:00
|
|
|
gOptionSoundMode = OPTIONSOUND_STEREO;
|
|
|
|
soundMode = SOUNDMODE_STEREO;
|
2023-11-14 21:34:10 -06:00
|
|
|
break;
|
|
|
|
}
|
2024-04-22 21:51:20 -05:00
|
|
|
SEQCMD_SET_SOUND_MODE(soundMode);
|
2024-05-06 17:45:24 -05:00
|
|
|
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;
|
2023-11-14 21:34:10 -06:00
|
|
|
}
|
2024-05-06 17:45:24 -05:00
|
|
|
if (gVolumeSettings[AUDIO_TYPE_VOICE] > 99) {
|
|
|
|
gVolumeSettings[AUDIO_TYPE_VOICE] = 99;
|
2023-11-14 21:34:10 -06:00
|
|
|
}
|
2024-05-06 17:45:24 -05:00
|
|
|
if (gVolumeSettings[AUDIO_TYPE_SFX] > 99) {
|
|
|
|
gVolumeSettings[AUDIO_TYPE_SFX] = 99;
|
2023-11-14 21:34:10 -06:00
|
|
|
}
|
2024-05-06 17:45:24 -05:00
|
|
|
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]);
|
2023-11-14 21:34:10 -06:00
|
|
|
break;
|
2024-08-12 11:58:54 -03:00
|
|
|
|
2023-12-24 13:28:35 -06:00
|
|
|
case GSTATE_TITLE:
|
2024-04-15 18:38:19 -05:00
|
|
|
OvlMenu_CallFunction(OVLCALL_TITLE_UPDATE, NULL);
|
2023-11-14 21:34:10 -06:00
|
|
|
break;
|
2023-12-24 13:28:35 -06:00
|
|
|
case GSTATE_MENU:
|
2024-04-15 18:38:19 -05:00
|
|
|
OvlMenu_CallFunction(OVLCALL_OPTION_UPDATE, NULL);
|
2023-11-14 21:34:10 -06:00
|
|
|
break;
|
2023-12-24 13:28:35 -06:00
|
|
|
case GSTATE_MAP:
|
2024-04-22 21:51:20 -05:00
|
|
|
Map_Main();
|
2023-11-14 21:34:10 -06:00
|
|
|
break;
|
2023-12-24 13:28:35 -06:00
|
|
|
case GSTATE_VS_INIT:
|
2024-04-22 21:51:20 -05:00
|
|
|
Versus_StartMatch();
|
2023-11-14 21:34:10 -06:00
|
|
|
break;
|
2023-12-24 13:28:35 -06:00
|
|
|
case GSTATE_PLAY:
|
2024-04-08 17:25:56 -05:00
|
|
|
Play_Main();
|
2023-11-14 21:34:10 -06:00
|
|
|
break;
|
2023-12-24 13:28:35 -06:00
|
|
|
case GSTATE_GAME_OVER:
|
2024-04-15 18:38:19 -05:00
|
|
|
OvlMenu_CallFunction(OVLCALL_GAME_OVER_UPDATE, NULL);
|
2023-11-14 21:34:10 -06:00
|
|
|
break;
|
2024-04-08 17:25:56 -05:00
|
|
|
case GSTATE_ENDING:
|
|
|
|
gDrawMode = DRAW_ENDING;
|
2024-04-22 21:51:20 -05:00
|
|
|
Ending_Main();
|
2023-11-14 21:34:10 -06:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
2024-08-12 11:58:54 -03:00
|
|
|
|
2024-04-08 17:25:56 -05:00
|
|
|
Game_Draw(0);
|
2024-08-12 11:58:54 -03:00
|
|
|
|
2023-12-14 08:41:43 -06:00
|
|
|
if (gCamCount == 2) {
|
2024-04-22 21:51:20 -05:00
|
|
|
Game_InitViewport(&gMasterDisp, gCamCount, 1);
|
2024-04-08 17:25:56 -05:00
|
|
|
Game_Draw(1);
|
2023-11-14 21:34:10 -06:00
|
|
|
gDPPipeSync(gMasterDisp++);
|
2024-04-11 11:55:32 -05:00
|
|
|
gDPSetScissor(gMasterDisp++, G_SC_NON_INTERLACE, SCREEN_MARGIN, SCREEN_MARGIN, SCREEN_WIDTH - SCREEN_MARGIN,
|
|
|
|
SCREEN_HEIGHT - SCREEN_MARGIN);
|
2024-04-08 17:25:56 -05:00
|
|
|
} else if ((gCamCount == 4) && (gDrawMode != DRAW_NONE)) {
|
2024-04-22 21:51:20 -05:00
|
|
|
Game_InitViewport(&gMasterDisp, gCamCount, 3);
|
2024-04-08 17:25:56 -05:00
|
|
|
Game_Draw(3);
|
2024-04-22 21:51:20 -05:00
|
|
|
Game_InitViewport(&gMasterDisp, gCamCount, 2);
|
2024-04-08 17:25:56 -05:00
|
|
|
Game_Draw(2);
|
2024-04-22 21:51:20 -05:00
|
|
|
Game_InitViewport(&gMasterDisp, gCamCount, 1);
|
2024-04-08 17:25:56 -05:00
|
|
|
Game_Draw(1);
|
2023-11-14 21:34:10 -06:00
|
|
|
gDPPipeSync(gMasterDisp++);
|
2024-04-11 11:55:32 -05:00
|
|
|
gDPSetScissor(gMasterDisp++, G_SC_NON_INTERLACE, SCREEN_MARGIN, SCREEN_MARGIN, SCREEN_WIDTH - SCREEN_MARGIN,
|
|
|
|
SCREEN_HEIGHT - SCREEN_MARGIN);
|
2023-11-14 21:34:10 -06:00
|
|
|
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);
|
2024-04-20 14:18:31 -05:00
|
|
|
gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 0, 0, 0, 0);
|
2024-04-11 11:55:32 -05:00
|
|
|
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);
|
2023-11-14 21:34:10 -06:00
|
|
|
|
2023-12-24 13:28:35 -06:00
|
|
|
if (gLevelType == LEVELTYPE_PLANET) {
|
2024-04-20 14:18:31 -05:00
|
|
|
gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 0, 0, 0, 255);
|
2023-11-14 21:34:10 -06:00
|
|
|
} else {
|
2024-04-20 14:18:31 -05:00
|
|
|
gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 100, 100, 255, 255);
|
2023-11-14 21:34:10 -06:00
|
|
|
}
|
2024-04-11 11:55:32 -05:00
|
|
|
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);
|
2023-11-14 21:34:10 -06:00
|
|
|
|
2024-09-13 00:59:33 -03:00
|
|
|
HUD_8008CB8C();
|
2023-11-14 21:34:10 -06:00
|
|
|
}
|
2024-08-12 11:58:54 -03:00
|
|
|
|
2024-04-22 21:51:20 -05:00
|
|
|
partialFill = false;
|
2024-08-12 11:58:54 -03:00
|
|
|
|
2023-12-14 08:41:43 -06:00
|
|
|
if (gCamCount == 1) {
|
2024-11-12 13:21:26 -03:00
|
|
|
Graphics_FillRectangle(&gMasterDisp, OTRGetRectDimensionFromLeftEdge(0), 0,
|
|
|
|
OTRGetRectDimensionFromRightEdge(SCREEN_WIDTH - 1), SCREEN_HEIGHT - 1,
|
|
|
|
gPlayerGlareReds[0], gPlayerGlareGreens[0], gPlayerGlareBlues[0],
|
|
|
|
gPlayerGlareAlphas[0]);
|
2024-04-08 17:25:56 -05:00
|
|
|
if ((gDrawMode == DRAW_PLAY) || (gDrawMode == DRAW_ENDING)) {
|
2024-04-25 17:01:25 -05:00
|
|
|
Radio_Draw();
|
2024-04-22 21:51:20 -05:00
|
|
|
if (gShowHud) {
|
2024-04-25 17:01:25 -05:00
|
|
|
HUD_Draw();
|
2024-09-13 00:59:33 -03:00
|
|
|
HUD_EdgeArrows_Update();
|
2023-11-14 21:34:10 -06:00
|
|
|
}
|
2024-04-25 17:01:25 -05:00
|
|
|
HUD_DrawBossHealth();
|
2023-11-14 21:34:10 -06:00
|
|
|
}
|
|
|
|
} else {
|
2023-12-14 08:41:43 -06:00
|
|
|
for (i = 0; i < gCamCount; i++) {
|
2024-05-25 12:17:03 -05:00
|
|
|
if (gPlayer[i].dmgEffectTimer != 0) {
|
2023-11-14 21:34:10 -06:00
|
|
|
|
2024-04-05 15:11:36 -05:00
|
|
|
Graphics_FillRectangle(&gMasterDisp, sVsCameraULx[i], sVsCameraULy[i], sVsCameraLRx[i],
|
2024-04-08 17:25:56 -05:00
|
|
|
sVsCameraLRy[i], gFillScreenRed, gFillScreenGreen, gFillScreenBlue,
|
|
|
|
gFillScreenAlpha);
|
2024-04-22 21:51:20 -05:00
|
|
|
partialFill = true;
|
2023-11-14 21:34:10 -06:00
|
|
|
} else {
|
2024-04-05 15:11:36 -05:00
|
|
|
Graphics_FillRectangle(&gMasterDisp, sVsCameraULx[i], sVsCameraULy[i], sVsCameraLRx[i],
|
2024-04-22 21:51:20 -05:00
|
|
|
sVsCameraLRy[i], gPlayerGlareReds[i], gPlayerGlareGreens[i],
|
|
|
|
gPlayerGlareBlues[i], gPlayerGlareAlphas[i]);
|
2023-11-14 21:34:10 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2024-08-12 11:58:54 -03:00
|
|
|
|
2024-04-25 17:01:25 -05:00
|
|
|
Background_dummy_80040CDC();
|
|
|
|
HUD_DrawStatusScreens();
|
2024-05-03 14:56:26 -05:00
|
|
|
AllRange_DrawCountdown();
|
2024-08-12 11:58:54 -03:00
|
|
|
|
2024-01-02 15:33:26 -06:00
|
|
|
if ((gGameState == GSTATE_PLAY) && gVersusMode) {
|
2024-04-25 17:01:25 -05:00
|
|
|
Versus_Draw();
|
2023-11-14 21:34:10 -06:00
|
|
|
}
|
2024-05-11 15:53:37 -05:00
|
|
|
|
|
|
|
Wipe_Draw(WIPE_CIRCULAR, gCircleWipeFrame);
|
2024-05-14 09:44:12 -05:00
|
|
|
|
2024-04-22 21:51:20 -05:00
|
|
|
if (!partialFill) {
|
2024-11-12 13:21:26 -03:00
|
|
|
Graphics_FillRectangle(&gMasterDisp, OTRGetRectDimensionFromLeftEdge(0), 0,
|
2024-11-24 23:10:12 -06:00
|
|
|
OTRGetRectDimensionFromRightEdge(SCREEN_WIDTH), SCREEN_HEIGHT,
|
2024-11-12 13:21:26 -03:00
|
|
|
gFillScreenRed, gFillScreenGreen, gFillScreenBlue, gFillScreenAlpha);
|
2023-11-14 21:34:10 -06:00
|
|
|
}
|
2024-04-25 17:01:25 -05:00
|
|
|
Audio_dummy_80016A50();
|
2024-05-20 09:28:13 -05:00
|
|
|
#if MODS_RAM_MOD == 1
|
|
|
|
RamMod_Update();
|
2024-05-08 13:57:11 -05:00
|
|
|
#endif
|
|
|
|
#if MODS_FPS_COUNTER == 1
|
|
|
|
Play_RenderFps();
|
2024-08-12 11:58:54 -03:00
|
|
|
#endif
|
2024-11-18 20:00:42 -06:00
|
|
|
if(CVarGetInteger("gSpawnerMod", 0) == 1){
|
|
|
|
Spawner();
|
|
|
|
}
|
2023-11-14 21:34:10 -06:00
|
|
|
}
|
2024-11-12 13:21:26 -03:00
|
|
|
RCP_SetupDL(&gMasterDisp, SETUPDL_83);
|
|
|
|
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 0, 255);
|
2024-11-15 19:46:32 -03:00
|
|
|
// Graphics_DisplaySmallText(10, 180, 1.0f, 1.0f, "SAM_HIGH:");
|
|
|
|
// Graphics_DisplaySmallNumber(90, 180, samples_high + audBuffer);
|
|
|
|
// Graphics_DisplaySmallText(10, 190, 1.0f, 1.0f, "SAM_LOW:");
|
|
|
|
// Graphics_DisplaySmallNumber(90, 190, samples_low + audBuffer);
|
|
|
|
// Graphics_DisplaySmallText(10, 200, 1.0f, 1.0f, "AUDIOBUF:");
|
|
|
|
// Graphics_DisplaySmallNumber(90, 200, audBuffer);
|
|
|
|
// Graphics_DisplaySmallText(10, 210, 1.0f, 1.0f, "AUDIOSPEC:");
|
|
|
|
// Graphics_DisplaySmallNumber(90, 210, gAudioSpecId);
|
|
|
|
// Graphics_DisplaySmallText(10, 220, 1.0f, 1.0f, "TICKS:");
|
|
|
|
// Graphics_DisplaySmallNumber(90, 220, gAudioBufferParams.ticksPerUpdate);
|
2024-11-12 20:48:19 -03:00
|
|
|
if (gControllerPress[0].button & L_JPAD) {
|
2024-11-15 19:32:24 -03:00
|
|
|
// audBuffer-=1;
|
|
|
|
} else if (gControllerPress[0].button & R_JPAD) {
|
|
|
|
// audBuffer+=1;
|
2024-11-12 20:48:19 -03:00
|
|
|
}
|
2023-11-14 21:34:10 -06:00
|
|
|
}
|
2023-10-19 10:57:03 -05:00
|
|
|
|
2024-05-08 13:57:11 -05:00
|
|
|
#if MODS_FPS_COUNTER == 1
|
|
|
|
#include "../mods/fpscounter.c"
|
|
|
|
#endif
|
2024-05-20 09:28:13 -05:00
|
|
|
#if MODS_RAM_MOD == 1
|
2024-05-08 13:57:11 -05:00
|
|
|
#include "../mods/object_ram.c"
|
|
|
|
#endif
|
2024-08-12 11:58:54 -03:00
|
|
|
#if MODS_SPAWNER == 1
|
|
|
|
#include "../mods/spawner.c"
|
|
|
|
#endif
|
2024-05-08 13:57:11 -05:00
|
|
|
|
2024-05-06 17:45:24 -05:00
|
|
|
Actor* Game_SpawnActor(ObjectId objId) {
|
2024-09-17 02:04:15 -03:00
|
|
|
Actor* actor = &gActors[0];
|
2023-11-12 16:49:03 -06:00
|
|
|
s32 i;
|
|
|
|
|
2024-01-13 22:45:37 +00:00
|
|
|
for (i = 0; i < ARRAY_COUNT(gActors); i++, actor++) {
|
2024-01-21 14:42:06 -06:00
|
|
|
if (actor->obj.status == OBJ_FREE) {
|
2024-01-13 22:45:37 +00:00
|
|
|
Actor_Initialize(actor);
|
2024-01-21 14:42:06 -06:00
|
|
|
actor->obj.status = OBJ_INIT;
|
2024-02-10 12:09:27 -06:00
|
|
|
actor->obj.id = objId;
|
2024-01-13 22:45:37 +00:00
|
|
|
Object_SetInfo(&actor->info, actor->obj.id);
|
2023-11-12 16:49:03 -06:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2024-01-13 22:45:37 +00:00
|
|
|
if (i == ARRAY_COUNT(gActors)) {
|
|
|
|
actor = NULL;
|
2023-11-12 16:49:03 -06:00
|
|
|
}
|
2024-01-13 22:45:37 +00:00
|
|
|
return actor;
|
2023-11-12 16:49:03 -06:00
|
|
|
}
|