summaryrefslogtreecommitdiff
path: root/src/code
diff options
context:
space:
mode:
authorengineer124 <engineer124engineer124@gmail.com>2023-06-11 01:34:53 +1000
committerengineer124 <engineer124engineer124@gmail.com>2023-06-11 01:34:53 +1000
commit5fc0024b72622125a689aa5ae080337fe578f1ff (patch)
tree656ce93b5d46e86ed453980019f2110c877dd869 /src/code
parent3dd8096af5af84fab0cd3a664d3e1e888224274d (diff)
parent47be99fb0cde762466ab8dd7d2471dd278a59040 (diff)
Merge branch 'master' into parameter
Diffstat (limited to 'src/code')
-rw-r--r--src/code/game.c6
-rw-r--r--src/code/graph.c3
-rw-r--r--src/code/sys_cmpdma.c4
-rw-r--r--src/code/sys_math.c33
-rw-r--r--src/code/z_actor.c18
-rw-r--r--src/code/z_bgcheck.c3
-rw-r--r--src/code/z_camera.c40
-rw-r--r--src/code/z_common_data.c6
-rw-r--r--src/code/z_demo.c21
-rw-r--r--src/code/z_draw.c6
-rw-r--r--src/code/z_eff_blure.c24
-rw-r--r--src/code/z_en_item00.c12
-rw-r--r--src/code/z_eventmgr.c2
-rw-r--r--src/code/z_fbdemo_circle.c2
-rw-r--r--src/code/z_fireobj.c3
-rw-r--r--src/code/z_game_dlftbls.c2
-rw-r--r--src/code/z_game_over.c2
-rw-r--r--src/code/z_kaleido_scope_call.c1
-rw-r--r--src/code/z_lib.c6
-rw-r--r--src/code/z_lifemeter.c4
-rw-r--r--src/code/z_message.c68
-rw-r--r--src/code/z_olib.c8
-rw-r--r--src/code/z_parameter.c12
-rw-r--r--src/code/z_play.c50
-rw-r--r--src/code/z_play_hireso.c1362
-rw-r--r--src/code/z_player_lib.c20
-rw-r--r--src/code/z_prenmi.c8
-rw-r--r--src/code/z_quake.c1
-rw-r--r--src/code/z_room.c8
-rw-r--r--src/code/z_scene.c4
-rw-r--r--src/code/z_skelanime.c1
-rw-r--r--src/code/z_sram_NES.c858
-rw-r--r--src/code/z_sub_s.c4
-rw-r--r--src/code/z_vr_box.c4
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);