-- Path of Building
--
-- Active Strength skill gems
-- Skill data (c) Grinding Gear Games
--
local skills, mod, flag, skill = ...

#skill Absolution
#flags spell minion duration area
	minionList = {
		"AbsolutionTemplarJudge",
		"AbsolutionTemplarJudgeVaal",
	},
	statMap = {
		["skill_physical_damage_%_to_convert_to_lightning"] = {
			mod("SkillPhysicalDamageConvertToLightning", "BASE", nil),
			mod("MinionModifier", "LIST", { mod = mod("SkillPhysicalDamageConvertToLightning", "BASE", nil, 0, 0) })
		},
	},
#baseMod skill("radius", 25)
#mods

#skill AbsolutionAltX
#flags spell minion duration area
	minionList = {
		"AbsolutionTemplarJudge",
		"AbsolutionTemplarJudgeVaal",
	},
	statMap = {
		["skill_physical_damage_%_to_convert_to_lightning"] = {
			mod("SkillPhysicalDamageConvertToLightning", "BASE", nil),
			mod("MinionModifier", "LIST", { mod = mod("SkillPhysicalDamageConvertToLightning", "BASE", nil, 0, 0) })
		},
	},
#baseMod skill("radius", 25)
#mods

#skill VaalAbsolution
#flags spell minion duration area
	statMap = {
		["vaal_upgrade_minion_damage_+%_final"] = {
		-- Stat is handled directly on minion
		},
		["vaal_upgrade_minion_damage_taken_+%_final"] = {
		-- Stat is handled directly on minion
		},
	},
#mods

