summaryrefslogtreecommitdiff
path: root/src/resources
diff options
context:
space:
mode:
Diffstat (limited to 'src/resources')
-rw-r--r--src/resources/Config.h47
-rw-r--r--src/resources/Resources.cpp136
-rw-r--r--src/resources/Resources.h76
-rw-r--r--src/resources/linux/LinuxResources.cpp51
-rw-r--r--src/resources/linux/LinuxResources.h45
-rw-r--r--src/resources/windows/WindowsResources.cpp54
-rw-r--r--src/resources/windows/WindowsResources.h40
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