diff --git a/Crawler/AttributableStat.h b/Crawler/AttributableStat.h index cde922c5..ea710f64 100644 --- a/Crawler/AttributableStat.h +++ b/Crawler/AttributableStat.h @@ -80,6 +80,7 @@ class Stats; class ItemAttributable{ friend class ItemInfo; +protected: std::mapattributes; private: inline static std::mapstringToAttribute; @@ -117,6 +118,9 @@ public: inline static AttributeData GetDisplayInfo(ItemAttribute a){ return data[a]; } + inline static std::string GetAttributeName(ItemAttribute attr){ + return data[attr].name; + } inline static ItemAttribute GetAttributeFromString(std::string attrName){ return stringToAttribute[attrName]; }; diff --git a/Crawler/Item.cpp b/Crawler/Item.cpp index f0e0a7a2..a1226197 100644 --- a/Crawler/Item.cpp +++ b/Crawler/Item.cpp @@ -90,6 +90,7 @@ void ItemInfo::InitializeItems(){ auto ReadItems=[&](datafile&data){ for(auto&[key,value]:data.GetKeys()){ + if(key=="")ERR("Failed to read an item block ,no name specified!"); std::string imgPath="assets/"+"item_img_directory"_S+key+".png"; Renderable&img=GFX["item_img_directory"_S+key+".png"]; img.Load(imgPath); @@ -188,7 +189,8 @@ void ItemInfo::InitializeItems(){ Menu::inventoryListeners.SetInitialized(); for(auto&[name,info]:ITEM_DATA){ - if(info.description.length()==0)ERR("WARNING! Item "<Name(); + std::string name=it->Name(); + if(IsEquippable()&&EnhancementLevel()>0){ + name+=" [+"+std::to_string(EnhancementLevel())+"]"; + } + return name; }; +bool Item::IsEquippable()const{ + return Category()=="Equipment"||Category()=="Accessories"; +} std::string Item::Description(){ - return it->Description(); + std::string description=it->Description(); + if(IsEquippable()){ + description+='\n'; + description+=GetStats().GetStatsString(); + if(ItemSet()){ + const ::ItemSet*const set=ItemSet().value(); + description+="\n"+set->GetSetName()+" Set - "; + const std::map<::ItemSet,int>&itemSetCounts=Inventory::GetEquippedItemSets(); + for(bool first=true;const auto&[pieceCount,bonuses]:set->GetSetBonusBreakpoints()){ + if(itemSetCounts.count(*set)&&pieceCount<=itemSetCounts.at(*set)){ + description+="#56E346"; + } + if(!first)description+=" "; + description+="("+std::to_string(pieceCount)+"): "+bonuses.GetStatsString()+"#FFFFFF"; + first=false; + } + } + } + return description; }; -ITCategory Item::Category(){ +const ITCategory Item::Category()const{ return it->Category(); }; Decal*Item::Decal(){ @@ -496,6 +523,7 @@ void ItemSet::AddSetBonus(std::string setName,int pieceCount,Stats&bonuses){ for(int i=pieceCount;iGetStats(enhancementLevel); }; @@ -569,6 +597,43 @@ const size_t EnhancementInfo::size()const{ return enhancementStats.size(); }; -const const const std::optionalItem::ItemSet()const const const{ //I was bored, okay? +const const const std::optional&Item::ItemSet()const const const{ //I was bored, okay? return it->ItemSet(); -}; \ No newline at end of file +}; + +uint8_t Item::EnhancementLevel()const{ + return enhancementLevel; +}; +void Item::EnhanceItem(){ + if(enhancementLevel+1>"Item.Item Max Enhancement Level"_I)ERR("WARNING! Attempted to enhance "<>&ItemSet::GetSetBonusBreakpoints()const{ + return setBonusBreakpoints; +}; + +const std::mapInventory::GetEquippedItemSets(){ + std::mapsetCounts; + for(int i=int(EquipSlot::HELMET);i<=int(EquipSlot::RING2);i<<=1){ + EquipSlot slot=EquipSlot(i); + Item*equip=Inventory::GetEquip(slot); + if(equip->IsBlank())continue; + if(equip->ItemSet()){ + setCounts[*equip->ItemSet().value()]++; + } + } + return setCounts; +} + +const std::string Stats::GetStatsString()const{ + std::string description=""; + for(bool first=true;const auto&[attr,val]:attributes){ + if(!first){ + description+=" "; + } + description+=ItemAttributable::GetAttributeName(attr)+": "+std::to_string(val)+(ItemAttributable::GetDisplayInfo(attr).displayAsPercent?"%":""); + first=false; + } + return description; +} \ No newline at end of file diff --git a/Crawler/Item.h b/Crawler/Item.h index 9a92f7ad..1b8c0b3a 100644 --- a/Crawler/Item.h +++ b/Crawler/Item.h @@ -79,6 +79,13 @@ public: } return *this; }; + auto begin()const{ + return attributes.begin(); + } + auto end()const{ + return attributes.end(); + } + const std::string GetStatsString()const; }; struct EnhancementInfo{ @@ -96,6 +103,7 @@ class ItemSet{ static std::mapsets; std::arraysetBonuses; std::string name; + std::vector>setBonusBreakpoints; public: //NO CONSTRUCTOR REQUIRED! //Specify the piece count(1-8) for a set bonus to be applied. @@ -106,6 +114,7 @@ public: bool operator<(const ItemSet&rhs)const{ return name>&GetSetBonusBreakpoints()const; }; class Item{ @@ -117,23 +126,26 @@ private: uint32_t amt; uint8_t enhancementLevel; ItemInfo*it; + bool IsEquippable()const; public: Item(); Item(uint32_t amt,IT item,uint8_t enhancementLevel=0); uint32_t Amt(); std::string Name(); std::string Description(); - ITCategory Category(); + const ITCategory Category()const; EquipSlot GetEquipSlot(); Decal*Decal(); - Stats GetStats()const; + const Stats GetStats()const; ItemScript&OnUseAction(); float CastTime(); float CooldownTime(); bool IsBlank(); + uint8_t EnhancementLevel()const; + void EnhanceItem(); static Item BLANK; bool operator==(const Item&rhs)const; - const std::optionalItemSet()const; + const std::optional&ItemSet()const; }; class Inventory{ @@ -155,6 +167,7 @@ public: static void UnequipItem(EquipSlot slot); static EquipSlot GetSlotEquippedIn(Item&it); static Item*GetEquip(EquipSlot slot); + static const std::mapGetEquippedItemSets(); static bool SwapItems(ITCategory itemCategory,uint32_t slot1,uint32_t slot2); //Makes sure this is a valid category. Will error out if it doesn't exist! Use for ERROR HANDLING! diff --git a/Crawler/Player.cpp b/Crawler/Player.cpp index 237dd70d..d04886e1 100644 --- a/Crawler/Player.cpp +++ b/Crawler/Player.cpp @@ -867,18 +867,17 @@ const int Player::GetBaseStat(ItemAttribute a)const{ void PlayerStats::RecalculateEquipStats(){ baseStats.copyTo(equipStats); - std::mapsetCounts; for(int i=int(EquipSlot::HELMET);i<=int(EquipSlot::RING2);i<<=1){ EquipSlot slot=EquipSlot(i); Item*equip=Inventory::GetEquip(slot); if(equip->IsBlank())continue; for(ItemAttribute a=ItemAttribute(int(ItemAttribute::ENUM_START)+1);aGetStats().A(a); - } - if(equip->ItemSet().has_value()){ - setCounts[*equip->ItemSet().value()]++; + equipStats.A(a)+=equip->GetStats().A_Read(a); } } + + const std::map&setCounts=Inventory::GetEquippedItemSets(); + for(const auto&[set,equipCount]:setCounts){ const Stats&setStats=set[equipCount]; for(ItemAttribute a=ItemAttribute(int(ItemAttribute::ENUM_START)+1);a