shadow-over-bishkek001/src/dialogue/DialogueSystem.h
2026-04-20 00:21:51 +03:00

72 lines
1.9 KiB
C++

#pragma once
#include "dialogue/DialogueOverlay.h"
#include "dialogue/DialogueRuntime.h"
#include <Eigen/Dense>
#include <SDL.h>
#include <functional>
#include <string>
#include <vector>
namespace ZL::Dialogue {
struct TriggerZone {
std::string id;
std::string dialogueId;
Eigen::Vector3f center = Eigen::Vector3f::Zero();
float radius = 1.5f;
bool once = true;
bool triggered = false;
};
struct AutoSkipConfig {
float baseDurationMs = 1200.0f;
float msPerCharacter = 25.0f;
float minDurationMs = 1500.0f;
};
class DialogueSystem {
public:
bool init(Renderer& renderer, const std::string& zipFile = "");
bool loadDatabase(const std::string& path);
void update(int deltaMs, const Eigen::Vector3f& playerPosition);
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, std::function<void()> onFinished = nullptr);
void stopDialogue();
void clearState();
bool isActive() const { return runtime.isActive(); }
bool blocksGameplayInput() const { return runtime.isActive(); }
void setFlag(const std::string& name, int value) { runtime.setFlag(name, value); }
int getFlag(const std::string& name) const { return runtime.getFlag(name); }
void addTriggerZone(const TriggerZone& zone);
void clearTriggerZones();
void setSkipDialogs(bool value) { skipDialogs = value; }
bool getSkipDialogs() const { return skipDialogs; }
void setAutoSkipConfig(const AutoSkipConfig& config) { autoSkipConfig = config; }
const AutoSkipConfig& getAutoSkipConfig() const { return autoSkipConfig; }
private:
DialogueDatabase database;
DialogueRuntime runtime;
DialogueOverlay overlay;
std::vector<TriggerZone> triggerZones;
bool skipDialogs = true;
AutoSkipConfig autoSkipConfig;
std::string autoSkipTrackedText;
float autoSkipTimerMs = 0.0f;
};
} // namespace ZL::Dialogue