Объявления

Друзья, если не получается зарегистрироваться, напишите на почту vdv_forever@bk.ru.
Я оторву свою задницу от всех дел и обязательно Вас активирую! :smile10:
Добро пожаловать на геройский форум! :smile25:

Как создать плагин для HD мода

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 05 авг 2017, 17:27

Это локальная переменная, которой выше по коду было присвоено значение [N / n] * Damage. Теперь мы умножаем это число на 0.03 и получаем прибавку к урону за специальность.
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1318
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

Re: Как создать плагин для HD мода

Сообщение Ben80 » 05 авг 2017, 20:12

Насколько я понял, в процедуру int __thiscall HeroSpellSpecialityEffect(_Hero_ *this, int spell, int heroLevel, signed int effect)

в качестве heroLevel может передаваться как уровень Героя, так и уровень монстра.

Название процедуре и аргументам разработчики ВоГа ведь давали ?
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 05 авг 2017, 20:27

Да, база воговская. Но моя версия Иды её не открывает, поэтому пишите сразу адрес. Нашёл. Это же та самая, о которой речь шла.

Цитата:
в качестве heroLevel может передаваться как уровень Героя, так и уровень монстра.

Нет, аргумент трактуется однозначно. Если бы нужно было передавать уровень монстра, аргументов было бы на один больше.

Ага, посмотрел. Передаётся уровень монстра и указатель ecx (this) на героя. Имея указатель на героя, можно получить его уровень: word ptr [ecx+55h].
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 05 авг 2017, 20:38

Ответил выше. Описание неверное. Передаётся именно уровень монстра. Указатель на героя передаётся через регистр ecx. См. Соглашения о вызовах.

Иными словами, эта функция есть метод класса Hero (условно).
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1318
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

Re: Как создать плагин для HD мода

Сообщение Ben80 » 08 авг 2017, 16:27

Написал плагин для заклинания "Портал города". Теперь на любом уровне магии Земли можно выбирать город.
Существенно увеличились расходы MP - для основного уровня 1200 MP, для продвинутого 1000 MP, для эксперта 800 MP.

Ассемблерный код, отвечающий за заклинание не понял, но плагин написал :) и он работает. Один только недочет - на основном уровне Земли выбрать город дает, но задает уточняющий вопрос, действительно ли мы хотим переместиться :)

Код: Выделить всё

#include "..\..\include\homm3.h"

// объекты patcher_x86.
Patcher* _P;
PatcherInstance* _PI;

int __stdcall advancedEarth(LoHook* h, HookContext* c) {
   c->eax = 1000;
   return EXEC_DEFAULT;
}

BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
static _bool_ plugin_On = 0;
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
if (!plugin_On)
{
plugin_On = 1;

_P = GetPatcher();
_PI = _P->CreateInstance("HD.Plugin.TownPortal");



_PI->WriteHexPatch(0x41D534, "20 03");
_PI->WriteHexPatch(0x41D51F, "B0 04");
_PI->WriteHexPatch(0x41D6D1, "90 90 90 90 90 90 90 90 90 90");
_PI->WriteLoHook(0x41D52E, advancedEarth);


}
break;

case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

Последний раз редактировалось Ben80 08 авг 2017, 18:02, всего редактировалось 1 раз.
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1318
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

Re: Как создать плагин для HD мода

Сообщение Ben80 » 08 авг 2017, 16:37

Теперь такой вопрос к Александру, надеюсь он снова мне поможет :)

Нужно сделать Слабость, Забывчивость, Радость, Удачу, Печаль, Неудачу масс. спеллами на любом уровне магии, даже на основном.

Есть и более заковыристая проблема - хотел бы, чтобы заклинание Радость действовало так -
на любом уровне магии +1 к Морали отрядов и вероятность выпадения повторного хода (птички) должна увеличиваться на 25% на осн. уровне, на 50% на продвинутом и на 100% на эксперте.

То есть, например, наш Герой эксперт Лидерства, бойцы имеют по 3 птички. В этом случае эффект заклинания сводится к тому, чтобы вероятность выпадения птички была 25%, а не 12,5%.
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1318
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

Re: Как создать плагин для HD мода

Сообщение Ben80 » 08 авг 2017, 18:06

Пока так и не понял, почему задается этот вопрос "Вы действительно хотите переместиться в ... ?"
Сейчас даже не могу воспроизвести такую ситуацию в оригинальных Героях 3. Может быть даже, это сообщение HD модом обусловлено, но все равно не могу воспроизвести. Не подскажите, в чем тут дело ?
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 09 авг 2017, 13:15

Цитата:
Нужно сделать Слабость, Забывчивость, Радость, Удачу, Печаль, Неудачу масс. спеллами на любом уровне магии, даже на основном.


Код: Выделить всё
int __stdcall massSpell(LoHook* h, HookContext* c)
{
   int spells[] = {45, 49, 50, 51, 52, 61};
   int spellID = c->ebx;
      
   for (int i = 0; i < sizeof(spells) / sizeof(int); ++i)
   {
      if ( spellID == spells[i] )
      {
         c->eax = 0;
         break;
      }
   }
         
   return EXEC_DEFAULT;
}

...

_PI->WriteLoHook(0x59F136, massSpell);

Если нужно также изменить силу заклинания (чтобы эффект был как на Эксперте), то добавьте ещё один хук:

Код: Выделить всё
int __stdcall expertSpell(LoHook* h, HookContext* c)
{
   int spells[] = {45, 49, 50, 51, 52, 61};
   int spellID = *(int*)(c->ebp + 8);
      
   for (int i = 0; i < sizeof(spells) / sizeof(int); ++i)
   {
      if ( spellID == spells[i] )
      {
         *(int*)(c->ebp - 0x44) = 3; // Magic School Level
         break;
      }
   }
         
   return EXEC_DEFAULT;
}

...

_PI->WriteLoHook(0x5A01E5, expertSpell);

Остальное позже гляну.
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1318
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

Re: Как создать плагин для HD мода

Сообщение Ben80 » 09 авг 2017, 18:02

Уточнение для заклинания Радость - увеличение вероятности (+25/50/100%) происходит только если мораль положительна.
Для заклинания Удача планируется такой же принцип действия (+1 к удаче и увеличение вероятности выпадения +25/50/100%).
А потом буду думать, как правильно технически реализовать для Мелодии ее специализацию :smile1:
(собственно, с осознания бесполезности специализации этого Героя и начал продумывать изменение заклинания Удача, далее - Радости, а потом вообще вспомнил, что ряд заклинаний 3-го уровня малость нелеп и надо бы их подтянуть).
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1318
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

Re: Как создать плагин для HD мода

Сообщение Ben80 » 09 авг 2017, 18:48

AlexSpl писал(а):

Если нужно также изменить силу заклинания (чтобы эффект был как на Эксперте), то добавьте ещё один хук:


Силу ряда заклинаний буду подкручивать через SPTRAITS.txt
Вернуться к началу

Пред.След.

Вернуться в Общий раздел

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7