Explorar el Código

CGCreature: fix crash on draw

Also according to H3 behaviour if there artifact monster guarded it's will be lost on draw.
Arseniy Shestakov hace 10 años
padre
commit
97a8874ed7
Se han modificado 2 ficheros con 16 adiciones y 12 borrados
  1. 4 4
      lib/mapObjects/CGPandoraBox.cpp
  2. 12 8
      lib/mapObjects/MiscObjects.cpp

+ 4 - 4
lib/mapObjects/CGPandoraBox.cpp

@@ -295,10 +295,10 @@ void CGPandoraBox::getText( InfoWindow &iw, bool &afterBattle, int val, int nega
 
 void CGPandoraBox::battleFinished(const CGHeroInstance *hero, const BattleResult &result) const
 {
-	if(result.winner)
-		return;
-
-	giveContentsUpToExp(hero);
+	if(result.winner == 0)
+	{
+		giveContentsUpToExp(hero);
+	}
 }
 
 void CGPandoraBox::blockingDialogAnswered(const CGHeroInstance *hero, ui32 answer) const

+ 12 - 8
lib/mapObjects/MiscObjects.cpp

@@ -453,22 +453,26 @@ void CGCreature::flee( const CGHeroInstance * h ) const
 
 void CGCreature::battleFinished(const CGHeroInstance *hero, const BattleResult &result) const
 {
-
-	if(result.winner==0)
+	if(result.winner == 0)
 	{
 		giveReward(hero);
 		cb->removeObject(this);
 	}
+	else if(result.winner > 1) // draw
+	{
+		// guarded reward is lost forever on draw
+		cb->removeObject(this);
+	}
 	else
 	{
 		//merge stacks into one
 		TSlots::const_iterator i;
 		CCreature * cre = VLC->creh->creatures[formation.basicType];
-		for (i = stacks.begin(); i != stacks.end(); i++)
+		for(i = stacks.begin(); i != stacks.end(); i++)
 		{
-			if (cre->isMyUpgrade(i->second->type))
+			if(cre->isMyUpgrade(i->second->type))
 			{
-				cb->changeStackType (StackLocation(this, i->first), cre); //un-upgrade creatures
+				cb->changeStackType(StackLocation(this, i->first), cre); //un-upgrade creatures
 			}
 		}
 
@@ -476,16 +480,16 @@ void CGCreature::battleFinished(const CGHeroInstance *hero, const BattleResult &
 		if(!hasStackAtSlot(SlotID(0)))
 			cb->moveStack(StackLocation(this, stacks.begin()->first), StackLocation(this, SlotID(0)), stacks.begin()->second->count);
 
-		while (stacks.size() > 1) //hopefully that's enough
+		while(stacks.size() > 1) //hopefully that's enough
 		{
 			// TODO it's either overcomplicated (if we assume there'll be only one stack) or buggy (if we allow multiple stacks... but that'll also cause troubles elsewhere)
 			i = stacks.end();
 			i--;
 			SlotID slot = getSlotFor(i->second->type);
-			if (slot == i->first) //no reason to move stack to its own slot
+			if(slot == i->first) //no reason to move stack to its own slot
 				break;
 			else
-				cb->moveStack (StackLocation(this, i->first), StackLocation(this, slot), i->second->count);
+				cb->moveStack(StackLocation(this, i->first), StackLocation(this, slot), i->second->count);
 		}
 
 		cb->setObjProperty(id, ObjProperty::MONSTER_POWER, stacks.begin()->second->count * 1000); //remember casualties