ग्रैंड थेफ्ट ऑटो में वाइडस्क्रीन अनुमतियाँ जोड़ना

छवि
तीस-लाइन जावास्क्रिप्ट प्रोग्रामिंग के बारे में पोस्ट की एक श्रृंखला को देखते हुए, मैं भी कुछ लिखना चाहता था, हालांकि 30 लाइनों में नहीं, लेकिन केवल मनोरंजन के लिए, न्यूनतम समय बिताना। विंडोज के लिए क्लासिक ग्रैंड थेफ्ट ऑटो का इंस्टॉलर डाउनलोड किया गया था। यह GTA केवल 4: 3 के पहलू अनुपात के साथ मानक संकल्पों में काम करता है, मैंने एक प्लग-इन लिखने का फैसला किया है जो इसे मेरे मॉनिटर (1920x1080) के मूल रिज़ॉल्यूशन में लॉन्च करेगा।



इससे पहले कि आप सीधे प्लगइन लिखना शुरू करें, आपको किसी तरह इसे गेम में लोड करने की आवश्यकता है। इसके लिए, मैं सार्वभौमिक एएसआई लोडर का उपयोग करता हूं। GTA 1 - खेल काफी पुराना है, जिसका अर्थ है कि सबसे अच्छा विकल्प ddraw.dll का उपयोग करना होगा। आप यह सत्यापित कर सकते हैं कि ग्रैंड थेफ्ट Auto.exe वास्तव में हेक्स संपादक के माध्यम से इस पुस्तकालय का उपयोग करता है:


मैं संग्रह की सामग्री को ग्रैंड थेफ्ट ऑटो \ विनो फ़ोल्डर (निष्पादन योग्य फ़ाइल के साथ फ़ोल्डर) में कॉपी करता हूं, नाम वापस लेने के लिए dinput8.dll (एएसआई लोडर) को ddraw.dll में बदल देता हूं । यह जानते हुए कि गेम कम रिज़ॉल्यूशन में शुरू होगा, मैं एक ही फ़ोल्डर में एक खाली wndmode.ini फ़ाइल बनाता हूं । क्योंकि एएसआई लोडर में wndmode.dll शामिल है, जो पहले से ही हब पर उल्लिखित था, wndmode.ini फ़ाइल की उपस्थिति में, GTA को विंडो में प्रदर्शित किया जाना चाहिए।

पहली शुरुआत में, परीक्षण प्लग-इन रिपोर्ट करता है कि सब कुछ काम करता है, और आप अपना खुद का लिख ​​सकते हैं:
छवि

खेल मेनू इस रूप में खोला गया:


और यह पता चला कि कम से कम होने पर गेम क्रैश हो जाता है, और मुझे विंडो मोड से इनकार करना पड़ा, wndmode.ini को हटा दिया गया। स्क्रिप्ट फ़ोल्डर को भी अनावश्यक के रूप में हटा दिया गया है। मैं खेल को फिर से शुरू करता हूं, अब यह कम से कम / विस्तारित होने पर दुर्घटना नहीं करता है, और यह इस तरह दिखता है:


स्वाभाविक रूप से, 2013 में 1024x768 मुझे सूट नहीं करता है, इसलिए विज़ुअल स्टूडियो में मैं एक नया Win32 प्रोजेक्ट बनाता हूं , प्रकार एक DLL है, और उन गुणों में जो मैं उजागर करता हूं:


प्लगइन का आधार:
#include "stdafx.h" #include "CPatch.h" DWORD WINAPI Thread(LPVOID param) { return 0; } BOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID lpReserved) { if (reason == DLL_PROCESS_ATTACH) { HANDLE HndThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)&Thread, NULL, 0, NULL); } return TRUE; } 


