104 lines
2.1 KiB
C++
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
|