From 5558483c964c49923475c0e8e37baaebb351c84b Mon Sep 17 00:00:00 2001 From: Emmanuel AYME Date: Sun, 14 Sep 2025 22:40:25 +0200 Subject: [PATCH] Add dev console and improved UI scaling --- HellIsUs/dllmain.cpp | 314 +++++++++++++++++++++++-------------------- 1 file changed, 170 insertions(+), 144 deletions(-) diff --git a/HellIsUs/dllmain.cpp b/HellIsUs/dllmain.cpp index 5a64051..db0f696 100644 --- a/HellIsUs/dllmain.cpp +++ b/HellIsUs/dllmain.cpp @@ -7,10 +7,17 @@ #include #include +// Screen informations +static int screenWidth = GetSystemMetrics(SM_CXSCREEN); +static int screenHeight = GetSystemMetrics(SM_CYSCREEN); +static float aspectRatio = (float)screenWidth / screenHeight; + // Core game dll functions declarations typedef void (*SetBoolFn)(bool, bool); typedef void (*SetIntFn)(int); typedef float (*GetFloatFn)(); +typedef bool (*GetBoolFn)(); +typedef void (*SetUEConsole)(); static HMODULE fixLib = nullptr; static SetBoolFn SetFixEnabled = nullptr; @@ -24,6 +31,8 @@ static SetIntFn SetFOV = nullptr; static GetFloatFn GetFOVIn = nullptr; static GetFloatFn GetCompensadedFOV = nullptr; static GetFloatFn GetFOVOut = nullptr; +static GetBoolFn GetConsoleEnabled = nullptr; +static SetUEConsole SetConsole = nullptr; // Plugin variables for checkboxes and sliders static bool fov_fix_enabled = false; @@ -47,44 +56,74 @@ const char* CA_FIX_SETTING = "CAFIX="; const char* VIGNETTING_FIX_SETTING = "VignettingFIX="; const char* FOG_FIX_SETTING = "FogFIX="; const char* WORLD_FOV_SETTING = "WorldFOV="; -const char* FIX_VERSION = "1.0.2"; -const char* FIX_INFORMATIONS = "This fix allows to:\n - Control FOV in game.\n - Disable pillar boxing in cutscences.\n - Disable depth of field.\n - Disable chromatic aberrations.\n - Disable vignetting.\n - Disable FOG.\n\nDisabling pillar boxing will compensate FOV\nfor main menu and cutscenes.\nDisabling Fog will not entirely remove it."; +const char* FIX_VERSION = "1.0.3"; +const char* FIX_INFORMATIONS = "This fix allows to:\n - Control FOV in game.\n - Disable pillar boxing in cutscences.\n - Disable depth of field.\n - Disable chromatic aberrations.\n - Disable vignetting.\n - Disable FOG.\n - Re enable console.\n\nDisabling pillar boxing will compensate FOV\nfor main menu and cutscenes.\nDisabling Fog will not entirely remove it."; const char* DONATION_URL = "https://buymeacoffee.com/k4sh44"; +// Scaling factor based on screen resolution +float scale = 1.f; + +bool IsAlreadyInitialized() +{ + // Declare a lock + HANDLE hMap = OpenFileMappingA(FILE_MAP_ALL_ACCESS, FALSE, "Local\\HellisUsFixSharedSection"); + + // If lock is not yet initialized + if (hMap == nullptr) + { + // We create the lock only once + hMap = CreateFileMappingA(INVALID_HANDLE_VALUE, nullptr, PAGE_READWRITE, 0, 1, "Local\\HellisUsFixSharedSection"); + + if (hMap == nullptr) // We ensure the lock is valid + return true; + + return false; // First time created we return false + } + + // Otherwise we return true + CloseHandle(hMap); + return true; +} // Load and unload game core dll functions /!\ necessary static void LoadFixDLL() { - if (fixLib) return; + if (IsAlreadyInitialized()) + return; // déjà lancé dans un autre chargement - fixLib = LoadLibraryA("HellIsUsCore.dll"); + if (GetModuleHandleA("HellIsUsCore.dll") == nullptr) { + fixLib = LoadLibraryA("HellIsUsCore.dll"); - if (!fixLib) { - MessageBoxA(nullptr, "Impossible to load game core dll", "Erreur", MB_OK); - return; + if (!fixLib) { + MessageBoxA(nullptr, "Impossible to load game core dll", "Erreur", MB_OK); + return; + } + + SetFixEnabled = (SetBoolFn)GetProcAddress(fixLib, "SetFixEnabled"); + SetFOVFixEnabled = (SetBoolFn)GetProcAddress(fixLib, "SetFOVFixEnabled"); + SetAspectRatioFixEnabled = (SetBoolFn)GetProcAddress(fixLib, "SetAspectRatioFixEnabled"); + SetDOFFixEnabled = (SetBoolFn)GetProcAddress(fixLib, "SetDOFFixEnabled"); + SetCAFixEnabled = (SetBoolFn)GetProcAddress(fixLib, "SetCAFixEnabled"); + SetVignettingFixEnabled = (SetBoolFn)GetProcAddress(fixLib, "SetVignettingFixEnabled"); + SetFogFixEnabled = (SetBoolFn)GetProcAddress(fixLib, "SetFogFixEnabled"); + SetFOV = (SetIntFn)GetProcAddress(fixLib, "SetFOV"); + GetFOVIn = (GetFloatFn)GetProcAddress(fixLib, "GetFOVIn"); + GetCompensadedFOV = (GetFloatFn)GetProcAddress(fixLib, "GetCompensatedFOV"); + GetFOVOut = (GetFloatFn)GetProcAddress(fixLib, "GetFOVOut");; + SetConsole = (SetUEConsole)GetProcAddress(fixLib, "SetConsole"); + GetConsoleEnabled = (GetBoolFn)GetProcAddress(fixLib, "GetConsoleEnabled"); + + // Apply initial values loaded from settings + if (SetFOV) SetFOV(worldFOVvalue); + if (SetFOVFixEnabled) SetFOVFixEnabled(fov_fix_enabled, true); + if (SetAspectRatioFixEnabled) SetAspectRatioFixEnabled(Aspect_fix_enabled, true); + if (SetDOFFixEnabled) SetDOFFixEnabled(DOF_fix_enabled, true); + if (SetCAFixEnabled) SetCAFixEnabled(CA_fix_enabled, true); + if (SetVignettingFixEnabled) SetVignettingFixEnabled(Vignetting_fix_enabled, true); + if (SetFogFixEnabled) SetFogFixEnabled(Fog_fix_enabled, true); + if (SetFixEnabled) SetFixEnabled(fix_enabled, true); + if (SetConsole) SetConsole(); } - - SetFixEnabled = (SetBoolFn)GetProcAddress(fixLib, "SetFixEnabled"); - SetFOVFixEnabled = (SetBoolFn)GetProcAddress(fixLib, "SetFOVFixEnabled"); - SetAspectRatioFixEnabled = (SetBoolFn)GetProcAddress(fixLib, "SetAspectRatioFixEnabled"); - SetDOFFixEnabled = (SetBoolFn)GetProcAddress(fixLib, "SetDOFFixEnabled"); - SetCAFixEnabled = (SetBoolFn)GetProcAddress(fixLib, "SetCAFixEnabled"); - SetVignettingFixEnabled = (SetBoolFn)GetProcAddress(fixLib, "SetVignettingFixEnabled"); - SetFogFixEnabled = (SetBoolFn)GetProcAddress(fixLib, "SetFogFixEnabled"); - SetFOV = (SetIntFn)GetProcAddress(fixLib, "SetFOV"); - GetFOVIn = (GetFloatFn)GetProcAddress(fixLib, "GetFOVIn"); - GetCompensadedFOV = (GetFloatFn)GetProcAddress(fixLib, "GetCompensatedFOV"); - GetFOVOut = (GetFloatFn)GetProcAddress(fixLib, "GetFOVOut");; - - // Apply initial values loaded from settings - if (SetFOV) SetFOV(worldFOVvalue); - if (SetFOVFixEnabled) SetFOVFixEnabled(fov_fix_enabled, true); - if (SetAspectRatioFixEnabled) SetAspectRatioFixEnabled(Aspect_fix_enabled, true); - if (SetDOFFixEnabled) SetDOFFixEnabled(DOF_fix_enabled, true); - if (SetCAFixEnabled) SetCAFixEnabled(CA_fix_enabled, true); - if (SetVignettingFixEnabled) SetVignettingFixEnabled(Vignetting_fix_enabled, true); - if (SetFogFixEnabled) SetFogFixEnabled(Fog_fix_enabled, true); - if (SetFixEnabled) SetFixEnabled(fix_enabled, true); } // Settings functions @@ -156,136 +195,123 @@ static void LoadSettings() } } -// Fix informations -static void displayFixInformations() { - ImGui::Begin("Informations", &popup_Informations); // - ImGui::SetCursorPos(ImVec2(10, 36)); - ImGui::Text("Version : %s", FIX_VERSION); - ImGui::SetCursorPos(ImVec2(10, 76)); - ImGui::Text(FIX_INFORMATIONS); - ImGui::End(); -} - // Initialize ImGui widgets for Reshade static void on_overlay_draw(reshade::api::effect_runtime* runtime) { - ImGui::SetNextWindowPos(ImVec2(100, 200), ImGuiCond_Once); - ImGui::SetNextWindowSize(ImVec2(350, 150), ImGuiCond_Once); + ImGuiStyle& style = ImGui::GetStyle(); + style.ItemSpacing = ImVec2(8 * scale, 8 * scale); // Spacing between widgets + style.FramePadding = ImVec2(3 * scale, 3 * scale); // Widgets padding + style.WindowPadding = ImVec2(10 * scale, 10 * scale); // Overlay padding + style.CellPadding = ImVec2(10 * scale, 10 * scale); // Table cells padding - // Donation ? - ImGui::SetCursorPos(ImVec2(10, 36)); - ImGui::Text("Like my work ?"); - ImGui::SetCursorPos(ImVec2(130, 33)); - if (ImGui::Button("consider donation")) - { - ShellExecuteA(NULL, "open", DONATION_URL, NULL, NULL, SW_SHOWNORMAL); - } + ImGui::SetNextWindowSize(ImVec2(350 * scale, 150 * scale), ImGuiCond_Once); - // Fix informations - ImGui::SetCursorPos(ImVec2(270, 33)); - if (ImGui::Button("Fix informations")) - popup_Informations = true; + if (ImGui::Button("Like my work ? Consider donation")) ShellExecuteA(NULL, "open", DONATION_URL, NULL, NULL, SW_SHOWNORMAL); // Donation + ImGui::SameLine(); + if (ImGui::Button("Fix informations")) popup_Informations = true; // Fix information if (popup_Informations) - displayFixInformations(); - - // Generic fix - ImGui::SetCursorPos(ImVec2(10, 60)); - ImGui::BeginChild("AllFixesHeader", ImVec2(220, 0), false); // true = border - if (ImGui::CollapsingHeader("Enable fixes", ImGuiTreeNodeFlags_DefaultOpen)) { - ImGui::SetCursorPos(ImVec2(5, 30)); - if (ImGui::Checkbox("Fix enabled", &fix_enabled)) { - if (SetFixEnabled) SetFixEnabled(fix_enabled, false); - SaveSettings(); - } + { + ImGui::Begin("Informations", &popup_Informations); + ImGui::Text("Version : %s", FIX_VERSION); + ImGui::Text(FIX_INFORMATIONS); + ImGui::End(); } - ImGui::EndChild(); - // FOV adjustment - ImGui::SetCursorPos(ImVec2(10, 120)); - ImGui::BeginChild("FOVHeader", ImVec2(220, 0), false); - if (ImGui::CollapsingHeader("In game additional FOV", ImGuiTreeNodeFlags_DefaultOpen)) { - ImGui::SetCursorPos(ImVec2(5, 30)); - ImGui::SetNextItemWidth(150.0f); - if (ImGui::SliderInt("", &worldFOVvalue, -20, 50)) {} - if (ImGui::IsItemDeactivatedAfterEdit()) { - if (SetFOV) SetFOV(worldFOVvalue); - SaveSettings(); + if (ImGui::BeginTable("FixesTable", 2, ImGuiTableFlags_SizingStretchSame)) { + ImGui::TableSetupColumn("LeftFix", ImGuiTableColumnFlags_WidthStretch, 0.4f); + ImGui::TableSetupColumn("RightFix", ImGuiTableColumnFlags_WidthStretch, 0.6f); + ImGui::TableNextRow(); + + // Drawing a left column with slider and general fix + ImGui::TableSetColumnIndex(0); + if (ImGui::CollapsingHeader("Enable fixes", ImGuiTreeNodeFlags_DefaultOpen)) + if (ImGui::Checkbox("Fix enabled", &fix_enabled)) { + if (SetFixEnabled) SetFixEnabled(fix_enabled, false); + SaveSettings(); + } + + // Sliders + if (ImGui::CollapsingHeader("In game additional FOV", ImGuiTreeNodeFlags_DefaultOpen)) + { + ImGui::SetNextItemWidth(150 * scale); + if (ImGui::SliderInt("##FOVValue", &worldFOVvalue, -20, 50)) { + if (SetFOV) SetFOV(worldFOVvalue); + SaveSettings(); + } } + + // Individual fixes + ImGui::TableSetColumnIndex(1); + if (ImGui::CollapsingHeader("Individual fixes", ImGuiTreeNodeFlags_DefaultOpen)) { + if (ImGui::BeginTable("IndividualFixesTable", 2, ImGuiTableFlags_SizingStretchSame)) { + ImGui::TableSetupColumn("IndFix1", ImGuiTableColumnFlags_WidthStretch, 0.35f); + ImGui::TableSetupColumn("IndFix2", ImGuiTableColumnFlags_WidthStretch, 0.65f); + ImGui::TableNextRow(); + + ImGui::TableSetColumnIndex(0); + if (ImGui::Checkbox("FOV", &fov_fix_enabled)) { + if (SetFOVFixEnabled) SetFOVFixEnabled(fov_fix_enabled, false); + SaveSettings(); + } + if (ImGui::IsItemHovered()) { + ImGui::BeginTooltip(); + ImGui::Text("This won't affect PDA for readability"); + ImGui::EndTooltip(); + } + + if (ImGui::Checkbox("Vignetting", &Vignetting_fix_enabled)) { + if (SetVignettingFixEnabled) SetVignettingFixEnabled(Vignetting_fix_enabled, false); + SaveSettings(); + } + + if (ImGui::Checkbox("Fog", &Fog_fix_enabled)) { + if (SetFogFixEnabled) SetFogFixEnabled(Fog_fix_enabled, false); + SaveSettings(); + } + if (ImGui::IsItemHovered()) { + ImGui::BeginTooltip(); + ImGui::Text("Enabling this fix is a one way."); + ImGui::Text("Reverting it in real time would end in game crash."); + ImGui::Text("So disabling this fix is only possible by doing it here and restart the game."); + ImGui::EndTooltip(); + } + + ImGui::TableSetColumnIndex(1); + if (ImGui::Checkbox("Aspect ratio", &Aspect_fix_enabled)) { + if (SetAspectRatioFixEnabled) SetAspectRatioFixEnabled(Aspect_fix_enabled, false); + SaveSettings(); + } + if (ImGui::IsItemHovered()) { + ImGui::BeginTooltip(); + ImGui::Text("Aspect ratio fix is only usefull for ultrawide displays."); + ImGui::Text("No need to enable it if you play at 16/9."); + ImGui::EndTooltip(); + } + + if (ImGui::Checkbox("Depth of field", &DOF_fix_enabled)) { + if (SetDOFFixEnabled) SetDOFFixEnabled(DOF_fix_enabled, false); + SaveSettings(); + } + + if (ImGui::Checkbox("Chromatic aberrations", &CA_fix_enabled)) { + if (SetCAFixEnabled) SetCAFixEnabled(CA_fix_enabled, false); + SaveSettings(); + } + ImGui::EndTable(); + } + } + ImGui::EndTable(); } - ImGui::EndChild(); - - // Individual fixes - ImGui::SetCursorPos(ImVec2(240, 60)); - ImGui::BeginChild("IndividualFixesHeader", ImVec2(250, 0), false); - if (ImGui::CollapsingHeader("Individual fixes", ImGuiTreeNodeFlags_DefaultOpen)) { - ImGui::SetCursorPos(ImVec2(5, 30)); - if (ImGui::Checkbox("FOV fix", &fov_fix_enabled)) { - if (SetFOVFixEnabled) SetFOVFixEnabled(fov_fix_enabled, false); - SaveSettings(); - } - - if (ImGui::IsItemHovered()) { - ImGui::BeginTooltip(); - ImGui::Text("This won't affect PDA for readability"); - ImGui::EndTooltip(); - } - - ImGui::SetCursorPos(ImVec2(90, 30)); - if (ImGui::Checkbox("Aspect ratio fix", &Aspect_fix_enabled)) { - if (SetAspectRatioFixEnabled) SetAspectRatioFixEnabled(Aspect_fix_enabled, false); - SaveSettings(); - } - - if (ImGui::IsItemHovered()) { - ImGui::BeginTooltip(); - ImGui::Text("Aspect ratio fix is only usefull for ultrawide displays."); - ImGui::Text("No need to enable it if you play at 16/9."); - ImGui::EndTooltip(); - } - - ImGui::SetCursorPos(ImVec2(5, 55)); - if (ImGui::Checkbox("Depth of field fix", &DOF_fix_enabled)) { - if (SetDOFFixEnabled) SetDOFFixEnabled(DOF_fix_enabled, false); - SaveSettings(); - } - - ImGui::SetCursorPos(ImVec2(5, 80)); - if (ImGui::Checkbox("Chromatic aberrations fix", &CA_fix_enabled)) { - if (SetCAFixEnabled) SetCAFixEnabled(CA_fix_enabled, false); - SaveSettings(); - } - - ImGui::SetCursorPos(ImVec2(5, 105)); - if (ImGui::Checkbox("Vignetting fix", &Vignetting_fix_enabled)) { - if (SetVignettingFixEnabled) SetVignettingFixEnabled(Vignetting_fix_enabled, false); - SaveSettings(); - } - - ImGui::SetCursorPos(ImVec2(140, 105)); - if (ImGui::Checkbox("Fog fix", &Fog_fix_enabled)) { - if (SetFogFixEnabled) SetFogFixEnabled(Fog_fix_enabled, false); - SaveSettings(); - } - - if (ImGui::IsItemHovered()) { - ImGui::BeginTooltip(); - ImGui::Text("Enabling this fix is a one way."); - ImGui::Text("Reverting it in real time would end in game crash."); - ImGui::Text("So disabling this fix is only possible by doing it here and restart the game."); - ImGui::EndTooltip(); - } - } - ImGui::EndChild(); // Fix status - ImGui::SetCursorPos(ImVec2(10, 220)); - ImGui::BeginChild("INFOSHeader", ImVec2(480, 80), true); if (ImGui::CollapsingHeader("Fix informations", ImGuiTreeNodeFlags_DefaultOpen)) { - ImGui::SetCursorPos(ImVec2(5, 30)); - ImGui::Text("FOV In: %.2f, Compensated : %.2f, Out : %.2f", GetFOVIn(), GetCompensadedFOV(), GetFOVOut()); + ImGui::Text("Screen width: %d, height: %d, aspect ratio: %.2f", screenWidth, screenHeight, aspectRatio); + if (GetConsoleEnabled && GetConsoleEnabled()) + ImGui::Text("Console enabled and bound to key F2"); + if (GetFOVIn && GetCompensadedFOV && GetFOVOut) + ImGui::TextColored(ImColor(48, 179, 25), "FOV In: %.2f, Compensated: %.2f, Out: %.2f", GetFOVIn(), GetCompensadedFOV(), GetFOVOut()); } - ImGui::EndChild(); } // Main dll intrance