Объявления
Поздравляем
Roman2211


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

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

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineRolex  
имя: Alex
Ветеран
Ветеран
 
Сообщения: 898
Зарегистрирован: 22 сен 2020, 18:58
Откуда: УКРАИНА
Пол: Мужчина
Поблагодарили: 53 раз.

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

Сообщение Rolex » 10 мар 2021, 16:18

Интересно, не знал. Значит тогда остается только один вариант - поднять вероятность отражения с 20% / 30% / 40% до 40% / 50% / 50% и сделать его массовым на Экспертном уровне. Ну и реализовать то, что я описал - отражение на самые сильные отряды противника. Только так мы сможем его хорошенько усилить.
Вернуться к началу

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 » 10 мар 2021, 16:52

Цитата:
Должна быть формула по которой можно рассчитать силу существа исходя из его базовых навыков Атаки и Защиты, Урона (если min != max, то берем (float)(min + max / 2)) и его Здоровья, если ее нет, то, думаю, ее можно вывести. После того, как мы получаем силу монстра, мы умножает ее на кол-во существ в отряде, тем самым получаем некий коэф., который будет обозначать силу отряда.

В структуре _CreatureInfo_ есть поле fight_value (o_pCreatureInfo[creature_id].fight_value), опираясь на значение которого AI оценивает эффективность/боевую мощь отрядов. Можно, например, его использовать вместо своего кастомного. Есть ещё одна характеристика силы отряда: AI_value, но она используется, насколько мне известно, на карте приключений.

Цитата:
Anything above 50% reflect essentially results in AI never casting offensive spells against that unit

Исправляя любое заклинание, нужно также вносить изменения в алгоритмы AI, а там дебри :smile2:

Ещё появляются вопросы, как поступать с иммунитетом существ. Если самый сильный отряд противника - Чёрные драконы, то что делать с отражённой в них Магической стрелой? И т.п. Короче, код не очень простой, а эффективность заклинания всё равно остаётся под сомнением.
Вернуться к началу

offlineRolex  
имя: Alex
Ветеран
Ветеран
 
Сообщения: 898
Зарегистрирован: 22 сен 2020, 18:58
Откуда: УКРАИНА
Пол: Мужчина
Поблагодарили: 53 раз.

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

Сообщение Rolex » 10 мар 2021, 17:32

AlexSpl писал(а):

Исправляя любое заклинание, нужно также вносить изменения в алгоритмы AI, а там дебри :smile2:

Ну это если мы поднимем вероятность выше 50%, то тогда придется править алгоритмы AI, а если вероятность в пределах 50%, то получается AI будет кастовать и сможет получить ответку отражением.

AlexSpl писал(а):

Если самый сильный отряд противника - Чёрные драконы, то что делать с отражённой в них Магической стрелой?

Ну сейчас абилка срабатывает как обычно с тем кодом, который я опубликовал. То есть нам ничего ненужно в данном случае делать. Получается заклинание отражается от отряда под Зеркалом и если это заклинание направляется на существо с иммунитетом от него (хоть Черный дракон), то тут же срабывает его иммунитет (анимация Щита - сопротивление к магии). Ведь случайно выбранный отряд точно также может быть Черным драконом.

Другой вопрос, что польза тогда от этого заклинания действительно будет сомнительна, если всегда все будет падать на Черного дракона, а он все будет блокировать. Кстати, Черный дракон такой не единственный, есть еще Элементали магии, у них также полный иммунитет к магии. Вот эти два существа (Черные драконы и Элементали магии) мы можем добавить в исключение, то есть если кто-то из них оказывается самым сильным в армии противника, то вместо них мы берем второй по силе отряд (если он есть).

Еще можно подумать над Золотыми драконами у которых иммунитет к магии 1-4 уровня, а также Лазурными, Красными и Зелеными драконами у которых иммунунитет к магии 1-3 уровня. Например, если уровень направляемоего заклинания выше чем тот, который они могут блокировать, то оставляем их в качестве цели, иначе - берем второй по силе отряд (если он есть).

И еще, наверное, придется проверять выбранную цель на наложенные заклинания, и если на цель наложена Антимагия такого уровня, которая отразит направляемое заклинание, то выбирать опять же следующий по силе отряд (если он есть).

Но основная фишка, как я писал на предыдущей странице, - это массовое отражение. То есть враг колдует массовое Замедление на отряды героя, а в итоге замедляет все свои отряды. 50% уже неплохо, если каждый отряд под Зеркалом. Ну а если подправить немного AI, думаю, можно добится того, чтобы AI колдовал даже тогда, когда вероятность отражения выше 50%.
Последний раз редактировалось Rolex 11 мар 2021, 17:04, всего редактировалось 2 раз(а).
Вернуться к началу

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 » 11 мар 2021, 13:08

Переназначить цель Вы можете здесь: 0x5A05CC. Пропишите в eax тот отряд, на который хотите перенаправить магию (см. структуру _BattleStack_ и как достать её из _BattleMgr_). Проверить заклинания, которые висят на отряде, можно через тот же _BattleStack_. ID заклинания в *(int*)(c->ebp + 8). Можете хук чуть ниже поставить (0x5A05CF), тогда ID заклинания будет в ecx. Я предпочитаю первый вариант: когда хук затирает целое число команд, но это на любителя.

То есть. У Вас есть всё необходимое, чтобы перенаправить заклинание на другой отряд. Попробуйте для начала самостоятельно реализовать перенаправление для одного стека. А потом, может быть, разберёмся и с массовым.

