From 2104d5bdc44a76e56de7cca6caaa367d9e678f3c Mon Sep 17 00:00:00 2001 From: thefirey33 Date: Sat, 4 Apr 2026 21:48:02 +0300 Subject: [PATCH 01/69] changed settings menu so theme changing requires a restart. --- .../childWindows/settingsPanel/general.hpp | 8 ++- resources/translations/en_us.json | 6 +- resources/translations/tr.json | 6 +- .../childWindows/settingsPanel/general.cpp | 57 +++++++++++++++---- src/editor/services/themeService.cpp | 17 ++---- 5 files changed, 65 insertions(+), 29 deletions(-) diff --git a/include/editor/childWindows/settingsPanel/general.hpp b/include/editor/childWindows/settingsPanel/general.hpp index 288162bd..849446f5 100644 --- a/include/editor/childWindows/settingsPanel/general.hpp +++ b/include/editor/childWindows/settingsPanel/general.hpp @@ -1,10 +1,14 @@ +#include + #include "base.hpp" #ifndef RPGPP_SETTINGSPANEL_GENERAL_H #define RPGPP_SETTINGSPANEL_GENERAL_H class SettingsPanelGeneral : public SettingsPanelBase { - public: - SettingsPanelGeneral(tgui::TabContainer::Ptr tabContainer); + tgui::MessageBox::Ptr promptUserBox; + + public: + explicit SettingsPanelGeneral(tgui::TabContainer::Ptr tabContainer); }; #endif diff --git a/resources/translations/en_us.json b/resources/translations/en_us.json index c0e2bdce..72ee8d16 100644 --- a/resources/translations/en_us.json +++ b/resources/translations/en_us.json @@ -34,7 +34,7 @@ "_label": "General", "language": "Language", "theme": "Theme", - "theme_notice": "It is recommended to restart the editor after switching theme!" + "theme_notice": "You need to restart the editor for the theme to take effect.\nUnsaved progress will be lost!" }, "hotkeys": { "_label": "Hotkeys", @@ -127,6 +127,8 @@ } }, "button": { - "go_back": "Go Back" + "go_back": "Go Back", + "restart": "Restart", + "restart_later": "Restart Later" } } diff --git a/resources/translations/tr.json b/resources/translations/tr.json index 7df71a1d..4b968736 100644 --- a/resources/translations/tr.json +++ b/resources/translations/tr.json @@ -34,7 +34,7 @@ "_label": "Genel", "language": "Dil", "theme": "Tema", - "theme_notice": "Tema değiştirdikten sonra düzenleyici yeniden başlatmanız önerilir!" + "theme_notice": "Tema değiştirdikten sonra etkili olması için düzenleyiciyi yeniden başlatın.\nKaydedilmiş değişiklikler silinecektir!" }, "hotkeys": { "_label": "Kısayollar", @@ -127,6 +127,8 @@ } }, "button": { - "go_back": "Geri Git" + "go_back": "Geri Git", + "restart": "Yeniden Başlat", + "restart_later": "Sonra Yeniden Başlat" } } diff --git a/src/editor/childWindows/settingsPanel/general.cpp b/src/editor/childWindows/settingsPanel/general.cpp index 179cb820..2ea63f23 100644 --- a/src/editor/childWindows/settingsPanel/general.cpp +++ b/src/editor/childWindows/settingsPanel/general.cpp @@ -1,12 +1,23 @@ #include "childWindows/settingsPanel/general.hpp" + +#include +#include + #include "TGUI/Widgets/ComboBox.hpp" #include "TGUI/Widgets/GrowVerticalLayout.hpp" #include "TGUI/Widgets/HorizontalLayout.hpp" #include "TGUI/Widgets/Label.hpp" #include "TGUI/Widgets/ScrollablePanel.hpp" +constexpr const int ANIMATION_DURATION = 200; + +#ifdef _WIN32 + #include "winapi.hpp" +#endif + + SettingsPanelGeneral::SettingsPanelGeneral(tgui::TabContainer::Ptr tabContainer) - : SettingsPanelBase(tabContainer, "screen.options.general._label") { + : SettingsPanelBase(std::move(tabContainer), "screen.options.general._label") { TranslationService &ts = Editor::instance->getTranslations(); ThemeService &theme = Editor::instance->getThemeService(); @@ -24,7 +35,7 @@ SettingsPanelGeneral::SettingsPanelGeneral(tgui::TabContainer::Ptr tabContainer) // Language const auto languageLayout = tgui::HorizontalLayout::create(); const auto languageSelector = tgui::ComboBox::create(); - for (auto [name, key] : ts.langKeyToName) { + for (const auto& [name, key] : ts.langKeyToName) { languageSelector->addItem(key, name); } @@ -41,7 +52,7 @@ SettingsPanelGeneral::SettingsPanelGeneral(tgui::TabContainer::Ptr tabContainer) // Can't think of a way to reload the menu bar without recreating it Editor::instance->getGui().initMenuBar(); - if (auto ptr = Editor::instance->getGui().menuBar.lock()) { + if (const auto ptr = Editor::instance->getGui().menuBar.lock()) { Editor::instance->getGui().currentScreen->bindMenuBarAndHK(ptr); } }); @@ -64,8 +75,8 @@ SettingsPanelGeneral::SettingsPanelGeneral(tgui::TabContainer::Ptr tabContainer) themeLabel->setVerticalAlignment(tgui::VerticalAlignment::Center); bindTranslation(themeLabel, "screen.options.general.theme", &tgui::Label::setText); - for (const auto &theme : theme.getThemes()) - themeSelector->addItem(theme); + for (const auto &themeName : theme.getThemes()) + themeSelector->addItem(themeName); themeSelector->setSelectedItem(theme.current_theme_name); @@ -74,21 +85,43 @@ SettingsPanelGeneral::SettingsPanelGeneral(tgui::TabContainer::Ptr tabContainer) Editor::instance->getConfiguration(); configService.setStringValue("theme", item.toStdString()); configService.saveConfiguration(); - theme.setTheme(item.toStdString()); - Editor::instance->getGui().reloadUi(); + + if (this->promptUserBox == nullptr) { + this->promptUserBox = tgui::MessageBox::create(ts.getKey("screen.options.general.theme")); + bindTranslation(promptUserBox, "button.restart", &tgui::MessageBox::addButton); + bindTranslation(promptUserBox, "button.restart_later", &tgui::MessageBox::addButton); + } + + bindTranslation(promptUserBox, "screen.options.general.theme_notice", &tgui::MessageBox::setText); + promptUserBox->setOrigin({0.5, 0.5}); + promptUserBox->setPosition({"50%", "50%"}); + + promptUserBox->onButtonPress.connect([&](const tgui::String& text) { + if (text == ts.getKey("button.restart")) { + #ifdef __linux__ + if (const FILE *handle = popen("./editor", "r"); handle == nullptr) { + fprintf(stderr, "failed to relaunch editor..\n"); + return; + } + #elif _WIN32 + // TODO + #endif + exit(0); + } + // Hide with an effect if nothing else is selected. + promptUserBox->hideWithEffect(tgui::ShowEffectType::Scale, ANIMATION_DURATION); + }); + + Editor::instance->getGui().gui->add(promptUserBox); + promptUserBox->showWithEffect(tgui::ShowEffectType::Scale, ANIMATION_DURATION); }); themeLayout->add(themeLabel); themeLayout->add(themeSelector); - auto warnLabel = tgui::Label::create(); - bindTranslation(warnLabel, "screen.options.general.theme_notice", - &tgui::Label::setText); - warnLabel->setSize({"100%", 36}); layout->add(languageLayout); layout->add(themeLayout); - layout->add(warnLabel); scrollPanel->add(layout); panel->add(scrollPanel); diff --git a/src/editor/services/themeService.cpp b/src/editor/services/themeService.cpp index 30ee9431..61523d2e 100644 --- a/src/editor/services/themeService.cpp +++ b/src/editor/services/themeService.cpp @@ -1,18 +1,15 @@ -#include "TGUI/Loading/Theme.hpp" -#include "TGUI/Renderers/ButtonRenderer.hpp" -#include "editor.hpp" -#include "screens/projectScreen.hpp" -#include "services/fileSystemService.hpp" -#include #include #include #include + +#include "TGUI/Loading/Theme.hpp" +#include "editor.hpp" +#include "services/fileSystemService.hpp" using namespace std; namespace fs = std::filesystem; ThemeService::ThemeService(Editor *editor_ptr) { - for (const auto &theme : fs::directory_iterator( - editor_ptr->getFs().getResourcePath(THEME_DIR))) { + for (const auto &theme : fs::directory_iterator(editor_ptr->getFs().getResourcePath(THEME_DIR))) { // each theme is a folder, where the theme name is the folder name // itself in each folder should always have a file called "theme.txt" if (theme.is_directory()) { @@ -23,14 +20,12 @@ ThemeService::ThemeService(Editor *editor_ptr) { } } } - this->current_theme = - std::make_shared(this->themes[this->current_theme_name]); + this->current_theme = std::make_shared(this->themes[this->current_theme_name]); tgui::Theme::setDefault(this->current_theme); } void ThemeService::setTheme(const string &themeName) { if (this->themes.find(themeName) != this->themes.end()) { - this->current_theme_name = themeName; this->current_theme->load(this->themes[this->current_theme_name]); // this->current_theme = std::make_shared( From 620d70af52dd91c8f3434b6d81624ff3840df804 Mon Sep 17 00:00:00 2001 From: thefirey33 Date: Sat, 4 Apr 2026 21:50:18 +0300 Subject: [PATCH 02/69] fix, have to change to application directory for launching to work. --- src/editor/childWindows/settingsPanel/general.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/editor/childWindows/settingsPanel/general.cpp b/src/editor/childWindows/settingsPanel/general.cpp index 2ea63f23..25af5cc5 100644 --- a/src/editor/childWindows/settingsPanel/general.cpp +++ b/src/editor/childWindows/settingsPanel/general.cpp @@ -99,6 +99,8 @@ SettingsPanelGeneral::SettingsPanelGeneral(tgui::TabContainer::Ptr tabContainer) promptUserBox->onButtonPress.connect([&](const tgui::String& text) { if (text == ts.getKey("button.restart")) { #ifdef __linux__ + ChangeDirectory(GetApplicationDirectory()); + if (const FILE *handle = popen("./editor", "r"); handle == nullptr) { fprintf(stderr, "failed to relaunch editor..\n"); return; From 154b415e920aad86ff2c550ea620eba8ed154907 Mon Sep 17 00:00:00 2001 From: thefirey33 Date: Sat, 4 Apr 2026 22:03:41 +0300 Subject: [PATCH 03/69] slight changes, finish up --- include/editor/childWindows/popupWindow.hpp | 8 ++++---- .../childWindows/settingsPanel/general.cpp | 2 +- src/editor/components/frameButton.cpp | 16 ++++++++-------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/include/editor/childWindows/popupWindow.hpp b/include/editor/childWindows/popupWindow.hpp index 7ce23c6a..3e75945d 100644 --- a/include/editor/childWindows/popupWindow.hpp +++ b/include/editor/childWindows/popupWindow.hpp @@ -8,11 +8,11 @@ class PopupWindow { bool windowIsOpen = false; tgui::ChildWindow::Ptr currentWindow; - PopupWindow(const std::string &title); - ~PopupWindow() { close(); }; + explicit PopupWindow(const std::string &title); + virtual ~PopupWindow() { PopupWindow::close(); }; - void open(); - void close(); + virtual void open(); + virtual void close(); }; #endif /* RPGPP_POPUPWINDOW_H */ diff --git a/src/editor/childWindows/settingsPanel/general.cpp b/src/editor/childWindows/settingsPanel/general.cpp index 25af5cc5..2c638b11 100644 --- a/src/editor/childWindows/settingsPanel/general.cpp +++ b/src/editor/childWindows/settingsPanel/general.cpp @@ -98,8 +98,8 @@ SettingsPanelGeneral::SettingsPanelGeneral(tgui::TabContainer::Ptr tabContainer) promptUserBox->onButtonPress.connect([&](const tgui::String& text) { if (text == ts.getKey("button.restart")) { + ChangeDirectory(GetApplicationDirectory()); #ifdef __linux__ - ChangeDirectory(GetApplicationDirectory()); if (const FILE *handle = popen("./editor", "r"); handle == nullptr) { fprintf(stderr, "failed to relaunch editor..\n"); diff --git a/src/editor/components/frameButton.cpp b/src/editor/components/frameButton.cpp index ae16f3c1..b48cb563 100644 --- a/src/editor/components/frameButton.cpp +++ b/src/editor/components/frameButton.cpp @@ -13,12 +13,12 @@ constexpr int CIRCLE_RADIUS = 10; constexpr float PADDING = 10.0f; -FrameButton::FrameButton(int frameIndex, Actor *actor) - : tgui::Button(), frameIndex(frameIndex), actor(actor) { +FrameButton::FrameButton(const int frameIndex, Actor *actor) + : frameIndex(frameIndex), actor(actor) { this->setMouseCursor(tgui::Cursor::Type::Hand); - this->setSize({50, "100%"}); + this->ButtonBase::setSize({50, "100%"}); this->updateSprite(); this->setToolTip(Tooltip::create(std::to_string(frameIndex))); @@ -33,7 +33,7 @@ FrameButton::Ptr FrameButton::create(int frameIndex, Actor *actor) { void FrameButton::updateSprite(bool reImport) { auto &tileset = actor->getTileSet(); - auto atlasPos = actor->getAnimationAtlasByIdx(this->frameIndex); + auto [x, y] = actor->getAnimationAtlasByIdx(this->frameIndex); const auto &texture = tileset.getTexture(); @@ -46,9 +46,9 @@ void FrameButton::updateSprite(bool reImport) { sprite.setTexture(tgui::Texture{tileset.getTextureSource()}); } - float width = static_cast(tileset.getTileWidth()), + auto width = static_cast(tileset.getTileWidth()), height = static_cast(tileset.getTileHeight()); - float xPos = atlasPos.x * width, yPos = atlasPos.y * height; + float xPos = x * width, yPos = y * height; sprite.setVisibleRect({ xPos, @@ -63,7 +63,7 @@ void FrameButton::updateSprite(bool reImport) { void FrameButton::draw(tgui::BackendRenderTarget &target, tgui::RenderStates states) const { - tgui::Button::draw(target, states); + Button::draw(target, states); float buttonWidth = m_size.x.getValue(), buttonHeight = m_size.y.getValue(); @@ -72,7 +72,7 @@ void FrameButton::draw(tgui::BackendRenderTarget &target, ? tgui::Color::Blue : tgui::Color::Black); - tgui::FloatRect visibleRect = this->sprite.getVisibleRect(); + const tgui::FloatRect visibleRect = this->sprite.getVisibleRect(); states.transform.translate({buttonWidth / 2.0f, buttonHeight / 2.0f}); states.transform.scale({((buttonWidth - PADDING) / visibleRect.width), From 75f4bcb894525c7bdc84a5791bbb41e09611ddc4 Mon Sep 17 00:00:00 2001 From: thefirey33 Date: Sat, 4 Apr 2026 22:05:22 +0300 Subject: [PATCH 04/69] actual finish up because the IDE recommended something that broke something --- include/editor/childWindows/popupWindow.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/editor/childWindows/popupWindow.hpp b/include/editor/childWindows/popupWindow.hpp index 3e75945d..194cc881 100644 --- a/include/editor/childWindows/popupWindow.hpp +++ b/include/editor/childWindows/popupWindow.hpp @@ -9,10 +9,10 @@ class PopupWindow { tgui::ChildWindow::Ptr currentWindow; explicit PopupWindow(const std::string &title); - virtual ~PopupWindow() { PopupWindow::close(); }; + ~PopupWindow() { close(); }; - virtual void open(); - virtual void close(); + void open(); + void close(); }; #endif /* RPGPP_POPUPWINDOW_H */ From 1ca16e50061333e336b7accbca5bb05ca60cea36 Mon Sep 17 00:00:00 2001 From: thefirey33 Date: Sat, 4 Apr 2026 20:18:00 +0300 Subject: [PATCH 05/69] add restarting theme and fix warnings on windows --- include/winapi.hpp | 2 +- .../childWindows/settingsPanel/general.cpp | 20 +++++---- src/editor/fileViews/roomFileView.cpp | 8 ++-- src/editor/fileViews/tilesetFileView.cpp | 8 ++-- .../widgets/propertyFields/rectangleField.cpp | 8 ++-- src/winapi.cpp | 41 ++++++++++++++++--- 6 files changed, 61 insertions(+), 26 deletions(-) diff --git a/include/winapi.hpp b/include/winapi.hpp index 9a9f897c..8e5e3026 100644 --- a/include/winapi.hpp +++ b/include/winapi.hpp @@ -13,5 +13,5 @@ bool WinOpenFileAssociate(std::string operation, std::string file); void WinCreateProc(std::string cmdLine); VsInfo WinVsWhere(std::string path); VsInfo ParseVsWhereData(std::string output); - +bool WinCreateDetachedExecutable(std::string path); #endif \ No newline at end of file diff --git a/src/editor/childWindows/settingsPanel/general.cpp b/src/editor/childWindows/settingsPanel/general.cpp index 2c638b11..15afe999 100644 --- a/src/editor/childWindows/settingsPanel/general.cpp +++ b/src/editor/childWindows/settingsPanel/general.cpp @@ -1,20 +1,20 @@ + #include "childWindows/settingsPanel/general.hpp" #include -#include +#include +#include #include "TGUI/Widgets/ComboBox.hpp" #include "TGUI/Widgets/GrowVerticalLayout.hpp" #include "TGUI/Widgets/HorizontalLayout.hpp" #include "TGUI/Widgets/Label.hpp" #include "TGUI/Widgets/ScrollablePanel.hpp" +#include "raylib.h" +#include "winapi.hpp" constexpr const int ANIMATION_DURATION = 200; -#ifdef _WIN32 - #include "winapi.hpp" -#endif - SettingsPanelGeneral::SettingsPanelGeneral(tgui::TabContainer::Ptr tabContainer) : SettingsPanelBase(std::move(tabContainer), "screen.options.general._label") { @@ -105,9 +105,15 @@ SettingsPanelGeneral::SettingsPanelGeneral(tgui::TabContainer::Ptr tabContainer) fprintf(stderr, "failed to relaunch editor..\n"); return; } - #elif _WIN32 - // TODO #endif + + #ifdef _WIN32 + if (!WinCreateDetachedExecutable("editor.exe")) { + fprintf(stderr, "failed to relaunch editor..\n"); + return; + } + #endif + exit(0); } // Hide with an effect if nothing else is selected. diff --git a/src/editor/fileViews/roomFileView.cpp b/src/editor/fileViews/roomFileView.cpp index ed1e78c9..4e7b8f70 100644 --- a/src/editor/fileViews/roomFileView.cpp +++ b/src/editor/fileViews/roomFileView.cpp @@ -79,10 +79,10 @@ RoomFileView::RoomFileView() { widthField = IntField::create(); bindTranslation(widthField->label, "screen.project.roomview.mapwidth", &tgui::Label::setText); - widthField->value->onValueChange([this](int value) { + widthField->value->onValueChange([this](const auto& value) { Vector2 worldSize = this->roomView->getRoom()->getTileMap()->getMaxWorldSize(); - worldSize.x = value; + worldSize.x = static_cast(value); this->roomView->getRoom()->getTileMap()->setWorldSize(worldSize); }); props->addIntField(widthField); @@ -90,10 +90,10 @@ RoomFileView::RoomFileView() { heightField = IntField::create(); bindTranslation(heightField->label, "screen.project.roomview.mapheight", &tgui::Label::setText); - heightField->value->onValueChange([this](int value) { + heightField->value->onValueChange([this](const float& value) { Vector2 worldSize = this->roomView->getRoom()->getTileMap()->getMaxWorldSize(); - worldSize.y = value; + worldSize.y = static_cast(value); this->roomView->getRoom()->getTileMap()->setWorldSize(worldSize); }); props->addIntField(heightField); diff --git a/src/editor/fileViews/tilesetFileView.cpp b/src/editor/fileViews/tilesetFileView.cpp index c28481d5..f4c045f4 100644 --- a/src/editor/fileViews/tilesetFileView.cpp +++ b/src/editor/fileViews/tilesetFileView.cpp @@ -29,8 +29,8 @@ TileSetFileView::TileSetFileView() { widthField = IntField::create(); bindTranslation(widthField->label, "screen.project.tilesetview.tile_width", &tgui::Label::setText); - widthField->value->onValueChange([this](int value) { - this->worldView->getTileSet()->setTileWidth(value); + widthField->value->onValueChange([this](const float& value) { + this->worldView->getTileSet()->setTileWidth(static_cast(value)); }); props->addIntField(widthField); @@ -38,8 +38,8 @@ TileSetFileView::TileSetFileView() { bindTranslation(heightField->label, "screen.project.tilesetview.tile_height", &tgui::Label::setText); - heightField->value->onValueChange([this](int value) { - this->worldView->getTileSet()->setTileHeight(value); + heightField->value->onValueChange([this](const float& value) { + this->worldView->getTileSet()->setTileHeight(static_cast(value)); }); props->addButton("Square Tiles", [this] { diff --git a/src/editor/widgets/propertyFields/rectangleField.cpp b/src/editor/widgets/propertyFields/rectangleField.cpp index bd1e154b..892ada80 100644 --- a/src/editor/widgets/propertyFields/rectangleField.cpp +++ b/src/editor/widgets/propertyFields/rectangleField.cpp @@ -20,28 +20,28 @@ RectangleField::RectangleField(const char *typeName, bool initRenderer) value_x = tgui::SpinControl::create(); value_x->setMinimum(INT_MIN); value_x->setMaximum(INT_MAX); - value_x->onValueChange([this](int _) { onChange.emit(this, getValue()); }); + value_x->onValueChange([this](const float& _) { onChange.emit(this, getValue()); }); l_y = tgui::Label::create("Y"); setAlign(l_y); value_y = tgui::SpinControl::create(); value_y->setMinimum(INT_MIN); value_y->setMaximum(INT_MAX); - value_y->onValueChange([this](int _) { onChange.emit(this, getValue()); }); + value_y->onValueChange([this](const float& _) { onChange.emit(this, getValue()); }); l_width = tgui::Label::create("W"); setAlign(l_width); value_width = tgui::SpinControl::create(); value_width->setMaximum(INT_MAX); value_width->onValueChange( - [this](int _) { onChange.emit(this, getValue()); }); + [this](const float& _) { onChange.emit(this, getValue()); }); l_height = tgui::Label::create("H"); setAlign(l_height); value_height = tgui::SpinControl::create(); value_height->setMaximum(INT_MAX); value_height->onValueChange( - [this](int _) { onChange.emit(this, getValue()); }); + [this](const float& _) { onChange.emit(this, getValue()); }); m_container->add(label); diff --git a/src/winapi.cpp b/src/winapi.cpp index f61b3ce7..7d6873e2 100644 --- a/src/winapi.cpp +++ b/src/winapi.cpp @@ -1,21 +1,19 @@ +#include #include + #include #ifdef _WIN32 -#include #include -#include -#include - #endif #ifdef _WIN32 -char *WinReadFromHandle(HANDLE handle) { +char* WinReadFromHandle(HANDLE handle) { DWORD dwRead; - CHAR charBuf[4096]; + char* charBuf = new char[4096]; BOOL bSuccess = FALSE; for (;;) { @@ -30,6 +28,37 @@ char *WinReadFromHandle(HANDLE handle) { return charBuf; } +bool WinCreateDetachedExecutable(std::string path) { + BOOL creationResult; + STARTUPINFO startupInfo; + PROCESS_INFORMATION processInformation; + + ZeroMemory( &startupInfo, sizeof(startupInfo) ); + startupInfo.cb = sizeof(startupInfo); + ZeroMemory( &processInformation, sizeof(processInformation) ); + + creationResult = CreateProcess( + NULL, + path.data(), + NULL, + NULL, + FALSE, + CREATE_NEW_CONSOLE | CREATE_NEW_PROCESS_GROUP | CREATE_BREAKAWAY_FROM_JOB, + NULL, + NULL, + &startupInfo, + &processInformation + ); + + if (creationResult) { + CloseHandle(processInformation.hProcess); + CloseHandle(processInformation.hThread); + } + + return creationResult; +} + + bool WinOpenFileAssociate(std::string operation, std::string file) { printf("opening file with path %s (Win32)\n", file.c_str()); INT_PTR hInstance = (INT_PTR)ShellExecuteA( From bef1a54383c4265a4face21b5323c6fcc4712130 Mon Sep 17 00:00:00 2001 From: "D. Quan" <60545346+sudoker0@users.noreply.github.com> Date: Sun, 5 Apr 2026 15:25:02 +0700 Subject: [PATCH 06/69] Fix problem with theme restarting dialog when switching languages causes button to duplicate. --- resources/translations/vn.json | 6 +- .../childWindows/settingsPanel/general.cpp | 66 +++++++++---------- 2 files changed, 37 insertions(+), 35 deletions(-) diff --git a/resources/translations/vn.json b/resources/translations/vn.json index 1d7e0791..6d0d492b 100644 --- a/resources/translations/vn.json +++ b/resources/translations/vn.json @@ -37,7 +37,7 @@ "_label": "Chung", "language": "Ngôn ngữ", "theme": "Chủ đề", - "theme_notice": "Để áp dụng chủ đề mới, vui lòng khởi động lại phần mềm!" + "theme_notice": "Để áp dụng chủ đề, vui lòng khởi động lại phần mềm.\n Lưu ý rằng tiến trình chưa lưu sẽ bị mất nếu khởi động lại!" }, "hotkeys": { "_label": "Phím Tắt", @@ -138,6 +138,8 @@ }, "button": { - "go_back": "Quay lại" + "go_back": "Quay lại", + "restart": "Khởi động lại", + "restart_later": "Khởi động lại sau" } } diff --git a/src/editor/childWindows/settingsPanel/general.cpp b/src/editor/childWindows/settingsPanel/general.cpp index 15afe999..8bcdee96 100644 --- a/src/editor/childWindows/settingsPanel/general.cpp +++ b/src/editor/childWindows/settingsPanel/general.cpp @@ -5,11 +5,13 @@ #include #include +#include "TGUI/String.hpp" #include "TGUI/Widgets/ComboBox.hpp" #include "TGUI/Widgets/GrowVerticalLayout.hpp" #include "TGUI/Widgets/HorizontalLayout.hpp" #include "TGUI/Widgets/Label.hpp" #include "TGUI/Widgets/ScrollablePanel.hpp" +#include "childWindows/settingsPanel/base.hpp" #include "raylib.h" #include "winapi.hpp" @@ -80,54 +82,52 @@ SettingsPanelGeneral::SettingsPanelGeneral(tgui::TabContainer::Ptr tabContainer) themeSelector->setSelectedItem(theme.current_theme_name); + this->promptUserBox = tgui::MessageBox::create(""); + bindTranslation(this->promptUserBox, "screen.options.general.theme", &tgui::MessageBox::setTitle); + bindTranslation(promptUserBox, "screen.options.general.theme_notice", &tgui::MessageBox::setText); + bindCustomTranslation(this->promptUserBox, [&](std::shared_ptr box, TranslationService &ts) { + box->changeButtons(std::vector{ts.getKey("button.restart"), ts.getKey("button.restart_later")}); + }); + + this->promptUserBox->onButtonPress.connect([&](const tgui::String& text) { + if (text == ts.getKey("button.restart")) { + ChangeDirectory(GetApplicationDirectory()); + #ifdef __linux__ + + if (const FILE *handle = popen("./editor", "r"); handle == nullptr) { + fprintf(stderr, "failed to relaunch editor..\n"); + return; + } + #endif + + #ifdef _WIN32 + if (!WinCreateDetachedExecutable("editor.exe")) { + fprintf(stderr, "failed to relaunch editor..\n"); + return; + } + #endif + + exit(0); + } + Editor::instance->getGui().gui->remove(promptUserBox); + }); + + themeSelector->onItemSelect.connect([&](const tgui::String &item) { ConfigurationService &configService = Editor::instance->getConfiguration(); configService.setStringValue("theme", item.toStdString()); configService.saveConfiguration(); - if (this->promptUserBox == nullptr) { - this->promptUserBox = tgui::MessageBox::create(ts.getKey("screen.options.general.theme")); - bindTranslation(promptUserBox, "button.restart", &tgui::MessageBox::addButton); - bindTranslation(promptUserBox, "button.restart_later", &tgui::MessageBox::addButton); - } - - bindTranslation(promptUserBox, "screen.options.general.theme_notice", &tgui::MessageBox::setText); promptUserBox->setOrigin({0.5, 0.5}); promptUserBox->setPosition({"50%", "50%"}); - promptUserBox->onButtonPress.connect([&](const tgui::String& text) { - if (text == ts.getKey("button.restart")) { - ChangeDirectory(GetApplicationDirectory()); - #ifdef __linux__ - - if (const FILE *handle = popen("./editor", "r"); handle == nullptr) { - fprintf(stderr, "failed to relaunch editor..\n"); - return; - } - #endif - - #ifdef _WIN32 - if (!WinCreateDetachedExecutable("editor.exe")) { - fprintf(stderr, "failed to relaunch editor..\n"); - return; - } - #endif - - exit(0); - } - // Hide with an effect if nothing else is selected. - promptUserBox->hideWithEffect(tgui::ShowEffectType::Scale, ANIMATION_DURATION); - }); - Editor::instance->getGui().gui->add(promptUserBox); - promptUserBox->showWithEffect(tgui::ShowEffectType::Scale, ANIMATION_DURATION); }); themeLayout->add(themeLabel); themeLayout->add(themeSelector); - layout->add(languageLayout); layout->add(themeLayout); From a9f4968412486d216b70ae8d1d772ce7c8681f1b Mon Sep 17 00:00:00 2001 From: CDevv Date: Mon, 6 Apr 2026 13:31:47 +0300 Subject: [PATCH 07/69] Actors with Interactables --- include/actor.hpp | 17 ++- include/editor/roomLayerViewVisitor.hpp | 4 + include/editor/widgets/propertiesBox.hpp | 23 ++-- include/gamedata.hpp | 9 ++ include/interactable.hpp | 2 +- src/actor.cpp | 25 ++++ src/editor/project.cpp | 44 +++++++ src/editor/roomLayerViewVisitor.cpp | 86 +++++++++++-- src/editor/views/roomView.cpp | 18 ++- src/editor/widgets/propertiesBox.cpp | 66 +++++----- src/gamedata.cpp | 6 +- src/interactable.cpp | 47 ++++--- src/player.cpp | 77 ++++++------ src/room.cpp | 149 +++++++++++------------ xmake.lua | 12 +- 15 files changed, 379 insertions(+), 206 deletions(-) diff --git a/include/actor.hpp b/include/actor.hpp index d6c5d5b3..7f6d57f2 100644 --- a/include/actor.hpp +++ b/include/actor.hpp @@ -3,6 +3,7 @@ #include "atlasTile.hpp" #include "gamedata.hpp" +#include "interactable.hpp" #include "saveable.hpp" #include "tileset.hpp" #include @@ -55,6 +56,10 @@ class Actor : public ISaveable { Direction currentAnimation; Direction lastAnimation; bool tempAnimIsPlayed = false; + /** Whether this Actor has an Interactable. */ + bool ownsInteractable = false; + /** A smart pointer, owning an Interactable. */ + std::unique_ptr interactable; public: /** Empty constructor. */ @@ -114,6 +119,8 @@ class Actor : public ISaveable { /** Get the collision rectangle of this Actor if it was moved by the * velocity vector */ Rectangle getCollisionRect(Vector2 velocity) const; + /** Get the collision Rectangle of this Actor */ + Rectangle getCollisionRect() const; /** Get collision center point. */ Vector2 getCollisionCenter() const; /** Add a frame in the chosen animation. The frame represents an atlas tile @@ -139,10 +146,16 @@ class Actor : public ISaveable { std::array, 8> getAnimationsRaw() const; /** Get a specific animation */ std::vector getAnimationRaw(Direction id) const; - /** Get the collision Rectangle of this Actor */ - Rectangle getCollisionRect() const; /** Set the Actor's collision Rectangle */ void setCollisionRect(Rectangle rect); + /** Whether this Actor has an Interactable. */ + bool hasInteractable(); + /** Set the 'ownsInteractable' flag. */ + void setHasInteractable(bool value); + /** Get a pointer to this Actor's Interactable. */ + Interactable *getInteractable(); + /** Add an Interactable using an interactable file. */ + void setInteractableFromPath(const std::string& interPath); }; Vector2 calcActorTilePos(Vector2 newPosition, Vector2 worldTileSize, diff --git a/include/editor/roomLayerViewVisitor.hpp b/include/editor/roomLayerViewVisitor.hpp index 13b42980..fcfa5c66 100644 --- a/include/editor/roomLayerViewVisitor.hpp +++ b/include/editor/roomLayerViewVisitor.hpp @@ -24,6 +24,8 @@ class RoomLayerViewVisitor RoomTool tool; Interactable *inter{nullptr}; Prop *prop{nullptr}; + Actor *actor{nullptr}; + std::string actorName = ""; bool isAvailable = true; Texture2D propTexture{}; Texture2D actorTexture{}; @@ -40,6 +42,8 @@ class RoomLayerViewVisitor tgui::ComboBox::Ptr actorChoose; tgui::EditBox::Ptr actorNameInput; + void updateInteractableChoose(); + ~RoomLayerViewVisitor(); }; diff --git a/include/editor/widgets/propertiesBox.hpp b/include/editor/widgets/propertiesBox.hpp index d930519d..50ab84c7 100644 --- a/include/editor/widgets/propertiesBox.hpp +++ b/include/editor/widgets/propertiesBox.hpp @@ -1,6 +1,9 @@ #ifndef _RPGPP_PROPERTIESBOX_H #define _RPGPP_PROPERTIESBOX_H +#include +#include + #include "TGUI/String.hpp" #include "TGUI/Widget.hpp" #include "TGUI/Widgets/ChildWindow.hpp" @@ -11,33 +14,28 @@ #include "widgets/propertyFields/rectangleField.hpp" #include "widgets/propertyFields/selectField.hpp" #include "widgets/propertyFields/textField.hpp" -#include -#include class PropertiesBox : public tgui::ChildWindow { - protected: +protected: static const int GAP = 4; tgui::GrowVerticalLayout::Ptr layout; tgui::Widget::Ptr clone() const override; - public: +public: typedef std::shared_ptr Ptr; typedef std::shared_ptr ConstPtr; - PropertiesBox(const char *typeName = "PropertiesBox", - bool initRenderer = true); + PropertiesBox(const char *typeName = "PropertiesBox", bool initRenderer = true); static PropertiesBox::Ptr create(); static PropertiesBox::Ptr copy(PropertiesBox::ConstPtr widget); - void draw(tgui::BackendRenderTarget &target, - tgui::RenderStates states) const override; + void draw(tgui::BackendRenderTarget &target, tgui::RenderStates states) const override; - void addPropsJson(nlohmann::json &j); + void addPropsJson(nlohmann::json &j, bool clear = true); // void addToggleField(const tgui::String &title); - void addIntField(const tgui::String &title, int initialValue, - std::function callback); + void addIntField(const tgui::String &title, int initialValue, std::function callback); void addIntField(IntField::Ptr field); void addFileField(FileField::Ptr field); void addTextField(TextField::Ptr field); @@ -45,8 +43,7 @@ class PropertiesBox : public tgui::ChildWindow { void addRectangleField(RectangleField::Ptr field); void addSelectField(SelectField::Ptr field); void addButton(const tgui::String &title, std::function callback); - tgui::Button::Ptr constructButton(const tgui::String &title, - std::function callback); + tgui::Button::Ptr constructButton(const tgui::String &title, std::function callback); }; #endif diff --git a/include/gamedata.hpp b/include/gamedata.hpp index d450558a..d381df67 100644 --- a/include/gamedata.hpp +++ b/include/gamedata.hpp @@ -53,6 +53,8 @@ struct ActorInRoomBin { std::string name; std::string source; IVector tilePos; + std::string intType; + std::vector propsCbor; }; struct TileBin { @@ -93,6 +95,12 @@ struct TileSetBin { int dataSize; }; +struct FontBin { + std::vector data; + int dataSize; + std::string ext; +}; + struct ImageBin { std::vector data; int dataSize; @@ -135,6 +143,7 @@ struct GameBinSettings { struct GameData { std::string title; + std::map fonts; std::map images; std::map tilesets; std::map interactables; diff --git a/include/interactable.hpp b/include/interactable.hpp index cdd24dab..81da500d 100644 --- a/include/interactable.hpp +++ b/include/interactable.hpp @@ -40,7 +40,7 @@ class Interactable : public ISaveable { public: /** Empty constructor */ Interactable(); - /** COnstructor using a JSON file. */ + /** Constructor using a JSON file. */ Interactable(const std::string &path); /** Construct from type name */ Interactable(const std::string &type, Vector2 tilePos, int tileSize); diff --git a/src/actor.cpp b/src/actor.cpp index 4bb39e98..e3911ada 100644 --- a/src/actor.cpp +++ b/src/actor.cpp @@ -1,6 +1,7 @@ #include "actor.hpp" #include "game.hpp" #include "gamedata.hpp" +#include "interactable.hpp" #include "tileset.hpp" #include #include @@ -40,6 +41,8 @@ Actor::Actor(const std::string &fileName) { this->tileSetSource = j.at("tileset"); this->tileSet = std::make_unique(tileSetSource); + this->interactable = std::make_unique(); + for (int i = 0; i < 8; i++) { animations[i] = std::vector(); } @@ -88,6 +91,8 @@ Actor::Actor(std::unique_ptr tileSet, Vector2 atlasPos, this->currentFrame = 0; this->currentAnimation = RPGPP_DOWN_IDLE; + this->interactable = std::make_unique(); + for (int i = 0; i < 8; i++) { animations[i] = std::vector(); } @@ -139,6 +144,9 @@ Actor::Actor(const ActorBin &bin) { static_cast(bin.collision.width), static_cast(bin.collision.height)}; + // interactable + this->interactable = std::make_unique(); + // animations for (int i = 0; i < 8; i++) { animations[i] = std::vector(); @@ -480,3 +488,20 @@ Vector2 calcActorTilePos(Vector2 newPosition, Vector2 worldTileSize, (worldTileSize.y * RPGPP_DRAW_MULTIPLIER))}; return resultVector; } + +bool Actor::hasInteractable() { + return ownsInteractable; +} + +void Actor::setHasInteractable(bool value) { + ownsInteractable = value; +} + +Interactable *Actor::getInteractable() { + return interactable.get(); +} + +void Actor::setInteractableFromPath(const std::string& path) { + interactable = std::make_unique(path); + ownsInteractable = true; +} diff --git a/src/editor/project.cpp b/src/editor/project.cpp index 59e8aab8..4c61504b 100644 --- a/src/editor/project.cpp +++ b/src/editor/project.cpp @@ -71,10 +71,33 @@ std::string Project::create(const std::string &dirPath, filePath /= "proj.rpgpp"; SaveFileText(filePath.u8string().c_str(), fileContent.c_str()); + /* MakeDirectory( std::filesystem::path(dirPath).append("tilesets").u8string().c_str()); MakeDirectory( std::filesystem::path(dirPath).append("maps").u8string().c_str()); + MakeDirectory( + std::filesystem::path(dirPath).append("actors").u8string().c_str()); + MakeDirectory( + std::filesystem::path(dirPath).append("dialogue").u8string().c_str()); + MakeDirectory( + std::filesystem::path(dirPath).append("scripts").u8string().c_str()); + MakeDirectory( + std::filesystem::path(dirPath).append("props").u8string().c_str()); + MakeDirectory( + std::filesystem::path(dirPath).append("images").u8string().c_str()); + MakeDirectory( + std::filesystem::path(dirPath).append("fonts").u8string().c_str()); + */ + + for (int i = 0; i < FILETYPE_MAX; i++) { + EngineFileType fileType = static_cast(i); + + std::string dirName = TextToLower(Editor::instance->getFs().getTypeName(fileType).c_str()); + + MakeDirectory( + std::filesystem::path(dirPath).append(dirPath).u8string().c_str()); + } return filePath.u8string(); } @@ -263,6 +286,13 @@ GameData Project::generateStruct() { aBin.tilePos = IVector{static_cast(actor->getTilePosition().x), static_cast(actor->getTilePosition().y)}; + + if (actor->hasInteractable()) { + aBin.intType = actor->getInteractable()->getType(); + aBin.propsCbor = nlohmann::json::to_cbor(actor->getInteractable()->getProps()); + } else { + aBin.intType = ""; + } roomBin.actors.push_back(aBin); } roomBin.musicSource = room->getMusicSource(); @@ -328,6 +358,20 @@ GameData Project::generateStruct() { } for (auto fontPath : getPaths(EngineFileType::FILE_FONT)) { + FontBin fontBin; + + int dataSize = 0; + auto fileData = LoadFileData(fontPath.c_str(), &dataSize); + + for (int i = 0; i < dataSize; i++) { + fontBin.data.push_back(fileData[i]); + } + + fontBin.ext = GetFileExtension(fontPath.c_str()); + + data.fonts[GetFileNameWithoutExt(fontPath.c_str())] = fontBin; + + UnloadFileData(fileData); } for (auto soundPath : getPaths(EngineFileType::FILE_SOUND)) { diff --git a/src/editor/roomLayerViewVisitor.cpp b/src/editor/roomLayerViewVisitor.cpp index 6c17b0fe..51a1a4c4 100644 --- a/src/editor/roomLayerViewVisitor.cpp +++ b/src/editor/roomLayerViewVisitor.cpp @@ -11,6 +11,7 @@ #include "TGUI/Widgets/Label.hpp" #include "actor.hpp" #include "editor.hpp" +#include "interactable.hpp" #include "services/fileSystemService.hpp" #include "views/worldView.hpp" #include "widgets/propertiesBox.hpp" @@ -20,6 +21,7 @@ RoomLayerViewVisitor::RoomLayerViewVisitor() { tileSetView->setSize({"100%", "100%"}); interactableChoose = tgui::ComboBox::create(); + interactableChoose->setPosition(8, 32); interactableChoose->setDefaultText("Dialogue"); propChoose = tgui::ComboBox::create(); @@ -61,6 +63,16 @@ RoomLayerViewVisitor::~RoomLayerViewVisitor() { } } +void RoomLayerViewVisitor::updateInteractableChoose() { + interactableChoose->onItemSelect.disconnectAll(); + interactableChoose->removeAllItems(); + auto map = Editor::instance->getProject()->getInteractableNames(); + for (auto &[key, val] : map) { + interactableChoose->addItem(val, key.c_str()); + } + interactableChoose->setSelectedItemByIndex(0); +} + void RoomLayerViewVisitor::operator()(enum_v) { isAvailable = true; group->add(tileSetView); @@ -73,15 +85,9 @@ void RoomLayerViewVisitor::operator()(enum_v) { void RoomLayerViewVisitor::operator()(enum_v) { isAvailable = true; + updateInteractableChoose(); if (tool == RoomTool::TOOL_PLACE) { - interactableChoose->removeAllItems(); - auto map = Editor::instance->getProject()->getInteractableNames(); - for (auto &[key, val] : map) { - interactableChoose->addItem(val, key.c_str()); - } - interactableChoose->setSelectedItemByIndex(0); - group->add(tgui::Label::create("Interactables")); group->add(interactableChoose); @@ -109,6 +115,7 @@ void RoomLayerViewVisitor::operator()(enum_v) { void RoomLayerViewVisitor::operator()(enum_v) { isAvailable = true; + updateInteractableChoose(); if (tool == RoomTool::TOOL_PLACE) { group->add(tgui::Label::create("Props")); @@ -147,6 +154,8 @@ void RoomLayerViewVisitor::operator()(enum_v) { } void RoomLayerViewVisitor::operator()(enum_v) { + updateInteractableChoose(); + if (tool == RoomTool::TOOL_PLACE) { group->add(tgui::Label::create("Actors")); @@ -167,5 +176,68 @@ void RoomLayerViewVisitor::operator()(enum_v) { group->add(actorChoose); } else if (tool == RoomTool::TOOL_ERASE) { group->add(tgui::Label::create("Erase an Actor..")); + } else if (tool == RoomTool::TOOL_EDIT) { + if (actor == nullptr) { + group->add(tgui::Label::create("Actor does not exist at this position.")); + } else { + interactableChoose->setPosition(8, 64); + + interactableChoose->onItemSelect([this](const tgui::String &item) { + auto id = interactableChoose->getSelectedItemId(); + printf("%s: %s \n", item.toStdString().c_str(), id.toStdString().c_str()); + + actor->setInteractableFromPath(id.toStdString()); + }); + + group->add(tgui::Label::create(TextFormat("Editing \"%s\"", actorName.c_str()))); + + group->add(interactableChoose); + + interactableChoose->setDefaultText(""); + + auto hasInteractableCheck = tgui::CheckBox::create("Has Interactable?"); + hasInteractableCheck->setSize(16, 16); + hasInteractableCheck->setPosition(8, 32); + + auto propBox = PropertiesBox::create(); + propBox->setPosition(0, 84); + propBox->setSize("100%", "100% - 84"); + group->add(propBox); + + if (actor->hasInteractable()) { + auto intsMap = Editor::instance->getProject()->getInteractableNames(); + for (auto &[key, val] : intsMap) { + std::string lowerTypeName = TextToLower(val.c_str()); + if (lowerTypeName == actor->getInteractable()->getType()) { + interactableChoose->setSelectedItemById(key); + } + } + propBox->addPropsJson(actor->getInteractable()->getProps()); + interactableChoose->setVisible(true); + hasInteractableCheck->setChecked(true); + } else { + interactableChoose->setVisible(false); + hasInteractableCheck->setChecked(false); + } + + std::weak_ptr weakPropsBox = propBox; + hasInteractableCheck->onChange([this, weakPropsBox](bool value) { + interactableChoose->setVisible(value); + if (!weakPropsBox.expired()) { + weakPropsBox.lock()->setVisible(value); + } + if (value) { + interactableChoose->setSelectedItemByIndex(0); + actor->setInteractableFromPath(interactableChoose->getSelectedItemId().toStdString()); + if (!weakPropsBox.expired()) { + weakPropsBox.lock()->addPropsJson(actor->getInteractable()->getProps()); + } + } else { + actor->setHasInteractable(false); + } + }); + + group->add(hasInteractableCheck); + } } } diff --git a/src/editor/views/roomView.cpp b/src/editor/views/roomView.cpp index 1a1f058f..d6a84fdb 100644 --- a/src/editor/views/roomView.cpp +++ b/src/editor/views/roomView.cpp @@ -21,6 +21,7 @@ #include "gamedata.hpp" #include "interactable.hpp" #include "raylib.h" +#include "raymath.h" #include "room.hpp" #include "screens/projectScreen.hpp" #include "tile.hpp" @@ -450,7 +451,22 @@ void RoomView::handleEditPress(tgui::Vector2f pos) { layerVisitor->group->removeAllWidgets(); mj::visit(*layerVisitor, layer); - } + } break; + case RoomLayer::LAYER_ACTORS: { + IVector tileMouse = getTileAtMouse(); + + layerVisitor->actor = nullptr; + layerVisitor->actorName = ""; + for (auto &[name, actor] : room->getActors().getActors()) { + if (Vector2Equals(actor->getTilePosition(), fromIVector(tileMouse))) { + layerVisitor->actor = actor.get(); + layerVisitor->actorName = name; + } + } + + layerVisitor->group->removeAllWidgets(); + mj::visit(*layerVisitor, layer); + } break; default: break; } diff --git a/src/editor/widgets/propertiesBox.cpp b/src/editor/widgets/propertiesBox.cpp index 34f15c7b..af2e6695 100644 --- a/src/editor/widgets/propertiesBox.cpp +++ b/src/editor/widgets/propertiesBox.cpp @@ -1,4 +1,10 @@ #include "widgets/propertiesBox.hpp" + +#include + +#include +#include + #include "TGUI/String.hpp" #include "TGUI/Widget.hpp" #include "TGUI/Widgets/Button.hpp" @@ -13,12 +19,8 @@ #include "widgets/propertyFields/rectangleField.hpp" #include "widgets/propertyFields/selectField.hpp" #include "widgets/propertyFields/textField.hpp" -#include -#include -#include -PropertiesBox::PropertiesBox(const char *typeName, bool initRenderer) - : tgui::ChildWindow(typeName, initRenderer) { +PropertiesBox::PropertiesBox(const char *typeName, bool initRenderer) : tgui::ChildWindow(typeName, initRenderer) { this->setTitle("Props"); this->setTitleButtons(tgui::ChildWindow::TitleButton::None); auto vertLayout = tgui::GrowVerticalLayout::create(); @@ -27,9 +29,7 @@ PropertiesBox::PropertiesBox(const char *typeName, bool initRenderer) this->layout = vertLayout; } -PropertiesBox::Ptr PropertiesBox::create() { - return std::make_shared(); -} +PropertiesBox::Ptr PropertiesBox::create() { return std::make_shared(); } PropertiesBox::Ptr PropertiesBox::copy(PropertiesBox::ConstPtr widget) { if (widget) { @@ -39,16 +39,17 @@ PropertiesBox::Ptr PropertiesBox::copy(PropertiesBox::ConstPtr widget) { } } -tgui::Widget::Ptr PropertiesBox::clone() const { - return std::make_shared(*this); -} +tgui::Widget::Ptr PropertiesBox::clone() const { return std::make_shared(*this); } -void PropertiesBox::draw(tgui::BackendRenderTarget &target, - tgui::RenderStates states) const { +void PropertiesBox::draw(tgui::BackendRenderTarget &target, tgui::RenderStates states) const { tgui::ChildWindow::draw(target, states); } -void PropertiesBox::addPropsJson(nlohmann::json &j) { +void PropertiesBox::addPropsJson(nlohmann::json &j, bool clear) { + if (clear) { + layout->removeAllWidgets(); + } + for (auto item : j.items()) { printf("%s \n", item.key().c_str()); if (item.value().is_string()) { @@ -57,27 +58,24 @@ void PropertiesBox::addPropsJson(nlohmann::json &j) { auto textField = TextField::create(); textField->label->setText(item.key()); textField->value->setText(item.value().get()); - textField->value->onTextChange( - [&j, item](const tgui::String &text) { - std::string st = text.toStdString(); - j.at(item.key()) = st; - }); + textField->value->onTextChange([&j, item](const tgui::String &text) { + std::string st = text.toStdString(); + j.at(item.key()) = st; + }); addTextField(textField); } if (item.value().is_number()) { auto intField = IntField::create(); intField->label->setText(item.key()); intField->value->setValue(item.value().get()); - intField->value->onValueChange( - [&j, item](float value) { j.at(item.key()) = value; }); + intField->value->onValueChange([&j, item](float value) { j.at(item.key()) = value; }); addIntField(intField); } if (item.value().is_boolean()) { auto boolField = BoolField::create(); boolField->label->setText(item.key()); boolField->value->setChecked(item.value().get()); - boolField->value->onChange( - [&j, item](bool checked) { j.at(item.key()) = checked; }); + boolField->value->onChange([&j, item](bool checked) { j.at(item.key()) = checked; }); addBooleanField(boolField); } if (item.value().is_object()) { @@ -86,17 +84,13 @@ void PropertiesBox::addPropsJson(nlohmann::json &j) { auto fileField = FileField::create(); fileField->label->setText(item.key()); - fileField->value->setText( - item.value().at("value").get()); - fileField->callback = [&j, item, - this](const tgui::String &filePath) { + fileField->value->setText(item.value().at("value").get()); + fileField->callback = [&j, item, this](const tgui::String &filePath) { printf("%s \n", filePath.toStdString().c_str()); - printf("%s \n", GetFileNameWithoutExt( - filePath.toStdString().c_str())); + printf("%s \n", GetFileNameWithoutExt(filePath.toStdString().c_str())); auto &ref = j.at(item.key()); - ref.at("value") = - GetFileNameWithoutExt(filePath.toStdString().c_str()); + ref.at("value") = GetFileNameWithoutExt(filePath.toStdString().c_str()); }; if (propType == "dialogue") { @@ -109,9 +103,7 @@ void PropertiesBox::addPropsJson(nlohmann::json &j) { } } -tgui::Button::Ptr -PropertiesBox::constructButton(const tgui::String &title, - std::function callback) { +tgui::Button::Ptr PropertiesBox::constructButton(const tgui::String &title, std::function callback) { auto button = tgui::Button::create(title); button->setSize(TextFormat("100%% - %d", PADDING * 2), 24); button->setPosition({PADDING, 0}); @@ -122,13 +114,11 @@ PropertiesBox::constructButton(const tgui::String &title, return button; } -void PropertiesBox::addButton(const tgui::String &title, - std::function callback) { +void PropertiesBox::addButton(const tgui::String &title, std::function callback) { this->constructButton(title, callback); } -void PropertiesBox::addIntField(const tgui::String &title, int initialValue, - std::function callback) { +void PropertiesBox::addIntField(const tgui::String &title, int initialValue, std::function callback) { auto group = tgui::Group::create({"100%", 24}); auto label = tgui::Label::create(title); diff --git a/src/gamedata.cpp b/src/gamedata.cpp index 21de4833..a6342cf5 100644 --- a/src/gamedata.cpp +++ b/src/gamedata.cpp @@ -20,7 +20,7 @@ template void serialize(Archive &a, ActorBin &b) { } template void serialize(Archive &a, ActorInRoomBin &b) { - a(b.name, b.source, b.tilePos); + a(b.name, b.source, b.tilePos, b.intType, b.propsCbor); } template void serialize(Archive &a, TileBin &b) { @@ -43,6 +43,10 @@ template void serialize(Archive &a, TileSetBin &b) { a(b.name, b.extension, b.tileSize, b.image, b.dataSize); } +template void serialize(Archive &a, FontBin &b) { + a(b.data, b.dataSize, b.ext); +} + template void serialize(Archive &a, ImageBin &b) { a(b.data, b.dataSize, b.ext); } diff --git a/src/interactable.cpp b/src/interactable.cpp index f2b61416..f01980dc 100644 --- a/src/interactable.cpp +++ b/src/interactable.cpp @@ -1,4 +1,13 @@ #include "interactable.hpp" + +#include +#include + +#include +#include +#include +#include + #include "actor.hpp" #include "game.hpp" #include "gamedata.hpp" @@ -8,15 +17,8 @@ #include "sol/state_handling.hpp" #include "sol/types.hpp" #include "tilemap.hpp" -#include -#include -#include -#include -#include -#include -Interactable::Interactable() - : type(), tilePos(), tileSize(0), absolutePos(), rect() { +Interactable::Interactable() : type(), tilePos(), tileSize(0), absolutePos(), rect() { this->valid = false; this->onTouch = false; } @@ -33,8 +35,7 @@ Interactable::Interactable(const std::string &path) { onTouch = false; } -Interactable::Interactable(const std::string &type, Vector2 tilePos, - int tileSize) { +Interactable::Interactable(const std::string &type, Vector2 tilePos, int tileSize) { this->type = type; this->props = std::make_unique(json::object()); @@ -45,15 +46,13 @@ Interactable::Interactable(const std::string &type, Vector2 tilePos, this->tileSize = tileSize; this->absolutePos = Vector2{0, 0}; - rect = - Rectangle{tilePos.x * tileSize, tilePos.y * tileSize, - static_cast(tileSize), static_cast(tileSize)}; + rect = Rectangle{tilePos.x * tileSize, tilePos.y * tileSize, static_cast(tileSize), + static_cast(tileSize)}; } Interactable::Interactable(InteractableInRoomBin bin) { this->type = bin.type; - this->props = - std::make_unique(json::from_cbor(bin.propsCbor)); + this->props = std::make_unique(json::from_cbor(bin.propsCbor)); Vector2 tilePos = {static_cast(bin.x), static_cast(bin.y)}; @@ -63,9 +62,8 @@ Interactable::Interactable(InteractableInRoomBin bin) { this->tileSize = _RPGPP_TILESIZE; this->absolutePos = Vector2{0, 0}; - rect = - Rectangle{tilePos.x * tileSize, tilePos.y * tileSize, - static_cast(tileSize), static_cast(tileSize)}; + rect = Rectangle{tilePos.x * tileSize, tilePos.y * tileSize, static_cast(tileSize), + static_cast(tileSize)}; } json Interactable::dumpJson() { @@ -94,21 +92,22 @@ void Interactable::setType(const std::string &type) { this->props = std::make_unique(json::object()); } -void Interactable::setProps(nlohmann::json j) { - this->props = std::make_unique(j); -} +void Interactable::setProps(nlohmann::json j) { this->props = std::make_unique(j); } nlohmann::json &Interactable::getProps() { return *props; } const std::string &Interactable::getScriptSourcePath() { return scriptPath; } -void Interactable::setDisplayTitle(const std::string &newTitle) { - displayTitle = newTitle; -} +void Interactable::setDisplayTitle(const std::string &newTitle) { displayTitle = newTitle; } std::string &Interactable::getDisplayTitle() { return displayTitle; } void Interactable::interact() { + if (type.empty()) { + printf("%s \n", "Warning: This Interactable's type is empty."); + return; + } + auto &state = Game::getScripts().getState(); Game::getScripts().addToState(*props); diff --git a/src/player.cpp b/src/player.cpp index e99d4fad..fb263d60 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -1,10 +1,13 @@ #include "player.hpp" -#include "conversion.hpp" -#include "interactable.hpp" + #include #include + #include +#include "conversion.hpp" +#include "interactable.hpp" + Player::Player(std::unique_ptr actor, Room &room) : room(room) { this->lock = false; this->position = Vector2{0, 0}; @@ -13,8 +16,7 @@ Player::Player(std::unique_ptr actor, Room &room) : room(room) { Rectangle collisionRect = actor->getCollisionRect(Vector2{0, 0}); this->interactableArea = - Rectangle{collisionRect.x - 6, collisionRect.y - 6, - collisionRect.width + 12, collisionRect.height + 12}; + Rectangle{collisionRect.x - 6, collisionRect.y - 6, collisionRect.width + 12, collisionRect.height + 12}; this->actor = std::move(actor); this->idleDirection = RPGPP_DOWN_IDLE; @@ -28,8 +30,7 @@ void Player::unload() const { actor->unload(); } void Player::update() { Rectangle collisionRect = actor->getCollisionRect(Vector2{0, 0}); this->interactableArea = - Rectangle{collisionRect.x - 6, collisionRect.y - 6, - collisionRect.width + 12, collisionRect.height + 12}; + Rectangle{collisionRect.x - 6, collisionRect.y - 6, collisionRect.width + 12, collisionRect.height + 12}; int change = 2; velocity = Vector2{0, 0}; @@ -58,11 +59,9 @@ void Player::update() { this->handleInteraction(); } - if (!lock) - this->handleCollision(); + if (!lock) this->handleCollision(); - if (lock) - return; + if (lock) return; if (!actor->isTempAnimationPlaying()) { if (Vector2Equals(velocity, Vector2{0, 0})) { @@ -88,8 +87,7 @@ void Player::draw() const { } void Player::handleCollision() { - if (actor == nullptr) - return; + if (actor == nullptr) return; Rectangle playerRect = actor->getCollisionRect(velocity); @@ -99,8 +97,7 @@ void Player::handleCollision() { // collision tiles for (auto &[pos, obj] : room.getCollisions().getObjects()) { Vector2 v = fromIVector(pos); - Rectangle tileRect = Rectangle{v.x * worldTileSize, v.y * worldTileSize, - static_cast(worldTileSize), + Rectangle tileRect = Rectangle{v.x * worldTileSize, v.y * worldTileSize, static_cast(worldTileSize), static_cast(worldTileSize)}; if (CheckCollisionRecs(playerRect, tileRect)) { @@ -117,15 +114,21 @@ void Player::handleCollision() { } } + // actors + for (auto &[name, actor] : room.getActors().getActors()) { + if (CheckCollisionRecs(playerRect, actor->getCollisionRect(Vector2{0, 0}))) { + velocity = Vector2{0, 0}; + break; + } + } + // interactable tiles - std::vector interactableTiles = - this->room.getInteractables().getList(); + std::vector interactableTiles = this->room.getInteractables().getList(); for (Interactable *interactable : interactableTiles) { Rectangle tileRect = Rectangle{interactable->getWorldPos().x * room.getWorldTileSize(), interactable->getWorldPos().y * room.getWorldTileSize(), - static_cast(room.getWorldTileSize()), - static_cast(room.getWorldTileSize())}; + static_cast(room.getWorldTileSize()), static_cast(room.getWorldTileSize())}; if (CheckCollisionRecs(playerRect, tileRect)) { velocity = Vector2{0, 0}; @@ -144,14 +147,12 @@ void Player::handleCollision() { } void Player::handleInteraction() { - std::vector interactableTiles = - this->room.getInteractables().getList(); + std::vector interactableTiles = this->room.getInteractables().getList(); for (Interactable *interactable : interactableTiles) { Rectangle tileRect = Rectangle{interactable->getWorldPos().x * room.getWorldTileSize(), interactable->getWorldPos().y * room.getWorldTileSize(), - static_cast(room.getWorldTileSize()), - static_cast(room.getWorldTileSize())}; + static_cast(room.getWorldTileSize()), static_cast(room.getWorldTileSize())}; if (CheckCollisionRecs(interactableArea, tileRect)) { if (interactable->getType() == "warper") { @@ -167,13 +168,21 @@ void Player::handleInteraction() { for (auto &[pos, prop] : room.getProps().getObjects()) { if (prop->getHasInteractable()) { - if (CheckCollisionRecs(interactableArea, - prop->getWorldCollisionRect())) { + if (CheckCollisionRecs(interactableArea, prop->getWorldCollisionRect())) { prop->getInteractable()->interact(); break; } } } + + for (auto &[name, actor] : room.getActors().getActors()) { + if (actor->hasInteractable()) { + if (CheckCollisionRecs(interactableArea, actor->getCollisionRect(Vector2{0, 0}))) { + actor->getInteractable()->interact(); + break; + } + } + } } void Player::setRoom(Room &room) const { @@ -190,8 +199,7 @@ void Player::moveByVelocity(Vector2 velocity) { } Vector2 Player::getPosition() const { - if (actor == nullptr) - return Vector2{0, 0}; + if (actor == nullptr) return Vector2{0, 0}; return actor->getPosition(); } @@ -202,29 +210,24 @@ void Player::setPosition(Vector2 pos) { } Vector2 Player::getCenterPosition() const { - if (actor == nullptr) - return Vector2{0, 0}; + if (actor == nullptr) return Vector2{0, 0}; Rectangle actorRect = actor->getRect(); - return Vector2{actorRect.x + (actorRect.width / 2), - actorRect.y + (actorRect.height / 2)}; + return Vector2{actorRect.x + (actorRect.width / 2), actorRect.y + (actorRect.height / 2)}; } Vector2 Player::getTilePosition() const { return actor->getTilePosition(); } void Player::setTilePosition(Vector2 tilePos) { if (!room.getTileMap()->worldPosIsValid(tilePos)) { - throw std::runtime_error(TextFormat( - "This world tile position does not exist: %i, %i", - static_cast(tilePos.x), static_cast(tilePos.y))); + throw std::runtime_error(TextFormat("This world tile position does not exist: %i, %i", + static_cast(tilePos.x), static_cast(tilePos.y))); } - actor->setTilePosition(tilePos, - room.getTileMap()->getTileSet()->getTileSize()); + actor->setTilePosition(tilePos, room.getTileMap()->getTileSet()->getTileSize()); } Vector2 Player::getCollisionPos() const { - if (actor == nullptr) - return Vector2{0, 0}; + if (actor == nullptr) return Vector2{0, 0}; return actor->getCollisionCenter(); } diff --git a/src/room.cpp b/src/room.cpp index 170c8d8e..7963dbe7 100644 --- a/src/room.cpp +++ b/src/room.cpp @@ -1,4 +1,14 @@ #include "room.hpp" + +#include + +#include +#include +#include +#include +#include +#include + #include "actor.hpp" #include "actorContainer.hpp" #include "collisionsContainer.hpp" @@ -10,13 +20,6 @@ #include "prop.hpp" #include "propsContainer.hpp" #include "tilemap.hpp" -#include -#include -#include -#include -#include -#include -#include using json = nlohmann::json; @@ -58,8 +61,7 @@ Room::Room(const std::string &fileName, int tileSize) { UnloadFileText(jsonString); std::vector startPosVec = roomJson.at("start_pos"); - startTile = Vector2{static_cast(startPosVec[0]), - static_cast(startPosVec[1])}; + startTile = Vector2{static_cast(startPosVec[0]), static_cast(startPosVec[1])}; this->interactables = std::make_unique(); this->collisions = std::make_unique(); @@ -68,8 +70,7 @@ Room::Room(const std::string &fileName, int tileSize) { this->tileMap = std::make_unique(fileName); auto actor = std::make_unique(DEFAULT_PLAYER_PATH); - actor->setTilePosition(Vector2{startTile.x, startTile.y}, - tileMap->getTileSet()->getTileSize()); + actor->setTilePosition(Vector2{startTile.x, startTile.y}, tileMap->getTileSet()->getTileSize()); auto initialPlayer = std::make_unique(std::move(actor), *this); this->addPlayer(std::move(initialPlayer)); @@ -82,21 +83,17 @@ Room::Room(const std::string &fileName, int tileSize) { collisions->pushObject({x, y}, false); } - std::map> propsVec = - roomJson.at("props"); + std::map> propsVec = roomJson.at("props"); for (auto const &[key, value] : propsVec) { int count = 0; char **textSplit = TextSplit(key.c_str(), ';', &count); - if (count != 2) - return; + if (count != 2) return; int x = std::stoi(std::string(textSplit[0])); int y = std::stoi(std::string(textSplit[1])); auto propVec = value; auto p = std::make_unique(propVec.at("src")); - p->setWorldTilePos( - Vector2{static_cast(x), static_cast(y)}, - worldTileSize); + p->setWorldTilePos(Vector2{static_cast(x), static_cast(y)}, worldTileSize); p->getInteractable()->setProps(propVec.at("props")); @@ -107,15 +104,23 @@ Room::Room(const std::string &fileName, int tileSize) { for (auto const &[key, value] : actorsVec) { int count = 0; char **textSplit = TextSplit(key.c_str(), ';', &count); - if (count != 2) - return; + if (count != 2) return; int x = std::stoi(std::string(textSplit[0])); int y = std::stoi(std::string(textSplit[1])); auto a = std::make_unique(value.at("source")); - a->setTilePosition( - Vector2{static_cast(x), static_cast(y)}, - tileMap->getTileSet()->getTileSize()); + a->setTilePosition(Vector2{static_cast(x), static_cast(y)}, tileMap->getTileSet()->getTileSize()); + + std::string intType = value.at("intType"); + + if (intType.empty()) { + a->setHasInteractable(false); + } else { + a->setHasInteractable(true); + a->getInteractable()->setType(intType); + a->getInteractable()->setProps(value.at("props")); + } + actors->getActors()[value.at("name")] = std::move(a); } @@ -124,9 +129,7 @@ Room::Room(const std::string &fileName, int tileSize) { musicSource = roomJson.at("music_source"); } -Room::Room(std::unique_ptr tileMap) : Room() { - this->tileMap = std::move(tileMap); -} +Room::Room(std::unique_ptr tileMap) : Room() { this->tileMap = std::move(tileMap); } Room::Room(const RoomBin &bin) : Room() { this->worldTileSize = 48; @@ -141,8 +144,7 @@ Room::Room(const RoomBin &bin) : Room() { auto &actorBin = Game::getBin().actors["playerActor"]; auto actor = std::make_unique(actorBin); - actor->setTilePosition(Vector2{static_cast(bin.startPoint.x), - static_cast(bin.startPoint.y)}, + actor->setTilePosition(Vector2{static_cast(bin.startPoint.x), static_cast(bin.startPoint.y)}, tileMap->getTileSet()->getTileSize()); printf("%s \n", actor->getSourcePath().c_str()); auto initialPlayer = std::make_unique(std::move(actor), *this); @@ -157,18 +159,15 @@ Room::Room(const RoomBin &bin) : Room() { for (auto const &propSource : bin.props) { for (auto const &propBin : Game::getBin().props) { - std::string actualSource = - GetFileNameWithoutExt(propSource.name.c_str()); + std::string actualSource = GetFileNameWithoutExt(propSource.name.c_str()); printf("%s ; %s \n", propBin.name.c_str(), actualSource.c_str()); if (propBin.name == actualSource) { printf("c \n"); auto p = std::make_unique(propBin); p->setWorldTilePos( - Vector2{static_cast(propSource.tilePos.x), - static_cast(propSource.tilePos.y)}, + Vector2{static_cast(propSource.tilePos.x), static_cast(propSource.tilePos.y)}, worldTileSize); - p->getInteractable()->setProps( - nlohmann::json::from_cbor(propSource.propsCbor)); + p->getInteractable()->setProps(nlohmann::json::from_cbor(propSource.propsCbor)); // addProp(std::move(*p)); @@ -180,14 +179,17 @@ Room::Room(const RoomBin &bin) : Room() { for (const auto &actorSource : bin.actors) { for (const auto [name, actorBin] : Game::getBin().actors) { - std::string sourceFileName = - GetFileName(actorSource.source.c_str()); + std::string sourceFileName = GetFileName(actorSource.source.c_str()); if (actorBin.name == sourceFileName) { auto a = std::make_unique(actorBin); a->setTilePosition( - Vector2{static_cast(actorSource.tilePos.x), - static_cast(actorSource.tilePos.y)}, + Vector2{static_cast(actorSource.tilePos.x), static_cast(actorSource.tilePos.y)}, tileMap->getTileSet()->getTileSize()); + if (!actorSource.intType.empty()) { + a->setHasInteractable(true); + a->getInteractable()->setType(actorSource.intType); + a->getInteractable()->setProps(nlohmann::json::from_cbor(actorSource.propsCbor)); + } actors->getActors()[actorSource.name] = std::move(a); break; } @@ -224,13 +226,11 @@ json Room::dumpJson() { auto propsMap = std::map{}; for (auto &[pos, prop] : props->getObjects()) { - std::string key = - TextFormat("%i;%i", static_cast(prop->getWorldTilePos().x), - static_cast(prop->getWorldTilePos().y)); + std::string key = TextFormat("%i;%i", static_cast(prop->getWorldTilePos().x), + static_cast(prop->getWorldTilePos().y)); auto propJson = json::object(); - propJson["src"] = - TextFormat("props/%s", GetFileName(prop->getSourcePath().c_str())); + propJson["src"] = TextFormat("props/%s", GetFileName(prop->getSourcePath().c_str())); if (prop->getHasInteractable()) { propJson["props"] = prop->getInteractable()->getProps(); @@ -244,13 +244,18 @@ json Room::dumpJson() { auto actorsMap = std::map{}; for (auto &[name, obj] : actors->getActors()) { std::string key = - TextFormat("%i;%i", static_cast(obj->getTilePosition().x), - static_cast(obj->getTilePosition().y)); + TextFormat("%i;%i", static_cast(obj->getTilePosition().x), static_cast(obj->getTilePosition().y)); auto actorInfo = std::map{}; - actorInfo["source"] = - TextFormat("actors/%s", GetFileName(obj->getSourcePath().c_str())); + actorInfo["source"] = TextFormat("actors/%s", GetFileName(obj->getSourcePath().c_str())); actorInfo["name"] = name; + if (obj->hasInteractable()) { + actorInfo["intType"] = obj->getInteractable()->getType(); + actorInfo["props"] = obj->getInteractable()->getProps(); + } else { + actorInfo["intType"] = ""; + actorInfo["props"] = json::object(); + } actorsMap[key] = actorInfo; } @@ -259,9 +264,7 @@ json Room::dumpJson() { roomJson.push_back({"props", propsMap}); roomJson.push_back({"actors", actorsMap}); roomJson.push_back({"music_source", musicSource}); - roomJson.push_back( - {"start_pos", - {static_cast(startTile.x), static_cast(startTile.y)}}); + roomJson.push_back({"start_pos", {static_cast(startTile.x), static_cast(startTile.y)}}); return roomJson; } @@ -281,8 +284,7 @@ void Room::update() { actor->update(); } player->update(); - if (!lock) - updateCamera(); + if (!lock) updateCamera(); } void Room::updateCamera() { @@ -307,18 +309,14 @@ void Room::draw() const { this->tileMap->draw(); for (auto i : interactables->getList()) { - auto rect = Rectangle{ - i->getWorldPos().x * static_cast(getWorldTileSize()), - i->getWorldPos().y * static_cast(getWorldTileSize()), - static_cast(getWorldTileSize()), - static_cast(getWorldTileSize())}; + auto rect = Rectangle{i->getWorldPos().x * static_cast(getWorldTileSize()), + i->getWorldPos().y * static_cast(getWorldTileSize()), + static_cast(getWorldTileSize()), static_cast(getWorldTileSize())}; DrawRectangleRec(rect, Fade(YELLOW, 0.5f)); } for (auto &[vect, value] : collisions->getObjects()) { - auto rect = Rectangle{vect.x * static_cast(worldTileSize), - vect.y * static_cast(worldTileSize), - static_cast(worldTileSize), - static_cast(worldTileSize)}; + auto rect = Rectangle{vect.x * static_cast(worldTileSize), vect.y * static_cast(worldTileSize), + static_cast(worldTileSize), static_cast(worldTileSize)}; DrawRectangleRec(rect, Fade(RED, 0.5f)); } @@ -327,10 +325,12 @@ void Room::draw() const { prop->draw(); } } - - for (auto &[vect, actor] : actors->getActors()) { - actor->draw(); + for (auto &[name, actor] : actors->getActors()) { + if (actor->getCollisionCenter().y <= player->getCollisionPos().y) { + actor->draw(); + } } + player->draw(); for (auto &[pos, prop] : props->getObjects()) { @@ -338,6 +338,11 @@ void Room::draw() const { prop->draw(); } } + for (auto &[name, actor] : actors->getActors()) { + if (actor->getCollisionCenter().y > player->getCollisionPos().y) { + actor->draw(); + } + } EndMode2D(); } @@ -348,9 +353,7 @@ int Room::getWorldTileSize() const { return worldTileSize; } void Room::setLock(bool val) { this->lock = val; } -void Room::addPlayer(std::unique_ptr newPlayer) { - this->player = std::move(newPlayer); -} +void Room::addPlayer(std::unique_ptr newPlayer) { this->player = std::move(newPlayer); } Player &Room::getPlayer() const { return *player; } @@ -360,21 +363,15 @@ void Room::setTileMap(TileMap *newTileMap) { tileMap.reset(newTileMap); } std::string Room::getMusicSource() const { return musicSource; } -void Room::setMusicSource(const std::string_view &newMusicSource) { - this->musicSource = newMusicSource; -} +void Room::setMusicSource(const std::string_view &newMusicSource) { this->musicSource = newMusicSource; } Vector2 Room::getStartTile() const { return startTile; } -void Room::setStartTile(Vector2 newStartTile) { - this->startTile = newStartTile; -} +void Room::setStartTile(Vector2 newStartTile) { this->startTile = newStartTile; } CollisionsContainer &Room::getCollisions() const { return *this->collisions; } -InteractablesContainer &Room::getInteractables() const { - return *this->interactables; -} +InteractablesContainer &Room::getInteractables() const { return *this->interactables; } PropsContainer &Room::getProps() const { return *this->props; } diff --git a/xmake.lua b/xmake.lua index d27cbe7d..c131c5c8 100644 --- a/xmake.lua +++ b/xmake.lua @@ -157,10 +157,10 @@ add_deps("rpgpp") add_packages("raylib", "tgui", "nlohmann_json", "luajit", "noop", "tree-sitter", "tree-sitter-lua") after_build( function (target) - os.cp("$(curdir)/resources", "$(builddir)/$(plat)/$(arch)/$(mode)/", { async = true }) + os.cp("$(curdir)/resources", "./build/$(plat)/$(arch)/$(mode)/", { async = true }) if is_plat("linux", "macosx") then - os.cp("$(builddir)/$(plat)/$(arch)/$(mode)/librpgpp.a", "$(curdir)/game-src/lib/librpgpp.a", { async = true }) - os.cp("$(builddir)/$(plat)/$(arch)/$(mode)/librpgpplua.so", "$(curdir)/game-src/lib/librpgpplua.so", + os.cp("./build/$(plat)/$(arch)/$(mode)/librpgpp.a", "$(curdir)/game-src/lib/librpgpp.a", { async = true }) + os.cp("./build/$(plat)/$(arch)/$(mode)/librpgpplua.so", "$(curdir)/game-src/lib/librpgpplua.so", { async = true }) os.cp(path.join(target:pkg("luajit"):installdir(), "bin/luajit*"), "$(curdir)/execs/luajit", { async = true }) end @@ -170,13 +170,13 @@ after_build( function (target) os.cp(path.join(target:pkg("luajit"):installdir(), "bin/luajit.exe"), "$(curdir)/execs/luajit.exe", { async = true }) end - os.cp("$(curdir)/game-src", "$(builddir)/$(plat)/$(arch)/$(mode)/", { async = true }) - os.cp("$(curdir)/execs", "$(builddir)/$(plat)/$(arch)/$(mode)/", { async = true }) + os.cp("$(curdir)/game-src", "./build/$(plat)/$(arch)/$(mode)/", { async = true }) + os.cp("$(curdir)/execs", "./build/$(plat)/$(arch)/$(mode)/", { async = true }) os.rm("$(curdir)/game-src", { async = true }) os.rm("$(curdir)/execs", { async = true }) -- remove this line to test if the configuration file changes - os.cp("$(curdir)/rpgpp.ini", "$(builddir)/$(plat)/$(arch)/$(mode)/", { copy_if_different = true }) + os.cp("$(curdir)/rpgpp.ini", "./build/$(plat)/$(arch)/$(mode)/", { copy_if_different = true }) print("Pro tip: Check whether translations are up to date with `xmake check_translation`!") print("Environment:") print(" builddir: " .. "$(builddir)") From e442c2a6db7a629b1e21949d4b584c71cfacd8e3 Mon Sep 17 00:00:00 2001 From: CDevv Date: Tue, 7 Apr 2026 19:26:07 +0300 Subject: [PATCH 08/69] Make directories for all resource types when creating a new project. --- src/editor/project.cpp | 156 ++++++++++++++++------------------------- 1 file changed, 60 insertions(+), 96 deletions(-) diff --git a/src/editor/project.cpp b/src/editor/project.cpp index 4c61504b..66cb8402 100644 --- a/src/editor/project.cpp +++ b/src/editor/project.cpp @@ -1,14 +1,7 @@ #include "project.hpp" -#include "conversion.hpp" -#include "dialogue.hpp" -#include "dialogueParser.hpp" -#include "editor.hpp" -#include "gamedata.hpp" -#include "interactable.hpp" -#include "room.hpp" -#include "screens/projectScreen.hpp" -#include "services/fileSystemService.hpp" -#include "tileset.hpp" + +#include + #include #include #include @@ -17,13 +10,22 @@ #include #include #include -#include #include #include +#include "conversion.hpp" +#include "dialogue.hpp" +#include "dialogueParser.hpp" +#include "editor.hpp" +#include "gamedata.hpp" +#include "interactable.hpp" +#include "room.hpp" +#include "screens/projectScreen.hpp" +#include "services/fileSystemService.hpp" +#include "tileset.hpp" + #ifdef _WIN64 -#include "fix_win32_compatibility.h" #include #include #include @@ -35,6 +37,8 @@ #include #include +#include "fix_win32_compatibility.h" + #else #include @@ -61,8 +65,7 @@ Project::Project(const std::string &path) { UnloadFileText(jsonContent); } -std::string Project::create(const std::string &dirPath, - const std::string &title) { +std::string Project::create(const std::string &dirPath, const std::string &title) { json j = json::object(); j["title"] = title; std::string fileContent = j.dump(); @@ -95,8 +98,7 @@ std::string Project::create(const std::string &dirPath, std::string dirName = TextToLower(Editor::instance->getFs().getTypeName(fileType).c_str()); - MakeDirectory( - std::filesystem::path(dirPath).append(dirPath).u8string().c_str()); + MakeDirectory(std::filesystem::path(dirPath).append(dirName).u8string().c_str()); } return filePath.u8string(); @@ -105,8 +107,7 @@ std::string Project::create(const std::string &dirPath, void Project::openProject(const tgui::String &filePath, bool forceSwitch) { Editor::instance->setProject(filePath.toStdString()); Editor::instance->getRecentProjectService().enqueue(filePath.toStdString()); - Editor::instance->getGui().setScreen( - std::make_unique(), forceSwitch); + Editor::instance->getGui().setScreen(std::make_unique(), forceSwitch); } json Project::toJson() { @@ -122,8 +123,7 @@ std::string &Project::getBasePath() { return projectPath; } std::vector Project::getPaths(EngineFileType fileType) { std::filesystem::path subdir = projectPath; - subdir /= - TextToLower(Editor::instance->getFs().getTypeName(fileType).c_str()); + subdir /= TextToLower(Editor::instance->getFs().getTypeName(fileType).c_str()); assert(subdir.string().empty() == false && "directory path is empty"); @@ -139,11 +139,9 @@ std::vector Project::getPaths(EngineFileType fileType) { return vec; } -std::string Project::getResourcePath(EngineFileType fileType, - const std::string &fileName) { +std::string Project::getResourcePath(EngineFileType fileType, const std::string &fileName) { std::filesystem::path subdir = projectPath; - subdir /= - TextToLower(Editor::instance->getFs().getTypeName(fileType).c_str()); + subdir /= TextToLower(Editor::instance->getFs().getTypeName(fileType).c_str()); subdir /= fileName; return subdir.string(); @@ -153,8 +151,7 @@ std::map Project::getInteractableNames() { std::map map{}; // built-in interactables - std::filesystem::path interactablesDir = - Editor::instance->getFs().getEditorBaseDir(); + std::filesystem::path interactablesDir = Editor::instance->getFs().getEditorBaseDir(); interactablesDir /= "resources"; interactablesDir /= "interactables"; @@ -188,22 +185,18 @@ GameData Project::generateStruct() { Image image = LoadImageFromTexture(texture); int fileSize = 0; - std::string fileType = - GetFileExtension(tileSet.getTextureSource().c_str()); - unsigned char *imageData = - ExportImageToMemory(image, fileType.c_str(), &fileSize); + std::string fileType = GetFileExtension(tileSet.getTextureSource().c_str()); + unsigned char *imageData = ExportImageToMemory(image, fileType.c_str(), &fileSize); TileSetBin tileSetBin; tileSetBin.name = GetFileName(tileSetPath.c_str()); - tileSetBin.extension = - GetFileExtension(tileSet.getTextureSource().c_str()); + tileSetBin.extension = GetFileExtension(tileSet.getTextureSource().c_str()); for (int i = 0; i < fileSize; i++) { tileSetBin.image.push_back(*imageData); imageData++; } tileSetBin.tileSize = - IVector{static_cast(tileSet.getTileSize().x), - static_cast(tileSet.getTileSize().y)}; + IVector{static_cast(tileSet.getTileSize().x), static_cast(tileSet.getTileSize().y)}; tileSetBin.dataSize = fileSize; data.tilesets[GetFileName(tileSetPath.c_str())] = tileSetBin; @@ -235,10 +228,8 @@ GameData Project::generateStruct() { Vector2 atlasPos = tile.getAtlasTile().getAtlasCoords(); Vector2 worldPos = tile.getWorldCoords(); - IVector intAtlas = IVector{static_cast(atlasPos.x), - static_cast(atlasPos.y)}; - IVector intWorld = IVector{static_cast(worldPos.x), - static_cast(worldPos.y)}; + IVector intAtlas = IVector{static_cast(atlasPos.x), static_cast(atlasPos.y)}; + IVector intWorld = IVector{static_cast(worldPos.x), static_cast(worldPos.y)}; TileBin tileBin; tileBin.atlasPos = intAtlas; @@ -250,8 +241,8 @@ GameData Project::generateStruct() { map.reset(); std::unique_ptr room = std::make_unique(roomPath); - roomBin.startPoint = IVector{static_cast(room->getStartTile().x), - static_cast(room->getStartTile().y)}; + roomBin.startPoint = + IVector{static_cast(room->getStartTile().x), static_cast(room->getStartTile().y)}; for (auto [pos, obj] : room->getCollisions().getObjects()) { IVector intVec; intVec.x = static_cast(pos.x); @@ -265,8 +256,7 @@ GameData Project::generateStruct() { intBin.type = interactable->getType(); intBin.onTouch = interactable->isOnTouch(); - intBin.propsCbor = - nlohmann::json::to_cbor(interactable->getProps()); + intBin.propsCbor = nlohmann::json::to_cbor(interactable->getProps()); roomBin.interactables.push_back(intBin); } @@ -275,8 +265,7 @@ GameData Project::generateStruct() { pBin.name = prop->getSourcePath(); pBin.tilePos = fromVector2(prop->getWorldTilePos()); - pBin.propsCbor = - nlohmann::json::to_cbor(prop->getInteractable()->getProps()); + pBin.propsCbor = nlohmann::json::to_cbor(prop->getInteractable()->getProps()); roomBin.props.push_back(pBin); } for (auto &[aName, actor] : room->getActors().getActors()) { @@ -284,9 +273,8 @@ GameData Project::generateStruct() { aBin.name = aName; aBin.source = actor->getSourcePath(); aBin.tilePos = - IVector{static_cast(actor->getTilePosition().x), - static_cast(actor->getTilePosition().y)}; - + IVector{static_cast(actor->getTilePosition().x), static_cast(actor->getTilePosition().y)}; + if (actor->hasInteractable()) { aBin.intType = actor->getInteractable()->getType(); aBin.propsCbor = nlohmann::json::to_cbor(actor->getInteractable()->getProps()); @@ -309,18 +297,13 @@ GameData Project::generateStruct() { actorBin.tileSetName = GetFileName(actor->getTileSetSource().c_str()); Rectangle collisionRect = actor->getCollisionRect(); - actorBin.collision = IRect{static_cast(collisionRect.x), - static_cast(collisionRect.y), - static_cast(collisionRect.width), - static_cast(collisionRect.height)}; - std::array, 8> animations = - actor->getAnimationsRaw(); + actorBin.collision = IRect{static_cast(collisionRect.x), static_cast(collisionRect.y), + static_cast(collisionRect.width), static_cast(collisionRect.height)}; + std::array, 8> animations = actor->getAnimationsRaw(); for (int i = 0; i < 8; i++) { - for (int frameIndex = 0; frameIndex < animations[i].size(); - frameIndex++) { + for (int frameIndex = 0; frameIndex < animations[i].size(); frameIndex++) { Vector2 vec = animations[i][frameIndex]; - IVector intVec = - IVector{static_cast(vec.x), static_cast(vec.y)}; + IVector intVec = IVector{static_cast(vec.x), static_cast(vec.y)}; actorBin.animations[i].push_back(intVec); } @@ -344,8 +327,7 @@ GameData Project::generateStruct() { int fileSize = 0; - unsigned char *imgData = ExportImageToMemory( - img, GetFileExtension(imagePath.c_str()), &fileSize); + unsigned char *imgData = ExportImageToMemory(img, GetFileExtension(imagePath.c_str()), &fileSize); for (int i = 0; i < fileSize; i++) { bin.data.push_back(*imgData); imgData++; @@ -413,15 +395,12 @@ GameData Project::generateStruct() { PropBin bin; bin.name = GetFileNameWithoutExt(propPath.c_str()); - bin.atlasRect = IRect{static_cast(prop.getAtlasRect().x), - static_cast(prop.getAtlasRect().y), - static_cast(prop.getAtlasRect().width), - static_cast(prop.getAtlasRect().height)}; + bin.atlasRect = + IRect{static_cast(prop.getAtlasRect().x), static_cast(prop.getAtlasRect().y), + static_cast(prop.getAtlasRect().width), static_cast(prop.getAtlasRect().height)}; bin.collisionRect = - IRect{static_cast(prop.getCollisionRect().x), - static_cast(prop.getCollisionRect().y), - static_cast(prop.getCollisionRect().width), - static_cast(prop.getCollisionRect().height)}; + IRect{static_cast(prop.getCollisionRect().x), static_cast(prop.getCollisionRect().y), + static_cast(prop.getCollisionRect().width), static_cast(prop.getCollisionRect().height)}; bin.imagePath = std::string(prop.getImagePath()); bin.hasInteractable = prop.getHasInteractable(); if (prop.getInteractable() == nullptr) { @@ -434,8 +413,7 @@ GameData Project::generateStruct() { } // built in insteractables - std::filesystem::path interactablesDir = - Editor::instance->getFs().getEditorBaseDir(); + std::filesystem::path interactablesDir = Editor::instance->getFs().getEditorBaseDir(); interactablesDir /= "resources"; interactablesDir /= "interactables"; @@ -456,8 +434,7 @@ GameData Project::generateStruct() { UnloadDirectoryFiles(list); // scripts - std::filesystem::path scriptsDir = - Editor::instance->getFs().getEditorBaseDir(); + std::filesystem::path scriptsDir = Editor::instance->getFs().getEditorBaseDir(); scriptsDir /= "resources"; scriptsDir /= "scripts"; auto scriptsList = LoadDirectoryFiles(scriptsDir.u8string().c_str()); @@ -515,20 +492,16 @@ void Project::runProject() { intepreterPath /= "luajit"; libDest /= "rpgpplua.so"; - std::filesystem::copy_file( - libPath, libDest, std::filesystem::copy_options::overwrite_existing); + std::filesystem::copy_file(libPath, libDest, std::filesystem::copy_options::overwrite_existing); ChangeDirectory(projectPath.c_str()); - std::string cmdLine = TextFormat( - "%s -l rpgpplua %s", intepreterPath.c_str(), scriptPath.c_str()); + std::string cmdLine = TextFormat("%s -l rpgpplua %s", intepreterPath.c_str(), scriptPath.c_str()); printf("%s \n", cmdLine.c_str()); char buffer[256]; FILE *stream; - stream = popen(TextFormat("%s -l rpgpplua %s", intepreterPath.c_str(), - scriptPath.c_str()), - "r"); + stream = popen(TextFormat("%s -l rpgpplua %s", intepreterPath.c_str(), scriptPath.c_str()), "r"); #endif #ifdef _WIN64 @@ -538,21 +511,18 @@ void Project::runProject() { libPath /= rpgppDllPath; libDest /= rpgppDllPath; - std::filesystem::copy_file( - libPath, libDest, std::filesystem::copy_options::overwrite_existing); + std::filesystem::copy_file(libPath, libDest, std::filesystem::copy_options::overwrite_existing); ChangeDirectory(projectPath.c_str()); // note: compared to linux, you have to add .string() to every single one of // these paths. - std::string cmdLine = - TextFormat("%s -l rpgpplua %s", intepreterPath.string().c_str(), - scriptPath.string().c_str()); + std::string cmdLine = TextFormat("%s -l rpgpplua %s", intepreterPath.string().c_str(), scriptPath.string().c_str()); HANDLE outFile = nullptr; - outFile = CreateFile("playtest.log", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, - OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + outFile = + CreateFile("playtest.log", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); PROCESS_INFORMATION piProcInfo; STARTUPINFO siStartInfo; @@ -565,8 +535,7 @@ void Project::runProject() { siStartInfo.hStdOutput = outFile; siStartInfo.dwFlags |= STARTF_USESTDHANDLES; - bool success = CreateProcess(NULL, cmdLine.data(), NULL, NULL, true, 0, - NULL, NULL, &siStartInfo, &piProcInfo); + bool success = CreateProcess(NULL, cmdLine.data(), NULL, NULL, true, 0, NULL, NULL, &siStartInfo, &piProcInfo); if (!success) { printf("Child process doesn't work. \n"); @@ -589,8 +558,7 @@ void Project::buildProject() { serializeDataToFile(binPath.u8string(), bin); // Copy base game file - std::filesystem::path baseGamePath = - Editor::instance->getFs().getEditorBaseDir(); + std::filesystem::path baseGamePath = Editor::instance->getFs().getEditorBaseDir(); std::filesystem::path resultPath = projectPath; @@ -603,9 +571,7 @@ void Project::buildProject() { #endif try { - std::filesystem::copy( - baseGamePath, resultPath, - std::filesystem::copy_options::overwrite_existing); + std::filesystem::copy(baseGamePath, resultPath, std::filesystem::copy_options::overwrite_existing); } catch (const std::exception &) { printf("failed to copy file, aborting...\n"); return; @@ -615,8 +581,7 @@ void Project::buildProject() { HANDLE outFile = nullptr; - outFile = CreateFile("build.log", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, - OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + outFile = CreateFile("build.log", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); PROCESS_INFORMATION piProcInfo; STARTUPINFO siStartInfo; @@ -629,8 +594,7 @@ void Project::buildProject() { siStartInfo.dwFlags |= STARTF_USESTDHANDLES; bool success = - CreateProcess(NULL, resultPath.string().data(), NULL, NULL, true, 0, - NULL, NULL, &siStartInfo, &piProcInfo); + CreateProcess(NULL, resultPath.string().data(), NULL, NULL, true, 0, NULL, NULL, &siStartInfo, &piProcInfo); if (!success) { printf("Child process could not be created.. \n"); From 84ae63d9dcb6f09c87dfe03f68a8e167c5f2eb79 Mon Sep 17 00:00:00 2001 From: CDevv Date: Thu, 9 Apr 2026 18:51:11 +0300 Subject: [PATCH 09/69] Basic Project Settings window --- include/editor/childWindows/popupWindow.hpp | 7 +- .../childWindows/projectSettingsWindow.hpp | 17 ++ include/editor/project.hpp | 19 +- resources/projectsettings.png | Bin 0 -> 438 bytes .../childWindows/projectSettingsWindow.cpp | 44 ++++ src/editor/project.cpp | 21 +- src/editor/screens/projectScreen.cpp | 191 ++++++++---------- src/editor/services/childWindowSubService.cpp | 19 +- 8 files changed, 167 insertions(+), 151 deletions(-) create mode 100644 include/editor/childWindows/projectSettingsWindow.hpp create mode 100644 resources/projectsettings.png create mode 100644 src/editor/childWindows/projectSettingsWindow.cpp diff --git a/include/editor/childWindows/popupWindow.hpp b/include/editor/childWindows/popupWindow.hpp index 194cc881..273bb1f3 100644 --- a/include/editor/childWindows/popupWindow.hpp +++ b/include/editor/childWindows/popupWindow.hpp @@ -1,17 +1,18 @@ #ifndef RPGPP_POPUPWINDOW_H #define RPGPP_POPUPWINDOW_H -#include "TGUI/Widgets/ChildWindow.hpp" #include + +#include "TGUI/Widgets/ChildWindow.hpp" class PopupWindow { - public: +public: bool windowIsOpen = false; tgui::ChildWindow::Ptr currentWindow; explicit PopupWindow(const std::string &title); ~PopupWindow() { close(); }; - void open(); + virtual void open(); void close(); }; diff --git a/include/editor/childWindows/projectSettingsWindow.hpp b/include/editor/childWindows/projectSettingsWindow.hpp new file mode 100644 index 00000000..be920920 --- /dev/null +++ b/include/editor/childWindows/projectSettingsWindow.hpp @@ -0,0 +1,17 @@ +#ifndef _RPGPP_PROJECTSETTINGSWINDOW_H +#define _RPGPP_PROJECTSETTINGSWINDOW_H + +#include "TGUI/Widgets/EditBox.hpp" +#include "childWindows/popupWindow.hpp" +#include "widgets/propertyFields/textField.hpp" + +class ProjectSettingsWindow : public PopupWindow { +private: + TextField::Ptr titleField; + +public: + ProjectSettingsWindow(); + void open() override; +}; + +#endif \ No newline at end of file diff --git a/include/editor/project.hpp b/include/editor/project.hpp index 063a1f29..3b5c9be3 100644 --- a/include/editor/project.hpp +++ b/include/editor/project.hpp @@ -1,33 +1,32 @@ #ifndef _RPGPP_PROJECT_H #define _RPGPP_PROJECT_H -#include "gamedata.hpp" -#include "services/fileSystemService.hpp" #include #include #include #include #include +#include "gamedata.hpp" +#include "services/fileSystemService.hpp" + using json = nlohmann::json; class Project { - private: +private: std::string projectPath; std::string projectTitle; - public: +public: Project(const std::string &path); - static std::string create(const std::string &dirPath, - const std::string &title); - static void openProject(const tgui::String &filePath, - bool forceSwitch = false); + static std::string create(const std::string &dirPath, const std::string &title); + static void openProject(const tgui::String &filePath, bool forceSwitch = false); json toJson(); std::string &getTitle(); + void setTitle(const std::string &newTitle); std::string &getBasePath(); std::vector getPaths(EngineFileType fileType); - std::string getResourcePath(EngineFileType fileType, - const std::string &fileName); + std::string getResourcePath(EngineFileType fileType, const std::string &fileName); std::map getInteractableNames(); std::vector getPropsNames(); GameData generateStruct(); diff --git a/resources/projectsettings.png b/resources/projectsettings.png new file mode 100644 index 0000000000000000000000000000000000000000..32db54b716da1aa79af8e7fa99d8174b3e40b9f4 GIT binary patch literal 438 zcmV;n0ZIOeP)Px$a7jc#R9J=WS21qGFbupDd4K^M=+Gg^m?fiM;N5T4t`}(3;xX{hp+ExU2kKH5 zvPz1UZNMnn+iXb3^NFNr;2$f{RCQ>oI;`P1tO?$BJpjO2gZuNbi0fskfUO`3*uvg9 zJgjY+y%Hg}PCKTf_62R%!&wvV&&PoR6KM)(O&}q0@EpX%NeP@aVqiuH(!ElWW;2&W zlmt&jXceNCj%1~?X7Vhp(aLj{16*J!F}d|Q5k-A~$T&iJpE{!<+XqU|okQF8V%h!> zKuv?&Ft^=GE=b(RctKh^TO#2O^f9~N1>X*QS+~0PONbqfk8e)e_D4kS%g2MRVJ z7<{%0#=!$oNt1}vUp12Dctinl5Xri^W4Xp7&V)pF07*qoM6N<$g7cid#Q*>R literal 0 HcmV?d00001 diff --git a/src/editor/childWindows/projectSettingsWindow.cpp b/src/editor/childWindows/projectSettingsWindow.cpp new file mode 100644 index 00000000..44338ea8 --- /dev/null +++ b/src/editor/childWindows/projectSettingsWindow.cpp @@ -0,0 +1,44 @@ +#include "childWindows/projectSettingsWindow.hpp" + +#include "TGUI/String.hpp" +#include "TGUI/Widgets/EditBox.hpp" +#include "TGUI/Widgets/GrowVerticalLayout.hpp" +#include "TGUI/Widgets/Label.hpp" +#include "childWindows/popupWindow.hpp" +#include "editor.hpp" +#include "project.hpp" +#include "widgets/propertyFields/textField.hpp" + +ProjectSettingsWindow::ProjectSettingsWindow() : PopupWindow("ProjectSettings") { + auto layout = tgui::GrowVerticalLayout::create(); + layout->getRenderer()->setSpaceBetweenWidgets(4.0f); + + auto titleLabel = tgui::Label::create(); + titleLabel->setSize({"80%", 36}); + titleLabel->setText("Project Settings"); + + layout->add(titleLabel); + + titleField = TextField::create(); + titleField->label->setText("Title"); + titleField->setPosition({8, 48}); + titleField->setSize({"80%", 24}); + titleField->value->onTextChange([](const tgui::String &text) { + Project *project = Editor::instance->getProject(); + if (project != nullptr) { + project->setTitle(text.toStdString()); + } + }); + + layout->add(titleField); + + this->currentWindow->add(layout); +} + +void ProjectSettingsWindow::open() { + Project *project = Editor::instance->getProject(); + + titleField->value->setText(project->getTitle()); + + PopupWindow::open(); +} \ No newline at end of file diff --git a/src/editor/project.cpp b/src/editor/project.cpp index 66cb8402..c6afa01f 100644 --- a/src/editor/project.cpp +++ b/src/editor/project.cpp @@ -74,25 +74,6 @@ std::string Project::create(const std::string &dirPath, const std::string &title filePath /= "proj.rpgpp"; SaveFileText(filePath.u8string().c_str(), fileContent.c_str()); - /* - MakeDirectory( - std::filesystem::path(dirPath).append("tilesets").u8string().c_str()); - MakeDirectory( - std::filesystem::path(dirPath).append("maps").u8string().c_str()); - MakeDirectory( - std::filesystem::path(dirPath).append("actors").u8string().c_str()); - MakeDirectory( - std::filesystem::path(dirPath).append("dialogue").u8string().c_str()); - MakeDirectory( - std::filesystem::path(dirPath).append("scripts").u8string().c_str()); - MakeDirectory( - std::filesystem::path(dirPath).append("props").u8string().c_str()); - MakeDirectory( - std::filesystem::path(dirPath).append("images").u8string().c_str()); - MakeDirectory( - std::filesystem::path(dirPath).append("fonts").u8string().c_str()); - */ - for (int i = 0; i < FILETYPE_MAX; i++) { EngineFileType fileType = static_cast(i); @@ -119,6 +100,8 @@ json Project::toJson() { std::string &Project::getTitle() { return projectTitle; } +void Project::setTitle(const std::string &newTitle) { projectTitle = newTitle; } + std::string &Project::getBasePath() { return projectPath; } std::vector Project::getPaths(EngineFileType fileType) { diff --git a/src/editor/screens/projectScreen.cpp b/src/editor/screens/projectScreen.cpp index d6b2bdc2..57a60bfe 100644 --- a/src/editor/screens/projectScreen.cpp +++ b/src/editor/screens/projectScreen.cpp @@ -1,4 +1,11 @@ #include "screens/projectScreen.hpp" + +#include +#include +#include +#include +#include + #include "TGUI/Layout.hpp" #include "TGUI/String.hpp" #include "TGUI/Texture.hpp" @@ -23,26 +30,17 @@ #include "services/fileSystemService.hpp" #include "services/translationService.hpp" #include "widgets/newFileDialog.hpp" -#include -#include -#include -#include -#include using namespace screens; -void ProjectScreen::layoutReload() { - resListWBinder->setSize(modifiable_RESLIST_W, "100%"); -} +void ProjectScreen::layoutReload() { resListWBinder->setSize(modifiable_RESLIST_W, "100%"); } void ProjectScreen::mouseMove(int x, int y) { - resourcesList->manualMouseMoved( - {static_cast(x), static_cast(y)}); + resourcesList->manualMouseMoved({static_cast(x), static_cast(y)}); fileTabs->manualMouseMoved( {static_cast( - x // coordinate of the mouse cursor relative to the projectScreen - - tabsContainer->getPosition().x // coordinate of the tabsContainer - // relative to the projectScreen - + tabsContainer->getContentOffset() - .x // coordinate of the widget relative to the tabsContainer + x // coordinate of the mouse cursor relative to the projectScreen + - tabsContainer->getPosition().x // coordinate of the tabsContainer + // relative to the projectScreen + + tabsContainer->getContentOffset().x // coordinate of the widget relative to the tabsContainer // why all of these calculations? cause the builtin // leftMousePressed method returns the mouse coordinate relative to // the current widget @@ -50,12 +48,10 @@ void ProjectScreen::mouseMove(int x, int y) { static_cast(y - tabsContainer->getPosition().y)}); } void ProjectScreen::leftMouseReleased(int x, int y) { - resourcesList->manualLeftMouseReleased( - {static_cast(x), static_cast(y)}); + resourcesList->manualLeftMouseReleased({static_cast(x), static_cast(y)}); fileTabs->manualLeftMouseReleased( {// ditto - static_cast(x - tabsContainer->getPosition().x + - tabsContainer->getContentOffset().x), + static_cast(x - tabsContainer->getPosition().x + tabsContainer->getContentOffset().x), static_cast(y - tabsContainer->getPosition().y)}); } @@ -75,12 +71,9 @@ void ProjectScreen::bindMenuBarAndHK(tgui::MenuBar::Ptr menuBarPtr) { auto redoAction = [this] { getCurrentFile().getView().redoAction(); }; - std::vector saveFileHierarchy = { - ts.getKey("menu.file._label"), ts.getKey("menu.file.save_file")}; - std::vector undoHierarchy = {ts.getKey("menu.edit._label"), - ts.getKey("menu.edit.undo")}; - std::vector redoHierarchy = {ts.getKey("menu.edit._label"), - ts.getKey("menu.edit.redo")}; + std::vector saveFileHierarchy = {ts.getKey("menu.file._label"), ts.getKey("menu.file.save_file")}; + std::vector undoHierarchy = {ts.getKey("menu.edit._label"), ts.getKey("menu.edit.undo")}; + std::vector redoHierarchy = {ts.getKey("menu.edit._label"), ts.getKey("menu.edit.redo")}; menuBarPtr->setMenuItemEnabled(saveFileHierarchy, true); menuBarPtr->connectMenuItem(saveFileHierarchy, saveAction); @@ -144,14 +137,10 @@ void ProjectScreen::initItems(tgui::Group::Ptr layout) { tabsContainer->getRenderer()->setBorders({0, 0, 0, 0}); tabsContainer->getRenderer()->setRoundedBorderRadius(0); tabsContainer->getRenderer()->setPadding(0); - tabsContainer->setSize( - tgui::Layout("100%") - tgui::bindWidth(resListWBinder), FILETABS_H); - tabsContainer->setPosition(tgui::bindWidth(resListWBinder), - tgui::bindBottom(toolBar)); - tabsContainer->getVerticalScrollbar()->setPolicy( - tgui::Scrollbar::Policy::Never); - tabsContainer->getHorizontalScrollbar()->setPolicy( - tgui::Scrollbar::Policy::Never); + tabsContainer->setSize(tgui::Layout("100%") - tgui::bindWidth(resListWBinder), FILETABS_H); + tabsContainer->setPosition(tgui::bindWidth(resListWBinder), tgui::bindBottom(toolBar)); + tabsContainer->getVerticalScrollbar()->setPolicy(tgui::Scrollbar::Policy::Never); + tabsContainer->getHorizontalScrollbar()->setPolicy(tgui::Scrollbar::Policy::Never); fileTabs = FileTab::create(); fileTabs->setHeight(FILETABS_H); @@ -175,19 +164,16 @@ void ProjectScreen::initItems(tgui::Group::Ptr layout) { } }); - Editor::instance->getHotkeyService().registerHotkeyCallback( - "close_tab", [this] { fileTabs->closeCurrentTab(); }); + Editor::instance->getHotkeyService().registerHotkeyCallback("close_tab", [this] { fileTabs->closeCurrentTab(); }); tabsContainer->add(fileTabs); layout->add(tabsContainer); // File view - auto fileView = tgui::Group::create( - {tgui::Layout("100%") - tgui::bindWidth(resListWBinder), - tgui::Layout("100%") - tgui::bindHeight(toolBar) - - tgui::bindHeight(tabsContainer)}); - fileView->setPosition(tgui::bindWidth(resListWBinder), - tgui::bindBottom(tabsContainer)); + auto fileView = + tgui::Group::create({tgui::Layout("100%") - tgui::bindWidth(resListWBinder), + tgui::Layout("100%") - tgui::bindHeight(toolBar) - tgui::bindHeight(tabsContainer)}); + fileView->setPosition(tgui::bindWidth(resListWBinder), tgui::bindBottom(tabsContainer)); this->fileViewGroup = fileView; clearView(); layout->add(fileView); @@ -198,14 +184,10 @@ void ProjectScreen::initItems(tgui::Group::Ptr layout) { // FIXME: fix scaling issue on windows! } -void ProjectScreen::addFileView(EngineFileType fileType, - const std::string &path) { - - Editor::instance->getGui().gui->setTabKeyUsageEnabled( - fileType != EngineFileType::FILE_SCRIPT); +void ProjectScreen::addFileView(EngineFileType fileType, const std::string &path) { + Editor::instance->getGui().gui->setTabKeyUsageEnabled(fileType != EngineFileType::FILE_SCRIPT); - std::unique_ptr projectFile = - fileVisitor->visit(fileType, path); + std::unique_ptr projectFile = fileVisitor->visit(fileType, path); if (projectFile->isEmpty) { std::string mutPath = std::string(path); Editor::instance->getFs().openFileInDefaultApp(mutPath); @@ -237,8 +219,7 @@ void ProjectScreen::switchView(tgui::String id) { void ProjectScreen::clearView() { focusedFile = ""; fileViewGroup->removeAllWidgets(); - std::unique_ptr empty = - fileVisitor->visit(EngineFileType::FILE_EMPTY, "."); + std::unique_ptr empty = fileVisitor->visit(EngineFileType::FILE_EMPTY, "."); empty->initUi(fileViewGroup); empty->addWidgets(fileViewGroup); } @@ -267,21 +248,27 @@ tgui::Group::Ptr ProjectScreen::createToolBar() { auto &fs = Editor::instance->getFs(); + auto settingsBtn = tgui::BitmapButton::create(); + auto settingsImage = tgui::Texture(fs.getResourcePath("projectsettings.png")); + settingsBtn->setImage(settingsImage); + settingsBtn->setSize({barSize, "100%"}); + settingsBtn->setPosition({tgui::bindRight(projectLabel), 0}); + settingsBtn->onPress([] { Editor::instance->getGui().getChildWindowSubService()->openWindow("project_settings"); }); + toolBar->add(settingsBtn); + auto playBtnTooltip = Tooltip::create(""); - bindTranslation(playBtnTooltip, "screen.project.toolbar.play", - &Tooltip::setText); + bindTranslation(playBtnTooltip, "screen.project.toolbar.play", &Tooltip::setText); auto playBtn = tgui::BitmapButton::create(); auto playtestImg = tgui::Texture(fs.getResourcePath("playtest.png")); playBtn->setImage(playtestImg); playBtn->setSize({barSize, "100%"}); - playBtn->setPosition({tgui::bindRight(projectLabel), 0}); + playBtn->setPosition({tgui::bindRight(settingsBtn) + 8, 0}); playBtn->onPress([] { Editor::instance->getProject()->runProject(); }); playBtn->setToolTip(playBtnTooltip); toolBar->add(playBtn, "playBtn"); auto buildTooltip = Tooltip::create(""); - bindTranslation(buildTooltip, "screen.project.toolbar.build", - &Tooltip::setText); + bindTranslation(buildTooltip, "screen.project.toolbar.build", &Tooltip::setText); auto buildBtn = tgui::BitmapButton::create(); auto buildImg = tgui::Texture(fs.getResourcePath("build.png")); buildBtn->setImage(buildImg); @@ -300,54 +287,46 @@ void ProjectScreen::addResourceButtons(EngineFileType fileType) { this->listedResourcesType = fileType; resourcesLayout->removeAllWidgets(); - resourcesLayout->getRenderer()->setSpaceBetweenWidgets( - RESLIST_ITEM_PADDING); + resourcesLayout->getRenderer()->setSpaceBetweenWidgets(RESLIST_ITEM_PADDING); for (auto filePath : project->getPaths(fileType)) { auto fileBtn = tgui::Button::create(GetFileName(filePath.c_str())); fileBtn->setSize("100%", RESLIST_RES_BTN_H); - fileBtn->onPress( - [this, fileType, filePath] { addFileView(fileType, filePath); }); + fileBtn->onPress([this, fileType, filePath] { addFileView(fileType, filePath); }); fileBtn->onRightMousePress([this, filePath] { fileContextMenu->getMenuItems().at(0).text = filePath; - fileContextMenu->setPosition(GetMousePosition().x, - GetMousePosition().y); + fileContextMenu->setPosition(GetMousePosition().x, GetMousePosition().y); fileContextMenu->onMenuItemClick.disconnectAll(); - fileContextMenu->onMenuItemClick( - [this, filePath](const std::vector &hierarchy) { - if (hierarchy[0] == "Copy full path") { - SetClipboardText(filePath.c_str()); - } - if (hierarchy[0] == "Delete.") { - auto messageBox = tgui::MessageBox::create(); - messageBox->setText("Are you sure?"); - messageBox->addButton("Yes"); - messageBox->addButton("No"); - messageBox->setButtonAlignment( - tgui::HorizontalAlignment::Right); - EditorGuiService::centerWidget(messageBox); - - std::weak_ptr weakBox = messageBox; - - messageBox->onButtonPress( - [this, weakBox, - filePath](const tgui::String &button) { - assert(button == "Yes" || button == "No"); - if (auto box = weakBox.lock()) { - if (button == "Yes") { - std::error_code ec; - std::filesystem::remove(filePath, ec); - addResourceButtons(listedResourcesType); - } - - if (auto parent = box->getParent()) - parent->remove(box); - } - }); - - Editor::instance->getGui().gui->add(messageBox); - } - }); + fileContextMenu->onMenuItemClick([this, filePath](const std::vector &hierarchy) { + if (hierarchy[0] == "Copy full path") { + SetClipboardText(filePath.c_str()); + } + if (hierarchy[0] == "Delete.") { + auto messageBox = tgui::MessageBox::create(); + messageBox->setText("Are you sure?"); + messageBox->addButton("Yes"); + messageBox->addButton("No"); + messageBox->setButtonAlignment(tgui::HorizontalAlignment::Right); + EditorGuiService::centerWidget(messageBox); + + std::weak_ptr weakBox = messageBox; + + messageBox->onButtonPress([this, weakBox, filePath](const tgui::String &button) { + assert(button == "Yes" || button == "No"); + if (auto box = weakBox.lock()) { + if (button == "Yes") { + std::error_code ec; + std::filesystem::remove(filePath, ec); + addResourceButtons(listedResourcesType); + } + + if (auto parent = box->getParent()) parent->remove(box); + } + }); + + Editor::instance->getGui().gui->add(messageBox); + } + }); fileContextMenu->openMenu(); }); @@ -359,9 +338,7 @@ ResizableContainer::Ptr ProjectScreen::createResourcesList() { auto project = Editor::instance->getProject(); TranslationService &tService = Editor::instance->getTranslations(); - auto group = ResizableContainer::create( - {modifiable_RESLIST_W, tgui::Layout("100%") - TOOLBAR_H}, - {0, TOOLBAR_H}); + auto group = ResizableContainer::create({modifiable_RESLIST_W, tgui::Layout("100%") - TOOLBAR_H}, {0, TOOLBAR_H}); group->enableResize(ResizeDirection::RIGHT); group->setMinResizeWidth(MIN_RESLIST_W); group->setMaxResizeWidth(MAX_RESLIST_W); @@ -382,9 +359,7 @@ ResizableContainer::Ptr ProjectScreen::createResourcesList() { group->add(resourceChoose); auto createResourceBtn = tgui::Button::create(); - bindTranslation(createResourceBtn, - "screen.project.create_new_resource", - &tgui::Button::setText); + bindTranslation(createResourceBtn, "screen.project.create_new_resource", &tgui::Button::setText); createResourceBtn->setPosition(0, tgui::bindBottom(resourceChoose)); createResourceBtn->setSize("100%", RESLIST_CREATE_RES_BTN_H); createResourceBtn->onPress([this] { @@ -398,13 +373,10 @@ ResizableContainer::Ptr ProjectScreen::createResourcesList() { group->add(createResourceBtn); auto resourceListPanel = tgui::ScrollablePanel::create( - {"100%", tgui::Layout("100%") - - (RESLIST_RES_CHOOSE_H + RESLIST_CREATE_RES_BTN_H)}); + {"100%", tgui::Layout("100%") - (RESLIST_RES_CHOOSE_H + RESLIST_CREATE_RES_BTN_H)}); resourceListPanel->setPosition(0, tgui::bindBottom(createResourceBtn)); - resourceListPanel->getVerticalScrollbar()->setPolicy( - tgui::Scrollbar::Policy::Automatic); - resourceListPanel->getHorizontalScrollbar()->setPolicy( - tgui::Scrollbar::Policy::Never); + resourceListPanel->getVerticalScrollbar()->setPolicy(tgui::Scrollbar::Policy::Automatic); + resourceListPanel->getHorizontalScrollbar()->setPolicy(tgui::Scrollbar::Policy::Never); resourcesLayout = tgui::GrowVerticalLayout::create(); resourceListPanel->add(resourcesLayout); @@ -416,8 +388,7 @@ ResizableContainer::Ptr ProjectScreen::createResourcesList() { }); if (project != nullptr) { - EngineFileType currentFileType = - static_cast(resourceChoose->getSelectedItemIndex()); + EngineFileType currentFileType = static_cast(resourceChoose->getSelectedItemIndex()); addResourceButtons(currentFileType); } diff --git a/src/editor/services/childWindowSubService.cpp b/src/editor/services/childWindowSubService.cpp index 62781fb0..59f3a9d7 100644 --- a/src/editor/services/childWindowSubService.cpp +++ b/src/editor/services/childWindowSubService.cpp @@ -1,25 +1,26 @@ #include "services/childWindowSubService.hpp" + +#include + #include "childWindows/aboutWindow.hpp" #include "childWindows/popupWindow.hpp" +#include "childWindows/projectSettingsWindow.hpp" #include "childWindows/settingsWindow.hpp" -#include ChildWindowSubService::ChildWindowSubService() { this->createWindows(); } void ChildWindowSubService::createWindows() { - if (!this->childWindows.empty()) - this->childWindows.clear(); + if (!this->childWindows.empty()) this->childWindows.clear(); + + this->childWindows.try_emplace("about", std::unique_ptr(new AboutWindow())); - this->childWindows.try_emplace( - "about", std::unique_ptr(new AboutWindow())); + this->childWindows.try_emplace("options", std::unique_ptr(new SettingsWindow())); - this->childWindows.try_emplace( - "options", std::unique_ptr(new SettingsWindow())); + this->childWindows.try_emplace("project_settings", std::make_unique()); } void ChildWindowSubService::openWindow(const std::string &windowName) { - if (this->childWindows.count(windowName) == 1) - this->childWindows[windowName]->open(); + if (this->childWindows.count(windowName) == 1) this->childWindows[windowName]->open(); } void ChildWindowSubService::resetAndOpen(const std::string windowName) { From 12b5999637bc262b0cf6dbdb3800ac61713d321a Mon Sep 17 00:00:00 2001 From: CDevv Date: Thu, 9 Apr 2026 19:27:39 +0300 Subject: [PATCH 10/69] Remove tree-sitter dependencies + remove codeEditor code --- include/editor/fileViews/codeFileView.hpp | 15 - include/editor/views/codeView.hpp | 34 - include/editor/widgets/codeEditor.hpp | 72 -- src/editor/fileViews/codeFileView.cpp | 70 -- src/editor/projectFileVisitor.cpp | 102 +- src/editor/views/codeView.cpp | 56 - src/editor/widgets/codeEditor.cpp | 1144 --------------------- xmake.lua | 6 +- 8 files changed, 37 insertions(+), 1462 deletions(-) delete mode 100644 include/editor/fileViews/codeFileView.hpp delete mode 100644 include/editor/views/codeView.hpp delete mode 100644 include/editor/widgets/codeEditor.hpp delete mode 100644 src/editor/fileViews/codeFileView.cpp delete mode 100644 src/editor/views/codeView.cpp delete mode 100644 src/editor/widgets/codeEditor.cpp diff --git a/include/editor/fileViews/codeFileView.hpp b/include/editor/fileViews/codeFileView.hpp deleted file mode 100644 index 96ff8b02..00000000 --- a/include/editor/fileViews/codeFileView.hpp +++ /dev/null @@ -1,15 +0,0 @@ - -#ifndef RPGPP_CODEFILEVIEW_H -#define RPGPP_CODEFILEVIEW_H -#include "fileView.hpp" -#include "views/codeView.hpp" - -class CodeFileView : public FileView { - CodeView::Ptr codeEditor; - - public: - CodeFileView(); - void init(tgui::Group::Ptr layout, VariantWrapper *variant) override; -}; - -#endif // RPGPP_CODEFILEVIEW_H diff --git a/include/editor/views/codeView.hpp b/include/editor/views/codeView.hpp deleted file mode 100644 index 8aa88a5c..00000000 --- a/include/editor/views/codeView.hpp +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef _RPGPP_CODEVIEW_H -#define _RPGPP_CODEVIEW_H - -#include "scriptFile.h" -#include "tree_sitter/api.h" -#include "views/worldView.hpp" -#include -#include - -struct HighlightInformation {}; - -class CodeView : public WorldView { - - private: - ScriptFile *scriptFile; - TSTree *tsTree; - - public: - CodeView(); - CodeView(ScriptFile *scriptFile); - - typedef std::shared_ptr Ptr; - - static CodeView::Ptr create(ScriptFile *scriptFile); - static CodeView::Ptr create(); - - void setCode(ScriptFile *scriptFile); - void mouseMoved(tgui::Vector2f pos) override; - - void drawCanvas() override; - void doTree(TSTreeCursor cursor, TSNode node); -}; - -#endif /* _RPGPP_CODEVIEW_H */ diff --git a/include/editor/widgets/codeEditor.hpp b/include/editor/widgets/codeEditor.hpp deleted file mode 100644 index 7e09a81b..00000000 --- a/include/editor/widgets/codeEditor.hpp +++ /dev/null @@ -1,72 +0,0 @@ - -#ifndef RPGPP_CODEEDITOR_H -#define RPGPP_CODEEDITOR_H -#include "TGUI/String.hpp" -#include "TGUI/Text.hpp" -#include "TGUI/Vector2.hpp" -#include "TGUI/Widgets/TextArea.hpp" -#include "syntaxHighlighter.hpp" -#include "tree_sitter/api.h" -#include -#include -#include -#include -#include -class CodeEditor : public tgui::TextArea { - public: - typedef std::shared_ptr Ptr; - - static Ptr create(); - CodeEditor(); - ~CodeEditor(); - - void draw(tgui::BackendRenderTarget &target, - tgui::RenderStates states) const override; - - void setCode(tgui::String text); - - private: - TSParser *syntaxParser; - TSTree *tsTree{nullptr}; - - // std::vector> highlightTree; - - std::vector highlightVec; - std::vector fuck; - tgui::Text textWhole; - std::list list; - - tgui::Text constructText(const tgui::String &, - tgui::Vector2f position) const; - tgui::Text constructText(const tgui::String &text) const; - tgui::Text constructText(const tgui::String &text, - const tgui::Color &color) const; - - bool canGainFocus() const override; - bool leftMousePressed(tgui::Vector2f pos) override; - void mouseMoved(tgui::Vector2f pos) override; - bool scrolled(float delta, tgui::Vector2f pos, bool touch) override; - void textEntered(char32_t key) override; - void keyPressed(const tgui::Event::KeyEvent &event) override; - - void backspaceKeyPressed(); - - void parseNode(const TSTreeCursor &cursor, const TSNode &node, - std::list &list); - - std::vector - getStructsFromText(const tgui::String &text); - - tgui::Vector2 findCaretPosition(tgui::Vector2f pos) const; - - void updateSelectionTexts(); - void recalculatePositions(); - - void recalculateVisibleLines(); - std::size_t getColumnAt(std::size_t a) const; - std::size_t getLineAt(std::size_t a) const; - - tgui::Vector2f findCharacterPosWhole(std::size_t pos) const; -}; - -#endif // RPGPP_CODEEDITOR_H diff --git a/src/editor/fileViews/codeFileView.cpp b/src/editor/fileViews/codeFileView.cpp deleted file mode 100644 index d5dadf7d..00000000 --- a/src/editor/fileViews/codeFileView.cpp +++ /dev/null @@ -1,70 +0,0 @@ -#include "fileViews/codeFileView.hpp" - -#include "editor.hpp" -#include "scriptFile.h" -#include "views/codeView.hpp" -#include "widgets/codeEditor.hpp" - -#include "tree_sitter/tree-sitter-lua.h" -#include -#include - -/* -void do_tree_node(TSTreeCursor cursor, TSNode node) { - printf("====== \n"); - printf("type: %s \n", ts_node_type(node)); - printf("start byte: %u \n", ts_node_start_byte(node)); - printf("end byte: %u \n", ts_node_end_byte(node)); - printf("====== \n"); - - auto copy = ts_tree_cursor_copy(&cursor); - bool hasChild = ts_tree_cursor_goto_first_child(©); - if (hasChild) { - do_tree_node(copy, ts_tree_cursor_current_node(©)); - } - - auto copy2 = ts_tree_cursor_copy(&cursor); - bool hasSibling = ts_tree_cursor_goto_next_sibling(©2); - if (hasSibling) { - do_tree_node(copy2, ts_tree_cursor_current_node(©2)); - } -} -*/ - -CodeFileView::CodeFileView() { - codeEditor = CodeView::create(); - - Editor::instance->getGui().addUpdate( - codeEditor->asUpdatable(this->codeEditor)); - - codeEditor->setTextSize(24); - codeEditor->setSize({"100%", "100%"}); - - widgetContainer.push_back(codeEditor); -} - -void CodeFileView::init(tgui::Group::Ptr layout, VariantWrapper *variant) { - this->variant = variant; - - if (variant != nullptr) { - const auto ptr = dynamic_cast *>(variant); - - /* - TSParser *parser = ts_parser_new(); - - ts_parser_set_language(parser, tree_sitter_lua()); - - auto tree = ts_parser_parse_string( - parser, nullptr, ptr->get()->getFileContents().c_str(), - ptr->get()->getFileContents().size()); - - auto root = ts_tree_root_node(tree); - - auto cursor = ts_tree_cursor_new(root); - do_tree_node(cursor, root); - */ - - codeEditor->setCode(ptr->get()); - addWidgets(layout); - } -} diff --git a/src/editor/projectFileVisitor.cpp b/src/editor/projectFileVisitor.cpp index 09a0b4d5..cf607dde 100644 --- a/src/editor/projectFileVisitor.cpp +++ b/src/editor/projectFileVisitor.cpp @@ -1,9 +1,11 @@ #include "projectFileVisitor.hpp" +#include +#include + #include "actor.hpp" #include "dialogue.hpp" #include "fileViews/actorFileView.hpp" -#include "fileViews/codeFileView.hpp" #include "fileViews/dialogueFileView.hpp" #include "fileViews/emptyView.hpp" #include "fileViews/fileView.hpp" @@ -22,8 +24,6 @@ #include "services/fileSystemService.hpp" #include "tileset.hpp" #include "variant.hpp" -#include -#include ProjectFileVisitor::ProjectFileVisitor() { funcs[static_cast(EngineFileType::FILE_TILESET)] = tilesetView; @@ -39,107 +39,75 @@ ProjectFileVisitor::ProjectFileVisitor() { funcs[static_cast(EngineFileType::FILE_MUSIC)] = musicView; } -std::unique_ptr -ProjectFileVisitor::visit(EngineFileType fileType, const std::string &path) { +std::unique_ptr ProjectFileVisitor::visit(EngineFileType fileType, const std::string &path) { if (funcs.at(static_cast(fileType)) == nullptr) { return emptyView(path); } return funcs[static_cast(fileType)](path); } -std::unique_ptr -ProjectFileVisitor::emptyView(const std::string &path) { +std::unique_ptr ProjectFileVisitor::emptyView(const std::string &path) { return std::make_unique(); } -std::unique_ptr -ProjectFileVisitor::tilesetView(const std::string &path) { +std::unique_ptr ProjectFileVisitor::tilesetView(const std::string &path) { std::unique_ptr view = std::make_unique(); - std::unique_ptr variant = - std::make_unique>(new TileSet(path)); - return std::make_unique(std::move(view), std::move(variant), - EngineFileType::FILE_TILESET); + std::unique_ptr variant = std::make_unique>(new TileSet(path)); + return std::make_unique(std::move(view), std::move(variant), EngineFileType::FILE_TILESET); } -std::unique_ptr -ProjectFileVisitor::roomView(const std::string &path) { +std::unique_ptr ProjectFileVisitor::roomView(const std::string &path) { std::unique_ptr view = std::make_unique(); - std::unique_ptr variant = - std::make_unique>(new Room(path)); - return std::make_unique(std::move(view), std::move(variant), - EngineFileType::FILE_MAP); + std::unique_ptr variant = std::make_unique>(new Room(path)); + return std::make_unique(std::move(view), std::move(variant), EngineFileType::FILE_MAP); } -std::unique_ptr -ProjectFileVisitor::codeView(const std::string &path) { +std::unique_ptr ProjectFileVisitor::codeView(const std::string &path) { std::unique_ptr view = std::make_unique(); - std::unique_ptr variant = - std::make_unique>(new ScriptFile(path)); - auto res = std::make_unique( - std::move(view), std::move(variant), EngineFileType::FILE_SCRIPT); + std::unique_ptr variant = std::make_unique>(new ScriptFile(path)); + auto res = std::make_unique(std::move(view), std::move(variant), EngineFileType::FILE_SCRIPT); res->isEmpty = true; return std::move(res); } -std::unique_ptr -ProjectFileVisitor::dialogueView(const std::string &path) { +std::unique_ptr ProjectFileVisitor::dialogueView(const std::string &path) { std::unique_ptr view = std::make_unique(); - std::unique_ptr variant = - std::make_unique>(new Dialogue(path)); - return std::make_unique(std::move(view), std::move(variant), - EngineFileType::FILE_DIALOGUE); + std::unique_ptr variant = std::make_unique>(new Dialogue(path)); + return std::make_unique(std::move(view), std::move(variant), EngineFileType::FILE_DIALOGUE); } -std::unique_ptr -ProjectFileVisitor::actorView(const std::string &path) { +std::unique_ptr ProjectFileVisitor::actorView(const std::string &path) { std::unique_ptr view = std::make_unique(); - std::unique_ptr variant = - std::make_unique>(new Actor(path)); - return std::make_unique(std::move(view), std::move(variant), - EngineFileType::FILE_ACTOR); + std::unique_ptr variant = std::make_unique>(new Actor(path)); + return std::make_unique(std::move(view), std::move(variant), EngineFileType::FILE_ACTOR); } -std::unique_ptr -ProjectFileVisitor::propView(const std::string &path) { +std::unique_ptr ProjectFileVisitor::propView(const std::string &path) { std::unique_ptr view = std::make_unique(); - std::unique_ptr variant = - std::make_unique>(new Prop(path)); - return std::make_unique(std::move(view), std::move(variant), - EngineFileType::FILE_PROP); + std::unique_ptr variant = std::make_unique>(new Prop(path)); + return std::make_unique(std::move(view), std::move(variant), EngineFileType::FILE_PROP); } -std::unique_ptr -ProjectFileVisitor::imageView(const std::string &path) { +std::unique_ptr ProjectFileVisitor::imageView(const std::string &path) { std::unique_ptr view = std::make_unique(); - std::unique_ptr variant = - std::make_unique>(new ImageWrapper(path)); - return std::make_unique(std::move(view), std::move(variant), - EngineFileType::FILE_IMAGE, false); + std::unique_ptr variant = std::make_unique>(new ImageWrapper(path)); + return std::make_unique(std::move(view), std::move(variant), EngineFileType::FILE_IMAGE, false); } -std::unique_ptr -ProjectFileVisitor::fontView(const std::string &path) { +std::unique_ptr ProjectFileVisitor::fontView(const std::string &path) { std::unique_ptr view = std::make_unique(); - std::unique_ptr variant = - std::make_unique>(new FontWrapper(path)); - return std::make_unique(std::move(view), std::move(variant), - EngineFileType::FILE_FONT, false); + std::unique_ptr variant = std::make_unique>(new FontWrapper(path)); + return std::make_unique(std::move(view), std::move(variant), EngineFileType::FILE_FONT, false); } -std::unique_ptr -ProjectFileVisitor::soundView(const std::string &path) { +std::unique_ptr ProjectFileVisitor::soundView(const std::string &path) { std::unique_ptr view = std::make_unique(); - std::unique_ptr variant = - std::make_unique>(new SoundWrapper(path)); - return std::make_unique(std::move(view), std::move(variant), - EngineFileType::FILE_SOUND, false); + std::unique_ptr variant = std::make_unique>(new SoundWrapper(path)); + return std::make_unique(std::move(view), std::move(variant), EngineFileType::FILE_SOUND, false); } -std::unique_ptr -ProjectFileVisitor::musicView(const std::string &path) { +std::unique_ptr ProjectFileVisitor::musicView(const std::string &path) { std::unique_ptr view = std::make_unique(); - std::unique_ptr variant = - std::make_unique>(new SoundWrapper(path)); - return std::make_unique(std::move(view), std::move(variant), - EngineFileType::FILE_MUSIC, false); + std::unique_ptr variant = std::make_unique>(new SoundWrapper(path)); + return std::make_unique(std::move(view), std::move(variant), EngineFileType::FILE_MUSIC, false); } diff --git a/src/editor/views/codeView.cpp b/src/editor/views/codeView.cpp deleted file mode 100644 index c97ae7a3..00000000 --- a/src/editor/views/codeView.cpp +++ /dev/null @@ -1,56 +0,0 @@ -#include "views/codeView.hpp" -#include "TGUI/Vector2.hpp" -#include "raylib.h" -#include "scriptFile.h" -#include "tree_sitter/api.h" -#include "views/worldView.hpp" -#include - -CodeView::CodeView(ScriptFile *scriptFile) : scriptFile(scriptFile) {} - -CodeView::CodeView() {} - -void CodeView::doTree(TSTreeCursor cursor, TSNode node) { - - auto copy = ts_tree_cursor_copy(&cursor); - bool hasChild = ts_tree_cursor_goto_first_child(©); - if (hasChild) { - this->doTree(copy, ts_tree_cursor_current_node(©)); - } - - auto copy2 = ts_tree_cursor_copy(&cursor); - bool hasSibling = ts_tree_cursor_goto_next_sibling(©2); - if (hasSibling) { - this->doTree(copy2, ts_tree_cursor_current_node(©2)); - } -} - -CodeView::Ptr CodeView::create(ScriptFile *scriptFile) { - return std::make_shared(scriptFile); -} - -CodeView::Ptr CodeView::create() { return std::make_shared(); } - -void CodeView::setCode(ScriptFile *scriptFile) { - this->scriptFile = scriptFile; - - /* - auto parser = ts_parser_new(); - - ts_parser_set_language(parser, tree_sitter_lua()); - auto fileContents = this->scriptFile->getFileContents().c_str(); - - tsTree = ts_parser_parse_string(parser, nullptr, fileContents, - strlen(fileContents)); - - - const auto rootNode = ts_tree_root_node(tsTree); - const auto cursor = ts_tree_cursor_new(rootNode); - - this->doTree(cursor, rootNode); - */ -} - -void CodeView::drawCanvas() { ClearBackground(BLACK); } - -void CodeView::mouseMoved(tgui::Vector2f pos) { WorldView::mouseMoved(pos); } \ No newline at end of file diff --git a/src/editor/widgets/codeEditor.cpp b/src/editor/widgets/codeEditor.cpp deleted file mode 100644 index 79173f87..00000000 --- a/src/editor/widgets/codeEditor.cpp +++ /dev/null @@ -1,1144 +0,0 @@ -/* - DEPRECATED -*/ - -#include "widgets/codeEditor.hpp" -#include "TGUI/Backend/Renderer/BackendRenderTarget.hpp" -#include "TGUI/Backend/Renderer/BackendText.hpp" -#include "TGUI/Backend/Window/BackendGui.hpp" -#include "TGUI/Color.hpp" -#include "TGUI/String.hpp" -#include "TGUI/Text.hpp" -#include "TGUI/Vector2.hpp" -#include "TGUI/Widgets/TextArea.hpp" -#include "editor.hpp" -#include "raylib.h" -#include "syntaxHighlighter.hpp" -#include "tree_sitter/tree-sitter-lua.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -using namespace tgui; - -#define CODE_EDITOR_LEFT_COLUMN 100.0f - -// TODO: IMPLEMENT A BETTER SYNTAX COLORS MAP! -std::map SYNTAX_COLORS = { - {"ERROR", {tgui::Color::Red, tgui::TextStyle::Regular}}, - {"local", {tgui::Color::Red, tgui::TextStyle::Regular}}, - {"number", {tgui::Color::Green, tgui::TextStyle::Regular}}, - {"string_content", {tgui::Color::Cyan, tgui::TextStyle::Regular}}, - {"identifier", {tgui::Color::Magenta, tgui::TextStyle::Regular}}, - {"function", {tgui::Color::Yellow, tgui::TextStyle::Regular}}, - {"function_call", {tgui::Color::Yellow, tgui::TextStyle::Regular}}, - {"\"", {tgui::Color::Cyan, tgui::TextStyle::Regular}}, - {"(", {tgui::Color::White, tgui::TextStyle::Regular}}, - {")", {tgui::Color::White, tgui::TextStyle::Regular}}, - {"end", {tgui::Color::Yellow, tgui::TextStyle::Regular}}, - {"--", {tgui::Color(84, 81, 103), tgui::TextStyle::Regular}}, - {"comment_content", {tgui::Color(84, 81, 103), tgui::TextStyle::Regular}}}; - -CodeEditor::CodeEditor() { - - this->syntaxParser = ts_parser_new(); - - ts_parser_set_language(this->syntaxParser, tree_sitter_lua()); - - this->onTextChange.connect([&](const tgui::String &text) { - // this->constructHighlightedText(text, this->highlightTree.size() > 0); - textWhole = constructText(m_text); - }); - - this->setMouseCursor(Cursor::Type::Text); -} - -CodeEditor::~CodeEditor() { - ts_parser_delete(this->syntaxParser); - if (tsTree != nullptr) { - ts_tree_delete(tsTree); - } -} - -tgui::Vector2f CodeEditor::findCharacterPosWhole(std::size_t pos) const { - return textWhole.findCharacterPos(pos); -} - -CodeEditor::Ptr CodeEditor::create() { return std::make_shared(); } - -void CodeEditor::parseNode(const TSTreeCursor &cursor, const TSNode &node, - std::list &list) { - - m_lines = m_text.split("\n"); - - auto nodeStartPoint = ts_node_start_point(node); - auto nodeEndPoint = ts_node_end_point(node); - - if (ts_node_child_count(node) == 0) { - printf("%s. \n", ts_node_type(node)); - - auto row = static_cast(ts_node_start_point(node).row); - auto column = static_cast(ts_node_start_point(node).column); - - if (row > m_lines.size() - 1) { - return; - } - - auto rowString = m_lines[row].toStdString(); - - std::string lineBefore = - TextSubtext(rowString.c_str(), 0, ts_node_start_point(node).column); - - auto textLineBefore = constructText(lineBefore); - - /* - std::string subtext = - TextSubtext(m_text.toStdString().c_str(), ts_node_start_byte(node), - ts_node_end_byte(node)); - - int j = 0; - std::string s = ""; - for (auto c : subtext) { - if (c == '\n') { - if (j != subtext.size() - 1) { - printf("%s \n", s.c_str()); - s = ""; - } - } else { - s.push_back(c); - } - j++; - } - printf("%s \n", s.c_str()); - */ - - auto text = this->constructText(TextSubtext( - m_lines[row].toStdString().c_str(), - ts_node_start_point(node).column, ts_node_end_point(node).column)); - - // auto text = constructText(s); - - if (SYNTAX_COLORS.count(ts_node_type(node)) > 0) { - text.setColor(SYNTAX_COLORS[ts_node_type(node)].color); - } else { - text.setColor(tgui::Color::White); - } - - auto a = textLineBefore.getLineWidth(); - auto b = textLineBefore.getLineHeight() * row; - - EditorHighlighting::TextPiece piece; - piece.text = text; - piece.pos = {a, b}; - piece.nodeStart = ts_node_start_byte(node); - piece.nodeEnd = ts_node_end_byte(node); - - list.push_back(piece); - } - - auto copy = ts_tree_cursor_copy(&cursor); - if (ts_tree_cursor_goto_first_child(©)) - parseNode(copy, ts_tree_cursor_current_node(©), list); - - auto copy2 = ts_tree_cursor_copy(&cursor); - if (ts_tree_cursor_goto_next_sibling(©2)) - parseNode(copy2, ts_tree_cursor_current_node(©2), list); -} - -std::vector -CodeEditor::getStructsFromText(const tgui::String &text_ref) { - std::vector highlighter = {}; - - const auto textStr = text_ref.toStdString(); - const auto constCharStr = textStr.c_str(); - TSTree *syntaxTree = ts_parser_parse_string( - this->syntaxParser, nullptr, constCharStr, strlen(constCharStr)); - - const auto rootNode = ts_tree_root_node(syntaxTree); - const auto cursor = ts_tree_cursor_new(rootNode); - - tsTree = syntaxTree; - - return highlighter; -} - -void CodeEditor::setCode(tgui::String text) { - TextArea::setText(text); - - const auto textStr = getText().toStdString(); - const auto constCharStr = textStr.c_str(); - tsTree = ts_parser_parse_string(this->syntaxParser, nullptr, constCharStr, - strlen(constCharStr)); - - const auto rootNode = ts_tree_root_node(tsTree); - const auto cursor = ts_tree_cursor_new(rootNode); - - // Windows Line Endings Fix. - text.replace("\r\n", "\n"); - m_lines = text.split(U"\n"); - - parseNode(cursor, rootNode, list); -} - -bool CodeEditor::leftMousePressed(tgui::Vector2f pos) { - pos.x -= CODE_EDITOR_LEFT_COLUMN; - return TextArea::leftMousePressed(pos); -} - -void CodeEditor::textEntered(char32_t key) { - if (m_readOnly) - return; - - // Don't allow carriage return characters, they only cause trouble - if (key == '\r') - return; - - // Make sure we don't exceed our maximum characters limit - if ((m_maxChars > 0) && (m_text.length() + 1 > m_maxChars)) - return; - - auto insert = TGUI_LAMBDA_CAPTURE_EQ_THIS() { - deleteSelectedCharacters(); - - const std::size_t caretPosition = getSelectionEnd(); - - m_text.insert(caretPosition, 1, key); - m_lines[m_selEnd.y].insert(m_selEnd.x, 1, key); - - TSInputEdit edit; - edit.start_byte = caretPosition; - edit.start_point = {static_cast(m_selEnd.x), - static_cast(m_selEnd.y)}; - - edit.old_end_byte = caretPosition; - edit.old_end_point = {static_cast(m_selEnd.x), - static_cast(m_selEnd.y)}; - - edit.new_end_byte = caretPosition + 1; - edit.new_end_point = { - static_cast(getColumnAt(caretPosition + 1)), - static_cast(getLineAt(caretPosition + 1))}; - - if (tsTree == nullptr) { - const auto textStr = getText().toStdString(); - const auto constCharStr = textStr.c_str(); - TSTree *syntaxTree = - ts_parser_parse_string(this->syntaxParser, nullptr, - constCharStr, strlen(constCharStr)); - - tsTree = syntaxTree; - } - - // ts_tree_edit(tsTree, &edit); - - const auto textStr = m_text.toStdString(); - const auto constCharStr = textStr.c_str(); - TSTree *syntaxTree = ts_parser_parse_string( - this->syntaxParser, tsTree, constCharStr, strlen(constCharStr)); - - tsTree = syntaxTree; - - const auto rootNode = ts_tree_root_node(tsTree); - const auto cursor = ts_tree_cursor_new(rootNode); - - std::vector highlighter = {}; - // parseNode(cursor, rootNode, highlighter); - - // this->fuck = highlighter; - - list.clear(); - parseNode(cursor, rootNode, list); - - int count = 0; - for (int i = 0; i < getCaretLine(); i++) { - count += m_lines[i].size(); - } - /* - constructHighlightedText(highlighter, count, - count + - m_lines[getLineAt(caretPosition)].size()); - */ - - // Increment the caret position, unless you type a newline at the start - // of a line while that line only existed due to word wrapping - if ((key != U'\n') || (m_selEnd.x > 0) || (m_selEnd.y == 0) || - m_lines[m_selEnd.y - 1].empty() || - (m_text[caretPosition - 1] == U'\n')) { - m_selStart.x++; - m_selEnd.x++; - } - - // Do not emit onCaretPositionChanged signal yet, as it could be - // invalid. - rearrangeText(true, false); - }; - - // If there is a scrollbar then inserting can't go wrong - if (m_verticalScrollbar->getPolicy() != Scrollbar::Policy::Never) { - const auto oldSelEnd = m_selEnd; - insert(); - if (oldSelEnd != m_selEnd) - onCaretPositionChange.emit(this); - } else // There is no scrollbar, the text may not fit - { - // Store the data so that it can be reverted - const auto oldText = m_text; - const auto oldSelStart = m_selStart; - const auto oldSelEnd = m_selEnd; - - // Try to insert the character - insert(); - - // Undo the insert if the text does not fit - if (m_lines.size() > - static_cast(getInnerSize().y / m_lineHeight)) { - m_text = oldText; - m_selStart = oldSelStart; - m_selEnd = oldSelEnd; - - rearrangeText(true); - } - // If the caret position changed, emit signal. - else if (oldSelEnd != m_selEnd) { - onCaretPositionChange.emit(this); - } - } - - // The caret should be visible again - m_caretVisible = true; - m_animationTimeElapsed = {}; - - onTextChange.emit(this, m_text); -} - -void CodeEditor::keyPressed(const tgui::Event::KeyEvent &event) { - if (event.code == Event::KeyboardKey::Backspace) - backspaceKeyPressed(); - else - tgui::TextArea::keyPressed(event); -} - -void CodeEditor::backspaceKeyPressed() { - if (m_readOnly) - return; - - // Check that we did not select any characters - if (m_selStart == m_selEnd) { - const std::size_t pos = getSelectionEnd(); - if (pos > 0) { - if (m_selEnd.x > 0) { - // There is a specific case that we have to watch out for. When - // we are removing the last character on a line which was placed - // there by word wrap and a newline follows this character then - // the caret has to be placed at the line above (before the - // newline) instead of at the same line (after the newline) - if ((m_lines[m_selEnd.y].length() == 1) && (pos > 1) && - (pos < m_text.length()) && (m_text[pos - 2] != '\n') && - (m_text[pos] == '\n') && (m_selEnd.y > 0)) { - m_selEnd.y--; - m_selEnd.x = m_lines[m_selEnd.y].length(); - } else // Just remove the character normally - --m_selEnd.x; - } else // At the beginning of the line - { - if (m_selEnd.y > 0) { - --m_selEnd.y; - m_selEnd.x = m_lines[m_selEnd.y].length(); - - if ((m_text[pos - 1] != '\n') && m_selEnd.x > 0) - --m_selEnd.x; - } - } - - m_selStart = m_selEnd; - - m_text.erase(pos - 1, 1); - - // treesitter - - TSInputEdit edit; - edit.start_byte = pos; - edit.start_point = {static_cast(getColumnAt(pos)), - static_cast(getLineAt(pos))}; - - edit.old_end_byte = pos; - edit.old_end_point = {static_cast(getColumnAt(pos)), - static_cast(getLineAt(pos))}; - - edit.new_end_byte = pos - 1; - edit.new_end_point = {static_cast(getColumnAt(pos - 1)), - static_cast(getLineAt(pos - 1))}; - - if (tsTree == nullptr) { - const auto textStr = getText().toStdString(); - const auto constCharStr = textStr.c_str(); - TSTree *syntaxTree = - ts_parser_parse_string(this->syntaxParser, nullptr, - constCharStr, strlen(constCharStr)); - - tsTree = syntaxTree; - } - - // ts_tree_edit(tsTree, &edit); - - const auto textStr = getText().toStdString(); - const auto constCharStr = textStr.c_str(); - TSTree *syntaxTree = - ts_parser_parse_string(this->syntaxParser, nullptr, - constCharStr, strlen(constCharStr)); - - tsTree = syntaxTree; - - const auto rootNode = ts_tree_root_node(tsTree); - const auto cursor = ts_tree_cursor_new(rootNode); - - list.clear(); - parseNode(cursor, rootNode, list); - - // If the "special case" above passes, and we let rearrangeText() - // emit the onCaretPositionChange signal, the same signal will be - // emitted twice. So prevent sending signal in rearrangeText() and - // always send it manually afterwards. - rearrangeText(true, false); - onCaretPositionChange.emit(this); - } - } else // When you did select some characters then delete them - deleteSelectedCharacters(); - - // The caret should be visible again - m_caretVisible = true; - m_animationTimeElapsed = {}; - - onTextChange.emit(this, m_text); -} - -void CodeEditor::recalculatePositions() { - if (!m_fontCached) - return; - - float textOffset = - Text::getExtraHorizontalPadding(m_fontCached, m_textSizeCached); - - // Calculate the position of the text objects - m_selectionRects.clear(); - m_textBeforeSelection.setPosition( - {textOffset + CODE_EDITOR_LEFT_COLUMN, 0}); - m_defaultText.setPosition({textOffset + CODE_EDITOR_LEFT_COLUMN, 0}); - - if (m_selStart != m_selEnd) { - auto selectionStart = m_selStart; - auto selectionEnd = m_selEnd; - - if ((m_selStart.y > m_selEnd.y) || - ((m_selStart.y == m_selEnd.y) && (m_selStart.x > m_selEnd.x))) - std::swap(selectionStart, selectionEnd); - - float kerningSelectionStart = 0; - if ((selectionStart.x > 0) && - (selectionStart.x < m_lines[selectionStart.y].length())) - kerningSelectionStart = m_fontCached.getKerning( - m_lines[selectionStart.y][selectionStart.x - 1], - m_lines[selectionStart.y][selectionStart.x], m_textSizeCached, - false); - - float kerningSelectionEnd = 0; - if ((selectionEnd.x > 0) && - (selectionEnd.x < m_lines[selectionEnd.y].length())) - kerningSelectionEnd = m_fontCached.getKerning( - m_lines[selectionEnd.y][selectionEnd.x - 1], - m_lines[selectionEnd.y][selectionEnd.x], m_textSizeCached, - false); - - if (selectionStart.x > 0) { - m_textSelection1.setPosition( - {textOffset + - m_textBeforeSelection - .findCharacterPos( - m_textBeforeSelection.getString().length()) - .x + - kerningSelectionStart + CODE_EDITOR_LEFT_COLUMN, - m_textBeforeSelection.getPosition().y + - (selectionStart.y * m_lineHeight)}); - } else - m_textSelection1.setPosition( - {textOffset + CODE_EDITOR_LEFT_COLUMN, - m_textBeforeSelection.getPosition().y + - (selectionStart.y * m_lineHeight)}); - - m_textSelection2.setPosition( - {textOffset + CODE_EDITOR_LEFT_COLUMN, - static_cast((selectionStart.y + 1) * m_lineHeight)}); - - if (!m_textSelection2.getString().empty() || (selectionEnd.x == 0)) { - m_textAfterSelection1.setPosition( - {textOffset + - m_textSelection2 - .findCharacterPos( - m_textSelection2.getString().length()) - .x + - kerningSelectionEnd + CODE_EDITOR_LEFT_COLUMN, - m_textSelection2.getPosition().y + - ((selectionEnd.y - selectionStart.y - 1) * m_lineHeight)}); - } else - m_textAfterSelection1.setPosition( - {m_textSelection1.getPosition().x + - m_textSelection1 - .findCharacterPos( - m_textSelection1.getString().length()) - .x + - kerningSelectionEnd, - m_textSelection1.getPosition().y}); - - m_textAfterSelection2.setPosition( - {textOffset + CODE_EDITOR_LEFT_COLUMN, - static_cast(selectionEnd.y + 1) * m_lineHeight}); - - // Recalculate the selection rectangles - { - m_selectionRects.emplace_back(m_textSelection1.getPosition().x, - static_cast(selectionStart.y) * - m_lineHeight, - 0.f, m_lineHeight); - - if (!m_lines[selectionStart.y].empty()) { - m_selectionRects.back().width = - m_textSelection1 - .findCharacterPos(m_textSelection1.getString().length()) - .x; - - // There is kerning when the selection is on just this line - if (selectionStart.y == selectionEnd.y) - m_selectionRects.back().width += kerningSelectionEnd; - } - - /// TODO: Implement a way to calculate text size without creating a - /// text object? - Text tempText; - tempText.setFont(m_fontCached); - tempText.setCharacterSize(getTextSize()); - for (std::size_t i = selectionStart.y + 1; i < selectionEnd.y; - ++i) { - m_selectionRects.back().width += textOffset; - m_selectionRects.emplace_back( - m_textSelection2.getPosition().x - textOffset, - static_cast(i) * m_lineHeight, textOffset, - m_lineHeight); - - if (!m_lines[i].empty()) { - tempText.setString(m_lines[i]); - m_selectionRects.back().width += - tempText.findCharacterPos(tempText.getString().length()) - .x; - } - } - - if (selectionStart.y != selectionEnd.y) { - m_selectionRects.back().width += textOffset; - - if (!m_textSelection2.getString().empty()) { - tempText.setString( - m_lines[selectionEnd.y].substr(0, selectionEnd.x)); - m_selectionRects.emplace_back( - m_textSelection2.getPosition().x - textOffset, - static_cast(selectionEnd.y) * m_lineHeight, - textOffset + - tempText - .findCharacterPos(tempText.getString().length()) - .x + - kerningSelectionEnd, - m_lineHeight); - } else - m_selectionRects.emplace_back( - 0.f, static_cast(selectionEnd.y) * m_lineHeight, - textOffset, m_lineHeight); - } - } - } - - if (m_parentGui) { - const Vector2f caretPosition = { - m_caretPosition.x + m_bordersCached.getLeft() + - m_paddingCached.getLeft() - - static_cast(m_horizontalScrollbar->getValue()), - m_caretPosition.y + m_bordersCached.getTop() + - m_paddingCached.getTop() - - static_cast(m_verticalScrollbar->getValue())}; - const auto absoluteLineTopPos = - getAbsolutePosition({0, caretPosition.y}); - const float caretHeight = std::max( - m_fontCached.getFontHeight(m_textSizeCached), m_lineHeight); - const FloatRect inputRect = { - absoluteLineTopPos, - getAbsolutePosition({getSize().x, caretPosition.y + caretHeight}) - - absoluteLineTopPos}; - m_parentGui->updateTextCursorPosition( - inputRect, - getAbsolutePosition( - {caretPosition.x + m_caretWidthCached, caretPosition.y})); - } - - recalculateVisibleLines(); -} - -void CodeEditor::updateSelectionTexts() { - // If there is no selection then just put the whole text in - // m_textBeforeSelection - if (m_selStart == m_selEnd) { - String displayedText; - for (const auto &line : m_lines) - displayedText += line + U"\n"; - - m_textBeforeSelection.setString(displayedText); - m_textSelection1.setString(U""); - m_textSelection2.setString(U""); - m_textAfterSelection1.setString(U""); - m_textAfterSelection2.setString(U""); - } else // Some text is selected - { - auto selectionStart = m_selStart; - auto selectionEnd = m_selEnd; - - if ((m_selStart.y > m_selEnd.y) || - ((m_selStart.y == m_selEnd.y) && (m_selStart.x > m_selEnd.x))) - std::swap(selectionStart, selectionEnd); - - // Set the text before the selection - if (selectionStart.y > 0) { - String string; - for (std::size_t i = 0; i < selectionStart.y; ++i) - string += m_lines[i] + U"\n"; - - string += m_lines[selectionStart.y].substr(0, selectionStart.x); - m_textBeforeSelection.setString(string); - } else - m_textBeforeSelection.setString( - m_lines[0].substr(0, selectionStart.x)); - - // Set the selected text - if (m_selStart.y == m_selEnd.y) { - m_textSelection1.setString(m_lines[selectionStart.y].substr( - selectionStart.x, selectionEnd.x - selectionStart.x)); - m_textSelection2.setString(U""); - } else { - m_textSelection1.setString(m_lines[selectionStart.y].substr( - selectionStart.x, - m_lines[selectionStart.y].length() - selectionStart.x)); - - String string; - for (std::size_t i = selectionStart.y + 1; i < selectionEnd.y; ++i) - string += m_lines[i] + U"\n"; - - string += m_lines[selectionEnd.y].substr(0, selectionEnd.x); - - m_textSelection2.setString(string); - } - - // Set the text after the selection - { - m_textAfterSelection1.setString(m_lines[selectionEnd.y].substr( - selectionEnd.x, - m_lines[selectionEnd.y].length() - selectionEnd.x)); - - String string; - for (std::size_t i = selectionEnd.y + 1; i < m_lines.size(); ++i) - string += m_lines[i] + U"\n"; - - m_textAfterSelection2.setString(string); - } - } - - // Check if the caret is located above or below the view - if (m_verticalScrollbar->getPolicy() != Scrollbar::Policy::Never) { - if (m_selEnd.y <= m_topLine) - m_verticalScrollbar->setValue( - static_cast(m_selEnd.y * m_lineHeight)); - else if (m_selEnd.y + 1 >= m_topLine + m_visibleLines) - m_verticalScrollbar->setValue(static_cast( - (m_selEnd.y * m_lineHeight) + - std::max(m_fontCached.getFontHeight(m_textSizeCached), - m_lineHeight) + - Text::getExtraVerticalPadding(m_textSizeCached) - - m_verticalScrollbar->getViewportSize())); - } - - // Position the caret - { - /// TODO: Implement a way to calculate text size without creating a text - /// object? - const float textOffset = - Text::getExtraHorizontalPadding(m_fontCached, m_textSizeCached); - Text tempText; - tempText.setFont(m_fontCached); - tempText.setCharacterSize(getTextSize()); - tempText.setString(m_lines[m_selEnd.y].substr(0, m_selEnd.x)); - - float kerning = 0; - if ((m_selEnd.x > 0) && (m_selEnd.x < m_lines[m_selEnd.y].length())) - kerning = m_fontCached.getKerning( - m_lines[m_selEnd.y][m_selEnd.x - 1], - m_lines[m_selEnd.y][m_selEnd.x], m_textSizeCached, false); - - const float caretLeft = - textOffset + CODE_EDITOR_LEFT_COLUMN + - tempText.findCharacterPos(tempText.getString().length()).x + - kerning; - const float caretTop = static_cast(m_selEnd.y) * m_lineHeight; - m_caretPosition = {caretLeft, caretTop}; - } - - if (m_horizontalScrollbar->getPolicy() != Scrollbar::Policy::Never) { - const unsigned int left = m_horizontalScrollbar->getValue(); - if (m_caretPosition.x <= left) { - unsigned int newValue = static_cast(std::max( - 0, static_cast(m_caretPosition.x - - (Text::getExtraHorizontalPadding( - m_fontCached, m_textSizeCached) * - 2)))); - m_horizontalScrollbar->setValue(newValue); - } else if (m_caretPosition.x > - (left + m_horizontalScrollbar->getViewportSize())) { - unsigned int newValue = static_cast( - m_caretPosition.x + - (Text::getExtraHorizontalPadding(m_fontCached, - m_textSizeCached) * - 2) - - m_horizontalScrollbar->getViewportSize()); - m_horizontalScrollbar->setValue(newValue); - } - } - - recalculatePositions(); - - // Send an event when the selection changed - if ((m_selStart != m_lastSelection.first) || - (m_selEnd != m_lastSelection.second)) { - // Only send the event when there is an actual change, not when the - // caret position moved - if ((m_selStart != m_selEnd) || - (m_lastSelection.first != m_lastSelection.second)) - onSelectionChange.emit(this); - - m_lastSelection.first = m_selStart; - m_lastSelection.second = m_selEnd; - } -} - -void CodeEditor::mouseMoved(tgui::Vector2f pos) { - pos -= getPosition(); - - if (!m_mouseHover) - mouseEnteredWidget(); - - // The mouse has moved so a double click is no longer possible - m_possibleDoubleClick = false; - - // Check if the mouse event should go to the vertical scrollbar - if (m_verticalScrollbar->isShown() && - (m_verticalScrollbar->isMouseDown() || - m_verticalScrollbar->isMouseOnWidget(pos))) { - m_verticalScrollbar->mouseMoved(pos); - recalculateVisibleLines(); - } - - // Check if the mouse event should go to the horizontal scrollbar - else if (m_horizontalScrollbar->isShown() && - (m_horizontalScrollbar->isMouseDown() || - m_horizontalScrollbar->isMouseOnWidget(pos))) { - m_horizontalScrollbar->mouseMoved(pos); - } - - // If the mouse is held down then you are selecting text - else if (m_mouseDown) { - auto caretPosition = findCaretPosition(pos); - const auto oldSelEnd = m_selEnd; - - if (caretPosition != m_selEnd) { - m_selEnd = caretPosition; - updateSelectionTexts(); - } - - // Check if the caret is located above or below the view - if (m_verticalScrollbar->getViewportSize() < - m_verticalScrollbar->getMaximum()) { - if (m_selEnd.y <= m_topLine) - m_verticalScrollbar->setValue( - static_cast(m_selEnd.y * m_lineHeight)); - else if (m_selEnd.y + 1 >= m_topLine + m_visibleLines) - m_verticalScrollbar->setValue(static_cast( - ((m_selEnd.y + 1) * m_lineHeight) - - m_verticalScrollbar->getViewportSize())); - - recalculateVisibleLines(); - } - - if (oldSelEnd != m_selEnd) - onCaretPositionChange.emit(this); - } - - // Inform the scrollbars that the mouse is not on them - else { - m_verticalScrollbar->mouseNoLongerOnWidget(); - m_horizontalScrollbar->mouseNoLongerOnWidget(); - } -} - -tgui::Vector2 -CodeEditor::findCaretPosition(tgui::Vector2f position) const { - position.x -= m_bordersCached.getLeft() + m_paddingCached.getLeft(); - position.y -= m_bordersCached.getTop() + m_paddingCached.getTop(); - - position.x -= CODE_EDITOR_LEFT_COLUMN; - - // Don't continue when line height is 0 or when there is no font yet - if ((m_lineHeight == 0) || (m_fontCached == nullptr)) - return {m_lines[m_lines.size() - 1].size(), m_lines.size() - 1}; - - // Find on which line the mouse is - std::size_t lineNumber; - if (m_verticalScrollbar->getViewportSize() < - m_verticalScrollbar->getMaximum()) { - if (position.y + m_verticalScrollbar->getValue() < 0) - return {0, 0}; - - lineNumber = static_cast(std::floor( - (position.y + m_verticalScrollbar->getValue()) / m_lineHeight)); - } else { - if (position.y < 0) - return {0, 0}; - - lineNumber = - static_cast(std::floor(position.y / m_lineHeight)); - } - - // Check if you clicked behind everything - if (lineNumber + 1 > m_lines.size()) - return {m_lines[m_lines.size() - 1].size(), m_lines.size() - 1}; - - // Find between which character the mouse is standing - float width = - Text::getExtraHorizontalPadding(m_fontCached, m_textSizeCached) - - m_horizontalScrollbar->getValue(); - char32_t prevChar = 0; - for (std::size_t i = 0; i < m_lines[lineNumber].size(); ++i) { - float charWidth; - const char32_t curChar = m_lines[lineNumber][i]; - // if (curChar == U'\n') - // return Vector2(m_lines[lineNumber].getSize() - 1, - // lineNumber); // TextArea strips newlines but this code is kept - // for when this function is generalized - // else - if (curChar == U'\t') - charWidth = - static_cast( - m_fontCached.getGlyph(' ', getTextSize(), false).advance) * - 4; - else - charWidth = static_cast( - m_fontCached.getGlyph(curChar, getTextSize(), false).advance); - - const float kerning = - m_fontCached.getKerning(prevChar, curChar, getTextSize(), false); - if (width + charWidth + kerning <= position.x) - width += charWidth + kerning; - else { - if (position.x < width + kerning + (charWidth / 2.0f)) - return {i, lineNumber}; - else - return {i + 1, lineNumber}; - } - - prevChar = curChar; - } - - // You clicked behind the last character - return {m_lines[lineNumber].length(), lineNumber}; -} - -bool CodeEditor::scrolled(float delta, tgui::Vector2f pos, bool touch) { - const bool horizontalScrollbarCanMove = - (m_horizontalScrollbar->getViewportSize() < - m_horizontalScrollbar->getMaximum()); - const bool verticalScrollbarCanMove = - (m_verticalScrollbar->getViewportSize() < - m_verticalScrollbar->getMaximum()); - - bool scrollbarMoved = false; - if (horizontalScrollbarCanMove && !touch && - (!verticalScrollbarCanMove || - m_horizontalScrollbar->isMouseOnWidget(pos - getPosition()) || - IsKeyReleased(KEY_LEFT_SHIFT))) { - scrollbarMoved = - m_horizontalScrollbar->scrolled(delta, pos - getPosition(), touch); - } else if (verticalScrollbarCanMove) { - scrollbarMoved = - m_verticalScrollbar->scrolled(delta, pos - getPosition(), touch); - } - - if (scrollbarMoved) - recalculateVisibleLines(); - - return scrollbarMoved; -} - -void CodeEditor::recalculateVisibleLines() { - if (m_lineHeight == 0) - return; - - const float horiScrollOffset = m_horizontalScrollbar->isShown() - ? m_horizontalScrollbar->getSize().y - : 0.f; - m_visibleLines = - std::min(static_cast((getInnerSize().y - - m_paddingCached.getTopPlusBottom() - - horiScrollOffset) / - m_lineHeight), - m_lines.size()); - - // Store which area is visible - if (m_verticalScrollbar->getViewportSize() < - m_verticalScrollbar->getMaximum()) { - m_topLine = static_cast(m_verticalScrollbar->getValue() / - m_lineHeight); - - // The scrollbar may be standing between lines in which case one more - // line is visible - if (((static_cast(getInnerSize().y - - m_paddingCached.getTopPlusBottom() - - horiScrollOffset) % - static_cast(m_lineHeight)) != 0) || - ((m_verticalScrollbar->getValue() % - static_cast(m_lineHeight)) != 0)) - m_visibleLines++; - } else // There is no vertical scrollbar - { - m_topLine = 0; - m_visibleLines = std::min( - static_cast((getInnerSize().y - - m_paddingCached.getTopPlusBottom() - - horiScrollOffset) / - m_lineHeight), - m_lines.size()); - } - - if (m_horizontalScrollbar->isShown()) - m_horizontalScrollbar->setPosition( - m_bordersCached.getLeft(), getSize().y - - m_bordersCached.getBottom() - - m_horizontalScrollbar->getSize().y); - - if (m_verticalScrollbar->isShown()) - m_verticalScrollbar->setPosition({getSize().x - - m_bordersCached.getRight() - - m_verticalScrollbar->getSize().x, - m_bordersCached.getTop()}); -} - -void CodeEditor::draw(BackendRenderTarget &target, RenderStates states) const { - const RenderStates statesForScrollbar = states; - - target.drawFilledRect(states, getInnerSize(), tgui::Color::Black); - const auto &innerSize = getInnerSize(); - const auto lines = this->m_text.split("\n"); - - const auto oldStates = states; - - states.transform.translate( - {m_paddingCached.getLeft(), m_paddingCached.getTop()}); - states.transform.translate( - {-static_cast(m_horizontalScrollbar->getValue()), - -static_cast(m_verticalScrollbar->getValue())}); - - for (int i = 0; i < lines.size(); i++) { - // Text lineIndex = this->constructText(std::to_string(i + 1)); - Text lineIndex; - lineIndex.setFont(m_textAfterSelection1.getFont()); - lineIndex.setCharacterSize(m_textSize); - lineIndex.setString(std::to_string(i + 1)); - lineIndex.setColor(tgui::Color::White); - lineIndex.setPosition( - {CODE_EDITOR_LEFT_COLUMN - lineIndex.getLineWidth(), 0}); - target.drawText(states, lineIndex); - - if (this->getCaretLine() == i + 1 && m_selectionRects.empty()) { - target.drawFilledRect( - states, {m_size.x.getValue(), lineIndex.getLineHeight()}, - tgui::Color{255, 255, 255, 50}); - } - states.transform.translate({0, lineIndex.getLineHeight()}); - } - - states = oldStates; - - { - states.transform.translate( - {m_paddingCached.getLeft(), m_paddingCached.getTop()}); - - float clipWidth = getInnerSize().x - m_paddingCached.getLeftPlusRight(); - if (m_verticalScrollbar->isShown()) - clipWidth -= m_verticalScrollbar->getSize().x; - - float clipHeight = - getInnerSize().y - m_paddingCached.getTopPlusBottom(); - if (m_horizontalScrollbar->isShown()) - clipHeight -= m_horizontalScrollbar->getSize().y; - - target.addClippingLayer(states, {{}, {clipWidth, clipHeight}}); - - // Move the text according to the scrollars - states.transform.translate( - {-static_cast(m_horizontalScrollbar->getValue()), - -static_cast(m_verticalScrollbar->getValue())}); - - // Draw the background of the selected text - for (const auto &selectionRect : m_selectionRects) { - - auto leftSelection = - max(selectionRect.left, CODE_EDITOR_LEFT_COLUMN); - states.transform.translate({leftSelection, selectionRect.top}); - target.drawFilledRect( - states, - {selectionRect.width, - selectionRect.height + - (std::max(m_fontCached.getFontHeight(m_textSizeCached), - m_lineHeight) - - m_lineHeight)}, - tgui::Color::applyOpacity(m_selectedTextBackgroundColorCached, - m_opacityCached)); - states.transform.translate({-leftSelection, -selectionRect.top}); - } - - // Draw the text - if (m_text.empty()) - target.drawText(states, m_defaultText); - else { - - if (m_selStart == m_selEnd) - states.transform.translate({CODE_EDITOR_LEFT_COLUMN, 0}); - - Vector2f offsetPos = {0, 0}; - - if (m_selStart != m_selEnd) { - states.transform.translate({CODE_EDITOR_LEFT_COLUMN, 0}); - states.transform.translate({m_paddingCached.getLeft(), 0}); - } - - for (auto &textPiece : list) { - states.transform.translate(textPiece.pos); - if ((textPiece.pos.y >= m_verticalScrollbar->getValue()) && - (textPiece.pos.y < - m_verticalScrollbar->getValue() + clipHeight)) { - target.drawText(states, textPiece.text); - } - states.transform.translate(-textPiece.pos); - } - - if (m_selStart != m_selEnd) { - states.transform.translate({-CODE_EDITOR_LEFT_COLUMN, 0}); - states.transform.translate({-m_paddingCached.getLeft(), 0}); - } - states.transform.translate(-offsetPos); - - if (m_selStart == m_selEnd) - states.transform.translate({-CODE_EDITOR_LEFT_COLUMN, 0}); - } - - // Only draw the caret when needed - if (m_focused && m_caretVisible && (m_caretWidthCached > 0)) { - const float caretHeight = std::max( - m_fontCached.getFontHeight(m_textSizeCached), m_lineHeight); - states.transform.translate( - {std::ceil(m_caretPosition.x - (m_caretWidthCached / 2.f)), - m_caretPosition.y}); - if (m_selStart == m_selEnd) { - states.transform.translate({CODE_EDITOR_LEFT_COLUMN, 0}); - } - target.drawFilledRect( - states, {m_caretWidthCached, caretHeight}, - tgui::Color::applyOpacity(m_caretColorCached, m_opacityCached)); - if (m_selStart == m_selEnd) { - states.transform.translate({-CODE_EDITOR_LEFT_COLUMN, 0}); - } - } - - target.removeClippingLayer(); - } - - // Draw the scrollbars if needed - if (m_verticalScrollbar->isShown()) - m_verticalScrollbar->draw(target, statesForScrollbar); - - if (m_horizontalScrollbar->isShown()) - m_horizontalScrollbar->draw(target, statesForScrollbar); -} - -Text CodeEditor::constructText(const tgui::String &text, - const Vector2f position) const { - auto cloneText = Text{}; - - cloneText.setFont(m_fontCached); - cloneText.setColor(tgui::Color::White); - cloneText.setString(text); - cloneText.setPosition(position); - cloneText.setCharacterSize(m_textSize); - - return cloneText; -} - -Text CodeEditor::constructText(const tgui::String &text) const { - auto cloneText = Text{}; - - cloneText.setFont(m_fontCached); - cloneText.setColor(tgui::Color::White); - cloneText.setString(text); - cloneText.setCharacterSize(m_textSize); - - return cloneText; -} - -Text CodeEditor::constructText(const tgui::String &text, - const tgui::Color &color) const { - auto cloneText = Text{}; - - cloneText.setFont(m_fontCached); - cloneText.setColor(color); - cloneText.setString(text); - cloneText.setCharacterSize(m_textSize); - - return cloneText; -} - -bool CodeEditor::canGainFocus() const { return true; } - -std::size_t CodeEditor::getColumnAt(std::size_t a) const { - const auto caret = a; - if (caret == 0) - return 1; - auto lineStart = m_text.rfind('\n', caret - 1); - if (lineStart == String::npos) - return caret + 1; - else - return caret - lineStart; -} - -std::size_t CodeEditor::getLineAt(std::size_t a) const { - if (const auto caret = a; caret == 0) - return 1; - else - return m_text.substr(0, caret).count('\n') + 1; -} diff --git a/xmake.lua b/xmake.lua index c131c5c8..ed743b80 100644 --- a/xmake.lua +++ b/xmake.lua @@ -70,8 +70,7 @@ on_install("linux", "macosx", "mingw", "windows", function (package) end) package_end() -add_requires("raylib", "tgui", "nlohmann_json", "luajit", "noop", "tree-sitter", - "tree-sitter-lua") +add_requires("raylib", "tgui", "nlohmann_json", "luajit") add_rules("mode.debug", "mode.release") set_defaultmode("debug") @@ -154,8 +153,7 @@ set_languages("cxx17") add_includedirs("include/", "include/editor/", os.dirs(path.join(os.scriptdir()))) add_files("src/editor/**.cpp") add_deps("rpgpp") -add_packages("raylib", "tgui", "nlohmann_json", "luajit", "noop", "tree-sitter", - "tree-sitter-lua") +add_packages("raylib", "tgui", "nlohmann_json", "luajit") after_build( function (target) os.cp("$(curdir)/resources", "./build/$(plat)/$(arch)/$(mode)/", { async = true }) if is_plat("linux", "macosx") then From 0e950fff46652e3ca45d0e62533311351dfbf37c Mon Sep 17 00:00:00 2001 From: "D. Quan" <60545346+sudoker0@users.noreply.github.com> Date: Fri, 10 Apr 2026 10:23:32 +0700 Subject: [PATCH 11/69] Small touchup on the project settings dialog --- resources/translations/en_us.json | 4 ++++ resources/translations/vn.json | 4 ++++ .../childWindows/projectSettingsWindow.cpp | 14 +++++++------- src/editor/screens/projectScreen.cpp | 18 +++++++++--------- 4 files changed, 24 insertions(+), 16 deletions(-) diff --git a/resources/translations/en_us.json b/resources/translations/en_us.json index 72ee8d16..7179adf2 100644 --- a/resources/translations/en_us.json +++ b/resources/translations/en_us.json @@ -116,6 +116,10 @@ "folder": "Folder", "confirm": "Confirm", "cancel": "Cancel" + }, + "project_settings": { + "_label": "Project Settings", + "title": "Title" } }, "widget": { diff --git a/resources/translations/vn.json b/resources/translations/vn.json index 6d0d492b..a77ac2f2 100644 --- a/resources/translations/vn.json +++ b/resources/translations/vn.json @@ -125,6 +125,10 @@ "folder": "Thư mục", "confirm": "Tạo", "cancel": "Hủy" + }, + "project_settings": { + "_label": "Cấu hình dự án", + "title": "Tên dự án" } }, diff --git a/src/editor/childWindows/projectSettingsWindow.cpp b/src/editor/childWindows/projectSettingsWindow.cpp index 44338ea8..039a1c3e 100644 --- a/src/editor/childWindows/projectSettingsWindow.cpp +++ b/src/editor/childWindows/projectSettingsWindow.cpp @@ -5,22 +5,22 @@ #include "TGUI/Widgets/GrowVerticalLayout.hpp" #include "TGUI/Widgets/Label.hpp" #include "childWindows/popupWindow.hpp" +#include "childWindows/settingsPanel/base.hpp" #include "editor.hpp" #include "project.hpp" #include "widgets/propertyFields/textField.hpp" ProjectSettingsWindow::ProjectSettingsWindow() : PopupWindow("ProjectSettings") { auto layout = tgui::GrowVerticalLayout::create(); + layout->getRenderer()->setPadding(4); layout->getRenderer()->setSpaceBetweenWidgets(4.0f); - auto titleLabel = tgui::Label::create(); - titleLabel->setSize({"80%", 36}); - titleLabel->setText("Project Settings"); - - layout->add(titleLabel); + bindTranslation(this->currentWindow, + "dialog.project_settings._label", + &tgui::ChildWindow::setTitle); titleField = TextField::create(); - titleField->label->setText("Title"); + bindTranslation(titleField->label, "dialog.project_settings.title", &tgui::Label::setText); titleField->setPosition({8, 48}); titleField->setSize({"80%", 24}); titleField->value->onTextChange([](const tgui::String &text) { @@ -41,4 +41,4 @@ void ProjectSettingsWindow::open() { titleField->value->setText(project->getTitle()); PopupWindow::open(); -} \ No newline at end of file +} diff --git a/src/editor/screens/projectScreen.cpp b/src/editor/screens/projectScreen.cpp index 57a60bfe..954fe2fa 100644 --- a/src/editor/screens/projectScreen.cpp +++ b/src/editor/screens/projectScreen.cpp @@ -248,21 +248,13 @@ tgui::Group::Ptr ProjectScreen::createToolBar() { auto &fs = Editor::instance->getFs(); - auto settingsBtn = tgui::BitmapButton::create(); - auto settingsImage = tgui::Texture(fs.getResourcePath("projectsettings.png")); - settingsBtn->setImage(settingsImage); - settingsBtn->setSize({barSize, "100%"}); - settingsBtn->setPosition({tgui::bindRight(projectLabel), 0}); - settingsBtn->onPress([] { Editor::instance->getGui().getChildWindowSubService()->openWindow("project_settings"); }); - toolBar->add(settingsBtn); - auto playBtnTooltip = Tooltip::create(""); bindTranslation(playBtnTooltip, "screen.project.toolbar.play", &Tooltip::setText); auto playBtn = tgui::BitmapButton::create(); auto playtestImg = tgui::Texture(fs.getResourcePath("playtest.png")); playBtn->setImage(playtestImg); playBtn->setSize({barSize, "100%"}); - playBtn->setPosition({tgui::bindRight(settingsBtn) + 8, 0}); + playBtn->setPosition({tgui::bindRight(projectLabel), 0}); playBtn->onPress([] { Editor::instance->getProject()->runProject(); }); playBtn->setToolTip(playBtnTooltip); toolBar->add(playBtn, "playBtn"); @@ -278,6 +270,14 @@ tgui::Group::Ptr ProjectScreen::createToolBar() { buildBtn->setToolTip(buildTooltip); toolBar->add(buildBtn); + auto settingsBtn = tgui::BitmapButton::create(); + auto settingsImage = tgui::Texture(fs.getResourcePath("projectsettings.png")); + settingsBtn->setImage(settingsImage); + settingsBtn->setSize({barSize, "100%"}); + settingsBtn->setPosition({tgui::bindRight(buildBtn) + 8, 0}); + settingsBtn->onPress([] { Editor::instance->getGui().getChildWindowSubService()->openWindow("project_settings"); }); + toolBar->add(settingsBtn); + return toolBar; } From c2fcbec1621c411344955c7f2e4a9dd53944c828 Mon Sep 17 00:00:00 2001 From: "D. Quan" <60545346+sudoker0@users.noreply.github.com> Date: Fri, 10 Apr 2026 10:24:15 +0700 Subject: [PATCH 12/69] Code reformatting --- include/actor.hpp | 45 ++++--- include/actorContainer.hpp | 9 +- include/atlasTile.hpp | 4 +- include/baseContainer.hpp | 34 ++--- include/collisionsContainer.hpp | 5 +- include/colorRect.hpp | 7 +- include/conversion.hpp | 2 +- include/dialogueBalloon.hpp | 5 +- include/game.hpp | 9 +- include/gamedata.hpp | 11 +- include/imageRect.hpp | 8 +- include/interactablesContainer.hpp | 13 +- include/interfaceService.hpp | 12 +- include/interfaceView.hpp | 10 +- include/propsContainer.hpp | 5 +- include/resourceService.hpp | 7 +- include/room.hpp | 10 +- include/saveable.hpp | 2 +- include/scriptService.hpp | 9 +- include/soundService.hpp | 3 +- include/stateService.hpp | 12 +- include/textArea.hpp | 8 +- include/tile.hpp | 7 +- include/uiElement.hpp | 2 +- include/worldService.hpp | 11 +- src/actor.cpp | 194 +++++++++++------------------ src/actorContainer.cpp | 43 +++---- src/atlasTile.cpp | 1 + src/collisionsContainer.cpp | 4 +- src/colorRect.cpp | 1 + src/conversion.cpp | 9 +- src/dialogue.cpp | 6 +- src/dialogueBalloon.cpp | 33 +++-- src/game.cpp | 22 ++-- src/gamedata.cpp | 78 +++++++----- src/imageRect.cpp | 8 +- src/interactablesContainer.cpp | 43 +++---- src/interfaceService.cpp | 23 ++-- src/interfaceView.cpp | 4 +- src/prop.cpp | 93 +++++--------- src/propsContainer.cpp | 8 +- src/resourceService.cpp | 8 +- src/scriptFile.cpp | 8 +- src/scriptService.cpp | 19 ++- src/soundService.cpp | 28 ++--- src/stateService.cpp | 5 +- src/textArea.cpp | 12 +- src/tile.cpp | 4 +- src/winapi.cpp | 64 ++++------ src/worldService.cpp | 13 +- 50 files changed, 439 insertions(+), 542 deletions(-) diff --git a/include/actor.hpp b/include/actor.hpp index 7f6d57f2..e3159521 100644 --- a/include/actor.hpp +++ b/include/actor.hpp @@ -1,38 +1,40 @@ #ifndef _RPGPP_ACTOR_H #define _RPGPP_ACTOR_H -#include "atlasTile.hpp" -#include "gamedata.hpp" -#include "interactable.hpp" -#include "saveable.hpp" -#include "tileset.hpp" +#include + #include #include #include #include -#include #include +#include "atlasTile.hpp" +#include "gamedata.hpp" +#include "interactable.hpp" +#include "saveable.hpp" +#include "tileset.hpp" + using json = nlohmann::json; #define RPGPP_MAX_DIRECTION 7 /** Direction enum, representing an animation state. */ enum Direction : short { - RPGPP_DOWN_IDLE = 0, ///< Down Idle state. - RPGPP_DOWN = 1, ///< Down state. - RPGPP_UP_IDLE = 2, ///< Up Idle state. - RPGPP_UP = 3, ///< Up state. - RPGPP_LEFT_IDLE = 4, ///< Left Idle state. - RPGPP_LEFT = 5, ///< Left state. - RPGPP_RIGHT_IDLE = 6, ///< Right Idle state. - RPGPP_RIGHT = 7 ///< Right state. + RPGPP_DOWN_IDLE = 0, ///< Down Idle state. + RPGPP_DOWN = 1, ///< Down state. + RPGPP_UP_IDLE = 2, ///< Up Idle state. + RPGPP_UP = 3, ///< Up state. + RPGPP_LEFT_IDLE = 4, ///< Left Idle state. + RPGPP_LEFT = 5, ///< Left state. + RPGPP_RIGHT_IDLE = 6, ///< Right Idle state. + RPGPP_RIGHT = 7 ///< Right state. }; /** The Actor class represents an Actor in the game's world. * @see [Direction](Direction.md) */ class Actor : public ISaveable { - private: +private: std::string sourcePath; /** The used TileSet for this Actor's sprites. */ std::unique_ptr tileSet; @@ -61,15 +63,14 @@ class Actor : public ISaveable { /** A smart pointer, owning an Interactable. */ std::unique_ptr interactable; - public: +public: /** Empty constructor. */ Actor() = default; /** Constructor that takes a path to the .ractor file. */ Actor(const std::string &fileName); /** Constructor that takes a TileSet, the atlas position of the tile to use, * and the path to the TileSet. */ - Actor(std::unique_ptr tileSet, Vector2 atlasPos, - std::string tileSetSource); + Actor(std::unique_ptr tileSet, Vector2 atlasPos, std::string tileSetSource); /** Constructor that takes an ActorBin binary structure */ Actor(const ActorBin &bin); /** Dump this Actor's data to a nlohmann::json object. */ @@ -132,8 +133,7 @@ class Actor : public ISaveable { * TileSet. */ void setAnimationFrame(Direction id, int frameIndex, Vector2 atlasTile); /** Add multiple frames to the chosen animation. */ - void addAnimationFrames(Direction id, - const std::vector> &frames); + void addAnimationFrames(Direction id, const std::vector> &frames); /** Temporarily play an animation */ void playAnimation(Direction id); /** Check whether a temporary animation is playing */ @@ -155,10 +155,9 @@ class Actor : public ISaveable { /** Get a pointer to this Actor's Interactable. */ Interactable *getInteractable(); /** Add an Interactable using an interactable file. */ - void setInteractableFromPath(const std::string& interPath); + void setInteractableFromPath(const std::string &interPath); }; -Vector2 calcActorTilePos(Vector2 newPosition, Vector2 worldTileSize, - TileSet *tileSet); +Vector2 calcActorTilePos(Vector2 newPosition, Vector2 worldTileSize, TileSet *tileSet); #endif diff --git a/include/actorContainer.hpp b/include/actorContainer.hpp index e06bab28..38504b41 100644 --- a/include/actorContainer.hpp +++ b/include/actorContainer.hpp @@ -4,10 +4,10 @@ #include "actor.hpp" class ActorContainer { - private: +private: std::map> actors; - public: +public: /** Construct the actor container. */ ActorContainer(); /** Get the map itself */ @@ -15,12 +15,11 @@ class ActorContainer { /** Get an Actor with the specified name */ Actor &getActor(const std::string &name); /** Add a new Actor with a name from the GameBin and an in-room name*/ - void addActor(Vector2 pos, const std::string &typeName, - const std::string &roomName); + void addActor(Vector2 pos, const std::string &typeName, const std::string &roomName); /** Remove an Actor */ void removeActor(const std::string &roomName); /** Check whether an Actor with such an in-room name exists. */ bool actorExists(const std::string &roomName); }; -#endif // !_RPGPP_ACTORCONTAINER_H +#endif // !_RPGPP_ACTORCONTAINER_H diff --git a/include/atlasTile.hpp b/include/atlasTile.hpp index 6baaa43f..2afe57ad 100644 --- a/include/atlasTile.hpp +++ b/include/atlasTile.hpp @@ -7,13 +7,13 @@ * Represents a source atlas tile from a TileSet. */ class AtlasTile { - private: +private: /** Pointer to the used Texture */ Texture *texture; /** The atlas (source) coordinates from the TileSet. */ Vector2 atlasCoords; - public: +public: /** * Empty constructor */ diff --git a/include/baseContainer.hpp b/include/baseContainer.hpp index 9d1345a1..d57da766 100644 --- a/include/baseContainer.hpp +++ b/include/baseContainer.hpp @@ -1,28 +1,25 @@ #ifndef _RPGPP_BASECONTAINER_H #define _RPGPP_BASECONTAINER_H -#include "conversion.hpp" -#include "gamedata.hpp" -#include "raylib.h" #include #include -template class BaseContainer { +#include "conversion.hpp" +#include "gamedata.hpp" +#include "raylib.h" - protected: +template +class BaseContainer { +protected: /** The list of objects kept inside of this container. */ std::map objects = {}; - public: +public: BaseContainer() {} /** Pushes an object to the map. */ - void pushObject(IVector pos, T obj) { - this->objects.try_emplace(pos, std::move(obj)); - } - void pushObjectVec2(Vector2 pos, T obj) { - pushObject(fromVector2(pos), obj); - } + void pushObject(IVector pos, T obj) { this->objects.try_emplace(pos, std::move(obj)); } + void pushObjectVec2(Vector2 pos, T obj) { pushObject(fromVector2(pos), obj); } /** Remove an object existing at a position. */ void removeObject(IVector pos) { auto key = this->objects.find(pos); @@ -32,20 +29,15 @@ template class BaseContainer { } void removeObjectVec2(Vector2 pos) { removeObject(fromVector2(pos)); } /** Check if an object exists at specified position. */ - bool objectExistsAtPosition(IVector pos) { - return this->objects.find(pos) != this->objects.end(); - } - bool objectExistsAtPositionVec2(Vector2 pos) { - return objectExistsAtPosition(fromVector2(pos)); - } + bool objectExistsAtPosition(IVector pos) { return this->objects.find(pos) != this->objects.end(); } + bool objectExistsAtPositionVec2(Vector2 pos) { return objectExistsAtPosition(fromVector2(pos)); } /** Gets the object at a specified IVector Position. */ T &getObjectAtPosition(IVector pos) { - if (this->objects.find(pos) != this->objects.end()) - return this->objects[pos]; + if (this->objects.find(pos) != this->objects.end()) return this->objects[pos]; throw std::out_of_range("key not found!"); } /** Get a reference to the whole object map. */ std::map &getObjects() { return this->objects; } }; -#endif // !_RPGPP_BASECONTAINER_H +#endif // !_RPGPP_BASECONTAINER_H diff --git a/include/collisionsContainer.hpp b/include/collisionsContainer.hpp index ba701e30..1fefb695 100644 --- a/include/collisionsContainer.hpp +++ b/include/collisionsContainer.hpp @@ -1,13 +1,14 @@ #ifndef _RPGPP_COLLISIONSCONTAINER_H #define _RPGPP_COLLISIONSCONTAINER_H +#include + #include "baseContainer.hpp" #include "gamedata.hpp" -#include /** A container of collision tiles to be used by a Room */ class CollisionsContainer : public BaseContainer { - public: +public: /** Empty constructor */ CollisionsContainer(); /** Add a collision */ diff --git a/include/colorRect.hpp b/include/colorRect.hpp index 8022a3e1..adab37c2 100644 --- a/include/colorRect.hpp +++ b/include/colorRect.hpp @@ -1,15 +1,16 @@ #ifndef _RPGPP_COLORRECT_H #define _RPGPP_COLORRECT_H -#include "uiElement.hpp" #include +#include "uiElement.hpp" + class ColorRect : public UIElement { - private: +private: Rectangle rect; Color color; - public: +public: ColorRect(); explicit ColorRect(Rectangle rect); diff --git a/include/conversion.hpp b/include/conversion.hpp index 14339e54..36e9ed1e 100644 --- a/include/conversion.hpp +++ b/include/conversion.hpp @@ -6,4 +6,4 @@ Vector2 fromIVector(const IVector &other); IVector fromVector2(const Vector2 &other); -#endif // !_RPGPP_CONVERSION_H \ No newline at end of file +#endif // !_RPGPP_CONVERSION_H \ No newline at end of file diff --git a/include/dialogueBalloon.hpp b/include/dialogueBalloon.hpp index 0d2c0e64..8c4aab05 100644 --- a/include/dialogueBalloon.hpp +++ b/include/dialogueBalloon.hpp @@ -2,6 +2,7 @@ #define _RPGPP_DIALOGUEBALLOON_H #include + #include #include @@ -24,7 +25,7 @@ struct DialogueBin { }; class DialogueBalloon { - private: +private: Rectangle rect; Rectangle textRect; Rectangle textPortraitRect; @@ -42,7 +43,7 @@ class DialogueBalloon { Vector2 textPos; void drawPortrait() const; - public: +public: DialogueBalloon(); DialogueBalloon(Rectangle rect); void update(); diff --git a/include/game.hpp b/include/game.hpp index cac70811..b766e30a 100644 --- a/include/game.hpp +++ b/include/game.hpp @@ -5,19 +5,20 @@ #include "sol/state_view.hpp" class WorldService; +#include +#include + #include "gamedata.hpp" #include "interfaceService.hpp" #include "resourceService.hpp" #include "soundService.hpp" #include "stateService.hpp" #include "worldService.hpp" -#include -#include #define RPGPP_VER "0.1" class Game { - private: +private: static Game *instance_; static std::unique_ptr gameData; static bool usesBin; @@ -28,7 +29,7 @@ class Game { static std::unique_ptr sounds; static std::unique_ptr scripts; - public: +public: Game(); static Game &instance(); static void useBin(const std::string &filePath); diff --git a/include/gamedata.hpp b/include/gamedata.hpp index d381df67..c7491d02 100644 --- a/include/gamedata.hpp +++ b/include/gamedata.hpp @@ -1,10 +1,11 @@ #ifndef _RPGPP_GAMEDATA_H #define _RPGPP_GAMEDATA_H +#include + #include #include #include -#include #include #include @@ -16,13 +17,9 @@ struct IVector { int x; int y; - bool operator==(const IVector &other) const { - return x == other.x && y == other.y; - } + bool operator==(const IVector &other) const { return x == other.x && y == other.y; } - bool operator<(const IVector &other) const { - return x < other.x || (x == other.x && y < other.y); - } + bool operator<(const IVector &other) const { return x < other.x || (x == other.x && y < other.y); } IVector() = default; IVector(int x, int y) { diff --git a/include/imageRect.hpp b/include/imageRect.hpp index 26f0e083..3acff511 100644 --- a/include/imageRect.hpp +++ b/include/imageRect.hpp @@ -1,17 +1,19 @@ #ifndef _RPGPP_IMAGERECT_H #define _RPGPP_IMAGERECT_H -#include "uiElement.hpp" #include + #include +#include "uiElement.hpp" + class ImageRect : public UIElement { - private: +private: Rectangle rect; std::string source; Texture2D texture; - public: +public: ImageRect(); ImageRect(Rectangle rect); void setSource(const std::string &source); diff --git a/include/interactablesContainer.hpp b/include/interactablesContainer.hpp index 03b2b502..e530f1e3 100644 --- a/include/interactablesContainer.hpp +++ b/include/interactablesContainer.hpp @@ -1,19 +1,18 @@ #ifndef _RPGPP_INTERACTABLESCONTAINER_H #define _RPGPP_INTERACTABLESCONTAINER_H -#include "baseContainer.hpp" -#include "gamedata.hpp" -#include "interactable.hpp" #include #include #include + +#include "baseContainer.hpp" +#include "gamedata.hpp" +#include "interactable.hpp" using json = nlohmann::json; /** Container of Interactables that is to be used by a [Room](Room.md) */ -class InteractablesContainer - : public BaseContainer> { - - public: +class InteractablesContainer : public BaseContainer> { +public: /** Empty constructor */ InteractablesContainer(); /** Add a new Interactable with tile position and type */ diff --git a/include/interfaceService.hpp b/include/interfaceService.hpp index 6969e0aa..97de8ba8 100644 --- a/include/interfaceService.hpp +++ b/include/interfaceService.hpp @@ -1,16 +1,18 @@ #ifndef _RPGPP_INTERFACESERVICE_H #define _RPGPP_INTERFACESERVICE_H -#include "dialogueBalloon.hpp" -#include "interfaceView.hpp" +#include + #include #include -#include #include +#include "dialogueBalloon.hpp" +#include "interfaceView.hpp" + /** The InterfaceService acts for the User Interface (UI). */ class InterfaceService { - private: +private: /** The loaded font that will be used for the User Interface. */ Font font; bool fpsVisible; @@ -21,7 +23,7 @@ class InterfaceService { /** Available UI Views. */ std::unique_ptr> views; - public: +public: /** Empty constructor. */ InterfaceService(); ~InterfaceService(); diff --git a/include/interfaceView.hpp b/include/interfaceView.hpp index 17703c1e..ac8c8672 100644 --- a/include/interfaceView.hpp +++ b/include/interfaceView.hpp @@ -1,17 +1,19 @@ #ifndef _RPGPP_INTERFACEVIEW_H #define _RPGPP_INTERFACEVIEW_H -#include "uiElement.hpp" -#include #include + +#include #include +#include "uiElement.hpp" + class InterfaceView { - private: +private: Rectangle rect; std::vector> elements; - public: +public: InterfaceView(); explicit InterfaceView(Rectangle rect); void addElement(UIElement *element); diff --git a/include/propsContainer.hpp b/include/propsContainer.hpp index 476a43c7..4448e37a 100644 --- a/include/propsContainer.hpp +++ b/include/propsContainer.hpp @@ -1,12 +1,13 @@ #ifndef _RPGPP_PROPSCONTAINER_H #define _RPGPP_PROPSCONTAINER_H +#include + #include "baseContainer.hpp" #include "prop.hpp" -#include class PropsContainer : public BaseContainer> { - public: +public: PropsContainer() = default; void addProp(Vector2 pos, const std::string &type); Prop *getPropAt(Vector2 pos); diff --git a/include/resourceService.hpp b/include/resourceService.hpp index 387572fc..f9ca03cf 100644 --- a/include/resourceService.hpp +++ b/include/resourceService.hpp @@ -1,15 +1,16 @@ #ifndef _RPGPP_EDITOR_RESOURCESERVICE_H #define _RPGPP_EDITOR_RESOURCESERVICE_H -#include #include + +#include #include class ResourceService { - private: +private: std::map textures; - public: +public: ResourceService(); ~ResourceService(); void addTextureFromFile(const std::string &filePath); diff --git a/include/room.hpp b/include/room.hpp index e68621e0..c37cab98 100644 --- a/include/room.hpp +++ b/include/room.hpp @@ -7,13 +7,15 @@ constexpr const char *DEFAULT_PLAYER_PATH = "actors/playerActor.ractor"; class Player; class TileMap; -#include "gamedata.hpp" +#include + #include #include -#include #include #include +#include "gamedata.hpp" + using json = nlohmann::json; #include "actor.hpp" #include "actorContainer.hpp" @@ -28,7 +30,7 @@ using json = nlohmann::json; * interactables, collisions and the TileMap */ class Room : public ISaveable { - private: +private: bool lock; int worldTileSize; /** The camera. */ @@ -51,7 +53,7 @@ class Room : public ISaveable { std::unique_ptr player; void updateCamera(); - public: +public: /** Empty constructor */ Room(); /** Construct a Room from an .rmap file */ diff --git a/include/saveable.hpp b/include/saveable.hpp index 950605b2..b5d3688d 100644 --- a/include/saveable.hpp +++ b/include/saveable.hpp @@ -4,7 +4,7 @@ #include class ISaveable { - public: +public: ISaveable() = default; virtual ~ISaveable() = default; virtual nlohmann::json dumpJson() = 0; diff --git a/include/scriptService.hpp b/include/scriptService.hpp index d1377e97..657bacbf 100644 --- a/include/scriptService.hpp +++ b/include/scriptService.hpp @@ -1,16 +1,17 @@ #ifndef _RPGPP_SCRIPTSERVICE_H #define _RPGPP_SCRIPTSERVICE_H -#include "sol/state.hpp" -#include "sol/state_view.hpp" #include #include +#include "sol/state.hpp" +#include "sol/state_view.hpp" + class ScriptService { - private: +private: sol::state state; - public: +public: ScriptService(); sol::state &getState(); void setLua(sol::state_view lua); diff --git a/include/soundService.hpp b/include/soundService.hpp index 9a8bacdc..3f44f4fd 100644 --- a/include/soundService.hpp +++ b/include/soundService.hpp @@ -2,6 +2,7 @@ #define _RPGPP_SOUNDSERVICE_H #include + #include //** The SoundService is responsible for playing sounds and managing the current background music */ @@ -13,7 +14,7 @@ class SoundService { //** The id of the last played music */ std::string lastId; - public: +public: //** Default constructor */ SoundService(); //** Load music with the specified id. */ diff --git a/include/stateService.hpp b/include/stateService.hpp index df845a3b..02652902 100644 --- a/include/stateService.hpp +++ b/include/stateService.hpp @@ -1,22 +1,22 @@ #ifndef _RPGPP_STATESERVICE_H #define _RPGPP_STATESERVICE_H -#include "sol/table.hpp" -#include "sol/types.hpp" #include #include #include +#include "sol/table.hpp" +#include "sol/types.hpp" + /** The StateService is responsible for storing gameplay-related variables * that make up the state of the game. */ -using Value = std::variant; +using Value = std::variant; class StateService { - private: +private: /** A pair of string keys and boolean values. */ std::map gameState; - public: +public: /** Empty constructor */ StateService(); /** Set a property */ diff --git a/include/textArea.hpp b/include/textArea.hpp index e772fc20..dfce7781 100644 --- a/include/textArea.hpp +++ b/include/textArea.hpp @@ -1,17 +1,19 @@ #ifndef _RPGPP_TEXTAREA_H #define _RPGPP_TEXTAREA_H -#include "uiElement.hpp" #include + #include +#include "uiElement.hpp" + class TextArea : public UIElement { - private: +private: Rectangle rect; std::string content; void putChar(int i, Vector2 *charPos, Vector2 *charMeasure) const; - public: +public: TextArea(); TextArea(Rectangle rect); void setText(const std::string &text); diff --git a/include/tile.hpp b/include/tile.hpp index 3969a6f9..a43c9e38 100644 --- a/include/tile.hpp +++ b/include/tile.hpp @@ -1,14 +1,15 @@ #ifndef _RPGPP_TILE_H #define _RPGPP_TILE_H -#include "atlasTile.hpp" #include +#include "atlasTile.hpp" + /** * A tile that may be placed in the world. */ class Tile { - private: +private: /** The Tile's source AtlasTile. */ AtlasTile atlasTile; /** The Tile's World coordinates. */ @@ -16,7 +17,7 @@ class Tile { /** Whether this Tile is placed and will be drawn or not. */ bool placed; - public: +public: Tile(); /** diff --git a/include/uiElement.hpp b/include/uiElement.hpp index e42da743..4467ce56 100644 --- a/include/uiElement.hpp +++ b/include/uiElement.hpp @@ -2,7 +2,7 @@ #define _RPGPP_UIELEMENT_H class UIElement { - public: +public: virtual ~UIElement() = default; UIElement(); diff --git a/include/worldService.hpp b/include/worldService.hpp index 3bb2e436..4fa9c9b3 100644 --- a/include/worldService.hpp +++ b/include/worldService.hpp @@ -1,16 +1,17 @@ #ifndef _RPGPP_WORLDSERVICE_H #define _RPGPP_WORLDSERVICE_H -#include "gamedata.hpp" -#include "player.hpp" -#include "room.hpp" #include #include #include +#include "gamedata.hpp" +#include "player.hpp" +#include "room.hpp" + /** The WorldService is responsible for containing and drawing the Room. */ class WorldService { - private: +private: /** The current room in this World. */ std::unique_ptr room; bool lock; @@ -24,7 +25,7 @@ class WorldService { float alpha; bool transitionSecondStage; - public: +public: /** Empty constructor. */ WorldService(); /** Get a reference to the current room. */ diff --git a/src/actor.cpp b/src/actor.cpp index e3911ada..f954ea6d 100644 --- a/src/actor.cpp +++ b/src/actor.cpp @@ -1,18 +1,21 @@ #include "actor.hpp" -#include "game.hpp" -#include "gamedata.hpp" -#include "interactable.hpp" -#include "tileset.hpp" + +#include +#include + #include #include #include #include #include #include -#include -#include #include #include + +#include "game.hpp" +#include "gamedata.hpp" +#include "interactable.hpp" +#include "tileset.hpp" using json = nlohmann::json; Actor::Actor(const std::string &fileName) { @@ -35,8 +38,7 @@ Actor::Actor(const std::string &fileName) { int height = collisionInfo.at(3); this->collisionRect = - Rectangle{static_cast(x), static_cast(y), - static_cast(width), static_cast(height)}; + Rectangle{static_cast(x), static_cast(y), static_cast(width), static_cast(height)}; this->tileSetSource = j.at("tileset"); this->tileSet = std::make_unique(tileSetSource); @@ -68,16 +70,14 @@ Actor::Actor(const std::string &fileName) { std::vector> right = j.at("animations").at("right"); addAnimationFrames(RPGPP_RIGHT, right); - std::vector> rightIdle = - j.at("animations").at("right-idle"); + std::vector> rightIdle = j.at("animations").at("right-idle"); addAnimationFrames(RPGPP_RIGHT_IDLE, rightIdle); Vector2 defaultTileAtlasPos = animations[currentAnimation].at(0); this->tile = tileSet->getTile(defaultTileAtlasPos); } -Actor::Actor(std::unique_ptr tileSet, Vector2 atlasPos, - std::string tileSetSource) { +Actor::Actor(std::unique_ptr tileSet, Vector2 atlasPos, std::string tileSetSource) { this->sourcePath = ""; this->tilePosition = Vector2{-1, -1}; this->position = Vector2{0, 0}; @@ -120,8 +120,7 @@ Actor::Actor(std::unique_ptr tileSet, Vector2 atlasPos, // Default collision box.. Vector2 atlasTileSize = this->tileSet->getTileSize(); this->collisionRect = - Rectangle{0, (atlasTileSize.y * RPGPP_DRAW_MULTIPLIER) / 2, - (atlasTileSize.x * RPGPP_DRAW_MULTIPLIER), + Rectangle{0, (atlasTileSize.y * RPGPP_DRAW_MULTIPLIER) / 2, (atlasTileSize.x * RPGPP_DRAW_MULTIPLIER), (atlasTileSize.y * RPGPP_DRAW_MULTIPLIER) / 2}; } @@ -135,14 +134,11 @@ Actor::Actor(const ActorBin &bin) { this->currentAnimation = RPGPP_DOWN_IDLE; // tileset - this->tileSet = - std::make_unique(Game::getBin().tilesets.at(bin.tileSetName)); + this->tileSet = std::make_unique(Game::getBin().tilesets.at(bin.tileSetName)); // collision - this->collisionRect = Rectangle{static_cast(bin.collision.x), - static_cast(bin.collision.y), - static_cast(bin.collision.width), - static_cast(bin.collision.height)}; + this->collisionRect = Rectangle{static_cast(bin.collision.x), static_cast(bin.collision.y), + static_cast(bin.collision.width), static_cast(bin.collision.height)}; // interactable this->interactable = std::make_unique(); @@ -188,38 +184,36 @@ json Actor::dumpJson() { auto direction = static_cast(i); std::string keyName = "untitled"; switch (direction) { - case RPGPP_DOWN_IDLE: - keyName = "down-idle"; - break; - case RPGPP_DOWN: - keyName = "down"; - break; - case RPGPP_UP_IDLE: - keyName = "up-idle"; - break; - case RPGPP_UP: - keyName = "up"; - break; - case RPGPP_LEFT_IDLE: - keyName = "left-idle"; - break; - case RPGPP_LEFT: - keyName = "left"; - break; - case RPGPP_RIGHT_IDLE: - keyName = "right-idle"; - break; - case RPGPP_RIGHT: - keyName = "right"; - break; + case RPGPP_DOWN_IDLE: + keyName = "down-idle"; + break; + case RPGPP_DOWN: + keyName = "down"; + break; + case RPGPP_UP_IDLE: + keyName = "up-idle"; + break; + case RPGPP_UP: + keyName = "up"; + break; + case RPGPP_LEFT_IDLE: + keyName = "left-idle"; + break; + case RPGPP_LEFT: + keyName = "left"; + break; + case RPGPP_RIGHT_IDLE: + keyName = "right-idle"; + break; + case RPGPP_RIGHT: + keyName = "right"; + break; } animsVec[keyName] = framesVec; } - json j = {{"tileset", tileSetSource}, - {"collision", collisionVec}, - {"animations", animsVec}}; + json j = {{"tileset", tileSetSource}, {"collision", collisionVec}, {"animations", animsVec}}; return j; } @@ -228,13 +222,9 @@ void Actor::unload() const { tileSet->unload(); } int Actor::getCurrentFrame() const { return this->currentFrame; } -int Actor::getAnimationCount() const { - return this->getAnimationRaw(this->currentAnimation).size(); -} +int Actor::getAnimationCount() const { return this->getAnimationRaw(this->currentAnimation).size(); } -Direction Actor::getAnimationDirection() const { - return this->currentAnimation; -} +Direction Actor::getAnimationDirection() const { return this->currentAnimation; } Vector2 Actor::getCurrentAnimationAtlas() const { return this->getAnimationRaw(this->currentAnimation).at(currentFrame); @@ -249,11 +239,9 @@ void Actor::setAnimationFrame(int frameIndex) { Vector2 atlasTileSize = tileSet->getTileSize(); Vector2 atlasPos = animations[currentAnimation].at(currentFrame); - atlasPos = - Vector2{atlasPos.x * atlasTileSize.x, atlasPos.y * atlasTileSize.y}; + atlasPos = Vector2{atlasPos.x * atlasTileSize.x, atlasPos.y * atlasTileSize.y}; - if (this->onFrameChanged != nullptr) - this->onFrameChanged(this->currentFrame); + if (this->onFrameChanged != nullptr) this->onFrameChanged(this->currentFrame); this->tile = tileSet->getTile(atlasPos); } @@ -261,8 +249,7 @@ void Actor::setAnimationFrame(int frameIndex) { Rectangle Actor::getCurrentAnimationRectangle() const { const auto &atlasPos = this->getCurrentAnimationAtlas(); const auto &atlasSize = this->getTileSet().getTileSize(); - return {atlasPos.x * atlasSize.x, atlasPos.y * atlasSize.y, atlasSize.x, - atlasSize.y}; + return {atlasPos.x * atlasSize.x, atlasPos.y * atlasSize.y, atlasSize.x, atlasSize.y}; } void Actor::update() { @@ -278,7 +265,6 @@ void Actor::update() { if (currentFrame >= this->getAnimationCount()) { if (currentFrame >= this->getAnimationCount()) { - currentFrame = 0; if (tempAnimIsPlayed) { currentAnimation = lastAnimation; @@ -296,8 +282,7 @@ void Actor::draw() const { constexpr auto origin = Vector2{0.0f, 0.0f}; constexpr float rotation = 0.0f; const Vector2 atlasTileSize = tileSet->getTileSize(); - auto worldTileSize = Vector2{atlasTileSize.x * RPGPP_DRAW_MULTIPLIER, - atlasTileSize.y * RPGPP_DRAW_MULTIPLIER}; + auto worldTileSize = Vector2{atlasTileSize.x * RPGPP_DRAW_MULTIPLIER, atlasTileSize.y * RPGPP_DRAW_MULTIPLIER}; // texture Texture texture = this->tileSet->getTexture(); @@ -306,10 +291,8 @@ void Actor::draw() const { Vector2 atlasCoords = this->tile.getAtlasCoords(); // build rects - auto atlasRect = Rectangle{atlasCoords.x, atlasCoords.y, atlasTileSize.x, - atlasTileSize.y}; - auto worldRect = - Rectangle{position.x, position.y, worldTileSize.x, worldTileSize.y}; + auto atlasRect = Rectangle{atlasCoords.x, atlasCoords.y, atlasTileSize.x, atlasTileSize.y}; + auto worldRect = Rectangle{position.x, position.y, worldTileSize.x, worldTileSize.y}; // draw it DrawTexturePro(texture, atlasRect, worldRect, origin, rotation, WHITE); @@ -324,12 +307,10 @@ void Actor::draw() const { std::string Actor::getSourcePath() const { return sourcePath; } Rectangle Actor::getRect() const { - if (tileSet == nullptr) - return Rectangle{0, 0, 0, 0}; + if (tileSet == nullptr) return Rectangle{0, 0, 0, 0}; Vector2 atlasTileSize = tileSet->getTileSize(); - auto result = Rectangle{position.x, position.y, - atlasTileSize.x * RPGPP_DRAW_MULTIPLIER, + auto result = Rectangle{position.x, position.y, atlasTileSize.x * RPGPP_DRAW_MULTIPLIER, atlasTileSize.y * RPGPP_DRAW_MULTIPLIER}; return result; } @@ -348,21 +329,15 @@ Vector2 Actor::getPosition() const { return position; } void Actor::setTilePosition(Vector2 newPosition, Vector2 tileSize) { Vector2 actorTileSize = tileSet->getTileSize(); auto absolutePos = - Vector2{newPosition.x * tileSize.x * RPGPP_DRAW_MULTIPLIER, - newPosition.y * tileSize.y * RPGPP_DRAW_MULTIPLIER}; + Vector2{newPosition.x * tileSize.x * RPGPP_DRAW_MULTIPLIER, newPosition.y * tileSize.y * RPGPP_DRAW_MULTIPLIER}; float xDiff = 0; - if ((tileSet->getTileWidth() * RPGPP_DRAW_MULTIPLIER) > - (tileSize.x * RPGPP_DRAW_MULTIPLIER)) { - xDiff = ((tileSet->getTileWidth() * RPGPP_DRAW_MULTIPLIER) - - (tileSize.x * RPGPP_DRAW_MULTIPLIER)) / - 2; + if ((tileSet->getTileWidth() * RPGPP_DRAW_MULTIPLIER) > (tileSize.x * RPGPP_DRAW_MULTIPLIER)) { + xDiff = ((tileSet->getTileWidth() * RPGPP_DRAW_MULTIPLIER) - (tileSize.x * RPGPP_DRAW_MULTIPLIER)) / 2; } - auto resultVector = - Vector2{absolutePos.x - xDiff, - absolutePos.y - ((actorTileSize.y * RPGPP_DRAW_MULTIPLIER) - - (tileSize.y * RPGPP_DRAW_MULTIPLIER))}; + auto resultVector = Vector2{absolutePos.x - xDiff, absolutePos.y - ((actorTileSize.y * RPGPP_DRAW_MULTIPLIER) - + (tileSize.y * RPGPP_DRAW_MULTIPLIER))}; this->position = resultVector; this->tilePosition = newPosition; } @@ -378,31 +353,25 @@ void Actor::moveByVelocity(Vector2 velocity) { Rectangle Actor::getCollisionRect(Vector2 velocity) const { Vector2 newPos = Vector2Add(position, velocity); auto result = - Rectangle{newPos.x + collisionRect.x, newPos.y + collisionRect.y, - collisionRect.width, collisionRect.height}; + Rectangle{newPos.x + collisionRect.x, newPos.y + collisionRect.y, collisionRect.width, collisionRect.height}; return result; } Vector2 Actor::getCollisionCenter() const { - Vector2 result = {position.x + (collisionRect.width / 2), - position.y + (collisionRect.height / 2)}; + Vector2 result = {position.x + (collisionRect.width / 2), position.y + (collisionRect.height / 2)}; return result; } -void Actor::addAnimationFrame(Direction id, Vector2 atlasPos) { - animations[id].push_back(atlasPos); -} +void Actor::addAnimationFrame(Direction id, Vector2 atlasPos) { animations[id].push_back(atlasPos); } void Actor::removeAnimationFrame(Direction id, int frameIndex) { if (currentFrame == frameIndex) { currentFrame = 0; } - if (frameIndex == 0) - return; + if (frameIndex == 0) return; // how do we know the frame was valid on index side? - assert(frameIndex < animations[id].size() && - "requested animation index is invalid"); + assert(frameIndex < animations[id].size() && "requested animation index is invalid"); animations[id].erase(animations[id].begin() + frameIndex); } @@ -410,13 +379,11 @@ void Actor::setAnimationFrame(Direction id, int frameIndex, Vector2 atlasTile) { animations[id][frameIndex] = atlasTile; } -void Actor::addAnimationFrames(const Direction id, - const std::vector> &frames) { +void Actor::addAnimationFrames(const Direction id, const std::vector> &frames) { for (int i = 0; i < frames.size(); i++) { int x = frames.at(i).at(0); int y = frames.at(i).at(1); - animations[id].push_back( - Vector2{static_cast(x), static_cast(y)}); + animations[id].push_back(Vector2{static_cast(x), static_cast(y)}); } } @@ -467,41 +434,28 @@ Rectangle Actor::getCollisionRect() const { return collisionRect; } void Actor::setCollisionRect(Rectangle rect) { this->collisionRect = rect; } -Vector2 calcActorTilePos(Vector2 newPosition, Vector2 worldTileSize, - TileSet *tileSet) { +Vector2 calcActorTilePos(Vector2 newPosition, Vector2 worldTileSize, TileSet *tileSet) { Vector2 actorTileSize = tileSet->getTileSize(); - auto absolutePos = - Vector2{newPosition.x * worldTileSize.x * RPGPP_DRAW_MULTIPLIER, - newPosition.y * worldTileSize.y * RPGPP_DRAW_MULTIPLIER}; + auto absolutePos = Vector2{newPosition.x * worldTileSize.x * RPGPP_DRAW_MULTIPLIER, + newPosition.y * worldTileSize.y * RPGPP_DRAW_MULTIPLIER}; float xDiff = 0; - if ((tileSet->getTileWidth() * RPGPP_DRAW_MULTIPLIER) > - (worldTileSize.x * RPGPP_DRAW_MULTIPLIER)) { - xDiff = ((tileSet->getTileWidth() * RPGPP_DRAW_MULTIPLIER) - - (worldTileSize.x * RPGPP_DRAW_MULTIPLIER)) / - 2; + if ((tileSet->getTileWidth() * RPGPP_DRAW_MULTIPLIER) > (worldTileSize.x * RPGPP_DRAW_MULTIPLIER)) { + xDiff = ((tileSet->getTileWidth() * RPGPP_DRAW_MULTIPLIER) - (worldTileSize.x * RPGPP_DRAW_MULTIPLIER)) / 2; } - auto resultVector = - Vector2{absolutePos.x - xDiff, - absolutePos.y - ((actorTileSize.y * RPGPP_DRAW_MULTIPLIER) - - (worldTileSize.y * RPGPP_DRAW_MULTIPLIER))}; + auto resultVector = Vector2{absolutePos.x - xDiff, absolutePos.y - ((actorTileSize.y * RPGPP_DRAW_MULTIPLIER) - + (worldTileSize.y * RPGPP_DRAW_MULTIPLIER))}; return resultVector; } -bool Actor::hasInteractable() { - return ownsInteractable; -} +bool Actor::hasInteractable() { return ownsInteractable; } -void Actor::setHasInteractable(bool value) { - ownsInteractable = value; -} +void Actor::setHasInteractable(bool value) { ownsInteractable = value; } -Interactable *Actor::getInteractable() { - return interactable.get(); -} +Interactable *Actor::getInteractable() { return interactable.get(); } -void Actor::setInteractableFromPath(const std::string& path) { +void Actor::setInteractableFromPath(const std::string &path) { interactable = std::make_unique(path); ownsInteractable = true; } diff --git a/src/actorContainer.cpp b/src/actorContainer.cpp index 5048dcce..6f188152 100644 --- a/src/actorContainer.cpp +++ b/src/actorContainer.cpp @@ -1,44 +1,29 @@ #include "actorContainer.hpp" -#include "actor.hpp" -#include "game.hpp" -#include "raylib.h" + #include #include #include -ActorContainer::ActorContainer() { - actors = std::map>{}; -} +#include "actor.hpp" +#include "game.hpp" +#include "raylib.h" -std::map> &ActorContainer::getActors() { - return actors; -} +ActorContainer::ActorContainer() { actors = std::map>{}; } -Actor &ActorContainer::getActor(const std::string &name) { - return *actors[name]; -} +std::map> &ActorContainer::getActors() { return actors; } + +Actor &ActorContainer::getActor(const std::string &name) { return *actors[name]; } -void ActorContainer::addActor(Vector2 pos, const std::string &typeName, - const std::string &roomName) { +void ActorContainer::addActor(Vector2 pos, const std::string &typeName, const std::string &roomName) { if (Game::getBin().actors.count(typeName) > 0) { - auto newActor = - std::make_unique(Game::getBin().actors[typeName]); - newActor->setTilePosition(pos, Game::getWorld() - .getRoom() - .getTileMap() - ->getTileSet() - ->getTileSize()); + auto newActor = std::make_unique(Game::getBin().actors[typeName]); + newActor->setTilePosition(pos, Game::getWorld().getRoom().getTileMap()->getTileSet()->getTileSize()); actors[roomName] = std::move(newActor); } else { - throw std::runtime_error( - TextFormat("This Actor does not exist: %s", typeName.c_str())); + throw std::runtime_error(TextFormat("This Actor does not exist: %s", typeName.c_str())); } } -void ActorContainer::removeActor(const std::string &roomName) { - actors.erase(roomName); -} +void ActorContainer::removeActor(const std::string &roomName) { actors.erase(roomName); } -bool ActorContainer::actorExists(const std::string &roomName) { - return (actors.count(roomName) > 0); -} \ No newline at end of file +bool ActorContainer::actorExists(const std::string &roomName) { return (actors.count(roomName) > 0); } \ No newline at end of file diff --git a/src/atlasTile.cpp b/src/atlasTile.cpp index 6f05c00a..ba2130a4 100644 --- a/src/atlasTile.cpp +++ b/src/atlasTile.cpp @@ -1,4 +1,5 @@ #include "atlasTile.hpp" + #include AtlasTile::AtlasTile() { diff --git a/src/collisionsContainer.cpp b/src/collisionsContainer.cpp index 960570c8..5f41d023 100644 --- a/src/collisionsContainer.cpp +++ b/src/collisionsContainer.cpp @@ -1,7 +1,9 @@ #include "collisionsContainer.hpp" -#include "gamedata.hpp" + #include +#include "gamedata.hpp" + CollisionsContainer::CollisionsContainer() = default; void CollisionsContainer::pushCollision(IVector pos) { pushObject(pos, true); } diff --git a/src/colorRect.cpp b/src/colorRect.cpp index cde5390d..b6c4c505 100644 --- a/src/colorRect.cpp +++ b/src/colorRect.cpp @@ -1,4 +1,5 @@ #include "colorRect.hpp" + #include ColorRect::ColorRect() : rect(Rectangle{1, 1, 1, 1}), color() {} diff --git a/src/conversion.cpp b/src/conversion.cpp index a41701a5..5ccad76f 100644 --- a/src/conversion.cpp +++ b/src/conversion.cpp @@ -1,11 +1,8 @@ #include "conversion.hpp" + #include "gamedata.hpp" #include "raylib.h" -Vector2 fromIVector(const IVector &other) { - return {static_cast(other.x), static_cast(other.y)}; -} +Vector2 fromIVector(const IVector &other) { return {static_cast(other.x), static_cast(other.y)}; } -IVector fromVector2(const Vector2 &other) { - return {static_cast(other.x), static_cast(other.y)}; -} \ No newline at end of file +IVector fromVector2(const Vector2 &other) { return {static_cast(other.x), static_cast(other.y)}; } \ No newline at end of file diff --git a/src/dialogue.cpp b/src/dialogue.cpp index 3e76509e..0d204824 100644 --- a/src/dialogue.cpp +++ b/src/dialogue.cpp @@ -1,9 +1,11 @@ #include "dialogue.hpp" + +#include +#include + #include "dialogueBalloon.hpp" #include "dialogueParser.hpp" #include "raylib.h" -#include -#include Dialogue::Dialogue(const std::string &filePath) { DialogueBin result; diff --git a/src/dialogueBalloon.cpp b/src/dialogueBalloon.cpp index 83be1db3..eb1348f9 100644 --- a/src/dialogueBalloon.cpp +++ b/src/dialogueBalloon.cpp @@ -1,16 +1,18 @@ #include "dialogueBalloon.hpp" -#include "game.hpp" -#include "interfaceService.hpp" -#include + #include #include +#include + +#include "game.hpp" +#include "interfaceService.hpp" + DialogueBalloon::DialogueBalloon() = default; DialogueBalloon::DialogueBalloon(Rectangle rect) { this->rect = rect; - this->textRect = Rectangle{rect.x + 9, rect.y + 9, rect.width - (9 * 2), - rect.height - (9 * 2)}; + this->textRect = Rectangle{rect.x + 9, rect.y + 9, rect.width - (9 * 2), rect.height - (9 * 2)}; this->textPortraitRect = this->textRect; this->textPortraitRect.width -= this->textRect.height; this->textPortraitRect.x += this->textRect.height; @@ -88,12 +90,9 @@ void DialogueBalloon::update() { } void DialogueBalloon::drawPortrait() const { - Texture2D texture = - Game::getResources().getTexture(dialogue.lines.at(lineIndex).imageId); - Rectangle source = Rectangle{0.0f, 0.0f, static_cast(texture.width), - static_cast(texture.height)}; - Rectangle dest = Rectangle{rect.x + 9, rect.y + 9, rect.height - (9 * 2), - rect.height - (9 * 2)}; + Texture2D texture = Game::getResources().getTexture(dialogue.lines.at(lineIndex).imageId); + Rectangle source = Rectangle{0.0f, 0.0f, static_cast(texture.width), static_cast(texture.height)}; + Rectangle dest = Rectangle{rect.x + 9, rect.y + 9, rect.height - (9 * 2), rect.height - (9 * 2)}; DrawTexturePro(texture, source, dest, Vector2{0, 0}, 0.0f, WHITE); } @@ -104,10 +103,8 @@ void DialogueBalloon::draw() { Vector2 origin = {0.0f, 0.0f}; NPatchInfo info = - NPatchInfo{Rectangle{0, 0, static_cast(uiTexture.width), - static_cast(uiTexture.height)}, - 3 * 3, 3 * 3, uiTexture.width - (3 * 3), - uiTexture.height - (3 * 3)}; + NPatchInfo{Rectangle{0, 0, static_cast(uiTexture.width), static_cast(uiTexture.height)}, + 3 * 3, 3 * 3, uiTexture.width - (3 * 3), uiTexture.height - (3 * 3)}; DrawTextureNPatch(uiTexture, info, rect, origin, 0.0f, WHITE); @@ -143,8 +140,7 @@ void DialogueBalloon::draw() { const char *subText = TextSubtext(text.c_str(), i, 1); charP(charMeasure, subText, newTextColor); - Vector2 newMeasure = MeasureTextEx( - font, TextSubtext(text.c_str(), i, 1), 13 * 3, 1.0f); + Vector2 newMeasure = MeasureTextEx(font, TextSubtext(text.c_str(), i, 1), 13 * 3, 1.0f); charMeasure = newMeasure; } } @@ -175,8 +171,7 @@ void DialogueBalloon::charP(Vector2 charMeasure, const char *c, Color color) { } void DialogueBalloon::showDialogue(const DialogueBin &newDialogue) { - if (active) - return; + if (active) return; this->dialogue = newDialogue; this->lineIndex = 0; diff --git a/src/game.cpp b/src/game.cpp index aa803f37..1599fde9 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -1,22 +1,23 @@ #include "game.hpp" -#include "gamedata.hpp" -#include "scriptService.hpp" -#include "soundService.hpp" -#include + #include + +#include #include -#include // FIXME : lua.h not found +#include // FIXME : lua.h not found #include +#include "gamedata.hpp" +#include "scriptService.hpp" +#include "soundService.hpp" + Game *Game::instance_ = nullptr; std::unique_ptr Game::gameData = std::unique_ptr{}; bool Game::usesBin = false; std::unique_ptr Game::state = std::unique_ptr{}; std::unique_ptr Game::world = std::unique_ptr{}; -std::unique_ptr Game::ui = - std::unique_ptr{}; -std::unique_ptr Game::resources = - std::unique_ptr{}; +std::unique_ptr Game::ui = std::unique_ptr{}; +std::unique_ptr Game::resources = std::unique_ptr{}; std::unique_ptr Game::sounds = std::unique_ptr{}; std::unique_ptr Game::scripts = std::unique_ptr{}; @@ -52,8 +53,7 @@ void Game::useBin(const std::string &filePath) { usesBin = true; for (const auto &[name, data] : gameData->images) { - Image image = LoadImageFromMemory(data.ext.c_str(), data.data.data(), - data.dataSize); + Image image = LoadImageFromMemory(data.ext.c_str(), data.data.data(), data.dataSize); Texture2D texture = LoadTextureFromImage(image); resources->addTexture(name, texture); UnloadImage(image); diff --git a/src/gamedata.cpp b/src/gamedata.cpp index a6342cf5..3a4dddaa 100644 --- a/src/gamedata.cpp +++ b/src/gamedata.cpp @@ -1,95 +1,113 @@ #include "gamedata.hpp" -#include "interactable.hpp" -#include +#include #include #include #include #include +#include -#include +#include "interactable.hpp" -template void serialize(Archive &a, IRect &b) { +template +void serialize(Archive &a, IRect &b) { a(b.x, b.y, b.width, b.height); } -template void serialize(Archive &a, IVector &b) { a(b.x, b.y); } +template +void serialize(Archive &a, IVector &b) { + a(b.x, b.y); +} -template void serialize(Archive &a, ActorBin &b) { +template +void serialize(Archive &a, ActorBin &b) { a(b.name, b.tileSetName, b.collision, b.animations); } -template void serialize(Archive &a, ActorInRoomBin &b) { +template +void serialize(Archive &a, ActorInRoomBin &b) { a(b.name, b.source, b.tilePos, b.intType, b.propsCbor); } -template void serialize(Archive &a, TileBin &b) { +template +void serialize(Archive &a, TileBin &b) { a(b.atlasPos, b.worldPos); } -template void serialize(Archive &a, InteractableBin &b) { +template +void serialize(Archive &a, InteractableBin &b) { a(b.typeName, b.scriptPath, b.props); } -template void serialize(Archive &a, InteractableInRoomBin &b) { +template +void serialize(Archive &a, InteractableInRoomBin &b) { a(b.x, b.y, b.onTouch, b.propsCbor, b.type); } -template void serialize(Archive &a, PropInRoomBin &b) { +template +void serialize(Archive &a, PropInRoomBin &b) { a(b.name, b.tilePos, b.onTouch, b.propsCbor); } -template void serialize(Archive &a, TileSetBin &b) { +template +void serialize(Archive &a, TileSetBin &b) { a(b.name, b.extension, b.tileSize, b.image, b.dataSize); } -template void serialize(Archive &a, FontBin &b) { +template +void serialize(Archive &a, FontBin &b) { a(b.data, b.dataSize, b.ext); } -template void serialize(Archive &a, ImageBin &b) { +template +void serialize(Archive &a, ImageBin &b) { a(b.data, b.dataSize, b.ext); } -template void serialize(Archive &a, MusicBin &b) { +template +void serialize(Archive &a, MusicBin &b) { a(b.relativePath, b.isSound, b.fileData, b.fileExt); } -template void serialize(Archive &a, PropBin &b) { - a(b.name, b.atlasRect, b.collisionRect, b.imagePath, b.hasInteractable, - b.intType); +template +void serialize(Archive &a, PropBin &b) { + a(b.name, b.atlasRect, b.collisionRect, b.imagePath, b.hasInteractable, b.intType); } -template void serialize(Archive &a, RoomBin &b) { - a(b.name, b.tileSetName, b.width, b.height, b.startPoint, b.collisions, - b.interactables, b.props, b.actors, b.tiles, b.musicSource); +template +void serialize(Archive &a, RoomBin &b) { + a(b.name, b.tileSetName, b.width, b.height, b.startPoint, b.collisions, b.interactables, b.props, b.actors, b.tiles, + b.musicSource); } -template void serialize(Archive &a, DialogueTextSection &b) { +template +void serialize(Archive &a, DialogueTextSection &b) { a(b.key, b.text); } -template void serialize(Archive &a, DialogueLine &b) { +template +void serialize(Archive &a, DialogueLine &b) { a(b.text, b.sections, b.imageId, b.hasPortrait, b.characterName); } -template void serialize(Archive &a, DialogueBin &b) { +template +void serialize(Archive &a, DialogueBin &b) { a(b.title, b.lines); } -template void serialize(Archive &a, GameData &b) { - a(b.title, b.images, b.tilesets, b.rooms, b.actors, b.props, b.dialogues, - b.music, b.interactables, b.scripts); +template +void serialize(Archive &a, GameData &b) { + a(b.title, b.images, b.tilesets, b.rooms, b.actors, b.props, b.dialogues, b.music, b.interactables, b.scripts); } -template void serialize(Archive &a, ScriptBin &b) { +template +void serialize(Archive &a, ScriptBin &b) { a(b.bytecode); } void serializeDataToFile(std::string fileName, GameData data) { { - std::fstream os{fileName, std::ifstream::binary | std::fstream::trunc | - std::fstream::out}; + std::fstream os{fileName, std::ifstream::binary | std::fstream::trunc | std::fstream::out}; if (!os.is_open()) { printf("Cannot open %s for writing. \n", fileName.c_str()); return; diff --git a/src/imageRect.cpp b/src/imageRect.cpp index ecf3ca27..840ec749 100644 --- a/src/imageRect.cpp +++ b/src/imageRect.cpp @@ -1,7 +1,9 @@ #include "imageRect.hpp" -#include + #include +#include + ImageRect::ImageRect() : rect(Rectangle{}), texture() {} ImageRect::ImageRect(Rectangle rect) : texture() { @@ -16,8 +18,6 @@ void ImageRect::setTexture(Texture2D texture) { this->texture = texture; } void ImageRect::update() {} void ImageRect::draw() { - DrawTexturePro(texture, - Rectangle{0, 0, static_cast(texture.width), - static_cast(texture.height)}, + DrawTexturePro(texture, Rectangle{0, 0, static_cast(texture.width), static_cast(texture.height)}, rect, Vector2{0, 0}, 0.0f, WHITE); } diff --git a/src/interactablesContainer.cpp b/src/interactablesContainer.cpp index 5f9e575e..9ed8abf4 100644 --- a/src/interactablesContainer.cpp +++ b/src/interactablesContainer.cpp @@ -1,22 +1,24 @@ #include "interactablesContainer.hpp" -#include "conversion.hpp" -#include "game.hpp" -#include "gamedata.hpp" -#include "interactable.hpp" -#include "tilemap.hpp" + +#include + #include #include #include -#include #include #include #include #include +#include "conversion.hpp" +#include "game.hpp" +#include "gamedata.hpp" +#include "interactable.hpp" +#include "tilemap.hpp" + InteractablesContainer::InteractablesContainer() {} -Interactable *InteractablesContainer::add(IVector pos, - const std::string &type) { +Interactable *InteractablesContainer::add(IVector pos, const std::string &type) { if (this->objectExistsAtPosition(pos)) { return nullptr; } @@ -24,8 +26,7 @@ Interactable *InteractablesContainer::add(IVector pos, printf("%s \n", type.c_str()); Vector2 tilePos = fromIVector(pos); - this->pushObject(pos, std::move(std::make_unique( - type, tilePos, _RPGPP_TILESIZE))); + this->pushObject(pos, std::move(std::make_unique(type, tilePos, _RPGPP_TILESIZE))); return this->getObjectAtPosition(pos).get(); } @@ -39,8 +40,7 @@ void InteractablesContainer::addBin(InteractableInRoomBin bin) { this->pushObject(pos, std::move(std::make_unique(bin))); } -void InteractablesContainer::addBinFromTypename(Vector2 pos, - const std::string &type) { +void InteractablesContainer::addBinFromTypename(Vector2 pos, const std::string &type) { if (Game::getBin().interactables.count(type) > 0) { auto interactable = Game::getBin().interactables[type]; InteractableInRoomBin intBin; @@ -53,23 +53,18 @@ void InteractablesContainer::addBinFromTypename(Vector2 pos, addBin(intBin); } else { - throw std::runtime_error(TextFormat( - "This Interactable type does not exist: %s", type.c_str())); + throw std::runtime_error(TextFormat("This Interactable type does not exist: %s", type.c_str())); } } Interactable *InteractablesContainer::getInt(IVector pos) { - if (!this->objectExistsAtPosition(pos)) - return nullptr; + if (!this->objectExistsAtPosition(pos)) return nullptr; return this->getObjectAtPosition(pos).get(); } -Interactable *InteractablesContainer::getIntVec2(Vector2 pos) { - return getInt(fromVector2(pos)); -} +Interactable *InteractablesContainer::getIntVec2(Vector2 pos) { return getInt(fromVector2(pos)); } -void InteractablesContainer::setInteractableType(IVector pos, - const std::string &type) { +void InteractablesContainer::setInteractableType(IVector pos, const std::string &type) { auto &obj = this->getObjectAtPosition(pos); if (obj->getType() == type) { @@ -87,8 +82,7 @@ std::vector InteractablesContainer::getList() { return result; } -void InteractablesContainer::addBinVector( - const std::vector &bin) { +void InteractablesContainer::addBinVector(const std::vector &bin) { for (auto intBin : bin) { addBin(intBin); } @@ -100,8 +94,7 @@ void InteractablesContainer::addJsonData(json roomJson) { for (auto const [key, inter] : map) { int count = 0; char **textSplit = TextSplit(key.c_str(), ';', &count); - if (count != 2) - return; + if (count != 2) return; int x = std::stoi(std::string(textSplit[0])); int y = std::stoi(std::string(textSplit[1])); diff --git a/src/interfaceService.cpp b/src/interfaceService.cpp index 8de9c8bc..3d3b24ce 100644 --- a/src/interfaceService.cpp +++ b/src/interfaceService.cpp @@ -1,11 +1,14 @@ #include "interfaceService.hpp" + +#include + +#include + #include "colorRect.hpp" #include "game.hpp" #include "imageRect.hpp" #include "interfaceView.hpp" #include "textArea.hpp" -#include -#include InterfaceService::InterfaceService() { fpsVisible = false; @@ -17,16 +20,14 @@ InterfaceService::InterfaceService() { this->uiTexture = LoadTextureFromImage(img); - Rectangle destRec = - Rectangle{0, 0, static_cast(GetScreenWidth() - 20), 140}; + Rectangle destRec = Rectangle{0, 0, static_cast(GetScreenWidth() - 20), 140}; destRec.x = (GetScreenWidth() - destRec.width) / 2; destRec.y = (GetScreenHeight() - destRec.height) - 20; this->dialogue = DialogueBalloon(destRec); this->views = std::make_unique>(); - Rectangle screenRect = Rectangle{0, 0, static_cast(GetScreenWidth()), - static_cast(GetScreenHeight())}; + Rectangle screenRect = Rectangle{0, 0, static_cast(GetScreenWidth()), static_cast(GetScreenHeight())}; InterfaceView view = InterfaceView(screenRect); TextArea *tArea = new TextArea(Rectangle{0, 0, 300, 200}); @@ -58,14 +59,11 @@ void InterfaceService::showDialogue(const std::string &id) { auto diag = Game::getBin().dialogues[id]; showDialogue(diag); } else { - throw std::runtime_error( - TextFormat("This Dialogue does not exist: %s", id.c_str())); + throw std::runtime_error(TextFormat("This Dialogue does not exist: %s", id.c_str())); } } -void InterfaceService::showDialogue(const DialogueBin &dialogue) { - this->dialogue.showDialogue(dialogue); -} +void InterfaceService::showDialogue(const DialogueBin &dialogue) { this->dialogue.showDialogue(dialogue); } void InterfaceService::update() { if (IsKeyPressed(KEY_Q)) { @@ -82,8 +80,7 @@ void InterfaceService::update() { void InterfaceService::draw() { if (fpsVisible) { DrawFPS(10, 10); - DrawTextEx(font, "rpgpp", Vector2{10, 36}, - static_cast(font.baseSize), 2, RED); + DrawTextEx(font, "rpgpp", Vector2{10, 36}, static_cast(font.baseSize), 2, RED); } dialogue.draw(); diff --git a/src/interfaceView.cpp b/src/interfaceView.cpp index 2ce6414f..a2080400 100644 --- a/src/interfaceView.cpp +++ b/src/interfaceView.cpp @@ -1,7 +1,9 @@ #include "interfaceView.hpp" -#include "uiElement.hpp" + #include +#include "uiElement.hpp" + InterfaceView::InterfaceView() : rect(Rectangle{}) {} InterfaceView::InterfaceView(Rectangle rect) { diff --git a/src/prop.cpp b/src/prop.cpp index 68841354..9844f9fb 100644 --- a/src/prop.cpp +++ b/src/prop.cpp @@ -1,18 +1,19 @@ #include "prop.hpp" + +#include + +#include +#include +#include + #include "game.hpp" #include "gamedata.hpp" #include "interactable.hpp" #include "tilemap.hpp" -#include -#include -#include -#include using json = nlohmann::json; -Prop::Prop() - : worldPos(Vector2{}), tilePos(Vector2{}), atlasRect(), texture(), - collisionRect() {} +Prop::Prop() : worldPos(Vector2{}), tilePos(Vector2{}), atlasRect(), texture(), collisionRect() {} Prop::Prop(const std::string &filePath) { this->sourcePath = filePath; @@ -25,19 +26,15 @@ Prop::Prop(const std::string &filePath) { if (atlasRectVec.size() != 4) { throw std::runtime_error("Not enough items in atlas_rect."); } - this->atlasRect = Rectangle{static_cast(atlasRectVec[0]), - static_cast(atlasRectVec[1]), - static_cast(atlasRectVec[2]), - static_cast(atlasRectVec[3])}; + this->atlasRect = Rectangle{static_cast(atlasRectVec[0]), static_cast(atlasRectVec[1]), + static_cast(atlasRectVec[2]), static_cast(atlasRectVec[3])}; std::vector collisionRectVec = json.at("collision_rect"); if (collisionRectVec.size() != 4) { throw std::runtime_error("Not enough items in collision_rect."); } - this->collisionRect = Rectangle{static_cast(collisionRectVec[0]), - static_cast(collisionRectVec[1]), - static_cast(collisionRectVec[2]), - static_cast(collisionRectVec[3])}; + this->collisionRect = Rectangle{static_cast(collisionRectVec[0]), static_cast(collisionRectVec[1]), + static_cast(collisionRectVec[2]), static_cast(collisionRectVec[3])}; this->imagePath = json.at("image"); this->texture = LoadTexture(imagePath.c_str()); @@ -47,8 +44,7 @@ Prop::Prop(const std::string &filePath) { this->interactable = std::make_unique(); if (hasInteractable) { std::string intType = json.at("interactable_type"); - this->interactable = - std::make_unique(intType, tilePos, _RPGPP_TILESIZE); + this->interactable = std::make_unique(intType, tilePos, _RPGPP_TILESIZE); } UnloadFileText(jsonString); } @@ -67,39 +63,29 @@ Prop::Prop(PropBin bin) { this->sourcePath = bin.name; this->worldPos = Vector2{0, 0}; this->tilePos = Vector2{0, 0}; - this->atlasRect = Rectangle{static_cast(bin.atlasRect.x), - static_cast(bin.atlasRect.y), - static_cast(bin.atlasRect.width), - static_cast(bin.atlasRect.height)}; + this->atlasRect = Rectangle{static_cast(bin.atlasRect.x), static_cast(bin.atlasRect.y), + static_cast(bin.atlasRect.width), static_cast(bin.atlasRect.height)}; this->collisionRect = - Rectangle{static_cast(bin.collisionRect.x), - static_cast(bin.collisionRect.y), - static_cast(bin.collisionRect.width), - static_cast(bin.collisionRect.height)}; - - ImageBin imgBin = - Game::getBin().images.at(GetFileName(bin.imagePath.c_str())); - Image img = LoadImageFromMemory(GetFileExtension(bin.imagePath.c_str()), - imgBin.data.data(), imgBin.dataSize); + Rectangle{static_cast(bin.collisionRect.x), static_cast(bin.collisionRect.y), + static_cast(bin.collisionRect.width), static_cast(bin.collisionRect.height)}; + + ImageBin imgBin = Game::getBin().images.at(GetFileName(bin.imagePath.c_str())); + Image img = LoadImageFromMemory(GetFileExtension(bin.imagePath.c_str()), imgBin.data.data(), imgBin.dataSize); setTexture(LoadTextureFromImage(img)); UnloadImage(img); this->hasInteractable = bin.hasInteractable; this->interactable = std::make_unique(); if (hasInteractable) { - this->interactable = std::make_unique( - bin.intType, tilePos, _RPGPP_TILESIZE); + this->interactable = std::make_unique(bin.intType, tilePos, _RPGPP_TILESIZE); } } json Prop::dumpJson() { - std::vector atlasRectVec = { - static_cast(atlasRect.x), static_cast(atlasRect.y), - static_cast(atlasRect.width), static_cast(atlasRect.height)}; - std::vector collisionRectVec = { - static_cast(collisionRect.x), static_cast(collisionRect.y), - static_cast(collisionRect.width), - static_cast(collisionRect.height)}; + std::vector atlasRectVec = {static_cast(atlasRect.x), static_cast(atlasRect.y), + static_cast(atlasRect.width), static_cast(atlasRect.height)}; + std::vector collisionRectVec = {static_cast(collisionRect.x), static_cast(collisionRect.y), + static_cast(collisionRect.width), static_cast(collisionRect.height)}; json j{{"atlas_rect", atlasRectVec}, {"collision_rect", collisionRectVec}, @@ -111,9 +97,7 @@ json Prop::dumpJson() { std::string Prop::getSourcePath() const { return sourcePath; } -void Prop::setTexture(Texture2D texture_to_set) { - this->texture = texture_to_set; -} +void Prop::setTexture(Texture2D texture_to_set) { this->texture = texture_to_set; } Texture2D Prop::getTexture() const { return texture; } @@ -124,27 +108,20 @@ void Prop::setTextureFromPath(const std::string &image_path) { const char *Prop::getImagePath() const { return this->imagePath.c_str(); } -void Prop::setCollisionRect(Rectangle collision_rect_to_set) { - this->collisionRect = collision_rect_to_set; -} +void Prop::setCollisionRect(Rectangle collision_rect_to_set) { this->collisionRect = collision_rect_to_set; } void Prop::setWorldTilePos(Vector2 world_pos_to_set, int tileSize) { - this->worldPos = - Vector2{world_pos_to_set.x * tileSize, world_pos_to_set.y * tileSize}; + this->worldPos = Vector2{world_pos_to_set.x * tileSize, world_pos_to_set.y * tileSize}; this->tilePos = world_pos_to_set; } -void Prop::setWorldPos(Vector2 world_pos_to_set) { - this->worldPos = world_pos_to_set; -} +void Prop::setWorldPos(Vector2 world_pos_to_set) { this->worldPos = world_pos_to_set; } Vector2 Prop::getWorldPos() const { return worldPos; } Vector2 Prop::getWorldTilePos() const { return tilePos; } -void Prop::setAtlasRect(Rectangle atlas_rect_to_set) { - this->atlasRect = atlas_rect_to_set; -} +void Prop::setAtlasRect(Rectangle atlas_rect_to_set) { this->atlasRect = atlas_rect_to_set; } Rectangle Prop::getAtlasRect() const { return atlasRect; } @@ -153,8 +130,7 @@ Rectangle Prop::getCollisionRect() const { return collisionRect; } Rectangle Prop::getWorldCollisionRect() const { return Rectangle{worldPos.x + (collisionRect.x * RPGPP_DRAW_MULTIPLIER), worldPos.y + (collisionRect.y * RPGPP_DRAW_MULTIPLIER), - collisionRect.width * RPGPP_DRAW_MULTIPLIER, - collisionRect.height * RPGPP_DRAW_MULTIPLIER}; + collisionRect.width * RPGPP_DRAW_MULTIPLIER, collisionRect.height * RPGPP_DRAW_MULTIPLIER}; } Vector2 Prop::getCollisionCenter() const { @@ -173,9 +149,7 @@ Interactable *Prop::getInteractable() const { } } -std::string Prop::getInteractableType() const { - return interactable->getType(); -} +std::string Prop::getInteractableType() const { return interactable->getType(); } void Prop::setInteractableType(const std::string &type) { if (hasInteractable && interactable->getType() == type) { @@ -186,8 +160,7 @@ void Prop::setInteractableType(const std::string &type) { } void Prop::draw() const { - Rectangle dest = {worldPos.x, worldPos.y, - atlasRect.width * RPGPP_DRAW_MULTIPLIER, + Rectangle dest = {worldPos.x, worldPos.y, atlasRect.width * RPGPP_DRAW_MULTIPLIER, atlasRect.height * RPGPP_DRAW_MULTIPLIER}; DrawTexturePro(texture, atlasRect, dest, Vector2{0, 0}, 0.0f, WHITE); diff --git a/src/propsContainer.cpp b/src/propsContainer.cpp index 3d9551e4..4719c429 100644 --- a/src/propsContainer.cpp +++ b/src/propsContainer.cpp @@ -1,4 +1,5 @@ #include "propsContainer.hpp" + #include "conversion.hpp" #include "game.hpp" #include "prop.hpp" @@ -8,8 +9,7 @@ void PropsContainer::addProp(Vector2 pos, const std::string &type) { if (propBin.name == type) { printf("c \n"); auto p = std::make_unique(propBin); - p->setWorldTilePos(pos, - Game::getWorld().getRoom().getWorldTileSize()); + p->setWorldTilePos(pos, Game::getWorld().getRoom().getWorldTileSize()); p->getInteractable()->setProps(nlohmann::json::object()); pushObject(fromVector2(pos), std::move(p)); @@ -18,6 +18,4 @@ void PropsContainer::addProp(Vector2 pos, const std::string &type) { } } -Prop *PropsContainer::getPropAt(Vector2 pos) { - return objects[fromVector2(pos)].get(); -} \ No newline at end of file +Prop *PropsContainer::getPropAt(Vector2 pos) { return objects[fromVector2(pos)].get(); } \ No newline at end of file diff --git a/src/resourceService.cpp b/src/resourceService.cpp index 3a0afb70..a0a3dad4 100644 --- a/src/resourceService.cpp +++ b/src/resourceService.cpp @@ -1,7 +1,9 @@ #include "resourceService.hpp" -#include + #include +#include + ResourceService::ResourceService() { addTextureFromFile("resources/logo.png"); addTextureFromFile("resources/close.png"); @@ -29,6 +31,4 @@ void ResourceService::unload() const { } } -Texture2D ResourceService::getTexture(const std::string &id) { - return textures[id]; -} +Texture2D ResourceService::getTexture(const std::string &id) { return textures[id]; } diff --git a/src/scriptFile.cpp b/src/scriptFile.cpp index 76175a11..90f10bdb 100644 --- a/src/scriptFile.cpp +++ b/src/scriptFile.cpp @@ -1,13 +1,11 @@ #include "scriptFile.h" -#include "raylib.h" - #include -ScriptFile::ScriptFile(const std::string &path) { - this->fileContents = LoadFileText(path.c_str()); -} +#include "raylib.h" + +ScriptFile::ScriptFile(const std::string &path) { this->fileContents = LoadFileText(path.c_str()); } nlohmann::json ScriptFile::dumpJson() { return nlohmann::json{}; } diff --git a/src/scriptService.cpp b/src/scriptService.cpp index 1f6ae0ea..937b9a59 100644 --- a/src/scriptService.cpp +++ b/src/scriptService.cpp @@ -1,34 +1,33 @@ #include "scriptService.hpp" + +#include +#include + #include "lua/apiTypes.hpp" #include "lua/interfaceApi.hpp" #include "lua/soundsApi.hpp" #include "lua/stateApi.hpp" #include "lua/worldApi.hpp" #include "sol/state_view.hpp" - #include "sol/table.hpp" -#include -#include static int wrap_exceptions(lua_State *L, lua_CFunction f) { try { - return f(L); // Call wrapped function and return result. - } catch (const char *s) { // Catch and convert exceptions. + return f(L); // Call wrapped function and return result. + } catch (const char *s) { // Catch and convert exceptions. lua_pushstring(L, s); } catch (std::exception &e) { lua_pushstring(L, e.what()); } catch (...) { lua_pushliteral(L, "caught (...)"); } - return lua_error(L); // Rethrow as a Lua error. + return lua_error(L); // Rethrow as a Lua error. } ScriptService::ScriptService() { - state.open_libraries(sol::lib::base, sol::lib::string, sol::lib::os, - sol::lib::table); + state.open_libraries(sol::lib::base, sol::lib::string, sol::lib::os, sol::lib::table); lua_pushlightuserdata(state.lua_state(), (void *)wrap_exceptions); - luaJIT_setmode(state.lua_state(), -1, - LUAJIT_MODE_WRAPCFUNC | LUAJIT_MODE_ON); + luaJIT_setmode(state.lua_state(), -1, LUAJIT_MODE_WRAPCFUNC | LUAJIT_MODE_ON); lua_pop(state.lua_state(), 1); setLua(state); } diff --git a/src/soundService.cpp b/src/soundService.cpp index ce7f3768..dc4e1a3f 100644 --- a/src/soundService.cpp +++ b/src/soundService.cpp @@ -1,10 +1,13 @@ #include "soundService.hpp" -#include "game.hpp" -#include "gamedata.hpp" -#include + #include + +#include #include +#include "game.hpp" +#include "gamedata.hpp" + SoundService::SoundService() { music = {}; musicLoaded = false; @@ -14,18 +17,15 @@ SoundService::SoundService() { bool SoundService::loadMusic(const std::string &id) { GameData &gameData = Game::getBin(); - if (lastId == id) - return true; + if (lastId == id) return true; if (gameData.music.count(id) != 0) { - if (gameData.music[id].isSound) - return musicLoaded; + if (gameData.music[id].isSound) return musicLoaded; auto &musicBin = gameData.music[id]; - Music newMusic = LoadMusicStreamFromMemory(musicBin.fileExt.c_str(), - musicBin.fileData.data(), - musicBin.fileData.size()); + Music newMusic = + LoadMusicStreamFromMemory(musicBin.fileExt.c_str(), musicBin.fileData.data(), musicBin.fileData.size()); if (IsMusicValid(newMusic)) { unload(); @@ -52,9 +52,8 @@ void SoundService::playSound(const std::string &id) const { if (gameData.music.count(id) != 0) { if (gameData.music[id].isSound) { MusicBin soundBin = gameData.music[id]; - Wave soundWave = LoadWaveFromMemory(soundBin.fileExt.c_str(), - soundBin.fileData.data(), - soundBin.fileData.size()); + Wave soundWave = + LoadWaveFromMemory(soundBin.fileExt.c_str(), soundBin.fileData.data(), soundBin.fileData.size()); Sound sound = LoadSoundFromWave(soundWave); PlaySound(sound); @@ -64,8 +63,7 @@ void SoundService::playSound(const std::string &id) const { // UnloadSound(sound); } } else { - throw std::runtime_error( - TextFormat("This Sound does not exist: %s", id.c_str())); + throw std::runtime_error(TextFormat("This Sound does not exist: %s", id.c_str())); } } diff --git a/src/stateService.cpp b/src/stateService.cpp index e29dafbe..b5d1c123 100644 --- a/src/stateService.cpp +++ b/src/stateService.cpp @@ -1,11 +1,10 @@ #include "stateService.hpp" + #include "sol/error.hpp" StateService::StateService() { gameState.emplace("test", false); } -void StateService::setProp(const std::string &prop, Value value) { - gameState[prop] = value; -} +void StateService::setProp(const std::string &prop, Value value) { gameState[prop] = value; } Value StateService::getProp(const std::string &prop) const { if (gameState.count(prop) == 0) { diff --git a/src/textArea.cpp b/src/textArea.cpp index c7f870b4..ab455d58 100644 --- a/src/textArea.cpp +++ b/src/textArea.cpp @@ -1,7 +1,9 @@ #include "textArea.hpp" -#include "game.hpp" + #include +#include "game.hpp" + TextArea::TextArea() : rect(Rectangle{}) {} TextArea::TextArea(Rectangle rect) { @@ -24,12 +26,10 @@ void TextArea::draw() { void TextArea::putChar(int i, Vector2 *charPos, Vector2 *charMeasure) const { charPos->x += charMeasure->x; - DrawTextPro(Game::getUi().getFont(), TextSubtext(content.c_str(), i, 1), - *charPos, Vector2{0, 0}, 0.0f, 13 * 3, 1, BLACK); + DrawTextPro(Game::getUi().getFont(), TextSubtext(content.c_str(), i, 1), *charPos, Vector2{0, 0}, 0.0f, 13 * 3, 1, + BLACK); - *charMeasure = - MeasureTextEx(Game::getUi().getFont(), - TextSubtext(content.c_str(), i, 1), 13 * 3, 1.0f); + *charMeasure = MeasureTextEx(Game::getUi().getFont(), TextSubtext(content.c_str(), i, 1), 13 * 3, 1.0f); } void TextArea::setText(const std::string &text) { this->content = text; } diff --git a/src/tile.cpp b/src/tile.cpp index d8e6395f..1a69f27e 100644 --- a/src/tile.cpp +++ b/src/tile.cpp @@ -1,7 +1,9 @@ #include "tile.hpp" -#include "atlasTile.hpp" + #include +#include "atlasTile.hpp" + Tile::Tile() { this->worldCoords = Vector2{-1, -1}; this->placed = false; diff --git a/src/winapi.cpp b/src/winapi.cpp index 7d6873e2..68309818 100644 --- a/src/winapi.cpp +++ b/src/winapi.cpp @@ -1,8 +1,6 @@ #include #include - - #include #ifdef _WIN32 @@ -11,18 +9,16 @@ #ifdef _WIN32 -char* WinReadFromHandle(HANDLE handle) { +char *WinReadFromHandle(HANDLE handle) { DWORD dwRead; - char* charBuf = new char[4096]; + char *charBuf = new char[4096]; BOOL bSuccess = FALSE; for (;;) { bSuccess = ReadFile(handle, charBuf, 4096, &dwRead, NULL); - if (!bSuccess || dwRead == 0) - break; + if (!bSuccess || dwRead == 0) break; - if (!bSuccess) - break; + if (!bSuccess) break; } return charBuf; @@ -30,25 +26,16 @@ char* WinReadFromHandle(HANDLE handle) { bool WinCreateDetachedExecutable(std::string path) { BOOL creationResult; - STARTUPINFO startupInfo; + STARTUPINFO startupInfo; PROCESS_INFORMATION processInformation; - ZeroMemory( &startupInfo, sizeof(startupInfo) ); - startupInfo.cb = sizeof(startupInfo); - ZeroMemory( &processInformation, sizeof(processInformation) ); - - creationResult = CreateProcess( - NULL, - path.data(), - NULL, - NULL, - FALSE, - CREATE_NEW_CONSOLE | CREATE_NEW_PROCESS_GROUP | CREATE_BREAKAWAY_FROM_JOB, - NULL, - NULL, - &startupInfo, - &processInformation - ); + ZeroMemory(&startupInfo, sizeof(startupInfo)); + startupInfo.cb = sizeof(startupInfo); + ZeroMemory(&processInformation, sizeof(processInformation)); + + creationResult = CreateProcess(NULL, path.data(), NULL, NULL, FALSE, + CREATE_NEW_CONSOLE | CREATE_NEW_PROCESS_GROUP | CREATE_BREAKAWAY_FROM_JOB, NULL, + NULL, &startupInfo, &processInformation); if (creationResult) { CloseHandle(processInformation.hProcess); @@ -58,11 +45,9 @@ bool WinCreateDetachedExecutable(std::string path) { return creationResult; } - bool WinOpenFileAssociate(std::string operation, std::string file) { printf("opening file with path %s (Win32)\n", file.c_str()); - INT_PTR hInstance = (INT_PTR)ShellExecuteA( - NULL, operation.c_str(), file.c_str(), NULL, NULL, SW_SHOWNORMAL); + INT_PTR hInstance = (INT_PTR)ShellExecuteA(NULL, operation.c_str(), file.c_str(), NULL, NULL, SW_SHOWNORMAL); return hInstance != SE_ERR_NOASSOC; } @@ -71,8 +56,7 @@ void WinWriteToHandle(HANDLE handle, std::string str) { CHAR charBuf[4096]; BOOL bSuccess = FALSE; - bSuccess = WriteFile(handle, static_cast(str.data()), str.size(), - &dwWritten, NULL); + bSuccess = WriteFile(handle, static_cast(str.data()), str.size(), &dwWritten, NULL); if (!bSuccess) { printf("WriteFile Error: %lu", GetLastError()); return; @@ -83,8 +67,7 @@ void WinWriteToHandle(HANDLE handle, std::string str) { } } -void WinCreateProcEx(std::string cmdLine, HANDLE outHandle, HANDLE inHandle, - DWORD dwFlags, bool wait) { +void WinCreateProcEx(std::string cmdLine, HANDLE outHandle, HANDLE inHandle, DWORD dwFlags, bool wait) { #ifdef _WIN32 STARTUPINFO si; PROCESS_INFORMATION pi; @@ -106,8 +89,8 @@ void WinCreateProcEx(std::string cmdLine, HANDLE outHandle, HANDLE inHandle, handleInheritance = TRUE; } - if (CreateProcess(NULL, const_cast(cmdLine.data()), NULL, NULL, - handleInheritance, 0, NULL, NULL, &si, &pi)) { + if (CreateProcess(NULL, const_cast(cmdLine.data()), NULL, NULL, handleInheritance, 0, NULL, NULL, &si, + &pi)) { // Wait until child process exits. if (wait) { WaitForSingleObject(pi.hProcess, INFINITE); @@ -117,10 +100,8 @@ void WinCreateProcEx(std::string cmdLine, HANDLE outHandle, HANDLE inHandle, CloseHandle(pi.hProcess); CloseHandle(pi.hThread); - if (outHandle != NULL) - CloseHandle(outHandle); - if (inHandle != NULL) - CloseHandle(inHandle); + if (outHandle != NULL) CloseHandle(outHandle); + if (inHandle != NULL) CloseHandle(inHandle); } else { printf("WinCreateProc: CreateProcess failed (%lu).\n", GetLastError()); } @@ -129,9 +110,7 @@ void WinCreateProcEx(std::string cmdLine, HANDLE outHandle, HANDLE inHandle, #endif } -void WinCreateProc(std::string cmdLine) { - WinCreateProcEx(cmdLine, NULL, NULL, STARTF_FORCEONFEEDBACK, true); -} +void WinCreateProc(std::string cmdLine) { WinCreateProcEx(cmdLine, NULL, NULL, STARTF_FORCEONFEEDBACK, true); } VsInfo WinVsWhere(std::string path) { VsInfo result; @@ -169,8 +148,7 @@ VsInfo WinVsWhere(std::string path) { return result; } - WinCreateProcEx(path, g_hChildStd_OUT_Wr, NULL, STARTF_USESTDHANDLES, - false); + WinCreateProcEx(path, g_hChildStd_OUT_Wr, NULL, STARTF_USESTDHANDLES, false); CHAR *charBuf = WinReadFromHandle(g_hChildStd_OUT_Rd); std::string bufferString = charBuf; diff --git a/src/worldService.cpp b/src/worldService.cpp index 846f069f..12c8a7f4 100644 --- a/src/worldService.cpp +++ b/src/worldService.cpp @@ -1,9 +1,11 @@ #include "worldService.hpp" -#include "game.hpp" -#include "room.hpp" + #include #include +#include "game.hpp" +#include "room.hpp" + WorldService::WorldService() { this->lock = false; this->room = std::unique_ptr{}; @@ -22,9 +24,7 @@ void WorldService::setRoom(const std::string_view &filePath) { this->room = std::make_unique(std::string(filePath)); } -void WorldService::setRoomBin(RoomBin bin) { - this->room = std::make_unique(bin); -} +void WorldService::setRoomBin(RoomBin bin) { this->room = std::make_unique(bin); } void WorldService::setRoomBin(const std::string &roomBin) { for (RoomBin bin : Game::getBin().rooms) { @@ -89,8 +89,7 @@ void WorldService::draw() const { room->draw(); if (transitionActive) { - DrawRectangleRec(Rectangle{0, 0, static_cast(GetScreenWidth()), - static_cast(GetScreenHeight())}, + DrawRectangleRec(Rectangle{0, 0, static_cast(GetScreenWidth()), static_cast(GetScreenHeight())}, transitionColor); } } From 7b8e02b1054dee0ba6ada1c3ec2ef9b461a5d065 Mon Sep 17 00:00:00 2001 From: "D. Quan" <60545346+sudoker0@users.noreply.github.com> Date: Fri, 10 Apr 2026 10:25:27 +0700 Subject: [PATCH 13/69] Aggresive code reformatting --- include/editor/actions/action.hpp | 2 +- include/editor/actions/editTileAction.hpp | 2 +- include/editor/actions/eraseTileAction.hpp | 2 +- include/editor/actions/mapAction.hpp | 9 +- include/editor/actions/placeTileAction.hpp | 2 +- include/editor/actions/startPointAction.hpp | 2 +- include/editor/bindTranslation.hpp | 43 +- include/editor/childWindows/aboutWindow.hpp | 2 +- .../childWindows/settingsPanel/base.hpp | 7 +- .../childWindows/settingsPanel/general.hpp | 4 +- .../childWindows/settingsPanel/hotkeys.hpp | 2 +- .../editor/childWindows/settingsWindow.hpp | 4 +- include/editor/components/frameButton.hpp | 12 +- include/editor/components/perfOverlay.hpp | 4 +- .../editor/components/resizableCanvasBox.hpp | 21 +- .../editor/components/resizableContainer.hpp | 25 +- include/editor/components/tooltip.hpp | 4 +- include/editor/defaultConfig.hpp | 11 +- include/editor/editor.hpp | 12 +- include/editor/fileTabRenderer.hpp | 2 +- include/editor/fileViews/actorFileView.hpp | 4 +- include/editor/fileViews/dialogueFileView.hpp | 12 +- include/editor/fileViews/emptyView.hpp | 2 +- include/editor/fileViews/fileView.hpp | 11 +- include/editor/fileViews/fontFileView.hpp | 4 +- include/editor/fileViews/imageFileView.hpp | 4 +- include/editor/fileViews/propFileView.hpp | 4 +- include/editor/fileViews/roomFileView.hpp | 9 +- include/editor/fileViews/soundFileView.hpp | 4 +- include/editor/fileViews/tilesetFileView.hpp | 4 +- include/editor/projectFile.hpp | 12 +- include/editor/projectFileVisitor.hpp | 16 +- include/editor/roomViewModesHandler.hpp | 5 +- include/editor/saveables/fontWrapper.hpp | 8 +- include/editor/saveables/imageWrapper.hpp | 8 +- include/editor/saveables/soundWrapper.hpp | 8 +- include/editor/screens/guiScreen.hpp | 5 +- include/editor/screens/projectScreen.hpp | 11 +- include/editor/screens/welcomeScreen.hpp | 6 +- .../editor/services/childWindowSubService.hpp | 7 +- .../editor/services/configurationService.hpp | 12 +- include/editor/services/editorGuiService.hpp | 11 +- include/editor/services/fileSystemService.hpp | 9 +- include/editor/services/hotkeyService.hpp | 15 +- .../editor/services/recentProjectService.hpp | 6 +- include/editor/services/themeService.hpp | 5 +- .../editor/services/translationService.hpp | 15 +- include/editor/syntaxHighlighter.hpp | 6 +- include/editor/updatable.hpp | 2 +- include/editor/variant.hpp | 18 +- include/editor/views/actorView.hpp | 7 +- include/editor/views/fontView.hpp | 5 +- include/editor/views/imageView.hpp | 5 +- include/editor/views/propView.hpp | 12 +- include/editor/views/roomView.hpp | 7 +- include/editor/views/tileSetView.hpp | 9 +- include/editor/views/worldView.hpp | 15 +- include/editor/widgets/fileChooser.hpp | 8 +- include/editor/widgets/fileTab.hpp | 18 +- include/editor/widgets/frameEditor.hpp | 15 +- include/editor/widgets/hotkeyModifier.hpp | 13 +- include/editor/widgets/newProjectWindow.hpp | 11 +- .../widgets/propertyFields/boolField.hpp | 6 +- .../widgets/propertyFields/fileField.hpp | 14 +- .../widgets/propertyFields/intField.hpp | 9 +- .../widgets/propertyFields/rectangleField.hpp | 9 +- .../widgets/propertyFields/selectField.hpp | 9 +- .../widgets/propertyFields/textField.hpp | 6 +- include/editor/widgets/soundPlayer.hpp | 9 +- include/editor/widgets/toolbox.hpp | 75 +- src/editor/actions/editTileAction.cpp | 1 + src/editor/actions/eraseTileAction.cpp | 67 +- src/editor/actions/placeTileAction.cpp | 154 ++-- src/editor/actions/startPointAction.cpp | 1 + src/editor/childWindows/aboutWindow.cpp | 10 +- src/editor/childWindows/popupWindow.cpp | 19 +- .../childWindows/projectSettingsWindow.cpp | 4 +- .../childWindows/settingsPanel/general.cpp | 51 +- .../childWindows/settingsPanel/hotkeys.cpp | 7 +- src/editor/childWindows/settingsWindow.cpp | 5 +- src/editor/components/frameButton.cpp | 31 +- src/editor/components/perfOverlay.cpp | 32 +- src/editor/components/resizableCanvasBox.cpp | 48 +- src/editor/components/resizableContainer.cpp | 104 +-- src/editor/components/tooltip.cpp | 12 +- src/editor/editor.cpp | 19 +- src/editor/fileViews/actorFileView.cpp | 27 +- src/editor/fileViews/dialogueFileView.cpp | 70 +- src/editor/fileViews/emptyView.cpp | 8 +- src/editor/fileViews/fileView.cpp | 4 +- src/editor/fileViews/fontFileView.cpp | 12 +- src/editor/fileViews/imageFileView.cpp | 9 +- src/editor/fileViews/propFileView.cpp | 43 +- src/editor/fileViews/roomFileView.cpp | 98 +-- src/editor/fileViews/soundFileView.cpp | 20 +- src/editor/fileViews/tilesetFileView.cpp | 24 +- src/editor/projectFile.cpp | 22 +- src/editor/roomViewModesHandler.cpp | 90 +- src/editor/saveables/fontWrapper.cpp | 4 +- src/editor/saveables/imageWrapper.cpp | 4 +- src/editor/saveables/soundWrapper.cpp | 4 +- src/editor/screens/welcomeScreen.cpp | 47 +- src/editor/services/configurationService.cpp | 28 +- src/editor/services/editorGuiService.cpp | 102 +-- src/editor/services/fileSystemService.cpp | 32 +- src/editor/services/hotkeyService.cpp | 45 +- src/editor/services/recentProjectService.cpp | 12 +- src/editor/services/translationService.cpp | 46 +- src/editor/timeFormat.cpp | 4 +- src/editor/views/actorView.cpp | 50 +- src/editor/views/fontView.cpp | 6 +- src/editor/views/imageView.cpp | 1 + src/editor/views/propView.cpp | 88 +- src/editor/views/tileSetView.cpp | 28 +- src/editor/views/worldView.cpp | 50 +- src/editor/widgets/fileChooser.cpp | 27 +- src/editor/widgets/fileTab.cpp | 207 ++--- src/editor/widgets/frameEditor.cpp | 65 +- src/editor/widgets/hotkeyModifier.cpp | 818 +++++++++--------- src/editor/widgets/newProjectWindow.cpp | 45 +- .../widgets/propertyFields/boolField.cpp | 8 +- .../widgets/propertyFields/fileField.cpp | 19 +- .../widgets/propertyFields/intField.cpp | 11 +- .../widgets/propertyFields/rectangleField.cpp | 34 +- .../widgets/propertyFields/selectField.cpp | 15 +- .../widgets/propertyFields/textField.cpp | 13 +- src/editor/widgets/soundPlayer.cpp | 29 +- src/game/main.cpp | 3 +- src/lua/apiTypes.cpp | 128 ++- src/lua/interfaceApi.cpp | 1 + src/lua/soundsApi.cpp | 15 +- src/lua/stateApi.cpp | 5 +- src/lua/worldApi.cpp | 13 +- src/rpgpplua/rpgpplua.cpp | 15 +- 134 files changed, 1604 insertions(+), 2087 deletions(-) diff --git a/include/editor/actions/action.hpp b/include/editor/actions/action.hpp index 8a04ebf7..22415aea 100644 --- a/include/editor/actions/action.hpp +++ b/include/editor/actions/action.hpp @@ -2,7 +2,7 @@ #define _RPGPP_ACTION_H class Action { - public: +public: bool executeOnAdd = true; Action() = default; virtual void execute() {}; diff --git a/include/editor/actions/editTileAction.hpp b/include/editor/actions/editTileAction.hpp index 9fc43afa..1060c516 100644 --- a/include/editor/actions/editTileAction.hpp +++ b/include/editor/actions/editTileAction.hpp @@ -5,7 +5,7 @@ #include "views/tileSetView.hpp" class EditTileAction : public MapAction { - public: +public: EditTileAction(MapActionData a); void execute() override; void undo() override; diff --git a/include/editor/actions/eraseTileAction.hpp b/include/editor/actions/eraseTileAction.hpp index 54716f00..e7847216 100644 --- a/include/editor/actions/eraseTileAction.hpp +++ b/include/editor/actions/eraseTileAction.hpp @@ -4,7 +4,7 @@ #include "mapAction.hpp" class EraseTileAction : public MapAction { - public: +public: EraseTileAction(MapActionData data); void execute() override; void undo() override; diff --git a/include/editor/actions/mapAction.hpp b/include/editor/actions/mapAction.hpp index fa99dcac..994e7c1a 100644 --- a/include/editor/actions/mapAction.hpp +++ b/include/editor/actions/mapAction.hpp @@ -1,13 +1,14 @@ #ifndef _RPGPP_MAPACTION_H #define _RPGPP_MAPACTION_H -#include "action.hpp" -#include "room.hpp" -#include "views/roomView.hpp" #include #include #include +#include "action.hpp" +#include "room.hpp" +#include "views/roomView.hpp" + struct MapActionData { RoomView *view; Room *room; @@ -21,7 +22,7 @@ struct MapActionData { }; class MapAction : public Action { - public: +public: std::unique_ptr prevRoom; MapAction(MapActionData a) { data = a; diff --git a/include/editor/actions/placeTileAction.hpp b/include/editor/actions/placeTileAction.hpp index 433d8fa4..0c7b6c7a 100644 --- a/include/editor/actions/placeTileAction.hpp +++ b/include/editor/actions/placeTileAction.hpp @@ -4,7 +4,7 @@ #include "mapAction.hpp" class PlaceTileAction : public MapAction { - public: +public: PlaceTileAction(MapActionData a); void execute() override; void undo() override; diff --git a/include/editor/actions/startPointAction.hpp b/include/editor/actions/startPointAction.hpp index 4e87c375..c8ab595c 100644 --- a/include/editor/actions/startPointAction.hpp +++ b/include/editor/actions/startPointAction.hpp @@ -3,7 +3,7 @@ #include "actions/mapAction.hpp" class StartPointAction : public MapAction { - public: +public: StartPointAction(MapActionData data); void execute() override; void undo() override; diff --git a/include/editor/bindTranslation.hpp b/include/editor/bindTranslation.hpp index 838448d8..bbb59c00 100644 --- a/include/editor/bindTranslation.hpp +++ b/include/editor/bindTranslation.hpp @@ -1,14 +1,15 @@ -#include "editor.hpp" -#include "services/translationService.hpp" #include #include +#include "editor.hpp" +#include "services/translationService.hpp" + class TSConnection { - public: +public: TSConnection(TranslationService::ListenerID id) : id(id) {} ~TSConnection() { Editor::instance->getTranslations().removeListener(id); } - private: +private: TranslationService::ListenerID id; }; @@ -22,12 +23,9 @@ void bindTranslation(std::shared_ptr widget, const std::string &key, (widget.get()->*setter)(ts.getKey(key)); auto id = ts.addListener( - [weakWidget, key, setter](TranslationService &ts, - TranslationService::ListenerID id, - bool checkingAlive) { + [weakWidget, key, setter](TranslationService &ts, TranslationService::ListenerID id, bool checkingAlive) { if (auto w = weakWidget.lock()) { - if (!checkingAlive) - (w.get()->*setter)(ts.getKey(key)); + if (!checkingAlive) (w.get()->*setter)(ts.getKey(key)); return true; } else { return false; @@ -42,24 +40,19 @@ void bindTranslation(std::shared_ptr widget, const std::string &key, } template -void bindCustomTranslation( - std::shared_ptr widget, - std::function widget, - TranslationService &)> - cb) { +void bindCustomTranslation(std::shared_ptr widget, + std::function widget, TranslationService &)> cb) { auto &ts = Editor::instance->getTranslations(); std::weak_ptr weakWidget = widget; cb(widget, ts); - auto id = ts.addListener([weakWidget, cb](TranslationService &ts, - TranslationService::ListenerID id, - bool checkingAlive) { - if (auto w = weakWidget.lock()) { - if (!checkingAlive) - cb(w, ts); - return true; - } else { - return false; - } - }); + auto id = + ts.addListener([weakWidget, cb](TranslationService &ts, TranslationService::ListenerID id, bool checkingAlive) { + if (auto w = weakWidget.lock()) { + if (!checkingAlive) cb(w, ts); + return true; + } else { + return false; + } + }); } diff --git a/include/editor/childWindows/aboutWindow.hpp b/include/editor/childWindows/aboutWindow.hpp index 45f933e7..6af5605a 100644 --- a/include/editor/childWindows/aboutWindow.hpp +++ b/include/editor/childWindows/aboutWindow.hpp @@ -3,7 +3,7 @@ #include "childWindows/popupWindow.hpp" class AboutWindow : public PopupWindow { - public: +public: AboutWindow(); }; diff --git a/include/editor/childWindows/settingsPanel/base.hpp b/include/editor/childWindows/settingsPanel/base.hpp index 83615fc6..90254580 100644 --- a/include/editor/childWindows/settingsPanel/base.hpp +++ b/include/editor/childWindows/settingsPanel/base.hpp @@ -7,15 +7,14 @@ #include "services/translationService.hpp" class SettingsPanelBase { - protected: +protected: tgui::Panel::Ptr panel; - public: +public: SettingsPanelBase(tgui::TabContainer::Ptr tabContainer, std::string name) { panel = tabContainer->addTab(name); bindCustomTranslation( - tabContainer, [this, name](tgui::TabContainer::Ptr tabContainer, - TranslationService &ts) { + tabContainer, [this, name](tgui::TabContainer::Ptr tabContainer, TranslationService &ts) { int idx = tabContainer->getIndex(panel); tabContainer->changeTabText(idx, ts.getKey(name)); }); diff --git a/include/editor/childWindows/settingsPanel/general.hpp b/include/editor/childWindows/settingsPanel/general.hpp index 849446f5..bcb2fcd3 100644 --- a/include/editor/childWindows/settingsPanel/general.hpp +++ b/include/editor/childWindows/settingsPanel/general.hpp @@ -7,8 +7,8 @@ class SettingsPanelGeneral : public SettingsPanelBase { tgui::MessageBox::Ptr promptUserBox; - public: - explicit SettingsPanelGeneral(tgui::TabContainer::Ptr tabContainer); +public: + explicit SettingsPanelGeneral(tgui::TabContainer::Ptr tabContainer); }; #endif diff --git a/include/editor/childWindows/settingsPanel/hotkeys.hpp b/include/editor/childWindows/settingsPanel/hotkeys.hpp index 8d0c23e7..90e8df3a 100644 --- a/include/editor/childWindows/settingsPanel/hotkeys.hpp +++ b/include/editor/childWindows/settingsPanel/hotkeys.hpp @@ -4,7 +4,7 @@ #define RPGPP_SETTINGSPANEL_HOTKEYS_H class SettingsPanelHotkeys : public SettingsPanelBase { - public: +public: SettingsPanelHotkeys(tgui::TabContainer::Ptr tabContainer); }; diff --git a/include/editor/childWindows/settingsWindow.hpp b/include/editor/childWindows/settingsWindow.hpp index 563ae41a..7b6eea94 100644 --- a/include/editor/childWindows/settingsWindow.hpp +++ b/include/editor/childWindows/settingsWindow.hpp @@ -6,11 +6,11 @@ #include "settingsPanel/hotkeys.hpp" class SettingsWindow : public PopupWindow { - private: +private: std::shared_ptr general; std::shared_ptr hotkeys; - public: +public: SettingsWindow(); }; diff --git a/include/editor/components/frameButton.hpp b/include/editor/components/frameButton.hpp index 456d7503..c7dbf701 100644 --- a/include/editor/components/frameButton.hpp +++ b/include/editor/components/frameButton.hpp @@ -1,29 +1,29 @@ #ifndef RPGPP_FRAMEBUTTON_H #define RPGPP_FRAMEBUTTON_H +#include + #include "TGUI/Signal.hpp" #include "TGUI/Sprite.hpp" #include "TGUI/Widgets/Button.hpp" #include "actor.hpp" -#include class FrameButton : public tgui::Button { - private: +private: int frameIndex; Actor *actor; tgui::Sprite sprite{}; - public: +public: FrameButton(int frameIndex, Actor *actor); typedef std::shared_ptr Ptr; static FrameButton::Ptr create(int frameIndex, Actor *actor); - void draw(tgui::BackendRenderTarget &target, - tgui::RenderStates states) const override; + void draw(tgui::BackendRenderTarget &target, tgui::RenderStates states) const override; void updateSprite(bool reImport = false); // When the frame button is pressed. Optional parameters: frame index tgui::SignalInt onFrameChange = {"OnFrameChange"}; }; -#endif // RPGPP_FRAMEBUTTON_H +#endif // RPGPP_FRAMEBUTTON_H diff --git a/include/editor/components/perfOverlay.hpp b/include/editor/components/perfOverlay.hpp index 26dd8b6f..269337eb 100644 --- a/include/editor/components/perfOverlay.hpp +++ b/include/editor/components/perfOverlay.hpp @@ -3,7 +3,7 @@ #include "raylib.h" class PerformanceOverlay { - public: +public: PerformanceOverlay(); void Update(); @@ -12,7 +12,7 @@ class PerformanceOverlay { void Toggle(); bool IsEnabled() const; - private: +private: bool enabled{false}; static const int SAMPLE_COUNT = 240; diff --git a/include/editor/components/resizableCanvasBox.hpp b/include/editor/components/resizableCanvasBox.hpp index 741b67c1..e49bb87e 100644 --- a/include/editor/components/resizableCanvasBox.hpp +++ b/include/editor/components/resizableCanvasBox.hpp @@ -1,23 +1,16 @@ #ifndef RPGPP_RESIZABLECANVASBOX_H #define RPGPP_RESIZABLECANVASBOX_H -#include "raylib.h" #include -enum ResizeDirection { - NONE = 0, - MOVE = 1 << 0, - TOP = 1 << 1, - BOTTOM = 1 << 2, - LEFT = 1 << 3, - RIGHT = 1 << 4 -}; +#include "raylib.h" + +enum ResizeDirection { NONE = 0, MOVE = 1 << 0, TOP = 1 << 1, BOTTOM = 1 << 2, LEFT = 1 << 3, RIGHT = 1 << 4 }; class ResizableCanvasBox { - public: - ResizableCanvasBox(std::string id, float x, float y, float width, - float height, Color color, bool isResizable = true); - ResizableCanvasBox(std::string id, Rectangle rec, Color color, +public: + ResizableCanvasBox(std::string id, float x, float y, float width, float height, Color color, bool isResizable = true); + ResizableCanvasBox(std::string id, Rectangle rec, Color color, bool isResizable = true); void draw(); // @returns true if the box was clicked, false otherwise @@ -37,7 +30,7 @@ class ResizableCanvasBox { void setMinSize(float size) { minSize = std::max(size, 2.f); } float getMinSize() const { return minSize; } - private: +private: const float RESIZE_MARGIN = 1.f; float minSize = 2.f; bool isResizable = true; diff --git a/include/editor/components/resizableContainer.hpp b/include/editor/components/resizableContainer.hpp index 98609f68..b5f92c48 100644 --- a/include/editor/components/resizableContainer.hpp +++ b/include/editor/components/resizableContainer.hpp @@ -5,16 +5,10 @@ #include "TGUI/Vector2.hpp" #include "TGUI/Widgets/Group.hpp" -enum class ResizeDirection { - MOVE = 0, - LEFT = 1 << 0, - RIGHT = 1 << 1, - TOP = 1 << 2, - BOTTOM = 1 << 3 -}; +enum class ResizeDirection { MOVE = 0, LEFT = 1 << 0, RIGHT = 1 << 1, TOP = 1 << 2, BOTTOM = 1 << 3 }; class ResizableContainer : public tgui::Group { - private: +private: char resizeFlags = 0; int grabberSize = 15; int maxResizeWidth = 0; @@ -29,12 +23,10 @@ class ResizableContainer : public tgui::Group { bool isGrabbing = false; bool cursorModified = false; - bool inEnabledGrabber(ResizeDirection direction, - tgui::Vector2f absolutePos); + bool inEnabledGrabber(ResizeDirection direction, tgui::Vector2f absolutePos); - public: - ResizableContainer(const tgui::Layout2d &size, - const tgui::Layout2d &position); +public: + ResizableContainer(const tgui::Layout2d &size, const tgui::Layout2d &position); void enableResize(ResizeDirection direction); void disableResize(ResizeDirection direction); bool isResizable(ResizeDirection direction); @@ -53,8 +45,7 @@ class ResizableContainer : public tgui::Group { typedef std::shared_ptr Ptr; typedef std::shared_ptr ConstPtr; - static ResizableContainer::Ptr create(const tgui::Layout2d &size, - const tgui::Layout2d &position); + static ResizableContainer::Ptr create(const tgui::Layout2d &size, const tgui::Layout2d &position); static ResizableContainer::Ptr copy(ResizableContainer::ConstPtr widget); bool useExternalMouseEvent = false; @@ -66,8 +57,8 @@ class ResizableContainer : public tgui::Group { tgui::SignalTyped onResize = {"OnResize"}; - protected: +protected: tgui::Widget::Ptr clone() const override; }; -#endif // RPGPP_RESIZABLECONTAINER_H +#endif // RPGPP_RESIZABLECONTAINER_H diff --git a/include/editor/components/tooltip.hpp b/include/editor/components/tooltip.hpp index 161021de..5b57a8f3 100644 --- a/include/editor/components/tooltip.hpp +++ b/include/editor/components/tooltip.hpp @@ -3,7 +3,7 @@ #include "TGUI/Widgets/Label.hpp" class Tooltip : public tgui::Label { - public: +public: Tooltip(const std::string &text); typedef std::shared_ptr Ptr; typedef std::shared_ptr ConstPtr; @@ -11,7 +11,7 @@ class Tooltip : public tgui::Label { static Ptr create(const std::string &text); static Ptr copy(ConstPtr widget); - protected: +protected: tgui::Widget::Ptr clone() const override; }; diff --git a/include/editor/defaultConfig.hpp b/include/editor/defaultConfig.hpp index 4911fd2e..83690626 100644 --- a/include/editor/defaultConfig.hpp +++ b/include/editor/defaultConfig.hpp @@ -1,19 +1,18 @@ -#include "editor.hpp" -#include "raylib.h" -#include "services/hotkeyService.hpp" #include #include #include #include +#include "editor.hpp" +#include "raylib.h" +#include "services/hotkeyService.hpp" + // key-value using ConfigEntry = std::map; // [field] using Config = std::map; -const std::string h(Hotkey hk) { - return std::to_string(HotkeyService::pack(hk)); -} +const std::string h(Hotkey hk) { return std::to_string(HotkeyService::pack(hk)); } const Config BASE_CONFIG = { {"rpgpp", diff --git a/include/editor/editor.hpp b/include/editor/editor.hpp index a29d477f..c8c32509 100644 --- a/include/editor/editor.hpp +++ b/include/editor/editor.hpp @@ -1,23 +1,23 @@ #ifndef _RGPP_EDITOR_H #define _RGPP_EDITOR_H +#include +#include + #include "project.hpp" #include "raylib.h" +#include "services/configurationService.hpp" #include "services/editorGuiService.hpp" #include "services/fileSystemService.hpp" #include "services/hotkeyService.hpp" #include "services/recentProjectService.hpp" #include "services/themeService.hpp" #include "services/translationService.hpp" -#include -#include - -#include "services/configurationService.hpp" #define RPGPP_VERSION 0.1 class Editor { - private: +private: // NOTE: always initialize the configuration service first. // Otherwise, everything gets screwed over. // NOTE: leave this order of fields, @@ -34,7 +34,7 @@ class Editor { HotkeyService hotkeyService; RecentProjectService recentProjectService; - public: +public: Editor(); ~Editor() = default; // The opened project diff --git a/include/editor/fileTabRenderer.hpp b/include/editor/fileTabRenderer.hpp index c7d6f100..91ec5e92 100644 --- a/include/editor/fileTabRenderer.hpp +++ b/include/editor/fileTabRenderer.hpp @@ -3,7 +3,7 @@ #include "TGUI/Renderers/TabsRenderer.hpp" class FileTabRenderer : public tgui::TabsRenderer { - public: +public: using tgui::TabsRenderer::TabsRenderer; }; diff --git a/include/editor/fileViews/actorFileView.hpp b/include/editor/fileViews/actorFileView.hpp index cbc88cee..854649ac 100644 --- a/include/editor/fileViews/actorFileView.hpp +++ b/include/editor/fileViews/actorFileView.hpp @@ -8,12 +8,12 @@ #include "widgets/propertyFields/rectangleField.hpp" class ActorFileView : public FileView { - private: +private: FileField::Ptr tileSetField; RectangleField::Ptr collisionField; ActorView::Ptr actorView; - public: +public: ActorFileView(); FrameEditor::Ptr frameEditor; diff --git a/include/editor/fileViews/dialogueFileView.hpp b/include/editor/fileViews/dialogueFileView.hpp index e3ae89e1..29daf6e3 100644 --- a/include/editor/fileViews/dialogueFileView.hpp +++ b/include/editor/fileViews/dialogueFileView.hpp @@ -1,6 +1,9 @@ #ifndef _RPGPP_FILEVIEWS_DIALOGUEFILEVIEW_H #define _RPGPP_FILEVIEWS_DIALOGUEFILEVIEW_H +#include +#include + #include "TGUI/Texture.hpp" #include "TGUI/Widgets/Button.hpp" #include "TGUI/Widgets/GrowVerticalLayout.hpp" @@ -9,13 +12,11 @@ #include "dialogueBalloon.hpp" #include "fileViews/fileView.hpp" #include "services/translationService.hpp" -#include -#include class DialogueFileView : public FileView { const float DIALOGUE_PANEL_HEIGHT = 200.0f; - private: +private: tgui::Button::Ptr newLineButton; tgui::ScrollablePanel::Ptr mainPanel; tgui::GrowVerticalLayout::Ptr vertLayout; @@ -23,10 +24,9 @@ class DialogueFileView : public FileView { tgui::Texture deleteTexture; std::vector linePanels; - tgui::Panel::Ptr makeLinePanel(DialogueBin &data, DialogueLine line, - size_t i); + tgui::Panel::Ptr makeLinePanel(DialogueBin &data, DialogueLine line, size_t i); - public: +public: DialogueFileView(); void init(tgui::Group::Ptr layout, VariantWrapper *variant) override; }; diff --git a/include/editor/fileViews/emptyView.hpp b/include/editor/fileViews/emptyView.hpp index 4df297ba..e522b062 100644 --- a/include/editor/fileViews/emptyView.hpp +++ b/include/editor/fileViews/emptyView.hpp @@ -5,7 +5,7 @@ #include "variant.hpp" class EmptyFileView : public FileView { - public: +public: EmptyFileView(); void init(tgui::Group::Ptr layout, VariantWrapper *variant) override; }; diff --git a/include/editor/fileViews/fileView.hpp b/include/editor/fileViews/fileView.hpp index 6032707b..f70001ab 100644 --- a/include/editor/fileViews/fileView.hpp +++ b/include/editor/fileViews/fileView.hpp @@ -1,15 +1,16 @@ #ifndef _RPGPP_FILEVIEW_H #define _RPGPP_FILEVIEW_H +#include +#include +#include + #include "TGUI/Widget.hpp" #include "TGUI/Widgets/Group.hpp" #include "actions/action.hpp" #include "variant.hpp" -#include -#include -#include class FileView { - protected: +protected: VariantWrapper *variant; std::vector widgetContainer; std::vector> actions; @@ -19,7 +20,7 @@ class FileView { std::stack> past; std::stack> future; - public: +public: bool fileViewFocused = false; FileView(); diff --git a/include/editor/fileViews/fontFileView.hpp b/include/editor/fileViews/fontFileView.hpp index dd3a4dc8..0c34c2c7 100644 --- a/include/editor/fileViews/fontFileView.hpp +++ b/include/editor/fileViews/fontFileView.hpp @@ -5,11 +5,11 @@ #include "views/fontView.hpp" class FontFileView : public FileView { - public: +public: FontFileView(); void init(tgui::Group::Ptr layout, VariantWrapper *variant) override; - private: +private: FontView::Ptr fontView; }; diff --git a/include/editor/fileViews/imageFileView.hpp b/include/editor/fileViews/imageFileView.hpp index 8ea6dee2..0f900262 100644 --- a/include/editor/fileViews/imageFileView.hpp +++ b/include/editor/fileViews/imageFileView.hpp @@ -6,11 +6,11 @@ #include "views/imageView.hpp" class ImageFileView : public FileView { - public: +public: ImageFileView(); void init(tgui::Group::Ptr layout, VariantWrapper *variant) override; - private: +private: ImageView::Ptr imageView; tgui::Label::Ptr infoLabel; }; diff --git a/include/editor/fileViews/propFileView.hpp b/include/editor/fileViews/propFileView.hpp index 349f7247..91b013c4 100644 --- a/include/editor/fileViews/propFileView.hpp +++ b/include/editor/fileViews/propFileView.hpp @@ -10,12 +10,12 @@ #include "widgets/propertyFields/selectField.hpp" class PropFileView : public FileView { - public: +public: PropFileView(); // ~PropFileView(); void init(tgui::Group::Ptr layout, VariantWrapper *variant) override; - private: +private: void handleModePress(tgui::Vector2f pos); PropView::Ptr propView; static const int RIGHT_PANEL_W = 300; diff --git a/include/editor/fileViews/roomFileView.hpp b/include/editor/fileViews/roomFileView.hpp index 9af1c032..7977f913 100644 --- a/include/editor/fileViews/roomFileView.hpp +++ b/include/editor/fileViews/roomFileView.hpp @@ -1,6 +1,9 @@ #ifndef _RPGPP_ROOMFILEVIEW_H #define _RPGPP_ROOMFILEVIEW_H +#include +#include + #include "fileView.hpp" #include "roomLayerViewVisitor.hpp" #include "roomViewModesHandler.hpp" @@ -10,11 +13,9 @@ #include "widgets/propertyFields/fileField.hpp" #include "widgets/propertyFields/intField.hpp" #include "widgets/toolbox.hpp" -#include -#include class RoomFileView : public FileView { - private: +private: static const int RIGHT_PANEL_W = 300; static const int LAYER_CHOOSE_H = 32; static const int TOOLBOX_H = LAYER_CHOOSE_H; @@ -33,7 +34,7 @@ class RoomFileView : public FileView { void setRoomTool(ToolboxItem tool); std::vector hotkeyEntries; - public: +public: std::unique_ptr modesHandler; RoomFileView(); ~RoomFileView(); diff --git a/include/editor/fileViews/soundFileView.hpp b/include/editor/fileViews/soundFileView.hpp index 745ad02a..03325712 100644 --- a/include/editor/fileViews/soundFileView.hpp +++ b/include/editor/fileViews/soundFileView.hpp @@ -6,11 +6,11 @@ #include "widgets/soundPlayer.hpp" class SoundFileView : public FileView { - public: +public: SoundFileView(); void init(tgui::Group::Ptr layout, VariantWrapper *variant) override; - private: +private: tgui::Label::Ptr infoLabel; SoundPlayer::Ptr soundPlayer; }; diff --git a/include/editor/fileViews/tilesetFileView.hpp b/include/editor/fileViews/tilesetFileView.hpp index 1d95eba4..4b3012aa 100644 --- a/include/editor/fileViews/tilesetFileView.hpp +++ b/include/editor/fileViews/tilesetFileView.hpp @@ -8,14 +8,14 @@ #include "widgets/propertyFields/intField.hpp" class TileSetFileView : public FileView { - private: +private: static const int RIGHT_PANEL_W = 300; TileSetView::Ptr worldView; IntField::Ptr widthField; IntField::Ptr heightField; FileField::Ptr textureFile; - public: +public: TileSetFileView(); void init(tgui::Group::Ptr layout, VariantWrapper *variant) override; }; diff --git a/include/editor/projectFile.hpp b/include/editor/projectFile.hpp index 12fd0f30..1de8129d 100644 --- a/include/editor/projectFile.hpp +++ b/include/editor/projectFile.hpp @@ -1,26 +1,26 @@ #ifndef _RPGPP_PROJECTFILE_H #define _RPGPP_PROJECTFILE_H +#include + #include "TGUI/Widgets/Group.hpp" #include "fileViews/fileView.hpp" #include "services/fileSystemService.hpp" #include "variant.hpp" -#include class ProjectFile { - private: +private: std::unique_ptr view; std::unique_ptr variant; EngineFileType fileType; std::string filePath; bool isSaveable = true; - public: +public: bool isEmpty = false; ProjectFile(); - ProjectFile(std::unique_ptr view, - std::unique_ptr variant, - EngineFileType fileType, bool isSaveable = true); + ProjectFile(std::unique_ptr view, std::unique_ptr variant, EngineFileType fileType, + bool isSaveable = true); void setFilePath(const std::string &filePath); std::string &getFilePath(); void initUi(tgui::Group::Ptr group); diff --git a/include/editor/projectFileVisitor.hpp b/include/editor/projectFileVisitor.hpp index 6dc3d61c..ca7cd670 100644 --- a/include/editor/projectFileVisitor.hpp +++ b/include/editor/projectFileVisitor.hpp @@ -1,23 +1,21 @@ #ifndef _RPGPP_PROJECTFILEVISITOR_H #define _RPGPP_PROJECTFILEVISITOR_H -#include "projectFile.hpp" -#include "services/fileSystemService.hpp" #include #include #include #include +#include "projectFile.hpp" +#include "services/fileSystemService.hpp" + class ProjectFileVisitor { - private: - std::array(const std::string &)>, - FILETYPE_MAX> - funcs; +private: + std::array(const std::string &)>, FILETYPE_MAX> funcs; - public: +public: ProjectFileVisitor(); - std::unique_ptr visit(EngineFileType fileType, - const std::string &path); + std::unique_ptr visit(EngineFileType fileType, const std::string &path); static std::unique_ptr emptyView(const std::string &path); static std::unique_ptr tilesetView(const std::string &path); static std::unique_ptr roomView(const std::string &path); diff --git a/include/editor/roomViewModesHandler.hpp b/include/editor/roomViewModesHandler.hpp index 088c053c..8343c98e 100644 --- a/include/editor/roomViewModesHandler.hpp +++ b/include/editor/roomViewModesHandler.hpp @@ -1,12 +1,13 @@ #ifndef _RPGPP_ROOMVIEWMODESHANDLER_H #define _RPGPP_ROOMVIEWMODESHANDLER_H +#include + #include "TGUI/Vector2.hpp" #include "gamedata.hpp" #include "room.hpp" #include "views/roomView.hpp" #include "views/tileSetView.hpp" -#include struct RoomViewState { RoomTool tool; @@ -18,7 +19,7 @@ struct RoomViewState { }; class RoomViewModesHandler { - public: +public: RoomViewState state; std::weak_ptr view; RoomViewModesHandler(); diff --git a/include/editor/saveables/fontWrapper.hpp b/include/editor/saveables/fontWrapper.hpp index d6c3dca7..9b5cba2e 100644 --- a/include/editor/saveables/fontWrapper.hpp +++ b/include/editor/saveables/fontWrapper.hpp @@ -1,14 +1,16 @@ #ifndef _RPGPP_SAVEABLES_FONTWRAPPER_H #define _RPGPP_SAVEABLES_FONTWRAPPER_H -#include "saveable.hpp" +#include + #include #include -#include #include +#include "saveable.hpp" + class FontWrapper : public ISaveable { - public: +public: Font font{}; std::string fontSource; FontWrapper() = default; diff --git a/include/editor/saveables/imageWrapper.hpp b/include/editor/saveables/imageWrapper.hpp index 19a99139..0e62b60c 100644 --- a/include/editor/saveables/imageWrapper.hpp +++ b/include/editor/saveables/imageWrapper.hpp @@ -1,14 +1,16 @@ #ifndef _RPGPP_SAVEABLES_IMAGEWRAPPER_H #define _RPGPP_SAVEABLES_IMAGEWRAPPER_H -#include "saveable.hpp" +#include + #include #include -#include #include +#include "saveable.hpp" + class ImageWrapper : public ISaveable { - public: +public: Image image{}; std::string source; diff --git a/include/editor/saveables/soundWrapper.hpp b/include/editor/saveables/soundWrapper.hpp index 6215920b..8e30e02d 100644 --- a/include/editor/saveables/soundWrapper.hpp +++ b/include/editor/saveables/soundWrapper.hpp @@ -1,14 +1,16 @@ #ifndef _RPGPP_SAVEABLES_SOUNDWRAPPER_H #define _RPGPP_SAVEABLES_SOUNDWRAPPER_H -#include "saveable.hpp" +#include + #include #include -#include #include +#include "saveable.hpp" + class SoundWrapper : public ISaveable { - public: +public: Music sound{}; std::string source; SoundWrapper() = default; diff --git a/include/editor/screens/guiScreen.hpp b/include/editor/screens/guiScreen.hpp index 2d7d8919..d6e2ddea 100644 --- a/include/editor/screens/guiScreen.hpp +++ b/include/editor/screens/guiScreen.hpp @@ -1,12 +1,13 @@ #ifndef _RPGPP_BASE_GUI_WIDGET_H #define _RPGPP_BASE_GUI_WIDGET_H -#include "TGUI/Widgets/MenuBar.hpp" #include #include +#include "TGUI/Widgets/MenuBar.hpp" + class UIScreen { - public: +public: virtual ~UIScreen() = default; UIScreen() = default; diff --git a/include/editor/screens/projectScreen.hpp b/include/editor/screens/projectScreen.hpp index 41e97c7b..d879de47 100644 --- a/include/editor/screens/projectScreen.hpp +++ b/include/editor/screens/projectScreen.hpp @@ -1,6 +1,8 @@ #ifndef _RPGPP_SCREENS_PROJECT_SCREEN_H #define _RPGPP_SCREENS_PROJECT_SCREEN_H +#include + #include "TGUI/Widgets/ContextMenu.hpp" #include "TGUI/Widgets/Group.hpp" #include "TGUI/Widgets/GrowVerticalLayout.hpp" @@ -13,11 +15,10 @@ #include "services/fileSystemService.hpp" #include "services/translationService.hpp" #include "widgets/fileTab.hpp" -#include namespace screens { class ProjectScreen : public UIScreen { - private: +private: static const int TOOLBAR_H = 54; static const int FILETABS_H = 32; @@ -49,13 +50,13 @@ class ProjectScreen : public UIScreen { tgui::String focusedFile; - private: +private: void switchView(tgui::String id); void clearView(); tgui::Group::Ptr createToolBar(); ResizableContainer::Ptr createResourcesList(); - public: +public: void addFileView(EngineFileType fileType, const std::string &path); void addResourceButtons(EngineFileType fileType); void mouseMove(int x, int y) override; @@ -68,5 +69,5 @@ class ProjectScreen : public UIScreen { tgui::Group::Ptr toolBar; }; -} // namespace screens +} // namespace screens #endif diff --git a/include/editor/screens/welcomeScreen.hpp b/include/editor/screens/welcomeScreen.hpp index 7fc251cb..b47220b4 100644 --- a/include/editor/screens/welcomeScreen.hpp +++ b/include/editor/screens/welcomeScreen.hpp @@ -7,12 +7,12 @@ namespace screens { class WelcomeScreen : public UIScreen { - private: +private: NewProjectWindow::Ptr newProjectDialog; - public: +public: void initItems(tgui::Group::Ptr layout) override; const std::string getNameOfScreen() override { return "Welcome"; } }; -} // namespace screens +} // namespace screens #endif diff --git a/include/editor/services/childWindowSubService.hpp b/include/editor/services/childWindowSubService.hpp index 18a9b58a..86710807 100644 --- a/include/editor/services/childWindowSubService.hpp +++ b/include/editor/services/childWindowSubService.hpp @@ -1,14 +1,15 @@ #ifndef RPGPP_CHILDWINDOWSERVICE_H #define RPGPP_CHILDWINDOWSERVICE_H -#include "childWindows/popupWindow.hpp" #include #include +#include "childWindows/popupWindow.hpp" + class ChildWindowSubService { - private: +private: std::map> childWindows = {}; - public: +public: ChildWindowSubService(); void createWindows(); void openWindow(const std::string &windowName); diff --git a/include/editor/services/configurationService.hpp b/include/editor/services/configurationService.hpp index 27a5eedc..5c9135c0 100644 --- a/include/editor/services/configurationService.hpp +++ b/include/editor/services/configurationService.hpp @@ -7,21 +7,19 @@ constexpr auto GENERAL_CONF_FIELD = "rpgpp"; #define RPGPP_CONFIG_FILE "rpgpp.ini" class ConfigurationService { - private: +private: std::unique_ptr iniFile; mINI::INIStructure iniStructure; void regenerate(); - public: +public: ConfigurationService(); mINI::INIMap> getField(const std::string &field); std::string getStringValue(const std::string &key); - std::string getStringValue(const std::string &field, - const std::string &key); + std::string getStringValue(const std::string &field, const std::string &key); void setStringValue(const std::string &key, const std::string &value); - void setStringValue(const std::string &field, const std::string &key, - const std::string &value); + void setStringValue(const std::string &field, const std::string &key, const std::string &value); void saveConfiguration(); }; -#endif // RPGPP_CONFIGURATIONSERVICE_H +#endif // RPGPP_CONFIGURATIONSERVICE_H diff --git a/include/editor/services/editorGuiService.hpp b/include/editor/services/editorGuiService.hpp index ecd8c859..7d67c5fa 100644 --- a/include/editor/services/editorGuiService.hpp +++ b/include/editor/services/editorGuiService.hpp @@ -1,6 +1,10 @@ #ifndef _RGPP_EDITOR_GUI_CONTAINER_H #define _RGPP_EDITOR_GUI_CONTAINER_H +#include +#include +#include + #include "TGUI/Backend/raylib.hpp" #include "TGUI/Widget.hpp" #include "TGUI/Widgets/Group.hpp" @@ -11,14 +15,11 @@ #include "screens/guiScreen.hpp" #include "services/childWindowSubService.hpp" #include "updatable.hpp" -#include -#include -#include constexpr auto RPGPP_EXECUTABLE_LOGO = "resources/app-icon.png"; constexpr int ACTION_BUTTON_SIZE = 16; class EditorGuiService { - private: +private: std::vector> updatableWidgets; std::unique_ptr childWindowService; PerformanceOverlay perfOverlay; @@ -29,7 +30,7 @@ class EditorGuiService { std::weak_ptr screenContainer{}; - public: +public: bool isResettingUI = false; EditorGuiService(); ~EditorGuiService() = default; diff --git a/include/editor/services/fileSystemService.hpp b/include/editor/services/fileSystemService.hpp index 458b7624..7010bfcc 100644 --- a/include/editor/services/fileSystemService.hpp +++ b/include/editor/services/fileSystemService.hpp @@ -1,14 +1,15 @@ #ifndef _RPGPP_FILESYSTEMSERVICE_H #define _RPGPP_FILESYSTEMSERVICE_H -#include "TGUI/String.hpp" -#include "variant.hpp" #include #include #include #include #include +#include "TGUI/String.hpp" +#include "variant.hpp" + #define FILETYPE_MAX 11 enum class EngineFileType { @@ -26,11 +27,11 @@ enum class EngineFileType { }; class FileSystemService { - private: +private: std::array typeNames; std::string editorBaseDir; - public: +public: FileSystemService(); void unload(); void promptNewProject(); diff --git a/include/editor/services/hotkeyService.hpp b/include/editor/services/hotkeyService.hpp index 10cc1fe7..a6831f15 100644 --- a/include/editor/services/hotkeyService.hpp +++ b/include/editor/services/hotkeyService.hpp @@ -1,10 +1,11 @@ -#include "ini.h" -#include "raylib.h" #include #include #include +#include "ini.h" +#include "raylib.h" + #ifndef RPGPP_HOTKEYSERVICE_H #define RPGPP_HOTKEYSERVICE_H @@ -39,16 +40,14 @@ struct Hotkey { }; using HotkeyMap = std::unordered_map; class HotkeyService { - private: - std::map>> - hotkeysCb; +private: + std::map>> hotkeysCb; void write(const std::string &keyId, const std::string &keyStr); HotkeyMap hotkeyMap; - public: +public: HotkeyService(); - std::string registerHotkeyCallback(const std::string &keyId, - std::function cb); + std::string registerHotkeyCallback(const std::string &keyId, std::function cb); void unregisterHotkeyCallback(const std::string &uniqueHkCbId); void addHotkey(const std::string &keyId, const Hotkey &keys); void removeHotkey(const std::string &keyId); diff --git a/include/editor/services/recentProjectService.hpp b/include/editor/services/recentProjectService.hpp index c8f0e691..1b57933a 100644 --- a/include/editor/services/recentProjectService.hpp +++ b/include/editor/services/recentProjectService.hpp @@ -8,16 +8,16 @@ #define RPGPP_RECENT_FILE ".rpgpp_recent_project" class RecentProjectService { - private: +private: int limit = 10; std::deque recentProjects; std::filesystem::path path; void save(); - public: +public: RecentProjectService(); void enqueue(const std::string &projectPath); const std::deque &getRecentProjects() const; }; -#endif // RPGPP_RECENTPROJECTSERVICE_H +#endif // RPGPP_RECENTPROJECTSERVICE_H diff --git a/include/editor/services/themeService.hpp b/include/editor/services/themeService.hpp index 975c9cab..19e33e5b 100644 --- a/include/editor/services/themeService.hpp +++ b/include/editor/services/themeService.hpp @@ -1,8 +1,9 @@ -#include "TGUI/Loading/Theme.hpp" #include #include #include +#include "TGUI/Loading/Theme.hpp" + #ifndef RPGPP_THEMESERVICE_H #define RPGPP_THEMESERVICE_H @@ -12,7 +13,7 @@ constexpr const char *THEME_DIR = "themes"; constexpr const char *DEFAULT_THEME = "Dark"; class ThemeService { - public: +public: ThemeService(Editor *editor_ptr); std::string current_theme_name = DEFAULT_THEME; std::shared_ptr current_theme; diff --git a/include/editor/services/translationService.hpp b/include/editor/services/translationService.hpp index f7a50306..4927fecd 100644 --- a/include/editor/services/translationService.hpp +++ b/include/editor/services/translationService.hpp @@ -21,10 +21,10 @@ constexpr auto DEFAULT_LANGUAGE = "en_us"; // Placeholders are defined with two curly brackets (like `{{test}}`) // and can be replaced using `.replace("test", "value")` class TranslatedString { - private: +private: std::string value; - public: +public: TranslatedString(const std::string &value) : value(value) {} TranslatedString replace(const std::string &k, const std::string &v) { std::string finder = "{{" + k + "}}"; @@ -39,10 +39,9 @@ class TranslatedString { }; class TranslationService { - public: +public: using ListenerID = size_t; - using Callback = std::function; + using Callback = std::function; TranslationService(Editor *editor_ptr); TranslatedString getKey(const std::string &key); void setLanguage(const std::string &language); @@ -53,10 +52,8 @@ class TranslationService { void purgeDeadListeners(); std::map langKeyToName = {}; - private: - std::map>, - std::less<>> - translations = {}; +private: + std::map>, std::less<>> translations = {}; std::map translationFiles = {}; std::string current_language = DEFAULT_LANGUAGE; std::unordered_map listeners; diff --git a/include/editor/syntaxHighlighter.hpp b/include/editor/syntaxHighlighter.hpp index 3d795db4..65772c63 100644 --- a/include/editor/syntaxHighlighter.hpp +++ b/include/editor/syntaxHighlighter.hpp @@ -12,7 +12,7 @@ namespace EditorHighlighting { struct HighlighterStruct { - public: +public: std::string type; uint32_t start; uint32_t end; @@ -20,7 +20,7 @@ struct HighlighterStruct { }; struct TextStyling { - public: +public: tgui::Color color; tgui::TextStyle textStyle; }; @@ -32,6 +32,6 @@ struct TextPiece { std::size_t nodeEnd; }; -} // namespace EditorHighlighting +} // namespace EditorHighlighting #endif /* RPGPP_SYNTAX_HIGHLIGHTER */ diff --git a/include/editor/updatable.hpp b/include/editor/updatable.hpp index f1b44819..fece970f 100644 --- a/include/editor/updatable.hpp +++ b/include/editor/updatable.hpp @@ -2,7 +2,7 @@ #define _RPGPP_UPDATABLE_H class IUpdatable { - public: +public: virtual ~IUpdatable() = default; virtual void update() = 0; diff --git a/include/editor/variant.hpp b/include/editor/variant.hpp index 573fbfca..0f223a6c 100644 --- a/include/editor/variant.hpp +++ b/include/editor/variant.hpp @@ -1,25 +1,26 @@ #ifndef _RPGPP_VARIANT_H #define _RPGPP_VARIANT_H -#include "saveable.hpp" #include +#include "saveable.hpp" + class VariantWrapper { - public: +public: VariantWrapper() {}; virtual ~VariantWrapper() {}; virtual ISaveable *toSaveable() = 0; }; class SaveableVariant { - public: +public: std::unique_ptr data; }; -template class Variant : public VariantWrapper { - public: - static_assert(std::is_base_of::value, - "The template is not the base of ISaveable"); +template +class Variant : public VariantWrapper { +public: + static_assert(std::is_base_of::value, "The template is not the base of ISaveable"); std::unique_ptr data; Variant() = default; @@ -32,7 +33,8 @@ template class Variant : public VariantWrapper { ISaveable *toSaveable() { return dynamic_cast(data.get()); } }; -template ISaveable *toSaveable(Variant *variant) { +template +ISaveable *toSaveable(Variant *variant) { return dynamic_cast(variant->data.get()); } diff --git a/include/editor/views/actorView.hpp b/include/editor/views/actorView.hpp index fb9c348e..19933fe1 100644 --- a/include/editor/views/actorView.hpp +++ b/include/editor/views/actorView.hpp @@ -1,24 +1,25 @@ #ifndef RPGPP_ACTORVIEW_H #define RPGPP_ACTORVIEW_H +#include + #include "actor.hpp" #include "components/resizableCanvasBox.hpp" #include "raylib.h" #include "views/worldView.hpp" -#include constexpr float DEFAULT_ANIMATION_SPEED{2.0f}; class ActorFileView; class ActorView : public WorldView { - private: +private: std::unique_ptr collisionBox; std::unique_ptr atlasBox; float animationCurrentDuration{0.0f}; ActorFileView *actorFileView; - public: +public: ActorView(ActorFileView *actorFileView); Actor *actor{nullptr}; diff --git a/include/editor/views/fontView.hpp b/include/editor/views/fontView.hpp index 8e0219e0..31c4b8b6 100644 --- a/include/editor/views/fontView.hpp +++ b/include/editor/views/fontView.hpp @@ -1,12 +1,13 @@ #ifndef _RPGPP_VIEWS_FONTVIEW_H #define _RPGPP_VIEWS_FONTVIEW_H +#include + #include "saveables/fontWrapper.hpp" #include "views/worldView.hpp" -#include class FontView : public WorldView { - public: +public: typedef std::shared_ptr Ptr; FontView(); diff --git a/include/editor/views/imageView.hpp b/include/editor/views/imageView.hpp index 2d06fd1a..77799288 100644 --- a/include/editor/views/imageView.hpp +++ b/include/editor/views/imageView.hpp @@ -1,13 +1,14 @@ #ifndef _RPGPP_VIEWS_IMAGEVIEW_H #define _RPGPP_VIEWS_IMAGEVIEW_H +#include + #include "raylib.h" #include "saveables/imageWrapper.hpp" #include "views/worldView.hpp" -#include class ImageView : public WorldView { - public: +public: typedef std::shared_ptr Ptr; ImageView(); diff --git a/include/editor/views/propView.hpp b/include/editor/views/propView.hpp index f88a4c3a..d4e3fe3f 100644 --- a/include/editor/views/propView.hpp +++ b/include/editor/views/propView.hpp @@ -1,17 +1,18 @@ #ifndef _RPGPP_PROPVIEWER_H #define _RPGPP_PROPVIEWER_H +#include +#include + #include "TGUI/Signal.hpp" #include "components/resizableCanvasBox.hpp" #include "prop.hpp" #include "raylib.h" #include "views/worldView.hpp" -#include -#include enum RectType { ATLAS_RECT, COLLISION_RECT }; class PropView : public WorldView { - public: +public: PropView(); typedef std::shared_ptr Ptr; Prop *p{nullptr}; @@ -33,10 +34,9 @@ class PropView : public WorldView { void updateCollisionRect(Rectangle r); tgui::SignalTyped onUpdatedAtlasRect = {"onUpdatedAtlasRect"}; - tgui::SignalTyped onUpdatedCollisionRect = { - "onUpdatedCollisionRect"}; + tgui::SignalTyped onUpdatedCollisionRect = {"onUpdatedCollisionRect"}; - private: +private: std::list boxes; ResizableCanvasBox *focusedBox = nullptr; }; diff --git a/include/editor/views/roomView.hpp b/include/editor/views/roomView.hpp index 5d22b672..4400d5dd 100644 --- a/include/editor/views/roomView.hpp +++ b/include/editor/views/roomView.hpp @@ -1,6 +1,8 @@ #ifndef _RPGPP_ROOMVIEW_H #define _RPGPP_ROOMVIEW_H +#include + #include "TGUI/Vector2.hpp" #include "TGUI/Widgets/ComboBox.hpp" #include "fileViews/fileView.hpp" @@ -11,14 +13,13 @@ #include "tileSetView.hpp" #include "tilemap.hpp" #include "views/worldView.hpp" -#include class RoomViewModesHandler; class RoomView : public WorldView { friend class RoomViewModesHandler; - private: +private: RoomLayer layer; IVector selectedTile{-1, -1}; bool brushMode = false; @@ -33,7 +34,7 @@ class RoomView : public WorldView { void handleModePress(tgui::Vector2f pos); void handleEditPress(tgui::Vector2f pos); - public: +public: typedef std::shared_ptr Ptr; Room *room{nullptr}; diff --git a/include/editor/views/tileSetView.hpp b/include/editor/views/tileSetView.hpp index 5a9982fa..02ea83dd 100644 --- a/include/editor/views/tileSetView.hpp +++ b/include/editor/views/tileSetView.hpp @@ -1,18 +1,19 @@ #ifndef RPGPP_TILESETTEXTUREVIEWER #define RPGPP_TILESETTEXTUREVIEWER +#include + #include "TGUI/Signal.hpp" #include "gamedata.hpp" #include "tileset.hpp" #include "views/worldView.hpp" -#include class TileSetView : public WorldView { - private: +private: IVector getTileAtMouse(); IVector selectedTile; - public: +public: typedef std::shared_ptr Ptr; tgui::SignalTyped onTileSelected = {"TileSelected"}; @@ -34,4 +35,4 @@ class TileSetView : public WorldView { bool leftMousePressed(tgui::Vector2f pos) override; }; -#endif // RPGPP_TILESETTEXTUREVIEWER +#endif // RPGPP_TILESETTEXTUREVIEWER diff --git a/include/editor/views/worldView.hpp b/include/editor/views/worldView.hpp index 949eaf47..d4186ee5 100644 --- a/include/editor/views/worldView.hpp +++ b/include/editor/views/worldView.hpp @@ -1,16 +1,17 @@ #ifndef _RPGPP_WORLDVIEW_H #define _RPGPP_WORLDVIEW_H +#include + #include "TGUI/Backend/Renderer/Raylib/CanvasRaylib.hpp" #include "TGUI/Vector2.hpp" #include "TGUI/Widget.hpp" #include "constants/room.hpp" #include "raylib.h" #include "updatable.hpp" -#include class WorldView : public tgui::CanvasRaylib, public IUpdatable { - protected: +protected: Camera2D camera; RenderTexture texture; bool mouseMiddleButton = false; @@ -24,7 +25,7 @@ class WorldView : public tgui::CanvasRaylib, public IUpdatable { float cameraMaxZoom = 5; tgui::Vector2f widgetSize{}; - public: +public: typedef std::shared_ptr Ptr; typedef std::shared_ptr ConstPtr; @@ -36,8 +37,7 @@ class WorldView : public tgui::CanvasRaylib, public IUpdatable { void setSize(const tgui::Layout2d &size) override; bool isMouseOnWidget(tgui::Vector2f pos) const override; - void draw(tgui::BackendRenderTarget &target, - tgui::RenderStates states) const override; + void draw(tgui::BackendRenderTarget &target, tgui::RenderStates states) const override; void resetRender(); @@ -57,13 +57,12 @@ class WorldView : public tgui::CanvasRaylib, public IUpdatable { void drawOrigin(); void update() override; - static std::shared_ptr - asUpdatable(const std::shared_ptr &ptr); + static std::shared_ptr asUpdatable(const std::shared_ptr &ptr); void setTool(RoomTool newTool); bool isInView(); - protected: +protected: tgui::Widget::Ptr clone() const override; }; diff --git a/include/editor/widgets/fileChooser.hpp b/include/editor/widgets/fileChooser.hpp index fe69e2ef..cce93268 100644 --- a/include/editor/widgets/fileChooser.hpp +++ b/include/editor/widgets/fileChooser.hpp @@ -7,12 +7,12 @@ #include "TGUI/Widgets/EditBox.hpp" class FileChooser : public tgui::SubwidgetContainer { - private: +private: tgui::String chosenPath; bool selectingDirectory = false; static const int PADDING = 4; - public: +public: tgui::EditBox::Ptr chosenPathLabel; tgui::BitmapButton::Ptr iconButton; std::vector>> pathFilters; @@ -32,10 +32,10 @@ class FileChooser : public tgui::SubwidgetContainer { void setSelectingDirectory(bool selectingDirectory); - private: +private: void updateSize(); - protected: +protected: Widget::Ptr clone() const override; }; diff --git a/include/editor/widgets/fileTab.hpp b/include/editor/widgets/fileTab.hpp index cf364ce3..6f559474 100644 --- a/include/editor/widgets/fileTab.hpp +++ b/include/editor/widgets/fileTab.hpp @@ -1,15 +1,16 @@ #ifndef _RPGPP_FILETAB_H #define _RPGPP_FILETAB_H +#include + #include "TGUI/Signal.hpp" #include "TGUI/Widget.hpp" #include "TGUI/Widgets/Tabs.hpp" #include "components/tooltip.hpp" #include "fileTabRenderer.hpp" -#include class FileTab : public tgui::Tabs { - private: +private: bool isHovering = false; bool isHoldingMouse = false; bool isDragging = false; @@ -27,13 +28,11 @@ class FileTab : public tgui::Tabs { bool cursorModified = false; - void renderTab(tgui::BackendRenderTarget &target, - tgui::RenderStates &states, int idx, bool roundedCorners, - float borderWidth, float usableHeight, - tgui::Sprite &close) const; + void renderTab(tgui::BackendRenderTarget &target, tgui::RenderStates &states, int idx, bool roundedCorners, + float borderWidth, float usableHeight, tgui::Sprite &close) const; void closeAndOpenNextTab(std::size_t idx); - public: +public: bool useExternalMouseEvent = false; typedef std::shared_ptr Ptr; typedef std::shared_ptr ConstPtr; @@ -46,8 +45,7 @@ class FileTab : public tgui::Tabs { static FileTab::Ptr copy(FileTab::ConstPtr widget); - void draw(tgui::BackendRenderTarget &target, - tgui::RenderStates states) const override; + void draw(tgui::BackendRenderTarget &target, tgui::RenderStates states) const override; FileTabRenderer *getSharedRenderer() override; @@ -66,7 +64,7 @@ class FileTab : public tgui::Tabs { size_t addFileTab(const std::string &path, const std::string &fileName); void closeCurrentTab(); - protected: +protected: Widget::Ptr clone() const override; }; diff --git a/include/editor/widgets/frameEditor.hpp b/include/editor/widgets/frameEditor.hpp index 5ce7568f..31885fa6 100644 --- a/include/editor/widgets/frameEditor.hpp +++ b/include/editor/widgets/frameEditor.hpp @@ -1,6 +1,9 @@ #ifndef RPGPP_FRAMEEDITOR_H #define RPGPP_FRAMEEDITOR_H +#include +#include + #include "TGUI/SubwidgetContainer.hpp" #include "TGUI/Widget.hpp" #include "TGUI/Widgets/Button.hpp" @@ -11,13 +14,10 @@ #include "TGUI/Widgets/ToggleButton.hpp" #include "components/frameButton.hpp" #include "views/actorView.hpp" -#include -#include class ActorFileView; class FrameEditor : public tgui::ScrollablePanel { - - private: +private: ActorFileView *fileView; ActorView::Ptr actorView; @@ -27,9 +27,8 @@ class FrameEditor : public tgui::ScrollablePanel { tgui::GrowHorizontalLayout::Ptr frameLayout; std::vector frameButtons; - public: - FrameEditor(ActorFileView *fileView, const char *typeName = "FileChooser", - bool initRenderer = true); +public: + FrameEditor(ActorFileView *fileView, const char *typeName = "FileChooser", bool initRenderer = true); typedef std::shared_ptr Ptr; static FrameEditor::Ptr create(ActorFileView *fileView); @@ -43,7 +42,7 @@ class FrameEditor : public tgui::ScrollablePanel { void addFrameButton(int index); - protected: +protected: tgui::Widget::Ptr clone() const override; }; diff --git a/include/editor/widgets/hotkeyModifier.hpp b/include/editor/widgets/hotkeyModifier.hpp index 6a7ca958..ddbc3d64 100644 --- a/include/editor/widgets/hotkeyModifier.hpp +++ b/include/editor/widgets/hotkeyModifier.hpp @@ -13,29 +13,28 @@ enum State { DEFAULT, START_EDITING, IS_EDITING }; using tguiKey = tgui::Event::KeyboardKey; class HotkeyModifier : public tgui::SubwidgetContainer { - private: +private: std::vector keys; Hotkey hk; tgui::Button::Ptr button; State modifingState = DEFAULT; std::string id; - public: +public: typedef std::shared_ptr Ptr; typedef std::shared_ptr ConstPtr; - HotkeyModifier(const char *typeName = "FileChooser", - bool initRenderer = true); + HotkeyModifier(const char *typeName = "FileChooser", bool initRenderer = true); static HotkeyModifier::Ptr create(); static HotkeyModifier::Ptr copy(HotkeyModifier::ConstPtr widget); void keyPressed(const tgui::Event::KeyEvent &event) override; - void setKey(const std::string &id, KeyboardKey key, bool isShift, - bool isCtrl, bool isAlt, bool isSuper, bool override = false); + void setKey(const std::string &id, KeyboardKey key, bool isShift, bool isCtrl, bool isAlt, bool isSuper, + bool override = false); tgui::SignalTyped2 onChange = {"onChange"}; - protected: +protected: Widget::Ptr clone() const override; }; diff --git a/include/editor/widgets/newProjectWindow.hpp b/include/editor/widgets/newProjectWindow.hpp index a9209980..d0d6f3dd 100644 --- a/include/editor/widgets/newProjectWindow.hpp +++ b/include/editor/widgets/newProjectWindow.hpp @@ -12,7 +12,7 @@ // TODO: Segfault happens when editor is closed. This widget could be causing // segfault, specially when it is at least opened once. class NewProjectWindow { - public: +public: tgui::ChildWindow::Ptr window{nullptr}; tgui::EditBox::Ptr titleField; FileChooser::Ptr fileField; @@ -23,8 +23,7 @@ class NewProjectWindow { typedef std::shared_ptr Ptr; typedef std::shared_ptr ConstPtr; - NewProjectWindow(const char *typeName = "NewProjectWindow", - bool initRenderer = true); + NewProjectWindow(const char *typeName = "NewProjectWindow", bool initRenderer = true); static NewProjectWindow::Ptr create(); static NewProjectWindow::Ptr create(const tgui::String &title); @@ -35,11 +34,9 @@ class NewProjectWindow { void updateSize(const tgui::Layout2d &size); void setFieldTitle(const tgui::String &title); void setFileFieldTitle(const tgui::String &title); - void setPathFilters( - std::vector>> - pathFilters); + void setPathFilters(std::vector>> pathFilters); - private: +private: static const int FIELD_H = 24; static const int BUTTON_W = 100; static const int BUTTON_H = 24; diff --git a/include/editor/widgets/propertyFields/boolField.hpp b/include/editor/widgets/propertyFields/boolField.hpp index a650df00..9c3e4d5a 100644 --- a/include/editor/widgets/propertyFields/boolField.hpp +++ b/include/editor/widgets/propertyFields/boolField.hpp @@ -6,13 +6,13 @@ #include "TGUI/Widgets/CheckBox.hpp" #include "TGUI/Widgets/Label.hpp" class BoolField : public tgui::SubwidgetContainer { - private: +private: void updateSize(); - protected: +protected: tgui::Widget::Ptr clone() const override; - public: +public: tgui::Label::Ptr label; tgui::CheckBox::Ptr value; diff --git a/include/editor/widgets/propertyFields/fileField.hpp b/include/editor/widgets/propertyFields/fileField.hpp index 925abe9a..ca780999 100644 --- a/include/editor/widgets/propertyFields/fileField.hpp +++ b/include/editor/widgets/propertyFields/fileField.hpp @@ -1,22 +1,23 @@ #ifndef _RPGPP_FILEFIELD_H #define _RPGPP_FILEFIELD_H +#include +#include + #include "TGUI/SubwidgetContainer.hpp" #include "TGUI/Widget.hpp" #include "TGUI/Widgets/Button.hpp" #include "TGUI/Widgets/Label.hpp" -#include -#include class FileField : public tgui::SubwidgetContainer { - private: +private: tgui::String chosenPath; void updateSize(); - protected: +protected: tgui::Widget::Ptr clone() const override; - public: +public: tgui::Label::Ptr label; tgui::Button::Ptr value; std::vector>> pathFilters; @@ -28,8 +29,7 @@ class FileField : public tgui::SubwidgetContainer { FileField(const char *typeName = "FileField", bool initRenderer = true); static FileField::Ptr create(); - static FileField::Ptr create(const tgui::String &label, - const tgui::String &value); + static FileField::Ptr create(const tgui::String &label, const tgui::String &value); static FileField::Ptr copy(FileField::ConstPtr widget); void setValue(const tgui::String &value); diff --git a/include/editor/widgets/propertyFields/intField.hpp b/include/editor/widgets/propertyFields/intField.hpp index 0ffa1212..2b1b980f 100644 --- a/include/editor/widgets/propertyFields/intField.hpp +++ b/include/editor/widgets/propertyFields/intField.hpp @@ -1,20 +1,21 @@ #ifndef _RPGPP_INTFIELD_H #define _RPGPP_INTFIELD_H +#include + #include "TGUI/SubwidgetContainer.hpp" #include "TGUI/Widget.hpp" #include "TGUI/Widgets/Label.hpp" #include "TGUI/Widgets/SpinControl.hpp" -#include class IntField : public tgui::SubwidgetContainer { - private: +private: void updateSize(); - protected: +protected: tgui::Widget::Ptr clone() const override; - public: +public: tgui::Label::Ptr label; tgui::SpinControl::Ptr value; diff --git a/include/editor/widgets/propertyFields/rectangleField.hpp b/include/editor/widgets/propertyFields/rectangleField.hpp index 2da8bbb1..bdeba680 100644 --- a/include/editor/widgets/propertyFields/rectangleField.hpp +++ b/include/editor/widgets/propertyFields/rectangleField.hpp @@ -7,7 +7,7 @@ #include "TGUI/Widgets/SpinControl.hpp" #include "raylib.h" class RectangleField : public tgui::SubwidgetContainer { - private: +private: void updateSize(); tgui::Label::Ptr l_x; tgui::Label::Ptr l_y; @@ -18,10 +18,10 @@ class RectangleField : public tgui::SubwidgetContainer { tgui::SpinControl::Ptr value_width; tgui::SpinControl::Ptr value_height; - protected: +protected: tgui::Widget::Ptr clone() const override; - public: +public: tgui::Label::Ptr label; void setValue(Rectangle value); Rectangle getValue(); @@ -30,8 +30,7 @@ class RectangleField : public tgui::SubwidgetContainer { typedef std::shared_ptr Ptr; typedef std::shared_ptr ConstPtr; - RectangleField(const char *typeName = "RectangleField", - bool initRenderer = true); + RectangleField(const char *typeName = "RectangleField", bool initRenderer = true); static Ptr create(); static Ptr copy(ConstPtr widget); diff --git a/include/editor/widgets/propertyFields/selectField.hpp b/include/editor/widgets/propertyFields/selectField.hpp index c4ff6206..7511b7d7 100644 --- a/include/editor/widgets/propertyFields/selectField.hpp +++ b/include/editor/widgets/propertyFields/selectField.hpp @@ -2,22 +2,23 @@ #ifndef _RPGPP_SELECTFIELD_H #define _RPGPP_SELECTFIELD_H +#include + #include "TGUI/SubwidgetContainer.hpp" #include "TGUI/Widget.hpp" #include "TGUI/Widgets/ComboBox.hpp" #include "TGUI/Widgets/Group.hpp" #include "TGUI/Widgets/Label.hpp" #include "TGUI/Widgets/SpinControl.hpp" -#include class SelectField : public tgui::Group { - private: +private: void updateSize(); - protected: +protected: tgui::Widget::Ptr clone() const override; - public: +public: tgui::Label::Ptr label; tgui::ComboBox::Ptr value; diff --git a/include/editor/widgets/propertyFields/textField.hpp b/include/editor/widgets/propertyFields/textField.hpp index 40c40d8a..931fdb28 100644 --- a/include/editor/widgets/propertyFields/textField.hpp +++ b/include/editor/widgets/propertyFields/textField.hpp @@ -6,13 +6,13 @@ #include class TextField : public tgui::SubwidgetContainer { - private: +private: void updateSize(); - protected: +protected: tgui::Widget::Ptr clone() const override; - public: +public: tgui::Label::Ptr label; tgui::EditBox::Ptr value; diff --git a/include/editor/widgets/soundPlayer.hpp b/include/editor/widgets/soundPlayer.hpp index eac6893f..8d550563 100644 --- a/include/editor/widgets/soundPlayer.hpp +++ b/include/editor/widgets/soundPlayer.hpp @@ -1,6 +1,8 @@ #ifndef _RPGPP_WIDGETS_SOUNDPLAYER_H #define _RPGPP_WIDGETS_SOUNDPLAYER_H +#include + #include "TGUI/SubwidgetContainer.hpp" #include "TGUI/Texture.hpp" #include "TGUI/Widgets/BitmapButton.hpp" @@ -9,10 +11,9 @@ #include "TGUI/Widgets/Slider.hpp" #include "saveables/soundWrapper.hpp" #include "updatable.hpp" -#include class SoundPlayer : public tgui::SubwidgetContainer, public IUpdatable { - public: +public: typedef std::shared_ptr Ptr; tgui::Panel::Ptr panel; @@ -32,7 +33,7 @@ class SoundPlayer : public tgui::SubwidgetContainer, public IUpdatable { void setSound(SoundWrapper *sound); SoundWrapper *getSound(); - private: +private: SoundWrapper *sound; void updateSize(); @@ -43,7 +44,7 @@ class SoundPlayer : public tgui::SubwidgetContainer, public IUpdatable { bool mouseOnSlider = false; bool hasPlayed = false; - protected: +protected: Widget::Ptr clone() const override; }; diff --git a/include/editor/widgets/toolbox.hpp b/include/editor/widgets/toolbox.hpp index b53b83c9..40939472 100644 --- a/include/editor/widgets/toolbox.hpp +++ b/include/editor/widgets/toolbox.hpp @@ -1,5 +1,7 @@ #ifndef _RPGPP_TOOLBOX2_H #define _RPGPP_TOOLBOX2_H +#include + #include "TGUI/Backend/Renderer/BackendRenderTarget.hpp" #include "TGUI/Vector2.hpp" #include "TGUI/Widgets/BitmapButton.hpp" @@ -8,20 +10,22 @@ #include "TGUI/Widgets/ScrollablePanel.hpp" #include "components/tooltip.hpp" #include "editor.hpp" -#include -template struct ToolboxItemIdentifier { +template +struct ToolboxItemIdentifier { std::string group; IdType id; }; -template struct ToolboxItem : ToolboxItemIdentifier { +template +struct ToolboxItem : ToolboxItemIdentifier { std::string text{}; std::string iconResourcePath{}; }; -template class Toolbox : public tgui::ScrollablePanel { - private: +template +class Toolbox : public tgui::ScrollablePanel { +private: std::vector> toolboxItems; float spaceBetweenItems = 4; float itemPadding = 0; @@ -33,7 +37,7 @@ template class Toolbox : public tgui::ScrollablePanel { void resetToolSelection(std::string groupToReset); // void readjustContentSize(); - public: +public: Toolbox(); ~Toolbox(); @@ -52,30 +56,34 @@ template class Toolbox : public tgui::ScrollablePanel { void removeItemById(const Type &id); void selectTool(const ToolboxItem &item); - tgui::SignalTyped &> onItemClicked = { - "OnItemClicked"}; + tgui::SignalTyped &> onItemClicked = {"OnItemClicked"}; - protected: +protected: Widget::Ptr clone() const override; }; -template void Toolbox::setSpaceBetweenItems(float space) { +template +void Toolbox::setSpaceBetweenItems(float space) { spaceBetweenItems = space; } -template float Toolbox::getSpaceBetweenItems() const { +template +float Toolbox::getSpaceBetweenItems() const { return spaceBetweenItems; } -template void Toolbox::setItemPadding(float padding) { +template +void Toolbox::setItemPadding(float padding) { itemPadding = padding; } -template float Toolbox::getItemPadding() const { +template +float Toolbox::getItemPadding() const { return itemPadding; } -template Toolbox::Toolbox() : tgui::ScrollablePanel() { +template +Toolbox::Toolbox() : tgui::ScrollablePanel() { getRenderer()->setPadding({2, 2, 2, 2}); getRenderer()->setBorders({0, 0, 0, 0}); getRenderer()->setRoundedBorderRadius(0); @@ -87,7 +95,8 @@ template Toolbox::Toolbox() : tgui::ScrollablePanel() { this->add(this->container); } -template Toolbox::~Toolbox() { +template +Toolbox::~Toolbox() { for (auto &w : this->container->getWidgets()) { w->setToolTip(nullptr); } @@ -99,16 +108,12 @@ void Toolbox::resetToolSelection(std::string groupToReset) { auto defaultBtn = tgui::Button::create(); for (const auto &widgets : this->container->getWidgets()) { if (auto btn = std::dynamic_pointer_cast(widgets)) { - ToolboxItemIdentifier identifier = - btn->template getUserData>(); + ToolboxItemIdentifier identifier = btn->template getUserData>(); if (groupToReset == identifier.group) { tgui::ButtonRenderer *renderer = btn->getRenderer(); - tgui::ButtonRenderer *defaultRenderer = - defaultBtn->getRenderer(); - renderer->setBackgroundColor( - defaultRenderer->getBackgroundColor()); - renderer->setBackgroundColorHover( - defaultRenderer->getBackgroundColorHover()); + tgui::ButtonRenderer *defaultRenderer = defaultBtn->getRenderer(); + renderer->setBackgroundColor(defaultRenderer->getBackgroundColor()); + renderer->setBackgroundColorHover(defaultRenderer->getBackgroundColorHover()); renderer->setTexture(defaultRenderer->getTexture()); renderer->setTextureHover(defaultRenderer->getTextureHover()); } @@ -116,11 +121,11 @@ void Toolbox::resetToolSelection(std::string groupToReset) { } } -template void Toolbox::selectTool(const ToolboxItem &item) { +template +void Toolbox::selectTool(const ToolboxItem &item) { for (const auto &widgets : this->container->getWidgets()) { if (auto btn = std::dynamic_pointer_cast(widgets)) { - ToolboxItemIdentifier identifier = - btn->template getUserData>(); + ToolboxItemIdentifier identifier = btn->template getUserData>(); if (identifier.id == item.id) { btn->onClick.emit(btn.get(), tgui::Vector2f{1, 1}); return; @@ -131,8 +136,7 @@ template void Toolbox::selectTool(const ToolboxItem &item) { template void Toolbox::addTool(const ToolboxItem &item, int idx) { - tgui::Texture texture( - Editor::instance->getFs().getResourcePath(item.iconResourcePath)); + tgui::Texture texture(Editor::instance->getFs().getResourcePath(item.iconResourcePath)); set toolsInGroup{}; if (toolGroup.find(item.group) != toolGroup.end()) { @@ -167,8 +171,7 @@ void Toolbox::addTool(const ToolboxItem &item, int idx) { resetToolSelection(item.group); tgui::ButtonRenderer *renderer = btn->getRenderer(); renderer->setBackgroundColor(renderer->getBackgroundColorDown()); - renderer->setBackgroundColorHover( - renderer->getBackgroundColorDown()); + renderer->setBackgroundColorHover(renderer->getBackgroundColorDown()); renderer->setTexture(renderer->getTextureDown()); renderer->setTextureHover(renderer->getTextureDown()); } @@ -183,10 +186,10 @@ void Toolbox::addWidget(tgui::Widget::Ptr widget, int idx) { this->container->insert(idx, widget); } -template void Toolbox::removeItemById(const T &id) { +template +void Toolbox::removeItemById(const T &id) { for (const auto &widget : this->container->getWidgets()) { - ToolboxItemIdentifier identifier = - widget->template getUserData>(); + ToolboxItemIdentifier identifier = widget->template getUserData>(); if (identifier.id == id) { this->container->remove(widget); toolGroup[identifier.group].erase(id); @@ -196,7 +199,8 @@ template void Toolbox::removeItemById(const T &id) { // readjustContentSize(); } -template typename Toolbox::Ptr Toolbox::create() { +template +typename Toolbox::Ptr Toolbox::create() { return std::make_shared>(); } @@ -208,7 +212,8 @@ typename Toolbox::Ptr Toolbox::copy(Toolbox::ConstPtr widget) { return nullptr; } -template tgui::Widget::Ptr Toolbox::clone() const { +template +tgui::Widget::Ptr Toolbox::clone() const { return std::make_shared(*this); } diff --git a/src/editor/actions/editTileAction.cpp b/src/editor/actions/editTileAction.cpp index ca4a10f9..1eb74b73 100644 --- a/src/editor/actions/editTileAction.cpp +++ b/src/editor/actions/editTileAction.cpp @@ -1,5 +1,6 @@ #include "actions/editTileAction.hpp" + #include "actions/mapAction.hpp" #include "tilemap.hpp" diff --git a/src/editor/actions/eraseTileAction.cpp b/src/editor/actions/eraseTileAction.cpp index c4c48127..0991b7e3 100644 --- a/src/editor/actions/eraseTileAction.cpp +++ b/src/editor/actions/eraseTileAction.cpp @@ -1,5 +1,6 @@ #include "actions/eraseTileAction.hpp" + #include "actions/mapAction.hpp" #include "conversion.hpp" #include "raymath.h" @@ -9,45 +10,43 @@ EraseTileAction::EraseTileAction(MapActionData a) : MapAction(a) {} void EraseTileAction::execute() { switch (data.layer) { - case RoomLayer::LAYER_TILES: { - data.room->getTileMap()->setEmptyTile(data.worldTile); - } break; - case RoomLayer::LAYER_COLLISION: { - auto conv = fromVector2(data.worldTile); - data.room->getCollisions().removeObject(fromVector2(data.worldTile)); - } break; - case RoomLayer::LAYER_INTERACTABLES: { - data.room->getInteractables().removeObject(fromVector2(data.worldTile)); - } break; - case RoomLayer::LAYER_PROPS: { - data.room->getProps().removeObject(fromVector2(data.worldTile)); - } break; - case RoomLayer::LAYER_ACTORS: { - for (auto &&a : data.room->getActors().getActors()) { - if (Vector2Equals(a.second->getTilePosition(), data.worldTile)) { - data.room->getActors().getActors().erase(a.first); - break; + case RoomLayer::LAYER_TILES: { + data.room->getTileMap()->setEmptyTile(data.worldTile); + } break; + case RoomLayer::LAYER_COLLISION: { + auto conv = fromVector2(data.worldTile); + data.room->getCollisions().removeObject(fromVector2(data.worldTile)); + } break; + case RoomLayer::LAYER_INTERACTABLES: { + data.room->getInteractables().removeObject(fromVector2(data.worldTile)); + } break; + case RoomLayer::LAYER_PROPS: { + data.room->getProps().removeObject(fromVector2(data.worldTile)); + } break; + case RoomLayer::LAYER_ACTORS: { + for (auto &&a : data.room->getActors().getActors()) { + if (Vector2Equals(a.second->getTilePosition(), data.worldTile)) { + data.room->getActors().getActors().erase(a.first); + break; + } } - } - } break; - default: - break; + } break; + default: + break; } } void EraseTileAction::undo() { switch (data.layer) { - case RoomLayer::LAYER_TILES: { - data.room->getTileMap()->setTile(data.worldTile, data.prevTile); - } break; - case RoomLayer::LAYER_COLLISION: { - data.room->getCollisions().pushObject(fromVector2(data.worldTile), - false); - } break; - case RoomLayer::LAYER_INTERACTABLES: { - - } break; - default: - break; + case RoomLayer::LAYER_TILES: { + data.room->getTileMap()->setTile(data.worldTile, data.prevTile); + } break; + case RoomLayer::LAYER_COLLISION: { + data.room->getCollisions().pushObject(fromVector2(data.worldTile), false); + } break; + case RoomLayer::LAYER_INTERACTABLES: { + } break; + default: + break; } } diff --git a/src/editor/actions/placeTileAction.cpp b/src/editor/actions/placeTileAction.cpp index 36535dd0..69fb5748 100644 --- a/src/editor/actions/placeTileAction.cpp +++ b/src/editor/actions/placeTileAction.cpp @@ -1,4 +1,8 @@ #include "actions/placeTileAction.hpp" + +#include +#include + #include "actions/mapAction.hpp" #include "actor.hpp" #include "conversion.hpp" @@ -8,98 +12,88 @@ #include "raymath.h" #include "room.hpp" #include "views/worldView.hpp" -#include -#include PlaceTileAction::PlaceTileAction(MapActionData a) : MapAction(a) {} void PlaceTileAction::execute() { switch (data.layer) { - case RoomLayer::LAYER_TILES: { - if (data.room->getTileMap()->getTileSet()->areAtlasCoordsValid( - {static_cast(data.tile.x), - static_cast(data.tile.y)})) { - data.room->getTileMap()->setTile(data.worldTile, data.tile); - } - } break; - case RoomLayer::LAYER_COLLISION: { - auto conv = fromVector2(data.worldTile); - data.room->getCollisions().pushObject(fromVector2(data.worldTile), - false); - } break; - case RoomLayer::LAYER_INTERACTABLES: { - auto inter = data.room->getInteractables().add( - fromVector2(data.worldTile), data.interactable); - if (inter != nullptr) { - char *txt = LoadFileText(data.interactableFullPath.c_str()); - nlohmann::json interJson = json::parse(txt); - UnloadFileText(txt); - inter->setProps(interJson.at("props")); - inter->setOnTouch(interJson.at("onTouch")); - } - } break; - case RoomLayer::LAYER_PROPS: { - auto p = std::make_unique(data.interactableFullPath); - p->setWorldTilePos({data.worldTile.x, data.worldTile.y}, - data.room->getWorldTileSize()); - if (p->getInteractable() != nullptr && p->getHasInteractable()) { - auto interType = p->getInteractable()->getType(); - auto interNames = - Editor::instance->getProject()->getInteractableNames(); - std::string interFileName; - bool found = false; - for (auto [interPath, interName] : interNames) { - std::string fileName = GetFileNameWithoutExt(interPath.c_str()); - if (fileName == interType) { - found = true; - interFileName = interPath; - } + case RoomLayer::LAYER_TILES: { + if (data.room->getTileMap()->getTileSet()->areAtlasCoordsValid( + {static_cast(data.tile.x), static_cast(data.tile.y)})) { + data.room->getTileMap()->setTile(data.worldTile, data.tile); + } + } break; + case RoomLayer::LAYER_COLLISION: { + auto conv = fromVector2(data.worldTile); + data.room->getCollisions().pushObject(fromVector2(data.worldTile), false); + } break; + case RoomLayer::LAYER_INTERACTABLES: { + auto inter = data.room->getInteractables().add(fromVector2(data.worldTile), data.interactable); + if (inter != nullptr) { + char *txt = LoadFileText(data.interactableFullPath.c_str()); + nlohmann::json interJson = json::parse(txt); + UnloadFileText(txt); + inter->setProps(interJson.at("props")); + inter->setOnTouch(interJson.at("onTouch")); } + } break; + case RoomLayer::LAYER_PROPS: { + auto p = std::make_unique(data.interactableFullPath); + p->setWorldTilePos({data.worldTile.x, data.worldTile.y}, data.room->getWorldTileSize()); + if (p->getInteractable() != nullptr && p->getHasInteractable()) { + auto interType = p->getInteractable()->getType(); + auto interNames = Editor::instance->getProject()->getInteractableNames(); + std::string interFileName; + bool found = false; + for (auto [interPath, interName] : interNames) { + std::string fileName = GetFileNameWithoutExt(interPath.c_str()); + if (fileName == interType) { + found = true; + interFileName = interPath; + } + } - char *txt = LoadFileText(interFileName.c_str()); - nlohmann::json propJson = json::parse(txt); - UnloadFileText(txt); - p->getInteractable()->setProps(propJson.at("props")); - } - // data.room->addProp(std::move(p)); - data.room->getProps().pushObject(fromVector2(data.worldTile), - std::move(p)); - } break; - case RoomLayer::LAYER_ACTORS: { - auto a = std::make_unique(data.interactableFullPath); - a->setTilePosition( - data.worldTile, - data.room->getTileMap()->getTileSet()->getTileSize()); - data.room->getActors().getActors()[data.actorName] = std::move(a); - } break; - default: - break; + char *txt = LoadFileText(interFileName.c_str()); + nlohmann::json propJson = json::parse(txt); + UnloadFileText(txt); + p->getInteractable()->setProps(propJson.at("props")); + } + // data.room->addProp(std::move(p)); + data.room->getProps().pushObject(fromVector2(data.worldTile), std::move(p)); + } break; + case RoomLayer::LAYER_ACTORS: { + auto a = std::make_unique(data.interactableFullPath); + a->setTilePosition(data.worldTile, data.room->getTileMap()->getTileSet()->getTileSize()); + data.room->getActors().getActors()[data.actorName] = std::move(a); + } break; + default: + break; } } void PlaceTileAction::undo() { switch (data.layer) { - case RoomLayer::LAYER_TILES: { - data.room->getTileMap()->setTile(data.worldTile, data.prevTile); - } break; - case RoomLayer::LAYER_COLLISION: { - data.room->getCollisions().removeObject(fromVector2(data.worldTile)); - } break; - case RoomLayer::LAYER_INTERACTABLES: { - data.room->getInteractables().removeObject(fromVector2(data.worldTile)); - } break; - case RoomLayer::LAYER_PROPS: { - data.room->getProps().removeObject(fromVector2(data.worldTile)); - } break; - case RoomLayer::LAYER_ACTORS: { - for (auto &&a : data.room->getActors().getActors()) { - if (Vector2Equals(a.second->getTilePosition(), data.worldTile)) { - data.room->getActors().getActors().erase(a.first); - break; + case RoomLayer::LAYER_TILES: { + data.room->getTileMap()->setTile(data.worldTile, data.prevTile); + } break; + case RoomLayer::LAYER_COLLISION: { + data.room->getCollisions().removeObject(fromVector2(data.worldTile)); + } break; + case RoomLayer::LAYER_INTERACTABLES: { + data.room->getInteractables().removeObject(fromVector2(data.worldTile)); + } break; + case RoomLayer::LAYER_PROPS: { + data.room->getProps().removeObject(fromVector2(data.worldTile)); + } break; + case RoomLayer::LAYER_ACTORS: { + for (auto &&a : data.room->getActors().getActors()) { + if (Vector2Equals(a.second->getTilePosition(), data.worldTile)) { + data.room->getActors().getActors().erase(a.first); + break; + } } - } - } break; - default: - break; + } break; + default: + break; } } diff --git a/src/editor/actions/startPointAction.cpp b/src/editor/actions/startPointAction.cpp index 083a99fb..d4e36c37 100644 --- a/src/editor/actions/startPointAction.cpp +++ b/src/editor/actions/startPointAction.cpp @@ -1,4 +1,5 @@ #include "actions/startPointAction.hpp" + #include "actions/mapAction.hpp" StartPointAction::StartPointAction(MapActionData data) : MapAction(data) {} diff --git a/src/editor/childWindows/aboutWindow.cpp b/src/editor/childWindows/aboutWindow.cpp index 5db90cf2..7c1fb70e 100644 --- a/src/editor/childWindows/aboutWindow.cpp +++ b/src/editor/childWindows/aboutWindow.cpp @@ -1,4 +1,7 @@ #include "childWindows/aboutWindow.hpp" + +#include + #include "TGUI/Config.hpp" #include "TGUI/Layout.hpp" #include "TGUI/Widgets/ChildWindow.hpp" @@ -7,7 +10,6 @@ #include "bindTranslation.hpp" #include "childWindows/popupWindow.hpp" #include "editor.hpp" -#include AboutWindow::AboutWindow() : PopupWindow("AboutWindow") { auto layout = tgui::GrowVerticalLayout::create(); @@ -16,10 +18,8 @@ AboutWindow::AboutWindow() : PopupWindow("AboutWindow") { EditorGuiService::createLogoCenter(layout); auto infoText = tgui::Label::create(); - bindTranslation(infoText, "menu.about.rpgpp_description", - &tgui::Label::setText); - bindTranslation(this->currentWindow, "menu.about._label", - &tgui::ChildWindow::setTitle); + bindTranslation(infoText, "menu.about.rpgpp_description", &tgui::Label::setText); + bindTranslation(this->currentWindow, "menu.about._label", &tgui::ChildWindow::setTitle); infoText->setTextSize(20); infoText->setHorizontalAlignment(tgui::HorizontalAlignment::Center); layout->add(infoText); diff --git a/src/editor/childWindows/popupWindow.cpp b/src/editor/childWindows/popupWindow.cpp index 26a23f4f..bd95a3d1 100644 --- a/src/editor/childWindows/popupWindow.cpp +++ b/src/editor/childWindows/popupWindow.cpp @@ -1,11 +1,13 @@ #include "childWindows/popupWindow.hpp" + +#include + #include "TGUI/Animation.hpp" #include "TGUI/Backend/raylib.hpp" #include "TGUI/Duration.hpp" #include "TGUI/Widgets/ChildWindow.hpp" #include "editor.hpp" #include "services/editorGuiService.hpp" -#include constexpr const int ANIMATION_DURATION = 200; constexpr const float TITLEBAR_HEIGHT = 30.0f; @@ -13,8 +15,7 @@ constexpr tgui::ShowEffectType ANIMATION_TYPE = tgui::ShowEffectType::Scale; PopupWindow::PopupWindow(const std::string &title) { this->currentWindow = tgui::ChildWindow::create(title); - this->currentWindow->onClose.connect( - [this] { this->windowIsOpen = false; }); + this->currentWindow->onClose.connect([this] { this->windowIsOpen = false; }); this->currentWindow->onClosing.connect([this](bool *abort) { *abort = true; this->close(); @@ -22,25 +23,21 @@ PopupWindow::PopupWindow(const std::string &title) { } void PopupWindow::open() { - if (this->windowIsOpen) - return; + if (this->windowIsOpen) return; std::unique_ptr &gui = Editor::instance->getGui().gui; - if (gui->getWidgetIndex(this->currentWindow) == -1) - gui->add(this->currentWindow); + if (gui->getWidgetIndex(this->currentWindow) == -1) gui->add(this->currentWindow); // pop-up in the center of the screen. this->currentWindow->setPosition("(parent.innersize - size) / 2"); ; - this->currentWindow->showWithEffect(ANIMATION_TYPE, - tgui::Duration(ANIMATION_DURATION)); + this->currentWindow->showWithEffect(ANIMATION_TYPE, tgui::Duration(ANIMATION_DURATION)); this->windowIsOpen = true; } void PopupWindow::close() { - if (!this->windowIsOpen) - return; + if (!this->windowIsOpen) return; this->currentWindow->hideWithEffect(ANIMATION_TYPE, ANIMATION_DURATION); this->windowIsOpen = false; diff --git a/src/editor/childWindows/projectSettingsWindow.cpp b/src/editor/childWindows/projectSettingsWindow.cpp index 039a1c3e..db720ee1 100644 --- a/src/editor/childWindows/projectSettingsWindow.cpp +++ b/src/editor/childWindows/projectSettingsWindow.cpp @@ -15,9 +15,7 @@ ProjectSettingsWindow::ProjectSettingsWindow() : PopupWindow("ProjectSettings") layout->getRenderer()->setPadding(4); layout->getRenderer()->setSpaceBetweenWidgets(4.0f); - bindTranslation(this->currentWindow, - "dialog.project_settings._label", - &tgui::ChildWindow::setTitle); + bindTranslation(this->currentWindow, "dialog.project_settings._label", &tgui::ChildWindow::setTitle); titleField = TextField::create(); bindTranslation(titleField->label, "dialog.project_settings.title", &tgui::Label::setText); diff --git a/src/editor/childWindows/settingsPanel/general.cpp b/src/editor/childWindows/settingsPanel/general.cpp index 8bcdee96..2875f69e 100644 --- a/src/editor/childWindows/settingsPanel/general.cpp +++ b/src/editor/childWindows/settingsPanel/general.cpp @@ -17,14 +17,12 @@ constexpr const int ANIMATION_DURATION = 200; - SettingsPanelGeneral::SettingsPanelGeneral(tgui::TabContainer::Ptr tabContainer) : SettingsPanelBase(std::move(tabContainer), "screen.options.general._label") { TranslationService &ts = Editor::instance->getTranslations(); ThemeService &theme = Editor::instance->getThemeService(); - const tgui::ScrollablePanel::Ptr scrollPanel = - tgui::ScrollablePanel::create(); + const tgui::ScrollablePanel::Ptr scrollPanel = tgui::ScrollablePanel::create(); scrollPanel->setSize("100%", "100%"); scrollPanel->getRenderer()->setPadding(4); @@ -37,17 +35,15 @@ SettingsPanelGeneral::SettingsPanelGeneral(tgui::TabContainer::Ptr tabContainer) // Language const auto languageLayout = tgui::HorizontalLayout::create(); const auto languageSelector = tgui::ComboBox::create(); - for (const auto& [name, key] : ts.langKeyToName) { + for (const auto &[name, key] : ts.langKeyToName) { languageSelector->addItem(key, name); } - if (const auto langTranslation = ts.getKey("language"); - languageSelector->contains(langTranslation)) + if (const auto langTranslation = ts.getKey("language"); languageSelector->contains(langTranslation)) languageSelector->setSelectedItem(langTranslation); languageSelector->onItemSelect.connect([&](const tgui::String &item, const tgui::String &id) { - ConfigurationService &configService = - Editor::instance->getConfiguration(); + ConfigurationService &configService = Editor::instance->getConfiguration(); ts.setLanguage(ts.getLanguageIdentifierByKey(item.toStdString())); configService.setStringValue("language", id.toStdString()); configService.saveConfiguration(); @@ -62,8 +58,7 @@ SettingsPanelGeneral::SettingsPanelGeneral(tgui::TabContainer::Ptr tabContainer) languageLayout->setSize({"100%", 30}); const auto languageLabel = tgui::Label::create(); languageLabel->setVerticalAlignment(tgui::VerticalAlignment::Center); - bindTranslation(languageLabel, "screen.options.general.language", - &tgui::Label::setText); + bindTranslation(languageLabel, "screen.options.general.language", &tgui::Label::setText); languageLayout->add(languageLabel); languageLayout->add(languageSelector); @@ -77,45 +72,43 @@ SettingsPanelGeneral::SettingsPanelGeneral(tgui::TabContainer::Ptr tabContainer) themeLabel->setVerticalAlignment(tgui::VerticalAlignment::Center); bindTranslation(themeLabel, "screen.options.general.theme", &tgui::Label::setText); - for (const auto &themeName : theme.getThemes()) - themeSelector->addItem(themeName); + for (const auto &themeName : theme.getThemes()) themeSelector->addItem(themeName); themeSelector->setSelectedItem(theme.current_theme_name); this->promptUserBox = tgui::MessageBox::create(""); bindTranslation(this->promptUserBox, "screen.options.general.theme", &tgui::MessageBox::setTitle); bindTranslation(promptUserBox, "screen.options.general.theme_notice", &tgui::MessageBox::setText); - bindCustomTranslation(this->promptUserBox, [&](std::shared_ptr box, TranslationService &ts) { + bindCustomTranslation(this->promptUserBox, [&](std::shared_ptr box, + TranslationService &ts) { box->changeButtons(std::vector{ts.getKey("button.restart"), ts.getKey("button.restart_later")}); }); - this->promptUserBox->onButtonPress.connect([&](const tgui::String& text) { + this->promptUserBox->onButtonPress.connect([&](const tgui::String &text) { if (text == ts.getKey("button.restart")) { ChangeDirectory(GetApplicationDirectory()); - #ifdef __linux__ +#ifdef __linux__ - if (const FILE *handle = popen("./editor", "r"); handle == nullptr) { - fprintf(stderr, "failed to relaunch editor..\n"); - return; - } - #endif + if (const FILE *handle = popen("./editor", "r"); handle == nullptr) { + fprintf(stderr, "failed to relaunch editor..\n"); + return; + } +#endif - #ifdef _WIN32 - if (!WinCreateDetachedExecutable("editor.exe")) { - fprintf(stderr, "failed to relaunch editor..\n"); - return; - } - #endif +#ifdef _WIN32 + if (!WinCreateDetachedExecutable("editor.exe")) { + fprintf(stderr, "failed to relaunch editor..\n"); + return; + } +#endif exit(0); } Editor::instance->getGui().gui->remove(promptUserBox); }); - themeSelector->onItemSelect.connect([&](const tgui::String &item) { - ConfigurationService &configService = - Editor::instance->getConfiguration(); + ConfigurationService &configService = Editor::instance->getConfiguration(); configService.setStringValue("theme", item.toStdString()); configService.saveConfiguration(); diff --git a/src/editor/childWindows/settingsPanel/hotkeys.cpp b/src/editor/childWindows/settingsPanel/hotkeys.cpp index 4f45384b..2e2e8eb7 100644 --- a/src/editor/childWindows/settingsPanel/hotkeys.cpp +++ b/src/editor/childWindows/settingsPanel/hotkeys.cpp @@ -1,4 +1,5 @@ #include "childWindows/settingsPanel/hotkeys.hpp" + #include "TGUI/Widgets/GrowVerticalLayout.hpp" #include "TGUI/Widgets/HorizontalLayout.hpp" #include "TGUI/Widgets/Label.hpp" @@ -11,8 +12,7 @@ SettingsPanelHotkeys::SettingsPanelHotkeys(tgui::TabContainer::Ptr tabContainer) HotkeyService &hks = Editor::instance->getHotkeyService(); TranslationService &ts = Editor::instance->getTranslations(); - const tgui::ScrollablePanel::Ptr scrollPanel = - tgui::ScrollablePanel::create(); + const tgui::ScrollablePanel::Ptr scrollPanel = tgui::ScrollablePanel::create(); scrollPanel->setSize("100%", "100%"); scrollPanel->getRenderer()->setPadding(4); @@ -36,8 +36,7 @@ SettingsPanelHotkeys::SettingsPanelHotkeys(tgui::TabContainer::Ptr tabContainer) ConfigurationService &cfgs = Editor::instance->getConfiguration(); hks.removeHotkey(id); hks.addHotkey(id, hk); - cfgs.setStringValue("hotkeys", id, - to_string(HotkeyService::pack(hk))); + cfgs.setStringValue("hotkeys", id, to_string(HotkeyService::pack(hk))); cfgs.saveConfiguration(); }); diff --git a/src/editor/childWindows/settingsWindow.cpp b/src/editor/childWindows/settingsWindow.cpp index a249e3cc..83ed2d2a 100644 --- a/src/editor/childWindows/settingsWindow.cpp +++ b/src/editor/childWindows/settingsWindow.cpp @@ -1,4 +1,5 @@ #include "childWindows/settingsWindow.hpp" + #include "TGUI/Widgets/TabContainer.hpp" #include "childWindows/popupWindow.hpp" #include "childWindows/settingsPanel/general.hpp" @@ -7,9 +8,7 @@ SettingsWindow::SettingsWindow() : PopupWindow("SettingsWindow") { this->currentWindow->setSize("540", "360"); this->currentWindow->setResizable(true); - bindTranslation(this->currentWindow, - "menu.options._label", - &tgui::ChildWindow::setTitle); + bindTranslation(this->currentWindow, "menu.options._label", &tgui::ChildWindow::setTitle); tgui::TabContainer::Ptr tabContainer = tgui::TabContainer::create(); tabContainer->setPosition(0, 0); diff --git a/src/editor/components/frameButton.cpp b/src/editor/components/frameButton.cpp index b48cb563..aacd7b35 100644 --- a/src/editor/components/frameButton.cpp +++ b/src/editor/components/frameButton.cpp @@ -1,4 +1,8 @@ #include "components/frameButton.hpp" + +#include +#include + #include "TGUI/Color.hpp" #include "TGUI/Cursor.hpp" #include "TGUI/Rect.hpp" @@ -7,15 +11,11 @@ #include "actor.hpp" #include "components/tooltip.hpp" #include "raylib.h" -#include -#include constexpr int CIRCLE_RADIUS = 10; constexpr float PADDING = 10.0f; -FrameButton::FrameButton(const int frameIndex, Actor *actor) - : frameIndex(frameIndex), actor(actor) { - +FrameButton::FrameButton(const int frameIndex, Actor *actor) : frameIndex(frameIndex), actor(actor) { this->setMouseCursor(tgui::Cursor::Type::Hand); this->ButtonBase::setSize({50, "100%"}); @@ -23,8 +23,7 @@ FrameButton::FrameButton(const int frameIndex, Actor *actor) this->setToolTip(Tooltip::create(std::to_string(frameIndex))); - this->onPress.connect( - [this] { this->onFrameChange.emit(this, this->frameIndex); }); + this->onPress.connect([this] { this->onFrameChange.emit(this, this->frameIndex); }); } FrameButton::Ptr FrameButton::create(int frameIndex, Actor *actor) { @@ -40,14 +39,12 @@ void FrameButton::updateSprite(bool reImport) { if (reImport || !this->sprite.isSet()) { // TGUI keeping the size of the previously imported sprite kinda messes // it up, so fix. - sprite.setSize({static_cast(texture.width), - static_cast(texture.height)}); + sprite.setSize({static_cast(texture.width), static_cast(texture.height)}); sprite.setTexture(tgui::Texture{tileset.getTextureSource()}); } - auto width = static_cast(tileset.getTileWidth()), - height = static_cast(tileset.getTileHeight()); + auto width = static_cast(tileset.getTileWidth()), height = static_cast(tileset.getTileHeight()); float xPos = x * width, yPos = y * height; sprite.setVisibleRect({ @@ -60,22 +57,18 @@ void FrameButton::updateSprite(bool reImport) { sprite.setPosition({-xPos - width / 2.0f, -yPos - height / 2.0f}); } -void FrameButton::draw(tgui::BackendRenderTarget &target, - tgui::RenderStates states) const { - +void FrameButton::draw(tgui::BackendRenderTarget &target, tgui::RenderStates states) const { Button::draw(target, states); float buttonWidth = m_size.x.getValue(), buttonHeight = m_size.y.getValue(); target.drawBorders(states, 2, {buttonWidth, buttonHeight}, - actor->getCurrentFrame() == this->frameIndex - ? tgui::Color::Blue - : tgui::Color::Black); + actor->getCurrentFrame() == this->frameIndex ? tgui::Color::Blue : tgui::Color::Black); const tgui::FloatRect visibleRect = this->sprite.getVisibleRect(); states.transform.translate({buttonWidth / 2.0f, buttonHeight / 2.0f}); - states.transform.scale({((buttonWidth - PADDING) / visibleRect.width), - ((buttonHeight - PADDING) / visibleRect.height)}); + states.transform.scale( + {((buttonWidth - PADDING) / visibleRect.width), ((buttonHeight - PADDING) / visibleRect.height)}); target.drawSprite(states, this->sprite); } diff --git a/src/editor/components/perfOverlay.cpp b/src/editor/components/perfOverlay.cpp index 46be7484..0b8688a1 100644 --- a/src/editor/components/perfOverlay.cpp +++ b/src/editor/components/perfOverlay.cpp @@ -1,9 +1,10 @@ #include "components/perfOverlay.hpp" -#include "raylib.h" + #include + +#include "raylib.h" PerformanceOverlay::PerformanceOverlay() { - for (int i = 0; i < SAMPLE_COUNT; i++) - samples[i] = 0; + for (int i = 0; i < SAMPLE_COUNT; i++) samples[i] = 0; index = 0; @@ -39,10 +40,8 @@ void PerformanceOverlay::UpdateScaling() { graphMax = graphMax * 0.9f + target * 0.1f; } -void PerformanceOverlay::DrawFPSLine(float ms, int x, int y, int w, int h, - Color color) { - if (ms > graphMax) - return; +void PerformanceOverlay::DrawFPSLine(float ms, int x, int y, int w, int h, Color color) { + if (ms > graphMax) return; float norm = ms / graphMax; float py = y + h - norm * h; @@ -61,8 +60,7 @@ void PerformanceOverlay::Update() { } void PerformanceOverlay::Draw(int x, int y, int w, int h) { - if (!enabled) - return; + if (!enabled) return; DrawRectangle(x, y, w, h, Fade(BLACK, 0.7f)); DrawRectangleLines(x, y, w, h, GRAY); @@ -74,8 +72,7 @@ void PerformanceOverlay::Draw(int x, int y, int w, int h) { float value = samples[idx]; float norm = value / graphMax; - if (norm > 1.0f) - norm = 1.0f; + if (norm > 1.0f) norm = 1.0f; float px = x + ((float)i / (SAMPLE_COUNT - 1)) * w; float py = y + h - norm * h; @@ -84,24 +81,21 @@ void PerformanceOverlay::Draw(int x, int y, int w, int h) { Color color = GREEN; - if (value > avgTime * spikeThreshold) - color = RED; + if (value > avgTime * spikeThreshold) color = RED; if (i > 0) { DrawLineV(prev, cur, color); - DrawTriangle({prev.x, y * 1.f + h}, {prev.x, prev.y}, - {cur.x, cur.y}, Fade(color, 0.15f)); + DrawTriangle({prev.x, y * 1.f + h}, {prev.x, prev.y}, {cur.x, cur.y}, Fade(color, 0.15f)); - DrawTriangle({prev.x, y * 1.f + h}, {cur.x, cur.y}, - {cur.x, y * 1.f + h}, Fade(color, 0.15f)); + DrawTriangle({prev.x, y * 1.f + h}, {cur.x, cur.y}, {cur.x, y * 1.f + h}, Fade(color, 0.15f)); } prev = cur; } - DrawFPSLine(16.67f, x, y, w, h, RED); // 60 FPS - DrawFPSLine(8.33f, x, y, w, h, ORANGE); // 120 FPS + DrawFPSLine(16.67f, x, y, w, h, RED); // 60 FPS + DrawFPSLine(8.33f, x, y, w, h, ORANGE); // 120 FPS DrawText(TextFormat("FPS: %d", GetFPS()), x, y - 18, 20, WHITE); diff --git a/src/editor/components/resizableCanvasBox.cpp b/src/editor/components/resizableCanvasBox.cpp index a86883eb..66c5e844 100644 --- a/src/editor/components/resizableCanvasBox.cpp +++ b/src/editor/components/resizableCanvasBox.cpp @@ -1,21 +1,17 @@ #include "components/resizableCanvasBox.hpp" -#include "raylib.h" + #include -bool bounded(float value, float min, float max) { - return value >= min && value <= max; -} +#include "raylib.h" + +bool bounded(float value, float min, float max) { return value >= min && value <= max; } -ResizableCanvasBox::ResizableCanvasBox(std::string id, float x, float y, - float width, float height, Color color, +ResizableCanvasBox::ResizableCanvasBox(std::string id, float x, float y, float width, float height, Color color, bool isResizable) - : id(id), x(x), y(y), width(width), height(height), color(color), - isResizable(isResizable) {} + : id(id), x(x), y(y), width(width), height(height), color(color), isResizable(isResizable) {} -ResizableCanvasBox::ResizableCanvasBox(std::string id, Rectangle rec, - Color color, bool isResizable) - : id(id), x(rec.x), y(rec.y), width(rec.width), height(rec.height), - color(color), isResizable(isResizable) {} +ResizableCanvasBox::ResizableCanvasBox(std::string id, Rectangle rec, Color color, bool isResizable) + : id(id), x(rec.x), y(rec.y), width(rec.width), height(rec.height), color(color), isResizable(isResizable) {} void ResizableCanvasBox::updateSize(float width, float height) { this->width = width; @@ -39,16 +35,13 @@ void ResizableCanvasBox::updateRec(Rectangle rec) { bool ResizableCanvasBox::leftMousePressed(Vector2 mousePos) { resizeDirection = NONE; - if (mousePos.x >= x && mousePos.x <= x + width && mousePos.y >= y && - mousePos.y <= y + height) { - + if (mousePos.x >= x && mousePos.x <= x + width && mousePos.y >= y && mousePos.y <= y + height) { if (isResizable) { if (mousePos.x >= x && mousePos.x <= x + RESIZE_MARGIN) { resizeDirection |= LEFT; } - if (mousePos.x >= x + width - RESIZE_MARGIN && - mousePos.x <= x + width) { + if (mousePos.x >= x + width - RESIZE_MARGIN && mousePos.x <= x + width) { resizeDirection |= RIGHT; } @@ -56,8 +49,7 @@ bool ResizableCanvasBox::leftMousePressed(Vector2 mousePos) { resizeDirection |= TOP; } - if (mousePos.y >= y + height - RESIZE_MARGIN && - mousePos.y <= y + height) { + if (mousePos.y >= y + height - RESIZE_MARGIN && mousePos.y <= y + height) { resizeDirection |= BOTTOM; } } @@ -78,20 +70,15 @@ bool ResizableCanvasBox::leftMousePressed(Vector2 mousePos) { return false; } -void ResizableCanvasBox::mouseMoved(Vector2 mousePos, int snapWidth, - int snapHeight) { - if (!isResizing || !focused) - return; +void ResizableCanvasBox::mouseMoved(Vector2 mousePos, int snapWidth, int snapHeight) { + if (!isResizing || !focused) return; int dx = std::round((mousePos.x - startMousePos.x) / snapWidth) * snapWidth; - int dy = - std::round((mousePos.y - startMousePos.y) / snapHeight) * snapHeight; + int dy = std::round((mousePos.y - startMousePos.y) / snapHeight) * snapHeight; - if ((resizeDirection & LEFT) && prevWidth - dx < minSize) - dx = prevWidth - minSize; + if ((resizeDirection & LEFT) && prevWidth - dx < minSize) dx = prevWidth - minSize; - if ((resizeDirection & TOP) && prevHeight - dy < minSize) - dy = prevHeight - minSize; + if ((resizeDirection & TOP) && prevHeight - dy < minSize) dy = prevHeight - minSize; if (resizeDirection & LEFT) { x = prevX + dx; @@ -129,8 +116,7 @@ void ResizableCanvasBox::draw() { if (focused) { opacity = 0.5; } - DrawRectangleLinesEx(Rectangle{x, y, width, height}, 1, - Fade(BLACK, opacity)); + DrawRectangleLinesEx(Rectangle{x, y, width, height}, 1, Fade(BLACK, opacity)); DrawRectangleRec(Rectangle{x, y, width, height}, Fade(color, opacity)); // Implement draw logic here } diff --git a/src/editor/components/resizableContainer.cpp b/src/editor/components/resizableContainer.cpp index db3f33cd..28fa7208 100644 --- a/src/editor/components/resizableContainer.cpp +++ b/src/editor/components/resizableContainer.cpp @@ -1,94 +1,67 @@ #include "components/resizableContainer.hpp" + +#include + #include "TGUI/Backend/Renderer/BackendRenderTarget.hpp" #include "TGUI/Layout.hpp" #include "TGUI/Vector2.hpp" #include "TGUI/Widget.hpp" #include "TGUI/Widgets/Group.hpp" #include "raylib.h" -#include -bool bounded(int value, int min, int max) { - return value >= min && value <= max; -} +bool bounded(int value, int min, int max) { return value >= min && value <= max; } -ResizableContainer::ResizableContainer(const tgui::Layout2d &size, - const tgui::Layout2d &position) - : tgui::Group() { +ResizableContainer::ResizableContainer(const tgui::Layout2d &size, const tgui::Layout2d &position) : tgui::Group() { this->setSize(size); this->setPosition(position); } -void ResizableContainer::setMaxResizeWidth(int width) { - maxResizeWidth = width; -} +void ResizableContainer::setMaxResizeWidth(int width) { maxResizeWidth = width; } int ResizableContainer::getMaxResizeWidth() { return maxResizeWidth; } -void ResizableContainer::setMaxResizeHeight(int height) { - maxResizeHeight = height; -} +void ResizableContainer::setMaxResizeHeight(int height) { maxResizeHeight = height; } int ResizableContainer::getMaxResizeHeight() { return maxResizeHeight; } -void ResizableContainer::setMinResizeWidth(int width) { - minResizeWidth = width; -} -void ResizableContainer::setMinResizeHeight(int height) { - minResizeHeight = height; -} +void ResizableContainer::setMinResizeWidth(int width) { minResizeWidth = width; } +void ResizableContainer::setMinResizeHeight(int height) { minResizeHeight = height; } int ResizableContainer::getMinResizeWidth() { return minResizeWidth; } int ResizableContainer::getMinResizeHeight() { return minResizeHeight; } void ResizableContainer::setGrabberSize(int size) { grabberSize = size; } int ResizableContainer::getGrabberSize() { return grabberSize; } -void ResizableContainer::enableResize(ResizeDirection direction) { - resizeFlags |= static_cast(direction); -} +void ResizableContainer::enableResize(ResizeDirection direction) { resizeFlags |= static_cast(direction); } -void ResizableContainer::disableResize(ResizeDirection direction) { - resizeFlags &= ~static_cast(direction); -} +void ResizableContainer::disableResize(ResizeDirection direction) { resizeFlags &= ~static_cast(direction); } -bool ResizableContainer::isResizable(ResizeDirection direction) { - return resizeFlags & static_cast(direction); -} +bool ResizableContainer::isResizable(ResizeDirection direction) { return resizeFlags & static_cast(direction); } -ResizableContainer::Ptr -ResizableContainer::create(const tgui::Layout2d &size, - const tgui::Layout2d &position) { +ResizableContainer::Ptr ResizableContainer::create(const tgui::Layout2d &size, const tgui::Layout2d &position) { return std::make_shared(size, position); } -ResizableContainer::Ptr -ResizableContainer::copy(ResizableContainer::ConstPtr widget) { +ResizableContainer::Ptr ResizableContainer::copy(ResizableContainer::ConstPtr widget) { if (widget) { return std::static_pointer_cast(widget->clone()); } return nullptr; } -tgui::Widget::Ptr ResizableContainer::clone() const { - return std::make_shared(*this); -} +tgui::Widget::Ptr ResizableContainer::clone() const { return std::make_shared(*this); } -bool ResizableContainer::inEnabledGrabber(ResizeDirection direction, - tgui::Vector2f absolutePos) { - if (!isResizable(direction)) - return false; +bool ResizableContainer::inEnabledGrabber(ResizeDirection direction, tgui::Vector2f absolutePos) { + if (!isResizable(direction)) return false; switch (direction) { - case ResizeDirection::LEFT: - return bounded(absolutePos.x, 0, grabberSize) and - bounded(absolutePos.y, 0, getSize().y); - case ResizeDirection::RIGHT: - return bounded(absolutePos.x, getSize().x - grabberSize, - getSize().x) and - bounded(absolutePos.y, 0, getSize().y); - case ResizeDirection::TOP: - return bounded(absolutePos.y, 0, grabberSize) and - bounded(absolutePos.x, 0, getSize().x); - case ResizeDirection::BOTTOM: - return bounded(absolutePos.y, getSize().y - grabberSize, - getSize().y) and - bounded(absolutePos.x, 0, getSize().x); - default: - return false; + case ResizeDirection::LEFT: + return bounded(absolutePos.x, 0, grabberSize) and bounded(absolutePos.y, 0, getSize().y); + case ResizeDirection::RIGHT: + return bounded(absolutePos.x, getSize().x - grabberSize, getSize().x) and + bounded(absolutePos.y, 0, getSize().y); + case ResizeDirection::TOP: + return bounded(absolutePos.y, 0, grabberSize) and bounded(absolutePos.x, 0, getSize().x); + case ResizeDirection::BOTTOM: + return bounded(absolutePos.y, getSize().y - grabberSize, getSize().y) and + bounded(absolutePos.x, 0, getSize().x); + default: + return false; } } @@ -134,29 +107,24 @@ void ResizableContainer::manualMouseMoved(tgui::Vector2f pos) { tgui::Vector2f deltaMousePos = absolutePos - startMousePos; if (grabbingFlag == static_cast(ResizeDirection::LEFT)) { float newW = startSize.x.getValue() - deltaMousePos.x; - newW = std::clamp(newW, static_cast(minResizeWidth), - static_cast(maxResizeWidth)); + newW = std::clamp(newW, static_cast(minResizeWidth), static_cast(maxResizeWidth)); setSize(newW, startSize.y); setPosition(startPosition.x + deltaMousePos.x, startPosition.y); } else if (grabbingFlag == static_cast(ResizeDirection::RIGHT)) { float newW = startSize.x.getValue() + deltaMousePos.x; - newW = std::clamp(newW, static_cast(minResizeWidth), - static_cast(maxResizeWidth)); + newW = std::clamp(newW, static_cast(minResizeWidth), static_cast(maxResizeWidth)); setSize(newW, startSize.y); } else if (grabbingFlag == static_cast(ResizeDirection::TOP)) { float newH = startSize.y.getValue() - deltaMousePos.y; - newH = std::clamp(newH, static_cast(minResizeHeight), - static_cast(maxResizeHeight)); + newH = std::clamp(newH, static_cast(minResizeHeight), static_cast(maxResizeHeight)); setSize(startSize.x, newH); setPosition(startPosition.x, startPosition.y + deltaMousePos.y); } else if (grabbingFlag == static_cast(ResizeDirection::BOTTOM)) { float newH = startSize.y.getValue() + deltaMousePos.y; - newH = std::clamp(newH, static_cast(minResizeHeight), - static_cast(maxResizeHeight)); + newH = std::clamp(newH, static_cast(minResizeHeight), static_cast(maxResizeHeight)); setSize(startSize.x, newH); } - onResize.emit(this, tgui::Layout2d{getSize().x - startSize.x, - getSize().y - startSize.y}); + onResize.emit(this, tgui::Layout2d{getSize().x - startSize.x, getSize().y - startSize.y}); } void ResizableContainer::mouseMoved(tgui::Vector2f pos) { tgui::Group::mouseMoved(pos); @@ -165,9 +133,7 @@ void ResizableContainer::mouseMoved(tgui::Vector2f pos) { } } -void ResizableContainer::manualLeftMouseReleased(tgui::Vector2f pos) { - grabbingFlag = 0; -} +void ResizableContainer::manualLeftMouseReleased(tgui::Vector2f pos) { grabbingFlag = 0; } void ResizableContainer::leftMouseReleased(tgui::Vector2f pos) { tgui::Group::leftMouseReleased(pos); diff --git a/src/editor/components/tooltip.cpp b/src/editor/components/tooltip.cpp index 27b33b5d..89e05fd1 100644 --- a/src/editor/components/tooltip.cpp +++ b/src/editor/components/tooltip.cpp @@ -1,7 +1,9 @@ #include "components/tooltip.hpp" + +#include + #include "TGUI/Color.hpp" #include "TGUI/Widgets/Label.hpp" -#include Tooltip::Tooltip(const std::string &text) : tgui::Label() { this->setText(text); @@ -10,9 +12,7 @@ Tooltip::Tooltip(const std::string &text) : tgui::Label() { this->setTextSize(16); } -Tooltip::Ptr Tooltip::create(const std::string &text) { - return std::make_shared(text); -} +Tooltip::Ptr Tooltip::create(const std::string &text) { return std::make_shared(text); } Tooltip::Ptr Tooltip::copy(ConstPtr widget) { if (widget) { @@ -21,6 +21,4 @@ Tooltip::Ptr Tooltip::copy(ConstPtr widget) { return nullptr; } -tgui::Widget::Ptr Tooltip::clone() const { - return std::make_shared(*this); -} +tgui::Widget::Ptr Tooltip::clone() const { return std::make_shared(*this); } diff --git a/src/editor/editor.cpp b/src/editor/editor.cpp index f981c3e0..e69d9ac7 100644 --- a/src/editor/editor.cpp +++ b/src/editor/editor.cpp @@ -1,16 +1,17 @@ #include "editor.hpp" + +#include + #include "project.hpp" #include "raylib.h" #include "services/editorGuiService.hpp" #include "services/fileSystemService.hpp" #include "services/translationService.hpp" -#include Editor *Editor::instance; Editor::Editor() - : configurationService(), translationService(this), themeService(this), - hotkeyService(), project{nullptr} { + : configurationService(), translationService(this), themeService(this), hotkeyService(), project{nullptr} { instance = this; } @@ -33,17 +34,11 @@ HotkeyService &Editor::getHotkeyService() { return hotkeyService; } Project *Editor::getProject() const { return project.get(); } -RecentProjectService &Editor::getRecentProjectService() { - return recentProjectService; -} +RecentProjectService &Editor::getRecentProjectService() { return recentProjectService; } -ConfigurationService &Editor::getConfiguration() { - return configurationService; -} +ConfigurationService &Editor::getConfiguration() { return configurationService; } -void Editor::setProject(const std::string &path) { - project = std::make_unique(path); -} +void Editor::setProject(const std::string &path) { project = std::make_unique(path); } void Editor::unload() const { // Unload all the assets currently loaded and close the window. diff --git a/src/editor/fileViews/actorFileView.cpp b/src/editor/fileViews/actorFileView.cpp index 2704a73d..b81c7a7b 100644 --- a/src/editor/fileViews/actorFileView.cpp +++ b/src/editor/fileViews/actorFileView.cpp @@ -1,6 +1,7 @@ // TODO: Timeline, where the user can add frames and remove them. #include "fileViews/actorFileView.hpp" + #include "TGUI/String.hpp" #include "TGUI/Widgets/Label.hpp" #include "actor.hpp" @@ -21,8 +22,7 @@ ActorFileView::ActorFileView() { TranslationService &ts = Editor::instance->getTranslations(); this->actorView = ActorView::create(this); - Editor::instance->getGui().addUpdate( - WorldView::asUpdatable(this->actorView)); + Editor::instance->getGui().addUpdate(WorldView::asUpdatable(this->actorView)); auto canvasHeight = TextFormat("100%% - %d", BOTTOM_ANIMATION_PANEL); auto rightPanelOffset = TextFormat("100%% - %d", RIGHT_PANEL_W); @@ -36,16 +36,12 @@ ActorFileView::ActorFileView() { // The TileSet Editor this->tileSetField = FileField::create(); - bindTranslation(tileSetField->label, - "screen.project.roomview.tileset_file", - &tgui::Label::setText); - tileSetField->pathFilters = { - {tileSetField->label->getText(), {"*.rtiles"}}}; + bindTranslation(tileSetField->label, "screen.project.roomview.tileset_file", &tgui::Label::setText); + tileSetField->pathFilters = {{tileSetField->label->getText(), {"*.rtiles"}}}; tileSetField->callback = [this](const tgui::String &text) { actorView->actor->setTileSet(text.toStdString()); // fix for the atlas rectangle not sizing up properly. - actorView->setAtlasRect( - actorView->actor->getCurrentAnimationRectangle()); + actorView->setAtlasRect(actorView->actor->getCurrentAnimationRectangle()); frameEditor->updateFrameButtons(true); actorView->actor->resetAnimation(); }; @@ -53,11 +49,8 @@ ActorFileView::ActorFileView() { // Collision Rectangle Editor collisionField = RectangleField::create(); - bindTranslation(collisionField->label, - "screen.project.propview.collision", - &tgui::Label::setText); - collisionField->onChange( - [this](Rectangle r) { actorView->setCollisionRect(r); }); + bindTranslation(collisionField->label, "screen.project.propview.collision", &tgui::Label::setText); + collisionField->onChange([this](Rectangle r) { actorView->setCollisionRect(r); }); propBox->addRectangleField(collisionField); this->frameEditor = FrameEditor::create(this); @@ -78,14 +71,12 @@ void ActorFileView::init(tgui::Group::Ptr layout, VariantWrapper *variant) { this->actorView->setActor(ptrRaw); - this->tileSetField->setValue( - GetFileName(ptrRaw->getTileSetSource().c_str())); + this->tileSetField->setValue(GetFileName(ptrRaw->getTileSetSource().c_str())); this->collisionField->setValue(ptrRaw->getCollisionRect()); actorView->actor->onFrameChanged = [this](const int &frame) { this->frameEditor->onFrameChange(frame); - this->actorView->setAtlasRect( - actorView->actor->getCurrentAnimationRectangle()); + this->actorView->setAtlasRect(actorView->actor->getCurrentAnimationRectangle()); }; // NOTE: Always initialize this later. Otherwise, we might see diff --git a/src/editor/fileViews/dialogueFileView.cpp b/src/editor/fileViews/dialogueFileView.cpp index 6807f689..3b101e0d 100644 --- a/src/editor/fileViews/dialogueFileView.cpp +++ b/src/editor/fileViews/dialogueFileView.cpp @@ -1,4 +1,11 @@ #include "fileViews/dialogueFileView.hpp" + +#include +#include +#include +#include +#include + #include "TGUI/Layout.hpp" #include "TGUI/String.hpp" #include "TGUI/Texture.hpp" @@ -15,27 +22,18 @@ #include "services/fileSystemService.hpp" #include "services/translationService.hpp" #include "variant.hpp" -#include -#include -#include -#include -#include DialogueFileView::DialogueFileView() { TranslationService &ts = Editor::instance->getTranslations(); - noImageTexture = tgui::Texture( - Editor::instance->getFs().getResourcePath("no-image.png")); + noImageTexture = tgui::Texture(Editor::instance->getFs().getResourcePath("no-image.png")); - deleteTexture = - tgui::Texture(Editor::instance->getFs().getResourcePath("delete.png")); + deleteTexture = tgui::Texture(Editor::instance->getFs().getResourcePath("delete.png")); auto toolsPanel = tgui::Panel::create({"100%", 32}); toolsPanel->getRenderer()->setPadding({4, 4}); newLineButton = tgui::Button::create(); - bindTranslation(newLineButton, - "screen.project.dialogueview.add_new_line", - &tgui::Button::setText); + bindTranslation(newLineButton, "screen.project.dialogueview.add_new_line", &tgui::Button::setText); newLineButton->setSize("20%", "100%"); toolsPanel->add(newLineButton); @@ -45,10 +43,8 @@ DialogueFileView::DialogueFileView() { mainPanel->setPosition(0, 32); mainPanel->getRenderer()->setPadding({16, 16}); - mainPanel->getVerticalScrollbar()->setPolicy( - tgui::Scrollbar::Policy::Automatic); - mainPanel->getHorizontalScrollbar()->setPolicy( - tgui::Scrollbar::Policy::Never); + mainPanel->getVerticalScrollbar()->setPolicy(tgui::Scrollbar::Policy::Automatic); + mainPanel->getHorizontalScrollbar()->setPolicy(tgui::Scrollbar::Policy::Never); vertLayout = tgui::GrowVerticalLayout::create(); vertLayout->getRenderer()->setSpaceBetweenWidgets(20.0f); @@ -56,8 +52,7 @@ DialogueFileView::DialogueFileView() { widgetContainer.push_back(mainPanel); } -tgui::Panel::Ptr DialogueFileView::makeLinePanel(DialogueBin &data, - DialogueLine line, size_t i) { +tgui::Panel::Ptr DialogueFileView::makeLinePanel(DialogueBin &data, DialogueLine line, size_t i) { TranslationService &ts = Editor::instance->getTranslations(); auto panel = tgui::Panel::create({"100%", DIALOGUE_PANEL_HEIGHT}); panel->getRenderer()->setPadding({16, 16}); @@ -68,8 +63,7 @@ tgui::Panel::Ptr DialogueFileView::makeLinePanel(DialogueBin &data, portraitPic->setPosition(0, 40); portraitPic->setSize("height", "100% - 40"); if (line.hasPortrait) { - auto filePath = Editor::instance->getProject()->getResourcePath( - EngineFileType::FILE_IMAGE, line.imageId); + auto filePath = Editor::instance->getProject()->getResourcePath(EngineFileType::FILE_IMAGE, line.imageId); if (FileExists(filePath.c_str())) { tgui::Texture texture(filePath); portraitPic->getRenderer()->setTexture(texture); @@ -83,13 +77,11 @@ tgui::Panel::Ptr DialogueFileView::makeLinePanel(DialogueBin &data, if (data.lines.at(i).hasPortrait) { auto fileDialog = tgui::FileDialog::create(); fileDialog->setFileTypeFilters({{"Images", {"*.png", "*.jpg"}}}); - fileDialog->onFileSelect( - [&data, i, portraitWeak](const tgui::String &path) { - data.lines.at(i).imageId = - GetFileName(path.toStdString().c_str()); - tgui::Texture texture(path); - portraitWeak.lock()->getRenderer()->setTexture(texture); - }); + fileDialog->onFileSelect([&data, i, portraitWeak](const tgui::String &path) { + data.lines.at(i).imageId = GetFileName(path.toStdString().c_str()); + tgui::Texture texture(path); + portraitWeak.lock()->getRenderer()->setTexture(texture); + }); Editor::instance->getGui().gui->add(fileDialog); } @@ -110,21 +102,17 @@ tgui::Panel::Ptr DialogueFileView::makeLinePanel(DialogueBin &data, diagTextEdit->setPosition(210, 32 + 8); diagTextEdit->setSize({"100% - 210 - 40", "100% - 40"}); diagTextEdit->setText(line.text); - diagTextEdit->onTextChange([&data, i](const tgui::String &text) { - data.lines.at(i).text = text.toStdString(); - }); + diagTextEdit->onTextChange([&data, i](const tgui::String &text) { data.lines.at(i).text = text.toStdString(); }); panel->add(diagTextEdit); auto hasImageCheck = tgui::CheckBox::create(); - bindTranslation( - hasImageCheck, "screen.project.dialogueview.has_a_portrait", - &tgui::CheckBox::setText); + bindTranslation(hasImageCheck, "screen.project.dialogueview.has_a_portrait", + &tgui::CheckBox::setText); hasImageCheck->setSize(32, 32); hasImageCheck->setChecked(line.hasPortrait); std::weak_ptr weakDiagText = diagTextEdit; - hasImageCheck->onCheck([this, &data, i, portraitPic, - weakDiagText](bool value) { + hasImageCheck->onCheck([this, &data, i, portraitPic, weakDiagText](bool value) { data.lines.at(i).hasPortrait = value; if (!value) { data.lines.at(i).imageId = ""; @@ -148,9 +136,7 @@ tgui::Panel::Ptr DialogueFileView::makeLinePanel(DialogueBin &data, deleteButton->setPosition("100% - 32", 0); deleteButton->setImage(deleteTexture); deleteButton->onClick([this, &data, i] { - mainPanel->setContentSize( - {0, static_cast((DIALOGUE_PANEL_HEIGHT + 8) * - (data.lines.size()))}); + mainPanel->setContentSize({0, static_cast((DIALOGUE_PANEL_HEIGHT + 8) * (data.lines.size()))}); data.lines.erase(data.lines.begin() + i); vertLayout->remove(linePanels.at(i)); @@ -184,14 +170,10 @@ void DialogueFileView::init(tgui::Group::Ptr layout, VariantWrapper *variant) { vertLayout->add(panel); linePanels.push_back(panel); - mainPanel->setContentSize( - {0, static_cast((DIALOGUE_PANEL_HEIGHT + 8) * - (data.lines.size() + 1))}); + mainPanel->setContentSize({0, static_cast((DIALOGUE_PANEL_HEIGHT + 8) * (data.lines.size() + 1))}); }); - mainPanel->setContentSize( - {0, static_cast((DIALOGUE_PANEL_HEIGHT + 8) * - (data.lines.size() + 1))}); + mainPanel->setContentSize({0, static_cast((DIALOGUE_PANEL_HEIGHT + 8) * (data.lines.size() + 1))}); int i = 0; for (auto line : dialogue->getData().lines) { diff --git a/src/editor/fileViews/emptyView.cpp b/src/editor/fileViews/emptyView.cpp index 6017abfe..a29acad8 100644 --- a/src/editor/fileViews/emptyView.cpp +++ b/src/editor/fileViews/emptyView.cpp @@ -1,4 +1,5 @@ #include "fileViews/emptyView.hpp" + #include "TGUI/Widgets/Group.hpp" #include "TGUI/Widgets/Label.hpp" #include "bindTranslation.hpp" @@ -9,14 +10,11 @@ EmptyFileView::EmptyFileView() { TranslationService &ts = Editor::instance->getTranslations(); auto noticeText = tgui::Label::create(); - bindTranslation(noticeText, "screen.project.emptyview.notice", - &tgui::Label::setText); + bindTranslation(noticeText, "screen.project.emptyview.notice", &tgui::Label::setText); noticeText->setPosition("50%", "50%"); noticeText->setOrigin(0.5, 0.5); noticeText->setTextSize(24); widgetContainer.push_back(noticeText); } -void EmptyFileView::init(tgui::Group::Ptr layout, VariantWrapper *variant) { - addWidgets(layout); -} +void EmptyFileView::init(tgui::Group::Ptr layout, VariantWrapper *variant) { addWidgets(layout); } diff --git a/src/editor/fileViews/fileView.cpp b/src/editor/fileViews/fileView.cpp index 3c99853f..1890d5e3 100644 --- a/src/editor/fileViews/fileView.cpp +++ b/src/editor/fileViews/fileView.cpp @@ -1,9 +1,11 @@ #include "fileViews/fileView.hpp" -#include "actions/action.hpp" + #include #include #include +#include "actions/action.hpp" + FileView::FileView() {} FileView::~FileView() {} diff --git a/src/editor/fileViews/fontFileView.cpp b/src/editor/fileViews/fontFileView.cpp index 24cc04ec..776f5918 100644 --- a/src/editor/fileViews/fontFileView.cpp +++ b/src/editor/fileViews/fontFileView.cpp @@ -1,4 +1,7 @@ #include "fileViews/fontFileView.hpp" + +#include + #include "TGUI/String.hpp" #include "TGUI/Widgets/EditBox.hpp" #include "TGUI/Widgets/Panel.hpp" @@ -8,7 +11,6 @@ #include "variant.hpp" #include "views/fontView.hpp" #include "views/worldView.hpp" -#include FontFileView::FontFileView() { fontView = FontView::create(); @@ -26,18 +28,14 @@ FontFileView::FontFileView() { fontSizeField->setMinimum(8.0f); fontSizeField->setMaximum(160.0); fontSizeField->setValue(16.0f); - fontSizeField->onValueChange([this](float value) { - fontView->setBaseFontSize(static_cast(floor(value))); - }); + fontSizeField->onValueChange([this](float value) { fontView->setBaseFontSize(static_cast(floor(value))); }); topPanel->add(fontSizeField); auto fontTextField = tgui::EditBox::create(); fontTextField->setSize("100% - 140", "100%"); fontTextField->setPosition(124.0f, 0); fontTextField->setText(fontView->getText()); - fontTextField->onTextChange([this](const tgui::String &text) { - fontView->setText(text.toStdString()); - }); + fontTextField->onTextChange([this](const tgui::String &text) { fontView->setText(text.toStdString()); }); topPanel->add(fontTextField); widgetContainer.push_back(fontView); diff --git a/src/editor/fileViews/imageFileView.cpp b/src/editor/fileViews/imageFileView.cpp index 2f8e9574..dd95b9cf 100644 --- a/src/editor/fileViews/imageFileView.cpp +++ b/src/editor/fileViews/imageFileView.cpp @@ -1,11 +1,13 @@ #include "fileViews/imageFileView.hpp" + +#include + #include "TGUI/Widgets/Label.hpp" #include "editor.hpp" #include "raylib.h" #include "saveables/imageWrapper.hpp" #include "views/imageView.hpp" #include "views/worldView.hpp" -#include ImageFileView::ImageFileView() { imageView = ImageView::create(); @@ -36,9 +38,8 @@ void ImageFileView::init(tgui::Group::Ptr layout, VariantWrapper *variant) { auto image = ptr->get(); imageView->setImage(image); - infoLabel->setText(TextFormat("%s | Image Size: %ix%i", - GetFileName(image->source.c_str()), - image->image.width, image->image.height)); + infoLabel->setText(TextFormat("%s | Image Size: %ix%i", GetFileName(image->source.c_str()), image->image.width, + image->image.height)); addWidgets(layout); } \ No newline at end of file diff --git a/src/editor/fileViews/propFileView.cpp b/src/editor/fileViews/propFileView.cpp index 338ca1de..b9115f22 100644 --- a/src/editor/fileViews/propFileView.cpp +++ b/src/editor/fileViews/propFileView.cpp @@ -1,4 +1,5 @@ #include "fileViews/propFileView.hpp" + #include "TGUI/String.hpp" #include "bindTranslation.hpp" #include "editor.hpp" @@ -23,9 +24,7 @@ PropFileView::PropFileView() { propBox->setPosition({TextFormat("100%% - %d", RIGHT_PANEL_W), 0}); hasInteractableField = BoolField::create(); - bindTranslation(hasInteractableField->label, - "screen.project.propview.has_interactable", - &tgui::Label::setText); + bindTranslation(hasInteractableField->label, "screen.project.propview.has_interactable", &tgui::Label::setText); hasInteractableField->value->onChange([this](bool value) { propView->getProp()->setHasInteractable(value); interactableTypeField->setEnabled(value); @@ -38,47 +37,34 @@ PropFileView::PropFileView() { propBox->addBooleanField(hasInteractableField); interactableTypeField = SelectField::create(); - bindTranslation(interactableTypeField->label, - "screen.project.propview.interactable_type", - &tgui::Label::setText); - for (const auto &[k, v] : - Editor::instance->getProject()->getInteractableNames()) { + bindTranslation(interactableTypeField->label, "screen.project.propview.interactable_type", &tgui::Label::setText); + for (const auto &[k, v] : Editor::instance->getProject()->getInteractableNames()) { interactableTypeField->value->addItem(GetFileNameWithoutExt(k.c_str())); } interactableTypeField->value->onItemSelect( - [this](const tgui::String &item) { - propView->getProp()->setInteractableType(item.toStdString()); - }); + [this](const tgui::String &item) { propView->getProp()->setInteractableType(item.toStdString()); }); propBox->addSelectField(interactableTypeField); propImageField = FileField::create(); - bindTranslation(propImageField->label, "screen.project.propview.image", - &tgui::Label::setText); - propImageField->pathFilters = { - {"Image", {"*.png"}}}; // TODO: Add more image types + bindTranslation(propImageField->label, "screen.project.propview.image", &tgui::Label::setText); + propImageField->pathFilters = {{"Image", {"*.png"}}}; // TODO: Add more image types propImageField->callback = [this](const tgui::String &path) { propView->getProp()->setTextureFromPath(path.toStdString()); }; propBox->addFileField(propImageField); atlasRectField = RectangleField::create(); - bindTranslation(atlasRectField->label, "screen.project.propview.atlas", - &tgui::Label::setText); - atlasRectField->onChange( - [this](Rectangle r) { propView->updateAtlasRect(r); }); + bindTranslation(atlasRectField->label, "screen.project.propview.atlas", &tgui::Label::setText); + atlasRectField->onChange([this](Rectangle r) { propView->updateAtlasRect(r); }); propBox->addRectangleField(atlasRectField); collisionsField = RectangleField::create(); - bindTranslation(collisionsField->label, "screen.project.propview.collision", - &tgui::Label::setText); - collisionsField->onChange( - [this](Rectangle r) { propView->updateCollisionRect(r); }); + bindTranslation(collisionsField->label, "screen.project.propview.collision", &tgui::Label::setText); + collisionsField->onChange([this](Rectangle r) { propView->updateCollisionRect(r); }); propBox->addRectangleField(collisionsField); - propView->onUpdatedAtlasRect( - [this](Rectangle r) { atlasRectField->setValue(r); }); - propView->onUpdatedCollisionRect( - [this](Rectangle r) { collisionsField->setValue(r); }); + propView->onUpdatedAtlasRect([this](Rectangle r) { atlasRectField->setValue(r); }); + propView->onUpdatedCollisionRect([this](Rectangle r) { collisionsField->setValue(r); }); widgetContainer.push_back(propBox); widgetContainer.push_back(propView); } @@ -91,8 +77,7 @@ void PropFileView::init(tgui::Group::Ptr layout, VariantWrapper *variant) { auto ptr = dynamic_cast *>(variant); auto prop = ptr->get(); - if (prop == nullptr) - return; + if (prop == nullptr) return; propView->setProp(prop); hasInteractableField->value->setChecked(prop->getHasInteractable()); diff --git a/src/editor/fileViews/roomFileView.cpp b/src/editor/fileViews/roomFileView.cpp index 4e7b8f70..c064e314 100644 --- a/src/editor/fileViews/roomFileView.cpp +++ b/src/editor/fileViews/roomFileView.cpp @@ -1,4 +1,7 @@ #include "fileViews/roomFileView.hpp" + +#include + #include "TGUI/String.hpp" #include "TGUI/Widgets/CheckBox.hpp" #include "TGUI/Widgets/ComboBox.hpp" @@ -17,7 +20,6 @@ #include "widgets/propertiesBox.hpp" #include "widgets/propertyFields/fileField.hpp" #include "widgets/toolbox.hpp" -#include RoomFileView::RoomFileView() { RoomTool a; @@ -25,15 +27,13 @@ RoomFileView::RoomFileView() { HotkeyService &hks = Editor::instance->getHotkeyService(); roomView = RoomView::create(); - roomView->setSize({TextFormat("100%% - %d", RIGHT_PANEL_W), - TextFormat("100%% - %d", TOOLBOX_H)}); + roomView->setSize({TextFormat("100%% - %d", RIGHT_PANEL_W), TextFormat("100%% - %d", TOOLBOX_H)}); roomView->setPosition(0, TOOLBOX_H); Editor::instance->getGui().addUpdate(WorldView::asUpdatable(roomView)); widgetContainer.push_back(roomView); auto roomLayerGroup = tgui::Group::create(); - roomLayerGroup->setPosition(TextFormat("100%% - %d", RIGHT_PANEL_W), - LAYER_CHOOSE_H); + roomLayerGroup->setPosition(TextFormat("100%% - %d", RIGHT_PANEL_W), LAYER_CHOOSE_H); roomLayerGroup->setSize({ROOM_LAYER_W, ROOM_LAYER_H}); layerVisitor.group = roomLayerGroup; @@ -73,34 +73,28 @@ RoomFileView::RoomFileView() { auto props = PropertiesBox::create(); props->setSize({RIGHT_PANEL_W, "100%"}); - props->setPosition({TextFormat("100%% - %d", RIGHT_PANEL_W), - ROOM_LAYER_H + LAYER_CHOOSE_H}); + props->setPosition({TextFormat("100%% - %d", RIGHT_PANEL_W), ROOM_LAYER_H + LAYER_CHOOSE_H}); widthField = IntField::create(); - bindTranslation(widthField->label, "screen.project.roomview.mapwidth", - &tgui::Label::setText); - widthField->value->onValueChange([this](const auto& value) { - Vector2 worldSize = - this->roomView->getRoom()->getTileMap()->getMaxWorldSize(); + bindTranslation(widthField->label, "screen.project.roomview.mapwidth", &tgui::Label::setText); + widthField->value->onValueChange([this](const auto &value) { + Vector2 worldSize = this->roomView->getRoom()->getTileMap()->getMaxWorldSize(); worldSize.x = static_cast(value); this->roomView->getRoom()->getTileMap()->setWorldSize(worldSize); }); props->addIntField(widthField); heightField = IntField::create(); - bindTranslation(heightField->label, "screen.project.roomview.mapheight", - &tgui::Label::setText); - heightField->value->onValueChange([this](const float& value) { - Vector2 worldSize = - this->roomView->getRoom()->getTileMap()->getMaxWorldSize(); + bindTranslation(heightField->label, "screen.project.roomview.mapheight", &tgui::Label::setText); + heightField->value->onValueChange([this](const float &value) { + Vector2 worldSize = this->roomView->getRoom()->getTileMap()->getMaxWorldSize(); worldSize.y = static_cast(value); this->roomView->getRoom()->getTileMap()->setWorldSize(worldSize); }); props->addIntField(heightField); tileSetField = FileField::create("", "..."); - bindTranslation(tileSetField->label, "screen.project.roomview.tileset_file", - &tgui::Label::setText); + bindTranslation(tileSetField->label, "screen.project.roomview.tileset_file", &tgui::Label::setText); tileSetField->pathFilters = {{"RPG++ TileSet", {"*.rtiles"}}}; tileSetField->callback = [this](const tgui::String &path) { auto room = this->roomView->getRoom(); @@ -110,14 +104,11 @@ RoomFileView::RoomFileView() { props->addFileField(tileSetField); musicFileField = FileField::create("", ""); - bindTranslation(musicFileField->label, - "screen.project.roomview.bg_music_file", - &tgui::Label::setText); + bindTranslation(musicFileField->label, "screen.project.roomview.bg_music_file", &tgui::Label::setText); musicFileField->setWidgetName("file"); musicFileField->pathFilters = {{"Music File", {"*.mp4", "*.ogg", "*.wav"}}}; musicFileField->callback = [this](const tgui::String &path) { - roomView->getRoom()->setMusicSource( - GetFileNameWithoutExt(path.toStdString().c_str())); + roomView->getRoom()->setMusicSource(GetFileNameWithoutExt(path.toStdString().c_str())); }; props->addFileField(musicFileField); @@ -131,51 +122,36 @@ RoomFileView::RoomFileView() { auto toolbox = Toolbox::create(); toolbox->getVerticalScrollbar()->setPolicy(tgui::Scrollbar::Policy::Never); - toolbox->getHorizontalScrollbar()->setPolicy( - tgui::Scrollbar::Policy::Never); + toolbox->getHorizontalScrollbar()->setPolicy(tgui::Scrollbar::Policy::Never); toolbox->setSize({TextFormat("100%% - %d", RIGHT_PANEL_W), TOOLBOX_H}); std::vector>> tools = { - {"room_tool.mouse", ToolboxItem{"tool", RoomTool::TOOL_NONE, - "Mouse", "tool_none.png"}}, - {"room_tool.pen", ToolboxItem{"tool", RoomTool::TOOL_PLACE, - "Place", "tool_place.png"}}, - {"room_tool.eraser", ToolboxItem{"tool", RoomTool::TOOL_ERASE, - "Erase", "tool_erase.png"}}, - {"room_tool.edit", ToolboxItem{"tool", RoomTool::TOOL_EDIT, - "Edit", "tool_edit.png"}}, + {"room_tool.mouse", ToolboxItem{"tool", RoomTool::TOOL_NONE, "Mouse", "tool_none.png"}}, + {"room_tool.pen", ToolboxItem{"tool", RoomTool::TOOL_PLACE, "Place", "tool_place.png"}}, + {"room_tool.eraser", ToolboxItem{"tool", RoomTool::TOOL_ERASE, "Erase", "tool_erase.png"}}, + {"room_tool.edit", ToolboxItem{"tool", RoomTool::TOOL_EDIT, "Edit", "tool_edit.png"}}, {"room_tool.set_spoint", - ToolboxItem{"tool", RoomTool::TOOL_STARTPOINT, "Start Point", - "tool_startpoint.png"}}}; + ToolboxItem{"tool", RoomTool::TOOL_STARTPOINT, "Start Point", "tool_startpoint.png"}}}; for (auto &[k, tool] : tools) { auto capturedTool = tool; toolbox->addTool(tool); - hotkeyEntries.push_back( - hks.registerHotkeyCallback(k, [this, capturedTool, toolbox]() { - if (fileViewFocused) - toolbox->selectTool(capturedTool); - })); + hotkeyEntries.push_back(hks.registerHotkeyCallback(k, [this, capturedTool, toolbox]() { + if (fileViewFocused) toolbox->selectTool(capturedTool); + })); } auto brushToggle = tgui::CheckBox::create(); - bindTranslation(brushToggle, - "screen.project.roomview.enable_brush", - &tgui::CheckBox::setText); - brushToggle->onChange( - [this](bool toggled) { roomView->setBrush(toggled); }); - auto brushToggleSize = - TOOLBOX_H - toolbox->getRenderer()->getPadding().getTop(); + bindTranslation(brushToggle, "screen.project.roomview.enable_brush", &tgui::CheckBox::setText); + brushToggle->onChange([this](bool toggled) { roomView->setBrush(toggled); }); + auto brushToggleSize = TOOLBOX_H - toolbox->getRenderer()->getPadding().getTop(); brushToggle->setSize({brushToggleSize, brushToggleSize}); toolbox->addWidget(brushToggle); - hotkeyEntries.push_back(hks.registerHotkeyCallback( - "room_tool.toggle_bm", [this, brushToggle]() { - if (fileViewFocused) - brushToggle->setChecked(!brushToggle->isChecked()); - })); + hotkeyEntries.push_back(hks.registerHotkeyCallback("room_tool.toggle_bm", [this, brushToggle]() { + if (fileViewFocused) brushToggle->setChecked(!brushToggle->isChecked()); + })); - toolbox->onItemClicked( - [this](ToolboxItem tool) { setRoomTool(tool); }); + toolbox->onItemClicked([this](ToolboxItem tool) { setRoomTool(tool); }); widgetContainer.push_back(toolbox); } @@ -185,8 +161,7 @@ void RoomFileView::setRoomTool(ToolboxItem tool) { roomView->setTool(tool.id); layerVisitor.tool = tool.id; layerVisitor.group->removeAllWidgets(); - mj::visit(layerVisitor, - static_cast(layerChoose->getSelectedItemIndex())); + mj::visit(layerVisitor, static_cast(layerChoose->getSelectedItemIndex())); } RoomFileView::~RoomFileView() { HotkeyService &hks = Editor::instance->getHotkeyService(); @@ -196,21 +171,18 @@ RoomFileView::~RoomFileView() { } void RoomFileView::init(tgui::Group::Ptr layout, VariantWrapper *variant) { - if (variant == nullptr) - return; + if (variant == nullptr) return; auto ptr = dynamic_cast *>(variant); auto room = ptr->get(); - if (room == nullptr) - return; + if (room == nullptr) return; roomView->setRoom(room); tileSetView->setTileSet(room->getTileMap()->getTileSet()); widthField->value->setValue(room->getTileMap()->getMaxWorldSize().x); heightField->value->setValue(room->getTileMap()->getMaxWorldSize().y); tileSetField->value->setText(room->getTileMap()->getTileSetSource()); - musicFileField->value->setText( - GetFileNameWithoutExt(room->getMusicSource().c_str())); + musicFileField->value->setText(GetFileNameWithoutExt(room->getMusicSource().c_str())); addWidgets(layout); } diff --git a/src/editor/fileViews/soundFileView.cpp b/src/editor/fileViews/soundFileView.cpp index da743080..61127c5a 100644 --- a/src/editor/fileViews/soundFileView.cpp +++ b/src/editor/fileViews/soundFileView.cpp @@ -1,15 +1,17 @@ #include "fileViews/soundFileView.hpp" + +#include +#include +#include +#include +#include + #include "editor.hpp" #include "raylib.h" #include "saveables/soundWrapper.hpp" #include "timeFormat.hpp" #include "updatable.hpp" #include "widgets/soundPlayer.hpp" -#include -#include -#include -#include -#include SoundFileView::SoundFileView() { auto topPanel = tgui::Panel::create(); @@ -25,8 +27,7 @@ SoundFileView::SoundFileView() { soundPlayer->setPosition(20, 36 + 20); soundPlayer->setSize({"100% - 40", 48}); - Editor::instance->getGui().addUpdate( - dynamic_pointer_cast(soundPlayer)); + Editor::instance->getGui().addUpdate(dynamic_pointer_cast(soundPlayer)); widgetContainer.push_back(topPanel); widgetContainer.push_back(soundPlayer); @@ -40,9 +41,8 @@ void SoundFileView::init(tgui::Group::Ptr layout, VariantWrapper *variant) { auto ptr = dynamic_cast *>(variant); auto sound = ptr->get(); - infoLabel->setText( - TextFormat("%s | Length: %s", GetFileName(sound->source.c_str()), - formatTime(GetMusicTimeLength(sound->sound)).c_str())); + infoLabel->setText(TextFormat("%s | Length: %s", GetFileName(sound->source.c_str()), + formatTime(GetMusicTimeLength(sound->sound)).c_str())); soundPlayer->setSound(sound); addWidgets(layout); diff --git a/src/editor/fileViews/tilesetFileView.cpp b/src/editor/fileViews/tilesetFileView.cpp index f4c045f4..e55b53c0 100644 --- a/src/editor/fileViews/tilesetFileView.cpp +++ b/src/editor/fileViews/tilesetFileView.cpp @@ -1,4 +1,7 @@ #include "fileViews/tilesetFileView.hpp" + +#include + #include "TGUI/Widgets/Group.hpp" #include "bindTranslation.hpp" #include "editor.hpp" @@ -11,7 +14,6 @@ #include "widgets/propertiesBox.hpp" #include "widgets/propertyFields/fileField.hpp" #include "widgets/propertyFields/intField.hpp" -#include TileSetFileView::TileSetFileView() { TranslationService &ts = Editor::instance->getTranslations(); @@ -27,20 +29,15 @@ TileSetFileView::TileSetFileView() { props->setPosition({TextFormat("100%% - %d", RIGHT_PANEL_W), 0}); widthField = IntField::create(); - bindTranslation(widthField->label, "screen.project.tilesetview.tile_width", - &tgui::Label::setText); - widthField->value->onValueChange([this](const float& value) { - this->worldView->getTileSet()->setTileWidth(static_cast(value)); - }); + bindTranslation(widthField->label, "screen.project.tilesetview.tile_width", &tgui::Label::setText); + widthField->value->onValueChange( + [this](const float &value) { this->worldView->getTileSet()->setTileWidth(static_cast(value)); }); props->addIntField(widthField); heightField = IntField::create(); - bindTranslation(heightField->label, - "screen.project.tilesetview.tile_height", - &tgui::Label::setText); - heightField->value->onValueChange([this](const float& value) { - this->worldView->getTileSet()->setTileHeight(static_cast(value)); - }); + bindTranslation(heightField->label, "screen.project.tilesetview.tile_height", &tgui::Label::setText); + heightField->value->onValueChange( + [this](const float &value) { this->worldView->getTileSet()->setTileHeight(static_cast(value)); }); props->addButton("Square Tiles", [this] { auto tileset = this->worldView->getTileSet(); @@ -56,8 +53,7 @@ TileSetFileView::TileSetFileView() { props->addIntField(heightField); textureFile = FileField::create("", "..."); - bindTranslation(textureFile->label, "screen.project.tilesetview.texture", - &tgui::Label::setText); + bindTranslation(textureFile->label, "screen.project.tilesetview.texture", &tgui::Label::setText); textureFile->pathFilters = {{ {"Images", {"*.png", "*.jpg"}}, }}; diff --git a/src/editor/projectFile.cpp b/src/editor/projectFile.cpp index 9ea55991..acbf75ab 100644 --- a/src/editor/projectFile.cpp +++ b/src/editor/projectFile.cpp @@ -1,4 +1,9 @@ #include "projectFile.hpp" + +#include +#include +#include + #include "TGUI/Widgets/Group.hpp" #include "fileViews/emptyView.hpp" #include "fileViews/fileView.hpp" @@ -6,14 +11,10 @@ #include "services/fileSystemService.hpp" #include "tileset.hpp" #include "variant.hpp" -#include -#include -#include ProjectFile::ProjectFile() { view = std::make_unique(); } -ProjectFile::ProjectFile(std::unique_ptr view, - std::unique_ptr variant, +ProjectFile::ProjectFile(std::unique_ptr view, std::unique_ptr variant, EngineFileType fileType, bool isSaveable) { this->view = std::move(view); this->variant = std::move(variant); @@ -21,9 +22,7 @@ ProjectFile::ProjectFile(std::unique_ptr view, this->isSaveable = isSaveable; } -void ProjectFile::setFilePath(const std::string &filePath) { - this->filePath = filePath; -} +void ProjectFile::setFilePath(const std::string &filePath) { this->filePath = filePath; } std::string &ProjectFile::getFilePath() { return filePath; } @@ -35,13 +34,10 @@ void ProjectFile::initUi(tgui::Group::Ptr group) { } } -void ProjectFile::addWidgets(tgui::Group::Ptr layout) { - view->addWidgets(layout); -} +void ProjectFile::addWidgets(tgui::Group::Ptr layout) { view->addWidgets(layout); } void ProjectFile::saveFile(const std::string &path) { - if (!isSaveable) - return; + if (!isSaveable) return; auto saveable = variant->toSaveable(); json j = saveable->dumpJson(); diff --git a/src/editor/roomViewModesHandler.cpp b/src/editor/roomViewModesHandler.cpp index 81b2059c..c20e6f55 100644 --- a/src/editor/roomViewModesHandler.cpp +++ b/src/editor/roomViewModesHandler.cpp @@ -1,26 +1,26 @@ #include "roomViewModesHandler.hpp" + #include "raylib.h" RoomViewModesHandler::RoomViewModesHandler() {} void RoomViewModesHandler::handleMode(int x, int y) { - if (view.expired()) - return; + if (view.expired()) return; auto ptr = view.lock(); switch (ptr->tool) { - case RoomTool::TOOL_PLACE: - handlePlaceMode(x, y); - break; - case RoomTool::TOOL_ERASE: - handleEraseMode(x, y); - break; - case RoomTool::TOOL_EDIT: - handleEditMode(x, y); - break; - default: - break; + case RoomTool::TOOL_PLACE: + handlePlaceMode(x, y); + break; + case RoomTool::TOOL_ERASE: + handleEraseMode(x, y); + break; + case RoomTool::TOOL_EDIT: + handleEditMode(x, y); + break; + default: + break; } } @@ -37,18 +37,13 @@ void RoomViewModesHandler::handlePlaceMode(int x, int y) { if (CheckCollisionPointRec(state.mouseWorldPos, destRect)) { auto atlasTilePos = ptr->tileSetView->getSelectedTile(); - if (tileSet->areAtlasCoordsValid( - {static_cast(atlasTilePos.x), - static_cast(atlasTilePos.y)})) { - Rectangle atlasSourceRect = - ptr->getSourceRect(tileMap, atlasTilePos.x, atlasTilePos.y); + if (tileSet->areAtlasCoordsValid({static_cast(atlasTilePos.x), static_cast(atlasTilePos.y)})) { + Rectangle atlasSourceRect = ptr->getSourceRect(tileMap, atlasTilePos.x, atlasTilePos.y); IVector tileMouse = ptr->getTileAtMouse(); - Rectangle destRect = - ptr->getDestRect(tileMap, tileMouse.x, tileMouse.y); + Rectangle destRect = ptr->getDestRect(tileMap, tileMouse.x, tileMouse.y); - DrawTexturePro(texture, atlasSourceRect, destRect, {0.0f, 0.0f}, - 0.0f, Fade(WHITE, 0.7f)); + DrawTexturePro(texture, atlasSourceRect, destRect, {0.0f, 0.0f}, 0.0f, Fade(WHITE, 0.7f)); } } } @@ -81,23 +76,22 @@ void RoomViewModesHandler::handleEraseMode(int x, int y) { } void RoomViewModesHandler::handleModePress(tgui::Vector2f pos) { - if (view.expired()) - return; + if (view.expired()) return; auto ptr = view.lock(); switch (ptr->tool) { - case RoomTool::TOOL_PLACE: - handlePlacePress(pos); - break; - case RoomTool::TOOL_ERASE: - handleErasePress(pos); - break; - case RoomTool::TOOL_EDIT: - handleEditPress(pos); - break; - default: - break; + case RoomTool::TOOL_PLACE: + handlePlacePress(pos); + break; + case RoomTool::TOOL_ERASE: + handleErasePress(pos); + break; + case RoomTool::TOOL_EDIT: + handleEditPress(pos); + break; + default: + break; } } @@ -108,14 +102,11 @@ void RoomViewModesHandler::handlePlacePress(tgui::Vector2f pos) { IVector atlasTilePos = ptr->tileSetView->getSelectedTile(); if (tileMap->getTileSet()->areAtlasCoordsValid( - {static_cast(atlasTilePos.x), - static_cast(atlasTilePos.y)})) { + {static_cast(atlasTilePos.x), static_cast(atlasTilePos.y)})) { IVector tileMouse = ptr->getTileAtMouse(); - Vector2 worldPos = {static_cast(tileMouse.x), - static_cast(tileMouse.y)}; - Vector2 atlasPos = {static_cast(atlasTilePos.x), - static_cast(atlasTilePos.y)}; + Vector2 worldPos = {static_cast(tileMouse.x), static_cast(tileMouse.y)}; + Vector2 atlasPos = {static_cast(atlasTilePos.x), static_cast(atlasTilePos.y)}; tileMap->setTile(worldPos, atlasPos); } @@ -128,8 +119,7 @@ void RoomViewModesHandler::handleErasePress(tgui::Vector2f pos) { IVector tileMouse = ptr->getTileAtMouse(); - Vector2 worldPos = {static_cast(tileMouse.x), - static_cast(tileMouse.y)}; + Vector2 worldPos = {static_cast(tileMouse.x), static_cast(tileMouse.y)}; tileMap->setEmptyTile(worldPos); } @@ -140,22 +130,16 @@ void RoomViewModesHandler::handleEditPress(tgui::Vector2f pos) { TileMap *tileMap = ptr->room->getTileMap(); ptr->selectedTile = ptr->getTileAtMouse(); - Vector2 atlasCoords = - tileMap->getTile(ptr->selectedTile.x, ptr->selectedTile.y) - .getAtlasTile() - .getAtlasCoords(); - IVector atlasCoordsInt = {static_cast(atlasCoords.x), - static_cast(atlasCoords.y)}; + Vector2 atlasCoords = tileMap->getTile(ptr->selectedTile.x, ptr->selectedTile.y).getAtlasTile().getAtlasCoords(); + IVector atlasCoordsInt = {static_cast(atlasCoords.x), static_cast(atlasCoords.y)}; ptr->tileSetView->setSelectedTile(atlasCoordsInt); ptr->tileSetView->onTileSelected.disconnectAll(); ptr->tileSetView->onTileSelected([ptr, tileMap](IVector newTile) { IVector tileMouse = ptr->selectedTile; if (tileMouse.x >= 0) { - Vector2 worldPos = {static_cast(tileMouse.x), - static_cast(tileMouse.y)}; - Vector2 atlasPos = {static_cast(newTile.x), - static_cast(newTile.y)}; + Vector2 worldPos = {static_cast(tileMouse.x), static_cast(tileMouse.y)}; + Vector2 atlasPos = {static_cast(newTile.x), static_cast(newTile.y)}; tileMap->setTile(worldPos, atlasPos); } diff --git a/src/editor/saveables/fontWrapper.cpp b/src/editor/saveables/fontWrapper.cpp index 2919fe51..ecff51ea 100644 --- a/src/editor/saveables/fontWrapper.cpp +++ b/src/editor/saveables/fontWrapper.cpp @@ -1,7 +1,9 @@ #include "saveables/fontWrapper.hpp" -#include "raylib.h" + #include +#include "raylib.h" + FontWrapper::FontWrapper(const std::string &filePath) { font = LoadFont(filePath.c_str()); fontSource = filePath; diff --git a/src/editor/saveables/imageWrapper.cpp b/src/editor/saveables/imageWrapper.cpp index d5e9f5b3..409e52a6 100644 --- a/src/editor/saveables/imageWrapper.cpp +++ b/src/editor/saveables/imageWrapper.cpp @@ -1,8 +1,10 @@ #include "saveables/imageWrapper.hpp" -#include "raylib.h" + #include #include +#include "raylib.h" + ImageWrapper::ImageWrapper(const std::string &filePath) { printf("%s \n", filePath.c_str()); image = LoadImage(filePath.c_str()); diff --git a/src/editor/saveables/soundWrapper.cpp b/src/editor/saveables/soundWrapper.cpp index 78abc13c..d2470302 100644 --- a/src/editor/saveables/soundWrapper.cpp +++ b/src/editor/saveables/soundWrapper.cpp @@ -1,7 +1,9 @@ #include "saveables/soundWrapper.hpp" -#include "raylib.h" + #include +#include "raylib.h" + SoundWrapper::SoundWrapper(const std::string &filePath) { sound = LoadMusicStream(filePath.c_str()); source = filePath; diff --git a/src/editor/screens/welcomeScreen.cpp b/src/editor/screens/welcomeScreen.cpp index 7daeb64c..790a3951 100644 --- a/src/editor/screens/welcomeScreen.cpp +++ b/src/editor/screens/welcomeScreen.cpp @@ -1,4 +1,7 @@ #include "screens/welcomeScreen.hpp" + +#include + #include "TGUI/Layout.hpp" #include "TGUI/String.hpp" #include "TGUI/Widgets/BoxLayout.hpp" @@ -16,22 +19,15 @@ #include "services/editorGuiService.hpp" #include "services/translationService.hpp" #include "widgets/newProjectWindow.hpp" -#include void screens::WelcomeScreen::initItems(tgui::Group::Ptr layout) { auto &ts = Editor::instance->getTranslations(); if (!Editor::instance->getGui().menuBar.expired()) { auto menuBarPtr = Editor::instance->getGui().menuBar.lock(); - menuBarPtr->setMenuItemEnabled( - {ts.getKey("menu.file._label"), ts.getKey("menu.file.save_file")}, - false); - menuBarPtr->setMenuItemEnabled( - {ts.getKey("menu.edit._label"), ts.getKey("menu.edit.undo")}, - false); - menuBarPtr->setMenuItemEnabled( - {ts.getKey("menu.edit._label"), ts.getKey("menu.edit.redo")}, - false); + menuBarPtr->setMenuItemEnabled({ts.getKey("menu.file._label"), ts.getKey("menu.file.save_file")}, false); + menuBarPtr->setMenuItemEnabled({ts.getKey("menu.edit._label"), ts.getKey("menu.edit.undo")}, false); + menuBarPtr->setMenuItemEnabled({ts.getKey("menu.edit._label"), ts.getKey("menu.edit.redo")}, false); } const auto verticalLayout = tgui::GrowVerticalLayout::create(); @@ -43,15 +39,13 @@ void screens::WelcomeScreen::initItems(tgui::Group::Ptr layout) { EditorGuiService::createLogoCenter(verticalLayout); const auto headerLabel = tgui::Label::create(""); - bindTranslation(headerLabel, "screen.starting.get_started", - &tgui::Label::setText); + bindTranslation(headerLabel, "screen.starting.get_started", &tgui::Label::setText); headerLabel->setTextSize(32); headerLabel->setHorizontalAlignment(tgui::HorizontalAlignment::Center); verticalLayout->add(headerLabel); const auto introLabel = tgui::Label::create(""); - bindTranslation(introLabel, "screen.starting.description", - &tgui::Label::setText); + bindTranslation(introLabel, "screen.starting.description", &tgui::Label::setText); introLabel->setTextSize(16); introLabel->setHorizontalAlignment(tgui::HorizontalAlignment::Center); verticalLayout->add(introLabel); @@ -68,27 +62,22 @@ void screens::WelcomeScreen::initItems(tgui::Group::Ptr layout) { const auto actionsLabel = tgui::Label::create(""); actionsLabel->setTextSize(24); left->add(actionsLabel); - bindTranslation(actionsLabel, "screen.starting.actions", - &tgui::Label::setText); + bindTranslation(actionsLabel, "screen.starting.actions", &tgui::Label::setText); const auto newProjButton = tgui::Button::create(); - bindTranslation(newProjButton, "menu.file.new_project", - &tgui::Button::setText); + bindTranslation(newProjButton, "menu.file.new_project", &tgui::Button::setText); newProjButton->setTextSize(ACTION_BUTTON_SIZE); const auto buttonPadding = tgui::BoxLayout::create(); buttonPadding->setHeight(10); const auto openProjButton = tgui::Button::create(); - bindTranslation(openProjButton, "menu.file.open_project", - &tgui::Button::setText); + bindTranslation(openProjButton, "menu.file.open_project", &tgui::Button::setText); openProjButton->setTextSize(ACTION_BUTTON_SIZE); - newProjButton->onPress( - [this] { Editor::instance->getFs().promptNewProject(); }); + newProjButton->onPress([this] { Editor::instance->getFs().promptNewProject(); }); - openProjButton->onPress( - [] { Editor::instance->getFs().promptOpenProject(); }); + openProjButton->onPress([] { Editor::instance->getFs().promptOpenProject(); }); left->add(newProjButton); left->add(buttonPadding); @@ -103,9 +92,7 @@ void screens::WelcomeScreen::initItems(tgui::Group::Ptr layout) { right->setAutoLayout(tgui::AutoLayout::Fill); const auto recentProjectLabel = tgui::Label::create(""); - bindTranslation(recentProjectLabel, - "screen.starting.recent_projects", - &tgui::Label::setText); + bindTranslation(recentProjectLabel, "screen.starting.recent_projects", &tgui::Label::setText); recentProjectLabel->setTextSize(24); recentProjectLabel->setAutoLayout(tgui::AutoLayout::Top); right->add(recentProjectLabel); @@ -113,13 +100,11 @@ void screens::WelcomeScreen::initItems(tgui::Group::Ptr layout) { const auto recentProject = tgui::ListBox::create(); recentProject->setAutoLayout(tgui::AutoLayout::Fill); - for (auto i : - Editor::instance->getRecentProjectService().getRecentProjects()) { + for (auto i : Editor::instance->getRecentProjectService().getRecentProjects()) { recentProject->addItem(i); } - recentProject->onItemSelect( - [this](const tgui::String &path) { Project::openProject(path); }); + recentProject->onItemSelect([this](const tgui::String &path) { Project::openProject(path); }); right->add(recentProject); diff --git a/src/editor/services/configurationService.cpp b/src/editor/services/configurationService.cpp index 4814e781..481355c0 100644 --- a/src/editor/services/configurationService.cpp +++ b/src/editor/services/configurationService.cpp @@ -1,12 +1,14 @@ #include "services/configurationService.hpp" -#include "defaultConfig.hpp" -#include "ini.h" -#include "raylib.h" + #include #include #include #include +#include "defaultConfig.hpp" +#include "ini.h" +#include "raylib.h" + void ConfigurationService::regenerate() { assert(this->iniFile && "iniFile is not initialized"); for (auto &[field, kv] : BASE_CONFIG) { @@ -14,8 +16,7 @@ void ConfigurationService::regenerate() { if (!this->iniStructure.has(field)) { this->iniStructure.set(field, mINI::INIMap()); } - if (this->iniStructure[field].has(k)) - continue; + if (this->iniStructure[field].has(k)) continue; this->iniStructure[field].set(k, v); } } @@ -35,13 +36,11 @@ ConfigurationService::ConfigurationService() { this->regenerate(); }; -mINI::INIMap> -ConfigurationService::getField(const std::string &field) { +mINI::INIMap> ConfigurationService::getField(const std::string &field) { return this->iniStructure[field]; } -std::string ConfigurationService::getStringValue(const std::string &field, - const std::string &key) { +std::string ConfigurationService::getStringValue(const std::string &field, const std::string &key) { return this->iniStructure[field][key]; } @@ -49,16 +48,11 @@ std::string ConfigurationService::getStringValue(const std::string &key) { return this->getStringValue(GENERAL_CONF_FIELD, key); } -void ConfigurationService::setStringValue(const std::string &field, - const std::string &key, - const std::string &value) { +void ConfigurationService::setStringValue(const std::string &field, const std::string &key, const std::string &value) { this->iniStructure[field].set(key, value); } -void ConfigurationService::setStringValue(const std::string &key, - const std::string &value) { +void ConfigurationService::setStringValue(const std::string &key, const std::string &value) { this->setStringValue(GENERAL_CONF_FIELD, key, value); } -void ConfigurationService::saveConfiguration() { - this->iniFile->write(this->iniStructure); -} +void ConfigurationService::saveConfiguration() { this->iniFile->write(this->iniStructure); } diff --git a/src/editor/services/editorGuiService.cpp b/src/editor/services/editorGuiService.cpp index f591cf8f..3298ca9d 100644 --- a/src/editor/services/editorGuiService.cpp +++ b/src/editor/services/editorGuiService.cpp @@ -1,4 +1,12 @@ #include "services/editorGuiService.hpp" + +#include +#include +#include +#include +#include +#include + #include "TGUI/Backend/raylib.hpp" #include "TGUI/Loading/Theme.hpp" #include "TGUI/ObjectConverter.hpp" @@ -13,12 +21,6 @@ #include "services/childWindowSubService.hpp" #include "services/translationService.hpp" #include "updatable.hpp" -#include -#include -#include -#include -#include -#include constexpr int BASE_WINDOW_WIDTH = 800; constexpr int BASE_WINDOW_HEIGHT = 600; @@ -45,12 +47,9 @@ void EditorGuiService::init() { hks.deserialize(cfgs.getField("hotkeys")); this->resetUi(); - hks.registerHotkeyCallback("toggle_debug", - [this]() { perfOverlay.Toggle(); }); - hks.registerHotkeyCallback( - "new_project", [] { Editor::instance->getFs().promptNewProject(); }); - hks.registerHotkeyCallback( - "open_project", [] { Editor::instance->getFs().promptOpenProject(); }); + hks.registerHotkeyCallback("toggle_debug", [this]() { perfOverlay.Toggle(); }); + hks.registerHotkeyCallback("new_project", [] { Editor::instance->getFs().promptNewProject(); }); + hks.registerHotkeyCallback("open_project", [] { Editor::instance->getFs().promptOpenProject(); }); } void EditorGuiService::resetUi() { @@ -97,8 +96,7 @@ void EditorGuiService::uiLoop() { auto const &cg = this->gui; SetTraceLogLevel(LOG_WARNING); - tgui::Theme::addRendererInheritanceParent("NewProjectWindow", - "ChildWindow"); + tgui::Theme::addRendererInheritanceParent("NewProjectWindow", "ChildWindow"); tgui::Theme::addRendererInheritanceParent("RoomToolbox", "Tabs"); // main loop. while (!WindowShouldClose()) { @@ -128,8 +126,7 @@ void EditorGuiService::uiLoop() { leftMouseHeld = true; } else { if (leftMouseHeld) { - currentScreen->leftMouseReleased(GetMouseX(), - GetMouseY() - MENUBAR_H); + currentScreen->leftMouseReleased(GetMouseX(), GetMouseY() - MENUBAR_H); leftMouseHeld = false; } } @@ -137,19 +134,15 @@ void EditorGuiService::uiLoop() { BeginDrawing(); ClearBackground(DARKGRAY); - auto bgProp = tgui::Theme::getDefault()->getGlobalProperty( - "BackgroundColorDisabled"); + auto bgProp = tgui::Theme::getDefault()->getGlobalProperty("BackgroundColorDisabled"); if (bgProp.getType() == tgui::ObjectConverter::Type::None) { - bgProp = - tgui::Theme::getDefault()->getGlobalProperty("BackgroundColor"); + bgProp = tgui::Theme::getDefault()->getGlobalProperty("BackgroundColor"); } auto bgColor = bgProp.getColor(); - auto topGradientColor = static_cast( - abs(sin(GetTime() * GRADIENT_SPEED_MUTLIPLIER)) * - GRADIENT_COLOR_MULTIPLIER); - DrawRectangle( - 0, 0, GetRenderWidth(), GetRenderHeight(), - {bgColor.getRed(), bgColor.getGreen(), bgColor.getBlue(), 255}); + auto topGradientColor = + static_cast(abs(sin(GetTime() * GRADIENT_SPEED_MUTLIPLIER)) * GRADIENT_COLOR_MULTIPLIER); + DrawRectangle(0, 0, GetRenderWidth(), GetRenderHeight(), + {bgColor.getRed(), bgColor.getGreen(), bgColor.getBlue(), 255}); cg->draw(); // Due to many reasons, one time... Thefirey33 decided to talk // to the C++ MSVC Compiler if he can reset the current state of @@ -171,11 +164,8 @@ void EditorGuiService::uiLoop() { gui.reset(); } -void EditorGuiService::setScreen(std::unique_ptr setToScreen, - bool forceSwitch) { - if (this->currentScreen != nullptr && - setToScreen->getNameOfScreen() == - this->currentScreen->getNameOfScreen() && +void EditorGuiService::setScreen(std::unique_ptr setToScreen, bool forceSwitch) { + if (this->currentScreen != nullptr && setToScreen->getNameOfScreen() == this->currentScreen->getNameOfScreen() && !forceSwitch) { return; } @@ -198,22 +188,17 @@ tgui::Group::Ptr EditorGuiService::uiChangePreInit(UIScreen *setToScreen) { screenContainer.lock()->removeAllWidgets(); - if (this->currentScreen != nullptr) - this->currentScreen->unloadScreen(); + if (this->currentScreen != nullptr) this->currentScreen->unloadScreen(); std::string title = "RPG++ Editor - "; title.append(setToScreen->getNameOfScreen()); SetWindowTitle(title.c_str()); return screenContainer.lock(); } -void EditorGuiService::addUpdate(std::shared_ptr widget) { - updatableWidgets.push_back(widget); -} +void EditorGuiService::addUpdate(std::shared_ptr widget) { updatableWidgets.push_back(widget); } void EditorGuiService::setScreen(UIScreen *setToScreen, bool forceSwitch) { - if (this->currentScreen != nullptr && - setToScreen->getNameOfScreen() == - this->currentScreen->getNameOfScreen() && + if (this->currentScreen != nullptr && setToScreen->getNameOfScreen() == this->currentScreen->getNameOfScreen() && !forceSwitch) { return; } @@ -224,12 +209,9 @@ void EditorGuiService::setScreen(UIScreen *setToScreen, bool forceSwitch) { gui->add(group); } -void EditorGuiService::createLogoCenter( - const tgui::GrowVerticalLayout::Ptr &layout) { - +void EditorGuiService::createLogoCenter(const tgui::GrowVerticalLayout::Ptr &layout) { const auto boxLayout = tgui::BoxLayout::create({"100%", 96}); - std::string logoPath = - Editor::instance->getFs().getResourcePath("logo-ups.png"); + std::string logoPath = Editor::instance->getFs().getResourcePath("logo-ups.png"); const auto welcomePic = tgui::Picture::create(logoPath.c_str()); welcomePic->setOrigin({0.5, 0.5}); welcomePic->setPosition({"50%", "50%"}); @@ -247,9 +229,7 @@ void EditorGuiService::reloadUi() { */ } -ChildWindowSubService *EditorGuiService::getChildWindowSubService() { - return this->childWindowService.get(); -} +ChildWindowSubService *EditorGuiService::getChildWindowSubService() { return this->childWindowService.get(); } void EditorGuiService::initMenuBar() { auto menuBarPtr = tgui::MenuBar::create(); @@ -262,14 +242,10 @@ void EditorGuiService::initMenuBar() { menuBarPtr->addMenu(fileT); menuBarPtr->addMenuItem(fileNewProjectT); - menuBarPtr->connectMenuItem({fileT, fileNewProjectT}, [] { - Editor::instance->getFs().promptNewProject(); - }); + menuBarPtr->connectMenuItem({fileT, fileNewProjectT}, [] { Editor::instance->getFs().promptNewProject(); }); menuBarPtr->addMenuItem(fileOpenProjectT); menuBarPtr->addMenuItem(ts.getKey("menu.file.save_file")); - menuBarPtr->connectMenuItem({fileT, fileOpenProjectT}, [] { - Editor::instance->getFs().promptOpenProject(); - }); + menuBarPtr->connectMenuItem({fileT, fileOpenProjectT}, [] { Editor::instance->getFs().promptOpenProject(); }); menuBarPtr->addMenu(ts.getKey("menu.edit._label")); menuBarPtr->addMenuItem(ts.getKey("menu.edit.undo")); @@ -279,26 +255,21 @@ void EditorGuiService::initMenuBar() { const auto editorOptionsTranslation = ts.getKey("menu.options.editor"); menuBarPtr->addMenu(optionsTranslation); menuBarPtr->addMenuItem(editorOptionsTranslation); - menuBarPtr->connectMenuItem( - {optionsTranslation, editorOptionsTranslation}, - [&] { this->childWindowService->openWindow("options"); }); + menuBarPtr->connectMenuItem({optionsTranslation, editorOptionsTranslation}, + [&] { this->childWindowService->openWindow("options"); }); - const auto &aboutOptions = ts.getKey("menu.about._label"), - &aboutRpgpp = ts.getKey("menu.about.rpgpp"); + const auto &aboutOptions = ts.getKey("menu.about._label"), &aboutRpgpp = ts.getKey("menu.about.rpgpp"); menuBarPtr->addMenu(aboutOptions); menuBarPtr->addMenuItem(aboutRpgpp); - menuBarPtr->connectMenuItem({aboutOptions, aboutRpgpp}, [&] { - this->childWindowService->openWindow("about"); - }); + menuBarPtr->connectMenuItem({aboutOptions, aboutRpgpp}, [&] { this->childWindowService->openWindow("about"); }); menuBarPtr->setSize({"100%", MENUBAR_H}); this->gui->add(menuBarPtr); } void EditorGuiService::gotoPreviousScreen() { if (!this->screenHistory.empty()) { - std::unique_ptr lastScreen = - std::move(this->screenHistory.back()); + std::unique_ptr lastScreen = std::move(this->screenHistory.back()); this->screenHistory.pop_back(); auto group = this->uiChangePreInit(lastScreen.get()); @@ -309,9 +280,8 @@ void EditorGuiService::gotoPreviousScreen() { } void EditorGuiService::centerWidget(tgui::Widget::Ptr widget) { - widget->setPosition( - (GetScreenWidth() / 2.0f) - (widget->getSize().x / 2.0f), - (GetScreenHeight() / 2.0f) - (widget->getSize().y / 2.0f)); + widget->setPosition((GetScreenWidth() / 2.0f) - (widget->getSize().x / 2.0f), + (GetScreenHeight() / 2.0f) - (widget->getSize().y / 2.0f)); } void EditorGuiService::alert(tgui::String title, tgui::String content) { diff --git a/src/editor/services/fileSystemService.cpp b/src/editor/services/fileSystemService.cpp index 73d14a13..6d0dd18b 100644 --- a/src/editor/services/fileSystemService.cpp +++ b/src/editor/services/fileSystemService.cpp @@ -1,10 +1,12 @@ #include "services/fileSystemService.hpp" -#include "TGUI/Widgets/FileDialog.hpp" -#include "widgets/newProjectWindow.hpp" + #include #include #include +#include "TGUI/Widgets/FileDialog.hpp" +#include "widgets/newProjectWindow.hpp" + #ifdef __linux__ #include #endif @@ -30,11 +32,10 @@ FileSystemService::FileSystemService() { typeNames[static_cast(EngineFileType::FILE_PROP)] = "Props"; typeNames[static_cast(EngineFileType::FILE_SCRIPT)] = "Scripts"; - typeNames[static_cast(EngineFileType::FILE_EMPTY)] = - "Project Directory"; + typeNames[static_cast(EngineFileType::FILE_EMPTY)] = "Project Directory"; } -void FileSystemService::unload() { } +void FileSystemService::unload() {} void FileSystemService::promptNewProject() { auto newProjectDialog = NewProjectWindow::create(); @@ -42,10 +43,8 @@ void FileSystemService::promptNewProject() { newProjectDialog->init(Editor::instance->getGui().gui.get()); newProjectDialog->fileField->setSelectingDirectory(true); newProjectDialog->confirmButton->onPress([newProjectDialog] { - std::string title = - newProjectDialog->titleField->getText().toStdString(); - std::string dirPath = - newProjectDialog->fileField->getChosenPath().toStdString(); + std::string title = newProjectDialog->titleField->getText().toStdString(); + std::string dirPath = newProjectDialog->fileField->getChosenPath().toStdString(); if (!title.empty() && !dirPath.empty()) { auto path = Project::create(dirPath, title); Project::openProject(path, true); @@ -58,23 +57,16 @@ void FileSystemService::promptOpenProject() { auto files = tgui::FileDialog::create(); files->setFileTypeFilters({{"RPG++ Project", {"*.rpgpp"}}}); - files->onFileSelect( - [](const tgui::String &filePath) { Project::openProject(filePath); }); + files->onFileSelect([](const tgui::String &filePath) { Project::openProject(filePath); }); Editor::instance->getGui().gui->add(files); } -std::string &FileSystemService::getTypeName(EngineFileType fileType) { - return typeNames[static_cast(fileType)]; -} +std::string &FileSystemService::getTypeName(EngineFileType fileType) { return typeNames[static_cast(fileType)]; } -std::array &FileSystemService::getTypeNames() { - return typeNames; -} +std::array &FileSystemService::getTypeNames() { return typeNames; } -const std::string &FileSystemService::getEditorBaseDir() { - return editorBaseDir; -} +const std::string &FileSystemService::getEditorBaseDir() { return editorBaseDir; } std::string FileSystemService::getResourcePath(const std::string &path) { std::filesystem::path result = editorBaseDir; diff --git a/src/editor/services/hotkeyService.cpp b/src/editor/services/hotkeyService.cpp index ff6c4a9c..99e8b198 100644 --- a/src/editor/services/hotkeyService.cpp +++ b/src/editor/services/hotkeyService.cpp @@ -1,8 +1,10 @@ #include "services/hotkeyService.hpp" -#include "raylib.h" + #include #include #include + +#include "raylib.h" HotkeyService::HotkeyService() {} // It's not true UUID, but it will work in this case @@ -18,8 +20,7 @@ std::string get_uuid() { std::string res; for (int i = 0; i < 16; i++) { - if (dash[i]) - res += "-"; + if (dash[i]) res += "-"; res += v[dist(rng)]; res += v[dist(rng)]; } @@ -37,9 +38,8 @@ const int HotkeyService::pack(Hotkey hk) { } const Hotkey HotkeyService::unpack(int packed) { - return Hotkey{(bool)((packed >> 0) & 1), (bool)((packed >> 1) & 1), - (bool)((packed >> 2) & 1), (bool)((packed >> 3) & 1), - static_cast(packed >> 4)}; + return Hotkey{(bool)((packed >> 0) & 1), (bool)((packed >> 1) & 1), (bool)((packed >> 2) & 1), + (bool)((packed >> 3) & 1), static_cast(packed >> 4)}; } std::map HotkeyService::serialize() { @@ -57,53 +57,40 @@ void HotkeyService::write(const std::string &keyId, const std::string &keyStr) { hotkeyMap[keyId] = unpack(k); } -void HotkeyService::deserialize( - const std::map &serialized) { +void HotkeyService::deserialize(const std::map &serialized) { hotkeyMap.clear(); for (auto &[keyId, keyStr] : serialized) { write(keyId, keyStr); } } -void HotkeyService::deserialize( - mINI::INIMap> iniSerialized) { +void HotkeyService::deserialize(mINI::INIMap> iniSerialized) { hotkeyMap.clear(); for (auto &[keyId, keyStr] : iniSerialized) { write(keyId, keyStr); } } -std::string HotkeyService::registerHotkeyCallback(const std::string &keyId, - std::function cb) { +std::string HotkeyService::registerHotkeyCallback(const std::string &keyId, std::function cb) { std::string uniqueHkCbId = get_uuid(); hotkeysCb[uniqueHkCbId] = {keyId, cb}; return uniqueHkCbId; } -void HotkeyService::unregisterHotkeyCallback(const std::string &uniqueHkCbId) { - hotkeysCb.erase(uniqueHkCbId); -} +void HotkeyService::unregisterHotkeyCallback(const std::string &uniqueHkCbId) { hotkeysCb.erase(uniqueHkCbId); } -void HotkeyService::addHotkey(const std::string &keyId, const Hotkey &keys) { - hotkeyMap[keyId] = keys; -} +void HotkeyService::addHotkey(const std::string &keyId, const Hotkey &keys) { hotkeyMap[keyId] = keys; } -void HotkeyService::removeHotkey(const std::string &keyId) { - hotkeyMap.erase(keyId); -} +void HotkeyService::removeHotkey(const std::string &keyId) { hotkeyMap.erase(keyId); } const HotkeyMap HotkeyService::listHotkeys() { return this->hotkeyMap; } void HotkeyService::fire() { for (auto &[keyId, keys] : hotkeyMap) { - if ((keys.ctrl ^ IsKeyDown(KEY_LEFT_CONTROL))) - continue; - if ((keys.shift ^ IsKeyDown(KEY_LEFT_SHIFT))) - continue; - if ((keys.alt ^ IsKeyDown(KEY_LEFT_ALT))) - continue; - if ((keys.super ^ IsKeyDown(KEY_LEFT_SUPER))) - continue; + if ((keys.ctrl ^ IsKeyDown(KEY_LEFT_CONTROL))) continue; + if ((keys.shift ^ IsKeyDown(KEY_LEFT_SHIFT))) continue; + if ((keys.alt ^ IsKeyDown(KEY_LEFT_ALT))) continue; + if ((keys.super ^ IsKeyDown(KEY_LEFT_SUPER))) continue; if (IsKeyDown(keys.key)) { for (auto [_, data] : hotkeysCb) { if (data.first == keyId) { diff --git a/src/editor/services/recentProjectService.cpp b/src/editor/services/recentProjectService.cpp index 2dd2f2e9..898f6420 100644 --- a/src/editor/services/recentProjectService.cpp +++ b/src/editor/services/recentProjectService.cpp @@ -1,10 +1,12 @@ #include "services/recentProjectService.hpp" -#include "raylib.h" + #include #include #include #include +#include "raylib.h" + RecentProjectService::RecentProjectService() { path = GetWorkingDirectory(); path /= RPGPP_RECENT_FILE; @@ -32,11 +34,9 @@ RecentProjectService::RecentProjectService() { } void RecentProjectService::save() { - std::ofstream file(path); if (!file.is_open()) { - std::cerr << "Failed to open recent project file for saving" - << std::endl; + std::cerr << "Failed to open recent project file for saving" << std::endl; return; } @@ -61,6 +61,4 @@ void RecentProjectService::enqueue(const std::string &projectPath) { save(); } -const std::deque &RecentProjectService::getRecentProjects() const { - return recentProjects; -} +const std::deque &RecentProjectService::getRecentProjects() const { return recentProjects; } diff --git a/src/editor/services/translationService.cpp b/src/editor/services/translationService.cpp index d9c34d18..80490c41 100644 --- a/src/editor/services/translationService.cpp +++ b/src/editor/services/translationService.cpp @@ -1,4 +1,5 @@ #include "services/translationService.hpp" + #include #include #include @@ -13,8 +14,7 @@ using json = nlohmann::json; -static void flattenJson(const json &j, - std::map> &out, +static void flattenJson(const json &j, std::map> &out, const std::string &prefix = "") { for (auto it = j.begin(); it != j.end(); ++it) { std::string key = prefix.empty() ? it.key() : prefix + "." + it.key(); @@ -29,31 +29,27 @@ static void flattenJson(const json &j, } void TranslationService::loadTranslation(const std::string &langKey) { - if (translations.find(langKey) != translations.end()) - return; + if (translations.find(langKey) != translations.end()) return; const auto directory_entry = translationFiles.at(langKey); ifstream file(directory_entry.path()); json parsed = json::parse(file); std::map> translated; flattenJson(parsed, translated); - this->translations.try_emplace(langKey, - std::move(translated)); + this->translations.try_emplace(langKey, std::move(translated)); } void TranslationService::unloadTranslation(const std::string &langKey) { - if (langKey == DEFAULT_LANGUAGE) - return; + if (langKey == DEFAULT_LANGUAGE) return; this->translations.erase(langKey); } TranslationService::TranslationService(Editor *editor_ptr) { auto languageInOptions = editor_ptr->getConfiguration().getStringValue("language"); - for (auto const &directory_entry : filesystem::directory_iterator( - editor_ptr->getFs().getResourcePath(TRANSLATION_FILE_LOCATION))) { + for (auto const &directory_entry : + filesystem::directory_iterator(editor_ptr->getFs().getResourcePath(TRANSLATION_FILE_LOCATION))) { // add the translation to the translations map. - if (directory_entry.path().extension() != ".json") - continue; + if (directory_entry.path().extension() != ".json") continue; const std::string langKey = directory_entry.path().stem().string(); auto [it, inserted] = translationFiles.try_emplace(langKey, directory_entry); @@ -67,12 +63,11 @@ TranslationService::TranslationService(Editor *editor_ptr) { } } if (translationFiles.find(languageInOptions) != translationFiles.end()) { - current_language = languageInOptions; - } else { - fprintf(stderr, "WARNING: language '%s' not found, falling back to default.\n", - languageInOptions.c_str()); - current_language = DEFAULT_LANGUAGE; - } + current_language = languageInOptions; + } else { + fprintf(stderr, "WARNING: language '%s' not found, falling back to default.\n", languageInOptions.c_str()); + current_language = DEFAULT_LANGUAGE; + } } void TranslationService::setLanguage(const std::string &language) { @@ -117,15 +112,13 @@ void TranslationService::purgeDeadListeners() { // Otherwise, please use `bindTranslation()` in `bindTranslation.hpp` TranslatedString TranslationService::getKey(const std::string &key) { if (translations.find(getCurrentLanguage()) != translations.end()) { - const auto& gotten_translations = translations[current_language]; + const auto &gotten_translations = translations[current_language]; if (gotten_translations.find(key) != gotten_translations.end()) { TranslatedString s = TranslatedString{gotten_translations.at(key)}; return s; } - TranslatedString s = - TranslatedString{translations[DEFAULT_LANGUAGE][key]}; - printf("TRANSLATION WARNING: %s key doesn't exist for language %s\n", - key.c_str(), current_language.c_str()); + TranslatedString s = TranslatedString{translations[DEFAULT_LANGUAGE][key]}; + printf("TRANSLATION WARNING: %s key doesn't exist for language %s\n", key.c_str(), current_language.c_str()); return s; } else { throw std::out_of_range("translation doesn't exist in translations."); @@ -135,10 +128,7 @@ TranslatedString TranslationService::getKey(const std::string &key) { // NOTE: the whole point of this function, is to retrieve the raw key of a // language file like "en_us", from the "language" key in the JSON. std::string TranslationService::getLanguageIdentifierByKey(const std::string &language_key) { - return std::find_if( - langKeyToName.begin(), langKeyToName.end(), - [&](std::pair entry) { - return entry.second == language_key; - }) + return std::find_if(langKeyToName.begin(), langKeyToName.end(), + [&](std::pair entry) { return entry.second == language_key; }) ->first; } diff --git a/src/editor/timeFormat.cpp b/src/editor/timeFormat.cpp index 76408c3f..77c3b85b 100644 --- a/src/editor/timeFormat.cpp +++ b/src/editor/timeFormat.cpp @@ -1,6 +1,8 @@ #include "timeFormat.hpp" -#include + #include + +#include #include std::string formatTime(float duration) { diff --git a/src/editor/views/actorView.cpp b/src/editor/views/actorView.cpp index ff0fd0ff..99516d15 100644 --- a/src/editor/views/actorView.cpp +++ b/src/editor/views/actorView.cpp @@ -1,4 +1,8 @@ #include "views/actorView.hpp" + +#include +#include + #include "TGUI/Vector2.hpp" #include "actor.hpp" #include "components/resizableCanvasBox.hpp" @@ -7,20 +11,15 @@ #include "raylib.h" #include "tileset.hpp" #include "views/worldView.hpp" -#include -#include constexpr float DELTATIME_DIFFERENCE = 100.0f; -ActorView::ActorView(ActorFileView *actorFileView) - : actorFileView(actorFileView) { +ActorView::ActorView(ActorFileView *actorFileView) : actorFileView(actorFileView) { camera.zoom = 5.0f; cameraMaxZoom = 10.0f; } -ActorView::Ptr ActorView::create(ActorFileView *actorFileView) { - return std::make_shared(actorFileView); -} +ActorView::Ptr ActorView::create(ActorFileView *actorFileView) { return std::make_shared(actorFileView); } ActorView::Ptr ActorView::create(ActorFileView *actorFileView, Actor *actor) { auto ptr = std::make_shared(actorFileView); @@ -31,23 +30,20 @@ ActorView::Ptr ActorView::create(ActorFileView *actorFileView, Actor *actor) { void ActorView::setActor(Actor *actor) { this->actor = actor; - this->collisionBox = std::make_unique( - "collisionRect", this->actor->getCollisionRect(), RED); + this->collisionBox = std::make_unique("collisionRect", this->actor->getCollisionRect(), RED); - this->atlasBox = std::make_unique( - "atlasRect", actor->getCurrentAnimationRectangle(), BLUE, false); + this->atlasBox = + std::make_unique("atlasRect", actor->getCurrentAnimationRectangle(), BLUE, false); actor->resetAnimation(); } void ActorView::mouseMoved(tgui::Vector2f pos) { - if (this->actor == nullptr) - return; + if (this->actor == nullptr) return; const auto &mousePos = getMouseWorldPos(); - collisionBox->mouseMoved(mousePos, RPGPP_DRAW_MULTIPLIER, - RPGPP_DRAW_MULTIPLIER); + collisionBox->mouseMoved(mousePos, RPGPP_DRAW_MULTIPLIER, RPGPP_DRAW_MULTIPLIER); const auto &tileSize = this->actor->getTileSet().getTileSize(); @@ -57,16 +53,13 @@ void ActorView::mouseMoved(tgui::Vector2f pos) { } bool ActorView::leftMousePressed(tgui::Vector2f pos) { - if (this->actor == nullptr) - return false; + if (this->actor == nullptr) return false; const auto &mousePos = getMouseWorldPos(); - if (collisionBox->leftMousePressed(mousePos) && !this->editData) - collisionBox->focused = true; + if (collisionBox->leftMousePressed(mousePos) && !this->editData) collisionBox->focused = true; - if (atlasBox->leftMousePressed(mousePos) && this->editData) - atlasBox->focused = true; + if (atlasBox->leftMousePressed(mousePos) && this->editData) atlasBox->focused = true; return WorldView::leftMousePressed(pos); } @@ -77,8 +70,7 @@ void ActorView::setCollisionRect(const Rectangle &collision) { } void ActorView::leftMouseReleased(tgui::Vector2f pos) { - if (this->actor == nullptr) - return; + if (this->actor == nullptr) return; const auto &mousePos = getMouseWorldPos(); actor->setCollisionRect(collisionBox->leftMouseReleased(mousePos)); @@ -87,8 +79,7 @@ void ActorView::leftMouseReleased(tgui::Vector2f pos) { const auto &tileSize = this->actor->getTileSet().getTileSize(); const auto &rect = atlasBox->leftMouseReleased(mousePos); - this->actor->setAnimationFrame(this->actor->getAnimationDirection(), - this->actor->getCurrentFrame(), + this->actor->setAnimationFrame(this->actor->getAnimationDirection(), this->actor->getCurrentFrame(), {rect.x / tileSize.x, rect.y / tileSize.y}); actorFileView->frameEditor->updateFrameButtons(); @@ -97,12 +88,9 @@ void ActorView::leftMouseReleased(tgui::Vector2f pos) { WorldView::leftMouseReleased(pos); } -void ActorView::setAtlasRect(const Rectangle &rect) { - this->atlasBox->updateRec(rect); -} +void ActorView::setAtlasRect(const Rectangle &rect) { this->atlasBox->updateRec(rect); } void ActorView::drawCanvas() { - if (actor == nullptr || collisionBox == nullptr) { std::cerr << "Importing Error!" << std::endl; return; @@ -110,9 +98,7 @@ void ActorView::drawCanvas() { TileSet &tileSet = actor->getTileSet(); - if (animationCurrentDuration > - animationFrameDuration / DELTATIME_DIFFERENCE && - isPlaying) { + if (animationCurrentDuration > animationFrameDuration / DELTATIME_DIFFERENCE && isPlaying) { actor->update(); animationCurrentDuration = 0.0f; } diff --git a/src/editor/views/fontView.cpp b/src/editor/views/fontView.cpp index dea0395a..401ea45d 100644 --- a/src/editor/views/fontView.cpp +++ b/src/editor/views/fontView.cpp @@ -1,9 +1,11 @@ #include "views/fontView.hpp" -#include "raylib.h" -#include "saveables/fontWrapper.hpp" + #include #include +#include "raylib.h" +#include "saveables/fontWrapper.hpp" + FontView::FontView() {} FontView::Ptr FontView::create() { return std::make_shared(); } diff --git a/src/editor/views/imageView.cpp b/src/editor/views/imageView.cpp index 97ae0900..ae8172c6 100644 --- a/src/editor/views/imageView.cpp +++ b/src/editor/views/imageView.cpp @@ -1,4 +1,5 @@ #include "views/imageView.hpp" + #include "raylib.h" #include "saveables/imageWrapper.hpp" diff --git a/src/editor/views/propView.cpp b/src/editor/views/propView.cpp index cd2009ad..18a53b1b 100644 --- a/src/editor/views/propView.cpp +++ b/src/editor/views/propView.cpp @@ -1,26 +1,26 @@ #include "views/propView.hpp" + +#include + #include "components/resizableCanvasBox.hpp" #include "prop.hpp" #include "raylib.h" #include "views/worldView.hpp" -#include std::string rectTypeToStr(RectType type) { switch (type) { - case ATLAS_RECT: - return "atlasRect"; - case COLLISION_RECT: - return "collisionRect"; - default: - return "unknown"; + case ATLAS_RECT: + return "atlasRect"; + case COLLISION_RECT: + return "collisionRect"; + default: + return "unknown"; } } RectType rectTypeFromStr(const std::string &str) { - if (str == "atlasRect") - return ATLAS_RECT; - if (str == "collisionRect") - return COLLISION_RECT; + if (str == "atlasRect") return ATLAS_RECT; + if (str == "collisionRect") return COLLISION_RECT; return ATLAS_RECT; } @@ -33,8 +33,7 @@ PropView::PropView() { PropView::Ptr PropView::create() { return std::make_shared(); } PropView::Ptr PropView::create(Prop *p) { - if (p == nullptr) - return nullptr; + if (p == nullptr) return nullptr; auto ptr = std::make_shared(); ptr->p = p; ptr->setProp(p); @@ -43,31 +42,24 @@ PropView::Ptr PropView::create(Prop *p) { } void PropView::setProp(Prop *p) { - if (p == nullptr) - return; + if (p == nullptr) return; this->p = p; Rectangle atlasRect = p->getAtlasRect(); Rectangle collisionRect = p->getCollisionRect(); - boxes.push_back(ResizableCanvasBox(rectTypeToStr(RectType::ATLAS_RECT), - atlasRect, BLUE)); - boxes.push_back(ResizableCanvasBox(rectTypeToStr(RectType::COLLISION_RECT), - collisionRect, RED)); + boxes.push_back(ResizableCanvasBox(rectTypeToStr(RectType::ATLAS_RECT), atlasRect, BLUE)); + boxes.push_back(ResizableCanvasBox(rectTypeToStr(RectType::COLLISION_RECT), collisionRect, RED)); } Prop *PropView::getProp() const { return this->p; } void PropView::drawCanvas() { - if (this->p == nullptr) - return; + if (this->p == nullptr) return; ClearBackground(RAYWHITE); Texture2D propTexture = p->getTexture(); - DrawTexturePro( - propTexture, - Rectangle{0, 0, propTexture.width * 1.f, propTexture.height * 1.f}, - Rectangle{0, 0, propTexture.width * 1.f, propTexture.height * 1.f}, - {0, 0}, 0, WHITE); + DrawTexturePro(propTexture, Rectangle{0, 0, propTexture.width * 1.f, propTexture.height * 1.f}, + Rectangle{0, 0, propTexture.width * 1.f, propTexture.height * 1.f}, {0, 0}, 0, WHITE); this->drawOrigin(); @@ -78,13 +70,11 @@ void PropView::drawCanvas() { } void PropView::drawOverlay() { - if (this->p == nullptr) - return; + if (this->p == nullptr) return; } void PropView::mouseMoved(tgui::Vector2f _) { - if (this->p == nullptr) - return; + if (this->p == nullptr) return; Vector2 mousePos = getMouseWorldPos(); for (auto &box : boxes) { box.mouseMoved(mousePos); @@ -93,8 +83,7 @@ void PropView::mouseMoved(tgui::Vector2f _) { } bool PropView::leftMousePressed(tgui::Vector2f _) { - if (this->p == nullptr) - return false; + if (this->p == nullptr) return false; Vector2 mousePos = getMouseWorldPos(); auto focusedIt = boxes.end(); @@ -116,42 +105,37 @@ bool PropView::leftMousePressed(tgui::Vector2f _) { } void PropView::updateAtlasRect(Rectangle r) { - if (this->p == nullptr) - return; + if (this->p == nullptr) return; for (auto &box : boxes) { - if (box.id == rectTypeToStr(RectType::ATLAS_RECT)) - box.updateRec(r); + if (box.id == rectTypeToStr(RectType::ATLAS_RECT)) box.updateRec(r); } p->setAtlasRect(r); } void PropView::updateCollisionRect(Rectangle r) { - if (this->p == nullptr) - return; + if (this->p == nullptr) return; for (auto &box : boxes) { - if (box.id == rectTypeToStr(RectType::COLLISION_RECT)) - box.updateRec(r); + if (box.id == rectTypeToStr(RectType::COLLISION_RECT)) box.updateRec(r); } p->setCollisionRect(r); } void PropView::leftMouseReleased(tgui::Vector2f _) { - if (this->p == nullptr) - return; + if (this->p == nullptr) return; Vector2 mousePos = getMouseWorldPos(); for (auto &box : boxes) { Rectangle newRect = box.leftMouseReleased(mousePos); switch (rectTypeFromStr(box.id)) { - case ATLAS_RECT: - p->setAtlasRect(newRect); - onUpdatedAtlasRect.emit(this, newRect); - break; - case COLLISION_RECT: - p->setCollisionRect(newRect); - onUpdatedCollisionRect.emit(this, newRect); - break; - default: - break; + case ATLAS_RECT: + p->setAtlasRect(newRect); + onUpdatedAtlasRect.emit(this, newRect); + break; + case COLLISION_RECT: + p->setCollisionRect(newRect); + onUpdatedCollisionRect.emit(this, newRect); + break; + default: + break; } } WorldView::leftMouseReleased(_); diff --git a/src/editor/views/tileSetView.cpp b/src/editor/views/tileSetView.cpp index 8359b5e8..12728ab1 100644 --- a/src/editor/views/tileSetView.cpp +++ b/src/editor/views/tileSetView.cpp @@ -1,4 +1,5 @@ #include "views/tileSetView.hpp" + #include "TGUI/Vector2.hpp" #include "gamedata.hpp" #include "raylib.h" @@ -22,17 +23,13 @@ TileSetView::Ptr TileSetView::create(TileSet *tileSet) { return tileSetView; } -void TileSetView::setTileSet(TileSet *newTileSet) { - this->tileSet = newTileSet; -} +void TileSetView::setTileSet(TileSet *newTileSet) { this->tileSet = newTileSet; } TileSet *TileSetView::getTileSet() { return tileSet; } IVector TileSetView::getTileAtMouse() { - return {static_cast((mouseWorldPos.x / (RPGPP_DRAW_MULTIPLIER * - tileSet->getTileWidth()))), - static_cast((mouseWorldPos.y / (RPGPP_DRAW_MULTIPLIER * - tileSet->getTileHeight())))}; + return {static_cast((mouseWorldPos.x / (RPGPP_DRAW_MULTIPLIER * tileSet->getTileWidth()))), + static_cast((mouseWorldPos.y / (RPGPP_DRAW_MULTIPLIER * tileSet->getTileHeight())))}; } IVector TileSetView::getSelectedTile() { return selectedTile; } @@ -46,17 +43,15 @@ void TileSetView::drawOverlay() { const Texture2D &texture = this->tileSet->getTexture(); - Rectangle textureRect = { - 0, 0, static_cast(texture.width * RPGPP_DRAW_MULTIPLIER), - static_cast(texture.height * RPGPP_DRAW_MULTIPLIER)}; + Rectangle textureRect = {0, 0, static_cast(texture.width * RPGPP_DRAW_MULTIPLIER), + static_cast(texture.height * RPGPP_DRAW_MULTIPLIER)}; if (CheckCollisionPointRec(mouseWorldPos, textureRect)) { auto tilePos = getTileAtMouse(); int atlasPosX = tilePos.x; int atlasPosY = tilePos.y; - DrawText(TextFormat("Tile [%i, %i]", atlasPosX, atlasPosY), 8, 8, 32, - BLACK); + DrawText(TextFormat("Tile [%i, %i]", atlasPosX, atlasPosY), 8, 8, 32, BLACK); } } @@ -77,16 +72,13 @@ void TileSetView::drawCanvas() { }; // Draw texture itself - DrawTextureEx(this->tileSet->getTexture(), origin, 0.0f, - RPGPP_DRAW_MULTIPLIER, WHITE); + DrawTextureEx(this->tileSet->getTexture(), origin, 0.0f, RPGPP_DRAW_MULTIPLIER, WHITE); // Draw a grid for (int x = 0; x < atlasSizeInTiles.x; x++) { for (int y = 0; y < atlasSizeInTiles.y; y++) { - Rectangle tileRect = {tileSize.x * x * RPGPP_DRAW_MULTIPLIER, - tileSize.y * y * RPGPP_DRAW_MULTIPLIER, - tileSize.x * RPGPP_DRAW_MULTIPLIER, - tileSize.y * RPGPP_DRAW_MULTIPLIER}; + Rectangle tileRect = {tileSize.x * x * RPGPP_DRAW_MULTIPLIER, tileSize.y * y * RPGPP_DRAW_MULTIPLIER, + tileSize.x * RPGPP_DRAW_MULTIPLIER, tileSize.y * RPGPP_DRAW_MULTIPLIER}; DrawRectangleLinesEx(tileRect, 1.0f, Fade(GRAY, 0.5f)); if (tool != RoomTool::TOOL_NONE) { diff --git a/src/editor/views/worldView.cpp b/src/editor/views/worldView.cpp index eefdb5e6..d50ff46b 100644 --- a/src/editor/views/worldView.cpp +++ b/src/editor/views/worldView.cpp @@ -1,12 +1,5 @@ #include "views/worldView.hpp" -#include "TGUI/Backend/Renderer/Raylib/CanvasRaylib.hpp" -#include "TGUI/Event.hpp" -#include "TGUI/Vector2.hpp" -#include "TGUI/Widget.hpp" -#include "raylib.h" -#include "raymath.h" -#include "updatable.hpp" #include #include #include @@ -14,9 +7,16 @@ #include #include +#include "TGUI/Backend/Renderer/Raylib/CanvasRaylib.hpp" +#include "TGUI/Event.hpp" +#include "TGUI/Vector2.hpp" +#include "TGUI/Widget.hpp" +#include "raylib.h" +#include "raymath.h" +#include "updatable.hpp" + // TODO: Possible memory leak (Load with no Unload visible) -WorldView::WorldView(const char *typeName, bool initRenderer) - : tgui::CanvasRaylib(typeName, initRenderer) { +WorldView::WorldView(const char *typeName, bool initRenderer) : tgui::CanvasRaylib(typeName, initRenderer) { mouseMiddleButton = false; mouseWorldPos = {0, 0}; @@ -44,18 +44,12 @@ WorldView::Ptr WorldView::copy(const ConstPtr &widget) { } } -tgui::Widget::Ptr WorldView::clone() const { - return std::make_shared(*this); -} +tgui::Widget::Ptr WorldView::clone() const { return std::make_shared(*this); } -void WorldView::setSize(const tgui::Layout2d &size) { - tgui::CanvasRaylib::setSize(size); -} +void WorldView::setSize(const tgui::Layout2d &size) { tgui::CanvasRaylib::setSize(size); } bool WorldView::isMouseOnWidget(tgui::Vector2f pos) const { - return tgui::FloatRect{getPosition().x, getPosition().y, getSize().x, - getSize().y} - .contains(pos); + return tgui::FloatRect{getPosition().x, getPosition().y, getSize().x, getSize().y}.contains(pos); } void WorldView::mouseMoved(tgui::Vector2f pos) { @@ -107,9 +101,7 @@ bool WorldView::leftMousePressed(tgui::Vector2f pos) { return tgui::CanvasRaylib::leftMousePressed(pos); } -void WorldView::leftMouseReleased(tgui::Vector2f pos) { - mouseLeftButton = false; -} +void WorldView::leftMouseReleased(tgui::Vector2f pos) { mouseLeftButton = false; } void WorldView::keyPressed(const tgui::Event::KeyEvent &event) { if (event.control && event.code == tgui::Event::KeyboardKey::Z) { @@ -137,20 +129,16 @@ void WorldView::drawCanvas() { ClearBackground(RAYWHITE); } void WorldView::drawOverlay() {} -void WorldView::draw(tgui::BackendRenderTarget &target, - const tgui::RenderStates states) const { - constexpr tgui::Borders borders{ - 2}; // Borders are 2 pixels thick on any side +void WorldView::draw(tgui::BackendRenderTarget &target, const tgui::RenderStates states) const { + constexpr tgui::Borders borders{2}; // Borders are 2 pixels thick on any side CanvasRaylib::draw(target, states); - target.drawBorders(states, borders, getSize(), - tgui::Color::applyOpacity(tgui::Color::Black, 0.5f)); + target.drawBorders(states, borders, getSize(), tgui::Color::applyOpacity(tgui::Color::Black, 0.5f)); } Vector2 WorldView::getMouseWorldPos() { return mouseWorldPos; } -std::shared_ptr -WorldView::asUpdatable(const std::shared_ptr &ptr) { +std::shared_ptr WorldView::asUpdatable(const std::shared_ptr &ptr) { return std::dynamic_pointer_cast(ptr); } @@ -158,7 +146,5 @@ void WorldView::setTool(RoomTool newTool) { this->tool = newTool; } bool WorldView::isInView() { // return isMouseOnWidget({GetMousePosition().x, GetMousePosition().y}); - return CheckCollisionPointRec( - GetMousePosition(), - {getPosition().x, getPosition().y, getSize().x, getSize().y}); + return CheckCollisionPointRec(GetMousePosition(), {getPosition().x, getPosition().y, getSize().x, getSize().y}); } diff --git a/src/editor/widgets/fileChooser.cpp b/src/editor/widgets/fileChooser.cpp index 18df4d09..bfc41e46 100644 --- a/src/editor/widgets/fileChooser.cpp +++ b/src/editor/widgets/fileChooser.cpp @@ -1,4 +1,5 @@ #include "widgets/fileChooser.hpp" + #include "TGUI/String.hpp" #include "TGUI/SubwidgetContainer.hpp" #include "TGUI/Widgets/BitmapButton.hpp" @@ -6,19 +7,14 @@ #include "bindTranslation.hpp" #include "editor.hpp" #include "raylib.h" -FileChooser::FileChooser(const char *typeName, bool initRenderer) - : tgui::SubwidgetContainer(typeName, initRenderer) { - +FileChooser::FileChooser(const char *typeName, bool initRenderer) : tgui::SubwidgetContainer(typeName, initRenderer) { TranslationService &tService = Editor::instance->getTranslations(); chosenPathLabel = tgui::EditBox::create(); - bindTranslation(chosenPathLabel, - "widget.filechooser.select_a_file", - &tgui::EditBox::setText); + bindTranslation(chosenPathLabel, "widget.filechooser.select_a_file", &tgui::EditBox::setText); chosenPathLabel->setReadOnly(true); chosenPathLabel->setEnabled(false); iconButton = tgui::BitmapButton::create(); - auto iconTexture = tgui::Texture( - Editor::instance->getFs().getResourcePath("open_folder.png")); + auto iconTexture = tgui::Texture(Editor::instance->getFs().getResourcePath("open_folder.png")); iconButton->setImageScaling(0.95); iconButton->setImage(iconTexture); @@ -32,8 +28,7 @@ FileChooser::FileChooser(const char *typeName, bool initRenderer) fileDialog->setFileTypeFilters(pathFilters); fileDialog->setSelectingDirectory(selectingDirectory); fileDialog->onFileSelect([this](const tgui::String &path) { - chosenPathLabel->setText( - std::string(GetFileName(path.toStdString().c_str()))); + chosenPathLabel->setText(std::string(GetFileName(path.toStdString().c_str()))); chosenPath = path; }); @@ -46,9 +41,7 @@ FileChooser::FileChooser(const char *typeName, bool initRenderer) updateSize(); } -FileChooser::Ptr FileChooser::create() { - return std::make_shared(); -} +FileChooser::Ptr FileChooser::create() { return std::make_shared(); } FileChooser::Ptr FileChooser::copy(FileChooser::ConstPtr widget) { if (widget) @@ -57,9 +50,7 @@ FileChooser::Ptr FileChooser::copy(FileChooser::ConstPtr widget) { return nullptr; } -tgui::Widget::Ptr FileChooser::clone() const { - return std::make_shared(*this); -} +tgui::Widget::Ptr FileChooser::clone() const { return std::make_shared(*this); } void FileChooser::setSize(const tgui::Layout2d &size) { tgui::SubwidgetContainer::setSize(size); @@ -76,6 +67,4 @@ void FileChooser::updateSize() { tgui::String &FileChooser::getChosenPath() { return chosenPath; } -void FileChooser::setSelectingDirectory(bool selectingDirectory) { - this->selectingDirectory = selectingDirectory; -} +void FileChooser::setSelectingDirectory(bool selectingDirectory) { this->selectingDirectory = selectingDirectory; } diff --git a/src/editor/widgets/fileTab.cpp b/src/editor/widgets/fileTab.cpp index 3b602641..a2ab7c6d 100644 --- a/src/editor/widgets/fileTab.cpp +++ b/src/editor/widgets/fileTab.cpp @@ -1,4 +1,10 @@ #include "widgets/fileTab.hpp" + +#include +#include +#include +#include + #include "TGUI/Color.hpp" #include "TGUI/Loading/Theme.hpp" #include "TGUI/Sprite.hpp" @@ -10,26 +16,18 @@ #include "editor.hpp" #include "fileTabRenderer.hpp" #include "raylib.h" -#include -#include -#include -#include using namespace tgui; -FileTab::FileTab(const char *typeName, bool initRenderer) - : tgui::Tabs(typeName, false) { - m_distanceToSideCached = (std::round( - Text::getLineHeight(m_fontCached, getGlobalTextSize()) * 2.f)); +FileTab::FileTab(const char *typeName, bool initRenderer) : tgui::Tabs(typeName, false) { + m_distanceToSideCached = (std::round(Text::getLineHeight(m_fontCached, getGlobalTextSize()) * 2.f)); if (initRenderer) { m_renderer = aurora::makeCopied(); setRenderer(tgui::Theme::getDefault()->getRendererNoThrow("Tabs")); setTextSize(getGlobalTextSize()); - setTabHeight( - std::round(Text::getLineHeight(m_fontCached, m_textSizeCached) * - 1.25f) + - m_bordersCached.getTopPlusBottom()); + setTabHeight(std::round(Text::getLineHeight(m_fontCached, m_textSizeCached) * 1.25f) + + m_bordersCached.getTopPlusBottom()); } tooltip = Tooltip::create(""); // setToolTip(tooltip); @@ -60,23 +58,19 @@ bool FileTab::leftMousePressed(Vector2f pos) { float tabStart = 0.0f; float tabEnd = m_bordersCached.getLeft() / 2.f; for (std::size_t i = 0; i < m_tabs.size(); ++i) { - if (!m_tabs[i].visible) - continue; + if (!m_tabs[i].visible) continue; // Append the width of the tab - tabEnd += (m_bordersCached.getLeft() / 2.f) + m_tabs[i].width + - (m_bordersCached.getRight() / 2.0f); + tabEnd += (m_bordersCached.getLeft() / 2.f) + m_tabs[i].width + (m_bordersCached.getRight() / 2.0f); // If the mouse went down on this tab then select it - if (pos.x >= tabStart && - pos.x < tabEnd - CLOSE_BUTTON_SIZE - MARGIN_LR) { + if (pos.x >= tabStart && pos.x < tabEnd - CLOSE_BUTTON_SIZE - MARGIN_LR) { select(i); isHoldingMouse = true; startMousePos = pos; draggedTab = i; break; - } else if (pos.x >= tabStart + (m_tabs[i].width - MARGIN_LR - - CLOSE_BUTTON_SIZE) && + } else if (pos.x >= tabStart + (m_tabs[i].width - MARGIN_LR - CLOSE_BUTTON_SIZE) && pos.x < tabEnd - MARGIN_LR) { closeAndOpenNextTab(i); break; @@ -92,8 +86,8 @@ void FileTab::manualMouseMoved(tgui::Vector2f pos) { Tabs::mouseMoved(pos); pos -= getPosition(); deltaMousePos = pos - startMousePos + offsetMousePos; - if (isHoldingMouse and (abs(deltaMousePos.x) >= BUFFER_BEFORE_TAB_MOVE.x or - abs(deltaMousePos.y) >= BUFFER_BEFORE_TAB_MOVE.y)) { + if (isHoldingMouse and + (abs(deltaMousePos.x) >= BUFFER_BEFORE_TAB_MOVE.x or abs(deltaMousePos.y) >= BUFFER_BEFORE_TAB_MOVE.y)) { isDragging = true; } @@ -102,30 +96,22 @@ void FileTab::manualMouseMoved(tgui::Vector2f pos) { if (isDragging) { SetMouseCursor(MOUSE_CURSOR_RESIZE_ALL); cursorModified = true; - if (draggedTab != m_hoveringTab and m_hoveringTab >= 0 and - swappedTab == -1) { + if (draggedTab != m_hoveringTab and m_hoveringTab >= 0 and swappedTab == -1) { // adds the width between the currently hovering tab and the dragged // tab not counting the dragged tab - for (int i = std::min(m_hoveringTab, draggedTab); - i <= std::max(m_hoveringTab, draggedTab); i++) { - if (i == draggedTab) - continue; - offsetMousePos.x -= - m_tabs[i].width * // width of the hovered tab - (deltaMousePos.x / - abs(deltaMousePos.x)); // direction of the drag + for (int i = std::min(m_hoveringTab, draggedTab); i <= std::max(m_hoveringTab, draggedTab); i++) { + if (i == draggedTab) continue; + offsetMousePos.x -= m_tabs[i].width * // width of the hovered tab + (deltaMousePos.x / abs(deltaMousePos.x)); // direction of the drag } - deltaMousePos = pos - startMousePos + - offsetMousePos; // value is updated immediately to - // avoid flickering + deltaMousePos = pos - startMousePos + offsetMousePos; // value is updated immediately to + // avoid flickering swappedTab = draggedTab; if (draggedTab < m_hoveringTab) { - std::rotate(m_tabs.begin() + draggedTab, - m_tabs.begin() + draggedTab + 1, + std::rotate(m_tabs.begin() + draggedTab, m_tabs.begin() + draggedTab + 1, m_tabs.begin() + m_hoveringTab + 1); } else if (draggedTab > m_hoveringTab) { - std::rotate(m_tabs.begin() + m_hoveringTab, - m_tabs.begin() + draggedTab, + std::rotate(m_tabs.begin() + m_hoveringTab, m_tabs.begin() + draggedTab, m_tabs.begin() + draggedTab + 1); } draggedTab = m_hoveringTab; @@ -162,20 +148,17 @@ void FileTab::leftMouseReleased(tgui::Vector2f pos) { } void FileTab::closeCurrentTab() { - if (m_selectedTab == -1) - return; + if (m_selectedTab == -1) return; closeAndOpenNextTab(m_selectedTab); } bool FileTab::select(std::size_t index) { // Don't select a tab that is already selected - if (m_selectedTab == static_cast(index)) - return true; + if (m_selectedTab == static_cast(index)) return true; // If the index is too high or if the tab is invisible or disabled then we // can't select it - if ((index >= m_tabs.size()) || !m_enabled || !m_tabs[index].visible || - !m_tabs[index].enabled) { + if ((index >= m_tabs.size()) || !m_enabled || !m_tabs[index].visible || !m_tabs[index].enabled) { deselect(); return false; } @@ -190,8 +173,7 @@ bool FileTab::select(std::size_t index) { return true; } -size_t FileTab::addFileTab(const std::string &path, - const std::string &fileName) { +size_t FileTab::addFileTab(const std::string &path, const std::string &fileName) { size_t tabIdxToInsert = m_selectedTab; if (tabIdxToInsert == -1) { tabIdxToInsert = 0; @@ -212,29 +194,22 @@ size_t FileTab::addFileTab(const std::string &path, return tabIdxToInsert; } -void FileTab::renderTab(tgui::BackendRenderTarget &target, - tgui::RenderStates &states, int i, bool roundedCorners, - float borderWidth, float usableHeight, - tgui::Sprite &close) const { - if (!m_tabs[i].visible) - return; +void FileTab::renderTab(tgui::BackendRenderTarget &target, tgui::RenderStates &states, int i, bool roundedCorners, + float borderWidth, float usableHeight, tgui::Sprite &close) const { + if (!m_tabs[i].visible) return; RenderStates textStates = states; - if (roundedCorners) - textStates.transform.translate({0, m_bordersCached.getTop()}); + if (roundedCorners) textStates.transform.translate({0, m_bordersCached.getTop()}); tgui::Color backgroundColor; - if ((!m_enabled || !m_tabs[i].enabled) && - m_backgroundColorDisabledCached.isSet()) + if ((!m_enabled || !m_tabs[i].enabled) && m_backgroundColorDisabledCached.isSet()) backgroundColor = m_backgroundColorDisabledCached; else if (m_selectedTab == static_cast(i)) { - if ((m_hoveringTab == static_cast(i)) && - m_selectedBackgroundColorHoverCached.isSet()) + if ((m_hoveringTab == static_cast(i)) && m_selectedBackgroundColorHoverCached.isSet()) backgroundColor = m_selectedBackgroundColorHoverCached; else backgroundColor = m_selectedBackgroundColorCached; - } else if ((m_hoveringTab == static_cast(i)) && - m_backgroundColorHoverCached.isSet()) + } else if ((m_hoveringTab == static_cast(i)) && m_backgroundColorHoverCached.isSet()) backgroundColor = m_backgroundColorHoverCached; else backgroundColor = m_backgroundColorCached; @@ -243,26 +218,22 @@ void FileTab::renderTab(tgui::BackendRenderTarget &target, const Sprite *spriteTab = nullptr; if ((!m_enabled || !m_tabs[i].enabled) && m_spriteDisabledTab.isSet()) spriteTab = &m_spriteDisabledTab; - else if ((m_selectedTab == static_cast(i)) && - m_spriteSelectedTab.isSet()) { - if ((m_hoveringTab == static_cast(i)) && - m_spriteSelectedTabHover.isSet()) + else if ((m_selectedTab == static_cast(i)) && m_spriteSelectedTab.isSet()) { + if ((m_hoveringTab == static_cast(i)) && m_spriteSelectedTabHover.isSet()) spriteTab = &m_spriteSelectedTabHover; else spriteTab = &m_spriteSelectedTab; - } else if ((m_hoveringTab == static_cast(i)) && - m_spriteTabHover.isSet()) + } else if ((m_hoveringTab == static_cast(i)) && m_spriteTabHover.isSet()) spriteTab = &m_spriteTabHover; else if (m_spriteTab.isSet()) spriteTab = &m_spriteTab; if (roundedCorners) { states.transform.translate({-borderWidth, 0}); - target.drawRoundedRectangle( - states, {m_tabs[i].width + (2 * borderWidth), getSize().y}, - tgui::Color::applyOpacity(backgroundColor, m_opacityCached), - m_roundedBorderRadiusCached, m_bordersCached, - tgui::Color::applyOpacity(m_borderColorCached, m_opacityCached)); + target.drawRoundedRectangle(states, {m_tabs[i].width + (2 * borderWidth), getSize().y}, + tgui::Color::applyOpacity(backgroundColor, m_opacityCached), + m_roundedBorderRadiusCached, m_bordersCached, + tgui::Color::applyOpacity(m_borderColorCached, m_opacityCached)); states.transform.translate({m_tabs[i].width + 2 * borderWidth, 0}); } else { if (spriteTab) { @@ -270,25 +241,21 @@ void FileTab::renderTab(tgui::BackendRenderTarget &target, spriteTabCopy.setSize({m_tabs[i].width, usableHeight}); target.drawSprite(states, spriteTabCopy); - } else // No texture was loaded - target.drawFilledRect( - states, {m_tabs[i].width, usableHeight}, - tgui::Color::applyOpacity(backgroundColor, m_opacityCached)); + } else // No texture was loaded + target.drawFilledRect(states, {m_tabs[i].width, usableHeight}, + tgui::Color::applyOpacity(backgroundColor, m_opacityCached)); // draw close button auto tabState = states; tabState.transform.translate( - {m_tabs[i].width - CLOSE_BUTTON_SIZE - MARGIN_LR, - (usableHeight - CLOSE_BUTTON_SIZE) / 2.f}); + {m_tabs[i].width - CLOSE_BUTTON_SIZE - MARGIN_LR, (usableHeight - CLOSE_BUTTON_SIZE) / 2.f}); close.setSize({CLOSE_BUTTON_SIZE, CLOSE_BUTTON_SIZE}); target.drawSprite(tabState, close); // Draw the borders between the tabs if ((borderWidth != 0) && (i < m_tabs.size())) { - target.drawBorders(states, Borders{borderWidth}, - {m_tabs[i].width, usableHeight}, - tgui::Color::applyOpacity(m_borderColorCached, - m_opacityCached)); + target.drawBorders(states, Borders{borderWidth}, {m_tabs[i].width, usableHeight}, + tgui::Color::applyOpacity(m_borderColorCached, m_opacityCached)); // target.drawFilledRect( // states, {borderWidth, usableHeight}, // tgui::Color::applyOpacity(m_borderColorCached, @@ -301,12 +268,10 @@ void FileTab::renderTab(tgui::BackendRenderTarget &target, // Highlight the borders of the selected and hovered tab when requested if (m_bordersCached != Borders{0}) { tgui::Color highlightColor; - if ((m_hoveringTab == static_cast(i)) && - m_borderColorHoverCached.isSet()) + if ((m_hoveringTab == static_cast(i)) && m_borderColorHoverCached.isSet()) highlightColor = m_borderColorHoverCached; if (m_selectedTab == static_cast(i)) { - if ((m_hoveringTab == static_cast(i)) && - m_selectedBorderColorHoverCached.isSet()) + if ((m_hoveringTab == static_cast(i)) && m_selectedBorderColorHoverCached.isSet()) highlightColor = m_selectedBorderColorHoverCached; else if (m_selectedBorderColorCached.isSet()) highlightColor = m_selectedBorderColorCached; @@ -315,36 +280,25 @@ void FileTab::renderTab(tgui::BackendRenderTarget &target, if (highlightColor.isSet()) { float leftBorderWidth = borderWidth; float rightBorderWidth = borderWidth; - if (i == 0) - leftBorderWidth = m_bordersCached.getLeft(); - if (i == m_tabs.size() - 1) - rightBorderWidth = m_bordersCached.getRight(); + if (i == 0) leftBorderWidth = m_bordersCached.getLeft(); + if (i == m_tabs.size() - 1) rightBorderWidth = m_bordersCached.getRight(); if ((m_selectedTab >= 0) && (m_hoveringTab >= 0) && (m_borderColorHoverCached.isSet() && - (m_selectedBorderColorCached.isSet() || - m_selectedBorderColorHoverCached.isSet()))) { - if ((m_selectedTab == static_cast(i - 1)) || - (m_hoveringTab == static_cast(i - 1))) + (m_selectedBorderColorCached.isSet() || m_selectedBorderColorHoverCached.isSet()))) { + if ((m_selectedTab == static_cast(i - 1)) || (m_hoveringTab == static_cast(i - 1))) leftBorderWidth /= 2; - else if ((m_selectedTab == static_cast(i + 1)) || - (m_hoveringTab == static_cast(i + 1))) + else if ((m_selectedTab == static_cast(i + 1)) || (m_hoveringTab == static_cast(i + 1))) rightBorderWidth /= 2; } RenderStates highlightStates = states; - if (i < m_tabs.size() - 1) - highlightStates.transform.translate({-borderWidth, 0}); - highlightStates.transform.translate( - {-m_tabs[i].width - leftBorderWidth, - -m_bordersCached.getTop()}); + if (i < m_tabs.size() - 1) highlightStates.transform.translate({-borderWidth, 0}); + highlightStates.transform.translate({-m_tabs[i].width - leftBorderWidth, -m_bordersCached.getTop()}); target.drawBorders( highlightStates, - {leftBorderWidth, m_bordersCached.getTop(), rightBorderWidth, - m_bordersCached.getBottom()}, - {m_tabs[i].width + leftBorderWidth + rightBorderWidth, - getSize().y}, - highlightColor); + {leftBorderWidth, m_bordersCached.getTop(), rightBorderWidth, m_bordersCached.getBottom()}, + {m_tabs[i].width + leftBorderWidth + rightBorderWidth, getSize().y}, highlightColor); } } @@ -352,30 +306,23 @@ void FileTab::renderTab(tgui::BackendRenderTarget &target, const float usableWidth = m_tabs[i].width - (2 * m_distanceToSideCached); const bool clippingRequired = (m_tabs[i].text.getSize().x > usableWidth); if (clippingRequired) - target.addClippingLayer(textStates, {{m_distanceToSideCached, 0}, - {usableWidth, usableHeight}}); + target.addClippingLayer(textStates, {{m_distanceToSideCached, 0}, {usableWidth, usableHeight}}); // Draw the text - textStates.transform.translate( - {m_distanceToSideCached + - ((usableWidth - m_tabs[i].text.getSize().x) / 2.f), - ((usableHeight - m_tabs[i].text.getSize().y) / 2.f)}); + textStates.transform.translate({m_distanceToSideCached + ((usableWidth - m_tabs[i].text.getSize().x) / 2.f), + ((usableHeight - m_tabs[i].text.getSize().y) / 2.f)}); target.drawText(textStates, m_tabs[i].text); - if (clippingRequired) - target.removeClippingLayer(); + if (clippingRequired) target.removeClippingLayer(); } -void FileTab::draw(tgui::BackendRenderTarget &target, - tgui::RenderStates states) const { - auto closeImagePath = - Editor::instance->getFs().getResourcePath("close.png"); +void FileTab::draw(tgui::BackendRenderTarget &target, tgui::RenderStates states) const { + auto closeImagePath = Editor::instance->getFs().getResourcePath("close.png"); tgui::Texture closeTexture(closeImagePath); Sprite close(closeTexture); const float borderWidth = (m_bordersCached.getLeftPlusRight()) / 2.f; - const bool roundedCorners = - (m_roundedBorderRadiusCached > 0) && !m_spriteTab.isSet(); + const bool roundedCorners = (m_roundedBorderRadiusCached > 0) && !m_spriteTab.isSet(); if (!roundedCorners) { // // Draw the borders around the tabs // if (m_bordersCached != Borders{0}) { @@ -396,31 +343,23 @@ void FileTab::draw(tgui::BackendRenderTarget &target, states.transform.translate({m_tabs[i].width, 0}); continue; } - renderTab(target, states, i, roundedCorners, borderWidth, usableHeight, - close); + renderTab(target, states, i, roundedCorners, borderWidth, usableHeight, close); } if (isDragging) { draggingState.transform.translate({deltaMousePos.x, 0}); - renderTab(target, draggingState, draggedTab, roundedCorners, - borderWidth, usableHeight, close); + renderTab(target, draggingState, draggedTab, roundedCorners, borderWidth, usableHeight, close); draggingState.transform.translate({-deltaMousePos.x, 0}); } } -tgui::Widget::Ptr FileTab::clone() const { - return std::make_shared(*this); -} +tgui::Widget::Ptr FileTab::clone() const { return std::make_shared(*this); } FileTabRenderer *FileTab::getSharedRenderer() { - return aurora::downcast( - tgui::Widget::getSharedRenderer()); + return aurora::downcast(tgui::Widget::getSharedRenderer()); } const FileTabRenderer *FileTab::getSharedRenderer() const { - return aurora::downcast( - tgui::Widget::getSharedRenderer()); + return aurora::downcast(tgui::Widget::getSharedRenderer()); } -FileTabRenderer *FileTab::getRenderer() { - return aurora::downcast(tgui::Widget::getRenderer()); -} +FileTabRenderer *FileTab::getRenderer() { return aurora::downcast(tgui::Widget::getRenderer()); } diff --git a/src/editor/widgets/frameEditor.cpp b/src/editor/widgets/frameEditor.cpp index a9c0f1cf..5deb0f5b 100644 --- a/src/editor/widgets/frameEditor.cpp +++ b/src/editor/widgets/frameEditor.cpp @@ -1,4 +1,8 @@ #include "widgets/frameEditor.hpp" + +#include +#include + #include "TGUI/SubwidgetContainer.hpp" #include "TGUI/Widget.hpp" #include "TGUI/Widgets/Button.hpp" @@ -13,16 +17,12 @@ #include "fileViews/actorFileView.hpp" #include "raylib.h" #include "services/translationService.hpp" -#include -#include constexpr int MAX_TOP_BAR_HEIGHT = 30; constexpr int MAX_ANI_BAR_HEIGHT = 50; -FrameEditor::FrameEditor(ActorFileView *fileView, const char *typeName, - bool initRenderer) - : tgui::ScrollablePanel(typeName, initRenderer), fileView(fileView), - actorView(fileView->getActorView()) {} +FrameEditor::FrameEditor(ActorFileView *fileView, const char *typeName, bool initRenderer) + : tgui::ScrollablePanel(typeName, initRenderer), fileView(fileView), actorView(fileView->getActorView()) {} void FrameEditor::onFrameChange(int currentFrame) {} @@ -41,14 +41,12 @@ void FrameEditor::init() { this->directionChooser = tgui::ComboBox::create(); - bindCustomTranslation( - directionChooser, [](tgui::ComboBox::Ptr box, TranslationService &ts) { - box->removeAllItems(); - for (int i = 0; i <= RPGPP_MAX_DIRECTION; i++) - box->addItem( - ts.getKey(TextFormat("screen.project.actorview.dir%d", i))); - box->setSelectedItemByIndex(0); - }); + bindCustomTranslation(directionChooser, [](tgui::ComboBox::Ptr box, TranslationService &ts) { + box->removeAllItems(); + for (int i = 0; i <= RPGPP_MAX_DIRECTION; i++) + box->addItem(ts.getKey(TextFormat("screen.project.actorview.dir%d", i))); + box->setSelectedItemByIndex(0); + }); directionChooser->onItemSelect.connect([this, &actor](const size_t &index) { this->changeFrameState(index); @@ -57,8 +55,7 @@ void FrameEditor::init() { frameLayout->remove(btn); } frameButtons.clear(); - for (int i = 0; i < actor->getAnimationCount(); i++) - this->addFrameButton(i); + for (int i = 0; i < actor->getAnimationCount(); i++) this->addFrameButton(i); }); topBarLayout->add(directionChooser); @@ -66,8 +63,7 @@ void FrameEditor::init() { playPauseButton = tgui::ToggleButton::create(); bindCustomTranslation( - playPauseButton, - [this](tgui::ToggleButton::Ptr button, TranslationService &ts) { + playPauseButton, [this](tgui::ToggleButton::Ptr button, TranslationService &ts) { if (button->isDown()) { button->setText(ts.getKey("screen.project.actorview.pause")); } else { @@ -75,9 +71,8 @@ void FrameEditor::init() { } button->onToggle.disconnectAll(); button->onToggle.connect([&, button](const bool &checked) { - button->setText( - checked ? ts.getKey("screen.project.actorview.pause") - : ts.getKey("screen.project.actorview.play")); + button->setText(checked ? ts.getKey("screen.project.actorview.pause") + : ts.getKey("screen.project.actorview.play")); actorView->isPlaying = checked; }); }); @@ -85,22 +80,18 @@ void FrameEditor::init() { topBarLayout->add(playPauseButton); auto editingAtlasData = tgui::ToggleButton::create(); - bindTranslation( - editingAtlasData, "screen.project.actorview.edit_anim_data", - &tgui::ToggleButton::setText); + bindTranslation(editingAtlasData, "screen.project.actorview.edit_anim_data", + &tgui::ToggleButton::setText); editingAtlasData->setSize({200, "100%"}); - editingAtlasData->onToggle.connect( - [this](const bool isChecked) { actorView->editData = isChecked; }); + editingAtlasData->onToggle.connect([this](const bool isChecked) { actorView->editData = isChecked; }); topBarLayout->add(editingAtlasData); auto delFrame = tgui::Button::create(); - bindTranslation(delFrame, "screen.project.actorview.delete", - &tgui::Button::setText); + bindTranslation(delFrame, "screen.project.actorview.delete", &tgui::Button::setText); delFrame->onPress.connect([&] { if (actor->getAnimationCount() > 1) { // Remove the last frame button. - actor->removeAnimationFrame(actor->getAnimationDirection(), - actor->getCurrentFrame()); + actor->removeAnimationFrame(actor->getAnimationDirection(), actor->getCurrentFrame()); const auto &lastButton = this->frameButtons.back(); @@ -117,8 +108,7 @@ void FrameEditor::init() { this->frameLayout = tgui::GrowHorizontalLayout::create(); frameLayout->getRenderer()->setSpaceBetweenWidgets(3.0f); - for (int i = 0; i < actor->getAnimationCount(); i++) - this->addFrameButton(i); + for (int i = 0; i < actor->getAnimationCount(); i++) this->addFrameButton(i); auto encaserLayout = tgui::GrowHorizontalLayout::create(); encaserLayout->add(frameLayout); @@ -139,20 +129,15 @@ void FrameEditor::init() { void FrameEditor::addFrameButton(int index) { const auto &actor = actorView->actor; auto frameButton = FrameButton::create(index, actor); - frameButton->onFrameChange.connect( - [&](const int &index) { actor->setAnimationFrame(index); }); + frameButton->onFrameChange.connect([&](const int &index) { actor->setAnimationFrame(index); }); this->frameButtons.push_back(frameButton); this->frameLayout->add(frameButton); } -FrameEditor::Ptr FrameEditor::create(ActorFileView *fileView) { - return std::make_shared(fileView); -} +FrameEditor::Ptr FrameEditor::create(ActorFileView *fileView) { return std::make_shared(fileView); } -tgui::Widget::Ptr FrameEditor::clone() const { - return std::make_shared(*this); -} +tgui::Widget::Ptr FrameEditor::clone() const { return std::make_shared(*this); } void FrameEditor::changeFrameState(int index) { const auto &actor = actorView->actor; diff --git a/src/editor/widgets/hotkeyModifier.cpp b/src/editor/widgets/hotkeyModifier.cpp index 801fa6fc..0f819659 100644 --- a/src/editor/widgets/hotkeyModifier.cpp +++ b/src/editor/widgets/hotkeyModifier.cpp @@ -1,414 +1,415 @@ +#include +#include + #include "TGUI/SubwidgetContainer.hpp" #include "TGUI/Widgets/Button.hpp" #include "bindTranslation.hpp" #include "editor.hpp" #include "raylib.h" #include "services/translationService.hpp" -#include -#include // this is the most unholy shit i've wrote const KeyboardKey tguiToRaylibKey(tguiKey k) { switch (k) { - case tguiKey::A: - return KEY_A; - case tguiKey::B: - return KEY_B; - case tguiKey::C: - return KEY_C; - case tguiKey::D: - return KEY_D; - case tguiKey::E: - return KEY_E; - case tguiKey::F: - return KEY_F; - case tguiKey::G: - return KEY_G; - case tguiKey::H: - return KEY_H; - case tguiKey::I: - return KEY_I; - case tguiKey::J: - return KEY_J; - case tguiKey::K: - return KEY_K; - case tguiKey::L: - return KEY_L; - case tguiKey::M: - return KEY_M; - case tguiKey::N: - return KEY_N; - case tguiKey::O: - return KEY_O; - case tguiKey::P: - return KEY_P; - case tguiKey::Q: - return KEY_Q; - case tguiKey::R: - return KEY_R; - case tguiKey::S: - return KEY_S; - case tguiKey::T: - return KEY_T; - case tguiKey::U: - return KEY_U; - case tguiKey::V: - return KEY_V; - case tguiKey::W: - return KEY_W; - case tguiKey::X: - return KEY_X; - case tguiKey::Y: - return KEY_Y; - case tguiKey::Z: - return KEY_Z; - case tguiKey::Num0: - return KEY_ZERO; - case tguiKey::Num1: - return KEY_ONE; - case tguiKey::Num2: - return KEY_TWO; - case tguiKey::Num3: - return KEY_THREE; - case tguiKey::Num4: - return KEY_FOUR; - case tguiKey::Num5: - return KEY_FIVE; - case tguiKey::Num6: - return KEY_SIX; - case tguiKey::Num7: - return KEY_SEVEN; - case tguiKey::Num8: - return KEY_EIGHT; - case tguiKey::Num9: - return KEY_NINE; - case tguiKey::Escape: - return KEY_ESCAPE; - case tguiKey::LControl: - return KEY_LEFT_CONTROL; - case tguiKey::LShift: - return KEY_LEFT_SHIFT; - case tguiKey::LAlt: - return KEY_LEFT_ALT; - case tguiKey::LSystem: - return KEY_LEFT_SUPER; - case tguiKey::RControl: - return KEY_RIGHT_CONTROL; - case tguiKey::RShift: - return KEY_RIGHT_SHIFT; - case tguiKey::RAlt: - return KEY_RIGHT_ALT; - case tguiKey::RSystem: - return KEY_RIGHT_SUPER; - case tguiKey::Menu: - return KEY_KB_MENU; - case tguiKey::LBracket: - return KEY_LEFT_BRACKET; - case tguiKey::RBracket: - return KEY_RIGHT_BRACKET; - case tguiKey::Semicolon: - return KEY_SEMICOLON; - case tguiKey::Comma: - return KEY_COMMA; - case tguiKey::Period: - return KEY_PERIOD; - case tguiKey::Quote: - return KEY_APOSTROPHE; - case tguiKey::Slash: - return KEY_SLASH; - case tguiKey::Backslash: - return KEY_BACKSLASH; - case tguiKey::Equal: - return KEY_EQUAL; - case tguiKey::Minus: - return KEY_MINUS; - case tguiKey::Space: - return KEY_SPACE; - case tguiKey::Enter: - return KEY_ENTER; - case tguiKey::Backspace: - return KEY_BACKSPACE; - case tguiKey::Tab: - return KEY_TAB; - case tguiKey::PageUp: - return KEY_PAGE_UP; - case tguiKey::PageDown: - return KEY_PAGE_DOWN; - case tguiKey::End: - return KEY_END; - case tguiKey::Home: - return KEY_HOME; - case tguiKey::Insert: - return KEY_INSERT; - case tguiKey::Delete: - return KEY_DELETE; - case tguiKey::Add: - return KEY_KP_ADD; - case tguiKey::Subtract: - return KEY_KP_SUBTRACT; - case tguiKey::Multiply: - return KEY_KP_MULTIPLY; - case tguiKey::Divide: - return KEY_KP_DIVIDE; - case tguiKey::Left: - return KEY_LEFT; - case tguiKey::Right: - return KEY_RIGHT; - case tguiKey::Up: - return KEY_UP; - case tguiKey::Down: - return KEY_DOWN; - case tguiKey::Numpad0: - return KEY_KP_0; - case tguiKey::Numpad1: - return KEY_KP_1; - case tguiKey::Numpad2: - return KEY_KP_2; - case tguiKey::Numpad3: - return KEY_KP_3; - case tguiKey::Numpad4: - return KEY_KP_4; - case tguiKey::Numpad5: - return KEY_KP_5; - case tguiKey::Numpad6: - return KEY_KP_6; - case tguiKey::Numpad7: - return KEY_KP_7; - case tguiKey::Numpad8: - return KEY_KP_8; - case tguiKey::Numpad9: - return KEY_KP_9; - case tguiKey::F1: - return KEY_F1; - case tguiKey::F2: - return KEY_F2; - case tguiKey::F3: - return KEY_F3; - case tguiKey::F4: - return KEY_F4; - case tguiKey::F5: - return KEY_F5; - case tguiKey::F6: - return KEY_F6; - case tguiKey::F7: - return KEY_F7; - case tguiKey::F8: - return KEY_F8; - case tguiKey::F9: - return KEY_F9; - case tguiKey::F10: - return KEY_F10; - case tguiKey::F11: - return KEY_F11; - case tguiKey::F12: - return KEY_F12; - case tguiKey::Tilde: - case tguiKey::F13: - case tguiKey::F14: - case tguiKey::F15: - case tguiKey::Pause: - case tguiKey::Unknown: - return KEY_NULL; + case tguiKey::A: + return KEY_A; + case tguiKey::B: + return KEY_B; + case tguiKey::C: + return KEY_C; + case tguiKey::D: + return KEY_D; + case tguiKey::E: + return KEY_E; + case tguiKey::F: + return KEY_F; + case tguiKey::G: + return KEY_G; + case tguiKey::H: + return KEY_H; + case tguiKey::I: + return KEY_I; + case tguiKey::J: + return KEY_J; + case tguiKey::K: + return KEY_K; + case tguiKey::L: + return KEY_L; + case tguiKey::M: + return KEY_M; + case tguiKey::N: + return KEY_N; + case tguiKey::O: + return KEY_O; + case tguiKey::P: + return KEY_P; + case tguiKey::Q: + return KEY_Q; + case tguiKey::R: + return KEY_R; + case tguiKey::S: + return KEY_S; + case tguiKey::T: + return KEY_T; + case tguiKey::U: + return KEY_U; + case tguiKey::V: + return KEY_V; + case tguiKey::W: + return KEY_W; + case tguiKey::X: + return KEY_X; + case tguiKey::Y: + return KEY_Y; + case tguiKey::Z: + return KEY_Z; + case tguiKey::Num0: + return KEY_ZERO; + case tguiKey::Num1: + return KEY_ONE; + case tguiKey::Num2: + return KEY_TWO; + case tguiKey::Num3: + return KEY_THREE; + case tguiKey::Num4: + return KEY_FOUR; + case tguiKey::Num5: + return KEY_FIVE; + case tguiKey::Num6: + return KEY_SIX; + case tguiKey::Num7: + return KEY_SEVEN; + case tguiKey::Num8: + return KEY_EIGHT; + case tguiKey::Num9: + return KEY_NINE; + case tguiKey::Escape: + return KEY_ESCAPE; + case tguiKey::LControl: + return KEY_LEFT_CONTROL; + case tguiKey::LShift: + return KEY_LEFT_SHIFT; + case tguiKey::LAlt: + return KEY_LEFT_ALT; + case tguiKey::LSystem: + return KEY_LEFT_SUPER; + case tguiKey::RControl: + return KEY_RIGHT_CONTROL; + case tguiKey::RShift: + return KEY_RIGHT_SHIFT; + case tguiKey::RAlt: + return KEY_RIGHT_ALT; + case tguiKey::RSystem: + return KEY_RIGHT_SUPER; + case tguiKey::Menu: + return KEY_KB_MENU; + case tguiKey::LBracket: + return KEY_LEFT_BRACKET; + case tguiKey::RBracket: + return KEY_RIGHT_BRACKET; + case tguiKey::Semicolon: + return KEY_SEMICOLON; + case tguiKey::Comma: + return KEY_COMMA; + case tguiKey::Period: + return KEY_PERIOD; + case tguiKey::Quote: + return KEY_APOSTROPHE; + case tguiKey::Slash: + return KEY_SLASH; + case tguiKey::Backslash: + return KEY_BACKSLASH; + case tguiKey::Equal: + return KEY_EQUAL; + case tguiKey::Minus: + return KEY_MINUS; + case tguiKey::Space: + return KEY_SPACE; + case tguiKey::Enter: + return KEY_ENTER; + case tguiKey::Backspace: + return KEY_BACKSPACE; + case tguiKey::Tab: + return KEY_TAB; + case tguiKey::PageUp: + return KEY_PAGE_UP; + case tguiKey::PageDown: + return KEY_PAGE_DOWN; + case tguiKey::End: + return KEY_END; + case tguiKey::Home: + return KEY_HOME; + case tguiKey::Insert: + return KEY_INSERT; + case tguiKey::Delete: + return KEY_DELETE; + case tguiKey::Add: + return KEY_KP_ADD; + case tguiKey::Subtract: + return KEY_KP_SUBTRACT; + case tguiKey::Multiply: + return KEY_KP_MULTIPLY; + case tguiKey::Divide: + return KEY_KP_DIVIDE; + case tguiKey::Left: + return KEY_LEFT; + case tguiKey::Right: + return KEY_RIGHT; + case tguiKey::Up: + return KEY_UP; + case tguiKey::Down: + return KEY_DOWN; + case tguiKey::Numpad0: + return KEY_KP_0; + case tguiKey::Numpad1: + return KEY_KP_1; + case tguiKey::Numpad2: + return KEY_KP_2; + case tguiKey::Numpad3: + return KEY_KP_3; + case tguiKey::Numpad4: + return KEY_KP_4; + case tguiKey::Numpad5: + return KEY_KP_5; + case tguiKey::Numpad6: + return KEY_KP_6; + case tguiKey::Numpad7: + return KEY_KP_7; + case tguiKey::Numpad8: + return KEY_KP_8; + case tguiKey::Numpad9: + return KEY_KP_9; + case tguiKey::F1: + return KEY_F1; + case tguiKey::F2: + return KEY_F2; + case tguiKey::F3: + return KEY_F3; + case tguiKey::F4: + return KEY_F4; + case tguiKey::F5: + return KEY_F5; + case tguiKey::F6: + return KEY_F6; + case tguiKey::F7: + return KEY_F7; + case tguiKey::F8: + return KEY_F8; + case tguiKey::F9: + return KEY_F9; + case tguiKey::F10: + return KEY_F10; + case tguiKey::F11: + return KEY_F11; + case tguiKey::F12: + return KEY_F12; + case tguiKey::Tilde: + case tguiKey::F13: + case tguiKey::F14: + case tguiKey::F15: + case tguiKey::Pause: + case tguiKey::Unknown: + return KEY_NULL; } return KEY_NULL; } const std::string keyboardKeyToName(KeyboardKey k) { switch (k) { - case KEY_NULL: - return "Unknown"; - case KEY_APOSTROPHE: - return "'"; - case KEY_COMMA: - return ","; - case KEY_MINUS: - return "-"; - case KEY_PERIOD: - return "."; - case KEY_SLASH: - return "/"; - case KEY_ZERO: - return "0"; - case KEY_ONE: - return "1"; - case KEY_TWO: - return "2"; - case KEY_THREE: - return "3"; - case KEY_FOUR: - return "4"; - case KEY_FIVE: - return "5"; - case KEY_SIX: - return "6"; - case KEY_SEVEN: - return "7"; - case KEY_EIGHT: - return "8"; - case KEY_NINE: - return "9"; - case KEY_SEMICOLON: - return ";"; - case KEY_EQUAL: - return "="; - case KEY_A: - return "A"; - case KEY_B: - return "B"; - case KEY_C: - return "C"; - case KEY_D: - return "D"; - case KEY_E: - return "E"; - case KEY_F: - return "F"; - case KEY_G: - return "G"; - case KEY_H: - return "H"; - case KEY_I: - return "I"; - case KEY_J: - return "J"; - case KEY_K: - return "K"; - case KEY_L: - return "L"; - case KEY_M: - return "M"; - case KEY_N: - return "N"; - case KEY_O: - return "O"; - case KEY_P: - return "P"; - case KEY_Q: - return "Q"; - case KEY_R: - return "R"; - case KEY_S: - return "S"; - case KEY_T: - return "T"; - case KEY_U: - return "U"; - case KEY_V: - return "V"; - case KEY_W: - return "W"; - case KEY_X: - return "X"; - case KEY_Y: - return "Y"; - case KEY_Z: - return "Z"; - case KEY_LEFT_BRACKET: - return "["; - case KEY_BACKSLASH: - return "\\"; - case KEY_RIGHT_BRACKET: - return "]"; - case KEY_SPACE: - return "Space"; - case KEY_ESCAPE: - return "Esc"; - case KEY_ENTER: - return "Enter"; - case KEY_TAB: - return "Tab"; - case KEY_BACKSPACE: - return "Backspace"; - case KEY_INSERT: - return "Ins"; - case KEY_DELETE: - return "Del"; - case KEY_RIGHT: - return "Right"; - case KEY_LEFT: - return "Left"; - case KEY_DOWN: - return "Down"; - case KEY_UP: - return "Up"; - case KEY_PAGE_UP: - return "PgUp"; - case KEY_PAGE_DOWN: - return "PgDn"; - case KEY_HOME: - return "Home"; - case KEY_END: - return "End"; - case KEY_F1: - return "F1"; - case KEY_F2: - return "F2"; - case KEY_F3: - return "F3"; - case KEY_F4: - return "F4"; - case KEY_F5: - return "F5"; - case KEY_F6: - return "F6"; - case KEY_F7: - return "F7"; - case KEY_F8: - return "F8"; - case KEY_F9: - return "F9"; - case KEY_F10: - return "F10"; - case KEY_F11: - return "F11"; - case KEY_F12: - return "F12"; - case KEY_LEFT_SHIFT: - return "Shift"; - case KEY_LEFT_CONTROL: - return "Control"; - case KEY_LEFT_ALT: - return "Alt"; - case KEY_LEFT_SUPER: - return "Super"; - case KEY_RIGHT_SHIFT: - return "RightShift"; - case KEY_RIGHT_CONTROL: - return "RightControl"; - case KEY_RIGHT_ALT: - return "RightAlt"; - case KEY_RIGHT_SUPER: - return "RightSuper"; - case KEY_KB_MENU: - return "KBMenu"; - case KEY_KP_0: - return "Keypad0"; - case KEY_KP_1: - return "Keypad1"; - case KEY_KP_2: - return "Keypad2"; - case KEY_KP_3: - return "Keypad3"; - case KEY_KP_4: - return "Keypad4"; - case KEY_KP_5: - return "Keypad5"; - case KEY_KP_6: - return "Keypad6"; - case KEY_KP_7: - return "Keypad7"; - case KEY_KP_8: - return "Keypad8"; - case KEY_KP_9: - return "Keypad9"; - case KEY_KP_DIVIDE: - return "Keypad /"; - case KEY_KP_MULTIPLY: - return "Keypad *"; - case KEY_KP_SUBTRACT: - return "Keypad -"; - case KEY_KP_ADD: - return "Keypad +"; - default: - return "Unknown"; + case KEY_NULL: + return "Unknown"; + case KEY_APOSTROPHE: + return "'"; + case KEY_COMMA: + return ","; + case KEY_MINUS: + return "-"; + case KEY_PERIOD: + return "."; + case KEY_SLASH: + return "/"; + case KEY_ZERO: + return "0"; + case KEY_ONE: + return "1"; + case KEY_TWO: + return "2"; + case KEY_THREE: + return "3"; + case KEY_FOUR: + return "4"; + case KEY_FIVE: + return "5"; + case KEY_SIX: + return "6"; + case KEY_SEVEN: + return "7"; + case KEY_EIGHT: + return "8"; + case KEY_NINE: + return "9"; + case KEY_SEMICOLON: + return ";"; + case KEY_EQUAL: + return "="; + case KEY_A: + return "A"; + case KEY_B: + return "B"; + case KEY_C: + return "C"; + case KEY_D: + return "D"; + case KEY_E: + return "E"; + case KEY_F: + return "F"; + case KEY_G: + return "G"; + case KEY_H: + return "H"; + case KEY_I: + return "I"; + case KEY_J: + return "J"; + case KEY_K: + return "K"; + case KEY_L: + return "L"; + case KEY_M: + return "M"; + case KEY_N: + return "N"; + case KEY_O: + return "O"; + case KEY_P: + return "P"; + case KEY_Q: + return "Q"; + case KEY_R: + return "R"; + case KEY_S: + return "S"; + case KEY_T: + return "T"; + case KEY_U: + return "U"; + case KEY_V: + return "V"; + case KEY_W: + return "W"; + case KEY_X: + return "X"; + case KEY_Y: + return "Y"; + case KEY_Z: + return "Z"; + case KEY_LEFT_BRACKET: + return "["; + case KEY_BACKSLASH: + return "\\"; + case KEY_RIGHT_BRACKET: + return "]"; + case KEY_SPACE: + return "Space"; + case KEY_ESCAPE: + return "Esc"; + case KEY_ENTER: + return "Enter"; + case KEY_TAB: + return "Tab"; + case KEY_BACKSPACE: + return "Backspace"; + case KEY_INSERT: + return "Ins"; + case KEY_DELETE: + return "Del"; + case KEY_RIGHT: + return "Right"; + case KEY_LEFT: + return "Left"; + case KEY_DOWN: + return "Down"; + case KEY_UP: + return "Up"; + case KEY_PAGE_UP: + return "PgUp"; + case KEY_PAGE_DOWN: + return "PgDn"; + case KEY_HOME: + return "Home"; + case KEY_END: + return "End"; + case KEY_F1: + return "F1"; + case KEY_F2: + return "F2"; + case KEY_F3: + return "F3"; + case KEY_F4: + return "F4"; + case KEY_F5: + return "F5"; + case KEY_F6: + return "F6"; + case KEY_F7: + return "F7"; + case KEY_F8: + return "F8"; + case KEY_F9: + return "F9"; + case KEY_F10: + return "F10"; + case KEY_F11: + return "F11"; + case KEY_F12: + return "F12"; + case KEY_LEFT_SHIFT: + return "Shift"; + case KEY_LEFT_CONTROL: + return "Control"; + case KEY_LEFT_ALT: + return "Alt"; + case KEY_LEFT_SUPER: + return "Super"; + case KEY_RIGHT_SHIFT: + return "RightShift"; + case KEY_RIGHT_CONTROL: + return "RightControl"; + case KEY_RIGHT_ALT: + return "RightAlt"; + case KEY_RIGHT_SUPER: + return "RightSuper"; + case KEY_KB_MENU: + return "KBMenu"; + case KEY_KP_0: + return "Keypad0"; + case KEY_KP_1: + return "Keypad1"; + case KEY_KP_2: + return "Keypad2"; + case KEY_KP_3: + return "Keypad3"; + case KEY_KP_4: + return "Keypad4"; + case KEY_KP_5: + return "Keypad5"; + case KEY_KP_6: + return "Keypad6"; + case KEY_KP_7: + return "Keypad7"; + case KEY_KP_8: + return "Keypad8"; + case KEY_KP_9: + return "Keypad9"; + case KEY_KP_DIVIDE: + return "Keypad /"; + case KEY_KP_MULTIPLY: + return "Keypad *"; + case KEY_KP_SUBTRACT: + return "Keypad -"; + case KEY_KP_ADD: + return "Keypad +"; + default: + return "Unknown"; } } @@ -420,16 +421,13 @@ HotkeyModifier::HotkeyModifier(const char *typeName, bool initRenderer) TranslationService &ts = Editor::instance->getTranslations(); if (modifingState == State::DEFAULT) { modifingState = State::START_EDITING; - this->button->setText( - ts.getKey("widget.hotkey_modifier.listening")); + this->button->setText(ts.getKey("widget.hotkey_modifier.listening")); } }); m_container->add(this->button); } -HotkeyModifier::Ptr HotkeyModifier::create() { - return std::make_shared(); -} +HotkeyModifier::Ptr HotkeyModifier::create() { return std::make_shared(); } HotkeyModifier::Ptr HotkeyModifier::copy(HotkeyModifier::ConstPtr widget) { if (widget) @@ -438,15 +436,11 @@ HotkeyModifier::Ptr HotkeyModifier::copy(HotkeyModifier::ConstPtr widget) { return nullptr; } -tgui::Widget::Ptr HotkeyModifier::clone() const { - return std::make_shared(*this); -} +tgui::Widget::Ptr HotkeyModifier::clone() const { return std::make_shared(*this); } -void HotkeyModifier::setKey(const std::string &id, KeyboardKey key, - bool isShift, bool isCtrl, bool isAlt, bool isSuper, +void HotkeyModifier::setKey(const std::string &id, KeyboardKey key, bool isShift, bool isCtrl, bool isAlt, bool isSuper, bool override) { - if (modifingState == State::DEFAULT && !override) - return; + if (modifingState == State::DEFAULT && !override) return; keys.clear(); if (isSuper) { keys.push_back(KEY_LEFT_SUPER); @@ -463,8 +457,7 @@ void HotkeyModifier::setKey(const std::string &id, KeyboardKey key, keys.push_back(key); std::string label{}; for (auto i = keys.begin(); i != keys.end(); ++i) { - if (i != keys.begin()) - label += "+"; + if (i != keys.begin()) label += "+"; label += keyboardKeyToName(*i); } this->button->setText(label); @@ -475,8 +468,7 @@ void HotkeyModifier::setKey(const std::string &id, KeyboardKey key, void HotkeyModifier::keyPressed(const tgui::Event::KeyEvent &event) { tgui::SubwidgetContainer::keyPressed(event); - setKey(this->id, tguiToRaylibKey(event.code), event.shift, event.control, - event.alt, event.system); + setKey(this->id, tguiToRaylibKey(event.code), event.shift, event.control, event.alt, event.system); modifingState = State::DEFAULT; onChange.emit(this, this->id, hk); } diff --git a/src/editor/widgets/newProjectWindow.cpp b/src/editor/widgets/newProjectWindow.cpp index dad97f20..79adf0f3 100644 --- a/src/editor/widgets/newProjectWindow.cpp +++ b/src/editor/widgets/newProjectWindow.cpp @@ -1,4 +1,7 @@ #include "widgets/newProjectWindow.hpp" + +#include + #include "TGUI/String.hpp" #include "TGUI/Widgets/Button.hpp" #include "TGUI/Widgets/ChildWindow.hpp" @@ -10,15 +13,13 @@ #include "editor.hpp" #include "services/translationService.hpp" #include "widgets/fileChooser.hpp" -#include NewProjectWindow::NewProjectWindow(const char *typeName, bool initRenderer) {} void NewProjectWindow::init(tgui::Gui *gui) { TranslationService &tService = Editor::instance->getTranslations(); window = tgui::ChildWindow::create(); - bindTranslation(window, "dialog.new_project.title", - &tgui::ChildWindow::setTitle); + bindTranslation(window, "dialog.new_project.title", &tgui::ChildWindow::setTitle); window->setSize(320, 220); auto panel = tgui::Panel::create(); @@ -29,8 +30,7 @@ void NewProjectWindow::init(tgui::Gui *gui) { panel->add(vertLayout); auto titleLabel = tgui::Label::create(); - bindTranslation(titleLabel, "dialog.new_project.name", - &tgui::Label::setText); + bindTranslation(titleLabel, "dialog.new_project.name", &tgui::Label::setText); vertLayout->add(titleLabel); titleField = tgui::EditBox::create(); @@ -42,8 +42,7 @@ void NewProjectWindow::init(tgui::Gui *gui) { vertLayout->add(gap); fileLabel = tgui::Label::create(); - bindTranslation(fileLabel, "dialog.new_project.folder", - &tgui::Label::setText); + bindTranslation(fileLabel, "dialog.new_project.folder", &tgui::Label::setText); vertLayout->add(fileLabel); fileField = FileChooser::create(); @@ -51,20 +50,16 @@ void NewProjectWindow::init(tgui::Gui *gui) { vertLayout->add(fileField); confirmButton = tgui::Button::create(); - bindTranslation(confirmButton, "dialog.new_project.confirm", - &tgui::Button::setText); + bindTranslation(confirmButton, "dialog.new_project.confirm", &tgui::Button::setText); confirmButton->setSize(BUTTON_W, BUTTON_H); - confirmButton->setPosition(tgui::Layout("100%") - BUTTON_W - PADDING, - tgui::Layout("100%") - BUTTON_H - PADDING); + confirmButton->setPosition(tgui::Layout("100%") - BUTTON_W - PADDING, tgui::Layout("100%") - BUTTON_H - PADDING); window->add(confirmButton); cancelButton = tgui::Button::create(); - bindTranslation(cancelButton, "dialog.new_project.cancel", - &tgui::Button::setText); + bindTranslation(cancelButton, "dialog.new_project.cancel", &tgui::Button::setText); cancelButton->setSize(BUTTON_W, BUTTON_H); - cancelButton->setPosition(tgui::bindLeft(confirmButton) - BUTTON_W - - PADDING, + cancelButton->setPosition(tgui::bindLeft(confirmButton) - BUTTON_W - PADDING, tgui::Layout("100%") - BUTTON_H - PADDING); cancelButton->onPress([this] { window->close(); }); @@ -73,9 +68,7 @@ void NewProjectWindow::init(tgui::Gui *gui) { gui->add(window); } -NewProjectWindow::Ptr NewProjectWindow::create() { - return std::make_shared(); -} +NewProjectWindow::Ptr NewProjectWindow::create() { return std::make_shared(); } NewProjectWindow::Ptr NewProjectWindow::create(const tgui::String &title) { auto ptr = std::make_shared(); @@ -83,20 +76,12 @@ NewProjectWindow::Ptr NewProjectWindow::create(const tgui::String &title) { return ptr; } -void NewProjectWindow::setFieldTitle(const tgui::String &title) { - titleField->setDefaultText(title); -} +void NewProjectWindow::setFieldTitle(const tgui::String &title) { titleField->setDefaultText(title); } -void NewProjectWindow::setFileFieldTitle(const tgui::String &title) { - fileField->chosenPathLabel->setText(title); -} +void NewProjectWindow::setFileFieldTitle(const tgui::String &title) { fileField->chosenPathLabel->setText(title); } -void NewProjectWindow::setPathFilters( - std::vector>> - pathFilters) { +void NewProjectWindow::setPathFilters(std::vector>> pathFilters) { fileField->pathFilters = pathFilters; } -void NewProjectWindow::updateSize(const tgui::Layout2d &size) { - window->setSize(size.x, size.y); -} +void NewProjectWindow::updateSize(const tgui::Layout2d &size) { window->setSize(size.x, size.y); } diff --git a/src/editor/widgets/propertyFields/boolField.cpp b/src/editor/widgets/propertyFields/boolField.cpp index 5b88efa8..729f01ea 100644 --- a/src/editor/widgets/propertyFields/boolField.cpp +++ b/src/editor/widgets/propertyFields/boolField.cpp @@ -1,8 +1,8 @@ #include "widgets/propertyFields/boolField.hpp" + #include "TGUI/Widgets/CheckBox.hpp" #include "widgets/propertyFields/fieldConfig.hpp" -BoolField::BoolField(const char *typeName, bool initRenderer) - : tgui::SubwidgetContainer(typeName, initRenderer) { +BoolField::BoolField(const char *typeName, bool initRenderer) : tgui::SubwidgetContainer(typeName, initRenderer) { label = tgui::Label::create("Label"); label->setHorizontalAlignment(tgui::HorizontalAlignment::Left); label->setVerticalAlignment(tgui::VerticalAlignment::Center); @@ -24,9 +24,7 @@ BoolField::Ptr BoolField::copy(BoolField::ConstPtr widget) { } } -tgui::Widget::Ptr BoolField::clone() const { - return std::make_shared(*this); -} +tgui::Widget::Ptr BoolField::clone() const { return std::make_shared(*this); } void BoolField::setSize(const tgui::Layout2d &size) { tgui::SubwidgetContainer::setSize(size); diff --git a/src/editor/widgets/propertyFields/fileField.cpp b/src/editor/widgets/propertyFields/fileField.cpp index 1c1834ec..4ee2fc09 100644 --- a/src/editor/widgets/propertyFields/fileField.cpp +++ b/src/editor/widgets/propertyFields/fileField.cpp @@ -1,14 +1,15 @@ #include "widgets/propertyFields/fileField.hpp" + +#include +#include + #include "TGUI/String.hpp" #include "TGUI/Widgets/Button.hpp" #include "TGUI/Widgets/FileDialog.hpp" #include "editor.hpp" #include "raylib.h" #include "widgets/propertyFields/fieldConfig.hpp" -#include -#include -FileField::FileField(const char *typeName, bool initRenderer) - : tgui::SubwidgetContainer(typeName, initRenderer) { +FileField::FileField(const char *typeName, bool initRenderer) : tgui::SubwidgetContainer(typeName, initRenderer) { label = tgui::Label::create("Label"); label->setHorizontalAlignment(tgui::HorizontalAlignment::Left); label->setVerticalAlignment(tgui::VerticalAlignment::Center); @@ -19,8 +20,7 @@ FileField::FileField(const char *typeName, bool initRenderer) fileDialog->setPath(Editor::instance->getProject()->getBasePath()); fileDialog->setFileTypeFilters(pathFilters); fileDialog->onFileSelect([this](const tgui::String &path) { - value->setText( - std::string(GetFileName(path.toStdString().c_str()))); + value->setText(std::string(GetFileName(path.toStdString().c_str()))); chosenPath = path; if (callback != nullptr) { callback(path); @@ -38,8 +38,7 @@ FileField::FileField(const char *typeName, bool initRenderer) FileField::Ptr FileField::create() { return std::make_shared(); } -FileField::Ptr FileField::create(const tgui::String &label, - const tgui::String &value) { +FileField::Ptr FileField::create(const tgui::String &label, const tgui::String &value) { auto ptr = std::make_shared(); ptr->label->setText(label); ptr->value->setText(value); @@ -54,9 +53,7 @@ FileField::Ptr FileField::copy(FileField::ConstPtr widget) { } } -tgui::Widget::Ptr FileField::clone() const { - return std::make_shared(*this); -} +tgui::Widget::Ptr FileField::clone() const { return std::make_shared(*this); } void FileField::setValue(const tgui::String &value) { this->value->setText(value); diff --git a/src/editor/widgets/propertyFields/intField.cpp b/src/editor/widgets/propertyFields/intField.cpp index eca75356..bc2fe0ab 100644 --- a/src/editor/widgets/propertyFields/intField.cpp +++ b/src/editor/widgets/propertyFields/intField.cpp @@ -1,11 +1,12 @@ #include "widgets/propertyFields/intField.hpp" + +#include + #include "TGUI/Widget.hpp" #include "TGUI/Widgets/Label.hpp" #include "TGUI/Widgets/SpinControl.hpp" #include "widgets/propertyFields/fieldConfig.hpp" -#include -IntField::IntField(const char *typeName, bool initRenderer) - : tgui::SubwidgetContainer(typeName, initRenderer) { +IntField::IntField(const char *typeName, bool initRenderer) : tgui::SubwidgetContainer(typeName, initRenderer) { label = tgui::Label::create("Label"); label->setHorizontalAlignment(tgui::HorizontalAlignment::Left); label->setVerticalAlignment(tgui::VerticalAlignment::Center); @@ -27,9 +28,7 @@ IntField::Ptr IntField::copy(IntField::ConstPtr widget) { } } -tgui::Widget::Ptr IntField::clone() const { - return std::make_shared(*this); -} +tgui::Widget::Ptr IntField::clone() const { return std::make_shared(*this); } void IntField::setSize(const tgui::Layout2d &size) { tgui::SubwidgetContainer::setSize(size); diff --git a/src/editor/widgets/propertyFields/rectangleField.cpp b/src/editor/widgets/propertyFields/rectangleField.cpp index 892ada80..951331bc 100644 --- a/src/editor/widgets/propertyFields/rectangleField.cpp +++ b/src/editor/widgets/propertyFields/rectangleField.cpp @@ -1,16 +1,18 @@ #include "widgets/propertyFields/rectangleField.hpp" + +#include + #include "TGUI/Layout.hpp" #include "TGUI/Widget.hpp" #include "raylib.h" #include "widgets/propertyFields/fieldConfig.hpp" -#include void setAlign(tgui::Label::Ptr widget) { widget->setHorizontalAlignment(tgui::HorizontalAlignment::Left); widget->setVerticalAlignment(tgui::VerticalAlignment::Center); } -RectangleField::RectangleField(const char *typeName, bool initRenderer) +RectangleField::RectangleField(const char* typeName, bool initRenderer) : tgui::SubwidgetContainer(typeName, initRenderer) { label = tgui::Label::create("Label"); setAlign(label); @@ -33,15 +35,13 @@ RectangleField::RectangleField(const char *typeName, bool initRenderer) setAlign(l_width); value_width = tgui::SpinControl::create(); value_width->setMaximum(INT_MAX); - value_width->onValueChange( - [this](const float& _) { onChange.emit(this, getValue()); }); + value_width->onValueChange([this](const float& _) { onChange.emit(this, getValue()); }); l_height = tgui::Label::create("H"); setAlign(l_height); value_height = tgui::SpinControl::create(); value_height->setMaximum(INT_MAX); - value_height->onValueChange( - [this](const float& _) { onChange.emit(this, getValue()); }); + value_height->onValueChange([this](const float& _) { onChange.emit(this, getValue()); }); m_container->add(label); @@ -66,13 +66,10 @@ void RectangleField::setValue(Rectangle value) { } Rectangle RectangleField::getValue() { - return Rectangle{value_x->getValue(), value_y->getValue(), - value_width->getValue(), value_height->getValue()}; + return Rectangle{value_x->getValue(), value_y->getValue(), value_width->getValue(), value_height->getValue()}; } -RectangleField::Ptr RectangleField::create() { - return std::make_shared(); -} +RectangleField::Ptr RectangleField::create() { return std::make_shared(); } RectangleField::Ptr RectangleField::copy(RectangleField::ConstPtr widget) { if (widget) { @@ -82,11 +79,9 @@ RectangleField::Ptr RectangleField::copy(RectangleField::ConstPtr widget) { } } -tgui::Widget::Ptr RectangleField::clone() const { - return std::make_shared(*this); -} +tgui::Widget::Ptr RectangleField::clone() const { return std::make_shared(*this); } -void RectangleField::setSize(const tgui::Layout2d &size) { +void RectangleField::setSize(const tgui::Layout2d& size) { tgui::SubwidgetContainer::setSize(size); updateSize(); } @@ -108,13 +103,10 @@ void RectangleField::updateSize() { value_y->setSize({fieldW * 0.7, height / 2}); l_width->setPosition({tgui::bindRight(value_y), tgui::bindBottom(label)}); l_width->setSize({fieldW * 0.3, height / 2}); - value_width->setPosition( - {tgui::bindRight(l_width), tgui::bindBottom(label)}); + value_width->setPosition({tgui::bindRight(l_width), tgui::bindBottom(label)}); value_width->setSize({fieldW * 0.7, height / 2}); - l_height->setPosition( - {tgui::bindRight(value_width), tgui::bindBottom(label)}); + l_height->setPosition({tgui::bindRight(value_width), tgui::bindBottom(label)}); l_height->setSize({fieldW * 0.3, height / 2}); - value_height->setPosition( - {tgui::bindRight(l_height), tgui::bindBottom(label)}); + value_height->setPosition({tgui::bindRight(l_height), tgui::bindBottom(label)}); value_height->setSize({fieldW * 0.7, height / 2}); } diff --git a/src/editor/widgets/propertyFields/selectField.cpp b/src/editor/widgets/propertyFields/selectField.cpp index 53535b0f..487c1b19 100644 --- a/src/editor/widgets/propertyFields/selectField.cpp +++ b/src/editor/widgets/propertyFields/selectField.cpp @@ -1,13 +1,14 @@ #include "widgets/propertyFields/selectField.hpp" + +#include + #include "TGUI/Widget.hpp" #include "TGUI/Widgets/ComboBox.hpp" #include "TGUI/Widgets/Group.hpp" #include "TGUI/Widgets/Label.hpp" #include "widgets/propertyFields/fieldConfig.hpp" -#include -SelectField::SelectField(const char *typeName, bool initRenderer) - : tgui::Group(typeName, initRenderer) { +SelectField::SelectField(const char *typeName, bool initRenderer) : tgui::Group(typeName, initRenderer) { label = tgui::Label::create("Label"); label->setHorizontalAlignment(tgui::HorizontalAlignment::Left); label->setVerticalAlignment(tgui::VerticalAlignment::Center); @@ -19,9 +20,7 @@ SelectField::SelectField(const char *typeName, bool initRenderer) updateSize(); } -SelectField::Ptr SelectField::create() { - return std::make_shared(); -} +SelectField::Ptr SelectField::create() { return std::make_shared(); } SelectField::Ptr SelectField::copy(SelectField::ConstPtr widget) { if (widget) { @@ -31,9 +30,7 @@ SelectField::Ptr SelectField::copy(SelectField::ConstPtr widget) { } } -tgui::Widget::Ptr SelectField::clone() const { - return std::make_shared(*this); -} +tgui::Widget::Ptr SelectField::clone() const { return std::make_shared(*this); } void SelectField::setSize(const tgui::Layout2d &size) { tgui::Group::setSize(size); diff --git a/src/editor/widgets/propertyFields/textField.cpp b/src/editor/widgets/propertyFields/textField.cpp index 4e9c66b8..4b150dd8 100644 --- a/src/editor/widgets/propertyFields/textField.cpp +++ b/src/editor/widgets/propertyFields/textField.cpp @@ -1,12 +1,13 @@ #include "widgets/propertyFields/textField.hpp" + +#include +#include + #include "TGUI/Widget.hpp" #include "TGUI/Widgets/Label.hpp" #include "widgets/propertyFields/fieldConfig.hpp" -#include -#include -TextField::TextField(const char *typeName, bool initRenderer) - : tgui::SubwidgetContainer(typeName, initRenderer) { +TextField::TextField(const char *typeName, bool initRenderer) : tgui::SubwidgetContainer(typeName, initRenderer) { label = tgui::Label::create("Label"); label->setHorizontalAlignment(tgui::HorizontalAlignment::Left); label->setVerticalAlignment(tgui::VerticalAlignment::Center); @@ -28,9 +29,7 @@ TextField::Ptr TextField::copy(TextField::ConstPtr widget) { } } -tgui::Widget::Ptr TextField::clone() const { - return std::make_shared(*this); -} +tgui::Widget::Ptr TextField::clone() const { return std::make_shared(*this); } void TextField::setSize(const tgui::Layout2d &size) { tgui::SubwidgetContainer::setSize(size); diff --git a/src/editor/widgets/soundPlayer.cpp b/src/editor/widgets/soundPlayer.cpp index 449b94a3..cb0e781f 100644 --- a/src/editor/widgets/soundPlayer.cpp +++ b/src/editor/widgets/soundPlayer.cpp @@ -1,4 +1,7 @@ #include "widgets/soundPlayer.hpp" + +#include + #include "TGUI/SubwidgetContainer.hpp" #include "TGUI/Texture.hpp" #include "TGUI/Widgets/BitmapButton.hpp" @@ -9,14 +12,10 @@ #include "raylib.h" #include "saveables/soundWrapper.hpp" #include "timeFormat.hpp" -#include -SoundPlayer::SoundPlayer(const char *typeName, bool initRenderer) - : tgui::SubwidgetContainer(typeName, initRenderer) { - playTexture = - tgui::Texture(Editor::instance->getFs().getResourcePath("play.png")); - pauseTexture = - tgui::Texture(Editor::instance->getFs().getResourcePath("pause.png")); +SoundPlayer::SoundPlayer(const char *typeName, bool initRenderer) : tgui::SubwidgetContainer(typeName, initRenderer) { + playTexture = tgui::Texture(Editor::instance->getFs().getResourcePath("play.png")); + pauseTexture = tgui::Texture(Editor::instance->getFs().getResourcePath("pause.png")); panel = tgui::Panel::create(); panel->getRenderer()->setPadding({4, 4}); @@ -88,15 +87,12 @@ void SoundPlayer::setSound(SoundWrapper *sound) { slider->setStep(1.0f); slider->setValue(0.0f); - timeLabel->setText(TextFormat( - "0:00 | %s", formatTime(GetMusicTimeLength(sound->sound)).c_str())); + timeLabel->setText(TextFormat("0:00 | %s", formatTime(GetMusicTimeLength(sound->sound)).c_str())); } SoundWrapper *SoundPlayer::getSound() { return sound; } -SoundPlayer::Ptr SoundPlayer::create() { - return std::make_shared(); -} +SoundPlayer::Ptr SoundPlayer::create() { return std::make_shared(); } SoundPlayer::Ptr SoundPlayer::copy(SoundPlayer::ConstPtr widget) { if (widget) @@ -111,15 +107,12 @@ void SoundPlayer::update() { slider->setValue(GetMusicTimePlayed(sound->sound)); - timeLabel->setText(TextFormat( - "%s | %s", formatTime(GetMusicTimePlayed(sound->sound)).c_str(), - formatTime(GetMusicTimeLength(sound->sound)).c_str())); + timeLabel->setText(TextFormat("%s | %s", formatTime(GetMusicTimePlayed(sound->sound)).c_str(), + formatTime(GetMusicTimeLength(sound->sound)).c_str())); } } -tgui::Widget::Ptr SoundPlayer::clone() const { - return std::make_shared(*this); -} +tgui::Widget::Ptr SoundPlayer::clone() const { return std::make_shared(*this); } void SoundPlayer::setSize(const tgui::Layout2d &size) { tgui::SubwidgetContainer::setSize(size); diff --git a/src/game/main.cpp b/src/game/main.cpp index adca19a4..b1513d88 100644 --- a/src/game/main.cpp +++ b/src/game/main.cpp @@ -1,6 +1,7 @@ -#include "game.hpp" #include +#include "game.hpp" + int main() { const int width = 640; const int height = 480; diff --git a/src/lua/apiTypes.cpp b/src/lua/apiTypes.cpp index ffd978d0..1638cc3e 100644 --- a/src/lua/apiTypes.cpp +++ b/src/lua/apiTypes.cpp @@ -1,4 +1,8 @@ #include "lua/apiTypes.hpp" + +#include +#include + #include "actor.hpp" #include "actorContainer.hpp" #include "collisionsContainer.hpp" @@ -11,13 +15,9 @@ #include "sol/forward.hpp" #include "sol/raii.hpp" #include "tilemap.hpp" -#include -#include -void lua_interactable_setprop(Interactable *inter, sol::object key, - sol::object value) { - if (inter == nullptr) - return; +void lua_interactable_setprop(Interactable *inter, sol::object key, sol::object value) { + if (inter == nullptr) return; auto &props = inter->getProps(); if (!key.is()) { @@ -49,75 +49,53 @@ void lua_interactable_setprop(Interactable *inter, sol::object key, void lua_types_set(sol::state_view lua) { lua.new_usertype( - "Vector2", - sol::factories([]() { return Vector2(); }, - [](float a, float b) { return Vector2{a, b}; }), - "x", &Vector2::x, "y", &Vector2::y); - - lua.new_enum("Direction", "DOWN_IDLE", Direction::RPGPP_DOWN_IDLE, "DOWN", - Direction::RPGPP_DOWN, "UP_IDLE", Direction::RPGPP_UP_IDLE, - "UP", Direction::RPGPP_UP, "LEFT_IDLE", - Direction::RPGPP_LEFT_IDLE, "LEFT", Direction::RPGPP_LEFT, - "RIGHT_IDLE", Direction::RPGPP_RIGHT_IDLE, "RIGHT", - Direction::RPGPP_RIGHT); - - lua.new_usertype( - sol::no_construction(), "Push", &CollisionsContainer::pushObjectVec2, - "Remove", &CollisionsContainer::removeObjectVec2, "Exists", - &CollisionsContainer::objectExistsAtPositionVec2); + "Vector2", sol::factories([]() { return Vector2(); }, [](float a, float b) { return Vector2{a, b}; }), "x", + &Vector2::x, "y", &Vector2::y); + + lua.new_enum("Direction", "DOWN_IDLE", Direction::RPGPP_DOWN_IDLE, "DOWN", Direction::RPGPP_DOWN, "UP_IDLE", + Direction::RPGPP_UP_IDLE, "UP", Direction::RPGPP_UP, "LEFT_IDLE", Direction::RPGPP_LEFT_IDLE, "LEFT", + Direction::RPGPP_LEFT, "RIGHT_IDLE", Direction::RPGPP_RIGHT_IDLE, "RIGHT", Direction::RPGPP_RIGHT); + + lua.new_usertype(sol::no_construction(), "Push", &CollisionsContainer::pushObjectVec2, + "Remove", &CollisionsContainer::removeObjectVec2, "Exists", + &CollisionsContainer::objectExistsAtPositionVec2); lua.new_usertype( - sol::no_construction(), "Push", - &InteractablesContainer::addBinFromTypename, "Remove", - &InteractablesContainer::removeObjectVec2, "Exists", - &InteractablesContainer::objectExistsAtPositionVec2, "GetAt", - &InteractablesContainer::getIntVec2); - - lua.new_usertype( - sol::no_construction(), "SetProp", &lua_interactable_setprop, - "IsOnTouch", &Interactable::isOnTouch, "SetOnTouch", - &Interactable::setOnTouch, "GetPosition", &Interactable::getWorldPos, - "GetType", &Interactable::getType, "SetType", &Interactable::setType); - - lua.new_usertype( - sol::no_construction(), "Push", &PropsContainer::addProp, "Remove", - &PropsContainer::removeObjectVec2, "Exists", - &PropsContainer::objectExistsAtPositionVec2, "GetAt", - &PropsContainer::getPropAt); - - lua.new_usertype( - sol::no_construction(), "GetPosition", &Prop::getWorldPos, - "SetPosition", &Prop::setWorldPos, "GetTilePosition", - &Prop::getWorldTilePos, "SetTilePosition", &Prop::setWorldTilePos, - "GetInteractable", &Prop::getInteractable); - - lua.new_usertype( - sol::no_construction(), "Push", &ActorContainer::addActor, "Remove", - &ActorContainer::removeActor, "Exists", &ActorContainer::actorExists, - "Get", &ActorContainer::getActor); - - lua.new_usertype( - sol::no_construction(), "GetPlayer", &Room::getPlayer, "GetStartTile", - &Room::getStartTile, "GetTileMap", &Room::getTileMap, "GetCollisions", - &Room::getCollisions, "GetInteractables", &Room::getInteractables, - "GetProps", &Room::getProps, "GetActors", &Room::getActors); - - lua.new_usertype(sol::no_construction(), "SetTile", - &TileMap::setTile, "SetEmptyTile", - &TileMap::setEmptyTile, "GetWorldSizeInTiles", - &TileMap::getMaxWorldSize); - - lua.new_usertype( - sol::no_construction(), "GetPosition", &Actor::getPosition, - "SetPosition", &Actor::setPosition, "GetTilePosition", - &Actor::getTilePosition, "SetTilePosition", &Actor::setTilePosition, - "MoveByVelocity", &Actor::moveByVelocity, "ChangeAnimation", - &Actor::changeAnimation, "PlayAnimation", &Actor::playAnimation); - - lua.new_usertype( - sol::no_construction(), "GetPosition", &Player::getPosition, - "SetPosition", &Player::setPosition, "GetTilePosition", - &Player::getTilePosition, "SetTilePosition", &Player::setTilePosition, - "MoveByVelocity", &Player::moveByVelocity, "GetActor", - &Player::getActor); + sol::no_construction(), "Push", &InteractablesContainer::addBinFromTypename, "Remove", + &InteractablesContainer::removeObjectVec2, "Exists", &InteractablesContainer::objectExistsAtPositionVec2, + "GetAt", &InteractablesContainer::getIntVec2); + + lua.new_usertype(sol::no_construction(), "SetProp", &lua_interactable_setprop, "IsOnTouch", + &Interactable::isOnTouch, "SetOnTouch", &Interactable::setOnTouch, "GetPosition", + &Interactable::getWorldPos, "GetType", &Interactable::getType, "SetType", + &Interactable::setType); + + lua.new_usertype(sol::no_construction(), "Push", &PropsContainer::addProp, "Remove", + &PropsContainer::removeObjectVec2, "Exists", + &PropsContainer::objectExistsAtPositionVec2, "GetAt", &PropsContainer::getPropAt); + + lua.new_usertype(sol::no_construction(), "GetPosition", &Prop::getWorldPos, "SetPosition", &Prop::setWorldPos, + "GetTilePosition", &Prop::getWorldTilePos, "SetTilePosition", &Prop::setWorldTilePos, + "GetInteractable", &Prop::getInteractable); + + lua.new_usertype(sol::no_construction(), "Push", &ActorContainer::addActor, "Remove", + &ActorContainer::removeActor, "Exists", &ActorContainer::actorExists, "Get", + &ActorContainer::getActor); + + lua.new_usertype(sol::no_construction(), "GetPlayer", &Room::getPlayer, "GetStartTile", &Room::getStartTile, + "GetTileMap", &Room::getTileMap, "GetCollisions", &Room::getCollisions, "GetInteractables", + &Room::getInteractables, "GetProps", &Room::getProps, "GetActors", &Room::getActors); + + lua.new_usertype(sol::no_construction(), "SetTile", &TileMap::setTile, "SetEmptyTile", + &TileMap::setEmptyTile, "GetWorldSizeInTiles", &TileMap::getMaxWorldSize); + + lua.new_usertype(sol::no_construction(), "GetPosition", &Actor::getPosition, "SetPosition", + &Actor::setPosition, "GetTilePosition", &Actor::getTilePosition, "SetTilePosition", + &Actor::setTilePosition, "MoveByVelocity", &Actor::moveByVelocity, "ChangeAnimation", + &Actor::changeAnimation, "PlayAnimation", &Actor::playAnimation); + + lua.new_usertype(sol::no_construction(), "GetPosition", &Player::getPosition, "SetPosition", + &Player::setPosition, "GetTilePosition", &Player::getTilePosition, "SetTilePosition", + &Player::setTilePosition, "MoveByVelocity", &Player::moveByVelocity, "GetActor", + &Player::getActor); } \ No newline at end of file diff --git a/src/lua/interfaceApi.cpp b/src/lua/interfaceApi.cpp index 317c1b5c..1f6f33a8 100644 --- a/src/lua/interfaceApi.cpp +++ b/src/lua/interfaceApi.cpp @@ -1,4 +1,5 @@ #include "lua/interfaceApi.hpp" + #include "game.hpp" #include "sol/table.hpp" diff --git a/src/lua/soundsApi.cpp b/src/lua/soundsApi.cpp index 9ffa507c..38c879ef 100644 --- a/src/lua/soundsApi.cpp +++ b/src/lua/soundsApi.cpp @@ -1,22 +1,19 @@ #include "lua/soundsApi.hpp" + +#include + #include "game.hpp" #include "soundService.hpp" -#include -void lua_sounds_loadMusic(const std::string &id) { - Game::getSounds().loadMusic(id); -} +void lua_sounds_loadMusic(const std::string &id) { Game::getSounds().loadMusic(id); } void lua_sounds_playMusic() { Game::getSounds().playMusic(); } -void lua_sounds_playSound(const std::string &id) { - Game::getSounds().playSound(id); -} +void lua_sounds_playSound(const std::string &id) { Game::getSounds().playSound(id); } void lua_sounds_set(sol::state_view &lua) { auto space = lua["Sounds"].get_or_create(); - space.set_function("PlaySound", &SoundService::playSound, - Game::getSounds()); + space.set_function("PlaySound", &SoundService::playSound, Game::getSounds()); space.set_function("LoadMusic", lua_sounds_loadMusic); space.set_function("PlayMusic", lua_sounds_playMusic); } \ No newline at end of file diff --git a/src/lua/stateApi.cpp b/src/lua/stateApi.cpp index 09daa7c8..4648b1e5 100644 --- a/src/lua/stateApi.cpp +++ b/src/lua/stateApi.cpp @@ -1,4 +1,5 @@ #include "lua/stateApi.hpp" + #include "game.hpp" #include "sol/forward.hpp" #include "sol/table.hpp" @@ -21,9 +22,7 @@ void lua_gamestate_setval(const std::string &prop, sol::object value) { } } -Value lua_gamestate_getval(const std::string &prop) { - return Game::getState().getProp(prop); -} +Value lua_gamestate_getval(const std::string &prop) { return Game::getState().getProp(prop); } void lua_gamestate_set(sol::state_view lua) { auto space = lua["GameState"].get_or_create(); diff --git a/src/lua/worldApi.cpp b/src/lua/worldApi.cpp index 6f46437b..b0c42292 100644 --- a/src/lua/worldApi.cpp +++ b/src/lua/worldApi.cpp @@ -1,21 +1,16 @@ #include "lua/worldApi.hpp" + #include "game.hpp" #include "sol/forward.hpp" #include "sol/object.hpp" #include "sol/table.hpp" #include "sol/types.hpp" -sol::object lua_world_getroom(sol::this_state lua) { - return sol::make_object(lua, &Game::getWorld().getRoom()); -} +sol::object lua_world_getroom(sol::this_state lua) { return sol::make_object(lua, &Game::getWorld().getRoom()); } -void lua_world_setroom(const std::string &room) { - Game::getWorld().setRoomBin(room); -} +void lua_world_setroom(const std::string &room) { Game::getWorld().setRoomBin(room); } -sol::object lua_world_getplayer(sol::this_state lua) { - return sol::make_object(lua, &Game::getWorld().getPlayer()); -} +sol::object lua_world_getplayer(sol::this_state lua) { return sol::make_object(lua, &Game::getWorld().getPlayer()); } void lua_world_set(sol::state_view lua) { auto space = lua["World"].get_or_create(); diff --git a/src/rpgpplua/rpgpplua.cpp b/src/rpgpplua/rpgpplua.cpp index 8e3c0bc3..c3860970 100644 --- a/src/rpgpplua/rpgpplua.cpp +++ b/src/rpgpplua/rpgpplua.cpp @@ -1,17 +1,17 @@ -#include "game.hpp" -#include "gamedata.hpp" -#include #include + +#include #include #include #include #include +#include "game.hpp" +#include "gamedata.hpp" + void printer() { printf("man\n"); } -void draw_text_lua(const char *text, int posX, int posY, int fontSize) { - DrawText(text, posX, posY, fontSize, BLACK); -} +void draw_text_lua(const char *text, int posX, int posY, int fontSize) { DrawText(text, posX, posY, fontSize, BLACK); } void clear_bg_lua() { ClearBackground(RAYWHITE); } @@ -35,8 +35,7 @@ extern "C" lua.set_function("clear_background", &clear_bg_lua); lua.set_function("draw_text", draw_text_lua); - sol::usertype game_type = - lua.new_usertype("game", sol::constructors()); + sol::usertype game_type = lua.new_usertype("game", sol::constructors()); game_type["init"] = &Game::init; game_type["use_bin"] = &Game::useBin; From c95f63fc2f042b62392bf40e2d877179c0aefac7 Mon Sep 17 00:00:00 2001 From: CDevv Date: Fri, 10 Apr 2026 19:13:44 +0300 Subject: [PATCH 14/69] Basic Interactable file type --- .../editor/fileViews/interactableFileView.hpp | 22 ++++++ include/editor/projectFileVisitor.hpp | 17 +++-- include/editor/services/fileSystemService.hpp | 12 ++-- include/interactable.hpp | 2 + src/editor/fileViews/interactableFileView.cpp | 68 +++++++++++++++++++ src/editor/project.cpp | 6 +- src/editor/projectFileVisitor.cpp | 10 +++ src/editor/services/fileSystemService.cpp | 33 ++++----- src/interactable.cpp | 6 +- 9 files changed, 139 insertions(+), 37 deletions(-) create mode 100644 include/editor/fileViews/interactableFileView.hpp create mode 100644 src/editor/fileViews/interactableFileView.cpp diff --git a/include/editor/fileViews/interactableFileView.hpp b/include/editor/fileViews/interactableFileView.hpp new file mode 100644 index 00000000..c53cfa2e --- /dev/null +++ b/include/editor/fileViews/interactableFileView.hpp @@ -0,0 +1,22 @@ +#ifndef _RPGPP_FILEVIEWS_INTERACTABLEFILEVIEW_H +#define _RPGPP_FILEVIEWS_INTERACTABLEFILEVIEW_H + +#include "fileView.hpp" +#include "variant.hpp" +#include "widgets/propertyFields/boolField.hpp" +#include "widgets/propertyFields/fileField.hpp" +#include "widgets/propertyFields/textField.hpp" + +class InteractableFileView : public FileView { +private: + static const int RIGHT_PANEL_W = 300; + TextField::Ptr nameField; + FileField::Ptr scriptField; + BoolField::Ptr onTouchField; + +public: + InteractableFileView(); + void init(tgui::Group::Ptr layout, VariantWrapper *variant) override; +}; + +#endif \ No newline at end of file diff --git a/include/editor/projectFileVisitor.hpp b/include/editor/projectFileVisitor.hpp index 6dc3d61c..bace4ade 100644 --- a/include/editor/projectFileVisitor.hpp +++ b/include/editor/projectFileVisitor.hpp @@ -1,23 +1,21 @@ #ifndef _RPGPP_PROJECTFILEVISITOR_H #define _RPGPP_PROJECTFILEVISITOR_H -#include "projectFile.hpp" -#include "services/fileSystemService.hpp" #include #include #include #include +#include "projectFile.hpp" +#include "services/fileSystemService.hpp" + class ProjectFileVisitor { - private: - std::array(const std::string &)>, - FILETYPE_MAX> - funcs; +private: + std::array(const std::string &)>, FILETYPE_MAX> funcs; - public: +public: ProjectFileVisitor(); - std::unique_ptr visit(EngineFileType fileType, - const std::string &path); + std::unique_ptr visit(EngineFileType fileType, const std::string &path); static std::unique_ptr emptyView(const std::string &path); static std::unique_ptr tilesetView(const std::string &path); static std::unique_ptr roomView(const std::string &path); @@ -29,6 +27,7 @@ class ProjectFileVisitor { static std::unique_ptr fontView(const std::string &path); static std::unique_ptr soundView(const std::string &path); static std::unique_ptr musicView(const std::string &path); + static std::unique_ptr interactableView(const std::string &path); }; #endif diff --git a/include/editor/services/fileSystemService.hpp b/include/editor/services/fileSystemService.hpp index 458b7624..0268287b 100644 --- a/include/editor/services/fileSystemService.hpp +++ b/include/editor/services/fileSystemService.hpp @@ -1,15 +1,16 @@ #ifndef _RPGPP_FILESYSTEMSERVICE_H #define _RPGPP_FILESYSTEMSERVICE_H -#include "TGUI/String.hpp" -#include "variant.hpp" #include #include #include #include #include -#define FILETYPE_MAX 11 +#include "TGUI/String.hpp" +#include "variant.hpp" + +#define FILETYPE_MAX 12 enum class EngineFileType { FILE_TILESET, @@ -22,15 +23,16 @@ enum class EngineFileType { FILE_SOUND, FILE_MUSIC, FILE_PROP, + FILE_INTERACTABLE, FILE_EMPTY, }; class FileSystemService { - private: +private: std::array typeNames; std::string editorBaseDir; - public: +public: FileSystemService(); void unload(); void promptNewProject(); diff --git a/include/interactable.hpp b/include/interactable.hpp index 81da500d..7d440a01 100644 --- a/include/interactable.hpp +++ b/include/interactable.hpp @@ -70,6 +70,8 @@ class Interactable : public ISaveable { void setProp(std::string key, std::string value); /** Set properties using a nlohmann::json object. */ void setProps(nlohmann::json j); + /** Set the source script file path. */ + void setScriptSourcePath(const std::string &newPath); /** Get source script file. */ const std::string &getScriptSourcePath(); /** Get the properties json object. */ diff --git a/src/editor/fileViews/interactableFileView.cpp b/src/editor/fileViews/interactableFileView.cpp new file mode 100644 index 00000000..2a7b1851 --- /dev/null +++ b/src/editor/fileViews/interactableFileView.cpp @@ -0,0 +1,68 @@ +#include "fileViews/interactableFileView.hpp" + +#include "TGUI/String.hpp" +#include "interactable.hpp" +#include "raylib.h" +#include "widgets/propertiesBox.hpp" +#include "widgets/propertyFields/boolField.hpp" +#include "widgets/propertyFields/textField.hpp" + +InteractableFileView::InteractableFileView() { + auto props = PropertiesBox::create(); + props->setSize({RIGHT_PANEL_W, "100%"}); + props->setPosition({TextFormat("100%% - %d", RIGHT_PANEL_W), 0}); + + nameField = TextField::create(); + nameField->label->setText("Display Name"); + nameField->value->onTextChange([this](const tgui::String &text) { + if (variant != nullptr) { + const auto ptr = dynamic_cast *>(variant); + const auto interactable = ptr->get(); + + interactable->setDisplayTitle(text.toStdString()); + } + }); + props->addTextField(nameField); + + scriptField = FileField::create(); + scriptField->pathFilters = {{"Script", {"*.lua"}}}; + scriptField->label->setText("Script"); + scriptField->callback = [this](const tgui::String &path) { + if (variant != nullptr) { + const auto ptr = dynamic_cast *>(variant); + const auto interactable = ptr->get(); + + interactable->setScriptSourcePath(TextFormat("scripts/%s", GetFileName(path.toStdString().c_str()))); + } + }; + props->addFileField(scriptField); + + onTouchField = BoolField::create(); + onTouchField->label->setText("On Touch?"); + onTouchField->value->onChange([this](bool value) { + if (variant != nullptr) { + const auto ptr = dynamic_cast *>(variant); + const auto interactable = ptr->get(); + + interactable->setOnTouch(value); + } + }); + props->addBooleanField(onTouchField); + + widgetContainer.push_back(props); +} + +void InteractableFileView::init(tgui::Group::Ptr layout, VariantWrapper *variant) { + this->variant = variant; + + if (variant != nullptr) { + const auto ptr = dynamic_cast *>(variant); + const auto interactable = ptr->get(); + + nameField->value->setText(interactable->getDisplayTitle()); + scriptField->value->setText(GetFileName(interactable->getScriptSourcePath().c_str())); + onTouchField->value->setChecked(interactable->isOnTouch()); + + addWidgets(layout); + } +} \ No newline at end of file diff --git a/src/editor/project.cpp b/src/editor/project.cpp index c6afa01f..9c6dc30d 100644 --- a/src/editor/project.cpp +++ b/src/editor/project.cpp @@ -77,9 +77,11 @@ std::string Project::create(const std::string &dirPath, const std::string &title for (int i = 0; i < FILETYPE_MAX; i++) { EngineFileType fileType = static_cast(i); - std::string dirName = TextToLower(Editor::instance->getFs().getTypeName(fileType).c_str()); + if (fileType == EngineFileType::FILE_INTERACTABLE) { + std::string dirName = TextToLower(Editor::instance->getFs().getTypeName(fileType).c_str()); - MakeDirectory(std::filesystem::path(dirPath).append(dirName).u8string().c_str()); + MakeDirectory(std::filesystem::path(dirPath).append(dirName).u8string().c_str()); + } } return filePath.u8string(); diff --git a/src/editor/projectFileVisitor.cpp b/src/editor/projectFileVisitor.cpp index cf607dde..31e93922 100644 --- a/src/editor/projectFileVisitor.cpp +++ b/src/editor/projectFileVisitor.cpp @@ -11,10 +11,12 @@ #include "fileViews/fileView.hpp" #include "fileViews/fontFileView.hpp" #include "fileViews/imageFileView.hpp" +#include "fileViews/interactableFileView.hpp" #include "fileViews/propFileView.hpp" #include "fileViews/roomFileView.hpp" #include "fileViews/soundFileView.hpp" #include "fileViews/tilesetFileView.hpp" +#include "interactable.hpp" #include "projectFile.hpp" #include "room.hpp" #include "saveables/fontWrapper.hpp" @@ -37,6 +39,7 @@ ProjectFileVisitor::ProjectFileVisitor() { funcs[static_cast(EngineFileType::FILE_FONT)] = fontView; funcs[static_cast(EngineFileType::FILE_SOUND)] = soundView; funcs[static_cast(EngineFileType::FILE_MUSIC)] = musicView; + funcs[static_cast(EngineFileType::FILE_INTERACTABLE)] = interactableView; } std::unique_ptr ProjectFileVisitor::visit(EngineFileType fileType, const std::string &path) { @@ -111,3 +114,10 @@ std::unique_ptr ProjectFileVisitor::musicView(const std::string &pa std::unique_ptr variant = std::make_unique>(new SoundWrapper(path)); return std::make_unique(std::move(view), std::move(variant), EngineFileType::FILE_MUSIC, false); } + +std::unique_ptr ProjectFileVisitor::interactableView(const std::string &path) { + std::unique_ptr view = std::make_unique(); + std::unique_ptr variant = std::make_unique>(new Interactable(path)); + auto res = std::make_unique(std::move(view), std::move(variant), EngineFileType::FILE_INTERACTABLE); + return std::move(res); +} diff --git a/src/editor/services/fileSystemService.cpp b/src/editor/services/fileSystemService.cpp index 73d14a13..72c1ce7e 100644 --- a/src/editor/services/fileSystemService.cpp +++ b/src/editor/services/fileSystemService.cpp @@ -1,10 +1,12 @@ #include "services/fileSystemService.hpp" -#include "TGUI/Widgets/FileDialog.hpp" -#include "widgets/newProjectWindow.hpp" + #include #include #include +#include "TGUI/Widgets/FileDialog.hpp" +#include "widgets/newProjectWindow.hpp" + #ifdef __linux__ #include #endif @@ -29,12 +31,12 @@ FileSystemService::FileSystemService() { typeNames[static_cast(EngineFileType::FILE_MUSIC)] = "Music"; typeNames[static_cast(EngineFileType::FILE_PROP)] = "Props"; typeNames[static_cast(EngineFileType::FILE_SCRIPT)] = "Scripts"; + typeNames[static_cast(EngineFileType::FILE_INTERACTABLE)] = "Interactables"; - typeNames[static_cast(EngineFileType::FILE_EMPTY)] = - "Project Directory"; + typeNames[static_cast(EngineFileType::FILE_EMPTY)] = "Project Directory"; } -void FileSystemService::unload() { } +void FileSystemService::unload() {} void FileSystemService::promptNewProject() { auto newProjectDialog = NewProjectWindow::create(); @@ -42,10 +44,8 @@ void FileSystemService::promptNewProject() { newProjectDialog->init(Editor::instance->getGui().gui.get()); newProjectDialog->fileField->setSelectingDirectory(true); newProjectDialog->confirmButton->onPress([newProjectDialog] { - std::string title = - newProjectDialog->titleField->getText().toStdString(); - std::string dirPath = - newProjectDialog->fileField->getChosenPath().toStdString(); + std::string title = newProjectDialog->titleField->getText().toStdString(); + std::string dirPath = newProjectDialog->fileField->getChosenPath().toStdString(); if (!title.empty() && !dirPath.empty()) { auto path = Project::create(dirPath, title); Project::openProject(path, true); @@ -58,23 +58,16 @@ void FileSystemService::promptOpenProject() { auto files = tgui::FileDialog::create(); files->setFileTypeFilters({{"RPG++ Project", {"*.rpgpp"}}}); - files->onFileSelect( - [](const tgui::String &filePath) { Project::openProject(filePath); }); + files->onFileSelect([](const tgui::String &filePath) { Project::openProject(filePath); }); Editor::instance->getGui().gui->add(files); } -std::string &FileSystemService::getTypeName(EngineFileType fileType) { - return typeNames[static_cast(fileType)]; -} +std::string &FileSystemService::getTypeName(EngineFileType fileType) { return typeNames[static_cast(fileType)]; } -std::array &FileSystemService::getTypeNames() { - return typeNames; -} +std::array &FileSystemService::getTypeNames() { return typeNames; } -const std::string &FileSystemService::getEditorBaseDir() { - return editorBaseDir; -} +const std::string &FileSystemService::getEditorBaseDir() { return editorBaseDir; } std::string FileSystemService::getResourcePath(const std::string &path) { std::filesystem::path result = editorBaseDir; diff --git a/src/interactable.cpp b/src/interactable.cpp index f01980dc..2b9cb8d9 100644 --- a/src/interactable.cpp +++ b/src/interactable.cpp @@ -32,7 +32,7 @@ Interactable::Interactable(const std::string &path) { displayTitle = intJson.at("name"); props = std::make_unique(intJson.at("props")); scriptPath = intJson.at("script"); - onTouch = false; + onTouch = intJson.at("onTouch"); } Interactable::Interactable(const std::string &type, Vector2 tilePos, int tileSize) { @@ -70,6 +70,7 @@ json Interactable::dumpJson() { json j = json::object(); j.push_back({"name", displayTitle}); j.push_back({"props", *props}); + j.push_back({"onTouch", onTouch}); j.push_back({"script", scriptPath}); return j; @@ -96,6 +97,8 @@ void Interactable::setProps(nlohmann::json j) { this->props = std::make_unique Date: Sat, 11 Apr 2026 18:06:58 +0300 Subject: [PATCH 15/69] Proper Interactable resource type. --- .../editor/childWindows/editPropWindow.hpp | 24 +++ include/editor/childWindows/newPropWindow.hpp | 17 ++ include/editor/fileInitVisitor.hpp | 1 + .../editor/fileViews/interactableFileView.hpp | 2 + .../editor/services/childWindowSubService.hpp | 1 + include/editor/widgets/propertiesBox.hpp | 11 +- .../widgets/propertyFields/interPropField.hpp | 34 ++++ .../widgets/propertyFields/textField.hpp | 2 + include/interactable.hpp | 6 + src/editor/childWindows/editPropWindow.cpp | 77 ++++++++ src/editor/childWindows/newPropWindow.cpp | 64 +++++++ src/editor/fileInitVisitor.cpp | 36 ++++ src/editor/fileViews/interactableFileView.cpp | 14 ++ src/editor/project.cpp | 58 ++++-- src/editor/roomLayerViewVisitor.cpp | 25 +++ src/editor/services/childWindowSubService.cpp | 18 +- src/editor/widgets/propertiesBox.cpp | 175 +++++++++++++----- .../widgets/propertyFields/interPropField.cpp | 53 ++++++ .../widgets/propertyFields/textField.cpp | 4 +- src/interactable.cpp | 21 +++ 20 files changed, 581 insertions(+), 62 deletions(-) create mode 100644 include/editor/childWindows/editPropWindow.hpp create mode 100644 include/editor/childWindows/newPropWindow.hpp create mode 100644 include/editor/widgets/propertyFields/interPropField.hpp create mode 100644 src/editor/childWindows/editPropWindow.cpp create mode 100644 src/editor/childWindows/newPropWindow.cpp create mode 100644 src/editor/widgets/propertyFields/interPropField.cpp diff --git a/include/editor/childWindows/editPropWindow.hpp b/include/editor/childWindows/editPropWindow.hpp new file mode 100644 index 00000000..3b93aeef --- /dev/null +++ b/include/editor/childWindows/editPropWindow.hpp @@ -0,0 +1,24 @@ +#ifndef _RPGPP_EDITPROPWINDOW_H +#define _RPGPP_EDITPROPWINDOW_H + +#include "TGUI/Widgets/ComboBox.hpp" +#include "TGUI/Widgets/Label.hpp" +#include "childWindows/popupWindow.hpp" +#include "interactable.hpp" +#include "nlohmann/json_fwd.hpp" +#include "widgets/propertiesBox.hpp" + +class EditPropWindow : public PopupWindow { +public: + nlohmann::json *props; + PropertiesBox *box; + Interactable *interactable; + std::string propName; + + tgui::Label::Ptr nameLabel; + tgui::ComboBox::Ptr dropdown; + + EditPropWindow(); +}; + +#endif \ No newline at end of file diff --git a/include/editor/childWindows/newPropWindow.hpp b/include/editor/childWindows/newPropWindow.hpp new file mode 100644 index 00000000..f1ebc12b --- /dev/null +++ b/include/editor/childWindows/newPropWindow.hpp @@ -0,0 +1,17 @@ +#ifndef _RPGPP_NEWPROPWINDOW_H +#define _RPGPP_NEWPROPWINDOW_H + +#include "childWindows/popupWindow.hpp" +#include "interactable.hpp" +#include "nlohmann/json_fwd.hpp" +#include "widgets/propertiesBox.hpp" + +class NewPropWindow : public PopupWindow { +public: + nlohmann::json *props; + PropertiesBox *box; + Interactable *interactable; + NewPropWindow(); +}; + +#endif \ No newline at end of file diff --git a/include/editor/fileInitVisitor.hpp b/include/editor/fileInitVisitor.hpp index 036377aa..c0cad4e5 100644 --- a/include/editor/fileInitVisitor.hpp +++ b/include/editor/fileInitVisitor.hpp @@ -21,6 +21,7 @@ class FileInitVisitor { static void actor(NewFileDialog::Ptr dialog); static void prop(NewFileDialog::Ptr dialog); static void dialogue(NewFileDialog::Ptr dialog); + static void interactable(NewFileDialog::Ptr dialog); }; #endif diff --git a/include/editor/fileViews/interactableFileView.hpp b/include/editor/fileViews/interactableFileView.hpp index c53cfa2e..c0251362 100644 --- a/include/editor/fileViews/interactableFileView.hpp +++ b/include/editor/fileViews/interactableFileView.hpp @@ -3,6 +3,7 @@ #include "fileView.hpp" #include "variant.hpp" +#include "widgets/propertiesBox.hpp" #include "widgets/propertyFields/boolField.hpp" #include "widgets/propertyFields/fileField.hpp" #include "widgets/propertyFields/textField.hpp" @@ -13,6 +14,7 @@ class InteractableFileView : public FileView { TextField::Ptr nameField; FileField::Ptr scriptField; BoolField::Ptr onTouchField; + PropertiesBox::Ptr interProps; public: InteractableFileView(); diff --git a/include/editor/services/childWindowSubService.hpp b/include/editor/services/childWindowSubService.hpp index 86710807..81b4cf8c 100644 --- a/include/editor/services/childWindowSubService.hpp +++ b/include/editor/services/childWindowSubService.hpp @@ -14,6 +14,7 @@ class ChildWindowSubService { void createWindows(); void openWindow(const std::string &windowName); void resetAndOpen(const std::string windowName); + PopupWindow *getWindow(const std::string &windowName); }; #endif /* RPGPP_CHILDWINDOWSERVICE_H */ diff --git a/include/editor/widgets/propertiesBox.hpp b/include/editor/widgets/propertiesBox.hpp index 50ab84c7..d0bb9f16 100644 --- a/include/editor/widgets/propertiesBox.hpp +++ b/include/editor/widgets/propertiesBox.hpp @@ -6,11 +6,14 @@ #include "TGUI/String.hpp" #include "TGUI/Widget.hpp" +#include "TGUI/Widgets/Button.hpp" #include "TGUI/Widgets/ChildWindow.hpp" #include "TGUI/Widgets/GrowVerticalLayout.hpp" +#include "interactable.hpp" #include "widgets/propertyFields/boolField.hpp" #include "widgets/propertyFields/fileField.hpp" #include "widgets/propertyFields/intField.hpp" +#include "widgets/propertyFields/interPropField.hpp" #include "widgets/propertyFields/rectangleField.hpp" #include "widgets/propertyFields/selectField.hpp" #include "widgets/propertyFields/textField.hpp" @@ -19,6 +22,7 @@ class PropertiesBox : public tgui::ChildWindow { protected: static const int GAP = 4; + tgui::Button::Ptr newPropButton; tgui::GrowVerticalLayout::Ptr layout; tgui::Widget::Ptr clone() const override; @@ -26,6 +30,8 @@ class PropertiesBox : public tgui::ChildWindow { typedef std::shared_ptr Ptr; typedef std::shared_ptr ConstPtr; + Interactable *interactable = nullptr; + PropertiesBox(const char *typeName = "PropertiesBox", bool initRenderer = true); static PropertiesBox::Ptr create(); @@ -33,8 +39,7 @@ class PropertiesBox : public tgui::ChildWindow { void draw(tgui::BackendRenderTarget &target, tgui::RenderStates states) const override; - void addPropsJson(nlohmann::json &j, bool clear = true); - // void addToggleField(const tgui::String &title); + void addPropsJson(nlohmann::json &j, bool clear = true, bool editable = false); void addIntField(const tgui::String &title, int initialValue, std::function callback); void addIntField(IntField::Ptr field); void addFileField(FileField::Ptr field); @@ -43,6 +48,8 @@ class PropertiesBox : public tgui::ChildWindow { void addRectangleField(RectangleField::Ptr field); void addSelectField(SelectField::Ptr field); void addButton(const tgui::String &title, std::function callback); + void addInterPropField(InterPropField::Ptr field); + void addPropertiesBox(PropertiesBox::Ptr box); tgui::Button::Ptr constructButton(const tgui::String &title, std::function callback); }; diff --git a/include/editor/widgets/propertyFields/interPropField.hpp b/include/editor/widgets/propertyFields/interPropField.hpp new file mode 100644 index 00000000..9ee7b908 --- /dev/null +++ b/include/editor/widgets/propertyFields/interPropField.hpp @@ -0,0 +1,34 @@ +#ifndef _RPGPP_INTERPROPFIELD_H +#define _RPGPP_INTERPROPFIELD_H + +#include +#include +#include + +#include "TGUI/Widgets/BitmapButton.hpp" +#include "TGUI/Widgets/Button.hpp" + +class InterPropField : public tgui::SubwidgetContainer { +private: + void updateSize(); + +protected: + tgui::Widget::Ptr clone() const override; + +public: + tgui::Label::Ptr label; + tgui::Button::Ptr value; + tgui::Button::Ptr remove; + + typedef std::shared_ptr Ptr; + typedef std::shared_ptr ConstPtr; + + InterPropField(const char *typeName = "InterPropField", bool initRenderer = true); + + static InterPropField::Ptr create(); + static InterPropField::Ptr copy(InterPropField::ConstPtr widget); + + void setSize(const tgui::Layout2d &size) override; +}; + +#endif \ No newline at end of file diff --git a/include/editor/widgets/propertyFields/textField.hpp b/include/editor/widgets/propertyFields/textField.hpp index 931fdb28..d3d68e1d 100644 --- a/include/editor/widgets/propertyFields/textField.hpp +++ b/include/editor/widgets/propertyFields/textField.hpp @@ -5,6 +5,8 @@ #include #include +#include "TGUI/Widgets/BitmapButton.hpp" + class TextField : public tgui::SubwidgetContainer { private: void updateSize(); diff --git a/include/interactable.hpp b/include/interactable.hpp index 7d440a01..75bf9fbe 100644 --- a/include/interactable.hpp +++ b/include/interactable.hpp @@ -13,6 +13,8 @@ #include "gamedata.hpp" #include "saveable.hpp" +enum PropType { INT, STRING, BOOLEAN, DIALOGUE }; + /** Defines an object that is interactable in-game by a player's action */ class Interactable : public ISaveable { private: @@ -70,12 +72,16 @@ class Interactable : public ISaveable { void setProp(std::string key, std::string value); /** Set properties using a nlohmann::json object. */ void setProps(nlohmann::json j); + /** Add a property based on the chosen property type. */ + void addProp(PropType propType, const std::string &name); /** Set the source script file path. */ void setScriptSourcePath(const std::string &newPath); /** Get source script file. */ const std::string &getScriptSourcePath(); /** Get the properties json object. */ nlohmann::json &getProps(); + /** Get a pointer to the properties. */ + nlohmann::json *getPropsPtr(); /** Set the Interactable's display title (shown in Editor) */ void setDisplayTitle(const std::string &newTitle); /** Get the Interactable's display title. */ diff --git a/src/editor/childWindows/editPropWindow.cpp b/src/editor/childWindows/editPropWindow.cpp new file mode 100644 index 00000000..006f584e --- /dev/null +++ b/src/editor/childWindows/editPropWindow.cpp @@ -0,0 +1,77 @@ +#include "childWindows/editPropWindow.hpp" + +#include + +#include "TGUI/Widgets/Button.hpp" +#include "TGUI/Widgets/ComboBox.hpp" +#include "TGUI/Widgets/GrowVerticalLayout.hpp" +#include "TGUI/Widgets/Label.hpp" +#include "TGUI/Widgets/Panel.hpp" +#include "childWindows/newPropWindow.hpp" +#include "childWindows/popupWindow.hpp" +#include "nlohmann/json.hpp" +#include "nlohmann/json_fwd.hpp" + +EditPropWindow::EditPropWindow() : PopupWindow("Edit Prop..") { + props = nullptr; + currentWindow->setSize(280, 180); + + auto panel = tgui::Panel::create(); + panel->getRenderer()->setPadding({4, 4}); + + auto layout = tgui::GrowVerticalLayout::create(); + layout->getRenderer()->setSpaceBetweenWidgets(4); + panel->add(layout); + + nameLabel = tgui::Label::create(); + nameLabel->setSize({"100%", 24}); + nameLabel->setText(propName); + layout->add(nameLabel); + + dropdown = tgui::ComboBox::create(); + dropdown->setSize({"100%", 24}); + dropdown->addMultipleItems({"integer", "string", "boolean", "dialogue"}); + dropdown->setSelectedItemByIndex(0); + layout->add(dropdown); + + auto confirmButton = tgui::Button::create("Submit"); + confirmButton->setSize({"100%", 24}); + + std::weak_ptr weakDropdown = dropdown; + confirmButton->onClick([this, weakDropdown] { + if (weakDropdown.expired()) { + return; + } + + auto dropdownShared = weakDropdown.lock(); + + std::string nameText = propName; + + if (interactable != nullptr) { + int idx = dropdownShared->getSelectedItemIndex(); + PropType propType = static_cast(idx); + + interactable->getProps().erase(nameText); + + interactable->addProp(propType, nameText); + + box->addPropsJson(interactable->getProps(), true, true); + close(); + } + }); + layout->add(confirmButton); + + auto removeButton = tgui::Button::create("Remove"); + removeButton->setSize({"100%", 24}); + removeButton->onClick([this] { + if (interactable != nullptr) { + interactable->getProps().erase(propName); + + box->addPropsJson(*interactable->getPropsPtr(), true, true); + close(); + } + }); + layout->add(removeButton); + + currentWindow->add(panel); +} \ No newline at end of file diff --git a/src/editor/childWindows/newPropWindow.cpp b/src/editor/childWindows/newPropWindow.cpp new file mode 100644 index 00000000..36cf23a5 --- /dev/null +++ b/src/editor/childWindows/newPropWindow.cpp @@ -0,0 +1,64 @@ +#include "childWindows/newPropWindow.hpp" + +#include + +#include "TGUI/Widgets/Button.hpp" +#include "TGUI/Widgets/ComboBox.hpp" +#include "TGUI/Widgets/GrowVerticalLayout.hpp" +#include "TGUI/Widgets/Panel.hpp" +#include "childWindows/popupWindow.hpp" +#include "nlohmann/json.hpp" +#include "nlohmann/json_fwd.hpp" +#include "widgets/propertyFields/textField.hpp" + +NewPropWindow::NewPropWindow() : PopupWindow("New Prop..") { + props = nullptr; + currentWindow->setSize(280, 180); + + auto panel = tgui::Panel::create(); + panel->getRenderer()->setPadding({4, 4}); + + auto layout = tgui::GrowVerticalLayout::create(); + layout->getRenderer()->setSpaceBetweenWidgets(4); + panel->add(layout); + + auto nameField = TextField::create(); + nameField->setSize({"100%", 24}); + nameField->label->setText("Name"); + layout->add(nameField); + + auto dropdown = tgui::ComboBox::create(); + dropdown->setSize({"100%", 24}); + dropdown->addMultipleItems({"integer", "string", "boolean", "dialogue"}); + dropdown->setSelectedItemByIndex(0); + layout->add(dropdown); + + auto confirmButton = tgui::Button::create("Submit"); + confirmButton->setSize({"100%", 24}); + + std::weak_ptr weakName = nameField; + std::weak_ptr weakDropdown = dropdown; + confirmButton->onClick([this, weakName, weakDropdown] { + if (weakName.expired() || weakDropdown.expired()) { + return; + } + + auto nameShared = weakName.lock(); + auto dropdownShared = weakDropdown.lock(); + + auto nameText = nameShared->value->getText().toStdString(); + + if (interactable != nullptr && !nameText.empty()) { + int idx = dropdownShared->getSelectedItemIndex(); + PropType propType = static_cast(idx); + + interactable->addProp(propType, nameText); + + box->addPropsJson(interactable->getProps(), true, true); + close(); + } + }); + layout->add(confirmButton); + + currentWindow->add(panel); +} \ No newline at end of file diff --git a/src/editor/fileInitVisitor.cpp b/src/editor/fileInitVisitor.cpp index b87b30e9..0a5ee5d6 100644 --- a/src/editor/fileInitVisitor.cpp +++ b/src/editor/fileInitVisitor.cpp @@ -9,6 +9,7 @@ #include "dialogue.hpp" #include "editor.hpp" #include "gamedata.hpp" +#include "interactable.hpp" #include "prop.hpp" #include "raylib.h" #include "room.hpp" @@ -24,6 +25,7 @@ FileInitVisitor::FileInitVisitor() { funcs[static_cast(EngineFileType::FILE_ACTOR)] = actor; funcs[static_cast(EngineFileType::FILE_PROP)] = prop; funcs[static_cast(EngineFileType::FILE_DIALOGUE)] = dialogue; + funcs[static_cast(EngineFileType::FILE_INTERACTABLE)] = interactable; } bool FileInitVisitor::funcIsEmpty(EngineFileType fileType) { return funcs[static_cast(fileType)] == nullptr; } @@ -166,3 +168,37 @@ void FileInitVisitor::dialogue(NewFileDialog::Ptr dialog) { } }); } + +void FileInitVisitor::interactable(NewFileDialog::Ptr dialog) { + dialog->hideFileField(); + + dialog->confirmButton->onPress([dialog] { + std::string title = dialog->titleField->getText().toStdString(); + + bool found = false; + for (auto &[key, val] : Editor::instance->getProject()->getInteractableNames()) { + std::string type = GetFileNameWithoutExt(key.c_str()); + + if (type == std::string(TextToLower(title.c_str()))) { + found = true; + break; + } + } + + if (!title.empty() && !found) { + std::unique_ptr interactable = + std::make_unique(title, Vector2{-1, -1}, _RPGPP_TILESIZE); + interactable->setDisplayTitle(title); + + std::string newFilePath = TextFormat("interactables/%s.rinter", TextToLower(title.c_str())); + nlohmann::json fileJson = interactable->dumpJson(); + SaveFileText(newFilePath.c_str(), fileJson.dump().c_str()); + + auto ptr = aurora::downcast(Editor::instance->getGui().currentScreen.get()); + ptr->addFileView(EngineFileType::FILE_INTERACTABLE, newFilePath); + ptr->addResourceButtons(EngineFileType::FILE_INTERACTABLE); + + dialog->window->close(); + } + }); +} diff --git a/src/editor/fileViews/interactableFileView.cpp b/src/editor/fileViews/interactableFileView.cpp index 2a7b1851..aa2850d8 100644 --- a/src/editor/fileViews/interactableFileView.cpp +++ b/src/editor/fileViews/interactableFileView.cpp @@ -1,10 +1,13 @@ #include "fileViews/interactableFileView.hpp" #include "TGUI/String.hpp" +#include "childWindows/newPropWindow.hpp" +#include "editor.hpp" #include "interactable.hpp" #include "raylib.h" #include "widgets/propertiesBox.hpp" #include "widgets/propertyFields/boolField.hpp" +#include "widgets/propertyFields/intField.hpp" #include "widgets/propertyFields/textField.hpp" InteractableFileView::InteractableFileView() { @@ -49,6 +52,14 @@ InteractableFileView::InteractableFileView() { }); props->addBooleanField(onTouchField); + interProps = PropertiesBox::create(); + + auto test1 = IntField::create(); + test1->label->setText("test1"); + interProps->addIntField(test1); + + props->addPropertiesBox(interProps); + widgetContainer.push_back(props); } @@ -63,6 +74,9 @@ void InteractableFileView::init(tgui::Group::Ptr layout, VariantWrapper *variant scriptField->value->setText(GetFileName(interactable->getScriptSourcePath().c_str())); onTouchField->value->setChecked(interactable->isOnTouch()); + interProps->interactable = interactable; + interProps->addPropsJson(interactable->getProps(), true, true); + addWidgets(layout); } } \ No newline at end of file diff --git a/src/editor/project.cpp b/src/editor/project.cpp index 9c6dc30d..f2ea77fd 100644 --- a/src/editor/project.cpp +++ b/src/editor/project.cpp @@ -136,18 +136,28 @@ std::map Project::getInteractableNames() { std::map map{}; // built-in interactables - std::filesystem::path interactablesDir = Editor::instance->getFs().getEditorBaseDir(); - interactablesDir /= "resources"; - interactablesDir /= "interactables"; + std::filesystem::path builtinInteractablesDir = Editor::instance->getFs().getEditorBaseDir(); + builtinInteractablesDir /= "resources"; + builtinInteractablesDir /= "interactables"; - auto list = LoadDirectoryFiles(interactablesDir.u8string().c_str()); - for (int i = 0; i < list.count; i++) { - std::string intPath = list.paths[i]; + auto builtinList = LoadDirectoryFiles(builtinInteractablesDir.u8string().c_str()); + for (int i = 0; i < builtinList.count; i++) { + std::string intPath = builtinList.paths[i]; Interactable inter(intPath); map[intPath.c_str()] = inter.getDisplayTitle(); } - UnloadDirectoryFiles(list); + UnloadDirectoryFiles(builtinList); + + auto userList = LoadDirectoryFiles("interactables/"); + for (int i = 0; i < userList.count; i++) { + std::string intPath = userList.paths[i]; + Interactable inter(intPath); + + map[intPath.c_str()] = inter.getDisplayTitle(); + } + + UnloadDirectoryFiles(userList); return map; } @@ -397,7 +407,7 @@ GameData Project::generateStruct() { data.props.push_back(bin); } - // built in insteractables + // built in interactables std::filesystem::path interactablesDir = Editor::instance->getFs().getEditorBaseDir(); interactablesDir /= "resources"; interactablesDir /= "interactables"; @@ -412,13 +422,27 @@ GameData Project::generateStruct() { bin.scriptPath = inter.getScriptSourcePath(); bin.props = nlohmann::json::to_cbor(inter.getProps()); - printf("%s \n", bin.typeName.c_str()); - data.interactables[inter.getType()] = bin; } UnloadDirectoryFiles(list); - // scripts + // user interactables + auto userList = LoadDirectoryFiles("interactables/"); + for (int i = 0; i < userList.count; i++) { + std::string intPath = userList.paths[i]; + Interactable inter(intPath); + + InteractableBin bin; + bin.typeName = inter.getType(); + bin.scriptPath = inter.getScriptSourcePath(); + bin.props = nlohmann::json::to_cbor(inter.getProps()); + + data.interactables[inter.getType()] = bin; + } + + UnloadDirectoryFiles(userList); + + // built-in scripts std::filesystem::path scriptsDir = Editor::instance->getFs().getEditorBaseDir(); scriptsDir /= "resources"; scriptsDir /= "scripts"; @@ -447,6 +471,18 @@ GameData Project::generateStruct() { } UnloadDirectoryFiles(scriptsList); + auto userScriptsList = LoadDirectoryFiles("scripts/"); + for (int i = 0; i < userScriptsList.count; i++) { + std::string scriptPath = userScriptsList.paths[i]; + auto scriptText = LoadFileText(scriptPath.c_str()); + + ScriptBin bin; + bin.bytecode = scriptText; + + data.scripts[TextFormat("scripts/%s", GetFileName(scriptPath.c_str()))] = bin; + UnloadFileText(scriptText); + } + return data; } diff --git a/src/editor/roomLayerViewVisitor.cpp b/src/editor/roomLayerViewVisitor.cpp index 51a1a4c4..0ad201f6 100644 --- a/src/editor/roomLayerViewVisitor.cpp +++ b/src/editor/roomLayerViewVisitor.cpp @@ -95,6 +95,31 @@ void RoomLayerViewVisitor::operator()(enum_v) { if (inter == nullptr) { group->add(tgui::Label::create("Interactables")); } else { + auto interactableNames = Editor::instance->getProject()->getInteractableNames(); + std::unique_ptr typeInter; + for (auto &[key, val] : interactableNames) { + if (std::string(GetFileNameWithoutExt(key.c_str())) == inter->getType()) { + typeInter = std::make_unique(key); + + // Add missing props. + for (auto item : typeInter->getProps().items()) { + if (!inter->getProps().contains(item.key())) { + inter->getProps().push_back({item.key(), item.value()}); + } + } + + // Remove non-existent props. + auto *ptr = inter->getPropsPtr(); + for (auto item : inter->getPropsPtr()->items()) { + if (!typeInter->getProps().contains(item.key())) { + inter->getProps().erase(item.key()); + } + } + + break; + } + } + auto onTouchCheck = tgui::CheckBox::create("Interact on touch?"); onTouchCheck->setSize(24, 24); onTouchCheck->setPosition(8, 8); diff --git a/src/editor/services/childWindowSubService.cpp b/src/editor/services/childWindowSubService.cpp index 59f3a9d7..66b6717e 100644 --- a/src/editor/services/childWindowSubService.cpp +++ b/src/editor/services/childWindowSubService.cpp @@ -3,6 +3,8 @@ #include #include "childWindows/aboutWindow.hpp" +#include "childWindows/editPropWindow.hpp" +#include "childWindows/newPropWindow.hpp" #include "childWindows/popupWindow.hpp" #include "childWindows/projectSettingsWindow.hpp" #include "childWindows/settingsWindow.hpp" @@ -12,11 +14,15 @@ ChildWindowSubService::ChildWindowSubService() { this->createWindows(); } void ChildWindowSubService::createWindows() { if (!this->childWindows.empty()) this->childWindows.clear(); - this->childWindows.try_emplace("about", std::unique_ptr(new AboutWindow())); + this->childWindows.try_emplace("about", std::make_unique()); - this->childWindows.try_emplace("options", std::unique_ptr(new SettingsWindow())); + this->childWindows.try_emplace("options", std::make_unique()); this->childWindows.try_emplace("project_settings", std::make_unique()); + + this->childWindows.try_emplace("new_prop", std::make_unique()); + + this->childWindows.try_emplace("edit_prop", std::make_unique()); } void ChildWindowSubService::openWindow(const std::string &windowName) { @@ -27,3 +33,11 @@ void ChildWindowSubService::resetAndOpen(const std::string windowName) { this->createWindows(); this->openWindow(windowName); } + +PopupWindow *ChildWindowSubService::getWindow(const std::string &windowName) { + if (this->childWindows.count(windowName) == 1) { + return this->childWindows[windowName].get(); + } else { + return nullptr; + } +} diff --git a/src/editor/widgets/propertiesBox.cpp b/src/editor/widgets/propertiesBox.cpp index af2e6695..5deed582 100644 --- a/src/editor/widgets/propertiesBox.cpp +++ b/src/editor/widgets/propertiesBox.cpp @@ -12,10 +12,14 @@ #include "TGUI/Widgets/GrowVerticalLayout.hpp" #include "TGUI/Widgets/Label.hpp" #include "TGUI/Widgets/SpinControl.hpp" +#include "childWindows/editPropWindow.hpp" +#include "childWindows/newPropWindow.hpp" +#include "editor.hpp" #include "widgets/propertyFields/boolField.hpp" #include "widgets/propertyFields/fieldConfig.hpp" #include "widgets/propertyFields/fileField.hpp" #include "widgets/propertyFields/intField.hpp" +#include "widgets/propertyFields/interPropField.hpp" #include "widgets/propertyFields/rectangleField.hpp" #include "widgets/propertyFields/selectField.hpp" #include "widgets/propertyFields/textField.hpp" @@ -23,8 +27,15 @@ PropertiesBox::PropertiesBox(const char *typeName, bool initRenderer) : tgui::ChildWindow(typeName, initRenderer) { this->setTitle("Props"); this->setTitleButtons(tgui::ChildWindow::TitleButton::None); + auto vertLayout = tgui::GrowVerticalLayout::create(); vertLayout->getRenderer()->setSpaceBetweenWidgets(GAP); + + newPropButton = tgui::Button::create("New Prop.."); + newPropButton->setSize("100%", 24); + vertLayout->add(newPropButton); + newPropButton->setVisible(false); + add(vertLayout); this->layout = vertLayout; } @@ -45,59 +56,121 @@ void PropertiesBox::draw(tgui::BackendRenderTarget &target, tgui::RenderStates s tgui::ChildWindow::draw(target, states); } -void PropertiesBox::addPropsJson(nlohmann::json &j, bool clear) { +void PropertiesBox::addPropsJson(nlohmann::json &j, bool clear, bool editable) { if (clear) { layout->removeAllWidgets(); } - for (auto item : j.items()) { - printf("%s \n", item.key().c_str()); - if (item.value().is_string()) { - printf("%s \n", item.value().get().c_str()); - - auto textField = TextField::create(); - textField->label->setText(item.key()); - textField->value->setText(item.value().get()); - textField->value->onTextChange([&j, item](const tgui::String &text) { - std::string st = text.toStdString(); - j.at(item.key()) = st; - }); - addTextField(textField); - } - if (item.value().is_number()) { - auto intField = IntField::create(); - intField->label->setText(item.key()); - intField->value->setValue(item.value().get()); - intField->value->onValueChange([&j, item](float value) { j.at(item.key()) = value; }); - addIntField(intField); + if (editable) { + if (clear) { + layout->add(newPropButton); } - if (item.value().is_boolean()) { - auto boolField = BoolField::create(); - boolField->label->setText(item.key()); - boolField->value->setChecked(item.value().get()); - boolField->value->onChange([&j, item](bool checked) { j.at(item.key()) = checked; }); - addBooleanField(boolField); - } - if (item.value().is_object()) { - if (item.value().contains("propType")) { - std::string propType = item.value().at("propType"); - - auto fileField = FileField::create(); - fileField->label->setText(item.key()); - fileField->value->setText(item.value().at("value").get()); - fileField->callback = [&j, item, this](const tgui::String &filePath) { - printf("%s \n", filePath.toStdString().c_str()); - printf("%s \n", GetFileNameWithoutExt(filePath.toStdString().c_str())); - auto &ref = j.at(item.key()); - - ref.at("value") = GetFileNameWithoutExt(filePath.toStdString().c_str()); - }; - - if (propType == "dialogue") { - fileField->pathFilters = {{"Dialogue", {"*.rdiag"}}}; + + // configure the 'New Prop' button + newPropButton->setVisible(true); + newPropButton->onClick.disconnectAll(); + newPropButton->onClick([this] { + auto windowPtr = Editor::instance->getGui().getChildWindowSubService()->getWindow("new_prop"); + auto newPropWindow = static_cast(windowPtr); + + if (interactable != nullptr) { + newPropWindow->box = this; + newPropWindow->interactable = interactable; + } + + Editor::instance->getGui().getChildWindowSubService()->openWindow("new_prop"); + }); + + auto windowPtr = Editor::instance->getGui().getChildWindowSubService()->getWindow("edit_prop"); + auto editPropWindow = static_cast(windowPtr); + + // add fields for the props + for (auto item : j.items()) { + auto field = InterPropField::create(); + field->label->setText(item.key()); + field->value->onPress([this, item, editPropWindow] { + if (interactable != nullptr) { + editPropWindow->propName = item.key(); + editPropWindow->box = this; + editPropWindow->interactable = interactable; + + editPropWindow->nameLabel->setText(item.key()); + + editPropWindow->open(); + } + }); + + if (item.value().is_string()) { + field->value->setText("string"); + } + if (item.value().is_number()) { + field->value->setText("integer"); + } + if (item.value().is_boolean()) { + field->value->setText("boolean"); + } + if (item.value().is_object()) { + if (item.value().contains("propType")) { + std::string propType = item.value().at("propType"); + + if (propType == "dialogue") { + field->value->setText("dialogue"); + } } + } - addFileField(fileField); + addInterPropField(field); + } + } else { + for (auto item : j.items()) { + printf("%s \n", item.key().c_str()); + if (item.value().is_string()) { + printf("%s \n", item.value().get().c_str()); + + auto textField = TextField::create(); + textField->label->setText(item.key()); + textField->value->setText(item.value().get()); + textField->value->onTextChange([&j, item](const tgui::String &text) { + std::string st = text.toStdString(); + j.at(item.key()) = st; + }); + addTextField(textField); + } + if (item.value().is_number()) { + auto intField = IntField::create(); + intField->label->setText(item.key()); + intField->value->setValue(item.value().get()); + intField->value->onValueChange([&j, item](float value) { j.at(item.key()) = value; }); + addIntField(intField); + } + if (item.value().is_boolean()) { + auto boolField = BoolField::create(); + boolField->label->setText(item.key()); + boolField->value->setChecked(item.value().get()); + boolField->value->onChange([&j, item](bool checked) { j.at(item.key()) = checked; }); + addBooleanField(boolField); + } + if (item.value().is_object()) { + if (item.value().contains("propType")) { + std::string propType = item.value().at("propType"); + + auto fileField = FileField::create(); + fileField->label->setText(item.key()); + fileField->value->setText(item.value().at("value").get()); + fileField->callback = [&j, item, this](const tgui::String &filePath) { + printf("%s \n", filePath.toStdString().c_str()); + printf("%s \n", GetFileNameWithoutExt(filePath.toStdString().c_str())); + auto &ref = j.at(item.key()); + + ref.at("value") = GetFileNameWithoutExt(filePath.toStdString().c_str()); + }; + + if (propType == "dialogue") { + fileField->pathFilters = {{"Dialogue", {"*.rdiag"}}}; + } + + addFileField(fileField); + } } } } @@ -166,3 +239,13 @@ void PropertiesBox::addRectangleField(RectangleField::Ptr field) { field->setSize({"100%", 48}); layout->add(field); } + +void PropertiesBox::addInterPropField(InterPropField::Ptr field) { + field->setSize({"100%", 24}); + layout->add(field); +} + +void PropertiesBox::addPropertiesBox(PropertiesBox::Ptr box) { + box->setWidth("80%"); + layout->add(box); +} diff --git a/src/editor/widgets/propertyFields/interPropField.cpp b/src/editor/widgets/propertyFields/interPropField.cpp new file mode 100644 index 00000000..701cf076 --- /dev/null +++ b/src/editor/widgets/propertyFields/interPropField.cpp @@ -0,0 +1,53 @@ +#include "widgets/propertyFields/interPropField.hpp" + +#include +#include + +#include "TGUI/Texture.hpp" +#include "TGUI/Widget.hpp" +#include "TGUI/Widgets/BitmapButton.hpp" +#include "TGUI/Widgets/Button.hpp" +#include "TGUI/Widgets/Label.hpp" +#include "editor.hpp" +#include "widgets/propertyFields/fieldConfig.hpp" + +InterPropField::InterPropField(const char *typeName, bool initRenderer) + : tgui::SubwidgetContainer(typeName, initRenderer) { + label = tgui::Label::create("Label"); + label->setHorizontalAlignment(tgui::HorizontalAlignment::Left); + label->setVerticalAlignment(tgui::VerticalAlignment::Center); + value = tgui::Button::create(); + remove = tgui::Button::create("Remove"); + + m_container->add(label, "Label"); + m_container->add(value, "Value"); + m_container->add(remove, "Remove"); + + updateSize(); +} + +InterPropField::Ptr InterPropField::create() { return std::make_shared(); } + +InterPropField::Ptr InterPropField::copy(InterPropField::ConstPtr widget) { + if (widget) { + return std::static_pointer_cast(widget->clone()); + } else { + return nullptr; + } +} + +tgui::Widget::Ptr InterPropField::clone() const { return std::make_shared(*this); } + +void InterPropField::setSize(const tgui::Layout2d &size) { + tgui::SubwidgetContainer::setSize(size); + updateSize(); +} + +void InterPropField::updateSize() { + label->setPosition({PADDING, 0}); + label->setSize({getSize().x * 0.3f - PADDING, getSize().y}); + value->setPosition({getSize().x * 0.3f, 0}); + value->setSize({getSize().x * 0.3f, getSize().y}); + remove->setPosition({getSize().x * 0.6f, getSize().y}); + remove->setSize({getSize().x * 0.3f, getSize().y}); +} \ No newline at end of file diff --git a/src/editor/widgets/propertyFields/textField.cpp b/src/editor/widgets/propertyFields/textField.cpp index 4b150dd8..28a315ae 100644 --- a/src/editor/widgets/propertyFields/textField.cpp +++ b/src/editor/widgets/propertyFields/textField.cpp @@ -3,8 +3,11 @@ #include #include +#include "TGUI/Texture.hpp" #include "TGUI/Widget.hpp" +#include "TGUI/Widgets/BitmapButton.hpp" #include "TGUI/Widgets/Label.hpp" +#include "editor.hpp" #include "widgets/propertyFields/fieldConfig.hpp" TextField::TextField(const char *typeName, bool initRenderer) : tgui::SubwidgetContainer(typeName, initRenderer) { @@ -40,6 +43,5 @@ void TextField::updateSize() { label->setPosition({PADDING, 0}); label->setSize({getSize().x * 0.5f - PADDING, getSize().y}); value->setSize({getSize().x * 0.5f - PADDING, getSize().y}); - value->setPosition({getSize().x * 0.5, 0}); } diff --git a/src/interactable.cpp b/src/interactable.cpp index 2b9cb8d9..3b359c4a 100644 --- a/src/interactable.cpp +++ b/src/interactable.cpp @@ -95,8 +95,29 @@ void Interactable::setType(const std::string &type) { void Interactable::setProps(nlohmann::json j) { this->props = std::make_unique(j); } +void Interactable::addProp(PropType propType, const std::string &name) { + switch (propType) { + case INT: + props->push_back({name, 0}); + break; + case STRING: + props->push_back({name, ""}); + break; + case BOOLEAN: + props->push_back({name, false}); + break; + case DIALOGUE: + props->push_back({name, {{"propType", "dialogue"}, {"value", ""}}}); + break; + default: + break; + } +} + nlohmann::json &Interactable::getProps() { return *props; } +nlohmann::json *Interactable::getPropsPtr() { return props.get(); } + void Interactable::setScriptSourcePath(const std::string &newPath) { scriptPath = newPath; } const std::string &Interactable::getScriptSourcePath() { return scriptPath; } From b938e289182bba260776818b44296e98bf62d680 Mon Sep 17 00:00:00 2001 From: "D. Quan" <60545346+sudoker0@users.noreply.github.com> Date: Sat, 11 Apr 2026 22:44:41 +0700 Subject: [PATCH 16/69] Bind translations --- .../editor/childWindows/editPropWindow.hpp | 4 +-- resources/translations/en_us.json | 17 +++++++++++ resources/translations/vn.json | 18 +++++++++++- src/editor/childWindows/editPropWindow.cpp | 22 +++++++++------ src/editor/childWindows/newPropWindow.cpp | 28 ++++++++++++------- src/editor/fileViews/interactableFileView.cpp | 16 +++++------ 6 files changed, 76 insertions(+), 29 deletions(-) diff --git a/include/editor/childWindows/editPropWindow.hpp b/include/editor/childWindows/editPropWindow.hpp index 3b93aeef..023dfe8c 100644 --- a/include/editor/childWindows/editPropWindow.hpp +++ b/include/editor/childWindows/editPropWindow.hpp @@ -16,9 +16,9 @@ class EditPropWindow : public PopupWindow { std::string propName; tgui::Label::Ptr nameLabel; - tgui::ComboBox::Ptr dropdown; + SelectField::Ptr dropdown; EditPropWindow(); }; -#endif \ No newline at end of file +#endif diff --git a/resources/translations/en_us.json b/resources/translations/en_us.json index 7179adf2..7932a940 100644 --- a/resources/translations/en_us.json +++ b/resources/translations/en_us.json @@ -96,6 +96,11 @@ "edit_anim_data": "Edit Animation Data", "is_non_idle": "Is Non-Idle Animation?" }, + "interactableview": { + "display_name": "Display Name", + "script": "Script", + "on_touch": "On Touch?" + }, "toolbar": { "play": "Play", "build": "Build" @@ -120,6 +125,18 @@ "project_settings": { "_label": "Project Settings", "title": "Title" + }, + "new_prop": { + "title": "New Prop", + "name": "Name", + "type": "Type", + "submit": "Create" + }, + "edit_prop": { + "title": "Edit Prop", + "type": "Type", + "submit": "Submit", + "remove": "Remove" } }, "widget": { diff --git a/resources/translations/vn.json b/resources/translations/vn.json index a77ac2f2..24eeee2c 100644 --- a/resources/translations/vn.json +++ b/resources/translations/vn.json @@ -102,7 +102,11 @@ "edit_anim_data": "Chỉnh sửa dữ liệu animation", "is_non_idle": "Có phải animation?" }, - + "interactableview": { + "display_name": "Tên hiển thị", + "script": "Tệp Script", + "on_touch": "Kích hoạt khi chạm?" + }, "toolbar": { "play": "Chạy chương trình", "build": "Dịch và tạo chương trình" @@ -129,6 +133,18 @@ "project_settings": { "_label": "Cấu hình dự án", "title": "Tên dự án" + }, + "new_prop": { + "title": "Tạo Prop mới", + "name": "Tên", + "type": "Loại", + "submit": "Tạo" + }, + "edit_prop": { + "title": "Chỉnh sửa Prop", + "type": "Loại", + "submit": "Sửa", + "remove": "Xóa" } }, diff --git a/src/editor/childWindows/editPropWindow.cpp b/src/editor/childWindows/editPropWindow.cpp index 006f584e..5a6c11a2 100644 --- a/src/editor/childWindows/editPropWindow.cpp +++ b/src/editor/childWindows/editPropWindow.cpp @@ -7,12 +7,15 @@ #include "TGUI/Widgets/GrowVerticalLayout.hpp" #include "TGUI/Widgets/Label.hpp" #include "TGUI/Widgets/Panel.hpp" +#include "bindTranslation.hpp" #include "childWindows/newPropWindow.hpp" #include "childWindows/popupWindow.hpp" #include "nlohmann/json.hpp" #include "nlohmann/json_fwd.hpp" +#include "widgets/propertyFields/selectField.hpp" EditPropWindow::EditPropWindow() : PopupWindow("Edit Prop..") { + bindTranslation(this->currentWindow, "dialog.edit_prop.title", &tgui::ChildWindow::setTitle); props = nullptr; currentWindow->setSize(280, 180); @@ -28,16 +31,18 @@ EditPropWindow::EditPropWindow() : PopupWindow("Edit Prop..") { nameLabel->setText(propName); layout->add(nameLabel); - dropdown = tgui::ComboBox::create(); + dropdown = SelectField::create(); dropdown->setSize({"100%", 24}); - dropdown->addMultipleItems({"integer", "string", "boolean", "dialogue"}); - dropdown->setSelectedItemByIndex(0); + bindTranslation(dropdown->label, "dialog.edit_prop.type", &tgui::Label::setText); + dropdown->value->addMultipleItems({"integer", "string", "boolean", "dialogue"}); + dropdown->value->setSelectedItemByIndex(0); layout->add(dropdown); - auto confirmButton = tgui::Button::create("Submit"); + auto confirmButton = tgui::Button::create(); + bindTranslation(confirmButton, "dialog.edit_prop.submit", &tgui::Button::setText); confirmButton->setSize({"100%", 24}); - std::weak_ptr weakDropdown = dropdown; + std::weak_ptr weakDropdown = dropdown; confirmButton->onClick([this, weakDropdown] { if (weakDropdown.expired()) { return; @@ -48,7 +53,7 @@ EditPropWindow::EditPropWindow() : PopupWindow("Edit Prop..") { std::string nameText = propName; if (interactable != nullptr) { - int idx = dropdownShared->getSelectedItemIndex(); + int idx = dropdownShared->value->getSelectedItemIndex(); PropType propType = static_cast(idx); interactable->getProps().erase(nameText); @@ -61,7 +66,8 @@ EditPropWindow::EditPropWindow() : PopupWindow("Edit Prop..") { }); layout->add(confirmButton); - auto removeButton = tgui::Button::create("Remove"); + auto removeButton = tgui::Button::create(); + bindTranslation(removeButton, "dialog.edit_prop.remove", &tgui::Button::setText); removeButton->setSize({"100%", 24}); removeButton->onClick([this] { if (interactable != nullptr) { @@ -74,4 +80,4 @@ EditPropWindow::EditPropWindow() : PopupWindow("Edit Prop..") { layout->add(removeButton); currentWindow->add(panel); -} \ No newline at end of file +} diff --git a/src/editor/childWindows/newPropWindow.cpp b/src/editor/childWindows/newPropWindow.cpp index 36cf23a5..12ac1737 100644 --- a/src/editor/childWindows/newPropWindow.cpp +++ b/src/editor/childWindows/newPropWindow.cpp @@ -6,12 +6,15 @@ #include "TGUI/Widgets/ComboBox.hpp" #include "TGUI/Widgets/GrowVerticalLayout.hpp" #include "TGUI/Widgets/Panel.hpp" +#include "bindTranslation.hpp" #include "childWindows/popupWindow.hpp" #include "nlohmann/json.hpp" #include "nlohmann/json_fwd.hpp" +#include "widgets/propertyFields/selectField.hpp" #include "widgets/propertyFields/textField.hpp" NewPropWindow::NewPropWindow() : PopupWindow("New Prop..") { + bindTranslation(this->currentWindow, "dialog.new_prop.title", &tgui::ChildWindow::setTitle); props = nullptr; currentWindow->setSize(280, 180); @@ -24,20 +27,22 @@ NewPropWindow::NewPropWindow() : PopupWindow("New Prop..") { auto nameField = TextField::create(); nameField->setSize({"100%", 24}); - nameField->label->setText("Name"); + bindTranslation(nameField->label, "dialog.new_prop.name", &tgui::Label::setText); layout->add(nameField); - auto dropdown = tgui::ComboBox::create(); - dropdown->setSize({"100%", 24}); - dropdown->addMultipleItems({"integer", "string", "boolean", "dialogue"}); - dropdown->setSelectedItemByIndex(0); - layout->add(dropdown); + auto dropdownField = SelectField::create(); + dropdownField->setSize({"100%", 24}); + bindTranslation(dropdownField->label, "dialog.new_prop.type", &tgui::Label::setText); + dropdownField->value->addMultipleItems({"integer", "string", "boolean", "dialogue"}); + dropdownField->value->setSelectedItemByIndex(0); + layout->add(dropdownField); - auto confirmButton = tgui::Button::create("Submit"); + auto confirmButton = tgui::Button::create(); + bindTranslation(confirmButton, "dialog.new_prop.submit", &tgui::Button::setText); confirmButton->setSize({"100%", 24}); std::weak_ptr weakName = nameField; - std::weak_ptr weakDropdown = dropdown; + std::weak_ptr weakDropdown = dropdownField; confirmButton->onClick([this, weakName, weakDropdown] { if (weakName.expired() || weakDropdown.expired()) { return; @@ -49,7 +54,7 @@ NewPropWindow::NewPropWindow() : PopupWindow("New Prop..") { auto nameText = nameShared->value->getText().toStdString(); if (interactable != nullptr && !nameText.empty()) { - int idx = dropdownShared->getSelectedItemIndex(); + int idx = dropdownShared->value->getSelectedItemIndex(); PropType propType = static_cast(idx); interactable->addProp(propType, nameText); @@ -57,8 +62,11 @@ NewPropWindow::NewPropWindow() : PopupWindow("New Prop..") { box->addPropsJson(interactable->getProps(), true, true); close(); } + + nameShared->value->setText(""); + dropdownShared->value->setSelectedItemByIndex(0); }); layout->add(confirmButton); currentWindow->add(panel); -} \ No newline at end of file +} diff --git a/src/editor/fileViews/interactableFileView.cpp b/src/editor/fileViews/interactableFileView.cpp index aa2850d8..8208f054 100644 --- a/src/editor/fileViews/interactableFileView.cpp +++ b/src/editor/fileViews/interactableFileView.cpp @@ -1,6 +1,8 @@ #include "fileViews/interactableFileView.hpp" #include "TGUI/String.hpp" +#include "TGUI/Widgets/Label.hpp" +#include "bindTranslation.hpp" #include "childWindows/newPropWindow.hpp" #include "editor.hpp" #include "interactable.hpp" @@ -16,7 +18,8 @@ InteractableFileView::InteractableFileView() { props->setPosition({TextFormat("100%% - %d", RIGHT_PANEL_W), 0}); nameField = TextField::create(); - nameField->label->setText("Display Name"); + bindTranslation(nameField->label, "screen.project.interactableview.display_name", + &tgui::Label::setText); nameField->value->onTextChange([this](const tgui::String &text) { if (variant != nullptr) { const auto ptr = dynamic_cast *>(variant); @@ -29,7 +32,7 @@ InteractableFileView::InteractableFileView() { scriptField = FileField::create(); scriptField->pathFilters = {{"Script", {"*.lua"}}}; - scriptField->label->setText("Script"); + bindTranslation(scriptField->label, "screen.project.interactableview.script", &tgui::Label::setText); scriptField->callback = [this](const tgui::String &path) { if (variant != nullptr) { const auto ptr = dynamic_cast *>(variant); @@ -41,7 +44,8 @@ InteractableFileView::InteractableFileView() { props->addFileField(scriptField); onTouchField = BoolField::create(); - onTouchField->label->setText("On Touch?"); + bindTranslation(onTouchField->label, "screen.project.interactableview.on_touch", + &tgui::Label::setText); onTouchField->value->onChange([this](bool value) { if (variant != nullptr) { const auto ptr = dynamic_cast *>(variant); @@ -54,10 +58,6 @@ InteractableFileView::InteractableFileView() { interProps = PropertiesBox::create(); - auto test1 = IntField::create(); - test1->label->setText("test1"); - interProps->addIntField(test1); - props->addPropertiesBox(interProps); widgetContainer.push_back(props); @@ -79,4 +79,4 @@ void InteractableFileView::init(tgui::Group::Ptr layout, VariantWrapper *variant addWidgets(layout); } -} \ No newline at end of file +} From 55531e315bb8f52370161348e8bb5da70474a294 Mon Sep 17 00:00:00 2001 From: CDevv Date: Sat, 11 Apr 2026 18:54:01 +0300 Subject: [PATCH 17/69] Bulgarian translation of new keys --- resources/translations/bg.json | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/resources/translations/bg.json b/resources/translations/bg.json index 579d0428..91b605ac 100644 --- a/resources/translations/bg.json +++ b/resources/translations/bg.json @@ -96,6 +96,11 @@ "edit_anim_data": "Редактирай анимация", "is_non_idle": "е анимация на вървене?" }, + "interactableview": { + "display_name": "Име", + "script": "Скрипт", + "on_touch": "Извикай при допир?" + }, "toolbar": { "play": "Пусни игра", "build": "Компилирай игра" @@ -116,6 +121,22 @@ "folder": "Папка", "confirm": "Потвърди", "cancel": "Отмени" + }, + "project_settings": { + "_label": "Настройки на проекта", + "title": "Име" + }, + "new_prop": { + "title": "Нов обект", + "name": "Име", + "type": "Тип", + "submit": "Създай" + }, + "edit_prop": { + "title": "Редактирай обект", + "type": "Тип", + "submit": "Потвърди", + "remove": "Премахни" } }, "widget": { @@ -127,6 +148,8 @@ } }, "button": { - "go_back": "Върни се" + "go_back": "Върни се", + "restart": "Рестартирай", + "restart_later": "Рестартирай по-късно" } } \ No newline at end of file From 1cdbde5487fe28fa75237dd97de33ddc61d0b8fb Mon Sep 17 00:00:00 2001 From: thefirey33 Date: Sat, 11 Apr 2026 19:01:42 +0300 Subject: [PATCH 18/69] turkish translation --- resources/translations/tr.json | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/resources/translations/tr.json b/resources/translations/tr.json index 4b968736..c3dcc0e3 100644 --- a/resources/translations/tr.json +++ b/resources/translations/tr.json @@ -96,6 +96,11 @@ "delete": "Kare Sil", "edit_anim_data": "Animasyon Verisini Düzenle" }, + "interactableview": { + "display_name": "Görünüş Adı", + "script": "Betik", + "on_touch": "Dokunulduğunda?" + }, "toolbar": { "play": "Oyna", "build": "Derle" @@ -116,6 +121,22 @@ "folder": "Klasör", "confirm": "Kabul Et", "cancel": "İptal" + }, + "project_settings": { + "_label": "Proje Ayarları", + "title": "Başlık" + }, + "new_prop": { + "title": "Yeni Obje", + "name": "Adı", + "type": "Tür", + "submit": "Oluştur" + }, + "edit_prop": { + "title": "Objeyi Düzenle", + "type": "Tür", + "submit": "Kabul Et", + "remove": "Sil" } }, "widget": { @@ -131,4 +152,4 @@ "restart": "Yeniden Başlat", "restart_later": "Sonra Yeniden Başlat" } -} +} \ No newline at end of file From 3327b1a6fee3f93575bdbd7ea14bec4a3180a5c5 Mon Sep 17 00:00:00 2001 From: CDevv Date: Sun, 12 Apr 2026 19:27:03 +0300 Subject: [PATCH 19/69] Basic Program settings. --- .../projectSettingsPanel/game.hpp | 11 ++ .../projectSettingsPanel/program.hpp | 22 ++++ .../childWindows/projectSettingsWindow.hpp | 7 +- include/editor/project.hpp | 9 ++ resources/translations/en_us.json | 10 +- .../projectSettingsPanel/game.cpp | 21 ++++ .../projectSettingsPanel/project.cpp | 103 ++++++++++++++++++ .../childWindows/projectSettingsWindow.cpp | 43 +++++--- src/editor/project.cpp | 21 ++++ 9 files changed, 229 insertions(+), 18 deletions(-) create mode 100644 include/editor/childWindows/projectSettingsPanel/game.hpp create mode 100644 include/editor/childWindows/projectSettingsPanel/program.hpp create mode 100644 src/editor/childWindows/projectSettingsPanel/game.cpp create mode 100644 src/editor/childWindows/projectSettingsPanel/project.cpp diff --git a/include/editor/childWindows/projectSettingsPanel/game.hpp b/include/editor/childWindows/projectSettingsPanel/game.hpp new file mode 100644 index 00000000..7794b746 --- /dev/null +++ b/include/editor/childWindows/projectSettingsPanel/game.hpp @@ -0,0 +1,11 @@ +#ifndef _RPGPP_PROJECTSETTINGSPANEL_GAME_H +#define _RPGPP_PROJECTSETTINGSPANEL_GAME_H + +#include "childWindows/settingsPanel/base.hpp" + +class ProjectSettingsPanelGame : public SettingsPanelBase { +public: + ProjectSettingsPanelGame(tgui::TabContainer::Ptr tabContainer); +}; + +#endif \ No newline at end of file diff --git a/include/editor/childWindows/projectSettingsPanel/program.hpp b/include/editor/childWindows/projectSettingsPanel/program.hpp new file mode 100644 index 00000000..226f3df4 --- /dev/null +++ b/include/editor/childWindows/projectSettingsPanel/program.hpp @@ -0,0 +1,22 @@ +#ifndef _RPGPP_PROJECTSETTINGSPANEL_PROGRAM_H +#define _RPGPP_PROJECTSETTINGSPANEL_PROGRAM_H + +#include "childWindows/settingsPanel/base.hpp" +#include "widgets/propertyFields/boolField.hpp" +#include "widgets/propertyFields/fileField.hpp" +#include "widgets/propertyFields/intField.hpp" +#include "widgets/propertyFields/textField.hpp" + +class ProjectSettingsPanelProgram : public SettingsPanelBase { +public: + TextField::Ptr titleField; + FileField::Ptr programIcon; + IntField::Ptr windowSizeX; + IntField::Ptr windowSizeY; + BoolField::Ptr resizeable; + + ProjectSettingsPanelProgram(tgui::TabContainer::Ptr tabContainer); + void setup(Project *project); +}; + +#endif \ No newline at end of file diff --git a/include/editor/childWindows/projectSettingsWindow.hpp b/include/editor/childWindows/projectSettingsWindow.hpp index be920920..d68fcee5 100644 --- a/include/editor/childWindows/projectSettingsWindow.hpp +++ b/include/editor/childWindows/projectSettingsWindow.hpp @@ -1,13 +1,18 @@ #ifndef _RPGPP_PROJECTSETTINGSWINDOW_H #define _RPGPP_PROJECTSETTINGSWINDOW_H +#include + #include "TGUI/Widgets/EditBox.hpp" #include "childWindows/popupWindow.hpp" +#include "childWindows/projectSettingsPanel/game.hpp" +#include "childWindows/projectSettingsPanel/program.hpp" #include "widgets/propertyFields/textField.hpp" class ProjectSettingsWindow : public PopupWindow { private: - TextField::Ptr titleField; + std::unique_ptr program; + std::unique_ptr game; public: ProjectSettingsWindow(); diff --git a/include/editor/project.hpp b/include/editor/project.hpp index 3b5c9be3..39e8d8d6 100644 --- a/include/editor/project.hpp +++ b/include/editor/project.hpp @@ -16,6 +16,9 @@ class Project { private: std::string projectPath; std::string projectTitle; + IVector windowSize = {640, 480}; + std::string programIconPath = ""; + bool windowResizeableFlag = false; public: Project(const std::string &path); @@ -24,6 +27,12 @@ class Project { json toJson(); std::string &getTitle(); void setTitle(const std::string &newTitle); + IVector getWindowSize(); + void setWindowSize(IVector newWindowSize); + std::string &getProgramIconPath(); + void setProgramIconPath(const std::string &newProgramIconPath); + bool isWindowResizeable(); + void setIsWindowResizeable(bool value); std::string &getBasePath(); std::vector getPaths(EngineFileType fileType); std::string getResourcePath(EngineFileType fileType, const std::string &fileName); diff --git a/resources/translations/en_us.json b/resources/translations/en_us.json index 7932a940..78ac19fa 100644 --- a/resources/translations/en_us.json +++ b/resources/translations/en_us.json @@ -105,6 +105,14 @@ "play": "Play", "build": "Build" } + }, + "project_options": { + "program": { + "_label": "Program" + }, + "game": { + "_label": "Game" + } } }, "dialog": { @@ -152,4 +160,4 @@ "restart": "Restart", "restart_later": "Restart Later" } -} +} \ No newline at end of file diff --git a/src/editor/childWindows/projectSettingsPanel/game.cpp b/src/editor/childWindows/projectSettingsPanel/game.cpp new file mode 100644 index 00000000..a3015251 --- /dev/null +++ b/src/editor/childWindows/projectSettingsPanel/game.cpp @@ -0,0 +1,21 @@ +#include "childWindows/projectSettingsPanel/game.hpp" + +#include "TGUI/Widgets/GrowVerticalLayout.hpp" +#include "TGUI/Widgets/ScrollablePanel.hpp" +#include "childWindows/settingsPanel/base.hpp" + +ProjectSettingsPanelGame::ProjectSettingsPanelGame(tgui::TabContainer::Ptr tabContainer) + : SettingsPanelBase(tabContainer, "screen.project_options.game._label") { + const tgui::ScrollablePanel::Ptr scrollPanel = tgui::ScrollablePanel::create(); + scrollPanel->setSize("100%", "100%"); + scrollPanel->getRenderer()->setPadding(4); + + const auto layout = tgui::GrowVerticalLayout::create(); + layout->setSize("80%", "100%"); + layout->setPosition({"50%", "0%"}); + layout->setOrigin({0.5, 0}); + layout->getRenderer()->setSpaceBetweenWidgets(10.0f); + + scrollPanel->add(layout); + panel->add(scrollPanel); +} \ No newline at end of file diff --git a/src/editor/childWindows/projectSettingsPanel/project.cpp b/src/editor/childWindows/projectSettingsPanel/project.cpp new file mode 100644 index 00000000..de554cbc --- /dev/null +++ b/src/editor/childWindows/projectSettingsPanel/project.cpp @@ -0,0 +1,103 @@ +#include "project.hpp" + +#include "TGUI/String.hpp" +#include "TGUI/Widgets/GrowVerticalLayout.hpp" +#include "TGUI/Widgets/ScrollablePanel.hpp" +#include "childWindows/projectSettingsPanel/program.hpp" +#include "childWindows/settingsPanel/base.hpp" +#include "raylib.h" +#include "widgets/propertyFields/boolField.hpp" +#include "widgets/propertyFields/fileField.hpp" +#include "widgets/propertyFields/intField.hpp" +#include "widgets/propertyFields/textField.hpp" + +ProjectSettingsPanelProgram::ProjectSettingsPanelProgram(tgui::TabContainer::Ptr tabContainer) + : SettingsPanelBase(tabContainer, "screen.project_options.program._label") { + const tgui::ScrollablePanel::Ptr scrollPanel = tgui::ScrollablePanel::create(); + scrollPanel->setSize("100%", "100%"); + scrollPanel->getRenderer()->setPadding(4); + + const auto layout = tgui::GrowVerticalLayout::create(); + layout->setSize("80%", "100%"); + layout->setPosition({"50%", "0%"}); + layout->setOrigin({0.5, 0}); + layout->getRenderer()->setSpaceBetweenWidgets(10.0f); + + titleField = TextField::create(); + bindTranslation(titleField->label, "dialog.project_settings.title", &tgui::Label::setText); + titleField->setSize({"100%", 24}); + titleField->value->onTextChange([](const tgui::String &text) { + Project *project = Editor::instance->getProject(); + if (project != nullptr) { + project->setTitle(text.toStdString()); + } + }); + + programIcon = FileField::create(); + programIcon->setSize({"100%", 24}); + programIcon->pathFilters = {{"Image", {"*.png", "*.jpg"}}}; + programIcon->label->setText("Program Icon"); + programIcon->callback = [](const tgui::String &path) { + Project *project = Editor::instance->getProject(); + if (project != nullptr) { + project->setProgramIconPath(TextFormat("images/%s", GetFileName(path.toStdString().c_str()))); + } + }; + + windowSizeX = IntField::create(); + windowSizeX->setSize({"100%", 24}); + windowSizeX->label->setText("Window Width"); + windowSizeX->value->setMinimum(640); + windowSizeX->value->setMaximum(1920); + windowSizeX->value->onValueChange([](int value) { + Project *project = Editor::instance->getProject(); + if (project != nullptr) { + auto windowSize = project->getWindowSize(); + windowSize.x = value; + project->setWindowSize(windowSize); + } + }); + + windowSizeY = IntField::create(); + windowSizeY->setSize({"100%", 24}); + windowSizeY->label->setText("Window Height"); + windowSizeY->value->setMinimum(480); + windowSizeY->value->setMaximum(1080); + windowSizeY->value->onValueChange([](int value) { + Project *project = Editor::instance->getProject(); + if (project != nullptr) { + auto windowSize = project->getWindowSize(); + windowSize.y = value; + project->setWindowSize(windowSize); + } + }); + + resizeable = BoolField::create(); + resizeable->setSize({"100%", 24}); + resizeable->label->setText("Window Resizeable?"); + resizeable->value->onChange([](bool value) { + Project *project = Editor::instance->getProject(); + project->setIsWindowResizeable(value); + }); + + layout->add(titleField); + layout->add(programIcon); + layout->add(windowSizeX); + layout->add(windowSizeY); + layout->add(resizeable); + + scrollPanel->add(layout); + panel->add(scrollPanel); +} + +void ProjectSettingsPanelProgram::setup(Project *project) { + if (project == nullptr) return; + + titleField->value->setText(project->getTitle()); + if (!project->getProgramIconPath().empty()) { + programIcon->value->setText(GetFileName(project->getProgramIconPath().c_str())); + } + + windowSizeX->value->setValue(project->getWindowSize().x); + windowSizeY->value->setValue(project->getWindowSize().y); +} \ No newline at end of file diff --git a/src/editor/childWindows/projectSettingsWindow.cpp b/src/editor/childWindows/projectSettingsWindow.cpp index db720ee1..bf7aa9ce 100644 --- a/src/editor/childWindows/projectSettingsWindow.cpp +++ b/src/editor/childWindows/projectSettingsWindow.cpp @@ -1,42 +1,53 @@ #include "childWindows/projectSettingsWindow.hpp" +#include + #include "TGUI/String.hpp" +#include "TGUI/Widgets/Button.hpp" #include "TGUI/Widgets/EditBox.hpp" #include "TGUI/Widgets/GrowVerticalLayout.hpp" #include "TGUI/Widgets/Label.hpp" #include "childWindows/popupWindow.hpp" +#include "childWindows/projectSettingsPanel/game.hpp" +#include "childWindows/projectSettingsPanel/program.hpp" #include "childWindows/settingsPanel/base.hpp" #include "editor.hpp" #include "project.hpp" +#include "raylib.h" #include "widgets/propertyFields/textField.hpp" ProjectSettingsWindow::ProjectSettingsWindow() : PopupWindow("ProjectSettings") { - auto layout = tgui::GrowVerticalLayout::create(); - layout->getRenderer()->setPadding(4); - layout->getRenderer()->setSpaceBetweenWidgets(4.0f); + tgui::TabContainer::Ptr tabContainer = tgui::TabContainer::create(); + tabContainer->setPosition(0, 0); + tabContainer->setSize({"100%", "100% - 36"}); + + auto saveButton = tgui::Button::create("Save"); + saveButton->setPosition(2, "100% - 32"); + saveButton->setSize("100% - 4", 30); + saveButton->onClick([] { + Project *project = Editor::instance->getProject(); - bindTranslation(this->currentWindow, "dialog.project_settings._label", &tgui::ChildWindow::setTitle); + auto projectJson = project->toJson(); + auto basePath = project->getBasePath(); - titleField = TextField::create(); - bindTranslation(titleField->label, "dialog.project_settings.title", &tgui::Label::setText); - titleField->setPosition({8, 48}); - titleField->setSize({"80%", 24}); - titleField->value->onTextChange([](const tgui::String &text) { - Project *project = Editor::instance->getProject(); - if (project != nullptr) { - project->setTitle(text.toStdString()); - } + SaveFileText(TextFormat("%s/proj.rpgpp", basePath.c_str()), projectJson.dump().c_str()); }); - layout->add(titleField); + bindTranslation(this->currentWindow, "dialog.project_settings._label", &tgui::ChildWindow::setTitle); + + program = std::make_unique(tabContainer); + game = std::make_unique(tabContainer); + + tabContainer->getTabs()->select(0); - this->currentWindow->add(layout); + this->currentWindow->add(tabContainer); + this->currentWindow->add(saveButton); } void ProjectSettingsWindow::open() { Project *project = Editor::instance->getProject(); - titleField->value->setText(project->getTitle()); + program->setup(project); PopupWindow::open(); } diff --git a/src/editor/project.cpp b/src/editor/project.cpp index f2ea77fd..3713b1d4 100644 --- a/src/editor/project.cpp +++ b/src/editor/project.cpp @@ -2,6 +2,7 @@ #include +#include #include #include #include @@ -60,6 +61,9 @@ Project::Project(const std::string &path) { json j = json::parse(jsonContent); this->projectTitle = j.at("title"); + this->windowSize = {j.at("windowSize")[0], j.at("windowSize")[1]}; + this->programIconPath = j.at("programIcon"); + this->windowResizeableFlag = j.at("windowResizeable"); ChangeDirectory(projectPath.c_str()); UnloadFileText(jsonContent); @@ -68,6 +72,8 @@ Project::Project(const std::string &path) { std::string Project::create(const std::string &dirPath, const std::string &title) { json j = json::object(); j["title"] = title; + j["windowSize"] = std::array({640, 480}); + j["programIcon"] = ""; std::string fileContent = j.dump(); std::filesystem::path filePath = dirPath; @@ -96,6 +102,9 @@ void Project::openProject(const tgui::String &filePath, bool forceSwitch) { json Project::toJson() { json j = json::object(); j["title"] = projectTitle; + j["windowSize"] = {windowSize.x, windowSize.y}; + j["programIcon"] = programIconPath; + j["windowResizeable"] = windowResizeableFlag; return j; } @@ -104,6 +113,18 @@ std::string &Project::getTitle() { return projectTitle; } void Project::setTitle(const std::string &newTitle) { projectTitle = newTitle; } +IVector Project::getWindowSize() { return windowSize; } + +void Project::setWindowSize(IVector newWindowSize) { windowSize = newWindowSize; } + +std::string &Project::getProgramIconPath() { return programIconPath; } + +void Project::setProgramIconPath(const std::string &newProgramIconPath) { programIconPath = newProgramIconPath; } + +bool Project::isWindowResizeable() { return windowResizeableFlag; } + +void Project::setIsWindowResizeable(bool value) { windowResizeableFlag = value; } + std::string &Project::getBasePath() { return projectPath; } std::vector Project::getPaths(EngineFileType fileType) { From 59f3acdfdfe6976a0705c5b4ea069660d46c2661 Mon Sep 17 00:00:00 2001 From: thefirey33 Date: Sun, 12 Apr 2026 19:56:13 +0300 Subject: [PATCH 20/69] Allow users to preview what their Props will actually look like in PropFileView. --- .../editor/components/resizableCanvasBox.hpp | 2 + include/editor/fileViews/propFileView.hpp | 3 ++ include/editor/views/propPreview.hpp | 33 +++++++++++++ include/editor/views/propView.hpp | 3 ++ resources/translations/en_us.json | 2 +- src/editor/components/resizableCanvasBox.cpp | 2 + src/editor/fileViews/actorFileView.cpp | 3 +- src/editor/fileViews/propFileView.cpp | 16 +++++++ src/editor/views/propPreview.cpp | 48 +++++++++++++++++++ src/editor/views/propView.cpp | 15 ++++++ src/editor/views/worldView.cpp | 5 +- 11 files changed, 128 insertions(+), 4 deletions(-) create mode 100644 include/editor/views/propPreview.hpp create mode 100644 src/editor/views/propPreview.cpp diff --git a/include/editor/components/resizableCanvasBox.hpp b/include/editor/components/resizableCanvasBox.hpp index e49bb87e..228b05f9 100644 --- a/include/editor/components/resizableCanvasBox.hpp +++ b/include/editor/components/resizableCanvasBox.hpp @@ -19,6 +19,8 @@ class ResizableCanvasBox { // @returns the new rectangle after the mouse is released Rectangle leftMouseReleased(Vector2 mousePos); + Rectangle getRectangle(); + void updatePosition(float x, float y); void updateSize(float width, float height); void updateColor(Color color); diff --git a/include/editor/fileViews/propFileView.hpp b/include/editor/fileViews/propFileView.hpp index 91b013c4..dcf933bf 100644 --- a/include/editor/fileViews/propFileView.hpp +++ b/include/editor/fileViews/propFileView.hpp @@ -3,6 +3,7 @@ #include "fileView.hpp" #include "variant.hpp" +#include "views/propPreview.hpp" #include "views/propView.hpp" #include "widgets/propertyFields/boolField.hpp" #include "widgets/propertyFields/fileField.hpp" @@ -18,6 +19,8 @@ class PropFileView : public FileView { private: void handleModePress(tgui::Vector2f pos); PropView::Ptr propView; + PropPreview::Ptr propPreview; + static const int RIGHT_PANEL_W = 300; BoolField::Ptr hasInteractableField; diff --git a/include/editor/views/propPreview.hpp b/include/editor/views/propPreview.hpp new file mode 100644 index 00000000..b75b0972 --- /dev/null +++ b/include/editor/views/propPreview.hpp @@ -0,0 +1,33 @@ +#ifndef _RPGPP_ACTORPREVIEWVIEW_HPP +#define _RPGPP_ACTORPREVIEWVIEW_HPP + +#include + +#include "components/resizableCanvasBox.hpp" +#include "prop.hpp" +#include "views/worldView.hpp" + +class PropFileView; + +class PropPreview : public WorldView { +private: + Prop *prop{nullptr}; + bool isOverBounds{false}; + ResizableCanvasBox *referenceToBox{nullptr}; + +public: + PropPreview(); + + typedef std::shared_ptr Ptr; + + void setProp(Prop *prop); + void setBox(ResizableCanvasBox *box); + + void drawCanvas() override; + void drawOverlay() override; + + static PropPreview::Ptr create(); + static PropPreview::Ptr create(Prop *prop); +}; + +#endif \ No newline at end of file diff --git a/include/editor/views/propView.hpp b/include/editor/views/propView.hpp index d4e3fe3f..7bda0721 100644 --- a/include/editor/views/propView.hpp +++ b/include/editor/views/propView.hpp @@ -2,6 +2,7 @@ #define _RPGPP_PROPVIEWER_H #include #include +#include #include "TGUI/Signal.hpp" #include "components/resizableCanvasBox.hpp" @@ -30,6 +31,8 @@ class PropView : public WorldView { void mouseMoved(tgui::Vector2f pos) override; void leftMouseReleased(tgui::Vector2f pos) override; + std::optional getAtlasRect(); + void updateAtlasRect(Rectangle r); void updateCollisionRect(Rectangle r); diff --git a/resources/translations/en_us.json b/resources/translations/en_us.json index 7932a940..4fb80d69 100644 --- a/resources/translations/en_us.json +++ b/resources/translations/en_us.json @@ -152,4 +152,4 @@ "restart": "Restart", "restart_later": "Restart Later" } -} +} \ No newline at end of file diff --git a/src/editor/components/resizableCanvasBox.cpp b/src/editor/components/resizableCanvasBox.cpp index 66c5e844..c3da9fbb 100644 --- a/src/editor/components/resizableCanvasBox.cpp +++ b/src/editor/components/resizableCanvasBox.cpp @@ -32,6 +32,8 @@ void ResizableCanvasBox::updateRec(Rectangle rec) { this->height = rec.height; } +Rectangle ResizableCanvasBox::getRectangle() { return {this->x, this->y, this->width, this->height}; } + bool ResizableCanvasBox::leftMousePressed(Vector2 mousePos) { resizeDirection = NONE; diff --git a/src/editor/fileViews/actorFileView.cpp b/src/editor/fileViews/actorFileView.cpp index b81c7a7b..591aef44 100644 --- a/src/editor/fileViews/actorFileView.cpp +++ b/src/editor/fileViews/actorFileView.cpp @@ -1,5 +1,3 @@ -// TODO: Timeline, where the user can add frames and remove them. - #include "fileViews/actorFileView.hpp" #include "TGUI/String.hpp" @@ -10,6 +8,7 @@ #include "raylib.h" #include "services/translationService.hpp" #include "views/actorView.hpp" +#include "views/propPreview.hpp" #include "widgets/frameEditor.hpp" #include "widgets/propertiesBox.hpp" #include "widgets/propertyFields/fileField.hpp" diff --git a/src/editor/fileViews/propFileView.cpp b/src/editor/fileViews/propFileView.cpp index b9115f22..3441df9d 100644 --- a/src/editor/fileViews/propFileView.cpp +++ b/src/editor/fileViews/propFileView.cpp @@ -7,7 +7,9 @@ #include "prop.hpp" #include "raylib.h" #include "variant.hpp" +#include "views/propPreview.hpp" #include "views/propView.hpp" +#include "views/worldView.hpp" #include "widgets/propertiesBox.hpp" #include "widgets/propertyFields/boolField.hpp" #include "widgets/propertyFields/fileField.hpp" @@ -63,6 +65,13 @@ PropFileView::PropFileView() { collisionsField->onChange([this](Rectangle r) { propView->updateCollisionRect(r); }); propBox->addRectangleField(collisionsField); + propPreview = PropPreview::create(); + Editor::instance->getGui().addUpdate(WorldView::asUpdatable(propPreview)); + propPreview->setSize({"100%", "30%"}); + propPreview->setPosition({"0%", "50%"}); + propPreview->setOrigin({0, 0.5}); + propBox->add(propPreview); + propView->onUpdatedAtlasRect([this](Rectangle r) { atlasRectField->setValue(r); }); propView->onUpdatedCollisionRect([this](Rectangle r) { collisionsField->setValue(r); }); widgetContainer.push_back(propBox); @@ -86,5 +95,12 @@ void PropFileView::init(tgui::Group::Ptr layout, VariantWrapper *variant) { collisionsField->setValue(prop->getCollisionRect()); interactableTypeField->value->setSelectedItem(prop->getInteractableType()); interactableTypeField->setEnabled(prop->getHasInteractable()); + + propPreview->setProp(prop); + auto val = propView->getAtlasRect(); + if (val.has_value()) { + propPreview->setBox(val.value()); + } + addWidgets(layout); } diff --git a/src/editor/views/propPreview.cpp b/src/editor/views/propPreview.cpp new file mode 100644 index 00000000..f53a006b --- /dev/null +++ b/src/editor/views/propPreview.cpp @@ -0,0 +1,48 @@ +#include "views/propPreview.hpp" + +#include + +#include "components/resizableCanvasBox.hpp" +#include "editor.hpp" +#include "prop.hpp" +#include "raylib.h" +#include "services/translationService.hpp" + +constexpr float MAX_BLINK_FREQ = 30; +constexpr int FONT_SIZE = 18; +constexpr Color OVER_BOUNDS_COLOR = {255, 255, 255, 200}; + +PropPreview::PropPreview() { camera.zoom = 3; } + +void PropPreview::setProp(Prop *prop) { this->prop = prop; } + +void PropPreview::setBox(ResizableCanvasBox *box) { this->referenceToBox = box; } + +void PropPreview::drawCanvas() { + ClearBackground(WHITE); + TranslationService &ts = Editor::instance->getTranslations(); + + auto texture = prop->getTexture(); + auto atlasRect = prop->getAtlasRect(); + auto boxRect = referenceToBox->getRectangle(); + + this->isOverBounds = ((boxRect.x + boxRect.width > texture.width || boxRect.y + boxRect.height > texture.height) || + (boxRect.x < 0 || boxRect.y < 0)); + drawOrigin(); + DrawTexturePro(texture, boxRect, {0, 0, boxRect.width, boxRect.height}, {0, 0}, 0, + {255, 255, 255, static_cast(isOverBounds ? 100 : 255)}); +} + +void PropPreview::drawOverlay() { + if (this->isOverBounds) DrawText("Over bounds!", 0, 0, FONT_SIZE, RED); + + DrawText("Preview", 0, this->getSize().y - FONT_SIZE, FONT_SIZE, BLACK); +} + +PropPreview::Ptr PropPreview::create() { return std::make_shared(); } + +PropPreview::Ptr PropPreview::create(Prop *prop) { + auto ptr = std::make_shared(); + ptr->setProp(prop); + return ptr; +} \ No newline at end of file diff --git a/src/editor/views/propView.cpp b/src/editor/views/propView.cpp index 18a53b1b..3c2d80cf 100644 --- a/src/editor/views/propView.cpp +++ b/src/editor/views/propView.cpp @@ -1,6 +1,7 @@ #include "views/propView.hpp" #include +#include #include "components/resizableCanvasBox.hpp" #include "prop.hpp" @@ -112,6 +113,20 @@ void PropView::updateAtlasRect(Rectangle r) { p->setAtlasRect(r); } +std::optional PropView::getAtlasRect() { + // NOTE: Can we please switch to an std::map based system? + + // please? + + if (this->p == nullptr) return std::nullopt; + for (auto &box : boxes) { + if (box.id == rectTypeToStr(RectType::ATLAS_RECT)) { + return &box; + } + } + return std::nullopt; +} + void PropView::updateCollisionRect(Rectangle r) { if (this->p == nullptr) return; for (auto &box : boxes) { diff --git a/src/editor/views/worldView.cpp b/src/editor/views/worldView.cpp index d50ff46b..6420c618 100644 --- a/src/editor/views/worldView.cpp +++ b/src/editor/views/worldView.cpp @@ -8,6 +8,7 @@ #include #include "TGUI/Backend/Renderer/Raylib/CanvasRaylib.hpp" +#include "TGUI/Cursor.hpp" #include "TGUI/Event.hpp" #include "TGUI/Vector2.hpp" #include "TGUI/Widget.hpp" @@ -68,7 +69,7 @@ void WorldView::mouseMoved(tgui::Vector2f pos) { tgui::Widget::mouseMoved(pos); } -constexpr int MAXIMUM_LINE = 10000; +constexpr int MAXIMUM_LINE = 100; void WorldView::drawOrigin() { // since this function is used to draw the origin x-y axis, it's been moved @@ -114,6 +115,8 @@ bool WorldView::canGainFocus() const { return true; } void WorldView::update() { mouseMiddleButton = IsMouseButtonDown(MOUSE_MIDDLE_BUTTON); + setMouseCursor(mouseMiddleButton ? tgui::Cursor::Type::Move : tgui::Cursor::Type::Arrow); + BeginTextureMode(m_textureTarget); BeginMode2D(camera); From d2e75710879f6b10ddb2e66080a6e6f041eda700 Mon Sep 17 00:00:00 2001 From: thefirey33 Date: Sun, 12 Apr 2026 20:04:56 +0300 Subject: [PATCH 21/69] Update the Turkish Translation. --- resources/translations/tr.json | 8 ++++++++ src/editor/project.cpp | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/resources/translations/tr.json b/resources/translations/tr.json index c3dcc0e3..058d611c 100644 --- a/resources/translations/tr.json +++ b/resources/translations/tr.json @@ -105,6 +105,14 @@ "play": "Oyna", "build": "Derle" } + }, + "project_options": { + "program": { + "_label": "Uygulama" + }, + "game": { + "_label": "Oyun" + } } }, "dialog": { diff --git a/src/editor/project.cpp b/src/editor/project.cpp index 3713b1d4..d7176d3a 100644 --- a/src/editor/project.cpp +++ b/src/editor/project.cpp @@ -656,7 +656,7 @@ void Project::buildProject() { dup2(fd, STDOUT_FILENO); - execl(resultPath.c_str(), NULL); + execl(resultPath.c_str(), ""); } else if (pid > 0) { printf("Started the game.. \n"); wait(0); From 843ca284b99dc55ce9801e7d201e9aab7e1cdf26 Mon Sep 17 00:00:00 2001 From: "D. Quan" <60545346+sudoker0@users.noreply.github.com> Date: Mon, 13 Apr 2026 15:07:32 +0700 Subject: [PATCH 22/69] Bind translations and improve Vietnamese translations --- resources/translations/en_us.json | 9 +++++++-- resources/translations/vn.json | 15 ++++++++++++++- .../childWindows/projectSettingsPanel/project.cpp | 10 +++++----- src/editor/childWindows/projectSettingsWindow.cpp | 3 ++- src/editor/views/propPreview.cpp | 4 ++-- 5 files changed, 30 insertions(+), 11 deletions(-) diff --git a/resources/translations/en_us.json b/resources/translations/en_us.json index 78ac19fa..6c8eb68a 100644 --- a/resources/translations/en_us.json +++ b/resources/translations/en_us.json @@ -132,7 +132,12 @@ }, "project_settings": { "_label": "Project Settings", - "title": "Title" + "title": "Title", + "program_icon": "Program Icon", + "window_width": "Window Width", + "window_height": "Window Height", + "is_resizable": "Is window Resizable?", + "save": "Save" }, "new_prop": { "title": "New Prop", @@ -160,4 +165,4 @@ "restart": "Restart", "restart_later": "Restart Later" } -} \ No newline at end of file +} diff --git a/resources/translations/vn.json b/resources/translations/vn.json index 24eeee2c..be4ccaa9 100644 --- a/resources/translations/vn.json +++ b/resources/translations/vn.json @@ -111,6 +111,14 @@ "play": "Chạy chương trình", "build": "Dịch và tạo chương trình" } + }, + "project_options": { + "program": { + "_label": "Phần mềm" + }, + "game": { + "_label": "Trò chơi" + } } }, @@ -132,7 +140,12 @@ }, "project_settings": { "_label": "Cấu hình dự án", - "title": "Tên dự án" + "title": "Tên dự án", + "program_icon": "Biểu tượng", + "window_width": "Chiều rộng cửa sổ", + "window_height": "Chiều cao cửa sổ", + "is_resizable": "Cửa sổ có thể thay đổi kích cỡ?", + "save": "Lưu" }, "new_prop": { "title": "Tạo Prop mới", diff --git a/src/editor/childWindows/projectSettingsPanel/project.cpp b/src/editor/childWindows/projectSettingsPanel/project.cpp index de554cbc..1d59c2ad 100644 --- a/src/editor/childWindows/projectSettingsPanel/project.cpp +++ b/src/editor/childWindows/projectSettingsPanel/project.cpp @@ -36,7 +36,7 @@ ProjectSettingsPanelProgram::ProjectSettingsPanelProgram(tgui::TabContainer::Ptr programIcon = FileField::create(); programIcon->setSize({"100%", 24}); programIcon->pathFilters = {{"Image", {"*.png", "*.jpg"}}}; - programIcon->label->setText("Program Icon"); + bindTranslation(programIcon->label, "dialog.project_settings.program_icon", &tgui::Label::setText); programIcon->callback = [](const tgui::String &path) { Project *project = Editor::instance->getProject(); if (project != nullptr) { @@ -46,7 +46,7 @@ ProjectSettingsPanelProgram::ProjectSettingsPanelProgram(tgui::TabContainer::Ptr windowSizeX = IntField::create(); windowSizeX->setSize({"100%", 24}); - windowSizeX->label->setText("Window Width"); + bindTranslation(windowSizeX->label, "dialog.project_settings.window_width", &tgui::Label::setText); windowSizeX->value->setMinimum(640); windowSizeX->value->setMaximum(1920); windowSizeX->value->onValueChange([](int value) { @@ -60,7 +60,7 @@ ProjectSettingsPanelProgram::ProjectSettingsPanelProgram(tgui::TabContainer::Ptr windowSizeY = IntField::create(); windowSizeY->setSize({"100%", 24}); - windowSizeY->label->setText("Window Height"); + bindTranslation(windowSizeY->label, "dialog.project_settings.window_height", &tgui::Label::setText); windowSizeY->value->setMinimum(480); windowSizeY->value->setMaximum(1080); windowSizeY->value->onValueChange([](int value) { @@ -74,7 +74,7 @@ ProjectSettingsPanelProgram::ProjectSettingsPanelProgram(tgui::TabContainer::Ptr resizeable = BoolField::create(); resizeable->setSize({"100%", 24}); - resizeable->label->setText("Window Resizeable?"); + bindTranslation(resizeable->label, "dialog.project_settings.is_resizable", &tgui::Label::setText); resizeable->value->onChange([](bool value) { Project *project = Editor::instance->getProject(); project->setIsWindowResizeable(value); @@ -100,4 +100,4 @@ void ProjectSettingsPanelProgram::setup(Project *project) { windowSizeX->value->setValue(project->getWindowSize().x); windowSizeY->value->setValue(project->getWindowSize().y); -} \ No newline at end of file +} diff --git a/src/editor/childWindows/projectSettingsWindow.cpp b/src/editor/childWindows/projectSettingsWindow.cpp index bf7aa9ce..68afff67 100644 --- a/src/editor/childWindows/projectSettingsWindow.cpp +++ b/src/editor/childWindows/projectSettingsWindow.cpp @@ -21,7 +21,8 @@ ProjectSettingsWindow::ProjectSettingsWindow() : PopupWindow("ProjectSettings") tabContainer->setPosition(0, 0); tabContainer->setSize({"100%", "100% - 36"}); - auto saveButton = tgui::Button::create("Save"); + auto saveButton = tgui::Button::create(); + bindTranslation(saveButton, "dialog.project_settings.save", &tgui::Button::setText); saveButton->setPosition(2, "100% - 32"); saveButton->setSize("100% - 4", 30); saveButton->onClick([] { diff --git a/src/editor/views/propPreview.cpp b/src/editor/views/propPreview.cpp index f53a006b..d5f4c77d 100644 --- a/src/editor/views/propPreview.cpp +++ b/src/editor/views/propPreview.cpp @@ -34,7 +34,7 @@ void PropPreview::drawCanvas() { } void PropPreview::drawOverlay() { - if (this->isOverBounds) DrawText("Over bounds!", 0, 0, FONT_SIZE, RED); + if (this->isOverBounds) DrawText("Out of bounds!", 0, 0, FONT_SIZE, RED); DrawText("Preview", 0, this->getSize().y - FONT_SIZE, FONT_SIZE, BLACK); } @@ -45,4 +45,4 @@ PropPreview::Ptr PropPreview::create(Prop *prop) { auto ptr = std::make_shared(); ptr->setProp(prop); return ptr; -} \ No newline at end of file +} From 6cbe4d851e50f0aef4873c6a67d54a8a85f9266b Mon Sep 17 00:00:00 2001 From: "D. Quan" <60545346+sudoker0@users.noreply.github.com> Date: Mon, 13 Apr 2026 15:19:41 +0700 Subject: [PATCH 23/69] UI tweaks to translationn checker --- tools/translation_checker/checker.lua | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tools/translation_checker/checker.lua b/tools/translation_checker/checker.lua index e40ff711..9130858e 100644 --- a/tools/translation_checker/checker.lua +++ b/tools/translation_checker/checker.lua @@ -60,36 +60,36 @@ local function _CompareTranslation(base, target, filename) local translatedCnt = tableLength(base) - tableLength(missing) - tableLength(untranslated) local percent = translatedCnt / tableLength(base) * 100 - print("\n" .. "===" .. filename .. "===") - print("Completion: " .. percent .. "%") + print("\n" .. target["language"] .. " (" .. filename .. ")\n" .. "--------") + print("Completion: " .. string.format("%.2f", percent) .. "%") table.sort(missing) table.sort(extra) table.sort(untranslated) if #missing ~= 0 then - print("\n" .. "Missing keys (should be added):") + print("Missing keys (should be added):") for _, k in ipairs(missing) do print(" - " .. k) end end if #untranslated ~= 0 then - print("\n" .. "Untranslated keys (same as base):") + print("Untranslated keys (same as base):") for _, k in ipairs(untranslated) do print(" - " .. k) end end if #extra ~= 0 then - print("\n" .. "Extra keys (should be removed):") + print("Extra keys (should be removed):") for _, k in ipairs(extra) do print(" - " .. k) end end if #missing == 0 and #untranslated == 0 and #extra == 0 then - print("\n" .. "Translation is up to date!") + print("Translation is up to date!") end end From c7e4e4b8302f1f0a7e5cebb4caa19589c553c4b8 Mon Sep 17 00:00:00 2001 From: CDevv Date: Mon, 13 Apr 2026 12:00:42 +0300 Subject: [PATCH 24/69] Project Settings being applied + Game category of Project settings. --- .../projectSettingsPanel/game.hpp | 7 +++ include/editor/project.hpp | 19 +++---- include/gamedata.hpp | 15 ++++++ .../projectSettingsPanel/game.cpp | 54 +++++++++++++++++++ .../projectSettingsPanel/project.cpp | 29 +++++----- .../childWindows/projectSettingsWindow.cpp | 1 + src/editor/project.cpp | 54 +++++++++---------- src/editor/screens/projectScreen.cpp | 2 +- src/game.cpp | 28 +++++++++- src/gamedata.cpp | 13 ++++- src/room.cpp | 9 +++- 11 files changed, 174 insertions(+), 57 deletions(-) diff --git a/include/editor/childWindows/projectSettingsPanel/game.hpp b/include/editor/childWindows/projectSettingsPanel/game.hpp index 7794b746..97a9266c 100644 --- a/include/editor/childWindows/projectSettingsPanel/game.hpp +++ b/include/editor/childWindows/projectSettingsPanel/game.hpp @@ -2,10 +2,17 @@ #define _RPGPP_PROJECTSETTINGSPANEL_GAME_H #include "childWindows/settingsPanel/base.hpp" +#include "widgets/propertyFields/fileField.hpp" +#include "widgets/propertyFields/intField.hpp" class ProjectSettingsPanelGame : public SettingsPanelBase { public: + FileField::Ptr defaultRoom; + FileField::Ptr playerActor; + IntField::Ptr tileSize; + ProjectSettingsPanelGame(tgui::TabContainer::Ptr tabContainer); + void setup(Project *project); }; #endif \ No newline at end of file diff --git a/include/editor/project.hpp b/include/editor/project.hpp index 39e8d8d6..f7bb4fbe 100644 --- a/include/editor/project.hpp +++ b/include/editor/project.hpp @@ -15,24 +15,19 @@ using json = nlohmann::json; class Project { private: std::string projectPath; - std::string projectTitle; - IVector windowSize = {640, 480}; - std::string programIconPath = ""; - bool windowResizeableFlag = false; + ProjectProgramSettings programSet; + ProjectGameSettings gameSet; public: + Project() = default; Project(const std::string &path); static std::string create(const std::string &dirPath, const std::string &title); static void openProject(const tgui::String &filePath, bool forceSwitch = false); json toJson(); - std::string &getTitle(); - void setTitle(const std::string &newTitle); - IVector getWindowSize(); - void setWindowSize(IVector newWindowSize); - std::string &getProgramIconPath(); - void setProgramIconPath(const std::string &newProgramIconPath); - bool isWindowResizeable(); - void setIsWindowResizeable(bool value); + + ProjectProgramSettings &getProgramSettings(); + ProjectGameSettings &getGameSettings(); + std::string &getBasePath(); std::vector getPaths(EngineFileType fileType); std::string getResourcePath(EngineFileType fileType, const std::string &fileName); diff --git a/include/gamedata.hpp b/include/gamedata.hpp index c7491d02..7d90b776 100644 --- a/include/gamedata.hpp +++ b/include/gamedata.hpp @@ -138,8 +138,23 @@ struct GameBinSettings { std::string playerActor; }; +struct ProjectProgramSettings { + std::string projectTitle; + IVector windowSize = {640, 480}; + std::string programIconPath = ""; + bool windowResizeableFlag = false; +}; + +struct ProjectGameSettings { + std::string defaultRoomPath; + std::string playerActorPath; + int tileSize = 16; +}; + struct GameData { std::string title; + ProjectProgramSettings programSet; + ProjectGameSettings gameSet; std::map fonts; std::map images; std::map tilesets; diff --git a/src/editor/childWindows/projectSettingsPanel/game.cpp b/src/editor/childWindows/projectSettingsPanel/game.cpp index a3015251..2157c143 100644 --- a/src/editor/childWindows/projectSettingsPanel/game.cpp +++ b/src/editor/childWindows/projectSettingsPanel/game.cpp @@ -1,8 +1,13 @@ #include "childWindows/projectSettingsPanel/game.hpp" +#include "TGUI/String.hpp" #include "TGUI/Widgets/GrowVerticalLayout.hpp" #include "TGUI/Widgets/ScrollablePanel.hpp" #include "childWindows/settingsPanel/base.hpp" +#include "project.hpp" +#include "raylib.h" +#include "widgets/propertyFields/fileField.hpp" +#include "widgets/propertyFields/intField.hpp" ProjectSettingsPanelGame::ProjectSettingsPanelGame(tgui::TabContainer::Ptr tabContainer) : SettingsPanelBase(tabContainer, "screen.project_options.game._label") { @@ -16,6 +21,55 @@ ProjectSettingsPanelGame::ProjectSettingsPanelGame(tgui::TabContainer::Ptr tabCo layout->setOrigin({0.5, 0}); layout->getRenderer()->setSpaceBetweenWidgets(10.0f); + defaultRoom = FileField::create(); + defaultRoom->setSize({"100%", 24}); + defaultRoom->pathFilters = {{"RPG++ Room", {"*.rmap"}}}; + defaultRoom->label->setText("Default Room"); + defaultRoom->callback = [](const tgui::String &path) { + Project *project = Editor::instance->getProject(); + if (project != nullptr) { + project->getGameSettings().defaultRoomPath = + TextFormat("rooms/%s", GetFileName(path.toStdString().c_str())); + } + }; + + playerActor = FileField::create(); + playerActor->setSize({"100%", 24}); + playerActor->pathFilters = {{"RPG++ Actor", {"*.ractor"}}}; + playerActor->label->setText("Player Actor"); + playerActor->callback = [](const tgui::String &path) { + Project *project = Editor::instance->getProject(); + if (project != nullptr) { + project->getGameSettings().playerActorPath = + TextFormat("actors/%s", GetFileName(path.toStdString().c_str())); + } + }; + + tileSize = IntField::create(); + tileSize->setSize({"100%", 24}); + tileSize->value->setMinimum(16); + tileSize->value->setMaximum(64); + tileSize->value->onValueChange([](int value) { + Project *project = Editor::instance->getProject(); + if (project != nullptr) { + project->getGameSettings().tileSize = value; + } + }); + + layout->add(defaultRoom); + layout->add(playerActor); + layout->add(tileSize); + scrollPanel->add(layout); panel->add(scrollPanel); +} + +void ProjectSettingsPanelGame::setup(Project *project) { + if (project == nullptr) return; + + auto &gameSet = project->getGameSettings(); + + defaultRoom->value->setText(GetFileName(gameSet.defaultRoomPath.c_str())); + playerActor->value->setText(GetFileName(gameSet.playerActorPath.c_str())); + tileSize->value->setValue(gameSet.tileSize); } \ No newline at end of file diff --git a/src/editor/childWindows/projectSettingsPanel/project.cpp b/src/editor/childWindows/projectSettingsPanel/project.cpp index de554cbc..5da5ddf9 100644 --- a/src/editor/childWindows/projectSettingsPanel/project.cpp +++ b/src/editor/childWindows/projectSettingsPanel/project.cpp @@ -29,7 +29,7 @@ ProjectSettingsPanelProgram::ProjectSettingsPanelProgram(tgui::TabContainer::Ptr titleField->value->onTextChange([](const tgui::String &text) { Project *project = Editor::instance->getProject(); if (project != nullptr) { - project->setTitle(text.toStdString()); + project->getProgramSettings().projectTitle = text.toStdString(); } }); @@ -40,7 +40,8 @@ ProjectSettingsPanelProgram::ProjectSettingsPanelProgram(tgui::TabContainer::Ptr programIcon->callback = [](const tgui::String &path) { Project *project = Editor::instance->getProject(); if (project != nullptr) { - project->setProgramIconPath(TextFormat("images/%s", GetFileName(path.toStdString().c_str()))); + project->getProgramSettings().programIconPath = + TextFormat("images/%s", GetFileName(path.toStdString().c_str())); } }; @@ -52,9 +53,9 @@ ProjectSettingsPanelProgram::ProjectSettingsPanelProgram(tgui::TabContainer::Ptr windowSizeX->value->onValueChange([](int value) { Project *project = Editor::instance->getProject(); if (project != nullptr) { - auto windowSize = project->getWindowSize(); + auto windowSize = project->getProgramSettings().windowSize; windowSize.x = value; - project->setWindowSize(windowSize); + project->getProgramSettings().windowSize = windowSize; } }); @@ -66,9 +67,9 @@ ProjectSettingsPanelProgram::ProjectSettingsPanelProgram(tgui::TabContainer::Ptr windowSizeY->value->onValueChange([](int value) { Project *project = Editor::instance->getProject(); if (project != nullptr) { - auto windowSize = project->getWindowSize(); + auto windowSize = project->getProgramSettings().windowSize; windowSize.y = value; - project->setWindowSize(windowSize); + project->getProgramSettings().windowSize = windowSize; } }); @@ -77,7 +78,7 @@ ProjectSettingsPanelProgram::ProjectSettingsPanelProgram(tgui::TabContainer::Ptr resizeable->label->setText("Window Resizeable?"); resizeable->value->onChange([](bool value) { Project *project = Editor::instance->getProject(); - project->setIsWindowResizeable(value); + project->getProgramSettings().windowResizeableFlag = value; }); layout->add(titleField); @@ -93,11 +94,15 @@ ProjectSettingsPanelProgram::ProjectSettingsPanelProgram(tgui::TabContainer::Ptr void ProjectSettingsPanelProgram::setup(Project *project) { if (project == nullptr) return; - titleField->value->setText(project->getTitle()); - if (!project->getProgramIconPath().empty()) { - programIcon->value->setText(GetFileName(project->getProgramIconPath().c_str())); + auto &programSet = project->getProgramSettings(); + + titleField->value->setText(programSet.projectTitle); + if (!programSet.programIconPath.empty()) { + programIcon->value->setText(GetFileName(programSet.programIconPath.c_str())); } - windowSizeX->value->setValue(project->getWindowSize().x); - windowSizeY->value->setValue(project->getWindowSize().y); + windowSizeX->value->setValue(programSet.windowSize.x); + windowSizeY->value->setValue(programSet.windowSize.y); + + resizeable->value->setChecked(programSet.windowResizeableFlag); } \ No newline at end of file diff --git a/src/editor/childWindows/projectSettingsWindow.cpp b/src/editor/childWindows/projectSettingsWindow.cpp index bf7aa9ce..9e772bd9 100644 --- a/src/editor/childWindows/projectSettingsWindow.cpp +++ b/src/editor/childWindows/projectSettingsWindow.cpp @@ -48,6 +48,7 @@ void ProjectSettingsWindow::open() { Project *project = Editor::instance->getProject(); program->setup(project); + game->setup(project); PopupWindow::open(); } diff --git a/src/editor/project.cpp b/src/editor/project.cpp index d7176d3a..7709ee88 100644 --- a/src/editor/project.cpp +++ b/src/editor/project.cpp @@ -60,20 +60,21 @@ Project::Project(const std::string &path) { char *jsonContent = LoadFileText(path.c_str()); json j = json::parse(jsonContent); - this->projectTitle = j.at("title"); - this->windowSize = {j.at("windowSize")[0], j.at("windowSize")[1]}; - this->programIconPath = j.at("programIcon"); - this->windowResizeableFlag = j.at("windowResizeable"); + programSet.projectTitle = j.at("title"); + programSet.windowSize = {j.at("windowSize")[0], j.at("windowSize")[1]}; + programSet.programIconPath = j.at("programIcon"); + programSet.windowResizeableFlag = j.at("windowResizeable"); + + gameSet.defaultRoomPath = j.at("defaultRoom"); + gameSet.playerActorPath = j.at("playerActor"); + gameSet.tileSize = j.at("tileSize"); ChangeDirectory(projectPath.c_str()); UnloadFileText(jsonContent); } std::string Project::create(const std::string &dirPath, const std::string &title) { - json j = json::object(); - j["title"] = title; - j["windowSize"] = std::array({640, 480}); - j["programIcon"] = ""; + json j = Project().toJson(); std::string fileContent = j.dump(); std::filesystem::path filePath = dirPath; @@ -101,29 +102,22 @@ void Project::openProject(const tgui::String &filePath, bool forceSwitch) { json Project::toJson() { json j = json::object(); - j["title"] = projectTitle; - j["windowSize"] = {windowSize.x, windowSize.y}; - j["programIcon"] = programIconPath; - j["windowResizeable"] = windowResizeableFlag; - - return j; -} -std::string &Project::getTitle() { return projectTitle; } + j["title"] = programSet.projectTitle; + j["windowSize"] = {programSet.windowSize.x, programSet.windowSize.y}; + j["programIcon"] = programSet.programIconPath; + j["windowResizeable"] = programSet.windowResizeableFlag; -void Project::setTitle(const std::string &newTitle) { projectTitle = newTitle; } + j["defaultRoom"] = gameSet.defaultRoomPath; + j["tileSize"] = gameSet.tileSize; + j["playerActor"] = gameSet.playerActorPath; -IVector Project::getWindowSize() { return windowSize; } - -void Project::setWindowSize(IVector newWindowSize) { windowSize = newWindowSize; } - -std::string &Project::getProgramIconPath() { return programIconPath; } - -void Project::setProgramIconPath(const std::string &newProgramIconPath) { programIconPath = newProgramIconPath; } + return j; +} -bool Project::isWindowResizeable() { return windowResizeableFlag; } +ProjectProgramSettings &Project::getProgramSettings() { return programSet; } -void Project::setIsWindowResizeable(bool value) { windowResizeableFlag = value; } +ProjectGameSettings &Project::getGameSettings() { return gameSet; } std::string &Project::getBasePath() { return projectPath; } @@ -193,7 +187,9 @@ std::vector Project::getPropsNames() { GameData Project::generateStruct() { GameData data; - data.title = projectTitle; + data.title = programSet.projectTitle; + data.programSet = programSet; + data.gameSet = gameSet; for (auto tileSetPath : getPaths(EngineFileType::FILE_TILESET)) { TileSet tileSet(tileSetPath); @@ -606,10 +602,10 @@ void Project::buildProject() { #ifdef _WIN64 baseGamePath /= "game.exe"; - resultPath /= TextFormat("%s.exe", projectTitle.c_str()); + resultPath /= TextFormat("%s.exe", programSet.projectTitle.c_str()); #else baseGamePath /= "game"; - resultPath /= projectTitle; + resultPath /= programSet.projectTitle; #endif try { diff --git a/src/editor/screens/projectScreen.cpp b/src/editor/screens/projectScreen.cpp index 954fe2fa..10b477e7 100644 --- a/src/editor/screens/projectScreen.cpp +++ b/src/editor/screens/projectScreen.cpp @@ -242,7 +242,7 @@ tgui::Group::Ptr ProjectScreen::createToolBar() { assert(project && "project isn't instanciated (nullptr)"); - projectLabel->setText(project->getTitle()); + projectLabel->setText(project->getProgramSettings().projectTitle); toolBar->add(projectLabel, "projectLabel"); diff --git a/src/game.cpp b/src/game.cpp index 1599fde9..9523a6fd 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -59,9 +59,35 @@ void Game::useBin(const std::string &filePath) { UnloadImage(image); } + /// Setup program SetWindowTitle(gameData->title.c_str()); + SetWindowSize(gameData->programSet.windowSize.x, gameData->programSet.windowSize.y); + if (gameData->programSet.windowResizeableFlag) { + SetWindowState(FLAG_WINDOW_RESIZABLE); + } else { + ClearWindowState(FLAG_WINDOW_RESIZABLE); + } + + auto iconTexture = resources->getTexture(GetFileName(gameData->programSet.programIconPath.c_str())); + Image iconImage = LoadImageFromTexture(iconTexture); + + SetWindowIcon(iconImage); - world->setRoomBin(gameData->rooms.at(0)); + UnloadImage(iconImage); + /// + + /// Select the default room from the settings + if (gameData->gameSet.defaultRoomPath.empty()) { + world->setRoomBin(gameData->rooms.at(0)); + } else { + std::string chosenName = GetFileNameWithoutExt(gameData->gameSet.defaultRoomPath.c_str()); + for (auto &room : gameData->rooms) { + if (room.name == chosenName) { + world->setRoomBin(room); + break; + } + } + } } GameData &Game::getBin() { return *gameData; } diff --git a/src/gamedata.cpp b/src/gamedata.cpp index 3a4dddaa..a1313853 100644 --- a/src/gamedata.cpp +++ b/src/gamedata.cpp @@ -95,9 +95,20 @@ void serialize(Archive &a, DialogueBin &b) { a(b.title, b.lines); } +template +void serialize(Archive &a, ProjectProgramSettings &b) { + a(b.projectTitle, b.windowSize, b.programIconPath, b.windowResizeableFlag); +} + +template +void serialize(Archive &a, ProjectGameSettings &b) { + a(b.defaultRoomPath, b.playerActorPath, b.tileSize); +} + template void serialize(Archive &a, GameData &b) { - a(b.title, b.images, b.tilesets, b.rooms, b.actors, b.props, b.dialogues, b.music, b.interactables, b.scripts); + a(b.title, b.programSet, b.gameSet, b.images, b.tilesets, b.rooms, b.actors, b.props, b.dialogues, b.music, + b.interactables, b.scripts); } template diff --git a/src/room.cpp b/src/room.cpp index 7963dbe7..958c4d9d 100644 --- a/src/room.cpp +++ b/src/room.cpp @@ -141,7 +141,14 @@ Room::Room(const RoomBin &bin) : Room() { this->tileMap = std::make_unique(bin); - auto &actorBin = Game::getBin().actors["playerActor"]; + ActorBin actorBin; + + if (Game::getBin().gameSet.playerActorPath.empty()) { + actorBin = Game::getBin().actors["playerActor"]; + } else { + std::string playerActorName = GetFileNameWithoutExt(Game::getBin().gameSet.playerActorPath.c_str()); + actorBin = Game::getBin().actors[playerActorName]; + } auto actor = std::make_unique(actorBin); actor->setTilePosition(Vector2{static_cast(bin.startPoint.x), static_cast(bin.startPoint.y)}, From ae88f20efd8548a4b3f9d496cc221ce803edfcad Mon Sep 17 00:00:00 2001 From: CDevv Date: Mon, 13 Apr 2026 13:18:08 +0300 Subject: [PATCH 25/69] Reflect new changes in documentation + new keys in translation --- docs/guide.rst | 1 + docs/guide/editorlayout.rst | 5 ++ docs/guide/projectsettings.rst | 33 +++++++++++++ docs/guide/resourcetypes/interactable.rst | 44 ++++++++++++++++++ docs/guide/resourcetypes/prop.rst | 2 + docs/guide/typesindex.rst | 3 +- docs/images/rpgpp-createinteractable.png | Bin 0 -> 6420 bytes docs/images/rpgpp-editorlayout.png | Bin 49609 -> 47918 bytes docs/images/rpgpp-interactableview.png | Bin 0 -> 6871 bytes docs/images/rpgpp-projectmenu.png | Bin 2313 -> 2973 bytes docs/images/rpgpp-projectsettings.png | Bin 0 -> 17889 bytes docs/images/rpgpp-projectsettingsbutton.png | Bin 0 -> 782 bytes docs/images/rpgpp-propview.png | Bin 32210 -> 24652 bytes resources/translations/bg.json | 17 ++++++- resources/translations/en_us.json | 30 ++++++------ .../projectSettingsPanel/game.cpp | 8 +++- .../projectSettingsPanel/project.cpp | 12 ++--- 17 files changed, 131 insertions(+), 24 deletions(-) create mode 100644 docs/guide/projectsettings.rst create mode 100644 docs/guide/resourcetypes/interactable.rst create mode 100644 docs/images/rpgpp-createinteractable.png create mode 100644 docs/images/rpgpp-interactableview.png create mode 100644 docs/images/rpgpp-projectsettings.png create mode 100644 docs/images/rpgpp-projectsettingsbutton.png diff --git a/docs/guide.rst b/docs/guide.rst index 66a0ba2a..1d9bb619 100644 --- a/docs/guide.rst +++ b/docs/guide.rst @@ -10,4 +10,5 @@ Learn how to install and use RPG++ to make a simple RPG game! guide/mainconcepts guide/editorlayout guide/editoroptions + guide/projectsettings guide/typesindex \ No newline at end of file diff --git a/docs/guide/editorlayout.rst b/docs/guide/editorlayout.rst index 5273e271..390fb56a 100644 --- a/docs/guide/editorlayout.rst +++ b/docs/guide/editorlayout.rst @@ -45,6 +45,11 @@ Here you can see the title of the opened project, as well as a Playtest button a * **Build** - Export the project. This will result in a .bin file and an executable file in the project's root directory. + .. image:: ../images/rpgpp-projectsettingsbutton.png + :width: 40% + + * **Project Settings** - Open the Project Settings window, where you can change settings about your project. + * `(3)` - **Resources List** Here you can see the resources of the project. The dropdown lets you choose which type of resource do you want to be listed. You can click on any file listed here. The "New Resource" button creates a new resource of the type that is currently chosen in the dropdown. diff --git a/docs/guide/projectsettings.rst b/docs/guide/projectsettings.rst new file mode 100644 index 00000000..9ffa2c5e --- /dev/null +++ b/docs/guide/projectsettings.rst @@ -0,0 +1,33 @@ +Project Settings +================ + +In this window you can change or view settings that will impact the game's window or the gameplay. + +.. image:: ../images/rpgpp-projectsettings.png + :width: 40% + +There are two categories in Project Settings: + +* **Program**: + + This category changes how the program's window behaves. + + * **Title** - The Window's title. + + * **Program Icon** - The icon of the window. + + * **Window Width** - Width of the window. + + * **Window Height** - Height of the window. + + * **Is Window Resizeable** - Whether the window will be resizeable. + +* **Game**: + + This category changes the gameplay of the game. + + * **Default Room** - The room in which the player will first spawn. + + * **Player Actor** - The Actor file which will be used for the Player's appearance. + + * **Tile Size** - The tile size in maps. \ No newline at end of file diff --git a/docs/guide/resourcetypes/interactable.rst b/docs/guide/resourcetypes/interactable.rst new file mode 100644 index 00000000..7acd587d --- /dev/null +++ b/docs/guide/resourcetypes/interactable.rst @@ -0,0 +1,44 @@ +Interactable +============ + +======================= +What is an Interactable +======================= + +An Interactable is an object that the player can interact with. It has an attached script that defines its behaviour. It can placed on its own or exist within a Prop or an Actor. + +Example of an Interactable file: + +.. code:: json + + { + "name":"myinter", + "onTouch":false, + "props":{ + "newint":0, + "x":0 + }, + "script":"scripts/test.lua" + } + +==================================== +Creating and editing an Interactable +==================================== + +To create an Interactable, you just need to give it a name. + +.. image:: ../../images/rpgpp-createinteractable.png + :width: 40% + +Then you can edit its properties. + +.. image:: ../../images/rpgpp-interactableview.png + :width: 40% + +* **Display Name** - Sets a friendly name that will show up only in the editor. + +* **Script** - Sets a Lua script that will define the Interactable's behaviour. THe script must have an interact() function. + +* **On Touch?** - Whether this Interactable will trigger when the player collides with the interactable. + +On top of that, you can add or remove your own properties for the Interactable. diff --git a/docs/guide/resourcetypes/prop.rst b/docs/guide/resourcetypes/prop.rst index d52cb73d..5ead9e8d 100644 --- a/docs/guide/resourcetypes/prop.rst +++ b/docs/guide/resourcetypes/prop.rst @@ -52,3 +52,5 @@ You can also change the image for this Prop. Atlas Rect refers to the portion of the Prop Image, that will be shown. Collision Rect refers to the position and size of the collision, relative to the top left corner of the Prop. Both properties have X and Y for position and W and H for size. + +You can also see a preview of your Prop under the properties. It will show how the Prop will actually look like in-game. diff --git a/docs/guide/typesindex.rst b/docs/guide/typesindex.rst index aa52e316..dc658089 100644 --- a/docs/guide/typesindex.rst +++ b/docs/guide/typesindex.rst @@ -6,4 +6,5 @@ Resource Types resourcetypes/room resourcetypes/actor resourcetypes/dialogue - resourcetypes/prop \ No newline at end of file + resourcetypes/prop + resourcetypes/interactable \ No newline at end of file diff --git a/docs/images/rpgpp-createinteractable.png b/docs/images/rpgpp-createinteractable.png new file mode 100644 index 0000000000000000000000000000000000000000..ba9df1b798edd60e6e036917cbcd1e9b10fb48ba GIT binary patch literal 6420 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 literal 49609 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 diff --git a/docs/images/rpgpp-interactableview.png b/docs/images/rpgpp-interactableview.png new file mode 100644 index 0000000000000000000000000000000000000000..7214da84c4ab82c224c928c2aa89c230e008b747 GIT binary patch literal 6871 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 SYpCR30yx+@+EiG1#{LB=abn&8 diff --git a/docs/images/rpgpp-projectsettings.png b/docs/images/rpgpp-projectsettings.png new file mode 100644 index 0000000000000000000000000000000000000000..d8a0c443a0b5883cb81d98cea85bf1eeacfc17fe GIT binary patch literal 17889 zcmb7scOch$-}g_GhKy2)O36wQ$tnsF*_*O5BV^BLC=?-Nh3plg$W|!X*+P_z$cPYG z&+FSc*K$KhGbXbK>{=j?Z|%U+Z&x73HP2Z=v5pB9XRBUyx8Hk;p>uhnIX4 zenQtfH;;c&T)&`YM0hpHE)8A~W0JF)Acc07r6kR&Z}PSsg={FBRN)w$J$>CXD++YT1T zvmLr0Z}OO(Z7}jy#6|YV?s!G*&Ld%E$3NxrI9(do*2%2r%QklA<*oQGc|Jb*_SX1; z+i?Y?xIJt=pO;rZSNjTHyYn!qacR+c!I^uiX~a&zl%a9y#S=S8yNPbT!+e@$?t-Ml zQV&%_dl`+^);ye+PP|`TTbZ0Ue131GGkv`nIa5_bpw}TUs)|F*apX*1&&eC44%{%> z(3NZaphy-!NNqL@IJ4=d+~ViPXyLl@o%lw2d(y?-L#9!=yWI8?-znH@>{4a)=OVvD z4j8MxeX^HRnyunmsq0+)xjUOkmkX}niWYWKR#beNuIBb&Hgsjx9t{=M>$eYf`vwHC3JPlJWXhp#?CoGpa0Iu(I@i+uY!g8}U0qMx%_+#qpUOuI zu~>fU?Y(Ym%i~K{^0QHR{NoEL#&>;vG5A(m<(5mAE@{8AvYc_7bv>hPUl?wTuG`90qBwLw&Ui_seJX>4a#z5s@f)q9_9rbmw)smY zgrqGlEU@)tjhDX6$@x;YG+Ei%siDK{LYl)6BC(5)|Txa zJ$gh=NxA8B=BvI#2M^xl?{mHr>$w_n{sA5PMBDhp#PrO}z*u_*i_P3gU5EeuYW%pM z=jzW`W>!{OTH4CKQa6{`W~oryo2M+hpIdzravbkECnK{(B}IN{dGV)Np64os0!9k! z`nmJ;m9n)}H}z+lN>*FNR1^0{bai*nd^C;yGCp39!N1xZzwyYCBQk|WWs%R~e4?&c zSk(DYA1<&TrNNtM4BXkggXQ$;C%6<_4)L_NZ?D7cd~~x%f)zvzdJAkyrr+(8iJsBD zF{gIT(vpIbGWqG#n>E3#KQVl~?hDsRSagzD>EAxSVBLNE^6TbiYBx7GlCI~9gOJl? z{i7on7x2kC>-^i_JF|bbYv|>;FWTl?_PoO?{P^5pz31|@w{+>)ddkA~_+u<1o5yin6E7bZ()2_yn3h$ZYVTg(7cY2^YGiSC7M&dR-+v|&mkACH-58R! zokD3}zsJ%sOnm00S2LA6M7cdz-5o;BYsk;H)xKyFx#;eGnw_0}cB()2RiA5}QS+kr z0S|6z7T4044<8goR%TUf?d)o5Yp=AYtIdAzR7g{a@%P`pvh-^t%DU`LPfrxylxE+) zi%l_SY;0{SIyxS+#yH>hTwChL1}9^a+oq9qS;?~IbTF&Ja1CqhV0WHH$$Ym3CiN#? zg=2_sA|UCRUU^Jgo2sAW;eGs8gI~N4s6R>!4yMJDH2#=tymRNyz|c@NCTaYAd$fGD zUDFw<1WA8VNYx>)!k5~|CVF0tybn73(!4#rBi3eboR9X$9K+3ZVO%3v7EeSyb#<=s zXy0l{qc7F9eq=;O)IxC0X`_?}5|Kfh=;7`qtI~ z4<2l#prBwGdUXYFh9$EZoAl7(!!Ex*IcdGJV!V3wD&J&NbApuI0RQ){9K+hCj~_n@ z2nc-s_U(d!0aK=SUWM7onI7wMc87-tM6;H+1x7{H1u}_;qdsJp&eIn=O$|po^%-<# z>9EXsr8Z)EYwGF@f6tC?+rxcRL1fWuB-XRfs5?XGk)lNA+dcsS8oSr) zbMHyl>B^F^u{nW-Vl-SIVL#p#^z!9P`d^#VS8u4jwfO$yOXW^Fx|!GOcU=GR`5Xx= zJ~dscPj)P9-z7$R?mB1Q7;|Rp>v#V91h0QSd$)Xa?0raB zLFWDY_q&Q5jv7`!eEaDWqqViQuJf0T9t&SKJE%RKO)T?RaZQ$wPQRR%*ls@Bop)5x z_0j5N@f0yO9v&W~f`Wq2qoZ2+6f`t6-@0-RJ32bbJmZOpiIENGK6mx|=g+S%a+OLb zDFx+v@=feeU0F)M->HuG>dCkKI@hVkiW0N`jO&kj-lp)j>FMb>trsSw%Z0Xgy}UMT z+jOTUzLbiO{UVETOG}HaZl{EZBvpL*?i#o z=htMXta{(Ct}IE*$?<8u_QV>HmXSHc!g3G$zz)A&URep9$+PGj`2M{Pt!803$~vS# zTUweTKy+0AyX%R7&24OemRHt#$+8g@bKg5dUHK*y)XKBd7aGu*c-($X4i!(8eQn_H zH+p-2*X0uDAZ!Iv62%b|K~zy1T3VNhyv}fu8?KqIVPd@;av%9mQSRkQd{=z%Zow{x zv9>q*+^Pkf{3lKX5oPFWfM{eDAN_U=r;(|tM#0P$nUr$(8#fBCe-XQD*>O)dI|U`0 zxDA$)Lr#41%Hq*d)U>wDOJUN%EbJ$u<)td`ZD;4?Waj04aoLiIL&MQ9p%CwRbkO&> zP7&3vT^rxi-(T1|G&B@Z;^^cw5@8yHYEay=Z=b*9VbjJZO5VFR-MNKb?NHFMWy_ZO zZh5&SJK;H$8Iy*{X>1JaogFdmGt!d&^v235iHTlzBaIPNUa7w2<>gw^Nz0sP)r@K{ zE?c58cn1XRz(_jh9bQkyD*xmuPytF&z~G<}vAq5L)ih}1)oUg9@f~@PYdiN%LN2+) zi%Lv&=|bq3?HySc3MMaZC7l-Tus{F#oIIFX#zA~PlNVLI(5~bX21dqqCZ=cIn3RU1 zEt2FG3A*)R>|FRY9TUZQ0Gacu;WIR9Zr|d(fBg7Cl8Ggcdh$fp#wI8IF)r|{-&54G zCqD^@#>m9vQDC6rm(iMmN#?^L+TS{}51{LQU0s?o{qgw?=cRlBJ!fLOqbh30y@4wN1-PhNbsO!*^rIJE9 zIXQ`999L0Es_WkCFFDqktzcr3tXz$*v~OQj`AVT`g;2?C%SHR|9sVORZV%UQreq6f zcXD)8FFRi3myvN)S64SNIaz%{_WPWxvB^^at0%%v@@Zek$Ne%hkKrMX_e&U%P4V$*@d3|Sx zh>v7~0ey;bX7hBdft->Ge$o}Os0zP`R+(o$lseESerdq796$7A~KZi+2i4zaRs z*3i%(a9eHY(NNLnxsCy+XUOUOH)X2VVSzOq4md3qc3kKAt5+i^rjMr%?0yxB-o;h& zV_kD|GcyZIWXRC)aIV95^`SYxy}abxw;wrrbgP1b0-Eca-a@<3rrFVXeLPlve?b{S*^A&ceV8l9#l?k*{PwAsU-9>uGr+RLfPylNHs6`! zdYRF(5&}fQ8KRU?_*`Lk6)H0=S0W}f-37bXqpQv*On zVR|0Yii&|X>m@2HDx80hrW86)ANo1mVAv4J=RVi2F+2W|7DJP7^{EyMmG~tIdcD$U{cqnb@`EYNHEfPE)$U zv}IT{6Ww`+xcuPAh~3SQ`bJ`-W?dYf^}TWRlXeml1rh~@+Jlq zNLB2@1#)7N0VaQ83T+S>H{_wS#b{1kCZDy9LOi4vcEAHwl1ZcQC z+o~WSER6A?zyIJtA%LM&z<#ylW_uw<0|SGqs;bXJL+3GL;3O$1T(3w5kmi_+xWwVVkDKEyy$7N~GnVWN3yq_dd++RtxWQc1d0V8*NM+(3)n zudJIed^PXizt-peJTYOZ%zEaG&Y~bce^`b__M@mM3mQ9YM%}FjSB+ywfzQGL>9*fw z6m|>@55Iu=ut(IRMA@nPcJG$#sQKyXFIB#@EH*Yjnd918hU&sHR!EO;+|iA|UHs$Y4=pb* zhxA31my7P^(jCM)UY@Q#uyfb0=9gDhhJ*#R^RH=n&~BN_|K64+Zf3>?7NF*qEsI)9()l{1^(;TbI-y5F8d}%F{kJHdYHrv`66j(??$Woj;RZyJoej z8v5vwn7lmYRQZ~S_l^VVySHwA#Gc(#ug^`qYk%1d^jAt^>c-k1+*q0?OVYb<543WR zl2Hbr(5xr_7`TdtWs)r>(JW8<^5x4Uv)1J8J46a&fopmk$Fj~ z++#(v;5rk(Rj>X?W3+^n)X^bq&aXMu`-vt#h&^(xC*S|akLyEQveU83fA+7fh7oiI zBWJVn+W{NNd}cF8RrD2n-H)E{ey5&iG(K)?Yy08*Tw+qvbjKxYvZRE^M=n180p_Bl zsCZUacmMZ}%)|9&f2eA zx6Z63kpk%G*`-(Vt_os4#SfW7gkLZI90`qLxJxx)bp%A7&>p1OATMynSA=w82NAtG z=68ntU8-FX%sc0jf@Y+c(aB53W+d)XZ&}tl_el{w+acq)sOkkaXab??gg8+v8mt(7 z)JRE}=;z^niX3$ULp722sl+tH(rqh7TT_k>dTmkB4NbFZguGEznsI7mjh z;8)gIhiseC_CH{ti&L-cGNVd(a1bCy?^11tEJqy$l#b!wc}8kMRAO?a3v3dWs*W^e zyFbp3E|HVU$3s#+ZBb&h5M(E>%e~k59$bY?OPpGa+<@tkA}*roCD*gQa&;}>hTInX z)u%gkS|r5H7v1Lb>sw>b<56F+8Dg+-iB{#Yx@by*PVn~a+mMiu@HUN3S}}49li=A8 zMJ=)MlPl+40NubULOXYynWb7>Tx1aSV7S@adzm1_nAw`9CXKO7onnHkzqs1Ua%9to z5*Ir(QBxY)j>=xj+RW5+-d4yaB_$=K_wV29PxY086-2fb?ro8#c~y}v$#(wydD$ld zN-itlbAd52jcAp1?YFT`q1$Y`Sz3AqEf{PGz^c&Z>!ytxH?qvNqX=GibYu}0zNEuE z$u#V!XmwsKIs&Q&ZX@8aEZ|SiH=wundpC3e!Ppz~5z?jI%1+5%soS;0)2aXg7eN-g z3TzH%m&|Oztjb27^i@ibv|0FJKyYveS`x0~iGNy$sOj0;Ky`eQl!E|n{9bA*`@VdKWv z5CRAZ1?`9^58!9wmoGB_zn3fwJg}ea1#YWE-O0bu?_y>gGPo*rH(1%NfqfMlUUV!fOZGr584nc825hu?i` zPLLa@si{F}xIR!t5nS+`a@hVPnj@47_qCN@AgpOE>^Zew-rlWw78*dDO-UESobeku zx+$meE`vw1(0vH*M@>yVI5ZR#7AB>tx)Z%4*y|9dSaJ#K{hkkIC&!-qhJ@@yO(ec5 z=)Um0NK=#DPKZ81D!^p$eURS)(HKy$7e+NSz?Rm^$cm`>L`jeS` z%st{-+Q(c2(V?}##t_R%N?l#Ouv@GxM%E>Q3542lqMMqQR%PgR668N2p~w@4@3>7H z8L(0U)H9B-vH9qEuBhqgXj0(b;A+O$6a_^^Jkb51%3Z|YPSE?eJDTwD@(Mctcq;U) zz~<|{n(qKeL9ww4sM&(HgXAPYk|W2C$vyIYPVO>$fA6VlU1!mHNKKl5$ zPAxFAX3mw3QT)~>AfqfAWE9_3$`YDWl@602bwmp}tb5(lvrkV?k3_(uFO}Y?pXV}; zt+aA}uZPC<*y;z}&fU9dckh;xkl2uwl|@u_z|5Q*OO6g|Ojh^R0u4SjghwHTT~(8gaBAtz07t7Z(@cE|5IU z=lZvD>2eJ!H$g;^fUtz+HSl(~o~mW3Bi%9WD!gVBK<>1)ze1`fymFJO!=JzO@Z3Z$jG6mPa+!k`b6k1+G z{kpw96ijRY2=2<2c$1?6qrZUoc~0NB{qhIr&X~ z&;F9=ajEb(-L8=pJOBcgYTqr@1&7-IOCe7;{}ff^@Ldw~`v+c8FjXDPsil@NGGY!2 z3fi!FGcVM|fv;Z|t3_AivK$re`}r|*a>_E&iTPYI38mQhx%z;oQEdqO>6O{m`bfS9 zyLFw(N_BVK)XkPkX^m?)zuNI^ue`iGi>1!x%h$nJd_zYjCj8M9v@`R?O2_gi#>QkG z&>h394rzyQSfsR${`mQm_Yaly_LeH_&NDSM6vqcR7%U>v9~LfqEdKr--)z>V=0&Am z!I4tZ=CLxT0aW*g{K(20fnh_o<}v$lFiWqz@rj_F&w~e*O-%v2_1uFXTqQJ{5lR%G z+2O;7*WUy-=egR#JXyZxfsTaA%H_N`6b6R69YBthYTLtWQh)H|$&hEyI8UEBL+FSA z_eqI~Rf#&z&I0IbAajt(_MSAO!i_86ytxHR#e+&QR8Zgi^xS$$zdh%GQ3)9i{M!#E z1VpEs^Z_pT^tJvn0^pIdbc)}B{C5@FrOXId>4|4|s-SP4#by$8ntYP}F4h4;C?VV! z8C^%WO6q<4b|V-+uuokck9AMzi4>hhA);TR@9y!JRLfMxtuB|jM}RZUy56|EveT0* zLxJtosZ-nbpAH9#11U+YTAH7zOI1ohuPva760kXR_wHS2C_A7^4>!dspjd!R9w$Mh zV&UTp1^re6JQP{@ygtd&CDhUl;x8t9D;gsxzMjY8k#pzH5hg|&Em{xgWCQG(2!8AR z79G#Np!~+0HpMu*x)ONhF_&H=ei?d-Z!fROHURf+j6xw7!;XVL-;9oqR@QAjv7XSj zQOfKldj&zMQMtUBL(1O}-21@;!`C;-2*~`UVk1#P%5E$X)1)f;-j$aL%LX=mwOikolpsSK9+0KfVWP7`@X3J`waCj-KPNBK~g_ z@dz_>Rid23wQJYDwP)i25T;n=AI!?`}S@HH}aEHzV1SodfV7m~C7nV=t$*W=*AZcN{e4V{^-JuRL zuCw3H$;!&!?LXr(V+2tXIz|$V5XigDiI;o#K06gR-dh;_s^23DMUMwEErA4sXJ!(1 zu}v_I&bbCl1VYdPmrc{i-ro?#Uu|~sQA|u$NUV^9%wpl`xqLDV$UE$(b6_etd3i|% z1$#tAMT3QgUWEk*R|1H6PASH9k69er80qbVDTl8W^9;Yt$Wl>`YK&ZP)3Ow+ zsjnaW{N|2K(`C6cej<+JdjM%)T7A;?%>(Cn`SN6LZmxjqEE|?H%McK6;EbKim}N0~ zv(bAh$pE~Mby*G6pR9WJet9f}uW0@+Ejs0OHnh3d4>a11cbym-0mp?$_ZBLYW|rhz zO8-K}&3}!qS|@v&oT=P$>B|$M%NOc*h^BuP!|R6^6bJwq5w;nWAP7}{@E{0-`dh>;drXI=a%3{`PV*HfC^mgEjXd*`d0I! zN1Ht!2ncB3kSW%x_Di#KSFT(sq~9fca@dif{-dL@RlZI{H?hRQ54M zuP*P{t#;|988!O#weFX`4&OV1o;;~1G_e`TQ?}5jVT8R&ln&N}aRKnSYxQRP%*>1? zS~sBfUeVQs!`3C!n*dW(G>VTs=G3alF{~zPV^@g_FWPJz%7KiFTs7w;=cgiv1Y93@ z_Xql95NsJk>%QKH;&MIvx%Ej+B1_i_>5|ONHG(gVKJzVqJPfx-@+On`JyNnlbx5_G zYGX|e#ho{bUq8*kx2meFyn~{U`hde2+F?}GzKDp3vG^YOlvV=o@bK_(oH=e6u&C?6 zzkG}Ul|-G#@&yip2>cnE+5i>?ivt~(Zv7f;SleT95GGHrE&n|I`&$Ay@f}EKz^msS z9rIhVk}aE}_(76)U{PdN)n85NV$Yy)3WqfeWL8W}%y~SgI-JM&evx)4?2pyQ zM(dJV^-u@ZymzTFz9@LXAnfP|$5Sa=w^T;-B2cS_H%Y*0lHrAk>QDvyKe7M~SH4u- zRdZx8@16%e$f6|Ud!;g^f;Xs{r8{e7bsW2go%o~Jt+li`5-T_6Qy$B_bE}M;+)$kN z{&=+vb?BNikcuNO-#t>L_r~m`y6eCxDLF>(s890^`A6+CqWPvf1HG=CgK2cC@QZ>^ zc?%j+$Uf?06DF^2yqIW9eBtN>j8b*x%IfmsSm4{<@qFw2=t%pHNlJCM1NW)&3@rOC zm^j5teQsm}tP?N?Iz2gW=z%0nm28!^m^=@8ga(wh8nco|tkSgSu~;9aw^A$Y!+jIRDTGN!jrlJ$1CN zv=|alNolF?{rh4WD;9n8Jr2)88NL5NoX`w4b4(F{QbwhikJ|@5JCou&3%`H!fGhp zagyF&IeGXGL@O1#RspObB_$Oc?(gp}EexK>z`zjFNkF%#8BT|1#_2+os7)v7x98{Q z3kV6tcYbeIt9Ol^R0rBv{;sz+0Dn9VnE_`PmudKKsTpKwoa;rFe~3eH^DizgmL_yW zg6hIvNAoLN{r%ls>i$5ZQA5q!F&Y_lbvk%Qkao#QkoFi2R_B+7PPsq8n`}WnLp)X*)e``s4piG&>>I0)F9IYM9`de#CfVALEPF zaS5$QMd6I=tUk87%qMo0Lt?1E=75X^*_Y;)KJn z7ey(g6GpRozS`c43>I?LIr?wb5sl7ms3VrJxQN_eQXJk4V9Sn8cgSv{`@smD25isdoMa32zrgW8Ykh_s+pSx- zuyTo2_saSJ%s=>+>(;MF0_OGGw|5~jq(w#gJbX9|+z8lu%DPWhU;iMy-Ls=1n%A#$ zTXbe6Aw*GMU%!Qw=D!1L3wUgz-M@MB2KW*T?k)Ox==sUOKq~Np&Y7rZpVb4}pL|V~ zc9?1{eF}P8P+a`NqVxFbQvX^moX0KFkjsloW@?X?tjzb|If8lEqG#-{U;hm0LuMSd z4N1mZtTzIA9Gy{73!_j9W8isQq&5Eh)*e93AxFHo}Qr{$+2{2^ZS~bbJ?9o zEf~ni$ng5gDk`Bugje8kuO;nZsV*VxhiW4E1EQdwoQHZK4i5u+(g@cDd3}IKAM41x z2&chZmhF}6vtb4)xpcSKNk^;))RmTe%S*&u6gf>bqEI_yHOeKY_qqR+Q_t3wb9Hqs z?C{LZVZUMa7Q%g~CM06Wb5H^}PB2XxsYfW*cF^s=F{>1L%2GyInTA9Jb=cTa-?1OG zgDD41_G({AA&mt#MV;!-aITH-W-AL20C4K`@6SqPe9}u>W2VHB2Xz31*-WNhxaJb(#4JwKc=S*Aff>of#%sj&JFbZdX^#*Qmcuml8S0WYilryFUOgVS^+^p1MWR+oSdq=Kb@!-eCVd; z;JH;O`XS+8q{O)1$8%F25UB@`;V2E;{JOf@8@g9>h6WedcuLj8_;|Rerw9=O1dfKb zr|Yq33|YD^kIwT|ZOo}>@&|`fax#|2doA0lmFIOO&YvfnS@>PBuOB;^R~%djxHn4_f@OH6;F%DipO8B}5kJ<(?Kmr503u&F7NAF$L{FsqBBi9ku!B znf9FIMxVbE4VeMnFN9cdtF}nu!7J9maeW66-)4|;#epIT6EOR&xstg9jva(wzhITo zjax{6WdT*nJ#LT)5fgGF;K`SX2{{O{+7o)e@|_R|*u3BQEMqcM^^?|pml?BK8W`3p z?rufkP2F4W+nlStP_z)ISHae+tz4Hn+jYvy%Al6@4*7YWB^}@v$E|8UH8# zNxk&yIFg4~K$%ZoZIRH~7UC#$Z^wbg2V7+r&}!S>4p16T91iC3)X`X^%z@{Os{vjq zULj-)1bi?&kyWVF$hEE0uXzO0&dfGse8wVL-W!dWUT&1Pnd9sK117pe5SNsc6rsys z7V1J6FF7nJx4Ri3Jtmp(rlW%nNNU!#RC@7KGE{wcpp^QUGy9yJoPu*v$q8`;z4FK0 z+z>qJLCB;h)4onkH9_{E*s+6^n>#SOe6^?}L2UZhi{U{`Bf<#}kN|}3u;C_(8^)SY zP<_u`75iB1lsyBnpdBebJ(p6%tB757#n2GRr|qK4Ki2CM*(=q?&2E@Ri>F1kfT#e) z;RO3;Xm5s-y?lo}Wt-Hm==?2v#a&0TN7Ae)jTR2!hB)3x(pd zxXj!5^AF6LAHVk3w@?k;H~syw;E>ZWM!5k@ zY>!QefMA`{yD=9kwCy#a3Zr;5h^{RvK+vs3$g~m~TTag6&)O9T@z-JU5Mk5R=>X5? z=ItDaj%hPdZ?#FuE%I8Iln|0TNWEvz`#5oL0sC)M7!}y|3GL=bnM3|(9JPgFvp!;N z-|U4j>QYen9F2sj{*%u@U&% z1}XqBDd9(>oV^P;V6B`|f(%yhLWQuEEc>333=4bSQbYF1onV6!&A~MbA>cy%ffWs}2?-|-2Q=*TS{-mS2O%?hek)lttoI1P z0tI_{c_|{a10k|2&tkXXJHI&G9Rck6XI{A&?A5t!&xop8uC`YY!hi!HH|S(Zj+VhG z3x6_5isZL`*lfm(c!w`IV)|u&QMF(DKOOxio)ZEp8oToJNxep7DdqB>Dt4{;5g0EpCdr7ko{-KZ(qR9k}*c4m)8A#%%hD_`~eVVh-C58S=-3~k>5Tj zF2PYz7abi>{fz}>)>*fuQUlD?j;QzuN2|%ZoEv@FiG(&0cXF)*vr5JqMeJ$xF|7>Z zwn%yU?K!cIm6etL)V23F$=1t`{dX={l03XttPn(hE@^QQlm=kVBr`S~JBJF|Z1@R7 zGu&Izb)%MA*sgusHhC-#?Pie;KMR14M10!yYr}Ap;*mvmvgGRhFVIlYwa^ipk3>mH ziO%FjBM@AZBA{$E(GPJuwJt6&0+r zz~jn8#HV(EK|r%unD4Qcqd8AR=7SI!1osEd?a>BN7bL{gEJz5@erA$p)y80 z%dY3QU?Ec^0#g5P9C@>4$sJi(^0OWuBG^~@h~&X|CbH2)`^9L=NghC4 z@ATqeFjQ8`0|yRBK4g%F%cgvMQr6h%ea4#B;ReqENqVv}*AW{1-y7r*@p}=Q%AP(v zI$DEBLTH8)$JfC@uQ&QnpFdaBnGI|CNB%_IDr=FyRQ`zoHAFm<`tZ2pMXcdVui#Zy zVt@#>9rCow0Fu{NmKUZ0&uzcH+l~xC4Wc-Ukjg@Zz%_wRVv!zIx_ns{M+cBD|m6^dBOspZGX~&49 zk1%{Z8x>#>7X(Yq5Xr)@5fFi{@a$(@4TOEpox3G;E&kMDahs8}XW|COm~l?Q_V?`7 zz8k-E95l%@+Mu3qY1Qp`Z@zozE@15AzmVTEm-Gxjy3g+;gbmMWBFggV;-4_ArWc^1 zL2|Ce>SF z6(2~rLI71l73?hwUY(FvccS?NsST)SZv26}Vv>LURlz|kL*!aN-`d>vrRNGD2$E|$ zj9I%72*uHp59Vt{YgwonC!os_Q3ZS!si-lIS5-7q7b8&3X&4xuQAVXsOj%&Ff&}W< zho9(m>c25|g-PPbY7uW6BQp=rBg_*3CenB;qVRCDc0pD^Za#yuUmcrXLQ)b}sYjN) z3UF+pd~He8Aur0r_g9ka*|Q`h#DL4@r;7}eYt*vdFc^=?0EJ{j3fQW zLIftdCRYTu}9e>(W*m2tqh&;im1R`Nd*msLin!r8|adP^t zt}JO>5Fq_mL67m`_~DQkSqC9TU;;lz;m2@l?m(zWatDV&{G>L+=<+VbfLDxl5QU! z>nh?hu)!5~Q!uH%j3LW+-qe-;RsAavGH@~>HX`$$A`+4b*UCph^{#DV~;k!-&RQVz!lmQ_t+DFOn-aUTdgL>eeMnjoRD zaBmvVQ|m*cU=XzRB4mVOC+mCL_QuO5jN(x$Dtvr>-_+GTfN4y7;D7?^zm2{9v$-X0 zw1*Qw8-G?H@Er+43bOk|IE+Yd!xA6TtRoV>Peg7+!is}t!_#InfK;_HhBL0J zi+i6!Zbr#S0#^N}Jqro=RY?E|CwK<2r>c;1z@e=NP|r?4og!hM+=Y#XIXQJT_{kGL z9GiesmO8hDfUzFYpyAYK$_kRnMxFA<$|R&9v~2d{$KN$IO*P$n4aFcN_QC!8$f@r{ zVD=!gMMLJHJf{6*L^>Dv4|zcDG*++FC!Dn^Lg!zCCtcRj*~@3XlSoNmbk&YOp2CX* z-JrwP;}(Pz2%QJy%oaTB(pUqI0{ksHK60+@psD?LJj&NsVAq!EzYCctqfM67)OHh?!#GNf|mi~e}MzN;(T z!@jOuYJPs6DB%cj+w!d%HI}U(?=SB+((|Hfe^Fa^ukPpk{JYN1-8Z3i+2Yzjdg-Mj z2$oZWwSxg>K08lLEMki61FN~ zE<-~kP;$CjM#xN0P5`kG5l%jWGKSsr+mFKxDP}xAN*3nGtfOLD@9kd# z<`wQeZRfXuC*UAhuI8!}Xy0GyW^pU4ESgt?OXmM{q7U7bOo#(mZ0}IYFz>(XP#8T@ z)KfT79{F3dHYSmQH~~ezku6#sXR2-sEx+O&VRoPB?qAbaNNCm^ZSZ>Ru7|B;F1u4Q zA?KZtx!OcARs1}Mycq$X_|I((^w7HZ8_8rV|G%WhzYWp2(9z@gz~h5|E+^@kg)$DO7>wLgW%6!qB-gW1eE&=bcy{ZsqsGr(Eb)f|6hOg zVO?*3n>6EYyp8$!|M^y1uMgJqIb4Pin!4-HN%4Oqy#Ic_=UPFJ#Txn6_c^E6{n1iC z4kqIgFH>Nh{NlrbS^HR-CA8}t}RYnXJeGN7$Zp_23a|BCW#5uYMQ|FE(Ab5 z^w$xte>Ippsw=e^5u0W*|JRZEu?RmlZ9=h$H7h zh@Dr+w1?29%dsgIk=gMCj9KH5*<_GN$@5??QTAcbJ(rl{ro|)R*G{k!F_< z-OeMMT*7=6&&?esWU8tu9yEFkmu^opXUVAWW!-p&MB2zp{C@#Lc3)72FRqkV`-nm{ zNb%{|COoo)@k`QZm|eRKz7ns_@hAI7#V`KX)IPtJTivOrylX|8?%Q3eilT@YS-L~< zrl9xqIA@oBA>a=XJjTh|;XHN`k;;UbLY&U-g-CT1?fb~4 zzfRQ}+%5VG?}lZtSCwMwDmc16epG@}x4Q6kN3gSjL0rvuLM%dof`}-7?HVV}!qUO# zzKP%zz>!7pZ-O2Ir33bo;RMfHkk^k0xhN?qacaNxLBK5hCG~(VURv`mR1)IUCzO;$ zxQ=^yjL32GF>`3H_d!gk_wSd-5fE}5LxWj;Gdz3`;jlq_4*3nv&wT2Xy0j{B{1s7C z;DT1z9{}Wkj_K(6xZ&V}0Uvs;aA73++r{iG=p!6oU-17HZNLE*xZHBEz?UoGSKN zm%IT@lENt`5=_4Ygqh+0*v^k@;g}OFU6pR@-hv=B@aeVgV#B~w@d6LO_IqvXthu;} z-TBgMrSXt+s+^xP6szukrrP|8gIr$c@>fo_Z_ngU38;@g%Gr5aCeQ1(N$o)mn(6eI z(ZJ!^MoGhcY||dG(`$WaChvW1S}J#&;)&R{e*OA_tc%CP)|(G;wVsTKiJAYsetc@m zP>T@F%L?ABBzPT)vv+WK`|jN)J3G7C`FUkdy3udn^zH3Kf`X_K+aP@#9c7{`c9F9! zWXSs7(%;|o;|KT0YaN&TL{Fct%D1H3y}M@QXCL1ogSbawUSg;BvqsC)22_)AZ@c5` zOL3fw3(TMFwS!K4b807Rs7!Nb=ZL@3RB(ey#FHmR*ROv#>U8dyw57E*FE6jShQ@AE zvss8L$Iu+LOYKSVAjRuCVR3OxCZ?u2misEXAxY{R7~J~#(~iUuy5-`GbcU~m6+>YZ{ZS59AL&Im8nKn0W$Q=rLs>sGIA~N}%b!O*z zk%`ibbwDuS%V_85kvKtg$02<^MwTk3n@nH6f@OJ9rgr0|3H7=$LFON4e?Kj zYrpO=`uY0!oV0Xs*tKv*TySYrbX;CSVld|lmtNFPg*x|@<-=VphYrm=wHMlcQd69L z=N9JR8huR(39-pC%Ojq$Y)HTbv|m3^JE0|$aE$U@Db50q$YKTtz9S&aI8~cZ8Ysw9 z;u=wslb@cMoR|~AU~FM&?k+0}6z4_~k7O`4e<$kD22);~T$Gxc$B^n0plc}V9kqyo zfvM8d#WAEJ?(Hl?zt;`|ZT0gknkHTf+`-A4TGRN&QrlMCK$SOCB+$i6pzer$T!G$kRjmSB9_ICy;*UH-4ybB95E3ou zyGJ}O@r#@ev_IJ-&r?9H!Bbk}&kPWt`iSV+=|ti3-496ovQv@f}IYh~%u zgj?s%K1!QnWM%V0VWyHz#-UQxWda7%IC@;|Z0%g07HaHu*vZs5^VUokFQ&swn4as( z^)&{~bXCgtPO$mDq-w{$l8MjW>Nq;7XofuJ)Ripm4C30)ENh~gq%`rKgtz(JThoFw zd*06F{yOu-WcAJ;oHg&Kh#!%ftn$zF%4CbHZBZ@N()21x~ zzh+NzowdFA#w?Y`JMKT+aew2~`4_$hRK04P!hBhUuU$Cr{X6@*$evG6DNbGtDnm{r-UW| D498XT literal 0 HcmV?d00001 diff --git a/docs/images/rpgpp-propview.png b/docs/images/rpgpp-propview.png index aa9c7717d4d088a1c57564518683053347fe3bc5..3880b6c7d88e95e0153eee45823ccbcf855cb319 100644 GIT binary patch literal 24652 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 C5@)^u literal 32210 zcmce;1yq!4`!_n+sECDuNZ69n9VRLuii9*s4nuc?U6dkSA|(tkbi-ia&<#U}G(*?W zoa@dx&OawybpcNA)S z&z@cIlZKPp-tZ5l`E6w@6zaea!->nE?#y%6xU1>{9-@y3o9KRFS|7_i1syd`}$Cp^{+UD7X%49MTibbUz=E249T>86vU;MybsRe_lvP=pX{vN z<~#WJ${u%$t+$Lf4x+Yiy_0y&h(hkgzc2TLS5f;n-=I)TPf;iSyt}r8;>w?Q&tLCf znjLcMCKfg(C`e7@Pm1NPOyr-|%(Wc&;Igt1G+pGfQr?7B(j!lFYD8S*HzP)AzB+LF z!@lF}_M&m-z2CTu8ZRx)6Ez2x=ShQsD>nL7!A%~@ef)QE)9)qe-+%dXsqFpPR}T0O zX<0bZ-i4J=wY&bTm+R{4ET?*|=Gsqxu4wULy52uG(%{t{qjhH@f^F;Me1i2dPWlc- zxOMILqMB`LL#JBkn8~W1*C-<9x|$<3Ud*qQN;Gaw3o>7*lVpHD@(*-R#}JbTMV;oGl&VM< zUgAiW`1QuSlj_f=I&!TlO5dMV|2dIIVz&}$`9L!G^Jt=XW>KUBa~pWYH_z#}q-a|% z&FJBDs<{lRS+hGVr9N-JZ#I@p2-;OrbWMAR)a)+6$|}vJSAMQF-5>xy&_N!%E8+U9 z19CBUX&jbE;`G**=LcKHv%A?D+*VWJPDpAvjq?)JlB6?}BX7SylV&%m5s*2STtQq( zZfaFZR(n4?RFh9<=bH5S=DT3xjN+jXrt7=jczArY8mcZ^Ut1CVdE`27Ao3MG*H^QK zSeb#1HT=fVEN@{ao?DX~^JFDPDnObyV=px|KiQ~Cs`~F+eypRGzF0+hsYS+4f?Tuf8W>|m8|st%z%1KkjP%ahj2qA5w0 ze`&TxyhgQ+Vuvr_UHrzA_dODBHDPBUG5SQx|M--&;2MVDeF^pBpn9) zl%!h%<(m=|xFgfjzdqY7oFJv?wq}!l(HtI~%)pnI)wa9#pU`?rIAwAqu{T*U!sye8 zY2D|WgQAUB>T~NAzK>*?v8`El`C;g z8E}HUNx6ROYV$)ektUJXUR0)@LKBn7pEOm_i5KpL8ZO*y_OGfQn-H&E*|v4|Qyg&i zEK12AYs6M6^yHaYXI!xWmtRv@vY5q80Yn~03Ao%1_k#nx|OxZ;Z0s;IIsJV3|sPzGU)IDaZX&%GIg-TL$QhHF3 z^BiyHxA|(}N$VZq1Lc0Rg595+a%ttd_E4S6^s`7($&}{BrnhBcDn=UOM4ze;VH(~l zbuzT(%2+ZIW0*!^*F{4qOVj?o%SxKu+;mWglW8PPucA`v#*OD0X5C$5g;=)8q~^9K z^@To}1KFF zvc9Y5S-(e$j81QFufA;WsmQC5FF#gm(h4zmawxV-lZw&=E&H!f=)%5sPS#V#yB5kP z$d{$wlQX=(jNe$3HER6AG+DHg953HwKGUS6={HyvQW2o(dfA{l)Iw15`(rABOrabb zQuBqDM&?ISj6@qKrRkF?6Q0<~n_r*qjJf&l7?f4Ih@l)7wVafr92y-WVm6~6DaSI| z($@_r`ep zCCsw7W|HfWm8%oBc)!H@vWK5u$J-2p6YN>Ro9I* zvisB8Zr7En=Z&=VZnIVVeB9$B;aO1Nc$reVa77CbWkt`gt&jsab$;4c64%~HdYsU% zZYX^3G(S4PML%pqby}$Lc|~5hA_E57Z-!rM9&)y${U{rFy3ujcL-7bBeOEh@X$R`NO4mW)ECckVm3xT?H+nf}jaiDXQa4&r)4 znhx2~_Ed?y*5qG1p^)=!4i3*N?ed-zOx7oqXwfaYA+zp;cc*sbs0?1hlx%3T(@Db0hl&7J6;L7Wezd8jsaZ znN0sGv0R+e4mr8C>QFucm+QCD{&|1US^obBz}d4+>(4>=9NJO*=iR|G|3y@~BDQ0X zUUwic^Y<&-?Ei<8;Cfl=g1Wu)^XJdTw;tjG15boJ*r+GDY~FSE#*3_O>#IbQpA^L$ zEGW-+?`8!r^1k!%;ORbcYDXM#WefPlAE&tDe(E!mp$e62C;A|r;hs>9NdyM}^NKbd zqxc`FP~yW2Ihw@!yMq!7vobg`)#jhd;XU|tP(Eka)hp3O2Gx$uL!tLSlS2ZXGP@Y; z-Y9RL87i6@Zl@_T75~sNacz3>jEl0RuYw)%p26ZQ4HrCSbCfi%;;PBFi1&AV-8^*h zHPn8_rdq~F*R}lUugQ>$iAuF3sh|X!N^%PgslH@o=jLCoo<;5QNr(iO}q&_5^a zlzKR3aSMcLF~M({W3r93%sRenyt5h(p=XZSTxSwJ@L;1=Mq+3mIqY+CQ6L{)-r6gg zd)yn`51+q#yX?dH0ca>`&Py{lyf6MdZP&qs^q9vbZvnAN>b7T@AmufL+r4LBjFA?V zS)9y?Awvq2o%pVAU86LXA(K+Xuyb=;r%So%YqnJXmYQXeL{ zd|Q(@o}PZeycow&hS#cQg$e){7`;Uo0x3V(O?I)}e0vn>Z54Soq-cYh@HEGHqYxVR zp1mdTxlh>?6((ce37-DSv3X}C9=~Y!V4}%&UCX1?3*k4Luw2b*H|36;To`W`t)`T3 zPE^)go*S{8EF_n6*NEsOyy3miu8{EY#?6~$$?Ex)CwyoP4<<6jyS~^)<%%BJS`;7l z(G;UgWyROdv8iPEaNt+#EyhOTBKZ99s#(VGp}h!sDJ96?p||g$SXw6GWCl{wp*ULX7?Nuli3{w|g^ppBA<)eaBIBsWnZ{itgR(*FM9;hVg2-X}V<}Zmuu( zQ7h+|N2(P$w+?g&*^CC3KR!+DQBjq`yc@mad*RNtYft5I8tS7&9LH{I`i}sNA5=$( zPg)k02XaR7V45rC#U{J)nm;{HU7Vhtrl0jGdVY;JC0o?ZrS5G{45?-1_~y-8l-y}f z%jLRi|IiQHo4j}5KJF(eFF#LIhYFqrSWqOgI`y5MAQixFqH+tp8<5#o@HNT z-utxA0;`zRpGnm44HdMyYj2;kpI)S8>_{S0QaXHeh=XHil4>>|)9i6gXC}DY;Q(m! z=37WOJUh~9pYGh37aDON1FC##bzMYy=+)@LI&N`cW-&C-iH1`ffh z;d?R-;Nm>sw%Di2EHB;GmkbEGg^u$d@+a~tw#u=eN06DEF`#xL66)JPS%;~9#_v2=o#ff5UEE{0!mI>>L_QmaR0 zGg5#4A%*c0+)?R)w3qd?>&zx=1x8KGfDyP&%#z5M7kDGU39))}XT3#!aUH*nZ7QDN zIiZm^5nZ*lu2J2v=TA`G%N$QrY!`#IcY$&KCb>)0c`*fzPqcPTR?C$}8P`oc+TL>J z=G&Z5EX@z#zPy@w*=9w~OLRJIFI8|lfZG6JMg)pJ#mdK@0rtrAB#k?1Ec2;`&2TN# ztU7s{ZER%nEbq}v_lwm?Ku*jS)|(Ra*6InghD5AV&49B6dXMqWuaURN6bDNF0Nt{8 z$7<1)CGU>w{rd5y9;YdO=k{&$49kVVazB=tHFCF92%m{=?We1;Yw3#nF|Un~T_4}o z1C6aJl1M_*tHOp0scsn`Ozl5 z%0NzfDMZ*i3W?wx;U5LbD_(e5buF z?3TL0(ScrUmq`oZSRigKn-LmVHa-&ps=ymUPHxnv$g5u67!u!j4>!FG%An}rDpZ%) zm^p(87yYL_2$iS~6Rx7ix3w)nowFL_PITH$5-XxTRujTsGdA5`X{r_TWB|v0?w#ASQ(`6)(zT6NOPU|#%j7Xskw?%6R?$yKdbWNYpqU`g-TFmea9wa zCb$!OEn%(e&GeVW+ROuPk9in(FSd|ZqG_vWyJJ&Umu5H8M_8^YLQ#?S!8R4B92%2F z7GD!COT)|Cn=FVktot0RFbj0UrTPv#06m_hL}~`Hu`joNRvo9IId5TM!N#b^|7Dz(;@YiSx9&gnPt60ZcP?!kV) z9Cgcc@1<3RIN1n)nGn9#%EecT{jo=>T<7<}{ZY8`^!{c!a?fDx(BF^lfL?G0HUPIm zo(jeOXg%6hm0sK~{PV4{g$nCb#&Q)+^MBVwspH z`q|J_y{9Kv(nySxTe#vj-8L;0KQ!CFenj63Xh@6Y!i8IB&Ym^Vk7je^aFkt-{u_BQ z{8v;%9lO+oZo;y2xwf@n~58QDkYMo&{N*HDL z{{8zwSVFB1RtK$zY9g{vZf)x)pLguk1`zrwgKDnikG0&Mr>%eor%Q<$`KDCCDIAE^OZ8UiHNckXGu+ovTh4 z*za9<^{OKG@cDBh9VLM!X2zmcWuE27f@I=ma%l^_{OH-%?=iug=vaCCWyMi=PsnhYf&#u!Z z;3%6);}9Jx^0Jgas~4UF=s%w~+p^uwjUs`HkC%OyEaTkF5=Z4RGHc9_Qa%yXh6J^> zwFk{)vy5BSe$G#Z&hyu{JJ@2J`bhKJlsRH>O<{`bDoo~)IRf4mqWUlJLR)ZYM})~f zLpx4R&I{Iv608TJ7nk<89YOqN;Q+g&0fccdxXit0Rm-_=ieIxGsf~Olve@(NLSP^- z#@~ZZus-9xqGNb9rato2UDMIF;BP#}Gg-Vy36Y-fsS1qBOj7>(q; z?uv7}+V%=1$!{!>h_Z@_kC;FZ;B}Ma`QZYjyK0t}*C_Cy6?Az-Yv$HeZ3b*`Ujy_v z0xhx{L!miTID9DtN^Jag=gw%=7{E)(@r}#~c zuLXlHTVYirdU5;i1J;#wpJGkgv(hj`c63vM-~JO z@Mlx4JazQ+X|{LAIrw^U15b9-Um+Q4tq(_emsfD$jf+Cj#fc1tt>cYtIe;4nx3h>k z&iR0x7-BUy*$p@DNM;s)mxk=lG>yBOSpHXM&dMxe5?nSWg%Zm(soXYqhD7c^%G z^ur(li_feo8KuuJKif_14=SS2PY~%yhu4jIkQRT0Csfp_c?W+V!JB_bC`8HMbT*j}x*c+sycyNDlz67(=_8{Nj;iA6f$RlgQsg?tG8zKQKx<5TmTK0b1DF`Z(a<)pQ5&O{2v@HG!oB`!Ok6tsh{c6L)rY_+g zLNG%mD%hx;U+DLh4aQx57@OlEthAkl%EG4R&d`1PzMr1@xbAH`_X>EK{G%$eG-a7} zo3{BeQ+Z|TVPN;jT!}Q1ndd|~*;1IP>~r(m_0b=sp1>;)@xl!G1OBRXHS?1<0b^Bl zWviUTvh`=1v=5$8qNP>MSW7Ls6)zW~HaOgU)_~T-=zNk@ZJrL{K)PG9t9{Ag(zdP~ zeE4~vdAVhkt!FYi$d76s74Br2sg1m@LCAEh4BC~iVxyR4tW4lcs%^OPYq&1TO9v!J zE0N{|Z7TYVGgY4zOu~e0xSD>@GLpyJiDP<{sG_lMeD{vec?>C8AMJ4K3U(b9uliCI zD@I>EO!TiiM#f{>5;VlWd|nArwRY=;$6o&C$VEEBHs$tHWMcY`e-;i$-Vjb<38S!$ z#JRO$(pGmBzlrhFZF{LeUTqQ;${dv@M_E%p=J{0T^N4(`*+rO_E{nN!?{RikK*aps znZL}SYQ*j|wzp5yWIt$Gps*ZUGTI$o&#Yy_pqXL#U^cr{9WEvYNM&qQ!Nkqv$l84xAsI_`%;TeP-&vto z#ySqD5H`6J)aWpw7O{FZNVs7|8`O0G*C`wS?PJ4;<##tNeYnq{D7eNfCi^6zh$_4d3fx9-%jDv0d3cedyA{NH=g@P5e%aSaOqIJ&4>NR zj~_W5LrF>^Av@@b983C6+<-0AKg}mnw|b}Rx2Vc^!{Y?!nHv*3B))Ld6qoOH?fdoX z+FCfpqSo4JbLyv?B?RTe7l?Xvo#Ck_s=1qDEu@ETTY%@KsTu|kr}A>YCX9Vl!6l_p zQ*Ry6xfTR|15`$n5h5<4>JlniEPPFU>rf~ZT27z|kLp05PnmV?QCY%np>WjgPC6&l zcK7`6O1QwuYLf`8KkJWE10{P^bT;KhcX@Y|z#gNfg!9>5j#$vQZyr8;n2x{z-4RjK zU>7@xa^xx#BfaPZ&p?g$g?_gjO1-%xP>d!z)IE&$>q|oe;6>mvj9cpm?7^dqhAu)s z`|Kv}IzB-O#|}ExM<_NG7+j&g)n9-+!viI78_a-nfM9$;{(14*53`vCXscY71b%p4 zv&fm9z@=Y#NjXi|!XcbZm5(qxHDz7~yQf01YZYK)eY$}xx-&1c0KC+}{A|pOEtNmO zzEX9&&hyZG=Y_&ql-O~^&qVByN`bl+NOx6qr}O)~gwIKO(XsbAc0Tjo~MD{X+f8szYFnGkDP(xuXM|so(*xKb;f`O^Aj%0h8tH; zHpF=!Wqnl3DTZlgg@*LD&jGYkJ%CVNLq^}8Qx5VTV^_PR=`!!9;|lIxv=UAOv3ySo zn15QDDDcOV{@m31v)g(Y>r>`(hr(x-BbV!?IPQR9C9=?>GXv}$K`#A%N*bIxd75T# z4xgucl8|N5m1`B(;kL2nH3ZmqIxjgrCFROPZKrmV>>wienHiK%*=&iQm@pud^dojC zI80KAE8Bw^=_<@u&bR3MSq~t^s?ZVtrs>Orv*_-kLI)SBrwRe=>d~N0%~W#N1QKzo z*~wracUpLL+H9^r6l#Qq!u%lmbv_7A2;e6K?uw)RaxX%xb4L=b?K+4vGd<6!gZav6 z8;wq(sT_GFngzRE$YBo2JbS#}yqSJP>_i06Q+&ogVEtEsLUjhj)r@oJ&INM15zW_E z9k?aGt0$Ez5WE@qyE8>?s)Bj-K*F;GE7eMk#Ud&ys!-$A>7)ryPfr^WVpa|9s8Pu@ z$QzZZkiRGeVWd*Wjku-SqoS2gHjq5yKFW$M-Edu(AXa!az0&mjzv^_ zGt#t>5XFu{xB(vkDp&j}c_*W13<_?QYwnXB#b9wIIYTTVR(%%K6igd4RQ(ElRv%0) zC)NARJjHf?>Qj7`&K&A_8LfDtU{2F4k4F<gcbW*nzil%0LN$TS4Fq9A-| zY_tg*`%6hvmV78&$Rv;JDWZADwGvZ@5;{4_j!83j}5N-{4}nIQo( z)>YVkXx#{0&J_%mXCVR#E3DL2u`VnM3A#_s?4GFcZ|y1{`nqjGJDnF=4Q2o+2bZf? z_^~KSpTN=-!Zzh4eEa_WJTr4Sr)0b2P?;}bM{=_(o^~(jLbDX(8>ESzug_+_Q;Xlu zHtnp$Eakua_F|tDNKREcRJy#zO%lpOh6j^Y=10TvvqX03 zF8>uSUFp}aU(q1Y>94{QMLdKf-;DH<>U*-GR8VBPE!c3lpV$5HuFMAbVEbw`XG?vvIp~HlZD@_ltkS0L+UbgYEq^6qPFgBywpFa1Y`a(h*RYWA=1*wxC;vJg^v}3_ZHM4Df7PFr2na zcNW@|0Hgp-ppF`N7w?)!RHt@E9V=698bdoqHjHi0OvSSQ+#}OF- zXj7IxuLsS&W|emlRyg=0>h47&~_}a!U8i6y7?Vl-Do-y z`&zZA89P~K@KP)xY8LF2Ry}Jc`XmuMsRY@ce-d$o!f9J?TBPHt-wPGc4o5txwk#7V zln2j~W3|7}8HM8i`swPkeq^s}e}7p9wM?(4_zC;CcjjYzDETw31`%c8MNRNKhXR#G z+^uP600Q+`C64r;2=$o9K-E6o2RA8;G62>u8w9=ln6AGR_{n34Xe4?g^)dQkNRokB zbttpjc~+)1Mf;h@DgNp@?fPy}n#*!G#2}IN@HAK+=Chqb#0kgMBy7fbmPSqV9ba8Y z9L*GOr_S-nPtTW3TF(5|4LvqqKK=vJ5eauCMnBYP&f{E-wo4e!%$sR?le%BV>p4=yMO zFM)-xGMC9nzzmUafD)m9b~y~4o^|X}VJDBZHpq{_U1*T+Em|JM4yv?gVuk`6pp~P$ z3UZA*a_TH9C&E8Y#9_&GU^ohbzNcFg-YLJ%oKKq0POf)y`Ss?a^nJt}So-yjqhO-M zn6jU~30fKp_;1-f;4kS=G4jsjzRRLnZF}(@RnNB`ws}G3h8SIw_hXg0YiVs@Xi#3~ zEp5yyL4uEx3@(k&gMq{N0*bqhxPuU9;beQ=*?wjBFQTTKUzo66FhS+yN;wNI(4U~v zJNizsna{MN<#`G14JUPI7bA5$ zTv@L=UK7!(&oka)RY~4Bvg7wEEMiqoyRp15PO_BVE@{xV7ks4U!$*$jFkACp$=YiN zeyGk<0?44j3G$GWa#|hDdz0!gt54_y-9`$YgG@2{I4Xcesd_BCJxY=~pbz#5uM?#z z21LvHap@JOdK(*@y2(oDBU_S6Gfs2TK9PL<)F~FEU(lj2d z&nVQ6S1-Lm3*+^R$+w&2BLDy$Ps5FOyKR^hStsxMns+=U>$xrNT+tyU_z2iKK!-MP zbUnLSqp(P=(6MPC7w=TR<{%p;q<2lZ)4S!A8L`hyT?)YIY46OWjESLq5P<^({Us(J zJhMv@+f{#<=yvsL!j2t2c_Vm-h0XAU`$wIfVa-KFyhe>aj`O2}Kg}Rrc3C+s+9C1k z0BqR8mr?w8zspkTX0m16#9|<>I6+iRe8g!bt*L~o^MZ4j1~Dt-O8$*EhX(@{cMMg9 z5IG6$^NXs)!=S`LDdJCx6}BC_1TB@qxW(!$hfw`r*3!t#R6|@xBYT}$iPgW zw|F`HzS62Q8|)'A)=n<0I)?xUg5jtNnt3%5LBe~& zc3k>)!pg~^iU3(~zAjLm;+xC$$2-Zj{mcW0?ZTdBL6y$-JR1yQJ+CYIqK{1zL_4dN z^6b(S7i~xCOY}O_8Oe_zn~F38pp4&0v=T-~o4-7WB30Aiq4$mWuHaob z`n6ht{R1z0(NWIu!{5GrgShLi4Dh6~f|fY)oze_f^pgriVOs-UUJM;#^|6_E+;@!C zP?(@DH*qNC2n`KQhF3*!_pnBbE!@F_N1eRX)3)r0FVIz%_OoQRLB67pf8Mix?WNs# zn;!Rf-%e5Gj06YR!F=2zJJXUiaCpIq50>5%M*an!zy6}G{8az(bpD5*0l}B8*Zck3cKloQ*!799&Enx#hm z81yK)yU@w149yRrc7J_Nc|^CXzyTpcl>7GmQ@(&RMJuQ4*XLO1l=-uTNQVkM5L+HT z%e{eM2v|G8lm1QkM4}as z*7$ErV9*hghUY;T=ZVDHgyS;{r{^7?BnH$Iw{#3t^m8QbRM!)=)7l4ciY5{ufDEY? zwBkp(5Wi>y-~4$o!kLb;tF=^yL5u>3=zS#LE1*d*s0`HprYQyKW10JOu*u-`K2mJo zl~WLl_|cGp)S!1=)Sk^tfR1_Lc{8!;eje;jBx;)*dK}bKdnZwvQpd|KNm~z6;>%fJ z){u&*00JVtGKiGx<{H{-MA9>moP7^Me12t+uwC+xpFf4d4IuMk)SQUcSQ%?gw*=WOJ^5u^_1|(S%hpL8 z9NpvoOm}5r+zX-KA9V;`Wk7<|ywK+8B@h&1u0GqPKdGAJ+L>C`#dw=O0UVtL2<;U@c>o6oRBV4pU<(cYFAokf z6)-0Kqf^!0^xt4&xKwpL%i-L5!b<-qNB5yvG_=MQAw>GY# zLf;w!pPYiccqM(##0A-K*0Z-fe4u$Cd0|Ac)$!v0E$s%)W{%p9HpX)~&KU*>t~Vzu zCI$Cbh4A;FTDl#J&Ji-V)VhDw07R=`uR-FXHlvLeg3Y;B1_48({;H<$0b!TH)9>eu z&A6GiD>{#10^qU8&rVGu65w9~eM1ilJAzpePcpF2Y#fwoC%V~r$MSB+uLX+dB7igo zO%B}c92dyCY#SF4^wkctP@KgoZrSCeI-`YE%l!Zf+wYe|IV0-cc^*dB(fBwdeU)a> zcPnBR_)U0!?JR^Sz-GjC;k1LQIoDL{T%F-!8 zf>!#-kO~4P+oVxD3Hb zraa6d|Ai61v7S$PjBT=D)(iI9%`UeMmw1iBytBp%qD~7uG}*kE=8s@m%L3ZI1UWWK zW!38)h#H8Pa9`q)^b)zl%DXX1RSAiugRp@YnJV7yWrYymT!{T3l~pe8-svMgkScHT zXjO*`^XnoVkriQ5NRa1@BtgormurIE$4S})$${@M%=3?d;x*_(oFe|36!KlkbN>kO z*3IR1P#3?xj2-L9ZOCx_r(eht%gdW|!vo!Jpsw^?4SVoipw6XVMSCV2qh&B&T_zP8{B4>%@}^)7IQ1Z(l1XEtyB$@lAD_AK#op* zTvEwNrDrp#F05#eW%Kl_#wp>#D{>|rfR`#=e(?FZU@Xm7P}*!Nr)@>on=@}nN=kv> zD1#k=VU+UT@2_NRlKAfw5+n>&4b-#cW8g||gMY5$-N#j&Ac{@ibxC4WVH_*mhgY{Flm#UHj$e7+L^!xz*c21ZFN*_v_=))2xs=NPrBwG6*lUZkD z=I7QdZke#{Nv$4vQjK71){dqRV41IpB`4Tc8G7fIjg!oZrUh*6B8}+@1+CV@PYJ1B zr-kh4q)hi6tC|+zGg`I#p9}!zA$qOu-Q5Eb+@?IpTv#s8p+kZ;>POX+Mn$cMeQE^T zij-N@GHFa8{aXXRma-Bq8)m?=tUBOi$A@{1&ZkdMBtofG%`kkwpO)t~l;2-uWZ#9} zym|9|NzC>(%e7lKZrl){$GAp0nYT~p?oOfEQ+I%NkGga5W=*Nzm89DVdQjDVSx~@d zP8A!e4uuJCT;8=;o{=;04y)C!8zkr?b{NjFhwjDP% zcMs~eRJg<7NhD>0WM4>&(87^kp+RuZs5bkvxKYvPIf@oPL&u8{b1}a4B!dlNbz28P z`MkXUcQpU%;X{YCxr0~#;)Rg^`ma0q^e=g-SmyA_lW6X}=ji`pEapd$;_R{Q&hh{G(Aj3-s7rGSYE5`_LI1#weZ*P{(E5^JLEUcaAq79 z@NxN!rl2a0yBI8vE`nfrJ7~E7zTB}8Bu9F%gL6+Y#S$Qo^Gr;=v4t{@qOhpapd5uL zqpt1zD^pg6kikJL&=JIqL%c&JO_!!YkDhuA8U_a;C>;6x&xkBzP*telL&&6`1LpjZ zzuWm?p6xg@ECXI0KpwsxC%KUz_(x`iyHH<8EKMgmauGH0-_Vxdr3c@1MD8~Wo#fK> zDJ{J{+wuWu8dB4Vvk(qF3-Y{8(BuTfSbaf{33QsZrDnDoto$JE=8DrnnbQ4vfD#A6 zCAbZaaWv#&2A81QOJ6F0frOL%rlC5rvQ#?aYjY2g3_W7VgUopmQ4_y!YiJIA_VTgr_G)H92fm(d^KA@j7EQ*Of(6aMGxna}^$yw{dKr3P% zAoiWqL1%KOT?PED)>AX}Nl=Xgz#a%DG)SMkJ?j49unAh1SfDH7{K7nGGF+2`)9D`UTYwm(41dYoBJ5q~HBzqdz?d zVrxBU6M|3=D(DL!or;W%AuU`F?(^UyAoDU>^WeJOg<2-V2td~$U_O`!eMVMf`Z*NU zn+Vv~be?`uVgD)P{9Kf`n9((~iwo694z(Oc=xqKFCc6#Nu?#Ox45QDoTA$6tuLzvl0BW{q1@y*&tqLI*1Z}Mxjv<|C3OBqTW;cCc z#zf#J@4*IC<7b-JaJIf?MN7Aku?DyT?q2_JlJRd9G1qZE!5PwHv3_Za-4~icX=VqL zgOeEDl%oCWOFCn>9#&7yGrW6G z#xmUVe+d3VG*%m%F7eN@2S>z6tRH5DZDybBTeJI&&%diGiXqJd@UC+_)oCXXg?tbcYmMZm<0-8ZZd86uIOt ziCQ06N{Yz8`TfzF#51c)i43N-qE7pcUeXdX{{$*Uh(tB)nUFq2 z%Umgds2zb${jB_7{ma}JeTf%lHq(c2yONl4R^_MP38LU6t`n`4#RNNd5AoG0OTq4?iia|bFCnPqS5(Srcd>}on*b6 zqft%m$JT0}tb24`U;S5@a90$s{lsuTWq2~l)xCJHn*t-o$+vNqb@|DTq*a?DvCa)4 z`M=^h(c3@=^@D_dkf{6yOd_RIPeOc4ZP4&kC!_^}IFm}p>to&#gvw;d=jgd~U!w!C zO=U3I$-hD^Olrag#NTN4$p#`9duIG91e$JS zI*1|}Z=_7MI!}H??(}^9`ie>A{B??DrrieX&8EO@GQg4@2$iUwl@xDGF|0c?(wr31 zVL>=;3BFDUaW74V`&NA7_APLWAUl=LpTMtjdTB7ktlVv5Mf1of^o!5JCfOY@JaXg< zI%Gs5N7H+S#PKLaf?57ck7Xh>9rhaWl`-z6Q7rD9SyzFErqVMEmHoUFIz`xN!8kw= zN`^16pE9_ds;-}TLsOuEbt+ynigN1n0tHy!7-D!$&)1%ufG}?chFBenW7ttE>M;L| zq8j3KuvKS;$pDznjTT543R_YINP5!hF^|}AXeSlh;q>qQUE<~5!{Abz$J^F?p4usX zL3D_bCaxU>NJMNOYs;+2aCaR`B}Bv1(HI(?Cy7K;wN)#BSL@6t!}Jn;-*WnbJ~V+D zC@jIF7D+kt3r}{rVOA0jlI_A*cuxZ{jpi^7w;ocOqXjMs)$!xUk+g6|(0f~$_uDECs68J* zHHEKx$OxiXm2y*>v-`>L=K>Lk_t%m^nI29W_IUf2%R7^ev!^=YFm?2@(xLz2wlU?a zS9-?DXYc<74JDX;T0T)vy%ha_^_3$V5rt0FGkFQ81lD`cyotZ0zc=<*V(`oOc*-vx z<$D4dyTXHRrPkK6KMW$?-TRbw*(kF=JFrpwjAu2j3+dBIW-cs}Jz=7tCs@?oJkBe) zK4FK?e|#m`4+=^NCpBU^3Ur4JQ9Tt3mh*&(nUkvZWS1xyR5WI8EA3XVJ5#i;r%z^XtgjHh z?q;Bauda{-X(Xm>iN|;GOO)4J2-25;QWp}6BZ5x5I2R{=8b?ukuMJ=r=RDuM?nVd1rO0#?7nUG@p&o zPKHn&)lhwX#pRZJfmfIyz#b_gl_LmQJ&efmaMX0zr1M2cjU4P={K-$tcG?9d<_Qez zQ?KZP!RR>Iy*6RTQY8D~+9W{K6HvxYteruv_AJ_Ht#S2_5C{BxTV$s6EESH&$sTaG z#W%`}{j($KGT|bEfC!I65vfjp10%F8w==kZvPht;sz}lj(Ctu6bi-IL?BD*FsD?t={8iKQP$s=#nmV%sIPta1Zf<>^ z{6FcP#twnLT$TP5SGdr&TA-xip!dRVyU^2<);(|wQO zPmLDB2Z0uxJ0Q^Geu7(H+N%^ayt~dl+ZjrS*4HN8hRz2=r9SnF&hoa{LWIB8Jqy07 z2^r2stB4h~a8c(58GeP_J{fSKU4R{55?k%1CV*!#Bi#=Y%uo>F@-6BUR~SJ~KLV3= zwi<1;_L#uUr+fW!DPprPbw|Tj?KpUMz|@L3p~pXvOYiP}1~HMrnuv%14X}@_8k?F1 ztRTwZ==CjPxiQYNMW*6P+?rDZS5;Fq`7Vyfioc`-=Q@vF%7vSS=XI)qugjogSZN_x zI%^a<+KBO)_Y@b1Ps5@n4!6O1@Es5yOL>%GSa)x7oAnNgf4`~d(=EB-HQdHBj!wIK zKG}|!&JAR4%Y(_(#UPBmndroFGzR}N+M8hzW}~<|k8`Uc6p;%jdE2%xrV{8YaMmV! zzoOp^W}LHD;aV2I!@1PuH0cSHXh8IB$i8B9vsv3a0a3T$_iB@1sMK%@+#EFscZmH} zC_zZy@$U?igeMY~-QC8c%2!pMC>;mk7aRGD4_ zNADQ;aUQVQ*=xFFa2e57ZTkeqDb>mVk%t%@2NRuF!@l>$OCrd`5jCK3jxV*!?YZ|v zAS~pH_O%l7HlbVDkTNlm-Ke8zdC+$K7q|zNnk(WMr08nd`F%6sGHJ`mHr`Xu+RK9> zLzEM3nGC_eI=tHk(8}wHk5WIEE!|xJ3vQT*({#l{b5+W6U z^Lq)QJ{{cl?;%kC&l|*N1Ez?7b)rv~Kp|)THCq`WjvtKp-f|+OxkcU8?02Vezh?yL zK80%Ag1o%E)yZTrrM3BSZKa6Fs1v7j8feF-opdOFORVnyi=JfY3m(D1@t?8hSGzK5 zTDG1!Bz|xwgl&!Kpq6@ikte&w*@5W{gZAm`WP2RsXA3&u)iPoe5GQ&JQMvqzEAn%& z@;PpKoTwXafiK(&ax++f#r{$U{+k*C$O5p*>cgz61ug3DT;yE})cNW0M#oDqcFw!| z@$cIs;c48KarvIe^p6~1JXVQP@GS(#VCYOK)NwRE6;dMllP2*;Da7X@sY}3!S@XY@ zq8=8LgY+C~*QsYMkfu516?0z<4&9PvqFUmlg2j4P9g?Jb?i9+* zoDg-i_U!{9#wrvDn2cBUEv3^TcQ>B|Z7`Im13nCE!;-V)%l)Tq8Xs_4{Q99kiH<*- zFae%{2zKG)!+USw+Bm93W-FQPtUZi+ji3jo!qCWKxl+*wyet!2Nu}oMujA7p-K(*! zD=G;rUR65YqQ{`^dcwb1y)8)RpcY%yiYgBBLiXV_^oWVM1Nr(8faU}RCkI;jEYWXn ztd)CX^27RTrmAbML&DuB1JrGmOE8$2q_646?$U;YD~MhEXI-P%GQefXfeE--V8WHxe5NqjQkTDl88(3!77mSgJJm z1%22BF)}PlnO^l5FTVG7jxJYcBhnBq?Civ^4sZxgi9ySA$eIIQ{tH^7vvinHW^bOg zSjn&EJSYXfNSYgtp)L!pR7|c0mxCkBzfp2JFHS8I#Md882Osw1;nV*Ob{bnC!u-J? zJa)j-pemS#T6FHdA6E53Rp@Cx<42Vt{2aTh&y`g1%<|s+?j?^N)X!`U1qs@l!(~Lu z;U#)+-{p_M(z9AgstGLKGJEqcPh9}5+6zVknL$JiDiE;-adhTz2?RpX4^bMqmU_mJ z^eU%$-#0bsO3r@--Gk0~>Z?MsaiPDL%m@8zvf(1RbtL!g2fkQJR#*?DwgzqX*KsXC z2BmeT$R)v#W0c~?ykcU-w2 z8_|z&;YBCTWgH{;IPT!;VxRXAW6&A%z2AUqb?d;=tst~FC>w;))QE35uM3(LOy8nU zM>oWlfY_umkn9hB*Ew`|U)XjN$(rGbM4fc*&8GIVUi#}h_Pk3R;-UUiYXcl^%IOC~ z7Yt<-lT@0_S=odO;V5*F)IK^6Ly&c&F2>lAavk5#kK1-H2I_c~Q7rD$T)ZZ>4n?=W z6?Zu>E^w{JZ9Tn}Y>0)YcM<8M!22aZpuE6A5w?(aZ$&8r;v1*w)$Bh0>;;P&ZEXzW zOESqAjxYyfTm9b^%ANLZ`u&E(1hjV(PdhK$P8Y~J4z?C&PPJihB`_}-8n7!lV4*?g z$*i~As!j2x!aAt2Z z)F*`rR!t?^khax;f4QvtScT@gC97%{YpiTUI6eY)@EnQAk(@W05bRkCGMDAK#DF4= zG~GL^us9R!*CwKo6;ps#L@)2Z%y$87c56D9xjIhk;aXejV)QYLO0zvdT=BMMoL)SM zEZ?PW6O)>{)ynsu;$vk84_08dlKYhZa~ba4fM1q#fT_)neLecBow@2j;jgzWmIuN3 z)$?EwFVg;LD5(O|WhH%?Erg8ByqT701A2Z_wI~-?e$$Q<@Qq}~0IS`=pYh07ULLxw6>uuJF`AG6>WCj)AP42aQ`gy zJad@+{8Tm#VelWoXuJCDF>A2#ynJQF1dBG-CJ6v_`(VQ3HOvS{m7g9zyE8vbrz`nJ z0hoGW zp!l71rv_|rMz%>C9{Fm8D()9bNh%5hqn00e_%?gVaX)<~+Y4-A@h#yVGVR7KDNJ~w zYX-}Otu$dS|5tlg8r9UfMbXyMI@AeKM8Kh9K>?K^%xJ9x0>P>n!~kk4$Rv|MFaqjx zq!J1!Ac264mIyQkBn*O6KtPBl1sMY}h>Q_}KnRd`Zb)dm)_Z+j?ON|o^9!=p%_aHn z_nou%KKmTpIn8O}L6mm)bT7IFoN$kGc5n1_|CPSkio2~Y=(+UWWJD^E-YJkq6%-}t zUgkGk?&-2uGl4YWu)V$gZJK97%?E74TLtx=h0Iz7^4&=B%b&V@zj!RZ@)cCGDe*0j zkozj){xC)V_D@M@qs-TrB_*Bz3^UFln=%S<1HUMrI_HpKcNdC|LIm!|I^Km%8J9(KnS%41pW8dQHN_NDrR@fQ&0)whR%8l~y%2ylT&2ZD>Mg zy|)F`gm=G5Oh_pXB%LuD6fqORVUbKk6aZROrwij?I?Zz+Qa!OcE(c-iNXlD$=v$-4 zp`$Dl2xZPGyo#%f6n%DN!$g%F1bHBxtXA3c;%2}59+rEn+=Y;-K1Wn&X$8!#8{YgA zg;G_uj+tPDVlIU45myK`o*4md9E7>kJ0mStmz08**0DHbd{=W|cLI{l$AP{#_2&tD zz{g@@WGZN2z8ez&^;HIC7%$3|-J8wtj)7_VCK%)N49U?KIIoG!?NE#@e(pcDxmp=b zFv%tliFqM8ZOU?F(_KByLjXxP3VOul3b$2&F znC-9`Jnb+)4a!u0@qTqjk$kL=(2gZ%YO*K$7ibl41?R`|a+Q$tUseix8dwi%fXO;q zlJqnX9>f4b@YdKZKMu^wI@~C%5N4I4iH|~nZ4UDlJ&U)ELh%NqyweVb0zm#%C!ncG ztc=`?m=0tZvgt&C0Ogae9zHqy{yV68%FF8-dOPZ9;q-NOspNoNXws#NkUgnQy(s*S-K zPXM1<&I!@4&_f3E2Eo7Axg-A4$0nfK>fBH3C0lyW^u(LecOh)|W@y#J6gz=`J}}xV z?zJ5k%=6W>Yl{uvC*fg?>t@cIcsU;}ApPUNWSHLG;2yV|G}>roq0V*3g!oS#tgV2$ zO*Gg1tuCX%mG$6F&+X`^=xt*Z$0=8`!eoBwR8|8)vt+z|yuRF2US<5T>`ADs@NLi4 z=m^FN`?B56dYr4v)fyr)Wp$iB6El>s)C))_8{_)Y4eDfWUDh#&c09-r-k{>@t}z3L z6%HB?G>D}iK^CCW5e`SF7j;)FzNGpi>anO!ww1^qN3a zH~0)D_HERpw_Vz!HMBBwxkTvrdVoqOQ*eF`pLsx^-xK>9B^q~ifM;!@d(dX7m0<7+>(afnfSu-%V zg(kX~wdHpD*f|vhkM?ThH!p+f3^$+`tteG_8ek>ZkQvmy?#R)p*DebXC?;BlQr6Xs-?T-hzNLsw|J>qlC^t+^v` zP$<~fK27(U4nnXvobo$ODJh@YF#CD%2gOByiq_2pY z7FBU20OXZ9h}87T1|kN7i4nHcc4wBBnDqB*pOwSm-0f0Kf<6C`ReL;uVMUWq>vJ!+ zA~{+Da`zzWB$!sib}cr^eLV!V<#OmfR|bdN86W0gJG5dDp}RG^qFhPm^Z_tU_yj0i z4dnnzM9$A@B_q)Mc-)u3VOzYw>M_W-g|5KW_Qwi=!)`)Dx>Qy1g}mVXa$EVW>7iqm zvvCWGTMQT-whEF$0MXAJs-LTmpcjoa(nu9=S9rGw1X%KH2vg(e3c zFyZ)<#lcH}9C|*Z%2h(Ob}2w63f|hyFOO=_etp9*ci$A((g#KWmwDv3$UDb-?|DWA z=W`jjt~k9z`?-z)t)L_uxM`_Cph0M^xhE_vhP}C%(8?Sm*EO9yziQvwgQnZ6LvXb4V^9Mj?r;~iF{P6mWjP|zDq4B#@g3)3mR&fMjPEltxgzU8AdWbA;`k7i)wxX zHIMT>^qUR+a>$wiqZXrLt_?y|p!DWdlSnsoDx`i9O5?~7viud%& z+gWc|RCAW)dnl=*&MA34o&zcWPPVb0k+vk~DIuWEpiy*4Z8Ty=Uk!k$L$=3iX)K6e zbN1CvD)U4g5KX{Rz!9*wtBz?G5Q0#*>aN8uj2 zKvE7KwiL*~!QEyc6Y_R}98CzgN>8Bdkq5Nu`H5>v@=$@l4l{H+ zHzu(i>Rg1qFf}Lt*}wXTEd6HaDh?xtDVr2l_zk3Khga7~BGiFhF7mE+?fL`MIH#iY zv?RdPHO7i`c?ZHk9-iM7!(%=E$OHGjXl;nmWKIK;?boK4W9U=)?Gr{%8Abyo2@l@3po#p#w zWRw(;{}B+)fbs3TF*waPKsaOAVC-#ZOYJ}sCSLx?dINUj8wfI8k<*$0a)tRtRJFQQ z;yOlICzz&*ARicB1)?xGN5A@{Rn=7bO16$(w73#{F9HN-2C%|a zpjtaUi~QN;T^m?)RDjQVl1*aUy^f_d+{IwMcYk>a*?&;ELcLryun(%~nfPLPLF~gL z7-iDPOThYWxlAsYQ9A%bg+ci@FHqPD8hw{ZOy1wdt?G4il6XSKbbySn6~ z6~^Woe^`WSULxqHS(6K5M@ty>lbZmSp0kM>eP|`Xw4UqB3QYe1n>Z6|PmCCBDXx_Bq-Lw+SGJKf> zpIhvhx!{$mM*`J$JC1FPW1He|V(9ogWm>|0lcF*y6pGJi7F&T#(Kg<-G2v~2;WO>S zEb+^{^O}-eyF3njW4CEVDCE94cgbOZzx#JY@V@{#Bnr07AC_JJCx8AG!$@z41ew2w z1Ep&yT|?w&kOo*}?W6%#w1fV<(d7TR zZQ6uQ1-RPFPqto2P8(Ov9&8Ar8%GoTF|BE-YwJ%RTX3YkD_-NRW68p!nyrgvmdx5E zzn#qyOJ|)lvjs5eWiwCwpR*v(RkzE^$b7I)Z<(&*c^P995V88W62jTq(oc=sm#h@c zkgO|TAui0yh_;PaSJ6PL#aKLYbz8wK!<%KOYiEzbb;PoJVe_-04}F+|Zc%$2bE8;x zlKIwsJtAr^_UC*^@E4G{$n9)Z5Slw4(Y63yd@#gHJYdqj3F`rH@1L_brQcNa#HDds zv<%Y3C0Yh)7!)moGz^NCVI~_Rze*QGx*$@RKeGpoGtkw<=)u%8Hd2}FjJWoX1At> T2jlq2o6L8kzs>&U_@#dX!{`(C diff --git a/resources/translations/bg.json b/resources/translations/bg.json index 91b605ac..51965efd 100644 --- a/resources/translations/bg.json +++ b/resources/translations/bg.json @@ -124,7 +124,22 @@ }, "project_settings": { "_label": "Настройки на проекта", - "title": "Име" + "title": "Име", + "save": "Запази", + "program": { + "_label": "Програма", + "title": "Име", + "program_icon": "Икона на програма", + "window_width": "Ширина на прозореца", + "window_height": "Височина на прозореца", + "is_resizable": "Позволи оразмеряване?" + }, + "game": { + "_label": "Игра", + "default_room": "Първоначална стая", + "player_actor": "Актьор на играча", + "tile_size": "Размер на плочка" + } }, "new_prop": { "title": "Нов обект", diff --git a/resources/translations/en_us.json b/resources/translations/en_us.json index 6c8eb68a..bd153b56 100644 --- a/resources/translations/en_us.json +++ b/resources/translations/en_us.json @@ -105,14 +105,6 @@ "play": "Play", "build": "Build" } - }, - "project_options": { - "program": { - "_label": "Program" - }, - "game": { - "_label": "Game" - } } }, "dialog": { @@ -133,11 +125,21 @@ "project_settings": { "_label": "Project Settings", "title": "Title", - "program_icon": "Program Icon", - "window_width": "Window Width", - "window_height": "Window Height", - "is_resizable": "Is window Resizable?", - "save": "Save" + "save": "Save", + "program": { + "_label": "Program", + "title": "Title", + "program_icon": "Program Icon", + "window_width": "Window Width", + "window_height": "Window Height", + "is_resizable": "Is window Resizable?" + }, + "game": { + "_label": "Game", + "default_room": "Default Room", + "player_actor": "Player Actor", + "tile_size": "Tile Size" + } }, "new_prop": { "title": "New Prop", @@ -165,4 +167,4 @@ "restart": "Restart", "restart_later": "Restart Later" } -} +} \ No newline at end of file diff --git a/src/editor/childWindows/projectSettingsPanel/game.cpp b/src/editor/childWindows/projectSettingsPanel/game.cpp index 2157c143..3c1ab583 100644 --- a/src/editor/childWindows/projectSettingsPanel/game.cpp +++ b/src/editor/childWindows/projectSettingsPanel/game.cpp @@ -2,6 +2,7 @@ #include "TGUI/String.hpp" #include "TGUI/Widgets/GrowVerticalLayout.hpp" +#include "TGUI/Widgets/Label.hpp" #include "TGUI/Widgets/ScrollablePanel.hpp" #include "childWindows/settingsPanel/base.hpp" #include "project.hpp" @@ -10,7 +11,7 @@ #include "widgets/propertyFields/intField.hpp" ProjectSettingsPanelGame::ProjectSettingsPanelGame(tgui::TabContainer::Ptr tabContainer) - : SettingsPanelBase(tabContainer, "screen.project_options.game._label") { + : SettingsPanelBase(tabContainer, "dialog.project_settings.game._label") { const tgui::ScrollablePanel::Ptr scrollPanel = tgui::ScrollablePanel::create(); scrollPanel->setSize("100%", "100%"); scrollPanel->getRenderer()->setPadding(4); @@ -22,9 +23,9 @@ ProjectSettingsPanelGame::ProjectSettingsPanelGame(tgui::TabContainer::Ptr tabCo layout->getRenderer()->setSpaceBetweenWidgets(10.0f); defaultRoom = FileField::create(); + bindTranslation(defaultRoom->label, "dialog.project_settings.game.default_room", &tgui::Label::setText); defaultRoom->setSize({"100%", 24}); defaultRoom->pathFilters = {{"RPG++ Room", {"*.rmap"}}}; - defaultRoom->label->setText("Default Room"); defaultRoom->callback = [](const tgui::String &path) { Project *project = Editor::instance->getProject(); if (project != nullptr) { @@ -34,6 +35,7 @@ ProjectSettingsPanelGame::ProjectSettingsPanelGame(tgui::TabContainer::Ptr tabCo }; playerActor = FileField::create(); + bindTranslation(playerActor->label, "dialog.project_settings.game.player_actor", &tgui::Label::setText); playerActor->setSize({"100%", 24}); playerActor->pathFilters = {{"RPG++ Actor", {"*.ractor"}}}; playerActor->label->setText("Player Actor"); @@ -46,7 +48,9 @@ ProjectSettingsPanelGame::ProjectSettingsPanelGame(tgui::TabContainer::Ptr tabCo }; tileSize = IntField::create(); + bindTranslation(tileSize->label, "dialog.project_settings.game.tile_size", &tgui::Label::setText); tileSize->setSize({"100%", 24}); + tileSize->label->setText("Tile Size"); tileSize->value->setMinimum(16); tileSize->value->setMaximum(64); tileSize->value->onValueChange([](int value) { diff --git a/src/editor/childWindows/projectSettingsPanel/project.cpp b/src/editor/childWindows/projectSettingsPanel/project.cpp index ced5c1c2..8ea657a2 100644 --- a/src/editor/childWindows/projectSettingsPanel/project.cpp +++ b/src/editor/childWindows/projectSettingsPanel/project.cpp @@ -12,7 +12,7 @@ #include "widgets/propertyFields/textField.hpp" ProjectSettingsPanelProgram::ProjectSettingsPanelProgram(tgui::TabContainer::Ptr tabContainer) - : SettingsPanelBase(tabContainer, "screen.project_options.program._label") { + : SettingsPanelBase(tabContainer, "dialog.project_settings.program._label") { const tgui::ScrollablePanel::Ptr scrollPanel = tgui::ScrollablePanel::create(); scrollPanel->setSize("100%", "100%"); scrollPanel->getRenderer()->setPadding(4); @@ -24,7 +24,7 @@ ProjectSettingsPanelProgram::ProjectSettingsPanelProgram(tgui::TabContainer::Ptr layout->getRenderer()->setSpaceBetweenWidgets(10.0f); titleField = TextField::create(); - bindTranslation(titleField->label, "dialog.project_settings.title", &tgui::Label::setText); + bindTranslation(titleField->label, "dialog.project_settings.program.title", &tgui::Label::setText); titleField->setSize({"100%", 24}); titleField->value->onTextChange([](const tgui::String &text) { Project *project = Editor::instance->getProject(); @@ -36,7 +36,7 @@ ProjectSettingsPanelProgram::ProjectSettingsPanelProgram(tgui::TabContainer::Ptr programIcon = FileField::create(); programIcon->setSize({"100%", 24}); programIcon->pathFilters = {{"Image", {"*.png", "*.jpg"}}}; - bindTranslation(programIcon->label, "dialog.project_settings.program_icon", &tgui::Label::setText); + bindTranslation(programIcon->label, "dialog.project_settings.program.program_icon", &tgui::Label::setText); programIcon->callback = [](const tgui::String &path) { Project *project = Editor::instance->getProject(); if (project != nullptr) { @@ -47,7 +47,7 @@ ProjectSettingsPanelProgram::ProjectSettingsPanelProgram(tgui::TabContainer::Ptr windowSizeX = IntField::create(); windowSizeX->setSize({"100%", 24}); - bindTranslation(windowSizeX->label, "dialog.project_settings.window_width", &tgui::Label::setText); + bindTranslation(windowSizeX->label, "dialog.project_settings.program.window_width", &tgui::Label::setText); windowSizeX->value->setMinimum(640); windowSizeX->value->setMaximum(1920); windowSizeX->value->onValueChange([](int value) { @@ -61,7 +61,7 @@ ProjectSettingsPanelProgram::ProjectSettingsPanelProgram(tgui::TabContainer::Ptr windowSizeY = IntField::create(); windowSizeY->setSize({"100%", 24}); - bindTranslation(windowSizeY->label, "dialog.project_settings.window_height", &tgui::Label::setText); + bindTranslation(windowSizeY->label, "dialog.project_settings.program.window_height", &tgui::Label::setText); windowSizeY->value->setMinimum(480); windowSizeY->value->setMaximum(1080); windowSizeY->value->onValueChange([](int value) { @@ -75,7 +75,7 @@ ProjectSettingsPanelProgram::ProjectSettingsPanelProgram(tgui::TabContainer::Ptr resizeable = BoolField::create(); resizeable->setSize({"100%", 24}); - bindTranslation(resizeable->label, "dialog.project_settings.is_resizable", &tgui::Label::setText); + bindTranslation(resizeable->label, "dialog.project_settings.program.is_resizable", &tgui::Label::setText); resizeable->value->onChange([](bool value) { Project *project = Editor::instance->getProject(); project->getProgramSettings().windowResizeableFlag = value; From 06178e33d0729c656068603bdcdf72cee7e06967 Mon Sep 17 00:00:00 2001 From: "D. Quan" <60545346+sudoker0@users.noreply.github.com> Date: Mon, 13 Apr 2026 18:00:53 +0700 Subject: [PATCH 26/69] Added options for setting window state and fps --- .../projectSettingsPanel/program.hpp | 5 ++- include/editor/project.hpp | 9 +++++ include/gamedata.hpp | 2 ++ resources/translations/en_us.json | 6 ++-- resources/translations/vn.json | 30 +++++++++------- .../{project.cpp => program.cpp} | 34 +++++++++++++++++++ src/editor/project.cpp | 21 +++++++----- src/game.cpp | 4 +++ src/gamedata.cpp | 2 +- 9 files changed, 88 insertions(+), 25 deletions(-) rename src/editor/childWindows/projectSettingsPanel/{project.cpp => program.cpp} (76%) diff --git a/include/editor/childWindows/projectSettingsPanel/program.hpp b/include/editor/childWindows/projectSettingsPanel/program.hpp index 226f3df4..c6aff007 100644 --- a/include/editor/childWindows/projectSettingsPanel/program.hpp +++ b/include/editor/childWindows/projectSettingsPanel/program.hpp @@ -5,6 +5,7 @@ #include "widgets/propertyFields/boolField.hpp" #include "widgets/propertyFields/fileField.hpp" #include "widgets/propertyFields/intField.hpp" +#include "widgets/propertyFields/selectField.hpp" #include "widgets/propertyFields/textField.hpp" class ProjectSettingsPanelProgram : public SettingsPanelBase { @@ -14,9 +15,11 @@ class ProjectSettingsPanelProgram : public SettingsPanelBase { IntField::Ptr windowSizeX; IntField::Ptr windowSizeY; BoolField::Ptr resizeable; + SelectField::Ptr windowStateFlag; + IntField::Ptr targetFPS; ProjectSettingsPanelProgram(tgui::TabContainer::Ptr tabContainer); void setup(Project *project); }; -#endif \ No newline at end of file +#endif diff --git a/include/editor/project.hpp b/include/editor/project.hpp index f7bb4fbe..d2693a1a 100644 --- a/include/editor/project.hpp +++ b/include/editor/project.hpp @@ -8,10 +8,19 @@ #include #include "gamedata.hpp" +#include "raylib.h" #include "services/fileSystemService.hpp" using json = nlohmann::json; +const std::map WindowStateToName = { + {0, "windowed"}, + {FLAG_FULLSCREEN_MODE, "exclusive"}, + {FLAG_BORDERLESS_WINDOWED_MODE, "fullscreen"}, + {FLAG_WINDOW_MINIMIZED, "minimized"}, + {FLAG_WINDOW_MAXIMIZED, "maximized"} +}; + class Project { private: std::string projectPath; diff --git a/include/gamedata.hpp b/include/gamedata.hpp index 7d90b776..b30a64f6 100644 --- a/include/gamedata.hpp +++ b/include/gamedata.hpp @@ -143,6 +143,8 @@ struct ProjectProgramSettings { IVector windowSize = {640, 480}; std::string programIconPath = ""; bool windowResizeableFlag = false; + int targetFPS = 60; + int windowStateFlag = 0; }; struct ProjectGameSettings { diff --git a/resources/translations/en_us.json b/resources/translations/en_us.json index bd153b56..43f601ec 100644 --- a/resources/translations/en_us.json +++ b/resources/translations/en_us.json @@ -132,7 +132,9 @@ "program_icon": "Program Icon", "window_width": "Window Width", "window_height": "Window Height", - "is_resizable": "Is window Resizable?" + "is_resizable": "Is window Resizable?", + "window_mode": "Window Mode", + "target_fps": "Target FPS" }, "game": { "_label": "Game", @@ -167,4 +169,4 @@ "restart": "Restart", "restart_later": "Restart Later" } -} \ No newline at end of file +} diff --git a/resources/translations/vn.json b/resources/translations/vn.json index be4ccaa9..47080a58 100644 --- a/resources/translations/vn.json +++ b/resources/translations/vn.json @@ -111,14 +111,6 @@ "play": "Chạy chương trình", "build": "Dịch và tạo chương trình" } - }, - "project_options": { - "program": { - "_label": "Phần mềm" - }, - "game": { - "_label": "Trò chơi" - } } }, @@ -141,11 +133,23 @@ "project_settings": { "_label": "Cấu hình dự án", "title": "Tên dự án", - "program_icon": "Biểu tượng", - "window_width": "Chiều rộng cửa sổ", - "window_height": "Chiều cao cửa sổ", - "is_resizable": "Cửa sổ có thể thay đổi kích cỡ?", - "save": "Lưu" + "save": "Lưu", + "program": { + "_label": "Phần mềm", + "title": "Tên", + "program_icon": "Biểu tượng", + "window_width": "Chiều rộng cửa sổ", + "window_height": "Chiều cao cửa sổ", + "is_resizable": "Cửa sổ có thể thay đổi kích cỡ?", + "window_mode": "Chế độ cửa sổ", + "target_fps": "FPS" + }, + "game": { + "_label": "Trò chơi", + "default_room": "Room mặc định", + "player_actor": "Actor người chơi", + "tile_size": "Kích cỡ Tile" + } }, "new_prop": { "title": "Tạo Prop mới", diff --git a/src/editor/childWindows/projectSettingsPanel/project.cpp b/src/editor/childWindows/projectSettingsPanel/program.cpp similarity index 76% rename from src/editor/childWindows/projectSettingsPanel/project.cpp rename to src/editor/childWindows/projectSettingsPanel/program.cpp index 8ea657a2..bbc6439b 100644 --- a/src/editor/childWindows/projectSettingsPanel/project.cpp +++ b/src/editor/childWindows/projectSettingsPanel/program.cpp @@ -81,11 +81,43 @@ ProjectSettingsPanelProgram::ProjectSettingsPanelProgram(tgui::TabContainer::Ptr project->getProgramSettings().windowResizeableFlag = value; }); + windowStateFlag = SelectField::create(); + windowStateFlag->setSize({"100%", 24}); + bindTranslation(windowStateFlag->label, "dialog.project_settings.program.window_mode", &tgui::Label::setText); + for (auto &[k, v] : WindowStateToName) { + windowStateFlag->value->addItem(v); + } + windowStateFlag->value->onItemSelect([](const tgui::String &text) { + Project *project = Editor::instance->getProject(); + if (project != nullptr) { + for (auto &[k, v] : WindowStateToName) { + if (v == text) { + project->getProgramSettings().windowStateFlag = k; + break; + } + } + } + }); + + targetFPS = IntField::create(); + targetFPS->setSize({"100%", 24}); + bindTranslation(targetFPS->label, "dialog.project_settings.program.target_fps", &tgui::Label::setText); + targetFPS->value->setMinimum(0); + targetFPS->value->setMaximum(1000); + targetFPS->value->onValueChange([](int value) { + Project *project = Editor::instance->getProject(); + if (project != nullptr) { + project->getProgramSettings().targetFPS = value; + } + }); + layout->add(titleField); layout->add(programIcon); layout->add(windowSizeX); layout->add(windowSizeY); layout->add(resizeable); + layout->add(windowStateFlag); + layout->add(targetFPS); scrollPanel->add(layout); panel->add(scrollPanel); @@ -105,4 +137,6 @@ void ProjectSettingsPanelProgram::setup(Project *project) { windowSizeY->value->setValue(programSet.windowSize.y); resizeable->value->setChecked(programSet.windowResizeableFlag); + windowStateFlag->value->setSelectedItem(WindowStateToName.at(programSet.windowStateFlag)); + targetFPS->value->setValue(programSet.targetFPS); } diff --git a/src/editor/project.cpp b/src/editor/project.cpp index 7709ee88..620e7a9d 100644 --- a/src/editor/project.cpp +++ b/src/editor/project.cpp @@ -60,14 +60,17 @@ Project::Project(const std::string &path) { char *jsonContent = LoadFileText(path.c_str()); json j = json::parse(jsonContent); - programSet.projectTitle = j.at("title"); - programSet.windowSize = {j.at("windowSize")[0], j.at("windowSize")[1]}; - programSet.programIconPath = j.at("programIcon"); - programSet.windowResizeableFlag = j.at("windowResizeable"); - - gameSet.defaultRoomPath = j.at("defaultRoom"); - gameSet.playerActorPath = j.at("playerActor"); - gameSet.tileSize = j.at("tileSize"); + programSet.projectTitle = j.value("title", ""); + programSet.windowSize = {j.value("windowSize", json::array({640, 480}))[0], + j.value("windowSize", json::array({640, 480}))[1]}; + programSet.programIconPath = j.value("programIcon", ""); + programSet.windowResizeableFlag = j.value("windowResizeable", false); + programSet.windowStateFlag = j.value("windowState", 0); + programSet.targetFPS = j.value("targetFPS", 60); + + gameSet.defaultRoomPath = j.value("defaultRoom", ""); + gameSet.playerActorPath = j.value("playerActor", ""); + gameSet.tileSize = j.value("tileSize", 16); ChangeDirectory(projectPath.c_str()); UnloadFileText(jsonContent); @@ -107,6 +110,8 @@ json Project::toJson() { j["windowSize"] = {programSet.windowSize.x, programSet.windowSize.y}; j["programIcon"] = programSet.programIconPath; j["windowResizeable"] = programSet.windowResizeableFlag; + j["windowState"] = programSet.windowStateFlag; + j["targetFPS"] = programSet.targetFPS; j["defaultRoom"] = gameSet.defaultRoomPath; j["tileSize"] = gameSet.tileSize; diff --git a/src/game.cpp b/src/game.cpp index 9523a6fd..e8991d3e 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -67,6 +67,10 @@ void Game::useBin(const std::string &filePath) { } else { ClearWindowState(FLAG_WINDOW_RESIZABLE); } + SetWindowState(gameData->programSet.windowStateFlag); + if (gameData->programSet.targetFPS > 0) { + SetTargetFPS(gameData->programSet.targetFPS); + } auto iconTexture = resources->getTexture(GetFileName(gameData->programSet.programIconPath.c_str())); Image iconImage = LoadImageFromTexture(iconTexture); diff --git a/src/gamedata.cpp b/src/gamedata.cpp index a1313853..d3659c1f 100644 --- a/src/gamedata.cpp +++ b/src/gamedata.cpp @@ -97,7 +97,7 @@ void serialize(Archive &a, DialogueBin &b) { template void serialize(Archive &a, ProjectProgramSettings &b) { - a(b.projectTitle, b.windowSize, b.programIconPath, b.windowResizeableFlag); + a(b.projectTitle, b.windowSize, b.programIconPath, b.windowResizeableFlag, b.windowStateFlag, b.targetFPS); } template From 3a36d3a9147637a027499edf9ffbb0ef0eeab91e Mon Sep 17 00:00:00 2001 From: "D. Quan" <60545346+sudoker0@users.noreply.github.com> Date: Wed, 15 Apr 2026 14:17:17 +0700 Subject: [PATCH 27/69] Add ability to set project version --- .../childWindows/projectSettingsPanel/program.hpp | 1 + include/gamedata.hpp | 1 + resources/translations/en_us.json | 1 + resources/translations/vn.json | 1 + .../childWindows/projectSettingsPanel/program.cpp | 11 +++++++++++ src/editor/project.cpp | 2 ++ src/gamedata.cpp | 2 +- 7 files changed, 18 insertions(+), 1 deletion(-) diff --git a/include/editor/childWindows/projectSettingsPanel/program.hpp b/include/editor/childWindows/projectSettingsPanel/program.hpp index c6aff007..49669cc2 100644 --- a/include/editor/childWindows/projectSettingsPanel/program.hpp +++ b/include/editor/childWindows/projectSettingsPanel/program.hpp @@ -11,6 +11,7 @@ class ProjectSettingsPanelProgram : public SettingsPanelBase { public: TextField::Ptr titleField; + TextField::Ptr versionField; FileField::Ptr programIcon; IntField::Ptr windowSizeX; IntField::Ptr windowSizeY; diff --git a/include/gamedata.hpp b/include/gamedata.hpp index b30a64f6..f1457bec 100644 --- a/include/gamedata.hpp +++ b/include/gamedata.hpp @@ -140,6 +140,7 @@ struct GameBinSettings { struct ProjectProgramSettings { std::string projectTitle; + std::string projectVersion; IVector windowSize = {640, 480}; std::string programIconPath = ""; bool windowResizeableFlag = false; diff --git a/resources/translations/en_us.json b/resources/translations/en_us.json index 43f601ec..b5ad2caa 100644 --- a/resources/translations/en_us.json +++ b/resources/translations/en_us.json @@ -129,6 +129,7 @@ "program": { "_label": "Program", "title": "Title", + "version": "Version", "program_icon": "Program Icon", "window_width": "Window Width", "window_height": "Window Height", diff --git a/resources/translations/vn.json b/resources/translations/vn.json index 47080a58..ba47420e 100644 --- a/resources/translations/vn.json +++ b/resources/translations/vn.json @@ -137,6 +137,7 @@ "program": { "_label": "Phần mềm", "title": "Tên", + "version": "Phiên bản", "program_icon": "Biểu tượng", "window_width": "Chiều rộng cửa sổ", "window_height": "Chiều cao cửa sổ", diff --git a/src/editor/childWindows/projectSettingsPanel/program.cpp b/src/editor/childWindows/projectSettingsPanel/program.cpp index bbc6439b..6c485426 100644 --- a/src/editor/childWindows/projectSettingsPanel/program.cpp +++ b/src/editor/childWindows/projectSettingsPanel/program.cpp @@ -33,6 +33,16 @@ ProjectSettingsPanelProgram::ProjectSettingsPanelProgram(tgui::TabContainer::Ptr } }); + versionField = TextField::create(); + bindTranslation(versionField->label, "dialog.project_settings.program.version", &tgui::Label::setText); + versionField->setSize({"100%", 24}); + versionField->value->onTextChange([](const tgui::String &text) { + Project *project = Editor::instance->getProject(); + if (project != nullptr) { + project->getProgramSettings().projectVersion = text.toStdString(); + } + }); + programIcon = FileField::create(); programIcon->setSize({"100%", 24}); programIcon->pathFilters = {{"Image", {"*.png", "*.jpg"}}}; @@ -133,6 +143,7 @@ void ProjectSettingsPanelProgram::setup(Project *project) { programIcon->value->setText(GetFileName(programSet.programIconPath.c_str())); } + versionField->value->setText(programSet.projectVersion); windowSizeX->value->setValue(programSet.windowSize.x); windowSizeY->value->setValue(programSet.windowSize.y); diff --git a/src/editor/project.cpp b/src/editor/project.cpp index 620e7a9d..f83e8bc9 100644 --- a/src/editor/project.cpp +++ b/src/editor/project.cpp @@ -63,6 +63,7 @@ Project::Project(const std::string &path) { programSet.projectTitle = j.value("title", ""); programSet.windowSize = {j.value("windowSize", json::array({640, 480}))[0], j.value("windowSize", json::array({640, 480}))[1]}; + programSet.projectVersion = j.value("version", ""); programSet.programIconPath = j.value("programIcon", ""); programSet.windowResizeableFlag = j.value("windowResizeable", false); programSet.windowStateFlag = j.value("windowState", 0); @@ -108,6 +109,7 @@ json Project::toJson() { j["title"] = programSet.projectTitle; j["windowSize"] = {programSet.windowSize.x, programSet.windowSize.y}; + j["version"] = programSet.projectVersion; j["programIcon"] = programSet.programIconPath; j["windowResizeable"] = programSet.windowResizeableFlag; j["windowState"] = programSet.windowStateFlag; diff --git a/src/gamedata.cpp b/src/gamedata.cpp index d3659c1f..bbaed02c 100644 --- a/src/gamedata.cpp +++ b/src/gamedata.cpp @@ -97,7 +97,7 @@ void serialize(Archive &a, DialogueBin &b) { template void serialize(Archive &a, ProjectProgramSettings &b) { - a(b.projectTitle, b.windowSize, b.programIconPath, b.windowResizeableFlag, b.windowStateFlag, b.targetFPS); + a(b.projectTitle, b.projectVersion, b.windowSize, b.programIconPath, b.windowResizeableFlag, b.windowStateFlag, b.targetFPS); } template From 7bd7ea59b45a8086ca87473239c68fcedc3953b2 Mon Sep 17 00:00:00 2001 From: "D. Quan" <60545346+sudoker0@users.noreply.github.com> Date: Wed, 15 Apr 2026 14:19:41 +0700 Subject: [PATCH 28/69] Add field to ui --- src/editor/childWindows/projectSettingsPanel/program.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/editor/childWindows/projectSettingsPanel/program.cpp b/src/editor/childWindows/projectSettingsPanel/program.cpp index 6c485426..632f48db 100644 --- a/src/editor/childWindows/projectSettingsPanel/program.cpp +++ b/src/editor/childWindows/projectSettingsPanel/program.cpp @@ -123,6 +123,7 @@ ProjectSettingsPanelProgram::ProjectSettingsPanelProgram(tgui::TabContainer::Ptr layout->add(titleField); layout->add(programIcon); + layout->add(versionField); layout->add(windowSizeX); layout->add(windowSizeY); layout->add(resizeable); From 2318485bd9a337cb713a8f9b7bf74bf7f6723975 Mon Sep 17 00:00:00 2001 From: thefirey33 Date: Wed, 15 Apr 2026 18:31:27 +0300 Subject: [PATCH 29/69] Add turkish translation Fix translated text not fitting into settings child window on a 1920x1080 screen --- resources/translations/en_us.json | 4 +-- resources/translations/tr.json | 28 +++++++++++++------ .../childWindows/projectSettingsWindow.cpp | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/resources/translations/en_us.json b/resources/translations/en_us.json index b5ad2caa..a75d7a08 100644 --- a/resources/translations/en_us.json +++ b/resources/translations/en_us.json @@ -133,7 +133,7 @@ "program_icon": "Program Icon", "window_width": "Window Width", "window_height": "Window Height", - "is_resizable": "Is window Resizable?", + "is_resizable": "Is Window Resizable?", "window_mode": "Window Mode", "target_fps": "Target FPS" }, @@ -170,4 +170,4 @@ "restart": "Restart", "restart_later": "Restart Later" } -} +} \ No newline at end of file diff --git a/resources/translations/tr.json b/resources/translations/tr.json index 058d611c..a5de99c5 100644 --- a/resources/translations/tr.json +++ b/resources/translations/tr.json @@ -105,14 +105,6 @@ "play": "Oyna", "build": "Derle" } - }, - "project_options": { - "program": { - "_label": "Uygulama" - }, - "game": { - "_label": "Oyun" - } } }, "dialog": { @@ -132,7 +124,25 @@ }, "project_settings": { "_label": "Proje Ayarları", - "title": "Başlık" + "title": "Başlık", + "save": "Kaydet", + "program": { + "_label": "Uygulama", + "title": "Başlık", + "version": "Versiyon", + "program_icon": "Uygulama Simgesi", + "window_width": "Pencere Genişliği", + "window_height": "Pencere Uzunluğu", + "is_resizable": "Pencerenin Boyutu Değiştirilebilir mi?", + "window_mode": "Pencere Modu", + "target_fps": "Hedef FPS" + }, + "game": { + "_label": "Oyun", + "default_room": "Öntanımlı Oda", + "player_actor": "Oyuncunun Aktörü", + "tile_size": "Kare Boyutu" + } }, "new_prop": { "title": "Yeni Obje", diff --git a/src/editor/childWindows/projectSettingsWindow.cpp b/src/editor/childWindows/projectSettingsWindow.cpp index b733066d..a1215f34 100644 --- a/src/editor/childWindows/projectSettingsWindow.cpp +++ b/src/editor/childWindows/projectSettingsWindow.cpp @@ -43,6 +43,8 @@ ProjectSettingsWindow::ProjectSettingsWindow() : PopupWindow("ProjectSettings") this->currentWindow->add(tabContainer); this->currentWindow->add(saveButton); + + this->currentWindow->setSize({"40%", "40%"}); } void ProjectSettingsWindow::open() { From 9fa3c9abc8a8dc9b585eb55d8f25db31925b09a4 Mon Sep 17 00:00:00 2001 From: CDevv Date: Wed, 15 Apr 2026 19:08:58 +0300 Subject: [PATCH 30/69] Bulgarian translation of new keys --- docs/guide/projectsettings.rst | 4 ++++ docs/images/rpgpp-projectsettings.png | Bin 17889 -> 18841 bytes resources/translations/bg.json | 5 ++++- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/docs/guide/projectsettings.rst b/docs/guide/projectsettings.rst index 9ffa2c5e..0ea22eab 100644 --- a/docs/guide/projectsettings.rst +++ b/docs/guide/projectsettings.rst @@ -14,6 +14,8 @@ There are two categories in Project Settings: * **Title** - The Window's title. + * **Version** - Version of the game. + * **Program Icon** - The icon of the window. * **Window Width** - Width of the window. @@ -22,6 +24,8 @@ There are two categories in Project Settings: * **Is Window Resizeable** - Whether the window will be resizeable. + * **Target FPS** - The frames per second that will be targeted. + * **Game**: This category changes the gameplay of the game. diff --git a/docs/images/rpgpp-projectsettings.png b/docs/images/rpgpp-projectsettings.png index d8a0c443a0b5883cb81d98cea85bf1eeacfc17fe..59641c1e5de0f9d0fb6b45889f7dff13b49bb98a 100644 GIT binary patch literal 18841 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 literal 17889 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 Date: Thu, 16 Apr 2026 17:37:43 +0300 Subject: [PATCH 31/69] Make directory option in New Project dialog + provide default resources --- include/editor/widgets/newProjectWindow.hpp | 2 ++ include/room.hpp | 2 +- resources/defaults/actors/playerActor.ractor | 1 + resources/defaults/dialogues/welcome.rdiag | 1 + resources/defaults/fonts/LanaPixel.ttf | Bin 0 -> 3154436 bytes resources/defaults/images/Hills.png | Bin 0 -> 4321 bytes resources/defaults/images/character.png | Bin 0 -> 773 bytes resources/defaults/images/prop.png | Bin 0 -> 188 bytes resources/defaults/images/ui-npatch.png | Bin 0 -> 187 bytes resources/defaults/maps/map.rmap | 1 + resources/defaults/props/prop.rprop | 17 +++++++++++++++++ resources/defaults/sounds/Text 1.wav | Bin 0 -> 119864 bytes resources/defaults/tilesets/actorTiles.rtiles | 1 + resources/defaults/tilesets/tiles.rtiles | 6 ++++++ src/editor/fileViews/dialogueFileView.cpp | 6 ++---- src/editor/project.cpp | 17 ++++++++++++++--- src/editor/projectFileVisitor.cpp | 5 ++++- src/editor/roomLayerViewVisitor.cpp | 6 ++++-- src/editor/services/fileSystemService.cpp | 7 +++++++ src/editor/widgets/newProjectWindow.cpp | 16 +++++++++++++++- src/interfaceService.cpp | 4 ++-- src/room.cpp | 14 ++++++++------ 22 files changed, 86 insertions(+), 20 deletions(-) create mode 100644 resources/defaults/actors/playerActor.ractor create mode 100644 resources/defaults/dialogues/welcome.rdiag create mode 100644 resources/defaults/fonts/LanaPixel.ttf create mode 100644 resources/defaults/images/Hills.png create mode 100644 resources/defaults/images/character.png create mode 100644 resources/defaults/images/prop.png create mode 100644 resources/defaults/images/ui-npatch.png create mode 100644 resources/defaults/maps/map.rmap create mode 100644 resources/defaults/props/prop.rprop create mode 100644 resources/defaults/sounds/Text 1.wav create mode 100644 resources/defaults/tilesets/actorTiles.rtiles create mode 100644 resources/defaults/tilesets/tiles.rtiles diff --git a/include/editor/widgets/newProjectWindow.hpp b/include/editor/widgets/newProjectWindow.hpp index d0d6f3dd..7bf47b8a 100644 --- a/include/editor/widgets/newProjectWindow.hpp +++ b/include/editor/widgets/newProjectWindow.hpp @@ -4,6 +4,7 @@ #include "TGUI/Backend/raylib.hpp" #include "TGUI/String.hpp" #include "TGUI/Widgets/Button.hpp" +#include "TGUI/Widgets/CheckBox.hpp" #include "TGUI/Widgets/ChildWindow.hpp" #include "TGUI/Widgets/EditBox.hpp" #include "TGUI/Widgets/Label.hpp" @@ -19,6 +20,7 @@ class NewProjectWindow { tgui::Button::Ptr confirmButton; tgui::Button::Ptr cancelButton; tgui::Label::Ptr fileLabel; + tgui::CheckBox::Ptr makeDirCheck; typedef std::shared_ptr Ptr; typedef std::shared_ptr ConstPtr; diff --git a/include/room.hpp b/include/room.hpp index c37cab98..6b271f4c 100644 --- a/include/room.hpp +++ b/include/room.hpp @@ -57,7 +57,7 @@ class Room : public ISaveable { /** Empty constructor */ Room(); /** Construct a Room from an .rmap file */ - Room(const std::string &fileName, int tileSize = 48); + Room(const std::string &fileName, int tileSize = 48, bool createPlayer = true); /** Construct a Room by using a TileMap pointer */ Room(std::unique_ptr tileMap); /** Construct a Room by using the RoomBin binary structure diff --git a/resources/defaults/actors/playerActor.ractor b/resources/defaults/actors/playerActor.ractor new file mode 100644 index 00000000..f3c9e1da --- /dev/null +++ b/resources/defaults/actors/playerActor.ractor @@ -0,0 +1 @@ +{"animations":{"down":[[2,0],[3,0]],"down-idle":[[0,0],[1,0]],"left":[[2,2],[3,2]],"left-idle":[[0,2],[1,2]],"right":[[2,3],[3,3]],"right-idle":[[0,3],[1,3]],"up":[[2,1],[3,1]],"up-idle":[[0,1],[1,1]]},"collision":[6,24,36,24],"tileset":"tilesets/actorTiles.rtiles"} \ No newline at end of file diff --git a/resources/defaults/dialogues/welcome.rdiag b/resources/defaults/dialogues/welcome.rdiag new file mode 100644 index 00000000..3ccb9beb --- /dev/null +++ b/resources/defaults/dialogues/welcome.rdiag @@ -0,0 +1 @@ +{"diag":[["Introductor","Welcome to RPG++!","0",""]]} \ No newline at end of file diff --git a/resources/defaults/fonts/LanaPixel.ttf b/resources/defaults/fonts/LanaPixel.ttf new file mode 100644 index 0000000000000000000000000000000000000000..33cad50b6a413f6cc6eb1ce2ee1d71bfa406fc94 GIT binary patch literal 3154436 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⪼hF0S69)sIeO5E-sNP&9dijZ4` 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

JiWTRfIMr9sdlllP0W&io;Hq5ApZg#a^^gXR7 zHV?&=pAI~rZYHZ>jx5b+e6&BtM-RMYU;Mv&&q8G-)#hC)J1+I_iVZY3Cb}*cufx9x z`QQN4%ObojN_4nVn)1aYg0rI%)WsjTAI4oMRpX=Q4OTmKtgsQX5~*Ie2Z#aimK3_p zqQB6|vA1!9kY-8z5Ib17DWh4DGE6-)vYtF#e*f!H9cA6=_bNS5>-Yhy>u1x}R}2B+ z=2+$<-XM-~$jH;h8V_-A&~LPTOL45wL)#^7>jrXS-=p^MFq&Y&Y%^!05!TdhutXL1 zVpS5McD$}hqGD%Sd(*tC(!tuH z`vFDv{FrD&r-4Pco4Wbep!dU)i%qNJkx$K^DO0?14Z$kzHpkvNQ3b^WCBV?B`|8C4 zmw-zCTY8#e=N6aj9&p7bFtvGsm~iSg$3`dmgW{%qp1!c~!`R7ln=xnzqd{HDfl-RG z^PV({4)rK>9@t^vlu7B!$M0KqB6kE_;tER`npgHW({E=(a83_0qsdzdVWs8|SyJ(Z(xa#!d+*(hjHsZmhq zQ(fxJ!llc?>SI^&Bs7o^X9WhWX+xu--G0MqqS!QoRo{B0m+dx8bg-IeG+cDbxuIL$ zPbRzKBUV`GXpoQYkSyo55y{k6M+EoAiQ`-y>1!<6$+!7r#?#1CQ&eN(sM`YtnO*Qo z0{GGm_vV2ZN2g~FW7I%KW3GTf82h|hG6|?yOe*K~k~c8XPYH-%Bs8T}_8k);;ifr? zk|>)Iy$z|O1t@tpJoKE17`rSr(4o4~a9R=#ZAXJlb{91#k=@)r%gWeu_9d}Mt)$>+ zs1>X6x-6p%N#fUfhpq%1%}vSnwHPREJiG?2DM`Tv$ck^x&yqL>bra8=I#tke)Y8$A zH$ENg+1698mNYL!puIMvEFFVo3;j%QjXrfq#J>%V9#&Q?2^~zSu<_sawHSd+3VLqR zYfSRCdHFRa=*nAdnT8`I+%rvzWwX%>choa!4(v1Jl2&Y{hbt{1-=npbw{XwyA1m(J zd?WA{O(Na*<{AH6nCB(~pxy8Z+#fwy7fbp~En5Zr$>K!IJYVcYIcc3zrw?>LbKlha zfIW+u1M>``-LcBfbLYz`J3L&6LCy(#+Fale4l(s7346wjVDHubKFqUQ|B87I9v}{E z6)~c$kanv4P__Src^+hlz&uw=J4?}7wIs33VccP!T$_=B|7jqN+PQnKUYaX|7_U_%k1Mhr)u*MDEIdC>v$}cv){)6z&iN{BH=PMW$zayZs zu-2SGtlvDqIu4ogr_&nF;!iHMT{V>_xa;0)rVZtcdXSk(c=T09(yYbEPa037x#CgS zB(7e~e+kJ975~a_qk-tL`Tw)_cBz^rNqTNX1woRhPa}dLD4IqbqJp5R5#mrJo1`fk z4Wy<}Q|K#Ap{AfI)D-GU_j#o$XaZ{Kyw7W9Zsxw$+7Tt4FEjUly8ZvWZod5cHpaQ} z4yaFzbF1y($%Gd#54C-uo042T`gN}30pHU=R6`M|G1g-1Suclm-mRjPK%Vaz>-I}+) z;k4I2O%Sq?e0P(df7Lm)I8z-LuGH`cvB%zE&40Sb3xvB(fZmHn`}4@uf>aU3IS7(0 z=3au1vk5&5`m%6OQVGm6cMzZzp~~%p(U-nL(Y@Xzt7pRNj)ikBw00oBZ!%;~P9$V& z%{?cpKuV>J&lfv6QiOs-+%fV*9Yg1ZiKKJIMoft$b&fZ{a2(aq<&6>2B{I>H|G_^~3t)dQO_&n0&}z z`#hSrygo^SV#V5JnzYoec=KdO47GH#2dy(}KA$kGul&)t>Z@oK*0G)=pGVxu*z}dV zlDBBTvd}fW<^B3S6DCuq>wlOsWt2syn}eo9_O@-+1kF2g!lGGI#aB1Epoyw09VGpwy7X4PChqTrZgEptYzX4HYUi*}WVPa6F_O`?K_vJI^d)%(^hkAak! z9&Bj#Q*~kDGrikm+2?zwQs(H2(yXK-LpnliKnoD=d*q~!nZ|0FmGW8h<-3KT;GnY7 z!<0%s>ypHF>BS|6O&YhUHdBol&-ql{qT17{qDy{yoLHH10453TD#+7R9>r z@=4wkPtR$ahsV=)PdOSb;Ckn&yYQPMY{X546-IlAo4;HB5_qJ}yu}Ple)G3ZvC!TF zvNIPam;T}UUkt3?6D|0C4ds0Y)BcnDc4)-o#Cxh1kJGJ%`0R%l z)CaM>T9LJ?Voetu{@-&hb%z53(w|=N-&bj5)=Q9>OD1t15xz~k2nE8hqJZz}wIX81 zf8oL8<$I@Iw$y%zmV^=Lu$a=-TI3q{MN5_ z&)}YH6({4xISsS@IVWZ1UnXLafim-0|C3_tyXRu+6b62@?F&23$yn*xWQ`z|NlsCh z!%5Y)$spdfxUi%uq3X|z((Wg9DBcD2$-$c`8Prci`C#QRLJZ49Ui?lZGG|0$O z%uKeT!f00Z8*x9q2Pfu%U~q>Yx*U7>>)9AO+b%{u;^l(#>7Xp^n6ABgoSbkx? z?9saVyE9t?MrVXkF7v=2>bat{z(2?WYEi4w+YWxTXo`jx=ip1!E-EkdIulBQgpW-{7Df)QY?}F?OM=4L%XGDds;WACT z?1(4Z`*^e+RCj1HjskAVbVsYxOyIay?YSR2=Qk{y+LVxbURcda4|o2%x+JnT{un+-TpRAw+_Bp7$#^7;RZ&a0^f2IU~wHD+0dA zmwtNrwJJty*%AIU+mbzZ__T6L*UQlHcAfxQCD%J8n*CX$iai-l_G9uM=2e_Apxv$9 zg4S8a4#$p{-qYJ6-AJi+&8S^{H-NKbJq_Ejj#^jUY5P@|U#olT+EOY+N}kHfDy#v6 zt~98(5_b4%?-A_x$M{{LONXK$cagi^p4+S1v#PUnhGvB-@RW<=ia(O2csu}41?`+$ z)h=^YLUkq}oZ@WW*yS6t^gEt4lB2oGPxD&p;-{@F7PXlf9Kr8;Ej!G4)s>(1oKf+# zYV#-8xXTS*YhI&cSV7DxLTT~%1skX0XAK?~gB|3>WT|Z6mi9%T=qavvzw-IS(PlLl zRe6nkTaZa~ZYCQ<2L7@Fq(<`Uzel+Tns^d-Fje7+g2qU3rRj@|*|5D{RCl+1cg*f@z%`s|Q`8!$*v`~mark7UiO*$Wv zLl3!AK!&$}jcd@?5xcQw&7as6&l&~}(X;1qMp~uJ_{F?=%7nh%sw#8<5e}p@L;Gyc zoIG!EelXAWqYu2d-B&V~);H%`-yNX7xu48>*s>R@ucBCvMCxfLTuIR(4YiJ)FFQqU(RkDVhcu^$b;6lq+7)gI+|I{<;FJneUb5cHQ!tuf6GZt2TztMHszH-S6u}wnRY)o`W+W|i| zg|8Z&W29-*j`h{I&p46fikiDviOJE`lRY$|@?^kl`!78+x`~;fbsIP1IixE^B9sCo zdp6mYE6x}8Q%J*`kZoZS`%hY@K*{i(gd{{nOox`+jJ>|bCEH{ukV*Lq?;!1-S)cQs z7BLS=$EbFFGQH^mzY*jpbYA| zEs@g|M3h-q-5|$zl1~lr0Ae>9iq)f>87m#zSgahU56>`pV z?y$v%cDOg=?q-GQ6Xg!ky|F1#5h?w&jpPTns0ZEYzfi66@SNq`@wc8%Dow6T@yQkV zf_^5iO853heQ?r1r44~F@+^VLZ>JCaZ+`6>oiV-gczT%f2l<=5Y`XW!i@ZoL3(sis zPg@w_Vnnh-?1-Kn3$0!&r#35d#d+dBwKx4+%O?54MA&LMxcCw`3fn3AaPp4dzK20L z84m7HQRVb0JshZK)y5AwjsG_J^Jn_ROU#LtiyB7%y!wK~NTmf~rH`Y>l?$>{5v%S3 zTUrlhhM>ouRz3w#wr#ZZ>p{cIn+lT|<-?^`j2aqM4>*%X=ct~=6lN+(T#3G_vwJ&e zEj!i}rinT2MtZ`F)H!#On)Fr`QVm``Wch5x*tDFCF%eYOf-P`TzmIn7{rQOSs(_MA zXVScr;@JznG0|DLiJOoGqPm9Hc`~0Y($h(bIA;X;K;2IkGnnhLN{7iEz0yN zxSJ3PEy^p!NZF~n#Mb5C)%^{4KxvV3xy@uy|L?HlVfEAjjk z4>7NS*c2!GIO}x@F=K*vHl_ARlb;o}qTpUi_mmHhS^E2{IQ21Bczz`|Ku9~y*4wJB zIa9D-hW?OmVI=!Yl$JGBAPu|A$S^>0dL1CCInLx|*?FJk z+&NWfzKLge4BuT9spdHuBgzn}P_nu_?PjI}u?9w)>Mh#?FzQ|=^nO7`Q_k<0?U)T` z2X{1MGxi86MU@l|Ys&}P|GM+NWQk+O1HFeS&&(6#uTu5Ub@dyQ%G0bTD1nLSZt$^o zZhp%zoPZWKCt6pxbPTd^Di?yhI5LdS+g?D66r|&X{E`H(bXyxx79L?IZ*qo>%#0DUYP}1VNiXT2DKBr`c^p| z`x#)6>?slhsjiQ1LOJ8-o0_EMwwX}5)s#P~gk_eVq_I`bpXuKrps9<>m2S%AB9$xd zItmjFl}Fxe20BMqy*TDWYEFmcZ@ zDXNtviKxW-GuKtz73NVd#!Z6VdEU;7!eAJsO(qtU=@MBxJ5+LQebt#W_WE9`2c&}l zrQcb~Jd?fYG{yd%0>em>&o0wu8o9ROV?#TQta5hbB^piP0dGG5d4BbqZG6=7EbLo* z;$bDQ)ZLyqoHk5M5AzQmW=M5cgL}QONmG#4L}%_Tg!Z8#XJE-kYKB8pl5~k}mQsCj@(L*BwmuRgED{!VbG_>nifI%hik z+q}dF^1>EB5!aVlQ{kuF$1Tc_^CqkNX5v&?N%=!I;n5}Mk)+r0wQ$E7U-YB*b0=_s zb`Nho{~Q8sv!}WTLb&6!`-ZW`9?*!lhY6I`n-MM*%i%}RwVbyzkoG!cT^LISk9y&? zA0|;r_d1K}+<%9&*knMj!>i^r3c5Xs($_tUiX5#?zIZfA^dqjXy=c|U(TnyBYEu42 zhQW6tg}#<#8tu?y#p_HmZHJnRZL_GfgDYeB-IjCh%Pg#-Xlv|Qm(pdj(g%OEdBEJi zUc1Ss_eIuGy*%-kJt0)U(sz?7exCWpn()a5HIS>{ZGZSNCsW(=NW}|0Y&$mM=5apd zJQKYRNo7`4$3WQ2>JWEmHx(DPZ8BD@N0^NKu}AZQ@)>PVQ;&ZSlq%cI9@ZY zGu%ecQFl@FlSu9^Dg&O_ZstM7dzC|i-0H!GYXl>KGZX5ErGhXZ9O(#K$9?0V4p3pKqD+=1pcVmS%--i8}G+zN*4Hn0WC~U+t<7+cJ{sAm&>}Ebm^Thd4DPO7I&*(DZCkb zMf;qKPDhA;r}8c!&U)e~v?3fc=!Kb$>?-Z3!&rhzTlo^7sC%6u4jjijoh@y-viS^m z%R@ztk+GJSDMMf2R=u;{AIEy1{60cx%pKaeS3>#nw23lfj-V^xFA6NS)m$!VY^L!Z zvwnh|-bgYmDTvWyrX>#8e-qCVVo{2gkdo&_5d8pTL&ju4-+4b}*B#x-sXGW?wHL6f z_KRzA1Ai%Yw@LKmYY&Js_br!w*+)oly3?Dfe=>3Me)u!*73kD+Ib;bld#^50V; z?SH5j-l-KO>1LA3d}1;*4Nb@r{jg~47^$V&>~a^SmT&r+ohgE`!gROT5vU!f7da!o zHm#PN2=XlGvwy4^SKAFQq3%pN%=*%L5fd9R!f2V#^0r=)&d%O)15KA(nnb10~tM!x9y{qId!$)ciw#KAXz{p04N(T`rDm#Gr4yH}r6CHmVv{dwJ% zC-!8{RXwmnXWOd$ulE^2DjPLo$0FO>H7ok0=Yv!>)C9d(1h50RQ&Yio4*>J{x<9%< z-NnHh^R@G^&xMRH^t{Qkl9EWAkNfiS2e1az)o-k@mU)O}k_M3$;XNE9x^YOV3#fZJ zcABvZnD;D9+AH#;0LA|0+#5NcNUU6G`K$tQqtDbJZ%16&T4i%8MG2^TwyxirIwD>8n(} z#9wJ|Sz2F={-=F8@JCTYs%38%xliG8P`8ewBk=)7<{r{`9A-43RBn9D_+Y&V%y0E1 zKghv!h96BXL1?vQycv<0QwqMUcVDNKTJ|V$q(=uoSM4g@wpcg%|2k{jnI)OjgjRgV z$1J65*CA9e!a!PaepFBVzy6DRVown1%1`an+xTbFe&(w~^RWqN2ajr+RxZWg=-qlE z18a}fPjCFJU2Hwuqq~_M&$=F72Kql#{8N-cf_LJyob~;3P(2>4b_Li7`vxUPrkJ7Oo z?{YS}^+D^%!}We}Xi$`$1R*^$@l>gq3>9>csQCm>a&6pJ!#;$DKWsXcD%Sgvw%vG& z2j^O}MzWF0S6Z?a+t2Ce{Y2_hN8ggyyUbbAbp@@PYBs$PdOA(0pwVGpIq-4K-|r%(iZ|f(xIs4L3-naA2F6|9gClh7Zi?_@afhE_1!)6p>rq1 zcX^xnuJxL@RNU-}7u9_GQc-F;^qlN}Zz$ki*J51Q*89yD6;Cu^6X=g6PuH)&1k4t< z9_);uXFHc0cj?oHpPR zUSCNZ?OQi`s4l-by0iEziWt;~9@^%CEu2Y~23}Ot70K~Tc~zW`it5Ai3uP=TNZhJH zNX~1Q{voD*yWX49w0Fu!W|4JfCPBAKA;H4RDR#ZiBhv`x%692Q()x&5%55fjPo)^X zA0)}&WD++#)Ur^(o=l)$DYWfPRd=17Ig3t}ISM^hy<=+UEqZkJd=|A#mQ9YHnO=+m z3Kkf3a^e;H{G=pk9J-8 z>E-LD|1^4J9qfu4+5?yCg(va{`gQ5$^)qa10wSdFQZcZyL2z?HG}Akh((EUkmlmvX z3R}^#cvb2OM*Cx{uJ`_{=W*U_gwwo!ls-W?(|S@6NGH?=H$pj6VbC%I*-xC9qtRG+7>+g$v@FMV;e9UU|8s_#*M?`L@wEz3STADcBK zv)-gJB$rflJWfpqdDAUM?qZgGS>{ec`%U+~yW2^x2nh<&+g*|ZRu)I)i!I-CAESi) z)W?L@?h+3cFCtriF>3velv*loa+@+KbhrcI-+mXu9l-_u+T<64B>ZNpuzW*ht8A+P8*&9}l(eM@)YC}hw}XnaDcU;V2$?u@6LU1v|o ze8WAV&flC!O5aN|r&j7mOgl=RjnZt+B21+~`6+#F*Qc0$IO^5;-=nI7W&VRy)= zA3Gu|>~`w+&;Iz1m!66YtsXe*#Ei-0P|1&1N1Gl}e zEBa5(FU++p-31h&`xj2VLEZZ$>T_g+rU&*)+=Jg{mBN27m`6Ug*`I-?t-hn4!yxe& z^6CM>Hls8zU@+guO4dC(r5k?SIjO&ZD?$(wE}B;y1{2*u-Ls_j9)lQ+HBaQQOJ5^< z7>k|$&=y&E48qp_ZWO_(^%k(3{psa7C-s2IP8(?Xfy*wcpS|Ly^eqkppScFEzIjb; zMl>Auca9XvN}@N^UyH@g1Ch^m`pO3ryMWcMvWp^R60UUO! z-hy<~2Q#I5HpF~<7tR~m3Np7?4>meiO*@5+FrA9&N>;6-z)bY-dU_V#!S+h3mw|ta$j<3o!@t-#hCAT+yF-_Q@0bo$}j=Aj6aWiqC z<7V>kj05j8_Z17yuxYkpvp#+&h3!$(dI1ksEPn?cJiS&86YZ|ZxWmUXS#Ybf=*U^T z_>U?9*if%y!#}+FPu`W=_*+><2#8Aj9~9*8_1Smu=|?B0a0sUnQ%*QyNT1s3`wr}Q#JvmU0wReYD*zq(GKM)Z3&qn>I!6x) zjx=VNv6ndVpuPM=Sn?O!{Opd5CQlz|xu5$nnc=j1QDaxD9PFeQv3w-@w)f~wUd5J& zoYL`*FQZd#cN05%5NsSwjOqQ%Z(z)W`Yq1flDoC>Y~H3HHH8y%>d2z)m6n~w`QHmu zNH9ehb5S{#-vx?kozKp-?e;q(6f66hjVW(dzJNL+_<|+9*STZKD~*XEA1K{Zn{}sh z5!KfDsPW^Vc*T#paieB*P21L}J}p(L2qf+EM^2^bzeI*bKjM$`s@tgzo|20D;G*`I zt=MrT*n`Yo(+m}P=UbK7v3?*Dy@Sisd~QfA-w1jKHf&+_mTTcGDUn1xpkc_@KG^TM zi^nWK6h>9<)j#aL=yM=eW!>a}6L`x-o!{Al@Ptmx4JJazlO1wha542j?%~wgsprCi zNq1DIBojzm}QUbDZe^W**l9PPNXak+?i!rOxPmaplkMRsO3i zavPImD*YSH*%9&5+BuC|6z5(~g8k9Gz5C+kDonJiNJ7J&(^mb0~o7YBS^-u~vz z>zJzc1vb7`#EY{BOjQ|R@n`A|Z*i*615VxW+IgV3UV6LE+ME*`L$&_Y!+X|NmJ7Lu z(!_}i%HqJboT+G$9kEd73gfvGrd_hk+HJnCI}#r=5c!y_EjYJACjhQCsiuYgOF1r|{^}7`6R!NdUNj9)-wy z-ts-gzg1jzY(cbcV1bb0jJlOnk6czy4z11v`@J2Se5Ys|+6(;CWZAZA#i6YZGhBDl z?cOi?>zuKjR#P^Iz9OpVfXNL4l{)u(Y^|vR7?x@^R z`fi+4)Yj=}E(piZqU)BQQ?RC% z^2y2QgnVj*R;qG?hhg~Kx%PM9o1%yhgk%ff2bMH{pxn)fZ_V^0sek`EK%B=wZ-n z(7!5obPaEn^^22DZbW|;e2`7K+mF79TZ$f*9oAiQrP8((Jj{#ygDld9d8U1DFiSn5 zR8-w7xpP!Dc!~EVw0Ff*N@;1imRppeY1pYe;IAtMY(8Dj&7avdZd~ZB<0|F;ArA?P zyj!k4$u1gg%dJN#sp2Wnm!Hapr9(2f^6OKUksL}g?XzA5QMSUmq5)-+@CGkBLLdN)lfkLo2CZ$ny13 z=oMwHppNkagRq-67aK5M7O?+>KD!OuFq)pZ1Q99!C#Kg1(6e;NH_yqA&R$w>d3IMphC zHyG~{i+CLKQ-1EX>?c}IxJ4_{Xtzz@*Ba5mb-qWq0t=}VnagM*f@-lvF4 z7xauF7;Qmi>0Rw;E6g$Fr^aO06lvHXcbH?v=uo~$Tiv&}=2B@escjUJ=2RYZ>IE6s zgxx;tzADbhVe#w?oXMLa8JtsU)*Snq?|woxbO#=QfCO5;qUp~N)+;qP?;_}@nWee> zM~?-TS6H?W91_;Xf-cbL^-C@X2KH$G&&-tZZHdUqKYc2Tn3eEiw&E)u%&I%uN`RiDd5=qEo}{Fg#Y=^X_Sj6vpRVRmu_F~dQv^jr1ZkMHE1acg#*fa zO$i)e2cy96q7)9WTd%Mjep~M&)G{eP)YdF&Wd&0b<4J0o0iEFm0RT#(j?MGEf|^$9 z?>Rb$CPQU+;koo#zZ5^q&0d!^{Jb=~$%=(u5jNS0Ow>NIcC(g`C}N2x+fM#R-!ZHw zugz2{a*E8ueELznDnqoN{OHpW`%J_d-MjiPzGu6l7S&YT61Mo_5whu>L7I2>Q`L}jMSc5#v&gE4rh0Q0EA9BlKU#X{s}M~df!*>5 zmfoytCeQJA=C3}qJ=%wUC|!(s!P19DOsfJ&VtRBdM8vs=U?UoOH>oooE0?n4s+#8N z`J%awbx^u?5etP&xBJqL7ZjatI{frq&44*8mHoHY<)5+dUwX{G8zEN5eJC#?E>%{6 z(KRi5vg`+3bIvO16P{Cq@<@463ef8vb(gF`6t`9)l)hPYXP+0HyDHaSc_Yt)3RWJ% zbE}J_OxWT9Cf7v#> zX*!^IU)A4nbm8FMx0gCl$bYmZ!*AZ#`+BI;l1EZ~VtrK#eP8;IJ$%zh^{55X9+*UO z(k3djp`llqcI>^dm!JJ3)hBAuGp%`c>51Y4(Y|Zwo$h|F`v!HY$0s{)C9K>7rgJCh zyJYD3n|2;-YmqIeBfZ3SqOC9)`u+RTZ`#fIo#*WLs1NJ;Zm>HOnhK_q8I^@?#P*GN zMoaJOp(CvLhH}e_`J`u^Bmc0eY1-SOU&e&Lc_b(!Jg;)J<{{&-wBYQ=MZcE2 zb4lphExZ=tal83GHA+$`u+vr3X?@2Nh3ig%MM07$?Im9@3Jp1wW3W|gDG)>igJy{| z{O4o#RoSNot%%UipOkJ8P73cXP6K7$rya`?scd$vNDYb-?{`o|v`l6#TgA*q4}SuQ zg;l?biHa7jfeI;1vYTP?jez`KxPXs#-GPlVFGPo0nuJ<=(aO?AE1l(*5X$@?|F!T^ z_x)wFm__Lhj0;8Wv4mdLfB|jS4NweU|B3YO6Cv}pVZKVMBp`)hQ6S5B6u z(fdVuYg)v06IBK2qH9GHD5-$9>*_Q&xg$E#u22IJ9P*-3dUK?{kPP`&a9;iC^Ekr- z9sT!|A>vuj>B(Dmkkv2b(d$YKVo+XR<#~&tJu?U&l&9%rf=W{9xUw)Vtz>w8Q<}&P z&Wh+<(w9fin!0doW&`Mb`YhR9{XTV7EqapkG4n2Bge%3n_m`{Z^VwV~++Mxoc4s8L zt#Kw!iii^K8n3eK#nnIC#I^Edv zp1l5cIYr}RaAd}NA&jaO;T1%MVq;Vea0WZB;TsUr_oFn!RaYy%TL7%-;v>T<@t$q; z0sObR1ob14`&PdvGei_bdB*c(mMsAFlYWsU)FxyFn?5?;RUE%44({o{SN>TUAb23( zK`K~KyLn-v7)c)dw+@w2XZk&7=u3=OItP^0Ho4p`MW6DfqUD)EEd=dczGoQgc4nEK z0<*u+?hOgEZ^Z_Uwq@Lygf$b7Spa)&L^+`9$%6()m34yeJi{aS`1Z^qzN`9*y zW5?OmA3x1p6UOZ%M@2U6SYAXDL} zAw3@rTi8emRctq-J1NGW;&PEY#G!6XD_`#%lINtrP~s!}0gtyIh^#(GCxK;t#`EDt zlguDMnlvwx9d_u(%_mz_0eAd|5Z0d*{q7N~ZYGYD>iK8%O5DqJo6t>j;f>g%(ZZI#Euy+Ts3Jg6vnV995;cFIPf*4`Hj=~VzyfjRQa9pk z{jjXBsZ8e4_lk#phi!BXiEM_6E;*GVVZOn)c@XKsb5b-L!kpBzx?Ar1ejNIp3ncf# zS_gFz!o17QCae!s%CPo?Tca0_8?018E^@z!HkwZ9c@N-SW_#E0twA%cTQTM3SbKk1 zxz4);*^$ZCW$&Lp6#A+&^_8~Ll}wekl98@i7^EY9;!*=6(4#H72BSX*9!o}tcHr|AAw*dFq*yRcB_J?0L% zS99@zPoKrc@5wW=OY?GQK_BVf`C=&OMz*&A#u7Isi7Dg> zvoi=rTT^xvGQ{9&?@i+FP){`#5mZC*5H?2MHCSI zE+Q4qwBNAmMEh%xzkk>E&g|C~9F?pB?&e%uuxH;90K6-0XW6|PRC;cf&y$e?b7+OP0q_Wh7>W-7#qHXpkP@W2L5nnd_WcJe407GC-ksD|ure$#4*34LTI-#%P^_+y2Y{ zV#-X!txQMkDF@2kTov@4&lSc5k5u7T!lA4MmclbjXxFR$n512x=r#@mml>5S(~9z^ z#$&(MchrEEn*1*LT(kA1K!K`wYx(2=hCQdzFe)-#>tUW;mzMJ%;j*2g{>SXO6w!CI zMAMaNkr=&cokv;O#=a|Bfxk*FartV5=+_c_bKKVDc;DaIdpfV=U2M~HP#D>g2aK7EZKS@Ww0oko8GMiL8mf|iz#1kn2xf!#L@6*YorT-ZsD)Y97R z|L1?dlUGioW~e52vk#lIyQC&MihS>rxR-WyIAV~dA;M02jAIcF$_~PiosUtm@U?hE zGo7hp@JHQqwcomJx{}he24?DywciU5%H`T2B*3HXq4X- zmQL=qrGfGM$i;_)64@P6Sa!{3UamDPasmy1l$2=WcPBO*q#~&jtHx_fuybbA+RbNi z>2Tl5zwB2^_H%NzUi|Se3xT#?;%`)unSb65bh=SLr)WNr zKCJ)(6II#SsQFtgh?mVpM}4lIZ$*FT`TY@-GN$%E_nxwXK+?{L?A&(gFACe-tS;ZV zTV9+)X0G44Yt&)Im7+U#7|M2qVOEbJWmOl>S9s{iFw0>6Lh2n&a?>ol=BF>JRuDxX zXL=j;{YSl^+YqgRSuPH<(cVopdVt6#>vT|6cVd%{U?s zRv7Z&ysIqZ%yPpRA=M7%d`=|ykE3$oS1UIsGD(E6v9rGK6PrtnD1 zw6b8J5mDtIqDr5mQ155#kB4FoA32E*Uul|0e(*jRw6?SS_CU%SZ$P#AVbO@sYa^%E zuYTab9`plmCD-zEnWQ|>S)t8^&Ul3%E)pYue$3OL)jv81*#FdV=v^xGebXTt%QNu8 z^PvRO5(^~to3kFJuYP7GsRicHQ;9uER%8Y(KF4}jvBJGc5xJv(qr1QXa%o4f`hyQ& zZ|MXeJvvaU4xQf8SSLsh8nRD&ee4n4NoH;N!!NDuuTRXF?+R{!)XE`HBc8_VYQG=rbk3q%xT53w<;*26wj3sx z!&GN6O9~W;L4PXpl}ow?bl00*g=Y}P6!Ua^M0P?7DR(N?G3~@=AFVpm{<)rcC^Uga zBL~YxZ?Z7Cf2lB12Il0eyST2?MJ2)JlYu5Q#gGQuGc&T$3n0QNZ}>{lc=`r8@3zkk3N8Jqs-~6c$LXEniph16m}fqE0$OOJJxB?MIJzAov0gczO%x*vBpu6|<0Xdsa2 zU)cW6%v8UBU72?OX6a?3T)S;k`C9YUz1OEx;gr#r zPrF^{@GXT~ePW=)-}+e}Bur(1-h=uWx3aSXp4Rvj-hf4Nwwo4;JB_f2OS;wL!(vdt zB^M<-AnxLy#IwA4XBOv6_0GD#m$f+|LC^5+r;)MbL|RJeYQ*e&J&S@Zd4gRwr2qBl z3Nb2}uK)R1AsT`5ht@4Ud)TgL499wVufFjG5ST0Xo?^{e3NvlbtFL=Bq~CdNSGmfT zvx-tv({fZM@@6TuOgHqxGdk7_{w?&!_D{yEHFD|5(W}(!ZIiK1;fv?HdzZe|t>rM? zJvh%rZ%RsTp&;(d1OwaU8D5=KTRBJ3?;OkL=)kL!)G~hZ+KoR+-}8t^4~Ob%Cx?9R z>ZZ2T6A*3JR2(vD^^;SwX09_J9si;APZgo$%(v4gy-o3Nzq_a=T8dIi`z7~NMch}H zrWF;Dhi?+w{Cm6d?wh@KdA!blt`6zt^9T6l4yrG#UL ze4P$@*9t4dGv|lPgrob{;hJNwvvj@Axh*NI^QY*tJoZlbzX>l`Ns;&qy(+-k&Np&J z7kiP5mC)UdV5V}ld0{r4mt7LQs8@EDXZ?4|^us!9CtgkKeUn_$T;u!4JUi2rV7S+vAL5<-6Gf zOZh58!vrIW^YlaK?03$bmHEB~m*UQjdviza%Bws#gxt|~Ts*63hHl!iChfgqU>Enl z3i$2br_vUEFHNt)kXRAzEk14e*c(qLp7%ZNwB{K)(_9f`FL?dgagoko5*H)`)dHpD zyEZ%(UW-H`o$KVT>Z*ZiC%10lI_%mjVC!_$l;}}AYi;{Y946teCAFuw+X-jJ zn)`z}2VN&LLZhoUEgkRxHOr5tbY>H)wLWC&nmP#&biY$3^$4erkh0Kul#fFxMv4%a5c-_WQ3C^ke6XLFJ8l z#y9`#zr6eDSHHLuFTd?ObU%T5iHkZZczX`U-77Tpida8XcJ{CEux56xzw&SC56_fG zDtO8kelA~wUL}}q^-8k)!wK7rZDe+2Ni46LT0N#E9J3~cOm(($R^4WBb%JmtB1_x= zc=VrIQ{kKTskIMQ9j@q6VXMYghr3Z$mn&5wm2!MGxngEZ@+HGl{KE3L`th_U;U;NDO<1Iy;x$?>U^iYw4`L=#K2}U7>|x?Q{46}3+u0Jy}Baz zdB2wa;#qzyVxdVV%qXAzWOF9f?s z-YK^JI@SiY?v!^eA`;#5ogO7s$b9OuW4mp&JaX6QYtbzq3*BP1`|vJncAY=QdE=bh zt=wHRE^;IKqu{W%2jAvH-B*8|Hl3Yyy{p8q?CP#F3{PJ|4bVl}EjYHEQ+@V&DyHJ& z$N|E>Z%6zS(F*#J0Zi-U0s8rpbIecnl_^y(`CB+PTRv-TB z$l1y1ZO+j43aFeRVr9|IQpBZM>q_Z#or-dJ$I`d5~Wl|?+h3Bo~HV2BKcpa>a z`q&s|?d+)EaX$K3ow~kfS7)=QGJ)hLm1pc=y4Hfo+L!t?%cvx8lmn|iU+Kq_C*$^~ z6~#~8`_PUPGcr47gSqP9DFs&!*XC1b>SDHWA6I*wv#HQOWk-96s_FWgy~F7r5yI*Z z#f{3SnAxbi7Dj5>%+o#6d}iLA{mr{YeA*~RH;UOY&q&kCz&5yLlQQKDnri~?-fKl^p@z!4 zX{XIHAP13}z+p>-Ni;qkW*PgLxu0E+Y}5TIXl+1ETSy*Jwd-<96lC z^1WZN$F?RD>`ltwKRlh3hoVv(2c7haI99`8AN(_O0eUv~v8mB^5WH`?q zWJdn1=n$f|_p+qPH(PWa_d2 z4M4ny+!G;r8>Hk7gI336*<$&0#AMJ?5mHZb;`WS6=`Nw}Q(zk3hN~Tc*}hPHc4^ZU z@WyU_S}Y{JSj}S{^f1*qY*sY1M_v(2jH;K(*r4VG}WnSW~1?7b*{^S0{riXn(RF9BWf?YY(y6&x{bsdJ=dQXPOSPc z1VdxYqPtO{g@O1eWi=Dzr1f)tclhN0^=iNDy>*_;t`q2ff9j)aM=wBL;8bFY;U zAFpf^%a-4{=f0jUQIJv*Hoo+uueQvG)dh&4m16I8W8@w8agS1HZZMW#M$vE}&@1>% z>EUa1O!AAD&%YNZXz8EczI>kfFba%ZL#4rxa~Q^S?e^0(hVRw=xN(-j(*_Xns=AVY z=6K~*kyEj7r0fAKkqE7NO>dtuv^qd=8vVJXy6w%exCm)Y@-GAx07EwYAhG-e^(n($1{J2wq$CbLn(+cEmTmIk(zAYt5?NdZ&aVUZb0oXLOvfE}?R++xi(b zaCYOIDPf<`IfvdekP=?EuZ~LicTb>Q6V~3Ha%XB@9k{F@8|+<<=OE&qR!SaoJ( z!>;x|vl7qPyrFO6`E56&&TAjEb5HJIL?_cm>856T0%6#vsiw}B^jdLmkvnjEriLP4 z=)_m1v|}LkToZ(%f&u|4!x1|6fa`7|RW10Fzk5}C2OarZn~H_^>GC?adCl}7U@;bz z{e9QUqW_QYq`SBX)m|g&UGLu7{nama>7Lekx{n&d~u;?pl#>rIp~h0g@t`^MINIO?r_b;03^wL_Nt|Y$pb#0 z**g09cQ-bzF5zC$Vnyq3HtaZvX9Tx6K&kHVmv$=_vdeFUmb+%B9|2J~&azrk9;~+6RwWUH_5`!(*G#_)l`=DO+YW|0Uqw z`^P!&+ur}>&ObzTV1UCn2tT|hP{83CcQ_z@wE9-0RN7TdFC6fY1<)^v$THa@j|A#O z;P%g-U+s(Z64&7NXH}DjwH=5%SeW*XD73^47|P@qyznJ%ZZ5sw;RW5mb(0-1tw=@pp{jdkht#`V z9O?B+FC6)y{SW*wGK6>hU&#>B%xT@dR$^PS- zS46Fw7A`?{a`)Kc>zn`hMt9A5ZTsB|w!=;Tw)V!Rflt9`Pv(+D-HSj&ZAOlS$j?6@&jG8|4lZZ%Q%J)Deohc-u zGBh+Do|d?ph#52Bph5i>m)vQ8$0xTMZ^DAG9*ms+8ZIxz5z61B~U_XOKoW8qu#I%|_#uxRy`Rw=EhRe%9tZax>sW3l3m+Q@vM(=4bQxCGeT=H<_c2K zt~tgF>K*eCl&2>FaYl{gj5zy*)!hk|us+Wb%zo9u9ZozoW_`&c06WA&xj@&1IJGgm zyQC0^2kT5a=!X|b44Rv_ZPZSZ<6Lm>Yi;%Sb|xYEE>G*ZDUhzjAh`8%ddm>rmFvK# zB<72qCtOQzrClHYpR-5j4kPQCD)qth&Z`|G5&{dE_|&zO8}o~pG0*@FN|RRfS#kTS zywm+ff0^%L{tvp_!`1m4_z15! zec_6cOnp;|8S;mPlH@bP6^F0?FuIdE`P7n=pS)8LR)}N&vHWg%^x@6gi@66a_NO^r zv&9tz)a4#>R&0Ts$PObTEsqDv%mCZ^F7Q)krQB5*F%~o*l)1A(&L32bsqTD=O1X%elN~)g5nrJp7;X7%riJVm@>639>5J4(sm{bn$1yCfz&6 zoaVRjK4@i+N8EMiA?M5{n7eq1m~nCNuZ_O+CzGqz3;k^4qI^%ydw-~18ZcNi*hfuQ z@`>YDm*ms*sDHV`F?aQ_del1K=eA`#a!|~8ygx($%&;t7tB-btQ;Mn*H_k+LJp6m@ ziT(b~%eOGuV^logvM|LS8pVlSh!1zM@r2FNPhP`j+DTq|>yGPbCRBm6DQ~gnFEH(C zyw`Br|Es%-{_w`Ls&C@72VS4CT3LJVxOayA-JMpiXA5(O=bRd4a+V@r$8AvB0*#ti zHE;%e`+7Vl?wf4~dLyoLUr9uuK%P*6Qj&^l|Q`uoN_&rd^AW%F>`Vd$I4v zd_QLqgqhah4d$~)oEoL(i-R&;X`!lN`^iw7<-IeZT2m0$N zAuFJ3WxY86)`FGy;8Ze55!rP6;XrnaQp8cvdnJ}`CuCM1$~`H!|K4GUMZ2)wloRg5 zsS4U1{uCG@N!$Ng;Lh>igX`}6NYn?evvW@$qFKk!7OvYp=x%0~(N!4Yis@d-Bo|C~ z=VB+QD|cwMj9AY})&_WNGZaQH50ecuV-@as-9oOB=(Qx~D?C!?* zA-rH+@3_w1@^8a*ciwTubhjQNPIgSUd&$0UzhxTF)V`5v0@K}jg4E(PxF?%!kLL-~ z8PHke|1i-B*{w0%s;@I7s-k2Qyu9vy#`ax!?lB^s@Z7yJC`EbJ4+Gr9#s2}G`}$y| z+j*O}CgdtdWe&IKj~BcB|AgnBczq4e-Kw-%U0+?a+IuK5e|rVX-T2$x4DKxBRKZL`_@7`;>U<1G4m#Pa23lS9U|b+#)~8 zyK6<-k4ax1w)IraHBl|WIB&yLm7FO(3~St?zjF!`dLSKTO2R7A%g)GhjCwm8a|XYg zhfJOd3u^E88)%Sy8|h?X2y=BsgpfPkhM(oDK_Ld3t~+#9-P#v1tFs8?xQ`DzH*hh~ zp{ZQLlfd^7@XjR$-P()$`aP3CC|8W$OaqrW6sMlZ9n#L8xo3iU;(T~V#%kckuXp;d z3H;M!aB{IABuW}V(K(~%gL+zfpch%cP~^RDTI~fT@BFgxWDW{<2DUh<+9ORQ2bvXD zTs9xGvf2}kDdD5o*!qf05%Pmbp5{YtG1M?}SI&8 ztBZ@C`0^ovb^pWpgnTEC-BQw(vkJW4`iwNiOYMPGb(iJKT#nJqI#X4n&h#8n@60xQ zmrhXo_~HLh=hr9x)cZ!1-Ts!TqB*;wP%DkpTYFvU zRML+TkVT0jxR>14G1l|N%x*@b-;v!Or;K95rH^gty9C#?8<(mlpz2{FKP@sM?CbbB zn%L24O+2=}YjY4)R!YELsA-hlH;n;1wrcM9&&kVcPns?MCT_N!p3o}Rx;AQqEB}E9 zkT*)x&8B&`QsAq4A~a@@`FaKr0s_e{h*@<08bO(fy_ zH5B_@%=?cXvRXdV=I0A0o>dikoK9{#DE89}s)gjW6)9kQy6DJhJ*QN+_P0(dtu5nR zk*D-WUO1+egp6z%fCRIS*NB{s-Nw7g(=FnCC655SCh9f8OC8crBPILSPbuZTXBrro zeo?&K<^00IA@J2cnLj*W(BBMYY<lX`c(XULQfGJ zNam6+55#OM+<8HmM{V;%RhiF<)N_2&0d{Yinsxq0vh3^Qg*=)MZc3ayaQJ!#&A0G< zc&8phYrf2C@GR#jLXt`?VGrO2p0I|k!EzC7Ebr_dG>etSbBZsha9RwjtM1VQSF zUe6~&FWn(!HzExsMR_e7WviE*_zDkMh}I3p?lJBSoey&e+vCuzY zA)XWM4#0NuqkX%m;(|*`HQMtViH@zCG4IH;ebOnyI1;`+)zrp~rwKS(<>Jv?@jLCI zq#GJGj(xzEjh)Y$d8|l)3r7TEDhpkG=sL^1Sh*rVpG`hOwq2`vSWoOMyC!PA(Qq79 zJ(TPoJa>$yibq`hSZ9*^&W@+pFdDsxV}B9%mjLO!^4?D#<@xW5k3gR#*^I++YbB4K zJ;w?7_e!_*SGhdmLlz4!3bf^WJyxe`e=O+22@qVT8gfL0jXaOKB0+7$>gVFwDxXV9 z-1G_WfL6)Kje!$iilzieTuElWqbeuXF;q+W=U|HeO>sNUx?{t-&(c0y=%i_XBO@41 zqG(=ENnt7bCMhT(PQB;cAT&W0A#SHGHhYr`TK6z;)jo_Z238twnuYI$70b?0{Y=Cv zC*M8g=S=ZDn{=KaU5Fnx*Jl8A-45O7#Gv#pRG7Kpom_6e8)U|=JxmLuc+Bq(;VOL# zUT1Gf9pwk@gRwV?Cf*c%uCXx^yyoP%A^^)zZO87ca|Y@zBAb0dExyGqsklu-(_p?S zUuAzSN^^8iD|S+&YbkO)fBa$ic246iRMdg2(q*nzAjm#*-dNB5 z*KIZ9Iltmbn+H=UV8Ckln*oA}grZ z%XxdWjUB58{ae(PIb`Na(bt-!OAK;T8}-vP6--ESoMyR6=gU?13tjpBTk1j730x*t5la+9_=+{i0zdq>V!42p;+Kt!!KBkJUqv7D6;yk1=1f?<8t+ zwW%Hk#8mf>5^c60+1xI?Re3AUZ+VN#^soH2Jg4P`Ydp)PjQr@Jh1a7QmJd$r{{&91w{u21sOvhzaDffh3Ifj z6`Bv!Zb*)O_KA362%2kIhz)Kwywj#b6PXbmoL)+GZu7fA(PpbIRKus~An#4NxQf}sNrE_V0W;jJ6 z{b@c2XfHzU$R6?0@j(hHk4lT{ZML2e)RZ^6z;8VHR~FIkW+43HMD3{5D>F#foIc0< z^l=!0pX6&IDTB&q8=T$C3wIlloIai$5K(z4|7nPctoqJ2Clzeo`C?&^8DEq#-wAUY zV=?u+@qEwwwm|DV*t5QyI174@u{NfBH&p+O(yye4j9`!X^xyC}0gPoh@u$kt*)Va?#5c%G%wIr`IB1yKwIfgzTtEsF2^=!x-wPjsa8T7FMGgS`rEiu zwR_WvyDle1i;wTfG!oX>>(ylAXo$*`>hq9cPd4p$HOEWryRyK*Vi$i%yC~ptg133Y zvJB+K>gI@>&(n3*6M(}P9`IPjduE;i$l5$3@9?Fo+pNzW2l0NNJ`Zt0V_B`qhuX!V zR{PemE%TCKD4fnUPCjSWaq2H?q$$MICF``mR*yR|le13F==QufvJNWN7V=1Wstou5 z<#FA>K8j82Atp~Ci64YE;bL|@YCPe#+%bGRL^ z<%!Ym>Z7B$M{KwGmlA}*PtbO+lmoO~s_~q^ofyeJGtt{yxyW|=V)hDWr7CxcuG0HP zBurdLbNcQX^n+Uvhc5NsFr)f}o)eyYf-=|BfTh`$Wx}s7Xzt|MwnMQlS&nBK8b+)- zX@v3b`0hT3|B=^4!?X6Sx)5CQR0{QgSpulzh?poHWwI zQoBC%1Dg*k*we@hXAm^^G1EVGttBp zREXcv_V1T}6&MYVd&Bp8Hwn`O}`=-zOT({$5h*{9`0|-vugEjkE4ZGn|Op z?&AU!k*#j8=hb3H_FL*CRZ>1O?`n)W+1>KWVX=uU+tKAo%o&%=$<`BrpT)6qfj%}y z+3EBgK&w8HQ=+<|IcH_zB~(K1&qY_TQ(b#unc?T&q2y3lnLhCli5=&(?J%Vqf@XpQ z8n4y5j$Zli1_E5#r8HmWW=MQDIioibDsew5Us`(fLK`6f?D3=LT}w5@iPo)j5cn z+Pd$hVkvRnkaEUt#}g8yPoEiraKg#2v|FF6t~-_##kQ-c1_E1nPpOe!le|X&tyveT zeh(iMs@H+|X6``Rhr3>8{&*+kIYXAW#@;#R78}^wJkp6dCi(}y7GO)55gWbdAxVNut+mel&7yR zi`2|5V@sJvrk7VJ%iP?qnOSB4y~7_Y>wYwI1Y7r4VUNo_FVhy^Ie$Y3&Noq#w@qlL z_f~{lSAPnN!$&$Uqg!7{Z)TgDIUIEReQc=q9T#Za84ZUaBen@fZlk&_l$X?Ao5ux3 zI(<4XmcFB@;DCBGdRfSO-{bE_91Mh4vKF4cM|rd2%q~TmxPZJn)=0m>5$f@4g~c|T ztFx78XWa2JYryx;=h{7jqYT=~o)}5sK!Hfc;?uC(oYC$4T~J+VbM+>l{F4i^`+0SJ znr?70k9{-q3QBEQw{eT}##^OhR@X?>6OgINZ_Mk=lnjU0p(wuGxUsvTIQ?r8 zT4^0yeO9q>-38D6Jo50YeOh#z+riLY`p`#IA?v_e#K7tOvlbnE+@ZRun}ZKg$=X|= zFN~xKVI+8(jCAf_y~aMnE6>^J=KBnUaxVl4bOIjrm&Dyq<~;{PCK@NQylVfXlJT6F z4u!K`)!Ib?vA{xh&e79=4zi~?XL%*l<2)}68UhqS=V@h5cGT=!+C=K4-FmEZkJL~h zfGe6S>Qh!r&}fd%8F{9_kj>ZCj3b8=S3b3omCI;uM~^w*vp{dQ9e6x!gOWg_nCg+LJJTJKZ!^Ef zd0R)oQ;^-8t$i}t`L(%UmiTPWRGEe<$fyhE>gV}7x57Gaf%&d6#160;=KEbw5FXob zld^rNk>5G}>v&E1PaDYIirI%-Vbr{P^0;>4GY3UNm^<+nmjwQZ0%xuS2mVvs0|!49 zUHHX465Rb>6Uh?|hPs_qmQl(E`h226IE{8jc4Ia-?Q+*Wy*>|=V?@Jt8mH2y=&6jn zIul&@>5NDE=I6N}IL1`(;_^D6YdN_;=9tLraT#>az0eVxPZPrQ1&5~8E1%f|v~%q3 zJgT@jaO3jDW!9%jVbZ_M3S0I&+(_7==aCoAX(7ca@M^??Qs8p7NcxJ-c-l`qC`k0% z(V=&*JTYU&L8HdW!FOaPTr1f@@TcT7u*zd{+V=g{{Vsv$BU`3zCZ0TVw_P4iRQjGK zhWr}+=ymaqi6z(m+9t}_gJ4>s<3@hNKOo~;f<>A$sh{&Xg*#=6yepIGnpIilz{ygVj} zGhw|xON`2T^!$pUZ_N|Iwl3*+6U8LoNb}g{A6Rb3oBvUFit5?E(T&D^7&6B_;(VyE zc%@wD0y?*nJCvj^BjUndXSvtjcF*iiY-gXU*74)rMdmSd1K@TGL)bJ(YsOyHGsZU99!|~ES`G_?ykwcOW1{XkWjv=zLTzJbYA-T zS!+e1%B{2mlz<<(=;DSSBtDIF%Aa6weFvxd-{!Obfl&uXcPRDa;xOKSt#)pF;_otl zGy_9FqHaFTM>1z-b~SYmu=<`kgN$fUcKya25<5+0n5uuIx;vF{LvQ*-BiGw`q=5)$ zQO}8FWdd}ruQ!sTrv%4kuO&aAW^H~z2mb0@5?>=e4%?@qrCxjEA@ZOPmhDN`>bL24 zn7g+ot`--~b3S=v^02mlp)YUj{VSSmKXXe~dGmYi0_PT$M=miDh!nv13Qe<0Y;XQK ze!&u2C!dvmFZAR)^uK7IU2?eYsQxIbm_=#@J@e;6qxFac;)h_-Pyaa1BQt;eM{X0) zyu|BV*VByTPw{qp@OG?vt~}%I2V>vZYovRSov*9EJ0=67C1dY&P-nNuT3Q}73R!RwcsaFY>wDtX8jQ6Ilbbk6q zR}j^dYFN7<9&6UR205GVf7CRnP9DhKZx30-h{_x9-8fd(549sj0@2c#bol3w+6U5m zL#t0v&cK7{$FE+b|JS=`cPqzs%~*Y&$H)8U`qKQ#von9Jua15&9zhk^X|gX7HXqt0 zQ2wDUJE>R#>0u{<;c$2&Vo1{D%Sb3XWe<85d%D5X&5IC>rpQLANENqN>e>NB_RS+SQ=y=t z`*|$M>!RS9$2_IcbBQn9f}up?9d-5>wDq7n-Ssr5QnSv7;x2#T)CsDEan6_MyLhAN z&`<08?^V_6J)*c@!!>`WK{jJio%>1(G#79l{!v^@C(SRb%j<3TD_H-PT7W%~zDQJzlI$rrs(IlMA$t`o3!82jYGL72Q)K%tWdH~=6t z57bJeQ3;_lZ&8 zCMgr6*Q)qwpPpDiK7HmpZ)ee-UeG{Qw8g;%4@ifT3FJks`KppOV){l(j?#BvDMkNq8odHfy;> zEUFy?fhUBkK@{3&SHz`Vq=~aGugnwOE>d>CrSJFw|M{gaV1UqAw&{BOF8YzAst$LT zbLV4eUkj-bEomiJ|pdI*~A~U+aiM}xl!KRnC(>K_%zk{@*bE~)P&F8)I zS6>$;>JI4RC3fmtCeupaUnYw{l*!b1w!LECUJ)&HZvVPPFoV{3(gEZyUC9SSI#Y~@ zyQTVsYgA`@SO3sw1pC?(5*}Pqi|PZmDa$><8|KT7`LhSNzR#Kz7zZR;mR)i$oFk2& z;qey^kzsDoj-CeV7zFF6_OU-Qve~Da1{@lg5ui23E#&h*uq##Dy7;-D?I z4lFcOy~ClY#A_y(SM(9F|4n^B<53|S2U8#Ie}SVWdVF~eM;)GUgQXBS zUy)`{EzF>6`I(LA?ANnB9`ICV8!NiYw$&cZRWWneW3foVbFyij1g?6>HpW#W=e84U zr@dJJlJQlCS161;3%*i?J?qMbua@uqq^2?4ZelDNyn~|RA+}qkhY)hs*NL+f2Pf@k zoOPFJud|ml{iP#}pNrEO1vAfsxgstv80Q{yO^=kMsT+EBYeZJaEkJ$M@mRmK(u_dd z`25}4Te+Ll{HOm->@~c_e914|my5X5f|$|g!e41h{c`Xdf0z=*r>Vg{M_Cw5x%FEZ zY+4dE;hL#FI1&zPEp4vsR5rXIa_)S%`h@C;9x>aHEA9Djzbn!s5TSlL_nFX{0-EfDuj z+Cq~~j+;(@Hw63Dzs}qN_VW3td+c>ci6@+xYYJF7LIPee4hfd|OYc*xJI_UB^Emmr zy*>Am6A3DNa+848nW7>iY0LAbs(tD2);AwuhP(v_dp`NcTb&lh6210$c~QZuQ?UW9 zPMbyVz2T}|PWyl2sYxl+xHr@!e-r2!2rQ+H*j=RjQ<>pBSrByOkNP(!#Vd|c58!y8 z?IyLR6*+OzGIrYK;ns1iUt)DPBGt=V_abGGPjf1xp+HE`|ZRu z^4qgE_++jF=kr~4nz3>RXs#TDaivh&v%{Y6mOX`IcHg0U;vemj@ei3@)(m^P0Uce1 zazh#{Qu&P~{rmLh*YQi>>kB_Cii3~q>?r+wWPWHmpq)xo|kN|3{9hxfsX&$ zDr3!W;)qGfPbFQR>e!WN$)LGSZuC=JseO3E5R(QieAOBwXCvB=Aszi%sSt>UZzY6S zbR((dx8{Std%zEqvg)q!!$p&I)7wRv5>q}-h^+m%TkJ5YphGdIq)11~_kGv+sl!NzEPF<<#I z`bou1;e|;pw1#p5FDz22HwDTL7eaR(yRTw}N$D7Q(} zjUM7y-I&1HaT$sXEJ<@Ig^{Rz(Lee~Jzh_v404=` zxA85kKMac2FW)0?(;j=IlV&`XazvFnewl7MH717Sx#sHk=bEnZN-o7#yj&|P} z?xr@Lz5b-a>Y<@}T4ktcIoU%p?H+0C^XK~2BdtDP^rFu%mlN;DHPRw`Z;7@;zLzR{ z<)4Lzd=Iw{3^GITgn$RJi6ZW96R<^LiZ&D^6O7)Dcl`8w1?hj3?`kdIV+ zT;L^E3w_9Ke7C~vci-#Tlz%kRiM`QWOP=|%c;iVFm=hO-cyb6wc0+xV|3hr#x%u8d zfu!u&5otnA;pTl-D~Bo~5plLI!gKg8F`|jLGSbG{a}Q^qI<|JS=ObxE%WHdzE$y_H zbrqjg&Ht~2>c*Xch`hZ0gM0AUJwh*^TvH=DrEv;UYbh0Eu7u1aNGXaX>qX`?RGT)4 zdw={)3D(TYEzZ^c>ARpr<_$^YE$s8X)1!wlp1rxek`rbm;Q4}}Ua6&)i#ogHvUIwO zsVr_;K5$f&Q)#Chq8`?sdgA?*YB%4=n0)%vr_#Dv2(M&3HrdqH;BP|fGhh7}&$z7a znEhsK;5~}gx+LR$1}y|Cm~}9uY@Wu}${D zy6vozopaF;ng4@V>3!PKaW(qjCBF*Tl3o8RErJywqCA7Wh=qQ={xz=R9)50wQ5;3D zS#p}|y}|FqSX&OG9*Sj{G4C@SripB{!5*}p1J=zJ@-nJ|o_f>T%HsOI^c?%pUO(0G-!ghx&~71)bM?;I zu@^0mqas9Ic&0I*L%5^l?0pjJJorxc+s2J2suAyB;)Qhi}G{`IL~>`%^|A+NK z0%4@s?vymVB$^E@?Qp{#t+L-i4N(#e&AvSD_uFWZIk~+iEcaCmR0L=Z)TKo^sO(IC z2*vO8*0_8`f#i?Qd9El^s-VSJk)+7U^zlkp-m4DqYH!u0^d)DpHo) zzeOji8Cxg9XYSG-@go`9`wmukP7nh$0apCEhdt_ z|1Lve)CYG(6>VsCX<$if)8bkoa>=>EIVqKZor|}=0GVdi*m^GSn%pjLw)LUoxNXO- zt8d5%#IQKG{@!KHd3)6xgjUonotcO}$c1b$Lh70alcF=MJhCdb_ZY)Rbr*YEirVe+ z;;hQ?7I{vSl#N!#hkiw9%NTpW|F}9=_pCe@`Xfsxu6J4Y{9+q!ZkjO zFlIRP#qO@U`@r|eMe@U!_v#~yN@hE4aM8P&Qddl}o;=MBoQ4S;h)-whyvrR3lr#goM`CT|%w%_?GYo!oHObI-ri z;j5rH=X2yycVz4)L}w{&cWxOdXw$n=Z#ZJetc)7BJ>h2fSKM99FC8fHS0tfGIYLit z9ngw)E^wA(|4Z~8nXWCix8hcxL*-cEXTF37%`swag4H}oW_?a$vsV*%!hhu~m}$2A ziQNB;45tjlKcjcy-el_^dZBfreF_N+rmPYsMGZIOT+9-3!|U1G9~o(BUv+g*gzumf zau&J#PM@HPxPx5#6n%I0Fxlw^WB zS7eiJnAbN!Txh$7IIbk?!ZOnEq^z$2Ghxp~SJc9)JD!>L9CspB#<#nCf?`&(7r!&x zM$sNr{xj(P>R-8g)Kt4hH@2ZqyLLy|Q~%kUKYUD0*STMx(JUV(gB)UuiBsR`qL^?i zx2t@_(RXN^2rr+$kRHLy@8};ojBapFc7<0PhX%^Z&|GMz^)5*>g!#&$3sqkJd6U*p zve7Wv#Wz&Bz}AIpbOThw4iyRgo++fkcvq88sIprdww4k1=~@tQ`Ik!$)MN-$SqpbZ|O^`C=VeRPPSkFL}^KR?{W{6a*n9j2VY;8DF*v(@;S zkqQ7zvl=t~X46n`MBB7lhta$I;Jr&nzQm=1saLYsi@5w^X=ibPR-}KB5KMrO(2cD0 z%TNp1U%#+k_%j(u^)#$C`-pl!h&*XuneVoz@Vh}&Okk9*Z*I9oq+&u8D>=X(9Pk=$ zI&=^`c*Zob5}98)fap{Yk(QBGh)nSpv(5AoIPq&RLRtteo>-AuqL=9!lzm)9C^l%F zTsn$CPIv8u+%Tz5nVZg@2`t~My-T8~J5rK6Tw&L5=bfl=frHVg{v+S)Hf9PlbKYrR z2}Im=e;E31>uQ@|wM{K&ya%zK6bP!rrm~`Y!|?D%RIc@!8O3nbW_5Fj1a= zw@f*5{12LGlIQ*8tt58;Uwd}!Yy=_qI4r zzmXXGQt*v`=lW?{I0VMJ^Lx99-sT2JCv&PW7;57JkNWS=Yp!;6ew@~;Ra=W}H( zd0|Bszpp>UOJYZ)?YCkqaFFY{D2XDGhKQp5Ykfx^Z%Ms=Lm>6$sw|<^lQK-k17VfL zr%!V3SUU+JyO9u7H;;Gu$*57Vo^(XdRYmw8(nGK5nT31go75>~WbjVOBJLi&UcZu{ zw|-ym#koxuJdnxzZt1w22D2Hw&-p=Twc`tn0}YaeLRTfRgizeJjaJV$J6_Y0M}TFf zZE&}u1(=aePI_z=3qTEWjfuTKcBP~IC!K}QQ^$*jSwF;~?;1my#w{JiM&1`HpT1`2 zau>@@GaRg9`4ld6%Eu#^TSo6KU8p;{sMl91P4R#J_ft+0P#Q0QvSZ+F79(3JiioY) z*>_GqVk*LvFp}144<*ZDJ_M_7+qbNFabFuGGN#ELb6x%1J8I~r}RF7-qUt?$xF zO`eppe#IXh$#Kp>=6NQawx!F&mi8Z+aZX~k9N=jTI-HXjnXiK--KfSeN32X9YNvr` zQ~K!wc#vnUN+oZ)IXSlFKwAWXdEw}-pDxJ37r)~bLC#k@gPj{=QuJkexib9 zC4sC;pxsY4kfFMqKqTD5Uv02s@M#o?}%4@ zvqJT_+<&9bnxQ89iOh_&S86~0MD2fnL@_R*jr?P2aePMcZOuHZKU4}c6#t~V>U{Z% z>b%-hEK@J3b76({!I)LbCkicuWk4$Q9O|);Tu=2Bje!w1%M>+#-ptZDej)_foPTP1 z1wvq|qW_)k4MHstf=q#V`OiQ_fATs$P`!9z2W?eE>4uf*SY~NpUEHZgMI&A~&*h#X zG!Y-)I%cA$U0jcMhC8^&hcau5NY$ME99Q6juje@~v`@vWtX=01LMIF`idF!(E_Z`s zsIq29(*`~rUscF-+%o3|8P6mvE68(f3Y=E%_ViqWcT}ny##b}Ci46DR$~gL2X$=aM zwUo{xdzRJf7x+aEqEmiW>&NHI{>N>vPknkTeJ%eL>t%6Srj|xOyu!!IiJRw-F^$ZA$}w%f zl0|eIyuR=CiLSCb-Zc-8n}*1u!OIzgc>c0a-6xgk@AWj-=)H>upJT1zwIUKeN0{H7 z^GZGKvZ!`{_^!LYvst33}y`VM2DIiHNSSQEz&Gx#J>&H!>_U9F;bRW(S zdrlzOC0ZW!4jPpbphrykQxT7x(Dm%-;bX=?4?j;laj&!BQkb+VR5=yC!rz zw@cak~h}HAPn}$B^+vgS7}gDtCdv)OGty z(|R|1?x&{^++(HpV6HPu?lh0cE2^z)?)LxkhG!{cSt2g_hO*^f<|7fsE^li7lTwfL{^jKzQx$#Zk7<$6zB3NB z73~wKL7+ZLYbY*%Yz(3gKmF<#X^w2?XJ$N~*W%GXCnT-Cb#?3#<)63v>fh`6fe+)J zPd&vR>h}w(@Gqq2o>8cr5OA+G}G(+sF{PF29JoVeZ2Aw$t%$KZ@=4A05?}Z zpvS)WBkC0y+zDA7l?`1`APPa-2wp)F|T33GjR-VAntdLf&8wdTQ&GIa0Yt zvR0eC?{OG~W3GlyE>T$54vanFcb@&N9R}jsxk3(keUGxzx~kvJ`xRg4g)UG>5pI7C zeMB}7Wau7KfxF!!Q+bR2gT_)}MGR=g6>GL|?DZ}>f4Aad(y86vc&5YjR%F=PuRk-3 zVF_p(nZTwPi|}ZP%G>;>>%(GeoUf=_rfCAIRw7jgpgNRb9FP8Zbs;`pT0QzyNvt09~OCehZa+pWKq|EogL3p)QR`;=EI zAIF`I1cZcLK4}>v{fpz^vU@=98LmmcETdc_`|BThVXgf)KNs7)3)I>WiH zm6nIl&(&pn=YT<>XF3&EW8b>F#5z58H{X)CDiWX--ldOAQG6Mt*T2;VXnXJx4PWbv zp3(XulZNL_3y|dH5o={!!%2QWRNm{Y%uEb>7gM#${^E9=pU(9a5*|J|GYKYY=DBDU z?+PGSD{pS}P`-P!+zYCXvUdEl9%k?QR(opY1@0=PI;2sKCMyObTR;STh;PH7mNoE7 z-tnRg=|TEQSHmDyYJ0q zj`+3WIL?5VhLrL+sKxTpzqMwvua%iLwTzf4)YCht>WDtOU#uJ2H#&Z9RI_ep*g>d! z(w)+rEzOE7Powwh?sV4}#f}?bPMt}Tka5>r$7t9iJbRq4CQiw)uSMz7qn#;Q)6K!p zo^=~BjsE^d&WJB_Fnrq-5%pG3%<2*?S&gY?u8Tf)JRyrVXD3^?un+64ZZ^Ydn9m|Z z53zS=pT535p-?(KV)*4UJI?bF6~UHk(uQun=(orDnvRF+wMGQjt?MP>ieQ$|H%HHS zq=sRyGdH;7o&M;R#TiTn<0CW7@o)R#?0whnsyV&yeur1c=Y13+nh{%M)QhGp-;CGp zhm(g{v9v2kzh)n-PFUZwqcQVsRw`0$lEysCT=tPZ{V;6xf3G@Rwu-&4cp7!PQD#M< zavAEV^B7rK6@M~VeABbf){HXW?2_kg>g8DxhU&*e zHZE0MRBfcl6+5YsW9#|gw7~V9c=tM+oge0YZ*cz}1=)S0f81@E03F;W%I9&IB6ja>RwzY_&;l{pA&U~7Cc`Bz`)Q0 zg&Q)R-#UibvyHuPb*^7Nyn41-l*RUTvRUbsLjcq%#7^NK-fO@wzzlXn7=Y%^&o{O{-cU#V-TkMkE7`lYtL!PS97iM*fF}WE+ zszm5F(ksu`Dzvy!=GshC{)90m`A>%&Y3uNkUp4+EJ_f5zYTe%Lv=_2T+Pl%1ZC;0< zdA0nu2=gp0;2>9WibY3uoruI~di1c@_fXVn8xRcd^JZ|Dd4!?+!iePvLc2|5+_ZiS z^SINpsy*mMj9)$t`P+@@*94&bE?VuDbwBP_XJ&XoiTUBnCn)ow^#Z&|X}HCa6h%*F+Dw?S zjzMC*4jcYYi>JLF*OPX*^MWUDTkVaX?RbEiP%T75k~Ey`p0gJx_Jx$`30R0zxlNk{;;DNA~klU&-T-S4R?hA8bBy$a&%mH80|_IM+lfc2_i59Opo zfD;zk{_37l{m!aYR8OQ!v;ezM?D3l8$oE1E3Uzd9$giyxKa#H--80pfT)*&Cs*{#Jj62zR6Q@Tl!n?9d*PD{Jp<-#uHf2a6M6wff)xA8|px|IhtAqMq_9`+oU?ca%Q` z708g)u1t&4DRc>}w`<@)8twIq%SfVqoDp$@6n-#(EEm{g%ok5E%((=OhgU03Rs@%4(7%q%f?RJ1K{8fOAmaad-@7nr_rTzYDGda<9@2 z!auUs9H>{nXRLJkhKZ5~(q7nTr%z2mrxhaQx*5bMVhCTFZ+gvsqG2Si9XkM=I$dj_ zve!Es0|x~$b^D^rGm{%&nyl;HSbr|NkBXiWU|`KVJ0C=%2}RYQzr(0G7^N*TKBywz zwBwb|rG2=5*q8}yHRy*wf`*!Y(l!|bNgH>X7TaWAfL$IK>#z{1euG-cgY1LE=@rnP zr}OlY+?!%p>pNwLAMVlC^PR;I!qXO1{IL|@qLS-|MF-hpF=$*i`K0|C{wk44)0H%b3J75MC=f=5vo{m7-jYV9i?CvELSzKoG)USyC~e>x`ce z7D!+2uOIi|h&rkIKX(olZbl?{rzvp5-QpgRCha667onlxgjKf$HjLWEG2$)@ZP<}C zU=^)6lL!`A%$S^cY0)B9EGmE!8v5}nl{J|Oo-qj0uk@@D&y^Z@OnRyJQl~g}Ttu0V z7KYr{82aW;MZ9larI$(6HU3JlH7WNR>2Fk_S(Sp&YV|O4FTQ%c^F?@EL6`KyOaGfA zf5m}3-Ky?2aVGykt+wu86DIMWuMNayy+6Y=3$?aC+rg$<4RWTexjV;us$K!3CL=wb zySS==PQ ztc$+b7s^U4cF(0`E-E!UvSHMk)i60}qtR$8sV~k%d>UH)msLB^B}$lM6rG8 z%aaHtPe;ytNG!V|r6Y#o$4395FUOD%E>sn;xLBz6WToV0+v{~=C-6fl5Z7Kw!VNN@ zEsBBSIP_e>0zhBlhm(nv2l4Hy4=(ZTon5jb5PoBgAd5J8fg@=w=-~tZL-*tCw`Kjl zeC8VGz9Gu(Sl2jgChL&uErBlWw^&g@z0{m4JnHY#iXbt(0`?v@6w2e!VYKF&mn_?Q zeOK%mTy*^V@xrH~ySAo{yDc%|^MYf@$3Zal-1WEP;9q0vL!@v!brcT1v#b*fQ*OI; zfidMU>Ceo5jCpDE#5FDI`HsUkMLptT11}(3oKDD?{r55OwVIrHe08)MK3*L7y>?sH zRv#DkVi;MyLwZ)@f=P?G!CcLzD8{QNQ>Yr@%4q~R&KHp-)MQ6n@Vj}P&TCnUas zLr1P48r+kVs2eney1PnLkefbKT{Ht}G1c~fc%QzYZ!r+) zn|I$#JS^K#`F_|%7^o%ViIJ3juclV5&w4;O{DC!qcERFfo}mlb>pI(H4`ktS?y2D1 zgtAc1iQGb~z(1P(65Ew*;>Y|z&EjO6{w9ru_{uDbbnvdDv{~_}om4%ILe{c~gZGA3 z%9r@aAz6ya*$k?$on3{R;g3gM)7}*QEW*z904^@Aw-Y4v}=} zGm(QEQ#O9@655;~WpiNfXYcD#=bxweoO9ugHms0kDAi8#8_CkoTUGi#eId>JDe?1? z1rZ8gwo(`%=~X)n+Xzu~l(^^J4m@YQK@Yz!=vy@!j!$Bfe!FI@kl`SJY(*;$bZHw|R{@-~d^JWbl*`xcB% z#Z)^qyiX)Rl;&m5W`*-Cd3oW9A+c_U9G{j2j(aYlmCp)YpjeG7AQ_1+VA0M#UlAlk2_9pS8Hn zm>2E|olQG>g{|)_>crM2v5ao6v5u`xY8Q4sk3nkf->xHI+A5i9REdl`tt*AUf}78+r_4T zG4c8zhNU0zeTSvr!u+MQ>s?fDz|uE%dSL0pPF1T+Vl4TP&uBT3v_}fWG{m)4wP8Ln z#aEC45mL8Kll0fiqUEls+J9mc79+15NX5Cvjr?sXc~*}x+W?=ft|5S8+}Cmb2ZIo z*J+$+|1*YRoYKUNr{_=`Y?eHhbM4>SO?o~RB(4RGS{<^Rfv1rOPljzFd$}jVyghZ( z?0mw#Emw2OtS{<}8~X^#Gy&8NTkqYq%7dFXj?_{UIT;%{AR{$81DAP?<=;%DRSY6{-8cp`I>-g)HD{1wx1`T>4)+FbIP7#+Kv8G{*j zuO=UrtAf-;^{^^|b)J;FFs0-n`=~f&_INs8xrjK>C*+3*YDzvxqQ-*E2spu2EXren z^$y+~4;&-zN-`Me(Fs;?D;L|5S`vY^Y`{G^_-LQ6p{^Kh1rnX_~$!A zsjDU>=LX3U7A>Doo@%vFHO9BLRR>Ff5IaNoBl?^s`Y@%Pqjx24o-=g#T%g5sxAm zK%K)(&1R0y^%c+k%%6KlXXl5$I8Wh|BSYg568#pOZOTj>p8m?N7x%FJ{k#9>e1ZPu z`QpWE?Q2v{DKQ2YGzJ08sZJ{#%pMQd6^Hg0{9DW#?+Tx*bHBwV|D4Hu<^Q6aAl^>y z_2czHYd6uiO@k`h{`1Wq_n6WD(_c2Fuj{z$F1%?m`lB0dWL)Sy24u*~iGAyaRc`4< zGH+TgzO=BqXKu#X$lkkY7hkhy7hA^xmFd?`?<-%1Ga(8_Ad5XY!C!6%rVZICBrS6| zSZqAz9N&5Tno0i7W9>p*YS&!Q^m-k(GC#JOu=FDs)rYBmIu z6O#$-rRIxg+7JH0-8l5D;x+Um-Y=u`!E9(D;gz%B**hv{k%?AtQxfqVtWufPGwA9T zX`{hL3Pt0OsA+Xu6y&amV~MC@T;2n__U+|uJXp^SJ-ZcFo9{VFZ!0viH?-^QpHsYA z5qiay)Zq;%u<{gUwY^w9Ep2rcJQ){}t9V|5$Y1Qu)091*!|Uh3UAw=ec0YV-I%cJS z|D>C;6Qj&K-y8%!l;BlaiQ|I(l2%l@3&ZOdgr^U_BEp(X8b6A zw~oTT?9#`6)A{d@cXn}f5q9ekqxL}!1nTbCrG^B%YKd|NJS>veH!(WiXv4PBcZCSL z$ln-rnmP(S-i6W5z%bT4@;!A1_N6*#8yzrX+Jw|3vq(?LGS1gW?tZQ z>4(JsBM&L#%t4M4!xFjnn@PTa*N(8MTrQm)`Cj>Ma=CW91?=J+cxan9>sFj!ydHF% zx)o08+s*+(6UO&i{f|Nm4dMg8WGsq1P|AEd&|m7|jnPP`o(kdXA|NfLB-33?#U^>L zRy)zaE?=PckkgbG6oe2UmXw-Dn3l-nVrEMdg@^3PY?0~{;z45eSyPHqm-BkXsEX3N zb0)?#9j#eg=m+TBW70DMXupMPiV?5}n1%ObRrK;FHA{EbjWYvh*eG?J_0|1Mc<{qW zB}86OZ`iNr4Mr*<0$!gLFO+SJimVN&nyXl4dtewlScNcBsC=YGh`Xn?N463cxu9ze zc@}Rw>CzAT25~ZOj$S)nV%2@!L;w|e|(~*$E$qSoc3)_xOiHk*k(REp8@tsFT#d0n@_*@YPwFlX1 zJmW{>Y?-He^-?TSo^lWm*B_bgKji=0gHvMTI!_|cVTqXJ4!3}9l9blj1ZCp~vLQ15 z*UHgy1fT`*-GrBU#O?zt=dq_7!9IG7nBpYf9aVoIU{Y$~0Lw>&STE(1eP?~GsSkce zqhHEi@*b2Lb{sPqN2goZJ5)ah*^B-%^R z(qi-t6TV55`z|%QrvJ;Xi)?@CCutE`IN_YBv0}z)@j??MD@|t7#l}E+BVX#mjBkGv zdwi_!7^mgnf-CM4iHuJLk}oqhnis$Htj}*$cF5cL8*3GtOqQUI8MQqha5^1MG-*!; z*{oi>^ZZauGC+cAOQ5TSqJ$4!#jOEG*lJkV!1Kzfo;BgXu=;q6ZkI)(81NCO*7N{d4`2O_8q<&&N z_(!pVzg)^e@?rvWX(hg*4V~w~Z*3*!GjVpQScw+zx5KWeZ<~bFhfhB>tFS#U!^+{Q zFGP4ZzG@@y$zL^APKSkUixZmh=md=dP$_kD#*9TXPuL91PS#1}PKg!V(=SfG|0AEC)*9u^5zhrd9#$HpHoVlx|qV2?^s|<-5K7^-3XKJUJ?a28|wOl-lRcK zLZ=4FQL~_$>z4lRBi$$FCS)O-Twg@Ff`CmbJ$Cd1;Yt)Rr!rHqz3OZ36FM8G(}TQv zq@&63j3_yQ1r_VUmtk7`F*PI2?RH;cUD~|O%1X5JiS(@vMYN+$_)N72y!AYqA>bu# z%hg^7s?vm7h=ge!KuU-Eho31UA~hQnCvYnPz&wbCN+TZ4w&3FGTc6&12K-h!Bq@$| zSWLsMZl+9R?DAJPepaz@t#JM}?ihG5WxnP2X2RUKH6G(5S2+r|V&u*%HO-sT-hTG` zmhVRs$*3akUX(kUwSu71~h6b znaKK)GePg>Ajhp*o>h}ieQ&J*Bnze<@`Z*@)x^|QYU|vvp{yTLMm*sU(SNb!7vRbIKY!xb@OfF+|7i+hHOCYPht^&Bno^ucADSFA@`Zf17>Xfu}EmLSIVA9g*sB;!xvz& z`HJ|m4?-^d`?Ui8Ex%=)tU6k|7d9Q;&4^7))0CLlfx;rDf#Yt9O1j_fcdaoxy~Ss3 zR(vd7_UTGH9k==|??m@*WA4{5BwxK|)PbHLwlMXL{}NMQ1d)^h=RbWeDIYP5r92+Y zjv<7=*4;jdv8f0A8f+jyfAqlCm8UmGHQM3hz?RCo4s5A6_UHY6Z|h3bd2;1( zv>|S6DVp1Tn1*cHOQxE*l8@X8zGli9?HJz*qAo4f)E?5jf(Y$I;a@7EPWdu@0@R6- z@gR7eEmLo?&(`x0d8qRE%K0*#T=7l_yG6Rq-DPy*caJzVXWN9(vGpG9ZsyG7!=Bg7 zYKvQvBp-fo%~-t422w=Y)D>$oN7jY%TjtG1o!xhX*CTzls=$sCL$j8827`A`hi}E6 zZp|AbGyhq0XYwcA@beC_FGR(Js%T__>;Ve#pyKP?<3{=U9ey!;4$i-J{+y--4(V>j zPGOhIwP6F5Ykd00F5rr+9Sd9w%(}=np;R#uv)9Rpzm4oO;H}zn6(rt8~SI3&! zo4lP_+p;BElQcg<@QC8e?-9<9gi>Sr+I>3W><5;hC0e?NJ1ZB{vA1C3yqTHqwwb)d z?7Ex_-`cfndd0s=BuvAkggO-;)mJO@OnoE=GxM?aNOdG# zYSD_Xf34~D!q+wOtS5{kjuT&NPEh#)wl;^>N6R$O`;Ut$s(jhj8>^6ACeGX&8vEN{J}QQWGsUoX&1Ev)93Dj-Bws2g_W#tUUcN#?re6AZw^- zbH-dF?@#+%Vdv=N6|bi+I*Q)>zxd;V&KxEl)PJNBCKgKEVf{+X9P{87dknc&)NJ;* z6dG_jZ7;wU_=!n$nqBFW7*=M^3Cb^wc0|fG7H~)&NI7U5N;lgF+*->P>7V_|PEUhH zxCMR(xC#R>_baie;^N=hGv;D`**SPaG@@ZSJCqD*G3_n;-@(;&KuTL=E~wAjs(N|Z z=FG(=Eys&~88deg@wbo-UWaieeR`g{?sJ6tqznbZIvL$HWTN2vFBqIk;*Vt;0}M7L zrGI=Y-_VV~p__((Q5*3jn6jllV)Bgq)gm>+5Yn#5@{{3nIz|NTO*{HaN#>7RpgwuO9H3;X+GDgcNl#p z8y~xqP$m{gnmVb>>L?i_409KbCVYEWTaly0w$d9}s9LfgN-@TqnAt>B^8KoD*8I3) z4VxR6d=j(c(EN%R?FTkCEka0pSoEqru!Ms?knMjl*EWu4c~D?cj2K1A{Cbyr+JWsl zR&C*Ew%I|O71y<<{&Q5kbnk+Ocx8#ll1pu46Ch>JM>zKIg*Gd8bK6uNqQB8MWP#1G zUw-x{?AEeVZGZdj-S@00Q9eg>j_gEa4^QEJ)%aI|0T#w0hJ^9i_kvUC8MA~dQ_nmf zO#Gy~jJ`vc`V&0x(>j|Sv^XUO1U@J+5E-abbhRq7<~%zWOytVmJZ8{{C-`_p2UFoc z+BM*KtC`wN@!h-Z-%)mP9++OtN)>jSRG*{kh_wo-x;4dWK^d3j8GUL^LiJBBVuoW| zxc^dOr)on6DPx`kmW)5RbfrnS5rP{+T%pRv6PxNiQ<-GpN7SmCnFoP|3UU z5wmS^tguLc6RcUMh}TxzFf1xO4+7`%@nWGYPikr|`?y*4+H+p1Vc8I)MXB?go3+|l zJs&+RQJdhHo8i1H|Em;?jrEcIDBpxMYCq0=2cA>pE%bRM@fhIZ?GK?dU{$r2n9TDq zM4qw31(JWdkTu>JXnny$u^tHOc%*L+axfnc zjz&4~&F=)^)GzFfR_zgGNkCS|*b;P!>Id!9FA-IoID*EZep{{Voxf||mFxaiI2QZe z7YDF-t9_WC6y*@nVS@M=))$}guGoo;VuVHrBWFxeGK3;5Ly`%PX!?rZZ?>5JXS+pd zk1e9qNoi0P#WEzl4CS3#u6v4I4B`e8r)&XnR~gfaxJ-U-HkEc>&)mw+BTmLDUcP*K zoFU=fd>#qh%1Nqya>6^EBUY~Ig#h@J3lKD$O_NNW$+cBXD1NX|lr zP!&^tX`arj3041>eP}vO%n~(^VkXQ4661XnCc9^R|Lae$p9X&g2y(%JH~?DHA1PMl zHrnYQOo;Xz}>Z>&PB-uh17c~yTfHavfET}8RINnu%yzG(3(eTMf~sm^oiSant) zm6Om#e6}i2wK1*P5*F9ID`T{{pxY3!SJj{@S^i{*^rkjag!Wj{$me_1HJz=GTbM8P9IaS=!S9(@tT`BQ+_1(|bdB>motdQ@{dq`Eoozxf?NC8_t z&Gz_-$J{X&RoRwqDacsfpJ&B5mnakrucnPfIb;zsY+)JRXbLBt8N_8J6Sr@`#%T()7KhnPB z_YSs_6E--w%)$fDsp2+P%Gv56S|upIBm?dhPFs;4mkwcdLRc(%wF3l8f%il7O^tXzQf=5nf)jzYy0F zfvI3Ef1}UUPrmhE`2^3!fo`QLW05(NlM{!{LDjqjvR|pQ#DHhZDX;;|U{1SZ#bPPk@*VRH=DJG{ ziIt@-E*OF{Al@YuJci?1F>J!I!1C+ zCrV7JKM18hS1r&{*eO*$xunR_kl2!@w3b4vTC8~>@rmXLhQLl*)L_npgDSz-B3MwE zg0NP7slHtAI(;=^uP4;({0G?v^$>W#e}$rGSXW1TmKb+&(x1=v0c&V6Fbb>b)9cpv zzzUyp@^!8kbV-d!>eVJ-JJoQSwL>TANwB8B>@nQ&Kev>9>e96m$0yFsKz~)ZkPfE& zr#=Ip@3M5C(qEVj#N|S8BV$H+UPqX56BauxPai67B6bsQqAjlod4t`m4WKU*6EjYz zn%R?nz7RVolu>L^6z;JE}~6{HuX2Km;hJ@x&PSYxcSa z>&$(e%PyK$7N!HmQ!&6~*v2{80kHsfGe)$t8x{8qQgwm%@Az){1`r1Xm;Em;vQuGM>xHl~%pZSbt>{T+G;1F(CXPHSrbO2#~3dr!}KmG-H zvibSqG>wLtA1)M_($!1$D&Jl@`Qr4cNVD$4i24n2`YpJ!YBxj@;v{FlmMODMyQ=0I z8>NOdjA>8xAj*3w71UU#RGmVP#3rOX6|LbEBA?{`0o$kPd#*qWvSf=YcbLJl)-AAW0-X1N@O_yo zEvl_;44{6;LEd)}`xi{g+bq#nZgB0(`^2UvN49g5yvW|IzB|}5oEn1XU()3c@wDFF z(nsu;(QXRi)58u#KgNpUA*}$!7DhFEN~!WcvlVQ?B9GYrSAW!mL;7u&Vb$5$UV8 zAJlhCBw`BedPg782LJM=n#o&P*xmYT@?iT!b{-Hho;*(Rc`L~OhlgTyHm@{GU^aF? zEb0#ctKTs5ZfZ!~+b;P&twnr5owPWaY(QLKt!NQmNkTz`(fL9j8N2GfQTLG4O2}iK z`nic-;wpTEgfGGu^<Oq^InIvl?TcTT!Gbf5$=^-=9tRRu5(zW-mIcX59|XM$hT!WG@PN zs+GJ#XMj13#r!+C;^)Cw>iNTS&nm5Y%}qTkL=B~UJqcDgU92;Ya3$sv>YGkwOw!sHAJr5_R*LW0p4PIj^u)U^ z(TSUib;Z-k%`!NBG3Yj9ls%_aHF08Iqizvu%`xWqWQf=JfZfUJ2zNKFEsjiIL)yKs zhkqf=Fj>4v^BNLD-b&Rp!XF9qLJD6OkCebJBY+~I7IV^6yjGKQCz|=H)i@mkoAjSi z@lNYq_}6tmxHs8KH<^-D;&9uag6@yu;Hr7(AN3Z*FlwGC*wtP($D$KZ|8m!JK!ZlS?Bi0?twr!(43$$E>nNQvl7BB7vO@JW`G$aY+=P1`x1wZ-FYbN2im zGoW$~aeDtiy5-%u8k#h13Cs1gTW5a6w%_fO*O`AzTvZ-(Gps^%tU**RC{-N&jk*NZ zXKd#Vr`4=81YQ$@HaF~5*@?c?g|7^@_JzjpbgnaH`3uUD*>j{Tkk;u4t@5q6w`Z|X zbo2rQcyrEhqJ|CEF*WsbhQ|WAO0qMk@!iwvjcn59TkcY=Pp%4nX_Owoqc-?6d3>M{eCUByv>4fTB zcBiCBe-x$*7Ys3?1_S!swatKpSLyfrlhJM>t39c+DK!xp-@cPDG}dhRQJfJ9>t>@} zsCwt~-NAp>G{2}ed$o$_@1AI@QAKHeK&*Lzv}Au3UY^U@5$aTEYSJVM%XapU1#P?` zzvL_8glzkev540@U@PtQB%C`QmiNk{PUK|vZHpuh;Y+RxM)5h&5`H=xx&DXs0rrsf zU(^(3`gajwAVcmf1r0+(RY+h1u!s}}9Vz0}*iHO{-D<=e(|Nv0ORQb$dA_P5Pz_%A zMK{vw-_P8Q;#3hw=XEO4z9i~V)udWCh(H6Z1=A?>i%vF#z4_iv-Q?%_`oeU%;U1?*lNgx20gt_){qhN@JMPwuXvMX`UT~);_rbL@huz{=#~M zMTs_ZqGB>9X$Iz;c(`biu5!rJ!jglefxDY_E7RIP5SjCm+j-qsXSJ}Db-w|{eTJRT z*nJeM1JB_#)(^k}-IQ!OXi5L7YBclTx5r%|yoG{my6_v2;$A>kDyZ~Dk)Bo7lka5A zDQBTq#rY}>L#uk#DLfifjSOZwdc<^wa0%AiPIiQiDB%%z`((xlMU#}j)((Y_e?4W^; zXui`Op5b5dnSvAxfo-M`;?{4h@Z%=@lmn*g*+ zr(eSo$Qhlnx_QyF<#@Yg#jMT3^>M#}oQsc@W?6mE!Rkq1TTC!`m--OX*JY0Au9x4@ThxE zmb}m%KV$`Y5D!UU;DR@vRI4GU(i6XEd9M0_pZxm%mHuy9dB)ew1iNmO#7#la#7-)R z)xgu%M{KItQ*aRI@Sn7Zkav6z48%o}Cd&veyT>252`zMU#LVffLbDuuRW;~p`M$)k zc-SSsv~Fvw&w4~rG-XsdrD%@)=BlLDVcZige{xjhm5Ie}J#lc)-1L*E>Y1cR&6(gR z*o(C}RmVrt8LS01ihp1!p{?~9*vK@t08x*eK~SGtT?dg1%l2Cl+wf9)ORI`VO+7AJ zG9j$3-40GWqHzD$|1=;Alg$_sd*3)OTBo@}m!S6Y(PKAUm=3jeIge|V3?W7nE_XWB zS86zgZ`ClpDDC%wq$&4t^^!E*c&95tGoUX4w7k#W$eJ7Z+RbBJx1>m1HLRIyGPecc zwp?4|a#%AgEHrKE6Q+=BYUCCTb(%dfJA0haH0e9s^4R_!V?YQc;bY?&Z0(3XpoiDf)R zJ10_kS$4Za(oO^Ntj5|g)j0wuPq*51 zguEBzHPktt0nB1w$W+g8)DWzcPdJhdkzlb}GU1kMB7z%*B_&SCkC9j2VyRs@d!<-V1Y7xHC_$MK3{*R|=Ln&`A@T|i$iqqh{cHAr6e)}c#zs;z z7GTdAE%@VL#Cgykx*#$x^LcVnVX4EJu_9_ZQk3#hSo+e}dR@>kSfdsTZS_-)Mp|Eu zNGBCub7T_U$!H1q&|*XC)Xq)WB#{v}qMm3zyInoavLwOfdnrc|!w1-y6iLqrFj(-i3!Nq`>O>~ysuT**a!4ZiV2pI>uZZMpm&`v6^tt_! zD_1gycsboGDhE-Rmru8FgUN5OD|At=dS`_mx0s{`GDZ~~IO@V}*8E5ih%F-%N3jU= zF8eEnGm9obk9eA(3nXKfP$BUcVx`#xI}x%4SP4GU5b1&0E#n_T2KKfpuEYzS%B3PI zXx2G&5-SR1nOHwKIWb#u0CLx$joN9zt;wCeHpHQ0{fG-( ze^f1TLw;X70=(+A<$%6!x`E$bUy20KO)M8@1Gu{pxWa2Vt{4Bw13r9o4aBLhk5e=v z#ZZK(GwE#nP&%Orm7u#S3Z6UB)u9PiGSvqT7HUc`o}m8pzyj>j23!uO9!w(25VS|o zKGB^-fFR&ufS)%J=r_p%g%$`ab0KFs2g)Nw!~wAJJ!25`le`R4z#Dt@#+4tc5FaQI zA{;F)YHVJ2k$4n3kRG32RcTukVs*uMfIzI_Sw;kSC@F^Tfi1%85`$9)?5o!Zs5T^H zu5vThKW1e|etcL$%gH-oh~$EJ` z`wEQFoi7Lqo`C|@IFdP<%39E95;MkF&ebxe)N|jcr?1EX?|4bHMMP$(Kxin>iPm7%#djuX4kzcEt_&Y&aq~5~*Ye>dWAE#S+7i$+h&byw;4ULfu5R zxu|Rm88WCa)j8Sa)Ddr+OBZ@Ql1TawYbloZu7{H(wLex;8NclA2gCoAH2$;7txBD< zyGQzmH_~5Y(V=f}05i4k&^jqGG;;&LV$2fd^Wi2716#=IvNFTRf1qMI~8+_^&hg9?(*FyEWyhOE zUk&^GoY-WEtdnfRf++*zu^u^59%303FI4~?e_giKpYPW_I$}gY27QBl`MFv)lkrS{q z3nF+M15)NecEYzgtj*dP4Ooj^OGAF&B0Ivl=EU;I|n@HMfe44#Z1$zeq&+6#D#&UwU1OT#~+ z*Gj5Z2%-u(SrR)Y9aA0(DcLeVmfUH#Jk*FJgsB~wV@!mU0aO?Y?TX7vTAGp?@YBgT z(m&bnY>_bX6R`E*8zz5dDC(mbgNPy^^YajrO0GWq!*Uff6>|aoWX;LoqgVOb;uE2h zrAzaR-9f|_!z9En8OdmeQyn_`SKDw&WQVNes(8EA~x_}ePXgXvZm z+H_PoAh77OWJ#|>6dhg<~s_+A9G3$YPI+X7adtzSwvvbL^N%q85@K+0S6q(P@%NGR6_(q8NJ2lDIze zbjHK2O8w;XNp_a@j39;JHidsCnH*L|>p1D9 z?n?~<-9xrndC_YEdG3@M)&mjoEBb0%uB+QWF$ekt#jUT_z_vd?u_Q34X&WDfk*>AP z>wzS<69kcZh?ZRxV5>^~6Q` z*I(_3Q?v!M)H+5G4$5o2!km>JoeB={=uDp9`eqs2JlUhy!gX^6MarbX7jn3*_^>hi zJw67|tkSRcwW7NrOym{*LvP1tE&X*qSF;_=J8Uj^BqwCzu)UP~7T0o8`3rCn5|7Wa zaBCVNhIcy;n)bO_dR_Aco@5=MTH1=KrE4s}JxeayNpg97nVoMWiyzywcou@N*d_Z$ z<%VZQ!QWzq@tJa~mTeIOw5ny3HUkR8Ya0~YvuoU%iM{9Oe3fup1NJK?v&w5A3opGwWh^^3_z0sU81?7Y5U{X4#!w6^}8xP+uMkH zNn*wExk+7Xq-3YH`!D(Fdi__Dhj&5mw-TTgvvG4tTnXet?(5vG%l*ajH+>uOK)qx! z=lay1Ru#bp?z>BX{#;&Hx)`2Y{>02eO+=hQgqdRJ-!Ezy$`y}HU95B=6h*nN)!v^~kgZ1UBtaym0t z zFr;Z#D^#`TMi@b4smK%)A6vBO-cob(U#q)}T`b>&2UY^q2mgCU)WCQ8`lz@$eU_~( z530Ts3JCk{ipX5GYHjx&$8wYGN#`d*xn1U>0peP4lXucN>K#Ty2zJ!6Q6h{RNnvfa ztVSz!dx_x~e+|RUdL?obZ9zDC+$2&HEf(9zmpwQixg(1+CD-MP*%tN5DK_hX^?B(R z9@KDKC{P^4H@0#v-l`7&C3}O|`2Xc+e?liaZmgs=;U*v>7@0nC+8$~3RzQz2vBN z40oS!j;^jC^Pk>S@Af0n^F{r`nWj4ST#u@aSH%v;G^0HCdl?Vax#>Ba=_)L96F)Kb z8F4#ntyS$f2g?e>DsfDVH*~0gVB*uv?#AoL#a8mSyl0h%>Hx@9CEtl+A=%hKhsABe zWrAsHEARg;=Chp2`6)cw4(qzzM)9U-y8QcZ22qmxYd_%KjNV^g6|B$QCfzYU@!tzd zgbcgarO%bRaM6PAaXs8Bzjqy+mhD1^rn=>0Nz92@8h(DQpL2EaHAcf(iV~Hs@7VmD zHtjflYiW8EZ5KTRa+F$P5BXV{4+#rQ2>?f?=HgZX34ou z%dvlBc*Ej1jCi6jA({!zq}@L6cFP*B;DE1u9G9+n3q zeTtxz}$cC{VmR@m>;Z`akPN%kG!P%#Z|&WcPG2-0blg^ zlD5CriRw}-typEJ2sJN^vJ;bJX{41>(rGo4-??~t7|@8%B#UvA65g~XhWfr+bYLJJ zeHWE%<5};A@{7u=@13!y_tY>`P2G$NXSOGM$ z5Jy=5`uykLHIjQY=$p3B9Ov6uLr=Sc0%>50haAncFLxx?KJI(e%3gJ?XP~|OVwf}< z@}SbT;=~R9n7HM741aj#1y5=SWTGW?_%XJbA}mLd@1Xh)>v{Ko{)ezyM%OiwsE8!? zfZy%=fq`JTn3idOe>f4H~2uFG@@QGvc;7pZ)P5O#`t_Qme8=vjaoPfHy*CD zYgXSAqNcBu%8apVMk}LT?a$vn3@p}(*r}?4DV`C&IBmv*)iVy{5|dVD6?qZ>w4I;Y zXTErQZKvV;BG);1VM^I*m&VXI@K3q0wkUTaA#(`DOp<`s1Id6wB^p|QuJNetZS6_R zYGh)@4be>0XgL3@T~(XPxjMr&gP@`F^fS_1Su1NqR;9l{7N4bz;D>G8crq{XOvJ-L zZAqIZK8m)`xA@$rLa2^E34c6%RvA`5?=39YXW}5`ZPiRvQmV>XEd&CZrOqYuM#s_2 z&9V6>v+Oh0n6BHd=dOXbM4P1x%Ka+bgf&<+;vbG%3`#5*<&wGcQZ8KgjbMaVX1SzI z&KR*Frnfwc48~#Mg>t#VO@lMGm`MEOJAJxtwwQ#-^n@we9*>|MPL7-vMkGm~1_o-w ze3f6}Mbvjhi0ZRZhtq4+S7AiDdiEGd7gTjoKXE_oK(g4w83P%D$7ha-BG$mQ)P^6X(`@PQJ3YD!Wa)rtU=_#>LB4X0S7RYSay|fnL zQoNI8?zzcYOYyg&G@O(MR(c()91E84YXUT!~yxr{T0*Szmc#5O!jY^KRM4*eR!Y^dj?DvE;0#YOHMa#f|{kcbmP`Q6P0Ivp=iH zF!?coWG!3g8bz}O4G!LiZoAZ)dj@6fCliv(tkx}dTfBNVt(HIgL@v;a+2S?6wWnh9 zWvY&K zMG6*lO)9@~J^K4|U!ZlJ_?#>9tdBo<2V$pVco3{!P`e^o@=(Snp5FdDpCAHzeD~q* zJQ_KnWpTAwQag=?wffq*K$g!!MEnLXcN}fPbY1uv1D8SUQGE9vtN!rmmrq%7RH{5- zhBs@pP5w@lR~~S%N_ohxXj>?& zAZmV4d9ho&zr%U4>_GHaP#|o8)|-_;!j5J-lud`5Fd}VEzZ1{COwhfFyEq$?g~wr-u(I=@c!DiAUr-0jLD80gZQco zW-eq~{m2gEf|CFxloG4&7n)s|}9qR#AzWY-KZc(J_!CXY~7;!4GR?rV~Qbo~{P z1zFY`FN&g&N2r9dQE(wQ{u+Zz^ZgHq-uC1)myFdQ4{QScWNJjuY8%yJ%uH%2HbKl6 zPiPRUSq`x#JD7kB_+xbcXdHuT%6$;j4Q-Rr9y>QfFFXntLUS$ zvs~C@Cc;oRcu3M>&RcnwSq4UlxlO+bv-*W{4HST?fT(q#s7yAx#Jm5ra7^_H-g@yp zZ(|jG1pW_SKEV*)>>1!g3db${teZripPGAEdSdnAuPguftHtAvwcJL~7tmccf&Db? z!q0XLNKHju5cmO{(m-4}S*rw7<+J06!%pt7V0(hvIUSYBL97r(2 zO@!gXZGOo=#{W%3pvNM>wCyaR@=(ZhL<241p&c~`S9fwi^sCAN)t2)OT zpp1NsCJ=VW!D%bT*w89duYcH>uc;vMhsx_h5xGGqrT*zZ;>l2*W~Pwd)88g zPSjE_Yc{;oiE0WfTNnK-S|T!p^pq{}-?FWW|G3i{eY1IOhVNLPp&AU@v&|0#o?&ewS8#A{08n&@L?b!>4E0@u2};G$loM zx^y1|X4C}yPvI=cS3TH%Evr_b=mQi4K8fyd~D`tyf8XABWx-)6j;g`MhY)#55O2LDwIy|7t219b)zBgA=_ z%~Be<5J%3Ap8J}1Q+ZIYYuOC*3qg+~PwDQJPcKE;jBNIPSq~Ke_jlllD8_V6YG4X4 z&u_+rZ9QQDOv~4c&XjW{(;4R=hAMtYeWBk*`#JC@?i>QAQ$(Yo@KO!&$NWcDjjP}d zpG{w^Tg9~-dj>S{mo{#7dU{)A9h*BoifV>kK&Zz02y774AGg3(>Du0lRRu)0ql$!s zE$M!@XI({9Msf$HDhjF$BKb*Q8~wWHu~s{g1AoW4t7TnQZ!#X7neS5m;vQ3;XG+1b4J+({8XzTMui3_x<&% ztpf9Sj*tY>k}f5tPBo>L5n2 zz3Rc+Lt)S^{vxs0#OLrhJ{E9mFBab zZ4k|<`ifeR+Llc(n!M3pG#RJ7{x>HJ{|_b5!}O}PX7wS|V2*GXQRXsAozpk`uw}4i z1KjV5prrRU(pZ}7o}VpJ74oG9B>m{8U!SnM)HNvS2`5Pu66ZjxFXq;qidCo)` zx4pKUaWUrlj6}4_b%RP)QE;kWT3VE;s!@~@SN2oNhuvBw7>}Lgxax^})njKJ5K(07 z586>O+XXrmiIeeum4)y{8=(>}5G@NgkQ)-u_{_XeDusKzjK0i`bXEpn`sJNXlj&w$ zUZ9zFj0ldy$YI?S&mE5su`?}gux;vvv6%J(nh=TbGi6c@o!|RQOe%b1b+G+rX_ZIf z=tP*I!`OR!DK%-4TcMdj_!<-mhB@SbiTP+ef}Xag_XYdEiMe1-pT>inV!`dyj&iVH(`7CSoX; zHUUWG^>GhF1&>&?FExkrqH?@)@){Dm;3#n<2%EXI_)IUS2{}hX-mC-sj}>+~fu1%Y$93EI#R18amM_zF>jx9srNX&JGrfqdzP(v15 z7auzw|2XQ?bcNe(p8UIae_wdI#O-(9h?EMJU}ZaY zKOM5MYdqrPT(?|f_+odDF#KI5L6aMByocnPAi*QkMu+mWjY0JfFnu8UfBXtee^U)n zdRLR^Fc-miGnZJ%f$V1$6rT@#AG=|Y>CBQ(d~a_428<7Gnva`xC>joSTzx9hl`3t{ zhaK&c_=xt$nuPjuE-ZIJ>s!F4$OQTwg7MF3>@8?l-WYG94*?W#IlBhWch-sbC*6Ym zCwwMO#FE&QD-K4P`K{M0d^$S+iFyE*Mr1t7$~yrhcGhqBp{Wc4lmqqpE$P>O0P4ru z5pdO^Bfyg^V=OdnsVgv8j>c)GrjQ%CMHEc^1Rjnmsdfj%Ke89~naG5pqX zI)8;%#h>=ffQTDWNohq!kzO#cV-Wsl(5dz7?+!zZ#wuu*3$@M$_8^1&n4D`K%YNt?@=9OejK=Z1Fl z*~|{&c+prN-S5dp=m=DmMRU?-I6|pC+KZNt4?^FIG4l8q_63~tT}~H$0kYdeNHAuc ziFXTqi^*!+cRhg{`>8#F({5aIiWY(0#a7o__LH(35PB;}e3t~@(X{0KfKfjXiUA~- z2T2!O{jhd1)lR^oZl@s6O6jf4*LLRB2{16C#^I1H}?S^M8K&J za2m6MU~n1CZC0JJC~I6jU5oKXJ*Lp)8|U$K>Xcy1SJne?Mkr?nMt}9#Q+d%oqs|GV zF=k4ywj*5D^?Es%XHeYQ0HA4+CsTrnDZ2osQj3Xyc@N;q+O$7>>j6v#XR=a)lgwhb z|B|3$MAm!vJ%G1FN9zHcHWdL9k|RC{^+`~b{v-VFvwA41|3|>8xgrv* z^ceoPEa^W4``>w>N=eH8!2Xv4V@2SFA^A+h(|7N1)*$v92Ih>K{VQ<)=Nrw!4QAYb zvJ93ebgQSxpS?D1zx$8J{CE6=ha1d)y@&(!AEN*B@V>e9X}iNrzt=ftyUZ)ie=O9L zJRi@vwEYmrY+o@D?z1Yyi`o!`pg2_>EG!@>nr*8L@srJ&`A7OoesTErS77~5Hx^0G zHmpCYu`r@~>9E7hVXZDJC_i$TBmF^ZLf4Ygj=tf+C3|Cj<>y555uC z-&qA#yy5!MC|n0-$BP;KwDD8-0^r8;?_bq@(uAJXP2COf`4t!oS?L(7qM>LS(XIf@ zd+kb8pmBK>xFg8V+*fyr5#PlgT=rQUYqQhDx!8_vL(bM|3L7v>aM7>*0aQ!8u;#2$ z_Wc3ai{Z%9IY`WZ#Yf1~FVV8VYiyj%KsrQtd^L{Vy~{j2_W;%eqE16MYn)D>qQLjoak4_Y86_b?hXV?5%bVPIg?m06g4IFj!aB zZSO~8s!(?iC3e5k=86+*SHVTBNbFt(Qe#EW9DUk~XvJ9Zn4camtfO#YTeiW8iVXNy zIjeDOmr+Nh8>VM8ogyl=f>+yVu*)i7Y1wPg4JhsBkd}8mUVueCCiGqdXVXL6a{Fv- zbwAW*19Qj47yQxe4j&mSGQQ3|2KZu3sG|qdC#@e#e|@re(3?69#>CFADfD5GZ80wQ z&H6dt(m`U3cwyD@2K#flpnh?Y4%QcHrgKuiW_Q*4(l2&BW1>}Zs5siY57hK*fkxtJ zL3H`ig@(Nd-4G$W{hV~1Pxl?uq3^fsNEo@DIuf_~rZlxe>q+dvH)Xo_Buez%cP31> zxT0^_ozU_@1Yp~qFa_YsOYcvhMv4s2#*$7G6p!XJiFPj*KMcgyrHCD76HA8uAtWjp zGbocM<<@b3tsHZo!hb8gy=kYyC_N6psHdZ2aVpmZX-TwSb+QPKI$^gM-+o z=ImGb@j@jfMno^E_EX)`uXZp@Q9%W>Or5gjWXqYTY?|2+6P@z^so;}-W`S|5_BIst z?c^6KMB0S+H7;wRz@p#Jb~jw;R$T`&GvQAB*xU(Xb-gEx9W&ML z%i1Xuw|8rUitlom`LOd3WP|4)@H(xFdmZp|<{Xy$l@a8|jPKDqEz_XV6Iqo-^h3Dg zVdN=nE4m^QKxK6|DEfab6^hI?&9!;-KYYjYj#3eA)ZU ze#c;gR-N@#bAt&2U7jZ0zqc-jc%d$<_1V`N^LYz~0?7zRwd+-Th2*X10X`rNGpgC$ z0Z$tTI6VrV{EZbn$T__|`Sbx@BGB>u4su-3BtFUBXzgX7lK#X6%L_~Yy7e*k4lQr? zKy-IyV})>lV}ApFKejGh1f@?&+>v`P9&{`&ZDl;~02Zr+O#b?qT?+KAs@-P)l>V1? zqf8ytc`+J0$h&sTO5@6aO4_0|Ng<#z094&1O=8E4+}?>`EV}a(X4u%nF!<*}_idro zKN)4hJAnk!KNIc6%J;ZX?)Uf23j+s;5OftcnZ`!3gY*M+Y7Kpcb%qQsb}qo<7To04 zH`!)-BptFGUns6v;#8M{otm?$JG>+4ha7kZ`g!)887TV*7I|rIl@prelEjb9pJp5Q zGx}-YtB|%3yA`%BLh$p3$mQLGN5O0Hb`iY5W7;cqmi4TkJYl!7b_#;W!*-B2yWYCH zGM1XE3QzK06IJ1(_XxJAhG>cyhu)d(eL;P3YEBXDZf^ouI9me6iL>4bAI@rZ>C8F- zA&+MS-tWDtwkmdyC-fVhOE8_8S?g!rsH$fv=*s+Ch$(hn>k8(ABeJmrux_VDCi2^Y z@TL~owCy}O=%EeF1|Xq17ahgD&X#{FRh6aG60!ajWrj?H_rgms%RDJ@(y!UReg`7XcR$3?7<(I~jeXQCS zAWu1F4(6SA$60-xCqR)=sxrt7lDw>!@$R}T%CjF2d{SPeM1)k9B=EI3>FKz|iGimp z#2p&mWBh@%C!Rtgi@lAf%r_BRE$1wB?KcO|rUo2=j*0HXt+M8{I3u9U3Y4&HfM|Jn6@IQ* zZPQHN9-!r#kB6T?*oKbrSpX$)wQ-TMX6+k3ad(Hnh14NaE{`c3q&rZLQ zI`eh(wp%r#kKraF-fAgP=I;~zFkwdiWfE&{u7)g)8-mIDCu+#>ui)i{8NG7Ah>w4k z)OL<4{ti;bSOQWy1cyPRVghuq@KcSZLW_UXd7IG@1CmOU~ z%dp9-Y41^ROnoL6&m9^|RC7u+A^{$fKFTM`254VOI|athm-ok_Zcw}7g2Jzd;Lr_883@2iA|*I;vHMS zOuvYk;Sn)?N`L7KD`L{|&CHCh3C*(}{FB!QL~y9~UwJT$6uOM4&2VYcd1w-I48~lS+9$l z<@y}Kck5=oh36@?i)s8N-!!}H`vXec1DC87nX~dmQBUH2aF*cj{6@g9yFcJ^4dADQ zK@+riMX|9qaxD4duj7}w5Po%`g5vk#OBo~GlKb?1+41j%E=nwN8j15QTGqPA{A$5` zRd8lFdkve@P(Ps$w7*C*QcuW#kJm)kjy^zT;rqQg< z@ZkP{Yt3repfX^MfnPptIFTomLtAPM6r|?y*fs`BP29m1gDK{(tf6aP z0Jz*|>5TzqdCGu6`Dv>mi_MftdX>b&tq_Sh8x`5vDg4-stX6KIJl-F0X(?EK>lKWK z^4Ln!M(SAubqs{o9K}!bbDF4?S?;bfho=vm=Fm3y()|IchkUl$y50M`54aPUWgsYF z;s7}u{X)h%IRx7?d}~iEj3QPM^eElyWX{s7{>!XR2>q6J&g$GJM;31Q$eK8xeAD7s znW;BU_TKsNJ$ePnQ%MId9Mg%4s4AnZi%pVLRL5JaTrys~gHJ5JU=i0dcACS*lwIcV z@BhMRfk?$m`lJ6N+G&GLGBIa&+jzO`6l|SDo3(=-(i2HWCo~1R?dW$`tpZ6U?KYn! z_xjFmI#~Wn?oh^g@8V;T)?~|61=*lEGiox>o7^gMV$D8KTETd&M0$Mdz0amIa)Dlt z`USfUdHwBLvt~i{Xa#liE$9twcfF;2>J62@jne?cpl|VQ&f%~8JFxiS;8|7pt_s0(4>P{>R9(D4sSehLb!XneBszxl-(6!vGN?owoO8O4x&yLDbr!32;*!-NT zhE3#5oCZ=tp3irACY%-yAZ3i=Z(tNDmo62%r3QJ;#&ym^lM6H7zz^OR&mSpr2|$t& zh75RnfF4e6QHeHV$vD_;W$q1hzIOlKzqj5%D(*HIR{dQB!?f#sjvV<6UBcTLizXTF zxr*TjuxT(eg>&{a-_q5?j+{HVF!w#UBijXC*L3$!U&% zM#)vznG0-T5)nRnLUm@5`=VI)RqAV&&*=0KX0^|Bg98rZm}BwD>)g%&+j3GJBvp9G zUI1lK`_*X_H}dp;E#82!pecB?kMwri;G){58_KOWQ4*Jhx~#s)v%d&N8T>> z0JJ@p(JlZVC^UDod| z(02`}?!uqf96aqCXjEZ?7qpi;5xO8yMA$0^;0&NmxwBc!>Q7wseFME3@HGeU!u^o=MXe* zto{-!)D!Nm4=!YhKh;iv?I1|v*ZT&Fo?ss@m)(FS7q<+Pft(YvvQ~hLMIwNnhFt^6 zRjtAQ>|Ox9sL5&X1&9@?@J~x(_A`ClTLG-Kya1T=_Mp;b*gfp1X)ZPoEafTYDb&)g zVK}%bpfYd~>$NASYA=wJ`pp;qUH1%hO~H<>EZE(v#ItG7K;dBP4jge?V1~mHCsasyUMPCl&H`T&cyn?ShnN8a$V z(lot3^_TOn)dgt!>m7m9o~&8`3CO{<*s@2_A{n``@8qXd5P`ANmM%I0O_L@jQrp@9 zu1o%g_zZDT?BsL*SdsCUn{9pD&zg=s0Ize%X^g&E{hW~z@h{q1v~SZ1GfGCrqXQtG z_+bx>wGQlZWNbURjfp#Y!$*j?M~f`P|9|8VJ&>*sq0nJDz% z-M)ZUdn96Gg`o%sA(b#qQCY5~!^Mk#xaIwfH*f9*>~o`CVqgfg>Bgid=FURVek{g} zQL(v4!#bDG+8$GzwJ#tgSM~)oSq$fpg(z&ExZK#|RKz`V9pxcjj1aO0Z z**aD$4oXyUXV^H%Se!Mox>~=`%4<)Z)~x>G+85B|kT%oz1-K;qlNcknuSt)i7!l3$xf5Sd-Q*E52>BE2kK;&{`7*HN9T)z zuDS#8RgLiwPJV;5XH>lzV&zM?4oTKo8TSa(yli^}7`@;DcQmm-0C@5@_<$0Q>m4cM zmtHchwNkWM3x9(gQR&+(h4neCuXAwp0*dr01#p2qK*EAhUISBn1s`mDv$QDXA$S8~S$$B~#)i$IrA7tq-KTwTys}o(a zp>^|^fGUegF>B3^1|$ys5d37Gvl~%uPN`D@meVv)muF)6g){i)VVPL0b76%(MZ)L^ zAK2~GnX*s#|EiC4IZ-cZGuW4xo)Po@JIxrnzful!nzK@MQ*Xe)vnV}Y!bYD8^%@W4 zmqb?PB(oY~kyQbiL%)S@)Hu!EpRfgb1~EqWj+3@L;hs8?#BzqU>KY%aq&2-;JRm~U zwezffJzZ++7Z1RF5g@edgB0B{L6dhZd_(nLqV3 zlM$4(Gtb<|PXuvoTDZ<^P*2fEqZxG-R!o}dKcrb}ZqF)p)gRde;PCf&a?oxikgDP- zH*i4C#=)8DH_k#c{`X`t`RnIK!)AQHeX-fl$ak;5f5O-NuU29xi=8*=MUT`VT~@vL zyrQ1j1%871lrLiyUv$jeYtPs<>o-QimiZJpe6*@?MIG4iG(+Ec1=TYE8IxAB;}5n# zx!BHFB=-9X>iL3Vz8KRwf2)_iSl>an>4W_)z2F2AF_~D6#R}NC zdZx@aTeE6c9WT^+JeOvS5t?;tOBTeIX;EJuaiQRj>YG62;B2>`r55(&0_<4BNazZ5 zapeVi3RNK~gZnt7q;+4%F>#9q*RpItQ_7wXGVUJrOjL4vcKV3yw67QBxJscO3qWw8 z!h%E!PA>CO*4E7qQOz~YSJXRc-qZ~`)H-W8VM=?f@sfu#6Q7#WFLl7I$ob+EKE4OO zW)Eqf!6V1P%{biTXS^b+K^IcO|Naq9;@x5XzS@1gv1;v?g`I;E>sg~tjJs2%LaA(y zP)XO+9i$O$Woq)wm4ih*b5)STr6WO?cZKBm6zsWl4}P=EUqn z_t@BX5t6GWj}_e^8`jnz?AGc-PT&kt%5{`&P%^SQMF2@O%75 zU4?yGj>1!%$|KAJ!VeZp2d^1};g89y#o+XcU8hP!&leI5E3=!PD7YKN!npo*ms;{+ z_$sH34PiglB`Bi@rt#~Q3JccW*(m4!0&_8fz?f!NZStUR2K30^t3#|;QmT$@PnwXryHSPaKjuzi4$G37M z;fI1u_6|9w-9@Y~(RN7?0qW$7`v*T>Ti-(V=@VPPkp1yP@<;I~`NoTcQ3735MZWwAEyX^@!P*vDPywgt%!pRvc^=RD zBR4$FhKx=H36*UkGH&1js#56)8#}EQs{MiDvqy~~$NjYB$Sa>UnW3aO8wEF#qbmJ% z=d;gyo;O5pk%hV3m=uDO-I?WGc`r?k1{AbWl}v$9fhGQiT=M_fs*!p({?tRT4#Gda z`zK{LbPPR zwcuy$DqLBI87{>R`=G4dimOYJpXFBei_<33$D_xPy&7SA?1D!Ga(jSe5rM#)RnAxT z084O8%_?E>xXW;vg1$J7A$|T?x389H4($8F{rT{CanpH3#$n_fYiIBV%*iMTVaQ^k z>B(A+yWo-f-fcDcyT=#Sfwbij$AD zqoL;Oor<&{X5FU?xws8Q84CH6i^i5aTyw=E;iBfto&op2lsmYsdyy8DyI|mpmlnk4 z17rYf`{?chNrv%V1=JaM*QU??y@$|*v;Cb)NMKOFP6PY2|MmCB?$W+`yOUIU6|0g zevA(m(J4jl_u9p}$EKp+qb|{&a#|T}Y}aqZr|5rxUS+9;hM#ycfE_({K@eU|#cDDn zKh_5+b<)*tfg;U2>0R_fCWSjc6{g60uiKil2_G7lOdYqqa2WZWUs?br3 zQs=wRlDHxn6bV6kE`l;yZQx}-nw~oF%;<|i$VBG9t^RC%k)b{&c8FaDclMYXkJAL= ztAv-Pbl4xx6kOY%VcOi0anT>SjWNAPGOIQq4KzC`wZ)m}m6Td%;ls5<;cfQE7|VYn zQH?QBCFa9ebLP;AKg2`i1?bYdmw<-%vJ-!St7$rJHr0)(;k|vrE7Nwhmb_uOf8>yP zf;$@ump2|P3Bn??!A=a!>Q@U;a5a#aSY*DWn20w7V!?jPH15Y z+OW}#JvZ{TYPWI!NWL(Fw+J{ny^wF(X!KZ0Bwvz!z3Q<%u++29a%HOud|VV=OSy20 zLRFsDZ^@^tmF{Rr@}}Q%5zQHE5XPBL$Z6@hkh49OM~LF@@KP3d}meR8D1UF>dko91I@yYWQpfc543npV6zi(SRHWR$w+PAEQ}hzb0&` zR4iCY3l_Gr_;?YEr@l?ecg${AeVe=b3aoHvh&!eCZcgJNbIX9tA1?UJm>fNvGLiL8 z3F_3jhjV8$aI~Y3Guq5D7kz;bqrqfuvwlv=9FO}s5BLPZy{B`-Y4A&%7+EcOn6aeZ zDYW{{iXpI5>@K;n)`-2_XL53s3RZ__R&dJgacvJZ-`QSp!%Ps?f0+d4%D&?D==Bt@ zxb5}a$jNOj%4ldN08w{ixy9qW-+Ml#b9mqLxzps>_c>K+Vtr&`>9djFOaJG4_B9b( zP?xCxQ*ZdH&t!o0@KJa?VJUiu5;Q0WkI@3sgCI=Fq4J6s`4>3Qyat90Z{OicFqGQNfdxYz~t*7X72zJf2-DmnlPw<;Cka{h_q5+a7k$ zTSEF(-MvEVF;(IBc;Q>?*8Afk(*24Jb&UMmtJ5Kq?mz+(z+U&Tr&DDCcfiWwbs7Jn z7gO-f!jY>NQ!IP1BfP)&U~aiNy1i8~4Rb|an|MnKSV8&)ji>X6*iL-Y5iHfda>%!3+BBtc#K8Lx& zUC5-7FD`F_=9}afJ(a@kmHbHap#YP!Lw;%d(L*USsb%}6hf;U~mY%&)0S7JQWDK#D zp(tN|Pto(ctQg1+Kzxg)NOouOkct(v{PsSE3^mjq zP2+}$N6{3%rw2(Cu~CZTp>#%?ho-z9#dH*PudL6HXd$7<+>ws2X6BFWACoS_7+hM#5qfV10;v zv8tnRoO&50k7O^S#u`7_GV`m`EzY!fMB0++EM<{7DwJ|0HbH@`qchPU4Mmnnvm|5MN23L?@?}E(VQF z>Uw9f$DKU?0u0yuJ$e+Ez75l|?nJS#RNU%J)S%aC=b7eTZ?t)fx%DJ&sIP9sM1QVg z({6@Zt@j{`yO8K2>Hg&nt+=5l-9O#G2}miq*FCjhWnwUoZoWU>@?8)Uw1 zqsd?>&Y3<Tq^`C*C&yk=m;1iE%w|gRP zIJn@VpCPRt67|$}SA=On)ze-l@2E7o3QH;!d@5so&B7@KWFeS;YR-)>%HAm2M%E4< zK?+amC_rqj3sg0uenN4XAOZ%|PB62tDZF%sU7qsZNlhiZv1LZ;~)3 zE#ip5E;s7y=pLkmVyDNw#x8D@Q1xbkH{=T8q|UZGi6h=}=lTPGRvp7<6G#WAN0V|a zdG=}c3u=5VSQByf4So%|X19Psp1H_wfuxZpQtH>bYmZ)?ydc8tvd{^a&3~L1fwo}f z_NEE(A{$SJQZHAMu^4}FwA-qf>zZXcIjfnu!>BAz(wUd{DS zA#bywDd@HMb1Adh5lBu)nbBe&3hjYi*BKKhzr~hvH%0d@omx39YVD#ZUWSZOLNjG& z-c@{!k}BTb{XKi(hSGq@>^7IUi^3$NDWh;2(b^ObY2|<5eH0b}keZ2jqPq+Rd!vz-G+4*!aKDwbTh;~LU8PELP2I9xi5-}JjGdi`mY5G~yi zbkSJY_4R!fi^sRzSRsSIzq4ZEEzX~WXY(`(6e7cC{(v}t z_k+ztP5tpPg$#d4OmsfCY`eRn$Qiud-CvOmBgU~cUG0->1Pfe+cJ0IuHXkLv&yE97 z5z#&O{+@SOBzH%&MYp`(W0Bl#(PNpRf3dy?SLw68{}db%AAmRGLSvX0??OS(&-l&6 zmE$$agBz6`nb<}piYDeS$%yMP^ows>UZPLm)#C^x!@U+oAjI^3jh~2zUc?RfiG830 z-A8pL!u)+4+xi)W^ifszIG&VMPeo9=k`9g5F~0|J$c~@yX#5|4=`FSwPE%sQ&7va zldm{vztK^vg;&4;#{5qECrMDjZLq^K;Tl&q{~j?SEr6>76^jx4inn}DT>`wF!UFt` z3nPIZ4%{2@De4}smo-G@(0;xn>Ya+w5vh#+zNde``v+`TochstAu$tp51xU}-3a+- z8BZ%Vr{1%_$Go1rjJVu&4mnJyT<)M^# zI_V0DaKOJ15QhN#MLse<=cyG{#L&I@8sjnl!T0h&oJ>M2L}b>9vMuX^8ZDB=B^SP+ zH+y|&U@$(&6&RP+7PnnSwOVkESgznxaV9G@r{FO^J0vs91k|cDQYWeZyv5OdkyDb< z7cCo+@J~FXwRwdt)ef(P_*3@Z7Ek=Uf<{0|>%8$tkmW6bZV01C(hn(MI>_#m8SnPq zZox#t*Xac?gxw3p1rNZH4>{s3vIZMwttN_QhqcpEWdVyrE+DR6oE)`*mPt&#*yyo| zR!K2P8cp{Zo8~!tO2c*Xw&+x}BdJ(J*XonaAEFmyvT++}{*d-^DWip>?`6dGKM;~x zOp{U4&%Cj9Vwg9~Gp&lSC^1+Id_GP}qGgF@^8}h93cfgv+Y5)Z+i!JVIXj4(raDS? zts#;eBQ9c(hR5$B4L{Snu^SRi9h{%o!gMWutYNF=0c>cW2I|EF$e@N|-xMW3< zJVLomY|eHQU#Shg>G{cPa^N%iy2%hIZp_4x5U1A?BHehBVUi6|f}g6to|`yHQ$@n6 z#CW)>j-<5|P*)v@Ec12&lr=y1&bK4z72hh7etx~isU-eZh`Jow{448`h6}t#R84SK z{m5l^i`9Z*8@1s_Urt(Mt;HxBk!#PoS|J?qD=Mw3+loSv?;V9MIY%D3K%j|$aO2{? zK;07nrE-TPl54K{j3}f~@6+Rb?Zlj>;Wxp}uHeiS9S`y3v)^hIE2d1>ZK(tZB;gvz17wM65yRaYeV+4c`v0w}- zv7f11609n$2!EVroZL}B>BBXzs_J3Qfn@Gn;ww~rF+KM0M*EJot0Z9@GL1AdH`WrVem56e>opT>o0R7TB_FZ_RFqr@J@{5&_{6}$0a(Z|o@unDCCqn^sK?mo5= z(Z6tWFxwt5kL6eE3vvWT@H}t@f1YjfJm8~e77najYF8lXOPBac^hP~?^7&kV-BXuZaQgjrbnMWDN zQ*O0~b#l727&XPEO;K?NW5hk}E;?@V+F0P^q1ZlO&=LH!neC zB192foIoT(6h%`HJ%pTsrl2QHA*P@yWT`q4@aq8gg-l0ZNozMZLa!qj6aIDjB}qx%dg zaNrMLM7DuKI0#3tI$L~cS(2XQ&OD>%BlcWGN{886cwBsLd5M6LDG}Bf(o6>?o1rs0 zml6U>P26E(;=2Q6_RBbHtg+3X)y#US<8*v5t$J_cV)cMGVDd4MEw9D;JDgOc&zos% z17*G6@C7!u;)EAaLeMCu;!Ey3r0CW^TO1?;1F}%mQa#;BD;xu_A#=&P=^4@@*UXVw z6I31AUmXFP=PO`1|^GQ4UNdAh_K}Cw8z{tKK5o0 z&xCiHpvWMeq3&}DEMi`2VN&Vcnot0EzDR^iR*`e~7i936Q|Mkq+8}&Fyg^y*v5|Xc zy)sY(AL9Tqba=%E`NII2_^9$?g&Ci6#*B(97=_v!65L8l{y+mC#8yMPYY&SWlE6dB zmDpHqKh~B^W@eqEqOFed{&IOqiAxT7@atkb^+a3k)V4~0T)D8k)La63LF2IH6RsD^ zL7Jh-n7bD@0NdXrmjzljFql`21m#jrlnq_akQ4gMcB1kjvB&cz$L7f0#;Hzt@?6 zXV1Mfd2m5;I^|&~)>CF8NT3^J_n{-jqx=(zf=dVq2>$IS?2N^4^LO|vdu!%rF+fM= zE7T6rm~M!PjB~;ie;cc?Fn0+Za6wn*T{~z68+!(opONP=lJt&&sR$-K&~5ZKItGDr zt3XJ`kg5KYm(i*)E>w;d!k0r%dpCvha;oTg8UTP(yZWu zSl+ymk1fQV?7#Wu=R{QZob(=oo_P?J6(p7XT)G+qCp12yG32aX%d2V1u3n`&o2^`X zwK_VWJw}OAqlods2c{e9*w|k|C6;`hQzdjf*mng+F+;Ee{DQh2oe#6YnL!~nmj}gU zEd{(YkvPy0B1hH+MNudIpL(n2@|DlA8``1?G8z6i<;u@H*_n2=8mDhCBs~$i`l?43 zEbVgMimT-A)!OiE%8B9MgGHDb;@<`puhP)ydRg);ZmOS%Pw@a`X0WRUYYuI7Y|C1f ziuw&_RRN7p2gNHpkKoE)j4>MHC=igz>=6bJ+AW1Ewglips9U!KmKsHF6OSzTlpl!m zC^O0qX18R{1s%R*@p{#SAewz6BIDyP`!2!_t~a7G+cW9Swoh@G%w+k>)2re0=X}92 zzWHbD>rScJ`}oKjzt}ArLF2F=YdheGiZZ&hZ;W1(UDv?C!9vC!1MnH<(Rsy9)T)o)vZY~tS)fv zI~5Wgs4C3+)T^*xNSc%T&i#t4fo!gP=vYX0#w39H19=#dOuTcnpcE7wK)`TBCH8!; z2QJ$|=o~FU{3&F!8oy@g2Rzl7j4!iHVtAI}597!&)0E_JW)M_2W5o z6Mta3D z*A*sD8Rew=oCzXjx`|E@1va`FbJp|#zp$2cK7og-C}|SJ&pant`Gw>L1o#kwA%3-af)~FT4pWp7DtE_w%Me+LrKm0ZAySkCzW?AEKevck@2)jw!n0! zM&oLu6EoH>0=ti38F(>Jx*d>r6q7f;O{Hf(W1NFnGWn5YOi5Fm7K!vFO?L9|lw;pd z&+{L(ryd>ygc_P$BE@wax*py>Tfq{JKuUu8Y75tl!hW;IoZA0DW$F6XPKJou*4^FZ zhGvcs&mhW4jGnFnq})r!ILj~N-ywgdR>3}!Vf32MXsj#ppU9rm?&h54m_64>yo)EZ z%~_9xWYf!VSEZ|vv5migUS_X`YR*ve7*s@jcEV(9%3vrr{P%X*HE}b8mdMLenpYWV zX2ZtFe}XFQOCSdxWTq zD+IBd0$PauBrt~#LnB`x!Oep^B$=Og8I0Y4V^@v(HsVVUql{Fn=9!t#vY}xJ5@h7F zTaya}G)svlBy2Ks+6JYCQ&2*XU-{)`Vc%-E;0nxJ>W<)6wU1QvMigQB_iPa4*FwNz!<$sOQ0wd!$(WTv;mn#QD68yVGv-L|8jy&<)XSz4Sw#s z;-Ep=`uSumDuk3rMv+nV<7xs5KGWal<1|bC)c3p&wwA8}gH>^i9J5Stk?HX`h<|Z4 zia}~5C0hU+E}!=MI!&`$1*iD$C;C}#vdKyzXY&p+&u@6#iP`F~SjRzzmS>qbAQyXe ze_HCGT2Wd)qNgdScR^d3t8kh`;DK0Ji$e=rNR*$&E2z`XLUKsiyQ}eil?`l`SsZ1v zR@#9BCO{w({v;IZR>=Q{IFbXqZA|y%Tg)^Kop|sp8=m1t)^Wj5H~C#avGUd8J>N4T ztcpuH)t=o(PVl9RoYMKp7&lD5;dG8P|n) z%+rP&EU~ouzhm&&V1eSx4;wBF9qBqfDsVa3v=DH0MpH9ldrK0iHT%KeEGEFy6{~1T z>L+aSj@jRghj7&lMrVH$9B<^Cl&BrNEOOy3d-Z(?v&O8yrRt6LL>m`QyJDzHB-Qe7*oJUmXSW$dRqU;tzLsY;pofCzB#se;05y zLWs|Rha@K{U*>l;0-*mDU4|FQnBEI!3EW$p^a_MUIRRaOIcRqh!WuS7Q?I^1WlsMrx!W8LfSTH0gTSo#27u*1(E2X!OP~^XQ$0{>{*#4>OxdQRPf`9`14&qv;?_D6*UY9?@xz~EuSCu7YQ>NH zHb{}6Z}mBG@iYOwXI4RkQ7Iq5?6Oa4->exaJ)8w3RQ3w+P zzworm8uOR4_P8p&fghj6Z&^3aIS8tK=KJ_y=X+2FQvw15@u(&N#l<7$_j@LKKMxaM z*7CUnf@qit)u=n)3ku=G-Z~asJJ+4;v>~FYW@xBfL3>DCBNG`ol#M_=Ew+X&Kn^PF z%i7ccz9kqs27W{6kc4FpUF-Q^C-}sOkE2#b4&w5dwL%1;Y?`8EFzF?JP5@z;faR~k zTfKf4BB7z5!bb6NAfj$|Ryy6pFKskaoxy~*#`^`&mPgg|SFL`=08j8zoeJ2lkM*3- za^-3dJvW@{bmoR5qD?jdv4TI%GS0V_d8q{^smqsZCy(d6BWefd3HS#ZO^Wu=%zDO* zLbqdJ?+q+1P6}a%?(rGKB@X9a1G65yS^8aF2Y)-N7)O$|`7gkn&xp*=f6!2Cg*7ji$3^Ao?Z#B3>b$y=?j!`5_xg#IOv0gT4$Yxn<^BB7--H z;zaCNc%oWjA>rr~zu_x^7Qb5Z53f2^e{*%->Hi(%Gg}XZqI*`cjtw%K-H1*U6R@np zU1gZG7p|YV*&*J+r6!LyUejeG;z8UJgk?X$WLVg8!FZ$QKI|Li{y1N^`wm0x7e)V% z)W*hx90i4oO9TXpcohSGju&9?7bJ}CK80KQ9s}CQv0^>NV%_tv4 zc&D#T=a>EfJj`NfNBsA4mw9t@8vwX{?d*yo8Zt^?#ipj3BiP1j;mb@)^~QYt(g)n$ zE8$$c`g+eDhOaXg!N=Xh4-BU=coBP;0bQCAqOO~E&|@KbIK2jj4FG{f=+AFI?rahZ zTlm2jO5&(tqS2a?c6^A?gP#Su-#>kLdiwW&efjdu&$!DeG6tOx;Cg>Eo7AM6wt#>7 ziR__Po3JY^%&4!r7t=QcN6{@8Gu{m(#RT}4n*n2vpDoXOnQGk8i5TogoNHa~0$A(Z z@yEx~f2eud2lVLE-tuX6sPS->Q$*pemOuZ?%NGXue(aL@o?ix5!eyk6S<6=Y%DFW{ z7Hi4fTD^wdt_Yb@&1Kb`&vfaa@t3e$6Y#v3wBq8ojmVwpLy0)a0+Mi#eC4q~$?iFWRfugmLw=ewTCKcdF*) z;YH)_!iUbYUat8i?@AcFP86QGIU0KRf`sS1GtN+u6t-r|(D!6_hGhUMF?*7G+Ml@1 zYoyM&Ii|Asa1x;3!k|-*W8Slb=BcW zbE4Izy~8*lSRdf|)lHFMPDkn|yH&7b5% z=E%B_a#-?|QtwGWePJ!iOD?PCnzWZ)K8RFs?GyWj!2;WX3I4}%NDd0T6mGk=Ge?LT zkD2E*3HPO(BS!Xh+`49I*l`(v=5u@e;*q^#GX zfcgll2LBW1yQL4UzOPzCzJosQc~3GE{OtqBWikrD4GtS1 zX&7fzrz7i|C+2l8*IduRU*MgxT7C>q-K`z_kU0%JBEZi)_ncAW{*{%pe2)!xgI`v7 z)W#G6U|Xp20uP+l#6h;G!r9b$w!UZ-T&WL(;H6V_7*bg9w%s5-Nh0}kjvbc6!DivjQ&oAyqQlOJhVdh8WKbIwG|D?9 zBiKCD%r$k=bAg7WSC~g6xb6$xh;LmktA3K>X4@EdT5Plw`6N8&bf*Q3A@$WZ7+2G! z&!pCrv+*t4yj7k1A$j%Kf0P%6aV@a0qg7sML!0_!NJ^Guy=3oCfNu_X$QY_hos9?I zR9m7@0u)o*#miGZy*|b6yManx7Q3sQ1HptNYnb8`-5I1;7!dwmbda{+RZD*EK#Rcap-vW`Ir=QEFLyCwg=+v!G_}W+*1D$2604Dx1JxArsna&n{_RL(w8xG68Zo8{E zSHWAHnvDi!s1gR!4$YVZ*CAeAb)HXJ(`Q~RepKd@tmXRxtWj8j z-~#L+0e(rC!OEU|ovvA{rg>8jt|4-Pel6%?;!HXVBDj?8s^_K4*%CY6Gku~?^wop4 zOK!QKQ3XvLc!g~3vwh@134RPouw7}d$;DzWEt&A_we)L5WSf(|e)`q(tXIiibJC_; znhe+s&kn?SW%VxISVuGedT(5*mhFNZNz{zo`yC2owLmGn)NNqQS|ydVg~yl)R_)3eatZmEtkOy@ z$SLi!*9?q()D*lEl1gj`UD@gJ0ch0~b$76qs;iEn?DQa4p=%QN$Ac~QR$~<|6EY6t z*a&Wp3XU>GsTB*YtqzMBL*^!?ulWg|@>|jiakYl$199>DTZr&FAT>>sz1= zF1o61@v{$z<@IW?WXYN+={nWLPu1j(3nE_THGvl2+bd+vE{MNyC8}>dey^FH`@;LD zADCZ2+P{6qiTfMrx+a<0xVQp>0WtNfq=6*$Fs#H-{bH&bIOlyqoxq9B$haE$nc^)LrS9VeQ6Qz6;52U7;9*S*X^73aiHAAYDbE5BtOo`aAOKtOq&fs`O|eS7 z(PJK}7{*-G0O$2Je%jR?5CQFmweu_i#WA;u$`ykdaq&>dj-7FR!Hqiu;BxGPc8RC{ zmmJ6T`kJgIV@P|;$=1opW3HM{L&Vmw-AAd6+tV%s)~u#!RIQXWH2s2ib_j53wN~9I zI*g76xM(@&)YS{0xDxZL@9;VP`-Hb%@Q@z6WZO=37pryo_opF@N$+6NHvs^j zK11CU0WEyiKKJ~Z61;xZ#ZH#zzW|^FMN6bRj90OV1=Fc^{ZTr>GjVp9=K2+uXq=B_ z!%$5hjz~(euA-r;b~<(IpcmDxSovrd)-q7}x={{YoKMMuSW*V*<25(;>ec+us)OAX zhYzxf-MR!z$RhH|57P@#wXJ?=>)!ez>!j`Ca7CsZ9YNZCWr3_3UB9S|z^xyUZ|<&} z>ZA-=H)3(Ov%x{+IEoqONE2uRP+U>Jgmr7ZAKEK27(5s$R)4>;HyPEyFxi^b&n`ieVrBQDR$L zab00|j_Ul$REDkyq?=0Phq@D_+A8A)){g4+mtd;B#o%ITC^(BsYKZGLV(_>{MUm6- zo3XKzUs6}SW}TjP6M7dN$f2txrA@PLt^F8A z6Pv_7z*<()V4a>nU`gp^wU1nvv9oh5T#Tf0=55`2=|L#&WC?6wwDNV44NyusgpAkLk52V#-RZ0PmAO^y zF|O6#j~CjDX-OUCo=#{FuTrfJ>j`v&~zkOElX$^-5c0OIo!t z6n%2hPy%7DF^MN*NXu`cN@e6wjq$!?ZDhG52FbxzDN?Wik6!^cdy%IP>yZbG8W6Hz zqte1>e2$uiY-G!6S$FJM({f(onAS}FR}Mr@J^4f?2u%AJHS|Mz_+Sy z>7_7IR=Gt(e<(cst8xMbGJ)9546b?CRcDQRD;4pX#G*MZRHkptMTgS#CO%l9%Qip1 zE@J6&S@2!fyR@p4Ev+>#p){ioYypoH4IA&~o&NNTC6iO#duKnb_Qg`&au~F<*>Pho zMQ=4m{5EE|tjB1#WU)JcW+gmb{_rT4qKi{kpRV;Vb~AWITzuLv-1@biCTA5`Q^Y_r zD&qxCneBF2U{)v3R_Cu)s3(cgH1Ue^H1dUEv0iwghGx;R07<#9o@jZ5<5=tDD?3#- zA7F%R5)JV%47Ofb0AmGduea|oVz|+&20F(8H)gk z&|iB3OkbKTYSJLGfg6i59Y*QA#)?p)_FMv0_vzGO$AL2%i){--t)D-hxCZF~U!#N$ zK@6KBvEb}N%EyXm>aXiCb9L(QugBRLdRABH?^s7)S=d@j6RbfV2%*lUnqIgt<;HrV z=5&l;v9p=clbPK%ng$!PrnZ7-B}CiaydlI~pE17b&T87Is|Nz)Rvyh6)gz)Sj>2ZF zwpPQK4o0bzcq*nwpt7LQl(nz1<9>p_f5LMbuWRhPm_g~tSf)DLl-6BOko_%P!ru2z zwRW7*63;i+Kdk;)K`n%&mhPPP+b!5klWv8%GL>h9%?sBwx5w7jjmZ&>bJ zdxv$jv}QmrU+kq``(svvw~pbi1~*rJtPbb;&5_A;5luli@j{G9-|4lupI(f)u{4W} z!uyt<5kj7)xK37$#MmlwsC$CrML9Rcj2HfIr}}}ldCS_5wfUV!xyY!`Pg*pv0*0h{ zV}-Sc(esWmPqtPX^7i*re28k@1h5E5Nhj!MjR_eqr?sPMr>#I;sM=o-v58z~N>b%M zsYjK&>1JL%?WOX3IafLDC8~Gslz!Rp?XVM7@T-l4!4jO=#$+EUhc)8@J59Cxjb&i{ zQqS*W&@fdH!^SMKm(pr_&Yd~4l|1lu{1-Jn*Mdj(NQ0(^9{|VO>6S5c=^s=ZsBnNMXTm_JsbXcanE5YJr+mUMRJ+-V9jN}vX1}J z(++}rWHv3SEZSf;0_zI{2ubN;_@UHf+ZrBPAdkuhj=6{E2!E_w0?d*Yz&MKKs|%#P zwXA;9h}N|99-!^DmnAxjlD#s3T4rMR&4<#xkR31!oCce+vM3x5gswC$$Xx@=xF7SC0yE?)cecCr#M1^w36f53OQQ)~kP*QL93B+1p4 zJ>nh+tI}QnIZfWlK?bQSY}K(0l?uVqQI}eEd^OL0tWLkO%U-7oSG7rlQ|fg4Vb62^ z6LtCn?6%bDJF``hr$ST!sl3U6+pM5XmrIo%8f5B$|7gowTOz4QR#B=06JGAfO^1BH zn^N)Nio?!37%a+}cN&+2rn1uS#8GOFI#Pp*Gmr)Q{qd#)5QKR2_+^I(23(If{J3nmw?mu0le|MwRLyf*gJfQj)8$JJTt`)eJ~tPBtUg~HSbj89uJ+Mn-0aUO)_uxeolmTr75a{Q;jvH|5y(NzZKTWa9nyzm zNoCipBK`RBy8OlhiK^D+2hCNqflT2Zk`SZp!DrT-5^Lc4Mp1MBX#(VCBO<< zhFH-H=RR0Mh+~*4b*5L%d21bxJIG_AK2O&_ynn{sBDN#EPuOwqI%NS68nUAfx8rjA zkey(xMlb!eK4+h%b2e$`ENaIXVQT!lSQ;<)O$!e`Z?~VtWrHn}v*vmGb~4VXt0`mH$?S=IiW zP7C*%pEB`!`$~hs1vaVQst$a>avQHMiOL5(I`oNVtNj@tj@D!m&^Te#l}$;Fq4ux} zPtCHy*#M=QgoIc@a##D6gvgC}MLR$;&^v=Pqb1<8`&mxudyAAD4W^di`-zEt{R1z# zgC(R%Mg)Z4A*~9N_&o^$HoTi9)-E4>E~?7w>HW#NA)KK>#kepn$6kbocMLzIdL+>1 zcXgVjCm(gKk{zNyaA|L*SqR3oyNN=fTJnHjfefI~L9w@4znF4$cJ18)YWV02>vTUP zI7CPNPV@cQ_VR3`b-s_?!=dB53I7r0+C7kKY?W*wkw3To!H!##Q|2Cmvnywp$g_sO zoa`_9sAb~cK`Cr=&ax%g#4-00kn1pFv+<+d^aIJ4*YEN5&SMp~p{zFfpR_3#HA16W zG5(>w#S42g;(Y2;U*W%h&Gi2ywd)-KvjC^&!jl9`L&jOA!DSqm8 zp3%JIhY#Ha8^*q0z%g!j^FN~PsXJlo&k*f<{p?6vS9xLSQz$pIodZX?`Ck7j3y2A- zbzCAT&B|s$Wxg}#U&@c!LMH&`$#2?0aKb>|H09YYg0Z%vuqWL}XUvu-brpThdkK)A zmi~pnMDK#T2~K#1EvbXCv!h|)z#^s2pi(xymw`+Hv3S%t%u7-2@WkE`UyhtTbu{+Y z6M8(GPU&xDJ^k0{YCt}$CARms^FCKG=CBQV5*`i%=~$2Dbf3U?UBHhil$V z(#46(a%kmXAjou=Av0)Oz0H(0&pNL*fUJzGLB{xq>pQNQ=d-EE?^kL|pV!a1TfYl1 zVxDJTi2$Afb>|ajUihv5i(Q0}EB7&(It`C~kvrtS#7X_Z?mU1oxJGU{*@hv zwB1WUo$HqOE)D>Ae$}l2c3xY%5h#0@wf{gp@Pg%m+P{GBn7vzV|7F`nh1X*Q?KI@K zyPG(M2=LRX-%u|XvCTc zlTy%&$4cN&wiB94iVb|*PS7o9wcYunx(3VT$_7D&8>g&3S)YfB>^^C2Y2zpP3vY0?SKGtiCGmGpSy{hTEDy4js{cEp8b)#= zs;Z}2^@pCo6;bJjthV+-Zc1IvF^dLE2VoAeT5V$J_5H+NpWvz3?Ts_rehCiSYfH>^ z-UlGw61D9%0c4JB{@Qk|mP+0kgU?;~fo#g}K^-`i2Ve7h{u}YcDtPPT%6uSz&LQ2M z=oBOd*4*f{-pE+e8W&90v6i<85&)DoTqlv8rw}rDmRC z!n^DDm06ga*G7uLloLi;m(L#B{seN|=@vH0X!=H{-roDZvlZdOA;uRQ@||i@JizFh zb1Diq|3m2?%;(xgHex5*<0Nv6H}$E1_1<^fr@z>cP5^fHp^Tutg2Q0~68E$z7zv(# zpkMk6`mD44K3z+kzkBjdL0}z>1Z=eRb{_%W+Rmw=Nkbs0_!^&CY-n_%pDe(Wq~Zb^ zuV-C7`v9>ITi|oX>sf6_?X!VOt3=Yks@n0+S{LazA*L^G?>R>$4K^s*7G(C(wZ7v{ zEP$c`fmHJ1M^|pj$GFpkvhwE*o^929jR$M!im@U-ZvY9ZQ zUi~5_u(M(w&&qe}DK=6pisxDkm3ZL;&-s*J!?oKnEg3i0lYQW&j7Z4zk>%j4k?HI# z5UcUxte(`Ds|gYeU-(^eOqE39=zdA*tFlFvJ>9WovwFyu1~x55G_Odx{%FrY$=7yX4R0e7)q;RayeFwXeIWr|d&%y44w*YC2PJ4L%>Z$Dz;ncLQ z2ub5gzuT;6liFCMB;9B&Eh+RTIVKb=QL^5xtl3G@K`*_`}RT>)TD5^{7o#j zcVr+VX-AT2(<5Rl>W73<|2zvm`vB_W=l$;{sSh6C0!5p-x5XizIF($R7+fRx1S81j zkrz31eXs>qSa{UDk);Fzn!cRP1mG2~SYU|3%tMbHgWjY%{=x`PMFzj>cRF26)`#tU zgqCKxQ0k<8TrNYVlt438jC5QECGp@_X~iDRh6Sg7=$~o9>K2k3x&GNsV$u^EBPJyQ zqd(PWGK<2=X%pY;F86We;0H0(rLWrPeCsiqn|E)i_V`y%t)}VrQFqK=`)s+veT(8J z<1pCI45i4R);3;URrbia^lG2fFpV?j(cLz^5SHSnYPjzCFs{t=)&j#DqZ6Y9>u@sl z*%Hj`0tKy;z*aO&@@T7wr99$HTCelTA?5-^p_*50gJc8)<81cS) z`+?N5pEjQ|19mTZd&~NGYeR_R0s+^Q+-Bxa<@qm87L+*ZUU^i;1p}iUvm3sL2xRr~ zYDKtUyJi@PZq+p2-*B9SGgZjo+*%*=UiM^ORAQw*hQ4}T{4)G~&vY~w6@HKbtV%#T z(=j>0`!Y3M1o?2sb(xdd>}_H@pKf2+c(5Jy;CB%=3l|f!$U zdWKQcPEbL4;xO~R;-L}*A<$h)ymH>h9<4G@t?tO0kH)T)%dtWSS##z(g0-iWl0&pS%B$&=7Bc;ho7w~ABRg-w{*z!#J<2d;^wBM9 zHFaB;doXiR=8rrFeXX^~WWKDe-&VG2+RO!aJ27s%g_K-6*;_j=y{ayYGwyK*+Vk$Z zhh0GLC}U=u2-BqHP*EKOu0QRR*PoWkSoglv*O!)n#Y=^~jVrQ%D>Eo|kX7K{*xp@) zTxJ2M88Yq9h&o~jtxi=o9&CcveEjoW@b%jJernCGK4T{qa}Dcje8&{c|3yt@v*g{f ztZ!xV3?$=KW;UE9H&)8I6?eQ}ubXo#_qzG2RbC%3WL`S&JGNa&p5t^Bqc;kR;CU)9 z8)-oMO1O00p$Yp2Ka%}XJt-JPd)dOMFxx%qf6?cO=(7xMup$3?>cmqayU8*$`9I)s zcS_g)7usR*DmK@qAu(5W8>lQj>g>HF?1FgBe8C7P0lkJO^qt6pUumFA?}=CO%f63Y zS#kI!k-;h*&Br34oxM`@tY@$WQ!N<}Aa?5!F8d%*RseN7PR{5(LH5F`j>wwVTG~#V zB`d5*x@1HNnM{4EZ%dW`+c;N__0%JNYcuDq?=lCM=K4j0D>HU}z>J~QOzFR@QS^MW zA&IRn^vu3db6fQ6nxK*(0K9p^lX{q9i0Tvuu%QpDGmrCMw}q&BL;u5V%?eQ6F_Km@ zEi&m6!R{zSVI!+qCajkBzQeWgJP4fu?+(PbhU1XMVYI5f@jmSYWka))civRk>Tp_jc233}S;$XtzEd*JSI(*_BXOY;=f(G`+rh}> z3X`2BAJklhF=S!Fi7#KHc?;K7gCFlIQ zc3s=O>NP6-hi2Gj&7@;F{-!8*#}hzNg7y!)PGxG9v}!$Grz_3ISl?FUUpvcA^8#>D zR@|>T$PB<(I~a+TqKyWb67KWt6W)J(`X5%4SImRa-ju^UJku6-;v!@U{XEsq3t;o6 zy{gFV`D1!U$LuRQm#d|m%2R$((ux6^s#=S`^TyW9K2ck}HZ3)k#87>j7I zYSNTqJ`LaJ;^PI}DR-hvfKF+?mq$>2y^gC9?)dN9aJN3~k zHte&T=ihPdYmJ%5`isI3TW2C?mHdfY`a^!4SHbBkF{)CE11K1>Ql=HO6)a^TZj z_CaO+C;~igx&W)*XkTgR>l}UHni0ix$&@EFRa8P7)AZSFihsBMnD)Jl71;;0y6DEo zcT@FH6fgnX?C6zeTTQmw&jYh{w-@C1v==*!{DO7%kcv!dZ5H))vk*!qYW>xYli8!v zuZppN5aN0M<5cZe+h7*jd&Sa7UHu=PtL5&o1PT+A>g3^1s`J13wLk!qnNew=qkc{< ztTXm91ymia`uRV^hORKUjl?7jhNF4Dv=*8^5n|>r?cNpdk#rr_x*u}g%TCS=UzZH$ zC?esx$oPx+ax(P9lX|q%={gpyzt;RKqQQ`*;_tRKH2BAT)en8nv-f20a+1LIF7t+Y z&yvij>ipdl2AeM|somXD zM69c|g5?6qS2q9t)MxPn#+MxqOGSi)^LP_abxDOf+B$z{hH{+A=e^B_>3$|ZV9qFG z-Q8S%BRJ%-=C<;blV8?eK+UNB<|(>`us!wyIQ40J!ttJ;Esv;-OzMdHJfB}t8`k*9 zD~_vHgqQBy{`QWUy{DMa|6hjtJ42@$rE74AS2PfN9nFM2 zuBRvU0%!Jm`T<@>WatMD#$}EA3w+Nzi1?Ip;Xq!9bNA>^j8)-3_?`(Q$Y|@V@f~|@iKc9oC6|po(Q_n`n1uKnz{wF?tKKe9Vd3cPk%6H1Ea9qEKT%Au% z4zWHu1`pxjEdzEmJ(4_X9gwM#|cm2Y4^xjnl<@yR!2qxDuuEPl!ktN_9Z2`9owC zBS0nxWnQnR`mlawWk~Phe?&>aBwG61$QEXOVhfESQ)vN>A*hmrq12r(G*pD!^@$%h zc~Ym*&!YuCO*$3iN3>eb!mCEs6w9Vn#aHxN@8x3k5zPI@SocMp5cWBlk}8zS!#)yX2%5vt1@~9 z+>Zx8bX+K1Lr^@7fv>7Ge$Uv4U*cExL-8)Z=d0P!Sz@qdmK_z{rNppSfwp0Ki!TM4 z!SRo+77C`CyfL*|Q9a78l3y~#HN8@FRfLYx-U{Hw2QK7j99I!v%8^SvBFKanaP+zO z!)xh8{+%kE^aptbbE%3;GnljWk&vL*8QjMHgrtdYB9CT+-9~RR`en`|tSmiJ`g6 z3(HZz%(6+tVrW5`NZL^0C#uyJl>O|x-SnSGe~0}G|I<1a4R1&nLf&>S;^(-wn&}CJ z;a9AeoB`3(7523Z_UT&i{`8uJ51Xm?>i2yaij2gI#O1wR58nI!6GG(~H+nup_#`Rz zC>mu2{hatM|H5jI+Z>}R(Bk!0R0F@s(R-|SF0L0G@72X+E$@OH#eVcVPKfmSpCGRcS>`k5%h{ zHnz^_82PEI4{wydROnA<+WZ4jWOfi4|39Gn!eZL&+Q^Pw2Sj{aF0Xdn))THIZT;I% z@JBpUnG1uZYY*%%J&KJ!hq{&Oys;MKcRYuMa`(sq>wv z6tr)|(A2t<=lYutyuZQgf@5f9$X&I|d40;)*2ltF>I{NE)$$cc&ID^;W82km=@*|> z{I;DdZ{KZX14ImjywQOIS5Tqgp@A+a{ECppZ@?;EIensz>?h1Q(q?&np5+|QERKzF z;?s-U#`6Y|utYOs#^ES`;@aFW!Bao*^+1s8v!B70J-0q}GYr*_R}zYcI(c`1+q5Bx z85yOg7h4086cUbEJVib{W6!36qnE+hN?&GPAfKkF5XB6m+nn~8&lb)#DH_VbdKk8u zT;Df)50sRe!4$}9Zz)6Co7L=|OAj4d_u@iouEo*3n8lTfB>yauN(}5@Snql1Ufk;r zSBtPk5Mo z$-QSz`8m*M^HC04@|>~t^)%l=cvshG{!jk)<1PIw>|mLGC? zncJjPzRj>S0P^b@Vm;Sj?LjOZ2=j`;cFHm~dnYcC6Hm<(fsR1|MhW-=JPSLngTFVu zR*`3YA9-$xCqz$MMSX*>zPx?JM|B-8@zPW&ZX#9BVFOSK(3KGF#t<^@THnF$s2yDg z>`@RyXV<|HUNW^+iBzwWZ+x*q#vkjYFBbi$Z@=_hH+D|Ivn8vJ@A*n%SOk02rDn^i zX@*B=0q}}<4s`&kLsYC+Sj^U}xiBMes)1Dj@9Y;Tm#h30LG|TA5?YBDeO8!jfBMF9ccy*Np#pUW0ew z@_KY2V6vUSVi5*SKhuW#v=Q!~DD{QT+aEO-)+ehoEWUH^-n>4m3w0H2VM1sq=-qM> zBO)jThy?=>ktUQH!}d`W#zVy_AF17iJ3M)gf@tLe)eW*5tFsSm`;e7yp$7#P=FHYL z#cvS&K0t5GqOoK3QgVQ{_8p8*79mn*R5E_xFYdh)A69XuPRTh%r;%6KP73a&4V&8O zls1K&YxLtLIO+O-&`BxSF2F7X-mZ#GEbK#++~K+pajV}=FXE(R7Zv!?9B^xbiIbdQ z`$KgWlIa!p&i|leepc&dXk6Jea!2a<1-~=<1{bEVXzri|k1K|1&8kNWjto+k_cAUd2V#qM#$Ix#o<{N2)b2p{m29lc0fK4i zy~pjzEhJI5#2Z3x{(6)vIp%9T#VpdAMAw3S*k7#IQCNCN6d|qS`v|Q+V41z&abcSj zXOZTXXqp_kAA>!}A932d-5)QEDZxYEs|?G^#6#x8vl3f)|hfyWk8!=$xV(+37-2UVKQ^cP}o2h zJwEKUP-ocDH!1OpSF-Dy+*u4|&PXX8uy?Yx7GiUYQEtA4m|S4}lQOyVPK6=>%LnF~ zqoTNz?$kp$#)4tS`eJV&nOCxxQX;`kFXbNN)K58T-B1SBdk#C)INn#e!DV)d-pbFi zuF0>Qw(u@CjBnGW;`>*5I0E~foe9b4vjEK&3yJ-Zh1VK-$t{n)mK*uN>Px@nL_V^9 zMMHqz*9f)eQf4W(gTq+HYAo*OU3-JuKE~-`vGQ6u&5WZQC2CJ`5IX zSP=5elm#YQG57{PIT+0Z#b!+Iee3tM_^$BYk3q)_yb7*jHh9EU`!ToZVEPvD4hZwU z&fxjn7sQNk>dO>_MQYxgIU}~aTtbrVtY{Ns6RO1rr3#R?zepMpFjBll-^>X!(;?f= zcSk_DV2(4&fzKN?3$&qlyYB^O+QOj&AU{|8tM|V6&e&6*rbzV?pJy!5`M6fT;~K4+ zg8{%sGnVG=`*%CNnsJjXV)?(ZO7Gk}-&w2fh@oiZH>Ghi+`GF}l_&l$RvT=ct8-1< z7h@CLS@+Suc}V-wz_~U6W9LhotoO-$r)>6cr_7bVLm=wo+^IXNsH38ji~4;tf2+zb z?-UsQoX6}E)aU)2dxY82IiO687I%}4G#kqrdcBM0T86@i8yVcmSz+SqMZ>hd?Cs#k zFir-#SCxgjNb;#XhpyY9Wuork18cu8I=l8!r?C493kt%%);GI>fJ(-8$`G1<;L>ZZ4$(~ z(T6*0j!F$~z6djC*=o#a_xFfS-O+FKar59dGXCcYLo^T-e%q9}3 z5tXv5&rDHQB6b5&vxbPd)Ih|qEzzpysgT=1DAy;dNS%Z`Ud12#vs84)!Pt1E+P$tvI2ODxDBxL2FTj zztnYH`z5rsxCgp)oC;36GwFn`;L6QG6_bzy0!+_(PP!?Qp!jONn>WnMTHSHgZAyeE zyIap&8DOmqRbd(&d>q}Tox*b-5;&JGli^~src@hmmMS;Do%QTpCL%C>XQRmyo>|ue zvV9SaruKG|FLfPfjfhh$V@^q8Cz!fS(bfL2V3dH$SpYG&Ddq8`aHd=pQt8#z^TjzQ zT{=sN?4)D-W&C+QMI?~zRhu-YU{U}Teqm23<3#V)w2smvxEQ*09?LDV>?rL_uHftE zl6QRX(M?KhkDbes@a|7$5k7j2jecB;&Bo3Wge?IZb_zWhHAGt8NxFy}z@(@a6u0O% z&wHr$cG*FyGDLVq%YdG6#nPf!b&wqDHBD2H1@MumGX`JC)w1TVk}KC%=jc|j6=v}o zFn8vqvCGe7s{1xi9it*y6ZXw>O%`7nT z8t%c$p3xP56SK~5F^7Ut27k+0=2+wH1c|g?z>qR9r;K|}cx3O(b6ke2KXQ_beBJs) zi@O&Neam}rYFlnoTDC7#DrJ^zT=WD`GrdM3>Fr`x4&d*I$#I-AlvtG(| z0q-N{y$og0t5{ldYnza#Y45y_)jkE{@n++f9@TZ41n(gF zgq~vSs2sRb+lScWKXrI0CxD&(lBr4AtM->;*9ogyJz)oOfrNnL`pi1|o$e!hWw~ zIYvZtL+oq|6i})gcUF<3A zn%&-=-X(B-hRh(m$9paTu@nW8%xrSeaUteW226ff`z_HaUF2x2_OKke#3O=qPFUoa zm=e*v-won2?+k3$3}&Pmw}6A(V<@vRy&wvTmvZYq3)@S-_}1_C-1UK^;oePgZNFdl zfr4ulg&5f}521b!>NWA1VJ0(x!28}ZQ7%?x zbJZCYK5C13^JU&6pzu;w0wy&1@v6ldBkcJo<*qgFm4M?IsbVjI?VdUD-5>ryl&~-+ zUbL|t+fi_4UHBzO7M~cm{?CW@$<(uN2M-Tf0x#y%>&%yYBf8*zR&wfcys`!0s zpHKkZL}!*YY@o@Q|98F?^JsRO45X;%wG^tS$PCCs*RsYE+z}&z(~FPt z9!-!Tc0-7d1ykLBpxWUFU}0&%e}>Ea=%jlka%KRh!a;JORfhigrC!u~^7G3)Jt{p8 z=-Oly7WqP59=Zpb__iZDu$nc*7vgKC*tLiM6YynTH`RHbqpOecNMqa}0e*=>)XN58Y3M+OR~+Jbm5nihn5 zh@PpN$+Ns)A)8@^f?!0uzU@;8QXW1-XXEl!Qv80rHU^Wjs&%m95^8WiRTj29_b4WA z;t8@yEU@$ZSdi;7j-w$uXH=w0_j*oDVWIVFq z(rF;}9nNb06J-%5g9uRkh5Jp)-dEFreSBp7dY97?MF9CDjA#M^-_6|W1z+b}Lnjn* zCdp33UK(M$_Bo{jgFqs{y1HPpq)y?Zf)EAcF}DE?W)v1hNmU)SQ*GT&lrNB3$b5Sp znU(NV88?-#C77?AOT@zPY%eXI_Yk%dZBd)jM&UCf`a2HBCTZ^qi!Gpp&X%DyyL^5$bWB#HAVS9K z&VT?XbtSfj?5R96**Hg@9a2-2dL>3^44AU(2BEoMnaUoZ^D zF7|vf94tEFCFXEqI58*{xUoh|iAb#Uf07)5dAm&ddI}ZO| zu+Wy-u`2r9===uIKWz0F}8trA&~@VrBhNR$aMKt$w4RwOg?QQnSA22;A` zP@fAY08(Vdc*K1AnMKS+Ugeyl1?A8jrFSVYX^!oJgUo10@NTmnz#)wEr|5GkIy4mK z(QZG1;u+j?upwSM?Sx3Mm|IU8k%=q8P&~z?3nu#3V8DtgZHNp=a^Yv$Hotzgy&?L6 zMRRFSCZ+2R7IcLrHoRfL_!Bd7mYx+}!58^pWkDV&0$C*k@)Xz^PeiW4fN(cdGX@8r zVDy0TC$#|hCf*`LC>@jaq~4-uH)8<*MxXjRdNQUTBh^4448o`NGtYaO>lS)Y&v1Aa zu4#o=tQ1ZI6M;%-<7an*U1H(ac6$)y)V{Q9iz!; zJog4aCkreV4rl`+PsM>SNZ%5SeZcp46^vA#Z-=n=Wr4_l^1cy1)3##tm`_PUi*GLs zA7U!mmGae);s@ug*}@pruVt%D-Sqo7oZinc!yy}N)z6`$~HSzoP7X@BKj8)_C-79I#z7?~V%fx-7n+`$Uw zjZ!Jl2;YP%1SVAExj8$iei0{v`qL6BGP1)S7kPEoB`%uS$nOL&LkrjB&jMg#qj6@~ z$=tF$N5XZdT7F1wn>oq$Y0ZPUiq-~cIf{V={+R1-@5=YZVe61D8NgJh^QIDX&Gci~Md~JMKtHP_Ggc~qTunI`0_+2xwPH-g z4$mLO#z@bC#k7_JM#u*5{M%1B!AmH>n#eY~8WntC+$l}UBPx|=QY6svjy^x}gEX8nGrK9L z!#2waIWY{5?vGlEn)jm^G+z!fzqE!iQF)=;^?$ z@qy25jgd+=2J6FT36Hwn##Bg4OPPFxk?RI<{7hdW*4l)huneK#={w;{Zi;+FeQ}Er zP#^!B^4n)1o&8a^Z7BQ7vyVbW7b3-cTpJYk=+aTg48WLSB zOOx3h^#j0xj4bh7;S`&<8na{`wLYPh;kj8gmcR?_e$SabxvUpVjI6j15QH&Vzd?gS zOH9F0;kX7*nQ?J6t0J#+Jx6TGX_OUZ1~Xf--GU5Xvaq~p3J}S*F;H!)&)TRr{FBua z(;KyDwpQmZ5S>RF%E4r%MwSxmV&wcWUx?A){4;j{r?mWSosrdRgNVVS&h)IiVtf5q zHEA@flM7~D!tS9$ysAR2Thr-Gc<@20mLHHM*dbk1TDZdQa9b<%MWeJoYIV+{xNJb< z*VoMg>(Y4*hF>-lD>i1<@72m;|1Lp!CiEJZn8zF}4V2|HcIqA2&y&Vj)b#AC)&@3{ z9-3Vc8e71+ejvxv$bggop_d>nFP4YZuw(Mqkc7miZ}nAtPccbivIFF2!MIj_QG}WE zWMx`ecH2St4ya~K#ri}95f9;^BcQX5uo`6ID;XB4ha>+4A6&~e#ToGE_<~@*P z<~%Mm;F~g^dam8^90lhLcp@?OUJQO_UB*o|ME0VuDJ23N_X!{a=+GfP8@t7H#l%Pg zf%UaCt@T2FQMxsUE`#9(X5gkYtr|r~bb}RIhBcuG5iUU`csf7_E4V3H{N`Z0no^ed z`U}kMS`34CGW&RUiv&8@;$)9&zDsrbt#w$D-U$99LWJ2SPG(5>v5!9_PG&7$cXq$c z`w_-H6Oa_N%t*G)HHmtkmq5{(ml&_0g6Td3yb>!u^9t~ZFWTyyqGV2<7~6>%hSGe+ zedx_K4v7XzT*ILY;kE7#Xn?$gYOwLEN>@rOY4?!_>rlrjS5y^S8JhV)E`tcW_y*;; z6lr`@LSA!}GQDsd(CXTu*kzgS2)yFWK_o_m_Zyr!hD(#>9 z;$qK;x*57R0yb_|l&7yUqSXC)vFYG&Acri!9KUM7Y0kNJ?v)uQuNwcedP*;|cy2SN zihvDpqQK?Bl4#3nFhg4w#KXbxz9d(T+2zQ+J30TaXK?tm5_5ImyTge72&&kT;16dZ zr~@<&RpDblozdm~-YTm$uN%8q)OQgxc_^jE*q#4~h;%ytiOn!+lFe`6#LJ}U;dBuu zerj;tClp76{)bdkruDuF*Rt)2syi>Q5Dq&-BT5;g)LL;-+cGye;H#dDvz)h@yw!Zs zk$|-Zx3g|XY$BURWdE?uDb-$gWsSn><&yy9}ezd#j5Pw zWC~y5f9Qb(kDL+GgN?3agqs6?Ouis6Z9Id`uBRo{J%V+QZ8`H|a0|38KN))6a0~P_ z*u}db2X>L-Sznb{8FB=@6n=Sa(<{ZQT5DA;`4@xDGzd5_?f><>FH!aV+?ijG#NAd$U z=4-@gRsBx4Av*|0;Ha)WEO27kKQYvryj*Qa7qLcV%4pIpxT5kj$+T(vdcI zl2NEjU~=5Lc)?Zg)o4+r<_zdYUGVqNFS7=!ocOwv3l+t~w87FCQ}&QlJ@ew|=N9jn zK`<`UGSyr83O_dfN@x}NR4KUZ|r<>5!djzlBwj?f;ji~K@S zl5vR0m4um~AxRo+GXs1(ylGVDdxFZdXkS_5mK!S(0ZRU!eo&pNtSM ze0igYaWV0KnY6LeZpPWZi$!rZx;8K3Ge$D2>F=^9b2>aRMD9g#6Z$5FB22S*eg&|l zYr}W=s<}#+`>>Pf--vaK%y07**48xi7>%4^%5Dsh8O$zeX|bYX-SlygGs{M-3+k2S zU9>R7j2ZaKNcWWmi10zsgFo=Y1v71F?~+&bujkIb!^CtS{p>Z5kgxle9Mh05cs>mlV6ZWQR1n&`KI5)+%V$9Nm{s2#0IlERt#qbp^GXi?1Yq< z7`NJ7&MIp#NU#T-QmCNWPwz23oV7@$1TIeEz_rmf?iq+_ifqh?#Z51>b7oAf`fGiZ zK$kt9Umzl!Wfs_wOEQ|$c2-S>4UG?|3@EROZyBNFr_tw(z$MgK(ujBi%NiMQrX^#m2S zLF1OkB}ob1$dc$DlV$h@{k5M{0*OIt@(RY;f)eju`3bC#@(6+^RF6-UmibHiO@4t_ zNRprP)%dPH`$k=P*SmOSFtno%^yKGLW*`Oo`9=z1Sa_Qn*!v7I2|2$qxb&U$?Vj6} zj=c7Mh?#ln#&@^u{4elkpH!@_qjwYsfkvso8Zgohi7E2qf@sbK;y#kQY+$EVgD5ds zJLf8XvFF)lXqFMsd((fdn`2S-+KW9`p*A22ijB$VL1?Bk{#22cS=8#nCD!J?p4>mC zJ6+7~243dq@|r8V(-90P2WfL${$zArc-8m}e#1v**>+{RJn0vb|K6E2im0) z1>;NWfsI}aa{j^O)-f`VdI9rX;zXvCksIlRTfzY=e>z^2@CI)B`f`T$55UOGkc`fM z*5OLuKXD{hQbyr6d$d(S3vo8A_({(zmKxLj-uo@)>u3Ga7Fl0HUR%8i1cc+=7ARS@ zLCCISsX18TMEEl}=;0h10a-k~Q(edepC7QXnk(epfA92B%UBJWWi_AQe!TJn(2Ip( zd|}CS82lWFT{aPefpe8v&h9^Y_9YMCz6ZCfH}eDC|HJq2Pd|~psb7J2T4gTVf+5ol zC>@3rnzfccfDCyObFnkdtn^Hoe}3Zqi9P;)|HP*mqdG6Sfbrg@pJHQX{B~BZqRey!h59X0Ie|S$Eft zJu~nt_9fcYPwV#{$r%M?qD$BM`GKO(S?nr(w`A^VVx$Z-mBBgTIQB>MTo_5m(nD!R z%Xc|hIHk(QOK?Lz$4VmbOj?a0CIsmT1%2}>%pu6tU zn(#ZI_D0(HA#E(>N8N?JYrkC4oywJSN6WPrj}6A3u0TjHFrXMl7F0lx>!+7n4%?sS za_MXMld$4H|K>tfcKKKS&gZvetWf02Y6yPzfX|C%A?6z-+Oz^FE1H{nXW)6ab3)}= zNIfrVN5%u*a7hBXJ0KKzsJFTGS#)%k5Ny`E7uT$4amdaFJ#Zq!03!v>b(K(ZVzrm( zgUY*xl#nYr`&cnC&h|L5qR_d=U(+I?Ilwb9rfpxy%{VHMp8P&63mZJHjGXe?%Ps5Z z+JkC)W9Ho_vMyvA7uGd)ofJ^r`RVPZ#Ud_~Eq}yUv9E9ErxBzs{n;wU=)supS6m5E zAVK`|pZttI<4PHKWhWv~UaQaijzHUsJel(AxzNItSI{EUMVGeiiFKOe;`=)p&$z@jXi41(xNo3YkR zjv9-eq52K7bL2{oJrBin_|T(Jgi@9?qwD8=?y@`UJ;d{c5@#^kA=j??U#$z+Z%~vb zoJ|&P0IMzF_xL8RAqh^`;y;M5;lDY5ov%bu6mj7V354onisS+j429(6C^m$Ex3kB;*0UMORMHPOH4pLB}vtO z0_Amz3Ap6ZM>xh(F6@GG4EBls-1%gmx2uD2vZ}Bt4!rnhtA;{5`^S?^YlkcrHYMHP za+!_k_v`Po&dTSV8)UJz52Hus>%J5ADRJY4S;ekrVN$OyH3dQFBkP6eDZ9OnJ0W1P zsuNT_{QrEOXN`N@Rr$o)Q~r!e+DS(Ubhx)+ziSK5vAvC^#M)Z>dsQ%=9_wqLcM(|! zz!2>A5Ydgj^k$0v-a)uViY@|JQ=%G81kB*~jvAt4B(bt*hqlVK=BGAUek%G^H{tru zD6$5q1OF6S6i2Jg6(ytg-#lbIb=>R3a#|>(f7D%9(!%9KR@_;C<}yTj&zAP0DLIni znHWCnoPh{A$@TN$m7r0N21^z5A}H!^VAJjiY!h58t#VzDhnXwC0}pEa-g&r|n=%v^ z9Jj|pYkPp4+l*v$3o!K=xx#Xi2+{Q}#4S3&xzj5E4{!(F=AQ0uYi$y{(QxGQKz+x? zP1pA~Gp5Ez*Y>by_d&T%xzGg*3MrNOfM6f?nQg5(Br3}!XAj>27vAW8bS}(&9=TbD zmH=_?*rsw{?P2uYG>&lMY%q6ZQKvfzNxXKiOfWW)oY>lw@1(5&d9d58+iGqXdx08b ztE+LLb(5kqHai<&%*E9UY4fIv9SxP(d>up7<#;HDSf}F(47VqF8v35 z?HcC{!c#*y{UT*pp%Z(#FJ>p}*BiXC7o$A^MRE^mBVLmK=iS_w*P$eX(H*Z%R|F;6 z#TAhZ`s<*JJm+=I)zyhQbx5x48-nGYjG!+N!ZsTwKsOx2d%#$^p!Q3OrF`Er zlrXmY+uc);uVLNin36NW;tTw5%UBt!UiSM&fY2&q)ydi0VVC#@B^E@!jtoTxO=CFF z>i{arBF=50PCOR9mATfj?#ex{qT9KH6N*)jWv|#Ovz+hka&iRFD|>T)XHM>FQaB_8 z*O)$ezh#q=-{zRduFHjdFe|doi{OE3P=ZNAF!lkB2=Q_vq8sdEc-C8)o#&jrSk`pM z%LP6@{gq}_?|0d0(h&Mb0^M0v;+x|&dNF32ge>>tT4xY&A8-~5dD(R(nq`{GrWg1;ZV%1>A-o|+;%NO^Pa^85hzn_$bfatY!Ta-r^cc4;9;z$91pxSp7dvd%+%l&aLg*92xo!2_m2O zsMRD{C4l>yk#YLVJ+;X~y}zBjKLE<>r(Zqe#DvYtXmIH45c}J1;SdAJ7C#a7`ZA$Y z{~n{CAb<5Mt~3DhVVj~!Ktch}^vf7r*hU3GBEMjNYhD_z zeZ9Wyt$X+P>K)Up>EZ7mxP#$v%~+WG7qGMf^SnB@x#5lwoqEv)om|l8e& zJ}&tZ0Ky<4(5gCwa=w4pb@T<;K?lzm1}gj^rg25Unw7EQ^CA_zWAEXI8?s5?>otwx zfw{AmzOf7F1sXBQtX2WN(AzdvnR@AK{~b>ox0NvkgD4=G_g}*M&z3>P{eS--c9j4m zuGn23m#=r&;fHlBZdmd&>ZabG_Qfp(dinCs=Ru6KL6udWcz}L@^RE1STwec9EmE0& z;3-HYq4d`!zLSNpE!0k|*l>ffJ(4e$-YXM9443@SIS;cPMjZ;^ZcT>X#C-fBKjF-eZZ}^% zG{2$XQe#YOMb7p1<;1qhck^lt0Grj4TbEp<)}6Y0>`KS>gx^KKxMKcqjWii+dsl_A z)-{^dBw=2DuJ66t<&k zkU18%9RFmVF9)m7FUa18=dkb>oCo#!^}ES`Wr~mz9(LCkpmQQx!#|P9(^tW7d2a-t z#}W0oJ&}YSsTHsQ*7TV>%$6`$hFoGXzmPvZQ#Mo_evjS^OH4bg-Lp{@z8v%){KRT)<5CI-Sf=Yc zeKm9A=2J|`@Knv|D#Nc>8!i_YzQqzT1f19Om&3DAlcAgLa-{cS5q!t>F8zzu$fb{! zg>&8XXsoL$NPJ{|%{5sQ!pfRui`k)+QH?FG9o7aav1>JhN)Bc%n7Mwe{KiBxR((I& z61XHQ!JQo$LBr!!4mK;Qz0Ztwv1=W+eXayA7-mxm?ny@GY-T=_Oxj%bVL~op4ahs9 z9$ajJ(H2rhfuUM(HHD!QuD`RvTvs*Vut9P>?61~>FN;N(noAkD*n~N=Bw)oLso7#o z)}qu&JVj2KeduFX0lu6pWUc@SZsU-o7|2QDzy~A9;G48n=ET{%5aTe)Jl`!g$GG47>bwhHh&3v!?5D5qG1FlQB@#ogtCv81A4UpITO=?^v?VMp?|0z7)f zxdPnC!+_B+^_qR7?|09v=Xxt==Nuignui`xoOhCEVLN%gS7Bes`|;=+Ud)$<3?8GXB)F z2Y8qRRThM7_l!{9TwjD1?rzOlBe-Tr~?Y%OYHbMpSi=FKf<{VG_l*$~$RB z+o@o(f^gJ^@EL~L^~-aGO1=?wp6Xs^+3(BsYp<*%01<4i-I96wy;*9;n6eIQydrXh zn0XztiwToM%t?0M*x1~msW#;*t`{KdGw zw5vJ0AUhzAl?v~mP5dn;z`R1ND<-{SgRaVyZ*r7sJf3-nc={^ImOAg{i!5T1=r=#} znORot;p|%;Gvno6k!#j_pX^?2SPJqduEl%jzndk>i?QWqTah%$AwR)gXvR)#8Ix-5 z2Q7Mr>Z@TPtVu1-YsQkW8x02+D{U*!%a^^HSqm1 zQGhswVcK78oQd_3(VBG9*6K4I6s=#?A!|CP{dsMcb>VJdSf7myX@9H^S@efKa!uxH zaTfS>eaKFAN~7R7)rh)cHW^0WVMsyXj9n6j$a{hZR7Jf_u-Tz(}!Ocyvm=%!KDOrAwdq=VIL!nj=W@E9hq#aXMbMwiCVN>CNR5TcDJ z6bfM(fS`Vb_<;hUQ)DkIbL*Hn!Z)I}p(M~ohI_Dw<8zgxRYE#*y=e}*n5QL1)Q`PZ z5^H|jtj47k@_LK9b89uGuP8l1uLnUYQnO9Loz!w&#^TgduTO{7ep$NCy+&0(4l6ITBPRGAgPzFub&ti}1JjDv3|U^h?|&8g?g4+xqr` zH;5@GnHSnJmk}2B1}00({I%u=W1<|1@+gbT-%s0$j9Y&nYp_b4xRlv8Q-F=9^Uv#=>Ugrqv_5MqGL^Ct7Gfnnt;avf z^)9BOV@rxwQx-4WapDK zvKGdlTGoZtF}-HElT5T+_E<_L?RjEIU!S+r($-_5QR8p&&zj6_1Fcf}TK&2i*e{We znW2SVl3%{2?scTIHB#LmTB+Q4OaM1tA7BiPs}XPVVv3C}86rZ^r;islQEFcC$xbT( zNJ=p0(1OSzQZIQg_u_wEc}`Z4K6sp*ntoVou5y2^lf=mq;DPi*uePUkCtqY$1%l;= z()#erRBuY@xdTYOXD*z3T3I)RHI7>MG)KLkq}t_Q%u*kzb5Azc>s-3SVsBP&gCnEP zb@OxO|A*_`8+Kai+=EHZh3-sHX`6Zf{xVx7Ki$t)DV*yGtBXbqVeVM`G1s?!6xB|o zpI+l0=By;FEOAdJD`$a0Q=_DMGDAIU#%8UN7d}$oo-AmsZ@K2yiU6wDx7Ctr&blxc zqgU*8A&@zm1#?+#d$1IyhL$*MU6)C&dsW-|?3Iqa-RlFUsPos207#p>{Ge-J{;)s& z;oA1ni%zxeQ9uT6csXF2`>CK<4MVNrg<$Tgo=8R$C%kt z77ImUQ5OW$zaZ`HdQrg^Rb0((vE0SWiV=ciy5KK%dCfa1 zO_;0FsiLo1`$AvvPmH-fmaZB*Obbi$_FtH=6y79qFgz7F>`-C=d)-FsmfXf z`^0S{8(ykkE-n@FAZL@TSJ6<-;~)tuh+RypTxwm6K0WZ!UcnytkGl%-S)zK^?qT-C z@E$7T72#SPbJ0CUhr>_8r<{u#z#m4ljrz=k$&!{A?#Ky0*r|v-#xu z*|TC-BkE?#B5K!zOv2ymw0N&BM!8V0OQ8CEW%)jNYc;fYtQSc%zxTRruNWhJXP^aA z*^|~~f<39zOtMdqS42o;@tUW|t8k<;*t3t4_5U&pN&QUHaU|Gpn-C0vLHw-e2)fN8$G!zVakU5W4w~_7m(u3DPBE?N%-Jh(pGa(Qg9Hx%K}r?Bn!iWgXk|sV?PzRp~!|A^Odo7SjLc z88#x{+$muP#S$fmdXYB0MdnN+#g`Tc_YQBFz+}tSzo+c-!HM>Q2{DX|nDdA-Wvja= zh+hITCM1c>KNyQwe6=Tl%7FMDm~Lh22DINt&F(YpK&}Pr=TZ81)DGm4#&fw-&&Z@W`v!Pk!(pv*Y7~p?<*IDS?YcQ{s&{5ZZ_u;gTp4WHc2}ad zoaVsj$VZ{C)W@?UEKV*WNh#qS5{P_=Okk8$gHiPAQ4HT?6u%yz~2g{j8(t4-T_@V?-W zCmUEQ`kf_&|KPLPIKdV(Y_czR>V@U;cq6i%yotWcYr z`nH@z>J>W-3s2WL`+KdH^ z9FukH4cNP1HEwu-8}RlQ>+2=QR6WO@lTvAi>>pqmRoIUZ&CtY3G*u^ARfkSWB^|hC zju)|{UiQpOVc|7!NQUZ9=lZpNo*3v8>@iP{TD2qgxtw8(d+-79`T#p~KhsOFzD05? z`i4Kez|;GwQ8Nd~D0D2OT_X7&MzOJ$6h>@eue4C|i;UyE!<`X8v6d`EU3|p9O$;Cl zF?i30iu@{Q$h6`1nR-aZ!+BA@nr`W%7I?jf6`5jRt%-<_$^nZHxA==uZ|zQD#vKiD zt&DbZ)NQ3Z$6xU<%9Cw*Yh_D`ODPa5#Yc1q2I(l+qSCl$TzJ+hnGb~SnP5TwAi1Tgusn;m4)Y|`McTHCU0ez|^<66q z*qT?5igb}{v2tWmPGjmw4B3OH3 z8u!X4Tf0oPk{Cp&^^9^-3)W(ohJ$F1OP3z@k~-`&Wn>G?59ps<35vtV?>6h{%CMf2 zaM}-_jJ{cQUAoLlb~WP27CyfQPt>Pt#@U9FG$I8m29q?aFyP@oBUXG_#V&N4GLaoW zh{o^aO}W%s5qEKimOrXm{202f2&ij5@|ANKgRy~|*$JqvG z+I-nZWzF1UuqfvFkNe`W@n@|cFYgu(Ej{mKGFOp=$26|^1K;vjtszxjZ}qavs@|a& zRgzbl@iU0q>PB&1OWJ{>p_=sf`5-jzSv^mpeSKB`EkOxvqxPT4Mx$tP{y zOTR4l3GY__iCS17lo~qsPhslqQ^A2EXR50Wx-Mg!+U<{IFG?c$Spq|rDzoKYTcRhK z6J1+1>hJKo$5Iq&1s_{GO z%yyS>V0w_LSZxX%Wkpm(Tzx`hHA=ip{W@8}U(-gj;>>w`=&RJ8Tbr>l1PRn9xZPrg z(hR7QLm;N!a{W9r%=Re6+KeO2J``6#o;tC3WpC#!0APd^W$A;~@i0c-;+NvI%nQOq5+x{is}<@j{3o3DRD*>vXq#BvOb)}Yo>b5@NfvV6 z$t#mD_V)w_bE#^ob?eSYumIK~l&D)Fu<9iE5wL+8sz{onWZ$gUtjL5W~m>*N>ap0A|7NmHqu$7?K2R2dQ{ri^F8xen(ErR7gw{H&#&JrH&BG;mWkdg@SBa{VCzyWE@jHpu=0`gZO%Qj4_@Xn z+#ww`?&oE_oXao^!5=>?%ZNCwopXu4XVuR^R33}nPIdLsJA}Sj+0I=#I;Z2H{w!cD zT{$mpLlPurd%^Z_2}lJ>p7s}YHb$$mYX9>)(}C?Alu|fMLTPF!d9nMsO+t?~t#vVc zMR?U<*EcN=G;?Pc%&tcw1!Y0gVyt;)qzm4cwaG1Yzq716yo`wCZ4`m}lOdJa9;tNj zsRSz)gM@ch;u_#5t7<7K27XgXVyZnfv@uP_7&spogdnabbGm;4u=U2yQ}{ASN(3_Phb_SsvHz2HWy1=WZs{!bK{pRY8M=N z?JeK1+Ok?Dwv+&*Ec}8iH~ViJ?X1*vXOXg(wa7gaxanUA5)RbvaGdw7fv3 zl&(~sA@ovC$<7`#IwUb`4b)#VZzW(eA;x47pQ8{9igUC*3%_KgfFhD%jE@p)JL9T% zD)NNpQppC^!Afs>XL+jaZtg0~SY1#h@KMU*J$V8h!ihX_kBn*{cdp3UYxe`y5jDG- z*%{lvqB&hUw z(HJtlDKT$@=QM{6&CYxdJXk8ii+^77a;z^9hRCpyxFnzC^cwf3S?qCr*0bk2gclB$ z2$yurs5x-v9F?h<+#v(zTz0-Sax_Afl0{U-lQnH;13lgJar0SHVKTfKZiXZ|Y;Of$?4GWmnERWp(%S zT`6Td;SH)}je?f7p1Tdhnc_lnH0GVN|KiF~7he1DZqn<@fh9wOwfUIWT+hfVle4gu zRwIL{78{8+E7ED&2J5g(e_o&zt~|~V0}Z<)Rv#}oBxPN16v*99J*T4EPP5;X#i>44 zSB7VDr&Y%Ex9)+#^+V3qdn6LJWD&y1BT%-56ZEF-_Feqk2n0r9(KGY=nj@6_-a2@) zgo5NjW}{}zjrH+JZoBfhlUv4|tdQgRNEFM!#yJXkhKP5w3(Cu05RSAqTTW3Lf3X{J z;>i0QFtgaRU9XjwX^!t);Ub3#Fn=W5*%r%bL*I_`RJBtxbk-_m&qO3Cs~+y=z?Naq zPBz(r+}pIuLYXg0s*xOWvz+tHwL;Ab@8`kz>sdO_6X8mBmowqYw8$SaF2cvvle?J< zvwmmlfI1nK$~+l%7+FO3(MzdK_q8Y^LR^G~FU>Vg zkKOa0@C>ZHuQl_^T2ue-X{oBeeojmyld*xK7_`&U~r2mSfdfa^x3}%#(Yq6w+Y10(ey@hjpvH zWCeblE2~ICTwEv1!5V--qpwSs`XgtM>}EwB-t6R|`7+Isel**LD*$4b#dZ-C9JL;| zJ+{o}ks= zo2=wOfmw*RhqC^x?wzBAe%RK0qbZOT!M63%*nq%V)MTtn^H4Surxn{8@atTQMZC z$(^OQ6(dx;=n~FUf=MnDH(Mu`q+ds5r^RQ)Ea6$cMm*=`B@#SS7X?Zz$QiR49O_CuByY_~LSd9DW~LLsoG21o!MlrqRGIFmIl>N0b3i!|KTrF7QPkfAqk(sGy&}Z_t*FbC)Qa> z6XS3N1np>|Yb{-sF>^y73k3jR=H$9RD-LOVBDk zz`vBByr0u9`h$; zETf!NVMMz<-P+p{66p*o=wNHYM>fBRD=!Gycg9Rrd#AG}*?015SSoKd!RN8s?nRq< z3z$kkh5PK|aANnN+m{sxUV}WY67L0sJw=S+o-yT>eGwq2JAgqhKqsxe(T(Ddv!RG^ zjG`#5`0(q2#Nuk4Q}Z`7SGvSl8-ap(g5#zkQ#RExEU}1kbsctv z91ay-Dr|Wnn>I4p@EfFDD6nlg%elLbRdyF%VRL=$OaEoJB@XLD8zOzE!!rtqGCfc> zd7~Pp^kGlTc>YH)RgHUcJKJ4Ag`9K}^?E$U!H>c5Ml^&o_)$cU@M0%SBp6Og*~a<& z9qv!8uWR&rwu)}XuVy>zqb$OAelvzRS!;*~N7RWtLDA89Fc&5= zBWRj@;}&*mbKs?LqhrXV0hWQt<+j|(P54eFHC=x80l_0}@4fZWyX>Ch21|2Bd8Nrh zDyufBOK{6s7qQD8zhak*O{7aP3T)0y9gd;*cSKV~oZn<{WL_D+TC@qq*)`f)1`uA< zned*vC~(hyI-NcCoEqGVxzgh077EI5XyiutoL~@2wm>=nVT!w1v2gE|{TxqBzt_dc&+n#A3*ZkC zSnp5*9YEIt|3U{(o#3&iM(IO37xo<7*7`jgKG}$yKWz5QBug(cTZ%sO7fNG``?T4k z-nTw+;u$s?an2sjh^V-h;>sdx&PLW;$cMn_hS(s?K;{uY)S{_bYMXNPo~YfPDxbae z9o4F<;@y<}0PV1f4Qrk(>rt)tC4mjEmH)Oh3G zr@r0T_vEp36?VkL!H1`+mz;<NtJEnyceE~kEzdsHwH4m z?)7t3!-q)=kBz^5I}Cx`q4Z$}DTbIWjm=sJlRMM;c4o|(d+K1-uk!XeDgd4l5_$Yt zmtigXjCfrlB6SJd;I@gzBYHN2)UJC&A`hRvIP(|xL$z%JIBSI7P_e*4L> zzz3YIKE;;J25isqVm7ezC1g(XfjK8(zXs5Y^AaOsM&SL#;80_?xo72GAJz!&Jg1Fz z8qJe}NvqT;aC+7W_ysTZ8is#9Y>+_(iuVc*l?aiZd*Lz0#%5%IM4a4K^3nM3qS=0K zaI_ZuQ&iieAn_DoT#D>ut@=LeeGl97Fg>~23{4_x9P!GZJz0=d_JbLijF8NL!^`N) z46Sptb}-du=zLNY7GT8p?IeMGK(^lfJfyZEDBn}Rgo zj2vk<-D8WKN;W)u42JNT~66(+PLast21%L8|Pwm`iq*5ao;9Qhr*^q(8&|BqIAmKw42Qtyc4Rtewj0jT(EAC zRmrt!vj&ZYVWDZ{fv=QdgP}jBBVLEH7wYo{&)KS%e8vL5oi|)osNKw=C+%!HI@4bl zIcsx=#Fsng4!i6<%pR7q;UPD)gOb#J2E$wP2TmXUWGB%-d;YMAPLKTw7@;KcC1wy2 zAERv_>B9viMjq|Hn?rcrxiyE_MF$MW-Th1~pGEY*pf)WyG>%weB6B?E5x#SG&pcum z4~Ln=5)UH~{F6;EWX?b8yriS~eRGL}ZrO*{*~C%1(2}t*hid61Y(C-qaLIkdo$h)Y zc(macoKbWws`G40F*`5qbGsMDoMIPC8AO@@M+l#Qd97y|KU1%Fb6&B_#yDXx)BN!;T8#1dlr z0LwT4>TsdE*@W*s^x4E&Zk+Pk z9&kM{w@p_-1}6g}OJNLVb1?@{l++@X$rvymyJ!;gfUeDA5eRLnR1~Ee>?o@u)i22< zYCOdA*=^6cYjK5SvQOrU0+q=S%)c7x(9p8q2ut0xQ}F$+;bJG+;D(`^Hq}nqYXrad z{fH62gE>DGWD);*5x=j|GkARoAhh~Z{0Kj)fLH<*{>Xfy+ok`n$15P^KrUv_0i@)HD-u=(JKmVD35iq1x&=TzUhBWZPhLQo%1Tp3^J;fW4HGI zi+|b9nZ6yEXvD_6-KtPFl&8W>!v3nZ-SKV5_2k==?%oa87=%cjqA!XLrk!djJ*i9T zRdvby3x4gBt3AK&T2&7>UR{k>d$AE}{>kLrhE;j4zTC&Xc4T=PVd+E|bcs`pK=tZy zV2iq;RCw&V4?FkC!J~IM2}}}$cE@nxeDPzF=Yfi~PrijsDr_|_s__SF-pIA>eY=)N zHh}rdp6=B9biUl<;9;&_!IO(BNDtW6)v(1cDKqJkeAKubdDC(#Kk5}D1E$ca{2G^J z$DxKEXeNC^2#}#p>bO>Pi;Yu?KcI`Ao&Iq=JN=tijT^tG4UnbDjrm*D_QT0DJ4Uux zIP%vf*51L5UqcRdKFj_+e!V2|Y3lm8!$eJ4eer_4%=y^2zk?fBx$Vj7v-Fu9hXz^y zei1MJrdR^eC0;x%VMEbqCY5G(a&S~1el2ktwh8kTe=zsX`7R2`*bjdcPxuqpEEY_0 z$mU1BB$rQJvtVpw{tRB+e51D?ry#Ur>;#HZ{M5DK59kF&ObgSj+9C7rf)|r|M&0kc zxM^j)*i%AJj^xI>Y_up=6;wVBYh}LN#zv@j;UU{yzi<+al3q%=l?Pq$;%Wgb2Qi6< zlMea9)ln8-v_)}5=Idwj;w~S*9sj%5U?Ij~^weRh3(0NvPj5e#{E#*E9(=_JdV;%p zf5VC0AgyQrEIzzg0`?`%8+gG_OKNNgaaf}E?==p71|O~nCfl@ZJwezUDO(WBSUuQj z&xaQ~F(hvp>UP}zEIvF%PT|ApH6F@rezW{3d8Ep_&tdCyc{;4jFm6BjJ=qBJoVd-C zB^~v}2Y!=cf_kZEpLI;D`4zMGYaU$ks>Ctt4pB{`_>5`Vh%bJ$9c+FkMQZbr(N_k z_PZCoJLbPVWOtz1Uvz5yY4I8=wFrQGPCETxienSHEpY@6IQ)z*0d-*4xhx%9J0t^48^vZuV^nXtNi}ME0vqr{#%s@OY;+#N^ zD>fQRg>tkUzGzxyExGQ8#ea|JfMy#Z5<;s}i~tXDQ~!Ov?|}i-Wq+r*-3c}J%b>MI zHeNLKIJda(o0>VveKRf@fuV$(cutq1N%q|ryf^yp%6qH#XV0^<6Y-TMlQQ9Urc`k} zY?8X<`zY$EX`JnTdJo~>A?kwj>Unb_FMf;aF7i_xnxd^T;#ZbCp1zKota$G){vfaL zdv%HopW!Rcb4jE5%b_-YuWB11$P=7C#;`6HQFMNdU2LD~j-4Zy!AurkFLK}mB{33( zWlTtCLj3QzF9IP$3)-vPC&Kqtj(GJsTG{1=qE6Z^2d~+>^M^l~anU7yfOVx~d4>m%s7%0Cg$WU&d6} zc1v^h;aNG=yEXCE+30CzE*8tqFBCujR?n&VPO@(90Y(EE`G@Bf@iF&n8Ck@PH(_z^ zW;}kNK}YWvu7@+i8_gOL6(8eM z&2RFqiYM=!f`cMsD2WsKSrSx_EW)LJyg{}`wk?d?BeBL7Lto{yn}hE`f~|_DhgQ$Z zE`R@5cQ95qEskVGqmnS*vCby7}55o<$`Jsvp7&xGy>Vz_?QcBD*u*Yi2X5 zNX7zXbl+rzKzszI(Ed8MfWNtXGgIk9zQUaxF#}5tlmU)2hB74&W<3I9v|#`QEU> z_>lKw&r|hf#@de`sRcaEG9A871fU3yxmwQJePHQf+ZnV|uip>W*|2BWLfUMeZ1!0A z^Peju7P|~mI2nxiys?*ujU;B3 zsQ5r@d7t+kFo9K{|Hlq+vs1`au{S40kT6mM5h5sT*%Vu4JwlT2)^d;3SsCQ;PiJHJ z3NXrhSXG?BqU2${40~8mCbWP~_S*K$mK*GsDdhojsyrGL3*cyKia;$3U-JZzgwm5Q zy$cbpqD!pEB`BSDBJhhLsu(eID!hfN?%axNkOgNf=emevYCwYpeB>L%Od~Eg6+c)P zQ;@vcFKS8bB)U{|h|8$5?MPQ!NYz%?k&cdQl4Vx1m~ zB%Fp6cto~a!=RFemto-Womtd5S<)7NkmLHz0PcI$GTov4Y}$2ySOk!Mox(ug5F3Ib zt%MZ0>{!T%aH0q?#+Xx|G&3@f`b}I&4~uP71*Y;(*gV2vO|D%{0|HcW`0&GM8mX1N zTBsC!`3AfAnz<9dSkuAKT)WQI{9oG9ugC@qtBKOzrWp(EtQ56?Vm3j=H%+gqRr08T z31KN=k>1k<9s(BZvsAQAmqO4qvjT1vmskWRF0kKew|3DQk_gMVE{kj~OlOlgYsac4 z$^157FbFsN;F%)2#0N3hp9;2~+GHD2*nE>#e;~P&qhdnAm{V-%T{8_VU|v86UL!$d z{BHw`(U0LjvotC?#OnWh^!2fR#svjao3K4O-eXh)#y!ssLom6P+1~CZu+XG3)RcPs z*ME$P;OSZ7ao|?90;>=^80u4Xcst8i5Qcmp@+6#22~D(%eyCdvUo~i!`1sK z#rUZEHj%;fjH-U`cVupA2~ilL;aoS+Mu>pqjiTOrqMScTu9 zcF-;7INVb*UJ`rF?013e`;P1Zp%ZsG*PE}Y)=-bJ49$L24Yar&uv_$Vdqw@je|c=>(6e{i{CKM zT|V*0JFA!I@S)>#?OTX-mTlI)s3lp8HtH(N4&>lo|2- z%4Nz1J0y$-VpK8L@um z!vj{|*6$sr@WNKZiN;StR@wlSm))y-g6L19$Q$~b&ztZ+;8$vH^3Lnx3q%~yf>A&% z%m>tk{X$scq3GhOP#3*{QCei953=H{Qmd71l1;03hU|!e=uEAee+EMi{kD#RDNG~r zBIT^6?CeuKx15qhz#Dbv)3=$ip-7y)*#_2|{S2+T!@dsi)y`<_VJ>V5^?1*S6 zN`X#RR1FcR#2&;mK*$1yKZ5jXwSa96D3rIc3YTJ==$~c|MV%NeBYsdf@ipj&FY}8^_ z>#P^v=^kTTh1XU)Q8B#aGdO7Ht}E{S?$uxhtFI6mC331B>?x+`A-tF_rVRQPR@kBt zznh>Fd^bCs+E>^<;f9G@mW4gYr@kW=LQ^3Cy}4*6!bj>dl<8iJq!*O}JO(gE>s4w; zWqaO(ihX)S*&LDirF*6=(hZS?h7AdkJpT5+G?T-jcOkHppqSy)N<`5m&n_e~k9QbW z{{cN7nQ{0yIuDpiNsGlQvVk(H45MPrii9d15{n*>Bi|=>PPxXJR))Uz9O|#A3rgv} z=b);i--vciW-49B%*`7HkUx3O%PNeU*;4qv?y_r`t;peDR;|61GM*Cw46ikgRwkqe z)|XM|tBzlm9(KGAbm)hePCnShNWWLBl#5ny71r|#VAH&R)hYdAvsF`A;RYLh2AZo$qBYpfg z?p>SRsOTjpY>13{!|=6)td4AdxjNr1}Uzz~8YH2V~oOEz@$GV3yT@S1WW z?NxRAUVETpnm~NNr5*G)_DIXQh7#Nrq}}-Kn;I%m@neX+?CXNRqaSxaZW#O)J5-h# z?)#Q*BJtfwDSy*f65a3WE0Kr|OK0@LS}k_`L)Rf=DEXT`gG|rh|LhKW42{@hGUB`KT#v`h2_*w+hwUt$Kb)%#nvCBB!4kpdD) zG!34w664{bZ;m==|MGw?p;9nD&j$ZSPv|21SyRCAk@nva4Pdz6KfJuvwl?5K*Jj8B z%6tBD=9JEe0i|HI7K?FCST{x)CX-=U&I)P5=8&gpDX%z&jqQ{GY|3UM&v%UT!p-sN zcRq(3=kItoks{v^>?AdIvNbV)H2hBmyo%O#9bv&?xJj?LpX(i%igU#BDdL~DrA-lo z(UG!y^&3{p)8`ysFxyfW*ctzzwTW88Ap9YNEX5#yKz)Ue$KZ>!4Y_)KCf0l%`cS>M z?2qHFsCtlrfDA+M?luadBb;wSYGGXqpv&;j7Gxw2mY&;7u=g7147% zEkEn!18SD+dX+=L?l{9^_oy&Z><{*YB63)LQwwH`@%<4jLderp$*oRmw@Eme?c(vLB zjf?GZQ5p?Fyjl!WN+o}yBUaiZ=0Y2rAUjblGdfqRDBzEF(eTREpaQT<_IR|5o$b(b z31$<-15irS1=xhyamEIM55_#Gjhv`p`S_o5#+q&7j449Ft>z0>G%cE_u|4NpySN*9W75gUSvMFd zqm~(29_Kz-VIyx0!$|J%=bSgP1b%>=X;_7xz^j#!azE80&h^jp&trf z-MOZ(LO-EAaW=FQOToYK0?hIghZ_T3S1wo{?U#K>-M_BYx8M83yn+?YXco^IOFImT zN(fUh)8d6sy(-}=_VwC0Ws%^2uo|@}p0Qqc-N$}5**yPHW8~S0zgnds0TmKmvH}~? z7D?AHvN1JMAv~R)<|}dkSSAZPmGBMo-SwdLyt`_;q)%Z71|F*w6PuP=>L{JWRNNh`=sE zhK&RVEZ`rWe}vB@cPVevx6uJhyQXEuY`qJu^zlWpS09QBVAK{c`iD1ZqX2J>_}~l-Q%CZS9^Xf0E5C zX@5URa_3D^=fRoS7t5WL4^c2HeH=v|Ym9(aoVj@^yPwO>SrSfq5<_y=nO-GA56^m~ zi_;M@>Rtzm8%CHFp(mg%e}?*`?OD-`+mGj&ntYbtx73Clp{-l(9^%ZTGO6HKCu2rm z?XlSGJ!4iA=z&NcxT+ejDN&z+i9sUeU%IOra}w;l$rcwoXlbD ziG>+jAVTj_{%+Xz=m?54?Thj)L(~!i7g1 zek}z<1`|KSoSsE0x@>OxW{hXPr=7of<-7-L)~Y)f{St_l>kj!C+y(a+ieNR2p`YQ;;T7uOGc!fz#8-=Nw0hQecqXvu#W88%!P}S24*0_#-7}dT z4k;gB;ov4!GHBqpYCWv1#&yd+tH{faJF~%& zh_)lS8~~hv5IXQj@OhL%R^ELsre3Yygfxl=rri31fg zQ}GXv?%Kp=?(iNvfA01>=)np~zwrMaNB+6h*6LdU5*el~F{ z-wTZ>tv(P|kOq#7;V&II+gM;kZOPfJ-6Ln2A(uT88+_Qeaulx4d;!WHDNTILF$Cy;$dlvEL zU*HYH4ak6jgkqn@H>=CP_E&n>j@m!{>4gdI?Eh1t~O-(HseS-m!U1jxi8^fruXV%rO#OhtQ^Oy?>A**=3-_dc3GWmJj09NG`X(By+o0W`%8)3 znB(|t`f9gAM8C1Bl-gE^63b&1A+mrXkp?le*fcR9{T4e}xzgsp6ACDu8LJ~T>9`I9 z!qK6`1_*Af-xx%-dRsr&cVU3bm?GwkrxMb~VC~4w9>MGYI&&ftOo9XXxMaT4_FT48 zrjnaqjkA-*?tVk9G_cN;e{Z5&H`5Nn6kN6jfUDuk;5+teHHY{xCZQAhzSTRjAOaWs zB|=m*VoWDUSaI$>))|LX?6)`+9i#K16kw)>fQ)7S{y4Yd&%IBpQ6fEmcxwegEx@Y!aObgBSo&C;D114d2YvUV+hilY*vm#j@i|cTVN7N! zWu>)7mTjal)S$uFuU`G1|MmFci%+lE?{xX&wB({kSVVQ{`hKC%OJ!EJp;9bO_~4!W zsv{|5d%3!0KfU)OZRc#*%Of#71{WC{TENdWkPAI(q(X=-Jr|$hjlBu&ld&JD{Abr6 z!~{`ZDQ!^c4(Knv@QJCwf3c=*@eVyHR@XUCtef9q215J6b(STYu#8ZXma>>1yBoJpstNZ zqop(sSCO&d;GDhNh>3AB&%C1!9MT6rPw)K9dxUbG$x(h~=PY>+U_E1r###Yhxe6FZ zJzbftg^%QF@xFK(kK{bcQ& zAAnofmnso29HgyNtT@96c6J>JmHr%JS#iz(%9(O!YRj4y9qb|<*Mi4RVCSj?@-o#x zdh`QdY4_w%O@oz1b?ftYlSx%WH1WiNRG|7GF{t`{oa`RF;*wF-=v#cUe-q&D85RS3 z)ze;Cqm%1oYyg=*_zB4ayJWCetCR+ZHI`5Jmgu1T8V@OxXGe?N6T_OKqMVP6@H`)m zl&U(R(K52%*h>HyUZyzlvyqfWWI}mV7upYLS<09@m_M|l6>a<% z-A1er*{3haG`}Zi#-}5bS89({N^(PR8rHHTbA&QaSSU7Dqp?Xeh}{Zf-_~#;^Mdj^ zH$zoeY9YoPD?8h2!qYee2V3b>pSuZ|B>t-ERozyeBp%Rk6D4at{}?^P)G=64Xx9jE z;g*61i5<)ty{bas1@*l@R-No=*zXm$okiYaZw>8>H>rbcMgecVIs1*RM6SS=z=J>I9K{q6J{-}oX&PV@cf-I2J9%Y_h>Wjmf^-67&NsJ ztUU+6rx!l42&~nh;?3jO)56XN&(%T;{=sagYqP}~mOwPSKjMRe%AAB+y;X)9-Rggg z|IK}4NoLEj{J_ih$t((d>Nsy3hEcg;&29X?*&W>+tw1&Ng0HJFQx0roQ8n zA(nLxmN-;ElEQ{Ao|@oQ5*Hyi)t0QU!50y4!5E{axX%Y;tnp?Cy79~)r_r{@r95a( zHbtb2n)DuTedbiF2{;%l>H`$`j@1k(#){89FMh6*didVs2gs)MnBW+(wA!W}urEIO zq?7irJu&HI{q7f^FmEEy{5mEKc)t(GT9pf<$$oa!Yj`2#|j?6p;x!DTaNv!V+MJ&tO?7P$4aRB5##T{w1 zVmzByEzQ+JY&;9-=Lo8yW7)u7lxlxjQo$_D`ICKL%Zzr4+X<9SGRYQY_?v^ZCTwLiRQ4#k)%KE-`J#(ykg#G!X4k0nwQCOP44c)H@p zqzfAZ!Ul1BFh^)J$F?lap3!?VF)Ht-_MCZHarR@GIXKgn~iWZedt*ZFy89y5y0`Jm->T zG&~n|5RByAOV7I8vxzuKG-4LNyoO`tNun94cW#D zLp~>MvuEKrnDY(=5c^bt!8gTq_L|ktW5><##B@M_J1$=!3W}}|YnVoSEy+IOz`pOD zc?5XN`{)U%Pk02G2FoZ0xAA}~Y4`G;qk+`~uVXA~kD|){eNL>1Ghm1~HTZ7EXEbR9?k; z%43gY+kacb6YPitb0+-L*qhqr0T>~x+B3i&-3bEVuKEhb058+{APx+;V@iZp{2{%1 zp+!9WzeB%n|MF}cch1;31s8l@vUOLDvWZtSoD!!|=xcw?z*q<7rolEBu);&i8o9{1y{?1PkNd!02#ZKB#S< z@n0MP_K*Y^XvG;=fWD2_Qi87aAR|Of32}p)?ji{aK#GbW1@dlqDuc+UczsH=9k1Tf zls>ZNp6CHMs^_PXWj(&gJ*v+PMO&+7U&lUFg%<<1k(#G?>@?TpzVM8o+igF}uy*O)iIyfJ{zV z!spkXaE?v0r&$tz9W#WZt(1jS;2svTlJuq~Nx9RP_o)7gXH)UJizL|YLY`^QXGsth zM6In*MA9m`)_vB#M0en4aJ$nwmvd0yfwT^^fEBA6@F`yW8egytK3$X}S${=!G%jE^2CRV=-P!IMr|h#WR~a1=H8$-<)KC3|M{ z$~7<9u<`w7_Hlw=Vz~*{xX(|cj7@xB=hv#Am|?CtdM&%>DR>J#e#q6W7I_}SP{K}- z6V(P*T&-RAv9NBy_2h6}JP*?_F-fO{Q~0ZU9mnqH^E&LduzO_O6+sWwx~0KO#33{> zF1hMq!O4n_5Z&m(Ig-a;=Pkh_mAlC$PtkCJVC0ouu^ou*bW=LhavrU+Da|&T1G{d({YuHVC zF|^`^(_^$5ULO0*_nc)%zkCDP*uy_uAe%Mq5VWa6gybJAT)JG=V{`)-h)T#&5Bc7T z@4LEuVH{kN$5Yk6HE>hcz=CY@>-_vzONy`yluk@bQY& z%2^UQRdO2c4vxLSeH~yF?Re`ST-P2(JU+)@uEZ7pX3P-OmtYD-kthTz##86hT~|J# z_s3V|j|A*cx(X8q%{mGAImW3bl=Nwe!eA(=dbzZCei1bd-UjPV6{RaIt~0zXzg zy=zL^RW4&YWimF=)ZAiB=|_ zc(q6(P=!Nk-#L0A-|38%O32CTe1c)bfG%{Y=4NroGDhpyC98sEESh}lg5YC%IQi}= zpTp}gCkrauF1VZ#wm994V=7cN!sE03-<>%y_geXf9b*+`(?Sa3TIqk_oti|9xbW;1 z#$5DsuG#o-cHZdwbYILN#$|2(YP@=6p{bIgv5C9kr!41?n>8``adzJ>8O0YGoU&a{ zteSY%LXI5U^1Bj%0+OWWb7_*jX6MSIZ@JJQ@EaEL-3&yaO7;t(Z&3)A;@2YQ1yqYx zNtrpnRY1^Q=_lsnZ*OEIT6Ug5*v17plJ&hX$CUZTo;j*w?2z3yW!>+l$X~Qkq zYp!!nt@pV@oDkJZuHV+f;RbkvHE-Em1s?SQ!e3&)zZ`xF{)A1iKjWO&^}4hQ_HXno zIT8r36ZN(#fM5qXUpWfih-tz??%|Su$E5B~O~k(=cGU*%6_T!|6Pu%rMq&)?35Yp~ zjlt*ahE(K#aJq}QxkksW_n_YbkUJ%{4m+P00GTm9B5d*|+LJpX%>22h;to>evEY&0A{@13-Cr01R!z%m4~SDcZ{p+ovYL(=V33e{>KfSj{N;pTTUF_ zV(_RgU94B@S+2M|;_i|gAGkbre1?75(~drZ!*_n6@pY z*B%|zaRQ+J4K$qeo3Dkd;cI51%_P9OrIb(G==|gb5>|J@p-=FoBuF}owk879L@Mnt zWw^}hR@Q@<3)mgIh?5jX|D60Hu1Gy1W;W9SVMRnN>eZTTbm-K}n?Ba9y;zjoo)gq4 zfz;EiAcMp$r|8&6$Y;z8fI!+?qP?nLxLzTsR!%6zzt9QV4M|X;%J4Z<*`s5AT(EWi zQvSX<{>;w!?Hhhxcpcv(fxIEQD9c7kyfG!PRY9<3;+>K=;ad%A5B!Vg1Ap-00F{T| zujT`8eRcxmq74^vK;ZfpJ25}+m<>God~%Kf?JWp6;i_F?viaqaFNH&y5%O6;O$ElT zWq2r2^BK8%xy#N(V2m(I_}YyIhRf_nV42+>dz+X1(wTs-gnnT1QN8_4AT^hA$C-e> z%f7DT>U}eT5<@k6={etPx7gWukM#v`!!l5Fna{1|L?HZznta87OFl0%f#D=yQ#=up~7C9^g(d7It3W|T-l=T!Qa}2m+!aC z8%XS)OHAH@G_7FG?9{Qqb$Q&m2*JTTk+U*P`li)Yy* zfF-!tJ@+@2@gvlz)}T)Q?fWQ+H}~^@A@{HPQ}Lqznfsp?G0@MA00=VEm;8>r`E1^A zDP473dH+6k)gXD`!lsFVe9zEtf>k@~kNSEy^T%(;@1|rWhynoJSg|DyOVS@!v5)w{ z8UeM|nvH%I-+w3(NzKlDf4ET^n@&`yD#d1>YL^=3z1g(iPpe@Lc4E7^=g%zZd>_Bw zO|xP9a95E{yIh_IDf|8^V{{^aeJs(LzMLhlzXQ5-RE?FlhK$HuQ_1#owPkDJKGcEqhd-*w!jV(g>7J z|M=NayOI^W>(8b3#kqjw2rp#%7yIHbcF%H{xksSUOMUNfK7bw~92XqRGXlvKTnqAq z+q#6uZRc=4DG)JX3hgEV#29InXX)m7z}QK-&?ctCFYAc`&dCrhS5pBC6d~WmRDd&J z^DY2IcIv+VWm}!TmH>U?w zt-UVh2XwIKNa{;m;0)n4dx`U@gBd?Av`g-lcIqq@xOT}*5q`AP9j6bd zmTgyyGcshRS_k(oaa1hkJLu1fc#r5?y1jvJ3>jwTt%DKxAp-OEY=q*j?tR9db(}#! zUjDLE2#&ZnCJ(LHRjc_#+llGt7 zy~~gE_4hLx-#3+@w@ttBH``$BTN4}XOF{{LYR4J{+K@hxu+GR z?TtyrrO(@w1u8qVbnjP;Q`~{ZdcvUWX`j&8rWU5x4v_8mLILE&8LJCCzkuH9V&6`K zC_cH$r%A2ye|Y)^pI29EhX6Ti6AT3&mD;G}BMeuGZ}ipPmvx?F{C_ueyXz#wY`x<& z<7mifnz5uco~Nw$PxmwbiqBtqs)1`@Tb}8&pKjO^XnP=NgLMYzcrkF?2kHjDzR;h~ zEd1%!|NO_Da4>(gwVWp%MdfKh%cNs+OJYUj9p@dWs^@4wopc~NRDIW}hpD*+Jb9FS zVemWSLFsyb$*BkFCw>b(Sds{=+>fg9A{)zwj1ALAYBQ|RyTvOiLdOd3v#LA)C8rPeshJ=JOI5Bh;J4+v5`MQW^`kYdks6N1)#=vl9uvH8fDFV0G!(?B0I_!Rp|FsqkGd}a3pOFb>YsDcLPiHek~f8B_vKJVhQ^3aX< zDR9S#cYxWspTSJQ{VdVoiP7GeJ$Q!`?-5Z-a->pcHg-q(dt*d49}uTRXw4zO~Nd=_8M3Ue-Er=Z---Tusmy z|IA2y0x5*g`Tuy?0E9AgFVfJT{=iNjTN&&8{XE(2dB+b3c{TJD0zil8{>TKsX-AUz z6Wb9-wE;QFd%FwaYO-+^qcpmOJEIbx@-OB@4OlAUuQAR*hVW!td>sguzTrK(yunyV zdMVxSs#`_UIX1t5k?@*?K|A=W+JgL|+&Dlyf@ER<{dCSxn@}uEPNulXW=v!ad##%n z{Zv!rX`Z^cl3(6azz#j^v;a~J(z>dWHji5B>@*@Y?6A!Y3U zZ1>F$P%epTSLYc7YO>7fFhlmP={M^zbb8391ef*zAb*FxLb#093>}6~2Nu)d3(^-q zaFOMCn4#ypVVibt$V)DD0=jWBa7H)rk`uo1>GX^h-WAPfiYlh69i^9c-3P~yF4>+~ zD7{XTi)I8W$RwUkN~LyQfp~7+F(+Vt-@uKv+o9&|9eJxoP8|P){?OQ32UD3o>Sq=H zn|9aYy`&IJ!RRlwM)GSH06Z^I_~+TxyJ{{0>&-?S#6~Z?Wsl)qgsK zfSCH6n?$mD`v6HA{=|uYdlunJKm1nRIA!T@XolE(#7h-u0oUvgY?d)}+TNoFd)&|o z5()PdCXY=%#h0arDP`&{Iwh6_#tznPrw}f6Alp9h87gHYdkK8{C;R6|>(B~r!awv7 z@7CR6m}ebnzS_YGVF8<5vsWNnKEku~XS{EZ_qJg_&6%{SELg*(&9&ohTc1eYHAoo& zFu4)uW!ana2fy>%m>}17AlZooW4^LH!XL|1BL>%RfXG+P4+qcpI%0Rp-DJo-e?W#} zbBqWtdz=AUEJPVS;v+`WRTg_vo+;-JV$^15YgqAMYw?`W19+T65TyckWOsZH%(BJ` zLA^X;fG=P=T77QM8OZ0ftak;2C(b7gs(gcQh~)G}o%c}*1U-9WH#+~5(4_8n_45Vg zCZ*3hUjSba!*EyP9cK&F)l90HJ*lKUa7&ZHq}^YSKu_JT+$OGK*NLFUr{6F-WEy3G zek(l2;=-7*Knz}u?;4%9+cP0FF@Ze|s`Kopd${%Ro6Zk#Wgev~wI0#)@YB@^f`S{i z-=|(j+38tJA8^Odo`N8XY?+mO_2G$Dq9bSyu_#KGXgEwmo0ctv8=E5>_OZ`u*vmnJxadsZX;;QR4Sgn8A+cuVeF81I0Xc)}AL=Dw(D+Jlx zKZAgN3JilC=EuS**n`w(pnvXd1S6uMr?d2;B=JZs6D`J1@wcid{*f*`gJb%XXaBVu z<#w!*20YlE0I2a!E7}W9-0WFJnN3=tpzZVsu~J2kvebvO$Pc_>Vvn4A?mjev_G~KR zwYil5iP1n)|Cs5!`kdUi3!k#ejdOI=#u8|7MVT; z4q&%hnW%ZG{oE0({f##K+Vmv4^1=>$)5 zj!Cs|)l_+cm)^~uQQ$d8*F*5XIj}kldmNW`e8Y}E+Mhhr9ZP1VYpy$2K z%3Z_LR3Nmf_1Vvb%W%}NO$LT;aOpTBZuv#$Dnx6TvSbDm$l5Y`I)7rJS`R#=cD>DB zoDndh^qTk^zD7Mn;3iKlwT-c)p7I<;7#IizIUdHJ55Im`?`bhrOrIBdpE-+QO8ER@|84C)3Pw(Tx;iav23;4`0KsF4D> zTrisq70hj*nB%Uaq;j`M%vRowy>>c8T=9W(4Ru7Yj9ZTKh^L!v#fK;MLo^J306#VD zx!cZ`P9eX;Nj5aeEPseY6vZw3Qs}$1%vQ!9B8`k4`OL$WH4#ux(*N9hw>=T=hya@a zTKHR?)(zRYrw2*4;8lfdJ@Pr-FER7C*%doIV1;^5oa(zvlc*9=*)TcS>QssXO*A&* z7aK97?N#1So zMEP-F*oQGR*vEEayZH+}Z}rzv3!fa|^u#JXnqM8EfEH`K*d~3-{tENJa!UcSip*d{ z%}EQLqrsGb*f5(Q`~QssJ*WR0P+e2l%;_;3xT!E58i>SpQbvA02 z7&8JZXBNe@%Q1ssE@C;sWhIh;nz3uIxL5`RPoX3?nC=)-m}M;4bYEWxI(0E_T?|o!vA5N*U$Y=sgt1C(ya>|F1g#F(v?a z=^aS-tm?7cRhXT34T*wz$nr7?xLCw!|6(!q96;ucX7P7vj;Q^PJrWe>S%7_nXvZT* z0e&1{XJWbuw#`1CJkt9_Kdn!yh(F0o{%}wK(ar>@@J^sZqm|8?Ge#eEJ4^s>*55t> z*j5iHCxy&wrsrZl*lp9N#f=3z*L__XNb=@fw}1otQyFL)E494f|x~w{yv9Ai3{WV-@JOoto6#BjGvt& zbaTf4l;;Q7C1iotT#5miyq}jdF=!CJeuyArv7aFr>jwXC?yJVEu~GqSF+mZ1x0^&{!{uJgydujdJ5 z0#E$3!F-;eXmGl1pz1Ny0QMke$T^u(ClF%3iPLQWATe+~Pf)b_{PP5!@KzF7AC%3E zg*q;fc{nUc+t>s}{hjZEKXc+szud+l%`LE44trPhDaw5D&#uM}c@QgkcZ+e#b}l)m z1h+L(vHI}3BO^Vws#n@&`77MEQ_-*y*rn{MHGMrpkbXpcCq7-pcmxr1KhF>(d|R=1 zXY#{7vNEpv8G_V>HC?*wW(6bKH79T&gs?g&hzJ{F0-9nS6-0>D82d`6+^6#cWlG?k z5V=mA>#JR1XlFVnIk;U`;fp}?_^Aqh}&k^i&zd1!1`bUol zK!hWf2?Ey<6|Aiz4_5&Ounwx9rwR6p8O>uXXoHiZ-em^~6@`stKgLRv3C22<^S=E| zz@Z%(^FEzJVzh}XPAUW_I0TywM^C2&`~n$%jo6CIfAs_ z=ba;HmXZej!G0OlEwqte<7huk2p^I^1}@q(!8-h?y=VjqJlp4Kf#IW!q1{=6v;v~K z--0;wKul4W5<7mDAZqJ4OW@{!d#HFS!;yj?Z74mQ%@uTV@N*^$p_g*3PZq3woYG86 z*xjCX@M#43bZ%nUANVUH0klcfqxxz;yJJV>qkW?zDT*E+^C1BkI3lA{8^0y+h!rwkSy9MOIJ zj_y(`$6vz&IUA_OV0iInvTUvd<+l@@k0W64`DDIpveA2Ja+K0oQDm+@fNVfm1 zCyW$ZJ3sRcOf6PemVZF`SRLT8M1HU=oMAl9Bl29cy^A-!E}2A~h+cj)jUMs6IpXl^ zUAj@T!Sf*%<3(4ZeV|6rH{DQdVz$RAog20nn_m_U@QcUrmFBYp`q_uCkX3x*XG~9t zZD)^T4S-VxJaW0kI@iJ#o%8D}#JOQB&q^X&8RcYu*O4w{z;8ZEB^_AfnsJtx9+{2K zf5=95U#*p=>RmPn@ElukphXmJ%2<~T(@=iK`MPq%5qpv=4Ga@S9B1*eGZfefuhd3tHG$*>MD`w%Dqb7>FD|C{!pu{Zt*gWQP0C!A*SCp|I_7>QQZ&yla) z0@Nuh*&78c2t1*;5mE2k_)5G5Cpd-{$b{&U9SKnZj4?lKFb5t%r-5lTBLkr*%t5PK z@y0>VQWAettAR#6KMZp?UAT!lV#RYj2I`3GY;mVQ8-Fjxu?X-zdpg=s8e6A*iP3g# zIhSIx_*A3qk6*6v4Pl;?3fvYBfD2yZA6{X*7CedybD9#)3AamcR?qV?d=8tF_h7J$ z1@4vM@3-8mS?dh65o>+-^8EuoN3%FvM%!w7?+kY|ecmD2&$-k8bx*tN()QvnbqXsf zT305jsOxqspdkbsB-BH6Qg@-Bb*58$Cp;TX%e{TM)R%UBi+dIz6{q_b1JYh(qO{s3 zyrfL2E4<@@XLsybWq8fFO7x)2HN~v>}Yq$DFodjM@ucu*_3<7Ngt}Qa| zKq`XzMhg3*t#h@((Q&c#4RwF{s!F|i8T-ncmStFyfwo3^?MXeZ$ocpuJgQ!lUx7z? z+J5Oqt2b@HOmJ$Ifuj9IJ%&&>Xb6V8}6ak_$fqXEu%OqFTG z(xl2`*<@1j?sk7g?Ee*AQp)3PP<%2qZm;HDsOk+(`VJ8Z9n2r@HM;Cr7myI$QA9I- zrYti1Lf&uhcE;}~^t)8p_l9gOPO@P_$T=#oZ%=biq+%H7n6_6;O~5_RYoB|xC%ZeA zXFHM8lRCD)Xhlk! z@MN;b^9k~2?Sh^yW^sq<5i$i<8T@h4(8Jx-#ot>UInsja&3@*)cij27;XAR)N4MA# zMZqm0``|z*^-~xr{TDn0?|%?DDm*#bBzy)zh+SpUh^V0Z?s1?`EKf-NY7 z(>K9Qn>K2K!A{Q_HOoNgq7HXpU6(yk9ezqIj5vv29XXZWy3*!^hO(6&<80xhC+!Lx zQd4->tS6=U`3?|o*e#gkopz(lYr}2S8g|Q=N?r?u92R>?W_#9$%(g_vvkwMRvrpyrIt%QY}&*+vgt#kgmMQ6!9S%aWTQ5ak{!wY}8n-7!Z) zSFvQsRrefzhu{3cfVGDYzo(CBA^a=9U{0^`XeWk%!mbgRn)%r(Lrexx%NBi$PB<;W z2d}VfMI@6X(z)zhonE46Yu){3rtCx(VhnHr#ccChZz=zAeQ{j04 zRGP`r#5mEUzV?ytJeT(072bq7skI9Lwk&4wD;=mf#Kv`%= z0h`ks(SP`%bII7x1s~vhRb4Y($Y*cB9>8~ZhZZL2i%%|a*M9?Egv}sC85_CR3p4|x zRNQ}#9_8uMg=-gWwv3=?RL@3MjO84_p1MPvUR!7Gd~yD2SPL<5Jqrjg!l3#Tf5n$d z_sau6VZ%AM-}-ynoij=sr#uz5#E^S$%mnc76#QnKPwRL2@wT21ihj<+ zc*-Q(-@T@>4p&rm-RP=D82QZm8&X%R6@1^KTYaBq1vTF0yo6`#TiWfN3x<#Pv|HmV zxFAjk1bQcL*s+A_ODuUiH%J%m2w!ntVnxmlrv19l!3#w8VSZ3G+D{OQRu#jtzE!<| zW!F3zr@9M5xLykfMfn=60k-6p(zebaA&2Wq48=^LX-53!j`w}pD9w;xi)sVyRdj%` zt764s$!j8>Vzz)>988&~m(B2pU6QLdOf0FVS*@&mT{#GPdvqEtEM?(C?K1; zxV58U+?B>X6Cjm>Zy9oMQLxoiXIimV(#$A zou5Br?tqvj>Z&%W1+(st1+!L%g1O;n3kLYT7Kj46X;Z^o&L8eTT|bvTVsHsQLtWA> z@6PtXYlqVvcx%krX*6_3!TWE{A%-s2A?{}pH6$=6MJIqEhW<5*~9Jom2<1At`OrHg97tVHh*GK3T_obBUV4m$QjcK9n4$v&CK2 zITQKzeByup1LhMg$Cvn|ewzD0#WJJt_+W@!jACtZJcu?b&wfsU+QTrocTQ2G0~+vj zz^u5>D$>ZCywbR$=$1L2X9cjs_qp?m8V{((=b6QbhoPlD!C&JG84PWY=+Vz&0@Xi% zb}{L9HNTiN47KR<_?*bP;F96MZN7ond&@oPfl0F)@g86Q=}pAyK$~O~2R0jhPH&7+ zLyf6L3pv*5Dj<>?4UG<_&G8etQ86^K_9^6nZKTJ4y!+7NeIp4s3MxSq7%dT?`Tl+?X z(^P|6)Vduz8u1kT&pO$T9O6}jBp~ud)kh75Dv1ICDW-V9UlAA66vOP4z6nf$Z*H8n zMj??Vs}6_`M#DaZHM#iW$J&?1yh7*At!D;S5v|4?;D(RpImK$2ag!+Zf>{`y)hfVO zm?Cr5PB0*6Ih|mZT7PU=%RPwH?g8JM_o6IQFiDUmGDRL@D5p}r9WA+{S;mC?a?%fmwX)HJc9YGG~(daydA<#5g&zzLG6 z-aaue3}Fw2|EY`|v^Y*1XoX#^sd{M6aJEC-Nv~c`Z#^;_1B2|CFkDU-piIU>@ZqLO z%oWbs42vKMF8l(A9Ht2t7l~~d7jfrS@z8_k&ko-=(^`-TILdRUh06qQOkw=wl*)aA zAVqK3%P{9k%V95yyEfQHBLkNf%Q-Uu>Wx?~GlR45d}cr^jak8xS?E_RtqtlnN~wlp z&PW5LePTv{j(lh}o{Rt<1C#N`@DG3QJnFXMxdf>-(2x7B zntN8C?2PzL^c&Bsyoe)>efELG7*Gj_H(GEcEj^t-pQ7X{;m{q7!nt)bitHY!KI zWPX|4^RF6#oh&C1te5Lma>Mke{3_2IBYwd1EsoiVe+JXXF0Vp|E{SMB zS2G2VrM^dwK2#S*(%t6wHV+%R?qYhNlwyB9)em;1e4OiB0v1$TnEe%Y#j;4eWaBTl zXAgk;$?2~!13e1b7{()TLnr;`q#(tiEHn5fGzXKHK3NZw$74da=kaIFgcg;*%kd5M z)g(k17@ln$ofsD9|1s}K-X3w-`pXmV(lg6AabQ6Rm{k-4oZ@LBL$9HeIg9ShF9mj` zUibFa!PnP3MO!VVzB(saI-N7iysuX@e!i0$%zTxbtekQ)CX$aMLOUNn$HJ&=an4|g z1%AP|B-JFq@HG@_P0L>1&a)#n>yraf%h=l^CXSIn<}EeqK?6wbkr3I+kDD-fBpKB+ z;yeKb25OAkGWWr7618=Ykuo|u*6owx2uyx|hC+zT^}mj1TH|B^Jz%nTSU1=7ubLVRe!o65E z1dlEGt^|^idSqU#mM}c@XV1@?$P#d_2;kNdP$UR*SE6E6`2Wb1&l-$A6dH5qT^fy? zs9@b;ipuOlqyW{WeGETtN2x{1wSl&Z)Ht!b==Dx@87H}$ew``oA?O;c7mdQ!Q*Hr&F&pyMK=6s5$ zrJW02#Lc+94Zo#V_4P^h9=R$kkeu=HIhZLHe85b4NZ+!>j#V1Wajp4mxXFx@Duex= zSA6l@`U)XD!U^%FjFtAYVnffWAMX`zch)5PJ?qG4)~Dy!SKSUzu+L6{4J|(EGwfX_ z-mz8Qm;FW_ML%?4yl$;ImZ*gc2rCu7i?3e85C1#9Du<}O+{AJ(Y|7k2OAmq0a;a%U zM$j~pGm6`KSv{1!r=QYkCcfyuqSAr~_w=>SZ28-|OY%wg z9@opW?w^A_Dq8aJEY0}r*7<6&W}J;1&_>5byuVcq`*ZKB*M~7rnNfRZkH2KFmI2W_ zD-MvUI0v*;9%r!OZT4#L`^6LRtFN<%=L`egGW1~AuK6!!e9DL2d{57`Q`WRwj0n(7 zC6>+r;|qpQS$V@5qZ~4LzI0n#8OIa_j}pm)o7?Y1c%NhUHFBG`k8(x$?Uvj8?Cs0D zm)%ol_*F`0z6S{w)_8{}55K$_7_~gsbZEW z-Co6%m`kyXIO`zNxXQ%uG(swWj+iz&n!a@IVG^vH?0dZXmCLCB9=_mN*t{;7Ipr@g zz`E9gPvg#FptB;$yERz5?&EG5C%Q=n6{3sg+|kWIk*Z0HH|X8t+N!c!TXBuZ*87Mp zxobhqr;K?1VY7BfZ>z5P^VDuK^BiK9Zga@+fdW7B;>;Mg%-{dj9Xw|e#nFgJFsW@sxUd^QF;LDDw=Df@F0&>aO;ETeb$uEdUTY0;Ejs~)D#h~?G>c4s#8HEIl;yr zmgQGkxhL#^Q1=Dp%NvSYW8_8naFAUu(yZby%Yf96zk#24fBq*rZq+_T`uz8kPnBi%JD7ZJ9Qoh!#Ojytl;4dUe#^je#BfM_~Hz8V? zy})3${(~HHI2nwAKG|!qx9+PZH);fTTsUP$=5w#-jFc+$=A;@VwkX9#3yiwP$C$8k z*U`Bd)@bYWZs(GdaiRCnu@WeTMcHS0&+L7c`q-<^0+qfczUMqwE~DDAOHV%aE=0H^ zx^Oi}qzPNhhH&lFxn!)w`vC;oitZo&+xITcw2}qjp6SxTU@7_9VtLxn?_+hICEsyx z0ziqFIrA&?+%0Og_$}8QynyEo{gyAp4R-5y7{aT(uo)mu)gVOgJECNzSLs80v0kOD z*Kw~Hx?!w|720Hi_2Az-iMA&wxtM0~7wdEWc0)_;OzB@$YR>+-FX$Y=ENOq=BfFl! zJ!o*HMAnc;oTrJ~PEo60TbABwf#{$Bg1TfBkKWP?lQkG!{yN)5P+9yj?s;?HtETC$ z=jW3@Bpbg6ykHXsb{#0`0u-D|Ns;?oy~h=1so(>QIpx>P%HStP#UU<66sR&Fr6KxT z9wC8btRydy5~fnc zP7D|H;>}AnPR6XK*~c<IYhrbS}AnP;O3RfF3~+}d*lK(ne(#tShw zP;D1G_}U9k>`^QHMV0tByYK?9{Ib6i(3**OAL!rzchPI~Sdc&j;kzv$4@sOQo(;mGO(L0DR zBYGEN?>t3o>^h;yBt@{)8OXy3<3LT$D&}I9%-l->}Ob_py$@dbQyLCc{7~i zjFQ1VGv}m^MZ0XotW?0+zsih~vBuMv<1FgPvf6DiG>jh zO<+C6f84%;-p@|RnpU)nIfkforIWDI^deqU{GyiiHT+g+w^7W7<5^?<#^XQ*dT3Z| zi%S;QT&`N3YL|gWt^m{sO@PuV(>b5Zlnrj7p=T5D{wP)^kyEo9!zDZ^lZc z!{bFv6#G*Fd7v%b_e><8nX^QMN>%n(*4yZetj7ZN@xB`w!<^a9E~p8slgjoWz*usr zPt<~6QR(JCm{7wN76K(_f(v6;E@Ke#4{Vqx$Sqg(7R^Ppo@qXDV$}9WthdMw9)>%( zva4i15P!M;Z9RaEVy&2T{N%lXW{N~xEf;UkfY{e07wV0bqk!N-pq86?|2A~9*ryi^ ztEdBYIkB+^{A8FNx^RP%jc2t;(Fb3@P^s0+GT~;u4ID8L2YU<2KZ7-geqAkp zg4r~()`C{5#=;zlkBt_+B2G9J?vZlP#BSn#V7$;j;PKr$n7wh2k;#v_T>+f@S?<6xiKm6tpDZQ+@%;UGiMnzqNNYrxc~n_W+m8}_^&{0{ zxa|b*W=}m6>--EZ=Y!Bq86H_K{J~d&ea~FM-kUIv1es-wTJtO6S80z8ciXc}?Yc9e zQ({l_6F!H4bpE-~kB(S(LEPiVF%P~mYUUo45%A%QX4H*&Qjftg?RkZP#>1Nj-arJv z%QVo6D|zt;-P{te%e0XiUdsM7xSsmI${QF>AD(f>0}}1*#lpUySuq*ml;BTRBfX-m$Wm@jGwg8o?lTfRWD%`QRrpILAm#uTH(`bCzdgOn=gK5A+#an zO`l)I$*jdr(16-_Rp0gw6lFFtO4SU-Z}J6QzW5R6NHVB6ng9O2ZX0Vwlry&A&z%RWO8mU} zPhY@a>ARJvXB=5iJn>@1H}$wf7j-}oM`(2Hn-m%x3_4M{#3X)a7%(_{_GPixxYKTH z7oOw%PW7)Ms>y_$%GS|1W|;FQ@R|UDeH^Sf)J43fZpjVooEC(Bf#+vx051Wl|amDm-5UXGml-8 zu;^LyZ20Dy)n||5StdZ(^eEJI^e1j8=swJ3T}tQk(OZxAxOE&rmQlOwnFoH>&U_Km z6*~M&TM*S~Qh>@a&gn&wVto~V=_9{qUxpv8m#TVxS*9Y0e8;cB>Th*JM= z6n3QPs&=sd7ysPyGS20~a+OhYng$O8Q(G@cjhFobb~N;G_7MgZWE4ZS_AD%Qr)qf7 zlEZi-L9(Yv{cwwJ)i7s~_i2drJcpK&yj7B%E)}}g6BDqk3*-Hk15s{I07fUsGI`Yo z!jNX7>dIlO)M4pIS(onaN0nq(YS3H9ZnR=r;>Nu5(_(5HOYjmgKRjgu{q2_>;)D}& zq5b7vT8bm4b7T=|pK&)1pMqg;Q({Qn1EXG9cr`H)Rw+mbqvo3kbGHxmqE^JK&@rQm zlfyq(z3gl<&g0yBI+1l&M2Fi%c3$?!|#Q?A-6wG0pk z*`ZHK34Ff6F}%qYuL&)^V!;pN`>Ko34B8CM4)(!Mu#$tkh8;|=;wpRt`8w;x?qpbu z85$Q@q`l&)r0E3o{tQ^;Xy5<~hAM^izKDj3+n`v_8I^z;Ksl`rTX_DqL9!Efar z3NKjawNXW^7#O8OCPSsH*RV3<@oDUqv>iZUroY$o4kxTn;r=;Of%3~!;ANr!V=Q># zYfl{tXQ;f-a9g)yue}IDg#O3ch7Q#PWX;9%eDt;%0_wtWlMhB+UA15Z*-s6+C9vG8 zMzsW-Fezb%NZg7Tn4Y_}8fG5Z`C{x@73@m8AT2T;6&MY?))-mQtH$YtjWk05vstT3 zw-K@O!bm-0%|_WL#_Z|*^euAc8Z(%Tm@1*m!0-my1D_2GC16<2P*>&8NFkbs7isE_ znatm>;;fRzj^(W^;vI*hnqk{^QZJDB`(F_=6lQH})y*`KMx)`-Pf9_4S9`UYS8>i7 z`xJ)!JZZg0F&w~tYj{dD!EQja33^aRGBHXBt>*AVO1W0!;!c;dKfLsO2Mf)9&;scq zOX4O`N3RXXE^^0K%t}Ww%%Sb>$foWarja1Rpd&H}AIxC>?Hd#0Lo)||0Iw)3ZErd~ zVmEAx={&GAI>ju)rtX>x^8{wnq-dvjG4(8HH=!F_<}{x8Vcj>+YTTc~rEaj|=ok>e z`xx5ekUVQ9q2Y?g{9@P>pPIh;lY66@;x*O=A_d!ils%b&#?5wqH$-Ab0)-UR0Gg(r zh-~Q|Y6u3sF1^g-m`*hID$f?%J-!^!Q3;1)s?Aaup<1eOY8i;O8Y$@YG%+%Dxv{Ii z)8>tLR$^uddSE46rmB!N6;%U#zp1qEtD-L-Xms`u`x`li9HfGgG=ew;4op;Z*zn|~ zj|-l>i-;l-&CE_D7umbGAv5E#^fIwa6P+BT@2Vpw#mqJ{fZ5Se8VG&CGW-F!It-O-R!0*6N~1NpRrt9<;r>?F6~|J zm7>2H+59`OJ=VMIhy8>lfVcTWyQ(fJ+X6iL*c$ENQT^O_%%yM=mK-*Bz^TPix>r9G zT0b-HHZSfjCiZ$~KCxiH=js=sPxeAq<=#ivaUowFz(yv{BcOnC;qK^^hU)*Z#Fg(C zd4Gf08Fk8;Eo14leo7AO!soHn;rsX=BVfmA%bKHl3frUwbaB~3lO66b@}`G(Y2XaM zSqaAdFb9FQ*?z)2&7UcM+x?hqM7E8v_={J$kiSSwUk7KIcq{XHhjq#`h_OsV@RR}5 zSQO+nfU`xWOv6~5sqkJ~xu!Trr?->(pnRkcL$2yatQEqn522s=X_Kz4<~Fwo8{3n0 zFUoc6Ii9xC5rAKctA_mPx(B}>O41>|O9!~~KdbpQY~I&@VyK)V<=R0|OJx~0C(=)X zP3#im=qV<-@O5V0&H`_kgE}W17O=I_)+OTni}_(v2;bPB5$^gR5>CB8^?&Sqs}4c093woKDKmEdo8FOuiQa5`}OGE#o0}!Dt)!9Uu5z z>cN+)4xz8ar^y{`_g39`;q$&z#nn;h90GKa_RMeM(0G5)rh@^pB;u?g8~ zdcK8*J8j-TXBdKf(cQ+PlvXmMrO&E~yhf)EkDV)i&Xc&(1JyHdlpkl0Nf%Sdtw9Hl zFSt4-Z^nIt-=UJSV<2Mi|JI#flI)Q(|df$6wBwP z2bB4MGZK6*A2b-Y%MC8JPtj((w2x&4J^Pq?S-Y4yzpmluqtJP^=lS^j6^N$ zuvd-C7zslJHWp0nJ3?B(QOMIr>e0}**GpET-(A{Qtz=&$dlWl2DHSFoPkfMB@q~Mp zou4t5IFs0U6AGj2{oA))8kaHFP>q@S!Ml46>q_^DxV^{`v-aurQjAD4JCK;%VTfBKjl_t&_OJ6S%g z4W@l5Gno~aISZyT3TFO28=tGLx%pK;x6QoqJ9VYOK#G@L700hfsr=i24l>2wq~e3X zY1V~mL5Z|MJj-|kA^0vbJ;nkd*sty|;$xo~nVf4WY7|x}al)b{j`5_7W&8b{)Y*xg zV?8i2 ziuc<4K6%qtkErw3B|XQk;Cqm&*Z4pAQm?~|CTrL9ktu;%#n&$Q^^NftYGv*x)t;oW zrmdd9#d5#xq!dz+Tjx@O^|KZ)WFT{}#y_jdZ|EVO2xU)Ty^!^)rye1ui*g8?=xP>- z7(rpu$3I)|Gw^=LiMH!5Txb%=brBKTa!YNw-Dj!i>6Hvsu_ER zH!32_NAiFqDC5U_7Q-E8o)2G`3@3|>1TRNJ@JF56tnnY52Ho3u zXOwN{_Q2C%Vm9mxb72y-wo+r;vgCMj9CTI4tlKOHGULo9cdz!6H;r6K&$9;=U;JFe z=dvE1*A(;F=wT?Ryuac;ek!8k5Bqa6g=594=QOM3QGx#xwb4cshBM~qIHPF~Xr`>- zL)gC~uK9fICAr86?dbc5@l>tI2+t5zWfTS;XB%SV4#{3`%(j7ZmQ$W#oZqEJyUvGE z4-xp4)4|Nz0TEd0YavN~qM_zO^eC7iT(D8GB|A0S4G@g!glK-EEB%rE_Z`g1PLnVL zd7`XIwxzBF%9fZlHsnP=qF(phT|b};i03E)B((P=*7ya?yvp{6C;bdt>X2BTJ6q_w zubGujBoWMXKTy-69Kt*hENtxSAYIx$>Tc8EnrZo29^v-M{z$=v}tE!)kM3oTVk4<1_i#xN8f& z*jJFmH2xZ_oj ziv98E3LK@(Nm7uCRn=x28AkCWzzvj&_x+rbR!_a5sRL^ZrNSzZugbx(s2x2mad96u zioxx%ku2_rjPd@CnI|SM`5f}(0+W@z&mZ1y@}#dHdl}jWvv9C!C9FTSxYmJMtU&3^ zldfOoclHi{=eY?&CD;@*Sn&!%*R}HpV@)jvsdaEQ9yqqvYbf>gxF47{>pI!(MF0NF zSfAzAtSOb)FhA=9b_r%`$KON!a>l6lXm_(fKYL*3ET^BAN_R6|XLbUKNuT)8xYk_?=hsjA?S-L0sEN zJ&Vq{A2F=X-1MF*SlLnXJW*#v!%f-*Z8~73Rv1{X@!4Vp&H?N-Kuz%_d+?riXPJA8 zlVv`={q=*+aTSZ>x5DfU9OhHJP$BV_Nw@@Peh!d3ZhCGe80PTmvjljrbn-dhZ_~Yv zLJg_F^Vt=l12s_ZQWc|*ekk*lqK|f>5oyHC!7&jRlyV&6-xbx%m=^Y4k1s5U9FpYcb;|R zm$P^>OiI;A5AO>zVGj;&Al)kd=sk|Z3g{qA2jiD_>H#6wiU13Cs<3sZDv3wo|N5M= zp2j`L!2yxb5Uh?t)YDmf36wVGvF~OVov}&2r`ba#7gY=z zN}PoJG7rN^74l7-Wj<93)_#i?*7*PW4?Y9Ry`mDZ_=be*FB^^4q~Vhvo~YS_gr9WZ zmF$6BwKGb)Ty3}QXmUoZfE2#1M%Tq!KPqtW5E+FqceEv?j@tWs+(aujEyfdS-r7V= zT=P^yGIShbKFJEp)!d-iFES?cNa$UNbj8ZfphUQn0N%+>0;u$9U_Dlk(w zl>&gkKd*W@gbP|Hp3PgOvbURBTrU?z9{r$R>H?M2w>^J2b#4sCSrB_^tTuYLv~}rY zIxF2|4q{+orFEIGqolyR=xFCW&Wcp`BDpiJ83^i;d%5$`lb0c>@KHw8fI$m5I+`zf zclGeAS6>XA8)w(vp=+`D`heV05083>ukv{u<-Yw&3gCl<2rdK}iZeg*Z+n}w`d$V+ zwe~(bWBm4K{^nZuU7n(vMq|)g^q4HOCCWTfHaMx`7lI21;eEEWBzE1XZAenY9_4XO z%o0V1CCWx9gLIKx@2Tm06g9$ni}N}M_QK<=V^83&)EPc?P8w?TDh5>vy0bEgviKIm zpxA}^#5-dfs#cp@^Zw{wW*DVx{9?tDuEk*th2f2wik|Y~g(Al3sPwAoi0MGXZx?Z+E?WFK7gx`(4yy&gQCXm=TbZUB~H?pMv_u^Vba0r|?3 zFZ4nv!9RSsQKxC(T=mi8q>2Ss^;4vfymOS*NQFf?H*0;lGgix%l|fb= zMs5z~8Y?B%F+U4&jOF%qevMdUUEAd7wd|g!gCorfAWfMcq69TstF0^E64wS+04W+D zscR>DHDu?wjX+mDfYmE8xqC01S`+{qse9nTTkSl*=>QP8rNK+YAu3sAW?=^EAvhz8 zW?#0^0}&GOcjB+e-QY%77Ga^liM18MlEa2#I}qFH=06`GhTzHPA1r@^=ZDw4N4vBf z>pmQW5>@zqs763_zwt|pRxMBKoNH*nsVZ6IJM>1K(Y6ReePg+1q;x_XngD1$kxYx^ zw2@5Yw9seAXL05*eAfAF(*gb(x5uiVe2j=nPMhjTRRW%Ay-O@{6RGDmWWKAn(tO5x z>fd2fbya=dY8Uka*^KiXz)e8Un4aX46QLWZU1YNboJF^h+rGEr`>y6RQI&{i{MPV? z2vA|gdP>?w^6S23=eM}4{Zfx3zm2}2YKF3+-PM)j?!X@^6RhGDsddG1$NAMmEkYFS zIPM?ZgA8!m%U)l6QW!O!iyvUj@Q1oN<3Hj@^pkWdUj4jn@7hodO=OtF#90ee?pJSlepj(1IMn|Zp|Ed27js2(vN1A;cYmN6tIy09RnwW3ZM64GP z!r1TJ1)^n&!hNL*vVyUlG8r4czlsW8`Gr!Wa>KIMA_8b-;)z!xp>>4>s&L4*7jou1 z1W?F>#fJpewd&an+Kj917rjCy6z$tdB8Nz6T6yIwFi8IaSeT=+(HUc=-j+3Nme7pqJ1IIsDC={Nr7}ORsNy z7@p?dEF6lykH7iEh-GaT*&_>0mHGwD#W(zv)dBI9wK({3cHb@;1@MOaSTSNNwrz(2 zx)Oi_7@!+lnq;rpx$@{+E-VoEjd=8#ulz#WAqFn^vgQ0O%FMa10)qC+*knHb_C`jc zW#1XChLIb(r*e zvHr$B@9>?y7mojg)MUMz+~-BF&030nKZ{E<@}MO{MQO=mvgOmEs((B)Y9xW;z5DNX zH#)#LWjri4d(iiRC4S>XzzVl>JbF@g?0K~uzrk>!Lxd0B^hftl*J#RI-|$;Y_L}R) zvw^HW4J)~RTaS=y@9ea&?Fo3)2h369@Kf+7Y=V72F_pVnFQ1~P?eRKM??K`Kx@tQr z*rVp4Of@VF{vDG#$KgvBNrD%6?HcX)Br+~xhibqQvvGjqY;G~o)F3FaF=p+yFNXXN zPIo^K2Of=RhSjdQcxnn2r@Uveu~!AijPVg+lQ+>h+!0~s&pjnqd^s!U+p80jCgl`f z8SkMB{8{2%dfday-^ib4jJDUD7LW?`8IRoKC->x>#edJwaXK`7`Puw@pe198hR7o0 z@9}~-GwrP@pRF~q^uWrrU+|J^zHB_b#8*?rr;yqWwr3@FfQbviaPE1O+ky|&ft(%v z$(b1;0fV!TDChmz#UzcldjZ~Pf&fIZLl>?@J!Gz3WqQm(^XrUQRKFX9vuQvnSX z*M7ik^)Ihnzgv6Up({16JucQy;d}1yZ}xb}{!t=5CbPChuQK+$2TyBz-&H5sihJK4 zY719`Rm?=2Nq|`=<jBQ;7O^*AdSL87>o zHG1r3gzV=9|37W-ma5rxWeMx(5D5KAQ3S!kh$J!LAdrfpC`52DMkGIlDg2O4a2MPK zKe-F;LUlo1@Ke3}DZ7vzD7$KmG3Q)!&UM-Q3n}xHbng1rSo1RGWnDIcl8?(ukRCPG z%q6YiE8dO5PLXxx{LkY;%hD6_K9qL~FlUSeRiA5RiWA-juj}?_a>m>?^?8xAJwqZp z1ZBjVE&=AqagQtMk}U_{A~>(5|AhX)ub~1a>I4tHU-btdCxHgH!RETwGyiqr6*QA)tKbyJI7@5%R>*48uF6t5%N5vx&mX>GBm{L!cXNFHyr|Bg`%=dE1TB9 zuowFiNTzNB*Z+wBAJ~$!er`{|XF@$FZ~)%ECm@XlE=R`yL;n|ljz55p%PQb*)tVdFcrZ9WgS`DSw~$Tb*&r zZa`QKn1p_Pje#?v%)_^ren0||e{a#G4x(18U4Vh-t^%jH4a}((V09zS0OqrZ<**L_ zQ~Cg5uRwI{1DMzd>41iP0AZ!R{$2Y36ARw-0nC^W)#FHiUD3pvoW%1kI5%3l0HICK zGcR>I^to>ZL}N!X;)g|}z>>CQShV+OWk_~SA6}y;Ii6bqK?oPE0N~1Xzv%0H`r_yG z0m9<$*Xqfg8#nBIfMIu;_gPMU%aB^HzhOx01Dr`xEN>*)$N!ujz=-oNA7+*&b29U_ zZNPNI4OPSXC?`|re? z_cs-u*8TxQwf>IiQc=}bMlQBn|L0(*xo4G6>x53|>p6y{Y2ydxF;xfKeE^?X-&d=^ zfam&t7=_t`SwlrLETZb=7j~|h_hB&1%oTpw5%3MAk&`D++DL1e@0&;M)>*b*XbTzt zVsAj!3Fsx{E+LT$S=;UD%0$YY5ixh(eyWWC@hZh8Qag4XIRqlHI6D-i84 z0|00q3$NSspnlz z;g{Rp2E|P`g~U){7%==1Eoh5Pc31f}>ebkX0KbgY>z}q0 z!5R0a3t>Kas9i@MzL0MEgYn4g7jc4N>@gvWJhCsLXc|e)X1|GBV5pjoN%=zqojO9< zX@jZjAAb5S1;ZEmW-6=&oJ>BDa`3mN?3=v`f$^(x4lwl2KE-cS=RbAFg3#V{D=u|D z4$bp)fx-@F*Yg#tD;{8DzpHKd*NKhG4u&lu+ZKjG$f;wC3*5ti-05QNjs$Hd4+fe~ zZ@5Sfo(eKO$CF}h;J0FA(6bliVf5B4lMeBkn9N?#rq4^&FL@$~Z zayR`yD3K#$>RiFIkbFk-L#O<`0wrU#9T3v|WmhCH85;YJ;3`1o^fm`oG8t1dclylT z5R%``jtCzT8`u}B4T;Tpx8)>P>^f`=?JnOLvDn(QI|4X1wbf9m3krso`pZ2M$ahQs zgq6t4UGIb)gJxfw4hj+B73H#jQFX?;FQJvXFZN3y(?H%f>M7>B=w`e=<0t403gwkm z0l~SeVrEo65=lijSybIS@fE74FHp}RKf`@GM6&6ys40sQSN>4G6JVU+g|^udS+E$#vGnBp`4?M} zJ7YTLkPa3Z(2X$e1-x$qx3L58y>`nq3w!1`w8WMf3DjcRR*j}KC&vg?rvP#%ciTb zs4C#$^Jr-R>}0#Cn`hml=%;fpNB8>&cGeNM4?swGO@l!@&{vfOYYg5<<{b-i5=OrC z75S&_e^{oR)#5TXZ6f2?8$H{~ZyyLh%}&YX?EivE)WZ-v6krNEhibtUO3FOqsjrxa zg@zoqo`I%-tbbdQ0t|l6iWFmS>w9d}NjdQBgWoNbJ%{WyT*|?4V2<8vSmcmcm?;fe z;G6?QBJ)6?`xES;?{%;n>X=7H<&FaB-Y(`IFJ$B$h6UI{Vgp;_^+sY{XS{JUbf(Dp zpzV;gQf~_|)0{-(5}LfV`cCu^CT0Vpg4w`o@}#W=f%lx%uJ$!RD3?8hn*W3!|2OX7 zjqZ?j3NCF3g#0~On7oYi47j{Qu!shsfH9Xz#f6vWriSkC#%;QrmX-J=Ca@d317~*A zK7td!@sxVn3h%Yn&75UaE#Xm1yX@m#j%+s$)Rd54IFl{UvIcPdmpC4fAX$WV4#l zrltoH%PW^~C6xXF2G#c}*j>kowRIsb@kXxYcHgiAx9~uzHTx`-h2JpmVs{7Sr~a59 zXYfn${zbX>J^f*L>H(XUotEgF!#k5byZiahO{N4?id!EEG1Zf^$}0J=hClru=yi zpWlS%)wH54s>EyVMl6vnsDfUmtkEHItD=`_Z}uVllD*qg)qEv+4ArXT1&b+N9}k+Z zI$(|bA*&`yeN!cKAA+dNj(Nlwd=daN4Krrn zYRzIcKR%&ucmBk9bavzscT++kHM$RYCda^0T83c#9Sc#+x-Q~YE(@-G>Iv5Q1)J# z06?TGe{!!YG)5oYW_&7gvFpM90ip*{E|*-Oeto9o~)v_Yv)z!qmc!5c1)96{<@j{^>hrw8Nh@Tt4ed`O z3>}JhQVO*oALtsGKSLof8QGHSCJ|NsqwV~+tnWG#Wo^93#p_|yLKMXV3z(NCq{18~ zLu2UWIeiTm17=S-?j_J|NW1EMYr90@Uhd3;Derd!Pzrb%DrS>aHu$-!bL3ShG}M1D zd!l1)II4@EdOHD;219zaJ|sqBB0lRsc4fSo+mEFt2%R$8jXiZl^6iNyVPL&_e{Rf4iy}cMRn;1vDm|#Ptn}k=k~h;g za=r0}Iendf*ja<)%t_stsqLa40swC*h|t?HP>XTTltJdNayidJNI?{-+b|NZYkJG>s0HT9Ujq!kxs68xt{-P+Fw-uTb6?iTh$B; zWyN2aZ!*12-A~N+qKVdcy)NYsncuDB|NmIYzs7!3{nt4VU2&hJLkL|JC0U!S=kw4X zw}~uWfXa}&^?OCWa~|3I0J7yDh`8aLdI1zOvM79N(7t1YAqmjAT24ft;+}};2Q;?c z^#+z$%$fwG=*+{gFEgdE;)mw(K*ZmOJY9(R-f;q-Gk5KE8uu_~afGMtz|L}gr?>=1 zgsnp`urXf?l?u3hLs$+CkTIpCr4n04PUj~Ws`L-#o4NwwRs_(rP=5f2K6<219JkoRZxn>&nGSe3igUUyUy^ zz+b7BO}kMSVJHP4#2B<$vl#0mq_Nl%yxqr4YieR}oQdu>OWIjEzch6DWsNg_Ks`dIVnH&}fiYkVKD zvyHip)?v|K*jHf6{Al3lfu_fDP`o<=GG5GfnlrTi5!c~ueT1tcn8oNH+>V{k#llD@ z2-i4rJ?krf4uP%4gD-4tL|ue?BoQehx}l4(#nkg;28M%-vYSx&!k&47?g5x#V1ixj zYh#u2!y>A3Vr8CH1xuMpKh{Vny#unmdIv@ZZWAxpeFKT)g?~%WwN)%ANhTqqfUC@_ z^8muekUjzM)HncGUS5#=^^Lk;cC!Mcz*VWi5---tcvmEKvSI2#Zb+VH=K#Yj2JM*m zNx1kw>}@;onZA(sR(%~&_*(r@W7awlv8_G@odHmh&DZeca&rN^iq*leniC58Gdl$e zTB}cwh4PJ4C$DqOp4|eSL<*lCeTrKQ>DP#w?CY%BFnSqXf~_J_42u?E#ex&Y8RBK$scq zEbHCWXX_4l27w#`s7_G>ZqYjhuxFT(FwQ~#u+qQkabT5h?%QFc)BusI$a2`CFNgt|R7PuFaSh@jqPeA&O`tc7Tht<}70b2{P zj)P}quwvgDuoE!}tNAi(NzW5~_dd%-{KKxXWo5s9z{e3a%l-i4#a>xZXcllKKyl-O zu=C7>?a&1P&YN1Nbpf`~1CX4o3C?itz-9aht}c58o*$8u?-$tRX&BjSe|)hPU%4je z8Dg;?EAo*$Gbh>C6=6BKX&_utQx@N8RI9-&^L6eYyW;A;fk)IP`e=;>jN1li}UyNhB z3G{XR?Csb|fEkyz5c^Vu#jOPFoQZj8z_#!HW-r08K#raH@u;q1FM-k)qy?a>(yenB z_(^*S+Q_iNi}5jHjKAGWAaNTAI0XFFJd&nS+Jz+#=3at)Vr=gLsKz#aAWw+Xq!Y?y z-qHFFs3H8^N#Hn<&1Gj;N{JSLY{J~e@MQzQSh?CO?}}Oac3Imc;|iM!VIoQ$g(Z3; z0Kb6ShNpT*fI_lPfIrDTd86(nDEfk}RK^F3T<#@snG9ngh}sYszqr{;kbcbd;0JdS zoHQwKn)?Ba)iUo?<7oO)l%pZAXi6OjP*T1c(7;-lNA83=NBSx=b5SJblkVVqqi)Ln5<+czR!; zc$<0xcw3+CrYWEksxEcK;y?}&j7}n z7^MRaK(CJdoi+BeAMg=>;V2NdGcTcl&<=pU3W(7Zpg6<&XPK{1ab|yyPzJ%O&^X|%Ifj-ZI`lKlT^n_CcvtkkhGDd z;ith+{-t?y_2qSMfOyZ)%)NnQjlnfu13^j=nvsqHn#oZ5#&<@~LX5u@Hwh?Q&K#`b zWBobyE*yFSms*#^T2Fv>INK@F2)1Ae)MB243zM%$o;LOdr1b9h2DsX$y37zzOx_<@ zB$PS+bFVN$Yt$RN11k?c6%MrCKqwBwLQRDMiNl=LjAy8)#Dd-4fRq5Nx!!V^af`hH zAxXPA?G2DLU@=#F15zLC6>A?L@*uE*Ma%H0JAP2yY&`;+C*x=JF9EU-RLsdrpd)PT z{`BQvu_KW6>KEU`pNR;)g0T`@`)=Xo5c$&|$b@!9{TL1yhI05r$HZZB{%?>!y3e21Jb-%wtT%6a0?1pi`MWXIuVl%JAltDH#F6R)iTGlK2ONmkF~^f*aP^Wd9b>%5oF<73|^ z;s7H8Yr}i*5b5LnFGj!e&y3x{4!Fm0U;snh&HV{*9RsSoB*V~hWIJdMl0OzPz-_v3 z@Z?*U1Z<9x@(zhmK-gOt8W_^wgQz?e`j6Gal*X+c%pFT1+InZFs*{NnvP%2h$j2hZ zL-L^tE(LUJt8cLbhUfor&sEw9E!MJ!YfoV&0jbdM!C+e;PHpBX2aD-@a(snspn>OD zerFj4!Uv)Z%oHC_{6$Ra^edlW=z!C(Xiy_1Y}tv_Y#1Mju6cBgx5iz>_7Hoi?q1y| z*h>rGr{L1~>vK300>ZBG{ixK?6=PPPu`#oKClELoHBG^tCo<(BWc2>1Zsz zpOFoPl)f9!d)M>oUOV5|Dp09*{_y(46TU|ByO9*G8pbQqFSCi6>b+1V&(+$vW3s!6 ze=DzI#;GWL$^-|~$g)2zwXtx_v8a#^gakR#)oA5z$_wnJEUx=uYCeZ`R^<$@x47|l z-@eD~5*Qn&I5q+mCN!}GYG?2QRcadEG2#2-xJJ&5iqSLj=DX~Y>q)$VT*=}g#Z4!d zapA)-vYtD{a|X3@pCj|1$fhc)XUf4jGmw&>hz1EAcevOm2Zr$)6_xQrd*w&4vy2z! zn;#!wA?;w=sD!x<*8=gvAY~ksyl5XRV?D@t3>e$dn6HJm_W_wo+upTp-Vzzx!;#3Y z3g4zqHs28LJab0ol0Uosv5Ku4SKiE@K(i-}H*GUhvwr@hZ{mm-WLA~1>RQz+J+fBw z@(8ho;vo7`+$o8O#`cc68wVgqNW+{z|I;^OxWE4ye)8uQYj}IrH|S}^joZAtPC2WM zzGE+rMPEZFeI1+gm&M~Rs^)84<(>SLcYQLSMunVj#^y9_Y{(Gf90Bl``0WJZ>v4yv zaUWy5b!30g&UVO~`TBY8gSDX>Ri%XLI-cEE75;Sp4t*ru{|WogCY0-0$tCH_Hy4>AaS_lGK}! zjNRt|!(?*}r_X00g}KT(m{*#ViifCYHOb{0$mAn3*z+#;7p)JTCB{Vo5STJqdI?ms zN9g7*eEhJ*$X*?QH~E?FKET4bYH~*6E85R4u~|T6QTwDo`hOTt>d)$+k37i~yed99 zA_<*glCWJZh*oYH%%XC5@~xqyy5H6+o&U-m?=`o-^YX-@=z_|4mPr^5e!lf|N0V5r zHm0{%EUJz#G=q}koofXmW<+0v;@w;)S*0J7WZ>Z_q2=1Co1J8+7gfn;L`^c7`vNC* z1VlSDLr=+tVJDIO!>3YPPgj!dSmB9RN|hkxQ6qmoW9m-W1K@4 zru2QQs+mPtO>L+2=WG`11!71t9;lJ7rgQ@O(uz`~9D^T&7F>P&ANa4m20^C$j32ox z-~onIb$!i{s<4?L9HQKC!xH1z(PkE4&pr_|qWXXrzUMi=CBxUMHm~=EQf(#-PLBt=>l&UDhDeIYb*5r1p zL0xPAoji14-R4liW`=yJ$e%_em}Fb>Jb)`zIf;hQuSm|kgFfa)@zpj*Mbx5{X`3PM z?Huqotj@ye{)3)8OWjk~BsACSr!nyA%vrwgm~nKd5C388U5;EAGHlV%U? z{H0#NZdNjWFvrqot;L9i9T6%vv&ojVZhMDei*i`89H#BiR%;|G`z_IgeuXS-F**3r z+}*176StvqmoKbZvf@3oG>`ibtHMn`UFMxOwRLQ(<0J4Sr?)&SvQDe!O(T1&MIIjB z6&3wtvye4VjCitlslb!H6WhaR&q-=lk^4U2Pm2|YRj{@P5E8i8^{{}MqV6oBuG8@z zJVZO3Il-t}m!b;5I3pU1eYi5tf4Ij=f`~DxkGNU^R!YmDf7nMpj}L%ZDQ&s zj$OwjlN&^JFWKA!uv3B3#ubarJpk-P9@3&&u9Q|1U#W`PlGM83vK7G1OCiJAucgD= z+#qgSOA9J?i;B`L2SE0&{UbNGvya8Dz!M)wP;4ps0;;_m!@k7o_u1F0ZSm#{nl4Oc z-x~w<9qvznPORP722UBD!+Q08%wUBPgG^k~#qz^_A41uo#0W49vTGy4 zsD!)h({JZqgzd3czPgJ7T6+-1ypIYRf9oe)2F^)lyMBZ@?p|~y;BWmldJ@Jlqt0iJ z{a8<;dhlgmVuTMlN0N;Y=C^~T?|T#f^6$`_Xg)s4`q-av`+#Ze9X;I3J{P&~dlZO0 zG=oQb6g7_lf{Q*yN_Ar#YE=|$>Eqd}!0O)T_A079z?aYcieV1}CB%<^i^UdJuY4JO z3$Xg<_bn!TzOn|6F;|Zr_fTDiZz4Q&FA`$%QuHrSGX^hh{U5gX9w(o(3R>+CJq(l6 zszB>v6a}_g!!SIS8>5h}HnpIzT?uB)D-P>u^w^fRlzk0Yd1S{A^)-rI+>VyzEanSd z2syfKo4;e5dmNx}+r41fp4B_3v5$Kfss&y5IfjYfThF|gL8sOp-H8uGxW5U(la+Aa zjh}HfvlLl6EZXk>PrJ2V2eZ!6>v%6-nygoyme|w7v01^e>>UV98%ir>ziKYfiK=t+ zkJwFx-KM=nzr#=TveOa$j>oXne#bQ;Yk3?|)ws^pj@lKc#V9@=_EHp(Y|GngF9|TyS+7T7x#lhGL0myjGdemkJKi8iatl!}$==c4O zdt_$Y;pW~&I0!EN4VI`-vO*1$D|@%NBjTTVZ!+wh)+U=rpYvtyd_3WIrE}l(Y)E+; zfQ}${W6*HOD)T8jtF|(@=x6vq#2_@vw!F+iQl_R?+9G1hz4V~h=zUyh)~*6n!i%AI z%4IZkUrj7lr*hqGFuOXlk8y?sg2wBaH3)?gSs{fIlQ*LGp)*xkEnl7_ShS~n4kIe0 z1)G{OlFNw3+aE_{iOb?2*{pRKj;9M6CY~@regKzaq{AMHy|79PJ!YxZr$;P*t*K0o?w=Mat8ypWJzL*O zyy+8Lc}5@PGvrCTe?XuQ`-k;H{AqAQlCRkdxyNQ_A!UuED)mD428sFzzu?QrZ12R< zfU!!-&w3&8L^a_{PMJ6vY<-)V5D4n`#>ilgJsStzm{rKneFpxMm3NGfZ8zk@j2t%& z9HckhH*k))YKzdLQ+}TxA5eI{GXKAb50+({N)ORNH@{E4kPp5mgBgH&ArIIX7Z^@G zkpsegOXLczStWGJ>Z!|*cOiX?rw~l15m>Q2&=G0uO>R_gnvtEQt-X*BFkjZIL>2Q9 z{~LXpCGEyH_eEkSZk(d{-4~-T@_@X9C53!FP2tgJAET2n0TojrC1`eBTs<&Ta%W66 zbTIcuBHu2(kq73({0u1^?HLes(qa$Zw{nCqplr~Q#DdcO>ke55K+ z!i}IpWUv9wHwFbr}~M$la6?);qQO{{3)$fyo}Ld@0Jso zE-Nq{#z`6VXB{{L7?vqVVP{|ejjjo1`4$J|e(VS$V03ShJ#>f3+U`R)Bcyf-WrV3cH9K+mU!rQh zk&d=G95CShDX^I#{OVVk4#F{1;n zy!U`RX0;C`Iv$3B&4Sym2l4Aa45ey{=3_d`h6j$vReK)r>osT)<=*uilx z2@xhnxkQoOixo-55>HZDPJZ0u=yxOR>=jF@B9!b{%wXVX-6mGanD6-g2zS~sds9)p z<2wuwK+&O?!PGO~VIOhFdfT1xh-~OSdHO>-8-COSL8m-|+M7@zy|m+vyo`gM)IWJZ zUL5R3U40E$v7-2AmpG1?R7pb+K-d4GaQ zM|m;S_23-}X6UdZ=fQ~ry(JwKfX`-=`T;-C-ZM8f4%AAJ^?I*0#$K;=7Wl?fMzP+e zFk85S7Z9ZVd@cv8lW^o<>h79>tB={(cBVrs2oFl&&^_3qLeN^yc3dGe)1sO(_jv|i zx4WId+RQxfqdJUgx?^ESlUhGtZ&_HCNAr>W)O!{>Hdch?4#Ed8Ms6k#Si1u>GmN_0 z8nGx(6Qjy&*%-j_Ehs=NoP{8THs;^q#>Id5qK?M9KGD|H1y^K0& zuGL09M^s*?QLEhd6B0^`A& z>#Yp)z?NvuyuE!E!6Q*uw*-|ceicFx)RilhJm2j!D|hpl$n#|RIdbKi$sM_ zDVsn7zs<4p#zA@qe3sSn6TGB&u*N0=*}qPNyyXR@#a-jQ;TrQq)8^lRBYwdXD`N%H z$9w;(GbGzF@pc*qenU#ycj?D9x}=M22J)879&j8 z0O-k+dBF++m8297lCq%<{1R*KTrYuCF7T*GK8%ldw>q4;RuCkIRw7etU9YEXG|PaQ zfJ4h(g`W|~0K8~JvLL;5rBs`v5l&$0yzNP2>IJCk#`q98|FQhi(VQ&O*5A-!hYxVZ z_yCWfJDw3y9-CU53t;4|^bN}tTqE)gps}0cciv%+!4r0N++~jdvgxYnW4>*-4Z2T~ z2Tl^uWbB;QkGw`@@(xaxmcXJ3(w5PQRBaAN5Hi=pa>BP?gZF71se36b=K5|BP0QrsrG1V)nMa9p^Sm`^d%CZ zz+?|F41!o$uG2x#1~PxPb^bW%P%A{&%h@;QeN{z63w3t78j7NsNMa_TMp(&L8##?S z`d&`7h#Nt9R@}i*PKjY;6sapztkP3p*~c+u6ykt5;7Eq-t|OzRBwQAg15qrsF8$i? za9y<3tK|#Ly;?mVTqXuT(3rcFA)ClmG?p@odO27OcM)7L7=-66rUQFjA}CqBBg52U zHIt?ri)Y_H8qZ!o?Va~8kTdMm0!p`q$TD+{)VMS1_kLDaH#6cSNWw z*ci1sjZi@sEL0|JS|z0eReOzRrITB<62l59D-hecv5PD}BC*8TVVZ=>-i8Q+&{o|{ zCu@LCYV8}=5bMZR{T4hI_8Br#WZu=i2MtmR%87swpDDmr_nsuj|BtWk^It`*@|+!6 zI(gaTi0baBV@QcB-x4Gc{06o?nK#BVJL9MwRmTvqimPkNRG6(8j~0}5dntJSFtPpu;xZyH+cT2`t*WVI3`Pm zLt+NA5YLvu>sV7BMn=74F&j<0uV*EPg7JA4bjo==v((o*hMYO_DGz%`{|Bss+-@S%(~-V&qKm*y&^4Q=zjGko~O+^msKe2T4N)sH_dcqO- zCfizgB_v0UAv*#_%E}mg-upxun(kEE>cT0CY69X?a!3;ZIC|p<#_{9Ua>HP3V^8_mN#Tjbu#`#*l}vC$X}dA? z=?_qW(j5Z>6nq*;uf9b_yx%eLgui>;88V^$a8M#+k^DL>Q=`1q9@gHE`I-w9~zyd3k4krHpSc7Z?mg zNB(5zu3%%Nsv@!tS4C|U)xn6u)p|Z;eXI-ZMeeXeI*>_wER8F;A~zZ}Jblt$wWHBb zvzplDWghN!bcMt!W7!htPji{jWXv#eZ4nVfn6uoHoc~0^fPmqc}mF-4XJ_n7e17HzHc6KYxc-kOiA6gR! zz}jc-1vc?qAoiRA2AFv;^M2>DsIc7!q_^0_xrUGYPdRMhSzg6ohM=|p)&487JfA;L`KV4G5@X1dAH zw)2JWHWs5$n0cP%RzSpERrLGF?ic}4b28$fmvqSVUO&7r`YBBq1wI6jgq1=87I$#M zEGjY+DLxjpK2~PakAUN%+Sj>W`8b|KII}vBXPj$(HU8m8si&wXab`BNUHT9Cobouv z8Q65p9cylX@r%U!W8NN zCKlhTgmg;Ca6vPd&{|wBs|<|Gthlo);EV$sIir)_Mpqzk?i2{Y88R#NXg^(eaL_OR z*kl)W#14G7qzgoL%AO}Rga-YJ*`CnT;wrP8jlBcmm?8!j19;EicX(uDv#sbA=p=ji z8YGqcT)G!ml6!&`;EqA#9GaCcG}}E$)dl_ZhO-p^l5{Qy>=NWti~sho#GAF3cQ)8N z07kPtGPi6F)`-vGP_f2Y%Mg`@gUTQ$YaQ?>p>HArENs=V)oNlil(Uk7Ex9Z5m@kac zfr9@$kS9xa^hzI&dql922`#xq1gQa(3(dv66<6XJHM8|;2fM$9&sw*3TT75R@G>O) zYA$p9G@^b*RLc^2XfN~Ts9BXaxB3g#_UQ%p-cXarsQUyj(cL#f7JI=bDgBjvl3|BA zz&7ge@xivkpZ1k9+t-K0mt03ne?3GX2$>=Ybc@^=C?zv|;8$j1ORaBZPr>zz*gd$& z4M-?A&mxY}lpFaL<`+gquX{zIH+WE{|`LGrD~1K5|m^X;P@hH@9k({lEy-skv=s1IUN28KadO*n%tz(x(}NX+0i;P@l@LgpQ@Uc5tjloOx*_C0wR z{-Vr4a;12PQcIhK)P808JbxXpg-DoFLaqaN!nGNjtz|``Yfi7MUA)0x2Td=0;@Tkrz2m$gGIXvZLOwh}?giLU#UuSEx~WD?R+Z z?Lh>e$P@KpBSZlqNLnTSr4k)phiSjyjy2_S74KK23j_~w{u^D3N3zX#J~7Yk*tH1X zn8Yf;;mS?A6sms98K~2yz_#X|@f2mOn87odnIKmW8-QKjN>``PWyF`a!_W1A1~x+@`7x3(^0@ev)_F0iK6;V0G@NqpSHrjuscnGYYNH9fmmI{$@d>N6Qc8zAV8bq55$ zAgd@*|Le(*c~G02QSi?z&-4j{ml8GB;>V<+F(1*1O95s60|Mk>EC81=fz zMK(N3#o9&Ahxlg37G?tN!E(R+RrRgduWu)KprMPL2Ndw4+gH}jF|tMKh|VSJDD)gn z4U2VYm&0#t_m#40jITK1-2pNnqsDa}rZzL}(pv;F(IzFQ8vX(h4V!FMKj8=L>_QsZ zVqM`K>tisEjTq(#FR%eQGX|qzNyYFrvjQ>@_>9jSD#7tmE5FYulG`O(Sg|FNgSAV2NH$|gJIWU0#P|H>|#1U zZ<&l~=cJcdZLPeQnBY1^G8PUR@d4vvH!Jhi9;Nl&R{Md@?s^PEW9)IAWMu(*7FOn{ z(P!h{5Jv$Cf$=O~e!}NVK6ZXFMq?HT&EU~A5JQnvl8dn(gC`}$f8#|ljXOZo$G?vK zX=X{(9x;KZJ*$aq9+)pUT0!COe+CV5NK2hNM&eKhP!YbM$Fs-Cx3} zed%KsKjGbqNwlDo9Ckit+{2=lYDo6!J|=j+#xsHREHpz@+c%J!@|#jwH{RMdOsno} z5KoH!*@h65m z|5gg|Z&xO(wm2%b=om1&=RZXL9@+QF9g1)z>( zZC0eCB-ci*Fxc!`Z_K5nFxE*z^v9Sz%u2elK+v#68ddVRC5Mb!|70;`WF$`ep`ipo z=yo#3PP;96Q>=V}re(K8am*8-39sizF3Cd*)j}|Q_a-`9NC@!gPF}|+p75fws{ws2 zFu?tehOiFi1sHkM?;K@lCafcD)I7eRV&NWXepyQ;gQ7>R>K*wa|JhdX@OAh3aG-P^5<^K=9h-u)ay^yjeCn)zw&SRk596kg3E#H+z=XWlgXB9CIM z9%Jzr9g-qI(}zXYQn_E^P!_V21NU#h>?jCO8c7ZR#!Iz(u|;2>vy6kjF=C@~4|Rbr zoyvl+(wZHbYda=of+~Q540VetZJ`O}DE~AA`2ktR$fs(o)9)g*~Lyv7b znfO%wd*V1oV8Z}Eu!bI`Ul}7rh0k3v8aaJ4>aM9CXYO+1QTZo^3ybUxx3qz!s)h(MDIGV73>)2fITU^3mpV|F)w>P&v?{2F`)y%^FHpDBj>9U_*UQYgiz z^sRAjqQh7DO^v--xp`KqwdW&~JtH)K6r+;OuvM{*tliYe%1G{t0DV|U5HF~z$i&7k z75066)A@U=x5~5?;j$4jF)2eFhE6`Sz7TpcSy!juFpOTYxp~isvzV+3>w<>DmKZo= zyzuoDRU`}=Zeogk0rY9D-I#3*T(FF5+t8715G?J&8LeOVXA*wSKR4_;~`Qq4Jade z%Eo9l`MFO#eJb*W;pep0hjKLrq3y7kFWq@3@U(+t-3uE4f@36vPJWI5=)-Yy2C~LJ z`4G51Z=w#Mfn#&6fX_Zty*o7jVpge@Qdk2!O8Sp>F{~mi1h!SG-LOVEOVNpg3L~&@ z<2!Ob@ZiHIY<8G{8yKY9@kD6=G z>`(t^oj9_yW$GS~V=hNE5*jB>pi z9sAic%yMu%d`8yG&zj_s>GA%$jZB3y?A6w_A?X$jL)xSquwG~RRqh{d<*xL1o-}i( zykeb>l;e8lRL7z>z2*IX*3qM%vR8A`Hr@*)^|$ZlQ8~t#QyH=O74K6wE{#eDqoGT7 z<6DpyS?f5e)_iTEb>#Ht@MiFoS2AEoyW{ON&vs|}JXxqu1I5*DHg<>^hF^SWoiP~1 zD$6S=n|1K2vhG)sGsZ(!VfIsJT-TgJuW_4O&iqop^LmqHPuuP=I;HGYkN?A8)!sJp zFu%XHI9Wn)|Vz7{SeBwPL%7!qRXXcU20dQ0M=3 zKW{*P^Lx(0GR!BUW;|sT#PWNj5q_@|jeq7DB~lPf!!(qUGBJMVt+aOxue;2bnLE>X zrO4rm^hNZ{U6Si4SBT+_rC2ILt}>agSj zk?~j!caFwZ$1|717UX&8p{Kny!+xJfj_I~Dc9p_<O8E+QU=O( zULURWXp1-lEuvQVKr0RV(qeJ}F-ZNVq5ul_LB7Qmb4gYJ=@gL&0=%ESy6vI5_V zHVVIy3_71@5#2y?Z5iW=7vdn0m^(;lYYfyMIIr+|9UE z$*wT8DQ9etaU(B+ZQRwOPw=NWw+ug_9+u&)PJ-Zf7}Scyt{iQZE_p`Ah+LUO&30cg zYS$a{8r?EBp(&e#kA-7^Nqt1TZ%FPdNYjeNq_bY&y1PQsbd!7*x`}+c?tcBOYLZr} zyl{!-(muIlj zbPHmCNY&AD%CohW#7yiz2o?$-DAN)SW++9*A@oJEo%U+&{;gIf2WG&+smc z$85gzxt#4xdCq#OM{5otk4xV-uCu!6mhIws-LqtZ?O2Tlyp}CkK^h)bW%D@Ksxm!s ztyCuUtRazYGv}G~D;qcKRA0e7X7R^Lb%zKcaw%7#l_eFo40&j0z-;?%=Xz1~&y`Q{ zwEA{G@I;ELU&%r=6&kaBoCV0A<2At5=Wfr~?B0am=4$6ro;TI3`QmD4M6#)9m8NbO zf)3eVV;W`8TF)6jtGabo<+|q#mLx*6GxctiFKmgY`ef9)*vZIhx2$@wM!3vm#T3|D ziHeCMZxYzPA=uPyAWc;6D;Wo$`&ul}l#I<3NmS1rDSo1g#<+`zbI4ue;n}T2Z_HIe zgffTrgsNh)^^uP^Ihtw^TGOl^w$kG%*(QS+sy!k5r*V}6-;NoKDLK-{AnX7`#E-Ox zmJ>Z%Igf~Dw!rI`dxi!8k=1V{ij_ldTp_bJlQ02@+IFK0m^Eqp_=2KQRv%^D1 z+>Cl2I{TtCgHx|OaeEy3Tq#c&phgQV%mnb&B84R9L4vX~$%D_$klfjs*-3yf-@gCm zNm;E|r_?gu6|T*2<{l=ABhum#ez+`bK36;LlZwiCSP&~vXu)!_9RjoHAb4;+M}?2g zst9`~0?MKRqmKSidT|90cM_0D$gO70hKM!s5f8Ih<{2_Fe93-qGmSul&jQ51u9C8( zy7>Tg;VTvUk)aD!!aHq{b`AS8*93JsqpZ9t$&B-qiZJb)AM@H^XB>}V+*W}weCE;odV+g zseR@Db$o2bfx9gjLJFvL4TIIWSMo17Am?i!;DQ|#s83Lmk3#=Z?>Zk{Bs z4NC=e$Jxc!jP+7X)Z72xSbwQ~hPc6-y8&P=2ek0$sA4}B@21u!lliMmhVd7%%-ow_ z*=(96$H7+q5+YYk@ec)Kt`En$Y^h~W`Q^xn6sOmf+1buGc9E!jPTrWYn)gk~#1+YP zV2}S-c?CQ9*{hK=@jQdAEu))rkSuKfd;IP_r21c;UUf@J)x5p6XEGEKez~Mm$}k{7 z3nbkaxJv7lE4hHZVk#ZFg3~_WU>}+Q~8+?iG0^)Kb7(TJ6rZv#IZUrm_wrq;(<)pHp-~`S>%~^V@*Hgp zU-HJ-C(L}owcKmcla@7@XG@GWi;}5bzV;ffYs~DEU=^Ld1y;jHSUvu$w*Lm~#oN?4 zGqZ8NGdyez%%8&IuuP$cdevvN_-?^pGv3>KdxeOo`x>K#W%FJ6Ud)UYLpcYE6W>62 zEJ^WiydvLMKFa&B^~`2epJgOjt?I(vc$x$TWTho%*$qlNokz~xuh*is(;DMjExH}k zL_0FSxAKk;5^`O_AQinHgcUwgMGNii<1 zx{ipe!np>-9v$Ge@y5BD>$-G@z>CnoTf29Q^8Wn>?mp=l2v}ypW z_*ubqRiEx~J-IE>0_4%ugC5+B8g<}uvvpMv0Yozhza*KO z8Il_EG8I2vl|*XiQ$^FsW!Z{f{`zR zvstee){2^S2xmuJvw}9nmHVE|U!$fEZFx?1DKXa<>cLUD4p=5634lhl2*y4oV+q7QT=!A-7KE-o@yRlwr#RELdh1%V zK8FQG-CCdsC5g%aZyZVePT94adbMft7jyR;2Ga`cnZc~2*^?MV^@kv_^d;lX4?IW2 zdSR=FQoDY%0Q@@h14Rbbs~Q$|6gBKta`5h54f|`?APqZBXj8`O_ai|Ja5AL$2JT@(tdtAsfry|S21fX5sKx{s9>sJRhu|=MLu$@fS+>C-ctC&2kargu!dg6 znrl{UYC>cgi=1#(yU4}lmwmo*ewb^os2e8Mj0`(=Ypl#6o#2B^ULH@G3{7M1;EBPW z5`}Bp#nR)Q$>YEC?4hp)1J_!|?kw<4XpL<@8Z}Lhuo4Yel*-e8K0M=}VEgys3Ty5Y z)okQHal_3-9t6;85{w~Hcv)M~q zg)S)fw1biBcttw~;2`WA>?F?0cIe+OP9BQ49LP1#(AC7OXtj=SSq?_CwIIf9eD#V7 zb31-$9AlMrR!DWA2!*?HX^T5;ryQPjC$ey;vc>FmYaS4oz$p)U1tU7UD(s%{ALfTP z${3vA`fcj?N<+&e@r^L@Gg7m$?YhcioO|{P7@;8UcRFf)+VM8-8+7j&$!USMb6$?c@ztU^tk-uCZaFx6PLSGf3 zZfL`=u#IzlYz`>yVx?A1BQs6*2o-qh`C#(YKizmK(sZsyq;(XbKuNSszBWE;%eP$9 zVYU49w)?8(xyT+qzg~v57Ritb^kP5R)^ii0JqE!4KroF;tB_E^5I?M_+HS!|ZZuz( z$Gqr-E2@_xqey44b)ck1!f8mDTHhV`+}I7jJ|3%Q*nT_PZF%5z78tvohqP!ME{s+~ zOETSZaPyAZhG8{THnFZ1m9#tzGP%RpHP(hFM@3o$F*J?gKcD1ZN zevc!hZcl!jtLw$rPlz%n4|!mn&sG{$IYBCy5&`-0#shi|Ufc4P5~Ax+HdqOy?$VZ7 zEg^6fxkQ~EojA9{I~1z3sY6GzsUHbIFbxlL#ubgK1$xtuW+?88)9ERyAo6(eeSSGCjgtS6#}cLXjfn8Jrt=+EieHE{lx| z$0K$4JL%G-QPz+(EXANw+?-Bk#2k|GKbE)Y7t@m02Sks2!1Q5M&>pt9r;m zE^A}7RJgv(d!-Bkv#*AMlxcOk2ig^d)xoF}j6kny_5X2$=UA&F0~igLzp8UlXntkSmpuDTuv5Gq|n`MV?H+8#{FhDUlR41UNjTgK*)hXtbHI-(egY_V!Ec$z5GXzqGIN;7#nwqIReTYB@$K-N54>aK zY`JS4Z|+<%F10){FBXCD6@kCTv8d;fHJ6H>gCGx64dZpoxuVai&SYibi&C28h&0C> zhXD10P>TT=F?Zi)Pv5bf)~I*&P0d?bah~dXOIm@Yz)%k90Qs9@hgtVU9x~RfSvx># z@PuQo3Lk;tsLtlw&vh4mWa44+>OCU<9bO)?O8rgyVVu9P9jp3Xl~Cqej$d`6${+7; zh^8T#u?=lSY)aik{cn32U?XZVXt28uK(m*%3m|?7Qw7|aB_dR&E)0uhV({+AdI8l! zFyyHpFbqU`z=xxC3cE9oTcPqU>5@eBM0 zU%_!vk&fFpC0X6Yq{pX3ODxW4_~Lemi(21BFWNsA`!2U8Bl_k8wf?jBABPP{1h!_N z_yR3$oRYaMkFemciyioLl0AP7t?2WxyBGK<>ZA)Mw-qH>ht#o_`NK{OECbD2<`;YU zxwXB|17=9d+JIxA6oQ0@=}+q=jp*<<4s8)jhO&qIZQ!T_@>^Sz@E%NL6#-=DO15I z!F_a8Z#r1;a%J7XNJiUozU2C$!=G2jhlO3&@si@s?U-#^mdiR`=yz-EkJRzkOlWod zkqluwECT=lWSIG+@$lnyyoz`e$;8HdbF1Tns#Z$&Lf+&69OpInpIpaRuPX?Tb^J+S z2Gy)h8VuR}2h{N&i)NL1n!%vl-PZ928K5NS0a1lbe&?y|e{>CBv2*aL_GFU6+2AwL zS`B}kz*58y#;g4~+N|{=KC^~j?RKf*>Bo!Rk|WJ`;5?a=$1{p+1wVN2(JCJA4Z(0& zu?IwBQW|o^_u;wxoxdo;_}cQD?$bZ9evf^coCc8{>-V9;f&zbCK^5I)yz<;@TBGN1 z7ZrR|?~+ol-ys7zri3;ruGVX`nFp%&qCP0FS+lR#vykGRfoUu&+e0JFH`7i=uC-gU zXMDWuT%>)hH9GFphXV&Z0A~5G;y*>;gWN@;El#A8thyDObbnX6 z(d>Bv+eMXcdK2lf$ix)JD-&M!aLvI9dd^!|>tFk{t?UDftvzfyaoJJcIJ7PA+hqle zTqSSf+K1gN64jh~aHVs5U-gGJk@t@I?^gI}Hacb;_Q=^_tSM;=j?VcLvO&R>k_Vf3>WNBYMopE-F9V)aS0v z;N#s6fKcOM4}b|I*CAtXz0R|G&!F(cV|XGw7+1_)gAHHo_5!%7N^O-g!anL!eFEQQ z#pyc&?so-nNLx-;IY?V+6yZKo^%ilq^%27N?{V3BatyQWC6H$c3ZE#~-F^in28{p7 ztx<I-%dUcNAuTr`%7eQbs6OjRjAi3B7I;g-A^iqM0pG1Pem@KFKfd^%H`urwc{UX{Kz%04h4$+Z&I6HhM4Or)bztD?6 zsuNl|7qdzVM}*ID4+5g++0swD5XfH@@6yF^jI-IWHnPcxZM*N4jP~d3NDwyFtN=ky zl9VXDUZmi+>@HBU0wc)y+agqI0N=tNXTIXz1XL)*`BQf%Nb6S}4wE517DRJRJKJr> z&&-cLbEksjcfDJ|eFYoEXJ!bAB@Wt}TIi@v{`e;*u#Kq0(s7; zkC?+=ooJ}L7-&gCV7Vb}zF^CP1p>$q*H)ChGM;hxVBHaPh_HsNS{xW{b;T$S5e0P} zrj0@W_8ml$bEbdsGA7lR`UQI<%uTZg!@K14ydPFNR_m)yMD}6zqK$=Igt6-tah3hI z9L*+$nPb&aBXir%m}#%?>@Idc#m~_o;|IoUcgpQYz8Jpj(`Apt?$yd$*pW=!&w4%` z3vIKrF=J6m>v386*j^-~h_BBDvi{4*FTMy((-wC-te&))0QaO)-PO*R@Zbqsa0NU8 zcQP?%416AC+Lp0BdIImES?!>LRSk=}?_K{)2Zinns zeEb4um9M)LSGKv^t1zpmSmtO=0QGFM=^ymLaRT;obU(|#v5Gj!4;kS#4Q9G(KFJ#5 zg=bc*`w;c?)#&m|+m|p;IV*!@?9$JAqi1pXN&fK7tn#kLUhbXSAOJfk88C~PL{RxC z;->c$!a73+TaQ3bL1qtwT*^#f!H-#G!X9_^`erWzrGN^=>)sc7M~r_d2g89WI*M5i ziG}H;yNZtHq*=mcU<J%rqyjIap4`5xs$l)xe|>18DPR_kkGgV()QXbIL_lmU9tEJ=cKDt>nep5D+i3<~`HlNZ8yML~&qf)H zppWdq*_?G4^xw=KW_+sV7m1u|_>*)1nCW`FTF>FD_UuotGmJC+mxy6KZI3;) zOV8h#&t_)0>q4z>n_=S=% zlBv+`!AA~KC-7D2FSIAH70cXOBua$$-vepfQ@2RmwvDa!^0gad=0s(|A*t zRYyGG@B6pH7mU5Gw2!y!_tedlL2+W~BVO{PB@~}Aoht1cOc;_B&(StHGkz)@2Fl>A zm@*#=UL94n?fbvPz-oG5w-A#R(Q9s$x$?7RW5qV08}9D_Ic}}Qt%BPG#F9x{!x}hW zFU)M}@~gB5-d)E^32R|qEsGgZ9bEG@Vu$QN74mEV8Xe-c;&_>|Z5T*dvo`*vXF{}j zAn5nkT}d5daemCap!PL>`K%=e8Re|?#9?)?@9c*JE-T?DRFtenym24KCElPZt_3kS z3*d_N9FO@7_jNP>hCIbhIcllOtR{W}9w$zYiv51hRv6R1!qn#N{g4YHC-bP(x$W_n z&MDbGGKj}(<;;O|e4{=J6Cqit_6YRKP* zvH(rRWD#{Ub;#n-Z)Q&(piB^nXWc*!;DV90fE8FT%-N>v%6c)7g3Es?orlHfp=u_s zwR~=JVC}4oM*ir2N~@K>3JrN9B(&2U`dPU77+y*#fvd@i{Tx4$^j_8|pf#1EHGCQO zjOuPQo^{i0=48+-6wp-m>AJ=&SH2cBHdIbt9%>xS#?Oq#fp;xY;6o zTOFcQ;EU>6n08Delm%<@k7P&}1oE9EDb+mCQw7j#a~L$%aG3ej+WeQz=cc{?(vjQK z;Anyq%=5kRDRl_`RGlN_MFP-;HI?U?f7HDJU%}!{esMSZsMEvaw&=kUyE>h$mL}%L zb6#1e+~?TaYjsK*>YmO3%$R?>JIBApeN(S1_okH_ESo@~I)G)S$5ld9>ZetqQb@nfeliT^@ zuY@9PrLBR(aA~`akyc_gegFY%YSNgu)=;eR6|)f^k$0^%{+)$rWJ|OZ{Tu@2fY($p z$ouf))jI0h9+~)9N>;Zs!1Klo%5~z~3$F-?rkU zwYCp$Ia@LYG8V8$=Aj&u$sO&2Di<~M1z5Mu zx7D=v><08;sP(|q88kIA*2EX7c$qH?_z{n3=z6g_ALAxBkkM7++sdPlTrKWU-xoAm z8wV7(09XTr#CeV%`ESPD*8*SLo=P73jXF}gOORe*eoAz(NJsRpNa|#}RDw7f@Koc| zBPL6tmi#qJ{8euSo9PPYc&e_B2)xGk^{ZyXS>%h%7C*8gzuC#x=+%A0Qy{rk{-_Ug zhyLD=J&WH=y4A2;GiPkIqJ&XdtOW5g43Ba5FTD4KKJ?^K>iIqJ$3jN{h9aN z6)Jpahgr09{oTv1tf%k5r6LcgDi*VCXfbvPB^yFcz=9%d%4!P>N{dK^L@+cPh6xH` zu%Of^2{7A+MLo2x9(o)n)QH9Ngv+?S-klGVhW!ZR#DRy^^+ku{aDTP`^4y`PM>yHn z*smB-g`5hN6#~Qx6Dl?odo3#;k9GEwg|n^?1isi_R0S45z2pF_qKD!d2@pfp^d^JY zwertjpr(IN78iAW;H&%IPKAAdonVq~nT?EBTX&D!MI$rvd-)zh4(Hg_^n3HVT76$N zJiy|MR?Dw=M=k#l=3uoKdG>NYUuM?D6iQ+zm&G4JqICs+nZQ!cGhXBxeEN&(qKA;f zTEAx=1mJvL+|Du%OYsZ3KPd?)@r$*y=Yd|=FSY!yAMk6uZCQ^u9&G6jwCO=r3YIs` z=qj&FxDGY_ZHxde4C~P$KF`34Ya7M|SjMc8gT<+S-2{J+!`J0EIT+;Obv(Y9iz(Pn z=IfsQ6`O&sVr~9CEF|jJn(>6S3J2$Nm4lJ;QryPxad zR`6`zf^)pL{8pVNlRL9X2*$?~*YF!Ja zFUQvIIW{~uqT5efyKf_dtS-hM!(;BuNbJM)G6|C7%M|rFBY3xH+-}%p|oV3fLTIjCA&lP-^RD%MYv5_p2 znk#&(?=RQ!i=J$iYS^V$)%y&W?qV$ilr$o)6+zDfx*YnM$$Tb5-7XFw1en6D+Sl9Eb zOqTWZh=Su5KTeZ-o@0%g-|3p|tQ6Uvcwjw$>~pZn6%3F0g85$WdB^q^Snt97rkHB! zKYaNs?>@|Sia#&4hvg%ORs4H23QVKYcNT;UtbbX3yrjb5WD%hkw>>;^Humy$tkmDS zhM)TDwf~aI$et7t`QD)ENs9_$)+NF3g-9sZ@KJJ!zJ{MzXy1t0@N-1%Q{B(3CYf>C zN-vOE^3$mHWxukU$~j+ajdfbZ5AP$c)(r(h=AmomXUwRI-&$FW8A^4UPU|{;h>h|U zetzJ~i81&4vxcGU9%jZ^$v-nAOK#}U@}kM0>SBK5XV(4}{Y$-_Yxz65#EO0(vFcy# zYE4zOKNJ^0*76_rZHxN3Hg58$KKMWffRX+M>N}pF5B{w5aCo2|BA~Y`s4h-~FST1e zb+Mm}h5dSFo^`e9@-sUD>@n@S09+Yo)g=rm+UvFbh2@ru`Wc+-S@|9AhdTlz{{sO+ z2}?JCb8w+Hhsk~?#LW6(S>InKGWgJRz`X#M4W5b64+&XH&7O%FCbJN{ z+&-MDB^vyG*sfrV+N zx&zr7*BM2-&BR(i=g#XXMQuJX)L?yr0fYfG*ZLFBJ4LADYJW;;zxFNP>YaiOp_$g~ zqZ#zUPSC?aBj?kXe?=#d`^|9+AU*oM_CL_i__eKms8ax`*scuCpZzMc*&GmV#Sv}P z{4s|a=Y8IQFaOC_3wgplMvT!gbFd3n_!TKY9aw_WJF48Z1&TUE?YnbrpK-%h_VM1R z`j2B^H6Qh&J(%8SG>rr!VsC&U91j?)sKv$*u+renBV^EYNaH8BoT*yp*wEEt3SF`m^MBf@W7U$KY)c@5kOG z*i+0XKF7=e6qX_bp1p*G4G@|NKk`-mzMG)m{WX?xv@I-F;P=-=t=|Zk8(=9HGQ5YoTJELw2$8bk{bzri;i<@)I8bmA6OS6DO)7*M<`iOU+}T;7u2fdRT4VCmrQDX zS}{b0>O0R5SVAhYzO}Y1hp*bd$vg$8b`?AEr04@q z{QlebxNiWX;q1a9FkwJl#~~J_2}G$so{^1lx2^68W9DG_k*zwNat5?^{*Bj0i{r($ z-Fz_cunT>W%BsG>a~*be_k|tb4*&jV7{HI8<@+M~&AT%fiMP%HtldxFPaYdF`xl-k+_Jb` z)x1d)av&gTGZTMjo+o?ZI%?GzwDY2$z;;j4h1CcMjL(c2ijKoViQw;lhCTmT9Fn%d8-_l{u1Sys`@6`a z$JiJhKP8poKUx_5fg5NsY8jIg-lSeRFWz-7nc}@|)mI}yniu0yMm8R_g}2`i%HJ#= zSntkB-r)9pK1W^tt@0CNcc4NpfEoaAG_ux650ohtb z=mWEY32HTLOn9hat-eA5*$avq3^8hC%A*Rqwgt?A(FwI*o4fc2xG3e-GXp`*3xeM( z232MI@mZCuaW(K@;jM?BmI>*9(05lV>KS0 zI6CvXvzMfAyVq$OBr$ZU=sb80?h04t5AnjcnUXnqrJTrJtW9p%ODm5T?4{z55!lAc z5v>9Y7fN|p7ZQ1Pa3%;6(fgiZ=L&^Y(2)gqoOI@z)6SDVyhrb5<#uzc79= z579qvEvuyj%g{71gyk0)X&iY7qM?T+2z;FYU10UTu3hc;TY1)aYVIOC1ADxu>uIoZ zm0`(|Xxmvp8fgONCKY!{`lk?Ru6bon2fn5>X=`C;3vT?L)nsUxjs+DrkO*6DbsTe1 zuxiSHQT72vZE1Tyv4&%8Is6OWRWN~grq!|1RneX%IC<&w|pje{MLKM)E2 zF+1y+X6Y0xo;zWl35nte3o|rT_t}^Yb+%yytvP zQ`wRo?PcT($+IPIiHyxEQ@yUk(tgGVS8=Q%}0t|0oeyqJu8 z{Tc%qUx?@^j$-pf!@jIlvbe7$`PJ6*kUR7I-?_5G$jAp2dVF=SDq!q}T=Q0j1e(B) z#rI>K53@!!C3}8!>^#FexqUqEoIk!oajtKFs4IX6OAH=|j@TQ;-nJnX7~w^Y8#;p2 z^kph1Ge_>>a9O2(j1Qon%eed=NV;W&J=(3-G|jMxGBi8V+}+ET3y)eny=}Z`HLq&S z#)L1iYPgqDwUz6-HeIES}8`OUdjucm%x()xgz$nm^S#_@Fp&&0jb6Vzm%fdV^VW^qE(yo-oK- z52tz}jov9Hc|B_4Y5nF=--dzi>f(yx&bJdw#F&Z&ToW>g&qE_9H=c?&JC<-s zCuEp!N&QROI$|IYUSz9<_!|FgWM({cLfS3btm#^43#yb^+EUcdwX=ZQ;~I;ymTpm} z8oJt)sAgkT)!S?SV70WJvlOQE_XlffXG3UGr+KL#@Wu}4(@q&#a=XEV{m zD~4YSZHwf%s4IPsa>%t<_+DVyNJHeXuEw4s26DS)QPy&fotWs3{yO=d)!oJqBOhff z^L&&NQck+o-PH@vwfCTP8T-IfWD1nYr2P)AT@C)bpIL)9U+uO>S*eEsn57PP8zAI0 z4DkOcuP*0ZJ&xEw{(Yn#uU3G;Pc?Z8buj{!pTi$Y!7O*d)@HT~;nHc~xYXx3znjzuQG$`e2~WA{n4|?o_hfx=(;LyxsQk zU=3d_;-Zcp1_3x%)=*BwV&2H^E&hjrda;IAjj0RhvqlvvfftTRQ4vDQ+B{C z!MX)IYsCAbcdVTroOCI~?S~AurOI(dsBRy8!FPa_RQXUB++lX5i>SZD|H^=+_$I1Z zAx4e!m{C`?y8EmLysPSM4J*RsP&wVTTpIJtI34vi^6ISOu6F{HaWEmTv(KX+3T@6h z$B$T0$5)NLpSRA;=J;qx&NNgC?2FM z^d2YmiYCJ1<8$!vy!K31l1|(gnmJ6gL}J=SM{^D43o^`0`50#es`wn}hI}~8wSX2R zLq2IEQ9FaJhK;^v?Y!5K*Ups6sF@dILH13b!OMc?PAuzv_Es+=vmI#A_b?P-D#ps- zEihXCrbJMV8rzBqKubPBV;dJX)lhGSmVkq^QcmP7+ZTJuTI1B~>^gDvABzDni;a~d zW^p{($0J;cBtpIJJy%-pwi^%}=LVVn!tt^OM&@=IFV&Em*P9i^=lSmo;5{m{7w942 z6+Yp4MV;`1eW30Q%Q#iO@%yw7wFqgpo#(Kscg6X_vc}t=Qc;S)E3a>8{2FPiKv5vRiON?p$+rR%C4p*-RjP z(b*keew6~WL~ZCceJtu)bb-8zgtzDV8uuA9U!D<(5$k&MibpxqFe`nLcwC{$$+ou{ z`D@m)VMi^W+w%_%%q(iFIblwK@nqAceVehln|u zBioJDtX5!QRnv8)Iewl@!s=ARw}oc?q$s+2UjlP20|Sa>o)P7J0`R`?HNN@a)5377 zBVHp0O2lxy?Mcx?Y0BZonZGx77OqyMF>;^ns7k3tVC;PN&s+v>2;IHz0f$?k*x zc2|w=$7<(BX|$UW52N;THT8yrsS-VmJguW(np{CzG1L_lW;d$@vKFoKW><80@d1O1 zvF(_uLG>F6g@WcwnS;z|==BAo+*F^3(e;FLzAJRgh`j;A-|EE}>MRzhbU-7|8hm8u zCo4}IlZ9PaFhB3BPrUgU-E>fk&tiXprhrN>E4EJAkBaj!dtde4OggeRJbzj|TCLrf zt?HTg^L*?py!5C2r~r=8t%FIct<$=U!|I6DzgT1H{6Xf+wZc4&X)b&*Y8IG%)JxZ-|{AU=PMRY@;Y;x3(CKs{MD?Yvw zi_WK-VZsu`Id-UClqlN_(xaX72PNGoc~q=`dCqo_z*tq~+caAY#?hYPE$8&Js*mxT zD#Zi8aUN%OtFe`1#fjBXAs%OF#J8SX-MIf|k@SSfL=UmGv#YiL%npKAhzD%&!s-0# zib*#Zk&i}@*HWTvh04c^ivxI(oBm;N1n&rqQ?zk{wN-=%Op${eszM)kwiS-QSpdaP z_fEsV&sWXIdB3Kg{WXN#eSD5y%u(xk){Owi2IQ1kC{Y z?*Re=j>$ccQwOWpcRJNduZGYWCCf`)g*0CK4frSL8n*z^dNJC2*vMk5oDm1X8_7=i zhGG%EAI!E*qr}-a;t1AMcvpCczyJH!bqq*IZpj1Rcx$EdW0>I?m|ISUJes*yo`=wL zgDE@mfsMKuFZdI(%{zcxk{H9sw!9+d8Wmh(DCt$1xAkEd(J|xA*eYc z69Y1N#>EfJo8cLHsBUR>(Ld@day|PQyOzL_^Jm0#>B^>Hwd;*TX0SX+K?zoais|8V ze8~aw{p-y??icJE&ocwM@Qfc-UWe7hRQQ<5_`1sRYt=)2<>JCOFbp4!<4Rn-VnRTavA@l;HkU{#4t!pL@ps;;5do(U}mN^T85P%1; zI{zGRsk9NDH1jboG{CPtYQb|UN;;(*nDrR=?l3i{_R+yfgH}zI_Vx8r+ezZRl3JN5 zYP;YE1+3<*Mh)KHklj^+a&E}^Ge=2wz}d@{8F(49=BfpgHW*eZB-Zgm%3RrJ^?q>7qS3la_WR#& zv_aJhl2}EyPJ6=30@6+@`ZYex_5j&TSHmPA0Qk);pF$~#ppIu; z&NTq}F@4#_T;-ymYszRb-=<-2Uj|7(dbVyMSGK&i!JKSfp>>Rj-zJx+3qH=KdD3Q! zelF)wyN^Eh{*>6OeAIIr)hnz2QgFb`RJ2-_rU7-jNox$|FB#Wc-auyBv4g+60{Zgy zcvB2h1lD}SD&p8VbkDoC0%!x`W>aq0CTgk;CCk*_dV< zWOPwb)K6Iq3*_d53S24k)tqDJEiTD1XFNod{ZAp32T**KmlnJC_dRN7P zoaMu-#y5LaJpqfwG6k=(@ni*q;>I#P(i<{VQ3 z0b%cNwztc9Ym9_39K$ju-`vK6@yXFgg2-QaatwOL>R=tR@CdmQryFfW$i_4;*S*J> zp=q6(#&SC+k4e*(q<37lg|lj=Q{Ie0&yN?csRPZ7%1eDT+-;P0=TA23X4Zt)% z%h=YVV8<{oj_N1)IASbC@oW4XCij2-ca9D7D|#*KZy{xl%K!G`@+~!{3`?g5IZnJ} z>3u->bM{1X&mN!k*<`KxzPxi5U*`+40}?sO)}RIsvbrnVrdcEpTu=(zU6^+&e)wRO zg>ErEYk>G>R6`ol086CV>Lh=9S!$r_y{$gE2F$Zu{<~4FLecy=IqEn^PMS3_n2+b^ zoH|reY>zAMW9`Z9e(0YZ=p3`mp3>k>FCvjS@Jp6$Nq2aik=3_Sw90q;~cLi6k|tt1+_!kK|DkGtQI`fJDxUum_Yg@*DbQH z(b_@Bw7~+Ch-YcY8^Lx1QlhbIRE9eiP*ocqf?$=om-89;tZ!f|P|8K1m6zuxtqroM zx>8y!IXB>R%F>G~*++`3qKjxvpUK_=b58Mv=}6Wo9a?U{&;V^NQJG3XJEL}e-(f#%wL7Z^?VcLU z+ciQzqZDZU9287@p_|fE0NZP!NvpBlO3VjoBgTR<+XVRcKLhr^0$cWuRH?E)1pgQ^ zGJ$LaUOKQ5>0&e3A8JEc!X~q5u8B2buiyrvYP~govN-KEGcy+abCI_VdmR-b_~)%Z zZ%%nKW-US*18&4naz?M6Y*l`+B33TjCm%IA_vr(C@CmH*hJQmyLtlF3i}9o zkS*p|fnQc6_@}Jgz~`XTd5=hmJs-E2!y}k z3*&$JN8fIUQBxWmzvr_SuXNgm9Oirq8OU4SzB^!uKGr*95yrutf|NQAvEWanFWGE@ z(*HbERQy&uoHx=b8e&EmJ^i0C=YIwWhz-C~~Mp~XB;Jd*L>6FE8Z9RCS! z#C{h_io`R33x8&v;rT~j7gq4-AdQgV|SF&Hel(>To!k6~11B%So z>)2@{5wqv6f78Zd8_)nbIJ95`@S%)u8}exvIX}4udQd`th{<)zfiW6Aji`5vO<*kL z*5*A62YS^T+1sh^4I~)X-KUx=JG3d6areukyD!PZzRW4XtEu85uzAZ&Qy2C-D}+-9 zT=&NQ-CsMuGOJe=EH0s+f<2JMQucnwCmuXdR*Z*;;iq+WChMG^o#n%+BUDkozD{O3 zjTS4Nez7QXF9cYa7Yc6;sr4ULTANX8T(S9$9W7(UTKxD#j{|3pc{*D&CbHwH3^5>J z{u2g*!OJO$eUFsDU;xGb&XcxJ({@dBba3H>1Mc{u6U@s(HX{Ju(tK@K+$uh#e%;1x zXM^Qj7U83+CF5}Z&oc(-Tzwt08umgT{N`DFjlzw)nchx9khb9kH%A93no{x(F-c!TB(r@Zaw-z>Ipym;Q@ zEN9M=;)RsBty|AWO}ER7eaO1a-{Vkt`uoVSYYn8a;s5ivY&cTCb?iE2)~9Jz07$`v zl;LT-v{Cm`WZy)++jVTropwFhdX9^U)q!IS7#xez9JJM;^@{iiDvrZzAtoL%TSXKp*xmK?G`l!%1yqP|3HO7|f z+_%kLNuZQ7W?X&S3M|go$ksBkGzkh}JvaZg?ej2wxStV==1-fi6NAhJj)gLva zrF;#Op%Ic1;E66#)%YGe3xjD?bIxOOwbOVGlSj_oSVp-z;OPB_aEOA%PWnLlpzRm^ z5PQ})ylRB|>3c|Il{q5~^+R=8%K% z!Uu%ITigXxB;3L9eVs9+&(pxR#zLP|>|JodEb6MKc!`8VP9zHrRI&+!<@TtAuz-r9 ziOG<9cy;YFA|an1pC|8#Net~#8rHc+qdk8}gJutuTZPJ>h5+%U!HqvHfQuA`xZ9G> zQb&~uxdAJ^3Ld_}Xt9LxA5Yp48g2`2utt69ND_#bmL--wdj&qNK$^5dR8vXyUATVcQ;>q zudI4wEAHFSIeM*a@`Fp@Zz=moBrMsG)wdm25jixO^Hhdmw|h{NIZ>@?&g%}&2(Syc5qxE#K60LUz8o>$6f|u2q7p(Jx`ourl$6SrcYRyA3O<4U`y*zb|RMjg}ltUL4sxyaw+p+eLP@j0TCn z*KH9o9;#)Z3K#+mD4sBZ+7Dc~+}t{?-IzSTjXEMm-q&znsfOe62(zco#EQN#QZL|O zQ`jL`_2{zo+}-Dk++(TT6j}BEb4(nF{4S@Ovi*OoynjXfPLQO$eX9}7^PobtzSAAbsJq1mmb-Lf@H8VGJUu%7lS$)39 z+`kcS|39yr`}#=BGxcBS;kT;m2R+%cBj}=Mbv?=+N~tAr2{*LeEaWfsX)>a3@6JZ< zeBenpc0RN%7;q~)geS?1?Ats!Fk2v_@UjQ$_UX(8W$=TAC~~t9O+L20@OZ9f=|7~k z)GL2T*TK~p%Pwnq&(~E>@{V{$d{5W;RIfJ6s7-|u5~FzrcF7#v;`>pu+uPLU3`#jn z@!G4=3W_cUbMGHo1DQS70^jFzUDvuSO~kUHtnyP*)Mqy6`FiAI_5gItqw!e#GZo=3 zGlo|qUup|LHpQfgXp;V#U+2rBZa$sw#V((we<5$lzKai8_1><&KE`1(I(SSscz}c2 zeowm1!OSCX!h0LKg7Tv6+GKgd*JM|`?5Y*t<12k6L4SJ9Q~k}!Tlczk`t|V!-|6X8 zN(m08O7mbEEzbHfSCVOJ{Z-VHrd?RZcuM_HW>~DVv~%%&(|2QE0k4dESSCnzq)7$c zC|zr4J`?KqqF)s=V~YZoJ-vM*l`u4LD!dgiVq(Kh^tj;H3l-_wF%E1R6ttoj zmAbp}l=f+J2aTf-!Q)@{A%yN78Pt~)E!%0w2fQR3isH3m{qX(=d`KY`7StCH&4{V( z=~_nJYV`MYUUb>+J^Top5mohbTUK;`@c2c6J8_b=C>h0(grfxC8&- z8$Ab;|A9v?w%Tydg~F9e@5M1ojAuc6#|8{ZOy5$8U|%||Pp~$Yafp5mroYx#N_3m4XXwKek^sBGD+`V+?^CEYm%ddPw&&*Q}L{6kEo8Ph^9&Bi?PW?j<`!_Iy~cII=HI|0#Vx3RkTQQ?%{u@M9Mjd zNG{YYku-FYvfd=iNl3cu_zk<%a~OsO@9a}M6*WsTWqfZ+xQFo7bTf!M|6Sx=NZ?*x zboV5%+qG8g<}06k@4C^gw5r;n*t++~?1D06PJ$Um(y?9_Yi>3AyLpBc|IgfUd>Y+wybjC>B9jhuw zjJ&IZyZ9yNN%vZ|Ina>aX1mVVT? zAN4=DVz&aGV_isWea4;X`SiLvvwyrkD5iQ=(LKP1E>2(mAfCqa5qD-xTZ45I-woqI z(bb=|PsG_jD)ht=cb!M=hFS46qf-r{xU9ZB1U4k&B|qI^hl`v8GaQ6i);`yMH)y=- zV~iYj#wnF-i4P~v#~B`LKF6jL-?=K0e{z|zc~c8xcJh@BTF)%pNwpHL?l$kG_g`=`7T8`XI{!tq6PDAPh0GH2e7l$N_!FnSaR>&AZNmT+Ez~g^z7+m5T3Nm3yp(A`~l*7^=cE zieP@NrPn+1G>{k_$N2_l@RCgsrtrzAUEk|TWtS|Oh~h@$5?$iUcK2B*58pJM>S4cv zF5;8`QN*dAO}%kC-~<^VPuIDiM$R?R-D$eT45E*_$cIdsz zWkxyoxhygyM0P@Kb|j(pd+0Rg$!W@sbPuTK%7HH`uX<6Af5%OPgVep)x;#Ilv50%` z+elQIDda&U+7AVKPAh~5c+5d`I9N9Yh25K(`5t3;xaeP;8SjxU*kmS7P(d3d$=0w;My~0PJ5fl!qp1&5&9N7vhBXYDR91xJ<@e;rK50d{-rJD*6lZ>3$;%We zBMcOGkOsy<(R*C+fV?5P&JifIoH)B)l=MDv41G6|KbHs5ddY-h{)P>j>B!&RtLN99vN#m0*+E38Q(x=E^N)?_$Nzp>xIIt9S&S@AiPA&TH(sKLi!^i-I26%fyc&;=Vd_Jm5Or|(d4lZp zL4g&uzf~}S-))AHUNUHQdQl@^(ZfN0dZ0;XrG0wf<}FpbYeva;<2|$X_ny|x))(?d zAnSd_zWnepirG44fnN;es{nWqhE1Z`tYEoI*(;Lp-mKOC)8LV3Rm=_|p1UFp_F$QT z4Lz08-z$u`yU1Sx9>%kEgG1aUI{WFlb?u4Y87cX0=6vt5oj>kB{U3!CtJ+>W$CYo? z+wr#w(bg=je9N7UX-hx7wImM3G{ML`E&9y(b^cvR+j%H|Rti==`W79peyDZ)!Uw*5 z{=NA8EO!6tL%kz)`@T0COwtowF?KPx_hj^2vi0u&zxCwNh@ZJ<^xAnM<}1CD7L{vr zuo59rM)PEKg;hfXP7=MY4PIhDwtJ+? zjee$|l8un#OWGbrT=79D<*-GRg{DQ$bC2{Q1Gpc1|LLYLrX#}x4?~Ay&q1I|QOb6R zUhH(VvgNI1oBo^nQFi*gKZCc&*$jmg7FI5$YtrJDO1)Pcj21bqi){L&GNNa9`>kg7 z88Xj-)XGfx5?Y4xV!s| z4|j<_iUCBtL57P3AY){~5X#69XAEv+=0E=Fo`${fvj`w0Fr?Oc?i-LMtwa^;Y8%7d$!e$Gf<=qqE0`k;O?&p@E-n6gzj2H=L&f z-E}N}R{q*$`d*zHi_0Q+oPDx*6gFtV^gw=s|{W3S3qVEzy z`%=Vg=^1PlS-JYuMJpdhrYdI64SGWIBj+j_p;c&Yw*eT90)?I%qAlU6 z9#*qH>o16}&Fs?t#ATs--?k~e`&Plo2Uj%qRvr+DtVx?C+$^{|9GrR%OVqY<1owwJ z7ylP^s(&j_c*qi-z&&J%>O(0%CJ@)@q=i35qS$Frck(_fd9brR3I}=p7)8cW#hPRz zGDkqKi0zG(;s8kzNqfBNx0gKa*S@E>XTR@VyeYJIXlv9u=R|f0G3Nzs?P3Qn=)td5 z@g~;#8|%5MuWer^5r;-pZ#S&+C2H^=(h6#UiGTDHk0@XVQ`tGfPMl(BZ;s;(s*%Z& zKj|N%EWPF|?&OPiKNniP;jNJA6Q)WYO;Xd1R$VPrxbvoD+Zkq~Vx@g1w{zI8rxLoDd_)s+fn52!Y zURIJ^6YVT9(@5xy7eC)EH0cJ`krwGNi;hok$WCA?{wUG0s8>>3LgHXey<9N-N!5xj zW}UnoJ!D{>?(&p4S#|e#pR&(&+Y3a}+S5+vj!DR-vkxl#)16*YQBdE~DiP!h^m9vl zJ3+#30Ft0Od!QW;>8wW7;)`^Z_c9l2M@}B&a;10Fe!@f%XY^!Jbcc9%L2So4?lxZ{ zE_m1YOMa6X{gl75X$xK02$Qa83v|TjjOG-C^x@O=o#=mb7U<_B^jnxOED`ojcm zu@m0aS;i=3ZCVA+|4|aIJ?O421bNE11ge&Z-@cmsE|j%C9H{SK?;rCE611GvIo{TZ+5t`%lSFymffm#R6hxHGlfr31`=b z+0}=UaN7T(%V-2zx_N)VU2T&q^pdgKD&8KSj8y(@yA*BNW%#2gzrtWtYf2}tH7Q%6 zU<{-%Q5n}8HRx|$fS7W{pKh_3pYBWh0rje;iBr^-uP4pBz8i~`m%PAZaCtS!j>t0m zv|g&uy~9g&DpFcl6==&oG`Kmc*b@*>j9Ce2i;u{4zhS54?5aZ@#%GJ7PP=D=v}3er zkoL5vzerYywCBgWzQAglKJD~hW3?kPtc3@>7Vfg?BRIo8evROeZeHQGcxvbBx7tJQ zaGQ3Vm)@j=(%TJo<9EdhpYh%uzG2y{A78_7|N2+qx4|nVT0BT&!Ix8v!^!rghNrp3 z>gC{ogWxnTF6T5Lm2JLWm`>f^Ky@sidrh(z7E=zm z>2Xm%r0moFVj;WGld2!dM_p09Uev?Fc*)DxG2ZOKKr9@Ki_M?W1Xp`c_N!Mg7YVU^ zsB1vgJXbqN2Nww4GvBcRw2JPrLgd1LA z!f92Jxy6OcsHmOSokeFq{Sq7291JZG<)og#hCoHIyj%$;d75* z?Ek-O#S3D?8?>m_YkxtLh;d*vEkCd)yQJs-e^R(bhFTFi@pb% zu89Yt`2T>u67XH&sXqOZ6=O#nrTcZl!KM26HGWGe>7+RAJuvAnz<|lCMDwz+LI%=# zbNm_=00@df^KpX#{qx~_(G%TvVC1LocbjLWT=TQA^`?DAmiY0HW(=|O-srFN?zZbh z1|yC({I_&WRoYZLKZ(tw$7@=2Lc}n{*Tl@K#ulxw7xxsw6P@o%<)=t^xM;pX$=aYTL_6soIkx^b? zzL8W8mTVkENtYXWoA)qWXIS@`|JuCm)x<3+n&#RBnDHHSJ(u69l5JjLK1yQf{{ix) zM-b^$vY$13`{j7AJmdx5D=$IsO9%S|&T5jM{1UwPBHIMsyGuA`A*{dCVixxr>ls>x zxRpeAtjDs*8j45luDMPG@w5MNIPZvt2sRZOOnuDd$ny7GP3NTZ_#cSzejL`3Myd|q zV!Yr_^hf`=&FEAmg1xWK=>95cN9mAJV-AXclHNHE1?Sk)4 zU&G3wDd*g-H{31yXP#m?&|StYT{yd1PY6$IO7~E*8%uH=tn8_86w%?^{3c!<8hv#&Ep1s8}!$TVvWG8<#w6gT0PuJop@`mcDb4`a{ zNj=Po;>Rq{2_E&AHpwQXY!ePDl}M7NsL%SbdWnJNmTe)iBlbDhlTCL#hti75iRLEF zUx4GL6(#3Aj$1~=ZoJUQVZm7&3dc#mUzzg##^_b?%z}aD$RvKrqi`C1QgO@!OYy`x zb}A;ln)iv`oJd?|Vqfy`zSC1jU0UG4ZweQ@f8!n zlZ(vgg#sZS+N$7+8+CEm7lmx};>1JVu5*{>{gRP4pO9dBMC{FHiaO!ou+KU^ee#xO#;S!#?BVEj}bt@SWzXFydV=b(s>L`&sLx z<;6hi8yOW&hiIC$SEpUm8K1ZKEoHAfcbOU@53Zp&-H~INV2jhrzWcQ16@Dz;XBvuF z-B9H4he#H#yrXqqoXnijI@nQ+JoO$?GD&O zvn#JAtKXp8U?R@HHNUL`5s!FdZdqEnVHe<_cy3Vw{)EoY?X=8X!WVHKH*i6>!y_ zxU{k+k$VMFE@l)t9H#9QITd`We&Etk;x2JobW#54)9>^(EM9Wq{zUf&7_*0*M<(%oie)GTo|D9CAw@5Dg!=tq)yXv#++cvG7 z(0e7YlI+m6@A0j3#lgStpP!z2J$*{s^yP=DI`+*Astu~sIf0+)m;6#CXT)UBF12?x z@U1(v*Vqt}fx%tO2sPn29-w9X4FtHP?Dtv;PzNcH15 zQ!}TYnJ4cN^KyXt;?epOx07#tTMxYOL0Z7_=A&l&@&odQ6d7BW$`&>)?$6^IILxHK zV8~1y_8!wm<+XJa@P|)tU=poXtH+5DUngFRduOS@C)y2twTvg0P8yjHP(=d;8FC{)TDqBO3U zR7OtyXkX2f02LR79Pa4sPkcH2ROJ5MQ7ta?d864eUKlgymgPCf_F?nRya^~GCrrtm zWXNC7sLr@25|OS?VZI|((7KbaZXX84Q@+^1#zr}(f`y-(a*K+qhfjr54Br4l{9`Y%FbZUBN9ml9u-`Zhb;5CAw}_^^cu+>l0E>qtI!90qt-RPq%Yy!ZsHDpJ}C&q z_H6aLbEOxv-%J~&98&G53j29d@wJ~LJ^5N_@`1PN3DPGwKINwBl(#%Ta)N#?-<0a) z!PxM^=mnU~y_5D;?@l~$Coh^e0uO8Ie9(3!@Xr@J8j5W(5_7$IBT#WTIth95_qVaD zrTmNnN2YPtR>&hqSr0dPs$=w^e~+^6a)(HYMyH0&ETT)o$d`;XJx20({8qkN=S1VZ zyY6~l9^J0z!<>WyKJ5g$Ps=VM?J3=&T{S01)P^NF2U)1(-Sv+P zA-THT_bTkw+HNl6qg{c3}cX8SHX*8rN|=ju>n&WKP~^^&(EM~leutHoJ;*h z$Vod3Zbz}Tdtpw4qTV*i+8DOhYuq;tLR0(a;gewlKiTvlauY>OD=f!f2SXhMTSbPo zdQ9Gk;e|hDoE7Fd{eQ(;oC{rKSG=9$y>$H{-+ni6+5W}p&>45*Zs3*pL|f7~o>0Np zc_q%OtiFGGpQ8Tk!1ZfVmR~s=D!T4}>HD2&$X{-Oldw;T&b`aVUN-X?vw?aQRaO~8n(@aI)kIb@VzaC2 zLm;&+E4expW`h&G%vyfR+A!y3eSYNu<*@Ty@1@{M*%XzI{m3Wsf$D#BP}Uek+31N; z9R;cN&{Z-iYOliB_1psm$^BS)LV#cEH*I|vkJNksbVhrMkH$`sgJ*nb;(ecuUn9Gl z94*JN2b>2=Z*+3tyNZ>4E_cOJexk}fx9gqf6vdb4YT6@PZR&pMFW8Wj3q@BEarP4I zp=`Gm$4u_Z=l`my+$&zcg8Ime#MUgg(Vv-DM;S^r@{2lrGQQG~-CrL{#iKs1dJ!5G zQ}5IXMWG@vztY#S7w_1M1SlnVMES?5Q5%`zy+d;O|Jeid{H>;MU$RG1^zS(E!=*>n z(n}421C{2S3EUY=N`0rOgS&kB*AD;6h#mKh1=XcK&D`#52HJp|MubSb=|kUJ3&9AP za`Y^rmSKz4tEA>jE7wVza)FE~QZ~kp4NOyX0wczE)hKiwTC~dUPbhKW0#g$TQRg}I zEe=xE11y%BN3QF+T20kTI(gjPiBsq! z>PF*=n(WNpEui=5k~ck-eaBPLiZ0}+FT~QeVP{VCA%G)FIef2q37zX6A<_CkvFC3) zCA6LsID?((-}Gj2KBQ@Vr>XR~O-P=29ZNBb+lgieYAZ~FBPTMCTek`KdE5){{<9cf zM?f!r9brsAlOC|qZW&kIcRXot&~}w>YhE^OIc9SbG9idm>AYbB=X?ls;C?E-`g~63 zLLWg@wLa;+kXJY$f)!I;LC<-2X9G zcQ)9PO55X;JZ{`3MEi6?_}&Y?RG*YsZIKHzrIs+oCA3C9TUM#LUB;K`6K#t1bLYTT zQOS2u4^Wt1VY8qH6--;@3JJRht9bj}jtF1KEe0QEczY10QgF$qczl@S^>pbg87F6X z2i?p#Mhmw&hsru@clAe;+M4U_nKkEnrg%HqOMQMeNP1=29SuhOllU!v!^ya@Dt*(wmz>Xyc~J)>z&1lu?V=B0 z)_0ice%cpZ^-P@Sz;Dj`uKaDt?_Qg0$NSyCzr3%4kkrX*SQRaz*KO)|!|(Bf(tz?ZON0`@>_E*J|4gaA!!`p%m2XQV!(* zz5jCX@iYg#x8RQaF43S`%z0w+BrTgA@ffwo^uGcF z*Zx`OkjSO%rOwKIVj+X2wOhKgpt6kRt%Vy*n3KhM4wL81OAn_#WPf#R(W347&!6ey~6Jwqd#`^540F8Hdp6v3z6zXKa*tA7CKI#M=gpu_ImRdqd1gl_L1_nHeeg;LeWJ$r#TBQ`rKvM46te1tfw z8LR}>c3RJpNkk4||IeM}#-P`_(za5;KCI>4#M%-F1H2+8_BoG8*6~a+Fh*8=H}5mC^1D zRs~X@CDvt5IeYil6=$DSZjO9RD@R9{NO2Ar7_v{i`Y)4{a}V}4V!f@#F;KXmRypsTj`XwW9U^IEaLxJU9X4Du zL3@sN{CB;5eTF$r`8>tU)UYA#;4?mYYl8Dpf4k26-eGO9Y~C$wn_qaY{jrFK3!3d& z=Hz`OFFd^wZPfZ30ahL>L9Y31)t%;+JVxGE)GAWhPn&z2j@1~WIoe29+Av--E-@3v zUvteMKErchpL%YN`ZHl4o^I=G8n$NgG&(eKbIq&Z%3?=F)~QXw(cOT^XI5E_$oi3+ z*gTNe`)iGJldC(V`?^2d(Qf41O-EuOeroMJwPsy+R(~{SovEd-&O1pbyGBg)YctP9 zbNa>;0{)cK1WKZVmS5Rd9&_Cs252*y!ixGcJ~ADF!YBn+)hAKYH2<~ z2J%dmgsHAG&{bi789IKLgU&z>;$}u4o^1as<(hBu4)CXMzWKc(gLshS{K4kna5ulX zzd_(hp#S?%V-JHngWtz9JDi2Q#+&~2=P$k$Mem9=m~Zin9=MV+6iJY8|BE|3HT1H1w*f zf)KK4=;DCz8e%3%(~RB0iI?NN)6|bi?ixynH{ zdA_T^o>vqyD$TAT!p6B=Blo?^K@^`IN9ehp za`3w$f%64E^L86amSuUPtT98$+lZ01&tM`oE&sg8g?C;pot8+wEo0;JSZF!^mUq~@ z^K5z9+g9J!R}82-4a+Eqh_oc)1n=9jj;y4EjCb+OIZO5Gi;_I6V-AWd;@Fc+dR)h~ zWby($LFv4_IA~U(FMnu%`&Q>eI7PWdT0P;!SxyU&gOUoAXtN?EDSuyc(lvHv{4cz} zulNlM1hm-JT1j&Asc(0ms(h(%v*W(&o$Qo?l!ONIE-HF;P}3LxKpR#<#peoYJ z=08QDdj;E(j&*9+Jpwper$(+U+Lj9BK-k>n}q($iM+3z}b|jT}|?vb^6(*1)I9#rAFQsFk+U z*6-0zv9f(oRGR~=9X_;NeX#%o?4@1gCl9zk9Qt)<{1#6m%h*i~*9_#MWD3D1<-}R* zu50B7;_FVY4o&uN4|Pgfm%B}ojjf}9b{?L6&WwoNepS={^B=F2h`w;njoLX+$}_Nw zp1bOhiIZ~QZ`w z6`>akuP!|_KGT77-H`ZYtmLVfMSbb~$Ph$ORDjG1(z>5wfpRHO<;9f~O6RF?eY+)v zj;HA1FImA|{N~p-a5wWVIL`1R`%3I*pUxhwau1y#vxM(edh0!`BjbsZoR%FpaUFeN zB)gzQFB;i>_o4Rb+4tM0i>5~xcB8ZN-zyp%+;smD$Sp6feecm-!{6#TMzXOGK=?4V zJUdk9f9il{O1r*gQtC{Ru$irJk#s=SZ(w1I?(_K+UEO1r@>9Q0b?~zy+!g5t9c-K- z_6&CMK{_jtKrY(&2W5Tv)*wK;o$`#wV( z5D$GusOm^2SaoxfwpU<~!eW<+`9l4u|ELmt3Tv5ywI_pUZ6e@T|Hj@?U=&G) zrKWAzPhZa*Yu~2VRVPY~F%qiX^$Ue+m?Gq)Fy-p#v)ewg*KYf$)3#sD{_IMt?+pcx zkVEU0GV!A)sx#+zmh<~q2tzuCD|%OslP+r~ewSFi!8vA)fh;C8+*pw-Z^ zO?+9;ReQYaw7nB`Xa)`I2@`B1`(;vHW3+M4?5p02+Ek`J!8G}tye(_I8#=Arb))ke zToaK{icb+0=i#h}$y-)ptj;I{U7eZg}J#9)YGkvr7b+0(*s%x#R?G?AEr;4jlJCv(^r;ewT^sr-N>^$UBz>u5Z@BIXw~_Y=>lFut+Mf~SiagIkdXR}p6SlS1k=srDl!axqS0bMXDk*Zg-&MThU}7l8LD7E3P`4TOilatF?J|cQ z@^wZ*>j5lPG5HlNb@fJiWzlfQ3?=Z2UX_^ag^LIO{>V-94$yVp@`rl*Lt&MbC7v+V zP3GJahPV-Tg{#Vp(ddn))ncp5SCLT*c&u+M*{?GB8^amVvp?bw)GYN0C zQwz<>UoDKXF1^s3E*`fpg28;Mgm)sMhm$0VMOlbH`i^eVC*J72V>~$#P-W}cBL?R3 zKHiSG&b24jGT(y&5oS#gM@41UgvMCTA&s$;N^EM)d3s7DWl)sRlNByk)2m2FYH_;r zZ{>M@nxFpGIUlm#YLf30zlEu!w^)CHsX5Iwj#{(8wgvbp&nMmEr;Gkh+_Wh%+21fz zDzbfv+bQy4dUtJR+4jd7^F(jThNZuJ0#|A<_CuviSFy{?6Y?aYGU4#Or~%ql7&SIYUSeJYckAD8TsS2})yMW41ZycNiRt{CeBcvzH;d}h z?-ARI`pt{LB~8|yj>(nR25q>|3s^E3Xt@KEc)xH)c4Cs7$Yvea!5Q2~+W1P|P|^BA zUvaEnm3=O}W%T)cj)^nupT+&#t5aH&;?1ZgLc~@K<+{>Xfupc&_TwCX*-zLa{Dh8% zKi-K4XGJeR?B}p|Oh(}pjZVp%{+pRhP;Kwq zaDr(rYJB0BznC`Ye9YM{_cV`16y2WFIay6 zYj=R1A-p`<$Y7vi3WFL4NSfS#Z&~hZd|-eXIj-@+U9H=F|5~_h5;jeb1GlX*++hL5cD*g3c8}EO=`TGJJ(FxQEJ25#X6S)SCby7peca6OP2ExWH=Wkh zIo97h?!&V`nC@p;Ln{+f^QOXR@5j7`=dtOm`0VOqt+&0acYwMpseW5Oxv^tBe@!PR zuO0ndce}R`ye`bJI-aJ`XRetq)qD2o-0Qcpy3kgaaMf9mXy zo3?#&Vahj*kDIOhs ztW6_bRf5kkgHbG_vwnsy4}cK4ZsOIgp2rr^tgEr3d+Ke}_@y^@@TcaE8xEm7x9`WA z+*`is+^4>z5oI<9bJ+asPVW4dxy9b&Zg(B__2pCg?}kEm?d`*z>*9(1al-nG^z8X1 zvFmPH_PD$E5Vj`xt~Vd-waOBQj!sEp{k&aqkwk9e=5^DRT&cSCmSmn8#}4%lC&Gtk zCz(`kBT@^-)2p4T?7uT4yHmG#>EEjJmU7OyFLKT<{UWD`-V2%ue#+T4V{-PgLr*%Y zC#vtVC2FMe9mI&t@zm#OXXP*1fv4pv`kuS+^jDD)bzZn6^6GQ-;QDMAT6}ps%zryS zEEdN;NY!g)yWpnoQY3HU^?IKol_K(LzzfwTXTe&lWAvr;->dsp|DjA8q7xmlW0_PV zLZ$I}uOg@>xn=A8qH9IhHSm{u5V~(x=TBvD7q>w@W7B&q(XUF=`r<1$EM)fE7`pT! z+dYdGggx23z7$5iy=!qFlTM;%Om67A;-Yic%pti~bnUvs26y)^f^qLZXSx#C)8C3x z_cXS*y1de-HJU>zZW6Ao%u;;Q0{6S)REO;bI4 zchG2)6It|gJ^W$a*^55goCd${wbXIx-AUmonjhbfNgs*8(lT0~%fZddN7W;E(Z4O< zgB#Ds?A@vdoTS><^w}ye7H*v@`+0^FGgme}I_$}{)~~!Gudinq9|Y5Q&L)y&b=lAr zb0MCnw_MA!4_X#&6Gm&h)2@v5?<#bt4L!Bam5ZqdbG7IWyg#z~-5h&2T7^5zQ`-z8mXxPhC3Wv;B%)C9`pOYBL+`>N$ID&+pVVjSl8Rue$lF!<@}M z^T-V`LbP0@wrs5pMS_*kdH8SKn>7{jd(!#g3nza}h5hf1j@2%~`j}5>UH*x#Tb94u zWQkmVL&;R+>n9nEhm}`DZQG7>#NP>d)LqDy#(T2UzSqdR)7}w!1Ydgf8GNr~>`r>; zAT>#IyX&%q+=vYw`YC6tqy0jsy#9noC?+}2?00&X#~;py4B>Ee)4V!DCMKYFzTlCT zVeg!O`10$dx0B1}c@Z26EFK~r+ehd`uNg-NP}KK`{H84CuL^3l7V$>otApEYl zht1bG8?(CAwhdid_iaCYVN-6T1$D|g#O+ z8nMB{3@*`@eAOjO#%60uzBJIj@-6a5Hxym*P&yjw4J7SIA#md~)PEO~-GTT`9?YvPu`QE#3@40EGb0e_2UQtTRjVQ)Px_;+= z+eX3t&851z(;ZC9D1Lx-uXPuh&Ner-QZV4QQcgYiIjY&;wq~`ri*-wMsH)SS7q? z6$0RYUGLdrR$nJxwN89|rn8+LxuZt*qFFx)cAk9G^AZDJfAjH+vEEC`sxOvI0$(&S zS1Cys`MM)-C2ukJx9BwO%^OJd*NrzSEA^A|+|?M?MBC`l8LM-xw`GSw9ZX-SUj$tfY4bt#=a`y@{w2 zZJ}Rx(HxUr#8tu(J_JpwDdCI@-oqfzn%u0enwK0X<4cl#eR)xE&F}O=f0B?5XsMU@ zn6_L`qdDnB1b%*(83{uv8J)GSXibOno}8>wJ@yKc`hU_QF0xlWY0+bGS}3geqke5# zLv6Oj+$&#_i4J`_k>B}SF&~}dJ*D=TE1h%?*5_sI(Lh2(x@+uD$v;WO=$v4VrTF3v878B2?m$CKcMMs=;)N@3f zkf=Wy@gMYq%Bn|1Dz``DP6Uz)LT=NQ&?6p=8#A_j6#cXE*P`U?O*Sh!)Q#IL+C(aU z_I?{Z89lBm)Q4VOa&*;==b$3zQKQZxEFomis!`q0W<5?uqDpn_ycvflAMA=g@ge$h zrh1-_qecm5&q8D%X#|%F7qT_2V{uoFL0DNoo%4V<%?7}k(eqm)(zy4;Q|p^nS{olT zmL)l;=E_j0WD&)`E*w>q<7?fsaK1sYT-|XCz)KlOGSL)FnXOE#B z%<$2Vs_G|wau_5{K4>-v^;I&Uzc%Z|cn@tN`$hxV!HD-GxKp|Eyd+`DqZW1MuomyL zha(y!@vwYYQ6DRw+jiWtj@bgm<(ipH^)2Js7`HzG4@1%fv1>q*+>*Qk-Rz5?2L)4QRHk-+Fpi-R-fT%}Kov{O?$ZccP$$ zpu6-m;)+G`%_ue+^v^#Sm7q^`m3aQ1pOERJep87L02s1}m;^F4XCArRLJX=#f?oe^ zo|WerNY-QcTu}?H?KH{z(5zewB1#3CxTW+hTQZ*1cuRVlf#uE@{RlI#Q_A9|V$Zs5 zq|y>&C+LOPJ7xNOej>B_Io;T^V;_53+ZEUQgaVmk-zsSv8jJQc~W>=k$jN@^AFnxJ`fW2kmj0Tng%zMvLQR!_!odVhg|dP$+fm z);mZ*=e<$P&dKL5zt->VZ@Cz>k=26fbBdaTv$TYeP0M|M?0wYwt=G1Js;;QP@1PRw zkB^~8=;Gd~&-SPF-f!J27ELs0obfJ=qunnbrCm-g(I*B~3E~QZDxEl*GK8reAv1p~ zwo&lsmi6e3FSNtfXkC8-=NyzpF{k@U+k{0fENYdM5dL5y=|`9pGcaNU*u$tjrS6WM zwP$}r{asN6U#aQ9Je%xAX?@=HY|zts{x5oe_m_H39SnLgmuQ;OcF948!5%!Hu zELFX(dF;KvrvCm}3D`gDY>{|*;hyNH83~NV3DS}k4 z=KHyi_+`7!dx4oOD3U=N!ZNY5HaW571q1Cg-^mhLA^B=%WRQoHX3t7tS(6Axpe7iq zzM=Q_3Jqn~tNvvmqVnWX^g}2IR22f(BvV~AFuAEpIO8h%0Q(tza7ItoB`{!lc}cIo z5wmpimo3W&z>5C&>M*M4I*mIFfo1i&PG;g zBcf}2U>*4cd9cLyVq|H@?m(QwPv`V+HJfo>RZLT>)QdT;MN*EZKc{9QqbKBshS1T{ zi>wpZPQyX06Bvo&C0?{=N6u@1d=oNK{53k+>2(F$Fp{DWtBhEHh`!awXyGag*cNtH z{sylsYeNUYgJx3qT=X7D)VS){h)VGn9slMSi;+NxuX&*h?_B79Ep6cWO6h~ol@nIy zK*AqNa8nwAS?Mt3FPWRp%mS|5T3ZzA|0^Y5nlDvs5~-og0M*>BCYqsMTZAhm9KUF zt$PB_GdEK-D$bYM^C2hZGnRx04!MNiy&2}7Ww*v=9e5zqw5*(Gk{0*bhEW-=?t8$S z21%Ub&Gu~Y20i4^Ui)+GuxM>%(CC6QM@Wax@QN(Z2JfY!Kho<*S&d;urUt1lg2;yu zvcP67$B6Y8?IYR~gw;KdW{mCf$*aZB73Xlu;=}HRrcd4qRuta*v4wCY_<#qUFqN}S zU+1LSMZ3m6=-}$}#4M4ch^_pApXxbk@N zcMTrr8gUXLPWjPkQ)#|W83C4>qx)h|)3M!WSA@1-P6K#4dIdM%D=I)a|)#N#3l$8|I5$zu$svX(bkDZ=~uLxXH zmTq)RuXN8C@f{f;-Nzw-@Nu(k)ROPm!(FtG9ew)esA8_*;y~Q#qk}0>0^}((kR#0V zrC5kk0p$>yzo7p|ev4E6*XZ`FhSO9>E}{OgNoJb=Hp5%L0sG5~&X|b1*B2VKLnQ>} zj5%stWN4I|77XS6JKtq^Kl$mNB_q1Y)Y!BpGSg3wSf@&h1S%{?9W0Pu)^GSbnJm9u z=a2XEQ0_W!d`L!|lNslNeL908=VT^KISiUzig|EBoIKP{gWtPQo^_y*qms#^t|!nU z7w(>o#Jnzrdh!*2rPRlF8PFRxi0RRq)w~^XhTT9ZQC*3C;dmv8~v530vTOWD?@-RI?^g#Q{>NAg} z#c@Y;+bV0QG^Uun>5Si@GO)z8FL1d`r^GUm`s1s@5lxToz^Cw?_sbKNGpfh3#fEjZ z4nbL#ULY|<`r}TL@5(fzc3%;MdIJ8$-zBLtp~crQx4b>ba1w0xXO9>{bwhnAD0aUy zAiz-m6Pk%efA-Xz|59%u$sLDL`KIUc6Fhd_GM?w-;2SELGM5F$*;vke#aZmfGhd5J zb{KNaJnwbV8rD8ZT8E?F`c~^%CsGgQ_6GM@_3Mg#0x99FuO;L2SQ&?0%27@Mz0y#wqOtem&6+!%D`r2*W z(;0zSfASgcK|_9(P~coY#M}M&B@R#pS7#(&7T1S2%eU-p@T?aZImiv0&-dD@2orY|e~ZEN~nZnsjY+-z~CzdY1nvdDc6X3!@Ab~fX?X^XG)-I1s0yFn?q`H>F& zlhTPlw*@4`rWdAm-ak+MzuWWM2DbjxzY`GJu)=hA@o;p+iEtJr?Hx%l-PqC-HErdL zE3G>8EzSC25mUDxb*^YUsi*&)f=pVR|5_|Kvp7FaJ<>b-#z){RJ`Ud&4-Y*vNtS9n zSDpKD%=4nZ2;Dg{_LbNBIm)kZ?+b@nQg@V-vQz7Gv(tK~!PbPIz&3ki=|%9Sy(>E7 zjPm#j z*R+V>)l8fAAE`qwo05oL`>%eu-MQs`{f^osy|@h?%Px=Em2lC_>S^D$Ddeo~@&boE?-_ySu;ca-e^Iv+C9VI#=V>b8YE&=ar-5x%Pf% zHC>vF(QM1(2-EhHopX6Gee6!bt4sK8dFw-tJQtsFgMMo-duV1~`HUP>+I$2uqTx^a zFfGtOeIZZy|4y|maWBw=jX%Z7zh&buswR%DeeE~0wEdQ-+B6nXA0Ib^$Rcfz@A`}s zepye(`5gW!-`x9FXz^5>;i-xznjv1~+ISIE@%88fc-q}V&h` zm;3l6^yfWZGS}9LvXY{+XCQw&eP_qnK3^#py}n=Y;P>wRg3n}7ikWoZtdB;MM=z?9 zvOVi&>p`V*A}tj^oG8=TH{ZM5TzME&S$TCOzGp=Tc$p$4tdqN?oCaOXVYxVao*P}p?WD`f0o95d^nBF zRp@v&MMivFYC=^nGQysPyk~=Z@~*#QX}F5l?h~V)%RVXN4s^c~iZ8KKe#g zSb3lk!nJdZ(?K$99b)g1NUnZEVcy%RxLSMO;rYAI*QvC9PG;n_)62jLHD$h$U=eOG zl%t>a7ku|}-#jjC9lF=KAD#@`PV6jSr_!e#=r7&-MHLikQ00?{xYIi%!@hAc8)MMx zY1tMk;uy~Ln<`oSHUE`S8@-2g?KW#-aCVzeRmV9fSul#DnW(-um@@rjVGWh04$0U@ z_o-*zyZbz}xH`~l6z3ee*Nr~uu@hxwF{OmCO}s;8vl~ifZTXzF=ic5WPyAZ3TxZIa z5jI`XlxCKgba1$(o>4oZPgVBl4(aSv>zVD+3K@74NG(e`-KAeGYOOPJ{6^`nYYojI zfuH|)x*KvV0o&Q6znG+qp1$Tt#);@V?8fXSUlm?26-)EYV$JPQSJKVQB?Q%N>32ZFJW&+b5aWk>Do^%Oh2e*l2&H?%%EM&iI-; ztk7d&vU)m3`{(SFFT1v{pV>a-xqW8)E>@XRN?dG=IGKI3c1h^(_I~91>YVi(?~q_W zaA`+nV3vr3@R;E@)wV3+e>2X0Tzly+_NAkHUs3wdO{Y%{j&K<>B#+YP>ZoJdJh)rv zG<|I7=;PwEdw_@TTK9bFiIK|qXl9&yJM3OP~1F zM^7WgpBr+YVb+>-b!szh3U`tE_K&JFj=@|ro(NjqzHS?c!<)7J*b`&9Xc2sbrYJm+ z`KI6Jg*)*R--CD9xj87^pNw-}q-#;W2}?(m6BPPtO30DQc$FvH-z+QdZ&qFZ&>W0> z`mCp)%JN0SJIPUWL_@ptJY(lSc&}US<+* z><#8POH$%hpvx0Pvm$AlZ}{1ukEhuqoXrz?h=Z%2xI>XsthOJwDA7xQd^Q82@t~i% zVb^I@@*$;kY7}s4H4yTlSY@5RgkyGY;C+GeJW=4MJ2{9)fq5Qu+3edTlp9W`pFYpK z{kUH?!nM!Sc-+wlzxP#bJ-P4J_Zf{{$c^(w6=AWDfU`mIunW(ubS_OCFi6QvXkWCs ztUO3*nkFxgkRJ3(I#oMInc|Ec?3XmPz8d6vqU5NZEG->mJHE?aagIvy5b=Gb`4Hi% zI)iw)+!o{q1L>ugI?owj-){=ZD<-deL>x+)((Nv}h=;PFG0BqU{y6kpw1f^S`iXbp z18yU1*_qv^ux=m&iaj{I+?LF*xQ`(FkHmd^$H26rW1l5Nd>AE^u76^3Jfl!0XWc4w zZg4zunuDW*8S(3(8_<`|r^sCW*AMhsHMQf2d>Wl5djONJ9Q=b+9@R9-=(sk~Pi3Xx zQTnuUrPg-jef_8z*Y%AP?r5;`0~NQd>ABzN%-=Wv@BgXU>|fNi@2Eki;CFfaK7NGI zPoHJp+gn7bOm^s`F7z9{LizA6uQ@>hepRK~_rrMyl36hW4bs6+O%D|DqrR@4GBiI- z%;P~sQ^QPU#b7BCR<)Lxq1fSb^grM1?*Vo4^ZRcaRZO0uvHgkL`P8I3VQ&8PBY2~< zlwUy4Ji%gPiqP0#a8-8x0k77Z@!zWP&F5i9{N?vlNpbN{3ee2AQF!$n3cF4T&u6HF zkGfV$E0Jv5N8eOQcrLk4>VWaE4!a@U+n<@heHz{&Q89{S)|yinVHtiS7S1X*d$)r& zI3qfMroLyPq^(5@T5R=9^vsYcXQLGviL&1{zjD1$n-uDf_J)qPT#tTKD;q6AAyy83 z_SzMT7t2LI@&40YM}eWHvCt<8%ZsI^)*JiDWI~@iu@Arhq!oXcy_}vOC?(^wv4bpRp?^##8)uNs-rS?3+cvI% zC;6mTv%h@$!&(!&k)7zU?-wRO^yFkzq1JosvDAAC5`jK9ABf`2&!2=cp#QOHicTWFiX*pydnVwCfl7z+=*u)>U(*_t3KL|LH?{Drh0Fd+XnckD%ko5@bTE-Z%J- zW(Y6QL|fytT6_e%po!SD#ymjR%rX`x07dAMU!u=Rn_H$nyHXxY25%&xd%(71^MIPj zQCN`3*0=gHoz1yxX%Q@AMe1LaEt@v@Q2T*pqqmFA0()`3P%G{VMX7(@Y}9e_i5t1R z<5_v2BvTZ&1m)Ag6?cS*!jqFvNpzODQ>eIRXcFTU4e!z^V%~ zG%fi5D6_N-)~EDNA1fjoH^r{X-I^A)=+tsQ@1)>0TV%m%h;`UN~KvMsW z;O54kcqZeDW={(qqdEFaEx9Tb!Aw&5FIuq1pmXgE5keY%1Z(X zWQ|$E*d;3+m48kwTeyZN^9c=@)?@#F+rIz8 zSMH~lQ|U97VrLbvdcmE!+|@O3dGPqIu0WRCJN|I{;U~T-DK`;GwtUqXY~_n+7>ei` z!27Xw&wpePl9;Ndw9t7(3rje1bM^fl*|xpuIJ7L?YIxfBqu)=ex843#!(Wx6@^DjN1EvT>ouwNLv;d9t8*1D*RGzI z^wR(RKYHD0c;LL&ZM$U6%>I5YPR`}Tc%4pAFI)B?wT~<-3DOb>voh>nm#bP5h05pM z*?+iLK!TIhDHZA84}QI8ym`)w_mFgN&z(%wkxxrY>hIt56l%Seetc8-SAS8d(pPl( zx+kymPNefG0~xM6BXu&Y&3XFnDx?N4J#A{;$i%edm^;im_M>Bmy}P4aSz)O4u|Th1 z%gerUQJH#Kc%yQVy6yi*z5C(Q*+mHDi>^xqcY(YwO{Jwj3Dxm20%57~3Io_}z-Qzy z(y9K%R_A$dUFnlb@yYuN7hBn*bCx&kMZL?>0v-Y?0G|bg_G|hTRifHwTnPW&1eIxq zUZ=e0q@k0JDU{r3V1ff!;3sW8&=TD!>ZK7c|{kg=<;{T(lrWB zD0Pg`%%)dhgAVadKJY{%^7M(KWIS>85h|1WYigC9;iM@uE>xiq)L)Mnxx*Fq)9Qb( zxZ>Vxw4B7;u*H2+kkI9?H%X!6g>Fq&HXr0|$42Z9qK(7Kq!e5=)v)KoQo0{PHoa=j zBI9;}`h!HKXjye{#~R;nK1^xiwcy5XYqA{=YSmv#z=3r_?LUc_M9m90wM(4%` zg+mr4-Fse@X2&A2p)FrtA!U8KE6l{V(%v>-YfSP_JpI^oA2G>;hdXWkU05qP8k?bb4NbzglT^^D2JeQb-yz(6WTBQr*kLMip=9yQGgYwRd)@2;4Iwt?`^(F%HdRkMf4^7c&89KMcQIOdM zmlQ~E-7uAJ^fOkKezbP)2e1lj-%dUj0o947azFcciGBW%r4L4ywyxO6#%|qR!B0t@ z&e!s8xaTd=ul=rUGjNZjUG_=bBk6Ro4|&V4+dhRh2%OTSKfgpjv4e_YLyPesn^kQ~ zlK8FZQs~N(6C?j7cK^PDcapRA8i{n`9qimLv`8oB%5>T)82M>*GkE#;xAv@VM!E1} zNwY!#+G|tEt>cMwO2^VS@!S&ekC8yx=`tk=C65V4`v&pVC}*wya#m9DKquZBTSg-s zXiOB!~k72&XhIXC-RU`^b6dFl2t5rUW_uUYmHt z1E=<4MtR8!JI?9dNlK524w%#1ASIXyE|~K$SNVAu=W6vU#tALdR%z@C9~dVzapQMa zjPo)p1je~om~MjPFcU-f6!-YXFv{Znb9e4LzG1mtIA?ZZc2fH0ug5kIUj2k^ZUjHT zO}Rj*`me?{Ki*p50oPo)T8^JzOl|!S!8G^$y}~qKXVP&xIsFBA=Hf>eJahOFezm#l z$O~_cBy_rF%MFo<8qIV*(t_e0Dy}IKSFhD6=<5|8{*6DZLeR0oTxQ{@TO4!i8Bm`% z=1$wek_j(fG9z>jb`2j0rgE@QOlQGDFqU@W3rSfGts?cz?>R*qa~hgEI_|q!4b_`L z&;;z@mr`G?f2r96xfJ*Q4D!6rY(z%I>N>RvGS*{Jn*H1>+;VFnDPzMecNSWr?U{7a z1-EE6AZ+A6=L82CZ>Ko2xCc2J3vlyaZy}$99Pu%6e9Ur=9qV(N^I25N(#p`w%S9xD zDu+6f$3EcsM(<73T&MfFz{x)Ma!z)jRYv#Oe0}pw(LLQpcGQNRd=p`7hw$o_{L^ur>p1!*}hl*CQ57`H&C zX~gb~WZw64ujpsry$_iYCB zF;8fwWHZJB!R$Nu${Fk(L@&MX#96_66w=y#WyMWUxWKeJlz zCPfxH<`!3lvWJY|A|%0Ty%CMm>ahi%U@32CpgX%-&)(OD1U z$H})5DL<~7Q*_Bk^kcqpgWLn)n{ogl8H{Qz4$26Pf%>fG-^&|*`sNQw{})c4Y>Ov^ z24_d8m=jyXzkG_7`TVHv6n?9yS$9*OPRZTxRKw>3V!PuqnafWo`f9{^hi39fb!Q&+ zuix;Lhkox8Ph4(q%`96t_J-eA2=41l`)}N3qJH*RoTpI{k;lotN9&5-h7zsmi*@}|eYi92m`Tywe)B={GKpGo&V1`1#Qa*-(=EK0M+W&a z35~_r56QbJoMHOm)0<|vTJKBs%R2q&aoJeVJHFan*P2qE6h<2{un5lt%iBDxNJq-u z{d3)ZN`S%C;2XBtdYLR* zZ&w+66f-mEZqCG(bvv;?yv8Tx1ELf zDBsJ;ZTWX}*d;~B&i+JzCqD=0UFfwek;C(BSa}9AU8YnbFiyq|KcJD9FT^>#^5(fO zghcZM+B@C{jgpC{k2S6$A{~ zFomDp2J%wsC6K3X$L$`ncuk^8?qN&9xAl7_M33Xp%3;Z-l^Wio`!kWI40*lX4#5X)6FW91!{)Gk<86TyF~T{hm+9oFtI(C{$ru1sIdm&B85coipq(9JL_2 zSl!kuy6Ox*8wD){lDV=j{5w5zdD{IJS%VlytvKC$A2=$2&iCfZZaFNW+_q(@Ossw) z;LTQK7Yq4=7C@u@@YYqrl`HL042ph~9Q{Og%7xp0XrhoCX zqWIl4?Q+L|%vf|1EU1|sdv`S5I$++q(qBpDI2C#tii5@^jiiLai!0toWZv&T zEM`^6V*c3p;EC}46sTua zuHb2}a9njjs(QQ0i5i^si)RqSHbwHY-OTnDANq;! z_M;O0C%;S2YrXVM+0|E3QGNF9q9Oh3fef5`hd_vuufq&mFBP|c3K1NrKuWPAX=6uo z3OWLB?-elk@MoSPR%4@i_KmtlCne1+)ti5ChwgDWQLp$2HmOZk2tJd^{Ctn#^;{)- z&Fjk2l-7@TeBM-V$Qae(LZwMftk5}X-F3a43W*+__T&Y1TXUHr9S|*SA_o5y$=Mwt zV=U>1eLm_rGV2)tnnU={qV>sVBjSjvE7iZd>gD7|)ltB~8vXETJa0PoTo0bT|LgPo z*ZGf~tj?0aak5Swkf>9kydfojL$AONLzdqt&-;#%B3-cwRv^1KW?=t+$!2ds;wa=I zs(j;}1bu2|mKGOD{k7#qk%$Km`u$tq z&wDEc`#{+{eJY;zuDP9$+hwPz?+ z`>;(j@%@X+!)H0BSqrhNY&qc=_Z>BUfe*6l; zN(H{#v!cP-j0R!H7JUaoe%jdL=EmQR*N79zwV!)~g;og6h@<7Q*T9#pyOw!B)Lf|3 zzgYXdaffYG7K3pwJH$6XP=-#vBTS7UX@j5)rPZhXig@HRRIl)o~?vRXa z^O(Vm$vZS|o+ogTKQeGyky7ldeN4mo%XKLU3D|dQsczZEPnTjfw{26%;jeVn< zP|s=$ALxBTVo(|QXHHOVc>LP*Kk%SaxBl}_{1ytG)O^*wYpf_U+p=#ONMNGshVJk{Q(0hO^iJOaLR9s zgIk<}?k}Af9H{F{tP=Hn@`GpB>l(Hr7rU+}TDeLuy5A#jKBr)#;N^!}-NK}RoqN4L zDCN3%z?k2B_{rVgp-_^8D3FV%9w|doVfPK3YgXTo=;ek8`Q6ixTf5cZ14o&Zq&_rU z_G)^dCCyk=y;iSB9XF1-wUoGbK{3Rrpc$T1R=UZqvu4H}9@nXuaV+E)GY%@n!bow4 z2laiTfgrz0Jo#PAk@rtx&hfig*Rzg(4wspA30e!+IKti)U9t~&bsb>daqI_k%8mLO zIJnpE{owTD3mGM6>W*H6*2FS3^%(nlJGHgnB5U!Cm)_ZsU6_5i!a^XD|MGB`*d{LL z&ez&hXQxY?OExCFHxElSrs5(m*tnrq`=k2^l^zqFg?F z{!Mv#pd8yo&n@&b*DOWX(jpqTCcJ{+E6eS;rY0uGa|0Dc5#Q zn)&pT&zvQioU@b3%gBBE{N%=|Li0^LDNdTH`D=FA@yyhGW`==irs^%*e#ESH@^);4 z-j6#yQ_i0?PeEqq2+GupkW%pK@4;I8K*v|?X658#W{AsN1$zA`L@MBM~?)ikuq-4mhcuB*$JD=icy+m^UjU$L=n-n7TJ#?^l&5 z$a{=SURe)&>E(}3dit_PV=#kN7Z9Tzi&yT2#uN<>o6V?Dco*Ju^x?Za-VLE08sOY+)>{_)BmWp@d#XoHI_zZa?V;uFL4=K?V3u zM6|q%T$z53dBN%tUh|p0jj`K$wiM`0THE(XZq6Ov8{z=V~rbRN-XlZHQ z`%fAgE~7w_DATOjnz)>2>)8ITP8XFuc-qv;_(>#&=4DVwdqtUV}2jvPT0cG;t3-tRf_(KwM-7Gf@W_eAX7XWCt&znjoadTZO^Qme%r z(~k(I;X2#<c4e9eB)9V%hMS!YDsDK3@mHbS_+Cv;=y#oFDHj}l zW!8h{lKeyNVJZOX*mD;v+BP#0$zxYC-or@fN?Rh@sm*Ph6D zi2ym?+0-iUK$Witxz2Ub=WDN3T9!n+y{S7j=Nj_0oom$9M3-VC^I(Wuy5K=qJJlN5 zH+tLh@0L8@1$5#HT5K8|;|FW>G;OK**{&aG_Wd3Wy5aMCqN*QWCtg0k)6zuO%DbG1 z+&ZNu$C)_cqxRN(3qtSund`V(YYk>yY`e1(2?85XeODCB+Ru#3IQ6sq34X5YX}0yp zcxxWkI#xYbo_j>!4m3xHDXU&re~Z9gH+qoxq$9;veNYW=LF$JFQN4%3yNvSQQPys0 z#Z~O{#=l`2#tMTed#bM+SnNGcam5aJW}o+{$EVJf_aY*wd?MnDK&}4t4BE!#Uala2 z$oHR9B+&EN6Xg@dH9m2muXl1VTX(}0QdssqZhXr-%OUv;?I9cYLhf{AJT;fjedb^N z!=b1{=il+pJsHcg^M^zGVnF37-$8YGB|(dKrv9g2ey9BtA#R=NAUkM9dc&*t=-+yi z>277hbvTPdZ|NJapX8B1#`(Dt4Sg4Q@mf#@~Ja_ zD*Wug@0!<06>360%A@_R^@DFUpzi#GM7Ym|WEe*B4BEUmd+q(XPo@W?I#woB@JC<& z!i)OxYj!(%kGeRaa)Pu$FA&%sovMgI#ZSLE|W3wP!7rW zwjU0a&VxC-NaA3lZ;&17Wc_DE3)-b`@XuveaedM3YGtsDmhWH zuU!~UNzj%%mpBh%CD`Sq?I6F$wx=yK`p{bnjl{f>JQ-PMM6;NLbra%8*(TB{7b(@hn#S#*!dsa=>3ftU>!XnmlOoLoZzD zjNEHqmSyuS&X73m{q9a+Ho?t7xKOcxHU|%IK== zqF~7yZ%aAWr+3r7V&#Om;W@2XIu*;xFWz0m&fexO5}JQJ7ei#C%?CSYEDXlUJK?J$0+FYY^nvk(@lmB>8&@4)m`6v zrzwg+lPtF+&^L-D;kOGb%w9XriKzXdYMwHl?`vOCZ|c5GXfs~IUQ#<}R$#hfql^mt z8TW_W5u+z3r)3`mpHxfk_M_;rgTySnn>PY8*9`7r5{=I&zT zpE)tKC|`7aWC!v^WPYOpHC{#9$;PD#=YsgAY<{4ZewK-#<&S>-ArrV`f5-%MW=?(> zw2Vr&mE1SJOhr-cI`fT^jb!@#>3fy2dUwkbN*>GQSTUWHW@0A=)26WB@ANwA*X;4- z%O_2b8%VvEF28(vad7GLrNl#C)S9pIi+x7k4xXh zg(wsWX!EsFOX|FS0}K3v(8WA&b;SYyVxPP4vm!es~>D|W+W zi?oY0L6yF(ThYxTCBgvsWm*nE#qCqyI&U}eo_Ljv< zhrchCMeIpwG?;Cp*mGAD3m4m`?s~IHt8bTdIF(dHn4|2DYWFaeJD9SmuKrxyqUr9E zSQHdBMSU42Bn0xsJQqb-4O_c9#jV9K=5ZkB+zy^?DeNvh? z`8$wG&+GHaj(TbtVDoeG&`r-F-8-nJ-ItF~oO3mRu*!N%O_3UM(?9D}LuI6!zIk|= z7Tz$=Q1#ZgZA$Lg3hZ<2>wYc1WVr+XY*e4)tLaAGopcr3XIBmen*Nn^8vRt-FPl@Hq8zkCv-8p6ABKh@mufDn`amJ4E^e*cl zq>2zn_{bfVR!G^fm#TS4EHCtt72@b2F8YARqe3PJn?BkH0xv~JYosJ|XU;io@x3Fu zb1TA0NEN7NAmY7z!JiK;YysEuGuO}=o@aYJV5iJ9R`kd&m35L6K5h2MpTmA7n$}5R zsE16GC#hD2IWrAjk1lR95Mk_ z1fMTHcN|Pir8qcgKVzyH2POM;eiC7DC;%JeYn0da0kBoX{%9jVdc?q8+F|}VxNF)@M)Q-cB-%~0*j^)^GM$ZIYlL=eynC!a##A3n!M#VvQq13ga z@(MUixutQ~LFt$uSzB>3YDi{1MLUF$FW{HNojz|Jo)dmmt8_Gb{PrY!_N)3 ze)VsgZNOPR$8?Xg4hc=Cib^7yQ=t|R+9$k{JiRAS?@*yVh@FOf+aA78kd!UCD6Pai zRf&8HTNPX3lWLMMr&MjC^aC|W~=D2H|%s!!RHe*O@Sh} zZjBm={`C96OFztRQ9h|m;FpbYBs(dO9r47q*FC2tzrO-RSeOvYvX4!p*Zizoa%={s%%bHij^vMEj+GU?hlWubPN6=r1#vv9KY>H8(%^ z3V}DySdN~1T1euJgxEG(^>xP>yVl+mJ*lZYaW({rv>ci_TyiDg?z`w=6IbjsD(~v2 z?0-4y`UKh}HO4;$E1t|kucySXcairgQR9g^i$>oMy|^zT>|1ccFjUDPk^qi&&L1vV zqGy@0USSEX%0hy*QVpoO@*J9iwYI?{jyTueZdLfPW|P7VmCo56`xgu`sjSnh$^(90 z7?w{AQ4-nIk#Pu&2Lz#C&AJON7Y3tNZ1jvDIL)YtON|A3Al=dAMAT7wJ(Qbkeib`R zO1Aao#>FCPGg&fdPUwKS+J86PFxL;CiW*~t?2~7)XKUP0;sG!5s~pKJn)yY1f(8B> zF1*eZjha3wtKLHV^F@o{*H=YKLhZ)kgT3}GW|&mapLi3jqmy64#7XJ1^!mS}&*SD&xHV1y~xUF2FuFhY?&A^LRGFFK5Djx5;yN_anqe#l`+; z85A{QyXJ!)lkSLURA-^cci%mEQTw&s0{Pbudap)0yk#{REh;p=zePl)H&OlBJ^!S= zqVl2V=gIikuy`>84p2#o9kSyOU%Crb{|kMvX1?0%Z@fuYocqEe;vstdVg&MQ3NgK* zlE?7jtD>F6t55Q*3?`lFB3 z;dNVNkmJas^O9-$LsNu>2&ty~(8t7$kt3RTu90e42PqbX+K}TpKAmK5YI^uZFB%aN zS*>gCs)c7?KW)M4p&6O|Pk*{8xuJsH?=pdQPqg*)bA7DfUZ{F{(TkqG+)T`0u1F7? zw*}_?HNV#(yWm>=OWyUi!F_S$!yoHtJzc$4P;^H>KiBwM^`lG#%$feNl7#nOmF7i1 z?x0|~Iku6j_*n(hejk;8errS%`=8>8wbTU!XIfACvb#%EhqU=avUELt5|a=cd2PO@ zq4L_;^S9KO(-Aq+5Q&Jb^}M#I=_N)q>vkdQ7XLQo8C$%cp|qo3J!rW{*F@SLxpb^n zFjnQ?D}hpgJm^rQwr}JqWt&I7up&}gq5!p)SQpRY<@?ae!@Yj|9Bz@o9Cu7||FG{u z2NnEIdp-6(QzFy)q!JckFYis)0qq=YsjzO`$tX(snP2FYT57q7+tg6VCiN_fTb54- zm42g^T@FzX38tQWUn*lYeUiPa(z;m)ul&>IlafG&utK){$h*sEGPOEk_BmzE(>Em< zPrXRxQ*f4dva$^_{B!0P>h7fQ#l5yY#`iYTUrd2M+m54H)FaI(yu7N-j+Dk@K;%1Z zS9H8lSUt9>IP!^Cvq^t#5}O1vUi8-@mP+d0VZP_!+>K6MX%8aYb=_KB8KSioDk83V z4bk>r=yw%pFXVH8E$W+mSmHszq*U_t`t(IV3?ERmvA4n>B9Xd3B$A_N+7l^7*_6dG zU7P)?Lr=NKLx9W#wak5EuLwXuc%Jio{L5-*+t#<6= zZfW#Pw_E>PPr9nUyYAi4d*fXlIkx}x7IfL^zy8;ZS?um05>;%IeXkw`R@uV2Xo$?e z;8l8`c68nVeu$ed!Bfbu(Z`Zq|CFBB3J_85MK5BwXTGj+#d8H!^M5Z{sWSXua+h9R zTtd0>vtAZv!xq|M1N>(t%csk54qL&Aj@2M~O@&?ssCH2jBDz?byXqjrbTIej`y;TkmJmrTH1+ z^vq3DX+f`S?D=x1EbWSoGq2+ivViohTaX9O-k;U>~bP;c6ftCHLqi$gdqYv+Q{EnBw!yV&Orq&OUT3W-+r zi0ij*>5JEW&+E#PG-)n*;(zAaau~-{sL@yD!V(5~{zoaWY48afy4N6j<)9If_W4zT zfiO~RcS;&k>SO^Y2qJECN2}}~poS=sgtnL_4h~xQ3#Z70<$e?c6#=>i>azB8>H83h z_tabSJ>7ET=h6L@=AhJGvMNf^NoTkaL3#hr|J697duZ%a=fA97?1P%t7ebe6dPrTX zm%hkook?w0sZgwgK)?IZ){D1!F$;hD;#V|_o-Y#1udx;DkOW;lcrl!R3ElpZ9o_U7 z-QR_yqz$1&cYVl+5T>S!Z{$Lz6>N8Y^I5B#Yu`%fx9v#Isc4TgH>S64kuD2wq$Tj8 zi`%N~rPsE+S(`KB)DD+@HPu$(D4kXY#buSua*;Zyk>3=1ZoSd5BrcC_I*IoNo!8Im z*Ib(<-d_!h57Ilh$}wD>dwN28 zK=i_0RZzFQi&M<)2N2QkSw2lRye>3Aj>8+8Ui92+x5)D9S;5sOgeJ=SbQv-`|2dXj z7^|F#lDO#y5#JSO-Yf9py5=)e==tMQm)w!OuI^#c{-9j4B0A`kw;&bd<&P_>d9|2G z`u@8Ng;5{e6;-s6y_N>{Sd(j|$R($)72%weD$Y6=Z+!vzaAu9tr5%S=ll#k?ZGG!F zZrg#te5yqthQ+yU_mVbyf7M&qP5L2fmd;E>-{e9z7;j$lU{Z93Ra4N}zL5m0jAbcm zx68`{6Y`uUDIP>C+bd}2LTt+zYrsO9%LnPJymK!<6+(&)|5vhQAE2Zv0ux)r$9YFq z8vajT?Cz?&4}6bY1Sa^PKC&V`vz<&u?`BF}G0A%JG&gWs*as-2vvuC(tfkan_!&_J zHD`Czq=rqJkxg(9nMKSap^q!BN*#1b#W$qK83^Eytl4BZI{(H~8EvwgUPHH;X+_=R z8wiJc917NpL0N2M#|J}T2TR|wW5?9=W=SY|jp?9EM~SqgGWm$5Z?lS+TqhUYbp!K1 zXqQz`oNIFA(L5EY{8W;5ZW$=(qIWxD$gCIvoUqUk;_E(kYt@;5SyG8n?Mz2!?|$P{O&7q9W*kX z*Mzog#3{wY>S#Za3d1`nhw??z$svi0%O3y8Op+{oUiEcQgmcLe0`W_c<9R%w ziZ^WJhJVw8XHT>Bq_Vaq2$>5%NYmpaZkd6LXG02gIT2x2juxavwosF7Q5%YE-j?^S zABMK;iDj0&JFaQUqT@N(L08nmxEr`>n$(w=_oG++vu8o`6^dEazW7rpHd*aS5Ung? zLFHh-`fnTv8YZrK);NcrEjmZ{;pCCbV@3Ppr_^-q^JPct@T-9GrSPD7(KpH{CfwI; zDj)IWiPy#2o5qRuq7S)^^yy_Z6CF(jdRpJicn|!+_0hclN#}g=+KzloSAm?N%+Evh z!P^Mrs=PCwv6g<%!Ru$S@RRfR%q)lGVk0{y$X(rBFRETwIw=mi7RN4=AN(l?mUQ+r zpdikdFPg3x?rMl@B~OnaR%B-)iL7mIj#M&gG?>UZKC>6-%bkbo=Ic$x6y2&_vtFJ= zMR(69E$d5V6TF;mz_t}Ff9W@P!0JccqH5`~dN|0=dMUpaXIU##_^o1|`+7#a(IaPk z$-}&m5S@db>-9KOcElT9Iu>;)6bAmT_jIOFu&kojSjelJMaVn~pmdL<|N-#T{slvSjikA%SC%vtcjZT**HF zvP{~vzw>8#d+&`AgYt`4^ngeD@{~X!EbT^>CQx)SZesDMK0AzU{r5NetZd(l9P3)T zj3zpK{@z+E)B=+O9tp+}o&=?g+G=VW@mc0M;oxf4h^)kOtWsBYQ4^T*4HcL~698C8 zelMBp$DcM5BmcoS{++$vnxq-S)w&S%BF}1Rszol7U!++QbCNdo@^}4$h%4bpcP%IT zlB~U)r6+o#&ng*h6N-v1qiY2X9K7+;NT*}3N%~n{S-ERvuS81tA8199wx)W<_adW5 z!V}nEj$VPq`+-gLlaaGiN6WQhEbtNWb;U*AJ+VpZz-?%xR$bM%C59>wD3eX%j<8JR zn@_R_S*r{oyImWZUEQZ%D_|6>Cmjjo%A&Oa%hoZJo>^FkSmi4)P+eWzJ$k*~k_fkc zAD=h*!#=t3uqHqGVR{BGfLjsx(92-eQy!>DF(CI*(6)}+MyvmuJ-2DeBfvJ)*_Nki z0dAy|lb$C>8@Xfc>`F&IDc`Fa((;(~L!5v!)y9uF?kIL%y-<1mF&ux*X&!VKJ%pEX zrMrWA=#=kAFt?0ece+q_bnUohX%dS6`hOpks2gfkO3>~NYA!W*C1vf3p4J&%5xv`u zU?Ge&?1~w%gRE0kl;x-{_)^^Awj8GY{`;s~At8S9UY;+>WWf>L)Kle@TJa!Ql|7V_ zp%X0$b!ufw!*Odh`ZNETBW~u&*qzf6?TL+dM-3lEJ}!;CabnU)9TrIPZ4P?m;w@{` zN|un=s5qfRvN1Z%VgtM6OMZ^9e)iGGOJwAQJKpfoh;i?patV;nKyNvz$&*rG!f)~R zksSN;A79i1)IA!t-fUaif7B4oDb40fWHj>4Hl>m0bg-lw)rjVZmB~XPA?{u8yNi`a ziIr8U(sHxltNyD0hn>OBjWI=19xf#EB43XzPdBnxk}QFC zKiNQr>T&|fa1TG5$Yc8Vi;JOE|48=d`t~y_yQKnaWn#S=DQhqHlH?5ds z$|q_%6PDTW!L$r@MKlIJ*eo+C?q=y4_G@;F)_n*okB94j*6utaEfzSaT3NXyCW9fa zKkabA1*#KYSV>#;UOM5LbSkqX5Wslw0;H`I_IP;?7YHf7Q-{c1i(eT-eXMV|WPN1g zTi4aKGh6Zt(WyGH@9hd)@Z-6+tEf~)s=1hiXW?Pc3b3~F&!iYita(z`S3X}m?k8T- zNK-g(&TobsIKN9M+@pSqk8BXav^~9=QeE)KC9XS0yqngbP}$0Z8Yw94J<}M^BgKUF zS_ZPZJT|(1rER{VBUlvO^)HE7&l39yHrfx03p0@I{_=;Ww^eMf89`^;mu(NTx9Wpb zmY>!2<7ZyEuY23$Q87gZqg zrrdDlnegK5+dFl_Z}jcgI3-GjwYpbtpNp>j6PayzUPh{~sU=r5vWdYPdPpRi0nC^t zYFU_5D1XZDybd3>S#(8jM_1mCPYMvRpyzRYkckrH=X}dTH)$Q6H&L}{DHEBR@?F-A ze5L(j$h)ZM$#4#P#(XcICof&sANuX!hkkoj4M@aY4%VVnz4XlW?J`BQ%sSTGqVLUK z`{~XEcfIL7nCr}vJI!|fpnIt&{~;z`KPk4UQbZg70#(HG(yMglv1ZzK)2FXq@}0GJ z>!<0pPQ5wCXs26W8D0^+OIPh9M}5T;ZtJUC>Ep7?6zjTe?}t8G-X{v=g4^*_J-yr66p=`+XD z7yI57`Liw0cXkEUb(CpFKRmA{=|~+Jl4H$+SwXE6{IK7zyUqZRPUl`u(Xgegrqo*1 zr^ryP%1ex}r%5^>-wHwDXe)b*->u`_y4~52tUXC#S49?9#b;&pO&{mEIYY&1YQ zO!w5@Hc_M*V(#IiGUQmPJ4m++maZmL(Cd+WVWt4(I@7p&FjGqO`B_NPrNIi*=p zAZyuWzw`HT|8t<$TDvRXkh}tl|MMR<6~Ik-MaM1Y-WXkHXQXIVWF5XneDdGrie8Xz zm5!XedW3ad`7yYTvuz4x<#j!XlF!c0hYT%tX z4RI}b?U2`VWlHO+e3~;OYn1*ivGP(xedq#p6yZs?vw5IG_m>LX?HrlXJ-r7_rNS!O z%D$1=7LN7ZMd#PcKSS?THR1%D*kfgSD>7{Dx9_2~Wi6_s&|W8mrJq$%j(G9^FvZ{Y zmaGh;*nd?bRrSZWg|I$<`COXj>h3Hd$*g;kvg$+eOYD)q;{FF|mX%cM47nhy&sKM8 z#lUK%sc90+etHry+I1k~{;q$l945o8zOgTArQjn~-}{=Q-sYzRcYLTzjBPsUbCO&a z;5vIg+T+4Wt6kJrDi{cYzdp)`|+V$FF%ueFwL9+&;$BD z=I#R7_p(-#-3hX{VHLiN&arwt@5hLq(AE0v3g>mLu-uS-UOjt5daqia?io&Jlw9>= z-59UO|7*wC?fwaOiO|v`Vk*_d3um7g%gi7!J74<@{=4q`me(n)=VTY9%Ny2}%K#b@I|A~23`)2nzudi^h2}!@o4$L?gE#&Ycdq}d1{*??JgSiG&-DIusAKm1b zak`_F>X1hHIcUSk77R^%8~(JcF$2t#A)Ni>u~RycD8JRk;^L)2wTt?Qt07NcH~J#2 zVpkkT6wfQ`a=JLv=uKVG{p^bBSryma*W@xk{8s)Jd%#zmkO~<8(ruCzS~JqPdAj_)DWY}?s&5bAz(r!?a|s^mtgJJVfbh{0(vr_Llv$hhmR zV>Ij$o;~(gSEu?`lscux7+og2geeSF&JB0lCw=V`H*!XNk>4+Ja?M*oO>LL6{o}3| z|1!JSI(2|uyEm=(Yc;_KSV{a<(jmin-6;J z5os-N^;si=>y-79a78ee&@V?2v$QcTz4bCgL0{S3?zEGyEY4su7$2Fz2k~d7Yd@TQ z?^;zAr%#>l$awPkYxBEOM^n~I@!0)v@-Qpb57DdH2dfMI(z~upi}Y)fmsFcEfO(d= z>?6I~VJP(9zu6OSr^~D;R4$`Ct^F52>emnYxBCyK)WZQ8OkoK+V}baCvt!+gKN&2J znP+Q8`Dk{?^Yrwk6MLn4F_BdnShj#I+rwmcQX|LKy~1gM>!;}+Ss}VU%!?@|HD2>W zPqsi&liG2*t@nyrbbhZ}jo)LGbnbetYU@UQ)9j)O=`DyR&C#3mY3ZdwRHv3uAJNqD zgGJfVF$(Lv-X4=?{t}bv8hyMuH1 z{e#!HVjcFQk(HqwSEOt4HhL>neopfx2XVT_U*7*$u#s(+*ZQ?rh~l%9bdJzxUFG*+ ztaZ)kz13RZUHN+X#`7Jof5X`utih@C{`k0SIVh^{j;tNkTqWGzCMghxDeUs?bi_En z5V@v~z6bAo5Xq09fA@auAlJ$CUZ@?{RdrL;>SYDWx>)kmVF_Rv;w?HCB-~6hY5pw}0eWs$0_gC`yV>c>PMiNI`^x3FZX5VQl%lus zFwx8hOVpva@4RA&-s}NhYgwKUD#AnK_8DKC>&v|)$L?e;3zkr&1~F2mKOg$SX9aft zuKBf^$TYilcE632kcZ#KweNh_H!^b^_tHpEKsR?}MqVcWuznie%d&y^{~$x0HkS@K zds{^0rKR{3gunwaZno~cN$&~9N*d8$7aeEgWdT$iCz?MHqR5JroMBp{V{-P|@~?== zpd|;RmS=yl@^(d~gi0`p+wy32Ixr!dk25ga7e0CqVQDkt3HpcKe1A@!-F{W4sUObK z`lQchRc}QsGe-5hX3*v{Yd*vRXM)%ftUC$!67Dq`Ju_=JuTvxqglWX2b{ z8${*|s-XRuYhSYgbvBl$<>SNa$q13GHv-+~PCxwYQ(;IBN_HQ0a`~4ZzEUFu7Hk)t zph)dCDZ5^~WO3k^`F8r`_m91A>|OW$ty`CScHY*qSNrTYqpc+FmpT>)@g#e|Wy`nL zrT>Y~e`lY?x;wyC;M#pJtBWThmz=6cd60hM!4C>b?z^WDc6Y8q> z9lBpAOy`^kn)`|RBwzo>_d3yh>l>oV$UUm>ZI$5e0arHn7<~!nXmW3m*Q!|sXEk6| zUd8jCFLW`HQ^g2@mhMf+hAAO8kDqZw2blEezoY6l#l7B&kS%$n%gk}{L#{G0B)n0fYcx~i9ycb#3XS+!gHOSfxwE|6br8j1@Z^}BVmYT)d^ z+5b>$a-xLKMgNV@ZC6Jf{C6bKt_gGpQTb_+Gbv&S-qTh5DKMIbZPytn!&p*hZFCY8KV4<(~o9GOpuaT#`{;Vs}vDKOm z`-trv5??*1!^*{3aTl9mmu@B&WEC;%7kt%~rIDNK6RLQjj$&f-|xXtth)3mN9`o8-r%FUc=*!Z-29ZHAREyJ6FjutUPSfVqE7yahh8H2@F`DS zw_|UydM)Akr9(i&$ImZmBfPF?MHe4*B)h##=2KVAKc@o-^!0z|dxLaZ-g75ErT$UP zHe!CTlq*+8Paj!LtZ)ogNV;T;zCIQ1zu4s*d^~pdLj#(F*awguRib4qPA*Vm8S3Dr zRxhle1pd}~k?W!DosZa)sI`T-8!zmg>snoHLYiDEK>3+vH|qVq2CQ@wU; zKRbj|Bfgg-^{<9koqn?cy`_JsEe67kkK9q8K~{eD%1TsYi_P-Hs`G{}Nso{KL&+nn zfb5}AM%n%n9~cG}WDw(m>bv||df&Sn=Oh+&gr$G2Jd8Z?>4G?P-qFY$zHpK^Pmvv# zGZZJ{KwQEL>R0F zg=lQRLB)wmTph`jqd-v4%hBIyKC5*#>o^b(NIcH)`m)pY^!5><%$gXSJYtkx`T$BO z+mCj5+5g`y-dHp2N}YZHGI$vtFi)@ay1d?J=i~2(MQ}!PAloqXlxn8rO?I%!F^wMj zi||D}VLj}ZgvOj3?0m(Yl79@;vhfzJ^v|4!Mb+Dom0o&3c!Z#N1SSM;usT2tY3<;2 z^%nd;JccIwzNzrt#1^yeeNy63XSlFTgiiaF8~g?{awn2#yOqN{f@RhU_R71jQt!;} zqLn*NJTtS0>mkb4MeVDSUh-$D_b)P9BoE%*z72 zH9hj)t3P$iJTw6B>ovH(d6hkyPw9a!TB}tl8|0@gQCGTr{~jayT^xfJ*pEF%euaG zr$F2Rjq;dWe$4I)KdD30wXsxEQiwm$OL9~VF9}<7SE6D<@epQ{flaylq=}_Qo!%up zyCk7c$?P(wczDKBvZfxcDI~(;f}{`+*0-FXy&rPsAaIq}myZZh`zY%E!mfLS*qB`T zh>sYQ&_jW+__@Uiz1dIiR5`y5V`<&ske>MSBj}Q9Fi!fK<&XDyjii+3umj@$DgM#B zB~MhI+iA+kM8;cqO!^|amMdUyoKPY!%mpWH0e&-2`fEovc}wmZj?%FW?lQhV>|xw> z`a_EEy{$}MAaWW-%&|f|tv~G_*4NtBj5}JWy??*N-aukUDD2?KVX(ztU@~EqYy3Ua zT`^eWnkqR5afP6ZVp%=|vHQl7cgF~_=qWMyjC**DtRtCCcu*Fn2D=efZo}JbTf-(S zyXT(3X}yw?+2@Y3aoY4Vnwkxth=H*7TWHN#F8SzO6nG(eS^IurhTZ1hkd2;jTe8MN zybLw;VwUyoNJ#Df%R3UumX2QO3{FjzS5^WzAYA!IS;(!)VkTW<_-4`8O4smB({&Bk zjA+)QPx21_g@=U57bxen5VeT|WA#@Dn4^WVqjVoyc;%4x!NXBCltEdQ-4ayCEBP?&a^gwc z!ILNSA5?YMww^a#WDl&DxltYBKW_0l$o0KC7hB8nwTUrLD~r+#ORG~uRhI;+D+lrQ_biFn4`;Z@f<&|l9Th@0{kLL;mx zeJ-FS($h~k1M!?YBn7;5$9!Ic&Juk)sS6R^*d7$0W_90;FMpqf6XwWPGLsO}$`7I( zc^?f(yQ-e<8kXF4Df5?F+4b-SwtUGIJ#4tgO62OG20vA+Y2w&VA#!?iv*$vU#`6fX z{>8$g#C-Lr@W_(Zy@qtUpdJ<^o0Ec;!`|_>lrxc~EkA8PFzz?w$>bJ2pjyQR963`A zJPC`faJV_~q&d`IO@7|SlZXAw^0n90+PB?@CB&V6a}XSMc#T~dXIx$T_9M0imK^$) z>+zc%05x}RVxO4Tzp_g&Yb&y%3XrE}HN1#ti9cKsSsn5a)HEE;fEcz$ibH?}9 zl+VU9a14?4RL&quy3mHMp&GE!I^f%41ZUKv{V`~J@4!x(O!Q4N zK$6b|IywN-2&OKM^oI@z5CoN6eEeJB#_1_fxY25Q8#h{4`n%z?U&D-VW}v`~%O7SE za++L8sAJ??@S?$DhS5AQk)dY-b6Uq5+gcZ-|h&-&eP@-e$4J+QMBN!X5 zx-|1|h7)VY3wonhz-6IwH!Gw8%or9=`YV2=vTl#TO69Nzy(Q|lR;^KN})0~Pm`CaE8K5tGcBQN)Y~6%=)GEZ^F8c5geczGEQ4MFd;VdFeT46fybrIcW@4+O4e2QB#`kH{-z5 zqLS(k2STZ0EEtfUFV<}O#FclG{3P6)Uy^m3I{psi>x&UbA{>tm3+DbR&fwCJMww{T zsG2CYiw%~M0}s&!GAQtQv48ugT~lHO~6{0w9}<9|*m%V*y}mdj4b5JU&GBZ;Ua{u1&WhWCICrxsb|?5NiD&FqCf=t+ zkJxk4-{W^6&`(2TvVm2dXQ<+D`)`#t)$^&c_MWmE9AKcQI|W}d~*cWV#hoOx=8VA<}MOg$H8PY5;)bTu8yvM_NI<4AO^ zug0-AneLo^-eP{U{$2)sn1i=irV1sf`k`W?FRsebW`5l zd+VN;s-yj-6Vt_uaj~vVGaySkp|$=Z*DLErtnj`cXSSWSy76)H^)-Zi=Ye7dstoHy zke)gGF~|p7W;b4N`IH-~mpdG<>v#7M-!Mg8`njK^hMLmFwGnfrII%-K?EQW1rQiJI zeww=IrVYGDR~L!x{1c*jrfMpU^uh99l=c?-A2A*D3c=pmn(0lz`Jd|$?L@nYe z`*KV_L1?G8$w=$Iuyx$EvHE&?CUy9aQ`U-UQN2UhVx_o=r~3Zv33DzQYp2`(-cQmA zlhOC$D6S@%bUWd{;8d}(SJ(FO2K9L$jotYSMBfWchrZ*=--BaR6I`XVyje&ZbGagH z05-NG$%d`F`W%%X=w7(GboK^~KBuIjW}_q{EqE%MvE#t~WzRjp%dA5%*R8p@Ws5Yg>tx6F>UAK)K|IzAnzicV zCcqUFx6zK#atT(Q)HcQ}q1U!@`Y+ugh$G``I5;LMRL3RX27sd-%^L&|>pDnn-=R-- zm;7yrcly&a(hcXbPUD+dC`}B*Hy^~ram7P@9RC-fn)Ki`t5nfnK?M#LEU-%Y$dUu#T3y5-MJ~Wg3);)9_&4;TCNakGCr?b)G0&vQMm0-s>rE(SOJk6MdSTDDKH(W91LB zcQ|w=i(UWYj!0IH?oej&gO52uTx_uX3?Ig)Ppdc0!j@#_kv*Pq<$F_g=6ITeirPJv zbmHpTUiu$1qshN+79>dh`ws7`yKQnIdhe&AnM1*$7T-4Jy zvj@l#RDEWT#0r=6K{F?hYhC|3tJ2m*rG$oLNDn?dsgSN>)+ySP4rSefrE~Y1G4fQ` zhHoGDK$c$B!^y=cO?RiYpyQU7!zNJjiT}3dF_a8f5d)}Nm+K%e%LmLB-`qXyGtHB)TQpj{t*nr~x$!B! z=>Va#c+_*V2B$sI%s&}ycADTl9-+mF;pUyBcV6XBKKhAnRh<0edz~t@SyZaBXTcp$ zZ!Bq*T1Oo#$GwP}WGW&@$009%tck4XOKgX!JgM~(;zq&>anGc+^^^w>UqfhRE#)}h z(RW2=_H1Wn{3IV@XILcq%#P>EUki=x6U&VzDD2uhi_AsmQ0d<8=AOvBF3pUzuC|8E zJ>t|z%V*#nO$|bkl6GvziRJD!ek;3GAM<`ZFFD8tFQGr}?dut3I5HQvuH;ceXSE@C z_QYVRZ@VW_Tom%4(rLs@V}bvijstlfSBtg1D#vfANh==+q9g-$-3k(PRC$sCLCiXdF7R}DPg|mEDraVjW&rFe? zh@U}uM(%GF&qUBC*}?og?^uNiSnbD-w~|F0BJ|UIMO@w9YebTQ`t*bFee}Lgp%GO~ zpRJ9EC=Bzgyk+%{wdiY@B}(pVtOZhfiZ@QEB)U<0E8oUw@9&%uXNJb?|CZXekM$|; z3Ya~{US_mf%xGET42!}?w;Tjw;w;OIvOVYlO1P3m3|tnH+vkkX5}D0)x7f)s&yvbU zk!mxmyV2lbVe;mQ&{z%SvDnbl25Aa*^#!p=l~LZkEOj>W>pIV)W==aV-;jauEwSMA z`<#UE4SUBMNvLfU`0*_pDLNODD<6@LW^zzRWJ_gsJ`9EC#E`R~GGNor6|T3lQ^rVr zR;|3qrF3Mb1?8x)B|JYPFIgMpUKUhEzkATIO;m-oF9muN#oe4}bIDA2gC&%pdPrWG zhab*Mi!Hs9iHi54S~w|DA)J^RU)GG{HZ$cM@QuubvST;rnVi;f_A5E5CQZ80m%FQ) zlNF;aDaSKF`GK&46EtyKE~x_LEMe+884oE(k0@CKTgebz5uav%|C?~%FTE4;Mk6W= z;^V}9X6;Z-@CMI*oR#}|=EoWJ@}Cm{KAnW~{>V7xI&NzBuI-_+;Z zv%a4_?Yr_?E6J|NHz(s9Ji`|KHpU@W0-BK zXkAC{&ORphzTRm^-Sel?N6ztvMnozUVHJcCNEJHkD;tTn#pC^unTTm71t)*^{=6?6 z4-GVAYHfH*NT|IDHocm@)XeTqx>u?qnCN}Uc-q`uOWE5+Xjz*lvd9v3%$s6nSd$;w zI{IWfmz!DLmhVLCiZVANhkYHj=H+7HuFb#p3fG1U8ZM#5n4pOQ&SWX{H_+&wK4x~u45IMfJ*}QW z&~92HVi5{K@|kY0$ulo2-x=$|&y>%ekKBcm9z2XBOF0!o0X3%*y4g$UHFSs+e zxR;wYm{i%3Kpw*fZmbY+GgKn7%lTyoS*GmJ^yqDUc6HDCz7}gnmxq}4wY12h8M>bF z2IBInSkK4<$%c);7IO%3_%`&<%Dl?`3EDwlR#e)&$~`y;khz)LtIqcI&O2r6m;`Et1CusgmVS;*$m8*~&VPvf{;Bp~L%Q)L??gtAM`7_PEk(Wd$FtT6Gx zDuxbKsflE88>cW0XPqC~ccZ?4H6zvB@F647!H|fd!Lx`IMe}8TSe5bJ$bV~YxaYx` zAr{4elzC4P6=zb68Di08BUtnTz5arnfgfU$C`36pP*>GG$J;wgu|x4x+}uJ-y4Z_C z^nx5`JtC8wGsU^@XCcZbZlBO4(W6uDw>+M|N^?YWFp_?8SZ;BsC%OcE)jnT5d0h8Q zKJxh$Wa$|r^-BzuYmc0xSH&-(S4oEF`fYjJ1yiPSCyty`(MS8An3C@Pu=oKfbLhCS zBcC82gzh@tdS7NCN+65Am@&jUc=p%s&Zb{tQC)D%9(DDht*|8hSw8&2Qjq@F(HkFp zJR`|#Zc09695f7({8?r*U4IKk(u`#(7}2BibLGY{gM3+)ThqJ|o2H#}NR->YVtUt@ z3u4`uW;ZmvlxB-c;2C6R0VtK#`Rrk@^k=}6)esHcM%oi~{zI^~H905u1_`apzESm_ zWFrE`Y;rd)gd(k8{2st5%B@dw>?3jnulS zr-|&6e8kDev#VRPGhxaQ8t^0z(~Vt`WcTbJ6wcT=GY6kH!mm7Xna*p}t)E{DV?;gJ za%$@&aOL8{i5mk13uBzQflGfd%s$cVIR5)O*)=R*_RyNd%%*FS*}M?fIC(tsr$i0Q zxWcq!T;`eC=@IEIKNu67ueD$3)LM)~N|+C`r`YF$_9$$O+-j0r9D4e}9e7i3gPr?_#v~ zo1Wnk7*IwVq0)9BC*&L}>^-vrar#7i#A;1B--_2eE@nMj^VYzjr-yD>^yAoxTJ{C( zBz^gVo<&Ob+d^jlvd}1@nP_y@9q{Nr&wC|TLH9miOdbMjMO>u&ZA|>??}Gg12i0+R zzfDb_YhYup_Qb^-SqnV6v2>rf9G%lY?-E!0D4%LsbyE7-?4-C|(@sb3^wpq_Jru6P zTIH^5-GE4;Y**T-mEPuoPwE4aICIQ87MU!2pNUUn7sQsuPIwyiX5}`rSaKkK9X-s! zadcU6$is)(xSmPa1nQ$aLL7X#Jx0XDETmDG_|7GzxrVduKBIIdl@n^54R) zc^iqWXCKs>7G?dvdoQ_CC)? z?ZT?MvgKRlR?C?vmu6A!M#iKv@;gr^ zJoL6-Ud;yz)<0W$pOaqs{pWZ8=}n%$f@_QSwDt;w01)tOvzuQUExE?M04tZ35JT;q zPgd<|4U557a=)V25j!HLVm2a0gi#DiTpG4^%_}*?{mC^kh8&(C*v)nHUk##JN~Z zk4;Br!7uYI7=%3=cVx8LCsc(j+&eX;scBen)*U$q2`tHMSf)q=W^gsrUD{~>STv`9 z+#ul9mnAvV{Ms|ECi+dbQ23tXF0ZC_O>p0-lY$thm9F88tLP9J54>eXRSbhx%W^NEHre17=jJ*8V}bFasDi6px- zlTPj_zEtLw-nfUJwG%wwk}0*9l$I^3gB6-dB}9(bd5$mJG^>8)U5_7cG^$TXm8oJz zfC3jSgIV%WrYNrLQ8gQ3hRt4M8X`^F_jC0Ry!y(1z=P!Ia$ z437BK!u5XO)pJ4#|C|1T&x}qlxr(S{=@ZvnB1f}}XOek_*yf|Y8Q>~&O}|}tI$k-b zPoTZkaLz!lN_O?ch#ec>$HcqV-{?H9)Sx0p>B{uUrJHb3b!)*dq(R6TBj4*jAn!6z zXJbA7{0j2B_u8Q4Z1PNv202RKq&R6tR0>}&nu^R@*~F4p6>;#mae5PQ(TS8$_HsW( z?jO25r6gZz73`L(HA+YsAl>Rz?n$UN#n5Z7*N5!_$qFGYNpEdn%OWCdrdi#8^kFyTf#6*yl^0B1;(Y zN%Eai-V{v}AVyGZJ)DfKoh?tior_4y{?xV$6|QuX?z5b4QtCAgK&pJy_+%vq~2YS`8l33ie_`{b!g3hq58nVruWm0lS8Fq8& zEJ;Cq$A*)Bte*ZcaMsJ6rAs67FZ!hO4n=AcLQWmo;#Q3_jcpD;_O#Ra%RS;}@!P#) z_a*Aq-KBlGOZ1K!RWR){j86Rr;^ax2(DE+}371AdsE6-Ty1_LjTgp6dihCOPP~ z?p<(>xCD{kM*nwm&d)+gm)I9HkO5~f5TY^!Au#IM+cEFtesgsOfl(c&_5K7oXVA9Y zs?pVbkSE{YcsEo+bMC4hnh>k$^xH_<-PhSyKsWKV=jrO}{GM!<(lK$9WvYk8QnBKE zB(}DbeC58E%PF7yGy7Ue{Cll3XmwTI+jly<42(P3@k1SPz$Z20kuuY;({JVuHu;*a zhVLU=%ZF|qb>a-a*A_*6hfULxZIEfCDM@38Z+mf0s`aO9lZum)wDktPpa4CYCN6(N zG~X!=Mx@Pi96G<`T?Dcr9Nfxzu9Vm3{dym=5m3t>VGtEUx=7UQ%#hsFd+38jVP2O0 zTQA@s?;(tx_q)zrwLZVx+Bmn3>Uz)(PJ*bbFm4yS86ep7z()BQiRneMGr=%E{Kr7hHMmlelO-k-x_MITyP)Ilth=@}xcbwmTQ^j6>+OHku|qIURYe z;^@k?ZnDMvpemu1G1)*j;xQail5g$8G(gwhz*nBs%wF^w)@-w3>sa zA9;MIZ?tvwLndjTHrY*o3h(TcfoRKb7>JY`pFb|O4O@df4h{-^UAeeuKx&>W$Pi2a zdcLEu*1*h96N@<(+7fs6e=9@TCJZ>r9qv-p=^6J)s{QgtKao4`xVz{_MtVy@-{7Nx z)tt4KW|Xy_dHAHPaCpi>ZLJ#VXxNHhHeS%mQ=I(Vlbs& z39)?CyZqYOX6`S&V#DKP(p`5e+emR#=o1~jADjkvVZ)Jl#1pAkrlk_YY-Y&8H-B+F zhDv)@UA>(1b#x4$g%+=R{UlyNi_^jcw5Pv3fmt{UpL6e~mnZHB)HwULj)N1a!VvzBw{83;IArO5Z`cjD#@hRH>*8{|offkLlzv2;(QCkINPqgkIQG?V>| zzB2hR^T3R8pMmaxxzc|xtiqQno%hlV8%K^}Zl{L`K;u{c&C969rorIs!I{0eANHA} zw=pGp(zMIUmk)Xtlel}T2R?NskdpahdjGa_%;lV6v^HbEed>o#`hAb%4C^$lW!LK& z@>YbtMNV3r^gTzF>!__hW9*mUR_#UEG$S5zA@P!*Gpfy=z)%@qtaVamLxk&z)ivWV zZFE=r1HZB>rhEb$4eRKP7ccCf3X$KkuR`(99Js@NJ&>$^J+L!aHnAgqzq0S^GnT#B zOS5cedf^8rB zHM&H>a8Bjf{AagX?OQbySHmf?^?@IE{sPuvpTJiz?rA5{IdJZ7p1n`r4YS2|;N8pY zh;sp`e(>rd~su8><#-1&u? zBELn#D~(+WacFK&fLlD>=q>Wmoh5JehN7k&uZr8ay6CNaDzNgtiXg!A%+DvX%@ONT z(k)&-e9MYSR{b1x?t#DQ>HGW~gl*b?wr-a?s zI#RR;xzvb`zlp0Ie|P*m<1^0xV;NZC@8*{YwYgOyhM##J7cRe zpyih(jM)KPYhtZFfFxqv!?$1kg_CXZP?>u8SnQLH6K*BJ-R=pl-x&RlO2%QyL!hZv z3%#^mYtO89=k3^>xjPv(I-QaSdJ~gBQGKL5YhvX>Dov$|F#@I$H5?!Lm#4_T{|m0F({Y)BaiqQ-aYKexaYSDxfN0 zFBAb?a^t|sjdW{$h*_JWI2u1;jsQzb%s7aBFF!om0>^x|M#1VEgG6V2v3=pB4NqTn zQQjvZjH7qKBgXaK6-J-&SNm~w;%y@`#lhENo@A;2IF0Al=;W5D!lmbq{<$_6dEHfI z(Klwk%Iwbrshkt^<9@t3<8 zGte67zP#*R_k0a2yuXQoPY+qh#p~k#sD4XBr$^i+qBr$YxbrJ|K{cmsHpOhUw)N6= zq4x96z09i`+-b%u^z9uB@9zFdN+|cRW5Q`Y&;~U>Vx;u|&aJa$%)|Z8v?D($OI2=? zbs&3XMgA%;5f6)}$xreHz%8a!qgzL{-}jB|RQGt^){1$H=YBhaE5=BPt&6YaLxFv- z)?`kexglo466!u1b|suOdg4}hU3WFncbEWTF7x1u)?M|g6pCDzhb=&6GmHudmwa@g zZe6?#zYtcv#sq8Fd}-yCudH3|7X}AgZ`N(XDpxliVV7C zJYs6ICQLYgIL}RZ8qPfV?mUy~9F5O)7VKQynDnYw;U3R|%epcp)1TeQ;?9wrp|#o8 zli)V#h^g8`9G^aTGY7tMv$&Y}bLXXU-*Tt*Bv`M;WBOM1q>VkVlq2J;IZ5Z6K%EB< z>T=wK3VMc41`}l#+KG{Cnx8j&(%-6E(C*^ZiS2%3xOv1po@1za=Gw327Z;$?_%5LG zOJJyjRzz|q_AQ5w{$t0LS8cy2f=folY0Q6j7D&~V%casY1U4SJ?+yIH353oePkpc7 zRg@MFAjyOL7z0Zc>G^HjeAXrw586EZ^RND!@2~uucgB(KuM>CSVLwXlPnKQ&;}sTB z^@8j|k?y;;Gfi&rO6KK@C*2Ioe;%0Ep(-GkEF z&z7opbf`Zyt?n1!jmrBR>;k0*E;i^n^WLH?FJN< zL6r(y&u?PFlY`ba89y-LoxY{t9TAq!zZnmnl%KMT^|1T6U3jJ!IECMO#C!ZEKJ5x` z>!Y#Y$^-g-;gLI4aR%IO;{@2@kKd*9|n=pjbuK#Ae-|znv zGEhb`-aC0y8@$~C`p@qpE76V*@6%J2{xt5dt+nxNZ>|k%aVmrK} ze6#tp8f-H$p`TQ3xYBPt&R~gG>wEM44Y=;YZ{oVLq=*HsYvy1n7HCXy^IxO7#X#4w z1Jh~Fpzfei6SIwzlk#SIw0U>vFk_X`RLjy&YCXFeRg!inKd>7dwJT^Mevb<^Ha9*cbUp$B$5=~W-PuvrD{CWciB++?}^-cjE_%;)UsOEID=etFNdMZZzi zxT1K7dr!rsj=8c5Z7diSrI8+{|9=plJ{xDv7V`Q;!O69*;joj7;|PO)lfcpS+H!pT zs@|>Z$agwpr0>^{Pa1GkMda`FbPLZ9g#U*x=gBym?m{}gL%on0&-K_x$Xg$Yed?}k zNqo>=xNM_Un9Q+TWkRv1Asz?g=+X9H6M5UqRzjS{JUhkmiLw$?__!4pU@u)y-?N{j zh>~)XD|UV6S&Vo~c0H0%{-WP4hs<*S>+4(mRg5hRz3xMmsN46c8-&AE|i^bEDM-wBbzA) z;svRO{W=$XpP!v{e=^R6;$1cv+Fq#$k%NVxT3*_shf>mE+txSoN9?>QKjwT^Kv;YF zZ_`_+syB*etu`Wsn4Nx%mDAFSyG-*U&9)ixL&_vd`LtY`1X#JLeT=n=JVS0#7rm7$ zB2y?^&1kJGK{!>Ou#Z(0NYbhC_^ntQDPqLeI%7Svgtj^E8G?mZI)ls-BSR?bGJDHo zaVVW7`tt79HMyR;li6sO%X=%ev|DtRD=FKvXk4i`#UtI@@f<&WHcsTD<;@`xb|l{_ zjy7H1d9$O4iWRFcW!7?LsOqi!VS{7bcsTpEym3~fcJ3q|QZ%h;m+Qc^E3y3NKSN#C zq<)q?gEE&c%jQqfBzMf&R#`IU^)Z$G!T<7Kw!DI%=15FnlZkzt zREx{jO6X=8tM&6;<+?G;S~`*|Y_`f=2i~!gME(zlj>0M?H&oR0DyOrG|H|3}|1|Rx z&0R0i1=tFk@L>uOu=z_;{l4e$m)Zx&Y$~ygXzV@e360vUCBn(|I1RJ@`GTAc0 zf&3vKBHsPZZ)P_|f2z>E=+QK2PrI?embkWluI!~>w`(80L`2o&)jhKqP8>S3?phLE zzwNUs?%qv=j%FS%l%go9o9Y12M2c{UX#XxZPk zPa^(N;>CQ)^yqMPO%&!$xsm8}Q0sq3m5bV#2Qy>J9$TI!YVrMRH0K`02g)Lc%Up@e zXFA`%y!$?P`}!=j4-s)+k-BF3tc)vzDGuloPd@BD+&AGTx7;|%=?Y?L`0;N_|7l~_ z9^&La(}bm&Gu@fn@*8R3Y0CujJP%G$@!k)`2tK9Uw(?BUjyyml{jk}el_b-*jDa;! z`9Cms7BTX>C68mA{a5XFgPWOy{yugCQG2PmLOjXUj(zgC3qPV6g7V$yN55~(z=jyI zQ<6~1LLr2*)+N46GtR<3ogZE7xohbnV31E=KowUlWGdUlANK!P`_ChfRR%#D$;XzF zp$q5Sge}>PN}6iPBr7mA(w!}XY{xvg)At!hCmA#&>Nx|rc+k2m3ko(2-j7e&{&A|g zGo|!NS|fEQaSjcRtiTIi*aK=$pN}2)y3cXa#}C=78XhpYs85N2zPC7tC>SPmtry`S zAFu(e8fhH2B<9-AnS-v>+XE;4(0S4pxu#t*!x^qW2#X)lZ0uBaj#+D*Mvtskuw~a; zTG(KAdh4#2FR`LRHCuYXx@G)uv(QAXrizD)Cv>Yt(b@Hqcb{JMQdWV_N6pwOK&y&@ z-6lj}S;fj}e>{*)>LemB{o$niNqQK%Kuk=1_kEW~Z+*gA|b1Fi* z@43cHb_Tw8fXcjg1@Va&NIz*`YO@tUK2Qj_43vTa0LY8eXP1yXwHEBRGiI4}%+J1H zpTNP_!H?Xd_WW_Dt+S@sS!{_I9LY8GEQ2*t=U}XSWgUN^_oS=-jGGtrG_@9yyJ^vw zEW{-3HL?ha`{1q+T>kVPaMcjO*ONi}N2U?$ZPQ#ah*S9?yU!T{eQV~DLTl+s%I~hF zudwiWvt?viuMqGlS@t88BE#7*Ni>}}2`6v-Hu_9_Deu%=BUZLR6Jb;AHn}&M?d!Hj|sL^RiZNB&8yn{0epb?6j}n_26YQ z=AV-td<-p$r>=kfS%l6iSfVtr=am)PYI~nr98n0;#Q?;bR$`{Kzca>D7HewEy7wHW z1RvQ;67K0sFHGNK)hOpkXGcZ0Qm($(oON_`z1dyTl*vV5JfzJ{!K;vT{#+cyDKP3I z<#DDf`4s_XBC#rk{k<9eC0X^x-| z#X%TekbNWdk*IBWy&-Bm{`F7V>g6y3HSG6aH)Q0Q`h%WTg00-xl`|zxoUG+b;@ls^evKE8;*}a0Rd) z2I76Rkv`>1MDn4!#7d4`_VAbp&GuerQ=(z;r+9LdR-}qoMMh2E z#Ovn6WGks7FODM2myLn#(pxmcO^9f&oV@FQ(ksf#oj0nczl&_Ciq6+l&zCV|KUpYL z$w`yBsTFC?`O0wx4>#%WY1-}9RXAn`NC31+NnT*evMG(eLdi$hj-H=vt|ZX z%02rRG@`kuEwtg{_wwf6H6Ns+Iau0obZ1gCGnnW|=6{lMVi&2NY_?f3ec{J>-1){9 z>8#$k6~TiW5iZ>*cp~SS8Qu<8xdX4$NAe7e8$Mp)A}j5to#?HKi-09IOgL(2gJ_oU z96DxB%2D+0z_Ikim1~Wavh&10^v_ZB@eavWufFa#Ak#s)R8xkse~QOyF8Lef<(;W0 zP5M|pcdnz~h+gYvWdZKWN@O4DsrXfg7^^D93M7}E%#UAb8=YXb?Gt^cK6UbHpU}_~ z51+^<&4;vKgv()Q3d{%J{ATBt!a3-L=kndo!7=B$AX~Js>*14F{7F2(Y4bU`@`8@N zW~KgVsg7;iR{cz6zhJ6)YGhT}?oD*dCmX^?WIMV;a!t7mWqWsP)jKJ+uLDSPl*B)rVIi7=PB_8Qc>coE9XY&Vf__X_vuchqVs zb-0Fu``R-|UEp4=%!$$DEB&jxh7sp#5zGC0-i&gQ}h*{#cx5qGF6;@{w7`8_Z5o*u9q ~ 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 zfAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3u zfAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3u zfAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3u zfAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3u zfAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3u zfAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3ufAN3u zfAN3wfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFy zfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFy zfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFy zfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFy zfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFy zfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFy zfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFy zfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFy zfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFy zfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAfFyfAjzF|M36t z|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t z|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t z|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t z|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t z|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t z|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t z|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t z|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t z|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t z|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|M36t|9t-6%m2UoU+(sI|IOY0 z?mxNP-~BIl`@8?-Zh!Zm-0koFm%IJle{;9L`(N(%cmK=X{_a1z+u!{!cl*2l5C0$jKm33A|M36e|HJ=>{}2Bk{y+SG`2X<#;s3+` zhyM@%AO1i5fB66K|Kb0`|A+q%{~!K8{D1iW@c-fe!~ci>5C0$jKm33A|M36e|HJ=> z{}2Bk{y+SG`2X<#;s3+`hyM@%AO1i5fB66K|Kb0`|A+q%{~!K8{D1iW@c-fe!~ci> z5C0$jKm33A|M36e|HJ=>{}2Bk{y+SG`2X<#;s3+`hyM@%AO1i5fB66K|Kb0`|A+q% z{~!K8{D1iW@c-fe!~ci>5C0$jKm33A|M36e|HJ=>{}2Bk{y+SG`2X<#;s3+`hyM@% zAO1i5fB66K|Kb0`|A+q%{~!K8{D1iW@c-fe!~ci>5C0$jKm33A|M36e|HJ=>{}2Bk z{y+SG`2X<#;s3+`hyM@%AO1i5fB66K|Kb0`|A+q%{~!K8{D1iW@c-fe!~ci>5C0$j zKm33A|M36e|HJ=>{}2Bk{y+SG`2X<#;s3+`hyM@%AO1i5fB66K|Kb0`|A+q%{~!K8 z{D1iW@c-fe!~ci>5C0$jKm33A|M36e|HJ=>{}2Bk{y+SG`2X<#;s3+`hyM@%AO1i5 zfB66K|Kb0`|A+q%{~!K8{D1iW@c-fe!~ci>5C0$jKm33A|M36e|HJ=>{}2Bk{y+S$ z{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44 z{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44 z{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44 z{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44 z{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44 z{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44 z{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44 z{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44 z{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44 z{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC44{IC3P{BQhk{BQhk z{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk z{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk z{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk z{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk z{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk z{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk z{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk z{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk z{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk z{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQhk{BQh!`Tz3&<^Rk7m;W#SU;e-R zfBFCN|KfBpY&!*=o4|Nk~H7k~Z#Z$oeK*Z==ExE6o?|8K)*@z?+VHb54C{r@Nb zC;un^C;un^C;un^C;un^C;un^C;un^C;un^C;un^C;un^C;un^C;un^C;un^C;un^ zC;un^C;un^C;un^C;un^C;un^C;un^C;un^C;un^C;un^C;un^C;un^C;un^C;un^ zC;un^C;un^C;un^C;un^C;un^C;un^C;un^C;un^C;un^C;un^C;un^C;un^C;un^ zC;un^C;un^C;un^C;un^C;un^C;un^C;un^C;un^C;un^C;un^C;un^C;un^C;un^ zC;un^C;un^C;un^C;un^C;un^C;un^C;un^C;un^C;un^C;un^C;un^C;un^C;un^ zC;un^C;un^C;un^C;un^C;un^C;un^C;un^C;un^C;un^C;un^C;un^C;un^C;un^ zC;un^C;un^C;un^C;un^C;un^C;un^C;un^C;un^C;un^C;#sk|Mz{&|H=Q!|H=Q! z|H=Q!|H=Q!|H=Q!|H=Q!|H=Q!|H=Q!|H=Q!|H=Q!|H=Q!|H=Q!|H=Q!|H=Q!|H=Q! z|H=Q!|H=Q!|H=Q!|H=Q!|H=Q!|H=Q!|H=Q!|H=Q!|H=Q!|H=Q!|H=Q!|H=Q!|H=Q! z|H=Q!|H=Q!|H=Q!|Hc2s|Hc2M{$KoG>i@<6rT$<1U+VwG|E2z4{9o$-#s8)LU;JPE zU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPE zU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPE zU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPE zU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPE zU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPE zU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPE zU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPE zU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPE zU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPEU;JPE zU;JPEU;JPE-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF z-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF z-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF z-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF z-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF z-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF z-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF z-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF z-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF z-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF-~8YF zKm0%ZKm0%ZKm0%ZKm0%ZKm0%ZKm0%ZKm0%ZKm0%ZKm0%ZKm0%ZKm0%ZKm0%ZKm0%Z zKm0%ZKm0%ZKm0%ZKm0%ZKm0%ZKm0%ZKm0%ZKm0%ZKm0%ZKm0%ZKm0%ZKm0%ZKm0%Z zKm0%ZKm0%ZKm0%ZKm0%ZKm0%ZKm0%ZKm0%ZKm0%ZKm0%ZKm0%ZKm0%ZKm0%ZKm0%Z zKm0%ZKm0%ZKm0%ZKm0%ZKm0%ZKm0%ZKm0%ZKm0%ZKm0%ZKm0%ZKm0%ZKm0%ZKm0%Z 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 Cv5tBG literal 0 HcmV?d00001 diff --git a/resources/defaults/images/Hills.png b/resources/defaults/images/Hills.png new file mode 100644 index 0000000000000000000000000000000000000000..3818f93bcd5d7dbefe6f503d6f62212a2c2288bd GIT binary patch literal 4321 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 P00000NkvXXu0mjf1Hyr} literal 0 HcmV?d00001 diff --git a/resources/defaults/images/character.png b/resources/defaults/images/character.png new file mode 100644 index 0000000000000000000000000000000000000000..a6882014115069a02f7991f2dfe3a2d48a686920 GIT binary patch literal 773 zcmV+g1N!`lP)R5Abn0&+=2K~#90tyH^i6HyeLgOw8R-i=Lb zZ3-$ZBwB++YEzJp-~-a+U(!H9N0Wd=y`Kn_%>n-;}R>f-s zZydaRMf;o$k4ZQIv*ovCgB&;D&Kh9CoDEd$3LYRs`GtR?Bjlk{CmX=cff$s>dhA-Q z)3$?d%B}z{jAArodFUGsg^@fQYlPVL!6H*07 <2O$@dht=0NnuqPKl6KG6%B8+m z!_*d}dDs*a35@Voa-sEM9()c$E{1vVIS9EJ$wNql|CKNIO+ONYj4P5()~dHOI(Og> zWeQWbZc$X++r%A`2&QL9+yq11)(9rU*!!V|An?hRxzQsfp+?{6kTPMiyz3beMsR|( z`;+W48WkxDxU&DYO)`31Y&z9}ozPjM~N-}|rETGhxw^2HmdKI;Vst0BAix2><{9 literal 0 HcmV?d00001 diff --git a/resources/defaults/images/ui-npatch.png b/resources/defaults/images/ui-npatch.png new file mode 100644 index 0000000000000000000000000000000000000000..70a338f0680c56e6e6397397aee9ed5017eb8c74 GIT binary patch literal 187 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

@L$8?#f>0?=2eYl`X_} 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 literal 0 HcmV?d00001 diff --git a/resources/defaults/tilesets/actorTiles.rtiles b/resources/defaults/tilesets/actorTiles.rtiles new file mode 100644 index 00000000..c16ae7a5 --- /dev/null +++ b/resources/defaults/tilesets/actorTiles.rtiles @@ -0,0 +1 @@ +{"source":"images/character.png","tileHeight":16.0,"tileSize":16.0,"tileWidth":16.0} \ No newline at end of file diff --git a/resources/defaults/tilesets/tiles.rtiles b/resources/defaults/tilesets/tiles.rtiles new file mode 100644 index 00000000..1da5766c --- /dev/null +++ b/resources/defaults/tilesets/tiles.rtiles @@ -0,0 +1,6 @@ +{ + "source": "images/Hills.png", + "tileSize": 16, + "tileWidth": 16, + "tileHeight": 16 +} diff --git a/src/editor/fileViews/dialogueFileView.cpp b/src/editor/fileViews/dialogueFileView.cpp index 3b101e0d..5e0171d3 100644 --- a/src/editor/fileViews/dialogueFileView.cpp +++ b/src/editor/fileViews/dialogueFileView.cpp @@ -92,10 +92,8 @@ tgui::Panel::Ptr DialogueFileView::makeLinePanel(DialogueBin &data, DialogueLine charNameEdit->setSize({"100% - 210 - 40", 32}); charNameEdit->setPosition(210, 0); charNameEdit->setText(line.characterName); - charNameEdit->onTextChange([&line, &data, i](const tgui::String &text) { - line.characterName = text.toStdString(); - data.lines.at(i).characterName = text.toStdString(); - }); + charNameEdit->onTextChange( + [&data, i](const tgui::String &text) { data.lines.at(i).characterName = text.toStdString(); }); panel->add(charNameEdit); auto diagTextEdit = tgui::TextArea::create(); diff --git a/src/editor/project.cpp b/src/editor/project.cpp index f83e8bc9..acf34377 100644 --- a/src/editor/project.cpp +++ b/src/editor/project.cpp @@ -78,7 +78,9 @@ Project::Project(const std::string &path) { } std::string Project::create(const std::string &dirPath, const std::string &title) { - json j = Project().toJson(); + Project p; + p.getProgramSettings().projectTitle = title; + json j = p.toJson(); std::string fileContent = j.dump(); std::filesystem::path filePath = dirPath; @@ -88,10 +90,19 @@ std::string Project::create(const std::string &dirPath, const std::string &title for (int i = 0; i < FILETYPE_MAX; i++) { EngineFileType fileType = static_cast(i); - if (fileType == EngineFileType::FILE_INTERACTABLE) { + if (fileType != EngineFileType::FILE_EMPTY) { std::string dirName = TextToLower(Editor::instance->getFs().getTypeName(fileType).c_str()); - MakeDirectory(std::filesystem::path(dirPath).append(dirName).u8string().c_str()); + std::string typeDirPath = TextFormat("%s/%s", dirPath.c_str(), dirName.c_str()); + + std::string defaultDirName = TextFormat( + "%s/resources/defaults/%s", Editor::instance->getFs().getEditorBaseDir().c_str(), dirName.c_str()); + + if (DirectoryExists(defaultDirName.c_str())) { + std::filesystem::copy(defaultDirName, typeDirPath, std::filesystem::copy_options::recursive); + } else { + MakeDirectory(std::filesystem::path(dirPath).append(dirName).u8string().c_str()); + } } } diff --git a/src/editor/projectFileVisitor.cpp b/src/editor/projectFileVisitor.cpp index 31e93922..4410d951 100644 --- a/src/editor/projectFileVisitor.cpp +++ b/src/editor/projectFileVisitor.cpp @@ -16,6 +16,7 @@ #include "fileViews/roomFileView.hpp" #include "fileViews/soundFileView.hpp" #include "fileViews/tilesetFileView.hpp" +#include "gamedata.hpp" #include "interactable.hpp" #include "projectFile.hpp" #include "room.hpp" @@ -24,6 +25,7 @@ #include "saveables/soundWrapper.hpp" #include "scriptFile.h" #include "services/fileSystemService.hpp" +#include "tilemap.hpp" #include "tileset.hpp" #include "variant.hpp" @@ -61,7 +63,8 @@ std::unique_ptr ProjectFileVisitor::tilesetView(const std::string & std::unique_ptr ProjectFileVisitor::roomView(const std::string &path) { std::unique_ptr view = std::make_unique(); - std::unique_ptr variant = std::make_unique>(new Room(path)); + std::unique_ptr variant = + std::make_unique>(new Room(path, _RPGPP_TILESIZE * RPGPP_DRAW_MULTIPLIER, false)); return std::make_unique(std::move(view), std::move(variant), EngineFileType::FILE_MAP); } diff --git a/src/editor/roomLayerViewVisitor.cpp b/src/editor/roomLayerViewVisitor.cpp index 0ad201f6..3734db97 100644 --- a/src/editor/roomLayerViewVisitor.cpp +++ b/src/editor/roomLayerViewVisitor.cpp @@ -182,12 +182,14 @@ void RoomLayerViewVisitor::operator()(enum_v) { updateInteractableChoose(); if (tool == RoomTool::TOOL_PLACE) { + auto vec = Editor::instance->getProject()->getPaths(EngineFileType::FILE_ACTOR); + if (vec.size() == 0) return; + group->add(tgui::Label::create("Actors")); group->add(actorNameInput); - actorChoose->removeAllItems(); - auto vec = Editor::instance->getProject()->getPaths(EngineFileType::FILE_ACTOR); + for (auto actorPath : vec) { actorChoose->addItem(GetFileNameWithoutExt(actorPath.c_str()), actorPath); } diff --git a/src/editor/services/fileSystemService.cpp b/src/editor/services/fileSystemService.cpp index 72c1ce7e..53efc7dc 100644 --- a/src/editor/services/fileSystemService.cpp +++ b/src/editor/services/fileSystemService.cpp @@ -46,6 +46,13 @@ void FileSystemService::promptNewProject() { newProjectDialog->confirmButton->onPress([newProjectDialog] { std::string title = newProjectDialog->titleField->getText().toStdString(); std::string dirPath = newProjectDialog->fileField->getChosenPath().toStdString(); + + if (newProjectDialog->makeDirCheck->isChecked()) { + std::string newDirPath = TextFormat("%s/%s", dirPath.c_str(), title.c_str()); + MakeDirectory(newDirPath.c_str()); + dirPath = newDirPath; + } + if (!title.empty() && !dirPath.empty()) { auto path = Project::create(dirPath, title); Project::openProject(path, true); diff --git a/src/editor/widgets/newProjectWindow.cpp b/src/editor/widgets/newProjectWindow.cpp index 79adf0f3..d3d33e16 100644 --- a/src/editor/widgets/newProjectWindow.cpp +++ b/src/editor/widgets/newProjectWindow.cpp @@ -4,8 +4,10 @@ #include "TGUI/String.hpp" #include "TGUI/Widgets/Button.hpp" +#include "TGUI/Widgets/CheckBox.hpp" #include "TGUI/Widgets/ChildWindow.hpp" #include "TGUI/Widgets/EditBox.hpp" +#include "TGUI/Widgets/Group.hpp" #include "TGUI/Widgets/GrowVerticalLayout.hpp" #include "TGUI/Widgets/Label.hpp" #include "TGUI/Widgets/Panel.hpp" @@ -20,7 +22,7 @@ void NewProjectWindow::init(tgui::Gui *gui) { window = tgui::ChildWindow::create(); bindTranslation(window, "dialog.new_project.title", &tgui::ChildWindow::setTitle); - window->setSize(320, 220); + window->setSize(320, 250); auto panel = tgui::Panel::create(); panel->getRenderer()->setPadding({PADDING}); @@ -49,6 +51,18 @@ void NewProjectWindow::init(tgui::Gui *gui) { fileField->setSize({"100%", FIELD_H}); vertLayout->add(fileField); + auto gap2 = tgui::Label::copy(gap); + + vertLayout->add(gap2); + + auto makeDirPanel = tgui::Group::create({"100%", FIELD_H}); + vertLayout->add(makeDirPanel); + + makeDirCheck = tgui::CheckBox::create(); + makeDirCheck->setSize({FIELD_H, FIELD_H}); + makeDirCheck->setText("Make Directory?"); + makeDirPanel->add(makeDirCheck); + confirmButton = tgui::Button::create(); bindTranslation(confirmButton, "dialog.new_project.confirm", &tgui::Button::setText); confirmButton->setSize(BUTTON_W, BUTTON_H); diff --git a/src/interfaceService.cpp b/src/interfaceService.cpp index 3d3b24ce..0e1cbe5f 100644 --- a/src/interfaceService.cpp +++ b/src/interfaceService.cpp @@ -13,9 +13,9 @@ InterfaceService::InterfaceService() { fpsVisible = false; - this->font = LoadFontEx("LanaPixel.ttf", 13, nullptr, 250); + this->font = LoadFontEx("fonts/LanaPixel.ttf", 13, nullptr, 250); - Image img = LoadImage("ui-npatch.png"); + Image img = LoadImage("images/ui-npatch.png"); ImageResizeNN(&img, img.width * 3, img.height * 3); this->uiTexture = LoadTextureFromImage(img); diff --git a/src/room.cpp b/src/room.cpp index 958c4d9d..9d892cf6 100644 --- a/src/room.cpp +++ b/src/room.cpp @@ -43,7 +43,7 @@ Room::Room() { this->player = std::unique_ptr{}; } -Room::Room(const std::string &fileName, int tileSize) { +Room::Room(const std::string &fileName, int tileSize, bool createPlayer) { this->lock = false; Camera2D initialCamera; @@ -67,13 +67,15 @@ Room::Room(const std::string &fileName, int tileSize) { this->collisions = std::make_unique(); this->actors = std::make_unique(); this->props = std::make_unique(); - this->tileMap = std::make_unique(fileName); - auto actor = std::make_unique(DEFAULT_PLAYER_PATH); - actor->setTilePosition(Vector2{startTile.x, startTile.y}, tileMap->getTileSet()->getTileSize()); - auto initialPlayer = std::make_unique(std::move(actor), *this); - this->addPlayer(std::move(initialPlayer)); + if (createPlayer) { + auto actor = std::make_unique(DEFAULT_PLAYER_PATH); + actor->setTilePosition(Vector2{startTile.x, startTile.y}, tileMap->getTileSet()->getTileSize()); + auto initialPlayer = std::make_unique(std::move(actor), *this); + + this->addPlayer(std::move(initialPlayer)); + } std::vector> collisionsVec = roomJson.at("collision"); for (auto v : collisionsVec) { From 95131a1e4da9b1d9b460c2c21a498fdab3cdd354 Mon Sep 17 00:00:00 2001 From: CDevv Date: Fri, 17 Apr 2026 13:22:01 +0300 Subject: [PATCH 32/69] Fix y-sort issue with Actors, Introduce debug draw option, add additional translations --- .../projectSettingsPanel/game.hpp | 2 + include/game.hpp | 1 + include/gamedata.hpp | 1 + include/player.hpp | 2 + resources/scripts/dialogue.lua | 54 --------- resources/translations/bg.json | 17 ++- resources/translations/en_us.json | 17 ++- src/actor.cpp | 24 +++- .../projectSettingsPanel/game.cpp | 16 ++- src/editor/childWindows/settingsWindow.cpp | 2 + src/editor/project.cpp | 18 +++ src/editor/screens/projectScreen.cpp | 109 +++++++++++++----- src/editor/widgets/propertiesBox.cpp | 5 +- src/game.cpp | 2 + src/gamedata.cpp | 5 +- src/player.cpp | 23 +++- src/prop.cpp | 10 +- src/room.cpp | 40 ++++--- 18 files changed, 228 insertions(+), 120 deletions(-) diff --git a/include/editor/childWindows/projectSettingsPanel/game.hpp b/include/editor/childWindows/projectSettingsPanel/game.hpp index 97a9266c..7d7a7c80 100644 --- a/include/editor/childWindows/projectSettingsPanel/game.hpp +++ b/include/editor/childWindows/projectSettingsPanel/game.hpp @@ -2,6 +2,7 @@ #define _RPGPP_PROJECTSETTINGSPANEL_GAME_H #include "childWindows/settingsPanel/base.hpp" +#include "widgets/propertyFields/boolField.hpp" #include "widgets/propertyFields/fileField.hpp" #include "widgets/propertyFields/intField.hpp" @@ -10,6 +11,7 @@ class ProjectSettingsPanelGame : public SettingsPanelBase { FileField::Ptr defaultRoom; FileField::Ptr playerActor; IntField::Ptr tileSize; + BoolField::Ptr debugDraw; ProjectSettingsPanelGame(tgui::TabContainer::Ptr tabContainer); void setup(Project *project); diff --git a/include/game.hpp b/include/game.hpp index b766e30a..680e86c2 100644 --- a/include/game.hpp +++ b/include/game.hpp @@ -32,6 +32,7 @@ class Game { public: Game(); static Game &instance(); + static bool isUsingBin(); static void useBin(const std::string &filePath); static GameData &getBin(); static StateService &getState(); diff --git a/include/gamedata.hpp b/include/gamedata.hpp index f1457bec..43a6251c 100644 --- a/include/gamedata.hpp +++ b/include/gamedata.hpp @@ -152,6 +152,7 @@ struct ProjectGameSettings { std::string defaultRoomPath; std::string playerActorPath; int tileSize = 16; + bool debugDraw = false; }; struct GameData { diff --git a/include/player.hpp b/include/player.hpp index f075b1a5..b4b97d9a 100644 --- a/include/player.hpp +++ b/include/player.hpp @@ -59,6 +59,8 @@ class Player { void setTilePosition(Vector2 tilePos); /** Get the position of the collision. */ Vector2 getCollisionPos() const; + /** Get the center position of the player's collision. */ + Vector2 getCollisionCenterPos() const; }; #endif diff --git a/resources/scripts/dialogue.lua b/resources/scripts/dialogue.lua index b1292c1a..82d65d05 100644 --- a/resources/scripts/dialogue.lua +++ b/resources/scripts/dialogue.lua @@ -1,57 +1,3 @@ function interact() Interface.OpenDialogue(props.dialogue) - - room = World.GetRoom() - player = World.GetPlayer() - pos = player:GetPosition() - - actor = player:GetActor() - - actorpos = actor:GetPosition() - - print(actorpos.x) - print(actorpos.y) - - col = room:GetCollisions() - print(col:Exists(Vector2.new(0, 3))) - - inters = room:GetInteractables() - print(inters:Exists(Vector2.new(12, 0))) - - thispos = this:GetPosition() - - print(this:GetPosition().x) - print(this:GetPosition().y) - inters:Remove(Vector2.new(12, 0)) - - inters:Push(Vector2.new(14, 0), "dialogue") - newInter = inters:GetAt(Vector2.new(14, 0)) - newInter:SetProp("dialogue", "mydiag") - - room:GetActors():Push(Vector2.new(2, 2), "krisactor", "sudo") - - room:GetTileMap():SetTile(thispos, Vector2.new(1, 1)) - - GameState.Set("test_nil", nil); - GameState.Set("test_bool", true); - GameState.Set("test_int1", 50); - GameState.Set("test_int2", 4611686018427387904); - GameState.Set("test_double", 3.14); - GameState.Set("test_string", "hello"); - GameState.Set("test_table1", { 1, 2, "test" }); - GameState.Set("test_table2", { key = "test" }); - GameState.Set("test_table3", { key = "test", 2, 4 }); - - print(GameState.Get("test_nil"), type(GameState.Get("test_nil"))) - print(GameState.Get("test_bool"), type(GameState.Get("test_bool"))) - print(GameState.Get("test_int1"), type(GameState.Get("test_int1"))) - print(GameState.Get("test_int2"), type(GameState.Get("test_int2"))) - print(GameState.Get("test_double"), type(GameState.Get("test_double"))) - print(GameState.Get("test_string"), type(GameState.Get("test_string"))) - print(GameState.Get("test_table1"), type(GameState.Get("test_table1"))) - print(GameState.Get("test_table2"), type(GameState.Get("test_table2"))) - print(GameState.Get("test_table3"), type(GameState.Get("test_table3"))) - - print(Direction.LEFT) - actor:PlayAnimation(Direction.LEFT) end diff --git a/resources/translations/bg.json b/resources/translations/bg.json index c9e1ed99..4dbf9f54 100644 --- a/resources/translations/bg.json +++ b/resources/translations/bg.json @@ -141,7 +141,8 @@ "_label": "Игра", "default_room": "Първоначална стая", "player_actor": "Актьор на играча", - "tile_size": "Размер на плочка" + "tile_size": "Размер на плочка", + "debug_draw": "Дебъгерно рисуване" } }, "new_prop": { @@ -155,6 +156,16 @@ "type": "Тип", "submit": "Потвърди", "remove": "Премахни" + }, + "delete_file": { + "title": "Сигурни ли сте?", + "yes": "Да", + "no": "Не", + "ok": "Ок", + "room_must_exist": "Трябва да имате поне една стая..", + "room_cannot_be_deleted": "Не може да изтриете стаята, зададена по подразбиране.", + "player_actor_must_exist": "Трябва да имате playerActor файл.", + "player_actor_cannot_be_deleted": "Не може да изтриете актьора на играча." } }, "widget": { @@ -169,5 +180,9 @@ "go_back": "Върни се", "restart": "Рестартирай", "restart_later": "Рестартирай по-късно" + }, + "context_menu": { + "copy_full_path": "Копирай пълен път", + "delete": "Изтрий" } } \ No newline at end of file diff --git a/resources/translations/en_us.json b/resources/translations/en_us.json index a75d7a08..4fa78079 100644 --- a/resources/translations/en_us.json +++ b/resources/translations/en_us.json @@ -141,7 +141,8 @@ "_label": "Game", "default_room": "Default Room", "player_actor": "Player Actor", - "tile_size": "Tile Size" + "tile_size": "Tile Size", + "debug_draw": "Debug Draw" } }, "new_prop": { @@ -155,6 +156,16 @@ "type": "Type", "submit": "Submit", "remove": "Remove" + }, + "delete_file": { + "title": "Are you sure?", + "yes": "Yes", + "no": "No", + "ok": "Ok", + "room_must_exist": "You must have at least one Room.", + "room_cannot_be_deleted": "You cannot delete the default Room.", + "player_actor_must_exist": "You must have a playerActor file.", + "player_actor_cannot_be_deleted": "You cannot delete the Player's Actor." } }, "widget": { @@ -169,5 +180,9 @@ "go_back": "Go Back", "restart": "Restart", "restart_later": "Restart Later" + }, + "context_menu": { + "copy_full_path": "Copy full path", + "delete": "Delete" } } \ No newline at end of file diff --git a/src/actor.cpp b/src/actor.cpp index f954ea6d..f7d97d70 100644 --- a/src/actor.cpp +++ b/src/actor.cpp @@ -296,12 +296,23 @@ void Actor::draw() const { // draw it DrawTexturePro(texture, atlasRect, worldRect, origin, rotation, WHITE); - // draw collision rect.. - auto collisionDebugColor = GRAY; - collisionDebugColor.a = (255 / 2); + bool debugDraw = true; - Rectangle drawnCollisionRect = getCollisionRect(Vector2{0, 0}); - DrawRectanglePro(drawnCollisionRect, origin, rotation, collisionDebugColor); + if (Game::isUsingBin()) { + debugDraw = Game::getBin().gameSet.debugDraw; + } + + if (debugDraw) { + // draw collision rect.. + auto collisionDebugColor = GRAY; + collisionDebugColor.a = (255 / 2); + + Rectangle drawnCollisionRect = getCollisionRect(Vector2{0, 0}); + DrawRectanglePro(drawnCollisionRect, origin, rotation, collisionDebugColor); + + // let me draw the collision center + DrawCircleV(getCollisionCenter(), 2.5f, MAROON); + } } std::string Actor::getSourcePath() const { return sourcePath; } @@ -359,7 +370,8 @@ Rectangle Actor::getCollisionRect(Vector2 velocity) const { } Vector2 Actor::getCollisionCenter() const { - Vector2 result = {position.x + (collisionRect.width / 2), position.y + (collisionRect.height / 2)}; + Vector2 result = {position.x + collisionRect.x + (collisionRect.width / 2), + position.y + collisionRect.y + (collisionRect.height / 2)}; return result; } diff --git a/src/editor/childWindows/projectSettingsPanel/game.cpp b/src/editor/childWindows/projectSettingsPanel/game.cpp index 3c1ab583..5b126c48 100644 --- a/src/editor/childWindows/projectSettingsPanel/game.cpp +++ b/src/editor/childWindows/projectSettingsPanel/game.cpp @@ -7,6 +7,7 @@ #include "childWindows/settingsPanel/base.hpp" #include "project.hpp" #include "raylib.h" +#include "widgets/propertyFields/boolField.hpp" #include "widgets/propertyFields/fileField.hpp" #include "widgets/propertyFields/intField.hpp" @@ -29,8 +30,7 @@ ProjectSettingsPanelGame::ProjectSettingsPanelGame(tgui::TabContainer::Ptr tabCo defaultRoom->callback = [](const tgui::String &path) { Project *project = Editor::instance->getProject(); if (project != nullptr) { - project->getGameSettings().defaultRoomPath = - TextFormat("rooms/%s", GetFileName(path.toStdString().c_str())); + project->getGameSettings().defaultRoomPath = TextFormat("maps/%s", GetFileName(path.toStdString().c_str())); } }; @@ -60,9 +60,21 @@ ProjectSettingsPanelGame::ProjectSettingsPanelGame(tgui::TabContainer::Ptr tabCo } }); + debugDraw = BoolField::create(); + bindTranslation(debugDraw->label, "dialog.project_settings.game.debug_draw", &tgui::Label::setText); + debugDraw->label->setText("Debug Draw"); + debugDraw->setSize({"100%", 24}); + debugDraw->value->onCheck([](bool value) { + Project *project = Editor::instance->getProject(); + if (project != nullptr) { + project->getGameSettings().debugDraw = value; + } + }); + layout->add(defaultRoom); layout->add(playerActor); layout->add(tileSize); + layout->add(debugDraw); scrollPanel->add(layout); panel->add(scrollPanel); diff --git a/src/editor/childWindows/settingsWindow.cpp b/src/editor/childWindows/settingsWindow.cpp index 83ed2d2a..957e3dea 100644 --- a/src/editor/childWindows/settingsWindow.cpp +++ b/src/editor/childWindows/settingsWindow.cpp @@ -17,4 +17,6 @@ SettingsWindow::SettingsWindow() : PopupWindow("SettingsWindow") { general = std::make_shared(tabContainer); hotkeys = std::make_shared(tabContainer); this->currentWindow->add(tabContainer); + + tabContainer->getTabs()->select(0); } diff --git a/src/editor/project.cpp b/src/editor/project.cpp index acf34377..6067a7b2 100644 --- a/src/editor/project.cpp +++ b/src/editor/project.cpp @@ -72,6 +72,7 @@ Project::Project(const std::string &path) { gameSet.defaultRoomPath = j.value("defaultRoom", ""); gameSet.playerActorPath = j.value("playerActor", ""); gameSet.tileSize = j.value("tileSize", 16); + gameSet.debugDraw = j.value("debugDraw", false); ChangeDirectory(projectPath.c_str()); UnloadFileText(jsonContent); @@ -129,6 +130,7 @@ json Project::toJson() { j["defaultRoom"] = gameSet.defaultRoomPath; j["tileSize"] = gameSet.tileSize; j["playerActor"] = gameSet.playerActorPath; + j["debugDraw"] = gameSet.debugDraw; return j; } @@ -286,6 +288,22 @@ GameData Project::generateStruct() { intBin.type = interactable->getType(); intBin.onTouch = interactable->isOnTouch(); + // add missing props to the interactable in the map + for (auto &item : getInteractableNames()) { + std::string itemType = GetFileNameWithoutExt(item.first.c_str()); + if (itemType == interactable->getType()) { + Interactable itemInteractable(item.first); + + for (auto prop : itemInteractable.getProps().items()) { + if (!interactable->getProps().contains(prop.key())) { + interactable->getProps().push_back({prop.key(), prop.value()}); + } + } + + break; + } + } + intBin.propsCbor = nlohmann::json::to_cbor(interactable->getProps()); roomBin.interactables.push_back(intBin); diff --git a/src/editor/screens/projectScreen.cpp b/src/editor/screens/projectScreen.cpp index 10b477e7..6ae09575 100644 --- a/src/editor/screens/projectScreen.cpp +++ b/src/editor/screens/projectScreen.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -109,9 +110,11 @@ void ProjectScreen::initItems(tgui::Group::Ptr layout) { // together. auto _tab = tgui::Tabs::create(); + auto &ts = Editor::instance->getTranslations(); + fileContextMenu = tgui::ContextMenu::create(); - fileContextMenu->addMenuItem("Copy full path"); - fileContextMenu->addMenuItem("Delete."); + fileContextMenu->addMenuItem(ts.getKey("context_menu.copy_full_path")); + fileContextMenu->addMenuItem(ts.getKey("context_menu.delete")); Editor::instance->getGui().gui->add(fileContextMenu); openedFiles = std::map>{}; @@ -282,6 +285,7 @@ tgui::Group::Ptr ProjectScreen::createToolBar() { } void ProjectScreen::addResourceButtons(EngineFileType fileType) { + auto &ts = Editor::instance->getTranslations(); auto project = Editor::instance->getProject(); this->listedResourcesType = fileType; @@ -290,43 +294,90 @@ void ProjectScreen::addResourceButtons(EngineFileType fileType) { resourcesLayout->getRenderer()->setSpaceBetweenWidgets(RESLIST_ITEM_PADDING); for (auto filePath : project->getPaths(fileType)) { + std::string fileName = GetFileName(filePath.c_str()); + auto fileBtn = tgui::Button::create(GetFileName(filePath.c_str())); fileBtn->setSize("100%", RESLIST_RES_BTN_H); fileBtn->onPress([this, fileType, filePath] { addFileView(fileType, filePath); }); - fileBtn->onRightMousePress([this, filePath] { + fileBtn->onRightMousePress([this, filePath, project, fileName, &ts] { fileContextMenu->getMenuItems().at(0).text = filePath; fileContextMenu->setPosition(GetMousePosition().x, GetMousePosition().y); fileContextMenu->onMenuItemClick.disconnectAll(); - fileContextMenu->onMenuItemClick([this, filePath](const std::vector &hierarchy) { - if (hierarchy[0] == "Copy full path") { - SetClipboardText(filePath.c_str()); - } - if (hierarchy[0] == "Delete.") { - auto messageBox = tgui::MessageBox::create(); - messageBox->setText("Are you sure?"); - messageBox->addButton("Yes"); - messageBox->addButton("No"); - messageBox->setButtonAlignment(tgui::HorizontalAlignment::Right); - EditorGuiService::centerWidget(messageBox); - - std::weak_ptr weakBox = messageBox; - - messageBox->onButtonPress([this, weakBox, filePath](const tgui::String &button) { - assert(button == "Yes" || button == "No"); - if (auto box = weakBox.lock()) { - if (button == "Yes") { - std::error_code ec; - std::filesystem::remove(filePath, ec); - addResourceButtons(listedResourcesType); + fileContextMenu->onMenuItemClick( + [this, filePath, project, fileName, &ts](const std::vector &hierarchy) { + if (hierarchy[0] == ts.getKey("context_menu.copy_full_path")) { + SetClipboardText(filePath.c_str()); + } + if (hierarchy[0] == ts.getKey("context_menu.delete")) { + bool allowedDeletion = true; + auto messageBox = tgui::MessageBox::create(); + + if (listedResourcesType == EngineFileType::FILE_MAP) { + auto defaultRoomPath = project->getGameSettings().defaultRoomPath; + if (defaultRoomPath.empty() && project->getPaths(EngineFileType::FILE_MAP).size() <= 1) { + bindTranslation(messageBox, "dialog.delete_file.room_must_exist", + &tgui::MessageBox::setText); + allowedDeletion = false; } - if (auto parent = box->getParent()) parent->remove(box); + std::string checkedFilePath = TextFormat("maps/%s", fileName.c_str()); + if (defaultRoomPath == checkedFilePath) { + bindTranslation(messageBox, "dialog.delete_file.room_cannot_be_deleted", + &tgui::MessageBox::setText); + allowedDeletion = false; + } } - }); - Editor::instance->getGui().gui->add(messageBox); - } - }); + if (listedResourcesType == EngineFileType::FILE_ACTOR) { + auto playerActorPath = project->getGameSettings().playerActorPath; + + if (playerActorPath.empty() && fileName == "playerActor.ractor") { + bindTranslation(messageBox, "dialog.delete_file.player_actor_must_exist", + &tgui::MessageBox::setText); + allowedDeletion = false; + } + + std::string checkedFilePath = TextFormat("actors/%s", fileName.c_str()); + if (playerActorPath == checkedFilePath) { + bindTranslation(messageBox, "dialog.delete_file.player_actor_cannot_be_deleted", + &tgui::MessageBox::setText); + allowedDeletion = false; + } + } + + if (allowedDeletion) { + messageBox->setText("Are you sure?"); + bindTranslation(messageBox, "dialog.delete_file.title", &tgui::MessageBox::setText); + messageBox->addButton(ts.getKey("dialog.delete_file.yes")); + messageBox->addButton(ts.getKey("dialog.delete_file.no")); + } else { + messageBox->addButton(ts.getKey("dialog.delete_file.ok")); + } + + EditorGuiService::centerWidget(messageBox); + messageBox->setButtonAlignment(tgui::HorizontalAlignment::Right); + + std::weak_ptr weakBox = messageBox; + + messageBox->onButtonPress([this, weakBox, filePath, &ts](const tgui::String &button) { + assert(button == ts.getKey("dialog.delete_file.yes") || + button == ts.getKey("dialog.delete_file.no") || + button == ts.getKey("dialog.delete_file.ok")); + + if (auto box = weakBox.lock()) { + if (button == ts.getKey("dialog.delete_file.yes")) { + std::error_code ec; + std::filesystem::remove(filePath, ec); + addResourceButtons(listedResourcesType); + } + + if (auto parent = box->getParent()) parent->remove(box); + } + }); + + Editor::instance->getGui().gui->add(messageBox); + } + }); fileContextMenu->openMenu(); }); diff --git a/src/editor/widgets/propertiesBox.cpp b/src/editor/widgets/propertiesBox.cpp index 5deed582..e40b22d5 100644 --- a/src/editor/widgets/propertiesBox.cpp +++ b/src/editor/widgets/propertiesBox.cpp @@ -33,8 +33,6 @@ PropertiesBox::PropertiesBox(const char *typeName, bool initRenderer) : tgui::Ch newPropButton = tgui::Button::create("New Prop.."); newPropButton->setSize("100%", 24); - vertLayout->add(newPropButton); - newPropButton->setVisible(false); add(vertLayout); this->layout = vertLayout; @@ -67,7 +65,8 @@ void PropertiesBox::addPropsJson(nlohmann::json &j, bool clear, bool editable) { } // configure the 'New Prop' button - newPropButton->setVisible(true); + // newPropButton->setVisible(true); + layout->add(newPropButton); newPropButton->onClick.disconnectAll(); newPropButton->onClick([this] { auto windowPtr = Editor::instance->getGui().getChildWindowSubService()->getWindow("new_prop"); diff --git a/src/game.cpp b/src/game.cpp index e8991d3e..5d53e50e 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -48,6 +48,8 @@ void Game::init() { scripts = std::make_unique(); } +bool Game::isUsingBin() { return usesBin; } + void Game::useBin(const std::string &filePath) { gameData = std::make_unique(deserializeFile(filePath)); usesBin = true; diff --git a/src/gamedata.cpp b/src/gamedata.cpp index bbaed02c..731d27f9 100644 --- a/src/gamedata.cpp +++ b/src/gamedata.cpp @@ -97,12 +97,13 @@ void serialize(Archive &a, DialogueBin &b) { template void serialize(Archive &a, ProjectProgramSettings &b) { - a(b.projectTitle, b.projectVersion, b.windowSize, b.programIconPath, b.windowResizeableFlag, b.windowStateFlag, b.targetFPS); + a(b.projectTitle, b.projectVersion, b.windowSize, b.programIconPath, b.windowResizeableFlag, b.windowStateFlag, + b.targetFPS); } template void serialize(Archive &a, ProjectGameSettings &b) { - a(b.defaultRoomPath, b.playerActorPath, b.tileSize); + a(b.defaultRoomPath, b.playerActorPath, b.tileSize, b.debugDraw); } template diff --git a/src/player.cpp b/src/player.cpp index fb263d60..98df0029 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -6,6 +6,7 @@ #include #include "conversion.hpp" +#include "game.hpp" #include "interactable.hpp" Player::Player(std::unique_ptr actor, Room &room) : room(room) { @@ -79,11 +80,19 @@ void Player::update() { void Player::draw() const { actor->draw(); - // debug draw interactable area.. - Color interactableAreaDebugColor = ORANGE; - interactableAreaDebugColor.a = (255 / 4); + bool debugDraw = true; - DrawRectangleRec(interactableArea, interactableAreaDebugColor); + if (Game::isUsingBin()) { + debugDraw = Game::getBin().gameSet.debugDraw; + } + + if (debugDraw) { + // debug draw interactable area.. + Color interactableAreaDebugColor = ORANGE; + interactableAreaDebugColor.a = (255 / 4); + + DrawRectangleRec(interactableArea, interactableAreaDebugColor); + } } void Player::handleCollision() { @@ -231,3 +240,9 @@ Vector2 Player::getCollisionPos() const { return actor->getCollisionCenter(); } + +Vector2 Player::getCollisionCenterPos() const { + if (actor == nullptr) return Vector2{0, 0}; + + return actor->getCollisionCenter(); +} diff --git a/src/prop.cpp b/src/prop.cpp index 9844f9fb..70faef1a 100644 --- a/src/prop.cpp +++ b/src/prop.cpp @@ -164,5 +164,13 @@ void Prop::draw() const { atlasRect.height * RPGPP_DRAW_MULTIPLIER}; DrawTexturePro(texture, atlasRect, dest, Vector2{0, 0}, 0.0f, WHITE); - DrawRectangleRec(getWorldCollisionRect(), Fade(RED, 0.5f)); + bool debugDraw = true; + + if (Game::isUsingBin()) { + debugDraw = Game::getBin().gameSet.debugDraw; + } + + if (debugDraw) { + DrawRectangleRec(getWorldCollisionRect(), Fade(RED, 0.5f)); + } } diff --git a/src/room.cpp b/src/room.cpp index 9d892cf6..cc936004 100644 --- a/src/room.cpp +++ b/src/room.cpp @@ -169,17 +169,13 @@ Room::Room(const RoomBin &bin) : Room() { for (auto const &propSource : bin.props) { for (auto const &propBin : Game::getBin().props) { std::string actualSource = GetFileNameWithoutExt(propSource.name.c_str()); - printf("%s ; %s \n", propBin.name.c_str(), actualSource.c_str()); if (propBin.name == actualSource) { - printf("c \n"); auto p = std::make_unique(propBin); p->setWorldTilePos( Vector2{static_cast(propSource.tilePos.x), static_cast(propSource.tilePos.y)}, worldTileSize); p->getInteractable()->setProps(nlohmann::json::from_cbor(propSource.propsCbor)); - // addProp(std::move(*p)); - props->pushObject(propSource.tilePos, std::move(p)); break; } @@ -317,25 +313,35 @@ void Room::draw() const { BeginMode2D(camera); this->tileMap->draw(); - for (auto i : interactables->getList()) { - auto rect = Rectangle{i->getWorldPos().x * static_cast(getWorldTileSize()), - i->getWorldPos().y * static_cast(getWorldTileSize()), - static_cast(getWorldTileSize()), static_cast(getWorldTileSize())}; - DrawRectangleRec(rect, Fade(YELLOW, 0.5f)); + + bool debugDraw = true; + + if (Game::isUsingBin()) { + debugDraw = Game::getBin().gameSet.debugDraw; } - for (auto &[vect, value] : collisions->getObjects()) { - auto rect = Rectangle{vect.x * static_cast(worldTileSize), vect.y * static_cast(worldTileSize), - static_cast(worldTileSize), static_cast(worldTileSize)}; - DrawRectangleRec(rect, Fade(RED, 0.5f)); + + if (debugDraw) { + for (auto i : interactables->getList()) { + auto rect = Rectangle{i->getWorldPos().x * static_cast(getWorldTileSize()), + i->getWorldPos().y * static_cast(getWorldTileSize()), + static_cast(getWorldTileSize()), static_cast(getWorldTileSize())}; + DrawRectangleRec(rect, Fade(YELLOW, 0.5f)); + } + for (auto &[vect, value] : collisions->getObjects()) { + auto rect = + Rectangle{vect.x * static_cast(worldTileSize), vect.y * static_cast(worldTileSize), + static_cast(worldTileSize), static_cast(worldTileSize)}; + DrawRectangleRec(rect, Fade(RED, 0.5f)); + } } for (auto &[pos, prop] : props->getObjects()) { - if (prop->getCollisionCenter().y <= player->getCollisionPos().y) { + if (prop->getCollisionCenter().y <= player->getCollisionCenterPos().y) { prop->draw(); } } for (auto &[name, actor] : actors->getActors()) { - if (actor->getCollisionCenter().y <= player->getCollisionPos().y) { + if (actor->getCollisionCenter().y <= player->getCollisionCenterPos().y) { actor->draw(); } } @@ -343,12 +349,12 @@ void Room::draw() const { player->draw(); for (auto &[pos, prop] : props->getObjects()) { - if (prop->getCollisionCenter().y > player->getCollisionPos().y) { + if (prop->getCollisionCenter().y > player->getCollisionCenterPos().y) { prop->draw(); } } for (auto &[name, actor] : actors->getActors()) { - if (actor->getCollisionCenter().y > player->getCollisionPos().y) { + if (actor->getCollisionCenter().y > player->getCollisionCenterPos().y) { actor->draw(); } } From e411af211dfbf2d2b226f44349f095088c79ecfa Mon Sep 17 00:00:00 2001 From: "D. Quan" <60545346+sudoker0@users.noreply.github.com> Date: Fri, 17 Apr 2026 17:33:21 +0700 Subject: [PATCH 33/69] Code reformat --- include/editor/project.hpp | 12 +++++------- .../childWindows/projectSettingsPanel/program.cpp | 4 ++-- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/include/editor/project.hpp b/include/editor/project.hpp index d2693a1a..eefec9ed 100644 --- a/include/editor/project.hpp +++ b/include/editor/project.hpp @@ -13,13 +13,11 @@ using json = nlohmann::json; -const std::map WindowStateToName = { - {0, "windowed"}, - {FLAG_FULLSCREEN_MODE, "exclusive"}, - {FLAG_BORDERLESS_WINDOWED_MODE, "fullscreen"}, - {FLAG_WINDOW_MINIMIZED, "minimized"}, - {FLAG_WINDOW_MAXIMIZED, "maximized"} -}; +const std::map WindowStateToName = {{0, "windowed"}, + {FLAG_FULLSCREEN_MODE, "exclusive"}, + {FLAG_BORDERLESS_WINDOWED_MODE, "fullscreen"}, + {FLAG_WINDOW_MINIMIZED, "minimized"}, + {FLAG_WINDOW_MAXIMIZED, "maximized"}}; class Project { private: diff --git a/src/editor/childWindows/projectSettingsPanel/program.cpp b/src/editor/childWindows/projectSettingsPanel/program.cpp index 632f48db..1560a670 100644 --- a/src/editor/childWindows/projectSettingsPanel/program.cpp +++ b/src/editor/childWindows/projectSettingsPanel/program.cpp @@ -1,10 +1,10 @@ -#include "project.hpp" +#include "childWindows/projectSettingsPanel/program.hpp" #include "TGUI/String.hpp" #include "TGUI/Widgets/GrowVerticalLayout.hpp" #include "TGUI/Widgets/ScrollablePanel.hpp" -#include "childWindows/projectSettingsPanel/program.hpp" #include "childWindows/settingsPanel/base.hpp" +#include "project.hpp" #include "raylib.h" #include "widgets/propertyFields/boolField.hpp" #include "widgets/propertyFields/fileField.hpp" From 9bd2faec1be98fa1e1c42f9e2ce184d230636d79 Mon Sep 17 00:00:00 2001 From: "D. Quan" <60545346+sudoker0@users.noreply.github.com> Date: Fri, 17 Apr 2026 17:33:32 +0700 Subject: [PATCH 34/69] Update translation for Vietnamese --- resources/translations/vn.json | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/resources/translations/vn.json b/resources/translations/vn.json index ba47420e..a7294030 100644 --- a/resources/translations/vn.json +++ b/resources/translations/vn.json @@ -149,7 +149,8 @@ "_label": "Trò chơi", "default_room": "Room mặc định", "player_actor": "Actor người chơi", - "tile_size": "Kích cỡ Tile" + "tile_size": "Kích cỡ Tile", + "debug_draw": "Vẽ gỡ lỗi" } }, "new_prop": { @@ -163,6 +164,16 @@ "type": "Loại", "submit": "Sửa", "remove": "Xóa" + }, + "delete_file": { + "title": "Bạn chắc có muốn xóa không?", + "yes": "Có", + "no": "Không", + "ok": "Okay", + "room_must_exist": "Lỗi: Dự án phải có ít nhất một phòng.", + "room_cannot_be_deleted": "Lỗi: Bạn không thể xóa phòng mặc định.", + "player_actor_must_exist": "Lỗi: Bạn phải có tệp tin playerActor.", + "player_actor_cannot_be_deleted": "Lỗi: Bạn không thể xóa Actor người chơi." } }, @@ -179,5 +190,9 @@ "go_back": "Quay lại", "restart": "Khởi động lại", "restart_later": "Khởi động lại sau" + }, + "context_menu": { + "copy_full_path": "Sao chép đường dẫn", + "delete": "Xóa" } } From 02999245e77a16f88d1f302bd953f18680b9e543 Mon Sep 17 00:00:00 2001 From: "D. Quan" <60545346+sudoker0@users.noreply.github.com> Date: Fri, 17 Apr 2026 18:09:18 +0700 Subject: [PATCH 35/69] Rebind translations and update `bindCustomTranslation` to `bindTranslationWithCallback` --- include/editor/bindTranslation.hpp | 11 ++++------- include/editor/childWindows/settingsPanel/base.hpp | 2 +- src/editor/childWindows/settingsPanel/general.cpp | 2 +- src/editor/screens/projectScreen.cpp | 8 ++++++-- src/editor/services/translationService.cpp | 6 +++--- src/editor/widgets/frameEditor.cpp | 4 ++-- 6 files changed, 17 insertions(+), 16 deletions(-) diff --git a/include/editor/bindTranslation.hpp b/include/editor/bindTranslation.hpp index bbb59c00..8fd67000 100644 --- a/include/editor/bindTranslation.hpp +++ b/include/editor/bindTranslation.hpp @@ -13,6 +13,7 @@ class TSConnection { TranslationService::ListenerID id; }; +// Binds a widget's text to a translation key, updating it whenever the translation changes. template void bindTranslation(std::shared_ptr widget, const std::string &key, void (WidgetType::*setter)(const tgui::String &)) { @@ -31,16 +32,12 @@ void bindTranslation(std::shared_ptr widget, const std::string &key, return false; } }); - - // TODO: Implement a cleaner way to detect when the widget is destroyed, and - // call - // Editor::instance->getTranslations().removeListener(id); - // There's currently an issue on TGUI's repo to add support for callback - // when a widget gets destroyed https://github.com/texus/TGUI/issues/326 } +// Binds a custom callback to a widget, and calling it whenever the translation changes. +// The callback function provides references to the widget and the translation service. template -void bindCustomTranslation(std::shared_ptr widget, +void bindTranslationWithCallback(std::shared_ptr widget, std::function widget, TranslationService &)> cb) { auto &ts = Editor::instance->getTranslations(); std::weak_ptr weakWidget = widget; diff --git a/include/editor/childWindows/settingsPanel/base.hpp b/include/editor/childWindows/settingsPanel/base.hpp index 90254580..c38d000c 100644 --- a/include/editor/childWindows/settingsPanel/base.hpp +++ b/include/editor/childWindows/settingsPanel/base.hpp @@ -13,7 +13,7 @@ class SettingsPanelBase { public: SettingsPanelBase(tgui::TabContainer::Ptr tabContainer, std::string name) { panel = tabContainer->addTab(name); - bindCustomTranslation( + bindTranslationWithCallback( tabContainer, [this, name](tgui::TabContainer::Ptr tabContainer, TranslationService &ts) { int idx = tabContainer->getIndex(panel); tabContainer->changeTabText(idx, ts.getKey(name)); diff --git a/src/editor/childWindows/settingsPanel/general.cpp b/src/editor/childWindows/settingsPanel/general.cpp index 2875f69e..5d58490c 100644 --- a/src/editor/childWindows/settingsPanel/general.cpp +++ b/src/editor/childWindows/settingsPanel/general.cpp @@ -79,7 +79,7 @@ SettingsPanelGeneral::SettingsPanelGeneral(tgui::TabContainer::Ptr tabContainer) this->promptUserBox = tgui::MessageBox::create(""); bindTranslation(this->promptUserBox, "screen.options.general.theme", &tgui::MessageBox::setTitle); bindTranslation(promptUserBox, "screen.options.general.theme_notice", &tgui::MessageBox::setText); - bindCustomTranslation(this->promptUserBox, [&](std::shared_ptr box, + bindTranslationWithCallback(this->promptUserBox, [&](std::shared_ptr box, TranslationService &ts) { box->changeButtons(std::vector{ts.getKey("button.restart"), ts.getKey("button.restart_later")}); }); diff --git a/src/editor/screens/projectScreen.cpp b/src/editor/screens/projectScreen.cpp index 6ae09575..4a2e5875 100644 --- a/src/editor/screens/projectScreen.cpp +++ b/src/editor/screens/projectScreen.cpp @@ -14,6 +14,7 @@ #include "TGUI/Widgets/BitmapButton.hpp" #include "TGUI/Widgets/Button.hpp" #include "TGUI/Widgets/ComboBox.hpp" +#include "TGUI/Widgets/ContextMenu.hpp" #include "TGUI/Widgets/Group.hpp" #include "TGUI/Widgets/Label.hpp" #include "TGUI/Widgets/MenuBar.hpp" @@ -113,8 +114,11 @@ void ProjectScreen::initItems(tgui::Group::Ptr layout) { auto &ts = Editor::instance->getTranslations(); fileContextMenu = tgui::ContextMenu::create(); - fileContextMenu->addMenuItem(ts.getKey("context_menu.copy_full_path")); - fileContextMenu->addMenuItem(ts.getKey("context_menu.delete")); + bindTranslationWithCallback(fileContextMenu, [](std::shared_ptr menu, TranslationService &ts) { + menu->removeAllMenuItems(); + menu->addMenuItem(ts.getKey("context_menu.copy_full_path")); + menu->addMenuItem(ts.getKey("context_menu.delete")); + }); Editor::instance->getGui().gui->add(fileContextMenu); openedFiles = std::map>{}; diff --git a/src/editor/services/translationService.cpp b/src/editor/services/translationService.cpp index 80490c41..235a6274 100644 --- a/src/editor/services/translationService.cpp +++ b/src/editor/services/translationService.cpp @@ -107,9 +107,9 @@ void TranslationService::purgeDeadListeners() { } } -// @notice Use of getKey is not recommended unless you guarantee that the widget -// using the provided translation can update itself when translation changes. -// Otherwise, please use `bindTranslation()` in `bindTranslation.hpp` +// @notice Use of getKey is not recommended outside of the `bindTranslationWithCallback()`'s callbacks +// unless you guarantee that the widget using `getKey()` can update itself when text translation changes. +// Otherwise, please use `bindTranslation()` or `bindTranslationWithCallback()` in `bindTranslation.hpp` TranslatedString TranslationService::getKey(const std::string &key) { if (translations.find(getCurrentLanguage()) != translations.end()) { const auto &gotten_translations = translations[current_language]; diff --git a/src/editor/widgets/frameEditor.cpp b/src/editor/widgets/frameEditor.cpp index 5deb0f5b..5c70e35d 100644 --- a/src/editor/widgets/frameEditor.cpp +++ b/src/editor/widgets/frameEditor.cpp @@ -41,7 +41,7 @@ void FrameEditor::init() { this->directionChooser = tgui::ComboBox::create(); - bindCustomTranslation(directionChooser, [](tgui::ComboBox::Ptr box, TranslationService &ts) { + bindTranslationWithCallback(directionChooser, [](tgui::ComboBox::Ptr box, TranslationService &ts) { box->removeAllItems(); for (int i = 0; i <= RPGPP_MAX_DIRECTION; i++) box->addItem(ts.getKey(TextFormat("screen.project.actorview.dir%d", i))); @@ -62,7 +62,7 @@ void FrameEditor::init() { playPauseButton = tgui::ToggleButton::create(); - bindCustomTranslation( + bindTranslationWithCallback( playPauseButton, [this](tgui::ToggleButton::Ptr button, TranslationService &ts) { if (button->isDown()) { button->setText(ts.getKey("screen.project.actorview.pause")); From 4eb47ab642f608c0970ad49d36187076e575ec12 Mon Sep 17 00:00:00 2001 From: thefirey33 Date: Fri, 17 Apr 2026 13:59:18 +0300 Subject: [PATCH 36/69] update turkish translation --- resources/translations/tr.json | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/resources/translations/tr.json b/resources/translations/tr.json index a5de99c5..1721beb6 100644 --- a/resources/translations/tr.json +++ b/resources/translations/tr.json @@ -141,9 +141,20 @@ "_label": "Oyun", "default_room": "Öntanımlı Oda", "player_actor": "Oyuncunun Aktörü", - "tile_size": "Kare Boyutu" + "tile_size": "Kare Boyutu", + "debug_draw": "Hata Ayıklamayı Çiz" } }, + "delete_file": { + "title": "Gerçekten Sil?", + "yes": "Evet", + "no": "Hayır", + "ok": "Tamam", + "room_must_exist": "En az bir odanız olması lazımdır.", + "room_cannot_be_deleted": "Öntanımlı odayı silemezsiniz.", + "player_actor_must_exist": "playerActor dosyanızın olması lazımdır.", + "player_actor_cannot_be_deleted": "Oyuncunun Aktörünü silemezsiniz." + }, "new_prop": { "title": "Yeni Obje", "name": "Adı", @@ -169,5 +180,9 @@ "go_back": "Geri Git", "restart": "Yeniden Başlat", "restart_later": "Sonra Yeniden Başlat" + }, + "context_menu": { + "copy_full_path": "Full yolunu kopyala", + "delete": "Sil" } } \ No newline at end of file From e3bdf5c584d41afc2c94a30babb8e5201a5ce58f Mon Sep 17 00:00:00 2001 From: CDevv Date: Sat, 18 Apr 2026 14:00:42 +0300 Subject: [PATCH 37/69] Use pugixml to process dialogue formatting + introduce color tags, fontSize and font tags --- include/dialogueBalloon.hpp | 7 ++- include/resourceService.hpp | 5 ++ src/dialogueBalloon.cpp | 32 ++++++----- src/dialogueParser.cpp | 106 +++++++++++++++--------------------- src/editor/project.cpp | 13 ++++- src/game.cpp | 3 + src/gamedata.cpp | 10 +++- src/interfaceService.cpp | 8 +-- src/resourceService.cpp | 52 +++++++++++++++++- xmake.lua | 6 +- 10 files changed, 149 insertions(+), 93 deletions(-) diff --git a/include/dialogueBalloon.hpp b/include/dialogueBalloon.hpp index 8c4aab05..731dd2c5 100644 --- a/include/dialogueBalloon.hpp +++ b/include/dialogueBalloon.hpp @@ -9,6 +9,9 @@ struct DialogueTextSection { std::string key; std::string text; + Color textColor = WHITE; + int textSize = 13; + std::string font = "LanaPixel"; }; struct DialogueLine { @@ -26,6 +29,8 @@ struct DialogueBin { class DialogueBalloon { private: + std::string fontName = "LanaPixel"; + Font font; Rectangle rect; Rectangle textRect; Rectangle textPortraitRect; @@ -50,7 +55,7 @@ class DialogueBalloon { void draw(); void showDialogue(const DialogueBin &newDialogue); void hideDialogue(); - void charP(Vector2 charMeasure, const char *c, Color color); + void charP(Vector2 charMeasure, const char *c, DialogueLine &textLine, DialogueTextSection &textSection); }; #endif diff --git a/include/resourceService.hpp b/include/resourceService.hpp index f9ca03cf..947f3584 100644 --- a/include/resourceService.hpp +++ b/include/resourceService.hpp @@ -9,13 +9,18 @@ class ResourceService { private: std::map textures; + std::map fonts; public: ResourceService(); ~ResourceService(); + void init(); void addTextureFromFile(const std::string &filePath); void addTexture(const std::string &id, Texture2D texture); Texture2D getTexture(const std::string &id); + void addFont(const std::string &id, Font font); + void addFontFromFile(const std::string &filePath, int fontSize); + Font getFont(const std::string &id); void unload() const; }; diff --git a/src/dialogueBalloon.cpp b/src/dialogueBalloon.cpp index eb1348f9..978cc98f 100644 --- a/src/dialogueBalloon.cpp +++ b/src/dialogueBalloon.cpp @@ -11,6 +11,7 @@ DialogueBalloon::DialogueBalloon() = default; DialogueBalloon::DialogueBalloon(Rectangle rect) { + this->font = Game::getResources().getFont("LanaPixel"); this->rect = rect; this->textRect = Rectangle{rect.x + 9, rect.y + 9, rect.width - (9 * 2), rect.height - (9 * 2)}; this->textPortraitRect = this->textRect; @@ -116,20 +117,11 @@ void DialogueBalloon::draw() { sectionIndex = 0; Vector2 charMeasure = Vector2{0, 0}; for (int i = 0; i < charIndex; i++) { - Color newTextColor = WHITE; - int size = 0; int idx = 0; for (auto section : dialogue.lines.at(lineIndex).sections) { if (i < (size + TextLength(section.text.c_str()))) { sectionIndex = idx; - if (section.key == "red") { - newTextColor = RED; - } else if (section.key == "blue") { - newTextColor = BLUE; - } else if (section.key == "green") { - newTextColor = GREEN; - } break; } else { size += TextLength(section.text.c_str()); @@ -137,19 +129,28 @@ void DialogueBalloon::draw() { idx++; } + auto &line = dialogue.lines.at(lineIndex); + auto §ion = dialogue.lines.at(lineIndex).sections.at(sectionIndex); + + if (fontName != section.font) { + font = Game::getResources().getFont(section.font); + fontName = section.font; + } + const char *subText = TextSubtext(text.c_str(), i, 1); - charP(charMeasure, subText, newTextColor); + charP(charMeasure, subText, line, section); - Vector2 newMeasure = MeasureTextEx(font, TextSubtext(text.c_str(), i, 1), 13 * 3, 1.0f); + Vector2 newMeasure = MeasureTextEx(Game::getResources().getFont(section.font), + TextSubtext(text.c_str(), i, 1), section.textSize * 3, 1.0f); charMeasure = newMeasure; } } } -void DialogueBalloon::charP(Vector2 charMeasure, const char *c, Color color) { - Font font = Game::getUi().getFont(); +void DialogueBalloon::charP(Vector2 charMeasure, const char *c, DialogueLine &textLine, + DialogueTextSection &textSection) { Rectangle resRect = this->textRect; - if (dialogue.lines.at(lineIndex).hasPortrait) { + if (textLine.hasPortrait) { resRect = textPortraitRect; } @@ -167,7 +168,8 @@ void DialogueBalloon::charP(Vector2 charMeasure, const char *c, Color color) { textPos.x += charMeasure.x; } - DrawTextEx(font, c, finalCharPos, 13 * 3, 1, color); + DrawTextEx(Game::getResources().getFont(textSection.font), c, finalCharPos, textSection.textSize * 3, 1, + textSection.textColor); } void DialogueBalloon::showDialogue(const DialogueBin &newDialogue) { diff --git a/src/dialogueParser.cpp b/src/dialogueParser.cpp index d268a1fb..cc9b3ff5 100644 --- a/src/dialogueParser.cpp +++ b/src/dialogueParser.cpp @@ -1,84 +1,64 @@ #include "dialogueParser.hpp" #include +#include #include +#include #include #include #include "dialogueBalloon.hpp" +#include "raylib.h" using json = nlohmann::json; -std::vector parseDialogueContent(const std::string &t) { - std::string tagName = ""; - std::string tagContent = ""; - std::string tagClose = ""; - bool parseTag = false; - bool parseTagContent = true; - bool parseTagEnd = false; - bool parseTagClose = false; +std::map textColors = {{"lightgray", LIGHTGRAY}, {"gray", GRAY}, {"darkgray", DARKGRAY}, + {"gold", GOLD}, {"yellow", YELLOW}, {"orange", ORANGE}, + {"pink", PINK}, {"red", RED}, {"maroon", MAROON}, + {"green", GREEN}, {"lime", LIME}, {"darkgreen", DARKGREEN}, + {"skyblue", SKYBLUE}, {"blue", BLUE}, {"darkblue", DARKBLUE}, + {"purple", PURPLE}, {"violet", VIOLET}, {"darkpurple", DARKPURPLE}, + {"beige", BEIGE}, {"brown", BROWN}, {"DARKBROWN", DARKBROWN}, + {"magenta", MAGENTA}, {"white", WHITE}, {"black", BLACK}}; + +DialogueTextSection parseSection(pugi::xml_node node, DialogueTextSection base) { + base.key = node.name(); + base.text = node.text().as_string(); + + if (textColors.count(base.key) > 0) { + base.textColor = textColors[base.key]; + } - std::vector v; - int idx = 0; - for (auto c : t) { - if (c == '<' && !parseTag) { - if (tagName == "") { - v.push_back({"", tagContent}); - tagContent = ""; - } + if (base.key == "textSize") { + base.textSize = node.attribute("size").as_int(16); + } - parseTagContent = false; - parseTag = true; - } else if (c == '>') { - parseTagEnd = true; - parseTag = false; + if (base.key == "font") { + base.font = node.attribute("font").as_string("LanaPixel"); + } - if (parseTagClose) { - parseTagClose = false; + return base; +} - if (tagName == tagClose) { - v.push_back({tagName, tagContent}); +std::vector parseDialogueContent(const std::string &t) { + std::vector v; - tagName = ""; - tagContent = ""; - tagClose = ""; - parseTag = false; - parseTagContent = true; - parseTagEnd = false; - parseTagClose = false; + pugi::xml_document xmlDoc; + auto result = xmlDoc.load_string(TextFormat("%s", t.c_str())); + if (result && !xmlDoc.child("text").empty()) { + for (auto item : xmlDoc.child("text").children()) { + DialogueTextSection textSection; + textSection = parseSection(item, textSection); + + if (!item.children().empty()) { + for (auto &subitem : item.children()) { + DialogueTextSection subTextSection; + subTextSection = parseSection(subitem, textSection); + v.push_back(subTextSection); } + } else { + v.push_back(textSection); } } - - if (c == '/') { - parseTag = false; - parseTagClose = true; - } - - if (parseTag && c != '<') { - tagName.push_back(c); - } else if (parseTagClose && c != '/') { - tagClose.push_back(c); - } - - if (parseTagEnd) { - parseTagContent = true; - parseTagEnd = false; - } - - if (parseTagContent && c != '>') { - tagContent.push_back(c); - } - - idx++; - - if (idx == (t.length())) { - v.push_back({"", tagContent}); - tagContent = ""; - } - } - - for (auto item : v) { - printf("%s : %s \n", item.key.c_str(), item.text.c_str()); } return v; diff --git a/src/editor/project.cpp b/src/editor/project.cpp index 6067a7b2..49435bf0 100644 --- a/src/editor/project.cpp +++ b/src/editor/project.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -206,6 +207,16 @@ std::vector Project::getPropsNames() { } GameData Project::generateStruct() { + pugi::xml_document xmlDoc; + auto result = xmlDoc.load_string("Hello RED!"); + if (result) { + for (auto item : xmlDoc.child("text").children()) { + std::cout << item.name() << " : "; + std::cout << item.text().as_string(); + std::cout << std::endl; + } + } + GameData data; data.title = programSet.projectTitle; data.programSet = programSet; @@ -398,7 +409,7 @@ GameData Project::generateStruct() { } fontBin.ext = GetFileExtension(fontPath.c_str()); - + fontBin.dataSize = dataSize; data.fonts[GetFileNameWithoutExt(fontPath.c_str())] = fontBin; UnloadFileData(fileData); diff --git a/src/game.cpp b/src/game.cpp index 5d53e50e..4837395d 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -54,6 +54,9 @@ void Game::useBin(const std::string &filePath) { gameData = std::make_unique(deserializeFile(filePath)); usesBin = true; + // resources + resources->init(); + for (const auto &[name, data] : gameData->images) { Image image = LoadImageFromMemory(data.ext.c_str(), data.data.data(), data.dataSize); Texture2D texture = LoadTextureFromImage(image); diff --git a/src/gamedata.cpp b/src/gamedata.cpp index 731d27f9..ae4ec8d3 100644 --- a/src/gamedata.cpp +++ b/src/gamedata.cpp @@ -8,6 +8,7 @@ #include #include "interactable.hpp" +#include "raylib.h" template void serialize(Archive &a, IRect &b) { @@ -19,6 +20,11 @@ void serialize(Archive &a, IVector &b) { a(b.x, b.y); } +template +void serialize(Archive &a, Color &b) { + a(b.a, b.r, b.g, b.b); +} + template void serialize(Archive &a, ActorBin &b) { a(b.name, b.tileSetName, b.collision, b.animations); @@ -82,7 +88,7 @@ void serialize(Archive &a, RoomBin &b) { template void serialize(Archive &a, DialogueTextSection &b) { - a(b.key, b.text); + a(b.key, b.text, b.textColor, b.textSize, b.font); } template @@ -108,7 +114,7 @@ void serialize(Archive &a, ProjectGameSettings &b) { template void serialize(Archive &a, GameData &b) { - a(b.title, b.programSet, b.gameSet, b.images, b.tilesets, b.rooms, b.actors, b.props, b.dialogues, b.music, + a(b.title, b.programSet, b.gameSet, b.images, b.fonts, b.tilesets, b.rooms, b.actors, b.props, b.dialogues, b.music, b.interactables, b.scripts); } diff --git a/src/interfaceService.cpp b/src/interfaceService.cpp index 0e1cbe5f..c33ce297 100644 --- a/src/interfaceService.cpp +++ b/src/interfaceService.cpp @@ -13,7 +13,8 @@ InterfaceService::InterfaceService() { fpsVisible = false; - this->font = LoadFontEx("fonts/LanaPixel.ttf", 13, nullptr, 250); + // this->font = LoadFontEx("fonts/LanaPixel.ttf", 13, nullptr, 250); + this->font = Game::getResources().getFont("LanaPixel"); Image img = LoadImage("images/ui-npatch.png"); ImageResizeNN(&img, img.width * 3, img.height * 3); @@ -90,7 +91,4 @@ void InterfaceService::draw() { } } -void InterfaceService::unload() const { - UnloadFont(font); - UnloadTexture(this->uiTexture); -} +void InterfaceService::unload() const { UnloadTexture(this->uiTexture); } diff --git a/src/resourceService.cpp b/src/resourceService.cpp index a0a3dad4..1ec5352d 100644 --- a/src/resourceService.cpp +++ b/src/resourceService.cpp @@ -4,12 +4,41 @@ #include +#include "game.hpp" + ResourceService::ResourceService() { addTextureFromFile("resources/logo.png"); addTextureFromFile("resources/close.png"); addTextureFromFile("resources/cross.png"); addTextureFromFile("resources/dialog.png"); addTextureFromFile("resources/figurine.png"); + + init(); +} + +void ResourceService::init() { + unload(); + + /* + if (Game::isUsingBin()) { + for (auto &[id, fontBin] : Game::getBin().fonts) { + Font font = LoadFontFromMemory(fontBin.ext.c_str(), fontBin.data.data(), fontBin.dataSize, 13, nullptr, 0); + addFont(id, font); + } + } else { + auto dirList = LoadDirectoryFiles("fonts/"); + for (int i = 0; i < dirList.count; i++) { + auto path = dirList.paths[i]; + addFontFromFile(path, 13); + } + } + */ + + auto dirList = LoadDirectoryFiles("fonts/"); + for (int i = 0; i < dirList.count; i++) { + auto path = dirList.paths[i]; + addFontFromFile(path, 13); + } } ResourceService::~ResourceService() = default; @@ -25,10 +54,27 @@ void ResourceService::addTextureFromFile(const std::string &filePath) { addTexture(newId, text); } +Texture2D ResourceService::getTexture(const std::string &id) { return textures[id]; } + +void ResourceService::addFont(const std::string &id, Font font) { fonts[id] = font; } + +void ResourceService::addFontFromFile(const std::string &filePath, int fontSize) { + Font font = LoadFontEx(filePath.c_str(), fontSize, nullptr, 250); + addFont(GetFileNameWithoutExt(filePath.c_str()), font); +} + +Font ResourceService::getFont(const std::string &id) { return fonts.at(id); } + void ResourceService::unload() const { for (const auto &[name, texture] : textures) { - UnloadTexture(texture); + if (IsTextureValid(texture)) { + UnloadTexture(texture); + } } -} -Texture2D ResourceService::getTexture(const std::string &id) { return textures[id]; } + for (const auto &[id, font] : fonts) { + if (IsFontValid(font)) { + UnloadFont(font); + } + } +} diff --git a/xmake.lua b/xmake.lua index ed743b80..8db27d4e 100644 --- a/xmake.lua +++ b/xmake.lua @@ -70,13 +70,13 @@ on_install("linux", "macosx", "mingw", "windows", function (package) end) package_end() -add_requires("raylib", "tgui", "nlohmann_json", "luajit") +add_requires("raylib", "tgui", "nlohmann_json", "luajit", "pugixml") add_rules("mode.debug", "mode.release") set_defaultmode("debug") target("rpgpp") set_kind("static") -add_packages("raylib", "nlohmann_json", "luajit") +add_packages("raylib", "nlohmann_json", "luajit", "pugixml") set_languages("cxx17") add_includedirs("include/", "include/lua/") add_files("src/*.cpp", "src/lua/*.cpp") @@ -153,7 +153,7 @@ set_languages("cxx17") add_includedirs("include/", "include/editor/", os.dirs(path.join(os.scriptdir()))) add_files("src/editor/**.cpp") add_deps("rpgpp") -add_packages("raylib", "tgui", "nlohmann_json", "luajit") +add_packages("raylib", "tgui", "nlohmann_json", "luajit", "pugixml") after_build( function (target) os.cp("$(curdir)/resources", "./build/$(plat)/$(arch)/$(mode)/", { async = true }) if is_plat("linux", "macosx") then From 973665ff958e5f73c2e16f884a0238b6e9b92e4b Mon Sep 17 00:00:00 2001 From: CDevv Date: Sat, 18 Apr 2026 18:50:07 +0300 Subject: [PATCH 38/69] Delay tag + basic dialogue options --- include/dialogueBalloon.hpp | 13 +++++++ src/dialogueBalloon.cpp | 76 +++++++++++++++++++++++++++++++++++-- src/dialogueParser.cpp | 6 +++ src/game.cpp | 7 ---- src/gamedata.cpp | 2 +- src/resourceService.cpp | 25 ++++-------- 6 files changed, 101 insertions(+), 28 deletions(-) diff --git a/include/dialogueBalloon.hpp b/include/dialogueBalloon.hpp index 731dd2c5..b86a8a98 100644 --- a/include/dialogueBalloon.hpp +++ b/include/dialogueBalloon.hpp @@ -12,6 +12,12 @@ struct DialogueTextSection { Color textColor = WHITE; int textSize = 13; std::string font = "LanaPixel"; + float delay = 0.0f; +}; + +struct DialogueOption { + std::string title; + std::string nextDialogue; }; struct DialogueLine { @@ -20,6 +26,8 @@ struct DialogueLine { bool hasPortrait; std::string imageId; std::vector sections; + bool hasOptions = false; + std::vector options; }; struct DialogueBin { @@ -34,10 +42,12 @@ class DialogueBalloon { Rectangle rect; Rectangle textRect; Rectangle textPortraitRect; + Rectangle optionsRect; DialogueBin dialogue; std::string text; DialogueTextSection sectionText; bool firstCharTyped; + bool finishedTyping = false; bool active; int frameCounter; int charIndex; @@ -46,6 +56,9 @@ class DialogueBalloon { Color textColor; int lastSectionLen; Vector2 textPos; + bool delay = false; + float delayDuration = 0.0f; + int hoveredOption = 0; void drawPortrait() const; public: diff --git a/src/dialogueBalloon.cpp b/src/dialogueBalloon.cpp index 978cc98f..3a663373 100644 --- a/src/dialogueBalloon.cpp +++ b/src/dialogueBalloon.cpp @@ -3,6 +3,7 @@ #include #include +#include #include #include "game.hpp" @@ -17,6 +18,7 @@ DialogueBalloon::DialogueBalloon(Rectangle rect) { this->textPortraitRect = this->textRect; this->textPortraitRect.width -= this->textRect.height; this->textPortraitRect.x += this->textRect.height; + this->optionsRect = {rect.x + (rect.width - 180), rect.y - 8 - 180, 180, 180}; this->lineIndex = 0; this->sectionIndex = 0; @@ -50,8 +52,17 @@ void DialogueBalloon::update() { finished = true; } + this->finishedTyping = finished; + if (IsKeyPressed(KEY_Z)) { if (finished) { + if (dialogue.lines.at(lineIndex).hasOptions) { + std::string newDialogue = dialogue.lines.at(lineIndex).options.at(hoveredOption).nextDialogue; + hideDialogue(); + showDialogue(Game::getBin().dialogues[newDialogue]); + return; + } + if (lineIndex == (dialogue.lines.size() - 1)) { hideDialogue(); } else { @@ -73,8 +84,24 @@ void DialogueBalloon::update() { } } + if (dialogue.lines.at(lineIndex).hasOptions) { + if (IsKeyPressed(KEY_UP) && hoveredOption != 0) { + hoveredOption--; + } + if (IsKeyPressed(KEY_DOWN) && hoveredOption < (dialogue.lines.at(lineIndex).options.size() - 1)) { + hoveredOption++; + } + } + + if (delay) { + delayDuration -= (GetFrameTime() * static_cast(60.0f / 20.0f)); + if (delayDuration <= 0.0f) { + delay = false; + } + } + frameCounter++; - if (frameCounter > (60 / 20)) { + if (frameCounter > (60 / 20) && !delay) { frameCounter = 0; if (charIndex < text.size()) { charIndex++; @@ -99,7 +126,6 @@ void DialogueBalloon::drawPortrait() const { void DialogueBalloon::draw() { if (active) { - Font font = Game::getUi().getFont(); Texture uiTexture = Game::getUi().getTexture(); Vector2 origin = {0.0f, 0.0f}; @@ -109,6 +135,28 @@ void DialogueBalloon::draw() { DrawTextureNPatch(uiTexture, info, rect, origin, 0.0f, WHITE); + if (finishedTyping && dialogue.lines.at(lineIndex).hasOptions) { + auto &line = dialogue.lines.at(lineIndex); + + DrawTextureNPatch(uiTexture, info, optionsRect, origin, 0.0f, WHITE); + + Vector2 optionTextPos = {optionsRect.x + 20, optionsRect.y + 20}; + int i = 0; + + for (auto &option : line.options) { + optionTextPos.y += (13 * 3) * i + (4 * i); + + Color optionTextColor = WHITE; + + if (hoveredOption == i) optionTextColor = YELLOW; + + DrawTextEx(Game::getResources().getFont("LanaPixel"), option.title.c_str(), optionTextPos, 13 * 3, 1.0, + optionTextColor); + + i++; + } + } + if (dialogue.lines.at(lineIndex).hasPortrait) { drawPortrait(); } @@ -122,6 +170,7 @@ void DialogueBalloon::draw() { for (auto section : dialogue.lines.at(lineIndex).sections) { if (i < (size + TextLength(section.text.c_str()))) { sectionIndex = idx; + break; } else { size += TextLength(section.text.c_str()); @@ -137,6 +186,13 @@ void DialogueBalloon::draw() { fontName = section.font; } + if (section.key == "delay" || section.delay > 0) { + if (!delay) { + delay = true; + delayDuration = section.delay; + } + } + const char *subText = TextSubtext(text.c_str(), i, 1); charP(charMeasure, subText, line, section); @@ -176,11 +232,25 @@ void DialogueBalloon::showDialogue(const DialogueBin &newDialogue) { if (active) return; this->dialogue = newDialogue; + + // test + DialogueLine testLine; + testLine.hasOptions = true; + testLine.text = ""; + testLine.sections.push_back({"", "Hello!"}); + testLine.options.push_back({"Option 1", "mydiag"}); + testLine.options.push_back({"Option 2", "diag"}); + dialogue.lines.push_back(testLine); + this->lineIndex = 0; firstCharTyped = false; active = true; - this->text = newDialogue.lines.at(0).text; + text = ""; + + for (auto k : dialogue.lines.at(lineIndex).sections) { + text = text.append(k.text); + } this->frameCounter = 0; this->charIndex = 0; diff --git a/src/dialogueParser.cpp b/src/dialogueParser.cpp index cc9b3ff5..7fb15b0c 100644 --- a/src/dialogueParser.cpp +++ b/src/dialogueParser.cpp @@ -24,6 +24,8 @@ DialogueTextSection parseSection(pugi::xml_node node, DialogueTextSection base) base.key = node.name(); base.text = node.text().as_string(); + printf("%s : %s \n", base.key.c_str(), base.text.c_str()); + if (textColors.count(base.key) > 0) { base.textColor = textColors[base.key]; } @@ -36,6 +38,10 @@ DialogueTextSection parseSection(pugi::xml_node node, DialogueTextSection base) base.font = node.attribute("font").as_string("LanaPixel"); } + if (base.key == "delay") { + base.delay = node.attribute("delay").as_float(1.0f); + } + return base; } diff --git a/src/game.cpp b/src/game.cpp index 4837395d..2846715e 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -57,13 +57,6 @@ void Game::useBin(const std::string &filePath) { // resources resources->init(); - for (const auto &[name, data] : gameData->images) { - Image image = LoadImageFromMemory(data.ext.c_str(), data.data.data(), data.dataSize); - Texture2D texture = LoadTextureFromImage(image); - resources->addTexture(name, texture); - UnloadImage(image); - } - /// Setup program SetWindowTitle(gameData->title.c_str()); SetWindowSize(gameData->programSet.windowSize.x, gameData->programSet.windowSize.y); diff --git a/src/gamedata.cpp b/src/gamedata.cpp index ae4ec8d3..de87b687 100644 --- a/src/gamedata.cpp +++ b/src/gamedata.cpp @@ -88,7 +88,7 @@ void serialize(Archive &a, RoomBin &b) { template void serialize(Archive &a, DialogueTextSection &b) { - a(b.key, b.text, b.textColor, b.textSize, b.font); + a(b.key, b.text, b.textColor, b.textSize, b.font, b.delay); } template diff --git a/src/resourceService.cpp b/src/resourceService.cpp index 1ec5352d..b1563aba 100644 --- a/src/resourceService.cpp +++ b/src/resourceService.cpp @@ -6,25 +6,23 @@ #include "game.hpp" -ResourceService::ResourceService() { - addTextureFromFile("resources/logo.png"); - addTextureFromFile("resources/close.png"); - addTextureFromFile("resources/cross.png"); - addTextureFromFile("resources/dialog.png"); - addTextureFromFile("resources/figurine.png"); - - init(); -} +ResourceService::ResourceService() { init(); } void ResourceService::init() { unload(); - /* if (Game::isUsingBin()) { for (auto &[id, fontBin] : Game::getBin().fonts) { Font font = LoadFontFromMemory(fontBin.ext.c_str(), fontBin.data.data(), fontBin.dataSize, 13, nullptr, 0); addFont(id, font); } + + for (const auto &[name, data] : Game::getBin().images) { + Image image = LoadImageFromMemory(data.ext.c_str(), data.data.data(), data.dataSize); + Texture2D texture = LoadTextureFromImage(image); + addTexture(name, texture); + UnloadImage(image); + } } else { auto dirList = LoadDirectoryFiles("fonts/"); for (int i = 0; i < dirList.count; i++) { @@ -32,13 +30,6 @@ void ResourceService::init() { addFontFromFile(path, 13); } } - */ - - auto dirList = LoadDirectoryFiles("fonts/"); - for (int i = 0; i < dirList.count; i++) { - auto path = dirList.paths[i]; - addFontFromFile(path, 13); - } } ResourceService::~ResourceService() = default; From d8123bd6e2aba7c9843f5f9f0e6fb8fa60ad0d9f Mon Sep 17 00:00:00 2001 From: thefirey33 Date: Sat, 18 Apr 2026 20:19:57 +0300 Subject: [PATCH 39/69] Make propView properly adjust with the propFileView's size. --- include/editor/widgets/propertiesBox.hpp | 1 + src/editor/fileViews/propFileView.cpp | 6 ++---- src/editor/widgets/propertiesBox.cpp | 2 ++ 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/include/editor/widgets/propertiesBox.hpp b/include/editor/widgets/propertiesBox.hpp index d0bb9f16..f5850dd8 100644 --- a/include/editor/widgets/propertiesBox.hpp +++ b/include/editor/widgets/propertiesBox.hpp @@ -50,6 +50,7 @@ class PropertiesBox : public tgui::ChildWindow { void addButton(const tgui::String &title, std::function callback); void addInterPropField(InterPropField::Ptr field); void addPropertiesBox(PropertiesBox::Ptr box); + void addWidget(tgui::Widget::Ptr widget); tgui::Button::Ptr constructButton(const tgui::String &title, std::function callback); }; diff --git a/src/editor/fileViews/propFileView.cpp b/src/editor/fileViews/propFileView.cpp index 3441df9d..54c0455c 100644 --- a/src/editor/fileViews/propFileView.cpp +++ b/src/editor/fileViews/propFileView.cpp @@ -67,10 +67,8 @@ PropFileView::PropFileView() { propPreview = PropPreview::create(); Editor::instance->getGui().addUpdate(WorldView::asUpdatable(propPreview)); - propPreview->setSize({"100%", "30%"}); - propPreview->setPosition({"0%", "50%"}); - propPreview->setOrigin({0, 0.5}); - propBox->add(propPreview); + propPreview->setSize({"100%", 200}); + propBox->addWidget(propPreview); propView->onUpdatedAtlasRect([this](Rectangle r) { atlasRectField->setValue(r); }); propView->onUpdatedCollisionRect([this](Rectangle r) { collisionsField->setValue(r); }); diff --git a/src/editor/widgets/propertiesBox.cpp b/src/editor/widgets/propertiesBox.cpp index e40b22d5..d372e955 100644 --- a/src/editor/widgets/propertiesBox.cpp +++ b/src/editor/widgets/propertiesBox.cpp @@ -248,3 +248,5 @@ void PropertiesBox::addPropertiesBox(PropertiesBox::Ptr box) { box->setWidth("80%"); layout->add(box); } + +void PropertiesBox::addWidget(tgui::Widget::Ptr widget) { layout->add(widget); } From 47175fa456da9d0a5b419b9795f247061eede342 Mon Sep 17 00:00:00 2001 From: thefirey33 Date: Sun, 19 Apr 2026 00:13:57 +0300 Subject: [PATCH 40/69] [1/2] Implement the base functions for text formatting, will finish tomorrow. --- include/dialogueParser.hpp | 2 ++ include/editor/fileViews/dialogueFileView.hpp | 4 ++- include/editor/widgets/dialogueEditor.hpp | 25 +++++++++++++ src/dialogueParser.cpp | 3 +- src/editor/fileViews/dialogueFileView.cpp | 35 ++++++++++++++++--- src/editor/widgets/dialogueEditor.cpp | 31 ++++++++++++++++ 6 files changed, 93 insertions(+), 7 deletions(-) create mode 100644 include/editor/widgets/dialogueEditor.hpp create mode 100644 src/editor/widgets/dialogueEditor.cpp diff --git a/include/dialogueParser.hpp b/include/dialogueParser.hpp index 99f26ca9..20b0944f 100644 --- a/include/dialogueParser.hpp +++ b/include/dialogueParser.hpp @@ -6,6 +6,8 @@ #include using json = nlohmann::json; + + std::vector parseDialogueContent(const std::string &t); #endif \ No newline at end of file diff --git a/include/editor/fileViews/dialogueFileView.hpp b/include/editor/fileViews/dialogueFileView.hpp index 29daf6e3..a9673320 100644 --- a/include/editor/fileViews/dialogueFileView.hpp +++ b/include/editor/fileViews/dialogueFileView.hpp @@ -9,9 +9,10 @@ #include "TGUI/Widgets/GrowVerticalLayout.hpp" #include "TGUI/Widgets/Panel.hpp" #include "TGUI/Widgets/ScrollablePanel.hpp" +#include "TGUI/Widgets/TextArea.hpp" #include "dialogueBalloon.hpp" #include "fileViews/fileView.hpp" -#include "services/translationService.hpp" +#include "widgets/dialogueEditor.hpp" class DialogueFileView : public FileView { const float DIALOGUE_PANEL_HEIGHT = 200.0f; @@ -23,6 +24,7 @@ class DialogueFileView : public FileView { tgui::Texture noImageTexture; tgui::Texture deleteTexture; std::vector linePanels; + std::vector dialogueBoxes; tgui::Panel::Ptr makeLinePanel(DialogueBin &data, DialogueLine line, size_t i); diff --git a/include/editor/widgets/dialogueEditor.hpp b/include/editor/widgets/dialogueEditor.hpp new file mode 100644 index 00000000..43ba9ddc --- /dev/null +++ b/include/editor/widgets/dialogueEditor.hpp @@ -0,0 +1,25 @@ +#ifndef _RPGPP_DIALOGUEEDITOR_HPP +#define _RPGPP_DIALOGUEEDITOR_HPP + +#include +#include +#include + +#include "TGUI/Text.hpp" +#include "TGUI/Widgets/TextArea.hpp" +class DialogueEditor : public tgui::TextArea { +private: + std::size_t formattingSelectionStart; + std::size_t formattingSelectionEnd; + tgui::String selectedText; + +public: + typedef std::shared_ptr Ptr; + DialogueEditor(); + + static DialogueEditor::Ptr create(); + + void addXmlTag(std::string tagName); +}; + +#endif /* _RPGPP_DIALOGUEEDITOR_HPP */ diff --git a/src/dialogueParser.cpp b/src/dialogueParser.cpp index 7fb15b0c..388b792a 100644 --- a/src/dialogueParser.cpp +++ b/src/dialogueParser.cpp @@ -1,7 +1,6 @@ #include "dialogueParser.hpp" #include -#include #include #include #include @@ -17,7 +16,7 @@ std::map textColors = {{"lightgray", LIGHTGRAY}, {"gray", GR {"green", GREEN}, {"lime", LIME}, {"darkgreen", DARKGREEN}, {"skyblue", SKYBLUE}, {"blue", BLUE}, {"darkblue", DARKBLUE}, {"purple", PURPLE}, {"violet", VIOLET}, {"darkpurple", DARKPURPLE}, - {"beige", BEIGE}, {"brown", BROWN}, {"DARKBROWN", DARKBROWN}, + {"beige", BEIGE}, {"brown", BROWN}, {"darkbrown", DARKBROWN}, {"magenta", MAGENTA}, {"white", WHITE}, {"black", BLACK}}; DialogueTextSection parseSection(pugi::xml_node node, DialogueTextSection base) { diff --git a/src/editor/fileViews/dialogueFileView.cpp b/src/editor/fileViews/dialogueFileView.cpp index 5e0171d3..583abf96 100644 --- a/src/editor/fileViews/dialogueFileView.cpp +++ b/src/editor/fileViews/dialogueFileView.cpp @@ -5,13 +5,18 @@ #include #include #include +#include +#include +#include "TGUI/Cursor.hpp" #include "TGUI/Layout.hpp" #include "TGUI/String.hpp" #include "TGUI/Texture.hpp" #include "TGUI/Widgets/Button.hpp" +#include "TGUI/Widgets/ComboBox.hpp" #include "TGUI/Widgets/EditBox.hpp" #include "TGUI/Widgets/FileDialog.hpp" +#include "TGUI/Widgets/GrowHorizontalLayout.hpp" #include "TGUI/Widgets/GrowVerticalLayout.hpp" #include "TGUI/Widgets/Panel.hpp" #include "TGUI/Widgets/TextArea.hpp" @@ -88,19 +93,41 @@ tgui::Panel::Ptr DialogueFileView::makeLinePanel(DialogueBin &data, DialogueLine }); panel->add(portraitPic); + auto topControlsLayout = tgui::GrowHorizontalLayout::create(); + topControlsLayout->getRenderer()->setSpaceBetweenWidgets(5.0f); + topControlsLayout->setSize({"100% - 210 - 40", 32}); + topControlsLayout->setPosition(210, 0); + auto charNameEdit = tgui::EditBox::create(); - charNameEdit->setSize({"100% - 210 - 40", 32}); - charNameEdit->setPosition(210, 0); charNameEdit->setText(line.characterName); charNameEdit->onTextChange( [&data, i](const tgui::String &text) { data.lines.at(i).characterName = text.toStdString(); }); - panel->add(charNameEdit); + topControlsLayout->add(charNameEdit); + + // TODO: Finish the text formatting. + + auto colorSelectDropdown = tgui::ComboBox::create(); - auto diagTextEdit = tgui::TextArea::create(); + colorSelectDropdown->setDefaultText("Select a color..."); + + colorSelectDropdown->onItemSelect.connect([colorSelectDropdown, i, this](const tgui::String &text) { + auto ref = dialogueBoxes.at(i); + ref->addXmlTag(text.toStdString()); + colorSelectDropdown->deselectItem(); + }); + + topControlsLayout->add(colorSelectDropdown); + + panel->add(topControlsLayout); + + auto diagTextEdit = DialogueEditor::create(); diagTextEdit->setPosition(210, 32 + 8); + diagTextEdit->setMouseCursor(tgui::Cursor::Type::Text); diagTextEdit->setSize({"100% - 210 - 40", "100% - 40"}); diagTextEdit->setText(line.text); diagTextEdit->onTextChange([&data, i](const tgui::String &text) { data.lines.at(i).text = text.toStdString(); }); + dialogueBoxes.push_back(diagTextEdit); + panel->add(diagTextEdit); auto hasImageCheck = tgui::CheckBox::create(); diff --git a/src/editor/widgets/dialogueEditor.cpp b/src/editor/widgets/dialogueEditor.cpp new file mode 100644 index 00000000..a63f1b64 --- /dev/null +++ b/src/editor/widgets/dialogueEditor.cpp @@ -0,0 +1,31 @@ +#include "widgets/dialogueEditor.hpp" + +#include +#include +#include + +#include "TGUI/String.hpp" + +DialogueEditor::Ptr DialogueEditor::create() { return std::make_shared(); } + +DialogueEditor::DialogueEditor() { + this->onSelectionChange.connect([&] { + if (!this->isFocused()) return; + + this->formattingSelectionStart = this->getSelectionStart(); + this->formattingSelectionEnd = this->getSelectionEnd(); + this->selectedText = this->getSelectedText(); + }); +} + +void DialogueEditor::addXmlTag(std::string tagName) { + auto text = this->getText(); + + std::stringstream ss{}; + + ss << text.substr(0, this->formattingSelectionStart); + ss << "<" << tagName << ">" << this->selectedText << ""; + ss << text.substr(this->formattingSelectionEnd); + + this->setText(ss.str()); +} \ No newline at end of file From 02c54ad0084ad608fc1e464841d36c1456a9e302 Mon Sep 17 00:00:00 2001 From: thefirey33 Date: Sun, 19 Apr 2026 03:12:27 +0300 Subject: [PATCH 41/69] Add ability to change color formatting. --- include/dialogueParser.hpp | 6 +- .../editor/childWindows/colorSelectWindow.hpp | 18 +++++ include/editor/fileViews/dialogueFileView.hpp | 1 - include/editor/widgets/dialogueEditor.hpp | 3 +- resources/translations/en_us.json | 29 +++++++- src/dialogueBalloon.cpp | 1 - src/dialogueParser.cpp | 10 +++ src/editor/childWindows/colorSelectWindow.cpp | 67 +++++++++++++++++++ src/editor/fileViews/dialogueFileView.cpp | 43 +++++++----- src/editor/services/childWindowSubService.cpp | 3 + src/editor/widgets/dialogueEditor.cpp | 8 +++ src/editor/widgets/frameEditor.cpp | 2 - 12 files changed, 167 insertions(+), 24 deletions(-) create mode 100644 include/editor/childWindows/colorSelectWindow.hpp create mode 100644 src/editor/childWindows/colorSelectWindow.cpp diff --git a/include/dialogueParser.hpp b/include/dialogueParser.hpp index 20b0944f..9b4c9e45 100644 --- a/include/dialogueParser.hpp +++ b/include/dialogueParser.hpp @@ -2,12 +2,14 @@ #define _RPGPP_EDITOR_DIALOGUEPARSER_H #include +#include #include #include +#include using json = nlohmann::json; - - +std::vector getColorTypes(); +std::map &getColors(); std::vector parseDialogueContent(const std::string &t); #endif \ No newline at end of file diff --git a/include/editor/childWindows/colorSelectWindow.hpp b/include/editor/childWindows/colorSelectWindow.hpp new file mode 100644 index 00000000..10a710ef --- /dev/null +++ b/include/editor/childWindows/colorSelectWindow.hpp @@ -0,0 +1,18 @@ +#ifndef _RPGPP_COLORSELECTWINDOW_HPP +#define _RPGPP_COLORSELECTWINDOW_HPP + +#include + +#include "childWindows/popupWindow.hpp" +#include "widgets/dialogueEditor.hpp" +class ColorSelectWindow : public PopupWindow { +private: + std::shared_ptr editor; + +public: + ColorSelectWindow(); + + void open(std::shared_ptr editor); +}; + +#endif \ No newline at end of file diff --git a/include/editor/fileViews/dialogueFileView.hpp b/include/editor/fileViews/dialogueFileView.hpp index a9673320..b8268823 100644 --- a/include/editor/fileViews/dialogueFileView.hpp +++ b/include/editor/fileViews/dialogueFileView.hpp @@ -9,7 +9,6 @@ #include "TGUI/Widgets/GrowVerticalLayout.hpp" #include "TGUI/Widgets/Panel.hpp" #include "TGUI/Widgets/ScrollablePanel.hpp" -#include "TGUI/Widgets/TextArea.hpp" #include "dialogueBalloon.hpp" #include "fileViews/fileView.hpp" #include "widgets/dialogueEditor.hpp" diff --git a/include/editor/widgets/dialogueEditor.hpp b/include/editor/widgets/dialogueEditor.hpp index 43ba9ddc..1ad55f41 100644 --- a/include/editor/widgets/dialogueEditor.hpp +++ b/include/editor/widgets/dialogueEditor.hpp @@ -5,7 +5,7 @@ #include #include -#include "TGUI/Text.hpp" +#include "TGUI/String.hpp" #include "TGUI/Widgets/TextArea.hpp" class DialogueEditor : public tgui::TextArea { private: @@ -20,6 +20,7 @@ class DialogueEditor : public tgui::TextArea { static DialogueEditor::Ptr create(); void addXmlTag(std::string tagName); + bool isSelectedTextEmpty(); }; #endif /* _RPGPP_DIALOGUEEDITOR_HPP */ diff --git a/resources/translations/en_us.json b/resources/translations/en_us.json index 4fa78079..23202d73 100644 --- a/resources/translations/en_us.json +++ b/resources/translations/en_us.json @@ -60,7 +60,34 @@ }, "dialogueview": { "add_new_line": "Add a new line", - "has_a_portrait": "Has a portrait?" + "has_a_portrait": "Has a portrait?", + "select_a_color": "Select a color...", + "color": { + "lightgray": "Light Gray", + "gold": "Gold", + "pink": "Pink", + "green": "Green", + "skyblue": "Sky Blue", + "purple": "Purple", + "beige": "Beige", + "magenta": "Magenta", + "gray": "Gray", + "yellow": "Yellow", + "red": "Red", + "lime": "Lime", + "blue": "Blue", + "violet": "Violet", + "brown": "Brown", + "white": "White", + "darkgray": "Dark Gray", + "orange": "Orange", + "maroon": "Maroon", + "darkgreen": "Dark Green", + "darkblue": "Dark Blue", + "darkpurple": "Dark Purple", + "darkbrown": "Dark Brown", + "black": "Black" + } }, "tilesetview": { "tile_width": "Tile Width", diff --git a/src/dialogueBalloon.cpp b/src/dialogueBalloon.cpp index 3a663373..5c7fe3fb 100644 --- a/src/dialogueBalloon.cpp +++ b/src/dialogueBalloon.cpp @@ -3,7 +3,6 @@ #include #include -#include #include #include "game.hpp" diff --git a/src/dialogueParser.cpp b/src/dialogueParser.cpp index 388b792a..79062dc1 100644 --- a/src/dialogueParser.cpp +++ b/src/dialogueParser.cpp @@ -19,6 +19,16 @@ std::map textColors = {{"lightgray", LIGHTGRAY}, {"gray", GR {"beige", BEIGE}, {"brown", BROWN}, {"darkbrown", DARKBROWN}, {"magenta", MAGENTA}, {"white", WHITE}, {"black", BLACK}}; +std::map &getColors() { return textColors; } + +std::vector getColorTypes() { + std::vector colorTypes{}; + for (auto const &[key, value] : textColors) { + colorTypes.push_back(key); + } + return colorTypes; +} + DialogueTextSection parseSection(pugi::xml_node node, DialogueTextSection base) { base.key = node.name(); base.text = node.text().as_string(); diff --git a/src/editor/childWindows/colorSelectWindow.cpp b/src/editor/childWindows/colorSelectWindow.cpp new file mode 100644 index 00000000..891c7683 --- /dev/null +++ b/src/editor/childWindows/colorSelectWindow.cpp @@ -0,0 +1,67 @@ +#include "childWindows/colorSelectWindow.hpp" + +#include +#include +#include +#include +#include + +#include "TGUI/Color.hpp" +#include "TGUI/Cursor.hpp" +#include "TGUI/Layout.hpp" +#include "TGUI/Widgets/BoxLayout.hpp" +#include "TGUI/Widgets/Button.hpp" +#include "TGUI/Widgets/ChildWindow.hpp" +#include "TGUI/Widgets/GrowVerticalLayout.hpp" +#include "TGUI/Widgets/ScrollablePanel.hpp" +#include "childWindows/popupWindow.hpp" +#include "childWindows/settingsPanel/base.hpp" +#include "dialogueParser.hpp" +#include "raylib.h" +#include "widgets/dialogueEditor.hpp" + +std::uint8_t inverseColor(float value) { return fmax(0, 255 - value); } + +ColorSelectWindow::ColorSelectWindow() : PopupWindow("Select a Color") { + bindTranslation(this->currentWindow, "screen.project.dialogueview.select_a_color", + &tgui::ChildWindow::setTitle); + auto scrollablePanel = tgui::ScrollablePanel::create(); + auto verticalLayout = tgui::GrowVerticalLayout::create(); + + std::vector types = getColorTypes(); + std::map colors = getColors(); + for (int i = 0; i < types.size(); i++) { + auto type = types[i]; + + auto colorButton = tgui::Button::create(); + colorButton->setMouseCursor(tgui::Cursor::Type::Hand); + + bindTranslation(colorButton, TextFormat("screen.project.dialogueview.color.%s", type.c_str()), + &tgui::Button::setText); + + colorButton->setSize({"100%", 32}); + + Color color = colors[types[i]]; + tgui::Color tguiColor = tgui::Color{color.r, color.g, color.b, color.a}; + + // Set the color of the background of the color picker. + auto btnRenderer = colorButton->getRenderer(); + btnRenderer->setBackgroundColor(tguiColor); + btnRenderer->setBackgroundColorHover(tguiColor); + + colorButton->onPress.connect([this, type] { + this->editor->addXmlTag(type); + this->close(); + }); + + verticalLayout->add(colorButton); + } + + scrollablePanel->add(verticalLayout); + this->currentWindow->add(scrollablePanel); +} + +void ColorSelectWindow::open(std::shared_ptr editor) { + PopupWindow::open(); + this->editor = editor; +} \ No newline at end of file diff --git a/src/editor/fileViews/dialogueFileView.cpp b/src/editor/fileViews/dialogueFileView.cpp index 583abf96..df67a65b 100644 --- a/src/editor/fileViews/dialogueFileView.cpp +++ b/src/editor/fileViews/dialogueFileView.cpp @@ -4,7 +4,10 @@ #include #include #include +#include +#include #include +#include #include #include @@ -21,12 +24,15 @@ #include "TGUI/Widgets/Panel.hpp" #include "TGUI/Widgets/TextArea.hpp" #include "bindTranslation.hpp" +#include "childWindows/colorSelectWindow.hpp" #include "dialogue.hpp" +#include "dialogueParser.hpp" #include "editor.hpp" #include "raylib.h" #include "services/fileSystemService.hpp" #include "services/translationService.hpp" #include "variant.hpp" +#include "widgets/dialogueEditor.hpp" DialogueFileView::DialogueFileView() { TranslationService &ts = Editor::instance->getTranslations(); @@ -104,22 +110,6 @@ tgui::Panel::Ptr DialogueFileView::makeLinePanel(DialogueBin &data, DialogueLine [&data, i](const tgui::String &text) { data.lines.at(i).characterName = text.toStdString(); }); topControlsLayout->add(charNameEdit); - // TODO: Finish the text formatting. - - auto colorSelectDropdown = tgui::ComboBox::create(); - - colorSelectDropdown->setDefaultText("Select a color..."); - - colorSelectDropdown->onItemSelect.connect([colorSelectDropdown, i, this](const tgui::String &text) { - auto ref = dialogueBoxes.at(i); - ref->addXmlTag(text.toStdString()); - colorSelectDropdown->deselectItem(); - }); - - topControlsLayout->add(colorSelectDropdown); - - panel->add(topControlsLayout); - auto diagTextEdit = DialogueEditor::create(); diagTextEdit->setPosition(210, 32 + 8); diagTextEdit->setMouseCursor(tgui::Cursor::Type::Text); @@ -128,6 +118,27 @@ tgui::Panel::Ptr DialogueFileView::makeLinePanel(DialogueBin &data, DialogueLine diagTextEdit->onTextChange([&data, i](const tgui::String &text) { data.lines.at(i).text = text.toStdString(); }); dialogueBoxes.push_back(diagTextEdit); + auto selectColorButton = tgui::Button::create(); + bindTranslation(selectColorButton, "screen.project.dialogueview.select_a_color", + &tgui::Button::setText); + + std::weak_ptr weakEditor = diagTextEdit; + selectColorButton->onPress.connect([weakEditor] { + if (auto capture = weakEditor.lock()) { + if (capture->isSelectedTextEmpty()) { + return; + } + + auto selectColorWindow = reinterpret_cast( + Editor::instance->getGui().getChildWindowSubService()->getWindow("select_a_color")); + + selectColorWindow->open(capture); + } + }); + + topControlsLayout->add(selectColorButton); + + panel->add(topControlsLayout); panel->add(diagTextEdit); auto hasImageCheck = tgui::CheckBox::create(); diff --git a/src/editor/services/childWindowSubService.cpp b/src/editor/services/childWindowSubService.cpp index 66b6717e..c39909c4 100644 --- a/src/editor/services/childWindowSubService.cpp +++ b/src/editor/services/childWindowSubService.cpp @@ -3,6 +3,7 @@ #include #include "childWindows/aboutWindow.hpp" +#include "childWindows/colorSelectWindow.hpp" #include "childWindows/editPropWindow.hpp" #include "childWindows/newPropWindow.hpp" #include "childWindows/popupWindow.hpp" @@ -23,6 +24,8 @@ void ChildWindowSubService::createWindows() { this->childWindows.try_emplace("new_prop", std::make_unique()); this->childWindows.try_emplace("edit_prop", std::make_unique()); + + this->childWindows.try_emplace("select_a_color", std::make_unique()); } void ChildWindowSubService::openWindow(const std::string &windowName) { diff --git a/src/editor/widgets/dialogueEditor.cpp b/src/editor/widgets/dialogueEditor.cpp index a63f1b64..111104f9 100644 --- a/src/editor/widgets/dialogueEditor.cpp +++ b/src/editor/widgets/dialogueEditor.cpp @@ -18,14 +18,22 @@ DialogueEditor::DialogueEditor() { }); } +bool DialogueEditor::isSelectedTextEmpty() { return this->selectedText.empty(); } + void DialogueEditor::addXmlTag(std::string tagName) { auto text = this->getText(); + if (this->selectedText.contains("<") || this->selectedText.contains(">") || this->isSelectedTextEmpty()) { + return; + } + std::stringstream ss{}; ss << text.substr(0, this->formattingSelectionStart); ss << "<" << tagName << ">" << this->selectedText << ""; ss << text.substr(this->formattingSelectionEnd); + this->selectedText = ""; + this->setText(ss.str()); } \ No newline at end of file diff --git a/src/editor/widgets/frameEditor.cpp b/src/editor/widgets/frameEditor.cpp index 5c70e35d..29222599 100644 --- a/src/editor/widgets/frameEditor.cpp +++ b/src/editor/widgets/frameEditor.cpp @@ -3,12 +3,10 @@ #include #include -#include "TGUI/SubwidgetContainer.hpp" #include "TGUI/Widget.hpp" #include "TGUI/Widgets/Button.hpp" #include "TGUI/Widgets/ComboBox.hpp" #include "TGUI/Widgets/GrowHorizontalLayout.hpp" -#include "TGUI/Widgets/GrowVerticalLayout.hpp" #include "TGUI/Widgets/ToggleButton.hpp" #include "actor.hpp" #include "bindTranslation.hpp" From 84c93214fb67392763e3d6ee7fb62e305ecc6b5d Mon Sep 17 00:00:00 2001 From: thefirey33 Date: Sun, 19 Apr 2026 03:26:30 +0300 Subject: [PATCH 42/69] Fix up of the color selector. --- include/editor/widgets/dialogueEditor.hpp | 2 +- src/editor/childWindows/colorSelectWindow.cpp | 18 +++++++++++------- src/editor/fileViews/dialogueFileView.cpp | 2 +- src/editor/widgets/dialogueEditor.cpp | 6 ++++-- 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/include/editor/widgets/dialogueEditor.hpp b/include/editor/widgets/dialogueEditor.hpp index 1ad55f41..77e0c87a 100644 --- a/include/editor/widgets/dialogueEditor.hpp +++ b/include/editor/widgets/dialogueEditor.hpp @@ -20,7 +20,7 @@ class DialogueEditor : public tgui::TextArea { static DialogueEditor::Ptr create(); void addXmlTag(std::string tagName); - bool isSelectedTextEmpty(); + bool isTextNonEditable(); }; #endif /* _RPGPP_DIALOGUEEDITOR_HPP */ diff --git a/src/editor/childWindows/colorSelectWindow.cpp b/src/editor/childWindows/colorSelectWindow.cpp index 891c7683..cb540db5 100644 --- a/src/editor/childWindows/colorSelectWindow.cpp +++ b/src/editor/childWindows/colorSelectWindow.cpp @@ -1,6 +1,5 @@ #include "childWindows/colorSelectWindow.hpp" -#include #include #include #include @@ -9,7 +8,6 @@ #include "TGUI/Color.hpp" #include "TGUI/Cursor.hpp" #include "TGUI/Layout.hpp" -#include "TGUI/Widgets/BoxLayout.hpp" #include "TGUI/Widgets/Button.hpp" #include "TGUI/Widgets/ChildWindow.hpp" #include "TGUI/Widgets/GrowVerticalLayout.hpp" @@ -20,7 +18,7 @@ #include "raylib.h" #include "widgets/dialogueEditor.hpp" -std::uint8_t inverseColor(float value) { return fmax(0, 255 - value); } +constexpr int BLACK_WHITE_THRESHOLD = 100; ColorSelectWindow::ColorSelectWindow() : PopupWindow("Select a Color") { bindTranslation(this->currentWindow, "screen.project.dialogueview.select_a_color", @@ -39,15 +37,21 @@ ColorSelectWindow::ColorSelectWindow() : PopupWindow("Select a Color") { bindTranslation(colorButton, TextFormat("screen.project.dialogueview.color.%s", type.c_str()), &tgui::Button::setText); - colorButton->setSize({"100%", 32}); + colorButton->setSize({"100%", 20}); Color color = colors[types[i]]; - tgui::Color tguiColor = tgui::Color{color.r, color.g, color.b, color.a}; + tgui::Color btnBackColor = {color.r, color.g, color.b, color.a}; // Set the color of the background of the color picker. auto btnRenderer = colorButton->getRenderer(); - btnRenderer->setBackgroundColor(tguiColor); - btnRenderer->setBackgroundColorHover(tguiColor); + btnRenderer->setBackgroundColor(btnBackColor); + btnRenderer->setBackgroundColorHover(btnBackColor); + + bool displayAsBlack = ((color.r + color.g + color.b) / 3.0f) > BLACK_WHITE_THRESHOLD; + auto textColor = displayAsBlack ? tgui::Color::Black : tgui::Color::White; + + btnRenderer->setTextColor(textColor); + btnRenderer->setTextColorHover(textColor); colorButton->onPress.connect([this, type] { this->editor->addXmlTag(type); diff --git a/src/editor/fileViews/dialogueFileView.cpp b/src/editor/fileViews/dialogueFileView.cpp index df67a65b..cc793b78 100644 --- a/src/editor/fileViews/dialogueFileView.cpp +++ b/src/editor/fileViews/dialogueFileView.cpp @@ -125,7 +125,7 @@ tgui::Panel::Ptr DialogueFileView::makeLinePanel(DialogueBin &data, DialogueLine std::weak_ptr weakEditor = diagTextEdit; selectColorButton->onPress.connect([weakEditor] { if (auto capture = weakEditor.lock()) { - if (capture->isSelectedTextEmpty()) { + if (capture->isTextNonEditable()) { return; } diff --git a/src/editor/widgets/dialogueEditor.cpp b/src/editor/widgets/dialogueEditor.cpp index 111104f9..f68449b1 100644 --- a/src/editor/widgets/dialogueEditor.cpp +++ b/src/editor/widgets/dialogueEditor.cpp @@ -18,12 +18,14 @@ DialogueEditor::DialogueEditor() { }); } -bool DialogueEditor::isSelectedTextEmpty() { return this->selectedText.empty(); } +bool DialogueEditor::isTextNonEditable() { + return this->selectedText.contains("<") || this->selectedText.contains(">") || this->selectedText.empty(); +} void DialogueEditor::addXmlTag(std::string tagName) { auto text = this->getText(); - if (this->selectedText.contains("<") || this->selectedText.contains(">") || this->isSelectedTextEmpty()) { + if (this->isTextNonEditable()) { return; } From e12cd6619a61d5b651adb62abbeaafb2663716d6 Mon Sep 17 00:00:00 2001 From: thefirey33 Date: Sun, 19 Apr 2026 03:27:48 +0300 Subject: [PATCH 43/69] Slight code adjustment. --- src/editor/childWindows/colorSelectWindow.cpp | 2 +- src/editor/fileViews/dialogueFileView.cpp | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/editor/childWindows/colorSelectWindow.cpp b/src/editor/childWindows/colorSelectWindow.cpp index cb540db5..c54f9b47 100644 --- a/src/editor/childWindows/colorSelectWindow.cpp +++ b/src/editor/childWindows/colorSelectWindow.cpp @@ -18,7 +18,7 @@ #include "raylib.h" #include "widgets/dialogueEditor.hpp" -constexpr int BLACK_WHITE_THRESHOLD = 100; +constexpr int BLACK_WHITE_THRESHOLD = 80; ColorSelectWindow::ColorSelectWindow() : PopupWindow("Select a Color") { bindTranslation(this->currentWindow, "screen.project.dialogueview.select_a_color", diff --git a/src/editor/fileViews/dialogueFileView.cpp b/src/editor/fileViews/dialogueFileView.cpp index cc793b78..f506bce0 100644 --- a/src/editor/fileViews/dialogueFileView.cpp +++ b/src/editor/fileViews/dialogueFileView.cpp @@ -4,10 +4,8 @@ #include #include #include -#include #include #include -#include #include #include @@ -16,7 +14,6 @@ #include "TGUI/String.hpp" #include "TGUI/Texture.hpp" #include "TGUI/Widgets/Button.hpp" -#include "TGUI/Widgets/ComboBox.hpp" #include "TGUI/Widgets/EditBox.hpp" #include "TGUI/Widgets/FileDialog.hpp" #include "TGUI/Widgets/GrowHorizontalLayout.hpp" @@ -26,7 +23,6 @@ #include "bindTranslation.hpp" #include "childWindows/colorSelectWindow.hpp" #include "dialogue.hpp" -#include "dialogueParser.hpp" #include "editor.hpp" #include "raylib.h" #include "services/fileSystemService.hpp" From cf24ec3e697c7545b61b3dff7b44216fa4eb3978 Mon Sep 17 00:00:00 2001 From: thefirey33 Date: Sun, 19 Apr 2026 03:33:09 +0300 Subject: [PATCH 44/69] Create Turkish Translation. --- resources/translations/tr.json | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/resources/translations/tr.json b/resources/translations/tr.json index 1721beb6..f76f1079 100644 --- a/resources/translations/tr.json +++ b/resources/translations/tr.json @@ -60,7 +60,34 @@ }, "dialogueview": { "add_new_line": "Yeni satır ekle", - "has_a_portrait": "Portresi olacak mı?" + "has_a_portrait": "Portresi olacak mı?", + "select_a_color": "Renk seçiniz...", + "color": { + "lightgray": "Açık Grey", + "gold": "Altın", + "pink": "Pembe", + "green": "Yeşil", + "skyblue": "Gökyüzü Mavisi", + "purple": "Mor", + "beige": "Bej", + "magenta": "Macenta", + "gray": "Grey", + "yellow": "Sarı", + "red": "Kırmızı", + "lime": "Misket", + "blue": "Mavi", + "violet": "Menekşe", + "brown": "Kahverengi", + "white": "Beyaz", + "darkgray": "Koyu Gri", + "orange": "Turuncu", + "maroon": "Bordo", + "darkgreen": "Koyu Yeşil", + "darkblue": "Koyu Mavi", + "darkpurple": "Koyu Mor", + "darkbrown": "Koyu Kahverengi", + "black": "Siyah" + } }, "tilesetview": { "tile_width": "Kare Genişliği", From 41eb818dd941b002c4e939c7995305fb37e331fb Mon Sep 17 00:00:00 2001 From: thefirey33 Date: Sun, 19 Apr 2026 03:34:17 +0300 Subject: [PATCH 45/69] Cleanup. (dialogueFileView will still be worked on, It is not done yet.) --- src/editor/childWindows/projectSettingsWindow.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/editor/childWindows/projectSettingsWindow.cpp b/src/editor/childWindows/projectSettingsWindow.cpp index a1215f34..ff0e2038 100644 --- a/src/editor/childWindows/projectSettingsWindow.cpp +++ b/src/editor/childWindows/projectSettingsWindow.cpp @@ -2,11 +2,7 @@ #include -#include "TGUI/String.hpp" #include "TGUI/Widgets/Button.hpp" -#include "TGUI/Widgets/EditBox.hpp" -#include "TGUI/Widgets/GrowVerticalLayout.hpp" -#include "TGUI/Widgets/Label.hpp" #include "childWindows/popupWindow.hpp" #include "childWindows/projectSettingsPanel/game.hpp" #include "childWindows/projectSettingsPanel/program.hpp" @@ -14,7 +10,6 @@ #include "editor.hpp" #include "project.hpp" #include "raylib.h" -#include "widgets/propertyFields/textField.hpp" ProjectSettingsWindow::ProjectSettingsWindow() : PopupWindow("ProjectSettings") { tgui::TabContainer::Ptr tabContainer = tgui::TabContainer::create(); From 5f6231437716f698ad48e204b8655f97fcd10ab1 Mon Sep 17 00:00:00 2001 From: CDevv Date: Sun, 19 Apr 2026 18:25:55 +0300 Subject: [PATCH 46/69] Add and edit dialogue options in Editor --- .../childWindows/addDialogueOptionWindow.hpp | 16 +++ .../childWindows/editDialogueOptionWindow.hpp | 24 ++++ include/editor/fileViews/dialogueFileView.hpp | 5 + resources/translations/bg.json | 13 +++ resources/translations/en_us.json | 13 +++ src/dialogue.cpp | 45 +++++--- src/dialogueBalloon.cpp | 9 -- .../childWindows/addDialogueOptionWindow.cpp | 70 ++++++++++++ .../childWindows/editDialogueOptionWindow.cpp | 87 +++++++++++++++ src/editor/fileViews/dialogueFileView.cpp | 104 ++++++++++++++++-- src/editor/project.cpp | 5 + src/editor/services/childWindowSubService.cpp | 6 + .../widgets/propertyFields/interPropField.cpp | 10 +- src/gamedata.cpp | 8 +- 14 files changed, 373 insertions(+), 42 deletions(-) create mode 100644 include/editor/childWindows/addDialogueOptionWindow.hpp create mode 100644 include/editor/childWindows/editDialogueOptionWindow.hpp create mode 100644 src/editor/childWindows/addDialogueOptionWindow.cpp create mode 100644 src/editor/childWindows/editDialogueOptionWindow.cpp diff --git a/include/editor/childWindows/addDialogueOptionWindow.hpp b/include/editor/childWindows/addDialogueOptionWindow.hpp new file mode 100644 index 00000000..4a40f45a --- /dev/null +++ b/include/editor/childWindows/addDialogueOptionWindow.hpp @@ -0,0 +1,16 @@ +#ifndef _RPGPP_CHILDWINDOWS_ADDDIALOGUEOPTIONWINDOW_H +#define _RPGPP_CHILDWINDOWS_ADDDIALOGUEOPTIONWINDOW_H + +#include "childWindows/popupWindow.hpp" +#include "dialogue.hpp" +#include "fileViews/dialogueFileView.hpp" + +class AddDialogueOptionWindow : public PopupWindow { +public: + Dialogue *dialogue; + int lineIndex; + DialogueFileView *fileView; + AddDialogueOptionWindow(); +}; + +#endif \ No newline at end of file diff --git a/include/editor/childWindows/editDialogueOptionWindow.hpp b/include/editor/childWindows/editDialogueOptionWindow.hpp new file mode 100644 index 00000000..0177867b --- /dev/null +++ b/include/editor/childWindows/editDialogueOptionWindow.hpp @@ -0,0 +1,24 @@ +#ifndef _RPGPP_CHILDWINDOWS_EDITDIALOGUEOPTIONWINDOW_H +#define _RPGPP_CHILDWINDOWS_EDITDIALOGUEOPTIONWINDOW_H + +#include "childWindows/popupWindow.hpp" +#include "dialogue.hpp" +#include "fileViews/dialogueFileView.hpp" +#include "widgets/propertyFields/fileField.hpp" +#include "widgets/propertyFields/textField.hpp" + +class EditDialogueOptionWindow : public PopupWindow { +public: + Dialogue *dialogue; + int lineIndex; + int optionIndex; + DialogueFileView *fileView; + + TextField::Ptr nameField; + FileField::Ptr dialogueField; + + EditDialogueOptionWindow(); + void setup(Dialogue *dialogue, int lineIndex, int optionIndex); +}; + +#endif \ No newline at end of file diff --git a/include/editor/fileViews/dialogueFileView.hpp b/include/editor/fileViews/dialogueFileView.hpp index b8268823..11db3adf 100644 --- a/include/editor/fileViews/dialogueFileView.hpp +++ b/include/editor/fileViews/dialogueFileView.hpp @@ -9,6 +9,7 @@ #include "TGUI/Widgets/GrowVerticalLayout.hpp" #include "TGUI/Widgets/Panel.hpp" #include "TGUI/Widgets/ScrollablePanel.hpp" +#include "dialogue.hpp" #include "dialogueBalloon.hpp" #include "fileViews/fileView.hpp" #include "widgets/dialogueEditor.hpp" @@ -17,6 +18,8 @@ class DialogueFileView : public FileView { const float DIALOGUE_PANEL_HEIGHT = 200.0f; private: + Dialogue *dialogue; + tgui::Button::Ptr newLineButton; tgui::ScrollablePanel::Ptr mainPanel; tgui::GrowVerticalLayout::Ptr vertLayout; @@ -24,12 +27,14 @@ class DialogueFileView : public FileView { tgui::Texture deleteTexture; std::vector linePanels; std::vector dialogueBoxes; + std::vector optionPanels; tgui::Panel::Ptr makeLinePanel(DialogueBin &data, DialogueLine line, size_t i); public: DialogueFileView(); void init(tgui::Group::Ptr layout, VariantWrapper *variant) override; + void initOptionPanel(int lineIndex); }; #endif diff --git a/resources/translations/bg.json b/resources/translations/bg.json index 4dbf9f54..18d7e1c5 100644 --- a/resources/translations/bg.json +++ b/resources/translations/bg.json @@ -166,6 +166,19 @@ "room_cannot_be_deleted": "Не може да изтриете стаята, зададена по подразбиране.", "player_actor_must_exist": "Трябва да имате playerActor файл.", "player_actor_cannot_be_deleted": "Не може да изтриете актьора на играча." + }, + "add_dialogue_option": { + "title": "Добавяне на опция", + "name": "Текст", + "dialogue": "Диалог", + "submit": "Добави" + }, + "edit_dialogue_option": { + "title": "Редактиране на опция", + "name": "Текст", + "dialogue": "Диалог", + "submit": "Потвърди", + "remove": "Премахни" } }, "widget": { diff --git a/resources/translations/en_us.json b/resources/translations/en_us.json index 23202d73..a416218b 100644 --- a/resources/translations/en_us.json +++ b/resources/translations/en_us.json @@ -193,6 +193,19 @@ "room_cannot_be_deleted": "You cannot delete the default Room.", "player_actor_must_exist": "You must have a playerActor file.", "player_actor_cannot_be_deleted": "You cannot delete the Player's Actor." + }, + "add_dialogue_option": { + "title": "Add a Dialogue Option", + "name": "Option Name", + "dialogue": "Dialogue", + "submit": "Add" + }, + "edit_dialogue_option": { + "title": "Edit a Dialogue Option", + "name": "Option Name", + "dialogue": "Dialogue", + "submit": "Submit", + "remove": "Remove" } }, "widget": { diff --git a/src/dialogue.cpp b/src/dialogue.cpp index 0d204824..579e73b9 100644 --- a/src/dialogue.cpp +++ b/src/dialogue.cpp @@ -2,6 +2,7 @@ #include #include +#include #include "dialogueBalloon.hpp" #include "dialogueParser.hpp" @@ -13,19 +14,22 @@ Dialogue::Dialogue(const std::string &filePath) { try { json jsonObj = json::parse(fileTxt); - std::vector> diagVector = jsonObj.at("diag"); + std::vector diagVector = jsonObj.at("diag"); for (auto lineVec : diagVector) { - if (lineVec.size() == 4) { - DialogueLine line; - line.characterName = lineVec.at(0); - line.text = lineVec.at(1); - line.hasPortrait = std::stoi(lineVec.at(2)); - line.imageId = lineVec.at(3); + DialogueLine line; + line.characterName = lineVec.value("characterName", "Character"); + line.text = lineVec.value("text", "No text available!"); + line.hasPortrait = lineVec.value("hasPortrait", false); + line.imageId = lineVec.value("imageId", ""); - line.sections = parseDialogueContent(line.text); + line.sections = parseDialogueContent(line.text); - result.lines.push_back(line); + line.hasOptions = lineVec.value("hasOptions", false); + for (auto &jOption : lineVec.at("options")) { + line.options.push_back({jOption.at("name"), jOption.at("nextDialogue")}); } + + result.lines.push_back(line); } dialogueBin = result; @@ -37,13 +41,24 @@ Dialogue::Dialogue(const std::string &filePath) { } nlohmann::json Dialogue::dumpJson() { - std::vector> diagVec; + std::vector diagVec; for (DialogueLine line : dialogueBin.lines) { - std::vector lineVec; - lineVec.push_back(line.characterName); - lineVec.push_back(line.text); - lineVec.push_back((line.hasPortrait ? "1" : "0")); - lineVec.push_back(line.imageId); + auto lineVec = nlohmann::json::object(); + lineVec.push_back({"characterName", line.characterName}); + lineVec.push_back({"text", line.text}); + lineVec.push_back({"hasPortrait", line.hasPortrait}); + lineVec.push_back({"imageId", line.imageId}); + lineVec.push_back({"hasOptions", line.hasOptions}); + + auto optionsVec = std::vector{}; + + for (auto &option : line.options) { + auto optionsObj = nlohmann::json::object(); + optionsObj["name"] = option.title; + optionsObj["nextDialogue"] = option.nextDialogue; + optionsVec.push_back(optionsObj); + } + lineVec.push_back({"options", optionsVec}); diagVec.push_back(lineVec); } diff --git a/src/dialogueBalloon.cpp b/src/dialogueBalloon.cpp index 5c7fe3fb..9bf470d2 100644 --- a/src/dialogueBalloon.cpp +++ b/src/dialogueBalloon.cpp @@ -232,15 +232,6 @@ void DialogueBalloon::showDialogue(const DialogueBin &newDialogue) { this->dialogue = newDialogue; - // test - DialogueLine testLine; - testLine.hasOptions = true; - testLine.text = ""; - testLine.sections.push_back({"", "Hello!"}); - testLine.options.push_back({"Option 1", "mydiag"}); - testLine.options.push_back({"Option 2", "diag"}); - dialogue.lines.push_back(testLine); - this->lineIndex = 0; firstCharTyped = false; diff --git a/src/editor/childWindows/addDialogueOptionWindow.cpp b/src/editor/childWindows/addDialogueOptionWindow.cpp new file mode 100644 index 00000000..d7505f0c --- /dev/null +++ b/src/editor/childWindows/addDialogueOptionWindow.cpp @@ -0,0 +1,70 @@ +#include "childWindows/addDialogueOptionWindow.hpp" + +#include + +#include "TGUI/Widgets/Button.hpp" +#include "TGUI/Widgets/Panel.hpp" +#include "bindTranslation.hpp" +#include "childWindows/popupWindow.hpp" +#include "widgets/propertyFields/fileField.hpp" +#include "widgets/propertyFields/textField.hpp" + +AddDialogueOptionWindow::AddDialogueOptionWindow() : PopupWindow("Add Dialogue Option..") { + bindTranslation(this->currentWindow, "dialog.add_dialogue_option.title", &tgui::ChildWindow::setTitle); + + dialogue = nullptr; + lineIndex = 0; + fileView = nullptr; + + currentWindow->setSize(280, 180); + + auto panel = tgui::Panel::create(); + panel->getRenderer()->setPadding({4, 4}); + + auto layout = tgui::GrowVerticalLayout::create(); + layout->getRenderer()->setSpaceBetweenWidgets(4); + panel->add(layout); + + auto nameField = TextField::create(); + nameField->setSize({"100%", 24}); + bindTranslation(nameField->label, "dialog.add_dialogue_option.name", &tgui::Label::setText); + layout->add(nameField); + + auto dialogueField = FileField::create(); + dialogueField->setSize({"100%", 24}); + bindTranslation(dialogueField->label, "dialog.add_dialogue_option.dialogue", &tgui::Label::setText); + dialogueField->pathFilters = {{"RPG++ Dialogue", {"*.rdiag"}}}; + layout->add(dialogueField); + + auto confirmButton = tgui::Button::create(); + bindTranslation(confirmButton, "dialog.add_dialogue_option.submit", &tgui::Button::setText); + confirmButton->setSize({"100%", 24}); + + std::weak_ptr weakName = nameField; + std::weak_ptr weakDialogue = dialogueField; + confirmButton->onClick([weakName, weakDialogue, this] { + if (weakName.expired() || weakDialogue.expired()) return; + + auto nameShared = weakName.lock(); + auto dialogueShared = weakDialogue.lock(); + + auto nameText = nameShared->value->getText().toStdString(); + + if (!nameText.empty() && !dialogueShared->value->getText().empty()) { + dialogue->getData().lines[lineIndex].hasOptions = true; + dialogue->getData().lines[lineIndex].options.push_back( + {nameText, dialogueShared->value->getText().toStdString()}); + + nameShared->value->setText(""); + dialogueShared->value->setText(""); + + fileView->initOptionPanel(lineIndex); + + close(); + } + }); + + layout->add(confirmButton); + + currentWindow->add(panel); +} diff --git a/src/editor/childWindows/editDialogueOptionWindow.cpp b/src/editor/childWindows/editDialogueOptionWindow.cpp new file mode 100644 index 00000000..f6d4415b --- /dev/null +++ b/src/editor/childWindows/editDialogueOptionWindow.cpp @@ -0,0 +1,87 @@ +#include "childWindows/editDialogueOptionWindow.hpp" + +#include "TGUI/Widgets/Button.hpp" +#include "bindTranslation.hpp" +#include "childWindows/popupWindow.hpp" + +EditDialogueOptionWindow::EditDialogueOptionWindow() : PopupWindow("Edit a Dialogue Option..") { + bindTranslation(this->currentWindow, "dialog.edit_dialogue_option.title", &tgui::ChildWindow::setTitle); + + dialogue = nullptr; + lineIndex = 0; + fileView = nullptr; + optionIndex = 0; + + currentWindow->setSize(280, 180); + + auto panel = tgui::Panel::create(); + panel->getRenderer()->setPadding({4, 4}); + + auto layout = tgui::GrowVerticalLayout::create(); + layout->getRenderer()->setSpaceBetweenWidgets(4); + panel->add(layout); + + nameField = TextField::create(); + nameField->setSize({"100%", 24}); + bindTranslation(nameField->label, "dialog.edit_dialogue_option.name", &tgui::Label::setText); + layout->add(nameField); + + dialogueField = FileField::create(); + dialogueField->setSize({"100%", 24}); + bindTranslation(dialogueField->label, "dialog.edit_dialogue_option.dialogue", &tgui::Label::setText); + dialogueField->pathFilters = {{"RPG++ Dialogue", {"*.rdiag"}}}; + layout->add(dialogueField); + + auto confirmButton = tgui::Button::create(); + bindTranslation(confirmButton, "dialog.edit_dialogue_option.submit", &tgui::Button::setText); + confirmButton->setSize({"100%", 24}); + + std::weak_ptr weakName = nameField; + std::weak_ptr weakDialogue = dialogueField; + confirmButton->onClick([weakName, weakDialogue, this] { + if (weakName.expired() || weakDialogue.expired()) return; + + auto nameShared = weakName.lock(); + auto dialogueShared = weakDialogue.lock(); + + auto nameText = nameShared->value->getText().toStdString(); + + auto &line = dialogue->getData().lines.at(lineIndex); + auto &option = line.options.at(optionIndex); + + option.title = nameText; + option.nextDialogue = dialogueShared->value->getText().toStdString(); + + fileView->initOptionPanel(lineIndex); + + close(); + }); + layout->add(confirmButton); + + auto removeButton = tgui::Button::create(); + bindTranslation(removeButton, "dialog.edit_dialogue_option.remove", &tgui::Button::setText); + removeButton->setSize({"100%", 24}); + removeButton->onClick([this] { + auto &line = dialogue->getData().lines.at(lineIndex); + line.options.erase(line.options.begin() + optionIndex); + + fileView->initOptionPanel(lineIndex); + + close(); + }); + layout->add(removeButton); + + currentWindow->add(panel); +} + +void EditDialogueOptionWindow::setup(Dialogue *dialogue, int lineIndex, int optionIndex) { + this->dialogue = dialogue; + this->lineIndex = lineIndex; + this->optionIndex = optionIndex; + + auto &line = dialogue->getData().lines.at(lineIndex); + auto &option = line.options.at(optionIndex); + + nameField->value->setText(option.title); + dialogueField->value->setText(option.nextDialogue); +} \ No newline at end of file diff --git a/src/editor/fileViews/dialogueFileView.cpp b/src/editor/fileViews/dialogueFileView.cpp index f506bce0..627d392a 100644 --- a/src/editor/fileViews/dialogueFileView.cpp +++ b/src/editor/fileViews/dialogueFileView.cpp @@ -16,12 +16,15 @@ #include "TGUI/Widgets/Button.hpp" #include "TGUI/Widgets/EditBox.hpp" #include "TGUI/Widgets/FileDialog.hpp" +#include "TGUI/Widgets/Group.hpp" #include "TGUI/Widgets/GrowHorizontalLayout.hpp" #include "TGUI/Widgets/GrowVerticalLayout.hpp" #include "TGUI/Widgets/Panel.hpp" #include "TGUI/Widgets/TextArea.hpp" #include "bindTranslation.hpp" +#include "childWindows/addDialogueOptionWindow.hpp" #include "childWindows/colorSelectWindow.hpp" +#include "childWindows/editDialogueOptionWindow.hpp" #include "dialogue.hpp" #include "editor.hpp" #include "raylib.h" @@ -29,8 +32,11 @@ #include "services/translationService.hpp" #include "variant.hpp" #include "widgets/dialogueEditor.hpp" +#include "widgets/propertyFields/interPropField.hpp" DialogueFileView::DialogueFileView() { + dialogue = nullptr; + TranslationService &ts = Editor::instance->getTranslations(); noImageTexture = tgui::Texture(Editor::instance->getFs().getResourcePath("no-image.png")); @@ -64,6 +70,10 @@ tgui::Panel::Ptr DialogueFileView::makeLinePanel(DialogueBin &data, DialogueLine auto panel = tgui::Panel::create({"100%", DIALOGUE_PANEL_HEIGHT}); panel->getRenderer()->setPadding({16, 16}); + /// left group + auto leftGroup = tgui::Group::create({"10%", "100%"}); + panel->add(leftGroup); + tgui::Layout2d portraitLayout = {"100% - 40", "100% - 40"}; auto portraitPic = tgui::Picture::create(); @@ -93,28 +103,34 @@ tgui::Panel::Ptr DialogueFileView::makeLinePanel(DialogueBin &data, DialogueLine Editor::instance->getGui().gui->add(fileDialog); } }); - panel->add(portraitPic); + leftGroup->add(portraitPic); - auto topControlsLayout = tgui::GrowHorizontalLayout::create(); - topControlsLayout->getRenderer()->setSpaceBetweenWidgets(5.0f); - topControlsLayout->setSize({"100% - 210 - 40", 32}); - topControlsLayout->setPosition(210, 0); + /// center group + auto centerGroup = tgui::Group::create({"80%", "100%"}); + centerGroup->setPosition({"10%", 0}); + panel->add(centerGroup); auto charNameEdit = tgui::EditBox::create(); + charNameEdit->setPosition({0, 0}); + charNameEdit->setSize({"25%", 36}); charNameEdit->setText(line.characterName); charNameEdit->onTextChange( [&data, i](const tgui::String &text) { data.lines.at(i).characterName = text.toStdString(); }); - topControlsLayout->add(charNameEdit); + centerGroup->add(charNameEdit); auto diagTextEdit = DialogueEditor::create(); - diagTextEdit->setPosition(210, 32 + 8); diagTextEdit->setMouseCursor(tgui::Cursor::Type::Text); - diagTextEdit->setSize({"100% - 210 - 40", "100% - 40"}); + diagTextEdit->setPosition({0, 40}); + diagTextEdit->setSize("50%", "100% - 40"); diagTextEdit->setText(line.text); diagTextEdit->onTextChange([&data, i](const tgui::String &text) { data.lines.at(i).text = text.toStdString(); }); dialogueBoxes.push_back(diagTextEdit); + centerGroup->add(diagTextEdit); + auto selectColorButton = tgui::Button::create(); + selectColorButton->setPosition({"25% + 4", 0}); + selectColorButton->setSize(220, 36); bindTranslation(selectColorButton, "screen.project.dialogueview.select_a_color", &tgui::Button::setText); @@ -132,14 +148,42 @@ tgui::Panel::Ptr DialogueFileView::makeLinePanel(DialogueBin &data, DialogueLine } }); - topControlsLayout->add(selectColorButton); + centerGroup->add(selectColorButton); + + auto addOptionButton = tgui::Button::create("Add Option"); + addOptionButton->setPosition("50% + 4", 0); + addOptionButton->setSize(220, 36); + addOptionButton->onClick([this, i] { + auto *popupPtr = Editor::instance->getGui().getChildWindowSubService()->getWindow("add_dialogue_option"); + auto *addDialogueOptionWindow = static_cast(popupPtr); + + addDialogueOptionWindow->dialogue = this->dialogue; + addDialogueOptionWindow->lineIndex = i; + addDialogueOptionWindow->fileView = this; + + addDialogueOptionWindow->open(); + }); + centerGroup->add(addOptionButton); + + auto optionsPanel = tgui::ScrollablePanel::create(); + optionsPanel->setPosition({"50% + 4", 32 + 8}); + optionsPanel->setSize("50% - 4", "100% - 40"); + + auto optionsLayout = tgui::GrowVerticalLayout::create(); + optionsPanel->add(optionsLayout); + + optionPanels.push_back(optionsLayout); + + initOptionPanel(i); + + centerGroup->add(optionsPanel); - panel->add(topControlsLayout); - panel->add(diagTextEdit); + /// auto hasImageCheck = tgui::CheckBox::create(); bindTranslation(hasImageCheck, "screen.project.dialogueview.has_a_portrait", &tgui::CheckBox::setText); + hasImageCheck->setPosition({0, 0}); hasImageCheck->setSize(32, 32); hasImageCheck->setChecked(line.hasPortrait); @@ -161,7 +205,7 @@ tgui::Panel::Ptr DialogueFileView::makeLinePanel(DialogueBin &data, DialogueLine } } }); - panel->add(hasImageCheck); + leftGroup->add(hasImageCheck); auto deleteButton = tgui::BitmapButton::create(); deleteButton->setSize({32, 32}); @@ -179,6 +223,40 @@ tgui::Panel::Ptr DialogueFileView::makeLinePanel(DialogueBin &data, DialogueLine return panel; } +void DialogueFileView::initOptionPanel(int lineIndex) { + auto &line = dialogue->getData().lines[lineIndex]; + auto &panel = optionPanels.at(lineIndex); + panel->removeAllWidgets(); + + if (line.hasOptions) { + int i = 0; + for (auto &option : line.options) { + auto optionItem = InterPropField::create(); + optionItem->setSize({"100%", 32}); + optionItem->label->setText(option.title); + optionItem->value->setText(option.nextDialogue); + + optionItem->value->onClick([this, lineIndex, i] { + auto *popupPtr = + Editor::instance->getGui().getChildWindowSubService()->getWindow("edit_dialogue_option"); + auto *editDialogueOptionWindow = static_cast(popupPtr); + + editDialogueOptionWindow->setup(dialogue, lineIndex, i); + editDialogueOptionWindow->fileView = this; + editDialogueOptionWindow->open(); + }); + + optionItem->remove->onClick([this, i, lineIndex, &line] { + line.options.erase(line.options.begin() + i); + initOptionPanel(lineIndex); + }); + + panel->add(optionItem); + i++; + } + } +} + void DialogueFileView::init(tgui::Group::Ptr layout, VariantWrapper *variant) { this->variant = variant; @@ -186,6 +264,8 @@ void DialogueFileView::init(tgui::Group::Ptr layout, VariantWrapper *variant) { const auto ptr = dynamic_cast *>(variant); const auto dialogue = ptr->get(); + this->dialogue = dialogue; + auto &data = dialogue->getData(); newLineButton->onClick([this, &dialogue, &data] { diff --git a/src/editor/project.cpp b/src/editor/project.cpp index 49435bf0..d02c030a 100644 --- a/src/editor/project.cpp +++ b/src/editor/project.cpp @@ -376,6 +376,11 @@ GameData Project::generateStruct() { DialogueBin diag = dialogue.getData(); diag.title = GetFileNameWithoutExt(diagPath.c_str()); + for (auto &line : diag.lines) { + for (auto &option : line.options) { + option.nextDialogue = GetFileNameWithoutExt(option.nextDialogue.c_str()); + } + } data.dialogues[GetFileNameWithoutExt(diagPath.c_str())] = diag; } diff --git a/src/editor/services/childWindowSubService.cpp b/src/editor/services/childWindowSubService.cpp index c39909c4..b8cb07e0 100644 --- a/src/editor/services/childWindowSubService.cpp +++ b/src/editor/services/childWindowSubService.cpp @@ -3,7 +3,9 @@ #include #include "childWindows/aboutWindow.hpp" +#include "childWindows/addDialogueOptionWindow.hpp" #include "childWindows/colorSelectWindow.hpp" +#include "childWindows/editDialogueOptionWindow.hpp" #include "childWindows/editPropWindow.hpp" #include "childWindows/newPropWindow.hpp" #include "childWindows/popupWindow.hpp" @@ -26,6 +28,10 @@ void ChildWindowSubService::createWindows() { this->childWindows.try_emplace("edit_prop", std::make_unique()); this->childWindows.try_emplace("select_a_color", std::make_unique()); + + this->childWindows.try_emplace("add_dialogue_option", std::make_unique()); + + this->childWindows.try_emplace("edit_dialogue_option", std::make_unique()); } void ChildWindowSubService::openWindow(const std::string &windowName) { diff --git a/src/editor/widgets/propertyFields/interPropField.cpp b/src/editor/widgets/propertyFields/interPropField.cpp index 701cf076..b9cccebb 100644 --- a/src/editor/widgets/propertyFields/interPropField.cpp +++ b/src/editor/widgets/propertyFields/interPropField.cpp @@ -45,9 +45,9 @@ void InterPropField::setSize(const tgui::Layout2d &size) { void InterPropField::updateSize() { label->setPosition({PADDING, 0}); - label->setSize({getSize().x * 0.3f - PADDING, getSize().y}); - value->setPosition({getSize().x * 0.3f, 0}); - value->setSize({getSize().x * 0.3f, getSize().y}); - remove->setPosition({getSize().x * 0.6f, getSize().y}); - remove->setSize({getSize().x * 0.3f, getSize().y}); + label->setSize({getSize().x * 0.33f - PADDING, getSize().y}); + value->setPosition({getSize().x * 0.33f, 0}); + value->setSize({getSize().x * 0.33f, getSize().y}); + remove->setPosition({getSize().x * 0.67f, 0}); + remove->setSize({getSize().x * 0.33f - PADDING, getSize().y}); } \ No newline at end of file diff --git a/src/gamedata.cpp b/src/gamedata.cpp index de87b687..035f73c5 100644 --- a/src/gamedata.cpp +++ b/src/gamedata.cpp @@ -7,6 +7,7 @@ #include #include +#include "dialogueBalloon.hpp" #include "interactable.hpp" #include "raylib.h" @@ -91,9 +92,14 @@ void serialize(Archive &a, DialogueTextSection &b) { a(b.key, b.text, b.textColor, b.textSize, b.font, b.delay); } +template +void serialize(Archive &a, DialogueOption &b) { + a(b.title, b.nextDialogue); +} + template void serialize(Archive &a, DialogueLine &b) { - a(b.text, b.sections, b.imageId, b.hasPortrait, b.characterName); + a(b.text, b.sections, b.imageId, b.hasPortrait, b.characterName, b.hasOptions, b.options); } template From 47102fed7ca0e6d65211ada2920206ef3da7e0b8 Mon Sep 17 00:00:00 2001 From: "D. Quan" <60545346+sudoker0@users.noreply.github.com> Date: Sun, 19 Apr 2026 22:41:52 +0700 Subject: [PATCH 47/69] Update translation for Vietnamese --- resources/translations/vn.json | 43 +++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/resources/translations/vn.json b/resources/translations/vn.json index a7294030..38686292 100644 --- a/resources/translations/vn.json +++ b/resources/translations/vn.json @@ -63,7 +63,34 @@ }, "dialogueview": { "add_new_line": "Tạo hội thoại mới", - "has_a_portrait": "Hiển thị ảnh hội thoại?" + "has_a_portrait": "Hiển thị ảnh hội thoại?", + "select_a_color": "Chọn màu", + "color": { + "lightgray": "Xám nhạt", + "gold": "Vàng", + "pink": "Hồng", + "green": "Xanh lá", + "skyblue": "Xanh da trời đậm", + "purple": "Đỏ tía", + "beige": "Be", + "magenta": "Hồng sẫm", + "gray": "Xám", + "yellow": "Vàng", + "red": "Đỏ", + "lime": "Vàng chanh", + "blue": "Xanh", + "violet": "Tím", + "brown": "Nâu", + "white": "Trắng", + "darkgray": "Xám đậm", + "orange": "Cam", + "maroon": "Nâu sẫm", + "darkgreen": "Xanh lá đậm", + "darkblue": "Xanh đậm", + "darkpurple": "Tía đậm", + "darkbrown": "Nâu đậm", + "black": "Đen" + } }, "tilesetview": { "tile_width": "Độ rộng Tile", @@ -174,7 +201,21 @@ "room_cannot_be_deleted": "Lỗi: Bạn không thể xóa phòng mặc định.", "player_actor_must_exist": "Lỗi: Bạn phải có tệp tin playerActor.", "player_actor_cannot_be_deleted": "Lỗi: Bạn không thể xóa Actor người chơi." + }, + "add_dialogue_option": { + "title": "Tạo tùy chọn hội thoại", + "name": "Tên tùy chọn", + "dialogue": "Hội thoại", + "submit": "Tạo" + }, + "edit_dialogue_option": { + "title": "Chỉnh sửa tùy chọn hội thoại", + "name": "Tên tùy chọn", + "dialogue": "Hội thoại", + "submit": "Sửa", + "remove": "Xóa" } + }, "widget": { From ee401af9acb0ca0f6562d77cd02cba0b409c1ed2 Mon Sep 17 00:00:00 2001 From: thefirey33 Date: Sun, 19 Apr 2026 18:31:35 +0300 Subject: [PATCH 48/69] Update Turkish Translation. --- resources/translations/tr.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/resources/translations/tr.json b/resources/translations/tr.json index f76f1079..8ed32d77 100644 --- a/resources/translations/tr.json +++ b/resources/translations/tr.json @@ -193,6 +193,19 @@ "type": "Tür", "submit": "Kabul Et", "remove": "Sil" + }, + "add_dialogue_option": { + "title": "Bir diyalog seçeneği ekleyin", + "name": "Seçenek İsmi", + "dialogue": "Diyalog", + "submit": "Ekle" + }, + "edit_dialogue_option": { + "title": "Diyalog Seçeneğini Düzenleyin", + "name": "Seçenek İsmi", + "dialogue": "Diyalog", + "submit": "Kabul Et", + "remove": "Sil" } }, "widget": { From 61c7182f7fa4f6ced351cc4bd425e885f599b4e0 Mon Sep 17 00:00:00 2001 From: thefirey33 Date: Sun, 19 Apr 2026 18:46:07 +0300 Subject: [PATCH 49/69] Update Translation and slight tweaks. --- resources/translations/tr.json | 2 +- src/editor/fileViews/dialogueFileView.cpp | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/resources/translations/tr.json b/resources/translations/tr.json index 8ed32d77..0d86e076 100644 --- a/resources/translations/tr.json +++ b/resources/translations/tr.json @@ -60,7 +60,7 @@ }, "dialogueview": { "add_new_line": "Yeni satır ekle", - "has_a_portrait": "Portresi olacak mı?", + "has_a_portrait": "Portresi Varmı?", "select_a_color": "Renk seçiniz...", "color": { "lightgray": "Açık Grey", diff --git a/src/editor/fileViews/dialogueFileView.cpp b/src/editor/fileViews/dialogueFileView.cpp index 627d392a..e09d6d4a 100644 --- a/src/editor/fileViews/dialogueFileView.cpp +++ b/src/editor/fileViews/dialogueFileView.cpp @@ -17,7 +17,6 @@ #include "TGUI/Widgets/EditBox.hpp" #include "TGUI/Widgets/FileDialog.hpp" #include "TGUI/Widgets/Group.hpp" -#include "TGUI/Widgets/GrowHorizontalLayout.hpp" #include "TGUI/Widgets/GrowVerticalLayout.hpp" #include "TGUI/Widgets/Panel.hpp" #include "TGUI/Widgets/TextArea.hpp" @@ -130,7 +129,7 @@ tgui::Panel::Ptr DialogueFileView::makeLinePanel(DialogueBin &data, DialogueLine auto selectColorButton = tgui::Button::create(); selectColorButton->setPosition({"25% + 4", 0}); - selectColorButton->setSize(220, 36); + selectColorButton->setSize("20%", 36); bindTranslation(selectColorButton, "screen.project.dialogueview.select_a_color", &tgui::Button::setText); @@ -178,8 +177,6 @@ tgui::Panel::Ptr DialogueFileView::makeLinePanel(DialogueBin &data, DialogueLine centerGroup->add(optionsPanel); - /// - auto hasImageCheck = tgui::CheckBox::create(); bindTranslation(hasImageCheck, "screen.project.dialogueview.has_a_portrait", &tgui::CheckBox::setText); From 644bbf85a83b87022b48c1b857d7a915b5caecb6 Mon Sep 17 00:00:00 2001 From: thefirey33 Date: Sun, 19 Apr 2026 23:40:37 +0300 Subject: [PATCH 50/69] Allow text size changing, Add addXmlWithProperties that allows adding XML tags with multiple properties to the formatting. --- include/editor/widgets/dialogueEditor.hpp | 21 +- resources/translations/en_us.json | 3 +- resources/translations/tr.json | 455 +++++++++--------- src/editor/childWindows/colorSelectWindow.cpp | 4 +- src/editor/fileViews/actorFileView.cpp | 1 - src/editor/fileViews/dialogueFileView.cpp | 42 +- src/editor/widgets/dialogueEditor.cpp | 53 +- 7 files changed, 331 insertions(+), 248 deletions(-) diff --git a/include/editor/widgets/dialogueEditor.hpp b/include/editor/widgets/dialogueEditor.hpp index 77e0c87a..01cd9c54 100644 --- a/include/editor/widgets/dialogueEditor.hpp +++ b/include/editor/widgets/dialogueEditor.hpp @@ -4,9 +4,16 @@ #include #include #include +#include #include "TGUI/String.hpp" #include "TGUI/Widgets/TextArea.hpp" + +struct XMLTagProperties { + std::string propertyName; + std::string propertyValue; +}; + class DialogueEditor : public tgui::TextArea { private: std::size_t formattingSelectionStart; @@ -19,8 +26,20 @@ class DialogueEditor : public tgui::TextArea { static DialogueEditor::Ptr create(); + /** + * Add the specified XML tag to the user's selected text. + * @param tagName The name of the XML tag to add. + */ void addXmlTag(std::string tagName); - bool isTextNonEditable(); + + /** + * Add the specified XML tag with properties to the user's selected text. + * @param tagName The name of the XML tag to add. + * @param properties The properties to add to the XML tag. + */ + void addXmlTagWithProperties(std::string tagName, std::vector properties); + void setTextAndReset(std::string text); + bool isTextNonEditable(std::string& tagName); }; #endif /* _RPGPP_DIALOGUEEDITOR_HPP */ diff --git a/resources/translations/en_us.json b/resources/translations/en_us.json index a416218b..70abb403 100644 --- a/resources/translations/en_us.json +++ b/resources/translations/en_us.json @@ -62,6 +62,7 @@ "add_new_line": "Add a new line", "has_a_portrait": "Has a portrait?", "select_a_color": "Select a color...", + "select_a_text_size": "Text Size...", "color": { "lightgray": "Light Gray", "gold": "Gold", @@ -225,4 +226,4 @@ "copy_full_path": "Copy full path", "delete": "Delete" } -} \ No newline at end of file +} diff --git a/resources/translations/tr.json b/resources/translations/tr.json index 0d86e076..0ccaf0d3 100644 --- a/resources/translations/tr.json +++ b/resources/translations/tr.json @@ -1,228 +1,229 @@ { - "language": "Türkçe", - "menu": { - "file": { - "_label": "Dosya", - "new_project": "Yeni Proje", - "open_project": "Proje Aç", - "save_file": "Dosyayı Kaydet" - }, - "edit": { - "_label": "Düzenle", - "undo": "Geri Al", - "redo": "Yinele" - }, - "options": { - "_label": "Seçenekler", - "editor": "Düzenleyici Seçenekleri..." - }, - "about": { - "_label": "Bilgi", - "rpgpp": "RPG++ Hakkında...", - "rpgpp_description": "C++'da yazılmış, RPG oyun motoru." - } - }, - "screen": { - "starting": { - "get_started": "Başla!", - "description": "'Yeni Proje'ye tıklayarak yeni proje oluşturun, ya da 'Proje Aç' ile birini açın!", - "actions": "Eylemler", - "recent_projects": "Son Projeler" - }, - "options": { - "general": { - "_label": "Genel", - "language": "Dil", - "theme": "Tema", - "theme_notice": "Tema değiştirdikten sonra etkili olması için düzenleyiciyi yeniden başlatın.\nKaydedilmiş değişiklikler silinecektir!" - }, - "hotkeys": { - "_label": "Kısayollar", - "close_tab": "Sekmeyi Kapat", - "new_project": "Yeni Proje", - "open_project": "Proje Aç", - "undo": "Geri Al", - "redo": "Yinele", - "save_file": "Dosyayı Kaydet", - "toggle_debug": "Hata Ayıklamayı Aç/Kapat", - "room_tool.edit": "Harita Araçları/Düzenle", - "room_tool.eraser": "Harita Araçları/Sil", - "room_tool.mouse": "Harita Araçları/Fare", - "room_tool.pen": "Harita Araçları/Kalem", - "room_tool.set_spoint": "Harita Araçları/Başlangıç Noktasını Seç", - "room_tool.toggle_bm": "Harita Araçları/Fırça Modunu Aç/Kapat" - } - }, - "project": { - "create_new_resource": "Yeni Kaynak", - "emptyview": { - "notice": "Hiç bir dosya ya da görünüş tanımlanmamıştır!" - }, - "dialogueview": { - "add_new_line": "Yeni satır ekle", - "has_a_portrait": "Portresi Varmı?", - "select_a_color": "Renk seçiniz...", - "color": { - "lightgray": "Açık Grey", - "gold": "Altın", - "pink": "Pembe", - "green": "Yeşil", - "skyblue": "Gökyüzü Mavisi", - "purple": "Mor", - "beige": "Bej", - "magenta": "Macenta", - "gray": "Grey", - "yellow": "Sarı", - "red": "Kırmızı", - "lime": "Misket", - "blue": "Mavi", - "violet": "Menekşe", - "brown": "Kahverengi", - "white": "Beyaz", - "darkgray": "Koyu Gri", - "orange": "Turuncu", - "maroon": "Bordo", - "darkgreen": "Koyu Yeşil", - "darkblue": "Koyu Mavi", - "darkpurple": "Koyu Mor", - "darkbrown": "Koyu Kahverengi", - "black": "Siyah" - } - }, - "tilesetview": { - "tile_width": "Kare Genişliği", - "tile_height": "Kare Yüksekliği", - "texture": "Doku" - }, - "roomview": { - "mapwidth": "Harita Genişliği", - "mapheight": "Harita Yüksekliği", - "tileset_file": "Kare Seti Dosyası", - "enable_brush": "Fırça Modunu Aktifleştir", - "bg_music_file": "Arkaplan Müziği" - }, - "propview": { - "atlas": "Atlas Büyüklüğü", - "collision": "Çarpışma Karesi Büyüklüğü", - "has_interactable": "Interaktifi Varmı?", - "image": "Obje Fotoğrafı", - "interactable_type": "Interaktif Türü" - }, - "actorview": { - "dir0": "Aşağı (Boşta)", - "dir1": "Aşağı", - "dir2": "Yukarı (Boşta)", - "dir3": "Yukarı", - "dir4": "Sol (Boşta)", - "dir5": "Sol", - "dir6": "Sağ (Boşta)", - "dir7": "Sağ", - "play": "Oynat", - "pause": "Duraklat", - "is_non_idle": "Boşta Olmayan Animasyon Mu?", - "delete": "Kare Sil", - "edit_anim_data": "Animasyon Verisini Düzenle" - }, - "interactableview": { - "display_name": "Görünüş Adı", - "script": "Betik", - "on_touch": "Dokunulduğunda?" - }, - "toolbar": { - "play": "Oyna", - "build": "Derle" - } - } - }, - "dialog": { - "new_file": { - "title": "Yeni Kaynak", - "name": "Dosya Adı", - "file": "Dosya", - "confirm": "Kabul Et", - "cancel": "İptal" - }, - "new_project": { - "title": "Yeni Proje", - "name": "Proje Adı", - "folder": "Klasör", - "confirm": "Kabul Et", - "cancel": "İptal" - }, - "project_settings": { - "_label": "Proje Ayarları", - "title": "Başlık", - "save": "Kaydet", - "program": { - "_label": "Uygulama", - "title": "Başlık", - "version": "Versiyon", - "program_icon": "Uygulama Simgesi", - "window_width": "Pencere Genişliği", - "window_height": "Pencere Uzunluğu", - "is_resizable": "Pencerenin Boyutu Değiştirilebilir mi?", - "window_mode": "Pencere Modu", - "target_fps": "Hedef FPS" - }, - "game": { - "_label": "Oyun", - "default_room": "Öntanımlı Oda", - "player_actor": "Oyuncunun Aktörü", - "tile_size": "Kare Boyutu", - "debug_draw": "Hata Ayıklamayı Çiz" - } - }, - "delete_file": { - "title": "Gerçekten Sil?", - "yes": "Evet", - "no": "Hayır", - "ok": "Tamam", - "room_must_exist": "En az bir odanız olması lazımdır.", - "room_cannot_be_deleted": "Öntanımlı odayı silemezsiniz.", - "player_actor_must_exist": "playerActor dosyanızın olması lazımdır.", - "player_actor_cannot_be_deleted": "Oyuncunun Aktörünü silemezsiniz." - }, - "new_prop": { - "title": "Yeni Obje", - "name": "Adı", - "type": "Tür", - "submit": "Oluştur" - }, - "edit_prop": { - "title": "Objeyi Düzenle", - "type": "Tür", - "submit": "Kabul Et", - "remove": "Sil" - }, - "add_dialogue_option": { - "title": "Bir diyalog seçeneği ekleyin", - "name": "Seçenek İsmi", - "dialogue": "Diyalog", - "submit": "Ekle" - }, - "edit_dialogue_option": { - "title": "Diyalog Seçeneğini Düzenleyin", - "name": "Seçenek İsmi", - "dialogue": "Diyalog", - "submit": "Kabul Et", - "remove": "Sil" - } - }, - "widget": { - "filechooser": { - "select_a_file": "Dosya Seç" - }, - "hotkey_modifier": { - "listening": "Bir tuşa basın..." - } - }, - "button": { - "go_back": "Geri Git", - "restart": "Yeniden Başlat", - "restart_later": "Sonra Yeniden Başlat" - }, - "context_menu": { - "copy_full_path": "Full yolunu kopyala", - "delete": "Sil" - } -} \ No newline at end of file + "language": "Türkçe", + "menu": { + "file": { + "_label": "Dosya", + "new_project": "Yeni Proje", + "open_project": "Proje Aç", + "save_file": "Dosyayı Kaydet" + }, + "edit": { + "_label": "Düzenle", + "undo": "Geri Al", + "redo": "Yinele" + }, + "options": { + "_label": "Seçenekler", + "editor": "Düzenleyici Seçenekleri..." + }, + "about": { + "_label": "Bilgi", + "rpgpp": "RPG++ Hakkında...", + "rpgpp_description": "C++'da yazılmış, RPG oyun motoru." + } + }, + "screen": { + "starting": { + "get_started": "Başla!", + "description": "'Yeni Proje'ye tıklayarak yeni proje oluşturun, ya da 'Proje Aç' ile birini açın!", + "actions": "Eylemler", + "recent_projects": "Son Projeler" + }, + "options": { + "general": { + "_label": "Genel", + "language": "Dil", + "theme": "Tema", + "theme_notice": "Tema değiştirdikten sonra etkili olması için düzenleyiciyi yeniden başlatın.\nKaydedilmiş değişiklikler silinecektir!" + }, + "hotkeys": { + "_label": "Kısayollar", + "close_tab": "Sekmeyi Kapat", + "new_project": "Yeni Proje", + "open_project": "Proje Aç", + "undo": "Geri Al", + "redo": "Yinele", + "save_file": "Dosyayı Kaydet", + "toggle_debug": "Hata Ayıklamayı Aç/Kapat", + "room_tool.edit": "Harita Araçları/Düzenle", + "room_tool.eraser": "Harita Araçları/Sil", + "room_tool.mouse": "Harita Araçları/Fare", + "room_tool.pen": "Harita Araçları/Kalem", + "room_tool.set_spoint": "Harita Araçları/Başlangıç Noktasını Seç", + "room_tool.toggle_bm": "Harita Araçları/Fırça Modunu Aç/Kapat" + } + }, + "project": { + "create_new_resource": "Yeni Kaynak", + "emptyview": { + "notice": "Hiç bir dosya ya da görünüş tanımlanmamıştır!" + }, + "dialogueview": { + "add_new_line": "Yeni satır ekle", + "has_a_portrait": "Portresi Varmı?", + "select_a_color": "Renk seçiniz...", + "select_a_text_size": "Yazı Boyutu...", + "color": { + "lightgray": "Açık Grey", + "gold": "Altın", + "pink": "Pembe", + "green": "Yeşil", + "skyblue": "Gökyüzü Mavisi", + "purple": "Mor", + "beige": "Bej", + "magenta": "Macenta", + "gray": "Grey", + "yellow": "Sarı", + "red": "Kırmızı", + "lime": "Misket", + "blue": "Mavi", + "violet": "Menekşe", + "brown": "Kahverengi", + "white": "Beyaz", + "darkgray": "Koyu Gri", + "orange": "Turuncu", + "maroon": "Bordo", + "darkgreen": "Koyu Yeşil", + "darkblue": "Koyu Mavi", + "darkpurple": "Koyu Mor", + "darkbrown": "Koyu Kahverengi", + "black": "Siyah" + } + }, + "tilesetview": { + "tile_width": "Kare Genişliği", + "tile_height": "Kare Yüksekliği", + "texture": "Doku" + }, + "roomview": { + "mapwidth": "Harita Genişliği", + "mapheight": "Harita Yüksekliği", + "tileset_file": "Kare Seti Dosyası", + "enable_brush": "Fırça Modunu Aktifleştir", + "bg_music_file": "Arkaplan Müziği" + }, + "propview": { + "atlas": "Atlas Büyüklüğü", + "collision": "Çarpışma Karesi Büyüklüğü", + "has_interactable": "Interaktifi Varmı?", + "image": "Obje Fotoğrafı", + "interactable_type": "Interaktif Türü" + }, + "actorview": { + "dir0": "Aşağı (Boşta)", + "dir1": "Aşağı", + "dir2": "Yukarı (Boşta)", + "dir3": "Yukarı", + "dir4": "Sol (Boşta)", + "dir5": "Sol", + "dir6": "Sağ (Boşta)", + "dir7": "Sağ", + "play": "Oynat", + "pause": "Duraklat", + "is_non_idle": "Boşta Olmayan Animasyon Mu?", + "delete": "Kare Sil", + "edit_anim_data": "Animasyon Verisini Düzenle" + }, + "interactableview": { + "display_name": "Görünüş Adı", + "script": "Betik", + "on_touch": "Dokunulduğunda?" + }, + "toolbar": { + "play": "Oyna", + "build": "Derle" + } + } + }, + "dialog": { + "new_file": { + "title": "Yeni Kaynak", + "name": "Dosya Adı", + "file": "Dosya", + "confirm": "Kabul Et", + "cancel": "İptal" + }, + "new_project": { + "title": "Yeni Proje", + "name": "Proje Adı", + "folder": "Klasör", + "confirm": "Kabul Et", + "cancel": "İptal" + }, + "project_settings": { + "_label": "Proje Ayarları", + "title": "Başlık", + "save": "Kaydet", + "program": { + "_label": "Uygulama", + "title": "Başlık", + "version": "Versiyon", + "program_icon": "Uygulama Simgesi", + "window_width": "Pencere Genişliği", + "window_height": "Pencere Uzunluğu", + "is_resizable": "Pencerenin Boyutu Değiştirilebilir mi?", + "window_mode": "Pencere Modu", + "target_fps": "Hedef FPS" + }, + "game": { + "_label": "Oyun", + "default_room": "Öntanımlı Oda", + "player_actor": "Oyuncunun Aktörü", + "tile_size": "Kare Boyutu", + "debug_draw": "Hata Ayıklamayı Çiz" + } + }, + "delete_file": { + "title": "Gerçekten Sil?", + "yes": "Evet", + "no": "Hayır", + "ok": "Tamam", + "room_must_exist": "En az bir odanız olması lazımdır.", + "room_cannot_be_deleted": "Öntanımlı odayı silemezsiniz.", + "player_actor_must_exist": "playerActor dosyanızın olması lazımdır.", + "player_actor_cannot_be_deleted": "Oyuncunun Aktörünü silemezsiniz." + }, + "new_prop": { + "title": "Yeni Obje", + "name": "Adı", + "type": "Tür", + "submit": "Oluştur" + }, + "edit_prop": { + "title": "Objeyi Düzenle", + "type": "Tür", + "submit": "Kabul Et", + "remove": "Sil" + }, + "add_dialogue_option": { + "title": "Bir diyalog seçeneği ekleyin", + "name": "Seçenek İsmi", + "dialogue": "Diyalog", + "submit": "Ekle" + }, + "edit_dialogue_option": { + "title": "Diyalog Seçeneğini Düzenleyin", + "name": "Seçenek İsmi", + "dialogue": "Diyalog", + "submit": "Kabul Et", + "remove": "Sil" + } + }, + "widget": { + "filechooser": { + "select_a_file": "Dosya Seç" + }, + "hotkey_modifier": { + "listening": "Bir tuşa basın..." + } + }, + "button": { + "go_back": "Geri Git", + "restart": "Yeniden Başlat", + "restart_later": "Sonra Yeniden Başlat" + }, + "context_menu": { + "copy_full_path": "Full yolunu kopyala", + "delete": "Sil" + } +} diff --git a/src/editor/childWindows/colorSelectWindow.cpp b/src/editor/childWindows/colorSelectWindow.cpp index c54f9b47..22333009 100644 --- a/src/editor/childWindows/colorSelectWindow.cpp +++ b/src/editor/childWindows/colorSelectWindow.cpp @@ -37,7 +37,7 @@ ColorSelectWindow::ColorSelectWindow() : PopupWindow("Select a Color") { bindTranslation(colorButton, TextFormat("screen.project.dialogueview.color.%s", type.c_str()), &tgui::Button::setText); - colorButton->setSize({"100%", 20}); + colorButton->setSize({"100%", 30}); Color color = colors[types[i]]; tgui::Color btnBackColor = {color.r, color.g, color.b, color.a}; @@ -68,4 +68,4 @@ ColorSelectWindow::ColorSelectWindow() : PopupWindow("Select a Color") { void ColorSelectWindow::open(std::shared_ptr editor) { PopupWindow::open(); this->editor = editor; -} \ No newline at end of file +} diff --git a/src/editor/fileViews/actorFileView.cpp b/src/editor/fileViews/actorFileView.cpp index 591aef44..7218d4ab 100644 --- a/src/editor/fileViews/actorFileView.cpp +++ b/src/editor/fileViews/actorFileView.cpp @@ -8,7 +8,6 @@ #include "raylib.h" #include "services/translationService.hpp" #include "views/actorView.hpp" -#include "views/propPreview.hpp" #include "widgets/frameEditor.hpp" #include "widgets/propertiesBox.hpp" #include "widgets/propertyFields/fileField.hpp" diff --git a/src/editor/fileViews/dialogueFileView.cpp b/src/editor/fileViews/dialogueFileView.cpp index e09d6d4a..18ef9839 100644 --- a/src/editor/fileViews/dialogueFileView.cpp +++ b/src/editor/fileViews/dialogueFileView.cpp @@ -14,6 +14,7 @@ #include "TGUI/String.hpp" #include "TGUI/Texture.hpp" #include "TGUI/Widgets/Button.hpp" +#include "TGUI/Widgets/ComboBox.hpp" #include "TGUI/Widgets/EditBox.hpp" #include "TGUI/Widgets/FileDialog.hpp" #include "TGUI/Widgets/Group.hpp" @@ -64,6 +65,9 @@ DialogueFileView::DialogueFileView() { widgetContainer.push_back(mainPanel); } +constexpr int MAXIMUM_TEXT_SIZE = 32; +constexpr int MINIMUM_TEXT_SIZE = 16; + tgui::Panel::Ptr DialogueFileView::makeLinePanel(DialogueBin &data, DialogueLine line, size_t i) { TranslationService &ts = Editor::instance->getTranslations(); auto panel = tgui::Panel::create({"100%", DIALOGUE_PANEL_HEIGHT}); @@ -111,7 +115,7 @@ tgui::Panel::Ptr DialogueFileView::makeLinePanel(DialogueBin &data, DialogueLine auto charNameEdit = tgui::EditBox::create(); charNameEdit->setPosition({0, 0}); - charNameEdit->setSize({"25%", 36}); + charNameEdit->setSize({"10%", 36}); charNameEdit->setText(line.characterName); charNameEdit->onTextChange( [&data, i](const tgui::String &text) { data.lines.at(i).characterName = text.toStdString(); }); @@ -128,18 +132,42 @@ tgui::Panel::Ptr DialogueFileView::makeLinePanel(DialogueBin &data, DialogueLine centerGroup->add(diagTextEdit); auto selectColorButton = tgui::Button::create(); - selectColorButton->setPosition({"25% + 4", 0}); - selectColorButton->setSize("20%", 36); + selectColorButton->setPosition({"10% + 4", 0}); + selectColorButton->setSize("10%", 36); bindTranslation(selectColorButton, "screen.project.dialogueview.select_a_color", &tgui::Button::setText); + + auto textSizeComboBox = tgui::ComboBox::create(); + textSizeComboBox->setPosition({"20% + 8", 0}); + textSizeComboBox->setSize("10%", 36); + + // For convenience, this code calculates the wanted text sizes automatically. + int textAddition = MAXIMUM_TEXT_SIZE / (MAXIMUM_TEXT_SIZE - MINIMUM_TEXT_SIZE); + for (int i = MINIMUM_TEXT_SIZE; i <= MAXIMUM_TEXT_SIZE; i += textAddition) { + textSizeComboBox->addItem(std::to_string(i)); + } + + bindTranslation(textSizeComboBox, "screen.project.dialogueview.select_a_text_size", &tgui::ComboBox::setDefaultText); + std::weak_ptr weakEditor = diagTextEdit; + std::weak_ptr weakBox = textSizeComboBox; + textSizeComboBox->onItemSelect.connect([weakEditor, weakBox](const tgui::String& selectedIndex){ + if (weakEditor.expired() || weakBox.expired()) { + return; + } + + auto editor = weakEditor.lock(); + auto box = weakBox.lock(); + + editor->addXmlTagWithProperties("textSize", {{ "size", selectedIndex.toStdString() }}); + box->deselectItem(); + }); + + + centerGroup->add(textSizeComboBox); selectColorButton->onPress.connect([weakEditor] { if (auto capture = weakEditor.lock()) { - if (capture->isTextNonEditable()) { - return; - } - auto selectColorWindow = reinterpret_cast( Editor::instance->getGui().getChildWindowSubService()->getWindow("select_a_color")); diff --git a/src/editor/widgets/dialogueEditor.cpp b/src/editor/widgets/dialogueEditor.cpp index f68449b1..a39cc88d 100644 --- a/src/editor/widgets/dialogueEditor.cpp +++ b/src/editor/widgets/dialogueEditor.cpp @@ -3,6 +3,9 @@ #include #include #include +#include + +constexpr const char* spaceLiteral{" "}; #include "TGUI/String.hpp" @@ -18,16 +21,21 @@ DialogueEditor::DialogueEditor() { }); } -bool DialogueEditor::isTextNonEditable() { - return this->selectedText.contains("<") || this->selectedText.contains(">") || this->selectedText.empty(); +bool DialogueEditor::isTextNonEditable(std::string& tagName) { + return this->selectedText.contains(tagName) || this->selectedText.empty(); } -void DialogueEditor::addXmlTag(std::string tagName) { - auto text = this->getText(); - if (this->isTextNonEditable()) { +void DialogueEditor::setTextAndReset(std::string text) { + this->selectedText = ""; + this->setText(text); +} + +void DialogueEditor::addXmlTag(std::string tagName) { + if (this->isTextNonEditable(tagName)) return; - } + + auto text = this->getText(); std::stringstream ss{}; @@ -35,7 +43,34 @@ void DialogueEditor::addXmlTag(std::string tagName) { ss << "<" << tagName << ">" << this->selectedText << ""; ss << text.substr(this->formattingSelectionEnd); - this->selectedText = ""; + this->setTextAndReset(ss.str()); +} + +void DialogueEditor::addXmlTagWithProperties(std::string tagName, std::vector properties) { + if (this->isTextNonEditable(tagName)) + return; + + auto text = this->getText(); + + std::stringstream ss{}; + + ss << text.substr(0, this->formattingSelectionStart); + ss << "<" << tagName << spaceLiteral; - this->setText(ss.str()); -} \ No newline at end of file + for (int i = 0; i < properties.size(); i++) { + auto& val = properties[i]; + + /** + * Construct an XML tag property string in the format "name=\"value\"" with a space separator + * between properties, except for the last one. + * + * This is very confusing, i know. + */ + ss << val.propertyName << "=\"" << val.propertyValue << "\"" << (i < properties.size() - 1 ? spaceLiteral : std::string{}); + } + + ss << ">" << this->selectedText << ""; + ss << text.substr(this->formattingSelectionEnd); + + this->setTextAndReset(ss.str()); +} From 35e9983a03616ef6b11dde34a1d248a52cf1fa48 Mon Sep 17 00:00:00 2001 From: thefirey33 Date: Mon, 20 Apr 2026 00:37:47 +0300 Subject: [PATCH 51/69] Add Font Changing to Formatting. --- .../childWindows/projectSettingsWindow.hpp | 2 - resources/translations/en_us.json | 1 + src/editor/childWindows/colorSelectWindow.cpp | 4 +- src/editor/fileViews/dialogueFileView.cpp | 41 ++++++++++++++++--- src/editor/services/childWindowSubService.cpp | 1 + 5 files changed, 40 insertions(+), 9 deletions(-) diff --git a/include/editor/childWindows/projectSettingsWindow.hpp b/include/editor/childWindows/projectSettingsWindow.hpp index d68fcee5..7c687060 100644 --- a/include/editor/childWindows/projectSettingsWindow.hpp +++ b/include/editor/childWindows/projectSettingsWindow.hpp @@ -3,11 +3,9 @@ #include -#include "TGUI/Widgets/EditBox.hpp" #include "childWindows/popupWindow.hpp" #include "childWindows/projectSettingsPanel/game.hpp" #include "childWindows/projectSettingsPanel/program.hpp" -#include "widgets/propertyFields/textField.hpp" class ProjectSettingsWindow : public PopupWindow { private: diff --git a/resources/translations/en_us.json b/resources/translations/en_us.json index 70abb403..15392617 100644 --- a/resources/translations/en_us.json +++ b/resources/translations/en_us.json @@ -61,6 +61,7 @@ "dialogueview": { "add_new_line": "Add a new line", "has_a_portrait": "Has a portrait?", + "select_a_font": "Select a font...", "select_a_color": "Select a color...", "select_a_text_size": "Text Size...", "color": { diff --git a/src/editor/childWindows/colorSelectWindow.cpp b/src/editor/childWindows/colorSelectWindow.cpp index 22333009..6bc07dbc 100644 --- a/src/editor/childWindows/colorSelectWindow.cpp +++ b/src/editor/childWindows/colorSelectWindow.cpp @@ -13,7 +13,7 @@ #include "TGUI/Widgets/GrowVerticalLayout.hpp" #include "TGUI/Widgets/ScrollablePanel.hpp" #include "childWindows/popupWindow.hpp" -#include "childWindows/settingsPanel/base.hpp" +#include "bindTranslation.hpp" #include "dialogueParser.hpp" #include "raylib.h" #include "widgets/dialogueEditor.hpp" @@ -21,6 +21,8 @@ constexpr int BLACK_WHITE_THRESHOLD = 80; ColorSelectWindow::ColorSelectWindow() : PopupWindow("Select a Color") { + this->editor = nullptr; + bindTranslation(this->currentWindow, "screen.project.dialogueview.select_a_color", &tgui::ChildWindow::setTitle); auto scrollablePanel = tgui::ScrollablePanel::create(); diff --git a/src/editor/fileViews/dialogueFileView.cpp b/src/editor/fileViews/dialogueFileView.cpp index 18ef9839..a1a4a9ec 100644 --- a/src/editor/fileViews/dialogueFileView.cpp +++ b/src/editor/fileViews/dialogueFileView.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -137,9 +138,38 @@ tgui::Panel::Ptr DialogueFileView::makeLinePanel(DialogueBin &data, DialogueLine bindTranslation(selectColorButton, "screen.project.dialogueview.select_a_color", &tgui::Button::setText); + auto selectFontComboBox = tgui::ComboBox::create(); + selectFontComboBox->setPosition({"20% + 8", 0}); + selectFontComboBox->setSize("10%", 36); + bindTranslation(selectFontComboBox, "screen.project.dialogueview.select_a_font", &tgui::ComboBox::setDefaultText); + + Project* project = Editor::instance->getProject(); + auto fontPaths = project->getPaths(EngineFileType::FILE_FONT); + + std::for_each(fontPaths.begin(), fontPaths.end(), [&selectFontComboBox](const std::string& fontPath) { + auto filename = GetFileNameWithoutExt(fontPath.c_str()); + selectFontComboBox->addItem(filename); + }); + + std::weak_ptr weakEditor = diagTextEdit; + std::weak_ptr weakFontBox = selectFontComboBox; + selectFontComboBox->onItemSelect.connect([weakEditor, weakFontBox](const tgui::String& selectedIndex){ + if (weakEditor.expired() || weakFontBox.expired()) { + return; + } + + auto editor = weakEditor.lock(); + auto box = weakFontBox.lock(); + + editor->addXmlTagWithProperties("font", {{ "font", selectedIndex.toStdString() }}); + box->deselectItem(); + }); + + + centerGroup->add(selectFontComboBox); auto textSizeComboBox = tgui::ComboBox::create(); - textSizeComboBox->setPosition({"20% + 8", 0}); + textSizeComboBox->setPosition({"30% + 12", 0}); textSizeComboBox->setSize("10%", 36); // For convenience, this code calculates the wanted text sizes automatically. @@ -150,15 +180,14 @@ tgui::Panel::Ptr DialogueFileView::makeLinePanel(DialogueBin &data, DialogueLine bindTranslation(textSizeComboBox, "screen.project.dialogueview.select_a_text_size", &tgui::ComboBox::setDefaultText); - std::weak_ptr weakEditor = diagTextEdit; - std::weak_ptr weakBox = textSizeComboBox; - textSizeComboBox->onItemSelect.connect([weakEditor, weakBox](const tgui::String& selectedIndex){ - if (weakEditor.expired() || weakBox.expired()) { + std::weak_ptr weakTextSizeBox = textSizeComboBox; + textSizeComboBox->onItemSelect.connect([weakEditor, weakTextSizeBox](const tgui::String& selectedIndex){ + if (weakEditor.expired() || weakTextSizeBox.expired()) { return; } auto editor = weakEditor.lock(); - auto box = weakBox.lock(); + auto box = weakTextSizeBox.lock(); editor->addXmlTagWithProperties("textSize", {{ "size", selectedIndex.toStdString() }}); box->deselectItem(); diff --git a/src/editor/services/childWindowSubService.cpp b/src/editor/services/childWindowSubService.cpp index b8cb07e0..3f4a1bb1 100644 --- a/src/editor/services/childWindowSubService.cpp +++ b/src/editor/services/childWindowSubService.cpp @@ -32,6 +32,7 @@ void ChildWindowSubService::createWindows() { this->childWindows.try_emplace("add_dialogue_option", std::make_unique()); this->childWindows.try_emplace("edit_dialogue_option", std::make_unique()); + } void ChildWindowSubService::openWindow(const std::string &windowName) { From 02a46a435a1f0cc2789ab90d11d40d3871a88f7f Mon Sep 17 00:00:00 2001 From: thefirey33 Date: Mon, 20 Apr 2026 00:45:00 +0300 Subject: [PATCH 52/69] Fix interesting issue with selection. --- include/editor/widgets/dialogueEditor.hpp | 1 + src/editor/widgets/dialogueEditor.cpp | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/include/editor/widgets/dialogueEditor.hpp b/include/editor/widgets/dialogueEditor.hpp index 01cd9c54..4266d9fd 100644 --- a/include/editor/widgets/dialogueEditor.hpp +++ b/include/editor/widgets/dialogueEditor.hpp @@ -39,6 +39,7 @@ class DialogueEditor : public tgui::TextArea { */ void addXmlTagWithProperties(std::string tagName, std::vector properties); void setTextAndReset(std::string text); + void alignSelection(); bool isTextNonEditable(std::string& tagName); }; diff --git a/src/editor/widgets/dialogueEditor.cpp b/src/editor/widgets/dialogueEditor.cpp index a39cc88d..b86e875b 100644 --- a/src/editor/widgets/dialogueEditor.cpp +++ b/src/editor/widgets/dialogueEditor.cpp @@ -31,7 +31,22 @@ void DialogueEditor::setTextAndReset(std::string text) { this->setText(text); } +void DialogueEditor::alignSelection() { + // This fixes an interesting TGUI issue where the formattingSelectionStart can sometimes be the end of the selection. + // Thanks TGUI for being an awesome GUI library. + // .w. - thefirey33, 2026 + + if (this->formattingSelectionStart > this->formattingSelectionEnd) { + auto selectionEnd = this->formattingSelectionEnd; + + this->formattingSelectionEnd = this->formattingSelectionStart; + this->formattingSelectionStart = selectionEnd; + } +} + void DialogueEditor::addXmlTag(std::string tagName) { + this->alignSelection(); + if (this->isTextNonEditable(tagName)) return; @@ -47,6 +62,8 @@ void DialogueEditor::addXmlTag(std::string tagName) { } void DialogueEditor::addXmlTagWithProperties(std::string tagName, std::vector properties) { + this->alignSelection(); + if (this->isTextNonEditable(tagName)) return; From 03ac30285c6e6804b809200d3b9c041891ad27ef Mon Sep 17 00:00:00 2001 From: thefirey33 Date: Mon, 20 Apr 2026 01:21:57 +0300 Subject: [PATCH 53/69] Allow delay editing in dialogueFileView. --- .../childWindows/addDelayDialogueWindow.hpp | 20 ++++++++ include/editor/widgets/dialogueEditor.hpp | 9 +++- resources/translations/en_us.json | 5 ++ resources/translations/tr.json | 5 ++ .../childWindows/addDelayDialogueWindow.cpp | 50 +++++++++++++++++++ src/editor/childWindows/colorSelectWindow.cpp | 1 + src/editor/fileViews/dialogueFileView.cpp | 46 ++++++++++------- src/editor/services/childWindowSubService.cpp | 3 ++ src/editor/widgets/dialogueEditor.cpp | 6 +-- 9 files changed, 123 insertions(+), 22 deletions(-) create mode 100644 include/editor/childWindows/addDelayDialogueWindow.hpp create mode 100644 src/editor/childWindows/addDelayDialogueWindow.cpp diff --git a/include/editor/childWindows/addDelayDialogueWindow.hpp b/include/editor/childWindows/addDelayDialogueWindow.hpp new file mode 100644 index 00000000..661839fc --- /dev/null +++ b/include/editor/childWindows/addDelayDialogueWindow.hpp @@ -0,0 +1,20 @@ +#ifndef RPGPP_ADDDELAYDIALOGUEWINDOW_HPP +#define RPGPP_ADDDELAYDIALOGUEWINDOW_HPP + + +#include "TGUI/Widgets/SpinControl.hpp" +#include "childWindows/popupWindow.hpp" +#include "widgets/dialogueEditor.hpp" +class AddDelayDialogueWindow : public PopupWindow { + private: + std::shared_ptr editor; + + tgui::SpinControl::Ptr delaySpin; + + public: + AddDelayDialogueWindow(); + + void open(std::shared_ptr editor); +}; + +#endif // RPGPP_ADDDELAYDIALOGUEWINDOW_HPP diff --git a/include/editor/widgets/dialogueEditor.hpp b/include/editor/widgets/dialogueEditor.hpp index 4266d9fd..05b2ba8b 100644 --- a/include/editor/widgets/dialogueEditor.hpp +++ b/include/editor/widgets/dialogueEditor.hpp @@ -38,8 +38,15 @@ class DialogueEditor : public tgui::TextArea { * @param properties The properties to add to the XML tag. */ void addXmlTagWithProperties(std::string tagName, std::vector properties); + /** + * This sets a text and resets the current selection. + * @param text Text to set. + */ void setTextAndReset(std::string text); - void alignSelection(); + /** + * This fixes an interesting case with TGUI .w. + */ + void fixSelectionRange(); bool isTextNonEditable(std::string& tagName); }; diff --git a/resources/translations/en_us.json b/resources/translations/en_us.json index 15392617..f330081e 100644 --- a/resources/translations/en_us.json +++ b/resources/translations/en_us.json @@ -63,6 +63,11 @@ "has_a_portrait": "Has a portrait?", "select_a_font": "Select a font...", "select_a_color": "Select a color...", + "delaywindow": { + "add_a_delay": "Add delay...", + "description": "Amount of delay to add in seconds.", + "confirm": "Confirm" + }, "select_a_text_size": "Text Size...", "color": { "lightgray": "Light Gray", diff --git a/resources/translations/tr.json b/resources/translations/tr.json index 0ccaf0d3..06704930 100644 --- a/resources/translations/tr.json +++ b/resources/translations/tr.json @@ -63,6 +63,11 @@ "has_a_portrait": "Portresi Varmı?", "select_a_color": "Renk seçiniz...", "select_a_text_size": "Yazı Boyutu...", + "delaywindow": { + "add_a_delay": "Gecikme Ekleyin...", + "description": "Saniye olarak eklenecek gecikme.", + "confirm": "Kabul Et" + }, "color": { "lightgray": "Açık Grey", "gold": "Altın", diff --git a/src/editor/childWindows/addDelayDialogueWindow.cpp b/src/editor/childWindows/addDelayDialogueWindow.cpp new file mode 100644 index 00000000..927e1768 --- /dev/null +++ b/src/editor/childWindows/addDelayDialogueWindow.cpp @@ -0,0 +1,50 @@ +#include "childWindows/addDelayDialogueWindow.hpp" +#include +#include +#include "TGUI/Layout.hpp" +#include "TGUI/Widgets/Button.hpp" +#include "TGUI/Widgets/ChildWindow.hpp" +#include "TGUI/Widgets/GrowVerticalLayout.hpp" +#include "TGUI/Widgets/Label.hpp" +#include "TGUI/Widgets/SpinControl.hpp" +#include "bindTranslation.hpp" +#include "childWindows/popupWindow.hpp" + +AddDelayDialogueWindow::AddDelayDialogueWindow(): PopupWindow("Add Delay...") { + this->editor = nullptr; + bindTranslation(this->currentWindow, "screen.project.dialogueview.delaywindow.add_a_delay", &tgui::ChildWindow::setTitle); + + this->currentWindow->setSize(400, 150); + + auto verticalLayout = tgui::GrowVerticalLayout::create(); + verticalLayout->setOrigin({0.5, 0.5}); + verticalLayout->setPosition({"50%", "50%"}); + verticalLayout->getRenderer()->setPadding(5.0f); + + auto descriptionLabel = tgui::Label::create(); + descriptionLabel->setHorizontalAlignment(tgui::HorizontalAlignment::Center); + bindTranslation(descriptionLabel, "screen.project.dialogueview.delaywindow.description", &tgui::Label::setText); + verticalLayout->add(descriptionLabel); + + // Allow for more precise second editing. + this->delaySpin = tgui::SpinControl::create(); + delaySpin->setSize({"100%", 32}); + delaySpin->setStep(0.1); + delaySpin->setDecimalPlaces(3); + verticalLayout->add(this->delaySpin); + + auto confirmButton = tgui::Button::create(); + bindTranslation(confirmButton, "screen.project.dialogueview.delaywindow.confirm", &tgui::Button::setText); + confirmButton->onPress.connect([this]{ + this->editor->addXmlTagWithProperties("delay", {{"delay", std::to_string(delaySpin->getValue())}}); + this->currentWindow->close(); + }); + verticalLayout->add(confirmButton); + + currentWindow->add(verticalLayout); +} + +void AddDelayDialogueWindow::open(std::shared_ptr editor) { + this->editor = editor; + PopupWindow::open(); +} diff --git a/src/editor/childWindows/colorSelectWindow.cpp b/src/editor/childWindows/colorSelectWindow.cpp index 6bc07dbc..0a9dc467 100644 --- a/src/editor/childWindows/colorSelectWindow.cpp +++ b/src/editor/childWindows/colorSelectWindow.cpp @@ -27,6 +27,7 @@ ColorSelectWindow::ColorSelectWindow() : PopupWindow("Select a Color") { &tgui::ChildWindow::setTitle); auto scrollablePanel = tgui::ScrollablePanel::create(); auto verticalLayout = tgui::GrowVerticalLayout::create(); + verticalLayout->getRenderer()->setPadding(5.0f); std::vector types = getColorTypes(); std::map colors = getColors(); diff --git a/src/editor/fileViews/dialogueFileView.cpp b/src/editor/fileViews/dialogueFileView.cpp index a1a4a9ec..7854c69d 100644 --- a/src/editor/fileViews/dialogueFileView.cpp +++ b/src/editor/fileViews/dialogueFileView.cpp @@ -23,6 +23,7 @@ #include "TGUI/Widgets/Panel.hpp" #include "TGUI/Widgets/TextArea.hpp" #include "bindTranslation.hpp" +#include "childWindows/addDelayDialogueWindow.hpp" #include "childWindows/addDialogueOptionWindow.hpp" #include "childWindows/colorSelectWindow.hpp" #include "childWindows/editDialogueOptionWindow.hpp" @@ -137,9 +138,33 @@ tgui::Panel::Ptr DialogueFileView::makeLinePanel(DialogueBin &data, DialogueLine selectColorButton->setSize("10%", 36); bindTranslation(selectColorButton, "screen.project.dialogueview.select_a_color", &tgui::Button::setText); + std::weak_ptr weakEditor = diagTextEdit; + selectColorButton->onPress.connect([weakEditor] { + if (auto capture = weakEditor.lock()) { + auto selectColorWindow = reinterpret_cast( + Editor::instance->getGui().getChildWindowSubService()->getWindow("select_a_color")); + + selectColorWindow->open(capture); + } + }); + centerGroup->add(selectColorButton); + + auto addDelayButton = tgui::Button::create(); + addDelayButton->setPosition({"20% + 8", 0}); + addDelayButton->setSize("10%", 36); + bindTranslation(addDelayButton, "screen.project.dialogueview.delaywindow.add_a_delay", &tgui::Button::setText); + addDelayButton->onPress.connect([weakEditor]{ + if (auto capture = weakEditor.lock()) { + auto delayWindow = reinterpret_cast( + Editor::instance->getGui().getChildWindowSubService()->getWindow("add_a_delay")); + + delayWindow->open(capture); + } + }); + centerGroup->add(addDelayButton); auto selectFontComboBox = tgui::ComboBox::create(); - selectFontComboBox->setPosition({"20% + 8", 0}); + selectFontComboBox->setPosition({"30% + 12", 0}); selectFontComboBox->setSize("10%", 36); bindTranslation(selectFontComboBox, "screen.project.dialogueview.select_a_font", &tgui::ComboBox::setDefaultText); @@ -151,7 +176,6 @@ tgui::Panel::Ptr DialogueFileView::makeLinePanel(DialogueBin &data, DialogueLine selectFontComboBox->addItem(filename); }); - std::weak_ptr weakEditor = diagTextEdit; std::weak_ptr weakFontBox = selectFontComboBox; selectFontComboBox->onItemSelect.connect([weakEditor, weakFontBox](const tgui::String& selectedIndex){ if (weakEditor.expired() || weakFontBox.expired()) { @@ -164,12 +188,10 @@ tgui::Panel::Ptr DialogueFileView::makeLinePanel(DialogueBin &data, DialogueLine editor->addXmlTagWithProperties("font", {{ "font", selectedIndex.toStdString() }}); box->deselectItem(); }); - - centerGroup->add(selectFontComboBox); auto textSizeComboBox = tgui::ComboBox::create(); - textSizeComboBox->setPosition({"30% + 12", 0}); + textSizeComboBox->setPosition({"40% + 16", 0}); textSizeComboBox->setSize("10%", 36); // For convenience, this code calculates the wanted text sizes automatically. @@ -192,22 +214,10 @@ tgui::Panel::Ptr DialogueFileView::makeLinePanel(DialogueBin &data, DialogueLine editor->addXmlTagWithProperties("textSize", {{ "size", selectedIndex.toStdString() }}); box->deselectItem(); }); - - centerGroup->add(textSizeComboBox); - selectColorButton->onPress.connect([weakEditor] { - if (auto capture = weakEditor.lock()) { - auto selectColorWindow = reinterpret_cast( - Editor::instance->getGui().getChildWindowSubService()->getWindow("select_a_color")); - - selectColorWindow->open(capture); - } - }); - - centerGroup->add(selectColorButton); auto addOptionButton = tgui::Button::create("Add Option"); - addOptionButton->setPosition("50% + 4", 0); + addOptionButton->setPosition("80% + 20", 0); addOptionButton->setSize(220, 36); addOptionButton->onClick([this, i] { auto *popupPtr = Editor::instance->getGui().getChildWindowSubService()->getWindow("add_dialogue_option"); diff --git a/src/editor/services/childWindowSubService.cpp b/src/editor/services/childWindowSubService.cpp index 3f4a1bb1..6f5db70e 100644 --- a/src/editor/services/childWindowSubService.cpp +++ b/src/editor/services/childWindowSubService.cpp @@ -3,6 +3,7 @@ #include #include "childWindows/aboutWindow.hpp" +#include "childWindows/addDelayDialogueWindow.hpp" #include "childWindows/addDialogueOptionWindow.hpp" #include "childWindows/colorSelectWindow.hpp" #include "childWindows/editDialogueOptionWindow.hpp" @@ -29,6 +30,8 @@ void ChildWindowSubService::createWindows() { this->childWindows.try_emplace("select_a_color", std::make_unique()); + this->childWindows.try_emplace("add_a_delay", std::make_unique()); + this->childWindows.try_emplace("add_dialogue_option", std::make_unique()); this->childWindows.try_emplace("edit_dialogue_option", std::make_unique()); diff --git a/src/editor/widgets/dialogueEditor.cpp b/src/editor/widgets/dialogueEditor.cpp index b86e875b..b8c763bd 100644 --- a/src/editor/widgets/dialogueEditor.cpp +++ b/src/editor/widgets/dialogueEditor.cpp @@ -31,7 +31,7 @@ void DialogueEditor::setTextAndReset(std::string text) { this->setText(text); } -void DialogueEditor::alignSelection() { +void DialogueEditor::fixSelectionRange() { // This fixes an interesting TGUI issue where the formattingSelectionStart can sometimes be the end of the selection. // Thanks TGUI for being an awesome GUI library. // .w. - thefirey33, 2026 @@ -45,7 +45,7 @@ void DialogueEditor::alignSelection() { } void DialogueEditor::addXmlTag(std::string tagName) { - this->alignSelection(); + this->fixSelectionRange(); if (this->isTextNonEditable(tagName)) return; @@ -62,7 +62,7 @@ void DialogueEditor::addXmlTag(std::string tagName) { } void DialogueEditor::addXmlTagWithProperties(std::string tagName, std::vector properties) { - this->alignSelection(); + this->fixSelectionRange(); if (this->isTextNonEditable(tagName)) return; From 7cbcc74828e722e3e17bc4cc7c180b04f79f5520 Mon Sep 17 00:00:00 2001 From: thefirey33 Date: Mon, 20 Apr 2026 01:30:28 +0300 Subject: [PATCH 54/69] Fix and Clean Translations --- resources/translations/en_us.json | 13 ++++++----- resources/translations/tr.json | 18 ++++++++------- .../childWindows/addDelayDialogueWindow.cpp | 13 ++++++----- src/editor/fileViews/dialogueFileView.cpp | 22 ++++++++++--------- 4 files changed, 37 insertions(+), 29 deletions(-) diff --git a/resources/translations/en_us.json b/resources/translations/en_us.json index f330081e..f14bc855 100644 --- a/resources/translations/en_us.json +++ b/resources/translations/en_us.json @@ -63,12 +63,8 @@ "has_a_portrait": "Has a portrait?", "select_a_font": "Select a font...", "select_a_color": "Select a color...", - "delaywindow": { - "add_a_delay": "Add delay...", - "description": "Amount of delay to add in seconds.", - "confirm": "Confirm" - }, "select_a_text_size": "Text Size...", + "add_a_delay": "Add delay...", "color": { "lightgray": "Light Gray", "gold": "Gold", @@ -185,6 +181,11 @@ "type": "Type", "submit": "Create" }, + "delaywindow": { + "add_a_delay": "Add delay...", + "description": "Amount of delay to add in seconds.", + "confirm": "Confirm" + }, "edit_prop": { "title": "Edit Prop", "type": "Type", @@ -232,4 +233,4 @@ "copy_full_path": "Copy full path", "delete": "Delete" } -} +} \ No newline at end of file diff --git a/resources/translations/tr.json b/resources/translations/tr.json index 06704930..0cac0b64 100644 --- a/resources/translations/tr.json +++ b/resources/translations/tr.json @@ -63,11 +63,8 @@ "has_a_portrait": "Portresi Varmı?", "select_a_color": "Renk seçiniz...", "select_a_text_size": "Yazı Boyutu...", - "delaywindow": { - "add_a_delay": "Gecikme Ekleyin...", - "description": "Saniye olarak eklenecek gecikme.", - "confirm": "Kabul Et" - }, + "select_a_font": "Yazıtipi Seçin...", + "add_a_delay": "Gecikme Ekleyin...", "color": { "lightgray": "Açık Grey", "gold": "Altın", @@ -194,10 +191,15 @@ "type": "Tür", "submit": "Oluştur" }, + "delaywindow": { + "add_a_delay": "Gecikme Ekleyin...", + "description": "Saniye olarak eklenecek gecikme.", + "confirm": "Ekle" + }, "edit_prop": { "title": "Objeyi Düzenle", "type": "Tür", - "submit": "Kabul Et", + "submit": "Düzenle", "remove": "Sil" }, "add_dialogue_option": { @@ -210,7 +212,7 @@ "title": "Diyalog Seçeneğini Düzenleyin", "name": "Seçenek İsmi", "dialogue": "Diyalog", - "submit": "Kabul Et", + "submit": "Düzenle", "remove": "Sil" } }, @@ -231,4 +233,4 @@ "copy_full_path": "Full yolunu kopyala", "delete": "Sil" } -} +} \ No newline at end of file diff --git a/src/editor/childWindows/addDelayDialogueWindow.cpp b/src/editor/childWindows/addDelayDialogueWindow.cpp index 927e1768..e8dec65b 100644 --- a/src/editor/childWindows/addDelayDialogueWindow.cpp +++ b/src/editor/childWindows/addDelayDialogueWindow.cpp @@ -1,6 +1,8 @@ #include "childWindows/addDelayDialogueWindow.hpp" + #include #include + #include "TGUI/Layout.hpp" #include "TGUI/Widgets/Button.hpp" #include "TGUI/Widgets/ChildWindow.hpp" @@ -10,9 +12,10 @@ #include "bindTranslation.hpp" #include "childWindows/popupWindow.hpp" -AddDelayDialogueWindow::AddDelayDialogueWindow(): PopupWindow("Add Delay...") { +AddDelayDialogueWindow::AddDelayDialogueWindow() : PopupWindow("Add Delay...") { this->editor = nullptr; - bindTranslation(this->currentWindow, "screen.project.dialogueview.delaywindow.add_a_delay", &tgui::ChildWindow::setTitle); + bindTranslation(this->currentWindow, "dialog.delaywindow.add_a_delay", + &tgui::ChildWindow::setTitle); this->currentWindow->setSize(400, 150); @@ -23,7 +26,7 @@ AddDelayDialogueWindow::AddDelayDialogueWindow(): PopupWindow("Add Delay...") { auto descriptionLabel = tgui::Label::create(); descriptionLabel->setHorizontalAlignment(tgui::HorizontalAlignment::Center); - bindTranslation(descriptionLabel, "screen.project.dialogueview.delaywindow.description", &tgui::Label::setText); + bindTranslation(descriptionLabel, "dialog.delaywindow.description", &tgui::Label::setText); verticalLayout->add(descriptionLabel); // Allow for more precise second editing. @@ -34,8 +37,8 @@ AddDelayDialogueWindow::AddDelayDialogueWindow(): PopupWindow("Add Delay...") { verticalLayout->add(this->delaySpin); auto confirmButton = tgui::Button::create(); - bindTranslation(confirmButton, "screen.project.dialogueview.delaywindow.confirm", &tgui::Button::setText); - confirmButton->onPress.connect([this]{ + bindTranslation(confirmButton, "dialog.delaywindow.confirm", &tgui::Button::setText); + confirmButton->onPress.connect([this] { this->editor->addXmlTagWithProperties("delay", {{"delay", std::to_string(delaySpin->getValue())}}); this->currentWindow->close(); }); diff --git a/src/editor/fileViews/dialogueFileView.cpp b/src/editor/fileViews/dialogueFileView.cpp index 7854c69d..c428c6af 100644 --- a/src/editor/fileViews/dialogueFileView.cpp +++ b/src/editor/fileViews/dialogueFileView.cpp @@ -152,8 +152,8 @@ tgui::Panel::Ptr DialogueFileView::makeLinePanel(DialogueBin &data, DialogueLine auto addDelayButton = tgui::Button::create(); addDelayButton->setPosition({"20% + 8", 0}); addDelayButton->setSize("10%", 36); - bindTranslation(addDelayButton, "screen.project.dialogueview.delaywindow.add_a_delay", &tgui::Button::setText); - addDelayButton->onPress.connect([weakEditor]{ + bindTranslation(addDelayButton, "screen.project.dialogueview.add_a_delay", &tgui::Button::setText); + addDelayButton->onPress.connect([weakEditor] { if (auto capture = weakEditor.lock()) { auto delayWindow = reinterpret_cast( Editor::instance->getGui().getChildWindowSubService()->getWindow("add_a_delay")); @@ -166,18 +166,19 @@ tgui::Panel::Ptr DialogueFileView::makeLinePanel(DialogueBin &data, DialogueLine auto selectFontComboBox = tgui::ComboBox::create(); selectFontComboBox->setPosition({"30% + 12", 0}); selectFontComboBox->setSize("10%", 36); - bindTranslation(selectFontComboBox, "screen.project.dialogueview.select_a_font", &tgui::ComboBox::setDefaultText); + bindTranslation(selectFontComboBox, "screen.project.dialogueview.select_a_font", + &tgui::ComboBox::setDefaultText); - Project* project = Editor::instance->getProject(); + Project *project = Editor::instance->getProject(); auto fontPaths = project->getPaths(EngineFileType::FILE_FONT); - std::for_each(fontPaths.begin(), fontPaths.end(), [&selectFontComboBox](const std::string& fontPath) { + std::for_each(fontPaths.begin(), fontPaths.end(), [&selectFontComboBox](const std::string &fontPath) { auto filename = GetFileNameWithoutExt(fontPath.c_str()); selectFontComboBox->addItem(filename); }); std::weak_ptr weakFontBox = selectFontComboBox; - selectFontComboBox->onItemSelect.connect([weakEditor, weakFontBox](const tgui::String& selectedIndex){ + selectFontComboBox->onItemSelect.connect([weakEditor, weakFontBox](const tgui::String &selectedIndex) { if (weakEditor.expired() || weakFontBox.expired()) { return; } @@ -185,7 +186,7 @@ tgui::Panel::Ptr DialogueFileView::makeLinePanel(DialogueBin &data, DialogueLine auto editor = weakEditor.lock(); auto box = weakFontBox.lock(); - editor->addXmlTagWithProperties("font", {{ "font", selectedIndex.toStdString() }}); + editor->addXmlTagWithProperties("font", {{"font", selectedIndex.toStdString()}}); box->deselectItem(); }); centerGroup->add(selectFontComboBox); @@ -200,10 +201,11 @@ tgui::Panel::Ptr DialogueFileView::makeLinePanel(DialogueBin &data, DialogueLine textSizeComboBox->addItem(std::to_string(i)); } - bindTranslation(textSizeComboBox, "screen.project.dialogueview.select_a_text_size", &tgui::ComboBox::setDefaultText); + bindTranslation(textSizeComboBox, "screen.project.dialogueview.select_a_text_size", + &tgui::ComboBox::setDefaultText); std::weak_ptr weakTextSizeBox = textSizeComboBox; - textSizeComboBox->onItemSelect.connect([weakEditor, weakTextSizeBox](const tgui::String& selectedIndex){ + textSizeComboBox->onItemSelect.connect([weakEditor, weakTextSizeBox](const tgui::String &selectedIndex) { if (weakEditor.expired() || weakTextSizeBox.expired()) { return; } @@ -211,7 +213,7 @@ tgui::Panel::Ptr DialogueFileView::makeLinePanel(DialogueBin &data, DialogueLine auto editor = weakEditor.lock(); auto box = weakTextSizeBox.lock(); - editor->addXmlTagWithProperties("textSize", {{ "size", selectedIndex.toStdString() }}); + editor->addXmlTagWithProperties("textSize", {{"size", selectedIndex.toStdString()}}); box->deselectItem(); }); centerGroup->add(textSizeComboBox); From 9e788eadabf4f909a382b8d956eb0021eec45669 Mon Sep 17 00:00:00 2001 From: "D. Quan" <60545346+sudoker0@users.noreply.github.com> Date: Mon, 20 Apr 2026 10:45:21 +0700 Subject: [PATCH 55/69] Code reformat and translation update --- include/editor/bindTranslation.hpp | 2 +- .../childWindows/addDelayDialogueWindow.hpp | 15 +++++++-------- resources/translations/en_us.json | 8 +++++++- resources/translations/vn.json | 15 ++++++++++++++- src/editor/childWindows/colorSelectWindow.cpp | 2 +- src/editor/childWindows/settingsPanel/general.cpp | 2 +- src/editor/fileViews/dialogueFileView.cpp | 3 ++- src/editor/screens/projectScreen.cpp | 11 ++++++----- src/editor/services/childWindowSubService.cpp | 1 - src/editor/widgets/dialogueEditor.cpp | 15 ++++++--------- .../widgets/propertyFields/interPropField.cpp | 9 ++++----- 11 files changed, 49 insertions(+), 34 deletions(-) diff --git a/include/editor/bindTranslation.hpp b/include/editor/bindTranslation.hpp index 8fd67000..f3793dea 100644 --- a/include/editor/bindTranslation.hpp +++ b/include/editor/bindTranslation.hpp @@ -38,7 +38,7 @@ void bindTranslation(std::shared_ptr widget, const std::string &key, // The callback function provides references to the widget and the translation service. template void bindTranslationWithCallback(std::shared_ptr widget, - std::function widget, TranslationService &)> cb) { + std::function widget, TranslationService &)> cb) { auto &ts = Editor::instance->getTranslations(); std::weak_ptr weakWidget = widget; diff --git a/include/editor/childWindows/addDelayDialogueWindow.hpp b/include/editor/childWindows/addDelayDialogueWindow.hpp index 661839fc..82b7ba48 100644 --- a/include/editor/childWindows/addDelayDialogueWindow.hpp +++ b/include/editor/childWindows/addDelayDialogueWindow.hpp @@ -1,20 +1,19 @@ #ifndef RPGPP_ADDDELAYDIALOGUEWINDOW_HPP #define RPGPP_ADDDELAYDIALOGUEWINDOW_HPP - #include "TGUI/Widgets/SpinControl.hpp" #include "childWindows/popupWindow.hpp" #include "widgets/dialogueEditor.hpp" class AddDelayDialogueWindow : public PopupWindow { - private: - std::shared_ptr editor; +private: + std::shared_ptr editor; - tgui::SpinControl::Ptr delaySpin; + tgui::SpinControl::Ptr delaySpin; - public: - AddDelayDialogueWindow(); +public: + AddDelayDialogueWindow(); - void open(std::shared_ptr editor); + void open(std::shared_ptr editor); }; -#endif // RPGPP_ADDDELAYDIALOGUEWINDOW_HPP +#endif // RPGPP_ADDDELAYDIALOGUEWINDOW_HPP diff --git a/resources/translations/en_us.json b/resources/translations/en_us.json index f14bc855..31ad329c 100644 --- a/resources/translations/en_us.json +++ b/resources/translations/en_us.json @@ -65,6 +65,7 @@ "select_a_color": "Select a color...", "select_a_text_size": "Text Size...", "add_a_delay": "Add delay...", + "add_option": "Add option", "color": { "lightgray": "Light Gray", "gold": "Gold", @@ -222,6 +223,11 @@ }, "hotkey_modifier": { "listening": "Listening..." + }, + "propField": { + "interPropField": { + "remove": "Remove" + } } }, "button": { @@ -233,4 +239,4 @@ "copy_full_path": "Copy full path", "delete": "Delete" } -} \ No newline at end of file +} diff --git a/resources/translations/vn.json b/resources/translations/vn.json index 38686292..fe1f8a98 100644 --- a/resources/translations/vn.json +++ b/resources/translations/vn.json @@ -65,6 +65,10 @@ "add_new_line": "Tạo hội thoại mới", "has_a_portrait": "Hiển thị ảnh hội thoại?", "select_a_color": "Chọn màu", + "select_a_font": "Chọn phông chữ", + "select_a_text_size": "Chọn kích cỡ chữ", + "add_a_delay": "Thêm độ trễ", + "add_option": "Thêm tùy chọn", "color": { "lightgray": "Xám nhạt", "gold": "Vàng", @@ -186,6 +190,11 @@ "type": "Loại", "submit": "Tạo" }, + "delaywindow": { + "add_a_delay": "Thêm độ trễ", + "description": "Thời gian độ trễ để thêm trong đơn vị giây.", + "confirm": "Xác nhận" + }, "edit_prop": { "title": "Chỉnh sửa Prop", "type": "Loại", @@ -215,7 +224,6 @@ "submit": "Sửa", "remove": "Xóa" } - }, "widget": { @@ -224,6 +232,11 @@ }, "hotkey_modifier": { "listening": "Đang nhận phím..." + }, + "propField": { + "interPropField": { + "remove": "Xóa" + } } }, diff --git a/src/editor/childWindows/colorSelectWindow.cpp b/src/editor/childWindows/colorSelectWindow.cpp index 0a9dc467..560bb6e6 100644 --- a/src/editor/childWindows/colorSelectWindow.cpp +++ b/src/editor/childWindows/colorSelectWindow.cpp @@ -12,8 +12,8 @@ #include "TGUI/Widgets/ChildWindow.hpp" #include "TGUI/Widgets/GrowVerticalLayout.hpp" #include "TGUI/Widgets/ScrollablePanel.hpp" -#include "childWindows/popupWindow.hpp" #include "bindTranslation.hpp" +#include "childWindows/popupWindow.hpp" #include "dialogueParser.hpp" #include "raylib.h" #include "widgets/dialogueEditor.hpp" diff --git a/src/editor/childWindows/settingsPanel/general.cpp b/src/editor/childWindows/settingsPanel/general.cpp index 5d58490c..8ab6eb16 100644 --- a/src/editor/childWindows/settingsPanel/general.cpp +++ b/src/editor/childWindows/settingsPanel/general.cpp @@ -80,7 +80,7 @@ SettingsPanelGeneral::SettingsPanelGeneral(tgui::TabContainer::Ptr tabContainer) bindTranslation(this->promptUserBox, "screen.options.general.theme", &tgui::MessageBox::setTitle); bindTranslation(promptUserBox, "screen.options.general.theme_notice", &tgui::MessageBox::setText); bindTranslationWithCallback(this->promptUserBox, [&](std::shared_ptr box, - TranslationService &ts) { + TranslationService &ts) { box->changeButtons(std::vector{ts.getKey("button.restart"), ts.getKey("button.restart_later")}); }); diff --git a/src/editor/fileViews/dialogueFileView.cpp b/src/editor/fileViews/dialogueFileView.cpp index c428c6af..d8a635d9 100644 --- a/src/editor/fileViews/dialogueFileView.cpp +++ b/src/editor/fileViews/dialogueFileView.cpp @@ -218,7 +218,8 @@ tgui::Panel::Ptr DialogueFileView::makeLinePanel(DialogueBin &data, DialogueLine }); centerGroup->add(textSizeComboBox); - auto addOptionButton = tgui::Button::create("Add Option"); + auto addOptionButton = tgui::Button::create(); + bindTranslation(addOptionButton, "screen.project.dialogueview.add_option", &tgui::Button::setText); addOptionButton->setPosition("80% + 20", 0); addOptionButton->setSize(220, 36); addOptionButton->onClick([this, i] { diff --git a/src/editor/screens/projectScreen.cpp b/src/editor/screens/projectScreen.cpp index 4a2e5875..775bcad0 100644 --- a/src/editor/screens/projectScreen.cpp +++ b/src/editor/screens/projectScreen.cpp @@ -114,11 +114,12 @@ void ProjectScreen::initItems(tgui::Group::Ptr layout) { auto &ts = Editor::instance->getTranslations(); fileContextMenu = tgui::ContextMenu::create(); - bindTranslationWithCallback(fileContextMenu, [](std::shared_ptr menu, TranslationService &ts) { - menu->removeAllMenuItems(); - menu->addMenuItem(ts.getKey("context_menu.copy_full_path")); - menu->addMenuItem(ts.getKey("context_menu.delete")); - }); + bindTranslationWithCallback(fileContextMenu, + [](std::shared_ptr menu, TranslationService &ts) { + menu->removeAllMenuItems(); + menu->addMenuItem(ts.getKey("context_menu.copy_full_path")); + menu->addMenuItem(ts.getKey("context_menu.delete")); + }); Editor::instance->getGui().gui->add(fileContextMenu); openedFiles = std::map>{}; diff --git a/src/editor/services/childWindowSubService.cpp b/src/editor/services/childWindowSubService.cpp index 6f5db70e..29f12ef8 100644 --- a/src/editor/services/childWindowSubService.cpp +++ b/src/editor/services/childWindowSubService.cpp @@ -35,7 +35,6 @@ void ChildWindowSubService::createWindows() { this->childWindows.try_emplace("add_dialogue_option", std::make_unique()); this->childWindows.try_emplace("edit_dialogue_option", std::make_unique()); - } void ChildWindowSubService::openWindow(const std::string &windowName) { diff --git a/src/editor/widgets/dialogueEditor.cpp b/src/editor/widgets/dialogueEditor.cpp index b8c763bd..2ab7724c 100644 --- a/src/editor/widgets/dialogueEditor.cpp +++ b/src/editor/widgets/dialogueEditor.cpp @@ -25,16 +25,14 @@ bool DialogueEditor::isTextNonEditable(std::string& tagName) { return this->selectedText.contains(tagName) || this->selectedText.empty(); } - void DialogueEditor::setTextAndReset(std::string text) { this->selectedText = ""; this->setText(text); } void DialogueEditor::fixSelectionRange() { - // This fixes an interesting TGUI issue where the formattingSelectionStart can sometimes be the end of the selection. - // Thanks TGUI for being an awesome GUI library. - // .w. - thefirey33, 2026 + // This fixes an interesting TGUI issue where the formattingSelectionStart can sometimes be the end of the + // selection. Thanks TGUI for being an awesome GUI library. .w. - thefirey33, 2026 if (this->formattingSelectionStart > this->formattingSelectionEnd) { auto selectionEnd = this->formattingSelectionEnd; @@ -47,8 +45,7 @@ void DialogueEditor::fixSelectionRange() { void DialogueEditor::addXmlTag(std::string tagName) { this->fixSelectionRange(); - if (this->isTextNonEditable(tagName)) - return; + if (this->isTextNonEditable(tagName)) return; auto text = this->getText(); @@ -64,8 +61,7 @@ void DialogueEditor::addXmlTag(std::string tagName) { void DialogueEditor::addXmlTagWithProperties(std::string tagName, std::vector properties) { this->fixSelectionRange(); - if (this->isTextNonEditable(tagName)) - return; + if (this->isTextNonEditable(tagName)) return; auto text = this->getText(); @@ -83,7 +79,8 @@ void DialogueEditor::addXmlTagWithProperties(std::string tagName, std::vector" << this->selectedText << ""; diff --git a/src/editor/widgets/propertyFields/interPropField.cpp b/src/editor/widgets/propertyFields/interPropField.cpp index b9cccebb..fa23cfa8 100644 --- a/src/editor/widgets/propertyFields/interPropField.cpp +++ b/src/editor/widgets/propertyFields/interPropField.cpp @@ -3,12 +3,10 @@ #include #include -#include "TGUI/Texture.hpp" #include "TGUI/Widget.hpp" -#include "TGUI/Widgets/BitmapButton.hpp" #include "TGUI/Widgets/Button.hpp" #include "TGUI/Widgets/Label.hpp" -#include "editor.hpp" +#include "childWindows/settingsPanel/base.hpp" #include "widgets/propertyFields/fieldConfig.hpp" InterPropField::InterPropField(const char *typeName, bool initRenderer) @@ -17,7 +15,8 @@ InterPropField::InterPropField(const char *typeName, bool initRenderer) label->setHorizontalAlignment(tgui::HorizontalAlignment::Left); label->setVerticalAlignment(tgui::VerticalAlignment::Center); value = tgui::Button::create(); - remove = tgui::Button::create("Remove"); + remove = tgui::Button::create(); + bindTranslation(remove, "widget.propField.interPropField.remove", &tgui::Button::setText); m_container->add(label, "Label"); m_container->add(value, "Value"); @@ -50,4 +49,4 @@ void InterPropField::updateSize() { value->setSize({getSize().x * 0.33f, getSize().y}); remove->setPosition({getSize().x * 0.67f, 0}); remove->setSize({getSize().x * 0.33f - PADDING, getSize().y}); -} \ No newline at end of file +} From 8aa727c38d1734278fad57aa016a9613b4d90241 Mon Sep 17 00:00:00 2001 From: "D. Quan" <60545346+sudoker0@users.noreply.github.com> Date: Mon, 20 Apr 2026 15:04:13 +0700 Subject: [PATCH 56/69] Changes to build workflow --- .github/workflows/build-doc.yml | 4 ++-- .github/workflows/build.yml | 9 ++++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build-doc.yml b/.github/workflows/build-doc.yml index 53457df1..afa6b4f4 100644 --- a/.github/workflows/build-doc.yml +++ b/.github/workflows/build-doc.yml @@ -2,9 +2,9 @@ name: "Build documentations" on: push: - branches: ["main", "docs"] + branches: ["main"] pull_request: - branches: ["main", "docs"] + branches: ["main"] workflow_dispatch: env: diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2f7ddfea..dbc9c540 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -26,10 +26,14 @@ jobs: fetch-depth: 0 submodules: recursive + - name: Install xmake + uses: xmake-io/github-action-setup-xmake@v1 + with: + xmake-version: latest + - name: Install packages shell: bash run: | - sudo add-apt-repository ppa:xmake-io/xmake sudo apt-get update sudo apt-get install -y \ libx11-dev \ @@ -38,8 +42,7 @@ jobs: libxcursor-dev \ libxi-dev \ libgl1-mesa-dev \ - mesa-common-dev \ - xmake + mesa-common-dev - name: Build shell: bash From 9c1416c5992ac9c7377efced5186296a295a96ce Mon Sep 17 00:00:00 2001 From: CDevv Date: Mon, 20 Apr 2026 12:40:46 +0300 Subject: [PATCH 57/69] Padding, sound and newline tags for dialogue --- include/dialogueBalloon.hpp | 14 +++++++- include/interactable.hpp | 2 +- resources/translations/bg.json | 43 ++++++++++++++++++++++++- src/dialogueBalloon.cpp | 46 ++++++++++++++++++++++++--- src/dialogueParser.cpp | 19 +++++++++++ src/editor/widgets/dialogueEditor.cpp | 34 +++++++++++++------- src/gamedata.cpp | 2 +- src/interactable.cpp | 8 ++--- 8 files changed, 145 insertions(+), 23 deletions(-) diff --git a/include/dialogueBalloon.hpp b/include/dialogueBalloon.hpp index b86a8a98..16798715 100644 --- a/include/dialogueBalloon.hpp +++ b/include/dialogueBalloon.hpp @@ -6,6 +6,8 @@ #include #include +enum DialoguePaddingMode { PADDING_PX, PADDING_PERCENT }; + struct DialogueTextSection { std::string key; std::string text; @@ -13,6 +15,10 @@ struct DialogueTextSection { int textSize = 13; std::string font = "LanaPixel"; float delay = 0.0f; + std::string sound = "Text 1"; + float padding = 0.0f; + DialoguePaddingMode paddingMode = PADDING_PX; + bool newline = false; }; struct DialogueOption { @@ -46,6 +52,7 @@ class DialogueBalloon { DialogueBin dialogue; std::string text; DialogueTextSection sectionText; + bool firstCharTyped; bool finishedTyping = false; bool active; @@ -53,12 +60,17 @@ class DialogueBalloon { int charIndex; int lineIndex; int sectionIndex; - Color textColor; int lastSectionLen; + + Color textColor; Vector2 textPos; bool delay = false; float delayDuration = 0.0f; int hoveredOption = 0; + float padding = 0.0f; + float maxLineHeight = 0.0f; + bool appliedTag = false; + void drawPortrait() const; public: diff --git a/include/interactable.hpp b/include/interactable.hpp index 75bf9fbe..3d65422d 100644 --- a/include/interactable.hpp +++ b/include/interactable.hpp @@ -13,7 +13,7 @@ #include "gamedata.hpp" #include "saveable.hpp" -enum PropType { INT, STRING, BOOLEAN, DIALOGUE }; +enum PropType { PROP_INT, PROP_STRING, PROP_BOOLEAN, PROP_DIALOGUE }; /** Defines an object that is interactable in-game by a player's action */ class Interactable : public ISaveable { diff --git a/resources/translations/bg.json b/resources/translations/bg.json index 18d7e1c5..e062677e 100644 --- a/resources/translations/bg.json +++ b/resources/translations/bg.json @@ -60,7 +60,38 @@ }, "dialogueview": { "add_new_line": "Добавете част", - "has_a_portrait": "Има портретно изображение?" + "has_a_portrait": "Има портрет?", + "select_a_font": "Изберете шрифт..", + "select_a_color": "Изберете цвят..", + "select_a_text_size": "Размер на текста..", + "add_a_delay": "Дoбавете забавяне..", + "add_option": "Добавете опция", + "color": { + "lightgray": "Светло сиво", + "gold": "Златно", + "pink": "Розово", + "green": "Зелени", + "skyblue": "Небесно синьо", + "purple": "Лилаво", + "beige": "Бежово", + "magenta": "Магента", + "gray": "Сиво", + "yellow": "Жълто", + "red": "Червено", + "lime": "Лимоново", + "blue": "Синьо", + "violet": "Виолетово", + "brown": "Кафяво", + "white": "Бяло", + "darkgray": "Тъмно синьо", + "orange": "Оранжево", + "maroon": "Кафяво-червено", + "darkgreen": "Тъмно зелено", + "darkblue": "Тъмно синьо", + "darkpurple": "Тъмно лилаво", + "darkbrown": "Тъмно Brown", + "black": "Черно" + } }, "tilesetview": { "tile_width": "Ширина на плочка", @@ -151,6 +182,11 @@ "type": "Тип", "submit": "Създай" }, + "delaywindow": { + "add_a_delay": "Добави забавяне", + "description": "Забавяне в секунди.", + "confirm": "ДОбави" + }, "edit_prop": { "title": "Редактирай обект", "type": "Тип", @@ -187,6 +223,11 @@ }, "hotkey_modifier": { "listening": "Слушам..." + }, + "propField": { + "interPropField": { + "remove": "Премахни" + } } }, "button": { diff --git a/src/dialogueBalloon.cpp b/src/dialogueBalloon.cpp index 9bf470d2..2493c000 100644 --- a/src/dialogueBalloon.cpp +++ b/src/dialogueBalloon.cpp @@ -42,7 +42,8 @@ void DialogueBalloon::update() { if (active) { if (firstCharTyped == false) { firstCharTyped = true; - Game::getSounds().playSound("Text 1"); + auto &soundId = dialogue.lines.at(lineIndex).sections.at(sectionIndex).sound; + Game::getSounds().playSound(soundId); return; } @@ -77,6 +78,10 @@ void DialogueBalloon::update() { lastSectionLen = 0; textPos = Vector2{0, 0}; + + appliedTag = false; + padding = 0.0f; + maxLineHeight = 0.0f; } } else { charIndex = (text.size() - 1); @@ -108,7 +113,8 @@ void DialogueBalloon::update() { // play sound if (charIndex < text.size()) { if (text.at(charIndex) != ' ') { - Game::getSounds().playSound("Text 1"); + auto &soundId = dialogue.lines.at(lineIndex).sections.at(sectionIndex).sound; + Game::getSounds().playSound(soundId); } } } @@ -168,6 +174,17 @@ void DialogueBalloon::draw() { int idx = 0; for (auto section : dialogue.lines.at(lineIndex).sections) { if (i < (size + TextLength(section.text.c_str()))) { + if (sectionIndex != idx) { + if (section.paddingMode == PADDING_PX) { + padding = section.padding; + } else { + padding = textRect.width * (section.padding / 100); + } + appliedTag = false; + if (section.newline) { + printf("newline tag.. \n"); + } + } sectionIndex = idx; break; @@ -177,6 +194,10 @@ void DialogueBalloon::draw() { idx++; } + if (maxLineHeight < charMeasure.y) { + maxLineHeight = charMeasure.y; + } + auto &line = dialogue.lines.at(lineIndex); auto §ion = dialogue.lines.at(lineIndex).sections.at(sectionIndex); @@ -192,6 +213,13 @@ void DialogueBalloon::draw() { } } + if (!appliedTag) { + if (section.padding > 0.0f) { + charMeasure.x += padding; + appliedTag = true; + } + } + const char *subText = TextSubtext(text.c_str(), i, 1); charP(charMeasure, subText, line, section); @@ -212,8 +240,18 @@ void DialogueBalloon::charP(Vector2 charMeasure, const char *c, DialogueLine &te Vector2 a = Vector2Add(textPos, Vector2{charMeasure.x + 1, 0.0f}); Vector2 finalCharPos = Vector2Add(Vector2{resRect.x, resRect.y}, a); - // Check for text overflow on x axis. - if ((finalCharPos.x + charMeasure.x) > textRect.width) { + auto §ion = dialogue.lines.at(lineIndex).sections.at(sectionIndex); + + bool hasNewline = false; + if (!appliedTag && section.newline) { + hasNewline = true; + } + if (TextIsEqual(c, "\n")) { + hasNewline = true; + } + + // Check for text overflow on x axis or for newline. + if ((finalCharPos.x + charMeasure.x) > textRect.width || hasNewline) { textPos.x = 0; textPos.y += charMeasure.y; diff --git a/src/dialogueParser.cpp b/src/dialogueParser.cpp index 79062dc1..306c2273 100644 --- a/src/dialogueParser.cpp +++ b/src/dialogueParser.cpp @@ -51,6 +51,25 @@ DialogueTextSection parseSection(pugi::xml_node node, DialogueTextSection base) base.delay = node.attribute("delay").as_float(1.0f); } + if (base.key == "padding") { + if (!node.attribute("px").empty()) { + base.padding = node.attribute("px").as_float(0.0f); + base.paddingMode = PADDING_PX; + } + if (!node.attribute("percent").empty()) { + base.padding = node.attribute("percent").as_int(); + base.paddingMode = PADDING_PERCENT; + } + } + + if (base.key == "sound") { + base.sound = node.attribute("id").as_string("Text 1"); + } + + if (base.key == "nl") { + base.newline = true; + } + return base; } diff --git a/src/editor/widgets/dialogueEditor.cpp b/src/editor/widgets/dialogueEditor.cpp index 2ab7724c..ad8d8ed5 100644 --- a/src/editor/widgets/dialogueEditor.cpp +++ b/src/editor/widgets/dialogueEditor.cpp @@ -5,7 +5,7 @@ #include #include -constexpr const char* spaceLiteral{" "}; +constexpr const char *spaceLiteral{" "}; #include "TGUI/String.hpp" @@ -21,9 +21,7 @@ DialogueEditor::DialogueEditor() { }); } -bool DialogueEditor::isTextNonEditable(std::string& tagName) { - return this->selectedText.contains(tagName) || this->selectedText.empty(); -} +bool DialogueEditor::isTextNonEditable(std::string &tagName) { return this->selectedText.contains(tagName); } void DialogueEditor::setTextAndReset(std::string text) { this->selectedText = ""; @@ -51,9 +49,14 @@ void DialogueEditor::addXmlTag(std::string tagName) { std::stringstream ss{}; - ss << text.substr(0, this->formattingSelectionStart); - ss << "<" << tagName << ">" << this->selectedText << ""; - ss << text.substr(this->formattingSelectionEnd); + if (this->getSelectionStart() >= this->getSelectionEnd()) { + ss << text; + ss << "<" << tagName << ">" << "" << ""; + } else { + ss << text.substr(0, this->formattingSelectionStart); + ss << "<" << tagName << ">" << this->selectedText << ""; + ss << text.substr(this->formattingSelectionEnd); + } this->setTextAndReset(ss.str()); } @@ -67,11 +70,16 @@ void DialogueEditor::addXmlTagWithProperties(std::string tagName, std::vectorformattingSelectionStart); + if (this->getSelectionStart() >= this->getSelectionEnd() || this->getSelectedText().empty()) { + ss << text; + } else { + ss << text.substr(0, this->formattingSelectionStart); + } + ss << "<" << tagName << spaceLiteral; for (int i = 0; i < properties.size(); i++) { - auto& val = properties[i]; + auto &val = properties[i]; /** * Construct an XML tag property string in the format "name=\"value\"" with a space separator @@ -83,8 +91,12 @@ void DialogueEditor::addXmlTagWithProperties(std::string tagName, std::vector" << this->selectedText << ""; - ss << text.substr(this->formattingSelectionEnd); + if (this->getSelectionStart() >= this->getSelectionEnd() || this->getSelectedText().empty()) { + ss << ">" << "" << ""; + } else { + ss << ">" << this->selectedText << ""; + ss << text.substr(this->formattingSelectionEnd); + } this->setTextAndReset(ss.str()); } diff --git a/src/gamedata.cpp b/src/gamedata.cpp index 035f73c5..1ee36f04 100644 --- a/src/gamedata.cpp +++ b/src/gamedata.cpp @@ -89,7 +89,7 @@ void serialize(Archive &a, RoomBin &b) { template void serialize(Archive &a, DialogueTextSection &b) { - a(b.key, b.text, b.textColor, b.textSize, b.font, b.delay); + a(b.key, b.text, b.textColor, b.textSize, b.font, b.delay, b.padding, b.paddingMode, b.sound, b.newline); } template diff --git a/src/interactable.cpp b/src/interactable.cpp index 3b359c4a..ba782fdd 100644 --- a/src/interactable.cpp +++ b/src/interactable.cpp @@ -97,16 +97,16 @@ void Interactable::setProps(nlohmann::json j) { this->props = std::make_uniquepush_back({name, 0}); break; - case STRING: + case PROP_STRING: props->push_back({name, ""}); break; - case BOOLEAN: + case PROP_BOOLEAN: props->push_back({name, false}); break; - case DIALOGUE: + case PROP_DIALOGUE: props->push_back({name, {{"propType", "dialogue"}, {"value", ""}}}); break; default: From fe1ee8ad24ea47b077b31a0602cfa252358f2f87 Mon Sep 17 00:00:00 2001 From: CDevv Date: Mon, 20 Apr 2026 13:31:55 +0300 Subject: [PATCH 58/69] Documentation of new dialogue system additions and Project Settings additions --- docs/guide/projectsettings.rst | 10 ++-- docs/guide/resourcetypes/dialogue.rst | 65 ++++++++++++++++------- docs/images/rpgpp-editeddialogueline.png | Bin 19183 -> 30691 bytes docs/images/rpgpp-newdialogueline.png | Bin 13068 -> 17432 bytes docs/images/rpgpp-projectsettings.png | Bin 18841 -> 24848 bytes src/dialogueBalloon.cpp | 44 +++++++-------- 6 files changed, 74 insertions(+), 45 deletions(-) diff --git a/docs/guide/projectsettings.rst b/docs/guide/projectsettings.rst index 0ea22eab..f3ca8f94 100644 --- a/docs/guide/projectsettings.rst +++ b/docs/guide/projectsettings.rst @@ -14,16 +14,18 @@ There are two categories in Project Settings: * **Title** - The Window's title. - * **Version** - Version of the game. - * **Program Icon** - The icon of the window. + * **Version** - Version of the game. + * **Window Width** - Width of the window. * **Window Height** - Height of the window. * **Is Window Resizeable** - Whether the window will be resizeable. + * **Window Mode** - windowed, exclusive, minimized, maximized, fullscreen. + * **Target FPS** - The frames per second that will be targeted. * **Game**: @@ -34,4 +36,6 @@ There are two categories in Project Settings: * **Player Actor** - The Actor file which will be used for the Player's appearance. - * **Tile Size** - The tile size in maps. \ No newline at end of file + * **Tile Size** - The tile size in maps. + + * **Debug Draw** - Drawing objects like collision boxes and etc. \ No newline at end of file diff --git a/docs/guide/resourcetypes/dialogue.rst b/docs/guide/resourcetypes/dialogue.rst index 062b4e12..dcab16e3 100644 --- a/docs/guide/resourcetypes/dialogue.rst +++ b/docs/guide/resourcetypes/dialogue.rst @@ -12,25 +12,34 @@ Example of a Dialogue file (.rdiag): .. code:: json { - "diag": [ - [ - "Xenith", - "I changed the dialogue!", - "0", - "" - ], - [ - "Xenith", - "This is the second line!", - "0", - "" - ], - [ - "Xenith", - "Content", - "0", - "" - ] + "diag":[ + { + "characterName":"Chara", + "hasOptions":false, + "hasPortrait":false, + "imageId":"", + "options":[ + + ], + "text":"My dialogue text!" + }, + { + "characterName":"Character", + "hasOptions":true, + "hasPortrait":true, + "imageId":"xenith-portrait.png", + "options":[ + { + "name":"Option 1", + "nextDialogue":"mydiag.rdiag" + }, + { + "name":"Option 2", + "nextDialogue":"diag.rdiag" + } + ], + "text":"Spooky RED text!" + } ] } @@ -55,7 +64,23 @@ The "Add a new line" button will add a new line to this Dialogue. The "Has a portrait?" option sets whether this line will have a portrait image shown for it. If it is on, then you can select an image to be shown. -You can also edit the Character name and the text content for the dialogue line. +You can also edit the Character name and the text content for the dialogue line. Dialogue text supports XML-like tags for formatting the text or achieving other effects. All tags must have a closing tag. + +* **Color tags:** - , , , , , , , , , , , , , , , , , , , , , , , + +* **** - Adds a delay in the typewriter effect in the dialogue UI. + +* **** - Changes the size of the text. It has one property *size* which is to be set to a number. Example usage: ``my text!`` + +* **** - Changes the font of the written text. Example: ``My text!`` + +* **** - Gives the written text a padding. It can be either in pixels of percentage of the dialogue box. + * Example for pixels: ``Padded text in pixels`` + * Example for percentage: ``Padded text in percentage`` + +* **** - Plays a different sound while typing out this text. Example: ``Baa!`` + +* **** - Positions the text on a new line. Example: ``text`` The 'X' button deletes this line. diff --git a/docs/images/rpgpp-editeddialogueline.png b/docs/images/rpgpp-editeddialogueline.png index 7a9d50ff16acf033738156bbd153657209403acd..04e67d6e4cb9adc64340774f7ddd6a408f49a554 100644 GIT binary patch literal 30691 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 XN}fX090|N|mjHf8Te;x2S-}4RD%9dx literal 19183 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 Wd8B~xzh-g3loao%$zpEb_x~?Y{QNNh literal 13068 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 diff --git a/docs/images/rpgpp-projectsettings.png b/docs/images/rpgpp-projectsettings.png index 59641c1e5de0f9d0fb6b45889f7dff13b49bb98a..83d5f18794c226189b0a603590df444ba4845ed5 100644 GIT binary patch literal 24848 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 diff --git a/src/dialogueBalloon.cpp b/src/dialogueBalloon.cpp index 2493c000..34687902 100644 --- a/src/dialogueBalloon.cpp +++ b/src/dialogueBalloon.cpp @@ -140,28 +140,6 @@ void DialogueBalloon::draw() { DrawTextureNPatch(uiTexture, info, rect, origin, 0.0f, WHITE); - if (finishedTyping && dialogue.lines.at(lineIndex).hasOptions) { - auto &line = dialogue.lines.at(lineIndex); - - DrawTextureNPatch(uiTexture, info, optionsRect, origin, 0.0f, WHITE); - - Vector2 optionTextPos = {optionsRect.x + 20, optionsRect.y + 20}; - int i = 0; - - for (auto &option : line.options) { - optionTextPos.y += (13 * 3) * i + (4 * i); - - Color optionTextColor = WHITE; - - if (hoveredOption == i) optionTextColor = YELLOW; - - DrawTextEx(Game::getResources().getFont("LanaPixel"), option.title.c_str(), optionTextPos, 13 * 3, 1.0, - optionTextColor); - - i++; - } - } - if (dialogue.lines.at(lineIndex).hasPortrait) { drawPortrait(); } @@ -227,6 +205,28 @@ void DialogueBalloon::draw() { TextSubtext(text.c_str(), i, 1), section.textSize * 3, 1.0f); charMeasure = newMeasure; } + + if (finishedTyping && dialogue.lines.at(lineIndex).hasOptions) { + auto &line = dialogue.lines.at(lineIndex); + + DrawTextureNPatch(uiTexture, info, optionsRect, origin, 0.0f, WHITE); + + Vector2 optionTextPos = {optionsRect.x + 20, optionsRect.y + 20}; + int i = 0; + + for (auto &option : line.options) { + optionTextPos.y += (13 * 3) * i + (4 * i); + + Color optionTextColor = WHITE; + + if (hoveredOption == i) optionTextColor = YELLOW; + + DrawTextEx(Game::getResources().getFont("LanaPixel"), option.title.c_str(), optionTextPos, 13 * 3, 1.0, + optionTextColor); + + i++; + } + } } } From 6cc79a82df402e421c951ba2503ae0a7a2045ad1 Mon Sep 17 00:00:00 2001 From: "D. Quan" <60545346+sudoker0@users.noreply.github.com> Date: Mon, 20 Apr 2026 20:11:32 +0700 Subject: [PATCH 59/69] Test update to xmake build file --- xmake.lua | 33 ++------------------------------- 1 file changed, 2 insertions(+), 31 deletions(-) diff --git a/xmake.lua b/xmake.lua index 8db27d4e..bd89ee14 100644 --- a/xmake.lua +++ b/xmake.lua @@ -20,37 +20,6 @@ on_install("linux", "macosx", "mingw", "windows", function (package) end) package_end() -package("noop") -set_sourcedir(path.join(os.scriptdir(), "libs/noop")) -add_deps("cmake") -set_license("MIT") -on_install("linux", "macosx", "mingw", "windows", function (package) - import("package.tools.cmake").install(package, { }) -end) -package_end() - -package("tree-sitter-lua") -add_urls("https://github.com/tree-sitter-grammars/tree-sitter-lua.git") -add_versions("0.4.99", "e40f5b6e6df9c2d1d6d664ff5d346a75d71ee6b2") -add_versions("0.4.100", "e40f5b6e6df9c2d1d6d664ff5d346a75d71ee6b2") -add_deps("cmake", "noop") -set_license("MIT") --- This is the most fucky hack I've probably made. It's essentially: I don't --- want you to fucking regenerate the grammar file, cause it's already there. But --- since you want to regenerate it, how about I pass in a very legit version of tree-sitter CLI --- called "noop" so at least you have something to run! --- --- NOTE: This only works because the grammar file has already been generated. -on_install("mingw", "windows", "linux", "macosx", function (package) - local noop = package:dep("noop") - local config = { } - table.insert(config, "-DCMAKE_BUILD_TYPE=" .. (is_mode("debug") and "Debug" or "Release")) - table.insert(config, "-DBUILD_SHARED_LIBS=OFF") - table.insert(config, "-DTREE_SITTER_CLI=" .. path.join(noop:installdir(), "bin/noop")) - import("package.tools.cmake").install(package, config) -end) -package_end() - package("tgui") -- set_sourcedir(path.join(os.scriptdir(), "libs/tgui/")) add_urls("https://github.com/texus/TGUI.git") @@ -75,6 +44,8 @@ add_rules("mode.debug", "mode.release") set_defaultmode("debug") target("rpgpp") +set_plat(os.host()) +set_arch(os.arch()) set_kind("static") add_packages("raylib", "nlohmann_json", "luajit", "pugixml") set_languages("cxx17") From 9fde23ef24835e64fc97608eb3a930656f445d39 Mon Sep 17 00:00:00 2001 From: "D. Quan" <60545346+sudoker0@users.noreply.github.com> Date: Mon, 20 Apr 2026 21:08:09 +0700 Subject: [PATCH 60/69] replace _WIN64 with _WIN32 --- src/editor/project.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/editor/project.cpp b/src/editor/project.cpp index d02c030a..36dc6699 100644 --- a/src/editor/project.cpp +++ b/src/editor/project.cpp @@ -26,7 +26,7 @@ #include "services/fileSystemService.hpp" #include "tileset.hpp" -#ifdef _WIN64 +#ifdef _WIN32 #include #include @@ -594,7 +594,7 @@ void Project::runProject() { stream = popen(TextFormat("%s -l rpgpplua %s", intepreterPath.c_str(), scriptPath.c_str()), "r"); #endif -#ifdef _WIN64 +#ifdef _WIN32 intepreterPath /= "luajit.exe"; const std::filesystem::path rpgppDllPath = "rpgpplua.dll"; @@ -652,7 +652,7 @@ void Project::buildProject() { std::filesystem::path resultPath = projectPath; -#ifdef _WIN64 +#ifdef _WIN32 baseGamePath /= "game.exe"; resultPath /= TextFormat("%s.exe", programSet.projectTitle.c_str()); #else @@ -667,7 +667,7 @@ void Project::buildProject() { return; } -#ifdef _WIN64 +#ifdef _WIN32 HANDLE outFile = nullptr; From 93ad97f50548f15eaa5b9bea9d87d41d886f1271 Mon Sep 17 00:00:00 2001 From: "D. Quan" <60545346+sudoker0@users.noreply.github.com> Date: Mon, 20 Apr 2026 21:16:45 +0700 Subject: [PATCH 61/69] Test 3 --- .github/workflows/build.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index dbc9c540..6cb530a2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -73,10 +73,14 @@ jobs: uses: xmake-io/github-action-setup-xmake@v1 with: xmake-version: latest + - name: Configure + run: xmake config --plat=windows --arch=x64 -y - name: Build shell: pwsh - run: xmake build --all -y + run: | + xmake global --clean + xmake build --all -y - name: Upload artifact uses: actions/upload-artifact@v6 From 23c1cf7006b49dc8fb308fbab0bad229c68127d5 Mon Sep 17 00:00:00 2001 From: "D. Quan" <60545346+sudoker0@users.noreply.github.com> Date: Mon, 20 Apr 2026 21:19:25 +0700 Subject: [PATCH 62/69] Test 4 --- .github/workflows/build.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6cb530a2..88b2214a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -74,13 +74,13 @@ jobs: with: xmake-version: latest - name: Configure - run: xmake config --plat=windows --arch=x64 -y + run: | + xmake global --clean + xmake config --plat=windows --arch=x64 -y - name: Build shell: pwsh - run: | - xmake global --clean - xmake build --all -y + run: xmake build --all -y - name: Upload artifact uses: actions/upload-artifact@v6 From 921a9b3b5bc74cd65e290516d2766e7bd58daf6f Mon Sep 17 00:00:00 2001 From: thefirey33 Date: Mon, 20 Apr 2026 15:02:03 +0300 Subject: [PATCH 63/69] Fix Windows API conflicting with Raylib API. --- include/winapi.hpp | 1 + src/editor/project.cpp | 66 ++---------------------------------------- src/winapi.cpp | 29 +++++++++++++++++++ 3 files changed, 33 insertions(+), 63 deletions(-) diff --git a/include/winapi.hpp b/include/winapi.hpp index 8e5e3026..5c6d455b 100644 --- a/include/winapi.hpp +++ b/include/winapi.hpp @@ -14,4 +14,5 @@ void WinCreateProc(std::string cmdLine); VsInfo WinVsWhere(std::string path); VsInfo ParseVsWhereData(std::string output); bool WinCreateDetachedExecutable(std::string path); +void WinRunWithLog(std::string logName, std::string cmdLine); #endif \ No newline at end of file diff --git a/src/editor/project.cpp b/src/editor/project.cpp index 36dc6699..70db117c 100644 --- a/src/editor/project.cpp +++ b/src/editor/project.cpp @@ -28,18 +28,7 @@ #ifdef _WIN32 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "fix_win32_compatibility.h" +#include #else @@ -609,32 +598,7 @@ void Project::runProject() { // these paths. std::string cmdLine = TextFormat("%s -l rpgpplua %s", intepreterPath.string().c_str(), scriptPath.string().c_str()); - HANDLE outFile = nullptr; - - outFile = - CreateFile("playtest.log", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - - PROCESS_INFORMATION piProcInfo; - STARTUPINFO siStartInfo; - - SetStdHandle(STD_OUTPUT_HANDLE, outFile); - ZeroMemory(&piProcInfo, sizeof(PROCESS_INFORMATION)); - - ZeroMemory(&siStartInfo, sizeof(STARTUPINFO)); - siStartInfo.cb = sizeof(STARTUPINFO); - siStartInfo.hStdOutput = outFile; - siStartInfo.dwFlags |= STARTF_USESTDHANDLES; - - bool success = CreateProcess(NULL, cmdLine.data(), NULL, NULL, true, 0, NULL, NULL, &siStartInfo, &piProcInfo); - - if (!success) { - printf("Child process doesn't work. \n"); - } else { - CloseHandle(piProcInfo.hProcess); - CloseHandle(piProcInfo.hThread); - - CloseHandle(outFile); - } + WinRunWithLog("playtest.log", cmdLine); #endif } @@ -669,31 +633,7 @@ void Project::buildProject() { #ifdef _WIN32 - HANDLE outFile = nullptr; - - outFile = CreateFile("build.log", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - - PROCESS_INFORMATION piProcInfo; - STARTUPINFO siStartInfo; - - ZeroMemory(&piProcInfo, sizeof(PROCESS_INFORMATION)); - - ZeroMemory(&siStartInfo, sizeof(STARTUPINFO)); - siStartInfo.cb = sizeof(STARTUPINFO); - siStartInfo.hStdOutput = outFile; - siStartInfo.dwFlags |= STARTF_USESTDHANDLES; - - bool success = - CreateProcess(NULL, resultPath.string().data(), NULL, NULL, true, 0, NULL, NULL, &siStartInfo, &piProcInfo); - - if (!success) { - printf("Child process could not be created.. \n"); - } else { - CloseHandle(piProcInfo.hProcess); - CloseHandle(piProcInfo.hThread); - - CloseHandle(outFile); - } + WinRunWithLog("build.log", resultPath.string().data()); #else diff --git a/src/winapi.cpp b/src/winapi.cpp index 68309818..1b6ec96c 100644 --- a/src/winapi.cpp +++ b/src/winapi.cpp @@ -67,6 +67,35 @@ void WinWriteToHandle(HANDLE handle, std::string str) { } } +void WinRunWithLog(std::string logName, std::string cmdLine){ + HANDLE outFile = nullptr; + + outFile = + CreateFile(logName.c_str(), GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + + PROCESS_INFORMATION piProcInfo; + STARTUPINFO siStartInfo; + + SetStdHandle(STD_OUTPUT_HANDLE, outFile); + ZeroMemory(&piProcInfo, sizeof(PROCESS_INFORMATION)); + + ZeroMemory(&siStartInfo, sizeof(STARTUPINFO)); + siStartInfo.cb = sizeof(STARTUPINFO); + siStartInfo.hStdOutput = outFile; + siStartInfo.dwFlags |= STARTF_USESTDHANDLES; + + bool success = CreateProcess(NULL, cmdLine.data(), NULL, NULL, true, 0, NULL, NULL, &siStartInfo, &piProcInfo); + + if (!success) { + printf("Child process doesn't work. \n"); + } else { + CloseHandle(piProcInfo.hProcess); + CloseHandle(piProcInfo.hThread); + + CloseHandle(outFile); + } +} + void WinCreateProcEx(std::string cmdLine, HANDLE outHandle, HANDLE inHandle, DWORD dwFlags, bool wait) { #ifdef _WIN32 STARTUPINFO si; From a8f9f7de67e8552cfa16a170e90bd3025c42bc05 Mon Sep 17 00:00:00 2001 From: CDevv Date: Mon, 20 Apr 2026 19:19:29 +0300 Subject: [PATCH 64/69] Introduce ListField and EditListFieldWindow, Export Image Scales and Export Font Sizes setting for Project --- .../childWindows/editListFieldWindow.hpp | 148 ++++++++++++++++++ .../projectSettingsPanel/game.hpp | 8 + include/editor/listHelper.hpp | 22 +++ include/editor/services/fileSystemService.hpp | 3 + .../widgets/propertyFields/intField.hpp | 4 + .../widgets/propertyFields/listField.hpp | 63 ++++++++ include/gamedata.hpp | 2 + src/editor/childWindows/popupWindow.cpp | 1 + .../projectSettingsPanel/game.cpp | 38 +++++ src/editor/project.cpp | 35 ++++- src/editor/screens/projectScreen.cpp | 7 +- src/editor/services/fileSystemService.cpp | 20 +++ .../widgets/propertyFields/intField.cpp | 36 ++++- src/gamedata.cpp | 2 +- src/resourceService.cpp | 19 +++ 15 files changed, 401 insertions(+), 7 deletions(-) create mode 100644 include/editor/childWindows/editListFieldWindow.hpp create mode 100644 include/editor/listHelper.hpp create mode 100644 include/editor/widgets/propertyFields/listField.hpp diff --git a/include/editor/childWindows/editListFieldWindow.hpp b/include/editor/childWindows/editListFieldWindow.hpp new file mode 100644 index 00000000..4a2235d3 --- /dev/null +++ b/include/editor/childWindows/editListFieldWindow.hpp @@ -0,0 +1,148 @@ +#ifndef _RPGPP_EDITLISTFIELDWINDOW_H +#define _RPGPP_EDITLISTFIELDWINDOW_H + +#include + +#include "TGUI/String.hpp" +#include "TGUI/Widgets/Button.hpp" +#include "TGUI/Widgets/GrowVerticalLayout.hpp" +#include "TGUI/Widgets/Panel.hpp" +#include "TGUI/Widgets/ScrollablePanel.hpp" +#include "childWindows/popupWindow.hpp" +#include "interactable.hpp" +#include "listHelper.hpp" +#include "nlohmann/json_fwd.hpp" +#include "raylib.h" +#include "widgets/propertiesBox.hpp" +#include "widgets/propertyFields/intField.hpp" +#include "widgets/propertyFields/listField.hpp" +#include "widgets/propertyFields/textField.hpp" + +template +class EditListFieldWindow : public PopupWindow { +public: + tgui::GrowVerticalLayout::Ptr layout; + std::vector *list; + ListField *field; + EditListFieldWindow() : PopupWindow("Edit List..") { + list = nullptr; + currentWindow->setSize(280, 180); + + auto panel = tgui::Panel::create(); + panel->getRenderer()->setPadding({4, 4}); + + auto addButton = tgui::Button::create("Add.."); + addButton->setPosition(0, 0); + addButton->setSize("100%", "10%"); + addButton->onPress([this] { + addItem(); + field->value->setText(VecToString(*list)); + }); + panel->add(addButton); + + auto scrollablePanel = tgui::ScrollablePanel::create({"100%", "80%"}); + scrollablePanel->setPosition(0, "10%"); + + layout = tgui::GrowVerticalLayout::create(); + layout->getRenderer()->setSpaceBetweenWidgets(4); + scrollablePanel->add(layout); + + auto closeButton = tgui::Button::create(); + closeButton->setText("Close"); + closeButton->setPosition(0, "90%"); + closeButton->setSize("100%", "10%"); + closeButton->onClick([this] { close(); }); + panel->add(closeButton); + + panel->add(scrollablePanel); + currentWindow->add(panel); + } + + void addItem(int index = -1); + + void setup(std::vector *listPtr) { + this->list = listPtr; + this->layout->removeAllWidgets(); + int i = 0; + for (auto &item : *list) { + addItem(i); + i++; + } + } +}; + +template <> +inline void EditListFieldWindow::addItem(int index) { + if (index == -1) { + auto &newItem = list->emplace_back(); + auto newField = TextField::create(); + newField->setSize({"100%", 24}); + newField->label->setText(TextFormat("[%i]", list->size() - 1)); + newField->value->onTextChange([&newItem, this](const tgui::String &text) { + newItem = text.toStdString(); + field->value->setText(VecToString(*list)); + }); + layout->add(newField); + } else { + auto &newItem = list->at(index); + auto newField = TextField::create(); + newField->setSize({"100%", 24}); + newField->label->setText(TextFormat("[%i]", index)); + newField->value->setText(newItem); + newField->value->onTextChange([&newItem, this](const tgui::String &text) { + newItem = text.toStdString(); + field->value->setText(VecToString(*list)); + }); + layout->add(newField); + } +} + +template <> +inline void EditListFieldWindow::addItem(int index) { + if (index == -1) { + auto &newItem = list->emplace_back(); + index = list->size() - 1; + + auto newField = IntField::create(); + newField->setSize({"100%", 24}); + newField->label->setText(TextFormat("[%i]", index)); + newField->value->setMinimum(0); + newField->value->setMaximum(100); + newField->value->onValueChange([&newItem, this](int value) { + newItem = value; + field->value->setText(VecToString(*list)); + }); + newField->value->setValue(newItem); + newField->enableRemoving(); + newField->remove->onClick([this, &newField, index] { + list->erase(list->begin() + index); + layout->remove(newField); + field->value->setText(VecToString(*list)); + }); + + layout->add(newField); + } else { + auto &newItem = list->at(index); + + auto newField = IntField::create(); + newField->setSize({"100%", 24}); + newField->label->setText(TextFormat("[%i]", index)); + newField->value->setMinimum(0); + newField->value->setMaximum(100); + newField->value->onValueChange([&newItem, this](int value) { + newItem = value; + field->value->setText(VecToString(*list)); + }); + newField->value->setValue(newItem); + newField->enableRemoving(); + newField->remove->onClick([this, &newField, index] { + list->erase(list->begin() + index); + setup(list); + field->value->setText(VecToString(*list)); + }); + + layout->add(newField); + } +} + +#endif \ No newline at end of file diff --git a/include/editor/childWindows/projectSettingsPanel/game.hpp b/include/editor/childWindows/projectSettingsPanel/game.hpp index 7d7a7c80..1213ff78 100644 --- a/include/editor/childWindows/projectSettingsPanel/game.hpp +++ b/include/editor/childWindows/projectSettingsPanel/game.hpp @@ -1,10 +1,14 @@ #ifndef _RPGPP_PROJECTSETTINGSPANEL_GAME_H #define _RPGPP_PROJECTSETTINGSPANEL_GAME_H +#include + +#include "childWindows/editListFieldWindow.hpp" #include "childWindows/settingsPanel/base.hpp" #include "widgets/propertyFields/boolField.hpp" #include "widgets/propertyFields/fileField.hpp" #include "widgets/propertyFields/intField.hpp" +#include "widgets/propertyFields/listField.hpp" class ProjectSettingsPanelGame : public SettingsPanelBase { public: @@ -12,6 +16,10 @@ class ProjectSettingsPanelGame : public SettingsPanelBase { FileField::Ptr playerActor; IntField::Ptr tileSize; BoolField::Ptr debugDraw; + ListField::Ptr exportImageScales; + ListField::Ptr exportFontSizes; + + std::unique_ptr> editListFieldWindow; ProjectSettingsPanelGame(tgui::TabContainer::Ptr tabContainer); void setup(Project *project); diff --git a/include/editor/listHelper.hpp b/include/editor/listHelper.hpp new file mode 100644 index 00000000..0cc8cf59 --- /dev/null +++ b/include/editor/listHelper.hpp @@ -0,0 +1,22 @@ +#ifndef _RPGPP_EDITOR_LISTHELPER_H +#define _RPGPP_EDITOR_LISTHELPER_H + +#include +#include +#include + +template +std::string VecToString(const std::vector &vec) { + std::stringstream stream; + int i = 0; + for (auto &item : vec) { + stream << item; + if (i != (vec.size() - 1)) { + stream << ";"; + } + i++; + } + return stream.str(); +} + +#endif \ No newline at end of file diff --git a/include/editor/services/fileSystemService.hpp b/include/editor/services/fileSystemService.hpp index 0268287b..bb98a5fa 100644 --- a/include/editor/services/fileSystemService.hpp +++ b/include/editor/services/fileSystemService.hpp @@ -30,6 +30,7 @@ enum class EngineFileType { class FileSystemService { private: std::array typeNames; + std::array, FILETYPE_MAX> typeExtensions; std::string editorBaseDir; public: @@ -39,6 +40,8 @@ class FileSystemService { void promptOpenProject(); std::string &getTypeName(EngineFileType fileType); std::array &getTypeNames(); + std::vector &getTypeExtensions(EngineFileType type); + std::array, FILETYPE_MAX> &getTypeExtensions(); const std::string &getEditorBaseDir(); std::string getResourcePath(const std::string &path); void openFileInDefaultApp(std::string &path); diff --git a/include/editor/widgets/propertyFields/intField.hpp b/include/editor/widgets/propertyFields/intField.hpp index 2b1b980f..870bac4a 100644 --- a/include/editor/widgets/propertyFields/intField.hpp +++ b/include/editor/widgets/propertyFields/intField.hpp @@ -5,6 +5,7 @@ #include "TGUI/SubwidgetContainer.hpp" #include "TGUI/Widget.hpp" +#include "TGUI/Widgets/BitmapButton.hpp" #include "TGUI/Widgets/Label.hpp" #include "TGUI/Widgets/SpinControl.hpp" @@ -18,6 +19,8 @@ class IntField : public tgui::SubwidgetContainer { public: tgui::Label::Ptr label; tgui::SpinControl::Ptr value; + tgui::BitmapButton::Ptr remove; + bool removable = false; typedef std::shared_ptr Ptr; typedef std::shared_ptr ConstPtr; @@ -28,6 +31,7 @@ class IntField : public tgui::SubwidgetContainer { static IntField::Ptr copy(IntField::ConstPtr widget); void setSize(const tgui::Layout2d &size) override; + void enableRemoving(); }; #endif diff --git a/include/editor/widgets/propertyFields/listField.hpp b/include/editor/widgets/propertyFields/listField.hpp new file mode 100644 index 00000000..78ae067b --- /dev/null +++ b/include/editor/widgets/propertyFields/listField.hpp @@ -0,0 +1,63 @@ +#ifndef _RPGPP_LISTFIELD_H +#define _RPGPP_LISTFIELD_H + +#include +#include + +#include "TGUI/SubwidgetContainer.hpp" +#include "TGUI/Widget.hpp" +#include "TGUI/Widgets/Button.hpp" +#include "TGUI/Widgets/Label.hpp" +#include "widgets/propertyFields/fieldConfig.hpp" + +template +class ListField : public tgui::SubwidgetContainer { +private: + std::vector items; + + void updateSize() { + label->setPosition({PADDING, 0}); + label->setSize({getSize().x * 0.5f - PADDING, getSize().y}); + value->setPosition({getSize().x * 0.5, 0}); + value->setSize({getSize().x * 0.5f - PADDING, getSize().y}); + } + +public: + tgui::Label::Ptr label; + tgui::Button::Ptr value; + + typedef std::shared_ptr Ptr; + typedef std::shared_ptr ConstPtr; + + ListField(const char *typeName = "ListField", bool initRenderer = true) + : tgui::SubwidgetContainer(typeName, initRenderer) { + label = tgui::Label::create("Label"); + label->setHorizontalAlignment(tgui::HorizontalAlignment::Left); + label->setVerticalAlignment(tgui::VerticalAlignment::Center); + value = tgui::Button::create(); + + m_container->add(label); + m_container->add(value); + + updateSize(); + } + + static ListField::Ptr create() { return std::make_shared(); } + + static ListField::Ptr copy(ListField::ConstPtr widget) { + if (widget) + return std::static_pointer_cast(widget->clone()); + else + return nullptr; + } + + void setSize(const tgui::Layout2d &size) override { + tgui::SubwidgetContainer::setSize(size); + updateSize(); + } + +protected: + Widget::Ptr clone() const override { return std::make_shared(*this); } +}; + +#endif \ No newline at end of file diff --git a/include/gamedata.hpp b/include/gamedata.hpp index 43a6251c..8913f704 100644 --- a/include/gamedata.hpp +++ b/include/gamedata.hpp @@ -153,6 +153,8 @@ struct ProjectGameSettings { std::string playerActorPath; int tileSize = 16; bool debugDraw = false; + std::vector exportImageScales = {1}; + std::vector exportFontSizes = {13}; }; struct GameData { diff --git a/src/editor/childWindows/popupWindow.cpp b/src/editor/childWindows/popupWindow.cpp index bd95a3d1..c7174a1e 100644 --- a/src/editor/childWindows/popupWindow.cpp +++ b/src/editor/childWindows/popupWindow.cpp @@ -34,6 +34,7 @@ void PopupWindow::open() { ; this->currentWindow->showWithEffect(ANIMATION_TYPE, tgui::Duration(ANIMATION_DURATION)); this->windowIsOpen = true; + this->currentWindow->moveToFront(); } void PopupWindow::close() { diff --git a/src/editor/childWindows/projectSettingsPanel/game.cpp b/src/editor/childWindows/projectSettingsPanel/game.cpp index 5b126c48..0cef63f1 100644 --- a/src/editor/childWindows/projectSettingsPanel/game.cpp +++ b/src/editor/childWindows/projectSettingsPanel/game.cpp @@ -1,15 +1,21 @@ #include "childWindows/projectSettingsPanel/game.hpp" +#include + #include "TGUI/String.hpp" #include "TGUI/Widgets/GrowVerticalLayout.hpp" #include "TGUI/Widgets/Label.hpp" #include "TGUI/Widgets/ScrollablePanel.hpp" +#include "childWindows/editListFieldWindow.hpp" #include "childWindows/settingsPanel/base.hpp" +#include "editor.hpp" +#include "listHelper.hpp" #include "project.hpp" #include "raylib.h" #include "widgets/propertyFields/boolField.hpp" #include "widgets/propertyFields/fileField.hpp" #include "widgets/propertyFields/intField.hpp" +#include "widgets/propertyFields/listField.hpp" ProjectSettingsPanelGame::ProjectSettingsPanelGame(tgui::TabContainer::Ptr tabContainer) : SettingsPanelBase(tabContainer, "dialog.project_settings.game._label") { @@ -17,6 +23,8 @@ ProjectSettingsPanelGame::ProjectSettingsPanelGame(tgui::TabContainer::Ptr tabCo scrollPanel->setSize("100%", "100%"); scrollPanel->getRenderer()->setPadding(4); + editListFieldWindow = std::make_unique>(); + const auto layout = tgui::GrowVerticalLayout::create(); layout->setSize("80%", "100%"); layout->setPosition({"50%", "0%"}); @@ -71,10 +79,38 @@ ProjectSettingsPanelGame::ProjectSettingsPanelGame(tgui::TabContainer::Ptr tabCo } }); + exportImageScales = ListField::create(); + exportImageScales->label->setText("Export Image Scales"); + exportImageScales->setSize({"100%", 24}); + exportImageScales->value->onPress([this] { + Project *project = Editor::instance->getProject(); + + if (project != nullptr) { + editListFieldWindow->field = exportImageScales.get(); + editListFieldWindow->setup(&project->getGameSettings().exportImageScales); + editListFieldWindow->open(); + } + }); + + exportFontSizes = ListField::create(); + exportFontSizes->label->setText("Export Font Sizes"); + exportFontSizes->setSize({"100%", 24}); + exportFontSizes->value->onPress([this] { + Project *project = Editor::instance->getProject(); + + if (project != nullptr) { + editListFieldWindow->field = exportFontSizes.get(); + editListFieldWindow->setup(&project->getGameSettings().exportFontSizes); + editListFieldWindow->open(); + } + }); + layout->add(defaultRoom); layout->add(playerActor); layout->add(tileSize); layout->add(debugDraw); + layout->add(exportImageScales); + layout->add(exportFontSizes); scrollPanel->add(layout); panel->add(scrollPanel); @@ -88,4 +124,6 @@ void ProjectSettingsPanelGame::setup(Project *project) { defaultRoom->value->setText(GetFileName(gameSet.defaultRoomPath.c_str())); playerActor->value->setText(GetFileName(gameSet.playerActorPath.c_str())); tileSize->value->setValue(gameSet.tileSize); + exportImageScales->value->setText(VecToString(gameSet.exportImageScales)); + exportFontSizes->value->setText(VecToString(gameSet.exportFontSizes)); } \ No newline at end of file diff --git a/src/editor/project.cpp b/src/editor/project.cpp index d02c030a..a2c040b0 100644 --- a/src/editor/project.cpp +++ b/src/editor/project.cpp @@ -2,6 +2,7 @@ #include +#include #include #include #include @@ -74,6 +75,8 @@ Project::Project(const std::string &path) { gameSet.playerActorPath = j.value("playerActor", ""); gameSet.tileSize = j.value("tileSize", 16); gameSet.debugDraw = j.value("debugDraw", false); + gameSet.exportImageScales = j.value("exportImageScales", std::vector{1}); + gameSet.exportFontSizes = j.value("exportFontSizes", std::vector{13}); ChangeDirectory(projectPath.c_str()); UnloadFileText(jsonContent); @@ -132,6 +135,8 @@ json Project::toJson() { j["tileSize"] = gameSet.tileSize; j["playerActor"] = gameSet.playerActorPath; j["debugDraw"] = gameSet.debugDraw; + j["exportImageScales"] = gameSet.exportImageScales; + j["exportFontSizes"] = gameSet.exportFontSizes; return j; } @@ -146,13 +151,22 @@ std::vector Project::getPaths(EngineFileType fileType) { std::filesystem::path subdir = projectPath; subdir /= TextToLower(Editor::instance->getFs().getTypeName(fileType).c_str()); + auto &extensions = Editor::instance->getFs().getTypeExtensions(fileType); + assert(subdir.string().empty() == false && "directory path is empty"); auto pathList = LoadDirectoryFiles(subdir.string().c_str()); std::vector vec = {}; for (int i = 0; i < pathList.count; i++) { - vec.emplace_back(pathList.paths[i]); + std::string fullPath = pathList.paths[i]; + std::string fileExt = GetFileExtension(fullPath.c_str()); + for (auto &j : extensions) { + if (j == fileExt) { + vec.emplace_back(fullPath); + break; + } + } } UnloadDirectoryFiles(pathList); @@ -324,7 +338,26 @@ GameData Project::generateStruct() { pBin.name = prop->getSourcePath(); pBin.tilePos = fromVector2(prop->getWorldTilePos()); + auto *interactable = prop->getInteractable(); + + // add missing props to the interactable in the prop + for (auto &item : getInteractableNames()) { + std::string itemType = GetFileNameWithoutExt(item.first.c_str()); + if (itemType == interactable->getType()) { + Interactable itemInteractable(item.first); + + for (auto prop : itemInteractable.getProps().items()) { + if (!interactable->getProps().contains(prop.key())) { + interactable->getProps().push_back({prop.key(), prop.value()}); + } + } + + break; + } + } + pBin.propsCbor = nlohmann::json::to_cbor(prop->getInteractable()->getProps()); + roomBin.props.push_back(pBin); } for (auto &[aName, actor] : room->getActors().getActors()) { diff --git a/src/editor/screens/projectScreen.cpp b/src/editor/screens/projectScreen.cpp index 775bcad0..d46084fa 100644 --- a/src/editor/screens/projectScreen.cpp +++ b/src/editor/screens/projectScreen.cpp @@ -407,8 +407,13 @@ ResizableContainer::Ptr ProjectScreen::createResourcesList() { auto resourceChoose = tgui::ComboBox::create(); resourceChoose->setPosition(0, 0); resourceChoose->setSize("100%", RESLIST_RES_CHOOSE_H); + + int i = 0; for (auto typeName : Editor::instance->getFs().getTypeNames()) { - resourceChoose->addItem(typeName); + if (static_cast(i) != EngineFileType::FILE_EMPTY) { + resourceChoose->addItem(typeName); + } + i++; } // resourceChoose->addMultipleItems({"TileSets", "Maps", "Scripts"}); resourceChoose->setSelectedItem("Maps"); diff --git a/src/editor/services/fileSystemService.cpp b/src/editor/services/fileSystemService.cpp index 53efc7dc..5199533e 100644 --- a/src/editor/services/fileSystemService.cpp +++ b/src/editor/services/fileSystemService.cpp @@ -21,6 +21,7 @@ FileSystemService::FileSystemService() { editorBaseDir = GetWorkingDirectory(); + /// type names typeNames[static_cast(EngineFileType::FILE_TILESET)] = "Tilesets"; typeNames[static_cast(EngineFileType::FILE_MAP)] = "Maps"; typeNames[static_cast(EngineFileType::FILE_ACTOR)] = "Actors"; @@ -34,6 +35,19 @@ FileSystemService::FileSystemService() { typeNames[static_cast(EngineFileType::FILE_INTERACTABLE)] = "Interactables"; typeNames[static_cast(EngineFileType::FILE_EMPTY)] = "Project Directory"; + + /// type extensions + typeExtensions[static_cast(EngineFileType::FILE_TILESET)] = {".rtiles"}; + typeExtensions[static_cast(EngineFileType::FILE_MAP)] = {".rmap"}; + typeExtensions[static_cast(EngineFileType::FILE_ACTOR)] = {".ractor"}; + typeExtensions[static_cast(EngineFileType::FILE_DIALOGUE)] = {".rdiag"}; + typeExtensions[static_cast(EngineFileType::FILE_IMAGE)] = {".png", ".jpg"}; + typeExtensions[static_cast(EngineFileType::FILE_FONT)] = {".ttf"}; + typeExtensions[static_cast(EngineFileType::FILE_SOUND)] = {".wav", ".mp3"}; + typeExtensions[static_cast(EngineFileType::FILE_MUSIC)] = {".wav", ".mp3"}; + typeExtensions[static_cast(EngineFileType::FILE_PROP)] = {".rprop"}; + typeExtensions[static_cast(EngineFileType::FILE_SCRIPT)] = {".lua"}; + typeExtensions[static_cast(EngineFileType::FILE_INTERACTABLE)] = {".rinter"}; } void FileSystemService::unload() {} @@ -74,6 +88,12 @@ std::string &FileSystemService::getTypeName(EngineFileType fileType) { return ty std::array &FileSystemService::getTypeNames() { return typeNames; } +std::vector &FileSystemService::getTypeExtensions(EngineFileType fileType) { + return typeExtensions[static_cast(fileType)]; +} + +std::array, FILETYPE_MAX> &FileSystemService::getTypeExtensions() { return typeExtensions; } + const std::string &FileSystemService::getEditorBaseDir() { return editorBaseDir; } std::string FileSystemService::getResourcePath(const std::string &path) { diff --git a/src/editor/widgets/propertyFields/intField.cpp b/src/editor/widgets/propertyFields/intField.cpp index bc2fe0ab..e5c54022 100644 --- a/src/editor/widgets/propertyFields/intField.cpp +++ b/src/editor/widgets/propertyFields/intField.cpp @@ -2,19 +2,31 @@ #include +#include "TGUI/Texture.hpp" #include "TGUI/Widget.hpp" +#include "TGUI/Widgets/BitmapButton.hpp" #include "TGUI/Widgets/Label.hpp" #include "TGUI/Widgets/SpinControl.hpp" +#include "editor.hpp" #include "widgets/propertyFields/fieldConfig.hpp" + IntField::IntField(const char *typeName, bool initRenderer) : tgui::SubwidgetContainer(typeName, initRenderer) { label = tgui::Label::create("Label"); label->setHorizontalAlignment(tgui::HorizontalAlignment::Left); label->setVerticalAlignment(tgui::VerticalAlignment::Center); value = tgui::SpinControl::create(0, 100); + remove = tgui::BitmapButton::create(); + remove->setSize({0, 0}); m_container->add(label); m_container->add(value); + auto closeImagePath = Editor::instance->getFs().getResourcePath("close.png"); + tgui::Texture imageTexture(closeImagePath); + remove->setImage(imageTexture); + remove->setVisible(false); + m_container->add(remove); + updateSize(); } @@ -36,9 +48,25 @@ void IntField::setSize(const tgui::Layout2d &size) { } void IntField::updateSize() { - label->setPosition({PADDING, 0}); - label->setSize({getSize().x * 0.5f - PADDING, getSize().y}); - value->setSize({getSize().x * 0.5f - PADDING, getSize().y}); + if (!removable) { + label->setPosition({PADDING, 0}); + label->setSize({getSize().x * 0.5f - PADDING, getSize().y}); + value->setSize({getSize().x * 0.5f - PADDING, getSize().y}); + value->setPosition({getSize().x * 0.5, 0}); + remove->setPosition({0, 0}); + remove->setSize({0, 0}); + } else { + label->setPosition({PADDING, 0}); + label->setSize({getSize().x * 0.4f, getSize().y}); + value->setPosition({getSize().x * 0.4f, 0}); + value->setSize({getSize().x * 0.4f, getSize().y}); + remove->setPosition({getSize().x * 0.8f, 0}); + remove->setSize({getSize().x * 0.2f, getSize().y}); + } +} - value->setPosition({getSize().x * 0.5, 0}); +void IntField::enableRemoving() { + removable = true; + remove->setVisible(true); + updateSize(); } diff --git a/src/gamedata.cpp b/src/gamedata.cpp index 1ee36f04..2d5d7e95 100644 --- a/src/gamedata.cpp +++ b/src/gamedata.cpp @@ -115,7 +115,7 @@ void serialize(Archive &a, ProjectProgramSettings &b) { template void serialize(Archive &a, ProjectGameSettings &b) { - a(b.defaultRoomPath, b.playerActorPath, b.tileSize, b.debugDraw); + a(b.defaultRoomPath, b.playerActorPath, b.tileSize, b.debugDraw, b.exportImageScales, b.exportFontSizes); } template diff --git a/src/resourceService.cpp b/src/resourceService.cpp index b1563aba..9655640f 100644 --- a/src/resourceService.cpp +++ b/src/resourceService.cpp @@ -15,13 +15,32 @@ void ResourceService::init() { for (auto &[id, fontBin] : Game::getBin().fonts) { Font font = LoadFontFromMemory(fontBin.ext.c_str(), fontBin.data.data(), fontBin.dataSize, 13, nullptr, 0); addFont(id, font); + + // font sizes, defined in the project settings + for (int fontSize : Game::getBin().gameSet.exportFontSizes) { + Font font = LoadFontFromMemory(fontBin.ext.c_str(), fontBin.data.data(), fontBin.dataSize, fontSize, + nullptr, 0); + addFont(TextFormat("%s-%i", id.c_str(), fontSize), font); + } } for (const auto &[name, data] : Game::getBin().images) { + // scale 1 - the image as it is Image image = LoadImageFromMemory(data.ext.c_str(), data.data.data(), data.dataSize); Texture2D texture = LoadTextureFromImage(image); addTexture(name, texture); UnloadImage(image); + + // scales, defined in the settings of the project + for (int imageScale : Game::getBin().gameSet.exportImageScales) { + if (imageScale > 1) { + Image image = LoadImageFromMemory(data.ext.c_str(), data.data.data(), data.dataSize); + ImageResize(&image, image.width * imageScale, image.height * imageScale); + Texture2D texture = LoadTextureFromImage(image); + addTexture(TextFormat("%s-%i", name.c_str(), imageScale), texture); + UnloadImage(image); + } + } } } else { auto dirList = LoadDirectoryFiles("fonts/"); From 8124f44351fc445c1b3f7af553d43fe3e0a14e67 Mon Sep 17 00:00:00 2001 From: CDevv Date: Mon, 20 Apr 2026 19:41:53 +0300 Subject: [PATCH 65/69] New translations for EditListFieldWindow --- include/editor/bindTranslation.hpp | 5 +++++ include/editor/childWindows/editListFieldWindow.hpp | 7 +++++-- resources/translations/bg.json | 9 ++++++++- resources/translations/en_us.json | 11 +++++++++-- src/editor/childWindows/projectSettingsPanel/game.cpp | 3 +++ 5 files changed, 30 insertions(+), 5 deletions(-) diff --git a/include/editor/bindTranslation.hpp b/include/editor/bindTranslation.hpp index f3793dea..eb5f3a01 100644 --- a/include/editor/bindTranslation.hpp +++ b/include/editor/bindTranslation.hpp @@ -1,3 +1,6 @@ +#ifndef _RPGPP_BINDTRANSLATION_H +#define _RPGPP_BINDTRANSLATION_H + #include #include @@ -53,3 +56,5 @@ void bindTranslationWithCallback(std::shared_ptr widget, } }); } + +#endif diff --git a/include/editor/childWindows/editListFieldWindow.hpp b/include/editor/childWindows/editListFieldWindow.hpp index 4a2235d3..5496ef6f 100644 --- a/include/editor/childWindows/editListFieldWindow.hpp +++ b/include/editor/childWindows/editListFieldWindow.hpp @@ -8,8 +8,8 @@ #include "TGUI/Widgets/GrowVerticalLayout.hpp" #include "TGUI/Widgets/Panel.hpp" #include "TGUI/Widgets/ScrollablePanel.hpp" +#include "bindTranslation.hpp" #include "childWindows/popupWindow.hpp" -#include "interactable.hpp" #include "listHelper.hpp" #include "nlohmann/json_fwd.hpp" #include "raylib.h" @@ -25,13 +25,15 @@ class EditListFieldWindow : public PopupWindow { std::vector *list; ListField *field; EditListFieldWindow() : PopupWindow("Edit List..") { + bindTranslation(this->currentWindow, "dialog.edit_list_field.title", &tgui::ChildWindow::setTitle); list = nullptr; currentWindow->setSize(280, 180); auto panel = tgui::Panel::create(); panel->getRenderer()->setPadding({4, 4}); - auto addButton = tgui::Button::create("Add.."); + auto addButton = tgui::Button::create(); + bindTranslation(addButton, "dialog.edit_list_field.add", &tgui::Button::setText); addButton->setPosition(0, 0); addButton->setSize("100%", "10%"); addButton->onPress([this] { @@ -48,6 +50,7 @@ class EditListFieldWindow : public PopupWindow { scrollablePanel->add(layout); auto closeButton = tgui::Button::create(); + bindTranslation(closeButton, "dialog.edit_list_field.close", &tgui::Button::setText); closeButton->setText("Close"); closeButton->setPosition(0, "90%"); closeButton->setSize("100%", "10%"); diff --git a/resources/translations/bg.json b/resources/translations/bg.json index e062677e..4e0eed38 100644 --- a/resources/translations/bg.json +++ b/resources/translations/bg.json @@ -173,7 +173,9 @@ "default_room": "Първоначална стая", "player_actor": "Актьор на играча", "tile_size": "Размер на плочка", - "debug_draw": "Дебъгерно рисуване" + "debug_draw": "Дебъгерно рисуване", + "export_image_scales": "Експортирани размери на изобр.", + "export_font_sizes": "Експортиране размери на шрифтовете" } }, "new_prop": { @@ -215,6 +217,11 @@ "dialogue": "Диалог", "submit": "Потвърди", "remove": "Премахни" + }, + "edit_list_field": { + "title": "Редактиране на списък..", + "add": "Добави..", + "close": "Затвори" } }, "widget": { diff --git a/resources/translations/en_us.json b/resources/translations/en_us.json index 31ad329c..0349d00e 100644 --- a/resources/translations/en_us.json +++ b/resources/translations/en_us.json @@ -173,7 +173,9 @@ "default_room": "Default Room", "player_actor": "Player Actor", "tile_size": "Tile Size", - "debug_draw": "Debug Draw" + "debug_draw": "Debug Draw", + "export_image_scales": "Export Image Scales", + "export_font_sizes": "Export Font Sizes" } }, "new_prop": { @@ -215,6 +217,11 @@ "dialogue": "Dialogue", "submit": "Submit", "remove": "Remove" + }, + "edit_list_field": { + "title": "Edit List..", + "add": "Add..", + "close": "Close" } }, "widget": { @@ -239,4 +246,4 @@ "copy_full_path": "Copy full path", "delete": "Delete" } -} +} \ No newline at end of file diff --git a/src/editor/childWindows/projectSettingsPanel/game.cpp b/src/editor/childWindows/projectSettingsPanel/game.cpp index 0cef63f1..210dd50f 100644 --- a/src/editor/childWindows/projectSettingsPanel/game.cpp +++ b/src/editor/childWindows/projectSettingsPanel/game.cpp @@ -80,6 +80,8 @@ ProjectSettingsPanelGame::ProjectSettingsPanelGame(tgui::TabContainer::Ptr tabCo }); exportImageScales = ListField::create(); + bindTranslation(exportImageScales->label, "dialog.project_settings.game.export_image_scales", + &tgui::Label::setText); exportImageScales->label->setText("Export Image Scales"); exportImageScales->setSize({"100%", 24}); exportImageScales->value->onPress([this] { @@ -93,6 +95,7 @@ ProjectSettingsPanelGame::ProjectSettingsPanelGame(tgui::TabContainer::Ptr tabCo }); exportFontSizes = ListField::create(); + bindTranslation(exportFontSizes->label, "dialog.project_settings.game.export_font_sizes", &tgui::Label::setText); exportFontSizes->label->setText("Export Font Sizes"); exportFontSizes->setSize({"100%", 24}); exportFontSizes->value->onPress([this] { From a77a5256323e89bb32b66b1a49b3f591ebca8da4 Mon Sep 17 00:00:00 2001 From: thefirey33 Date: Mon, 20 Apr 2026 19:42:04 +0300 Subject: [PATCH 66/69] Update Turkish Translation. --- resources/translations/tr.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/resources/translations/tr.json b/resources/translations/tr.json index 0cac0b64..01313e45 100644 --- a/resources/translations/tr.json +++ b/resources/translations/tr.json @@ -65,6 +65,7 @@ "select_a_text_size": "Yazı Boyutu...", "select_a_font": "Yazıtipi Seçin...", "add_a_delay": "Gecikme Ekleyin...", + "add_option": "Seçenek Ekle", "color": { "lightgray": "Açık Grey", "gold": "Altın", @@ -222,6 +223,11 @@ }, "hotkey_modifier": { "listening": "Bir tuşa basın..." + }, + "propField": { + "interPropField": { + "remove": "Sil" + } } }, "button": { @@ -233,4 +239,4 @@ "copy_full_path": "Full yolunu kopyala", "delete": "Sil" } -} \ No newline at end of file +} From 8ef3f3f2d9294e364105dd0578bc576285348f8a Mon Sep 17 00:00:00 2001 From: thefirey33 Date: Mon, 20 Apr 2026 19:44:57 +0300 Subject: [PATCH 67/69] Update Turkish Translation. --- resources/translations/tr.json | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/resources/translations/tr.json b/resources/translations/tr.json index 01313e45..f3982c2b 100644 --- a/resources/translations/tr.json +++ b/resources/translations/tr.json @@ -173,7 +173,9 @@ "default_room": "Öntanımlı Oda", "player_actor": "Oyuncunun Aktörü", "tile_size": "Kare Boyutu", - "debug_draw": "Hata Ayıklamayı Çiz" + "debug_draw": "Hata Ayıklamayı Çiz", + "export_image_scales": "Fotoğraf Boyutluklarını Dışarı Aktar", + "export_font_sizes": "Yazıtipi Boyutlarını Dışarı Aktar" } }, "delete_file": { @@ -215,6 +217,11 @@ "dialogue": "Diyalog", "submit": "Düzenle", "remove": "Sil" + }, + "edit_list_field": { + "title": "Listeyi Düzenleyin...", + "add": "Ekle..", + "close": "Kapat" } }, "widget": { @@ -239,4 +246,4 @@ "copy_full_path": "Full yolunu kopyala", "delete": "Sil" } -} +} \ No newline at end of file From 7d1a84beef6b0840a3e77f34d00351cc50346f4c Mon Sep 17 00:00:00 2001 From: "D. Quan" <60545346+sudoker0@users.noreply.github.com> Date: Mon, 20 Apr 2026 23:47:23 +0700 Subject: [PATCH 68/69] Update translation for Vietnamese --- resources/translations/vn.json | 9 ++++++++- src/winapi.cpp | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/resources/translations/vn.json b/resources/translations/vn.json index fe1f8a98..39b5c1bd 100644 --- a/resources/translations/vn.json +++ b/resources/translations/vn.json @@ -181,7 +181,9 @@ "default_room": "Room mặc định", "player_actor": "Actor người chơi", "tile_size": "Kích cỡ Tile", - "debug_draw": "Vẽ gỡ lỗi" + "debug_draw": "Vẽ gỡ lỗi", + "export_image_scales": "Kích cỡ xuất hình ảnh", + "export_font_sizes": "Kích cỡ xuất phông chữ" } }, "new_prop": { @@ -223,6 +225,11 @@ "dialogue": "Hội thoại", "submit": "Sửa", "remove": "Xóa" + }, + "edit_list_field": { + "title": "Sửa danh sách", + "add": "Thêm", + "close": "Thoát" } }, diff --git a/src/winapi.cpp b/src/winapi.cpp index 1b6ec96c..2680d322 100644 --- a/src/winapi.cpp +++ b/src/winapi.cpp @@ -67,7 +67,7 @@ void WinWriteToHandle(HANDLE handle, std::string str) { } } -void WinRunWithLog(std::string logName, std::string cmdLine){ +void WinRunWithLog(std::string logName, std::string cmdLine) { HANDLE outFile = nullptr; outFile = From 9fdb4ef8e2c781f0ec0be5d6a7804a856768ed97 Mon Sep 17 00:00:00 2001 From: CDevv Date: Mon, 20 Apr 2026 22:03:34 +0300 Subject: [PATCH 69/69] Document new Project Settings --- docs/guide/projectsettings.rst | 6 +++++- docs/guide/resourcetypes/dialogue.rst | 4 +--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/guide/projectsettings.rst b/docs/guide/projectsettings.rst index f3ca8f94..99a128fc 100644 --- a/docs/guide/projectsettings.rst +++ b/docs/guide/projectsettings.rst @@ -38,4 +38,8 @@ There are two categories in Project Settings: * **Tile Size** - The tile size in maps. - * **Debug Draw** - Drawing objects like collision boxes and etc. \ No newline at end of file + * **Debug Draw** - Drawing objects like collision boxes and etc. + + * **Export Image Scales** - What image scales to be exported. + + * **Export Font Sizes** - What font sizes the fonts shall be exported in. \ No newline at end of file diff --git a/docs/guide/resourcetypes/dialogue.rst b/docs/guide/resourcetypes/dialogue.rst index dcab16e3..91443943 100644 --- a/docs/guide/resourcetypes/dialogue.rst +++ b/docs/guide/resourcetypes/dialogue.rst @@ -18,9 +18,7 @@ Example of a Dialogue file (.rdiag): "hasOptions":false, "hasPortrait":false, "imageId":"", - "options":[ - - ], + "options":[], "text":"My dialogue text!" }, {

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