#pragma once #include "cutscene/CutsceneDatabase.h" #include "dialogue/DialogueTypes.h" #include #include namespace ZL::Cutscene { class CutsceneRuntime { public: void setDatabase(const CutsceneDatabase* value); void setOnFinished(std::function cb); void setOnLineStarted(std::function cb); void setOnFadeInComplete(std::function cb); bool start(const std::string& cutsceneId); void stop(); void update(int deltaMs); bool isActive() const { return active; } bool canSkip() const; void skip(); const ZL::Dialogue::PresentationModel& getPresentation() const { return presentation; } private: const CutsceneDatabase* database = nullptr; const StaticCutsceneDefinition* activeCutscene = nullptr; std::string activeCutsceneId; bool active = false; bool fadeInCallbackFired = false; bool skipPending = false; int currentCutsceneLine = -1; int cutsceneTimerMs = 0; int cutsceneElapsedMs = 0; int cutsceneTotalDurationMs = 0; int cutsceneContentDurationMs = 0; ZL::Dialogue::PresentationModel presentation; std::function onFinished; std::function onLineStarted; std::function onFadeInComplete; void finish(); void syncLineToElapsedTime(); void advanceLine(); void refreshPresentation(); std::vector evaluateImages() const; static float applyEasing(EasingType easing, float t); static int computeFallbackDurationMs(const std::string& text); }; } // namespace ZL::Cutscene