瀏覽代碼

CArtPlace now works with artifact ID

SoundSSGood 1 年之前
父節點
當前提交
573bb6abc6

+ 55 - 63
client/widgets/CArtPlace.cpp

@@ -29,26 +29,44 @@
 #include "../../lib/networkPacks/ArtifactLocation.h"
 #include "../../lib/CConfigHandler.h"
 
-void CArtPlace::setInternals(const CArtifactInstance * artInst)
+CArtPlace::CArtPlace(Point position, const ArtifactID & artId, const SpellID & spellId)
+	: SelectableSlot(Rect(position, Point(44, 44)), Point(1, 1))
+	, locked(false)
+	, imageIndex(0)
+{
+	OBJECT_CONSTRUCTION;
+
+	image = std::make_shared<CAnimImage>(AnimationPath::builtin("artifact"), 0);
+	setArtifact(artId, spellId);
+	moveSelectionForeground();
+}
+
+void CArtPlace::setArtifact(const SpellID & spellId)
+{
+	setArtifact(ArtifactID::SPELL_SCROLL, spellId);
+}
+
+void CArtPlace::setArtifact(const ArtifactID & artId, const SpellID & spellId)
 {
-	ourArt = artInst;
-	if(!artInst)
+	this->artId = artId;
+	if(artId == ArtifactID::NONE)
 	{
 		image->disable();
 		text.clear();
-		hoverText = CGI->generaltexth->allTexts[507];
+		lockSlot(false);
 		return;
 	}
 
-	imageIndex = artInst->artType->getIconIndex();
-	if(artInst->getTypeId() == ArtifactID::SPELL_SCROLL)
+	const auto artType = artId.toArtifact();
+	imageIndex = artType->getIconIndex();
+	if(artId == ArtifactID::SPELL_SCROLL)
 	{
-		auto spellID = artInst->getScrollSpellID();
-		assert(spellID.num >= 0);
+		this->spellId = spellId;
+		assert(spellId.num > 0);
 
 		if(settings["general"]["enableUiEnhancements"].Bool())
 		{
-			imageIndex = spellID.num;
+			imageIndex = spellId.num;
 			if(component.type != ComponentType::SPELL_SCROLL)
 			{
 				image->setScale(Point(pos.w, 34));
@@ -58,7 +76,7 @@ void CArtPlace::setInternals(const CArtifactInstance * artInst)
 		}
 		// Add spell component info (used to provide a pic in r-click popup)
 		component.type = ComponentType::SPELL_SCROLL;
-		component.subType = spellID;
+		component.subType = spellId;
 	}
 	else
 	{
@@ -69,47 +87,33 @@ void CArtPlace::setInternals(const CArtifactInstance * artInst)
 			image->moveTo(Point(pos.x, pos.y));
 		}
 		component.type = ComponentType::ARTIFACT;
-		component.subType = artInst->getTypeId();
+		component.subType = artId;
 	}
 	image->enable();
-	text = artInst->getDescription();
-}
-
-CArtPlace::CArtPlace(Point position, const CArtifactInstance * art)
-	: SelectableSlot(Rect(position, Point(44, 44)), Point(1, 1))
-	, ourArt(art)
-	, locked(false)
-{
-	OBJECT_CONSTRUCTION;
+	lockSlot(locked);
 
-	imageIndex = 0;
-	if(locked)
-		imageIndex = ArtifactID::ART_LOCK;
-	else if(ourArt)
-		imageIndex = ourArt->artType->getIconIndex();
-
-	image = std::make_shared<CAnimImage>(AnimationPath::builtin("artifact"), imageIndex);
-	image->disable();
-	moveSelectionForeground();
+	text = artType->getDescriptionTranslated();
+	if(artType->isScroll())
+		ArtifactUtils::insertScrrollSpellName(text, spellId);
 }
 
-const CArtifactInstance * CArtPlace::getArt() const
+ArtifactID CArtPlace::getArtifactId() const
 {
-	return ourArt;
+	return artId;
 }
 
