Объявления

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

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

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

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

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

Уже первый баг нашел. Площадное отразилось на отряд, которого уже нет в живых. :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 » 23 мар 2021, 15:13

Так и должно быть. Оно отражается на стек с индексом 0, жив он или нет. Можете свою написать функцию. Там несложно. Умеем получать отряд по номеру гекса? Да. Знаем, как найти гексы вокруг заданного? Да. Остаётся проход по всему полю и поиск гекса с максимальным кол-вом отрядов, попадающих в заданный радиус (условие можно любое проверять).
Вернуться к началу

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 » 23 мар 2021, 15:43

Ещё потестируйте Death Ripple. Наверняка заметили, что код для Destroy Undead отличается. Там очень важно сохранить edi. А вообще, интересно, как два таких похожих заклинания могут так отличаться в реализации. Дело даже не в компиляторе. Реально их писали по-разному.
Вернуться к началу

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

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

Сообщение Rolex » 23 мар 2021, 15:50

Да, увидел, что Вы еще своего алгоритма не писали. Пока просто затычка. Все осталось, как в сообщении:
AlexSpl писал(а):

* * *
Добавил тривиальное отражение AoE: на стек противника с индексом 0. Как бы скелет плагина готов. Осталось написать грамотные алгоритмы выбора цели (в том числе, эпицентра отражённого AoE закла*), оптимизировать код и исправить возможные баги :smile11:

* Здесь Вам всего лишь нужно выбрать гекс-эпицентр отражённого заклинания и передать его вот сюда:

Код: Выделить всё
CALL_5(void, __thiscall, h->GetDefaultFunc(), battleMgr, o_BattleMgr->stack[o_BattleMgr->current_side][0].hex_ix, spell, a3, a4);


Поле имеет размер 17 x 11 гексов. 0-я и 16-я вертикали - для боевых машин. Нужно написать функцию, которая будет проходить по всем гексам поля, и вычислять кол-во вражеских отрядов в нужном радиусе от текущего гекса.

Я попробую поиграться. Не знаю только, что у меня получится и насколько это будет эффективно. Для начала нужно разобраться с
Код: Выделить всё
CALL_5(void, __thiscall, h->GetDefaultFunc(), battleMgr, o_BattleMgr->stack[o_BattleMgr->current_side][0].hex_ix, spell, a3, a4);

В o_BattleMgr->stack[o_BattleMgr->current_side][0].hex_ix если я изменяю [0].hex_ix на любое другое ([1].hex_ix, [2].hex_ix, [3].hex_ix) анимация проигрывается уже на стеке с указанным индексом. А как сделать так, чтобы анимация проигралась, например, посредине поля боя? То есть чтобы мы не были привязаны к отрядам, а шли по гексам и проверяли именно на гексах отряды, а не по отрядам, как сейчас. И что это за a3, a4 - это координаты гекса или что? Вижу они передаються в функцию areaReflection, но где они вычисляються? При этом если у обеих сторон стоит Зеркало, то может быть так, что после отражения на вражеский стек, сам вражеский стек его также отразит, правда уже в никуда.

AlexSpl писал(а):

Реально их писали по-разному.

Видимо разные программисты писали. :smile1:

UPD: Попытался вызывать CALL_5(void, __thiscall, h->GetDefaultFunc(), battleMgr, 165, spell, a3, a4); вместо привяки к отряду указываю номер гекса. Гексы как я понял нумеруються слева на право и сверху вниз. Так вот, если мы задает номер гекса по первой горизонтале, то все ок. На том гексе и будет эпицентр закла (от 1 до 15). А вот при движении вниз уже идет какой-то сдвиг. Всего гексов 165 (15 * 11), указываю 38-й, анимация проигрывается на 34-м, указываю последний 165, а анимация проигрывается на 147. С чем это связано? :smile5:

AlexSpl писал(а):

Умеем получать отряд по номеру гекса? Да.

Нет.

o_BattleMgr->stack[o_BattleMgr->current_side][0].creature_id - айди стека с индексом 0
o_BattleMgr->stack[o_BattleMgr->current_side][0].hex_ix - позиция стека на поле боя с индексом 0, то есть номер гекса на котором он находится

Как мне из o_BattleMgr->stack[o_BattleMgr->current_side][0].hex_ix получить o_BattleMgr->stack[o_BattleMgr->current_side][0].creature_id ?

AlexSpl писал(а):

Знаем, как найти гексы вокруг заданного? Да.

Я бы получал так:
Код: Выделить всё
int hexNumber = o_BattleMgr->stack[o_BattleMgr->current_side][0].hex_ix;

hexNumber - 15 / hexNumber - 16 - сверху
hexNumber + 14 / hexNumber + 15 - снизу
hexNumber - 1 / hexNumber + 1 - по бокам


Но не уверен, может быть есть более простой метод.
Вернуться к началу

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 » 23 мар 2021, 18:36

Цитата:
Гексы как я понял нумеруються слева на право и сверху вниз. Так вот, если мы задает номер гекса по первой горизонтале, то все ок. На том гексе и будет эпицентр закла (от 1 до 15). А вот при движении вниз уже идет какой-то сдвиг. Всего гексов 165 (15 * 11), указываю 38-й, анимация проигрывается на 34-м, указываю последний 165, а анимация проигрывается на 147. С чем это связано?

Я уже писал, что поле - 17 x 11, и это связано с вертикалями для боевых машин.

Получить _BattleStack_* по _BattleHex_ можно так: o_BattleMgr->hex[hex_id].GetCreature();
Вернуться к началу

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

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

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

А есть ли еще какой-то метод получения соседствущих гексов вокруг заданного, кроме того, что я написал?
Вернуться к началу

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

Точно есть. Игра же как-то считает. Но и самому написать не большая проблема. Плюс я не уверен, что есть "чистая" функция проверки в игре.
Вернуться к началу

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

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

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

Ну что ж буду пробовать писать.
Вернуться к началу

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

Там Ваши же алгоритмы, только с проходом по всему полю :smile2: Плюс функция удобно встраивается в качестве аргумента. Т.е. все вычисления в dataInit(), а в качестве аргумента - гекс, который возвращает Ваша функция. И всё, плагин готов (в том числе, к отлову неожиданных багов).

Хотя не совсем в dataInit(). Мы же дамаг нанесли. Можно вычислять прямо перед вызовом каста отражённого заклинания, чтобы состояние битвы оставалось актуальным.
Вернуться к началу

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

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

Сообщение Rolex » 23 мар 2021, 19:15

И еще вопрос, а есть ли какой-то булевый метод проверки, чтобы проверить отряд ли это кастуемого героя или отряд врага?
Вернуться к началу

Пред.След.

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

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

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