You are not logged in.
Offline
Чем ps-функция отличается от rs? (619AF0 RsGrabScreen, 7452B0 psGrabScreen)
Большинство Rs функций являются переходниками на ps функции.
Как я понимаю, Rs - платформонезависимый код, ps - платформозависимый код.
выкладывай
Скелетное (каркасное) приложение из состава RWG SDK 3.7 Скачать
Код в исходниках и в exe-шнике может различаться:
- из-за различий в версиях (3.7 / 3.6)
- из-за изменений, внесенных Рокстаровцами.:rolleyes:
Эх, жаль нет полных исходников RWSDK, тогда восстановить код от Рокстара было бы намного легче...:/
[large][acronym=Завтра, завтра, постоянно завтра, так проходит жизнь]Cras, cras, semper cras, sic evadit aetas[/acronym][/large]
Offline
2AleX AciD:
PS: в базе RwEngineInstance и RwGlobals представлены как две разных структуры, на самом деле RwEngineInstance это указатель на структуру типа RwGlobals
Есть такое дело. Надо будет поправить при очередной чистке.
Если же стремиться к абсолютной точности: RwEngineInstance указывает на структуру, первым (и, обычно, единственным) элементом которой является структура типа RwGlobals.
Вообще, покопать skeleton - было здравой идеей. Я, в свое время, просто взял оттуда минимум и забил (вернее, отложил до лучших времен). В exe-шнике еще много нерасписанного библиотечного кода (libjpeg, libpng, STL и т.д.). Кое-что полезное, можно нарыть из примеров (например, чтобы понять смысл одной из констант, пришлось изрядно покопаться в примерах).
Что касается исходников RWSDK - да, это была бы полезная вещь, но и без них обойтись достаточно легко. Все структуры, макросы и функции есть в хэдерах, а по использованию, к SDK прилагается нехилая трехтомная книжица аж на 800 с лишним страниц.
Почти все перечисленное добавил в базу (кроме dialogInit - у меня к нему есть некоторые претензии). Параллельно расписал еще десяток функций (RwMalloc/RwFree/....).
[You must login to view hidden text.]
Offline
Обновленную базу и Renderware SDK можно скачать с http://public.sannybuilder.com (thx to listener).
Offline
Что касается исходников RWSDK - да, это была бы полезная вещь, но и без них обойтись достаточно легко. Все структуры, макросы и функции есть в хэдерах, а по использованию, к SDK прилагается нехилая трехтомная книжица аж на 800 с лишним страниц.
Ну, не совсем все. Я недавно (вернее, не очень давно) занимался восстановлением исходников RW. Иногда там встречаются нигде не описанные функции/структуры, например:
struct RwChunkHeader { RwUInt32 type; /* chunk ID - see RwStreamFindChunk */ RwUInt32 length; /* length of the chunk data in bytes */ RwUInt32 libraryID; /* library ID stamp */ };
Хотя, покопавшись в использующих/используемых функциях, разобраться с ними несложно.
[large][acronym=Завтра, завтра, постоянно завтра, так проходит жизнь]Cras, cras, semper cras, sic evadit aetas[/acronym][/large]
Offline
2AleX AciD:
имеется в виду вот это?
struct RwChunkHeaderInfo { RwUInt32 type; /**< chunk ID - see \ref RwStreamFindChunk */ RwUInt32 length; /**< length of the chunk data in bytes */ RwUInt32 version; /**< version of the chunk data. * See \ref RwEngineGetVersion. */ RwUInt32 buildNum; /**< build number of the RenderWare libraries * previously used to stream out the data */ RwBool isComplex; /**< Internal Use */ };
Описано. Кратенько, но описано.
Страница I-171 и далее
Last edited by listener (13-08-2007 23:20)
Offline
2listener:
В том то и дело, что не это.
RwChunkHeaderInfo - используется приложением при работе с движком.
RwChunkHeader - испольуется самим движком при чтении/записи файлов RW.
[large][acronym=Завтра, завтра, постоянно завтра, так проходит жизнь]Cras, cras, semper cras, sic evadit aetas[/acronym][/large]
Offline
Выложил на паблик новую базу.
В ней расписаны конструкторы и деструкторы для всех объектов CTask. ( >300 объектов, ~1500 функций, около 10% от общего количества).
Поведение объекта (актера, машины и т.д.), делится на две части: перая - "программная" - задается скриптом и легко модифицируется. Вторая - "аппаратная" - справляется сабклассами CTask и, на текущий момент, модификациям практически не поддается.
Что все это дает в ближней перспективе:
во-первых, обозначена куча методов, на которые можно не обращать внимание. :-)
во-вторых, многие фрагменты становятся гораздо проще, например:
Адрес 46C149, opcode_07A7, put_jetpack_on_actor %1d% в свете расписанного, выглядит так:
getNumberParams(1); assignTaskToPed (opcodeParams[0], new CTask_8705C4 (0, 10.0, 0, 0), opcode); return 0;
В оригинале, эта конструкция занимает 89 байт.
Что это дает в дальней перспективе: возможность задавать и модифицировать базовое поведение (добавляя собственные сабклассы CTask). (Когда/если это будет делаться, оставляю заказ на ОМОН на джетпаках).
Что дальше: дальше нужно нарисовать нормальное дерево классов (сейчас есть только список, какой объект от какого наследуется), дать им нормальные имена (шестизначные числа не очень подходят для этой цели), расписать оставшиеся методы и так далее и в том же духе.
Offline
Попутно, дорисовалась иерархия основных объектов игры (как обычно, цифра после подчеркивания - адрес VMT)
_863C40: _8630E8: (CGtaCamera или CGtaViewport?) _863928: CBuilding_8585C8 (size=0x38) CBuilding_8639B0 (size=0x38) CDummy_8638C0 CDummy_866E78 (size=0x38) CDummy_86C198 (unused) _863BA0: (size=0x138) CObject_866F60: (size=0x17C) CObject_866EE0: (size=0x18C) CObject_867030: (size=0x17C) CObject_868A60: (size=0x19C) CPed_86C358 CPed_86C0A8 (size=0x79C) normal pedestrian CPed_86C120 (size=0x7C4) => CPedCop CPed_86C200 (size=0x79C) => CPedService (medic or fireman) CPed_86D168 (size=0x7A4) => CPedPlayer? CVehicle_871E80 CVehicle_871120 (size=0x988) CVehicle_871680 (size=0xA18) => CVehicleHeli CVehicle_8717D8 (size=0x99C) => CVehicleCar? CVehicle_871948 (size=0xA04) CVehicle_871AE8 (size=0x9BC) => CVehicleMtruck? CVehicle_871C28 (size=0x9F4) => CVehicleTrailer? CVehicle_871360 (size=0x814) CVehicle_871528 (size=0x838) CVehicle_8721A0 (size=0x7E8) CVehicle_872370 (size=0x6AC) => CVehicleTrain?
Как и обещалось, никаких всеобъемлющих объектов CPed и CVehicle не обнаружено, несмотря на все попытки описать их структуру на gtaforums/gtamodding
Там, где стоят знаки вопроса, требуются уточнения (например, объект CVehicleHeli я очень долго обзывал как CVehicleQuad, пока не обнаружил, что он вызывается с ID maverick).
Принимаются пожелания по обзыванию непоименованных объектов _863BA0, скорее всего, станет CEntity, что придумать для остальных, я пока не решил.
PS. Как обычно, я не возражаю и даже приветствую закидывание данной структуры на gtaforums и т.д. (Самого меня, скорее всего, заломает)
Offline
CVehicle_871E80 => CDummyVehicle CVehicle_871120 (size=0x988) => CVehicle CVehicle_871680 (size=0xA18) => CHeli CVehicle_8717D8 (size=0x99C) => CTruck CVehicle_871948 (size=0xA04) => CPlane CVehicle_871AE8 (size=0x9BC) => CQuad CVehicle_871C28 (size=0x9F4) => CTrailer CVehicle_871360 (size=0x814) => CMotorBike CVehicle_871528 (size=0x838) => CBike CVehicle_8721A0 (size=0x7E8) => CBoat CVehicle_872370 (size=0x6AC) => CTrain
_863BA0 можно было бы назвать CScriptableObject, CScriptableUnit или что-то в этом духе.
Offline
Кстати, CScriptableUnit+484h - это ссылка (Reference). Если равно 2 - юнит уникальный (создан скриптами) и трогать его нельзя. Если равен 1, то это обычный generic - выгружаем сразу, когда не нужен. Если посмотреть опкоды remove_references, можно найти и процедуры, которые это меняют, например
.text:006D5D70 ; 1 - removeref .text:006D5D70 ; 2 - addref .text:006D5D70 ; int __stdcall SetCarRef(int Type) .text:005E47E0 ; 1 - remove .text:005E47E0 ; 2 - add .text:005E47E0 ; int __stdcall SetActorRef(char Ref)
При создании юнитов в конструктор обычно передается значение ссылки, 1 или 2.
.text:006F2940 ; int __cdecl CBoat__constructor(int ModelID,char NewRef)
В опкодах обычно передается 2, во всяких траффик-генераторах, типа (006CD2F0 CreateAirTraffic), передается 1
.text:006CD3BE push 1 .text:006CD3C0 push ecx .text:006CD3C1 mov ecx, eax .text:006CD3C3 call _CHeli__constructor
Offline
Сравнение rwplcore.h и частично расписанной процедуры 0080A240 дает почти 2 десятка процедур для работы со строками (структура RwStringFunctions):
.text:0080A240 _RwStringFuncsInit proc near ; CODE XREF: sub_7F3170+70p .text:0080A240 mov eax, ds:_RwEngineInstance .text:0080A245 mov dword ptr [eax+0F0h], offset _sprintf ; Write formatted data to a string. .text:0080A24F mov ecx, ds:_RwEngineInstance .text:0080A255 mov dword ptr [ecx+0F4h], offset _vsprintf ; Write formatted output using a pointer to a list of arguments. .text:0080A25F mov edx, ds:_RwEngineInstance .text:0080A265 mov dword ptr [edx+0F8h], offset _strcpy ; Copy a string. .text:0080A26F mov eax, ds:_RwEngineInstance .text:0080A274 mov dword ptr [eax+0FCh], offset _strncpy ; Copy characters of one string to another. .text:0080A27E mov ecx, ds:_RwEngineInstance .text:0080A284 mov dword ptr [ecx+100h], offset _strcat ; Append a string. .text:0080A28E mov edx, ds:_RwEngineInstance .text:0080A294 mov dword ptr [edx+104h], offset _strncat ; Append characters of a string. .text:0080A29E mov eax, ds:_RwEngineInstance .text:0080A2A3 mov dword ptr [eax+108h], offset _strrchr ; Scan a string for the last occurrence of a character. .text:0080A2AD mov ecx, ds:_RwEngineInstance .text:0080A2B3 mov dword ptr [ecx+10Ch], offset _strchr ; Find a character in a string. .text:0080A2BD mov edx, ds:_RwEngineInstance .text:0080A2C3 mov dword ptr [edx+110h], offset _strstr ; Returns a pointer to the first occurrence of a search string in a string. .text:0080A2CD mov eax, ds:_RwEngineInstance .text:0080A2D2 mov dword ptr [eax+114h], offset _strcmp ; Compare strings. .text:0080A2DC mov ecx, ds:_RwEngineInstance .text:0080A2E2 mov dword ptr [ecx+118h], offset _strncmp ; Compare characters of two strings without regard to case. .text:0080A2EC mov edx, ds:_RwEngineInstance .text:0080A2F2 mov dword ptr [edx+11Ch], offset _stricmp ; Perform a lowercase comparison of strings. .text:0080A2FC mov eax, ds:_RwEngineInstance .text:0080A301 mov dword ptr [eax+120h], offset _strlen ; Get the length of a string .text:0080A30B mov ecx, ds:_RwEngineInstance .text:0080A311 mov dword ptr [ecx+124h], offset _strupr ; Convert a string to uppercase. .text:0080A31B mov edx, ds:_RwEngineInstance .text:0080A321 mov dword ptr [edx+128h], offset _strlwr ; Convert a string to lowercase .text:0080A32B mov eax, ds:_RwEngineInstance .text:0080A330 mov dword ptr [eax+12Ch], offset _strtok ; Find the next token in a string .text:0080A33A mov ecx, ds:_RwEngineInstance .text:0080A340 mov eax, 1 .text:0080A345 mov dword ptr [ecx+130h], offset _sscanf ; Read formatted data from a string .text:0080A34F retn .text:0080A34F _RwStringFuncsInit endp
(по оффсетам - адреса стандартных функций).
Также в дополнение к File IO (большая часть уже известна, за исключением пары функций):
.text:00804140 _RwFileIOFuncsInit proc near ; CODE XREF: sub_7F3170+96p .text:00804140 mov eax, ds:_RwEngineInstance .text:00804145 mov dword ptr [eax+0C4h], offset _fexist .text:0080414F mov ecx, ds:_RwEngineInstance .text:00804155 mov dword ptr [ecx+0C8h], offset _fopen .text:0080415F mov edx, ds:_RwEngineInstance .text:00804165 mov dword ptr [edx+0CCh], offset _fclose .text:0080416F mov eax, ds:_RwEngineInstance .text:00804174 mov dword ptr [eax+0D0h], offset _fread .text:0080417E mov ecx, ds:_RwEngineInstance .text:00804184 mov dword ptr [ecx+0D4h], offset _fwrite .text:0080418E mov edx, ds:_RwEngineInstance .text:00804194 mov dword ptr [edx+0D8h], offset _fgets ; Get a string from a stream .text:0080419E mov eax, ds:_RwEngineInstance .text:008041A3 mov dword ptr [eax+0DCh], offset _fputs ; Write a string to a stream .text:008041AD mov ecx, ds:_RwEngineInstance .text:008041B3 mov dword ptr [ecx+0E0h], offset _feof .text:008041BD mov edx, ds:_RwEngineInstance .text:008041C3 mov dword ptr [edx+0E4h], offset _fseek .text:008041CD mov eax, ds:_RwEngineInstance .text:008041D2 mov dword ptr [eax+0E8h], offset _fflush ; Flushes a stream. .text:008041DC mov ecx, ds:_RwEngineInstance .text:008041E2 mov eax, 1 .text:008041E7 mov dword ptr [ecx+0ECh], offset _ftell ; Gets the current position of a file pointer. .text:008041F1 retn .text:008041F1 _RwFileIOFuncsInit endp
Еще непонятна функция
.text:00836FBA _uppercase
вроде как конвертирует строку в верний регистр (используется только в процедуры создания stats.html).
Offline
Сравнение rwplcore.h и частично расписанной процедуры 0080A240 дает почти 2 десятка процедур для работы со строками (структура RwStringFunctions):
А разве у меня этого не было?
Еще непонятна функция
.text:00836FBA _uppercaseвроде как конвертирует строку в верний регистр (используется только в процедуры создания stats.html).
Она называется char * _strupr (char *);
Положил на паблик msvc2003crt.rar - исходники стандартных библиотек. Эта функция там в файле strupr.c. Можно посмотреть и ужаснуться.
Offline
Еще на паблик выложена база от 8 сентября. Там, в основном косметические изменения, но их много (см. подпись).
Начерно накидана структура объектов моделей (которые используются в loadModel).
Специально для людей, которые предпочитают черный текст на белом фоне, выложен recolor.idc - макрос, который заменяет фон всех функции некого цвета на какой-нибудь другой цвет (в конкретном случае - черный на синий. Диалог выбора я делать не стал, проще поменять в самом макросе (он всего 20 строчек, места, которые меняются, откомментированы).
Макросами в IDA пользоваться очень просто: в меню выбирается File->IDC File и файл с макросом. Если в нем нет ошибок, он автоматически запускается на исполнение.
Кстати, я несколько раз выкладывал fwalk.idc - макрос, который выводит в файл список функций с указанием размера и комментарием (внутри есть еще закомментированный кусок, который также выводит все перекрестные ссылки на функцию).
И вообще, нужен ли какой-либо ликбез по IDA scripting (или вообще по обработке текста? (а то, почитаешь, как народ не может написать три строчки на перле, чтобы автоматически параметры опкодов в исходнике поменять - и хочется плакать)
Offline
А разве у меня этого не было?
У тебя была расписана структура RwStringRunctions, но сами функции не были названы:
.text:0080A240 __rwStringOpen proc near ; CODE XREF: _RwEngineInit+70p .text:0080A240 000 mov eax, _RwEngineInstance .text:0080A245 000 mov dword ptr [eax+0F0h], offset _sprintf .text:0080A24F 000 mov ecx, _RwEngineInstance .text:0080A255 000 mov dword ptr [ecx+0F4h], offset sub_8230B8 .text:0080A25F 000 mov edx, _RwEngineInstance .text:0080A265 000 mov dword ptr [edx+0F8h], offset sub_826590 .text:0080A26F 000 mov eax, _RwEngineInstance .text:0080A274 000 mov dword ptr [eax+0FCh], offset _strncpy .text:0080A27E 000 mov ecx, _RwEngineInstance .text:0080A284 000 mov dword ptr [ecx+100h], offset sub_8265A0 .text:0080A28E 000 mov edx, _RwEngineInstance .text:0080A294 000 mov dword ptr [edx+104h], offset loc_826450 .text:0080A29E 000 mov eax, _RwEngineInstance .text:0080A2A3 000 mov dword ptr [eax+108h], offset loc_80A420 .text:0080A2AD 000 mov ecx, _RwEngineInstance .text:0080A2B3 000 mov dword ptr [ecx+10Ch], offset loc_80A400 .text:0080A2BD 000 mov edx, _RwEngineInstance .text:0080A2C3 000 mov dword ptr [edx+110h], offset sub_822650 .text:0080A2CD 000 mov eax, _RwEngineInstance .text:0080A2D2 000 mov dword ptr [eax+114h], offset sub_8263C0 .text:0080A2DC 000 mov ecx, _RwEngineInstance .text:0080A2E2 000 mov dword ptr [ecx+118h], offset _strncmp .text:0080A2EC 000 mov edx, _RwEngineInstance .text:0080A2F2 000 mov dword ptr [edx+11Ch], offset sub_80A350 .text:0080A2FC 000 mov eax, _RwEngineInstance .text:0080A301 000 mov dword ptr [eax+120h], offset sub_826330 .text:0080A30B 000 mov ecx, _RwEngineInstance .text:0080A311 000 mov dword ptr [ecx+124h], offset loc_80A3A0 .text:0080A31B 000 mov edx, _RwEngineInstance .text:0080A321 000 mov dword ptr [edx+128h], offset loc_80A3D0 .text:0080A32B 000 mov eax, _RwEngineInstance .text:0080A330 000 mov dword ptr [eax+12Ch], offset _strtok .text:0080A33A 000 mov ecx, _RwEngineInstance .text:0080A340 000 mov eax, 1 .text:0080A345 000 mov dword ptr [ecx+130h], offset _sscanf .text:0080A34F 000 retn .text:0080A34F __rwStringOpen endp
Макросами в IDA пользоваться очень просто: в меню выбирается File->IDC File и файл с макросом
угу, я запускал несколько раз fwalk.idc
И вообще, нужен ли какой-либо ликбез по IDA scripting (или вообще по обработке текста?
если есть желание
Offline
Несколько потенциально полезных адресов:
5619D0 _profileStartInterval
561A00 _profileEndInterval
B7CB38 _profileTotalTimeLow dd ?
B7CB3C _profileTotalTimeHig dd ?
B7CB40 _enableProfiling db ?
Если enableProfiling не равна нулю, время в миллисекундах между вызовами profileStartInterval и profileEndInterval приплюсовывается в profileTotalTime
Количество обработанных интервалов помещается в
B7CB44 _profileIntervalCount dd ?
Last edited by listener (13-09-2007 04:36)
Offline
Кое-какая информация по поводу вертолетов полиции (см. также скрипт в Модификациях).
.text:006C79A0 processPursuitHelis
обрабатывает запуск вертолетов. Вертолеты запускаются с интервалом в 15 секунд.
.text:006C6520 ; int __cdecl CreatePursuitHeli(int Player2Follow,char PoliceOrVCN)
создает вертолет преследования
.data:00C1C960 _TimeLastPoliceHeliWasCreated
хранит время последнего запуска (см. 006C79A0)
.data:00C1C964 _pPoliceHeli .data:00C1C968 _pPoliceHeli2
хранят указатели на вертолеты. Это могут быть либо два маверика, либо маверик и вертолет новостей
Offline
2listener : ты не сталкивался в коде с такой вешью , как IPL Mapping ?
Last edited by Alexander (28-10-2007 13:53)
Offline
Offline
По просьбам трудящихся описываю изменения, вносимые моими патчами (выложенными в теме "disassembler-friendly GTA_SA.exe")
В общем, недавно я решил вернуть в gta-sa стандартную для Renderware-приложений возможность выбирать при запуске разрешение или оконный режим.
Первой была отключена проверка одной переменной, "мешающей" показу диалогового окна:
.text:00746219 02C mov eax, dword_C920F0 .text:0074621E 02C mov edi, 1 .text:00746223 02C cmp eax, edi .text:00746225 02C jle short loc_746273 ; <- забито 2-мя NOP'ами
До этой проверки в dword_C920F0 записывается количество подсистем (грубо говоря, видеоускорителей), и если их меньше 2-х, то диалоговое окно не показывается.
При создании диалогового окна заполняются два списка: список подсистем и список режимов для выбранной подсистемы. Рокстаровцы добавили код, отбрасывающий режимы:
- не полноэкранные;
- с шириной меньше 640 пикселей;
- с высотой меньше 480 пикселей.
.text:0074594D 09C call _RwEngineGetVideoModeInfo .text:00745952 09C mov ecx, [esp+98h+modeinfo.flag] .text:00745956 09C and ecx, 1 .text:00745959 09C add esp, 8 .text:0074595C 094 test cl, cl .text:0074595E 094 jz loc_745A54 ; <-- забито NOP'ами отсюда .text:00745964 094 cmp [esp+90h+modeinfo.width], 640 .text:0074596C 094 jl loc_745A54 .text:00745972 094 cmp [esp+90h+modeinfo.height], 480 .text:0074597A 094 jl loc_745A54 ; <-- досюда
Некоторое время спустя куча заставок, выводимых при запуске меня окончательно достала. Были найдены два метода пропуска заставок (оба заменяют состояние игры на "послезаставочное"). Метод Kyeman'а - замена состояния в памяти после загрузки. Метод Stretchnutter'а - замена состояния путем модификации кода в exe-файле.
оригинальный код:
00748AA8 |> 53 ||PUSH EBX ; Case 0 of switch 00748A98 00748AA9 |. 57 ||PUSH EDI 00748AAA |. E8 0176E4FF ||CALL gta_sa_c.005900B0 00748AAF |. 57 ||PUSH EDI 00748AB0 |. 57 ||PUSH EDI 00748AB1 |. E8 FA77E4FF ||CALL gta_sa_c.005902B0
модифицированный методом Stretchnutter'а код:
00748AA8 > C705 C0D4C800 >MOV DWORD PTR DS:[C8D4C0],5 ; Case 0 of switch 00748A98 00748AB2 .^EB DF JMP SHORT gta_sa_c.00748A93 00748AB4 90 NOP 00748AB5 90 NOP
При обработке состояния 0 происходит установка состояния 5 и переход к его обработке.
Наконец, чтобы запускать игру только в оконном режиме, достаточно вместо создания диалогового окна
00746236 . 6A 00 PUSH 0 ; /lParam = NULL 00746238 . 68 505E7400 PUSH gta_sa_c.00745E50 ; |DlgProc = gta_sa_c.00745E50 0074623D . 55 PUSH EBP ; |hOwner 0074623E . 6A 68 PUSH 68 ; |pTemplate = 68 00746240 . 53 PUSH EBX ; |hInst 00746241 . FF15 CC828500 CALL DWORD PTR DS:[<&USER32.DialogBoxPar>; \DialogBoxParamA 00746247 . 85C0 TEST EAX,EAX 00746249 . 0F84 85010000 JE gta_sa_c.007463D4
установить номер подсистемы и номер режима равными нулю (оконный режим обычно идет первым в списке)
00746236 . 90 NOP 00746237 . 90 NOP 00746238 . 33C0 XOR EAX,EAX 0074623A . A3 F420C900 MOV DWORD PTR DS:[C920F4],EAX ; подсистема 0074623F . A3 20628D00 MOV DWORD PTR DS:[8D6220],EAX ; видеорежим 00746244 . 90 NOP 00746245 . 90 NOP 00746246 . 40 INC EAX ; return TRUE :) 00746247 . 85C0 TEST EAX,EAX 00746249 . 0F84 85010000 JE gta_sa_c.007463D4
Вышеописанные модификации меняют код, находящийся в "скелете" Renderware, файл skel\win\win.c
[large][acronym=Завтра, завтра, постоянно завтра, так проходит жизнь]Cras, cras, semper cras, sic evadit aetas[/acronym][/large]
Offline
2Alexander:
Я выложил то, что у меня отдекомпилировано, на public. (sources/gta_dll_...) Там есть некоторое количество работы с IPL (ogConfig.cpp).
Если того, чего надо, не найдется - через несколько дней будет больше (исходники страшно "непричесанные", мне за них стыдно, поэтому просьба особо широко не распространять).
Если есть пожелания по конкретному фрагменту - можно высказывать.
Offline
Выложена свежая база. Изменения, в основном, относятся к структурам, читаемым из конфигов, плюс, немного по графике (плагины R*).
Новый цвет в базе - зеленый. Если какая-то функция покрашена зеленым, значит, она полностью декомпилирована (либо для нее написан аналог), компилируется и работает вместо оригинальной (см. предыдущий коммент).
Если все пойдет нормально, через несколько дней проблема лимитов на что-либо пропадет, как явление.
Offline
Как была отключена динамическая камера для поезда (описание патча):
При включении этой камеры всплывает сообщение "Нажмите NUM4...", id которого - "CINCAM".
В exe-шнике всего 5 функций (показывающих это сообщение) используют этот id, причем все 5 функций, в свою очередь, вызываются в "switch'е" одной функции (sub_527FA0, глядя на граф этой функции можно ужаснуться :wow: ).
После показа сообщения, происходит обращение к какой-то переменной:
.text:0052A71F call sub_526950 ; <-- забито .text:0052A724 mov dx, word_B70140 ; <-- nop'ами .text:0052A72B jmp short loc_52A757
Забивая по очереди вызов функции и обращение к переменной в каждой из пяти ветвей "switch'a", я нашел нужную ветвь.
[large][acronym=Завтра, завтра, постоянно завтра, так проходит жизнь]Cras, cras, semper cras, sic evadit aetas[/acronym][/large]
Offline