Browse Source

Changed playerToSide return type to signed

AlexVinS 9 years ago
parent
commit
60bd54c9b3

+ 14 - 10
lib/CBattleCallback.cpp

@@ -356,8 +356,8 @@ ESpellCastProblem::ESpellCastProblem CBattleInfoCallback::battleCanCastSpell(con
 		return ESpellCastProblem::INVALID;
 	}
 	const PlayerColor player = caster->getOwner();
-	const ui8 side = playerToSide(player);
-	if((si8)side < 0)
+	const si8 side = playerToSide(player);
+	if(side < 0)
 		return ESpellCastProblem::INVALID;
 	if(!battleDoWeKnowAbout(side))
 	{
@@ -393,7 +393,7 @@ ESpellCastProblem::ESpellCastProblem CBattleInfoCallback::battleCanCastSpell(con
 bool CBattleInfoEssentials::battleCanFlee(PlayerColor player) const
 {
 	RETURN_IF_NOT_BATTLE(false);
-	ui8 mySide = playerToSide(player);
+	const si8 mySide = playerToSide(player);
 	const CGHeroInstance *myHero = battleGetFightingHero(mySide);
 
 	//current player have no hero
@@ -415,7 +415,7 @@ bool CBattleInfoEssentials::battleCanFlee(PlayerColor player) const
 	return true;
 }
 
-ui8 CBattleInfoEssentials::playerToSide(PlayerColor player) const
+si8 CBattleInfoEssentials::playerToSide(PlayerColor player) const
 {
 	RETURN_IF_NOT_BATTLE(-1);
 	int ret = vstd::find_pos_if(getBattle()->sides, [=](const SideInBattle &side){ return side.color == player; });
@@ -428,8 +428,8 @@ ui8 CBattleInfoEssentials::playerToSide(PlayerColor player) const
 bool CBattleInfoEssentials::playerHasAccessToHeroInfo(PlayerColor player, const CGHeroInstance * h) const
 {
 	RETURN_IF_NOT_BATTLE(false);
-	ui8 playerSide = playerToSide(player);
-	if (playerSide != (ui8)-1)
+	const si8 playerSide = playerToSide(player);
+	if (playerSide > 0)
 	{
 		if (getBattle()->sides[!playerSide].hero == h)
 			return true;
@@ -1716,9 +1716,9 @@ ESpellCastProblem::ESpellCastProblem CBattleInfoCallback::battleCanCastThisSpell
 		return ESpellCastProblem::INVALID;
 	}
 	const PlayerColor player = caster->getOwner();
-	const ui8 side = playerToSide(player);
+	const si8 side = playerToSide(player);
 
-	if((si8)side < 0)
+	if(side < 0)
 		return ESpellCastProblem::INVALID;
 
 	if(!battleDoWeKnowAbout(side))
@@ -2005,13 +2005,17 @@ int CBattleInfoCallback::battleGetSurrenderCost(PlayerColor Player) const
 	if(!battleCanSurrender(Player))
 		return -1;
 
+	const si8 playerSide = playerToSide(Player);
+	if(playerSide < 0)
+		return -1;
+
 	int ret = 0;
 	double discount = 0;
-	for(const CStack *s : battleAliveStacks(playerToSide(Player)))
+	for(const CStack *s : battleAliveStacks(playerSide))
 		if(s->base) //we pay for our stack that comes from our army slots - condition eliminates summoned cres and war machines
 			ret += s->getCreature()->cost[Res::GOLD] * s->count;
 
-	if(const CGHeroInstance *h = battleGetFightingHero(playerToSide(Player)))
+	if(const CGHeroInstance *h = battleGetFightingHero(playerSide))
 		discount += h->valOfBonuses(Bonus::SURRENDER_DISCOUNT);
 
 	ret *= (100.0 - discount) / 100.0;

+ 1 - 1
lib/CBattleCallback.h

@@ -189,7 +189,7 @@ public:
 	si8 battleGetTacticsSide() const; //returns which side is in tactics phase, undefined if none (?)
 	bool battleCanFlee(PlayerColor player) const;
 	bool battleCanSurrender(PlayerColor player) const;
-	ui8 playerToSide(PlayerColor player) const;
+	si8 playerToSide(PlayerColor player) const;
 	bool playerHasAccessToHeroInfo(PlayerColor player, const CGHeroInstance * h) const;
 	ui8 battleGetSiegeLevel() const; //returns 0 when there is no siege, 1 if fort, 2 is citadel, 3 is castle
 	bool battleHasHero(ui8 side) const;

+ 9 - 3
lib/spells/BattleSpellMechanics.cpp

@@ -370,7 +370,7 @@ ESpellCastProblem::ESpellCastProblem EarthquakeMechanics::canBeCast(const CBattl
 	if(ti.smart)
 	{
 		//if spell targeting is smart, then only attacker can use it
-		if(cb->playerToSide(caster->getOwner()) != 0)
+		if(cb->playerToSide(caster->getOwner()) != BattleSide::ATTACKER)
 			return ESpellCastProblem::NO_APPROPRIATE_TARGET;
 	}
 
@@ -406,7 +406,9 @@ ESpellCastProblem::ESpellCastProblem HypnotizeMechanics::isImmuneByStack(const I
 ///ObstacleMechanics
 ESpellCastProblem::ESpellCastProblem ObstacleMechanics::canBeCast(const CBattleInfoCallback * cb, const SpellTargetingContext & ctx) const
 {
-	ui8 side = cb->playerToSide(ctx.caster->getOwner());
+	const si8 side = cb->playerToSide(ctx.caster->getOwner());
+	if(side < 0)
+		return ESpellCastProblem::INVALID;
 
 	bool hexesOutsideBattlefield = false;
 
@@ -496,7 +498,11 @@ void PatchObstacleMechanics::applyBattleEffects(const SpellCastEnvironment * env
 ESpellCastProblem::ESpellCastProblem LandMineMechanics::canBeCast(const CBattleInfoCallback * cb, const ECastingMode::ECastingMode mode, const ISpellCaster * caster) const
 {
 	//LandMine are useless if enemy has native stack and can see mines, check for LandMine damage immunity is done in general way by CSpell
-	const ui8 otherSide = !cb->playerToSide(caster->getOwner());
+	const si8 playerSide = cb->playerToSide(caster->getOwner());
+	if(playerSide < 0)
+		return ESpellCastProblem::INVALID;
+
+	const si8 otherSide = !playerSide;
 
 	if(cb->battleHasNativeStack(otherSide))
 		return ESpellCastProblem::NO_APPROPRIATE_TARGET;

+ 4 - 2
lib/spells/CDefaultSpellMechanics.cpp

@@ -635,8 +635,10 @@ std::vector<const CStack *> DefaultSpellMechanics::calculateAffectedStacks(const
 {
 	std::set<const CStack* > attackedCres;//std::set to exclude multiple occurrences of two hex creatures
 
-	const ui8 attackerSide = cb->playerToSide(ctx.caster->getOwner()) == 1;
-	auto attackedHexes = rangeInHexes(ctx.destination, ctx.schoolLvl, attackerSide);
+	const si8 playerSide = cb->playerToSide(ctx.caster->getOwner());
+	if(playerSide < 0)
+		return std::vector<const CStack *>();
+	auto attackedHexes = rangeInHexes(ctx.destination, ctx.schoolLvl, playerSide);
 
 	//hackfix for banned creature massive spells
 	if(!ctx.ti.massive && owner->getLevelInfo(ctx.schoolLvl).range == "X")