From ab37629c6e4798654fca1d533a611da7986b5053 Mon Sep 17 00:00:00 2001 From: Steph Enders Date: Fri, 24 Jun 2022 17:10:50 -0400 Subject: Select level via command line (linux tested) --- src/resources/Config.h | 47 ++++++++++ src/resources/Resources.cpp | 136 +++++++++++++++++++++++++++++ src/resources/Resources.h | 76 ++++++++++++++++ src/resources/linux/LinuxResources.cpp | 51 +++++++++++ src/resources/linux/LinuxResources.h | 45 ++++++++++ src/resources/windows/WindowsResources.cpp | 54 ++++++++++++ src/resources/windows/WindowsResources.h | 40 +++++++++ 7 files changed, 449 insertions(+) create mode 100644 src/resources/Config.h create mode 100644 src/resources/Resources.cpp create mode 100644 src/resources/Resources.h create mode 100644 src/resources/linux/LinuxResources.cpp create mode 100644 src/resources/linux/LinuxResources.h create mode 100644 src/resources/windows/WindowsResources.cpp create mode 100644 src/resources/windows/WindowsResources.h (limited to 'src/resources') 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 +// +// 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 +#include + +/** + * 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 fonts; + std::vector 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 +// +// 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 +#include +#include + +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 Resources::getFontFiles() { + return this->fonts; +} +std::vector Resources::getLevels() { + return this->levels; +} +shared_ptr Resources::getFontFile() { + return this->font; +} +shared_ptr Resources::updateFont(int idx) { + auto f = this->fonts[idx]; + *this->font = f; + return getFontFile(); +} +shared_ptr Resources::getDefaultsLuaFile() { + return this->defaultsLua; +} +shared_ptr 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(dngMap); +} +std::optional> +Resources::getLevelProcLua(int idx) { + auto lvlBase = this->levels[idx]; + auto procLua = lvlBase / PROC_LUA; + if (exists(procLua)) { + return std::make_shared(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 +// +// 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 +#include +#include + +// struct LevelInfo { +// filesystem::path dir; +// filesystem::path dngMap; +// optional 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 font; // chosen font + shared_ptr defaultsLua; // defaults lua file + vector fonts; // all found maps + vector levels; // all found maps + virtual vector levelSearchDirs() = 0; + virtual vector defaultsSearchDirs() = 0; + virtual vector fontSearchDirs() = 0; + +public: + void loadLevels(); + void loadFontFiles(); + void loadDefaultLuaFile(); + vector getFontFiles(); + vector getLevels(); + shared_ptr updateFont(int idx); + shared_ptr getFontFile(); + shared_ptr getDefaultsLuaFile(); + shared_ptr getLevelMap(int idx); + optional> 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 +// +// 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(f); + this->defaultsLua = std::make_shared(); +} + +std::vector LinuxResources::levelSearchDirs() { + return {workingDir / "maps", exeDir / "maps"}; +} +std::vector LinuxResources::defaultsSearchDirs() { + return {workingDir / "dnglib", exeDir / "dnglib"}; +} +std::vector 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 +// +// 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 levelSearchDirs() override; + std::vector defaultsSearchDirs() override; + std::vector 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 +// +// 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 +#define MAX_BUF_SIZE 1024 +class WindowsResources : public Resources { + +protected: + std::filesystem::path exeDir; + std::filesystem::path workingDir; + + std::vector levelSearchDirs() override { + return {workingDir / "maps", exeDir / "maps"}; + } + std::vector defaultsSearchDirs() override { + return {workingDir / "dnglib", exeDir / "dnglib"}; + } + std::vector 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(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 +// +// 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 levelSearchDirs() override; + std::vector defaultsSearchDirs() override; + std::vector fontSearchDirs() override; +}; + +#endif // DNG_WINDOWSRESOURCES_H -- cgit v1.2.3-54-g00ecf