अब आपको यह पता लगाने की आवश्यकता है कि कौन से मेमोरी पते वर्तमान स्क्रीन रिज़ॉल्यूशन मान को संग्रहीत करते हैं। उनकी मदद से, आप उन कार्यों को पा सकते हैं जिनमें यह मान दर्ज किया गया है और इस रिकॉर्ड को अपने स्वयं के साथ बदलें। मैं गेम लॉन्च करता हूं, F11 कुंजी दबाएं, यह आपको स्क्रीन रिज़ॉल्यूशन को बदलने की अनुमति देता है:


डिफ़ॉल्ट रूप से, 1024x768 सेट किया गया था, मैंने चीट इंजन को खोल दिया, इसमें मैं ग्रैंड थेफ्ट ऑटो। Ex प्रक्रिया का चयन करता हूं, खोज पैरामीटर में मैं निम्नलिखित सेटिंग्स सेट करता हूं:


पहले स्कैन बटन पर क्लिक करने के बाद, लगभग बीस हजार पते मिल गए थे, अतिरिक्त लोगों को फ़िल्टर करने के लिए, मैंने कई बार गेम में रिज़ॉल्यूशन को बदल दिया और नेक्स्ट स्कैन बटन के माध्यम से नए मूल्यों की खोज की। ऊँचाई के लिए एक ही काम किया गया था, अंत में मुझे लगभग दो दर्जन पते मिले:


बस इन पतों को बदलने से कोई परिणाम नहीं होता है, क्योंकि खेल के विस्तार के तुरंत बाद वे वर्तमान मूल्य के साथ ओवरराइट हो जाते हैं।
बिल्कुल भी नहीं कि यह काम करेगा, मैंने तय किया कि यह मूल अनुमति रिकॉर्डिंग कमांड को अपने स्वयं के साथ बदलने की कोशिश करने के लायक है। आईडीए में ग्रैंड थेफ्ट ऑटोExassembled होने के बाद , पहली चीज जिसे मैंने देखना शुरू किया था वह मानक कार्यों के लिए कॉल पैरामीटर था CreateWindowExA , SetWindowPos , ShowWindow , जब तक मैं इस पार नहीं आया:
छवि

CreateWindowExA फ़ंक्शन को कॉल करने से पहले , गेम 0x787310 और 0x787314 पते पर nWidth और nHeight मान को स्टैक पर रखता है । ये पते चीट इंजन तालिका में हैं, इसलिए मैंने उनसे प्रतिस्थापन शुरू करने का फैसला किया। ऐसा करने के लिए, IDA में, nWidth पर "X" पर क्लिक करें, देखें कि रिकॉर्डिंग कहाँ होती है (टाइप - w):
छवि

उसी जगह, nHeight में एक प्रविष्टि है:
छवि

मैं स्टूडियो लौटता हूं , पैच_रे () फ़ंक्शन बनाता हूं और 0x491E4C पते पर इस पर छलांग लगाता हूं:
 CPatch::RedirectJump(0x491E4C, patch_res); ~~~ void __declspec(naked)patch_res() { _asm { mov eax, 1920 MOV DWORD PTR DS : [0x787310], EAX MOV DWORD PTR DS : [0x787370], EAX MOV EAX, DWORD PTR DS : [EBX + 1B4h] INC EAX TEST ECX, ECX mov eax, 1080 MOV DWORD PTR DS : [0x787314], EAX MOV DWORD PTR DS : [0x787388], EAX mov jmpAddress, 0x491E69 jmp jmpAddress } } 


मूल asm कोड OllyDbg से कॉपी किया गया था धोखा इंजन या आईडीए स्टूडियो से कोड हमेशा सही ढंग से व्याख्या नहीं करता है, आपको इसे ठीक करना होगा। मैं संकलन करता हूं, खेल चलाता हूं और एक परिचित चित्र देखता हूं:


खेल में ही, एक ही बात:


