void Battle::NecromancySkillAction(HeroBase & hero, u32 killed, bool local) { Army & army = hero.GetArmy(); if(0 == killed || (army.isFullHouse() && !army.HasMonster(Monster::SKELETON))) return; // check necromancy shrine build u16 percent = 10 * world.GetKingdom(army.GetColor()).GetCountNecromancyShrineBuild(); // check artifact u8 acount = hero.HasArtifact(Artifact::SPADE_NECROMANCY); if(acount) percent += acount * 10; // fix over 60% if(percent > 60) percent = 60; percent += hero.GetSecondaryValues(Skill::Secondary::NECROMANCY); // hard fix overflow if(percent > 90) percent = 90; const Monster mons(Monster::SKELETON); const u32 count = Monster::GetCountFromHitPoints(Monster::SKELETON, mons.GetHitPoints() * killed * percent / 100); army.JoinTroop(mons, count); if(local) { std::string msg = _("Practicing the dark arts of necromancy, you are able to raise %{count} of the enemy's dead to return under your service as %{monster}"); String::Replace(msg, "%{count}", count); String::Replace(msg, "%{monster}", mons.GetMultiName()); Surface sf1(40, 45); const Sprite & sf2 = AGG::GetICN(ICN::MONS32, mons.GetSpriteIndex()); sf2.Blit((sf1.w() - sf2.w()) / 2, 0, sf1); Text text(GetString(count), Font::SMALL); text.Blit((sf1.w() - text.w()) / 2, sf2.h() + 3, sf1); Game::PlayPickupSound(); Dialog::SpriteInfo("", msg, sf1); } DEBUG(DBG_BATTLE, DBG_TRACE, "raise: " << count << mons.GetMultiName()); }
void AI::HeroesPreBattle(HeroBase & hero) { Castle* castle = world.GetCastle(hero.GetCenter()); if(castle && hero.GetType() != HeroBase::CAPTAIN) hero.GetArmy().JoinTroops(castle->GetArmy()); }
void AI::HeroesPreBattle(HeroBase & hero) { Castle* castle = world.GetCastle(hero.GetIndex()); if(castle && hero.GetType() != Skill::Primary::CAPTAIN) hero.GetArmy().JoinTroops(castle->GetArmy()); }