mirror of
https://github.com/mwpenny/portal64-still-alive.git
synced 2024-10-20 10:37:37 -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')
|
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 -- $@
|
||||||
|
|
||||||
|
|
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:
|
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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue