52 for (AStringVector::const_iterator itr = Decls.begin(),
end = Decls.end(); itr !=
end; ++itr)
61 if (Split.size() != 2)
64 LOG(
"%s: Malformed enchantment decl: \"%s\", skipping.", __FUNCTION__, itr->c_str());
70 LOG(
"%s: Failed to parse enchantment \"%s\", skipping.", __FUNCTION__, Split[0].c_str());
77 LOG(
"%s: Failed to parse enchantment level \"%s\", skipping.", __FUNCTION__, Split[1].c_str());
103 res.append(fmt::format(FMT_STRING(
"{}={};"), itr->first, itr->second));
172 switch (a_EnchantmentID)
200 LOGWARNING(
"Unknown enchantment ID %d", a_EnchantmentID);
212 switch (a_EnchantmentID)
243 switch (a_EnchantmentID)
274 LOGWARNING(
"Unknown enchantment ID %d", a_EnchantmentID);
289 static const std::vector<std::set<int> > IncompatibleEnchantments =
307 for (
const auto & excl: IncompatibleEnchantments)
309 if (excl.count(a_EnchantmentID) != 0)
312 for (
auto ench: excl)
334 } EnchantmentNames[] =
364 int id = atoi(a_EnchantmentName.c_str());
365 if ((
id != 0) || (a_EnchantmentName ==
"0"))
371 for (
size_t i = 0; i <
ARRAYCOUNT(EnchantmentNames); i++)
373 if (
NoCaseCompare(EnchantmentNames[i].m_Name, a_EnchantmentName) == 0)
375 return EnchantmentNames[i].m_Value;
408 if ((a_EnchantmentLevel >= 34) && (a_EnchantmentLevel <= 54))
412 else if ((a_EnchantmentLevel >= 23) && (a_EnchantmentLevel <= 43))
416 else if ((a_EnchantmentLevel >= 12) && (a_EnchantmentLevel <= 32))
420 else if ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 21))
426 if ((a_EnchantmentLevel >= 29) && (a_EnchantmentLevel <= 49))
430 else if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 41))
434 else if ((a_EnchantmentLevel >= 13) && (a_EnchantmentLevel <= 33))
438 else if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 25))
444 if ((a_EnchantmentLevel >= 29) && (a_EnchantmentLevel <= 49))
448 else if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 41))
452 else if ((a_EnchantmentLevel >= 13) && (a_EnchantmentLevel <= 33))
456 else if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 25))
462 if ((a_EnchantmentLevel >= 25) && (a_EnchantmentLevel <= 75))
466 else if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 55))
472 if ((a_EnchantmentLevel >= 30) && (a_EnchantmentLevel <= 80))
476 else if ((a_EnchantmentLevel >= 10) && (a_EnchantmentLevel <= 60))
482 if ((a_EnchantmentLevel >= 33) && (a_EnchantmentLevel <= 83))
486 else if ((a_EnchantmentLevel >= 24) && (a_EnchantmentLevel <= 74))
490 else if ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 65))
499 if ((a_EnchantmentLevel >= 31) && (a_EnchantmentLevel <= 81))
503 else if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 71))
507 else if ((a_EnchantmentLevel >= 11) && (a_EnchantmentLevel <= 61))
511 else if ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 51))
517 if ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 65))
523 if ((a_EnchantmentLevel >= 33) && (a_EnchantmentLevel <= 83))
527 else if ((a_EnchantmentLevel >= 24) && (a_EnchantmentLevel <= 74))
531 else if ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 65))
540 if ((a_EnchantmentLevel >= 34) && (a_EnchantmentLevel <= 54))
544 else if ((a_EnchantmentLevel >= 23) && (a_EnchantmentLevel <= 43))
548 else if ((a_EnchantmentLevel >= 12) && (a_EnchantmentLevel <= 32))
552 else if ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 21))
558 if ((a_EnchantmentLevel >= 34) && (a_EnchantmentLevel <= 46))
562 else if ((a_EnchantmentLevel >= 26) && (a_EnchantmentLevel <= 38))
566 else if ((a_EnchantmentLevel >= 18) && (a_EnchantmentLevel <= 30))
570 else if ((a_EnchantmentLevel >= 10) && (a_EnchantmentLevel <= 22))
576 if ((a_EnchantmentLevel >= 29) && (a_EnchantmentLevel <= 41))
580 else if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 33))
584 else if ((a_EnchantmentLevel >= 13) && (a_EnchantmentLevel <= 25))
588 else if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 17))
594 if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 36))
598 else if ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 30))
602 else if ((a_EnchantmentLevel >= 9) && (a_EnchantmentLevel <= 24))
606 else if ((a_EnchantmentLevel >= 3) && (a_EnchantmentLevel <= 18))
612 if ((a_EnchantmentLevel >= 50) && (a_EnchantmentLevel <= 100))
616 else if ((a_EnchantmentLevel >= 30) && (a_EnchantmentLevel <= 80))
620 else if ((a_EnchantmentLevel >= 10) && (a_EnchantmentLevel <= 60))
629 if ((a_EnchantmentLevel >= 30) && (a_EnchantmentLevel <= 60))
633 else if ((a_EnchantmentLevel >= 20) && (a_EnchantmentLevel <= 50))
637 else if ((a_EnchantmentLevel >= 10) && (a_EnchantmentLevel <= 40))
643 if ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 41))
652 if ((a_EnchantmentLevel >= 23) && (a_EnchantmentLevel <= 33))
656 else if ((a_EnchantmentLevel >= 17) && (a_EnchantmentLevel <= 27))
660 else if ((a_EnchantmentLevel >= 11) && (a_EnchantmentLevel <= 21))
664 else if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 15))
670 if ((a_EnchantmentLevel >= 30) && (a_EnchantmentLevel <= 45))
674 else if ((a_EnchantmentLevel >= 20) && (a_EnchantmentLevel <= 35))
678 else if ((a_EnchantmentLevel >= 10) && (a_EnchantmentLevel <= 25))
688 if ((a_EnchantmentLevel >= 31) && (a_EnchantmentLevel <= 46))
692 else if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 36))
696 else if ((a_EnchantmentLevel >= 11) && (a_EnchantmentLevel <= 26))
700 else if ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 16))
706 if ((a_EnchantmentLevel >= 32) && (a_EnchantmentLevel <= 57))
710 else if ((a_EnchantmentLevel >= 12) && (a_EnchantmentLevel <= 37))
716 if ((a_EnchantmentLevel >= 20) && (a_EnchantmentLevel <= 50))
726 if ((a_EnchantmentLevel >= 33) && (a_EnchantmentLevel <= 83))
731 else if ((a_EnchantmentLevel >= 24) && (a_EnchantmentLevel <= 74))
736 else if ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 65))
748 if ((a_EnchantmentLevel >= 34) && (a_EnchantmentLevel <= 54))
752 else if ((a_EnchantmentLevel >= 23) && (a_EnchantmentLevel <= 43))
756 else if ((a_EnchantmentLevel >= 12) && (a_EnchantmentLevel <= 32))
760 else if ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 21))
766 if ((a_EnchantmentLevel >= 29) && (a_EnchantmentLevel <= 49))
770 else if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 41))
774 else if ((a_EnchantmentLevel >= 13) && (a_EnchantmentLevel <= 33))
778 else if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 25))
784 if ((a_EnchantmentLevel >= 29) && (a_EnchantmentLevel <= 49))
788 else if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 41))
792 else if ((a_EnchantmentLevel >= 13) && (a_EnchantmentLevel <= 33))
796 else if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 25))
802 if ((a_EnchantmentLevel >= 25) && (a_EnchantmentLevel <= 75))
806 else if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 55))
812 if ((a_EnchantmentLevel >= 30) && (a_EnchantmentLevel <= 80))
816 else if ((a_EnchantmentLevel >= 10) && (a_EnchantmentLevel <= 60))
822 if ((a_EnchantmentLevel >= 33) && (a_EnchantmentLevel <= 83))
826 else if ((a_EnchantmentLevel >= 24) && (a_EnchantmentLevel <= 74))
830 else if ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 65))
836 if ((a_EnchantmentLevel >= 31) && (a_EnchantmentLevel <= 81))
840 else if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 71))
844 else if ((a_EnchantmentLevel >= 11) && (a_EnchantmentLevel <= 61))
848 else if ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 51))
854 if ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 65))
860 if ((a_EnchantmentLevel >= 33) && (a_EnchantmentLevel <= 83))
864 else if ((a_EnchantmentLevel >= 24) && (a_EnchantmentLevel <= 74))
868 else if ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 65))
874 if ((a_EnchantmentLevel >= 34) && (a_EnchantmentLevel <= 54))
878 else if ((a_EnchantmentLevel >= 23) && (a_EnchantmentLevel <= 43))
882 else if ((a_EnchantmentLevel >= 12) && (a_EnchantmentLevel <= 32))
886 else if ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 21))
892 if ((a_EnchantmentLevel >= 34) && (a_EnchantmentLevel <= 46))
896 else if ((a_EnchantmentLevel >= 26) && (a_EnchantmentLevel <= 38))
900 else if ((a_EnchantmentLevel >= 18) && (a_EnchantmentLevel <= 30))
904 else if ((a_EnchantmentLevel >= 10) && (a_EnchantmentLevel <= 22))
910 if ((a_EnchantmentLevel >= 29) && (a_EnchantmentLevel <= 41))
914 else if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 33))
918 else if ((a_EnchantmentLevel >= 13) && (a_EnchantmentLevel <= 25))
922 else if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 17))
928 if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 36))
932 else if ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 30))
936 else if ((a_EnchantmentLevel >= 9) && (a_EnchantmentLevel <= 24))
940 else if ((a_EnchantmentLevel >= 3) && (a_EnchantmentLevel <= 18))
946 if ((a_EnchantmentLevel >= 50) && (a_EnchantmentLevel <= 100))
950 else if ((a_EnchantmentLevel >= 30) && (a_EnchantmentLevel <= 80))
954 else if ((a_EnchantmentLevel >= 10) && (a_EnchantmentLevel <= 60))
960 if ((a_EnchantmentLevel >= 30) && (a_EnchantmentLevel <= 60))
964 else if ((a_EnchantmentLevel >= 20) && (a_EnchantmentLevel <= 50))
968 else if ((a_EnchantmentLevel >= 10) && (a_EnchantmentLevel <= 40))
974 if ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 41))
980 if ((a_EnchantmentLevel >= 23) && (a_EnchantmentLevel <= 33))
984 else if ((a_EnchantmentLevel >= 17) && (a_EnchantmentLevel <= 27))
988 else if ((a_EnchantmentLevel >= 11) && (a_EnchantmentLevel <= 21))
992 else if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 15))
998 if ((a_EnchantmentLevel >= 31) && (a_EnchantmentLevel <= 46))
1002 else if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 36))
1006 else if ((a_EnchantmentLevel >= 11) && (a_EnchantmentLevel <= 26))
1010 else if ((a_EnchantmentLevel >= 1) && (a_EnchantmentLevel <= 16))
1016 if ((a_EnchantmentLevel >= 32) && (a_EnchantmentLevel <= 57))
1020 else if ((a_EnchantmentLevel >= 12) && (a_EnchantmentLevel <= 37))
1026 if ((a_EnchantmentLevel >= 20) && (a_EnchantmentLevel <= 50))
1033 if ((a_EnchantmentLevel >= 33) && (a_EnchantmentLevel <= 83))
1038 else if ((a_EnchantmentLevel >= 24) && (a_EnchantmentLevel <= 74))
1043 else if ((a_EnchantmentLevel >= 15) && (a_EnchantmentLevel <= 65))
1051 if ((a_EnchantmentLevel >= 21) && (a_EnchantmentLevel <= 71))
1055 else if ((a_EnchantmentLevel >= 13) && (a_EnchantmentLevel <= 63))
1059 else if ((a_EnchantmentLevel >= 5) && (a_EnchantmentLevel <= 55))
1072 weightedenchantment.
m_Weight = a_Weight;
1074 enchantment.
SetLevel(a_EnchantmentID, a_EnchantmentLevel);
1076 a_Enchantments.push_back(weightedenchantment);
1085 for (cWeightedEnchantments::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it)
1087 if ((*it).m_Enchantments.GetLevel(a_EnchantmentID) > 0)
1089 a_Enchantments.erase(it);
1101 for (cWeightedEnchantments::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it)
1103 if ((*it).m_Enchantments == a_Enchantment)
1105 a_Enchantments.erase(it);
1176 for (
const auto & Enchantment: a_Enchantments)
1178 AllWeights += Enchantment.m_Weight;
1180 int RandomNumber = a_Random.
RandInt(AllWeights - 1);
1181 for (
const auto & Enchantment: a_Enchantments)
1183 RandomNumber -= Enchantment.m_Weight;
1184 if (RandomNumber < 0)
1186 return Enchantment.m_Enchantments;
1201 for (
const auto & Enchantment : a_Enchantments)
1203 AllWeights += Enchantment.m_Weight;
1207 if (AllWeights <= 0)
1214 int RandomNumber = Noise.
IntNoise1DInt(AllWeights) / 7 % AllWeights;
1215 for (
const auto & Enchantment : a_Enchantments)
1217 RandomNumber -= Enchantment.m_Weight;
1218 if (RandomNumber <= 0)
1220 return Enchantment.m_Enchantments;
std::vector< cWeightedEnchantment > cWeightedEnchantments
#define ARRAYCOUNT(X)
Evaluates to the number of elements in an array (compile-time!)
void LOGWARNING(std::string_view a_Format, const Args &... args)
void LOG(std::string_view a_Format, const Args &... args)
AStringVector StringSplitAndTrim(const AString &str, const AString &delim)
Split the string at any of the listed delimiters and trim each value.
AStringVector StringSplit(const AString &str, const AString &delim)
Split the string at any of the listed delimiters.
int NoCaseCompare(const AString &s1, const AString &s2)
Case-insensitive string comparison.
std::vector< AString > AStringVector
bool StringToInteger(const AString &a_str, T &a_Num)
Parses any integer type.
bool IsHelmet(short a_ItemType)
bool IsTool(short a_ItemType)
bool IsArmor(short a_ItemType)
bool IsBoots(short a_ItemType)
bool IsSword(short a_ItemType)
Class that stores item enchantments or stored-enchantments The enchantments may be serialized to a st...
cMap m_Enchantments
Currently stored enchantments.
bool CanAddEnchantment(int a_EnchantmentID) const
Returns true if the given enchantment could be legally added to this object.
void Add(const cEnchantments &a_Other)
Adds the enchantments contained in a_Other into this object.
void Clear(void)
Removes all enchantments.
@ enchProjectileProtection
void SetLevel(int a_EnchantmentID, unsigned int a_Level)
Sets the level for the specified enchantment, adding it if not stored before or removing it if level ...
size_t Count(void) const
Get the count of enchantments.
static void AddEnchantmentWeightToVector(cWeightedEnchantments &a_Enchantments, int a_Weight, int a_EnchantmentID, unsigned int a_EnchantmentLevel)
Add a enchantment with weight to the vector.
static unsigned int GetLevelCap(int a_EnchantmentID)
Get the maximum level the enchantment can have.
static int StringToEnchantmentID(const AString &a_EnchantmentName)
Converts enchantment name or ID (number in string) to the numeric representation; returns -1 if encha...
static cEnchantments SelectEnchantmentFromVector(const cWeightedEnchantments &a_Enchantments, int a_Seed)
Selects one enchantment from a Vector using cNoise.
unsigned int GetLevel(int a_EnchantmentID) const
Returns the level for the specified enchantment; 0 if not stored.
static void RemoveEnchantmentWeightFromVector(cWeightedEnchantments &a_Enchantments, int a_EnchantmentID)
Remove the entire enchantment (with weight) from the vector.
void AddFromString(const AString &a_StringSpec)
Adds enchantments in the stringspec; if a specified enchantment already exists, overwrites it.
AString ToString(void) const
Serializes all the enchantments into a string.
bool operator!=(const cEnchantments &a_Other) const
Returns true if a_Other doesn't contain exactly the same enchantments and levels.
cMap::const_iterator end() const
static cEnchantments GetRandomEnchantmentFromVector(const cWeightedEnchantments &a_Enchantments, MTRand &a_Random)
Gets random enchantment from Vector and returns it, with randomness derived from the provided PRNG.
static int GetXPCostMultiplier(int a_EnchantmentID, bool FromBook)
Get the XP cost multiplier for the enchantment (for anvils).
static void CheckEnchantmentConflictsFromVector(cWeightedEnchantments &a_Enchantments, const cEnchantments &a_FirstEnchantment)
Check enchantment conflicts from enchantments from the vector.
static void AddItemEnchantmentWeights(cWeightedEnchantments &a_Enchantments, short a_ItemType, unsigned a_EnchantmentLevel)
Add enchantment weights from item to the vector.
cEnchantments(void)
Creates an empty enchantments container.
bool operator==(const cEnchantments &a_Other) const
Returns true if a_Other contains exactly the same enchantments and levels.
bool IsEmpty(void) const
Returns true if there are no enchantments.
cEnchantments m_Enchantments
Class to wrap any random engine to provide a more convenient interface.
IntType RandInt(IntType a_Min, IntType a_Max)
Return a random IntType in the range [a_Min, a_Max].
int IntNoise1DInt(int a_X) const