Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Обсуждение инженерного анализа
DF2 :: ФОРУМЫ > Игровые форумы > Heroes of Might & Magic III > Моды
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9
Barin
Мне нужно в меню выбора кампаний SoD отключить некоторые окна, выглядеть должно так:


Для начала хочу презентовать 1 кампанию, другие должны быть заблокированы.
Наверняка можно сделать это подобием таких команд:

Цитата
сместить кнопки далеко за пределы экрана: для бин файла
; кнопка "Синглплеер"
63E6B0 FFFD
; кнопка "Мультиплеер"
63E6B8 FFFD
; кнопка "Обучение"
63E6C8 FFFD
; кнопка "Во имя богов"
456C6C AAAA
; кнопка "Клинок Армагедона"
456CE6 AAAA
; кнопка "Возраждение Эратии"
63BBF0 AAAA
; кнопка "Выбрать"
63BBF8 AAAA


Кто может помочь?

p.s Оставшиеся 3 окна тоже бы отключить.
igrik
Цитата(feanor @ 18 Sep 2016, 14:33) *
Проиграть анимацию стека.

Код
!!UN:C6919200/4/?y10;
!!VRy20:Sx1 *1352 +21708 +y1; // x1 = номер стека
!!SN:E4482656/2/y20/13/-1/0; //13 - атака вниз
!!SN:E4482656/2/y20/2/1/0; //восстанавливаем исходное положение (стойка)

Еще бы разобраться с массовой анимацией стеков.
feanor
Попробуй в функции из этого поста
http://forum.df2.ru/index.php?s=&showt...st&p=607236
подменить номер для анимации урона

или самому прокручивать комбатанимэйшнстеп
AlexSpl
Подскажите, пожалуйста, как узнать, проходима ли героем клетка с координатами x, y, z. Без учёта объектов, которые герой может "убрать с пути" (сундуки, ресурсы, артефакты и т.п.).

Или хотя бы функцию, которая строит маршрут героя.
Barin
Цитата(igrik @ 01 May 2017, 15:52) *
Цитата(Barin @ 01 May 2017, 14:41) *
Хорошо, работает для объектов которые можно построить. А как определить подобные декоративные объекты непонятно:

Сначала проверь указанное, а потом говори что "непонятно". Откуда эта инфа, что можно менять только строящиеся объекты? Ты проверял? Конечно нет. Поэтому и не знаешь, что можно.
И в сотый раз тебе повторять уже надоело - есть специальные темы для обсуждений. А эти темы для чистой информации. Смекаешь?


Проверял. В ERM справочнике предоставлен список только объектов. В списке нет подобных декоративных дефов. Там есть значения без информации: постройки 20, 27, 28, 29 - попробовал не сработало. Например:

!!VRy1:S8; //city (e.g. Castle)
!!VRy2:S20; //building ID (e.g Tavern)

!!VRy6:S10; //frames num in new def (там 10 кадров)
!!VRy3:S1; //new x
!!VRy4:S1; //new y

!!VRy5:Sy1 *44 +y2 *6 +6859276;

!!UN:Cy5/2/y6;
!!VRy5:+2;
!!UN:Cy5/2/y3;
!!VRy5:+2;
!!UN:Cy5/2/y4;

Короче, через CM подобный объект не определяется, имеет значение -1 как и фон города.

Где посмотреть ID водопада?
igrik
Цитата(Barin @ 01 May 2017, 16:06) *
Где посмотреть ID водопада?
22
tolich
Цитата(Barin @ 01 May 2017, 16:06) *
Где посмотреть ID водопада?
В ERM-справке по ресейверу !!CM:I щёлкнуть по слову "место".
Barin
Команду RedirectFile использую для подмены дефов в конкретных картах, но с форматом .txt трюк не проходит.

Например:
!?PI;
!!SN:L^Era.dll^/?y1 Ay1/^RedirectFile^/?y2 Ey2/1/^HCTRAITS.txt^/^my.txt^; !!VRy1:S0; !!VRy2:S0;

HCTRAITS.txt - здесь список классов героев.
my.txt - мои новые названия.

