2016-01-27 03:32:24 +13:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <array>
|
|
|
|
#include "d3d9.h"
|
|
|
|
#include <MinHook.h>
|
|
|
|
#include "SimpleIni.h"
|
2020-01-23 11:34:48 +13:00
|
|
|
#include "XInputManager.h"
|
2016-01-27 03:32:24 +13:00
|
|
|
|
|
|
|
struct hkIDirect3D9;
|
|
|
|
|
2019-12-24 15:01:31 +13:00
|
|
|
static const char* inifilename = "FF13Fix.ini";
|
|
|
|
#define CONFIG_VERSION 4
|
2016-01-27 03:32:24 +13:00
|
|
|
|
2019-09-01 06:58:56 +12:00
|
|
|
class Config
|
2016-01-27 03:32:24 +13:00
|
|
|
{
|
|
|
|
public:
|
2019-09-01 06:58:56 +12:00
|
|
|
Config(const Config&) = delete;
|
|
|
|
const Config& operator=(Config& other) = delete;
|
|
|
|
|
2016-01-27 03:32:24 +13:00
|
|
|
Config();
|
|
|
|
|
|
|
|
#define SETTING(_type, _func, _var, _section, _defaultval) \
|
|
|
|
private: _type _var; \
|
|
|
|
public: const _type& Get##_var() const { return _var; };
|
|
|
|
#include "Settings.h"
|
|
|
|
#undef SETTING
|
|
|
|
};
|
|
|
|
|
|
|
|
#define DECLARE_HOOK(type, callconv, name, ...) \
|
2019-09-06 06:52:45 +12:00
|
|
|
public: type(callconv* True##name)(__VA_ARGS__) = name; \
|
2016-01-27 03:32:24 +13:00
|
|
|
private: static type callconv Hook##name(__VA_ARGS__);
|
|
|
|
|
2019-09-01 06:58:56 +12:00
|
|
|
class MainContext
|
2016-01-27 03:32:24 +13:00
|
|
|
{
|
2019-09-01 06:58:56 +12:00
|
|
|
MainContext(const MainContext&) = delete;
|
|
|
|
const MainContext& operator=(MainContext& other) = delete;
|
|
|
|
|
2016-01-27 03:32:24 +13:00
|
|
|
DECLARE_HOOK(IDirect3D9*, WINAPI, Direct3DCreate9, UINT SDKVersion);
|
|
|
|
DECLARE_HOOK(LONG, WINAPI, SetWindowLongA, HWND hWnd, int nIndex, LONG dwNewLong);
|
|
|
|
DECLARE_HOOK(LONG, WINAPI, SetWindowLongW, HWND hWnd, int nIndex, LONG dwNewLong);
|
|
|
|
DECLARE_HOOK(HWND, WINAPI, CreateWindowExA, DWORD dwExStyle, LPCSTR lpClassName, LPCSTR lpWindowName,
|
|
|
|
DWORD dwStyle, int X, int Y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam);
|
|
|
|
DECLARE_HOOK(HWND, WINAPI, CreateWindowExW, DWORD dwExStyle, LPCWSTR lpClassName, LPCWSTR lpWindowName,
|
|
|
|
DWORD dwStyle, int X, int Y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam);
|
|
|
|
|
|
|
|
public:
|
2020-01-23 11:34:48 +13:00
|
|
|
MainContext();
|
2016-01-27 03:32:24 +13:00
|
|
|
~MainContext();
|
|
|
|
|
|
|
|
bool ApplyPresentationParameters(D3DPRESENT_PARAMETERS* pPresentationParameters);
|
2020-05-04 07:29:06 +12:00
|
|
|
bool ApplyBehaviorFlagsFix(DWORD* flags);
|
|
|
|
void ScaleScissorRect(RECT * rect);
|
2019-09-01 06:58:56 +12:00
|
|
|
HRESULT APIENTRY ApplyVertexBufferFix(IDirect3DDevice9* pIDirect3DDevice9, UINT Length, DWORD Usage, DWORD FVF, D3DPOOL Pool, IDirect3DVertexBuffer9** ppVertexBuffer, HANDLE* pSharedHandle);
|
2016-01-27 03:32:24 +13:00
|
|
|
bool BehaviorFlagsToString(DWORD BehaviorFlags, std::string* BehaviorFlagsString);
|
|
|
|
|
|
|
|
bool CheckWindow(HWND hWnd);
|
|
|
|
|
|
|
|
void ApplyWndProc(HWND hWnd);
|
|
|
|
void ApplyBorderless(HWND hWnd);
|
|
|
|
|
|
|
|
Config config;
|
|
|
|
|
|
|
|
private:
|
|
|
|
enum AutoFixes : u32
|
|
|
|
{
|
|
|
|
NONE = 0,
|
|
|
|
RESIDENT_EVIL_4,
|
|
|
|
KINGS_BOUNTY_LEGEND,
|
2020-01-05 16:25:35 +13:00
|
|
|
FINAL_FANTASY_XIII,
|
|
|
|
FINAL_FANTASY_XIII2,
|
2016-01-27 03:32:24 +13:00
|
|
|
};
|
|
|
|
|
2020-01-23 11:34:48 +13:00
|
|
|
void EnableAutoFix();
|
|
|
|
|
2016-01-27 03:32:24 +13:00
|
|
|
AutoFixes autofix = AutoFixes::NONE;
|
|
|
|
|
2020-01-23 11:34:48 +13:00
|
|
|
std::mutex oneTimeFixesMutex;
|
2019-12-24 15:01:31 +13:00
|
|
|
bool didOneTimeFixes = false;
|
|
|
|
|
|
|
|
const float MAX_FRAME_RATE_LIMIT = 250000.0F;
|
2020-01-23 11:34:48 +13:00
|
|
|
float** ff13_frame_pacer_ptr = NULL;
|
2020-02-02 09:03:46 +13:00
|
|
|
uint8_t* ff13_set_framerate_ingame_instruction_address = NULL;
|
|
|
|
uint8_t* ff13_continuous_scan_instruction_address = NULL;
|
|
|
|
uint8_t* ff13_enemy_scan_box_code_address = NULL;
|
|
|
|
uint8_t** ff13_base_controller_input_address_ptr = NULL;
|
|
|
|
uint8_t* ff13_vibration_high_set_zero_address = NULL;
|
|
|
|
uint8_t* ff13_vibration_low_set_zero_address = NULL;
|
2020-05-04 07:29:06 +12:00
|
|
|
uint8_t* ff13_loading_screen_scissor_scaling_factor_1 = NULL;
|
|
|
|
uint8_t* ff13_loading_screen_scissor_scaling_factor_2 = NULL;
|
2020-05-04 10:00:06 +12:00
|
|
|
uint8_t* ff13_loading_screen_scissor_scaling_factor_3 = NULL;
|
|
|
|
uint8_t* ff13_loading_screen_scissor_scaling_factor_4 = NULL;
|
2020-05-04 07:29:06 +12:00
|
|
|
uint8_t* ff13_settings_screen_scissor_scaling_factor = NULL;
|
|
|
|
uint8_t* ff13_party_screen_scissor_scaling_factor_1 = NULL;
|
|
|
|
uint8_t* ff13_party_screen_scissor_scaling_factor_2 = NULL;
|
|
|
|
uint8_t* ff13_party_screen_scissor_scaling_factor_3 = NULL;
|
|
|
|
uint8_t* ff13_party_screen_scissor_scaling_factor_4 = NULL;
|
2020-01-25 15:08:40 +13:00
|
|
|
uint32_t* ff13_internal_res_w;
|
|
|
|
uint32_t* ff13_internal_res_h;
|
2020-01-05 16:25:35 +13:00
|
|
|
|
2020-02-02 09:03:46 +13:00
|
|
|
uint8_t* FF13_2_SET_FRAME_RATE_INJECTED_CODE = NULL;
|
|
|
|
uint8_t* ff13_2_continuous_scan_instruction_address;
|
|
|
|
uint8_t* ff13_2_set_frame_rate_address;
|
2020-01-05 16:25:35 +13:00
|
|
|
float** ff13_2_frame_pacer_ptr_address;
|
|
|
|
float ff13_2_targetFrameRate;
|
2020-02-02 09:03:46 +13:00
|
|
|
uint8_t** ff13_2_base_controller_input_address_ptr = NULL;
|
|
|
|
uint8_t* ff13_2_vibration_high_set_zero_address = NULL;
|
|
|
|
uint8_t* ff13_2_vibration_low_set_zero_address = NULL;
|
2020-02-10 13:10:17 +13:00
|
|
|
uint32_t* ff13_2_internal_res_w;
|
|
|
|
uint32_t* ff13_2_internal_res_h;
|
2020-01-05 16:25:35 +13:00
|
|
|
|
|
|
|
const float FF13_2_30_FPS = 30.0F;
|
|
|
|
const float FF13_2_MAX_FRAME_CAP = 1000.0F;
|
2020-05-04 07:29:06 +12:00
|
|
|
|
2020-05-04 10:00:06 +12:00
|
|
|
float scissor_scaling_factor_w = 1.0f;
|
|
|
|
float scissor_scaling_factor_h = 1.0f;
|
2020-05-04 07:29:06 +12:00
|
|
|
|
2020-01-23 11:34:48 +13:00
|
|
|
XInputManager* xinputManager;
|
2020-02-10 13:10:17 +13:00
|
|
|
std::thread * patchingThread = NULL;
|
2020-01-05 16:25:35 +13:00
|
|
|
|
2016-01-27 03:32:24 +13:00
|
|
|
void FixBehaviorFlagConflict(const DWORD flags_in, DWORD* flags_out);
|
|
|
|
static const std::map<const AutoFixes, const uint32_t> behaviorflags_fixes;
|
|
|
|
|
|
|
|
static LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
|
|
WNDPROC oldWndProc;
|
2019-12-24 15:01:31 +13:00
|
|
|
|
2020-01-12 04:23:50 +13:00
|
|
|
void ChangeMemoryProtectionToReadWriteExecute(void* address, const int size);
|
|
|
|
bool AreAlmostTheSame(float a, float b);
|
|
|
|
void PrintVersionInfo();
|
2020-01-05 16:25:35 +13:00
|
|
|
|
2020-02-09 09:55:23 +13:00
|
|
|
|
2020-02-10 13:10:17 +13:00
|
|
|
static void FF13_AsyncPatching();
|
2020-01-23 11:34:48 +13:00
|
|
|
void FF13_InitializeGameAddresses();
|
2020-05-04 07:29:06 +12:00
|
|
|
void FF13_OneTimeFixes();
|
|
|
|
void FF13_Workaround_1440_Res_Bug();
|
2020-01-23 11:34:48 +13:00
|
|
|
void FF13_EnableControllerVibration();
|
|
|
|
void FF13_NOPIngameFrameRateLimitSetter();
|
|
|
|
void FF13_SetFrameRateVariables();
|
2020-05-04 07:29:06 +12:00
|
|
|
void FF13_FixScissorRect();
|
2020-01-05 16:25:35 +13:00
|
|
|
void FF13_RemoveContinuousControllerScan();
|
|
|
|
|
2020-02-10 13:10:17 +13:00
|
|
|
static void FF13_2_AsyncPatching();
|
2020-01-23 11:34:48 +13:00
|
|
|
void FF13_2_CreateSetFrameRateCodeBlock();
|
|
|
|
void FF13_2_InitializeGameAddresses();
|
2020-01-05 16:25:35 +13:00
|
|
|
void FF13_2_RemoveContinuousControllerScan();
|
|
|
|
void FF13_2_AddHookIngameFrameRateLimitSetter();
|
2020-01-23 11:34:48 +13:00
|
|
|
void FF13_2_OneTimeFixes();
|
2020-02-10 13:10:17 +13:00
|
|
|
void FF13_2_Workaround_2560_1440_Res_Bug();
|
2020-01-23 11:34:48 +13:00
|
|
|
void FF13_2_EnableControllerVibration();
|
2016-01-27 03:32:24 +13:00
|
|
|
};
|
|
|
|
|
|
|
|
extern MainContext context;
|