Work on test chamber 08

This commit is contained in:
James Lambert 2023-12-29 21:23:43 -07:00
parent bee8411ca5
commit ee42238411
17 changed files with 73 additions and 10 deletions

View file

@ -379,7 +379,8 @@ ANIM_TEST_CHAMBERS = build/assets/test_chambers/test_chamber_00/test_chamber_00_
build/assets/test_chambers/test_chamber_03/test_chamber_03_anim.o \
build/assets/test_chambers/test_chamber_04/test_chamber_04_anim.o \
build/assets/test_chambers/test_chamber_06/test_chamber_06_anim.o \
build/assets/test_chambers/test_chamber_07/test_chamber_07_anim.o
build/assets/test_chambers/test_chamber_07/test_chamber_07_anim.o \
build/assets/test_chambers/test_chamber_08/test_chamber_08_anim.o
build/anims.ld: $(ANIM_LIST) $(ANIM_TEST_CHAMBERS) tools/generate_animation_ld.js
@mkdir -p $(@D)
@ -396,7 +397,8 @@ TEST_CHAMBERS = assets/test_chambers/test_chamber_00/test_chamber_00.blend \
assets/test_chambers/test_chamber_04/test_chamber_04.blend \
assets/test_chambers/test_chamber_05/test_chamber_05.blend \
assets/test_chambers/test_chamber_06/test_chamber_06.blend \
assets/test_chambers/test_chamber_07/test_chamber_07.blend
assets/test_chambers/test_chamber_07/test_chamber_07.blend \
assets/test_chambers/test_chamber_08/test_chamber_08.blend
TEST_CHAMBER_HEADERS = $(TEST_CHAMBERS:%.blend=build/%.h)
TEST_CHAMBER_OBJECTS = $(TEST_CHAMBERS:%.blend=build/%_geo.o)

View file

@ -174,7 +174,7 @@ materials:
gSPGeometryMode:
set: [G_SHADE]
clear: [G_LIGHTING]
clear: [G_LIGHTING, G_CULL_BACK]
properties:
tileSizeS: 0.125

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,10 +1,32 @@
cutscenes:
INTRO_CUTSCENE:
START:
- set_signal launch_ball
- start_cutscene CHECK_TRAPPED
- wait_for_signal move_platform
- label horizontal_loop
- play_animation horizontal horizontal_slide
- wait_for_animation horizontal
- goto horizontal_loop
INTRO_CUTSCENE:
- activate_signage 13
- q_sound 08_PART1_ENTRY_1 CH_GLADOS PORTAL_08_PART1_ENTRY_1
- q_sound 08_PART1_ENTRY_2 CH_GLADOS PORTAL_08_PART1_ENTRY_2
- q_sound 08_PART1_ENTRY_3 CH_GLADOS PORTAL_08_PART1_ENTRY_3
FINISH:
- q_sound 08_PART1_SUCCESS_1 CH_GLADOS PORTAL_08_PART1_SUCCESS_1
- q_sound 08_PART1_SUCCESS_2 CH_GLADOS PORTAL_08_PART1_SUCCESS_2
CHECK_TRAPPED:
- wait_for_signal trapped 30
- q_sound 08_PART1_TRAPPED_1 CH_GLADOS PORTAL_08_PART1_TRAPPED_1
- q_sound 08_PART1_TRAPPED_2 CH_GLADOS PORTAL_08_PART1_TRAPPED_2
- wait_for_channel CH_GLADOS
- set_signal room_exit
operators:
- room_exit = room_exit_0 and room_exit_1
- room_exit = room_exit_0 and room_exit_1
- side_cube_access = player_in_side and has_cube_side
- main_cube_access = player_in_main and has_cube_main
- has_cube_any = has_cube_side or has_cube_main
- side_cube_access_with_door = room_enter and has_cube_any
- direct_cube_access = side_cube_access or main_cube_access
- any_cube_access = direct_cube_access or side_cube_access_with_door
- trapped = not any_cube_access

View file

