From 4e06edb345cb4167ed9b4395c2ab3138264a5225 Mon Sep 17 00:00:00 2001 From: James Lambert Date: Mon, 6 Feb 2023 22:08:11 -0700 Subject: [PATCH] Work on checkpoint saving --- src/levels/cutscene_runner.c | 17 ++++++++ src/levels/cutscene_runner.h | 23 +++++++---- src/scene/checkpoint.c | 79 ++++++++++++++++++++++++++++++++++++ src/scene/checkpoint.h | 13 ++++++ src/scene/signals.c | 2 +- src/scene/signals.h | 2 + 6 files changed, 128 insertions(+), 8 deletions(-) create mode 100644 src/scene/checkpoint.c create mode 100644 src/scene/checkpoint.h diff --git a/src/levels/cutscene_runner.c b/src/levels/cutscene_runner.c index badabbd..f1dc3f0 100644 --- a/src/levels/cutscene_runner.c +++ b/src/levels/cutscene_runner.c @@ -361,4 +361,21 @@ void cutscenesUpdate() { gUnusedRunners = toRemove; } } +} + +void cutsceneSerialize(struct CutsceneRunner* runner, struct CutsceneSerialized* result) { + result->cutsceneIndex = runner->currentCutscene - gCurrentLevel->cutscenes; + result->currentStep = runner->currentStep; + + struct CutsceneStep* step = &runner->currentCutscene->steps[runner->currentStep]; + + switch (step->type) { + case CutsceneStepTypePlaySound: + case CutsceneStepTypeStartSound: + result->state.playSound.soundId = SOUND_ID_NONE; + break; + default: + result->state = runner->state; + break; + } } \ No newline at end of file diff --git a/src/levels/cutscene_runner.h b/src/levels/cutscene_runner.h index 531e66f..39fae2f 100644 --- a/src/levels/cutscene_runner.h +++ b/src/levels/cutscene_runner.h @@ -4,16 +4,23 @@ #include #include "level_definition.h" +union CutsceneStepState { + struct { + ALSndId soundId; + } playSound; + float delay; +}; + +struct CutsceneSerialized { + u16 cutsceneIndex; + u16 currentStep; + union CutsceneStepState state; +}; + struct CutsceneRunner { struct Cutscene* currentCutscene; u16 currentStep; - - union { - struct { - ALSndId soundId; - } playSound; - float delay; - } state; + union CutsceneStepState state; struct CutsceneRunner* nextRunner; }; @@ -24,4 +31,6 @@ void cutsceneStop(struct Cutscene* cutscene); int cutsceneIsRunning(struct Cutscene* cutscene); void cutscenesUpdate(); +void cutsceneSerialize(struct CutsceneRunner* runner, struct CutsceneSerialized* result); + #endif \ No newline at end of file diff --git a/src/scene/checkpoint.c b/src/scene/checkpoint.c new file mode 100644 index 0000000..5a111cf --- /dev/null +++ b/src/scene/checkpoint.c @@ -0,0 +1,79 @@ +#include "checkpoint.h" + +#include "../util/memory.h" +#include "../levels/cutscene_runner.h" + +void* checkpointWrite(void* dst, int size, void* src) { + memCopy(dst, src, size); + return (char*)dst + size; +} + +extern unsigned long long* gSignals; +extern unsigned long long* gDefaultSignals; +extern unsigned gSignalCount; + +extern struct CutsceneRunner* gRunningCutscenes; + +extern u64 gTriggeredCutscenes; + +int checkpointCutsceneCount() { + struct CutsceneRunner* curr = gRunningCutscenes; + int result = 0; + + while (curr) { + curr = curr->nextRunner; + ++result; + } + + return result; +} + +int checkpointEstimateSize(struct Scene* scene) { + int result = 0; + + int binCount = SIGNAL_BIN_COUNT(gSignalCount); + result += sizeof(unsigned long long) * binCount * 2; + + result += sizeof(struct CutsceneSerialized) * checkpointCutsceneCount(); + + result += sizeof(gTriggeredCutscenes); + + return result; +} + +Checkpoint checkpointNew(struct Scene* scene) { + int size = checkpointEstimateSize(scene); + + void* result = malloc(size); + + void* curr = result; + + int binCount = SIGNAL_BIN_COUNT(gSignalCount); + curr = checkpointWrite(curr, sizeof(unsigned long long) * binCount, gSignals); + curr = checkpointWrite(curr, sizeof(unsigned long long) * binCount, gDefaultSignals); + + short cutsceneCount = (short)checkpointCutsceneCount(); + curr = checkpointWrite(curr, sizeof(short), &cutsceneCount); + + struct CutsceneRunner* currCutscene = gRunningCutscenes; + + while (currCutscene) { + struct CutsceneSerialized cutscene; + cutsceneSerialize(currCutscene, &cutscene); + curr = checkpointWrite(curr, sizeof(struct CutsceneSerialized), &cutscene); + } + + curr = checkpointWrite(curr, sizeof(struct PartialTransform), &scene->player.body.transform); + + curr = checkpointWrite(curr, sizeof (gTriggeredCutscenes), &gTriggeredCutscenes); + + return result; +} + +void checkpointLoad(struct Scene* scene, Checkpoint checkpoint) { + +} + +void checkpointDelete(Checkpoint checkpoint) { + free(checkpoint); +} \ No newline at end of file diff --git a/src/scene/checkpoint.h b/src/scene/checkpoint.h new file mode 100644 index 0000000..f51ec32 --- /dev/null +++ b/src/scene/checkpoint.h @@ -0,0 +1,13 @@ + +#include "scene.h" + +typedef void* Checkpoint; + +struct PartialTransform { + struct Vector3 position; + struct Quaternion rotation; +}; + +Checkpoint checkpointNew(struct Scene* scene); +void checkpointLoad(struct Scene* scene, Checkpoint checkpoint); +void checkpointDelete(Checkpoint checkpoint); \ No newline at end of file diff --git a/src/scene/signals.c b/src/scene/signals.c index 3bc9e53..4b73258 100644 --- a/src/scene/signals.c +++ b/src/scene/signals.c @@ -14,7 +14,7 @@ void signalsInit(unsigned signalCount) { return; } - int binCount = (signalCount + 63) >> 6; + int binCount = SIGNAL_BIN_COUNT(signalCount); gSignals = malloc(sizeof(unsigned long long) * binCount); gDefaultSignals = malloc(sizeof(unsigned long long) * binCount); gSignalCount = signalCount; diff --git a/src/scene/signals.h b/src/scene/signals.h index f998a5e..6ff2534 100644 --- a/src/scene/signals.h +++ b/src/scene/signals.h @@ -1,6 +1,8 @@ #ifndef __SCENE_SIGNALS_H__ #define __SCENE_SIGNALS_H__ +#define SIGNAL_BIN_COUNT(signalCount) (((signalCount) + 63) >> 6) + enum SignalOperatorType { SignalOperatorTypeAnd, SignalOperatorTypeOr,