From 3d7f85f25dd30958da35aa9d0fdb98eb66fa36b7 Mon Sep 17 00:00:00 2001 From: James Lambert Date: Sat, 25 Jun 2022 14:10:18 -0600 Subject: [PATCH] Split triggers and cutscenes and allow cutscenes to reference other cutscenes --- .../sound/vo/aperture_ai/00_part2_entry-1.sox | 1 + .../vo/aperture_ai/00_part2_success-1.sox | 1 + .../test_chamber_00/test_chamber_00_0.blend | Bin 3644308 -> 3663788 bytes .../definition_generator/LevelGenerator.cpp | 41 ++++++++-- .../definition_generator/TriggerGenerator.cpp | 73 +++++++++++++----- .../definition_generator/TriggerGenerator.h | 30 +++---- src/levels/cutscene_runner.c | 24 ++++++ src/levels/cutscene_runner.h | 1 + src/levels/level_definition.h | 10 ++- src/levels/levels.c | 2 +- 10 files changed, 139 insertions(+), 44 deletions(-) create mode 100644 assets/sound/vo/aperture_ai/00_part2_entry-1.sox create mode 100644 assets/sound/vo/aperture_ai/00_part2_success-1.sox diff --git a/assets/sound/vo/aperture_ai/00_part2_entry-1.sox b/assets/sound/vo/aperture_ai/00_part2_entry-1.sox new file mode 100644 index 0000000..7af88f9 --- /dev/null +++ b/assets/sound/vo/aperture_ai/00_part2_entry-1.sox @@ -0,0 +1 @@ +-c 1 -r 22050 \ No newline at end of file diff --git a/assets/sound/vo/aperture_ai/00_part2_success-1.sox b/assets/sound/vo/aperture_ai/00_part2_success-1.sox new file mode 100644 index 0000000..7af88f9 --- /dev/null +++ b/assets/sound/vo/aperture_ai/00_part2_success-1.sox @@ -0,0 +1 @@ +-c 1 -r 22050 \ No newline at end of file diff --git a/assets/test_chambers/test_chamber_00/test_chamber_00_0.blend b/assets/test_chambers/test_chamber_00/test_chamber_00_0.blend index 036c32a91dbee6f68762248e179a287d5e580eef..a748566f460ccac30f6e31774b15764822c794da 100644 GIT binary patch delta 52570 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 delta 58463 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 LUR5pp`1F4PgUo0L diff --git a/skelatool64/src/definition_generator/LevelGenerator.cpp b/skelatool64/src/definition_generator/LevelGenerator.cpp index c4733f4..e0579f0 100644 --- a/skelatool64/src/definition_generator/LevelGenerator.cpp +++ b/skelatool64/src/definition_generator/LevelGenerator.cpp @@ -193,18 +193,29 @@ void generateBoundingBoxesDefinition(const aiScene* scene, CFileDefinition& file void generateTriggerDefinition(const aiScene* scene, CFileDefinition& fileDefinition, StructureDataChunk& levelDef, const TriggerGeneratorOutput& triggerOutput) { std::unique_ptr triggers(new StructureDataChunk()); + int triggerCount = 0; + for (auto& trigger : triggerOutput.triggers) { + int cutsceneForTrigger = 0; + + for (auto& cutscene : triggerOutput.cutscenes) { + if (cutscene->name == trigger->cutsceneName) { + break; + } + ++cutsceneForTrigger; + } + + if (cutsceneForTrigger == (int)triggerOutput.cutscenes.size()) { + continue; + } + std::unique_ptr triggerData(new StructureDataChunk()); - std::unique_ptr cutsceneDef(new StructureDataChunk()); - - cutsceneDef->AddPrimitive((trigger->stepsName == "") ? std::string("NULL") : trigger->stepsName); - cutsceneDef->AddPrimitive(trigger->stepsCount); - - triggerData->Add(std::move(cutsceneDef)); triggerData->Add(std::unique_ptr(new StructureDataChunk(trigger->bb))); + triggerData->AddPrimitive(cutsceneForTrigger); triggers->Add(std::move(triggerData)); + ++triggerCount; } std::string triggersName = fileDefinition.GetUniqueName("triggers"); @@ -212,7 +223,23 @@ void generateTriggerDefinition(const aiScene* scene, CFileDefinition& fileDefini fileDefinition.AddDefinition(std::move(triggersDef)); levelDef.AddPrimitive("triggers", triggersName); - levelDef.AddPrimitive("triggerCount", triggerOutput.triggers.size()); + levelDef.AddPrimitive("triggerCount", triggerCount); + + std::unique_ptr cutscenes(new StructureDataChunk()); + + for (auto& cutscene : triggerOutput.cutscenes) { + std::unique_ptr cutsceneDef(new StructureDataChunk()); + + cutsceneDef->AddPrimitive((cutscene->stepsDefName == "") ? std::string("NULL") : cutscene->stepsDefName); + cutsceneDef->AddPrimitive(cutscene->steps.size()); + + cutscenes->Add(std::move(cutsceneDef)); + } + + std::string cutscenesName = fileDefinition.AddDataDefinition("cutscenes", "struct Cutscene", true, "_geo", std::move(cutscenes)); + + levelDef.AddPrimitive("cutscenes", cutscenesName); + levelDef.AddPrimitive("cutsceneCount", triggerOutput.cutscenes.size()); } void generateLocationDefinition(const aiScene* scene, CFileDefinition& fileDefinition, StructureDataChunk& levelDef, const RoomGeneratorOutput& roomOutput, const DisplayListSettings& settings) { diff --git a/skelatool64/src/definition_generator/TriggerGenerator.cpp b/skelatool64/src/definition_generator/TriggerGenerator.cpp index 071bd4c..a580417 100644 --- a/skelatool64/src/definition_generator/TriggerGenerator.cpp +++ b/skelatool64/src/definition_generator/TriggerGenerator.cpp @@ -34,7 +34,17 @@ float distanceFromStart(const CutsceneStep& startStep, const CutsceneStep& other return relativeOffset.y; } -std::unique_ptr generateCutsceneStep(CutsceneStep& step, int stepIndex, std::map& labels, const RoomGeneratorOutput& roomOutput, Signals& signals) { +int findCutsceneIndex(const std::vector>& cutscenes, const std::string& name) { + for (int i = 0; i < (int)cutscenes.size(); ++i) { + if (cutscenes[i]->name == name) { + return i; + } + } + + return -1; +} + +std::unique_ptr generateCutsceneStep(CutsceneStep& step, int stepIndex, std::map& labels, const std::vector>& cutscenes, const RoomGeneratorOutput& roomOutput, Signals& signals) { std::unique_ptr result(new StructureDataChunk()); if ((step.command == "play_sound" || step.command == "start_sound") && step.args.size() >= 1) { @@ -106,6 +116,39 @@ std::unique_ptr generateCutsceneStep(CutsceneStep& step, int gotoStep->AddPrimitive(gotoLabel->second - stepIndex - 1); result->Add("gotoStep", std::move(gotoStep)); + return result; + } + } else if (step.command == "start_cutscene" && step.args.size() >= 1) { + int cutsceneIndex = findCutsceneIndex(cutscenes, step.args[0]); + + if (cutsceneIndex != -1) { + result->AddPrimitive("CutsceneStepTypeStartCutscene"); + std::unique_ptr cutscene(new StructureDataChunk()); + cutscene->AddPrimitive(cutsceneIndex); + result->Add("cutscene", std::move(cutscene)); + + return result; + } + } else if (step.command == "stop_cutscene" && step.args.size() >= 1) { + int cutsceneIndex = findCutsceneIndex(cutscenes, step.args[0]); + + if (cutsceneIndex != -1) { + result->AddPrimitive("CutsceneStepTypeStopCutscene"); + std::unique_ptr cutscene(new StructureDataChunk()); + cutscene->AddPrimitive(cutsceneIndex); + result->Add("cutscene", std::move(cutscene)); + + return result; + } + } else if (step.command == "wait_for_cutscene" && step.args.size() >= 1) { + int cutsceneIndex = findCutsceneIndex(cutscenes, step.args[0]); + + if (cutsceneIndex != -1) { + result->AddPrimitive("CutsceneStepTypeWaitForCutscene"); + std::unique_ptr cutscene(new StructureDataChunk()); + cutscene->AddPrimitive(cutsceneIndex); + result->Add("cutscene", std::move(cutscene)); + return result; } } @@ -131,7 +174,7 @@ void findLabelLocations(std::vector>& stepNodes, s } } -void generateCutscenes(std::map>& output, CFileDefinition& fileDefinition, const RoomGeneratorOutput& roomOutput, Signals& signals, NodeGroups& nodeGroups) { +void generateCutscenes(std::vector>& output, CFileDefinition& fileDefinition, const RoomGeneratorOutput& roomOutput, Signals& signals, NodeGroups& nodeGroups) { std::vector> steps; std::vector stepNodes = nodeGroups.NodesForType(CUTSCENE_PREFIX); @@ -157,7 +200,7 @@ void generateCutscenes(std::map>& output, std::shared_ptr cutscene(new Cutscene()); cutscene->name = step->args[0]; cutscene->steps.push_back(step); - output[step->args[0]] = cutscene; + output.push_back(cutscene); } else { steps.push_back(step); } @@ -165,15 +208,15 @@ void generateCutscenes(std::map>& output, for (auto& cutscene : output) { for (auto& step : steps) { - if (doesBelongToCutscene(*cutscene.second->steps[0], *step)) { - cutscene.second->steps.push_back(step); + if (doesBelongToCutscene(*cutscene->steps[0], *step)) { + cutscene->steps.push_back(step); } } } for (auto& cutsceneEntry : output) { - Cutscene& cutscene = *cutsceneEntry.second; + Cutscene& cutscene = *cutsceneEntry; std::shared_ptr firstStep = cutscene.steps[0]; cutscene.steps.erase(cutscene.steps.begin()); @@ -191,7 +234,7 @@ void generateCutscenes(std::map>& output, int currStepIndex = 0; for (auto& step : cutscene.steps) { - steps->Add(std::move(generateCutsceneStep(*step, currStepIndex, labelLocations, roomOutput, signals))); + steps->Add(std::move(generateCutsceneStep(*step, currStepIndex, labelLocations, output, roomOutput, signals))); ++currStepIndex; } @@ -199,16 +242,14 @@ void generateCutscenes(std::map>& output, std::unique_ptr stepsDef(new DataFileDefinition("struct CutsceneStep", stepsName, true, "_geo", std::move(steps))); stepsDef->AddTypeHeader("\"../build/src/audio/clips.h\""); fileDefinition.AddDefinition(std::move(stepsDef)); - cutscene.defName = stepsName; + cutscene.stepsDefName = stepsName; } } std::shared_ptr generateTriggers(const aiScene* scene, CFileDefinition& fileDefinition, const DisplayListSettings& settings, const RoomGeneratorOutput& roomOutput, Signals& signals, NodeGroups& nodeGroups) { std::shared_ptr output(new TriggerGeneratorOutput()); - std::map> cutscenes; - - generateCutscenes(cutscenes, fileDefinition, roomOutput, signals, nodeGroups); + generateCutscenes(output->cutscenes, fileDefinition, roomOutput, signals, nodeGroups); for (auto& nodeInfo : nodeGroups.NodesForType(TRIGGER_PREFIX)) { auto mesh = fileDefinition.GetExtendedMesh(scene->mMeshes[nodeInfo.node->mMeshes[0]]); @@ -217,15 +258,7 @@ std::shared_ptr generateTriggers(const aiScene* scene, C std::string nodeName = nodeInfo.node->mName.C_Str(); - auto cutscene = cutscenes.find(nodeInfo.arguments.size() ? nodeInfo.arguments[0] : std::string("")); - - if (cutscene == cutscenes.end()) { - trigger->stepsName = ""; - trigger->stepsCount = 0; - } else { - trigger->stepsName = cutscene->second->defName; - trigger->stepsCount = cutscene->second->steps.size(); - } + trigger->cutsceneName = nodeInfo.arguments.size() ? nodeInfo.arguments[0] : std::string(""); aiVector3D minTransformed = nodeInfo.node->mTransformation * mesh->bbMin * settings.mModelScale; aiVector3D maxTransformed = nodeInfo.node->mTransformation * mesh->bbMax * settings.mModelScale; diff --git a/skelatool64/src/definition_generator/TriggerGenerator.h b/skelatool64/src/definition_generator/TriggerGenerator.h index 3b15922..aa277c4 100644 --- a/skelatool64/src/definition_generator/TriggerGenerator.h +++ b/skelatool64/src/definition_generator/TriggerGenerator.h @@ -8,23 +8,10 @@ #include struct Trigger { - std::string stepsName; - int stepsCount; + std::string cutsceneName; aiAABB bb; }; -struct Button { - aiVector3D position; - int roomIndex; - int signalIndex; - int cubeSignalIndex; -}; - -struct TriggerGeneratorOutput { - std::vector> triggers; - std::vector