Work on game savefile

This commit is contained in:
James Lambert 2023-05-12 20:13:19 -06:00
parent 0602f6c30e
commit 8082d2e563
6 changed files with 34 additions and 14 deletions

View file

@ -136,8 +136,7 @@ Where `/home/james/Blender/blender-2.93.1-linux-x64` is the folder where Blender
<br />
## Current New Feature TODO List
- [ ] Adding y-axis/x-axis inverting options #55
- [ ] Adding look axis sensitivity setting
- [ ] Add auto save checkpoints
- [ ] rotate auto uv
- [ ] disable portal surfaces manually on some surfaces #135
- [ ] Portal not rendering recursively sometimes #138
@ -145,6 +144,8 @@ Where `/home/james/Blender/blender-2.93.1-linux-x64` is the folder where Blender
- [ ] Presort portal gun polygon order #102
- [ ] Adding loading notice between levels #45
- [ ] Vertex lighting #39
- [x] Adding y-axis/x-axis inverting options #55
- [x] Adding look axis sensitivity setting
- [x] Adding a menu to game #47
- [x] Multi controller support #23
- [x] force placing auto portals when there is a conflict

View file

@ -41,6 +41,7 @@ void gameMenuUpdate(struct GameMenu* gameMenu) {
if (option) {
gameMenu->state = option->id;
}
break;
}
case GameMenuStateNewGame:

View file

@ -31,16 +31,16 @@ struct Chapter gChapters[] = {
{NULL, NULL, NULL},
};
#define CHAPTER_COUNT ((sizeof(gChapters) / sizeof(*gChapters)) - 1)
#define MAX_CHAPTER_COUNT ((sizeof(gChapters) / sizeof(*gChapters)) - 1)
struct Chapter* chapterFindForChamber(int chamberIndex) {
for (int i = 1; i < CHAPTER_COUNT; ++i) {
for (int i = 1; i < MAX_CHAPTER_COUNT; ++i) {
if (gChapters[i].testChamberNumber > chamberIndex) {
return &gChapters[i - 1];
}
}
return &gChapters[CHAPTER_COUNT - 1];
return &gChapters[MAX_CHAPTER_COUNT - 1];
}
void chapterMenuInit(struct ChapterMenu* chapterMenu, int x, int y) {
@ -119,6 +119,14 @@ 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) {
}
}
enum MenuDirection newGameUpdate(struct NewGameMenu* newGameMenu) {
@ -126,14 +134,14 @@ enum MenuDirection newGameUpdate(struct NewGameMenu* newGameMenu) {
return MenuDirectionUp;
}
if (controllerGetButtonDown(0, A_BUTTON) && gChapters[newGameMenu->selectedChapter + 1].testChamberNumber >= 0) {
if (controllerGetButtonDown(0, A_BUTTON) && gChapters[newGameMenu->selectedChapter].testChamberNumber >= 0) {
gCurrentTestSubject = savefileNextTestSubject();
soundPlayerPlay(SOUNDS_BUTTONCLICKRELEASE, 1.0f, 0.5f, NULL, NULL);
levelQueueLoad(gChapters[newGameMenu->selectedChapter].testChamberNumber, NULL, NULL);
}
if ((controllerGetDirectionDown(0) & ControllerDirectionRight) != 0 &&
newGameMenu->selectedChapter < CHAPTER_COUNT &&
newGameMenu->selectedChapter + 1 < newGameMenu->chapterCount &&
gChapters[newGameMenu->selectedChapter + 1].imageData) {
newGameMenu->selectedChapter = newGameMenu->selectedChapter + 1;
soundPlayerPlay(SOUNDS_BUTTONROLLOVER, 1.0f, 0.5f, NULL, NULL);
@ -174,7 +182,9 @@ void newGameRender(struct NewGameMenu* newGameMenu, struct RenderState* renderSt
menuSetRenderColor(renderState, newGameMenu->selectedChapter == newGameMenu->chapterOffset, &gSelectionOrange, &gColorBlack);
gSPDisplayList(renderState->dl++, newGameMenu->chapter0.border);
if (newGameMenu->chapter1.chapter->imageData) {
int showSecondChapter = newGameMenu->chapter1.chapter->imageData && newGameMenu->chapter1.chapter->testChamberNumber <= gSaveData.header.chapterProgress;
if (showSecondChapter) {
gDPPipeSync(renderState->dl++);
menuSetRenderColor(renderState, newGameMenu->selectedChapter != newGameMenu->chapterOffset, &gSelectionOrange, &gColorBlack);
gSPDisplayList(renderState->dl++, newGameMenu->chapter1.border);
@ -190,7 +200,7 @@ void newGameRender(struct NewGameMenu* newGameMenu, struct RenderState* renderSt
gSPDisplayList(renderState->dl++, newGameMenu->chapter0.chapterText);
gSPDisplayList(renderState->dl++, newGameMenu->chapter0.testChamberText);
if (newGameMenu->chapter1.chapter->imageData) {
if (showSecondChapter) {
gDPPipeSync(renderState->dl++);
menuSetRenderColor(renderState, newGameMenu->selectedChapter != newGameMenu->chapterOffset, &gSelectionOrange, &gColorWhite);
gSPDisplayList(renderState->dl++, newGameMenu->chapter1.chapterText);
@ -208,7 +218,7 @@ void newGameRender(struct NewGameMenu* newGameMenu, struct RenderState* renderSt
gColorWhite
);
if (newGameMenu->chapter1.chapter->imageData) {
if (showSecondChapter) {
graphicsCopyImage(
renderState, newGameMenu->chapter1.imageBuffer,
84, 48,

View file

@ -40,6 +40,7 @@ struct NewGameMenu {
short selectedChapter;
short chapterOffset;
short chapterCount;
};
void newGameInit(struct NewGameMenu* newGameMenu);

View file

@ -20,7 +20,7 @@
#define SCREEN_SHOT_SRAM(slotIndex) (((slotIndex) + 1) * SAVE_SLOT_SIZE + MAX_CHECKPOINT_SIZE + SRAM_START_ADDR)
#define SAVEFILE_HEADER 0xDEA0
#define SAVEFILE_HEADER 0xDEA1
// first save slot is always reserved for auto save
#define MAX_SAVE_SLOTS ((int)(SRAM_SIZE / SAVE_SLOT_SIZE) - 1)
@ -34,7 +34,7 @@ struct SaveHeader {
};
enum ControlSaveFlags {
ControlSaveFlagsInvert,
ControlSaveFlagsInvert = (1 << 0),
};
struct ControlSaveState {

View file

@ -85,6 +85,11 @@ void sceneInit(struct Scene* scene) {
checkpointLoadLast(scene);
}
if (gCurrentLevelIndex > gSaveData.header.chapterProgress) {
gSaveData.header.chapterProgress = gCurrentLevelIndex;
savefileSave();
}
gGameMenu.state = GameMenuStateResumeGame;
}
@ -477,8 +482,10 @@ void sceneUpdate(struct Scene* scene) {
if (gGameMenu.state != GameMenuStateResumeGame) {
gameMenuUpdate(&gGameMenu);
if (controllerActionGet(ControllerActionPause)) {
if (controllerActionGet(ControllerActionPause) ||
(gGameMenu.state == GameMenuStateLanding && controllerGetButtonDown(0, B_BUTTON))) {
gGameMenu.state = GameMenuStateResumeGame;
savefileSave();
}
if (gGameMenu.state == GameMenuStateResumeGame) {