From 61d1e3635fba4acb1821be45703995c11a10cc54 Mon Sep 17 00:00:00 2001 From: William JCM Date: Fri, 11 Jun 2021 19:24:52 +0200 Subject: [PATCH] Add initial files. Feature parity is also reached. --- .gitmodules | 28 + CMakeLists.txt | 91 ++ README.md | 20 + modules/FindCorrade.cmake | 623 ++++++++ modules/FindImGui.cmake | 226 +++ modules/FindMagnum.cmake | 1269 +++++++++++++++++ modules/FindMagnumIntegration.cmake | 332 +++++ modules/FindSDL2.cmake | 285 ++++ src/Application.manifest | 14 + src/CMakeLists.txt | 72 + src/FontAwesome/IconsFontAwesome5.h | 1012 +++++++++++++ src/FontAwesome/IconsFontAwesome5Brands.h | 467 ++++++ src/Maps/LastMissionId.h | 49 + src/Maps/StoryProgress.h | 93 ++ src/Mass/Mass.cpp | 151 ++ src/Mass/Mass.h | 54 + src/MassBuilderManager/MassBuilderManager.cpp | 85 ++ src/MassBuilderManager/MassBuilderManager.h | 49 + src/MassManager/MassManager.cpp | 232 +++ src/MassManager/MassManager.h | 64 + src/Profile/Locators.h | 87 ++ src/Profile/Profile.cpp | 1003 +++++++++++++ src/Profile/Profile.h | 184 +++ src/ProfileManager/ProfileManager.cpp | 349 +++++ src/ProfileManager/ProfileManager.h | 71 + src/SaveTool/SaveTool.cpp | 506 +++++++ src/SaveTool/SaveTool.h | 168 +++ src/SaveTool/SaveTool_MainManager.cpp | 694 +++++++++ src/SaveTool/SaveTool_ProfileManager.cpp | 392 +++++ src/SaveTool/SaveTool_drawAbout.cpp | 295 ++++ src/SaveTool/SaveTool_drawMainMenu.cpp | 111 ++ src/assets.conf | 45 + src/assets/SourceCodePro-Regular.ttf | Bin 0 -> 192740 bytes src/assets/SourceSansPro-Regular.ttf | Bin 0 -> 269108 bytes src/assets/fa-brands-400.ttf | Bin 0 -> 134040 bytes src/assets/fa-solid-900.ttf | Bin 0 -> 202744 bytes src/main.cpp | 19 + src/mbst.ico | Bin 0 -> 65992 bytes src/mbst.png | Bin 0 -> 18277 bytes src/resource.rc | 19 + third-party/SDL | 1 + third-party/corrade | 1 + third-party/efsw | 1 + third-party/imgui | 1 + third-party/libzip | 1 + third-party/magnum | 1 + third-party/magnum-integration | 1 + 47 files changed, 9166 insertions(+) create mode 100644 .gitmodules create mode 100644 CMakeLists.txt create mode 100644 README.md create mode 100644 modules/FindCorrade.cmake create mode 100644 modules/FindImGui.cmake create mode 100644 modules/FindMagnum.cmake create mode 100644 modules/FindMagnumIntegration.cmake create mode 100644 modules/FindSDL2.cmake create mode 100644 src/Application.manifest create mode 100644 src/CMakeLists.txt create mode 100644 src/FontAwesome/IconsFontAwesome5.h create mode 100644 src/FontAwesome/IconsFontAwesome5Brands.h create mode 100644 src/Maps/LastMissionId.h create mode 100644 src/Maps/StoryProgress.h create mode 100644 src/Mass/Mass.cpp create mode 100644 src/Mass/Mass.h create mode 100644 src/MassBuilderManager/MassBuilderManager.cpp create mode 100644 src/MassBuilderManager/MassBuilderManager.h create mode 100644 src/MassManager/MassManager.cpp create mode 100644 src/MassManager/MassManager.h create mode 100644 src/Profile/Locators.h create mode 100644 src/Profile/Profile.cpp create mode 100644 src/Profile/Profile.h create mode 100644 src/ProfileManager/ProfileManager.cpp create mode 100644 src/ProfileManager/ProfileManager.h create mode 100644 src/SaveTool/SaveTool.cpp create mode 100644 src/SaveTool/SaveTool.h create mode 100644 src/SaveTool/SaveTool_MainManager.cpp create mode 100644 src/SaveTool/SaveTool_ProfileManager.cpp create mode 100644 src/SaveTool/SaveTool_drawAbout.cpp create mode 100644 src/SaveTool/SaveTool_drawMainMenu.cpp create mode 100644 src/assets.conf create mode 100644 src/assets/SourceCodePro-Regular.ttf create mode 100644 src/assets/SourceSansPro-Regular.ttf create mode 100644 src/assets/fa-brands-400.ttf create mode 100644 src/assets/fa-solid-900.ttf create mode 100644 src/main.cpp create mode 100644 src/mbst.ico create mode 100644 src/mbst.png create mode 100644 src/resource.rc create mode 160000 third-party/SDL create mode 160000 third-party/corrade create mode 160000 third-party/efsw create mode 160000 third-party/imgui create mode 160000 third-party/libzip create mode 160000 third-party/magnum create mode 160000 third-party/magnum-integration diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..cf03968 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,28 @@ +[submodule "corrade"] + path = third-party/corrade + url = https://github.com/mosra/corrade + branch = master +[submodule "magnum"] + path = third-party/magnum + url = https://github.com/mosra/magnum + branch = master +[submodule "magnum-integration"] + path = third-party/magnum-integration + url = https://github.com/mosra/magnum-integration + branch = master +[submodule "imgui"] + path = third-party/imgui + url = https://github.com/ocornut/imgui + branch = master +[submodule "SDL2"] + path = third-party/SDL + url = https://github.com/libsdl-org/SDL + branch = main +[submodule "libzip"] + path = third-party/libzip + url = https://github.com/nih-at/libzip + branch = master +[submodule "efsw"] + path = third-party/efsw + url = https://github.com/SpartanJ/efsw + branch = master diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..b0d0a34 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,91 @@ +# MassBuilderSaveTool +# Copyright (C) 2021 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 . + +cmake_minimum_required(VERSION 3.5) +project(MassBuilderSaveTool) + +set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/modules/" ${CMAKE_MODULE_PATH}) + +SET(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) + +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(WITH_INTERCONNECT ON CACHE BOOL "" FORCE) +set(WITH_PLUGINMANAGER ON CACHE BOOL "" FORCE) +set(WITH_TESTSUITE OFF CACHE BOOL "" FORCE) +set(WITH_MAIN ON CACHE BOOL "" FORCE) +add_subdirectory(third-party/corrade EXCLUDE_FROM_ALL) + +set(SDL_ATOMIC OFF CACHE BOOL "" FORCE) +set(SDL_CPUINFO OFF CACHE BOOL "" FORCE) +set(SDL_EVENTS ON CACHE BOOL "" FORCE) +set(SDL_FILE OFF CACHE BOOL "" FORCE) +set(SDL_FILESYSTEM OFF CACHE BOOL "" FORCE) +set(SDL_HAPTIC OFF CACHE BOOL "" FORCE) +set(SDL_LOCALE OFF CACHE BOOL "" FORCE) +set(SDL_POWER OFF CACHE BOOL "" FORCE) +set(SDL_RENDER OFF CACHE BOOL "" FORCE) +set(SDL_SENSOR OFF CACHE BOOL "" FORCE) +set(SDL_THREADS ON CACHE BOOL "" FORCE) +set(SDL_TIMERS ON CACHE BOOL "" FORCE) +set(SDL_SHARED OFF CACHE BOOL "" FORCE) +add_subdirectory(third-party/SDL EXCLUDE_FROM_ALL) + +set(TARGET_GL ON CACHE BOOL "" FORCE) +set(TARGET_GLES OFF CACHE BOOL "" FORCE) +set(TARGET_VK OFF CACHE BOOL "" FORCE) +set(WITH_AUDIO OFF CACHE BOOL "" FORCE) +set(WITH_DEBUGTOOLS OFF CACHE BOOL "" FORCE) +set(WITH_GL ON CACHE BOOL "" FORCE) +set(WITH_MESHTOOLS ON CACHE BOOL "" FORCE) +set(WITH_PRIMITIVES ON CACHE BOOL "" FORCE) +set(WITH_SCENEGRAPH ON CACHE BOOL "" FORCE) +set(WITH_SHADERS ON CACHE BOOL "" FORCE) +set(WITH_SHADERTOOLS OFF CACHE BOOL "" FORCE) +set(WITH_TEXT OFF CACHE BOOL "" FORCE) +set(WITH_TEXTURETOOLS OFF CACHE BOOL "" FORCE) +set(WITH_TRADE ON CACHE BOOL "" FORCE) +set(WITH_VK OFF CACHE BOOL "" FORCE) +set(WITH_SDL2APPLICATION ON CACHE BOOL "" FORCE) +add_subdirectory(third-party/magnum EXCLUDE_FROM_ALL) + +set(IMGUI_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third-party/imgui) +set(WITH_IMGUI ON CACHE BOOL "" FORCE) +add_subdirectory(third-party/magnum-integration EXCLUDE_FROM_ALL) + +set(ENABLE_COMMONCRYPTO OFF CACHE BOOL "" FORCE) +set(ENABLE_GNUTLS OFF CACHE BOOL "" FORCE) +set(ENABLE_MBEDTLS OFF CACHE BOOL "" FORCE) +set(ENABLE_OPENSSL OFF CACHE BOOL "" FORCE) +set(ENABLE_WINDOWS_CRYPTO OFF CACHE BOOL "" FORCE) +set(ENABLE_BZIP2 OFF CACHE BOOL "" FORCE) +set(ENABLE_LZMA OFF CACHE BOOL "" FORCE) +set(ENABLE_ZSTD OFF CACHE BOOL "" FORCE) +set(BUILD_TOOLS OFF CACHE BOOL "" FORCE) +set(BUILD_REGRESS OFF CACHE BOOL "" FORCE) +set(BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) +set(BUILD_DOC OFF CACHE BOOL "" FORCE) +set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE) +add_subdirectory(third-party/libzip EXCLUDE_FROM_ALL) + +set(VERBOSE OFF CACHE BOOL "" FORCE) +set(BUILD_TEST_APP OFF CACHE BOOL "" FORCE) +set(EFSW_INSTALL OFF CACHE BOOL "" FORCE) +add_subdirectory(third-party/efsw EXCLUDE_FROM_ALL) + +add_subdirectory(src) diff --git a/README.md b/README.md new file mode 100644 index 0000000..5e388a3 --- /dev/null +++ b/README.md @@ -0,0 +1,20 @@ +# M.A.S.S. Builder Save Tool + +A save file manager and editor for M.A.S.S. Builder. Based on [wxMASSManager](https://github.com/williamjcm/wxMASSManager), this is a fork using Magnum and ImGui for the UI. + +## Installing + +Get the `MassBuilderSaveTool-.zip` file from the [Releases](https://github.com/williamjcm/MassBuilderSaveTool/releases) page, 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`. +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`. diff --git a/modules/FindCorrade.cmake b/modules/FindCorrade.cmake new file mode 100644 index 0000000..9a36cce --- /dev/null +++ b/modules/FindCorrade.cmake @@ -0,0 +1,623 @@ +#.rst: +# Find Corrade +# ------------ +# +# Finds the Corrade library. Basic usage:: +# +# find_package(Corrade REQUIRED) +# +# This module tries to find the base Corrade library and then defines the +# following: +# +# Corrade_FOUND - Whether the base library was found +# CORRADE_LIB_SUFFIX_MODULE - Path to CorradeLibSuffix.cmake module +# +# This command will try to find only the base library, not the optional +# components, which are: +# +# Containers - Containers library +# PluginManager - PluginManager library +# TestSuite - TestSuite library +# Utility - Utility library +# rc - corrade-rc executable +# +# Example usage with specifying additional components is:: +# +# find_package(Corrade REQUIRED Utility TestSuite) +# +# For each component is then defined: +# +# Corrade_*_FOUND - Whether the component was found +# Corrade::* - Component imported target +# +# The package is found if either debug or release version of each library is +# found. If both debug and release libraries are found, proper version is +# chosen based on actual build configuration of the project (i.e. Debug build +# is linked to debug libraries, Release build to release libraries). +# +# Corrade conditionally defines ``CORRADE_IS_DEBUG_BUILD`` preprocessor +# variable in case build configuration is ``Debug`` (not Corrade itself, but +# build configuration of the project using it). Useful e.g. for selecting +# proper plugin directory. +# +# Corrade defines the following custom target properties: +# +# CORRADE_CXX_STANDARD - C++ standard to require when compiling given +# target. Does nothing if :variable:`CMAKE_CXX_FLAGS` already contains +# particular standard setting flag or if given target contains +# :prop_tgt:`CMAKE_CXX_STANDARD` property. Allowed value is 11, 14 or 17. +# INTERFACE_CORRADE_CXX_STANDARD - C++ standard to require when using given +# target. Does nothing if :variable:`CMAKE_CXX_FLAGS` already contains +# particular standard setting flag or if given target contains +# :prop_tgt:`CMAKE_CXX_STANDARD` property. Allowed value is 11, 14 or 17. +# CORRADE_USE_PEDANTIC_FLAGS - Enable additional compiler/linker flags. +# Boolean. +# +# These properties are inherited from directory properties, meaning that if you +# set them on directories, they get implicitly set on all targets in given +# directory (with a possibility to do target-specific overrides). All Corrade +# libraries have the :prop_tgt:`INTERFACE_CORRADE_CXX_STANDARD` property set to +# 11, meaning that you will always have at least C++11 enabled once you link to +# any Corrade library. +# +# Features of found Corrade library are exposed in these variables: +# +# CORRADE_MSVC2019_COMPATIBILITY - Defined if compiled with compatibility +# mode for MSVC 2019 +# CORRADE_MSVC2017_COMPATIBILITY - Defined if compiled with compatibility +# mode for MSVC 2017 +# CORRADE_MSVC2015_COMPATIBILITY - Defined if compiled with compatibility +# mode for MSVC 2015 +# CORRADE_BUILD_DEPRECATED - Defined if compiled with deprecated APIs +# included +# CORRADE_BUILD_STATIC - Defined if compiled as static libraries. +# Default are shared libraries. +# CORRADE_BUILD_STATIC_UNIQUE_GLOBALS - Defined if static libraries keep their +# globals unique even across different shared libraries. Enabled by default +# for static builds. +# CORRADE_BUILD_MULTITHREADED - Defined if compiled in a way that makes it +# possible to safely use certain Corrade features simultaneously in multiple +# threads +# CORRADE_TARGET_UNIX - Defined if compiled for some Unix flavor +# (Linux, BSD, macOS) +# CORRADE_TARGET_APPLE - Defined if compiled for Apple platforms +# CORRADE_TARGET_IOS - Defined if compiled for iOS (device or +# simulator) +# CORRADE_TARGET_IOS_SIMULATOR - Defined if compiled for iOS Simulator +# CORRADE_TARGET_WINDOWS - Defined if compiled for Windows +# CORRADE_TARGET_WINDOWS_RT - Defined if compiled for Windows RT +# CORRADE_TARGET_EMSCRIPTEN - Defined if compiled for Emscripten +# CORRADE_TARGET_ANDROID - Defined if compiled for Android +# CORRADE_TARGET_GCC - Defined if compiling with GCC or GCC- +# compatible Clang +# CORRADE_TARGET_CLANG - Defined if compiling with Clang or any of its +# variants +# CORRADE_TARGET_APPLE_CLANG - Defined if compiling with Apple's Clang +# CORRADE_TARGET_CLANG_CL - Defined if compiling with Clang-CL (Clang +# with a MSVC frontend) +# CORRADE_TARGET_MSVC - Defined if compiling with MSVC or Clang with +# a MSVC frontend +# CORRADE_TARGET_MINGW - Defined if compiling under MinGW +# CORRADE_PLUGINMANAGER_NO_DYNAMIC_PLUGIN_SUPPORT - Defined if PluginManager +# doesn't support dynamic plugin loading due to platform limitations +# CORRADE_TESTSUITE_TARGET_XCTEST - Defined if TestSuite is targetting Xcode +# XCTest +# CORRADE_UTILITY_USE_ANSI_COLORS - Defined if ANSI escape sequences are used +# for colored output with Utility::Debug on Windows +# +# Additionally these variables are defined for internal usage: +# +# CORRADE_INCLUDE_DIR - Root include dir +# CORRADE_*_LIBRARY_DEBUG - Debug version of given library, if found +# CORRADE_*_LIBRARY_RELEASE - Release version of given library, if found +# CORRADE_*_EXECUTABLE - Location of given executable, if found +# CORRADE_USE_MODULE - Path to UseCorrade.cmake module (included +# automatically) +# CORRADE_TESTSUITE_XCTEST_RUNNER - Path to XCTestRunner.mm.in file +# CORRADE_TESTSUITE_ADB_RUNNER - Path to AdbRunner.sh file +# CORRADE_PEDANTIC_COMPILER_OPTIONS - List of pedantic compiler options used +# for targets with :prop_tgt:`CORRADE_USE_PEDANTIC_FLAGS` enabled +# CORRADE_PEDANTIC_COMPILER_DEFINITIONS - List of pedantic compiler +# definitions used for targets with :prop_tgt:`CORRADE_USE_PEDANTIC_FLAGS` +# enabled +# CORRADE_CXX{11,14,17,20}_STANDARD_FLAG - Compiler flag to use for targeting +# C++11, 14, 17 or 20 in cases where it's not possible to use +# :prop_tgt:`CORRADE_CXX_STANDARD`. Not defined if a standard switch is +# already present in :variable:`CMAKE_CXX_FLAGS`. +# +# Corrade provides these macros and functions: +# +# .. command:: corrade_add_test +# +# Add unit test using Corrade's TestSuite:: +# +# corrade_add_test( +# ... +# [LIBRARIES ...] +# [FILES ...] +# [ARGUMENTS ...]) +# +# Test name is also executable name. You can use ``LIBRARIES`` to specify +# libraries to link with instead of using :command:`target_link_libraries()`. +# The ``Corrade::TestSuite`` target is linked automatically to each test. Note +# that the :command:`enable_testing()` function must be called explicitly. +# Arguments passed after ``ARGUMENTS`` will be appended to the test +# command line. ``ARGUMENTS`` are supported everywhere except when +# ``CORRADE_TESTSUITE_TARGET_XCTEST`` is enabled. +# +# You can list files needed by the test in the ``FILES`` section. If given +# filename is relative, it is treated relatively to `CMAKE_CURRENT_SOURCE_DIR`. +# The files are added to the :prop_test:`REQUIRED_FILES` target property. On +# Emscripten they are bundled to the executable and available in the virtual +# filesystem root. On Android they are copied along the executable to the +# target. In case of Emscripten and Android, if the file is absolute or +# contains ``..``, only the leaf name is used. Alternatively you can have a +# filename formatted as ``@``, in which case the ```` is +# treated as local filesystem location and ```` as remote/virtual +# filesystem location. The remote location can't be absolute or contain ``..`` +# / ``@`` characters. +# +# Unless :variable:`CORRADE_TESTSUITE_TARGET_XCTEST` is set, test cases on iOS +# targets are created as bundles with bundle identifier set to CMake project +# name by default. Use the cache variable :variable:`CORRADE_TESTSUITE_BUNDLE_IDENTIFIER_PREFIX` +# to change it to something else. +# +# .. command:: corrade_add_resource +# +# Compile data resources into application binary:: +# +# corrade_add_resource( ) +# +# Depends on ``Corrade::rc``, which is part of Corrade utilities. This command +# generates resource data using given configuration file in current build +# directory. Argument name is name under which the resources can be explicitly +# loaded. Variable ```` contains compiled resource filename, which is +# then used for compiling library / executable. On CMake >= 3.1 the +# `resources.conf` file can contain UTF-8-encoded filenames. Example usage:: +# +# corrade_add_resource(app_resources resources.conf) +# add_executable(app source1 source2 ... ${app_resources}) +# +# .. command:: corrade_add_plugin +# +# Add dynamic plugin:: +# +# corrade_add_plugin( +# ";" +# ";" +# +# ...) +# +# The macro adds a preprocessor directive ``CORRADE_DYNAMIC_PLUGIN`` when +# compiling ````. Additional libraries can be linked in via +# :command:`target_link_libraries(plugin_name ...) `. +# On DLL platforms, the plugin DLLs and metadata files are put into +# ```` / ```` and the +# ``*.lib`` files into ```` / +# ````. On non-DLL platforms everything is put +# into ```` / ````. +# +# If the plugin interface disables plugin metadata files, the +# ```` can be set to ``""``, in which case no metadata file is +# copied anywhere. Otherwise the metadata file is copied and renamed to +# ````, retaining its original extension. +# +# corrade_add_plugin( +# +# +# +# ...) +# +# Unline the above version this puts everything into ```` on +# both DLL and non-DLL platforms. If ```` is set to +# :variable:`CMAKE_CURRENT_BINARY_DIR` (e.g. for testing purposes), the files +# are copied directly, without the need to perform install step. Note that the +# files are actually put into configuration-based subdirectory, i.e. +# ``${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}``. See documentation of +# :variable:`CMAKE_CFG_INTDIR` variable for more information. +# +# .. command:: corrade_add_static_plugin +# +# Add static plugin:: +# +# corrade_add_static_plugin( +# ";" +# +# ...) +# +# The macro adds a preprocessor directive ``CORRADE_STATIC_PLUGIN`` when +# compiling ````. Additional libraries can be linked in via +# :command:`target_link_libraries(plugin_name ...) `. +# The ```` is ignored and included just for compatibility +# with the :command:`corrade_add_plugin` command, everything is installed into +# ````. Note that plugins built in debug configuration +# (e.g. with :variable:`CMAKE_BUILD_TYPE` set to ``Debug``) have ``"-d"`` +# suffix to make it possible to have both debug and release plugins installed +# alongside each other. +# +# If the plugin interface disables plugin metadata files, the +# ```` can be set to ``""``, in which case no metadata file is +# used. Otherwise the metadata file is bundled and renamed to +# ````, retaining its original extension. +# +# corrade_add_static_plugin( +# +# +# ...) +# +# Equivalent to the above with ```` set to ````. +# If ```` is set to :variable:`CMAKE_CURRENT_BINARY_DIR` (e.g. for +# testing purposes), no installation rules are added. +# +# .. command:: corrade_find_dlls_for_libs +# +# Find corresponding DLLs for library files:: +# +# corrade_find_dlls_for_libs( ...) +# +# Available only on Windows, for all ``*.lib`` files tries to find +# corresponding DLL file. Useful for bundling dependencies for e.g. WinRT +# packages. +# + +# +# This file is part of Corrade. +# +# Copyright © 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, +# 2017, 2018, 2019, 2020, 2021 +# Vladimír Vondruš +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. +# + +# Root include dir +find_path(CORRADE_INCLUDE_DIR + NAMES Corrade/Corrade.h) +mark_as_advanced(CORRADE_INCLUDE_DIR) + +# Configuration file +find_file(_CORRADE_CONFIGURE_FILE configure.h + HINTS ${CORRADE_INCLUDE_DIR}/Corrade/) +mark_as_advanced(_CORRADE_CONFIGURE_FILE) + +# We need to open configure.h file from CORRADE_INCLUDE_DIR before we check for +# the components. Bail out with proper error message if it wasn't found. The +# complete check with all components is further below. +if(NOT CORRADE_INCLUDE_DIR) + include(FindPackageHandleStandardArgs) + find_package_handle_standard_args(Corrade + REQUIRED_VARS CORRADE_INCLUDE_DIR _CORRADE_CONFIGURE_FILE) +endif() + +# Read flags from configuration +file(READ ${_CORRADE_CONFIGURE_FILE} _corradeConfigure) +string(REGEX REPLACE ";" "\\\\;" _corradeConfigure "${_corradeConfigure}") +string(REGEX REPLACE "\n" ";" _corradeConfigure "${_corradeConfigure}") +set(_corradeFlags + MSVC2015_COMPATIBILITY + MSVC2017_COMPATIBILITY + MSVC2019_COMPATIBILITY + BUILD_DEPRECATED + BUILD_STATIC + BUILD_STATIC_UNIQUE_GLOBALS + BUILD_MULTITHREADED + TARGET_UNIX + TARGET_APPLE + TARGET_IOS + TARGET_IOS_SIMULATOR + TARGET_WINDOWS + TARGET_WINDOWS_RT + TARGET_EMSCRIPTEN + TARGET_ANDROID + # TARGET_X86 etc and TARGET_LIBCXX are not exposed to CMake as the meaning + # is unclear on platforms with multi-arch binaries or when mixing different + # STL implementations. TARGET_GCC etc are figured out via UseCorrade.cmake, + # as the compiler can be different when compiling the lib & when using it. + PLUGINMANAGER_NO_DYNAMIC_PLUGIN_SUPPORT + TESTSUITE_TARGET_XCTEST + UTILITY_USE_ANSI_COLORS) +foreach(_corradeFlag ${_corradeFlags}) + list(FIND _corradeConfigure "#define CORRADE_${_corradeFlag}" _corrade_${_corradeFlag}) + if(NOT _corrade_${_corradeFlag} EQUAL -1) + set(CORRADE_${_corradeFlag} 1) + endif() +endforeach() + +# CMake module dir +find_path(_CORRADE_MODULE_DIR + NAMES UseCorrade.cmake CorradeLibSuffix.cmake + PATH_SUFFIXES share/cmake/Corrade) +mark_as_advanced(_CORRADE_MODULE_DIR) + +set(CORRADE_USE_MODULE ${_CORRADE_MODULE_DIR}/UseCorrade.cmake) +set(CORRADE_LIB_SUFFIX_MODULE ${_CORRADE_MODULE_DIR}/CorradeLibSuffix.cmake) + +# Component distinction (listing them explicitly to avoid mistakes with finding +# unknown components) +set(_CORRADE_LIBRARY_COMPONENTS + Containers Interconnect Main PluginManager TestSuite Utility) +set(_CORRADE_HEADER_ONLY_COMPONENTS Containers) +if(NOT CORRADE_TARGET_WINDOWS) + # CorradeMain is a real library only on windows, a dummy target elsewhere + list(APPEND _CORRADE_HEADER_ONLY_COMPONENTS Main) +endif() +set(_CORRADE_EXECUTABLE_COMPONENTS rc) +# Currently everything is enabled implicitly. Keep in sync with Corrade's root +# CMakeLists.txt. +set(_CORRADE_IMPLICITLY_ENABLED_COMPONENTS + Containers Interconnect Main PluginManager TestSuite Utility rc) + +# Inter-component dependencies +set(_CORRADE_Containers_DEPENDENCIES Utility) +set(_CORRADE_Interconnect_DEPENDENCIES Containers Utility) +set(_CORRADE_PluginManager_DEPENDENCIES Containers Utility rc) +set(_CORRADE_TestSuite_DEPENDENCIES Containers Utility Main) # see below +set(_CORRADE_Utility_DEPENDENCIES Containers rc) + +# Ensure that all inter-component dependencies are specified as well +foreach(_component ${Corrade_FIND_COMPONENTS}) + # Mark the dependencies as required if the component is also required + if(Corrade_FIND_REQUIRED_${_component}) + foreach(_dependency ${_CORRADE_${_component}_DEPENDENCIES}) + set(Corrade_FIND_REQUIRED_${_dependency} TRUE) + endforeach() + endif() + + list(APPEND _CORRADE_ADDITIONAL_COMPONENTS ${_CORRADE_${_component}_DEPENDENCIES}) +endforeach() + +# Main is linked only in corrade_add_test(), not to everything that depends on +# TestSuite, so remove it from the list again once we filled the above +# variables +set(_CORRADE_TestSuite_DEPENDENCIES Containers Utility) + +# Join the lists, remove duplicate components +set(_CORRADE_ORIGINAL_FIND_COMPONENTS ${Corrade_FIND_COMPONENTS}) +if(_CORRADE_ADDITIONAL_COMPONENTS) + list(INSERT Corrade_FIND_COMPONENTS 0 ${_CORRADE_ADDITIONAL_COMPONENTS}) +endif() +if(Corrade_FIND_COMPONENTS) + list(REMOVE_DUPLICATES Corrade_FIND_COMPONENTS) +endif() + +# Find all components +foreach(_component ${Corrade_FIND_COMPONENTS}) + string(TOUPPER ${_component} _COMPONENT) + + # Create imported target in case the library is found. If the project is + # added as subproject to CMake, the target already exists and all the + # required setup is already done from the build tree. + if(TARGET Corrade::${_component}) + set(Corrade_${_component}_FOUND TRUE) + else() + # Library (and not header-only) components + if(_component IN_LIST _CORRADE_LIBRARY_COMPONENTS AND NOT _component IN_LIST _CORRADE_HEADER_ONLY_COMPONENTS) + add_library(Corrade::${_component} UNKNOWN IMPORTED) + + # Try to find both debug and release version + find_library(CORRADE_${_COMPONENT}_LIBRARY_DEBUG Corrade${_component}-d) + find_library(CORRADE_${_COMPONENT}_LIBRARY_RELEASE Corrade${_component}) + mark_as_advanced(CORRADE_${_COMPONENT}_LIBRARY_DEBUG + CORRADE_${_COMPONENT}_LIBRARY_RELEASE) + + if(CORRADE_${_COMPONENT}_LIBRARY_RELEASE) + set_property(TARGET Corrade::${_component} APPEND PROPERTY + IMPORTED_CONFIGURATIONS RELEASE) + set_property(TARGET Corrade::${_component} PROPERTY + IMPORTED_LOCATION_RELEASE ${CORRADE_${_COMPONENT}_LIBRARY_RELEASE}) + endif() + + if(CORRADE_${_COMPONENT}_LIBRARY_DEBUG) + set_property(TARGET Corrade::${_component} APPEND PROPERTY + IMPORTED_CONFIGURATIONS DEBUG) + set_property(TARGET Corrade::${_component} PROPERTY + IMPORTED_LOCATION_DEBUG ${CORRADE_${_COMPONENT}_LIBRARY_DEBUG}) + endif() + endif() + + # Header-only library components + if(_component IN_LIST _CORRADE_HEADER_ONLY_COMPONENTS) + add_library(Corrade::${_component} INTERFACE IMPORTED) + endif() + + # Default include path names to look for for library / header-only + # components + if(_component IN_LIST _CORRADE_LIBRARY_COMPONENTS) + set(_CORRADE_${_COMPONENT}_INCLUDE_PATH_SUFFIX Corrade/${_component}) + set(_CORRADE_${_COMPONENT}_INCLUDE_PATH_NAMES ${_component}.h) + endif() + + # Executable components + if(_component IN_LIST _CORRADE_EXECUTABLE_COMPONENTS) + add_executable(Corrade::${_component} IMPORTED) + + find_program(CORRADE_${_COMPONENT}_EXECUTABLE corrade-${_component}) + mark_as_advanced(CORRADE_${_COMPONENT}_EXECUTABLE) + + if(CORRADE_${_COMPONENT}_EXECUTABLE) + set_property(TARGET Corrade::${_component} PROPERTY + IMPORTED_LOCATION ${CORRADE_${_COMPONENT}_EXECUTABLE}) + endif() + endif() + + # No special setup for Containers library + + # Interconnect library + if(_component STREQUAL Interconnect) + # Disable /OPT:ICF on MSVC, which merges functions with identical + # contents and thus breaks signal comparison + if(CORRADE_TARGET_WINDOWS AND CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") + if(CMAKE_VERSION VERSION_LESS 3.13) + set_property(TARGET Corrade::${_component} PROPERTY + INTERFACE_LINK_LIBRARIES "-OPT:NOICF,REF") + else() + set_property(TARGET Corrade::${_component} PROPERTY + INTERFACE_LINK_OPTIONS "/OPT:NOICF,REF") + endif() + endif() + + # Main library + elseif(_component STREQUAL Main) + set(_CORRADE_${_COMPONENT}_INCLUDE_PATH_SUFFIX Corrade) + set(_CORRADE_${_COMPONENT}_INCLUDE_PATH_NAMES Corrade.h) + + if(CORRADE_TARGET_WINDOWS) + if(NOT MINGW) + # Abusing INTERFACE_LINK_LIBRARIES because + # INTERFACE_LINK_OPTIONS is only since 3.13. They treat + # things with `-` in front as linker flags and fortunately + # I can use `-ENTRY` instead of `/ENTRY`. + # https://gitlab.kitware.com/cmake/cmake/issues/16543 + set_property(TARGET Corrade::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES "-ENTRY:$<$>>:wmainCRTStartup>$<$>:wWinMainCRTStartup>") + else() + set_property(TARGET Corrade::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES "-municode") + endif() + endif() + + # PluginManager library + elseif(_component STREQUAL PluginManager) + # -ldl is handled by Utility now + + # TestSuite library has some additional files + elseif(_component STREQUAL TestSuite) + # XCTest runner file + if(CORRADE_TESTSUITE_TARGET_XCTEST) + find_file(CORRADE_TESTSUITE_XCTEST_RUNNER XCTestRunner.mm.in + PATH_SUFFIXES share/corrade/TestSuite) + set(CORRADE_TESTSUITE_XCTEST_RUNNER_NEEDED CORRADE_TESTSUITE_XCTEST_RUNNER) + + # ADB runner file + elseif(CORRADE_TARGET_ANDROID) + find_file(CORRADE_TESTSUITE_ADB_RUNNER AdbRunner.sh + PATH_SUFFIXES share/corrade/TestSuite) + set(CORRADE_TESTSUITE_ADB_RUNNER_NEEDED CORRADE_TESTSUITE_ADB_RUNNER) + + # Emscripten runner file + elseif(CORRADE_TARGET_EMSCRIPTEN) + find_file(CORRADE_TESTSUITE_EMSCRIPTEN_RUNNER EmscriptenRunner.html.in + PATH_SUFFIXES share/corrade/TestSuite) + set(CORRADE_TESTSUITE_EMSCRIPTEN_RUNNER_NEEDED CORRADE_TESTSUITE_EMSCRIPTEN_RUNNER) + endif() + + # Utility library (contains all setup that is used by others) + elseif(_component STREQUAL Utility) + # Top-level include directory + set_property(TARGET Corrade::${_component} APPEND PROPERTY + INTERFACE_INCLUDE_DIRECTORIES ${CORRADE_INCLUDE_DIR}) + + # Require (at least) C++11 for users + set_property(TARGET Corrade::${_component} PROPERTY + INTERFACE_CORRADE_CXX_STANDARD 11) + set_property(TARGET Corrade::${_component} APPEND PROPERTY + COMPATIBLE_INTERFACE_NUMBER_MAX CORRADE_CXX_STANDARD) + + # Directory::libraryLocation() needs this + if(CORRADE_TARGET_UNIX) + set_property(TARGET Corrade::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES ${CMAKE_DL_LIBS}) + endif() + # AndroidLogStreamBuffer class needs to be linked to log library + if(CORRADE_TARGET_ANDROID) + set_property(TARGET Corrade::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES "log") + endif() + endif() + + # Find library includes + if(_component IN_LIST _CORRADE_LIBRARY_COMPONENTS) + find_path(_CORRADE_${_COMPONENT}_INCLUDE_DIR + NAMES ${_CORRADE_${_COMPONENT}_INCLUDE_PATH_NAMES} + HINTS ${CORRADE_INCLUDE_DIR}/${_CORRADE_${_COMPONENT}_INCLUDE_PATH_SUFFIX}) + mark_as_advanced(_CORRADE_${_COMPONENT}_INCLUDE_DIR) + endif() + + # Add inter-library dependencies + if(_component IN_LIST _CORRADE_LIBRARY_COMPONENTS OR _component IN_LIST _CORRADE_HEADER_ONLY_COMPONENTS) + foreach(_dependency ${_CORRADE_${_component}_DEPENDENCIES}) + if(_dependency IN_LIST _CORRADE_LIBRARY_COMPONENTS OR _dependency IN_LIST _CORRADE_HEADER_ONLY_COMPONENTS) + set_property(TARGET Corrade::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES Corrade::${_dependency}) + endif() + endforeach() + endif() + + # Decide if the component was found + if((_component IN_LIST _CORRADE_LIBRARY_COMPONENTS AND _CORRADE_${_COMPONENT}_INCLUDE_DIR AND (_component IN_LIST _CORRADE_HEADER_ONLY_COMPONENTS OR CORRADE_${_COMPONENT}_LIBRARY_RELEASE OR CORRADE_${_COMPONENT}_LIBRARY_DEBUG)) OR (_component IN_LIST _CORRADE_EXECUTABLE_COMPONENTS AND CORRADE_${_COMPONENT}_EXECUTABLE)) + set(Corrade_${_component}_FOUND TRUE) + else() + set(Corrade_${_component}_FOUND FALSE) + endif() + endif() +endforeach() + +# For CMake 3.16+ with REASON_FAILURE_MESSAGE, provide additional potentially +# useful info about the failed components. +if(NOT CMAKE_VERSION VERSION_LESS 3.16) + set(_CORRADE_REASON_FAILURE_MESSAGE ) + # Go only through the originally specified find_package() components, not + # the dependencies added by us afterwards + foreach(_component ${_CORRADE_ORIGINAL_FIND_COMPONENTS}) + if(Corrade_${_component}_FOUND) + continue() + endif() + + # If it's not known at all, tell the user -- it might be a new library + # and an old Find module, or something platform-specific. + if(NOT _component IN_LIST _CORRADE_LIBRARY_COMPONENTS AND NOT _component IN_LIST _CORRADE_EXECUTABLE_COMPONENTS) + list(APPEND _CORRADE_REASON_FAILURE_MESSAGE "${_component} is not a known component on this platform.") + # Otherwise, if it's not among implicitly built components, hint that + # the user may need to enable it. + # TODO: currently, the _FOUND variable doesn't reflect if dependencies + # were found. When it will, this needs to be updated to avoid + # misleading messages. + elseif(NOT _component IN_LIST _CORRADE_IMPLICITLY_ENABLED_COMPONENTS) + string(TOUPPER ${_component} _COMPONENT) + list(APPEND _CORRADE_REASON_FAILURE_MESSAGE "${_component} is not built by default. Make sure you enabled WITH_${_COMPONENT} when building Corrade.") + # Otherwise we have no idea. Better be silent than to print something + # misleading. + else() + endif() + endforeach() + + string(REPLACE ";" " " _CORRADE_REASON_FAILURE_MESSAGE "${_CORRADE_REASON_FAILURE_MESSAGE}") + set(_CORRADE_REASON_FAILURE_MESSAGE REASON_FAILURE_MESSAGE "${_CORRADE_REASON_FAILURE_MESSAGE}") +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Corrade REQUIRED_VARS + CORRADE_INCLUDE_DIR + _CORRADE_MODULE_DIR + _CORRADE_CONFIGURE_FILE + ${CORRADE_TESTSUITE_XCTEST_RUNNER_NEEDED} + ${CORRADE_TESTSUITE_ADB_RUNNER_NEEDED} + ${CORRADE_TESTSUITE_EMSCRIPTEN_RUNNER_NEEDED} + HANDLE_COMPONENTS + ${_CORRADE_REASON_FAILURE_MESSAGE}) + +# Finalize the finding process +include(${CORRADE_USE_MODULE}) + +set(CORRADE_INCLUDE_INSTALL_DIR include/Corrade) + +if(CORRADE_BUILD_DEPRECATED AND CORRADE_INCLUDE_INSTALL_PREFIX AND NOT CORRADE_INCLUDE_INSTALL_PREFIX STREQUAL ".") + message(DEPRECATION "CORRADE_INCLUDE_INSTALL_PREFIX is obsolete as its primary use was for old Android NDK versions. Please switch to the NDK r19+ layout instead of using this variable and recreate your build directory to get rid of this warning.") + set(CORRADE_INCLUDE_INSTALL_DIR ${CORRADE_INCLUDE_INSTALL_PREFIX}/${CORRADE_INCLUDE_INSTALL_DIR}) +endif() diff --git a/modules/FindImGui.cmake b/modules/FindImGui.cmake new file mode 100644 index 0000000..14f0e67 --- /dev/null +++ b/modules/FindImGui.cmake @@ -0,0 +1,226 @@ +#.rst: +# Find ImGui +# ------------- +# +# Finds the ImGui library. This module defines: +# +# ImGui_FOUND - True if ImGui is found +# ImGui::ImGui - ImGui interface target +# ImGui::Sources - ImGui source target for core functionality +# ImGui::SourcesMiscCpp - ImGui source target for misc/cpp +# +# Additionally these variables are defined for internal usage: +# +# ImGui_INCLUDE_DIR - Include dir +# +# The find module first tries to find ``imgui`` via a CMake config file (which +# is distributed this way via Vcpkg, for example). If that's found, the +# ``ImGui::ImGui`` target is an alias to it and the ``ImGui::Sources`` target +# is empty except for having ``ImGui::ImGui`` as a dependency. +# +# If ``imgui`` is not found, as a fallback it tries to find the C++ sources. +# You can supply their location via an ``IMGUI_DIR`` variable. Once found, the +# ``ImGui::ImGui`` target contains just the header file, while +# ``ImGui::Sources`` contains the source files in ``INTERFACE_SOURCES``. +# +# The ``ImGui::SourcesMiscCpp`` component, if requested, is always searched for +# in the form of C++ sources. Vcpkg doesn't distribute these. +# +# The desired usage that covers both cases is to link ``ImGui::Sources`` +# ``PRIVATE``\ ly to a *single* target, which will then contain either the +# sources or be linked to the imgui library from Vcpkg; and linking +# ``ImGui::ImGui`` to this target ``PUBLIC``\ ly. +# + +# +# This file is part of Magnum. +# +# Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, +# 2020, 2021 Vladimír Vondruš +# Copyright © 2018 Jonathan Hale +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. +# + +# In 1.71 ImGui depends on the ApplicationServices framework for macOS +# clipboard support. It's removed again in 1.72. TODO: remove once obsolete +if(CORRADE_TARGET_APPLE) + find_library(_IMGUI_ApplicationServices_LIBRARY ApplicationServices) + mark_as_advanced(_IMGUI_ApplicationServices_LIBRARY) + set(_IMGUI_EXTRA_LIBRARIES ${_IMGUI_ApplicationServices_LIBRARY}) +endif() + +# Vcpkg distributes imgui as a library with a config file, so try that first -- +# but only if IMGUI_DIR wasn't explicitly passed, in which case we'll look +# there instead +if(NOT IMGUI_DIR AND NOT TARGET imgui::imgui) + find_package(imgui CONFIG QUIET) +endif() +if(NOT IMGUI_DIR AND TARGET imgui::imgui) + if(NOT TARGET ImGui::ImGui) + add_library(ImGui::ImGui INTERFACE IMPORTED) + # TODO: remove once 1.71 is obsolete + set_property(TARGET ImGui::ImGui APPEND PROPERTY + INTERFACE_LINK_LIBRARIES imgui::imgui ${_IMGUI_EXTRA_LIBRARIES}) + + # Retrieve include directory for FindPackageHandleStandardArgs later + get_target_property(ImGui_INCLUDE_DIR imgui::imgui + INTERFACE_INCLUDE_DIRECTORIES) + + add_library(ImGui::Sources INTERFACE IMPORTED) + set_property(TARGET ImGui::Sources APPEND PROPERTY + INTERFACE_LINK_LIBRARIES ImGui::ImGui) + endif() + +# Otherwise find the source files and compile them as part of the library they +# get linked to +else() + # Disable the find root path here, it overrides the + # CMAKE_FIND_ROOT_PATH_MODE_INCLUDE setting potentially set in + # toolchains. + find_path(ImGui_INCLUDE_DIR NAMES imgui.h + HINTS ${IMGUI_DIR} + PATH_SUFFIXES MagnumExternal/ImGui + NO_CMAKE_FIND_ROOT_PATH) + mark_as_advanced(ImGui_INCLUDE_DIR) + + if(NOT TARGET ImGui::ImGui) + add_library(ImGui::ImGui INTERFACE IMPORTED) + set_property(TARGET ImGui::ImGui APPEND PROPERTY + INTERFACE_INCLUDE_DIRECTORIES ${ImGui_INCLUDE_DIR}) + # TODO: remove once 1.71 is obsolete + if(_IMGUI_EXTRA_LIBRARIES) + set_property(TARGET ImGui::ImGui APPEND PROPERTY + INTERFACE_LINK_LIBRARIES ${_IMGUI_EXTRA_LIBRARIES}) + endif() + + # Handle export and import of imgui symbols via IMGUI_API definition + # in visibility.h of Magnum ImGuiIntegration. + set_property(TARGET ImGui::ImGui APPEND PROPERTY INTERFACE_COMPILE_DEFINITIONS + "IMGUI_USER_CONFIG=\"Magnum/ImGuiIntegration/visibility.h\"") + endif() +endif() + +macro(_imgui_setup_source_file source_var) + # Handle export and import of imgui symbols via IMGUI_API + # definition in visibility.h of Magnum ImGuiIntegration. + set_property(SOURCE ${${source_var}} APPEND PROPERTY COMPILE_DEFINITIONS + "IMGUI_USER_CONFIG=\"Magnum/ImGuiIntegration/visibility.h\"") + + # Hide warnings from imgui source files + + # GCC- and Clang-specific flags + if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR (CMAKE_CXX_COMPILER_ID MATCHES "(Apple)?Clang" + AND NOT CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC") OR CORRADE_TARGET_EMSCRIPTEN) + set_property(SOURCE ${${source_var}} APPEND_STRING PROPERTY COMPILE_FLAGS + " -Wno-old-style-cast") + endif() + + # GCC-specific flags + if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + set_property(SOURCE ${${source_var}} APPEND_STRING PROPERTY COMPILE_FLAGS + " -Wno-double-promotion -Wno-zero-as-null-pointer-constant") + endif() + + mark_as_advanced(${source_var}) +endmacro() + +# Find components +foreach(_component IN LISTS ImGui_FIND_COMPONENTS) + if(_component STREQUAL "Sources") + if(NOT TARGET ImGui::Sources) + set(ImGui_Sources_FOUND TRUE) + set(ImGui_SOURCES ) + + foreach(_file imgui imgui_widgets imgui_draw imgui_demo) + # Disable the find root path here, it overrides the + # CMAKE_FIND_ROOT_PATH_MODE_INCLUDE setting potentially set in + # toolchains. + find_file(ImGui_${_file}_SOURCE NAMES ${_file}.cpp + HINTS ${IMGUI_DIR} NO_CMAKE_FIND_ROOT_PATH) + + if(NOT ImGui_${_file}_SOURCE) + set(ImGui_Sources_FOUND FALSE) + break() + endif() + + list(APPEND ImGui_SOURCES ${ImGui_${_file}_SOURCE}) + _imgui_setup_source_file(ImGui_${_file}_SOURCE) + endforeach() + + # Files not present in all ImGui versions, treat them as optional + # and do nothing if not found. + # - imgui_tables added in https://github.com/ocornut/imgui/commit/9874077fc0e364383ef997e3d4332172bfddc0b9 + foreach(_file imgui_tables) + # Disable the find root path here, it overrides the + # CMAKE_FIND_ROOT_PATH_MODE_INCLUDE setting potentially set in + # toolchains. + find_file(ImGui_${_file}_SOURCE NAMES ${_file}.cpp + HINTS ${IMGUI_DIR} NO_CMAKE_FIND_ROOT_PATH) + + if(NOT ImGui_${_file}_SOURCE) + mark_as_advanced(ImGui_${_file}_SOURCE) + continue() + endif() + + list(APPEND ImGui_SOURCES ${ImGui_${_file}_SOURCE}) + _imgui_setup_source_file(ImGui_${_file}_SOURCE) + endforeach() + + add_library(ImGui::Sources INTERFACE IMPORTED) + set_property(TARGET ImGui::Sources APPEND PROPERTY + INTERFACE_SOURCES "${ImGui_SOURCES}") + set_property(TARGET ImGui::Sources APPEND PROPERTY + INTERFACE_LINK_LIBRARIES ImGui::ImGui) + else() + set(ImGui_Sources_FOUND TRUE) + endif() + elseif(_component STREQUAL "SourcesMiscCpp") + set(ImGui_SourcesMiscCpp_FOUND TRUE) + set(ImGui_MISC_CPP_SOURCES ) + + foreach(_file imgui_stdlib) + # Disable the find root path here, it overrides the + # CMAKE_FIND_ROOT_PATH_MODE_INCLUDE setting potentially set in + # toolchains. + find_file(ImGui_${_file}_MISC_CPP_SOURCE NAMES ${_file}.cpp + HINTS ${IMGUI_DIR}/misc/cpp NO_CMAKE_FIND_ROOT_PATH) + list(APPEND ImGui_MISC_CPP_SOURCES ${ImGui_${_file}_MISC_CPP_SOURCE}) + + if(NOT ImGui_${_file}_MISC_CPP_SOURCE) + set(ImGui_SourcesMiscCpp_FOUND FALSE) + break() + endif() + + _imgui_setup_source_file(ImGui_${_file}_MISC_CPP_SOURCE) + endforeach() + + if(NOT TARGET ImGui::SourcesMiscCpp) + add_library(ImGui::SourcesMiscCpp INTERFACE IMPORTED) + set_property(TARGET ImGui::SourcesMiscCpp APPEND PROPERTY + INTERFACE_SOURCES "${ImGui_MISC_CPP_SOURCES}") + set_property(TARGET ImGui::SourcesMiscCpp APPEND PROPERTY + INTERFACE_LINK_LIBRARIES ImGui::ImGui) + endif() + endif() +endforeach() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(ImGui + REQUIRED_VARS ImGui_INCLUDE_DIR HANDLE_COMPONENTS) diff --git a/modules/FindMagnum.cmake b/modules/FindMagnum.cmake new file mode 100644 index 0000000..1c150aa --- /dev/null +++ b/modules/FindMagnum.cmake @@ -0,0 +1,1269 @@ +#.rst: +# Find Magnum +# ----------- +# +# Finds the Magnum library. Basic usage:: +# +# find_package(Magnum REQUIRED) +# +# This module tries to find the base Magnum library and then defines the +# following: +# +# Magnum_FOUND - Whether the base library was found +# MAGNUM_DEPLOY_PREFIX - Prefix where to put final application +# executables, defaults to ``.``. If a relative path is used, it's relative +# to :variable:`CMAKE_INSTALL_PREFIX`. +# MAGNUM_PLUGINS_DEBUG_DIR - Base directory with dynamic plugins for +# debug builds, defaults to magnum-d/ subdirectory of dir where Magnum +# library was found +# MAGNUM_PLUGINS_RELEASE_DIR - Base directory with dynamic plugins for +# release builds, defaults to magnum/ subdirectory of dir where Magnum +# library was found +# MAGNUM_PLUGINS_DIR - Base directory with dynamic plugins, defaults +# to :variable:`MAGNUM_PLUGINS_RELEASE_DIR` in release builds and +# multi-configuration builds or to :variable:`MAGNUM_PLUGINS_DEBUG_DIR` in +# debug builds +# MAGNUM_PLUGINS_FONT[|_DEBUG|_RELEASE]_DIR - Directory with dynamic font +# plugins +# MAGNUM_PLUGINS_FONTCONVERTER[|_DEBUG|_RELEASE]_DIR - Directory with dynamic +# font converter plugins +# MAGNUM_PLUGINS_IMAGECONVERTER[|_DEBUG|_RELEASE]_DIR - Directory with dynamic +# image converter plugins +# MAGNUM_PLUGINS_SCENECONVERTER[|_DEBUG|_RELEASE]_DIR - Directory with dynamic +# scene converter plugins +# MAGNUM_PLUGINS_IMPORTER[|_DEBUG|_RELEASE]_DIR - Directory with dynamic +# importer plugins +# MAGNUM_PLUGINS_AUDIOIMPORTER[|_DEBUG|_RELEASE]_DIR - Directory with dynamic +# audio importer plugins +# +# If Magnum is built for Emscripten, the following variables contain paths to +# various support files: +# +# MAGNUM_EMSCRIPTENAPPLICATION_JS - Path to the EmscriptenApplication.js file +# MAGNUM_WINDOWLESSEMSCRIPTENAPPLICATION_JS - Path to the +# WindowlessEmscriptenApplication.js file +# MAGNUM_WEBAPPLICATION_CSS - Path to the WebApplication.css file +# +# This command will try to find only the base library, not the optional +# components. The base library depends on Corrade and OpenGL libraries (or +# OpenGL ES libraries). Additional dependencies are specified by the +# components. The optional components are: +# +# AnyAudioImporter - Any audio importer +# AnyImageConverter - Any image converter +# AnyImageImporter - Any image importer +# AnySceneConverter - Any scene converter +# AnySceneImporter - Any scene importer +# Audio - Audio library +# DebugTools - DebugTools library +# GL - GL library +# MeshTools - MeshTools library +# Primitives - Primitives library +# SceneGraph - SceneGraph library +# Shaders - Shaders library +# ShaderTools - ShaderTools library +# Text - Text library +# TextureTools - TextureTools library +# Trade - Trade library +# Vk - Vk library +# AndroidApplication - Android application +# EmscriptenApplication - Emscripten application +# GlfwApplication - GLFW application +# GlxApplication - GLX application +# Sdl2Application - SDL2 application +# XEglApplication - X/EGL application +# WindowlessCglApplication - Windowless CGL application +# WindowlessEglApplication - Windowless EGL application +# WindowlessGlxApplication - Windowless GLX application +# WindowlessIosApplication - Windowless iOS application +# WindowlessWglApplication - Windowless WGL application +# WindowlessWindowsEglApplication - Windowless Windows/EGL application +# CglContext - CGL context +# EglContext - EGL context +# GlxContext - GLX context +# WglContext - WGL context +# OpenGLTester - OpenGLTester class +# VulkanTester - VulkanTester class +# MagnumFont - Magnum bitmap font plugin +# MagnumFontConverter - Magnum bitmap font converter plugin +# ObjImporter - OBJ importer plugin +# TgaImageConverter - TGA image converter plugin +# TgaImporter - TGA importer plugin +# WavAudioImporter - WAV audio importer plugin +# distancefieldconverter - magnum-distancefieldconverter executable +# fontconverter - magnum-fontconverter executable +# imageconverter - magnum-imageconverter executable +# sceneconverterter - magnum-sceneconverter executable +# shaderconverterter - magnum-shaderconverter executable +# gl-info - magnum-gl-info executable +# vk-info - magnum-vk-info executable +# al-info - magnum-al-info executable +# +# Example usage with specifying additional components is:: +# +# find_package(Magnum REQUIRED Trade MeshTools Primitives GlfwApplication) +# +# For each component is then defined: +# +# Magnum_*_FOUND - Whether the component was found +# Magnum::* - Component imported target +# +# If exactly one ``*Application`` or exactly one ``Windowless*Application`` +# component is requested and found, its target is available in convenience +# alias ``Magnum::Application`` / ``Magnum::WindowlessApplication`` to simplify +# porting. Similarly, if exactly one ``*Context`` component is requested and +# found, its target is available in convenience alias ``Magnum::GLContext``. +# +# The package is found if either debug or release version of each requested +# library (or plugin) is found. If both debug and release libraries (or +# plugins) are found, proper version is chosen based on actual build +# configuration of the project (i.e. Debug build is linked to debug libraries, +# Release build to release libraries). Note that this autodetection might fail +# for the :variable:`MAGNUM_PLUGINS_DIR` variable, especially on +# multi-configuration build systems. You can make use of +# ``CORRADE_IS_DEBUG_BUILD`` preprocessor variable along with +# ``MAGNUM_PLUGINS_*_DEBUG_DIR`` / ``MAGNUM_PLUGINS_*_RELEASE_DIR`` variables +# to decide in preprocessing step. +# +# Features of found Magnum library are exposed in these variables: +# +# MAGNUM_BUILD_DEPRECATED - Defined if compiled with deprecated APIs +# included +# MAGNUM_BUILD_STATIC - Defined if compiled as static libraries +# MAGNUM_BUILD_STATIC_UNIQUE_GLOBALS - Defined if static libraries keep the +# globals unique even across different shared libraries +# MAGNUM_TARGET_GL - Defined if compiled with OpenGL interop +# MAGNUM_TARGET_GLES - Defined if compiled for OpenGL ES +# MAGNUM_TARGET_GLES2 - Defined if compiled for OpenGL ES 2.0 +# MAGNUM_TARGET_GLES3 - Defined if compiled for OpenGL ES 3.0 +# MAGNUM_TARGET_DESKTOP_GLES - Defined if compiled with OpenGL ES +# emulation on desktop OpenGL +# MAGNUM_TARGET_WEBGL - Defined if compiled for WebGL +# MAGNUM_TARGET_HEADLESS - Defined if compiled for headless machines +# MAGNUM_TARGET_VK - Defined if compiled with Vulkan interop +# +# The following variables are provided for backwards compatibility purposes +# only when MAGNUM_BUILD_DEPRECATED is enabled and will be removed in a future +# release: +# +# MAGNUM_BUILD_MULTITHREADED - Alias to CORRADE_BUILD_MULTITHREADED. Use +# CORRADE_BUILD_MULTITHREADED instead. +# +# Additionally these variables are defined for internal usage: +# +# MAGNUM_INCLUDE_DIR - Root include dir (w/o dependencies) +# MAGNUM_LIBRARY - Magnum library (w/o dependencies) +# MAGNUM_LIBRARY_DEBUG - Debug version of Magnum library, if found +# MAGNUM_LIBRARY_RELEASE - Release version of Magnum library, if found +# MAGNUM_*_LIBRARY - Component libraries (w/o dependencies) +# MAGNUM_*_LIBRARY_DEBUG - Debug version of given library, if found +# MAGNUM_*_LIBRARY_RELEASE - Release version of given library, if found +# MAGNUM_BINARY_INSTALL_DIR - Binary installation directory +# MAGNUM_LIBRARY_INSTALL_DIR - Library installation directory +# MAGNUM_DATA_INSTALL_DIR - Data installation directory +# MAGNUM_PLUGINS_[DEBUG|RELEASE]_BINARY_INSTALL_DIR - Plugin binary +# installation directory +# MAGNUM_PLUGINS_[DEBUG|RELEASE]_LIBRARY_INSTALL_DIR - Plugin library +# installation directory +# MAGNUM_PLUGINS_SHADERCONVERTER_[DEBUG|RELEASE]_BINARY_INSTALL_DIR - Shader +# converter plugin binary installation directory +# MAGNUM_PLUGINS_SHADERCONVERTER_[DEBUG|RELEASE]_LIBRARY_INSTALL_DIR - Shader +# converter plugin library installation directory +# MAGNUM_PLUGINS_FONT_[DEBUG|RELEASE]_BINARY_INSTALL_DIR - Font plugin binary +# installation directory +# MAGNUM_PLUGINS_FONT_[DEBUG|RELEASE]_LIBRARY_INSTALL_DIR - Font plugin +# library installation directory +# MAGNUM_PLUGINS_FONTCONVERTER_[DEBUG|RELEASE]_BINARY_INSTALL_DIR - Font +# converter plugin binary installation directory +# MAGNUM_PLUGINS_FONTCONVERTER_[DEBUG|RELEASE]_LIBRARY_INSTALL_DIR - Font +# converter plugin library installation directory +# MAGNUM_PLUGINS_IMAGECONVERTER_[DEBUG|RELEASE]_BINARY_INSTALL_DIR - Image +# converter plugin binary installation directory +# MAGNUM_PLUGINS_IMAGECONVERTER_[DEBUG|RELEASE]_LIBRARY_INSTALL_DIR - Image +# converter plugin library installation directory +# MAGNUM_PLUGINS_IMPORTER_[DEBUG|RELEASE]_BINARY_INSTALL_DIR - Importer +# plugin binary installation directory +# MAGNUM_PLUGINS_IMPORTER_[DEBUG|RELEASE]_LIBRARY_INSTALL_DIR - Importer +# plugin library installation directory +# MAGNUM_PLUGINS_SCENECONVERTER_[DEBUG|RELEASE]_BINARY_INSTALL_DIR - Scene +# converter plugin binary installation directory +# MAGNUM_PLUGINS_SCENECONVERTER_[DEBUG|RELEASE]_LIBRARY_INSTALL_DIR - Scene +# converter plugin library installation directory +# MAGNUM_PLUGINS_AUDIOIMPORTER_[DEBUG|RELEASE]_BINARY_INSTALL_DIR - Audio +# importer plugin binary installation directory +# MAGNUM_PLUGINS_AUDIOIMPORTER_[DEBUG|RELEASE]_LIBRARY_INSTALL_DIR - Audio +# importer plugin library installation directory +# MAGNUM_INCLUDE_INSTALL_DIR - Header installation directory +# MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR - Plugin header installation directory +# + +# +# This file is part of Magnum. +# +# Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, +# 2020, 2021 Vladimír Vondruš +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. +# + +# Corrade library dependencies +set(_MAGNUM_CORRADE_DEPENDENCIES ) +foreach(_component ${Magnum_FIND_COMPONENTS}) + string(TOUPPER ${_component} _COMPONENT) + + # Unrolling the transitive dependencies here so this doesn't need to be + # after resolving inter-component dependencies. Listing also all plugins. + if(_component MATCHES "^(Audio|DebugTools|MeshTools|Primitives|ShaderTools|Text|TextureTools|Trade|.+Importer|.+ImageConverter|.+Font|.+ShaderConverter)$") + set(_MAGNUM_${_COMPONENT}_CORRADE_DEPENDENCIES PluginManager) + endif() + + list(APPEND _MAGNUM_CORRADE_DEPENDENCIES ${_MAGNUM_${_COMPONENT}_CORRADE_DEPENDENCIES}) +endforeach() +find_package(Corrade REQUIRED Utility ${_MAGNUM_CORRADE_DEPENDENCIES}) + +# Root include dir +find_path(MAGNUM_INCLUDE_DIR + NAMES Magnum/Magnum.h) +mark_as_advanced(MAGNUM_INCLUDE_DIR) + +# Configuration file +find_file(_MAGNUM_CONFIGURE_FILE configure.h + HINTS ${MAGNUM_INCLUDE_DIR}/Magnum/) +mark_as_advanced(_MAGNUM_CONFIGURE_FILE) + +# We need to open configure.h file from MAGNUM_INCLUDE_DIR before we check for +# the components. Bail out with proper error message if it wasn't found. The +# complete check with all components is further below. +if(NOT MAGNUM_INCLUDE_DIR) + include(FindPackageHandleStandardArgs) + find_package_handle_standard_args(Magnum + REQUIRED_VARS MAGNUM_INCLUDE_DIR _MAGNUM_CONFIGURE_FILE) +endif() + +# Read flags from configuration +file(READ ${_MAGNUM_CONFIGURE_FILE} _magnumConfigure) +string(REGEX REPLACE ";" "\\\\;" _magnumConfigure "${_magnumConfigure}") +string(REGEX REPLACE "\n" ";" _magnumConfigure "${_magnumConfigure}") +set(_magnumFlags + BUILD_DEPRECATED + BUILD_STATIC + BUILD_STATIC_UNIQUE_GLOBALS + TARGET_GL + TARGET_GLES + TARGET_GLES2 + TARGET_GLES3 + TARGET_DESKTOP_GLES + TARGET_WEBGL + TARGET_HEADLESS + TARGET_VK) +foreach(_magnumFlag ${_magnumFlags}) + list(FIND _magnumConfigure "#define MAGNUM_${_magnumFlag}" _magnum_${_magnumFlag}) + if(NOT _magnum_${_magnumFlag} EQUAL -1) + set(MAGNUM_${_magnumFlag} 1) + endif() +endforeach() + +# For compatibility only, to be removed at some point +if(MAGNUM_BUILD_DEPRECATED AND CORRADE_BUILD_MULTITHREADED) + set(MAGNUM_BUILD_MULTITHREADED 1) +endif() + +# OpenGL library preference. Prefer to use GLVND, since that's the better +# approach nowadays, but allow the users to override it from outside in case +# it is broken for some reason (Nvidia drivers in Debian's testing (Buster) -- +# reported on 2019-04-09). +if(NOT CMAKE_VERSION VERSION_LESS 3.10 AND NOT OpenGL_GL_PREFERENCE) + set(OpenGL_GL_PREFERENCE GLVND) +endif() + +# Base Magnum library +if(NOT TARGET Magnum::Magnum) + add_library(Magnum::Magnum UNKNOWN IMPORTED) + + # Try to find both debug and release version + find_library(MAGNUM_LIBRARY_DEBUG Magnum-d) + find_library(MAGNUM_LIBRARY_RELEASE Magnum) + mark_as_advanced(MAGNUM_LIBRARY_DEBUG + MAGNUM_LIBRARY_RELEASE) + + # Set the MAGNUM_LIBRARY variable based on what was found, use that + # information to guess also build type of dynamic plugins + if(MAGNUM_LIBRARY_DEBUG AND MAGNUM_LIBRARY_RELEASE) + set(MAGNUM_LIBRARY ${MAGNUM_LIBRARY_RELEASE}) + get_filename_component(_MAGNUM_PLUGINS_DIR_PREFIX ${MAGNUM_LIBRARY_DEBUG} PATH) + if(CMAKE_BUILD_TYPE STREQUAL "Debug") + set(_MAGNUM_PLUGINS_DIR_SUFFIX "-d") + endif() + elseif(MAGNUM_LIBRARY_DEBUG) + set(MAGNUM_LIBRARY ${MAGNUM_LIBRARY_DEBUG}) + get_filename_component(_MAGNUM_PLUGINS_DIR_PREFIX ${MAGNUM_LIBRARY_DEBUG} PATH) + set(_MAGNUM_PLUGINS_DIR_SUFFIX "-d") + elseif(MAGNUM_LIBRARY_RELEASE) + set(MAGNUM_LIBRARY ${MAGNUM_LIBRARY_RELEASE}) + get_filename_component(_MAGNUM_PLUGINS_DIR_PREFIX ${MAGNUM_LIBRARY_RELEASE} PATH) + endif() + + # On DLL platforms the plugins are stored in bin/ instead of lib/, modify + # _MAGNUM_PLUGINS_DIR_PREFIX accordingly + if(CORRADE_TARGET_WINDOWS) + get_filename_component(_MAGNUM_PLUGINS_DIR_PREFIX ${_MAGNUM_PLUGINS_DIR_PREFIX} PATH) + set(_MAGNUM_PLUGINS_DIR_PREFIX ${_MAGNUM_PLUGINS_DIR_PREFIX}/bin) + endif() + + if(MAGNUM_LIBRARY_RELEASE) + set_property(TARGET Magnum::Magnum APPEND PROPERTY + IMPORTED_CONFIGURATIONS RELEASE) + set_property(TARGET Magnum::Magnum PROPERTY + IMPORTED_LOCATION_RELEASE ${MAGNUM_LIBRARY_RELEASE}) + endif() + + if(MAGNUM_LIBRARY_DEBUG) + set_property(TARGET Magnum::Magnum APPEND PROPERTY + IMPORTED_CONFIGURATIONS DEBUG) + set_property(TARGET Magnum::Magnum PROPERTY + IMPORTED_LOCATION_DEBUG ${MAGNUM_LIBRARY_DEBUG}) + endif() + + # Include directories + set_property(TARGET Magnum::Magnum APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES + ${MAGNUM_INCLUDE_DIR}) + + # Dependent libraries + set_property(TARGET Magnum::Magnum APPEND PROPERTY INTERFACE_LINK_LIBRARIES + Corrade::Utility) +else() + set(MAGNUM_LIBRARY Magnum::Magnum) +endif() + +# Component distinction (listing them explicitly to avoid mistakes with finding +# components from other repositories) +set(_MAGNUM_LIBRARY_COMPONENTS + Audio DebugTools GL MeshTools Primitives SceneGraph Shaders ShaderTools + Text TextureTools Trade + WindowlessEglApplication EglContext OpenGLTester) +set(_MAGNUM_PLUGIN_COMPONENTS + AnyAudioImporter AnyImageConverter AnyImageImporter AnySceneConverter + AnySceneImporter MagnumFont MagnumFontConverter ObjImporter + TgaImageConverter TgaImporter WavAudioImporter) +set(_MAGNUM_EXECUTABLE_COMPONENTS + imageconverter sceneconverter shaderconverter gl-info al-info) +# Audio and Vk libs aren't enabled by default, and none of the Context, +# Application, Tester libs nor plugins are. Keep in sync with Magnum's root +# CMakeLists.txt. +set(_MAGNUM_IMPLICITLY_ENABLED_COMPONENTS + DebugTools MeshTools SceneGraph Shaders ShaderTools Text TextureTools Trade + GL Primitives) +if(NOT CORRADE_TARGET_EMSCRIPTEN) + list(APPEND _MAGNUM_LIBRARY_COMPONENTS Vk VulkanTester) + list(APPEND _MAGNUM_EXECUTABLE_COMPONENTS vk-info) +endif() +if(NOT CORRADE_TARGET_ANDROID) + list(APPEND _MAGNUM_LIBRARY_COMPONENTS Sdl2Application) +endif() +if(NOT CORRADE_TARGET_ANDROID AND NOT CORRADE_TARGET_IOS AND NOT CORRADE_TARGET_EMSCRIPTEN) + list(APPEND _MAGNUM_LIBRARY_COMPONENTS GlfwApplication) +endif() +if(CORRADE_TARGET_ANDROID) + list(APPEND _MAGNUM_LIBRARY_COMPONENTS AndroidApplication) +endif() +if(CORRADE_TARGET_EMSCRIPTEN) + list(APPEND _MAGNUM_LIBRARY_COMPONENTS EmscriptenApplication) +endif() +if(CORRADE_TARGET_IOS) + list(APPEND _MAGNUM_LIBRARY_COMPONENTS WindowlessIosApplication) +endif() +if(CORRADE_TARGET_APPLE AND NOT CORRADE_TARGET_IOS) + list(APPEND _MAGNUM_LIBRARY_COMPONENTS WindowlessCglApplication CglContext) +endif() +if(CORRADE_TARGET_UNIX AND NOT CORRADE_TARGET_APPLE) + list(APPEND _MAGNUM_LIBRARY_COMPONENTS GlxApplication XEglApplication WindowlessGlxApplication GlxContext) +endif() +if(CORRADE_TARGET_WINDOWS) + list(APPEND _MAGNUM_LIBRARY_COMPONENTS WindowlessWglApplication WglContext WindowlessWindowsEglApplication) +endif() +if(CORRADE_TARGET_UNIX OR CORRADE_TARGET_WINDOWS) + list(APPEND _MAGNUM_EXECUTABLE_COMPONENTS fontconverter distancefieldconverter) +endif() + +# Inter-component dependencies +set(_MAGNUM_Audio_DEPENDENCIES ) + +# Trade is used by CompareImage. If Trade is not enabled, CompareImage is not +# compiled at all. +set(_MAGNUM_DebugTools_DEPENDENCIES Trade) +set(_MAGNUM_DebugTools_Trade_DEPENDENCY_IS_OPTIONAL ON) +# MeshTools, Primitives, SceneGraph and Shaders are used only for GL renderers +# in DebugTools. All of this is optional, compiled in only if the base library +# was selected. +if(MAGNUM_TARGET_GL) + list(APPEND _MAGNUM_DebugTools_DEPENDENCIES MeshTools Primitives SceneGraph Shaders GL) + set(_MAGNUM_DebugTools_MeshTools_DEPENDENCY_IS_OPTIONAL ON) + set(_MAGNUM_DebugTools_Primitives_DEPENDENCY_IS_OPTIONAL ON) + set(_MAGNUM_DebugTools_SceneGraph_DEPENDENCY_IS_OPTIONAL ON) + set(_MAGNUM_DebugTools_Shaders_DEPENDENCY_IS_OPTIONAL ON) + set(_MAGNUM_DebugTools_GL_DEPENDENCY_IS_OPTIONAL ON) +endif() + +set(_MAGNUM_MeshTools_DEPENDENCIES Trade) +if(MAGNUM_TARGET_GL) + list(APPEND _MAGNUM_MeshTools_DEPENDENCIES GL) +endif() + +set(_MAGNUM_OpenGLTester_DEPENDENCIES GL) +if(MAGNUM_TARGET_HEADLESS OR CORRADE_TARGET_EMSCRIPTEN OR CORRADE_TARGET_ANDROID) + list(APPEND _MAGNUM_OpenGLTester_DEPENDENCIES WindowlessEglApplication) +elseif(CORRADE_TARGET_IOS) + list(APPEND _MAGNUM_OpenGLTester_DEPENDENCIES WindowlessIosApplication) +elseif(CORRADE_TARGET_APPLE) + list(APPEND _MAGNUM_OpenGLTester_DEPENDENCIES WindowlessCglApplication) +elseif(CORRADE_TARGET_UNIX) + if(MAGNUM_TARGET_GLES AND NOT MAGNUM_TARGET_DESKTOP_GLES) + list(APPEND _MAGNUM_OpenGLTester_DEPENDENCIES WindowlessEglApplication) + else() + list(APPEND _MAGNUM_OpenGLTester_DEPENDENCIES WindowlessGlxApplication) + endif() +elseif(CORRADE_TARGET_WINDOWS) + if(NOT MAGNUM_TARGET_GLES OR MAGNUM_TARGET_DESKTOP_GLES) + list(APPEND _MAGNUM_OpenGLTester_DEPENDENCIES WindowlessWglApplication) + else() + list(APPEND _MAGNUM_OpenGLTester_DEPENDENCIES WindowlessWindowsEglApplication) + endif() +endif() + +set(_MAGNUM_Primitives_DEPENDENCIES MeshTools Trade) +if(MAGNUM_TARGET_GL) + # GL not required by Primitives themselves, but transitively by MeshTools + list(APPEND _MAGNUM_Primitives_DEPENDENCIES GL) +endif() +set(_MAGNUM_SceneGraph_DEPENDENCIES ) +set(_MAGNUM_Shaders_DEPENDENCIES GL) +set(_MAGNUM_Text_DEPENDENCIES TextureTools) +if(MAGNUM_TARGET_GL) + list(APPEND _MAGNUM_Text_DEPENDENCIES GL) +endif() + +set(_MAGNUM_TextureTools_DEPENDENCIES ) +if(MAGNUM_TARGET_GL) + list(APPEND _MAGNUM_TextureTools_DEPENDENCIES GL) +endif() + +set(_MAGNUM_Trade_DEPENDENCIES ) +set(_MAGNUM_VulkanTester_DEPENDENCIES Vk) +set(_MAGNUM_AndroidApplication_DEPENDENCIES GL) +set(_MAGNUM_EmscriptenApplication_DEPENDENCIES) +if(MAGNUM_TARGET_GL) + list(APPEND _MAGNUM_EmscriptenApplication_DEPENDENCIES GL) +endif() + +set(_MAGNUM_GlfwApplication_DEPENDENCIES ) +if(MAGNUM_TARGET_GL) + list(APPEND _MAGNUM_GlfwApplication_DEPENDENCIES GL) +endif() + +set(_MAGNUM_GlxApplication_DEPENDENCIES GL) + +set(_MAGNUM_Sdl2Application_DEPENDENCIES ) +if(MAGNUM_TARGET_GL) + list(APPEND _MAGNUM_Sdl2Application_DEPENDENCIES GL) +endif() + +set(_MAGNUM_WindowlessCglApplication_DEPENDENCIES GL) +set(_MAGNUM_WindowlessEglApplication_DEPENDENCIES GL) +set(_MAGNUM_WindowlessGlxApplication_DEPENDENCIES GL) +set(_MAGNUM_WindowlessIosApplication_DEPENDENCIES GL) +set(_MAGNUM_WindowlessWglApplication_DEPENDENCIES GL) +set(_MAGNUM_WindowlessWindowsEglApplication_DEPENDENCIES GL) +set(_MAGNUM_XEglApplication_DEPENDENCIES GL) +set(_MAGNUM_CglContext_DEPENDENCIES GL) +set(_MAGNUM_EglContext_DEPENDENCIES GL) +set(_MAGNUM_GlxContext_DEPENDENCIES GL) +set(_MAGNUM_WglContext_DEPENDENCIES GL) + +set(_MAGNUM_MagnumFont_DEPENDENCIES Trade TgaImporter GL) # and below +set(_MAGNUM_MagnumFontConverter_DEPENDENCIES Trade TgaImageConverter) # and below +set(_MAGNUM_ObjImporter_DEPENDENCIES MeshTools) # and below +foreach(_component ${_MAGNUM_PLUGIN_COMPONENTS}) + if(_component MATCHES ".+AudioImporter") + list(APPEND _MAGNUM_${_component}_DEPENDENCIES Audio) + elseif(_component MATCHES ".+ShaderConverter") + list(APPEND _MAGNUM_${_component}_DEPENDENCIES ShaderTools) + elseif(_component MATCHES ".+(Importer|ImageConverter|SceneConverter)") + list(APPEND _MAGNUM_${_component}_DEPENDENCIES Trade) + elseif(_component MATCHES ".+(Font|FontConverter)") + list(APPEND _MAGNUM_${_component}_DEPENDENCIES Text TextureTools) + endif() +endforeach() + +# Ensure that all inter-component dependencies are specified as well +set(_MAGNUM_ADDITIONAL_COMPONENTS ) +foreach(_component ${Magnum_FIND_COMPONENTS}) + # Mark the dependencies as required if the component is also required, but + # only if they themselves are not optional (for example parts of DebugTools + # are present only if their respective base library is compiled) + if(Magnum_FIND_REQUIRED_${_component}) + foreach(_dependency ${_MAGNUM_${_component}_DEPENDENCIES}) + if(NOT _MAGNUM_${_component}_${_dependency}_DEPENDENCY_IS_OPTIONAL) + set(Magnum_FIND_REQUIRED_${_dependency} TRUE) + endif() + endforeach() + endif() + + list(APPEND _MAGNUM_ADDITIONAL_COMPONENTS ${_MAGNUM_${_component}_DEPENDENCIES}) +endforeach() + +# Join the lists, remove duplicate components +set(_MAGNUM_ORIGINAL_FIND_COMPONENTS ${Magnum_FIND_COMPONENTS}) +if(_MAGNUM_ADDITIONAL_COMPONENTS) + list(INSERT Magnum_FIND_COMPONENTS 0 ${_MAGNUM_ADDITIONAL_COMPONENTS}) +endif() +if(Magnum_FIND_COMPONENTS) + list(REMOVE_DUPLICATES Magnum_FIND_COMPONENTS) +endif() + +# Find all components. Maintain a list of components that'll need to have +# their optional dependencies checked. +set(_MAGNUM_OPTIONAL_DEPENDENCIES_TO_ADD ) +foreach(_component ${Magnum_FIND_COMPONENTS}) + string(TOUPPER ${_component} _COMPONENT) + + # Create imported target in case the library is found. If the project is + # added as subproject to CMake, the target already exists and all the + # required setup is already done from the build tree. + if(TARGET Magnum::${_component}) + set(Magnum_${_component}_FOUND TRUE) + else() + # Library components + if(_component IN_LIST _MAGNUM_LIBRARY_COMPONENTS) + add_library(Magnum::${_component} UNKNOWN IMPORTED) + + # Set library defaults, find the library + set(_MAGNUM_${_COMPONENT}_INCLUDE_PATH_SUFFIX Magnum/${_component}) + set(_MAGNUM_${_COMPONENT}_INCLUDE_PATH_NAMES ${_component}.h) + + # Try to find both debug and release version + find_library(MAGNUM_${_COMPONENT}_LIBRARY_DEBUG Magnum${_component}-d) + find_library(MAGNUM_${_COMPONENT}_LIBRARY_RELEASE Magnum${_component}) + mark_as_advanced(MAGNUM_${_COMPONENT}_LIBRARY_DEBUG + MAGNUM_${_COMPONENT}_LIBRARY_RELEASE) + + # Plugin components + elseif(_component IN_LIST _MAGNUM_PLUGIN_COMPONENTS) + add_library(Magnum::${_component} UNKNOWN IMPORTED) + + # AudioImporter plugin specific name suffixes + if(_component MATCHES ".+AudioImporter$") + set(_MAGNUM_${_COMPONENT}_PATH_SUFFIX audioimporters) + + # Audio importer class is Audio::*Importer, thus we need to + # convert *AudioImporter.h to *Importer.h + string(REPLACE "AudioImporter" "Importer" _MAGNUM_${_COMPONENT}_HEADER_NAME "${_component}") + set(_MAGNUM_${_COMPONENT}_INCLUDE_PATH_NAMES ${_MAGNUM_${_COMPONENT}_HEADER_NAME}.h) + + # ShaderConverter plugin specific name suffixes + elseif(_component MATCHES ".+ShaderConverter$") + set(_MAGNUM_${_COMPONENT}_PATH_SUFFIX shaderconverters) + + # Importer plugin specific name suffixes + elseif(_component MATCHES ".+Importer$") + set(_MAGNUM_${_COMPONENT}_PATH_SUFFIX importers) + + # Font plugin specific name suffixes + elseif(_component MATCHES ".+Font$") + set(_MAGNUM_${_COMPONENT}_PATH_SUFFIX fonts) + + # ImageConverter plugin specific name suffixes + elseif(_component MATCHES ".+ImageConverter$") + set(_MAGNUM_${_COMPONENT}_PATH_SUFFIX imageconverters) + + # SceneConverter plugin specific name suffixes + elseif(_component MATCHES ".+SceneConverter$") + set(_MAGNUM_${_COMPONENT}_PATH_SUFFIX sceneconverters) + + # FontConverter plugin specific name suffixes + elseif(_component MATCHES ".+FontConverter$") + set(_MAGNUM_${_COMPONENT}_PATH_SUFFIX fontconverters) + endif() + + # Don't override the exception for *AudioImporter plugins + set(_MAGNUM_${_COMPONENT}_INCLUDE_PATH_SUFFIX MagnumPlugins/${_component}) + if(NOT _MAGNUM_${_COMPONENT}_INCLUDE_PATH_NAMES) + set(_MAGNUM_${_COMPONENT}_INCLUDE_PATH_NAMES ${_component}.h) + endif() + + # Dynamic plugins don't have any prefix (e.g. `lib` on Linux), + # search with empty prefix and then reset that back so we don't + # accidentaly break something else + set(_tmp_prefixes "${CMAKE_FIND_LIBRARY_PREFIXES}") + set(CMAKE_FIND_LIBRARY_PREFIXES "${CMAKE_FIND_LIBRARY_PREFIXES};") + + # Try to find both debug and release version. Dynamic and static + # debug libraries are in different places. Static debug plugins are + # in magnum/ with a -d suffix while dynamic debug plugins are in + # magnum-d/ with no suffix. Problem is that Vcpkg's library linking + # automagic needs the static libs to be in the root library + # directory along with everything else and so we need to search for + # the -d suffixed version *before* the unsuffixed so it doesn't + # pick the release library for both debug and release. + find_library(MAGNUM_${_COMPONENT}_LIBRARY_DEBUG ${_component}-d + PATH_SUFFIXES magnum/${_MAGNUM_${_COMPONENT}_PATH_SUFFIX}) + find_library(MAGNUM_${_COMPONENT}_LIBRARY_DEBUG ${_component} + PATH_SUFFIXES magnum-d/${_MAGNUM_${_COMPONENT}_PATH_SUFFIX}) + find_library(MAGNUM_${_COMPONENT}_LIBRARY_RELEASE ${_component} + PATH_SUFFIXES magnum/${_MAGNUM_${_COMPONENT}_PATH_SUFFIX}) + mark_as_advanced(MAGNUM_${_COMPONENT}_LIBRARY_DEBUG + MAGNUM_${_COMPONENT}_LIBRARY_RELEASE) + + # Reset back + set(CMAKE_FIND_LIBRARY_PREFIXES "${_tmp_prefixes}") + + # Executables + elseif(_component IN_LIST _MAGNUM_EXECUTABLE_COMPONENTS) + add_executable(Magnum::${_component} IMPORTED) + + find_program(MAGNUM_${_COMPONENT}_EXECUTABLE magnum-${_component}) + mark_as_advanced(MAGNUM_${_COMPONENT}_EXECUTABLE) + + if(MAGNUM_${_COMPONENT}_EXECUTABLE) + set_property(TARGET Magnum::${_component} PROPERTY + IMPORTED_LOCATION ${MAGNUM_${_COMPONENT}_EXECUTABLE}) + endif() + + # Something unknown, skip. FPHSA will take care of handling this below. + else() + continue() + endif() + + # Library location for libraries/plugins + if(_component IN_LIST _MAGNUM_LIBRARY_COMPONENTS OR _component IN_LIST _MAGNUM_PLUGIN_COMPONENTS) + if(MAGNUM_${_COMPONENT}_LIBRARY_RELEASE) + set_property(TARGET Magnum::${_component} APPEND PROPERTY + IMPORTED_CONFIGURATIONS RELEASE) + set_property(TARGET Magnum::${_component} PROPERTY + IMPORTED_LOCATION_RELEASE ${MAGNUM_${_COMPONENT}_LIBRARY_RELEASE}) + endif() + + if(MAGNUM_${_COMPONENT}_LIBRARY_DEBUG) + set_property(TARGET Magnum::${_component} APPEND PROPERTY + IMPORTED_CONFIGURATIONS DEBUG) + set_property(TARGET Magnum::${_component} PROPERTY + IMPORTED_LOCATION_DEBUG ${MAGNUM_${_COMPONENT}_LIBRARY_DEBUG}) + endif() + endif() + + # Applications + if(_component MATCHES ".+Application") + set(_MAGNUM_${_COMPONENT}_INCLUDE_PATH_SUFFIX Magnum/Platform) + + # Android application dependencies + if(_component STREQUAL AndroidApplication) + find_package(EGL) + set_property(TARGET Magnum::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES android EGL::EGL) + + # EmscriptenApplication has no additional dependencies + + # GLFW application dependencies + elseif(_component STREQUAL GlfwApplication) + find_package(GLFW) + set_property(TARGET Magnum::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES GLFW::GLFW) + # Use the Foundation framework on Apple to query the DPI awareness + if(CORRADE_TARGET_APPLE) + find_library(_MAGNUM_APPLE_FOUNDATION_FRAMEWORK_LIBRARY Foundation) + mark_as_advanced(_MAGNUM_APPLE_FOUNDATION_FRAMEWORK_LIBRARY) + set_property(TARGET Magnum::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES ${_MAGNUM_APPLE_FOUNDATION_FRAMEWORK_LIBRARY}) + # Needed for opt-in DPI queries + elseif(CORRADE_TARGET_UNIX) + set_property(TARGET Magnum::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES ${CMAKE_DL_LIBS}) + endif() + + # With GLVND (since CMake 3.11) we need to explicitly link to + # GLX/EGL because libOpenGL doesn't provide it. For EGL we have + # our own EGL find module, which makes things simpler. The + # upstream FindOpenGL is anything but simple. Also can't use + # OpenGL_OpenGL_FOUND, because that one is set also if GLVND is + # *not* found. WTF. Also can't just check for + # OPENGL_opengl_LIBRARY because that's set even if + # OpenGL_GL_PREFERENCE is explicitly set to LEGACY. + if(MAGNUM_TARGET_GL) + if(CORRADE_TARGET_UNIX AND NOT CORRADE_TARGET_APPLE AND (NOT MAGNUM_TARGET_GLES OR MAGNUM_TARGET_DESKTOP_GLES)) + find_package(OpenGL) + if(OPENGL_opengl_LIBRARY AND OpenGL_GL_PREFERENCE STREQUAL GLVND) + set_property(TARGET Magnum::${_component} APPEND + PROPERTY INTERFACE_LINK_LIBRARIES OpenGL::GLX) + endif() + elseif(MAGNUM_TARGET_GLES AND NOT MAGNUM_TARGET_DESKTOP_GLES AND NOT CORRADE_TARGET_EMSCRIPTEN) + find_package(EGL) + set_property(TARGET Magnum::${_component} APPEND + PROPERTY INTERFACE_LINK_LIBRARIES EGL::EGL) + endif() + endif() + + # SDL2 application dependencies + elseif(_component STREQUAL Sdl2Application) + find_package(SDL2) + set_property(TARGET Magnum::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES SDL2::SDL2) + # Use the Foundation framework on Apple to query the DPI awareness + if(CORRADE_TARGET_APPLE) + find_library(_MAGNUM_APPLE_FOUNDATION_FRAMEWORK_LIBRARY Foundation) + mark_as_advanced(_MAGNUM_APPLE_FOUNDATION_FRAMEWORK_LIBRARY) + set_property(TARGET Magnum::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES ${_MAGNUM_APPLE_FOUNDATION_FRAMEWORK_LIBRARY}) + # Needed for opt-in DPI queries + elseif(CORRADE_TARGET_UNIX) + set_property(TARGET Magnum::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES ${CMAKE_DL_LIBS}) + endif() + + # With GLVND (since CMake 3.11) we need to explicitly link to + # GLX/EGL because libOpenGL doesn't provide it. For EGL we have + # our own EGL find module, which makes things simpler. The + # upstream FindOpenGL is anything but simple. Also can't use + # OpenGL_OpenGL_FOUND, because that one is set also if GLVND is + # *not* found. WTF. Also can't just check for + # OPENGL_opengl_LIBRARY because that's set even if + # OpenGL_GL_PREFERENCE is explicitly set to LEGACY. + if(MAGNUM_TARGET_GL) + if(CORRADE_TARGET_UNIX AND NOT CORRADE_TARGET_APPLE AND (NOT MAGNUM_TARGET_GLES OR MAGNUM_TARGET_DESKTOP_GLES)) + find_package(OpenGL) + if(OPENGL_opengl_LIBRARY AND OpenGL_GL_PREFERENCE STREQUAL GLVND) + set_property(TARGET Magnum::${_component} APPEND + PROPERTY INTERFACE_LINK_LIBRARIES OpenGL::GLX) + endif() + elseif(MAGNUM_TARGET_GLES AND NOT MAGNUM_TARGET_DESKTOP_GLES AND NOT CORRADE_TARGET_EMSCRIPTEN) + find_package(EGL) + set_property(TARGET Magnum::${_component} APPEND + PROPERTY INTERFACE_LINK_LIBRARIES EGL::EGL) + endif() + endif() + + # (Windowless) GLX application dependencies + elseif(_component STREQUAL GlxApplication OR _component STREQUAL WindowlessGlxApplication) + find_package(X11) + set_property(TARGET Magnum::${_component} APPEND PROPERTY + INTERFACE_INCLUDE_DIRECTORIES ${X11_INCLUDE_DIR}) + set_property(TARGET Magnum::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES ${X11_LIBRARIES}) + + # With GLVND (since CMake 3.11) we need to explicitly link to + # GLX because libOpenGL doesn't provide it. Also can't use + # OpenGL_OpenGL_FOUND, because that one is set also if GLVND is + # *not* found. WTF. Also can't just check for + # OPENGL_opengl_LIBRARY because that's set even if + # OpenGL_GL_PREFERENCE is explicitly set to LEGACY. + find_package(OpenGL) + if(OPENGL_opengl_LIBRARY AND OpenGL_GL_PREFERENCE STREQUAL GLVND) + set_property(TARGET Magnum::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES OpenGL::GLX) + endif() + + # Windowless CGL application has no additional dependencies + + # Windowless EGL application dependencies + elseif(_component STREQUAL WindowlessEglApplication) + find_package(EGL) + set_property(TARGET Magnum::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES EGL::EGL) + + # Windowless iOS application dependencies + elseif(_component STREQUAL WindowlessIosApplication) + # We need to link to Foundation framework to use ObjC + find_library(_MAGNUM_IOS_FOUNDATION_FRAMEWORK_LIBRARY Foundation) + mark_as_advanced(_MAGNUM_IOS_FOUNDATION_FRAMEWORK_LIBRARY) + find_package(EGL) + set_property(TARGET Magnum::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES EGL::EGL ${_MAGNUM_IOS_FOUNDATION_FRAMEWORK_LIBRARY}) + + # Windowless WGL application has no additional dependencies + + # Windowless Windows/EGL application dependencies + elseif(_component STREQUAL WindowlessWindowsEglApplication) + find_package(EGL) + set_property(TARGET Magnum::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES EGL::EGL) + + # X/EGL application dependencies + elseif(_component STREQUAL XEglApplication) + find_package(EGL) + find_package(X11) + set_property(TARGET Magnum::${_component} APPEND PROPERTY + INTERFACE_INCLUDE_DIRECTORIES ${X11_INCLUDE_DIR}) + set_property(TARGET Magnum::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES EGL::EGL ${X11_LIBRARIES}) + endif() + + # Context libraries + elseif(_component MATCHES ".+Context") + set(_MAGNUM_${_COMPONENT}_INCLUDE_PATH_SUFFIX Magnum/Platform) + set(_MAGNUM_${_COMPONENT}_INCLUDE_PATH_NAMES GLContext.h) + + # GLX context dependencies + if(_component STREQUAL GlxContext) + # With GLVND (since CMake 3.11) we need to explicitly link to + # GLX because libOpenGL doesn't provide it. Also can't use + # OpenGL_OpenGL_FOUND, because that one is set also if GLVND is + # *not* found. If GLVND is not used, link to X11 instead. Also + # can't just check for OPENGL_opengl_LIBRARY because that's set + # even if OpenGL_GL_PREFERENCE is explicitly set to LEGACY. + find_package(OpenGL) + if(OPENGL_opengl_LIBRARY AND OpenGL_GL_PREFERENCE STREQUAL GLVND) + set_property(TARGET Magnum::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES OpenGL::GLX) + else() + find_package(X11) + set_property(TARGET Magnum::${_component} APPEND PROPERTY + INTERFACE_INCLUDE_DIRECTORIES ${X11_INCLUDE_DIR}) + set_property(TARGET Magnum::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES ${X11_LIBRARIES}) + endif() + + # EGL context dependencies + elseif(_component STREQUAL EglContext) + find_package(EGL) + set_property(TARGET Magnum::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES EGL::EGL) + endif() + + # No additional dependencies for CGL context + # No additional dependencies for WGL context + + # Audio library + elseif(_component STREQUAL Audio) + find_package(OpenAL) + set_property(TARGET Magnum::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES Corrade::PluginManager OpenAL::OpenAL) + + # No special setup for DebugTools library + + # GL library + elseif(_component STREQUAL GL) + if(NOT MAGNUM_TARGET_GLES OR MAGNUM_TARGET_DESKTOP_GLES) + # If the GLVND library (CMake 3.11+) was found, link to the + # imported target. Otherwise (and also on all systems except + # Linux) link to the classic libGL. Can't use + # OpenGL_OpenGL_FOUND, because that one is set also if GLVND is + # *not* found. WTF. Also can't just check for + # OPENGL_opengl_LIBRARY because that's set even if + # OpenGL_GL_PREFERENCE is explicitly set to LEGACY. + find_package(OpenGL REQUIRED) + if(OPENGL_opengl_LIBRARY AND OpenGL_GL_PREFERENCE STREQUAL GLVND) + set_property(TARGET Magnum::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES OpenGL::OpenGL) + else() + set_property(TARGET Magnum::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES ${OPENGL_gl_LIBRARY}) + endif() + elseif(MAGNUM_TARGET_GLES2) + find_package(OpenGLES2 REQUIRED) + set_property(TARGET Magnum::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES OpenGLES2::OpenGLES2) + elseif(MAGNUM_TARGET_GLES3) + find_package(OpenGLES3 REQUIRED) + set_property(TARGET Magnum::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES OpenGLES3::OpenGLES3) + endif() + + # MeshTools library + elseif(_component STREQUAL MeshTools) + set(_MAGNUM_${_COMPONENT}_INCLUDE_PATH_NAMES CompressIndices.h) + + # OpenGLTester library + elseif(_component STREQUAL OpenGLTester) + set(_MAGNUM_${_COMPONENT}_INCLUDE_PATH_SUFFIX Magnum/GL) + + # VulkanTester library + elseif(_component STREQUAL VulkanTester) + set(_MAGNUM_${_COMPONENT}_INCLUDE_PATH_SUFFIX Magnum/Vk) + + # Primitives library + elseif(_component STREQUAL Primitives) + set(_MAGNUM_${_COMPONENT}_INCLUDE_PATH_NAMES Cube.h) + + # No special setup for SceneGraph library + + # ShaderTools library + elseif(_component STREQUAL ShaderTools) + set_property(TARGET Magnum::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES Corrade::PluginManager) + + # No special setup for Shaders library + + # Text library + elseif(_component STREQUAL Text) + set_property(TARGET Magnum::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES Corrade::PluginManager) + + # TextureTools library + elseif(_component STREQUAL TextureTools) + set(_MAGNUM_${_COMPONENT}_INCLUDE_PATH_NAMES Atlas.h) + + # Trade library + elseif(_component STREQUAL Trade) + set_property(TARGET Magnum::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES Corrade::PluginManager) + + # Vk library + elseif(_component STREQUAL Vk) + find_package(Vulkan REQUIRED) + set_property(TARGET Magnum::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES Vulkan::Vulkan) + endif() + + # No special setup for AnyAudioImporter plugin + # No special setup for AnyImageConverter plugin + # No special setup for AnyImageImporter plugin + # No special setup for AnySceneImporter plugin + # No special setup for MagnumFont plugin + # No special setup for MagnumFontConverter plugin + # No special setup for ObjImporter plugin + # No special setup for TgaImageConverter plugin + # No special setup for TgaImporter plugin + # No special setup for WavAudioImporter plugin + + # Find library/plugin includes + if(_component IN_LIST _MAGNUM_LIBRARY_COMPONENTS OR _component IN_LIST _MAGNUM_PLUGIN_COMPONENTS) + find_path(_MAGNUM_${_COMPONENT}_INCLUDE_DIR + NAMES ${_MAGNUM_${_COMPONENT}_INCLUDE_PATH_NAMES} + HINTS ${MAGNUM_INCLUDE_DIR}/${_MAGNUM_${_COMPONENT}_INCLUDE_PATH_SUFFIX}) + mark_as_advanced(_MAGNUM_${_COMPONENT}_INCLUDE_DIR) + endif() + + # Automatic import of static plugins. Skip in case the include dir was + # not found -- that'll fail later with a proper message. + if(_component IN_LIST _MAGNUM_PLUGIN_COMPONENTS AND _MAGNUM_${_COMPONENT}_INCLUDE_DIR) + # Automatic import of static plugins + file(READ ${_MAGNUM_${_COMPONENT}_INCLUDE_DIR}/configure.h _magnum${_component}Configure) + string(FIND "${_magnum${_component}Configure}" "#define MAGNUM_${_COMPONENT}_BUILD_STATIC" _magnum${_component}_BUILD_STATIC) + if(NOT _magnum${_component}_BUILD_STATIC EQUAL -1) + set_property(TARGET Magnum::${_component} APPEND PROPERTY + INTERFACE_SOURCES ${_MAGNUM_${_COMPONENT}_INCLUDE_DIR}/importStaticPlugin.cpp) + endif() + endif() + + # Link to core Magnum library, add inter-library dependencies. If there + # are optional dependencies, defer adding them to later once we know if + # they were found or not. + if(_component IN_LIST _MAGNUM_LIBRARY_COMPONENTS OR _component IN_LIST _MAGNUM_PLUGIN_COMPONENTS) + set_property(TARGET Magnum::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES Magnum::Magnum) + set(_MAGNUM_${component}_OPTIONAL_DEPENDENCIES_TO_ADD ) + foreach(_dependency ${_MAGNUM_${_component}_DEPENDENCIES}) + if(NOT _MAGNUM_${_component}_${_dependency}_DEPENDENCY_IS_OPTIONAL) + set_property(TARGET Magnum::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES Magnum::${_dependency}) + else() + list(APPEND _MAGNUM_${_component}_OPTIONAL_DEPENDENCIES_TO_ADD + ${_dependency}) + endif() + endforeach() + if(_MAGNUM_${_component}_OPTIONAL_DEPENDENCIES_TO_ADD) + list(APPEND _MAGNUM_OPTIONAL_DEPENDENCIES_TO_ADD ${_component}) + endif() + endif() + + # Decide if the library was found + if(((_component IN_LIST _MAGNUM_LIBRARY_COMPONENTS OR _component IN_LIST _MAGNUM_PLUGIN_COMPONENTS) AND _MAGNUM_${_COMPONENT}_INCLUDE_DIR AND (MAGNUM_${_COMPONENT}_LIBRARY_DEBUG OR MAGNUM_${_COMPONENT}_LIBRARY_RELEASE)) OR (_component IN_LIST _MAGNUM_EXECUTABLE_COMPONENTS AND MAGNUM_${_COMPONENT}_EXECUTABLE)) + set(Magnum_${_component}_FOUND TRUE) + else() + set(Magnum_${_component}_FOUND FALSE) + endif() + endif() + + # Global aliases for Windowless*Application, *Application and *Context + # components. If already set, unset them to avoid ambiguity. + if(_component MATCHES "Windowless.+Application") + if(NOT DEFINED _MAGNUM_WINDOWLESSAPPLICATION_ALIAS) + set(_MAGNUM_WINDOWLESSAPPLICATION_ALIAS Magnum::${_component}) + else() + unset(_MAGNUM_WINDOWLESSAPPLICATION_ALIAS) + endif() + elseif(_component MATCHES ".+Application") + if(NOT DEFINED _MAGNUM_APPLICATION_ALIAS) + set(_MAGNUM_APPLICATION_ALIAS Magnum::${_component}) + else() + unset(_MAGNUM_APPLICATION_ALIAS) + endif() + elseif(_component MATCHES ".+Context") + if(NOT DEFINED _MAGNUM_GLCONTEXT_ALIAS) + set(_MAGNUM_GLCONTEXT_ALIAS Magnum::${_component}) + else() + unset(_MAGNUM_GLCONTEXT_ALIAS) + endif() + endif() +endforeach() + +# Emscripten-specific files and flags +if(CORRADE_TARGET_EMSCRIPTEN) + find_file(MAGNUM_EMSCRIPTENAPPLICATION_JS EmscriptenApplication.js + PATH_SUFFIXES share/magnum) + find_file(MAGNUM_WINDOWLESSEMSCRIPTENAPPLICATION_JS WindowlessEmscriptenApplication.js + PATH_SUFFIXES share/magnum) + find_file(MAGNUM_WEBAPPLICATION_CSS WebApplication.css + PATH_SUFFIXES share/magnum) + mark_as_advanced( + MAGNUM_EMSCRIPTENAPPLICATION_JS + MAGNUM_WINDOWLESSEMSCRIPTENAPPLICATION_JS + MAGNUM_WEBAPPLICATION_CSS) + set(MAGNUM_EXTRAS_NEEDED + MAGNUM_EMSCRIPTENAPPLICATION_JS + MAGNUM_WINDOWLESSEMSCRIPTENAPPLICATION_JS + MAGNUM_WEBAPPLICATION_CSS) + + # If we are on CMake 3.13 and up, `-s USE_WEBGL2=1` linker option is + # propagated from FindOpenGLES3.cmake already. If not (and the GL library + # is used), we need to modify the global CMAKE_EXE_LINKER_FLAGS. Do it here + # instead of in FindOpenGLES3.cmake so it works also for CMake subprojects + # (in which case find_package(OpenGLES3) is called in (and so + # CMAKE_EXE_LINKER_FLAGS would be modified in) Magnum's root CMakeLists.txt + # and thus can't affect the variable in the outer project). CMake supports + # IN_LIST as an operator since 3.1 (Emscripten needs at least 3.7), but + # it's behind a policy, so enable that one as well. + cmake_policy(SET CMP0057 NEW) + if(CMAKE_VERSION VERSION_LESS 3.13 AND GL IN_LIST Magnum_FIND_COMPONENTS AND NOT MAGNUM_TARGET_GLES2 AND NOT CMAKE_EXE_LINKER_FLAGS MATCHES "-s USE_WEBGL2=1") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s USE_WEBGL2=1") + endif() +endif() + +# For CMake 3.16+ with REASON_FAILURE_MESSAGE, provide additional potentially +# useful info about the failed components. +if(NOT CMAKE_VERSION VERSION_LESS 3.16) + set(_MAGNUM_REASON_FAILURE_MESSAGE ) + # Go only through the originally specified find_package() components, not + # the dependencies added by us afterwards + foreach(_component ${_MAGNUM_ORIGINAL_FIND_COMPONENTS}) + if(Magnum_${_component}_FOUND) + continue() + endif() + + # If it's not known at all, tell the user -- it might be a new library + # and an old Find module, or something platform-specific. + if(NOT _component IN_LIST _MAGNUM_LIBRARY_COMPONENTS AND NOT _component IN_LIST _MAGNUM_PLUGIN_COMPONENTS AND NOT _component IN_LIST _MAGNUM_EXECUTABLE_COMPONENTS) + list(APPEND _MAGNUM_REASON_FAILURE_MESSAGE "${_component} is not a known component on this platform.") + # Otherwise, if it's not among implicitly built components, hint that + # the user may need to enable it + # TODO: currently, the _FOUND variable doesn't reflect if dependencies + # were found. When it will, this needs to be updated to avoid + # misleading messages. + elseif(NOT _component IN_LIST _MAGNUM_IMPLICITLY_ENABLED_COMPONENTS) + string(TOUPPER ${_component} _COMPONENT) + list(APPEND _MAGNUM_REASON_FAILURE_MESSAGE "${_component} is not built by default. Make sure you enabled WITH_${_COMPONENT} when building Magnum.") + # Otherwise we have no idea. Better be silent than to print something + # misleading. + else() + endif() + endforeach() + + string(REPLACE ";" " " _MAGNUM_REASON_FAILURE_MESSAGE "${_MAGNUM_REASON_FAILURE_MESSAGE}") + set(_MAGNUM_REASON_FAILURE_MESSAGE REASON_FAILURE_MESSAGE "${_MAGNUM_REASON_FAILURE_MESSAGE}") +endif() + +# Complete the check with also all components +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Magnum + REQUIRED_VARS MAGNUM_INCLUDE_DIR MAGNUM_LIBRARY ${MAGNUM_EXTRAS_NEEDED} + HANDLE_COMPONENTS + ${_MAGNUM_REASON_FAILURE_MESSAGE}) + +# Components with optional dependencies -- add them once we know if they were +# found or not. +foreach(_component ${_MAGNUM_OPTIONAL_DEPENDENCIES_TO_ADD}) + foreach(_dependency ${_MAGNUM_${_component}_OPTIONAL_DEPENDENCIES_TO_ADD}) + if(Magnum_${_dependency}_FOUND) + set_property(TARGET Magnum::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES Magnum::${_dependency}) + endif() + endforeach() +endforeach() + +# Create Windowless*Application, *Application and *Context aliases +# TODO: ugh why can't I make an alias of IMPORTED target? +if(_MAGNUM_WINDOWLESSAPPLICATION_ALIAS AND NOT TARGET Magnum::WindowlessApplication) + get_target_property(_MAGNUM_WINDOWLESSAPPLICATION_ALIASED_TARGET ${_MAGNUM_WINDOWLESSAPPLICATION_ALIAS} ALIASED_TARGET) + if(_MAGNUM_WINDOWLESSAPPLICATION_ALIASED_TARGET) + add_library(Magnum::WindowlessApplication ALIAS ${_MAGNUM_WINDOWLESSAPPLICATION_ALIASED_TARGET}) + else() + add_library(Magnum::WindowlessApplication UNKNOWN IMPORTED) + foreach(property IMPORTED_CONFIGURATIONS INTERFACE_INCLUDE_DIRECTORIES INTERFACE_COMPILE_DEFINITIONS INTERFACE_COMPILE_OPTIONS INTERFACE_LINK_LIBRARIES) + get_target_property(_MAGNUM_WINDOWLESSAPPLICATION_${property} ${_MAGNUM_WINDOWLESSAPPLICATION_ALIAS} ${property}) + if(_MAGNUM_WINDOWLESSAPPLICATION_${property}) + set_target_properties(Magnum::WindowlessApplication PROPERTIES + ${property} "${_MAGNUM_WINDOWLESSAPPLICATION_${property}}") + endif() + endforeach() + get_target_property(_MAGNUM_WINDOWLESSAPPLICATION_IMPORTED_LOCATION_RELEASE ${_MAGNUM_WINDOWLESSAPPLICATION_ALIAS} IMPORTED_LOCATION_RELEASE) + get_target_property(_MAGNUM_WINDOWLESSAPPLICATION_IMPORTED_LOCATION_DEBUG ${_MAGNUM_WINDOWLESSAPPLICATION_ALIAS} IMPORTED_LOCATION_DEBUG) + if(_MAGNUM_WINDOWLESSAPPLICATION_IMPORTED_LOCATION_RELEASE) + set_target_properties(Magnum::WindowlessApplication PROPERTIES + IMPORTED_LOCATION_RELEASE ${_MAGNUM_WINDOWLESSAPPLICATION_IMPORTED_LOCATION_RELEASE}) + endif() + if(_MAGNUM_WINDOWLESSAPPLICATION_IMPORTED_LOCATION_DEBUG) + set_target_properties(Magnum::WindowlessApplication PROPERTIES + IMPORTED_LOCATION_DEBUG ${_MAGNUM_WINDOWLESSAPPLICATION_IMPORTED_LOCATION_DEBUG}) + endif() + endif() + # Prevent creating the alias again + unset(_MAGNUM_WINDOWLESSAPPLICATION_ALIAS) +endif() +if(_MAGNUM_APPLICATION_ALIAS AND NOT TARGET Magnum::Application) + get_target_property(_MAGNUM_APPLICATION_ALIASED_TARGET ${_MAGNUM_APPLICATION_ALIAS} ALIASED_TARGET) + if(_MAGNUM_APPLICATION_ALIASED_TARGET) + add_library(Magnum::Application ALIAS ${_MAGNUM_APPLICATION_ALIASED_TARGET}) + else() + add_library(Magnum::Application UNKNOWN IMPORTED) + foreach(property IMPORTED_CONFIGURATIONS INTERFACE_INCLUDE_DIRECTORIES INTERFACE_COMPILE_DEFINITIONS INTERFACE_COMPILE_OPTIONS INTERFACE_LINK_LIBRARIES) + get_target_property(_MAGNUM_APPLICATION_${property} + ${_MAGNUM_APPLICATION_ALIAS} ${property}) + if(_MAGNUM_APPLICATION_${property}) + set_target_properties(Magnum::Application PROPERTIES ${property} + "${_MAGNUM_APPLICATION_${property}}") + endif() + endforeach() + get_target_property(_MAGNUM_APPLICATION_IMPORTED_LOCATION_RELEASE ${_MAGNUM_APPLICATION_ALIAS} IMPORTED_LOCATION_RELEASE) + get_target_property(_MAGNUM_APPLICATION_IMPORTED_LOCATION_DEBUG ${_MAGNUM_APPLICATION_ALIAS} IMPORTED_LOCATION_DEBUG) + if(_MAGNUM_APPLICATION_IMPORTED_LOCATION_RELEASE) + set_target_properties(Magnum::Application PROPERTIES + IMPORTED_LOCATION_RELEASE ${_MAGNUM_APPLICATION_IMPORTED_LOCATION_RELEASE}) + endif() + if(_MAGNUM_APPLICATION_IMPORTED_LOCATION_DEBUG) + set_target_properties(Magnum::Application PROPERTIES + IMPORTED_LOCATION_DEBUG ${_MAGNUM_APPLICATION_IMPORTED_LOCATION_DEBUG}) + endif() + endif() + # Prevent creating the alias again + unset(_MAGNUM_APPLICATION_ALIAS) +endif() +if(_MAGNUM_GLCONTEXT_ALIAS AND NOT TARGET Magnum::GLContext) + get_target_property(_MAGNUM_GLCONTEXT_ALIASED_TARGET ${_MAGNUM_GLCONTEXT_ALIAS} ALIASED_TARGET) + if(_MAGNUM_GLCONTEXT_ALIASED_TARGET) + add_library(Magnum::GLContext ALIAS ${_MAGNUM_GLCONTEXT_ALIASED_TARGET}) + else() + add_library(Magnum::GLContext UNKNOWN IMPORTED) + foreach(property IMPORTED_CONFIGURATIONS INTERFACE_INCLUDE_DIRECTORIES INTERFACE_COMPILE_DEFINITIONS INTERFACE_COMPILE_OPTIONS INTERFACE_LINK_LIBRARIES) + get_target_property(_MAGNUM_GLCONTEXT_${property} ${_MAGNUM_GLCONTEXT_ALIAS} ${property}) + if(_MAGNUM_GLCONTEXT_${property}) + set_target_properties(Magnum::GLContext PROPERTIES ${property} + "${_MAGNUM_GLCONTEXT_${property}}") + endif() + endforeach() + get_target_property(_MAGNUM_GLCONTEXT_IMPORTED_LOCATION_RELEASE ${_MAGNUM_GLCONTEXT_ALIAS} IMPORTED_LOCATION_RELEASE) + get_target_property(_MAGNUM_GLCONTEXT_IMPORTED_LOCATION_DEBUG ${_MAGNUM_GLCONTEXT_ALIAS} IMPORTED_LOCATION_DEBUG) + if(_MAGNUM_GLCONTEXT_IMPORTED_LOCATION_RELEASE) + set_target_properties(Magnum::GLContext PROPERTIES + IMPORTED_LOCATION_RELEASE ${_MAGNUM_GLCONTEXT_IMPORTED_LOCATION_RELEASE}) + endif() + if(_MAGNUM_GLCONTEXT_IMPORTED_LOCATION_DEBUG) + set_target_properties(Magnum::GLContext PROPERTIES + IMPORTED_LOCATION_DEBUG ${_MAGNUM_GLCONTEXT_IMPORTED_LOCATION_DEBUG}) + endif() + endif() + # Prevent creating the alias again + unset(_MAGNUM_GLCONTEXT_ALIAS) +endif() + +# Installation and deploy dirs +set(MAGNUM_DEPLOY_PREFIX "." + CACHE STRING "Prefix where to put final application executables") + +include(${CORRADE_LIB_SUFFIX_MODULE}) +set(MAGNUM_BINARY_INSTALL_DIR bin) +set(MAGNUM_LIBRARY_INSTALL_DIR lib${LIB_SUFFIX}) +set(MAGNUM_DATA_INSTALL_DIR share/magnum) +set(MAGNUM_INCLUDE_INSTALL_DIR include/Magnum) +set(MAGNUM_EXTERNAL_INCLUDE_INSTALL_DIR include/MagnumExternal) +set(MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR include/MagnumPlugins) +if(MAGNUM_BUILD_DEPRECATED AND MAGNUM_INCLUDE_INSTALL_PREFIX AND NOT MAGNUM_INCLUDE_INSTALL_PREFIX STREQUAL ".") + message(DEPRECATION "MAGNUM_INCLUDE_INSTALL_PREFIX is obsolete as its primary use was for old Android NDK versions. Please switch to the NDK r19+ layout instead of using this variable and recreate your build directory to get rid of this warning.") + set(MAGNUM_DATA_INSTALL_DIR ${MAGNUM_INCLUDE_INSTALL_PREFIX}/${MAGNUM_DATA_INSTALL_DIR}) + set(MAGNUM_INCLUDE_INSTALL_DIR ${MAGNUM_INCLUDE_INSTALL_PREFIX}/${MAGNUM_INCLUDE_INSTALL_DIR}) + set(MAGNUM_EXTERNAL_INCLUDE_INSTALL_DIR ${MAGNUM_INCLUDE_INSTALL_PREFIX}/${MAGNUM_EXTERNAL_INCLUDE_INSTALL_DIR}) + set(MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR ${MAGNUM_INCLUDE_INSTALL_PREFIX}/${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}) +endif() + +set(MAGNUM_PLUGINS_DEBUG_BINARY_INSTALL_DIR ${MAGNUM_BINARY_INSTALL_DIR}/magnum-d) +set(MAGNUM_PLUGINS_DEBUG_LIBRARY_INSTALL_DIR ${MAGNUM_LIBRARY_INSTALL_DIR}/magnum-d) +set(MAGNUM_PLUGINS_RELEASE_BINARY_INSTALL_DIR ${MAGNUM_BINARY_INSTALL_DIR}/magnum) +set(MAGNUM_PLUGINS_RELEASE_LIBRARY_INSTALL_DIR ${MAGNUM_LIBRARY_INSTALL_DIR}/magnum) + +set(MAGNUM_PLUGINS_SHADERCONVERTER_DEBUG_BINARY_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_BINARY_INSTALL_DIR}/shaderconverters) +set(MAGNUM_PLUGINS_SHADERCONVERTER_DEBUG_LIBRARY_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_LIBRARY_INSTALL_DIR}/shaderconverters) +set(MAGNUM_PLUGINS_SHADERCONVERTER_RELEASE_LIBRARY_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_LIBRARY_INSTALL_DIR}/shaderconverters) +set(MAGNUM_PLUGINS_SHADERCONVERTER_RELEASE_BINARY_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_BINARY_INSTALL_DIR}/shaderconverters) +set(MAGNUM_PLUGINS_FONT_DEBUG_BINARY_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_BINARY_INSTALL_DIR}/fonts) +set(MAGNUM_PLUGINS_FONT_DEBUG_LIBRARY_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_LIBRARY_INSTALL_DIR}/fonts) +set(MAGNUM_PLUGINS_FONT_RELEASE_BINARY_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_BINARY_INSTALL_DIR}/fonts) +set(MAGNUM_PLUGINS_FONT_RELEASE_LIBRARY_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_LIBRARY_INSTALL_DIR}/fonts) +set(MAGNUM_PLUGINS_FONTCONVERTER_DEBUG_BINARY_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_BINARY_INSTALL_DIR}/fontconverters) +set(MAGNUM_PLUGINS_FONTCONVERTER_RELEASE_LIBRARY_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_LIBRARY_INSTALL_DIR}/fontconverters) +set(MAGNUM_PLUGINS_IMAGECONVERTER_DEBUG_BINARY_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_BINARY_INSTALL_DIR}/imageconverters) +set(MAGNUM_PLUGINS_IMAGECONVERTER_DEBUG_LIBRARY_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_LIBRARY_INSTALL_DIR}/imageconverters) +set(MAGNUM_PLUGINS_IMAGECONVERTER_RELEASE_LIBRARY_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_LIBRARY_INSTALL_DIR}/imageconverters) +set(MAGNUM_PLUGINS_IMAGECONVERTER_RELEASE_BINARY_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_BINARY_INSTALL_DIR}/imageconverters) +set(MAGNUM_PLUGINS_IMPORTER_DEBUG_BINARY_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_BINARY_INSTALL_DIR}/importers) +set(MAGNUM_PLUGINS_IMPORTER_DEBUG_LIBRARY_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_LIBRARY_INSTALL_DIR}/importers) +set(MAGNUM_PLUGINS_IMPORTER_RELEASE_BINARY_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_BINARY_INSTALL_DIR}/importers) +set(MAGNUM_PLUGINS_IMPORTER_RELEASE_LIBRARY_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_LIBRARY_INSTALL_DIR}/importers) +set(MAGNUM_PLUGINS_SCENECONVERTER_DEBUG_BINARY_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_BINARY_INSTALL_DIR}/sceneconverters) +set(MAGNUM_PLUGINS_SCENECONVERTER_DEBUG_LIBRARY_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_LIBRARY_INSTALL_DIR}/sceneconverters) +set(MAGNUM_PLUGINS_SCENECONVERTER_RELEASE_LIBRARY_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_LIBRARY_INSTALL_DIR}/sceneconverters) +set(MAGNUM_PLUGINS_SCENECONVERTER_RELEASE_BINARY_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_BINARY_INSTALL_DIR}/sceneconverters) +set(MAGNUM_PLUGINS_AUDIOIMPORTER_DEBUG_BINARY_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_BINARY_INSTALL_DIR}/audioimporters) +set(MAGNUM_PLUGINS_AUDIOIMPORTER_DEBUG_LIBRARY_INSTALL_DIR ${MAGNUM_PLUGINS_DEBUG_LIBRARY_INSTALL_DIR}/audioimporters) +set(MAGNUM_PLUGINS_AUDIOIMPORTER_RELEASE_BINARY_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_BINARY_INSTALL_DIR}/audioimporters) +set(MAGNUM_PLUGINS_AUDIOIMPORTER_RELEASE_LIBRARY_INSTALL_DIR ${MAGNUM_PLUGINS_RELEASE_LIBRARY_INSTALL_DIR}/audioimporters) + +# Get base plugin directory from main library location. This is *not* PATH, +# because CMake always converts the path to an absolute location internally, +# making it impossible to specify relative paths there. Sorry in advance for +# not having the dir selection button in CMake GUI. +set(MAGNUM_PLUGINS_DEBUG_DIR "" + CACHE STRING "Base directory where to look for Magnum plugins for debug builds") +set(MAGNUM_PLUGINS_RELEASE_DIR "" + CACHE STRING "Base directory where to look for Magnum plugins for release builds") +set(MAGNUM_PLUGINS_DIR "" + CACHE STRING "Base directory where to look for Magnum plugins") + +# Plugin directories. Set only if the above are non-empty. otherwise empty as +# well. +if(MAGNUM_PLUGINS_DIR) + set(MAGNUM_PLUGINS_FONT_DIR ${MAGNUM_PLUGINS_DIR}/fonts) + set(MAGNUM_PLUGINS_FONTCONVERTER_DIR ${MAGNUM_PLUGINS_DIR}/fontconverters) + set(MAGNUM_PLUGINS_IMAGECONVERTER_DIR ${MAGNUM_PLUGINS_DIR}/imageconverters) + set(MAGNUM_PLUGINS_IMPORTER_DIR ${MAGNUM_PLUGINS_DIR}/importers) + set(MAGNUM_PLUGINS_SCENECONVERTER_DIR ${MAGNUM_PLUGINS_DIR}/sceneconverters) + set(MAGNUM_PLUGINS_AUDIOIMPORTER_DIR ${MAGNUM_PLUGINS_DIR}/audioimporters) +endif() +if(MAGNUM_PLUGINS_DEBUG_DIR) + set(MAGNUM_PLUGINS_FONT_DEBUG_DIR ${MAGNUM_PLUGINS_DEBUG_DIR}/fonts) + set(MAGNUM_PLUGINS_FONTCONVERTER_DEBUG_DIR ${MAGNUM_PLUGINS_DEBUG_DIR}/fontconverters) + set(MAGNUM_PLUGINS_IMAGECONVERTER_DEBUG_DIR ${MAGNUM_PLUGINS_DEBUG_DIR}/imageconverters) + set(MAGNUM_PLUGINS_IMPORTER_DEBUG_DIR ${MAGNUM_PLUGINS_DEBUG_DIR}/importers) + set(MAGNUM_PLUGINS_FONT_RELEASE_DIR ${MAGNUM_PLUGINS_RELEASE_DIR}/fonts) + set(MAGNUM_PLUGINS_SCENECONVERTER_DEBUG_DIR ${MAGNUM_PLUGINS_DEBUG_DIR}/sceneconverters) + set(MAGNUM_PLUGINS_AUDIOIMPORTER_DEBUG_DIR ${MAGNUM_PLUGINS_DEBUG_DIR}/audioimporters) +endif() +if(MAGNUM_PLUGINS_RELEASE_DIR) + set(MAGNUM_PLUGINS_FONTCONVERTER_RELEASE_DIR ${MAGNUM_PLUGINS_RELEASE_DIR}/fontconverters) + set(MAGNUM_PLUGINS_IMAGECONVERTER_RELEASE_DIR ${MAGNUM_PLUGINS_RELEASE_DIR}/imageconverters) + set(MAGNUM_PLUGINS_IMPORTER_RELEASE_DIR ${MAGNUM_PLUGINS_RELEASE_DIR}/importers) + set(MAGNUM_PLUGINS_SCENECONVERTER_RELEASE_DIR ${MAGNUM_PLUGINS_RELEASE_DIR}/sceneconverters) + set(MAGNUM_PLUGINS_AUDIOIMPORTER_RELEASE_DIR ${MAGNUM_PLUGINS_RELEASE_DIR}/audioimporters) +endif() diff --git a/modules/FindMagnumIntegration.cmake b/modules/FindMagnumIntegration.cmake new file mode 100644 index 0000000..05bfde7 --- /dev/null +++ b/modules/FindMagnumIntegration.cmake @@ -0,0 +1,332 @@ +#.rst: +# Find Magnum integration library +# ------------------------------- +# +# Finds the Magnum integration library. Basic usage:: +# +# find_package(MagnumIntegration REQUIRED) +# +# This command tries to find Magnum integration library and then defines the +# following: +# +# MagnumIntegration_FOUND - Whether the library was found +# +# This command alone is useless without specifying the components: +# +# Bullet - Bullet Physics integration library +# Dart - Dart Physics integration library +# Eigen - Eigen integration library +# Glm - GLM integration library +# ImGui - ImGui integration library +# Ovr - Oculus SDK integration library +# +# Example usage with specifying additional components is: +# +# find_package(MagnumIntegration REQUIRED Bullet) +# +# For each component is then defined: +# +# MagnumIntegration_*_FOUND - Whether the component was found +# MagnumIntegration::* - Component imported target +# +# The package is found if either debug or release version of each requested +# library is found. If both debug and release libraries are found, proper +# version is chosen based on actual build configuration of the project (i.e. +# Debug build is linked to debug libraries, Release build to release +# libraries). +# +# Additionally these variables are defined for internal usage: +# +# MAGNUMINTEGRATION_INCLUDE_DIR - Magnum integration include dir (w/o +# dependencies) +# MAGNUMINTEGRATION_*_LIBRARY_DEBUG - Debug version of given library, if found +# MAGNUMINTEGRATION_*_LIBRARY_RELEASE - Release version of given library, if +# found +# + +# +# This file is part of Magnum. +# +# Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, +# 2020, 2021 Vladimír Vondruš +# Copyright © 2018 Konstantinos Chatzilygeroudis +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. +# + +# Magnum library dependencies +set(_MAGNUMINTEGRATION_DEPENDENCIES ) +foreach(_component ${MagnumIntegration_FIND_COMPONENTS}) + if(_component STREQUAL Bullet) + set(_MAGNUMINTEGRATION_${_component}_MAGNUM_DEPENDENCIES SceneGraph Shaders GL) + elseif(_component STREQUAL Dart) + set(_MAGNUMINTEGRATION_${_component}_MAGNUM_DEPENDENCIES SceneGraph Primitives MeshTools GL) + elseif(_component STREQUAL ImGui) + set(_MAGNUMINTEGRATION_${_component}_MAGNUM_DEPENDENCIES GL Shaders) + endif() + + list(APPEND _MAGNUMINTEGRATION_DEPENDENCIES ${_MAGNUMINTEGRATION_${_component}_MAGNUM_DEPENDENCIES}) + list(APPEND _MAGNUMINTEGRATION_OPTIONAL_DEPENDENCIES ${_MAGNUMINTEGRATION_${_component}_MAGNUM_OPTIONAL_DEPENDENCIES}) +endforeach() +find_package(Magnum REQUIRED ${_MAGNUMINTEGRATION_DEPENDENCIES}) +if(_MAGNUMINTEGRATION_OPTIONAL_DEPENDENCIES) + find_package(Magnum OPTIONAL_COMPONENTS ${_MAGNUMINTEGRATION_OPTIONAL_DEPENDENCIES}) +endif() + +# Global integration include dir +find_path(MAGNUMINTEGRATION_INCLUDE_DIR Magnum + HINTS ${MAGNUM_INCLUDE_DIR}) +mark_as_advanced(MAGNUMINTEGRATION_INCLUDE_DIR) + +# Component distinction (listing them explicitly to avoid mistakes with finding +# components from other repositories) +set(_MAGNUMINTEGRATION_LIBRARY_COMPONENTS Bullet Dart Eigen ImGui Glm) +if(CORRADE_TARGET_WINDOWS) + list(APPEND _MAGNUMINTEGRATION_LIBRARY_COMPONENTS Ovr) +endif() +set(_MAGNUMINTEGRATION_HEADER_ONLY_COMPONENTS Eigen) +# Nothing is enabled by default right now +set(_MAGNUMINTEGRATION_IMPLICITLY_ENABLED_COMPONENTS ) + +# Inter-component dependencies (none yet) +# set(_MAGNUMINTEGRATION_Component_DEPENDENCIES Dependency) + +# Ensure that all inter-component dependencies are specified as well +set(_MAGNUMINTEGRATION_ADDITIONAL_COMPONENTS ) +foreach(_component ${MagnumIntegration_FIND_COMPONENTS}) + # Mark the dependencies as required if the component is also required + if(MagnumIntegration_FIND_REQUIRED_${_component}) + foreach(_dependency ${_MAGNUMINTEGRATION_${_component}_DEPENDENCIES}) + set(MagnumIntegration_FIND_REQUIRED_${_dependency} TRUE) + endforeach() + endif() + + list(APPEND _MAGNUMINTEGRATION_ADDITIONAL_COMPONENTS ${_MAGNUMINTEGRATION_${_component}_DEPENDENCIES}) +endforeach() + +# Join the lists, remove duplicate components +set(_MAGNUMINTEGRATION_ORIGINAL_FIND_COMPONENTS ${MagnumIntegration_FIND_COMPONENTS}) +if(_MAGNUMINTEGRATION_ADDITIONAL_COMPONENTS) + list(INSERT MagnumIntegration_FIND_COMPONENTS 0 ${_MAGNUMINTEGRATION_ADDITIONAL_COMPONENTS}) +endif() +if(MagnumIntegration_FIND_COMPONENTS) + list(REMOVE_DUPLICATES MagnumIntegration_FIND_COMPONENTS) +endif() + +# Find all components +foreach(_component ${MagnumIntegration_FIND_COMPONENTS}) + string(TOUPPER ${_component} _COMPONENT) + + # Create imported target in case the library is found. If the project is + # added as subproject to CMake, the target already exists and all the + # required setup is already done from the build tree. + if(TARGET MagnumIntegration::${_component}) + set(MagnumIntegration_${_component}_FOUND TRUE) + else() + # Library components + if(_component IN_LIST _MAGNUMINTEGRATION_LIBRARY_COMPONENTS AND NOT _component IN_LIST _MAGNUMINTEGRATION_HEADER_ONLY_COMPONENTS) + add_library(MagnumIntegration::${_component} UNKNOWN IMPORTED) + + # Try to find both debug and release version + find_library(MAGNUMINTEGRATION_${_COMPONENT}_LIBRARY_DEBUG Magnum${_component}Integration-d) + find_library(MAGNUMINTEGRATION_${_COMPONENT}_LIBRARY_RELEASE Magnum${_component}Integration) + mark_as_advanced(MAGNUMINTEGRATION_${_COMPONENT}_LIBRARY_DEBUG + MAGNUMINTEGRATION_${_COMPONENT}_LIBRARY_RELEASE) + + if(MAGNUMINTEGRATION_${_COMPONENT}_LIBRARY_RELEASE) + set_property(TARGET MagnumIntegration::${_component} APPEND PROPERTY + IMPORTED_CONFIGURATIONS RELEASE) + set_property(TARGET MagnumIntegration::${_component} PROPERTY + IMPORTED_LOCATION_RELEASE ${MAGNUMINTEGRATION_${_COMPONENT}_LIBRARY_RELEASE}) + endif() + + if(MAGNUMINTEGRATION_${_COMPONENT}_LIBRARY_DEBUG) + set_property(TARGET MagnumIntegration::${_component} APPEND PROPERTY + IMPORTED_CONFIGURATIONS DEBUG) + set_property(TARGET MagnumIntegration::${_component} PROPERTY + IMPORTED_LOCATION_DEBUG ${MAGNUMINTEGRATION_${_COMPONENT}_LIBRARY_DEBUG}) + endif() + + # Header-only library components + elseif(_component IN_LIST _MAGNUMINTEGRATION_HEADER_ONLY_COMPONENTS) + add_library(MagnumIntegration::${_component} INTERFACE IMPORTED) + + # Something unknown, skip. FPHSA will take care of handling this below. + else() + continue() + endif() + + # Bullet integration library + if(_component STREQUAL Bullet) + # On Emscripten, Bullet could be taken from ports. If that's the + # case, propagate proper compiler flag. + if(CORRADE_TARGET_EMSCRIPTEN) + find_file(_MAGNUMINTEGRATION_${_COMPONENT}_CONFIGURE_FILE configure.h + HINTS ${MAGNUMINTEGRATION_INCLUDE_DIR}/Magnum/${_component}Integration) + file(READ ${_MAGNUMINTEGRATION_${_COMPONENT}_CONFIGURE_FILE} _magnum${_component}IntegrationConfigure) + string(FIND "${_magnum${_component}IntegrationConfigure}" "#define MAGNUM_USE_EMSCRIPTEN_PORTS_BULLET" _magnum${_component}Integration_USE_EMSCRIPTEN_PORTS_BULLET) + if(NOT _magnum${_component}Integration_USE_EMSCRIPTEN_PORTS_BULLET EQUAL -1) + set(MAGNUM_USE_EMSCRIPTEN_PORTS_BULLET 1) + endif() + endif() + + if(MAGNUM_USE_EMSCRIPTEN_PORTS_BULLET) + if(CMAKE_VERSION VERSION_LESS 3.13) + message(FATAL_ERROR "BulletIntegration was compiled against emscripten-ports version but linking to it requires CMake 3.13 at least") + endif() + set_property(TARGET MagnumIntegration::${_component} APPEND PROPERTY + INTERFACE_COMPILE_OPTIONS "SHELL:-s USE_BULLET=1") + set_property(TARGET MagnumIntegration::${_component} APPEND PROPERTY + INTERFACE_LINK_OPTIONS "SHELL:-s USE_BULLET=1") + else() + find_package(Bullet) + set_property(TARGET MagnumIntegration::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES Bullet::LinearMath) + endif() + + set(_MAGNUMINTEGRATION_${_COMPONENT}_INCLUDE_PATH_NAMES MotionState.h) + + # Eigen integration library + elseif(_component STREQUAL Eigen) + find_package(Eigen3) + # We could drop this once we can use at least 3.3.1 (Ubuntu 16.04 + # has only 3.3 beta, which doesn't have this target yet), however + # for Travis and AppVeyor we're using FindEigen3.cmake from the + # downloaded sources (because the Eigen3Config.cmake, which + # produces the actual targets, is not there -- only + # Eigen3Config.cmake.in). See the YML files for an extended rant. + # Also, FindEigen3 only defines EIGEN3_INCLUDE_DIR, not even + # EIGEN3_INCLUDE_DIRS, so be extra careful. + # http://eigen.tuxfamily.org/index.php?title=ChangeLog#Eigen_3.3.1 + set_property(TARGET MagnumIntegration::${_component} APPEND PROPERTY + INTERFACE_INCLUDE_DIRECTORIES ${EIGEN3_INCLUDE_DIR}) + + set(_MAGNUMINTEGRATION_${_COMPONENT}_INCLUDE_PATH_NAMES Integration.h) + + # ImGui integration library + elseif(_component STREQUAL ImGui) + find_package(ImGui) + set_property(TARGET MagnumIntegration::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES ImGui::ImGui) + + set(_MAGNUMINTEGRATION_${_COMPONENT}_INCLUDE_PATH_NAMES Integration.h) + + # GLM integration library + elseif(_component STREQUAL Glm) + find_package(GLM) + set_property(TARGET MagnumIntegration::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES GLM::GLM) + + set(_MAGNUMINTEGRATION_${_COMPONENT}_INCLUDE_PATH_NAMES Integration.h) + + # Dart integration library + elseif(_component STREQUAL Dart) + find_package(DART 6.0.0 CONFIG REQUIRED) + set_property(TARGET MagnumIntegration::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES dart) + + set(_MAGNUMINTEGRATION_${_COMPONENT}_INCLUDE_PATH_NAMES ConvertShapeNode.h) + + # Oculus SDK integration library + elseif(_component STREQUAL Ovr) + find_package(OVR) + set_property(TARGET MagnumIntegration::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES OVR::OVR) + + set(_MAGNUMINTEGRATION_${_COMPONENT}_INCLUDE_PATH_NAMES OvrIntegration.h) + endif() + + # Find library includes + if(_component IN_LIST _MAGNUMINTEGRATION_LIBRARY_COMPONENTS) + find_path(_MAGNUMINTEGRATION_${_COMPONENT}_INCLUDE_DIR + NAMES ${_MAGNUMINTEGRATION_${_COMPONENT}_INCLUDE_PATH_NAMES} + HINTS ${MAGNUMINTEGRATION_INCLUDE_DIR}/Magnum/${_component}Integration) + mark_as_advanced(_MAGNUMINTEGRATION_${_COMPONENT}_INCLUDE_DIR) + endif() + + if(_component IN_LIST _MAGNUMINTEGRATION_LIBRARY_COMPONENTS) + # Link to core Magnum library, add other Magnum required and + # optional dependencies + set_property(TARGET MagnumIntegration::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES Magnum::Magnum) + foreach(_dependency ${_MAGNUMINTEGRATION_${_component}_MAGNUM_DEPENDENCIES}) + set_property(TARGET MagnumIntegration::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES Magnum::${_dependency}) + endforeach() + foreach(_dependency ${_MAGNUMINTEGRATION_${_component}_MAGNUM_OPTIONAL_DEPENDENCIES}) + if(Magnum_${_dependency}_FOUND) + set_property(TARGET MagnumIntegration::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES Magnum::${_dependency}) + endif() + endforeach() + + # Add inter-project dependencies + foreach(_dependency ${_MAGNUMINTEGRATION_${_component}_DEPENDENCIES}) + set_property(TARGET MagnumIntegration::${_component} APPEND PROPERTY + INTERFACE_LINK_LIBRARIES MagnumIntegration::${_dependency}) + endforeach() + endif() + + # Decide if the library was found + if(_component IN_LIST _MAGNUMINTEGRATION_LIBRARY_COMPONENTS AND _MAGNUMINTEGRATION_${_COMPONENT}_INCLUDE_DIR AND (_component IN_LIST _MAGNUMINTEGRATION_HEADER_ONLY_COMPONENTS OR MAGNUMINTEGRATION_${_COMPONENT}_LIBRARY_DEBUG OR MAGNUMINTEGRATION_${_COMPONENT}_LIBRARY_RELEASE)) + set(MagnumIntegration_${_component}_FOUND TRUE) + else() + set(MagnumIntegration_${_component}_FOUND FALSE) + endif() + endif() +endforeach() + +# For CMake 3.16+ with REASON_FAILURE_MESSAGE, provide additional potentially +# useful info about the failed components. +if(NOT CMAKE_VERSION VERSION_LESS 3.16) + set(_MAGNUMINTEGRATION_REASON_FAILURE_MESSAGE ) + # Go only through the originally specified find_package() components, not + # the dependencies added by us afterwards + foreach(_component ${_MAGNUMINTEGRATION_ORIGINAL_FIND_COMPONENTS}) + if(MagnumIntegration_${_component}_FOUND) + continue() + endif() + + # If it's not known at all, tell the user -- it might be a new library + # and an old Find module, or something platform-specific. + if(NOT _component IN_LIST _MAGNUMINTEGRATION_LIBRARY_COMPONENTS) + list(APPEND _MAGNUMINTEGRATION_REASON_FAILURE_MESSAGE "${_component} is not a known component on this platform.") + # Otherwise, if it's not among implicitly built components, hint that + # the user may need to enable it + # TODO: currently, the _FOUND variable doesn't reflect if dependencies + # were found. When it will, this needs to be updated to avoid + # misleading messages. + elseif(NOT _component IN_LIST _MAGNUMINTEGRATION_IMPLICITLY_ENABLED_COMPONENTS) + string(TOUPPER ${_component} _COMPONENT) + list(APPEND _MAGNUMINTEGRATION_REASON_FAILURE_MESSAGE "${_component} is not built by default. Make sure you enabled WITH_${_COMPONENT} when building Magnum Integration.") + # Otherwise we have no idea. Better be silent than to print something + # misleading. + else() + endif() + endforeach() + + string(REPLACE ";" " " _MAGNUMINTEGRATION_REASON_FAILURE_MESSAGE "${_MAGNUMINTEGRATION_REASON_FAILURE_MESSAGE}") + set(_MAGNUMINTEGRATION_REASON_FAILURE_MESSAGE REASON_FAILURE_MESSAGE "${_MAGNUMINTEGRATION_REASON_FAILURE_MESSAGE}") +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(MagnumIntegration + REQUIRED_VARS MAGNUMINTEGRATION_INCLUDE_DIR + HANDLE_COMPONENTS + ${_MAGNUMINTEGRATION_REASON_FAILURE_MESSAGE}) diff --git a/modules/FindSDL2.cmake b/modules/FindSDL2.cmake new file mode 100644 index 0000000..54844d6 --- /dev/null +++ b/modules/FindSDL2.cmake @@ -0,0 +1,285 @@ +#.rst: +# Find SDL2 +# --------- +# +# Finds the SDL2 library. This module defines: +# +# SDL2_FOUND - True if SDL2 library is found +# SDL2::SDL2 - SDL2 imported target +# +# Additionally these variables are defined for internal usage: +# +# SDL2_LIBRARY_DEBUG - SDL2 debug library, if found +# SDL2_LIBRARY_RELEASE - SDL2 release library, if found +# SDL2_DLL_DEBUG - SDL2 debug DLL on Windows, if found +# SDL2_DLL_RELEASE - SDL2 release DLL on Windows, if found +# SDL2_INCLUDE_DIR - Root include dir +# + +# +# This file is part of Magnum. +# +# Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, +# 2020, 2021 Vladimír Vondruš +# Copyright © 2018 Jonathan Hale +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. +# + +# If we have a CMake subproject, use the targets directly. I'd prefer the +# static variant, however SDL2 defines its own SDL2::SDL2 alias for only the +# dynamic variant since https://github.com/libsdl-org/SDL/pull/4074 and so I'm +# forced to use that, if available. +if(TARGET SDL2) + # In case we don't have https://github.com/libsdl-org/SDL/pull/4074 yet, + # do the alias ourselves. + if(NOT TARGET SDL2::SDL2) + # Aliases of (global) targets are only supported in CMake 3.11, so we + # work around it by this. This is easier than fetching all possible + # properties (which are impossible to track of) and then attempting to + # rebuild them into a new target. + add_library(SDL2::SDL2 INTERFACE IMPORTED) + set_target_properties(SDL2::SDL2 PROPERTIES INTERFACE_LINK_LIBRARIES SDL2) + endif() + + # Just to make FPHSA print some meaningful location, nothing else. Not + # using the INTERFACE_INCLUDE_DIRECTORIES as that contains + # $ + + + + + + \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..9f1cc1d --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,72 @@ +# MassBuilderSaveTool +# Copyright (C) 2021 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 . + +set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) + +find_package(Corrade REQUIRED Main Containers Utility Interconnect) +find_package(Magnum REQUIRED GL Sdl2Application SceneGraph MeshTools Primitives) +find_package(MagnumIntegration REQUIRED ImGui) + +set_directory_properties(PROPERTIES CORRADE_USE_PEDANTIC_FLAGS ON) + +corrade_add_resource(Assets assets.conf) + +add_executable(MassBuilderSaveTool WIN32 + main.cpp + SaveTool/SaveTool.h + SaveTool/SaveTool.cpp + SaveTool/SaveTool_drawAbout.cpp + SaveTool/SaveTool_drawMainMenu.cpp + SaveTool/SaveTool_MainManager.cpp + SaveTool/SaveTool_ProfileManager.cpp + MassBuilderManager/MassBuilderManager.h + MassBuilderManager/MassBuilderManager.cpp + ProfileManager/ProfileManager.h + ProfileManager/ProfileManager.cpp + Profile/Profile.h + Profile/Profile.cpp + MassManager/MassManager.h + MassManager/MassManager.cpp + Mass/Mass.h + Mass/Mass.cpp + Maps/LastMissionId.h + Maps/StoryProgress.h + FontAwesome/IconsFontAwesome5.h + FontAwesome/IconsFontAwesome5Brands.h + resource.rc + ${Assets}) + +if(CMAKE_BUILD_TYPE STREQUAL Debug) + add_compile_definitions(MANAGER_DEBUG_BUILD) +endif() + +target_link_options(MassBuilderSaveTool PRIVATE -static -static-libgcc -static-libstdc++) + +target_link_libraries(MassBuilderSaveTool PRIVATE + Corrade::Containers + Corrade::Utility + Corrade::Interconnect + Corrade::Main + Magnum::Magnum + Magnum::GL + Magnum::Sdl2Application + MagnumIntegration::ImGui + efsw + zip + imm32 + wtsapi32) diff --git a/src/FontAwesome/IconsFontAwesome5.h b/src/FontAwesome/IconsFontAwesome5.h new file mode 100644 index 0000000..67cddab --- /dev/null +++ b/src/FontAwesome/IconsFontAwesome5.h @@ -0,0 +1,1012 @@ +// Generated by https://github.com/juliettef/IconFontCppHeaders script GenerateIconFontCppHeaders.py for languages C and C++ +// from https://raw.githubusercontent.com/FortAwesome/Font-Awesome/master/metadata/icons.yml +// for use with https://github.com/FortAwesome/Font-Awesome/blob/master/webfonts/fa-regular-400.ttf, https://github.com/FortAwesome/Font-Awesome/blob/master/webfonts/fa-solid-900.ttf +#pragma once + +#define FONT_ICON_FILE_NAME_FAR "fa-regular-400.ttf" +#define FONT_ICON_FILE_NAME_FAS "fa-solid-900.ttf" + +#define ICON_MIN_FA 0xe005 +#define ICON_MAX_FA 0xf8ff +#define ICON_FA_AD "\xef\x99\x81" // U+f641 +#define ICON_FA_ADDRESS_BOOK "\xef\x8a\xb9" // U+f2b9 +#define ICON_FA_ADDRESS_CARD "\xef\x8a\xbb" // U+f2bb +#define ICON_FA_ADJUST "\xef\x81\x82" // U+f042 +#define ICON_FA_AIR_FRESHENER "\xef\x97\x90" // U+f5d0 +#define ICON_FA_ALIGN_CENTER "\xef\x80\xb7" // U+f037 +#define ICON_FA_ALIGN_JUSTIFY "\xef\x80\xb9" // U+f039 +#define ICON_FA_ALIGN_LEFT "\xef\x80\xb6" // U+f036 +#define ICON_FA_ALIGN_RIGHT "\xef\x80\xb8" // U+f038 +#define ICON_FA_ALLERGIES "\xef\x91\xa1" // U+f461 +#define ICON_FA_AMBULANCE "\xef\x83\xb9" // U+f0f9 +#define ICON_FA_AMERICAN_SIGN_LANGUAGE_INTERPRETING "\xef\x8a\xa3" // U+f2a3 +#define ICON_FA_ANCHOR "\xef\x84\xbd" // U+f13d +#define ICON_FA_ANGLE_DOUBLE_DOWN "\xef\x84\x83" // U+f103 +#define ICON_FA_ANGLE_DOUBLE_LEFT "\xef\x84\x80" // U+f100 +#define ICON_FA_ANGLE_DOUBLE_RIGHT "\xef\x84\x81" // U+f101 +#define ICON_FA_ANGLE_DOUBLE_UP "\xef\x84\x82" // U+f102 +#define ICON_FA_ANGLE_DOWN "\xef\x84\x87" // U+f107 +#define ICON_FA_ANGLE_LEFT "\xef\x84\x84" // U+f104 +#define ICON_FA_ANGLE_RIGHT "\xef\x84\x85" // U+f105 +#define ICON_FA_ANGLE_UP "\xef\x84\x86" // U+f106 +#define ICON_FA_ANGRY "\xef\x95\x96" // U+f556 +#define ICON_FA_ANKH "\xef\x99\x84" // U+f644 +#define ICON_FA_APPLE_ALT "\xef\x97\x91" // U+f5d1 +#define ICON_FA_ARCHIVE "\xef\x86\x87" // U+f187 +#define ICON_FA_ARCHWAY "\xef\x95\x97" // U+f557 +#define ICON_FA_ARROW_ALT_CIRCLE_DOWN "\xef\x8d\x98" // U+f358 +#define ICON_FA_ARROW_ALT_CIRCLE_LEFT "\xef\x8d\x99" // U+f359 +#define ICON_FA_ARROW_ALT_CIRCLE_RIGHT "\xef\x8d\x9a" // U+f35a +#define ICON_FA_ARROW_ALT_CIRCLE_UP "\xef\x8d\x9b" // U+f35b +#define ICON_FA_ARROW_CIRCLE_DOWN "\xef\x82\xab" // U+f0ab +#define ICON_FA_ARROW_CIRCLE_LEFT "\xef\x82\xa8" // U+f0a8 +#define ICON_FA_ARROW_CIRCLE_RIGHT "\xef\x82\xa9" // U+f0a9 +#define ICON_FA_ARROW_CIRCLE_UP "\xef\x82\xaa" // U+f0aa +#define ICON_FA_ARROW_DOWN "\xef\x81\xa3" // U+f063 +#define ICON_FA_ARROW_LEFT "\xef\x81\xa0" // U+f060 +#define ICON_FA_ARROW_RIGHT "\xef\x81\xa1" // U+f061 +#define ICON_FA_ARROW_UP "\xef\x81\xa2" // U+f062 +#define ICON_FA_ARROWS_ALT "\xef\x82\xb2" // U+f0b2 +#define ICON_FA_ARROWS_ALT_H "\xef\x8c\xb7" // U+f337 +#define ICON_FA_ARROWS_ALT_V "\xef\x8c\xb8" // U+f338 +#define ICON_FA_ASSISTIVE_LISTENING_SYSTEMS "\xef\x8a\xa2" // U+f2a2 +#define ICON_FA_ASTERISK "\xef\x81\xa9" // U+f069 +#define ICON_FA_AT "\xef\x87\xba" // U+f1fa +#define ICON_FA_ATLAS "\xef\x95\x98" // U+f558 +#define ICON_FA_ATOM "\xef\x97\x92" // U+f5d2 +#define ICON_FA_AUDIO_DESCRIPTION "\xef\x8a\x9e" // U+f29e +#define ICON_FA_AWARD "\xef\x95\x99" // U+f559 +#define ICON_FA_BABY "\xef\x9d\xbc" // U+f77c +#define ICON_FA_BABY_CARRIAGE "\xef\x9d\xbd" // U+f77d +#define ICON_FA_BACKSPACE "\xef\x95\x9a" // U+f55a +#define ICON_FA_BACKWARD "\xef\x81\x8a" // U+f04a +#define ICON_FA_BACON "\xef\x9f\xa5" // U+f7e5 +#define ICON_FA_BACTERIA "\xee\x81\x99" // U+e059 +#define ICON_FA_BACTERIUM "\xee\x81\x9a" // U+e05a +#define ICON_FA_BAHAI "\xef\x99\xa6" // U+f666 +#define ICON_FA_BALANCE_SCALE "\xef\x89\x8e" // U+f24e +#define ICON_FA_BALANCE_SCALE_LEFT "\xef\x94\x95" // U+f515 +#define ICON_FA_BALANCE_SCALE_RIGHT "\xef\x94\x96" // U+f516 +#define ICON_FA_BAN "\xef\x81\x9e" // U+f05e +#define ICON_FA_BAND_AID "\xef\x91\xa2" // U+f462 +#define ICON_FA_BARCODE "\xef\x80\xaa" // U+f02a +#define ICON_FA_BARS "\xef\x83\x89" // U+f0c9 +#define ICON_FA_BASEBALL_BALL "\xef\x90\xb3" // U+f433 +#define ICON_FA_BASKETBALL_BALL "\xef\x90\xb4" // U+f434 +#define ICON_FA_BATH "\xef\x8b\x8d" // U+f2cd +#define ICON_FA_BATTERY_EMPTY "\xef\x89\x84" // U+f244 +#define ICON_FA_BATTERY_FULL "\xef\x89\x80" // U+f240 +#define ICON_FA_BATTERY_HALF "\xef\x89\x82" // U+f242 +#define ICON_FA_BATTERY_QUARTER "\xef\x89\x83" // U+f243 +#define ICON_FA_BATTERY_THREE_QUARTERS "\xef\x89\x81" // U+f241 +#define ICON_FA_BED "\xef\x88\xb6" // U+f236 +#define ICON_FA_BEER "\xef\x83\xbc" // U+f0fc +#define ICON_FA_BELL "\xef\x83\xb3" // U+f0f3 +#define ICON_FA_BELL_SLASH "\xef\x87\xb6" // U+f1f6 +#define ICON_FA_BEZIER_CURVE "\xef\x95\x9b" // U+f55b +#define ICON_FA_BIBLE "\xef\x99\x87" // U+f647 +#define ICON_FA_BICYCLE "\xef\x88\x86" // U+f206 +#define ICON_FA_BIKING "\xef\xa1\x8a" // U+f84a +#define ICON_FA_BINOCULARS "\xef\x87\xa5" // U+f1e5 +#define ICON_FA_BIOHAZARD "\xef\x9e\x80" // U+f780 +#define ICON_FA_BIRTHDAY_CAKE "\xef\x87\xbd" // U+f1fd +#define ICON_FA_BLENDER "\xef\x94\x97" // U+f517 +#define ICON_FA_BLENDER_PHONE "\xef\x9a\xb6" // U+f6b6 +#define ICON_FA_BLIND "\xef\x8a\x9d" // U+f29d +#define ICON_FA_BLOG "\xef\x9e\x81" // U+f781 +#define ICON_FA_BOLD "\xef\x80\xb2" // U+f032 +#define ICON_FA_BOLT "\xef\x83\xa7" // U+f0e7 +#define ICON_FA_BOMB "\xef\x87\xa2" // U+f1e2 +#define ICON_FA_BONE "\xef\x97\x97" // U+f5d7 +#define ICON_FA_BONG "\xef\x95\x9c" // U+f55c +#define ICON_FA_BOOK "\xef\x80\xad" // U+f02d +#define ICON_FA_BOOK_DEAD "\xef\x9a\xb7" // U+f6b7 +#define ICON_FA_BOOK_MEDICAL "\xef\x9f\xa6" // U+f7e6 +#define ICON_FA_BOOK_OPEN "\xef\x94\x98" // U+f518 +#define ICON_FA_BOOK_READER "\xef\x97\x9a" // U+f5da +#define ICON_FA_BOOKMARK "\xef\x80\xae" // U+f02e +#define ICON_FA_BORDER_ALL "\xef\xa1\x8c" // U+f84c +#define ICON_FA_BORDER_NONE "\xef\xa1\x90" // U+f850 +#define ICON_FA_BORDER_STYLE "\xef\xa1\x93" // U+f853 +#define ICON_FA_BOWLING_BALL "\xef\x90\xb6" // U+f436 +#define ICON_FA_BOX "\xef\x91\xa6" // U+f466 +#define ICON_FA_BOX_OPEN "\xef\x92\x9e" // U+f49e +#define ICON_FA_BOX_TISSUE "\xee\x81\x9b" // U+e05b +#define ICON_FA_BOXES "\xef\x91\xa8" // U+f468 +#define ICON_FA_BRAILLE "\xef\x8a\xa1" // U+f2a1 +#define ICON_FA_BRAIN "\xef\x97\x9c" // U+f5dc +#define ICON_FA_BREAD_SLICE "\xef\x9f\xac" // U+f7ec +#define ICON_FA_BRIEFCASE "\xef\x82\xb1" // U+f0b1 +#define ICON_FA_BRIEFCASE_MEDICAL "\xef\x91\xa9" // U+f469 +#define ICON_FA_BROADCAST_TOWER "\xef\x94\x99" // U+f519 +#define ICON_FA_BROOM "\xef\x94\x9a" // U+f51a +#define ICON_FA_BRUSH "\xef\x95\x9d" // U+f55d +#define ICON_FA_BUG "\xef\x86\x88" // U+f188 +#define ICON_FA_BUILDING "\xef\x86\xad" // U+f1ad +#define ICON_FA_BULLHORN "\xef\x82\xa1" // U+f0a1 +#define ICON_FA_BULLSEYE "\xef\x85\x80" // U+f140 +#define ICON_FA_BURN "\xef\x91\xaa" // U+f46a +#define ICON_FA_BUS "\xef\x88\x87" // U+f207 +#define ICON_FA_BUS_ALT "\xef\x95\x9e" // U+f55e +#define ICON_FA_BUSINESS_TIME "\xef\x99\x8a" // U+f64a +#define ICON_FA_CALCULATOR "\xef\x87\xac" // U+f1ec +#define ICON_FA_CALENDAR "\xef\x84\xb3" // U+f133 +#define ICON_FA_CALENDAR_ALT "\xef\x81\xb3" // U+f073 +#define ICON_FA_CALENDAR_CHECK "\xef\x89\xb4" // U+f274 +#define ICON_FA_CALENDAR_DAY "\xef\x9e\x83" // U+f783 +#define ICON_FA_CALENDAR_MINUS "\xef\x89\xb2" // U+f272 +#define ICON_FA_CALENDAR_PLUS "\xef\x89\xb1" // U+f271 +#define ICON_FA_CALENDAR_TIMES "\xef\x89\xb3" // U+f273 +#define ICON_FA_CALENDAR_WEEK "\xef\x9e\x84" // U+f784 +#define ICON_FA_CAMERA "\xef\x80\xb0" // U+f030 +#define ICON_FA_CAMERA_RETRO "\xef\x82\x83" // U+f083 +#define ICON_FA_CAMPGROUND "\xef\x9a\xbb" // U+f6bb +#define ICON_FA_CANDY_CANE "\xef\x9e\x86" // U+f786 +#define ICON_FA_CANNABIS "\xef\x95\x9f" // U+f55f +#define ICON_FA_CAPSULES "\xef\x91\xab" // U+f46b +#define ICON_FA_CAR "\xef\x86\xb9" // U+f1b9 +#define ICON_FA_CAR_ALT "\xef\x97\x9e" // U+f5de +#define ICON_FA_CAR_BATTERY "\xef\x97\x9f" // U+f5df +#define ICON_FA_CAR_CRASH "\xef\x97\xa1" // U+f5e1 +#define ICON_FA_CAR_SIDE "\xef\x97\xa4" // U+f5e4 +#define ICON_FA_CARAVAN "\xef\xa3\xbf" // U+f8ff +#define ICON_FA_CARET_DOWN "\xef\x83\x97" // U+f0d7 +#define ICON_FA_CARET_LEFT "\xef\x83\x99" // U+f0d9 +#define ICON_FA_CARET_RIGHT "\xef\x83\x9a" // U+f0da +#define ICON_FA_CARET_SQUARE_DOWN "\xef\x85\x90" // U+f150 +#define ICON_FA_CARET_SQUARE_LEFT "\xef\x86\x91" // U+f191 +#define ICON_FA_CARET_SQUARE_RIGHT "\xef\x85\x92" // U+f152 +#define ICON_FA_CARET_SQUARE_UP "\xef\x85\x91" // U+f151 +#define ICON_FA_CARET_UP "\xef\x83\x98" // U+f0d8 +#define ICON_FA_CARROT "\xef\x9e\x87" // U+f787 +#define ICON_FA_CART_ARROW_DOWN "\xef\x88\x98" // U+f218 +#define ICON_FA_CART_PLUS "\xef\x88\x97" // U+f217 +#define ICON_FA_CASH_REGISTER "\xef\x9e\x88" // U+f788 +#define ICON_FA_CAT "\xef\x9a\xbe" // U+f6be +#define ICON_FA_CERTIFICATE "\xef\x82\xa3" // U+f0a3 +#define ICON_FA_CHAIR "\xef\x9b\x80" // U+f6c0 +#define ICON_FA_CHALKBOARD "\xef\x94\x9b" // U+f51b +#define ICON_FA_CHALKBOARD_TEACHER "\xef\x94\x9c" // U+f51c +#define ICON_FA_CHARGING_STATION "\xef\x97\xa7" // U+f5e7 +#define ICON_FA_CHART_AREA "\xef\x87\xbe" // U+f1fe +#define ICON_FA_CHART_BAR "\xef\x82\x80" // U+f080 +#define ICON_FA_CHART_LINE "\xef\x88\x81" // U+f201 +#define ICON_FA_CHART_PIE "\xef\x88\x80" // U+f200 +#define ICON_FA_CHECK "\xef\x80\x8c" // U+f00c +#define ICON_FA_CHECK_CIRCLE "\xef\x81\x98" // U+f058 +#define ICON_FA_CHECK_DOUBLE "\xef\x95\xa0" // U+f560 +#define ICON_FA_CHECK_SQUARE "\xef\x85\x8a" // U+f14a +#define ICON_FA_CHEESE "\xef\x9f\xaf" // U+f7ef +#define ICON_FA_CHESS "\xef\x90\xb9" // U+f439 +#define ICON_FA_CHESS_BISHOP "\xef\x90\xba" // U+f43a +#define ICON_FA_CHESS_BOARD "\xef\x90\xbc" // U+f43c +#define ICON_FA_CHESS_KING "\xef\x90\xbf" // U+f43f +#define ICON_FA_CHESS_KNIGHT "\xef\x91\x81" // U+f441 +#define ICON_FA_CHESS_PAWN "\xef\x91\x83" // U+f443 +#define ICON_FA_CHESS_QUEEN "\xef\x91\x85" // U+f445 +#define ICON_FA_CHESS_ROOK "\xef\x91\x87" // U+f447 +#define ICON_FA_CHEVRON_CIRCLE_DOWN "\xef\x84\xba" // U+f13a +#define ICON_FA_CHEVRON_CIRCLE_LEFT "\xef\x84\xb7" // U+f137 +#define ICON_FA_CHEVRON_CIRCLE_RIGHT "\xef\x84\xb8" // U+f138 +#define ICON_FA_CHEVRON_CIRCLE_UP "\xef\x84\xb9" // U+f139 +#define ICON_FA_CHEVRON_DOWN "\xef\x81\xb8" // U+f078 +#define ICON_FA_CHEVRON_LEFT "\xef\x81\x93" // U+f053 +#define ICON_FA_CHEVRON_RIGHT "\xef\x81\x94" // U+f054 +#define ICON_FA_CHEVRON_UP "\xef\x81\xb7" // U+f077 +#define ICON_FA_CHILD "\xef\x86\xae" // U+f1ae +#define ICON_FA_CHURCH "\xef\x94\x9d" // U+f51d +#define ICON_FA_CIRCLE "\xef\x84\x91" // U+f111 +#define ICON_FA_CIRCLE_NOTCH "\xef\x87\x8e" // U+f1ce +#define ICON_FA_CITY "\xef\x99\x8f" // U+f64f +#define ICON_FA_CLINIC_MEDICAL "\xef\x9f\xb2" // U+f7f2 +#define ICON_FA_CLIPBOARD "\xef\x8c\xa8" // U+f328 +#define ICON_FA_CLIPBOARD_CHECK "\xef\x91\xac" // U+f46c +#define ICON_FA_CLIPBOARD_LIST "\xef\x91\xad" // U+f46d +#define ICON_FA_CLOCK "\xef\x80\x97" // U+f017 +#define ICON_FA_CLONE "\xef\x89\x8d" // U+f24d +#define ICON_FA_CLOSED_CAPTIONING "\xef\x88\x8a" // U+f20a +#define ICON_FA_CLOUD "\xef\x83\x82" // U+f0c2 +#define ICON_FA_CLOUD_DOWNLOAD_ALT "\xef\x8e\x81" // U+f381 +#define ICON_FA_CLOUD_MEATBALL "\xef\x9c\xbb" // U+f73b +#define ICON_FA_CLOUD_MOON "\xef\x9b\x83" // U+f6c3 +#define ICON_FA_CLOUD_MOON_RAIN "\xef\x9c\xbc" // U+f73c +#define ICON_FA_CLOUD_RAIN "\xef\x9c\xbd" // U+f73d +#define ICON_FA_CLOUD_SHOWERS_HEAVY "\xef\x9d\x80" // U+f740 +#define ICON_FA_CLOUD_SUN "\xef\x9b\x84" // U+f6c4 +#define ICON_FA_CLOUD_SUN_RAIN "\xef\x9d\x83" // U+f743 +#define ICON_FA_CLOUD_UPLOAD_ALT "\xef\x8e\x82" // U+f382 +#define ICON_FA_COCKTAIL "\xef\x95\xa1" // U+f561 +#define ICON_FA_CODE "\xef\x84\xa1" // U+f121 +#define ICON_FA_CODE_BRANCH "\xef\x84\xa6" // U+f126 +#define ICON_FA_COFFEE "\xef\x83\xb4" // U+f0f4 +#define ICON_FA_COG "\xef\x80\x93" // U+f013 +#define ICON_FA_COGS "\xef\x82\x85" // U+f085 +#define ICON_FA_COINS "\xef\x94\x9e" // U+f51e +#define ICON_FA_COLUMNS "\xef\x83\x9b" // U+f0db +#define ICON_FA_COMMENT "\xef\x81\xb5" // U+f075 +#define ICON_FA_COMMENT_ALT "\xef\x89\xba" // U+f27a +#define ICON_FA_COMMENT_DOLLAR "\xef\x99\x91" // U+f651 +#define ICON_FA_COMMENT_DOTS "\xef\x92\xad" // U+f4ad +#define ICON_FA_COMMENT_MEDICAL "\xef\x9f\xb5" // U+f7f5 +#define ICON_FA_COMMENT_SLASH "\xef\x92\xb3" // U+f4b3 +#define ICON_FA_COMMENTS "\xef\x82\x86" // U+f086 +#define ICON_FA_COMMENTS_DOLLAR "\xef\x99\x93" // U+f653 +#define ICON_FA_COMPACT_DISC "\xef\x94\x9f" // U+f51f +#define ICON_FA_COMPASS "\xef\x85\x8e" // U+f14e +#define ICON_FA_COMPRESS "\xef\x81\xa6" // U+f066 +#define ICON_FA_COMPRESS_ALT "\xef\x90\xa2" // U+f422 +#define ICON_FA_COMPRESS_ARROWS_ALT "\xef\x9e\x8c" // U+f78c +#define ICON_FA_CONCIERGE_BELL "\xef\x95\xa2" // U+f562 +#define ICON_FA_COOKIE "\xef\x95\xa3" // U+f563 +#define ICON_FA_COOKIE_BITE "\xef\x95\xa4" // U+f564 +#define ICON_FA_COPY "\xef\x83\x85" // U+f0c5 +#define ICON_FA_COPYRIGHT "\xef\x87\xb9" // U+f1f9 +#define ICON_FA_COUCH "\xef\x92\xb8" // U+f4b8 +#define ICON_FA_CREDIT_CARD "\xef\x82\x9d" // U+f09d +#define ICON_FA_CROP "\xef\x84\xa5" // U+f125 +#define ICON_FA_CROP_ALT "\xef\x95\xa5" // U+f565 +#define ICON_FA_CROSS "\xef\x99\x94" // U+f654 +#define ICON_FA_CROSSHAIRS "\xef\x81\x9b" // U+f05b +#define ICON_FA_CROW "\xef\x94\xa0" // U+f520 +#define ICON_FA_CROWN "\xef\x94\xa1" // U+f521 +#define ICON_FA_CRUTCH "\xef\x9f\xb7" // U+f7f7 +#define ICON_FA_CUBE "\xef\x86\xb2" // U+f1b2 +#define ICON_FA_CUBES "\xef\x86\xb3" // U+f1b3 +#define ICON_FA_CUT "\xef\x83\x84" // U+f0c4 +#define ICON_FA_DATABASE "\xef\x87\x80" // U+f1c0 +#define ICON_FA_DEAF "\xef\x8a\xa4" // U+f2a4 +#define ICON_FA_DEMOCRAT "\xef\x9d\x87" // U+f747 +#define ICON_FA_DESKTOP "\xef\x84\x88" // U+f108 +#define ICON_FA_DHARMACHAKRA "\xef\x99\x95" // U+f655 +#define ICON_FA_DIAGNOSES "\xef\x91\xb0" // U+f470 +#define ICON_FA_DICE "\xef\x94\xa2" // U+f522 +#define ICON_FA_DICE_D20 "\xef\x9b\x8f" // U+f6cf +#define ICON_FA_DICE_D6 "\xef\x9b\x91" // U+f6d1 +#define ICON_FA_DICE_FIVE "\xef\x94\xa3" // U+f523 +#define ICON_FA_DICE_FOUR "\xef\x94\xa4" // U+f524 +#define ICON_FA_DICE_ONE "\xef\x94\xa5" // U+f525 +#define ICON_FA_DICE_SIX "\xef\x94\xa6" // U+f526 +#define ICON_FA_DICE_THREE "\xef\x94\xa7" // U+f527 +#define ICON_FA_DICE_TWO "\xef\x94\xa8" // U+f528 +#define ICON_FA_DIGITAL_TACHOGRAPH "\xef\x95\xa6" // U+f566 +#define ICON_FA_DIRECTIONS "\xef\x97\xab" // U+f5eb +#define ICON_FA_DISEASE "\xef\x9f\xba" // U+f7fa +#define ICON_FA_DIVIDE "\xef\x94\xa9" // U+f529 +#define ICON_FA_DIZZY "\xef\x95\xa7" // U+f567 +#define ICON_FA_DNA "\xef\x91\xb1" // U+f471 +#define ICON_FA_DOG "\xef\x9b\x93" // U+f6d3 +#define ICON_FA_DOLLAR_SIGN "\xef\x85\x95" // U+f155 +#define ICON_FA_DOLLY "\xef\x91\xb2" // U+f472 +#define ICON_FA_DOLLY_FLATBED "\xef\x91\xb4" // U+f474 +#define ICON_FA_DONATE "\xef\x92\xb9" // U+f4b9 +#define ICON_FA_DOOR_CLOSED "\xef\x94\xaa" // U+f52a +#define ICON_FA_DOOR_OPEN "\xef\x94\xab" // U+f52b +#define ICON_FA_DOT_CIRCLE "\xef\x86\x92" // U+f192 +#define ICON_FA_DOVE "\xef\x92\xba" // U+f4ba +#define ICON_FA_DOWNLOAD "\xef\x80\x99" // U+f019 +#define ICON_FA_DRAFTING_COMPASS "\xef\x95\xa8" // U+f568 +#define ICON_FA_DRAGON "\xef\x9b\x95" // U+f6d5 +#define ICON_FA_DRAW_POLYGON "\xef\x97\xae" // U+f5ee +#define ICON_FA_DRUM "\xef\x95\xa9" // U+f569 +#define ICON_FA_DRUM_STEELPAN "\xef\x95\xaa" // U+f56a +#define ICON_FA_DRUMSTICK_BITE "\xef\x9b\x97" // U+f6d7 +#define ICON_FA_DUMBBELL "\xef\x91\x8b" // U+f44b +#define ICON_FA_DUMPSTER "\xef\x9e\x93" // U+f793 +#define ICON_FA_DUMPSTER_FIRE "\xef\x9e\x94" // U+f794 +#define ICON_FA_DUNGEON "\xef\x9b\x99" // U+f6d9 +#define ICON_FA_EDIT "\xef\x81\x84" // U+f044 +#define ICON_FA_EGG "\xef\x9f\xbb" // U+f7fb +#define ICON_FA_EJECT "\xef\x81\x92" // U+f052 +#define ICON_FA_ELLIPSIS_H "\xef\x85\x81" // U+f141 +#define ICON_FA_ELLIPSIS_V "\xef\x85\x82" // U+f142 +#define ICON_FA_ENVELOPE "\xef\x83\xa0" // U+f0e0 +#define ICON_FA_ENVELOPE_OPEN "\xef\x8a\xb6" // U+f2b6 +#define ICON_FA_ENVELOPE_OPEN_TEXT "\xef\x99\x98" // U+f658 +#define ICON_FA_ENVELOPE_SQUARE "\xef\x86\x99" // U+f199 +#define ICON_FA_EQUALS "\xef\x94\xac" // U+f52c +#define ICON_FA_ERASER "\xef\x84\xad" // U+f12d +#define ICON_FA_ETHERNET "\xef\x9e\x96" // U+f796 +#define ICON_FA_EURO_SIGN "\xef\x85\x93" // U+f153 +#define ICON_FA_EXCHANGE_ALT "\xef\x8d\xa2" // U+f362 +#define ICON_FA_EXCLAMATION "\xef\x84\xaa" // U+f12a +#define ICON_FA_EXCLAMATION_CIRCLE "\xef\x81\xaa" // U+f06a +#define ICON_FA_EXCLAMATION_TRIANGLE "\xef\x81\xb1" // U+f071 +#define ICON_FA_EXPAND "\xef\x81\xa5" // U+f065 +#define ICON_FA_EXPAND_ALT "\xef\x90\xa4" // U+f424 +#define ICON_FA_EXPAND_ARROWS_ALT "\xef\x8c\x9e" // U+f31e +#define ICON_FA_EXTERNAL_LINK_ALT "\xef\x8d\x9d" // U+f35d +#define ICON_FA_EXTERNAL_LINK_SQUARE_ALT "\xef\x8d\xa0" // U+f360 +#define ICON_FA_EYE "\xef\x81\xae" // U+f06e +#define ICON_FA_EYE_DROPPER "\xef\x87\xbb" // U+f1fb +#define ICON_FA_EYE_SLASH "\xef\x81\xb0" // U+f070 +#define ICON_FA_FAN "\xef\xa1\xa3" // U+f863 +#define ICON_FA_FAST_BACKWARD "\xef\x81\x89" // U+f049 +#define ICON_FA_FAST_FORWARD "\xef\x81\x90" // U+f050 +#define ICON_FA_FAUCET "\xee\x80\x85" // U+e005 +#define ICON_FA_FAX "\xef\x86\xac" // U+f1ac +#define ICON_FA_FEATHER "\xef\x94\xad" // U+f52d +#define ICON_FA_FEATHER_ALT "\xef\x95\xab" // U+f56b +#define ICON_FA_FEMALE "\xef\x86\x82" // U+f182 +#define ICON_FA_FIGHTER_JET "\xef\x83\xbb" // U+f0fb +#define ICON_FA_FILE "\xef\x85\x9b" // U+f15b +#define ICON_FA_FILE_ALT "\xef\x85\x9c" // U+f15c +#define ICON_FA_FILE_ARCHIVE "\xef\x87\x86" // U+f1c6 +#define ICON_FA_FILE_AUDIO "\xef\x87\x87" // U+f1c7 +#define ICON_FA_FILE_CODE "\xef\x87\x89" // U+f1c9 +#define ICON_FA_FILE_CONTRACT "\xef\x95\xac" // U+f56c +#define ICON_FA_FILE_CSV "\xef\x9b\x9d" // U+f6dd +#define ICON_FA_FILE_DOWNLOAD "\xef\x95\xad" // U+f56d +#define ICON_FA_FILE_EXCEL "\xef\x87\x83" // U+f1c3 +#define ICON_FA_FILE_EXPORT "\xef\x95\xae" // U+f56e +#define ICON_FA_FILE_IMAGE "\xef\x87\x85" // U+f1c5 +#define ICON_FA_FILE_IMPORT "\xef\x95\xaf" // U+f56f +#define ICON_FA_FILE_INVOICE "\xef\x95\xb0" // U+f570 +#define ICON_FA_FILE_INVOICE_DOLLAR "\xef\x95\xb1" // U+f571 +#define ICON_FA_FILE_MEDICAL "\xef\x91\xb7" // U+f477 +#define ICON_FA_FILE_MEDICAL_ALT "\xef\x91\xb8" // U+f478 +#define ICON_FA_FILE_PDF "\xef\x87\x81" // U+f1c1 +#define ICON_FA_FILE_POWERPOINT "\xef\x87\x84" // U+f1c4 +#define ICON_FA_FILE_PRESCRIPTION "\xef\x95\xb2" // U+f572 +#define ICON_FA_FILE_SIGNATURE "\xef\x95\xb3" // U+f573 +#define ICON_FA_FILE_UPLOAD "\xef\x95\xb4" // U+f574 +#define ICON_FA_FILE_VIDEO "\xef\x87\x88" // U+f1c8 +#define ICON_FA_FILE_WORD "\xef\x87\x82" // U+f1c2 +#define ICON_FA_FILL "\xef\x95\xb5" // U+f575 +#define ICON_FA_FILL_DRIP "\xef\x95\xb6" // U+f576 +#define ICON_FA_FILM "\xef\x80\x88" // U+f008 +#define ICON_FA_FILTER "\xef\x82\xb0" // U+f0b0 +#define ICON_FA_FINGERPRINT "\xef\x95\xb7" // U+f577 +#define ICON_FA_FIRE "\xef\x81\xad" // U+f06d +#define ICON_FA_FIRE_ALT "\xef\x9f\xa4" // U+f7e4 +#define ICON_FA_FIRE_EXTINGUISHER "\xef\x84\xb4" // U+f134 +#define ICON_FA_FIRST_AID "\xef\x91\xb9" // U+f479 +#define ICON_FA_FISH "\xef\x95\xb8" // U+f578 +#define ICON_FA_FIST_RAISED "\xef\x9b\x9e" // U+f6de +#define ICON_FA_FLAG "\xef\x80\xa4" // U+f024 +#define ICON_FA_FLAG_CHECKERED "\xef\x84\x9e" // U+f11e +#define ICON_FA_FLAG_USA "\xef\x9d\x8d" // U+f74d +#define ICON_FA_FLASK "\xef\x83\x83" // U+f0c3 +#define ICON_FA_FLUSHED "\xef\x95\xb9" // U+f579 +#define ICON_FA_FOLDER "\xef\x81\xbb" // U+f07b +#define ICON_FA_FOLDER_MINUS "\xef\x99\x9d" // U+f65d +#define ICON_FA_FOLDER_OPEN "\xef\x81\xbc" // U+f07c +#define ICON_FA_FOLDER_PLUS "\xef\x99\x9e" // U+f65e +#define ICON_FA_FONT "\xef\x80\xb1" // U+f031 +#define ICON_FA_FONT_AWESOME_LOGO_FULL "\xef\x93\xa6" // U+f4e6 +#define ICON_FA_FOOTBALL_BALL "\xef\x91\x8e" // U+f44e +#define ICON_FA_FORWARD "\xef\x81\x8e" // U+f04e +#define ICON_FA_FROG "\xef\x94\xae" // U+f52e +#define ICON_FA_FROWN "\xef\x84\x99" // U+f119 +#define ICON_FA_FROWN_OPEN "\xef\x95\xba" // U+f57a +#define ICON_FA_FUNNEL_DOLLAR "\xef\x99\xa2" // U+f662 +#define ICON_FA_FUTBOL "\xef\x87\xa3" // U+f1e3 +#define ICON_FA_GAMEPAD "\xef\x84\x9b" // U+f11b +#define ICON_FA_GAS_PUMP "\xef\x94\xaf" // U+f52f +#define ICON_FA_GAVEL "\xef\x83\xa3" // U+f0e3 +#define ICON_FA_GEM "\xef\x8e\xa5" // U+f3a5 +#define ICON_FA_GENDERLESS "\xef\x88\xad" // U+f22d +#define ICON_FA_GHOST "\xef\x9b\xa2" // U+f6e2 +#define ICON_FA_GIFT "\xef\x81\xab" // U+f06b +#define ICON_FA_GIFTS "\xef\x9e\x9c" // U+f79c +#define ICON_FA_GLASS_CHEERS "\xef\x9e\x9f" // U+f79f +#define ICON_FA_GLASS_MARTINI "\xef\x80\x80" // U+f000 +#define ICON_FA_GLASS_MARTINI_ALT "\xef\x95\xbb" // U+f57b +#define ICON_FA_GLASS_WHISKEY "\xef\x9e\xa0" // U+f7a0 +#define ICON_FA_GLASSES "\xef\x94\xb0" // U+f530 +#define ICON_FA_GLOBE "\xef\x82\xac" // U+f0ac +#define ICON_FA_GLOBE_AFRICA "\xef\x95\xbc" // U+f57c +#define ICON_FA_GLOBE_AMERICAS "\xef\x95\xbd" // U+f57d +#define ICON_FA_GLOBE_ASIA "\xef\x95\xbe" // U+f57e +#define ICON_FA_GLOBE_EUROPE "\xef\x9e\xa2" // U+f7a2 +#define ICON_FA_GOLF_BALL "\xef\x91\x90" // U+f450 +#define ICON_FA_GOPURAM "\xef\x99\xa4" // U+f664 +#define ICON_FA_GRADUATION_CAP "\xef\x86\x9d" // U+f19d +#define ICON_FA_GREATER_THAN "\xef\x94\xb1" // U+f531 +#define ICON_FA_GREATER_THAN_EQUAL "\xef\x94\xb2" // U+f532 +#define ICON_FA_GRIMACE "\xef\x95\xbf" // U+f57f +#define ICON_FA_GRIN "\xef\x96\x80" // U+f580 +#define ICON_FA_GRIN_ALT "\xef\x96\x81" // U+f581 +#define ICON_FA_GRIN_BEAM "\xef\x96\x82" // U+f582 +#define ICON_FA_GRIN_BEAM_SWEAT "\xef\x96\x83" // U+f583 +#define ICON_FA_GRIN_HEARTS "\xef\x96\x84" // U+f584 +#define ICON_FA_GRIN_SQUINT "\xef\x96\x85" // U+f585 +#define ICON_FA_GRIN_SQUINT_TEARS "\xef\x96\x86" // U+f586 +#define ICON_FA_GRIN_STARS "\xef\x96\x87" // U+f587 +#define ICON_FA_GRIN_TEARS "\xef\x96\x88" // U+f588 +#define ICON_FA_GRIN_TONGUE "\xef\x96\x89" // U+f589 +#define ICON_FA_GRIN_TONGUE_SQUINT "\xef\x96\x8a" // U+f58a +#define ICON_FA_GRIN_TONGUE_WINK "\xef\x96\x8b" // U+f58b +#define ICON_FA_GRIN_WINK "\xef\x96\x8c" // U+f58c +#define ICON_FA_GRIP_HORIZONTAL "\xef\x96\x8d" // U+f58d +#define ICON_FA_GRIP_LINES "\xef\x9e\xa4" // U+f7a4 +#define ICON_FA_GRIP_LINES_VERTICAL "\xef\x9e\xa5" // U+f7a5 +#define ICON_FA_GRIP_VERTICAL "\xef\x96\x8e" // U+f58e +#define ICON_FA_GUITAR "\xef\x9e\xa6" // U+f7a6 +#define ICON_FA_H_SQUARE "\xef\x83\xbd" // U+f0fd +#define ICON_FA_HAMBURGER "\xef\xa0\x85" // U+f805 +#define ICON_FA_HAMMER "\xef\x9b\xa3" // U+f6e3 +#define ICON_FA_HAMSA "\xef\x99\xa5" // U+f665 +#define ICON_FA_HAND_HOLDING "\xef\x92\xbd" // U+f4bd +#define ICON_FA_HAND_HOLDING_HEART "\xef\x92\xbe" // U+f4be +#define ICON_FA_HAND_HOLDING_MEDICAL "\xee\x81\x9c" // U+e05c +#define ICON_FA_HAND_HOLDING_USD "\xef\x93\x80" // U+f4c0 +#define ICON_FA_HAND_HOLDING_WATER "\xef\x93\x81" // U+f4c1 +#define ICON_FA_HAND_LIZARD "\xef\x89\x98" // U+f258 +#define ICON_FA_HAND_MIDDLE_FINGER "\xef\xa0\x86" // U+f806 +#define ICON_FA_HAND_PAPER "\xef\x89\x96" // U+f256 +#define ICON_FA_HAND_PEACE "\xef\x89\x9b" // U+f25b +#define ICON_FA_HAND_POINT_DOWN "\xef\x82\xa7" // U+f0a7 +#define ICON_FA_HAND_POINT_LEFT "\xef\x82\xa5" // U+f0a5 +#define ICON_FA_HAND_POINT_RIGHT "\xef\x82\xa4" // U+f0a4 +#define ICON_FA_HAND_POINT_UP "\xef\x82\xa6" // U+f0a6 +#define ICON_FA_HAND_POINTER "\xef\x89\x9a" // U+f25a +#define ICON_FA_HAND_ROCK "\xef\x89\x95" // U+f255 +#define ICON_FA_HAND_SCISSORS "\xef\x89\x97" // U+f257 +#define ICON_FA_HAND_SPARKLES "\xee\x81\x9d" // U+e05d +#define ICON_FA_HAND_SPOCK "\xef\x89\x99" // U+f259 +#define ICON_FA_HANDS "\xef\x93\x82" // U+f4c2 +#define ICON_FA_HANDS_HELPING "\xef\x93\x84" // U+f4c4 +#define ICON_FA_HANDS_WASH "\xee\x81\x9e" // U+e05e +#define ICON_FA_HANDSHAKE "\xef\x8a\xb5" // U+f2b5 +#define ICON_FA_HANDSHAKE_ALT_SLASH "\xee\x81\x9f" // U+e05f +#define ICON_FA_HANDSHAKE_SLASH "\xee\x81\xa0" // U+e060 +#define ICON_FA_HANUKIAH "\xef\x9b\xa6" // U+f6e6 +#define ICON_FA_HARD_HAT "\xef\xa0\x87" // U+f807 +#define ICON_FA_HASHTAG "\xef\x8a\x92" // U+f292 +#define ICON_FA_HAT_COWBOY "\xef\xa3\x80" // U+f8c0 +#define ICON_FA_HAT_COWBOY_SIDE "\xef\xa3\x81" // U+f8c1 +#define ICON_FA_HAT_WIZARD "\xef\x9b\xa8" // U+f6e8 +#define ICON_FA_HDD "\xef\x82\xa0" // U+f0a0 +#define ICON_FA_HEAD_SIDE_COUGH "\xee\x81\xa1" // U+e061 +#define ICON_FA_HEAD_SIDE_COUGH_SLASH "\xee\x81\xa2" // U+e062 +#define ICON_FA_HEAD_SIDE_MASK "\xee\x81\xa3" // U+e063 +#define ICON_FA_HEAD_SIDE_VIRUS "\xee\x81\xa4" // U+e064 +#define ICON_FA_HEADING "\xef\x87\x9c" // U+f1dc +#define ICON_FA_HEADPHONES "\xef\x80\xa5" // U+f025 +#define ICON_FA_HEADPHONES_ALT "\xef\x96\x8f" // U+f58f +#define ICON_FA_HEADSET "\xef\x96\x90" // U+f590 +#define ICON_FA_HEART "\xef\x80\x84" // U+f004 +#define ICON_FA_HEART_BROKEN "\xef\x9e\xa9" // U+f7a9 +#define ICON_FA_HEARTBEAT "\xef\x88\x9e" // U+f21e +#define ICON_FA_HELICOPTER "\xef\x94\xb3" // U+f533 +#define ICON_FA_HIGHLIGHTER "\xef\x96\x91" // U+f591 +#define ICON_FA_HIKING "\xef\x9b\xac" // U+f6ec +#define ICON_FA_HIPPO "\xef\x9b\xad" // U+f6ed +#define ICON_FA_HISTORY "\xef\x87\x9a" // U+f1da +#define ICON_FA_HOCKEY_PUCK "\xef\x91\x93" // U+f453 +#define ICON_FA_HOLLY_BERRY "\xef\x9e\xaa" // U+f7aa +#define ICON_FA_HOME "\xef\x80\x95" // U+f015 +#define ICON_FA_HORSE "\xef\x9b\xb0" // U+f6f0 +#define ICON_FA_HORSE_HEAD "\xef\x9e\xab" // U+f7ab +#define ICON_FA_HOSPITAL "\xef\x83\xb8" // U+f0f8 +#define ICON_FA_HOSPITAL_ALT "\xef\x91\xbd" // U+f47d +#define ICON_FA_HOSPITAL_SYMBOL "\xef\x91\xbe" // U+f47e +#define ICON_FA_HOSPITAL_USER "\xef\xa0\x8d" // U+f80d +#define ICON_FA_HOT_TUB "\xef\x96\x93" // U+f593 +#define ICON_FA_HOTDOG "\xef\xa0\x8f" // U+f80f +#define ICON_FA_HOTEL "\xef\x96\x94" // U+f594 +#define ICON_FA_HOURGLASS "\xef\x89\x94" // U+f254 +#define ICON_FA_HOURGLASS_END "\xef\x89\x93" // U+f253 +#define ICON_FA_HOURGLASS_HALF "\xef\x89\x92" // U+f252 +#define ICON_FA_HOURGLASS_START "\xef\x89\x91" // U+f251 +#define ICON_FA_HOUSE_DAMAGE "\xef\x9b\xb1" // U+f6f1 +#define ICON_FA_HOUSE_USER "\xee\x81\xa5" // U+e065 +#define ICON_FA_HRYVNIA "\xef\x9b\xb2" // U+f6f2 +#define ICON_FA_I_CURSOR "\xef\x89\x86" // U+f246 +#define ICON_FA_ICE_CREAM "\xef\xa0\x90" // U+f810 +#define ICON_FA_ICICLES "\xef\x9e\xad" // U+f7ad +#define ICON_FA_ICONS "\xef\xa1\xad" // U+f86d +#define ICON_FA_ID_BADGE "\xef\x8b\x81" // U+f2c1 +#define ICON_FA_ID_CARD "\xef\x8b\x82" // U+f2c2 +#define ICON_FA_ID_CARD_ALT "\xef\x91\xbf" // U+f47f +#define ICON_FA_IGLOO "\xef\x9e\xae" // U+f7ae +#define ICON_FA_IMAGE "\xef\x80\xbe" // U+f03e +#define ICON_FA_IMAGES "\xef\x8c\x82" // U+f302 +#define ICON_FA_INBOX "\xef\x80\x9c" // U+f01c +#define ICON_FA_INDENT "\xef\x80\xbc" // U+f03c +#define ICON_FA_INDUSTRY "\xef\x89\xb5" // U+f275 +#define ICON_FA_INFINITY "\xef\x94\xb4" // U+f534 +#define ICON_FA_INFO "\xef\x84\xa9" // U+f129 +#define ICON_FA_INFO_CIRCLE "\xef\x81\x9a" // U+f05a +#define ICON_FA_ITALIC "\xef\x80\xb3" // U+f033 +#define ICON_FA_JEDI "\xef\x99\xa9" // U+f669 +#define ICON_FA_JOINT "\xef\x96\x95" // U+f595 +#define ICON_FA_JOURNAL_WHILLS "\xef\x99\xaa" // U+f66a +#define ICON_FA_KAABA "\xef\x99\xab" // U+f66b +#define ICON_FA_KEY "\xef\x82\x84" // U+f084 +#define ICON_FA_KEYBOARD "\xef\x84\x9c" // U+f11c +#define ICON_FA_KHANDA "\xef\x99\xad" // U+f66d +#define ICON_FA_KISS "\xef\x96\x96" // U+f596 +#define ICON_FA_KISS_BEAM "\xef\x96\x97" // U+f597 +#define ICON_FA_KISS_WINK_HEART "\xef\x96\x98" // U+f598 +#define ICON_FA_KIWI_BIRD "\xef\x94\xb5" // U+f535 +#define ICON_FA_LANDMARK "\xef\x99\xaf" // U+f66f +#define ICON_FA_LANGUAGE "\xef\x86\xab" // U+f1ab +#define ICON_FA_LAPTOP "\xef\x84\x89" // U+f109 +#define ICON_FA_LAPTOP_CODE "\xef\x97\xbc" // U+f5fc +#define ICON_FA_LAPTOP_HOUSE "\xee\x81\xa6" // U+e066 +#define ICON_FA_LAPTOP_MEDICAL "\xef\xa0\x92" // U+f812 +#define ICON_FA_LAUGH "\xef\x96\x99" // U+f599 +#define ICON_FA_LAUGH_BEAM "\xef\x96\x9a" // U+f59a +#define ICON_FA_LAUGH_SQUINT "\xef\x96\x9b" // U+f59b +#define ICON_FA_LAUGH_WINK "\xef\x96\x9c" // U+f59c +#define ICON_FA_LAYER_GROUP "\xef\x97\xbd" // U+f5fd +#define ICON_FA_LEAF "\xef\x81\xac" // U+f06c +#define ICON_FA_LEMON "\xef\x82\x94" // U+f094 +#define ICON_FA_LESS_THAN "\xef\x94\xb6" // U+f536 +#define ICON_FA_LESS_THAN_EQUAL "\xef\x94\xb7" // U+f537 +#define ICON_FA_LEVEL_DOWN_ALT "\xef\x8e\xbe" // U+f3be +#define ICON_FA_LEVEL_UP_ALT "\xef\x8e\xbf" // U+f3bf +#define ICON_FA_LIFE_RING "\xef\x87\x8d" // U+f1cd +#define ICON_FA_LIGHTBULB "\xef\x83\xab" // U+f0eb +#define ICON_FA_LINK "\xef\x83\x81" // U+f0c1 +#define ICON_FA_LIRA_SIGN "\xef\x86\x95" // U+f195 +#define ICON_FA_LIST "\xef\x80\xba" // U+f03a +#define ICON_FA_LIST_ALT "\xef\x80\xa2" // U+f022 +#define ICON_FA_LIST_OL "\xef\x83\x8b" // U+f0cb +#define ICON_FA_LIST_UL "\xef\x83\x8a" // U+f0ca +#define ICON_FA_LOCATION_ARROW "\xef\x84\xa4" // U+f124 +#define ICON_FA_LOCK "\xef\x80\xa3" // U+f023 +#define ICON_FA_LOCK_OPEN "\xef\x8f\x81" // U+f3c1 +#define ICON_FA_LONG_ARROW_ALT_DOWN "\xef\x8c\x89" // U+f309 +#define ICON_FA_LONG_ARROW_ALT_LEFT "\xef\x8c\x8a" // U+f30a +#define ICON_FA_LONG_ARROW_ALT_RIGHT "\xef\x8c\x8b" // U+f30b +#define ICON_FA_LONG_ARROW_ALT_UP "\xef\x8c\x8c" // U+f30c +#define ICON_FA_LOW_VISION "\xef\x8a\xa8" // U+f2a8 +#define ICON_FA_LUGGAGE_CART "\xef\x96\x9d" // U+f59d +#define ICON_FA_LUNGS "\xef\x98\x84" // U+f604 +#define ICON_FA_LUNGS_VIRUS "\xee\x81\xa7" // U+e067 +#define ICON_FA_MAGIC "\xef\x83\x90" // U+f0d0 +#define ICON_FA_MAGNET "\xef\x81\xb6" // U+f076 +#define ICON_FA_MAIL_BULK "\xef\x99\xb4" // U+f674 +#define ICON_FA_MALE "\xef\x86\x83" // U+f183 +#define ICON_FA_MAP "\xef\x89\xb9" // U+f279 +#define ICON_FA_MAP_MARKED "\xef\x96\x9f" // U+f59f +#define ICON_FA_MAP_MARKED_ALT "\xef\x96\xa0" // U+f5a0 +#define ICON_FA_MAP_MARKER "\xef\x81\x81" // U+f041 +#define ICON_FA_MAP_MARKER_ALT "\xef\x8f\x85" // U+f3c5 +#define ICON_FA_MAP_PIN "\xef\x89\xb6" // U+f276 +#define ICON_FA_MAP_SIGNS "\xef\x89\xb7" // U+f277 +#define ICON_FA_MARKER "\xef\x96\xa1" // U+f5a1 +#define ICON_FA_MARS "\xef\x88\xa2" // U+f222 +#define ICON_FA_MARS_DOUBLE "\xef\x88\xa7" // U+f227 +#define ICON_FA_MARS_STROKE "\xef\x88\xa9" // U+f229 +#define ICON_FA_MARS_STROKE_H "\xef\x88\xab" // U+f22b +#define ICON_FA_MARS_STROKE_V "\xef\x88\xaa" // U+f22a +#define ICON_FA_MASK "\xef\x9b\xba" // U+f6fa +#define ICON_FA_MEDAL "\xef\x96\xa2" // U+f5a2 +#define ICON_FA_MEDKIT "\xef\x83\xba" // U+f0fa +#define ICON_FA_MEH "\xef\x84\x9a" // U+f11a +#define ICON_FA_MEH_BLANK "\xef\x96\xa4" // U+f5a4 +#define ICON_FA_MEH_ROLLING_EYES "\xef\x96\xa5" // U+f5a5 +#define ICON_FA_MEMORY "\xef\x94\xb8" // U+f538 +#define ICON_FA_MENORAH "\xef\x99\xb6" // U+f676 +#define ICON_FA_MERCURY "\xef\x88\xa3" // U+f223 +#define ICON_FA_METEOR "\xef\x9d\x93" // U+f753 +#define ICON_FA_MICROCHIP "\xef\x8b\x9b" // U+f2db +#define ICON_FA_MICROPHONE "\xef\x84\xb0" // U+f130 +#define ICON_FA_MICROPHONE_ALT "\xef\x8f\x89" // U+f3c9 +#define ICON_FA_MICROPHONE_ALT_SLASH "\xef\x94\xb9" // U+f539 +#define ICON_FA_MICROPHONE_SLASH "\xef\x84\xb1" // U+f131 +#define ICON_FA_MICROSCOPE "\xef\x98\x90" // U+f610 +#define ICON_FA_MINUS "\xef\x81\xa8" // U+f068 +#define ICON_FA_MINUS_CIRCLE "\xef\x81\x96" // U+f056 +#define ICON_FA_MINUS_SQUARE "\xef\x85\x86" // U+f146 +#define ICON_FA_MITTEN "\xef\x9e\xb5" // U+f7b5 +#define ICON_FA_MOBILE "\xef\x84\x8b" // U+f10b +#define ICON_FA_MOBILE_ALT "\xef\x8f\x8d" // U+f3cd +#define ICON_FA_MONEY_BILL "\xef\x83\x96" // U+f0d6 +#define ICON_FA_MONEY_BILL_ALT "\xef\x8f\x91" // U+f3d1 +#define ICON_FA_MONEY_BILL_WAVE "\xef\x94\xba" // U+f53a +#define ICON_FA_MONEY_BILL_WAVE_ALT "\xef\x94\xbb" // U+f53b +#define ICON_FA_MONEY_CHECK "\xef\x94\xbc" // U+f53c +#define ICON_FA_MONEY_CHECK_ALT "\xef\x94\xbd" // U+f53d +#define ICON_FA_MONUMENT "\xef\x96\xa6" // U+f5a6 +#define ICON_FA_MOON "\xef\x86\x86" // U+f186 +#define ICON_FA_MORTAR_PESTLE "\xef\x96\xa7" // U+f5a7 +#define ICON_FA_MOSQUE "\xef\x99\xb8" // U+f678 +#define ICON_FA_MOTORCYCLE "\xef\x88\x9c" // U+f21c +#define ICON_FA_MOUNTAIN "\xef\x9b\xbc" // U+f6fc +#define ICON_FA_MOUSE "\xef\xa3\x8c" // U+f8cc +#define ICON_FA_MOUSE_POINTER "\xef\x89\x85" // U+f245 +#define ICON_FA_MUG_HOT "\xef\x9e\xb6" // U+f7b6 +#define ICON_FA_MUSIC "\xef\x80\x81" // U+f001 +#define ICON_FA_NETWORK_WIRED "\xef\x9b\xbf" // U+f6ff +#define ICON_FA_NEUTER "\xef\x88\xac" // U+f22c +#define ICON_FA_NEWSPAPER "\xef\x87\xaa" // U+f1ea +#define ICON_FA_NOT_EQUAL "\xef\x94\xbe" // U+f53e +#define ICON_FA_NOTES_MEDICAL "\xef\x92\x81" // U+f481 +#define ICON_FA_OBJECT_GROUP "\xef\x89\x87" // U+f247 +#define ICON_FA_OBJECT_UNGROUP "\xef\x89\x88" // U+f248 +#define ICON_FA_OIL_CAN "\xef\x98\x93" // U+f613 +#define ICON_FA_OM "\xef\x99\xb9" // U+f679 +#define ICON_FA_OTTER "\xef\x9c\x80" // U+f700 +#define ICON_FA_OUTDENT "\xef\x80\xbb" // U+f03b +#define ICON_FA_PAGER "\xef\xa0\x95" // U+f815 +#define ICON_FA_PAINT_BRUSH "\xef\x87\xbc" // U+f1fc +#define ICON_FA_PAINT_ROLLER "\xef\x96\xaa" // U+f5aa +#define ICON_FA_PALETTE "\xef\x94\xbf" // U+f53f +#define ICON_FA_PALLET "\xef\x92\x82" // U+f482 +#define ICON_FA_PAPER_PLANE "\xef\x87\x98" // U+f1d8 +#define ICON_FA_PAPERCLIP "\xef\x83\x86" // U+f0c6 +#define ICON_FA_PARACHUTE_BOX "\xef\x93\x8d" // U+f4cd +#define ICON_FA_PARAGRAPH "\xef\x87\x9d" // U+f1dd +#define ICON_FA_PARKING "\xef\x95\x80" // U+f540 +#define ICON_FA_PASSPORT "\xef\x96\xab" // U+f5ab +#define ICON_FA_PASTAFARIANISM "\xef\x99\xbb" // U+f67b +#define ICON_FA_PASTE "\xef\x83\xaa" // U+f0ea +#define ICON_FA_PAUSE "\xef\x81\x8c" // U+f04c +#define ICON_FA_PAUSE_CIRCLE "\xef\x8a\x8b" // U+f28b +#define ICON_FA_PAW "\xef\x86\xb0" // U+f1b0 +#define ICON_FA_PEACE "\xef\x99\xbc" // U+f67c +#define ICON_FA_PEN "\xef\x8c\x84" // U+f304 +#define ICON_FA_PEN_ALT "\xef\x8c\x85" // U+f305 +#define ICON_FA_PEN_FANCY "\xef\x96\xac" // U+f5ac +#define ICON_FA_PEN_NIB "\xef\x96\xad" // U+f5ad +#define ICON_FA_PEN_SQUARE "\xef\x85\x8b" // U+f14b +#define ICON_FA_PENCIL_ALT "\xef\x8c\x83" // U+f303 +#define ICON_FA_PENCIL_RULER "\xef\x96\xae" // U+f5ae +#define ICON_FA_PEOPLE_ARROWS "\xee\x81\xa8" // U+e068 +#define ICON_FA_PEOPLE_CARRY "\xef\x93\x8e" // U+f4ce +#define ICON_FA_PEPPER_HOT "\xef\xa0\x96" // U+f816 +#define ICON_FA_PERCENT "\xef\x8a\x95" // U+f295 +#define ICON_FA_PERCENTAGE "\xef\x95\x81" // U+f541 +#define ICON_FA_PERSON_BOOTH "\xef\x9d\x96" // U+f756 +#define ICON_FA_PHONE "\xef\x82\x95" // U+f095 +#define ICON_FA_PHONE_ALT "\xef\xa1\xb9" // U+f879 +#define ICON_FA_PHONE_SLASH "\xef\x8f\x9d" // U+f3dd +#define ICON_FA_PHONE_SQUARE "\xef\x82\x98" // U+f098 +#define ICON_FA_PHONE_SQUARE_ALT "\xef\xa1\xbb" // U+f87b +#define ICON_FA_PHONE_VOLUME "\xef\x8a\xa0" // U+f2a0 +#define ICON_FA_PHOTO_VIDEO "\xef\xa1\xbc" // U+f87c +#define ICON_FA_PIGGY_BANK "\xef\x93\x93" // U+f4d3 +#define ICON_FA_PILLS "\xef\x92\x84" // U+f484 +#define ICON_FA_PIZZA_SLICE "\xef\xa0\x98" // U+f818 +#define ICON_FA_PLACE_OF_WORSHIP "\xef\x99\xbf" // U+f67f +#define ICON_FA_PLANE "\xef\x81\xb2" // U+f072 +#define ICON_FA_PLANE_ARRIVAL "\xef\x96\xaf" // U+f5af +#define ICON_FA_PLANE_DEPARTURE "\xef\x96\xb0" // U+f5b0 +#define ICON_FA_PLANE_SLASH "\xee\x81\xa9" // U+e069 +#define ICON_FA_PLAY "\xef\x81\x8b" // U+f04b +#define ICON_FA_PLAY_CIRCLE "\xef\x85\x84" // U+f144 +#define ICON_FA_PLUG "\xef\x87\xa6" // U+f1e6 +#define ICON_FA_PLUS "\xef\x81\xa7" // U+f067 +#define ICON_FA_PLUS_CIRCLE "\xef\x81\x95" // U+f055 +#define ICON_FA_PLUS_SQUARE "\xef\x83\xbe" // U+f0fe +#define ICON_FA_PODCAST "\xef\x8b\x8e" // U+f2ce +#define ICON_FA_POLL "\xef\x9a\x81" // U+f681 +#define ICON_FA_POLL_H "\xef\x9a\x82" // U+f682 +#define ICON_FA_POO "\xef\x8b\xbe" // U+f2fe +#define ICON_FA_POO_STORM "\xef\x9d\x9a" // U+f75a +#define ICON_FA_POOP "\xef\x98\x99" // U+f619 +#define ICON_FA_PORTRAIT "\xef\x8f\xa0" // U+f3e0 +#define ICON_FA_POUND_SIGN "\xef\x85\x94" // U+f154 +#define ICON_FA_POWER_OFF "\xef\x80\x91" // U+f011 +#define ICON_FA_PRAY "\xef\x9a\x83" // U+f683 +#define ICON_FA_PRAYING_HANDS "\xef\x9a\x84" // U+f684 +#define ICON_FA_PRESCRIPTION "\xef\x96\xb1" // U+f5b1 +#define ICON_FA_PRESCRIPTION_BOTTLE "\xef\x92\x85" // U+f485 +#define ICON_FA_PRESCRIPTION_BOTTLE_ALT "\xef\x92\x86" // U+f486 +#define ICON_FA_PRINT "\xef\x80\xaf" // U+f02f +#define ICON_FA_PROCEDURES "\xef\x92\x87" // U+f487 +#define ICON_FA_PROJECT_DIAGRAM "\xef\x95\x82" // U+f542 +#define ICON_FA_PUMP_MEDICAL "\xee\x81\xaa" // U+e06a +#define ICON_FA_PUMP_SOAP "\xee\x81\xab" // U+e06b +#define ICON_FA_PUZZLE_PIECE "\xef\x84\xae" // U+f12e +#define ICON_FA_QRCODE "\xef\x80\xa9" // U+f029 +#define ICON_FA_QUESTION "\xef\x84\xa8" // U+f128 +#define ICON_FA_QUESTION_CIRCLE "\xef\x81\x99" // U+f059 +#define ICON_FA_QUIDDITCH "\xef\x91\x98" // U+f458 +#define ICON_FA_QUOTE_LEFT "\xef\x84\x8d" // U+f10d +#define ICON_FA_QUOTE_RIGHT "\xef\x84\x8e" // U+f10e +#define ICON_FA_QURAN "\xef\x9a\x87" // U+f687 +#define ICON_FA_RADIATION "\xef\x9e\xb9" // U+f7b9 +#define ICON_FA_RADIATION_ALT "\xef\x9e\xba" // U+f7ba +#define ICON_FA_RAINBOW "\xef\x9d\x9b" // U+f75b +#define ICON_FA_RANDOM "\xef\x81\xb4" // U+f074 +#define ICON_FA_RECEIPT "\xef\x95\x83" // U+f543 +#define ICON_FA_RECORD_VINYL "\xef\xa3\x99" // U+f8d9 +#define ICON_FA_RECYCLE "\xef\x86\xb8" // U+f1b8 +#define ICON_FA_REDO "\xef\x80\x9e" // U+f01e +#define ICON_FA_REDO_ALT "\xef\x8b\xb9" // U+f2f9 +#define ICON_FA_REGISTERED "\xef\x89\x9d" // U+f25d +#define ICON_FA_REMOVE_FORMAT "\xef\xa1\xbd" // U+f87d +#define ICON_FA_REPLY "\xef\x8f\xa5" // U+f3e5 +#define ICON_FA_REPLY_ALL "\xef\x84\xa2" // U+f122 +#define ICON_FA_REPUBLICAN "\xef\x9d\x9e" // U+f75e +#define ICON_FA_RESTROOM "\xef\x9e\xbd" // U+f7bd +#define ICON_FA_RETWEET "\xef\x81\xb9" // U+f079 +#define ICON_FA_RIBBON "\xef\x93\x96" // U+f4d6 +#define ICON_FA_RING "\xef\x9c\x8b" // U+f70b +#define ICON_FA_ROAD "\xef\x80\x98" // U+f018 +#define ICON_FA_ROBOT "\xef\x95\x84" // U+f544 +#define ICON_FA_ROCKET "\xef\x84\xb5" // U+f135 +#define ICON_FA_ROUTE "\xef\x93\x97" // U+f4d7 +#define ICON_FA_RSS "\xef\x82\x9e" // U+f09e +#define ICON_FA_RSS_SQUARE "\xef\x85\x83" // U+f143 +#define ICON_FA_RUBLE_SIGN "\xef\x85\x98" // U+f158 +#define ICON_FA_RULER "\xef\x95\x85" // U+f545 +#define ICON_FA_RULER_COMBINED "\xef\x95\x86" // U+f546 +#define ICON_FA_RULER_HORIZONTAL "\xef\x95\x87" // U+f547 +#define ICON_FA_RULER_VERTICAL "\xef\x95\x88" // U+f548 +#define ICON_FA_RUNNING "\xef\x9c\x8c" // U+f70c +#define ICON_FA_RUPEE_SIGN "\xef\x85\x96" // U+f156 +#define ICON_FA_SAD_CRY "\xef\x96\xb3" // U+f5b3 +#define ICON_FA_SAD_TEAR "\xef\x96\xb4" // U+f5b4 +#define ICON_FA_SATELLITE "\xef\x9e\xbf" // U+f7bf +#define ICON_FA_SATELLITE_DISH "\xef\x9f\x80" // U+f7c0 +#define ICON_FA_SAVE "\xef\x83\x87" // U+f0c7 +#define ICON_FA_SCHOOL "\xef\x95\x89" // U+f549 +#define ICON_FA_SCREWDRIVER "\xef\x95\x8a" // U+f54a +#define ICON_FA_SCROLL "\xef\x9c\x8e" // U+f70e +#define ICON_FA_SD_CARD "\xef\x9f\x82" // U+f7c2 +#define ICON_FA_SEARCH "\xef\x80\x82" // U+f002 +#define ICON_FA_SEARCH_DOLLAR "\xef\x9a\x88" // U+f688 +#define ICON_FA_SEARCH_LOCATION "\xef\x9a\x89" // U+f689 +#define ICON_FA_SEARCH_MINUS "\xef\x80\x90" // U+f010 +#define ICON_FA_SEARCH_PLUS "\xef\x80\x8e" // U+f00e +#define ICON_FA_SEEDLING "\xef\x93\x98" // U+f4d8 +#define ICON_FA_SERVER "\xef\x88\xb3" // U+f233 +#define ICON_FA_SHAPES "\xef\x98\x9f" // U+f61f +#define ICON_FA_SHARE "\xef\x81\xa4" // U+f064 +#define ICON_FA_SHARE_ALT "\xef\x87\xa0" // U+f1e0 +#define ICON_FA_SHARE_ALT_SQUARE "\xef\x87\xa1" // U+f1e1 +#define ICON_FA_SHARE_SQUARE "\xef\x85\x8d" // U+f14d +#define ICON_FA_SHEKEL_SIGN "\xef\x88\x8b" // U+f20b +#define ICON_FA_SHIELD_ALT "\xef\x8f\xad" // U+f3ed +#define ICON_FA_SHIELD_VIRUS "\xee\x81\xac" // U+e06c +#define ICON_FA_SHIP "\xef\x88\x9a" // U+f21a +#define ICON_FA_SHIPPING_FAST "\xef\x92\x8b" // U+f48b +#define ICON_FA_SHOE_PRINTS "\xef\x95\x8b" // U+f54b +#define ICON_FA_SHOPPING_BAG "\xef\x8a\x90" // U+f290 +#define ICON_FA_SHOPPING_BASKET "\xef\x8a\x91" // U+f291 +#define ICON_FA_SHOPPING_CART "\xef\x81\xba" // U+f07a +#define ICON_FA_SHOWER "\xef\x8b\x8c" // U+f2cc +#define ICON_FA_SHUTTLE_VAN "\xef\x96\xb6" // U+f5b6 +#define ICON_FA_SIGN "\xef\x93\x99" // U+f4d9 +#define ICON_FA_SIGN_IN_ALT "\xef\x8b\xb6" // U+f2f6 +#define ICON_FA_SIGN_LANGUAGE "\xef\x8a\xa7" // U+f2a7 +#define ICON_FA_SIGN_OUT_ALT "\xef\x8b\xb5" // U+f2f5 +#define ICON_FA_SIGNAL "\xef\x80\x92" // U+f012 +#define ICON_FA_SIGNATURE "\xef\x96\xb7" // U+f5b7 +#define ICON_FA_SIM_CARD "\xef\x9f\x84" // U+f7c4 +#define ICON_FA_SINK "\xee\x81\xad" // U+e06d +#define ICON_FA_SITEMAP "\xef\x83\xa8" // U+f0e8 +#define ICON_FA_SKATING "\xef\x9f\x85" // U+f7c5 +#define ICON_FA_SKIING "\xef\x9f\x89" // U+f7c9 +#define ICON_FA_SKIING_NORDIC "\xef\x9f\x8a" // U+f7ca +#define ICON_FA_SKULL "\xef\x95\x8c" // U+f54c +#define ICON_FA_SKULL_CROSSBONES "\xef\x9c\x94" // U+f714 +#define ICON_FA_SLASH "\xef\x9c\x95" // U+f715 +#define ICON_FA_SLEIGH "\xef\x9f\x8c" // U+f7cc +#define ICON_FA_SLIDERS_H "\xef\x87\x9e" // U+f1de +#define ICON_FA_SMILE "\xef\x84\x98" // U+f118 +#define ICON_FA_SMILE_BEAM "\xef\x96\xb8" // U+f5b8 +#define ICON_FA_SMILE_WINK "\xef\x93\x9a" // U+f4da +#define ICON_FA_SMOG "\xef\x9d\x9f" // U+f75f +#define ICON_FA_SMOKING "\xef\x92\x8d" // U+f48d +#define ICON_FA_SMOKING_BAN "\xef\x95\x8d" // U+f54d +#define ICON_FA_SMS "\xef\x9f\x8d" // U+f7cd +#define ICON_FA_SNOWBOARDING "\xef\x9f\x8e" // U+f7ce +#define ICON_FA_SNOWFLAKE "\xef\x8b\x9c" // U+f2dc +#define ICON_FA_SNOWMAN "\xef\x9f\x90" // U+f7d0 +#define ICON_FA_SNOWPLOW "\xef\x9f\x92" // U+f7d2 +#define ICON_FA_SOAP "\xee\x81\xae" // U+e06e +#define ICON_FA_SOCKS "\xef\x9a\x96" // U+f696 +#define ICON_FA_SOLAR_PANEL "\xef\x96\xba" // U+f5ba +#define ICON_FA_SORT "\xef\x83\x9c" // U+f0dc +#define ICON_FA_SORT_ALPHA_DOWN "\xef\x85\x9d" // U+f15d +#define ICON_FA_SORT_ALPHA_DOWN_ALT "\xef\xa2\x81" // U+f881 +#define ICON_FA_SORT_ALPHA_UP "\xef\x85\x9e" // U+f15e +#define ICON_FA_SORT_ALPHA_UP_ALT "\xef\xa2\x82" // U+f882 +#define ICON_FA_SORT_AMOUNT_DOWN "\xef\x85\xa0" // U+f160 +#define ICON_FA_SORT_AMOUNT_DOWN_ALT "\xef\xa2\x84" // U+f884 +#define ICON_FA_SORT_AMOUNT_UP "\xef\x85\xa1" // U+f161 +#define ICON_FA_SORT_AMOUNT_UP_ALT "\xef\xa2\x85" // U+f885 +#define ICON_FA_SORT_DOWN "\xef\x83\x9d" // U+f0dd +#define ICON_FA_SORT_NUMERIC_DOWN "\xef\x85\xa2" // U+f162 +#define ICON_FA_SORT_NUMERIC_DOWN_ALT "\xef\xa2\x86" // U+f886 +#define ICON_FA_SORT_NUMERIC_UP "\xef\x85\xa3" // U+f163 +#define ICON_FA_SORT_NUMERIC_UP_ALT "\xef\xa2\x87" // U+f887 +#define ICON_FA_SORT_UP "\xef\x83\x9e" // U+f0de +#define ICON_FA_SPA "\xef\x96\xbb" // U+f5bb +#define ICON_FA_SPACE_SHUTTLE "\xef\x86\x97" // U+f197 +#define ICON_FA_SPELL_CHECK "\xef\xa2\x91" // U+f891 +#define ICON_FA_SPIDER "\xef\x9c\x97" // U+f717 +#define ICON_FA_SPINNER "\xef\x84\x90" // U+f110 +#define ICON_FA_SPLOTCH "\xef\x96\xbc" // U+f5bc +#define ICON_FA_SPRAY_CAN "\xef\x96\xbd" // U+f5bd +#define ICON_FA_SQUARE "\xef\x83\x88" // U+f0c8 +#define ICON_FA_SQUARE_FULL "\xef\x91\x9c" // U+f45c +#define ICON_FA_SQUARE_ROOT_ALT "\xef\x9a\x98" // U+f698 +#define ICON_FA_STAMP "\xef\x96\xbf" // U+f5bf +#define ICON_FA_STAR "\xef\x80\x85" // U+f005 +#define ICON_FA_STAR_AND_CRESCENT "\xef\x9a\x99" // U+f699 +#define ICON_FA_STAR_HALF "\xef\x82\x89" // U+f089 +#define ICON_FA_STAR_HALF_ALT "\xef\x97\x80" // U+f5c0 +#define ICON_FA_STAR_OF_DAVID "\xef\x9a\x9a" // U+f69a +#define ICON_FA_STAR_OF_LIFE "\xef\x98\xa1" // U+f621 +#define ICON_FA_STEP_BACKWARD "\xef\x81\x88" // U+f048 +#define ICON_FA_STEP_FORWARD "\xef\x81\x91" // U+f051 +#define ICON_FA_STETHOSCOPE "\xef\x83\xb1" // U+f0f1 +#define ICON_FA_STICKY_NOTE "\xef\x89\x89" // U+f249 +#define ICON_FA_STOP "\xef\x81\x8d" // U+f04d +#define ICON_FA_STOP_CIRCLE "\xef\x8a\x8d" // U+f28d +#define ICON_FA_STOPWATCH "\xef\x8b\xb2" // U+f2f2 +#define ICON_FA_STOPWATCH_20 "\xee\x81\xaf" // U+e06f +#define ICON_FA_STORE "\xef\x95\x8e" // U+f54e +#define ICON_FA_STORE_ALT "\xef\x95\x8f" // U+f54f +#define ICON_FA_STORE_ALT_SLASH "\xee\x81\xb0" // U+e070 +#define ICON_FA_STORE_SLASH "\xee\x81\xb1" // U+e071 +#define ICON_FA_STREAM "\xef\x95\x90" // U+f550 +#define ICON_FA_STREET_VIEW "\xef\x88\x9d" // U+f21d +#define ICON_FA_STRIKETHROUGH "\xef\x83\x8c" // U+f0cc +#define ICON_FA_STROOPWAFEL "\xef\x95\x91" // U+f551 +#define ICON_FA_SUBSCRIPT "\xef\x84\xac" // U+f12c +#define ICON_FA_SUBWAY "\xef\x88\xb9" // U+f239 +#define ICON_FA_SUITCASE "\xef\x83\xb2" // U+f0f2 +#define ICON_FA_SUITCASE_ROLLING "\xef\x97\x81" // U+f5c1 +#define ICON_FA_SUN "\xef\x86\x85" // U+f185 +#define ICON_FA_SUPERSCRIPT "\xef\x84\xab" // U+f12b +#define ICON_FA_SURPRISE "\xef\x97\x82" // U+f5c2 +#define ICON_FA_SWATCHBOOK "\xef\x97\x83" // U+f5c3 +#define ICON_FA_SWIMMER "\xef\x97\x84" // U+f5c4 +#define ICON_FA_SWIMMING_POOL "\xef\x97\x85" // U+f5c5 +#define ICON_FA_SYNAGOGUE "\xef\x9a\x9b" // U+f69b +#define ICON_FA_SYNC "\xef\x80\xa1" // U+f021 +#define ICON_FA_SYNC_ALT "\xef\x8b\xb1" // U+f2f1 +#define ICON_FA_SYRINGE "\xef\x92\x8e" // U+f48e +#define ICON_FA_TABLE "\xef\x83\x8e" // U+f0ce +#define ICON_FA_TABLE_TENNIS "\xef\x91\x9d" // U+f45d +#define ICON_FA_TABLET "\xef\x84\x8a" // U+f10a +#define ICON_FA_TABLET_ALT "\xef\x8f\xba" // U+f3fa +#define ICON_FA_TABLETS "\xef\x92\x90" // U+f490 +#define ICON_FA_TACHOMETER_ALT "\xef\x8f\xbd" // U+f3fd +#define ICON_FA_TAG "\xef\x80\xab" // U+f02b +#define ICON_FA_TAGS "\xef\x80\xac" // U+f02c +#define ICON_FA_TAPE "\xef\x93\x9b" // U+f4db +#define ICON_FA_TASKS "\xef\x82\xae" // U+f0ae +#define ICON_FA_TAXI "\xef\x86\xba" // U+f1ba +#define ICON_FA_TEETH "\xef\x98\xae" // U+f62e +#define ICON_FA_TEETH_OPEN "\xef\x98\xaf" // U+f62f +#define ICON_FA_TEMPERATURE_HIGH "\xef\x9d\xa9" // U+f769 +#define ICON_FA_TEMPERATURE_LOW "\xef\x9d\xab" // U+f76b +#define ICON_FA_TENGE "\xef\x9f\x97" // U+f7d7 +#define ICON_FA_TERMINAL "\xef\x84\xa0" // U+f120 +#define ICON_FA_TEXT_HEIGHT "\xef\x80\xb4" // U+f034 +#define ICON_FA_TEXT_WIDTH "\xef\x80\xb5" // U+f035 +#define ICON_FA_TH "\xef\x80\x8a" // U+f00a +#define ICON_FA_TH_LARGE "\xef\x80\x89" // U+f009 +#define ICON_FA_TH_LIST "\xef\x80\x8b" // U+f00b +#define ICON_FA_THEATER_MASKS "\xef\x98\xb0" // U+f630 +#define ICON_FA_THERMOMETER "\xef\x92\x91" // U+f491 +#define ICON_FA_THERMOMETER_EMPTY "\xef\x8b\x8b" // U+f2cb +#define ICON_FA_THERMOMETER_FULL "\xef\x8b\x87" // U+f2c7 +#define ICON_FA_THERMOMETER_HALF "\xef\x8b\x89" // U+f2c9 +#define ICON_FA_THERMOMETER_QUARTER "\xef\x8b\x8a" // U+f2ca +#define ICON_FA_THERMOMETER_THREE_QUARTERS "\xef\x8b\x88" // U+f2c8 +#define ICON_FA_THUMBS_DOWN "\xef\x85\xa5" // U+f165 +#define ICON_FA_THUMBS_UP "\xef\x85\xa4" // U+f164 +#define ICON_FA_THUMBTACK "\xef\x82\x8d" // U+f08d +#define ICON_FA_TICKET_ALT "\xef\x8f\xbf" // U+f3ff +#define ICON_FA_TIMES "\xef\x80\x8d" // U+f00d +#define ICON_FA_TIMES_CIRCLE "\xef\x81\x97" // U+f057 +#define ICON_FA_TINT "\xef\x81\x83" // U+f043 +#define ICON_FA_TINT_SLASH "\xef\x97\x87" // U+f5c7 +#define ICON_FA_TIRED "\xef\x97\x88" // U+f5c8 +#define ICON_FA_TOGGLE_OFF "\xef\x88\x84" // U+f204 +#define ICON_FA_TOGGLE_ON "\xef\x88\x85" // U+f205 +#define ICON_FA_TOILET "\xef\x9f\x98" // U+f7d8 +#define ICON_FA_TOILET_PAPER "\xef\x9c\x9e" // U+f71e +#define ICON_FA_TOILET_PAPER_SLASH "\xee\x81\xb2" // U+e072 +#define ICON_FA_TOOLBOX "\xef\x95\x92" // U+f552 +#define ICON_FA_TOOLS "\xef\x9f\x99" // U+f7d9 +#define ICON_FA_TOOTH "\xef\x97\x89" // U+f5c9 +#define ICON_FA_TORAH "\xef\x9a\xa0" // U+f6a0 +#define ICON_FA_TORII_GATE "\xef\x9a\xa1" // U+f6a1 +#define ICON_FA_TRACTOR "\xef\x9c\xa2" // U+f722 +#define ICON_FA_TRADEMARK "\xef\x89\x9c" // U+f25c +#define ICON_FA_TRAFFIC_LIGHT "\xef\x98\xb7" // U+f637 +#define ICON_FA_TRAILER "\xee\x81\x81" // U+e041 +#define ICON_FA_TRAIN "\xef\x88\xb8" // U+f238 +#define ICON_FA_TRAM "\xef\x9f\x9a" // U+f7da +#define ICON_FA_TRANSGENDER "\xef\x88\xa4" // U+f224 +#define ICON_FA_TRANSGENDER_ALT "\xef\x88\xa5" // U+f225 +#define ICON_FA_TRASH "\xef\x87\xb8" // U+f1f8 +#define ICON_FA_TRASH_ALT "\xef\x8b\xad" // U+f2ed +#define ICON_FA_TRASH_RESTORE "\xef\xa0\xa9" // U+f829 +#define ICON_FA_TRASH_RESTORE_ALT "\xef\xa0\xaa" // U+f82a +#define ICON_FA_TREE "\xef\x86\xbb" // U+f1bb +#define ICON_FA_TROPHY "\xef\x82\x91" // U+f091 +#define ICON_FA_TRUCK "\xef\x83\x91" // U+f0d1 +#define ICON_FA_TRUCK_LOADING "\xef\x93\x9e" // U+f4de +#define ICON_FA_TRUCK_MONSTER "\xef\x98\xbb" // U+f63b +#define ICON_FA_TRUCK_MOVING "\xef\x93\x9f" // U+f4df +#define ICON_FA_TRUCK_PICKUP "\xef\x98\xbc" // U+f63c +#define ICON_FA_TSHIRT "\xef\x95\x93" // U+f553 +#define ICON_FA_TTY "\xef\x87\xa4" // U+f1e4 +#define ICON_FA_TV "\xef\x89\xac" // U+f26c +#define ICON_FA_UMBRELLA "\xef\x83\xa9" // U+f0e9 +#define ICON_FA_UMBRELLA_BEACH "\xef\x97\x8a" // U+f5ca +#define ICON_FA_UNDERLINE "\xef\x83\x8d" // U+f0cd +#define ICON_FA_UNDO "\xef\x83\xa2" // U+f0e2 +#define ICON_FA_UNDO_ALT "\xef\x8b\xaa" // U+f2ea +#define ICON_FA_UNIVERSAL_ACCESS "\xef\x8a\x9a" // U+f29a +#define ICON_FA_UNIVERSITY "\xef\x86\x9c" // U+f19c +#define ICON_FA_UNLINK "\xef\x84\xa7" // U+f127 +#define ICON_FA_UNLOCK "\xef\x82\x9c" // U+f09c +#define ICON_FA_UNLOCK_ALT "\xef\x84\xbe" // U+f13e +#define ICON_FA_UPLOAD "\xef\x82\x93" // U+f093 +#define ICON_FA_USER "\xef\x80\x87" // U+f007 +#define ICON_FA_USER_ALT "\xef\x90\x86" // U+f406 +#define ICON_FA_USER_ALT_SLASH "\xef\x93\xba" // U+f4fa +#define ICON_FA_USER_ASTRONAUT "\xef\x93\xbb" // U+f4fb +#define ICON_FA_USER_CHECK "\xef\x93\xbc" // U+f4fc +#define ICON_FA_USER_CIRCLE "\xef\x8a\xbd" // U+f2bd +#define ICON_FA_USER_CLOCK "\xef\x93\xbd" // U+f4fd +#define ICON_FA_USER_COG "\xef\x93\xbe" // U+f4fe +#define ICON_FA_USER_EDIT "\xef\x93\xbf" // U+f4ff +#define ICON_FA_USER_FRIENDS "\xef\x94\x80" // U+f500 +#define ICON_FA_USER_GRADUATE "\xef\x94\x81" // U+f501 +#define ICON_FA_USER_INJURED "\xef\x9c\xa8" // U+f728 +#define ICON_FA_USER_LOCK "\xef\x94\x82" // U+f502 +#define ICON_FA_USER_MD "\xef\x83\xb0" // U+f0f0 +#define ICON_FA_USER_MINUS "\xef\x94\x83" // U+f503 +#define ICON_FA_USER_NINJA "\xef\x94\x84" // U+f504 +#define ICON_FA_USER_NURSE "\xef\xa0\xaf" // U+f82f +#define ICON_FA_USER_PLUS "\xef\x88\xb4" // U+f234 +#define ICON_FA_USER_SECRET "\xef\x88\x9b" // U+f21b +#define ICON_FA_USER_SHIELD "\xef\x94\x85" // U+f505 +#define ICON_FA_USER_SLASH "\xef\x94\x86" // U+f506 +#define ICON_FA_USER_TAG "\xef\x94\x87" // U+f507 +#define ICON_FA_USER_TIE "\xef\x94\x88" // U+f508 +#define ICON_FA_USER_TIMES "\xef\x88\xb5" // U+f235 +#define ICON_FA_USERS "\xef\x83\x80" // U+f0c0 +#define ICON_FA_USERS_COG "\xef\x94\x89" // U+f509 +#define ICON_FA_USERS_SLASH "\xee\x81\xb3" // U+e073 +#define ICON_FA_UTENSIL_SPOON "\xef\x8b\xa5" // U+f2e5 +#define ICON_FA_UTENSILS "\xef\x8b\xa7" // U+f2e7 +#define ICON_FA_VECTOR_SQUARE "\xef\x97\x8b" // U+f5cb +#define ICON_FA_VENUS "\xef\x88\xa1" // U+f221 +#define ICON_FA_VENUS_DOUBLE "\xef\x88\xa6" // U+f226 +#define ICON_FA_VENUS_MARS "\xef\x88\xa8" // U+f228 +#define ICON_FA_VEST "\xee\x82\x85" // U+e085 +#define ICON_FA_VEST_PATCHES "\xee\x82\x86" // U+e086 +#define ICON_FA_VIAL "\xef\x92\x92" // U+f492 +#define ICON_FA_VIALS "\xef\x92\x93" // U+f493 +#define ICON_FA_VIDEO "\xef\x80\xbd" // U+f03d +#define ICON_FA_VIDEO_SLASH "\xef\x93\xa2" // U+f4e2 +#define ICON_FA_VIHARA "\xef\x9a\xa7" // U+f6a7 +#define ICON_FA_VIRUS "\xee\x81\xb4" // U+e074 +#define ICON_FA_VIRUS_SLASH "\xee\x81\xb5" // U+e075 +#define ICON_FA_VIRUSES "\xee\x81\xb6" // U+e076 +#define ICON_FA_VOICEMAIL "\xef\xa2\x97" // U+f897 +#define ICON_FA_VOLLEYBALL_BALL "\xef\x91\x9f" // U+f45f +#define ICON_FA_VOLUME_DOWN "\xef\x80\xa7" // U+f027 +#define ICON_FA_VOLUME_MUTE "\xef\x9a\xa9" // U+f6a9 +#define ICON_FA_VOLUME_OFF "\xef\x80\xa6" // U+f026 +#define ICON_FA_VOLUME_UP "\xef\x80\xa8" // U+f028 +#define ICON_FA_VOTE_YEA "\xef\x9d\xb2" // U+f772 +#define ICON_FA_VR_CARDBOARD "\xef\x9c\xa9" // U+f729 +#define ICON_FA_WALKING "\xef\x95\x94" // U+f554 +#define ICON_FA_WALLET "\xef\x95\x95" // U+f555 +#define ICON_FA_WAREHOUSE "\xef\x92\x94" // U+f494 +#define ICON_FA_WATER "\xef\x9d\xb3" // U+f773 +#define ICON_FA_WAVE_SQUARE "\xef\xa0\xbe" // U+f83e +#define ICON_FA_WEIGHT "\xef\x92\x96" // U+f496 +#define ICON_FA_WEIGHT_HANGING "\xef\x97\x8d" // U+f5cd +#define ICON_FA_WHEELCHAIR "\xef\x86\x93" // U+f193 +#define ICON_FA_WIFI "\xef\x87\xab" // U+f1eb +#define ICON_FA_WIND "\xef\x9c\xae" // U+f72e +#define ICON_FA_WINDOW_CLOSE "\xef\x90\x90" // U+f410 +#define ICON_FA_WINDOW_MAXIMIZE "\xef\x8b\x90" // U+f2d0 +#define ICON_FA_WINDOW_MINIMIZE "\xef\x8b\x91" // U+f2d1 +#define ICON_FA_WINDOW_RESTORE "\xef\x8b\x92" // U+f2d2 +#define ICON_FA_WINE_BOTTLE "\xef\x9c\xaf" // U+f72f +#define ICON_FA_WINE_GLASS "\xef\x93\xa3" // U+f4e3 +#define ICON_FA_WINE_GLASS_ALT "\xef\x97\x8e" // U+f5ce +#define ICON_FA_WON_SIGN "\xef\x85\x99" // U+f159 +#define ICON_FA_WRENCH "\xef\x82\xad" // U+f0ad +#define ICON_FA_X_RAY "\xef\x92\x97" // U+f497 +#define ICON_FA_YEN_SIGN "\xef\x85\x97" // U+f157 +#define ICON_FA_YIN_YANG "\xef\x9a\xad" // U+f6ad diff --git a/src/FontAwesome/IconsFontAwesome5Brands.h b/src/FontAwesome/IconsFontAwesome5Brands.h new file mode 100644 index 0000000..b4778a8 --- /dev/null +++ b/src/FontAwesome/IconsFontAwesome5Brands.h @@ -0,0 +1,467 @@ +// Generated by https://github.com/juliettef/IconFontCppHeaders script GenerateIconFontCppHeaders.py for languages C and C++ +// from https://raw.githubusercontent.com/FortAwesome/Font-Awesome/master/metadata/icons.yml +// for use with https://github.com/FortAwesome/Font-Awesome/blob/master/webfonts/fa-brands-400.ttf +#pragma once + +#define FONT_ICON_FILE_NAME_FAB "fa-brands-400.ttf" + +#define ICON_MIN_FAB 0xe007 +#define ICON_MAX_FAB 0xf8e8 +#define ICON_FA_500PX "\xef\x89\xae" // U+f26e +#define ICON_FA_ACCESSIBLE_ICON "\xef\x8d\xa8" // U+f368 +#define ICON_FA_ACCUSOFT "\xef\x8d\xa9" // U+f369 +#define ICON_FA_ACQUISITIONS_INCORPORATED "\xef\x9a\xaf" // U+f6af +#define ICON_FA_ADN "\xef\x85\xb0" // U+f170 +#define ICON_FA_ADVERSAL "\xef\x8d\xaa" // U+f36a +#define ICON_FA_AFFILIATETHEME "\xef\x8d\xab" // U+f36b +#define ICON_FA_AIRBNB "\xef\xa0\xb4" // U+f834 +#define ICON_FA_ALGOLIA "\xef\x8d\xac" // U+f36c +#define ICON_FA_ALIPAY "\xef\x99\x82" // U+f642 +#define ICON_FA_AMAZON "\xef\x89\xb0" // U+f270 +#define ICON_FA_AMAZON_PAY "\xef\x90\xac" // U+f42c +#define ICON_FA_AMILIA "\xef\x8d\xad" // U+f36d +#define ICON_FA_ANDROID "\xef\x85\xbb" // U+f17b +#define ICON_FA_ANGELLIST "\xef\x88\x89" // U+f209 +#define ICON_FA_ANGRYCREATIVE "\xef\x8d\xae" // U+f36e +#define ICON_FA_ANGULAR "\xef\x90\xa0" // U+f420 +#define ICON_FA_APP_STORE "\xef\x8d\xaf" // U+f36f +#define ICON_FA_APP_STORE_IOS "\xef\x8d\xb0" // U+f370 +#define ICON_FA_APPER "\xef\x8d\xb1" // U+f371 +#define ICON_FA_APPLE "\xef\x85\xb9" // U+f179 +#define ICON_FA_APPLE_PAY "\xef\x90\x95" // U+f415 +#define ICON_FA_ARTSTATION "\xef\x9d\xba" // U+f77a +#define ICON_FA_ASYMMETRIK "\xef\x8d\xb2" // U+f372 +#define ICON_FA_ATLASSIAN "\xef\x9d\xbb" // U+f77b +#define ICON_FA_AUDIBLE "\xef\x8d\xb3" // U+f373 +#define ICON_FA_AUTOPREFIXER "\xef\x90\x9c" // U+f41c +#define ICON_FA_AVIANEX "\xef\x8d\xb4" // U+f374 +#define ICON_FA_AVIATO "\xef\x90\xa1" // U+f421 +#define ICON_FA_AWS "\xef\x8d\xb5" // U+f375 +#define ICON_FA_BANDCAMP "\xef\x8b\x95" // U+f2d5 +#define ICON_FA_BATTLE_NET "\xef\xa0\xb5" // U+f835 +#define ICON_FA_BEHANCE "\xef\x86\xb4" // U+f1b4 +#define ICON_FA_BEHANCE_SQUARE "\xef\x86\xb5" // U+f1b5 +#define ICON_FA_BIMOBJECT "\xef\x8d\xb8" // U+f378 +#define ICON_FA_BITBUCKET "\xef\x85\xb1" // U+f171 +#define ICON_FA_BITCOIN "\xef\x8d\xb9" // U+f379 +#define ICON_FA_BITY "\xef\x8d\xba" // U+f37a +#define ICON_FA_BLACK_TIE "\xef\x89\xbe" // U+f27e +#define ICON_FA_BLACKBERRY "\xef\x8d\xbb" // U+f37b +#define ICON_FA_BLOGGER "\xef\x8d\xbc" // U+f37c +#define ICON_FA_BLOGGER_B "\xef\x8d\xbd" // U+f37d +#define ICON_FA_BLUETOOTH "\xef\x8a\x93" // U+f293 +#define ICON_FA_BLUETOOTH_B "\xef\x8a\x94" // U+f294 +#define ICON_FA_BOOTSTRAP "\xef\xa0\xb6" // U+f836 +#define ICON_FA_BTC "\xef\x85\x9a" // U+f15a +#define ICON_FA_BUFFER "\xef\xa0\xb7" // U+f837 +#define ICON_FA_BUROMOBELEXPERTE "\xef\x8d\xbf" // U+f37f +#define ICON_FA_BUY_N_LARGE "\xef\xa2\xa6" // U+f8a6 +#define ICON_FA_BUYSELLADS "\xef\x88\x8d" // U+f20d +#define ICON_FA_CANADIAN_MAPLE_LEAF "\xef\x9e\x85" // U+f785 +#define ICON_FA_CC_AMAZON_PAY "\xef\x90\xad" // U+f42d +#define ICON_FA_CC_AMEX "\xef\x87\xb3" // U+f1f3 +#define ICON_FA_CC_APPLE_PAY "\xef\x90\x96" // U+f416 +#define ICON_FA_CC_DINERS_CLUB "\xef\x89\x8c" // U+f24c +#define ICON_FA_CC_DISCOVER "\xef\x87\xb2" // U+f1f2 +#define ICON_FA_CC_JCB "\xef\x89\x8b" // U+f24b +#define ICON_FA_CC_MASTERCARD "\xef\x87\xb1" // U+f1f1 +#define ICON_FA_CC_PAYPAL "\xef\x87\xb4" // U+f1f4 +#define ICON_FA_CC_STRIPE "\xef\x87\xb5" // U+f1f5 +#define ICON_FA_CC_VISA "\xef\x87\xb0" // U+f1f0 +#define ICON_FA_CENTERCODE "\xef\x8e\x80" // U+f380 +#define ICON_FA_CENTOS "\xef\x9e\x89" // U+f789 +#define ICON_FA_CHROME "\xef\x89\xa8" // U+f268 +#define ICON_FA_CHROMECAST "\xef\xa0\xb8" // U+f838 +#define ICON_FA_CLOUDFLARE "\xee\x81\xbd" // U+e07d +#define ICON_FA_CLOUDSCALE "\xef\x8e\x83" // U+f383 +#define ICON_FA_CLOUDSMITH "\xef\x8e\x84" // U+f384 +#define ICON_FA_CLOUDVERSIFY "\xef\x8e\x85" // U+f385 +#define ICON_FA_CODEPEN "\xef\x87\x8b" // U+f1cb +#define ICON_FA_CODIEPIE "\xef\x8a\x84" // U+f284 +#define ICON_FA_CONFLUENCE "\xef\x9e\x8d" // U+f78d +#define ICON_FA_CONNECTDEVELOP "\xef\x88\x8e" // U+f20e +#define ICON_FA_CONTAO "\xef\x89\xad" // U+f26d +#define ICON_FA_COTTON_BUREAU "\xef\xa2\x9e" // U+f89e +#define ICON_FA_CPANEL "\xef\x8e\x88" // U+f388 +#define ICON_FA_CREATIVE_COMMONS "\xef\x89\x9e" // U+f25e +#define ICON_FA_CREATIVE_COMMONS_BY "\xef\x93\xa7" // U+f4e7 +#define ICON_FA_CREATIVE_COMMONS_NC "\xef\x93\xa8" // U+f4e8 +#define ICON_FA_CREATIVE_COMMONS_NC_EU "\xef\x93\xa9" // U+f4e9 +#define ICON_FA_CREATIVE_COMMONS_NC_JP "\xef\x93\xaa" // U+f4ea +#define ICON_FA_CREATIVE_COMMONS_ND "\xef\x93\xab" // U+f4eb +#define ICON_FA_CREATIVE_COMMONS_PD "\xef\x93\xac" // U+f4ec +#define ICON_FA_CREATIVE_COMMONS_PD_ALT "\xef\x93\xad" // U+f4ed +#define ICON_FA_CREATIVE_COMMONS_REMIX "\xef\x93\xae" // U+f4ee +#define ICON_FA_CREATIVE_COMMONS_SA "\xef\x93\xaf" // U+f4ef +#define ICON_FA_CREATIVE_COMMONS_SAMPLING "\xef\x93\xb0" // U+f4f0 +#define ICON_FA_CREATIVE_COMMONS_SAMPLING_PLUS "\xef\x93\xb1" // U+f4f1 +#define ICON_FA_CREATIVE_COMMONS_SHARE "\xef\x93\xb2" // U+f4f2 +#define ICON_FA_CREATIVE_COMMONS_ZERO "\xef\x93\xb3" // U+f4f3 +#define ICON_FA_CRITICAL_ROLE "\xef\x9b\x89" // U+f6c9 +#define ICON_FA_CSS3 "\xef\x84\xbc" // U+f13c +#define ICON_FA_CSS3_ALT "\xef\x8e\x8b" // U+f38b +#define ICON_FA_CUTTLEFISH "\xef\x8e\x8c" // U+f38c +#define ICON_FA_D_AND_D "\xef\x8e\x8d" // U+f38d +#define ICON_FA_D_AND_D_BEYOND "\xef\x9b\x8a" // U+f6ca +#define ICON_FA_DAILYMOTION "\xee\x81\x92" // U+e052 +#define ICON_FA_DASHCUBE "\xef\x88\x90" // U+f210 +#define ICON_FA_DEEZER "\xee\x81\xb7" // U+e077 +#define ICON_FA_DELICIOUS "\xef\x86\xa5" // U+f1a5 +#define ICON_FA_DEPLOYDOG "\xef\x8e\x8e" // U+f38e +#define ICON_FA_DESKPRO "\xef\x8e\x8f" // U+f38f +#define ICON_FA_DEV "\xef\x9b\x8c" // U+f6cc +#define ICON_FA_DEVIANTART "\xef\x86\xbd" // U+f1bd +#define ICON_FA_DHL "\xef\x9e\x90" // U+f790 +#define ICON_FA_DIASPORA "\xef\x9e\x91" // U+f791 +#define ICON_FA_DIGG "\xef\x86\xa6" // U+f1a6 +#define ICON_FA_DIGITAL_OCEAN "\xef\x8e\x91" // U+f391 +#define ICON_FA_DISCORD "\xef\x8e\x92" // U+f392 +#define ICON_FA_DISCOURSE "\xef\x8e\x93" // U+f393 +#define ICON_FA_DOCHUB "\xef\x8e\x94" // U+f394 +#define ICON_FA_DOCKER "\xef\x8e\x95" // U+f395 +#define ICON_FA_DRAFT2DIGITAL "\xef\x8e\x96" // U+f396 +#define ICON_FA_DRIBBBLE "\xef\x85\xbd" // U+f17d +#define ICON_FA_DRIBBBLE_SQUARE "\xef\x8e\x97" // U+f397 +#define ICON_FA_DROPBOX "\xef\x85\xab" // U+f16b +#define ICON_FA_DRUPAL "\xef\x86\xa9" // U+f1a9 +#define ICON_FA_DYALOG "\xef\x8e\x99" // U+f399 +#define ICON_FA_EARLYBIRDS "\xef\x8e\x9a" // U+f39a +#define ICON_FA_EBAY "\xef\x93\xb4" // U+f4f4 +#define ICON_FA_EDGE "\xef\x8a\x82" // U+f282 +#define ICON_FA_EDGE_LEGACY "\xee\x81\xb8" // U+e078 +#define ICON_FA_ELEMENTOR "\xef\x90\xb0" // U+f430 +#define ICON_FA_ELLO "\xef\x97\xb1" // U+f5f1 +#define ICON_FA_EMBER "\xef\x90\xa3" // U+f423 +#define ICON_FA_EMPIRE "\xef\x87\x91" // U+f1d1 +#define ICON_FA_ENVIRA "\xef\x8a\x99" // U+f299 +#define ICON_FA_ERLANG "\xef\x8e\x9d" // U+f39d +#define ICON_FA_ETHEREUM "\xef\x90\xae" // U+f42e +#define ICON_FA_ETSY "\xef\x8b\x97" // U+f2d7 +#define ICON_FA_EVERNOTE "\xef\xa0\xb9" // U+f839 +#define ICON_FA_EXPEDITEDSSL "\xef\x88\xbe" // U+f23e +#define ICON_FA_FACEBOOK "\xef\x82\x9a" // U+f09a +#define ICON_FA_FACEBOOK_F "\xef\x8e\x9e" // U+f39e +#define ICON_FA_FACEBOOK_MESSENGER "\xef\x8e\x9f" // U+f39f +#define ICON_FA_FACEBOOK_SQUARE "\xef\x82\x82" // U+f082 +#define ICON_FA_FANTASY_FLIGHT_GAMES "\xef\x9b\x9c" // U+f6dc +#define ICON_FA_FEDEX "\xef\x9e\x97" // U+f797 +#define ICON_FA_FEDORA "\xef\x9e\x98" // U+f798 +#define ICON_FA_FIGMA "\xef\x9e\x99" // U+f799 +#define ICON_FA_FIREFOX "\xef\x89\xa9" // U+f269 +#define ICON_FA_FIREFOX_BROWSER "\xee\x80\x87" // U+e007 +#define ICON_FA_FIRST_ORDER "\xef\x8a\xb0" // U+f2b0 +#define ICON_FA_FIRST_ORDER_ALT "\xef\x94\x8a" // U+f50a +#define ICON_FA_FIRSTDRAFT "\xef\x8e\xa1" // U+f3a1 +#define ICON_FA_FLICKR "\xef\x85\xae" // U+f16e +#define ICON_FA_FLIPBOARD "\xef\x91\x8d" // U+f44d +#define ICON_FA_FLY "\xef\x90\x97" // U+f417 +#define ICON_FA_FONT_AWESOME "\xef\x8a\xb4" // U+f2b4 +#define ICON_FA_FONT_AWESOME_ALT "\xef\x8d\x9c" // U+f35c +#define ICON_FA_FONT_AWESOME_FLAG "\xef\x90\xa5" // U+f425 +#define ICON_FA_FONT_AWESOME_LOGO_FULL "\xef\x93\xa6" // U+f4e6 +#define ICON_FA_FONTICONS "\xef\x8a\x80" // U+f280 +#define ICON_FA_FONTICONS_FI "\xef\x8e\xa2" // U+f3a2 +#define ICON_FA_FORT_AWESOME "\xef\x8a\x86" // U+f286 +#define ICON_FA_FORT_AWESOME_ALT "\xef\x8e\xa3" // U+f3a3 +#define ICON_FA_FORUMBEE "\xef\x88\x91" // U+f211 +#define ICON_FA_FOURSQUARE "\xef\x86\x80" // U+f180 +#define ICON_FA_FREE_CODE_CAMP "\xef\x8b\x85" // U+f2c5 +#define ICON_FA_FREEBSD "\xef\x8e\xa4" // U+f3a4 +#define ICON_FA_FULCRUM "\xef\x94\x8b" // U+f50b +#define ICON_FA_GALACTIC_REPUBLIC "\xef\x94\x8c" // U+f50c +#define ICON_FA_GALACTIC_SENATE "\xef\x94\x8d" // U+f50d +#define ICON_FA_GET_POCKET "\xef\x89\xa5" // U+f265 +#define ICON_FA_GG "\xef\x89\xa0" // U+f260 +#define ICON_FA_GG_CIRCLE "\xef\x89\xa1" // U+f261 +#define ICON_FA_GIT "\xef\x87\x93" // U+f1d3 +#define ICON_FA_GIT_ALT "\xef\xa1\x81" // U+f841 +#define ICON_FA_GIT_SQUARE "\xef\x87\x92" // U+f1d2 +#define ICON_FA_GITHUB "\xef\x82\x9b" // U+f09b +#define ICON_FA_GITHUB_ALT "\xef\x84\x93" // U+f113 +#define ICON_FA_GITHUB_SQUARE "\xef\x82\x92" // U+f092 +#define ICON_FA_GITKRAKEN "\xef\x8e\xa6" // U+f3a6 +#define ICON_FA_GITLAB "\xef\x8a\x96" // U+f296 +#define ICON_FA_GITTER "\xef\x90\xa6" // U+f426 +#define ICON_FA_GLIDE "\xef\x8a\xa5" // U+f2a5 +#define ICON_FA_GLIDE_G "\xef\x8a\xa6" // U+f2a6 +#define ICON_FA_GOFORE "\xef\x8e\xa7" // U+f3a7 +#define ICON_FA_GOODREADS "\xef\x8e\xa8" // U+f3a8 +#define ICON_FA_GOODREADS_G "\xef\x8e\xa9" // U+f3a9 +#define ICON_FA_GOOGLE "\xef\x86\xa0" // U+f1a0 +#define ICON_FA_GOOGLE_DRIVE "\xef\x8e\xaa" // U+f3aa +#define ICON_FA_GOOGLE_PAY "\xee\x81\xb9" // U+e079 +#define ICON_FA_GOOGLE_PLAY "\xef\x8e\xab" // U+f3ab +#define ICON_FA_GOOGLE_PLUS "\xef\x8a\xb3" // U+f2b3 +#define ICON_FA_GOOGLE_PLUS_G "\xef\x83\x95" // U+f0d5 +#define ICON_FA_GOOGLE_PLUS_SQUARE "\xef\x83\x94" // U+f0d4 +#define ICON_FA_GOOGLE_WALLET "\xef\x87\xae" // U+f1ee +#define ICON_FA_GRATIPAY "\xef\x86\x84" // U+f184 +#define ICON_FA_GRAV "\xef\x8b\x96" // U+f2d6 +#define ICON_FA_GRIPFIRE "\xef\x8e\xac" // U+f3ac +#define ICON_FA_GRUNT "\xef\x8e\xad" // U+f3ad +#define ICON_FA_GUILDED "\xee\x81\xbe" // U+e07e +#define ICON_FA_GULP "\xef\x8e\xae" // U+f3ae +#define ICON_FA_HACKER_NEWS "\xef\x87\x94" // U+f1d4 +#define ICON_FA_HACKER_NEWS_SQUARE "\xef\x8e\xaf" // U+f3af +#define ICON_FA_HACKERRANK "\xef\x97\xb7" // U+f5f7 +#define ICON_FA_HIPS "\xef\x91\x92" // U+f452 +#define ICON_FA_HIRE_A_HELPER "\xef\x8e\xb0" // U+f3b0 +#define ICON_FA_HIVE "\xee\x81\xbf" // U+e07f +#define ICON_FA_HOOLI "\xef\x90\xa7" // U+f427 +#define ICON_FA_HORNBILL "\xef\x96\x92" // U+f592 +#define ICON_FA_HOTJAR "\xef\x8e\xb1" // U+f3b1 +#define ICON_FA_HOUZZ "\xef\x89\xbc" // U+f27c +#define ICON_FA_HTML5 "\xef\x84\xbb" // U+f13b +#define ICON_FA_HUBSPOT "\xef\x8e\xb2" // U+f3b2 +#define ICON_FA_IDEAL "\xee\x80\x93" // U+e013 +#define ICON_FA_IMDB "\xef\x8b\x98" // U+f2d8 +#define ICON_FA_INNOSOFT "\xee\x82\x80" // U+e080 +#define ICON_FA_INSTAGRAM "\xef\x85\xad" // U+f16d +#define ICON_FA_INSTAGRAM_SQUARE "\xee\x81\x95" // U+e055 +#define ICON_FA_INSTALOD "\xee\x82\x81" // U+e081 +#define ICON_FA_INTERCOM "\xef\x9e\xaf" // U+f7af +#define ICON_FA_INTERNET_EXPLORER "\xef\x89\xab" // U+f26b +#define ICON_FA_INVISION "\xef\x9e\xb0" // U+f7b0 +#define ICON_FA_IOXHOST "\xef\x88\x88" // U+f208 +#define ICON_FA_ITCH_IO "\xef\xa0\xba" // U+f83a +#define ICON_FA_ITUNES "\xef\x8e\xb4" // U+f3b4 +#define ICON_FA_ITUNES_NOTE "\xef\x8e\xb5" // U+f3b5 +#define ICON_FA_JAVA "\xef\x93\xa4" // U+f4e4 +#define ICON_FA_JEDI_ORDER "\xef\x94\x8e" // U+f50e +#define ICON_FA_JENKINS "\xef\x8e\xb6" // U+f3b6 +#define ICON_FA_JIRA "\xef\x9e\xb1" // U+f7b1 +#define ICON_FA_JOGET "\xef\x8e\xb7" // U+f3b7 +#define ICON_FA_JOOMLA "\xef\x86\xaa" // U+f1aa +#define ICON_FA_JS "\xef\x8e\xb8" // U+f3b8 +#define ICON_FA_JS_SQUARE "\xef\x8e\xb9" // U+f3b9 +#define ICON_FA_JSFIDDLE "\xef\x87\x8c" // U+f1cc +#define ICON_FA_KAGGLE "\xef\x97\xba" // U+f5fa +#define ICON_FA_KEYBASE "\xef\x93\xb5" // U+f4f5 +#define ICON_FA_KEYCDN "\xef\x8e\xba" // U+f3ba +#define ICON_FA_KICKSTARTER "\xef\x8e\xbb" // U+f3bb +#define ICON_FA_KICKSTARTER_K "\xef\x8e\xbc" // U+f3bc +#define ICON_FA_KORVUE "\xef\x90\xaf" // U+f42f +#define ICON_FA_LARAVEL "\xef\x8e\xbd" // U+f3bd +#define ICON_FA_LASTFM "\xef\x88\x82" // U+f202 +#define ICON_FA_LASTFM_SQUARE "\xef\x88\x83" // U+f203 +#define ICON_FA_LEANPUB "\xef\x88\x92" // U+f212 +#define ICON_FA_LESS "\xef\x90\x9d" // U+f41d +#define ICON_FA_LINE "\xef\x8f\x80" // U+f3c0 +#define ICON_FA_LINKEDIN "\xef\x82\x8c" // U+f08c +#define ICON_FA_LINKEDIN_IN "\xef\x83\xa1" // U+f0e1 +#define ICON_FA_LINODE "\xef\x8a\xb8" // U+f2b8 +#define ICON_FA_LINUX "\xef\x85\xbc" // U+f17c +#define ICON_FA_LYFT "\xef\x8f\x83" // U+f3c3 +#define ICON_FA_MAGENTO "\xef\x8f\x84" // U+f3c4 +#define ICON_FA_MAILCHIMP "\xef\x96\x9e" // U+f59e +#define ICON_FA_MANDALORIAN "\xef\x94\x8f" // U+f50f +#define ICON_FA_MARKDOWN "\xef\x98\x8f" // U+f60f +#define ICON_FA_MASTODON "\xef\x93\xb6" // U+f4f6 +#define ICON_FA_MAXCDN "\xef\x84\xb6" // U+f136 +#define ICON_FA_MDB "\xef\xa3\x8a" // U+f8ca +#define ICON_FA_MEDAPPS "\xef\x8f\x86" // U+f3c6 +#define ICON_FA_MEDIUM "\xef\x88\xba" // U+f23a +#define ICON_FA_MEDIUM_M "\xef\x8f\x87" // U+f3c7 +#define ICON_FA_MEDRT "\xef\x8f\x88" // U+f3c8 +#define ICON_FA_MEETUP "\xef\x8b\xa0" // U+f2e0 +#define ICON_FA_MEGAPORT "\xef\x96\xa3" // U+f5a3 +#define ICON_FA_MENDELEY "\xef\x9e\xb3" // U+f7b3 +#define ICON_FA_MICROBLOG "\xee\x80\x9a" // U+e01a +#define ICON_FA_MICROSOFT "\xef\x8f\x8a" // U+f3ca +#define ICON_FA_MIX "\xef\x8f\x8b" // U+f3cb +#define ICON_FA_MIXCLOUD "\xef\x8a\x89" // U+f289 +#define ICON_FA_MIXER "\xee\x81\x96" // U+e056 +#define ICON_FA_MIZUNI "\xef\x8f\x8c" // U+f3cc +#define ICON_FA_MODX "\xef\x8a\x85" // U+f285 +#define ICON_FA_MONERO "\xef\x8f\x90" // U+f3d0 +#define ICON_FA_NAPSTER "\xef\x8f\x92" // U+f3d2 +#define ICON_FA_NEOS "\xef\x98\x92" // U+f612 +#define ICON_FA_NIMBLR "\xef\x96\xa8" // U+f5a8 +#define ICON_FA_NODE "\xef\x90\x99" // U+f419 +#define ICON_FA_NODE_JS "\xef\x8f\x93" // U+f3d3 +#define ICON_FA_NPM "\xef\x8f\x94" // U+f3d4 +#define ICON_FA_NS8 "\xef\x8f\x95" // U+f3d5 +#define ICON_FA_NUTRITIONIX "\xef\x8f\x96" // U+f3d6 +#define ICON_FA_OCTOPUS_DEPLOY "\xee\x82\x82" // U+e082 +#define ICON_FA_ODNOKLASSNIKI "\xef\x89\xa3" // U+f263 +#define ICON_FA_ODNOKLASSNIKI_SQUARE "\xef\x89\xa4" // U+f264 +#define ICON_FA_OLD_REPUBLIC "\xef\x94\x90" // U+f510 +#define ICON_FA_OPENCART "\xef\x88\xbd" // U+f23d +#define ICON_FA_OPENID "\xef\x86\x9b" // U+f19b +#define ICON_FA_OPERA "\xef\x89\xaa" // U+f26a +#define ICON_FA_OPTIN_MONSTER "\xef\x88\xbc" // U+f23c +#define ICON_FA_ORCID "\xef\xa3\x92" // U+f8d2 +#define ICON_FA_OSI "\xef\x90\x9a" // U+f41a +#define ICON_FA_PAGE4 "\xef\x8f\x97" // U+f3d7 +#define ICON_FA_PAGELINES "\xef\x86\x8c" // U+f18c +#define ICON_FA_PALFED "\xef\x8f\x98" // U+f3d8 +#define ICON_FA_PATREON "\xef\x8f\x99" // U+f3d9 +#define ICON_FA_PAYPAL "\xef\x87\xad" // U+f1ed +#define ICON_FA_PENNY_ARCADE "\xef\x9c\x84" // U+f704 +#define ICON_FA_PERBYTE "\xee\x82\x83" // U+e083 +#define ICON_FA_PERISCOPE "\xef\x8f\x9a" // U+f3da +#define ICON_FA_PHABRICATOR "\xef\x8f\x9b" // U+f3db +#define ICON_FA_PHOENIX_FRAMEWORK "\xef\x8f\x9c" // U+f3dc +#define ICON_FA_PHOENIX_SQUADRON "\xef\x94\x91" // U+f511 +#define ICON_FA_PHP "\xef\x91\x97" // U+f457 +#define ICON_FA_PIED_PIPER "\xef\x8a\xae" // U+f2ae +#define ICON_FA_PIED_PIPER_ALT "\xef\x86\xa8" // U+f1a8 +#define ICON_FA_PIED_PIPER_HAT "\xef\x93\xa5" // U+f4e5 +#define ICON_FA_PIED_PIPER_PP "\xef\x86\xa7" // U+f1a7 +#define ICON_FA_PIED_PIPER_SQUARE "\xee\x80\x9e" // U+e01e +#define ICON_FA_PINTEREST "\xef\x83\x92" // U+f0d2 +#define ICON_FA_PINTEREST_P "\xef\x88\xb1" // U+f231 +#define ICON_FA_PINTEREST_SQUARE "\xef\x83\x93" // U+f0d3 +#define ICON_FA_PLAYSTATION "\xef\x8f\x9f" // U+f3df +#define ICON_FA_PRODUCT_HUNT "\xef\x8a\x88" // U+f288 +#define ICON_FA_PUSHED "\xef\x8f\xa1" // U+f3e1 +#define ICON_FA_PYTHON "\xef\x8f\xa2" // U+f3e2 +#define ICON_FA_QQ "\xef\x87\x96" // U+f1d6 +#define ICON_FA_QUINSCAPE "\xef\x91\x99" // U+f459 +#define ICON_FA_QUORA "\xef\x8b\x84" // U+f2c4 +#define ICON_FA_R_PROJECT "\xef\x93\xb7" // U+f4f7 +#define ICON_FA_RASPBERRY_PI "\xef\x9e\xbb" // U+f7bb +#define ICON_FA_RAVELRY "\xef\x8b\x99" // U+f2d9 +#define ICON_FA_REACT "\xef\x90\x9b" // U+f41b +#define ICON_FA_REACTEUROPE "\xef\x9d\x9d" // U+f75d +#define ICON_FA_README "\xef\x93\x95" // U+f4d5 +#define ICON_FA_REBEL "\xef\x87\x90" // U+f1d0 +#define ICON_FA_RED_RIVER "\xef\x8f\xa3" // U+f3e3 +#define ICON_FA_REDDIT "\xef\x86\xa1" // U+f1a1 +#define ICON_FA_REDDIT_ALIEN "\xef\x8a\x81" // U+f281 +#define ICON_FA_REDDIT_SQUARE "\xef\x86\xa2" // U+f1a2 +#define ICON_FA_REDHAT "\xef\x9e\xbc" // U+f7bc +#define ICON_FA_RENREN "\xef\x86\x8b" // U+f18b +#define ICON_FA_REPLYD "\xef\x8f\xa6" // U+f3e6 +#define ICON_FA_RESEARCHGATE "\xef\x93\xb8" // U+f4f8 +#define ICON_FA_RESOLVING "\xef\x8f\xa7" // U+f3e7 +#define ICON_FA_REV "\xef\x96\xb2" // U+f5b2 +#define ICON_FA_ROCKETCHAT "\xef\x8f\xa8" // U+f3e8 +#define ICON_FA_ROCKRMS "\xef\x8f\xa9" // U+f3e9 +#define ICON_FA_RUST "\xee\x81\xba" // U+e07a +#define ICON_FA_SAFARI "\xef\x89\xa7" // U+f267 +#define ICON_FA_SALESFORCE "\xef\xa0\xbb" // U+f83b +#define ICON_FA_SASS "\xef\x90\x9e" // U+f41e +#define ICON_FA_SCHLIX "\xef\x8f\xaa" // U+f3ea +#define ICON_FA_SCRIBD "\xef\x8a\x8a" // U+f28a +#define ICON_FA_SEARCHENGIN "\xef\x8f\xab" // U+f3eb +#define ICON_FA_SELLCAST "\xef\x8b\x9a" // U+f2da +#define ICON_FA_SELLSY "\xef\x88\x93" // U+f213 +#define ICON_FA_SERVICESTACK "\xef\x8f\xac" // U+f3ec +#define ICON_FA_SHIRTSINBULK "\xef\x88\x94" // U+f214 +#define ICON_FA_SHOPIFY "\xee\x81\x97" // U+e057 +#define ICON_FA_SHOPWARE "\xef\x96\xb5" // U+f5b5 +#define ICON_FA_SIMPLYBUILT "\xef\x88\x95" // U+f215 +#define ICON_FA_SISTRIX "\xef\x8f\xae" // U+f3ee +#define ICON_FA_SITH "\xef\x94\x92" // U+f512 +#define ICON_FA_SKETCH "\xef\x9f\x86" // U+f7c6 +#define ICON_FA_SKYATLAS "\xef\x88\x96" // U+f216 +#define ICON_FA_SKYPE "\xef\x85\xbe" // U+f17e +#define ICON_FA_SLACK "\xef\x86\x98" // U+f198 +#define ICON_FA_SLACK_HASH "\xef\x8f\xaf" // U+f3ef +#define ICON_FA_SLIDESHARE "\xef\x87\xa7" // U+f1e7 +#define ICON_FA_SNAPCHAT "\xef\x8a\xab" // U+f2ab +#define ICON_FA_SNAPCHAT_GHOST "\xef\x8a\xac" // U+f2ac +#define ICON_FA_SNAPCHAT_SQUARE "\xef\x8a\xad" // U+f2ad +#define ICON_FA_SOUNDCLOUD "\xef\x86\xbe" // U+f1be +#define ICON_FA_SOURCETREE "\xef\x9f\x93" // U+f7d3 +#define ICON_FA_SPEAKAP "\xef\x8f\xb3" // U+f3f3 +#define ICON_FA_SPEAKER_DECK "\xef\xa0\xbc" // U+f83c +#define ICON_FA_SPOTIFY "\xef\x86\xbc" // U+f1bc +#define ICON_FA_SQUARESPACE "\xef\x96\xbe" // U+f5be +#define ICON_FA_STACK_EXCHANGE "\xef\x86\x8d" // U+f18d +#define ICON_FA_STACK_OVERFLOW "\xef\x85\xac" // U+f16c +#define ICON_FA_STACKPATH "\xef\xa1\x82" // U+f842 +#define ICON_FA_STAYLINKED "\xef\x8f\xb5" // U+f3f5 +#define ICON_FA_STEAM "\xef\x86\xb6" // U+f1b6 +#define ICON_FA_STEAM_SQUARE "\xef\x86\xb7" // U+f1b7 +#define ICON_FA_STEAM_SYMBOL "\xef\x8f\xb6" // U+f3f6 +#define ICON_FA_STICKER_MULE "\xef\x8f\xb7" // U+f3f7 +#define ICON_FA_STRAVA "\xef\x90\xa8" // U+f428 +#define ICON_FA_STRIPE "\xef\x90\xa9" // U+f429 +#define ICON_FA_STRIPE_S "\xef\x90\xaa" // U+f42a +#define ICON_FA_STUDIOVINARI "\xef\x8f\xb8" // U+f3f8 +#define ICON_FA_STUMBLEUPON "\xef\x86\xa4" // U+f1a4 +#define ICON_FA_STUMBLEUPON_CIRCLE "\xef\x86\xa3" // U+f1a3 +#define ICON_FA_SUPERPOWERS "\xef\x8b\x9d" // U+f2dd +#define ICON_FA_SUPPLE "\xef\x8f\xb9" // U+f3f9 +#define ICON_FA_SUSE "\xef\x9f\x96" // U+f7d6 +#define ICON_FA_SWIFT "\xef\xa3\xa1" // U+f8e1 +#define ICON_FA_SYMFONY "\xef\xa0\xbd" // U+f83d +#define ICON_FA_TEAMSPEAK "\xef\x93\xb9" // U+f4f9 +#define ICON_FA_TELEGRAM "\xef\x8b\x86" // U+f2c6 +#define ICON_FA_TELEGRAM_PLANE "\xef\x8f\xbe" // U+f3fe +#define ICON_FA_TENCENT_WEIBO "\xef\x87\x95" // U+f1d5 +#define ICON_FA_THE_RED_YETI "\xef\x9a\x9d" // U+f69d +#define ICON_FA_THEMECO "\xef\x97\x86" // U+f5c6 +#define ICON_FA_THEMEISLE "\xef\x8a\xb2" // U+f2b2 +#define ICON_FA_THINK_PEAKS "\xef\x9c\xb1" // U+f731 +#define ICON_FA_TIKTOK "\xee\x81\xbb" // U+e07b +#define ICON_FA_TRADE_FEDERATION "\xef\x94\x93" // U+f513 +#define ICON_FA_TRELLO "\xef\x86\x81" // U+f181 +#define ICON_FA_TRIPADVISOR "\xef\x89\xa2" // U+f262 +#define ICON_FA_TUMBLR "\xef\x85\xb3" // U+f173 +#define ICON_FA_TUMBLR_SQUARE "\xef\x85\xb4" // U+f174 +#define ICON_FA_TWITCH "\xef\x87\xa8" // U+f1e8 +#define ICON_FA_TWITTER "\xef\x82\x99" // U+f099 +#define ICON_FA_TWITTER_SQUARE "\xef\x82\x81" // U+f081 +#define ICON_FA_TYPO3 "\xef\x90\xab" // U+f42b +#define ICON_FA_UBER "\xef\x90\x82" // U+f402 +#define ICON_FA_UBUNTU "\xef\x9f\x9f" // U+f7df +#define ICON_FA_UIKIT "\xef\x90\x83" // U+f403 +#define ICON_FA_UMBRACO "\xef\xa3\xa8" // U+f8e8 +#define ICON_FA_UNCHARTED "\xee\x82\x84" // U+e084 +#define ICON_FA_UNIREGISTRY "\xef\x90\x84" // U+f404 +#define ICON_FA_UNITY "\xee\x81\x89" // U+e049 +#define ICON_FA_UNSPLASH "\xee\x81\xbc" // U+e07c +#define ICON_FA_UNTAPPD "\xef\x90\x85" // U+f405 +#define ICON_FA_UPS "\xef\x9f\xa0" // U+f7e0 +#define ICON_FA_USB "\xef\x8a\x87" // U+f287 +#define ICON_FA_USPS "\xef\x9f\xa1" // U+f7e1 +#define ICON_FA_USSUNNAH "\xef\x90\x87" // U+f407 +#define ICON_FA_VAADIN "\xef\x90\x88" // U+f408 +#define ICON_FA_VIACOIN "\xef\x88\xb7" // U+f237 +#define ICON_FA_VIADEO "\xef\x8a\xa9" // U+f2a9 +#define ICON_FA_VIADEO_SQUARE "\xef\x8a\xaa" // U+f2aa +#define ICON_FA_VIBER "\xef\x90\x89" // U+f409 +#define ICON_FA_VIMEO "\xef\x90\x8a" // U+f40a +#define ICON_FA_VIMEO_SQUARE "\xef\x86\x94" // U+f194 +#define ICON_FA_VIMEO_V "\xef\x89\xbd" // U+f27d +#define ICON_FA_VINE "\xef\x87\x8a" // U+f1ca +#define ICON_FA_VK "\xef\x86\x89" // U+f189 +#define ICON_FA_VNV "\xef\x90\x8b" // U+f40b +#define ICON_FA_VUEJS "\xef\x90\x9f" // U+f41f +#define ICON_FA_WATCHMAN_MONITORING "\xee\x82\x87" // U+e087 +#define ICON_FA_WAZE "\xef\xa0\xbf" // U+f83f +#define ICON_FA_WEEBLY "\xef\x97\x8c" // U+f5cc +#define ICON_FA_WEIBO "\xef\x86\x8a" // U+f18a +#define ICON_FA_WEIXIN "\xef\x87\x97" // U+f1d7 +#define ICON_FA_WHATSAPP "\xef\x88\xb2" // U+f232 +#define ICON_FA_WHATSAPP_SQUARE "\xef\x90\x8c" // U+f40c +#define ICON_FA_WHMCS "\xef\x90\x8d" // U+f40d +#define ICON_FA_WIKIPEDIA_W "\xef\x89\xa6" // U+f266 +#define ICON_FA_WINDOWS "\xef\x85\xba" // U+f17a +#define ICON_FA_WIX "\xef\x97\x8f" // U+f5cf +#define ICON_FA_WIZARDS_OF_THE_COAST "\xef\x9c\xb0" // U+f730 +#define ICON_FA_WODU "\xee\x82\x88" // U+e088 +#define ICON_FA_WOLF_PACK_BATTALION "\xef\x94\x94" // U+f514 +#define ICON_FA_WORDPRESS "\xef\x86\x9a" // U+f19a +#define ICON_FA_WORDPRESS_SIMPLE "\xef\x90\x91" // U+f411 +#define ICON_FA_WPBEGINNER "\xef\x8a\x97" // U+f297 +#define ICON_FA_WPEXPLORER "\xef\x8b\x9e" // U+f2de +#define ICON_FA_WPFORMS "\xef\x8a\x98" // U+f298 +#define ICON_FA_WPRESSR "\xef\x8f\xa4" // U+f3e4 +#define ICON_FA_XBOX "\xef\x90\x92" // U+f412 +#define ICON_FA_XING "\xef\x85\xa8" // U+f168 +#define ICON_FA_XING_SQUARE "\xef\x85\xa9" // U+f169 +#define ICON_FA_Y_COMBINATOR "\xef\x88\xbb" // U+f23b +#define ICON_FA_YAHOO "\xef\x86\x9e" // U+f19e +#define ICON_FA_YAMMER "\xef\xa1\x80" // U+f840 +#define ICON_FA_YANDEX "\xef\x90\x93" // U+f413 +#define ICON_FA_YANDEX_INTERNATIONAL "\xef\x90\x94" // U+f414 +#define ICON_FA_YARN "\xef\x9f\xa3" // U+f7e3 +#define ICON_FA_YELP "\xef\x87\xa9" // U+f1e9 +#define ICON_FA_YOAST "\xef\x8a\xb1" // U+f2b1 +#define ICON_FA_YOUTUBE "\xef\x85\xa7" // U+f167 +#define ICON_FA_YOUTUBE_SQUARE "\xef\x90\xb1" // U+f431 +#define ICON_FA_ZHIHU "\xef\x98\xbf" // U+f63f diff --git a/src/Maps/LastMissionId.h b/src/Maps/LastMissionId.h new file mode 100644 index 0000000..e96fc8d --- /dev/null +++ b/src/Maps/LastMissionId.h @@ -0,0 +1,49 @@ +#pragma once + +// MassBuilderSaveTool +// Copyright (C) 2021 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 + +static const std::map mission_id_map {{ + // Story missions + {0x64, "Mission 1 - Training"}, + {0x65, "Mission 2 - Patrol Operation"}, + {0x66, "Mission 3 - Fusion Cells in the Snow"}, + {0x67, "Mission 4 - Earning Changes"}, + {0x68, "Mission 5 - Unexpected Coordination"}, + {0x69, "Mission 6 - Empowering Void"}, + {0x6A, "Mission 7 - Logisitics Obstacles"}, + {0x6B, "Mission 8 - Wrath of the Wastelands"}, + {0x6C, "Mission 9 - Suspicious Originator"}, + {0x6D, "Mission 10 - Researchers Data Recovery"}, + {0x6E, "Mission 11 - Tempestuous Sector"}, + {0x6F, "Mission 12 - Clashes of Metal"}, + {0x70, "Mission 13 - The Sandstorm Glutton"}, + + // Hunting grounds + {0xC8, "Hunt 1 - Desert Pathway Safety"}, + {0xC9, "Hunt 2 - Snowfield Custodian"}, + {0xCA, "Hunt 3 - Abandoned Valley Raid"}, + {0xCB, "Hunt 4 - Depths of the Machineries"}, + + // Challenges + {0x12C, "Challenge 1 - Redline Battlefront"}, + {0x140, "Challenge 2 - Void Convergence"}, + {0x190, "Challenge 3 - Gates of Ascension"} +}}; diff --git a/src/Maps/StoryProgress.h b/src/Maps/StoryProgress.h new file mode 100644 index 0000000..b4fc7f3 --- /dev/null +++ b/src/Maps/StoryProgress.h @@ -0,0 +1,93 @@ +#pragma once + +// MassBuilderSaveTool +// Copyright (C) 2021 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 + +struct StoryProgressPoint { + std::int32_t id; + const char* chapter; + const char* point; + const char* after = ""; +}; + +static const Corrade::Containers::Array story_progress +{ + InPlaceInit, + { + {0x0000, "Chapter 1", "Chapter start (company isn't named yet)"}, + {0x0064, "Chapter 1", "First time in the hangar"}, + {0x0065, "Chapter 1", "After 1st meeting with Quin in mission section"}, + {0x0066, "Chapter 1", "Talking with Reina and Quin in hangar", "After training"}, + {0x0067, "Chapter 1", "Returned to hangar","After training"}, + {0x0068, "Chapter 1", "Talked with Quin in development section", "After training"}, + {0x0069, "Chapter 1", "Talked with Waltz in armour section", "After training"}, + {0x00C8, "Chapter 1", "Talked with Kael in tuning section", "After training"}, + {0x00C9, "Chapter 1", "Got mission 2 briefing", "After training"}, + {0x012C, "Chapter 1", "Talking with Reina", "After mission 2"}, + {0x012D, "Chapter 1", "Returned to hangar", "After mission 2"}, + {0x012E, "Chapter 1", "Talked with Kael in tuning section", "After mission 2"}, + {0x012F, "Chapter 1", "Talked with Reina in hangar", "After mission 2"}, + {0x0130, "Chapter 1", "Got mission 3 briefing", "After mission 2"}, + {0x0190, "Chapter 1", "Talking with Reina", "After mission 3"}, + {0x0191, "Chapter 1", "Returned to hangar", "After mission 3"}, + {0x0192, "Chapter 1", "Talked with Waltz in armour section", "After mission 3"}, + {0x0193, "Chapter 1", "Got mission 4 briefing", "After mission 3"}, + {0x01F4, "Chapter 1", "Talking with Reina", "After mission 4"}, + {0x01F5, "Chapter 1", "Returned to hangar", "After mission 4"}, + {0x01F6, "Chapter 1", "Talked with Waltz in armour section", "After mission 4"}, + {0x01F7, "Chapter 1", "Talked with Reina in hangar", "After mission 4"}, + {0x01F8, "Chapter 1", "Got mission 5 and hunt 1 briefing", "After mission 4"}, + {0x0258, "Chapter 1", "Meeting Neon and Aine", "After mission 5"}, + {0x0259, "Chapter 1", "Returned to hangar", "After mission 5"}, + {0x025A, "Chapter 1", "Got mission 6 briefing", "After mission 5"}, + {0x02BC, "Chapter 1", "Talking with Reina", "After mission 6"}, + {0x02BD, "Chapter 1", "Returned to hangar", "After mission 6"}, + {0x02BE, "Chapter 1", "Got hunt 2 briefing", "After mission 6"}, + {0x02BF, "Chapter 1", "Met Ellenier", "After mission 6"}, + {0x02C0, "Chapter 1", "Got mission 7 briefing", "After mission 6"}, + {0x0320, "Chapter 1", "Talking with Nier", "After mission 7"}, + {0x0321, "Chapter 1", "Returned to hangar", "After mission 7"}, + {0x0322, "Chapter 1", "Talked with Quin, Reina, and Nier in development section", "After mission 7"}, + {0x0323, "Chapter 1", "Got mission 8 briefing", "After mission 7"}, + {0x0384, "Chapter 1", "Talking with crew in hangar", "After mission 8"}, + {0x0385, "Chapter 1", "Returned to hangar", "After mission 8"}, + {0x0386, "Chapter 1", "Got hunt 3 briefing", "After mission 8"}, + {0x0387, "Chapter 1", "Talked with Reina, Nier, and Quin in development section", "After mission 8"}, + {0x0388, "Chapter 2", "Chapter start"}, + {0x0389, "Chapter 2", "Got mission 9 briefing"}, + {0x03E8, "Chapter 2", "Talking with Reina in hangar", "After mission 9"}, + {0x03E9, "Chapter 2", "Returned to hangar", "After mission 9"}, + {0x03EA, "Chapter 2", "Talked with crew in armour section", "After mission 9"}, + {0x03EB, "Chapter 2", "Got mission 10 briefing", "After mission 9"}, + {0x044C, "Chapter 2", "Talking with Reina in hangar", "After mission 10"}, + {0x044D, "Chapter 2", "Returned to hangar", "After mission 10"}, + {0x044E, "Chapter 2", "Got mission 11 briefing", "After mission 10"}, + {0x04B0, "Chapter 2", "Talking with Reina and Nier in hangar", "After mission 11"}, + {0x04B1, "Chapter 2", "Returned to hangar", "After mission 11"}, + {0x04B2, "Chapter 2", "Got mission 12 briefing", "After mission 11"}, + {0x0514, "Chapter 2", "Talking with Reina and Waltz in hangar", "After mission 12"}, + {0x0515, "Chapter 2", "Returned to hangar", "After mission 12"}, + {0x0516, "Chapter 2", "Got hunt 4 and mission 13 briefing", "After mission 12"}, + {0x0578, "Chapter 2", "Talking with Reina in hangar", "After mission 13"}, + {0x0579, "Chapter 2", "Returned to hangar", "After mission 13"}, + {0x057A, "Chapter 2", "Talked with Reina in development section", "After mission 13"}, + {0x057B, "Chapter 2", "Got briefing for challenges 1, 2, and 3", "After mission 13"}, + } +}; diff --git a/src/Mass/Mass.cpp b/src/Mass/Mass.cpp new file mode 100644 index 0000000..7f6f67f --- /dev/null +++ b/src/Mass/Mass.cpp @@ -0,0 +1,151 @@ +// MassBuilderSaveTool +// Copyright (C) 2021 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 + +#include "Mass.h" + +using namespace Corrade; + +constexpr char mass_name_locator[] = "Name_45_A037C5D54E53456407BDF091344529BB\0\x0c\0\0\0StrProperty"; +constexpr char steamid_locator[] = "Account\0\x0c\0\0\0StrProperty"; + +std::string Mass::_lastError; + +Mass::Mass(const std::string& filename) { + _filename = filename; + + if(!Utility::Directory::exists(_filename)) { + _lastError = "The file " + _filename + " couldn't be found."; + return; + } + + auto mmap = Utility::Directory::mapRead(_filename); + + auto iter = std::search(mmap.begin(), mmap.end(), &mass_name_locator[0], &mass_name_locator[56]); + + if(iter != mmap.end()) { + _name = std::string{iter + 70}; + _state = MassState::Valid; + } + else { + _lastError = "The name couldn't be found in " + filename; + _state = MassState::Invalid; + } +} + +auto Mass::lastError() -> std::string const& { + return _lastError; +} + +auto Mass::getNameFromFile(const std::string& filename) -> std::string { + if(!Utility::Directory::exists(filename)) { + _lastError = "The file " + filename + " couldn't be found."; + return ""; + } + + std::string name = ""; + + auto mmap = Utility::Directory::mapRead(filename); + + auto iter = std::search(mmap.begin(), mmap.end(), &mass_name_locator[0], &mass_name_locator[56]); + + if(iter != mmap.end()) { + name = std::string{iter + 70}; + } + else { + _lastError = "The name couldn't be found in " + filename; + } + + return name; +} + +auto Mass::filename() -> std::string const&{ + return _filename; +} + +auto Mass::name() -> std::string const&{ + return _name; +} + +auto Mass::getName() -> std::string const& { + if(!Utility::Directory::exists(_filename)) { + _lastError = "The file " + _filename + " couldn't be found."; + _state = MassState::Empty; + return _name = ""; + } + + auto mmap = Utility::Directory::mapRead(_filename); + + auto iter = std::search(mmap.begin(), mmap.end(), &mass_name_locator[0], &mass_name_locator[56]); + + if(iter != mmap.end()) { + _state = MassState::Valid; + return _name = std::string{iter + 70}; + } + else { + _lastError = "The name couldn't be found in " + _filename; + _state = MassState::Invalid; + return _name = ""; + } +} + +auto Mass::state() -> MassState { + return _state; +} + +auto Mass::updateSteamId(const std::string& steam_id) -> bool { + if(!Utility::Directory::exists(_filename)) { + _lastError = "The file " + _filename + " couldn't be found."; + _state = MassState::Empty; + return false; + } + + Utility::Directory::copy(_filename, _filename + ".tmp"); + + { + auto mmap = Utility::Directory::map(_filename + ".tmp"); + + auto iter = std::search(mmap.begin(), mmap.end(), &steamid_locator[0], &steamid_locator[23]); + + if(iter == mmap.end()) { + _lastError = "The M.A.S.S. file at " + _filename + " seems to be corrupt."; + Utility::Directory::rm(_filename + ".tmp"); + return false; + } + + iter += 37; + + if(std::strncmp(iter, steam_id.c_str(), steam_id.length()) != 0) { + for(int i = 0; i < 17; ++i) { + *(iter + i) = steam_id[i]; + } + } + } + + if(Utility::Directory::exists(_filename)) { + Utility::Directory::rm(_filename); + } + + Utility::Directory::move(_filename + ".tmp", _filename); + + return true; +} diff --git a/src/Mass/Mass.h b/src/Mass/Mass.h new file mode 100644 index 0000000..eed4138 --- /dev/null +++ b/src/Mass/Mass.h @@ -0,0 +1,54 @@ +#pragma once + +// MassBuilderSaveTool +// Copyright (C) 2021 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 + +enum class MassState : std::uint8_t { + Empty, Invalid, Valid +}; + +class Mass { + public: + Mass(const std::string& filename); + + Mass(const Mass&) = delete; + Mass& operator=(const Mass&) = delete; + + Mass(Mass&&) = default; + Mass& operator=(Mass&&) = default; + + static auto lastError() -> std::string const&; + + static auto getNameFromFile(const std::string& filename) -> std::string; + + auto filename() -> std::string const&; + + auto name() -> std::string const&; + auto getName() -> std::string const&; + + auto state() -> MassState; + + auto updateSteamId(const std::string& steam_id) -> bool; + + private: + static std::string _lastError; + + std::string _filename = ""; + std::string _name = ""; + MassState _state = MassState::Empty; +}; diff --git a/src/MassBuilderManager/MassBuilderManager.cpp b/src/MassBuilderManager/MassBuilderManager.cpp new file mode 100644 index 0000000..2cbc9ee --- /dev/null +++ b/src/MassBuilderManager/MassBuilderManager.cpp @@ -0,0 +1,85 @@ +// MassBuilderSaveTool +// Copyright (C) 2021 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 "MassBuilderManager.h" + +#include +#include +#include + +#include +#include + +using namespace Corrade; + +MassBuilderManager::MassBuilderManager() { + _ready = findSaveDirectory(); +} + +auto MassBuilderManager::ready() const -> bool { + return _ready; +} + +auto MassBuilderManager::lastError() -> std::string const& { + return _lastError; +} + +auto MassBuilderManager::saveDirectory() -> std::string const& { + return _saveDirectory; +} + +void MassBuilderManager::checkGameState() { + WTS_PROCESS_INFOW* process_infos = nullptr; + unsigned long process_count = 0; + + if(WTSEnumerateProcessesW(WTS_CURRENT_SERVER_HANDLE, 0, 1, &process_infos, &process_count)) { + Containers::ScopeGuard guard{process_infos, WTSFreeMemory}; + + for(unsigned long i = 0; i < process_count; ++i) { + if(std::wcscmp(process_infos[i].pProcessName, L"MASS_Builder-Win64-Shipping.exe") == 0) { + _gameState = GameState::Running; + break; + } + else { + _gameState = GameState::NotRunning; + } + } + } + else { + _gameState = GameState::Unknown; + } +} + +auto MassBuilderManager::gameState() -> GameState { + return _gameState; +} + +auto MassBuilderManager::findSaveDirectory() -> bool { + wchar_t h[MAX_PATH]; + if(!SUCCEEDED(SHGetFolderPathW(nullptr, CSIDL_LOCAL_APPDATA, nullptr, 0, h))) { + _lastError = "SHGetFolderPathW() failed in MassBuilderManager::findSaveDirectory()"; + return false; + } + + _saveDirectory = Utility::Directory::join(Utility::Directory::fromNativeSeparators(Utility::Unicode::narrow(h)), "MASS_Builder"); + + if(!Utility::Directory::exists(_saveDirectory)) { + _lastError = _saveDirectory + " wasn't found."; + return false; + } + + return true; +} diff --git a/src/MassBuilderManager/MassBuilderManager.h b/src/MassBuilderManager/MassBuilderManager.h new file mode 100644 index 0000000..8a32c6d --- /dev/null +++ b/src/MassBuilderManager/MassBuilderManager.h @@ -0,0 +1,49 @@ +#pragma once + +// MassBuilderSaveTool +// Copyright (C) 2021 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 + +enum class GameState : std::uint8_t { + Unknown, NotRunning, Running +}; + +class MassBuilderManager { + public: + MassBuilderManager(); + + auto ready() const -> bool; + auto lastError() -> std::string const&; + + auto saveDirectory() -> std::string const&; + + void checkGameState(); + auto gameState() -> GameState; + + private: + auto findSaveDirectory() -> bool; + + bool _ready = false; + + std::string _lastError = ""; + + std::string _saveDirectory = ""; + + GameState _gameState = GameState::Unknown; +}; diff --git a/src/MassManager/MassManager.cpp b/src/MassManager/MassManager.cpp new file mode 100644 index 0000000..b6b3b00 --- /dev/null +++ b/src/MassManager/MassManager.cpp @@ -0,0 +1,232 @@ +// MassBuilderSaveTool +// Copyright (C) 2021 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 + +#include "MassManager.h" + +static const std::string empty_string = ""; + +MassManager::MassManager(const std::string& save_path, const std::string& steam_id, bool demo): + _stagingAreaDirectory{Utility::Directory::join(Utility::Directory::path(Utility::Directory::executableLocation()), "staging")} +{ + _saveDirectory = save_path; + _steamId = steam_id; + _demo = demo; + + Containers::arrayReserve(_hangars, 32); + + std::string mass_filename = ""; + for(int i = 0; i < 32; i++) { + mass_filename = Utility::Directory::join(_saveDirectory, Utility::formatString("{}Unit{:.2d}{}.sav", demo ? "Demo" : "", i, _steamId)); + Containers::arrayAppend(_hangars, Mass{mass_filename}); + } + + if(!Utility::Directory::exists(_stagingAreaDirectory)) { + Utility::Directory::mkpath(_stagingAreaDirectory); + } + + refreshStagedMasses(); +} + +auto MassManager::saveDirectory() -> std::string const& { + return _saveDirectory; +} + +auto MassManager::stagingAreaDirectory() -> std::string const& { + return _stagingAreaDirectory; +} + +auto MassManager::lastError() -> std::string const& { + return _lastError; +} + +auto MassManager::massName(int hangar) -> std::string const& { + if(hangar < 0 || hangar >= 32) { + return empty_string; + } + + return _hangars[hangar].name(); +} + +auto MassManager::massState(int hangar) -> MassState { + if(hangar < 0 || hangar >= 32) { + return MassState::Empty; + } + + return _hangars[hangar].state(); +} + +void MassManager::refreshHangar(int hangar) { + if(hangar < 0 || hangar >= 32) { + return; + } + + std::string mass_filename = + Utility::Directory::join(_saveDirectory, Utility::formatString("{}Unit{:.2d}{}.sav", _demo ? "Demo" : "", hangar, _steamId)); + _hangars[hangar] = Mass{mass_filename}; +} + +auto MassManager::importMass(const std::string& staged_fn, int hangar) -> bool { + if(hangar < 0 || hangar >= 32) { + _lastError = "Hangar out of range in MassManager::importMass()"; + return false; + } + + auto it = _stagedMasses.find(staged_fn); + + if(it == _stagedMasses.end()) { + _lastError = "Couldn't find " + staged_fn + " in the staged M.A.S.S.es."; + return false; + } + + std::string source = Utility::Directory::join(_stagingAreaDirectory, staged_fn); + Utility::Directory::copy(source, source + ".tmp"); + + if(!Mass{source + ".tmp"}.updateSteamId(_steamId)) + { + _lastError = "The M.A.S.S. file at " + source + " seems to be corrupt."; + Utility::Directory::rm(source + ".tmp"); + return false; + } + + if(Utility::Directory::exists(_hangars[hangar].filename())) { + Utility::Directory::rm(_hangars[hangar].filename()); + } + + if(!Utility::Directory::move(source + ".tmp", _hangars[hangar].filename())) { + _lastError = Utility::formatString("Couldn't move {} to hangar {:.2d}", staged_fn, hangar + 1); + return false; + } + + return true; +} + +auto MassManager::exportMass(int hangar) -> bool { + if(hangar < 0 || hangar >= 32) { + _lastError = "Hangar out of range in MassManager::exportMass()"; + return false; + } + + if(_hangars[hangar].state() == MassState::Empty || + _hangars[hangar].state() == MassState::Invalid) { + _lastError = Utility::formatString("There is no valid data to export in hangar {:.2d}", hangar + 1); + return false; + } + + std::string source = Utility::Directory::join(_saveDirectory, _hangars[hangar].filename()); + std::string dest = Utility::Directory::join(_stagingAreaDirectory, + Utility::formatString("{}_{}.sav", _hangars[hangar].name(), _steamId)); + + if(!Utility::Directory::copy(source, dest)) { + _lastError = Utility::formatString("Couldn't export data from hangar {:.2d} to {}", hangar, dest); + return false; + } + + return true; +} + +auto MassManager::moveMass(int source, int destination) -> bool { + if(source < 0 || source >= 32) { + _lastError = "Source hangar out of range."; + return false; + } + + if(destination < 0 || destination >= 32) { + _lastError = "Destination hangar out of range."; + return false; + } + + std::string source_file = _hangars[source].filename(); + std::string dest_file = _hangars[destination].filename(); + MassState dest_state = _hangars[destination].state(); + + switch(dest_state) { + case MassState::Empty: + break; + case MassState::Invalid: + Utility::Directory::rm(dest_file); + break; + case MassState::Valid: + Utility::Directory::move(dest_file, dest_file + ".tmp"); + break; + } + + Utility::Directory::move(source_file, dest_file); + + if(dest_state == MassState::Valid) { + Utility::Directory::move(dest_file + ".tmp", source_file); + } + + return true; +} + +auto MassManager::deleteMass(int hangar) -> bool { + if(hangar < 0 || hangar >= 32) { + _lastError = "Hangar out of bounds"; + return false; + } + + if(!Utility::Directory::rm(_hangars[hangar].filename())) { + _lastError = "Deletion failed. Maybe the file was already deleted, or it's locked by another application."; + return false; + } + + return true; +} + +auto MassManager::stagedMasses() -> std::map const& { + return _stagedMasses; +} + +void MassManager::refreshStagedMasses() { + _stagedMasses.clear(); + + using Utility::Directory::Flag; + std::vector file_list = Utility::Directory::list(_stagingAreaDirectory, Flag::SkipSpecial|Flag::SkipDirectories|Flag::SkipDotAndDotDot); + + auto iter = std::remove_if(file_list.begin(), file_list.end(), [](std::string& file){ + return !Utility::String::endsWith(file, ".sav"); + }); + + file_list.erase(iter, file_list.end()); + + for(const std::string& file : file_list) { + std::string name = Mass::getNameFromFile(Utility::Directory::join(_stagingAreaDirectory, file)); + + if(!name.empty()) { + _stagedMasses[file] = name; + } + } +} + +auto MassManager::deleteStagedMass(const std::string& filename) -> bool { + if(_stagedMasses.find(filename) == _stagedMasses.cend()) { + _lastError = "The file " + filename + " couldn't be found in the list of staged M.A.S.S.es."; + return false; + } + + if(!Utility::Directory::rm(Utility::Directory::join(_stagingAreaDirectory, filename))) { + _lastError = "The file " + filename + " couldn't be deleted for unknown reasons."; + return false; + } + + return true; +} diff --git a/src/MassManager/MassManager.h b/src/MassManager/MassManager.h new file mode 100644 index 0000000..222ef07 --- /dev/null +++ b/src/MassManager/MassManager.h @@ -0,0 +1,64 @@ +#pragma once + +// MassBuilderSaveTool +// Copyright (C) 2021 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 "../Mass/Mass.h" + +using namespace Corrade; + +class MassManager { + public: + MassManager(const std::string& save_path, const std::string& steam_id, bool demo); + + auto saveDirectory() -> std::string const&; + auto stagingAreaDirectory() -> std::string const&; + + auto lastError() -> std::string const&; + + auto massName(int hangar) -> std::string const&; + auto massState(int hangar) -> MassState; + + void refreshHangar(int hangar); + + auto importMass(const std::string& staged_fn, int hangar) -> bool; + auto exportMass(int hangar) -> bool; + + auto moveMass(int source, int destination) -> bool; + auto deleteMass(int hangar) -> bool; + + auto stagedMasses() -> std::map const&; + void refreshStagedMasses(); + auto deleteStagedMass(const std::string& filename) -> bool; + + private: + std::string _saveDirectory; + std::string _steamId; + bool _demo; + + std::string _lastError = ""; + + Containers::Array _hangars; + + const std::string _stagingAreaDirectory; + + std::map _stagedMasses; +}; diff --git a/src/Profile/Locators.h b/src/Profile/Locators.h new file mode 100644 index 0000000..8fa63c0 --- /dev/null +++ b/src/Profile/Locators.h @@ -0,0 +1,87 @@ +#pragma once + +// MassBuilderSaveTool +// Copyright (C) 2021 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 . + +constexpr char company_name_locator[] = "CompanyName\0\x0c\0\0\0StrProperty"; +constexpr char active_slot_locator[] = "ActiveFrameSlot\0\x0c\0\0\0IntProperty"; +constexpr char credits_locator[] = "Credit\0\x0c\0\0\0IntProperty"; +constexpr char story_progress_locator[] = "StoryProgress\0\x0c\0\0\0IntProperty"; +constexpr char last_mission_id_locator[] = "LastMissionID\0\x0c\0\0\0IntProperty"; + +constexpr char verse_steel_locator[] = + "ID_4_AAE08F17428E229EC7A2209F51081A21\0\x0c\0\0\0IntProperty\0\x04\0\0\0\0\0\0\0\0\x00\x35\x0c\0,\0\0\0" + "Quantity_3_560F09B5485C365D3041888910019CE3\0\x0c\0\0\0IntProperty"; +constexpr char undinium_locator[] = + "ID_4_AAE08F17428E229EC7A2209F51081A21\0\x0c\0\0\0IntProperty\0\x04\0\0\0\0\0\0\0\0\x01\x35\x0c\0,\0\0\0" + "Quantity_3_560F09B5485C365D3041888910019CE3\0\x0c\0\0\0IntProperty"; +constexpr char necrium_alloy_locator[] = + "ID_4_AAE08F17428E229EC7A2209F51081A21\0\x0c\0\0\0IntProperty\0\x04\0\0\0\0\0\0\0\0\x02\x35\x0c\0,\0\0\0" + "Quantity_3_560F09B5485C365D3041888910019CE3\0\x0c\0\0\0IntProperty"; +constexpr char lunarite_locator[] = + "ID_4_AAE08F17428E229EC7A2209F51081A21\0\x0c\0\0\0IntProperty\0\x04\0\0\0\0\0\0\0\0\x03\x35\x0c\0,\0\0\0" + "Quantity_3_560F09B5485C365D3041888910019CE3\0\x0c\0\0\0IntProperty"; +constexpr char asterite_locator[] = + "ID_4_AAE08F17428E229EC7A2209F51081A21\0\x0c\0\0\0IntProperty\0\x04\0\0\0\0\0\0\0\0\x04\x35\x0c\0,\0\0\0" + "Quantity_3_560F09B5485C365D3041888910019CE3\0\x0c\0\0\0IntProperty"; + +constexpr char ednil_locator[] = + "ID_4_AAE08F17428E229EC7A2209F51081A21\0\x0c\0\0\0IntProperty\0\x04\0\0\0\0\0\0\0\0\x0a\x35\x0c\0,\0\0\0" + "Quantity_3_560F09B5485C365D3041888910019CE3\0\x0c\0\0\0IntProperty"; +constexpr char nuflalt_locator[] = + "ID_4_AAE08F17428E229EC7A2209F51081A21\0\x0c\0\0\0IntProperty\0\x04\0\0\0\0\0\0\0\0\x0b\x35\x0c\0,\0\0\0" + "Quantity_3_560F09B5485C365D3041888910019CE3\0\x0c\0\0\0IntProperty"; +constexpr char aurelene_locator[] = + "ID_4_AAE08F17428E229EC7A2209F51081A21\0\x0c\0\0\0IntProperty\0\x04\0\0\0\0\0\0\0\0\x0c\x35\x0c\0,\0\0\0" + "Quantity_3_560F09B5485C365D3041888910019CE3\0\x0c\0\0\0IntProperty"; +constexpr char soldus_locator[] = + "ID_4_AAE08F17428E229EC7A2209F51081A21\0\x0c\0\0\0IntProperty\0\x04\0\0\0\0\0\0\0\0\x0d\x35\x0c\0,\0\0\0" + "Quantity_3_560F09B5485C365D3041888910019CE3\0\x0c\0\0\0IntProperty"; +constexpr char synthesized_n_locator[] = + "ID_4_AAE08F17428E229EC7A2209F51081A21\0\x0c\0\0\0IntProperty\0\x04\0\0\0\0\0\0\0\0\x0e\x35\x0c\0,\0\0\0" + "Quantity_3_560F09B5485C365D3041888910019CE3\0\x0c\0\0\0IntProperty"; + +constexpr char alcarbonite_locator[] = + "ID_4_AAE08F17428E229EC7A2209F51081A21\0\x0c\0\0\0IntProperty\0\x04\0\0\0\0\0\0\0\0\x14\x35\x0c\0,\0\0\0" + "Quantity_3_560F09B5485C365D3041888910019CE3\0\x0c\0\0\0IntProperty"; +constexpr char keriphene_locator[] = + "ID_4_AAE08F17428E229EC7A2209F51081A21\0\x0c\0\0\0IntProperty\0\x04\0\0\0\0\0\0\0\0\x15\x35\x0c\0,\0\0\0" + "Quantity_3_560F09B5485C365D3041888910019CE3\0\x0c\0\0\0IntProperty"; +constexpr char nitinol_cm_locator[] = + "ID_4_AAE08F17428E229EC7A2209F51081A21\0\x0c\0\0\0IntProperty\0\x04\0\0\0\0\0\0\0\0\x16\x35\x0c\0,\0\0\0" + "Quantity_3_560F09B5485C365D3041888910019CE3\0\x0c\0\0\0IntProperty"; +constexpr char quarkium_locator[] = + "ID_4_AAE08F17428E229EC7A2209F51081A21\0\x0c\0\0\0IntProperty\0\x04\0\0\0\0\0\0\0\0\x17\x35\x0c\0,\0\0\0" + "Quantity_3_560F09B5485C365D3041888910019CE3\0\x0c\0\0\0IntProperty"; +constexpr char alterene_locator[] = + "ID_4_AAE08F17428E229EC7A2209F51081A21\0\x0c\0\0\0IntProperty\0\x04\0\0\0\0\0\0\0\0\x18\x35\x0c\0,\0\0\0" + "Quantity_3_560F09B5485C365D3041888910019CE3\0\x0c\0\0\0IntProperty"; + +constexpr char mixed_composition_locator[] = + "ID_4_AAE08F17428E229EC7A2209F51081A21\0\x0c\0\0\0IntProperty\0\x04\0\0\0\0\0\0\0\0\xa0\xbb\x0d\0,\0\0\0" + "Quantity_3_560F09B5485C365D3041888910019CE3\0\x0c\0\0\0IntProperty"; +constexpr char void_residue_locator[] = + "ID_4_AAE08F17428E229EC7A2209F51081A21\0\x0c\0\0\0IntProperty\0\x04\0\0\0\0\0\0\0\0\xa1\xbb\x0d\0,\0\0\0" + "Quantity_3_560F09B5485C365D3041888910019CE3\0\x0c\0\0\0IntProperty"; +constexpr char muscular_construction_locator[] = + "ID_4_AAE08F17428E229EC7A2209F51081A21\0\x0c\0\0\0IntProperty\0\x04\0\0\0\0\0\0\0\0\xa2\xbb\x0d\0,\0\0\0" + "Quantity_3_560F09B5485C365D3041888910019CE3\0\x0c\0\0\0IntProperty"; +constexpr char mineral_exoskeletology_locator[] = + "ID_4_AAE08F17428E229EC7A2209F51081A21\0\x0c\0\0\0IntProperty\0\x04\0\0\0\0\0\0\0\0\xa3\xbb\x0d\0,\0\0\0" + "Quantity_3_560F09B5485C365D3041888910019CE3\0\x0c\0\0\0IntProperty"; +constexpr char carbonized_skin_locator[] = + "ID_4_AAE08F17428E229EC7A2209F51081A21\0\x0c\0\0\0IntProperty\0\x04\0\0\0\0\0\0\0\0\xa4\xbb\x0d\0,\0\0\0" + "Quantity_3_560F09B5485C365D3041888910019CE3\0\x0c\0\0\0IntProperty"; diff --git a/src/Profile/Profile.cpp b/src/Profile/Profile.cpp new file mode 100644 index 0000000..7249b40 --- /dev/null +++ b/src/Profile/Profile.cpp @@ -0,0 +1,1003 @@ +// MassBuilderSaveTool +// Copyright (C) 2021 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 +#include + +#include "Profile.h" + +#include "Locators.h" + +using namespace Corrade; + +Profile::Profile(const std::string& path) { + auto map = Utility::Directory::mapRead(path); + + if(!map) { + _lastError = "Couldn't memory-map " + Utility::Directory::filename(path); + return; + } + + _profileDirectory = Utility::Directory::path(path); + _filename = Utility::Directory::filename(path); + + if(Utility::String::beginsWith(_filename, "Demo")) { + _type = ProfileType::Demo; + } + else { + _type = ProfileType::FullGame; + } + + _steamId = Utility::String::ltrim(Utility::String::rtrim(_filename, ".sav"), (_type == ProfileType::Demo ? "Demo" : "") + std::string{"Profile"}); + + auto it = std::search(map.begin(), map.end(), &company_name_locator[0], &company_name_locator[27]); + + if(it == map.end()) { + _lastError = "Couldn't find a company name in " + _filename; + return; + } + + _companyName = std::string{it + 41}; + + _valid = true; +} + +auto Profile::valid() const -> bool { + return _valid; +} + +auto Profile::lastError() const -> std::string const& { + return _lastError; +} + +auto Profile::filename() const -> std::string const& { + return _filename; +} + +auto Profile::type() const -> ProfileType { + return _type; +} + +auto Profile::steamId() const -> std::string const& { + return _steamId; +} + +void Profile::refreshValues() { + getCompanyName(); + getActiveFrameSlot(); + getCredits(); + getStoryProgress(); + getLastMissionId(); + + getVerseSteel(); + getUndinium(); + getNecriumAlloy(); + getLunarite(); + getAsterite(); + + getEdnil(); + getNuflalt(); + getAurelene(); + getSoldus(); + getSynthesizedN(); + + getAlcarbonite(); + getKeriphene(); + getNitinolCM(); + getQuarkium(); + getAlterene(); + + getMixedComposition(); + getVoidResidue(); + getMuscularConstruction(); + getMineralExoskeletology(); + getCarbonizedSkin(); +} + +auto Profile::companyName() const -> std::string const& { + return _companyName; +} + +auto Profile::getCompanyName() -> std::string const& { + auto mmap = Utility::Directory::mapRead(Utility::Directory::join(_profileDirectory, _filename)); + + auto it = std::search(mmap.begin(), mmap.end(), &company_name_locator[0], &company_name_locator[27]); + + if(it == mmap.end()) { + _lastError = "Couldn't find a company name in " + _filename; + _companyName = ""; + } + else { + _companyName = std::string{it + 41}; + } + + return _companyName; +} + +auto Profile::renameCompany(const std::string& new_name) -> bool { + char length_difference = static_cast(_companyName.length() - new_name.length()); + + std::string profile_data = Utility::Directory::readString(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(profile_data.begin(), profile_data.end(), &company_name_locator[0], &company_name_locator[27]); + + if(iter != profile_data.end()) { + + *(iter + 0x1C) = *(iter + 0x1C) - length_difference; + *(iter + 0x25) = *(iter + 0x25) - length_difference; + + while(*(iter + 0x29) != '\0') { + profile_data.erase(iter + 0x29); + } + + profile_data.insert(iter + 0x29, new_name.cbegin(), new_name.cend()); + + if(!Utility::Directory::writeString(Utility::Directory::join(_profileDirectory, _filename), profile_data)) { + _lastError = "The file" + _filename + " couldn't be written to."; + return false; + } + + _companyName = new_name; + + return true; + } + else { + _lastError = "Couldn't find the company name in " + _filename; + + return false; + } +} + +auto Profile::activeFrameSlot() const -> std::int8_t { + return _activeFrameSlot; +} + +auto Profile::getActiveFrameSlot() -> std::int8_t { + auto mmap = Utility::Directory::mapRead(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &active_slot_locator[0], &active_slot_locator[31]); + + if(iter == mmap.end()) { + if(std::search(mmap.begin(), mmap.end(), &credits_locator[0], &credits_locator[22]) != mmap.end()) { + _activeFrameSlot = 0; + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + _activeFrameSlot = -1; + } + } + else { + _activeFrameSlot = *(iter + 41); + } + + return _activeFrameSlot; +} + +auto Profile::credits() const -> std::int32_t { + return _credits; +} + +auto Profile::getCredits() -> std::int32_t { + auto mmap = Utility::Directory::mapRead(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &credits_locator[0], &credits_locator[22]); + + if(iter != mmap.end()) { + _credits = *reinterpret_cast(iter + 0x20); + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + _credits = -1; + } + + return _credits; +} + +auto Profile::setCredits(std::int32_t amount) -> bool { + auto mmap = Utility::Directory::map(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &credits_locator[0], &credits_locator[22]); + + if(iter != mmap.end()) { + *reinterpret_cast(iter + 0x20) = amount; + _credits = amount; + return true; + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + return false; + } +} + +auto Profile::storyProgress() const -> std::int32_t { + return _storyProgress; +} + +auto Profile::getStoryProgress() -> std::int32_t { + auto mmap = Utility::Directory::mapRead(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &story_progress_locator[0], &story_progress_locator[29]); + + if(iter != mmap.end()) { + _storyProgress = *reinterpret_cast(iter + 0x27); + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + _storyProgress = -1; + } + + return _storyProgress; +} + +auto Profile::setStoryProgress(std::int32_t progress) -> bool { + auto mmap = Utility::Directory::map(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &story_progress_locator[0], &story_progress_locator[29]); + + if(iter != mmap.end()) { + *reinterpret_cast(iter + 0x27) = progress; + _storyProgress = progress; + return true; + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + return false; + } +} + +auto Profile::lastMissionId() const -> std::int32_t { + return _lastMissionId; +} + +auto Profile::getLastMissionId() -> std::int32_t { + auto mmap = Utility::Directory::mapRead(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &last_mission_id_locator[0], &last_mission_id_locator[29]); + + if(iter != mmap.end()) { + _lastMissionId = *reinterpret_cast(iter + 0x27); + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + _lastMissionId = -1; + } + + return _lastMissionId; +} + +auto Profile::verseSteel() const -> std::int32_t { + return _verseSteel; +} + +auto Profile::getVerseSteel() -> std::int32_t { + auto mmap = Utility::Directory::mapRead(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &verse_steel_locator[0], &verse_steel_locator[129]); + + if(iter != mmap.end()) { + _verseSteel = *reinterpret_cast(iter + 0x8C); + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + _verseSteel = -1; + } + + return _verseSteel; +} + +auto Profile::setVerseSteel(std::int32_t amount) -> bool { + auto mmap = Utility::Directory::map(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &verse_steel_locator[0], &verse_steel_locator[129]); + + if(iter != mmap.end()) { + *reinterpret_cast(iter + 0x8C) = amount; + _verseSteel = amount; + return true; + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + return false; + } +} + +auto Profile::undinium() const -> std::int32_t { + return _undinium; +} + +auto Profile::getUndinium() -> std::int32_t { + auto mmap = Utility::Directory::mapRead(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &undinium_locator[0], &undinium_locator[129]); + + if(iter != mmap.end()) { + _undinium = *reinterpret_cast(iter + 0x8C); + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + _undinium = -1; + } + + return _undinium; +} + +auto Profile::setUndinium(std::int32_t amount) -> bool { + auto mmap = Utility::Directory::map(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &undinium_locator[0], &undinium_locator[129]); + + if(iter != mmap.end()) { + *reinterpret_cast(iter + 0x8C) = amount; + _undinium = amount; + return true; + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + return false; + } +} + +auto Profile::necriumAlloy() const -> std::int32_t { + return _necriumAlloy; +} + +auto Profile::getNecriumAlloy() -> std::int32_t { + auto mmap = Utility::Directory::mapRead(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &necrium_alloy_locator[0], &necrium_alloy_locator[129]); + + if(iter != mmap.end()) { + _necriumAlloy = *reinterpret_cast(iter + 0x8C); + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + _necriumAlloy = -1; + } + + return _necriumAlloy; +} + +auto Profile::setNecriumAlloy(std::int32_t amount) -> bool { + auto mmap = Utility::Directory::map(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &necrium_alloy_locator[0], &necrium_alloy_locator[129]); + + if(iter != mmap.end()) { + *reinterpret_cast(iter + 0x8C) = amount; + _necriumAlloy = amount; + return true; + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + return false; + } +} + +auto Profile::lunarite() const -> std::int32_t { + return _lunarite; +} + +auto Profile::getLunarite() -> std::int32_t { + auto mmap = Utility::Directory::mapRead(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &lunarite_locator[0], &lunarite_locator[129]); + + if(iter != mmap.end()) { + _lunarite = *reinterpret_cast(iter + 0x8C); + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + _lunarite = -1; + } + + return _lunarite; +} + +auto Profile::setLunarite(std::int32_t amount) -> bool { + auto mmap = Utility::Directory::map(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &lunarite_locator[0], &lunarite_locator[129]); + + if(iter != mmap.end()) { + *reinterpret_cast(iter + 0x8C) = amount; + _lunarite = amount; + return true; + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + return false; + } +} + +auto Profile::asterite() const -> std::int32_t { + return _asterite; +} + +auto Profile::getAsterite() -> std::int32_t { + auto mmap = Utility::Directory::mapRead(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &asterite_locator[0], &asterite_locator[129]); + + if(iter != mmap.end()) { + _asterite = *reinterpret_cast(iter + 0x8C); + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + _asterite = -1; + } + + return _asterite; +} + +auto Profile::setAsterite(std::int32_t amount) -> bool { + auto mmap = Utility::Directory::map(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &asterite_locator[0], &asterite_locator[129]); + + if(iter != mmap.end()) { + *reinterpret_cast(iter + 0x8C) = amount; + _asterite = amount; + return true; + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + return false; + } +} + +auto Profile::ednil() const -> std::int32_t { + return _ednil; +} + +auto Profile::getEdnil() -> std::int32_t { + auto mmap = Utility::Directory::mapRead(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &ednil_locator[0], &ednil_locator[129]); + + if(iter != mmap.end()) { + _ednil = *reinterpret_cast(iter + 0x8C); + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + _ednil = -1; + } + + return _ednil; +} + +auto Profile::setEdnil(std::int32_t amount) -> bool { + auto mmap = Utility::Directory::map(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &ednil_locator[0], &ednil_locator[129]); + + if(iter != mmap.end()) { + *reinterpret_cast(iter + 0x8C) = amount; + _ednil = amount; + return true; + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + return false; + } +} + +auto Profile::nuflalt() const -> std::int32_t { + return _nuflalt; +} + +auto Profile::getNuflalt() -> std::int32_t { + auto mmap = Utility::Directory::mapRead(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &nuflalt_locator[0], &nuflalt_locator[129]); + + if(iter != mmap.end()) { + _nuflalt = *reinterpret_cast(iter + 0x8C); + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + _nuflalt = -1; + } + + return _nuflalt; +} + +auto Profile::setNuflalt(std::int32_t amount) -> bool { + auto mmap = Utility::Directory::map(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &nuflalt_locator[0], &nuflalt_locator[129]); + + if(iter != mmap.end()) { + *reinterpret_cast(iter + 0x8C) = amount; + _nuflalt = amount; + return true; + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + return false; + } +} + +auto Profile::aurelene() const -> std::int32_t { + return _aurelene; +} + +auto Profile::getAurelene() -> std::int32_t { + auto mmap = Utility::Directory::mapRead(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &aurelene_locator[0], &aurelene_locator[129]); + + if(iter != mmap.end()) { + _aurelene = *reinterpret_cast(iter + 0x8C); + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + _aurelene = -1; + } + + return _aurelene; +} + +auto Profile::setAurelene(std::int32_t amount) -> bool { + auto mmap = Utility::Directory::map(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &aurelene_locator[0], &aurelene_locator[129]); + + if(iter != mmap.end()) { + *reinterpret_cast(iter + 0x8C) = amount; + _aurelene = amount; + return true; + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + return false; + } +} + +auto Profile::soldus() const -> std::int32_t { + return _soldus; +} + +auto Profile::getSoldus() -> std::int32_t { + auto mmap = Utility::Directory::mapRead(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &soldus_locator[0], &soldus_locator[129]); + + if(iter != mmap.end()) { + _soldus = *reinterpret_cast(iter + 0x8C); + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + _soldus = -1; + } + + return _soldus; +} + +auto Profile::setSoldus(std::int32_t amount) -> bool { + auto mmap = Utility::Directory::map(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &soldus_locator[0], &soldus_locator[129]); + + if(iter != mmap.end()) { + *reinterpret_cast(iter + 0x8C) = amount; + _soldus = amount; + return true; + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + return false; + } +} + +auto Profile::synthesizedN() const -> std::int32_t { + return _synthesizedN; +} + +auto Profile::getSynthesizedN() -> std::int32_t { + auto mmap = Utility::Directory::mapRead(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &synthesized_n_locator[0], &synthesized_n_locator[129]); + + if(iter != mmap.end()) { + _synthesizedN = *reinterpret_cast(iter + 0x8C); + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + _synthesizedN = -1; + } + + return _synthesizedN; +} + +auto Profile::setSynthesizedN(std::int32_t amount) -> bool { + auto mmap = Utility::Directory::map(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &synthesized_n_locator[0], &synthesized_n_locator[129]); + + if(iter != mmap.end()) { + *reinterpret_cast(iter + 0x8C) = amount; + _synthesizedN = amount; + return true; + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + return false; + } +} + +auto Profile::alcarbonite() const -> std::int32_t { + return _alcarbonite; +} + +auto Profile::getAlcarbonite() -> std::int32_t { + auto mmap = Utility::Directory::mapRead(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &alcarbonite_locator[0], &alcarbonite_locator[129]); + + if(iter != mmap.end()) { + _alcarbonite = *reinterpret_cast(iter + 0x8C); + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + _alcarbonite = -1; + } + + return _alcarbonite; +} + +auto Profile::setAlcarbonite(std::int32_t amount) -> bool { + auto mmap = Utility::Directory::map(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &alcarbonite_locator[0], &alcarbonite_locator[129]); + + if(iter != mmap.end()) { + *reinterpret_cast(iter + 0x8C) = amount; + _alcarbonite = amount; + return true; + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + return false; + } +} + +auto Profile::keriphene() const -> std::int32_t { + return _keriphene; +} + +auto Profile::getKeriphene() -> std::int32_t { + auto mmap = Utility::Directory::mapRead(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &keriphene_locator[0], &keriphene_locator[129]); + + if(iter != mmap.end()) { + _keriphene = *reinterpret_cast(iter + 0x8C); + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + _keriphene= -1; + } + + return _keriphene; +} + +auto Profile::setKeriphene(std::int32_t amount) -> bool { + auto mmap = Utility::Directory::map(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &keriphene_locator[0], &keriphene_locator[129]); + + if(iter != mmap.end()) { + *reinterpret_cast(iter + 0x8C) = amount; + _keriphene = amount; + return true; + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + return false; + } +} + +auto Profile::nitinolCM() const -> std::int32_t { + return _nitinolCM; +} + +auto Profile::getNitinolCM() -> std::int32_t { + auto mmap = Utility::Directory::mapRead(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &nitinol_cm_locator[0], &nitinol_cm_locator[129]); + + if(iter != mmap.end()) { + _nitinolCM = *reinterpret_cast(iter + 0x8C); + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + _nitinolCM = -1; + } + + return _nitinolCM; +} + +auto Profile::setNitinolCM(std::int32_t amount) -> bool { + auto mmap = Utility::Directory::map(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &nitinol_cm_locator[0], &nitinol_cm_locator[129]); + + if(iter != mmap.end()) { + *reinterpret_cast(iter + 0x8C) = amount; + _nitinolCM = amount; + return true; + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + return false; + } +} + +auto Profile::quarkium() const -> std::int32_t { + return _quarkium; +} + +auto Profile::getQuarkium() -> std::int32_t { + auto mmap = Utility::Directory::mapRead(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &quarkium_locator[0], &quarkium_locator[129]); + + if(iter != mmap.end()) { + _quarkium = *reinterpret_cast(iter + 0x8C); + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + _quarkium = -1; + } + + return _quarkium; +} + +auto Profile::setQuarkium(std::int32_t amount) -> bool { + auto mmap = Utility::Directory::map(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &quarkium_locator[0], &quarkium_locator[129]); + + if(iter != mmap.end()) { + *reinterpret_cast(iter + 0x8C) = amount; + _quarkium = amount; + return true; + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + return false; + } +} + +auto Profile::alterene() const -> std::int32_t { + return _alterene; +} + +auto Profile::getAlterene() -> std::int32_t { + auto mmap = Utility::Directory::mapRead(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &alterene_locator[0], &alterene_locator[129]); + + if(iter != mmap.end()) { + _alterene = *reinterpret_cast(iter + 0x8C); + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + _alterene = -1; + } + + return _alterene; +} + +auto Profile::setAlterene(std::int32_t amount) -> bool { + auto mmap = Utility::Directory::map(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &alterene_locator[0], &alterene_locator[129]); + + if(iter != mmap.end()) { + *reinterpret_cast(iter + 0x8C) = amount; + _alterene = amount; + return true; + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + return false; + } +} + +auto Profile::mixedComposition() const -> std::int32_t { + return _mixedComposition; +} + +auto Profile::getMixedComposition() -> std::int32_t { + auto mmap = Utility::Directory::mapRead(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &mixed_composition_locator[0], &mixed_composition_locator[129]); + + if(iter != mmap.end()) { + _mixedComposition = *reinterpret_cast(iter + 0x8C); + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + _mixedComposition = -1; + } + + return _mixedComposition; +} + +auto Profile::setMixedComposition(std::int32_t amount) -> bool { + auto mmap = Utility::Directory::map(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &mixed_composition_locator[0], &mixed_composition_locator[129]); + + if(iter != mmap.end()) { + *reinterpret_cast(iter + 0x8C) = amount; + _mixedComposition = amount; + return true; + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + return false; + } +} + +auto Profile::voidResidue() const -> std::int32_t { + return _voidResidue; +} + +auto Profile::getVoidResidue() -> std::int32_t { + auto mmap = Utility::Directory::mapRead(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &void_residue_locator[0], &void_residue_locator[129]); + + if(iter != mmap.end()) { + _voidResidue = *reinterpret_cast(iter + 0x8C); + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + _voidResidue = -1; + } + + return _voidResidue; +} + +auto Profile::setVoidResidue(std::int32_t amount) -> bool { + auto mmap = Utility::Directory::map(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &void_residue_locator[0], &void_residue_locator[129]); + + if(iter != mmap.end()) { + *reinterpret_cast(iter + 0x8C) = amount; + _voidResidue = amount; + return true; + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + return false; + } +} + +auto Profile::muscularConstruction() const -> std::int32_t { + return _muscularConstruction; +} + +auto Profile::getMuscularConstruction() -> std::int32_t { + auto mmap = Utility::Directory::mapRead(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &muscular_construction_locator[0], &muscular_construction_locator[129]); + + if(iter != mmap.end()) { + _muscularConstruction = *reinterpret_cast(iter + 0x8C); + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + _muscularConstruction = -1; + } + + return _muscularConstruction; +} + +auto Profile::setMuscularConstruction(std::int32_t amount) -> bool { + auto mmap = Utility::Directory::map(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &muscular_construction_locator[0], &muscular_construction_locator[129]); + + if(iter != mmap.end()) { + *reinterpret_cast(iter + 0x8C) = amount; + _muscularConstruction = amount; + return true; + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + return false; + } +} + +auto Profile::mineralExoskeletology() const -> std::int32_t { + return _mineralExoskeletology; +} + +auto Profile::getMineralExoskeletology() -> std::int32_t { + auto mmap = Utility::Directory::mapRead(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &mineral_exoskeletology_locator[0], &mineral_exoskeletology_locator[129]); + + if(iter != mmap.end()) { + _mineralExoskeletology = *reinterpret_cast(iter + 0x8C); + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + _mineralExoskeletology = -1; + } + + return _mineralExoskeletology; +} + +auto Profile::setMineralExoskeletology(std::int32_t amount) -> bool { + auto mmap = Utility::Directory::map(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &mineral_exoskeletology_locator[0], &mineral_exoskeletology_locator[129]); + + if(iter != mmap.end()) { + *reinterpret_cast(iter + 0x8C) = amount; + _mineralExoskeletology = amount; + return true; + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + return false; + } +} + +auto Profile::carbonizedSkin() const -> std::int32_t { + return _carbonizedSkin; +} + +auto Profile::getCarbonizedSkin() -> std::int32_t { + auto mmap = Utility::Directory::mapRead(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &carbonized_skin_locator[0], &carbonized_skin_locator[129]); + + if(iter != mmap.end()) { + _carbonizedSkin = *reinterpret_cast(iter + 0x8C); + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + _carbonizedSkin = -1; + } + + return _carbonizedSkin; +} + +auto Profile::setCarbonizedSkin(std::int32_t amount) -> bool { + auto mmap = Utility::Directory::map(Utility::Directory::join(_profileDirectory, _filename)); + + auto iter = std::search(mmap.begin(), mmap.end(), &carbonized_skin_locator[0], &carbonized_skin_locator[129]); + + if(iter != mmap.end()) { + *reinterpret_cast(iter + 0x8C) = amount; + _carbonizedSkin = amount; + return true; + } + else { + _lastError = "The profile save seems to be corrupted or the game didn't release the handle on the file."; + return false; + } +} diff --git a/src/Profile/Profile.h b/src/Profile/Profile.h new file mode 100644 index 0000000..21f6c62 --- /dev/null +++ b/src/Profile/Profile.h @@ -0,0 +1,184 @@ +#pragma once + +// MassBuilderSaveTool +// Copyright (C) 2021 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 + +enum class ProfileType : std::uint8_t { + Demo, + FullGame +}; + +class Profile { + public: + explicit Profile(const std::string& path); + + auto valid() const -> bool; + + auto lastError() const -> std::string const&; + + auto filename() const -> std::string const&; + + auto type() const -> ProfileType; + + auto steamId() const -> std::string const&; + + void refreshValues(); + + auto companyName() const -> std::string const&; + auto getCompanyName() -> std::string const&; + auto renameCompany(const std::string& new_name) -> bool; + + auto activeFrameSlot() const -> std::int8_t; + auto getActiveFrameSlot() -> std::int8_t; + + auto credits() const -> std::int32_t; + auto getCredits() -> std::int32_t; + auto setCredits(std::int32_t) -> bool; + + auto storyProgress() const -> std::int32_t; + auto getStoryProgress() -> std::int32_t; + auto setStoryProgress(std::int32_t progress) -> bool; + + auto lastMissionId() const -> std::int32_t; + auto getLastMissionId() -> std::int32_t; + + auto verseSteel() const -> std::int32_t; + auto getVerseSteel() -> std::int32_t; + auto setVerseSteel(std::int32_t amount) -> bool; + + auto undinium() const -> std::int32_t; + auto getUndinium() -> std::int32_t; + auto setUndinium(std::int32_t amount) -> bool; + + auto necriumAlloy() const -> std::int32_t; + auto getNecriumAlloy() -> std::int32_t; + auto setNecriumAlloy(std::int32_t amount) -> bool; + + auto lunarite() const -> std::int32_t; + auto getLunarite() -> std::int32_t; + auto setLunarite(std::int32_t amount) -> bool; + + auto asterite() const -> std::int32_t; + auto getAsterite() -> std::int32_t; + auto setAsterite(std::int32_t amount) -> bool; + + auto ednil() const -> std::int32_t; + auto getEdnil() -> std::int32_t; + auto setEdnil(std::int32_t amount) -> bool; + + auto nuflalt() const -> std::int32_t; + auto getNuflalt() -> std::int32_t; + auto setNuflalt(std::int32_t amount) -> bool; + + auto aurelene() const -> std::int32_t; + auto getAurelene() -> std::int32_t; + auto setAurelene(std::int32_t amount) -> bool; + + auto soldus() const -> std::int32_t; + auto getSoldus() -> std::int32_t; + auto setSoldus(std::int32_t amount) -> bool; + + auto synthesizedN() const -> std::int32_t; + auto getSynthesizedN() -> std::int32_t; + auto setSynthesizedN(std::int32_t amount) -> bool; + + auto alcarbonite() const -> std::int32_t; + auto getAlcarbonite() -> std::int32_t; + auto setAlcarbonite(std::int32_t amount) -> bool; + + auto keriphene() const -> std::int32_t; + auto getKeriphene() -> std::int32_t; + auto setKeriphene(std::int32_t amount) -> bool; + + auto nitinolCM() const -> std::int32_t; + auto getNitinolCM() -> std::int32_t; + auto setNitinolCM(std::int32_t amount) -> bool; + + auto quarkium() const -> std::int32_t; + auto getQuarkium() -> std::int32_t; + auto setQuarkium(std::int32_t amount) -> bool; + + auto alterene() const -> std::int32_t; + auto getAlterene() -> std::int32_t; + auto setAlterene(std::int32_t amount) -> bool; + + auto mixedComposition() const -> std::int32_t; + auto getMixedComposition() -> std::int32_t; + auto setMixedComposition(std::int32_t amount) -> bool; + + auto voidResidue() const -> std::int32_t; + auto getVoidResidue() -> std::int32_t; + auto setVoidResidue(std::int32_t amount) -> bool; + + auto muscularConstruction() const -> std::int32_t; + auto getMuscularConstruction() -> std::int32_t; + auto setMuscularConstruction(std::int32_t amount) -> bool; + + auto mineralExoskeletology() const -> std::int32_t; + auto getMineralExoskeletology() -> std::int32_t; + auto setMineralExoskeletology(std::int32_t amount) -> bool; + + auto carbonizedSkin() const -> std::int32_t; + auto getCarbonizedSkin() -> std::int32_t; + auto setCarbonizedSkin(std::int32_t amount) -> bool; + + private: + std::string _profileDirectory; + std::string _filename; + + ProfileType _type; + + std::string _steamId; + + bool _valid = false; + std::string _lastError = ""; + + std::string _companyName; + + std::int8_t _activeFrameSlot = 0; + + std::int32_t _credits; + + std::int32_t _storyProgress; + + std::int32_t _lastMissionId; + + std::int32_t _verseSteel; + std::int32_t _undinium; + std::int32_t _necriumAlloy; + std::int32_t _lunarite; + std::int32_t _asterite; + std::int32_t _ednil; + std::int32_t _nuflalt; + std::int32_t _aurelene; + std::int32_t _soldus; + std::int32_t _synthesizedN; + std::int32_t _alcarbonite; + std::int32_t _keriphene; + std::int32_t _nitinolCM; + std::int32_t _quarkium; + std::int32_t _alterene; + + std::int32_t _mixedComposition; + std::int32_t _voidResidue; + std::int32_t _muscularConstruction; + std::int32_t _mineralExoskeletology; + std::int32_t _carbonizedSkin; +}; diff --git a/src/ProfileManager/ProfileManager.cpp b/src/ProfileManager/ProfileManager.cpp new file mode 100644 index 0000000..9305684 --- /dev/null +++ b/src/ProfileManager/ProfileManager.cpp @@ -0,0 +1,349 @@ +// MassBuilderSaveTool +// Copyright (C) 2021 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 +#include + +#include +#include +#include +#include +#include + +#include + +#include "ProfileManager.h" + +using namespace Corrade; + +ProfileManager::ProfileManager(const std::string& base_path): + _backupsDirectory{Utility::Directory::join(Utility::Directory::path(Utility::Directory::executableLocation()), "backups")} +{ + _saveDirectory = Utility::Directory::join(base_path, "Saved/SaveGames"); + + if(!Utility::Directory::exists(_backupsDirectory)) { + Utility::Directory::mkpath(_backupsDirectory); + } + + if(!Utility::Directory::exists(_saveDirectory)) { + _lastError = "Couldn't find the profile directory. Make sure you played enough of the game."; + return; + } + + _ready = refreshProfiles(); +} + +auto ProfileManager::ready() const -> bool { + return _ready; +} + +auto ProfileManager::lastError() -> std::string const& { + return _lastError; +} + +auto ProfileManager::saveDirectory() -> std::string const& { + return _saveDirectory; +} + +auto ProfileManager::backupsDirectory() -> std::string const& { + return _backupsDirectory; +} + +auto ProfileManager::profiles() -> std::vector const& { + return _profiles; +} + +auto ProfileManager::refreshProfiles() -> bool { + _profiles.clear(); + + using Utility::Directory::Flag; + std::vector files = Utility::Directory::list(_saveDirectory, Flag::SkipSpecial|Flag::SkipDirectories|Flag::SkipDotAndDotDot); + + auto predicate = [](const std::string& file)->bool{ + std::regex regex("(Demo)?Profile[0-9]{17}\\.sav", std::regex::nosubs); + std::cmatch m; + return !std::regex_match(file.c_str(), m, regex); + }; + + files.erase(std::remove_if(files.begin(), files.end(), predicate), files.end()); + + for(const std::string& file : files) { + Profile profile{Utility::Directory::join(_saveDirectory, file)}; + + if(!profile.valid()) { + Utility::Warning{} << "Profile" << file.c_str() << "is invalid:" << profile.lastError().c_str(); + continue; + } + + _profiles.push_back(std::move(profile)); + } + + if(_profiles.empty()) { + _lastError = "No profiles were found."; + return false; + } + + return true; +} + +auto ProfileManager::getProfile(std::size_t index) -> Profile* { + return &(_profiles.at(index)); +} + +auto ProfileManager::deleteProfile(std::size_t index, bool delete_builds) -> bool { + if(!Utility::Directory::rm(Utility::Directory::join(_saveDirectory, _profiles.at(index).filename()))) { + _lastError = Utility::formatString("Couldn't delete {} (filename: {}).", + _profiles.at(index).companyName(), + _profiles.at(index).filename()); + refreshProfiles(); + return false; + } + + if(delete_builds) { + for(std::uint8_t i = 0; i < 32; ++i) { + std::string filename = Utility::formatString("{}Unit{:.2d}{}.sav", + _profiles.at(index).type() == ProfileType::Demo ? "Demo": "", + i, _profiles.at(index).steamId()); + Utility::Directory::rm(Utility::Directory::join(_saveDirectory, filename)); + } + } + + _profiles.erase(_profiles.cbegin() + index); + + return true; +} + +auto ProfileManager::backupProfile(std::size_t index, bool backup_builds) -> bool { + std::time_t timestamp = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()); + std::tm* time = std::localtime(×tamp); + + std::string filename = Utility::formatString("{}_{}{:.2d}{:.2d}_{:.2d}{:.2d}{:.2d}.mbprofbackup", + Utility::String::replaceAll(_profiles.at(index).companyName(), " ", "_"), + time->tm_year + 1900, time->tm_mon + 1, time->tm_mday, + time->tm_hour, time->tm_min, time->tm_sec); + + int error_code = 0; + zip_error_t error; + zip_t* zip = zip_open(Utility::Directory::join(_backupsDirectory, filename).c_str(), ZIP_CREATE|ZIP_TRUNCATE, &error_code); + if(zip == nullptr) { + zip_error_init_with_code(&error, error_code); + _lastError = zip_error_strerror(&error); + return false; + } + + zip_source_t* profile_source = zip_source_file(zip, Utility::Directory::toNativeSeparators(Utility::Directory::join(_saveDirectory, _profiles.at(index).filename())).c_str(), 0, 0); + if(profile_source == nullptr) { + _lastError = zip_strerror(zip); + zip_source_free(profile_source); + return false; + } + + if(zip_file_add(zip, _profiles.at(index).filename().c_str(), profile_source, ZIP_FL_ENC_UTF_8) == -1) { + _lastError = zip_strerror(zip); + zip_source_free(profile_source); + return false; + } + + std::string comment = Utility::String::join({_profiles.at(index).companyName(), + _profiles.at(index).type() == ProfileType::Demo ? "demo" : "full", + Utility::formatString("{}-{:.2d}-{:.2d}-{:.2d}-{:.2d}-{:.2d}", + time->tm_year + 1900, time->tm_mon + 1, time->tm_mday, + time->tm_hour, time->tm_min, time->tm_sec) + }, '|'); + zip_set_archive_comment(zip, comment.c_str(), comment.length()); + + if(backup_builds) { + for(std::uint8_t i = 0; i < 32; ++i) { + std::string build_filename = Utility::formatString("{}Unit{:.2d}{}.sav", + _profiles.at(index).type() == ProfileType::Demo ? "Demo": "", + i, _profiles.at(index).steamId()); + + if(!Utility::Directory::exists(Utility::Directory::join(_saveDirectory, build_filename))) { + continue; + } + + zip_source_t* build_source = zip_source_file(zip, Utility::Directory::toNativeSeparators(Utility::Directory::join(_saveDirectory, build_filename)).c_str(), 0, 0); + if(build_source == nullptr) { + zip_source_free(build_source); + continue; + } + + if(zip_file_add(zip, build_filename.c_str(), build_source, ZIP_FL_ENC_UTF_8) == -1) { + zip_source_free(build_source); + continue; + } + } + } + + if(zip_close(zip) == -1) { + _lastError = zip_strerror(zip); + return false; + } + + refreshBackups(); + + return true; +} + +auto ProfileManager::backups() -> std::vector const& { + return _backups; +} + +void ProfileManager::refreshBackups() { + _backups.clear(); + + using Utility::Directory::Flag; + std::vector files = Utility::Directory::list(_backupsDirectory, Flag::SkipSpecial|Flag::SkipDirectories|Flag::SkipDotAndDotDot); + + auto predicate = [](const std::string& file)->bool{ + return !Utility::String::endsWith(file, ".mbprofbackup"); + }; + + files.erase(std::remove_if(files.begin(), files.end(), predicate), files.end()); + + int error_code = 0; + zip_t* zip = nullptr; + for(const std::string& file : files) { + Backup backup; + backup.filename = file; + + zip = zip_open(Utility::Directory::join(_backupsDirectory, file).c_str(), ZIP_RDONLY, &error_code); + if(zip == nullptr) { + continue; + } + + Containers::ScopeGuard guard{zip, zip_close}; + + int comment_length; + const char* comment = zip_get_archive_comment(zip, &comment_length, ZIP_FL_UNCHANGED); + if(comment == nullptr) { + continue; + } + + auto info = Utility::String::split(comment, '|'); + + if(info.size() != 3) { + continue; + } + + backup.company = info.at(0); + + if(info.at(1) == "full") { + backup.type = ProfileType::FullGame; + } + else if(info.at(1) == "demo") { + backup.type = ProfileType::Demo; + } + else { + continue; + } + + auto ts = Utility::String::split(info.at(2), '-'); + if(ts.size() != 6) { + continue; + } + + backup.timestamp.year = std::stoi(ts.at(0)); + backup.timestamp.month = std::stoi(ts.at(1)); + backup.timestamp.day = std::stoi(ts.at(2)); + backup.timestamp.hour = std::stoi(ts.at(3)); + backup.timestamp.minute = std::stoi(ts.at(4)); + backup.timestamp.second = std::stoi(ts.at(5)); + + std::int64_t num_entries = zip_get_num_entries(zip, ZIP_FL_UNCHANGED); + + if(num_entries == 0) { + continue; + } + + backup.includedFiles.reserve(num_entries); + + for(std::int64_t i = 0; i < num_entries; i++) { + backup.includedFiles.emplace_back(zip_get_name(zip, i, ZIP_FL_UNCHANGED)); + } + + _backups.push_back(std::move(backup)); + } +} + +auto ProfileManager::deleteBackup(std::size_t index) -> bool { + if(!Utility::Directory::rm(Utility::Directory::join(_backupsDirectory, _backups.at(index).filename))) { + _lastError = "Couldn't delete " + _backups.at(index).filename; + return false; + } + + _backups.erase(_backups.begin() + index); + + return true; +} + +auto ProfileManager::restoreBackup(std::size_t index) -> bool { + const Backup& backup = _backups.at(index); + + static const char* error_format = "Extraction of file {} failed: {}"; + + int error_code = 0; + zip_t* zip = nullptr; + + zip = zip_open(Utility::Directory::join(_backupsDirectory, backup.filename).c_str(), ZIP_RDONLY, &error_code); + if(zip == nullptr) { + zip_error_t error; + zip_error_init_with_code(&error, error_code); + _lastError = zip_error_strerror(&error); + return false; + } + + Containers::ScopeGuard zip_guard{zip, zip_close}; + + for(const std::string& file : backup.includedFiles) { + FILE* out = std::fopen(Utility::Directory::join(_saveDirectory, file).c_str(), "wb"); + if(out == nullptr) { + _lastError = Utility::formatString(error_format, file, std::strerror(errno)); + return false; + } + + Containers::ScopeGuard out_guard{out, std::fclose}; + + zip_file_t* zf = zip_fopen(zip, file.c_str(), ZIP_FL_ENC_GUESS); + if(zf == nullptr) { + _lastError = Utility::formatString(error_format, file, zip_strerror(zip)); + return false; + } + + Containers::ScopeGuard zf_guard{zf, zip_fclose}; + + Containers::StaticArray<8192, char> buf{ValueInit}; + + std::int64_t bytes_read = 0; + while((bytes_read = zip_fread(zf, buf.data(), buf.size())) > 0) { + if(std::fwrite(buf.data(), sizeof(char), bytes_read, out) < static_cast(bytes_read)) { + _lastError = Utility::formatString(error_format, file, "not enough bytes written."); + return false; + } + } + + if(bytes_read == -1) { + _lastError = Utility::formatString(error_format, file, "couldn't read bytes from archive."); + return false; + } + } + + return true; +} diff --git a/src/ProfileManager/ProfileManager.h b/src/ProfileManager/ProfileManager.h new file mode 100644 index 0000000..7e2f21d --- /dev/null +++ b/src/ProfileManager/ProfileManager.h @@ -0,0 +1,71 @@ +#pragma once + +// MassBuilderSaveTool +// Copyright (C) 2021 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 "../Profile/Profile.h" + +struct Backup { + std::string filename; + std::string company; + ProfileType type; + struct { + int year; + int month; + int day; + int hour; + int minute; + int second; + } timestamp; + std::vector includedFiles; +}; + +class ProfileManager { + public: + ProfileManager(const std::string& base_path); + + auto ready() const -> bool; + auto lastError() -> std::string const&; + + auto saveDirectory() -> std::string const&; + auto backupsDirectory() -> std::string const&; + + auto profiles() -> std::vector const&; + auto refreshProfiles() -> bool; + + auto getProfile(std::size_t index) -> Profile*; + auto deleteProfile(std::size_t index, bool delete_builds) -> bool; + auto backupProfile(std::size_t index, bool backup_builds) -> bool; + + auto backups() -> std::vector const&; + void refreshBackups(); + + auto deleteBackup(std::size_t index) -> bool; + auto restoreBackup(std::size_t index) -> bool; + + private: + bool _ready = false; + std::string _lastError = ""; + + std::string _saveDirectory; + const std::string _backupsDirectory; + + std::vector _profiles; + std::vector _backups; +}; diff --git a/src/SaveTool/SaveTool.cpp b/src/SaveTool/SaveTool.cpp new file mode 100644 index 0000000..9bc42e7 --- /dev/null +++ b/src/SaveTool/SaveTool.cpp @@ -0,0 +1,506 @@ +// MassBuilderSaveTool +// Copyright (C) 2021 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 "SaveTool.h" + +#include +#include + +#include +#include +#include + +#include +#include + +#include +#include + +#include +#include +#include +#include + +#include "../FontAwesome/IconsFontAwesome5.h" +#include "../FontAwesome/IconsFontAwesome5Brands.h" + +extern const ImVec2 center_pivot = {0.5f, 0.5f}; + +#ifdef MANAGER_DEBUG_BUILD +#include + +#define _tw CORRADE_TWEAKABLE +Utility::Tweakable tweak; +#endif + +SaveTool::SaveTool(const Arguments& arguments): + Platform::Sdl2Application{arguments, + Configuration{}.setTitle("M.A.S.S. Builder Save Tool version rewrite-0.0.1") + .setSize({960, 720})} +{ +#ifdef MANAGER_DEBUG_BUILD + tweak.enable("", "../../"); +#endif + + if(SDL_VERSION_ATLEAST(2, 0, 5)) { + if(SDL_SetHint(SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH, "1") == SDL_TRUE) { + Utility::Debug{} << "Clickthrough is available."; + } + else { + Utility::Debug{} << "Clickthrough is not available (hint couldn't be set)."; + } + } + else { + Utility::Debug{} << "Clickthrough is not available (SDL2 is too old)."; + } + + GL::Renderer::enable(GL::Renderer::Feature::Blending); + GL::Renderer::enable(GL::Renderer::Feature::ScissorTest); + GL::Renderer::disable(GL::Renderer::Feature::FaceCulling); + GL::Renderer::disable(GL::Renderer::Feature::DepthTest); + GL::Renderer::setBlendFunction(GL::Renderer::BlendFunction::SourceAlpha, + GL::Renderer::BlendFunction::OneMinusSourceAlpha); + GL::Renderer::setBlendEquation(GL::Renderer::BlendEquation::Add, + GL::Renderer::BlendEquation::Add); + + initialiseGui(); + + if((_initEventId = SDL_RegisterEvents(1)) == std::uint32_t(-1)) { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error", + "SDL_RegisterEvents failed in SaveTool::SaveTool(). Exiting...", nullptr); + exit(EXIT_FAILURE); + } +} + +SaveTool::~SaveTool() { + SDL_RemoveTimer(_gameCheckTimerId); +} + +void SaveTool::handleFileAction(efsw::WatchID watch_id, + const std::string& dir, + const std::string& filename, + efsw::Action action, + std::string old_filename) +{ + if(watch_id == _watchIDs[StagingDir] && Utility::String::endsWith(filename, ".sav")) { + _massManager->refreshStagedMasses(); + return; + } + + if(Utility::String::endsWith(filename, "Config.sav")) { + return; + } + + switch(action) { + case efsw::Actions::Add: + if(Utility::String::endsWith(filename, _currentProfile->steamId() + ".sav")) { + if(Utility::String::beginsWith(filename, Utility::formatString("{}Unit", _currentProfile->type() == ProfileType::Demo ? "Demo" : ""))) { + int index = ((filename[_currentProfile->type() == ProfileType::Demo ? 8 : 4] - 0x30) * 10) + + (filename[_currentProfile->type() == ProfileType::Demo ? 9 : 5] - 0x30); + _massManager->refreshHangar(index); + } + } + break; + case efsw::Actions::Delete: + if(Utility::String::endsWith(filename, _currentProfile->steamId() + ".sav")) { + if(Utility::String::beginsWith(filename, Utility::formatString("{}Unit", _currentProfile->type() == ProfileType::Demo ? "Demo" : ""))) { + int index = ((filename[_currentProfile->type() == ProfileType::Demo ? 8 : 4] - 0x30) * 10) + + (filename[_currentProfile->type() == ProfileType::Demo ? 9 : 5] - 0x30); + _massManager->refreshHangar(index); + } + } + break; + case efsw::Actions::Modified: + if(filename == _currentProfile->filename()) { + _currentProfile->refreshValues(); + } + else if(Utility::String::endsWith(filename, _currentProfile->steamId() + ".sav")) { + if(Utility::String::beginsWith(filename, Utility::formatString("{}Unit", _currentProfile->type() == ProfileType::Demo ? "Demo" : ""))) { + int index = ((filename[_currentProfile->type() == ProfileType::Demo ? 8 : 4] - 0x30) * 10) + + (filename[_currentProfile->type() == ProfileType::Demo ? 9 : 5] - 0x30); + _massManager->refreshHangar(index); + } + } + break; + case efsw::Actions::Moved: + if(Utility::String::endsWith(filename, _currentProfile->steamId() + ".sav")) { + if(Utility::String::beginsWith(filename, Utility::formatString("{}Unit", _currentProfile->type() == ProfileType::Demo ? "Demo" : ""))) { + int index = ((filename[_currentProfile->type() == ProfileType::Demo ? 8 : 4] - 0x30) * 10) + + (filename[_currentProfile->type() == ProfileType::Demo ? 9 : 5] - 0x30); + _massManager->refreshHangar(index); + int old_index = ((old_filename[_currentProfile->type() == ProfileType::Demo ? 8 : 4] - 0x30) * 10) + + (old_filename[_currentProfile->type() == ProfileType::Demo ? 9 : 5] - 0x30); + _massManager->refreshHangar(old_index); + } + } + break; + default: + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error", "Unknown file watcher action type.", window()); + break; + } +} + +void SaveTool::drawEvent() { +#ifdef MANAGER_DEBUG_BUILD + tweak.update(); +#endif + + GL::defaultFramebuffer.clear(GL::FramebufferClear::Color); + + drawImGui(); + + swapBuffers(); + redraw(); +} + +void SaveTool::viewportEvent(ViewportEvent& event) { + GL::defaultFramebuffer.setViewport({{}, event.framebufferSize()}); + + _imgui.relayout(event.windowSize()); +} + +void SaveTool::keyPressEvent(KeyEvent& event) { + if(_imgui.handleKeyPressEvent(event)) return; +} + +void SaveTool::keyReleaseEvent(KeyEvent& event) { + if(_imgui.handleKeyReleaseEvent(event)) return; +} + +void SaveTool::mousePressEvent(MouseEvent& event) { + if(_imgui.handleMousePressEvent(event)) return; +} + +void SaveTool::mouseReleaseEvent(MouseEvent& event) { + if(_imgui.handleMouseReleaseEvent(event)) return; +} + +void SaveTool::mouseMoveEvent(MouseMoveEvent& event) { + if(_imgui.handleMouseMoveEvent(event)) return; +} + +void SaveTool::mouseScrollEvent(MouseScrollEvent& event) { + if(_imgui.handleMouseScrollEvent(event)) { + event.setAccepted(); + return; + } +} + +void SaveTool::textInputEvent(TextInputEvent& event) { + if(_imgui.handleTextInputEvent(event)) return; +} + +void SaveTool::anyEvent(SDL_Event& event) { + if(event.type == _initEventId) { + initEvent(event); + } +} + +void SaveTool::initEvent(SDL_Event& event) { + _thread.join(); + + switch(event.user.code) { + case InitSuccess: + _uiState = UiState::ProfileManager; + ImGui::CloseCurrentPopup(); + SDL_InitSubSystem(SDL_INIT_TIMER); + _mbManager->checkGameState(); + _gameCheckTimerId = SDL_AddTimer(2000, + [](std::uint32_t interval, void* param)->std::uint32_t{ + static_cast(param)->checkGameState(); + return interval; + }, + _mbManager.get()); + if(_gameCheckTimerId == 0) { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error", SDL_GetError(), window()); + } + break; + case MbManagerFailure: + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error initialising MassBuilderManager", _mbManager->lastError().c_str(), window()); + exit(EXIT_FAILURE); + break; + case ProfileManagerFailure: + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error initialising ProfileManager", _profileManager->lastError().c_str(), window()); + exit(EXIT_FAILURE); + break; + default: + break; + } +} + +void SaveTool::initialiseGui() { + ImGui::CreateContext(); + + ImGuiIO& io = ImGui::GetIO(); + + auto reg_font = _rs.getRaw("SourceSansPro-Regular.ttf"); + ImFontConfig font_config; + font_config.FontDataOwnedByAtlas = false; + std::strcpy(font_config.Name, "Source Sans Pro"); + io.Fonts->AddFontFromMemoryTTF(const_cast(reg_font.data()), reg_font.size(), 20.0f, &font_config); + + auto icon_font = _rs.getRaw(FONT_ICON_FILE_NAME_FAS); + static const ImWchar icon_range[] = { ICON_MIN_FA, ICON_MAX_FA, 0 }; + ImFontConfig icon_config; + icon_config.FontDataOwnedByAtlas = false; + icon_config.MergeMode = true; + icon_config.PixelSnapH = true; + icon_config.OversampleH = icon_config.OversampleV = 1; + icon_config.GlyphMinAdvanceX = 18.0f; + io.Fonts->AddFontFromMemoryTTF(const_cast(icon_font.data()), icon_font.size(), 16.0f, &icon_config, icon_range); + + auto brand_font = _rs.getRaw(FONT_ICON_FILE_NAME_FAB); + static const ImWchar brand_range[] = { ICON_MIN_FAB, ICON_MAX_FAB, 0 }; + io.Fonts->AddFontFromMemoryTTF(const_cast(brand_font.data()), brand_font.size(), 16.0f, &icon_config, brand_range); + + auto mono_font = _rs.getRaw("SourceCodePro-Regular.ttf"); + ImVector range; + ImFontGlyphRangesBuilder builder; + builder.AddRanges(io.Fonts->GetGlyphRangesDefault()); + builder.AddChar(u'š'); // This allows displaying Vladimír Vondruš' name in Corrade's and Magnum's licences. + builder.BuildRanges(&range); + io.Fonts->AddFontFromMemoryTTF(const_cast(mono_font.data()), mono_font.size(), 18.0f, &font_config, range.Data); + + _imgui = ImGuiIntegration::Context(*ImGui::GetCurrentContext(), windowSize()); + + io.IniFilename = nullptr; + + ImGuiStyle& style = ImGui::GetStyle(); + + style.WindowTitleAlign = {0.5f, 0.5f}; + style.FrameRounding = 3.2f; + style.Colors[ImGuiCol_WindowBg] = ImColor(0xff1f1f1f); +} + +void SaveTool::initialiseManager() { + SDL_Event event; + SDL_zero(event); + event.type = _initEventId; + + _mbManager.emplace(); + if(!_mbManager->ready()) { + event.user.code = MbManagerFailure; + SDL_PushEvent(&event); + return; + } + + _profileManager.emplace(_mbManager->saveDirectory()); + if(!_profileManager->ready()) { + event.user.code = ProfileManagerFailure; + SDL_PushEvent(&event); + return; + } + + event.user.code = InitSuccess; + SDL_PushEvent(&event); +} + +void SaveTool::initialiseMassManager() { + _currentProfile->refreshValues(); + + _massManager.emplace(_profileManager->saveDirectory(), + _currentProfile->steamId(), + _currentProfile->type() == ProfileType::Demo); + + initialiseFileWatcher(); +} + +void SaveTool::initialiseFileWatcher() { + _fileWatcher.emplace(); + _watchIDs[SaveDir] = _fileWatcher->addWatch(_profileManager->saveDirectory(), this, false); + _watchIDs[StagingDir] = _fileWatcher->addWatch(_massManager->stagingAreaDirectory(), this, false); + _fileWatcher->watch(); +} + +void SaveTool::drawImGui() { + _imgui.newFrame(); + + if(ImGui::GetIO().WantTextInput && !isTextInputActive()) { + startTextInput(); + } + else if(!ImGui::GetIO().WantTextInput && isTextInputActive()) { + stopTextInput(); + } + + drawGui(); + + _imgui.updateApplicationCursor(*this); + + //GL::Renderer::enable(GL::Renderer::Feature::ScissorTest); + //GL::Renderer::disable(GL::Renderer::Feature::FaceCulling); + //GL::Renderer::disable(GL::Renderer::Feature::DepthTest); + + _imgui.drawFrame(); + + //GL::Renderer::enable(GL::Renderer::Feature::DepthTest); + //GL::Renderer::enable(GL::Renderer::Feature::FaceCulling); + //GL::Renderer::disable(GL::Renderer::Feature::ScissorTest); +} + +void SaveTool::drawGui() { + drawMainMenu(); + + if(_uiState == UiState::Disclaimer) { + drawDisclaimer(); + } + else if(_uiState == UiState::Initialising) { + drawInitialisation(); + } + else if(_uiState == UiState::ProfileManager) { + drawProfileManager(); + } + else if(_uiState == UiState::MainManager) { + drawManager(); + } + + if(_aboutPopup) { + drawAbout(); + } + +#ifdef MANAGER_DEBUG_BUILD + if(_demoWindow) { + ImGui::ShowDemoWindow(&_demoWindow); + } + + if(_styleEditor) { + ImGui::ShowStyleEditor(&ImGui::GetStyle()); + } + + if(_metricsWindow) { + ImGui::ShowMetricsWindow(&_metricsWindow); + } +#endif +} + +void SaveTool::drawDisclaimer() { + ImGui::SetNextWindowPos(ImVec2{Vector2{windowSize() / 2.0f}}, ImGuiCond_Always, center_pivot); + + if(ImGui::Begin("Disclaimer##DisclaimerWindow", nullptr, + ImGuiWindowFlags_NoCollapse|ImGuiWindowFlags_NoMove| + ImGuiWindowFlags_NoResize|ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_MenuBar)) + { + if(ImGui::BeginMenuBar()) { + ImGui::TextUnformatted("Disclaimer"); + ImGui::EndMenuBar(); + } + + ImGui::TextUnformatted("Before you start using the app, there are a few things you should know:"); + + ImGui::PushTextWrapPos(windowSize().x() * 0.67f); + + ImGui::Bullet(); + ImGui::SameLine(); + ImGui::TextUnformatted("For this application to work properly, it is recommended to disable Steam Cloud syncing for the game. To disable it, right-click the game in your Steam library, click \"Properties\", go to the \"General\" tab, and uncheck \"Keep game saves in the Steam Cloud for M.A.S.S. Builder\"."); + + ImGui::Bullet(); + ImGui::SameLine(); + ImGui::TextUnformatted("The developer of this application (Guillaume Jacquemin) isn't associated with Vermillion Digital, and both parties cannot be held responsible for data loss or corruption this app might cause. PLEASE USE AT YOUR OWN RISK!"); + + ImGui::Bullet(); + ImGui::SameLine(); + ImGui::TextUnformatted("This application is released under the terms of the GNU General Public Licence version 3. Please see the COPYING file for more details, or the About screen if you somehow didn't get that file with your download of the program."); + + ImGui::Bullet(); + ImGui::SameLine(); + ImGui::TextUnformatted("This version of the application was tested on M.A.S.S. Builder early access version 0.6.5. It may or may not work with other versions of the game."); + + ImGui::PopTextWrapPos(); + + if(ImGui::BeginTable("##DisclaimerLayoutTable", 3)) { + ImGui::TableSetupColumn("##Empty1", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableSetupColumn("##Button", ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("##Empty2", ImGuiTableColumnFlags_WidthStretch); + + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(1); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, {24.0f, 12.0f}); + if(ImGui::Button("I understand the risks")) { + _uiState = UiState::Initialising; + _thread = std::thread{[this]{ initialiseManager(); }}; + } + ImGui::PopStyleVar(); + + ImGui::EndTable(); + } + } + ImGui::End(); +} + +void SaveTool::drawInitialisation() { + ImGui::SetNextWindowPos(ImVec2{Vector2{windowSize() / 2.0f}}, ImGuiCond_Always, center_pivot); + + if(ImGui::BeginPopupModal("##InitPopup", nullptr, + ImGuiWindowFlags_AlwaysAutoResize|ImGuiWindowFlags_NoTitleBar)) + { + ImGui::TextUnformatted("Initialising the manager. Please wait..."); + ImGui::EndPopup(); + } + + ImGui::OpenPopup("##InitPopup"); +} + +void SaveTool::drawGameState() { + ImGui::TextUnformatted("Game state:"); + ImGui::SameLine(); + { + switch(_mbManager->gameState()) { + case GameState::Unknown: + ImGui::TextColored(ImColor{0xff00a5ff}, "unknown"); + break; + case GameState::NotRunning: + ImGui::TextColored(ImColor{0xff32cd32}, "not running"); + break; + case GameState::Running: + ImGui::TextColored(ImColor{0xff0000ff}, "running"); + break; + } + } +} + +void SaveTool::drawHelpMarker(const char* text, float wrap_pos) { + ImGui::TextUnformatted(ICON_FA_QUESTION_CIRCLE); + drawTooltip(text, wrap_pos); +} + +void SaveTool::drawTooltip(const char* text, float wrap_pos) { + if(ImGui::IsItemHovered()){ + ImGui::BeginTooltip(); + if(wrap_pos > 0.0f) { + ImGui::PushTextWrapPos(wrap_pos); + } + ImGui::TextUnformatted(text); + if(wrap_pos > 0.0f) { + ImGui::PopTextWrapPos(); + } + ImGui::EndTooltip(); + } +} + +void SaveTool::drawUnsafeText(const char* text, ...) { + va_list args; + va_start(args, text); + if(!_unsafeMode && _mbManager->gameState() != GameState::NotRunning) { + ImGui::TextDisabledV(text, args); + } + else { + ImGui::TextV(text, args); + } + va_end(args); +} + +void SaveTool::openUri(const std::string& uri) { + ShellExecuteW(nullptr, nullptr, Utility::Unicode::widen(uri).c_str(), nullptr, nullptr, SW_SHOW); +} diff --git a/src/SaveTool/SaveTool.h b/src/SaveTool/SaveTool.h new file mode 100644 index 0000000..f1004ac --- /dev/null +++ b/src/SaveTool/SaveTool.h @@ -0,0 +1,168 @@ +#pragma once + +// MassBuilderSaveTool +// Copyright (C) 2021 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 +#include + +#include + +#include +#include + +#include + +#include "../MassBuilderManager/MassBuilderManager.h" +#include "../ProfileManager/ProfileManager.h" +#include "../MassManager/MassManager.h" + +using namespace Corrade; +using namespace Magnum; + +class SaveTool: public Platform::Sdl2Application, public efsw::FileWatchListener { + public: + explicit SaveTool(const Arguments& arguments); + + ~SaveTool() override; + + void handleFileAction(efsw::WatchID watch_id, + const std::string& dir, + const std::string& filename, + efsw::Action action, + std::string old_filename = "") override; + + private: + // Events + void drawEvent() override; + void viewportEvent(ViewportEvent& event) override; + + void keyPressEvent(KeyEvent& event) override; + void keyReleaseEvent(KeyEvent& event) override; + + void mousePressEvent(MouseEvent& event) override; + void mouseReleaseEvent(MouseEvent& event) override; + void mouseMoveEvent(MouseMoveEvent& event) override; + void mouseScrollEvent(MouseScrollEvent& event) override; + void textInputEvent(TextInputEvent& event) override; + + void anyEvent(SDL_Event& event) override; + + enum InitStatus: std::int32_t { + InitSuccess, + MbManagerFailure, + ProfileManagerFailure + }; + void initEvent(SDL_Event& event); + + // Initialisation methods + void initialiseGui(); + void initialiseManager(); + void initialiseMassManager(); + void initialiseFileWatcher(); + + // GUI-related methods + void drawImGui(); + void drawGui(); + void drawMainMenu(); + void drawDisclaimer(); + void drawInitialisation(); + void drawProfileManager(); + auto drawBackupListPopup() -> ImGuiID; + auto drawBackupProfilePopup(std::size_t profile_index) -> ImGuiID; + auto drawDeleteProfilePopup(std::size_t profile_index) -> ImGuiID; + void drawManager(); + auto drawIntEditPopup(int* value_to_edit, int max) -> bool; + auto drawRenamePopup(Containers::ArrayView name_view) -> bool; + void drawGeneralInfo(); + void drawResearchInventory(); + void drawMassManager(); + auto drawDeleteMassPopup(int mass_index) -> ImGuiID; + auto drawDeleteStagedMassPopup(const std::string& filename) -> ImGuiID; + void drawAbout(); + void drawGameState(); + + // Convenience wrappers over ImGui stuff + void drawHelpMarker(const char* text, float wrap_pos = 0.0f); + void drawTooltip(const char* text, float wrap_pos = 0.0f); + + template + auto drawUnsafeWidget(Functor func, Args... args) -> bool { + if(!_unsafeMode && _mbManager->gameState() != GameState::NotRunning) { + ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); + ImGui::PushStyleVar(ImGuiStyleVar_Alpha, 0.5f); + } + + bool result = func(std::forward(args)...); + + if(!_unsafeMode && _mbManager->gameState() != GameState::NotRunning) { + ImGui::PopItemFlag(); + ImGui::PopStyleVar(); + } + + return result; + } // Obviously, should only be used with ImGui widgets that return a bool. + // Also, should be called with a lambda if there are any default arguments, like ImGui::Button(), etc... + + void drawUnsafeText(const char* text, ...); // Alternative to the above, for ImGui::Text*() variants. + + void openUri(const std::string& uri); + + Utility::Resource _rs{"assets"}; + + // GUI-related members + ImGuiIntegration::Context _imgui{NoCreate}; + + enum class UiState: uint8_t { + Disclaimer, + Initialising, + ProfileManager, + MainManager + }; + UiState _uiState{UiState::Disclaimer}; + + bool _aboutPopup{false}; +#ifdef MANAGER_DEBUG_BUILD + bool _demoWindow{false}; + bool _styleEditor{false}; + bool _metricsWindow{false}; +#endif + + std::thread _thread; + std::uint32_t _initEventId; + + Containers::Pointer _mbManager; + SDL_TimerID _gameCheckTimerId; + + Containers::Pointer _profileManager; + Profile* _currentProfile{nullptr}; + + Containers::Pointer _massManager; + + Containers::Pointer _fileWatcher; + enum watchID { + SaveDir = 0, + StagingDir = 1 + }; + Containers::StaticArray<2, efsw::WatchID> _watchIDs; + + bool _unsafeMode{false}; +}; diff --git a/src/SaveTool/SaveTool_MainManager.cpp b/src/SaveTool/SaveTool_MainManager.cpp new file mode 100644 index 0000000..2032cad --- /dev/null +++ b/src/SaveTool/SaveTool_MainManager.cpp @@ -0,0 +1,694 @@ +// MassBuilderSaveTool +// Copyright (C) 2021 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 "SaveTool.h" + +#include + +#include +#include +#include + +#include "../FontAwesome/IconsFontAwesome5.h" + +#include "../Maps/LastMissionId.h" +#include "../Maps/StoryProgress.h" + +static const std::string empty_str = ""; + +void SaveTool::drawManager() { + ImGui::SetNextWindowPos({0.0f, ImGui::GetItemRectSize().y}, ImGuiCond_Always); + ImGui::SetNextWindowSize({float(windowSize().x()), float(windowSize().y()) - ImGui::GetItemRectSize().y}, + ImGuiCond_Always); + if(!ImGui::Begin("##MainWindow", nullptr, + ImGuiWindowFlags_NoDecoration|ImGuiWindowFlags_NoMove| + ImGuiWindowFlags_NoBackground|ImGuiWindowFlags_NoBringToFrontOnFocus)) + { + ImGui::End(); + return; + } + + if(ImGui::BeginTable("##TopRow", 2)) { + ImGui::TableSetupColumn("##ProfileInfo", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableSetupColumn("##Unsafe", ImGuiTableColumnFlags_WidthFixed); + + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + ImGui::AlignTextToFramePadding(); + ImGui::Text("Current profile: %s (%s)", + _currentProfile->companyName().c_str(), + _currentProfile->type() == ProfileType::Demo ? "demo" : "full game"); + ImGui::SameLine(); + if(ImGui::Button("Close")) { + _currentProfile = nullptr; + _massManager.reset(); + _fileWatcher.reset(); + _uiState = UiState::ProfileManager; + } + + ImGui::TableSetColumnIndex(1); + ImGui::Checkbox("Unsafe mode", &_unsafeMode); + drawTooltip("Enabling this allows interactions deemed to be unsafe to do while the game is running.", + float(windowSize().x()) * 0.35f); + + ImGui::EndTable(); + } + + ImGui::BeginGroup(); + + drawGeneralInfo(); + + ImGui::Dummy({0.0f, 0.0f}); + + drawResearchInventory(); + + ImGui::EndGroup(); + + ImGui::SameLine(); + + drawMassManager(); + + ImGui::End(); +} + +auto SaveTool::drawIntEditPopup(int* value_to_edit, int max) -> bool { + bool apply = false; + if(ImGui::BeginPopup("int_edit")) { + ImGui::Text("Please enter a value between 0 and %i:", max); + + ImGui::AlignTextToFramePadding(); + drawHelpMarker("You can either drag the widget left or right to change the value,\n" + "or click on it while holding Ctrl to edit the value directly."); + ImGui::SameLine(); + drawUnsafeWidget([](auto... args){ return ImGui::DragInt("", args...); }, + value_to_edit, 1.0f, 0, max, "%d", ImGuiSliderFlags_AlwaysClamp); + ImGui::SameLine(); + if(drawUnsafeWidget([]{ return ImGui::Button("Apply"); })) { + apply = true; + ImGui::CloseCurrentPopup(); + } + + ImGui::EndPopup(); + } + + return apply; +} + +auto SaveTool::drawRenamePopup(Containers::ArrayView name_view) -> bool { + bool apply = false; + if(ImGui::BeginPopup("name_edit")) { + ImGui::TextUnformatted("Please enter a new name. Conditions:"); + + std::size_t len = std::strlen(name_view.data()); + + ImGui::BulletText("Length between 6 and 32 characters included. %s", + (len >= 6 && len <= 32) ? ICON_FA_CHECK : ICON_FA_TIMES); + + ImGui::BulletText("Only A-Z, a-z, 0-9, -, and whitespaces. " ICON_FA_CHECK); + + ImGui::BulletText("No whitespace at the beginning or end. %s", + (name_view[0] != ' ' && name_view[len - 1] != ' ') ? ICON_FA_CHECK : ICON_FA_TIMES); + + static auto callback = [](ImGuiInputTextCallbackData* data)->int { + if(data->EventChar < 256 && std::strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789- ", char(data->EventChar))) { + return 0; + } + return 1; + }; + + drawUnsafeWidget([](auto... args){ return ImGui::InputText("", args...); }, + name_view.data(), name_view.size(), + ImGuiInputTextFlags_CallbackCharFilter, + callback, nullptr); + ImGui::SameLine(); + if((!_unsafeMode && _mbManager->gameState() != GameState::NotRunning) || + !(len >= 6 && len <= 32) || !(name_view[0] != ' ' && name_view[len - 1] != ' ')) + { + ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); + ImGui::PushStyleVar(ImGuiStyleVar_Alpha, 0.5f); + } + + if(ImGui::Button("Apply")) { + apply = true; + ImGui::CloseCurrentPopup(); + } + + if((!_unsafeMode && _mbManager->gameState() != GameState::NotRunning) || + !(len >= 6 && len <= 32) || !(name_view[0] != ' ' && name_view[len - 1] != ' ')) + { + ImGui::PopItemFlag(); + ImGui::PopStyleVar(); + } + + ImGui::EndPopup(); + } + return apply; +} + +void SaveTool::drawGeneralInfo() { + if(!_currentProfile) { + return; + } + + if(!ImGui::BeginChild("##GeneralProfileInfo", + {ImGui::GetContentRegionAvailWidth() * 0.60f, (ImGui::GetContentRegionAvail().y - ImGui::GetStyle().ItemSpacing.x) / 2.0f}, + true, ImGuiWindowFlags_MenuBar)) + { + ImGui::EndChild(); + return; + } + + if(ImGui::BeginMenuBar()) { + ImGui::TextUnformatted("General profile information"); + ImGui::EndMenuBar(); + } + + ImGui::Text("Credits: %i", _currentProfile->credits()); + + auto it = std::find_if(story_progress.begin(), story_progress.end(), + [this](const StoryProgressPoint& p){ return p.id == _currentProfile->storyProgress(); }); + if(it != story_progress.end()) + { + ImGui::TextUnformatted("Story progress:"); + ImGui::SameLine(0.0f, ImGui::GetStyle().ItemSpacing.x / 4.0f); + if(std::strcmp(it->after, "") == 0) { + ImGui::TextWrapped("%s - %s", it->chapter, it->point); + } + else { + ImGui::TextWrapped("%s - %s - %s", it->chapter, it->after, it->point); + } + } + else { + ImGui::Text("Story progress: 0x%x", _currentProfile->storyProgress()); + } + + if(mission_id_map.find(_currentProfile->lastMissionId()) != mission_id_map.cend()) { + ImGui::Text("Last mission: %s", mission_id_map.at(_currentProfile->lastMissionId())); + } + else if(_currentProfile->lastMissionId() == -1) { + ImGui::TextUnformatted("Last mission: none"); + } + else { + ImGui::Text("Last mission: 0x%x", _currentProfile->lastMissionId()); + } + drawTooltip("This is the last mission selected in the mission selection screen, not the last mission played.", + windowSize().x() * 0.35f); + + const float footer_height_to_reserve = ImGui::GetStyle().ItemSpacing.y + ImGui::GetFrameHeightWithSpacing(); + ImGui::Dummy({ImGui::GetContentRegionAvail().x, ImGui::GetContentRegionAvail().y - footer_height_to_reserve}); + + ImGui::Separator(); + + static Containers::StaticArray<33, char> name_buf{ValueInit}; + if(drawUnsafeWidget([]{ return ImGui::Button("Rename company"); })) { + for(auto& c : name_buf) { + c = '\0'; + } + std::strncpy(name_buf.data(), _currentProfile->companyName().c_str(), 32); + ImGui::OpenPopup("name_edit"); + } + if(drawRenamePopup(name_buf)) { + if(!_currentProfile->renameCompany(name_buf.data())) { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error", + _currentProfile->lastError().c_str(), window()); + } + } + + ImGui::SameLine(); + + static std::int32_t credits; + if(drawUnsafeWidget([]{ return ImGui::Button("Edit credits"); })) { + credits = _currentProfile->credits(); + ImGui::OpenPopup("int_edit"); + } + if(drawIntEditPopup(&credits, 2000000)) { + if(!_currentProfile->setCredits(credits)) { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error", + _currentProfile->lastError().c_str(), window()); + } + } + + ImGui::SameLine(); + + if(drawUnsafeWidget([]{ return ImGui::Button("Change story progression"); })) { + ImGui::OpenPopup("StoryProgressMenu"); + } + drawTooltip("Story progress directly affects unlocked levels."); + if(ImGui::BeginPopup("StoryProgressMenu")) { + if(!_unsafeMode && _mbManager->gameState() != GameState::NotRunning) { + ImGui::CloseCurrentPopup(); + } + for(const auto& sp : story_progress) { + if(ImGui::BeginMenu(sp.chapter)) { + if(std::strcmp(sp.after, "") == 0) { + if(ImGui::MenuItem(sp.point)) { + if(!_currentProfile->setStoryProgress(sp.id)) { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error", + _currentProfile->lastError().c_str(), window()); + } + } + } + else { + if(ImGui::BeginMenu(sp.after)) { + if(ImGui::MenuItem(sp.point)) { + if(!_currentProfile->setStoryProgress(sp.id)) { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error", + _currentProfile->lastError().c_str(), window()); + } + } + ImGui::EndMenu(); + } + } + ImGui::EndMenu(); + } + } + ImGui::EndPopup(); + } + + ImGui::EndChild(); +} + +void SaveTool::drawResearchInventory() { + if(!_currentProfile) { + return; + } + + if(!ImGui::BeginChild("##ResearchInventory", + {ImGui::GetContentRegionAvailWidth() * 0.60f, 0.0f}, + true, ImGuiWindowFlags_MenuBar)) + { + ImGui::EndChild(); + return; + } + + if(ImGui::BeginMenuBar()) { + ImGui::TextUnformatted("Research inventory"); + ImGui::EndMenuBar(); + } + + #define unavRow(name) \ + ImGui::TableNextRow(); \ + ImGui::TableSetColumnIndex(0); \ + ImGui::TextUnformatted(name); \ + ImGui::TableSetColumnIndex(1); \ + ImGui::TextDisabled("Unavailable as of M.A.S.S. Builder version 0.6.5"); + + #define matRow(name, var, getter, setter) \ + ImGui::TableNextRow(); \ + ImGui::TableSetColumnIndex(0); \ + ImGui::TextUnformatted((name)); \ + ImGui::TableSetColumnIndex(1); \ + if(_currentProfile->getter() != -1) { \ + drawUnsafeText("%i", _currentProfile->getter()); \ + ImGui::TableSetColumnIndex(2); \ + ImGui::PushID(#setter); \ + static std::int32_t var = _currentProfile->getter(); \ + if(drawUnsafeWidget([]{ return ImGui::SmallButton(ICON_FA_EDIT); })) { \ + (var) = _currentProfile->getter(); \ + ImGui::OpenPopup("int_edit"); \ + } \ + if(drawIntEditPopup(&(var), 10000)) { \ + if(!_currentProfile->set##setter((var))) { \ + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error", \ + _currentProfile->lastError().c_str(), window()); \ + } \ + } \ + ImGui::PopID(); \ + } \ + else { \ + ImGui::TextDisabled("Not found in the save file"); \ + } + + if(ImGui::BeginTable("##ResearchInventoryTable", 3, + ImGuiTableFlags_BordersOuter|ImGuiTableFlags_ScrollY|ImGuiTableFlags_RowBg)) + { + ImGui::TableSetupColumn("##Name", ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("##Value", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableSetupColumn("##Edit", ImGuiTableColumnFlags_WidthFixed); + + ImGui::TableNextRow(ImGuiTableRowFlags_Headers); + ImGui::TableSetColumnIndex(0); + ImGui::Text("Engine materials"); + + matRow("Verse steel", verse_steel, verseSteel, VerseSteel) + matRow("Undinium", undinium, undinium, Undinium) + matRow("Necrium alloy", necrium_alloy, necriumAlloy, NecriumAlloy) + matRow("Lunarite", lunarite, lunarite, Lunarite) + matRow("Asterite", asterite, asterite, Asterite) + unavRow("Hallite fragma") + unavRow("Unnoctinium") + + ImGui::TableNextRow(ImGuiTableRowFlags_Headers); + ImGui::TableSetColumnIndex(0); + ImGui::Text("OS materials"); + + matRow("Ednil", ednil, ednil, Ednil) + matRow("Nuflalt", nuflalt, nuflalt, Nuflalt) + matRow("Aurelene", aurelene, aurelene, Aurelene) + matRow("Soldus", soldus, soldus, Soldus) + matRow("Synthesized N", synthesized_n, synthesizedN, SynthesizedN) + unavRow("Nanoc") + unavRow("Abyssillite") + + ImGui::TableNextRow(ImGuiTableRowFlags_Headers); + ImGui::TableSetColumnIndex(0); + ImGui::Text("Architect materials"); + + matRow("Alcarbonite", alcarbonite, alcarbonite, Alcarbonite) + matRow("Keriphene", keriphene, keriphene, Keriphene) + matRow("Nitinol-CM", nitinol_cm, nitinolCM, NitinolCM) + matRow("Quarkium", quarkium, quarkium, Quarkium) + matRow("Alterene", alterene, alterene, Alterene) + unavRow("Cosmium") + unavRow("Purified quarkium") + + ImGui::TableNextRow(ImGuiTableRowFlags_Headers); + ImGui::TableSetColumnIndex(0); + ImGui::Text("Quark data"); + + matRow("Mixed composition", mixed_composition, mixedComposition, MixedComposition) + matRow("Void residue", void_residue, voidResidue, VoidResidue) + matRow("Muscular construction", muscular_construction, muscularConstruction, MuscularConstruction) + matRow("Mineral exoskeletology", mineral_exoskeletology, mineralExoskeletology, MineralExoskeletology) + matRow("Carbonized skin", carbonized_skin, carbonizedSkin, CarbonizedSkin) + unavRow("Isolated void particle") + unavRow("Weaponised physiology") + + ImGui::EndTable(); + } + + #undef unavRow + #undef matRow + + ImGui::EndChild(); +} + +void SaveTool::drawMassManager() { + if(!_massManager) { + return; + } + + if(!ImGui::BeginChild("##MASSManager", {0.0f, 0.0f}, + true, ImGuiWindowFlags_MenuBar)) + { + ImGui::EndChild(); + return; + } + + if(ImGui::BeginMenuBar()) { + ImGui::TextUnformatted("M.A.S.S. management"); + drawHelpMarker("To move, import, or export builds, drag-and-drop them."); + ImGui::EndMenuBar(); + } + + static int mass_to_delete = 0; + static ImGuiID mass_deletion_popup_ID = drawDeleteMassPopup(mass_to_delete); + + if(ImGui::BeginTable("##HangarsTable", 4, + ImGuiTableFlags_BordersOuter|ImGuiTableFlags_RowBg|ImGuiTableFlags_ScrollY, + {0.0f, ImGui::GetContentRegionAvail().y * 0.45f})) + { + ImGui::TableSetupColumn("##Hangar", ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("##MASSName", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableSetupColumn("##Active", ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("##DeleteButton", ImGuiTableColumnFlags_WidthFixed); + + ImGui::TableSetupScrollFreeze(0, 1); + + ImGui::TableNextRow(ImGuiTableRowFlags_Headers); + + ImGui::TableSetColumnIndex(0); + ImGui::TextUnformatted("#"); + + ImGui::TableSetColumnIndex(1); + ImGui::TextUnformatted("Name"); + + for(int i = 0; i < 32; i++) { + ImGui::TableNextRow(); + + static int drag_drop_index = 0; + + ImGui::TableSetColumnIndex(0); + ImGui::Selectable(Utility::formatString("{:.2d}", i + 1).c_str(), + false, ImGuiSelectableFlags_SpanAllColumns|ImGuiSelectableFlags_AllowItemOverlap); + if(_massManager->massState(i) == MassState::Valid && + ImGui::BeginDragDropSource(ImGuiDragDropFlags_SourceNoHoldToOpenOthers)) + { + drag_drop_index = i; + ImGui::SetDragDropPayload("Mass", &drag_drop_index, sizeof(int)); + + ImGui::Text("%s - Hangar %.2d", _massManager->massName(i).c_str(), i + 1); + + ImGui::EndDragDropSource(); + } + if((!_unsafeMode && _mbManager->gameState() == GameState::NotRunning) && ImGui::BeginDragDropTarget()) { + if(const ImGuiPayload* payload = ImGui::AcceptDragDropPayload("StagedMass")) { + if(payload->DataSize != sizeof(std::string)) { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Fatal error", + "payload->DataSize != sizeof(std::string) in SaveTool::drawMassManager()", + window()); + exit(EXIT_FAILURE); + } + + std::string file = *(static_cast(payload->Data)); + + if(!_massManager->importMass(file, i)) { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error importing M.A.S.S.", + _massManager->lastError().c_str(), window()); + } + } + else if(const ImGuiPayload* payload = ImGui::AcceptDragDropPayload("Mass")) { + if(payload->DataSize != sizeof(int)) { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Fatal error", + "payload->DataSize != sizeof(int) in SaveTool::drawMassManager()", + window()); + exit(EXIT_FAILURE); + } + + int index = *(static_cast(payload->Data)); + + if(!_massManager->moveMass(index, i)) { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error", + _massManager->lastError().c_str(), + window()); + } + } + + ImGui::EndDragDropTarget(); + } + + ImGui::TableSetColumnIndex(1); + switch(_massManager->massState(i)) { + case MassState::Empty: + ImGui::TextUnformatted(""); + break; + case MassState::Invalid: + ImGui::TextUnformatted(""); + break; + case MassState::Valid: + ImGui::TextUnformatted(_massManager->massName(i).c_str()); + break; + } + + if(i == _currentProfile->activeFrameSlot()) { + ImGui::TableSetColumnIndex(2); + ImGui::TextUnformatted(ICON_FA_CHECK); + } + + if(_massManager->massState(i) != MassState::Empty) { + ImGui::TableSetColumnIndex(3); + ImGui::PushID(i); + if(drawUnsafeWidget(ImGui::SmallButton, ICON_FA_TRASH_ALT)) { + mass_to_delete = i; + ImGui::OpenPopup(mass_deletion_popup_ID); + } + ImGui::PopID(); + } + } + + ImGui::EndTable(); + } + + drawDeleteMassPopup(mass_to_delete); + + static ImGuiID staged_mass_deletion_popup_ID = drawDeleteStagedMassPopup(""); + static Containers::Reference staged_mass_to_delete{empty_str}; + + if(ImGui::BeginTable("##StagingArea", 2, + ImGuiTableFlags_ScrollY|ImGuiTableFlags_BordersOuter|ImGuiTableFlags_RowBg)) + { + ImGui::TableSetupColumn("##NameColumn", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableSetupColumn("##DeleteColumn", ImGuiTableColumnFlags_WidthFixed); + + ImGui::TableSetupScrollFreeze(0, 1); + + ImGui::TableNextRow(ImGuiTableRowFlags_Headers); + + ImGui::TableSetColumnIndex(0); + ImGui::TextUnformatted("Staging area"); + ImGui::SameLine(); + if(ImGui::SmallButton(ICON_FA_FOLDER_OPEN " Open staging folder")) { + openUri(_massManager->stagingAreaDirectory()); + } + + for(const auto& pair : _massManager->stagedMasses()) { + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + std::string staged_formatted = Utility::formatString("{} ({})", pair.second, pair.first); + ImGui::Selectable(staged_formatted.c_str()); + if((ImGui::CalcTextSize(staged_formatted.c_str()).x + ImGui::GetStyle().FramePadding.x) > ImGui::GetContentRegionAvailWidth()) { + drawTooltip(staged_formatted.c_str()); + } + if(ImGui::BeginDragDropSource(ImGuiDragDropFlags_SourceNoHoldToOpenOthers)) { + ImGui::SetDragDropPayload("StagedMass", &(pair.first), sizeof(std::string)); + + ImGui::Text("%s - Staged", pair.second.c_str()); + + ImGui::EndDragDropSource(); + } + + ImGui::TableSetColumnIndex(1); + ImGui::PushID(pair.first.c_str()); + if(ImGui::SmallButton(ICON_FA_TRASH_ALT)) { + staged_mass_to_delete = Containers::Reference{pair.first}; + ImGui::OpenPopup(staged_mass_deletion_popup_ID); + } + ImGui::PopID(); + } + + ImGui::EndTable(); + } + if(ImGui::BeginDragDropTarget()) { + if(const ImGuiPayload* payload = ImGui::AcceptDragDropPayload("Mass")) { + if(payload->DataSize != sizeof(int)) { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Fatal error", + "payload->DataSize != sizeof(int) in SaveTool::drawMassManager()", + window()); + exit(EXIT_FAILURE); + } + + int index = *(static_cast(payload->Data)); + + if(!_massManager->exportMass(index)) { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error", + _massManager->lastError().c_str(), + window()); + } + } + + ImGui::EndDragDropTarget(); + } + + drawDeleteStagedMassPopup(staged_mass_to_delete.get()); + + ImGui::EndChild(); +} + +auto SaveTool::drawDeleteMassPopup(int mass_index) -> ImGuiID { + if(!ImGui::BeginPopupModal("Confirmation##DeleteMassConfirmation", nullptr, + ImGuiWindowFlags_AlwaysAutoResize|ImGuiWindowFlags_NoCollapse|ImGuiWindowFlags_NoMove)) + { + return ImGui::GetID("Confirmation##DeleteMassConfirmation"); + } + + if(_massManager->massState(mass_index) == MassState::Empty) { + ImGui::CloseCurrentPopup(); + ImGui::EndPopup(); + return 0; + } + + if(_mbManager->gameState() != GameState::NotRunning) { + ImGui::CloseCurrentPopup(); + ImGui::EndPopup(); + return 0; + } + + ImGui::PushTextWrapPos(windowSize().x() * 0.40f); + if(_massManager->massState(mass_index) == MassState::Invalid) { + ImGui::Text("Are you sure you want to delete the invalid M.A.S.S. data in hangar %.2i ? This operation is irreversible.", + mass_index + 1); + } + else { + ImGui::Text("Are you sure you want to delete the M.A.S.S. named %s in hangar %.2i ? This operation is irreversible.", + _massManager->massName(mass_index).c_str(), mass_index + 1); + } + ImGui::PopTextWrapPos(); + + if(ImGui::BeginTable("##DeleteMassLayout", 2)) { + ImGui::TableSetupColumn("##Dummy", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableSetupColumn("##YesNo", ImGuiTableColumnFlags_WidthFixed); + + ImGui::TableNextRow(); + + ImGui::TableSetColumnIndex(1); + if(ImGui::Button("Yes")) { + if(!_massManager->deleteMass(mass_index)) { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error when deleting M.A.S.S.", + _massManager->lastError().c_str(), window()); + } + ImGui::CloseCurrentPopup(); + } + ImGui::SameLine(); + if(ImGui::Button("No", ImGui::GetItemRectSize())) { + ImGui::CloseCurrentPopup(); + } + + ImGui::EndTable(); + } + + ImGui::EndPopup(); + + return 0; +} + +auto SaveTool::drawDeleteStagedMassPopup(const std::string& filename) -> ImGuiID { + if(!ImGui::BeginPopupModal("Confirmation##DeleteStagedMassConfirmation", nullptr, + ImGuiWindowFlags_AlwaysAutoResize|ImGuiWindowFlags_NoCollapse|ImGuiWindowFlags_NoMove)) + { + return ImGui::GetID("Confirmation##DeleteStagedMassConfirmation"); + } + + ImGui::PushTextWrapPos(windowSize().x() * 0.40f); + ImGui::Text("Are you sure you want to delete the staged M.A.S.S. named %s ? This operation is irreversible.", + _massManager->stagedMasses().at(filename).c_str()); + ImGui::PopTextWrapPos(); + + if(ImGui::BeginTable("##DeleteStagedMassLayout", 2)) { + ImGui::TableSetupColumn("##Dummy", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableSetupColumn("##YesNo", ImGuiTableColumnFlags_WidthFixed); + + ImGui::TableNextRow(); + + ImGui::TableSetColumnIndex(1); + if(ImGui::Button("Yes")) { + if(!_massManager->deleteStagedMass(filename)) { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error when deleting M.A.S.S.", + _massManager->lastError().c_str(), window()); + } + ImGui::CloseCurrentPopup(); + } + ImGui::SameLine(); + if(ImGui::Button("No", ImGui::GetItemRectSize())) { + ImGui::CloseCurrentPopup(); + } + + ImGui::EndTable(); + } + + ImGui::EndPopup(); + + return 0; +} diff --git a/src/SaveTool/SaveTool_ProfileManager.cpp b/src/SaveTool/SaveTool_ProfileManager.cpp new file mode 100644 index 0000000..b9e09cc --- /dev/null +++ b/src/SaveTool/SaveTool_ProfileManager.cpp @@ -0,0 +1,392 @@ +// MassBuilderSaveTool +// Copyright (C) 2021 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 "SaveTool.h" + +#include + +#include "../FontAwesome/IconsFontAwesome5.h" + +extern const ImVec2 center_pivot; + +void SaveTool::drawProfileManager() { + static std::size_t profile_index = 0; + + ImGui::SetNextWindowPos(ImVec2{Vector2{windowSize() / 2.0f}}, ImGuiCond_Always, center_pivot); + if(ImGui::Begin("Profile management##ProfileManager", nullptr, + ImGuiWindowFlags_NoCollapse|ImGuiWindowFlags_AlwaysAutoResize| + ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoMove|ImGuiWindowFlags_MenuBar)) + { + if(ImGui::BeginMenuBar()) { + ImGui::TextUnformatted("Profile manager"); + ImGui::EndMenuBar(); + } + + static ImGuiID backup_list_popup_id = drawBackupListPopup(); + static ImGuiID backup_popup_id = drawBackupProfilePopup(profile_index); + static ImGuiID delete_popup_id = drawDeleteProfilePopup(profile_index); + + if(ImGui::BeginTable("##ManagerLayout", 2)) { + ImGui::TableSetupColumn("##Label", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableSetupColumn("##Refresh", ImGuiTableColumnFlags_WidthFixed); + + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + ImGui::TextUnformatted("Here are the detected profiles:"); + + ImGui::TableSetColumnIndex(1); + if(ImGui::SmallButton("Refresh")) { + if(!_profileManager->refreshProfiles()) { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error in ProfileManager", _profileManager->lastError().c_str(), window()); + exit(EXIT_FAILURE); + } + } + ImGui::SameLine(); + if(ImGui::SmallButton("Backups")) { + _profileManager->refreshBackups(); + ImGui::OpenPopup(backup_list_popup_id); + } + + ImGui::EndTable(); + } + + if(ImGui::BeginTable("##Profiles", 3, ImGuiTableFlags_BordersOuter|ImGuiTableFlags_RowBg)) { + ImGui::TableSetupColumn("Company name", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableSetupColumn("Type", ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("##Buttons", ImGuiTableColumnFlags_WidthFixed); + + ImGui::TableNextRow(ImGuiTableRowFlags_Headers); + ImGui::TableSetColumnIndex(0); + ImGui::TextUnformatted("Company name"); + ImGui::TableSetColumnIndex(1); + ImGui::TextUnformatted("Type"); + ImGui::TableSetColumnIndex(2); + ImGui::TextUnformatted("Actions"); + + for(std::size_t i = 0; i < _profileManager->profiles().size(); ++i) { + ImGui::TableNextRow(); + + ImGui::TableSetColumnIndex(0); + if(ImGui::Selectable(_profileManager->profiles().at(i).companyName().c_str(), false, + ImGuiSelectableFlags_SpanAllColumns|ImGuiSelectableFlags_AllowItemOverlap)) + { + _currentProfile = _profileManager->getProfile(i); + initialiseMassManager(); + _uiState = UiState::MainManager; + } + + ImGui::TableSetColumnIndex(1); + ImGui::TextUnformatted(_profileManager->profiles().at(i).type() == ProfileType::Demo ? "Demo" : "Full"); + + ImGui::TableSetColumnIndex(2); + ImGui::PushID(i); + if(ImGui::SmallButton(ICON_FA_FILE_ARCHIVE)) { + profile_index = i; + ImGui::OpenPopup(backup_popup_id); + } + ImGui::SameLine(0.0f, 2.0f); + if(ImGui::SmallButton(ICON_FA_TRASH_ALT)) { + profile_index = i; + ImGui::OpenPopup(delete_popup_id); + } + ImGui::PopID(); + } + ImGui::EndTable(); + } + + ImGui::TextUnformatted("Click a profile to manage it."); + } + + drawBackupListPopup(); + drawBackupProfilePopup(profile_index); + drawDeleteProfilePopup(profile_index); + + ImGui::End(); +} + +auto SaveTool::drawBackupListPopup() -> ImGuiID { + ImGui::SetNextWindowPos(ImVec2{Vector2{windowSize() / 2.0f}}, ImGuiCond_Always, center_pivot); + if(!ImGui::BeginPopupModal("Backups##BackupsModal", nullptr, + ImGuiWindowFlags_AlwaysAutoResize|ImGuiWindowFlags_NoCollapse|ImGuiWindowFlags_NoMove)) + { + return ImGui::GetID("Backups##BackupsModal"); + } + + static std::size_t backup_index; + + if(ImGui::BeginPopupModal("Restore backup", nullptr, + ImGuiWindowFlags_NoCollapse|ImGuiWindowFlags_NoMove|ImGuiWindowFlags_AlwaysAutoResize)) + { + ImGui::PushTextWrapPos(windowSize().x() * 0.40f); + ImGui::Text("Are you sure you want to restore the %s backup from %.4i-%.2i-%.2i %.2i:%.2i:%.2i ? Any existing data will be overwritten.", + _profileManager->backups().at(backup_index).company.c_str(), + _profileManager->backups().at(backup_index).timestamp.year, + _profileManager->backups().at(backup_index).timestamp.month, + _profileManager->backups().at(backup_index).timestamp.day, + _profileManager->backups().at(backup_index).timestamp.hour, + _profileManager->backups().at(backup_index).timestamp.minute, + _profileManager->backups().at(backup_index).timestamp.second); + ImGui::PopTextWrapPos(); + + if(ImGui::BeginTable("##RestoreBackupLayout", 2)) { + ImGui::TableSetupColumn("##Dummy", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableSetupColumn("##YesNo", ImGuiTableColumnFlags_WidthFixed); + + ImGui::TableNextRow(); + + ImGui::TableSetColumnIndex(1); + if(ImGui::Button("Yes")) { + if(!_profileManager->restoreBackup(backup_index)) { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error when restoring backup", + _profileManager->lastError().c_str(), window()); + } + _profileManager->refreshProfiles(); + ImGui::CloseCurrentPopup(); + } + ImGui::SameLine(); + if(ImGui::Button("No", ImGui::GetItemRectSize())) { + ImGui::CloseCurrentPopup(); + } + + ImGui::EndTable(); + } + + ImGui::EndPopup(); + } + + if(ImGui::BeginPopupModal("Delete backup", nullptr, + ImGuiWindowFlags_NoCollapse|ImGuiWindowFlags_NoMove|ImGuiWindowFlags_AlwaysAutoResize)) + { + ImGui::PushTextWrapPos(windowSize().x() * 0.40f); + ImGui::Text("Are you sure you want to delete the %s backup from %.4i-%.2i-%.2i %.2i:%.2i:%.2i ? This operation is irreversible.", + _profileManager->backups().at(backup_index).company.c_str(), + _profileManager->backups().at(backup_index).timestamp.year, + _profileManager->backups().at(backup_index).timestamp.month, + _profileManager->backups().at(backup_index).timestamp.day, + _profileManager->backups().at(backup_index).timestamp.hour, + _profileManager->backups().at(backup_index).timestamp.minute, + _profileManager->backups().at(backup_index).timestamp.second); + ImGui::PopTextWrapPos(); + + if(ImGui::BeginTable("##DeleteBackupLayout", 2)) { + ImGui::TableSetupColumn("##Dummy", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableSetupColumn("##YesNo", ImGuiTableColumnFlags_WidthFixed); + + ImGui::TableNextRow(); + + ImGui::TableSetColumnIndex(1); + if(ImGui::Button("Yes")) { + if(!_profileManager->deleteBackup(backup_index)) { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error when deleting backup", + _profileManager->lastError().c_str(), window()); + } + ImGui::CloseCurrentPopup(); + } + ImGui::SameLine(); + if(ImGui::Button("No", ImGui::GetItemRectSize())) { + ImGui::CloseCurrentPopup(); + } + + ImGui::EndTable(); + } + + ImGui::EndPopup(); + } + + static ImGuiID restore_backup_popup_id = ImGui::GetID("Restore backup"); + static ImGuiID delete_backup_popup_id = ImGui::GetID("Delete backup"); + + if(ImGui::BeginTable("##BackupsLabelLayout", 2)) { + ImGui::TableSetupColumn("##Label", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableSetupColumn("##Refresh", ImGuiTableColumnFlags_WidthFixed); + + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + ImGui::TextUnformatted("Here's a list of detected backups:"); + + ImGui::TableSetColumnIndex(1); + if(ImGui::SmallButton("Refresh")) { + _profileManager->refreshBackups(); + } + + ImGui::EndTable(); + } + + if(ImGui::BeginTable("##Backups", 4, + ImGuiTableFlags_BordersOuter|ImGuiTableFlags_RowBg)) + { + ImGui::TableSetupScrollFreeze(0, 1); + ImGui::TableSetupColumn("##CompanyName", ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("##BackupDate", ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("##Type", ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("##Actions", ImGuiTableColumnFlags_WidthFixed); + + ImGui::TableNextRow(ImGuiTableRowFlags_Headers); + ImGui::TableSetColumnIndex(0); + ImGui::TextUnformatted("Company name"); + ImGui::TableSetColumnIndex(1); + ImGui::TextUnformatted("Backup date"); + ImGui::TableSetColumnIndex(2); + ImGui::TextUnformatted("Type"); + ImGui::TableSetColumnIndex(3); + ImGui::TextUnformatted("Actions"); + + for(std::size_t i = 0; i < _profileManager->backups().size(); ++i) { + ImGui::TableNextRow(); + + ImGui::TableSetColumnIndex(0); + ImGui::TextUnformatted(_profileManager->backups().at(i).company.c_str()); + if(ImGui::IsItemHovered()) { + ImGui::BeginTooltip(); + for(const auto& file : _profileManager->backups().at(i).includedFiles) { + ImGui::TextUnformatted(file.c_str()); + } + ImGui::EndTooltip(); + } + + ImGui::TableSetColumnIndex(1); + ImGui::Text("%.4i-%.2i-%.2i %.2i:%.2i:%.2i", + _profileManager->backups().at(i).timestamp.year, + _profileManager->backups().at(i).timestamp.month, + _profileManager->backups().at(i).timestamp.day, + _profileManager->backups().at(i).timestamp.hour, + _profileManager->backups().at(i).timestamp.minute, + _profileManager->backups().at(i).timestamp.second); + + ImGui::TableSetColumnIndex(2); + ImGui::TextUnformatted(_profileManager->backups().at(i).type == ProfileType::Demo ? "Demo" : "Full"); + + ImGui::TableSetColumnIndex(3); + if(ImGui::SmallButton(ICON_FA_UNDO)) { + backup_index = i; + ImGui::OpenPopup(restore_backup_popup_id); + } + ImGui::SameLine(0.0f, 2.0f); + if(ImGui::SmallButton(ICON_FA_TRASH_ALT)) { + backup_index = i; + ImGui::OpenPopup(delete_backup_popup_id); + } + } + ImGui::EndTable(); + } + + ImGui::PushTextWrapPos(ImGui::GetWindowContentRegionWidth()); + ImGui::TextUnformatted("Hover over a company name to see which files are included in the backup."); + ImGui::PopTextWrapPos(); + + if(ImGui::BeginTable("##BackupListCloseLayout", 2)) { + ImGui::TableSetupColumn("##Dummy", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableSetupColumn("##Close", ImGuiTableColumnFlags_WidthFixed); + + ImGui::TableNextRow(); + + ImGui::TableSetColumnIndex(1); + if(ImGui::Button("Close")) { + ImGui::CloseCurrentPopup(); + } + + ImGui::EndTable(); + } + + ImGui::EndPopup(); + + return 0; +} + +auto SaveTool::drawBackupProfilePopup(std::size_t profile_index) -> ImGuiID { + if(!ImGui::BeginPopupModal("Include builds ?##IncludeBuildsDialog", nullptr, + ImGuiWindowFlags_AlwaysAutoResize|ImGuiWindowFlags_NoCollapse|ImGuiWindowFlags_NoMove)) + { + return ImGui::GetID("Include builds ?##IncludeBuildsDialog"); + } + + ImGui::TextUnformatted("Should builds be added to the backup ?"); + + if(ImGui::BeginTable("##NameBackupLayout", 2)) { + ImGui::TableSetupColumn("##Dummy", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableSetupColumn("##YesNo", ImGuiTableColumnFlags_WidthFixed); + + ImGui::TableNextRow(); + + ImGui::TableSetColumnIndex(1); + if(ImGui::Button("Yes")) { + _profileManager->backupProfile(profile_index, true); + ImGui::CloseCurrentPopup(); + } + ImGui::SameLine(); + if(ImGui::Button("No", ImGui::GetItemRectSize())) { + _profileManager->backupProfile(profile_index, false); + ImGui::CloseCurrentPopup(); + } + ImGui::SameLine(); + if(ImGui::Button("Cancel")) { + ImGui::CloseCurrentPopup(); + } + + ImGui::EndTable(); + } + + ImGui::EndPopup(); + + return 0; +} + +auto SaveTool::drawDeleteProfilePopup(std::size_t profile_index) -> ImGuiID { + if(!ImGui::BeginPopupModal("Confirmation##DeleteProfileConfirmation", nullptr, + ImGuiWindowFlags_AlwaysAutoResize|ImGuiWindowFlags_NoCollapse|ImGuiWindowFlags_NoMove)) + { + return ImGui::GetID("Confirmation##DeleteProfileConfirmation"); + } + + static bool delete_builds = false; + if(ImGui::IsWindowAppearing()) { + delete_builds = false; + } + + ImGui::PushTextWrapPos(windowSize().x() * 0.40f); + ImGui::Text("Are you sure you want to delete the %s %s profile ? This operation is irreversible.", + _profileManager->profiles().at(profile_index).companyName().c_str(), + _profileManager->profiles().at(profile_index).type() == ProfileType::Demo ? "demo" : "full game"); + ImGui::PopTextWrapPos(); + + if(ImGui::BeginTable("##DeleteProfileLayout", 2)) { + ImGui::TableSetupColumn("##Checkbox", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableSetupColumn("##YesNo", ImGuiTableColumnFlags_WidthFixed); + + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + ImGui::Checkbox("Delete builds", &delete_builds); + + ImGui::TableSetColumnIndex(1); + if(ImGui::Button("Yes")) { + if(!_profileManager->deleteProfile(profile_index, delete_builds)) { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error when deleting profile", + _profileManager->lastError().c_str(), window()); + } + ImGui::CloseCurrentPopup(); + } + ImGui::SameLine(); + if(ImGui::Button("No", ImGui::GetItemRectSize())) { + ImGui::CloseCurrentPopup(); + } + + ImGui::EndTable(); + } + + ImGui::EndPopup(); + + return 0; +} diff --git a/src/SaveTool/SaveTool_drawAbout.cpp b/src/SaveTool/SaveTool_drawAbout.cpp new file mode 100644 index 0000000..83601bb --- /dev/null +++ b/src/SaveTool/SaveTool_drawAbout.cpp @@ -0,0 +1,295 @@ +// MassBuilderSaveTool +// Copyright (C) 2021 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 "SaveTool.h" + +#include + +#include +#include +#include + +#include + +#include "../FontAwesome/IconsFontAwesome5.h" +#include "../FontAwesome/IconsFontAwesome5Brands.h" + +extern const ImVec2 center_pivot; + +void SaveTool::drawAbout() { + ImGui::SetNextWindowPos(ImVec2{Vector2{windowSize() / 2.0f}}, ImGuiCond_Always, center_pivot); + ImGui::SetNextWindowSize({windowSize().x() * 0.8f, windowSize().y() * 0.75f}, ImGuiCond_Always); + + ImGui::OpenPopup("About##AboutPopup"); + if(!ImGui::BeginPopupModal("About##AboutPopup", &_aboutPopup, + ImGuiWindowFlags_NoResize|ImGuiWindowFlags_NoCollapse)) + { + return; + } + + if(ImGui::BeginTable("##TitleTable", 3)) { + ImGui::TableSetupColumn("##Empty1", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableSetupColumn("##Button", ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("##Empty2", ImGuiTableColumnFlags_WidthStretch); + + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(1); + ImGui::Text("%s ()", SDL_GetWindowTitle(window())); + + ImGui::EndTable(); + } + + ImGui::Dummy({0.0f, ImGui::GetFontSize()}); + + ImGui::TextWrapped("This application, made for the M.A.S.S. Builder community by Guillaume Jacquemin (aka William JCM), " + "is a rewrite of the wxWidgets-powered M.A.S.S. Builder Save Tool (formerly known as wxMASSManager)."); + + ImGui::AlignTextToFramePadding(); + const char* repo = "https://github.com/williamjcm/MassBuilderSaveTool"; + ImGui::Text(ICON_FA_GITHUB " %s", repo); + ImGui::SameLine(); + if(ImGui::Button("Copy to clipboard")) { + ImGui::SetClipboardText(repo); + } + ImGui::SameLine(); + if(ImGui::Button("Open in browser")) { + openUri(repo); + } + + ImGui::Separator(); + + if(ImGui::CollapsingHeader("Licence")) { + ImGui::TextWrapped("This application is made available under the terms of the GNU General Public License, version 3, the full text of which is available below:"); + + if(ImGui::BeginChild("##GPL", {0.0f, windowSize().y() * 0.3f}, true)) { + static const auto licence = _rs.get("COPYING"); + ImGui::PushFont(ImGui::GetIO().Fonts->Fonts[1]); + ImGui::TextUnformatted(licence.c_str()); + ImGui::PopFont(); + } + ImGui::EndChild(); + } + + if(ImGui::CollapsingHeader("Third-party components")) { + ImGui::TextWrapped("This application uses the following third-party components:"); + + ImGui::PushStyleVar(ImGuiStyleVar_IndentSpacing, 0.0f); + + if(ImGui::TreeNodeEx("Corrade", ImGuiTreeNodeFlags_SpanAvailWidth)) { + ImGui::Text("Version used: %s", CORRADE_VERSION_STRING); + ImGui::AlignTextToFramePadding(); + const char* corrade_website = "https://magnum.graphics/corrade"; + ImGui::Text(ICON_FA_GLOBE " %s", corrade_website); + ImGui::SameLine(); + if(ImGui::Button("Copy to clipboard")) { + ImGui::SetClipboardText(corrade_website); + } + ImGui::SameLine(); + if(ImGui::Button("Open in browser")) { + openUri(corrade_website); + } + + ImGui::TextUnformatted("Licence: MIT"); + + static const auto corrade_licence = _rs.get("COPYING.Corrade"); + if(ImGui::BeginChild("##CorradeLicence", {0.0f, windowSize().y() * 0.3f}, true)) { + ImGui::PushFont(ImGui::GetIO().Fonts->Fonts[1]); + ImGui::TextUnformatted(corrade_licence.c_str()); + ImGui::PopFont(); + } + ImGui::EndChild(); + + ImGui::TreePop(); + } + + if(ImGui::TreeNodeEx("Magnum and integration libraries", ImGuiTreeNodeFlags_SpanAvailWidth)) { + ImGui::TextUnformatted("Versions used:"); + ImGui::BulletText("Magnum: %s", MAGNUM_VERSION_STRING); + ImGui::BulletText("Integration: %s", MAGNUMINTEGRATION_VERSION_STRING); + ImGui::AlignTextToFramePadding(); + const char* magnum_website = "https://magnum.graphics"; + ImGui::Text(ICON_FA_GLOBE " %s", magnum_website); + ImGui::SameLine(); + if(ImGui::Button("Copy to clipboard")) { + ImGui::SetClipboardText(magnum_website); + } + ImGui::SameLine(); + if(ImGui::Button("Open in browser")) { + openUri(magnum_website); + } + + ImGui::TextUnformatted("Licence: MIT"); + + static const auto magnum_licence = _rs.get("COPYING.Magnum"); + if(ImGui::BeginChild("##MagnumLicence", {0.0f, windowSize().y() * 0.3f}, true)) { + ImGui::PushFont(ImGui::GetIO().Fonts->Fonts[1]); + ImGui::TextUnformatted(magnum_licence.c_str()); + ImGui::PopFont(); + } + ImGui::EndChild(); + + ImGui::TreePop(); + } + + if(ImGui::TreeNodeEx("Dear ImGui", ImGuiTreeNodeFlags_SpanAvailWidth)) { + ImGui::Text("Version used: %s", IMGUI_VERSION); + ImGui::AlignTextToFramePadding(); + const char* imgui_repo = "https://github.com/ocornut/imgui"; + ImGui::Text(ICON_FA_GITHUB " %s", imgui_repo); + ImGui::SameLine(); + if(ImGui::Button("Copy to clipboard")) { + ImGui::SetClipboardText(imgui_repo); + } + ImGui::SameLine(); + if(ImGui::Button("Open in browser")) { + openUri(imgui_repo); + } + + ImGui::TextUnformatted("Licence: MIT"); + + static const auto imgui_licence = _rs.get("LICENSE.ImGui"); + if(ImGui::BeginChild("##ImGuiLicence", {0.0f, windowSize().y() * 0.3f}, true)) { + ImGui::PushFont(ImGui::GetIO().Fonts->Fonts[1]); + ImGui::TextUnformatted(imgui_licence.c_str()); + ImGui::PopFont(); + } + ImGui::EndChild(); + + ImGui::TreePop(); + } + + if(ImGui::TreeNodeEx("Simple DirectMedia Layer (SDL) 2", ImGuiTreeNodeFlags_SpanAvailWidth)) { + ImGui::Text("Version used: %i.%i.%i", SDL_MAJOR_VERSION, SDL_MINOR_VERSION, SDL_PATCHLEVEL); + ImGui::AlignTextToFramePadding(); + const char* sdl_website = "https://www.libsdl.org/"; + ImGui::Text(ICON_FA_GLOBE " %s", sdl_website); + ImGui::SameLine(); + if(ImGui::Button("Copy to clipboard")) { + ImGui::SetClipboardText(sdl_website); + } + ImGui::SameLine(); + if(ImGui::Button("Open in browser")) { + openUri(sdl_website); + } + + ImGui::TextUnformatted("Licence: zlib"); + + static const auto sdl_licence = _rs.get("LICENSE.SDL"); + if(ImGui::BeginChild("##SDLLicence", {0.0f, windowSize().y() * 0.3f}, true)) { + ImGui::PushFont(ImGui::GetIO().Fonts->Fonts[1]); + ImGui::TextUnformatted(sdl_licence.c_str()); + ImGui::PopFont(); + } + ImGui::EndChild(); + + ImGui::TreePop(); + } + + if(ImGui::TreeNodeEx("libzip", ImGuiTreeNodeFlags_SpanAvailWidth)) { + ImGui::Text("Version used: %s", LIBZIP_VERSION); + ImGui::AlignTextToFramePadding(); + const char* libzip_website = "https://libzip.org/"; + ImGui::Text(ICON_FA_GLOBE " %s", libzip_website); + ImGui::SameLine(); + if(ImGui::Button("Copy to clipboard")) { + ImGui::SetClipboardText(libzip_website); + } + ImGui::SameLine(); + if(ImGui::Button("Open in browser")) { + openUri(libzip_website); + } + + ImGui::TextUnformatted("Licence: 3-clause BSD"); + + static const auto libzip_licence = _rs.get("LICENSE.libzip"); + if(ImGui::BeginChild("##libzipLicence", {0.0f, windowSize().y() * 0.3f}, true)) { + ImGui::PushFont(ImGui::GetIO().Fonts->Fonts[1]); + ImGui::TextUnformatted(libzip_licence.c_str()); + ImGui::PopFont(); + } + ImGui::EndChild(); + + ImGui::TreePop(); + } + + if(ImGui::TreeNodeEx("Entropia File System Watcher (efsw)", ImGuiTreeNodeFlags_SpanAvailWidth)) { + ImGui::AlignTextToFramePadding(); + const char* efsw_repo = "https://github.com/SpartanJ/efsw"; + ImGui::Text(ICON_FA_GITHUB " %s", efsw_repo); + ImGui::SameLine(); + if(ImGui::Button("Copy to clipboard")) { + ImGui::SetClipboardText(efsw_repo); + } + ImGui::SameLine(); + if(ImGui::Button("Open in browser")) { + openUri(efsw_repo); + } + + ImGui::TextUnformatted("Licence: MIT"); + + static const auto efsw_licence = _rs.get("LICENSE.efsw"); + if(ImGui::BeginChild("##efswLicence", {0.0f, windowSize().y() * 0.3f}, true)) { + ImGui::PushFont(ImGui::GetIO().Fonts->Fonts[1]); + ImGui::TextUnformatted(efsw_licence.c_str()); + ImGui::PopFont(); + } + ImGui::EndChild(); + + ImGui::TreePop(); + } + + if(ImGui::TreeNodeEx("Font Awesome", ImGuiTreeNodeFlags_SpanAvailWidth)) { + ImGui::TextUnformatted("Version used: 5.15.3"); + ImGui::AlignTextToFramePadding(); + const char* fa_website = "https://fontawesome.com/"; + ImGui::Text(ICON_FA_GLOBE " %s", fa_website); + ImGui::SameLine(); + if(ImGui::Button("Copy to clipboard")) { + ImGui::SetClipboardText(fa_website); + } + ImGui::SameLine(); + if(ImGui::Button("Open in browser")) { + openUri(fa_website); + } + + ImGui::TextUnformatted("Licence: SIL Open Font License 1.1"); + + ImGui::TreePop(); + } + + if(ImGui::TreeNodeEx("IconFontCppHeaders", ImGuiTreeNodeFlags_SpanAvailWidth)) { + ImGui::AlignTextToFramePadding(); + const char* icon_repo = "https://github.com/juliettef/IconFontCppHeaders"; + ImGui::Text(ICON_FA_GITHUB " %s", icon_repo); + ImGui::SameLine(); + if(ImGui::Button("Copy to clipboard")) { + ImGui::SetClipboardText(icon_repo); + } + ImGui::SameLine(); + if(ImGui::Button("Open in browser")) { + openUri(icon_repo); + } + + ImGui::TextUnformatted("Licence: zlib"); + + ImGui::TreePop(); + } + + ImGui::PopStyleVar(); + } + + ImGui::EndPopup(); +} diff --git a/src/SaveTool/SaveTool_drawMainMenu.cpp b/src/SaveTool/SaveTool_drawMainMenu.cpp new file mode 100644 index 0000000..663f3ea --- /dev/null +++ b/src/SaveTool/SaveTool_drawMainMenu.cpp @@ -0,0 +1,111 @@ +// MassBuilderSaveTool +// Copyright (C) 2021 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 "SaveTool.h" + +#include + +#include "../FontAwesome/IconsFontAwesome5.h" +#include "../FontAwesome/IconsFontAwesome5Brands.h" + +void SaveTool::drawMainMenu() { + if(ImGui::BeginMainMenuBar()) { + if(ImGui::BeginMenu("Save Tool##SaveToolMenu")) { + if(ImGui::BeginMenu(ICON_FA_FOLDER_OPEN " Open data directory", _mbManager != nullptr)) { + if(ImGui::MenuItem(ICON_FA_COG " Configuration", nullptr, false, _mbManager != nullptr)) { + openUri(Utility::Directory::toNativeSeparators(_mbManager->saveDirectory() + "/Saved/Config/WindowsNoEditor")); + } + + if(ImGui::MenuItem(ICON_FA_SAVE " Saves", nullptr, false, _profileManager != nullptr)) { + openUri(Utility::Directory::toNativeSeparators(_profileManager->saveDirectory())); + } + + static bool _screenshotsAvailable = Utility::Directory::exists(_mbManager->saveDirectory() + "/Saved/Screenshots/WindowsNoEditor"); + if(ImGui::MenuItem(ICON_FA_IMAGE " Screenshots", nullptr, false, _screenshotsAvailable)) { + openUri(Utility::Directory::toNativeSeparators(_mbManager->saveDirectory() + "/Screenshots/WindowsNoEditor")); + } + + ImGui::EndMenu(); + } + + ImGui::Separator(); + + if(ImGui::MenuItem(ICON_FA_SIGN_OUT_ALT " Quit##QuitMenuItem")) { + exit(EXIT_SUCCESS); + } + + ImGui::EndMenu(); + } + + if(ImGui::BeginMenu("Game##GameMenu")) { + if(ImGui::MenuItem(ICON_FA_PLAY " Run demo##RunDemoMenuItem")) { + openUri("steam://run/1048390"); + } + drawTooltip("Will not work if you have the full game."); + + if(ImGui::MenuItem(ICON_FA_PLAY " Run full game##RunFullGameMenuItem")) { + openUri("steam://run/956680"); + } + + ImGui::Separator(); + + if(ImGui::BeginMenu(ICON_FA_DISCORD " Discord communities")) { + if(ImGui::MenuItem("Official server")) { + openUri("https://discord.gg/quS7E46"); + } + + if(ImGui::MenuItem("Community server")) { + openUri("https://discord.gg/YSSRTRB"); + } + + ImGui::EndMenu(); + } + + ImGui::EndMenu(); + } + +#ifdef MANAGER_DEBUG_BUILD + if(ImGui::BeginMenu("Debug tools")) { + ImGui::MenuItem("ImGui demo window", nullptr, &_demoWindow); + ImGui::MenuItem("ImGui style editor", nullptr, &_styleEditor); + ImGui::MenuItem("ImGui metrics window", nullptr, &_metricsWindow); + + ImGui::EndMenu(); + } +#endif + + if(ImGui::BeginMenu("Help")) { + ImGui::MenuItem(ICON_FA_INFO_CIRCLE " About", nullptr, &_aboutPopup); + + ImGui::EndMenu(); + } + + if(_mbManager != nullptr) { + if(ImGui::BeginTable("##MainMenuLayout", 2)) { + ImGui::TableSetupColumn("##Dummy", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableSetupColumn("##GameState", ImGuiTableColumnFlags_WidthFixed); + + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(1); + drawGameState(); + + ImGui::EndTable(); + } + } + + ImGui::EndMainMenuBar(); + } +} diff --git a/src/assets.conf b/src/assets.conf new file mode 100644 index 0000000..544ef09 --- /dev/null +++ b/src/assets.conf @@ -0,0 +1,45 @@ +group=assets + +[file] +filename=assets/SourceSansPro-Regular.ttf +alias=SourceSansPro-Regular.ttf + +[file] +filename=assets/SourceCodePro-Regular.ttf +alias=SourceCodePro-Regular.ttf + +[file] +filename=assets/fa-solid-900.ttf +alias=fa-solid-900.ttf + +[file] +filename=assets/fa-brands-400.ttf +alias=fa-brands-400.ttf + +[file] +filename=../COPYING +alias=COPYING + +[file] +filename=../third-party/corrade/COPYING +alias=COPYING.Corrade + +[file] +filename=../third-party/magnum/COPYING +alias=COPYING.Magnum + +[file] +filename=../third-party/imgui/LICENSE.txt +alias=LICENSE.ImGui + +[file] +filename=../third-party/SDL/LICENSE.txt +alias=LICENSE.SDL + +[file] +filename=../third-party/libzip/LICENSE +alias=LICENSE.libzip + +[file] +filename=../third-party/efsw/LICENSE +alias=LICENSE.efsw diff --git a/src/assets/SourceCodePro-Regular.ttf b/src/assets/SourceCodePro-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..3563e7347be1ef18a3a447df1cd5d049cc088e14 GIT binary patch literal 192740 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 z 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 Kife4pfAxO|Kpl1f literal 0 HcmV?d00001 diff --git a/src/assets/fa-brands-400.ttf b/src/assets/fa-brands-400.ttf new file mode 100644 index 0000000000000000000000000000000000000000..fbdcc7731cd109ec5e9ad819dfac5e50925fdef1 GIT binary patch literal 134040 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 z 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

l6mbcbfmWoBMO8aM=0|w{a!>bb zpTFUTjGKOqWn80Mw`tn-H$3-8#Vq|MrC)Py-G718vgM}oyxw@95mgt5oV(MpyKU_< z*3@cG(0I;_?MZ~Av1T+9iSAA&f7LXbnzlO>x-lN#?KsV7^a-hF`Gn)NqS1Y!&;{DY z4Fok@b(d+rDIWiX>BnQOa3W(Kj>UizH@~H$Z;E-9#aKA{=18K9$LsYPNPo#cQagnZ*VTt?gUN|@1IL}9&8SCREdrcvUJ(t) z7AqdRiavp19})r$0J}wjE6sX{+^L5rca<_BtDcH~nV40(m`;8<9)@xynHw}Hxuy7z zJ`pG{K*Hee9fx%x0qtk9nwEoAQnNQ6PNqvON`1c^PbFNyW6?w-!{M zKN8nILmomfR4*TS<;d&ED!*ssH_$bBG&p~93Hoz%9=H9@zxi+4Tr#@n{;Yohi8%GB zlArmHssV{?XMff|%0|o@-#VAJ+_cA}Uegca9zAH)o?U+KdLNli9X~Q!I$9A`XEV-0 z7C;3xvDk)-b4@Xs2ZGb%quP_mAzpT=_;2?h2$pgY8F(EPMHBgQB9llHfsJIj4cTnO&eAR>oh;=OvC#%i04GEG!h$wf(yXo9 ztngr4I6Bvlx??kLqS!#Pr<0W0CGpIY@kTKopBZzb{kdp(+fvwC-fC$}OKM@?4UgV< zIXmCf)-D9Ie>jMTY{ZIL$*x3}r*Ln2I-Q@knbl zV&aap+d#KErqgUi+-f5Z>2NBO_94S`fss(Ul1?X_WU`Wnt)UZhmKL4Rj#b+@Z;!6_ z?ltzDXV|MdLeAn+B-#OLmail!z)q)Wk!Yja>Td|whc$6hSZIF838aT3p27RzXJ zedL%PyFKmMYqkl&BJ{*YIwmMfSn0GRIDN4i%>*2IMlxhjkfV7enz)H!h|Pp&tq5I5 z$u?NAQ2kUYYp;_TB|aa>{2v8=Y)?ALrC0Po#ShUG0m_1LgqaNvoKXb52ul*k3##YX zw4$ZRY+{YH5jgmwJc@+zo~D{M8^0EgfoQ#P9pcla?IpC&ry6xu)vir=VLd$>nwtx! zQeJrH&ajtCh1Jz+!HH#@EK(#EZq+Izw>62+Vce3wthHn{?4-2D`D8*}dMQ?B=AL^p z6_*CL%y)}!i=R>djJ%vB(sebO?7!{wJB_uIv6jPA)`r|1O* zj5myui(2MlsM?;Mnn>K*Ef$oQ{)dCN=4{vsbvqp&yCO9{JKhXkXcJ4mkZ3WEjg$17 z*V|T&6VsOJNECs+GqpLIZfx5b+yBm_XPS*W@2!vN~VD?AucV!e8%G_y`_>6xvsPZ!?2rnG}}U`W;`-1v<|8$-!h!OFyESMu)S zWxyUJCv|q@r1k*Aae{dNY4i*(wl<>$Z3-$n(E;rGRhpJEcL)?fG*kcgHt2v4&>%_~ z)>7+?tY!mlYv_7qGIA_!;ikB6m;s_3Opv&lI9dc5s68H~01Dw*mz3TTWxsKCBikBF zj56w$e_~tJLW6U|gKY;I+y2gQQ?i|AJ)nM2Ei+-G(OcvJO|9;nJLt)H$i5vi2LOD+ zud$zYF#3M7eNrlK+^$nX^zXd?_`kP-Tw94j4(;N^$T}#Kt0k^W;&>QT$GKxJ`V4^J z&dUgp*(j;wz@zUpB;`Qdx?3Trh7+Iusj-s|9Im$D3WUb^1Gjd@4h}}E=6p=ge1!~( z%{XM>>Q=@FSApKa&Bp&A&&sf6zS4z?WP(*mS*cU!Dl$r$C)ZDOXCA!L%U;q{yE|jO z{sk#L)-`MG!Sl(d!ZU(b>=?R}PQjTjQ2?s#C=ZUOGM=ze;I`O$jJ2xr6U9ESxN^tZ z+{~3bCR>NI0k0a@=9_^Wp9O<+A2WkUpiK_Z?!;9SuViS$6YU{_IKc6hF0cy-Y-#`H z+oWGMW0qi2{v&%5q>gLBwvt9gSTd}^v;@bb>O!3AT5J$BRwGvZJlIJIJ)ne&6bNpi^3-esm)0 zTlC&AlQ~O`&eGvzE3IA$P9#mZ88y1S@>$_fDeCFvvhGETAsZ?jPG!a?}F9i;~FO%7xUl;^J z%OA`#rBO4(*TB2kP^`GO1})O^ySLn&{$_hrsa-p(s~1rd1e8x{YnN}i76O!IFga28 zaJP}8IL~T%!RuWM%SClAnRmmETS`P=HvX0f&?kR8tj_!XzJ97wYbFypwXHv^)6G^> zfBWcFdKkVRd9m@e%Jti~%txZF$zc9jXFo@6&!@dy0$*0$o@;`NX$ zR)t^$6hJ+MfN5mIp-8NeR0q*av1kkp5hXn3QFpf8gL6*}$iW3TOF1`hIdFx2a^am*iGTh~%x8ubtd~>Du8z zxjlcR{NU%m(!Sw>OEyM6uiT|=w{nbOjB18s5VG=n`huTc(7gw4UpjnZ@x^QJRTJN) z*6rQz#{2u%k!4~r`vEk=Q8Ph-n-h*`?SZQX=FIEFQ+o$hwr-U&4qNpMgHg7 z8W=v4$Xf-x$U5lMYe!zd{lK51nuDtnXp*0eHQ{SiBmxOe2rKr#@~#5(K$Zi5p21Z_MO0~^!@j10epWjm4JD52UOYQ5N z_u}hhzJfnI`>)KQSAy|BIdUVB)_cJrzklSnM*eu@pU|pRRac{k?@jDKE{x=N@NkA1 z9h_~}Jd6GR8PI=gKsj;{iIW>U6zrUF;5+pg3^Jw28f-fHS(2Xv0x=R%mFOz6oo(Ae zfRzG13Cs*XoCLL09`GnD_)Zv%d=<7~)o?3TvPQfyo@{u48%dCwbJit7Au*=seg?5MzvC&WtkXog@Us~-TZ6wXFml;8Xs)D% zb7^fI{%Motss@7?zFodhB$jV$S|Sd=QFH*i5nu(o9kx8(6qQ~`^YhaW3m>MNT^ z*iV@zqJl%?I8&vo)OzqZTo8IQUa!;8)UelWqi*nLuM4r$dJy9h&iHs5)uJMJ>x8#v zplWlhOp2;QMq=PdNdo7Qs}NV7X24ki@-D2IQwBr>ns$|eJ+4Nz>wbd;Y;(;x&(NEa zwJ}aG_C4*DDi%{Y8YqFq&&eJsfzI)#5p`)2%^(Qfl)W~0Pa2kOb2H>&Lcnnxtf`rM z&b{A%Kq=8#p|f8?B7BNC;-$=2F^Q30qH=@zDdq?ZLz%YeI?dRFt~9BVIV%cV(3e3L zUnC(r2Ww{}2N%*_a_suYl8MU>$IN2EjJ7P*E|#Ya!}nQHG$KbPiN}cm=dPJMx50$r zE2FEc>9w+#SLT?(hiJy2-itVoUVHe?k6!ywG4O5>W|EafI? zKD1{~#B5v|PQ{ZT;9bxGOV^Y&bL%!kuPoKNPBJAy;8|g}5#V|G=~7 zl!s;x7eo{RPi*5$K9EZzd$8qj4PuVVIgHJwsXFX593%~&JI~uCEQBIeUM0$ zrW$qptny+Dz<}e}%?T}$>)0!Z$r{m1R6i?`%{P&+n!vHL^4HA%q)A6$O`U^3u_nMlT*Y=FwM z+d(4IH0KwjNR^b7*u&z!&@BWGV=311uo8m9!7U#g9=+ye1bp^?IwBzuj?$FLGc12? z_q_#5MzmAKqMpXYrJuJCnl%C}Fs(mtvQcSJ43hTBnwqE=OGROa6HY=Syzz@T>W(`} zpAFfAaVdKQN7?^_$wswaJhxw?P%d~W(sWS7o8h!axlAEa5BnT6+~A-eif#Kp9AMXE-HtY$Vrr`0npq#-S8znXN9^h2+~5BW z=hnXx6_@%8d;vrU(q0@i?iTlNGeQ=~91#$K;Np?rz_mChqGSz50~rD$O@tGPS4k-& z`vvdJp+wHfMzo3mCuGl|b_w2)qXp3x_L8HcQRXwgR6s~c9Yi$?fcqs&)#V#fM=&Si z(d)_vfdG?nC2t{n{NT`-O!LS=k*1Kvce)mrn>{fuc{@;Iau|PpMVEZa9D%ZI;BNET zYUZEDF&U*ru^BfjttO>(Ip|-k44nRgWr$;8Vl!vpigjtBr)wq4pv#IFB?*{rA=H3y zgegn~spY^(2?rMaaH(ETB$q2OHAjaH zA~)`TDSRZb22wY`?dEe)jJTi@^dTfK%YxsqIt&us2Pu!WrH4i-`P4|<2-&ZS7B}v! z2AoJCtyqI~sPRUR+8_uu1)h)OH0|3_g2=2Z3R=tx@4kGh2yg`RKzFL6&@{xHYzoH; zz=_Yii^Xa*4opPzaWWyK`QVyuAd^gb>%_)t6?ylz=_c47C!4B(jx^!b+}~ z4;ih>Xq&HXc4rF7L8V7s!^HSy(nG;aO0z`EGs4Fj1--Gdp6yIx*(fe90+t$F&Rh?9 zHHWshP&o2VD0Ufr(>Z}KX`X}~-%1d8^95O(H#DT>A=Qo5HvGWPTi`Z?5_z`_9RMv+ z=ec>*E72{{fmAyZLr4-UMpB*u?`PqykEjJOzy823Dsp@3)D=%Z{bYCP>G!|Cf9IX* z^u}p*`sh(AS5@tIf0x~093s~EqUDhG?no#Ox7hzgyWReB?a3!=>hJ>( zbc?qYK63o{clT|4_nK=|X5)uybmOV@b&f+0a^wiIc8u>J9S_pv#Jkkle0=1y2;o46 z`yCtWT2K^H*(&*NK~{i8)d+}CDaLP*#wBSe0ZqocM1y_GP*;SIP8{6(NmtD2}7UmRB{ycs}fi@RWV0M0IS zZcZCTla$?552I{w?K@#|jYq;jQPiqbjQnoH3H**ZGfh8>SaNFf+e!=4j% zFNeO(b}n-A4(VmIbekE3>CJB>)Mkxkm7QGpBG`{@=jh)lwPOcU4~orPDz&;ora<}n z+L}^-cl3*ds8X4CPfR@c;I)&>4^mlt`t;p*-yMy%g71*_OF0l9g4PH}TiLWre$8;x z+0<}hmx2e*hQ-PvI8LpVspniOV8^Ef;5V(otQVtmb~M!r4r&r-Akx(76&CK)0Scsy_C z6~b{A=^6k&C4NK4UJ&^_C@Q5uYC0`7^r7vn5E|D;5^TaOXHrqb>KHUJNy5TiHZR z#Zp;D9JdznCyd=9J3+T8!?hsmc7FU>%jHWMv8YNW_#7Mjg&u*> z9&1MS) zZ5x~f5?ruK@Qs4^z;9q{rIrrXRop_YPlDq_G&L7bm-S+7Id0)1jhsilk6Jf6k zwJrz=;?Wg18P{W-+?L>|Xl>ykdolOh1dBF;&hOaG`U1+!f5%&nuB;qYGdrJu$F6DU z0iU}2?x&tQvZi(KF8> zFrkbJ0GeQMxPffaYyj*Fe3xLyU^VEQAW$4QHXN>ljm>S8LNr-Vf>Kaz?`br`QF8B@ zOyR+3-iuAOubSF8>lKKe=lz18WT{@vWjsHwU92wGYb=)QW36hXab$)FvU^8vX%^{q0;BgBU9;hNXEUKylm z;M8qi54sJXyB@z-?{4YVZaIEv|0R0|HCevt$bt1;`{n@IW!+q5+t~gKYxmDI6S;V< zywuu%S>aX0XoGwDwE8$US$d=vd;<9kxTvH6JeX7iYd}Et+=~8(r*{{kcKdK~^ys#5 z=G2n=($|z)F@LU-Qg=4)y-8cX@ZQH4eb*ngBdNvCk)^#?HnR9jWLw-3rQNCSBVKld zdjJ22xi=4!%<-zxo1X3?t5m`zGYQrb#*PhNWDnityZ^owN|7S5-mUrl2|RV z3lN)(VQdTJ>lN^VZ3f$z8DtC?hGiJccg1 znURqvB2JuhzU}?q?^h?jF!6l_z)>XS_(9%Xq?jQ!$5s>1ZNl*#Kz5OQUI}wl;uNmV z@#ivoDKpn$kJUwS+2YQ{q{$B!r5!{v<>@4+YEX!*6&kU*7+D6RBl?T16f%4mDl1_d zK#m+mR71{Zc}dE>F>vHdwsoQ8+W@_BL#WvquK0$De%r*ZX-~dq`XIu_5B&C#y+zB? z1WOe=FX7XsUG^M1@NrDRx`%oIrhc%zBV4$%Pw+mA@ju%g&rx{iNxm% zN!_mMn+KZB$w|v8)~>irLPyB4nLWLJr7V&fAyzI;g_rL)-fwBK26atH%c!+0$P$B! zRXSQEFNyN{5KiY>F5E$-VnKb0%trXnkumHiiGRq&*)&U%Mb1YaSW1ji7G}<-Fg%hD z*C<&aNK-0iij1<|JU$p++EnupqZ~C8@kI&-8i_P1YDBt7g%YY}Ij>Vr2beC|-AZ-3 zFbS0@&x64)#v56C#D&4v<8Uw>3glY(S6W6&s|!g7M`~fXAZPV@HZFzPx!PoH9aDx_ zawA_WT9F8~|Pz)V!FQp5}@YT0Nf2C5sx0*Cb~U^U+N15=s!f%ThR? zkV#~*Y2`|CCg2{F1;~=YMoY4_p&r($ips_52JB{{bfDd+AIUmeo3Y8ti84_qH5dP% zSbFj&4+^Eo^}kFj+{Qa#A^LUK#$1TiAaceOM%WwJc-GM)awEyQX5J9ZgePMk^D~QQ zX>H=(iC>@i3r-qr@kqw}c={j=3H643Q0>w96-i%HRUM7j>OH@Lmv}OnLJUbhg)Oqv zMwpIgiF|pq(xKR58z>e`Y*2BCeH5}2W1V5n4oi$a8HLfDlg~hLF-;|0N^njJfko%Q z&OR*Ii++1aW&octTYU--$VyH~go!Nst;)EjqT^C$Q5Xg|t3~l)NsE>leNEga;|J#0 z?qab#SY)y<$>~OqD2g~fihw~m2puEzsB+vTkQC?lTzRzu1p;!>sixBECm3vKSaE`T zj0BQr+RqLfeudlL6<-3X88$PvJyuNtO*tR(Nt#TM8bDc6-BF!M(|8T@p$Dmrr0An% zCvB`CsumW|9PtX8qAqm!Y|OL3O2@TgJ&UYImaX&;D=kguTaLja@VV_GToMN)p2vRX^4olqDV|vNE zbNl-3+_iAw)n*FrhkJt_zyC`6nWFTs%^&^)btkU`eY6hx?}3Rovvrq(qPq;&2RLP^ zAQKEX)Vu+ug1rvmk_`$5Zw8Dp#K!@&0NRMSV8Dh(gf`*4K5gLX>J3-s&D}2<7rtb) zExxAy^S}M-um0Pw?!4lcAHV9V$K~nuSi_DPw^Djild=Qi4S1+^xS53493kxFtg`OD zr$?m&N`OlegRGatAWXdnVINCKgrIRqW6$*_o|aF}x0c5_jrV!nn46>6LBh&f0d9?J zu7Ab#*T3RLbH~pdpOdG%O&qeajvb~o%l2;ng>-tDg-?}Dv;TdL4u`?Nz+q6r4(hNV6eQ|`7P)Jo1K&c(GS0Ak zu-PMMgIbU2?T%8nzvCTWcn3U2&W(o;+;GDI)jPGmermlE(_(CY$JxQW9zXP=8(wz< zM2~D=KQ+F$Pyao7!@JSyXVDuj!tOc)RzqU340ub#D+#dUr9jXSqC6J@&`Y}DD8%4p z1KWS-YxDoZK3ZDfH`g8A62_bO*3s+a?c2I*jwgw( z(grmv?_dpi1Rn#;osp(5K0WG*31baD0(^WrjssK>_@y)$ibYR~e0E!Uv|8juR}qyT zZ6Y#4qG!=fSUi`b8i_2YvW`+_TACekljTGDbsIM)VKQ~`p{}OB&;Ty3z3=o&e)3Vk|JPpH zWtBqwy0HUq@?9_&MvSy8n)R$wI4Y(mtIIXbsn+I#T)Q6Be=b|g2MJ(;#2Lug1n2D> zUXJhlYo|j%1Z7%_7lSIbA~xdbDg_zrOcq5zY7wNVUjgsD#f4D}uAXrc?sek&s|64@ zI_kZyQO3jN5)Zz^{+)RG4_Tvr0i>SfYGI|};YCsGCoLPADxByjl6X&XnQB6^ zyh_>tH-LhddLX4n@zrV%2W`SpdeSya-9#wzn) zt);Zq-@kfxq{k|SqFK#k+u2~btbU$Sd6|qd46o(@U);I#9Y1>8*>}JFuB%@5;1!p@;(?vB4?T32@R_-% z(`i5P&KJJuv3K2Z`{Q%3xcu}(_g!-(Jm!&ZFy{Qe4;@po|d-tl}e8-(HdhFe2Z-4whHoB)DER=f*YpPV$`u%#lph^@;`I8%F z@J@yy<>X5#2hz1Y<;qp-RBU=y|9N;j7o}41v#%gWY;puz>zQ!2(1%hOi04qENnp1Gu*O~2HE(`#+nn@>|*8GuB+*65sm=##mPQuWFQZs>aMbbK*Z zFx>>D0-hNU9-f_^@CZEjdPZdaawjC>B$qP2h|u=WUj}C$3f6pJ4=$Ylxr<_x^#Kvz+^CUV7sq=Q^tneft}44bh~S7VKyGFRhy?DdP~vD z4(6(jD<9Z1)g4?FyP47z&pyX--syAB@!7-kd?x9IQ`sGu?ngiR(eXi_Ga%nNGjno! zn%nxUacR>JSiI+1WpX$L`yt|R3{QyC??SSOs5L#lk95HJHd^+WZRR^`H6L3Mm$WXLZ%!r`6XzLd{_FaJy16==p(=1?1-y1=@#bTT zKUOZEesFoZwNjl*8)!-Bpu6+d!$)0X?hMeAp3@JUDHC*z%g8OGe8PQ2S{EeaekiUp zc|o4-@(`Q$nX$&Ky^>D)4~Gt|4%;qah1`wHgmH3}_BM{*Wc8U|+u4*kEOS|99)0v& zn4-?pW#{Itc-EVJ^q`-gl74*dc}~Mfzbfo)&mL3HzF%Y+Fw@&6T#gh>iEsC5jFn;Ood7a6N=lS_(`MU<3 z0m;s4C4O+LFcX?v`bwcoj=Wg)csXxP}ev=5$&X(}Z=cgS zQpAK_=4mLMv<1+3_pQB*o*IQ|aApbk3C;ESJy+N}$m(b!mJ}|ff|O}O{cG@sC!Z*% zJ(vOdh%1hFhBe*?$089=)2A1;LyiNXmOTBCuKQ9j3xQ&A+Vl3Ud)|@DJ@4ot&pR>W z#f}n1vo$w#;r-M!hdhf5rE#+ zAYzwK05c2bLW1@1-;&} zJ|;U49rHIJG_i*F-5%E_5B{XwU-4x;bDm*zrvL7FT1?(u*ahJ=klPGu9F<`G#Si%W zn{@9wp%b?-J^puiRvS8=+1qr}iP;}=k{jijh2g?XdHk<>Z9aJ$Uherj6Ul2!2Vu6o=>wlBhz^F1zf4cE%yifwSQ2B` z6EIpuZ$PDBA?gWr4J8JmR^)p%!4#n1-q?OYx4LNx@O7%zRMuoA%&Vr>%=hc_TI^u9 zIMveH#=*t3*BkA8Y_3|Jt9-ARUdU!jm7Uwv)Qr_KW-8ND(^K7D*@VSV}go5rts zw$59>_%bLf_S!DYSFA57Y>UKvdE@o7MeJQ0p4XU3nKLOo;o^1HQ;C8G1*em?f`p#T zK}8#LN8i+q8oo~pE{25mGoVuOtP^_Ak=~6>0s?Dlu&r8qv=|^qRo(AqsXd_L(1w;+h@Gi&3Or2l z23aiQJ!%P{wzHJ{5}peEW=t>s6^P`^N$6T4gHH&+y{=U}vqwGd7<1DoCyeLZju#+zPI2bBrFB>`-U!XK|m(l9Dv-o-(@iv28_!KFBD`A=KiU( z$CZ|@1^H|rU_^DWG|V>&shFiDayiSM|IC8!6f((6NjSE$7YU>2MZ|MVZJ`J=&wM%X z2&EiZF3y^9vJErjG7Au*hqEhb=IYhC#;8_{Tb21rj`F|0X6DQD@5`?Q%|zB?Wvvi< zrLrRc-e$0pzn9XzB`>kP-DOR1;s^`TJHM%2%=pZ}e!ef_ONHN|6Ix=Mh>3@T#Kd?e z*Ms7mQjU+Iw5#4*EQ}Zfs0cW#td8xIA=uF_zUJUdCtJN2oPG2||K~$Ha~H4uo)K?y z@g*o|DJNtcy8q_uU;C#{DUoxj3`y+CO~ri@qk@F@^;3K9z0@_fw&LdwUw-esH--Dt zUs174XQ?NU8-%RhIdb6O37jt=L>!AkeRzBxF6g=Obwv52IxD&4nMHoj9_Ce_dZ%Nh zG4wfKmPlEVtbEew_ykA>tL=G{Ac;gOF~qo@4YkC2o)-kL=m?RnFweRp`7Dq|hO2Bu zM~Zx@Rw5bXGKEG-+aTYYxEIR-V~&?~BagtPFl*~Z;C9K;`{1b-m0I^qAF_7m3IG{;1U#wtN2 zsvb`5##qj4CbM(uV%15L+$Z<;6XXnhlX!54DtUOM1oj&FP>>IDAEkH!3j~|M)>4KM z3qY_Q5)q~JEUsEU1($*DB)K@__>agGc@;nvCRVCEY)~KAt~h(~;rx@H^9HqK!8Xe2 zYPa)WAo)$DC(o{^<=KmS8SHoFklxI?`fZbEPVAM)2cXITV%Gw675RCv;;c`v2ZqE==(hBX#Y{E&lT0N&oCDS<60YrlI`fNREynNou767ih z?OOc4QK5HuKGB#7DF7V!K$CQHX~r~cXDK^-Cx}>OOs^PP;-?(ViIXv=HK)tH=g8eL z_h^G$y9@Tx`C7~8?WgnafsutQ7Q25K_ICf-e=DPawfb3q7{()P{b&C2b~v`L-t*bV z9{cQL@A=pxk9_Qr*MHq1rky_V z%nlWU9n5Me=#KpK<|PUH#Az}|&l_VOr0K^#tF~$Tk&o^CHyVG{N5b>_Can{vcN^Qv z{QE~cb)2JZr3=GOp*%jCj5n#rP3|-nhcGa~r<4;;P$)w2mTha$l&v<1r>>4}?shs? zOikqngWEdY?iK!E;7`FCF+20}-=CZN{m-tiw`XQ%b$RjG-=C8h#;y(|_rk}gdobc) zx{}rU7O8w=?B<4OyT0^L94J6VxfKv4`-OnuOhMFN>{xrevLRc+9Er6*lw5LF`G}0B z$L;G3ZI%MN-y6vH@g4izMYcmebW@bZ{Jy8&^rolY^o6y#Y;S&TzL%Z5sF_UcE$nsm zQ>S#77m4KaHpElE*>*~Hb>~yrs$FvAWwxzeS903f>drT4W$xSAxwUyI^YE@Os}r>T zrl;&*Ff8>#aLGMwieXoau$vT{N%l`~qClRGBIYG<=@XwgL^zWwK{2Oq#M zzC;h+Gx2gfw2w~w68A~!%?Lpc?xrX}!^B3rU`pGp7)<{@p$4!+c+T-wMgN3{C-SiJ zZN`#R#1eGI5+tp?vb8 z)XQ68ZVE#uk07?Qi8!1BltIz)HQQbs@B^YcU$Bg+T)zZ~&pwEqHCh2E3@rnN@`|*g zC6j7jBXf+CDz?*{RIZxfq|${!tVU?YsKqFCYbbbhL6kM13XSE614jIAf1-YeyfK7* z4`ouSVZj}Y5i$TL(Q!x5Ymuta4y;okG}xe>D`=!b!L=;f~t zJQ1TG0$NMG9Vc!~i)T8sho+6`i|5)xoaGfAyAqfb>cLg(J8mIO!O@cIRI*7w7Ncgb zUkUI)t9EgFJKu1eMt*y{SQqrkY)LB`iApR}(c|@E!A=(puLNb6o6&Qm}#1oV)DAdEH?mEV~*0*wTGE-?w@BdIFDEM)S4b_b0?B8otc*o|HJJep~I>@(o8 z1CX1%;GdWT(eCWZ92hsZD$^2PWxTB8YQemh=|)nEJcmG?L?q+bKo;-n`_e92zqGL; zCn(2#_G3Y4gv5JKRb0+P4l5cE{{qgAT@mI8bZLOi{6dZ)CIq~<(J9M;c!*y`o-aIP z!bhhuJ{38Gs6(Rj!|Nia8C{@{XN;V!@fRVTl@nhQQ-w&Vv?}e3fF!} zF`}!byXB9zI9PP@bS_H-*E;@eWiaFbv`Hf*2kU6_goA8Sct(~iR71i?^al$Xtj*b$=2F|hz$$RZ=#NaY)XSBgSt|82=<}-7>Fu)tsuRkpQj-I08yH=~3_z+o4HM!Rs(`@T1iZy% zRf9p5OXL#Bf=q!?5rq#lTsE%9TsP%&ngT6nwXwW4OV5_M2S&W&>Zv@Kd+6KZ9{8hp z=(yzFY>S{C`P3E=XKXNXJ4O5BsI%(C?B zC4c?c;*7J~OE?Br?4jT-BG+ZC?%wCZ7X@KPCAf79vJfCYVbCBi`fVOO?3lZc_n;yXi-K#T+J zji1XT9m65@JSh@`^@=K9@oW(wvu6^Ew}=U;7zm!2KG`Z}Sv6TgMEc3%?~#aK4i{i# zL5O%S%as5rqHfDF$Rd^m1u1SoP9jZ;h0B9Q5_yC_heV`|``em@X5N52P!@3FB^18P zvF=OLl#{aJvdAI>EGLyW&dT?s;fR?WAKjaW*d!=q2=aqh$A7= zf=5Y#qnd4Xq-(sf92qPa_I+XK~WNOga z(H+#u9w!gkQ6(9;!tDb17v~rWH4HA!OtWM%#2Bb#zRHc2bD|k}y6`U=v5d;`XS=&Z z`$@)wGWzDM6-&et&2kKKQ#ox;P%wb9G%z5!*<>2($vnA!LX~SdZk%V5_uzUnVn(fQ z#u?_tY#z8W`^$G264Wf<1o0ronUnBVaL+wEVJ9L?>}S~Rd@#dpv zre`Nx2j-1J0KSH8QzQ#n0GK@j`jJ)SA<<_!I3cWI@?Xd9l?% zQI(VkOEnxVUAN5AX_r8|xsJ$v-YBP%OMR@9SxE*qb{)A=tY__;owJ95X- zqi1{UymDkBfuHO5c59)hz>&;E>~lxqY`>nkz&$W&zvBmexjkI|V-!#bP}&wO5SSpG zhP=ax8*nv3LAm=sz@vEK<%L)0omu8{zm4OIM*5n7DFkVB{y1o(6i(W0X6*NU@2B4K zmQTG!z46^wT(S5-?@0lxGxMj;tQAidKl|Am;5ByhMUy%ikQSwo#Bu8hRx=!Iu(+Md zWZZmUnnC{OIocaO(P|7%Eq~_IUp%${)c&0-UwzH-jX`ev)1O(ZHLp2DfmP2hS^#{! zi7Ni#zr;WM9x8M`377eY$xZthH6wm!;`b)LM6lEjdH9rHBBB%y1t1q#bTyCYlNA8G z_|!)>|DqxSXqDn)#5LK_LNa_uQVc_iVg&d_Y$A1|^E-&rE-JSl605+!VEJ;WFlu}l z;t>k1Kr&bjdsXf<6PGzJ$}GQyQ6bxyO=Kg5cJ@ zR2|_{YS{IxS%sP|S9T%RL6a#PULg!Jp{51dJS=$#edk(pU4N0CnN3#>zuEHjYI-(n zpEK5tYpE3p1Fe?N7L^uef_@=xP|ipzcbj~xCVb>U7Uu9 zk9t95k4zR3PBf(O7rv3 z5;DTxxFNiCxw_eMj9fcy)>65q(t7z=FK@c#ESbX{v+C0{2k1L>U!R;zG>XkMZpE5k zBni!qzu2Qp@NAx(E{EkjncB*Pu9iAx6ysX#tyade!VG#?Jef-+6PMIeDi&@x@kW9v zGw^_ZQaugdUxTQ@?acj&kyxD)F~9;CJ3v{*u?w)8*42`4<)pMzL&Cb`{Xx~TNZAFz zncxoOD`KyiX#5=^G^YO97IXn(YqW_ENc?>$fChbOH@Bg`n#9SvAdTaD#Y!c%I4B&W zjC!E}Q+mNH))FKWIHg)Pb%a#+mvtMPFhjZ5LrWPaLL4p?)DTw$dl&KUE~4ydMM@kc zl5Q^U2E}Ch@QiX^dPD_{!kfo?>CLUVE-l3U6pHWUAg7%G4O}QR3XQEfJfmll<&0-c zv0c5|H{|$KG%=IKd^~+Ph&A$%Wz~Ih;ya3{P!Ab7c2zQ{@b7D4 z+R?Rje1HTFEKE9_f4Dyb?$c;Uz=0w~?LJ|dJXRU=jsQfTU0@j5Widl^_aY>TFjC+) zz~70~>2K*$Bx#9bVSLqfG2viAUWQN^A0|w%vW#p?c1k4tA>;{=`M3o~%Zp$Qp{g<6Mm?=(Cg@$abLkIo1mzdpd3!PKb&83Z<-}5tu zIosDk-#52X&6u0DN;h@DWhWEp8`T+=3N8UHa!&@zn?183?b|tkYN&ZsFCz8AN#%?b z>5~AL;5>6jd+ceX!2a~zDmTJe|uI$_-#P7KR+CEVfv^G`yqUDms z>bPXcLY~3$CEiM40bBC146jH3n*%VB!ZUweJHwO9jdb?Q9)N9$wJy$FVYezxZ2bK@j4KH^K zRJl+irF_+ZnMX>wW%Jwyba>tKG8MFQA{mOXOx%x?#)wLtp39qNgKEd7n=I6T?x_S+ z?4pulBdbrbvl+v2N|>1&l)@H-ibwRPF{aBzR|z9-9^VeN^H`kKP#zR;;t@zS?(@%o z&~CNb7e_Hj_2}M>a(QEKx!h`(%k5VA@7wJIt(J<9MfyKpz4w}pOLMtPH?G-xbw0np z)!M)N%=|RKyF8`tMGi|mHOi1-f<WjM&tLZnP5wyw?tW4e;1_FLHe$AkV*yH zm%Q-K$6q+-pA24n{P>GcyeHZi$PTGb-SPMxcU+<_`}0<3=ZnYhK7L%51oZD5IeEW~ z&M4U9iSBp>hF*Y~B%Yboz-Fn$BNYLB!%;!CNz&;Lf9%N&cSeqp{Nt(!y9=KfH@ve8>anoU`k)>{XMWHt8wf7g)tx!>8MAY^L#ZHF$ zPwn8yQDraD=kWO$#^skZS6Z!fqJ(w!^;lwI2Bo~{x*0S#!^|h*n<}co{!cXVHsaVJ z^@J{yyDxoCS_Oas>1la|sM+1bD^7{H%aAZ?#F_(YfM}s?;cMVtg-J(ZID9|)^2eX3 zom#Iwn3_udc&av)dcyXT|CF-dUp-aBgW^C6{)GLvKd^`WzsI|fIzHaz&L?W?r)VYh z4~RdOi`aA3!_0M!79j{i=!$X z1ZJYtC@xjPS%R|}1^C@W*(S&wfY^~l<>)t@Lnqe!(_&RsORY*}IGxE%LoFVQ zog>NZkNnu(vDn@6%FP;Q&epr#+dD?Hrp~t8SEMs7()Rng)?{mSH49`x>`6ElRK&4x zl9wWUA|nxBpvB+3je!`UhXNT?h>0x-HzF7keD=|e;yD7c@51q5y~X-eAM7v1YC)=e zaI;j}JP6z_PLXxYzd^4)2lrxyq?mGGIrD3E8q30SrZCDc~Og4UDTB3JFXY0jz}~ z51m}VR(uPr#fA>XDAI#a)Gd*zwtUjTutL&`tVJFZczBf5ZHdX)Fh-j%F`BspKExf!3fa!* zQA4I^F>?K=D<}-85OvCuN9*^y)SERthd`Gxs66T_03uJEJbQ8%!SgmqzxX^HkgCEF zV%F03cC^L@tn2?b>$*3wkM~fpMfs%M2M|h(ww1m_Owe81L|z1di?^fS7Pkk4ig~nO zV8Z>?0g(X?aC^Pt10#o={0qB@FtAlk%!(_1S`;h9J+J7w?Hj2P3y8nzyB7?s>~tg7eg(YL&%~}s%6fZo$=hG`EFFV>)!_z0f@wOvJ z_Wi_}ZS`mMkKD7pv#dV6Gg$rCoiB#!Q#--l+wcAQs`|T~L+ay@hj0GJv#PKf<#Eq& z-Iwz!0Z06$FeX11;d|tACD|RKK2}o7-2*fhix>c_Olb>cxI<45(MXw8+*Z~Dmu*EQ-khKfIUnA{3ltM9)6hp-Ni|gia`NOYR zns$O)j>gUEbvhK;R?4X|W7UuZVau=Yvkw^Y6%95=uMD54p0@D;USk>qO?@SY=L=|Z z@xum`4!J4KO#iity+RcWD0;S;NmyR;TnrWTjk*4mlhEt;&(09f)v6n5YF%dX`8>}5 z+5cHC7eDl&Z1zU%NoaxHmX){d{RK`p=Pn%!f`J|<$D>sPrt9NaG{cUToWzT+8_kvx zz(}-?l76gs6yji;0ZG-k!-QyVLk~C7gwYMoSX}zIt7y)DGs2^;NDW>Fa1B9+T!Rfy zTub6yiX1@%&_oPyBams_5K`h>LMMjo(4{7oWG<^$)TWBJm123rxaRJ=2QPl{nO}=# zE}vhYGxYhzx#Q(aZ<(s?e6cn)RSQ&Su6^lf`=EMqs`htI*Uir*5{=wokZWY>_0mG8 zwlLRi4`o-iQk&ZOdbZU(%2F|rf_wET*v6j%=lJ-<`&CQ52v5!5sPCfW`dUYu(=ONU z(8yPhqFFY^O_aNjjO(xBky#loEvRKijF>+l>+qWpLS%iz3@ZfS_U&PSH66K2$b8l@ zx2p!xN1y#A@P^UXkx%1lpzB9slbon5V z(;9_s$=4c=#LUA}&2xsV7o5Od8 zp~Q?O`vJ{jxv(g4TrO@zKjLe(=|fbBu zh_#EQEuzTs=|hW!QBFDzrn! z*ic!Rkgjw&+b!-6&bbb+0|@76obkZ~2vGomU4-W;ry2jE&S_t;Jzg9keNVC z0CSR25Hz!8I*mgjU@uZY^l|YDT?EDo3F4W#5(by*7M|=jE&)()# zVWFH8k@Y8=yn>aG zpk9I?BJd>5g3&gege?IFK4BBeW+}*5=+w7*7aDu(oF`7b^1*^f6^?8*5J7dnQU|D zLja-0XN#~$Qu2;G^zrHDnr?!VA(o0;A?>Byf)+bETc+7qy`D+8ETTk2&qU42xzq|^ z$T~CqnJOg~Qr{!!0&FQx&_?K*YFU!9AoHPWAYVum;>l?^G$bgbjnJQjshEQrMre?! zKxFQaGDz`oSpG>6fDbb{M*dJ1g;<%FFym4Hj+l{n9rzx(Q^ur@avP_1y!zgU>7K*k6C zFCp=~#9d)m*2&2bRv|`^B95KPP^FRBW8p0c?tDCE#1fQhBuo}dgD#>Dv$6?K#%u}B z5>U-F<1wEzCSA~Owx-QW#v`tch~WZQV!@Mjux&WeCar5%v+3-~ka9Dzb7{{)4Wi#ws>3E-*Pnx9gn~qbEr}=!MIVR(;>vP0{D20n7Sb~d7N;PZJcxdv zP7;M@j#n$B@uYP-UTrSAN9dXaN%mwCNr|L{^?>R2ym%_TIDl3+L0XXE$BEf9fgrZV zO)ErU42EU0Vk~`$q#yW~>31CR_-v%kBu9sgg{VF#t$yr!ZrY@lu>M9qLlJ%O&H+AO1r-A%WV}xL1%VRDGG6ElQL-d~ zMKGE+R=y<*JW7VCc7BBsVc7RNfYaKDs0ZUzT03OB8@Br}s;V)TqInXEvOc zkgTzooQ-qkc0G|TLl>J<`u!49;Kp020&V6Kw^{nHlb^#X#xzUoW|omp*G=Mz%o`2Y zg8P^Nbmm3mY!D$TT6&d2>8zURqer|vL4Pt|IKg!1 zwL5}|qftA8QBA`;6!xbXdqV6MSUpa-gK8pOfR+_Tr`HkkxO{4G@JtN8pmWdEr_T|eUf@x)4g2|MToBqTZl#p#h$$bJMQiWR3!g;u6FkqtC3mU&sK z#YbSwL=Y-zh;?0nVLXewT!TlG-4Qk%9f8P3y})@zS^@|N?G9PVT5?8wK@N}-rvmFU z)}pM_%4`!YpdmSwZf8@bkp;fR2bS-pC~(0mRzBg)lndsAKL0s6A{HuJ#nY1{xE6iF z6ZGC(udYO%+8=W!<%IwL^24yHiPuy5mMS=C zMuvVRz9Odn*8~^$)GO(zSHA{fxxS%Z#r6JKg=o|LdVXyLzQ#2FYHdXGm(ev8aU+F9 zRam&`bViGoILN9@aM`Y~-PTGB6e&f;tyAjIVLI~Q=3ki|>He^O`n^iuf7r4vIdI7+ z>dZ*tRq7S&j;>M^nUv?Y9a&;vn=mxW@X!h*F}fa^`boKub<}h2K`y#S@mRi+Z=rgD zgd-dTCddeCe)|;n$M7TrhBHaxD2)p_oY9k;%H8gxR-s@5QsOP}M-(}N?Q+fnnnJtf zHJ4-)Qg!c61T!k zp!P70%kVQ$3oWN%CGSBp69Q*uFb^%-fN+art)pO@Y0L{bEB=g~&zg5&EI5M0BJ`&< zG_3*BKGxR=P=ovf(o~XRT}~B|o<>(U```zxiuGBF(B97cg(;mb(?HF|h%!t}Tt{Ah zA0Jo<8}Li1DgDUA`zF3Q@fYy<`;6~Bu&-UNu0fx8SiKXu`Z;WTY}eI(KIo4^^cPa& zfJ+F(VHgOLz=(C;8j`dhvh)FwV)>)EU=);{R}j~!)jX^50IbDgU1JTzF18D#y9^6r zY}#Ve<0y!puqJID?C!HJhxo=2Dyu6vn=mL5(RsVS6j8MS10kRq48uWR4vz>J;XJ_f zj$TkjVtG`shkYB|7AFa4$Lg>oV<*e;kUJa)X$FwDk7tXfu;Ld-ejnSvBc|`_A~Fbh zhgugY55}~HuM8kih!pelQQq*DgekD?+x9y3*zn-+hTY(*gyeu7g#*Hdnh#h2-G@LD z*J=Tlm*`U)55xcgO8-ec7=Jjh{E;R8PDF`l6FA5y0!N!|q}zbxYp!kgyIk-pTxsHc z=ZX-p(Sdy~Z6KEiC`B4p>zG6&h%oXQgECB6ej&=hXn?__%Qox>%va)-%m9fkOSDy{ z9o#0Oc=3j8Thj@>ga@5DE$lkD9g~=}YyO`~Yj2U-w-sk$VduLbEZq#jX+VxlI6)6G zBLp2ts1t~gC~}gi!ik_K0tIEJ(;l)-W~2D= zcm5o4+E}ak`eX=ORf6!Q3Me&Qw{zl%|-|tPoUw zKtRHhEd9$$!joJrSHSY6WBe03rcaVM7-4Q>Nn*)hU#DmcDupG@IpJu>tX9*!jp(-< zq5g~*3nC{if=~=q#3_hQfPf;6bwfxKX`93FhBISz;AFWCNKv^Ti~v#Hkpt|(4tO;p zn=Q@ac24R8BN^n9+-9ogddaj@_7lm@t{ZIT3S`|>dfIo7JATUF@M|@nzdcocTwunz z19rb}UrDA>ASVEuwS}$5*Fw{1V^EOk!|^Y3ue4`Ta@=FC5jxX%sx&oBaH2RF@Qm_3 zmTr*;l+kr1JQZ=HjD4&wmO+R3;?~5(FiP$hmLCCxJlo@+L*>L{EpFCTbZkje9f>Da z{)hmGj_|qpsEZ_5OYDy7%693KRj|jXZVxJFZl!(EIU?&mE`JM z)k}W;C7%1B;lbmS)h@s4u~TO9vOTe^`47z;`45%6@~&C#QeQi7+-LaO;@9ss{DYg9 z7@3xD+(RzgI-a_!JMV2Rn3+72O}FN)#?o52<`rUTy^-_)Q046G+;Vr2vlE7&!W;4x zyPW8@f?^^zYu;zh*5@b%<<;h_cct^Q#%rwEdI&xxDFeF9pRPTkUQO(#3QyhDWVgQ% z2F(vn{1MYEWU^hQZdR{R?}e-6chz5NS7_I2H)#)Ok7$o-@N9~~Xj@bpXPhJV5EX2R zY`*r=VhBn=x)npUfFLZ`ot2P(NZ826m2Jon-paSd0!98Ts4YVm5gLUiM?ol^9S|8> zwHS)bA{l?QxXP^w7^5AGUvva;dp^89?1Fs;p&qwoz%9ha@)sH4Y!|9SA8skhkL6qm z7g0+9eE|{94oGznTO%d`N(VtHMuhm-hXFwb8p9eUsh@B0GV-2qOc=dZnFs`)m=l<3 zV)J2mb?iX;gsCIG7A#=UcdLE6p)gt%x3ndbZG_L7JqvOL(RFAMu8&gFg^?I}>yPQmT>-|1eOc!KTs*i9 z_6$WMNokS$ys#Y=9TIg3ZDeIN1c4b*@2%oyz{(#DP(1qfh>i(p^CvwF`qi?zQ-N6FbR@S;f_g%AEO9ZIWJ!GUytbh@UWHe`p zOK5q%X=c%|K>wo6#)a(+6Fh%in;0zuXjfLl3x1*xZIIcPMs7)~wNa(PVqPDRY zxM7D{#266{HFPES0+G(e$ll_hlQ)>g_^y%Pk}ZKwVd^#d1x$qKAheAZh23F*9Kk!+ zSE(b%dI$IWZAoV$i4}LguI0R7ubI*GT0N7D-$a+8f&tUZlqF4|g0qld2TiuR)p)gQ zPS^FeMj2~U&-z3}pc>FN6G25Zn?k*3l&-(>;DNbIXM&x(aaX%<^$L2%tL%UA(E%90 z+2i*e*jQFha->q=6y-j|tk^#88&;puK;>?Nm_B=c+qX62DgxbN9Un*icg;VDK{A-i)%&8QCgE*k5_?v2_ze}rmjI*r|Wpe(PQcF zNK>VU>B7hY1d|vM{t)_=!fB$!h&me`3&bMIo!nvFfSE}dbCJd*8PiFd@QzEJEy%Da zR3ItNRt8Wer8-%o-RL%wQfv`aIH~jz$z`;kLYHMcv4^H-?U%!e>uJ;nV~mOC1jClQ z!l|RvN9yObsUE{cTr)zaWAq)z8;Xp<8Huw7s(%L3^IkPT4!|+Wfy6&`DgXXE2XvFr$ zvlX(W?Oc)GWg6C7CFjPO1W5rGnR{iF0!YGy9Z{8W#xg1tnLg>JbG{oY)mZ4<${9@d zGvsZ*sMe2tCB5jl> zw5LC*?Z+CHidl=)nSB9yLk~~9ZsNTYADwt=;&aqm{%g?86Xa1IS1(krRDZ1gQGK6T zJEu`;hXr^r!i)<-*52J$_SnkB*c19Fe3QGiuEY^Wl1V~48==5qVySC#e*-R5(AyKd)@9WebhmYjt}^^! zoyFtE3Bw@Gi=uQ%kLn>+q#_xIQT~21L;9!5Qi)_Br&A0gLlX9lxNBa?mkE!8g0{ay zj!E>JLrkSFfzLdZ@_c_DR~XU+_Z>1Pl}2{o%y!wP6=VE-Ud{>I*w+4PZqD9ZE0t2s z_N~ivlSz+YV^Eq7EVD7}Q(P#OtS&Y7kBY@~vwh28W*Vmcbg$6O*Oyc5aQLv{Zh($Hm8V_Uh<}zuD zN_$3|B8m`&tF3)I!|;lj`ON$G7emA1RuQ?*5%DE`rGTnH^?JKiBzoPTJBi{Nu1^P= z6jYs=n@i{O6fE`~qYQ{c)hp~)<;Zri;FtkF7a^fyr2ehSMvAyL9nD`>UDo?r!8DR9eaYVY2iKW`@0=QFvf zou{v9q&ENh{=;`v&sLg;)l-#!{v0iQpLJd*KPV1Hc>*ik#wRDmqEYdIRp$hH44l{8 zQtw-?*9`Yp;17AVk-F7N8{a1E@yo91hJGXNx}~oTe`2qbbiU`PKLLkW=VkVi=_7-~ z8v?LWB9kI)CP>X*5(pj3A^ttgEs98wBy1#wQdoa*w_?&i^Afwwx5ir|6Rv^6_b|gP zc2g{8)ver}xSy4EC!uYB5r0u?1!YF7)Jf}{0Tty(?y(#i;tYW_yzgu?$5J#i_ zYJ_Erz@s3RZNb-yR+WUwPBt;%BQFrL5)$?i=%@n9QZh5y-Ppc*aWr6}Edz>31jIFS ztz?m0gydaG>;yBBjrLhu+JinfkbR1Ssdc~YXNZ8^mFyZ$p*&wIs(i6r)Z^B@XiZRQ z=F-5S2(b7`=YXRQjdv>LgJPK$?&WB3P2{sircqM~cRxIGqE}74TYGro@0o>C(MHC= zG#LN!7}&oXNhWjt`({^%>JR;{y zC(Q4%|4*CO9X)#7HBNnZJ$&cndZE1bhQf`Rg#CEEp0%>|5qbZny}AJ?*{YOq1Zm#L zvg&pIgb3)w>T11SPuenni%)+;{S9l)Ja-YQUND-A6x`tsimI|ig*JF-K;sPvZh#WN zvjH+-k@S=PzY$!y>gxT6HPuw4i)iW&#Gz6bU#uE$Q>U*|*WU2phI$R^h$03m5%I0s#PbCGn0HXJZ4hLKvIkc zzLY`6@vGB<;nT^{?Cxj5YM%PY&_jc_c}4>_-{^?i+&p0t&}>plty95sf(M9#-Ki1Z8v^? za(>UA*>-(pxmFttWF8gZ82X0#9s1v+!b}jMtfwXx@cHhglI@X+GJp*oqE?L}=Xo#e7 zisuBp1AgR)9F~PTa<=gne=>bqK+TIB(2Q3cSKu-R0*eL~8;T#7R({w~_yEpbIWZ)` zD(Cb1kH1d6?uHKqCW!>1!!+kM`~}tRvd@Q;9^X?aTxoh)771XSSx(iA1`kTdjcj4N8nPf7t=oaVb@2 z(YB(fdDnD@rr9ygMbqf&=DeX#>dQl0QFKeAQT62Of9rM4!iUe4J#USAlP$v<&b<*0 zNVqjB(50Y%cEMg7G+_jUC?gvENeAqcgJ&32&>H4#b1r9?XZD%;QFpdjau;e)7ee|$ zoy*PHwPMNA7lIaOg;*>Z+Zy2EA&{l%)eEiHOrvA!sF~+mcg)pza@qkuvEPc~1KLC$ znfoH_z~V%cDcm6%AemKz3r}*l*fvgfTT%X%%ZHbjJDuIX5A)*CA^w(?|MUcJ_>i|e zk6*B!v-X{rg(3$V#8?-=dtc1ao)>+9PE$+<9G^e@zbQ$hfV=wQs>J9R8(`|qL8}$) zd_yVsnj2)3eoGi zH>Of=O#P#kG0mwd%jV1Kv1pU%QO{gMS=Q|zIQNx4K{G5Pgwir2SzNFrxuQF>SPW!U zmu1Jsjsg`lVhQKd0Kcn_1LeJ$VllJxZh3xFrGh@~#h>V>vcysd*W2ZKJMLZ-YvvQ> zZ0oq&42YekoH-KZ0pqZW6GXGK>dEshs2697_hu4_jECps>nnC0jOl8rPw8@hvU?c- z)}-^=?hRg0NSB&-bcuC>aVsZFRGXAF1TY!n;oFRdjKsxzlAExtVMc;Am-q`7nXUeo znxH6~zgYbP%R2tE{SSTR*s)_@w$j!mD4@Ss`|rGxt*>IM=#CRHVjB06XK_;66HFhi ziIW$%Z$1En6k7ce&S-g0aKl2hOW#P<`Qe~WwGANPAeS(UhomJ(0jhB!BJCcMaI=d& zd^o|<%-m91RzeZNXN3PtEH)YEtM?fkn`lHdC2LVzo@l) zWmWFA>aWb=hS3}4OnR}9OJ@mDsK$N_h^Cs$WwQPPb(Hs-`s|#b3YHh=u2Q8&i3K^M zu9{n1#*ml{%DrAWm?TqYhyMEyobWnDT~~-r98p&gow$pB5Y7eZ z3KuXI)8jOO1l;>0!NDg0MUPo*SOc^X-GQ2>Zot`*_9=Muv+v= z-Vs>n+tGk0hQEqSf^Zuif~YN#r{ZGhvtZ+3*!^292>k=^?4UqQ!iv7ZT5rjp&7W)x z`V4{55GaHUhv+n=V{A+K+WIsv=g$$tmEEJW27n;I?SQ-vI1Tv{yGjI1-q4!5KjrH= zl%QU+QmS@Uw_2(udJt*lbRRfwAq9>s1so^_wHNMaD+fA;5?~Tv$BKeB41Z;TqPU>f z!Mwv~g-<(45r~|G`&q>)-Hox#qfpGM#ZG)?VZCS7=DSuEv7x1>HZLk$lMtb6U<$N6 zU(OpYlwZ_BW#-1o6UQBvvMoqkZSZ3t^Wl+-8AK5^Fy~$Bn-z;S)qTu_|IzY-s$RNi zb1J2$aM>p@=J6q7G_ziS#iitHhSYMP_W1H~d5}j<*w`auJO_9uuZ=oOnwp<^Dehp) zaQtNK4yq2OTbSMHxn6I+X7%Q)ugUjSFPEF_U)EV_^Lr|xxqd%MY2-q^LkfToSR&>A zVXU|8Q-7_i`!3OIU+>ncj=$WCS3{oZhAB3as(>K@ZChGsdf66)(dY87G@H~g=y7@mFjjY4+9WhO!0&ZxJg5;MXchh z5C;Ju0|lI%R0ce+7|#|ySX(dz975PY5r-TJhbpw0n4V65bHs@l%C?0N~TTZ)}< z8JXN*T*D$miSy(409?TB2VtcP+R(uZY=CmN^pe%@CMSCzGx9wQXK$)|&Y4bUQnnf9 zg2Y>c#LRp#G4r=@`QvR(x=!ges?casTCdUcb8}95Iz10)KYeYiI~CUwjSwDsS$B7c zd%u<_J<43q2f`vtg1GWTc@_U0DcKs4I7uoZ)<=~PLQmq?lQmIYb;>tVLE%8$@ndeo z3F77M`n7K`M>88Q-DmjqcJ7`J9zT6(_NUc?c_xLwxRg(|FEL`BPPtw%tBt8WCGtJZ zcqun^?cTkU<#DZN7aR6F>Pe)ZH4%d$KSS}V7tAr7#r*->6J=dlAf$5Rh8OiH<&ntfPt`tE$jqC$dCj>0^`I$Am9wc z0K+mc46~5gk`I|c!UUT6UP;w%$7cSR`J@)T`<~u*?>+aN-#Pc3bK#>8V{?eB=jEC2 zrs92+swxi`bW?fdx(fpkAGzs-N4s0|oVaQKL;L4{JTf;wvaq)BlT&9C+iKOA?Znwr zx9#uWmYwo=rn0$wo*46AI7a1*M3HPqw&Ue$9am;KQ96}dv@(mPz@soGHJ7KD4yohQhwI}V@X5+>#W$ec_D zMa~9nvBt>yr1-buj+t206^u_F9ruZ?;S9z}%w+4MzR^gO9AoJf8SqAiB172UmV(E} zHaC;LBQxG`e8@+fFE&mlE&@T1C!7_j;B+Dt(Y!||)`kP5UC3TPeR^#zdc}2@EltNV zBAlAR-IKHr%Al!}>*{t9O!+RuM^$$wl0#$=4&%qCVjVDmdWUkZEV;r*#(c}`ZtvAI z$(R<17nmOGr8-liklBxPoE7qfKXf#S&~?p4ge3?3y0@MS3?VL4ywzusjH{g#qx4uJ{?M?46#1# zNhL$+`Q%ZhkGdE;_lfr~YSe0ar$9eDXvHX*_`acPtpOG{5x!tvFy4~3F|k3|9z;Io zOrLP|Z2QXL8~ct*i=+J6G#yEwPC{^GR8e-34Q{~k%7kZZDl-uZ-F5xf?jUV%aDp^I z*@=^sw=`FHVd5p(xsmZyES4G{ znSUk0KeLl-Q=Y5u0vvjW;<2=vZwrkkqNBJA5M?zK9Zy8ZLZs&+R7zp$VMk8p#ocHH zt4beGtDtU>HGOJ^+Tjk-k80M{%9{AZkID2D&|(YFEb|l2iD|}^LI=I^D88aB#L6Sq zsV|SYLUGi#;gtUJU^YK;Z1(o?^^x_h7hXLpJ~x)%p2Rdfv~vDO;tQwG-!2})(T*S* z%@rRNH^1uIzeIW{|7RxMlnDZ-El+HNXp!J(d@=G=oHh)&_m$Hecu&OiE2z-OFX zoESw?BTvd(a--upDykSerowp25ddh1evF6WU`ONS)x^${id<2UWi74XoQfS*m2~Qp zpeleOiIVu9*`LipMvyp_R`=WlqV+%z&45Qn|2c3f(sY6F6qG_A>D^o1T|5}ObkvE1 zNemkp)9I+pnA-6MkmP;DWFOR*C1EITCdGYeQYK>5Ct*}Ls3N>TL0$sW5S&`fKTJC5 zJ9}g7DrWOj(}_e-Ih*Z%jz<5Xo}z#rKLdZojDX?(D2T;b({>LV@83xFVYP zY%k5r`Ogs39Cyj(Ty{88U=j#B9sNX-NhYOT@#N6tN@OPCj_N^Hk&*5|6bFKy-O=fA zVlVj&^3BWa<@JnCnzN4@p)>flTGdY_Jfme(d7BohsQU1BAkXeZ*OBXqlTX`n)XbF`1MjV^@{Ep4jn~txGT6 zS~(u`pN&nAheMgz%-l1V@`Xq!5uctu@ULdBe}9}+5I`tl1p~i5ls`_q_a%$-$0L(V zr}EdmD;}4tXHJ|rvzq%xep<#yuYNW)QhszgdWh1rZy>_`4UV^C^ZBUbW6-3s;LlQx zv{F1&Oco*v0__Q^8N6p`hpicuj5Gy4)$b-GsWb*YPDoB=5BdV8AdUg{!BDwH=x zJnj^_3Kwxt0zi~9pe1|Mu0*T48OOK?`Hh54#g|Yqp=VB0PRM=ePfXWLTKwse;Xvlz z@%-!%ppTi9+`3DTuskMW-8++VJvZYDyf;BA$u*6 zTCS00@K`7_>T!i5<1@!s7m1bg${DOrL&vh<*wpX|ckFad4^6K`j|75eC7FpwM;EGD z=Hg39G!D})8Qb{5I(F1tXi}D2jon9H>K-t8Y&kQW`AmEyO7)Pm$@$^-7ns zC}q*<0+?}t!*@8HcL>q{q^+@}i2p8L+Ox_k``4lMNHsTplemwO$$$nYz>yD}3)B2> zz+%Lsu}miRrZ=5`=|U#9Fq}Vm;&}^KEI!&iV>~Ecnu(qNW-PNHj+{Ih%bb5SKm4ZW zo>;tM_e^s^{F>2gF9-bXW#YYH_O|22D)MjYhz9&%wjs&dUSh-@XOz>YAspus6`LC? zxEdZ^(%=Y;M+T!B(3@MwTy%3UH6LymKo)@PD(M4MLV}Q6Ve&1tv$cvm>xwj4_XrDC z&{Yr&iqEota+K5)Ab_MVKAg&uve-`+Zi1hpp7G5DE1cm>=1Yel8s&RWrWiew%(<@= zVV#_6q%83%$NLDTqNwJM&0Xtsd5QIq&N)Glq!1S38b@u?@dpy;9~)T_8T^fOParrP z58=^|3?VnTo?Jx#j3>eiOOYVH+sX|{i_fL;5JKV3B4LQH@rQkz`&XuCQW4!5|6$K1 zUytCB>~iR|Az8jnC<==k}6yex#bpMTmLJrz#INMP>98A{+J;UAm2@y4k! zRun`A6O145g<~W#_on#q#-6e08BM20o!NkR2i|9w_*e^ZERh(y_9MD(0cnab!WR*oulj-kj&Dy0U(p9kQIgXfNl#>6C!U97K?_nl!ji29`a;hGyq zRd^4NQP0DRDZQ4SW!g(U5w-8aGuKxplcW)<3$IEpvB zik{||d#l6}O78Yh-3%*VUU(ng4^d4hEMB|mWdJ{Rkt=*2Cq%6 z)b5jCduBB~^|P!PdXUVyIFS8V3$uiX_=$PaH?uh&I&tOk;MB2k?+5~K?2^gL^OMWD z_3+fymrVZRAEIP>(BaaAKg3iba0ZwsoXmxkn;rO1(^6qQi0RZnjVl;`m+1Zwb=4z5 zMm8RY5op9Y$)bNAwbYS1gjFiaw1!ue&j_40mAi%r`&1kbK0xH8P)Xkz$7rGWvUme> zQ;R2%`&yh70!PAn|3R2^IA>V}oJ1qa@sJB50VKH2TvsgVl4Jch(4%>g9}?NWQ1ek} zs`$b?qrhXF|FT!z7Q&w+JT)!mru59prN^RUCsuPSQ@L!!H+98nlG|VwBx^flu7wE4 z00(1?5<1JRa*#)RRR&6YAUI$s5_E1QL=WvpfWO!s}S&j8>##?f#+vmCH zX2*nw+mYrLCs;N(FmN5%8ABm1!Le8%!2c-GGXh6nF%nS0DY(OK@B*{66Ban4me4K5 zTqH&_C{L5#V_h&uHU6+ap^G`t#d7H3j51}H=uiDXV~XOL1X8TNcXV?G2#36Y>Sl<} zT2~=pJzn_D*8K6~^RL7-9(f><=FCBVwrb3%u}d4&OKon$b-$X{~i$}Bssc-|CKWNy0N?f zUlCTD070QiDatIR+*Pn31S+G+lQg7`i zkbE(7ftiHVfa0;Z9uB4x!@-CaCoKcop-?fNIIObdf-9C8TX8w@^ddLDFA}5ge6eVN zs4UVe_#@tkNXKR;qG?3}i|)_-LT#GN%295$kyyMVt6PV z!{?OrXg*geG(~npyt@M|@1WvMB(lN3$s03H3d&zTZK5FlFiZ| z?#N`bZzOe%bWUe7Q!ZzQsn@yO+D}im#xjLb#_p&%l1Z%uM-!RV@afy{KL7LZ=ETyi zC-OHO_a7O{k&86yO^K0@VlSBp64k@!JaE(##VC-$UoeoG6L}@`M}PTC@gK#@kVd19 zMZ5_dSOIAU+#abZfs;Q2NJj|c-a27Z`omm$ZlB1-;ChNPT zRE(AQz>zZ^&s~HHGmtS9WBtdz9ly)tIddBpbkFj0U9LTX-p}6zL<;LSiyO2E>-se! zGqZwBAIuNxdMe{*`e{OQU)M7>`+vZ)M+83muhrZW4Ge~;(U{|7uR$dWhaUfOI7GUc z^M7+>My2Blis2j;!*AdRLir6WsQ&Mz*<|Pt4U=XdVQHd!88@>V?5gpjrjv-9Sxt*a zJf6qAY47Jeo(ERlquJjjxFRp!gVV;5sd>;l?50F;p4EM zo={bkrbIbj8U&iqu>B}DuGmyjYii#0C#iTm_2u&?-<-@ud241-*&PxR^|* zM_xRVU7v^#jU`vckG^{R=-9WCM?P`>qFbUUL1*MCj&0m$(h?(iy@Fo`vZHo-f@4seg7S|UVB65Y^Cj5nVwx=URoF9*`Wyl z((?N3^osLY-|C<<*hVx7rjZCLrGvb+=@{HicHa(2%)bz;fhTWss`Lxs1 zGeOer_=8C-g34~H!;>zBC+WR-#Z@Q(%OE}~J=+(J(6jz4U~TEIyR{N1y}<4X1LU%l^rfAzk{o;Nx?UC1e<;m$9;>IQ)cJ(taU{L`sc za%bbtRC=V4)7+7}#))dpgqCpbXAK)CHr{}E_bWdAidTI4hvG8#k&*F5oXMtU&VTQb zeE#`UQ_ugS+aABgGdq-96qg^24PRPP`I_UHf>oUycT=Yc{3nMUGh}$ZM$LuCm9J6H zKM5D5Jb^@{50g4{u9BWX9x5ZcTB?3QZop8GVlbT9;?hg&Qjd|jT3n`<+rz#mV=3T{ z$nEVtdczH8&O9ppvDxhKT+AmPeFO80N!BfrlH~WJGs6MxQ5Fh98;itLjDy=%C*?EQ zgG5Zpl0#YTL(5GuXEV@p`$mPsRUh!DN^TBvC99d^-Z&Mr^9y=(YH0cHp49!|m|Ax& z;(yo5<(F>UEL@8d{-JE-ZGX_SIDYG^U;R-)ef_^q9GSo3s|vRac-LiW%@WaD^-2Xt zB66lC0W3VOoPM0F=lVSh-q#tI2(<4QO!7J7Uf+#ZjGb9X#%8a&`ASTz9=ZgJiu;i#?)sz$WmWE}KE6AAgTHrqa&tUg zZ0$`>-Kboxoy)ggHkI|C91R6ZN8=*l4V@U7nq*+R26#^+-|9bzPeGe_vmA~uH&_nE z1tG=QLTTu!LyGWd4TN2q${dWw6D% zL=NSfj91=NCQH^0rwi!fBe;usV7}ojWhxNa%eP!xmuJNz4?X_+haT^G!k$zr6a!kL zwc?nWNG9jO_N07I#^;mCM6j3D9o$XoXfmvLJo85}2c*=1bBu`R;EmY-$vQR%Wq~CB zjX_yb?>`=tosMY{9F&p!qA@7D9W&xPgRN@}ZvLGw>&4aQ8e|%(6cH+bL*r4ok z922X9vfJ@2a%K0g)g0@j;_8=uj_1i+24%lvNq&1!jyR4uCkExHBjhX%$}z_==e>h+ zl5@T>D5o4DSDG0t3whSX{!vA;?O;*LVK*!}=Gk7uca7eWD;@g|lNnVD{}v?pIxu!(lOpyHJbJ-iD*h&2qpmlZSR3HIB8o^r9Q( zHgZ?Bj7Hhc-C|ZcHG{AJ$=Mf<|Gz)6z&kA=+SMo1^Z(c97dDnwHkQ;`zoJ$C|0}r0 zORVrJ8_b)n_4?sgKWmSsYte|+-rF4G?2D^1?{KWGtt^pPEjRb1TJ4!FyJ|I#<@&YZ zyu(L4xr;ZR)Ki6j+V<+6gC5`LcT?d)ciaXQnY@ppm?H8*b#$G#w0o4)q}067`@6FyBee%drw)m~V|ErXj9FE&|%-p_NoV9ax%WmhIR#VYMu3EAhIooXKpq5}JmyiLuFJ}obmEWS8wpB#Yo z;wzup-A_+H{~UDt^iO(Xr2O-}Gu%ws6!`h&cR_Mb^CP~(LE&JI71NHI4#eXM(*_GD zV(bYJpR8icBjm%1k$VrtjyO}6`Nm|J6~kf#+pC%=&4~#yDW=HLlgCC#UUva*#haO= z?||fGaa633IeQK7yA834EpZF;$fe?#IF2{o<$&!g#7S`_w#8H8w76PaBc6ee-gV-7 z@l5e7Vis@2QgepPKevcm@!Wehxdon!qx$XQ`Qi?7r+5Jt$-D69Gel98L>bTYZBZf4 zu`15uQCq|K-M~8C6!)->gw48w9kD0&#Q`?*bHqa4CtgIJf|rm{=w;&N;uYe4@k;S3 z@ql*6)yH^ghjZ<255^{l4-2JuGmCh=S3HFyi&g>MtTE#5BPA>Jw8CEhK5 zN4!V8SG-TWUwlA(P<%*ySp2T|2);8PWi5%{6CW49PcDQ{FmLjQtW@|(@rd}8__X+A z@h8lDepY1+MDzPIawU9Dd|rG({JHp|_>%Yw@n!K9@woU)@vp>J#lIF`6aPkhU3^1) z6CagtiEoSVi0=~1`91M{@$bbC#D5S!L{t7x;y;W3B7TJb|9=(#joFU>A^xZMYwl<(gcV8*)=_$xGy=tUh>LUM4Rma^wnmQeG*qlBeWpd9}PoK7(wD*U9VUGacjd zS@H&Xqr6F;A+Pf-tk-*+e71a!e6D;RIVGMi?~r%O7swZqUE*$O$f7LCvNYwktjHZ% zm1pIytjW4;NJ}>5J+dWj*_ItLQS8eD*_G$yz4AW!BKczZ68Td3GWl}(3VFYLrF@lq zK)#w>6%Wc^m#<-k;MdCEl&_Pomk-G|$T!M2$={N1mT!@7m2Z>3E#EHRA>S$ACEqQ7 zN4`hCSH4faUw%M-P<}{$SpKg3hf8e=7e>J|;gWKQF%^|6G1Cyj^XX+txv$*s}I*v*oUqO{3GqD* ztZsL;vT2?(TYj@#F$*=bVwAeRie*)5W}#_xU9FDY*4owGwzcc&H0);0uy=f=n$;<9 z!^us((y7+UX4$n<-7`JaM#HkL?KTA-S+mL^tJH?)+l8{(tXW;1_bhhXrnl25?HH}L zS&r`;?b1%&XcX!eFK)G}jf!jEDtAKd{c5{?p<3Z>qhuB>Yj;owPp#V6HOtjTuu^UB zbc%z+`rs2UNtbJ`Ufk+_IWQ>mWqKly(aiQhmE-?RzhD zj<#K^mUdfCqulTotL3idaLx7x2Z%8-MO^lVwxvYQv|9C*sDYOz?X znQnWx+cbUKR;Sgkj@E9OwVLID1lm>lRPOD%_swe2(pqMNKX22hnB2p(2QOzH&^wKa z8Q81VO>6K}w_W4Kz57nxPj>UbAF|2HOiS z+BS`Pz*e7!EoL_v3fo;@+1#rdpoLc3XIq^{xkt#ZJ?gHPENIkhc+T3})pD6;Y?(!~ zrkV97Ls0em;9gFO{vDbE+H9EncCc;o4vlu9*QD~Edo&7kyw9#NSZ&DM)D%^gc3fSv z*3{?#s&GhR`$ny1w)Ik}uvfK>AltgZo3~0vtL$g5T(wJzR@50r-8}HJ?cYI_>~@Qx zuQ4Xu+x1|7b6Dl7b+7~G@~V!k)v9*eSL}3cibmNEfxjANsZDd3HLK|=ZS1f!z(*JJnX(t~QFD+OFTO)|<6%k%8a#Kx;;u2m7BGR!z_Tj?uP_ zW>crJOIEd^)fuUsdZ1eXo)xPNgK-|Tn(bLr??d(Q%x0-m;-k_O$ z6|-GvT57EM_c=*D+$ij8wy|xrs#9d5dcB6xvnOtI(>#zjk0SN{m|7Y`7Hr^+1DF6Own; zt@1&D&S)0~z}DHZi-Bef##m|>b~=r=2PWR5Ud=8s@XI`*V*;hyJN^r$LQ%25no;!a zH;ZNk?hGOAH@R=!*38CUwPm;~ic0m~XQ86eVP(?__BVqj^4JZd2}5Xy4hw~fqO9sX5``r7vL;mqf~;aRpFln)jJ;cJ3UbbEpZE@7BaTCtF@}pHhWdkjatQGm+n?a zgAB7)_mDEZ5I=(x+6Z1K6{?o)X3uQ-47*#en-J=*Zgk4(nYy9)l6l}X_HDR--721C zcV68uF}0v3>{S=U6E7KE|bx?z1uQ& z%?1*SlT0tvScadJZAF*;QlSzU&?s-YcM-uFU1Vsrskni=(qa(0Fmp6x7YTzwb%L-< zvtSf?{5kXt8MCM&BiWBz1(wXNVq<-)EG3{$l4QWD%%>u$I8I`X{HwshDo1ZR8t?6**NQ)spO=uy$O z6CR?~tLK1>8jRFzSvo^q@nc<$#KKwI*=W|C4f_&*qXW4rG+8}xE4Z+Z9II`cWxZ*D zE-WyF*-{a(mTbXjd1P0IK4|^2r(@flM#I?A_6!3t=H9ES^Lv89 zx!2eWA4LojJ0cRC@;ub&&c+|R#Me`uh-+)KyDx@iGiBiDB`j|a{yu7gE z+^%(9syCgMT?Nw^rFOvR0LsxTlp5f&5s&V@j(Jw$$)4FxQ_QGsxlNEjEBYi(3FfaT znZk1saPU8ksv3KS+8{eU{Y}Akx4TVi&DR%&3a}_-^TeJ<@z9ppscXAdi)VY`TXjXU ztaQv7h>k9t2H3 z7maM{SK2y_NZg5?0g6vfB)t=cxE#i%YCZR8NgJUdpaQLNU`kkNljI{;Of zU&Ux54zxy9sZ!3Cx#v-;?>@lX-$yPscQN&zST9+?ce7aQI`^vwF0h2<>$7(Z+q>GX zQ9&=Jp<25rU=3HpM5dqHsqS<%o)4J^xCs?07rJJt$&2kXP zMl&HhTNeCeAYuzevuicVPEdJbTWKkFw*dWPvoBO&pLPI@+~^iybhJcbzj}^gVHd3J zf_i94p)7xU2Yyyi{LS|F#<~eEKp8}C44AIB2iI*HJzg>zFeIgV8;WxP`L{I%8!X!g z0@?;oqS!dgJ2ekyA-O<{s`(EzK6^XWO5H%!hZ%sxDFC{us_QJcl4gff)y!_7#ic#e zf|-I5TV`}>HgLPNqg1d~2^?gaF1rI@=oI0Z9cQO$yE-->U8B{|jB2acDEd?%^OC@B zFJ=I0(=wV`v9rAm3h1MBh59@wG_9UQRSFl7%Lj5ZZ6tjOR<7CwzFsz!TIt|_MGC&Y+b!QKKM~*IKKO>?XRotzuUX_HG}O#{|6164s`$k literal 0 HcmV?d00001 diff --git a/src/assets/fa-solid-900.ttf b/src/assets/fa-solid-900.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b82044897cb4ca7276c62cdd31b4642639861d7b GIT binary patch literal 202744 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. + +#include "SaveTool/SaveTool.h" + +MAGNUM_SDL2APPLICATION_MAIN(SaveTool) diff --git a/src/mbst.ico b/src/mbst.ico new file mode 100644 index 0000000000000000000000000000000000000000..e87cc99b514593fbb0793210bcac495db78062f5 GIT binary patch literal 65992 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%0Ay`d%J2 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 literal 0 HcmV?d00001 diff --git a/src/mbst.png b/src/mbst.png new file mode 100644 index 0000000000000000000000000000000000000000..a9e2141f4b57a759e6d5aabad06bf962e548f8e9 GIT binary patch literal 18277 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. + +MAINICON ICON "mbst.ico" + +1 24 "Application.manifest" diff --git a/third-party/SDL b/third-party/SDL new file mode 160000 index 0000000..d956636 --- /dev/null +++ b/third-party/SDL @@ -0,0 +1 @@ +Subproject commit d956636c85aafc055d37153d52370e9b1c2c5929 diff --git a/third-party/corrade b/third-party/corrade new file mode 160000 index 0000000..76d5492 --- /dev/null +++ b/third-party/corrade @@ -0,0 +1 @@ +Subproject commit 76d54922ba22e6a1abfffb5c9dc1012dfbae149e diff --git a/third-party/efsw b/third-party/efsw new file mode 160000 index 0000000..6fb0c9c --- /dev/null +++ b/third-party/efsw @@ -0,0 +1 @@ +Subproject commit 6fb0c9ccd284445330723914249b7be46798ee76 diff --git a/third-party/imgui b/third-party/imgui new file mode 160000 index 0000000..94b680e --- /dev/null +++ b/third-party/imgui @@ -0,0 +1 @@ +Subproject commit 94b680e83052b9ff2e877360309020b72db057f2 diff --git a/third-party/libzip b/third-party/libzip new file mode 160000 index 0000000..821cbfe --- /dev/null +++ b/third-party/libzip @@ -0,0 +1 @@ +Subproject commit 821cbfe1b260193563b04d3db1bb7eb4a4ed0d8a diff --git a/third-party/magnum b/third-party/magnum new file mode 160000 index 0000000..dd3ce93 --- /dev/null +++ b/third-party/magnum @@ -0,0 +1 @@ +Subproject commit dd3ce93888ada70074d63d72c5998d950fa2eba6 diff --git a/third-party/magnum-integration b/third-party/magnum-integration new file mode 160000 index 0000000..73018a6 --- /dev/null +++ b/third-party/magnum-integration @@ -0,0 +1 @@ +Subproject commit 73018a6d5daf04ef69449e82fa757c3acf797b1b