Объявления

Форум о Героях Меча и Магии и King's Bounty. Если Вы любите эти игры, мы будем рады видеть Вас в наших рядах. :smile2:
Для активации Вашей учетной записи необходимо написать письмо на почтовый ящик dumai-spb@mail.ru или vdv_forever@bk.ru с указанием зарегистрированного Вами ника

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

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineBen80
Мастер
Мастер
 
Сообщения: 453
Зарегистрирован: 18 июн 2017, 06:49
Поблагодарили: 74 раз.

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

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

AlexSpl писал(а):

Менять константу не самое удачное решение, т.к., во-первых, она может использоваться (и используется) другими функциями, а во-вторых, может понадобиться сделать разные бонусы для разных существ.

Цитата:
например, +3/+2/+1 к Каменной коже в зависимости от уровня существа или 50% к Магической стреле у Циэль

Полагаю, нужно добавить соответствующие хуки в ту же функцию (sub_4E6260). Могу помочь с конкретными изменениями.


Думаю сделать для Каменной кожи бонус+3, для Жажды крови и Точности бонус +4 не зависимо от уровня существа.
Вернуться к началу

offlineBen80
Мастер
Мастер
 
Сообщения: 453
Зарегистрирован: 18 июн 2017, 06:49
Поблагодарили: 74 раз.

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

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

AlexSpl писал(а):

Цитата:
Атака = Атака(базовая) * (1+ N/n * 0.05)

Здесь деление целочисленное. Т.е. правильно Атака = ceil(Атака(базовая) * (1+ [N/n] * 0.05))


А можно его заставить делать ceil(N/n) вместо floor(N/n) ?
С помощью WriteHexPatch, например.
Вернуться к началу

offlineАватара пользователя
AlexSpl
Эксперт
Эксперт
 
Сообщения: 3001
Зарегистрирован: 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)
Поблагодарили: 1363 раз.

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

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

Цитата:
Думаю сделать для Каменной кожи бонус+3, для Жажды крови и Точности бонус +4 не зависимо от уровня существа.

Например, так (LoHook на 4E62ACh):

Код: Выделить всё
int __stdcall spellSpecBonus(LoHook* h, HookContext* c)
{
   switch ( *(int*)(c->ebp + 8) ) {
      case 43:
      case 44:
         c->eax = 4;
         break;
      
      case 46:
         c->eax = 3;
         break;
      
      default:
         return EXEC_DEFAULT;
   }
   
   c->return_address = 0x4E62B3;
   return NO_EXEC_DEFAULT;
}


Не тестировал. Так что проверяйте.

Цитата:
А можно его заставить делать ceil(N/n) вместо floor(N/n) ?
С помощью WriteHexPatch, например.

Можно. Но с помощью LoHook (на 4E6526h) будет значительно проще:

Код: Выделить всё
int __stdcall ceilInsteadOfFloor(LoHook* h, HookContext* c) {
   if ( c->edx ) ++c->eax; // если есть остаток от деления, увеличиваем частное на 1
   return EXEC_DEFAULT;
}
Вернуться к началу

offlineBen80
Мастер
Мастер
 
Сообщения: 453
Зарегистрирован: 18 июн 2017, 06:49
Поблагодарили: 74 раз.

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

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

Попробовал плагин Деда Мороза - бонусы к специализациям (2% вместо 5%) - не работает.
И компилировал, и подкладывал уже готовую DLL, скомпилированную не мной, а им.

Такого типа:
*(int*)0x4E3F92 = 0x63AC60; //Necromancy
*(int*)0x4E4F1E = 0x63AC60; //Logistic
*(int*)0x4E4569 = 0x63AC60; //Attack
*(int*)0x4E45C9 = 0x63AC60; //Defence

У меня тоже не получается никаким способом, кроме такого:
_PI->WriteHexPatch(0x63EAE4, "8F C2 F5 3C");

или такого:
_PI->WriteDword(0x63EAE4, 1022739087);

То есть это правка общей константы, что, как я уже понял, является неприемлемым решением.
Вернуться к началу

offlineАватара пользователя
AlexSpl
Эксперт
Эксперт
 
Сообщения: 3001
Зарегистрирован: 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)
Поблагодарили: 1363 раз.

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

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

