Work on load game menu

This commit is contained in:
James Lambert 2023-05-03 08:29:09 -06:00
parent 44b6080582
commit 6a3bd6b405
10 changed files with 68 additions and 21 deletions

View file

@ -130,8 +130,17 @@ void levelQueueLoad(int index, struct Transform* relativeExitTransform, struct V
} else {
gQueuedLevel = index;
}
gRelativeTransform = *relativeExitTransform;
gRelativeVelocity = *relativeVelocity;
if (relativeExitTransform) {
gRelativeTransform = *relativeExitTransform;
} else {
transformInitIdentity(&gRelativeTransform);
gRelativeTransform.position.y = 1.0f;
}
if (relativeVelocity) {
gRelativeVelocity = *relativeVelocity;
} else {
gRelativeVelocity = gZeroVec;
}
checkpointClear();
}

View file

@ -1,6 +1,9 @@
#include "load_game.h"
#include "../savefile/savefile.h"
#include "../controls/controller.h"
#include "../levels/levels.h"
#include "../util/memory.h"
void loadGameMenuInit(struct LoadGameMenu* loadGame, struct SavefileListMenu* savefileList) {
loadGame->savefileList = savefileList;
@ -23,6 +26,19 @@ void loadGamePopulate(struct LoadGameMenu* loadGame) {
}
enum MenuDirection loadGameUpdate(struct LoadGameMenu* loadGame) {
if (controllerGetButtonDown(0, A_BUTTON) && loadGame->savefileList->numberOfSaves) {
Checkpoint* save = stackMalloc(MAX_CHECKPOINT_SIZE);
int level;
int testSubject;
savefileLoadGame(savefileGetSlot(loadGame->savefileList), save, &level, &testSubject);
gCurrentTestSubject = testSubject;
levelQueueLoad(level, NULL, NULL);
checkpointUse(save);
stackMallocFree(save);
}
return savefileListUpdate(loadGame->savefileList);
}

View file

@ -11,6 +11,7 @@
#include "../build/assets/materials/images.h"
#include "../levels/levels.h"
#include "../savefile/savefile.h"
#include "../controls/controller.h"
struct Chapter gChapters[] = {
@ -124,11 +125,8 @@ enum MenuDirection newGameUpdate(struct NewGameMenu* newGameMenu) {
}
if (controllerGetButtonDown(0, A_BUTTON) && gChapters[newGameMenu->selectedChapter + 1].testChamberNumber >= 0) {
struct Transform identityTransform;
transformInitIdentity(&identityTransform);
identityTransform.position.y = 1.0f;
levelQueueLoad(gChapters[newGameMenu->selectedChapter].testChamberNumber, &identityTransform, &gZeroVec);
gCurrentTestSubject = savefileNextTestSubject();
levelQueueLoad(gChapters[newGameMenu->selectedChapter].testChamberNumber, NULL, NULL);
}
if ((controllerGetDirectionDown(0) & ControllerDirectionRight) != 0 &&

View file

@ -15,11 +15,18 @@ void saveGamePopulate(struct SaveGameMenu* saveGame, int includeNew) {
int numberOfSaves = savefileListSaves(saveSlots, 0);
int suggestedSlot = savefileSuggestedSlot(gCurrentTestSubject);
int startSelection = -1;
for (int i = 0; i < numberOfSaves; ++i) {
savefileInfo[i].slotIndex = saveSlots[i].saveSlot;
savefileInfo[i].testchamberIndex = saveSlots[i].testChamber;
savefileInfo[i].savefileName = NULL;
savefileInfo[i].screenshot = (u16*)SCREEN_SHOT_SRAM(saveSlots[i].saveSlot);
if (suggestedSlot == saveSlots[i].saveSlot) {
startSelection = i;
}
}
int freeSlot = savefileFirstFreeSlot();
@ -29,21 +36,29 @@ void saveGamePopulate(struct SaveGameMenu* saveGame, int includeNew) {
savefileInfo[numberOfSaves].savefileName = "NEW SAVE";
savefileInfo[numberOfSaves].testchamberIndex = gCurrentLevelIndex;
savefileInfo[numberOfSaves].screenshot = gScreenGrabBuffer;
if (suggestedSlot == 0) {
startSelection = numberOfSaves;
}
++numberOfSaves;
}
savefileUseList(saveGame->savefileList, "SAVE GAME", savefileInfo, numberOfSaves);
saveGame->savefileList->selectedSave = savefileSuggestedSlot(gCurrentTestSubject);
if (startSelection != -1) {
saveGame->savefileList->selectedSave = startSelection;
}
}
enum MenuDirection saveGameUpdate(struct SaveGameMenu* saveGame) {
if (controllerGetButton(0, A_BUTTON) && saveGame->savefileList->numberOfSaves) {
if (controllerGetButtonDown(0, A_BUTTON) && saveGame->savefileList->numberOfSaves) {
Checkpoint* save = stackMalloc(MAX_CHECKPOINT_SIZE);
if (checkpointSaveInto(&gScene, save)) {
savefileSaveGame(save, gScreenGrabBuffer, gCurrentLevelIndex, gCurrentTestSubject, savefileGetSlot(saveGame->savefileList));
saveGamePopulate(saveGame, 0);
}
stackMallocFree(save);
}
return savefileListUpdate(saveGame->savefileList);

View file

@ -44,6 +44,8 @@ void savefileListSlotUseInfo(struct SavefileListSlot* savefileListSlot, struct S
savefileListSlot->slotIndex = savefileInfo->slotIndex;
savefileLoadScreenshot(savefileListSlot->imageData, savefileInfo->screenshot);
savefileListSlot->x = x;
savefileListSlot->y = y;
}
void savefileListSlotInit(struct SavefileListSlot* savefileListSlot, int x, int y) {

View file

@ -57,6 +57,11 @@ void checkpointClear() {
gHasCheckpoint = 0;
}
void checkpointUse(Checkpoint checkpoint) {
memCopy(gCheckpoint, checkpoint, MAX_CHECKPOINT_SIZE);
gHasCheckpoint = 1;
}
int checkpointExists() {
if (gHasCheckpoint != 0){
return 1;

View file

@ -13,6 +13,7 @@ struct PartialTransform {
};
void checkpointClear();
void checkpointUse(Checkpoint checkpoint);
void checkpointSave(struct Scene* scene);
void checkpointLoadLast(struct Scene* scene);

View file

@ -126,7 +126,11 @@ void savefileLoad() {
__osPiTable = &gSramHandle;
osSetIntMask(saveMask);
if (!savefileSramLoad((void*)SRAM_ADDR, &gSaveData, sizeof(gSaveData)) || gSaveData.header.header != SAVEFILE_HEADER) {
if (!savefileSramLoad((void*)SRAM_ADDR, &gSaveData, sizeof(gSaveData))) {
savefileNew();
}
if (gSaveData.header.header != SAVEFILE_HEADER) {
savefileNew();
}
}
@ -296,8 +300,10 @@ int savefileFirstFreeSlot() {
return SAVEFILE_NO_SLOT;
}
void savefileLoadGame(int slot, Checkpoint checkpoint) {
void savefileLoadGame(int slot, Checkpoint checkpoint, int* testChamberIndex, int* subjectNumber) {
savefileSramLoad((void*)SAVE_SLOT_SRAM_ADDRESS(slot), checkpoint, MAX_CHECKPOINT_SIZE);
*testChamberIndex = gSaveData.saveSlotMetadata[slot].testChamber;
*subjectNumber = gSaveData.saveSlotMetadata[slot].testSubjectNumber;
}
void savefileLoadScreenshot(u16* target, u16* location) {

View file

@ -18,9 +18,9 @@
#define SAVE_SLOT_SIZE (MAX_CHECKPOINT_SIZE + THUMBNAIL_IMAGE_SPACE)
#define SCREEN_SHOT_SRAM(slotIndex) (((slotIndex) + 1) * SAVE_SLOT_SIZE + MAX_CHECKPOINT_SIZE)
#define SCREEN_SHOT_SRAM(slotIndex) (((slotIndex) + 1) * SAVE_SLOT_SIZE + MAX_CHECKPOINT_SIZE + SRAM_START_ADDR)
#define SAVEFILE_HEADER 0xDEAE
#define SAVEFILE_HEADER 0xDEAD
// first save slot is always reserved for auto save
#define MAX_SAVE_SLOTS ((int)(SRAM_SIZE / SAVE_SLOT_SIZE) - 1)
@ -87,7 +87,7 @@ int savefileOldestSlot();
int savefileFirstFreeSlot();
void savefileLoadGame(int slot, Checkpoint checkpoint);
void savefileLoadGame(int slot, Checkpoint checkpoint, int* testChamberIndex, int* subjectNumber);
void savefileLoadScreenshot(u16* target, u16* location);
#endif

View file

@ -466,9 +466,7 @@ void sceneUpdate(struct Scene* scene) {
}
if (gGameMenu.state == GameMenuStateQuit) {
struct Transform identityTransform;
transformInitIdentity(&identityTransform);
levelQueueLoad(MAIN_MENU, &identityTransform, &gZeroVec);
levelQueueLoad(MAIN_MENU, NULL, NULL);
return;
}
@ -632,10 +630,7 @@ void sceneUpdate(struct Scene* scene) {
vector3Add(&scene->camera.transform.position, &scene->freeCameraOffset, &scene->camera.transform.position);
if (controllerGetButtonDown(2, L_TRIG)) {
struct Transform identityTransform;
transformInitIdentity(&identityTransform);
identityTransform.position.y = 1.0f;
levelQueueLoad(NEXT_LEVEL, &identityTransform, &gZeroVec);
levelQueueLoad(NEXT_LEVEL, NULL, NULL);
}
}