diff --git a/CMakeLists.txt b/CMakeLists.txt index f6ca5b1..c233d2f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,7 +15,7 @@ # along with this program. If not, see . cmake_minimum_required(VERSION 3.5) -project(MassBuilderSaveTool) +project(MassBuilderSaveTool CXX) set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/modules/" ${CMAKE_MODULE_PATH}) @@ -25,10 +25,13 @@ set(BUILD_STATIC ON CACHE BOOL "" FORCE) set(BUILD_STATIC_PIC ON CACHE BOOL "" FORCE) set(BUILD_STATIC_UNIQUE_GLOBALS OFF CACHE BOOL "" FORCE) +set(BUILD_TESTS OFF CACHE BOOL "" FORCE) set(WITH_INTERCONNECT ON CACHE BOOL "" FORCE) -set(WITH_PLUGINMANAGER ON CACHE BOOL "" FORCE) +set(WITH_PLUGINMANAGER OFF CACHE BOOL "" FORCE) set(WITH_TESTSUITE OFF CACHE BOOL "" FORCE) set(WITH_MAIN ON CACHE BOOL "" FORCE) +set(BUILD_DEPRECATED OFF CACHE BOOL "" FORCE) +set(UTILITY_USE_ANSI_COLORS ON CACHE BOOL "" FORCE) add_subdirectory(third-party/corrade EXCLUDE_FROM_ALL) set(DIRECTX OFF CACHE BOOL "" FORCE) # We use OpenGL. @@ -56,6 +59,7 @@ set(WITH_GL ON CACHE BOOL "" FORCE) set(WITH_MESHTOOLS OFF CACHE BOOL "" FORCE) set(WITH_PRIMITIVES OFF CACHE BOOL "" FORCE) set(WITH_SCENEGRAPH OFF CACHE BOOL "" FORCE) +set(WITH_SCENETOOLS OFF CACHE BOOL "" FORCE) set(WITH_SHADERS ON CACHE BOOL "" FORCE) set(WITH_SHADERTOOLS OFF CACHE BOOL "" FORCE) set(WITH_TEXT OFF CACHE BOOL "" FORCE) diff --git a/README.md b/README.md index c3512bf..b74d471 100644 --- a/README.md +++ b/README.md @@ -4,17 +4,19 @@ A save file manager and editor for M.A.S.S. Builder. Based on [wxMASSManager](ht ## Installing -Get the `MassBuilderSaveTool-.zip` file from the [Releases](https://williamjcm.ovh/git/williamjcm/MassBuilderSaveTool/releases) page, and extract it somewhere. Then, launch `MassBuilderSaveTool.exe`. +Get the `MassBuilderSaveTool-.zip` file from the [project's home page](https://williamjcm.ovh/coding/mbst/) or the [Releases](https://williamjcm.ovh/git/williamjcm/MassBuilderSaveTool/releases) tab, and extract it somewhere. Then, launch `MassBuilderSaveTool-.exe`. ## Building on MSYS2 - IGNORE IF YOU JUST WANT TO USE THE APP! 1. Install the 64-bit (`x86_64`) version of [MSYS2](https://www.msys2.org/) in its default path (`C:\msys64`), and update it fully. 2. Run `pacman -S git mingw-w64-x86_64-toolchain mingw-w64-x86_64-cmake mingw-w64-x86_64-ninja`. -3. In a `MINGW64` shell, type `git clone https://github.com/williamjcm/MassBuilderSaveTool`. -4. Type `cd MassBuilderSaveTool && git submodule init && git submodule update && mkdir build && cd build`. +3. In a `MINGW64` shell, type `git clone --recursive https://github.com/williamjcm/MassBuilderSaveTool`. +4. Type `cd MassBuilderSaveTool && mkdir build && cd build`. 5. Type `cmake -GNinja -DCMAKE_BUILD_TYPE=Release ..` 6. Type `ninja` 7. ... 8. Profit! You'll be able to find the executable in `build/Release/bin`. + +**Note:** This should also work with the `ucrt64` or `clang64` repos. Just add `-ucrt` or `-clang` to `mingw-w64` when installing packages, and launch either a `UCRT64` or `CLANG64` shell in step 3. diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 31d5c1c..f80e78c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -18,7 +18,7 @@ set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) -set(SAVETOOL_PROJECT_VERSION 1.3.3) +set(SAVETOOL_PROJECT_VERSION 1.4.0-pre) find_package(Corrade REQUIRED Main Containers Utility Interconnect) find_package(Magnum REQUIRED GL Sdl2Application) @@ -160,6 +160,10 @@ add_executable(MassBuilderSaveTool WIN32 Maps/WeaponTypes.hpp ToastQueue/ToastQueue.h ToastQueue/ToastQueue.cpp + Logger/Logger.h + Logger/Logger.cpp + Logger/MagnumLogBuffer.h + Logger/MagnumLogBuffer.cpp Utilities/Crc32.h FontAwesome/IconsFontAwesome5.h FontAwesome/IconsFontAwesome5Brands.h @@ -170,7 +174,7 @@ if(CMAKE_BUILD_TYPE STREQUAL Debug) add_compile_definitions(SAVETOOL_DEBUG_BUILD) endif() add_compile_definitions(SAVETOOL_VERSION="${SAVETOOL_PROJECT_VERSION}" - SAVETOOL_CODENAME="Dickish Cyclops" + SAVETOOL_CODENAME="Enigmatic Ellenier" SUPPORTED_GAME_VERSION="0.8.6") if(CMAKE_BUILD_TYPE STREQUAL Release) diff --git a/src/Logger/Logger.cpp b/src/Logger/Logger.cpp new file mode 100644 index 0000000..9f3681f --- /dev/null +++ b/src/Logger/Logger.cpp @@ -0,0 +1,151 @@ +// MassBuilderSaveTool +// Copyright (C) 2021-2022 Guillaume Jacquemin +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#ifdef SAVETOOL_DEBUG_BUILD +#include +#else +#include +#endif +#include + +#include +#include + +#include + +#include "Logger.h" + +using Containers::Array; +using Utility::Debug; +using Utility::Warning; +using Utility::Error; + +using namespace Magnum; + +namespace Logger { + +#ifndef SAVETOOL_DEBUG_BUILD +static std::ofstream log_file{"SaveToolLog.txt", std::ios::trunc}; +#endif + +static UnsignedInt _indentLevel = 0; + +static std::mutex _logMutex; + +static Array _entries; + +inline Debug& +operator<<(Debug& out, const LogEntry& entry) { + using namespace Containers::Literals; + + out << "["_s << Debug::nospace << entry.timestamp << Debug::nospace << "]"_s; + +#ifdef SAVETOOL_DEBUG_BUILD +#define COLOURED_TEXT(colour, text) Debug::color(Debug::Color::colour) << (text) << Debug::resetColor +#else +#define COLOURED_TEXT(colour, text) (text) +#endif + + switch(entry.type) { + case EntryType::Info: + out << COLOURED_TEXT(Default, "[INFO]"_s); + break; + case EntryType::Success: + out << COLOURED_TEXT(Green, "[SUCCESS]"_s); + break; + case EntryType::Warning: + out << COLOURED_TEXT(Yellow, "[WARNING]"_s); + break; + case EntryType::Error: + out << COLOURED_TEXT(Red, "[ERROR]"_s); + break; + } + +#undef COLOURED_TEXT + + for(UnsignedInt i = 0; i < _indentLevel; i++) { + out << Debug::nospace << " "_s << Debug::nospace; + } + + out << entry.message; + + return out; +} + +void +initialise() { + arrayReserve(_entries, 100); +} + +void +indent() { + _indentLevel++; +} + +void +unindent() { + if(_indentLevel > 0) { + _indentLevel--; + } +} + +void +addEntry(EntryType type, StringView message) { + auto time = std::time(nullptr); + + static char formatted_time[20] = {'\0'}; + std::strftime(&formatted_time[0], sizeof(formatted_time)/sizeof(formatted_time[0]), + "%Y-%m-%d %H:%M:%S", // Because MSVCRT (which is the CRT I target by default) is not C99-compliant, + // I can't use "%F %T" as the format string. + std::localtime(&time)); + + LogEntry entry{ + formatted_time, type, + (message.back() == '\n') ? String{message.exceptSuffix(1)} : String{message} + }; + + Debug{ +#ifndef SAVETOOL_DEBUG_BUILD + &log_file +#else + &std::cout +#endif + } << entry; + + arrayAppend(_entries, std::move(entry)); +} + +ArrayView +entries() { + return _entries; +} + +void +lockMutex() { + _logMutex.lock(); +} + +void +unlockMutex() { + _logMutex.unlock(); +} + +bool +tryLockMutex() { + return _logMutex.try_lock(); +} + +} // Logger diff --git a/src/Logger/Logger.h b/src/Logger/Logger.h new file mode 100644 index 0000000..2d437c0 --- /dev/null +++ b/src/Logger/Logger.h @@ -0,0 +1,77 @@ +#pragma once + +// MassBuilderSaveTool +// Copyright (C) 2021-2022 Guillaume Jacquemin +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#include + +#include +#include +#include + +using namespace Corrade; + +using Containers::ArrayView; +using Containers::String; +using Containers::StringView; + +namespace Logger { + +enum class EntryType { + Info, + Success, + Warning, + Error, +}; + +struct LogEntry { + String timestamp; + EntryType type; + String message; +}; + +void initialise(); + +void indent(); +void unindent(); + +void addEntry(EntryType type, StringView message); + +auto entries() -> ArrayView; + +void lockMutex(); +void unlockMutex(); +bool tryLockMutex(); + +} // Logger + +#define LOG_INFO(message) Logger::lockMutex(); \ + Logger::addEntry(Logger::EntryType::Info, message); \ + Logger::unlockMutex() +#define LOG_SUCCESS(message) Logger::lockMutex(); \ + Logger::addEntry(Logger::EntryType::Success, message); \ + Logger::unlockMutex() +#define LOG_WARNING(message) Logger::lockMutex(); \ + Logger::addEntry(Logger::EntryType::Warning, message); \ + Logger::unlockMutex() +#define LOG_ERROR(message) Logger::lockMutex(); \ + Logger::addEntry(Logger::EntryType::Error, message); \ + Logger::unlockMutex() + +#define LOG_INFO_FORMAT(message, ...) LOG_INFO(Utility::format(message, __VA_ARGS__)) +#define LOG_SUCCESS_FORMAT(message, ...) LOG_SUCCESS(Utility::format(message, __VA_ARGS__)) +#define LOG_WARNING_FORMAT(message, ...) LOG_WARNING(Utility::format(message, __VA_ARGS__)) +#define LOG_ERROR_FORMAT(message, ...) LOG_ERROR(Utility::format(message, __VA_ARGS__)) diff --git a/src/Logger/MagnumLogBuffer.cpp b/src/Logger/MagnumLogBuffer.cpp new file mode 100644 index 0000000..8fa3416 --- /dev/null +++ b/src/Logger/MagnumLogBuffer.cpp @@ -0,0 +1,34 @@ +// MassBuilderSaveTool +// Copyright (C) 2021-2022 Guillaume Jacquemin +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#include "MagnumLogBuffer.h" + +namespace MassBuilderSaveTool { namespace Logger { + +MagnumLogBuffer::MagnumLogBuffer(EntryType type): std::stringbuf(std::ios_base::out), _type{type} {} + +MagnumLogBuffer::~MagnumLogBuffer() = default; + +int +MagnumLogBuffer::sync() { + addEntry(_type, str().c_str()); + str({}); + return 0; +} + +} // Logger + +} // MassBuilderSaveTool diff --git a/src/Logger/MagnumLogBuffer.h b/src/Logger/MagnumLogBuffer.h new file mode 100644 index 0000000..39aa5a8 --- /dev/null +++ b/src/Logger/MagnumLogBuffer.h @@ -0,0 +1,38 @@ +#pragma once + +// MassBuilderSaveTool +// Copyright (C) 2021-2022 Guillaume Jacquemin +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#include + +#include "Logger.h" + +namespace MassBuilderSaveTool { namespace Logger { + +class MagnumLogBuffer : public std::stringbuf { + public: + explicit MagnumLogBuffer(EntryType type); + ~MagnumLogBuffer(); + + private: + int sync() override; + + EntryType _type; +}; + +} // Logger + +} // MassBuilderSaveTool diff --git a/src/resource.rc b/src/resource.rc index df99b1e..57435bd 100644 --- a/src/resource.rc +++ b/src/resource.rc @@ -14,6 +14,39 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +#include +#include + MAINICON ICON "mbst.ico" -1 24 "Application.manifest" +1 RT_MANIFEST "Application.manifest" + +1 VERSIONINFO +FILEVERSION 1,4,0,0 +PRODUCTVERSION 1,4,0,0 +FILEOS VOS_NT_WINDOWS32 +#ifdef SAVETOOL_DEBUG_BUILD +FILEFLAGS VS_FF_DEBUG +#endif +FILETYPE VFT_APP +{ +BLOCK "StringFileInfo" +{ + BLOCK "080904B0" + { + VALUE "FileDescription", "M.A.S.S. Builder Save Tool" + VALUE "InternalName", "MassBuilderSaveTool.exe" + VALUE "OriginalFilename", "MassBuilderSaveTool.exe" + VALUE "CompanyName", "Guillaume Jacquemin" + VALUE "LegalCopyright", "Copyright \xA9 2021-2022 Guillaume Jacquemin." + VALUE "ProductName", "M.A.S.S. Builder Save Tool" + VALUE "FileVersion", "1.4.0.0" + VALUE "ProductVersion", "1.4.0.0" + } +} + +BLOCK "VarFileInfo" +{ + VALUE "Translation", 0x0809, 0x04B0 +} +} diff --git a/third-party/corrade b/third-party/corrade index dc4f2ea..e6b4d95 160000 --- a/third-party/corrade +++ b/third-party/corrade @@ -1 +1 @@ -Subproject commit dc4f2eac6814b37b5257d295c2838bcde95272aa +Subproject commit e6b4d952e757ab99a0b67e516235b7f91904dca0 diff --git a/third-party/imgui b/third-party/imgui index ddddabd..eda7792 160000 --- a/third-party/imgui +++ b/third-party/imgui @@ -1 +1 @@ -Subproject commit ddddabdccfdafffd8664fb4e29230dc4f848137e +Subproject commit eda7792b151d138e15df951578253b821ceed5a3 diff --git a/third-party/magnum b/third-party/magnum index 3fc9028..da5d2fa 160000 --- a/third-party/magnum +++ b/third-party/magnum @@ -1 +1 @@ -Subproject commit 3fc9028b5451aa95973f104d1ef2a1c0df589e64 +Subproject commit da5d2fa958f22844adaec90e894e85270ed0a631 diff --git a/third-party/magnum-integration b/third-party/magnum-integration index 323c23f..c6c759d 160000 --- a/third-party/magnum-integration +++ b/third-party/magnum-integration @@ -1 +1 @@ -Subproject commit 323c23f4e8e7cda9a7848c03401a3ba0a1de0bd4 +Subproject commit c6c759def2090a821a97763fc2e15ec06d0396ce