Как можно это сделать?
igrik
Цитата(Barin @ 09 Jun 2017, 12:47) *
Как можно это сделать?
Смысла в этом нет.
HCTRAITS.txt грузится при старте экзешника и всего один раз.

Но пожешь использовать этот способ. Точно не знаю - сработает ли, и будет ли утечка памяти ли. Ли-ли-ли...
Цитата
!!VRz1:S^1111.txt^; полное название тектовика в z1
!!UN:C5138903/4/9597928; подменить ссылку на адрес переменной z1
!!SN:E5138896/1; функция загрузки "hctraits.txt"
Barin
Цитата(igrik @ 09 Jun 2017, 16:01) *
Цитата(Barin @ 09 Jun 2017, 12:47) *
Как можно это сделать?
Смысла в этом нет.
HCTRAITS.txt грузится при старте экзешника и всего один раз.

Но пожешь использовать этот способ. Точно не знаю - сработает ли, и будет ли утечка памяти ли. Ли-ли-ли...
Цитата
!!VRz1:S^1111.txt^; полное название тектовика в z1
!!UN:C5138903/4/9597928; подменить ссылку на адрес переменной z1
!!SN:E5138896/1; функция загрузки "hctraits.txt"



Если есть вероятность ошибок, лучше откажусь от этой затеи. Тем более мне нужно было не только hctraits.txt, но и другие текстовики, например DWELLING.txt - чтобы подменять в городе названия строений Оплота на названия строений Града. Пользуясь случаем, не подскажите ли, можно этого добиться через ERM? Что-то не встретил команду в справочнике. Ресейвер !!CA не даёт такой возможности, а в !!UN есть команда только для узнавания названия - N2/z#/$1/$2 – имя здания ($2) в городе $1.
Ben
Цитата(feanor @ 13 Jul 2017, 15:19) *
*(int*)0x004EB816 = (int)Dependencies0;


Ну, вот это я и называю как бы изменением экзешника, только не на винчестере, а в памяти, получается.
AlexSpl
В комменте /* рабочий код */. Подключил homm3.h. Переписал. Вопрос почему hero->second_skill[HSS_FIRE_MAGIC] не возвращает уровень Магии Огня (см. код)?

Код
int __stdcall blindSpell(LoHook* h, HookContext* c)
{
    if ( c->ebx == SPL_BLIND )
    {
        /* int cmAddr = *(int*)0x699420;
        int monSide = *(int*)(c->esi + 244);
        int heroOffset = *(int*)(cmAddr + (1 - monSide) * 4 + 0x53CC); // Адрес вражеского героя
                
        int duration[] = {1, 1, 3, 5};

        if ( heroOffset ) c->eax = duration[*(char*)(heroOffset + 201 + 14)]; */

        int duration[] = {1, 1, 3, 5};

        _BattleStack_* battleStack = (_BattleStack_*)c->esi;
        _Hero_* hero = o_BattleMgr->hero[1 - battleStack->side];

        // if ( hero ) c->eax = duration[hero->second_skill[HSS_FIRE_MAGIC]]; // Почему это не работает?
        if ( hero ) c->eax = duration[*(char*)((int)hero + 201 + 14)]; // А это работает
    }

    return EXEC_DEFAULT;
}
feanor
Попробуй потыкать компилятор носом в алигны

AlexSpl
Раскомментировал обе строки. Запустил отладчик:



Что за фигня? Откуда в первом случае смещение 0E6h?

Цитата
Попробуй потыкать компилятор носом в алигны

Да. Так работает. Спасибо.
Ben

Добрый день.

Нет ли у кого-то кастомного диалога, который подходит для простой задачи -
выбрать число из некоего ряда (скажем, ряд из 9 чисел)с помощью ползунка
(как, например, в диалоге разделения отрядов) ?

Картинки не требуются, только заголовок для диалога.

