Switch to built-in uppercase hexadecimal format display when encoding URIs sending save files (emscripten version). Implement variable find and replace features when loading in Item Enchants. Grammar changes to item enchants config file. Convert numerical values to variable config values in item enchants config file. Release Build 10511.

mac-build
sigonasr2 4 months ago
parent 23fc505b12
commit 1319a91d11
  1. 10
      Adventures in Lestoria/Adventures in Lestoria.vcxproj
  2. 54
      Adventures in Lestoria/ItemEnchant.cpp
  3. 15
      Adventures in Lestoria/ItemEnchant.h
  4. 5
      Adventures in Lestoria/Pixel.cpp
  5. 2
      Adventures in Lestoria/Pixel.h
  6. 3
      Adventures in Lestoria/SaveFile.cpp
  7. 2
      Adventures in Lestoria/Version.h
  8. 408
      Adventures in Lestoria/assets/config/items/ItemEnchants.txt
  9. BIN
      x64/Release/Adventures in Lestoria.exe

@ -217,7 +217,7 @@
<SDLCheck>true</SDLCheck> <SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpp20</LanguageStandard> <LanguageStandard>stdcpplatest</LanguageStandard>
<AdditionalIncludeDirectories>C:\Users\LabUser\source\repos\AdventuresInLestoria\Adventures in Lestoria\steam;C:\Users\LabUser\source\repos\AdventuresInLestoria\Adventures in Lestoria\discord-files;C:\Users\LabUser\Documents\include;C:\Users\sigon\source\repos\AdventuresInLestoria\Adventures in Lestoria\steam;C:\Users\sigon\source\repos\AdventuresInLestoria\Adventures in Lestoria\discord-files;C:\Users\sigon\OneDrive\Documents\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>C:\Users\LabUser\source\repos\AdventuresInLestoria\Adventures in Lestoria\steam;C:\Users\LabUser\source\repos\AdventuresInLestoria\Adventures in Lestoria\discord-files;C:\Users\LabUser\Documents\include;C:\Users\sigon\source\repos\AdventuresInLestoria\Adventures in Lestoria\steam;C:\Users\sigon\source\repos\AdventuresInLestoria\Adventures in Lestoria\discord-files;C:\Users\sigon\OneDrive\Documents\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalOptions>/MP20 %(AdditionalOptions)</AdditionalOptions> <AdditionalOptions>/MP20 %(AdditionalOptions)</AdditionalOptions>
<TreatSpecificWarningsAsErrors>4099;5030;4715;4172;4834</TreatSpecificWarningsAsErrors> <TreatSpecificWarningsAsErrors>4099;5030;4715;4172;4834</TreatSpecificWarningsAsErrors>
@ -243,7 +243,7 @@
<SDLCheck>true</SDLCheck> <SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpp20</LanguageStandard> <LanguageStandard>stdcpplatest</LanguageStandard>
<AdditionalIncludeDirectories>C:\Users\sigon\source\repos\AdventuresInLestoria\Adventures in Lestoria\steam;C:\Users\sigon\source\repos\AdventuresInLestoria\Adventures in Lestoria\discord-files;C:\Users\sigon\OneDrive\Documents\include</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>C:\Users\sigon\source\repos\AdventuresInLestoria\Adventures in Lestoria\steam;C:\Users\sigon\source\repos\AdventuresInLestoria\Adventures in Lestoria\discord-files;C:\Users\sigon\OneDrive\Documents\include</AdditionalIncludeDirectories>
<AdditionalOptions>/MP20 %(AdditionalOptions)</AdditionalOptions> <AdditionalOptions>/MP20 %(AdditionalOptions)</AdditionalOptions>
<TreatSpecificWarningsAsErrors>4099;5030;4715;4172;4834</TreatSpecificWarningsAsErrors> <TreatSpecificWarningsAsErrors>4099;5030;4715;4172;4834</TreatSpecificWarningsAsErrors>
@ -274,7 +274,7 @@
<SDLCheck>true</SDLCheck> <SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpp20</LanguageStandard> <LanguageStandard>stdcpplatest</LanguageStandard>
<AdditionalOptions>/MP20 %(AdditionalOptions)</AdditionalOptions> <AdditionalOptions>/MP20 %(AdditionalOptions)</AdditionalOptions>
<AdditionalIncludeDirectories>C:\Users\sigon\source\repos\AdventuresInLestoria\Adventures in Lestoria\steam;C:\Users\sigon\source\repos\AdventuresInLestoria\Adventures in Lestoria\discord-files;C:\Users\sigon\OneDrive\Documents\include</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>C:\Users\sigon\source\repos\AdventuresInLestoria\Adventures in Lestoria\steam;C:\Users\sigon\source\repos\AdventuresInLestoria\Adventures in Lestoria\discord-files;C:\Users\sigon\OneDrive\Documents\include</AdditionalIncludeDirectories>
<MultiProcessorCompilation>true</MultiProcessorCompilation> <MultiProcessorCompilation>true</MultiProcessorCompilation>
@ -336,7 +336,7 @@
<AdditionalDependencies>$(CoreLibraryDependencies);%(AdditionalDependencies);discord_game_sdk.dll.lib</AdditionalDependencies> <AdditionalDependencies>$(CoreLibraryDependencies);%(AdditionalDependencies);discord_game_sdk.dll.lib</AdditionalDependencies>
</Link> </Link>
<ClCompile> <ClCompile>
<LanguageStandard>stdcpp20</LanguageStandard> <LanguageStandard>stdcpplatest</LanguageStandard>
<AdditionalIncludeDirectories>C:\Users\sigon\source\repos\AdventuresInLestoria\Adventures in Lestoria\discord-files;</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>C:\Users\sigon\source\repos\AdventuresInLestoria\Adventures in Lestoria\discord-files;</AdditionalIncludeDirectories>
<MultiProcessorCompilation>true</MultiProcessorCompilation> <MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile> </ClCompile>
@ -353,7 +353,7 @@
<AdditionalDependencies>$(CoreLibraryDependencies);%(AdditionalDependencies);discord_game_sdk.dll.lib</AdditionalDependencies> <AdditionalDependencies>$(CoreLibraryDependencies);%(AdditionalDependencies);discord_game_sdk.dll.lib</AdditionalDependencies>
</Link> </Link>
<ClCompile> <ClCompile>
<LanguageStandard>stdcpp20</LanguageStandard> <LanguageStandard>stdcpplatest</LanguageStandard>
<AdditionalIncludeDirectories>C:\Users\sigon\source\repos\AdventuresInLestoria\Adventures in Lestoria\discord-files;</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>C:\Users\sigon\source\repos\AdventuresInLestoria\Adventures in Lestoria\discord-files;</AdditionalIncludeDirectories>
<MultiProcessorCompilation>true</MultiProcessorCompilation> <MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile> </ClCompile>

