iw4x-sp/src/client/component/ultra_wide.cpp
2023-12-08 17:16:22 +01:00

75 lines
1.9 KiB
C++

#include <std_include.hpp>
#include "loader/component_loader.hpp"
#include <utils/hook.hpp>
namespace ultra_wide {
const game::dvar_t* r_customAspectRatio;
const game::dvar_t* dvar_register_aspect_ratio(const char* dvar_name,
const char** /*value_list*/,
int default_index,
unsigned __int16 flags,
const char* description) {
static const char* values[] = {"auto", "standard", "wide 16:10",
"wide 16:9", "custom", nullptr};
// register enumeration dvar
return game::Dvar_RegisterEnum(dvar_name, values, default_index, flags,
description);
}
void set_aspect_ratio() {
*reinterpret_cast<float*>(0x1C91A78) = r_customAspectRatio->current.value;
}
__declspec(naked) void set_aspect_ratio_stub() {
__asm {
mov eax, [eax + 0x10];
cmp eax, 4;
mov dword ptr ds:0x1C91A68, edx;
mov dword ptr ds:0x1C91A6C, esi;
mov dword ptr ds:0x1C91A74, ecx;
ja default_case;
je custom_ratio;
push 0x50AE6C;
ret;
default_case:
push 0x50AF6C;
ret;
custom_ratio:
pushad;
call set_aspect_ratio;
popad;
mov eax, 1; // set widescreen to 1
push 0x50AF05;
ret;
}
}
class component final : public component_interface {
public:
void post_load() override {
utils::hook(0x51E80B, &dvar_register_aspect_ratio, HOOK_CALL)
.install()
->quick();
utils::hook(0x50AE4E, &set_aspect_ratio_stub, HOOK_JUMP).install()->quick();
utils::hook::nop(0x50AE4E + 5, 1);
r_customAspectRatio = game::Dvar_RegisterFloat(
"r_customAspectRatio", 16.0f / 9.0f, 4.0f / 3.0f, 63.0f / 9.0f,
game::DVAR_ARCHIVE, "Screen aspect ratio");
}
};
} // namespace ultra_wide
REGISTER_COMPONENT(ultra_wide::component)