|
@@ -673,9 +673,9 @@ void CArtHandler::addBonuses()
|
|
|
giveArtBonus(112,Bonus::GENERATE_RESOURCE,+1,2); //Inexhaustible Cart of Ore
|
|
|
giveArtBonus(113,Bonus::GENERATE_RESOURCE,+1,3); //Eversmoking Ring of Sulfur
|
|
|
giveArtBonus(114,Bonus::GENERATE_RESOURCE,+1,0); //Inexhaustible Cart of Lumber
|
|
|
- giveArtBonus(115,Bonus::GENERATE_RESOURCE,+1000,6); //Endless Sack of Gold
|
|
|
- giveArtBonus(116,Bonus::GENERATE_RESOURCE,+750,6); //Endless Bag of Gold
|
|
|
- giveArtBonus(117,Bonus::GENERATE_RESOURCE,+500,6); //Endless Purse of Gold
|
|
|
+ giveArtBonus(115,Bonus::GENERATE_RESOURCE,+1000, Res::GOLD); //Endless Sack of Gold
|
|
|
+ giveArtBonus(116,Bonus::GENERATE_RESOURCE,+750, Res::GOLD); //Endless Bag of Gold
|
|
|
+ giveArtBonus(117,Bonus::GENERATE_RESOURCE,+500, Res::GOLD); //Endless Purse of Gold
|
|
|
|
|
|
giveArtBonus(118,Bonus::CREATURE_GROWTH,+5,1); //Legs of Legion
|
|
|
giveArtBonus(119,Bonus::CREATURE_GROWTH,+4,2); //Loins of Legion
|
|
@@ -746,10 +746,10 @@ void CArtHandler::addBonuses()
|
|
|
giveArtBonus(139, Bonus::SPELL_DURATION, +50);
|
|
|
|
|
|
//Cornucopia
|
|
|
- giveArtBonus(140, Bonus::GENERATE_RESOURCE, +4, 1);
|
|
|
- giveArtBonus(140, Bonus::GENERATE_RESOURCE, +4, 3);
|
|
|
- giveArtBonus(140, Bonus::GENERATE_RESOURCE, +4, 4);
|
|
|
- giveArtBonus(140, Bonus::GENERATE_RESOURCE, +4, 5);
|
|
|
+ giveArtBonus(140, Bonus::GENERATE_RESOURCE, +4, Res::MERCURY);
|
|
|
+ giveArtBonus(140, Bonus::GENERATE_RESOURCE, +4, Res::SULFUR);
|
|
|
+ giveArtBonus(140, Bonus::GENERATE_RESOURCE, +4, Res::CRYSTAL);
|
|
|
+ giveArtBonus(140, Bonus::GENERATE_RESOURCE, +4, Res::GEMS);
|
|
|
}
|
|
|
|
|
|
void CArtHandler::clear()
|
|
@@ -1195,4 +1195,137 @@ CCombinedArtifactInstance::ConstituentInfo::ConstituentInfo(CArtifactInstance *A
|
|
|
{
|
|
|
art = Art;
|
|
|
slot = Slot;
|
|
|
+}
|
|
|
+
|
|
|
+const CArtifactInstance* CArtifactSet::getArt(ui16 pos, bool excludeLocked /*= true*/) const
|
|
|
+{
|
|
|
+ if(const ArtSlotInfo *si = getSlot(pos))
|
|
|
+ {
|
|
|
+ if(si->artifact && (!excludeLocked || !si->locked))
|
|
|
+ return si->artifact;
|
|
|
+ }
|
|
|
+
|
|
|
+ return NULL;
|
|
|
+}
|
|
|
+
|
|
|
+CArtifactInstance* CArtifactSet::getArt(ui16 pos, bool excludeLocked /*= true*/)
|
|
|
+{
|
|
|
+ return const_cast<CArtifactInstance*>((const_cast<const CArtifactSet*>(this))->getArt(pos, excludeLocked));
|
|
|
+}
|
|
|
+
|
|
|
+si32 CArtifactSet::getArtPos(int aid, bool onlyWorn /*= true*/) const
|
|
|
+{
|
|
|
+ for(std::map<ui16, ArtSlotInfo>::const_iterator i = artifactsWorn.begin(); i != artifactsWorn.end(); i++)
|
|
|
+ if(i->second.artifact->artType->id == aid)
|
|
|
+ return i->first;
|
|
|
+
|
|
|
+ if(onlyWorn)
|
|
|
+ return -1;
|
|
|
+
|
|
|
+ for(int i = 0; i < artifactsInBackpack.size(); i++)
|
|
|
+ if(artifactsInBackpack[i].artifact->artType->id == aid)
|
|
|
+ return Arts::BACKPACK_START + i;
|
|
|
+
|
|
|
+ return -1;
|
|
|
+}
|
|
|
+
|
|
|
+si32 CArtifactSet::getArtPos(const CArtifactInstance *art) const
|
|
|
+{
|
|
|
+ for(std::map<ui16, ArtSlotInfo>::const_iterator i = artifactsWorn.begin(); i != artifactsWorn.end(); i++)
|
|
|
+ if(i->second.artifact == art)
|
|
|
+ return i->first;
|
|
|
+
|
|
|
+ for(int i = 0; i < artifactsInBackpack.size(); i++)
|
|
|
+ if(artifactsInBackpack[i].artifact == art)
|
|
|
+ return Arts::BACKPACK_START + i;
|
|
|
+
|
|
|
+ return -1;
|
|
|
+}
|
|
|
+
|
|
|
+const CArtifactInstance * CArtifactSet::getArtByInstanceId(int artInstId) const
|
|
|
+{
|
|
|
+ for(std::map<ui16, ArtSlotInfo>::const_iterator i = artifactsWorn.begin(); i != artifactsWorn.end(); i++)
|
|
|
+ if(i->second.artifact->id == artInstId)
|
|
|
+ return i->second.artifact;
|
|
|
+
|
|
|
+ for(int i = 0; i < artifactsInBackpack.size(); i++)
|
|
|
+ if(artifactsInBackpack[i].artifact->id == artInstId)
|
|
|
+ return artifactsInBackpack[i].artifact;
|
|
|
+
|
|
|
+ return NULL;
|
|
|
+}
|
|
|
+
|
|
|
+bool CArtifactSet::hasArt(ui32 aid, bool onlyWorn /*= false*/) const
|
|
|
+{
|
|
|
+ return getArtPos(aid, onlyWorn) != -1;
|
|
|
+}
|
|
|
+
|
|
|
+const ArtSlotInfo * CArtifactSet::getSlot(ui16 pos) const
|
|
|
+{
|
|
|
+ if(vstd::contains(artifactsWorn, pos))
|
|
|
+ return &artifactsWorn[pos];
|
|
|
+ if(pos >= Arts::AFTER_LAST )
|
|
|
+ {
|
|
|
+ int backpackPos = (int)pos - Arts::BACKPACK_START;
|
|
|
+ if(backpackPos < 0 || backpackPos >= artifactsInBackpack.size())
|
|
|
+ return NULL;
|
|
|
+ else
|
|
|
+ return &artifactsInBackpack[backpackPos];
|
|
|
+ }
|
|
|
+
|
|
|
+ return NULL;
|
|
|
+}
|
|
|
+
|
|
|
+bool CArtifactSet::isPositionFree(ui16 pos, bool onlyLockCheck /*= false*/) const
|
|
|
+{
|
|
|
+ if(const ArtSlotInfo *s = getSlot(pos))
|
|
|
+ return (onlyLockCheck || !s->artifact) && !s->locked;
|
|
|
+
|
|
|
+ return true; //no slot means not used
|
|
|
+}
|
|
|
+
|
|
|
+si32 CArtifactSet::getArtTypeId(ui16 pos) const
|
|
|
+{
|
|
|
+ const CArtifactInstance * const a = getArt(pos);
|
|
|
+ if(!a)
|
|
|
+ {
|
|
|
+ tlog2 << (dynamic_cast<const CGHeroInstance*>(this))->name << " has no artifact at " << pos << " (getArtTypeId)\n";
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ return a->artType->id;
|
|
|
+}
|
|
|
+
|
|
|
+CArtifactSet::~CArtifactSet()
|
|
|
+{
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+ArtSlotInfo & CArtifactSet::retreiveNewArtSlot(ui16 slot)
|
|
|
+{
|
|
|
+ assert(!vstd::contains(artifactsWorn, slot));
|
|
|
+ ArtSlotInfo &ret = slot < Arts::BACKPACK_START
|
|
|
+ ? artifactsWorn[slot]
|
|
|
+ : *artifactsInBackpack.insert(artifactsInBackpack.begin() + (slot - Arts::BACKPACK_START), ArtSlotInfo());
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+void CArtifactSet::setNewArtSlot(ui16 slot, CArtifactInstance *art, bool locked)
|
|
|
+{
|
|
|
+ ArtSlotInfo &asi = retreiveNewArtSlot(slot);
|
|
|
+ asi.artifact = art;
|
|
|
+ asi.locked = locked;
|
|
|
+}
|
|
|
+
|
|
|
+void CArtifactSet::eraseArtSlot(ui16 slot)
|
|
|
+{
|
|
|
+ if(slot < Arts::BACKPACK_START)
|
|
|
+ {
|
|
|
+ artifactsWorn.erase(slot);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ slot -= Arts::BACKPACK_START;
|
|
|
+ artifactsInBackpack.erase(artifactsInBackpack.begin() + slot);
|
|
|
+ }
|
|
|
}
|