Browse Source

fix for banks(crypt, ships) not giving morale penalty (#384)

* fix for banks(crypt, ships) not giving morale penalty
also texts should be closer to original now
godric3 8 years ago
parent
commit
5a01aba9c8
1 changed files with 111 additions and 101 deletions
  1. 111 101
      lib/mapObjects/CBank.cpp

+ 111 - 101
lib/mapObjects/CBank.cpp

@@ -95,124 +95,130 @@ bool CBank::wasVisited (PlayerColor player) const
 	return !bc; //FIXME: player A should not know about visit done by player B
 }
 
-void CBank::onHeroVisit (const CGHeroInstance * h) const
+void CBank::onHeroVisit(const CGHeroInstance * h) const
 {
+	int banktext = 0;
+	ui16 soundID = soundBase::ROGUE;
+	switch (ID)
+	{
+	case Obj::DERELICT_SHIP:
+		banktext = 41;
+		break;
+	case Obj::DRAGON_UTOPIA:
+		banktext = 47;
+		break;
+	case Obj::CRYPT:
+		banktext = 119;
+		break;
+	case Obj::SHIPWRECK:
+		banktext = 122;
+		break;
+	case Obj::PYRAMID:
+		soundID = soundBase::MYSTERY;
+		banktext = 105;
+		break;
+	case Obj::CREATURE_BANK:
+	default:
+		banktext = 32;
+		break;
+	}
+	BlockingDialog bd(true, false);
+	bd.player = h->getOwner();
+	bd.soundID = soundID;
+	bd.text.addTxt(MetaString::ADVOB_TXT, banktext);
+	if (banktext == 32)
+		bd.text.addReplacement(getObjectName());
+	cb->showBlockingDialog(&bd);
+}
+
+void CBank::doVisit(const CGHeroInstance * hero) const
+{
+	int textID = -1;
+	InfoWindow iw;
+	iw.player = hero->getOwner();
+	MetaString loot;
+
 	if (bc)
 	{
-		int banktext = 0;
-		ui16 soundID = soundBase::ROGUE;
 		switch (ID)
 		{
-		case Obj::CREATURE_BANK:
-			banktext = 32;
-			break;
 		case Obj::DERELICT_SHIP:
-			banktext = 41;
-			break;
-		case Obj::DRAGON_UTOPIA:
-			banktext = 47;
+			textID = 43;
 			break;
 		case Obj::CRYPT:
-			banktext = 119;
+			textID = 121;
 			break;
 		case Obj::SHIPWRECK:
-			banktext = 122;
+			textID = 124;
 			break;
 		case Obj::PYRAMID:
-			soundID = soundBase::MYSTERY;
-			banktext = 105;
+			textID = 106;
+			break;
+		case Obj::CREATURE_BANK:
+		case Obj::DRAGON_UTOPIA:
+		default:
+			textID = 34;
 			break;
 		}
-		BlockingDialog bd (true, false);
-		bd.player = h->getOwner();
-		bd.soundID = soundID;
-		bd.text.addTxt(MetaString::ADVOB_TXT, banktext);
-		if (ID == Obj::CREATURE_BANK)
-			bd.text.addReplacement(getObjectName());
-		cb->showBlockingDialog (&bd);
 	}
 	else
 	{
-		InfoWindow iw;
-		iw.soundID = soundBase::GRAVEYARD;
-		iw.player = h->getOwner();
-		if (ID == Obj::PYRAMID) // You come upon the pyramid ... pyramid is completely empty.
-		{
-			iw.text << VLC->generaltexth->advobtxt[107];
-			iw.components.push_back (Component (Component::LUCK, 0 , -2, 0));
-			GiveBonus gb;
-			gb.bonus = Bonus(Bonus::ONE_BATTLE,Bonus::LUCK,Bonus::OBJECT,-2,id.getNum(),VLC->generaltexth->arraytxt[70]);
-			gb.id = h->id.getNum();
-			cb->giveHeroBonus(&gb);
-		}
-		else
+		switch (ID)
 		{
-			iw.text << VLC->generaltexth->advobtxt[33];// This was X, now is completely empty
-			iw.text.addReplacement(getObjectName());
-		}
-		cb->showInfoDialog(&iw);
-	}
-}
-
-void CBank::doVisit(const CGHeroInstance * hero) const
-{
-	int textID = -1;
-	InfoWindow iw;
-	iw.player = hero->getOwner();
-	MetaString loot;
-
-	switch (ID)
-	{
-	case Obj::CREATURE_BANK:
-	case Obj::DRAGON_UTOPIA:
-		textID = 34;
-		break;
-	case Obj::DERELICT_SHIP:
-		if (!bc)
-			textID = 43;
-		else
+		case Obj::SHIPWRECK:
+		case Obj::DERELICT_SHIP:
+		case Obj::CRYPT:
 		{
 			GiveBonus gbonus;
 			gbonus.id = hero->id.getNum();
 			gbonus.bonus.duration = Bonus::ONE_BATTLE;
 			gbonus.bonus.source = Bonus::OBJECT;
 			gbonus.bonus.sid = ID;
-			gbonus.bdescr << "\n" << VLC->generaltexth->arraytxt[101];
 			gbonus.bonus.type = Bonus::MORALE;
 			gbonus.bonus.val = -1;
+			switch (ID)
+			{
+			case Obj::SHIPWRECK:
+				textID = 123;
+				gbonus.bdescr << VLC->generaltexth->arraytxt[99];
+				break;
+			case Obj::DERELICT_SHIP:
+				textID = 42;
+				gbonus.bdescr << VLC->generaltexth->arraytxt[101];
+				break;
+			case Obj::CRYPT:
+				textID = 120;
+				gbonus.bdescr << VLC->generaltexth->arraytxt[98];
+				break;
+			}
 			cb->giveHeroBonus(&gbonus);
-			textID = 42;
-			iw.components.push_back (Component (Component::MORALE, 0 , -1, 0));
+			iw.components.push_back(Component(Component::MORALE, 0, -1, 0));
+			iw.soundID = soundBase::GRAVEYARD;
+			break;
 		}
-		break;
-	case Obj::CRYPT:
-		if (bc)
-			textID = 121;
-		else
+		case Obj::PYRAMID:
 		{
-			iw.components.push_back (Component (Component::MORALE, 0 , -1, 0));
-			GiveBonus gbonus;
-			gbonus.id = hero->id.getNum();
-			gbonus.bonus.duration = Bonus::ONE_BATTLE;
-			gbonus.bonus.source = Bonus::OBJECT;
-			gbonus.bonus.sid = ID;
-			gbonus.bdescr << "\n" << VLC->generaltexth->arraytxt[ID];
-			gbonus.bonus.type = Bonus::MORALE;
-			gbonus.bonus.val = -1;
-			cb->giveHeroBonus(&gbonus);
-			textID = 120;
-			iw.components.push_back (Component (Component::MORALE, 0 , -1, 0));
+			GiveBonus gb;
+			gb.bonus = Bonus(Bonus::ONE_BATTLE, Bonus::LUCK, Bonus::OBJECT, -2, id.getNum(), VLC->generaltexth->arraytxt[70]);
+			gb.id = hero->id.getNum();
+			cb->giveHeroBonus(&gb);
+			textID = 107;
+			iw.components.push_back(Component(Component::LUCK, 0, -2, 0));
+			break;
 		}
-		break;
-	case Obj::SHIPWRECK:
-		if (bc)
-			textID = 124;
-		else
-			textID = 123;
-		break;
-	case Obj::PYRAMID:
-		textID = 106;
+		case Obj::CREATURE_BANK:
+		case Obj::DRAGON_UTOPIA:
+		default:
+			iw.text << VLC->generaltexth->advobtxt[33];// This was X, now is completely empty
+			iw.text.addReplacement(getObjectName());
+		}
+		if(textID != -1)
+		{
+			iw.text.addTxt(MetaString::ADVOB_TXT, textID);
+		}
+		cb->showInfoDialog(&iw);
 	}
