Work on load game menu
This commit is contained in:
parent
44b6080582
commit
6a3bd6b405
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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 &&
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -13,6 +13,7 @@ struct PartialTransform {
|
|||
};
|
||||
|
||||
void checkpointClear();
|
||||
void checkpointUse(Checkpoint checkpoint);
|
||||
void checkpointSave(struct Scene* scene);
|
||||
void checkpointLoadLast(struct Scene* scene);
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue