Save sign on state
Add cheat code for unlocking all levels
This commit is contained in:
parent
bb9eefb73c
commit
00cc732bd9
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -7,6 +7,7 @@ enum CheatCode {
|
|||
CheatCodeUnlockGun,
|
||||
CheatCodeHighJump,
|
||||
CheatCodeInvincibility,
|
||||
CheatCodeAllLevels,
|
||||
CheatCodeCount,
|
||||
};
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue