Changed the namespace for HRP modules

Moved some functions to the HRP namespace.
This commit is contained in:
NovaRain
2021-11-17 10:03:45 +08:00
parent 5265dd8ded
commit 1c3f3dbbd5
28 changed files with 279 additions and 259 deletions
+7 -8
View File
@@ -9,7 +9,6 @@
#include "..\..\Modules\Console.h"
#include "..\..\HRP\Init.h"
#include "..\..\HRP\InterfaceBar.h"
#include "Text.h"
@@ -57,18 +56,18 @@ static long GetPositionWidth(const char* text, long width) {
static void __fastcall DisplayPrint(const char* message, bool lineBreak) {
if (*message == 0 || !fo::var::getInt(FO_VAR_disp_init)) return;
sfall::Console::PrintFile(message);
sf::Console::PrintFile(message);
const long max_lines = 100; // aka FO_VAR_max
long max_disp_chars = 256; // HRP value (vanilla 80)
char* display_string_buf_addr = sf::IFaceBar::display_string_buf; // array size: 100x80 (or 100x256 for sfall HRP)
char* display_string_buf_addr = HRP::IFaceBar::display_string_buf; // array size: 100x80 (or 100x256 for sfall HRP)
long width = (sf::hrpIsEnabled) ? sf::GetIntHRPValue(HRP_VAR_disp_width) : sf::IFaceBar::display_width;
long width = (HRP::Setting::ExternalEnabled()) ? sf::GetIntHRPValue(HRP_VAR_disp_width) : HRP::IFaceBar::display_width;
if (width == 0) {
width = 167; // vanilla size
max_disp_chars = 80;
} else if (sfall::hrpIsEnabled) {
display_string_buf_addr = (char*)sf::HRPAddress(HRP_VAR_display_string_buf); // array size 100x256, allocated by Mash's HRP
} else if (HRP::Setting::ExternalEnabled()) {
display_string_buf_addr = (char*)HRP::Setting::GetAddress(HRP_VAR_display_string_buf); // array size 100x256, allocated by Mash's HRP
}
if (!(fo::var::combat_state & fo::CombatStateFlag::InCombat)) {
@@ -189,10 +188,10 @@ static void __declspec(naked) display_print_line_break_extHRP() {
void Text::init() {
void* printFunc = display_print_line_break; // for vanilla and HRP 4.1.8
if (sf::HRP::Enabled) {
if (HRP::Setting::IsEnabled()) {
sf::MakeJump(fo::funcoffs::display_print_, display_print_hack_replacemet); // 0x43186C
} else {
if (sf::hrpIsEnabled && !sf::hrpVersionValid) {
if (HRP::Setting::ExternalEnabled() && !HRP::Setting::VersionIsValid) {
printFunc = display_print_line_break_extHRP;
}
}
+27 -25
View File
@@ -14,9 +14,11 @@
#include "Dialog.h"
namespace sfall
namespace HRP
{
namespace sf = sfall;
static const long width = 640; // art
static long scr_width = 639;
@@ -187,7 +189,7 @@ static void UnloadDialogArt() {
void Dialog::init() {
// replace width size for buffers functons
SafeWriteBatch(&scr_width, {
sf::SafeWriteBatch(&scr_width, {
0x447201, 0x447248, //0x44716F, // gdCreateHeadWindow_
0x4459F0, 0x445A0C, //0x44597A, // gdReviewInit_
0x445DA7, 0x445DD1, // gdReviewDisplay_
@@ -217,8 +219,8 @@ void Dialog::init() {
0x4733DF, 0x47343A, // inven_action_cursor_
});
HookCall(0x44718F, gdCreateHeadWindow_hook_win_add);
HookCalls(GeneralDialogWinAdd, {
sf::HookCall(0x44718F, gdCreateHeadWindow_hook_win_add);
sf::HookCalls(GeneralDialogWinAdd, {
0x445997, // gdReviewInit_
0x44A6E4, // gdialog_window_create_
0x448333, // gdialog_barter_create_win_
@@ -228,48 +230,48 @@ void Dialog::init() {
// gdCustomSelect_
long yoffset = (DIALOG_SCRN_BACKGROUND) ? 100 : 200; // shifted the window up so that the window with the selected options was visible
SafeWrite32(0x44A03E, HRP::ScreenHeight() - yoffset);
SafeWrite32(0x44A02A, HRP::ScreenWidth());
sf::SafeWrite32(0x44A03E, Setting::ScreenHeight() - yoffset);
sf::SafeWrite32(0x44A02A, Setting::ScreenWidth());
HookCall(0x4462A7, gdProcess_hook_win_add);
HookCall(0x446387, gdProcess_hook_win_add);
sf::HookCall(0x4462A7, gdProcess_hook_win_add);
sf::HookCall(0x446387, gdProcess_hook_win_add);
HookCall(0x447900, hook_buf_to_buf); // demo_copy_options_
HookCall(0x447A46, hook_buf_to_buf); // gDialogRefreshOptionsRect_
sf::HookCall(0x447900, hook_buf_to_buf); // demo_copy_options_
sf::HookCall(0x447A46, hook_buf_to_buf); // gDialogRefreshOptionsRect_
HookCall(0x44AF39, gdDisplayFrame_hook_buf_to_buf);
sf::HookCall(0x44AF39, gdDisplayFrame_hook_buf_to_buf);
// Barter interface hacks
HookCall(0x46EDC9, setup_inventory_hook_win_add);
MakeCall(0x46EDD8, setup_inventory_hack);
HookCalls(barter_move_hook_mouse_click_in, {
sf::HookCall(0x46EDC9, setup_inventory_hook_win_add);
sf::MakeCall(0x46EDD8, setup_inventory_hack);
sf::HookCalls(barter_move_hook_mouse_click_in, {
0x474F76, 0x474FF9, // barter_move_inventory_
0x475241, 0x4752C2, // barter_move_from_table_inventory_
0x449661 // gdControl_ (custom disposition button)
});
if (DIALOG_SCRN_BACKGROUND) HookCall(0x4472D8, gdDestroyHeadWindow_hook_win_delete);
if (DIALOG_SCRN_BACKGROUND) sf::HookCall(0x4472D8, gdDestroyHeadWindow_hook_win_delete);
if (DIALOG_SCRN_ART_FIX) {
HookCall(0x44AB79, talk_to_refresh_background_window_hook_buf_to_buf);
sf::HookCall(0x44AB79, talk_to_refresh_background_window_hook_buf_to_buf);
// gdCreateHeadWindow_
SafeWrite16(0x447255, 0xD269);
SafeWrite32(0x447257, 19); // y
SafeWrite8(0x44725B, 0x90);
SafeWrite16(0x44725C, 0x3EB);
sf::SafeWrite16(0x447255, 0xD269);
sf::SafeWrite32(0x447257, 19); // y
sf::SafeWrite8(0x44725B, 0x90);
sf::SafeWrite16(0x44725C, 0x3EB);
// gdDisplayFrame_
SafeWrite8(0x44AF9D, 20); // 15 to 20
SafeWrite32(0x44AFEB, 219); // 214 to 219
SafeWrite32(0x44AF47, 19); // 14 to 19
SafeWrite32(0x44AF51, 219); // 214 to 219
sf::SafeWrite8(0x44AF9D, 20); // 15 to 20
sf::SafeWrite32(0x44AFEB, 219); // 214 to 219
sf::SafeWrite32(0x44AF47, 19); // 14 to 19
sf::SafeWrite32(0x44AF51, 219); // 214 to 219
for (size_t i = 0; i < 8; i++) {
fo::var::backgrndRects[i].y += 5;
fo::var::backgrndRects[i].offy += 5;
}
LoadGameHook::OnGameExit() += UnloadDialogArt;
sf::LoadGameHook::OnGameExit() += UnloadDialogArt;
}
}
+1 -1
View File
@@ -6,7 +6,7 @@
#pragma once
namespace sfall
namespace HRP
{
class Dialog {
+1 -1
View File
@@ -8,7 +8,7 @@
#include "Image.h"
namespace sfall
namespace HRP
{
long Image::GetAspectSize(long &dW, long &dH, float sW, float sH) {
+1 -1
View File
@@ -6,7 +6,7 @@
#pragma once
namespace sfall
namespace HRP
{
class Image {
+67 -56
View File
@@ -20,43 +20,54 @@
#include "Init.h"
namespace sfall
namespace HRP
{
static const char* f2ResIni = ".\\f2_res.ini";
namespace sf = sfall;
static const char* f2ResIni = ".\\f2_res.ini";
static DWORD baseDLLAddr = 0; // 0x10000000
bool Setting::VersionIsValid = false;
static bool enabled;
static long SCR_WIDTH = 640;
static long SCR_HEIGHT = 480;
bool HRP::Enabled;
long HRP::ScreenWidth() { return SCR_WIDTH; }
long HRP::ScreenHeight() { return SCR_HEIGHT; }
DWORD HRP::hrpDLLBaseAddr = 0x10000000;
bool Setting::IsEnabled() { return enabled; }
long Setting::ScreenWidth() { return SCR_WIDTH; }
long Setting::ScreenHeight() { return SCR_HEIGHT; }
static void GetHRPModule() {
static const DWORD loadFunc = 0x4FE1D0;
HMODULE dll;
__asm call loadFunc; // get HRP loading address
__asm mov dll, eax;
if (dll != NULL) HRP::hrpDLLBaseAddr = (DWORD)dll;
dlog_f("Loaded f2_res.dll library at the memory address: 0x%x\n", DL_MAIN, dll);
__asm mov baseDLLAddr, eax;
sf::dlog_f("Loaded f2_res.dll library at the memory address: 0x%x\n", DL_MAIN, dll);
}
bool HRP::CheckExternalPatch() {
bool Setting::CheckExternalPatch() {
bool isEnabled = (*(DWORD*)0x4E4480 != 0x278805C7); // check if Mash's HRP is enabled
if (isEnabled) {
GetHRPModule();
MODULEINFO info;
if (GetModuleInformation(GetCurrentProcess(), (HMODULE)HRP::hrpDLLBaseAddr, &info, sizeof(info)) && info.SizeOfImage >= 0x39940 + 7) {
if (GetByteHRPValue(HRP_VAR_VERSION_STR + 7) == 0 && std::strncmp((const char*)HRPAddress(HRP_VAR_VERSION_STR), "4.1.8", 5) == 0) {
hrpVersionValid = true;
if (GetModuleInformation(GetCurrentProcess(), (HMODULE)baseDLLAddr, &info, sizeof(info)) && info.SizeOfImage >= 0x39940 + 7) {
if (sf::GetByteHRPValue(HRP_VAR_VERSION_STR + 7) == 0 && std::strncmp((const char*)GetAddress(HRP_VAR_VERSION_STR), "4.1.8", 5) == 0) {
VersionIsValid = true;
}
}
}
return isEnabled;
return ExternalEnabled();
}
DWORD Setting::GetAddress(DWORD addr) {
return (baseDLLAddr + (addr & 0xFFFFF));
}
bool Setting::ExternalEnabled() {
return (baseDLLAddr != 0);
}
/*
static void __declspec(naked) mem_copy() {
__asm {
@@ -112,24 +123,24 @@ forward:
}
}
*/
void HRP::init() {
void Setting::init() {
//HookCall(0x482899, mem_copy);
//SafeWrite16(0x4B2EA8, 0x9090); // _show_grid
if (!hrpIsEnabled && IniReader::GetIntDefaultConfig("Main", "HiResMode", 1) == 0) return; // vanilla game mode
if (!Setting::ExternalEnabled() && sf::IniReader::GetIntDefaultConfig("Main", "HiResMode", 1) == 0) return; // vanilla game mode
SCR_WIDTH = IniReader::GetInt("Main", "SCR_WIDTH", 640, f2ResIni);
SCR_HEIGHT = IniReader::GetInt("Main", "SCR_HEIGHT", 480, f2ResIni);
SCR_WIDTH = sf::IniReader::GetInt("Main", "SCR_WIDTH", 640, f2ResIni);
SCR_HEIGHT = sf::IniReader::GetInt("Main", "SCR_HEIGHT", 480, f2ResIni);
if (SCR_WIDTH < 640) SCR_WIDTH = 640;
if (SCR_HEIGHT < 480) SCR_HEIGHT = 480;
if (hrpIsEnabled) { // external
if (Setting::ExternalEnabled()) {
// You have both the built-in and external HRP enabled at the same time. It is recommended to turn off the external HRP by Mash.
// To continue using the external HRP, disable the HiResMode option in ddraw.ini
return;
}
Enabled = true;
enabled = true;
// Read config
@@ -139,66 +150,66 @@ void HRP::init() {
//gDirectDrawMode = IniReader::GetInt("Main", "GRAPHICS_MODE", 2, f2ResIni) == 1;
MainMenuScreen::SCALE_BUTTONS_AND_TEXT_MENU = (IniReader::GetInt("MAINMENU", "SCALE_BUTTONS_AND_TEXT_MENU", 0, f2ResIni) != 0);
MainMenuScreen::USE_HIRES_IMAGES = (IniReader::GetInt("MAINMENU", "USE_HIRES_IMAGES", 1, f2ResIni) != 0);
MainMenuScreen::MENU_BG_OFFSET_X += IniReader::GetInt("MAINMENU", "MENU_BG_OFFSET_X", -14, f2ResIni);
MainMenuScreen::MENU_BG_OFFSET_Y += IniReader::GetInt("MAINMENU", "MENU_BG_OFFSET_Y", -4, f2ResIni);
MainMenuScreen::MAIN_MENU_SIZE = IniReader::GetInt("MAINMENU", "MAIN_MENU_SIZE", 1, f2ResIni);
MainMenuScreen::SCALE_BUTTONS_AND_TEXT_MENU = (sf::IniReader::GetInt("MAINMENU", "SCALE_BUTTONS_AND_TEXT_MENU", 0, f2ResIni) != 0);
MainMenuScreen::USE_HIRES_IMAGES = (sf::IniReader::GetInt("MAINMENU", "USE_HIRES_IMAGES", 1, f2ResIni) != 0);
MainMenuScreen::MENU_BG_OFFSET_X += sf::IniReader::GetInt("MAINMENU", "MENU_BG_OFFSET_X", -14, f2ResIni);
MainMenuScreen::MENU_BG_OFFSET_Y += sf::IniReader::GetInt("MAINMENU", "MENU_BG_OFFSET_Y", -4, f2ResIni);
MainMenuScreen::MAIN_MENU_SIZE = sf::IniReader::GetInt("MAINMENU", "MAIN_MENU_SIZE", 1, f2ResIni);
SplashScreen::SPLASH_SCRN_SIZE = IniReader::GetInt("STATIC_SCREENS", "SPLASH_SCRN_SIZE", 1, f2ResIni);
SplashScreen::SPLASH_SCRN_SIZE = sf::IniReader::GetInt("STATIC_SCREENS", "SPLASH_SCRN_SIZE", 1, f2ResIni);
//DEATH_SCRN_SIZE
//END_SLIDE_SIZE
//HELP_SCRN_SIZE
std::string x = trim(IniReader::GetString("MAPS", "SCROLL_DIST_X", "480", 16, f2ResIni));
std::string y = trim(IniReader::GetString("MAPS", "SCROLL_DIST_Y", "400", 16, f2ResIni));
std::string x = sf::trim(sf::IniReader::GetString("MAPS", "SCROLL_DIST_X", "480", 16, f2ResIni));
std::string y = sf::trim(sf::IniReader::GetString("MAPS", "SCROLL_DIST_Y", "400", 16, f2ResIni));
ViewMap::SCROLL_DIST_X = (!x.compare(0, 9, "HALF_SCRN")) ? (SCR_WIDTH / 2) + 32 : std::atol(x.c_str());
ViewMap::SCROLL_DIST_Y = (!y.compare(0, 9, "HALF_SCRN")) ? (SCR_HEIGHT / 2) + 24 : std::atol(y.c_str());
ViewMap::IGNORE_PLAYER_SCROLL_LIMITS = (IniReader::GetInt("MAPS", "IGNORE_PLAYER_SCROLL_LIMITS", 0, f2ResIni) != 0);
ViewMap::IGNORE_MAP_EDGES = (IniReader::GetInt("MAPS", "IGNORE_MAP_EDGES", 0, f2ResIni) != 0);
ViewMap::EDGE_CLIPPING_ON = (IniReader::GetInt("MAPS", "EDGE_CLIPPING_ON", 1, f2ResIni) != 0);
ViewMap::IGNORE_PLAYER_SCROLL_LIMITS = (sf::IniReader::GetInt("MAPS", "IGNORE_PLAYER_SCROLL_LIMITS", 0, f2ResIni) != 0);
ViewMap::IGNORE_MAP_EDGES = (sf::IniReader::GetInt("MAPS", "IGNORE_MAP_EDGES", 0, f2ResIni) != 0);
ViewMap::EDGE_CLIPPING_ON = (sf::IniReader::GetInt("MAPS", "EDGE_CLIPPING_ON", 1, f2ResIni) != 0);
IFaceBar::IFACE_BAR_MODE = IniReader::GetInt("IFACE", "IFACE_BAR_MODE", 0, f2ResIni);
IFaceBar::IFACE_BAR_SIDE_ART = IniReader::GetInt("IFACE", "IFACE_BAR_SIDE_ART", 2, f2ResIni);
IFaceBar::IFACE_BAR_WIDTH = IniReader::GetInt("IFACE", "IFACE_BAR_WIDTH", (SCR_WIDTH >= 800) ? 800 : 640, f2ResIni);
IFaceBar::IFACE_BAR_SIDES_ORI = (IniReader::GetInt("IFACE", "IFACE_BAR_SIDES_ORI", 0, f2ResIni) != 0);
IFaceBar::IFACE_BAR_MODE = sf::IniReader::GetInt("IFACE", "IFACE_BAR_MODE", 0, f2ResIni);
IFaceBar::IFACE_BAR_SIDE_ART = sf::IniReader::GetInt("IFACE", "IFACE_BAR_SIDE_ART", 2, f2ResIni);
IFaceBar::IFACE_BAR_WIDTH = sf::IniReader::GetInt("IFACE", "IFACE_BAR_WIDTH", (SCR_WIDTH >= 800) ? 800 : 640, f2ResIni);
IFaceBar::IFACE_BAR_SIDES_ORI = (sf::IniReader::GetInt("IFACE", "IFACE_BAR_SIDES_ORI", 0, f2ResIni) != 0);
Dialog::DIALOG_SCRN_ART_FIX = (IniReader::GetInt("OTHER_SETTINGS", "DIALOG_SCRN_ART_FIX", 1, f2ResIni) != 0);
Dialog::DIALOG_SCRN_BACKGROUND = (IniReader::GetInt("OTHER_SETTINGS", "DIALOG_SCRN_BACKGROUND", 0, f2ResIni) != 0);
Dialog::DIALOG_SCRN_ART_FIX = (sf::IniReader::GetInt("OTHER_SETTINGS", "DIALOG_SCRN_ART_FIX", 1, f2ResIni) != 0);
Dialog::DIALOG_SCRN_BACKGROUND = (sf::IniReader::GetInt("OTHER_SETTINGS", "DIALOG_SCRN_BACKGROUND", 0, f2ResIni) != 0);
if (IniReader::GetInt("OTHER_SETTINGS", "BARTER_PC_INV_DROP_FIX", 1, f2ResIni)) {
if (sf::IniReader::GetInt("OTHER_SETTINGS", "BARTER_PC_INV_DROP_FIX", 1, f2ResIni)) {
// barter_move_from_table_inventory_
if (fo::var::getInt(0x47523D) == 80) SafeWrite32(0x47523D, 100); // x_start
if (fo::var::getInt(0x475231) == 144) SafeWrite32(0x475231, 164); // x_end
if (fo::var::getInt(0x47523D) == 80) sf::SafeWrite32(0x47523D, 100); // x_start
if (fo::var::getInt(0x475231) == 144) sf::SafeWrite32(0x475231, 164); // x_end
}
// add before sfall.dat and after critter.dat
LoadOrder::AddResourcePatches(
IniReader::GetString("Main", "f2_res_dat", "f2_res.dat", MAX_PATH, f2ResIni),
IniReader::GetString("Main", "f2_res_patches", "", MAX_PATH, f2ResIni)
sf::LoadOrder::AddResourcePatches(
sf::IniReader::GetString("Main", "f2_res_dat", "f2_res.dat", MAX_PATH, f2ResIni),
sf::IniReader::GetString("Main", "f2_res_patches", "", MAX_PATH, f2ResIni)
);
/* Inject hacks */
SafeWrite32(0x482E30, FO_VAR_mapEntranceTileNum); // map_load_file_ (_tile_center_tile to _mapEntranceTileNum)
sf::SafeWrite32(0x482E30, FO_VAR_mapEntranceTileNum); // map_load_file_ (_tile_center_tile to _mapEntranceTileNum)
if (SCR_WIDTH != 640 || SCR_HEIGHT != 480) {
// Set the resolution for GNW95_init_mode_ex_
SafeWrite32(0x4CAD6B, SCR_WIDTH); // 640
SafeWrite32(0x4CAD66, SCR_HEIGHT); // 480
sf::SafeWrite32(0x4CAD6B, SCR_WIDTH); // 640
sf::SafeWrite32(0x4CAD66, SCR_HEIGHT); // 480
// Set the resolution for the overlapping temporary black window when loading/starting the game
// main_load_new_
SafeWrite32(0x480D6C, SCR_HEIGHT);
SafeWrite32(0x480D84, SCR_WIDTH);
sf::SafeWrite32(0x480D6C, SCR_HEIGHT);
sf::SafeWrite32(0x480D84, SCR_WIDTH);
// gnw_main_
SafeWrite32(0x480AFA, SCR_HEIGHT); // -100 for ifacebar?
SafeWrite32(0x480B04, SCR_WIDTH);
sf::SafeWrite32(0x480AFA, SCR_HEIGHT); // -100 for ifacebar?
sf::SafeWrite32(0x480B04, SCR_WIDTH);
// LoadGame_
SafeWrite32(0x47C6E0, SCR_HEIGHT);
SafeWrite32(0x47C6E5, SCR_WIDTH);
SafeWrite32(0x47C703, SCR_WIDTH);
SafeWrite32(0x47C70D, SCR_HEIGHT);
sf::SafeWrite32(0x47C6E0, SCR_HEIGHT);
sf::SafeWrite32(0x47C6E5, SCR_WIDTH);
sf::SafeWrite32(0x47C703, SCR_WIDTH);
sf::SafeWrite32(0x47C70D, SCR_HEIGHT);
}
// Inits
+6 -4
View File
@@ -6,18 +6,20 @@
#pragma once
namespace sfall
namespace HRP
{
class HRP {
class Setting {
public:
static void init();
static DWORD hrpDLLBaseAddr;
static DWORD GetAddress(DWORD addr);
static bool VersionIsValid; // HRP 4.1.8 version validation
static bool CheckExternalPatch();
static bool ExternalEnabled();
// Built-in high resolution patch
static bool Enabled;
static bool IsEnabled();
static long ScreenWidth();
static long ScreenHeight();
+44 -42
View File
@@ -13,9 +13,11 @@
#include "InterfaceBar.h"
namespace sfall
namespace HRP
{
namespace sf = sfall;
long IFaceBar::IFACE_BAR_MODE; // 1 - the bottom of the map view window extends to the base of the screen and is overlapped by the IFACE Bar
long IFaceBar::IFACE_BAR_SIDE_ART;
long IFaceBar::IFACE_BAR_WIDTH;
@@ -82,17 +84,17 @@ public:
static long __fastcall IntfaceWinCreate(long height, long yPos, long xPos, long width, long color, long flags) {
if (width != IFaceBar::IFACE_BAR_WIDTH) width = IFaceBar::IFACE_BAR_WIDTH;
yPos += HRP::ScreenHeight() - 479; // yPos:379 = 479-100
xPos += (HRP::ScreenWidth() - width) / 2;
yPos += Setting::ScreenHeight() - 479; // yPos:379 = 479-100
xPos += (Setting::ScreenWidth() - width) / 2;
xPosition = xPos;
yPosition = yPos;
flags |= fo::WinFlags::DontMoveTop;
if (IFaceBar::IFACE_BAR_MODE == 0 && IFaceBar::IFACE_BAR_SIDE_ART && HRP::ScreenWidth() > IFaceBar::IFACE_BAR_WIDTH) {
if (IFaceBar::IFACE_BAR_MODE == 0 && IFaceBar::IFACE_BAR_SIDE_ART && Setting::ScreenWidth() > IFaceBar::IFACE_BAR_WIDTH) {
long leftID = fo::func::win_add(0, yPos, xPos, height, 0, flags);
long rightID = fo::func::win_add(xPos + width, yPos, HRP::ScreenWidth() - (xPos + width), height, 0, flags);
long rightID = fo::func::win_add(xPos + width, yPos, Setting::ScreenWidth() - (xPos + width), height, 0, flags);
panels = new Panels(leftID, rightID);
}
@@ -184,7 +186,7 @@ static void InterfaceArtScale(BYTE* scr, long w, long h, BYTE* dst, long dh) {
}
static long __cdecl InterfaceArt(BYTE* scr, long w, long h, long srcWidth, BYTE* dst, long dstWidth) {
if (HRP::ScreenWidth() >= IFaceBar::IFACE_BAR_WIDTH) {
if (Setting::ScreenWidth() >= IFaceBar::IFACE_BAR_WIDTH) {
xOffset = IFaceBar::IFACE_BAR_WIDTH - 640;
xyOffsetAP = 15 * xOffset;
xyOffsetCBtn = 39 * xOffset;
@@ -375,70 +377,70 @@ void IFaceBar::init() {
display_width = IFaceBar::IFACE_BAR_WIDTH - 473; // message display width (800-473=327)
display_string_buf = new char[100 * 256];
HookCall(0x45D950, intface_init_hook_buf_to_buf_ART);
HookCall(0x45E35C, intface_init_hook_buf_to_buf);
sf::HookCall(0x45D950, intface_init_hook_buf_to_buf_ART);
sf::HookCall(0x45E35C, intface_init_hook_buf_to_buf);
HookCalls(intface_update_move_points_hook_buf_to_buf, {0x45EE43, 0x45EEDF, 0x45EF2D});
sf::HookCalls(intface_update_move_points_hook_buf_to_buf, {0x45EE43, 0x45EEDF, 0x45EF2D});
HookCalls(intface_win_register_button, {
sf::HookCalls(intface_win_register_button, {
0x45DA0E, 0x45DAED, 0x45DC0D, 0x45DD44, 0x45DE33, 0x45DF22, 0x45E0B5, 0x45E1EF, // intface_init_
0x460883, // intface_create_end_turn_button_
0x4609E3, // intface_create_end_combat_button_
});
HookCalls(combat_buttons_buf_to_buf, {
sf::HookCalls(combat_buttons_buf_to_buf, {
0x45FA2A, 0x45FA7B, // intface_end_window_open_
0x45FB87, 0x45FBD1, // intface_end_window_close_
});
// intface_end_buttons_enable_, intface_end_buttons_disable_
HookCalls(combat_buttons_trans_buf_to_buf, {0x45FC72, 0x45FD06});
sf::HookCalls(combat_buttons_trans_buf_to_buf, {0x45FC72, 0x45FD06});
// display_init_ hacks
MakeCall(0x43166F, display_init_hack);
HookCall(0x431704, display_init_hook_buf_to_buf);
SafeWrite32(0x43172A, display_width);
SafeWrite32(0x431770, display_width);
sf::MakeCall(0x43166F, display_init_hack);
sf::HookCall(0x431704, display_init_hook_buf_to_buf);
sf::SafeWrite32(0x43172A, display_width);
sf::SafeWrite32(0x431770, display_width);
HookCalls(DisplayReset, {
sf::HookCalls(DisplayReset, {
0x4317EE, // display_init_
0x431841 // display_reset_
});
// jle > jmp
SafeWrite8(0x4317C1, CodeType::JumpShort); // display_init_
SafeWrite8(0x431814, CodeType::JumpShort); // display_reset_
sf::SafeWrite8(0x4317C1, sf::CodeType::JumpShort); // display_init_
sf::SafeWrite8(0x431814, sf::CodeType::JumpShort); // display_reset_
// display_redraw_ hacks
MakeCall(0x431B19, display_redraw_hack);
SafeWrite32(0x431AB9, display_width);
SafeWrite32(0x431AC0, display_width);
SafeWrite32(0x431B3B, display_width);
SafeWrite32(0x431B36, (DWORD)display_string_buf);
sf::MakeCall(0x431B19, display_redraw_hack);
sf::SafeWrite32(0x431AB9, display_width);
sf::SafeWrite32(0x431AC0, display_width);
sf::SafeWrite32(0x431B3B, display_width);
sf::SafeWrite32(0x431B36, (DWORD)display_string_buf);
// rotate numbers hacks
MakeCall(0x460BF3, intface_rotate_numbers_hack, 4);
sf::MakeCall(0x460BF3, intface_rotate_numbers_hack, 4);
// remove 'shl eax, 7'
SafeWrite16(0x460C02, 0x9090);
SafeWrite8(0x460C04, 0x90);
sf::SafeWrite16(0x460C02, 0x9090);
sf::SafeWrite8(0x460C04, 0x90);
HookCalls(intface_rotate_numbers_hook_buf_to_buf, {
sf::HookCalls(intface_rotate_numbers_hook_buf_to_buf, {
0x460CC4, 0x460CF8, 0x460D2C, 0x460D75, 0x460EA1, 0x460EF1, 0x460F47,
0x460FA0, 0x460FDD, 0x461010, 0x461060, 0x461085, 0x4610AB, 0x4610EC
});
if (ALTERNATE_AMMO_METRE == 0) {
// intface_draw_ammo_lights_ hacks
MakeCall(0x460AA6, intface_draw_ammo_lights_hack);
SafeWriteBatch<DWORD>(IFACE_BAR_WIDTH, {0x460AC8, 0x460AD8, 0x460AE3});
SafeWrite32(0x460AB4, 26 * IFACE_BAR_WIDTH); // y position
sf::MakeCall(0x460AA6, intface_draw_ammo_lights_hack);
sf::SafeWriteBatch<DWORD>(IFACE_BAR_WIDTH, {0x460AC8, 0x460AD8, 0x460AE3});
sf::SafeWrite32(0x460AB4, 26 * IFACE_BAR_WIDTH); // y position
}
}
HookCall(0x45D8BC, intface_init_hook_win_add);
HookCall(0x4615FF, refresh_box_bar_win_hook_win_add);
HookCall(0x4AC260, skilldex_start_hook_win_add);
sf::HookCall(0x45D8BC, intface_init_hook_win_add);
sf::HookCall(0x4615FF, refresh_box_bar_win_hook_win_add);
sf::HookCall(0x4AC260, skilldex_start_hook_win_add);
HookCall(0x45EA48, intface_show_hook_win_show);
HookCalls(intface_win_hide, {
sf::HookCall(0x45EA48, intface_show_hook_win_show);
sf::HookCalls(intface_win_hide, {
0x45E3F5, // intface_reset_
0x45E8FB, // intface_load_
0x45E9FD // intface_hide_
@@ -450,16 +452,16 @@ void IFaceBar::init() {
if (IFACE_BAR_MODE > 0) {
// Set view map height to game resolution
// replace subtract 99 with add 1
SafeWrite8(0x481CDF, 1);
SafeWrite8(0x481E2E, 1);
sf::SafeWrite8(0x481CDF, 1);
sf::SafeWrite8(0x481E2E, 1);
// replace subtract 99 with add 1
SafeWrite8(0x481DC3, -1);
SafeWrite8(0x4827A9, -1);
sf::SafeWrite8(0x481DC3, -1);
sf::SafeWrite8(0x4827A9, -1);
// remove subtract 100
SafeWrite8(0x48284F, 0);
sf::SafeWrite8(0x48284F, 0);
}
LoadGameHook::OnBeforeGameClose() += []() {
sf::LoadGameHook::OnBeforeGameClose() += []() {
if (IFACE_BAR_WIDTH > 640) {
delete[] display_string_buf;
delete panels;
+1 -1
View File
@@ -6,7 +6,7 @@
#pragma once
namespace sfall
namespace HRP
{
class IFaceBar {
+10 -8
View File
@@ -11,9 +11,11 @@
#include "Inventory.h"
namespace sfall
namespace HRP
{
namespace sf = sfall;
static bool setPosition[3];
static long xPosition;
static long yPosition;
@@ -21,7 +23,7 @@ static long yPosition;
static long __fastcall CreateWin(long height, long yPos, long xPos, long width, long mode, long color, long flags) {
if (!setPosition[mode]) {
setPosition[mode] = true;
long x = (HRP::ScreenWidth() - width) / 2;
long x = (Setting::ScreenWidth() - width) / 2;
long y = (fo::var::getInt(FO_VAR_buf_length_2) - height) / 2;
fo::var::iscr_data[mode].x = x;
fo::var::iscr_data[mode].y = y;
@@ -65,18 +67,18 @@ static void __declspec(naked) inventory_hook_mouse_click_in() {
void Inventory::init() {
// set timer window position to center screen
fo::var::iscr_data[5].x = (HRP::ScreenWidth() - fo::var::iscr_data[5].width) / 2;
fo::var::iscr_data[5].y = (HRP::ScreenHeight() - fo::var::iscr_data[5].height) / 2;
fo::var::iscr_data[5].x = (Setting::ScreenWidth() - fo::var::iscr_data[5].width) / 2;
fo::var::iscr_data[5].y = (Setting::ScreenHeight() - fo::var::iscr_data[5].height) / 2;
HookCall(0x46ED0E, setup_inventory_hook_win_add);
HookCalls(inventory_hook_mouse_click_in, {
sf::HookCall(0x46ED0E, setup_inventory_hook_win_add);
sf::HookCalls(inventory_hook_mouse_click_in, {
0x471145, 0x471270, 0x471301, 0x47138B, // inven_pickup_
0x474959, 0x474A23 // move_inventory_
});
// setup_inventory_
SafeMemSet(0x46ED23, CodeType::Nop, 6);
SafeMemSet(0x46ED31, CodeType::Nop, 6);
sf::SafeMemSet(0x46ED23, sf::CodeType::Nop, 6);
sf::SafeMemSet(0x46ED31, sf::CodeType::Nop, 6);
}
}
+1 -1
View File
@@ -6,7 +6,7 @@
#pragma once
namespace sfall
namespace HRP
{
class Inventory {
+30 -28
View File
@@ -16,9 +16,11 @@
#include "MainMenu.h"
namespace sfall
namespace HRP
{
namespace sf = sfall;
// 0 - main-menu image will display at its original size
// 1 - main-menu image will stretch to fit the screen while maintaining its aspect ratio
// 2 - main-menu image will stretch to fill the screen
@@ -93,7 +95,7 @@ static long __fastcall main_menu_create_hook_add_win(long h, long y, long color,
long offset = 0;
long sw = w, sh = h;
Graphics::BackgroundClearColor(0);
sf::Graphics::BackgroundClearColor(0);
if (MainMenuScreen::USE_HIRES_IMAGES) {
if (!mainBackgroundFrm) {
@@ -108,13 +110,13 @@ static long __fastcall main_menu_create_hook_add_win(long h, long y, long color,
if (MainMenuScreen::MAIN_MENU_SIZE != 2) {
if (mainBackgroundFrm || MainMenuScreen::MAIN_MENU_SIZE == 1) {
w = HRP::ScreenWidth();
h = HRP::ScreenHeight();
w = Setting::ScreenWidth();
h = Setting::ScreenHeight();
offset = Image::GetAspectSize(w, h, (float)sw, (float)sh);
if (w > HRP::ScreenWidth()) w = HRP::ScreenWidth();
if (h > HRP::ScreenHeight()) h = HRP::ScreenHeight();
if (w > Setting::ScreenWidth()) w = Setting::ScreenWidth();
if (h > Setting::ScreenHeight()) h = Setting::ScreenHeight();
mainmenuWidth = w;
}
@@ -132,13 +134,13 @@ static long __fastcall main_menu_create_hook_add_win(long h, long y, long color,
// nothing???
}
} else if (MainMenuScreen::MAIN_MENU_SIZE == 2) {
w = HRP::ScreenWidth();
h = HRP::ScreenHeight();
w = Setting::ScreenWidth();
h = Setting::ScreenHeight();
mainmenuWidth = w;
} else {
// centering
x += (HRP::ScreenWidth() / 2) - (w / 2);
y += (HRP::ScreenHeight() / 2) - (h / 2);
x += (Setting::ScreenWidth() / 2) - (w / 2);
y += (Setting::ScreenHeight() / 2) - (h / 2);
}
// set scaling factor
@@ -147,10 +149,10 @@ static long __fastcall main_menu_create_hook_add_win(long h, long y, long color,
scaleFactor = h / (float)sh;
//scaleFactor = std::round(scaleFactor * 100.0f) / 100.0f;
}
scaleXFactor = HRP::ScreenWidth() / (float)640; // TODO: find out how Mash's HRP gets the coefficient for button offsets for different game resolutions
scaleXFactor = Setting::ScreenWidth() / (float)640; // TODO: find out how Mash's HRP gets the coefficient for button offsets for different game resolutions
MainMenu::mTextOffset = MainMenu::mXOffset;
if (MainMenu::mYOffset) MainMenu::mTextOffset += (MainMenu::mYOffset * w);
sf::MainMenu::mTextOffset = sf::MainMenu::mXOffset;
if (sf::MainMenu::mYOffset) sf::MainMenu::mTextOffset += (sf::MainMenu::mYOffset * w);
if (x < 0) x = 0;
if (y < 0) y = 0;
@@ -192,7 +194,7 @@ static void __fastcall TextScale(long xOffset, const char* text, long yPos, long
xOffset = (long)(xOffset * scaleFactor);
yPos = (long)(yPos * scaleFactor);
yPos *= mainmenuWidth;
yPos += MainMenu::mTextOffset; // TODO: check
yPos += sf::MainMenu::mTextOffset; // TODO: check
Image::ScaleText(
(BYTE*)(fo::var::getInt(FO_VAR_main_window_buf) + yPos + xOffset),
@@ -208,7 +210,7 @@ static void __declspec(naked) main_menu_create_hook_text_to_buf() {
mov ecx, mainmenuWidth;
imul ebp, ecx; // yPos * width
add eax, ds:[FO_VAR_main_window_buf];
add eax, MainMenu::mTextOffset;
add eax, sf::MainMenu::mTextOffset;
add eax, ebp;
jmp dword ptr ds:[FO_VAR_text_to_buf];
scale:
@@ -292,24 +294,24 @@ void MainMenuScreen::init() {
if (MENU_BG_OFFSET_X < 0) MENU_BG_OFFSET_X = 0;
if (MENU_BG_OFFSET_Y < 0) MENU_BG_OFFSET_Y = 0;
// Main menu window size
//SafeWrite32(0x481674, HRP::ScreenHeight());
//SafeWrite32(0x48167A, HRP::ScreenWidth());
// Mainmenu window size
//sf::SafeWrite32(0x481674, HRP::ScreenHeight());
//sf::SafeWrite32(0x48167A, HRP::ScreenWidth());
HookCall(0x481680, main_menu_create_hook_add_win);
HookCall(0x481704, main_menu_create_hook_buf_to_buf);
HookCall(0x481767, main_menu_create_hook_win_print);
HookCall(0x481883, main_menu_create_hook_register_button);
MakeCall(0x481933, main_menu_create_hook_text_to_buf, 1);
sf::HookCall(0x481680, main_menu_create_hook_add_win);
sf::HookCall(0x481704, main_menu_create_hook_buf_to_buf);
sf::HookCall(0x481767, main_menu_create_hook_win_print);
sf::HookCall(0x481883, main_menu_create_hook_register_button);
sf::MakeCall(0x481933, main_menu_create_hook_text_to_buf, 1);
// imul ebp, edx, 640 -> mov ebp, edx
SafeWrite16(0x481912, 0xD589);
SafeWrite32(0x481914, 0x90909090);
sf::SafeWrite16(0x481912, 0xD589);
sf::SafeWrite32(0x481914, 0x90909090);
SafeWrite16(0x48192D, 0x9090);
sf::SafeWrite16(0x48192D, 0x9090);
LoadGameHook::OnBeforeGameStart() += FreeMainMenuImages;
LoadGameHook::OnBeforeGameClose() += FreeMainMenuImages;
sf::LoadGameHook::OnBeforeGameStart() += FreeMainMenuImages;
sf::LoadGameHook::OnBeforeGameClose() += FreeMainMenuImages;
}
}
+1 -1
View File
@@ -6,7 +6,7 @@
#pragma once
namespace sfall
namespace HRP
{
class MainMenuScreen {
+17 -15
View File
@@ -12,9 +12,11 @@
#include "SplashScreen.h"
namespace sfall
namespace HRP
{
namespace sf = sfall;
// 0 - image will display at its original size
// 1 - image will stretch to fit the screen while maintaining its aspect ratio
// 2 - image will stretch to fill the screen
@@ -22,8 +24,8 @@ long SplashScreen::SPLASH_SCRN_SIZE;
static void __cdecl game_splash_screen_hack_scr_blit(BYTE* srcPixels, long srcWidth, long srcHeight, long srcX, long srcY, long width, long height, long x, long y) {
RECT rect;
long w = Graphics::GetGameWidthRes();
long h = Graphics::GetGameHeightRes();
long w = sf::Graphics::GetGameWidthRes();
long h = sf::Graphics::GetGameHeightRes();
// TODO: Load an alternative 32-bit BMP image or DirectX texture
// stretch texture for DirectX
@@ -43,19 +45,19 @@ static void __cdecl game_splash_screen_hack_scr_blit(BYTE* srcPixels, long srcWi
rect.bottom = (y + h) - 1;
rect.left = x;
rect.right = (rect.left + w) - 1;
Graphics::UpdateDDSurface(resizeBuff, w, h, w, &rect);
sf::Graphics::UpdateDDSurface(resizeBuff, w, h, w, &rect);
delete[] resizeBuff;
return;
} else if (SplashScreen::SPLASH_SCRN_SIZE == 2) {
BYTE* resizeBuff = new BYTE[Graphics::GetGameWidthRes() * Graphics::GetGameHeightRes()];
Image::Scale(srcPixels, srcWidth, srcHeight, resizeBuff, Graphics::GetGameWidthRes(), Graphics::GetGameHeightRes());
BYTE* resizeBuff = new BYTE[sf::Graphics::GetGameWidthRes() * sf::Graphics::GetGameHeightRes()];
Image::Scale(srcPixels, srcWidth, srcHeight, resizeBuff, sf::Graphics::GetGameWidthRes(), sf::Graphics::GetGameHeightRes());
rect.top = 0;
rect.left = 0;
rect.right = Graphics::GetGameWidthRes() - 1;
rect.bottom = Graphics::GetGameHeightRes() - 1;
Graphics::UpdateDDSurface(resizeBuff, Graphics::GetGameWidthRes(), Graphics::GetGameHeightRes(), Graphics::GetGameWidthRes(), &rect);
rect.right =sf:: Graphics::GetGameWidthRes() - 1;
rect.bottom = sf::Graphics::GetGameHeightRes() - 1;
sf::Graphics::UpdateDDSurface(resizeBuff, sf::Graphics::GetGameWidthRes(), sf::Graphics::GetGameHeightRes(), sf::Graphics::GetGameWidthRes(), &rect);
delete[] resizeBuff;
return;
@@ -63,13 +65,13 @@ static void __cdecl game_splash_screen_hack_scr_blit(BYTE* srcPixels, long srcWi
// original size to center screen
rect.left = (Graphics::GetGameWidthRes() / 2) - (srcWidth / 2) + x;
rect.left = (sf::Graphics::GetGameWidthRes() / 2) - (srcWidth / 2) + x;
rect.right = (rect.left + srcWidth) - 1 ;
rect.top = (Graphics::GetGameHeightRes() / 2) - (srcHeight / 2) + y;
rect.top = (sf::Graphics::GetGameHeightRes() / 2) - (srcHeight / 2) + y;
rect.bottom = (rect.top + srcHeight) - 1;
Graphics::UpdateDDSurface(srcPixels, srcWidth, srcHeight, srcWidth, &rect);
sf::Graphics::UpdateDDSurface(srcPixels, srcWidth, srcHeight, srcWidth, &rect);
}
// Fixes colored screen border when the index 0 of the palette contains a color with a non-black (zero) value
@@ -88,7 +90,7 @@ static void __fastcall Clear(fo::PALETTE* palette) {
index = i;
}
}
if (index != 0) Graphics::BackgroundClearColor(index);
if (index != 0) sf::Graphics::BackgroundClearColor(index);
}
static void __declspec(naked) game_splash_screen_hook() {
@@ -100,8 +102,8 @@ static void __declspec(naked) game_splash_screen_hook() {
}
void SplashScreen::init() {
HookCall(0x4444FC, game_splash_screen_hook);
MakeCall(0x44451E, game_splash_screen_hack_scr_blit, 1);
sf::HookCall(0x4444FC, game_splash_screen_hook);
sf::MakeCall(0x44451E, game_splash_screen_hack_scr_blit, 1);
}
}
+1 -1
View File
@@ -6,7 +6,7 @@
#pragma once
namespace sfall
namespace HRP
{
class SplashScreen {
+5 -3
View File
@@ -12,9 +12,11 @@
#include "EdgeBorder.h"
namespace sfall
namespace HRP
{
namespace sf = sfall;
static EdgeBorder::Edge* MapEdgeData;
static EdgeBorder::Edge* currentMapEdge; // reference
@@ -212,7 +214,7 @@ static fo::DbFile* LoadMapEdgeFileSub(char* mapName) {
static void __fastcall LoadMapEdgeFile() {
//isLoadingMapEdge = 0;
fo::DbFile* file = LoadMapEdgeFileSub(LoadGameHook::mapLoadingName);
fo::DbFile* file = LoadMapEdgeFileSub(sf::LoadGameHook::mapLoadingName);
if (file) { // load error
fo::func::db_fclose(file);
SetDefaultEdgeData();
@@ -330,7 +332,7 @@ long EdgeBorder::CheckBorder(long tile) {
}
void EdgeBorder::init() {
LoadGameHook::OnBeforeMapLoad() += LoadMapEdgeFile;
sf::LoadGameHook::OnBeforeMapLoad() += LoadMapEdgeFile;
}
}
+4 -2
View File
@@ -6,12 +6,13 @@
#pragma once
namespace sfall
namespace HRP
{
class EdgeBorder {
public:
struct Edge {
class Edge {
public:
POINT center; // x/y center of current map screen?
RECT borderRect; // right is less than left
RECT rect_2;
@@ -30,6 +31,7 @@ public:
};
}
private:
~Edge() {
Release();
}
+7 -5
View File
@@ -12,9 +12,11 @@
#include "EdgeClipping.h"
namespace sfall
namespace HRP
{
namespace sf = sfall;
static RECT mapVisibleArea;
// Returns -1 if the scrRect is not in the rectangle of inRect (same as rect_inside_bound_)
@@ -217,12 +219,12 @@ static void __declspec(naked) obj_render_post_roof_hook_rect_inside_bound() {
}
void EdgeClipping::init() {
HookCall(0x4B15F6, refresh_game_hook_rect_inside_bound);
HookCall(0x483EF0, map_scroll_refresh_game_hook_rect_inside_bound);
MakeCall(0x44E481, gmouse_check_scrolling_hack); // from HRP 3.06 (TODO: redo the implementation so that the scrolling of the map works)
sf::HookCall(0x4B15F6, refresh_game_hook_rect_inside_bound);
sf::HookCall(0x483EF0, map_scroll_refresh_game_hook_rect_inside_bound);
sf::MakeCall(0x44E481, gmouse_check_scrolling_hack); // from HRP 3.06 (TODO: redo the implementation so that the scrolling of the map works)
// Prevents rendering of "post roof" objects (fixes the red pixels from the hex cursor remaining at the edges of the cropped part of the map)
HookCall(0x489802, obj_render_post_roof_hook_rect_inside_bound);
sf::HookCall(0x489802, obj_render_post_roof_hook_rect_inside_bound);
}
}
+1 -1
View File
@@ -6,7 +6,7 @@
#pragma once
namespace sfall
namespace HRP
{
class EdgeClipping {
+16 -14
View File
@@ -14,14 +14,16 @@
#include "ViewMap.h"
namespace sfall
namespace HRP
{
namespace sf = sfall;
const long grid_width = 200; // _grid_width
const long square_width = 100;
const long square_length = 100;
static Rectangle obj_on_screen_rect;
static sf::Rectangle obj_on_screen_rect;
long ViewMap::SCROLL_DIST_X;
long ViewMap::SCROLL_DIST_Y;
@@ -341,26 +343,26 @@ void ViewMap::init() {
if (SCROLL_DIST_Y <= 0) SCROLL_DIST_Y = 400;
else if (SCROLL_DIST_Y < 240) SCROLL_DIST_Y = 240;
MakeJump(fo::funcoffs::tile_set_center_, tile_set_center_hack_replacement); // 0x4B12F8
MakeJump(fo::funcoffs::tile_scroll_to_, tile_scroll_to_hack_replacement); // 0x4B3924
sf::MakeJump(fo::funcoffs::tile_set_center_, tile_set_center_hack_replacement); // 0x4B12F8
sf::MakeJump(fo::funcoffs::tile_scroll_to_, tile_scroll_to_hack_replacement); // 0x4B3924
HookCall(0x4B2AC0, square_render_floor_hook_art_id);
HookCall(0x4B2261, square_render_roof_hook_art_id);
HookCall(0x4B2BF7, square_roof_intersect_hook_art_id); // need to test object_under_mouse_
MakeCall(0x489730, obj_render_pre_roof_hack_0, 1);
MakeCall(0x4897E3, obj_render_pre_roof_hack_1);
sf::HookCall(0x4B2AC0, square_render_floor_hook_art_id);
sf::HookCall(0x4B2261, square_render_roof_hook_art_id);
sf::HookCall(0x4B2BF7, square_roof_intersect_hook_art_id); // need to test object_under_mouse_
sf::MakeCall(0x489730, obj_render_pre_roof_hack_0, 1);
sf::MakeCall(0x4897E3, obj_render_pre_roof_hack_1);
// Fix
MakeCall(0x489665, obj_render_pre_roof_hack); // find the bug
sf::MakeCall(0x489665, obj_render_pre_roof_hack); // find the bug
obj_on_screen_rect.width = HRP::ScreenWidth();
obj_on_screen_rect.height = HRP::ScreenHeight(); // maybe take into account the interface bar and be: height - 100?
SafeWrite32(0x45C886, (DWORD)&obj_on_screen_rect); // replace rectangle in op_obj_on_screen_
obj_on_screen_rect.width = Setting::ScreenWidth();
obj_on_screen_rect.height = Setting::ScreenHeight(); // maybe take into account the interface bar and be: height - 100?
sf::SafeWrite32(0x45C886, (DWORD)&obj_on_screen_rect); // replace rectangle in op_obj_on_screen_
EdgeBorder::init();
EdgeClipping::init();
LoadGameHook::OnAfterGameInit() += []() {
sf::LoadGameHook::OnAfterGameInit() += []() {
if (IGNORE_PLAYER_SCROLL_LIMITS) fo::var::setInt(FO_VAR_scroll_limiting_on) = 0;
if (IGNORE_MAP_EDGES) fo::var::setInt(FO_VAR_scroll_blocking_on) = 0;
};

Some files were not shown because too many files have changed in this diff Show More