P.S. Речь идет о программировании с помощью HD мода.
hippocamus
О, чувствую, скоро появится библиотека VCL для плагинов к HD-mod. ))
igrik
Цитата(Ben @ 19 Aug 2017, 08:54) *
Нет ли у кого-то кастомного диалога, который подходит для простой задачи -
выбрать число из некоего ряда (скажем, ряд из 9 чисел)с помощью ползунка
(как, например, в диалоге разделения отрядов) ?


Как-то так...



Код
void __fastcall Scroll_TestDlg_Callback(int klick_id, _Dlg_* dlg)
{
    klick_id ? dlg->GetItem(30722)->SetEnabled(1) : dlg->GetItem(30722)->SetEnabled(0);  // включить или выключить кнопку ок
    dlg->Redraw(TRUE);
}


void New_TestDlg_Show(int x, int y)
{
    _Dlg_* dlg = _CustomDlg_::Create(-1, -1, 297, 215, DF_SCREENSHOT | DF_SHADOW, NULL);                                                                        // создали диалог
    dlg->AddItemByZOrder(_DlgStdBackground_::Create(0, 0, dlg->width, dlg->height, 0, 0, o_GameMgr->GetMeID()), 0);                                                // рамка в цвете игрока
    dlg->AddItem(_DlgStaticText_::Create(0, 20, dlg->width, 30, "Переместить ползунок?", "bigfont.fnt", 7, 1, ALIGN_H_CENTER | ALIGN_V_TOP, 0));                // заголовок

    dlg->AddItem(_DlgStaticText_::Create(0, 60, dlg->width, 50, "Вы можете перемещать ползунок, \n и вправо, и влево!",
                                                                                        "medfont.fnt", 1, 0, ALIGN_H_CENTER | ALIGN_V_TOP, 0));                    // описание

    dlg->AddItem(_DlgScroll_::Create(30, dlg->height -85, 234, 16, 40, 9, (_ptr_)Scroll_TestDlg_Callback, 0, 18, 0));                                            // создать ползунок

    // делаем кнопку ок
    dlg->AddItem(_DlgStaticPcx8_::Create(19, dlg->height -52, 0, "Box64x30.pcx"));
    dlg->AddItem(_DlgButton_::Create(20, dlg->height -51, 64, 30, 30722, "iOkay.def", 0, 1, 1, 28, 2));
    dlg->GetItem(30722)->SetEnabled(0); // отключенная кнопка ok

    // делаем кнопку отмена
    dlg->AddItem(_DlgStaticPcx8_::Create(213, dlg->height -52, 0, "Box64x30.pcx"));
    dlg->AddItem(_DlgButton_::Create(214, dlg->height -51, 64, 30, 30721, "iCancel.def", 0, 1, 1, 1, 2));

    // b_MouseMan_SetCursor(0,0);
    CALL_3 (void, __thiscall, 0x50CEA0, o_MouseMgr, 0, 0);  // установить курсор(0,0)

    dlg->Run();
    dlg->Destroy(TRUE);
}

Ben
А какой в данном случае ряд чисел ? И как сделать так, чтобы при движении ползунка число отображалось в некоем поле ?
igrik
Цитата(Ben @ 20 Aug 2017, 18:40) *
А какой в данном случае ряд чисел ? И как сделать так, чтобы при движении ползунка число отображалось в некоем поле ?

Вот так.




Код
void __fastcall Scroll_TestDlg_Callback(int klick_id, _Dlg_* dlg)
{
    klick_id ? dlg->GetItem(30722)->SetEnabled(1) : dlg->GetItem(30722)->SetEnabled(0);  // включить или выключить кнопку ок
    sprintf(o_TextBuffer, "%d", klick_id);
    ((_DlgStaticText_*)dlg->GetItem(14))->SetText(o_TextBuffer);
    // ((_DlgStaticText_*)dlg->GetItem(14))->SetText(va_cstr("%d", klick_id)); // id текста = 14
    dlg->Redraw(TRUE);
}


