Implement test chamber 05 failsafe

This commit is contained in:
James Lambert 2023-09-03 15:13:40 -06:00
parent f0be2b4048
commit 298dab67f6
9 changed files with 50 additions and 11 deletions

View file

@ -290,7 +290,7 @@ TEST_CHAMBER_OBJECTS = $(TEST_CHAMBERS:%.blend=build/%_geo.o)
LUA_FILES = $(shell find tools/ -type f -name '*.lua') LUA_FILES = $(shell find tools/ -type f -name '*.lua')
build/%.fbx: %.blend build/%.fbx: %.blend %.yaml
@mkdir -p $(@D) @mkdir -p $(@D)
$(BLENDER_3_0) $< --background --python tools/export_fbx.py -- $@ $(BLENDER_3_0) $< --background --python tools/export_fbx.py -- $@

View file

@ -0,0 +1 @@
-c 1 -r 22050

View file

@ -12,6 +12,8 @@ cutscenes:
ENTER_BUTTON_ROOM: ENTER_BUTTON_ROOM:
- open_portal portal_1 - open_portal portal_1
BAD_PERSON: BAD_PERSON:
- q_sound SOUNDS_ESCAPE_01_PART1_NAG01_1 CH_GLADOS
- wait_for_channel CH_GLADOS
- set_signal bad_person - set_signal bad_person
ENTER_SMALL_ROOM: ENTER_SMALL_ROOM:
- set_signal in_room - set_signal in_room

View file

@ -8,6 +8,8 @@
#include "../scene/portal.h" #include "../scene/portal.h"
#include "../levels/levels.h" #include "../levels/levels.h"
#include "../debugger/debugger.h"
struct CollisionScene gCollisionScene; struct CollisionScene gCollisionScene;
void collisionSceneInit(struct CollisionScene* scene, struct CollisionObject* quads, int quadCount, struct World* world) { void collisionSceneInit(struct CollisionScene* scene, struct CollisionObject* quads, int quadCount, struct World* world) {
@ -718,6 +720,10 @@ void collisionSceneUpdateDynamics() {
prevPosList[i] = object->body->transform.position; prevPosList[i] = object->body->transform.position;
sweptBB[i] = object->boundingBox; sweptBB[i] = object->boundingBox;
if (i == 25) {
gdbSetWatchPoint(&prevPosList[i], 0, 1);
}
if (!collisionObjectShouldGenerateConctacts(object)) { if (!collisionObjectShouldGenerateConctacts(object)) {
continue; continue;
} }
@ -747,6 +753,8 @@ void collisionSceneUpdateDynamics() {
collisionSceneCollideDynamicPairs(&gCollisionScene, prevPosList, sweptBB); collisionSceneCollideDynamicPairs(&gCollisionScene, prevPosList, sweptBB);
gdbClearWatchPoint();
stackMallocFree(sweptBB); stackMallocFree(sweptBB);
stackMallocFree(prevPosList); stackMallocFree(prevPosList);

View file

@ -107,7 +107,7 @@ void buttonUpdate(struct Button* button) {
shouldPress = 1; shouldPress = 1;
if ((other->body->flags & (RigidBodyFlagsGrabbable | RigidBodyIsSleeping)) == (RigidBodyFlagsGrabbable | RigidBodyIsSleeping)) { if ((other->body->flags & RigidBodyFlagsGrabbable) == RigidBodyFlagsGrabbable && (other->body->sleepFrames <= IDLE_SLEEP_FRAMES - 2)) {
shouldPress = PRESSED_WITH_CUBE; shouldPress = PRESSED_WITH_CUBE;
} }

View file

@ -160,8 +160,11 @@ void sceneInitNoPauseMenu(struct Scene* scene, int mainMenuMode) {
scene->triggerListenerCount = gCurrentLevel->triggerCount; scene->triggerListenerCount = gCurrentLevel->triggerCount;
scene->triggerListeners = malloc(sizeof(struct TriggerListener) * scene->triggerListenerCount); scene->triggerListeners = malloc(sizeof(struct TriggerListener) * scene->triggerListenerCount);
int triggerOffset = 0;
for (int i = 0; i < scene->triggerListenerCount; ++i) { for (int i = 0; i < scene->triggerListenerCount; ++i) {
triggerInit(&scene->triggerListeners[i], &gCurrentLevel->triggers[i], i); triggerInit(&scene->triggerListeners[i], &gCurrentLevel->triggers[i], triggerOffset);
triggerOffset += gCurrentLevel->triggers[i].triggerCount;
} }
scene->doorCount = gCurrentLevel->doorCount; scene->doorCount = gCurrentLevel->doorCount;

View file

@ -4,9 +4,15 @@
#include "../decor/decor_object_list.h" #include "../decor/decor_object_list.h"
#include "../levels/cutscene_runner.h" #include "../levels/cutscene_runner.h"
#include "./scene.h"
extern struct ColliderTypeData gPlayerColliderData; extern struct ColliderTypeData gPlayerColliderData;
enum ObjectTriggerType triggerDetermineType(struct CollisionObject* objectEnteringTrigger) { enum ObjectTriggerType triggerDetermineType(struct CollisionObject* objectEnteringTrigger) {
if (gScene.player.grabConstraint.object == objectEnteringTrigger) {
return ObjectTriggerTypeNone;
}
if (objectEnteringTrigger->collider == &gPlayerColliderData) { if (objectEnteringTrigger->collider == &gPlayerColliderData) {
return ObjectTriggerTypePlayer; return ObjectTriggerTypePlayer;
} }
@ -49,7 +55,7 @@ void triggerTrigger(void* data, struct CollisionObject* objectEnteringTrigger) {
signalsSend(triggerInfo->signalIndex); signalsSend(triggerInfo->signalIndex);
} }
cutsceneTrigger(triggerInfo->cutsceneIndex, listener->triggerIndex); cutsceneTrigger(triggerInfo->cutsceneIndex, listener->triggerIndex + i);
} }
} }
} }

View file

@ -287,20 +287,39 @@ local function generate_cutscenes()
return cutscenes_result, cutscene_data return cutscenes_result, cutscene_data
end end
local function parse_trigger_signal(signal)
if not signal or signal == '-1' then
return -1
end
return signals.signal_index_for_name(signal)
end
local function signal_type_index(index)
if index == 3 then
return sk_definition_writer.raw('ObjectTriggerTypeCube')
end
return sk_definition_writer.raw('ObjectTriggerTypePlayer')
end
local function generate_triggers(cutscenes) local function generate_triggers(cutscenes)
local result = {} local result = {}
for _, trigger in pairs(sk_scene.nodes_for_type('@trigger')) do for _, trigger in pairs(sk_scene.nodes_for_type('@trigger')) do
local first_mesh = trigger.node.meshes[1] local first_mesh = trigger.node.meshes[1]
local cutscene = cutscene_index(cutscenes, trigger.arguments[1])
local triggers = {} local triggers = {}
for i = 1, #trigger.arguments, 2 do
local cutscene = cutscene_index(cutscenes, trigger.arguments[i])
table.insert(triggers, {
signal_type_index(i),
cutscene,
parse_trigger_signal(trigger.arguments[i + 1]),
})
end
table.insert(triggers, {
sk_definition_writer.raw('ObjectTriggerTypePlayer'),
cutscene,
trigger.arguments[2] and signals.signal_index_for_name(trigger.arguments[2]) or -1,
})
if first_mesh then if first_mesh then
local transformed = first_mesh:transform(trigger.node.full_transformation) local transformed = first_mesh:transform(trigger.node.full_transformation)