2020-10-03 15:22:44 +00:00
|
|
|
|
#include "global.h"
|
2022-10-15 06:16:37 +00:00
|
|
|
|
#include "quake.h"
|
2022-11-01 23:17:11 +00:00
|
|
|
|
#include "terminal.h"
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-12-24 18:55:17 +00:00
|
|
|
|
void* gDebugCutsceneScript = NULL;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
UNK_TYPE D_8012D1F4 = 0; // unused
|
|
|
|
|
Input* D_8012D1F8 = NULL;
|
|
|
|
|
|
2022-12-28 21:29:59 +00:00
|
|
|
|
TransitionTile sTransitionTile;
|
|
|
|
|
s32 gTransitionTileState;
|
2020-05-15 09:02:39 +00:00
|
|
|
|
VisMono D_80161498;
|
2022-12-24 18:55:17 +00:00
|
|
|
|
Color_RGBA8_u32 gVisMonoColor;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
FaultClient D_801614B8;
|
2022-04-27 20:00:25 +00:00
|
|
|
|
s16 sTransitionFillTimer;
|
2022-12-24 18:55:17 +00:00
|
|
|
|
u64 sDebugCutsceneScriptBuf[0xA00];
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
2022-07-31 23:44:47 +00:00
|
|
|
|
void Play_SpawnScene(PlayState* this, s32 sceneId, s32 spawn);
|
2022-05-17 22:41:50 +00:00
|
|
|
|
|
2022-06-21 17:25:09 +00:00
|
|
|
|
// This macro prints the number "1" with a file and line number if R_ENABLE_PLAY_LOGS is enabled.
|
|
|
|
|
// For example, it can be used to trace the play state execution at a high level.
|
|
|
|
|
#define PLAY_LOG(line) \
|
|
|
|
|
do { \
|
|
|
|
|
if (R_ENABLE_PLAY_LOGS) { \
|
|
|
|
|
LOG_NUM("1", 1, "../z_play.c", line); \
|
|
|
|
|
} \
|
|
|
|
|
} while (0)
|
|
|
|
|
|
2022-06-21 00:31:53 +00:00
|
|
|
|
void Play_ChangeViewpointBgCamIndex(PlayState* this) {
|
|
|
|
|
Camera_ChangeBgCamIndex(GET_ACTIVE_CAM(this), this->viewpoint - 1);
|
2020-03-17 04:31:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-06-21 00:31:53 +00:00
|
|
|
|
void Play_SetViewpoint(PlayState* this, s16 viewpoint) {
|
|
|
|
|
ASSERT(viewpoint == VIEWPOINT_LOCKED || viewpoint == VIEWPOINT_PIVOT, "point == 1 || point == 2", "../z_play.c",
|
|
|
|
|
2160);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-06-21 00:31:53 +00:00
|
|
|
|
this->viewpoint = viewpoint;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2023-08-13 19:24:26 +00:00
|
|
|
|
if ((R_SCENE_CAM_TYPE != SCENE_CAM_TYPE_FIXED_SHOP_VIEWPOINT) && (gSaveContext.save.cutsceneIndex < 0xFFF0)) {
|
2022-06-21 00:31:53 +00:00
|
|
|
|
// Play a sfx when the player toggles the camera
|
2022-07-30 13:05:27 +00:00
|
|
|
|
Audio_PlaySfxGeneral((viewpoint == VIEWPOINT_LOCKED) ? NA_SE_SY_CAMERA_ZOOM_DOWN : NA_SE_SY_CAMERA_ZOOM_UP,
|
|
|
|
|
&gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale,
|
|
|
|
|
&gSfxDefaultReverb);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-06-21 00:31:53 +00:00
|
|
|
|
Play_ChangeViewpointBgCamIndex(this);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
2022-06-21 00:31:53 +00:00
|
|
|
|
/**
|
|
|
|
|
* @return true if the currently set viewpoint is the same as the one provided in the argument
|
|
|
|
|
*/
|
|
|
|
|
s32 Play_CheckViewpoint(PlayState* this, s16 viewpoint) {
|
|
|
|
|
return (viewpoint == this->viewpoint);
|
2020-03-17 04:31:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-06-21 00:31:53 +00:00
|
|
|
|
/**
|
|
|
|
|
* If the scene is a shop, set the viewpoint that will set the bgCamIndex
|
|
|
|
|
* to toggle the camera into a "browsing item selection" setting.
|
|
|
|
|
*/
|
|
|
|
|
void Play_SetShopBrowsingViewpoint(PlayState* this) {
|
2020-03-17 04:31:30 +00:00
|
|
|
|
osSyncPrintf("Game_play_shop_pr_vr_switch_set()\n");
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-06-21 00:31:53 +00:00
|
|
|
|
if (R_SCENE_CAM_TYPE == SCENE_CAM_TYPE_FIXED_SHOP_VIEWPOINT) {
|
|
|
|
|
this->viewpoint = VIEWPOINT_PIVOT;
|
2020-03-17 04:31:30 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-21 18:23:43 +00:00
|
|
|
|
void Play_SetupTransition(PlayState* this, s32 transitionType) {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
TransitionContext* transitionCtx = &this->transitionCtx;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
|
|
|
|
bzero(transitionCtx, sizeof(TransitionContext));
|
|
|
|
|
|
2020-04-30 18:41:09 +00:00
|
|
|
|
transitionCtx->transitionType = transitionType;
|
|
|
|
|
|
2022-04-27 20:00:25 +00:00
|
|
|
|
// circle types
|
2020-04-30 18:41:09 +00:00
|
|
|
|
if ((transitionCtx->transitionType >> 5) == 1) {
|
|
|
|
|
transitionCtx->init = TransitionCircle_Init;
|
|
|
|
|
transitionCtx->destroy = TransitionCircle_Destroy;
|
|
|
|
|
transitionCtx->start = TransitionCircle_Start;
|
|
|
|
|
transitionCtx->isDone = TransitionCircle_IsDone;
|
|
|
|
|
transitionCtx->draw = TransitionCircle_Draw;
|
|
|
|
|
transitionCtx->update = TransitionCircle_Update;
|
|
|
|
|
transitionCtx->setType = TransitionCircle_SetType;
|
|
|
|
|
transitionCtx->setColor = TransitionCircle_SetColor;
|
2022-05-04 19:25:26 +00:00
|
|
|
|
transitionCtx->setUnkColor = TransitionCircle_SetUnkColor;
|
2020-08-15 17:23:29 +00:00
|
|
|
|
} else {
|
|
|
|
|
switch (transitionCtx->transitionType) {
|
2022-04-27 20:00:25 +00:00
|
|
|
|
case TRANS_TYPE_TRIFORCE:
|
2020-08-15 17:23:29 +00:00
|
|
|
|
transitionCtx->init = TransitionTriforce_Init;
|
|
|
|
|
transitionCtx->destroy = TransitionTriforce_Destroy;
|
|
|
|
|
transitionCtx->start = TransitionTriforce_Start;
|
|
|
|
|
transitionCtx->isDone = TransitionTriforce_IsDone;
|
|
|
|
|
transitionCtx->draw = TransitionTriforce_Draw;
|
|
|
|
|
transitionCtx->update = TransitionTriforce_Update;
|
|
|
|
|
transitionCtx->setType = TransitionTriforce_SetType;
|
|
|
|
|
transitionCtx->setColor = TransitionTriforce_SetColor;
|
2022-05-04 19:25:26 +00:00
|
|
|
|
transitionCtx->setUnkColor = NULL;
|
2020-08-15 17:23:29 +00:00
|
|
|
|
break;
|
2022-04-27 20:00:25 +00:00
|
|
|
|
|
|
|
|
|
case TRANS_TYPE_WIPE:
|
|
|
|
|
case TRANS_TYPE_WIPE_FAST:
|
2020-08-15 17:23:29 +00:00
|
|
|
|
transitionCtx->init = TransitionWipe_Init;
|
|
|
|
|
transitionCtx->destroy = TransitionWipe_Destroy;
|
|
|
|
|
transitionCtx->start = TransitionWipe_Start;
|
|
|
|
|
transitionCtx->isDone = TransitionWipe_IsDone;
|
|
|
|
|
transitionCtx->draw = TransitionWipe_Draw;
|
|
|
|
|
transitionCtx->update = TransitionWipe_Update;
|
|
|
|
|
transitionCtx->setType = TransitionWipe_SetType;
|
|
|
|
|
transitionCtx->setColor = TransitionWipe_SetColor;
|
2022-05-04 19:25:26 +00:00
|
|
|
|
transitionCtx->setUnkColor = NULL;
|
2020-08-15 17:23:29 +00:00
|
|
|
|
break;
|
2022-04-27 20:00:25 +00:00
|
|
|
|
|
|
|
|
|
case TRANS_TYPE_FADE_BLACK:
|
|
|
|
|
case TRANS_TYPE_FADE_WHITE:
|
|
|
|
|
case TRANS_TYPE_FADE_BLACK_FAST:
|
|
|
|
|
case TRANS_TYPE_FADE_WHITE_FAST:
|
|
|
|
|
case TRANS_TYPE_FADE_BLACK_SLOW:
|
|
|
|
|
case TRANS_TYPE_FADE_WHITE_SLOW:
|
|
|
|
|
case TRANS_TYPE_FADE_WHITE_CS_DELAYED:
|
|
|
|
|
case TRANS_TYPE_FADE_WHITE_INSTANT:
|
|
|
|
|
case TRANS_TYPE_FADE_GREEN:
|
|
|
|
|
case TRANS_TYPE_FADE_BLUE:
|
2020-08-15 17:23:29 +00:00
|
|
|
|
transitionCtx->init = TransitionFade_Init;
|
|
|
|
|
transitionCtx->destroy = TransitionFade_Destroy;
|
|
|
|
|
transitionCtx->start = TransitionFade_Start;
|
|
|
|
|
transitionCtx->isDone = TransitionFade_IsDone;
|
|
|
|
|
transitionCtx->draw = TransitionFade_Draw;
|
|
|
|
|
transitionCtx->update = TransitionFade_Update;
|
|
|
|
|
transitionCtx->setType = TransitionFade_SetType;
|
|
|
|
|
transitionCtx->setColor = TransitionFade_SetColor;
|
2022-05-04 19:25:26 +00:00
|
|
|
|
transitionCtx->setUnkColor = NULL;
|
2020-08-15 17:23:29 +00:00
|
|
|
|
break;
|
2022-04-27 20:00:25 +00:00
|
|
|
|
|
|
|
|
|
case TRANS_TYPE_FILL_WHITE2:
|
|
|
|
|
case TRANS_TYPE_FILL_WHITE:
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->transitionMode = TRANS_MODE_FILL_WHITE_INIT;
|
2020-08-15 17:23:29 +00:00
|
|
|
|
break;
|
2022-04-27 20:00:25 +00:00
|
|
|
|
|
|
|
|
|
case TRANS_TYPE_INSTANT:
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->transitionMode = TRANS_MODE_INSTANT;
|
2020-08-15 17:23:29 +00:00
|
|
|
|
break;
|
2022-04-27 20:00:25 +00:00
|
|
|
|
|
|
|
|
|
case TRANS_TYPE_FILL_BROWN:
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->transitionMode = TRANS_MODE_FILL_BROWN_INIT;
|
2020-08-15 17:23:29 +00:00
|
|
|
|
break;
|
2022-04-27 20:00:25 +00:00
|
|
|
|
|
|
|
|
|
case TRANS_TYPE_SANDSTORM_PERSIST:
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->transitionMode = TRANS_MODE_SANDSTORM_INIT;
|
2020-08-15 17:23:29 +00:00
|
|
|
|
break;
|
2022-04-27 20:00:25 +00:00
|
|
|
|
|
|
|
|
|
case TRANS_TYPE_SANDSTORM_END:
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->transitionMode = TRANS_MODE_SANDSTORM_END_INIT;
|
2020-08-15 17:23:29 +00:00
|
|
|
|
break;
|
2022-04-27 20:00:25 +00:00
|
|
|
|
|
|
|
|
|
case TRANS_TYPE_CS_BLACK_FILL:
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->transitionMode = TRANS_MODE_CS_BLACK_FILL_INIT;
|
2020-08-15 17:23:29 +00:00
|
|
|
|
break;
|
2022-04-27 20:00:25 +00:00
|
|
|
|
|
2020-08-15 17:23:29 +00:00
|
|
|
|
default:
|
|
|
|
|
Fault_AddHungupAndCrash("../z_play.c", 2290);
|
|
|
|
|
break;
|
|
|
|
|
}
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
2022-05-21 18:23:43 +00:00
|
|
|
|
void func_800BC88C(PlayState* this) {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->transitionCtx.transitionType = -1;
|
2020-03-17 04:31:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-05-21 18:23:43 +00:00
|
|
|
|
Gfx* Play_SetFog(PlayState* this, Gfx* gfx) {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
return Gfx_SetFog2(gfx, this->lightCtx.fogColor[0], this->lightCtx.fogColor[1], this->lightCtx.fogColor[2], 0,
|
|
|
|
|
this->lightCtx.fogNear, 1000);
|
2020-03-17 04:31:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
void Play_Destroy(GameState* thisx) {
|
2022-05-21 18:23:43 +00:00
|
|
|
|
PlayState* this = (PlayState*)thisx;
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Player* player = GET_PLAYER(this);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->state.gfxCtx->callback = NULL;
|
2022-10-04 05:18:50 +00:00
|
|
|
|
this->state.gfxCtx->callbackParam = NULL;
|
2022-06-21 17:25:09 +00:00
|
|
|
|
|
2020-04-16 21:36:12 +00:00
|
|
|
|
SREG(91) = 0;
|
2022-12-20 00:19:57 +00:00
|
|
|
|
R_PAUSE_BG_PRERENDER_STATE = PAUSE_BG_PRERENDER_OFF;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
PreRender_Destroy(&this->pauseBgPreRender);
|
|
|
|
|
Effect_DeleteAll(this);
|
|
|
|
|
EffectSs_ClearAll(this);
|
|
|
|
|
CollisionCheck_DestroyContext(this, &this->colChkCtx);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-12-28 21:29:59 +00:00
|
|
|
|
if (gTransitionTileState == TRANS_TILE_READY) {
|
|
|
|
|
TransitionTile_Destroy(&sTransitionTile);
|
|
|
|
|
gTransitionTileState = TRANS_TILE_OFF;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
if (this->transitionMode == TRANS_MODE_INSTANCE_RUNNING) {
|
|
|
|
|
this->transitionCtx.destroy(&this->transitionCtx.instanceData);
|
|
|
|
|
func_800BC88C(this);
|
|
|
|
|
this->transitionMode = TRANS_MODE_OFF;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-08-15 13:39:06 +00:00
|
|
|
|
Letterbox_Destroy();
|
2022-12-24 02:46:56 +00:00
|
|
|
|
TransitionFade_Destroy(&this->transitionFadeFlash);
|
2020-05-15 09:02:39 +00:00
|
|
|
|
VisMono_Destroy(&D_80161498);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2023-08-13 19:24:26 +00:00
|
|
|
|
if (gSaveContext.save.linkAge != this->linkAgeOnLoad) {
|
2020-04-16 21:36:12 +00:00
|
|
|
|
Inventory_SwapAgeEquipment();
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Player_SetEquipmentData(this, player);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
func_80031C3C(&this->actorCtx, this);
|
2022-08-24 01:13:03 +00:00
|
|
|
|
Interface_Destroy(this);
|
2022-05-17 22:41:50 +00:00
|
|
|
|
KaleidoScopeCall_Destroy(this);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
KaleidoManager_Destroy();
|
|
|
|
|
ZeldaArena_Cleanup();
|
|
|
|
|
Fault_RemoveClient(&D_801614B8);
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
void Play_Init(GameState* thisx) {
|
2022-05-21 18:23:43 +00:00
|
|
|
|
PlayState* this = (PlayState*)thisx;
|
2022-05-17 22:41:50 +00:00
|
|
|
|
GraphicsContext* gfxCtx = this->state.gfxCtx;
|
2023-07-10 19:03:01 +00:00
|
|
|
|
uintptr_t zAlloc;
|
|
|
|
|
uintptr_t zAllocAligned;
|
2021-01-13 01:02:56 +00:00
|
|
|
|
size_t zAllocSize;
|
|
|
|
|
Player* player;
|
2022-06-17 18:25:42 +00:00
|
|
|
|
s32 playerStartBgCamIndex;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
s32 i;
|
2022-07-30 21:28:50 +00:00
|
|
|
|
u8 baseSceneLayer;
|
2021-01-13 01:02:56 +00:00
|
|
|
|
s32 pad[2];
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2023-08-13 19:24:26 +00:00
|
|
|
|
if (gSaveContext.save.entranceIndex == ENTR_LOAD_OPENING) {
|
|
|
|
|
gSaveContext.save.entranceIndex = 0;
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->state.running = false;
|
2022-06-23 21:34:26 +00:00
|
|
|
|
SET_NEXT_GAMESTATE(&this->state, TitleSetup_Init, TitleSetupState);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SystemArena_Display();
|
2022-05-17 22:41:50 +00:00
|
|
|
|
GameState_Realloc(&this->state, 0x1D4790);
|
|
|
|
|
KaleidoManager_Init(this);
|
|
|
|
|
View_Init(&this->view, gfxCtx);
|
2021-11-07 16:58:50 +00:00
|
|
|
|
Audio_SetExtraFilter(0);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
Quake_Init();
|
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
for (i = 0; i < ARRAY_COUNT(this->cameraPtrs); i++) {
|
|
|
|
|
this->cameraPtrs[i] = NULL;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Camera_Init(&this->mainCamera, &this->view, &this->colCtx, this);
|
|
|
|
|
Camera_ChangeStatus(&this->mainCamera, CAM_STAT_ACTIVE);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
|
|
|
|
for (i = 0; i < 3; i++) {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Camera_Init(&this->subCameras[i], &this->view, &this->colCtx, this);
|
|
|
|
|
Camera_ChangeStatus(&this->subCameras[i], CAM_STAT_UNK100);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->cameraPtrs[CAM_ID_MAIN] = &this->mainCamera;
|
|
|
|
|
this->cameraPtrs[CAM_ID_MAIN]->uid = 0;
|
|
|
|
|
this->activeCamId = CAM_ID_MAIN;
|
2022-12-05 04:02:24 +00:00
|
|
|
|
Camera_OverwriteStateFlags(&this->mainCamera, CAM_STATE_0 | CAM_STATE_1 | CAM_STATE_2 | CAM_STATE_3 | CAM_STATE_4 |
|
|
|
|
|
CAM_STATE_5 | CAM_STATE_6 | CAM_STATE_7);
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Sram_Init(this, &this->sramCtx);
|
2022-10-15 05:40:00 +00:00
|
|
|
|
Regs_InitData(this);
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Message_Init(this);
|
|
|
|
|
GameOver_Init(this);
|
2022-07-30 13:05:27 +00:00
|
|
|
|
SfxSource_InitAll(this);
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Effect_InitContext(this);
|
|
|
|
|
EffectSs_InitInfo(this, 0x55);
|
|
|
|
|
CollisionCheck_InitContext(this, &this->colChkCtx);
|
|
|
|
|
AnimationContext_Reset(&this->animationCtx);
|
2022-12-24 18:55:17 +00:00
|
|
|
|
Cutscene_InitContext(this, &this->csCtx);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
|
|
|
|
if (gSaveContext.nextCutsceneIndex != 0xFFEF) {
|
2023-08-13 19:24:26 +00:00
|
|
|
|
gSaveContext.save.cutsceneIndex = gSaveContext.nextCutsceneIndex;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
gSaveContext.nextCutsceneIndex = 0xFFEF;
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-13 19:24:26 +00:00
|
|
|
|
if (gSaveContext.save.cutsceneIndex == 0xFFFD) {
|
|
|
|
|
gSaveContext.save.cutsceneIndex = 0;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-05-20 18:40:13 +00:00
|
|
|
|
if (gSaveContext.nextDayTime != NEXT_TIME_NONE) {
|
2023-08-13 19:24:26 +00:00
|
|
|
|
gSaveContext.save.dayTime = gSaveContext.nextDayTime;
|
2021-09-20 16:51:35 +00:00
|
|
|
|
gSaveContext.skyboxTime = gSaveContext.nextDayTime;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-08-13 19:24:26 +00:00
|
|
|
|
if (gSaveContext.save.dayTime > CLOCK_TIME(18, 0) || gSaveContext.save.dayTime < CLOCK_TIME(6, 30)) {
|
|
|
|
|
gSaveContext.save.nightFlag = 1;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
} else {
|
2023-08-13 19:24:26 +00:00
|
|
|
|
gSaveContext.save.nightFlag = 0;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Cutscene_HandleConditionalTriggers(this);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2023-08-13 19:24:26 +00:00
|
|
|
|
if (gSaveContext.gameMode != GAMEMODE_NORMAL || gSaveContext.save.cutsceneIndex >= 0xFFF0) {
|
2020-04-16 21:36:12 +00:00
|
|
|
|
gSaveContext.nayrusLoveTimer = 0;
|
2022-05-23 16:52:01 +00:00
|
|
|
|
Magic_Reset(this);
|
2023-08-13 19:24:26 +00:00
|
|
|
|
gSaveContext.sceneLayer = SCENE_LAYER_CUTSCENE_FIRST + (gSaveContext.save.cutsceneIndex & 0xF);
|
2021-08-21 23:12:57 +00:00
|
|
|
|
} else if (!LINK_IS_ADULT && IS_DAY) {
|
2022-07-30 21:28:50 +00:00
|
|
|
|
gSaveContext.sceneLayer = SCENE_LAYER_CHILD_DAY;
|
2021-08-21 23:12:57 +00:00
|
|
|
|
} else if (!LINK_IS_ADULT && !IS_DAY) {
|
2022-07-30 21:28:50 +00:00
|
|
|
|
gSaveContext.sceneLayer = SCENE_LAYER_CHILD_NIGHT;
|
2021-08-21 23:12:57 +00:00
|
|
|
|
} else if (LINK_IS_ADULT && IS_DAY) {
|
2022-07-30 21:28:50 +00:00
|
|
|
|
gSaveContext.sceneLayer = SCENE_LAYER_ADULT_DAY;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
} else {
|
2022-07-30 21:28:50 +00:00
|
|
|
|
gSaveContext.sceneLayer = SCENE_LAYER_ADULT_NIGHT;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-07-30 21:28:50 +00:00
|
|
|
|
// save the base scene layer (before accounting for the special cases below) to use later for the transition type
|
|
|
|
|
baseSceneLayer = gSaveContext.sceneLayer;
|
|
|
|
|
|
2023-08-13 19:24:26 +00:00
|
|
|
|
if ((gEntranceTable[((void)0, gSaveContext.save.entranceIndex)].sceneId == SCENE_HYRULE_FIELD) && !LINK_IS_ADULT &&
|
2022-07-30 21:28:50 +00:00
|
|
|
|
!IS_CUTSCENE_LAYER) {
|
2020-04-16 21:36:12 +00:00
|
|
|
|
if (CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD) && CHECK_QUEST_ITEM(QUEST_GORON_RUBY) &&
|
|
|
|
|
CHECK_QUEST_ITEM(QUEST_ZORA_SAPPHIRE)) {
|
2022-07-30 21:28:50 +00:00
|
|
|
|
gSaveContext.sceneLayer = 1;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
} else {
|
2022-07-30 21:28:50 +00:00
|
|
|
|
gSaveContext.sceneLayer = 0;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
2023-08-13 19:24:26 +00:00
|
|
|
|
} else if ((gEntranceTable[((void)0, gSaveContext.save.entranceIndex)].sceneId == SCENE_KOKIRI_FOREST) &&
|
2022-11-26 21:15:41 +00:00
|
|
|
|
LINK_IS_ADULT && !IS_CUTSCENE_LAYER) {
|
2022-07-30 21:28:50 +00:00
|
|
|
|
gSaveContext.sceneLayer = GET_EVENTCHKINF(EVENTCHKINF_48) ? 3 : 2;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-08-13 19:24:26 +00:00
|
|
|
|
Play_SpawnScene(
|
|
|
|
|
this, gEntranceTable[((void)0, gSaveContext.save.entranceIndex) + ((void)0, gSaveContext.sceneLayer)].sceneId,
|
|
|
|
|
gEntranceTable[((void)0, gSaveContext.save.entranceIndex) + ((void)0, gSaveContext.sceneLayer)].spawn);
|
2022-06-21 17:25:09 +00:00
|
|
|
|
|
2023-08-13 19:24:26 +00:00
|
|
|
|
osSyncPrintf("\nSCENE_NO=%d COUNTER=%d\n", ((void)0, gSaveContext.save.entranceIndex), gSaveContext.sceneLayer);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-07-30 21:28:50 +00:00
|
|
|
|
// When entering Gerudo Valley in the credits, trigger the GC emulator to play the ending movie.
|
2020-04-16 21:36:12 +00:00
|
|
|
|
// The emulator constantly checks whether PC is 0x81000000, so this works even though it's not a valid address.
|
2023-08-13 19:24:26 +00:00
|
|
|
|
if ((gEntranceTable[((void)0, gSaveContext.save.entranceIndex)].sceneId == SCENE_GERUDO_VALLEY) &&
|
2022-07-31 23:44:47 +00:00
|
|
|
|
gSaveContext.sceneLayer == 6) {
|
2020-04-16 21:36:12 +00:00
|
|
|
|
osSyncPrintf("エンディングはじまるよー\n"); // "The ending starts"
|
2022-06-12 23:24:45 +00:00
|
|
|
|
((void (*)(void))0x81000000)();
|
2023-08-15 05:44:20 +00:00
|
|
|
|
osSyncPrintf("出戻り?\n"); // "Return?"
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Cutscene_HandleEntranceTriggers(this);
|
|
|
|
|
KaleidoScopeCall_Init(this);
|
2022-08-24 01:13:03 +00:00
|
|
|
|
Interface_Init(this);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-05-20 18:40:13 +00:00
|
|
|
|
if (gSaveContext.nextDayTime != NEXT_TIME_NONE) {
|
|
|
|
|
if (gSaveContext.nextDayTime == NEXT_TIME_DAY) {
|
2023-08-13 19:24:26 +00:00
|
|
|
|
gSaveContext.save.totalDays++;
|
|
|
|
|
gSaveContext.save.bgsDayCount++;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
gSaveContext.dogIsLost = true;
|
2022-06-21 17:25:09 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
if (Inventory_ReplaceItem(this, ITEM_WEIRD_EGG, ITEM_CHICKEN) ||
|
|
|
|
|
Inventory_ReplaceItem(this, ITEM_POCKET_EGG, ITEM_POCKET_CUCCO)) {
|
|
|
|
|
Message_StartTextbox(this, 0x3066, NULL);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
2022-06-21 17:25:09 +00:00
|
|
|
|
|
2022-05-20 18:40:13 +00:00
|
|
|
|
gSaveContext.nextDayTime = NEXT_TIME_DAY_SET;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
} else {
|
2022-05-20 18:40:13 +00:00
|
|
|
|
gSaveContext.nextDayTime = NEXT_TIME_NIGHT_SET;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SREG(91) = -1;
|
2022-12-20 00:19:57 +00:00
|
|
|
|
R_PAUSE_BG_PRERENDER_STATE = PAUSE_BG_PRERENDER_OFF;
|
2022-05-17 22:41:50 +00:00
|
|
|
|
PreRender_Init(&this->pauseBgPreRender);
|
2022-08-28 16:18:20 +00:00
|
|
|
|
PreRender_SetValuesSave(&this->pauseBgPreRender, SCREEN_WIDTH, SCREEN_HEIGHT, NULL, NULL, NULL);
|
|
|
|
|
PreRender_SetValues(&this->pauseBgPreRender, SCREEN_WIDTH, SCREEN_HEIGHT, NULL, NULL);
|
2022-12-28 21:29:59 +00:00
|
|
|
|
gTransitionTileState = TRANS_TILE_OFF;
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->transitionMode = TRANS_MODE_OFF;
|
|
|
|
|
FrameAdvance_Init(&this->frameAdvCtx);
|
2020-12-26 10:44:53 +00:00
|
|
|
|
Rand_Seed((u32)osGetTime());
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Matrix_Init(&this->state);
|
|
|
|
|
this->state.main = Play_Main;
|
|
|
|
|
this->state.destroy = Play_Destroy;
|
|
|
|
|
this->transitionTrigger = TRANS_TRIGGER_END;
|
|
|
|
|
this->unk_11E16 = 0xFF;
|
2023-01-12 22:08:38 +00:00
|
|
|
|
this->bgCoverAlpha = 0;
|
2022-12-24 18:55:17 +00:00
|
|
|
|
this->haltAllActors = false;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-06-24 01:32:48 +00:00
|
|
|
|
if (gSaveContext.gameMode != GAMEMODE_TITLE_SCREEN) {
|
2022-04-27 20:00:25 +00:00
|
|
|
|
if (gSaveContext.nextTransitionType == TRANS_NEXT_TYPE_DEFAULT) {
|
2022-06-15 18:41:47 +00:00
|
|
|
|
this->transitionType = ENTRANCE_INFO_END_TRANS_TYPE(
|
2023-08-13 19:24:26 +00:00
|
|
|
|
gEntranceTable[((void)0, gSaveContext.save.entranceIndex) + baseSceneLayer].field);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
} else {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->transitionType = gSaveContext.nextTransitionType;
|
2022-04-27 20:00:25 +00:00
|
|
|
|
gSaveContext.nextTransitionType = TRANS_NEXT_TYPE_DEFAULT;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
} else {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->transitionType = TRANS_TYPE_FADE_BLACK_SLOW;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-08-15 13:39:06 +00:00
|
|
|
|
Letterbox_Init();
|
2022-12-24 02:46:56 +00:00
|
|
|
|
TransitionFade_Init(&this->transitionFadeFlash);
|
|
|
|
|
TransitionFade_SetType(&this->transitionFadeFlash, TRANS_INSTANCE_TYPE_FADE_FLASH);
|
|
|
|
|
TransitionFade_SetColor(&this->transitionFadeFlash, RGBA8(160, 160, 160, 255));
|
|
|
|
|
TransitionFade_Start(&this->transitionFadeFlash);
|
2020-05-15 09:02:39 +00:00
|
|
|
|
VisMono_Init(&D_80161498);
|
2022-12-24 18:55:17 +00:00
|
|
|
|
gVisMonoColor.a = 0;
|
|
|
|
|
CutsceneFlags_UnsetAll(this);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-11-13 23:29:50 +00:00
|
|
|
|
osSyncPrintf("ZELDA ALLOC SIZE=%x\n", THA_GetRemaining(&this->state.tha));
|
|
|
|
|
zAllocSize = THA_GetRemaining(&this->state.tha);
|
2023-07-10 19:03:01 +00:00
|
|
|
|
zAlloc = (uintptr_t)GameState_Alloc(&this->state, zAllocSize, "../z_play.c", 2918);
|
2021-01-13 01:02:56 +00:00
|
|
|
|
zAllocAligned = (zAlloc + 8) & ~0xF;
|
2023-07-10 19:03:01 +00:00
|
|
|
|
ZeldaArena_Init((void*)zAllocAligned, zAllocSize - (zAllocAligned - zAlloc));
|
2021-09-04 13:33:19 +00:00
|
|
|
|
// "Zelda Heap"
|
2023-07-10 19:03:01 +00:00
|
|
|
|
osSyncPrintf("ゼルダヒープ %08x-%08x\n", zAllocAligned, zAllocAligned + zAllocSize - (s32)(zAllocAligned - zAlloc));
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
|
|
|
|
Fault_AddClient(&D_801614B8, ZeldaArena_Display, NULL, NULL);
|
2022-10-16 22:00:18 +00:00
|
|
|
|
Actor_InitContext(this, &this->actorCtx, this->playerEntry);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
while (!func_800973FC(this, &this->roomCtx)) {
|
2020-04-16 21:36:12 +00:00
|
|
|
|
; // Empty Loop
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
player = GET_PLAYER(this);
|
2022-12-17 21:07:31 +00:00
|
|
|
|
Camera_InitDataUsingPlayer(&this->mainCamera, player);
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Camera_ChangeMode(&this->mainCamera, CAM_MODE_NORMAL);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-06-17 18:25:42 +00:00
|
|
|
|
playerStartBgCamIndex = player->actor.params & 0xFF;
|
|
|
|
|
if (playerStartBgCamIndex != 0xFF) {
|
|
|
|
|
osSyncPrintf("player has start camera ID (" VT_FGCOL(BLUE) "%d" VT_RST ")\n", playerStartBgCamIndex);
|
|
|
|
|
Camera_ChangeBgCamIndex(&this->mainCamera, playerStartBgCamIndex);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-06-21 00:31:53 +00:00
|
|
|
|
if (R_SCENE_CAM_TYPE == SCENE_CAM_TYPE_FIXED_TOGGLE_VIEWPOINT) {
|
|
|
|
|
this->viewpoint = VIEWPOINT_PIVOT;
|
|
|
|
|
} else if (R_SCENE_CAM_TYPE == SCENE_CAM_TYPE_FIXED_SHOP_VIEWPOINT) {
|
|
|
|
|
this->viewpoint = VIEWPOINT_LOCKED;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
} else {
|
2022-06-21 00:31:53 +00:00
|
|
|
|
this->viewpoint = VIEWPOINT_NONE;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Interface_SetSceneRestrictions(this);
|
|
|
|
|
Environment_PlaySceneSequence(this);
|
|
|
|
|
gSaveContext.seqId = this->sequenceCtx.seqId;
|
|
|
|
|
gSaveContext.natureAmbienceId = this->sequenceCtx.natureAmbienceId;
|
|
|
|
|
func_8002DF18(this, GET_PLAYER(this));
|
|
|
|
|
AnimationContext_Update(this, &this->animationCtx);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
gSaveContext.respawnFlag = 0;
|
|
|
|
|
|
2022-12-24 18:55:17 +00:00
|
|
|
|
if (R_USE_DEBUG_CUTSCENE) {
|
|
|
|
|
gDebugCutsceneScript = sDebugCutsceneScriptBuf;
|
|
|
|
|
osSyncPrintf("\nkawauso_data=[%x]", gDebugCutsceneScript);
|
|
|
|
|
|
|
|
|
|
// This hardcoded ROM address extends past the end of the ROM file.
|
|
|
|
|
// Presumably the ROM was larger at a previous point in development when this debug feature was used.
|
|
|
|
|
DmaMgr_DmaRomToRam(0x03FEB000, gDebugCutsceneScript, sizeof(sDebugCutsceneScriptBuf));
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-21 18:23:43 +00:00
|
|
|
|
void Play_Update(PlayState* this) {
|
2021-02-15 17:29:06 +00:00
|
|
|
|
s32 pad1;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
s32 sp80;
|
|
|
|
|
Input* input;
|
2021-02-15 17:29:06 +00:00
|
|
|
|
u32 i;
|
|
|
|
|
s32 pad2;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
input = this->state.input;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
|
|
|
|
if ((SREG(1) < 0) || (DREG(0) != 0)) {
|
|
|
|
|
SREG(1) = 0;
|
|
|
|
|
ZeldaArena_Display();
|
|
|
|
|
}
|
|
|
|
|
|
2022-11-26 20:22:01 +00:00
|
|
|
|
if ((R_HREG_MODE == HREG_MODE_PRINT_OBJECT_TABLE) && (R_PRINT_OBJECT_TABLE_TRIGGER < 0)) {
|
|
|
|
|
R_PRINT_OBJECT_TABLE_TRIGGER = 0;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
osSyncPrintf("object_exchange_rom_address %u\n", gObjectTableSize);
|
|
|
|
|
osSyncPrintf("RomStart RomEnd Size\n");
|
2022-06-21 17:25:09 +00:00
|
|
|
|
|
2020-04-16 21:36:12 +00:00
|
|
|
|
for (i = 0; i < gObjectTableSize; i++) {
|
|
|
|
|
s32 size = gObjectTable[i].vromEnd - gObjectTable[i].vromStart;
|
2021-11-30 23:40:42 +00:00
|
|
|
|
|
2020-04-16 21:36:12 +00:00
|
|
|
|
osSyncPrintf("%08x-%08x %08x(%8.3fKB)\n", gObjectTable[i].vromStart, gObjectTable[i].vromEnd, size,
|
2021-03-31 16:18:31 +00:00
|
|
|
|
size / 1024.0f);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
2022-06-21 17:25:09 +00:00
|
|
|
|
|
2020-04-16 21:36:12 +00:00
|
|
|
|
osSyncPrintf("\n");
|
|
|
|
|
}
|
|
|
|
|
|
2022-11-26 20:22:01 +00:00
|
|
|
|
// HREG(81) was very likely intended to be HREG(80), which would make more sense given how the
|
|
|
|
|
// HREG debugging system works. If this condition used HREG(80) instead, `HREG_MODE_PRINT_OBJECT_TABLE`
|
|
|
|
|
// would also include the actor overlay table and HREG(82) would be used to trigger it instead.
|
2020-04-16 21:36:12 +00:00
|
|
|
|
if ((HREG(81) == 18) && (HREG(82) < 0)) {
|
|
|
|
|
HREG(82) = 0;
|
|
|
|
|
ActorOverlayTable_LogPrint();
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
gSegments[4] = VIRTUAL_TO_PHYSICAL(this->objectCtx.status[this->objectCtx.mainKeepIndex].segment);
|
|
|
|
|
gSegments[5] = VIRTUAL_TO_PHYSICAL(this->objectCtx.status[this->objectCtx.subKeepIndex].segment);
|
|
|
|
|
gSegments[2] = VIRTUAL_TO_PHYSICAL(this->sceneSegment);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
if (FrameAdvance_Update(&this->frameAdvCtx, &input[1])) {
|
|
|
|
|
if ((this->transitionMode == TRANS_MODE_OFF) && (this->transitionTrigger != TRANS_TRIGGER_OFF)) {
|
|
|
|
|
this->transitionMode = TRANS_MODE_SETUP;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-12-28 21:29:59 +00:00
|
|
|
|
if (gTransitionTileState != TRANS_TILE_OFF) {
|
|
|
|
|
switch (gTransitionTileState) {
|
|
|
|
|
case TRANS_TILE_PROCESS:
|
|
|
|
|
if (TransitionTile_Init(&sTransitionTile, 10, 7) == NULL) {
|
2020-04-16 21:36:12 +00:00
|
|
|
|
osSyncPrintf("fbdemo_init呼出し失敗!\n"); // "fbdemo_init call failed!"
|
2022-12-28 21:29:59 +00:00
|
|
|
|
gTransitionTileState = TRANS_TILE_OFF;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
} else {
|
2022-12-28 21:29:59 +00:00
|
|
|
|
sTransitionTile.zBuffer = (u16*)gZBuffer;
|
|
|
|
|
gTransitionTileState = TRANS_TILE_READY;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
R_UPDATE_RATE = 1;
|
|
|
|
|
}
|
|
|
|
|
break;
|
2022-12-28 21:29:59 +00:00
|
|
|
|
|
|
|
|
|
case TRANS_TILE_READY:
|
|
|
|
|
TransitionTile_Update(&sTransitionTile);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
2020-04-16 21:36:12 +00:00
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-02-26 20:48:42 +00:00
|
|
|
|
if ((u32)this->transitionMode != TRANS_MODE_OFF) {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
switch (this->transitionMode) {
|
2022-04-27 20:00:25 +00:00
|
|
|
|
case TRANS_MODE_SETUP:
|
2022-05-17 22:41:50 +00:00
|
|
|
|
if (this->transitionTrigger != TRANS_TRIGGER_END) {
|
2022-07-30 21:28:50 +00:00
|
|
|
|
s16 sceneLayer = SCENE_LAYER_CHILD_DAY;
|
2022-04-27 20:00:25 +00:00
|
|
|
|
|
2022-11-22 03:01:44 +00:00
|
|
|
|
Interface_ChangeHudVisibilityMode(HUD_VISIBILITY_NOTHING);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2023-08-13 19:24:26 +00:00
|
|
|
|
if (gSaveContext.save.cutsceneIndex >= 0xFFF0) {
|
|
|
|
|
sceneLayer = SCENE_LAYER_CUTSCENE_FIRST + (gSaveContext.save.cutsceneIndex & 0xF);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
2022-04-27 20:00:25 +00:00
|
|
|
|
// fade out bgm if "continue bgm" flag is not set
|
2022-07-30 21:28:50 +00:00
|
|
|
|
if (!(gEntranceTable[this->nextEntranceIndex + sceneLayer].field &
|
2022-06-15 18:41:47 +00:00
|
|
|
|
ENTRANCE_INFO_CONTINUE_BGM_FLAG)) {
|
2022-08-30 21:35:00 +00:00
|
|
|
|
// "Sound initialized. 111"
|
2021-09-04 13:33:19 +00:00
|
|
|
|
osSyncPrintf("\n\n\nサウンドイニシャル来ました。111");
|
2022-05-17 22:41:50 +00:00
|
|
|
|
if ((this->transitionType < TRANS_TYPE_MAX) && !Environment_IsForcedSequenceDisabled()) {
|
2022-08-30 21:35:00 +00:00
|
|
|
|
// "Sound initialized. 222"
|
2021-09-04 13:33:19 +00:00
|
|
|
|
osSyncPrintf("\n\n\nサウンドイニシャル来ました。222");
|
2020-04-16 21:36:12 +00:00
|
|
|
|
func_800F6964(0x14);
|
2021-12-03 14:49:32 +00:00
|
|
|
|
gSaveContext.seqId = (u8)NA_BGM_DISABLED;
|
2021-12-27 17:35:05 +00:00
|
|
|
|
gSaveContext.natureAmbienceId = NATURE_ID_DISABLED;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
2022-04-27 20:00:25 +00:00
|
|
|
|
if (!R_TRANS_DBG_ENABLED) {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Play_SetupTransition(this, this->transitionType);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
} else {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Play_SetupTransition(this, R_TRANS_DBG_TYPE);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
if (this->transitionMode >= TRANS_MODE_FILL_WHITE_INIT) {
|
2022-04-27 20:00:25 +00:00
|
|
|
|
// non-instance modes break out of this switch
|
2020-04-16 21:36:12 +00:00
|
|
|
|
break;
|
|
|
|
|
}
|
2022-06-03 16:51:23 +00:00
|
|
|
|
FALLTHROUGH;
|
2022-04-27 20:00:25 +00:00
|
|
|
|
case TRANS_MODE_INSTANCE_INIT:
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->transitionCtx.init(&this->transitionCtx.instanceData);
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
2022-04-27 20:00:25 +00:00
|
|
|
|
// circle types
|
2022-05-17 22:41:50 +00:00
|
|
|
|
if ((this->transitionCtx.transitionType >> 5) == 1) {
|
|
|
|
|
this->transitionCtx.setType(&this->transitionCtx.instanceData,
|
|
|
|
|
this->transitionCtx.transitionType | TC_SET_PARAMS);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
2022-04-27 20:00:25 +00:00
|
|
|
|
gSaveContext.transWipeSpeed = 14;
|
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
if ((this->transitionCtx.transitionType == TRANS_TYPE_WIPE_FAST) ||
|
|
|
|
|
(this->transitionCtx.transitionType == TRANS_TYPE_FILL_WHITE2)) {
|
2022-04-27 20:00:25 +00:00
|
|
|
|
//! @bug TRANS_TYPE_FILL_WHITE2 will never reach this code.
|
|
|
|
|
//! It is a non-instance type transition which doesn't run this case.
|
|
|
|
|
gSaveContext.transWipeSpeed = 28;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-04-27 20:00:25 +00:00
|
|
|
|
gSaveContext.transFadeDuration = 60;
|
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
if ((this->transitionCtx.transitionType == TRANS_TYPE_FADE_BLACK_FAST) ||
|
|
|
|
|
(this->transitionCtx.transitionType == TRANS_TYPE_FADE_WHITE_FAST)) {
|
2022-04-27 20:00:25 +00:00
|
|
|
|
gSaveContext.transFadeDuration = 20;
|
2022-05-17 22:41:50 +00:00
|
|
|
|
} else if ((this->transitionCtx.transitionType == TRANS_TYPE_FADE_BLACK_SLOW) ||
|
|
|
|
|
(this->transitionCtx.transitionType == TRANS_TYPE_FADE_WHITE_SLOW)) {
|
2022-04-27 20:00:25 +00:00
|
|
|
|
gSaveContext.transFadeDuration = 150;
|
2022-05-17 22:41:50 +00:00
|
|
|
|
} else if (this->transitionCtx.transitionType == TRANS_TYPE_FADE_WHITE_INSTANT) {
|
2022-04-27 20:00:25 +00:00
|
|
|
|
gSaveContext.transFadeDuration = 2;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
if ((this->transitionCtx.transitionType == TRANS_TYPE_FADE_WHITE) ||
|
|
|
|
|
(this->transitionCtx.transitionType == TRANS_TYPE_FADE_WHITE_FAST) ||
|
|
|
|
|
(this->transitionCtx.transitionType == TRANS_TYPE_FADE_WHITE_SLOW) ||
|
|
|
|
|
(this->transitionCtx.transitionType == TRANS_TYPE_FADE_WHITE_CS_DELAYED) ||
|
|
|
|
|
(this->transitionCtx.transitionType == TRANS_TYPE_FADE_WHITE_INSTANT)) {
|
|
|
|
|
this->transitionCtx.setColor(&this->transitionCtx.instanceData, RGBA8(160, 160, 160, 255));
|
2022-06-21 17:25:09 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
if (this->transitionCtx.setUnkColor != NULL) {
|
|
|
|
|
this->transitionCtx.setUnkColor(&this->transitionCtx.instanceData,
|
|
|
|
|
RGBA8(160, 160, 160, 255));
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
2022-05-17 22:41:50 +00:00
|
|
|
|
} else if (this->transitionCtx.transitionType == TRANS_TYPE_FADE_GREEN) {
|
|
|
|
|
this->transitionCtx.setColor(&this->transitionCtx.instanceData, RGBA8(140, 140, 100, 255));
|
2022-04-27 20:00:25 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
if (this->transitionCtx.setUnkColor != NULL) {
|
|
|
|
|
this->transitionCtx.setUnkColor(&this->transitionCtx.instanceData,
|
|
|
|
|
RGBA8(140, 140, 100, 255));
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
2022-05-17 22:41:50 +00:00
|
|
|
|
} else if (this->transitionCtx.transitionType == TRANS_TYPE_FADE_BLUE) {
|
|
|
|
|
this->transitionCtx.setColor(&this->transitionCtx.instanceData, RGBA8(70, 100, 110, 255));
|
2022-04-27 20:00:25 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
if (this->transitionCtx.setUnkColor != NULL) {
|
|
|
|
|
this->transitionCtx.setUnkColor(&this->transitionCtx.instanceData,
|
|
|
|
|
RGBA8(70, 100, 110, 255));
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
} else {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->transitionCtx.setColor(&this->transitionCtx.instanceData, RGBA8(0, 0, 0, 0));
|
2022-04-27 20:00:25 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
if (this->transitionCtx.setUnkColor != NULL) {
|
|
|
|
|
this->transitionCtx.setUnkColor(&this->transitionCtx.instanceData, RGBA8(0, 0, 0, 0));
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
if (this->transitionTrigger == TRANS_TRIGGER_END) {
|
2022-12-24 02:46:56 +00:00
|
|
|
|
this->transitionCtx.setType(&this->transitionCtx.instanceData, TRANS_INSTANCE_TYPE_FILL_OUT);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
} else {
|
2022-12-24 02:46:56 +00:00
|
|
|
|
this->transitionCtx.setType(&this->transitionCtx.instanceData, TRANS_INSTANCE_TYPE_FILL_IN);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->transitionCtx.start(&this->transitionCtx.instanceData);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
if (this->transitionCtx.transitionType == TRANS_TYPE_FADE_WHITE_CS_DELAYED) {
|
|
|
|
|
this->transitionMode = TRANS_MODE_INSTANCE_WAIT;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
} else {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->transitionMode = TRANS_MODE_INSTANCE_RUNNING;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
2022-04-27 20:00:25 +00:00
|
|
|
|
case TRANS_MODE_INSTANCE_RUNNING:
|
2022-05-17 22:41:50 +00:00
|
|
|
|
if (this->transitionCtx.isDone(&this->transitionCtx.instanceData)) {
|
|
|
|
|
if (this->transitionCtx.transitionType >= TRANS_TYPE_MAX) {
|
|
|
|
|
if (this->transitionTrigger == TRANS_TRIGGER_END) {
|
|
|
|
|
this->transitionCtx.destroy(&this->transitionCtx.instanceData);
|
|
|
|
|
func_800BC88C(this);
|
|
|
|
|
this->transitionMode = TRANS_MODE_OFF;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
2022-05-17 22:41:50 +00:00
|
|
|
|
} else if (this->transitionTrigger != TRANS_TRIGGER_END) {
|
|
|
|
|
this->state.running = false;
|
2022-04-27 20:00:25 +00:00
|
|
|
|
|
2022-06-24 01:32:48 +00:00
|
|
|
|
if (gSaveContext.gameMode != GAMEMODE_FILE_SELECT) {
|
2022-05-21 18:23:43 +00:00
|
|
|
|
SET_NEXT_GAMESTATE(&this->state, Play_Init, PlayState);
|
2023-08-13 19:24:26 +00:00
|
|
|
|
gSaveContext.save.entranceIndex = this->nextEntranceIndex;
|
2022-04-27 20:00:25 +00:00
|
|
|
|
|
2020-04-16 21:36:12 +00:00
|
|
|
|
if (gSaveContext.minigameState == 1) {
|
|
|
|
|
gSaveContext.minigameState = 3;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
2022-06-23 21:34:26 +00:00
|
|
|
|
SET_NEXT_GAMESTATE(&this->state, FileSelect_Init, FileSelectState);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
} else {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->transitionCtx.destroy(&this->transitionCtx.instanceData);
|
|
|
|
|
func_800BC88C(this);
|
|
|
|
|
this->transitionMode = TRANS_MODE_OFF;
|
2022-04-27 20:00:25 +00:00
|
|
|
|
|
2022-12-28 21:29:59 +00:00
|
|
|
|
if (gTransitionTileState == TRANS_TILE_READY) {
|
|
|
|
|
TransitionTile_Destroy(&sTransitionTile);
|
|
|
|
|
gTransitionTileState = TRANS_TILE_OFF;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
R_UPDATE_RATE = 3;
|
|
|
|
|
}
|
|
|
|
|
}
|
2022-04-27 20:00:25 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->transitionTrigger = TRANS_TRIGGER_OFF;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
} else {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->transitionCtx.update(&this->transitionCtx.instanceData, R_UPDATE_RATE);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
2022-04-27 20:00:25 +00:00
|
|
|
|
// update non-instance transitions
|
2022-05-17 22:41:50 +00:00
|
|
|
|
switch (this->transitionMode) {
|
2022-04-27 20:00:25 +00:00
|
|
|
|
case TRANS_MODE_FILL_WHITE_INIT:
|
|
|
|
|
sTransitionFillTimer = 0;
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->envCtx.fillScreen = true;
|
|
|
|
|
this->envCtx.screenFillColor[0] = 160;
|
|
|
|
|
this->envCtx.screenFillColor[1] = 160;
|
|
|
|
|
this->envCtx.screenFillColor[2] = 160;
|
|
|
|
|
|
|
|
|
|
if (this->transitionTrigger != TRANS_TRIGGER_END) {
|
|
|
|
|
this->envCtx.screenFillColor[3] = 0;
|
|
|
|
|
this->transitionMode = TRANS_MODE_FILL_IN;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
} else {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->envCtx.screenFillColor[3] = 255;
|
|
|
|
|
this->transitionMode = TRANS_MODE_FILL_OUT;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
2022-04-27 20:00:25 +00:00
|
|
|
|
case TRANS_MODE_FILL_IN:
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->envCtx.screenFillColor[3] = (sTransitionFillTimer / 20.0f) * 255.0f;
|
2022-04-27 20:00:25 +00:00
|
|
|
|
|
|
|
|
|
if (sTransitionFillTimer >= 20) {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->state.running = false;
|
2022-05-21 18:23:43 +00:00
|
|
|
|
SET_NEXT_GAMESTATE(&this->state, Play_Init, PlayState);
|
2023-08-13 19:24:26 +00:00
|
|
|
|
gSaveContext.save.entranceIndex = this->nextEntranceIndex;
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->transitionTrigger = TRANS_TRIGGER_OFF;
|
|
|
|
|
this->transitionMode = TRANS_MODE_OFF;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
} else {
|
2022-04-27 20:00:25 +00:00
|
|
|
|
sTransitionFillTimer++;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
2022-04-27 20:00:25 +00:00
|
|
|
|
case TRANS_MODE_FILL_OUT:
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->envCtx.screenFillColor[3] = (1 - sTransitionFillTimer / 20.0f) * 255.0f;
|
2022-04-27 20:00:25 +00:00
|
|
|
|
|
|
|
|
|
if (sTransitionFillTimer >= 20) {
|
2022-12-28 21:29:59 +00:00
|
|
|
|
gTransitionTileState = TRANS_TILE_OFF;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
R_UPDATE_RATE = 3;
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->transitionTrigger = TRANS_TRIGGER_OFF;
|
|
|
|
|
this->transitionMode = TRANS_MODE_OFF;
|
|
|
|
|
this->envCtx.fillScreen = false;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
} else {
|
2022-04-27 20:00:25 +00:00
|
|
|
|
sTransitionFillTimer++;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
2022-04-27 20:00:25 +00:00
|
|
|
|
case TRANS_MODE_FILL_BROWN_INIT:
|
|
|
|
|
sTransitionFillTimer = 0;
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->envCtx.fillScreen = true;
|
|
|
|
|
this->envCtx.screenFillColor[0] = 170;
|
|
|
|
|
this->envCtx.screenFillColor[1] = 160;
|
|
|
|
|
this->envCtx.screenFillColor[2] = 150;
|
|
|
|
|
|
|
|
|
|
if (this->transitionTrigger != TRANS_TRIGGER_END) {
|
|
|
|
|
this->envCtx.screenFillColor[3] = 0;
|
|
|
|
|
this->transitionMode = TRANS_MODE_FILL_IN;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
} else {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->envCtx.screenFillColor[3] = 255;
|
|
|
|
|
this->transitionMode = TRANS_MODE_FILL_OUT;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
2022-04-27 20:00:25 +00:00
|
|
|
|
case TRANS_MODE_INSTANT:
|
2022-05-17 22:41:50 +00:00
|
|
|
|
if (this->transitionTrigger != TRANS_TRIGGER_END) {
|
|
|
|
|
this->state.running = false;
|
2022-05-21 18:23:43 +00:00
|
|
|
|
SET_NEXT_GAMESTATE(&this->state, Play_Init, PlayState);
|
2023-08-13 19:24:26 +00:00
|
|
|
|
gSaveContext.save.entranceIndex = this->nextEntranceIndex;
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->transitionTrigger = TRANS_TRIGGER_OFF;
|
|
|
|
|
this->transitionMode = TRANS_MODE_OFF;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
} else {
|
2022-12-28 21:29:59 +00:00
|
|
|
|
gTransitionTileState = TRANS_TILE_OFF;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
R_UPDATE_RATE = 3;
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->transitionTrigger = TRANS_TRIGGER_OFF;
|
|
|
|
|
this->transitionMode = TRANS_MODE_OFF;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
2022-04-27 20:00:25 +00:00
|
|
|
|
case TRANS_MODE_INSTANCE_WAIT:
|
|
|
|
|
if (gSaveContext.cutsceneTransitionControl != 0) {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->transitionMode = TRANS_MODE_INSTANCE_RUNNING;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
2022-04-27 20:00:25 +00:00
|
|
|
|
case TRANS_MODE_SANDSTORM_INIT:
|
2022-05-17 22:41:50 +00:00
|
|
|
|
if (this->transitionTrigger != TRANS_TRIGGER_END) {
|
|
|
|
|
this->envCtx.sandstormState = SANDSTORM_FILL;
|
|
|
|
|
this->transitionMode = TRANS_MODE_SANDSTORM;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
} else {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->envCtx.sandstormState = SANDSTORM_UNFILL;
|
|
|
|
|
this->envCtx.sandstormPrimA = 255;
|
|
|
|
|
this->envCtx.sandstormEnvA = 255;
|
|
|
|
|
this->transitionMode = TRANS_MODE_SANDSTORM;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
2022-04-27 20:00:25 +00:00
|
|
|
|
case TRANS_MODE_SANDSTORM:
|
2022-07-30 13:05:27 +00:00
|
|
|
|
Audio_PlaySfxGeneral(NA_SE_EV_SAND_STORM - SFX_FLAG, &gSfxDefaultPos, 4,
|
|
|
|
|
&gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
|
2022-04-27 20:00:25 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
if (this->transitionTrigger == TRANS_TRIGGER_END) {
|
|
|
|
|
if (this->envCtx.sandstormPrimA < 110) {
|
2022-12-28 21:29:59 +00:00
|
|
|
|
gTransitionTileState = TRANS_TILE_OFF;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
R_UPDATE_RATE = 3;
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->transitionTrigger = TRANS_TRIGGER_OFF;
|
|
|
|
|
this->transitionMode = TRANS_MODE_OFF;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
} else {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
if (this->envCtx.sandstormEnvA == 255) {
|
|
|
|
|
this->state.running = false;
|
2022-05-21 18:23:43 +00:00
|
|
|
|
SET_NEXT_GAMESTATE(&this->state, Play_Init, PlayState);
|
2023-08-13 19:24:26 +00:00
|
|
|
|
gSaveContext.save.entranceIndex = this->nextEntranceIndex;
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->transitionTrigger = TRANS_TRIGGER_OFF;
|
|
|
|
|
this->transitionMode = TRANS_MODE_OFF;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
2022-04-27 20:00:25 +00:00
|
|
|
|
case TRANS_MODE_SANDSTORM_END_INIT:
|
2022-05-17 22:41:50 +00:00
|
|
|
|
if (this->transitionTrigger == TRANS_TRIGGER_END) {
|
|
|
|
|
this->envCtx.sandstormState = SANDSTORM_DISSIPATE;
|
|
|
|
|
this->envCtx.sandstormPrimA = 255;
|
|
|
|
|
this->envCtx.sandstormEnvA = 255;
|
2021-09-04 13:33:19 +00:00
|
|
|
|
// "It's here!!!!!!!!!"
|
|
|
|
|
LOG_STRING("来た!!!!!!!!!!!!!!!!!!!!!", "../z_play.c", 3471);
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->transitionMode = TRANS_MODE_SANDSTORM_END;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
} else {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->transitionMode = TRANS_MODE_SANDSTORM_INIT;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
2022-04-27 20:00:25 +00:00
|
|
|
|
case TRANS_MODE_SANDSTORM_END:
|
2022-07-30 13:05:27 +00:00
|
|
|
|
Audio_PlaySfxGeneral(NA_SE_EV_SAND_STORM - SFX_FLAG, &gSfxDefaultPos, 4,
|
|
|
|
|
&gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
|
2022-06-21 17:25:09 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
if (this->transitionTrigger == TRANS_TRIGGER_END) {
|
|
|
|
|
if (this->envCtx.sandstormPrimA <= 0) {
|
2022-12-28 21:29:59 +00:00
|
|
|
|
gTransitionTileState = TRANS_TILE_OFF;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
R_UPDATE_RATE = 3;
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->transitionTrigger = TRANS_TRIGGER_OFF;
|
|
|
|
|
this->transitionMode = TRANS_MODE_OFF;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
2022-04-27 20:00:25 +00:00
|
|
|
|
case TRANS_MODE_CS_BLACK_FILL_INIT:
|
|
|
|
|
sTransitionFillTimer = 0;
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->envCtx.fillScreen = true;
|
|
|
|
|
this->envCtx.screenFillColor[0] = 0;
|
|
|
|
|
this->envCtx.screenFillColor[1] = 0;
|
|
|
|
|
this->envCtx.screenFillColor[2] = 0;
|
|
|
|
|
this->envCtx.screenFillColor[3] = 255;
|
|
|
|
|
this->transitionMode = TRANS_MODE_CS_BLACK_FILL;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
break;
|
|
|
|
|
|
2022-04-27 20:00:25 +00:00
|
|
|
|
case TRANS_MODE_CS_BLACK_FILL:
|
|
|
|
|
if (gSaveContext.cutsceneTransitionControl != 0) {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->envCtx.screenFillColor[3] = gSaveContext.cutsceneTransitionControl;
|
2022-06-21 17:25:09 +00:00
|
|
|
|
|
2022-04-27 20:00:25 +00:00
|
|
|
|
if (gSaveContext.cutsceneTransitionControl <= 100) {
|
2022-12-28 21:29:59 +00:00
|
|
|
|
gTransitionTileState = TRANS_TILE_OFF;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
R_UPDATE_RATE = 3;
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->transitionTrigger = TRANS_TRIGGER_OFF;
|
|
|
|
|
this->transitionMode = TRANS_MODE_OFF;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(3533);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-12-28 21:29:59 +00:00
|
|
|
|
if (1 && (gTransitionTileState != TRANS_TILE_READY)) {
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(3542);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-06-24 01:32:48 +00:00
|
|
|
|
if ((gSaveContext.gameMode == GAMEMODE_NORMAL) && (this->msgCtx.msgMode == MSGMODE_NONE) &&
|
2022-05-17 22:41:50 +00:00
|
|
|
|
(this->gameOverCtx.state == GAMEOVER_INACTIVE)) {
|
|
|
|
|
KaleidoSetup_Update(this);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(3551);
|
2022-05-17 22:41:50 +00:00
|
|
|
|
sp80 = (this->pauseCtx.state != 0) || (this->pauseCtx.debugState != 0);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(3555);
|
2022-05-17 22:41:50 +00:00
|
|
|
|
AnimationContext_Reset(&this->animationCtx);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(3561);
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Object_UpdateBank(&this->objectCtx);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(3577);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
|
|
|
|
if ((sp80 == 0) && (IREG(72) == 0)) {
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(3580);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->gameplayFrames++;
|
2022-09-27 16:40:26 +00:00
|
|
|
|
Rumble_SetUpdateEnabled(true);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
if (this->actorCtx.freezeFlashTimer && (this->actorCtx.freezeFlashTimer-- < 5)) {
|
|
|
|
|
osSyncPrintf("FINISH=%d\n", this->actorCtx.freezeFlashTimer);
|
2022-06-21 17:25:09 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
if ((this->actorCtx.freezeFlashTimer > 0) && ((this->actorCtx.freezeFlashTimer % 2) != 0)) {
|
|
|
|
|
this->envCtx.fillScreen = true;
|
|
|
|
|
this->envCtx.screenFillColor[0] = this->envCtx.screenFillColor[1] =
|
|
|
|
|
this->envCtx.screenFillColor[2] = 150;
|
|
|
|
|
this->envCtx.screenFillColor[3] = 80;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
} else {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->envCtx.fillScreen = false;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
} else {
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(3606);
|
2022-05-17 22:41:50 +00:00
|
|
|
|
func_800973FC(this, &this->roomCtx);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(3612);
|
2022-05-17 22:41:50 +00:00
|
|
|
|
CollisionCheck_AT(this, &this->colChkCtx);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(3618);
|
2022-05-17 22:41:50 +00:00
|
|
|
|
CollisionCheck_OC(this, &this->colChkCtx);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(3624);
|
2022-05-17 22:41:50 +00:00
|
|
|
|
CollisionCheck_Damage(this, &this->colChkCtx);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(3631);
|
2022-05-17 22:41:50 +00:00
|
|
|
|
CollisionCheck_ClearContext(this, &this->colChkCtx);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(3637);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-12-24 18:55:17 +00:00
|
|
|
|
if (!this->haltAllActors) {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Actor_UpdateAll(this, &this->actorCtx);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(3643);
|
2022-12-24 18:55:17 +00:00
|
|
|
|
Cutscene_UpdateManual(this, &this->csCtx);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(3648);
|
2022-12-24 18:55:17 +00:00
|
|
|
|
Cutscene_UpdateScripted(this, &this->csCtx);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(3651);
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Effect_UpdateAll(this);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(3657);
|
2022-05-17 22:41:50 +00:00
|
|
|
|
EffectSs_UpdateAll(this);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(3662);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
} else {
|
2022-09-27 16:40:26 +00:00
|
|
|
|
Rumble_SetUpdateEnabled(false);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(3672);
|
2022-05-17 22:41:50 +00:00
|
|
|
|
func_80095AA0(this, &this->roomCtx.curRoom, &input[1], 0);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(3675);
|
2022-05-17 22:41:50 +00:00
|
|
|
|
func_80095AA0(this, &this->roomCtx.prevRoom, &input[1], 1);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(3677);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-06-21 00:31:53 +00:00
|
|
|
|
if (this->viewpoint != VIEWPOINT_NONE) {
|
2020-10-03 15:22:44 +00:00
|
|
|
|
if (CHECK_BTN_ALL(input[0].press.button, BTN_CUP)) {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
if ((this->pauseCtx.state != 0) || (this->pauseCtx.debugState != 0)) {
|
2021-09-04 13:33:19 +00:00
|
|
|
|
// "Changing viewpoint is prohibited due to the kaleidoscope"
|
2020-04-16 21:36:12 +00:00
|
|
|
|
osSyncPrintf(VT_FGCOL(CYAN) "カレイドスコープ中につき視点変更を禁止しております\n" VT_RST);
|
2022-05-17 22:41:50 +00:00
|
|
|
|
} else if (Player_InCsMode(this)) {
|
2021-09-04 13:33:19 +00:00
|
|
|
|
// "Changing viewpoint is prohibited during the cutscene"
|
2020-04-16 21:36:12 +00:00
|
|
|
|
osSyncPrintf(VT_FGCOL(CYAN) "デモ中につき視点変更を禁止しております\n" VT_RST);
|
2022-06-21 00:31:53 +00:00
|
|
|
|
} else if (R_SCENE_CAM_TYPE == SCENE_CAM_TYPE_FIXED_SHOP_VIEWPOINT) {
|
2022-07-30 13:05:27 +00:00
|
|
|
|
Audio_PlaySfxGeneral(NA_SE_SY_ERROR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
|
|
|
|
|
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
} else {
|
2022-06-21 00:31:53 +00:00
|
|
|
|
// C-Up toggle for houses, move between pivot camera and fixed camera
|
|
|
|
|
// Toggle viewpoint between VIEWPOINT_LOCKED and VIEWPOINT_PIVOT
|
|
|
|
|
Play_SetViewpoint(this, this->viewpoint ^ (VIEWPOINT_LOCKED ^ VIEWPOINT_PIVOT));
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2022-06-24 01:32:48 +00:00
|
|
|
|
|
2022-06-21 00:31:53 +00:00
|
|
|
|
Play_ChangeViewpointBgCamIndex(this);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(3708);
|
2022-11-26 22:53:41 +00:00
|
|
|
|
Skybox_Update(&this->skyboxCtx);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(3716);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
if ((this->pauseCtx.state != 0) || (this->pauseCtx.debugState != 0)) {
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(3721);
|
2022-05-17 22:41:50 +00:00
|
|
|
|
KaleidoScopeCall_Update(this);
|
|
|
|
|
} else if (this->gameOverCtx.state != GAMEOVER_INACTIVE) {
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(3727);
|
2022-05-17 22:41:50 +00:00
|
|
|
|
GameOver_Update(this);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
} else {
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(3733);
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Message_Update(this);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(3737);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(3742);
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Interface_Update(this);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(3765);
|
2022-05-17 22:41:50 +00:00
|
|
|
|
AnimationContext_Update(this, &this->animationCtx);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(3771);
|
2022-07-30 13:05:27 +00:00
|
|
|
|
SfxSource_UpdateAll(this);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(3777);
|
2022-08-15 13:39:06 +00:00
|
|
|
|
Letterbox_Update(R_UPDATE_RATE);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(3783);
|
2022-12-24 02:46:56 +00:00
|
|
|
|
TransitionFade_Update(&this->transitionFadeFlash, R_UPDATE_RATE);
|
2021-02-15 17:29:06 +00:00
|
|
|
|
} else {
|
|
|
|
|
goto skip;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(3799);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2021-02-15 17:29:06 +00:00
|
|
|
|
skip:
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(3801);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2023-01-12 21:06:31 +00:00
|
|
|
|
if ((sp80 == 0) || gDebugCamEnabled) {
|
2021-02-15 17:29:06 +00:00
|
|
|
|
s32 pad3[5];
|
|
|
|
|
s32 i;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->nextCamId = this->activeCamId;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(3806);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2021-03-31 16:18:31 +00:00
|
|
|
|
for (i = 0; i < NUM_CAMS; i++) {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
if ((i != this->nextCamId) && (this->cameraPtrs[i] != NULL)) {
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(3809);
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Camera_Update(this->cameraPtrs[i]);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Camera_Update(this->cameraPtrs[this->nextCamId]);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(3814);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(3816);
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Environment_Update(this, &this->envCtx, &this->lightCtx, &this->pauseCtx, &this->msgCtx, &this->gameOverCtx,
|
|
|
|
|
this->state.gfxCtx);
|
2020-03-17 04:31:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-05-21 18:23:43 +00:00
|
|
|
|
void Play_DrawOverlayElements(PlayState* this) {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
if ((this->pauseCtx.state != 0) || (this->pauseCtx.debugState != 0)) {
|
|
|
|
|
KaleidoScopeCall_Draw(this);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-06-24 01:32:48 +00:00
|
|
|
|
if (gSaveContext.gameMode == GAMEMODE_NORMAL) {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Interface_Draw(this);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Message_Draw(this);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
if (this->gameOverCtx.state != GAMEOVER_INACTIVE) {
|
|
|
|
|
GameOver_FadeInLights(this);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-21 18:23:43 +00:00
|
|
|
|
void Play_Draw(PlayState* this) {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
GraphicsContext* gfxCtx = this->state.gfxCtx;
|
2020-09-05 13:45:10 +00:00
|
|
|
|
Lights* sp228;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
Vec3f sp21C;
|
|
|
|
|
|
2020-08-29 23:00:17 +00:00
|
|
|
|
OPEN_DISPS(gfxCtx, "../z_play.c", 3907);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
gSegments[4] = VIRTUAL_TO_PHYSICAL(this->objectCtx.status[this->objectCtx.mainKeepIndex].segment);
|
|
|
|
|
gSegments[5] = VIRTUAL_TO_PHYSICAL(this->objectCtx.status[this->objectCtx.subKeepIndex].segment);
|
|
|
|
|
gSegments[2] = VIRTUAL_TO_PHYSICAL(this->sceneSegment);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2020-10-29 21:31:09 +00:00
|
|
|
|
gSPSegment(POLY_OPA_DISP++, 0x00, NULL);
|
|
|
|
|
gSPSegment(POLY_XLU_DISP++, 0x00, NULL);
|
|
|
|
|
gSPSegment(OVERLAY_DISP++, 0x00, NULL);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
gSPSegment(POLY_OPA_DISP++, 0x04, this->objectCtx.status[this->objectCtx.mainKeepIndex].segment);
|
|
|
|
|
gSPSegment(POLY_XLU_DISP++, 0x04, this->objectCtx.status[this->objectCtx.mainKeepIndex].segment);
|
|
|
|
|
gSPSegment(OVERLAY_DISP++, 0x04, this->objectCtx.status[this->objectCtx.mainKeepIndex].segment);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
gSPSegment(POLY_OPA_DISP++, 0x05, this->objectCtx.status[this->objectCtx.subKeepIndex].segment);
|
|
|
|
|
gSPSegment(POLY_XLU_DISP++, 0x05, this->objectCtx.status[this->objectCtx.subKeepIndex].segment);
|
|
|
|
|
gSPSegment(OVERLAY_DISP++, 0x05, this->objectCtx.status[this->objectCtx.subKeepIndex].segment);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
gSPSegment(POLY_OPA_DISP++, 0x02, this->sceneSegment);
|
|
|
|
|
gSPSegment(POLY_XLU_DISP++, 0x02, this->sceneSegment);
|
|
|
|
|
gSPSegment(OVERLAY_DISP++, 0x02, this->sceneSegment);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-08-15 13:39:06 +00:00
|
|
|
|
Gfx_SetupFrame(gfxCtx, 0, 0, 0);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-11-26 20:22:01 +00:00
|
|
|
|
if ((R_HREG_MODE != HREG_MODE_PLAY) || R_PLAY_RUN_DRAW) {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
POLY_OPA_DISP = Play_SetFog(this, POLY_OPA_DISP);
|
|
|
|
|
POLY_XLU_DISP = Play_SetFog(this, POLY_XLU_DISP);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-11-01 23:00:38 +00:00
|
|
|
|
View_SetPerspective(&this->view, this->view.fovy, this->view.zNear, this->lightCtx.zFar);
|
2022-05-17 22:41:50 +00:00
|
|
|
|
View_Apply(&this->view, VIEW_ALL);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2021-11-30 23:52:16 +00:00
|
|
|
|
// The billboard matrix temporarily stores the viewing matrix
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Matrix_MtxToMtxF(&this->view.viewing, &this->billboardMtxF);
|
|
|
|
|
Matrix_MtxToMtxF(&this->view.projection, &this->viewProjectionMtxF);
|
|
|
|
|
Matrix_Mult(&this->viewProjectionMtxF, MTXMODE_NEW);
|
2021-11-30 23:52:16 +00:00
|
|
|
|
// The billboard is still a viewing matrix at this stage
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Matrix_Mult(&this->billboardMtxF, MTXMODE_APPLY);
|
|
|
|
|
Matrix_Get(&this->viewProjectionMtxF);
|
|
|
|
|
this->billboardMtxF.mf[0][3] = this->billboardMtxF.mf[1][3] = this->billboardMtxF.mf[2][3] =
|
|
|
|
|
this->billboardMtxF.mf[3][0] = this->billboardMtxF.mf[3][1] = this->billboardMtxF.mf[3][2] = 0.0f;
|
2021-11-30 23:52:16 +00:00
|
|
|
|
// This transpose is where the viewing matrix is properly converted into a billboard matrix
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Matrix_Transpose(&this->billboardMtxF);
|
|
|
|
|
this->billboardMtx = Matrix_MtxFToMtx(Matrix_CheckFloats(&this->billboardMtxF, "../z_play.c", 4005),
|
|
|
|
|
Graph_Alloc(gfxCtx, sizeof(Mtx)));
|
2021-11-30 23:52:16 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
gSPSegment(POLY_OPA_DISP++, 0x01, this->billboardMtx);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-11-26 20:22:01 +00:00
|
|
|
|
if ((R_HREG_MODE != HREG_MODE_PLAY) || R_PLAY_DRAW_COVER_ELEMENTS) {
|
2021-02-15 17:29:06 +00:00
|
|
|
|
Gfx* gfxP;
|
2020-10-29 21:31:09 +00:00
|
|
|
|
Gfx* sp1CC = POLY_OPA_DISP;
|
2021-03-31 16:18:31 +00:00
|
|
|
|
|
2021-02-15 17:29:06 +00:00
|
|
|
|
gfxP = Graph_GfxPlusOne(sp1CC);
|
2020-10-29 21:31:09 +00:00
|
|
|
|
gSPDisplayList(OVERLAY_DISP++, gfxP);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
if ((this->transitionMode == TRANS_MODE_INSTANCE_RUNNING) ||
|
|
|
|
|
(this->transitionMode == TRANS_MODE_INSTANCE_WAIT) || (this->transitionCtx.transitionType >= 56)) {
|
2021-02-15 17:29:06 +00:00
|
|
|
|
View view;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
|
|
|
|
View_Init(&view, gfxCtx);
|
2022-04-08 22:50:28 +00:00
|
|
|
|
view.flags = VIEW_VIEWPORT | VIEW_PROJECTION_ORTHO;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2020-06-14 02:59:58 +00:00
|
|
|
|
SET_FULLSCREEN_VIEWPORT(&view);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-04-08 22:50:28 +00:00
|
|
|
|
View_ApplyTo(&view, VIEW_ALL, &gfxP);
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->transitionCtx.draw(&this->transitionCtx.instanceData, &gfxP);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-12-24 02:46:56 +00:00
|
|
|
|
TransitionFade_Draw(&this->transitionFadeFlash, &gfxP);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-12-24 18:55:17 +00:00
|
|
|
|
if (gVisMonoColor.a > 0) {
|
|
|
|
|
D_80161498.primColor.rgba = gVisMonoColor.rgba;
|
2020-05-15 09:02:39 +00:00
|
|
|
|
VisMono_Draw(&D_80161498, &gfxP);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2020-04-30 18:41:09 +00:00
|
|
|
|
gSPEndDisplayList(gfxP++);
|
|
|
|
|
Graph_BranchDlist(sp1CC, gfxP);
|
2020-10-29 21:31:09 +00:00
|
|
|
|
POLY_OPA_DISP = gfxP;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-12-28 21:29:59 +00:00
|
|
|
|
if (gTransitionTileState == TRANS_TILE_READY) {
|
2020-10-29 21:31:09 +00:00
|
|
|
|
Gfx* sp88 = POLY_OPA_DISP;
|
2021-03-31 16:18:31 +00:00
|
|
|
|
|
2022-12-28 21:29:59 +00:00
|
|
|
|
TransitionTile_Draw(&sTransitionTile, &sp88);
|
2020-10-29 21:31:09 +00:00
|
|
|
|
POLY_OPA_DISP = sp88;
|
2022-05-17 22:41:50 +00:00
|
|
|
|
goto Play_Draw_DrawOverlayElements;
|
2023-08-13 14:35:38 +00:00
|
|
|
|
}
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2023-08-13 14:35:38 +00:00
|
|
|
|
PreRender_SetValues(&this->pauseBgPreRender, SCREEN_WIDTH, SCREEN_HEIGHT, gfxCtx->curFrameBuffer, gZBuffer);
|
2022-12-20 00:19:57 +00:00
|
|
|
|
|
2023-08-13 14:35:38 +00:00
|
|
|
|
if (R_PAUSE_BG_PRERENDER_STATE == PAUSE_BG_PRERENDER_PROCESS) {
|
|
|
|
|
// Wait for the previous frame's display list to be processed,
|
|
|
|
|
// so that `pauseBgPreRender.fbufSave` and `pauseBgPreRender.cvgSave` are filled with the appropriate
|
|
|
|
|
// content and can be used by `PreRender_ApplyFilters` below.
|
|
|
|
|
Sched_FlushTaskQueue();
|
2022-12-20 00:19:57 +00:00
|
|
|
|
|
2023-08-13 14:35:38 +00:00
|
|
|
|
PreRender_ApplyFilters(&this->pauseBgPreRender);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2023-08-13 14:35:38 +00:00
|
|
|
|
R_PAUSE_BG_PRERENDER_STATE = PAUSE_BG_PRERENDER_READY;
|
|
|
|
|
} else if (R_PAUSE_BG_PRERENDER_STATE >= PAUSE_BG_PRERENDER_MAX) {
|
|
|
|
|
R_PAUSE_BG_PRERENDER_STATE = PAUSE_BG_PRERENDER_OFF;
|
|
|
|
|
}
|
2022-12-20 00:19:57 +00:00
|
|
|
|
|
2023-08-13 14:35:38 +00:00
|
|
|
|
if (R_PAUSE_BG_PRERENDER_STATE == PAUSE_BG_PRERENDER_READY) {
|
|
|
|
|
Gfx* gfxP = POLY_OPA_DISP;
|
2021-03-31 16:18:31 +00:00
|
|
|
|
|
2023-08-13 14:35:38 +00:00
|
|
|
|
PreRender_RestoreFramebuffer(&this->pauseBgPreRender, &gfxP);
|
|
|
|
|
POLY_OPA_DISP = gfxP;
|
2021-03-31 16:18:31 +00:00
|
|
|
|
|
2023-08-13 14:35:38 +00:00
|
|
|
|
goto Play_Draw_DrawOverlayElements;
|
|
|
|
|
}
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2023-08-13 14:35:38 +00:00
|
|
|
|
if ((R_HREG_MODE != HREG_MODE_PLAY) || R_PLAY_DRAW_SKYBOX) {
|
|
|
|
|
if (this->skyboxId && (this->skyboxId != SKYBOX_UNSET_1D) && !this->envCtx.skyboxDisabled) {
|
|
|
|
|
if ((this->skyboxId == SKYBOX_NORMAL_SKY) || (this->skyboxId == SKYBOX_CUTSCENE_MAP)) {
|
|
|
|
|
Environment_UpdateSkybox(this->skyboxId, &this->envCtx, &this->skyboxCtx);
|
|
|
|
|
Skybox_Draw(&this->skyboxCtx, gfxCtx, this->skyboxId, this->envCtx.skyboxBlend, this->view.eye.x,
|
|
|
|
|
this->view.eye.y, this->view.eye.z);
|
|
|
|
|
} else if (this->skyboxCtx.drawType == SKYBOX_DRAW_128) {
|
|
|
|
|
Skybox_Draw(&this->skyboxCtx, gfxCtx, this->skyboxId, 0, this->view.eye.x, this->view.eye.y,
|
|
|
|
|
this->view.eye.z);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
2023-08-13 14:35:38 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2023-08-13 14:35:38 +00:00
|
|
|
|
if ((R_HREG_MODE != HREG_MODE_PLAY) || (R_PLAY_DRAW_ENV_FLAGS & PLAY_ENV_DRAW_SUN_AND_MOON)) {
|
|
|
|
|
if (!this->envCtx.sunMoonDisabled) {
|
|
|
|
|
Environment_DrawSunAndMoon(this);
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2023-08-13 14:35:38 +00:00
|
|
|
|
if ((R_HREG_MODE != HREG_MODE_PLAY) || (R_PLAY_DRAW_ENV_FLAGS & PLAY_ENV_DRAW_SKYBOX_FILTERS)) {
|
|
|
|
|
Environment_DrawSkyboxFilters(this);
|
|
|
|
|
}
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2023-08-13 14:35:38 +00:00
|
|
|
|
if ((R_HREG_MODE != HREG_MODE_PLAY) || (R_PLAY_DRAW_ENV_FLAGS & PLAY_ENV_DRAW_LIGHTNING)) {
|
|
|
|
|
Environment_UpdateLightningStrike(this);
|
|
|
|
|
Environment_DrawLightning(this, 0);
|
|
|
|
|
}
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2023-08-13 14:35:38 +00:00
|
|
|
|
if ((R_HREG_MODE != HREG_MODE_PLAY) || (R_PLAY_DRAW_ENV_FLAGS & PLAY_ENV_DRAW_LIGHTS)) {
|
|
|
|
|
sp228 = LightContext_NewLights(&this->lightCtx, gfxCtx);
|
|
|
|
|
Lights_BindAll(sp228, this->lightCtx.listHead, NULL);
|
|
|
|
|
Lights_Draw(sp228, gfxCtx);
|
|
|
|
|
}
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2023-08-13 14:35:38 +00:00
|
|
|
|
if ((R_HREG_MODE != HREG_MODE_PLAY) || (R_PLAY_DRAW_ROOM_FLAGS != 0)) {
|
|
|
|
|
if (VREG(94) == 0) {
|
|
|
|
|
s32 roomDrawFlags;
|
2021-03-31 16:18:31 +00:00
|
|
|
|
|
2023-08-13 14:35:38 +00:00
|
|
|
|
if (R_HREG_MODE != HREG_MODE_PLAY) {
|
|
|
|
|
roomDrawFlags = ROOM_DRAW_OPA | ROOM_DRAW_XLU;
|
|
|
|
|
} else {
|
|
|
|
|
roomDrawFlags = R_PLAY_DRAW_ROOM_FLAGS;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
2023-08-13 14:35:38 +00:00
|
|
|
|
Scene_Draw(this);
|
|
|
|
|
Room_Draw(this, &this->roomCtx.curRoom, roomDrawFlags & (ROOM_DRAW_OPA | ROOM_DRAW_XLU));
|
|
|
|
|
Room_Draw(this, &this->roomCtx.prevRoom, roomDrawFlags & (ROOM_DRAW_OPA | ROOM_DRAW_XLU));
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2023-08-13 14:35:38 +00:00
|
|
|
|
if ((R_HREG_MODE != HREG_MODE_PLAY) || R_PLAY_DRAW_SKYBOX) {
|
|
|
|
|
if ((this->skyboxCtx.drawType != SKYBOX_DRAW_128) &&
|
|
|
|
|
(GET_ACTIVE_CAM(this)->setting != CAM_SET_PREREND_FIXED)) {
|
|
|
|
|
Vec3f quakeOffset;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2023-08-13 14:35:38 +00:00
|
|
|
|
Camera_GetQuakeOffset(&quakeOffset, GET_ACTIVE_CAM(this));
|
|
|
|
|
Skybox_Draw(&this->skyboxCtx, gfxCtx, this->skyboxId, 0, this->view.eye.x + quakeOffset.x,
|
|
|
|
|
this->view.eye.y + quakeOffset.y, this->view.eye.z + quakeOffset.z);
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2023-08-13 14:35:38 +00:00
|
|
|
|
if (this->envCtx.precipitation[PRECIP_RAIN_CUR] != 0) {
|
|
|
|
|
Environment_DrawRain(this, &this->view, gfxCtx);
|
|
|
|
|
}
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2023-08-13 14:35:38 +00:00
|
|
|
|
if ((R_HREG_MODE != HREG_MODE_PLAY) || (R_PLAY_DRAW_ROOM_FLAGS != 0)) {
|
|
|
|
|
Environment_FillScreen(gfxCtx, 0, 0, 0, this->bgCoverAlpha, FILL_SCREEN_OPA);
|
|
|
|
|
}
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2023-08-13 14:35:38 +00:00
|
|
|
|
if ((R_HREG_MODE != HREG_MODE_PLAY) || R_PLAY_DRAW_ACTORS) {
|
|
|
|
|
func_800315AC(this, &this->actorCtx);
|
|
|
|
|
}
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2023-08-13 14:35:38 +00:00
|
|
|
|
if ((R_HREG_MODE != HREG_MODE_PLAY) || R_PLAY_DRAW_LENS_FLARES) {
|
|
|
|
|
if (!this->envCtx.sunMoonDisabled) {
|
|
|
|
|
sp21C.x = this->view.eye.x + this->envCtx.sunPos.x;
|
|
|
|
|
sp21C.y = this->view.eye.y + this->envCtx.sunPos.y;
|
|
|
|
|
sp21C.z = this->view.eye.z + this->envCtx.sunPos.z;
|
|
|
|
|
Environment_DrawSunLensFlare(this, &this->envCtx, &this->view, gfxCtx, sp21C, 0);
|
|
|
|
|
}
|
|
|
|
|
Environment_DrawCustomLensFlare(this);
|
|
|
|
|
}
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2023-08-13 14:35:38 +00:00
|
|
|
|
if ((R_HREG_MODE != HREG_MODE_PLAY) || R_PLAY_DRAW_SCREEN_FILLS) {
|
|
|
|
|
if (MREG(64) != 0) {
|
|
|
|
|
Environment_FillScreen(gfxCtx, MREG(65), MREG(66), MREG(67), MREG(68),
|
|
|
|
|
FILL_SCREEN_OPA | FILL_SCREEN_XLU);
|
|
|
|
|
}
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2023-08-13 14:35:38 +00:00
|
|
|
|
switch (this->envCtx.fillScreen) {
|
|
|
|
|
case 1:
|
|
|
|
|
Environment_FillScreen(gfxCtx, this->envCtx.screenFillColor[0], this->envCtx.screenFillColor[1],
|
|
|
|
|
this->envCtx.screenFillColor[2], this->envCtx.screenFillColor[3],
|
|
|
|
|
FILL_SCREEN_OPA | FILL_SCREEN_XLU);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2023-08-13 14:35:38 +00:00
|
|
|
|
if ((R_HREG_MODE != HREG_MODE_PLAY) || R_PLAY_DRAW_SANDSTORM) {
|
|
|
|
|
if (this->envCtx.sandstormState != SANDSTORM_OFF) {
|
|
|
|
|
Environment_DrawSandstorm(this, this->envCtx.sandstormState);
|
|
|
|
|
}
|
|
|
|
|
}
|
2021-03-31 16:18:31 +00:00
|
|
|
|
|
2023-08-13 14:35:38 +00:00
|
|
|
|
if ((R_HREG_MODE != HREG_MODE_PLAY) || R_PLAY_DRAW_DEBUG_OBJECTS) {
|
|
|
|
|
DebugDisplay_DrawObjects(this);
|
|
|
|
|
}
|
2022-12-20 00:19:57 +00:00
|
|
|
|
|
2023-08-13 14:35:38 +00:00
|
|
|
|
if ((R_PAUSE_BG_PRERENDER_STATE == PAUSE_BG_PRERENDER_SETUP) || (gTransitionTileState == TRANS_TILE_SETUP)) {
|
|
|
|
|
Gfx* gfxP = OVERLAY_DISP;
|
|
|
|
|
|
|
|
|
|
// Copy the frame buffer contents at this point in the display list to the zbuffer
|
|
|
|
|
// The zbuffer must then stay untouched until unpausing
|
|
|
|
|
this->pauseBgPreRender.fbuf = gfxCtx->curFrameBuffer;
|
|
|
|
|
this->pauseBgPreRender.fbufSave = (u16*)gZBuffer;
|
|
|
|
|
PreRender_SaveFramebuffer(&this->pauseBgPreRender, &gfxP);
|
|
|
|
|
if (R_PAUSE_BG_PRERENDER_STATE == PAUSE_BG_PRERENDER_SETUP) {
|
|
|
|
|
this->pauseBgPreRender.cvgSave = (u8*)gfxCtx->curFrameBuffer;
|
|
|
|
|
PreRender_DrawCoverage(&this->pauseBgPreRender, &gfxP);
|
|
|
|
|
|
|
|
|
|
R_PAUSE_BG_PRERENDER_STATE = PAUSE_BG_PRERENDER_PROCESS;
|
|
|
|
|
} else {
|
|
|
|
|
gTransitionTileState = TRANS_TILE_PROCESS;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
2023-08-13 14:35:38 +00:00
|
|
|
|
OVERLAY_DISP = gfxP;
|
|
|
|
|
this->unk_121C7 = 2;
|
|
|
|
|
R_GRAPH_TASKSET00_FLAGS |= 1;
|
|
|
|
|
goto Play_Draw_skip;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Play_Draw_DrawOverlayElements:
|
|
|
|
|
if ((R_HREG_MODE != HREG_MODE_PLAY) || R_PLAY_DRAW_OVERLAY_ELEMENTS) {
|
|
|
|
|
Play_DrawOverlayElements(this);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-13 14:35:38 +00:00
|
|
|
|
Play_Draw_skip:
|
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
if (this->view.unk_124 != 0) {
|
|
|
|
|
Camera_Update(GET_ACTIVE_CAM(this));
|
|
|
|
|
View_UpdateViewingMatrix(&this->view);
|
|
|
|
|
this->view.unk_124 = 0;
|
|
|
|
|
if (this->skyboxId && (this->skyboxId != SKYBOX_UNSET_1D) && !this->envCtx.skyboxDisabled) {
|
2022-11-26 22:53:41 +00:00
|
|
|
|
Skybox_UpdateMatrix(&this->skyboxCtx, this->view.eye.x, this->view.eye.y, this->view.eye.z);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Camera_Finish(GET_ACTIVE_CAM(this));
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2020-08-29 23:00:17 +00:00
|
|
|
|
CLOSE_DISPS(gfxCtx, "../z_play.c", 4508);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
void Play_Main(GameState* thisx) {
|
2022-05-21 18:23:43 +00:00
|
|
|
|
PlayState* this = (PlayState*)thisx;
|
2020-10-13 00:44:22 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
D_8012D1F8 = &this->state.input[0];
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
|
|
|
|
DebugDisplay_Init();
|
|
|
|
|
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(4556);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-11-26 20:22:01 +00:00
|
|
|
|
if ((R_HREG_MODE == HREG_MODE_PLAY) && (R_PLAY_INIT != HREG_MODE_PLAY)) {
|
|
|
|
|
R_PLAY_RUN_UPDATE = true;
|
|
|
|
|
R_PLAY_RUN_DRAW = true;
|
|
|
|
|
R_PLAY_DRAW_SKYBOX = true;
|
|
|
|
|
R_PLAY_DRAW_ROOM_FLAGS = (ROOM_DRAW_OPA | ROOM_DRAW_XLU);
|
|
|
|
|
R_PLAY_DRAW_ACTORS = true;
|
|
|
|
|
R_PLAY_DRAW_LENS_FLARES = true;
|
|
|
|
|
R_PLAY_DRAW_SCREEN_FILLS = true;
|
|
|
|
|
R_PLAY_DRAW_SANDSTORM = true;
|
|
|
|
|
R_PLAY_DRAW_OVERLAY_ELEMENTS = true;
|
|
|
|
|
R_PLAY_DRAW_ENV_FLAGS = (PLAY_ENV_DRAW_SKYBOX_FILTERS | PLAY_ENV_DRAW_SUN_AND_MOON | PLAY_ENV_DRAW_LIGHTNING |
|
|
|
|
|
PLAY_ENV_DRAW_LIGHTS);
|
|
|
|
|
HREG(91) = 1; // reg is not used in this mode
|
|
|
|
|
R_PLAY_DRAW_COVER_ELEMENTS = true;
|
|
|
|
|
R_PLAY_DRAW_DEBUG_OBJECTS = true;
|
|
|
|
|
R_PLAY_INIT = HREG_MODE_PLAY;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-11-26 20:22:01 +00:00
|
|
|
|
if ((R_HREG_MODE != HREG_MODE_PLAY) || R_PLAY_RUN_UPDATE) {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Play_Update(this);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(4583);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Play_Draw(this);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-06-21 17:25:09 +00:00
|
|
|
|
PLAY_LOG(4587);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// original name: "Game_play_demo_mode_check"
|
2022-05-21 18:23:43 +00:00
|
|
|
|
s32 Play_InCsMode(PlayState* this) {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
return (this->csCtx.state != CS_STATE_IDLE) || Player_InCsMode(this);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-08-30 15:49:51 +00:00
|
|
|
|
f32 func_800BFCB8(PlayState* this, MtxF* mf, Vec3f* pos) {
|
z_bgcheck.c, 800430A0.c, 80043480.c (#256)
* beginning of migrating changes
* got matching
* changed order a bit
* clean up bgcheck
* fix conflict
* fix conflict again
* first stab at identifying types, some oks
* Clean up most bad structs/pointer math, move relevant structs to z64bgcheck.h, get some OKs
* more OKs, z_bgcheck.bss migration, update some sys_math3d.c args
* couple more OKs
* pushing some OKs
* fix compilation issues
* code_800430A0.c OK, more files decomp'd
* 8003A3E0 big OK :)
* Decomp most of func_8003C614, decomp helper funcs
* Decomp SurfaceType, CamData, and WaterBox property related functions
* more OKs, big OK in 8003C078
* more OKs, more progress, move a function definition in z_collision_check to functions.h
* more clean-ups, more OKs, dyn_vtx is now defined as u8*
* 8003A5B8, 8003A7D8, 8003C614, 8003DD6C OK, document function args better
* data migrated, more OKs
* 80041240 OK, func_8003B3C8 and func_8003BB18 disassembled
* func_80040284, 800409A8 non_matching, add IS_ZERO macro
* All asm files have C representations, some big OKs, lots of minor tweaks
* More OKs, non-matching code cleanup
* 8003FBF4 and 80040BE4 OK, improve codegen for most functions
* format z_bgcheck.c
* fix warnings, compile errors on NON_MATCHING
* func_8003EE80 is now NON_MATCHING
* begin documenting some functions
* formatting
* more documentation, func_8003A95C OK
* fix PHYSICAL_TO_VIRTUAL changes
* fix var rename
* More documentation, functions 80040E40, 80041648 OK, change types to not be compatible with ZAP
* func_8004239C ok, more NON_MATCHING improvements, more documentation
* Implement most suggested changes
* Convert comments to slower comments
* /**
* Implement ZAP2 changes
* my anti-virus ate my format.sh results
* Rename a couple hundred functions, fix minor stuff
* rename var so that clang formats correctly
* run format.sh
* implement Petrie's matches/suggestions
* format
* matches
* and the asm
* slight error
* Add SSList
* two more matches
* stuff
* implement code changes
* clean up Petrie's matchings
Co-authored-by: Arthur <arthurtilly413@gmail.com>
Co-authored-by: fig02 <fig02srl@gmail.com>
Co-authored-by: petrie911 <pmontag@DESKTOP-LG8A167.localdomain>
2021-01-08 11:12:58 +00:00
|
|
|
|
CollisionPoly poly;
|
2020-06-07 14:08:06 +00:00
|
|
|
|
f32 temp1;
|
|
|
|
|
f32 temp2;
|
|
|
|
|
f32 temp3;
|
z_bgcheck.c, 800430A0.c, 80043480.c (#256)
* beginning of migrating changes
* got matching
* changed order a bit
* clean up bgcheck
* fix conflict
* fix conflict again
* first stab at identifying types, some oks
* Clean up most bad structs/pointer math, move relevant structs to z64bgcheck.h, get some OKs
* more OKs, z_bgcheck.bss migration, update some sys_math3d.c args
* couple more OKs
* pushing some OKs
* fix compilation issues
* code_800430A0.c OK, more files decomp'd
* 8003A3E0 big OK :)
* Decomp most of func_8003C614, decomp helper funcs
* Decomp SurfaceType, CamData, and WaterBox property related functions
* more OKs, big OK in 8003C078
* more OKs, more progress, move a function definition in z_collision_check to functions.h
* more clean-ups, more OKs, dyn_vtx is now defined as u8*
* 8003A5B8, 8003A7D8, 8003C614, 8003DD6C OK, document function args better
* data migrated, more OKs
* 80041240 OK, func_8003B3C8 and func_8003BB18 disassembled
* func_80040284, 800409A8 non_matching, add IS_ZERO macro
* All asm files have C representations, some big OKs, lots of minor tweaks
* More OKs, non-matching code cleanup
* 8003FBF4 and 80040BE4 OK, improve codegen for most functions
* format z_bgcheck.c
* fix warnings, compile errors on NON_MATCHING
* func_8003EE80 is now NON_MATCHING
* begin documenting some functions
* formatting
* more documentation, func_8003A95C OK
* fix PHYSICAL_TO_VIRTUAL changes
* fix var rename
* More documentation, functions 80040E40, 80041648 OK, change types to not be compatible with ZAP
* func_8004239C ok, more NON_MATCHING improvements, more documentation
* Implement most suggested changes
* Convert comments to slower comments
* /**
* Implement ZAP2 changes
* my anti-virus ate my format.sh results
* Rename a couple hundred functions, fix minor stuff
* rename var so that clang formats correctly
* run format.sh
* implement Petrie's matches/suggestions
* format
* matches
* and the asm
* slight error
* Add SSList
* two more matches
* stuff
* implement code changes
* clean up Petrie's matchings
Co-authored-by: Arthur <arthurtilly413@gmail.com>
Co-authored-by: fig02 <fig02srl@gmail.com>
Co-authored-by: petrie911 <pmontag@DESKTOP-LG8A167.localdomain>
2021-01-08 11:12:58 +00:00
|
|
|
|
f32 floorY;
|
|
|
|
|
f32 nx;
|
|
|
|
|
f32 ny;
|
|
|
|
|
f32 nz;
|
2020-06-07 14:08:06 +00:00
|
|
|
|
s32 pad[5];
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-08-30 15:49:51 +00:00
|
|
|
|
floorY = BgCheck_AnyRaycastDown1(&this->colCtx, &poly, pos);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
z_bgcheck.c, 800430A0.c, 80043480.c (#256)
* beginning of migrating changes
* got matching
* changed order a bit
* clean up bgcheck
* fix conflict
* fix conflict again
* first stab at identifying types, some oks
* Clean up most bad structs/pointer math, move relevant structs to z64bgcheck.h, get some OKs
* more OKs, z_bgcheck.bss migration, update some sys_math3d.c args
* couple more OKs
* pushing some OKs
* fix compilation issues
* code_800430A0.c OK, more files decomp'd
* 8003A3E0 big OK :)
* Decomp most of func_8003C614, decomp helper funcs
* Decomp SurfaceType, CamData, and WaterBox property related functions
* more OKs, big OK in 8003C078
* more OKs, more progress, move a function definition in z_collision_check to functions.h
* more clean-ups, more OKs, dyn_vtx is now defined as u8*
* 8003A5B8, 8003A7D8, 8003C614, 8003DD6C OK, document function args better
* data migrated, more OKs
* 80041240 OK, func_8003B3C8 and func_8003BB18 disassembled
* func_80040284, 800409A8 non_matching, add IS_ZERO macro
* All asm files have C representations, some big OKs, lots of minor tweaks
* More OKs, non-matching code cleanup
* 8003FBF4 and 80040BE4 OK, improve codegen for most functions
* format z_bgcheck.c
* fix warnings, compile errors on NON_MATCHING
* func_8003EE80 is now NON_MATCHING
* begin documenting some functions
* formatting
* more documentation, func_8003A95C OK
* fix PHYSICAL_TO_VIRTUAL changes
* fix var rename
* More documentation, functions 80040E40, 80041648 OK, change types to not be compatible with ZAP
* func_8004239C ok, more NON_MATCHING improvements, more documentation
* Implement most suggested changes
* Convert comments to slower comments
* /**
* Implement ZAP2 changes
* my anti-virus ate my format.sh results
* Rename a couple hundred functions, fix minor stuff
* rename var so that clang formats correctly
* run format.sh
* implement Petrie's matches/suggestions
* format
* matches
* and the asm
* slight error
* Add SSList
* two more matches
* stuff
* implement code changes
* clean up Petrie's matchings
Co-authored-by: Arthur <arthurtilly413@gmail.com>
Co-authored-by: fig02 <fig02srl@gmail.com>
Co-authored-by: petrie911 <pmontag@DESKTOP-LG8A167.localdomain>
2021-01-08 11:12:58 +00:00
|
|
|
|
if (floorY > BGCHECK_Y_MIN) {
|
|
|
|
|
nx = COLPOLY_GET_NORMAL(poly.normal.x);
|
|
|
|
|
ny = COLPOLY_GET_NORMAL(poly.normal.y);
|
|
|
|
|
nz = COLPOLY_GET_NORMAL(poly.normal.z);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
z_bgcheck.c, 800430A0.c, 80043480.c (#256)
* beginning of migrating changes
* got matching
* changed order a bit
* clean up bgcheck
* fix conflict
* fix conflict again
* first stab at identifying types, some oks
* Clean up most bad structs/pointer math, move relevant structs to z64bgcheck.h, get some OKs
* more OKs, z_bgcheck.bss migration, update some sys_math3d.c args
* couple more OKs
* pushing some OKs
* fix compilation issues
* code_800430A0.c OK, more files decomp'd
* 8003A3E0 big OK :)
* Decomp most of func_8003C614, decomp helper funcs
* Decomp SurfaceType, CamData, and WaterBox property related functions
* more OKs, big OK in 8003C078
* more OKs, more progress, move a function definition in z_collision_check to functions.h
* more clean-ups, more OKs, dyn_vtx is now defined as u8*
* 8003A5B8, 8003A7D8, 8003C614, 8003DD6C OK, document function args better
* data migrated, more OKs
* 80041240 OK, func_8003B3C8 and func_8003BB18 disassembled
* func_80040284, 800409A8 non_matching, add IS_ZERO macro
* All asm files have C representations, some big OKs, lots of minor tweaks
* More OKs, non-matching code cleanup
* 8003FBF4 and 80040BE4 OK, improve codegen for most functions
* format z_bgcheck.c
* fix warnings, compile errors on NON_MATCHING
* func_8003EE80 is now NON_MATCHING
* begin documenting some functions
* formatting
* more documentation, func_8003A95C OK
* fix PHYSICAL_TO_VIRTUAL changes
* fix var rename
* More documentation, functions 80040E40, 80041648 OK, change types to not be compatible with ZAP
* func_8004239C ok, more NON_MATCHING improvements, more documentation
* Implement most suggested changes
* Convert comments to slower comments
* /**
* Implement ZAP2 changes
* my anti-virus ate my format.sh results
* Rename a couple hundred functions, fix minor stuff
* rename var so that clang formats correctly
* run format.sh
* implement Petrie's matches/suggestions
* format
* matches
* and the asm
* slight error
* Add SSList
* two more matches
* stuff
* implement code changes
* clean up Petrie's matchings
Co-authored-by: Arthur <arthurtilly413@gmail.com>
Co-authored-by: fig02 <fig02srl@gmail.com>
Co-authored-by: petrie911 <pmontag@DESKTOP-LG8A167.localdomain>
2021-01-08 11:12:58 +00:00
|
|
|
|
temp1 = sqrtf(1.0f - SQ(nx));
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2020-06-07 14:08:06 +00:00
|
|
|
|
if (temp1 != 0.0f) {
|
z_bgcheck.c, 800430A0.c, 80043480.c (#256)
* beginning of migrating changes
* got matching
* changed order a bit
* clean up bgcheck
* fix conflict
* fix conflict again
* first stab at identifying types, some oks
* Clean up most bad structs/pointer math, move relevant structs to z64bgcheck.h, get some OKs
* more OKs, z_bgcheck.bss migration, update some sys_math3d.c args
* couple more OKs
* pushing some OKs
* fix compilation issues
* code_800430A0.c OK, more files decomp'd
* 8003A3E0 big OK :)
* Decomp most of func_8003C614, decomp helper funcs
* Decomp SurfaceType, CamData, and WaterBox property related functions
* more OKs, big OK in 8003C078
* more OKs, more progress, move a function definition in z_collision_check to functions.h
* more clean-ups, more OKs, dyn_vtx is now defined as u8*
* 8003A5B8, 8003A7D8, 8003C614, 8003DD6C OK, document function args better
* data migrated, more OKs
* 80041240 OK, func_8003B3C8 and func_8003BB18 disassembled
* func_80040284, 800409A8 non_matching, add IS_ZERO macro
* All asm files have C representations, some big OKs, lots of minor tweaks
* More OKs, non-matching code cleanup
* 8003FBF4 and 80040BE4 OK, improve codegen for most functions
* format z_bgcheck.c
* fix warnings, compile errors on NON_MATCHING
* func_8003EE80 is now NON_MATCHING
* begin documenting some functions
* formatting
* more documentation, func_8003A95C OK
* fix PHYSICAL_TO_VIRTUAL changes
* fix var rename
* More documentation, functions 80040E40, 80041648 OK, change types to not be compatible with ZAP
* func_8004239C ok, more NON_MATCHING improvements, more documentation
* Implement most suggested changes
* Convert comments to slower comments
* /**
* Implement ZAP2 changes
* my anti-virus ate my format.sh results
* Rename a couple hundred functions, fix minor stuff
* rename var so that clang formats correctly
* run format.sh
* implement Petrie's matches/suggestions
* format
* matches
* and the asm
* slight error
* Add SSList
* two more matches
* stuff
* implement code changes
* clean up Petrie's matchings
Co-authored-by: Arthur <arthurtilly413@gmail.com>
Co-authored-by: fig02 <fig02srl@gmail.com>
Co-authored-by: petrie911 <pmontag@DESKTOP-LG8A167.localdomain>
2021-01-08 11:12:58 +00:00
|
|
|
|
temp2 = ny * temp1;
|
|
|
|
|
temp3 = -nz * temp1;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
} else {
|
2020-06-07 14:08:06 +00:00
|
|
|
|
temp3 = 0.0f;
|
|
|
|
|
temp2 = 0.0f;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2020-06-07 14:08:06 +00:00
|
|
|
|
mf->xx = temp1;
|
2021-08-31 18:19:41 +00:00
|
|
|
|
mf->yx = -nx * temp2;
|
|
|
|
|
mf->zx = nx * temp3;
|
|
|
|
|
mf->xy = nx;
|
z_bgcheck.c, 800430A0.c, 80043480.c (#256)
* beginning of migrating changes
* got matching
* changed order a bit
* clean up bgcheck
* fix conflict
* fix conflict again
* first stab at identifying types, some oks
* Clean up most bad structs/pointer math, move relevant structs to z64bgcheck.h, get some OKs
* more OKs, z_bgcheck.bss migration, update some sys_math3d.c args
* couple more OKs
* pushing some OKs
* fix compilation issues
* code_800430A0.c OK, more files decomp'd
* 8003A3E0 big OK :)
* Decomp most of func_8003C614, decomp helper funcs
* Decomp SurfaceType, CamData, and WaterBox property related functions
* more OKs, big OK in 8003C078
* more OKs, more progress, move a function definition in z_collision_check to functions.h
* more clean-ups, more OKs, dyn_vtx is now defined as u8*
* 8003A5B8, 8003A7D8, 8003C614, 8003DD6C OK, document function args better
* data migrated, more OKs
* 80041240 OK, func_8003B3C8 and func_8003BB18 disassembled
* func_80040284, 800409A8 non_matching, add IS_ZERO macro
* All asm files have C representations, some big OKs, lots of minor tweaks
* More OKs, non-matching code cleanup
* 8003FBF4 and 80040BE4 OK, improve codegen for most functions
* format z_bgcheck.c
* fix warnings, compile errors on NON_MATCHING
* func_8003EE80 is now NON_MATCHING
* begin documenting some functions
* formatting
* more documentation, func_8003A95C OK
* fix PHYSICAL_TO_VIRTUAL changes
* fix var rename
* More documentation, functions 80040E40, 80041648 OK, change types to not be compatible with ZAP
* func_8004239C ok, more NON_MATCHING improvements, more documentation
* Implement most suggested changes
* Convert comments to slower comments
* /**
* Implement ZAP2 changes
* my anti-virus ate my format.sh results
* Rename a couple hundred functions, fix minor stuff
* rename var so that clang formats correctly
* run format.sh
* implement Petrie's matches/suggestions
* format
* matches
* and the asm
* slight error
* Add SSList
* two more matches
* stuff
* implement code changes
* clean up Petrie's matchings
Co-authored-by: Arthur <arthurtilly413@gmail.com>
Co-authored-by: fig02 <fig02srl@gmail.com>
Co-authored-by: petrie911 <pmontag@DESKTOP-LG8A167.localdomain>
2021-01-08 11:12:58 +00:00
|
|
|
|
mf->yy = ny;
|
2021-08-31 18:19:41 +00:00
|
|
|
|
mf->zy = nz;
|
|
|
|
|
mf->yz = temp3;
|
2020-06-07 14:08:06 +00:00
|
|
|
|
mf->zz = temp2;
|
2021-08-31 18:19:41 +00:00
|
|
|
|
mf->wx = 0.0f;
|
|
|
|
|
mf->wy = 0.0f;
|
|
|
|
|
mf->xz = 0.0f;
|
|
|
|
|
mf->wz = 0.0f;
|
2022-08-30 15:49:51 +00:00
|
|
|
|
mf->xw = pos->x;
|
2021-08-31 18:19:41 +00:00
|
|
|
|
mf->yw = floorY;
|
2022-08-30 15:49:51 +00:00
|
|
|
|
mf->zw = pos->z;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
mf->ww = 1.0f;
|
|
|
|
|
} else {
|
|
|
|
|
mf->xy = 0.0f;
|
|
|
|
|
mf->zx = 0.0f;
|
2021-08-31 18:19:41 +00:00
|
|
|
|
mf->yx = 0.0f;
|
|
|
|
|
mf->xx = 0.0f;
|
|
|
|
|
mf->wz = 0.0f;
|
|
|
|
|
mf->xz = 0.0f;
|
|
|
|
|
mf->wy = 0.0f;
|
|
|
|
|
mf->wx = 0.0f;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
mf->zz = 0.0f;
|
|
|
|
|
mf->yz = 0.0f;
|
2021-08-31 18:19:41 +00:00
|
|
|
|
mf->zy = 0.0f;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
mf->yy = 1.0f;
|
2022-08-30 15:49:51 +00:00
|
|
|
|
mf->xw = pos->x;
|
|
|
|
|
mf->yw = pos->y;
|
|
|
|
|
mf->zw = pos->z;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
mf->ww = 1.0f;
|
|
|
|
|
}
|
|
|
|
|
|
z_bgcheck.c, 800430A0.c, 80043480.c (#256)
* beginning of migrating changes
* got matching
* changed order a bit
* clean up bgcheck
* fix conflict
* fix conflict again
* first stab at identifying types, some oks
* Clean up most bad structs/pointer math, move relevant structs to z64bgcheck.h, get some OKs
* more OKs, z_bgcheck.bss migration, update some sys_math3d.c args
* couple more OKs
* pushing some OKs
* fix compilation issues
* code_800430A0.c OK, more files decomp'd
* 8003A3E0 big OK :)
* Decomp most of func_8003C614, decomp helper funcs
* Decomp SurfaceType, CamData, and WaterBox property related functions
* more OKs, big OK in 8003C078
* more OKs, more progress, move a function definition in z_collision_check to functions.h
* more clean-ups, more OKs, dyn_vtx is now defined as u8*
* 8003A5B8, 8003A7D8, 8003C614, 8003DD6C OK, document function args better
* data migrated, more OKs
* 80041240 OK, func_8003B3C8 and func_8003BB18 disassembled
* func_80040284, 800409A8 non_matching, add IS_ZERO macro
* All asm files have C representations, some big OKs, lots of minor tweaks
* More OKs, non-matching code cleanup
* 8003FBF4 and 80040BE4 OK, improve codegen for most functions
* format z_bgcheck.c
* fix warnings, compile errors on NON_MATCHING
* func_8003EE80 is now NON_MATCHING
* begin documenting some functions
* formatting
* more documentation, func_8003A95C OK
* fix PHYSICAL_TO_VIRTUAL changes
* fix var rename
* More documentation, functions 80040E40, 80041648 OK, change types to not be compatible with ZAP
* func_8004239C ok, more NON_MATCHING improvements, more documentation
* Implement most suggested changes
* Convert comments to slower comments
* /**
* Implement ZAP2 changes
* my anti-virus ate my format.sh results
* Rename a couple hundred functions, fix minor stuff
* rename var so that clang formats correctly
* run format.sh
* implement Petrie's matches/suggestions
* format
* matches
* and the asm
* slight error
* Add SSList
* two more matches
* stuff
* implement code changes
* clean up Petrie's matchings
Co-authored-by: Arthur <arthurtilly413@gmail.com>
Co-authored-by: fig02 <fig02srl@gmail.com>
Co-authored-by: petrie911 <pmontag@DESKTOP-LG8A167.localdomain>
2021-01-08 11:12:58 +00:00
|
|
|
|
return floorY;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-05-21 18:23:43 +00:00
|
|
|
|
void* Play_LoadFile(PlayState* this, RomFile* file) {
|
2020-04-16 21:36:12 +00:00
|
|
|
|
u32 size;
|
|
|
|
|
void* allocp;
|
|
|
|
|
|
|
|
|
|
size = file->vromEnd - file->vromStart;
|
2022-05-17 22:41:50 +00:00
|
|
|
|
allocp = GameState_Alloc(&this->state, size, "../z_play.c", 4692);
|
2022-11-17 02:57:02 +00:00
|
|
|
|
DmaMgr_RequestSyncDebug(allocp, file->vromStart, size, "../z_play.c", 4694);
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
2020-04-16 21:36:12 +00:00
|
|
|
|
return allocp;
|
|
|
|
|
}
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
2022-05-21 18:23:43 +00:00
|
|
|
|
void Play_InitEnvironment(PlayState* this, s16 skyboxId) {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Skybox_Init(&this->state, &this->skyboxCtx, skyboxId);
|
|
|
|
|
Environment_Init(this, &this->envCtx, 0);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
2022-05-21 18:23:43 +00:00
|
|
|
|
void Play_InitScene(PlayState* this, s32 spawn) {
|
2022-10-16 22:00:18 +00:00
|
|
|
|
this->spawn = spawn;
|
|
|
|
|
|
|
|
|
|
this->playerEntry = NULL;
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->unk_11DFC = NULL;
|
2022-10-16 22:00:18 +00:00
|
|
|
|
this->spawnList = NULL;
|
|
|
|
|
this->exitList = NULL;
|
2022-10-15 17:24:13 +00:00
|
|
|
|
this->naviQuestHints = NULL;
|
2022-10-16 22:00:18 +00:00
|
|
|
|
this->pathList = NULL;
|
|
|
|
|
|
|
|
|
|
this->numActorEntries = 0;
|
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Object_InitBank(this, &this->objectCtx);
|
|
|
|
|
LightContext_Init(this, &this->lightCtx);
|
|
|
|
|
TransitionActor_InitContext(&this->state, &this->transiActorCtx);
|
|
|
|
|
func_80096FD4(this, &this->roomCtx.curRoom);
|
2022-06-21 00:31:53 +00:00
|
|
|
|
R_SCENE_CAM_TYPE = SCENE_CAM_TYPE_DEFAULT;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
gSaveContext.worldMapArea = 0;
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Scene_ExecuteCommands(this, this->sceneSegment);
|
|
|
|
|
Play_InitEnvironment(this, this->skyboxId);
|
2020-03-17 04:31:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-07-31 23:44:47 +00:00
|
|
|
|
void Play_SpawnScene(PlayState* this, s32 sceneId, s32 spawn) {
|
|
|
|
|
SceneTableEntry* scene = &gSceneTable[sceneId];
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
2020-04-16 21:36:12 +00:00
|
|
|
|
scene->unk_13 = 0;
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->loadedScene = scene;
|
2022-07-31 23:44:47 +00:00
|
|
|
|
this->sceneId = sceneId;
|
2022-05-31 18:19:46 +00:00
|
|
|
|
this->sceneDrawConfig = scene->drawConfig;
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
2021-03-31 16:18:31 +00:00
|
|
|
|
osSyncPrintf("\nSCENE SIZE %fK\n", (scene->sceneFile.vromEnd - scene->sceneFile.vromStart) / 1024.0f);
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->sceneSegment = Play_LoadFile(this, &scene->sceneFile);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
scene->unk_13 = 0;
|
2022-05-17 22:41:50 +00:00
|
|
|
|
ASSERT(this->sceneSegment != NULL, "this->sceneSegment != NULL", "../z_play.c", 4960);
|
2021-04-29 18:39:46 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
gSegments[2] = VIRTUAL_TO_PHYSICAL(this->sceneSegment);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Play_InitScene(this, spawn);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
osSyncPrintf("ROOM SIZE=%fK\n", func_80096FE8(this, &this->roomCtx) / 1024.0f);
|
2020-03-17 04:31:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-05-21 18:23:43 +00:00
|
|
|
|
void Play_GetScreenPos(PlayState* this, Vec3f* src, Vec3f* dest) {
|
2022-05-20 18:40:13 +00:00
|
|
|
|
f32 w;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Matrix_Mult(&this->viewProjectionMtxF, MTXMODE_NEW);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
Matrix_MultVec3f(src, dest);
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
2022-05-20 18:40:13 +00:00
|
|
|
|
w = this->viewProjectionMtxF.ww + (this->viewProjectionMtxF.wx * src->x + this->viewProjectionMtxF.wy * src->y +
|
|
|
|
|
this->viewProjectionMtxF.wz * src->z);
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
2022-05-20 18:40:13 +00:00
|
|
|
|
dest->x = (SCREEN_WIDTH / 2) + ((dest->x / w) * (SCREEN_WIDTH / 2));
|
|
|
|
|
dest->y = (SCREEN_HEIGHT / 2) - ((dest->y / w) * (SCREEN_HEIGHT / 2));
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-05-21 18:23:43 +00:00
|
|
|
|
s16 Play_CreateSubCamera(PlayState* this) {
|
2022-12-17 21:07:31 +00:00
|
|
|
|
s16 camId;
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
2022-12-17 21:07:31 +00:00
|
|
|
|
for (camId = CAM_ID_SUB_FIRST; camId < NUM_CAMS; camId++) {
|
|
|
|
|
if (this->cameraPtrs[camId] == NULL) {
|
2020-04-16 21:36:12 +00:00
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
2022-12-17 21:07:31 +00:00
|
|
|
|
if (camId == NUM_CAMS) {
|
2020-04-16 21:36:12 +00:00
|
|
|
|
osSyncPrintf(VT_COL(RED, WHITE) "camera control: error: fulled sub camera system area\n" VT_RST);
|
2022-05-12 18:35:31 +00:00
|
|
|
|
return CAM_ID_NONE;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
osSyncPrintf("camera control: " VT_BGCOL(CYAN) " " VT_COL(WHITE, BLUE) " create new sub camera [%d] " VT_BGCOL(
|
|
|
|
|
CYAN) " " VT_RST "\n",
|
2022-12-17 21:07:31 +00:00
|
|
|
|
camId);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-12-17 21:07:31 +00:00
|
|
|
|
this->cameraPtrs[camId] = &this->subCameras[camId - CAM_ID_SUB_FIRST];
|
|
|
|
|
Camera_Init(this->cameraPtrs[camId], &this->view, &this->colCtx, this);
|
|
|
|
|
this->cameraPtrs[camId]->camId = camId;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-12-17 21:07:31 +00:00
|
|
|
|
return camId;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
2022-05-21 18:23:43 +00:00
|
|
|
|
s16 Play_GetActiveCamId(PlayState* this) {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
return this->activeCamId;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-05-21 18:23:43 +00:00
|
|
|
|
s16 Play_ChangeCameraStatus(PlayState* this, s16 camId, s16 status) {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
s16 camIdx = (camId == CAM_ID_NONE) ? this->activeCamId : camId;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2021-03-31 16:18:31 +00:00
|
|
|
|
if (status == CAM_STAT_ACTIVE) {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->activeCamId = camIdx;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
return Camera_ChangeStatus(this->cameraPtrs[camIdx], status);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-05-21 18:23:43 +00:00
|
|
|
|
void Play_ClearCamera(PlayState* this, s16 camId) {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
s16 camIdx = (camId == CAM_ID_NONE) ? this->activeCamId : camId;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-05-12 18:35:31 +00:00
|
|
|
|
if (camIdx == CAM_ID_MAIN) {
|
2020-04-16 21:36:12 +00:00
|
|
|
|
osSyncPrintf(VT_COL(RED, WHITE) "camera control: error: never clear camera !!\n" VT_RST);
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
if (this->cameraPtrs[camIdx] != NULL) {
|
|
|
|
|
Camera_ChangeStatus(this->cameraPtrs[camIdx], CAM_STAT_UNK100);
|
|
|
|
|
this->cameraPtrs[camIdx] = NULL;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
osSyncPrintf("camera control: " VT_BGCOL(CYAN) " " VT_COL(WHITE, BLUE) " clear sub camera [%d] " VT_BGCOL(
|
|
|
|
|
CYAN) " " VT_RST "\n",
|
|
|
|
|
camIdx);
|
|
|
|
|
} else {
|
|
|
|
|
osSyncPrintf(VT_COL(RED, WHITE) "camera control: error: camera No.%d already cleared\n" VT_RST, camIdx);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-21 18:23:43 +00:00
|
|
|
|
void Play_ClearAllSubCameras(PlayState* this) {
|
2022-05-12 18:35:31 +00:00
|
|
|
|
s16 subCamId;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-05-12 18:35:31 +00:00
|
|
|
|
for (subCamId = CAM_ID_SUB_FIRST; subCamId < NUM_CAMS; subCamId++) {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
if (this->cameraPtrs[subCamId] != NULL) {
|
|
|
|
|
Play_ClearCamera(this, subCamId);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->activeCamId = CAM_ID_MAIN;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-05-21 18:23:43 +00:00
|
|
|
|
Camera* Play_GetCamera(PlayState* this, s16 camId) {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
s16 camIdx = (camId == CAM_ID_NONE) ? this->activeCamId : camId;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
return this->cameraPtrs[camIdx];
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-12-17 21:07:31 +00:00
|
|
|
|
s32 Play_SetCameraAtEye(PlayState* this, s16 camId, Vec3f* at, Vec3f* eye) {
|
|
|
|
|
s32 successBits = 0;
|
2022-05-17 22:41:50 +00:00
|
|
|
|
s16 camIdx = (camId == CAM_ID_NONE) ? this->activeCamId : camId;
|
|
|
|
|
Camera* camera = this->cameraPtrs[camIdx];
|
2020-04-16 21:36:12 +00:00
|
|
|
|
Player* player;
|
|
|
|
|
|
2022-12-17 21:07:31 +00:00
|
|
|
|
successBits |= Camera_SetViewParam(camera, CAM_VIEW_AT, at);
|
|
|
|
|
successBits <<= 1;
|
|
|
|
|
successBits |= Camera_SetViewParam(camera, CAM_VIEW_EYE, eye);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
decompile z_camera (#398)
* cleanup
* name camera action functions
* decompile a few small functions, name a few Camera struct members
* decompile camera data, decompile a few camera functions
* Split ASM for code_800BB0A0
* removing code_800BB0A0.s
* PR Requests, Camera WIP
* remove #define NON_MATCHING from db_camera
* rename code_8007BF90.c to z_olib.c, rename functions in z_olib.c
* camera wip
* rename some struct memebers, some decomp wip
* pr updates
* camera wip
* name some fields in Camera Struct, being making sense of Camera_Update
* Camera WIP
* wip
* wip
* add z64camera.h header, begin creating CameraSetting macros
* wip
* wip
* wip
* wip
* migrate camera bss to c
* match a couple functions in db_camera
* match some small db_camera functions
* wip
* migrate db_camera rodata, match a few functions
* remote db_camera.rodata.s
* match some of db_camera
* identify types of some unknown data pieces
* some small wip
* Match Camera_Init, some function changes, some struct name changes. Change unk_C0 and unk_CC to floats from Vec3fs
* add naming for a few more Camera struct members
* wip
* match func_80043F94
* Match Camera_Jump1
* document some of Camera_Jump1
* wip
* match Camera_Jump3
* Match Camera_Update, FeelsAmazing
* wip
* wip
* match Camera_SetParam
* minor cleanup
* wip
* wip
* match Camera_KeepOn0
* some documentation, modify some matching functions to match style of others.
* match Camera_Demo1
* match camera_demo9
* document Camera_Demo1 and Camera_Demo9
* wip
* Match camera_battle4
* match camera_unique2
* Match Camera_Unique3
* match camera_special6
* match Camera_Special5
* wip
* document camera_special6
* naming updates
* match camera_Unique1
* match Camera_Unique0
* wip
* Match Camera_CalcUpFromPitchYawRoll
* match func_80045508
* document Camera_Battle4
* document several camera functions, move camera data to separate file
* rename phi/theta to pitch/yaw
* wip
* uniq9 wip
* Camera_Unqiue9 OK
* document Camera_Unique9
* name unk_160 in camera struct
* wip
* wip
* minor updates
* fix conflicts
* wip
* wip
* Olib updates
* wip
* wip
* rename most Math3D functions, few matches, documentation
* wip
* document most of math3d
* wip
* wip
* wip
* pr updates
* Match Camera_Fixed4
* match func_80058E8C
* pr updates
* add missing comment block finalizer
* Merge math3dupdates
* match Camera_ChangeSetting
* Match Camera_ChangeMode
* match func_80058148
* Match Camera_Special9
* decompile the rest of camera data
* match Camera_Demo5
* name a few camera functions in z_play
* match func_80046CB4, some work on other fucntions
* wip
* impove some non matchings
* fix function rename
* match func_800588B4
* match Camera_Subj4
* wip
* Camera_Demo3 matching, Camera_Battle1 big progress
* Camera_Normal2 OK
* wip
* match Camera_Parallel1
* normalize some things across functions
* match Camera_Normal1
* Match Camera_Normal3
* some cleanup
* more cleanup
* more cleanup , match Camera_CalcDefaultPitch
* data formatting
* Match Camera_Jump2
* document Camera_Jump2
* Match Camera_KeepOn3
* document some of Camera_KeepOn3
* improve some non_matchings
* match func_80045C74 and func_800460A8
* code cleanup, documentation
* match Camera_KeepOn1
* Match Camera_Subj3
* Match Camera_Battle1
* remove non_matching from func_80044adc and func_80046e20
* name several members of Battle1
* more documentation on Battle1
* cleanup
* renaming Camera_Vec3fScaleXYZFactor to Camera_Vec3fTranslateByUnitVector
* reorganize update structs, remove final references to params, remove CameraParams union
* implement camera enums into player
* Renaming Camera_GetDir to Camera_GetInputDir, Camera_GetRealDir to Camera_GetCamDir, etc, implement camera enum's into player
* remove non-global camera variables from variables.h
* clean up some variable declarations
* finish pr comment updates
* fix some warnings
* data formatting
* finish commenting on data
* delete unused asm
* remove asm
Co-authored-by: fig <fig02srl@gmail.com>
2020-12-06 22:39:47 +00:00
|
|
|
|
camera->dist = Math3D_Vec3f_DistXYZ(at, eye);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
|
|
|
|
player = camera->player;
|
|
|
|
|
if (player != NULL) {
|
2022-12-26 19:45:20 +00:00
|
|
|
|
camera->playerToAtOffset.x = at->x - player->actor.world.pos.x;
|
|
|
|
|
camera->playerToAtOffset.y = at->y - player->actor.world.pos.y;
|
|
|
|
|
camera->playerToAtOffset.z = at->z - player->actor.world.pos.z;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
} else {
|
2022-12-26 19:45:20 +00:00
|
|
|
|
camera->playerToAtOffset.x = camera->playerToAtOffset.y = camera->playerToAtOffset.z = 0.0f;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
decompile z_camera (#398)
* cleanup
* name camera action functions
* decompile a few small functions, name a few Camera struct members
* decompile camera data, decompile a few camera functions
* Split ASM for code_800BB0A0
* removing code_800BB0A0.s
* PR Requests, Camera WIP
* remove #define NON_MATCHING from db_camera
* rename code_8007BF90.c to z_olib.c, rename functions in z_olib.c
* camera wip
* rename some struct memebers, some decomp wip
* pr updates
* camera wip
* name some fields in Camera Struct, being making sense of Camera_Update
* Camera WIP
* wip
* wip
* add z64camera.h header, begin creating CameraSetting macros
* wip
* wip
* wip
* wip
* migrate camera bss to c
* match a couple functions in db_camera
* match some small db_camera functions
* wip
* migrate db_camera rodata, match a few functions
* remote db_camera.rodata.s
* match some of db_camera
* identify types of some unknown data pieces
* some small wip
* Match Camera_Init, some function changes, some struct name changes. Change unk_C0 and unk_CC to floats from Vec3fs
* add naming for a few more Camera struct members
* wip
* match func_80043F94
* Match Camera_Jump1
* document some of Camera_Jump1
* wip
* match Camera_Jump3
* Match Camera_Update, FeelsAmazing
* wip
* wip
* match Camera_SetParam
* minor cleanup
* wip
* wip
* match Camera_KeepOn0
* some documentation, modify some matching functions to match style of others.
* match Camera_Demo1
* match camera_demo9
* document Camera_Demo1 and Camera_Demo9
* wip
* Match camera_battle4
* match camera_unique2
* Match Camera_Unique3
* match camera_special6
* match Camera_Special5
* wip
* document camera_special6
* naming updates
* match camera_Unique1
* match Camera_Unique0
* wip
* Match Camera_CalcUpFromPitchYawRoll
* match func_80045508
* document Camera_Battle4
* document several camera functions, move camera data to separate file
* rename phi/theta to pitch/yaw
* wip
* uniq9 wip
* Camera_Unqiue9 OK
* document Camera_Unique9
* name unk_160 in camera struct
* wip
* wip
* minor updates
* fix conflicts
* wip
* wip
* Olib updates
* wip
* wip
* rename most Math3D functions, few matches, documentation
* wip
* document most of math3d
* wip
* wip
* wip
* pr updates
* Match Camera_Fixed4
* match func_80058E8C
* pr updates
* add missing comment block finalizer
* Merge math3dupdates
* match Camera_ChangeSetting
* Match Camera_ChangeMode
* match func_80058148
* Match Camera_Special9
* decompile the rest of camera data
* match Camera_Demo5
* name a few camera functions in z_play
* match func_80046CB4, some work on other fucntions
* wip
* impove some non matchings
* fix function rename
* match func_800588B4
* match Camera_Subj4
* wip
* Camera_Demo3 matching, Camera_Battle1 big progress
* Camera_Normal2 OK
* wip
* match Camera_Parallel1
* normalize some things across functions
* match Camera_Normal1
* Match Camera_Normal3
* some cleanup
* more cleanup
* more cleanup , match Camera_CalcDefaultPitch
* data formatting
* Match Camera_Jump2
* document Camera_Jump2
* Match Camera_KeepOn3
* document some of Camera_KeepOn3
* improve some non_matchings
* match func_80045C74 and func_800460A8
* code cleanup, documentation
* match Camera_KeepOn1
* Match Camera_Subj3
* Match Camera_Battle1
* remove non_matching from func_80044adc and func_80046e20
* name several members of Battle1
* more documentation on Battle1
* cleanup
* renaming Camera_Vec3fScaleXYZFactor to Camera_Vec3fTranslateByUnitVector
* reorganize update structs, remove final references to params, remove CameraParams union
* implement camera enums into player
* Renaming Camera_GetDir to Camera_GetInputDir, Camera_GetRealDir to Camera_GetCamDir, etc, implement camera enum's into player
* remove non-global camera variables from variables.h
* clean up some variable declarations
* finish pr comment updates
* fix some warnings
* data formatting
* finish commenting on data
* delete unused asm
* remove asm
Co-authored-by: fig <fig02srl@gmail.com>
2020-12-06 22:39:47 +00:00
|
|
|
|
camera->atLERPStepScale = 0.01f;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-12-17 21:07:31 +00:00
|
|
|
|
return successBits;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-12-17 21:07:31 +00:00
|
|
|
|
s32 Play_SetCameraAtEyeUp(PlayState* this, s16 camId, Vec3f* at, Vec3f* eye, Vec3f* up) {
|
|
|
|
|
s32 successBits = 0;
|
2022-05-17 22:41:50 +00:00
|
|
|
|
s16 camIdx = (camId == CAM_ID_NONE) ? this->activeCamId : camId;
|
|
|
|
|
Camera* camera = this->cameraPtrs[camIdx];
|
2020-04-16 21:36:12 +00:00
|
|
|
|
Player* player;
|
|
|
|
|
|
2022-12-17 21:07:31 +00:00
|
|
|
|
successBits |= Camera_SetViewParam(camera, CAM_VIEW_AT, at);
|
|
|
|
|
successBits <<= 1;
|
|
|
|
|
successBits |= Camera_SetViewParam(camera, CAM_VIEW_EYE, eye);
|
|
|
|
|
successBits <<= 1;
|
|
|
|
|
successBits |= Camera_SetViewParam(camera, CAM_VIEW_UP, up);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
decompile z_camera (#398)
* cleanup
* name camera action functions
* decompile a few small functions, name a few Camera struct members
* decompile camera data, decompile a few camera functions
* Split ASM for code_800BB0A0
* removing code_800BB0A0.s
* PR Requests, Camera WIP
* remove #define NON_MATCHING from db_camera
* rename code_8007BF90.c to z_olib.c, rename functions in z_olib.c
* camera wip
* rename some struct memebers, some decomp wip
* pr updates
* camera wip
* name some fields in Camera Struct, being making sense of Camera_Update
* Camera WIP
* wip
* wip
* add z64camera.h header, begin creating CameraSetting macros
* wip
* wip
* wip
* wip
* migrate camera bss to c
* match a couple functions in db_camera
* match some small db_camera functions
* wip
* migrate db_camera rodata, match a few functions
* remote db_camera.rodata.s
* match some of db_camera
* identify types of some unknown data pieces
* some small wip
* Match Camera_Init, some function changes, some struct name changes. Change unk_C0 and unk_CC to floats from Vec3fs
* add naming for a few more Camera struct members
* wip
* match func_80043F94
* Match Camera_Jump1
* document some of Camera_Jump1
* wip
* match Camera_Jump3
* Match Camera_Update, FeelsAmazing
* wip
* wip
* match Camera_SetParam
* minor cleanup
* wip
* wip
* match Camera_KeepOn0
* some documentation, modify some matching functions to match style of others.
* match Camera_Demo1
* match camera_demo9
* document Camera_Demo1 and Camera_Demo9
* wip
* Match camera_battle4
* match camera_unique2
* Match Camera_Unique3
* match camera_special6
* match Camera_Special5
* wip
* document camera_special6
* naming updates
* match camera_Unique1
* match Camera_Unique0
* wip
* Match Camera_CalcUpFromPitchYawRoll
* match func_80045508
* document Camera_Battle4
* document several camera functions, move camera data to separate file
* rename phi/theta to pitch/yaw
* wip
* uniq9 wip
* Camera_Unqiue9 OK
* document Camera_Unique9
* name unk_160 in camera struct
* wip
* wip
* minor updates
* fix conflicts
* wip
* wip
* Olib updates
* wip
* wip
* rename most Math3D functions, few matches, documentation
* wip
* document most of math3d
* wip
* wip
* wip
* pr updates
* Match Camera_Fixed4
* match func_80058E8C
* pr updates
* add missing comment block finalizer
* Merge math3dupdates
* match Camera_ChangeSetting
* Match Camera_ChangeMode
* match func_80058148
* Match Camera_Special9
* decompile the rest of camera data
* match Camera_Demo5
* name a few camera functions in z_play
* match func_80046CB4, some work on other fucntions
* wip
* impove some non matchings
* fix function rename
* match func_800588B4
* match Camera_Subj4
* wip
* Camera_Demo3 matching, Camera_Battle1 big progress
* Camera_Normal2 OK
* wip
* match Camera_Parallel1
* normalize some things across functions
* match Camera_Normal1
* Match Camera_Normal3
* some cleanup
* more cleanup
* more cleanup , match Camera_CalcDefaultPitch
* data formatting
* Match Camera_Jump2
* document Camera_Jump2
* Match Camera_KeepOn3
* document some of Camera_KeepOn3
* improve some non_matchings
* match func_80045C74 and func_800460A8
* code cleanup, documentation
* match Camera_KeepOn1
* Match Camera_Subj3
* Match Camera_Battle1
* remove non_matching from func_80044adc and func_80046e20
* name several members of Battle1
* more documentation on Battle1
* cleanup
* renaming Camera_Vec3fScaleXYZFactor to Camera_Vec3fTranslateByUnitVector
* reorganize update structs, remove final references to params, remove CameraParams union
* implement camera enums into player
* Renaming Camera_GetDir to Camera_GetInputDir, Camera_GetRealDir to Camera_GetCamDir, etc, implement camera enum's into player
* remove non-global camera variables from variables.h
* clean up some variable declarations
* finish pr comment updates
* fix some warnings
* data formatting
* finish commenting on data
* delete unused asm
* remove asm
Co-authored-by: fig <fig02srl@gmail.com>
2020-12-06 22:39:47 +00:00
|
|
|
|
camera->dist = Math3D_Vec3f_DistXYZ(at, eye);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
|
|
|
|
player = camera->player;
|
|
|
|
|
if (player != NULL) {
|
2022-12-26 19:45:20 +00:00
|
|
|
|
camera->playerToAtOffset.x = at->x - player->actor.world.pos.x;
|
|
|
|
|
camera->playerToAtOffset.y = at->y - player->actor.world.pos.y;
|
|
|
|
|
camera->playerToAtOffset.z = at->z - player->actor.world.pos.z;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
} else {
|
2022-12-26 19:45:20 +00:00
|
|
|
|
camera->playerToAtOffset.x = camera->playerToAtOffset.y = camera->playerToAtOffset.z = 0.0f;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
decompile z_camera (#398)
* cleanup
* name camera action functions
* decompile a few small functions, name a few Camera struct members
* decompile camera data, decompile a few camera functions
* Split ASM for code_800BB0A0
* removing code_800BB0A0.s
* PR Requests, Camera WIP
* remove #define NON_MATCHING from db_camera
* rename code_8007BF90.c to z_olib.c, rename functions in z_olib.c
* camera wip
* rename some struct memebers, some decomp wip
* pr updates
* camera wip
* name some fields in Camera Struct, being making sense of Camera_Update
* Camera WIP
* wip
* wip
* add z64camera.h header, begin creating CameraSetting macros
* wip
* wip
* wip
* wip
* migrate camera bss to c
* match a couple functions in db_camera
* match some small db_camera functions
* wip
* migrate db_camera rodata, match a few functions
* remote db_camera.rodata.s
* match some of db_camera
* identify types of some unknown data pieces
* some small wip
* Match Camera_Init, some function changes, some struct name changes. Change unk_C0 and unk_CC to floats from Vec3fs
* add naming for a few more Camera struct members
* wip
* match func_80043F94
* Match Camera_Jump1
* document some of Camera_Jump1
* wip
* match Camera_Jump3
* Match Camera_Update, FeelsAmazing
* wip
* wip
* match Camera_SetParam
* minor cleanup
* wip
* wip
* match Camera_KeepOn0
* some documentation, modify some matching functions to match style of others.
* match Camera_Demo1
* match camera_demo9
* document Camera_Demo1 and Camera_Demo9
* wip
* Match camera_battle4
* match camera_unique2
* Match Camera_Unique3
* match camera_special6
* match Camera_Special5
* wip
* document camera_special6
* naming updates
* match camera_Unique1
* match Camera_Unique0
* wip
* Match Camera_CalcUpFromPitchYawRoll
* match func_80045508
* document Camera_Battle4
* document several camera functions, move camera data to separate file
* rename phi/theta to pitch/yaw
* wip
* uniq9 wip
* Camera_Unqiue9 OK
* document Camera_Unique9
* name unk_160 in camera struct
* wip
* wip
* minor updates
* fix conflicts
* wip
* wip
* Olib updates
* wip
* wip
* rename most Math3D functions, few matches, documentation
* wip
* document most of math3d
* wip
* wip
* wip
* pr updates
* Match Camera_Fixed4
* match func_80058E8C
* pr updates
* add missing comment block finalizer
* Merge math3dupdates
* match Camera_ChangeSetting
* Match Camera_ChangeMode
* match func_80058148
* Match Camera_Special9
* decompile the rest of camera data
* match Camera_Demo5
* name a few camera functions in z_play
* match func_80046CB4, some work on other fucntions
* wip
* impove some non matchings
* fix function rename
* match func_800588B4
* match Camera_Subj4
* wip
* Camera_Demo3 matching, Camera_Battle1 big progress
* Camera_Normal2 OK
* wip
* match Camera_Parallel1
* normalize some things across functions
* match Camera_Normal1
* Match Camera_Normal3
* some cleanup
* more cleanup
* more cleanup , match Camera_CalcDefaultPitch
* data formatting
* Match Camera_Jump2
* document Camera_Jump2
* Match Camera_KeepOn3
* document some of Camera_KeepOn3
* improve some non_matchings
* match func_80045C74 and func_800460A8
* code cleanup, documentation
* match Camera_KeepOn1
* Match Camera_Subj3
* Match Camera_Battle1
* remove non_matching from func_80044adc and func_80046e20
* name several members of Battle1
* more documentation on Battle1
* cleanup
* renaming Camera_Vec3fScaleXYZFactor to Camera_Vec3fTranslateByUnitVector
* reorganize update structs, remove final references to params, remove CameraParams union
* implement camera enums into player
* Renaming Camera_GetDir to Camera_GetInputDir, Camera_GetRealDir to Camera_GetCamDir, etc, implement camera enum's into player
* remove non-global camera variables from variables.h
* clean up some variable declarations
* finish pr comment updates
* fix some warnings
* data formatting
* finish commenting on data
* delete unused asm
* remove asm
Co-authored-by: fig <fig02srl@gmail.com>
2020-12-06 22:39:47 +00:00
|
|
|
|
camera->atLERPStepScale = 0.01f;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-12-17 21:07:31 +00:00
|
|
|
|
return successBits;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
2022-12-17 21:07:31 +00:00
|
|
|
|
s32 Play_SetCameraFov(PlayState* this, s16 camId, f32 fov) {
|
|
|
|
|
s32 successBits = Camera_SetViewParam(this->cameraPtrs[camId], CAM_VIEW_FOV, &fov) & 1;
|
2021-11-30 23:40:42 +00:00
|
|
|
|
|
2020-08-15 17:23:29 +00:00
|
|
|
|
if (1) {}
|
2022-12-17 21:07:31 +00:00
|
|
|
|
return successBits;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-05-21 18:23:43 +00:00
|
|
|
|
s32 Play_SetCameraRoll(PlayState* this, s16 camId, s16 roll) {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
s16 camIdx = (camId == CAM_ID_NONE) ? this->activeCamId : camId;
|
|
|
|
|
Camera* camera = this->cameraPtrs[camIdx];
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
decompile z_camera (#398)
* cleanup
* name camera action functions
* decompile a few small functions, name a few Camera struct members
* decompile camera data, decompile a few camera functions
* Split ASM for code_800BB0A0
* removing code_800BB0A0.s
* PR Requests, Camera WIP
* remove #define NON_MATCHING from db_camera
* rename code_8007BF90.c to z_olib.c, rename functions in z_olib.c
* camera wip
* rename some struct memebers, some decomp wip
* pr updates
* camera wip
* name some fields in Camera Struct, being making sense of Camera_Update
* Camera WIP
* wip
* wip
* add z64camera.h header, begin creating CameraSetting macros
* wip
* wip
* wip
* wip
* migrate camera bss to c
* match a couple functions in db_camera
* match some small db_camera functions
* wip
* migrate db_camera rodata, match a few functions
* remote db_camera.rodata.s
* match some of db_camera
* identify types of some unknown data pieces
* some small wip
* Match Camera_Init, some function changes, some struct name changes. Change unk_C0 and unk_CC to floats from Vec3fs
* add naming for a few more Camera struct members
* wip
* match func_80043F94
* Match Camera_Jump1
* document some of Camera_Jump1
* wip
* match Camera_Jump3
* Match Camera_Update, FeelsAmazing
* wip
* wip
* match Camera_SetParam
* minor cleanup
* wip
* wip
* match Camera_KeepOn0
* some documentation, modify some matching functions to match style of others.
* match Camera_Demo1
* match camera_demo9
* document Camera_Demo1 and Camera_Demo9
* wip
* Match camera_battle4
* match camera_unique2
* Match Camera_Unique3
* match camera_special6
* match Camera_Special5
* wip
* document camera_special6
* naming updates
* match camera_Unique1
* match Camera_Unique0
* wip
* Match Camera_CalcUpFromPitchYawRoll
* match func_80045508
* document Camera_Battle4
* document several camera functions, move camera data to separate file
* rename phi/theta to pitch/yaw
* wip
* uniq9 wip
* Camera_Unqiue9 OK
* document Camera_Unique9
* name unk_160 in camera struct
* wip
* wip
* minor updates
* fix conflicts
* wip
* wip
* Olib updates
* wip
* wip
* rename most Math3D functions, few matches, documentation
* wip
* document most of math3d
* wip
* wip
* wip
* pr updates
* Match Camera_Fixed4
* match func_80058E8C
* pr updates
* add missing comment block finalizer
* Merge math3dupdates
* match Camera_ChangeSetting
* Match Camera_ChangeMode
* match func_80058148
* Match Camera_Special9
* decompile the rest of camera data
* match Camera_Demo5
* name a few camera functions in z_play
* match func_80046CB4, some work on other fucntions
* wip
* impove some non matchings
* fix function rename
* match func_800588B4
* match Camera_Subj4
* wip
* Camera_Demo3 matching, Camera_Battle1 big progress
* Camera_Normal2 OK
* wip
* match Camera_Parallel1
* normalize some things across functions
* match Camera_Normal1
* Match Camera_Normal3
* some cleanup
* more cleanup
* more cleanup , match Camera_CalcDefaultPitch
* data formatting
* Match Camera_Jump2
* document Camera_Jump2
* Match Camera_KeepOn3
* document some of Camera_KeepOn3
* improve some non_matchings
* match func_80045C74 and func_800460A8
* code cleanup, documentation
* match Camera_KeepOn1
* Match Camera_Subj3
* Match Camera_Battle1
* remove non_matching from func_80044adc and func_80046e20
* name several members of Battle1
* more documentation on Battle1
* cleanup
* renaming Camera_Vec3fScaleXYZFactor to Camera_Vec3fTranslateByUnitVector
* reorganize update structs, remove final references to params, remove CameraParams union
* implement camera enums into player
* Renaming Camera_GetDir to Camera_GetInputDir, Camera_GetRealDir to Camera_GetCamDir, etc, implement camera enum's into player
* remove non-global camera variables from variables.h
* clean up some variable declarations
* finish pr comment updates
* fix some warnings
* data formatting
* finish commenting on data
* delete unused asm
* remove asm
Co-authored-by: fig <fig02srl@gmail.com>
2020-12-06 22:39:47 +00:00
|
|
|
|
camera->roll = roll;
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
2020-04-16 21:36:12 +00:00
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-21 18:23:43 +00:00
|
|
|
|
void Play_CopyCamera(PlayState* this, s16 destCamId, s16 srcCamId) {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
s16 srcCamId2 = (srcCamId == CAM_ID_NONE) ? this->activeCamId : srcCamId;
|
|
|
|
|
s16 destCamId1 = (destCamId == CAM_ID_NONE) ? this->activeCamId : destCamId;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Camera_Copy(this->cameraPtrs[destCamId1], this->cameraPtrs[srcCamId2]);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-12-17 21:07:31 +00:00
|
|
|
|
/**
|
|
|
|
|
* Initializes camera data centered around Player, and applies the requested setting.
|
|
|
|
|
*/
|
|
|
|
|
s32 Play_InitCameraDataUsingPlayer(PlayState* this, s16 camId, Player* player, s16 setting) {
|
2020-04-16 21:36:12 +00:00
|
|
|
|
Camera* camera;
|
2022-05-17 22:41:50 +00:00
|
|
|
|
s16 camIdx = (camId == CAM_ID_NONE) ? this->activeCamId : camId;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
camera = this->cameraPtrs[camIdx];
|
2022-12-17 21:07:31 +00:00
|
|
|
|
Camera_InitDataUsingPlayer(camera, player);
|
decompile z_camera (#398)
* cleanup
* name camera action functions
* decompile a few small functions, name a few Camera struct members
* decompile camera data, decompile a few camera functions
* Split ASM for code_800BB0A0
* removing code_800BB0A0.s
* PR Requests, Camera WIP
* remove #define NON_MATCHING from db_camera
* rename code_8007BF90.c to z_olib.c, rename functions in z_olib.c
* camera wip
* rename some struct memebers, some decomp wip
* pr updates
* camera wip
* name some fields in Camera Struct, being making sense of Camera_Update
* Camera WIP
* wip
* wip
* add z64camera.h header, begin creating CameraSetting macros
* wip
* wip
* wip
* wip
* migrate camera bss to c
* match a couple functions in db_camera
* match some small db_camera functions
* wip
* migrate db_camera rodata, match a few functions
* remote db_camera.rodata.s
* match some of db_camera
* identify types of some unknown data pieces
* some small wip
* Match Camera_Init, some function changes, some struct name changes. Change unk_C0 and unk_CC to floats from Vec3fs
* add naming for a few more Camera struct members
* wip
* match func_80043F94
* Match Camera_Jump1
* document some of Camera_Jump1
* wip
* match Camera_Jump3
* Match Camera_Update, FeelsAmazing
* wip
* wip
* match Camera_SetParam
* minor cleanup
* wip
* wip
* match Camera_KeepOn0
* some documentation, modify some matching functions to match style of others.
* match Camera_Demo1
* match camera_demo9
* document Camera_Demo1 and Camera_Demo9
* wip
* Match camera_battle4
* match camera_unique2
* Match Camera_Unique3
* match camera_special6
* match Camera_Special5
* wip
* document camera_special6
* naming updates
* match camera_Unique1
* match Camera_Unique0
* wip
* Match Camera_CalcUpFromPitchYawRoll
* match func_80045508
* document Camera_Battle4
* document several camera functions, move camera data to separate file
* rename phi/theta to pitch/yaw
* wip
* uniq9 wip
* Camera_Unqiue9 OK
* document Camera_Unique9
* name unk_160 in camera struct
* wip
* wip
* minor updates
* fix conflicts
* wip
* wip
* Olib updates
* wip
* wip
* rename most Math3D functions, few matches, documentation
* wip
* document most of math3d
* wip
* wip
* wip
* pr updates
* Match Camera_Fixed4
* match func_80058E8C
* pr updates
* add missing comment block finalizer
* Merge math3dupdates
* match Camera_ChangeSetting
* Match Camera_ChangeMode
* match func_80058148
* Match Camera_Special9
* decompile the rest of camera data
* match Camera_Demo5
* name a few camera functions in z_play
* match func_80046CB4, some work on other fucntions
* wip
* impove some non matchings
* fix function rename
* match func_800588B4
* match Camera_Subj4
* wip
* Camera_Demo3 matching, Camera_Battle1 big progress
* Camera_Normal2 OK
* wip
* match Camera_Parallel1
* normalize some things across functions
* match Camera_Normal1
* Match Camera_Normal3
* some cleanup
* more cleanup
* more cleanup , match Camera_CalcDefaultPitch
* data formatting
* Match Camera_Jump2
* document Camera_Jump2
* Match Camera_KeepOn3
* document some of Camera_KeepOn3
* improve some non_matchings
* match func_80045C74 and func_800460A8
* code cleanup, documentation
* match Camera_KeepOn1
* Match Camera_Subj3
* Match Camera_Battle1
* remove non_matching from func_80044adc and func_80046e20
* name several members of Battle1
* more documentation on Battle1
* cleanup
* renaming Camera_Vec3fScaleXYZFactor to Camera_Vec3fTranslateByUnitVector
* reorganize update structs, remove final references to params, remove CameraParams union
* implement camera enums into player
* Renaming Camera_GetDir to Camera_GetInputDir, Camera_GetRealDir to Camera_GetCamDir, etc, implement camera enum's into player
* remove non-global camera variables from variables.h
* clean up some variable declarations
* finish pr comment updates
* fix some warnings
* data formatting
* finish commenting on data
* delete unused asm
* remove asm
Co-authored-by: fig <fig02srl@gmail.com>
2020-12-06 22:39:47 +00:00
|
|
|
|
return Camera_ChangeSetting(camera, setting);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-12-17 21:07:31 +00:00
|
|
|
|
s32 Play_ChangeCameraSetting(PlayState* this, s16 camId, s16 setting) {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
return Camera_ChangeSetting(Play_GetCamera(this, camId), setting);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-12-17 21:07:31 +00:00
|
|
|
|
/**
|
|
|
|
|
* Smoothly return control from a sub camera to the main camera by moving the subCamera's eye, at, fov through
|
|
|
|
|
* interpolation from the initial subCam viewParams to the target mainCam viewParams over `duration`.
|
|
|
|
|
* Setting the `duration` to 0 or less will instantly return control to the main camera.
|
|
|
|
|
* This will also clear every sub camera.
|
|
|
|
|
*/
|
|
|
|
|
void Play_ReturnToMainCam(PlayState* this, s16 camId, s16 duration) {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
s16 camIdx = (camId == CAM_ID_NONE) ? this->activeCamId : camId;
|
2022-12-17 21:07:31 +00:00
|
|
|
|
s16 subCamId;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Play_ClearCamera(this, camIdx);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-12-17 21:07:31 +00:00
|
|
|
|
for (subCamId = CAM_ID_SUB_FIRST; subCamId < NUM_CAMS; subCamId++) {
|
|
|
|
|
if (this->cameraPtrs[subCamId] != NULL) {
|
2020-04-16 21:36:12 +00:00
|
|
|
|
osSyncPrintf(
|
|
|
|
|
VT_COL(RED, WHITE) "camera control: error: return to main, other camera left. %d cleared!!\n" VT_RST,
|
2022-12-17 21:07:31 +00:00
|
|
|
|
subCamId);
|
|
|
|
|
Play_ClearCamera(this, subCamId);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-12-17 21:07:31 +00:00
|
|
|
|
if (duration <= 0) {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Play_ChangeCameraStatus(this, CAM_ID_MAIN, CAM_STAT_ACTIVE);
|
|
|
|
|
this->cameraPtrs[CAM_ID_MAIN]->childCamId = this->cameraPtrs[CAM_ID_MAIN]->parentCamId = CAM_ID_MAIN;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
} else {
|
2022-12-17 21:07:31 +00:00
|
|
|
|
OnePointCutscene_Init(this, 1020, duration, NULL, CAM_ID_MAIN);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-12-17 21:07:31 +00:00
|
|
|
|
s16 Play_GetCameraUID(PlayState* this, s16 camId) {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Camera* camera = this->cameraPtrs[camId];
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
|
|
|
|
if (camera != NULL) {
|
2020-04-30 14:49:11 +00:00
|
|
|
|
return camera->uid;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
} else {
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-12-17 21:07:31 +00:00
|
|
|
|
// Unused, purpose is unclear (also unused and unclear in MM)
|
|
|
|
|
s16 func_800C09D8(PlayState* this, s16 camId, s16 uid) {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Camera* camera = this->cameraPtrs[camId];
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
2020-04-16 21:36:12 +00:00
|
|
|
|
if (camera != NULL) {
|
|
|
|
|
return 0;
|
2022-12-17 21:07:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//! @bug this code is only reached if `camera` is NULL.
|
|
|
|
|
if (camera->uid != uid) {
|
2020-04-16 21:36:12 +00:00
|
|
|
|
return 0;
|
2021-03-31 16:18:31 +00:00
|
|
|
|
} else if (camera->status != CAM_STAT_ACTIVE) {
|
2020-04-16 21:36:12 +00:00
|
|
|
|
return 2;
|
|
|
|
|
} else {
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
2022-05-21 18:23:43 +00:00
|
|
|
|
void Play_SaveSceneFlags(PlayState* this) {
|
2023-08-13 19:24:26 +00:00
|
|
|
|
SavedSceneFlags* savedSceneFlags = &gSaveContext.save.info.sceneFlags[this->sceneId];
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
savedSceneFlags->chest = this->actorCtx.flags.chest;
|
|
|
|
|
savedSceneFlags->swch = this->actorCtx.flags.swch;
|
|
|
|
|
savedSceneFlags->clear = this->actorCtx.flags.clear;
|
|
|
|
|
savedSceneFlags->collect = this->actorCtx.flags.collect;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
2022-05-21 18:23:43 +00:00
|
|
|
|
void Play_SetRespawnData(PlayState* this, s32 respawnMode, s16 entranceIndex, s32 roomIndex, s32 playerParams,
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Vec3f* pos, s16 yaw) {
|
2020-04-16 21:36:12 +00:00
|
|
|
|
RespawnData* respawnData = &gSaveContext.respawn[respawnMode];
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
2020-04-16 21:36:12 +00:00
|
|
|
|
respawnData->entranceIndex = entranceIndex;
|
|
|
|
|
respawnData->roomIndex = roomIndex;
|
|
|
|
|
respawnData->pos = *pos;
|
|
|
|
|
respawnData->yaw = yaw;
|
|
|
|
|
respawnData->playerParams = playerParams;
|
2022-05-17 22:41:50 +00:00
|
|
|
|
respawnData->tempSwchFlags = this->actorCtx.flags.tempSwch;
|
|
|
|
|
respawnData->tempCollectFlags = this->actorCtx.flags.tempCollect;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
2022-05-21 18:23:43 +00:00
|
|
|
|
void Play_SetupRespawnPoint(PlayState* this, s32 respawnMode, s32 playerParams) {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Player* player = GET_PLAYER(this);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
s32 entranceIndex;
|
|
|
|
|
s8 roomIndex;
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
2022-11-26 21:15:41 +00:00
|
|
|
|
if ((this->sceneId != SCENE_FAIRYS_FOUNTAIN) && (this->sceneId != SCENE_GROTTOS)) {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
roomIndex = this->roomCtx.curRoom.num;
|
2023-08-13 19:24:26 +00:00
|
|
|
|
entranceIndex = gSaveContext.save.entranceIndex;
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Play_SetRespawnData(this, respawnMode, entranceIndex, roomIndex, playerParams, &player->actor.world.pos,
|
|
|
|
|
player->actor.shape.rot.y);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
2022-05-21 18:23:43 +00:00
|
|
|
|
void Play_TriggerVoidOut(PlayState* this) {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
gSaveContext.respawn[RESPAWN_MODE_DOWN].tempSwchFlags = this->actorCtx.flags.tempSwch;
|
|
|
|
|
gSaveContext.respawn[RESPAWN_MODE_DOWN].tempCollectFlags = this->actorCtx.flags.tempCollect;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
gSaveContext.respawnFlag = 1;
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->transitionTrigger = TRANS_TRIGGER_START;
|
|
|
|
|
this->nextEntranceIndex = gSaveContext.respawn[RESPAWN_MODE_DOWN].entranceIndex;
|
|
|
|
|
this->transitionType = TRANS_TYPE_FADE_BLACK;
|
2020-03-17 04:31:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-05-21 18:23:43 +00:00
|
|
|
|
void Play_LoadToLastEntrance(PlayState* this) {
|
2020-04-16 21:36:12 +00:00
|
|
|
|
gSaveContext.respawnFlag = -1;
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->transitionTrigger = TRANS_TRIGGER_START;
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
2022-11-26 21:15:41 +00:00
|
|
|
|
if ((this->sceneId == SCENE_GANONS_TOWER_COLLAPSE_INTERIOR) ||
|
|
|
|
|
(this->sceneId == SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR) ||
|
|
|
|
|
(this->sceneId == SCENE_INSIDE_GANONS_CASTLE_COLLAPSE) || (this->sceneId == SCENE_GANON_BOSS)) {
|
|
|
|
|
this->nextEntranceIndex = ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_0;
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Item_Give(this, ITEM_SWORD_MASTER);
|
2023-08-13 19:24:26 +00:00
|
|
|
|
} else if ((gSaveContext.save.entranceIndex == ENTR_HYRULE_FIELD_11) ||
|
|
|
|
|
(gSaveContext.save.entranceIndex == ENTR_HYRULE_FIELD_12) ||
|
|
|
|
|
(gSaveContext.save.entranceIndex == ENTR_HYRULE_FIELD_13) ||
|
|
|
|
|
(gSaveContext.save.entranceIndex == ENTR_HYRULE_FIELD_15)) {
|
2022-11-26 21:15:41 +00:00
|
|
|
|
this->nextEntranceIndex = ENTR_HYRULE_FIELD_6;
|
2020-03-22 21:19:43 +00:00
|
|
|
|
} else {
|
2023-08-13 19:24:26 +00:00
|
|
|
|
this->nextEntranceIndex = gSaveContext.save.entranceIndex;
|
2020-03-17 04:31:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
this->transitionType = TRANS_TYPE_FADE_BLACK;
|
2020-03-17 04:31:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-05-21 18:23:43 +00:00
|
|
|
|
void Play_TriggerRespawn(PlayState* this) {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
Play_SetupRespawnPoint(this, RESPAWN_MODE_DOWN, 0xDFF);
|
|
|
|
|
Play_LoadToLastEntrance(this);
|
2020-03-17 04:31:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-06-21 00:31:53 +00:00
|
|
|
|
s32 Play_CamIsNotFixed(PlayState* this) {
|
|
|
|
|
// SCENE_CAM_TYPE_FIXED_SHOP_VIEWPOINT was probably intended to be in this condition,
|
2022-08-31 23:28:51 +00:00
|
|
|
|
// but the room shape type check handles all shop cases regardless
|
|
|
|
|
return (this->roomCtx.curRoom.roomShape->base.type != ROOM_SHAPE_TYPE_IMAGE) &&
|
2022-06-21 00:31:53 +00:00
|
|
|
|
(R_SCENE_CAM_TYPE != SCENE_CAM_TYPE_FIXED_TOGGLE_VIEWPOINT) && (R_SCENE_CAM_TYPE != SCENE_CAM_TYPE_FIXED) &&
|
2022-11-26 21:15:41 +00:00
|
|
|
|
(R_SCENE_CAM_TYPE != SCENE_CAM_TYPE_FIXED_MARKET) && (this->sceneId != SCENE_CASTLE_COURTYARD_GUARDS_DAY);
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
2022-05-21 18:23:43 +00:00
|
|
|
|
s32 FrameAdvance_IsEnabled(PlayState* this) {
|
2022-05-17 22:41:50 +00:00
|
|
|
|
return !!this->frameAdvCtx.enabled;
|
2020-03-17 04:31:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-05-21 18:23:43 +00:00
|
|
|
|
s32 func_800C0D34(PlayState* this, Actor* actor, s16* yaw) {
|
2020-04-16 21:36:12 +00:00
|
|
|
|
TransitionActorEntry* transitionActor;
|
2020-09-19 01:45:39 +00:00
|
|
|
|
s32 frontRoom;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2021-01-18 21:04:04 +00:00
|
|
|
|
if (actor->category != ACTORCAT_DOOR) {
|
2020-04-16 21:36:12 +00:00
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2022-07-31 00:57:44 +00:00
|
|
|
|
transitionActor = &this->transiActorCtx.list[GET_TRANSITION_ACTOR_INDEX(actor)];
|
2020-09-19 01:45:39 +00:00
|
|
|
|
frontRoom = transitionActor->sides[0].room;
|
2020-03-17 04:31:30 +00:00
|
|
|
|
|
2020-09-19 01:45:39 +00:00
|
|
|
|
if (frontRoom == transitionActor->sides[1].room) {
|
2020-04-16 21:36:12 +00:00
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2020-09-19 01:45:39 +00:00
|
|
|
|
if (frontRoom == actor->room) {
|
2020-04-16 21:36:12 +00:00
|
|
|
|
*yaw = actor->shape.rot.y;
|
|
|
|
|
} else {
|
|
|
|
|
*yaw = actor->shape.rot.y + 0x8000;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-21 18:23:43 +00:00
|
|
|
|
s32 func_800C0DB4(PlayState* this, Vec3f* pos) {
|
z_bgcheck.c, 800430A0.c, 80043480.c (#256)
* beginning of migrating changes
* got matching
* changed order a bit
* clean up bgcheck
* fix conflict
* fix conflict again
* first stab at identifying types, some oks
* Clean up most bad structs/pointer math, move relevant structs to z64bgcheck.h, get some OKs
* more OKs, z_bgcheck.bss migration, update some sys_math3d.c args
* couple more OKs
* pushing some OKs
* fix compilation issues
* code_800430A0.c OK, more files decomp'd
* 8003A3E0 big OK :)
* Decomp most of func_8003C614, decomp helper funcs
* Decomp SurfaceType, CamData, and WaterBox property related functions
* more OKs, big OK in 8003C078
* more OKs, more progress, move a function definition in z_collision_check to functions.h
* more clean-ups, more OKs, dyn_vtx is now defined as u8*
* 8003A5B8, 8003A7D8, 8003C614, 8003DD6C OK, document function args better
* data migrated, more OKs
* 80041240 OK, func_8003B3C8 and func_8003BB18 disassembled
* func_80040284, 800409A8 non_matching, add IS_ZERO macro
* All asm files have C representations, some big OKs, lots of minor tweaks
* More OKs, non-matching code cleanup
* 8003FBF4 and 80040BE4 OK, improve codegen for most functions
* format z_bgcheck.c
* fix warnings, compile errors on NON_MATCHING
* func_8003EE80 is now NON_MATCHING
* begin documenting some functions
* formatting
* more documentation, func_8003A95C OK
* fix PHYSICAL_TO_VIRTUAL changes
* fix var rename
* More documentation, functions 80040E40, 80041648 OK, change types to not be compatible with ZAP
* func_8004239C ok, more NON_MATCHING improvements, more documentation
* Implement most suggested changes
* Convert comments to slower comments
* /**
* Implement ZAP2 changes
* my anti-virus ate my format.sh results
* Rename a couple hundred functions, fix minor stuff
* rename var so that clang formats correctly
* run format.sh
* implement Petrie's matches/suggestions
* format
* matches
* and the asm
* slight error
* Add SSList
* two more matches
* stuff
* implement code changes
* clean up Petrie's matchings
Co-authored-by: Arthur <arthurtilly413@gmail.com>
Co-authored-by: fig02 <fig02srl@gmail.com>
Co-authored-by: petrie911 <pmontag@DESKTOP-LG8A167.localdomain>
2021-01-08 11:12:58 +00:00
|
|
|
|
WaterBox* waterBox;
|
|
|
|
|
CollisionPoly* poly;
|
|
|
|
|
Vec3f waterSurfacePos;
|
|
|
|
|
s32 bgId;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
z_bgcheck.c, 800430A0.c, 80043480.c (#256)
* beginning of migrating changes
* got matching
* changed order a bit
* clean up bgcheck
* fix conflict
* fix conflict again
* first stab at identifying types, some oks
* Clean up most bad structs/pointer math, move relevant structs to z64bgcheck.h, get some OKs
* more OKs, z_bgcheck.bss migration, update some sys_math3d.c args
* couple more OKs
* pushing some OKs
* fix compilation issues
* code_800430A0.c OK, more files decomp'd
* 8003A3E0 big OK :)
* Decomp most of func_8003C614, decomp helper funcs
* Decomp SurfaceType, CamData, and WaterBox property related functions
* more OKs, big OK in 8003C078
* more OKs, more progress, move a function definition in z_collision_check to functions.h
* more clean-ups, more OKs, dyn_vtx is now defined as u8*
* 8003A5B8, 8003A7D8, 8003C614, 8003DD6C OK, document function args better
* data migrated, more OKs
* 80041240 OK, func_8003B3C8 and func_8003BB18 disassembled
* func_80040284, 800409A8 non_matching, add IS_ZERO macro
* All asm files have C representations, some big OKs, lots of minor tweaks
* More OKs, non-matching code cleanup
* 8003FBF4 and 80040BE4 OK, improve codegen for most functions
* format z_bgcheck.c
* fix warnings, compile errors on NON_MATCHING
* func_8003EE80 is now NON_MATCHING
* begin documenting some functions
* formatting
* more documentation, func_8003A95C OK
* fix PHYSICAL_TO_VIRTUAL changes
* fix var rename
* More documentation, functions 80040E40, 80041648 OK, change types to not be compatible with ZAP
* func_8004239C ok, more NON_MATCHING improvements, more documentation
* Implement most suggested changes
* Convert comments to slower comments
* /**
* Implement ZAP2 changes
* my anti-virus ate my format.sh results
* Rename a couple hundred functions, fix minor stuff
* rename var so that clang formats correctly
* run format.sh
* implement Petrie's matches/suggestions
* format
* matches
* and the asm
* slight error
* Add SSList
* two more matches
* stuff
* implement code changes
* clean up Petrie's matchings
Co-authored-by: Arthur <arthurtilly413@gmail.com>
Co-authored-by: fig02 <fig02srl@gmail.com>
Co-authored-by: petrie911 <pmontag@DESKTOP-LG8A167.localdomain>
2021-01-08 11:12:58 +00:00
|
|
|
|
waterSurfacePos = *pos;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
|
2022-05-17 22:41:50 +00:00
|
|
|
|
if (WaterBox_GetSurface1(this, &this->colCtx, waterSurfacePos.x, waterSurfacePos.z, &waterSurfacePos.y,
|
z_bgcheck.c, 800430A0.c, 80043480.c (#256)
* beginning of migrating changes
* got matching
* changed order a bit
* clean up bgcheck
* fix conflict
* fix conflict again
* first stab at identifying types, some oks
* Clean up most bad structs/pointer math, move relevant structs to z64bgcheck.h, get some OKs
* more OKs, z_bgcheck.bss migration, update some sys_math3d.c args
* couple more OKs
* pushing some OKs
* fix compilation issues
* code_800430A0.c OK, more files decomp'd
* 8003A3E0 big OK :)
* Decomp most of func_8003C614, decomp helper funcs
* Decomp SurfaceType, CamData, and WaterBox property related functions
* more OKs, big OK in 8003C078
* more OKs, more progress, move a function definition in z_collision_check to functions.h
* more clean-ups, more OKs, dyn_vtx is now defined as u8*
* 8003A5B8, 8003A7D8, 8003C614, 8003DD6C OK, document function args better
* data migrated, more OKs
* 80041240 OK, func_8003B3C8 and func_8003BB18 disassembled
* func_80040284, 800409A8 non_matching, add IS_ZERO macro
* All asm files have C representations, some big OKs, lots of minor tweaks
* More OKs, non-matching code cleanup
* 8003FBF4 and 80040BE4 OK, improve codegen for most functions
* format z_bgcheck.c
* fix warnings, compile errors on NON_MATCHING
* func_8003EE80 is now NON_MATCHING
* begin documenting some functions
* formatting
* more documentation, func_8003A95C OK
* fix PHYSICAL_TO_VIRTUAL changes
* fix var rename
* More documentation, functions 80040E40, 80041648 OK, change types to not be compatible with ZAP
* func_8004239C ok, more NON_MATCHING improvements, more documentation
* Implement most suggested changes
* Convert comments to slower comments
* /**
* Implement ZAP2 changes
* my anti-virus ate my format.sh results
* Rename a couple hundred functions, fix minor stuff
* rename var so that clang formats correctly
* run format.sh
* implement Petrie's matches/suggestions
* format
* matches
* and the asm
* slight error
* Add SSList
* two more matches
* stuff
* implement code changes
* clean up Petrie's matchings
Co-authored-by: Arthur <arthurtilly413@gmail.com>
Co-authored-by: fig02 <fig02srl@gmail.com>
Co-authored-by: petrie911 <pmontag@DESKTOP-LG8A167.localdomain>
2021-01-08 11:12:58 +00:00
|
|
|
|
&waterBox) == true &&
|
|
|
|
|
pos->y < waterSurfacePos.y &&
|
2022-08-30 15:49:51 +00:00
|
|
|
|
BgCheck_EntityRaycastDown3(&this->colCtx, &poly, &bgId, &waterSurfacePos) != BGCHECK_Y_MIN) {
|
z_bgcheck.c, 800430A0.c, 80043480.c (#256)
* beginning of migrating changes
* got matching
* changed order a bit
* clean up bgcheck
* fix conflict
* fix conflict again
* first stab at identifying types, some oks
* Clean up most bad structs/pointer math, move relevant structs to z64bgcheck.h, get some OKs
* more OKs, z_bgcheck.bss migration, update some sys_math3d.c args
* couple more OKs
* pushing some OKs
* fix compilation issues
* code_800430A0.c OK, more files decomp'd
* 8003A3E0 big OK :)
* Decomp most of func_8003C614, decomp helper funcs
* Decomp SurfaceType, CamData, and WaterBox property related functions
* more OKs, big OK in 8003C078
* more OKs, more progress, move a function definition in z_collision_check to functions.h
* more clean-ups, more OKs, dyn_vtx is now defined as u8*
* 8003A5B8, 8003A7D8, 8003C614, 8003DD6C OK, document function args better
* data migrated, more OKs
* 80041240 OK, func_8003B3C8 and func_8003BB18 disassembled
* func_80040284, 800409A8 non_matching, add IS_ZERO macro
* All asm files have C representations, some big OKs, lots of minor tweaks
* More OKs, non-matching code cleanup
* 8003FBF4 and 80040BE4 OK, improve codegen for most functions
* format z_bgcheck.c
* fix warnings, compile errors on NON_MATCHING
* func_8003EE80 is now NON_MATCHING
* begin documenting some functions
* formatting
* more documentation, func_8003A95C OK
* fix PHYSICAL_TO_VIRTUAL changes
* fix var rename
* More documentation, functions 80040E40, 80041648 OK, change types to not be compatible with ZAP
* func_8004239C ok, more NON_MATCHING improvements, more documentation
* Implement most suggested changes
* Convert comments to slower comments
* /**
* Implement ZAP2 changes
* my anti-virus ate my format.sh results
* Rename a couple hundred functions, fix minor stuff
* rename var so that clang formats correctly
* run format.sh
* implement Petrie's matches/suggestions
* format
* matches
* and the asm
* slight error
* Add SSList
* two more matches
* stuff
* implement code changes
* clean up Petrie's matchings
Co-authored-by: Arthur <arthurtilly413@gmail.com>
Co-authored-by: fig02 <fig02srl@gmail.com>
Co-authored-by: petrie911 <pmontag@DESKTOP-LG8A167.localdomain>
2021-01-08 11:12:58 +00:00
|
|
|
|
return true;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
} else {
|
z_bgcheck.c, 800430A0.c, 80043480.c (#256)
* beginning of migrating changes
* got matching
* changed order a bit
* clean up bgcheck
* fix conflict
* fix conflict again
* first stab at identifying types, some oks
* Clean up most bad structs/pointer math, move relevant structs to z64bgcheck.h, get some OKs
* more OKs, z_bgcheck.bss migration, update some sys_math3d.c args
* couple more OKs
* pushing some OKs
* fix compilation issues
* code_800430A0.c OK, more files decomp'd
* 8003A3E0 big OK :)
* Decomp most of func_8003C614, decomp helper funcs
* Decomp SurfaceType, CamData, and WaterBox property related functions
* more OKs, big OK in 8003C078
* more OKs, more progress, move a function definition in z_collision_check to functions.h
* more clean-ups, more OKs, dyn_vtx is now defined as u8*
* 8003A5B8, 8003A7D8, 8003C614, 8003DD6C OK, document function args better
* data migrated, more OKs
* 80041240 OK, func_8003B3C8 and func_8003BB18 disassembled
* func_80040284, 800409A8 non_matching, add IS_ZERO macro
* All asm files have C representations, some big OKs, lots of minor tweaks
* More OKs, non-matching code cleanup
* 8003FBF4 and 80040BE4 OK, improve codegen for most functions
* format z_bgcheck.c
* fix warnings, compile errors on NON_MATCHING
* func_8003EE80 is now NON_MATCHING
* begin documenting some functions
* formatting
* more documentation, func_8003A95C OK
* fix PHYSICAL_TO_VIRTUAL changes
* fix var rename
* More documentation, functions 80040E40, 80041648 OK, change types to not be compatible with ZAP
* func_8004239C ok, more NON_MATCHING improvements, more documentation
* Implement most suggested changes
* Convert comments to slower comments
* /**
* Implement ZAP2 changes
* my anti-virus ate my format.sh results
* Rename a couple hundred functions, fix minor stuff
* rename var so that clang formats correctly
* run format.sh
* implement Petrie's matches/suggestions
* format
* matches
* and the asm
* slight error
* Add SSList
* two more matches
* stuff
* implement code changes
* clean up Petrie's matchings
Co-authored-by: Arthur <arthurtilly413@gmail.com>
Co-authored-by: fig02 <fig02srl@gmail.com>
Co-authored-by: petrie911 <pmontag@DESKTOP-LG8A167.localdomain>
2021-01-08 11:12:58 +00:00
|
|
|
|
return false;
|
2020-04-16 21:36:12 +00:00
|
|
|
|
}
|
|
|
|
|
}
|