Implement box dropper serialization

This commit is contained in:
James Lambert 2023-05-07 19:27:08 -06:00
parent 5a4d3ad6f5
commit e1014a3924
4 changed files with 63 additions and 1 deletions

View file

@ -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);
}

View file

@ -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);
}

View file

@ -22,7 +22,7 @@
#include "ball_catcher.h"
#include "portal_gun.h"
struct SavedPortal{
struct SavedPortal {
struct Ray ray;
struct Vector3 transformUp;
int portalIndex;