AlexSpl писал(а):
Так и сделал, вроде, все работает.
AlexSpl писал(а):
- Код: Выделить всё
return &o_BattleMgr->stack[1 - o_BattleMgr->current_side][combatPowerOfStacks[position++].second];
Должно работать. Да, и не забудьте про контроль индекса массива. Если следующий индекс выходит за границы, возвращайте 0 (соответствует случаю, когда заклинание отражается "в пустоту").
Так не работает. Вот так работает:
- Код: Выделить всё
return &o_BattleMgr->stack[1 - stack->side][combatPowerOfStacks[stackIndex++].second];
То есть вместо o_BattleMgr->current_side вот это: stack->side.
Вот такой код этих двух функций у меня получился:
- Код: Выделить всё
_BattleStack_* getEnemyStackToRedirectTo(_BattleStack_* stack, int spell)
{
if (stackIndex == combatPowerOfStacks.size()) return NULL; else
return &o_BattleMgr->stack[1 - stack->side][combatPowerOfStacks[stackIndex++].second];
}
int __stdcall dataInit(LoHook* h, HookContext* c)
{
showMagicMirrorAnim = false;
showMagicResistAnim = false;
memset(needMagicMirrorAnim, false, 40);
memset(needMagicResistAnim, false, 40);
combatPowerOfStacks.resize(o_BattleMgr->stacks_count[o_BattleMgr->current_side]);
for (int i = 0; i < combatPowerOfStacks.size(); ++i)
{
_BattleStack_* stack = &o_BattleMgr->stack[o_BattleMgr->current_side][i];
combatPowerOfStacks[i].first = o_pCreatureInfo[stack->creature_id].fight_value * stack->count_current;
combatPowerOfStacks[i].second = i;
}
sort(combatPowerOfStacks.begin(), combatPowerOfStacks.end(), my_cmp);
stackIndex = 0;
return EXEC_DEFAULT;
}
Я в своей функции хочу доработать проверку выбора одиночной цели. Но что-то не выходит.
Взял из reflectSpell() это:
- Код: Выделить всё
int spell = *(int*)(c->ebp + 0xC);
int spellPower = *(int*)(c->ebp + 0x14);
int schoolLevel = *(int*)(c->ebp + 0x10);
_Hero_* hero = *(_Hero_**)(c->ebp + 8);
В общем если выбранная цель является Золотым драконом, а уровень отраженного закла в пределах 1-4 уровня, то игнорим Золотых драконов как цель и переходим к следующему по силе отряду (если он есть), иначе (если закл 5-го уровня) оставляем их в качестве цели.
Пытался вот так, но не работает:
- Код: Выделить всё
stack->creature_id == CID_GOLD_DRAGON && schoolLevel <= 3
stack->creature_id == CID_GOLD_DRAGON && o_Spell[spell].level <= 3
По Антимагии, если среди наложенных заклов есть Антимагия, то сравниваем уровень отраженного закла с уровнем Антимагии. Если уровень отраженного закла менее или равен тому уровню, который может блокировать наложенная Антимагия, то игнорим данных монстров как цель и переходим к следующему по силе отряду (если он есть), иначе оставляем их в качестве цели.
Ничего из нижеперечиленного не заработало правильно:
- Код: Выделить всё
stack->active_spell_duration[SPL_ANTI_MAGIC] && schoolLevel <= *(int*)o_Spell[SPL_ANTI_MAGIC].effect + 1
stack->active_spell_duration[SPL_ANTI_MAGIC] && o_Spell[spell].level <= *(int*)o_Spell[SPL_ANTI_MAGIC].effect + 1
stack->active_spell_duration[SPL_ANTI_MAGIC] && o_Spell[spell].level <= hero->spell_level[SPL_ANTI_MAGIC] + 1
Потом эти же проверки мне нужно будет закинуть в dataInit() или getEnemyStackToRedirectTo(). И вот здесь даже и не знаю как лучше поступить, так как здесь цель уже не одна. Придется заводить, наверное, еще один массив/стек. Просто если мы какие-то отряды из-за проверки пропустим, то потом возможно придется к ним вернутся. Например, если те отряды, которые выбирались до этого погибли или изначально других отрядов не было, а те, которые не прошли проверку мы пропустили или на отряде закончилось действие Антимагии. В общем здесь сложнее... Даже и не знаю как здесь сделать нормально.
Без ShouldNotRenderBattle() по окончанию быстрой битвы звук исчезает. Но ShouldNotRenderBattle() не определен. А как это исправить?
**************************************************************************************************************************
Я вот сейчас подумал над отражением площадных спеллов.
Вы писали:
AlexSpl писал(а):
Но таже Антимагия - закл 3-го уровня, игнорит площадные заклы. Так почему же закл 5-го уровня не может их отражать? Да, в оригинале он не отражает, но мы же его усиливаем. Так вот у меня идея такая: а что если не отражать для каждого отряда свой Инферно, например, а сделать наоборот, один Инферно накладывается на то кол-во вражексих отрядов, которые отразили его.
Поясню:
Например, кастуем мы Инферно (или Метеоритный дождь) на 3 вражексих отряда под Зеркалом. 2 из 3 отражает его. Значит для 2 мы проигрываем анимацию Зеркала и игнорим урон, а для 3-го ничего не делаем, он получает урон, так как не отразил его (аналогично отряду без Зеркала).
После чего, исходя из площади, которую может охватить данный закл, мы ищем на поле боя место скопление моих отрядов и разворачиваем его в том месте и таким образом, чтобы он захватил именно то кол-во отрядов, которые отразили его.
Если же развернуть этот площадный закл мы можем на то кол-во отрядов, которые отразили его, несколькими способами, то выбираем такой вариант, где суммарная сила отрядов на которые мы можем развернуть его - максимальная.
Если же мы не можем развернуть его на то кол-во, которое его отразило, тогда просто выбираем максимально возможное на которое можем развернуть.
Понимаю, что реализация подобного алгоритма будет довольно сложной. Но если все же задаться целью и реализовать подобное, то это будет действительно очень круто смотреться. Да и реально полезно будет.