diff options
Diffstat (limited to 'src/resources')
-rw-r--r-- | src/resources/Config.h | 47 | ||||
-rw-r--r-- | src/resources/Resources.cpp | 136 | ||||
-rw-r--r-- | src/resources/Resources.h | 76 | ||||
-rw-r--r-- | src/resources/linux/LinuxResources.cpp | 51 | ||||
-rw-r--r-- | src/resources/linux/LinuxResources.h | 45 | ||||
-rw-r--r-- | src/resources/windows/WindowsResources.cpp | 54 | ||||
-rw-r--r-- | src/resources/windows/WindowsResources.h | 40 |
7 files changed, 449 insertions, 0 deletions
diff --git a/src/resources/Config.h b/src/resources/Config.h new file mode 100644 index 0000000..b67ca0d --- /dev/null +++ b/src/resources/Config.h @@ -0,0 +1,47 @@ +//======================================================================== +// dng +//------------------------------------------------------------------------ +// Copyright (c) 2022 Steph Enders <steph@senders.io> +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would +// be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source +// distribution. +// +//======================================================================== + +#ifndef DNG_CONFIG_H +#define DNG_CONFIG_H + +#include <filesystem> +#include <vector> + +/** + * Simple config struct mapping to the default locations + * Map just include directly in Resources + */ +struct Config { + bool fixed_resolution; + // configured as WidthxHeight + unsigned int fixed_width; + unsigned int fixed_height; + std::filesystem::path defaultsDir; + std::vector<std::filesystem::path> fonts; + std::vector<std::filesystem::path> levels; +}; + +#endif // DNG_CONFIG_H diff --git a/src/resources/Resources.cpp b/src/resources/Resources.cpp new file mode 100644 index 0000000..11f762f --- /dev/null +++ b/src/resources/Resources.cpp @@ -0,0 +1,136 @@ +//======================================================================== +// dng +//------------------------------------------------------------------------ +// Copyright (c) 2022 Steph Enders <steph@senders.io> +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would +// be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source +// distribution. +// +//======================================================================== + +#include "Resources.h" +#include <algorithm> +#include <cassert> +#include <iostream> + +void Resources::loadFontFiles() { + // We will search 1 level deep + for (auto &base : this->fontSearchDirs()) { + if (std::filesystem::exists(base) && std::filesystem::is_directory(base)) { + for (auto &item : std::filesystem::directory_iterator(base)) { + // only 1 deep + if (item.exists() && item.is_directory()) { + for (auto &file : std::filesystem::directory_iterator(item)) { + if (file.exists() && file.is_regular_file()) { + auto ext = file.path().extension(); + bool matched = + std::any_of(std::begin(FONT_TYPES), std::end(FONT_TYPES), + [ext](auto &supported) { + return supported == ext.generic_string(); + }); + if (matched) { + fonts.push_back(file.path()); + // set default if not set + if (!exists(*this->font) || + !is_regular_file(*this->font) && + file.path().filename() == DEFAULT_FONT) { + *this->font = file.path(); + } + } + } + } + } else if (item.is_regular_file()) { + auto ext = item.path().extension(); + bool matched = + std::any_of(std::begin(FONT_TYPES), std::end(FONT_TYPES), + [ext](auto &supported) { + return supported == ext.generic_string(); + }); + if (matched) { + fonts.push_back(item.path()); + // set default if not set + if (!exists(*this->font) || + !is_regular_file(*this->font) && + item.path().filename() == DEFAULT_FONT) { + *this->font = item.path(); + } + } + } + } + } + } +} + +void Resources::loadLevels() { + for (auto &base : this->levelSearchDirs()) { + if (std::filesystem::exists(base) && std::filesystem::is_directory(base)) { + for (auto &dir : std::filesystem::directory_iterator(base)) { + if (dir.exists() && dir.is_directory()) { + if (std::filesystem::exists(dir / DNG_MAP)) { + this->levels.push_back(dir.path()); + } + } + } + } + } + std::sort(this->levels.begin(), this->levels.end()); +} +void Resources::loadDefaultLuaFile() { + for (auto &base : this->defaultsSearchDirs()) { + auto f = base / DEFAULT_LUA; + if (std::filesystem::exists(f)) { + *this->defaultsLua = f; + break; + } + } +} +std::vector<std::filesystem::path> Resources::getFontFiles() { + return this->fonts; +} +std::vector<std::filesystem::path> Resources::getLevels() { + return this->levels; +} +shared_ptr<std::filesystem::path> Resources::getFontFile() { + return this->font; +} +shared_ptr<std::filesystem::path> Resources::updateFont(int idx) { + auto f = this->fonts[idx]; + *this->font = f; + return getFontFile(); +} +shared_ptr<std::filesystem::path> Resources::getDefaultsLuaFile() { + return this->defaultsLua; +} +shared_ptr<std::filesystem::path> Resources::getLevelMap(int idx) { + auto lvlBase = this->levels[idx]; + std::filesystem::path dngMap = lvlBase / DNG_MAP; + // existence of the level dng.map is asserted in the initializer + assert(std::filesystem::exists(dngMap)); + return std::make_shared<std::filesystem::path>(dngMap); +} +std::optional<shared_ptr<std::filesystem::path>> +Resources::getLevelProcLua(int idx) { + auto lvlBase = this->levels[idx]; + auto procLua = lvlBase / PROC_LUA; + if (exists(procLua)) { + return std::make_shared<std::filesystem::path>(procLua); + } else { + return nullopt; + } +}
\ No newline at end of file diff --git a/src/resources/Resources.h b/src/resources/Resources.h new file mode 100644 index 0000000..194c031 --- /dev/null +++ b/src/resources/Resources.h @@ -0,0 +1,76 @@ +//======================================================================== +// dng +//------------------------------------------------------------------------ +// Copyright (c) 2022 Steph Enders <steph@senders.io> +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would +// be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source +// distribution. +// +//======================================================================== + +#ifndef DNG_RESOURCES_H +#define DNG_RESOURCES_H + +#include <filesystem> +#include <optional> +#include <vector> + +// struct LevelInfo { +// filesystem::path dir; +// filesystem::path dngMap; +// optional<filesystem::path> procLua; +// }; +using namespace std; + +static const string FONT_TYPES[] = {".otf", ".ttf"}; +static const filesystem::path DEFAULT_LUA{"defaults.lua"}; +static const filesystem::path DNG_MAP{"dng.map"}; +static const filesystem::path PROC_LUA{"proc.lua"}; +static const char *DEFAULT_FONT = "PressStart2P-vaV7.ttf"; + +class Resources { + +protected: + shared_ptr<std::filesystem::path> font; // chosen font + shared_ptr<filesystem::path> defaultsLua; // defaults lua file + vector<filesystem::path> fonts; // all found maps + vector<filesystem::path> levels; // all found maps + virtual vector<filesystem::path> levelSearchDirs() = 0; + virtual vector<filesystem::path> defaultsSearchDirs() = 0; + virtual vector<filesystem::path> fontSearchDirs() = 0; + +public: + void loadLevels(); + void loadFontFiles(); + void loadDefaultLuaFile(); + vector<filesystem::path> getFontFiles(); + vector<filesystem::path> getLevels(); + shared_ptr<std::filesystem::path> updateFont(int idx); + shared_ptr<std::filesystem::path> getFontFile(); + shared_ptr<std::filesystem::path> getDefaultsLuaFile(); + shared_ptr<std::filesystem::path> getLevelMap(int idx); + optional<shared_ptr<std::filesystem::path>> getLevelProcLua(int idx); + /* Helper method to convert any path to a const char * + * Windows uses wchar_t so this can help provide a common way to + * interact with files + */ + virtual const char *convert_to_str(filesystem::path &path) = 0; +}; + +#endif // DNG_RESOURCES_H diff --git a/src/resources/linux/LinuxResources.cpp b/src/resources/linux/LinuxResources.cpp new file mode 100644 index 0000000..a8bcca0 --- /dev/null +++ b/src/resources/linux/LinuxResources.cpp @@ -0,0 +1,51 @@ +//======================================================================== +// dng +//------------------------------------------------------------------------ +// Copyright (c) 2022 Steph Enders <steph@senders.io> +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would +// be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source +// distribution. +// +//======================================================================== + +#include "LinuxResources.h" + +LinuxResources::LinuxResources() : Resources() { + this->workingDir = std::filesystem::current_path(); + this->exeDir = std::filesystem::canonical("/proc/self/exe").remove_filename(); + // set an initial value - will get hardset in load if found + std::filesystem::path f = + workingDir / "res" / DEFAULT_FONT; // default as fallback + this->font = std::make_shared<std::filesystem::path>(f); + this->defaultsLua = std::make_shared<std::filesystem::path>(); +} + +std::vector<std::filesystem::path> LinuxResources::levelSearchDirs() { + return {workingDir / "maps", exeDir / "maps"}; +} +std::vector<std::filesystem::path> LinuxResources::defaultsSearchDirs() { + return {workingDir / "dnglib", exeDir / "dnglib"}; +} +std::vector<std::filesystem::path> LinuxResources::fontSearchDirs() { + return {workingDir / "res", exeDir / "res"}; +} + +const char *LinuxResources::convert_to_str(std::filesystem::path &path) { + return path.c_str(); +} diff --git a/src/resources/linux/LinuxResources.h b/src/resources/linux/LinuxResources.h new file mode 100644 index 0000000..35fe049 --- /dev/null +++ b/src/resources/linux/LinuxResources.h @@ -0,0 +1,45 @@ +//======================================================================== +// dng +//------------------------------------------------------------------------ +// Copyright (c) 2022 Steph Enders <steph@senders.io> +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would +// be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source +// distribution. +// +//======================================================================== + +#ifndef DNG_LINUXRESOURCES_H +#define DNG_LINUXRESOURCES_H +#include "../Resources.h" +class LinuxResources : public Resources { +public: + LinuxResources(); + +protected: +public: + const char *convert_to_str(std::filesystem::path &path) override; + +protected: + std::filesystem::path exeDir; + std::filesystem::path workingDir; + std::vector<std::filesystem::path> levelSearchDirs() override; + std::vector<std::filesystem::path> defaultsSearchDirs() override; + std::vector<std::filesystem::path> fontSearchDirs() override; +}; +#endif // DNG_LINUXRESOURCES_H diff --git a/src/resources/windows/WindowsResources.cpp b/src/resources/windows/WindowsResources.cpp new file mode 100644 index 0000000..cfe264f --- /dev/null +++ b/src/resources/windows/WindowsResources.cpp @@ -0,0 +1,54 @@ +//======================================================================== +// dng +//------------------------------------------------------------------------ +// Copyright (c) 2022 Steph Enders <steph@senders.io> +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would +// be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source +// distribution. +// +//======================================================================== +#include "../Resources.h" +#include <libloaderapi.h> +#define MAX_BUF_SIZE 1024 +class WindowsResources : public Resources { + +protected: + std::filesystem::path exeDir; + std::filesystem::path workingDir; + + std::vector<std::filesystem::path> levelSearchDirs() override { + return {workingDir / "maps", exeDir / "maps"}; + } + std::vector<std::filesystem::path> defaultsSearchDirs() override { + return {workingDir / "dnglib", exeDir / "dnglib"}; + } + std::vector<std::filesystem::path> fontSearchDirs() override { + return {workingDir / "res", exeDir / "res"}; + } + +public: + const char *convert_to_str(std::filesystem::path &path) override { + std::setlocale(LC_ALL, "en_US.utf8"); // TODO more support? + const wchar_t *wstr = path.c_str(); + size_t len = std::wcslen(wstr) + 1; // gotta get that \0 + char *ret = static_cast<char *>(malloc(sizeof(char) * len)); // buffered + std::wcstombs(ret, path.c_str(), len); + return ret; + } +};
\ No newline at end of file diff --git a/src/resources/windows/WindowsResources.h b/src/resources/windows/WindowsResources.h new file mode 100644 index 0000000..b6a1cd6 --- /dev/null +++ b/src/resources/windows/WindowsResources.h @@ -0,0 +1,40 @@ +//======================================================================== +// dng +//------------------------------------------------------------------------ +// Copyright (c) 2022 Steph Enders <steph@senders.io> +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would +// be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source +// distribution. +// +//======================================================================== + +#ifndef DNG_WINDOWSRESOURCES_H +#define DNG_WINDOWSRESOURCES_H + +#include "../Resources.h" +class WindowsResources : public Resources { +protected: + std::filesystem::path exeDir; + std::filesystem::path workingDir; + std::vector<std::filesystem::path> levelSearchDirs() override; + std::vector<std::filesystem::path> defaultsSearchDirs() override; + std::vector<std::filesystem::path> fontSearchDirs() override; +}; + +#endif // DNG_WINDOWSRESOURCES_H |