space-game001/src/cutscene/CutsceneRuntime.h
2026-06-12 21:04:19 +03:00

61 lines
1.6 KiB
C++

#pragma once
#include "cutscene/CutsceneDatabase.h"
#include "dialogue/DialogueTypes.h"
#include <functional>
#include <string>
namespace ZL::Cutscene {
class CutsceneRuntime {
public:
void setDatabase(const CutsceneDatabase* value);
void setOnFinished(std::function<void(const std::string&)> cb);
void setOnLineStarted(std::function<void(const std::string&)> cb);
void setOnFadeInComplete(std::function<void(const std::string&)> 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<void(const std::string&)> onFinished;
std::function<void(const std::string&)> onLineStarted;
std::function<void(const std::string&)> onFadeInComplete;
void finish();
void syncLineToElapsedTime();
void advanceLine();
void refreshPresentation();
std::vector<PresentedCutsceneImage> evaluateImages() const;
static float applyEasing(EasingType easing, float t);
static int computeFallbackDurationMs(const std::string& text);
};
} // namespace ZL::Cutscene