Work on game savefile
This commit is contained in:
parent
0602f6c30e
commit
8082d2e563
|
@ -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
|
||||
|
|
|
@ -41,6 +41,7 @@ void gameMenuUpdate(struct GameMenu* gameMenu) {
|
|||
if (option) {
|
||||
gameMenu->state = option->id;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case GameMenuStateNewGame:
|
||||
|
|
|
@ -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) {
|
||||
|
@ -118,7 +118,15 @@ void newGameInit(struct NewGameMenu* newGameMenu) {
|
|||
chapterMenuSetChapter(&newGameMenu->chapter1, &gChapters[1]);
|
||||
|
||||
newGameMenu->chapterOffset = 0;
|
||||
newGameMenu->selectedChapter = 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,
|
||||
|
|
|
@ -40,6 +40,7 @@ struct NewGameMenu {
|
|||
|
||||
short selectedChapter;
|
||||
short chapterOffset;
|
||||
short chapterCount;
|
||||
};
|
||||
|
||||
void newGameInit(struct NewGameMenu* newGameMenu);
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in a new issue