diff options
| author | engineer124 <engineer124engineer124@gmail.com> | 2023-06-11 01:34:53 +1000 |
|---|---|---|
| committer | engineer124 <engineer124engineer124@gmail.com> | 2023-06-11 01:34:53 +1000 |
| commit | 5fc0024b72622125a689aa5ae080337fe578f1ff (patch) | |
| tree | 656ce93b5d46e86ed453980019f2110c877dd869 /src/code | |
| parent | 3dd8096af5af84fab0cd3a664d3e1e888224274d (diff) | |
| parent | 47be99fb0cde762466ab8dd7d2471dd278a59040 (diff) | |
Merge branch 'master' into parameter
Diffstat (limited to 'src/code')
34 files changed, 2108 insertions, 498 deletions
diff --git a/src/code/game.c b/src/code/game.c index c98241177..8f4e0f44d 100644 --- a/src/code/game.c +++ b/src/code/game.c @@ -11,9 +11,9 @@ f32 gFramerateDivisorThird = 1.0f / 3.0f; void Game_UpdateFramerateVariables(s32 divisor) { gFramerateDivisor = divisor; - gFramerateDivisorF = (f32)divisor; - gFramerateDivisorHalf = (f32)(divisor * 0.5f); - gFramerateDivisorThird = (f32)(divisor / 3.0f); + gFramerateDivisorF = divisor; + gFramerateDivisorHalf = divisor / 2.0f; + gFramerateDivisorThird = divisor / 3.0f; } void Game_SetFramerateDivisor(GameState* gameState, s32 divisor) { diff --git a/src/code/graph.c b/src/code/graph.c index bf9067b69..eca40bbaf 100644 --- a/src/code/graph.c +++ b/src/code/graph.c @@ -1,8 +1,9 @@ +#include "prevent_bss_reordering.h" #include "global.h" #include "buffers.h" #include "system_malloc.h" #include "overlays/gamestates/ovl_daytelop/z_daytelop.h" -#include "overlays/gamestates/ovl_file_choose/z_file_choose.h" +#include "overlays/gamestates/ovl_file_choose/z_file_select.h" #include "overlays/gamestates/ovl_opening/z_opening.h" #include "overlays/gamestates/ovl_select/z_select.h" #include "overlays/gamestates/ovl_title/z_title.h" diff --git a/src/code/sys_cmpdma.c b/src/code/sys_cmpdma.c index b2a17d547..715892b49 100644 --- a/src/code/sys_cmpdma.c +++ b/src/code/sys_cmpdma.c @@ -2,7 +2,7 @@ #include "system_malloc.h" typedef struct { - union { + /* 0x0 */ union { u32 dmaWord[2]; u32 dataStart; u32 dataSize; @@ -11,7 +11,7 @@ typedef struct { u32 end; } offset; }; -} CmpDmaBuffer; +} CmpDmaBuffer; // size = 0x8 CmpDmaBuffer sDmaBuffer; diff --git a/src/code/sys_math.c b/src/code/sys_math.c index 7fd7e9dea..99d13c332 100644 --- a/src/code/sys_math.c +++ b/src/code/sys_math.c @@ -4,15 +4,17 @@ */ #include "global.h" -static f32 sFactorialTbl[] = { 1.0f, 1.0f, 2.0f, 6.0f, 24.0f, 120.0f, 720.0f, - 5040.0f, 40320.0f, 362880.0f, 3628800.0f, 39916800.0f, 479001600.0f }; +static f32 sFactorialTbl[] = { + 1.0f, 1.0f, 2.0f, 6.0f, 24.0f, 120.0f, 720.0f, 5040.0f, 40320.0f, 362880.0f, 3628800.0f, 39916800.0f, 479001600.0f, +}; -// Rename to Math_FactorialF /** * Takes a float, returns the factorial of it(s trunctation), iteratively * Unused + * + * @remark original name: "ffact" */ -f32 func_80179300(f32 n) { +f32 Math_FactorialF(f32 n) { f32 ret = 1.0f; s32 i; @@ -23,12 +25,13 @@ f32 func_80179300(f32 n) { return ret; } -// Rename to Math_Factorial /** * Takes an int and returns its factorial as a float. Uses the lookup table for n <= 12. * Unused + * + * @remark original name: "ifact" */ -f32 func_80179400(s32 n) { +f32 Math_Factorial(s32 n) { f32 ret; s32 i; @@ -45,12 +48,13 @@ f32 func_80179400(s32 n) { return ret; } -// Rename to Math_PowF /** * Returns base^{exp} if exp is nonnegative and 1.0f otherwise. * Unused + * + * @remark original name: "powi" */ -f32 pow_int(f32 base, s32 exp) { +f32 Math_PowF(f32 base, s32 exp) { f32 ret = 1.0f; while (exp > 0) { @@ -61,19 +65,21 @@ f32 pow_int(f32 base, s32 exp) { return ret; } -// Rename to Math_SinF /** * Takes an angle in radians and returns the sine. + * + * @remark original name: "sinf_table" */ -f32 sin_rad(f32 rad) { +f32 Math_SinF(f32 rad) { return sins(RAD_TO_BINANG(rad)) * SHT_MINV; } -// Rename to Math_CosF /** * Takes an angle in radians and returns the cosine. + * + * @remark original name: "cosf_table" */ -f32 cos_rad(f32 rad) { +f32 Math_CosF(f32 rad) { return coss(RAD_TO_BINANG(rad)) * SHT_MINV; } @@ -84,10 +90,9 @@ f32 Rand_ZeroFloat(f32 scale) { return Rand_ZeroOne() * scale; } -// Rename to Rand_CenteredFloat /** * Returns a pseudo-random floating-point number between (- scale / 2) and (scale / 2). Originally in z_actor in OoT. */ -f32 randPlusMinusPoint5Scaled(f32 scale) { +f32 Rand_CenteredFloat(f32 scale) { return Rand_Centered() * scale; } diff --git a/src/code/z_actor.c b/src/code/z_actor.c index 82ff8ddd9..e7bc92a26 100644 --- a/src/code/z_actor.c +++ b/src/code/z_actor.c @@ -3567,8 +3567,8 @@ void Actor_SpawnFloorDustRing(PlayState* play, Actor* actor, Vec3f* posXZ, f32 r accel.y += (Rand_ZeroOne() - 0.5f) * 0.2f; for (i = countMinusOne; i >= 0; i--) { - pos.x = (sin_rad(angle) * radius) + posXZ->x; - pos.z = (cos_rad(angle) * radius) + posXZ->z; + pos.x = (Math_SinF(angle) * radius) + posXZ->x; + pos.z = (Math_CosF(angle) * radius) + posXZ->z; accel.x = (Rand_ZeroOne() - 0.5f) * randAccelWeight; accel.z = (Rand_ZeroOne() - 0.5f) * randAccelWeight; @@ -4816,7 +4816,7 @@ void Actor_DrawDamageEffects(PlayState* play, Actor* actor, Vec3f limbPos[], s16 // Apply and draw a light orb over each limb of frozen actor for (limbIndex = 0; limbIndex < limbPosCount; limbIndex++, limbPos++) { - Matrix_RotateZF(randPlusMinusPoint5Scaled(2 * M_PI), MTXMODE_APPLY); + Matrix_RotateZF(Rand_CenteredFloat(2 * M_PI), MTXMODE_APPLY); currentMatrix->mf[3][0] = limbPos->x; currentMatrix->mf[3][1] = limbPos->y; currentMatrix->mf[3][2] = limbPos->z; @@ -4857,9 +4857,9 @@ void Actor_DrawDamageEffects(PlayState* play, Actor* actor, Vec3f limbPos[], s16 // first electric spark Matrix_RotateXFApply(Rand_ZeroFloat(2 * M_PI)); Matrix_RotateZF(Rand_ZeroFloat(2 * M_PI), MTXMODE_APPLY); - currentMatrix->mf[3][0] = randPlusMinusPoint5Scaled((f32)sREG(24) + 30.0f) + limbPos->x; - currentMatrix->mf[3][1] = randPlusMinusPoint5Scaled((f32)sREG(24) + 30.0f) + limbPos->y; - currentMatrix->mf[3][2] = randPlusMinusPoint5Scaled((f32)sREG(24) + 30.0f) + limbPos->z; + currentMatrix->mf[3][0] = Rand_CenteredFloat((f32)sREG(24) + 30.0f) + limbPos->x; + currentMatrix->mf[3][1] = Rand_CenteredFloat((f32)sREG(24) + 30.0f) + limbPos->y; + currentMatrix->mf[3][2] = Rand_CenteredFloat((f32)sREG(24) + 30.0f) + limbPos->z; gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); @@ -4869,9 +4869,9 @@ void Actor_DrawDamageEffects(PlayState* play, Actor* actor, Vec3f limbPos[], s16 // second electric spark Matrix_RotateXFApply(Rand_ZeroFloat(2 * M_PI)); Matrix_RotateZF(Rand_ZeroFloat(2 * M_PI), MTXMODE_APPLY); - currentMatrix->mf[3][0] = randPlusMinusPoint5Scaled((f32)sREG(24) + 30.0f) + limbPos->x; - currentMatrix->mf[3][1] = randPlusMinusPoint5Scaled((f32)sREG(24) + 30.0f) + limbPos->y; - currentMatrix->mf[3][2] = randPlusMinusPoint5Scaled((f32)sREG(24) + 30.0f) + limbPos->z; + currentMatrix->mf[3][0] = Rand_CenteredFloat((f32)sREG(24) + 30.0f) + limbPos->x; + currentMatrix->mf[3][1] = Rand_CenteredFloat((f32)sREG(24) + 30.0f) + limbPos->y; + currentMatrix->mf[3][2] = Rand_CenteredFloat((f32)sREG(24) + 30.0f) + limbPos->z; gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); diff --git a/src/code/z_bgcheck.c b/src/code/z_bgcheck.c index e30dec5d5..a263d4393 100644 --- a/src/code/z_bgcheck.c +++ b/src/code/z_bgcheck.c @@ -1,4 +1,5 @@ #include "global.h" +#include "fixed_point.h" #include "vt.h" #include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h" @@ -3047,7 +3048,7 @@ void DynaPoly_AddBgActorToLookup(PlayState* play, DynaCollisionContext* dyna, s3 newPoly->normal.z = COLPOLY_SNORMAL(newNormal.z); } - newPoly->dist = func_80086D24(-DOTXYZ(newNormal, vtxA)); + newPoly->dist = nearbyint(-DOTXYZ(newNormal, vtxA)); if (newNormal.y > 0.5f) { s16 polyId = *polyStartIndex + i; diff --git a/src/code/z_camera.c b/src/code/z_camera.c index bd23308c3..acb4af20a 100644 --- a/src/code/z_camera.c +++ b/src/code/z_camera.c @@ -875,7 +875,7 @@ void func_800CC938(Camera* camera) { * Calculates the angle between points `from` and `to` */ s16 Camera_CalcXZAngle(Vec3f* to, Vec3f* from) { - return CAM_DEG_TO_BINANG(RAD_TO_DEG(func_80086B30(from->x - to->x, from->z - to->z))); + return CAM_DEG_TO_BINANG(RAD_TO_DEG(Math_FAtan2F(from->x - to->x, from->z - to->z))); } // BSS @@ -964,8 +964,8 @@ s16 Camera_GetPitchAdjFromFloorHeightDiffs(Camera* camera, s16 viewYaw, s16 shou floorYDiffNear = (sFloorYNear - camera->focalActorFloorHeight) * 0.8f; floorYDiffFar = (sFloorYFar - camera->focalActorFloorHeight) * (20.0f * 0.01f); - pitchNear = CAM_DEG_TO_BINANG(RAD_TO_DEG(func_80086B30(floorYDiffNear, nearDist))); - pitchFar = CAM_DEG_TO_BINANG(RAD_TO_DEG(func_80086B30(floorYDiffFar, farDist))); + pitchNear = CAM_DEG_TO_BINANG(RAD_TO_DEG(Math_FAtan2F(floorYDiffNear, nearDist))); + pitchFar = CAM_DEG_TO_BINANG(RAD_TO_DEG(Math_FAtan2F(floorYDiffFar, farDist))); return pitchNear + pitchFar; } @@ -1457,9 +1457,8 @@ s32 Camera_CalcAtForParallel(Camera* camera, VecGeo* arg1, f32 yOffset, f32 xzOf deltaY = focalActorPosRot->pos.y - *focalActorPosY; eyeAtDistXZ = OLib_Vec3fDistXZ(at, &camera->eye); - // Math_FTanF // Get the height based on 80% of the fov - fovHeight = func_80086760(DEG_TO_RAD(camera->fov * (0.8f * 0.5f))) * eyeAtDistXZ; + fovHeight = Math_FTanF(DEG_TO_RAD(camera->fov * (0.8f * 0.5f))) * eyeAtDistXZ; if (deltaY > fovHeight) { //! FAKE @@ -1539,8 +1538,8 @@ s32 Camera_CalcAtForFriendlyLockOn(Camera* camera, VecGeo* eyeAtDir, Vec3f* targ deltaY = focalActorPosRot->pos.y - *yPosOffset; sp50 = OLib_Vec3fDistXZ(at, &camera->eye); phi_f16 = sp50; - func_80086B30(deltaY, sp50); - fovHeight = func_80086760(DEG_TO_RAD(camera->fov * 0.4f)) * phi_f16; + Math_FAtan2F(deltaY, sp50); + fovHeight = Math_FTanF(DEG_TO_RAD(camera->fov * 0.4f)) * phi_f16; if (fovHeight < deltaY) { *yPosOffset += deltaY - fovHeight; @@ -1552,12 +1551,12 @@ s32 Camera_CalcAtForFriendlyLockOn(Camera* camera, VecGeo* eyeAtDir, Vec3f* targ focalActorAtOffsetTarget.y -= deltaY; } else { deltaY = focalActorPosRot->pos.y - *yPosOffset; - temp_f0_6 = func_80086B30(deltaY, OLib_Vec3fDistXZ(at, &camera->eye)); + temp_f0_6 = Math_FAtan2F(deltaY, OLib_Vec3fDistXZ(at, &camera->eye)); if (temp_f0_6 > 0.34906584f) { // (M_PI / 9) - phi_f16 = 1.0f - sin_rad(temp_f0_6 - 0.34906584f); + phi_f16 = 1.0f - Math_SinF(temp_f0_6 - 0.34906584f); } else if (temp_f0_6 < -0.17453292f) { // (M_PI / 18) - phi_f16 = 1.0f - sin_rad(-0.17453292f - temp_f0_6); + phi_f16 = 1.0f - Math_SinF(-0.17453292f - temp_f0_6); } else { phi_f16 = 1.0f; } @@ -1625,10 +1624,10 @@ s32 Camera_CalcAtForEnemyLockOn(Camera* camera, f32* arg1, s32 arg2, f32 yOffset new_var2 = *arg1; sp4C = new_var2; deltaY = focalActorPosRot->pos.y - *arg6; - temp_f0_3 = func_80086B30(deltaY, sp4C); + temp_f0_3 = Math_FAtan2F(deltaY, sp4C); if (!(flags & 0x80)) { - fovHeight = func_80086760(DEG_TO_RAD(camera->fov * 0.4f)) * sp4C; + fovHeight = Math_FTanF(DEG_TO_RAD(camera->fov * 0.4f)) * sp4C; if (fovHeight < deltaY) { *arg6 += deltaY - fovHeight; @@ -1641,9 +1640,9 @@ s32 Camera_CalcAtForEnemyLockOn(Camera* camera, f32* arg1, s32 arg2, f32 yOffset focalActorAtOffsetTarget.y -= deltaY; } else { if (temp_f0_3 > 0.34906584f) { // (M_PI / 9) - phi_f14 = 1.0f - sin_rad(temp_f0_3 - 0.34906584f); + phi_f14 = 1.0f - Math_SinF(temp_f0_3 - 0.34906584f); } else if (temp_f0_3 < -0.17453292f) { // (M_PI / 18) - phi_f14 = 1.0f - sin_rad(-0.17453292f - temp_f0_3); + phi_f14 = 1.0f - Math_SinF(-0.17453292f - temp_f0_3); } else { phi_f14 = 1.0f; } @@ -1845,8 +1844,6 @@ void Camera_CalcDefaultSwing(Camera* camera, VecGeo* arg1, VecGeo* arg2, f32 arg if (swing->unk_64 == 1) { if (arg3 < (sp88 = OLib_Vec3fDist(at, &swing->collisionClosePoint))) { - //! FAKE: - dummy:; swing->unk_64 = 0; } else if ((sp88 = Math3D_SignedDistanceFromPlane(swing->eyeAtColChk.norm.x, swing->eyeAtColChk.norm.y, swing->eyeAtColChk.norm.z, swing->eyeAtColChk.poly->dist, @@ -6326,8 +6323,9 @@ s32 Camera_Demo4(Camera* camera) { sCameraInterfaceFlags = roData->interfaceFlags; switch (camera->animState) { - //! FAKE: - if (1) {} + default: + break; + case 0: camera->animState++; rwData->timer = 0; @@ -6343,8 +6341,8 @@ s32 Camera_Demo4(Camera* camera) { // Camera fixed on human player as the mask moves from the pocket to the face // Camera rolls left and right if (rwData->timer >= 12) { - rwData->unk_0C = (rwData->timer - 12) * 10.384615f; - sin = sin_rad(DEG_TO_RAD(rwData->unk_0C)); + rwData->unk_0C = (rwData->timer - 12) * (135.0f / 13.0f); + sin = Math_SinF(DEG_TO_RAD(rwData->unk_0C)); rwData->unk_0C = ((rwData->unk_10 < 0.0f) ? -1.0f : 1.0f) * sin; if (rwData->timer == 12) { Distortion_Request(DISTORTION_TYPE_MASK_TRANSFORM_1); @@ -6516,7 +6514,7 @@ s32 Camera_Demo5(Camera* camera) { // Camera zooms out while rolling back and forth rwData->unk_0C = rwData->timer * (180.0f / 23.0f); sp58 = DEG_TO_RAD(rwData->unk_0C); - sin = sin_rad(sp58); + sin = Math_SinF(sp58); rwData->unk_0C = ((rwData->unk_10 < 0.0f) ? -1.0f : 1.0f) * sin; new_var = (46 - rwData->timer) * (5.0f / 46.0f); focalActorFocus.pos.x = (Math_SinS(rwData->unk_24) * new_var * rwData->unk_0C) + focalActorPosRot->pos.x; diff --git a/src/code/z_common_data.c b/src/code/z_common_data.c index 0e682231f..46dfe189e 100644 --- a/src/code/z_common_data.c +++ b/src/code/z_common_data.c @@ -8,10 +8,10 @@ void SaveContext_Init(void) { gSaveContext.save.playerForm = 0; gSaveContext.seqId = (u8)NA_BGM_DISABLED; gSaveContext.ambienceId = AMBIENCE_ID_DISABLED; - gSaveContext.unk_3F46 = NA_BGM_GENERAL_SFX; + gSaveContext.forcedSeqId = NA_BGM_GENERAL_SFX; gSaveContext.nextCutsceneIndex = 0xFFEF; gSaveContext.cutsceneTrigger = 0; - gSaveContext.unk_3F4D = 0; + gSaveContext.chamberCutsceneNum = 0; gSaveContext.nextDayTime = 0xFFFF; gSaveContext.skyboxTime = 0; gSaveContext.dogIsLost = true; @@ -19,6 +19,6 @@ void SaveContext_Init(void) { gSaveContext.prevHudVisibility = HUD_VISIBILITY_ALL; gSaveContext.options.language = 1; - gSaveContext.options.audioSetting = 0; + gSaveContext.options.audioSetting = SAVE_AUDIO_STEREO; gSaveContext.options.zTargetSetting = 0; } diff --git a/src/code/z_demo.c b/src/code/z_demo.c index 733ec4bc1..00ee877e9 100644 --- a/src/code/z_demo.c +++ b/src/code/z_demo.c @@ -171,15 +171,15 @@ void CutsceneCmd_Misc(PlayState* play, CutsceneContext* csCtx, CsCmdMisc* cmd) { case CS_MISC_CLOUDY_SKY: if (isFirstFrame) { - play->envCtx.unk_19 = 1; - play->envCtx.unk_17 = 1; - play->envCtx.unk_18 = 0; - play->envCtx.unk_1A = 0x3C; - play->envCtx.unk_21 = 1; - play->envCtx.unk_1F = 0; - play->envCtx.unk_20 = 1; - play->envCtx.unk_24 = 0x3C; - play->envCtx.unk_22 = play->envCtx.unk_24; + play->envCtx.changeSkyboxState = 1; + play->envCtx.skyboxConfig = 1; + play->envCtx.changeSkyboxNextConfig = 0; + play->envCtx.changeSkyboxTimer = 60; + play->envCtx.changeLightEnabled = true; + play->envCtx.lightConfig = 0; + play->envCtx.changeLightNextConfig = 1; + play->envCtx.changeDuration = 60; + play->envCtx.changeLightTimer = play->envCtx.changeDuration; } break; @@ -327,8 +327,7 @@ void CutsceneCmd_Misc(PlayState* play, CutsceneContext* csCtx, CsCmdMisc* cmd) { case CS_MISC_MOON_CRASH_SKYBOX: if (isFirstFrame) { - // skyboxConfig - play->envCtx.unk_17 = 0xD; + play->envCtx.skyboxConfig = 0xD; } break; diff --git a/src/code/z_draw.c b/src/code/z_draw.c index ace56a965..e6a814e2a 100644 --- a/src/code/z_draw.c +++ b/src/code/z_draw.c @@ -115,9 +115,9 @@ void GetItem_DrawWallet(PlayState* play, s16 drawId); void GetItem_DrawRemains(PlayState* play, s16 drawId); typedef struct { - /* 0x00 */ void (*drawFunc)(PlayState*, s16); - /* 0x04 */ void* drawResources[8]; // Either display lists (Gfx*) or matrices (Mtx*) -} DrawItemTableEntry; // size = 0x24 + /* 0x0 */ void (*drawFunc)(PlayState*, s16); + /* 0x4 */ void* drawResources[8]; // Either display lists (Gfx*) or matrices (Mtx*) +} DrawItemTableEntry; // size = 0x24 static DrawItemTableEntry sDrawItemTable[] = { // GID_BOTTLE, OBJECT_GI_BOTTLE diff --git a/src/code/z_eff_blure.c b/src/code/z_eff_blure.c index 370ca9481..775db80e1 100644 --- a/src/code/z_eff_blure.c +++ b/src/code/z_eff_blure.c @@ -561,16 +561,16 @@ void EffectBlure_DrawElemHermiteInterpolation(EffectBlure* this, EffectBlureElem vtx[0].v = baseVtx; vtx[1].v = baseVtx; - vtx[0].v.ob[0] = func_80086814(sp158.x); - vtx[0].v.ob[1] = func_80086814(sp158.y); - vtx[0].v.ob[2] = func_80086814(sp158.z); + vtx[0].v.ob[0] = Math_FNearbyIntF(sp158.x); + vtx[0].v.ob[1] = Math_FNearbyIntF(sp158.y); + vtx[0].v.ob[2] = Math_FNearbyIntF(sp158.z); vtx[0].v.cn[0] = sp148.r; vtx[0].v.cn[1] = sp148.g; vtx[0].v.cn[2] = sp148.b; vtx[0].v.cn[3] = sp148.a; - vtx[1].v.ob[0] = func_80086814(sp14C.x); - vtx[1].v.ob[1] = func_80086814(sp14C.y); - vtx[1].v.ob[2] = func_80086814(sp14C.z); + vtx[1].v.ob[0] = Math_FNearbyIntF(sp14C.x); + vtx[1].v.ob[1] = Math_FNearbyIntF(sp14C.y); + vtx[1].v.ob[2] = Math_FNearbyIntF(sp14C.z); vtx[1].v.cn[0] = sp144.r; vtx[1].v.cn[1] = sp144.g; vtx[1].v.cn[2] = sp144.b; @@ -606,17 +606,17 @@ void EffectBlure_DrawElemHermiteInterpolation(EffectBlure* this, EffectBlureElem vtx[j1].v = baseVtx; vtx[j2].v = baseVtx; - vtx[j1].v.ob[0] = func_80086814(sp158.x); - vtx[j1].v.ob[1] = func_80086814(sp158.y); - vtx[j1].v.ob[2] = func_80086814(sp158.z); + vtx[j1].v.ob[0] = Math_FNearbyIntF(sp158.x); + vtx[j1].v.ob[1] = Math_FNearbyIntF(sp158.y); + vtx[j1].v.ob[2] = Math_FNearbyIntF(sp158.z); vtx[j1].v.cn[0] = func_800B0A24(sp1A4.r, sp19C.r, temp_f28); vtx[j1].v.cn[1] = func_800B0A24(sp1A4.g, sp19C.g, temp_f28); vtx[j1].v.cn[2] = func_800B0A24(sp1A4.b, sp19C.b, temp_f28); vtx[j1].v.cn[3] = func_800B0A24(sp1A4.a, sp19C.a, temp_f28); - vtx[j2].v.ob[0] = func_80086814(sp14C.x); - vtx[j2].v.ob[1] = func_80086814(sp14C.y); - vtx[j2].v.ob[2] = func_80086814(sp14C.z); + vtx[j2].v.ob[0] = Math_FNearbyIntF(sp14C.x); + vtx[j2].v.ob[1] = Math_FNearbyIntF(sp14C.y); + vtx[j2].v.ob[2] = Math_FNearbyIntF(sp14C.z); vtx[j2].v.cn[0] = func_800B0A24(sp1A0.r, sp198.r, temp_f28); vtx[j2].v.cn[1] = func_800B0A24(sp1A0.g, sp198.g, temp_f28); vtx[j2].v.cn[2] = func_800B0A24(sp1A0.b, sp198.b, temp_f28); diff --git a/src/code/z_en_item00.c b/src/code/z_en_item00.c index 7b9e2ca34..886c3c942 100644 --- a/src/code/z_en_item00.c +++ b/src/code/z_en_item00.c @@ -127,7 +127,7 @@ void EnItem00_Init(Actor* thisx, PlayState* play) { break; case ITEM00_RECOVERY_HEART: - this->actor.home.rot.z = randPlusMinusPoint5Scaled(0xFFFF); + this->actor.home.rot.z = Rand_CenteredFloat(0xFFFF); shadowOffset = 430.0f; Actor_SetScale(&this->actor, 0.02f); this->unk154 = 0.02f; @@ -381,9 +381,9 @@ void func_800A6650(EnItem00* this, PlayState* play) { } if ((play->gameplayFrames & 1) != 0) { - pos.x = this->actor.world.pos.x + randPlusMinusPoint5Scaled(10.0f); - pos.y = this->actor.world.pos.y + randPlusMinusPoint5Scaled(10.0f); - pos.z = this->actor.world.pos.z + randPlusMinusPoint5Scaled(10.0f); + pos.x = this->actor.world.pos.x + Rand_CenteredFloat(10.0f); + pos.y = this->actor.world.pos.y + Rand_CenteredFloat(10.0f); + pos.z = this->actor.world.pos.z + Rand_CenteredFloat(10.0f); EffectSsKirakira_SpawnSmall(play, &pos, &sEffectVelocity, &sEffectAccel, &sEffectPrimColor, &sEffectEnvColor); } @@ -956,7 +956,7 @@ Actor* Item_DropCollectible(PlayState* play, Vec3f* spawnPos, u32 params) { } spawnedActor->speed = 2.0f; spawnedActor->gravity = -0.9f; - spawnedActor->world.rot.y = randPlusMinusPoint5Scaled(0x10000); + spawnedActor->world.rot.y = Rand_CenteredFloat(0x10000); Actor_SetScale(spawnedActor, 0.0f); ((EnItem00*)spawnedActor)->actionFunc = func_800A6780; ((EnItem00*)spawnedActor)->unk152 = 0xDC; @@ -1011,7 +1011,7 @@ Actor* Item_DropCollectible2(PlayState* play, Vec3f* spawnPos, s32 params) { } else { spawnedActor->gravity = -0.9f; } - spawnedActor->world.rot.y = randPlusMinusPoint5Scaled(0x10000); + spawnedActor->world.rot.y = Rand_CenteredFloat(0x10000); spawnedActor->flags |= 0x10; } } diff --git a/src/code/z_eventmgr.c b/src/code/z_eventmgr.c index e3defb402..121957396 100644 --- a/src/code/z_eventmgr.c +++ b/src/code/z_eventmgr.c @@ -36,7 +36,7 @@ ActorCutscene sGlobalCutsceneList[] = { typedef enum { /* 0 */ CS_START_0, /* 1 */ CS_START_1, - /* 2 */ CS_START_2, + /* 2 */ CS_START_2 } ActorCutsceneStartMethod; typedef struct { diff --git a/src/code/z_fbdemo_circle.c b/src/code/z_fbdemo_circle.c index addfe6b67..185373e06 100644 --- a/src/code/z_fbdemo_circle.c +++ b/src/code/z_fbdemo_circle.c @@ -2,7 +2,7 @@ typedef enum { /* 0 */ TRANS_CIRCLE_DIR_IN, - /* 1 */ TRANS_CIRCLE_DIR_OUT, + /* 1 */ TRANS_CIRCLE_DIR_OUT } TransitionCircleDirection; Gfx sTransCircleSetupDL[] = { diff --git a/src/code/z_fireobj.c b/src/code/z_fireobj.c index 5565bc876..98d14874b 100644 --- a/src/code/z_fireobj.c +++ b/src/code/z_fireobj.c @@ -67,8 +67,7 @@ void FireObj_StepSize(FireObj* fire) { if (Math_StepToF(&fire->dynamicSize, 1.0f, fire->dynamicSizeStep)) { FireObj_SetState(fire, fire->dynamicSizeStep, FIRE_STATE_FULLY_LIT); } - } else if ((fire->state == FIRE_STATE_SHRINKING) && - (Math_StepToF(&fire->dynamicSize, 0.0f, fire->dynamicSizeStep))) { + } else if ((fire->state == FIRE_STATE_SHRINKING) && Math_StepToF(&fire->dynamicSize, 0.0f, fire->dynamicSizeStep)) { FireObj_SetState(fire, fire->dynamicSizeStep, FIRE_STATE_NOT_LIT); } if (fire->sizeGrowsCos2 == 1) { diff --git a/src/code/z_game_dlftbls.c b/src/code/z_game_dlftbls.c index 1b82705f5..7336b01f6 100644 --- a/src/code/z_game_dlftbls.c +++ b/src/code/z_game_dlftbls.c @@ -1,6 +1,6 @@ #include "global.h" #include "overlays/gamestates/ovl_daytelop/z_daytelop.h" -#include "overlays/gamestates/ovl_file_choose/z_file_choose.h" +#include "overlays/gamestates/ovl_file_choose/z_file_select.h" #include "overlays/gamestates/ovl_opening/z_opening.h" #include "overlays/gamestates/ovl_select/z_select.h" #include "overlays/gamestates/ovl_title/z_title.h" diff --git a/src/code/z_game_over.c b/src/code/z_game_over.c index d0e5e45f2..c3c6819be 100644 --- a/src/code/z_game_over.c +++ b/src/code/z_game_over.c @@ -49,7 +49,7 @@ void GameOver_Update(PlayState* play) { } } - gSaveContext.unk_3DC0 = 2000; + gSaveContext.nayrusLoveTimer = 2000; gSaveContext.save.saveInfo.playerData.tatlTimer = 0; gSaveContext.seqId = (u8)NA_BGM_DISABLED; gSaveContext.ambienceId = AMBIENCE_ID_DISABLED; diff --git a/src/code/z_kaleido_scope_call.c b/src/code/z_kaleido_scope_call.c index d0f757125..1d2046e57 100644 --- a/src/code/z_kaleido_scope_call.c +++ b/src/code/z_kaleido_scope_call.c @@ -1,4 +1,3 @@ -#include "prevent_bss_reordering.h" #include "global.h" #include "z64shrink_window.h" #include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h" diff --git a/src/code/z_lib.c b/src/code/z_lib.c index 136918765..f3e67e5f3 100644 --- a/src/code/z_lib.c +++ b/src/code/z_lib.c @@ -348,9 +348,9 @@ void Math_Vec3f_SumScaled(Vec3f* a, Vec3f* b, f32 scale, Vec3f* dest) { } void Math_Vec3f_AddRand(Vec3f* orig, f32 scale, Vec3f* dest) { - dest->x = randPlusMinusPoint5Scaled(scale) + orig->x; - dest->y = randPlusMinusPoint5Scaled(scale) + orig->y; - dest->z = randPlusMinusPoint5Scaled(scale) + orig->z; + dest->x = Rand_CenteredFloat(scale) + orig->x; + dest->y = Rand_CenteredFloat(scale) + orig->y; + dest->z = Rand_CenteredFloat(scale) + orig->z; } void Math_Vec3f_DistXYZAndStoreNormDiff(Vec3f* a, Vec3f* b, f32 scale, Vec3f* dest) { diff --git a/src/code/z_lifemeter.c b/src/code/z_lifemeter.c index c9bea1669..7226a6719 100644 --- a/src/code/z_lifemeter.c +++ b/src/code/z_lifemeter.c @@ -16,14 +16,14 @@ s16 sBeatingHeartsDDEnv[3]; s16 sHeartsDDPrim[2][3]; s16 sHeartsDDEnv[2][3]; -TexturePtr sHeartTextures[] = { +static TexturePtr sHeartTextures[] = { gHeartFullTex, gHeartQuarterTex, gHeartQuarterTex, gHeartQuarterTex, gHeartQuarterTex, gHeartQuarterTex, gHeartHalfTex, gHeartHalfTex, gHeartHalfTex, gHeartHalfTex, gHeartHalfTex, gHeartThreeQuarterTex, gHeartThreeQuarterTex, gHeartThreeQuarterTex, gHeartThreeQuarterTex, gHeartThreeQuarterTex, }; -TexturePtr sHeartDDTextures[] = { +static TexturePtr sHeartDDTextures[] = { gDefenseHeartFullTex, gDefenseHeartQuarterTex, gDefenseHeartQuarterTex, gDefenseHeartQuarterTex, gDefenseHeartQuarterTex, gDefenseHeartQuarterTex, gDefenseHeartHalfTex, gDefenseHeartHalfTex, gDefenseHeartHalfTex, diff --git a/src/code/z_message.c b/src/code/z_message.c index 4755b4acf..38cdba5f8 100644 --- a/src/code/z_message.c +++ b/src/code/z_message.c @@ -5,6 +5,27 @@ #include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h" #if 0 +#define DEFINE_PERSON(_enum, _photo, _description, _metEnum, metMessage, _metFlag) metMessage, +#define DEFINE_EVENT(_enum, _icon, _colorFlag, _description, completedMessage, _completedFlag) completedMessage, + +u16 sBombersNotebookEventMessages[BOMBERS_NOTEBOOK_EVENT_MAX] = { +#include "tables/bombers_notebook/person_table.h" +#include "tables/bombers_notebook/event_table.h" +}; + +#undef DEFINE_PERSON +#undef DEFINE_EVENT + +#define DEFINE_PERSON(_enum, _photo, _description, _metEnum, _metMessage, metFlag) metFlag, +#define DEFINE_EVENT(_enum, _icon, _colorFlag, _description, _completedMessage, completedFlag) completedFlag, + +u16 gBombersNotebookWeekEventFlags[BOMBERS_NOTEBOOK_EVENT_MAX] = { +#include "tables/bombers_notebook/person_table.h" +#include "tables/bombers_notebook/event_table.h" +}; + +#undef DEFINE_PERSON +#undef DEFINE_EVENT s16 D_801D02D8[15] = { ACTOR_OCEFF_WIPE5, ACTOR_OCEFF_WIPE5, // Sonata of Awakening Effect, Sonata of Awakening Effect @@ -20,8 +41,6 @@ s32 D_801D02F8[15] = { 0,1,2,3,4,0,1,0,0,0,0,0,1,1,0 }; #endif -extern u16 D_801C6AB8[]; -extern u16 D_801C6B28[]; extern s16 D_801D02D8[]; extern s32 D_801D02F8[]; extern s16 D_801F6B0C; @@ -225,6 +244,7 @@ void Message_LoadChar(PlayState* play, u16 codePointIndex, s32* offset, f32* arg *arg3 = temp2; } +// TODO: SJIS support // Message_LoadRupees JPN ? void func_8014CCB4(PlayState* play, s16* decodedBufPos, s32* offset, f32* arg3) { MessageContext* msgCtx = &play->msgCtx; @@ -240,7 +260,7 @@ void func_8014CCB4(PlayState* play, s16* decodedBufPos, s32* offset, f32* arg3) k += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.wchar[t] = 0x8373; t += 1; - Font_LoadChar(play, 0x815C, k); // Ox815C = ― in JISX0213 + Font_LoadChar(play, 0x815C, k); // 0x815C = ― in JISX0213 k += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.wchar[t] = 0x815C; @@ -365,19 +385,19 @@ void func_80151A68(PlayState* play, u16 textId) { } } -void func_80151BB4(PlayState* play, u8 arg1) { +void Message_BombersNotebookQueueEvent(PlayState* play, u8 event) { MessageContext* msgCtx = &play->msgCtx; - u8 temp = arg1; if (CHECK_QUEST_ITEM(QUEST_BOMBERS_NOTEBOOK)) { - if (!CHECK_WEEKEVENTREG(D_801C6B28[arg1])) { - msgCtx->unk120B2[msgCtx->unk120B1] = temp; - msgCtx->unk120B1++; + if (!CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags[event])) { + msgCtx->bombersNotebookEventQueue[msgCtx->bombersNotebookEventQueueCount] = event; + msgCtx->bombersNotebookEventQueueCount++; } - } else if (arg1 >= 20) { - if (!CHECK_WEEKEVENTREG(D_801C6B28[arg1])) { - msgCtx->unk120B2[msgCtx->unk120B1] = temp; - msgCtx->unk120B1++; + } else if (event >= BOMBERS_NOTEBOOK_PERSON_MAX) { + // Non MET events are processed even if the player does not have the notebook yet + if (!CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags[event])) { + msgCtx->bombersNotebookEventQueue[msgCtx->bombersNotebookEventQueueCount] = event; + msgCtx->bombersNotebookEventQueueCount++; } } } @@ -386,16 +406,22 @@ u32 func_80151C9C(PlayState* play) { MessageContext* msgCtx = &play->msgCtx; while (true) { - if (msgCtx->unk120B1 == 0) { + if (msgCtx->bombersNotebookEventQueueCount == 0) { return false; } - msgCtx->unk120B1--; - - if (!CHECK_WEEKEVENTREG(D_801C6B28[msgCtx->unk120B2[msgCtx->unk120B1]])) { - SET_WEEKEVENTREG(D_801C6B28[msgCtx->unk120B2[msgCtx->unk120B1]]); - - if ((D_801C6AB8[msgCtx->unk120B2[msgCtx->unk120B1]] != 0) && CHECK_QUEST_ITEM(QUEST_BOMBERS_NOTEBOOK)) { - Message_ContinueTextbox(play, D_801C6AB8[msgCtx->unk120B2[msgCtx->unk120B1]]); + msgCtx->bombersNotebookEventQueueCount--; + + if (!CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags + [msgCtx->bombersNotebookEventQueue[msgCtx->bombersNotebookEventQueueCount]])) { + SET_WEEKEVENTREG(gBombersNotebookWeekEventFlags + [msgCtx->bombersNotebookEventQueue[msgCtx->bombersNotebookEventQueueCount]]); + + if ((sBombersNotebookEventMessages + [msgCtx->bombersNotebookEventQueue[msgCtx->bombersNotebookEventQueueCount]] != 0) && + CHECK_QUEST_ITEM(QUEST_BOMBERS_NOTEBOOK)) { + Message_ContinueTextbox( + play, sBombersNotebookEventMessages + [msgCtx->bombersNotebookEventQueue[msgCtx->bombersNotebookEventQueueCount]]); play_sound(NA_SE_SY_SCHEDULE_WRITE); return true; } @@ -476,7 +502,7 @@ u8 Message_GetState(MessageContext* msgCtx) { if (msgCtx->msgMode == 0x40) { return TEXT_STATE_13; } - if ((msgCtx->msgMode == 0x43) && (msgCtx->stateTimer == 1) && (msgCtx->unk120B1 == 0)) { + if ((msgCtx->msgMode == 0x43) && (msgCtx->stateTimer == 1) && (msgCtx->bombersNotebookEventQueueCount == 0)) { return TEXT_STATE_CLOSING; } diff --git a/src/code/z_olib.c b/src/code/z_olib.c index 754857014..848a48a72 100644 --- a/src/code/z_olib.c +++ b/src/code/z_olib.c @@ -123,14 +123,14 @@ VecSph* OLib_Vec3fToVecSph(VecSph* dest, Vec3f* vec) { if ((distXZ == 0.0f) && (vec->y == 0.0f)) { sph.pitch = 0; } else { - sph.pitch = CAM_DEG_TO_BINANG(RAD_TO_DEG(func_80086B30(distXZ, vec->y))); + sph.pitch = CAM_DEG_TO_BINANG(RAD_TO_DEG(Math_FAtan2F(distXZ, vec->y))); } sph.r = sqrtf(SQ(vec->y) + distXZSq); if ((vec->x == 0.0f) && (vec->z == 0.0f)) { sph.yaw = 0; } else { - sph.yaw = CAM_DEG_TO_BINANG(RAD_TO_DEG(func_80086B30(vec->x, vec->z))); + sph.yaw = CAM_DEG_TO_BINANG(RAD_TO_DEG(Math_FAtan2F(vec->x, vec->z))); } *dest = sph; @@ -202,8 +202,8 @@ Vec3f* OLib_AddVecGeoToVec3f(Vec3f* dest, Vec3f* a, VecGeo* geo) { Vec3f* OLib_Vec3fDiffRad(Vec3f* dest, Vec3f* a, Vec3f* b) { Vec3f anglesRad; - anglesRad.x = func_80086B30(b->z - a->z, b->y - a->y); - anglesRad.y = func_80086B30(b->x - a->x, b->z - a->z); + anglesRad.x = Math_FAtan2F(b->z - a->z, b->y - a->y); + anglesRad.y = Math_FAtan2F(b->x - a->x, b->z - a->z); anglesRad.z = 0; *dest = anglesRad; diff --git a/src/code/z_parameter.c b/src/code/z_parameter.c index 918c969d5..28ba0d36e 100644 --- a/src/code/z_parameter.c +++ b/src/code/z_parameter.c @@ -23,11 +23,11 @@ typedef enum { #define DO_ACTION_TEX_SIZE ((DO_ACTION_TEX_WIDTH * DO_ACTION_TEX_HEIGHT) / 2) // (sizeof(gCheckDoActionENGTex)) typedef struct { - /* 0x00 */ u8 scene; - /* 0x01 */ u8 flags1; - /* 0x02 */ u8 flags2; - /* 0x03 */ u8 flags3; -} RestrictionFlags; + /* 0x0 */ u8 scene; + /* 0x1 */ u8 flags1; + /* 0x2 */ u8 flags2; + /* 0x3 */ u8 flags3; +} RestrictionFlags; // size = 0x4 Input sPostmanTimerInput[MAXCONTROLLERS]; @@ -147,7 +147,7 @@ s16 D_801BF97C = 255; f32 D_801BF980 = 1.0f; s32 D_801BF984 = 0; -Gfx sScreenFillSetupDL[] = { +static Gfx sScreenFillSetupDL[] = { gsDPPipeSync(), gsSPClearGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), diff --git a/src/code/z_play.c b/src/code/z_play.c index dade44cf6..9063c9151 100644 --- a/src/code/z_play.c +++ b/src/code/z_play.c @@ -1,5 +1,6 @@ #include "global.h" #include "buffers.h" +#include "z64bombers_notebook.h" #include "z64debug_display.h" #include "z64quake.h" #include "z64rumble.h" @@ -7,7 +8,7 @@ #include "z64view.h" #include "overlays/gamestates/ovl_daytelop/z_daytelop.h" #include "overlays/gamestates/ovl_opening/z_opening.h" -#include "overlays/gamestates/ovl_file_choose/z_file_choose.h" +#include "overlays/gamestates/ovl_file_choose/z_file_select.h" #include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h" s32 gDbgCamEnabled = false; @@ -1036,9 +1037,9 @@ void Play_UpdateMain(PlayState* this) { if (this->sramCtx.status != 0) { if (gSaveContext.save.isOwlSave) { - func_80147198(&this->sramCtx); + Sram_UpdateWriteToFlashOwlSave(&this->sramCtx); } else { - func_80147068(&this->sramCtx); + Sram_UpdateWriteToFlashDefault(&this->sramCtx); } } } @@ -1051,14 +1052,14 @@ void Play_Update(PlayState* this) { if (!sBombersNotebookOpen) { if (this->pauseCtx.bombersNotebookOpen) { sBombersNotebookOpen = true; - sBombersNotebook.unk_00 = 0; + sBombersNotebook.loadState = BOMBERS_NOTEBOOK_LOAD_STATE_NONE; } } else if (CHECK_BTN_ALL(CONTROLLER1(&this->state)->press.button, BTN_L) || CHECK_BTN_ALL(CONTROLLER1(&this->state)->press.button, BTN_B) || CHECK_BTN_ALL(CONTROLLER1(&this->state)->press.button, BTN_START) || (gIrqMgrResetStatus != 0)) { sBombersNotebookOpen = false; this->pauseCtx.bombersNotebookOpen = false; - sBombersNotebook.unk_00 = 0; + sBombersNotebook.loadState = BOMBERS_NOTEBOOK_LOAD_STATE_NONE; this->msgCtx.msgLength = 0; this->msgCtx.msgMode = 0; this->msgCtx.currentTextId = 0; @@ -1116,7 +1117,7 @@ void Play_PostWorldDraw(PlayState* this) { } #ifdef NON_MATCHING -// Stack issues and 1 small issue around Play_PostWorldDraw +// Something weird going on with the stack of the unused arg0 of `Camera_Update` void Play_DrawMain(PlayState* this) { GraphicsContext* gfxCtx = this->state.gfxCtx; Lights* sp268; @@ -1269,11 +1270,11 @@ void Play_DrawMain(PlayState* this) { if (!this->unk_18844) { if (1) { - if ((this->skyboxId != SKYBOX_NONE) && !this->envCtx.skyboxDisabled) { + if (((u32)this->skyboxId != SKYBOX_NONE) && !this->envCtx.skyboxDisabled) { if ((this->skyboxId == SKYBOX_NORMAL_SKY) || (this->skyboxId == SKYBOX_3)) { Environment_UpdateSkybox(this->skyboxId, &this->envCtx, &this->skyboxCtx); - Skybox_Draw(&this->skyboxCtx, gfxCtx, this->skyboxId, this->envCtx.unk_13, this->view.eye.x, - this->view.eye.y, this->view.eye.z); + 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.skyboxShouldDraw) { Skybox_Draw(&this->skyboxCtx, gfxCtx, this->skyboxId, 0, this->view.eye.x, this->view.eye.y, this->view.eye.z); @@ -1305,10 +1306,11 @@ void Play_DrawMain(PlayState* this) { if (this->skyboxCtx.skyboxShouldDraw) { Vec3f sp78; - if (1) {} - Camera_GetQuakeOffset(&sp78, GET_ACTIVE_CAM(this)); - Skybox_Draw(&this->skyboxCtx, gfxCtx, this->skyboxId, 0, this->view.eye.x + sp78.x, - this->view.eye.y + sp78.y, this->view.eye.z + sp78.z); + if (1) { + Camera_GetQuakeOffset(&sp78, GET_ACTIVE_CAM(this)); + Skybox_Draw(&this->skyboxCtx, gfxCtx, this->skyboxId, 0, this->view.eye.x + sp78.x, + this->view.eye.y + sp78.y, this->view.eye.z + sp78.z); + } } // envCtx.precipitation[PRECIP_RAIN_CUR] @@ -1369,9 +1371,8 @@ void Play_DrawMain(PlayState* this) { Play_DrawMotionBlur(this); - if (((R_PAUSE_BG_PRERENDER_STATE == PAUSE_BG_PRERENDER_SETUP) || - (gTransitionTileState == TRANS_TILE_SETUP)) || - (R_PICTO_PHOTO_STATE == PICTO_PHOTO_STATE_SETUP)) { + if ((R_PAUSE_BG_PRERENDER_STATE == PAUSE_BG_PRERENDER_SETUP) || + (gTransitionTileState == TRANS_TILE_SETUP) || (R_PICTO_PHOTO_STATE == PICTO_PHOTO_STATE_SETUP)) { Gfx* sp74; Gfx* sp70 = POLY_OPA_DISP; @@ -1404,15 +1405,18 @@ void Play_DrawMain(PlayState* this) { POLY_OPA_DISP = sp74; this->unk_18B49 = 2; SREG(33) |= 1; - } else { - PostWorldDraw: - if (1) { - Play_PostWorldDraw(this); - } + goto SkipPostWorldDraw; + } + + PostWorldDraw: + if (1) { + Play_PostWorldDraw(this); } } } +SkipPostWorldDraw: + if ((this->view.unk164 != 0) && !gDbgCamEnabled) { Vec3s sp4C; @@ -1428,7 +1432,7 @@ void Play_DrawMain(PlayState* this) { func_800FE3E0(this); } - CLOSE_DISPS(this->state.gfxCtx); + CLOSE_DISPS(gfxCtx); } #else void Play_DrawMain(PlayState* this); @@ -2217,7 +2221,7 @@ void Play_Init(GameState* thisx) { if (((gSaveContext.gameMode != GAMEMODE_NORMAL) && (gSaveContext.gameMode != GAMEMODE_TITLE_SCREEN)) || (gSaveContext.save.cutsceneIndex >= 0xFFF0)) { - gSaveContext.unk_3DC0 = 0; + gSaveContext.nayrusLoveTimer = 0; Magic_Reset(this); gSaveContext.sceneLayer = (gSaveContext.save.cutsceneIndex & 0xF) + 1; diff --git a/src/code/z_play_hireso.c b/src/code/z_play_hireso.c index 829fe71f2..b995028ca 100644 --- a/src/code/z_play_hireso.c +++ b/src/code/z_play_hireso.c @@ -1,27 +1,1363 @@ #include "global.h" +#include "z64bombers_notebook.h" +#include "interface/schedule_static/schedule_static.h" -#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/func_8016AC10.s") +// TODO: Needs YAZ0 +// Segment 0x07 schedule_dma_static_test +extern TexturePtr D_07000000; +extern TexturePtr D_07000800; +extern TexturePtr D_07001000; +extern TexturePtr D_07001800; +extern TexturePtr D_07002000; +extern TexturePtr D_07002800; +extern TexturePtr D_07003000; +extern TexturePtr D_07003800; +extern TexturePtr D_07004000; +extern TexturePtr D_07004800; +extern TexturePtr D_07005000; +extern TexturePtr D_07005800; +extern TexturePtr D_07006000; +extern TexturePtr D_07006800; +extern TexturePtr D_07007000; +extern TexturePtr D_07007800; +extern TexturePtr D_07008000; +extern TexturePtr D_07008800; +extern TexturePtr D_07009000; +extern TexturePtr D_07009800; +extern TexturePtr D_0700AC00; +extern TexturePtr D_0700AEA0; -#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/func_8016AE1C.s") +#define BOMBERS_NOTEBOOK_ENTRY_SIZE 3 +#define BOMBERS_NOTEBOOK_ENTRY_MAX 10 -#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/func_8016B278.s") +#define BOMBERS_NOTEBOOK_ENTRY_GET_DAY(row, entry) (((&sBombersNotebookEntries[row][entry])[0] & 0xF00) >> 8) +#define BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(row, entry) ((&sBombersNotebookEntries[row][entry])[0] & 0xFF) +#define BOMBERS_NOTEBOOK_ENTRY_GET_START_TIME(row, entry) ((&sBombersNotebookEntries[row][entry])[1]) +#define BOMBERS_NOTEBOOK_ENTRY_GET_END_TIME(row, entry) ((&sBombersNotebookEntries[row][entry])[2]) -#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/func_8016B4B0.s") +#define BOMBERS_NOTEBOOK_ENTRY(pos, day, event, startTime, endTime) \ + ((pos)&0xF000) | (((day)&0xF) << 8) | ((event)&0xFF), (startTime), (endTime) +#define BOMBERS_NOTEBOOK_ENTRY_END 0x9999 -#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/func_8016C344.s") +#define BOMBERS_NOTEBOOK_ENTRY_POS_CENTER 0x0000 +#define BOMBERS_NOTEBOOK_ENTRY_POS_BELOW 0x4000 +#define BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE 0x8000 -#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/func_8016CD4C.s") +typedef enum { + /* 0 */ BOMBERS_NOTEBOOK_EVENT_ICON_EXCLAMATION_POINT, + /* 1 */ BOMBERS_NOTEBOOK_EVENT_ICON_MASK, + /* 2 */ BOMBERS_NOTEBOOK_EVENT_ICON_RIBBON +} BombersNotebookEventIcon; -#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/func_8016E40C.s") +#define BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE 0xFFF0 +#define BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI 0xFFF1 -#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/func_8016EA90.s") +u16 sBombersNotebookEntries[BOMBERS_NOTEBOOK_PERSON_MAX][BOMBERS_NOTEBOOK_ENTRY_MAX * BOMBERS_NOTEBOOK_ENTRY_SIZE] = { + { + /* Bombers */ + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 1, BOMBERS_NOTEBOOK_EVENT_LEARNED_SECRET_CODE, + CLOCK_TIME(6, 0), CLOCK_TIME(5, 59)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BOMBERS_NOTEBOOK, + CLOCK_TIME(6, 0), CLOCK_TIME(5, 59)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 2, BOMBERS_NOTEBOOK_EVENT_LEARNED_SECRET_CODE, + CLOCK_TIME(6, 0), CLOCK_TIME(5, 59)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BOMBERS_NOTEBOOK, + CLOCK_TIME(6, 0), CLOCK_TIME(5, 59)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 3, BOMBERS_NOTEBOOK_EVENT_LEARNED_SECRET_CODE, + CLOCK_TIME(6, 0), CLOCK_TIME(5, 59)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BOMBERS_NOTEBOOK, + CLOCK_TIME(6, 0), CLOCK_TIME(5, 59)), + BOMBERS_NOTEBOOK_ENTRY_END, + }, + { + /* Anju */ + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROOM_KEY, + CLOCK_TIME(13, 45), CLOCK_TIME(16, 0)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 1, BOMBERS_NOTEBOOK_EVENT_PROMISED_MIDNIGHT_MEETING, + CLOCK_TIME(14, 30), CLOCK_TIME(20, 0)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 1, BOMBERS_NOTEBOOK_EVENT_PROMISED_TO_MEET_KAFEI, + CLOCK_TIME(23, 30), CLOCK_TIME(5, 59)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_LETTER_TO_KAFEI, + CLOCK_TIME(23, 30), CLOCK_TIME(5, 59)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, + BOMBERS_NOTEBOOK_EVENT_DELIVERED_PENDANT_OF_MEMORIES, CLOCK_TIME(17, 0), + CLOCK_TIME(21, 0)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, + BOMBERS_NOTEBOOK_EVENT_DELIVERED_PENDANT_OF_MEMORIES, CLOCK_TIME(6, 0), + CLOCK_TIME(12, 0)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_COUPLES_MASK, + CLOCK_TIME(5, 0), CLOCK_TIME(5, 59)), + BOMBERS_NOTEBOOK_ENTRY_END, + }, + { + /* Kafei */ + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, + BOMBERS_NOTEBOOK_EVENT_RECEIVED_PENDANT_OF_MEMORIES, CLOCK_TIME(16, 30), + CLOCK_TIME(22, 0)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_ESCAPED_SAKONS_HIDEOUT, + CLOCK_TIME(18, 0), CLOCK_TIME(19, 0)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_COUPLES_MASK, + CLOCK_TIME(5, 0), CLOCK_TIME(5, 59)), + BOMBERS_NOTEBOOK_ENTRY_END, + }, + { + /* Curiosity Shop Man */ + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_KEATON_MASK, + CLOCK_TIME(13, 0), CLOCK_TIME(22, 0)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_PRIORITY_MAIL, + CLOCK_TIME(13, 0), CLOCK_TIME(22, 0)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_ALL_NIGHT_MASK, + CLOCK_TIME(22, 0), CLOCK_TIME(5, 59)), + BOMBERS_NOTEBOOK_ENTRY_END, + }, + { + /* Old Lady from Bomb Shop */ + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BLAST_MASK, + CLOCK_TIME(0, 30), CLOCK_TIME(1, 0)), + BOMBERS_NOTEBOOK_ENTRY_END, + }, + { + /* Romani */ + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_PROMISED_TO_HELP_WITH_THEM, + CLOCK_TIME(6, 0), CLOCK_TIME(18, 0)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 1, BOMBERS_NOTEBOOK_EVENT_DEFENDED_AGAINST_THEM, + CLOCK_TIME(2, 30), CLOCK_TIME(5, 15)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_MILK_BOTTLE, + CLOCK_TIME(2, 30), CLOCK_TIME(5, 15)), + BOMBERS_NOTEBOOK_ENTRY_END, + }, + { + /* Cremia */ + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 2, BOMBERS_NOTEBOOK_EVENT_ESCORTED_CREMIA, + CLOCK_TIME(18, 0), CLOCK_TIME(21, 0)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROMANIS_MASK, + CLOCK_TIME(18, 0), CLOCK_TIME(21, 0)), + BOMBERS_NOTEBOOK_ENTRY_END, + }, + { + /* Mayor Dotour */ + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_MAYOR_HP, + CLOCK_TIME(8, 0), CLOCK_TIME(20, 0)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_MAYOR_HP, + CLOCK_TIME(8, 0), CLOCK_TIME(20, 0)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_MAYOR_HP, + CLOCK_TIME(8, 0), CLOCK_TIME(18, 0)), + BOMBERS_NOTEBOOK_ENTRY_END, + }, + { + /* Madame Aroma */ + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAFEIS_MASK, + CLOCK_TIME(8, 0), CLOCK_TIME(20, 0)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAFEIS_MASK, + CLOCK_TIME(8, 0), CLOCK_TIME(20, 0)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_DELIVERED_PRIORITY_MAIL, + CLOCK_TIME(18, 0), CLOCK_TIME(5, 59)), + BOMBERS_NOTEBOOK_ENTRY_END, + }, + { + /* Toto */ + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, + BOMBERS_NOTEBOOK_EVENT_RECEIVED_CIRCUS_LEADERS_MASK, CLOCK_TIME(22, 0), + CLOCK_TIME(5, 0)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, + BOMBERS_NOTEBOOK_EVENT_RECEIVED_CIRCUS_LEADERS_MASK, CLOCK_TIME(22, 0), + CLOCK_TIME(5, 0)), + BOMBERS_NOTEBOOK_ENTRY_END, + }, + { + /* Gorman */ + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, + BOMBERS_NOTEBOOK_EVENT_RECEIVED_CIRCUS_LEADERS_MASK, CLOCK_TIME(22, 0), + CLOCK_TIME(5, 0)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, + BOMBERS_NOTEBOOK_EVENT_RECEIVED_CIRCUS_LEADERS_MASK, CLOCK_TIME(22, 0), + CLOCK_TIME(5, 0)), + BOMBERS_NOTEBOOK_ENTRY_END, + }, + { + /* Postman */ + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_POSTMAN_HP, + CLOCK_TIME(15, 0), CLOCK_TIME(0, 0)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_DEPOSITED_LETTER_TO_KAFEI, + CLOCK_TIME(0, 0), CLOCK_TIME(5, 59)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_DEPOSITED_LETTER_TO_KAFEI, + CLOCK_TIME(6, 0), CLOCK_TIME(12, 0)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_POSTMAN_HP, + CLOCK_TIME(15, 0), CLOCK_TIME(0, 0)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_POSTMANS_HAT, + CLOCK_TIME(18, 0), CLOCK_TIME(5, 59)), + BOMBERS_NOTEBOOK_ENTRY_END, + }, + { + /* Rosa Sisters */ + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROSA_SISTERS_HP, + CLOCK_TIME(18, 0), CLOCK_TIME(5, 59)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROSA_SISTERS_HP, + CLOCK_TIME(18, 0), CLOCK_TIME(5, 59)), + BOMBERS_NOTEBOOK_ENTRY_END, + }, + { + /* ??? */ + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_TOILET_HAND_HP, + CLOCK_TIME(0, 0), CLOCK_TIME(5, 59)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_TOILET_HAND_HP, + CLOCK_TIME(0, 0), CLOCK_TIME(5, 59)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_TOILET_HAND_HP, + CLOCK_TIME(0, 0), CLOCK_TIME(5, 59)), + BOMBERS_NOTEBOOK_ENTRY_END, + }, + { + /* Anju's Grandmother */ + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 1, + BOMBERS_NOTEBOOK_EVENT_RECEIVED_GRANDMA_SHORT_STORY_HP, CLOCK_TIME(8, 0), + CLOCK_TIME(18, 0)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 1, + BOMBERS_NOTEBOOK_EVENT_RECEIVED_GRANDMA_LONG_STORY_HP, CLOCK_TIME(8, 0), + CLOCK_TIME(18, 0)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE, 2, + BOMBERS_NOTEBOOK_EVENT_RECEIVED_GRANDMA_SHORT_STORY_HP, CLOCK_TIME(8, 0), + CLOCK_TIME(18, 0)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_BELOW, 2, + BOMBERS_NOTEBOOK_EVENT_RECEIVED_GRANDMA_LONG_STORY_HP, CLOCK_TIME(8, 0), + CLOCK_TIME(18, 0)), + BOMBERS_NOTEBOOK_ENTRY_END, + }, + { + /* Kamaro */ + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAMAROS_MASK, + CLOCK_TIME(0, 0), CLOCK_TIME(5, 59)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAMAROS_MASK, + CLOCK_TIME(0, 0), CLOCK_TIME(5, 59)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAMAROS_MASK, + CLOCK_TIME(0, 0), CLOCK_TIME(5, 59)), + BOMBERS_NOTEBOOK_ENTRY_END, + }, + { + /* Grog */ + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BUNNY_HOOD, + CLOCK_TIME(6, 0), CLOCK_TIME(20, 0)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BUNNY_HOOD, + CLOCK_TIME(6, 0), CLOCK_TIME(20, 0)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BUNNY_HOOD, + CLOCK_TIME(6, 0), CLOCK_TIME(20, 0)), + BOMBERS_NOTEBOOK_ENTRY_END, + }, + { + /* Gorman Brothers */ + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_GAROS_MASK, + CLOCK_TIME(6, 0), CLOCK_TIME(18, 0)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_GAROS_MASK, + CLOCK_TIME(6, 0), CLOCK_TIME(18, 0)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_ESCORTED_CREMIA, + CLOCK_TIME(18, 0), CLOCK_TIME(21, 0)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_GAROS_MASK, + CLOCK_TIME(6, 0), CLOCK_TIME(18, 0)), + BOMBERS_NOTEBOOK_ENTRY_END, + }, + { + /* Shiro */ + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_STONE_MASK, + CLOCK_TIME(6, 0), CLOCK_TIME(5, 59)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_STONE_MASK, + CLOCK_TIME(6, 0), CLOCK_TIME(5, 59)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 3, BOMBERS_NOTEBOOK_EVENT_RECEIVED_STONE_MASK, + CLOCK_TIME(6, 0), CLOCK_TIME(5, 59)), + BOMBERS_NOTEBOOK_ENTRY_END, + }, + { + /* Guru-Guru */ + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 1, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BREMEN_MASK, + CLOCK_TIME(18, 0), CLOCK_TIME(5, 59)), + BOMBERS_NOTEBOOK_ENTRY(BOMBERS_NOTEBOOK_ENTRY_POS_CENTER, 2, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BREMEN_MASK, + CLOCK_TIME(18, 0), CLOCK_TIME(5, 59)), + BOMBERS_NOTEBOOK_ENTRY_END, + }, +}; -#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/BombersNotebook_Draw.s") +s16 sBombersNotebookDayRectRectLeft[] = { 120, 120, 270, 420 }; +TexturePtr sBombersNotebookDayTextures[] = { + gBombersNotebookDay1stTex, + gBombersNotebookDay2ndTex, + gBombersNotebookDayFinalTex, +}; -#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/func_8016F4EC.s") +#define DEFINE_EVENT(_enum, icon, _colorFlag, _description, _completedMessage, _completedFlag) icon, -#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/BombersNotebook_Update.s") +s32 sBombersNotebookEventIcons[] = { +#include "tables/bombers_notebook/event_table.h" +}; -#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/BombersNotebook_Init.s") +#undef DEFINE_EVENT -#pragma GLOBAL_ASM("asm/non_matchings/code/z_play_hireso/BombersNotebook_Destroy.s") +s32 sBombersNotebookEventIconWidths[] = { 16, 24, 32 }; +s32 sBombersNotebookEventIconHeights[] = { 16, 28, 28 }; + +#define DEFINE_EVENT(_enum, _icon, colorFlag, _description, _completedMessage, _completedFlag) colorFlag, + +u16 sBombersNotebookEventColorWeekEventFlags[] = { +#include "tables/bombers_notebook/event_table.h" +}; + +#undef DEFINE_EVENT + +void BombersNotebook_DrawScisTexRect(Gfx** gfxP, s32 rxl, s32 ryl, s32 rxh, s32 ryh, s32 tile, s32 s, s32 t, s32 dsdx, + s32 dtdy) { + s32 xl = rxl - (gCfbLeftAdjust * 4); + s32 yl = ryl - (gCfbUpperAdjust * 4); + s32 xh = rxh - (gCfbLeftAdjust * 4); + s32 yh = ryh - (gCfbUpperAdjust * 4); + Gfx* gfx = *gfxP; + + gSPScisTextureRectangle(gfx++, xl, yl, xh, yh, tile, s, t, dsdx, dtdy); + + *gfxP = gfx; +} + +s16 sBombersNotebookHeaderColors[][3] = { + { 116, 134, 146 }, // Column 1 + { 158, 156, 131 }, // Column 2 + { 174, 141, 151 }, // Column 3 +}; + +void BombersNotebook_DrawHeaders(Gfx** gfxP) { + Gfx* gfx = *gfxP; + s32 i; + s32 rectLeft; + + gDPLoadTextureBlock(gfx++, gBombersNotebookHeaderBoxTex, G_IM_FMT_I, G_IM_SIZ_8b, 8, 24, 0, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 3, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + for (i = 0, rectLeft = 120; i < ARRAY_COUNT(sBombersNotebookHeaderColors); i++, rectLeft += 150) { + gDPSetPrimColor(gfx++, 0, 0, sBombersNotebookHeaderColors[i][0], sBombersNotebookHeaderColors[i][1], + sBombersNotebookHeaderColors[i][2], 192); + BombersNotebook_DrawScisTexRect(&gfx, rectLeft * 4, 74 * 4, (rectLeft + 143) * 4, 98 * 4, 0, 0, 0, 1 << 10, + 1 << 10); + } + + gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255); + for (i = 0, rectLeft = 124; i < ARRAY_COUNT(sBombersNotebookDayTextures); i++, rectLeft += 150) { + gDPLoadTextureBlock(gfx++, sBombersNotebookDayTextures[i], G_IM_FMT_IA, G_IM_SIZ_8b, 48, 22, 0, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, + G_TX_NOLOD); + BombersNotebook_DrawScisTexRect(&gfx, rectLeft * 4, 77 * 4, (rectLeft + 48) * 4, 99 * 4, 0, 0, 0, 1 << 10, + 1 << 10); + } + + rectLeft = 172; + gDPLoadTextureBlock_4b(gfx++, gBombersNotebook1800Tex, G_IM_FMT_IA, 48, 11, 0, G_TX_NOMIRROR | G_TX_WRAP, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + for (i = 0; i < 3; i++) { + BombersNotebook_DrawScisTexRect(&gfx, rectLeft * 4, 86 * 4, (rectLeft + 48) * 4, 97 * 4, 0, 0, 0, 1 << 10, + 1 << 10); + rectLeft += 150; + } + + gDPPipeSync(gfx++); + *gfxP = gfx; +} + +// Each column/day gets subdivided into 4 sub columns, the first 2 sub columns use 1 color, the last 2 another +s16 sBombersNotebookColumnColors[][2][3] = { + { { 165, 183, 195 }, { 140, 158, 170 } }, // Column 1 + { { 197, 195, 172 }, { 172, 170, 147 } }, // Column 2 + { { 223, 190, 200 }, { 190, 165, 175 } }, // Column 3 +}; + +void BombersNotebook_DrawColumns(Gfx** gfxP) { + Gfx* gfx = *gfxP; + s16* color; + s32 i; + s32 j; + s32 k; + s32 columnRectLeft; + s32 subColumnRectLeft; + s32 pad; + + gDPLoadTextureBlock_4b(gfx++, gBombersNotebookSubColumnBoxTex, G_IM_FMT_I, 48, 1, 0, G_TX_NOMIRROR | G_TX_WRAP, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + + color = &sBombersNotebookColumnColors[0][0][0]; + for (i = 0, columnRectLeft = 120; i < ARRAY_COUNT(sBombersNotebookColumnColors); i++, columnRectLeft += 150) { + subColumnRectLeft = columnRectLeft; + for (j = 0; j < 2; j++) { + gDPSetPrimColor(gfx++, 0, 0, color[0], color[1], color[2], 192); + for (k = 0; k < 2; k++) { + BombersNotebook_DrawScisTexRect(&gfx, subColumnRectLeft * 4, 104 * 4, (subColumnRectLeft + 48) * 4, + 480 * 4, 0, 0, 0, 1 << 10, 1 << 10); + subColumnRectLeft += 36; + } + color += 3; + } + } + + gDPPipeSync(gfx++); + *gfxP = gfx; +} + +TexturePtr sBombersNotebookEventIconTextures[] = { + gBombersNotebookEntryIconExclamationPointTex, + &D_0700AC00, + &D_0700AEA0, +}; +s16 sBombersNotebookEntryIconColors[][3] = { + { 255, 255, 0 }, + { 141, 255, 182 }, + { 255, 100, 60 }, +}; + +void BombersNotebook_DrawEntries(Gfx** gfxP, s32 row, u32 rectTop) { + Gfx* gfx = *gfxP; + s32 entryRectLeft; + u32 eventIcon; + u32 unfinishedEvent = false; + u16 startTime; + u16 endTime; + s32 j = 0; + u32 iconRectLeft; + s32 entryRectRight; + u32 yOffset; + s32 entryWidth; + + while (true) { + if (sBombersNotebookEntries[row][j] == BOMBERS_NOTEBOOK_ENTRY_END) { + if (!unfinishedEvent) { + gDPPipeSync(gfx++); + gDPSetCombineLERP(gfx++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, + PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); + gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, 255); + gDPSetEnvColor(gfx++, 0, 0, 0, 255); + gDPLoadTextureBlock(gfx++, gBombersNotebookStampTex, G_IM_FMT_IA, G_IM_SIZ_8b, 32, 48, 0, + G_TX_MIRROR | G_TX_WRAP, G_TX_MIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, + G_TX_NOLOD, G_TX_NOLOD); + BombersNotebook_DrawScisTexRect(&gfx, 567 * 4, (rectTop + 1) * 4, 599 * 4, (rectTop + 49) * 4, 0, 0, 0, + 1 << 10, 1 << 10); + gDPPipeSync(gfx++); + gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255); + gDPSetEnvColor(gfx++, 255, 0, 0, 255); + BombersNotebook_DrawScisTexRect(&gfx, 565 * 4, (rectTop + -1) * 4, 597 * 4, (rectTop + 47) * 4, 0, 0, 0, + 1 << 10, 1 << 10); + gDPPipeSync(gfx++); + gDPSetCombineMode(gfx++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); + gDPSetEnvColor(gfx++, 0, 0, 0, 255); + } + break; + } + + if (sBombersNotebookEntries[row][j] & BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE) { + yOffset = 8; + } else if (sBombersNotebookEntries[row][j] & BOMBERS_NOTEBOOK_ENTRY_POS_BELOW) { + yOffset = 24; + } else { // BOMBERS_NOTEBOOK_ENTRY_POS_CENTER + yOffset = 16; + } + + startTime = BOMBERS_NOTEBOOK_ENTRY_GET_START_TIME(row, j) - CLOCK_TIME(6, 0); + endTime = BOMBERS_NOTEBOOK_ENTRY_GET_END_TIME(row, j) - CLOCK_TIME(6, 0); + entryRectLeft = + sBombersNotebookDayRectRectLeft[BOMBERS_NOTEBOOK_ENTRY_GET_DAY(row, j)] + (startTime / CLOCK_TIME(0, 10)); + entryRectRight = + sBombersNotebookDayRectRectLeft[BOMBERS_NOTEBOOK_ENTRY_GET_DAY(row, j)] + (endTime / CLOCK_TIME(0, 10)); + entryWidth = entryRectRight - entryRectLeft - 8; + if ((entryRectRight - entryRectLeft) < 8) { + entryRectLeft = ((entryRectLeft + entryRectRight) - entryRectLeft) - 8; + entryRectRight = entryRectLeft + 8; + } + + gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, 255); + gDPLoadTextureBlock(gfx++, gBombersNotebookEntryBoxEndTex, G_IM_FMT_RGBA, G_IM_SIZ_16b, 4, 16, 0, + G_TX_MIRROR | G_TX_WRAP, G_TX_MIRROR | G_TX_WRAP, 2, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + BombersNotebook_DrawScisTexRect(&gfx, (entryRectLeft + 2) * 4, (rectTop + yOffset + 2) * 4, + (entryRectLeft + 6) * 4, (rectTop + yOffset + 18) * 4, 0, 0, 0, 1 << 10, + 1 << 10); + BombersNotebook_DrawScisTexRect(&gfx, (entryRectRight + -2) * 4, (rectTop + yOffset + 2) * 4, + (entryRectRight + 2) * 4, (rectTop + yOffset + 18) * 4, 0, 0x80, 0, 1 << 10, + 1 << 10); + if (entryWidth > 0) { + gDPLoadTextureBlock(gfx++, gBombersNotebookEntryBoxMiddleTex, G_IM_FMT_RGBA, G_IM_SIZ_16b, 4, 16, 0, + G_TX_MIRROR | G_TX_WRAP, G_TX_MIRROR | G_TX_WRAP, 2, G_TX_NOMASK, G_TX_NOLOD, + G_TX_NOLOD); + BombersNotebook_DrawScisTexRect(&gfx, (entryRectLeft + 6) * 4, (rectTop + yOffset + 2) * 4, + (entryRectLeft + 6 + entryWidth) * 4, (rectTop + yOffset + 18) * 4, 0, 0, 0, + 1 << 10, 1 << 10); + } + + gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255); + gDPLoadTextureBlock(gfx++, gBombersNotebookEntryBoxEndTex, G_IM_FMT_RGBA, G_IM_SIZ_16b, 4, 16, 0, + G_TX_MIRROR | G_TX_WRAP, G_TX_MIRROR | G_TX_WRAP, 2, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + //! FAKE: the ^ 0 + BombersNotebook_DrawScisTexRect(&gfx, (entryRectLeft * 4) ^ 0, (rectTop + yOffset) * 4, (entryRectLeft + 4) * 4, + (rectTop + yOffset + 16) * 4, 0, 0, 0, 1 << 10, 1 << 10); + //! FAKE: the ^ 0 + BombersNotebook_DrawScisTexRect(&gfx, (entryRectRight + -4) * 4, (rectTop + yOffset) * 4, + (entryRectRight * 4) ^ 0, (rectTop + yOffset + 16) * 4, 0, 0x80, 0, 1 << 10, + 1 << 10); + if (entryWidth > 0) { + gDPLoadTextureBlock(gfx++, gBombersNotebookEntryBoxMiddleTex, G_IM_FMT_RGBA, G_IM_SIZ_16b, 4, 16, 0, + G_TX_MIRROR | G_TX_WRAP, G_TX_MIRROR | G_TX_WRAP, 2, G_TX_NOMASK, G_TX_NOLOD, + G_TX_NOLOD); + BombersNotebook_DrawScisTexRect(&gfx, (entryRectLeft + 4) * 4, (rectTop + yOffset) * 4, + (entryRectLeft + 4 + entryWidth) * 4, (rectTop + yOffset + 16) * 4, 0, 0, 0, + 1 << 10, 1 << 10); + } + + if (CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(row, j)])) { + eventIcon = + sBombersNotebookEventIcons[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(row, j) - BOMBERS_NOTEBOOK_PERSON_MAX]; + if ((entryRectRight - entryRectLeft) < sBombersNotebookEventIconWidths[eventIcon]) { + iconRectLeft = + (((entryRectLeft - sBombersNotebookEventIconWidths[eventIcon]) + entryRectRight) - entryRectLeft) + + 3; + } else { + iconRectLeft = (((entryRectRight - entryRectLeft) - sBombersNotebookEventIconWidths[eventIcon]) / 2) + + entryRectLeft; + } + + if ((eventIcon == BOMBERS_NOTEBOOK_EVENT_ICON_MASK) || (eventIcon == BOMBERS_NOTEBOOK_EVENT_ICON_RIBBON)) { + if (sBombersNotebookEntries[row][j] & BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE) { + yOffset -= 12; + } else if (!(sBombersNotebookEntries[row][j] & BOMBERS_NOTEBOOK_ENTRY_POS_BELOW)) { + // BOMBERS_NOTEBOOK_ENTRY_POS_CENTER + yOffset -= 6; + } + } + gDPLoadTextureBlock(gfx++, sBombersNotebookEventIconTextures[eventIcon], G_IM_FMT_IA, G_IM_SIZ_8b, + sBombersNotebookEventIconWidths[eventIcon], sBombersNotebookEventIconHeights[eventIcon], + 0, G_TX_MIRROR | G_TX_WRAP, G_TX_MIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, + G_TX_NOLOD, G_TX_NOLOD); + gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, 255); + + BombersNotebook_DrawScisTexRect(&gfx, (iconRectLeft + 2) * 4, (rectTop + yOffset + 2) * 4, + (iconRectLeft + 2 + sBombersNotebookEventIconWidths[eventIcon]) * 4, + (rectTop + yOffset + 2 + sBombersNotebookEventIconHeights[eventIcon]) * 4, + 0, 0, 0, 1 << 10, 1 << 10); + if (sBombersNotebookEventColorWeekEventFlags[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(row, j) - + BOMBERS_NOTEBOOK_PERSON_MAX] == + BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_NONE) { + gDPSetPrimColor(gfx++, 0, 0, sBombersNotebookEntryIconColors[eventIcon][0], + sBombersNotebookEntryIconColors[eventIcon][1], + sBombersNotebookEntryIconColors[eventIcon][2], 255); + } else if (sBombersNotebookEventColorWeekEventFlags[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(row, j) - + BOMBERS_NOTEBOOK_PERSON_MAX] == + BOMBERS_NOTEBOOK_EVENT_COLOR_WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI) { + if (CHECK_WEEKEVENTREG(WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_SOUTH_UPPER_CLOCKTOWN) || + CHECK_WEEKEVENTREG(WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_NORTH_CLOCKTOWN) || + CHECK_WEEKEVENTREG(WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_EAST_UPPER_CLOCKTOWN) || + CHECK_WEEKEVENTREG(WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_EAST_LOWER_CLOCKTOWN) || + CHECK_WEEKEVENTREG(WEEKEVENTREG_DEPOSITED_LETTER_TO_KAFEI_SOUTH_LOWER_CLOCKTOWN)) { + gDPSetPrimColor(gfx++, 0, 0, sBombersNotebookEntryIconColors[eventIcon][0], + sBombersNotebookEntryIconColors[eventIcon][1], + sBombersNotebookEntryIconColors[eventIcon][2], 255); + } else { + gDPSetPrimColor(gfx++, 0, 0, 155, 155, 155, 255); + } + } else { + if (CHECK_WEEKEVENTREG( + sBombersNotebookEventColorWeekEventFlags[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(row, j) - + BOMBERS_NOTEBOOK_PERSON_MAX])) { + gDPSetPrimColor(gfx++, 0, 0, sBombersNotebookEntryIconColors[eventIcon][0], + sBombersNotebookEntryIconColors[eventIcon][1], + sBombersNotebookEntryIconColors[eventIcon][2], 255); + } else { + gDPSetPrimColor(gfx++, 0, 0, 155, 155, 155, 255); + } + } + BombersNotebook_DrawScisTexRect(&gfx, iconRectLeft * 4, (rectTop + yOffset) * 4, + (iconRectLeft + sBombersNotebookEventIconWidths[eventIcon]) * 4, + (rectTop + yOffset + sBombersNotebookEventIconHeights[eventIcon]) * 4, 0, 0, + 0, 1 << 10, 1 << 10); + gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255); + } else { + unfinishedEvent = true; + } + j += BOMBERS_NOTEBOOK_ENTRY_SIZE; + } + + *gfxP = gfx; +} + +#define DEFINE_PERSON(_enum, photo, _description, _metEnum, _metMessage, _metFlag) &photo, + +TexturePtr sBombersNotebookPhotoTextures[] = { +#include "tables/bombers_notebook/person_table.h" +}; + +#undef DEFINE_PERSON + +void BombersNotebook_DrawRows(BombersNotebook* this, Gfx** gfxP) { + static s16 sBarColorR = 0; + static s16 sBarColorG = 0; + static s16 sBarColorB = 0; + static s16 sBarColorTimer = 10; + static s16 sBarColorIndex = 0; + static s16 sBarColorTargetsR[] = { 100, 0 }; + static s16 sBarColorTargetsG[] = { 80, 0 }; + static s16 sBarColorTargetsB[] = { 255, 0 }; + Gfx* gfx = *gfxP; + s32 photoWidth; + s32 rowEnd; + s32 cursorPage; + u32 barRectLeft; + f32 photoRectDs; + u32 photoOffset; + s32 i; + u32 rectTop; + s16 colorStep; + + colorStep = ABS_ALT(sBarColorR - sBarColorTargetsR[sBarColorIndex]) / sBarColorTimer; + if (sBarColorR >= sBarColorTargetsR[sBarColorIndex]) { + sBarColorR -= colorStep; + } else { + sBarColorR += colorStep; + } + + colorStep = ABS_ALT(sBarColorG - sBarColorTargetsG[sBarColorIndex]) / sBarColorTimer; + if (sBarColorG >= sBarColorTargetsG[sBarColorIndex]) { + sBarColorG -= colorStep; + } else { + sBarColorG += colorStep; + } + + colorStep = ABS_ALT(sBarColorB - sBarColorTargetsB[sBarColorIndex]) / sBarColorTimer; + if (sBarColorB >= sBarColorTargetsB[sBarColorIndex]) { + sBarColorB -= colorStep; + } else { + sBarColorB += colorStep; + } + + sBarColorTimer--; + if (sBarColorTimer == 0) { + sBarColorTimer = 10; + sBarColorR = sBarColorTargetsR[sBarColorIndex]; + sBarColorG = sBarColorTargetsG[sBarColorIndex]; + sBarColorB = sBarColorTargetsB[sBarColorIndex]; + sBarColorIndex ^= 1; + } + + rectTop = this->scrollOffset + 107; + if (this->cursorPage >= (BOMBERS_NOTEBOOK_PERSON_MAX - 8)) { + rowEnd = BOMBERS_NOTEBOOK_PERSON_MAX; + i = this->cursorPage; + } else { + rowEnd = this->cursorPage + 8; + i = rowEnd - 8; + } + cursorPage = i; + for (; i < rowEnd; i++, rectTop += 52) { + gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255); + if (CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags[i])) { + gDPLoadTextureBlock(gfx++, sBombersNotebookPhotoTextures[i], G_IM_FMT_RGBA, G_IM_SIZ_16b, 32, 32, 0, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 5, 5, G_TX_NOLOD, G_TX_NOLOD); + } else { + gDPLoadTextureBlock(gfx++, gBombersNotebookEmptyPhotoTex, G_IM_FMT_RGBA, G_IM_SIZ_16b, 32, 32, 0, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 5, 5, G_TX_NOLOD, G_TX_NOLOD); + } + if ((i == (this->cursorPageRow + cursorPage)) && (this->scrollAmount == 0)) { + barRectLeft = 56; + photoOffset = 8; + photoRectDs = 200.0f; + photoWidth = 64; + } else { + barRectLeft = 48; + photoOffset = 0; + photoRectDs = 150.0f; + photoWidth = 48; + } + BombersNotebook_DrawScisTexRect(&gfx, (57 - photoOffset) * 4, (rectTop - photoOffset) * 4, + (57 - photoOffset + photoWidth) * 4, (rectTop - photoOffset + photoWidth) * 4, + 0, 0, 0, 1024.0f / (photoRectDs / 100.0f), 1024.0f / (photoRectDs / 100.0f)); + + if ((i == (this->cursorPageRow + cursorPage)) && (this->scrollAmount == 0)) { + gDPSetPrimColor(gfx++, 0, 0, sBarColorR, sBarColorG, sBarColorB, 255); + } else { + gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, 60); + } + gDPLoadTextureBlock(gfx++, gBombersNotebookBarTex, G_IM_FMT_I, G_IM_SIZ_8b, 8, 4, 0, G_TX_NOMIRROR | G_TX_WRAP, + G_TX_NOMIRROR | G_TX_WRAP, 3, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + + BombersNotebook_DrawScisTexRect(&gfx, (barRectLeft + 57) * 4, (rectTop + 22) * 4, + (barRectLeft - photoOffset + 527) * 4, (rectTop + 26) * 4, 0, 0, 0, 1 << 10, + 1 << 10); + gDPLoadTextureBlock_4b(gfx++, gBombersNotebookCircleTex, G_IM_FMT_I, 16, 16, 0, G_TX_NOMIRROR | G_TX_WRAP, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + + BombersNotebook_DrawScisTexRect(&gfx, (barRectLeft - photoOffset + 527) * 4, (rectTop + 16) * 4, + (barRectLeft - photoOffset + 543) * 4, (rectTop + 32) * 4, 0, 0, 0, 1 << 10, + 1 << 10); + + if (CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags[i])) { + gDPPipeSync(gfx++); + gDPSetRenderMode(gfx++, G_RM_OPA_SURF, G_RM_OPA_SURF2); + gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255); + + BombersNotebook_DrawEntries(&gfx, i, rectTop); + + gDPPipeSync(gfx++); + gDPSetRenderMode(gfx++, G_RM_XLU_SURF, G_RM_XLU_SURF2); + } + } + gDPPipeSync(gfx++); + *gfxP = gfx; +} + +TexturePtr sBombersNotebookDigitTextures[] = { + gBombersNotebookDigit0Tex, gBombersNotebookDigit1Tex, gBombersNotebookDigit2Tex, gBombersNotebookDigit3Tex, + gBombersNotebookDigit4Tex, gBombersNotebookDigit5Tex, gBombersNotebookDigit6Tex, gBombersNotebookDigit7Tex, + gBombersNotebookDigit8Tex, gBombersNotebookDigit9Tex, +}; +u8 sBombersNotebookDigitRectLeftOffsets[] = { 13, 8, 12, 13, 14, 13, 12, 12, 13, 12 }; +s16 sBombersNotebookDayTexRectLeftOffsets[] = { 16, 12, 9 }; + +#define CURRENT_DAY_CLAMP_MIN_1 ((CURRENT_DAY == 0) ? 1 : CURRENT_DAY) +void BombersNotebook_DrawTimeOfDay(Gfx** gfxP) { + Gfx* gfx = *gfxP; + u32 timeOfDayRectLeft; + u32 timeBoxRectLeft; + u32 connectorRectLeft; + u32 lineRectLeft; + u32 digitsRectLeft; + u16 time; + s32 onesDigit; + s32 tensDigit; + s32 hours; + + time = (((void)0, gSaveContext.save.time) - CLOCK_TIME(6, 0)); + if (CURRENT_DAY == 0) { + time = 0; + } + timeOfDayRectLeft = sBombersNotebookDayRectRectLeft[CURRENT_DAY] + (time / CLOCK_TIME(0, 10)); + if ((CURRENT_DAY_CLAMP_MIN_1 == 1) || + ((CURRENT_DAY_CLAMP_MIN_1 == 2) && (((void)0, gSaveContext.save.time) < CLOCK_TIME(12, 0)))) { + timeOfDayRectLeft -= 32; + lineRectLeft = timeOfDayRectLeft + 32; + } else if ((CURRENT_DAY_CLAMP_MIN_1 == 2) && (time >= (CLOCK_TIME(17, 0) - CLOCK_TIME(6, 0))) && + (time <= (CLOCK_TIME(19, 0) - CLOCK_TIME(6, 0)))) { + timeOfDayRectLeft -= 64; + lineRectLeft = timeOfDayRectLeft + 64; + } else { + timeOfDayRectLeft -= 96; + lineRectLeft = timeOfDayRectLeft + 96; + } + + gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255); + gDPLoadTextureBlock_4b(gfx++, gBombersNoteoobkTimeOfDayBoxTex, G_IM_FMT_IA, 64, 28, 0, G_TX_MIRROR | G_TX_WRAP, + G_TX_NOMIRROR | G_TX_WRAP, 6, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + BombersNotebook_DrawScisTexRect(&gfx, timeOfDayRectLeft * 4, 42 * 4, (timeOfDayRectLeft + 128) * 4, 70 * 4, 0, 0, 0, + 1 << 10, 1 << 10); + gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, 255); + gDPPipeSync(gfx++); + gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0, 0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0); + gDPLoadTextureBlock_4b(gfx++, gBombersNotebookTimeOfDayTex, G_IM_FMT_I, 96, 20, 0, G_TX_MIRROR | G_TX_WRAP, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + + BombersNotebook_DrawScisTexRect(&gfx, (timeOfDayRectLeft + 16) * 4, 47 * 4, (timeOfDayRectLeft + 112) * 4, 67 * 4, + 0, 0, 0, 1 << 10, 1 << 10); + + gDPPipeSync(gfx++); + gDPSetCombineMode(gfx++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); + gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255); + if (((CURRENT_DAY_CLAMP_MIN_1 >= 3) || + ((CURRENT_DAY_CLAMP_MIN_1 == 2) && (time > (CLOCK_TIME(18, 0) - CLOCK_TIME(6, 0)))))) { + timeBoxRectLeft = timeOfDayRectLeft - 159; + connectorRectLeft = timeOfDayRectLeft - 17; + } else { + timeBoxRectLeft = timeOfDayRectLeft + 130; + connectorRectLeft = timeOfDayRectLeft + 113; + } + + gDPLoadTextureBlock_4b(gfx++, gBombersNotebookTimeBoxLeftTex, G_IM_FMT_IA, 16, 28, 0, G_TX_MIRROR | G_TX_WRAP, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + BombersNotebook_DrawScisTexRect(&gfx, timeBoxRectLeft * 4, 42 * 4, (timeBoxRectLeft + 16) * 4, 70 * 4, 0, 0, 0, + 1 << 10, 1 << 10); + gDPLoadTextureBlock_4b(gfx++, gBombersNotebookTimeBoxMiddleTex, G_IM_FMT_IA, 16, 28, 0, G_TX_MIRROR | G_TX_WRAP, + G_TX_NOMIRROR | G_TX_WRAP, 4, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + BombersNotebook_DrawScisTexRect(&gfx, (timeBoxRectLeft + 16) * 4, 42 * 4, (timeBoxRectLeft + 141) * 4, 70 * 4, 0, 0, + 0, 1 << 10, 1 << 10); + gDPLoadTextureBlock_4b(gfx++, gBombersNotebookTimeBoxRightTex, G_IM_FMT_IA, 16, 28, 0, G_TX_MIRROR | G_TX_WRAP, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + BombersNotebook_DrawScisTexRect(&gfx, (timeBoxRectLeft + 141) * 4, 42 * 4, (timeBoxRectLeft + 157) * 4, 70 * 4, 0, + 0, 0, 1 << 10, 1 << 10); + gDPLoadTextureBlock(gfx++, sBombersNotebookDayTextures[CURRENT_DAY_CLAMP_MIN_1 - 1], G_IM_FMT_IA, G_IM_SIZ_8b, 48, + 22, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, + G_TX_NOLOD, G_TX_NOLOD); + BombersNotebook_DrawScisTexRect( + &gfx, (timeBoxRectLeft + sBombersNotebookDayTexRectLeftOffsets[CURRENT_DAY_CLAMP_MIN_1 - 1]) * 4, 46 * 4, + (timeBoxRectLeft + sBombersNotebookDayTexRectLeftOffsets[CURRENT_DAY_CLAMP_MIN_1 - 1] + 48) * 4, 68 * 4, 0, 0, + 0, 1 << 10, 1 << 10); + + gDPSetPrimColor(gfx++, 0, 0, 150, 150, 150, 255); + gDPLoadTextureBlock_4b(gfx++, gBombersNotebookCircleTex, G_IM_FMT_I, 16, 16, 0, G_TX_NOMIRROR | G_TX_WRAP, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + BombersNotebook_DrawScisTexRect(&gfx, (timeBoxRectLeft + 56) * 4, 48 * 4, (timeBoxRectLeft + 72) * 4, 0x100, 0, 0, + 0, 1 << 10, 1 << 10); + gDPPipeSync(gfx++); + gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0, 0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0); + gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, 255); + + tensDigit = 0; + onesDigit = ((void)0, gSaveContext.save.time) / CLOCK_TIME_HOUR; + if (CURRENT_DAY == 0) { + onesDigit = 6; + } + hours = onesDigit; + do { + if (onesDigit >= 10) { + tensDigit++; + onesDigit -= 10; + } + } while (onesDigit >= 10); + + digitsRectLeft = timeBoxRectLeft + 75; + gDPLoadTextureBlock_4b(gfx++, sBombersNotebookDigitTextures[tensDigit], G_IM_FMT_I, 16, 17, 0, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, + G_TX_NOLOD); + BombersNotebook_DrawScisTexRect(&gfx, digitsRectLeft * 4, 48 * 4, (digitsRectLeft + 16) * 4, 65 * 4, 0, 0, 0, + 1 << 10, 1 << 10); + + digitsRectLeft += sBombersNotebookDigitRectLeftOffsets[tensDigit]; + gDPLoadTextureBlock_4b(gfx++, sBombersNotebookDigitTextures[onesDigit], G_IM_FMT_I, 16, 17, 0, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, + G_TX_NOLOD); + BombersNotebook_DrawScisTexRect(&gfx, digitsRectLeft * 4, 48 * 4, (digitsRectLeft + 16) * 4, 65 * 4, 0, 0, 0, + 1 << 10, 1 << 10); + + digitsRectLeft += sBombersNotebookDigitRectLeftOffsets[onesDigit]; + gDPLoadTextureBlock_4b(gfx++, gBombersNotebookColonTex, G_IM_FMT_I, 16, 17, 0, G_TX_NOMIRROR | G_TX_WRAP, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + BombersNotebook_DrawScisTexRect(&gfx, digitsRectLeft * 4, 48 * 4, (digitsRectLeft + 16) * 4, 65 * 4, 0, 0, 0, + 1 << 10, 1 << 10); + + digitsRectLeft += 7; + tensDigit = 0; + if (CURRENT_DAY == 0) { + onesDigit = TIME_TO_MINUTES_ALT_F((CLOCK_TIME_F(6, 0) - (hours * CLOCK_TIME_HOUR_F))); + } else { + onesDigit = TIME_TO_MINUTES_ALT_F(((void)0, gSaveContext.save.time) - (hours * CLOCK_TIME_HOUR_F)); + } + do { + if (onesDigit >= 10) { + tensDigit++; + onesDigit -= 10; + } + } while (onesDigit >= 10); + + gDPLoadTextureBlock_4b(gfx++, sBombersNotebookDigitTextures[tensDigit], G_IM_FMT_I, 16, 17, 0, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, + G_TX_NOLOD); + BombersNotebook_DrawScisTexRect(&gfx, digitsRectLeft * 4, 48 * 4, (digitsRectLeft + 16) * 4, 65 * 4, 0, 0, 0, + 1 << 10, 1 << 10); + digitsRectLeft += sBombersNotebookDigitRectLeftOffsets[tensDigit]; + gDPLoadTextureBlock_4b(gfx++, sBombersNotebookDigitTextures[onesDigit], G_IM_FMT_I, 16, 17, 0, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, + G_TX_NOLOD); + BombersNotebook_DrawScisTexRect(&gfx, digitsRectLeft * 4, 48 * 4, (digitsRectLeft + 16) * 4, 65 * 4, 0, 0, 0, + 1 << 10, 1 << 10); + + gDPPipeSync(gfx++); + gDPSetCombineMode(gfx++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); + gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255); + gDPLoadTextureBlock(gfx++, gBombersNotebookConnectorTex, G_IM_FMT_IA, G_IM_SIZ_8b, 32, 14, 0, + G_TX_MIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, + G_TX_NOLOD); + BombersNotebook_DrawScisTexRect(&gfx, connectorRectLeft * 4, 49 * 4, (connectorRectLeft + 32) * 4, 63 * 4, 0, 0, 0, + 1 << 10, 1 << 10); + + gDPSetPrimColor(gfx++, 0, 0, 242, 0, 14, 255); + gDPLoadTextureBlock(gfx++, gBombersNotebookLineTex, G_IM_FMT_I, G_IM_SIZ_8b, 8, 1, 0, G_TX_MIRROR | G_TX_WRAP, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + BombersNotebook_DrawScisTexRect(&gfx, lineRectLeft * 4, 74 * 4, (lineRectLeft + 32) * 4, 490 * 4, 0, 0, 0, 1 << 10, + 1 << 10); + + gDPPipeSync(gfx++); + gDPSetCombineLERP(gfx++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, + ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); + gDPSetPrimColor(gfx++, 0, 0, 255, 255, 255, 255); + gDPSetEnvColor(gfx++, 200, 0, 0, 255); + gDPLoadTextureBlock(gfx++, gBombersNotebookArrowTex, G_IM_FMT_IA, G_IM_SIZ_8b, 24, 16, 0, G_TX_MIRROR | G_TX_WRAP, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + BombersNotebook_DrawScisTexRect(&gfx, (lineRectLeft + -11) * 4, 70 * 4, (lineRectLeft + 13) * 4, 86 * 4, 0, 0, 0, + 1 << 10, 1 << 10); + + gDPPipeSync(gfx++); + *gfxP = gfx; +} + +void BombersNotebook_DrawCursor(BombersNotebook* this, Gfx** gfxP) { + Gfx* gfx = *gfxP; + s32 cursorRow; + s32 cursorEntry; + s32 entryRectRight; + s32 entryRectLeft; + s32 entryIcon; + u32 cursorRectLeft; + u32 cursorRectTop; + u32 yOffset; + u16 startTime; + u16 endTime; + + gDPPipeSync(gfx++); + gDPSetCombineLERP(gfx++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, + ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); + gDPSetPrimColor(gfx++, 0, 0, 255, 205, 55, 255); + gDPSetEnvColor(gfx++, 0, 0, 0, 255); + gDPLoadTextureBlock_4b(gfx++, gBombersNotebookCursorTex, G_IM_FMT_IA, 16, 16, 0, G_TX_MIRROR | G_TX_WRAP, + G_TX_MIRROR | G_TX_WRAP, 4, 4, G_TX_NOLOD, G_TX_NOLOD); + + if (this->cursorEntry == 0) { + BombersNotebook_DrawScisTexRect(&gfx, 47 * 4, (this->cursorPageRow * 52 + 97) * 4, 63 * 4, + (this->cursorPageRow * 52 + 113) * 4, 0, 0, 0, 1 << 10, 1 << 10); + BombersNotebook_DrawScisTexRect(&gfx, 98 * 4, (this->cursorPageRow * 52 + 97) * 4, 114 * 4, + (this->cursorPageRow * 52 + 113) * 4, 0, 0x200, 0, 1 << 10, 1 << 10); + BombersNotebook_DrawScisTexRect(&gfx, 47 * 4, (this->cursorPageRow * 52 + 147) * 4, 63 * 4, + (this->cursorPageRow * 52 + 163) * 4, 0, 0, 0x200, 1 << 10, 1 << 10); + BombersNotebook_DrawScisTexRect(&gfx, 98 * 4, (this->cursorPageRow * 52 + 147) * 4, 114 * 4, + (this->cursorPageRow * 52 + 163) * 4, 0, 0x200, 0x200, 1 << 10, 1 << 10); + } else { + cursorRow = this->cursorPageRow + this->cursorPage; + cursorRectTop = (this->cursorPageRow * 52) + 107; + cursorEntry = this->cursorEntry - BOMBERS_NOTEBOOK_ENTRY_SIZE; // Offset from photo entry + if (sBombersNotebookEntries[cursorRow][cursorEntry] & BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE) { + yOffset = 8; + } else if (sBombersNotebookEntries[cursorRow][cursorEntry] & BOMBERS_NOTEBOOK_ENTRY_POS_BELOW) { + yOffset = 24; + } else { // BOMBERS_NOTEBOOK_ENTRY_POS_CENTER + yOffset = 16; + } + + startTime = BOMBERS_NOTEBOOK_ENTRY_GET_START_TIME(cursorRow, cursorEntry) - CLOCK_TIME(6, 0); + endTime = BOMBERS_NOTEBOOK_ENTRY_GET_END_TIME(cursorRow, cursorEntry) - CLOCK_TIME(6, 0); + entryRectLeft = sBombersNotebookDayRectRectLeft[BOMBERS_NOTEBOOK_ENTRY_GET_DAY(cursorRow, cursorEntry)] + + (startTime / CLOCK_TIME(0, 10)); + entryRectRight = sBombersNotebookDayRectRectLeft[BOMBERS_NOTEBOOK_ENTRY_GET_DAY(cursorRow, cursorEntry)] + + (endTime / CLOCK_TIME(0, 10)); + if ((entryRectRight - entryRectLeft) < 8) { + entryRectLeft = ((entryRectLeft + entryRectRight) - entryRectLeft) - 8; + entryRectRight = entryRectLeft + 8; + } + entryIcon = sBombersNotebookEventIcons[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT(cursorRow, cursorEntry) - + BOMBERS_NOTEBOOK_PERSON_MAX]; + if ((entryRectRight - entryRectLeft) < sBombersNotebookEventIconWidths[entryIcon]) { + cursorRectLeft = + (((entryRectLeft - sBombersNotebookEventIconWidths[entryIcon]) + entryRectRight) - entryRectLeft) + 3; + } else { + cursorRectLeft = + (((entryRectRight - entryRectLeft) - sBombersNotebookEventIconWidths[entryIcon]) / 2) + entryRectLeft; + } + if (entryIcon == BOMBERS_NOTEBOOK_EVENT_ICON_EXCLAMATION_POINT) { + cursorRectLeft -= 8; + cursorRectTop -= 8; + } else { + cursorRectLeft -= 9; + cursorRectTop -= 8; + } + if ((entryIcon == BOMBERS_NOTEBOOK_EVENT_ICON_MASK) || (entryIcon == BOMBERS_NOTEBOOK_EVENT_ICON_RIBBON)) { + if (sBombersNotebookEntries[cursorRow][cursorEntry] & BOMBERS_NOTEBOOK_ENTRY_POS_ABOVE) { + yOffset -= 12; + } else if (!(sBombersNotebookEntries[cursorRow][cursorEntry] & BOMBERS_NOTEBOOK_ENTRY_POS_BELOW)) { + // BOMBERS_NOTEBOOK_ENTRY_POS_CENTER + yOffset -= 6; + } + } + BombersNotebook_DrawScisTexRect(&gfx, cursorRectLeft * 4, (cursorRectTop + yOffset) * 4, + (cursorRectLeft + 16) * 4, (cursorRectTop + yOffset + 16) * 4, 0, 0, 0, 1 << 10, + 1 << 10); + BombersNotebook_DrawScisTexRect(&gfx, (cursorRectLeft + sBombersNotebookEventIconWidths[entryIcon]) * 4, + (cursorRectTop + yOffset) * 4, + (cursorRectLeft + sBombersNotebookEventIconWidths[entryIcon] + 16) * 4, + (cursorRectTop + yOffset + 16) * 4, 0, 0x200, 0, 1 << 10, 1 << 10); + BombersNotebook_DrawScisTexRect( + &gfx, cursorRectLeft * 4, (cursorRectTop + yOffset + sBombersNotebookEventIconHeights[entryIcon]) * 4, + (cursorRectLeft + 16) * 4, (cursorRectTop + yOffset + sBombersNotebookEventIconHeights[entryIcon] + 16) * 4, + 0, 0, 0x200, 1 << 10, 1 << 10); + BombersNotebook_DrawScisTexRect(&gfx, (cursorRectLeft + sBombersNotebookEventIconWidths[entryIcon]) * 4, + (cursorRectTop + yOffset + sBombersNotebookEventIconHeights[entryIcon]) * 4, + (cursorRectLeft + sBombersNotebookEventIconWidths[entryIcon] + 16) * 4, + (cursorRectTop + yOffset + sBombersNotebookEventIconHeights[entryIcon] + 16) * + 4, + 0, 0x200, 0x200, 1 << 10, 1 << 10); + } + + gDPPipeSync(gfx++); + *gfxP = gfx; +} + +void BombersNotebook_DrawArrows(BombersNotebook* this, Gfx** gfxP) { + static s16 sUpperArrowColorR = 0; + static s16 sUpperArrowColorG = 100; + static s16 sUpperArrowColorB = 255; + static s16 sLowerArrowColorR = 0; + static s16 sLowerArrowColorG = 100; + static s16 sLowerArrowColorB = 255; + static s16 sUpperArrowColorIndex = 0; + static s16 sLowerArrowColorIndex = 0; + static s16 sUpperArrowColorTimer = 6; + static s16 sLowerArrowColorTimer = 6; + static s16 sUpperArrowOffsetY = 0; + static s16 sLowerArrowOffsetY = 0; + static s16 sArrowColorTargetsG[] = { 175, 100 }; + static s16 sArrowColorTargetsB[] = { 205, 255 }; + Gfx* gfx = *gfxP; + u32 rectTop; + s16 colorStep; + + gDPPipeSync(gfx++); + gDPLoadTextureBlock(gfx++, gBombersNotebookArrowTex, G_IM_FMT_IA, G_IM_SIZ_8b, 24, 16, 0, G_TX_MIRROR | G_TX_WRAP, + G_TX_MIRROR | G_TX_WRAP, G_TX_NOMASK, 4, G_TX_NOLOD, G_TX_NOLOD); + + colorStep = ABS_ALT(sUpperArrowColorG - sArrowColorTargetsG[sUpperArrowColorIndex]) / sUpperArrowColorTimer; + if (sUpperArrowColorG >= sArrowColorTargetsG[sUpperArrowColorIndex]) { + sUpperArrowColorG -= colorStep; + } else { + sUpperArrowColorG += colorStep; + } + + colorStep = ABS_ALT(sUpperArrowColorB - sArrowColorTargetsB[sUpperArrowColorIndex]) / sUpperArrowColorTimer; + if (sUpperArrowColorB >= sArrowColorTargetsB[sUpperArrowColorIndex]) { + sUpperArrowColorB -= colorStep; + } else { + sUpperArrowColorB += colorStep; + } + + sUpperArrowColorTimer--; + if (sUpperArrowColorTimer == 0) { + sUpperArrowOffsetY ^= 6; + sUpperArrowColorTimer = 6; + sUpperArrowColorG = sArrowColorTargetsG[sUpperArrowColorIndex]; + sUpperArrowColorB = sArrowColorTargetsB[sUpperArrowColorIndex]; + sUpperArrowColorIndex ^= 1; + } + + colorStep = ABS_ALT(sLowerArrowColorG - sArrowColorTargetsG[sLowerArrowColorIndex]) / sLowerArrowColorTimer; + if (sLowerArrowColorG >= sArrowColorTargetsG[sLowerArrowColorIndex]) { + sLowerArrowColorG -= colorStep; + } else { + sLowerArrowColorG += colorStep; + } + + colorStep = ABS_ALT(sLowerArrowColorB - sArrowColorTargetsB[sLowerArrowColorIndex]) / sLowerArrowColorTimer; + if (sLowerArrowColorB >= sArrowColorTargetsB[sLowerArrowColorIndex]) { + sLowerArrowColorB -= colorStep; + } else { + sLowerArrowColorB += colorStep; + } + + sLowerArrowColorTimer--; + if (sLowerArrowColorTimer == 0) { + sLowerArrowOffsetY ^= 6; + sLowerArrowColorTimer = 6; + sLowerArrowColorG = sArrowColorTargetsG[sLowerArrowColorIndex]; + sLowerArrowColorB = sArrowColorTargetsB[sLowerArrowColorIndex]; + sLowerArrowColorIndex ^= 1; + } + + if (this->cursorPage != 0) { + gDPPipeSync(gfx++); + gDPSetCombineLERP(gfx++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, + ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); + gDPSetPrimColor(gfx++, 0, 0, sUpperArrowColorR, sUpperArrowColorG, sUpperArrowColorB, 255); + gDPSetEnvColor(gfx++, sUpperArrowColorR, sUpperArrowColorG, sUpperArrowColorB, 255); + rectTop = (-sUpperArrowOffsetY + 83) * 4; + BombersNotebook_DrawScisTexRect(&gfx, 46 * 4, rectTop, 70 * 4, rectTop + (16 * 4), 0, 0, 0x200, 1 << 10, + 1 << 10); + } + + if (this->cursorPage < 16) { + gDPPipeSync(gfx++); + gDPSetPrimColor(gfx++, 0, 0, sLowerArrowColorR, sLowerArrowColorG, sLowerArrowColorB, 255); + gDPSetEnvColor(gfx++, sLowerArrowColorR, sLowerArrowColorG, sLowerArrowColorB, 255); + BombersNotebook_DrawScisTexRect(&gfx, 46 * 4, (sLowerArrowOffsetY + 319) * 4, 70 * 4, + (sLowerArrowOffsetY + 335) * 4, 0, 0, 0, 1 << 10, 1 << 10); + } + gDPPipeSync(gfx++); + *gfxP = gfx; +} + +void BombersNotebook_Draw(BombersNotebook* this, GraphicsContext* gfxCtx) { + Gfx* gfx; + s32 pad[2]; + + func_8012CF0C(gfxCtx, this->loadState != BOMBERS_NOTEBOOK_LOAD_STATE_DONE, false, 0, 0, 0); + + OPEN_DISPS(gfxCtx); + + gfx = POLY_OPA_DISP; + + if (this->loadState == BOMBERS_NOTEBOOK_LOAD_STATE_DONE) { + gSPSegment(gfx++, 0x07, this->scheduleDmaSegment); + gSPSegment(gfx++, 0x08, this->scheduleSegment); + gfx = Gfx_SetupDL39(gfx); + gDPSetCombineLERP(gfx++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, + ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); + gDPSetRenderMode(gfx++, G_RM_OPA_SURF, G_RM_OPA_SURF2); + gDPSetPrimColor(gfx++, 0, 0, 255, 255, 215, 255); + gDPSetEnvColor(gfx++, 100, 100, 100, 255); + gDPLoadTextureBlock(gfx++, gBombersNotebookBackgroundTex, G_IM_FMT_I, G_IM_SIZ_8b, 32, 32, 0, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 5, 5, G_TX_NOLOD, G_TX_NOLOD); + + BombersNotebook_DrawScisTexRect(&gfx, 0 * 4, 0 * 4, SCREEN_WIDTH_HIRES * 4, SCREEN_HEIGHT_HIRES * 4, 0, 0, 0, + 0x200, 0x200); + + gDPPipeSync(gfx++); + gDPSetCombineMode(gfx++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); + gDPSetRenderMode(gfx++, G_RM_XLU_SURF, G_RM_XLU_SURF2); + + BombersNotebook_DrawHeaders(&gfx); + BombersNotebook_DrawColumns(&gfx); + + gDPSetScissor(gfx++, G_SC_NON_INTERLACE, 0, 86, 600, 450); + BombersNotebook_DrawRows(this, &gfx); + + gDPPipeSync(gfx++); + gSPDisplayList(gfx++, D_0E000000.setScissor); + + BombersNotebook_DrawTimeOfDay(&gfx); + + if (this->scrollAmount == 0) { + BombersNotebook_DrawCursor(this, &gfx); + } + BombersNotebook_DrawArrows(this, &gfx); + } + POLY_OPA_DISP = gfx; + + CLOSE_DISPS(gfxCtx); +} + +void BombersNotebook_LoadFiles(BombersNotebook* this, s32 flag) { + switch (this->loadState) { + case BOMBERS_NOTEBOOK_LOAD_STATE_NONE: + if (this->scheduleDmaSegment == NULL) { + break; + } + CmpDma_LoadAllFiles(this->scheduleDmaSegmentStart, this->scheduleDmaSegment, this->scheduleDmaSegmentSize); + osCreateMesgQueue(&this->loadQueue, this->loadMsg, ARRAY_COUNT(this->loadMsg)); + DmaMgr_SendRequestImpl(&this->dmaRequest, this->scheduleSegment, this->scheduleSegmentStart, + this->scheduleSegmentSize, 0, &this->loadQueue, NULL); + this->loadState = BOMBERS_NOTEBOOK_LOAD_STATE_STARTED; + // fallthrough + case BOMBERS_NOTEBOOK_LOAD_STATE_STARTED: + if (osRecvMesg(&this->loadQueue, NULL, flag) == 0) { + this->loadState = BOMBERS_NOTEBOOK_LOAD_STATE_DONE; + } + break; + + default: + break; + } +} + +#define DEFINE_PERSON(_enum, _photo, description, _metEnum, _metMessage, _metFlag) description, +#define DEFINE_EVENT(_enum, _icon, _colorFlag, description, _completedMessage, _completedFlag) description, + +u16 sBombersNotebookTextIds[] = { +#include "tables/bombers_notebook/person_table.h" +#include "tables/bombers_notebook/event_table.h" +}; + +#undef DEFINE_PERSON +#undef DEFINE_EVENT + +void BombersNotebook_Update(PlayState* play, BombersNotebook* this, Input* input) { + static s16 sStickXRepeatTimer = 0; + static s16 sStickYRepeatTimer = 0; + static s16 sStickXRepeatState = 0; + static s16 sStickYRepeatState = 0; + s32 stickAdjX = input->rel.stick_x; + s32 stickAdjY = input->rel.stick_y; + s32 cursorEntryScan; + + this->scheduleDmaSegmentStart = SEGMENT_ROM_START(schedule_dma_static_test); + this->scheduleDmaSegmentSize = SEGMENT_ROM_SIZE(schedule_dma_static_old); + this->scheduleSegmentStart = SEGMENT_ROM_START(schedule_static); + this->scheduleSegmentSize = SEGMENT_ROM_SIZE(schedule_static); + + if (this->scheduleDmaSegment == NULL) { + this->scheduleDmaSegment = ZeldaArena_Malloc(this->scheduleDmaSegmentSize); + } + + if (this->scheduleSegment == NULL) { + this->scheduleSegment = ZeldaArena_Malloc(this->scheduleSegmentSize); + } + + BombersNotebook_LoadFiles(this, OS_MESG_NOBLOCK); + + if (this->loadState == BOMBERS_NOTEBOOK_LOAD_STATE_DONE) { + if (stickAdjX < -30) { + if (sStickXRepeatState == -1) { + sStickXRepeatTimer--; + if (sStickXRepeatTimer < 0) { + sStickXRepeatTimer = 2; + } else { + stickAdjX = 0; + } + } else { + sStickXRepeatTimer = 10; + sStickXRepeatState = -1; + } + } else if (stickAdjX > 30) { + if (sStickXRepeatState == 1) { + sStickXRepeatTimer--; + if (sStickXRepeatTimer < 0) { + sStickXRepeatTimer = 2; + } else { + stickAdjX = 0; + } + } else { + sStickXRepeatTimer = 10; + sStickXRepeatState = 1; + } + } else { + sStickXRepeatState = 0; + } + + if (stickAdjY < -30) { + if (sStickYRepeatState == -1) { + sStickYRepeatTimer--; + if (sStickYRepeatTimer < 0) { + sStickYRepeatTimer = 2; + } else { + stickAdjY = 0; + } + } else { + sStickYRepeatTimer = 10; + sStickYRepeatState = -1; + } + } else if (stickAdjY > 30) { + if (sStickYRepeatState == 1) { + sStickYRepeatTimer--; + if (sStickYRepeatTimer < 0) { + sStickYRepeatTimer = 2; + } else { + stickAdjY = 0; + } + } else { + sStickYRepeatTimer = 10; + sStickYRepeatState = 1; + } + } else { + sStickYRepeatState = 0; + } + + if (this->scrollAmount == 0) { + if (CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags[this->cursorPageRow + this->cursorPage])) { + cursorEntryScan = this->cursorEntry; + if (stickAdjX > 30) { + while (true) { + cursorEntryScan += BOMBERS_NOTEBOOK_ENTRY_SIZE; + if (sBombersNotebookEntries[this->cursorPageRow + this->cursorPage] + [cursorEntryScan - BOMBERS_NOTEBOOK_ENTRY_SIZE] == + BOMBERS_NOTEBOOK_ENTRY_END) { + while (true) { + cursorEntryScan -= BOMBERS_NOTEBOOK_ENTRY_SIZE; + if (cursorEntryScan == 0) { + play_sound(NA_SE_SY_ERROR); + break; + } + if (CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT( + this->cursorPageRow + this->cursorPage, + cursorEntryScan - BOMBERS_NOTEBOOK_ENTRY_SIZE)])) { + play_sound(NA_SE_SY_ERROR); + break; + } + } + break; + } + if (CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT( + this->cursorPageRow + this->cursorPage, + cursorEntryScan - BOMBERS_NOTEBOOK_ENTRY_SIZE)])) { + play_sound(NA_SE_SY_CURSOR); + break; + } + } + this->cursorEntry = cursorEntryScan; + } else if (stickAdjX < -30) { + if (cursorEntryScan != 0) { + do { + cursorEntryScan -= BOMBERS_NOTEBOOK_ENTRY_SIZE; + if (CHECK_WEEKEVENTREG(gBombersNotebookWeekEventFlags[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT( + this->cursorPageRow + this->cursorPage, + cursorEntryScan - BOMBERS_NOTEBOOK_ENTRY_SIZE)])) { + play_sound(NA_SE_SY_CURSOR); + break; + } + } while (cursorEntryScan != 0); + this->cursorEntry = cursorEntryScan; + } + } + if (this->cursorEntry != 0) { + if (play->msgCtx.currentTextId != + sBombersNotebookTextIds[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT( + this->cursorPageRow + this->cursorPage, this->cursorEntry - BOMBERS_NOTEBOOK_ENTRY_SIZE)]) { + Message_ContinueTextbox(play, sBombersNotebookTextIds[BOMBERS_NOTEBOOK_ENTRY_GET_EVENT( + this->cursorPageRow + this->cursorPage, + this->cursorEntry - BOMBERS_NOTEBOOK_ENTRY_SIZE)]); + } + } else { + if (play->msgCtx.currentTextId != sBombersNotebookTextIds[this->cursorPageRow + this->cursorPage]) { + Message_ContinueTextbox(play, sBombersNotebookTextIds[this->cursorPageRow + this->cursorPage]); + } + } + } else { + Message_CloseTextbox(play); + } + + if (stickAdjY < -30) { + if (this->cursorPageRow < 3) { + play_sound(NA_SE_SY_CURSOR); + this->cursorEntry = 0; + this->cursorPageRow++; + } else if (this->cursorPage < (BOMBERS_NOTEBOOK_PERSON_MAX - 4)) { + if (sStickYRepeatState == -1) { + this->scrollAmount = -24; + } else { + this->scrollAmount = -12; + } + this->scrollOffset = 0; + this->cursorEntry = 0; + } + } else if (stickAdjY > 30) { + if (this->cursorPageRow > 0) { + play_sound(NA_SE_SY_CURSOR); + this->cursorEntry = 0; + this->cursorPageRow--; + } else if (this->cursorPage != 0) { + play_sound(NA_SE_SY_CURSOR); + this->cursorPage--; + if (sStickYRepeatState == 1) { + this->scrollAmount = 24; + } else { + this->scrollAmount = 12; + } + this->scrollOffset = -48; + this->cursorEntry = 0; + } + } + } else if (this->scrollAmount < 0) { + this->scrollOffset += this->scrollAmount; + if (ABS_ALT(this->scrollOffset) >= 48) { + play_sound(NA_SE_SY_CURSOR); + this->scrollOffset = 0; + this->scrollAmount = 0; + this->cursorPage++; + } + } else { + this->scrollOffset += this->scrollAmount; + if (this->scrollOffset == 0) { + this->scrollOffset = 0; + this->scrollAmount = 0; + } + } + } +} + +void BombersNotebook_Init(BombersNotebook* this) { + bzero(this, sizeof(BombersNotebook)); +} + +void BombersNotebook_Destroy(BombersNotebook* this) { + if (this->loadState == BOMBERS_NOTEBOOK_LOAD_STATE_STARTED) { + BombersNotebook_LoadFiles(this, OS_MESG_BLOCK); + } + if (this->scheduleDmaSegment != NULL) { + ZeldaArena_Free(this->scheduleDmaSegment); + this->scheduleDmaSegment = NULL; + } + //! @bug: Does not free malloc'd memory for schedule segment +} diff --git a/src/code/z_player_lib.c b/src/code/z_player_lib.c index ced41e15d..eb821c0cb 100644 --- a/src/code/z_player_lib.c +++ b/src/code/z_player_lib.c @@ -270,7 +270,7 @@ void func_80122C20(PlayState* play, struct_80122D44_arg1* arg1) { typedef struct { /* 0x0 */ Color_RGB8 color; /* 0x4 */ Gfx* dList; -} struct_801BFDD0; // size = 0x08 +} struct_801BFDD0; // size = 0x8 struct_801BFDD0 D_801BFDD0[] = { { { 180, 200, 255 }, gLinkGoronCurledDL }, @@ -1540,10 +1540,8 @@ void Player_UpdateBunnyEars(Player* player) { sBunnyEarKinematics.angVel.y += -sBunnyEarKinematics.rot.y >> 2; angle = player->actor.world.rot.y - player->actor.shape.rot.y; - force.x = - (s32)(player->actor.speed * -200.0f * Math_CosS(angle) * (randPlusMinusPoint5Scaled(2.0f) + 10.0f)) & 0xFFFF; - force.y = - (s32)(player->actor.speed * 100.0f * Math_SinS(angle) * (randPlusMinusPoint5Scaled(2.0f) + 10.0f)) & 0xFFFF; + force.x = (s32)(player->actor.speed * -200.0f * Math_CosS(angle) * (Rand_CenteredFloat(2.0f) + 10.0f)) & 0xFFFF; + force.y = (s32)(player->actor.speed * 100.0f * Math_SinS(angle) * (Rand_CenteredFloat(2.0f) + 10.0f)) & 0xFFFF; sBunnyEarKinematics.angVel.x += force.x >> 2; sBunnyEarKinematics.angVel.y += force.y >> 2; @@ -1643,9 +1641,9 @@ TexturePtr sPlayerMouthTextures[PLAYER_MOUTH_MAX] = { }; typedef struct PlayerFaceIndices { - /* 0x00 */ u8 eyeIndex; - /* 0x01 */ u8 mouthIndex; -} PlayerFaceIndices; // size = 0x02 + /* 0x0 */ u8 eyeIndex; + /* 0x1 */ u8 mouthIndex; +} PlayerFaceIndices; // size = 0x2 PlayerFaceIndices sPlayerFaces[] = { { PLAYER_EYES_OPEN, PLAYER_MOUTH_CLOSED }, // PLAYER_FACE_0 @@ -1801,7 +1799,7 @@ void Player_AdjustSingleLeg(PlayState* play, Player* player, SkelAnime* skelAnim temp_f20 = sp74 - SQ(sp58); temp_f20 = (temp_f20 < 0.0f) ? 0.0f : sqrtf(temp_f20); - sp4C = func_80086B30(temp_f20, sp58); + sp4C = Math_FAtan2F(temp_f20, sp58); distance = sqrtf(SQ(diffX) + SQ(yIntersect - sp90.y) + SQ(diffZ)); sp58 = (SQ(distance) + sp70) / (2.0f * distance); sp54 = distance - sp58; @@ -1809,8 +1807,8 @@ void Player_AdjustSingleLeg(PlayState* play, Player* player, SkelAnime* skelAnim temp_f20 = sp74 - SQ(sp58); temp_f20 = (temp_f20 < 0.0f) ? 0.0f : sqrtf(temp_f20); - sp48 = func_80086B30(temp_f20, sp58); - phi_t1 = (M_PI - (func_80086B30(sp54, temp_f20) + ((M_PI / 2.0f) - sp48))) * (0x8000 / M_PI); + sp48 = Math_FAtan2F(temp_f20, sp58); + phi_t1 = (M_PI - (Math_FAtan2F(sp54, temp_f20) + ((M_PI / 2.0f) - sp48))) * (0x8000 / M_PI); phi_t1 = -skelAnime->jointTable[shinLimbIndex].z + phi_t1; temp_f8 = (sp48 - sp4C) * (0x8000 / M_PI); diff --git a/src/code/z_prenmi.c b/src/code/z_prenmi.c index 94d235a37..097d4d946 100644 --- a/src/code/z_prenmi.c +++ b/src/code/z_prenmi.c @@ -1,3 +1,4 @@ +#include "global.h" #include "z_prenmi.h" void PreNMI_Stop(PreNMIState* this) { @@ -9,10 +10,9 @@ void PreNMI_Update(PreNMIState* this) { if (this->timer == 0) { ViConfig_UpdateVi(1); PreNMI_Stop(this); - return; + } else { + this->timer--; } - - this->timer--; } void PreNMI_Draw(PreNMIState* this) { @@ -48,7 +48,7 @@ void PreNMI_Init(GameState* thisx) { this->state.main = PreNMI_Main; this->state.destroy = PreNMI_Destroy; this->timer = 30; - this->unkA8 = 10; + this->unk_A8 = 10; Game_SetFramerateDivisor(&this->state, 1); } diff --git a/src/code/z_quake.c b/src/code/z_quake.c index c5115375c..8225c6347 100644 --- a/src/code/z_quake.c +++ b/src/code/z_quake.c @@ -1,3 +1,4 @@ +#include "prevent_bss_reordering.h" #include "global.h" #include "z64quake.h" #include "z64view.h" diff --git a/src/code/z_room.c b/src/code/z_room.c index 9bc6e12ee..78eb5f98e 100644 --- a/src/code/z_room.c +++ b/src/code/z_room.c @@ -53,10 +53,10 @@ typedef enum { } RoomCullableDebugMode; typedef struct RoomShapeCullableEntryLinked { - /* 0x00 */ RoomShapeCullableEntry* entry; - /* 0x04 */ f32 boundsNearZ; - /* 0x08 */ struct RoomShapeCullableEntryLinked* prev; - /* 0x0C */ struct RoomShapeCullableEntryLinked* next; + /* 0x0 */ RoomShapeCullableEntry* entry; + /* 0x4 */ f32 boundsNearZ; + /* 0x8 */ struct RoomShapeCullableEntryLinked* prev; + /* 0xC */ struct RoomShapeCullableEntryLinked* next; } RoomShapeCullableEntryLinked; // size = 0x10 #define ROOM_SHAPE_CULLABLE_MAX_ENTRIES 128 diff --git a/src/code/z_scene.c b/src/code/z_scene.c index 623db6b24..368b4509e 100644 --- a/src/code/z_scene.c +++ b/src/code/z_scene.c @@ -365,8 +365,8 @@ void Scene_LoadAreaTextures(PlayState* play, s32 fileIndex) { // SceneTableEntry Header Command 0x11: Skybox Settings void Scene_CommandSkyboxSettings(PlayState* play, SceneCmd* cmd) { play->skyboxId = cmd->skyboxSettings.skyboxId & 3; - play->envCtx.unk_17 = play->envCtx.unk_18 = cmd->skyboxSettings.unk5; - play->envCtx.unk_1E = cmd->skyboxSettings.unk6; + play->envCtx.skyboxConfig = play->envCtx.changeSkyboxNextConfig = cmd->skyboxSettings.skyboxConfig; + play->envCtx.lightMode = cmd->skyboxSettings.envLightMode; Scene_LoadAreaTextures(play, cmd->skyboxSettings.data1); } diff --git a/src/code/z_skelanime.c b/src/code/z_skelanime.c index cff66dacb..79af1b73f 100644 --- a/src/code/z_skelanime.c +++ b/src/code/z_skelanime.c @@ -1,4 +1,3 @@ -#include "prevent_bss_reordering.h" #include "global.h" #define ANIM_INTERP 1 diff --git a/src/code/z_sram_NES.c b/src/code/z_sram_NES.c index f47a8e201..fa690758c 100644 --- a/src/code/z_sram_NES.c +++ b/src/code/z_sram_NES.c @@ -1,9 +1,9 @@ #include "prevent_bss_reordering.h" #include "global.h" #include "z64horse.h" -#include "overlays/gamestates/ovl_file_choose/z_file_choose.h" +#include "overlays/gamestates/ovl_file_choose/z_file_select.h" -void func_80146EBC(SramContext* sramCtx, s32 curPage, s32 numPages); +void Sram_SyncWriteToFlash(SramContext* sramCtx, s32 curPage, s32 numPages); void func_80147314(SramContext* sramCtx, s32 fileNum); void func_80147414(SramContext* sramCtx, s32 fileNum, s32 arg2); @@ -11,12 +11,12 @@ void func_80147414(SramContext* sramCtx, s32 fileNum, s32 arg2); ((newf)[0] != 'Z' || (newf)[1] != 'E' || (newf)[2] != 'L' || (newf)[3] != 'D' || (newf)[4] != 'A' || \ (newf)[5] != '3') -typedef struct PersistentCycleFlags { +typedef struct PersistentCycleSceneFlags { /* 0x0 */ u32 switch0; /* 0x4 */ u32 switch1; /* 0x8 */ u32 chest; /* 0xC */ u32 collectible; -} PersistentCycleFlags; // size = 0x10 +} PersistentCycleSceneFlags; // size = 0x10 #define PERSISTENT_CYCLE_FLAGS_SET(switch0, switch1, chest, collectible) { switch0, switch1, chest, collectible }, #define PERSISTENT_CYCLE_FLAGS_NONE PERSISTENT_CYCLE_FLAGS_SET(0, 0, 0, 0) @@ -28,58 +28,105 @@ typedef struct PersistentCycleFlags { /** * Array of bitwise flags which won't be turned off on a cycle reset (will persist between cycles) */ -PersistentCycleFlags sPersistentCycleFlags[SCENE_MAX] = { +PersistentCycleSceneFlags sPersistentCycleSceneFlags[SCENE_MAX] = { #include "tables/scene_table.h" }; #undef DEFINE_SCENE #undef DEFINE_SCENE_UNSET -// TODO: figure out a way to use the WEEKEVENTREG defines here +// Each flag has 2 bits to store persistence over the three-day reset cycle +// Only 1 of these bits need to be set to persist (Values 1, 2, 3). +// Therefore, the final game does not distinguish between these two macros in use +#define PERSISTENT_WEEKEVENTREG(flag) (3 << (2 * BIT_FLAG_TO_SHIFT(flag))) +#define PERSISTENT_WEEKEVENTREG_ALT(flag) (2 << (2 * BIT_FLAG_TO_SHIFT(flag))) + // weekEventReg flags which will be not be cleared on a cycle reset -u16 D_801C66D0[ARRAY_COUNT(gSaveContext.save.saveInfo.weekEventReg)] = { - /* 0 */ 0xFFFC, - /* 1 */ 0xFFFF, - /* 2 */ 0xFFFF, - /* 3 */ 0xFFFF, +//! @note The index of the flag in this array must be the same to its index in the WeekeventReg array +//! Only the mask is read from the `PERSISTENT_` macros. +u16 sPersistentCycleWeekEventRegs[ARRAY_COUNT(gSaveContext.save.saveInfo.weekEventReg)] = { + /* 0 */ + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_TERMINA_FIELD) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_IKANA_GRAVEYARD) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_ROMANI_RANCH) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_GORMAN_TRACK) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_MOUNTAIN_VILLAGE_WINTER) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_GORON_SHRINE) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_SNOWHEAD), + /* 1 */ + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_SOUTHERN_SWAMP_POISONED) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_WOODFALL) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_DEKU_PALACE) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_GREAT_BAY_COAST) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_PIRATES_FORTRESS) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_ZORA_HALL) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_WATERFALL_RAPIDS) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_IKANA_CANYON), + /* 2 */ + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_IKANA_CASTLE) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_STONE_TOWER) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_STONE_TOWER_INVERTED) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_EAST_CLOCK_TOWN) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_WEST_CLOCK_TOWN) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_NORTH_CLOCK_TOWN) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_WOODFALL_TEMPLE) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_SNOWHEAD_TEMPLE), + /* 3 */ + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_PIRATES_FORTRESS_EXTERIOR) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_STONE_TOWER_TEMPLE) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_STONE_TOWER_TEMPLE_INVERTED) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_THE_MOON) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_MOON_DEKU_TRIAL) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_MOON_GORON_TRIAL) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_MOON_ZORA_TRIAL) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_03_80), /* 4 */ 0, /* 5 */ 0, /* 6 */ 0, - /* 7 */ 0xC000, - /* 8 */ 0xC00, + /* 7 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_ENTERED_WOODFALL_TEMPLE_PRISON), + /* 8 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_DOGGY_RACETRACK_HEART_PIECE), /* 9 */ 0, - /* 10 */ 0xC0, + /* 10 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_10_08), /* 11 */ 0, - /* 12 */ 0x300, - /* 13 */ 0x3000, - /* 14 */ 0xC000, - /* 15 */ 0xC00, + /* 12 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_12_10), + /* 13 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_OCEANSIDE_WALLET_UPGRADE), + /* 14 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_14_80), + /* 15 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_15_20), /* 16 */ 0, /* 17 */ 0, /* 18 */ 0, /* 19 */ 0, /* 20 */ 0, /* 21 */ 0, - /* 22 */ 0xC00C, - /* 23 */ 0xC00C, - /* 24 */ 0xC008, - /* 25 */ 3, - /* 26 */ 0x3000, + /* 22 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_22_02) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_22_80), + /* 23 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_23_02) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_23_80), + /* 24 */ PERSISTENT_WEEKEVENTREG_ALT(WEEKEVENTREG_24_02) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_24_80), + /* 25 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_25_01), + /* 26 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_26_40), /* 27 */ 0, /* 28 */ 0, /* 29 */ 0, - /* 30 */ 0xFF00, - /* 31 */ 0xC3F, - /* 32 */ 0x3F, + /* 30 */ + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_30_10) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_30_20) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_30_40) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_30_80), + /* 31 */ + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_31_01) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_31_02) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_31_04) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_31_20), + /* 32 */ + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_32_01) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_32_02) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_32_04), /* 33 */ 0, /* 34 */ 0, - /* 35 */ 0xCFFF, + /* 35 */ + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_35_01) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_35_02) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_35_04) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_35_08) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_35_10) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_35_20) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_35_80), /* 36 */ 0, /* 37 */ 0, - /* 38 */ 0xC00, - /* 39 */ 0xC00, + /* 38 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_38_20), + /* 39 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_39_20), /* 40 */ 0, - /* 41 */ 0xC0, + /* 41 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_41_08), /* 42 */ 0, /* 43 */ 0, /* 44 */ 0, @@ -88,50 +135,111 @@ u16 D_801C66D0[ARRAY_COUNT(gSaveContext.save.saveInfo.weekEventReg)] = { /* 47 */ 0, /* 48 */ 0, /* 49 */ 0, - /* 50 */ 0x3C, - /* 51 */ 0x20, + /* 50 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_50_02) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_50_04), + /* 51 */ PERSISTENT_WEEKEVENTREG_ALT(WEEKEVENTREG_51_04), /* 52 */ 0, - /* 53 */ 0x300C, - /* 54 */ 0x3000, + /* 53 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_53_02) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_53_40), + /* 54 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_54_40), /* 55 */ 0, - /* 56 */ 0xC, - /* 57 */ 0xC0, + /* 56 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_56_02), + /* 57 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_57_08), /* 58 */ 0, - /* 59 */ 0xFF0, - /* 60 */ 0x300, + /* 59 */ + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_59_04) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_59_08) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_59_10) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_59_20), + /* 60 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_60_10), /* 61 */ 0, /* 62 */ 0, - /* 63 */ 0xC00, + /* 63 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_63_20), /* 64 */ 0, /* 65 */ 0, - /* 66 */ 0xFFFF, - /* 67 */ 0xFFFF, - /* 68 */ 0xFFFF, - /* 69 */ 0xFFFF, - /* 70 */ 0xFFFF, - /* 71 */ 0xFFFF, - /* 72 */ 0xFFFF, - /* 73 */ 0xC0, + /* 66 */ + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_ANJU) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_KAFEI) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_CURIOSITY_SHOP_MAN) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_BOMB_SHOP_LADY) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_ROMANI) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_CREMIA) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_MAYOR_DOTOUR) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_MADAME_AROMA), + /* 67 */ + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_TOTO) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_GORMAN) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_POSTMAN) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_ROSA_SISTERS) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_TOILET_HAND) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_ANJUS_GRANDMOTHER) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_KAMARO) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_GROG), + /* 68 */ + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_GORMAN_BROTHERS) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_SHIRO) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_GURU_GURU) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_MET_BOMBERS) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROOM_KEY) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_PROMISED_MIDNIGHT_MEETING) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_PROMISED_TO_MEET_KAFEI) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_LETTER_TO_KAFEI), + /* 69 */ + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_DEPOSITED_LETTER_TO_KAFEI) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_PENDANT_OF_MEMORIES) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_DELIVERED_PENDANT_OF_MEMORIES) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_ESCAPED_SAKONS_HIDEOUT) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_PROMISED_TO_HELP_WITH_THEM) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_DEFENDED_AGAINST_THEM) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_MILK_BOTTLE) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_ESCORTED_CREMIA), + /* 70 */ + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROMANIS_MASK) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_KEATON_MASK) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_PRIORITY_MAIL) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_DELIVERED_PRIORITY_MAIL) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_LEARNED_SECRET_CODE) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_BOMBERS_NOTEBOOK) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_MAYOR_HP) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_ROSA_SISTERS_HP), + /* 71 */ + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_TOILET_HAND_HP) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_GRANDMA_SHORT_STORY_HP) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_GRANDMA_LONG_STORY_HP) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_POSTMAN_HP) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAFEIS_MASK) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_ALL_NIGHT_MASK) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_BUNNY_HOOD) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_GAROS_MASK), + /* 72 */ + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_CIRCUS_LEADERS_MASK) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_POSTMANS_HAT) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_COUPLES_MASK) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_BLAST_MASK) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_KAMAROS_MASK) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_STONE_MASK) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_BOMBERS_NOTEBOOK_EVENT_RECEIVED_BREMEN_MASK) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_72_80), + /* 73 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_73_08), /* 74 */ 0, - /* 75 */ 0xC000, + /* 75 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_75_80), /* 76 */ 0, - /* 77 */ 3, + /* 77 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_77_01), /* 78 */ 0, - /* 79 */ 0xC000, + /* 79 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_79_80), /* 80 */ 0, - /* 81 */ 0xC0, - /* 82 */ 0x300, + /* 81 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_81_08), + /* 82 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_82_10), /* 83 */ 0, /* 84 */ 0, /* 85 */ 0, - /* 86 */ 0xC000, - /* 87 */ 0xFFF0, + /* 86 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_86_80), + /* 87 */ + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_87_04) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_87_08) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_87_10) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_87_20) | + PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_87_40) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_87_80), /* 88 */ 0, /* 89 */ 0, - /* 90 */ 0x300, + /* 90 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_90_10), /* 91 */ 0, - /* 92 */ 0xC000, - /* 93 */ 0xF0, + /* 92 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_92_80), + /* 93 */ PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_93_04) | PERSISTENT_WEEKEVENTREG(WEEKEVENTREG_93_08), /* 94 */ 0, /* 95 */ 0, /* 96 */ 0, @@ -140,9 +248,21 @@ u16 D_801C66D0[ARRAY_COUNT(gSaveContext.save.saveInfo.weekEventReg)] = { /* 99 */ 0, }; +// Unused remnant values from OoT. Not the correct sizes in MM. +#define OOT_SAVECONTEXT_SIZE 0x1428 +#define OOT_SLOT_SIZE (OOT_SAVECONTEXT_SIZE + 0x28) +#define OOT_SRAM_HEADER_SIZE 0x10 +#define OOT_SLOT_OFFSET(index) (OOT_SRAM_HEADER_SIZE + 0x10 + (index * OOT_SLOT_SIZE)) + // used in other files -s32 D_801C6798[] = { - 0x00000020, 0x00001470, 0x000028C0, 0x00003D10, 0x00005160, 0x000065B0, +u32 gSramSlotOffsets[] = { + OOT_SLOT_OFFSET(0), + OOT_SLOT_OFFSET(1), + OOT_SLOT_OFFSET(2), + // the latter three saves are backup saves for the former saves (in OoT) + OOT_SLOT_OFFSET(3), + OOT_SLOT_OFFSET(4), + OOT_SLOT_OFFSET(5), }; u8 gAmmoItems[] = { @@ -172,28 +292,92 @@ u8 gAmmoItems[] = { ITEM_NONE, // SLOT_BOTTLE_6 }; -s32 D_801C67C8[] = { 0, 0x40, 0x80, 0xC0, 0x100, 0x180, 0x200, 0x280, 0x300, 0x380 }; +// Stores flash start page number +s32 gFlashSaveStartPages[] = { + 0, // File 1 New Cycle Save + 0x40, // File 1 New Cycle Save Backup + 0x80, // File 2 New Cycle Save + 0xC0, // File 2 New Cycle Save Backup + 0x100, // File 1 Owl Save + 0x180, // File 1 Owl Save Backup + 0x200, // File 2 Owl Save + 0x280, // File 2 Owl Save Backup + 0x300, // Sram Header (SaveOptions) + 0x380, // Sram Header Backup (SaveOptions) +}; -s32 D_801C67F0[] = { 0x40, 0x40, 0x40, 0x40, 0x80, 0x80, 0x80, 0x80, 1, 1 }; +// Flash rom number of pages +s32 gFlashSaveNumPages[] = { + 0x40, // File 1 New Cycle Save + 0x40, // File 1 New Cycle Save Backup + 0x40, // File 2 New Cycle Save + 0x40, // File 2 New Cycle Save Backup + 0x80, // File 1 Owl Save + 0x80, // File 1 Owl Save Backup + 0x80, // File 2 Owl Save + 0x80, // File 2 Owl Save Backup + 1, // Sram Header (SaveOptions) + 1, // Sram Header Backup (SaveOptions) +}; -s32 D_801C6818[] = { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 1, 1 }; +// Flash rom number of pages on very first time Player enters South Clock Town from the Clock Tower +s32 gFlashSpecialSaveNumPages[] = { + 0x80, // File 1 New Cycle Save + 0x80, // File 1 New Cycle Save Backup + 0x80, // File 2 New Cycle Save + 0x80, // File 2 New Cycle Save Backup + 0x80, // File 1 Owl Save + 0x80, // File 1 Owl Save Backup + 0x80, // File 2 Owl Save + 0x80, // File 2 Owl Save Backup + 1, // Sram Header (SaveOptions) + 1, // Sram Header Backup (SaveOptions) +}; -s32 D_801C6840[] = { 0x100, 0x180, 0x200, 0x280 }; +// Owl Save flash rom start page number +s32 gFlashOwlSaveStartPages[] = { + 0x100, // File 1 Owl Save + 0x180, // File 1 Owl Save Backup + 0x200, // File 2 Owl Save + 0x280, // File 2 Owl Save Backup +}; -s32 D_801C6850[] = { 0x80, 0x80, 0x80, 0x80, 0x300, 0x380, 1, 1 }; +// Owl Save flash rom number of pages +s32 gFlashOwlSaveNumPages[] = { + 0x80, // File 1 Owl Save + 0x80, // File 1 Owl Save Backup + 0x80, // File 2 Owl Save + 0x80, // File 2 Owl Save Backup +}; -s32 D_801C6870[] = { - sizeof(Save), - sizeof(Save), - sizeof(Save), - sizeof(Save), - offsetof(SaveContext, fileNum), - offsetof(SaveContext, fileNum), - offsetof(SaveContext, fileNum), - offsetof(SaveContext, fileNum), +// Save Options Sram Header flash rom start page number +s32 gFlashOptionsSaveStartPages[] = { + 0x300, // Sram Header (SaveOptions) + 0x380, // Sram Header Backup (SaveOptions) }; -u8 D_801C6890[8] = { 1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80 }; +// Save Options Sram Header flash rom number of pages +s32 gFlashOptionsSaveNumPages[] = { + 1, // Sram Header (SaveOptions) + 1, // Sram Header Backup (SaveOptions) +}; + +// Flash rom actual size needed +s32 gFlashSaveSizes[] = { + sizeof(Save), // size = 0x100C - File 1 New Cycle Save + sizeof(Save), // size = 0x100C - File 1 New Cycle Save Backup + sizeof(Save), // size = 0x100C - File 2 New Cycle Save + sizeof(Save), // size = 0x100C - File 2 New Cycle Save Backup + offsetof(SaveContext, fileNum), // size = 0x3CA0 - File 1 Owl Save + offsetof(SaveContext, fileNum), // size = 0x3CA0 - File 1 Owl Save Backup + offsetof(SaveContext, fileNum), // size = 0x3CA0 - File 2 Owl Save + offsetof(SaveContext, fileNum), // size = 0x3CA0 - File 2 Owl Save Backup +}; + +// Bit Flag array in which sBitFlags8[n] is (1 << n) +u8 sBitFlags8[] = { + (1 << 0), (1 << 1), (1 << 2), (1 << 3), (1 << 4), (1 << 5), (1 << 6), (1 << 7), +}; u16 D_801F6AF0; u8 D_801F6AF2; @@ -245,29 +429,29 @@ void Sram_SaveEndOfCycle(PlayState* play) { gSaveContext.save.day = 0; gSaveContext.save.time = CLOCK_TIME(6, 0) - 1; - gSaveContext.save.saveInfo.playerData.deaths++; - if (gSaveContext.save.saveInfo.playerData.deaths > 999) { - gSaveContext.save.saveInfo.playerData.deaths = 999; + gSaveContext.save.saveInfo.playerData.threeDayResetCount++; + if (gSaveContext.save.saveInfo.playerData.threeDayResetCount > 999) { + gSaveContext.save.saveInfo.playerData.threeDayResetCount = 999; } sceneId = Play_GetOriginalSceneId(play->sceneId); Play_SaveCycleSceneFlags(&play->state); - play->actorCtx.sceneFlags.chest &= sPersistentCycleFlags[sceneId].chest; - play->actorCtx.sceneFlags.switches[0] &= sPersistentCycleFlags[sceneId].switch0; - play->actorCtx.sceneFlags.switches[1] &= sPersistentCycleFlags[sceneId].switch1; - play->actorCtx.sceneFlags.collectible[0] &= sPersistentCycleFlags[sceneId].collectible; + play->actorCtx.sceneFlags.chest &= sPersistentCycleSceneFlags[sceneId].chest; + play->actorCtx.sceneFlags.switches[0] &= sPersistentCycleSceneFlags[sceneId].switch0; + play->actorCtx.sceneFlags.switches[1] &= sPersistentCycleSceneFlags[sceneId].switch1; + play->actorCtx.sceneFlags.collectible[0] &= sPersistentCycleSceneFlags[sceneId].collectible; play->actorCtx.sceneFlags.clearedRoom = 0; for (i = 0; i < SCENE_MAX; i++) { gSaveContext.cycleSceneFlags[i].switch0 = - ((void)0, gSaveContext.cycleSceneFlags[i].switch0) & sPersistentCycleFlags[i].switch0; + ((void)0, gSaveContext.cycleSceneFlags[i].switch0) & sPersistentCycleSceneFlags[i].switch0; gSaveContext.cycleSceneFlags[i].switch1 = - ((void)0, gSaveContext.cycleSceneFlags[i].switch1) & sPersistentCycleFlags[i].switch1; + ((void)0, gSaveContext.cycleSceneFlags[i].switch1) & sPersistentCycleSceneFlags[i].switch1; gSaveContext.cycleSceneFlags[i].chest = - ((void)0, gSaveContext.cycleSceneFlags[i].chest) & sPersistentCycleFlags[i].chest; + ((void)0, gSaveContext.cycleSceneFlags[i].chest) & sPersistentCycleSceneFlags[i].chest; gSaveContext.cycleSceneFlags[i].collectible = - ((void)0, gSaveContext.cycleSceneFlags[i].collectible) & sPersistentCycleFlags[i].collectible; + ((void)0, gSaveContext.cycleSceneFlags[i].collectible) & sPersistentCycleSceneFlags[i].collectible; gSaveContext.cycleSceneFlags[i].clearedRoom = 0; gSaveContext.save.saveInfo.permanentSceneFlags[i].unk_14 = 0; gSaveContext.save.saveInfo.permanentSceneFlags[i].rooms = 0; @@ -289,15 +473,15 @@ void Sram_SaveEndOfCycle(PlayState* play) { Inventory_DeleteItem(ITEM_MASK_FIERCE_DEITY, SLOT(ITEM_MASK_FIERCE_DEITY)); } - for (i = 0; i < ARRAY_COUNT(D_801C66D0); i++) { - u16 phi_v1_3 = D_801C66D0[i]; + for (i = 0; i < ARRAY_COUNT(sPersistentCycleWeekEventRegs); i++) { + u16 isPersistentBits = sPersistentCycleWeekEventRegs[i]; - for (j = 0; j < ARRAY_COUNT(D_801C6890); j++) { - if ((phi_v1_3 & 3) == 0) { + for (j = 0; j < ARRAY_COUNT(sBitFlags8); j++) { + if (!(isPersistentBits & 3)) { gSaveContext.save.saveInfo.weekEventReg[i] = - ((void)0, gSaveContext.save.saveInfo.weekEventReg[i]) & (0xFF ^ D_801C6890[j]); + ((void)0, gSaveContext.save.saveInfo.weekEventReg[i]) & (0xFF ^ sBitFlags8[j]); } - phi_v1_3 >>= 2; + isPersistentBits >>= 2; } } @@ -577,7 +761,7 @@ void Sram_GenerateRandomSaveFields(void) { SavePlayerData sSaveDefaultPlayerData = { { '\0', '\0', '\0', '\0', '\0', '\0' }, // newf - 0, // deaths + 0, // threeDayResetCount { 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E }, // playerName " " 0x30, // healthCapacity 0x30, // health @@ -678,7 +862,7 @@ void Sram_InitNewSave(void) { SavePlayerData sSaveDebugPlayerData = { { 'Z', 'E', 'L', 'D', 'A', '3' }, // newf - 0x0000, // deaths + 0, // threeDayResetCount { 0x15, 0x12, 0x17, 0x14, 0x3E, 0x3E, 0x3E, 0x3E }, // playerName "LINK " 0x80, // healthCapacity 0x80, // health @@ -775,7 +959,18 @@ Inventory sSaveDebugInventory = { (1 << QUEST_SONG_SOARING) | (1 << QUEST_SONG_STORMS) | (1 << QUEST_BOMBERS_NOTEBOOK) | (1 << QUEST_SONG_LULLABY_INTRO), // dungeonItems - { 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 }, + { + (1 << DUNGEON_BOSS_KEY) | (1 << DUNGEON_COMPASS) | (1 << DUNGEON_MAP), + (1 << DUNGEON_BOSS_KEY) | (1 << DUNGEON_COMPASS) | (1 << DUNGEON_MAP), + (1 << DUNGEON_BOSS_KEY) | (1 << DUNGEON_COMPASS) | (1 << DUNGEON_MAP), + (1 << DUNGEON_BOSS_KEY) | (1 << DUNGEON_COMPASS) | (1 << DUNGEON_MAP), + (1 << DUNGEON_BOSS_KEY) | (1 << DUNGEON_COMPASS) | (1 << DUNGEON_MAP), + (1 << DUNGEON_BOSS_KEY) | (1 << DUNGEON_COMPASS) | (1 << DUNGEON_MAP), + (1 << DUNGEON_BOSS_KEY) | (1 << DUNGEON_COMPASS) | (1 << DUNGEON_MAP), + (1 << DUNGEON_BOSS_KEY) | (1 << DUNGEON_COMPASS) | (1 << DUNGEON_MAP), + (1 << DUNGEON_BOSS_KEY) | (1 << DUNGEON_COMPASS) | (1 << DUNGEON_MAP), + (1 << DUNGEON_BOSS_KEY) | (1 << DUNGEON_COMPASS) | (1 << DUNGEON_MAP), + }, // dungeonKeys { 8, 8, 8, 8, 8, 8, 8, 8, 8 }, // defenseHearts @@ -851,15 +1046,15 @@ void Sram_ResetSaveFromMoonCrash(SramContext* sramCtx) { bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE); - if (SysFlashrom_ReadData(sramCtx->saveBuf, D_801C67C8[gSaveContext.fileNum * 2], - D_801C67F0[gSaveContext.fileNum * 2]) != 0) { - SysFlashrom_ReadData(sramCtx->saveBuf, D_801C67C8[gSaveContext.fileNum * 2 + 1], - D_801C67F0[gSaveContext.fileNum * 2 + 1]); + if (SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[gSaveContext.fileNum * 2], + gFlashSaveNumPages[gSaveContext.fileNum * 2]) != 0) { + SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[gSaveContext.fileNum * 2 + 1], + gFlashSaveNumPages[gSaveContext.fileNum * 2 + 1]); } Lib_MemCpy(&gSaveContext.save, sramCtx->saveBuf, sizeof(Save)); if (CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf)) { - SysFlashrom_ReadData(sramCtx->saveBuf, D_801C67C8[gSaveContext.fileNum * 2 + 1], - D_801C67F0[gSaveContext.fileNum * 2 + 1]); + SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[gSaveContext.fileNum * 2 + 1], + gFlashSaveNumPages[gSaveContext.fileNum * 2 + 1]); Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, sizeof(Save)); } gSaveContext.save.cutsceneIndex = cutsceneIndex; @@ -907,32 +1102,34 @@ void Sram_OpenSave(FileSelectState* fileSelect, SramContext* sramCtx) { s32 pad1; s32 fileNum; - if (gSaveContext.unk_3F3F) { + if (gSaveContext.flashSaveAvailable) { bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE); if (gSaveContext.fileNum == 0xFF) { - SysFlashrom_ReadData(sramCtx->saveBuf, D_801C67C8[0], D_801C67F0[0]); - } else if (fileSelect->unk_2446A[gSaveContext.fileNum] != 0) { + SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[0], gFlashSaveNumPages[0]); + } else if (fileSelect->isOwlSave[gSaveContext.fileNum + 2]) { phi_t1 = gSaveContext.fileNum + 2; phi_t1 *= 2; - if (SysFlashrom_ReadData(sramCtx->saveBuf, D_801C67C8[phi_t1], D_801C67F0[phi_t1]) != 0) { - SysFlashrom_ReadData(sramCtx->saveBuf, D_801C67C8[phi_t1 + 1], D_801C67F0[phi_t1 + 1]); + if (SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[phi_t1], gFlashSaveNumPages[phi_t1]) != 0) { + SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[phi_t1 + 1], + gFlashSaveNumPages[phi_t1 + 1]); } } else { phi_t1 = gSaveContext.fileNum; phi_t1 *= 2; - if (SysFlashrom_ReadData(sramCtx->saveBuf, D_801C67C8[phi_t1], D_801C67F0[phi_t1]) != 0) { - SysFlashrom_ReadData(sramCtx->saveBuf, D_801C67C8[phi_t1 + 1], D_801C67F0[phi_t1 + 1]); + if (SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[phi_t1], gFlashSaveNumPages[phi_t1]) != 0) { + SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[phi_t1 + 1], + gFlashSaveNumPages[phi_t1 + 1]); } } - Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[phi_t1]); + Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[phi_t1]); if (CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf)) { - SysFlashrom_ReadData(sramCtx->saveBuf, D_801C67C8[phi_t1 + 1], D_801C67F0[phi_t1 + 1]); - Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[phi_t1]); + SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[phi_t1 + 1], gFlashSaveNumPages[phi_t1 + 1]); + Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[phi_t1]); } } @@ -963,7 +1160,7 @@ void Sram_OpenSave(FileSelectState* fileSelect, SramContext* sramCtx) { if (gSaveContext.save.isFirstCycle) { gSaveContext.save.entrance = ENTRANCE(SOUTH_CLOCK_TOWN, 0); gSaveContext.save.day = 0; - gSaveContext.save.time = 0x3FFF; + gSaveContext.save.time = CLOCK_TIME(6, 0) - 1; } else { gSaveContext.save.entrance = ENTRANCE(CUTSCENE, 0); gSaveContext.nextCutsceneIndex = 0; @@ -1028,7 +1225,7 @@ void func_8014546C(SramContext* sramCtx) { gSaveContext.save.saveInfo.checksum = 0; gSaveContext.save.saveInfo.checksum = Sram_CalcChecksum(&gSaveContext.save, sizeof(Save)); - if (gSaveContext.unk_3F3F) { + if (gSaveContext.flashSaveAvailable) { Lib_MemCpy(sramCtx->saveBuf, &gSaveContext, sizeof(Save)); Lib_MemCpy(&sramCtx->saveBuf[0x2000], &gSaveContext.save, sizeof(Save)); } @@ -1051,7 +1248,7 @@ void func_80145698(SramContext* sramCtx) { gSaveContext.save.saveInfo.checksum = 0; gSaveContext.save.saveInfo.checksum = Sram_CalcChecksum(&gSaveContext.save, sizeof(Save)); - if (gSaveContext.unk_3F3F) { + if (gSaveContext.flashSaveAvailable) { Lib_MemCpy(sramCtx->saveBuf, &gSaveContext, sizeof(Save)); Lib_MemCpy(&sramCtx->saveBuf[0x2000], &gSaveContext.save, sizeof(Save)); } @@ -1059,31 +1256,21 @@ void func_80145698(SramContext* sramCtx) { // Verifies save and use backup if corrupted? #ifdef NON_EQUIVALENT -void func_801457CC(FileSelectState* fileSelect2, SramContext* sramCtx) { - FileSelectState* fileSelect = fileSelect2; +void func_801457CC(GameState* gameState, SramContext* sramCtx) { + FileSelectState* fileSelect = (FileSelectState*)gameState; u16 sp7A; - // u16 sp78; + u16 oldCheckSum; // s2 u16 sp76; - // u16 sp74; - u16 sp6E; //! - // s32 sp68; - // u16 sp66; - u16 phi_s2; //! - u16 sp64; - // s32 sp60; - // s32 sp5C; - // s32 sp58; - // u32 new_var; - u16 phi_s2_3; - // s16 fakevar; - - u16 temp_s2; - u16 temp_v0_2; - u16 phi_a0; // maskCount - - if (gSaveContext.unk_3F3F) { + u16 sp64; // sp74? + u16 phi_s2; + u16 phi_s7; + u16 sp6E; + u16 newCheckSum; // v0 + u16 phi_a0; // maskCount + + if (gSaveContext.flashSaveAvailable) { D_801F6AF0 = gSaveContext.save.time; - D_801F6AF2 = gSaveContext.unk_3F3F; + D_801F6AF2 = gSaveContext.flashSaveAvailable; sp64 = 0; for (sp76 = 0; sp76 < 5; sp76++, sp64 += 2) { @@ -1091,40 +1278,65 @@ void func_801457CC(FileSelectState* fileSelect2, SramContext* sramCtx) { phi_s2 = false; sp6E = 0; - if (SysFlashrom_ReadData(sramCtx->saveBuf, D_801C67C8[sp64], D_801C67F0[sp64])) { + // read main save from flash + if (SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[sp64], gFlashSaveNumPages[sp64]) != 0) { + // main save didn't work sp6E = 1; - if (SysFlashrom_ReadData(sramCtx->saveBuf, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1])) { + // read backup save from flash + if (SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[sp64 + 1], + gFlashSaveNumPages[sp64 + 1]) != 0) { + // backup save didn't work phi_s2 = true; } } if (sp76 < 2) { - fileSelect->unk_24468[sp76] = 0; + // Non-owl save + // sp76 = 0: main save + // sp76 = 1: backup save + + fileSelect->isOwlSave[sp76] = 0; if (phi_s2) { + // both main save and backup save failed bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE); - Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]); + Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[sp64]); } else { - // Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]); - Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]); - temp_s2 = gSaveContext.save.saveInfo.checksum; + Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[sp64]); + + // test checksum of main save + oldCheckSum = gSaveContext.save.saveInfo.checksum; gSaveContext.save.saveInfo.checksum = 0; - temp_v0_2 = Sram_CalcChecksum(&gSaveContext, D_801C6870[sp64]); - gSaveContext.save.saveInfo.checksum = temp_s2; + newCheckSum = Sram_CalcChecksum(&gSaveContext, gFlashSaveSizes[sp64]); + gSaveContext.save.saveInfo.checksum = oldCheckSum; - if (CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf) || (temp_s2 != temp_v0_2)) { + if (CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf) || (oldCheckSum != newCheckSum)) { + // checksum didnt match, try backup save sp6E = 1; - if (CHECK_NEWF2(gSaveContext.save.saveInfo.playerData.newf)) {} - phi_s2 = false; - if (SysFlashrom_ReadData(sramCtx->saveBuf, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1])) { + if ((gSaveContext.save.saveInfo.playerData.newf[0] == 'Z') && + (gSaveContext.save.saveInfo.playerData.newf[1] == 'E')) { + phi_s2 = false; + } + + // phi_s2 = false; + + // read backup save from flash + if (SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[sp64 + 1], + gFlashSaveNumPages[sp64 + 1]) != 0) { + // backup save didn't work phi_s2 = true; } - Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]); - temp_s2 = gSaveContext.save.saveInfo.checksum; + Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[sp64]); + + // test checksum of backup save + oldCheckSum = gSaveContext.save.saveInfo.checksum; gSaveContext.save.saveInfo.checksum = 0; + + //! FAKE: (s32)sp64 if (phi_s2 || CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf) || - (temp_s2 != Sram_CalcChecksum(&gSaveContext, D_801C6870[sp64]))) { + (oldCheckSum != Sram_CalcChecksum(&gSaveContext, gFlashSaveSizes[(s32)sp64]))) { + // backup save didn't work bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE); Lib_MemCpy(&gSaveContext.save, sramCtx->saveBuf, sizeof(Save)); sp6E = 999; @@ -1133,29 +1345,30 @@ void func_801457CC(FileSelectState* fileSelect2, SramContext* sramCtx) { } gSaveContext.save.saveInfo.checksum = 0; + // FAKE: Needed? gSaveContext.save.saveInfo.checksum = - Sram_CalcChecksum(&gSaveContext, D_801C6870[sp64 & 0xFFFFFFFF]); // TODO: Needed? + Sram_CalcChecksum(&gSaveContext, gFlashSaveSizes[sp64 & 0xFFFFFFFF]); for (sp7A = 0; sp7A < ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.newf); sp7A++) { fileSelect->newf[sp76][sp7A] = gSaveContext.save.saveInfo.playerData.newf[sp7A]; } if (!CHECK_NEWF(fileSelect->newf[sp76])) { - fileSelect->unk_2440C[sp76] = gSaveContext.save.saveInfo.playerData.deaths; + fileSelect->threeDayResetCount[sp76] = gSaveContext.save.saveInfo.playerData.threeDayResetCount; for (sp7A = 0; sp7A < ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.playerName); sp7A++) { - fileSelect->unk_24414[sp76][sp7A] = gSaveContext.save.saveInfo.playerData.playerName[sp7A]; + fileSelect->fileNames[sp76][sp7A] = gSaveContext.save.saveInfo.playerData.playerName[sp7A]; } fileSelect->healthCapacity[sp76] = gSaveContext.save.saveInfo.playerData.healthCapacity; fileSelect->health[sp76] = gSaveContext.save.saveInfo.playerData.health; - fileSelect->unk_24454[sp76] = gSaveContext.save.saveInfo.inventory.defenseHearts; - fileSelect->unk_24444[sp76] = gSaveContext.save.saveInfo.inventory.questItems; - fileSelect->unk_24458[sp76] = gSaveContext.save.time; - fileSelect->unk_24460[sp76] = gSaveContext.save.day; - fileSelect->unk_24468[sp76] = gSaveContext.save.isOwlSave; + fileSelect->defenseHearts[sp76] = gSaveContext.save.saveInfo.inventory.defenseHearts; + fileSelect->questItems[sp76] = gSaveContext.save.saveInfo.inventory.questItems; + fileSelect->time[sp76] = gSaveContext.save.time; + fileSelect->day[sp76] = gSaveContext.save.day; + fileSelect->isOwlSave[sp76] = gSaveContext.save.isOwlSave; fileSelect->rupees[sp76] = gSaveContext.save.saveInfo.playerData.rupees; - fileSelect->unk_24474[sp76] = CUR_UPG_VALUE(4); + fileSelect->walletUpgrades[sp76] = CUR_UPG_VALUE(UPG_WALLET); for (sp7A = 0, phi_a0 = 0; sp7A < 24; sp7A++) { if (gSaveContext.save.saveInfo.inventory.items[sp7A + 24] != 0xFF) { @@ -1168,90 +1381,106 @@ void func_801457CC(FileSelectState* fileSelect2, SramContext* sramCtx) { } if (sp6E == 1) { + // backup save Lib_MemCpy(&sramCtx->saveBuf[0x2000], &gSaveContext.save, sizeof(Save)); - func_80146EBC(sramCtx, D_801C67C8[sp64], D_801C6818[sp64]); - } else if (sp6E == 0) { // TODO: == 0? - temp_s2 = gSaveContext.save.saveInfo.checksum; - if (SysFlashrom_ReadData(sramCtx->saveBuf, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1])) { - phi_s2_3 = 1; + Sram_SyncWriteToFlash(sramCtx, gFlashSaveStartPages[sp64], gFlashSpecialSaveNumPages[sp64]); + } else if (!sp6E) { + // main save + phi_s7 = gSaveContext.save.saveInfo.checksum; + + if (SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[sp64 + 1], + gFlashSaveNumPages[sp64 + 1]) != 0) { + oldCheckSum = 1; } else { Lib_MemCpy(&gSaveContext.save, sramCtx->saveBuf, sizeof(Save)); - phi_s2_3 = gSaveContext.save.saveInfo.checksum; + oldCheckSum = gSaveContext.save.saveInfo.checksum; gSaveContext.save.saveInfo.checksum = 0; sp7A = Sram_CalcChecksum(&gSaveContext.save, sizeof(Save)); } - if (CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf) || (phi_s2_3 != sp7A) || - (phi_s2_3 != temp_s2)) { - SysFlashrom_ReadData(sramCtx->saveBuf, D_801C67C8[sp64], D_801C67F0[sp64]); + if (CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf) || (oldCheckSum != sp7A) || + (oldCheckSum != phi_s7)) { + SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[sp64], gFlashSaveNumPages[sp64]); Lib_MemCpy(&gSaveContext.save, sramCtx->saveBuf, sizeof(Save)); Lib_MemCpy(&sramCtx->saveBuf[0x2000], &gSaveContext.save, sizeof(Save)); - func_80146EBC(sramCtx, D_801C67C8[sp64], D_801C6818[sp64]); + Sram_SyncWriteToFlash(sramCtx, gFlashSaveStartPages[sp64], gFlashSpecialSaveNumPages[sp64]); } } } else if (sp76 < 4) { - fileSelect->unk_24468[sp76] = 0; + // Owl Save: + // sp76 = 3: main owl save + // sp76 = 4: backup owl save + fileSelect->isOwlSave[sp76] = 0; - if (!CHECK_NEWF(fileSelect->newf2[(s32)sp76])) { // TODO: Needed? + if (!CHECK_NEWF(fileSelect->newf[sp76 - 2])) { if (phi_s2) { + // both main save and backup save failed bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE); - Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, - D_801C6870[sp64]); // TODO: Needed? + Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[sp64]); } else { - Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]); - temp_s2 = gSaveContext.save.saveInfo.checksum; + Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[sp64]); + oldCheckSum = gSaveContext.save.saveInfo.checksum; + // test checksum of main save gSaveContext.save.saveInfo.checksum = 0; - temp_v0_2 = Sram_CalcChecksum(&gSaveContext, D_801C6870[sp64]); - gSaveContext.save.saveInfo.checksum = temp_s2; - if (CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf) || (temp_s2 != temp_v0_2)) { + newCheckSum = Sram_CalcChecksum(&gSaveContext, gFlashSaveSizes[sp64]); + gSaveContext.save.saveInfo.checksum = oldCheckSum; + + if (CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf) || (oldCheckSum != newCheckSum)) { + // checksum didnt match, try backup save sp6E = 1; if ((gSaveContext.save.saveInfo.playerData.newf[0] == 'Z') && (gSaveContext.save.saveInfo.playerData.newf[1] == 'E')) { phi_s2 = false; } - if (SysFlashrom_ReadData(sramCtx->saveBuf, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1])) { + // read backup save from flash + if (SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[sp64 + 1], + gFlashSaveNumPages[sp64 + 1])) { + // backup save didn't work phi_s2 = true; } - Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]); - temp_s2 = gSaveContext.save.saveInfo.checksum; + Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[sp64]); + + // test checksum of backup save + oldCheckSum = gSaveContext.save.saveInfo.checksum; gSaveContext.save.saveInfo.checksum = 0; + if (phi_s2 || CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf) || - (temp_s2 != Sram_CalcChecksum(&gSaveContext, D_801C6870[sp64]))) { + (oldCheckSum != Sram_CalcChecksum(&gSaveContext, gFlashSaveSizes[sp64]))) { bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE); - Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]); + Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[sp64]); sp6E = 999; } } } gSaveContext.save.saveInfo.checksum = 0; + // FAKE: Needed? gSaveContext.save.saveInfo.checksum = - Sram_CalcChecksum(&gSaveContext, D_801C6870[sp64 & 0xFFFFFFFF]); // TODO: Needed? + Sram_CalcChecksum(&gSaveContext, gFlashSaveSizes[sp64 & 0xFFFFFFFF]); for (sp7A = 0; sp7A < ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.newf); sp7A++) { fileSelect->newf[sp76][sp7A] = gSaveContext.save.saveInfo.playerData.newf[sp7A]; } if (!CHECK_NEWF(fileSelect->newf[sp76])) { - fileSelect->unk_2440C[sp76] = gSaveContext.save.saveInfo.playerData.deaths; + fileSelect->threeDayResetCount[sp76] = gSaveContext.save.saveInfo.playerData.threeDayResetCount; for (sp7A = 0; sp7A < ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.playerName); sp7A++) { - phi_s2 += 0; // TODO: Needed? - fileSelect->unk_24414[sp76][sp7A] = gSaveContext.save.saveInfo.playerData.playerName[sp7A]; + fileSelect->fileNames[sp76][sp7A] = gSaveContext.save.saveInfo.playerData.playerName[sp7A]; } fileSelect->healthCapacity[sp76] = gSaveContext.save.saveInfo.playerData.healthCapacity; fileSelect->health[sp76] = gSaveContext.save.saveInfo.playerData.health; - fileSelect->unk_24454[sp76] = gSaveContext.save.saveInfo.inventory.defenseHearts; - fileSelect->unk_24444[sp76] = gSaveContext.save.saveInfo.inventory.questItems; - fileSelect->unk_24458[sp76] = gSaveContext.save.time; - fileSelect->unk_24460[sp76] = gSaveContext.save.day; - fileSelect->unk_24468[sp76] = gSaveContext.save.isOwlSave; + fileSelect->defenseHearts[sp76] = gSaveContext.save.saveInfo.inventory.defenseHearts; + fileSelect->questItems[sp76] = gSaveContext.save.saveInfo.inventory.questItems; + fileSelect->time[sp76] = gSaveContext.save.time; + fileSelect->day[sp76] = gSaveContext.save.day; + fileSelect->isOwlSave[sp76] = gSaveContext.save.isOwlSave; fileSelect->rupees[sp76] = gSaveContext.save.saveInfo.playerData.rupees; - fileSelect->unk_24474[sp76] = CUR_UPG_VALUE(4); + fileSelect->walletUpgrades[sp76] = CUR_UPG_VALUE(UPG_WALLET); for (sp7A = 0, phi_a0 = 0; sp7A < 24; sp7A++) { if (gSaveContext.save.saveInfo.inventory.items[sp7A + 24] != 0xFF) { @@ -1264,39 +1493,44 @@ void func_801457CC(FileSelectState* fileSelect2, SramContext* sramCtx) { } if (sp6E == 1) { - func_80146EBC(sramCtx, D_801C67C8[sp64], D_801C67F0[sp64]); - func_80146EBC(sramCtx, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1]); - } else if (!sp6E) { // TODO: == 0? - temp_s2 = gSaveContext.save.saveInfo.checksum; - if (SysFlashrom_ReadData(sramCtx->saveBuf, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1])) { - phi_s2_3 = 1; + // backup save + Sram_SyncWriteToFlash(sramCtx, gFlashSaveStartPages[sp64], gFlashSaveNumPages[sp64]); + Sram_SyncWriteToFlash(sramCtx, gFlashSaveStartPages[sp64 + 1], gFlashSaveNumPages[sp64 + 1]); + } else if (!sp6E) { + // main save + phi_s7 = gSaveContext.save.saveInfo.checksum; + + if (SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[sp64 + 1], + gFlashSaveNumPages[sp64 + 1])) { + oldCheckSum = 1; } else { - Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]); - phi_s2_3 = gSaveContext.save.saveInfo.checksum; + Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[sp64]); + oldCheckSum = gSaveContext.save.saveInfo.checksum; gSaveContext.save.saveInfo.checksum = 0; - // phi_s2_3 = gSaveContext.save.saveInfo.checksum; - sp7A = Sram_CalcChecksum(&gSaveContext, D_801C6870[sp64]); + sp7A = Sram_CalcChecksum(&gSaveContext, gFlashSaveSizes[sp64]); } - if (CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf) || (phi_s2_3 != sp7A) || - (phi_s2_3 != temp_s2)) { - SysFlashrom_ReadData(sramCtx->saveBuf, D_801C67C8[sp64], D_801C67F0[sp64]); - Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]); - func_80146EBC(sramCtx, D_801C67C8[sp64], D_801C67F0[sp64]); - func_80146EBC(sramCtx, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1]); + if (CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf) || (oldCheckSum != sp7A) || + (oldCheckSum != phi_s7)) { + SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[sp64], + gFlashSaveNumPages[sp64]); + Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[sp64]); + Sram_SyncWriteToFlash(sramCtx, gFlashSaveStartPages[sp64], gFlashSaveNumPages[sp64]); + Sram_SyncWriteToFlash(sramCtx, gFlashSaveStartPages[sp64 + 1], + gFlashSaveNumPages[sp64 + 1]); } } } else { bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE); - Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, D_801C6870[sp64]); - func_80146EBC(sramCtx, D_801C67C8[sp64], D_801C67F0[sp64]); - func_80146EBC(sramCtx, D_801C67C8[sp64 + 1], D_801C67F0[sp64 + 1]); + Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[sp64]); + Sram_SyncWriteToFlash(sramCtx, gFlashSaveStartPages[sp64], gFlashSaveNumPages[sp64]); + Sram_SyncWriteToFlash(sramCtx, gFlashSaveStartPages[sp64 + 1], gFlashSaveNumPages[sp64 + 1]); } } else { if (phi_s2) { gSaveContext.options.optionId = 0xA51D; gSaveContext.options.language = 1; - gSaveContext.options.audioSetting = 0; + gSaveContext.options.audioSetting = SAVE_AUDIO_STEREO; gSaveContext.options.languageSetting = 0; gSaveContext.options.zTargetSetting = 0; } else { @@ -1304,7 +1538,7 @@ void func_801457CC(FileSelectState* fileSelect2, SramContext* sramCtx) { if (gSaveContext.options.optionId != 0xA51D) { gSaveContext.options.optionId = 0xA51D; gSaveContext.options.language = 1; - gSaveContext.options.audioSetting = 0; + gSaveContext.options.audioSetting = SAVE_AUDIO_STEREO; gSaveContext.options.languageSetting = 0; gSaveContext.options.zTargetSetting = 0; } @@ -1314,7 +1548,7 @@ void func_801457CC(FileSelectState* fileSelect2, SramContext* sramCtx) { } gSaveContext.save.time = D_801F6AF0; - gSaveContext.unk_3F3F = D_801F6AF2; + gSaveContext.flashSaveAvailable = D_801F6AF2; } gSaveContext.options.language = 1; @@ -1323,50 +1557,52 @@ void func_801457CC(FileSelectState* fileSelect2, SramContext* sramCtx) { #pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/func_801457CC.s") #endif -void func_80146580(FileSelectState* fileSelect2, SramContext* sramCtx, s32 fileNum) { +void Sram_EraseSave(FileSelectState* fileSelect2, SramContext* sramCtx, s32 fileNum) { FileSelectState* fileSelect = fileSelect2; s32 pad; - if (gSaveContext.unk_3F3F) { - if (fileSelect->unk_2446A[fileNum]) { + if (gSaveContext.flashSaveAvailable) { + if (fileSelect->isOwlSave[fileNum + 2]) { func_80147314(sramCtx, fileNum); - fileSelect->unk_2446A[fileNum] = 0; + fileSelect->isOwlSave[fileNum + 2] = false; } bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE); Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, sizeof(Save)); } gSaveContext.save.time = D_801F6AF0; - gSaveContext.unk_3F3F = D_801F6AF2; + gSaveContext.flashSaveAvailable = D_801F6AF2; } #ifdef NON_MATCHING // v0/v1 -void func_80146628(FileSelectState* fileSelect2, SramContext* sramCtx) { +void Sram_CopySave(FileSelectState* fileSelect2, SramContext* sramCtx) { FileSelectState* fileSelect = fileSelect2; u16 i; s16 maskCount; - if (gSaveContext.unk_3F3F) { - if (fileSelect->unk_2446A[fileSelect->unk_2448E]) { - func_80147414(sramCtx, fileSelect->unk_2448E, fileSelect->fileNum); - fileSelect->unk_24410[fileSelect->fileNum] = gSaveContext.save.saveInfo.playerData.deaths; + if (gSaveContext.flashSaveAvailable) { + if (fileSelect->isOwlSave[fileSelect->selectedFileIndex + 2]) { + func_80147414(sramCtx, fileSelect->selectedFileIndex, fileSelect->copyDestFileIndex); + fileSelect->threeDayResetCount[fileSelect->copyDestFileIndex + 2] = + gSaveContext.save.saveInfo.playerData.threeDayResetCount; for (i = 0; i < ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.playerName); i++) { - fileSelect->unk_24424[fileSelect->fileNum][i] = gSaveContext.save.saveInfo.playerData.playerName[i]; + fileSelect->fileNames[fileSelect->copyDestFileIndex + 2][i] = + gSaveContext.save.saveInfo.playerData.playerName[i]; } - fileSelect->unk_24438[fileSelect->fileNum] = gSaveContext.save.saveInfo.playerData.healthCapacity; - fileSelect->unk_24440[fileSelect->fileNum] = gSaveContext.save.saveInfo.playerData.health; - fileSelect->unk_24456[fileSelect->fileNum] = gSaveContext.save.saveInfo.inventory.defenseHearts; - fileSelect->unk_2444C[fileSelect->fileNum] = gSaveContext.save.saveInfo.inventory.questItems; - fileSelect->unk_2445C[fileSelect->fileNum] = gSaveContext.save.time; - fileSelect->unk_24464[fileSelect->fileNum] = gSaveContext.save.day; - fileSelect->unk_2446A[fileSelect->fileNum] = gSaveContext.save.isOwlSave; - fileSelect->unk_24470[fileSelect->fileNum] = gSaveContext.save.saveInfo.playerData.rupees; - // = CUR_UPG_VALUE(UPG_WALLET); - fileSelect->unk_24476[fileSelect->fileNum] = - (gSaveContext.save.saveInfo.inventory.upgrades & gUpgradeMasks[4]) >> gUpgradeShifts[4]; + fileSelect->healthCapacity[fileSelect->copyDestFileIndex + 2] = + gSaveContext.save.saveInfo.playerData.healthCapacity; + fileSelect->health[fileSelect->copyDestFileIndex + 2] = gSaveContext.save.saveInfo.playerData.health; + fileSelect->defenseHearts[fileSelect->copyDestFileIndex + 2] = + gSaveContext.save.saveInfo.inventory.defenseHearts; + fileSelect->questItems[fileSelect->copyDestFileIndex + 2] = gSaveContext.save.saveInfo.inventory.questItems; + fileSelect->time[fileSelect->copyDestFileIndex + 2] = gSaveContext.save.time; + fileSelect->day[fileSelect->copyDestFileIndex + 2] = gSaveContext.save.day; + fileSelect->isOwlSave[fileSelect->copyDestFileIndex + 2] = gSaveContext.save.isOwlSave; + fileSelect->rupees[fileSelect->copyDestFileIndex + 2] = gSaveContext.save.saveInfo.playerData.rupees; + fileSelect->walletUpgrades[fileSelect->copyDestFileIndex + 2] = CUR_UPG_VALUE(UPG_WALLET); for (i = 0, maskCount = 0; i < 24; i++) { if (gSaveContext.save.saveInfo.inventory.items[i + 24] != ITEM_NONE) { @@ -1374,42 +1610,42 @@ void func_80146628(FileSelectState* fileSelect2, SramContext* sramCtx) { } } - fileSelect->unk_2447A[fileSelect->fileNum] = maskCount; - fileSelect->unk_2447E[fileSelect->fileNum] = - (gSaveContext.save.saveInfo.inventory.questItems & 0xF0000000) >> 0x1C; + fileSelect->maskCount[fileSelect->copyDestFileIndex + 2] = maskCount; + fileSelect->heartPieceCount[fileSelect->copyDestFileIndex + 2] = GET_QUEST_HEART_PIECE_COUNT; } // clear buffer bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE); // read to buffer - SysFlashrom_ReadData(sramCtx->saveBuf, D_801C67C8[fileSelect->unk_2448E * 2], - D_801C67F0[fileSelect->unk_2448E * 2]); - + SysFlashrom_ReadData(&sramCtx->saveBuf[0], gFlashSaveStartPages[fileSelect->selectedFileIndex * 2], + gFlashSaveNumPages[fileSelect->selectedFileIndex * 2]); if (1) {} - SysFlashrom_ReadData(&sramCtx->saveBuf[0x2000], D_801C67C8[fileSelect->unk_2448E * 2 + 1], - D_801C67F0[fileSelect->unk_2448E * 2 + 1]); + + SysFlashrom_ReadData(&sramCtx->saveBuf[0x2000], gFlashSaveStartPages[fileSelect->selectedFileIndex * 2 + 1], + gFlashSaveNumPages[fileSelect->selectedFileIndex * 2 + 1]); if (1) {} // copy buffer to save context Lib_MemCpy(&gSaveContext.save, sramCtx->saveBuf, sizeof(Save)); - fileSelect->unk_2440C[fileSelect->fileNum] = gSaveContext.save.saveInfo.playerData.deaths; + fileSelect->threeDayResetCount[fileSelect->copyDestFileIndex] = + gSaveContext.save.saveInfo.playerData.threeDayResetCount; for (i = 0; i < ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.playerName); i++) { - fileSelect->unk_24414[fileSelect->fileNum][i] = gSaveContext.save.saveInfo.playerData.playerName[i]; + fileSelect->fileNames[fileSelect->copyDestFileIndex][i] = + gSaveContext.save.saveInfo.playerData.playerName[i]; } - fileSelect->healthCapacity[fileSelect->fileNum] = gSaveContext.save.saveInfo.playerData.healthCapacity; - fileSelect->health[fileSelect->fileNum] = gSaveContext.save.saveInfo.playerData.health; - fileSelect->unk_24454[fileSelect->fileNum] = gSaveContext.save.saveInfo.inventory.defenseHearts; - fileSelect->unk_24444[fileSelect->fileNum] = gSaveContext.save.saveInfo.inventory.questItems; - fileSelect->unk_24458[fileSelect->fileNum] = gSaveContext.save.time; - fileSelect->unk_24460[fileSelect->fileNum] = gSaveContext.save.day; - fileSelect->unk_24468[fileSelect->fileNum] = gSaveContext.save.isOwlSave; - fileSelect->rupees[fileSelect->fileNum] = gSaveContext.save.saveInfo.playerData.rupees; - // = CUR_UPG_VALUE(UPG_WALLET); - fileSelect->unk_24474[fileSelect->fileNum] = - (gSaveContext.save.saveInfo.inventory.upgrades & gUpgradeMasks[4]) >> gUpgradeShifts[4]; + fileSelect->healthCapacity[fileSelect->copyDestFileIndex] = + gSaveContext.save.saveInfo.playerData.healthCapacity; + fileSelect->health[fileSelect->copyDestFileIndex] = gSaveContext.save.saveInfo.playerData.health; + fileSelect->defenseHearts[fileSelect->copyDestFileIndex] = gSaveContext.save.saveInfo.inventory.defenseHearts; + fileSelect->questItems[fileSelect->copyDestFileIndex] = gSaveContext.save.saveInfo.inventory.questItems; + fileSelect->time[fileSelect->copyDestFileIndex] = gSaveContext.save.time; + fileSelect->day[fileSelect->copyDestFileIndex] = gSaveContext.save.day; + fileSelect->isOwlSave[fileSelect->copyDestFileIndex] = gSaveContext.save.isOwlSave; + fileSelect->rupees[fileSelect->copyDestFileIndex] = gSaveContext.save.saveInfo.playerData.rupees; + fileSelect->walletUpgrades[fileSelect->copyDestFileIndex] = CUR_UPG_VALUE(UPG_WALLET); for (i = 0, maskCount = 0; i < 24; i++) { if (gSaveContext.save.saveInfo.inventory.items[i + 24] != ITEM_NONE) { @@ -1417,16 +1653,15 @@ void func_80146628(FileSelectState* fileSelect2, SramContext* sramCtx) { } } - fileSelect->maskCount[fileSelect->fileNum] = maskCount; - fileSelect->heartPieceCount[fileSelect->fileNum] = - (gSaveContext.save.saveInfo.inventory.questItems & 0xF0000000) >> 0x1C; + fileSelect->maskCount[fileSelect->copyDestFileIndex] = maskCount; + fileSelect->heartPieceCount[fileSelect->copyDestFileIndex] = GET_QUEST_HEART_PIECE_COUNT; } gSaveContext.save.time = D_801F6AF0; - gSaveContext.unk_3F3F = D_801F6AF2; + gSaveContext.flashSaveAvailable = D_801F6AF2; } #else -#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/func_80146628.s") +#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/Sram_CopySave.s") #endif void Sram_InitSave(FileSelectState* fileSelect2, SramContext* sramCtx) { @@ -1435,15 +1670,15 @@ void Sram_InitSave(FileSelectState* fileSelect2, SramContext* sramCtx) { FileSelectState* fileSelect = fileSelect2; s16 maskCount; - if (gSaveContext.unk_3F3F) { + if (gSaveContext.flashSaveAvailable) { Sram_InitNewSave(); - if (fileSelect->unk_24480 == 0) { + if (fileSelect->buttonIndex == 0) { gSaveContext.save.cutsceneIndex = 0xFFF0; } for (phi_v0 = 0; phi_v0 < ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.playerName); phi_v0++) { gSaveContext.save.saveInfo.playerData.playerName[phi_v0] = - fileSelect->unk_24414[fileSelect->unk_24480][phi_v0]; + fileSelect->fileNames[fileSelect->buttonIndex][phi_v0]; } gSaveContext.save.saveInfo.playerData.newf[0] = 'Z'; @@ -1459,24 +1694,25 @@ void Sram_InitSave(FileSelectState* fileSelect2, SramContext* sramCtx) { Lib_MemCpy(&sramCtx->saveBuf[0x2000], &gSaveContext.save, sizeof(Save)); for (i = 0; i < ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.newf); i++) { - fileSelect->newf[fileSelect->unk_24480][i] = gSaveContext.save.saveInfo.playerData.newf[i]; + fileSelect->newf[fileSelect->buttonIndex][i] = gSaveContext.save.saveInfo.playerData.newf[i]; } - fileSelect->unk_2440C[fileSelect->unk_24480] = gSaveContext.save.saveInfo.playerData.deaths; + fileSelect->threeDayResetCount[fileSelect->buttonIndex] = + gSaveContext.save.saveInfo.playerData.threeDayResetCount; for (i = 0; i < ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.playerName); i++) { - fileSelect->unk_24414[fileSelect->unk_24480][i] = gSaveContext.save.saveInfo.playerData.playerName[i]; + fileSelect->fileNames[fileSelect->buttonIndex][i] = gSaveContext.save.saveInfo.playerData.playerName[i]; } - fileSelect->healthCapacity[fileSelect->unk_24480] = gSaveContext.save.saveInfo.playerData.healthCapacity; - fileSelect->health[fileSelect->unk_24480] = gSaveContext.save.saveInfo.playerData.health; - fileSelect->unk_24454[fileSelect->unk_24480] = gSaveContext.save.saveInfo.inventory.defenseHearts; - fileSelect->unk_24444[fileSelect->unk_24480] = gSaveContext.save.saveInfo.inventory.questItems; - fileSelect->unk_24458[fileSelect->unk_24480] = gSaveContext.save.time; - fileSelect->unk_24460[fileSelect->unk_24480] = gSaveContext.save.day; - fileSelect->unk_24468[fileSelect->unk_24480] = gSaveContext.save.isOwlSave; - fileSelect->rupees[fileSelect->unk_24480] = gSaveContext.save.saveInfo.playerData.rupees; - fileSelect->unk_24474[fileSelect->unk_24480] = CUR_UPG_VALUE(UPG_WALLET); + fileSelect->healthCapacity[fileSelect->buttonIndex] = gSaveContext.save.saveInfo.playerData.healthCapacity; + fileSelect->health[fileSelect->buttonIndex] = gSaveContext.save.saveInfo.playerData.health; + fileSelect->defenseHearts[fileSelect->buttonIndex] = gSaveContext.save.saveInfo.inventory.defenseHearts; + fileSelect->questItems[fileSelect->buttonIndex] = gSaveContext.save.saveInfo.inventory.questItems; + fileSelect->time[fileSelect->buttonIndex] = gSaveContext.save.time; + fileSelect->day[fileSelect->buttonIndex] = gSaveContext.save.day; + fileSelect->isOwlSave[fileSelect->buttonIndex] = gSaveContext.save.isOwlSave; + fileSelect->rupees[fileSelect->buttonIndex] = gSaveContext.save.saveInfo.playerData.rupees; + fileSelect->walletUpgrades[fileSelect->buttonIndex] = CUR_UPG_VALUE(UPG_WALLET); for (i = 0, maskCount = 0; i < 24; i++) { if (gSaveContext.save.saveInfo.inventory.items[i + 24] != ITEM_NONE) { @@ -1484,17 +1720,19 @@ void Sram_InitSave(FileSelectState* fileSelect2, SramContext* sramCtx) { } } - fileSelect->maskCount[fileSelect->unk_24480] = maskCount; - fileSelect->heartPieceCount[fileSelect->unk_24480] = - (gSaveContext.save.saveInfo.inventory.questItems & 0xF0000000) >> 0x1C; + fileSelect->maskCount[fileSelect->buttonIndex] = maskCount; + fileSelect->heartPieceCount[fileSelect->buttonIndex] = GET_QUEST_HEART_PIECE_COUNT; } gSaveContext.save.time = D_801F6AF0; - gSaveContext.unk_3F3F = D_801F6AF2; + gSaveContext.flashSaveAvailable = D_801F6AF2; } -void func_80146DF8(SramContext* sramCtx) { - if (gSaveContext.unk_3F3F) { +/** + * Write the SaveOptions of SaveContext to the save buffer + */ +void Sram_WriteSaveOptionsToBuffer(SramContext* sramCtx) { + if (gSaveContext.flashSaveAvailable) { // TODO: macros for languages gSaveContext.options.language = 1; Lib_MemCpy(sramCtx->saveBuf, &gSaveContext.options, sizeof(SaveOptions)); @@ -1508,7 +1746,7 @@ void Sram_InitSram(GameState* gameState, SramContext* sramCtx) { } void Sram_Alloc(GameState* gameState, SramContext* sramCtx) { - if (gSaveContext.unk_3F3F) { + if (gSaveContext.flashSaveAvailable) { sramCtx->saveBuf = THA_AllocTailAlign16(&gameState->heap, SAVE_BUFFER_SIZE); sramCtx->status = 0; } @@ -1517,7 +1755,7 @@ void Sram_Alloc(GameState* gameState, SramContext* sramCtx) { /** * Synchronous flash write */ -void func_80146EBC(SramContext* sramCtx, s32 curPage, s32 numPages) { +void Sram_SyncWriteToFlash(SramContext* sramCtx, s32 curPage, s32 numPages) { sramCtx->curPage = curPage; sramCtx->numPages = numPages; SysFlashrom_WriteDataSync(sramCtx->saveBuf, curPage, numPages); @@ -1533,8 +1771,8 @@ void Sram_SaveSpecialEnterClockTown(PlayState* play) { gSaveContext.save.isFirstCycle = true; gSaveContext.save.isOwlSave = false; func_80145698(sramCtx); - SysFlashrom_WriteDataSync(sramCtx->saveBuf, D_801C67C8[gSaveContext.fileNum * 2], - D_801C6818[gSaveContext.fileNum * 2]); + SysFlashrom_WriteDataSync(sramCtx->saveBuf, gFlashSaveStartPages[gSaveContext.fileNum * 2], + gFlashSpecialSaveNumPages[gSaveContext.fileNum * 2]); } /** @@ -1555,25 +1793,25 @@ void Sram_SaveSpecialNewDay(PlayState* play) { gSaveContext.save.day = day; gSaveContext.save.time = time; gSaveContext.save.cutsceneIndex = cutsceneIndex; - SysFlashrom_WriteDataSync(play->sramCtx.saveBuf, D_801C67C8[gSaveContext.fileNum * 2], - D_801C67F0[gSaveContext.fileNum * 2]); + SysFlashrom_WriteDataSync(play->sramCtx.saveBuf, gFlashSaveStartPages[gSaveContext.fileNum * 2], + gFlashSaveNumPages[gSaveContext.fileNum * 2]); } -void func_80147008(SramContext* sramCtx, u32 curPage, u32 numPages) { +void Sram_SetFlashPagesDefault(SramContext* sramCtx, u32 curPage, u32 numPages) { sramCtx->curPage = curPage; sramCtx->numPages = numPages; sramCtx->status = 1; } -void func_80147020(SramContext* sramCtx) { +void Sram_StartWriteToFlashDefault(SramContext* sramCtx) { // async flash write SysFlashrom_WriteDataAsync(sramCtx->saveBuf, sramCtx->curPage, sramCtx->numPages); - sramCtx->unk_18 = osGetTime(); + sramCtx->startWriteOsTime = osGetTime(); sramCtx->status = 2; } -void func_80147068(SramContext* sramCtx) { +void Sram_UpdateWriteToFlashDefault(SramContext* sramCtx) { if (sramCtx->status == 2) { if (SysFlashrom_IsBusy() != 0) { // if task running if (SysFlashrom_AwaitResult() == 0) { // wait for task done @@ -1584,25 +1822,26 @@ void func_80147068(SramContext* sramCtx) { sramCtx->status = 4; } } - } else if (OSTIME_TO_TIMER(osGetTime() - sramCtx->unk_18) >= SECONDS_TO_TIMER(2)) { + } else if (OSTIME_TO_TIMER(osGetTime() - sramCtx->startWriteOsTime) >= SECONDS_TO_TIMER(2)) { + // Finished status is hardcoded to 2 seconds instead of when the task finishes sramCtx->status = 0; } } -void func_80147138(SramContext* sramCtx, s32 curPage, s32 numPages) { +void Sram_SetFlashPagesOwlSave(SramContext* sramCtx, s32 curPage, s32 numPages) { sramCtx->curPage = curPage; sramCtx->numPages = numPages; sramCtx->status = 6; } -void func_80147150(SramContext* sramCtx) { +void Sram_StartWriteToFlashOwlSave(SramContext* sramCtx) { SysFlashrom_WriteDataAsync(sramCtx->saveBuf, sramCtx->curPage, sramCtx->numPages); - sramCtx->unk_18 = osGetTime(); + sramCtx->startWriteOsTime = osGetTime(); sramCtx->status = 7; } -void func_80147198(SramContext* sramCtx) { +void Sram_UpdateWriteToFlashOwlSave(SramContext* sramCtx) { if (sramCtx->status == 7) { if (SysFlashrom_IsBusy() != 0) { // Is task running if (SysFlashrom_AwaitResult() == 0) { // Wait for task done @@ -1621,7 +1860,8 @@ void func_80147198(SramContext* sramCtx) { sramCtx->status = 4; } } - } else if (OSTIME_TO_TIMER(osGetTime() - sramCtx->unk_18) >= SECONDS_TO_TIMER(2)) { + } else if (OSTIME_TO_TIMER(osGetTime() - sramCtx->startWriteOsTime) >= SECONDS_TO_TIMER(2)) { + // Finished status is hardcoded to 2 seconds instead of when the task finishes sramCtx->status = 0; bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE); gSaveContext.save.isOwlSave = false; @@ -1648,8 +1888,9 @@ void func_80147314(SramContext* sramCtx, s32 fileNum) { gSaveContext.save.saveInfo.checksum = Sram_CalcChecksum(&gSaveContext, offsetof(SaveContext, fileNum)); Lib_MemCpy(sramCtx->saveBuf, &gSaveContext, offsetof(SaveContext, fileNum)); - func_80146EBC(sramCtx, D_801C6840[fileNum * 2], D_801C6850[fileNum * 2]); - func_80146EBC(sramCtx, D_801C6840[fileNum * 2 + 1], D_801C6850[fileNum * 2]); + Sram_SyncWriteToFlash(sramCtx, gFlashOwlSaveStartPages[fileNum * 2], gFlashOwlSaveNumPages[fileNum * 2]); + //! Note: should be `gFlashOwlSaveNumPages[fileNum * 2 + 1]`? + Sram_SyncWriteToFlash(sramCtx, gFlashOwlSaveStartPages[fileNum * 2 + 1], gFlashOwlSaveNumPages[fileNum * 2]); gSaveContext.save.isOwlSave = true; @@ -1661,6 +1902,7 @@ void func_80147314(SramContext* sramCtx, s32 fileNum) { gSaveContext.save.saveInfo.playerData.newf[5] = '3'; } +// Used by `Sram_CopySave` with `isOwlSave` set void func_80147414(SramContext* sramCtx, s32 fileNum, s32 arg2) { s32 pad; @@ -1668,16 +1910,18 @@ void func_80147414(SramContext* sramCtx, s32 fileNum, s32 arg2) { bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE); // Read save file - if (SysFlashrom_ReadData(sramCtx->saveBuf, D_801C6840[fileNum * 2], D_801C6850[fileNum * 2]) != 0) { + if (SysFlashrom_ReadData(sramCtx->saveBuf, gFlashOwlSaveStartPages[fileNum * 2], + gFlashOwlSaveNumPages[fileNum * 2]) != 0) { // If failed, read backup save file - SysFlashrom_ReadData(sramCtx->saveBuf, D_801C6840[fileNum * 2 + 1], D_801C6850[fileNum * 2 + 1]); + SysFlashrom_ReadData(sramCtx->saveBuf, gFlashOwlSaveStartPages[fileNum * 2 + 1], + gFlashOwlSaveNumPages[fileNum * 2 + 1]); } // Copy buffer to save context Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, offsetof(SaveContext, fileNum)); - func_80146EBC(sramCtx, D_801C6840[arg2 * 2], D_801C6850[arg2 * 2]); - func_80146EBC(sramCtx, D_801C6840[arg2 * 2 + 1], D_801C6850[arg2 * 2]); + Sram_SyncWriteToFlash(sramCtx, gFlashOwlSaveStartPages[arg2 * 2], gFlashOwlSaveNumPages[arg2 * 2]); + Sram_SyncWriteToFlash(sramCtx, gFlashOwlSaveStartPages[arg2 * 2 + 1], gFlashOwlSaveNumPages[arg2 * 2]); } void Sram_nop8014750C(UNK_TYPE4 arg0) { diff --git a/src/code/z_sub_s.c b/src/code/z_sub_s.c index 35886da18..1c3f1ae3a 100644 --- a/src/code/z_sub_s.c +++ b/src/code/z_sub_s.c @@ -188,7 +188,7 @@ s32 SubS_UpdateLimb(s16 newRotZ, s16 newRotY, Vec3f* pos, Vec3s* rot, s32 stepRo Matrix_MultVec3f(&zeroVec, &newPos); Matrix_Get(&curState); - Matrix_MtxFToYXZRot(&curState, &newRot, MTXMODE_NEW); + Matrix_MtxFToYXZRot(&curState, &newRot, false); *pos = newPos; if (!stepRot && !overrideRot) { @@ -577,7 +577,7 @@ s32 SubS_HasReachedPoint(Actor* actor, Path* path, s32 pointIndex) { diffZ = points[index + 1].z - points[index - 1].z; } - func_8017B7F8(&point, RAD_TO_BINANG(func_80086B30(diffX, diffZ)), &px, &pz, &d); + func_8017B7F8(&point, RAD_TO_BINANG(Math_FAtan2F(diffX, diffZ)), &px, &pz, &d); if (((px * actor->world.pos.x) + (pz * actor->world.pos.z) + d) > 0.0f) { reached = true; } diff --git a/src/code/z_vr_box.c b/src/code/z_vr_box.c index 911e3e757..dd0785d94 100644 --- a/src/code/z_vr_box.c +++ b/src/code/z_vr_box.c @@ -239,7 +239,7 @@ void func_80143324(PlayState* play, SkyboxContext* skyboxCtx, s16 skyboxId) { case SKYBOX_NORMAL_SKY: osCreateMesgQueue(&skyboxCtx->loadQueue, &skyboxCtx->loadMsg, 1); - if (play->envCtx.unk_10 == 0) { + if (play->envCtx.skybox1Index == 0) { // Send a DMA request for the clear sky texture size = SEGMENT_ROM_SIZE(d2_fine_static); @@ -256,7 +256,7 @@ void func_80143324(PlayState* play, SkyboxContext* skyboxCtx, s16 skyboxId) { osRecvMesg(&skyboxCtx->loadQueue, NULL, OS_MESG_BLOCK); osCreateMesgQueue(&skyboxCtx->loadQueue, &skyboxCtx->loadMsg, 1); - if (play->envCtx.unk_11 == 0) { + if (play->envCtx.skybox2Index == 0) { // Send a DMA request for the clear sky texture size = SEGMENT_ROM_SIZE(d2_fine_static); |
