Support save file deletion on load/save menus with Z trigger
This commit is contained in:
parent
bc30375226
commit
5036b40505
|
@ -31,19 +31,34 @@ void loadGamePopulate(struct LoadGameMenu* loadGame) {
|
|||
}
|
||||
|
||||
enum InputCapture loadGameUpdate(struct LoadGameMenu* loadGame) {
|
||||
if (controllerGetButtonDown(0, A_BUTTON) && loadGame->savefileList->numberOfSaves) {
|
||||
Checkpoint* save = stackMalloc(MAX_CHECKPOINT_SIZE);
|
||||
int testChamber;
|
||||
int testSubject;
|
||||
savefileLoadGame(savefileGetSlot(loadGame->savefileList), save, &testChamber, &testSubject);
|
||||
gCurrentTestSubject = testSubject;
|
||||
|
||||
levelQueueLoad(getLevelIndexFromChamberDisplayNumber(testChamber), NULL, NULL);
|
||||
checkpointUse(save);
|
||||
if (loadGame->savefileList->numberOfSaves) {
|
||||
if (controllerGetButtonDown(0, A_BUTTON)) {
|
||||
Checkpoint* save = stackMalloc(MAX_CHECKPOINT_SIZE);
|
||||
int testChamber;
|
||||
int testSubject;
|
||||
savefileLoadGame(savefileGetSlot(loadGame->savefileList), save, &testChamber, &testSubject);
|
||||
gCurrentTestSubject = testSubject;
|
||||
|
||||
stackMallocFree(save);
|
||||
levelQueueLoad(getLevelIndexFromChamberDisplayNumber(testChamber), NULL, NULL);
|
||||
checkpointUse(save);
|
||||
|
||||
soundPlayerPlay(SOUNDS_BUTTONCLICKRELEASE, 1.0f, 0.5f, NULL, NULL, SoundTypeAll);
|
||||
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);
|
||||
|
|
|
@ -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) {
|
||||
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);
|
||||
soundPlayerPlay(SOUNDS_BUTTONCLICKRELEASE, 1.0f, 0.5f, NULL, NULL, SoundTypeAll);
|
||||
}else{
|
||||
soundPlayerPlay(SOUNDS_WPN_DENYSELECT, 1.0f, 0.5f, NULL, NULL, SoundTypeAll);
|
||||
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, 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);
|
||||
}
|
||||
}
|
||||
stackMallocFree(save);
|
||||
}
|
||||
|
||||
return savefileListUpdate(saveGame->savefileList);
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in a new issue