Make checkpoint save time more consisitent

This commit is contained in:
James Lambert 2023-05-18 06:57:13 -06:00
parent bc4330f347
commit ef4610c308
5 changed files with 19 additions and 8 deletions

View file

@ -191,7 +191,7 @@ void cutsceneRunnerStartStep(struct CutsceneRunner* runner) {
&gZeroVec,
gCurrentLevel->locations[step->teleportPlayer.toLocation].roomIndex
);
checkpointSave(&gScene);
sceneQueueCheckpoint(&gScene);
break;
case CutsceneStepTypeLoadLevel:
{
@ -249,7 +249,7 @@ void cutsceneRunnerStartStep(struct CutsceneRunner* runner) {
);
break;
case CutsceneStepSaveCheckpoint:
checkpointSave(&gScene);
sceneQueueCheckpoint(&gScene);
break;
case CutsceneStepKillPlayer:
playerKill(&gScene.player, step->killPlayer.isWater);

View file

@ -424,16 +424,20 @@ void sceneAnimatorDeserialize(struct Serializer* serializer, struct Scene* scene
}
}
#define WRITE_ALIGN_CHECK {action(serializer, &currentAlign, 1); ++currentAlign;}
#define INCLUDE_SAVEFILE_ALIGH_CHECKS 0
#ifdef PORTAL64_WITH_DEBUGGER
#define READ_ALIGN_CHECK {serializeRead(serializer, &currentAlign, 1); if (currentAlign != expectedAlign) return; ++expectedAlign;}
#else
#if INCLUDE_SAVEFILE_ALIGH_CHECKS
#define WRITE_ALIGN_CHECK {action(serializer, &currentAlign, 1); ++currentAlign;}
#define READ_ALIGN_CHECK {serializeRead(serializer, &currentAlign, 1); if (currentAlign != expectedAlign) gdbBreak(); ++expectedAlign;}
#else
#define WRITE_ALIGN_CHECK
#define READ_ALIGN_CHECK
#endif
void sceneSerialize(struct Serializer* serializer, SerializeAction action, struct Scene* scene) {
#if INCLUDE_SAVEFILE_ALIGH_CHECKS
char currentAlign = 0;
#endif
playerSerialize(serializer, action, &scene->player);
WRITE_ALIGN_CHECK;
sceneSerializePortals(serializer, action, scene);
@ -459,8 +463,10 @@ void sceneSerialize(struct Serializer* serializer, SerializeAction action, struc
}
void sceneDeserialize(struct Serializer* serializer, struct Scene* scene) {
#if INCLUDE_SAVEFILE_ALIGH_CHECKS
char currentAlign = 0;
char expectedAlign = 0;
#endif
playerDeserialize(serializer, &scene->player);
READ_ALIGN_CHECK;
sceneDeserializePortals(serializer, scene);

View file

@ -163,7 +163,7 @@ int elevatorUpdate(struct Elevator* elevator, struct Player* player) {
// save the checkpoint after flag ElevatorFlagsIsLocked is set
// so loading this checkpoint doesn't immediately create another
// save checkpoint
checkpointSave(&gScene);
sceneQueueCheckpoint(&gScene);
}
}

View file

@ -600,7 +600,7 @@ void sceneUpdate(struct Scene* scene) {
&gZeroVec,
scene->elevators[teleportTo].roomIndex
);
checkpointSave(&gScene);
sceneQueueCheckpoint(&gScene);
sceneClosePortal(&gScene, 0);
sceneClosePortal(&gScene, 1);
}
@ -671,6 +671,10 @@ void sceneUpdate(struct Scene* scene) {
}
}
void sceneQueueCheckpoint(struct Scene* scene) {
scene->checkpointState = SceneCheckpointStateReady;
}
int sceneOpenPortal(struct Scene* scene, struct Transform* at, int transformIndex, int portalIndex, struct PortalSurfaceMappingRange surfaceMapping, struct CollisionObject* collisionObject, int roomIndex, int fromPlayer, int just_checking) {
struct Transform finalAt;

View file

@ -85,6 +85,7 @@ void sceneInit(struct Scene* scene);
void sceneInitNoPauseMenu(struct Scene* scene);
void sceneRender(struct Scene* scene, struct RenderState* renderState, struct GraphicsTask* task);
void sceneUpdate(struct Scene* scene);
void sceneQueueCheckpoint(struct Scene* scene);
int sceneFirePortal(struct Scene* scene, struct Ray* ray, struct Vector3* playerUp, int portalIndex, int roomIndex, int fromPlayer, int just_checking);
void sceneClosePortal(struct Scene* scene, int portalIndex);