void New_TestDlg_Show(int x, int y)
{
    _Dlg_* dlg = _CustomDlg_::Create(-1, -1, 297, 215, DF_SCREENSHOT | DF_SHADOW, NULL);                                                                        // создали диалог
    dlg->AddItemByZOrder(_DlgStdBackground_::Create(0, 0, dlg->width, dlg->height, 0, 0, o_GameMgr->GetMeID()), 0);                                                // рамка в цвете игрока
    dlg->AddItem(_DlgStaticText_::Create(0, 20, dlg->width, 30, "Переместить ползунок?", "bigfont.fnt", 7, 1, ALIGN_H_CENTER | ALIGN_V_TOP, 0));                // заголовок

    dlg->AddItem(_DlgStaticText_::Create(0, 60, dlg->width, 50, "Вы можете перемещать ползунок, \n и вправо, и влево!",
                                                                                        "medfont.fnt", 1, 0, ALIGN_H_CENTER | ALIGN_V_TOP, 0));                    // описание

    dlg->AddItem(_DlgScroll_::Create(30, dlg->height -85, 234, 16, 40, 9, (_ptr_)Scroll_TestDlg_Callback, 0, 18, 0));                                            // создать ползунок


    // создаем отображенное число, зависимое от ползунка в поле
    dlg->AddItem(_DlgStaticText_::Create(137, dlg->height -52, 30, 30, "0", "medfont.fnt", 1, 14, ALIGN_H_CENTER | ALIGN_V_CENTER, 0));                            // id текста = 14

    // делаем кнопку ок
    dlg->AddItem(_DlgStaticPcx8_::Create(19, dlg->height -52, 0, "Box64x30.pcx"));
    dlg->AddItem(_DlgButton_::Create(20, dlg->height -51, 64, 30, 30722, "iOkay.def", 0, 1, 1, 28, 2));
    dlg->GetItem(30722)->SetEnabled(0); // отключенная кнопка ok

    // делаем кнопку отмена
    dlg->AddItem(_DlgStaticPcx8_::Create(213, dlg->height -52, 0, "Box64x30.pcx"));
    dlg->AddItem(_DlgButton_::Create(214, dlg->height -51, 64, 30, 30721, "iCancel.def", 0, 1, 1, 1, 2));

    // b_MouseMan_SetCursor(0,0);
    CALL_3 (void, __thiscall, 0x50CEA0, o_MouseMgr, 0, 0);  // установить курсор(0,0)

    dlg->Run();
    dlg->Destroy(TRUE);
}


Ряд чисел 0...9. Указан в int ticks_count:
dlg->AddItem(_DlgScroll_::Create(30, dlg->height -85, 234, 16, 40, 9, (_ptr_)Scroll_TestDlg_Callback, 0, 18, 0)); // создать ползунок

PS: Но я не задавался целью сделать красивый диалог
feanor
Ня.
Тоже, что ли, диалоги потыкать.
AlexSpl
2igrik: Компилируется нормально, но компоновщик выдаёт ошибки типа таких:


Полный код dllmain.cpp такой:


Кто знает, что ему нужно? Как будто отсутствует определение конструктора. Хедеры лежат в папке с dllmain.
AlexSpl
2igrik: DLL получилась. Спасибо. Только как теперь этот диалог потестить? Например, в хуке он не работает (игра крашится). Стандартные диалоги работают.

AlexSpl
Вот так заработало (без AddItemByZOrder и, соответственно, без фона):

