Kocmodecaht
Posts: 18
|
Берсеркер будут ли новые города в ере? 1.9? и еще я тебя спросить хотел можно ли скачать с интернета вог 3.59 там написано на одном сайте то что он типо вышел скачивайте я подозреваю что там вирус вышел ли поправде вог 3.59?
|
|
15.07.2011 20:28 |
|
Kocmodecaht
Posts: 18
|
Берсеркер дай ссыль на город кремль если он вышел или на город рощу если он тоже вышел
Заранее спасибо)
(This post was last modified: 15.07.2011 20:38 by Kocmodecaht.)
|
|
15.07.2011 20:37 |
|
Berserker
Posts: 16657
|
Нет. Нет.
Плагин на С++
Code:
#include <windows.h>
#include "Era.cpp"
#define ADV_MAP 37
#define CTRL_LMB 4
#define LMB_PUSH 12
#define ERROR_SET 1
_stdcall void OnAdventureMapLeftMouseClick (PEvent Event)
{
ExecErmCmd("CM:I?y1 F?y2 S?y3;");
if ((y[1] == ADV_MAP) && (y[2] == CTRL_LMB) && (y[3] == LMB_PUSH))
{
ExecErmCmd("CM:R0 P?y1/?y2/?y3;");
ExecErmCmd("UN:Ey1/y2/y3;");
if (f[1])
{
ExecErmCmd("UN:Oy1/y2/y3/1;");
ExecErmCmd("IF:L^{~red}Object was deleted!{~}^;");
}
}
}
extern "C" __declspec(dllexport) BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID lpReserved)
{
if (reason == DLL_PROCESS_ATTACH)
{
DisableThreadLibraryCalls(hInst);
ConnectEra();
RegisterHandler(OnAdventureMapLeftMouseClick, "OnAdventureMapLeftMouseClick");
}
return TRUE;
};
Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
|
|
15.07.2011 20:57 |
|
Berserker
Posts: 16657
|
|
15.07.2011 21:31 |
|
Berserker
Posts: 16657
|
|
15.07.2011 22:04 |
|
feanor
Posts: 624
|
Вот есть функции, которые возвращают double (соответственно, не в eax, а в st0). Результат их выполнения через SN:E и v1 не получить ведь - можно это поправить?
Вариант правки - расширить второй параметр в SN:E (4 - pascal, возвращающий дабл, 5 - такой же stdcall ,..)
|
|
16.07.2011 01:52 |
|
Berserker
Posts: 16657
|
Как оказалось, Сав несколько переусложнил задачу. К счастью, ЗВС уже внёс более 50 правок, корректирую смещения на новую таблицу архивов (размер: 100) и индексов (по типам лодов). Таким образом задача гораздо проще, чем кажется и основной код не связан с Героями. Завёл целый модуль, но набралось только 88 строк )
В общем со второго раза запустилась автозагрузка, тестирую.
Quote:Вот есть функции, которые возвращают double (соответственно, не в eax, а в st0). Результат их выполнения через SN:E и v1 не получить ведь - можно это поправить?
Вариант правки - расширить второй параметр в SN:E (4 - pascal, возвращающий дабл, 5 - такой же stdcall ,..)
Что ж это за функции? В Винапи есть примеры? Первый раз слышу о возврате через регистры сопроцессора. Может быть EAX:EDX?
Вариант приемлимый.
Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
|
|
16.07.2011 04:02 |
|
Berserker
Posts: 16657
|
|
16.07.2011 04:27 |
|
feanor
Posts: 624
|
Quote:Что ж это за функции?
Да хотя бы героевские функции типа double __thiscall sub_4E3F40(int this, char a2) - определение процентовки некромантии.
Правда, как плавающую 64-битную точку через v1 возвращать? Только если писать в v1:v2 и предоставлять переходники типа "вернуть значение, умноженное на n и округленное до целого".
Quote:Первый раз слышу о возврате через регистры сопроцессора.
http://progclub.ru/?p=1596
(This post was last modified: 16.07.2011 08:53 by feanor.)
|
|
16.07.2011 07:30 |
|
Berserker
Posts: 16657
|
|
16.07.2011 14:52 |
|
feanor
Posts: 624
|
Quote:Я могу возвращать её обрезанной до single
а как, кстати, отличать, когда возвращается сингл, а когда - дабл?
|
|
16.07.2011 15:02 |
|
etoprostoya
Posts: 1809
|
Мне кажется, что в Героях используется исключительно 32-бит float. Просто не вижу причин для использования двойной точности.
Да и ERM работает, насколько я знаю, только с числами с плавающей точкой одинарной точности.
Пока не доказано обратное, можно считать, что сингл.
(This post was last modified: 16.07.2011 17:43 by etoprostoya.)
|
|
16.07.2011 17:42 |
|
Berserker
Posts: 16657
|
|
16.07.2011 18:02 |
|
baratorch
Posts: 197
|
Quote:в Героях используется исключительно 32-бит float
ничего опровергающего это утверждение в коде игры не встречал.
|
|
16.07.2011 18:24 |
|
etoprostoya
Posts: 1809
|
Сопроцессор меняет 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 */
|
|
16.07.2011 18:37 |
|