Стал разбираться. Запишу что понял чтобы не забыть
Судя по всему заклинания рисуются в файле /src/fheroes2/battle/battle_interface.cpp
Вот это заклинание Молния
Код
void Battle::Interface::RedrawActionLightningBoltSpell(Unit & target)
{
// FIX: LightningBolt draw
RedrawTroopWithFrameAnimation(target, ICN::SPARKS, M82::FromSpell(Spell::LIGHTNINGBOLT), true);
}
void Battle::Interface::RedrawActionChainLightningSpell(const TargetsInfo & targets)
{
// FIX: ChainLightning draw
//AGG::PlaySound(targets.size() > 1 ? M82::CHAINLTE : M82::LIGHTBLT);
for(TargetsInfo::const_iterator
it = targets.begin(); it != targets.end(); ++it)
RedrawTroopWithFrameAnimation(*(it->defender), ICN::SPARKS, M82::FromSpell(Spell::LIGHTNINGBOLT), true);
}
{
// FIX: LightningBolt draw
RedrawTroopWithFrameAnimation(target, ICN::SPARKS, M82::FromSpell(Spell::LIGHTNINGBOLT), true);
}
void Battle::Interface::RedrawActionChainLightningSpell(const TargetsInfo & targets)
{
// FIX: ChainLightning draw
//AGG::PlaySound(targets.size() > 1 ? M82::CHAINLTE : M82::LIGHTBLT);
for(TargetsInfo::const_iterator
it = targets.begin(); it != targets.end(); ++it)
RedrawTroopWithFrameAnimation(*(it->defender), ICN::SPARKS, M82::FromSpell(Spell::LIGHTNINGBOLT), true);
}
А вот это заклинание Ледяной Луч
Код
void Battle::Interface::RedrawActionColdRaySpell(Unit & target)
{
Display & display = Display::Get();
Cursor & cursor = Cursor::Get();
LocalEvent & le = LocalEvent::Get();
const int icn = ICN::COLDRAY;
u32 frame = 0;
Point pt_from, pt_to;
const HeroBase* current_commander = arena.GetCurrentCommander();
if(current_commander == opponent1->GetHero())
{
const Rect & pos1 = opponent1->GetArea();
pt_from = Point(pos1.x + pos1.w, pos1.y + pos1.h / 2);
const Rect & pos2 = target.GetRectPosition();
pt_to = Point(pos2.x, pos2.y);
}
else
{
const Rect & pos = opponent2->GetArea();
pt_from = Point(pos.x, pos.y + pos.h / 2);
const Rect & pos2 = target.GetRectPosition();
pt_to = Point(pos2.x + pos2.w, pos2.y);
}
const u32 dx = std::abs(pt_from.x - pt_to.x);
const u32 dy = std::abs(pt_from.y - pt_to.y);
const u32 step = (dx > dy ? dx / AGG::GetICNCount(icn) : dy / AGG::GetICNCount(icn));
const Points points = GetLinePoints(pt_from, pt_to, step);
Points::const_iterator pnt = points.begin();
cursor.SetThemes(Cursor::WAR_NONE);
AGG::PlaySound(M82::COLDRAY);
while(le.HandleEvents() && frame < AGG::GetICNCount(icn) && pnt != points.end())
{
CheckGlobalEvents(le);
if(Battle::AnimateInfrequentDelay(Game::BATTLE_SPELL_DELAY))
{
cursor.Hide();
const Sprite & sprite = AGG::GetICN(icn, frame);
sprite.Blit((*pnt).x - sprite.w() / 2, (*pnt).y - sprite.h() / 2);
cursor.Show();
display.Flip();
++frame;
++pnt;
}
}
RedrawTroopWithFrameAnimation(target, ICN::ICECLOUD, M82::UNKNOWN, true);
}
{
Display & display = Display::Get();
Cursor & cursor = Cursor::Get();
LocalEvent & le = LocalEvent::Get();
const int icn = ICN::COLDRAY;
u32 frame = 0;
Point pt_from, pt_to;
const HeroBase* current_commander = arena.GetCurrentCommander();
if(current_commander == opponent1->GetHero())
{
const Rect & pos1 = opponent1->GetArea();
pt_from = Point(pos1.x + pos1.w, pos1.y + pos1.h / 2);
const Rect & pos2 = target.GetRectPosition();
pt_to = Point(pos2.x, pos2.y);
}
else
{
const Rect & pos = opponent2->GetArea();
pt_from = Point(pos.x, pos.y + pos.h / 2);
const Rect & pos2 = target.GetRectPosition();
pt_to = Point(pos2.x + pos2.w, pos2.y);
}
const u32 dx = std::abs(pt_from.x - pt_to.x);
const u32 dy = std::abs(pt_from.y - pt_to.y);
const u32 step = (dx > dy ? dx / AGG::GetICNCount(icn) : dy / AGG::GetICNCount(icn));
const Points points = GetLinePoints(pt_from, pt_to, step);
Points::const_iterator pnt = points.begin();
cursor.SetThemes(Cursor::WAR_NONE);
AGG::PlaySound(M82::COLDRAY);
while(le.HandleEvents() && frame < AGG::GetICNCount(icn) && pnt != points.end())
{
CheckGlobalEvents(le);
if(Battle::AnimateInfrequentDelay(Game::BATTLE_SPELL_DELAY))
{
cursor.Hide();
const Sprite & sprite = AGG::GetICN(icn, frame);
sprite.Blit((*pnt).x - sprite.w() / 2, (*pnt).y - sprite.h() / 2);
cursor.Show();
display.Flip();
++frame;
++pnt;
}
}
RedrawTroopWithFrameAnimation(target, ICN::ICECLOUD, M82::UNKNOWN, true);
}
Видно что они совершенно по разному сделаны и в этом причина почему молния выгляди совсем не правильно и
бьет какой то тонкой линией сверху вместо того чтобы бить молнией из посоха Героя как Ледяной Луч.
Думаю надо передалать Молнию так же как Ледяной Луч и тогда она будет бить нормально и из Посоха героя.