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