From c2d9178de3a5c5ef19f17b87b131df736a114fc1 Mon Sep 17 00:00:00 2001 From: sigonasr2 Date: Sun, 31 Dec 2023 15:29:05 -0600 Subject: [PATCH] Added Rings to equipment lists. Add randomized stats functionality. --- Crawler/AttributableStat.h | 2 +- Crawler/Crawler.vcxproj | 1 + Crawler/Crawler.vcxproj.filters | 3 + Crawler/Item.cpp | 59 +++++++++++++++--- Crawler/Item.h | 10 ++- Crawler/Version.h | 2 +- Crawler/assets/config/items/Accessories.txt | 26 ++++++++ Crawler/assets/config/items/Equipment.txt | 40 ++++++------ Crawler/assets/config/items/Weapons.txt | 30 ++++----- Crawler/assets/config/items/items.txt | 1 + Crawler/assets/items/Ring of the Bear.png | Bin 0 -> 808 bytes .../assets/items/Ring of the Slime King.png | Bin 0 -> 831 bytes Crawler/assets/items/Ring.png | Bin 0 -> 730 bytes 13 files changed, 127 insertions(+), 47 deletions(-) create mode 100644 Crawler/assets/config/items/Accessories.txt create mode 100644 Crawler/assets/items/Ring of the Bear.png create mode 100644 Crawler/assets/items/Ring of the Slime King.png create mode 100644 Crawler/assets/items/Ring.png diff --git a/Crawler/AttributableStat.h b/Crawler/AttributableStat.h index 5af0d9e5..794da501 100644 --- a/Crawler/AttributableStat.h +++ b/Crawler/AttributableStat.h @@ -82,7 +82,7 @@ public: ItemAttributable&operator+=(Stats&rhs); //Returns a copy of all the attributes to be passed to a new instance easily / to sync values between both. - inline void copyTo(ItemAttributable&target){ + inline void copyTo(ItemAttributable&target)const{ target.attributes=attributes; } inline float&get(std::string_view a){ diff --git a/Crawler/Crawler.vcxproj b/Crawler/Crawler.vcxproj index e4a9683c..17811b08 100644 --- a/Crawler/Crawler.vcxproj +++ b/Crawler/Crawler.vcxproj @@ -595,6 +595,7 @@ + diff --git a/Crawler/Crawler.vcxproj.filters b/Crawler/Crawler.vcxproj.filters index a0aed0cf..73d81e47 100644 --- a/Crawler/Crawler.vcxproj.filters +++ b/Crawler/Crawler.vcxproj.filters @@ -767,6 +767,9 @@ Documentation\Menus + + Configurations\Items + diff --git a/Crawler/Item.cpp b/Crawler/Item.cpp index 709838f3..644fd9b2 100644 --- a/Crawler/Item.cpp +++ b/Crawler/Item.cpp @@ -43,6 +43,7 @@ All rights reserved. #include "Ability.h" #include "AttributableStat.h" #include +#include "util.h" INCLUDE_game INCLUDE_DATA @@ -105,6 +106,8 @@ void ItemInfo::InitializeItems(){ std::vectorstatValueList; uint32_t sellValue=0; uint32_t buyValue=0; + Stats minStats; + Stats maxStats; bool useDuringCast=false; for(auto&[itemKey,itemValue]:data[key].GetKeys()){ std::string keyName=itemKey; @@ -129,7 +132,7 @@ void ItemInfo::InitializeItems(){ } }else if(keyName=="StatValues"){ - for(int i=0;i0){ + if(data[key].HasProperty("StatValues[0]")){ //This means this has enhancement levels. EnhancementInfo enhancementStats; for(int enhancementLevel=0;enhancementLevel<=10;enhancementLevel++){ uint8_t availableChapter=1; datafile&dat=data[key]["StatValues["+std::to_string(enhancementLevel)+"]"]; - int attrIndex=0; - for(ItemAttribute&attr:statValueList){ + for(int attrIndex=0;ItemAttribute&attr:statValueList){ enhancementStats.SetAttribute(enhancementLevel,attr,dat.GetReal(attrIndex)); attrIndex++; } @@ -191,6 +193,22 @@ void ItemInfo::InitializeItems(){ it.enhancement.SetAttribute(1,ItemAttribute::Get("Attack"),0.f); it.enhancement.SetCraftingRequirements(1,itemsRequired,goldCost,availableChapter); } + + if(data[key].HasProperty("MinStats")){ + if(data[key]["MinStats"].GetValueCount()!=statValueList.size())ERR(std::format("MinStats attribute count does not match statValueList attribute count {}!={}",data[key]["MinStats"].GetValueCount(),statValueList.size())); + for(int attrCount=0;ItemAttribute&attr:statValueList){ + minStats.A(attr)=data[key]["MinStats"].GetReal(attrCount); + attrCount++; + } + } + if(data[key].HasProperty("MaxStats")){ + if(data[key]["MaxStats"].GetValueCount()!=statValueList.size())ERR(std::format("MaxStats attribute count does not match statValueList attribute count {}!={}",data[key]["MaxStats"].GetValueCount(),statValueList.size())); + for(int attrCount=0;ItemAttribute&attr:statValueList){ + maxStats.A(attr)=data[key]["MaxStats"].GetReal(attrCount); + attrCount++; + } + } + if(data[key].HasProperty("MinStats")^data[key].HasProperty("MaxStats"))ERR("Only one of MinStats/MaxStats was provided! Both are required!"); if(scriptName!=""){ if(scriptName=="RestoreDuringCast"){ @@ -228,6 +246,8 @@ void ItemInfo::InitializeItems(){ props.customProps=&data[key]; } it.useFunc=scriptName; + it.minStats=minStats; + it.maxStats=maxStats; #pragma region Equipment Category Verification Tests int equipmentCategories=0; @@ -372,11 +392,10 @@ void Inventory::AddItem(IT it,uint32_t amt,bool monsterDrop){ InsertIntoSortedInv((*_inventory.insert({it,std::make_shared(amt,it)})).second); }else{ auto inventory=_inventory.equal_range(it); - std::accumulate(inventory.first,inventory.second,0,[&](int counter,std::pair>item){ + if(std::accumulate(inventory.first,inventory.second,0, + [&](int counter,std::pair>item){ (*item.second).amt+=amt; - if(counter>=1)ERR("WARNING! We should not have more than 1 instance of a stackable item!"); - return counter+1; - }); + return counter+1;})>1)ERR("WARNING! We should not have more than 1 instance of a stackable item!"); } SkipAddingStackableItem: @@ -542,7 +561,7 @@ const bool Item::IsEquippable()const{ } const std::string Item::Description(CompactText compact)const{ std::string description=it->Description(); - if(IsEquippable()){ + if(IsArmor()||IsWeapon()){ description+='\n'; description+=GetStats().GetStatsString(compact); if(ItemSet()){ @@ -1026,4 +1045,26 @@ const bool Item::EnhancementIsPossible()const{ const uint8_t EnhancementInfo::AvailableChapter()const{ return availableChapter; +} + +const Stats&Item::RandomStats()const{ + return randomizedStats; +}; +void Item::SetRandomStat(const ItemAttribute attr,const float val){ + randomizedStats.A(attr)=val; +}; + +const Stats ItemInfo::GetMinStats()const{ + return minStats; +} +const Stats ItemInfo::GetMaxStats()const{ + return maxStats; +} +Stats ItemInfo::RandomizeStats(){ + Stats randomRolls; + for(auto&[attr,minVal]:minStats){ + float diff=maxStats.A(attr)-minVal; + randomRolls.A(attr)=util::random(diff)+minVal; + } + return randomRolls; } \ No newline at end of file diff --git a/Crawler/Item.h b/Crawler/Item.h index a4b0c6c4..cf43fc26 100644 --- a/Crawler/Item.h +++ b/Crawler/Item.h @@ -163,6 +163,7 @@ private: static int IsBlankStaticCallCounter; const bool _IsBlank()const; static ItemEnhancementFunctionPrimingData enhanceFunctionPrimed; + Stats randomizedStats; public: Item(); Item(uint32_t amt,IT item,uint8_t enhancementLevel=0); @@ -200,6 +201,8 @@ public: const uint32_t SellValue()const; const bool CanBeSold()const; const bool CanBePurchased()const; + const Stats&RandomStats()const; + void SetRandomStat(const ItemAttribute attr,const float val); const EnhancementInfo&GetEnhancementInfo()const; //Use ISBLANK macro instead!! This should not be called directly!! static bool IsBlank(std::shared_ptritem); @@ -219,7 +222,7 @@ class Inventory{ public: static void AddItem(IT it,uint32_t amt=1,bool monsterDrop=false); //Returns the actual amount available in your main inventory. - static uint32_t GetItemCount(IT it); + [[nodiscard]] static uint32_t GetItemCount(IT it); static std::vector>CopyItem(IT it); static std::vector>GetItem(IT it); //Auto-executes its use function and removes the amt specified from the inventory. Multiple amounts will cause the item to execute its useFunc multiple times. @@ -284,6 +287,8 @@ class ItemInfo{ uint32_t sellValue=0; //If true, this item's action is activated at the beginning of the cast instead of after the cast completes. bool useDuringCast=false; + Stats minStats; + Stats maxStats; private: static void InitializeScripts(); static void InitializeSets(); @@ -317,6 +322,9 @@ public: const bool IsWeapon()const; const bool IsArmor()const; const bool IsAccessory()const; + const Stats GetMinStats()const; + const Stats GetMaxStats()const; + Stats RandomizeStats(); }; class ItemOverlay{ diff --git a/Crawler/Version.h b/Crawler/Version.h index 0978322d..e09b5ee9 100644 --- a/Crawler/Version.h +++ b/Crawler/Version.h @@ -39,7 +39,7 @@ All rights reserved. #define VERSION_MAJOR 0 #define VERSION_MINOR 2 #define VERSION_PATCH 1 -#define VERSION_BUILD 5110 +#define VERSION_BUILD 5119 #define stringify(a) stringify_(a) #define stringify_(a) #a diff --git a/Crawler/assets/config/items/Accessories.txt b/Crawler/assets/config/items/Accessories.txt new file mode 100644 index 00000000..baae1af0 --- /dev/null +++ b/Crawler/assets/config/items/Accessories.txt @@ -0,0 +1,26 @@ +Equipment +{ + Ring of the Slime King + { + Slot = Ring1,Ring2 + ItemCategory = Equipment + + # See ItemStats.txt for valid stat names + StatValues = Health,Attack,Mana,Move Spd % + MinStats = 5,2,1,1 + MaxStats = 20,4,4,3 + SellValue = 90 + + } + Ring of the Bear + { + Slot = Ring1,Ring2 + ItemCategory = Equipment + + # See ItemStats.txt for valid stat names + StatValues = Health,Attack,Mana + MinStats = 4,4,1 + MaxStats = 10,10,3 + SellValue = 75 + } +} \ No newline at end of file diff --git a/Crawler/assets/config/items/Equipment.txt b/Crawler/assets/config/items/Equipment.txt index da121275..242af795 100644 --- a/Crawler/assets/config/items/Equipment.txt +++ b/Crawler/assets/config/items/Equipment.txt @@ -7,7 +7,7 @@ Equipment ItemCategory = Equipment # Stat Values of the item based on Enhancement level. - # See ItemSets.txt for valid stat names + # See ItemStats.txt for valid stat names StatValues = Defense,Health,Attack StatValues[0] = 3,2,0 StatValues[1] = 4,3,0 @@ -93,7 +93,7 @@ Equipment ItemCategory = Equipment # Stat Values of the item based on Enhancement level. - # See ItemSets.txt for valid stat names + # See ItemStats.txt for valid stat names StatValues = Defense,Health,Attack StatValues[0] = 5,1,0 StatValues[1] = 6,1,0 @@ -179,7 +179,7 @@ Equipment ItemCategory = Equipment # Stat Values of the item based on Enhancement level. - # See ItemSets.txt for valid stat names + # See ItemStats.txt for valid stat names StatValues = Defense,Health,Attack StatValues[0] = 4,1,1 StatValues[1] = 5,1,1 @@ -265,7 +265,7 @@ Equipment ItemCategory = Equipment # Stat Values of the item based on Enhancement level. - # See ItemSets.txt for valid stat names + # See ItemStats.txt for valid stat names StatValues = Defense,Health,Attack StatValues[0] = 1,0,1 StatValues[1] = 2,0,3 @@ -351,7 +351,7 @@ Equipment ItemCategory = Equipment # Stat Values of the item based on Enhancement level. - # See ItemSets.txt for valid stat names + # See ItemStats.txt for valid stat names StatValues = Defense,Health,Attack StatValues[0] = 2,1,0 StatValues[1] = 3,1,1 @@ -437,7 +437,7 @@ Equipment ItemCategory = Equipment # Stat Values of the item based on Enhancement level. - # See ItemSets.txt for valid stat names + # See ItemStats.txt for valid stat names StatValues = Defense,Health,Attack StatValues[0] = 7,5,2 StatValues[1] = 9,5,2 @@ -523,7 +523,7 @@ Equipment ItemCategory = Equipment # Stat Values of the item based on Enhancement level. - # See ItemSets.txt for valid stat names + # See ItemStats.txt for valid stat names StatValues = Defense,Health,Attack StatValues[0] = 10,3,2 StatValues[1] = 11,4,2 @@ -609,7 +609,7 @@ Equipment ItemCategory = Equipment # Stat Values of the item based on Enhancement level. - # See ItemSets.txt for valid stat names + # See ItemStats.txt for valid stat names StatValues = Defense,Health,Attack StatValues[0] = 9,3,3 StatValues[1] = 10,3,4 @@ -695,7 +695,7 @@ Equipment ItemCategory = Equipment # Stat Values of the item based on Enhancement level. - # See ItemSets.txt for valid stat names + # See ItemStats.txt for valid stat names StatValues = Defense,Health,Attack StatValues[0] = 5,2,5 StatValues[1] = 6,2,5 @@ -781,7 +781,7 @@ Equipment ItemCategory = Equipment # Stat Values of the item based on Enhancement level. - # See ItemSets.txt for valid stat names + # See ItemStats.txt for valid stat names StatValues = Defense,Health,Attack StatValues[0] = 6,3,3 StatValues[1] = 7,3,3 @@ -867,7 +867,7 @@ Equipment ItemCategory = Equipment # Stat Values of the item based on Enhancement level. - # See ItemSets.txt for valid stat names + # See ItemStats.txt for valid stat names StatValues = Defense,Health,Attack StatValues[0] = 12,8,4 StatValues[1] = 13,8,4 @@ -953,7 +953,7 @@ Equipment ItemCategory = Equipment # Stat Values of the item based on Enhancement level. - # See ItemSets.txt for valid stat names + # See ItemStats.txt for valid stat names StatValues = Defense,Health,Attack StatValues[0] = 14,6,4 StatValues[1] = 15,7,4 @@ -1039,7 +1039,7 @@ Equipment ItemCategory = Equipment # Stat Values of the item based on Enhancement level. - # See ItemSets.txt for valid stat names + # See ItemStats.txt for valid stat names StatValues = Defense,Health,Attack StatValues[0] = 13,5,6 StatValues[1] = 14,5,7 @@ -1125,7 +1125,7 @@ Equipment ItemCategory = Equipment # Stat Values of the item based on Enhancement level. - # See ItemSets.txt for valid stat names + # See ItemStats.txt for valid stat names StatValues = Defense,Health,Attack StatValues[0] = 8,4,7 StatValues[1] = 8,4,8 @@ -1211,7 +1211,7 @@ Equipment ItemCategory = Equipment # Stat Values of the item based on Enhancement level. - # See ItemSets.txt for valid stat names + # See ItemStats.txt for valid stat names StatValues = Defense,Health,Attack StatValues[0] = 9,5,4 StatValues[1] = 9,5,5 @@ -1297,7 +1297,7 @@ Equipment ItemCategory = Equipment # Stat Values of the item based on Enhancement level. - # See ItemSets.txt for valid stat names + # See ItemStats.txt for valid stat names StatValues = Defense,Health,Attack StatValues[0] = 24,12,5 StatValues[1] = 29,12,5 @@ -1383,7 +1383,7 @@ Equipment ItemCategory = Equipment # Stat Values of the item based on Enhancement level. - # See ItemSets.txt for valid stat names + # See ItemStats.txt for valid stat names StatValues = Defense,Health,Attack StatValues[0] = 33,9,5 StatValues[1] = 37,10,5 @@ -1470,7 +1470,7 @@ Equipment Description = Pants made out of hardened bone. # Stat Values of the item based on Enhancement level. - # See ItemSets.txt for valid stat names + # See ItemStats.txt for valid stat names StatValues = Defense,Health,Attack StatValues[0] = 24,7,9 StatValues[1] = 26,8,10 @@ -1556,7 +1556,7 @@ Equipment ItemCategory = Equipment # Stat Values of the item based on Enhancement level. - # See ItemSets.txt for valid stat names + # See ItemStats.txt for valid stat names StatValues = Defense,Health,Attack StatValues[0] = 9,5,11 StatValues[1] = 10,5,12 @@ -1642,7 +1642,7 @@ Equipment ItemCategory = Equipment # Stat Values of the item based on Enhancement level. - # See ItemSets.txt for valid stat names + # See ItemStats.txt for valid stat names StatValues = Defense,Health,Attack StatValues[0] = 11,7,7 StatValues[1] = 11,8,8 diff --git a/Crawler/assets/config/items/Weapons.txt b/Crawler/assets/config/items/Weapons.txt index 690f0bfb..d14d9470 100644 --- a/Crawler/assets/config/items/Weapons.txt +++ b/Crawler/assets/config/items/Weapons.txt @@ -6,7 +6,7 @@ Equipment ItemCategory = Equipment # Stat Values of the item based on Enhancement level. - # See ItemSets.txt for valid stat names + # See ItemStats.txt for valid stat names StatValues = Attack,Crit Rate,Move Spd % StatValues[0] = 5,5,0 StatValues[1] = 10,6,1 @@ -109,7 +109,7 @@ Equipment ItemCategory = Equipment # Stat Values of the item based on Enhancement level. - # See ItemSets.txt for valid stat names + # See ItemStats.txt for valid stat names StatValues = Attack,Crit Rate,Move Spd % StatValues[0] = 5,5,0 StatValues[1] = 10,6,1 @@ -194,7 +194,7 @@ Equipment ItemCategory = Equipment # Stat Values of the item based on Enhancement level. - # See ItemSets.txt for valid stat names + # See ItemStats.txt for valid stat names StatValues = Attack,Crit Rate,Move Spd % StatValues[0] = 5,5,0 StatValues[1] = 10,6,1 @@ -279,7 +279,7 @@ Equipment ItemCategory = Equipment # Stat Values of the item based on Enhancement level. - # See ItemSets.txt for valid stat names + # See ItemStats.txt for valid stat names StatValues = Attack,Crit Rate,Defense StatValues[0] = 26,5,5 StatValues[1] = 31,6,10 @@ -364,7 +364,7 @@ Equipment ItemCategory = Equipment # Stat Values of the item based on Enhancement level. - # See ItemSets.txt for valid stat names + # See ItemStats.txt for valid stat names StatValues = Attack,Crit Rate,Defense StatValues[0] = 26,5,5 StatValues[1] = 31,6,10 @@ -449,7 +449,7 @@ Equipment ItemCategory = Equipment # Stat Values of the item based on Enhancement level. - # See ItemSets.txt for valid stat names + # See ItemStats.txt for valid stat names StatValues = Attack,Crit Rate,Defense StatValues[0] = 26,5,5 StatValues[1] = 31,6,10 @@ -534,7 +534,7 @@ Equipment ItemCategory = Equipment # Stat Values of the item based on Enhancement level. - # See ItemSets.txt for valid stat names + # See ItemStats.txt for valid stat names StatValues = Attack,Crit Rate,CDR,Mana StatValues[0] = 47,5,0,0 StatValues[1] = 52,6,2,1 @@ -619,7 +619,7 @@ Equipment ItemCategory = Equipment # Stat Values of the item based on Enhancement level. - # See ItemSets.txt for valid stat names + # See ItemStats.txt for valid stat names StatValues = Attack,Crit Rate,CDR,Mana StatValues[0] = 47,5,0,0 StatValues[1] = 52,6,2,1 @@ -704,7 +704,7 @@ Equipment ItemCategory = Equipment # Stat Values of the item based on Enhancement level. - # See ItemSets.txt for valid stat names + # See ItemStats.txt for valid stat names StatValues = Attack,Crit Rate,CDR,Mana StatValues[0] = 47,5,0,0 StatValues[1] = 52,6,2,1 @@ -789,7 +789,7 @@ Equipment ItemCategory = Equipment # Stat Values of the item based on Enhancement level. - # See ItemSets.txt for valid stat names + # See ItemStats.txt for valid stat names StatValues = Attack,Crit Rate StatValues[0] = 68,10 StatValues[1] = 73,12 @@ -874,7 +874,7 @@ Equipment ItemCategory = Equipment # Stat Values of the item based on Enhancement level. - # See ItemSets.txt for valid stat names + # See ItemStats.txt for valid stat names StatValues = Attack,Crit Rate StatValues[0] = 68,10 StatValues[1] = 73,12 @@ -959,7 +959,7 @@ Equipment ItemCategory = Equipment # Stat Values of the item based on Enhancement level. - # See ItemSets.txt for valid stat names + # See ItemStats.txt for valid stat names StatValues = Attack,Crit Rate StatValues[0] = 68,10 StatValues[1] = 73,12 @@ -1044,7 +1044,7 @@ Equipment ItemCategory = Equipment # Stat Values of the item based on Enhancement level. - # See ItemSets.txt for valid stat names + # See ItemStats.txt for valid stat names # Attack Speed Increase reduces Cooldown of LeftClick Attacks (0.1 sec in this case) StatValues = Attack,Crit Rate,Attack Spd StatValues[0] = 89,5,0.1 @@ -1130,7 +1130,7 @@ Equipment ItemCategory = Equipment # Stat Values of the item based on Enhancement level. - # See ItemSets.txt for valid stat names + # See ItemStats.txt for valid stat names # Attack Speed Increase reduces Cooldown of LeftClick Attacks (0.1 sec in this case) StatValues = Attack,Crit Rate,Attack Spd StatValues[0] = 89,5,0.1 @@ -1216,7 +1216,7 @@ Equipment ItemCategory = Equipment # Stat Values of the item based on Enhancement level. - # See ItemSets.txt for valid stat names + # See ItemStats.txt for valid stat names # Attack Speed Increase reduces Cooldown of LeftClick Attacks (0.1 sec in this case) StatValues = Attack,Crit Rate,Attack Spd StatValues[0] = 89,5,0.1 diff --git a/Crawler/assets/config/items/items.txt b/Crawler/assets/config/items/items.txt index c5da2ea6..86694c8a 100644 --- a/Crawler/assets/config/items/items.txt +++ b/Crawler/assets/config/items/items.txt @@ -5,6 +5,7 @@ ItemConfiguration Item Categories = ItemCategory.txt Equipment = Equipment.txt Weapons = Weapons.txt + Accessories = Accessories.txt } Item { diff --git a/Crawler/assets/items/Ring of the Bear.png b/Crawler/assets/items/Ring of the Bear.png new file mode 100644 index 0000000000000000000000000000000000000000..fc470d451df2f3d00fb735ea5bd0165b2d420206 GIT binary patch literal 808 zcmV+@1K0eCP)EX>4Tx04R}tkv&MmKpe$iTcsiu2Q#P$W~fefQ7Mk4ibb$c+6t{Ym|Xe=O&XFE z7e~Rh;NZt%)xpJCR|i)?5c~jfb#YR3krMxx6k5c1aNLh~_a1le0DrT}RI?`rsG4P@ z6LB$@UloI|2w@xoMi7;lsV6gwS$K}Gd-(Wz7vWjn=l&c6O2K4+Pb7{p-LQx^h@+d9 z&Uv3$U}Z@mJ|~_s=z_$LT$f#b<6Lss&oc!ho1P~Yh{aMD%U#UMhDtn399C3~^8GoN z70z3n)oPu!@5x^nDrhSiuG1Vt0!v6D1rajpsGtf95n44;Or&W)?%^MG{3&wD(d0egat9cG(j`N3qySBSu?W1M(KqFRpK2d-P^xs+Wq|i9yW68JOR;~00006VoOIv0QUg508&OH?|%RQ010qNS#tmY zE+YT{E+YYWr9XB6000McNliru=L{bdBOT12J4OHi02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{0096=L_t(Y$L&-h4#GeXoNGunr~_Ba3utit0g_*UBshLi z%PTG`CL0AT#2i-`N&6{CAC_v^%LiyD|t8^3p4LU z5C8xU7WdAPgzFPG&7$m)M2&r|0TOcN=o8MXt3_(M(L26I4Z7w`jAy zK}9psXQjPwKS;05{Z|FbXk0gAb+ymzqY+(p^_jH_xZa}4z4KRL3YZQ}Vw-zs0oyI6 m%gKYdD*To}lThDx(i?XN7mxj_0an!j0000EX>4Tx04R}tkv&MmKpe$iTcsiu2Q#P$W~fefQ7Mk4ibb$c+6t{Ym|Xe=O&XFE z7e~Rh;NZt%)xpJCR|i)?5c~jfb#YR3krMxx6k5c1aNLh~_a1le0DrT}RI?`rsG4P@ z6LB$@UloI|2w@xoMi7;lsV6gwS$K}Gd-(Wz7vWjn=l&c6O2K4+Pb7{p-LQx^h@+d9 z&Uv3$U}Z@mJ|~_s=z_$LT$f#b<6Lss&oc!ho1P~Yh{aMD%U#UMhDtn399C3~^8GoN z70z3n)oPu!@5x^nDrhSiuG1Vt0!v6D1rajpsGtf95n44;Or&W)?%^MG{3&wD(d0egat9cG(j`N3qySBSu?W1M(KqFRpK2d-P^xs+Wq|i9yW68JOR;~00006VoOIv01p5M00-bWuZREu010qNS#tmY zE+YT{E+YYWr9XB6000McNliru=L{bdApz>B1&aUx02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{009?CL_t(Y$L&=i5`!=hJQxhFPk^e*egTQzfee4UQSD8X(`u4+*Q0#K{g347{=3V5Ei0Jz@@Cxj-7V0YdF06>$Ly*Al?p=YuT z-fa~7-J~V#lB9j9GoCYx&nQ7g3DUqtl?R;P%BW%w7ZH3C&$=FX zHc6mc#h7~S<60yT6^g(r^^5KUxr&41aA28u)rBJyY5phM#T)D{kqKtzoIn5o002ov JPDHLkV1nGNUmE}b literal 0 HcmV?d00001 diff --git a/Crawler/assets/items/Ring.png b/Crawler/assets/items/Ring.png new file mode 100644 index 0000000000000000000000000000000000000000..90476243348a26b994a2311ec1c02bec7b21add1 GIT binary patch literal 730 zcmV<00ww*4P)EX>4Tx04R}tkv&MmKpe$iTcsiu2Q#P$W~fefQ7Mk4ibb$c+6t{Ym|Xe=O&XFE z7e~Rh;NZt%)xpJCR|i)?5c~jfb#YR3krMxx6k5c1aNLh~_a1le0DrT}RI?`rsG4P@ z6LB$@UloI|2w@xoMi7;lsV6gwS$K}Gd-(Wz7vWjn=l&c6O2K4+Pb7{p-LQx^h@+d9 z&Uv3$U}Z@mJ|~_s=z_$LT$f#b<6Lss&oc!ho1P~Yh{aMD%U#UMhDtn399C3~^8GoN z70z3n)oPu!@5x^nDrhSiuG1Vt0!v6D1rajpsGtf95n44;Or&W)?%^MG{3&wD(d0egat9cG(j`N3qySBSu?W1M(KqFRpK2d-P^xs+Wq|i9yW68JOR;~00006VoOIv01p5M00-bWuZREu010qNS#tmY zE+YT{E+YYWr9XB6000McNliru=L{bd9whm4`|tn&02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{006Q{L_t(Y$75g^1*2dTFp{G9`}Uy!=wh6n>li7v0Gq+Y zTEs}I;phf!k5`1tdoH|BQiw2o-yZb;`}Uy!$cEqo+v63ns$(Lg@xY4nq`Qn53y2AK zWZ=2*KBI<$0t31)m}u#GqJoH0z=Y5BG_?R0G{mGJ1_lO(`}L0hX&yv39z4K^GbTbQ zgBV}nay`*S1+LtRY%n(0lT_HD`$9uO0d6q9VuIu}j&2d9`GjHs0P~?$^>(IaAOHXW M07*qoM6N<$f_(iqq5uE@ literal 0 HcmV?d00001