+	
 
 	//grant resources
 	if (bc)
@@ -221,25 +227,25 @@ void CBank::doVisit(const CGHeroInstance * hero) const
 		{
 			if (bc->resources[it] != 0)
 			{
-				iw.components.push_back (Component (Component::RESOURCE, it, bc->resources[it], 0));
+				iw.components.push_back(Component(Component::RESOURCE, it, bc->resources[it], 0));
 				loot << "%d %s";
 				loot.addReplacement(iw.components.back().val);
 				loot.addReplacement(MetaString::RES_NAMES, iw.components.back().subtype);
-				cb->giveResource (hero->getOwner(), static_cast<Res::ERes>(it), bc->resources[it]);
+				cb->giveResource(hero->getOwner(), static_cast<Res::ERes>(it), bc->resources[it]);
 			}
 		}
 		//grant artifacts
 		for (auto & elem : bc->artifacts)
 		{
-			iw.components.push_back (Component (Component::ARTIFACT, elem, 0, 0));
+			iw.components.push_back(Component(Component::ARTIFACT, elem, 0, 0));
 			loot << "%s";
 			loot.addReplacement(MetaString::ART_NAMES, elem);
-			cb->giveHeroNewArtifact (hero, VLC->arth->artifacts[elem], ArtifactPosition::FIRST_AVAILABLE);
+			cb->giveHeroNewArtifact(hero, VLC->arth->artifacts[elem], ArtifactPosition::FIRST_AVAILABLE);
 		}
 		//display loot
 		if (!iw.components.empty())
 		{
-			iw.text.addTxt (MetaString::ADVOB_TXT, textID);
+			iw.text.addTxt(MetaString::ADVOB_TXT, textID);
 			if (textID == 34)
 			{
 				const CCreature * strongest = boost::range::max_element(bc->guards, [](const CStackBasicDescriptor & a, const CStackBasicDescriptor & b)
@@ -262,16 +268,20 @@ void CBank::doVisit(const CGHeroInstance * hero) const
 			std::set<SpellID> spells;
 
 			bool noWisdom = false;
+			if(textID == 106)
+			{
+				iw.text.addTxt(MetaString::ADVOB_TXT, textID); //pyramid
+			}
 			for(const SpellID & spellId : bc->spells)
 			{
 				const CSpell * spell = spellId.toSpell();
-				iw.text.addTxt (MetaString::SPELL_NAME, spellId);
+				iw.text.addTxt(MetaString::SPELL_NAME, spellId);
 				if(spell->level <= hero->maxSpellLevel())
 				{
 					if(hero->canLearnSpell(spell))
 					{
 						spells.insert(spellId);
-						iw.components.push_back(Component (Component::SPELL, spellId, 0, 0));
+						iw.components.push_back(Component(Component::SPELL, spellId, 0, 0));
 					}
 				}
 				else
@@ -279,15 +289,15 @@ void CBank::doVisit(const CGHeroInstance * hero) const
 			}
 
 			if (!hero->getArt(ArtifactPosition::SPELLBOOK))
-				iw.text.addTxt (MetaString::ADVOB_TXT, 109); //no spellbook
-			else if (noWisdom)
-				iw.text.addTxt (MetaString::ADVOB_TXT, 108); //no expert Wisdom
+				iw.text.addTxt(MetaString::ADVOB_TXT, 109); //no spellbook
+			else if(noWisdom)
+				iw.text.addTxt(MetaString::ADVOB_TXT, 108); //no expert Wisdom
 
 			if(!iw.components.empty() || !iw.text.toString().empty())
 				cb->showInfoDialog(&iw);
 
 			if(!spells.empty())
-				cb->changeSpells (hero, true, spells);
+				cb->changeSpells(hero, true, spells);
 		}
 
 		iw.components.clear();
@@ -310,16 +320,16 @@ void CBank::doVisit(const CGHeroInstance * hero) const
 		if(ourArmy.stacksCount())
 		{
 			if(ourArmy.stacksCount() == 1 && ourArmy.Slots().begin()->second->count == 1)
-				iw.text.addTxt (MetaString::ADVOB_TXT, 185);
+				iw.text.addTxt(MetaString::ADVOB_TXT, 185);
 			else
-				iw.text.addTxt (MetaString::ADVOB_TXT, 186);
+				iw.text.addTxt(MetaString::ADVOB_TXT, 186);
 
 			iw.text.addReplacement(loot.buildList());
 			iw.text.addReplacement(hero->name);
 			cb->showInfoDialog(&iw);
 			cb->giveCreatures(this, hero, ourArmy, false);
 		}
-	cb->setObjProperty (id, ObjProperty::BANK_CLEAR, 0); //bc = nullptr
+		cb->setObjProperty(id, ObjProperty::BANK_CLEAR, 0); //bc = nullptr
 	}
 }