#skill AncestralCry
#flags warcry area duration
	statMap = {
		["skill_empowers_next_x_melee_attacks"] = {
			mod("AncestralExertedAttacks", "BASE", nil),
		},
		["ancestral_cry_elemental_resist_%_per_5_power_up_to_cap"] = {
			mod("ElementalResist", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Warcry", div = 5, limit = 30 }),
		},
		["ancestral_cry_maximum_elemental_resist_%_per_10_power_up_to_cap"] = {
			mod("ElementalResistMax", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Warcry", div = 10, limit = 30 }),
		},
		["skill_empower_limitation_specifier_for_stat_description"] = {
			-- Display only
		},
	},
#baseMod skill("radius", 60)
#mods

#skill Anger
#flags spell aura area
	statMap = {
		["attack_minimum_added_fire_damage"] = {
			mod("FireMin", "BASE", nil, 0, KeywordFlag.Attack, { type = "GlobalEffect", effectType = "Aura" }),
		},
		["attack_maximum_added_fire_damage"] = {
			mod("FireMax", "BASE", nil, 0, KeywordFlag.Attack, { type = "GlobalEffect", effectType = "Aura" }),
		},
		["spell_minimum_added_fire_damage"] = {
			mod("FireMin", "BASE", nil, 0, KeywordFlag.Spell, { type = "GlobalEffect", effectType = "Aura" }),
		},
		["spell_maximum_added_fire_damage"] = {
			mod("FireMax", "BASE", nil, 0, KeywordFlag.Spell, { type = "GlobalEffect", effectType = "Aura" }),
		},
	},
#baseMod skill("radius", 40)
#mods

#skill AnimateGuardian
#flags spell minion permanentMinion
	minionHasItemSet = true,
	minionUses = {
		["Weapon 1"] = true,
		["Weapon 2"] = true,
		["Helmet"] = true,
		["Body Armour"] = true,
		["Gloves"] = true,
		["Boots"] = true,
	},
	minionList = {
		"AnimatedArmour",
	},
#mods

#skill AnimateGuardianAltX
#flags spell minion permanentMinion
	minionHasItemSet = true,
	minionUses = {
		["Weapon 1"] = true,
		["Weapon 2"] = true,
		["Helmet"] = true,
		["Body Armour"] = true,
		["Gloves"] = true,
		["Boots"] = true,
	},
	minionList = {
		"AnimatedArmour",
	},
#mods

#skill Autoexertion
#flags spell
	statMap = {
		["call_to_arms_behaviour"] = {
			-- Display only
		},
	},
#mods

#skill SupportAutoexertion
	statMap = {
		["warcries_do_not_apply_buffs_to_self_or_allies"] = {
			flag("CannotShareWarcryBuffs"),
		},
		["support_autoexertion_base_mana_cost_override"] = {
			mod("BaseManaCostOverride", "OVERRIDE", nil),
		},
	},
#mods

#skill BattlemagesCry
#flags area duration warcry
	statMap = {
		["skill_empowers_next_x_melee_attacks"] = {
			mod("BattlemageExertedAttacks", "BASE", nil),
		},
		["divine_cry_additional_base_critical_strike_chance_per_5_power_up_to_cap"] = {
			mod("CritChance", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Warcry", div = 5, limit = 25 }),
			div = 100,
		},
		["display_battlemage_cry_exerted_attacks_trigger_supported_spell"] ={
			-- Display only
		},
	},
#baseMod skill("radius", 60)
#mods

#skill BattlemagesCrySupport
	statMap = {
		["support_divine_cry_damage_+%_final"] = {
			mod("Damage", "MORE", nil),
		},
		["triggered_by_divine_cry"] = {
			skill("triggeredByBattleMageCry", true),
		},
	},
#mods

#skill Berserk
#flags spell
	statMap = {
		["berserk_rage_effect_+%"] = {
			mod("RageEffect", "INC", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff", unscalable = true }),
		},
	},
#mods

#skill Bladestorm
#flags attack melee area duration
	parts = {
		{
			name = "Attack",
		},
		{
			name = "Bladestorm",
		},
	},
	statMap = {
		["bladestorm_storm_damage_+%_final"] = {
			mod("Damage", "MORE", nil, 0, 0, { type = "SkillPart", skillPart = 2 }),
		},
		["bladestorm_attack_speed_+%_final_while_in_bloodstorm"] = {
			mod("Speed", "MORE", nil, ModFlag.Attack, 0, { type = "Condition", var = "BladestormInBloodstorm" }),
		},
		["bladestorm_movement_speed_+%_while_in_sandstorm"] = {
			mod("MovementSpeed", "INC", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Sandstorm", effectCond = "BladestormInSandstorm" }),
		},
	},
#baseMod skill("radius", 24)
#baseMod skill("radiusLabel", "Area of initial attack:")
#baseMod skill("radiusSecondary", 20)
#baseMod skill("radiusSecondaryLabel", "Area of bladestorms:")
#baseMod mod("BleedChance", "BASE", 100, ModFlag.Attack, 0, { type = "Condition", var = "BloodStance" }, { type = "SkillPart", skillPart = 2 })
#mods

#skill BladestormAltX
#flags attack melee area duration
	parts = {
		{
			name = "Attack",
		},
		{
			name = "Bladestorm",
		},
	},
	statMap = {
		["bladestorm_storm_damage_+%_final"] = {
			mod("Damage", "MORE", nil, 0, 0, { type = "SkillPart", skillPart = 2 }),
		},
		["bladestorm_attack_speed_+%_final_while_in_bloodstorm"] = {
			mod("Speed", "MORE", nil, ModFlag.Attack, 0, { type = "Condition", var = "BladestormInBloodstorm" }),
		},
		["bladestorm_movement_speed_+%_while_in_sandstorm"] = {
			mod("MovementSpeed", "INC", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Sandstorm", effectCond = "BladestormInSandstorm" }),
		},
	},
#baseMod skill("radius", 24)
#baseMod skill("radiusLabel", "Area of initial attack:")
#baseMod skill("radiusSecondary", 20)
#baseMod skill("radiusSecondaryLabel", "Area of bladestorms:")
#mods

#skill BloodAndSand
#flags spell
	statMap = {
		["blood_sand_stance_melee_skills_area_of_effect_+%_final_in_blood_stance"] = {
			mod("AreaOfEffect", "MORE", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Blood", effectCond = "BloodStance"}, { type = "SkillType", skillType = SkillType.Melee })
		},
		["blood_sand_stance_melee_skills_area_damage_+%_final_in_blood_stance"] = {
			mod("Damage", "MORE", nil, ModFlag.Area, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Blood", effectCond = "BloodStance"}, { type = "SkillType", skillType = SkillType.Melee })
		},
		["blood_sand_stance_melee_skills_area_of_effect_+%_final_in_sand_stance"] = {
			mod("AreaOfEffect", "MORE", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Sand", effectCond = "SandStance"}, { type = "SkillType", skillType = SkillType.Melee })
		},
		["blood_sand_stance_melee_skills_area_damage_+%_final_in_sand_stance"] = {
			mod("Damage", "MORE", nil, ModFlag.Area, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Sand", effectCond = "SandStance"}, { type = "SkillType", skillType = SkillType.Melee })
		},
	},
#mods

#skill Boneshatter
#flags attack melee area duration
	parts = {
		{
			name = "Attack",
			area = false,
		},
		{
			name = "Pulse",
			area = true,
		},
	},
	statMap = {
		["trauma_strike_damage_+%_final_per_trauma"] = {
			mod("Damage", "MORE", nil, 0, 0, { type = "Multiplier", var = "TraumaStacks" }),
		},
		["boneshatter_trauma_base_duration_ms"] = {
			mod("TraumaDuration", "BASE", nil),
			div = 1000,
		},
		["quality_display_boneshatter_is_gem"] = {
			-- Display only
		},
	},
#baseMod skill("radius", 14, { type = "SkillPart", skillPart = 2 })
#baseMod flag("HasTrauma")
#mods

#skill BoneshatterAltX
#flags attack melee area duration
	parts = {
		{
			name = "Attack",
			area = false,
		},
		{
			name = "Pulse",
			area = true,
		},
	},
	statMap = {
		["trauma_strike_damage_+%_final_per_trauma_capped"] = {
			mod("Damage", "MORE", nil, 0, 0, { type = "Multiplier", var = "TraumaStacks", limitVar = "TraumaStacksMax" }),
		},
		["boneshatter_trauma_base_duration_ms"] = {
			mod("TraumaDuration", "BASE", nil),
			div = 1000,
		},
		["lose_all_trauma_at_X_trauma"] = {
			mod("Multiplier:TraumaStacksMax", "BASE", nil),
		},
		["quality_display_boneshatter_is_gem"] = {
			-- Display only
		},
	},
#baseMod skill("radius", 14, { type = "SkillPart", skillPart = 2 })
#baseMod flag("HasTrauma")
#mods

#skill BoneshatterAltY
#flags attack melee area
	parts = {
		{
			name = "Attack",
			area = false,
		},
		{
			name = "Pulse",
			area = true,
		},
	},
#baseMod skill("radius", 14, { type = "SkillPart", skillPart = 2 })
#mods

#skill ChainHook
#flags attack melee area
	statMap = {
		["chain_strike_cone_radius_+_per_x_rage"] = {
			mod("AreaOfEffect", "BASE", nil, 0, 0, { type = "Multiplier", var = "Rage", div = 5 }),
			div = 5,
		},
		["quality_display_chain_hook_is_gem"] = {
			-- Display only
		},
	},
#baseMod skill("radius", 24)
#mods

#skill ChainHookAltY
#flags attack melee area
	statMap = {
		["chain_strike_cone_radius_+_per_x_rage"] = {
			mod("AreaOfEffect", "BASE", nil, 0, 0, { type = "Multiplier", var = "Rage", div = 5 }),
			div = 5,
		},
		["chain_hook_attachment_rage_to_gain_per_hit"] = {
			flag("Condition:CanGainRage", { type = "GlobalEffect", effectType = "Buff", effectName = "Rage" } ),
		},
		["chain_hook_attachment_range"] = {
			skill("radiusSecondary", nil),
		}
	},
#baseMod skill("radius", 24)
#baseMod skill("radiusLabel", "Strike area:")
#baseMod skill("radiusSecondaryLabel", "Chain length:")
#mods

#skill Cleave
#flags attack melee area
	statMap = {
		["cleave_+1_base_radius_per_nearby_enemy_up_to_10"] = {
			skill("radiusExtra", nil, { type = "Multiplier", var = "NearbyEnemies", limit = 10, limitTotal = true })
		},
	},
#baseMod skill("radius", 20)
#mods

#skill CleaveAltX
#flags attack melee area
	statMap = {
		["chain_strike_cone_radius_+_per_x_rage"] = {
			mod("AreaOfEffect", "BASE", nil, 0, 0, { type = "Multiplier", var = "Rage", div = 5 }),
			div = 5,
		},
		["quality_display_chain_hook_is_gem"] = {
			-- Display only
		},
	},
#baseMod skill("radius", 20)
#mods

#skill VaalCleave
#flags attack area duration melee
	statMap = {
		["cleave_+1_base_radius_per_nearby_enemy_up_to_10"] = {
			skill("radiusExtra", nil, { type = "Multiplier", var = "NearbyEnemies", limit = 10, limitTotal = true })
		},
		["vaal_cleave_executioner_damage_against_enemies_on_low_life_+%"] = {
			mod("Damage", "MORE", nil, 0, bit.bor(KeywordFlag.Hit, KeywordFlag.Ailment), { type = "ActorCondition", actor = "enemy", var = "LowLife" }, { type = "SkillName", skillName = "Cleave", includeTransfigured = true }, { type = "GlobalEffect", effectType = "Buff", effectName = "Vaal Cleave", unscalable = true } ),
		},
		["vaal_cleave_executioner_area_of_effect_+%"] = {
			mod("AreaOfEffect", "MORE", nil, 0, 0, { type = "SkillName", skillName = "Cleave", includeTransfigured = true }, { type = "GlobalEffect", effectType = "Buff", effectName = "Vaal Cleave", unscalable = true } ),
		},
	},
#baseMod mod("CullPercent", "MAX", 10, 0, 0, { type = "SkillName", skillName = "Cleave", includeTransfigured = true }, { type = "GlobalEffect", effectType = "Buff", effectName = "Vaal Cleave", unscalable = true } )
#mods

#skill ConsecratedPath
#flags attack melee area duration
	statMap = {
		["groundslam_damage_to_close_targets_+%_final"] = {
			mod("Damage", "MORE", nil, ModFlag.Hit, 0, { type = "Condition", var = "AtCloseRange" })
		},
		["quality_display_groundslam_is_gem"] = {
			-- Display only
		},
	},
#baseMod skill("radius", 23)
#mods

#skill ConsecratedPathAltX
#flags attack melee area duration
	statMap = {
		["groundslam_damage_to_close_targets_+%_final"] = {
			mod("Damage", "MORE", nil, ModFlag.Hit, 0, { type = "Condition", var = "AtCloseRange" })
		},
		["quality_display_groundslam_is_gem"] = {
			-- Display only
		},
	},
#baseMod skill("radius", 23)
#mods

#skill CorruptingFever
#flags spell duration
#baseMod skill("debuff", true)
#baseMod flag("dotIsCorruptingBlood")
#baseMod mod("Multiplier:CorruptingFeverMaxStages", "BASE", 10)
#baseMod mod("Damage", "MORE", 100, ModFlag.Dot, 0, { type = "Multiplier", var = "CorruptingFeverStageAfterFirst"})
#mods

#skill CrushingFist
#flags attack melee area
#mods

#skill DecoyTotem
#flags spell totem area duration
#baseMod skill("radius", 60)
#mods

#skill DefianceBanner
#flags spell area duration aura banner
	statMap = {
		["base_movement_velocity_+%"] = {
			mod("MovementSpeed", "INC", nil, 0, 0, { type = "GlobalEffect", effectType = "Aura" }),
		},
		["base_spell_suppression_chance_%"] = {
			mod("SpellSuppressionChance", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Aura" }),
		},
	},
#baseMod skill("radius", 24)
#baseMod mod("AuraEffect", "MORE", -100, 0, 0, { type = "Condition", var = "BannerPlanted", neg = true })
#baseMod flag("Condition:AffectedByPlacedBanner", { type = "Condition", var = "BannerPlanted" }, { type = "GlobalEffect", effectType = "Buff" })
#mods

#skill Determination
#flags spell aura area
	statMap = {
		["determination_aura_armour_+%_final"] = {
			mod("Armour", "MORE", nil, 0, 0, { type = "GlobalEffect", effectType = "Aura" }),
		},
		["base_physical_damage_reduction_rating"] = {
			mod("Armour", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Aura" }),
		},
	},
#baseMod skill("radius", 40)
#mods

#skill DevouringTotem
#flags spell totem duration
	statMap = {
		["corpse_consumption_life_to_gain"] = {
			skill("lifeLeechPerUse", nil),
		},
		["corpse_consumption_mana_to_gain"] = {
			skill("manaLeechPerUse", nil),
		},
	},
#mods

#skill DominatingBlow
#flags attack melee duration minion
	minionList = {
		"AxisEliteSoldierDominatingBlow",
		"AxisEliteSoldierDominatingBlowVaal",
	},
#mods

#skill DominatingBlowAltX
#flags attack melee duration minion
	minionList = {
		"AxisEliteSoldierDominatingBlow",
		"AxisEliteSoldierDominatingBlowVaal",
	},
#mods

#skill VaalDomination
#flags attack melee duration minion
	statMap = {
		["vaal_upgrade_minion_damage_+%_final"] = {
		-- Stat is handled directly on minion
		},
		["vaal_upgrade_minion_damage_taken_+%_final"] = {
		-- Stat is handled directly on minion
		},
	},
#mods

#skill DreadBanner
#flags spell
	statMap = {
		["recover_X_life_on_block"] = {
			mod("LifeOnBlock", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Aura" }),
		},
		["additional_block_%"] = {
			mod("BlockChance", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Aura" }),
		},
	},
#baseMod skill("radius", 24)
#baseMod mod("AuraEffect", "MORE", -100, 0, 0, { type = "Condition", var = "BannerPlanted", neg = true })
#baseMod flag("Condition:AffectedByPlacedBanner", { type = "Condition", var = "BannerPlanted" }, { type = "GlobalEffect", effectType = "Buff" })
#mods

#skill Earthquake
#flags attack melee area duration
	preDamageFunc = function(activeSkill, output)
		local duration = math.floor(activeSkill.skillData.duration * output.DurationMod * 10)
		activeSkill.skillModList:NewMod("Damage", "INC", activeSkill.skillModList:Sum("INC", activeSkill.skillCfg, "EarthquakeDurationIncDamage") * duration, "Skill:Earthquake")
	end,
	parts = {
		{
			name = "Initial impact",
		},
		{
			name = "Aftershock",
		},
	},
	statMap = {
		["quake_slam_fully_charged_explosion_damage_+%_final"] = {
			mod("Damage", "MORE", nil, 0, bit.bor(KeywordFlag.Hit, KeywordFlag.Ailment), { type = "SkillPart", skillPart = 2 }),
		},
		["quality_display_earthquake_is_gem"] = {
			-- Display only
		},
	},
#baseMod skill("showAverage", true, { type = "SkillPart", skillPart = 2 })
#baseMod skill("radius", 18, { type = "SkillPart", skillPart = 1 })
#baseMod skill("radius", 28, { type = "SkillPart", skillPart = 2 })
#mods

#skill EarthquakeAltX
#flags attack melee area duration
	parts = {
		{
			name = "Initial impact",
		},
		{
			name = "Aftershock",
		},
	},
	statMap = {
		["earthquake_skill_aftershock_hit_damage_+%_final_per_100ms_duration"] = {
			mod("Damage", "MORE", nil, 0, KeywordFlag.Hit, { type = "SkillPart", skillPart = 2 }, { type = "Multiplier", var = "100msEarthquakeDuration"} ),
		},
		["earthquake_skill_aftershock_ailment_damage_+%_final_per_100ms_duration"] = {
			mod("Damage", "MORE", nil, 0, KeywordFlag.Ailment, { type = "SkillPart", skillPart = 2 }, { type = "Multiplier", var = "100msEarthquakeDuration"} ),
		},
		["earthquake_skill_aftershock_area_of_effect_+%_final_per_100ms_duration"] = {
			mod("AreaOfEffect", "MORE", nil, 0, 0, { type = "SkillPart", skillPart = 2 }, { type = "Multiplier", var = "100msEarthquakeDuration"} ),
		},
	},
#baseMod skill("showAverage", true, { type = "SkillPart", skillPart = 2 })
#baseMod skill("radius", 18, { type = "SkillPart", skillPart = 1 })
#baseMod skill("radius", 28, { type = "SkillPart", skillPart = 2 })
#mods

#skill VaalEarthquake
#flags attack melee area duration
	parts = {
		{
			name = "Initial impact",
		},
		{
			name = "Aftershock",
		},
	},
	statMap = {
		["quake_slam_fully_charged_explosion_damage_+%_final"] = {
			mod("Damage", "MORE", nil, 0, bit.bor(KeywordFlag.Hit, KeywordFlag.Ailment), { type = "SkillPart", skillPart = 2 }),
		},
		["quality_display_earthquake_is_gem"] = {
			-- Display only
		},
	},
#baseMod skill("showAverage", true, { type = "SkillPart", skillPart = 2 })
#baseMod skill("radius", 18, { type = "SkillPart", skillPart = 1 })
#baseMod skill("radius", 28, { type = "SkillPart", skillPart = 2 })
#mods

#skill Earthshatter
#flags attack melee area duration
	parts = {
		{
			name = "Initial impact",
		},
		{
			name = "Spike",
		},
	},
	statMap = {
		["spike_slam_explosion_damage_+%_final"] = {
			mod("Damage", "MORE", nil, 0, 0, { type = "SkillPart", skillPart = 2 }),
		},
		["active_skill_area_of_effect_+%_final"] = {
			mod("AreaOfEffect", "MORE", nil),
		},
		["spike_slam_spike_damage_+%_final"] = {
			mod("Damage", "MORE", nil, 0, 0, { type = "SkillPart", skillPart = 2 }),
		},
		["quality_display_earthshatter_spike_damage_is_gem"] = {
			-- Display only
		},
	},
#baseMod skill("radius", 18, { type = "SkillPart", skillPart = 1 })
#mods

#skill EarthshatterAltX
#flags attack melee area duration
	parts = {
		{
			name = "Initial impact",
		},
		{
			name = "Spike",
		},
	},
	statMap = {
		["spike_slam_explosion_damage_+%_final"] = {
			mod("Damage", "MORE", nil, 0, 0, { type = "SkillPart", skillPart = 2 }),
		},
		["spike_slam_spike_damage_+%_final"] = {
			mod("Damage", "MORE", nil, 0, 0, { type = "SkillPart", skillPart = 2 }),
		},
		["quality_display_earthshatter_spike_damage_is_gem"] = {
			-- Display only
		},
	},
#baseMod skill("radius", 18, { type = "SkillPart", skillPart = 1 })
#mods

#skill EarthshatterAltY
#flags attack melee area duration
	parts = {
		{
			name = "Initial impact",
		},
		{
			name = "Spike",
		},
	},
	statMap = {
		["spike_slam_explosion_damage_+%_final"] = {
			mod("Damage", "MORE", nil, 0, 0, { type = "SkillPart", skillPart = 2 }),
		},
		["earthshatter_spike_area_of_effect_+%_final"] = {
			mod("AreaOfEffect", "MORE", nil, 0, 0, { type = "SkillPart", skillPart = 2 }),
		},
		["quality_display_earthshatter_spike_damage_is_gem"] = {
			-- Display only
		},
	},
#baseMod skill("radius", 18, { type = "SkillPart", skillPart = 1 })
#mods

#skill EnduringCry
#flags warcry area duration
	statMap = {
		["enduring_cry_life_regeneration_rate_per_minute_%_per_5_power_up_to_cap"] = {
			mod("LifeRegenPercent", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Warcry", div = 5, limit = 25 }),
			div = 60,
		},
	},
#baseMod skill("radius", 60)
#mods

#skill Eviscerate
#flags attack melee area
	parts = {
		{
			name = "1 Wave",
		},
		{
			name = "Both Waves",
		},
	},
#baseMod skill("dpsMultiplier", 2, { type = "SkillPart", skillPart = 2 })
#mods

#skill Exsanguinate
#flags spell duration chaining
	statMap = {
		["base_physical_damage_to_deal_per_minute"] = {
			skill("PhysicalDot", nil, { type = "Condition", var = "ExsanguinateDebuffIsFireDamage", neg = true }),
			skill("FireDot", nil, { type = "Condition", var = "ExsanguinateDebuffIsFireDamage"}),
			div = 60,
		},
	},
#baseMod skill("debuff", true)
#baseMod mod("Multiplier:ExsanguinateMaxStages", "BASE", 3)
#baseMod mod("PhysicalDamage", "MORE", 100, 0, KeywordFlag.PhysicalDot, { type = "Multiplier", var = "ExsanguinateStageAfterFirst"}, { type = "Condition", var = "ExsanguinateDebuffIsFireDamage", neg = true })
#baseMod mod("FireDamage", "MORE", 100, bit.bor(ModFlag.Spell,ModFlag.Dot), 0, { type = "Multiplier", var = "ExsanguinateStageAfterFirst"}, { type = "Condition", var = "ExsanguinateDebuffIsFireDamage" })
#mods

#skill ExsanguinateAltX
#flags spell duration chaining
	statMap = {
		["base_physical_damage_to_deal_per_minute"] = {
			skill("PhysicalDot", nil, { type = "Condition", var = "ExsanguinateDebuffIsFireDamage", neg = true }),
			skill("FireDot", nil, { type = "Condition", var = "ExsanguinateDebuffIsFireDamage"}),
			div = 60,
		},
	},
#baseMod skill("debuff", true)
#baseMod mod("Multiplier:ExsanguinateofTransmissionMaxStages", "BASE", 3)
#baseMod mod("PhysicalDamage", "MORE", 100, 0, KeywordFlag.PhysicalDot, { type = "Multiplier", var = "ExsanguinateofTransmissionStageAfterFirst"}, { type = "Condition", var = "ExsanguinateDebuffIsFireDamage", neg = true })
#baseMod mod("FireDamage", "MORE", 100, bit.bor(ModFlag.Spell,ModFlag.Dot), 0, { type = "Multiplier", var = "ExsanguinateofTransmissionStageAfterFirst"}, { type = "Condition", var = "ExsanguinateDebuffIsFireDamage" })
#mods

#skill FlameLink
#flags spell duration
	statMap = {
		["flame_link_minimum_fire_damage"] = {
			mod("FireMin", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Link" }),
		},
		["flame_link_maximum_fire_damage"] = {
			mod("FireMax", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Link" }),
		},
		["flame_link_added_fire_damage_from_life_%"] = {
			mod("FireMin", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Link" }, { type = "PercentStat", stat = "Life", percent = 1, actor = "parent" }),
			mod("FireMax", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Link" }, { type = "PercentStat", stat = "Life", percent = 1, actor = "parent" }),
		},
	},
#mods

#skill FleshAndStone
#flags spell area aura
	statMap = {
		["flesh_stone_blood_stance_enemies_physical_damage_taken_when_hit_+%_final_from_player_distance"] = {
			mod("PhysicalDamageTaken", "MORE", nil, ModFlag.Hit, 0, { type = "GlobalEffect", effectType = "AuraDebuff", effectCond = "BloodStance" }),
		},
		["flesh_stone_sand_stance_damage_taken_+%_final_from_distance_from_enemy_hits"] = {
			mod("DamageTakenWhenHit", "MORE", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff", effectCond = "SandStance" }),
		},
	},
#baseMod skill("radius", 28)
#mods

#skill FrozenLegion
#flags spell
#mods

#skill FrozenLegionAltX
#flags spell
#mods

#skill FrozenSweep
#flags attack area melee
	parts = {
		{
			name = "1 charge",
		},
		{
			name = "Wait for max charges",
		},
	},
	preDamageFunc = function(activeSkill, output, breakdown)
		local parentSkill
		local m_ceil = math.ceil
		local m_max = math.max
		activeSkill.skillData.showAverage = false
		activeSkill.skillFlags.showAverage = false
		activeSkill.skillFlags.notAverage = true	
		
		for _, skill in ipairs(activeSkill.actor.activeSkillList) do
			if skill.activeEffect.grantedEffect.name == "Frozen Legion" and activeSkill.actor.mainSkill.socketGroup.slot == activeSkill.socketGroup.slot then
				parentSkill = skill
				break
			end
		end

		if parentSkill.skillModList:Flag(parentSkill.skillCfg, "DisableSkill") and not parentSkill.skillModList:Flag(parentSkill.skillCfg, "EnableSkill") then
			return
		end

		activeSkill.skillData.cooldown = parentSkill.skillData.cooldown
		local cooldownOverride = parentSkill.skillModList:Override(parentSkill.skillCfg, "CooldownRecovery")
		local cooldown = cooldownOverride or (parentSkill.skillData.cooldown + parentSkill.skillModList:Sum("BASE", parentSkill.skillCfg, "CooldownRecovery")) / m_max(0, calcLib.mod(parentSkill.skillModList, parentSkill.skillCfg, "CooldownRecovery"))
		output.Cooldown = m_ceil(cooldown * data.misc.ServerTickRate) / data.misc.ServerTickRate
		activeSkill.skillData.hitTimeOverride = output.Cooldown

		local maxStatues = parentSkill.skillData.storedUses + parentSkill.skillModList:Sum("BASE", parentSkill.skillCfg, "AdditionalCooldownUses")
		local statuesWaitedFor

		if activeSkill.skillPart == 1 then
			statuesWaitedFor = 1
		elseif activeSkill.skillPart == 2 then
			statuesWaitedFor = maxStatues
		end
		activeSkill.skillData.averageBurstHits = statuesWaitedFor
	end,
#baseMod skill("radius", 25)
#mods

#skill FrozenSweepAltX
#flags attack area melee
	parts = {
		{
			name = "1 charge",
		},
		{
			name = "Wait for max charges",
		},
	},
	preDamageFunc = function(activeSkill, output, breakdown)
		local parentSkill
		local m_ceil = math.ceil
		local m_max = math.max
		activeSkill.skillData.showAverage = false
		activeSkill.skillFlags.showAverage = false
		activeSkill.skillFlags.notAverage = true

		for _, skill in ipairs(activeSkill.actor.activeSkillList) do
			if skill.activeEffect.grantedEffect.name == "Frozen Legion of Rallying" and activeSkill.actor.mainSkill.socketGroup.slot == activeSkill.socketGroup.slot then
				parentSkill = skill
				break
			end
		end

		if parentSkill.skillModList:Flag(parentSkill.skillCfg, "DisableSkill") and not parentSkill.skillModList:Flag(parentSkill.skillCfg, "EnableSkill") then
			return
		end

		activeSkill.skillData.cooldown = parentSkill.skillData.cooldown
		local cooldownOverride = parentSkill.skillModList:Override(parentSkill.skillCfg, "CooldownRecovery")
		local cooldown = cooldownOverride or (parentSkill.skillData.cooldown + parentSkill.skillModList:Sum("BASE", parentSkill.skillCfg, "CooldownRecovery")) / m_max(0, calcLib.mod(parentSkill.skillModList, parentSkill.skillCfg, "CooldownRecovery"))
		output.Cooldown = m_ceil(cooldown * data.misc.ServerTickRate) / data.misc.ServerTickRate
		activeSkill.skillData.hitTimeOverride = output.Cooldown

		local maxStatues = parentSkill.skillData.storedUses + parentSkill.skillModList:Sum("BASE", parentSkill.skillCfg, "AdditionalCooldownUses")
		local statuesWaitedFor

		if activeSkill.skillPart == 1 then
			statuesWaitedFor = 1
		elseif activeSkill.skillPart == 2 then
			statuesWaitedFor = maxStatues
		end
		activeSkill.skillData.averageBurstHits = statuesWaitedFor
	end,
#baseMod skill("radius", 25)
#mods

#skill GeneralsCry
#flags warcry area duration
	statMap = {
		["spiritual_cry_doubles_summoned_per_5_MP"] = {
		},
		["maximum_number_of_spiritual_cry_warriors"] = {
			mod("GeneralsCryDoubleMaxCount", "BASE", nil),
		},
		["quality_display_generals_cry_is_gem"] = {
			-- Display only
		},
	},
#baseMod skill("radius", 60)
#mods

#skill GeneralsCrySupport
	addFlags = {
		forceMainHand = true,
	},
	statMap = {
		["support_spiritual_cry_damage_+%_final"] = {
			mod("Damage", "MORE", nil),
		},
		["number_of_warcries_exerting_this_action"] = {
		},
	},
#mods

#skill GlacialHammer
#flags attack melee
	statMap = {
		["glacial_hammer_third_hit_freeze_as_though_dealt_damage_+%"] = {
			mod("FreezeAsThoughDealing", "MORE", nil)
		},
	},
#mods

#skill GlacialHammerAltX
#flags attack melee
	statMap = {
		["glacial_hammer_third_hit_always_crits"] = {
			flag("Every3UseCrit"),
		},
	},
#mods

#skill VaalGlacialHammer
#flags attack melee area duration
#baseMod skill("radius", 20)
#mods

#skill GroundSlam
#flags attack melee area
	statMap = {
		["groundslam_damage_to_close_targets_+%_final"] = {
			mod("Damage", "MORE", nil, ModFlag.Hit, 0, { type = "Condition", var = "AtCloseRange" })
		},
		["quality_display_groundslam_is_gem"] = {
			-- Display only
		},
	},
#baseMod skill("radius", 35)
#mods

#skill GroundSlamAltX
#flags attack melee area
	statMap = {
		["groundslam_damage_to_close_targets_+%_final"] = {
			mod("Damage", "MORE", nil, ModFlag.Hit, 0, { type = "Condition", var = "AtCloseRange" })
		},
		["quality_display_groundslam_is_gem"] = {
			-- Display only
		},
	},
#baseMod skill("radius", 35)
#mods

#skill VaalGroundSlam
#flags attack melee area
	statMap = {
		["groundslam_damage_to_close_targets_+%_final"] = {
			mod("Damage", "MORE", nil, ModFlag.Hit, 0, { type = "Condition", var = "AtCloseRange" })
		},
		["vaal_skill_exertable"] = {
			-- Display only
		},
		["quality_display_groundslam_is_gem"] = {
			-- Display only
		},
	},
#baseMod skill("radius", 39)
#mods

#skill HeavyStrike
#flags attack melee
	statMap = {
		["chance_to_deal_double_damage_%"] = {
			mod("DoubleDamageChance", "BASE", nil),
		},
	},
#mods

#skill HeavyStrikeAltY
#flags attack melee
#mods

#skill HeraldOfAsh
	preDamageFunc = function(activeSkill, output)
		activeSkill.skillData.FireDot = (activeSkill.skillData.hoaOverkill or 0) * (1 + activeSkill.skillData.hoaMoreBurn / 100) * activeSkill.skillData.hoaOverkillPercent
	end,
	statMap = {
		["physical_damage_%_to_add_as_fire"] = {
			mod("PhysicalDamageGainAsFire", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff" })
		},
		["herald_of_ash_burning_damage_+%_final"] = {
			skill("hoaMoreBurn", nil),
		},
		["herald_of_ash_burning_%_overkill_damage_per_minute"] = {
			skill("hoaOverkillPercent", nil),
			div = 6000,
		},
		["quality_display_herald_of_ash_is_gem"] = {
			-- Display only
		},
	},
#baseMod skill("radius", 10)
#baseMod flag("dotIsHeraldOfAsh")
#mods

#skill HeraldOfPurity
#flags spell minion duration
	minionList = {
		"AxisEliteSoldierHeraldOfLight",
	},
	statMap = {
		["base_number_of_champions_of_light_allowed"] = {
			mod("ActiveSentinelOfPurityLimit", "BASE", nil)
		},
		["herald_of_purity_physical_damage_+%_final"] = {
			mod("PhysicalDamage", "MORE", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff" }),
		},
	},
#mods

#skill HolyFlameTotem
#flags spell totem projectile duration
#baseMod skill("radius", 16)
#mods

#skill HolyFlameTotemAltX
#flags spell totem projectile duration
#mods

#skill IceCrash
#flags attack melee area
	parts = {
		{
			name = "First Hit",
		},
		{
			name = "Second Hit",
		},
		{
			name = "Third Hit",
		},
	},
	statMap = {
		["ice_crash_second_hit_damage_+%_final"] = {
			mod("Damage", "MORE", nil, 0, 0, { type = "SkillPart", skillPart = 2 }),
		},
		["ice_crash_third_hit_damage_+%_final"] = {
			mod("Damage", "MORE", nil, 0, 0, { type = "SkillPart", skillPart = 3 }),
		},
		["quality_display_ice_crash_is_gem"] = {
			-- Display Only
		},
	},
#baseMod skill("radiusLabel", "First hit:")
#baseMod skill("radiusSecondaryLabel", "Second hit:")
#baseMod skill("radiusTertiaryLabel", "Third hit:")
#mods

#skill IceCrashAltX
#flags attack melee area
#mods

#skill ImmortalCall
#flags spell duration
	statMap = {
		["mortal_call_elemental_damage_taken_+%_final"] = {
			mod("ElementalDamageTaken", "MORE", nil, 0, 0, { type = "GlobalEffect", effectType = "Guard" }),
		},
		["mortal_call_physical_damage_taken_+%_final"] = {
			mod("PhysicalDamageTaken", "MORE", nil, 0, 0, { type = "GlobalEffect", effectType = "Guard" }),
		},
		["mortal_call_physical_damage_taken_per_endurance_charge_consumed_final_permyriad"] = {
			mod("PhysicalDamageTaken", "MORE", nil, 0, 0, { type = "GlobalEffect", effectType = "Guard" }, { type = "Multiplier", var = "RemovableEnduranceCharge", limit = 5 }),
			div = 100,
		},
		["quality_display_immortal_call_is_gem"] = {
			-- Display Only
		},
	},
#mods

#skill VaalImmortalCall
#flags spell duration
#baseMod flag("Condition:CannotDie", { type = "GlobalEffect", effectType = "Guard" })
#mods

#skill InfernalCry
#flags warcry area duration
	statMap = {
		["skill_empowers_next_x_melee_attacks"] = {
			mod("InfernalExertedAttacks", "BASE", nil),
		},
		["infernal_cry_physical_damage_%_to_add_as_fire_per_5_power_up_to_cap"] = {
			mod("PhysicalDamageGainAsFire", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Warcry", div = 5, limit = 25 }),
		},
		["infernal_cry_empowered_attacks_trigger_combust_display"] = {
			-- Display only
		},
	},
#baseMod skill("radius", 60)
#baseMod skill("radiusLabel", "Warcry area:")
#mods

#skill Combust
#flags attack melee area
	statMap = {
		["triggered_by_infernal_cry"] = {
			-- Display only
		},
	},
#baseMod skill("showAverage", true)
#mods

#skill InfernalBlow
#flags attack melee duration
	preDamageFunc = function(activeSkill, output)
		local effect = activeSkill.skillModList:Sum("BASE", activeSkill.skillCfg, "DebuffEffect")
		if activeSkill.skillPart == 2 or activeSkill.skillPart == 3 then
			activeSkill.skillModList:NewMod("Damage", "MORE", effect, "Skill:InfernalBlow", 0, { type = "Multiplier", var = "DebuffStack", base = -100 + effect })
		end
		if activeSkill.skillPart == 3 then
			activeSkill.skillData.dpsMultiplier = 1 / 6
		end
	end,
	parts = {
		{
			name = "Melee Hit",
			area = false
		},
		{
			name = "Debuff Explosion - 1 Stack",
			area = true
		},
		{
			name = "Debuff Explosion - 6 Stacks",
			area = true
		},
	},
	statMap = {
		["infernal_blow_explosion_damage_%_of_total_per_stack"] = {
			mod("DebuffEffect", "BASE", nil)
		},
		["quality_display_infernal_blow_is_gem"] = {
			-- Display Only
		},
		["active_skill_base_area_of_effect_radius"] = {
			skill("radius", nil, { type = "SkillPart", skillPart = 1 }),
		},
		["active_skill_base_secondary_area_of_effect_radius"] = {
			skill("radius", nil, { type = "SkillPart", skillPartList = { 2, 3 } }),
		},
	},
#baseMod skill("showAverage", true, { type = "SkillPart", skillPart = 2 })
#baseMod mod("Multiplier:DebuffStack", "BASE", 5, 0, 0, { type = "SkillPart", skillPart = 3 })
#baseMod skill("radiusLabel", "Hit area:", { type = "SkillPart", skillPart = 1 })
#baseMod skill("radiusLabel", "Explosion area:", { type = "SkillPart", skillPartList = { 2, 3 } })
#mods

#skill InfernalBlowAltX
#flags attack melee duration
	preDamageFunc = function(activeSkill, output)
		local effect = activeSkill.skillModList:Sum("BASE", activeSkill.skillCfg, "DebuffEffect")
		if activeSkill.skillPart == 2 or activeSkill.skillPart == 3 then
			activeSkill.skillModList:NewMod("Damage", "MORE", effect, "Skill:InfernalBlowAltX", 0, { type = "Multiplier", var = "DebuffStack", base = -100 + effect })
		end
		if activeSkill.skillPart == 3 then
			activeSkill.skillData.dpsMultiplier = 1 / 6
		end
	end,
	parts = {
		{
			name = "Melee Hit",
			area = false
		},
		{
			name = "Debuff Explosion - 1 Stack",
			area = true
		},
		{
			name = "Debuff Explosion - 6 Stacks",
			area = true
		},
	},
	statMap = {
		["infernal_blow_explosion_damage_%_of_total_per_stack"] = {
			mod("DebuffEffect", "BASE", nil)
		},
		["quality_display_infernal_blow_is_gem"] = {
			-- Display Only
		},
	},
#baseMod skill("showAverage", true, { type = "SkillPart", skillPart = 2 })
#baseMod mod("Multiplier:DebuffStack", "BASE", 5, 0, 0, { type = "SkillPart", skillPart = 3 })
#mods

#skill IntimidatingCry
#flags warcry area duration
	statMap = {
		["skill_empowers_next_x_melee_attacks"] = {
			mod("IntimidatingExertedAttacks", "BASE", nil),
		},
		["intimidating_cry_movement_speed_+%_per_5_power_up_to_cap"] = {
			mod("MovementSpeed", "INC", nil, 0, 0, { type = "GlobalEffect", effectType = "Warcry", div = 5, limit = 30 }),
		},
		["intimidating_cry_empowerd_attacks_deal_double_damage_display"] = {
		},
	},
#baseMod skill("radius", 60)
#mods

#skill LeapSlam
#flags attack melee area
#mods

#skill LeapSlamAltX
#flags attack melee area
#mods

#skill MoltenShell
#flags hit area duration
	preDamageFunc = function(activeSkill, output)
		local add = (activeSkill.skillData.MoltenShellDamageMitigated or 0) * activeSkill.skillData.moltenShellReflect / 100
		activeSkill.skillData.FireMin = add
		activeSkill.skillData.FireMax = add
	end,
	statMap = {
		["base_physical_damage_reduction_rating"] = {
			mod("Armour", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Guard" }),
		},
		["molten_shell_damage_absorbed_%"] = {
			mod("GuardAbsorbRate", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Guard", unscalable = true }),
		},
		["molten_shell_damage_absorb_limit_%_of_armour"] = {
			mod("GuardAbsorbLimit", "BASE", nil, 0, 0, { type = "PerStat", stat = "Armour", limitVar = "GuardAbsorbMax", limitTotal = true }, { type = "GlobalEffect", effectType = "Guard", unscalable = true }),
			div = 100,
		},
		["molten_shell_max_damage_absorbed"] = {
			mod("Multiplier:GuardAbsorbMax", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Guard", unscalable = true }),
		},
		["molten_shell_%_of_absorbed_damage_dealt_as_reflected_fire"] = {
			skill("moltenShellReflect", nil),
		},
	},
#baseMod skill("radius", 15)
#mods

#skill VaalMoltenShell
#flags hit area duration
	preDamageFunc = function(activeSkill, output)
		local add = (activeSkill.skillData.VaalMoltenShellDamageMitigated or 0) * activeSkill.skillData.moltenShellReflect / 100
		activeSkill.skillData.FireMin = add
		activeSkill.skillData.FireMax = add
	end,
	statMap = {
		["base_physical_damage_reduction_rating"] = {
			mod("Armour", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Guard" }),
		},
		["molten_shell_damage_absorbed_%"] = {
			mod("GuardAbsorbRate", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Guard", unscalable = true }),
		},
		["molten_shell_damage_absorb_limit_%_of_armour"] = {
			mod("GuardAbsorbLimit", "BASE", nil, 0, 0, { type = "PerStat", stat = "Armour", limitVar = "GuardAbsorbMax", limitTotal = true }, { type = "GlobalEffect", effectType = "Guard", unscalable = true }),
			div = 100,
		},
		["molten_shell_max_damage_absorbed"] = {
			mod("Multiplier:GuardAbsorbMax", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Guard", unscalable = true }),
		},
		["molten_shell_%_of_absorbed_damage_dealt_as_reflected_fire"] = {
			skill("moltenShellReflect", nil),
		},
	},
#mods

#skill MoltenStrike
#flags attack melee projectile area
	parts = {
		{
			name = "Melee Hit",
			melee = true,
			projectile = false,
			area = false,
		},
		{
			name = "Magma Balls",
			melee = false,
			projectile = true,
			area = true,
		},
		{
			name = "Average Balls Hitting",
			melee = false,
			projectile = true,
			area = true,
		},
	},
	preDamageFunc = function(activeSkill, output, breakdown)
		local skillCfg = activeSkill.skillCfg
		local skillData = activeSkill.skillData
		local skillPart = activeSkill.skillPart
		local skillModList = activeSkill.skillModList
		local t_insert = table.insert
		local s_format = string.format

		-- melee part doesn't need to calc balls
		if skillPart == 1 then
			return
		end

		local enemyRadius = skillModList:Override(skillCfg, "EnemyRadius") or skillModList:Sum("BASE", skillCfg, "EnemyRadius")
		local ballRadius = output.AreaOfEffectRadius
		local innerRadius = output.AreaOfEffectRadiusSecondary
		local outerRadius = output.AreaOfEffectRadiusTertiary

		-- logic adapted from MoldyDwarf's calculator
		local hitRange = enemyRadius + ballRadius - innerRadius
		local landingRange = outerRadius - innerRadius
		local overlapChance = math.min(1, hitRange / landingRange)
		output.OverlapChance = overlapChance * 100

		if breakdown then
			breakdown.OverlapChance = { }
			t_insert(breakdown.OverlapChance, "Chance for individual balls to land on the enemy:")
			t_insert(breakdown.OverlapChance, "^8= (area where a ball can land on enemy) / (total area)")
			t_insert(breakdown.OverlapChance, "^8= (enemy radius + ball radius - min travel) / (max travel - min travel)")
			t_insert(breakdown.OverlapChance, s_format("^8= (^7%d^8 + ^7%d^8 - ^7%d) / (^7%d^8 - ^7%d)",
				enemyRadius, ballRadius, innerRadius, outerRadius, innerRadius))
			t_insert(breakdown.OverlapChance, s_format("^8=^7 %.2f^8%%", output.OverlapChance))
		end

		local numProjectiles = skillModList:Sum("BASE", skillCfg, "ProjectileCount")
		local dpsMult = 1
		if skillPart == 3 or skillPart == 5 or skillPart == 6 then
			dpsMult = overlapChance * numProjectiles

			if skillPart ~= 6 then
				if breakdown then
					breakdown.SkillDPSMultiplier = {}
					t_insert(breakdown.SkillDPSMultiplier, "DPS multiplier")
					t_insert(breakdown.SkillDPSMultiplier, "^8= number of projectiles * overlap chance")
					t_insert(breakdown.SkillDPSMultiplier, s_format("^8=^7 %d^8 *^7 %.3f^8", numProjectiles, overlapChance))
					t_insert(breakdown.SkillDPSMultiplier, s_format("^8=^7 %.3f", dpsMult))
				end
			else
				-- zenith: make an effective dpsMult for the weighted average of normal and 5th attack balls
				local gemQuality = activeSkill.activeEffect.quality
				local fifthAttackMulti = 1 + 8 + 0.1 * gemQuality
				local fifthAttackOverallMulti = fifthAttackMulti * overlapChance * (numProjectiles + 5)
				dpsMult = 0.8 * dpsMult + 0.2 * fifthAttackOverallMulti

				if breakdown then
					breakdown.SkillDPSMultiplier = {}
					t_insert(breakdown.SkillDPSMultiplier, "Weighted average DPS multiplier for balls")
					t_insert(breakdown.SkillDPSMultiplier, "^8= (0.8 * balls dps) + (0.2 * 5th attack balls dps)")
					t_insert(breakdown.SkillDPSMultiplier, "^8= (0.8 * normal ball hit * overlap chance * number of projectiles) " ..
						"+ (0.2 * ball hit * 5th attack multiplier * overlap chance * (number of projectiles + 5))")
					t_insert(breakdown.SkillDPSMultiplier, "^8= ball hit * overlap chance * (0.8 * number of projectiles " ..
						"+ 0.2 * 5th attack multiplier * (number of projectiles + 5))")
					t_insert(breakdown.SkillDPSMultiplier, s_format("^8= ball hit * ^7%.3f ^8* (0.8 * ^7%d ^8+ 0.2 * ^7%.1f ^8* ^7%d^8)",
						overlapChance, numProjectiles, fifthAttackMulti, numProjectiles + 5))
					t_insert(breakdown.SkillDPSMultiplier, s_format("^8= ball hit * ^7 %.3f", dpsMult))
				end
			end
		end
		if dpsMult ~= 1 then
			skillData.dpsMultiplier = (skillData.dpsMultiplier or 1) * dpsMult
			output.SkillDPSMultiplier = (output.SkillDPSMultiplier or 1) * dpsMult
		end
	end,
	statMap = {
		["active_skill_hit_ailment_damage_with_projectile_+%_final"] = {
			mod("Damage", "MORE", nil, bit.band(ModFlag.Hit, ModFlag.Ailment), 0, { type = "SkillPart", skillPartList = { 2, 3 } })
		},
	},
#baseMod skill("projectileSpeedAppliesToMSAreaOfEffect", true)
#baseMod skill("radius", 9, { type = "SkillPart", skillPartList = { 2, 3 } })
#baseMod skill("radiusLabel", "Ball area:", { type = "SkillPart", skillPartList = { 2, 3 } })
#baseMod skill("radiusSecondary", 2, { type = "SkillPart", skillPartList = { 2, 3 } })
#baseMod skill("radiusSecondaryLabel", "Chain Minimum Distance:", { type = "SkillPart", skillPartList = { 2, 3 } })
#baseMod skill("radiusTertiary", 25, { type = "SkillPart", skillPartList = { 2, 3 } })
#baseMod skill("radiusTertiaryLabel", "Chain Maximum Distance:", { type = "SkillPart", skillPartList = { 2, 3 } })
#baseMod flag("CannotSplit")
#mods

#skill MoltenStrikeAltX
#flags attack melee projectile area
	parts = {
		{
			name = "Melee Hit",
			melee = true,
			projectile = false,
			area = false,
		},
		{
			name = "Magma Balls",
			melee = false,
			projectile = true,
			area = true,
		},
		{
			name = "Average Balls Hitting",
			melee = false,
			projectile = true,
			area = true,
		},
		{
			name = "Magma Balls (5th attack)",
			melee = false,
			projectile = true,
			area = true,
		},
		{
			name = "Average Balls (5th attack)",
			melee = false,
			projectile = true,
			area = true,
		},
		{
			name = "Total Weighted Ball Average",
			melee = false,
			projectile = true,
			area = true,
		},
	},
	preDamageFunc = skills.MoltenStrike.preDamageFunc,
	statMap = {
		["active_skill_hit_ailment_damage_with_projectile_+%_final"] = {
			mod("Damage", "MORE", nil, bit.band(ModFlag.Hit, ModFlag.Ailment), 0, { type = "SkillPart", skillPartList = { 2, 3, 4, 5, 6 } })
		},
		["molten_strike_every_5th_attack_projectiles_damage_+%_final"] = {
			mod("Damage", "MORE", nil, bit.band(ModFlag.Hit, ModFlag.Ailment), 0, { type = "SkillPart", skillPartList = { 4, 5 } })
		},
		["molten_strike_every_5th_attack_fire_X_additional_projectiles"] = {
			mod("ProjectileCount", "BASE", nil, 0, 0, { type = "SkillPart", skillPartList = { 4, 5 } })
		},
	},
#baseMod skill("projectileSpeedAppliesToMSAreaOfEffect", true)
#baseMod skill("radius", 9, { type = "SkillPart", skillPartList = { 2, 3, 4, 5, 6 } })
#baseMod skill("radiusLabel", "Ball area:", { type = "SkillPart", skillPartList = { 2, 3, 4, 5, 6 } })
#baseMod skill("radiusSecondary", 2, { type = "SkillPart", skillPartList = { 2, 3, 4, 5, 6 } })
#baseMod skill("radiusSecondaryLabel", "Chain Minimum Distance:", { type = "SkillPart", skillPartList = { 2, 3, 4, 5, 6 } })
#baseMod skill("radiusTertiary", 25, { type = "SkillPart", skillPartList = { 2, 3, 4, 5, 6 } })
#baseMod skill("radiusTertiaryLabel", "Chain Maximum Distance:", { type = "SkillPart", skillPartList = { 2, 3, 4, 5, 6 } })
#baseMod flag("CannotSplit")
#mods

#skill VaalMoltenStrike
#flags attack melee projectile area chaining
	parts = {
		{
			name = "Melee Hit",
			melee = true,
			projectile = false,
			area = false,
			chaining = false,
		},
		{
			name = "Magma Balls",
			melee = false,
			projectile = true,
			area = true,
			chaining = true,
		},
	},
	statMap = {
		["active_skill_hit_ailment_damage_with_projectile_+%_final"] = {
			mod("Damage", "MORE", nil, bit.band(ModFlag.Hit, ModFlag.Ailment), 0, { type = "SkillPart", skillPart = 2 })
		},
	},
#baseMod skill("projectileSpeedAppliesToMSAreaOfEffect", true)
#baseMod skill("radius", 9, { type = "SkillPart", skillPart = 2 })
#baseMod skill("radiusLabel", "Ball area:", { type = "SkillPart", skillPart = 2 })
#baseMod skill("radiusSecondary", 2, { type = "SkillPart", skillPart = 2 })
#baseMod skill("radiusSecondaryLabel", "Chain Minimum Distance:", { type = "SkillPart", skillPart = 2 })
#baseMod skill("radiusTertiary", 25, { type = "SkillPart", skillPart = 2 })
#baseMod skill("radiusTertiaryLabel", "Chain Maximum Distance:", { type = "SkillPart", skillPart = 2 })
#baseMod flag("CannotSplit")
#mods

#skill Perforate
#flags attack melee area
	preDamageFunc = function(activeSkill, output)
		activeSkill.skillData.dpsMultiplier = math.max(activeSkill.skillData.dpsMultiplier or 1, 1)
	end,
	statMap = {
		["blood_spears_base_number_of_spears"] = {
			mod("Multiplier:PerforateMaxSpikes", "BASE", nil),
		},
		["blood_spears_damage_+%_final_in_blood_stance"] = {
			mod("Damage", "MORE", nil, 0, 0, { type = "Condition", var = "BloodStance" }),
		},
		["quality_display_perforate_is_gem"] = {
			-- Display Only
		},
	},
#baseMod skill("dpsMultiplier", 1, { type = "Multiplier", var = "PerforateSpikeOverlap", limitVar = "PerforateMaxSpikes" }, { type = "Condition", var = "BloodStance" })
#baseMod skill("radius", 11, { type = "Condition", var = "SandStance" })
#baseMod skill("radius", 8, { type = "Condition", var = "BloodStance" })
#mods

#skill PerforateAltX
#flags attack melee area
	preDamageFunc = function(activeSkill, output)
		activeSkill.skillData.dpsMultiplier = math.max(activeSkill.skillData.dpsMultiplier or 1, 1)
	end,
	statMap = {
		["blood_spears_base_number_of_spears"] = {
			mod("Multiplier:PerforateofDualityMaxSpikes", "BASE", nil),
		},
		["blood_spears_damage_+%_final_in_blood_stance"] = {
			mod("Damage", "MORE", nil, 0, 0, { type = "Condition", var = "BloodStance" }),
		},
		["blood_spears_additional_number_of_spears_if_changed_stance_recently"] = {
			mod("Multiplier:PerforateofDualityMaxSpikes", "BASE", nil, 0, 0, { type = "Condition", var = "ChangedStanceRecently" }),
		},
		["quality_display_perforate_is_gem"] = {
			-- Display Only
		},
	},
#baseMod skill("dpsMultiplier", 1, { type = "Multiplier", var = "PerforateSpikeOverlap", limitVar = "PerforateofDualityMaxSpikes" }, { type = "Condition", var = "BloodStance" })
#baseMod skill("radius", 11, { type = "Condition", var = "SandStance" })
#baseMod skill("radius", 8, { type = "Condition", var = "BloodStance" })
#mods

#skill PerforateAltY
#flags attack melee area
	preDamageFunc = function(activeSkill, output)
		activeSkill.skillData.dpsMultiplier = math.max(activeSkill.skillData.dpsMultiplier or 1, 1)
	end,
	statMap = {
		["blood_spears_base_number_of_spears"] = {
			mod("Multiplier:PerforateofBloodshedMaxSpikes", "BASE", nil),
		},
		["quality_display_perforate_is_gem"] = {
			-- Display Only
		},
	},
#baseMod skill("dpsMultiplier", 1, { type = "Multiplier", var = "PerforateSpikeOverlap", limitVar = "PerforateofBloodshedMaxSpikes" })
#baseMod skill("radius", 11)
#mods

#skill PetrifiedBlood
	statMap = {
		["skill_grants_life_cost_%_mana_cost_while_not_on_low_life"] = {
			mod("ManaCostAsLifeCost", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Petrified Blood", unscalable = true }, { type="Condition", var="LowLife", neg = true }),
		},
		["petrified_blood_%_life_loss_below_half_from_hit_to_prevent"] = {
			mod("LifeLossBelowHalfPrevented", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Petrified Blood" }),
		},
		["petrified_blood_%_prevented_life_loss_to_lose_over_time"] = {
			mod("LifeLossBelowHalfLost", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Petrified Blood" }),
		},
		["cannot_recover_above_low_life_except_flasks"] = {
			-- Display Only, this mod controls multiple lines for some reason
		},
	},
#mods

#skill Pride
#flags spell aura area
	statMap = {
		["physical_damage_aura_nearby_enemies_physical_damage_taken_+%"] = {
			mod("PhysicalDamageTaken", "MORE", nil, 0, 0, { type = "GlobalEffect", effectType = "AuraDebuff", modCond = "PrideMinEffect" }),
		},
		["physical_damage_aura_nearby_enemies_physical_damage_taken_+%_max"] = {
			mod("PhysicalDamageTaken", "MORE", nil, 0, 0, { type = "GlobalEffect", effectType = "AuraDebuff", modCond = "PrideMaxEffect" }),
		},
	},
#baseMod skill("radius", 40)
#mods

#skill ProtectiveLink
#flags spell duration
	statMap = {
		["bulwark_link_grants_recover_X_life_on_block"] = {
			mod("LifeOnBlock", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Link" }),
		},
		["display_bulwark_link_overrides_attack_block_and_maximum_attack_block"] = {
			mod("BlockAttackChanceIsEqualToParent", "FLAG", true, 0, 0, { type = "GlobalEffect", effectType = "Link" }),
			mod("MaximumBlockAttackChanceIsEqualToParent", "FLAG", true, 0, 0, { type = "GlobalEffect", effectType = "Link" }),
		},
	},
#mods

#skill Punishment
#flags spell curse area duration hex
	statMap = {
		["damage_taken_+%_on_low_life"] = {
			mod("DamageTaken", "INC", nil, 0, 0, { type = "GlobalEffect", effectType = "Curse" }, { type = "Condition", var = "LowLife"}),
		},
	},
#baseMod skill("debuff", true)
#baseMod skill("radius", 22)
#baseMod mod("DebilitateChance", "BASE", 100)
#mods

#skill PurityOfFire
#flags spell aura area
	statMap = {
		["base_fire_damage_resistance_%"] = {
			mod("FireResist", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Aura" }),
		},
		["base_maximum_fire_damage_resistance_%"] = {
			mod("FireResistMax", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Aura" }),
		},
	},
#baseMod skill("radius", 40)
#mods

#skill VaalImpurityOfFire
#flags spell aura area duration
	statMap = {
		["hits_ignore_my_fire_resistance"] = {
			flag("SelfIgnoreFireResistance", { type = "GlobalEffect", effectType = "AuraDebuff" })
		},
		["base_maximum_fire_damage_resistance_%"] = {
			mod("FireResistMax", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Aura" }),
		},
		["base_immune_to_ignite"] = {
			flag("IgniteImmune", { type = "GlobalEffect", effectType = "Aura"}),
		},
	},
#mods

#skill RageVortex
#flags attack melee area duration
	preSkillTypeFunc = function(activeSkill, output)
		if activeSkill.skillPart == 2 then
			local maxRage = activeSkill.skillModList:Sum("BASE", activeSkill.skillCfg, "MaximumRage")
			local rageVortexSacrificePercentage = activeSkill.skillData.MaxRageVortexSacrificePercentage / 100
			local configOverride= activeSkill.skillModList:Sum("BASE", activeSkill.skillCfg, "Multiplier:RageSacrificedStacks")
			local maxSacrificedRage = math.floor(rageVortexSacrificePercentage * maxRage)
			local stacks = math.min((configOverride > 0 and configOverride) or maxSacrificedRage, maxSacrificedRage)
			activeSkill.skillModList:NewMod("Multiplier:RageSacrificed", "BASE", stacks, "Skill:RageVortex")
		end
	end,
	parts = {
		{
			name = "Melee",
		},
		{
			name = "Rage Storm",
		},
	},
	statMap = {
		["rage_slash_radius_+_per_amount_of_rage_sacrificed"] = {
			mod("AreaOfEffect", "BASE", nil, 0, 0, { type = "Multiplier", var = "RageSacrificed", divVar = "RagePerRadius" }),
		},
		["rage_slash_damage_+%_final_per_amount_of_rage_sacrificed"] = {
			mod("Damage", "MORE", nil, 0, 0, { type = "Multiplier", var = "RageSacrificed", divVar = "RagePerDamage" }),
		},
		["rage_slash_rage_sacrifice_per_radius_bonus"] = {
			mod("Multiplier:RagePerRadius", "BASE", nil),
		},
		["rage_slash_rage_sacrifice_per_damage_bonus"] = {
			mod("Multiplier:RagePerDamage", "BASE", nil),
		},
		["rage_slash_vortex_attack_speed_+%_final"] = {
			mod("Speed", "MORE", nil, 0, 0, { type = "SkillPart", skillPart = 2 }),
		},
		["rage_slash_sacrifice_rage_%"] = {
			skill("MaxRageVortexSacrificePercentage", nil),
		},
		["quality_display_rage_vortex_is_gem"] = {
			-- Display only
		},
	},
#mods

#skill RageVortexAltX
#flags attack melee area duration
	parts = {
		{
			name = "Melee",
		},
		{
			name = "Rage Storm",
		},
	},
	statMap = {
		["rage_slash_vortex_attack_speed_+%_final"] = {
			mod("Speed", "MORE", nil, 0, 0, { type = "SkillPart", skillPart = 2 }),
		},
	},
#mods

#skill RallyingCry
#flags warcry area duration
	statMap = {
		["rallying_cry_damage_+%_final_from_osm_per_nearby_ally"] = {
			mod("RallyingCryExertDamageBonus", "BASE", nil),
		},
		["skill_empowers_next_x_melee_attacks"] = {
			mod("RallyingExertedAttacks", "BASE", nil),
		},
		["rallying_cry_weapon_damage_%_for_allies_per_5_monster_power"] = {
			mod("RallyingCryAllyDamageBonusPer5Power", "BASE", nil),
			mod("Dummy", "DUMMY", 1, 0, 0, { type = "GlobalEffect", effectType = "Warcry" }, { type = "Multiplier", var = "NearbyAlly" }),
		},
		["rallying_cry_buff_effect_on_minions_+%_final"] = {
			mod("RallyingCryMinionDamageBonusMultiplier", "BASE", nil),
			div = 100
		},
	},
#baseMod skill("radius", 60)
#mods

#skill RejuvenationTotem
#flags spell aura totem area duration
	statMap = {
		["base_life_regeneration_rate_per_minute"] = {
			{ mod("LifeRegen", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Aura" }),
			div = 60 },
			{ mod("ManaRegen", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Aura" }, { type = "Condition", var = "RejuvenationTotemManaRegen" }),
			div = 400 },
		},
	},
#baseMod skill("radius", 40)
#mods

#skill VaalRejuvenationTotem
#flags spell aura totem area duration
	statMap = {
		["base_life_regeneration_rate_per_minute"] = {
			mod("LifeRegen", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Aura" }),
			div = 60,
		},
		["vaal_rejuvenation_totem_%_damage_taken_applied_to_totem_instead"] = {
			mod("takenFromVaalRejuvenationTotemsBeforeYou", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Aura" }),
		},
	},
#baseMod skill("radius", 40)
#mods

#skill SearingBond
#flags spell totem duration
#mods

#skill SeismicCry
#flags warcry area duration
	statMap = {
		["skill_empowers_next_x_melee_attacks"] = {
			mod("SeismicExertedAttacks", "BASE", nil),
		},
		["seismic_cry_base_slam_skill_area_+%_final"] = {
			mod("SeismicAoEMoreMultiplier", "BASE", nil),
		},
		["seismic_cry_stun_threshold_+%_per_5_power_up_to_cap"] = {
			mod("StunThreshold", "INC", nil, 0, 0, { type = "GlobalEffect", effectType = "Warcry", div = 5, limit = 25 }),
		},
		["seismic_cry_armour_+%_final_per_5_power_up_to_cap"] = {
			mod("Armour", "MORE", nil, 0, 0, { type = "GlobalEffect", effectType = "Warcry", div = 5, limit = 25 }),
		},
		["skill_empower_limitation_specifier_for_stat_description"] = {
			-- Display only
		},
	},
#baseMod skill("radius", 60)
#mods

#skill ShieldCharge
#flags attack melee area shieldAttack
#baseMod skill("radius", 28)
#baseMod skill("radiusLabel", "End Cone area:")
#baseMod skill("radiusSecondary", 16)
#baseMod skill("radiusSecondaryLabel", "End Circle area:")
#baseMod skill("radiusTertiary", 8)
#baseMod skill("radiusTertiaryLabel", "Charging area:")
#mods

#skill ShieldCrush
#flags attack melee area shieldAttack
	parts = {
		{
			name = "1 Wave",
		},
		{
			name = "2 Overlapping Waves",
		},
	},
	statMap = {
		["shield_crush_damage_+%_final_from_distance"] = {
			mod("Damage", "MORE", nil, ModFlag.Hit, 0, { type = "MeleeProximity", ramp = {1,0} }),
		},
	},
#baseMod skill("radius", 29)
#baseMod skill("dpsMultiplier", 2, { type = "SkillPart", skillPart = 2 })
#mods

#skill ShieldCrushAltX
#flags attack melee area shieldAttack
	parts = {
		{
			name = "1 Wave",
		},
		{
			name = "2 Overlapping Waves",
		},
	},
	statMap = {
		["shield_crush_damage_+%_final_from_distance"] = {
			mod("Damage", "MORE", nil, ModFlag.Hit, 0, { type = "MeleeProximity", ramp = {1,0} }),
		},
	},
#baseMod skill("radius", 29)
#baseMod skill("dpsMultiplier", 2, { type = "SkillPart", skillPart = 2 })
#mods

#skill ShockwaveTotem
#flags spell totem area duration
#mods

#skill Smite
#flags attack melee duration area
	parts = {
		{
			name = "Melee Hit",
			area = false,
		},
		{
			name = "Area Hit",
			area = true,
			melee = false,
		},
	},
	statMap = {
		["base_chance_to_shock_%_from_skill"] = {
			mod("EnemyShockChance", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Aura" }, { type = "Condition", neg = true, var = "AffectedByVaalSmite" }),
		},
		["minimum_added_lightning_damage_from_skill"] = {
			mod("LightningMin", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Aura" }, { type = "Condition", neg = true, var = "AffectedByVaalSmite" }),
		},
		["maximum_added_lightning_damage_from_skill"] = {
			mod("LightningMax", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Aura" }, { type = "Condition", neg = true, var = "AffectedByVaalSmite" }),
		},
		["quality_display_active_skill_area_damage_quality_negated_from_gem"] = {
			-- Display only
		},
	},
#baseMod skill("radiusLabel", "Lightning Strike area:")
#baseMod skill("radiusSecondaryLabel", "Aura area:")
#mods

#skill SmiteAltX
#flags attack melee area
	parts = {
		{
			name = "Melee Hit",
			area = false,
		},
		{
			name = "Area Hit",
			area = true,
			melee = false,
		},
	},
#mods

#skill VaalSmite
#flags attack melee duration area
	parts = {
		{
			name = "Melee Hit",
			area = false,
		},
		{
			name = "Area Hit",
			area = true,
			melee = false,
		},
	},
	statMap = {
		["base_chance_to_shock_%_from_skill"] = {
			mod("EnemyShockChance", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Aura" }),
		},
		["minimum_added_lightning_damage_from_skill"] = {
			mod("LightningMin", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Aura" }),
		},
		["maximum_added_lightning_damage_from_skill"] = {
			mod("LightningMax", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Aura" }),
		},
	},
#baseMod skill("radiusLabel", "Lightning Strike area:")
#baseMod skill("radiusSecondaryLabel", "Aura area:")
#mods

#skill StaticStrike
#flags attack melee duration
	preDamageFunc = function(activeSkill, output)
		if activeSkill.skillPart == 2 then
			activeSkill.skillData.hitTimeOverride = activeSkill.skillData.repeatFrequency / (1 + activeSkill.skillModList:Sum("INC", activeSkill.skillCfg, "StaticStrikeFrequency") / 100)
		end
	end,
	parts = {
		{
			name = "Melee hit",
			chaining = false,
		},
		{
			name = "Beams",
			chaining = true,
		}
	},
	statMap = {
		["static_strike_beam_damage_+%_final"] = {
			mod("Damage", "MORE", nil, 0, 0, { type = "SkillPart", skillPart = 2}),
		},
		["static_strike_base_zap_frequency_ms"] = {
			skill("repeatFrequency", nil),
			div = 1000,
		},
		["static_strike_zap_speed_+%"] = {
			mod("StaticStrikeFrequency", "INC", nil),
		},
	},
#baseMod skill("radius", 20)
#mods

#skill Swordstorm
#flags attack melee area
	statMap = {
		["swordstorm_num_hits"] = {
			skill("dpsMultiplier", nil)
		},
	},
#baseMod skill("doubleHitsWhenDualWielding", true)
#mods

#skill QuickGuard
#flags spell duration
	statMap = {
		["quick_guard_damage_absorbed_%"] = {
			mod("GuardAbsorbRate", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Guard", unscalable = true }),
		},
		["quick_guard_damage_absorb_limit"] = {
			mod("GuardAbsorbLimit", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Guard", unscalable = true }),
		},
	},
#baseMod mod("AvoidBleed", "BASE", 100, 0, 0, { type = "GlobalEffect", effectType = "Guard" })
#mods

#skill Reap
#flags spell area duration
	statMap = {
		["blood_scythe_damage_+%_final_per_charge"] = {
			mod("Damage", "MORE", nil, 0, 0, { type = "Multiplier", var = "BloodCharge" }),
		},
		["blood_scythe_cost_+%_final_per_charge"] = {
			mod("LifeCost", "MORE", nil, 0, 0, { type = "Multiplier", var = "BloodCharge" }),
		},
		["base_physical_damage_to_deal_per_minute"] = {
			skill("PhysicalDot", nil, { type = "Condition", var = "ReapDebuffIsFireDamage", neg = true }),
			skill("FireDot", nil, { type = "Condition", var = "ReapDebuffIsFireDamage"}),
			div = 60,
		},
		["quality_display_reap_is_gem"] = {
			-- Display only
		},
	},
#baseMod skill("radius", 25)
#baseMod skill("debuff", true)
#mods

#skill VaalReap
#flags spell area duration
	statMap = {
		["blood_scythe_damage_+%_final_per_charge"] = {
			mod("Damage", "MORE", nil, 0, 0, { type = "Multiplier", var = "BloodCharge" }),
		},
		["vaal_reap_additional_maximum_blood_charges"] = {
			mod("BloodChargesMax", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff", unscalable = true }),
		},
		["base_physical_damage_to_deal_per_minute"] = {
			skill("PhysicalDot", nil, { type = "Condition", var = "ReapDebuffIsFireDamage", neg = true }),
			skill("FireDot", nil, { type = "Condition", var = "ReapDebuffIsFireDamage"}),
			div = 60,
		},
	},
#baseMod skill("radius", 23)
#baseMod skill("dotIsArea", true)
#mods

#skill SummonFlameGolem
#flags spell minion golem permanentMinion
	minionList = {
		"SummonedFlameGolem",
	},
	statMap = {
		["fire_golem_grants_damage_+%"] = {
			mod("Damage", "INC", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff" }),
		},
		["fire_golem_grants_area_of_effect_+%"] = {
			mod("AreaOfEffect", "INC", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff" }),
		},
	},
#baseMod skill("allowTotemBuff", true)
#baseMod flag("Condition:HaveFireGolem", { type = "GlobalEffect", effectType = "Buff" })
#mods

#skill SummonFlameGolemAltX
#flags spell minion golem permanentMinion
	minionList = {
		"SummonedFlameGolem",
	},
#baseMod skill("allowTotemBuff", true)
#baseMod flag("Condition:HaveFireGolem", { type = "GlobalEffect", effectType = "Buff" })
#mods

#skill SummonFlameGolemAltY
#flags spell minion golem permanentMinion
	minionList = {
		"SummonedFlameGolem",
	},
#baseMod skill("allowTotemBuff", true)
#baseMod flag("Condition:HaveFireGolem", { type = "GlobalEffect", effectType = "Buff" })
#mods

#skill SummonStoneGolem
#flags spell minion golem permanentMinion
	minionList = {
		"SummonedStoneGolem",
	},
	statMap = {
		["stone_golem_grants_base_life_regeneration_rate_per_minute"] = {
			mod("LifeRegen", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff" }),
			div = 60,
		},
		["stone_golem_grants_defences_+%"] = {
			mod("Defences", "INC", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff" }),
		},
	},
#baseMod skill("allowTotemBuff", true)
#baseMod flag("Condition:HavePhysicalGolem", { type = "GlobalEffect", effectType = "Buff" })
#mods

#skill SummonStoneGolemAltX
#flags spell minion golem permanentMinion
	minionList = {
		"SummonedStoneGolem",
	},
#baseMod skill("allowTotemBuff", true)
#baseMod flag("Condition:HavePhysicalGolem", { type = "GlobalEffect", effectType = "Buff" })
#mods

#skill SummonStoneGolemAltY
#flags spell minion golem permanentMinion
	minionList = {
		"SummonedStoneGolem",
	},
#baseMod skill("allowTotemBuff", true)
#baseMod flag("Condition:HavePhysicalGolem", { type = "GlobalEffect", effectType = "Buff" })
#mods

#skill Sunder
#flags attack melee area
	parts = {
		{
			name = "First Wave Area",
		},
		{
			name = "Final Wave Area",
		},
		{
			name = "Shockwaves",
		},
	},
	statMap = {
		["shockwave_slam_explosion_damage_+%_final"] = {
			mod("Damage", "MORE", nil, 0, 0, { type = "SkillPart", skillPart = 3 }),
		},
		["active_skill_area_of_effect_+%_final"] = {
			mod("AreaOfEffect", "MORE", nil),
		},
		["sunder_wave_radius_+_per_step"] = {
			skill("radiusExtra", nil, { type = "Multiplier", var = "SunderWaveArea" }),
		},
	},
#baseMod skill("radius", 12)
#baseMod mod("Multiplier:SunderWaveArea", "BASE", 4, 0, 0, { type = "SkillPart", skillPart = 2 })
#mods

#skill SunderAltX
#flags attack melee area
	parts = {
		{
			name = "Wave",
		},
		{
			name = "Shockwaves",
		},
	},
	statMap = {
		["shockwave_slam_explosion_damage_+%_final"] = {
			mod("Damage", "MORE", nil, 0, 0, { type = "SkillPart", skillPart = 2 }),
		},
		["active_skill_area_of_effect_+%_final"] = {
			mod("AreaOfEffect", "MORE", nil),
		},
	},
#baseMod skill("radius", 12)
#mods

#skill SunderAltY
#flags attack melee area
	parts = {
		{
			name = "First Wave Area",
		},
		{
			name = "Final Wave Area",
		},
		{
			name = "Shockwaves",
		},
	},
	statMap = {
		["shockwave_slam_explosion_damage_+%_final"] = {
			mod("Damage", "MORE", nil, 0, 0, { type = "SkillPart", skillPart = 3 }),
		},
		["sunder_wave_radius_+_per_step"] = {
			skill("radiusExtra", nil, { type = "Multiplier", var = "SunderWaveArea" }),
		},
		["sunder_wave_max_steps"] = {
			mod("Multiplier:SunderWaveArea", "BASE", nil, 0, 0, { type = "SkillPart", skillPart = 2 }),
			base = -1,
		},
		["sunder_number_of_fake_chains"] = {
			-- Display only
		},
	},
#baseMod skill("radius", 12)
#mods

#skill Sweep
#flags attack melee area
#baseMod skill("radius", 24)
#mods

#skill TectonicSlam
#flags attack melee area
#baseMod skill("radius", 15)
#baseMod skill("radiusLabel", "Fissure Length:")
#baseMod skill("radiusSecondary", 7)
#baseMod skill("radiusSecondaryLabel", "Fissure Width:")
#mods

#skill TectonicSlamAltX
#flags attack melee area
	statMap = {
		["endurance_charge_slam_damage_+%_final_per_endurance_charge_consumed"] = {
			mod("Damage", "MORE", nil, 0, 0, { type = "Multiplier", var = "RemovableEnduranceCharge" }),
		},
		["tectonic_slam_area_of_effect_+%_final_per_endurance_charge_consumed"] = {
			mod("AreaOfEffect", "MORE", nil, 0, 0, { type = "Multiplier", var = "RemovableEnduranceCharge" }),
		},
		["quality_display_alternate_tectonic_slam_is_gem"] = {
			-- Display only
		},
	},
#baseMod skill("radius", 15)
#baseMod skill("radiusLabel", "Fissure Length:")
#baseMod skill("radiusSecondary", 7)
#baseMod skill("radiusSecondaryLabel", "Fissure Width:")
#mods

#skill VengefulCry
#flags warcry area duration
	statMap = {
		["rage_warcry_gain_X_rage_per_minute_per_5_monster_power_max_25_power"] = {
			mod("RageRegen", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Warcry", div = 5, limit = 25 }),
			flag("Condition:CanGainRage", { type = "GlobalEffect", effectType = "Warcry"} ),
			flag("InherentRageLossIsPrevented", { type = "GlobalEffect", effectType = "Warcry"} ),
			div = 60,
		},
		["rage_warcry_maximum_rage_+"] = {
			mod("MaximumRage", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Warcry" }),
		},
		["display_retaliation_use_requirement_variation"] = {
			-- Display only
		},
	},
#mods

#skill VigilantStrike
#flags attack melee
#mods

#skill Vitality
#flags spell aura area
	statMap = {
		["base_life_regeneration_rate_per_minute"] = {
			mod("LifeRegen", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Aura" }),
			div = 60,
		},
	},
#baseMod skill("radius", 40)
#mods

#skill VolcanicFissure
#flags melee attack projectile area slam
	parts = {
		{
			name = "Ground Fissure",
			melee = true,
			projectile = false,
		},
		{
			name = "Magma Balls",
			melee = false,
			projectile = true,
		},
	},
	statMap = {
		["active_skill_hit_ailment_damage_with_projectile_+%_final"] = {
			mod("Damage", "MORE", nil, bit.band(ModFlag.Hit, ModFlag.Ailment), 0, { type = "SkillPart", skillPart = 2 })
		},
	},
#baseMod flag("CannotSplit")
#mods

#skill VolcanicFissureAltX
#flags melee attack area slam
#mods

#skill VaalVolcanicFissure
#flags melee attack projectile area slam
	parts = {
		{
			name = "Ground Fissure",
			melee = true,
			projectile = false,
		},
		{
			name = "Magma Balls",
			melee = false,
			projectile = true,
		},
	},
#baseMod flag("CannotSplit")
#mods

#skill Vulnerability
#flags spell curse area duration hex
	statMap = {
		["receive_bleeding_chance_%_when_hit_by_attack"] = {
			mod("SelfBleedChance", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Curse" }),
		},
		["physical_damage_taken_+%"] = {
			mod("PhysicalDamageTaken", "INC", nil, 0, 0, { type = "GlobalEffect", effectType = "Curse" }),
		},
		["self_bleed_duration_+%"] = {
			mod("SelfBleedDuration", "INC", nil, 0, 0, { type = "GlobalEffect", effectType = "Curse" }),
		},
	},
#baseMod skill("debuff", true)
#baseMod skill("radius", 22)
#mods

#skill WarlordsMark
#flags spell curse duration mark
	statMap = {
		["enemy_chance_to_double_stun_duration_%_vs_self"] = {
			mod("SelfDoubleStunDurationChance", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Curse" } ),
		},
		["life_leech_on_any_damage_when_hit_by_attack_permyriad"] = {
			mod("SelfDamageLifeLeech", "BASE", nil, ModFlag.Attack, 0, { type = "GlobalEffect", effectType = "Curse" }),
		},
		["mana_leech_on_any_damage_when_hit_by_attack_permyriad"] = {
			mod("SelfDamageManaLeech", "BASE", nil, ModFlag.Attack, 0, { type = "GlobalEffect", effectType = "Curse" }),
		},
		["enemy_grant_X_rage_on_stun"] = {
			flag("Condition:CanGainRage", { type = "GlobalEffect", effectType = "Buff" } ),
		},
	},
#baseMod skill("debuff", true)
#mods

#skill WarBanner
#flags spell
	statMap = {
		["accuracy_rating_+%"] = {
			mod("Accuracy", "INC", nil, 0, 0, { type = "GlobalEffect", effectType = "Aura" })
		},
		["war_banner_physical_damage_+%_final_with_melee_skills"] = {
			mod("PhysicalDamage", "MORE", nil, 0, 0, { type = "GlobalEffect", effectType = "Aura" }, { type = "SkillType", skillType = SkillType.Melee }),
		},
	},
#baseMod skill("radius", 24)
#baseMod mod("AuraEffect", "MORE", -100, 0, 0, { type = "Condition", var = "BannerPlanted", neg = true })
#baseMod flag("Condition:AffectedByPlacedBanner", { type = "Condition", var = "BannerPlanted" }, { type = "GlobalEffect", effectType = "Buff" })
#mods
