#pragma once #include "Item.h" #include "safemap.h" #include "DEFINES.h" #include "Crawler.h" INCLUDE_game INCLUDE_DATA INCLUDE_GFX safemapITEM_DATA; safemapITEM_SCRIPTS; safemap>ITEM_CATEGORIES; ItemInfo::ItemInfo() :customProps({nullptr,nullptr}),img(nullptr){} void ItemInfo::InitializeItems(){ InitializeScripts(); for(auto&key:DATA["ItemCategory"].GetKeys()){ ITEM_CATEGORIES[key.first]; } for(auto&key:DATA["ItemDatabase"].GetKeys()){ std::string imgPath="assets/"+"item_img_directory"_S+key.first+".png"; Renderable&img=GFX["item_img_directory"_S+key.first+".png"]; img.Load(imgPath); std::string scriptName="",description="",category=""; for(auto&itemKey:DATA["ItemDatabase"][key.first].GetKeys()){ std::string keyName=itemKey.first; if(keyName=="Description"){ description=DATA["ItemDatabase"][key.first][keyName].GetString(); }else if(keyName=="ItemCategory"){ category=DATA["ItemDatabase"][key.first][keyName].GetString(); }else if(keyName=="ItemScript"){ scriptName=DATA["ItemDatabase"][key.first][keyName].GetString(); }else{ //THis is a custom override modifier for a script. NO-OP } } if(scriptName!=""){ if(!ITEM_SCRIPTS.count(scriptName)){ std::cout<<"Could not load script "<HasProperty(prop)) return (*customProps)[prop].GetInt(); else return (*scriptProps)[prop].GetInt(); }; float ItemProps::GetFloatProp(std::string prop){ if(customProps->HasProperty(prop)) return (*customProps)[prop].GetReal(); else return (*scriptProps)[prop].GetReal(); }; std::string ItemProps::GetStringProp(std::string prop){ if(customProps->HasProperty(prop)) return (*customProps)[prop].GetString(); else return (*scriptProps)[prop].GetString(); }; void ItemInfo::InitializeScripts(){ ITEM_SCRIPTS["Restore"]=[](Crawler*game,ItemProps props){ game->GetPlayer()->Heal(props.GetIntProp("HP Restore")); game->GetPlayer()->Heal(game->GetPlayer()->GetMaxHealth()*props.GetIntProp("HP % Restore")/100.f); game->GetPlayer()->RestoreMana(props.GetIntProp("MP Restore")); game->GetPlayer()->RestoreMana(game->GetPlayer()->GetMaxMana()*props.GetIntProp("MP % Restore")/100.f); return true; }; ITEM_SCRIPTS.SetInitialized(); std::cout<=_inventory.at(it).Amt()){ int count=0; std::vector&sortedList=sortedInv.at(_inventory.at(it).Category()); for(std::string&itemName:sortedList){ if(itemName==it)break; count++; } sortedList.erase(sortedList.begin()+count); _inventory.erase(it); }else{ _inventory.at(it).amt-=amt; } } std::vector&Inventory::get(ITCategory itemCategory){ return sortedInv.at(itemCategory); } void Inventory::InsertIntoSortedInv(IT item){ sortedInv.at(ITEM_DATA[item].category).push_back(item); } bool Inventory::ExecuteAction(IT item){ return ITEM_SCRIPTS.at(ITEM_DATA.at(item).useFunc)(game,ITEM_DATA[item].customProps); } bool Inventory::SwapItems(IT it,IT it2){ ItemInfo&itemInfo1=ITEM_DATA.at(it); ItemInfo&itemInfo2=ITEM_DATA.at(it2); if(itemInfo1.category!=itemInfo2.category)return false; ITCategory category=itemInfo1.category; Item item1=GetItem(it); Item item2=GetItem(it2); if(item1.Amt()<=0&&item2.Amt()<=0)return false; std::vectorinv=sortedInv.at(category); auto index1=std::find(inv.begin(),inv.end(),it); auto index2=std::find(inv.begin(),inv.end(),it2); std::swap(*index1,*index2); return true; }