#include "world.h" #include #include #include #include #include #include #include #include #include #include "../../ext.h" #include "./player/player.h" #include "./gui/battle.h" #include "./gui/dialogue.h" #include "./gui/menu.h" #include ".//battle.h" #include ".//dialogue.h" #include EXT_OBJECT_REGISTER_CPP(World) void ext::World::initialize() { uf::Scene::initialize(); this->m_name = "World"; this->load("./entities/world.json"); uf::Serializer& metadata = this->getComponent(); uf::Asset& assetLoader = this->getComponent(); /* Grab master data */ { std::vector tables = { "Card", "Chara", "Skill", "Element", "Status", }; for ( auto& table : tables ) { uf::MasterData data; metadata["system"]["mastertable"][table] = data.load(table); } } this->addHook( "world:Music.LoadPrevious.%UID%", [&](const std::string& event)->std::string{ uf::Serializer json = event; if ( metadata["previous bgm"]["filename"] == "" ) return "false"; std::string filename = metadata["previous bgm"]["filename"].asString(); float timestamp = metadata["previous bgm"]["timestamp"].asFloat(); // std::cout << metadata["previous bgm"] << std::endl; uf::Audio& audio = this->getComponent(); if ( audio.playing() ) { metadata["previous bgm"]["filename"] = audio.getFilename(); metadata["previous bgm"]["timestamp"] = audio.getTime(); audio.stop(); } audio.load(filename); audio.setVolume(metadata["volumes"]["bgm"].asFloat()); audio.setTime(timestamp); audio.play(); return "true"; }); this->addHook( "asset:Load." + std::to_string(this->getUid()), [&](const std::string& event)->std::string{ uf::Serializer json = event; std::string filename = json["filename"].asString(); if ( uf::string::extension(filename) != "ogg" ) return "false"; const uf::Audio* audioPointer = NULL; try { audioPointer = &assetLoader.get(filename); } catch ( ... ) {} if ( !audioPointer ) return "false"; uf::Audio& audio = this->getComponent(); if ( audio.playing() ) { /* if ( filename.find("_intro") == std::string::npos ) { metadata["previous bgm"]["filename"] = audio.getFilename(); metadata["previous bgm"]["timestamp"] = audio.getTime(); } */ audio.stop(); } // std::cout << metadata["previous bgm"] << std::endl; audio.load(filename); audio.setVolume(metadata["volumes"]["bgm"].asFloat()); audio.play(); return "true"; }); static uf::Timer timer(false); if ( !timer.running() ) timer.start(); this->addHook( "menu:Pause", [&](const std::string& event)->std::string{ if ( timer.elapsed().asDouble() < 1 ) return "false"; timer.reset(); uf::Serializer json = event; ext::Gui* guiManager = (ext::Gui*) this->findByName("Gui Manager"); if ( !guiManager ) return "false"; ext::Gui* guiMenu = new ext::GuiMenu; uf::Serializer& pMetadata = guiMenu->getComponent(); guiManager->addChild(*guiMenu); guiMenu->load("./entities/gui/pause/menu.json"); pMetadata["menu"] = json["menu"]; guiMenu->initialize(); uf::Serializer payload; payload["uid"] = guiMenu->getUid(); return payload; }); this->addHook( "world:Entity.LoadAsset", [&](const std::string& event)->std::string{ uf::Serializer json = event; std::string asset = json["asset"].asString(); std::string uid = json["uid"].asString(); assetLoader.load(asset, "asset:Load." + uid); return "true"; }); this->addHook( "world:Battle.Prepare", [&](const std::string& event)->std::string{ uf::Serializer json = event; uf::Entity& player = *this->getController(); uf::Serializer& pMetadata = player.getComponent(); uf::Serializer payload; payload["battle"]["music"] = json["music"]; payload["battle"]["enemy"] = json[""]; payload["battle"]["enemy"]["uid"] = json["uid"]; payload["battle"]["player"] = pMetadata[""]; payload["battle"]["player"]["uid"] = player.getUid(); pMetadata["system"]["control"] = false; pMetadata["system"]["menu"] = "battle"; this->callHook("world:Battle.Start", payload); return "true"; }); this->addHook( "world:Battle.Start", [&](const std::string& event)->std::string{ if ( timer.elapsed().asDouble() < 1 ) return "false"; timer.reset(); ext::Gui* guiManager = (ext::Gui*) this->findByName("Gui Manager"); if ( !guiManager ) return "false"; uf::Serializer json = event; ext::HousamoBattle* battleManager = new ext::HousamoBattle; this->addChild(*battleManager); battleManager->initialize(); battleManager->callHook("world:Battle.Start.%UID%", json); uf::Serializer payload; return payload; }); this->addHook( "world:Battle.End", [&](const std::string& event)->std::string{ uf::Serializer json = event; ext::HousamoBattle* battleManager = (ext::HousamoBattle*) this->findByName("Battle Manager"); if ( !battleManager ) return "false"; this->removeChild(*battleManager); battleManager->destroy(); delete battleManager; return "true"; }); this->addHook( "menu:Dialogue.Start", [&](const std::string& event)->std::string{ if ( timer.elapsed().asDouble() < 1 ) return "false"; timer.reset(); ext::Gui* guiManager = (ext::Gui*) this->findByName("Gui Manager"); if ( !guiManager ) return "false"; uf::Serializer json = event; ext::DialogueManager* dialogueManager = new ext::DialogueManager; this->addChild(*dialogueManager); dialogueManager->initialize(); dialogueManager->callHook("menu:Dialogue.Start.%UID%", json); return json; }); this->addHook( "menu:Dialogue.End", [&](const std::string& event)->std::string{ uf::Serializer json = event; ext::DialogueManager* dialogueManager = (ext::DialogueManager*) this->findByName("Dialogue Manager"); if ( !dialogueManager ) return "false"; this->removeChild(*dialogueManager); dialogueManager->destroy(); delete dialogueManager; return "true"; }); /* store viewport size */ { metadata["window"]["size"]["x"] = ext::vulkan::width; metadata["window"]["size"]["y"] = ext::vulkan::height; this->addHook( "window:Resized", [&](const std::string& event)->std::string{ uf::Serializer json = event; pod::Vector2ui size; { size.x = json["window"]["size"]["x"].asUInt64(); size.y = json["window"]["size"]["y"].asUInt64(); } metadata["window"] = json["window"]; return "true"; }); } // lock control { uf::Serializer payload; payload["state"] = false; uf::hooks.call("window:Mouse.CursorVisibility", payload); uf::hooks.call("window:Mouse.Lock"); } } void ext::World::tick() { uf::Scene::tick(); uf::Serializer& metadata = this->getComponent(); uf::Asset& assetLoader = this->getComponent(); /* check if audio needs to loop */ try { uf::Audio& bgm = this->getComponent(); float current = bgm.getTime(); float end = bgm.getDuration(); float epsilon = 0.005f; if ( current + epsilon >= end || !bgm.playing() ) { // intro to main transition std::string filename = bgm.getFilename(); filename = assetLoader.getOriginal(filename); if ( filename.find("_intro") != std::string::npos ) { assetLoader.load(uf::string::replace( filename, "_intro", "" ), "asset:Load." + std::to_string(this->getUid())); // loop } else { bgm.setTime(0); if ( !bgm.playing() ) bgm.play(); } } } catch ( ... ) { } /* Regain control if nothing requests it */ { ext::Gui* menu = (ext::Gui*) this->findByName("Gui: Menu"); if ( !menu ) { uf::Serializer payload; payload["state"] = false; uf::hooks.call("window:Mouse.CursorVisibility", payload); uf::hooks.call("window:Mouse.Lock"); } } /* Print Entity Information */ { static uf::Timer timer(false); if ( !timer.running() ) timer.start(); if ( uf::Window::isKeyPressed("U") && timer.elapsed().asDouble() >= 1 ) { timer.reset(); uf::iostream << "Current size: " << uf::Entity::entities.size() << " | UIDs: " << uf::Entity::uids << "\n"; uint orphans = 0; uint empty = 0; for ( uf::Entity* e : uf::Entity::entities ) { if ( e && !e->hasParent() ) { ++orphans; uf::iostream << "Orphan: " << e->getName() << ": " << e << "\n"; } if ( !e ) ++empty; } uf::iostream << "Orphans: " << orphans << "\n"; uf::iostream << "Empty: " << empty << "\n"; } } /* Updates Sound Listener */ { pod::Transform<>& transform = this->getController()->getComponent>(); ext::oal.listener( "POSITION", { transform.position.x, transform.position.y, transform.position.z } ); ext::oal.listener( "VELOCITY", { 0, 0, 0 } ); ext::oal.listener( "ORIENTATION", { 0, 0, 1, 1, 0, 0 } ); } } void ext::World::render() { uf::Scene::render(); }