@ -39,7 +39,9 @@ All rights reserved.
#include "olcUTIL_DataFile.h" #include "olcUTIL_DataFile.h"
#include "ItemEnchant.h" #include "ItemEnchant.h"
#include "DEFINES.h" #include "DEFINES.h"
#include "Class.h"
#include <unordered_set> #include <unordered_set>
#include <algorithm>
INCLUDE_DATA INCLUDE_DATA
@ -47,6 +49,9 @@ std::unordered_map<std::string,ItemEnchantInfo>ItemEnchantInfo::ENCHANT_LIST;
std::unordered_map<ItemEnchantInfo::ItemEnchantCategory,ItemEnchantInfo::ItemEnchantCategoryData>ItemEnchantInfo::ENCHANT_CATEGORIES; std::unordered_map<ItemEnchantInfo::ItemEnchantCategory,ItemEnchantInfo::ItemEnchantCategoryData>ItemEnchantInfo::ENCHANT_CATEGORIES;
void ItemEnchantInfo::Initialize(){ void ItemEnchantInfo::Initialize(){
ENCHANT_LIST.clear();
ENCHANT_CATEGORIES.clear();
float minCategoryRollWeight{}; float minCategoryRollWeight{};
float maxCategoryRollWeight{}; float maxCategoryRollWeight{};
for(const auto&[key,size]:DATA["Item Enchants"]){ for(const auto&[key,size]:DATA["Item Enchants"]){
@ -76,10 +81,11 @@ void ItemEnchantInfo::Initialize(){
for(const auto&[key,size]:enchantData){ for(const auto&[key,size]:enchantData){
if(key=="Percent Chance"||key=="Enchant Display Color")continue; if(key=="Percent Chance"||key=="Enchant Display Color")continue;
const auto MakeEnchant=[](const std::string_view keyName,datafile&enchant){ const auto MakeEnchant=[enchantCategory](const std::string_view keyName,datafile&enchant){
ItemEnchantInfo newEnchant; ItemEnchantInfo newEnchant;
newEnchant.category=enchantCategory;
newEnchant.name=keyName; newEnchant.name=keyName;
newEnchant.description=enchant["Description"].GetString(); std::string enchantDescription{enchant["Description"].GetString()};
using enum AbilitySlot; using enum AbilitySlot;
const std::unordered_map<std::string,AbilitySlot>affectSlots{ const std::unordered_map<std::string,AbilitySlot>affectSlots{
{"Auto Attack",AUTO_ATTACK}, {"Auto Attack",AUTO_ATTACK},
@ -94,7 +100,6 @@ void ItemEnchantInfo::Initialize(){
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)); 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); newEnchant.abilitySlot=affectSlots.at(affectStr);
} }
size_t statModifierInd{}; size_t statModifierInd{};
while(enchant.HasProperty(std::format("Stat Modifier[{}]",statModifierInd))){ while(enchant.HasProperty(std::format("Stat Modifier[{}]",statModifierInd))){
const datafile&stat{enchant[std::format("Stat Modifier[{}]",statModifierInd)]}; const datafile&stat{enchant[std::format("Stat Modifier[{}]",statModifierInd)]};
@ -103,13 +108,25 @@ void ItemEnchantInfo::Initialize(){
statModifierInd++; statModifierInd++;
} }
auto IsRequiredKey=[](const std::string_view key){return key=="Description"||key=="Affects"||key.starts_with("Stat Modifier[");};
for(auto&[key,size]:enchant){ for(auto&[key,size]:enchant){
if(key=="Description"||key=="Affects"||key.starts_with("Stat Modifier["))continue; if(IsRequiredKey(key))continue;
const auto&result{newEnchant.config.insert({key,enchant[key].GetReal()})}; const auto&result{newEnchant.config.insert({key,enchant[key].GetReal()})};
const bool InsertFailed{!result.second}; const bool InsertFailed{!result.second};
if(InsertFailed)ERR(std::format("WARNING! Enchant {} already had an extra property named {}. Duplicates not allowed!",keyName,key)); if(InsertFailed)ERR(std::format("WARNING! Enchant {} already had an extra property named {}. Duplicates not allowed!",keyName,key));
} }
for(const auto&[configName,val]:newEnchant.config){
const std::string wrappedConfigStr{std::vformat("{{{}}}",std::make_format_args(configName))};
size_t configValInd{enchantDescription.find(wrappedConfigStr)};
if(configValInd==std::string::npos)continue;
std::string formattedFloat{std::format("{}",val)};
enchantDescription=enchantDescription.replace(configValInd,wrappedConfigStr.length(),formattedFloat);
}
newEnchant.description=enchantDescription;
return newEnchant; return newEnchant;
}; };
@ -121,7 +138,7 @@ void ItemEnchantInfo::Initialize(){
ItemEnchantInfo newEnchant{MakeEnchant(key,classEnchantData[key])}; ItemEnchantInfo newEnchant{MakeEnchant(key,classEnchantData[key])};
const auto&result{ENCHANT_LIST.insert({key,newEnchant})}; const auto&result{ENCHANT_LIST.insert({key,newEnchant})};
const bool InsertFailed{!result.second}; const bool InsertFailed{!result.second};
if(InsertFailed)ERR(std::format("WARNING! Enchant {} already existed in Enchantment List! Duplicates are not allowed!",key)); if(InsertFailed)ERR(std::format("WARNING! Enchant {} already existed in Enchant List! Duplicates are not allowed!",key));
} }
}else{ }else{
ItemEnchantInfo newEnchant{MakeEnchant(key,enchantData[key])}; ItemEnchantInfo newEnchant{MakeEnchant(key,enchantData[key])};
@ -133,9 +150,28 @@ void ItemEnchantInfo::Initialize(){
} }
} }
const ItemEnchantInfo&ItemEnchantInfo::GetEnchant(const std::string_view name){
return ENCHANT_LIST.at(std::string(name));
}
ItemEnchant::ItemEnchant(const std::string_view enchantName) ItemEnchant::ItemEnchant(const std::string_view enchantName)
:enchant(ItemEnchantInfo::GetEnchant(enchantName)){} :enchant(ItemEnchantInfo::GetEnchant(enchantName)){}
const ItemEnchantInfo&ItemEnchantInfo::GetEnchant(const std::string_view enchantName){
return ENCHANT_LIST.at(std::string(enchantName));
}
const std::string ItemEnchantInfo::Name(TextStyle style)const{
using enum TextStyle;
switch(style){
case NORMAL:{
return name;
}break;
case COLOR_CODES:{
return ENCHANT_CATEGORIES.at(category).displayCol.toHexString()+name;
}break;
}
return{};
}
const std::string_view ItemEnchantInfo::Description()const{
return description;
}
const float ItemEnchantInfo::GetConfigValue(const std::string_view keyName)const{
return config.at(std::string(keyName));
}

@ -39,16 +39,20 @@ All rights reserved.
#include "AttributableStat.h" #include "AttributableStat.h"
#include "Pixel.h" #include "Pixel.h"
#include "Class.h"
class ItemEnchantInfo{ class ItemEnchantInfo{
public: public:
enum class TextStyle{
NORMAL,
COLOR_CODES,
};
static void Initialize(); static void Initialize();
const static ItemEnchantInfo&GetEnchant(const std::string_view name); const static ItemEnchantInfo&GetEnchant(const std::string_view enchantName);
const std::string_view Name(); const std::string Name(TextStyle style=TextStyle::NORMAL)const;
const std::string_view Description(); const std::string_view Description()const;
const float GetConfigValue(const std::string_view keyName); const float GetConfigValue(const std::string_view keyName)const;
enum class AbilitySlot{ enum class AbilitySlot{
AUTO_ATTACK, AUTO_ATTACK,
RIGHT_CLICK, RIGHT_CLICK,
@ -69,6 +73,7 @@ private:
std::pair<LowestNumber,HighestNumber>weightedRollRange; std::pair<LowestNumber,HighestNumber>weightedRollRange;
Pixel displayCol; Pixel displayCol;
}; };
ItemEnchantCategory category;
std::string name; std::string name;
std::string description; std::string description;
std::optional<AbilitySlot>abilitySlot; std::optional<AbilitySlot>abilitySlot;

@ -51,6 +51,7 @@ Community: https://community.onelonecoder.com
#include "Pixel.h" #include "Pixel.h"
#include <utility> #include <utility>
#include <algorithm> #include <algorithm>
#include <format>
namespace olc{ namespace olc{
// O------------------------------------------------------------------------------O // O------------------------------------------------------------------------------O
@ -167,6 +168,10 @@ namespace olc{
return Pixel(nR, nG, nB, a); return Pixel(nR, nG, nB, a);
} }
std::string Pixel::toHexString()const{
return std::format("#{:2X}{:2X}{:2X}",r,g,b);
}
Pixel PixelF(float red, float green, float blue, float alpha) Pixel PixelF(float red, float green, float blue, float alpha)
{ return Pixel(uint8_t(red * 255.0f), uint8_t(green * 255.0f), uint8_t(blue * 255.0f), uint8_t(alpha * 255.0f)); } { return Pixel(uint8_t(red * 255.0f), uint8_t(green * 255.0f), uint8_t(blue * 255.0f), uint8_t(alpha * 255.0f)); }

@ -49,6 +49,7 @@ Community: https://community.onelonecoder.com
#pragma endregion #pragma endregion
#pragma once #pragma once
#include <cstdint> #include <cstdint>
#include <string>
// O------------------------------------------------------------------------------O // O------------------------------------------------------------------------------O
// | olc::Pixel IMPLEMENTATION | // | olc::Pixel IMPLEMENTATION |
@ -89,6 +90,7 @@ namespace olc{
Pixel& operator *=(const Pixel& p); Pixel& operator *=(const Pixel& p);
bool operator < (const Pixel& p)const; bool operator < (const Pixel& p)const;
Pixel inv() const; Pixel inv() const;
std::string toHexString()const;
}; };
Pixel PixelF(float red, float green, float blue, float alpha = 1.0f); Pixel PixelF(float red, float green, float blue, float alpha = 1.0f);

@ -651,8 +651,7 @@ const std::string SaveFile::CreateServerRequest(const SaveFileOperation::Operati
const std::array uriReserved={';','/','?',':','@','&','=','+','$',',','-','_','.','!','~','*','\'','(',')','#'}; const std::array uriReserved={';','/','?',':','@','&','=','+','$',',','-','_','.','!','~','*','\'','(',')','#'};
if(c>='A'&&c<='Z'||c>='a'&&c<='z'||c>='0'&&c<='9'||std::find(uriReserved.begin(),uriReserved.end(),c)!=uriReserved.end())return std::move(str)+c; if(c>='A'&&c<='Z'||c>='a'&&c<='z'||c>='0'&&c<='9'||std::find(uriReserved.begin(),uriReserved.end(),c)!=uriReserved.end())return std::move(str)+c;
std::string convertedChar=std::format("%{:02x}",c); std::string convertedChar=std::format("%{:02X}",c);
std::for_each(convertedChar.begin(),convertedChar.end(),[](char&c){c=char(std::toupper(c));});
return std::move(str)+convertedChar; return std::move(str)+convertedChar;
}); });
}; };

