|
@@ -17,6 +17,34 @@
|
|
|
|
|
|
VCMI_LIB_NAMESPACE_BEGIN
|
|
|
|
|
|
+const std::set<std::string> deprecatedBonusSet = {
|
|
|
+ "SECONDARY_SKILL_PREMY",
|
|
|
+ "SECONDARY_SKILL_VAL2",
|
|
|
+ "MAXED_SPELL",
|
|
|
+ "LAND_MOVEMENT",
|
|
|
+ "SEA_MOVEMENT",
|
|
|
+ "SIGHT_RADIOUS",
|
|
|
+ "NO_TYPE",
|
|
|
+ "SPECIAL_SECONDARY_SKILL",
|
|
|
+ "FULL_HP_REGENERATION",
|
|
|
+ "KING1",
|
|
|
+ "KING2",
|
|
|
+ "KING3",
|
|
|
+ "BLOCK_MORALE",
|
|
|
+ "BLOCK_LUCK",
|
|
|
+ "SELF_MORALE",
|
|
|
+ "SELF_LUCK",
|
|
|
+ "DIRECT_DAMAGE_IMMUNITY",
|
|
|
+ "AIR_SPELL_DMG_PREMY",
|
|
|
+ "EARTH_SPELL_DMG_PREMY"
|
|
|
+ "FIRE_SPELL_DMG_PREMY"
|
|
|
+ "WATER_SPELL_DMG_PREMY",
|
|
|
+ "FIRE_SPELLS",
|
|
|
+ "AIR_SPELLS",
|
|
|
+ "WATER_SPELLS",
|
|
|
+ "EARTH_SPELLS"
|
|
|
+};
|
|
|
+
|
|
|
BonusParams::BonusParams(std::string deprecatedTypeStr, std::string deprecatedSubtypeStr, int deprecatedSubtype):
|
|
|
isConverted(true)
|
|
|
{
|
|
@@ -44,92 +72,79 @@ BonusParams::BonusParams(std::string deprecatedTypeStr, std::string deprecatedSu
|
|
|
{
|
|
|
type = BonusType::MANA_PER_KNOWLEDGE;
|
|
|
valueType = BonusValueType::PERCENT_TO_BASE;
|
|
|
- valueTypeRelevant = true;
|
|
|
}
|
|
|
else if(deprecatedSubtype == SecondarySkill::SORCERY || deprecatedSubtypeStr == "skill.sorcery")
|
|
|
+ {
|
|
|
type = BonusType::SPELL_DAMAGE;
|
|
|
+ subtype = SpellSchool(ESpellSchool::ANY);
|
|
|
+ }
|
|
|
else if(deprecatedSubtype == SecondarySkill::SCHOLAR || deprecatedSubtypeStr == "skill.scholar")
|
|
|
type = BonusType::LEARN_MEETING_SPELL_LIMIT;
|
|
|
else if(deprecatedSubtype == SecondarySkill::ARCHERY|| deprecatedSubtypeStr == "skill.archery")
|
|
|
{
|
|
|
subtype = 1;
|
|
|
- subtypeRelevant = true;
|
|
|
type = BonusType::PERCENTAGE_DAMAGE_BOOST;
|
|
|
}
|
|
|
else if(deprecatedSubtype == SecondarySkill::OFFENCE || deprecatedSubtypeStr == "skill.offence")
|
|
|
{
|
|
|
subtype = 0;
|
|
|
- subtypeRelevant = true;
|
|
|
type = BonusType::PERCENTAGE_DAMAGE_BOOST;
|
|
|
}
|
|
|
else if(deprecatedSubtype == SecondarySkill::ARMORER || deprecatedSubtypeStr == "skill.armorer")
|
|
|
{
|
|
|
subtype = -1;
|
|
|
- subtypeRelevant = true;
|
|
|
type = BonusType::GENERAL_DAMAGE_REDUCTION;
|
|
|
}
|
|
|
else if(deprecatedSubtype == SecondarySkill::NAVIGATION || deprecatedSubtypeStr == "skill.navigation")
|
|
|
{
|
|
|
subtype = 0;
|
|
|
- subtypeRelevant = true;
|
|
|
valueType = BonusValueType::PERCENT_TO_BASE;
|
|
|
- valueTypeRelevant = true;
|
|
|
type = BonusType::MOVEMENT;
|
|
|
}
|
|
|
else if(deprecatedSubtype == SecondarySkill::LOGISTICS || deprecatedSubtypeStr == "skill.logistics")
|
|
|
{
|
|
|
subtype = 1;
|
|
|
- subtypeRelevant = true;
|
|
|
valueType = BonusValueType::PERCENT_TO_BASE;
|
|
|
- valueTypeRelevant = true;
|
|
|
type = BonusType::MOVEMENT;
|
|
|
}
|
|
|
else if(deprecatedSubtype == SecondarySkill::ESTATES || deprecatedSubtypeStr == "skill.estates")
|
|
|
{
|
|
|
type = BonusType::GENERATE_RESOURCE;
|
|
|
subtype = GameResID(EGameResID::GOLD);
|
|
|
- subtypeRelevant = true;
|
|
|
}
|
|
|
else if(deprecatedSubtype == SecondarySkill::AIR_MAGIC || deprecatedSubtypeStr == "skill.airMagic")
|
|
|
{
|
|
|
type = BonusType::MAGIC_SCHOOL_SKILL;
|
|
|
- subtypeRelevant = true;
|
|
|
- subtype = 4;
|
|
|
+ subtype = SpellSchool(ESpellSchool::AIR);
|
|
|
}
|
|
|
else if(deprecatedSubtype == SecondarySkill::WATER_MAGIC || deprecatedSubtypeStr == "skill.waterMagic")
|
|
|
{
|
|
|
type = BonusType::MAGIC_SCHOOL_SKILL;
|
|
|
- subtypeRelevant = true;
|
|
|
- subtype = 1;
|
|
|
+ subtype = SpellSchool(ESpellSchool::WATER);
|
|
|
}
|
|
|
else if(deprecatedSubtype == SecondarySkill::FIRE_MAGIC || deprecatedSubtypeStr == "skill.fireMagic")
|
|
|
{
|
|
|
type = BonusType::MAGIC_SCHOOL_SKILL;
|
|
|
- subtypeRelevant = true;
|
|
|
- subtype = 2;
|
|
|
+ subtype = SpellSchool(ESpellSchool::FIRE);
|
|
|
}
|
|
|
else if(deprecatedSubtype == SecondarySkill::EARTH_MAGIC || deprecatedSubtypeStr == "skill.earthMagic")
|
|
|
{
|
|
|
type = BonusType::MAGIC_SCHOOL_SKILL;
|
|
|
- subtypeRelevant = true;
|
|
|
- subtype = 8;
|
|
|
+ subtype = SpellSchool(ESpellSchool::EARTH);
|
|
|
}
|
|
|
else if (deprecatedSubtype == SecondarySkill::ARTILLERY || deprecatedSubtypeStr == "skill.artillery")
|
|
|
{
|
|
|
type = BonusType::BONUS_DAMAGE_CHANCE;
|
|
|
- subtypeRelevant = true;
|
|
|
subtypeStr = "core:creature.ballista";
|
|
|
}
|
|
|
else if (deprecatedSubtype == SecondarySkill::FIRST_AID || deprecatedSubtypeStr == "skill.firstAid")
|
|
|
{
|
|
|
type = BonusType::SPECIFIC_SPELL_POWER;
|
|
|
- subtypeRelevant = true;
|
|
|
subtypeStr = "core:spell.firstAid";
|
|
|
}
|
|
|
else if (deprecatedSubtype == SecondarySkill::BALLISTICS || deprecatedSubtypeStr == "skill.ballistics")
|
|
|
{
|
|
|
type = BonusType::CATAPULT_EXTRA_SHOTS;
|
|
|
- subtypeRelevant = true;
|
|
|
subtypeStr = "core:spell.catapultShot";
|
|
|
}
|
|
|
else
|
|
@@ -142,7 +157,6 @@ BonusParams::BonusParams(std::string deprecatedTypeStr, std::string deprecatedSu
|
|
|
else if (deprecatedSubtype == SecondarySkill::ARTILLERY || deprecatedSubtypeStr == "skill.artillery")
|
|
|
{
|
|
|
type = BonusType::HERO_GRANTS_ATTACKS;
|
|
|
- subtypeRelevant = true;
|
|
|
subtypeStr = "core:creature.ballista";
|
|
|
}
|
|
|
else
|
|
@@ -151,52 +165,41 @@ BonusParams::BonusParams(std::string deprecatedTypeStr, std::string deprecatedSu
|
|
|
else if (deprecatedTypeStr == "SEA_MOVEMENT")
|
|
|
{
|
|
|
subtype = 0;
|
|
|
- subtypeRelevant = true;
|
|
|
valueType = BonusValueType::ADDITIVE_VALUE;
|
|
|
- valueTypeRelevant = true;
|
|
|
type = BonusType::MOVEMENT;
|
|
|
}
|
|
|
else if (deprecatedTypeStr == "LAND_MOVEMENT")
|
|
|
{
|
|
|
subtype = 1;
|
|
|
- subtypeRelevant = true;
|
|
|
valueType = BonusValueType::ADDITIVE_VALUE;
|
|
|
- valueTypeRelevant = true;
|
|
|
type = BonusType::MOVEMENT;
|
|
|
}
|
|
|
else if (deprecatedTypeStr == "MAXED_SPELL")
|
|
|
{
|
|
|
type = BonusType::SPELL;
|
|
|
subtypeStr = deprecatedSubtypeStr;
|
|
|
- subtypeRelevant = true;
|
|
|
valueType = BonusValueType::INDEPENDENT_MAX;
|
|
|
- valueTypeRelevant = true;
|
|
|
val = 3;
|
|
|
- valRelevant = true;
|
|
|
}
|
|
|
else if (deprecatedTypeStr == "FULL_HP_REGENERATION")
|
|
|
{
|
|
|
type = BonusType::HP_REGENERATION;
|
|
|
val = 100000; //very high value to always chose stack health
|
|
|
- valRelevant = true;
|
|
|
}
|
|
|
else if (deprecatedTypeStr == "KING1")
|
|
|
{
|
|
|
type = BonusType::KING;
|
|
|
val = 0;
|
|
|
- valRelevant = true;
|
|
|
}
|
|
|
else if (deprecatedTypeStr == "KING2")
|
|
|
{
|
|
|
type = BonusType::KING;
|
|
|
val = 2;
|
|
|
- valRelevant = true;
|
|
|
}
|
|
|
else if (deprecatedTypeStr == "KING3")
|
|
|
{
|
|
|
type = BonusType::KING;
|
|
|
val = 3;
|
|
|
- valRelevant = true;
|
|
|
}
|
|
|
else if (deprecatedTypeStr == "SIGHT_RADIOUS")
|
|
|
type = BonusType::SIGHT_RADIUS;
|
|
@@ -204,17 +207,59 @@ BonusParams::BonusParams(std::string deprecatedTypeStr, std::string deprecatedSu
|
|
|
{
|
|
|
type = BonusType::MORALE;
|
|
|
val = 1;
|
|
|
- valRelevant = true;
|
|
|
valueType = BonusValueType::INDEPENDENT_MAX;
|
|
|
- valueTypeRelevant = true;
|
|
|
}
|
|
|
else if (deprecatedTypeStr == "SELF_LUCK")
|
|
|
{
|
|
|
type = BonusType::LUCK;
|
|
|
val = 1;
|
|
|
- valRelevant = true;
|
|
|
valueType = BonusValueType::INDEPENDENT_MAX;
|
|
|
- valueTypeRelevant = true;
|
|
|
+ }
|
|
|
+ else if (deprecatedTypeStr == "DIRECT_DAMAGE_IMMUNITY")
|
|
|
+ {
|
|
|
+ type = BonusType::SPELL_DAMAGE_REDUCTION;
|
|
|
+ subtype = SpellSchool(ESpellSchool::ANY);
|
|
|
+ val = 100;
|
|
|
+ }
|
|
|
+ else if (deprecatedTypeStr == "AIR_SPELL_DMG_PREMY")
|
|
|
+ {
|
|
|
+ type = BonusType::SPELL_DAMAGE;
|
|
|
+ subtype = SpellSchool(ESpellSchool::AIR);
|
|
|
+ }
|
|
|
+ else if (deprecatedTypeStr == "FIRE_SPELL_DMG_PREMY")
|
|
|
+ {
|
|
|
+ type = BonusType::SPELL_DAMAGE;
|
|
|
+ subtype = SpellSchool(ESpellSchool::FIRE);
|
|
|
+ }
|
|
|
+ else if (deprecatedTypeStr == "WATER_SPELL_DMG_PREMY")
|
|
|
+ {
|
|
|
+ type = BonusType::SPELL_DAMAGE;
|
|
|
+ subtype = SpellSchool(ESpellSchool::WATER);
|
|
|
+ }
|
|
|
+ else if (deprecatedTypeStr == "EARTH_SPELL_DMG_PREMY")
|
|
|
+ {
|
|
|
+ type = BonusType::SPELL_DAMAGE;
|
|
|
+ subtype = SpellSchool(ESpellSchool::EARTH);
|
|
|
+ }
|
|
|
+ else if (deprecatedTypeStr == "AIR_SPELLS")
|
|
|
+ {
|
|
|
+ type = BonusType::SPELLS_OF_SCHOOL;
|
|
|
+ subtype = SpellSchool(ESpellSchool::AIR);
|
|
|
+ }
|
|
|
+ else if (deprecatedTypeStr == "FIRE_SPELLS")
|
|
|
+ {
|
|
|
+ type = BonusType::SPELLS_OF_SCHOOL;
|
|
|
+ subtype = SpellSchool(ESpellSchool::FIRE);
|
|
|
+ }
|
|
|
+ else if (deprecatedTypeStr == "WATER_SPELLS")
|
|
|
+ {
|
|
|
+ type = BonusType::SPELLS_OF_SCHOOL;
|
|
|
+ subtype = SpellSchool(ESpellSchool::WATER);
|
|
|
+ }
|
|
|
+ else if (deprecatedTypeStr == "EARTH_SPELLS")
|
|
|
+ {
|
|
|
+ type = BonusType::SPELLS_OF_SCHOOL;
|
|
|
+ subtype = SpellSchool(ESpellSchool::EARTH);
|
|
|
}
|
|
|
else
|
|
|
isConverted = false;
|
|
@@ -226,16 +271,16 @@ const JsonNode & BonusParams::toJson()
|
|
|
if(ret.isNull())
|
|
|
{
|
|
|
ret["type"].String() = vstd::findKey(bonusNameMap, type);
|
|
|
- if(subtypeRelevant && !subtypeStr.empty())
|
|
|
- ret["subtype"].String() = subtypeStr;
|
|
|
- else if(subtypeRelevant)
|
|
|
- ret["subtype"].Integer() = subtype;
|
|
|
- if(valueTypeRelevant)
|
|
|
- ret["valueType"].String() = vstd::findKey(bonusValueMap, valueType);
|
|
|
- if(valRelevant)
|
|
|
- ret["val"].Float() = val;
|
|
|
- if(targetTypeRelevant)
|
|
|
- ret["targetSourceType"].String() = vstd::findKey(bonusSourceMap, targetType);
|
|
|
+ if(subtypeStr)
|
|
|
+ ret["subtype"].String() = *subtypeStr;
|
|
|
+ else if(subtype)
|
|
|
+ ret["subtype"].Integer() = *subtype;
|
|
|
+ if(valueType)
|
|
|
+ ret["valueType"].String() = vstd::findKey(bonusValueMap, *valueType);
|
|
|
+ if(val)
|
|
|
+ ret["val"].Float() = *val;
|
|
|
+ if(targetType)
|
|
|
+ ret["targetSourceType"].String() = vstd::findKey(bonusSourceMap, *targetType);
|
|
|
jsonCreated = true;
|
|
|
}
|
|
|
return ret;
|
|
@@ -244,16 +289,19 @@ const JsonNode & BonusParams::toJson()
|
|
|
CSelector BonusParams::toSelector()
|
|
|
{
|
|
|
assert(isConverted);
|
|
|
- if(subtypeRelevant && !subtypeStr.empty())
|
|
|
- JsonUtils::resolveIdentifier(subtype, toJson(), "subtype");
|
|
|
+ if(subtypeStr)
|
|
|
+ {
|
|
|
+ subtype = -1;
|
|
|
+ JsonUtils::resolveIdentifier(*subtype, toJson(), "subtype");
|
|
|
+ }
|
|
|
|
|
|
auto ret = Selector::type()(type);
|
|
|
- if(subtypeRelevant)
|
|
|
- ret = ret.And(Selector::subtype()(subtype));
|
|
|
- if(valueTypeRelevant)
|
|
|
- ret = ret.And(Selector::valueType(valueType));
|
|
|
- if(targetTypeRelevant)
|
|
|
- ret = ret.And(Selector::targetSourceType()(targetType));
|
|
|
+ if(subtype)
|
|
|
+ ret = ret.And(Selector::subtype()(*subtype));
|
|
|
+ if(valueType)
|
|
|
+ ret = ret.And(Selector::valueType(*valueType));
|
|
|
+ if(targetType)
|
|
|
+ ret = ret.And(Selector::targetSourceType()(*targetType));
|
|
|
return ret;
|
|
|
}
|
|
|
|