Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
4b3ae4e
Add support for thorns crit and ignore armour passives
DS-Koala Mar 6, 2026
5a86559
Add thorns damage support and thorns-based support interactions
DS-Koala Mar 6, 2026
8a12d91
Fix thorns ailment handling and mana scaling (modflag not yet impleme…
DS-Koala Apr 24, 2026
6ceeead
Removed CannotBleed and CannotPoison from ThornsPlayer
DS-Koala Apr 24, 2026
5769951
Added support for Stag Idol's Bonded modifier (Thorns Damage has 40% …
DS-Koala Apr 24, 2026
8d258da
Update to use ModFlag.Thorns
Apr 25, 2026
8ead590
Fix crash
Apr 25, 2026
15e9ba1
Fix Thornskin not working
Apr 25, 2026
9cebe55
Fix Quill Burst thorns damage calculation
DS-Koala Apr 25, 2026
5c1f127
Fix Quill Burst support so it won't be overwritten when re-exporting …
DragoonWraith Apr 28, 2026
70e929b
Support for Crackling Barrier support
DragoonWraith Apr 28, 2026
96cff52
Support for thorns damage from Scavenged Plating
DragoonWraith May 4, 2026
a6a1371
Fix Quill Burst damage calculation more/better?
DragoonWraith May 17, 2026
e60c293
Fix thorns damage calculation to consider thorns-flagged skills
DragoonWraith May 17, 2026
982d2d7
Merge pull request #1 from krryan/thorns-support
DS-Koala May 22, 2026
27d04fb
Add basic Barbs support, make Thorns skill unsupportable, remove some…
DragoonWraith May 27, 2026
7131534
Merge pull request #2 from krryan/barbs-support
DS-Koala May 28, 2026
ff97c9a
Merge branch 'dev' into pr/1778
LocalIdentity May 29, 2026
4ce3362
Fix issue
May 29, 2026
4505401
Fix thorns mod finding logic
May 29, 2026
046f3c9
Fix Blistering Bond test
May 29, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion spec/System/TestItemMods_spec.lua
Original file line number Diff line number Diff line change
Expand Up @@ -684,7 +684,6 @@ describe("TetsItemMods", function()
{variant:2}{range:0.5}Adds (8-12) to (16-18) Physical Damage
{range:0.5}+(10-15) to Strength
Causes Bleeding on Hit
{range:0.5}(4-5) to (8-10) Physical Thorns damage
]])
build.itemsTab:AddDisplayItem()
runCallback("OnFrame")
Expand Down
1 change: 1 addition & 0 deletions src/Data/Global.lua
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,7 @@ ModFlag.Spell = 0x0000000000000002
ModFlag.Hit = 0x0000000000000004
ModFlag.Dot = 0x0000000000000008
ModFlag.Cast = 0x0000000000000010
ModFlag.Thorns = 0x0000000000000020
-- Damage sources
ModFlag.Melee = 0x0000000000000100
ModFlag.Area = 0x0000000000000200
Expand Down
83 changes: 42 additions & 41 deletions src/Data/ModCache.lua

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion src/Data/SkillStatMap.lua
Original file line number Diff line number Diff line change
Expand Up @@ -1023,7 +1023,7 @@ return {
mod("ImprovedSpellDamageAppliesToAttacks", "MAX", nil),
},
["additive_thorns_damage_modifiers_apply_to_attack_damage"] = {
flag("ThornsDamageAppliesToHits"),
flag("ThornsDamageApplyToAttackDamage"),
},
["active_skill_main_hand_weapon_damage_+%_final"] = {
mod("Damage", "MORE", nil, 0, 0, { type = "Condition", var = "MainHandAttack" }),
Expand Down
9 changes: 8 additions & 1 deletion src/Data/Skills/act_str.lua
Original file line number Diff line number Diff line change
Expand Up @@ -16047,6 +16047,7 @@ skills["RollingSlamPlayer"] = {
skills["ScavengedPlatingPlayer"] = {
name = "Scavenged Plating",
baseTypeName = "Scavenged Plating",
grantsThornsDamage = true,
icon = "Art/2DArt/SkillIcons/BruteScavengedPlating.dds",
color = 1,
description = "While active, uses fragments of armour scavenged from enemies to bolster your own. Fully Breaking an enemy's Armour grants you stacks of Scavenged Plating for a duration based on the enemy's rarity, and you gain Armour and Thorns per stack. Normal enemies grant 1 stack, Magic enemies grant 2 stacks, Rare enemies grant 5 stacks and Unique enemies grant 10 stacks.",
Expand Down Expand Up @@ -16107,6 +16108,12 @@ skills["ScavengedPlatingPlayer"] = {
["scavenged_plating_armour_+%_final_per_stack"] = {
mod("Armour", "MORE", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Scavenged Plating" }, { type = "Multiplier", var = "ScavengedPlatingStacks", limitVar = "ScavengedPlatingStacksLimit" }),
},
["scavenged_plating_thorns_minimum_physical_damage"] = {
mod("PhysicalMin", "BASE", nil, ModFlag.Thorns, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Scavenged Plating" }, { type = "Multiplier", var = "ScavengedPlatingStacks", limitVar = "ScavengedPlatingStacksLimit" }),
},
["scavenged_plating_thorns_maximum_physical_damage"] = {
mod("PhysicalMax", "BASE", nil, ModFlag.Thorns, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Scavenged Plating" }, { type = "Multiplier", var = "ScavengedPlatingStacks", limitVar = "ScavengedPlatingStacksLimit" }),
},
["scavenged_plating_maximum_stacks_display"] = {
mod("Multiplier:ScavengedPlatingStacksLimit", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Scavenged Plating"}),
},
Expand Down Expand Up @@ -20753,4 +20760,4 @@ skills["WolfPackPlayer"] = {
},
},
}
}
}
28 changes: 28 additions & 0 deletions src/Data/Skills/other.lua
Original file line number Diff line number Diff line change
Expand Up @@ -9377,6 +9377,34 @@ skills["VoidIllusionSpawnPlayer"] = {
},
}
}
skills["ThornsPlayer"] = {
name = "Thorns",
hidden = true,
fromItem = true,
skillTypes = { [SkillType.Damage] = true },
cannotBeSupported = true,
qualityStats = {},
levels = {
[1] = { levelRequirement = 0 },
},
statSets = {
[1] = {
label = "Thorns",
incrementalEffectiveness = 0,
statDescriptionScope = "skill_stat_descriptions",
baseFlags = {
thorns = true,
},
baseMods = {
},
constantStats = {},
stats = {},
levels = {
[1] = {},
},
},
}
}

skills["MetaMirageDeadeyePlayer"] = {
name = "Mirage Deadeye",
Expand Down
9 changes: 8 additions & 1 deletion src/Data/Skills/sup_int.lua
Original file line number Diff line number Diff line change
Expand Up @@ -2347,6 +2347,7 @@ skills["TriggeredDeadlyCurrentPlayer"] = {
skills["SupportCracklingBarrierPlayer"] = {
name = "Crackling Barrier",
description = "Supports Channelling Skills. While Channelling Supported Skills, you gain Lightning Thorns based off of your maximum Mana.",
grantsThornsDamage = true,
color = 3,
support = true,
requireSkillTypes = { SkillType.Channel, },
Expand All @@ -2362,6 +2363,12 @@ skills["SupportCracklingBarrierPlayer"] = {
label = "Crackling Barrier",
incrementalEffectiveness = 0.054999999701977,
statDescriptionScope = "gem_stat_descriptions",
statMap = {
["return_%_of_maximum_mana_as_lightning_damage_to_attacker_while_channelling"] = {
mod("LightningMin", "BASE", nil, ModFlag.Thorns, 0, { type = "PercentStat", stat = "Mana", percent = 1 }, { type = "GlobalEffect", effectType = "Buff", effectName = "Crackling Barrier" }, { type = "Condition", var = "Channelling" }),
mod("LightningMax", "BASE", nil, ModFlag.Thorns, 0, { type = "PercentStat", stat = "Mana", percent = 1 }, { type = "GlobalEffect", effectType = "Buff", effectName = "Crackling Barrier" }, { type = "Condition", var = "Channelling" }),
},
},
baseFlags = {
},
constantStats = {
Expand Down Expand Up @@ -7991,4 +7998,4 @@ skills["SupportZenithPlayerTwo"] = {
},
},
}
}
}
118 changes: 116 additions & 2 deletions src/Data/Skills/sup_str.lua
Original file line number Diff line number Diff line change
Expand Up @@ -541,6 +541,11 @@ skills["SupportBarbsPlayer"] = {
label = "Barbs I",
incrementalEffectiveness = 0.054999999701977,
statDescriptionScope = "gem_stat_descriptions",
statMap = {
["deal_thorns_damage_on_hit_for_X_hits_after_thorns_trigger"] = {
-- handled by TriggeredBarbsPlayer as an additionalGrantedEffect hard-coded in Modules/Data.lua
},
},
baseFlags = {
},
constantStats = {
Expand All @@ -554,6 +559,35 @@ skills["SupportBarbsPlayer"] = {
},
}
}
skills["TriggeredBarbsPlayer"] = {
name = "Barbs I",
hidden = true,
description = "Deal your thorns damage.",
skillTypes = { [SkillType.Damage] = true, [SkillType.SkillGrantedBySupport] = true, [SkillType.AttackInPlace] = true },
cannotBeSupported = true,
qualityStats = {},
levels = {
[1] = { levelRequirement = 0 },
},
statSets = {
[1] = {
label = "Barbs I",
incrementalEffectiveness = 0,
statDescriptionScope = "skill_stat_descriptions",
baseFlags = {
thorns = true,
},
baseMods = {
},
constantStats = {},
stats = {},
levels = {
[1] = {},
},
},
},
}

skills["SupportBarbsPlayerTwo"] = {
name = "Barbs II",
description = "Supports Melee Strike Skills. Supported Skills deal your Thorns Damage on Hit after you've Retaliated with Thorns Damage.",
Expand All @@ -572,6 +606,11 @@ skills["SupportBarbsPlayerTwo"] = {
label = "Barbs II",
incrementalEffectiveness = 0.054999999701977,
statDescriptionScope = "gem_stat_descriptions",
statMap = {
["deal_thorns_damage_on_hit_for_X_hits_after_thorns_trigger"] = {
-- handled by TriggeredBarbsPlayerTwo as an additionalGrantedEffect hard-coded in Modules/Data.lua
},
},
baseFlags = {
},
constantStats = {
Expand All @@ -585,6 +624,35 @@ skills["SupportBarbsPlayerTwo"] = {
},
}
}
skills["TriggeredBarbsPlayerTwo"] = {
name = "Barbs II",
hidden = true,
description = "Deal your thorns damage.",
skillTypes = { [SkillType.Damage] = true, [SkillType.SkillGrantedBySupport] = true, [SkillType.AttackInPlace] = true },
cannotBeSupported = true,
qualityStats = {},
levels = {
[1] = { levelRequirement = 0 },
},
statSets = {
[1] = {
label = "Barbs II",
incrementalEffectiveness = 0,
statDescriptionScope = "skill_stat_descriptions",
baseFlags = {
thorns = true,
},
baseMods = {
},
constantStats = {},
stats = {},
levels = {
[1] = {},
},
},
},
}

skills["SupportBarbsPlayerThree"] = {
name = "Barbs III",
description = "Supports Melee Strike Skills. Supported Skills deal your Thorns Damage on Hit twice after you've Retaliated with Thorns Damage.",
Expand All @@ -603,6 +671,11 @@ skills["SupportBarbsPlayerThree"] = {
label = "Barbs III",
incrementalEffectiveness = 0.054999999701977,
statDescriptionScope = "gem_stat_descriptions",
statMap = {
["deal_thorns_damage_twice_on_hit_for_X_hits_after_thorns_trigger"] = {
-- handled by TriggeredBarbsPlayerThree as an additionalGrantedEffect hard-coded in Modules/Data.lua
},
},
baseFlags = {
},
constantStats = {
Expand All @@ -616,6 +689,36 @@ skills["SupportBarbsPlayerThree"] = {
},
}
}
skills["TriggeredBarbsPlayerThree"] = {
name = "Barbs III",
hidden = true,
description = "Deal twice your thorns damage.",
skillTypes = { [SkillType.Damage] = true, [SkillType.SkillGrantedBySupport] = true, [SkillType.AttackInPlace] = true },
cannotBeSupported = true,
qualityStats = {},
levels = {
[1] = { levelRequirement = 0 },
},
statSets = {
[1] = {
label = "Barbs III",
incrementalEffectiveness = 0,
statDescriptionScope = "skill_stat_descriptions",
baseFlags = {
thorns = true,
},
baseMods = {
mod("DoubleDamageChance", "BASE", 100, 0, 0),
},
constantStats = {},
stats = {},
levels = {
[1] = {},
},
},
},
}

skills["SupportBattershoutPlayer"] = {
name = "Battershout",
description = "Supports Warcry Skills. Supported Skills Consume Fully Broken Armour to trigger Physical Damage explosions on Enemies within their range but cannot themselves Break Armour. ",
Expand Down Expand Up @@ -4976,6 +5079,11 @@ skills["SupportQuillburstPlayer"] = {
label = "Quill Burst",
incrementalEffectiveness = 0.054999999701977,
statDescriptionScope = "gem_stat_descriptions",
statMap = {
["trigger_spiked_gauntlets_for_X_hits_after_thorns_trigger"] = {
flag("EnableTriggeredQuillburst"),
},
},
baseFlags = {
},
constantStats = {
Expand Down Expand Up @@ -5006,7 +5114,13 @@ skills["TriggeredQuillburstPlayer"] = {
label = "Quill Burst",
incrementalEffectiveness = 0.054999999701977,
statDescriptionScope = "triggered_spiked_gauntlets",
statMap = {
["display_skill_deals_thorns_damage"] = {
-- display only
},
},
baseFlags = {
thorns = true,
},
constantStats = {
{ "triggered_by_spiked_gauntlets_support_%", 100 },
Expand Down Expand Up @@ -6714,7 +6828,7 @@ skills["SupportThornskinPlayer"] = {
statDescriptionScope = "gem_stat_descriptions",
statMap = {
["support_thorns_spirit_cost_thorns_damage_+%"] = {
mod("ThornsDamage", "INC", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Thornskin I" }),
mod("Damage", "INC", nil, ModFlag.Thorns, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Thornskin I" }),
},
},
baseFlags = {
Expand Down Expand Up @@ -6749,7 +6863,7 @@ skills["SupportThornskinPlayerTwo"] = {
statDescriptionScope = "gem_stat_descriptions",
statMap = {
["support_thorns_spirit_cost_thorns_damage_+%"] = {
mod("ThornsDamage", "INC", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Thornskin II" }),
mod("Damage", "INC", nil, ModFlag.Thorns, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Thornskin II" }),
},
},
baseFlags = {
Expand Down
9 changes: 8 additions & 1 deletion src/Export/Skills/act_str.txt
Original file line number Diff line number Diff line change
Expand Up @@ -925,12 +925,19 @@ end,
#skillEnd

#skill ScavengedPlatingPlayer
grantsThornsDamage = true,
#set ScavengedPlatingPlayer
#flags duration
statMap = {
["scavenged_plating_armour_+%_final_per_stack"] = {
mod("Armour", "MORE", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Scavenged Plating" }, { type = "Multiplier", var = "ScavengedPlatingStacks", limitVar = "ScavengedPlatingStacksLimit" }),
},
["scavenged_plating_thorns_minimum_physical_damage"] = {
mod("PhysicalMin", "BASE", nil, ModFlag.Thorns, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Scavenged Plating" }, { type = "Multiplier", var = "ScavengedPlatingStacks", limitVar = "ScavengedPlatingStacksLimit" }),
},
["scavenged_plating_thorns_maximum_physical_damage"] = {
mod("PhysicalMax", "BASE", nil, ModFlag.Thorns, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Scavenged Plating" }, { type = "Multiplier", var = "ScavengedPlatingStacks", limitVar = "ScavengedPlatingStacksLimit" }),
},
["scavenged_plating_maximum_stacks_display"] = {
mod("Multiplier:ScavengedPlatingStacksLimit", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Scavenged Plating"}),
},
Expand Down Expand Up @@ -1231,4 +1238,4 @@ statMap = {
#set WolfPackPlayer
#flags minion
#mods
#skillEnd
#skillEnd
29 changes: 29 additions & 0 deletions src/Export/Skills/other.txt
Original file line number Diff line number Diff line change
Expand Up @@ -801,3 +801,32 @@ statMap = {
#flags
#mods
#skillEnd

skills["ThornsPlayer"] = {
name = "Thorns",
hidden = true,
fromItem = true,
skillTypes = { [SkillType.Damage] = true },
cannotBeSupported = true,
qualityStats = {},
levels = {
[1] = { levelRequirement = 0 },
},
statSets = {
[1] = {
label = "Thorns",
incrementalEffectiveness = 0,
statDescriptionScope = "skill_stat_descriptions",
baseFlags = {
thorns = true,
},
baseMods = {
},
constantStats = {},
stats = {},
levels = {
[1] = {},
},
},
}
}
9 changes: 8 additions & 1 deletion src/Export/Skills/sup_int.txt
Original file line number Diff line number Diff line change
Expand Up @@ -413,7 +413,14 @@ statMap = {
#skillEnd

#skill SupportCracklingBarrierPlayer
grantsThornsDamage = true,
#set SupportCracklingBarrierPlayer
statMap = {
["return_%_of_maximum_mana_as_lightning_damage_to_attacker_while_channelling"] = {
mod("LightningMin", "BASE", nil, ModFlag.Thorns, 0, { type = "PercentStat", stat = "Mana", percent = 1 }, { type = "GlobalEffect", effectType = "Buff", effectName = "Crackling Barrier" }, { type = "Condition", var = "Channelling" }),
mod("LightningMax", "BASE", nil, ModFlag.Thorns, 0, { type = "PercentStat", stat = "Mana", percent = 1 }, { type = "GlobalEffect", effectType = "Buff", effectName = "Crackling Barrier" }, { type = "Condition", var = "Channelling" }),
},
},
#mods
#skillEnd

Expand Down Expand Up @@ -1515,4 +1522,4 @@ statMap = {
#skill SupportZenithPlayerTwo
#set SupportZenithPlayerTwo
#mods
#skillEnd
#skillEnd
Loading
Loading