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 036c32a..a748566 100644 Binary files a/assets/test_chambers/test_chamber_00/test_chamber_00_0.blend and b/assets/test_chambers/test_chamber_00/test_chamber_00_0.blend differ 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