| 18 | float fHudVerticalOffsetWide; |
| 19 | } Screen; |
| 20 | |
| 21 | void Init() |
| 22 | { |
| 23 | CIniReader iniReader(""); |
| 24 | static auto fFOVFactor = iniReader.ReadFloat("MAIN", "FOVFactor", 0.0f); |
| 25 | |
| 26 | //Unlocking a bit more resolutions |
| 27 | auto pattern = hook::pattern("81 FF ? ? ? ? 8B 54 24 14 7C 53 81 FA ? ? ? ? 7C 4B 8B 0D ? ? ? ? 85 C9"); |
| 28 | injector::WriteMemory(pattern.get_first(2), 640, true); |
| 29 | injector::WriteMemory(pattern.get_first(14), 480, true); |
| 30 | //Last resolution doesn't get reset |
| 31 | pattern = hook::pattern("3D ? ? ? ? 0F 96 C0 C3"); |
| 32 | injector::WriteMemory(pattern.get_first(1), 5000, true); |
| 33 | |
| 34 | //Resolution |
| 35 | pattern = hook::pattern("C7 05 ? ? ? ? ? ? ? ? C7 05 ? ? ? ? ? ? ? ? C7 05 ? ? ? ? ? ? ? ? C6 05 ? ? ? ? ? C7 05 ? ? ? ? ? ? ? ? 83 C4 28 C3"); |
| 36 | static auto nWidth = std::ref(**pattern.get_first<uint32_t*>(2)); |
| 37 | static auto nHeight = std::ref(**pattern.get_first<uint32_t*>(12)); |
| 38 | std::tie(Screen.nWidth, Screen.nHeight) = GetDesktopRes(); |
| 39 | injector::WriteMemory(pattern.get_first(6), Screen.nWidth, true); |
| 40 | injector::WriteMemory(pattern.get_first(16), Screen.nHeight, true); |
| 41 | |
| 42 | static auto GetRes = []() |
| 43 | { |
| 44 | Screen.nWidth = nWidth; |
| 45 | Screen.nHeight = nHeight; |
| 46 | Screen.fWidth = static_cast<float>(Screen.nWidth); |
| 47 | Screen.fHeight = static_cast<float>(Screen.nHeight); |
| 48 | Screen.fAspectRatio = Screen.fWidth / Screen.fHeight; |
| 49 | Screen.nWidth43 = static_cast<uint32_t>(Screen.fHeight * (4.0f / 3.0f)); |
| 50 | Screen.fWidth43 = static_cast<float>(Screen.nWidth43); |
| 51 | Screen.fHudOffset = ((480.0f * Screen.fAspectRatio) - 640.0f) / 2.0f; |
| 52 | Screen.fHudOffsetReal = (Screen.fWidth - Screen.fHeight * (4.0f / 3.0f)) / 2.0f; |
| 53 | Screen.fHudScale = (4.0f / 3.0f) / Screen.fAspectRatio; |
| 54 | Screen.fHudFullWidth = 640.0f * (Screen.fAspectRatio / (4.0f / 3.0f)); |
| 55 | Screen.fHudVerticalOffset = ((480.0f * (Screen.fAspectRatio / (4.0f / 3.0f))) - 480.0f) / 2.0f; |
| 56 | Screen.fHudVerticalOffsetWide = ((480.0f * (Screen.fAspectRatio / (16.0f / 9.0f))) - 480.0f) / 2.0f; |
| 57 | }; |
| 58 | |
| 59 | pattern = hook::pattern("C6 44 24 18 00 8B 4C 24 18 52"); |
| 60 | struct ResHook1 |
| 61 | { |
| 62 | void operator()(injector::reg_pack& regs) |
| 63 | { |
| 64 | *(uint8_t*)(regs.esp + 0x18) = 0; |
| 65 | GetRes(); |
| 66 | } |
| 67 | }; injector::MakeInline<ResHook1>(pattern.get_first(0)); //0x4052F1 |
| 68 | |
| 69 | pattern = hook::pattern("A3 ? ? ? ? A1 ? ? ? ? 89 15 ? ? ? ? A3 ? ? ? ? 89 0D ? ? ? ? E8 ? ? ? ? 84 C0"); |
| 70 | static auto dword_BCBC68 = *pattern.get_first<uint32_t*>(1); |
| 71 | struct ResHook2 |
| 72 | { |
| 73 | void operator()(injector::reg_pack& regs) |
| 74 | { |
| 75 | *dword_BCBC68 = regs.eax; |
| 76 | GetRes(); |
| 77 | } |
nothing calls this directly
no test coverage detected