diff --git a/assets/en.csv b/assets/locale/en.csv similarity index 100% rename from assets/en.csv rename to assets/locale/en.csv diff --git a/src/dawn/asset/AssetLoader.hpp b/src/dawn/asset/AssetLoader.hpp index 2a87cb22..9d46a112 100644 --- a/src/dawn/asset/AssetLoader.hpp +++ b/src/dawn/asset/AssetLoader.hpp @@ -62,7 +62,6 @@ namespace Dawn { * @return 0 if successful, otherwise unsuccessful. */ int32_t rewind(); - /** * Retreive the current byte position within the asset that the head is diff --git a/src/dawn/asset/AssetManager.cpp b/src/dawn/asset/AssetManager.cpp index 6d668752..cee8e432 100644 --- a/src/dawn/asset/AssetManager.cpp +++ b/src/dawn/asset/AssetManager.cpp @@ -19,10 +19,18 @@ void AssetManager::queueLoad(std::vector assets) { vectorAppend(&this->assetsToLoad, &assets); } +void AssetManager::queueLoad(Asset *asset) { + this->assetsToLoad.push_back(asset); +} + void AssetManager::queueUnload(std::vector assets) { vectorAppend(&this->assetsToUnload, &assets); } +void AssetManager::queueUnload(Asset *asset) { + this->assetsToUnload.push_back(asset); +} + void AssetManager::queueSwap( std::vector newAssets, std::vector oldAssets @@ -57,6 +65,7 @@ void AssetManager::syncTick() { auto asset = *it; if(asset->loaded) { it = this->assetsToLoad.erase(it); + asset->eventLoaded.invoke(); continue; } @@ -65,6 +74,7 @@ void AssetManager::syncTick() { if(asset->loaded) { it = this->assetsToLoad.erase(it); + asset->eventLoaded.invoke(); continue; } diff --git a/src/dawn/asset/AssetManager.hpp b/src/dawn/asset/AssetManager.hpp index 241e70b2..833f9c52 100644 --- a/src/dawn/asset/AssetManager.hpp +++ b/src/dawn/asset/AssetManager.hpp @@ -32,6 +32,7 @@ namespace Dawn { * @param assets Assets to load. */ void queueLoad(std::vector assets); + void queueLoad(Asset *assets); /** * Takes a list of lists to queue to unload. Does not immediately unload. @@ -39,6 +40,7 @@ namespace Dawn { * @param assets Assets to unload. */ void queueUnload(std::vector assets); + void queueUnload(Asset* assets); /** * Queues load and unload based on the difference between two sets of @@ -82,10 +84,26 @@ namespace Dawn { return asset; } + /** + * Both gets an asset, and puts it into the load queue. + * + * @param name Name of the asset to load. + * @return The asset element to be loaded. + */ template + T * getAndLoad(std::string name) { + auto asset = this->get(name); + this->queueLoad(asset); + return asset; + } + + template + void unload(T *asset) { + assertUnreachable(); + } + void unload(std::string name) { assertUnreachable(); - //should delete the asset for you } /** diff --git a/src/dawn/asset/assets/TextureAsset.cpp b/src/dawn/asset/assets/TextureAsset.cpp index 5c61e0da..cf882c2a 100644 --- a/src/dawn/asset/assets/TextureAsset.cpp +++ b/src/dawn/asset/assets/TextureAsset.cpp @@ -24,7 +24,6 @@ void TextureAsset::updateSync() { this->texture.buffer(this->colors); this->state = 0x05; this->loaded = true; - this->eventLoaded.invoke(); } void TextureAsset::updateAsync() { diff --git a/src/dawn/asset/assets/TilesetAsset.cpp b/src/dawn/asset/assets/TilesetAsset.cpp index d9b6c145..29f5a8ff 100644 --- a/src/dawn/asset/assets/TilesetAsset.cpp +++ b/src/dawn/asset/assets/TilesetAsset.cpp @@ -95,7 +95,6 @@ void TilesetAsset::updateAsync() { this->state = 0x07; this->loaded = true; - this->eventLoaded.invoke(); memoryFree(buffer); } \ No newline at end of file diff --git a/src/dawn/asset/assets/TrueTypeAsset.cpp b/src/dawn/asset/assets/TrueTypeAsset.cpp index 18ec7cf8..73ccd8c9 100644 --- a/src/dawn/asset/assets/TrueTypeAsset.cpp +++ b/src/dawn/asset/assets/TrueTypeAsset.cpp @@ -29,7 +29,6 @@ void TrueTypeAsset::updateSync() { this->state = 0x05; this->loaded = true; - this->eventLoaded.invoke(); } void TrueTypeAsset::updateAsync() { diff --git a/src/dawn/game/_DawnGame.hpp b/src/dawn/game/_DawnGame.hpp index af0b6469..2a0fca30 100644 --- a/src/dawn/game/_DawnGame.hpp +++ b/src/dawn/game/_DawnGame.hpp @@ -11,7 +11,7 @@ #include "input/InputManager.hpp" #include "time/TimeManager.hpp" #include "input/InputBinds.hpp" -#include "locale/LanguageManager.hpp" +#include "locale/LocaleManager.hpp" #define DAWN_GAME_INIT_RESULT_SUCCESS 0 #define DAWN_GAME_UPDATE_RESULT_SUCCESS 0 diff --git a/src/dawn/locale/CMakeLists.txt b/src/dawn/locale/CMakeLists.txt index 472a8dd6..fdfc193c 100644 --- a/src/dawn/locale/CMakeLists.txt +++ b/src/dawn/locale/CMakeLists.txt @@ -7,5 +7,5 @@ # Sources target_sources(${DAWN_TARGET_NAME} PRIVATE - LanguageManager.cpp + LocaleManager.cpp ) \ No newline at end of file diff --git a/src/dawn/locale/LanguageManager.cpp b/src/dawn/locale/LanguageManager.cpp deleted file mode 100644 index 8647fa14..00000000 --- a/src/dawn/locale/LanguageManager.cpp +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (c) 2022 Dominic Masters -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT - -#include "LanguageManager.hpp" -#include "game/DawnGame.hpp" - -using namespace Dawn; - -LanguageManager::LanguageManager(DawnGame *game) { - this->game = game; - - auto lang = this->game->assetManager.get("language_en"); - while(!lang->loaded) { - lang->updateAsync(); - } - std::cout << lang->getValue("test2"); -} \ No newline at end of file diff --git a/src/dawn/locale/LanguageManager.hpp b/src/dawn/locale/LanguageManager.hpp deleted file mode 100644 index e44b2882..00000000 --- a/src/dawn/locale/LanguageManager.hpp +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) 2022 Dominic Masters -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT - -#pragma once -#include "event/Event.hpp" -#include "asset/AssetManager.hpp" - -namespace Dawn { - class DawnGame; - - struct LocalizedString { - std::string data; - }; - - class LanguageManager { - private: - DawnGame *game; - LanguageAsset *asset; - - public: - Event<> eventLanguageChanged; - - LanguageManager(DawnGame *game); - - struct LocalizedString getString(std::string key); - }; -} \ No newline at end of file diff --git a/src/dawn/locale/LocaleManager.cpp b/src/dawn/locale/LocaleManager.cpp new file mode 100644 index 00000000..c2ea9cac --- /dev/null +++ b/src/dawn/locale/LocaleManager.cpp @@ -0,0 +1,70 @@ +// Copyright (c) 2022 Dominic Masters +// +// This software is released under the MIT License. +// https://opensource.org/licenses/MIT + +#include "LocaleManager.hpp" +#include "game/DawnGame.hpp" + + +using namespace Dawn; + +LocaleManager::LocaleManager(DawnGame *game) { + this->game = game; + this->locale.language = "en"; +} + +void LocaleManager::init() { + // Begin loading + if(this->currentlyLoadedAsset == nullptr && this->loadingAsset == nullptr) { + this->loadingAsset = this->game->assetManager.getAndLoad("language_" + this->locale.language); + this->loadingAsset->eventLoaded.addListener(this, &LocaleManager::onLanguageLoaded); + } +} + +void LocaleManager::setLocale(struct Locale locale) { + auto oldLocale = this->getLocale(); + + this->locale = locale; + + // Did the language change? + if(this->locale.language != oldLocale.language) { + // Yes, switch languages. + + // Are we already loading something? Stop it. + if(this->loadingAsset != nullptr) { + this->loadingAsset->eventLoaded.removeListener(this, &LocaleManager::onLanguageLoaded); + this->game->assetManager.queueUnload(this->loadingAsset); + this->loadingAsset = nullptr; + } + + this->loadingAsset = this->game->assetManager.getAndLoad("language_" + this->locale.language); + this->loadingAsset->eventLoaded.addListener(this, &LocaleManager::onLanguageLoaded); + } + + this->eventLocaleChanged.invoke(); +} + +struct Locale LocaleManager::getLocale() { + return this->locale; +} + +std::string LocaleManager::getString(std::string key) { + assertNotNull(this->currentlyLoadedAsset); + return this->currentlyLoadedAsset->getValue(key); +} + + +void LocaleManager::onLanguageLoaded() { + // Unload the previously loaded language + if(this->currentlyLoadedAsset != nullptr) { + this->game->assetManager.queueUnload(this->currentlyLoadedAsset); + } + + // Swap loaded languages + this->currentlyLoadedAsset = this->loadingAsset; + this->loadingAsset = nullptr; + + // Notify. + this->eventLanguageUpdated.invoke(); +} \ No newline at end of file diff --git a/src/dawn/locale/LocaleManager.hpp b/src/dawn/locale/LocaleManager.hpp new file mode 100644 index 00000000..5dd2c6f1 --- /dev/null +++ b/src/dawn/locale/LocaleManager.hpp @@ -0,0 +1,68 @@ +// Copyright (c) 2022 Dominic Masters +// +// This software is released under the MIT License. +// https://opensource.org/licenses/MIT + +#pragma once +#include "event/Event.hpp" +#include "asset/AssetManager.hpp" + +namespace Dawn { + class DawnGame; + + struct Locale { + std::string language; + }; + + class LocaleManager { + private: + DawnGame *game; + LanguageAsset *asset; + struct Locale locale; + LanguageAsset *currentlyLoadedAsset = nullptr; + LanguageAsset *loadingAsset = nullptr; + + /** Listens for when the pending language loads. */ + void onLanguageLoaded(); + + public: + Event<> eventLocaleChanged; + Event<> eventLanguageUpdated; + + /** + * Initializes the Locale Manager Instance. Locale Manager is responsible + * for handling anything that will change depending on which region the + * player is in. + * + * @param game Game instance this manager belongs to. + */ + LocaleManager(DawnGame *game); + + /** + * Initializes the LocaleManager and loads the default language. + */ + void init(); + + /** + * Change the locale and begin loading the new language. + * + * @param locale Locale to switch to. + */ + void setLocale(struct Locale locale); + + /** + * Gets the current locale. + * + * @return Current locale. + */ + struct Locale getLocale(); + + /** + * Returns a language string from the language CSV file. + * + * @param key Key of the string to get. + * @return The translated string. + */ + std::string getString(std::string key); + }; +} \ No newline at end of file diff --git a/src/dawnpokergame/CMakeLists.txt b/src/dawnpokergame/CMakeLists.txt index ef51b726..734c56a3 100644 --- a/src/dawnpokergame/CMakeLists.txt +++ b/src/dawnpokergame/CMakeLists.txt @@ -23,7 +23,7 @@ add_subdirectory(visualnovel) add_subdirectory(scenes) # Assets -tool_language(language_en en.csv) +tool_language(language_en locale/en.csv) tool_texture(texture_test texture_test.png) tool_texture(texture_city_day borrowed/city_day.png) tool_texture(texture_city_night borrowed/city_night.png) diff --git a/src/dawnpokergame/game/DawnGame.cpp b/src/dawnpokergame/game/DawnGame.cpp index 4a7873e3..bcf4460d 100644 --- a/src/dawnpokergame/game/DawnGame.cpp +++ b/src/dawnpokergame/game/DawnGame.cpp @@ -15,12 +15,13 @@ DawnGame::DawnGame(DawnHost *host) : host(host), renderManager(this), inputManager(this), - languageManager(this) + localeManager(this) { } int32_t DawnGame::init() { this->assetManager.init(); + this->localeManager.init(); this->renderManager.init(); this->scene = new TestScene(this); diff --git a/src/dawnpokergame/game/DawnGame.hpp b/src/dawnpokergame/game/DawnGame.hpp index 3c26e1cd..9f628a1f 100644 --- a/src/dawnpokergame/game/DawnGame.hpp +++ b/src/dawnpokergame/game/DawnGame.hpp @@ -15,7 +15,7 @@ namespace Dawn { AssetManager assetManager; InputManager inputManager; TimeManager timeManager; - LanguageManager languageManager; + LocaleManager localeManager; DawnGame(DawnHost *host); int32_t init() override;