@ -39,7 +39,7 @@ All rights reserved.
#define VERSION_MAJOR 1 #define VERSION_MAJOR 1
#define VERSION_MINOR 2 #define VERSION_MINOR 2
#define VERSION_PATCH 3 #define VERSION_PATCH 3
#define VERSION_BUILD 10498 #define VERSION_BUILD 10511
#define stringify(a) stringify_(a) #define stringify(a) stringify_(a)
#define stringify_(a) #a #define stringify_(a) #a

@ -6,102 +6,61 @@ Item Enchants
Percent Chance = 50% Percent Chance = 50%
Enchant Display Color = 253, 255, 206, 255 Enchant Display Color = 253, 255, 206, 255
Health Increase
{
Description = "Increases Maximum Health."
# Stat, Lowest, Highest Value
Stat Modifier[0] = Health, 10, 25
# Stat Modifier[1] = ...
}
Health Boost Health Boost
{ {
Description = "Increases Maximum Health %." Description = "Increases Maximum Health %."
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
Stat Modifier[0] = Health %, 5, 10 Stat Modifier[0] = Health %, 3, 5
# Stat Modifier[1] = ...
}
Defense Increase
{
Description = "Increases Defense."
# Stat, Lowest, Highest Value
Stat Modifier[0] = Defense, 10, 25
# Stat Modifier[1] = ...
}
Defense Boost
{
Description = "Increases Defense %."
# Stat, Lowest, Highest Value
Stat Modifier[0] = Defense %, 5, 10
# Stat Modifier[1] = ...
}
Attack Increase
{
Description = "Increases Attack."
# Stat, Lowest, Highest Value
Stat Modifier[0] = Attack, 5, 10
# Stat Modifier[1] = ... # Stat Modifier[1] = ...
} }
Attack Boost Attack Boost
{ {
Description = "Increases Attack %." Description = "Increases Attack %."
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
Stat Modifier[0] = Attack %, 2, 5 Stat Modifier[0] = Attack %, 3, 5
# Stat Modifier[1] = ... # Stat Modifier[1] = ...
} }
Movement Boost Movement Boost
{ {
Description = "Increases Move Spd %." Description = "Increases Move Spd %."
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
Stat Modifier[0] = Move Spd %, 5, 10 Stat Modifier[0] = Move Spd %, 3, 5
# Stat Modifier[1] = ... # Stat Modifier[1] = ...
} }
Ability Haste Ability Haste
{ {
Description = "Decreases cooldown time of abilities." Description = "Decreases cooldown time of abilities."
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
Stat Modifier[0] = CDR, 2, 5 Stat Modifier[0] = CDR, 3, 5
# Stat Modifier[1] = ... # Stat Modifier[1] = ...
} }
Crit Rate Crit Rate
{ {
Description = "Increases critical hit rate." Description = "Increases critical hit rate."
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
Stat Modifier[0] = Crit Rate, 2, 5 Stat Modifier[0] = Crit Rate, 3, 5
# Stat Modifier[1] = ... # Stat Modifier[1] = ...
} }
Crit Damage Crit Damage
{ {
Description = "Increases damage from critical hits." Description = "Increases damage from critical hits."
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
Stat Modifier[0] = Crit Dmg, 5, 10 Stat Modifier[0] = Crit Dmg, 7, 10
# Stat Modifier[1] = ...
}
HP Recovery
{
Description = "Restores health every 6 seconds."
# Stat, Lowest, Highest Value
Stat Modifier[0] = HP6 Recovery %, 2, 4
# Stat Modifier[1] = ... # Stat Modifier[1] = ...
} }
Stoneskin Stoneskin
{ {
Description = "Reduces damage taken." Description = "Reduces damage taken."
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
Stat Modifier[0] = Damage Reduction, 2, 5 Stat Modifier[0] = Damage Reduction, 3, 5
# Stat Modifier[1] = ...
}
Quickstrike
{
Description = "Increases attack rate."
# Stat, Lowest, Highest Value
Stat Modifier[0] = Attack Spd, 3, 5
# Stat Modifier[1] = ... # Stat Modifier[1] = ...
} }
Mana Pool Mana Pool
{ {
Description = "Increases maximum mana." Description = "Increases maximum mana."
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
Stat Modifier[0] = Mana, 10, 20 Stat Modifier[0] = Mana, 7, 12
# Stat Modifier[1] = ... # Stat Modifier[1] = ...
} }
@ -116,29 +75,43 @@ Item Enchants
{ {
Quickdraw Quickdraw
{ {
Description = "Basic Attack cooldown has a 20% chance of instantly resetting when a target is hit." Description = "Basic Attack cooldown has a {RESET CHANCE}% chance of instantly resetting when a target is hit."
Affects = Auto Attack Affects = Auto Attack
RESET CHANCE = 20%
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
Stealthy Retreat Stealthy Retreat
{ {
Description = "Invulnerability time increased dramatically when using Retreat." Description = "Invulnerability time increased by {INVULNERABILITY INCREASE} seconds when using Retreat."
Affects = Right Click Ability Affects = Right Click Ability
INVULNERABILITY INCREASE = 2.0s
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
Poisonous Arrow Poisonous Arrow
{ {
Description = "Every 10 seconds, the next arrow fired becomes a poisonous arrow causing 20% damage every second for 7 seconds." Description = "Every {POISON ARROW RESET FREQUENCY} seconds, the next arrow fired becomes a poisonous arrow causing {POISON TICK DAMAGE}% damage every second for {POISON DURATION} seconds."
Affects = Auto Attack Affects = Auto Attack
POISON ARROW RESET FREQUENCY = 10s
POISON TICK DAMAGE = 20%
POISON DURATION = 7s
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
Extreme Rapid Fire Extreme Rapid Fire
{ {
Description = "Fire an additional 5 arrows when using Rapid Fire" Description = "Fire an additional {ARROW COUNT INCREASE} arrows when using Rapid Fire"
Affects = Ability 1 Affects = Ability 1
ARROW COUNT INCREASE = 5
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
@ -146,20 +119,30 @@ Item Enchants
{ {
Description = "Charged Shot's attack radius becomes immensely large." Description = "Charged Shot's attack radius becomes immensely large."
Affects = Ability 2 Affects = Ability 2
ATTACK RADIUS INCREASE MULT = 15x
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
Mega Charged Shot Mega Charged Shot
{ {
Description = "Charged Shot's cast time increases by 1.5 seconds. Now deals two times more damage." Description = "Charged Shot's cast time increases by {CAST TIME INCREASE} seconds. Now deals two times more damage."
Affects = Ability 2 Affects = Ability 2
CAST TIME INCREASE = 1.5s
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
Multi-Multishot Multi-Multishot
{ {
Description = "Multishot can now hold up to three charges." Description = "Multishot can now hold up to {EXTRA CHARGE COUNT} charges and has a {COOLDOWN REDUCTION PCT}% reduced Cooldown."
Affects = Ability 3 Affects = Ability 3
EXTRA CHARGE COUNT = 3
COOLDOWN REDUCTION PCT = 10%
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
@ -168,36 +151,76 @@ Item Enchants
{ {
Backstabber Backstabber
{ {
Description = "Attacking a target from behind deals an additional 40% damage." Description = "Attacking a target from behind deals an additional {BACKSTAB BONUS DMG}% damage."
Affects = Auto Attack Affects = Auto Attack
BACKSTAB BONUS DMG = 40%
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
Tumble Tumble
{ {
Description = "Roll range, invulnerability time, and Movespeed boost are all increased by 30%." Description = "Roll range, invulnerability time, and Movespeed boost are all increased by {BOOST PERCENTAGE}%."
Affects = Right Click Ability Affects = Right Click Ability
BOOST PERCENTAGE = 30%
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
Triple Toss Triple Toss
{ {
Description = "Hidden Dagger now throws three daggers instead of one." Description = "Hidden Dagger now throws {NEW DAGGER COUNT} daggers instead of 1."
Affects = Ability 1 Affects = Ability 1
NEW DAGGER COUNT = 3
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
Deadly Mirage Deadly Mirage
{ {
Description = "Immediately after dashing once with Deadly Dash, perform another dash in target direction." Description = "After dashing once with Deadly Dash, gives a {REACTIVATE TIMING WINDOW} second window to reuse the skill without spending mana."
Affects = Ability 2 Affects = Ability 2
REACTIVATE TIMING WINDOW = 2s
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
Adrenaline Stim Adrenaline Stim
{ {
Description = "Sacrifice 20% of your health to gain 50% increased attack range. Adrenaline Rush also lasts 30 seconds instead of 8." Description = "Sacrifice {HEALTH PCT COST}% of your health to gain {ATTACK RANGE INCREASE PCT}% increased attack range. Adrenaline Rush also lasts {NEW ADRENALINE RUSH DURATION} seconds instead of 8."
Affects = Ability 3
HEALTH PCT COST = 20%
ATTACK RANGE INCREASE PCT = 50%
NEW ADRENALINE RUSH DURATION = 30s
# Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0
}
Bloodlust
{
Description = "Every Enemy killed during Adrenaline Rush increases the duration of the buff by {BUFF TIMER INCREASE} seconds. Every Kill grants a {ATTACK BUFF PCT INCREASE}% Attack buff stacking up to {MAX ATTACK BUFF STACKS} times."
Affects = Ability 3 Affects = Ability 3
BUFF TIMER INCREASE = 2s
ATTACK BUFF PCT INCREASE = 1%
MAX ATTACK BUFF STACKS = 10
# Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0
}
Evasive Movement
{
Description = "Roll also grants {DAMAGE REDUCTION PCT}% Damage Reduction for {DAMAGE REDUCTION DURATION} seconds."
Affects = Right Click Ability
DAMAGE REDUCTION PCT = 50%
DAMAGE REDUCTION DURATION = 3.0s
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
@ -206,74 +229,104 @@ Item Enchants
{ {
Burning Arrow Burning Arrow
{ {
Description = "Auto attacks now apply a 6-second burn to targets dealing 20% attack every 2 seconds." Description = "Auto attacks on a marked Target now apply a {BURN DURATION}-second burn to targets dealing {BURN DAMAGE}% attack every {BURN TICK FREQUENCY} seconds. Burn can be stacked up to {MAX BURN STACK} times"
Affects = Auto Attack Affects = Auto Attack
BURN DURATION = 6s
BURN DAMAGE = 20%
BURN TICK FREQUENCY = 2s
MAX BURN STACK = 3
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
Enfeebled Target Enfeebled Target
{ {
Description = "Marked targets are slowed by 30% and deal 20% less damage." Description = "Marked targets are slowed by {SLOW PCT}% and deal {DAMAGE REDUCTION PCT}% less damage."
Affects = Ability 1 Affects = Ability 1
SLOT PCT = 30%
DAMAGE REDUCTION PCT = 20%
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
Long-Lasting Mark Long-Lasting Mark
{ {
Description = "Marks now last for 20 seconds." Description = "Marks now last for {DURATION} seconds."
Affects = Ability 1 Affects = Ability 1
DURATION = 20s
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
Trap Collector Trap Collector
{ {
Description = "You can now hold two charges of each trap." Description = "You can now hold {CHARGE COUNT} charges of each trap."
Affects = Ability 2, Ability 3 Affects = Ability 2, Ability 3
CHARGE COUNT = 2
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
Lingering Scent Lingering Scent
{ {
Description = "Bleed lasts for 10 seconds longer." Description = "Bleed lasts for {BLEED EXTRA DURATION} seconds longer."
Affects = Ability 2 Affects = Ability 2
BLEED EXTRA DURATION = 10s
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
Caught Dead Opportunity Shot
{ {
Description = "Caught targets are stuck for 5 seconds." Description = "Every {MARK TIME} seconds a random enemy on screen gets {MARK AMOUNT} Mark. If a mark on that Target is triggered within {MARK TRIGGER TIME} seconds, your Mark Target's cooldown is reduced by {MARK COOLDOWN REDUCE} seconds."
Affects = Ability 2 Affects = Auto Attack
MARK TIME = 8s
MARK AMOUNT = 1
MARK TRIGGER TIME = 3s
MARK COOLDOWN REDUCE = 2s
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
Concussive Trap Concussive Trap
{ {
Description = "Explosive traps now explode three times when triggered. Additional explosions deal 250% attack." Description = "Explosive traps now explode {TRAP EXPLODE COUNT} times when triggered. Additional explosions deal {ADDITIONAL EXPLOSION DAMAGE}% attack."
Affects = Ability 3 Affects = Ability 3
TRAP EXPLODE COUNT = 3
ADDITIONAL EXPLOSION DAMAGE = 250%
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
} }
Warrior Warrior
{ {
Giant Sword Sword Enchantment
{
Description = "Attack Range increased by 75%."
Affects = Auto Attack
# Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0
}
Steel Yourself
{ {
Description = "Negates knockback from collisions." Description = "After Sonic Slash your Autohit range gets increased by {AUTO RANGE INCREASE}% for {INCREASE DURATION} seconds"
Affects = Auto Attack Affects = Auto Attack
AUTO RANGE INCREASE = 100%
INCREASE DURATION = 8s
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
Auto Guard Improved Ground Slam
{ {
Description = "If Block is up and you take damage, Block will activate immediately, preventing the attack." Description = "Ground Slam is {GROUND SLAM RADIUS INCREASE}% larger range and deals additional Damage equal to {DEFENSE DAMAGE}% of your defense."
Affects = Right Click Ability Affects = Ability 2
GROUND SLAM RADIUS INCREASE = 20%
DEFENSE DAMAGE = 50%
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
@ -281,34 +334,51 @@ Item Enchants
{ {
Description = "Block's duration is doubled." Description = "Block's duration is doubled."
Affects = Right Click Ability Affects = Right Click Ability
BLOCK DURATION MULT = 2x
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
Advance Shield 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. You can perform other actions while the shield is active." Description = "Block no longer grants invulnerability or knockback reduction. Block now grants a shield equal to {SHIELD AMOUNT}% of your maximum health for {SHIELD DURATION} seconds."
Affects = Right Click Ability Affects = Right Click Ability
SHIELD AMOUNT = 20%
SHIELD DURATION = 9s
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
Battle Shout Battle Shout
{ {
Description = "Battlecry now deals damage equal to your defense." Description = "Battlecry deals damage equal to {DEFENSE DAMAGE}% of your defense."
Affects = Ability 1 Affects = Ability 1
DEFENSE DAMAGE = 100%
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
Slam Shock Slam Shock
{ {
Description = "Monsters hit by Ground Slam become stunned for 5 seconds." Description = "Monsters hit by Ground Slam become stunned for {STUN DURATION} seconds."
Affects = Ability 2 Affects = Ability 2
STUN DURATION = 5s
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
Sonic Upgrade Sonic Upgrade
{ {
Description = "Sonic Slash's Cooldown and Mana costs reduced by 20%." Description = "Sonic Slash's Cooldown and Mana costs reduced by {REDUCTION PCT}% and Deals Additional Damage Equal to {ADDITIONAL DMG PCT}% of you max Health."
Affects = Ability 3 Affects = Ability 3
REDUCTION PCT = 15%
ADDITIONAL DMG PCT = 10%
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
@ -317,15 +387,22 @@ Item Enchants
{ {
Bouncing Orb Bouncing Orb
{ {
Description = "Homing orb now bounces off of targets up to 4 bounces. Damage reduced to 50% attack. Cannot hit the same target twice in a row." Description = "Homing orb now bounces off of targets up to {BOUNCE COUNT} bounces. Damage reduced to {ORB DAMAGE}% attack. Cannot hit the same target twice in a row."
Affects = Auto Attack Affects = Auto Attack
BOUNCE COUNT = 4
ORB DAMAGE = 50%
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
Nine Lives Nine Lives
{ {
Description = "Transform's cooldown becomes 20 seconds. Upon using Transform remain in cat form. Instead of taking damage, getting hit will simply revert your form." Description = "Transform's cooldown becomes {TRANSFORM COOLDOWN} seconds. Upon using Transform remain in cat form. Instead of taking damage, getting hit will revert your form."
Affects = Right Click Ability Affects = Right Click Ability
TRANSFORM COOLDOWN = 20s
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
@ -333,27 +410,52 @@ Item Enchants
{ {
Description = "If Curse of Pain kills a target, it can spread to nearby targets." Description = "If Curse of Pain kills a target, it can spread to nearby targets."
Affects = Ability 1 Affects = Ability 1
SPREAD RANGE = 250
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
Pooling Poison Pooling Poison
{ {
Description = "Throw Poison causes the splash effect to linger for 10 seconds, dealing 100% attack every 2 seconds." Description = "Throw Poison causes the splash effect to linger for {SPLASH LINGER TIME} seconds, dealing {POISON POOL DAMAGE}% attack every {POISON POOL DAMAGE FREQUENCY} seconds."
Affects = Ability 2 Affects = Ability 2
SPLASH LINGER TIME = 10s
POISON POOL DAMAGE = 100%
POISON POOL DAMAGE FREQUENCY = 2s
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
Poison Bounce Poison Bounce
{ {
Description = "Throw Poison bounces along the ground two additional times dealing small splashes of poison for 100% attack damage before the final explosion." Description = "Throw Poison bounces along the ground {BOUNCE COUNT} additional times dealing small splashes of poison for {BOUNCE DAMAGE}% attack damage before the final explosion."
Affects = Ability 2 Affects = Ability 2
BOUNCE COUNT = 2
BOUNCE DAMAGE = 100%
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
Expunge Expunge
{ {
Description = "Target takes 50% additional damage during Curse of Death." Description = "Target takes {BONUS DAMAGE}% additional damage during Curse of Death."
Affects = Ability 3 Affects = Ability 3
BONUS DAMAGE = 50%
# Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0
}
Curse of Doom
{
Description = "If a target dies while Curse of Death is active, the target causes a large explosion, dealing all the damage accumulated during Curse of Death onto nearby targets.
Affects = Ability 3
EXPLODE RANGE = 500
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
@ -362,50 +464,83 @@ Item Enchants
{ {
Piercing Bolt Piercing Bolt
{ {
Description = "Regular attacks now go through targets. Damage dealt to additional targets reduced by 50%." Description = "Regular attacks now go through targets. Damage dealt to additional targets is {MULTI TARGET DAMAGE}% of attack."
Affects = Auto Attack Affects = Auto Attack
MULTI TARGET DAMAGE = 50%
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
Blink Portal Blink Portal
{ {
Description = "For 5 seconds after using Teleport, the Wizard can activate Teleport again to teleport back to the original location. Cooldown increased to 13 seconds." Description = "For {REACTIVATION TIME} seconds after using Teleport, the Wizard can activate Teleport again to teleport back to the original location. Cooldown increased to {COOLDOWN} seconds."
Affects = Right Click Ability Affects = Right Click Ability
REACTIVATION TIME = 5s
COOLDOWN = 13s
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
Black Hole Black Hole
{ {
Description = "After teleporting, creates a small black hole pulling in nearby targets for 4 seconds." Description = "After teleporting, creates a small black hole pulling in nearby targets for {BLACK HOLE DURATION} seconds."
Affects = Right Click Ability Affects = Right Click Ability
BLACK HOLE DURATION = 4s
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
Trail of Fire Trail of Fire
{ {
Description = "The Firebolt leaves behind a trail of fire, burning targets standing in it for 10% attack every second for 10 seconds." Description = "The Firebolt leaves behind a trail of fire, burning targets standing in it for {TRAIL DAMAGE}% attack every second for {TRAIL DURATION} seconds."
Affects = Ability 1 Affects = Ability 1
TRAIL DAMAGE = 10%
TRAIL DURATION = 10s
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
Chain Lightning Chain Lightning
{ {
Description = "Targets affected by Lightning Bolt will send out two additional shocks half a second later to other nearby targets for 100% attack. This can continue up to three times." Description = "Targets affected by Lightning Bolt will send out {ADDITIONAL SHOCK COUNT} additional shocks {ADDITIONAL SHOCK DELAY} seconds later to other nearby targets for {SHOCK DAMAGE}% attack. This can continue up to {REPEAT COUNT} times."
Affects = Ability 2 Affects = Ability 2
ADDITIONAL SHOCK COUNT = 2
ADDITIONAL SHOCK DELAY = 0.5s
SHOCK DAMAGE = 100%
REPEAT COUNT = 3
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
Summon Comet Summon Comet
{ {
Description = "Meteor cast time reduced by 1 second. Meteor attack falls twice as quickly." Description = "Meteor cast time reduced to {METEOR CAST TIME} seconds. Meteor attack falls {FALL SPEED MULT}x as quickly. Damage is reduced by {DAMAGE REDUCTION PCT}% and Cooldown reduced by {COOLDOWN REDUCTION} seconds."
Affects = Ability 3 Affects = Ability 3
METEOR CAST TIME = 0.5s
FALL SPEED MULT = 2.0x
DAMAGE REDUCTION PCT = 10%
COOLDOWN REDUCTION = 8s
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
Solar Flare Solar Flare
{ {
Description = "Meteor cast time increased by 2 seconds. Meteor is twice as large and deals 1600% attack. Lingering fire rings last twice as long." Description = "Meteor cast time increased to {METEOR CAST TIME} seconds. Meteor is {SIZE MULT}x as large and deals {METEOR ATTACK}% attack. Lingering fire rings last {FIRE RING DURATION MULT}x as long. Cooldown increased by {COOLDOWN INCREASE} seconds."
Affects = Ability 3 Affects = Ability 3
METEOR CAST TIME = 3.5s
SIZE MULT = 2x
METEOR ATTACK = 1600%
FIRE RING DURATION MULT = 2x
COOLDOWN INCREASE = 8s
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
@ -421,43 +556,96 @@ Item Enchants
{ {
Description = "Provides a defensive aura granting many boons." Description = "Provides a defensive aura granting many boons."
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
Stat Modifier[0] = Health %, 5, 10 Stat Modifier[0] = Health %, 2, 3
Stat Modifier[1] = Defense %, 5, 10 Stat Modifier[1] = Damage Reduction, 2, 3
Stat Modifier[2] = Move Spd %, 5, 10 Stat Modifier[2] = Move Spd %, 2, 3
Stat Modifier[3] = HP4 Recovery %, 2, 5 Stat Modifier[3] = HP6 Recovery %, 1, 1
} }
Aura of the Beast Aura of the Beast
{ {
Description = "Provides an offensive aura granting many boons." Description = "Provides an offensive aura granting many boons."
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
Stat Modifier[0] = Attack %, 4, 8 Stat Modifier[0] = Attack %, 2, 3
Stat Modifier[1] = Crit Rate, 5, 10 Stat Modifier[1] = Crit Rate, 2, 3
Stat Modifier[2] = CDR, 5, 10 Stat Modifier[2] = CDR, 2, 3
Stat Modifier[3] = Crit Dmg, 15, 20 Stat Modifier[3] = Crit Dmg, 3, 7
} }
Lethal Tempo Lethal Tempo
{ {
Description = "Increases Attack Speed by 5% with each strike, up to 25%. Lasts for 5 seconds." Description = "Increases Attack Speed by {ATTACK SPEED INCREASE}% with each strike, up to {MAX ATTACK SPEED INCREASE}%. Stacks last for {STACK DURATION} seconds."
ATTACK SPEED INCREASE = 5%
MAX ATTACK SPEED INCREASE = 25%
STACK DURATION = 5s
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
Second Wind Second Wind
{ {
Description = "Gain 1% HP Recovery/sec when below 20% health." Description = "Gain {HP RECOVERY PCT}% HP Recovery/sec when below {HP BELOW THRESHOLD}% health."
HP RECOVERY PCT = 1%
HP BELOW THRESHOLD = 20%
# Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0
}
Emergency Recovery
{
Description = "Gain {HP RECOVERY PCT}% HP Recovery every 6 seconds. Effect increases by {GAIN AMOUNT PCT}% for every {MISSING HEALTH BONUS PCT}% health missing. Below {FOUR SECOND HP THRESHOLD}% Health Recovery happens every 4 seconds."
HP RECOVERY PCT = 1%
GAIN AMOUNT PCT = 0.5%
MISSING HEALTH BONUS PCT = 10%
FOUR SECOND HP THRESHOLD = 30%
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
Death Defiance Death Defiance
{ {
Description = "30% chance to avoid taking lethal damage." Description = "{LETHAL DAMAGE AVOID CHANCE}% chance to avoid taking lethal damage."
LETHAL DAMAGE AVOID CHANCE = 30%
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
Reaper of Souls Reaper of Souls
{ {
Description = "Recover 3 Health for each monster kill." Description = "Recover {HEALTH GAIN} Health, {MANA GAIN} Mana and reduces ability cooldowns by {COOLDOWN REDUCTION} seconds for each monster kill."
HEALTH GAIN = 3
MANA GAIN = 2
COOLDOWN REDUCTION = 0.5s
# Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0
}
Wizards Soul
{
Description = "Using an ability reduces the cooldown of every other ability by {ABILITY COOLDOWN AMOUNT} seconds. Mana Recovery also increases by {MANA RECOVERY MULT}x for {MANA RECOVERY DURATION} seconds."
ABILITY COOLDOWN AMOUNT = 1.5s
MANA RECOVERY MULT = 2x
MANA RECOVERY DURATION = 2s
# Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0
}
Last Reserve
{
Description = "Gain {DAMAGE REDUCTION PCT}% Damage Reduction, {ATTACK PCT}% Attack and {COOLDOWN REDUCTION PCT}% Cooldown Reduction when below {HP BELOW THRESHOLD}% Health".
DAMAGE REDUCTION PCT = 30%
ATTACK PCT = 10%
COOLDOWN REDUCTION PCT = 10%
HP BELOW THRESHOLD = 25%
# Stat, Lowest, Highest Value # Stat, Lowest, Highest Value
# Stat Modifier[0] = ..., 0, 0 # Stat Modifier[0] = ..., 0, 0
} }
} }
} }
Loading…
Cancel
Save