Fix some trigger related bugs

This commit is contained in:
James Lambert 2023-09-04 10:22:38 -06:00
parent 1839294448
commit 73f4e6f9a7
6 changed files with 34 additions and 16 deletions

View file

@ -294,7 +294,7 @@ build/%.fbx: %.blend
@mkdir -p $(@D)
$(BLENDER_3_0) $< --background --python tools/export_fbx.py -- $@
build/assets/test_chambers/%.h build/assets/test_chambers/%_geo.c build/assets/test_chambers/%_anim.c: build/assets/test_chambers/%.fbx build/assets/materials/static.h $(SKELATOOL64) $(TEXTURE_IMAGES) $(LUA_FILES)
build/assets/test_chambers/%.h build/assets/test_chambers/%_geo.c build/assets/test_chambers/%_anim.c: build/assets/test_chambers/%.fbx assets/test_chambers/%.yaml build/assets/materials/static.h $(SKELATOOL64) $(TEXTURE_IMAGES) $(LUA_FILES)
$(SKELATOOL64) --script tools/export_level.lua --fixed-point-scale ${SCENE_SCALE} --model-scale 0.01 --name $(<:build/assets/test_chambers/%.fbx=%) -m assets/materials/static.skm.yaml -o $(<:%.fbx=%.h) $<
build/assets/test_chambers/%.o: build/assets/test_chambers/%.c build/assets/materials/static.h

View file

@ -468,7 +468,7 @@ int cutsceneTrigger(int cutsceneIndex, int triggerIndex) {
return 1;
}
return 0;
return (gTriggeredCutscenes & cutsceneMask) != 0;
}
void cutsceneSerialize(struct CutsceneRunner* runner, struct CutsceneSerialized* result) {

View file

@ -397,7 +397,7 @@ void collisionSceneRaycastDynamic(struct CollisionScene* scene, struct Ray* ray,
struct CollisionObject* object = scene->dynamicObjects[i];
if ((object->collisionLayers & collisionLayers) == 0) {
if ((object->collisionLayers & collisionLayers) == 0 || object->trigger != NULL) {
continue;
}

View file

@ -609,6 +609,10 @@ void sceneUpdate(struct Scene* scene) {
ballCatcherUpdate(&scene->ballCatchers[i], scene->ballLaunchers, scene->ballLancherCount);
}
for (int i = 0; i < scene->triggerListenerCount; ++i) {
triggerListenerUpdate(&scene->triggerListeners[i]);
}
signalsEvaluateSignals(gCurrentLevel->signalOperators, gCurrentLevel->signalOperatorCount);
for (int i = 0; i < scene->doorCount; ++i) {

View file

@ -29,8 +29,6 @@ enum ObjectTriggerType triggerDetermineType(struct CollisionObject* objectEnteri
void triggerTrigger(void* data, struct CollisionObject* objectEnteringTrigger) {
struct TriggerListener* listener = data;
struct Trigger* trigger = listener->trigger;
struct Vector3 offset;
vector3Sub(
&objectEnteringTrigger->body->transform.position,
@ -47,17 +45,7 @@ void triggerTrigger(void* data, struct CollisionObject* objectEnteringTrigger) {
enum ObjectTriggerType triggerType = triggerDetermineType(objectEnteringTrigger);
for (int i = 0; i < trigger->triggerCount; ++i) {
struct ObjectTriggerInfo* triggerInfo = &trigger->triggers[i];
if (triggerInfo->objectType == triggerType) {
if (triggerInfo->signalIndex != -1) {
signalsSend(triggerInfo->signalIndex);
}
cutsceneTrigger(triggerInfo->cutsceneIndex, listener->triggerIndex + i);
}
}
listener->lastTriggerMask |= (1 << triggerType);
}
void triggerInit(struct TriggerListener* listener, struct Trigger* trigger, int triggerIndex) {
@ -83,4 +71,28 @@ void triggerInit(struct TriggerListener* listener, struct Trigger* trigger, int
listener->triggerIndex = triggerIndex;
collisionSceneAddDynamicObject(&listener->collisionObject);
listener->lastTriggerMask = 0;
}
void triggerListenerUpdate(struct TriggerListener* listener) {
if (!listener->lastTriggerMask) {
return;
}
struct Trigger* trigger = listener->trigger;
for (int i = 0; i < trigger->triggerCount; ++i) {
struct ObjectTriggerInfo* triggerInfo = &trigger->triggers[i];
if ((1 << triggerInfo->objectType) & listener->lastTriggerMask) {
if (triggerInfo->signalIndex != -1) {
signalsSend(triggerInfo->signalIndex);
}
cutsceneTrigger(triggerInfo->cutsceneIndex, listener->triggerIndex + i);
}
}
listener->lastTriggerMask = 0;
}

View file

@ -15,8 +15,10 @@ struct TriggerListener {
struct Trigger* trigger;
short triggerIndex;
short lastTriggerMask;
};
void triggerInit(struct TriggerListener* listener, struct Trigger* trigger, int triggerIndex);
void triggerListenerUpdate(struct TriggerListener* listener);
#endif