diff --git a/.github/workflows/create_release.yaml b/.github/workflows/create_release.yaml
new file mode 100644
index 0000000..9dd06f3
--- /dev/null
+++ b/.github/workflows/create_release.yaml
@@ -0,0 +1,48 @@
+name: Create Release
+
+on:
+ workflow_dispatch:
+ inputs:
+ version:
+ description: 'Release version number'
+ required: true
+
+jobs:
+ build:
+ runs-on: windows-latest
+ permissions:
+ contents: write
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ submodules: recursive
+
+ - name: setup-msbuild
+ uses: microsoft/setup-msbuild@v1.1
+
+ - run: msbuild ${{ github.event.repository.name }}.sln -t:rebuild -verbosity:diag -property:Configuration=Release -property:Platform=x64
+ - run: cp x64\Release\${{ github.event.repository.name }}.asi ./${{ github.event.repository.name }}.asi
+
+ - uses: robinraju/release-downloader@v1.8
+ with:
+ repository: "ThirteenAG/Ultimate-ASI-Loader"
+ latest: true
+ fileName: "Ultimate-ASI-Loader_x64.zip"
+ - run: unzip Ultimate-ASI-Loader_x64.zip -d .\
+ - run: C:\msys64\usr\bin\wget.exe -O .\UltimateASILoader_LICENSE.md https://raw.githubusercontent.com/ThirteenAG/Ultimate-ASI-Loader/master/license
+ - run: cp .\dinput8.dll .\wininet.dll
+ - run: mv .\dinput8.dll .\winhttp.dll
+ - run: cp .\README.md .\${{ github.event.repository.name }}_README.md
+ - run: 7z a -tzip ${{ github.event.repository.name }}_${{ github.event.inputs.version }}.zip wininet.dll winhttp.dll UltimateASILoader_LICENSE.md ${{ github.event.repository.name }}.asi ${{ github.event.repository.name }}_README.md ${{ github.event.repository.name }}.ini
+ - run: 7z a ${{ github.event.repository.name }}_${{ github.event.inputs.version }}.zip assets\
+
+ - uses: ncipollo/release-action@v1
+ with:
+ artifacts: "${{ github.event.repository.name }}_${{ github.event.inputs.version }}.zip"
+ token: ${{ secrets.GITHUB_TOKEN }}
+ tag: ${{ github.event.inputs.version }}
+ name: "${{ github.event.inputs.version }}"
+ draft: true
+ generateReleaseNotes: true
+ artifactErrorsFailBuild: true
+
diff --git a/.github/workflows/msbuild.yml b/.github/workflows/msbuild.yml
new file mode 100644
index 0000000..c37cc67
--- /dev/null
+++ b/.github/workflows/msbuild.yml
@@ -0,0 +1,28 @@
+name: CI Builds
+
+on:
+ push:
+ branches: [ "master", "main" ]
+ pull_request:
+ branches: [ "master", "main" ]
+
+permissions:
+ contents: read
+
+jobs:
+ build:
+ runs-on: windows-latest
+
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ submodules: recursive
+
+ - name: setup-msbuild
+ uses: microsoft/setup-msbuild@v1.1
+
+ - run: msbuild ${{ github.event.repository.name }}.sln -t:rebuild -verbosity:diag -property:Configuration=Release -property:Platform=x64
+ - run: cp x64\Release\${{ github.event.repository.name }}.asi ./${{ github.event.repository.name }}.asi
+ - run: cp .\README.md .\${{ github.event.repository.name }}_README.md
+ - run: 7z a -tzip ${{ github.event.repository.name }}-run-${{ github.run_number }} ${{ github.event.repository.name }}.ini ${{ github.event.repository.name }}_README.md ${{ github.event.repository.name }}.asi
+ - run: 7z a ${{ github.event.repository.name }}-run-${{ github.run_number }} assets\
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..d30549d
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,6 @@
+[submodule "external/minhook"]
+ path = external/minhook
+ url = https://github.com/TsudaKageyu/minhook
+[submodule "external/mINI"]
+ path = external/mINI
+ url = https://github.com/metayeti/mINI
diff --git a/MGS3CrouchWalk.ini b/MGS3CrouchWalk.ini
new file mode 100644
index 0000000..ee9da97
--- /dev/null
+++ b/MGS3CrouchWalk.ini
@@ -0,0 +1,5 @@
+[Settings]
+CamoIndexModifier = 1.0
+CamoIndexValue = -10
+CrouchWalkSpeed = 5.5
+CrouchStalkSpeed = 3.0
\ No newline at end of file
diff --git a/MGS3CrouchWalk.sln b/MGS3CrouchWalk.sln
index 27a16d3..d9dbd8c 100644
--- a/MGS3CrouchWalk.sln
+++ b/MGS3CrouchWalk.sln
@@ -4,6 +4,11 @@ Microsoft Visual Studio Solution File, Format Version 12.00
VisualStudioVersion = 17.7.34031.279
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MGS3CrouchWalk", "MGS3CrouchWalk\MGS3CrouchWalk.vcxproj", "{FE4A0B03-4DC5-4685-8D43-05F8C481C981}"
+ ProjectSection(ProjectDependencies) = postProject
+ {F142A341-5EE0-442D-A15F-98AE9B48DBAE} = {F142A341-5EE0-442D-A15F-98AE9B48DBAE}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libMinHook", "external\minhook\build\VC17\libMinHook.vcxproj", "{F142A341-5EE0-442D-A15F-98AE9B48DBAE}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -21,6 +26,14 @@ Global
{FE4A0B03-4DC5-4685-8D43-05F8C481C981}.Release|x64.Build.0 = Release|x64
{FE4A0B03-4DC5-4685-8D43-05F8C481C981}.Release|x86.ActiveCfg = Release|Win32
{FE4A0B03-4DC5-4685-8D43-05F8C481C981}.Release|x86.Build.0 = Release|Win32
+ {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x64.ActiveCfg = Debug|x64
+ {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x64.Build.0 = Debug|x64
+ {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x86.ActiveCfg = Debug|Win32
+ {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x86.Build.0 = Debug|Win32
+ {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|x64.ActiveCfg = Release|x64
+ {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|x64.Build.0 = Release|x64
+ {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|x86.ActiveCfg = Release|Win32
+ {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/MGS3CrouchWalk/MGS3CrouchWalk.vcxproj b/MGS3CrouchWalk/MGS3CrouchWalk.vcxproj
index 345ca69..2f21e15 100644
--- a/MGS3CrouchWalk/MGS3CrouchWalk.vcxproj
+++ b/MGS3CrouchWalk/MGS3CrouchWalk.vcxproj
@@ -72,9 +72,13 @@
.asi
+ ..\external\mINI\src\mini;..\external\minhook\include;$(ExternalIncludePath)
.asi
+ ..\external\mINI\src\mini;..\external\minhook\include;$(ExternalIncludePath)
+
+
@@ -119,12 +123,13 @@
NotUsing
pch.h
stdcpplatest
+ true
Windows
true
false
- $(CoreLibraryDependencies);%(AdditionalDependencies);$(SolutionDir)\libMinHook.lib;
+ $(CoreLibraryDependencies);%(AdditionalDependencies);$(SolutionDir)lib\$(Configuration)\libMinHook.x64.lib
@@ -140,6 +145,7 @@
MaxSpeed
false
stdcpplatest
+ true
Windows
@@ -147,7 +153,7 @@
true
true
false
- $(CoreLibraryDependencies);%(AdditionalDependencies);$(SolutionDir)\libMinHook.lib;Shlwapi.lib
+ $(CoreLibraryDependencies);%(AdditionalDependencies);$(SolutionDir)lib\$(Configuration)\libMinHook.x64.lib;Shlwapi.lib
diff --git a/MGS3CrouchWalk/MinHook.h b/MGS3CrouchWalk/MinHook.h
deleted file mode 100644
index d0509eb..0000000
--- a/MGS3CrouchWalk/MinHook.h
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * MinHook - The Minimalistic API Hooking Library for x64/x86
- * Copyright (C) 2009-2017 Tsuda Kageyu.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
- * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
- * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#if !(defined _M_IX86) && !(defined _M_X64) && !(defined __i386__) && !(defined __x86_64__)
-#error MinHook supports only x86 and x64 systems.
-#endif
-
-#include
-
- // MinHook Error Codes.
-typedef enum MH_STATUS
-{
- // Unknown error. Should not be returned.
- MH_UNKNOWN = -1,
-
- // Successful.
- MH_OK = 0,
-
- // MinHook is already initialized.
- MH_ERROR_ALREADY_INITIALIZED,
-
- // MinHook is not initialized yet, or already uninitialized.
- MH_ERROR_NOT_INITIALIZED,
-
- // The hook for the specified target function is already created.
- MH_ERROR_ALREADY_CREATED,
-
- // The hook for the specified target function is not created yet.
- MH_ERROR_NOT_CREATED,
-
- // The hook for the specified target function is already enabled.
- MH_ERROR_ENABLED,
-
- // The hook for the specified target function is not enabled yet, or already
- // disabled.
- MH_ERROR_DISABLED,
-
- // The specified pointer is invalid. It points the address of non-allocated
- // and/or non-executable region.
- MH_ERROR_NOT_EXECUTABLE,
-
- // The specified target function cannot be hooked.
- MH_ERROR_UNSUPPORTED_FUNCTION,
-
- // Failed to allocate memory.
- MH_ERROR_MEMORY_ALLOC,
-
- // Failed to change the memory protection.
- MH_ERROR_MEMORY_PROTECT,
-
- // The specified module is not loaded.
- MH_ERROR_MODULE_NOT_FOUND,
-
- // The specified function is not found.
- MH_ERROR_FUNCTION_NOT_FOUND
-}
-MH_STATUS;
-
-// Can be passed as a parameter to MH_EnableHook, MH_DisableHook,
-// MH_QueueEnableHook or MH_QueueDisableHook.
-#define MH_ALL_HOOKS NULL
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- // Initialize the MinHook library. You must call this function EXACTLY ONCE
- // at the beginning of your program.
- MH_STATUS WINAPI MH_Initialize(VOID);
-
- // Uninitialize the MinHook library. You must call this function EXACTLY
- // ONCE at the end of your program.
- MH_STATUS WINAPI MH_Uninitialize(VOID);
-
- // Creates a Hook for the specified target function, in disabled state.
- // Parameters:
- // pTarget [in] A pointer to the target function, which will be
- // overridden by the detour function.
- // pDetour [in] A pointer to the detour function, which will override
- // the target function.
- // ppOriginal [out] A pointer to the trampoline function, which will be
- // used to call the original target function.
- // This parameter can be NULL.
- MH_STATUS WINAPI MH_CreateHook(LPVOID pTarget, LPVOID pDetour, LPVOID* ppOriginal);
-
- // Creates a Hook for the specified API function, in disabled state.
- // Parameters:
- // pszModule [in] A pointer to the loaded module name which contains the
- // target function.
- // pszTarget [in] A pointer to the target function name, which will be
- // overridden by the detour function.
- // pDetour [in] A pointer to the detour function, which will override
- // the target function.
- // ppOriginal [out] A pointer to the trampoline function, which will be
- // used to call the original target function.
- // This parameter can be NULL.
- MH_STATUS WINAPI MH_CreateHookApi(
- LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID* ppOriginal);
-
- // Creates a Hook for the specified API function, in disabled state.
- // Parameters:
- // pszModule [in] A pointer to the loaded module name which contains the
- // target function.
- // pszTarget [in] A pointer to the target function name, which will be
- // overridden by the detour function.
- // pDetour [in] A pointer to the detour function, which will override
- // the target function.
- // ppOriginal [out] A pointer to the trampoline function, which will be
- // used to call the original target function.
- // This parameter can be NULL.
- // ppTarget [out] A pointer to the target function, which will be used
- // with other functions.
- // This parameter can be NULL.
- MH_STATUS WINAPI MH_CreateHookApiEx(
- LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID* ppOriginal, LPVOID* ppTarget);
-
- // Removes an already created hook.
- // Parameters:
- // pTarget [in] A pointer to the target function.
- MH_STATUS WINAPI MH_RemoveHook(LPVOID pTarget);
-
- // Enables an already created hook.
- // Parameters:
- // pTarget [in] A pointer to the target function.
- // If this parameter is MH_ALL_HOOKS, all created hooks are
- // enabled in one go.
- MH_STATUS WINAPI MH_EnableHook(LPVOID pTarget);
-
- // Disables an already created hook.
- // Parameters:
- // pTarget [in] A pointer to the target function.
- // If this parameter is MH_ALL_HOOKS, all created hooks are
- // disabled in one go.
- MH_STATUS WINAPI MH_DisableHook(LPVOID pTarget);
-
- // Queues to enable an already created hook.
- // Parameters:
- // pTarget [in] A pointer to the target function.
- // If this parameter is MH_ALL_HOOKS, all created hooks are
- // queued to be enabled.
- MH_STATUS WINAPI MH_QueueEnableHook(LPVOID pTarget);
-
- // Queues to disable an already created hook.
- // Parameters:
- // pTarget [in] A pointer to the target function.
- // If this parameter is MH_ALL_HOOKS, all created hooks are
- // queued to be disabled.
- MH_STATUS WINAPI MH_QueueDisableHook(LPVOID pTarget);
-
- // Applies all queued changes in one go.
- MH_STATUS WINAPI MH_ApplyQueued(VOID);
-
- // Translates the MH_STATUS to its name as a string.
- const char* WINAPI MH_StatusToString(MH_STATUS status);
-
-#ifdef __cplusplus
-}
-#endif
-
diff --git a/MGS3CrouchWalk/dllmain.cpp b/MGS3CrouchWalk/dllmain.cpp
index 0ead760..3437c72 100644
--- a/MGS3CrouchWalk/dllmain.cpp
+++ b/MGS3CrouchWalk/dllmain.cpp
@@ -1,3 +1,6 @@
+#include
+#include
+#include
#include
#include "Memory.h"
#include "MinHook.h"
@@ -201,8 +204,42 @@ void InstallHooks()
void ReadConfig()
{
- mINI::INIFile file("MGS3CrouchWalk.ini");
- file.read(Config);
+ WCHAR exePath[MAX_PATH] = { 0 };
+ GetModuleFileNameW(GameModule, exePath, MAX_PATH);
+ std::filesystem::path pModPath = std::filesystem::path(exePath).remove_filename();
+ bool bFoundOnce = false;
+ std::array paths = { "", "plugins", "scripts", "update" };
+ for (const auto& path : paths)
+ {
+ auto filePath = pModPath / path / "MGS3CrouchWalk.asi";
+ if (std::filesystem::exists(filePath))
+ {
+ if (bFoundOnce) //multiple versions found
+ {
+ AllocConsole();
+ FILE* dummy;
+ freopen_s(&dummy, "CONOUT$", "w", stdout);
+ std::string errorMessage = "DUPLICATE FILE ERROR: Duplicate MGS3CrouchWalk.asi installations found! Please make sure to delete any old versions!\n";
+ errorMessage.append("DUPLICATE FILE ERROR - Installation 1: ").append((pModPath / "MGS3CrouchWalk.asi").string()).append("\n");
+ errorMessage.append("DUPLICATE FILE ERROR - Installation 2: ").append(filePath.string());
+ std::cout << errorMessage << std::endl;
+ return FreeLibraryAndExitThread(GameModule, 1);
+ }
+ bFoundOnce = true;
+ pModPath = filePath.parent_path();
+ }
+ }
+ mINI::INIFile iniFile((pModPath / "MGS3CrouchWalk.ini").string());
+ if (!iniFile.read(Config))
+ {
+ AllocConsole();
+ FILE* dummy;
+ freopen_s(&dummy, "CONOUT$", "w", stdout);
+ std::cout << "MGS3CrouchWalk Error: Could not find MGS3CrouchWalk.ini in " << pModPath << std::endl;
+ std::cout << "MGS3CrouchWalk Error: Please make sure the config file is in the same folder as MGS3CrouchWalk.asi." << std::endl;
+ return FreeLibraryAndExitThread(GameModule, 1);
+ }
+
CamoIndexModifier = std::stof(Config["Settings"]["CamoIndexModifier"]);
CamoIndexValue = std::stoi(Config["Settings"]["CamoIndexValue"]) * 10;
CrouchWalkSpeed = std::stof(Config["Settings"]["CrouchWalkSpeed"]);
diff --git a/MGS3CrouchWalk/ini.h b/MGS3CrouchWalk/ini.h
deleted file mode 100644
index 1adc2fb..0000000
--- a/MGS3CrouchWalk/ini.h
+++ /dev/null
@@ -1,789 +0,0 @@
-/*
- * The MIT License (MIT)
- * Copyright (c) 2018 Danijel Durakovic
- *
- * 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.
- *
- */
-
- ///////////////////////////////////////////////////////////////////////////////
- //
- // /mINI/ v0.9.14
- // An INI file reader and writer for the modern age.
- //
- ///////////////////////////////////////////////////////////////////////////////
- //
- // A tiny utility library for manipulating INI files with a straightforward
- // API and a minimal footprint. It conforms to the (somewhat) standard INI
- // format - sections and keys are case insensitive and all leading and
- // trailing whitespace is ignored. Comments are lines that begin with a
- // semicolon. Trailing comments are allowed on section lines.
- //
- // Files are read on demand, upon which data is kept in memory and the file
- // is closed. This utility supports lazy writing, which only writes changes
- // and updates to a file and preserves custom formatting and comments. A lazy
- // write invoked by a write() call will read the output file, find what
- // changes have been made and update the file accordingly. If you only need to
- // generate files, use generate() instead. Section and key order is preserved
- // on read, write and insert.
- //
- ///////////////////////////////////////////////////////////////////////////////
- //
- // /* BASIC USAGE EXAMPLE: */
- //
- // /* read from file */
- // mINI::INIFile file("myfile.ini");
- // mINI::INIStructure ini;
- // file.read(ini);
- //
- // /* read value; gets a reference to actual value in the structure.
- // if key or section don't exist, a new empty value will be created */
- // std::string& value = ini["section"]["key"];
- //
- // /* read value safely; gets a copy of value in the structure.
- // does not alter the structure */
- // std::string value = ini.get("section").get("key");
- //
- // /* set or update values */
- // ini["section"]["key"] = "value";
- //
- // /* set multiple values */
- // ini["section2"].set({
- // {"key1", "value1"},
- // {"key2", "value2"}
- // });
- //
- // /* write updates back to file, preserving comments and formatting */
- // file.write(ini);
- //
- // /* or generate a file (overwrites the original) */
- // file.generate(ini);
- //
- ///////////////////////////////////////////////////////////////////////////////
- //
- // Long live the INI file!!!
- //
- ///////////////////////////////////////////////////////////////////////////////
-
-#ifndef MINI_INI_H_
-#define MINI_INI_H_
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-namespace mINI
-{
- namespace INIStringUtil
- {
- const char* const whitespaceDelimiters = " \t\n\r\f\v";
- inline void trim(std::string& str)
- {
- str.erase(str.find_last_not_of(whitespaceDelimiters) + 1);
- str.erase(0, str.find_first_not_of(whitespaceDelimiters));
- }
-#ifndef MINI_CASE_SENSITIVE
- inline void toLower(std::string& str)
- {
- std::transform(str.begin(), str.end(), str.begin(), [](const char c) {
- return static_cast(std::tolower(c));
- });
- }
-#endif
- inline void replace(std::string& str, std::string const& a, std::string const& b)
- {
- if (!a.empty())
- {
- std::size_t pos = 0;
- while ((pos = str.find(a, pos)) != std::string::npos)
- {
- str.replace(pos, a.size(), b);
- pos += b.size();
- }
- }
- }
-#ifdef _WIN32
- const char* const endl = "\r\n";
-#else
- const char* const endl = "\n";
-#endif
- }
-
- template
- class INIMap
- {
- private:
- using T_DataIndexMap = std::unordered_map;
- using T_DataItem = std::pair;
- using T_DataContainer = std::vector;
- using T_MultiArgs = typename std::vector>;
-
- T_DataIndexMap dataIndexMap;
- T_DataContainer data;
-
- inline std::size_t setEmpty(std::string& key)
- {
- std::size_t index = data.size();
- dataIndexMap[key] = index;
- data.emplace_back(key, T());
- return index;
- }
-
- public:
- using const_iterator = typename T_DataContainer::const_iterator;
-
- INIMap() { }
-
- INIMap(INIMap const& other)
- {
- std::size_t data_size = other.data.size();
- for (std::size_t i = 0; i < data_size; ++i)
- {
- auto const& key = other.data[i].first;
- auto const& obj = other.data[i].second;
- data.emplace_back(key, obj);
- }
- dataIndexMap = T_DataIndexMap(other.dataIndexMap);
- }
-
- T& operator[](std::string key)
- {
- INIStringUtil::trim(key);
-#ifndef MINI_CASE_SENSITIVE
- INIStringUtil::toLower(key);
-#endif
- auto it = dataIndexMap.find(key);
- bool hasIt = (it != dataIndexMap.end());
- std::size_t index = (hasIt) ? it->second : setEmpty(key);
- return data[index].second;
- }
- T get(std::string key) const
- {
- INIStringUtil::trim(key);
-#ifndef MINI_CASE_SENSITIVE
- INIStringUtil::toLower(key);
-#endif
- auto it = dataIndexMap.find(key);
- if (it == dataIndexMap.end())
- {
- return T();
- }
- return T(data[it->second].second);
- }
- bool has(std::string key) const
- {
- INIStringUtil::trim(key);
-#ifndef MINI_CASE_SENSITIVE
- INIStringUtil::toLower(key);
-#endif
- return (dataIndexMap.count(key) == 1);
- }
- void set(std::string key, T obj)
- {
- INIStringUtil::trim(key);
-#ifndef MINI_CASE_SENSITIVE
- INIStringUtil::toLower(key);
-#endif
- auto it = dataIndexMap.find(key);
- if (it != dataIndexMap.end())
- {
- data[it->second].second = obj;
- }
- else
- {
- dataIndexMap[key] = data.size();
- data.emplace_back(key, obj);
- }
- }
- void set(T_MultiArgs const& multiArgs)
- {
- for (auto const& it : multiArgs)
- {
- auto const& key = it.first;
- auto const& obj = it.second;
- set(key, obj);
- }
- }
- bool remove(std::string key)
- {
- INIStringUtil::trim(key);
-#ifndef MINI_CASE_SENSITIVE
- INIStringUtil::toLower(key);
-#endif
- auto it = dataIndexMap.find(key);
- if (it != dataIndexMap.end())
- {
- std::size_t index = it->second;
- data.erase(data.begin() + index);
- dataIndexMap.erase(it);
- for (auto& it2 : dataIndexMap)
- {
- auto& vi = it2.second;
- if (vi > index)
- {
- vi--;
- }
- }
- return true;
- }
- return false;
- }
- void clear()
- {
- data.clear();
- dataIndexMap.clear();
- }
- std::size_t size() const
- {
- return data.size();
- }
- const_iterator begin() const { return data.begin(); }
- const_iterator end() const { return data.end(); }
- };
-
- using INIStructure = INIMap>;
-
- namespace INIParser
- {
- using T_ParseValues = std::pair;
-
- enum class PDataType : char
- {
- PDATA_NONE,
- PDATA_COMMENT,
- PDATA_SECTION,
- PDATA_KEYVALUE,
- PDATA_UNKNOWN
- };
-
- inline PDataType parseLine(std::string line, T_ParseValues& parseData)
- {
- parseData.first.clear();
- parseData.second.clear();
- INIStringUtil::trim(line);
- if (line.empty())
- {
- return PDataType::PDATA_NONE;
- }
- char firstCharacter = line[0];
- if (firstCharacter == ';')
- {
- return PDataType::PDATA_COMMENT;
- }
- if (firstCharacter == '[')
- {
- auto commentAt = line.find_first_of(';');
- if (commentAt != std::string::npos)
- {
- line = line.substr(0, commentAt);
- }
- auto closingBracketAt = line.find_last_of(']');
- if (closingBracketAt != std::string::npos)
- {
- auto section = line.substr(1, closingBracketAt - 1);
- INIStringUtil::trim(section);
- parseData.first = section;
- return PDataType::PDATA_SECTION;
- }
- }
- auto lineNorm = line;
- INIStringUtil::replace(lineNorm, "\\=", " ");
- auto equalsAt = lineNorm.find_first_of('=');
- if (equalsAt != std::string::npos)
- {
- auto key = line.substr(0, equalsAt);
- INIStringUtil::trim(key);
- INIStringUtil::replace(key, "\\=", "=");
- auto value = line.substr(equalsAt + 1);
- INIStringUtil::trim(value);
- parseData.first = key;
- parseData.second = value;
- return PDataType::PDATA_KEYVALUE;
- }
- return PDataType::PDATA_UNKNOWN;
- }
- }
-
- class INIReader
- {
- public:
- using T_LineData = std::vector;
- using T_LineDataPtr = std::shared_ptr;
-
- bool isBOM = false;
-
- private:
- std::ifstream fileReadStream;
- T_LineDataPtr lineData;
-
- T_LineData readFile()
- {
- fileReadStream.seekg(0, std::ios::end);
- const std::size_t fileSize = static_cast(fileReadStream.tellg());
- fileReadStream.seekg(0, std::ios::beg);
- if (fileSize >= 3) {
- const char header[3] = {
- static_cast(fileReadStream.get()),
- static_cast(fileReadStream.get()),
- static_cast(fileReadStream.get())
- };
- isBOM = (
- header[0] == static_cast(0xEF) &&
- header[1] == static_cast(0xBB) &&
- header[2] == static_cast(0xBF)
- );
- }
- else {
- isBOM = false;
- }
- std::string fileContents;
- fileContents.resize(fileSize);
- fileReadStream.seekg(isBOM ? 3 : 0, std::ios::beg);
- fileReadStream.read(&fileContents[0], fileSize);
- fileReadStream.close();
- T_LineData output;
- if (fileSize == 0)
- {
- return output;
- }
- std::string buffer;
- buffer.reserve(50);
- for (std::size_t i = 0; i < fileSize; ++i)
- {
- char& c = fileContents[i];
- if (c == '\n')
- {
- output.emplace_back(buffer);
- buffer.clear();
- continue;
- }
- if (c != '\0' && c != '\r')
- {
- buffer += c;
- }
- }
- output.emplace_back(buffer);
- return output;
- }
-
- public:
- INIReader(std::string const& filename, bool keepLineData = false)
- {
- fileReadStream.open(filename, std::ios::in | std::ios::binary);
- if (keepLineData)
- {
- lineData = std::make_shared();
- }
- }
- ~INIReader() { }
-
- bool operator>>(INIStructure& data)
- {
- if (!fileReadStream.is_open())
- {
- return false;
- }
- T_LineData fileLines = readFile();
- std::string section;
- bool inSection = false;
- INIParser::T_ParseValues parseData;
- for (auto const& line : fileLines)
- {
- auto parseResult = INIParser::parseLine(line, parseData);
- if (parseResult == INIParser::PDataType::PDATA_SECTION)
- {
- inSection = true;
- data[section = parseData.first];
- }
- else if (inSection && parseResult == INIParser::PDataType::PDATA_KEYVALUE)
- {
- auto const& key = parseData.first;
- auto const& value = parseData.second;
- data[section][key] = value;
- }
- if (lineData && parseResult != INIParser::PDataType::PDATA_UNKNOWN)
- {
- if (parseResult == INIParser::PDataType::PDATA_KEYVALUE && !inSection)
- {
- continue;
- }
- lineData->emplace_back(line);
- }
- }
- return true;
- }
- T_LineDataPtr getLines()
- {
- return lineData;
- }
- };
-
- class INIGenerator
- {
- private:
- std::ofstream fileWriteStream;
-
- public:
- bool prettyPrint = false;
-
- INIGenerator(std::string const& filename)
- {
- fileWriteStream.open(filename, std::ios::out | std::ios::binary);
- }
- ~INIGenerator() { }
-
- bool operator<<(INIStructure const& data)
- {
- if (!fileWriteStream.is_open())
- {
- return false;
- }
- if (!data.size())
- {
- return true;
- }
- auto it = data.begin();
- for (;;)
- {
- auto const& section = it->first;
- auto const& collection = it->second;
- fileWriteStream
- << "["
- << section
- << "]";
- if (collection.size())
- {
- fileWriteStream << INIStringUtil::endl;
- auto it2 = collection.begin();
- for (;;)
- {
- auto key = it2->first;
- INIStringUtil::replace(key, "=", "\\=");
- auto value = it2->second;
- INIStringUtil::trim(value);
- fileWriteStream
- << key
- << ((prettyPrint) ? " = " : "=")
- << value;
- if (++it2 == collection.end())
- {
- break;
- }
- fileWriteStream << INIStringUtil::endl;
- }
- }
- if (++it == data.end())
- {
- break;
- }
- fileWriteStream << INIStringUtil::endl;
- if (prettyPrint)
- {
- fileWriteStream << INIStringUtil::endl;
- }
- }
- return true;
- }
- };
-
- class INIWriter
- {
- private:
- using T_LineData = std::vector;
- using T_LineDataPtr = std::shared_ptr;
-
- std::string filename;
-
- T_LineData getLazyOutput(T_LineDataPtr const& lineData, INIStructure& data, INIStructure& original)
- {
- T_LineData output;
- INIParser::T_ParseValues parseData;
- std::string sectionCurrent;
- bool parsingSection = false;
- bool continueToNextSection = false;
- bool discardNextEmpty = false;
- bool writeNewKeys = false;
- std::size_t lastKeyLine = 0;
- for (auto line = lineData->begin(); line != lineData->end(); ++line)
- {
- if (!writeNewKeys)
- {
- auto parseResult = INIParser::parseLine(*line, parseData);
- if (parseResult == INIParser::PDataType::PDATA_SECTION)
- {
- if (parsingSection)
- {
- writeNewKeys = true;
- parsingSection = false;
- --line;
- continue;
- }
- sectionCurrent = parseData.first;
- if (data.has(sectionCurrent))
- {
- parsingSection = true;
- continueToNextSection = false;
- discardNextEmpty = false;
- output.emplace_back(*line);
- lastKeyLine = output.size();
- }
- else
- {
- continueToNextSection = true;
- discardNextEmpty = true;
- continue;
- }
- }
- else if (parseResult == INIParser::PDataType::PDATA_KEYVALUE)
- {
- if (continueToNextSection)
- {
- continue;
- }
- if (data.has(sectionCurrent))
- {
- auto& collection = data[sectionCurrent];
- auto const& key = parseData.first;
- auto const& value = parseData.second;
- if (collection.has(key))
- {
- auto outputValue = collection[key];
- if (value == outputValue)
- {
- output.emplace_back(*line);
- }
- else
- {
- INIStringUtil::trim(outputValue);
- auto lineNorm = *line;
- INIStringUtil::replace(lineNorm, "\\=", " ");
- auto equalsAt = lineNorm.find_first_of('=');
- auto valueAt = lineNorm.find_first_not_of(
- INIStringUtil::whitespaceDelimiters,
- equalsAt + 1
- );
- std::string outputLine = line->substr(0, valueAt);
- if (prettyPrint && equalsAt + 1 == valueAt)
- {
- outputLine += " ";
- }
- outputLine += outputValue;
- output.emplace_back(outputLine);
- }
- lastKeyLine = output.size();
- }
- }
- }
- else
- {
- if (discardNextEmpty && line->empty())
- {
- discardNextEmpty = false;
- }
- else if (parseResult != INIParser::PDataType::PDATA_UNKNOWN)
- {
- output.emplace_back(*line);
- }
- }
- }
- if (writeNewKeys || std::next(line) == lineData->end())
- {
- T_LineData linesToAdd;
- if (data.has(sectionCurrent) && original.has(sectionCurrent))
- {
- auto const& collection = data[sectionCurrent];
- auto const& collectionOriginal = original[sectionCurrent];
- for (auto const& it : collection)
- {
- auto key = it.first;
- if (collectionOriginal.has(key))
- {
- continue;
- }
- auto value = it.second;
- INIStringUtil::replace(key, "=", "\\=");
- INIStringUtil::trim(value);
- linesToAdd.emplace_back(
- key + ((prettyPrint) ? " = " : "=") + value
- );
- }
- }
- if (!linesToAdd.empty())
- {
- output.insert(
- output.begin() + lastKeyLine,
- linesToAdd.begin(),
- linesToAdd.end()
- );
- }
- if (writeNewKeys)
- {
- writeNewKeys = false;
- --line;
- }
- }
- }
- for (auto const& it : data)
- {
- auto const& section = it.first;
- if (original.has(section))
- {
- continue;
- }
- if (prettyPrint && output.size() > 0 && !output.back().empty())
- {
- output.emplace_back();
- }
- output.emplace_back("[" + section + "]");
- auto const& collection = it.second;
- for (auto const& it2 : collection)
- {
- auto key = it2.first;
- auto value = it2.second;
- INIStringUtil::replace(key, "=", "\\=");
- INIStringUtil::trim(value);
- output.emplace_back(
- key + ((prettyPrint) ? " = " : "=") + value
- );
- }
- }
- return output;
- }
-
- public:
- bool prettyPrint = false;
-
- INIWriter(std::string const& filename)
- : filename(filename)
- {
- }
- ~INIWriter() { }
-
- bool operator<<(INIStructure& data)
- {
- struct stat buf;
- bool fileExists = (stat(filename.c_str(), &buf) == 0);
- if (!fileExists)
- {
- INIGenerator generator(filename);
- generator.prettyPrint = prettyPrint;
- return generator << data;
- }
- INIStructure originalData;
- T_LineDataPtr lineData;
- bool readSuccess = false;
- bool fileIsBOM = false;
- {
- INIReader reader(filename, true);
- if ((readSuccess = reader >> originalData))
- {
- lineData = reader.getLines();
- fileIsBOM = reader.isBOM;
- }
- }
- if (!readSuccess)
- {
- return false;
- }
- T_LineData output = getLazyOutput(lineData, data, originalData);
- std::ofstream fileWriteStream(filename, std::ios::out | std::ios::binary);
- if (fileWriteStream.is_open())
- {
- if (fileIsBOM) {
- const char utf8_BOM[3] = {
- static_cast(0xEF),
- static_cast(0xBB),
- static_cast(0xBF)
- };
- fileWriteStream.write(utf8_BOM, 3);
- }
- if (output.size())
- {
- auto line = output.begin();
- for (;;)
- {
- fileWriteStream << *line;
- if (++line == output.end())
- {
- break;
- }
- fileWriteStream << INIStringUtil::endl;
- }
- }
- return true;
- }
- return false;
- }
- };
-
- class INIFile
- {
- private:
- std::string filename;
-
- public:
- INIFile(std::string const& filename)
- : filename(filename)
- { }
-
- ~INIFile() { }
-
- bool read(INIStructure& data) const
- {
- if (data.size())
- {
- data.clear();
- }
- if (filename.empty())
- {
- return false;
- }
- INIReader reader(filename);
- return reader >> data;
- }
- bool generate(INIStructure const& data, bool pretty = false) const
- {
- if (filename.empty())
- {
- return false;
- }
- INIGenerator generator(filename);
- generator.prettyPrint = pretty;
- return generator << data;
- }
- bool write(INIStructure& data, bool pretty = false) const
- {
- if (filename.empty())
- {
- return false;
- }
- INIWriter writer(filename);
- writer.prettyPrint = pretty;
- return writer << data;
- }
- };
-}
-
-#endif // MINI_INI_H_
diff --git a/README.md b/README.md
index e61ed73..4e96078 100644
--- a/README.md
+++ b/README.md
@@ -12,5 +12,12 @@ A plugin that aims to bring crouch walking to Metal Gear Solid 3: Master Collect
- The camo index is dynamically adjusted while crouch walking.
- Seamlessly integrated into the game engine as a genuine feature, without displacing any existing functionality.
+## Installation
+- Extract the contents of the release zip into the game folder.
(e.g. "**steamapps\common\MGS3**").
+
+### Steam Deck/Linux Additional Instructions
+🚩**You do not need to do this if you are using Windows!**
+- Open up the game properties of MGS3 in Steam and add `WINEDLLOVERRIDES="wininet,winhttp=n,b" %command%` to the launch options.
+
## Credits
- Zoft for mtar research and porting the 3DS animations over to the Master Collection
diff --git a/assets/mtar/fr/00023291.mtar b/assets/mtar/fr/00023291.mtar
new file mode 100644
index 0000000..8c2802d
Binary files /dev/null and b/assets/mtar/fr/00023291.mtar differ
diff --git a/assets/mtar/fr/00025bb7.mtar b/assets/mtar/fr/00025bb7.mtar
new file mode 100644
index 0000000..75f6810
Binary files /dev/null and b/assets/mtar/fr/00025bb7.mtar differ
diff --git a/assets/mtar/fr/0002614b.mtar b/assets/mtar/fr/0002614b.mtar
new file mode 100644
index 0000000..5224502
Binary files /dev/null and b/assets/mtar/fr/0002614b.mtar differ
diff --git a/assets/mtar/fr/00027945.mtar b/assets/mtar/fr/00027945.mtar
new file mode 100644
index 0000000..9f6291e
Binary files /dev/null and b/assets/mtar/fr/00027945.mtar differ
diff --git a/assets/mtar/fr/00027ef8.mtar b/assets/mtar/fr/00027ef8.mtar
new file mode 100644
index 0000000..35f51a3
Binary files /dev/null and b/assets/mtar/fr/00027ef8.mtar differ
diff --git a/assets/mtar/fr/00201199.mtar b/assets/mtar/fr/00201199.mtar
new file mode 100644
index 0000000..35f51a3
Binary files /dev/null and b/assets/mtar/fr/00201199.mtar differ
diff --git a/assets/mtar/fr/00215251.mtar b/assets/mtar/fr/00215251.mtar
new file mode 100644
index 0000000..5224502
Binary files /dev/null and b/assets/mtar/fr/00215251.mtar differ
diff --git a/assets/mtar/fr/0046e2cb.mtar b/assets/mtar/fr/0046e2cb.mtar
new file mode 100644
index 0000000..51cda84
Binary files /dev/null and b/assets/mtar/fr/0046e2cb.mtar differ
diff --git a/assets/mtar/fr/00482b59.mtar b/assets/mtar/fr/00482b59.mtar
new file mode 100644
index 0000000..f6dd513
Binary files /dev/null and b/assets/mtar/fr/00482b59.mtar differ
diff --git a/assets/mtar/fr/00482b59_slot_weapons-pipogun.mtar b/assets/mtar/fr/00482b59_slot_weapons-pipogun.mtar
new file mode 100644
index 0000000..f6dd513
Binary files /dev/null and b/assets/mtar/fr/00482b59_slot_weapons-pipogun.mtar differ
diff --git a/assets/mtar/fr/0048e32b.mtar b/assets/mtar/fr/0048e32b.mtar
new file mode 100644
index 0000000..cd31cdc
Binary files /dev/null and b/assets/mtar/fr/0048e32b.mtar differ
diff --git a/assets/mtar/fr/004963a5.mtar b/assets/mtar/fr/004963a5.mtar
new file mode 100644
index 0000000..f6dd513
Binary files /dev/null and b/assets/mtar/fr/004963a5.mtar differ
diff --git a/assets/mtar/fr/004963a5_slot_weapons-coltgave_custom.mtar b/assets/mtar/fr/004963a5_slot_weapons-coltgave_custom.mtar
new file mode 100644
index 0000000..f6dd513
Binary files /dev/null and b/assets/mtar/fr/004963a5_slot_weapons-coltgave_custom.mtar differ
diff --git a/assets/mtar/fr/004c4af2.mtar b/assets/mtar/fr/004c4af2.mtar
new file mode 100644
index 0000000..f6dd513
Binary files /dev/null and b/assets/mtar/fr/004c4af2.mtar differ
diff --git a/assets/mtar/fr/0051525f.mtar b/assets/mtar/fr/0051525f.mtar
new file mode 100644
index 0000000..5224502
Binary files /dev/null and b/assets/mtar/fr/0051525f.mtar differ
diff --git a/assets/mtar/fr/005ea57b.mtar b/assets/mtar/fr/005ea57b.mtar
new file mode 100644
index 0000000..e7db73e
Binary files /dev/null and b/assets/mtar/fr/005ea57b.mtar differ
diff --git a/assets/mtar/fr/006891cc.mtar b/assets/mtar/fr/006891cc.mtar
new file mode 100644
index 0000000..4205c3c
Binary files /dev/null and b/assets/mtar/fr/006891cc.mtar differ
diff --git a/assets/mtar/fr/006bc12e.mtar b/assets/mtar/fr/006bc12e.mtar
new file mode 100644
index 0000000..cd31cdc
Binary files /dev/null and b/assets/mtar/fr/006bc12e.mtar differ
diff --git a/assets/mtar/fr/006bc12e_slot_weapons-knife.mtar b/assets/mtar/fr/006bc12e_slot_weapons-knife.mtar
new file mode 100644
index 0000000..cd31cdc
Binary files /dev/null and b/assets/mtar/fr/006bc12e_slot_weapons-knife.mtar differ
diff --git a/assets/mtar/fr/006c745a.mtar b/assets/mtar/fr/006c745a.mtar
new file mode 100644
index 0000000..8c2802d
Binary files /dev/null and b/assets/mtar/fr/006c745a.mtar differ
diff --git a/assets/mtar/fr/00914f09.mtar b/assets/mtar/fr/00914f09.mtar
new file mode 100644
index 0000000..5224502
Binary files /dev/null and b/assets/mtar/fr/00914f09.mtar differ
diff --git a/assets/mtar/fr/00ad99ca.mtar b/assets/mtar/fr/00ad99ca.mtar
new file mode 100644
index 0000000..51cda84
Binary files /dev/null and b/assets/mtar/fr/00ad99ca.mtar differ
diff --git a/assets/mtar/fr/00bad929.mtar b/assets/mtar/fr/00bad929.mtar
new file mode 100644
index 0000000..0c5eef2
Binary files /dev/null and b/assets/mtar/fr/00bad929.mtar differ
diff --git a/assets/mtar/fr/00c8b59b.mtar b/assets/mtar/fr/00c8b59b.mtar
new file mode 100644
index 0000000..5224502
Binary files /dev/null and b/assets/mtar/fr/00c8b59b.mtar differ
diff --git a/assets/mtar/fr/00ccbff6.mtar b/assets/mtar/fr/00ccbff6.mtar
new file mode 100644
index 0000000..51cda84
Binary files /dev/null and b/assets/mtar/fr/00ccbff6.mtar differ
diff --git a/assets/mtar/fr/00d14e46.mtar b/assets/mtar/fr/00d14e46.mtar
new file mode 100644
index 0000000..5224502
Binary files /dev/null and b/assets/mtar/fr/00d14e46.mtar differ
diff --git a/assets/mtar/fr/00d791ea.mtar b/assets/mtar/fr/00d791ea.mtar
new file mode 100644
index 0000000..8d2fc6e
Binary files /dev/null and b/assets/mtar/fr/00d791ea.mtar differ
diff --git a/assets/mtar/fr/00f8e660.mtar b/assets/mtar/fr/00f8e660.mtar
new file mode 100644
index 0000000..5224502
Binary files /dev/null and b/assets/mtar/fr/00f8e660.mtar differ
diff --git a/assets/mtar/fr/00fc64d1.mtar b/assets/mtar/fr/00fc64d1.mtar
new file mode 100644
index 0000000..e975cb7
Binary files /dev/null and b/assets/mtar/fr/00fc64d1.mtar differ
diff --git a/assets/mtar/gr/00023291.mtar b/assets/mtar/gr/00023291.mtar
new file mode 100644
index 0000000..8c2802d
Binary files /dev/null and b/assets/mtar/gr/00023291.mtar differ
diff --git a/assets/mtar/gr/00025bb7.mtar b/assets/mtar/gr/00025bb7.mtar
new file mode 100644
index 0000000..75f6810
Binary files /dev/null and b/assets/mtar/gr/00025bb7.mtar differ
diff --git a/assets/mtar/gr/0002614b.mtar b/assets/mtar/gr/0002614b.mtar
new file mode 100644
index 0000000..5224502
Binary files /dev/null and b/assets/mtar/gr/0002614b.mtar differ
diff --git a/assets/mtar/gr/00027945.mtar b/assets/mtar/gr/00027945.mtar
new file mode 100644
index 0000000..9f6291e
Binary files /dev/null and b/assets/mtar/gr/00027945.mtar differ
diff --git a/assets/mtar/gr/00027ef8.mtar b/assets/mtar/gr/00027ef8.mtar
new file mode 100644
index 0000000..35f51a3
Binary files /dev/null and b/assets/mtar/gr/00027ef8.mtar differ
diff --git a/assets/mtar/gr/00201199.mtar b/assets/mtar/gr/00201199.mtar
new file mode 100644
index 0000000..35f51a3
Binary files /dev/null and b/assets/mtar/gr/00201199.mtar differ
diff --git a/assets/mtar/gr/00215251.mtar b/assets/mtar/gr/00215251.mtar
new file mode 100644
index 0000000..5224502
Binary files /dev/null and b/assets/mtar/gr/00215251.mtar differ
diff --git a/assets/mtar/gr/0046e2cb.mtar b/assets/mtar/gr/0046e2cb.mtar
new file mode 100644
index 0000000..51cda84
Binary files /dev/null and b/assets/mtar/gr/0046e2cb.mtar differ
diff --git a/assets/mtar/gr/00482b59.mtar b/assets/mtar/gr/00482b59.mtar
new file mode 100644
index 0000000..f6dd513
Binary files /dev/null and b/assets/mtar/gr/00482b59.mtar differ
diff --git a/assets/mtar/gr/00482b59_slot_weapons-pipogun.mtar b/assets/mtar/gr/00482b59_slot_weapons-pipogun.mtar
new file mode 100644
index 0000000..f6dd513
Binary files /dev/null and b/assets/mtar/gr/00482b59_slot_weapons-pipogun.mtar differ
diff --git a/assets/mtar/gr/0048e32b.mtar b/assets/mtar/gr/0048e32b.mtar
new file mode 100644
index 0000000..cd31cdc
Binary files /dev/null and b/assets/mtar/gr/0048e32b.mtar differ
diff --git a/assets/mtar/gr/004963a5.mtar b/assets/mtar/gr/004963a5.mtar
new file mode 100644
index 0000000..f6dd513
Binary files /dev/null and b/assets/mtar/gr/004963a5.mtar differ
diff --git a/assets/mtar/gr/004963a5_slot_weapons-coltgave_custom.mtar b/assets/mtar/gr/004963a5_slot_weapons-coltgave_custom.mtar
new file mode 100644
index 0000000..f6dd513
Binary files /dev/null and b/assets/mtar/gr/004963a5_slot_weapons-coltgave_custom.mtar differ
diff --git a/assets/mtar/gr/004c4af2.mtar b/assets/mtar/gr/004c4af2.mtar
new file mode 100644
index 0000000..f6dd513
Binary files /dev/null and b/assets/mtar/gr/004c4af2.mtar differ
diff --git a/assets/mtar/gr/0051525f.mtar b/assets/mtar/gr/0051525f.mtar
new file mode 100644
index 0000000..5224502
Binary files /dev/null and b/assets/mtar/gr/0051525f.mtar differ
diff --git a/assets/mtar/gr/005ea57b.mtar b/assets/mtar/gr/005ea57b.mtar
new file mode 100644
index 0000000..e7db73e
Binary files /dev/null and b/assets/mtar/gr/005ea57b.mtar differ
diff --git a/assets/mtar/gr/006891cc.mtar b/assets/mtar/gr/006891cc.mtar
new file mode 100644
index 0000000..4205c3c
Binary files /dev/null and b/assets/mtar/gr/006891cc.mtar differ
diff --git a/assets/mtar/gr/006bc12e.mtar b/assets/mtar/gr/006bc12e.mtar
new file mode 100644
index 0000000..cd31cdc
Binary files /dev/null and b/assets/mtar/gr/006bc12e.mtar differ
diff --git a/assets/mtar/gr/006bc12e_slot_weapons-knife.mtar b/assets/mtar/gr/006bc12e_slot_weapons-knife.mtar
new file mode 100644
index 0000000..cd31cdc
Binary files /dev/null and b/assets/mtar/gr/006bc12e_slot_weapons-knife.mtar differ
diff --git a/assets/mtar/gr/006c745a.mtar b/assets/mtar/gr/006c745a.mtar
new file mode 100644
index 0000000..8c2802d
Binary files /dev/null and b/assets/mtar/gr/006c745a.mtar differ
diff --git a/assets/mtar/gr/00914f09.mtar b/assets/mtar/gr/00914f09.mtar
new file mode 100644
index 0000000..5224502
Binary files /dev/null and b/assets/mtar/gr/00914f09.mtar differ
diff --git a/assets/mtar/gr/00ad99ca.mtar b/assets/mtar/gr/00ad99ca.mtar
new file mode 100644
index 0000000..51cda84
Binary files /dev/null and b/assets/mtar/gr/00ad99ca.mtar differ
diff --git a/assets/mtar/gr/00bad929.mtar b/assets/mtar/gr/00bad929.mtar
new file mode 100644
index 0000000..0c5eef2
Binary files /dev/null and b/assets/mtar/gr/00bad929.mtar differ
diff --git a/assets/mtar/gr/00c8b59b.mtar b/assets/mtar/gr/00c8b59b.mtar
new file mode 100644
index 0000000..5224502
Binary files /dev/null and b/assets/mtar/gr/00c8b59b.mtar differ
diff --git a/assets/mtar/gr/00ccbff6.mtar b/assets/mtar/gr/00ccbff6.mtar
new file mode 100644
index 0000000..51cda84
Binary files /dev/null and b/assets/mtar/gr/00ccbff6.mtar differ
diff --git a/assets/mtar/gr/00d14e46.mtar b/assets/mtar/gr/00d14e46.mtar
new file mode 100644
index 0000000..5224502
Binary files /dev/null and b/assets/mtar/gr/00d14e46.mtar differ
diff --git a/assets/mtar/gr/00d791ea.mtar b/assets/mtar/gr/00d791ea.mtar
new file mode 100644
index 0000000..8d2fc6e
Binary files /dev/null and b/assets/mtar/gr/00d791ea.mtar differ
diff --git a/assets/mtar/gr/00f8e660.mtar b/assets/mtar/gr/00f8e660.mtar
new file mode 100644
index 0000000..5224502
Binary files /dev/null and b/assets/mtar/gr/00f8e660.mtar differ
diff --git a/assets/mtar/gr/00fc64d1.mtar b/assets/mtar/gr/00fc64d1.mtar
new file mode 100644
index 0000000..e975cb7
Binary files /dev/null and b/assets/mtar/gr/00fc64d1.mtar differ
diff --git a/assets/mtar/it/00023291.mtar b/assets/mtar/it/00023291.mtar
new file mode 100644
index 0000000..8c2802d
Binary files /dev/null and b/assets/mtar/it/00023291.mtar differ
diff --git a/assets/mtar/it/00025bb7.mtar b/assets/mtar/it/00025bb7.mtar
new file mode 100644
index 0000000..75f6810
Binary files /dev/null and b/assets/mtar/it/00025bb7.mtar differ
diff --git a/assets/mtar/it/0002614b.mtar b/assets/mtar/it/0002614b.mtar
new file mode 100644
index 0000000..5224502
Binary files /dev/null and b/assets/mtar/it/0002614b.mtar differ
diff --git a/assets/mtar/it/00027945.mtar b/assets/mtar/it/00027945.mtar
new file mode 100644
index 0000000..9f6291e
Binary files /dev/null and b/assets/mtar/it/00027945.mtar differ
diff --git a/assets/mtar/it/00027ef8.mtar b/assets/mtar/it/00027ef8.mtar
new file mode 100644
index 0000000..35f51a3
Binary files /dev/null and b/assets/mtar/it/00027ef8.mtar differ
diff --git a/assets/mtar/it/00201199.mtar b/assets/mtar/it/00201199.mtar
new file mode 100644
index 0000000..35f51a3
Binary files /dev/null and b/assets/mtar/it/00201199.mtar differ
diff --git a/assets/mtar/it/00215251.mtar b/assets/mtar/it/00215251.mtar
new file mode 100644
index 0000000..5224502
Binary files /dev/null and b/assets/mtar/it/00215251.mtar differ
diff --git a/assets/mtar/it/0046e2cb.mtar b/assets/mtar/it/0046e2cb.mtar
new file mode 100644
index 0000000..51cda84
Binary files /dev/null and b/assets/mtar/it/0046e2cb.mtar differ
diff --git a/assets/mtar/it/00482b59.mtar b/assets/mtar/it/00482b59.mtar
new file mode 100644
index 0000000..f6dd513
Binary files /dev/null and b/assets/mtar/it/00482b59.mtar differ
diff --git a/assets/mtar/it/00482b59_slot_weapons-pipogun.mtar b/assets/mtar/it/00482b59_slot_weapons-pipogun.mtar
new file mode 100644
index 0000000..f6dd513
Binary files /dev/null and b/assets/mtar/it/00482b59_slot_weapons-pipogun.mtar differ
diff --git a/assets/mtar/it/0048e32b.mtar b/assets/mtar/it/0048e32b.mtar
new file mode 100644
index 0000000..cd31cdc
Binary files /dev/null and b/assets/mtar/it/0048e32b.mtar differ
diff --git a/assets/mtar/it/004963a5.mtar b/assets/mtar/it/004963a5.mtar
new file mode 100644
index 0000000..f6dd513
Binary files /dev/null and b/assets/mtar/it/004963a5.mtar differ
diff --git a/assets/mtar/it/004963a5_slot_weapons-coltgave_custom.mtar b/assets/mtar/it/004963a5_slot_weapons-coltgave_custom.mtar
new file mode 100644
index 0000000..f6dd513
Binary files /dev/null and b/assets/mtar/it/004963a5_slot_weapons-coltgave_custom.mtar differ
diff --git a/assets/mtar/it/004c4af2.mtar b/assets/mtar/it/004c4af2.mtar
new file mode 100644
index 0000000..f6dd513
Binary files /dev/null and b/assets/mtar/it/004c4af2.mtar differ
diff --git a/assets/mtar/it/0051525f.mtar b/assets/mtar/it/0051525f.mtar
new file mode 100644
index 0000000..5224502
Binary files /dev/null and b/assets/mtar/it/0051525f.mtar differ
diff --git a/assets/mtar/it/005ea57b.mtar b/assets/mtar/it/005ea57b.mtar
new file mode 100644
index 0000000..e7db73e
Binary files /dev/null and b/assets/mtar/it/005ea57b.mtar differ
diff --git a/assets/mtar/it/006891cc.mtar b/assets/mtar/it/006891cc.mtar
new file mode 100644
index 0000000..4205c3c
Binary files /dev/null and b/assets/mtar/it/006891cc.mtar differ
diff --git a/assets/mtar/it/006bc12e.mtar b/assets/mtar/it/006bc12e.mtar
new file mode 100644
index 0000000..cd31cdc
Binary files /dev/null and b/assets/mtar/it/006bc12e.mtar differ
diff --git a/assets/mtar/it/006bc12e_slot_weapons-knife.mtar b/assets/mtar/it/006bc12e_slot_weapons-knife.mtar
new file mode 100644
index 0000000..cd31cdc
Binary files /dev/null and b/assets/mtar/it/006bc12e_slot_weapons-knife.mtar differ
diff --git a/assets/mtar/it/006c745a.mtar b/assets/mtar/it/006c745a.mtar
new file mode 100644
index 0000000..8c2802d
Binary files /dev/null and b/assets/mtar/it/006c745a.mtar differ
diff --git a/assets/mtar/it/00914f09.mtar b/assets/mtar/it/00914f09.mtar
new file mode 100644
index 0000000..5224502
Binary files /dev/null and b/assets/mtar/it/00914f09.mtar differ
diff --git a/assets/mtar/it/00ad99ca.mtar b/assets/mtar/it/00ad99ca.mtar
new file mode 100644
index 0000000..51cda84
Binary files /dev/null and b/assets/mtar/it/00ad99ca.mtar differ
diff --git a/assets/mtar/it/00bad929.mtar b/assets/mtar/it/00bad929.mtar
new file mode 100644
index 0000000..0c5eef2
Binary files /dev/null and b/assets/mtar/it/00bad929.mtar differ
diff --git a/assets/mtar/it/00c8b59b.mtar b/assets/mtar/it/00c8b59b.mtar
new file mode 100644
index 0000000..5224502
Binary files /dev/null and b/assets/mtar/it/00c8b59b.mtar differ
diff --git a/assets/mtar/it/00ccbff6.mtar b/assets/mtar/it/00ccbff6.mtar
new file mode 100644
index 0000000..51cda84
Binary files /dev/null and b/assets/mtar/it/00ccbff6.mtar differ
diff --git a/assets/mtar/it/00d14e46.mtar b/assets/mtar/it/00d14e46.mtar
new file mode 100644
index 0000000..5224502
Binary files /dev/null and b/assets/mtar/it/00d14e46.mtar differ
diff --git a/assets/mtar/it/00d791ea.mtar b/assets/mtar/it/00d791ea.mtar
new file mode 100644
index 0000000..8d2fc6e
Binary files /dev/null and b/assets/mtar/it/00d791ea.mtar differ
diff --git a/assets/mtar/it/00f8e660.mtar b/assets/mtar/it/00f8e660.mtar
new file mode 100644
index 0000000..5224502
Binary files /dev/null and b/assets/mtar/it/00f8e660.mtar differ
diff --git a/assets/mtar/it/00fc64d1.mtar b/assets/mtar/it/00fc64d1.mtar
new file mode 100644
index 0000000..e975cb7
Binary files /dev/null and b/assets/mtar/it/00fc64d1.mtar differ
diff --git a/assets/mtar/jp/00023291.mtar b/assets/mtar/jp/00023291.mtar
new file mode 100644
index 0000000..8c2802d
Binary files /dev/null and b/assets/mtar/jp/00023291.mtar differ
diff --git a/assets/mtar/jp/00025bb7.mtar b/assets/mtar/jp/00025bb7.mtar
new file mode 100644
index 0000000..75f6810
Binary files /dev/null and b/assets/mtar/jp/00025bb7.mtar differ
diff --git a/assets/mtar/jp/0002614b.mtar b/assets/mtar/jp/0002614b.mtar
new file mode 100644
index 0000000..5224502
Binary files /dev/null and b/assets/mtar/jp/0002614b.mtar differ
diff --git a/assets/mtar/jp/00027945.mtar b/assets/mtar/jp/00027945.mtar
new file mode 100644
index 0000000..9f6291e
Binary files /dev/null and b/assets/mtar/jp/00027945.mtar differ
diff --git a/assets/mtar/jp/00027ef8.mtar b/assets/mtar/jp/00027ef8.mtar
new file mode 100644
index 0000000..35f51a3
Binary files /dev/null and b/assets/mtar/jp/00027ef8.mtar differ
diff --git a/assets/mtar/jp/00201199.mtar b/assets/mtar/jp/00201199.mtar
new file mode 100644
index 0000000..35f51a3
Binary files /dev/null and b/assets/mtar/jp/00201199.mtar differ
diff --git a/assets/mtar/jp/00215251.mtar b/assets/mtar/jp/00215251.mtar
new file mode 100644
index 0000000..5224502
Binary files /dev/null and b/assets/mtar/jp/00215251.mtar differ
diff --git a/assets/mtar/jp/0046e2cb.mtar b/assets/mtar/jp/0046e2cb.mtar
new file mode 100644
index 0000000..51cda84
Binary files /dev/null and b/assets/mtar/jp/0046e2cb.mtar differ
diff --git a/assets/mtar/jp/00482b59.mtar b/assets/mtar/jp/00482b59.mtar
new file mode 100644
index 0000000..f6dd513
Binary files /dev/null and b/assets/mtar/jp/00482b59.mtar differ
diff --git a/assets/mtar/jp/00482b59_slot_weapons-pipogun.mtar b/assets/mtar/jp/00482b59_slot_weapons-pipogun.mtar
new file mode 100644
index 0000000..f6dd513
Binary files /dev/null and b/assets/mtar/jp/00482b59_slot_weapons-pipogun.mtar differ
diff --git a/assets/mtar/jp/0048e32b.mtar b/assets/mtar/jp/0048e32b.mtar
new file mode 100644
index 0000000..cd31cdc
Binary files /dev/null and b/assets/mtar/jp/0048e32b.mtar differ
diff --git a/assets/mtar/jp/004963a5.mtar b/assets/mtar/jp/004963a5.mtar
new file mode 100644
index 0000000..f6dd513
Binary files /dev/null and b/assets/mtar/jp/004963a5.mtar differ
diff --git a/assets/mtar/jp/004963a5_slot_weapons-coltgave_custom.mtar b/assets/mtar/jp/004963a5_slot_weapons-coltgave_custom.mtar
new file mode 100644
index 0000000..f6dd513
Binary files /dev/null and b/assets/mtar/jp/004963a5_slot_weapons-coltgave_custom.mtar differ
diff --git a/assets/mtar/jp/004c4af2.mtar b/assets/mtar/jp/004c4af2.mtar
new file mode 100644
index 0000000..f6dd513
Binary files /dev/null and b/assets/mtar/jp/004c4af2.mtar differ
diff --git a/assets/mtar/jp/0051525f.mtar b/assets/mtar/jp/0051525f.mtar
new file mode 100644
index 0000000..5224502
Binary files /dev/null and b/assets/mtar/jp/0051525f.mtar differ
diff --git a/assets/mtar/jp/005ea57b.mtar b/assets/mtar/jp/005ea57b.mtar
new file mode 100644
index 0000000..e7db73e
Binary files /dev/null and b/assets/mtar/jp/005ea57b.mtar differ
diff --git a/assets/mtar/jp/006891cc.mtar b/assets/mtar/jp/006891cc.mtar
new file mode 100644
index 0000000..4205c3c
Binary files /dev/null and b/assets/mtar/jp/006891cc.mtar differ
diff --git a/assets/mtar/jp/006bc12e.mtar b/assets/mtar/jp/006bc12e.mtar
new file mode 100644
index 0000000..cd31cdc
Binary files /dev/null and b/assets/mtar/jp/006bc12e.mtar differ
diff --git a/assets/mtar/jp/006bc12e_slot_weapons-knife.mtar b/assets/mtar/jp/006bc12e_slot_weapons-knife.mtar
new file mode 100644
index 0000000..cd31cdc
Binary files /dev/null and b/assets/mtar/jp/006bc12e_slot_weapons-knife.mtar differ
diff --git a/assets/mtar/jp/006c745a.mtar b/assets/mtar/jp/006c745a.mtar
new file mode 100644
index 0000000..8c2802d
Binary files /dev/null and b/assets/mtar/jp/006c745a.mtar differ
diff --git a/assets/mtar/jp/00914f09.mtar b/assets/mtar/jp/00914f09.mtar
new file mode 100644
index 0000000..5224502
Binary files /dev/null and b/assets/mtar/jp/00914f09.mtar differ
diff --git a/assets/mtar/jp/00ad99ca.mtar b/assets/mtar/jp/00ad99ca.mtar
new file mode 100644
index 0000000..51cda84
Binary files /dev/null and b/assets/mtar/jp/00ad99ca.mtar differ
diff --git a/assets/mtar/jp/00bad929.mtar b/assets/mtar/jp/00bad929.mtar
new file mode 100644
index 0000000..0c5eef2
Binary files /dev/null and b/assets/mtar/jp/00bad929.mtar differ
diff --git a/assets/mtar/jp/00c8b59b.mtar b/assets/mtar/jp/00c8b59b.mtar
new file mode 100644
index 0000000..5224502
Binary files /dev/null and b/assets/mtar/jp/00c8b59b.mtar differ
diff --git a/assets/mtar/jp/00ccbff6.mtar b/assets/mtar/jp/00ccbff6.mtar
new file mode 100644
index 0000000..51cda84
Binary files /dev/null and b/assets/mtar/jp/00ccbff6.mtar differ
diff --git a/assets/mtar/jp/00d14e46.mtar b/assets/mtar/jp/00d14e46.mtar
new file mode 100644
index 0000000..5224502
Binary files /dev/null and b/assets/mtar/jp/00d14e46.mtar differ
diff --git a/assets/mtar/jp/00d791ea.mtar b/assets/mtar/jp/00d791ea.mtar
new file mode 100644
index 0000000..8d2fc6e
Binary files /dev/null and b/assets/mtar/jp/00d791ea.mtar differ
diff --git a/assets/mtar/jp/00f8e660.mtar b/assets/mtar/jp/00f8e660.mtar
new file mode 100644
index 0000000..5224502
Binary files /dev/null and b/assets/mtar/jp/00f8e660.mtar differ
diff --git a/assets/mtar/jp/00fc64d1.mtar b/assets/mtar/jp/00fc64d1.mtar
new file mode 100644
index 0000000..e975cb7
Binary files /dev/null and b/assets/mtar/jp/00fc64d1.mtar differ
diff --git a/assets/mtar/sp/00023291.mtar b/assets/mtar/sp/00023291.mtar
new file mode 100644
index 0000000..8c2802d
Binary files /dev/null and b/assets/mtar/sp/00023291.mtar differ
diff --git a/assets/mtar/sp/00025bb7.mtar b/assets/mtar/sp/00025bb7.mtar
new file mode 100644
index 0000000..75f6810
Binary files /dev/null and b/assets/mtar/sp/00025bb7.mtar differ
diff --git a/assets/mtar/sp/0002614b.mtar b/assets/mtar/sp/0002614b.mtar
new file mode 100644
index 0000000..5224502
Binary files /dev/null and b/assets/mtar/sp/0002614b.mtar differ
diff --git a/assets/mtar/sp/00027945.mtar b/assets/mtar/sp/00027945.mtar
new file mode 100644
index 0000000..9f6291e
Binary files /dev/null and b/assets/mtar/sp/00027945.mtar differ
diff --git a/assets/mtar/sp/00027ef8.mtar b/assets/mtar/sp/00027ef8.mtar
new file mode 100644
index 0000000..35f51a3
Binary files /dev/null and b/assets/mtar/sp/00027ef8.mtar differ
diff --git a/assets/mtar/sp/00201199.mtar b/assets/mtar/sp/00201199.mtar
new file mode 100644
index 0000000..35f51a3
Binary files /dev/null and b/assets/mtar/sp/00201199.mtar differ
diff --git a/assets/mtar/sp/00215251.mtar b/assets/mtar/sp/00215251.mtar
new file mode 100644
index 0000000..5224502
Binary files /dev/null and b/assets/mtar/sp/00215251.mtar differ
diff --git a/assets/mtar/sp/0046e2cb.mtar b/assets/mtar/sp/0046e2cb.mtar
new file mode 100644
index 0000000..51cda84
Binary files /dev/null and b/assets/mtar/sp/0046e2cb.mtar differ
diff --git a/assets/mtar/sp/00482b59.mtar b/assets/mtar/sp/00482b59.mtar
new file mode 100644
index 0000000..f6dd513
Binary files /dev/null and b/assets/mtar/sp/00482b59.mtar differ
diff --git a/assets/mtar/sp/00482b59_slot_weapons-pipogun.mtar b/assets/mtar/sp/00482b59_slot_weapons-pipogun.mtar
new file mode 100644
index 0000000..f6dd513
Binary files /dev/null and b/assets/mtar/sp/00482b59_slot_weapons-pipogun.mtar differ
diff --git a/assets/mtar/sp/0048e32b.mtar b/assets/mtar/sp/0048e32b.mtar
new file mode 100644
index 0000000..cd31cdc
Binary files /dev/null and b/assets/mtar/sp/0048e32b.mtar differ
diff --git a/assets/mtar/sp/004963a5.mtar b/assets/mtar/sp/004963a5.mtar
new file mode 100644
index 0000000..f6dd513
Binary files /dev/null and b/assets/mtar/sp/004963a5.mtar differ
diff --git a/assets/mtar/sp/004963a5_slot_weapons-coltgave_custom.mtar b/assets/mtar/sp/004963a5_slot_weapons-coltgave_custom.mtar
new file mode 100644
index 0000000..f6dd513
Binary files /dev/null and b/assets/mtar/sp/004963a5_slot_weapons-coltgave_custom.mtar differ
diff --git a/assets/mtar/sp/004c4af2.mtar b/assets/mtar/sp/004c4af2.mtar
new file mode 100644
index 0000000..f6dd513
Binary files /dev/null and b/assets/mtar/sp/004c4af2.mtar differ
diff --git a/assets/mtar/sp/0051525f.mtar b/assets/mtar/sp/0051525f.mtar
new file mode 100644
index 0000000..5224502
Binary files /dev/null and b/assets/mtar/sp/0051525f.mtar differ
diff --git a/assets/mtar/sp/005ea57b.mtar b/assets/mtar/sp/005ea57b.mtar
new file mode 100644
index 0000000..e7db73e
Binary files /dev/null and b/assets/mtar/sp/005ea57b.mtar differ
diff --git a/assets/mtar/sp/006891cc.mtar b/assets/mtar/sp/006891cc.mtar
new file mode 100644
index 0000000..4205c3c
Binary files /dev/null and b/assets/mtar/sp/006891cc.mtar differ
diff --git a/assets/mtar/sp/006bc12e.mtar b/assets/mtar/sp/006bc12e.mtar
new file mode 100644
index 0000000..cd31cdc
Binary files /dev/null and b/assets/mtar/sp/006bc12e.mtar differ
diff --git a/assets/mtar/sp/006bc12e_slot_weapons-knife.mtar b/assets/mtar/sp/006bc12e_slot_weapons-knife.mtar
new file mode 100644
index 0000000..cd31cdc
Binary files /dev/null and b/assets/mtar/sp/006bc12e_slot_weapons-knife.mtar differ
diff --git a/assets/mtar/sp/006c745a.mtar b/assets/mtar/sp/006c745a.mtar
new file mode 100644
index 0000000..8c2802d
Binary files /dev/null and b/assets/mtar/sp/006c745a.mtar differ
diff --git a/assets/mtar/sp/00914f09.mtar b/assets/mtar/sp/00914f09.mtar
new file mode 100644
index 0000000..5224502
Binary files /dev/null and b/assets/mtar/sp/00914f09.mtar differ
diff --git a/assets/mtar/sp/00ad99ca.mtar b/assets/mtar/sp/00ad99ca.mtar
new file mode 100644
index 0000000..51cda84
Binary files /dev/null and b/assets/mtar/sp/00ad99ca.mtar differ
diff --git a/assets/mtar/sp/00bad929.mtar b/assets/mtar/sp/00bad929.mtar
new file mode 100644
index 0000000..0c5eef2
Binary files /dev/null and b/assets/mtar/sp/00bad929.mtar differ
diff --git a/assets/mtar/sp/00c8b59b.mtar b/assets/mtar/sp/00c8b59b.mtar
new file mode 100644
index 0000000..5224502
Binary files /dev/null and b/assets/mtar/sp/00c8b59b.mtar differ
diff --git a/assets/mtar/sp/00ccbff6.mtar b/assets/mtar/sp/00ccbff6.mtar
new file mode 100644
index 0000000..51cda84
Binary files /dev/null and b/assets/mtar/sp/00ccbff6.mtar differ
diff --git a/assets/mtar/sp/00d14e46.mtar b/assets/mtar/sp/00d14e46.mtar
new file mode 100644
index 0000000..5224502
Binary files /dev/null and b/assets/mtar/sp/00d14e46.mtar differ
diff --git a/assets/mtar/sp/00d791ea.mtar b/assets/mtar/sp/00d791ea.mtar
new file mode 100644
index 0000000..8d2fc6e
Binary files /dev/null and b/assets/mtar/sp/00d791ea.mtar differ
diff --git a/assets/mtar/sp/00f8e660.mtar b/assets/mtar/sp/00f8e660.mtar
new file mode 100644
index 0000000..5224502
Binary files /dev/null and b/assets/mtar/sp/00f8e660.mtar differ
diff --git a/assets/mtar/sp/00fc64d1.mtar b/assets/mtar/sp/00fc64d1.mtar
new file mode 100644
index 0000000..e975cb7
Binary files /dev/null and b/assets/mtar/sp/00fc64d1.mtar differ
diff --git a/assets/mtar/us/006891cc.mtar b/assets/mtar/us/006891cc.mtar
new file mode 100644
index 0000000..4205c3c
Binary files /dev/null and b/assets/mtar/us/006891cc.mtar differ
diff --git a/external/mINI b/external/mINI
new file mode 160000
index 0000000..52b66e9
--- /dev/null
+++ b/external/mINI
@@ -0,0 +1 @@
+Subproject commit 52b66e987cb56171dc91d96115cdf094b6e4d7a0
diff --git a/external/minhook b/external/minhook
new file mode 160000
index 0000000..565968b
--- /dev/null
+++ b/external/minhook
@@ -0,0 +1 @@
+Subproject commit 565968b28583221751cc2810e09ea621745fc3a3
diff --git a/libMinHook.lib b/libMinHook.lib
deleted file mode 100644
index 45dd2a0..0000000
Binary files a/libMinHook.lib and /dev/null differ