engine/ext/scenes/world/housamo/dialogue.cpp
2020-08-29 00:00:00 -05:00

277 lines
9.4 KiB
C++

#include "dialogue.h"
#include ".h"
#include <uf/utils/hook/hook.h>
#include <uf/utils/time/time.h>
#include <uf/utils/serialize/serializer.h>
#include <uf/utils/userdata/userdata.h>
#include <uf/utils/graphic/mesh.h>
#include <uf/utils/window/window.h>
#include <uf/utils/camera/camera.h>
#include <uf/ext/vulkan/graphic.h>
#include <uf/ext/vulkan/device.h>
#include <uf/ext/vulkan/swapchain.h>
#include <uf/ext/vulkan/vulkan.h>
#include <uf/utils/image/image.h>
#include <uf/utils/audio/audio.h>
#include <uf/engine/asset/asset.h>
#include "../world.h"
#include "../gui/dialogue.h"
namespace {
ext::World* world;
ext::Gui* gui;
uf::Serializer masterTableGet( const std::string& table ) {
if ( !world ) world = (ext::World*) uf::Entity::globalFindByName("World");
if ( !world ) return std::string();
uf::Serializer& mastertable = world->getComponent<uf::Serializer>();
return mastertable["system"]["mastertable"][table];
}
uf::Serializer masterDataGet( const std::string& table, const std::string& key ) {
if ( !world ) world = (ext::World*) uf::Entity::globalFindByName("World");
if ( !world ) return std::string();
uf::Serializer& mastertable = world->getComponent<uf::Serializer>();
return mastertable["system"]["mastertable"][table][key];
}
inline int64_t parseInt( const std::string& str ) {
return atoi(str.c_str());
}
}
namespace {
void playSound( ext::DialogueManager& entity, const std::string& id, const std::string& key ) {
ext::World& world = entity.getRootParent<ext::World>();
uf::Serializer& masterdata = world.getComponent<uf::Serializer>();
uf::Serializer cardData = masterDataGet("Card", id);
uf::Serializer charaData = masterDataGet("Chara", cardData["character_id"].asString());
std::string name = charaData["filename"].asString();
std::string url = "https://cdn..xyz//unity/Android/voice/voice_" + name + "_"+key+".ogg";
std::cout << url << std::endl;
if ( charaData["internal"].asBool() ) {
url = "./data/smtsamo/voice/voice_" + name + "_" + key + ".ogg";
}
uf::Asset& assetLoader = world.getComponent<uf::Asset>();
assetLoader.cache(url, "asset:Cache.Voice." + std::to_string(entity.getUid()));
}
void playSound( ext::DialogueManager& entity, std::size_t uid, const std::string& key ) {
ext::World& world = entity.getRootParent<ext::World>();
uf::Serializer& pMetadata = entity.getComponent<uf::Serializer>();
uf::Serializer& masterdata = world.getComponent<uf::Serializer>();
uf::Entity* = world.findByUid(uid);
if ( ! ) return;
uf::Serializer& metadata = ->getComponent<uf::Serializer>();
std::string id = metadata[""]["id"].asString();
playSound( entity, id, key );
}
void playSound( ext::DialogueManager& entity, const std::string& key ) {
ext::World& world = entity.getRootParent<ext::World>();
uf::Serializer& metadata = entity.getComponent<uf::Serializer>();
uf::Serializer& masterdata = world.getComponent<uf::Serializer>();
std::string url = "./" + key + ".ogg";
uf::Asset& assetLoader = world.getComponent<uf::Asset>();
assetLoader.cache(url, "asset:Cache.SFX." + std::to_string(entity.getUid()));
}
void playMusic( ext::DialogueManager& entity, const std::string& filename ) {
ext::World& world = entity.getRootParent<ext::World>();
uf::Asset& assetLoader = world.getComponent<uf::Asset>();
uf::Serializer& masterdata = world.getComponent<uf::Serializer>();
assetLoader.load(filename, "asset:Load." + std::to_string(world.getUid()));
}
uf::Audio sfx;
uf::Audio voice;
std::vector<ext::Housamo*> transients;
}
void ext::DialogueManager::initialize() {
uf::Object::initialize();
gui = NULL;
transients.clear();
uf::Serializer& metadata = this->getComponent<uf::Serializer>();
// std::vector<ext::Housamo>& transients = this->getComponent<std::vector<ext::Housamo>>();
this->m_name = "Dialogue Manager";
// asset loading
this->addHook( "asset:Cache.Voice.%UID%", [&](const std::string& event)->std::string{
uf::Serializer json = event;
ext::World& world = this->getRootParent<ext::World>();
uf::Serializer& metadata = this->getComponent<uf::Serializer>();
uf::Serializer& masterdata = world.getComponent<uf::Serializer>();
std::string filename = json["filename"].asString();
if ( uf::string::extension(filename) != "ogg" ) return "false";
if ( filename == "" ) return "false";
if ( voice.playing() ) voice.stop();
voice = uf::Audio();
voice.load(filename);
voice.setVolume(masterdata["volumes"]["voice"].asFloat());
voice.play();
return "true";
});
this->addHook( "asset:Cache.SFX.%UID%", [&](const std::string& event)->std::string{
uf::Serializer json = event;
ext::World& world = this->getRootParent<ext::World>();
uf::Serializer& masterdata = world.getComponent<uf::Serializer>();
std::string filename = json["filename"].asString();
if ( uf::string::extension(filename) != "ogg" ) return "false";
if ( filename == "" ) return "false";
if ( sfx.playing() ) sfx.stop();
sfx = uf::Audio();
sfx.load(filename);
sfx.setVolume(masterdata["volumes"]["sfx"].asFloat());
sfx.play();
return "true";
});
this->addHook( "asset:Music.Load.%UID%", [&](const std::string& event)->std::string{
uf::Serializer json = event;
if ( json["music"].isString() ) playMusic(*this, json["music"].asString());
return "true";
});
this->addHook( "asset:Sfx.Load.%UID%", [&](const std::string& event)->std::string{
uf::Serializer json = event;
if ( json["sfx"].isString() ) playSound(*this, json["sfx"].asString());
return "true";
});
this->addHook( "asset:Voice.Load.%UID%", [&](const std::string& event)->std::string{
uf::Serializer json = event;
if ( json["voice"].isObject() ) playSound(*this, json["voice"]["id"].asString(), json["voice"]["key"].asString());
return "true";
});
// bind events
this->addHook( "menu:Dialogue.Start.%UID%", [&](const std::string& event)->std::string{
uf::Serializer json = event;
{
metadata["dialogue"] = json["dialogue"];
uf::Serializer payload;
payload["music"] = metadata["dialogue"]["music"];
payload["sfx"] = metadata["dialogue"]["sfx"];
payload["voice"] = metadata["dialogue"]["voice"];
// this->queueHook( "asset:Music.Load.%UID%", payload );
}
metadata["uid"] = json["uid"];
this->queueHook("menu:Dialogue.Gui.%UID%");
uf::Serializer payload;
payload["dialogue"] = metadata["dialogue"];
return payload;
});
this->addHook( "menu:Dialogue.Gui.%UID%", [&](const std::string& event)->std::string{
ext::Gui* guiManager = (ext::Gui*) this->getRootParent().findByName("Gui Manager");
ext::Gui* guiMenu = new ext::GuiDialogue;
guiManager->addChild(*guiMenu);
guiMenu->load("./entities/gui/dialogue/menu.json");
guiMenu->initialize();
uf::Serializer payload;
payload["dialogue"] = metadata["dialogue"];
guiMenu->queueHook("menu:Dialogue.Start.%UID%", payload);
gui = guiMenu;
return "true";
});
// json.action and json.uid
this->addHook( "menu:Dialogue.Action.%UID%", [&](const std::string& event)->std::string{
uf::Serializer json = event;
std::string hookName = "";
uf::Serializer payload;
std::string action = json["action"].asString();
if ( action == "dialogue-select" ) {
payload = json;
hookName = "menu:Dialogue.Turn.%UID%";
} else {
payload["message"] = "Invalid command: %#FF0000%" + action;
payload["timeout"] = 2.0f;
payload["invalid"] = true;
return payload;
}
uf::Serializer result;
if ( hookName != "" ) result = this->callHook(hookName, payload)[0];
return result;
});
this->addHook( "menu:Dialogue.Turn.%UID%", [&](const std::string& event)->std::string{
uf::Serializer json = event;
uf::Serializer payload;
std::string index = json["index"].asString();
uf::Serializer part = metadata["dialogue"][index];
if ( part["quit"].asBool() ) return this->callHook("menu:Dialogue.End.%UID%")[0];
payload["message"] = part["message"];
payload["actions"] = part["actions"];
if ( part["music"].isString() ) {
uf::Serializer pload;
pload["music"] = part["music"];
this->queueHook( "asset:Music.Load.%UID%", pload );
}
if ( part["sfx"].isString() ) {
uf::Serializer pload;
pload["sfx"] = part["sfx"];
this->queueHook( "asset:Sfx.Load.%UID%", pload );
}
if ( part["voice"].isObject() ) {
uf::Serializer pload;
pload["voice"] = part["voice"];
this->queueHook( "asset:Voice.Load.%UID%", pload );
}
if ( part["hook"].isObject() ) {
part["hooks"].append( part["hook"] );
}
for ( auto hook : part["hooks"] ) {
hook["payload"]["uid"] = metadata["uid"];
this->queueHook( hook["name"].asString(), uf::Serializer{hook["payload"]}, hook["timeout"].asFloat() );
}
return payload;
});
this->addHook( "menu:Dialogue.End.%UID%", [&](const std::string& event)->std::string{
uf::Serializer json = event;
// play music
ext::World& world = this->getRootParent<ext::World>();
world.callHook("world:Music.LoadPrevious.%UID%");
gui->callHook("menu:Close.%UID%");
this->callHook("menu:Dialogue.End");
uf::Serializer payload;
payload["end"] = true;
return payload;
});
}
void ext::DialogueManager::tick() {
uf::Object::tick();
}
void ext::DialogueManager::destroy() {
uf::Object::destroy();
}
void ext::DialogueManager::render() {
uf::Object::render();
}