space-game001/src/dialogue/DialogueSystem.cpp

104 lines
2.1 KiB
C++

#include "dialogue/DialogueSystem.h"
namespace ZL::Dialogue {
bool DialogueSystem::init(Renderer& renderer, const std::string& zipFile) {
runtime.setDatabase(&database);
return overlay.init(renderer, zipFile);
}
bool DialogueSystem::loadDatabase(const std::string& path) {
return database.loadFromFile(path);
}
void DialogueSystem::update(int deltaMs, const Eigen::Vector3f& playerPosition) {
if (!runtime.isActive()) {
for (TriggerZone& zone : triggerZones) {
if (zone.once && zone.triggered) {
continue;
}
const Eigen::Vector3f diff = playerPosition - zone.center;
if (diff.norm() <= zone.radius) {
if (startDialogue(zone.dialogueId)) {
zone.triggered = true;
break;
}
}
}
}
runtime.update(deltaMs);
}
void DialogueSystem::draw(Renderer& renderer) {
overlay.draw(renderer, runtime.getPresentation());
}
bool DialogueSystem::handleKeyDown(SDL_Keycode key) {
if (!runtime.isActive()) {
return false;
}
switch (key) {
case SDLK_RETURN:
case SDLK_SPACE:
case SDLK_e:
runtime.confirmAdvance();
return true;
case SDLK_UP:
case SDLK_w:
runtime.moveSelection(-1);
return true;
case SDLK_DOWN:
case SDLK_s:
runtime.moveSelection(1);
return true;
case SDLK_ESCAPE:
stopDialogue();
return true;
default:
return false;
}
}
bool DialogueSystem::handlePointerReleased(float x, float y) {
if (!runtime.isActive()) {
return false;
}
int choiceIndex = -1;
const PresentationModel& model = runtime.getPresentation();
if (overlay.handlePointerReleased(x, y, model, choiceIndex)) {
while (model.selectedChoice != choiceIndex) {
runtime.moveSelection(1);
}
runtime.confirmAdvance();
return true;
}
runtime.confirmAdvance();
return true;
}
bool DialogueSystem::startDialogue(const std::string& dialogueId) {
return runtime.startDialogue(dialogueId);
}
void DialogueSystem::stopDialogue() {
runtime.stop();
}
void DialogueSystem::addTriggerZone(const TriggerZone& zone) {
triggerZones.push_back(zone);
}
void DialogueSystem::clearTriggerZones() {
triggerZones.clear();
}
} // namespace ZL::Dialogue