mirror of
https://github.com/mwpenny/portal64-still-alive.git
synced 2024-10-19 22:27:36 -04:00
Implement test chamber 05 failsafe
This commit is contained in:
parent
f0be2b4048
commit
298dab67f6
2
Makefile
2
Makefile
|
@ -290,7 +290,7 @@ TEST_CHAMBER_OBJECTS = $(TEST_CHAMBERS:%.blend=build/%_geo.o)
|
|||
|
||||
LUA_FILES = $(shell find tools/ -type f -name '*.lua')
|
||||
|
||||
build/%.fbx: %.blend
|
||||
build/%.fbx: %.blend %.yaml
|
||||
@mkdir -p $(@D)
|
||||
$(BLENDER_3_0) $< --background --python tools/export_fbx.py -- $@
|
||||
|
||||
|
|
1
assets/sound/vo/aperture_ai/escape_01_part1_nag01-1.sox
Normal file
1
assets/sound/vo/aperture_ai/escape_01_part1_nag01-1.sox
Normal file
|
@ -0,0 +1 @@
|
|||
-c 1 -r 22050
|
Binary file not shown.
|
@ -12,6 +12,8 @@ cutscenes:
|
|||
ENTER_BUTTON_ROOM:
|
||||
- open_portal portal_1
|
||||
BAD_PERSON:
|
||||
- q_sound SOUNDS_ESCAPE_01_PART1_NAG01_1 CH_GLADOS
|
||||
- wait_for_channel CH_GLADOS
|
||||
- set_signal bad_person
|
||||
ENTER_SMALL_ROOM:
|
||||
- set_signal in_room
|
||||
|
|
|
@ -8,6 +8,8 @@
|
|||
#include "../scene/portal.h"
|
||||
#include "../levels/levels.h"
|
||||
|
||||
#include "../debugger/debugger.h"
|
||||
|
||||
struct CollisionScene gCollisionScene;
|
||||
|
||||
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;
|
||||
sweptBB[i] = object->boundingBox;
|
||||
|
||||
if (i == 25) {
|
||||
gdbSetWatchPoint(&prevPosList[i], 0, 1);
|
||||
}
|
||||
|
||||
if (!collisionObjectShouldGenerateConctacts(object)) {
|
||||
continue;
|
||||
}
|
||||
|
@ -747,6 +753,8 @@ void collisionSceneUpdateDynamics() {
|
|||
|
||||
collisionSceneCollideDynamicPairs(&gCollisionScene, prevPosList, sweptBB);
|
||||
|
||||
gdbClearWatchPoint();
|
||||
|
||||
stackMallocFree(sweptBB);
|
||||
stackMallocFree(prevPosList);
|
||||
|
||||
|
|
|
@ -107,7 +107,7 @@ void buttonUpdate(struct Button* button) {
|
|||
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -160,8 +160,11 @@ void sceneInitNoPauseMenu(struct Scene* scene, int mainMenuMode) {
|
|||
|
||||
scene->triggerListenerCount = gCurrentLevel->triggerCount;
|
||||
scene->triggerListeners = malloc(sizeof(struct TriggerListener) * scene->triggerListenerCount);
|
||||
int triggerOffset = 0;
|
||||
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;
|
||||
|
|
|
@ -4,9 +4,15 @@
|
|||
#include "../decor/decor_object_list.h"
|
||||
#include "../levels/cutscene_runner.h"
|
||||
|
||||
#include "./scene.h"
|
||||
|
||||
extern struct ColliderTypeData gPlayerColliderData;
|
||||
|
||||
enum ObjectTriggerType triggerDetermineType(struct CollisionObject* objectEnteringTrigger) {
|
||||
if (gScene.player.grabConstraint.object == objectEnteringTrigger) {
|
||||
return ObjectTriggerTypeNone;
|
||||
}
|
||||
|
||||
if (objectEnteringTrigger->collider == &gPlayerColliderData) {
|
||||
return ObjectTriggerTypePlayer;
|
||||
}
|
||||
|
@ -49,7 +55,7 @@ void triggerTrigger(void* data, struct CollisionObject* objectEnteringTrigger) {
|
|||
signalsSend(triggerInfo->signalIndex);
|
||||
}
|
||||
|
||||
cutsceneTrigger(triggerInfo->cutsceneIndex, listener->triggerIndex);
|
||||
cutsceneTrigger(triggerInfo->cutsceneIndex, listener->triggerIndex + i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -287,20 +287,39 @@ local function generate_cutscenes()
|
|||
return cutscenes_result, cutscene_data
|
||||
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 result = {}
|
||||
|
||||
for _, trigger in pairs(sk_scene.nodes_for_type('@trigger')) do
|
||||
local first_mesh = trigger.node.meshes[1]
|
||||
local cutscene = cutscene_index(cutscenes, trigger.arguments[1])
|
||||
|
||||
|
||||
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
|
||||
local transformed = first_mesh:transform(trigger.node.full_transformation)
|
||||
|
|
Loading…
Reference in a new issue