AlexSpl писал(а):
Тогда за вами алгоритм выбора цели для площадных заклов, а за мной - для всех остальных.
AlexSpl писал(а):
Вот грамотная реализация этой функции, пожалуй, и будет самой сложной задачей в этом плагине.
Объявления |
---|
Друзья, если не получается зарегистрироваться, напишите на почту vdv_forever@bk.ru. Я оторву свою задницу от всех дел и обязательно Вас активирую! Добро пожаловать на геройский форум! |
Re: Как создать плагин для HD модаAlexSpl писал(а): Тогда за вами алгоритм выбора цели для площадных заклов, а за мной - для всех остальных. AlexSpl писал(а): Вот грамотная реализация этой функции, пожалуй, и будет самой сложной задачей в этом плагине. |
|
Re: Как создать плагин для HD модаДа, играли на последней версии по ссылке.
Вот краш лог: https://dropmefiles.com/0uQ1S Вот видео: https://youtu.be/K7Z7xn7_VPI |
Re: Как создать плагин для HD модаПосмотрел. Попытка прочитать потерянное здоровье несуществующего отряда. Ещё бы сейв перед финалкой...
Давайте так попробуем:
Если не поможет, кидайте сейв. Посижу с дебаггером. |
Re: Как создать плагин для HD модаТолько при выборе цели надо бы еще учитывать иммунитеты целевых отрядов к определенным заклам:
Армагеддон: Черные драконы, Золотые драконы, Жар-птицы, Фениксы, Элементали магии, Элементали огня, Элементалей энергии, Ифриты, Султаны Ифритов. Метеоритный дождь: Черные драконы, Золотые драконы, Элементали магии, Элементали воздуха, Элементалей шторма. Инферно: Черные драконы, Золотые драконы, Элементали магии, Жар-птицы, Фениксы, Элементали огня, Элементалей энергии, Ифриты, Султаны Ифритов. Берсерк: Черные драконы, Золотые драконы, Элементали магии, Каменные, Железные, Золотые, Алмазные големы, ВСЯ НЕЖИТЬ (+ нейтралы Мумии), ВСЕ ЭЛЕМЕНТАЛИ (+ Жар-птицы и Фениксы, но без Пикси/Фей), все боевые машины. Огненный шар: Черные драконы, Золотые драконы, Лазурные драконы, Красные драконы, Зеленые драконы, Элементали магии, Жар-птицы, Фениксы, Элементали огня, Элементали энергии, Ифриты, Султаны ифритов. Кольцо холода: Черные драконы, Золотые драконы, Лазурные драконы, Красные драконы, Зеленые драконы, Элементали магии, Элементали воды, Элементали льда. То есть сравнение при выборе оптимального варианта для атаки рационально делать уже после проверки на иммунитет всех существ, которые попадают в область атаки и исключения из нее отрядов, которых данный закл не заденет. |
Re: Как создать плагин для HD модаAlexSpl писал(а): Кстати, есть ещё такое поле у _BattleStack_: int active_spells_power[81]. Попробуйте через него тоже. Можно сравнить результаты потом. Мне кажется, так даже быстрее: stack->active_spells_power[SPL_ANTI_MAGIC]. Стоп. Вам же уровень развития школы магии нужен Тогда только через CALL(). Или всё-таки можно? Длительность у нас в active_spell_duration, поэтому в active_spells_power должен быть уровень школы или величина от него зависящая. Потестируйте как-нибудь. Да, можно. Все верно, в stack->active_spells_power[spell] у нас уровень развития школы магии. Работает аналогично CALL_3(int, __thiscall, 0x4E52F0, o_BattleMgr->hero[stack->side], SPL_ANTI_MAGIC, o_BattleMgr->spec_terr_type). Посколько он проще и понятней, то его и оставил. Такс, ну что ж, пока вы работали над анимацией, звуком и площадными заклами я не теряя времени работал над самым важным и в то же время самым слабым местом нашего плагина - алгоритмом выбора целей при масскасте. Заодно допилил и функцию выбора цели для одиночных заклов. Теперь выбор цели максимально гибкий и максимально эффективный, насколько это возможно в принципе. Чтобы не дублировать код проверки в dataInit() и newTarget(), была написана еще одна функция самой проверки checkingTheSelectedTarget(). Она проверяет иммунитеты всех монстров к магии или определенным заклам. Если не исключать из цели существ у которых есть иммунитет к определенным заклинаниям, то эффективность Magic Mirror существенно падает. Допустим, если отразило массовую Печаль два вражеских отряда, а у нас Титаны, Наги и Джинны, то получается, что первое отражение примет на себя Титан, но поскольку у него иммунитет, то этот закл на него попросту не наложится. В итоге мы потеряем одно отражение, второе пойдет на Наг, а Джинны останутся без наложения. Функция checkingTheSelectedTarget учитывает все абилки существ и в данном случае исключит Титинов из списка целей и направит закл на Наг и Джиннов. Также реализована проверка наложенной Антимагии. Если уровень направляемого закла выше чем тот уровень, который может отразить существо с наложенной Антимагией (проверяется уровень), то мы ложим этого монстра в массив целей, иначе - игнорим его. Для Забывчивости проверется еще может ли проверяемое существо стрелять и неравно ли кол-во оставшихся выстрелов нулю. По алгоритму идея следующая: Заводим два глобальных двойных интовых массива, вернее два вектора pair - combatPowerOfStacks и combatPowerOfStacksIsSpell. Если отряд прошел проверку через checkingTheSelectedTarget() для цели, то проверяем есть ли направляемый закл на этом отряде (через active_spell_duration), если нет, то вычисляем и ложим в массив combatPowerOfStacks[count].first боевую мощь этого отряда, а в combatPowerOfStacks[count].second его индекс. Иначе, если на текущий отряд уже наложен направляемый закл, то кладем силу этого отряда в массив combatPowerOfStacksIsSpell[countIsSpell].first, а его индекс в combatPowerOfStacksIsSpell[countIsSpell].second. Чтобы не было сюрпризов после сортировки ресайзим оба массива по кол-ву элементов, которые в них зашли (count и countIsSpell). После сортим оба массива по убыванию силы отрядов с сохранением индексов. Далее проходимся по второму массиву с отрядами на которых уже имеется направляемый закл и переприсваиваем combatPowerOfStacksIsSpell[i].first вместо силы отрядов длительность в кол-ве раундов по направляемому заклу, при этом индексы не трогаем. После чего сортим полученный массив по убыванию оставшихся раундов действия наложенного закла. Здесь правильней было бы сортить именно в порядке возрастания кол-ва раундов. Но чтобы не писать еще один компаратор я использовал уже имеющийся, при этом в основной массив все попадет в нужном порядке. И, наконец, объединяем оба массива, вернее кладет второй в первый с конца, чтобы массив с отрядами с наложенными заклами шел после массива отрядов без заклов в порядке возрастания оставшихся раундов. Подобный алгоритм выбора цели дает нам ряд преимуществ. Сразу же исключаються те отряды, у которых иммунитет к этому заклу и отряды с Антимагией уровень которой позволяет блокировать этот закл. То есть мы работаем исключительно с теми отрядами на которые данный закл наложится в любом случае. Если направляемый закл уже наложен на часть более сильных отрядов, то в приоритете будут те отряды на которые направляемый спелл еще не был наложен. Если таковых нет, то есть остались только иммуные монстры и монстры на которых уже наложен направляемый спелл, то в приоритете будут уже не самые сильные отряды, а отряды с найменшим кол-вом оставшихся раундов действия заклинания. При этом если два или более отряда имееют одинаковое кол-во оставшихся раундов действия заклинания, то здесь уже приоритет будет отдаваться более сильным отрядам. Надо бы в наш плагин добавить следующие функции: 1) Хук для изменения оригинального описания на то, что делает плагин. Плюс вероятность отражения. 50% для всех отрядов на Эксперте, это именно то, что нужно. Если будет больше, будет не интересно, большинство игроков просто не будут рисковать, а будут снимать его диспелом. А так 50 на 50, очень интересно будет на Эксперте, будут рисковать. А вдруг пройдет на нужные отряды (а вдруг нет?).
2) Хайхук, который делает Magic Mirror на Эксперте массовым спеллом как для человека, так и для AI.
3) Доработанная функция выбора цели для отраженного одиночного заклинания.
4) Ну и самое главное - функция выбора целей при масскасте (dataInit) с функцией проверки отряда (checkingTheSelectedTarget) с обновленной функцией получения стека для перенаправления (getEnemyStackToRedirectTo) и компаратором (my_cmp).
AlexSpl, добавьте, пожалуйста, вышеописанные функции в Ваш код и опубликуйте получившийся код для тестов. Заодно и потестируете их в работе. Если у Вас будет желание, то функции выбора целей (dataInit и newTarget) и функцию проверки (checkingTheSelectedTarget) Вы можете переписать более аккуратно. Но сам алогритм выбора цели лучше кардинально не менять. По-моему, он сейчас найболее оптимален. Так будет удобней тестировать. А то мне каждый раз приходится отслежить ваши измнения/оптимизации кода и каждый раз копипастить из своего кода в ваш свои функции. В любом случае их придеться добавлять, так что пускай будет все в одном. Последний раз редактировалось Rolex 24 мар 2021, 17:46, всего редактировалось 4 раз(а).
|
Re: Как создать плагин для HD модаNew Magic Mirror (AlexSpl, Rolex)
версия для тестирования
|
Re: Как создать плагин для HD мода
При сборке кода в VS2015 проблема с reflectSpell в участке кода выше: Цитата: используется потенциально неинициализированная локальная переменная-указатель "hero" |
Re: Как создать плагин для HD модаЭто потому что вся инициализация "зашита" в тело условий. Можете до условий прописать stack = 0;
|
Re: Как создать плагин для HD модаДа. Как и без _CRT_SECURE_NO_WARNINGS. В новых версиях гайки позакручивали
|
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2