Цитата:
Все что я мог лично сделать - уже сделал (код выше).

Не всё :smile2: Я нашёл для Вас место хука, в котором все структуры* для работы Вашего алгоритма доступны. Пробуйте. Уверен, лучше один раз понять, как всё работает, самому. Да и нет ничего сложного в случае отражения на один стек.

* OK. Кое-что, требующееся для решения задачи, Вам неизвестно, но я предлагаю хотя бы понять, что именно Вам неизвестно :smile4:
Вернуться к началу

offlineRolex  
имя: Alex
Ветеран
Ветеран
 
Сообщения: 898
Зарегистрирован: 22 сен 2020, 18:58
Откуда: УКРАИНА
Пол: Мужчина
Поблагодарили: 53 раз.

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

Сообщение Rolex » 11 мар 2021, 16:14

Код: Выделить всё
int __stdcall NewTarget(LoHook* h, HookContext* c)
{   
   c->eax = *(int*)&o_BattleMgr->stack[o_BattleMgr->current_side][CID_ARCHANGEL];
   return NO_EXEC_DEFAULT;
}
...
_PI->WriteLoHook(0x5A05CC, NewTarget);


В общем попытался я для начала на свой заданный отряд отразить (Архангелы), но что-то пошло не так. Короче поломал я Волшебное зеркало вашим хуком. Проигрывается анимация Зеркала, а после заклинание не отражается на отряд кастуещего, а направляется на этот же целевой отряд, либо вообще вылетает (тестил в мультиплеере - Hotseat). :smile1:
Вернуться к началу

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 » 11 мар 2021, 19:45

Второй индекс - это не CID, а порядковый номер отряда героя. Пройдитесь по всем отрядам, узнайте кто есть кто и перенаправляйте заклинание на отряд с нужным Вам индексом. Заодно в цикле сможете посчитать силу отрядов и выбрать самый сильный. Далее, здесь мы не пропускаем оригинальный код, поэтому возвращаем EXEC_DEFAULT.
Вернуться к началу

offlineRolex  
имя: Alex
Ветеран
Ветеран
 
Сообщения: 898
Зарегистрирован: 22 сен 2020, 18:58
Откуда: УКРАИНА
Пол: Мужчина
Поблагодарили: 53 раз.

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

Сообщение Rolex » 12 мар 2021, 07:30

Код: Выделить всё
int __stdcall NewTarget(LoHook* h, HookContext* c)
{   
   int max = 0;
   int pos = 0;
   for (int i = 0; i < o_BattleMgr->stacks_count[o_BattleMgr->current_side]; ++i)
   if (o_pCreatureInfo[i].fight_value > max)
   { //   _BattleStack_* stack = &o_BattleMgr->stack[o_BattleMgr->current_side][i];
         max = o_pCreatureInfo[i].fight_value;      
         pos = i;
   }   
   *(int*)c->eax = pos;
   return EXEC_DEFAULT;
}


Все равно что-то не то, выбирает отряд случайным образом. Даже если в eax записывать всегда один фиксированный порядковый номер отряда героя, то выбирается случайный.
Вернуться к началу

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 » 12 мар 2021, 08:33

В eax не индекс отряда писать нужно, а указатель на его структуру _BattleStack_. Первый раз Вы почти правильно сделали.
Вернуться к началу

offlineRolex  
имя: Alex
Ветеран
Ветеран
 
Сообщения: 898
Зарегистрирован: 22 сен 2020, 18:58
Откуда: УКРАИНА
Пол: Мужчина
Поблагодарили: 53 раз.

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

Сообщение Rolex » 12 мар 2021, 11:20

Вот так вроде работает:
Код: Выделить всё
int __stdcall NewTarget(LoHook* h, HookContext* c)
{
   int max = 0;
   int pos = 0;
   for (int i = 0; i < o_BattleMgr->stacks_count[o_BattleMgr->current_side]; ++i)
   if (o_pCreatureInfo[i].fight_value > max)
   {
         max = o_pCreatureInfo[i].fight_value;     
         pos = i;
   }
   *(_BattleStack_*)c->eax = o_BattleMgr->stack[o_BattleMgr->current_side][pos];
   return EXEC_DEFAULT;
}

Но вылазит куча проблем. Отряд на который отражается заклинание клонируется и заклинание получается накладывается именно на клон. Вернее оно накладывается на нужный отряд, но здоровье отнимается у клона, который появляется рядом, а исходный отряд остается не тронутым. А после того, как очередь хода доходит до нашего отряда на который было отражено заклинание, порядок хода замирает и не переходит на следующий отряд, то есть тупо всегда ходит один этот отряд и ничего не поделать, даже пропуск его хода не помогает.

При этом еще и o_pCreatureInfo[i].fight_value как-то непонятно работает. Он определил самым сильным отрядом - Магических элементалей, когда в армии героя есть Лазурные драконы, Черные драконы и Архангелы.
Вернуться к началу

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 » 12 мар 2021, 12:32

Цитата:
Но вылазит куча проблем.

См. как определён stack в _BattleMgr_ (какой у него тип). Вы же должны поместить в eax указатель на stack.

Цитата:
При этом еще и o_pCreatureInfo[i].fight_value как-то непонятно работает. Он определил самым сильным отрядом - Магических элементалей, когда в армии героя есть Лазурные драконы, Черные драконы и Архангелы.

Индекс у o_pCreatureInfo - CID, а не позиция. К тому же, Вы забываете умножать Fight Value на кол-во существ в стеке.
Вернуться к началу

Пред.След.

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

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

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

cron