Код
void New_TestDlg_Show(int x, int y)
{
    _Dlg_* dlg = _CustomDlg_::Create(-1, -1, 297, 215, DF_SCREENSHOT | DF_SHADOW, NULL); // создали диалог
    
    // dlg->AddItemByZOrder(_DlgStdBackground_::Create(0, 0, dlg->width, dlg->height, 0, 0, o_GameMgr->GetMeID()), 0); // рамка в цвете игрока
    dlg->AddItem(_DlgStaticText_::Create(0, 20, dlg->width, 30, "Переместить ползунок?", "bigfont.fnt", 7, 1, ALIGN_H_CENTER | ALIGN_V_TOP, 0)); // заголовок

    dlg->AddItem(_DlgStaticText_::Create(0, 60, dlg->width, 50, "Вы можете перемещать ползунок, \n и вправо, и влево!",
        "medfont.fnt", 1, 0, ALIGN_H_CENTER | ALIGN_V_TOP, 0)); // описание

    dlg->AddItem(_DlgScroll_::Create(30, dlg->height -85, 234, 16, 40, 9, (_ptr_)Scroll_TestDlg_Callback, 0, 18, 0)); // создать ползунок

    // создаем отображенное число, зависимое от ползунка в поле
    dlg->AddItem(_DlgStaticText_::Create(137, dlg->height -52, 30, 30, "0", "medfont.fnt", 1, 14, ALIGN_H_CENTER | ALIGN_V_CENTER, 0));                            // id текста = 14

    // делаем кнопку ок
    dlg->AddItem(_DlgStaticPcx8_::Create(19, dlg->height -52, 0, "Box64x30.pcx"));
    dlg->AddItem(_DlgButton_::Create(20, dlg->height -51, 64, 30, 30722, "iOkay.def", 0, 1, 1, 28, 2));
    dlg->GetItem(30722)->SetEnabled(0); // отключенная кнопка ok

    // делаем кнопку отмена
    dlg->AddItem(_DlgStaticPcx8_::Create(213, dlg->height -52, 0, "Box64x30.pcx"));
    dlg->AddItem(_DlgButton_::Create(214, dlg->height -51, 64, 30, 30721, "iCancel.def", 0, 1, 1, 1, 2));

    // b_MouseMan_SetCursor(0,0);
    CALL_3(void, __thiscall, 0x50CEA0, o_MouseMgr, 0, 0);  // установить курсор(0,0)

    dlg->SetPos(x, y); // Задаём координаты левого верхнего угла диалога
    dlg->Run();
    dlg->Destroy(TRUE);
}

С фоном игра либо крашится, либо зависает. Посмотрел реализацию метода _DlgStdBackground_::Create() - там вложенные бесконечные циклы while ( true ).

У тебя, igrik, на скринах всё в порядке. Интересно, почему у меня фон не хочет отрисовываться.

* * *
Поэкспериментировал с координатами:



Это картинка _DlgStdBackground_::Create(20, 20, 200, 200, 0, 0, o_GameMgr->GetMeID()). После боя всё равно вылетает.
igrik
Цитата(AlexSpl @ 28 Aug 2017, 00:41) *
У тебя, igrik, на скринах всё в порядке. Интересно, почему у меня фон не хочет отрисовываться.

Изначально я обычно всё проверяю на Эре.
Так вот, в Эре этих проблем нет - окно нормально отображается с задником (откуда и были скрины). Чего не скажешь про SoD/HotA.

Что ж .... будем разбираться.

PS: тебе обязательно нужны динамически изменяемые размеры окна, или ты будешь использовать статический размер?
Код
_DlgStaticPcx8_* backPcx;
dlg->AddItem(backPcx = b_DlgStaticPcx8_Create(0, 0, dlg->width, dlg->height, 1, "Фоновый_Рисунок.pcx", 2048));
backPcx->Colorize(o_GameMgr->GetMeID());


==========================

UPD: [решено!!]

Код
// создание подложки под цвет игрока
void Set_DlgStdBackground(_Dlg_* dlg)
{
    CALL_5 (int, __thiscall, 0x48FA80, dlg, dlg->x, dlg->y, dlg->width, dlg->height);

    for (int i = dlg->field_4C; i <= dlg->field_50; ++i)
    {
        CALL_5 (int, __thiscall, 0x5FF400, dlg, 512, 13, i, o_GameMgr->GetMeID());    
    }
}