-CCommanderArtPlace::CCommanderArtPlace(Point position, const CGHeroInstance * commanderOwner, ArtifactPosition artSlot, const CArtifactInstance * art)
-	: CArtPlace(position, art),
+CCommanderArtPlace::CCommanderArtPlace(Point position, const CGHeroInstance * commanderOwner, ArtifactPosition artSlot,
+	const ArtifactID & artId, const SpellID & spellId)
+	: CArtPlace(position, artId, spellId),
 	commanderOwner(commanderOwner),
 	commanderSlotID(artSlot.num)
 {
-	setArtifact(art);
 }
 
 void CCommanderArtPlace::returnArtToHeroCallback()
 {
 	ArtifactPosition artifactPos = commanderSlotID;
-	ArtifactPosition freeSlot = ArtifactUtils::getArtBackpackPosition(commanderOwner, getArt()->getTypeId());
+	ArtifactPosition freeSlot = ArtifactUtils::getArtBackpackPosition(commanderOwner, getArtifactId());
 	if(freeSlot == ArtifactPosition::PRE_FIRST)
 	{
 		LOCPLINT->showInfoDialog(CGI->generaltexth->translate("core.genrltxt.152"));
@@ -120,10 +124,10 @@ void CCommanderArtPlace::returnArtToHeroCallback()
 		src.creature = SlotID::COMMANDER_SLOT_PLACEHOLDER;
 		ArtifactLocation dst(commanderOwner->id, freeSlot);
 
-		if(getArt()->canBePutAt(commanderOwner, freeSlot, true))
+		if(getArtifactId().toArtifact()->canBePutAt(commanderOwner, freeSlot, true))
 		{
 			LOCPLINT->cb->swapArtifacts(src, dst);
-			setArtifact(nullptr);
+			setArtifact(ArtifactID(ArtifactID::NONE));
 			parent->redraw();
 		}
 	}
@@ -131,29 +135,35 @@ void CCommanderArtPlace::returnArtToHeroCallback()
 
 void CCommanderArtPlace::clickPressed(const Point & cursorPosition)
 {
-	if(getArt() && text.size())
+	if(getArtifactId() != ArtifactID::NONE && text.size())
 		LOCPLINT->showYesNoDialog(CGI->generaltexth->translate("vcmi.commanderWindow.artifactMessage"), [this]() { returnArtToHeroCallback(); }, []() {});
 }
 
 void CCommanderArtPlace::showPopupWindow(const Point & cursorPosition)
 {
-	if(getArt() && text.size())
+	if(getArtifactId() != ArtifactID::NONE && text.size())
 		CArtPlace::showPopupWindow(cursorPosition);
 }
 
 void CArtPlace::lockSlot(bool on)
 {
-	if(locked == on)
-		return;
-
 	locked = on;
-
 	if(on)
+	{
 		image->setFrame(ArtifactID::ART_LOCK);
-	else if(ourArt)
+		hoverText = CGI->generaltexth->allTexts[507];
+	}
+	else if(artId != ArtifactID::NONE)
+	{
 		image->setFrame(imageIndex);
+		auto hoverText = MetaString::createFromRawString(CGI->generaltexth->heroscrn[1]);
+		hoverText.replaceName(artId);
+		this->hoverText = hoverText.toString();
+	}
 	else
-		image->setFrame(0);
+	{
+		hoverText = CGI->generaltexth->allTexts[507];
+	}
 }
 
 bool CArtPlace::isLocked() const
@@ -182,24 +192,6 @@ void CArtPlace::gesture(bool on, const Point & initialPosition, const Point & fi
 		gestureCallback(*this, initialPosition);
 }
 
-void CArtPlace::setArtifact(const CArtifactInstance * art)
-{
-	setInternals(art);
-	if(art)
-	{
-		image->setFrame(locked ? static_cast<int>(ArtifactID::ART_LOCK) : imageIndex);
-
-		if(locked) // Locks should appear as empty.
-			hoverText = CGI->generaltexth->allTexts[507];
-		else
-			hoverText = boost::str(boost::format(CGI->generaltexth->heroscrn[1]) % ourArt->artType->getNameTranslated());
-	}
-	else
-	{
-		lockSlot(false);
-	}
-}
-
 void CArtPlace::setClickPressedCallback(const ClickFunctor & callback)
 {
 	clickPressedCallback = callback;

+ 9 - 9
client/widgets/CArtPlace.h

@@ -20,11 +20,12 @@ public:
 
 	ArtifactPosition slot;
 	
-	CArtPlace(Point position, const CArtifactInstance * art = nullptr);
-	const CArtifactInstance * getArt() const;
+	CArtPlace(Point position, const ArtifactID & artId = ArtifactID::NONE, const SpellID & spellId = SpellID::NONE);
+	void setArtifact(const SpellID & spellId);
+	void setArtifact(const ArtifactID & artId, const SpellID & spellId = SpellID::NONE);
+	ArtifactID getArtifactId() const;
 	void lockSlot(bool on);
 	bool isLocked() const;
-	void setArtifact(const CArtifactInstance * art);
 	void setClickPressedCallback(const ClickFunctor & callback);
 	void setShowPopupCallback(const ClickFunctor & callback);
 	void setGestureCallback(const ClickFunctor & callback);
@@ -34,16 +35,14 @@ public:
 	void addCombinedArtInfo(const std::map<const ArtifactID, std::vector<ArtifactID>> & arts);
 
 private:
-	const CArtifactInstance * ourArt;
+	ArtifactID artId;
+	SpellID spellId;
 	bool locked;
-	int imageIndex;
+	int32_t imageIndex;
 	std::shared_ptr<CAnimImage> image;
 	ClickFunctor clickPressedCallback;
 	ClickFunctor showPopupCallback;
 	ClickFunctor gestureCallback;
-
-protected:
-	void setInternals(const CArtifactInstance * artInst);
 };
 
 class CCommanderArtPlace : public CArtPlace
@@ -55,7 +54,8 @@ private:
 	void returnArtToHeroCallback();
 
 public:
-	CCommanderArtPlace(Point position, const CGHeroInstance * commanderOwner, ArtifactPosition artSlot, const CArtifactInstance * art = nullptr);
+	CCommanderArtPlace(Point position, const CGHeroInstance * commanderOwner, ArtifactPosition artSlot,
+		const ArtifactID & artId = ArtifactID::NONE, const SpellID & spellId = SpellID::NONE);
 	void clickPressed(const Point & cursorPosition) override;
 	void showPopupWindow(const Point & cursorPosition) override;
 };

