diff --git a/assets/test_chambers/test_chamber_02/test_chamber_02.blend b/assets/test_chambers/test_chamber_02/test_chamber_02.blend index 1443de6..d538273 100644 Binary files a/assets/test_chambers/test_chamber_02/test_chamber_02.blend and b/assets/test_chambers/test_chamber_02/test_chamber_02.blend differ diff --git a/src/savefile/scene_serialize.c b/src/savefile/scene_serialize.c index 4e0c3a9..1dec421 100644 --- a/src/savefile/scene_serialize.c +++ b/src/savefile/scene_serialize.c @@ -213,11 +213,69 @@ void decorDeserialize(struct Serializer* serializer, struct Scene* scene) { scene->decorCount = countAsShort; } +void boxDropperSerialize(struct Serializer* serializer, SerializeAction action, struct Scene* scene) { + short heldCube = -1; + for (int i = 0; i < scene->boxDropperCount; ++i) { + if (&scene->boxDroppers[i].activeCube.collisionObject == scene->player.grabConstraint.object) { + heldCube = i; + break; + } + } + + action(serializer, &heldCube, sizeof(short)); + + for (int i = 0; i < scene->boxDropperCount; ++i) { + struct BoxDropper* dropper = &scene->boxDroppers[i]; + action(serializer, &dropper->flags, sizeof(short)); + + if (!(dropper->flags & BoxDropperFlagsCubeIsActive)) { + continue; + } + + action(serializer, &dropper->activeCube.rigidBody.transform, sizeof(struct PartialTransform)); + action(serializer, &dropper->activeCube.rigidBody.currentRoom, sizeof(short)); + action(serializer, &dropper->activeCube.rigidBody.velocity, sizeof(struct Vector3)); + action(serializer, &dropper->activeCube.rigidBody.angularVelocity, sizeof(struct Vector3)); + action(serializer, &dropper->activeCube.rigidBody.flags, sizeof(enum RigidBodyFlags)); + } +} + +void boxDropperDeserialize(struct Serializer* serializer, struct Scene* scene) { + short heldCube; + serializeRead(serializer, &heldCube, sizeof(short)); + + for (int i = 0; i < scene->boxDropperCount; ++i) { + struct BoxDropper* dropper = &scene->boxDroppers[i]; + serializeRead(serializer, &dropper->flags, sizeof(short)); + + if (!(dropper->flags & BoxDropperFlagsCubeIsActive)) { + continue; + } + + struct Transform cubePosition; + short cubeRoom; + serializeRead(serializer, &cubePosition, sizeof(struct PartialTransform)); + cubePosition.scale = gOneVec; + serializeRead(serializer, &cubeRoom, sizeof(short)); + + decorObjectInit(&dropper->activeCube, decorObjectDefinitionForId(DECOR_TYPE_CUBE_UNIMPORTANT), &cubePosition, cubeRoom); + + serializeRead(serializer, &dropper->activeCube.rigidBody.velocity, sizeof(struct Vector3)); + serializeRead(serializer, &dropper->activeCube.rigidBody.angularVelocity, sizeof(struct Vector3)); + serializeRead(serializer, &dropper->activeCube.rigidBody.flags, sizeof(enum RigidBodyFlags)); + + if (heldCube == i) { + playerSetGrabbing(&scene->player, &dropper->activeCube.collisionObject); + } + } +} + void sceneSerialize(struct Serializer* serializer, SerializeAction action, struct Scene* scene) { playerSerialize(serializer, action, &scene->player); sceneSerializePortals(serializer, action, scene); buttonsSerializeRW(serializer, action, scene->buttons, scene->buttonCount); decorSerialize(serializer, action, scene); + boxDropperSerialize(serializer, action, scene); } void sceneDeserialize(struct Serializer* serializer, struct Scene* scene) { @@ -225,4 +283,5 @@ void sceneDeserialize(struct Serializer* serializer, struct Scene* scene) { sceneDeserializePortals(serializer, scene); buttonsSerializeRW(serializer, serializeRead, scene->buttons, scene->buttonCount); decorDeserialize(serializer, scene); + boxDropperDeserialize(serializer, scene); } \ No newline at end of file diff --git a/src/scene/scene.c b/src/scene/scene.c index 80bc58f..a270477 100644 --- a/src/scene/scene.c +++ b/src/scene/scene.c @@ -105,6 +105,9 @@ void sceneInitNoPauseMenu(struct Scene* scene) { playerInit(&scene->player, &combinedLocation, &startVelocity, &scene->portalGun.collisionObject); sceneUpdateListeners(scene); + scene->camera.transform.rotation = scene->player.lookTransform.rotation; + scene->camera.transform.position = scene->player.lookTransform.position; + if (gCurrentLevelIndex >= LEVEL_INDEX_WITH_GUN_0) { playerGivePortalGun(&scene->player, PlayerHasFirstPortalGun); } diff --git a/src/scene/scene.h b/src/scene/scene.h index d4b9f0d..725c553 100644 --- a/src/scene/scene.h +++ b/src/scene/scene.h @@ -22,7 +22,7 @@ #include "ball_catcher.h" #include "portal_gun.h" -struct SavedPortal{ +struct SavedPortal { struct Ray ray; struct Vector3 transformUp; int portalIndex;