Здесь идёт подмена операнда инструкции fmul. Если все адреса верны (я проверил только первый), то правильно будет патчить следующим образом:

Код: Выделить всё
_PI->WriteDword(0x4E3F92, 0x63AC60);
_PI->WriteDword(0x4E4F1E, 0x63AC60);
_PI->WriteDword(0x4E4569, 0x63AC60);
_PI->WriteDword(0x4E45C9, 0x63AC60);
Вернуться к началу

offlineBen80
Мастер
Мастер
 
Сообщения: 453
Зарегистрирован: 18 июн 2017, 06:49
Поблагодарили: 74 раз.

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

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

AlexSpl писал(а):

Здесь идёт подмена операнда инструкции fmul. Если все адреса верны (я проверил только первый), то правильно будет патчить следующим образом:

Код: Выделить всё
_PI->WriteDword(0x4E3F92, 0x63AC60);
_PI->WriteDword(0x4E4F1E, 0x63AC60);
_PI->WriteDword(0x4E4569, 0x63AC60);
_PI->WriteDword(0x4E45C9, 0x63AC60);


Так оно тоже не работает. Вы могли бы проверить не адрес, а результат ?
Для Интеллекта легче всего:
_PI->WriteDword(0x4E4B69, 0x63AC60);

Понимаю, что странно, но не работает.
Не помогает и правка самого экзешника (жесткая замена адреса на 0x63AC60).

Предположить пока могу только одно - что не только в этой инструкции дело - fmul ds:IntellSecScSpecMult

Там же еще есть fmul [ebp+var_4], fstp [ebp+var_4] и прочие.
Может, в этом дело ?

Это ведь тоже должно работать (написано же правильно), но не работает -
*(int*)0x4E3F92 = 0x63AC60; //Necromancy
*(int*)0x4E4F1E = 0x63AC60; //Logistic
*(int*)0x4E4569 = 0x63AC60; //Attack
*(int*)0x4E45C9 = 0x63AC60; //Defence
Вернуться к началу

offlineBen80
Мастер
Мастер
 
Сообщения: 453
Зарегистрирован: 18 июн 2017, 06:49
Поблагодарили: 74 раз.

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

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

Могу предоставить h3m файл для тестирования.
Вернуться к началу

offlineАватара пользователя
AlexSpl
Эксперт
Эксперт
 
Сообщения: 3001
Зарегистрирован: 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)
Поблагодарили: 1363 раз.

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

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

А как проверяете? Считает множитель для Интеллекта ведь верно: 1 + k * (1 + 0.02 * N).

Цитата:
*(int*)0x4E3F92 = 0x63AC60; //Necromancy
*(int*)0x4E4F1E = 0x63AC60; //Logistic
*(int*)0x4E4569 = 0x63AC60; //Attack
*(int*)0x4E45C9 = 0x63AC60; //Defence

Так работать точно не будет. В данном случае это не адреса процесса.
Вернуться к началу

offlineBen80
Мастер
Мастер
 
Сообщения: 453
Зарегистрирован: 18 июн 2017, 06:49
Поблагодарили: 74 раз.

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

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

AlexSpl писал(а):

А как проверяете? Считает множитель для Интеллекта ведь верно: 1 + k * (1 + 0.02 * N).

Цитата:
*(int*)0x4E3F92 = 0x63AC60; //Necromancy
*(int*)0x4E4F1E = 0x63AC60; //Logistic
*(int*)0x4E4569 = 0x63AC60; //Attack
*(int*)0x4E45C9 = 0x63AC60; //Defence

Так работать точно не будет. В данном случае это не адреса процесса.


Проверяю - смотрю макс. кол-во манны у Эллешара.
Сравниваю для 2 случаев - с плагином и без плагина.
И просто считаю по формуле, да - добавка манны = X* k * (1 + 0.02 * N)
где k = 1 (поскольку прокачиваю героя до эксперта Интеллекта)
X - обычное макс значение манны
Вернуться к началу

offlineBen80
Мастер
Мастер
 
Сообщения: 453
Зарегистрирован: 18 июн 2017, 06:49
Поблагодарили: 74 раз.

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

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

Также тестировал логистику у Гуннара (занимает чуть больше времени :smile1: )
Вернуться к началу

Пред.След.

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

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

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