Support save file deletion on load/save menus with Z trigger

This commit is contained in:
Matt Penny 2023-12-19 15:37:49 -05:00
parent bc30375226
commit 5036b40505
4 changed files with 76 additions and 23 deletions

View file

@ -31,7 +31,8 @@ void loadGamePopulate(struct LoadGameMenu* loadGame) {
}
enum InputCapture loadGameUpdate(struct LoadGameMenu* loadGame) {
if (controllerGetButtonDown(0, A_BUTTON) && loadGame->savefileList->numberOfSaves) {
if (loadGame->savefileList->numberOfSaves) {
if (controllerGetButtonDown(0, A_BUTTON)) {
Checkpoint* save = stackMalloc(MAX_CHECKPOINT_SIZE);
int testChamber;
int testSubject;
@ -44,6 +45,20 @@ enum InputCapture loadGameUpdate(struct LoadGameMenu* loadGame) {
stackMallocFree(save);
soundPlayerPlay(SOUNDS_BUTTONCLICKRELEASE, 1.0f, 0.5f, NULL, NULL, SoundTypeAll);
} else if (controllerGetButtonDown(0, Z_TRIG)) {
short selectedSaveIndex = loadGame->savefileList->selectedSave;
struct SavefileInfo* selectedSave = &loadGame->savefileList->savefileInfo[selectedSaveIndex];
savefileDeleteGame(selectedSave->slotIndex);
loadGamePopulate(loadGame);
if (selectedSaveIndex >= loadGame->savefileList->numberOfSaves) {
--selectedSaveIndex;
}
loadGame->savefileList->selectedSave = selectedSaveIndex;
soundPlayerPlay(SOUNDS_BUTTONCLICKRELEASE, 1.0f, 0.5f, NULL, NULL, SoundTypeAll);
}
}
return savefileListUpdate(loadGame->savefileList);

View file

@ -59,16 +59,35 @@ void saveGamePopulate(struct SaveGameMenu* saveGame, int includeNew) {
}
enum InputCapture saveGameUpdate(struct SaveGameMenu* saveGame) {
if (controllerGetButtonDown(0, A_BUTTON) && saveGame->savefileList->numberOfSaves) {
if (saveGame->savefileList->numberOfSaves) {
if (controllerGetButtonDown(0, A_BUTTON)) {
Checkpoint* save = stackMalloc(MAX_CHECKPOINT_SIZE);
if (checkpointSaveInto(&gScene, save)) {
savefileSaveGame(save, gScreenGrabBuffer, getChamberDisplayNumberFromLevelIndex(gCurrentLevelIndex, gScene.player.body.currentRoom), gCurrentTestSubject, savefileGetSlot(saveGame->savefileList));
saveGamePopulate(saveGame, 0);
saveGamePopulate(saveGame, 1);
soundPlayerPlay(SOUNDS_BUTTONCLICKRELEASE, 1.0f, 0.5f, NULL, NULL, SoundTypeAll);
} else {
soundPlayerPlay(SOUNDS_WPN_DENYSELECT, 1.0f, 0.5f, NULL, NULL, SoundTypeAll);
}
stackMallocFree(save);
} else if (controllerGetButtonDown(0, Z_TRIG)) {
int selectedSlotIndex = savefileGetSlot(saveGame->savefileList);
if (selectedSlotIndex == savefileFirstFreeSlot()) {
// Disallow deleting "new save" entry
soundPlayerPlay(SOUNDS_WPN_DENYSELECT, 1.0f, 0.5f, NULL, NULL, SoundTypeAll);
} else {
short selectedListIndex = saveGame->savefileList->selectedSave;
savefileDeleteGame(selectedSlotIndex);
saveGamePopulate(saveGame, 1);
if (selectedListIndex >= saveGame->savefileList->numberOfSaves) {
--selectedListIndex;
}
saveGame->savefileList->selectedSave = selectedListIndex;
soundPlayerPlay(SOUNDS_BUTTONCLICKRELEASE, 1.0f, 0.5f, NULL, NULL, SoundTypeAll);
}
}
}
return savefileListUpdate(saveGame->savefileList);

View file

@ -85,9 +85,7 @@ void savefileNew() {
gSaveData.header.flags = 0;
for (int i = 0; i < MAX_SAVE_SLOTS; ++i) {
gSaveData.saveSlotMetadata[i].testChamber = NO_TEST_CHAMBER;
gSaveData.saveSlotMetadata[i].testSubjectNumber = 0xFF;
gSaveData.saveSlotMetadata[i].saveSlotOrder = 0xFF;
savefileDeleteGame(i);
}
controllerSetDefaultSource();
@ -152,6 +150,25 @@ void savefileSave() {
savefileSramSave((void*)SRAM_ADDR, &gSaveData, sizeof(gSaveData));
}
void savefileDeleteGame(int slotIndex) {
unsigned char prevSortOrder = gSaveData.saveSlotMetadata[slotIndex].saveSlotOrder;
// shift existing slot sort orders
for (int i = 0; i < MAX_SAVE_SLOTS; ++i) {
unsigned char currSlotOrder = gSaveData.saveSlotMetadata[i].saveSlotOrder;
if (currSlotOrder > prevSortOrder && currSlotOrder < 0xFF) {
--gSaveData.saveSlotMetadata[i].saveSlotOrder;
}
}
gSaveData.saveSlotMetadata[slotIndex].testChamber = NO_TEST_CHAMBER;
gSaveData.saveSlotMetadata[slotIndex].testSubjectNumber = 0xFF;
gSaveData.saveSlotMetadata[slotIndex].saveSlotOrder = 0xFF;
savefileSave();
}
#define SAVE_SLOT_SRAM_ADDRESS(index) (SRAM_ADDR + (1 + (index)) * SAVE_SLOT_SIZE)
void savefileSaveGame(Checkpoint checkpoint, u16* screenshot, int testChamberDisplayNumber, int subjectNumber, int slotIndex) {

View file

@ -90,6 +90,8 @@ extern int gCurrentTestSubject;
void savefileLoad();
void savefileSave();
void savefileDeleteGame(int slotIndex);
void savefileSaveGame(Checkpoint checkpoint, u16* screenshot, int testChamberIndex, int subjectNumber, int slotIndex);
int savefileListSaves(struct SaveSlotInfo* slots, int includeAuto);
int savefileNextTestSubject();