Save sign on state

Add cheat code for unlocking all levels
This commit is contained in:
James Lambert 2023-11-27 20:09:02 -07:00
parent bb9eefb73c
commit 00cc732bd9
7 changed files with 38 additions and 13 deletions

View file

@ -4,6 +4,7 @@
#include "../audio/soundplayer.h"
#include "../scene/scene.h"
#include "../build/src/audio/clips.h"
#include "../savefile/savefile.h"
struct CheatCodePattern gCheatCodes[CheatCodeCount] = {
[CheatCodeUnlockGun] = {
@ -18,6 +19,10 @@ struct CheatCodePattern gCheatCodes[CheatCodeCount] = {
{'u', 'd', 'u', 'd', 'u', 'd', 'l', 'l'},
SOUNDS_BUTTONCLICKRELEASE,
},
[CheatCodeAllLevels] = {
{'u', 'r', 'd', 'l', 'u', 'r', 'd', 'l'},
SOUNDS_BUTTONCLICKRELEASE,
},
};
unsigned char gCheatProgress[CheatCodeCount];
@ -40,6 +45,9 @@ void cheatCodeApply(enum CheatCode cheat) {
case CheatCodeInvincibility:
playerToggleInvincibility(&gScene.player);
break;
case CheatCodeAllLevels:
savefileMarkChapterProgress(7);
break;
case CheatCodeCount:
break;
}

View file

@ -7,6 +7,7 @@ enum CheatCode {
CheatCodeUnlockGun,
CheatCodeHighJump,
CheatCodeInvincibility,
CheatCodeAllLevels,
CheatCodeCount,
};

View file

@ -118,14 +118,7 @@ void newGameInit(struct NewGameMenu* newGameMenu) {
newGameMenu->chapterOffset = 0;
newGameMenu->selectedChapter = 0;
for (
newGameMenu->chapterCount = 1;
newGameMenu->chapterCount < MAX_CHAPTER_COUNT &&
gChapters[newGameMenu->chapterCount].testChamberNumber <= gSaveData.header.chapterProgress;
++newGameMenu->chapterCount) {
// do nothing
}
newGameMenu->chapterCount = 1;
}
void newGameRebuildText(struct NewGameMenu* newGameMenu) {
@ -137,6 +130,12 @@ void newGameRebuildText(struct NewGameMenu* newGameMenu) {
}
enum InputCapture newGameUpdate(struct NewGameMenu* newGameMenu) {
// this is done on update so if the unlock menu cheat is used it shows up right away
while (newGameMenu->chapterCount < MAX_CHAPTER_COUNT &&
gChapters[newGameMenu->chapterCount].testChamberNumber <= gSaveData.header.chapterProgress) {
++newGameMenu->chapterCount;
}
if (controllerGetButtonDown(0, B_BUTTON)) {
return InputCaptureExit;
}

View file

@ -291,6 +291,13 @@ int savefileOldestSlot() {
return result;
}
void savefileMarkChapterProgress(int chamberNumber) {
if (chamberNumber > gSaveData.header.chapterProgress) {
gSaveData.header.chapterProgress = chamberNumber;
savefileSave();
}
}
int savefileFirstFreeSlot() {
for (int i = 1; i < MAX_SAVE_SLOTS; ++i) {
if (gSaveData.saveSlotMetadata[i].testChamber == NO_TEST_CHAMBER) {

View file

@ -20,7 +20,7 @@
#define SCREEN_SHOT_SRAM(slotIndex) (((slotIndex) + 1) * SAVE_SLOT_SIZE + MAX_CHECKPOINT_SIZE + SRAM_START_ADDR)
#define SAVEFILE_HEADER 0xDEF4
#define SAVEFILE_HEADER 0xDEF5
// first save slot is always reserved for auto save
#define MAX_SAVE_SLOTS ((int)(SRAM_SIZE / SAVE_SLOT_SIZE) - 1)
@ -96,6 +96,8 @@ int savefileNextTestSubject();
int savefileSuggestedSlot(int testSubject);
int savefileOldestSlot();
void savefileMarkChapterProgress(int chamberNumber);
int savefileFirstFreeSlot();
void savefileLoadGame(int slot, Checkpoint checkpoint, int* testChamberIndex, int* subjectNumber);

View file

@ -418,6 +418,13 @@ void switchSerialize(struct Serializer* serializer, SerializeAction action, stru
}
}
void signageSerialize(struct Serializer* serializer, SerializeAction action, struct Scene* scene) {
for (int i = 0; i < scene->signageCount; ++i) {
struct Signage* signage = &scene->signage[i];
action(serializer, &signage->currentFrame, sizeof(signage->currentFrame));
}
}
void sceneAnimatorDeserialize(struct Serializer* serializer, struct Scene* scene) {
for (int i = 0; i < scene->animator.animatorCount; ++i) {
serializeRead(serializer, &scene->animator.state[i].playbackSpeed, sizeof(float));
@ -468,6 +475,8 @@ void sceneSerialize(struct Serializer* serializer, SerializeAction action, struc
WRITE_ALIGN_CHECK;
pedestalSerialize(serializer, action, scene);
WRITE_ALIGN_CHECK;
signageSerialize(serializer, action, scene);
WRITE_ALIGN_CHECK;
launcherSerialize(serializer, action, scene);
WRITE_ALIGN_CHECK;
catcherSerialize(serializer, action, scene);
@ -497,6 +506,8 @@ void sceneDeserialize(struct Serializer* serializer, struct Scene* scene) {
READ_ALIGN_CHECK;
pedestalDeserialize(serializer, scene);
READ_ALIGN_CHECK;
signageSerialize(serializer, serializeRead, scene);
READ_ALIGN_CHECK;
launcherDeserialize(serializer, scene);
READ_ALIGN_CHECK;
catcherDeserialize(serializer, scene);

View file

@ -90,10 +90,7 @@ void sceneInit(struct Scene* scene) {
checkpointLoadLast(scene);
}
if (gCurrentLevelIndex > gSaveData.header.chapterProgress) {
gSaveData.header.chapterProgress = gCurrentLevelIndex;
savefileSave();
}
savefileMarkChapterProgress(gCurrentLevelIndex);
gGameMenu.state = GameMenuStateResumeGame;
scene->ignorePortalGun = 0;