diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 568d4066..31d79e6f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,13 +1,20 @@ repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.4.0 + rev: v4.6.0 hooks: + - id: check-added-large-files - id: check-ast + - id: check-case-conflict + - id: check-executables-have-shebangs + - id: check-json + - id: check-toml - id: check-yaml - id: end-of-file-fixer + - id: fix-byte-order-marker - id: trailing-whitespace + - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.4.4 + rev: v0.5.7 hooks: - id: ruff args: [--fix] diff --git a/.vscode/launch.json b/.vscode/launch.json index 1e92eb45..ae943ac3 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,7 +1,4 @@ { - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { diff --git a/assets/lang/enUS/uniques.json b/assets/lang/enUS/uniques.json index c62f4243..2fc80009 100644 --- a/assets/lang/enUS/uniques.json +++ b/assets/lang/enUS/uniques.json @@ -4,42 +4,36 @@ "full": "When activating or refreshing the full {c_important}Walking Arsenal{/c} Key Passive effect, you automatically cast {c_important}Ground Stomp{/c} and gain {c_random}[Affix_Value_1]{/c} Fury. Can only occur once every {c_number}[Affix_Value_2]{/c} seconds.", "num_idx": [ 0 - ], - "snoId": 1210595 + ] }, "[wip]_eye_of_the_depths": { "desc": "tbd", "full": "TBD", - "num_idx": [], - "snoId": 1719159 + "num_idx": [] }, "ahavarion_spear_of_lycander": { "desc": "gain a random shrine effect for seconds after killing an elite enemy. can only occur once every seconds.", "full": "Gain a random Shrine effect for {c_number}[Affix_Value_1]{/c} seconds after killing an Elite enemy. Can only occur once every {c_number}[Affix.\"Static Value 0\"]{/c} seconds.", - "num_idx": [], - "snoId": 942108 + "num_idx": [] }, "airidahs_inexorable_will": { "desc": "when casting an ultimate skill and again seconds after, you pull in distant enemies and deal physical damage to them. this damage is increased by per point of willpower you have. current bonus", "full": "When casting an {c_important}Ultimate{/c} Skill and again {c_number}[Affix.\"Static Value 0\"]{/c} seconds after, you Pull in Distant enemies and deal {c_random}[Affix_Flat_Value_1]{/c} Physical damage to them. This damage is increased by {c_number}[(Affix_Value_2 * 100)|1%x|]{/c} per {c_number}[Affix.\"Static Value 2\"]{/c} point of Willpower you have.\r\n\r\nCurrent Bonus: {c_number}[Floor(Owner.Willpower_Total) * (Affix_Value_2 * 100) / Affix.\"Static Value 2\"|x%|]{/c}", "num_idx": [ 1 - ], - "snoId": 1706650 + ] }, "ancients_oath": { "desc": "steel grasp launches additional chains. enemies hit by steel grasp take increased damage from you for seconds.", "full": "{c_important}Steel Grasp{/c} launches {c_number}2{/c} additional chains. Enemies hit by {c_important}Steel Grasp{/c} take {c_random}[Affix_Value_1|%x|]{/c} increased damage from you for {c_number}[Affix.\"Static Value 0\"]{/c} seconds.", "num_idx": [ 1 - ], - "snoId": 941951 + ] }, "andariels_visage": { "desc": "lucky hit up to a chance to trigger a poison nova that applies poisoning damage over seconds to enemies in the area.", "full": "{c_label}Lucky Hit:{/c} Up to a {c_number}[Affix_Value_1|%|]{/c} chance to trigger a poison nova that applies {c_number}[(Owner.Weapon_Damage_Min_Total + Owner.Weapon_Damage_Delta_Total) * (1 + Owner.Main_Hand_Damage_Percent_Bonus) * Affix_Value_2]{/c} Poisoning damage over {c_number}[Affix.\"Static Value 0\"]{/c} seconds to enemies in the area.", - "num_idx": [], - "snoId": 942663 + "num_idx": [] }, "arreats_bearing": { "desc": "ancients you summon are empowered. korlic creates an earthquake that deals physical damage over seconds when he leaps. talic leaves behind dust devils that deal damage while he whirlwinds. mawdac ignites the ground burning enemies for an additional damage over seconds when he upheaves the ground.", @@ -48,8 +42,7 @@ 0, 2, 3 - ], - "snoId": 1901739 + ] }, "ashearas_khanjar": { "desc": "hits with this weapon increase your attack speed by for seconds, up to .", @@ -57,32 +50,27 @@ "num_idx": [ 0, 2 - ], - "snoId": 941731 + ] }, "axial_conduit": { "desc": "chain lightning alternates between orbiting you and seeking up to enemies. when it returns, it drains mana from you for each active chain lightning. after draining total mana, the bolt explodes for lightning damage. chain lightning expires if you dont have enough mana for it to drain.", "full": "{c_important}Chain Lightning{/c} alternates between orbiting you and seeking up to {c_number}[Affix.\"Static Value 2\"]{/c} enemies. When it returns, it drains {c_number}[Affix.\"Static Value 0\"]{/c} Mana from you for each active {c_important}Chain Lightning{/c}. After draining {c_number}[Affix.\"Static Value 3\"]{/c} total Mana, the bolt explodes for {c_random}[(Owner.Weapon_Damage_Min_Total + Owner.Weapon_Damage_Delta_Total) * Affix_Value_1 * Affix.\"Static Value 1\"]{/c} Lightning Damage.\r\n                       \r\n{c_important}Chain Lightning{/c} expires if you don't have enough Mana for it to drain.", "num_idx": [ 3 - ], - "snoId": 1934444 + ] }, "azurewrath": { "desc": "lucky hit your skills have up to a chance to freeze enemies for seconds and deal cold damage to them.", - "full": "", "num_idx": [ 1 - ], - "snoId": 0 + ] }, "banished_lords_talisman": { "desc": "after you spend of your primary resource, your next core skill is guaranteed to overpower. your critical strikes that overpower deal increased damage.", "full": "After you spend {c_number}[Affix.\"Static Value 0\"]{/c} of your Primary Resource, your next {c_important}Core{/c} Skill is guaranteed to {c_important}{u}Overpower{/u}{/c}. Your Critical Strikes that {c_important}{u}Overpower{/u}{/c} deal {c_random}[Affix_Value_1|%x|]{/c} increased damage.", "num_idx": [ 1 - ], - "snoId": 1561309 + ] }, "battle_trance": { "desc": "increase frenzys maximum stacks by . while at maximum stacks, you deal increased damage and your other skills gain increased attack speed.", @@ -90,24 +78,21 @@ "num_idx": [ 1, 2 - ], - "snoId": 1304468 + ] }, "beastfall_boots": { "desc": "when you cast an ultimate skill, your next core skill consumes all of your energy and deals increased damage per energy consumed. using a cooldown restores energy.", "full": "When you cast an {c_important}Ultimate{/c} Skill, your next {c_important}Core{/c} Skill consumes all of your Energy and deals {c_random}[Affix_Value_1|2%x|]{/c} increased damage per Energy consumed.\r\n\r\nUsing a Cooldown restores {c_number}[Affix.\"Static Value 0\"]{/c} Energy.", "num_idx": [ 0 - ], - "snoId": 1704784 + ] }, "björnfangs_tusks_(not_used_we_reuse_for_future!)": { "desc": "cataclysms lightning strikes now prioritize enemies. while cataclysm is active, you gain unlimited spirit and deal increased damage.", "full": "{c_important}Cataclysm{/c}'s lightning strikes now prioritize enemies.\r\n\r\nWhile {c_important}Cataclysm{/c} is active, you gain unlimited Spirit and deal {c_random}[Affix_Value_1|%x|]{/c} increased damage.", "num_idx": [ 0 - ], - "snoId": 1934419 + ] }, "black_river": { "desc": "corpse explosion consumes up to additional corpses around the initial corpse, gaining damage and size per additional corpse consumed.", @@ -115,16 +100,14 @@ "num_idx": [ 1, 2 - ], - "snoId": 1306235 + ] }, "blood_artisans_cuirass": { "desc": "when you pick up blood orbs, a free bone spirit is spawned, dealing bonus damage based on your current life percent.", "full": "When you pick up {c_random}[Affix_Value_1]{/c} {c_important}{u}Blood Orbs{/u}{/c}, a free {c_important}Bone Spirit{/c} is spawned, dealing bonus damage based on your current Life percent.", "num_idx": [ 0 - ], - "snoId": 1306229 + ] }, "blood_moon_breeches": { "desc": "your minions attacks have a chance to randomly inflict decrepify or iron maiden. you deal increased overpower damage to enemies affected by your curses.", @@ -132,8 +115,7 @@ "num_idx": [ 0, 1 - ], - "snoId": 1217039 + ] }, "bloodless_scream": { "desc": "your darkness skills chill enemies for up to and deal increased damage to frozen enemies. lucky hit your darkness skills have up to a chance to generate additional essence against frozen targets.", @@ -141,110 +123,94 @@ "num_idx": [ 1, 3 - ], - "snoId": 1220207 + ] }, "blue_rose": { "desc": "lucky hit up to a chance to form an exploding ice spike, dealing cold damage. triple this chance if the enemy is frozen.", "full": "{c_label}Lucky Hit:{/c} Up to a {c_number}[Affix.\"Static Value 0\"|%|]{/c} chance to form an exploding {c_important}Ice Spike{/c}, dealing {c_random}[(Owner.Weapon_Damage_Min_Total + Owner.Weapon_Damage_Delta_Total) * Affix_Value_1]{/c} Cold damage. Triple this chance if the enemy is {c_important}{u}Frozen{/u}{/c}.", "num_idx": [ 1 - ], - "snoId": 1211653 + ] }, "boost_dagger": { "desc": "this is a test item used for max level boosts.", "full": "This is a test item used for max level boosts.", - "num_idx": [], - "snoId": 941728 + "num_idx": [] }, "boost_helm": { "desc": "this is a test item used for max level boosts.", "full": "This is a test item used for max level boosts.", - "num_idx": [], - "snoId": 942665 + "num_idx": [] }, "boost_pants": { "desc": "this is a test item used for max level boosts.", "full": "This is a test item used for max level boosts.", - "num_idx": [], - "snoId": 942975 + "num_idx": [] }, "boost_scythe": { "desc": "this is a test item used for max level boosts.", "full": "This is a test item used for max level boosts.", - "num_idx": [], - "snoId": 942068 + "num_idx": [] }, "condemnation": { "desc": "your core skills deal increased damage when spending combo points. your basic skills using this weapon have a chance to generate combo points.", "full": "Your {c_important}Core{/c} Skills deal {c_random}[Affix_Value_1|%x|]{/c} increased damage when spending {c_number}3{/c} {c_important}Combo Points{/c}. Your {c_important}Basic{/c} Skills using this weapon have a {c_number}[Affix_Value_2|%|]{/c} chance to generate {c_number}3{/c} {c_important}Combo Points{/c}.", "num_idx": [ 0 - ], - "snoId": 941730 + ] }, "cowl_of_the_nameless": { "desc": "you gain increased lucky hit chance against crowd controlled enemies.", "full": "You gain {c_random}[Affix_Value_1|%x|]{/c} increased Lucky Hit Chance against Crowd Controlled enemies.", "num_idx": [ 0 - ], - "snoId": 942666 + ] }, "crown_of_lucion": { "desc": "each time you use a skill with a resource Cost, gain increased damage and resource cost is increased by for seconds, stacking up to times.", - "full": "Each time you use a Skill with a Resource Cost, gain {c_number}[Affix.\"Static Value 0\"]{/c}%[x] increased damage and Resource Cost is increased by 30%[+] for 4 seconds, stacking up to 5 times.", "num_idx": [ 0 - ], - "snoId": 1944475 + ] }, "cruors_embrace": { "desc": "casting blood surge consumes nearby corpses to cause mini novas, dealing damage. this damage is increased by for each enemy drained by your initial cast, up to , as well as by for each corpse consumed.", "full": "Casting {c_important}Blood Surge{/c} consumes nearby Corpses to cause mini novas, dealing {c_random}[(Owner.Weapon_Damage_Min_Total + Owner.Weapon_Damage_Delta_Total) * Affix_Value_1]{/c} damage. This damage is increased by {c_number}[Affix.\"Static Value 0\"|%x|]{/c} for each enemy drained by your initial cast, up to {c_number}[Affix.\"Static Value 1\"|%x|]{/c}, as well as by {c_number}[Affix.\"Static Value 2\"|%x|]{/c} for each Corpse consumed.", "num_idx": [ 0 - ], - "snoId": 1902154 + ] }, "deathless_visage": { "desc": "bone spear leaves behind echoes that explode for physical damage, increased by for every critical strike damage you have. current bonus", "full": "{c_important}Bone Spear{/c} leaves behind echoes that explode for {c_random}[(Owner.Weapon_Damage_Min_Total + Owner.Weapon_Damage_Delta_Total) * (1 + Owner.Main_Hand_Damage_Percent_Bonus) * Affix_Value_1]{/c} Physical damage, increased by {c_number}[Affix.\"Static Value 0\"|%x|]{/c} for every {c_number}[Affix.\"Static Value 1\"|%|]{/c} Critical Strike Damage you have.\r\n\r\nCurrent Bonus: {c_number}[Floor((Owner.(ComputeCritDamageScalar() + (-1)) + Owner.Crit_Damage_Percent) / (Affix.\"Static Value 1\" / 100)) * Affix.\"Static Value 0\"|x%||1|]{/c}", "num_idx": [ 0 - ], - "snoId": 1234672 + ] }, "deathspeakers_pendant": { "desc": "blood surge casts a mini nova on your minions, dealing damage. damage is increased by per target drained by the initial cast, up to .", "full": "{c_important}Blood Surge{/c} casts a mini nova on your Minions, dealing {c_random}[(Owner.Weapon_Damage_Min_Total + Owner.Weapon_Damage_Delta_Total) * (1 + Owner.Main_Hand_Damage_Percent_Bonus) * Affix_Value_1]{/c} damage. Damage is increased by {c_number}[Affix.\"Static Value 0\"|%|]{/c} per target drained by the initial cast, up to {c_number}[Affix.\"Static Value 1\"|%|]{/c}.", "num_idx": [ 0 - ], - "snoId": 1230484 + ] }, "dolmen_stone": { "desc": "casting boulder while hurricane is active causes the boulder to rotate around you instead. boulders damage is increased by for each one currently rotating. you may have up to boulders active at a time.", "full": "Casting {c_important}Boulder{/c} while {c_important}Hurricane{/c} is active causes the {c_important}Boulder{/c} to rotate around you instead. {c_important}Boulder's{/c} damage is increased by {c_random}[Affix_Value_1 * 100|%x|]{/c} for each one currently rotating.\r\n\r\nYou may have up to {c_number}10{/c} {c_important}Boulders{/c} active at a time.", "num_idx": [ 0 - ], - "snoId": 1610440 + ] }, "doombringer": { "desc": "lucky hit up to a chance to deal shadow damage to surrounding enemies and reduce their damage dealt by for seconds.", "full": "{c_label}Lucky Hit:{/c} Up to a {c_number}[Affix_Value_1|%|]{/c} chance to deal {c_number}[(Owner.Weapon_Damage_Min_Total + Owner.Weapon_Damage_Delta_Total) * (1 + Owner.Main_Hand_Damage_Percent_Bonus) * Affix_Value_2]{/c} Shadow damage to surrounding enemies and reduce their damage dealt by {c_number}[Affix.\"Static Value 0\"|%|]{/c} for {c_number}[Affix.\"Static Value 1\"]{/c} seconds.", - "num_idx": [], - "snoId": 941869 + "num_idx": [] }, "eaglehorn": { "desc": "penetrating shot makes enemies vulnerable for seconds. every th cast of penetrating shot bounces off walls and deals more damage.", "full": "{c_important}Penetrating Shot{/c} makes enemies {c_important}{u}Vulnerable{/u}{/c} for {c_number}[Affix.\"Static Value 0\"]{/c} seconds. \r\n\r\nEvery {c_number}[Affix.\"Static Value 1\"]th{/c} cast of {c_important}Penetrating Shot{/c} bounces off walls and deals {c_random}[Affix_Value_1|%x|]{/c} more damage.", "num_idx": [ 2 - ], - "snoId": 1439537 + ] }, "earthbreaker": { "desc": "casts of landslide leave behind tectonic spikes that deal physical damage over seconds. spawning a landslide pillar within tectonic spikes has a chance to spawn two instead.", @@ -252,88 +218,82 @@ "num_idx": [ 0, 2 - ], - "snoId": 1881283 + ] }, "ebonpiercer": { "desc": "blight also shoots smaller projectiles that pierce enemies and deal shadow damage over seconds.", "full": "{c_important}Blight{/c} also shoots {c_number}[Affix.\"Static Value 1\"]{/c} smaller projectiles that pierce enemies and deal {c_random}[(Owner.Weapon_Damage_Min_Total + Owner.Weapon_Damage_Delta_Total) * (1 + Owner.Main_Hand_Damage_Percent_Bonus) * Affix_Value_1]{/c} Shadow damage over {c_number}[Affix.\"Static Value 0\"]{/c} seconds.", "num_idx": [ 1 - ], - "snoId": 1902468 + ] + }, + "endurant_faith": { + "desc": "when you would be damaged for at least of your maximum life at once it is instead", + "num_idx": [ + 2 + ] }, "esadoras_overflowing_cameo": { "desc": "upon collecting crackling energy, theres a chance to release a lightning nova, dealing lightning damage, increased by for every intelligence you have. current bonus", "full": "Upon collecting {c_important}{u}Crackling Energy{/u}{/c}, there's a {c_number}[Affix.\"Static Value 0\"|%|]{/c} chance to release a lightning nova, dealing {c_random}[(Owner.Weapon_Damage_Min_Total + Owner.Weapon_Damage_Delta_Total) * Affix_Value_1]{/c} Lightning damage, increased by {c_number}[Affix.\"Static Value 1\"|%x|]{/c} for every {c_number}[Affix.\"Static Value 2\"]{/c} Intelligence you have.\r\n\r\nCurrent Bonus: {c_number}[Floor(Owner.Intelligence_Total / Affix.\"Static Value 2\") * Affix.\"Static Value 1\"|x%|]{/c}", "num_idx": [ 1 - ], - "snoId": 1225299 + ] }, "esus_heirloom": { "desc": "your critical strike chance is increased by of your movement speed bonus. current bonus", "full": "Your Critical Strike Chance is increased by {c_random}[Affix_Value_1|%|]{/c} of your Movement Speed bonus.\r\n\r\nCurrent Bonus: {c_number}[(Min(Owner.Movement_Scalar_Capped_Total,2)-1) * (Affix_Value_1)|1%|]{/c}", "num_idx": [ 0 - ], - "snoId": 1306301 + ] }, "eyes_in_the_dark": { "desc": "death trap deals increased damage and will re-arm itself a second time.", - "full": "{c_important}Death Trap{/c} deals {c_random}[Affix_Value_1|%x|]{/c} increased damage and will re-arm itself a second time.", "num_idx": [ 0 - ], - "snoId": 942977 + ] }, "fields_of_crimson": { "desc": "while using this weapon, damaging at least one enemy with rupture creates a blood pool that inflicts bleeding damage over seconds. enemies standing in the pool take increased damage.", "full": "While using this weapon, damaging at least one enemy with {c_important}Rupture{/c} creates a blood pool that inflicts {c_random}[(Owner.Weapon_Damage_Min_Total + Owner.Weapon_Damage_Delta_Total) * Affix_Value_2]{/c} Bleeding damage over {c_number}[Affix.\"Static Value 0\"]{/c} seconds. Enemies standing in the pool take {c_number}[Affix_Value_1|%x|]{/c} increased damage.", "num_idx": [ 0 - ], - "snoId": 942134 + ] }, "fists_of_fate": { "desc": "your attacks randomly deal to of their normal damage.", "full": "Your attacks randomly deal {c_number}[Affix_Value_2|%|]{/c} to {c_random}[Affix_Value_1|%|]{/c} of their normal damage.", "num_idx": [ 1 - ], - "snoId": 942559 + ] }, "flamescar": { "desc": "while channeling incinerate, you periodically shoot embers that are attracted to enemies, each dealing fire damage.", "full": "While Channeling {c_important}Incinerate{/c}, you periodically shoot embers that are attracted to enemies, each dealing {c_random}[(Owner.Weapon_Damage_Min_Total + Owner.Weapon_Damage_Delta_Total) * Affix_Value_1]{/c} Fire damage.", "num_idx": [ 0 - ], - "snoId": 1214791 + ] }, "flameweaver": { "desc": "casting fire bolt through your firewall causes it to split into bolts, each dealing increased damage.", "full": "Casting {c_important}Fire Bolt{/c} through your {c_important}Firewall{/c} causes it to split into {c_number}[Affix.\"Static Value 0\"]{/c} bolts, each dealing {c_random}[Affix_Value_1|%x|]{/c} increased damage.", "num_idx": [ 1 - ], - "snoId": 1895710 + ] }, "fleshrender": { "desc": "casting a defensive skill deals damage to nearby poisoned enemies, increased by for every willpower you have. current bonus", "full": "Casting a {c_important}Defensive{/c} Skill deals {c_random}[(Owner.Weapon_Damage_Min_Total + Owner.Weapon_Damage_Delta_Total) * Affix_Value_1]{/c} damage to Nearby Poisoned enemies, increased by {c_number}[Affix.\"Static Value 1\"|%x|]{/c} for every {c_number}[Affix.\"Static Value 0\"]{/c} Willpower you have.\r\n\r\nCurrent Bonus: {c_number}[Floor(Owner.Willpower_Total / Affix.\"Static Value 0\") * Affix.\"Static Value 1\"|x%|]{/c}", "num_idx": [ 0 - ], - "snoId": 941798 + ] }, "flickerstep": { "desc": "each enemy you evade through reduces your active ultimate cooldown by seconds, up to seconds.", "full": "Each enemy you Evade through reduces your active Ultimate Cooldown by {c_random}[Affix_Value_1|1|]{/c} seconds, up to {c_number}[Affix.\"Static Value 0\"]{/c} seconds.", "num_idx": [ 0 - ], - "snoId": 942253 + ] }, "fractured_winterglass": { "desc": "casting frozen orb has a chance to spawn a random conjuration when it explodes. lucky hit your conjurations have up to a chance to launch a frozen orb at nearby enemies.", @@ -341,146 +301,133 @@ "num_idx": [ 0, 1 - ], - "snoId": 1862756 + ] }, "frostburn": { "desc": "lucky hit up to a chance to freeze enemies for seconds.", "full": "{c_label}Lucky Hit:{/c} Up to a {c_random}[Affix_Value_1|%|]{/c} chance to {c_important}{u}Freeze{/u}{/c} enemies for {c_number}[Affix.\"Static Value 0\"]{/c} seconds.", "num_idx": [ 0 - ], - "snoId": 942560 + ] }, "gloves_of_the_illuminator": { "desc": "fireball now bounces as it travels, exploding each time it hits the ground, but its explosion deals less damage.", "full": "{c_important}Fireball{/c_important} now bounces as it travels, exploding each time it hits the ground, but its explosion deals {c_random}[Affix_Value_1|%|]{/c} less damage.", "num_idx": [ 0 - ], - "snoId": 942564 + ] }, "godslayer_crown": { "desc": "when you stun, freeze, or immobilize an elite, you pull in all nearby enemies and deal increased damage to them for seconds. can only occur once every seconds. against bosses, this effect triggers when dealing damage instead.", "full": "When you Stun, {c_important}{u}Freeze{/u}{/c}, or Immobilize an Elite, you Pull In all Nearby enemies and deal {c_random}[Affix_Value_1|%x|]{/c} increased damage to them for {c_number}[Affix.\"Static Value 0\"]{/c} seconds. Can only occur once every {c_number}[Affix.\"Static Value 1\"]{/c} seconds.\r\n\r\nAgainst Bosses, this effect triggers when dealing damage instead.", "num_idx": [ 0 - ], - "snoId": 1555196 + ] }, "gohrs_devastating_grips": { "desc": "whirlwind explodes every seconds and after it ends, dealing of the base damage dealt to surrounding enemies as fire damage.", "full": "{c_important}Whirlwind{/c} explodes every {c_number}[Affix.\"Static Value 0\"]{/c} seconds and after it ends, dealing {c_random}[Affix_Value_1|%|]{/c} of the Base damage dealt to surrounding enemies as Fire damage.", "num_idx": [ 1 - ], - "snoId": 942555 + ] }, "grasp_of_shadow": { "desc": "lucky hit damaging an enemy with a marksman or cutthroat skill has up to a chance to summon a shadow clone that mimics that skill.", "full": "{c_label}Lucky Hit:{/c} Damaging an enemy with a {c_important}Marksman{/c} or {c_important}Cutthroat{/c} Skill has up to a {c_random}[Affix_Value_1|%|]{/c} chance to summon a {c_important}Shadow Clone{/c} that mimics that Skill.", "num_idx": [ 0 - ], - "snoId": 1306250 + ] }, "greatstaff_of_the_crone": { "desc": "claw is now a storm skill and also casts storm strike at normal damage.", "full": "{c_important}Claw{/c} is now a {c_important}Storm{/c} Skill and also casts {c_important}Storm Strike{/c} at {c_random}[Affix_Value_1|%|]{/c} normal damage.", "num_idx": [ 0 - ], - "snoId": 942106 + ] }, "greaves_of_the_empty_tomb": { "desc": "sever leaves behind desecrated ground that deals shadow damage over seconds.", "full": "{c_important}Sever{/c} leaves behind {c_important}Desecrated Ground{/c} that deals {c_random}[(Owner.Weapon_Damage_Min_Total + Owner.Weapon_Damage_Delta_Total) * (1 + Owner.Main_Hand_Damage_Percent_Bonus) * Affix_Value_1]{/c} Shadow damage over {c_number}[Affix.\"Static Value 0\"]{/c} seconds.", "num_idx": [ 0 - ], - "snoId": 1220257 + ] }, "harlequin_crest": { "desc": "gain damage reduction. in addition, gain ranks to all skills.", "full": "Gain {c_number}[Affix_Value_1|%|]{/c} Damage Reduction. In addition, gain {c_number}+[Affix.\"Static Value 0\"]{/c} Ranks to all Skills.", - "num_idx": [], - "snoId": 942664 + "num_idx": [] }, "hellhammer": { "desc": "upheaval ignites the ground burning enemies over seconds, increasing damage based on your strength.", "full": "{c_important}Upheaval{/c} ignites the ground Burning enemies over {c_number}[Affix.\"Static Value 0\"]{/c} seconds, increasing damage based on your Strength.", - "num_idx": [], - "snoId": 942021 + "num_idx": [] }, "howl_from_below": { "desc": "instead of detonating immediately, corpse explosion summons a volatile skeleton that charges at a random enemy and explodes. corpse explosions damage is increased by .", "full": "Instead of detonating immediately, {c_important}Corpse Explosion{/c} summons a Volatile Skeleton that charges at a random enemy and explodes. {c_important}Corpse Explosion's{/c} damage is increased by {c_random}[Affix_Value_1|%x|]{/c}.", "num_idx": [ 0 - ], - "snoId": 1227277 + ] }, "hunters_zenith": { "desc": "gain a bonus when you kill with a shapeshifting skill werewolf your next nonultimate werebear skill costs no resource and has no cooldown. werebear your next werewolf skill will heal you for when damage is first dealt.", "full": "Gain a bonus when you kill with a {c_important}Shapeshifting{/c} Skill:\r\n{icon:bullet}{c_label}Werewolf:{/c} Your next Non-{c_important}Ultimate{/c} {c_important}Werebear{/c} Skill costs no Resource and has no Cooldown.\r\n{icon:bullet}{c_label}Werebear:{/c} Your next {c_important}Werewolf{/c} Skill will Heal you for {c_random}[Affix_Flat_Value_1]{/c} when damage is first dealt.", "num_idx": [ 0 - ], - "snoId": 989677 + ] }, "iceheart_brais": { "desc": "enemies that die while frozen have a chance to unleash a frost nova.", "full": "Enemies that die while {c_important}{u}Frozen{/u}{/c} have a {c_random}[Affix_Value_1|%|]{/c} chance to unleash a {c_important}Frost Nova{/c}.", "num_idx": [ 0 - ], - "snoId": 1306273 + ] }, "insatiable_fury": { "desc": "werebear form is now your true form, and you gain ranks to all werebear skills.", "full": "Werebear form is now your true form, and you gain {c_random}[Affix_Value_1]{/c} Ranks to all {c_important}Werebear{/c} Skills.", "num_idx": [ 0 - ], - "snoId": 942355 + ] }, "lidless_wall": { "desc": "lucky hit while you have an active bone storm, hitting an enemy outside of a bone storm has up to a chance to spawn an additional bone storm at their location. each of your active sacrifice bonuses increases this chance by and the maximum possible bone storms by .", "full": "{c_label}Lucky Hit:{/c} While you have an active {c_important}Bone Storm{/c}, hitting an enemy outside of a {c_important}Bone Storm{/c} has up to a {c_random}[Affix_Value_1|%|]{/c} chance to spawn an additional {c_important}Bone Storm{/c} at their location. \r\n\r\nEach of your active Sacrifice bonuses increases this chance by {c_number}[Affix_Value_2|%|]{/c} and the maximum possible {c_important}Bone Storms{/c} by {c_number}[Affix.\"Static Value 0\"|~|]{/c}.", "num_idx": [ 0 - ], - "snoId": 1439541 + ] + }, + "locrans_talisman": { + "desc": "your skills gain a critical strike chance bonus", + "num_idx": [ + 0 + ] }, "mad_wolfs_glee": { "desc": "werewolf form is now your true form, and you gain ranks to all werewolf skills.", "full": "Werewolf form is now your true form, and you gain {c_random}[Affix_Value_1]{/c} Ranks to all {c_important}Werewolf{/c} Skills.", "num_idx": [ 0 - ], - "snoId": 942354 + ] }, "melted_heart_of_selig": { "desc": "gain maximum resource. when taking damage, is drained as resource for every of maximum life you would have lost.", "full": "Gain {c_number}[Affix.\"Static Value 0\"]{/c} Maximum Resource.\r\n\r\nWhen taking damage, {c_number}[Affix.\"Static Value 2\"|%|]{/c} is drained as {c_number}[Affix_Value_1]{/c} Resource for every {c_number}[Affix.\"Static Value 1\"|%|]{/c} of Maximum Life you would have lost.", - "num_idx": [], - "snoId": 1275933 + "num_idx": [] }, "mjölnic_ryng": { "desc": "while cataclysm is active, you gain unlimited spirit and deal increased damage.", "full": "While {c_important}Cataclysm{/c} is active, you gain unlimited Spirit and deal {c_random}[Affix_Value_1|%x|]{/c} increased damage.", "num_idx": [ 0 - ], - "snoId": 2016138 + ] }, "mothers_embrace": { "desc": "if a core skill hits or more enemies, of the resource cost is refunded.", "full": "If a {c_important}Core{/c} Skill hits {c_number}[Affix.\"Static Value 0\"]{/c} or more enemies, {c_random}[Affix_Value_1|%|]{/c} of the Resource cost is refunded.", "num_idx": [ 1 - ], - "snoId": 1215133 + ] }, "mutilator_plate": { "desc": "you are blood lanced, and when blood lance would deal damage to you, it instead fortifies you for of your maximum life and has a chance to form a blood orb. blood lance deals increased damage.", @@ -488,102 +435,95 @@ "num_idx": [ 0, 2 - ], - "snoId": 1224618 + ] }, "overkill": { "desc": "death blow creates a shockwave, dealing of its base damage to enemies. enemies who die to this effect also reset death blows cooldown.", "full": "{c_important}Death Blow{/c} creates a shockwave, dealing {c_random}[Affix_Value_1|%|]{/c} of its Base damage to enemies. Enemies who die to this effect also reset {c_important}Death Blow’s{/c} Cooldown.", "num_idx": [ 0 - ], - "snoId": 1222183 + ] }, "paingorgers_gauntlets": { "desc": "damaging enemies with a nonbasic skill cast marks them for seconds. when a basic skill first hits a marked enemy, the basic skills damage is echoed to all marked enemies, dealing increased damage.", "full": "Damaging enemies with a Non-{c_important}Basic{/c} Skill cast marks them for {c_number}[Affix.\"Static Value 0\"]{/c} seconds. When a {c_important}Basic{/c} Skill first hits a marked enemy, the {c_important}Basic{/c} Skill's damage is echoed to all marked enemies, dealing {c_random}[Affix_Value_1|%x|]{/c} increased damage.", "num_idx": [ 1 - ], - "snoId": 1559327 + ] }, "path_of_tragoul": { "desc": "bone prison traps a larger area and fires bone splinters at enemies trapped within. increase your maximum essence by for seconds each time these bone splinters hit an enemy.", "full": "{c_important}Bone Prison{/c} traps a larger area and fires {c_random}[Affix_Value_1]{/c} {c_important}Bone Splinters{/c} at enemies trapped within. \r\n\r\nIncrease your Maximum Essence by {c_number}[Affix.\"Static Value 0\"]{/c} for {c_number}[Affix.\"Static Value 1\"]{/c} seconds each time these {c_important}Bone Splinters{/c} hit an enemy.", "num_idx": [ 0 - ], - "snoId": 1934440 + ] }, "penitent_greaves": { "desc": "you leave behind a trail of frost that chills enemies. you deal more damage to chilled enemies.", "full": "You leave behind a trail of frost that {c_important}{u}Chills{/u}{/c} enemies. You deal {c_random}[Affix_Value_1|%x|]{/c} more damage to {c_important}{u}Chilled{/u}{/c} enemies.", "num_idx": [ 0 - ], - "snoId": 942251 + ] }, "rage_of_harrogath": { "desc": "lucky hit inflicting bleeding on an enemy has up to a chance to reduce the cooldowns of your skills by second.", "full": "{c_label}Lucky Hit:{/c} Inflicting Bleeding on an enemy has up to a {c_random}[Affix_Value_1|%|]{/c} chance to reduce the Cooldowns of your Skills by {c_number}[Affix_Value_2|1|]{/c} second.", "num_idx": [ 0 - ], - "snoId": 1304379 + ] }, "raiment_of_the_infinite": { "desc": "after using teleport, close enemies are pulled to you and stunned for seconds, but teleports cooldown is increased by .", "full": "After using {c_important}Teleport{/c}, Close enemies are Pulled to you and Stunned for {c_random}[Affix_Value_1|1|]{/c} seconds, but {c_important}Teleport's{/c} Cooldown is increased by {c_number}[Affix.\"Static Value 0\"|%x|]{/c}.", "num_idx": [ 0 - ], - "snoId": 942363 + ] + }, + "rakanoths_wake": { + "desc": "when you cast a skill with a cooldown you explode dealing fire damage", + "num_idx": [ + 0 + ] }, "ramaladnis_magnum_opus": { "desc": "skills using this weapon deal increased damage per point of fury you have, but you lose fury every second.", "full": "Skills using this weapon deal {c_random}[Affix_Value_1*100|2%x|]{/c} increased damage per point of Fury you have, but you lose {c_number}[Affix.\"Static Value 0\"]{/c} Fury every second.", "num_idx": [ 0 - ], - "snoId": 1304455 + ] }, "razorplate": { "desc": "thorns has a chance to deal increased damage.", "full": "Thorns has a {c_number}[Affix.\"Static Value 0\"|%|]{/c} chance to deal {c_random}[Affix_Value_1|%x|]{/c} increased damage. ", "num_idx": [ 1 - ], - "snoId": 1215064 + ] }, "ring_of_mendeln": { "desc": "every th attack from each minion is empowered, exploding for physical damage.", "full": "Every {c_number}6th{/c} attack from each Minion is empowered, exploding for {c_random}[(Owner.Weapon_Damage_Min_Total + Owner.Weapon_Damage_Delta_Total) * (1 + Owner.Main_Hand_Damage_Percent_Bonus) * Affix_Value_1]{/c} Physical damage.", "num_idx": [ 1 - ], - "snoId": 1222626 + ] }, "ring_of_red_furor": { "desc": "after spending fury within seconds, your next cast of hammer of the ancients, upheaval, or death blow within seconds is a guaranteed critical strike and deals bonus critical strike damage.", "full": "After spending {c_number}[Affix_Value_2]{/c} Fury within {c_number}[Affix.\"Static Value 0\"]{/c} seconds, your next cast of {c_important}Hammer of the Ancients{/c}, {c_important}Upheaval{/c}, or {c_important}Death Blow{/c} within {c_number}[Affix.\"Static Value 1\"]{/c} seconds is a guaranteed Critical Strike and deals {c_random}[Affix_Value_1|%x|]{/c} bonus Critical Strike Damage.", "num_idx": [ 3 - ], - "snoId": 1706603 + ] }, "ring_of_starless_skies": { "desc": "spending your primary resource reduces the resource cost of your skills and increases your damage by for seconds, up to .", "full": "Spending your Primary Resource reduces the Resource cost of your Skills and increases your damage by {c_number}[Affix_Value_1|%x|]{/c} for {c_number}[Affix.\"Static Value 1\"]{/c} seconds, up to {c_number}[Affix_Value_1 * Affix.\"Static Value 2\"|%x|]{/c}. ", - "num_idx": [], - "snoId": 1306337 + "num_idx": [] }, "ring_of_the_ravenous": { "desc": "rends duration is increased by seconds. damaging enemies with your brawling skills applies stacks of rends bleed. this can only affect each enemy once every second.", "full": "{c_important}Rend's{/c} duration is increased by {c_random}[Affix_Value_1|1|]{/c} seconds. \r\n\r\nDamaging enemies with your {c_important}Brawling{/c} Skills applies {c_number}[Affix.\"Static Value 0\"]{/c} stacks of {c_important}Rend's{/c} Bleed. This can only affect each enemy once every {c_number}[Affix.\"Static Value 1\"]{/c} second.", "num_idx": [ 0 - ], - "snoId": 1712701 + ] }, "ring_of_the_sacrilegious_soul": { "desc": "you automatically activate the following equipped skills on corpses around you raise skeleton every seconds. corpse explosion every seconds. corpse tendrils every seconds.", @@ -592,8 +532,7 @@ 0, 1, 2 - ], - "snoId": 1706659 + ] }, "saboteurs_signet": { "desc": "casting a core skill has a chance to throw stun grenades that deal physical damage and stun enemies for seconds. your stun grenades gain lucky hit chance.", @@ -601,24 +540,27 @@ "num_idx": [ 0, 1 - ], - "snoId": 1903127 + ] }, "scoundrels_kiss": { "desc": "rapid fire now lobs exploding arrows that deal increased damage.", "full": "{c_important}Rapid Fire{/c} now lobs exploding arrows that deal {c_random}[Affix_Value_1|%x|]{/c} increased damage.", "num_idx": [ 0 - ], - "snoId": 1902312 + ] }, "scoundrels_leathers": { "desc": "while you have unlimited energy from inner sight, casting a core skill has a chance to spawn caltrops, poison trap, or death trap.", "full": "While you have unlimited Energy from {c_important}Inner Sight{/c}, casting a {c_important}Core{/c} Skill has a {c_random}[Affix_Value_1|%|]{/c} chance to spawn {c_important}Caltrops{/c}, {c_important}Poison Trap{/c}, or {c_important}Death Trap{/c}.", "num_idx": [ 0 - ], - "snoId": 1612293 + ] + }, + "shard_of_verathiel": { + "desc": "basic skills deal increased damage but additionally cost primary resource", + "num_idx": [ + 0 + ] }, "shroud_of_khanduras": { "desc": "casting dark shroud makes you immune for seconds, but your evade cooldown is increased by seconds. evading while dark shroud is active leaves behind an explosion that deals shadow damage and pulls in enemies.", @@ -626,8 +568,7 @@ "num_idx": [ 1, 2 - ], - "snoId": 1934436 + ] }, "skyhunter": { "desc": "the first direct damage you deal to an enemy is a guaranteed critical strike. when you consume stacks of precision casting a skill, that skill gains increased critical strike damage and you gain energy.", @@ -635,46 +576,40 @@ "num_idx": [ 0, 1 - ], - "snoId": 941972 + ] }, "soulbrand": { "desc": "your healing potion no longer heals instantly and instead grants a barrier for of the original healing for seconds. you gain damage reduction while you have a barrier and may drink your healing potion while at full life.", "full": "Your Healing Potion no longer heals instantly and instead grants a {c_important}{u}Barrier{/u}{/c} for {c_number}[Affix.\"Static Value 1\"|%|]{/c} of the original healing for {c_number}[Affix.\"Static Value 0\"]{/c} seconds. \r\n\r\nYou gain {c_random}[Affix_Value_1|%|]{/c} Damage Reduction while you have a {c_important}{u}Barrier{/u}{/c} and may drink your Healing Potion while at full Life.", "num_idx": [ 2 - ], - "snoId": 1560873 + ] }, "staff_of_endless_rage": { "desc": "every rd cast of fireball launches additional projectiles and deals increased damage.", "full": "Every {c_number}3rd{/c} cast of {c_important}Fireball{/c_important} launches {c_number}2{/c} additional projectiles and deals {c_random}[Affix_Value_1|%x|]{/c} increased damage.", "num_idx": [ 2 - ], - "snoId": 942111 + ] }, "staff_of_lam_esen": { "desc": "your casts of charged bolts have a chance to be attracted to enemies and last longer.", "full": "Your casts of {c_important}Charged Bolts{/c} have a {c_random}[Affix_Value_1|1%|]{/c} chance to be attracted to enemies and last {c_number}[Affix.\"Static Value 0\"|%|]{/c} longer.", "num_idx": [ 0 - ], - "snoId": 1306310 + ] }, "starfall_coronet": { "desc": "meteors mana cost is replaced with a second cooldown and total charges. casting meteor drops additional meteors around the target. its enchantment and enhancement drop additional meteor instead.", "full": "{c_important}Meteor's{/c} Mana cost is replaced with a {c_random}[Affix_Value_1|1|]{/c} second Cooldown and {c_number}[1+Affix.\"Static Value 0\"]{/c} total Charges. \r\n\r\nCasting {c_important}Meteor{/c} drops {c_number}[Affix.\"Static Value 1\"]{/c} additional {c_important}Meteors{/c} around the target. Its {c_important}Enchantment{/c} and {c_important}Enhancement{/c} drop {c_number}[Affix.\"Static Value 3\"]{/c} additional {c_important}Meteor{/c} instead.", "num_idx": [ 0 - ], - "snoId": 1713217 + ] }, "storms_companion": { "desc": "your wolf companions are infused with the power of the storm, dealing lightning damage and gaining the storm howl ability.", "full": "Your {c_important}Wolf{/c} Companions are infused with the power of the storm, dealing Lightning damage and gaining the {c_important}Storm Howl{/c} ability.", - "num_idx": [], - "snoId": 942972 + "num_idx": [] }, "tal_rashas_iridescent_loop": { "desc": "for each type of elemental damage you deal, gain increased damage for seconds, up to . dealing elemental damage refreshes all bonuses.", @@ -682,84 +617,91 @@ "num_idx": [ 0, 2 - ], - "snoId": 1225567 + ] }, "tassets_of_the_dawning_sky": { "desc": "when you take damage from a nonphysical damage type, you gain maximum resistance to that damage type for seconds. this effect can only apply to one damage type at a time.", "full": "When you take damage from a Non-Physical damage type, you gain {c_random}[Affix_Value_1|1+%|]{/c} Maximum Resistance to that damage type for {c_number}[Affix.\"Static_Value_0\"]{/c} seconds. This effect can only apply to one damage type at a time.", "num_idx": [ 0 - ], - "snoId": 1477079 + ] }, "temerity": { "desc": "effects that heal you beyond life grant you a barrier up to of your maximum life that lasts for seconds. you may now drink your healing potion while at full life.", "full": "Effects that Heal you beyond {c_number}[Affix.\"Static Value 0\"|%|]{/c} Life grant you a {c_important}{u}Barrier{/u}{/c} up to {c_random}[Affix_Value_1|%|]{/c} of your Maximum Life that lasts for {c_number}[Affix.\"Static Value 1\"]{/c} seconds. \r\n\r\nYou may now drink your Healing Potion while at full Life.", "num_idx": [ 1 - ], - "snoId": 1306325 + ] }, "tempest_roar": { "desc": "lucky hit storm skills have up to a chance to grant spirit. your base storm skills are now also werewolf skills.", "full": "{c_label}Lucky Hit:{/c} {c_important}Storm{/c} Skills have up to a {c_random}[Affix_Value_1|%|]{/c} chance to grant {c_number}[Affix.\"Static Value 0\"]{/c} Spirit.\r\n\r\nYour base {c_important}Storm{/c} Skills are now also {c_important}Werewolf{/c} Skills.", "num_idx": [ 0 - ], - "snoId": 1304489 + ] + }, + "the_basilisk": { + "desc": "when you first hit an enemy with an earth skill petrify them for seconds", + "num_idx": [ + 1 + ] }, "the_butchers_cleaver": { "desc": "lucky hit critically striking an enemy has up to a chance to fear and slow them by for seconds.", "full": "{c_label}Lucky Hit:{/c} Critically Striking an enemy has up to a {c_number}[Affix.\"Static Value 0\"|%|]{/c} chance to Fear and Slow them by {c_random}[Affix_Value_1|%|]{/c} for {c_number}[Affix.\"Static Value 1\"]{/c} seconds.", "num_idx": [ 1 - ], - "snoId": 941704 + ] }, "the_grandfather": { "desc": "increases your critical strike damage by . the other properties on this weapon can roll higher than normal.", "full": "Increases your Critical Strike Damage by {c_number}[Affix_Value_1|%x|]{/c}. The other properties on this weapon can roll higher than normal.", - "num_idx": [], - "snoId": 942135 + "num_idx": [] + }, + "the_mortacrux": { + "desc": "when consuming a corpse there is a chance to also create a decaying", + "num_idx": [ + 0 + ] }, "the_oculus": { "desc": "gain the effect of the teleport enchantment for free. when you evade using teleport enchantment you are taken to a random location.", "full": "Gain the effect of the {c_important}Teleport Enchantment{/c} for free. When you Evade using {c_important}Teleport Enchantment{/c} you are taken to a random location.", - "num_idx": [], - "snoId": 1439529 + "num_idx": [] + }, + "the_third_blade": { + "desc": "your weapon mastery skills are now also core skills that have no cooldowns but", + "num_idx": [ + 0 + ] }, "tibaults_will": { "desc": "you deal increased damage while unstoppable and for seconds after. when you become unstoppable, gain of your primary resource.", "full": "You deal {c_random}[Affix_Value_1|%x|]{/c} increased damage while {c_important}{u}Unstoppable{/u}{/c} and for {c_number}[Affix.\"Static Value 1\"]{/c} seconds after. When you become {c_important}{u}Unstoppable{/u}{/c}, gain {c_number}[Affix.\"Static Value 0\"]{/c} of your Primary Resource.", "num_idx": [ 0 - ], - "snoId": 1559420 + ] }, "tuskhelm_of_joritz_the_mighty": { "desc": "when you gain berserking while already berserk, you have a chance to become more enraged granting increased damage, fury per second, and cooldown reduction.", "full": "When you gain {c_important}{u}Berserking{/u}{/c} while already {c_important}{u}Berserk{/u}{/c}, you have a {c_random}[Affix_Value_2|%|]{/c} chance to become more enraged granting {c_number}[Affix.\"Static_Value_0\"|%x|]{/c} increased damage, {c_number}[Affix.\"Static_Value_1\"]{/c} Fury per second, and {c_number}[Affix.\"Static_Value_2\"|%|]{/c} Cooldown Reduction.", "num_idx": [ 0 - ], - "snoId": 1489567 + ] }, "twin_strikes": { "desc": "after casting double swing times, your next double swing will hit additional times, each dealing increased damage.", "full": "After casting {c_important}Double Swing{/c} {c_number}[Affix.\"Static Value 0\" - 1]{/c} times, your next {c_important}Double Swing{/c} will hit {c_number}[Affix.\"Static Value 1\"]{/c} additional times, each dealing {c_random}[Affix_Value_1|%x|]{/c} increased damage.", "num_idx": [ 2 - ], - "snoId": 1901745 + ] }, "tyraels_might": { "desc": "while at full life, your skills unleash a divine barrage dealing damage.", "full": "While at full Life, your Skills unleash a divine barrage dealing {c_random}[(Owner.Weapon_Damage_Min_Total + Owner.Weapon_Damage_Delta_Total) * Affix_Value_1]{/c} damage.", "num_idx": [ 0 - ], - "snoId": 1901483 + ] }, "unbroken_chain": { "desc": "casting steel grasp reduces iron maelstroms cooldown by seconds. enemies damaged by iron maelstrom deal less damage for seconds.", @@ -767,83 +709,72 @@ "num_idx": [ 0, 1 - ], - "snoId": 1934407 + ] }, "unsung_ascetics_wraps": { "desc": "lightning storm gains additional strike each times it grows. lightning storm critical strikes cause lightning to strike twice, dealing increased damage.", "full": "{c_important}Lightning Storm{/c} gains {c_number}[Affix.\"Static Value 0\"]{/c} additional strike each times it grows.\r\n\r\n{c_important}Lightning Storm{/c} Critical Strikes cause lightning to strike twice, dealing {c_random}[Affix_Value_1|x%|]{/c} increased damage.", "num_idx": [ 1 - ], - "snoId": 1433954 + ] }, "vasilys_prayer": { "desc": "your earth skills are now also werebear skills and fortify you for of your maximum health.", "full": "Your {c_important}Earth{/c} Skills are now also {c_important}Werebear{/c} Skills and {c_important}{u}Fortify{/u}{/c} you for {c_random}[Affix_Value_1*100|1%|]{/c} of your Maximum Health.", "num_idx": [ 0 - ], - "snoId": 1306213 + ] }, "vox_omnium": { "desc": "of omnipower", "full": "of Omnipower", - "num_idx": [], - "snoId": 1944512 + "num_idx": [] }, "waxing_gibbous": { "desc": "killing an enemy with shred grants stealth for seconds. breaking stealth with an attack grants guaranteed critical strikes for seconds.", "full": "Killing an enemy with {c_important}Shred{/c} grants {c_important}{u}Stealth{/u}{/c} for {c_number}[Affix_Value_2]{/c} seconds. Breaking {c_important}{u}Stealth{/u}{/c} with an attack grants guaranteed Critical Strikes for {c_random}[Affix_Value_1|1|]{/c} seconds.", "num_idx": [ 1 - ], - "snoId": 1306218 + ] }, "wildheart_hunger": { "desc": "when you shapeshift into a werewolf or a werebear, you gain wildheart for seconds. wildheart grants you stacking damage every seconds, up to .", "full": "When you Shapeshift into a Werewolf or a Werebear, you gain Wildheart for {c_number}[Affix.\"Static Value 0\"]{/c} seconds. Wildheart grants you {c_random}[Affix_Value_1|1%x|]{/c} stacking damage every {c_number}[Affix.\"Static Value 1|1|\"]{/c} seconds, up to {c_number}[(Affix_Value_1*Affix.\"Static Value 2\")|1%x|]{/c}. ", "num_idx": [ 1 - ], - "snoId": 1902138 + ] }, "windforce": { "desc": "hits of barrage have a chance to deal double damage and knock down enemies.", "full": "Hits of {c_important}Barrage{/c} have a {c_random}[Affix_Value_1|%|]{/c} chance to deal double damage and Knock Down enemies.", "num_idx": [ 0 - ], - "snoId": 941973 + ] }, "word_of_hakan": { "desc": "your rain of arrows is always imbued with all imbuements and receives your arrow storm benefits.", "full": "Your {c_important}Rain of Arrows{/c} is always {c_important}Imbued{/c} with all {c_important}Imbuements{/c} and receives your {c_important}Arrow Storm{/c} benefits.", - "num_idx": [], - "snoId": 1306258 + "num_idx": [] }, "writhing_band_of_trickery": { "desc": "casting a subterfuge skill leaves behind a decoy trap that continuously taunts and lures enemies. after seconds, it explodes, dealing shadow damage. this effect is treated as a trap skill and can only spawn one decoy trap every seconds.", "full": "Casting a {c_important}Subterfuge{/c} Skill leaves behind a {c_important}Decoy Trap{/c} that continuously Taunts and lures enemies. After {c_number}[Affix.\"Static Value 1\"]{/c} seconds, it explodes, dealing {c_random}[Affix_Flat_Value_1]{/c} Shadow damage. \r\n\r\nThis effect is treated as a {c_important}Trap{/c} Skill and can only spawn one {c_important}Decoy Trap{/c} every {c_number}[Affix.\"Static Value 0\"]{/c} seconds.", "num_idx": [ 1 - ], - "snoId": 1706657 + ] }, "xfals_corroded_signet": { "desc": "lucky hit your damage over time effects have up to a chance to erupt, dealing damage of the same type to surrounding enemies.", "full": "{c_label}Lucky Hit:{/c} Your damage over time effects have up to a {c_number}[Affix.\"Static Value 0\"|%|]{/c} chance to erupt, dealing {c_random}[(Owner.Weapon_Damage_Min_Total + Owner.Weapon_Damage_Delta_Total) * (1 + Owner.Main_Hand_Damage_Percent_Bonus) * Affix_Value_1]{/c} damage of the same type to surrounding enemies.", "num_idx": [ 1 - ], - "snoId": 1559923 + ] }, "yens_blessing": { "desc": "casting a skill has a chance to cast a nonmobility, nonultimate skill that is currently on cooldown. can only occur once every seconds.", "full": "Casting a Skill has a {c_random}[Affix_Value_1|%|]{/c} chance to cast a Non-{c_important}Mobility{/c}, Non-{c_important}Ultimate{/c} Skill that is currently on Cooldown. Can only occur once every {c_number}[Affix.\"Static Value 0\"]{/c} seconds.", "num_idx": [ 0 - ], - "snoId": 1858739 + ] } } diff --git a/assets/templates/item_descr/item_mythic_top_left.png b/assets/templates/item_descr/item_mythic_top_left.png index d99ca427..d1676606 100644 Binary files a/assets/templates/item_descr/item_mythic_top_left.png and b/assets/templates/item_descr/item_mythic_top_left.png differ diff --git a/src/__init__.py b/src/__init__.py index a51012b3..4f871054 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -2,4 +2,4 @@ TP = concurrent.futures.ThreadPoolExecutor() -__version__ = "5.7.2" +__version__ = "5.7.3" diff --git a/src/config/data.py b/src/config/data.py index 9a09ef71..5223880b 100644 --- a/src/config/data.py +++ b/src/config/data.py @@ -15,13 +15,7 @@ LOGGER = logging.getLogger("d4lf") COLORS = ColorsModel( - aspect_number=HSVRangeModel(h_s_v_min=np.array([90, 60, 200]), h_s_v_max=np.array([150, 100, 255])), - cold_imbued=HSVRangeModel(h_s_v_min=np.array([88, 0, 0]), h_s_v_max=np.array([112, 255, 255])), - legendary_orange=HSVRangeModel(h_s_v_min=np.array([4, 190, 190]), h_s_v_max=np.array([26, 255, 255])), material_color=HSVRangeModel(h_s_v_min=np.array([86, 110, 190]), h_s_v_max=np.array([114, 220, 255])), - poison_imbued=HSVRangeModel(h_s_v_min=np.array([55, 0, 0]), h_s_v_max=np.array([65, 255, 255])), - shadow_imbued=HSVRangeModel(h_s_v_min=np.array([120, 0, 0]), h_s_v_max=np.array([140, 255, 255])), - skill_cd=HSVRangeModel(h_s_v_min=np.array([5, 61, 38]), h_s_v_max=np.array([16, 191, 90])), unique_gold=HSVRangeModel(h_s_v_min=np.array([4, 45, 125]), h_s_v_max=np.array([26, 155, 250])), unusable_red=HSVRangeModel(h_s_v_min=np.array([0, 210, 110]), h_s_v_max=np.array([10, 255, 210])), ) @@ -29,12 +23,12 @@ POSITIONS = ( (3840, 2160), UiOffsetsModel( - find_bullet_points_width=78, + find_bullet_points_width=150, find_seperator_short_offset_top=500, item_descr_line_height=50, item_descr_off_bottom_edge=104, item_descr_pad=30, - item_descr_width=774, + item_descr_width=780, vendor_center_item_x=1232, ), UiPosModel( @@ -56,7 +50,7 @@ window_dimensions=(3840, 2160), ), UiRoiModel( - rel_descr_search_left=np.array([-910, 0, 120, 1760]), + rel_descr_search_left=np.array([-900, 0, 150, 1760]), rel_descr_search_right=np.array([60, 0, 120, 1760]), rel_fav_flag=np.array([8, 6, 16, 20]), slots_3x11=np.array([2536, 1444, 1214, 486]), diff --git a/src/config/models.py b/src/config/models.py index 39f82775..ebbdb9de 100644 --- a/src/config/models.py +++ b/src/config/models.py @@ -215,13 +215,7 @@ def key_must_exist(cls, k: str) -> str: class ColorsModel(_IniBaseModel): - aspect_number: "HSVRangeModel" - cold_imbued: "HSVRangeModel" - legendary_orange: "HSVRangeModel" material_color: "HSVRangeModel" - poison_imbued: "HSVRangeModel" - shadow_imbued: "HSVRangeModel" - skill_cd: "HSVRangeModel" unique_gold: "HSVRangeModel" unusable_red: "HSVRangeModel" diff --git a/src/item/data/affix.py b/src/item/data/affix.py index bc8f1fad..b5e5da1e 100644 --- a/src/item/data/affix.py +++ b/src/item/data/affix.py @@ -16,7 +16,7 @@ class Affix: type: AffixType = AffixType.normal loc: tuple[int, int] = None text: str = "" - value: float = None + value: float | None = None def __eq__(self, other: "Affix") -> bool: if not isinstance(other, Affix): diff --git a/src/item/descr/find_aspect.py b/src/item/descr/find_aspect.py index 7c061bd1..afda18b2 100644 --- a/src/item/descr/find_aspect.py +++ b/src/item/descr/find_aspect.py @@ -19,7 +19,6 @@ def find_aspect(img_item_descr: np.ndarray, aspect_bullet: TemplateMatch, do_pre roi_aspect = find_aspect_search_area(img_item_descr, aspect_bullet) img_full_aspect = crop(img_item_descr, roi_aspect) - # cv2.imwrite("img_full_aspect.png", img_full_aspect) concatenated_str = image_to_text(img_full_aspect, do_pre_proc=do_pre_proc).text.lower().replace("\n", " ") cleaned_str = clean_str(concatenated_str) diff --git a/src/item/descr/texture.py b/src/item/descr/texture.py index d5b78b33..2f8fcaa3 100644 --- a/src/item/descr/texture.py +++ b/src/item/descr/texture.py @@ -28,15 +28,11 @@ def _filter_outliers(template_matches: list[TemplateMatch]) -> list[TemplateMatc return [tm for tm in template_matches if abs(tm.center[0] - target_center_x) < 1.2 * tm.region[2]] -def _gen_roi_bullets(sep_short_match: TemplateMatch, img_height: int): - return [0, sep_short_match.center[1], ResManager().offsets.find_bullet_points_width + 20, img_height] - - def _find_bullets( img_item_descr: np.ndarray, sep_short_match: TemplateMatch, template_list: list[str], threshold: float, mode: str ) -> list[TemplateMatch]: img_height = img_item_descr.shape[0] - roi_bullets = _gen_roi_bullets(sep_short_match, img_height) + roi_bullets = [0, sep_short_match.center[1], ResManager().offsets.find_bullet_points_width, img_height] all_bullets = search( ref=template_list, inp_img=img_item_descr, diff --git a/src/item/find_descr.py b/src/item/find_descr.py index 45e8932b..041fe4c1 100644 --- a/src/item/find_descr.py +++ b/src/item/find_descr.py @@ -58,7 +58,7 @@ def find_descr(img: np.ndarray, anchor: tuple[int, int]) -> tuple[bool, ItemRari roi = [match.region[0] - delta_x, roi_y, item_descr_width + 2 * delta_x, search_height] refs = ["item_seperator_short_rare", "item_seperator_short_legendary", "item_seperator_short_mythic"] - sep_short = search(refs, img, 0.62, roi, True, mode="first", do_multi_process=False) + sep_short = search(refs, img, 0.8, roi, True, mode="first", do_multi_process=False) if sep_short.success: off_bottom_of_descr = ResManager().offsets.item_descr_off_bottom_edge @@ -73,7 +73,7 @@ def find_descr(img: np.ndarray, anchor: tuple[int, int]) -> tuple[bool, ItemRari item_descr_width - 2 * item_descr_pad, roi_height, ] - croped_descr = crop(img, crop_roi) - return True, rarity, croped_descr, crop_roi + cropped_descr = crop(img, crop_roi) + return True, rarity, cropped_descr, crop_roi return False, None, None, None diff --git a/src/tools/data/custom_uniques_enUS.json b/src/tools/data/custom_uniques_enUS.json index c6920486..ee8b3318 100644 --- a/src/tools/data/custom_uniques_enUS.json +++ b/src/tools/data/custom_uniques_enUS.json @@ -1,26 +1,42 @@ { "azurewrath": { "desc": "lucky hit your skills have up to a chance to freeze enemies for seconds and deal cold damage to them.", - "full": "", - "num_idx": [ - 1 - ], - "snoId": 0 + "num_idx": [1] }, "crown_of_lucion": { "desc": "each time you use a skill with a resource Cost, gain increased damage and resource cost is increased by for seconds, stacking up to times.", - "full": "Each time you use a Skill with a Resource Cost, gain {c_number}[Affix.\"Static Value 0\"]{/c}%[x] increased damage and Resource Cost is increased by 30%[+] for 4 seconds, stacking up to 5 times.", - "num_idx": [ - 0 - ], - "snoId": 1944475 - }, + "num_idx": [0] + }, + "endurant_faith": { + "desc": "when you would be damaged for at least of your maximum life at once it is instead", + "num_idx": [2] + }, "eyes_in_the_dark": { "desc": "death trap deals increased damage and will re-arm itself a second time.", - "full": "{c_important}Death Trap{/c} deals {c_random}[Affix_Value_1|%x|]{/c} increased damage and will re-arm itself a second time.", - "num_idx": [ - 0 - ], - "snoId": 942977 + "num_idx": [0] + }, + "locrans_talisman": { + "desc": "your skills gain a critical strike chance bonus", + "num_idx": [0] + }, + "rakanoths_wake": { + "desc": "when you cast a skill with a cooldown you explode dealing fire damage", + "num_idx": [0] + }, + "shard_of_verathiel": { + "desc": "basic skills deal increased damage but additionally cost primary resource", + "num_idx": [0] + }, + "the_basilisk": { + "desc": "when you first hit an enemy with an earth skill petrify them for seconds", + "num_idx": [1] + }, + "the_mortacrux": { + "desc": "when consuming a corpse there is a chance to also create a decaying", + "num_idx": [0] + }, + "the_third_blade": { + "desc": "your weapon mastery skills are now also core skills that have no cooldowns but", + "num_idx": [0] } } diff --git a/src/tools/gen_data.py b/src/tools/gen_data.py index 8cb40444..6c880de4 100644 --- a/src/tools/gen_data.py +++ b/src/tools/gen_data.py @@ -77,7 +77,6 @@ def main(d4data_dir: Path, companion_app_dir: Path): for json_file in json_files: with open(json_file, encoding="utf-8") as file: data = json.load(file) - snoId = data["__snoID__"] name_item = [item for item in data["arStrings"] if item["szLabel"] == "Name"] if not name_item: continue @@ -95,7 +94,7 @@ def main(d4data_dir: Path, companion_app_dir: Path): desc = data["arStrings"][0]["szText"] desc_clean = remove_content_in_braces(desc.lower().replace("’", "")) num_idx = get_random_number_idx(desc) - unique_dict[name_clean] = {"desc": desc_clean, "snoId": snoId, "full": desc, "num_idx": num_idx} + unique_dict[name_clean] = {"desc": desc_clean, "full": desc, "num_idx": num_idx} # add custom uniques that seem to be missing with open(D4LF_BASE_DIR / f"src/tools/data/custom_uniques_{language}.json", encoding="utf-8") as json_file: data = json.load(json_file) diff --git a/tests/assets/item/season5/read_descr_1_1440p_small.png b/tests/assets/item/season5/read_descr_1_1440p_small.png new file mode 100644 index 00000000..61722341 Binary files /dev/null and b/tests/assets/item/season5/read_descr_1_1440p_small.png differ diff --git a/tests/assets/item/unknown/find_descr_magic_2160p.png b/tests/assets/item/unknown/find_descr_magic_2160p.png deleted file mode 100644 index c727d78f..00000000 Binary files a/tests/assets/item/unknown/find_descr_magic_2160p.png and /dev/null differ diff --git a/tests/assets/item/unknown/read_descr_codex_upgrade_1080p.png b/tests/assets/item/unknown/read_descr_codex_upgrade_1080p.png deleted file mode 100644 index 828e01e3..00000000 Binary files a/tests/assets/item/unknown/read_descr_codex_upgrade_1080p.png and /dev/null differ diff --git a/tests/assets/item/unknown/read_descr_legendary_1080p_3.png b/tests/assets/item/unknown/read_descr_legendary_1080p_3.png deleted file mode 100644 index 9528c93f..00000000 Binary files a/tests/assets/item/unknown/read_descr_legendary_1080p_3.png and /dev/null differ diff --git a/tests/assets/item/unknown/read_descr_legendary_1080p_5.png b/tests/assets/item/unknown/read_descr_legendary_1080p_5.png deleted file mode 100644 index ec28085b..00000000 Binary files a/tests/assets/item/unknown/read_descr_legendary_1080p_5.png and /dev/null differ diff --git a/tests/assets/item/unknown/read_descr_sigil_1440p.png b/tests/assets/item/unknown/read_descr_sigil_1440p.png deleted file mode 100644 index 1a91e7ef..00000000 Binary files a/tests/assets/item/unknown/read_descr_sigil_1440p.png and /dev/null differ diff --git a/tests/item/find_descr_test_season5.py b/tests/item/find_descr_season5_test.py similarity index 89% rename from tests/item/find_descr_test_season5.py rename to tests/item/find_descr_season5_test.py index 97ae68e7..cafbeaf3 100644 --- a/tests/item/find_descr_test_season5.py +++ b/tests/item/find_descr_season5_test.py @@ -12,7 +12,7 @@ @pytest.mark.parametrize( ("img_res", "input_img", "anchor", "expected_success", "expected_top_left", "expected_rarity"), [ - ((3840, 2160), f"{BASE_PATH}/find_descr_mythic_2160p.png", (3017, 1560), True, (2164, 109), ItemRarity.Mythic), + ((3840, 2160), f"{BASE_PATH}/find_descr_mythic_2160p.png", (3017, 1560), True, (2230, 200), ItemRarity.Mythic), ], ) def test_find_descr(img_res, input_img, anchor, expected_success, expected_top_left, expected_rarity): @@ -20,8 +20,6 @@ def test_find_descr(img_res, input_img, anchor, expected_success, expected_top_l img = cv2.imread(input_img) success, item_rarity, cropped_img, roi = find_descr(img, anchor) top_left_corner = None if not success else roi[:2] - if False: - cv2.imwrite("item_descr.png", cropped_img) assert success == expected_success tolerance = 0.01 * img_res[0] assert abs(top_left_corner[0] - expected_top_left[0]) <= tolerance diff --git a/tests/item/find_descr_test_unknown.py b/tests/item/find_descr_unknown_test.py similarity index 92% rename from tests/item/find_descr_test_unknown.py rename to tests/item/find_descr_unknown_test.py index a2af6293..2aaaf8f0 100644 --- a/tests/item/find_descr_test_unknown.py +++ b/tests/item/find_descr_unknown_test.py @@ -18,7 +18,6 @@ ((1920, 1080), f"{BASE_PATH}/find_descr_common_1080p.png", (75, 320), True, (127, 157), ItemRarity.Common), ((1920, 1080), f"{BASE_PATH}/find_descr_legendary_1080p.png", (1515, 761), True, (1088, 78), ItemRarity.Legendary), ((2560, 1440), f"{BASE_PATH}/find_descr_legendary_1440p.png", (1723, 1012), True, (1156, 296), ItemRarity.Legendary), - ((3840, 2160), f"{BASE_PATH}/find_descr_magic_2160p.png", (3258, 1523), True, (2396, 743), ItemRarity.Magic), ], ) def test_find_descr(img_res, input_img, anchor, expected_success, expected_top_left, expected_rarity): diff --git a/tests/item/read_descr_test_season5.py b/tests/item/read_descr_season5_test.py similarity index 93% rename from tests/item/read_descr_test_season5.py rename to tests/item/read_descr_season5_test.py index 2a7e5db0..4ebd04df 100644 --- a/tests/item/read_descr_test_season5.py +++ b/tests/item/read_descr_season5_test.py @@ -217,6 +217,23 @@ ), ), ((3840, 2160), f"{BASE_PATH}/read_descr_11_2160p_small.png", item11), + ( + (2160, 1440), + f"{BASE_PATH}/read_descr_1_1440p_small.png", + Item( + affixes=[ + Affix(name="all_stats", value=3), + Affix(name="maximum_resource", value=11), + Affix(name="critical_strike_damage", value=94), + Affix(name="resistance_to_all_elements", value=9), + ], + aspect=Aspect(name="locrans_talisman", value=0.19), + inherent=[Affix(name="resistance_to_all_elements", value=25, type=AffixType.inherent)], + item_type=ItemType.Amulet, + power=925, + rarity=ItemRarity.Unique, + ), + ), ] diff --git a/tests/item/read_descr_test_unknown.py b/tests/item/read_descr_unknown_test.py similarity index 79% rename from tests/item/read_descr_test_unknown.py rename to tests/item/read_descr_unknown_test.py index 31f0b314..825e5948 100644 --- a/tests/item/read_descr_test_unknown.py +++ b/tests/item/read_descr_unknown_test.py @@ -12,18 +12,6 @@ BASE_PATH = BASE_DIR / "tests/assets/item" legendary = [ - ( - (1920, 1080), - f"{BASE_PATH}/unknown/read_descr_codex_upgrade_1080p.png", - Item( - affixes=[Affix(name="intelligence", value=46), Affix(name="maximum_life", value=25), Affix(name="essence_on_kill", value=2)], - codex_upgrade=True, - inherent=[Affix(name="critical_strike_damage", value=9, type=AffixType.inherent)], - item_type=ItemType.Sword2H, - power=254, - rarity=ItemRarity.Legendary, - ), - ), ( (2560, 1440), f"{BASE_PATH}/unknown/read_descr_codex_upgrade_1440p.png", @@ -93,22 +81,6 @@ rarity=ItemRarity.Legendary, ), ), - ( - (1920, 1080), - f"{BASE_PATH}/unknown/read_descr_legendary_1080p_3.png", - Item( - affixes=[ - Affix(name="willpower", value=82), - Affix(name="critical_strike_damage", value=25), - Affix(name="overpower_damage", value=87), - Affix(name="damage_to_close_enemies", value=26), - ], - inherent=[Affix(name="overpower_damage", value=75, type=AffixType.inherent)], - item_type=ItemType.Mace2H, - power=704, - rarity=ItemRarity.Legendary, - ), - ), ( (1920, 1080), f"{BASE_PATH}/unknown/read_descr_legendary_1080p_4.png", @@ -120,21 +92,6 @@ rarity=ItemRarity.Legendary, ), ), - ( - (1920, 1080), - f"{BASE_PATH}/unknown/read_descr_legendary_1080p_5.png", - Item( - affixes=[ - Affix(name="maximum_life", value=666), - Affix(name="damage", value=45, type=AffixType.greater), - Affix(name="vulnerable_damage", value=31), - ], - inherent=[Affix(name="lucky_hit_chance", value=10.0, type=AffixType.inherent)], - item_type=ItemType.Wand, - power=925, - rarity=ItemRarity.Legendary, - ), - ), ( (1920, 1080), f"{BASE_PATH}/unknown/read_descr_legendary_1080p_7.png", @@ -251,23 +208,6 @@ ] sigil = [ - ( - (2560, 1440), - f"{BASE_PATH}/unknown/read_descr_sigil_1440p.png", - Item( - affixes=[ - Affix(name="lightning_damage", value=15), - Affix(name="blood_blister"), - Affix(name="monster_poison_damage", value=30), - Affix(name="monster_critical_resist", value=3), - Affix(name="potion_breakers", value=0.75), - ], - inherent=[Affix(name="wretched_delve", type=AffixType.inherent)], - item_type=ItemType.Sigil, - power=89, - rarity=ItemRarity.Common, - ), - ), ( (2560, 1440), f"{BASE_PATH}/unknown/read_descr_sigil_1440p_2.png",