#pragma once #include "dialogue/DialogueOverlay.h" #include "dialogue/DialogueRuntime.h" #include "cutscene/CutsceneDatabase.h" #include "cutscene/CutsceneOverlay.h" #include "cutscene/CutsceneRuntime.h" #include "quest/QuestJournal.h" #include #include #include namespace ZL::Dialogue { class DialogueSystem { public: bool init(Renderer& renderer, const std::string& zipFile = ""); bool loadDatabase(const std::string& path); bool loadCutsceneDatabase(const std::string& path); void update(int deltaMs); void draw(Renderer& renderer); bool handleKeyDown(SDL_Keycode key); void handlePointerDown(float x, float y); void handlePointerMoved(float x, float y); bool handlePointerReleased(float x, float y); bool startDialogue(const std::string& dialogueId); bool startCutscene(const std::string& cutsceneId); void skipCutscene(); void setOnCutsceneStarted(std::function cb); void setOnCutsceneFinished(std::function cb); void setOnCutsceneFinishedExtra(std::function cb); void setOnDialogueLineStarted(std::function cb); void setOnCutsceneLineStarted(std::function cb); void setOnCutsceneFadeInComplete(std::function cb); void setOnChatBubbleReady(std::function cb); void setOnDialogueAdvanced(std::function cb); void stopDialogue(); bool isActive() const { return dialogueRuntime.isActive() || cutsceneRuntime.isActive(); } bool blocksGameplayInput() const { return isActive(); } void setFlag(const std::string& name, int value) { dialogueRuntime.setFlag(name, value); } int getFlag(const std::string& name) const { return dialogueRuntime.getFlag(name); } void setGlobalFlagStore(std::unordered_map* store) { dialogueRuntime.setGlobalFlagStore(store); } void setQuestJournal(Quest::QuestJournal* journal) { dialogueRuntime.setQuestJournal(journal); } private: DialogueDatabase database; DialogueRuntime dialogueRuntime; DialogueOverlay dialogueOverlay; ZL::Cutscene::CutsceneDatabase cutsceneDatabase; ZL::Cutscene::CutsceneRuntime cutsceneRuntime; ZL::Cutscene::CutsceneOverlay cutsceneOverlay; std::function onDialogueAdvancedCallback; std::function onCutsceneStartedCallback; std::function onCutsceneFinishedCallback; std::function onCutsceneFinishedExtraCallback; // Pending node to resume after an inline cutscene finishes. std::string pendingNodeAfterCutscene; void onCutsceneFinishedInternal(const std::string& id); }; } // namespace ZL::Dialogue