Browse Source

Merge pull request #2357 from SoundSSGood/picked-art-fix

Fixed hero skills if artifact picked
Ivan Savenko 2 years ago
parent
commit
ab6a4be105

+ 7 - 55
client/windows/CHeroWindow.cpp

@@ -38,53 +38,6 @@
 #include "../lib/mapObjects/CGHeroInstance.h"
 #include "../lib/NetPacksBase.h"
 
-TConstBonusListPtr CHeroWithMaybePickedArtifact::getAllBonuses(const CSelector & selector, const CSelector & limit, const CBonusSystemNode * root, const std::string & cachingStr) const
-{
-	TBonusListPtr out(new BonusList());
-	TConstBonusListPtr heroBonuses = hero->getAllBonuses(selector, limit, hero, cachingStr);
-	TConstBonusListPtr bonusesFromPickedUpArtifact;
-
-	const auto pickedArtInst = cww->getPickedArtifact();
-
-	if(pickedArtInst)
-		bonusesFromPickedUpArtifact = pickedArtInst->getAllBonuses(selector, limit, hero);
-	else
-		bonusesFromPickedUpArtifact = TBonusListPtr(new BonusList());
-
-	for(const auto & b : *heroBonuses)
-		out->push_back(b);
-
-	for(const auto & b : *bonusesFromPickedUpArtifact)
-		*out -= b;
-	return out;
-}
-
-int64_t CHeroWithMaybePickedArtifact::getTreeVersion() const
-{
-	return hero->getTreeVersion();  //this assumes that hero and artifact belongs to main bonus tree
-}
-
-si32 CHeroWithMaybePickedArtifact::manaLimit() const
-{
-	//TODO: reduplicate code with CGHeroInstance
-	return si32(getPrimSkillLevel(PrimarySkill::KNOWLEDGE) * (valOfBonuses(BonusType::MANA_PER_KNOWLEDGE)));
-}
-
-const IBonusBearer * CHeroWithMaybePickedArtifact::getBonusBearer() const 
-{
-	return this;
-}
-
-FactionID CHeroWithMaybePickedArtifact::getFaction() const
-{
-	return hero->getFaction();
-} 
-
-CHeroWithMaybePickedArtifact::CHeroWithMaybePickedArtifact(CWindowWithArtifacts * Cww, const CGHeroInstance * Hero)
-	: hero(Hero), cww(Cww)
-{
-}
-
 void CHeroSwitcher::clickPressed(const Point & cursorPosition)
 {
 	//TODO: do not recreate window
@@ -114,8 +67,7 @@ CHeroSwitcher::CHeroSwitcher(CHeroWindow * owner_, Point pos_, const CGHeroInsta
 }
 
 CHeroWindow::CHeroWindow(const CGHeroInstance * hero)
-	: CStatusbarWindow(PLAYER_COLORED, "HeroScr4"),
-	heroWArt(this, hero)
+	: CStatusbarWindow(PLAYER_COLORED, "HeroScr4")
 {
 	auto & heroscrn = CGI->generaltexth->heroscrn;
 
@@ -268,7 +220,7 @@ void CHeroWindow::update(const CGHeroInstance * hero, bool redrawNeeded)
 	//primary skills support
 	for(size_t g=0; g<primSkillAreas.size(); ++g)
 	{
-		primSkillAreas[g]->bonusValue = heroWArt.getPrimSkillLevel(static_cast<PrimarySkill::PrimarySkill>(g));
+		primSkillAreas[g]->bonusValue = curHero->getPrimSkillLevel(static_cast<PrimarySkill::PrimarySkill>(g));
 		primSkillValues[g]->setText(std::to_string(primSkillAreas[g]->bonusValue));
 	}
 
@@ -294,7 +246,7 @@ void CHeroWindow::update(const CGHeroInstance * hero, bool redrawNeeded)
 	expValue->setText(expstr.str());
 
 	std::ostringstream manastr;
-	manastr << curHero->mana << '/' << heroWArt.manaLimit();
+	manastr << curHero->mana << '/' << curHero->manaLimit();
 	manaValue->setText(manastr.str());
 
 	//printing experience - original format does not support ui64
@@ -307,7 +259,7 @@ void CHeroWindow::update(const CGHeroInstance * hero, bool redrawNeeded)
 	spellPointsArea->text = CGI->generaltexth->allTexts[205];
 	boost::replace_first(spellPointsArea->text, "%s", curHero->getNameTranslated());
 	boost::replace_first(spellPointsArea->text, "%d", std::to_string(curHero->mana));
-	boost::replace_first(spellPointsArea->text, "%d", std::to_string(heroWArt.manaLimit()));
+	boost::replace_first(spellPointsArea->text, "%d", std::to_string(curHero->manaLimit()));
 
 	//if we have exchange window with this curHero open
 	bool noDismiss=false;
@@ -343,8 +295,8 @@ void CHeroWindow::update(const CGHeroInstance * hero, bool redrawNeeded)
 	formations->setSelected(curHero->formation == EArmyFormation::TIGHT ? 1 : 0);
 	formations->addCallback([=](int value){ LOCPLINT->cb->setFormation(curHero, value);});
 
-	morale->set(&heroWArt);
-	luck->set(&heroWArt);
+	morale->set(curHero);
+	luck->set(curHero);
 
 	if(redrawNeeded)
 		redraw();
@@ -390,5 +342,5 @@ void CHeroWindow::commanderWindow()
 void CHeroWindow::updateGarrisons()
 {
 	garr->recreateSlots();
-	morale->set(&heroWArt);
+	morale->set(curHero);
 }

+ 0 - 20
client/windows/CHeroWindow.h

@@ -46,24 +46,6 @@ public:
 	CHeroSwitcher(CHeroWindow * owner_, Point pos_, const CGHeroInstance * hero_);
 };
 
-//helper class for calculating values of hero bonuses without bonuses from picked up artifact
-class CHeroWithMaybePickedArtifact : public IBonusBearer, public AFactionMember
-{
-public:
-	const CGHeroInstance * hero;
-	CWindowWithArtifacts * cww;
-
-	CHeroWithMaybePickedArtifact(CWindowWithArtifacts * Cww, const CGHeroInstance * Hero);
-	TConstBonusListPtr getAllBonuses(const CSelector & selector, const CSelector & limit, const CBonusSystemNode * root = nullptr, const std::string & cachingStr = "") const override;
-
-	const IBonusBearer * getBonusBearer() const override;
-	FactionID getFaction() const override; 
-
-	int64_t getTreeVersion() const override;
-
-	si32 manaLimit() const;
-};
-
 class CHeroWindow : public CStatusbarWindow, public CGarrisonHolder, public CWindowWithArtifacts
 {
 	std::shared_ptr<CLabel> name;
@@ -97,8 +79,6 @@ class CHeroWindow : public CStatusbarWindow, public CGarrisonHolder, public CWin
 	std::vector<std::shared_ptr<CLabel>> secSkillNames;
 	std::vector<std::shared_ptr<CLabel>> secSkillValues;
 
-	CHeroWithMaybePickedArtifact heroWArt;
-
 	std::shared_ptr<CButton> quitButton;
 	std::shared_ptr<CTextBox> dismissLabel;
 	std::shared_ptr<CButton> dismissButton;

+ 1 - 3
client/windows/GUIClasses.cpp

@@ -912,8 +912,6 @@ CExchangeWindow::CExchangeWindow(ObjectInstanceID hero1, ObjectInstanceID hero2,
 	{
 		const CGHeroInstance * hero = heroInst.at(leftRight);
 
-		herosWArt[leftRight] = std::make_shared<CHeroWithMaybePickedArtifact>(this, hero);
-
 		for(int m=0; m<GameConstants::PRIMARY_SKILLS; ++m)
 			primSkillValues[leftRight].push_back(std::make_shared<CLabel>(352 + (qeLayout ? 96 : 93) * leftRight, (qeLayout ? 22 : 35) + (qeLayout ? 26 : 36) * m, FONT_SMALL, ETextAlignment::CENTER, Colors::WHITE));
 
@@ -1079,7 +1077,7 @@ void CExchangeWindow::updateWidgets()
 
 		for(int m=0; m<GameConstants::PRIMARY_SKILLS; ++m)
 		{
-			auto value = herosWArt[leftRight]->getPrimSkillLevel(static_cast<PrimarySkill::PrimarySkill>(m));
+			auto value = heroInst[leftRight]->getPrimSkillLevel(static_cast<PrimarySkill::PrimarySkill>(m));
 			primSkillValues[leftRight][m]->setText(std::to_string(value));
 		}
 

+ 0 - 15
client/windows/GUIClasses.h

@@ -38,7 +38,6 @@ class CToggleButton;
 class CGStatusBar;
 class CTextBox;
 class CResDataBar;
-class CHeroWithMaybePickedArtifact;
 
 enum class EUserEvent;
 
@@ -248,18 +247,6 @@ public:
 class CCallback;
 class CExchangeWindow;
 
-struct HeroArtifact
-{
-	const CGHeroInstance * hero;
-	const CArtifactInstance * artifact;
-	ArtifactPosition artPosition;
-
-	HeroArtifact(const CGHeroInstance * hero, const CArtifactInstance * artifact, ArtifactPosition artPosition)
-		:hero(hero), artifact(artifact), artPosition(artPosition)
-	{
-	}
-};
-
 class CExchangeController
 {
 private:
@@ -288,8 +275,6 @@ private:
 
 class CExchangeWindow : public CStatusbarWindow, public CGarrisonHolder, public CWindowWithArtifacts
 {
-	std::array<std::shared_ptr<CHeroWithMaybePickedArtifact>, 2> herosWArt;
-
 	std::array<std::shared_ptr<CLabel>, 2> titles;
 	std::vector<std::shared_ptr<CAnimImage>> primSkillImages;//shared for both heroes
 	std::array<std::vector<std::shared_ptr<CLabel>>, 2> primSkillValues;