enabled fizzler objects to send signals on cube contact, the "@fizzler" objects in blender files now can have an argument for the signal name to send.

test_chamber_00: added level logic to trigger voice lines whenever the cube in the first room is fizzled.
added missing voice lines
box_dropper.c: fixed typo "DROPPER_.." instead of "DROOPER_.."

(Issue #13)
This commit is contained in:
Deconimus 2024-02-27 21:08:31 +01:00
parent 591e5958aa
commit 3d37c2504c
10 changed files with 35 additions and 9 deletions

View file

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

View file

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

View file

@ -30,6 +30,7 @@ cutscenes:
- open_portal portal_room 0
- open_portal room_exit 1
FIRST_PUZZLE:
- start_cutscene FIRST_ROOM_CHECK_CUBE_FIZZLE
- clear_signal room_divider
- delay 3
- set_signal cube_dropper
@ -38,6 +39,14 @@ cutscenes:
- q_sound SOUNDS_00_PART1_SUCCESS_1 CH_GLADOS PORTAL_00_PART1_SUCCESS_1
- q_sound SOUNDS_00_PART1_SUCCESS_2 CH_GLADOS PORTAL_00_PART1_SUCCESS_2
- q_sound SOUNDS_00_PART1_SUCCESS_3 CH_GLADOS PORTAL_00_PART1_SUCCESS_3
FIRST_ROOM_CHECK_CUBE_FIZZLE:
- label first_room_cube_check_loop
- wait_for_signal cube_fizzled
- clear_signal cube_fizzled
- q_sound SOUNDS_GENERIC_CRATE_VAPORIZED_IN_EMANCIPATION_GRID_1 CH_GLADOS PORTAL_GENERIC_CRATE_VAPORIZED_IN_EMANCIPATION_GRID_1
- q_sound SOUNDS_GENERIC_CRATE_VAPORIZED_IN_EMANCIPATION_GRID_2 CH_GLADOS PORTAL_GENERIC_CRATE_VAPORIZED_IN_EMANCIPATION_GRID_2
- wait_for_channel CH_GLADOS
- goto first_room_cube_check_loop
SECOND_SIGNAGE:
- activate_signage 1
START_SECOND_ROOM:
@ -56,4 +65,4 @@ cutscenes:
- wait_for_signal success_1
- q_sound SOUNDS_00_PART2_SUCCESS_1 CH_GLADOS PORTAL_00_PART2_SUCCESS_1
HOVER_CUBE_PROMPT:
- show_prompt CutscenePromptTypeDrop
- show_prompt CutscenePromptTypeDrop

View file

@ -239,6 +239,7 @@ struct FizzlerDefinition {
float width;
float height;
short roomIndex;
short cubeSignalIndex;
};
struct ElevatorDefinition {

View file

@ -15,7 +15,7 @@
#include "hud.h"
#include "scene.h"
#define DROOPER_RELOAD_TIME 2.0f
#define DROPPER_RELOAD_TIME 2.0f
#define DROPPER_DROP_TIME 0.5f
void boxDropperFakePos(struct BoxDropper* dropper, struct Transform* result) {
@ -108,7 +108,7 @@ void boxDropperInit(struct BoxDropper* dropper, struct BoxDropperDefinition* def
skAnimatorInit(&dropper->animator, PROPS_BOX_DROPPER_DEFAULT_BONES_COUNT);
dropper->flags = 0;
dropper->reloadTimer = DROOPER_RELOAD_TIME;
dropper->reloadTimer = DROPPER_RELOAD_TIME;
dynamicSceneSetRoomFlags(dropper->dynamicId, ROOM_FLAG_FROM_INDEX(dropper->roomIndex));
@ -158,12 +158,11 @@ void boxDropperUpdate(struct BoxDropper* dropper) {
dropper->flags &= ~BoxDropperFlagsCubeRequested;
dropper->flags |= BoxDropperFlagsCubeIsActive;
dropper->reloadTimer = DROOPER_RELOAD_TIME;
dropper->reloadTimer = DROPPER_RELOAD_TIME;
}
dropper->flags &= ~BoxDropperFlagsSignalWasSet;
if (signalIsSet) {
dropper->flags |= BoxDropperFlagsSignalWasSet;
}
}

View file

@ -6,6 +6,8 @@
#include "../physics/collision_scene.h"
#include "../util/dynamic_asset_loader.h"
#include "../math/mathf.h"
#include "../decor/decor_object_list.h"
#include "signals.h"
#include "../../build/assets/models/dynamic_model_list.h"
@ -17,9 +19,16 @@
#define GFX_PER_PARTICLE(particleCount) ((particleCount) + (((particleCount) + 7) >> 3) + 1)
void fizzlerTrigger(void* data, struct CollisionObject* objectEnteringTrigger) {
struct Fizzler* fizzler = (struct Fizzler*)data;
if (objectEnteringTrigger->body) {
objectEnteringTrigger->body->flags |= RigidBodyFizzled;
}
int decorType = decorIdForObjectDefinition((struct DecorObjectDefinition*)objectEnteringTrigger->collider);
if (decorType == DECOR_TYPE_CUBE || decorType == DECOR_TYPE_CUBE_UNIMPORTANT) {
signalsSend(fizzler->cubeSignalIndex);
}
}
struct Transform gRelativeLeft = {
@ -120,7 +129,7 @@ void fizzlerSpawnParticle(struct Fizzler* fizzler, int particleIndex) {
currentVertex->v.cn[0] = 255; currentVertex->v.cn[1] = 255; currentVertex->v.cn[2] = 255; currentVertex->v.cn[3] = 255;
}
void fizzlerInit(struct Fizzler* fizzler, struct Transform* transform, float width, float height, int room) {
void fizzlerInit(struct Fizzler* fizzler, struct Transform* transform, float width, float height, int room, short cubeSignalIndex) {
fizzler->collisionBox.sideLength.x = width;
fizzler->collisionBox.sideLength.y = height;
fizzler->collisionBox.sideLength.z = 0.25f;
@ -135,9 +144,12 @@ void fizzlerInit(struct Fizzler* fizzler, struct Transform* transform, float wid
rigidBodyMarkKinematic(&fizzler->rigidBody);
fizzler->collisionObject.trigger = fizzlerTrigger;
fizzler->collisionObject.data = fizzler;
fizzler->rigidBody.transform = *transform;
fizzler->rigidBody.currentRoom = room;
fizzler->cubeSignalIndex = cubeSignalIndex;
collisionObjectUpdateBB(&fizzler->collisionObject);
collisionSceneAddDynamicObject(&fizzler->collisionObject);
@ -216,6 +228,6 @@ void fizzlerUpdate(struct Fizzler* fizzler) {
fizzler->oldestParticleIndex = 0;
}
}
osWritebackDCache(fizzler->modelVertices, sizeof(Vtx) * maxVertex);
}

View file

@ -28,9 +28,10 @@ struct Fizzler {
short maxVerticalExtent;
short oldestParticleIndex;
short dynamicId;
short cubeSignalIndex;
};
void fizzlerInit(struct Fizzler* fizzler, struct Transform* transform, float width, float height, int room);
void fizzlerInit(struct Fizzler* fizzler, struct Transform* transform, float width, float height, int room, short cubeSignalIndex);
void fizzlerUpdate(struct Fizzler* fizzler);
#endif

View file

@ -191,7 +191,8 @@ void sceneInitNoPauseMenu(struct Scene* scene, int mainMenuMode) {
fizzlerTransform.position = fizzlerDef->position;
fizzlerTransform.rotation = fizzlerDef->rotation;
fizzlerTransform.scale = gOneVec;
fizzlerInit(&scene->fizzlers[i], &fizzlerTransform, fizzlerDef->width, fizzlerDef->height, fizzlerDef->roomIndex);
fizzlerInit(&scene->fizzlers[i], &fizzlerTransform, fizzlerDef->width, fizzlerDef->height,
fizzlerDef->roomIndex, fizzlerDef->cubeSignalIndex);
}
scene->elevatorCount = gCurrentLevel->elevatorCount;

View file

@ -127,6 +127,7 @@ for _, fizzler in pairs(sk_scene.nodes_for_type('@fizzler')) do
1,
1,
room_index,
signals.signal_index_for_name(fizzler.arguments[1] or ''),
})
end