Skip to content

Commit

Permalink
Merge pull request #4 from Z3DR/saved-spoiler
Browse files Browse the repository at this point in the history
Spoiler Saving
  • Loading branch information
PhlexPlexico authored Jan 22, 2024
2 parents 16582ec + fb87a7a commit 59cdea2
Show file tree
Hide file tree
Showing 8 changed files with 74 additions and 13 deletions.
10 changes: 10 additions & 0 deletions code/include/rnd/entrance.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#ifndef __RND_ENTRANCE_H
#define __RND_ENTRANCE_H

#include "common/advanced_context.h"
#include "game/common_data.h"
#include "rnd/savefile.h"

void Entrance_EnteredLocation(void);

#endif // __RND_ENTRANCE_H
7 changes: 6 additions & 1 deletion code/include/rnd/savefile.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@
#include "z3d/z3DVec.h"

// Increment the version number whenever the ExtSaveData structure is changed
#define EXTSAVEDATA_VERSION 07
#define EXTSAVEDATA_VERSION 8
#define SAVEFILE_SCENES_DISCOVERED_IDX_COUNT 4
#define SAVEFILE_SPOILER_ITEM_MAX 512

namespace rnd {
void SaveFile_SkipMinorCutscenes();
Expand All @@ -26,6 +28,7 @@ namespace rnd {
void SaveFile_ResetItemSlotsIfMatchesID(u8 itemSlot);
bool SaveFile_IsValidSettingsHealth(void);
void SaveFile_InitExtSaveData(u32 fileBaseIndex);
void SaveFile_SetSceneDiscovered(u16 sceneNum);
void SaveFile_LoadExtSaveData(u32 saveNumber);
u8 SaveFile_GetIsSceneDiscovered(u8 sceneNum);
extern "C" void SaveFile_SaveExtSaveData();
Expand Down Expand Up @@ -89,6 +92,8 @@ namespace rnd {
BitField<6, 2, u8> unused;
};
TingleCollectRegister tingleMaps;
u32 scenesDiscovered[SAVEFILE_SCENES_DISCOVERED_IDX_COUNT];
u8 itemCollected[SAVEFILE_SPOILER_ITEM_MAX];
u8 chestRewarded[116][30]; // Reward table that's stored by scene and chest param/flag.
} ExtSaveData;

Expand Down
4 changes: 4 additions & 0 deletions code/mm.ld
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,10 @@ SECTIONS{
*(.patch_OverrideItemID)
}

.patch_EnteringLocation 0x23aa54 : {
*(.patch_EnteringLocation)
}

/* .patch_TwinmoldConsistentDamage 0x28E544 : {
*(.patch_TwinmoldConsistentDamage)
} */
Expand Down
7 changes: 7 additions & 0 deletions code/source/asm/hooks.s
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,13 @@ noOverrideItemID:
cpy r0,r7
b 0x23110C

.global hook_EnteringLocation
hook_EnteringLocation:
push {r0-r12, lr}
bl Entrance_EnteredLocation
pop {r0-r12, lr}
cpy r9,r0
bx lr

.global hook_DarmaniRewardCheck
hook_DarmaniRewardCheck:
Expand Down
5 changes: 5 additions & 0 deletions code/source/asm/patches.s
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,11 @@ OverrideBomberTextID_patch:
OverrideItemID_patch:
b hook_OverrideItemID

.section .patch_EnteringLocation
.global patch_EnteringLocation
patch_EnteringLocation:
bl hook_EnteringLocation

.section .patch_RemoveGoronMaskCheckDarmani
.global patch_RemoveGoronMaskCheckDarmani
patch_RemoveGoronMaskCheckDarmani:
Expand Down
13 changes: 13 additions & 0 deletions code/source/rnd/entrance.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#include "rnd/entrance.h"

namespace rnd {
extern "C" {
void Entrance_EnteredLocation(u16 sceneNum) {
auto* gctx = rnd::GetContext().gctx;
if (!gctx || gctx->type != game::StateType::Play)
return;

SaveFile_SetSceneDiscovered(sceneNum);
}
}
} // namespace rnd
37 changes: 25 additions & 12 deletions code/source/rnd/savefile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -773,6 +773,8 @@ namespace rnd {
gExtSaveData.tingleMaps.raw = 0;
gExtSaveData.playtimeSeconds = 0;
memset(&gExtSaveData.chestRewarded, 0, sizeof(gExtSaveData.chestRewarded));
memset(&gExtSaveData.scenesDiscovered, 0, sizeof(gExtSaveData.scenesDiscovered));
memset(&gExtSaveData.itemCollected, 0, sizeof(gExtSaveData.itemCollected));
// TODO: Settings options belong in ext.
// memset(&gExtSaveData.scenesDiscovered, 0, sizeof(gExtSaveData.scenesDiscovered));
// memset(&gExtSaveData.entrancesDiscovered, 0, sizeof(gExtSaveData.entrancesDiscovered));
Expand All @@ -784,6 +786,29 @@ namespace rnd {
// gExtSaveData.option_SkipSongReplays = gSettingsContext.skipSongReplays;
}

u8 SaveFile_GetIsSceneDiscovered(u8 sceneNum) {
u32 numBits = sizeof(u32) * 8;
u32 idx = sceneNum / numBits;
if (idx < SAVEFILE_SCENES_DISCOVERED_IDX_COUNT) {
u32 bit = 1 << (sceneNum - (idx * numBits));
return (gExtSaveData.scenesDiscovered[idx] & bit) != 0;
}
return 0;
}

void SaveFile_SetSceneDiscovered(u16 sceneNum) {
if (SaveFile_GetIsSceneDiscovered(sceneNum)) {
return;
}

u16 numBits = sizeof(u32) * 8;
u32 idx = sceneNum / numBits;
if (idx < SAVEFILE_SCENES_DISCOVERED_IDX_COUNT) {
u32 sceneBit = 1 << (sceneNum - (idx * numBits));
gExtSaveData.scenesDiscovered[idx] |= sceneBit;
}
}

extern "C" void SaveFile_LoadExtSaveData() {
char path[] = "/0.bin";
u32 version;
Expand Down Expand Up @@ -836,18 +861,6 @@ namespace rnd {
extDataClose(fileHandle);
}

u8 SaveFile_GetIsSceneDiscovered(u8 sceneNum) {
// TODO: ENSURE THE SCENES ARE CHECKED WITH
// OUR BITFLAGS. NOT USING <<.
/*u32 numBits = sizeof(u32) * 8;
u32 idx = sceneNum / numBits;
if (idx < SAVEFILE_SCENES_DISCOVERED_IDX_COUNT) {
u32 bit = 1 << (sceneNum - (idx * numBits));
return (gExtSaveData.scenesDiscovered[idx] & bit) != 0;
}*/
return 0;
}

extern "C" void SaveFile_SaveExtSaveData() {
#if defined ENABLE_DEBUG || defined DEBUG_PRINT
rnd::util::Print("%s: Saving extdata.\n", __func__);
Expand Down
4 changes: 4 additions & 0 deletions code/source/rnd/spoiler_data.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ namespace rnd {
if (gSpoilerData.ItemLocations[i].LocationScene == scene && gSpoilerData.ItemLocations[i].OverrideType == type &&
gSpoilerData.ItemLocations[i].LocationFlag == flag) {
gSpoilerData.ItemLocations[i].Collected = true;
// Since it's not saved here, we need to return
gExtSaveData.itemCollected[i] = 1;
}
}
return -1;
Expand Down Expand Up @@ -122,6 +124,8 @@ namespace rnd {
SpoilerItemLocation itemLoc = gSpoilerData.ItemLocations[itemIndex];
if (itemLoc.Collected == true) {
return 1;
} else if (gExtSaveData.itemCollected[itemIndex] == 1) {
return 1;
}
if (itemLoc.CollectionCheckType == SPOILER_CHK_ALWAYS_COLLECTED) {
return 1;
Expand Down

0 comments on commit 59cdea2

Please sign in to comment.