तालिका से, चीट इंजन ने पतों के हिस्से को फिर से लिखा, अनावश्यक लोगों को हटा दिया:
  CPatch::RedirectJump(0x491E4C, patch_res); CPatch::RedirectJump(0x414FF7, patch_res_x1); CPatch::RedirectJump(0x43B7CF, patch_res_x2); CPatch::RedirectJump(0x46453B, patch_res_x3); CPatch::RedirectJump(0x46452C, patch_res_x4); CPatch::RedirectJump(0x486848, patch_res_x5); CPatch::RedirectJump(0x486852, patch_res_x6); CPatch::RedirectJump(0x48C137, patch_res_x7); CPatch::RedirectJump(0x48C276, patch_res_x8); CPatch::RedirectJump(0x48C159, patch_res_x9); CPatch::RedirectJump(0x49168B, patch_res_x10); CPatch::RedirectJump(0x415008, patch_res_y1); CPatch::RedirectJump(0x43B7D8, patch_res_y2); CPatch::RedirectJump(0x464532, patch_res_y3); CPatch::RedirectJump(0x48683A, patch_res_y4); CPatch::RedirectJump(0x48C13D, patch_res_y5); CPatch::RedirectJump(0x48C2B0, patch_res_y6); //CPatch::RedirectJump(0x, patch_res_y7); 


उपयुक्त कार्य बनाए गए:
 void __declspec(naked)patch_res_x1() { _asm { mov eax, res_x MOV DWORD PTR DS : [0x504CC0], EAX mov jmpAddress, 0x414FFC jmp jmpAddress } } void __declspec(naked)patch_res_x2() { _asm { mov edx, res_x MOV DWORD PTR DS : [0x5C0C00], EDX mov jmpAddress, 0x43B7D5 jmp jmpAddress } } ~~~~~~~ void __declspec(naked)patch_res_y6() { _asm { mov eax, res_y MOV DWORD PTR DS : [0x787AF0], EAX mov jmpAddress, 0x48C2B5 jmp jmpAddress } } void __declspec(naked)patch_res_y7() { _asm { mov edx, res_y MOV DWORD PTR DS : [0x4B48C0], EDX mov jmpAddress, 0x48AE8B jmp jmpAddress } } 


res_x और res_y 1920 और 1080 में सेट है, लेकिन परिणाम बहुत खुश नहीं है:


हालाँकि आधी लड़ाई हो चुकी है, खेल 1920x1080 में काम करता है। सबसे पहले, मैंने फैसला किया कि इस तथ्य के कारण रेंडरिंग गलत थी कि चीट इंजन टेबल में सभी मान 1920 और 1080 में नहीं बदले गए थे। लेकिन उन सभी को पकड़ना संभव नहीं था, इसलिए मैंने अपने कुछ कार्यों को पुनर्निर्देशित करने की कोशिश की। वैज्ञानिक प्रहार विधि का उपयोग करते हुए, यह पाया गया कि पैच_से_x4 , 5 और 6 इस व्यवहार का कारण बनता है, और उनके बिना सब कुछ ठीक काम करता है, मेनू को छोड़कर। मेनू के साथ -साथ x7-x10 को भी अक्षम करना।

नतीजतन, मैंने वह परिणाम हासिल किया जो मैं गिन रहा था:




बेशक, यह साइड इफेक्ट्स के बिना नहीं कर सकता था, 2 डी स्प्राइट्स थोड़ा फैला हुआ है, मेनू को सभी प्रस्तावों पर सही ढंग से प्रदर्शित नहीं किया गया है, लेकिन यह मेरी योजनाओं में शामिल नहीं था, इसलिए मैं इसे वैसे ही छोड़ देता हूं।

स्रोत कोड GitHub पर उपलब्ध है , जो वहां तैयार किया गया है । खेल के साथ इंस्टॉलर इंटरनेट पर पाया गया था, क्योंकि विंडोज 8 पर आधिकारिक एक शुरू नहीं होता है, और यह वर्तमान में डाउनलोड के लिए उपलब्ध नहीं है। निर्वासन का आकार 774 144 बाइट्स है, अन्य के साथ प्लगइन काम नहीं कर सकता है।

Source: https://habr.com/ru/post/In202692/


All Articles