Parse Item sets from config. Fix constness of item set getter, and change AddSetBonus function to be statically used instead, makes more sense.
This commit is contained in:
parent
0b912e199a
commit
6d4f024d3c
@ -104,8 +104,8 @@ public:
|
||||
inline int&get(ItemAttribute a){
|
||||
return attributes[a];
|
||||
}
|
||||
inline const int get_readOnly(ItemAttribute a)const{
|
||||
return attributes.at(a);
|
||||
inline const int get_readOnly(ItemAttribute a){
|
||||
return attributes[a];
|
||||
}
|
||||
inline static AttributeData GetDisplayInfo(ItemAttribute a){
|
||||
return data[a];
|
||||
|
@ -123,6 +123,9 @@ Crawler::Crawler()
|
||||
std::string ITEM_CONFIG = CONFIG_PATH + "item_config"_S;
|
||||
utils::datafile::Read(DATA,ITEM_CONFIG);
|
||||
|
||||
std::string ITEM_SET_CONFIG = CONFIG_PATH + "item_set_config"_S;
|
||||
utils::datafile::Read(DATA,ITEM_SET_CONFIG);
|
||||
|
||||
for(auto&key:DATA.GetProperty("ItemConfiguration").GetKeys()){
|
||||
std::string config = DATA["ItemConfiguration"][key.first].GetString();
|
||||
utils::datafile::Read(DATA,CONFIG_PATH + "item_directory"_S + config);
|
||||
|
@ -80,6 +80,8 @@ void ItemInfo::InitializeItems(){
|
||||
ItemAttributable::stringToAttribute[ItemAttributable::GetDisplayInfo(attr).name]=attr;
|
||||
}
|
||||
|
||||
InitializeSets();
|
||||
|
||||
for(auto&key:DATA["ItemCategory"].GetKeys()){
|
||||
ITEM_CATEGORIES[key.first];
|
||||
Inventory::sortedInv[key.first];
|
||||
@ -93,6 +95,7 @@ void ItemInfo::InitializeItems(){
|
||||
img.Load(imgPath);
|
||||
|
||||
std::string scriptName="",description="",category="";
|
||||
std::string setName="";
|
||||
float castTime=0;
|
||||
std::vector<std::string> slot;
|
||||
float cooldownTime="Item.Item Cooldown Time"_F;
|
||||
@ -123,6 +126,9 @@ void ItemInfo::InitializeItems(){
|
||||
for(int i=0;i<data[key.first]["StatValues"].GetValueCount();i++){
|
||||
statValueList.push_back(ItemAttributable::GetAttributeFromString(data[key.first]["StatValues"].GetString(i)));
|
||||
}
|
||||
}else
|
||||
if(keyName=="PartofSet"){
|
||||
setName=data[key.first][keyName].GetString();
|
||||
}else{ //THis is a custom override modifier for a script. NO-OP
|
||||
}
|
||||
}
|
||||
@ -153,6 +159,7 @@ void ItemInfo::InitializeItems(){
|
||||
it.castTime=castTime;
|
||||
it.cooldownTime=cooldownTime;
|
||||
it.slot=EquipSlot::NONE;
|
||||
it.set=setName;
|
||||
if(slot.size()>0){
|
||||
for(std::string&s:slot){
|
||||
if(!nameToEquipSlot.count(s))ERR("WARNING! Tried to add item "<<it.name<<" to slot "<<s<<" which doesn't exist!");
|
||||
@ -468,7 +475,11 @@ const Stats&EnhancementInfo::operator[](int level)const{
|
||||
return enhancementStats[level];
|
||||
}
|
||||
|
||||
const ItemSet&Item::GetItemSet()const{
|
||||
bool ItemInfo::HasItemSet(){
|
||||
return ItemSet::sets.count(set);
|
||||
}
|
||||
|
||||
const ItemSet&ItemInfo::ItemSet()const{
|
||||
return ItemSet::sets[set];
|
||||
};
|
||||
|
||||
@ -477,10 +488,10 @@ const Stats&ItemSet::operator[](int setPieces)const{
|
||||
return setBonuses[setPieces];
|
||||
};
|
||||
|
||||
void ItemSet::AddSetBonus(int pieceCount,const Stats&bonuses){
|
||||
void ItemSet::AddSetBonus(std::string setName,int pieceCount,Stats&bonuses){
|
||||
if(pieceCount<=0||pieceCount>=9)ERR("Piece count is invalid! Expecting a value (1-8) but got "<<pieceCount);
|
||||
for(int i=pieceCount-1;i<setBonuses.size();i++){
|
||||
setBonuses[i]+=bonuses;
|
||||
for(int i=pieceCount-1;i<sets[setName].setBonuses.size();i++){
|
||||
sets[setName].setBonuses[i]+=bonuses;
|
||||
}
|
||||
}
|
||||
|
||||
@ -516,4 +527,23 @@ void EnhancementInfo::SetAttribute(int enhanceLevel,ItemAttribute attribute,int
|
||||
enhancementStats.push_back({});
|
||||
}
|
||||
enhancementStats[enhanceLevel].A(attribute)=value;
|
||||
}
|
||||
|
||||
void ItemInfo::InitializeSets(){
|
||||
for(auto&key:DATA["ItemSet"].GetKeys()){
|
||||
std::string setName=key.first;
|
||||
datafile&setInfo=DATA["ItemSet"][setName];
|
||||
|
||||
for(int pieceCount=1;pieceCount<=8;pieceCount++){
|
||||
if(setInfo.HasProperty(std::to_string(pieceCount))){
|
||||
datafile&statInfo=setInfo[std::to_string(pieceCount)];
|
||||
Stats bonuses;
|
||||
for(auto&key:statInfo.GetKeys()){
|
||||
ItemAttribute attr=bonuses.GetAttributeFromString(key.first);
|
||||
bonuses.A(attr)=statInfo[key.first].GetInt(0);
|
||||
}
|
||||
ItemSet::AddSetBonus(setName,pieceCount,bonuses);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -67,9 +67,9 @@ enum class EquipSlot{
|
||||
|
||||
struct Stats:ItemAttributable{
|
||||
public:
|
||||
inline Stats&operator+=(const Stats&rhs){
|
||||
inline Stats&operator+=(Stats&rhs){
|
||||
for(ItemAttribute a=ItemAttribute(int(ItemAttribute::ENUM_START)+1);a<ItemAttribute::ENUM_END;a=ItemAttribute(int(a)+1)){
|
||||
A(a)+=rhs.A_Read(a);
|
||||
A(a)+=rhs.get_readOnly(a);
|
||||
}
|
||||
return *this;
|
||||
};
|
||||
@ -83,13 +83,14 @@ public:
|
||||
const Stats&operator[](int level)const;
|
||||
};
|
||||
|
||||
//You cannot create instances of this class, access sets from ItemSet::sets and add the appropriate set bonuses.
|
||||
class ItemSet{
|
||||
friend class Item;
|
||||
friend class ItemInfo;
|
||||
static std::map<std::string,ItemSet>sets;
|
||||
std::array<Stats,8>setBonuses;
|
||||
public:
|
||||
//Specify the piece count(1-8) for a set bonus to be applied.
|
||||
void AddSetBonus(int pieceCount,const Stats&bonuses);
|
||||
static void AddSetBonus(std::string setName,int pieceCount,Stats&bonuses);
|
||||
//Gets a set bonus based on number of pieces (1-8)
|
||||
const Stats&operator[](int setPieces)const;
|
||||
};
|
||||
@ -101,7 +102,6 @@ private:
|
||||
//The amount in the current item stack.
|
||||
uint32_t amt;
|
||||
uint8_t enhancementLevel;
|
||||
std::string set;
|
||||
ItemInfo*it;
|
||||
public:
|
||||
Item();
|
||||
@ -113,7 +113,6 @@ public:
|
||||
EquipSlot GetEquipSlot();
|
||||
Decal*Decal();
|
||||
ItemScript&OnUseAction();
|
||||
const ItemSet&GetItemSet()const;
|
||||
float CastTime();
|
||||
float CooldownTime();
|
||||
bool IsBlank();
|
||||
@ -178,6 +177,7 @@ class ItemInfo{
|
||||
EquipSlot slot;
|
||||
EnhancementInfo enhancement;
|
||||
Decal*img;
|
||||
std::string set;
|
||||
//Returns true if the item can be used, false otherwise
|
||||
std::string useFunc="";
|
||||
//Custom properties for this specific item's script.
|
||||
@ -186,6 +186,7 @@ class ItemInfo{
|
||||
|
||||
private:
|
||||
static void InitializeScripts();
|
||||
static void InitializeSets();
|
||||
static std::map<std::string,EquipSlot>nameToEquipSlot;
|
||||
public:
|
||||
static void InitializeItems();
|
||||
@ -201,6 +202,9 @@ public:
|
||||
float CastTime();
|
||||
float CooldownTime();
|
||||
EquipSlot Slot();
|
||||
bool HasItemSet();
|
||||
//NOTE: Not every item has a set! Verify with HasItemSet() first!
|
||||
const ItemSet&ItemSet()const;
|
||||
};
|
||||
|
||||
class ItemOverlay{
|
||||
|
@ -39,7 +39,7 @@ All rights reserved.
|
||||
#define VERSION_MAJOR 0
|
||||
#define VERSION_MINOR 2
|
||||
#define VERSION_PATCH 1
|
||||
#define VERSION_BUILD 3460
|
||||
#define VERSION_BUILD 3470
|
||||
|
||||
#define stringify(a) stringify_(a)
|
||||
#define stringify_(a) #a
|
||||
|
@ -42,6 +42,9 @@ class_list = Warrior, Thief, Ranger, Trapper, Wizard, Witch
|
||||
# Items Config
|
||||
item_config = items/items.txt
|
||||
|
||||
# Item Set Config
|
||||
item_set_config = items/ItemSets.txt
|
||||
|
||||
# Path to items configuration
|
||||
item_directory = items/
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user