From 591d90134a9173b36d27d08ad433db029ba270c7 Mon Sep 17 00:00:00 2001 From: Tim Sarbin Date: Sun, 24 Feb 2019 22:59:40 -0500 Subject: [PATCH] Added data manager. Added file/mpq lookup dictionary. --- src/OpenDiablo2.Game/CMakeLists.txt | 7 ++- .../include/OpenDiablo2.Game/D2DataManager.h | 21 +++++++ .../include/OpenDiablo2.Game/D2Engine.h | 11 ++-- src/OpenDiablo2.Game/src/D2DataManager.cpp | 59 +++++++++++++++++++ src/OpenDiablo2.Game/src/D2Engine.cpp | 9 +-- src/OpenDiablo2.SDL2/CMakeLists.txt | 26 ++++---- .../include/OpenDiablo2.System/D2Graphics.h | 2 + 7 files changed, 113 insertions(+), 22 deletions(-) create mode 100644 src/OpenDiablo2.Game/include/OpenDiablo2.Game/D2DataManager.h create mode 100644 src/OpenDiablo2.Game/src/D2DataManager.cpp diff --git a/src/OpenDiablo2.Game/CMakeLists.txt b/src/OpenDiablo2.Game/CMakeLists.txt index f6717bb7..07957365 100644 --- a/src/OpenDiablo2.Game/CMakeLists.txt +++ b/src/OpenDiablo2.Game/CMakeLists.txt @@ -1,17 +1,18 @@ set (SOURCES src/main.cpp + src/D2DataManager.cpp src/D2Engine.cpp src/Scenes/D2MainMenu.cpp ) set (HEADERS + include/OpenDiablo2.Game/D2DataManager.h include/OpenDiablo2.Game/D2Engine.h include/OpenDiablo2.Game/D2EngineConfig.h include/OpenDiablo2.Game/Scenes/D2Scene.h include/OpenDiablo2.Game/Scenes/D2MainMenu.h ) - add_executable(OpenDiablo2.Game ${SOURCES} ${HEADERS}) target_include_directories(OpenDiablo2.SDL2 @@ -28,3 +29,7 @@ target_link_libraries(OpenDiablo2.Game stdc++fs spdlog::spdlog ) + +set_target_properties(OpenDiablo2.Game PROPERTIES + CXX_STANDARD 17 +) diff --git a/src/OpenDiablo2.Game/include/OpenDiablo2.Game/D2DataManager.h b/src/OpenDiablo2.Game/include/OpenDiablo2.Game/D2DataManager.h new file mode 100644 index 00000000..056f031c --- /dev/null +++ b/src/OpenDiablo2.Game/include/OpenDiablo2.Game/D2DataManager.h @@ -0,0 +1,21 @@ +#ifndef OPENDIABLO2_GAME_D2DATAMANAGER_H +#define OPENDIABLO2_GAME_D2DATAMANAGER_H + +#include +#include +#include +#include + +namespace OpenDiablo2::Game { + +class D2DataManager { +public: + typedef std::unique_ptr Ptr; + D2DataManager(const D2EngineConfig& engineConfig); +private: + std::map fileEntries; +}; + +} + +#endif // OPENDIABLO2_GAME_D2DATAMANAGER_H diff --git a/src/OpenDiablo2.Game/include/OpenDiablo2.Game/D2Engine.h b/src/OpenDiablo2.Game/include/OpenDiablo2.Game/D2Engine.h index 25ca6ce8..91e26a8b 100644 --- a/src/OpenDiablo2.Game/include/OpenDiablo2.Game/D2Engine.h +++ b/src/OpenDiablo2.Game/include/OpenDiablo2.Game/D2Engine.h @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -20,16 +21,14 @@ public: // Runs the engine void Run(); + OpenDiablo2::Game::D2DataManager::Ptr dataManager; + OpenDiablo2::System::D2Graphics::Ptr gfx; + OpenDiablo2::System::D2Input::Ptr input; + private: // Represents the engine configuration const D2EngineConfig config; - // The graphics subsystem - OpenDiablo2::System::D2Graphics::Ptr gfx; - - // The input subsystem - OpenDiablo2::System::D2Input::Ptr input; - // Indicates the system should keep running (if set to true) bool isRunning = true; diff --git a/src/OpenDiablo2.Game/src/D2DataManager.cpp b/src/OpenDiablo2.Game/src/D2DataManager.cpp new file mode 100644 index 00000000..8caf67ce --- /dev/null +++ b/src/OpenDiablo2.Game/src/D2DataManager.cpp @@ -0,0 +1,59 @@ +#include +#include +#include +#include + +namespace fs = std::experimental::filesystem; + +OpenDiablo2::Game::D2DataManager::D2DataManager(const D2EngineConfig &engineConfig) +: fileEntries() { + spdlog::info("Loading data files"); + auto mpqExt = std::string(".mpq"); + for (auto &p : fs::recursive_directory_iterator(engineConfig.BasePath)) + { + if (p.path().extension() != mpqExt) + continue; + + HANDLE hMpq = NULL; + HANDLE hListFile = NULL; + + if(!SFileOpenArchive(p.path().c_str(), 0, 0, &hMpq)) { + spdlog::error(std::string(" > ").append(p.path().string()).append(" [READ ERROR!]")); + continue; + } + + if(!SFileOpenFileEx(hMpq, "(listfile)", 0, &hListFile)) { + spdlog::error(std::string(" > ").append(p.path().string()).append(" [LIST FILE NOT FOUND!]")); + SFileCloseArchive(hMpq); + continue; + } + + auto listFileContents = std::string(); + char szBuffer[0x10000]; + DWORD dwBytes = 1; + + while(dwBytes > 0) + { + SFileReadFile(hListFile, szBuffer, sizeof(szBuffer), &dwBytes, NULL); + if(dwBytes > 0) { + listFileContents.append(szBuffer); + } + } + + std::string delim = "\r\n"; + auto start = 0U; + auto end = listFileContents.find(delim); + auto linesFound = 0; + while (end != std::string::npos) + { + linesFound++; + fileEntries.emplace(listFileContents.substr(start, end - start), p.path().stem().string()); + start = end + delim.length(); + end = listFileContents.find(delim, start); + } + spdlog::debug(std::string(" > ").append(p.path().string()).append(" [").append(std::to_string(linesFound)).append(" files]")); + SFileCloseFile(hListFile); + + SFileCloseArchive(hMpq); + } +} diff --git a/src/OpenDiablo2.Game/src/D2Engine.cpp b/src/OpenDiablo2.Game/src/D2Engine.cpp index 5e14e841..d6e06b11 100644 --- a/src/OpenDiablo2.Game/src/D2Engine.cpp +++ b/src/OpenDiablo2.Game/src/D2Engine.cpp @@ -3,10 +3,11 @@ OpenDiablo2::Game::D2Engine::D2Engine(const D2EngineConfig &config) -: config(config) { - gfx = std::make_unique(); - input = std::make_unique(); -} +: config(config) +, gfx(std::make_unique()) +, input(std::make_unique()) +, dataManager(std::make_unique(config)) +{ } void OpenDiablo2::Game::D2Engine::Run() { diff --git a/src/OpenDiablo2.SDL2/CMakeLists.txt b/src/OpenDiablo2.SDL2/CMakeLists.txt index 9ab60fe2..540fa78b 100644 --- a/src/OpenDiablo2.SDL2/CMakeLists.txt +++ b/src/OpenDiablo2.SDL2/CMakeLists.txt @@ -1,25 +1,29 @@ project(OpenDiablo2.SDL2 VERSION 0.1 LANGUAGES CXX) -set (SOURCES - src/D2Graphics.cpp - src/D2Input.cpp +set (SOURCES + src/D2Graphics.cpp + src/D2Input.cpp ) set (HEADERS - include/OpenDiablo2.System/D2Graphics.h - include/OpenDiablo2.System/D2Input.h + include/OpenDiablo2.System/D2Graphics.h + include/OpenDiablo2.System/D2Input.h ) add_library(OpenDiablo2.SDL2 SHARED ${SOURCES} ${HEADERS}) target_include_directories(OpenDiablo2.SDL2 - PUBLIC - include - PRIVATE - include + PUBLIC + include + PRIVATE + include ) target_link_libraries(OpenDiablo2.SDL2 - spdlog::spdlog - SDL2-static + spdlog::spdlog + SDL2-static +) + +set_target_properties(OpenDiablo2.SDL2 PROPERTIES + CXX_STANDARD 17 ) diff --git a/src/OpenDiablo2.SDL2/include/OpenDiablo2.System/D2Graphics.h b/src/OpenDiablo2.SDL2/include/OpenDiablo2.System/D2Graphics.h index 8dedc05d..9ccfbe72 100644 --- a/src/OpenDiablo2.SDL2/include/OpenDiablo2.System/D2Graphics.h +++ b/src/OpenDiablo2.SDL2/include/OpenDiablo2.System/D2Graphics.h @@ -28,6 +28,8 @@ struct SDLRendererDestroyer } }; + + class D2Graphics { public: