mirror of
https://github.com/mwpenny/portal64-still-alive.git
synced 2024-10-20 10:37:37 -04:00
Implement box dropper serialization
This commit is contained in:
parent
5a4d3ad6f5
commit
e1014a3924
Binary file not shown.
|
@ -213,11 +213,69 @@ void decorDeserialize(struct Serializer* serializer, struct Scene* scene) {
|
||||||
scene->decorCount = countAsShort;
|
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) {
|
void sceneSerialize(struct Serializer* serializer, SerializeAction action, struct Scene* scene) {
|
||||||
playerSerialize(serializer, action, &scene->player);
|
playerSerialize(serializer, action, &scene->player);
|
||||||
sceneSerializePortals(serializer, action, scene);
|
sceneSerializePortals(serializer, action, scene);
|
||||||
buttonsSerializeRW(serializer, action, scene->buttons, scene->buttonCount);
|
buttonsSerializeRW(serializer, action, scene->buttons, scene->buttonCount);
|
||||||
decorSerialize(serializer, action, scene);
|
decorSerialize(serializer, action, scene);
|
||||||
|
boxDropperSerialize(serializer, action, scene);
|
||||||
}
|
}
|
||||||
|
|
||||||
void sceneDeserialize(struct Serializer* serializer, struct Scene* scene) {
|
void sceneDeserialize(struct Serializer* serializer, struct Scene* scene) {
|
||||||
|
@ -225,4 +283,5 @@ void sceneDeserialize(struct Serializer* serializer, struct Scene* scene) {
|
||||||
sceneDeserializePortals(serializer, scene);
|
sceneDeserializePortals(serializer, scene);
|
||||||
buttonsSerializeRW(serializer, serializeRead, scene->buttons, scene->buttonCount);
|
buttonsSerializeRW(serializer, serializeRead, scene->buttons, scene->buttonCount);
|
||||||
decorDeserialize(serializer, scene);
|
decorDeserialize(serializer, scene);
|
||||||
|
boxDropperDeserialize(serializer, scene);
|
||||||
}
|
}
|
|
@ -105,6 +105,9 @@ void sceneInitNoPauseMenu(struct Scene* scene) {
|
||||||
playerInit(&scene->player, &combinedLocation, &startVelocity, &scene->portalGun.collisionObject);
|
playerInit(&scene->player, &combinedLocation, &startVelocity, &scene->portalGun.collisionObject);
|
||||||
sceneUpdateListeners(scene);
|
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) {
|
if (gCurrentLevelIndex >= LEVEL_INDEX_WITH_GUN_0) {
|
||||||
playerGivePortalGun(&scene->player, PlayerHasFirstPortalGun);
|
playerGivePortalGun(&scene->player, PlayerHasFirstPortalGun);
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
#include "ball_catcher.h"
|
#include "ball_catcher.h"
|
||||||
#include "portal_gun.h"
|
#include "portal_gun.h"
|
||||||
|
|
||||||
struct SavedPortal{
|
struct SavedPortal {
|
||||||
struct Ray ray;
|
struct Ray ray;
|
||||||
struct Vector3 transformUp;
|
struct Vector3 transformUp;
|
||||||
int portalIndex;
|
int portalIndex;
|
||||||
|
|
Loading…
Reference in a new issue