Work on elevator cutscene logic

This commit is contained in:
James Lambert 2022-06-22 16:56:38 -06:00
parent 916d9828fd
commit 474d8f9d76
6 changed files with 64 additions and 20 deletions

View file

@ -86,6 +86,9 @@ Where `/home/james/Blender/blender-2.93.1-linux-x64` is the folder where Blender
- [ ] Implement "Elevator" - [ ] Implement "Elevator"
- Mesh collider type - Mesh collider type
- implement teleportation logic
- [ ] Implement level transitions
- Implement loading levels from the cartridge
- [x] Implement "Emancipation grid" - [x] Implement "Emancipation grid"
- [ ] Change the way player standing logic works - [ ] Change the way player standing logic works
- [ ] Cube dispenser - [ ] Cube dispenser

View file

@ -35,6 +35,18 @@ void cutsceneRunnerStartStep(struct CutsceneRunner* runner) {
case CutsceneStepTypeSetSignal: case CutsceneStepTypeSetSignal:
signalsSetDefault(step->setSignal.signalIndex, step->setSignal.signalValue); signalsSetDefault(step->setSignal.signalIndex, step->setSignal.signalValue);
break; 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: default:
} }
} }
@ -47,6 +59,8 @@ int cutsceneRunnerUpdateCurrentStep(struct CutsceneRunner* runner) {
case CutsceneStepTypeDelay: case CutsceneStepTypeDelay:
runner->state.delay -= FIXED_DELTA_TIME; runner->state.delay -= FIXED_DELTA_TIME;
return runner->state.delay <= 0.0f; return runner->state.delay <= 0.0f;
case CutsceneWaitForElevator:
return (gScene.elevators[step->waitForElevator.elevatorIndex].flags & ElevatorFlagsContainsPlayer) != 0;
default: default:
return 1; return 1;
} }

View file

@ -29,6 +29,10 @@ enum CutsceneStepType {
CutsceneStepTypeDelay, CutsceneStepTypeDelay,
CutsceneStepTypeOpenPortal, CutsceneStepTypeOpenPortal,
CutsceneStepTypeSetSignal, CutsceneStepTypeSetSignal,
CutsceneWaitForElevator,
CutsceneOpenElevator,
CutsceneTeleportPlayer,
CutsceneLoadLevel,
}; };
struct CutsceneStep { struct CutsceneStep {
@ -49,6 +53,20 @@ struct CutsceneStep {
u16 signalIndex; u16 signalIndex;
u16 signalValue; u16 signalValue;
} setSignal; } setSignal;
struct {
u16 elevatorIndex;
} waitForElevator;
struct {
u16 elevatorIndex;
} openElevator;
struct {
u16 fromLocation;
u16 toLocation;
} teleportPlayer;
struct {
u16 fromLocation;
u16 levelIndex;
} loadLevel;
int noop; int noop;
}; };
}; };

View file

@ -137,28 +137,9 @@ int rigidBodyCheckPortals(struct RigidBody* rigidBody) {
} }
struct Transform* otherPortal = gCollisionScene.portalTransforms[1 - i]; struct Transform* otherPortal = gCollisionScene.portalTransforms[1 - i];
rigidBodyTeleport(rigidBody, gCollisionScene.portalTransforms[i], otherPortal, gCollisionScene.portalRooms[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;
newFlags |= RigidBodyFlagsCrossedPortal0 << i; newFlags |= RigidBodyFlagsCrossedPortal0 << i;
rigidBody->currentRoom = gCollisionScene.portalRooms[1 - i];
result = i + 1; result = i + 1;
} }
@ -174,4 +155,29 @@ int rigidBodyCheckPortals(struct RigidBody* rigidBody) {
rigidBody->flags |= newFlags; rigidBody->flags |= newFlags;
return result; 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;
} }

View file

@ -54,6 +54,7 @@ void rigidBodyAppyImpulse(struct RigidBody* rigidBody, struct Vector3* worldPoin
void rigidBodyUpdate(struct RigidBody* rigidBody); void rigidBodyUpdate(struct RigidBody* rigidBody);
void rigidBodyVelocityAtLocalPoint(struct RigidBody* rigidBody, struct Vector3* localPoint, struct Vector3* worldVelocity); void rigidBodyVelocityAtLocalPoint(struct RigidBody* rigidBody, struct Vector3* localPoint, struct Vector3* worldVelocity);
void rigidBodyVelocityAtWorldPoint(struct RigidBody* rigidBody, struct Vector3* worldPoint, 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); int rigidBodyCheckPortals(struct RigidBody* rigidBody);

View file

@ -8,6 +8,8 @@
enum ElevatorFlags { enum ElevatorFlags {
ElevatorFlagsIsOpen = (1 << 0), ElevatorFlagsIsOpen = (1 << 0),
ElevatorFlagsContainsPlayer = (1 << 1), ElevatorFlagsContainsPlayer = (1 << 1),
ElevatorFlagsReleasePlayer = (1 << 2),
ElevatorFlagsIsLocked = (1 << 3),
}; };
struct Elevator { struct Elevator {