1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-24 22:14:36 +02:00

* [previous commit adds support for golden bow too]

* support for ammo cart
* partially written support for orb of vulnerability
This commit is contained in:
mateuszb 2010-05-20 10:54:24 +00:00
parent 4b03206b8a
commit f36918eb7e
2 changed files with 43 additions and 6 deletions

View File

@ -770,8 +770,25 @@ DLL_EXPORT void BattleAttack::applyGs( CGameState *gs )
CStack *attacker = gs->curB->getStack(stackAttacking);
if(counter())
attacker->counterAttacks--;
if(shot())
{
//don't remove ammo if we have a working ammo cart
bool hasAmmoCart = false;
BOOST_FOREACH(const CStack * st, gs->curB->stacks)
{
if(st->owner == attacker->owner && st->type->idNumber == 148 && st->alive())
{
hasAmmoCart = true;
break;
}
}
if (!hasAmmoCart)
{
attacker->shots--;
}
}
BOOST_FOREACH(BattleStackAttacked stackAttacked, bsa)
stackAttacked.applyGs(gs);

View File

@ -3585,6 +3585,24 @@ static std::vector<ui32> calculateResistedStacks(const CSpell * sp, const CGHero
{
std::vector<ui32> ret;
for(std::set<CStack*>::const_iterator it = affectedCreatures.begin(); it != affectedCreatures.end(); ++it)
{
if (caster->hasBonusOfType(Bonus::NEGATE_ALL_NATURAL_IMMUNITIES) ||
hero2->hasBonusOfType(Bonus::NEGATE_ALL_NATURAL_IMMUNITIES))
{
//Here we need "source different than" selector
// BonusList bl = (*it)->getBonuses(Selector::sourceNotType(Bonus::CREATURE_ABILITY));
//
// BOOST_FOREACH(Bonus bb, bl)
// {
// if(bb.type == Bonus::SPELL_IMMUNITY && bb.subtype == sp->id || //100% sure spell immunity
// bb.type == Bonus::LEVEL_SPELL_IMMUNITY && bb.val >= sp->level) //some creature abilities have level 0
// {
// ret.push_back((*it)->ID);
// continue;
// }
// }
}
else
{
if ((*it)->hasBonusOfType(Bonus::SPELL_IMMUNITY, sp->id) //100% sure spell immunity
|| ( (*it)->hasBonusOfType(Bonus::LEVEL_SPELL_IMMUNITY) &&
@ -3593,6 +3611,8 @@ static std::vector<ui32> calculateResistedStacks(const CSpell * sp, const CGHero
ret.push_back((*it)->ID);
continue;
}
}
//non-negative spells on friendly stacks should always succeed, unless immune
if(sp->positiveness >= 0 && (*it)->owner == caster->tempOwner)