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"
|
- [ ] 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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Reference in a new issue