mirror of
https://github.com/mwpenny/portal64-still-alive.git
synced 2024-10-20 10:37:37 -04:00
Work on elevator transition
This commit is contained in:
parent
b59695f2a4
commit
5a3d5d86b2
|
@ -632,7 +632,9 @@ void generateElevatorDefinitions(
|
|||
|
||||
aiMatrix4x4 baseTransform = settings.CreateCollisionTransform();
|
||||
|
||||
for (auto& nodeInfo : nodeGroups.NodesForType("@elevator")) {
|
||||
auto nodes = nodeGroups.NodesForType("@elevator");
|
||||
|
||||
for (auto& nodeInfo : nodes) {
|
||||
if (nodeInfo.arguments.size() == 0) {
|
||||
continue;
|
||||
}
|
||||
|
@ -645,8 +647,25 @@ void generateElevatorDefinitions(
|
|||
elevatorData->Add(std::unique_ptr<StructureDataChunk>(new StructureDataChunk(pos)));
|
||||
elevatorData->Add(std::unique_ptr<StructureDataChunk>(new StructureDataChunk(rot)));
|
||||
elevatorData->AddPrimitive(roomOutput.RoomForNode(nodeInfo.node));
|
||||
elevatorData->AddPrimitive(signals.SignalIndexForName(nodeInfo.arguments[0]));
|
||||
elevatorData->AddPrimitive(nodeInfo.arguments.size() >= 2 && nodeInfo.arguments[1] == "isExit" ? 1 : 0);
|
||||
|
||||
if (nodeInfo.arguments.size() > 1) {
|
||||
std::string targetElevator = nodeInfo.arguments[1];
|
||||
|
||||
if (targetElevator == "next_level") {
|
||||
elevatorData->AddPrimitive(nodes.size());
|
||||
} else {
|
||||
unsigned targetIndex = 0;
|
||||
for (targetIndex = 0; targetIndex < nodes.size(); ++targetIndex) {
|
||||
if (nodes[targetIndex].arguments.size() && nodes[targetIndex].arguments[0] == targetElevator) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
elevatorData->AddPrimitive(targetIndex);
|
||||
}
|
||||
} else {
|
||||
elevatorData->AddPrimitive(-1);
|
||||
}
|
||||
|
||||
elevators->Add(std::move(elevatorData));
|
||||
++elevatorCount;
|
||||
|
|
|
@ -146,8 +146,7 @@ struct ElevatorDefinition {
|
|||
struct Vector3 position;
|
||||
struct Quaternion rotation;
|
||||
short roomIndex;
|
||||
short signalIndex;
|
||||
short isExit;
|
||||
short targetElevator;
|
||||
};
|
||||
|
||||
struct PedestalDefinition {
|
||||
|
|
|
@ -15,9 +15,12 @@
|
|||
#include "../../build/assets/materials/static.h"
|
||||
|
||||
#define AUTO_OPEN_DISTANCE 4.0f
|
||||
#define INSIDE_DISTANCE 1.0f
|
||||
#define SAME_LEVEL_HEIGHT 3.0f
|
||||
#define OPEN_SPEED 2.0f
|
||||
#define INSIDE_DISTANCE 1.0f
|
||||
#define SAME_LEVEL_HEIGHT 3.0f
|
||||
#define OPEN_SPEED 2.0f
|
||||
|
||||
#define OPEN_DELAY 1.0f
|
||||
#define CLOSE_DELAY 1.0f
|
||||
|
||||
struct ColliderTypeData gElevatorColliderType = {
|
||||
CollisionShapeTypeMesh,
|
||||
|
@ -88,13 +91,15 @@ void elevatorInit(struct Elevator* elevator, struct ElevatorDefinition* elevator
|
|||
collisionObjectUpdateBB(&elevator->collisionObject);
|
||||
|
||||
elevator->dynamicId = dynamicSceneAdd(elevator, elevatorRender, &elevator->rigidBody.transform, 3.9f);
|
||||
elevator->flags = elevatorDefinition->isExit ? ElevatorFlagsIsExit : 0;
|
||||
elevator->flags = elevatorDefinition->targetElevator == -1 ? ElevatorFlagsIsExit : 0;
|
||||
elevator->openAmount = 0.0f;
|
||||
elevator->roomIndex = elevatorDefinition->roomIndex;
|
||||
elevator->signalIndex = elevatorDefinition->signalIndex;
|
||||
elevator->targetElevator = elevatorDefinition->targetElevator;
|
||||
|
||||
elevator->timer = elevatorDefinition->targetElevator == -1 ? OPEN_DELAY : CLOSE_DELAY;
|
||||
}
|
||||
|
||||
void elevatorUpdate(struct Elevator* elevator, struct Player* player) {
|
||||
int elevatorUpdate(struct Elevator* elevator, struct Player* player) {
|
||||
struct Vector3 offset;
|
||||
vector3Sub(&elevator->rigidBody.transform.position, &player->lookTransform.position, &offset);
|
||||
|
||||
|
@ -109,15 +114,27 @@ void elevatorUpdate(struct Elevator* elevator, struct Player* player) {
|
|||
int shouldBeOpen;
|
||||
int shouldLock;
|
||||
|
||||
short result = -1;
|
||||
|
||||
if (elevator->flags & ElevatorFlagsIsExit) {
|
||||
shouldBeOpen = signalsRead(elevator->signalIndex);
|
||||
if (inside) {
|
||||
elevator->timer -= FIXED_DELTA_TIME;
|
||||
}
|
||||
|
||||
shouldBeOpen = elevator->timer < 0.0f;
|
||||
shouldLock = !inRange && (elevator->flags & ElevatorFlagsHasHadPlayer) != 0;
|
||||
} else {
|
||||
shouldBeOpen = inRange && !inside;
|
||||
shouldLock = inside;
|
||||
|
||||
if (inside || (elevator->flags & ElevatorFlagsIsLocked) != 0) {
|
||||
signalsSend(elevator->signalIndex);
|
||||
elevator->timer -= FIXED_DELTA_TIME;
|
||||
|
||||
if (elevator->timer < 0.0f) {
|
||||
elevator->flags &= ~ElevatorFlagsIsLocked;
|
||||
shouldLock = 0;
|
||||
result = elevator->targetElevator;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -149,4 +166,6 @@ void elevatorUpdate(struct Elevator* elevator, struct Player* player) {
|
|||
}
|
||||
|
||||
elevator->openAmount = mathfMoveTowards(elevator->openAmount, shouldBeOpen ? 1.0f : 0.0f, OPEN_SPEED * FIXED_DELTA_TIME);
|
||||
|
||||
return result;
|
||||
}
|
|
@ -17,13 +17,14 @@ struct Elevator {
|
|||
struct RigidBody rigidBody;
|
||||
short dynamicId;
|
||||
short flags;
|
||||
short signalIndex;
|
||||
short targetElevator;
|
||||
short roomIndex;
|
||||
float openAmount;
|
||||
float timer;
|
||||
};
|
||||
|
||||
void elevatorInit(struct Elevator* elevator, struct ElevatorDefinition* elevatorDefinition);
|
||||
|
||||
void elevatorUpdate(struct Elevator* elevator, struct Player* player);
|
||||
int elevatorUpdate(struct Elevator* elevator, struct Player* player);
|
||||
|
||||
#endif
|
|
@ -311,7 +311,29 @@ void sceneUpdate(struct Scene* scene) {
|
|||
}
|
||||
|
||||
for (int i = 0; i < scene->elevatorCount; ++i) {
|
||||
elevatorUpdate(&scene->elevators[i], &scene->player);
|
||||
int teleportTo = elevatorUpdate(&scene->elevators[i], &scene->player);
|
||||
|
||||
if (teleportTo != -1) {
|
||||
if (teleportTo >= scene->elevatorCount) {
|
||||
struct Transform exitInverse;
|
||||
transformInvert(&scene->elevators[i].rigidBody.transform, &exitInverse);
|
||||
struct Transform relativeExit;
|
||||
struct Vector3 relativeVelocity;
|
||||
|
||||
transformConcat(&exitInverse, &scene->player.lookTransform, &relativeExit);
|
||||
quatMultVector(&exitInverse.rotation, &scene->player.body.velocity, &relativeVelocity);
|
||||
levelQueueLoad(NEXT_LEVEL, &relativeExit, &relativeVelocity);
|
||||
} else {
|
||||
rigidBodyTeleport(
|
||||
&scene->player.body,
|
||||
&scene->elevators[i].rigidBody.transform,
|
||||
&scene->elevators[teleportTo].rigidBody.transform,
|
||||
scene->elevators[teleportTo].roomIndex
|
||||
);
|
||||
|
||||
scene->elevators[teleportTo].flags |= ElevatorFlagsHasHadPlayer;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < scene->pedestalCount; ++i) {
|
||||
|
|
Loading…
Reference in a new issue