+ 1 - 1
client/widgets/CArtifactsOfHeroBackpack.cpp

@@ -83,7 +83,7 @@ void CArtifactsOfHeroBackpack::initAOHbackpack(size_t slots, bool slider)
 			slotSizeWithMargin * (artPlaceIdx / slotsColumnsMax));
 		backpackSlotsBackgrounds.emplace_back(std::make_shared<CPicture>(ImagePath::builtin("heroWindow/artifactSlotEmpty"), pos));
 		artPlace = std::make_shared<CArtPlace>(pos);
-		artPlace->setArtifact(nullptr);
+		artPlace->setArtifact(ArtifactID(ArtifactID::NONE));
 		artPlace->setClickPressedCallback(std::bind(&CArtifactsOfHeroBase::clickPrassedArtPlace, this, _1, _2));
 		artPlace->setShowPopupCallback(std::bind(&CArtifactsOfHeroBase::showPopupArtPlace, this, _1, _2));
 		artPlaceIdx++;

+ 4 - 4
client/widgets/CArtifactsOfHeroBase.cpp

@@ -66,13 +66,13 @@ void CArtifactsOfHeroBase::init(
 	for(auto artPlace : artWorn)
 	{
 		artPlace.second->slot = artPlace.first;
-		artPlace.second->setArtifact(nullptr);
+		artPlace.second->setArtifact(ArtifactID(ArtifactID::NONE));
 		artPlace.second->setClickPressedCallback(std::bind(&CArtifactsOfHeroBase::clickPrassedArtPlace, this, _1, _2));
 		artPlace.second->setShowPopupCallback(std::bind(&CArtifactsOfHeroBase::showPopupArtPlace, this, _1, _2));
 	}
 	for(auto artPlace : backpack)
 	{
-		artPlace->setArtifact(nullptr);
+		artPlace->setArtifact(ArtifactID(ArtifactID::NONE));
 		artPlace->setClickPressedCallback(std::bind(&CArtifactsOfHeroBase::clickPrassedArtPlace, this, _1, _2));
 		artPlace->setShowPopupCallback(std::bind(&CArtifactsOfHeroBase::showPopupArtPlace, this, _1, _2));
 	}
@@ -260,7 +260,7 @@ void CArtifactsOfHeroBase::setSlotData(ArtPlacePtr artPlace, const ArtifactPosit
 	if(auto slotInfo = curHero->getSlot(slot))
 	{
 		artPlace->lockSlot(slotInfo->locked);
-		artPlace->setArtifact(slotInfo->artifact);
+		artPlace->setArtifact(slotInfo->artifact->getTypeId(), slotInfo->artifact->getScrollSpellID());
 		if(slotInfo->locked || slotInfo->artifact->isCombined())
 			return;
 
@@ -285,7 +285,7 @@ void CArtifactsOfHeroBase::setSlotData(ArtPlacePtr artPlace, const ArtifactPosit
 	}
 	else
 	{
-		artPlace->setArtifact(nullptr);
+		artPlace->setArtifact(ArtifactID(ArtifactID::NONE));
 	}
 }
 

+ 2 - 2
client/widgets/CArtifactsOfHeroKingdom.cpp

@@ -29,14 +29,14 @@ CArtifactsOfHeroKingdom::CArtifactsOfHeroKingdom(ArtPlaceMap ArtWorn, std::vecto
 	for(auto artPlace : artWorn)
 	{
 		artPlace.second->slot = artPlace.first;
-		artPlace.second->setArtifact(nullptr);
+		artPlace.second->setArtifact(ArtifactID(ArtifactID::NONE));
 		artPlace.second->setClickPressedCallback(std::bind(&CArtifactsOfHeroBase::clickPrassedArtPlace, this, _1, _2));
 		artPlace.second->setShowPopupCallback(std::bind(&CArtifactsOfHeroBase::showPopupArtPlace, this, _1, _2));
 	}
 	enableGesture();
 	for(auto artPlace : backpack)
 	{
-		artPlace->setArtifact(nullptr);
+		artPlace->setArtifact(ArtifactID(ArtifactID::NONE));
 		artPlace->setClickPressedCallback(std::bind(&CArtifactsOfHeroBase::clickPrassedArtPlace, this, _1, _2));
 		artPlace->setShowPopupCallback(std::bind(&CArtifactsOfHeroBase::showPopupArtPlace, this, _1, _2));
 	}

+ 9 - 8
client/windows/CCreatureWindow.cpp

@@ -432,7 +432,9 @@ CStackWindow::CommanderMainSection::CommanderMainSection(CStackWindow * owner, i
 	for(auto equippedArtifact : parent->info->commander->artifactsWorn)
 	{
 		Point artPos = getArtifactPos(equippedArtifact.first);
-		auto artPlace = std::make_shared<CCommanderArtPlace>(artPos, parent->info->owner, equippedArtifact.first, equippedArtifact.second.artifact);
+		const auto commanderArt = equippedArtifact.second.artifact;
+		assert(commanderArt);
+		auto artPlace = std::make_shared<CCommanderArtPlace>(artPos, parent->info->owner, equippedArtifact.first, commanderArt->getTypeId());
 		artifacts.push_back(artPlace);
 	}
 
@@ -616,11 +618,11 @@ CStackWindow::MainSection::MainSection(CStackWindow * owner, int yOffset, bool s
 		auto art = parent->info->stackNode->getArt(ArtifactPosition::CREATURE_SLOT);
 		if(art)
 		{
-			parent->stackArtifactIcon = std::make_shared<CAnimImage>(AnimationPath::builtin("ARTIFACT"), art->artType->getIconIndex(), 0, pos.x, pos.y);
-			parent->stackArtifactHelp = std::make_shared<LRClickableAreaWTextComp>(Rect(pos, Point(44, 44)), ComponentType::ARTIFACT);
-			parent->stackArtifactHelp->component.subType = art->artType->getId();
-			parent->stackArtifactHelp->text = art->getDescription();
-
+			parent->stackArtifact = std::make_shared<CArtPlace>(pos, art->getTypeId());
+			parent->stackArtifact->setShowPopupCallback([](CArtPlace & artPlace, const Point & cursorPosition)
+				{
+					artPlace.LRClickableAreaWTextComp::showPopupWindow(cursorPosition);
+				});
 			if(parent->info->owner)
 			{
 				parent->stackArtifactButton = std::make_shared<CButton>(
@@ -987,8 +989,7 @@ void CStackWindow::removeStackArtifact(ArtifactPosition pos)
 		artLoc.creature = info->stackNode->armyObj->findStack(info->stackNode);
 		LOCPLINT->cb->swapArtifacts(artLoc, ArtifactLocation(info->owner->id, slot));
 		stackArtifactButton.reset();
-		stackArtifactHelp.reset();
-		stackArtifactIcon.reset();
+		stackArtifact.reset();
 		redraw();
 	}
 }

+ 2 - 2
client/windows/CCreatureWindow.h

@@ -28,6 +28,7 @@ class CTabbedInt;
 class CButton;
 class CMultiLineLabel;
 class CListBox;
+class CArtPlace;
 class CCommanderArtPlace;
 class LRClickableArea;
 
@@ -156,8 +157,7 @@ class CStackWindow : public CWindowObject
 		MainSection(CStackWindow * owner, int yOffset, bool showExp, bool showArt);
 	};
 
-	std::shared_ptr<CAnimImage> stackArtifactIcon;
-	std::shared_ptr<LRClickableAreaWTextComp> stackArtifactHelp;
+	std::shared_ptr<CArtPlace> stackArtifact;
 	std::shared_ptr<CButton> stackArtifactButton;
 
 

+ 0 - 8
lib/CArtifactInstance.cpp

@@ -134,14 +134,6 @@ std::string CArtifactInstance::nodeName() const
 	return "Artifact instance of " + (artType ? artType->getJsonKey() : std::string("uninitialized")) + " type";
 }
 
-std::string CArtifactInstance::getDescription() const
-{
-	std::string text = artType->getDescriptionTranslated();
-	if(artType->isScroll())
-		ArtifactUtils::insertScrrollSpellName(text, getScrollSpellID());
-	return text;
-}
-
 ArtifactID CArtifactInstance::getTypeId() const
 {
 	return artType->getId();

+ 0 - 1
lib/CArtifactInstance.h

@@ -80,7 +80,6 @@ public:
 	CArtifactInstance();
 	void setType(const CArtifact * art);
 	std::string nodeName() const override;
-	std::string getDescription() const;
 	ArtifactID getTypeId() const;
 	ArtifactInstanceID getId() const;
 	void setId(ArtifactInstanceID id);