From 474d8f9d7650d222c156290fb25388237dc588ae Mon Sep 17 00:00:00 2001 From: James Lambert Date: Wed, 22 Jun 2022 16:56:38 -0600 Subject: [PATCH] Work on elevator cutscene logic --- README.md | 3 +++ src/levels/cutscene_runner.c | 14 +++++++++++ src/levels/level_definition.h | 18 ++++++++++++++ src/physics/rigid_body.c | 46 ++++++++++++++++++++--------------- src/physics/rigid_body.h | 1 + src/scene/elevator.h | 2 ++ 6 files changed, 64 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index b0beb2a..ddec84e 100644 --- a/README.md +++ b/README.md @@ -86,6 +86,9 @@ Where `/home/james/Blender/blender-2.93.1-linux-x64` is the folder where Blender - [ ] Implement "Elevator" - Mesh collider type + - implement teleportation logic +- [ ] Implement level transitions + - Implement loading levels from the cartridge - [x] Implement "Emancipation grid" - [ ] Change the way player standing logic works - [ ] Cube dispenser diff --git a/src/levels/cutscene_runner.c b/src/levels/cutscene_runner.c index 195aed8..b64e2b4 100644 --- a/src/levels/cutscene_runner.c +++ b/src/levels/cutscene_runner.c @@ -35,6 +35,18 @@ void cutsceneRunnerStartStep(struct CutsceneRunner* runner) { case CutsceneStepTypeSetSignal: signalsSetDefault(step->setSignal.signalIndex, step->setSignal.signalValue); break; + case CutsceneOpenElevator: + gScene.elevators[step->openElevator.elevatorIndex].flags = (gScene.elevators[step->openElevator.elevatorIndex].flags & ~ElevatorFlagsIsLocked) | ElevatorFlagsReleasePlayer; + break; + case CutsceneTeleportPlayer: + { + rigidBodyTeleport( + &gScene.player.body, + &gCurrentLevel->locations[step->teleportPlayer.fromLocation].transform, + &gCurrentLevel->locations[step->teleportPlayer.toLocation].transform, + gCurrentLevel->locations[step->teleportPlayer.toLocation].roomIndex + ); + } default: } } @@ -47,6 +59,8 @@ int cutsceneRunnerUpdateCurrentStep(struct CutsceneRunner* runner) { case CutsceneStepTypeDelay: runner->state.delay -= FIXED_DELTA_TIME; return runner->state.delay <= 0.0f; + case CutsceneWaitForElevator: + return (gScene.elevators[step->waitForElevator.elevatorIndex].flags & ElevatorFlagsContainsPlayer) != 0; default: return 1; } diff --git a/src/levels/level_definition.h b/src/levels/level_definition.h index 4b51327..cf83806 100644 --- a/src/levels/level_definition.h +++ b/src/levels/level_definition.h @@ -29,6 +29,10 @@ enum CutsceneStepType { CutsceneStepTypeDelay, CutsceneStepTypeOpenPortal, CutsceneStepTypeSetSignal, + CutsceneWaitForElevator, + CutsceneOpenElevator, + CutsceneTeleportPlayer, + CutsceneLoadLevel, }; struct CutsceneStep { @@ -49,6 +53,20 @@ struct CutsceneStep { u16 signalIndex; u16 signalValue; } setSignal; + struct { + u16 elevatorIndex; + } waitForElevator; + struct { + u16 elevatorIndex; + } openElevator; + struct { + u16 fromLocation; + u16 toLocation; + } teleportPlayer; + struct { + u16 fromLocation; + u16 levelIndex; + } loadLevel; int noop; }; }; diff --git a/src/physics/rigid_body.c b/src/physics/rigid_body.c index bc999fa..189dd1b 100644 --- a/src/physics/rigid_body.c +++ b/src/physics/rigid_body.c @@ -137,28 +137,9 @@ int rigidBodyCheckPortals(struct RigidBody* rigidBody) { } struct Transform* otherPortal = gCollisionScene.portalTransforms[1 - i]; - - transformPoint(otherPortal, &localPoint, &rigidBody->transform.position); - - struct Quaternion inverseARotation; - quatConjugate(&gCollisionScene.portalTransforms[i]->rotation, &inverseARotation); - - struct Quaternion rotationTransfer; - quatMultiply(&otherPortal->rotation, &inverseARotation, &rotationTransfer); - - quatMultVector(&rotationTransfer, &rigidBody->velocity, &rigidBody->velocity); - quatMultVector(&rotationTransfer, &rigidBody->angularVelocity, &rigidBody->angularVelocity); - - struct Quaternion newRotation; - - quatMultiply(&rotationTransfer, &rigidBody->transform.rotation, &newRotation); - - rigidBody->transform.rotation = newRotation; + rigidBodyTeleport(rigidBody, gCollisionScene.portalTransforms[i], otherPortal, gCollisionScene.portalRooms[1 - i]); newFlags |= RigidBodyFlagsCrossedPortal0 << i; - - rigidBody->currentRoom = gCollisionScene.portalRooms[1 - i]; - result = i + 1; } @@ -174,4 +155,29 @@ int rigidBodyCheckPortals(struct RigidBody* rigidBody) { rigidBody->flags |= newFlags; return result; +} + +void rigidBodyTeleport(struct RigidBody* rigidBody, struct Transform* from, struct Transform* to, int toRoom) { + struct Vector3 localPoint; + + transformPointInverseNoScale(from, &rigidBody->transform.position, &localPoint); + + transformPoint(to, &localPoint, &rigidBody->transform.position); + + struct Quaternion inverseARotation; + quatConjugate(&from->rotation, &inverseARotation); + + struct Quaternion rotationTransfer; + quatMultiply(&to->rotation, &inverseARotation, &rotationTransfer); + + quatMultVector(&rotationTransfer, &rigidBody->velocity, &rigidBody->velocity); + quatMultVector(&rotationTransfer, &rigidBody->angularVelocity, &rigidBody->angularVelocity); + + struct Quaternion newRotation; + + quatMultiply(&rotationTransfer, &rigidBody->transform.rotation, &newRotation); + + rigidBody->transform.rotation = newRotation; + + rigidBody->currentRoom = toRoom; } \ No newline at end of file diff --git a/src/physics/rigid_body.h b/src/physics/rigid_body.h index 008a498..d1dd1d5 100644 --- a/src/physics/rigid_body.h +++ b/src/physics/rigid_body.h @@ -54,6 +54,7 @@ void rigidBodyAppyImpulse(struct RigidBody* rigidBody, struct Vector3* worldPoin void rigidBodyUpdate(struct RigidBody* rigidBody); void rigidBodyVelocityAtLocalPoint(struct RigidBody* rigidBody, struct Vector3* localPoint, struct Vector3* worldVelocity); void rigidBodyVelocityAtWorldPoint(struct RigidBody* rigidBody, struct Vector3* worldPoint, struct Vector3* worldVelocity); +void rigidBodyTeleport(struct RigidBody* rigidBody, struct Transform* from, struct Transform* to, int toRoom); int rigidBodyCheckPortals(struct RigidBody* rigidBody); diff --git a/src/scene/elevator.h b/src/scene/elevator.h index ad17654..e39146e 100644 --- a/src/scene/elevator.h +++ b/src/scene/elevator.h @@ -8,6 +8,8 @@ enum ElevatorFlags { ElevatorFlagsIsOpen = (1 << 0), ElevatorFlagsContainsPlayer = (1 << 1), + ElevatorFlagsReleasePlayer = (1 << 2), + ElevatorFlagsIsLocked = (1 << 3), }; struct Elevator {