mirror of
https://github.com/mwpenny/portal64-still-alive.git
synced 2024-10-19 22:27:36 -04:00
Work on elevator cutscene logic
This commit is contained in:
parent
916d9828fd
commit
474d8f9d76
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -8,6 +8,8 @@
|
|||
enum ElevatorFlags {
|
||||
ElevatorFlagsIsOpen = (1 << 0),
|
||||
ElevatorFlagsContainsPlayer = (1 << 1),
|
||||
ElevatorFlagsReleasePlayer = (1 << 2),
|
||||
ElevatorFlagsIsLocked = (1 << 3),
|
||||
};
|
||||
|
||||
struct Elevator {
|
||||
|
|
Loading…
Reference in a new issue