diff --git a/Adventures in Lestoria/Adventures in Lestoria.vcxproj b/Adventures in Lestoria/Adventures in Lestoria.vcxproj index eff6b1d5..dee6c8bf 100644 --- a/Adventures in Lestoria/Adventures in Lestoria.vcxproj +++ b/Adventures in Lestoria/Adventures in Lestoria.vcxproj @@ -491,6 +491,10 @@ + + + + @@ -944,6 +948,10 @@ + + + + @@ -1175,6 +1183,7 @@ + @@ -1210,7 +1219,6 @@ - diff --git a/Adventures in Lestoria/Adventures in Lestoria.vcxproj.filters b/Adventures in Lestoria/Adventures in Lestoria.vcxproj.filters index b417558f..796793ae 100644 --- a/Adventures in Lestoria/Adventures in Lestoria.vcxproj.filters +++ b/Adventures in Lestoria/Adventures in Lestoria.vcxproj.filters @@ -672,6 +672,9 @@ Header Files\State + + Header Files + @@ -1181,6 +1184,9 @@ Source Files\Interface + + Source Files + @@ -1379,7 +1385,7 @@ Configurations\Story - + Configurations\Items diff --git a/Adventures in Lestoria/Item.cpp b/Adventures in Lestoria/Item.cpp index 96260400..ee928df2 100644 --- a/Adventures in Lestoria/Item.cpp +++ b/Adventures in Lestoria/Item.cpp @@ -51,6 +51,7 @@ All rights reserved. #include "steam/isteamuserstats.h" #endif #include +#include "ItemEnchant.h" INCLUDE_game INCLUDE_DATA @@ -396,6 +397,8 @@ void ItemInfo::InitializeItems(){ LOG(std::format("Item Fragment {} generated...",fragmentName)); } #pragma endregion + + ItemEnchantInfo::Initialize(); ITEM_DATA.SetInitialized(); ITEM_CATEGORIES.SetInitialized(); diff --git a/Adventures in Lestoria/ItemEnchant.cpp b/Adventures in Lestoria/ItemEnchant.cpp new file mode 100644 index 00000000..fbb975ce --- /dev/null +++ b/Adventures in Lestoria/ItemEnchant.cpp @@ -0,0 +1,141 @@ +#pragma region License +/* +License (OLC-3) +~~~~~~~~~~~~~~~ + +Copyright 2024 Joshua Sigona + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions or derivations of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +2. Redistributions or derivative works in binary form must reproduce the above +copyright notice. This list of conditions and the following disclaimer must be +reproduced in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may +be used to endorse or promote products derived from this software without specific +prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + +Portions of this software are copyright © 2024 The FreeType +Project (www.freetype.org). Please see LICENSE_FT.txt for more information. +All rights reserved. +*/ +#pragma endregion + +#include "olcUTIL_DataFile.h" +#include "ItemEnchant.h" +#include "DEFINES.h" +#include + +INCLUDE_DATA + +std::unordered_mapItemEnchantInfo::ENCHANT_LIST; +std::unordered_mapItemEnchantInfo::ENCHANT_CATEGORIES; + +void ItemEnchantInfo::Initialize(){ + float minCategoryRollWeight{}; + float maxCategoryRollWeight{}; + for(const auto&[key,size]:DATA["Item Enchants"]){ + ItemEnchantCategory enchantCategory{}; + if(key=="General Enchants"){ + enchantCategory=ItemEnchantCategory::GENERAL; + }else + if(key=="Class Enchants"){ + enchantCategory=ItemEnchantCategory::CLASS; + }else + if(key=="Unique Enchants"){ + enchantCategory=ItemEnchantCategory::UNIQUE; + }else ERR(std::format("WARNING! Enchant type {} is not supported! THIS SHOULD NOT BE HAPPENING! Please check ItemEnchants.txt",key)); + + datafile&enchantData=DATA["Item Enchants"][key]; + + ItemEnchantCategoryData categoryData; + + minCategoryRollWeight=maxCategoryRollWeight; + maxCategoryRollWeight+=enchantData["Percent Chance"].GetReal(); + + categoryData.displayCol=enchantData["Enchant Display Color"].GetPixel(); + categoryData.weightedRollRange={minCategoryRollWeight,maxCategoryRollWeight}; + + ENCHANT_CATEGORIES.insert({enchantCategory,categoryData}); + + for(const auto&[key,size]:enchantData){ + if(key=="Percent Chance"||key=="Enchant Display Color")continue; + + const auto MakeEnchant=[](const std::string_view keyName,datafile&enchant){ + ItemEnchantInfo newEnchant; + newEnchant.name=keyName; + newEnchant.description=enchant["Description"].GetString(); + using enum AbilitySlot; + const std::unordered_mapaffectSlots{ + {"Auto Attack",AUTO_ATTACK}, + {"Right Click Ability",RIGHT_CLICK}, + {"Ability 1",ABILITY_1}, + {"Ability 2",ABILITY_2}, + {"Ability 3",ABILITY_3}, + }; + + if(enchant.HasProperty("Affects")){ + std::string affectStr{enchant["Affects"].GetString()}; + if(!affectSlots.count(affectStr))ERR(std::format("WARNING! Could not find translate ability affect slot name {} to a valid slot! Valid slot names are: \"Auto Attack, Right Click Ability, Ability 1, Ability 2, Ability 3\"",affectStr)); + newEnchant.abilitySlot=affectSlots.at(affectStr); + } + + size_t statModifierInd{}; + while(enchant.HasProperty(std::format("Stat Modifier[{}]",statModifierInd))){ + const datafile&stat{enchant[std::format("Stat Modifier[{}]",statModifierInd)]}; + newEnchant.minStatModifiers.A(stat.GetString(0))=stat.GetReal(1); + newEnchant.maxStatModifiers.A(stat.GetString(0))=stat.GetReal(2); + statModifierInd++; + } + + for(auto&[key,size]:enchant){ + if(key=="Description"||key=="Affects"||key.starts_with("Stat Modifier["))continue; + const auto&result{newEnchant.config.insert({key,enchant[key].GetReal()})}; + const bool InsertFailed{!result.second}; + if(InsertFailed)ERR(std::format("WARNING! Enchant {} already had an extra property named {}. Duplicates not allowed!",keyName,key)); + } + + return newEnchant; + }; + + using enum ItemEnchantCategory; + if(enchantCategory==CLASS){ + Class itemEnchantClass{classutils::StringToClass(key)}; + datafile&classEnchantData{enchantData[key]}; + for(const auto&[key,size]:classEnchantData){ + ItemEnchantInfo newEnchant{MakeEnchant(key,classEnchantData[key])}; + const auto&result{ENCHANT_LIST.insert({key,newEnchant})}; + const bool InsertFailed{!result.second}; + if(InsertFailed)ERR(std::format("WARNING! Enchant {} already existed in Enchantment List! Duplicates are not allowed!",key)); + } + }else{ + ItemEnchantInfo newEnchant{MakeEnchant(key,enchantData[key])}; + const auto&result{ENCHANT_LIST.insert({key,newEnchant})}; + const bool InsertFailed{!result.second}; + if(InsertFailed)ERR(std::format("WARNING! Enchant {} already existed in Enchantment List! Duplicates are not allowed!",key)); + } + } + } +} + +const ItemEnchantInfo&ItemEnchantInfo::GetEnchant(const std::string_view name){ + return ENCHANT_LIST.at(std::string(name)); +} + +ItemEnchant::ItemEnchant(const std::string_view enchantName) +:enchant(ItemEnchantInfo::GetEnchant(enchantName)){} \ No newline at end of file diff --git a/Adventures in Lestoria/ItemEnchant.h b/Adventures in Lestoria/ItemEnchant.h new file mode 100644 index 00000000..759f1242 --- /dev/null +++ b/Adventures in Lestoria/ItemEnchant.h @@ -0,0 +1,87 @@ +#pragma region License +/* +License (OLC-3) +~~~~~~~~~~~~~~~ + +Copyright 2024 Joshua Sigona + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions or derivations of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +2. Redistributions or derivative works in binary form must reproduce the above +copyright notice. This list of conditions and the following disclaimer must be +reproduced in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may +be used to endorse or promote products derived from this software without specific +prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + +Portions of this software are copyright © 2024 The FreeType +Project (www.freetype.org). Please see LICENSE_FT.txt for more information. +All rights reserved. +*/ +#pragma endregion +#pragma once + +#include "AttributableStat.h" +#include "Pixel.h" +#include "Class.h" + +class ItemEnchantInfo{ +public: + static void Initialize(); + const static ItemEnchantInfo&GetEnchant(const std::string_view name); + + const std::string_view Name(); + const std::string_view Description(); + const float GetConfigValue(const std::string_view keyName); + enum class AbilitySlot{ + AUTO_ATTACK, + RIGHT_CLICK, + ABILITY_1, + ABILITY_2, + ABILITY_3, + }; +private: + enum class ItemEnchantCategory{ + GENERAL, + CLASS, + UNIQUE, + }; + class ItemEnchantCategoryData{ + friend class ItemEnchantInfo; + using LowestNumber=int; + using HighestNumber=int; + std::pairweightedRollRange; + Pixel displayCol; + }; + std::string name; + std::string description; + std::optionalabilitySlot; + ItemAttributable minStatModifiers; + ItemAttributable maxStatModifiers; + std::unordered_mapconfig; + static std::unordered_mapENCHANT_LIST; + static std::unordered_mapENCHANT_CATEGORIES; +}; + +class ItemEnchant:public ItemAttributable{ +public: + ItemEnchant(const std::string_view enchantName); +private: + const ItemEnchantInfo&enchant; +}; diff --git a/Adventures in Lestoria/Version.h b/Adventures in Lestoria/Version.h index 0c15c7c2..bf929047 100644 --- a/Adventures in Lestoria/Version.h +++ b/Adventures in Lestoria/Version.h @@ -39,7 +39,7 @@ All rights reserved. #define VERSION_MAJOR 1 #define VERSION_MINOR 2 #define VERSION_PATCH 3 -#define VERSION_BUILD 10487 +#define VERSION_BUILD 10498 #define stringify(a) stringify_(a) #define stringify_(a) #a diff --git a/Adventures in Lestoria/ItemEnchants.txt b/Adventures in Lestoria/assets/config/items/ItemEnchants.txt similarity index 98% rename from Adventures in Lestoria/ItemEnchants.txt rename to Adventures in Lestoria/assets/config/items/ItemEnchants.txt index 8053914c..1a2df4fd 100644 --- a/Adventures in Lestoria/ItemEnchants.txt +++ b/Adventures in Lestoria/assets/config/items/ItemEnchants.txt @@ -272,7 +272,7 @@ Item Enchants } Auto Guard { - Description = "If Block is up and you take damage, Block will activate immediately, blocking the attack." + Description = "If Block is up and you take damage, Block will activate immediately, preventing the attack." Affects = Right Click Ability # Stat, Lowest, Highest Value # Stat Modifier[0] = ..., 0, 0 @@ -286,7 +286,7 @@ Item Enchants } Advance Shield { - Description = "Block no longer grants invulnerability or knockback reduction. Block now grants a shield equal to 20% of your health for 10 seconds." + Description = "Block no longer grants invulnerability or knockback reduction. Block now grants a shield equal to 20% of your health for 10 seconds. You can perform other actions while the shield is active." Affects = Right Click Ability # Stat, Lowest, Highest Value # Stat Modifier[0] = ..., 0, 0 @@ -433,11 +433,11 @@ Item Enchants Stat Modifier[0] = Attack %, 4, 8 Stat Modifier[1] = Crit Rate, 5, 10 Stat Modifier[2] = CDR, 5, 10 - Stat Modifier[3] = Crit Dmg 15, 20 + Stat Modifier[3] = Crit Dmg, 15, 20 } Lethal Tempo { - Description = "Increases Attack Speed by 5% with each strike, up to 25%." + Description = "Increases Attack Speed by 5% with each strike, up to 25%. Lasts for 5 seconds." # Stat, Lowest, Highest Value # Stat Modifier[0] = ..., 0, 0 } diff --git a/Adventures in Lestoria/assets/config/items/items.txt b/Adventures in Lestoria/assets/config/items/items.txt index 0aa22a34..1aab9a46 100644 --- a/Adventures in Lestoria/assets/config/items/items.txt +++ b/Adventures in Lestoria/assets/config/items/items.txt @@ -1,6 +1,7 @@ ItemConfiguration { Item Database = ItemDatabase.txt + Item Enchants = ItemEnchants.txt Item Scripts = ItemScript.txt Item Categories = ItemCategory.txt Equipment = Equipment.txt diff --git a/x64/Release/Adventures in Lestoria.exe b/x64/Release/Adventures in Lestoria.exe index 60c04912..7f507225 100644 Binary files a/x64/Release/Adventures in Lestoria.exe and b/x64/Release/Adventures in Lestoria.exe differ