@ -204,6 +204,9 @@ void cutsceneRunnerStartStep(struct CutsceneRunner* runner) {
case CutsceneStepTypeDelay:
runner->state.delay = step->delay;
break;
case CutsceneStepTypeWaitForSignal:
runner->state.waitForSignal.currentFrame = step->waitForSignal.forFrames;
break;
case CutsceneStepTypeOpenPortal:
{
struct Location* location = &gCurrentLevel->locations[step->openPortal.locationIndex];
@ -348,7 +351,17 @@ int cutsceneRunnerUpdateCurrentStep(struct CutsceneRunner* runner) {
runner->state.delay -= FIXED_DELTA_TIME;
return runner->state.delay <= 0.0f;
case CutsceneStepTypeWaitForSignal:
return signalsRead(step->waitForSignal.signalIndex);
if (signalsRead(step->waitForSignal.signalIndex)) {
if (runner->state.waitForSignal.currentFrame > 0) {
--runner->state.waitForSignal.currentFrame;
} else {
return 1;
}
} else {
runner->state.waitForSignal.currentFrame = step->waitForSignal.forFrames;
}
return 0;
case CutsceneStepTypeWaitForCutscene:
return !cutsceneIsRunning(&gCurrentLevel->cutscenes[step->cutscene.cutsceneIndex]);
case CutsceneStepWaitForAnimation:

View file

@ -10,6 +10,9 @@ union CutsceneStepState {
struct {
ALSndId soundId;
} playSound;
struct {
u8 currentFrame;
} waitForSignal;
float delay;
};

View file

@ -121,6 +121,7 @@ struct CutsceneStep {
} setSignal;
struct {
u16 signalIndex;
u8 forFrames;
} waitForSignal;
struct {
u16 fromLocation;

View file

@ -8,15 +8,17 @@
extern struct ColliderTypeData gPlayerColliderData;
#define TRIGGER_TYPE_TO_MASK(type) (1 << (type))
enum ObjectTriggerType triggerDetermineType(struct CollisionObject* objectEnteringTrigger) {
if (objectEnteringTrigger->collider == &gPlayerColliderData) {
return ObjectTriggerTypePlayer;
return TRIGGER_TYPE_TO_MASK(ObjectTriggerTypePlayer);
}
int decorType = decorIdForObjectDefinition((struct DecorObjectDefinition*)objectEnteringTrigger->collider);
if (decorType == DECOR_TYPE_CUBE || decorType == DECOR_TYPE_CUBE_UNIMPORTANT) {
return gScene.player.grabConstraint.object == objectEnteringTrigger ? ObjectTriggerTypeCubeHover : ObjectTriggerTypeCube;
return gScene.player.grabConstraint.object == objectEnteringTrigger ? TRIGGER_TYPE_TO_MASK(ObjectTriggerTypeCubeHover) | TRIGGER_TYPE_TO_MASK(ObjectTriggerTypeCube) : TRIGGER_TYPE_TO_MASK(ObjectTriggerTypeCube);
}
return ObjectTriggerTypeNone;
@ -41,7 +43,12 @@ void triggerTrigger(void* data, struct CollisionObject* objectEnteringTrigger) {
enum ObjectTriggerType triggerType = triggerDetermineType(objectEnteringTrigger);
listener->lastTriggerMask |= (1 << triggerType);
if (triggerType & listener->usedTriggerMask) {
// an object activating a signal should not sleep
objectEnteringTrigger->body->sleepFrames = IDLE_SLEEP_FRAMES;
}
listener->lastTriggerMask |= triggerType;
}
void triggerInit(struct TriggerListener* listener, struct Trigger* trigger, int triggerIndex) {
@ -69,10 +76,16 @@ void triggerInit(struct TriggerListener* listener, struct Trigger* trigger, int
collisionSceneAddDynamicObject(&listener->collisionObject);
listener->lastTriggerMask = 0;
listener->usedTriggerMask = 0;
for (int i = 0; i < trigger->triggerCount; ++i) {
struct ObjectTriggerInfo* triggerInfo = &trigger->triggers[i];
listener->usedTriggerMask |= 1 << triggerInfo->objectType;
}
}
void triggerListenerUpdate(struct TriggerListener* listener) {
if (!listener->lastTriggerMask) {
if (!(listener->lastTriggerMask & listener->usedTriggerMask)) {
return;
}

View file

@ -16,6 +16,7 @@ struct TriggerListener {
struct Trigger* trigger;
short triggerIndex;
short lastTriggerMask;
short usedTriggerMask;
};
void triggerInit(struct TriggerListener* listener, struct Trigger* trigger, int triggerIndex);

View file

@ -137,6 +137,7 @@ local function generate_cutscene_step(cutscene_name, step, step_index, label_loc
result.type = sk_definition_writer.raw('CutsceneStepTypeWaitForSignal')
result.waitForSignal = {
signals.signal_index_for_name(step.args[1]),
tonumber(step.args[2] or "0"),
}
elseif step.command == "teleport_player" and #step.args >= 2 then
result.type = sk_definition_writer.raw('CutsceneStepTypeTeleportPlayer')