diff --git a/include/functions.h b/include/functions.h index e11a962633..1c356bdb80 100644 --- a/include/functions.h +++ b/include/functions.h @@ -1882,7 +1882,7 @@ void func_8011C808(PlayState* play); // void func_8011CA64(void); // void func_8011E3B4(void); // void func_8011E730(void); -// void func_8011F0E0(UNK_TYPE4 ctxt); +void func_8011F0E0(PlayState* play); // void func_80120F90(void); // void func_80121000(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7, UNK_TYPE1 param_8, UNK_TYPE1 param_9, UNK_TYPE1 param_10, UNK_TYPE4 param_11, UNK_TYPE4 param_12, UNK_TYPE4 param_13, UNK_TYPE4 param_14); // void func_80121064(void); @@ -2361,7 +2361,7 @@ void func_80140EA0(Struct_80140E80* arg0); // void func_80141200(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6); // void func_8014151C(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6); // void func_80141678(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5); -// void func_80141778(void); +void func_80141778(Struct_80140E80* arg0, Gfx** gfxp, void* unk_18E60, GraphicsContext* gfxCtx); void VisMono_Init(VisMono* this); void VisMono_Destroy(VisMono* this); // void VisMono_DesaturateTLUT(u16* tlut); @@ -2431,7 +2431,7 @@ u8 Message_GetState(MessageContext* msgCtx); // void func_80153E7C(void); // void func_80153EF0(void); void func_801541D4(PlayState* play, Gfx** gfxp); -// void func_80156758(void); +void func_80156758(PlayState* play); void func_8015680C(PlayState* play); void func_801586A4(PlayState* play); void Message_Init(PlayState* play); @@ -2556,8 +2556,8 @@ void Play_Draw(PlayState* play); void func_80168DAC(PlayState* play); void Play_Main(GameState* thisx); s32 Play_InCsMode(PlayState* play); -f32 func_80169100(PlayState* play, MtxF* mtx, CollisionPoly** arg2, s32* arg3, Vec3f* feetPosPtr); -// void func_801691F0(void); +f32 func_80169100(PlayState* play, MtxF* mtx, CollisionPoly** poly, s32* bgId, Vec3f* feetPos); +void func_801691F0(PlayState* this, MtxF* mtx, Vec3f* feetPos); void* Play_LoadScene(PlayState* play, RomFile* entry); void func_8016927C(PlayState* play, s16 sParm2); // void func_801692C4(PlayState* play, UNK_TYPE1 uParm2); @@ -2601,9 +2601,9 @@ void Play_Init(GameState* gameState); // void func_8016CD4C(void); // void func_8016E40C(void); // void func_8016EA90(void); -// void func_8016F1A8(void); +void func_8016F1A8(HiresoStruct* arg0, GraphicsContext* gfxCtx); // void func_8016F4EC(void); -void func_8016F5A8(PlayState* play, s8* pcParm2, Input* iParm3); +void func_8016F5A8(PlayState* play, HiresoStruct* arg1, Input* input); void func_8016FC78(HiresoStruct* this); void func_8016FC98(HiresoStruct* this); void PreRender_SetValuesSave(PreRender* this, u32 width, u32 height, void* fbuf, void* zbuf, void* cvg); @@ -2778,11 +2778,11 @@ void func_801780F0(Mtx* param_1, f32 param_2, f32 param_3, f32 param_4, f32 para // void func_801781EC(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5); void func_8017842C(MtxF* arg0, f32 arg1, f32 arg2, f32 arg3, s16 arg4, f32 arg5, f32 arg6, f32 arg7, f32 arg8, f32 arg9, f32 arg10); void func_80178750(void); -// void func_80178818(void); +void func_80178818(void); void func_80178978(void); // void func_801789D4(void); -u32 SysCfb_GetFbPtr(s32 index); -u32 SysCfb_GetZBuffer(void); +void* SysCfb_GetFbPtr(s32 index); +void* SysCfb_GetZBuffer(void); // UNK_TYPE4 func_80178A24(void); // void func_80178A34(void); s32 func_80178A94(s32 param_1, s32 param_2); diff --git a/include/variables.h b/include/variables.h index 56111f6f29..a5dbdbb528 100644 --- a/include/variables.h +++ b/include/variables.h @@ -3275,7 +3275,7 @@ extern UNK_TYPE2 D_801FBBCC; extern UNK_TYPE2 D_801FBBCE; // extern UNK_TYPE1 D_801FBBD0; // extern UNK_TYPE1 D_801FBBD2; -// extern UNK_TYPE1 D_801FBBD4; +extern u8 D_801FBBD4; // extern UNK_TYPE1 D_801FBBE0; extern Vec3f D_801FBBF0; extern LineSegment Math3D_ColSphereTri_line; diff --git a/include/z64.h b/include/z64.h index 1eafccde0e..bdb994280a 100644 --- a/include/z64.h +++ b/include/z64.h @@ -1193,7 +1193,7 @@ struct PlayState { /* 0x18E54 */ SceneTableEntry* loadedScene; /* 0x18E58 */ UNK_PTR unk_18E58; /* 0x18E5C */ UNK_PTR unk_18E5C; - /* 0x18E60 */ UNK_PTR unk_18E60; + /* 0x18E60 */ void* unk_18E60; /* 0x18E64 */ void* unk_18E64; /* 0x18E68 */ void* unk_18E68; /* 0x18E6C */ char unk_18E6C[0x3EC]; diff --git a/src/code/graph.c b/src/code/graph.c index 481aa1da0e..bfce5ab0fa 100644 --- a/src/code/graph.c +++ b/src/code/graph.c @@ -49,7 +49,7 @@ void Graph_SetNextGfxPool(GraphicsContext* gfxCtx) { gfxCtx->workBuffer = pool->workBuffer; gfxCtx->debugBuffer = pool->debugBuffer; - gfxCtx->curFrameBuffer = (u16*)SysCfb_GetFbPtr(gfxCtx->framebufferIdx % 2); + gfxCtx->curFrameBuffer = SysCfb_GetFbPtr(gfxCtx->framebufferIdx % 2); gSegments[0x0F] = gfxCtx->curFrameBuffer; gfxCtx->zbuffer = SysCfb_GetZBuffer(); diff --git a/src/code/z_play.c b/src/code/z_play.c index d04a67384e..d9b82ea62e 100644 --- a/src/code/z_play.c +++ b/src/code/z_play.c @@ -17,9 +17,59 @@ extern Struct_80140E80 D_801F6D38; extern Struct_80140E80* D_801F6D4C; extern HiresoStruct D_801F6D50; extern u8 D_801F6DFC; -extern s8 D_801F6DFD; +extern u8 D_801F6DFD; -#pragma GLOBAL_ASM("asm/non_matchings/code/z_play/func_80165460.s") +void func_80165460(PlayState* this) { + GraphicsContext* gfxCtx = this->state.gfxCtx; + s32 alpha; + Gfx* gfx; + Gfx* dlistHead; + + if (SREG(93) != 0) { + alpha = SREG(92); + + if (D_801F6DFD == 0) { + D_801F6DFD = 1; + } + } else if (SREG(91) != 0) { + alpha = SREG(90); + + if (D_801F6DFD == 0) { + D_801F6DFD = 1; + } + } else { + alpha = 0; + D_801F6DFD = 0; + } + + if (D_801F6DFD != 0) { + OPEN_DISPS(gfxCtx); + + dlistHead = POLY_OPA_DISP; + gfx = Graph_GfxPlusOne(dlistHead); + + gSPDisplayList(OVERLAY_DISP++, gfx); + + this->pauseBgPreRender.fbuf = gfxCtx->curFrameBuffer; + this->pauseBgPreRender.fbufSave = this->unk_18E64; + + if (D_801F6DFD == 2) { + func_80170AE0(&this->pauseBgPreRender, &gfx, alpha); + } else { + D_801F6DFD = 2; + } + + func_801705B4(&this->pauseBgPreRender, &gfx); + + gSPEndDisplayList(gfx++); + + Graph_BranchDlist(dlistHead, gfx); + + POLY_OPA_DISP = gfx; + + CLOSE_DISPS(gfxCtx); + } +} void func_80165608(void) { SREG(91) = 0; @@ -33,7 +83,9 @@ void func_80165630(void) { D_801F6DFD = 0; } -#pragma GLOBAL_ASM("asm/non_matchings/code/z_play/func_80165658.s") +void func_80165658(u32 arg0) { + SREG(90) = arg0; +} void func_8016566C(u32 arg0) { SREG(90) = arg0; @@ -47,13 +99,22 @@ void func_80165690(void) { void func_801656A4(u8* arg0, u16* arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5, s32 arg6, s32 arg7); #pragma GLOBAL_ASM("asm/non_matchings/code/z_play/func_801656A4.s") -#pragma GLOBAL_ASM("asm/non_matchings/code/z_play/func_80165DB8.s") +void func_80165DB8(s32 arg0) { + SREG(92) = arg0; +} -#pragma GLOBAL_ASM("asm/non_matchings/code/z_play/func_80165DCC.s") +void func_80165DCC(s32 arg0) { + SREG(92) = arg0; + SREG(93) = 1; +} -#pragma GLOBAL_ASM("asm/non_matchings/code/z_play/func_80165DF0.s") +void func_80165DF0(void) { + SREG(93) = 0; +} -#pragma GLOBAL_ASM("asm/non_matchings/code/z_play/func_80165E04.s") +void func_80165E04(void) { + SREG(89) = 1; +} void func_80165E1C(PreRender* prerender) { PreRender_ApplyFilters(prerender); @@ -234,13 +295,13 @@ void Play_Destroy(GameState* thisx) { if (D_801F6DFC != 0) { MsgEvent_SendNullTask(); func_80178750(); - gfxCtx->curFrameBuffer = (u16*)SysCfb_GetFbPtr(gfxCtx->framebufferIdx % 2); + gfxCtx->curFrameBuffer = SysCfb_GetFbPtr(gfxCtx->framebufferIdx % 2); gfxCtx->zbuffer = SysCfb_GetZBuffer(); gfxCtx->viMode = D_801FBB88; gfxCtx->viConfigFeatures = gViConfigFeatures; gfxCtx->xScale = gViConfigXScale; gfxCtx->yScale = gViConfigYScale; - gfxCtx->updateViMode = 1; + gfxCtx->updateViMode = true; D_801F6DFC = 0; } @@ -372,13 +433,117 @@ Input* D_801D0D60 = NULL; #pragma GLOBAL_ASM("asm/non_matchings/code/z_play/Play_Update.s") -#pragma GLOBAL_ASM("asm/non_matchings/code/z_play/func_80167DE4.s") +void func_80167DE4(PlayState* play) { + if (D_801F6DFC == 0) { + if (play->pauseCtx.unk_1F0 != 0) { + D_801F6DFC = 1; + D_801F6D50.unk_00 = 0; + } + } else { + if (CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_L) || + CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_B) || + CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_START) || (gIrqMgrResetStatus != 0)) { + D_801F6DFC = 0; + play->pauseCtx.unk_1F0 = 0; + D_801F6D50.unk_00 = 0; + play->msgCtx.msgLength = 0; + play->msgCtx.msgMode = 0; + play->msgCtx.currentTextId = 0; + play->msgCtx.stateTimer = 0; + play_sound(NA_SE_SY_CANCEL); + } + } + if (D_801F6DFC != 0) { + func_8016F5A8(play, &D_801F6D50, play->state.input); + func_8015680C(play); + } else { + Play_Update(play); + } +} -#pragma GLOBAL_ASM("asm/non_matchings/code/z_play/func_80167F0C.s") +void func_80167F0C(PlayState* this) { + Gfx* sp34; + Gfx* sp30; + GraphicsContext* gfxCtx; + + if ((this->pauseCtx.state != 0) || (this->pauseCtx.debugEditor != 0)) { + KaleidoScopeCall_Draw(this); + } + + if (gSaveContext.gameMode == 0) { + func_8011F0E0(this); + } + + if (((this->pauseCtx.state == 0) && (this->pauseCtx.debugEditor == 0)) || (this->msgCtx.currentTextId != 0xFF)) { + func_80156758(this); + } + + if (this->gameOverCtx.state != 0) { + GameOver_FadeLights(this); + } + + if (gSaveContext.screenScaleFlag != 0) { + gfxCtx = this->state.gfxCtx; + D_801F6D4C->scale = gSaveContext.screenScale / 1000.0f; + + OPEN_DISPS(gfxCtx); + + sp30 = POLY_OPA_DISP; + sp34 = Graph_GfxPlusOne(sp30); + gSPDisplayList(OVERLAY_DISP++, sp34); + + func_80141778(D_801F6D4C, &sp34, this->unk_18E60, gfxCtx); + + gSPEndDisplayList(sp34++); + Graph_BranchDlist(sp30, sp34); + POLY_OPA_DISP = sp34; + + CLOSE_DISPS(gfxCtx); + } +} #pragma GLOBAL_ASM("asm/non_matchings/code/z_play/Play_Draw.s") -#pragma GLOBAL_ASM("asm/non_matchings/code/z_play/func_80168DAC.s") +void func_80168DAC(PlayState* this) { + GraphicsContext* gfxCtx = this->state.gfxCtx; + + { + GraphicsContext* gfxCtx2 = this->state.gfxCtx; + + if (D_801F6DFC != 0) { + if (D_801FBBD4 != 1) { + MsgEvent_SendNullTask(); + func_80178818(); + gfxCtx2->curFrameBuffer = SysCfb_GetFbPtr(gfxCtx2->framebufferIdx % 2); + gfxCtx2->zbuffer = SysCfb_GetZBuffer(); + gfxCtx2->viMode = D_801FBB88; + gfxCtx2->viConfigFeatures = gViConfigFeatures; + gfxCtx2->xScale = gViConfigXScale; + gfxCtx2->yScale = gViConfigYScale; + gfxCtx2->updateViMode = true; + } + } else { + if (D_801FBBD4 != 0) { + MsgEvent_SendNullTask(); + func_80178750(); + gfxCtx2->curFrameBuffer = SysCfb_GetFbPtr(gfxCtx2->framebufferIdx % 2); + gfxCtx2->zbuffer = SysCfb_GetZBuffer(); + gfxCtx2->viMode = D_801FBB88; + gfxCtx2->viConfigFeatures = gViConfigFeatures; + gfxCtx2->xScale = gViConfigXScale; + gfxCtx2->yScale = gViConfigYScale; + gfxCtx2->updateViMode = true; + } + } + } + + if ((D_801F6DFC != 0) && ((SREG(2) != 2) || (gZBufferPtr == NULL))) { + func_8016F1A8(&D_801F6D50, gfxCtx); + func_80156758(this); + } else { + Play_Draw(this); + } +} void Play_Main(GameState* thisx); #pragma GLOBAL_ASM("asm/non_matchings/code/z_play/Play_Main.s") @@ -387,9 +552,38 @@ s32 Play_InCsMode(PlayState* this) { return (this->csCtx.state != 0) || Player_InCsMode(this); } -#pragma GLOBAL_ASM("asm/non_matchings/code/z_play/func_80169100.s") +f32 func_80169100(PlayState* play, MtxF* mtx, CollisionPoly** poly, s32* bgId, Vec3f* feetPos) { + f32 floorHeight = BgCheck_EntityRaycastFloor3(&play->colCtx, poly, bgId, feetPos); -#pragma GLOBAL_ASM("asm/non_matchings/code/z_play/func_801691F0.s") + if (floorHeight > BGCHECK_Y_MIN) { + func_800C0094(*poly, feetPos->x, floorHeight, feetPos->z, mtx); + } else { + mtx->xy = 0.0f; + mtx->zx = 0.0f; + mtx->yx = 0.0f; + mtx->xx = 0.0f; + mtx->wz = 0.0f; + mtx->xz = 0.0f; + mtx->wy = 0.0f; + mtx->wx = 0.0f; + mtx->zz = 0.0f; + mtx->yz = 0.0f; + mtx->zy = 0.0f; + mtx->yy = 1.0f; + mtx->xw = feetPos->x; + mtx->yw = feetPos->y; + mtx->zw = feetPos->z; + mtx->ww = 1.0f; + } + return floorHeight; +} + +void func_801691F0(PlayState* this, MtxF* mtx, Vec3f* feetPos) { + CollisionPoly* poly; + s32 bgId; + + func_80169100(this, mtx, &poly, &bgId, feetPos); +} void* Play_LoadScene(PlayState* this, RomFile* entry) { size_t size = entry->vromEnd - entry->vromStart; diff --git a/src/code/z_scene_table.c b/src/code/z_scene_table.c index 108689978a..ea822a2c7b 100644 --- a/src/code/z_scene_table.c +++ b/src/code/z_scene_table.c @@ -1,10 +1,10 @@ #include "global.h" #define SCENE_ENTRY(name, textId, config) \ - { { SEGMENT_ROM_START(name), SEGMENT_ROM_END(name) }, textId, 0, config, 0 } + { { SEGMENT_ROM_START(name), SEGMENT_ROM_END(name) }, textId, 0, config, 0, 0 } #define SCENE_ENTRY_NONE() \ - { { 0, 0 }, 0, 0, 0, 0 } + { { 0, 0 }, 0, 0, 0, 0, 0 } SceneTableEntry gSceneTable[] = { /* 0x00 */ SCENE_ENTRY(Z2_20SICHITAI2, 0x0116, SCENE_DRAW_CFG_MAT_ANIM), diff --git a/src/overlays/gamestates/ovl_select/z_select.c b/src/overlays/gamestates/ovl_select/z_select.c index 0147cca641..1860dc5056 100644 --- a/src/overlays/gamestates/ovl_select/z_select.c +++ b/src/overlays/gamestates/ovl_select/z_select.c @@ -37,7 +37,7 @@ void MapSelect_LoadGame(MapSelectState* this, u32 entrance, s32 spawn) { if (spawn != 0) { gSaveContext.save.entrance = - Entrance_Create((s32)gSaveContext.save.entrance >> 9, spawn, gSaveContext.save.entrance & 0xF); + Entrance_Create(gSaveContext.save.entrance >> 9, spawn, gSaveContext.save.entrance & 0xF); } if (gSaveContext.save.entrance == ENTRANCE(CLOCK_TOWER_INTERIOR, 0)) { gSaveContext.save.day = 0;