Берсеркер будут ли новые города в ере? 1.9? и еще я тебя спросить хотел можно ли скачать с интернета вог 3.59 там написано на одном сайте то что он типо вышел скачивайте я подозреваю что там вирус вышел ли поправде вог 3.59?
Берсеркер дай ссыль на город кремль если он вышел или на город рощу если он тоже вышел
Заранее спасибо)
Глянул подгрузку лодов в Иде. Всё понятно. Своя таблица вместо отдельных адресов и замена xref на конкретные лоды смещениями в таблице. Просто и надёжно.
Почти все смещения можно изменить подменой адреса. Перехватчики не нужны там.
Вот есть функции, которые возвращают double (соответственно, не в eax, а в st0). Результат их выполнения через SN:E и v1 не получить ведь - можно это поправить?
Вариант правки - расширить второй параметр в SN:E (4 - pascal, возвращающий дабл, 5 - такой же stdcall ,..)
Как оказалось, Сав несколько переусложнил задачу. К счастью, ЗВС уже внёс более 50 правок, корректирую смещения на новую таблицу архивов (размер: 100) и индексов (по типам лодов). Таким образом задача гораздо проще, чем кажется и основной код не связан с Героями. Завёл целый модуль, но набралось только 88 строк )
В общем со второго раза запустилась автозагрузка, тестирую.
Quote:Вот есть функции, которые возвращают double (соответственно, не в eax, а в st0). Результат их выполнения через SN:E и v1 не получить ведь - можно это поправить?
Вариант правки - расширить второй параметр в SN:E (4 - pascal, возвращающий дабл, 5 - такой же stdcall ,..)
Что ж это за функции? В Винапи есть примеры? Первый раз слышу о возврате через регистры сопроцессора. Может быть EAX:EDX?
Вариант приемлимый.
Всё хорошо. Добавил проверку на нормальное расширение файла и на его тип (нельзя загрузить каталог, будет ошибка менеджера ресурсов). Файлы сортируются по имени. Чтобы грузиться позже, нужно лишь иметь имя нужное. Ограничений на длину имён нет.
Саву и ZVS идёт +.
Quote:Что ж это за функции?
Да хотя бы героевские функции типа double __thiscall sub_4E3F40(int this, char a2) - определение процентовки некромантии.
Правда, как плавающую 64-битную точку через v1 возвращать? Только если писать в v1:v2 и предоставлять переходники типа "вернуть значение, умноженное на n и округленное до целого".
Quote:Первый раз слышу о возврате через регистры сопроцессора.
http://progclub.ru/?p=1596
Я могу возвращать её обрезанной до single в e1.
Либо в e1:e2. Ну и тут же вопрос, а как такие параметры типа double/extended/word/whatsoever использовать самому в командах?
Quote:Я могу возвращать её обрезанной до single
а как, кстати, отличать, когда возвращается сингл, а когда - дабл?
Мне кажется, что в Героях используется исключительно 32-бит float. Просто не вижу причин для использования двойной точности.
Да и ERM работает, насколько я знаю, только с числами с плавающей точкой одинарной точности.
Пока не доказано обратное, можно считать, что сингл.

Да, ЕРМ с Single работает. Уже понял, что double значительно отличается от single, а значит авто-определения быть не может. Так что если кто точно скажет, с каким форматом работает игра, мне будет проще.
FLD [DWORD EBP-4]
Функция некромансии возвращает single.
Quote:в Героях используется исключительно 32-бит float
ничего опровергающего это утверждение в коде игры не встречал.
Сопроцессор меняет float и double при вызове функции uint32 _control87(uint32 new, uint32 mask). Думаю, Ида её легко найдёт и вызовов этой функции будет мало - один, скорее всего.
Проверить можно с помощью uint32 _status87(void). Результат по маске _MCW_PC и сравнить с нужным битом (53 бита - double, 24 бита - float)
Code:
#define _MCW_PC 0x00030000 /* Precision Control */
#define _PC_64 0x00000000 /* 64 bits */
#define _PC_53 0x00010000 /* 53 bits */
#define _PC_24 0x00020000 /* 24 bits */