void New_TestDlg_Show(int x, int y)
{
    _Dlg_* dlg = _CustomDlg_::Create(-1, -1, 297, 155, DF_SCREENSHOT | DF_SHADOW, NULL);

    Set_DlgStdBackground(dlg);   // создание подложки
      
       ...
AlexSpl
Да, так работает. Хоть я не знаю, что такое поля field_4C и т.п. Ещё раз спасибо!

Вот такая красота получилась:

igrik
Цитата(AlexSpl @ 28 Aug 2017, 18:28) *
Хоть я не знаю, что такое поля field_4C и т.п. Ещё раз спасибо!
Я сам точно не знаю, но судя по реверсу field_4C и field_50 это границы id элементов фона, как раз для перекраски последнего в цвет игрока.
Ведь такой фон диалогового окна зачастую строится путем склеивания кадров из дефа.
AlexSpl
Как получить значение (в данном случае последнее click_id) из колбэка, не прибегая к глобальным переменным?

btw, есть у этого скролла в примере недостаток: если кликать прямо по полосе прокрутки, ползунок будет перемещаться с максимальным шагом. Например, для диапазона значений от 1 до 10, если ползунок стоял на 1, то при клике в любом свободном от него месте полосы прокрутки, он переместится сразу в положение 10.

UPD: Нашёл, как исправить (частично):

Код
// Добавляем полосу горизонтальной прокрутки
dlg->AddItem(_DlgScroll_::Create(30, dlg->height - 90, dlg->width - 30 * 2 + 1, 16, 40, count, (_ptr_)scrollDlgCallback, 0, 1, 0));

Предпоследний аргумент - это шаг при клике по полосе прокрутки.

В идеале нужно, наверное, с координатами мыши работать. В диалоге разделения отрядов полоса прокрутки работает привычно: где кликнул, там ползунок и очутился smile.gif
igrik
Цитата(AlexSpl @ 28 Aug 2017, 21:40) *
Как получить значение (в данном случае последнее click_id) из колбэка, не прибегая к глобальным переменным?
Вот кстати не могу точно ответить на этот вопрос. Но я использовал dlg->field_64, хоть и не знаю используется оно где-то или нет.
AlexSpl
Последний аргумент, скорее всего, что-то типа TabOrder. Если его поставить достаточно большим (например, 20), то ползунком можно управлять с клавиатуры (стрелка влево/вправо/вверх/вниз, Page Up/Down).

А нет. Если 0 - нельзя управлять с клавиатуры, больше 0 - можно (флаг bool?). Но анимируется только нажатие левой кнопки (стрелка влево), причём с графическим глюком снизу, правая кнопка не анимируется (стрелка вправо).

* * *
Заметил, что если кликнуть на полосе прокрутки, а затем, удерживая левую кнопку мыши, передвинуть её на 1 пиксель, то ползунок занимает ближайшее к курсору (дискретное) положение. Как можно сымитировать такое движение мышью?
Ben
Хотел бы довести до ума свой плагин с Городским порталом (http://forum.df2.ru/index.php?showtopic=30848&st=20),

Данный плагин дает возможность Герою на любом уровне Магии Земли выбирать город для телепортирования.

Проблема в том, что компьютер не использует эту возможность (протестировано). Значит, при действиях на карте, он проверяет, есть ли у него Городской портал и какой у него уровень Магии Земли.

Можно ли как-то определить участок кода, где это делается ? То есть можно ли, например, отследить обращения к данному поле в объекте Герой (Магия Земли) ?
feanor
Цитата
То есть можно ли, например, отследить обращения к данному поле в объекте Герой (Магия Земли) ?
Hardware breakpoint в Olly.
Ben
Цитата(feanor @ 02 Sep 2017, 11:35) *
Цитата
То есть можно ли, например, отследить обращения к данному поле в объекте Герой (Магия Земли) ?
Hardware breakpoint в Olly.


А можно пример для чайников со скриншотом именно для данной задачи ? rolleyes.gif

Подозреваю, впрочем, что это будет

0041C659 call Hero_GetSchoolLevelOfSpell

в процедуре 0041C610 Cast_AdventureMagic
igrik
Я думаю где-то тут 0x43052A
Ben
Цитата(igrik @ 02 Sep 2017, 13:53) *
Я думаю где-то тут 0x43052A


Да вроде нет. На Си коде тут все банально:

Код
JumpHero((void *)pAdvManager, (_Hero_ *)v6, *(_DWORD *)v16, 0, 1, 0);
      v55 = GetTypeOfLandModifierUnderHero((_Hero_ *)v6);
      v56 = CalcSpellCost4Hero((char *)v6, 9, 0, v55);
      sub_004D9540((_Hero_ *)v6, v56);
      v57 = GetTypeOfLandModifierUnderHero((_Hero_ *)v6);
      v58 = *(_DWORD *)(v6 + 77) - (Hero_GetSchoolLevelOfSpell((_Hero_ *)v6, 9, v57) != 3 ? 300 : 200);
      *(_DWORD *)(v6 + 77) = v58;
      if ( (signed int)v58 < 0 )
        *(_DWORD *)(v6 + 77) = 0;


Просто проверяется, есть ли мувпойнты.
Но инфа полезная, спасибо. 300 и 200 тут тоже надо подправить. Нелегко делать корректно работающие моды.
Ben
Возможно, вообще мой код для Городского портала только для человека и работает.

tolich
Цитата(Ben @ 02 Sep 2017, 19:15) *
Возможно, вообще мой код для Городского портала только для человека и работает.
Скорее всего. Компу же диалог выбора города не показывают.
AlexSpl
Посмотрите условный переход по адресу 56B3B4h. Далее, для порядка стоимость заклинания в MP нужно также изменить по адресам 56B5AAh и 430532h (LoHook, стоимость в eax).
Ben
Выложил обновленный код и DLL в соответствующей теме.
AI теперь в курсе введенных изменений, применяет Городской портал для перемещения в нужный город, даже не имея навыка Магия Земли.
Большое спасибо AlexSpl !
igrik
to Ben:
Цитата
Ну вот, уже не первый раз встречаюсь с тем, что в ERM много полезной информации.
Но заставить себя изучать ERM не могу
Мне проще писать плагины на C++, чем вникнуть в ERM.

В ERM вникать не нужно. Для сода/хоты он НЕприменим. Только для вога или эры.
Но справку юзать однозначно стоит. Там масса информации, которую можно применять и для сода/хоты: Арты, объекты, герои, номера зданий, гексы поля боя и т.п. Они одни для всех версий героев 3.
Ben
Альтернативный вариант плагина (http://forum.df2.ru/index.php?s=&showtopic=30848&view=findpost&p=744199)
(тогда в подсказке по навыку можно будет написать почти то же самое что и в оригинале -
что навык дает дополнительные 5/10/20% опыта за каждый уровень, достигнутый героем)

Код
    #include "..\..\include\homm3.h"

        Patcher* _P;
        PatcherInstance* _PI;

        static _bool_ plugin_On = 0;

    
       int __stdcall changeLearningPower(LoHook* h, HookContext* c)
       {
          char learningSkill = *(char*)(c->ecx + 0xDE);
          _word_ heroLevel = *(int*)(c->ecx + 0x55);

          if(learningSkill == 1)
           *(float*)(c->ebp - 4) = (float)(heroLevel * 0.05);
          if(learningSkill == 2)
           *(float*)(c->ebp - 4) = (float)(heroLevel * 0.10);
          if(learningSkill == 3)
           *(float*)(c->ebp - 4) = (float)(heroLevel * 0.20);

          return EXEC_DEFAULT;
       }

        BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
        {
           if ( DLL_PROCESS_ATTACH == ul_reason_for_call )
           {
              if ( !plugin_On )
              {
                 plugin_On = 1;
                 _P = GetPatcher();
                 _PI = _P->CreateInstance("HD.Plugin.LearningSkill");
              
              _PI->WriteLoHook(0x4E4ACD, changeLearningPower);
              }
           }
          
           return TRUE;
        }
mr_bobblehead
Доброе время суток!

Пытаюсь разобраться с созданием диалогов по примеру igrik, но компилятор постоянно выдает ошибку:



Подскажите пожалуйста, что я делаю не так?
hippocamus
mr_bobblehead
Вряд ли смогу помочь по существу, но, чтобы тебе могли ответить igrik, Berserker, MoP - надо хотя бы написать - какую версию Эры ты используешь, какую версию патчера какой компилятор ты используешь? Вроде бы общепринят Microsoft Visual C++. На Embarcadero Visual Studio я не смог собрать простейшей, казалось бы, dll-ки, написанной под майкрософтовский синтаксис.
Ну и код, само собой, не помешал бы.
mr_bobblehead
Цитата(hippocamus @ 01 Dec 2017, 23:18) *
mr_bobblehead
Вряд ли смогу помочь по существу, но, чтобы тебе могли ответить igrik, Berserker, MoP - надо хотя бы написать - какую версию Эры ты используешь, какую версию патчера какой компилятор ты используешь? Вроде бы общепринят Microsoft Visual C++. На Embarcadero Visual Studio я не смог собрать простейшей, казалось бы, dll-ки, написанной под майкрософтовский синтаксис.
Ну и код, само собой, не помешал бы.


VS 2015

#include <windows.h>

#include "..\..\include\patcher_x86_commented.hpp"
#include "..\..\include\HotA\HoMM3.h"
#include "..\..\include\era.h"

Patcher* _P;
PatcherInstance* _PI;
static _bool_ plugin_On = 0;

void __fastcall Scroll_TestDlg_Callback(int klick_id, _Dlg_* dlg)
{
dlg->Redraw(TRUE);
}

void New_TestDlg_Show(int x, int y)
{
_Dlg_* dlg = _CustomDlg_::Create(-1, -1, 297, 215, DF_SCREENSHOT | DF_SHADOW, NULL);

dlg->Run();
dlg->Destroy(TRUE);
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
if (!plugin_On)
{
plugin_On = 1;
_P = GetPatcher();
_PI = _P->CreateInstance("HD.Plugin.TestPlugin");
}
break;

case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
feanor
Ох, "Error LNK2001". Спасибо С++ за еще один день разрешения зависимостей.

Если мне не изменяет память, надо явно добавить в проект используемые .h и .cpp файлы из инклудов.

Цитата
H2SW_creatures

Я даже удивлен!
Berserker
Цитата
HotA\HoMM3.h

Файл есть в открытом доступе?
mr_bobblehead
Цитата(feanor @ 02 Dec 2017, 12:48) *
Ох, "Error LNK2001". Спасибо С++ за еще один день разрешения зависимостей.

Если мне не изменяет память, надо явно добавить в проект используемые .h и .cpp файлы из инклудов.

Цитата
H2SW_creatures

Я даже удивлен!


Ковырялся в исходниках, извините =).gif Спасибо, я попробую.

Цитата(Berserker @ 02 Dec 2017, 14:35) *
Цитата
HotA\HoMM3.h

Файл есть в открытом доступе?


Да, правда пришлось хорошенько поискать.
hippocamus
Цитата(mr_bobblehead @ 02 Dec 2017, 15:33) *
Цитата(Berserker @ 02 Dec 2017, 14:35) *
Цитата
HotA\HoMM3.h

Файл есть в открытом доступе?


Да, правда пришлось хорошенько поискать.
интересно узнать дату файла.
mr_bobblehead
Цитата(hippocamus @ 02 Dec 2017, 22:15) *
Цитата(mr_bobblehead @ 02 Dec 2017, 15:33) *
Цитата(Berserker @ 02 Dec 2017, 14:35) *
Цитата
HotA\HoMM3.h

Файл есть в открытом доступе?


Да, правда пришлось хорошенько поискать.
интересно узнать дату файла.


23.03.2013
Berserker
Команда Хоты обновлённый файл не выкладывала, Хиппо? Можете загрузить куда-нибудь на обменник?
Sav
Команда не выкладывала и не передавала для распространения исходники HotA или какие-то их части, равно как и реверсерские базы данных (и не планирует в будущем). Некогда временно выкладывались только исходники HD и BattleFigures с заголовочными файлами, схожими с обсуждаемыми здесь и практически идентичными между собой. В обсуждаемых файлах, однако, информации несколько больше, чем было там, и по всем признакам, это утечка именно из исходников HotA. Впрочем, дополнительная информация, по сравнению с действительно выкладывавшимися публично заголовочниками, не очень существенна.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.