Release 1.4.39

- Added glove enchantment support
This commit is contained in:
Openarl
2017-06-30 18:48:56 +10:00
parent d250573f2a
commit 4fab76d67f
21 changed files with 5207 additions and 78 deletions

View File

@@ -40,7 +40,7 @@ If possible, change the game version in the Configuration tab before importing.]
self.controls.accountNameHeader.shown = function()
return self.charImportMode == "GETACCOUNTNAME"
end
self.controls.accountName = common.New("EditControl", {"TOPLEFT",self.controls.accountNameHeader,"BOTTOMLEFT"}, 0, 4, 200, 20, main.lastAccountName or "", nil, "%c", 50)
self.controls.accountName = common.New("EditControl", {"TOPLEFT",self.controls.accountNameHeader,"BOTTOMLEFT"}, 0, 4, 200, 20, main.lastAccountName or "", nil, "%c")
self.controls.accountName.pasteFilter = function(text)
return text:gsub("[\128-\255]",function(c)
return codePointToUTF8(c:byte(1)):gsub(".",function(c)

View File

@@ -85,7 +85,7 @@ local PassiveTreeClass = common.NewClass("PassiveTree", function(self, targetVer
ConPrintf("Loading passive tree assets...")
for name, data in pairs(self.assets) do
self:LoadImage(name..".png", data[0.3835] or data[1], data)
self:LoadImage(name..".png", data[0.3835] or data[1], data, not name:match("[OL][ri][bn][ie][tC]") and "MIPMAP" or nil)
end
-- Load sprite sheets and build sprite map
@@ -96,7 +96,7 @@ local PassiveTreeClass = common.NewClass("PassiveTree", function(self, targetVer
local sheet = spriteSheets[maxZoom.filename]
if not sheet then
sheet = { }
self:LoadImage(maxZoom.filename:gsub("%?%x+$",""), self.imageRoot.."build-gen/passive-skill-sprite/"..maxZoom.filename, sheet, "CLAMP")
self:LoadImage(maxZoom.filename:gsub("%?%x+$",""), self.imageRoot.."build-gen/passive-skill-sprite/"..maxZoom.filename, sheet, "CLAMP", "MIPMAP")
spriteSheets[maxZoom.filename] = sheet
end
for name, coords in pairs(maxZoom.coords) do
@@ -244,7 +244,7 @@ local PassiveTreeClass = common.NewClass("PassiveTree", function(self, targetVer
for ci = i + 1, endI do
comb = comb .. " " .. node.sd[ci]
end
list, extra = modLib.parseMod[targetVersion](comb)
list, extra = modLib.parseMod[targetVersion](comb, true)
if list and not extra then
-- Success, add dummy mod lists to the other lines that were combined with this one
for ci = i + 1, endI do

View File

@@ -0,0 +1,72 @@
-- Item data (c) Grinding Gear Games
return {
["NORMAL"] = {
"Cast Word of Blades on Hit",
"Cast Word of Flames on Hit",
"Attack with Word of Force on Hit",
"Cast Word of Frost on Kill",
"Attack with Word of Fury on Hit",
"Cast Word of Inferno on Kill",
"Attack with Word of Ire when Hit",
"Attack with Word of Light when you take a Critical Strike",
"Cast Word of Reflection when Hit",
"Attack with Word of Spite when Hit",
"Cast Word of the Tempest on Hit",
"Cast Word of the Grave when your Skills or Minions Kill",
"Cast Word of Thunder on Kill",
"Attack with Word of War on Kill",
"Cast Word of Winter when Hit",
},
["CRUEL"] = {
"Cast Edict of Blades on Hit",
"Cast Edict of Flames on Hit",
"Attack with Edict of Force on Hit",
"Cast Edict of Frost on Kill",
"Attack with Edict of Fury on Hit",
"Cast Edict of Inferno on Kill",
"Attack with Edict of Ire when Hit",
"Attack with Edict of Light when you take a Critical Strike",
"Cast Edict of Reflection when Hit",
"Attack with Edict of Spite when Hit",
"Cast Edict of the Tempest on Hit",
"Cast Edict of the Grave when your Skills or Minions Kill",
"Cast Edict of Thunder on Kill",
"Attack with Edict of War on Kill",
"Cast Edict of Winter when Hit",
},
["MERCILESS"] = {
"Cast Decree of Blades on Hit",
"Cast Decree of Flames on Hit",
"Attack with Decree of Force on Hit",
"Cast Decree of Frost on Kill",
"Attack with Decree of Fury on Hit",
"Cast Decree of Inferno on Kill",
"Attack with Decree of Ire when Hit",
"Attack with Decree of Light when you take a Critical Strike",
"Cast Decree of Reflection when Hit",
"Attack with Decree of Spite when Hit",
"Cast Decree of the Tempest on Hit",
"Cast Decree of the Grave when your Skills or Minions Kill",
"Cast Decree of Thunder on Kill",
"Attack with Decree of War on Kill",
"Cast Decree of Winter when Hit",
},
["ENDGAME"] = {
"Cast Commandment of Blades on Hit",
"Cast Commandment of Flames on Hit",
"Attack with Commandment of Force on Hit",
"Cast Commandment of Frost on Kill",
"Attack with Commandment of Fury on Hit",
"Cast Commandment of Inferno on Kill",
"Attack with Commandment of Ire when Hit",
"Attack with Commandment of Light when you take a Critical Strike",
"Cast Commandment of Reflection when Hit",
"Attack with Commandment of Spite when Hit",
"Cast Commandment of the Tempest on Hit",
"Cast Commandment of the Grave when your Skills or Minions Kill",
"Cast Commandment of Thunder on Kill",
"Attack with Commandment of War on Kill",
"Cast Commandment of Winter when Hit",
},
}

View File

@@ -329,4 +329,23 @@ minions["AnimatedArmour"] = {
},
modList = {
},
}
minions["IcyRagingSpirit"] = {
name = "Grave Spirit",
life = 3,
fireResist = 40,
coldResist = 40,
lightningResist = 40,
chaosResist = 20,
damage = 2,
damageSpread = 0.2,
attackTime = 0.855,
attackRange = 6,
skillList = {
"RagingSpiritMeleeAttack",
},
modList = {
mod("PhysicalDamageConvertToCold", "BASE", 50),
mod("Speed", "MORE", 40, ModFlag.Attack),
},
}

2256
Data/2_6/Skills/glove.lua Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,72 @@
-- Item data (c) Grinding Gear Games
return {
["NORMAL"] = {
"Cast Word of Blades on Hit",
"Cast Word of Flames on Hit",
"Attack with Word of Force on Hit",
"Cast Word of Frost on Kill",
"Attack with Word of Fury on Hit",
"Cast Word of Inferno on Kill",
"Attack with Word of Ire when Hit",
"Attack with Word of Light when you take a Critical Strike",
"Cast Word of Reflection when Hit",
"Attack with Word of Spite when Hit",
"Cast Word of the Tempest on Hit",
"Cast Word of the Grave when your Skills or Minions Kill",
"Cast Word of Thunder on Kill",
"Attack with Word of War on Kill",
"Cast Word of Winter when Hit",
},
["CRUEL"] = {
"Cast Edict of Blades on Hit",
"Cast Edict of Flames on Hit",
"Attack with Edict of Force on Hit",
"Cast Edict of Frost on Kill",
"Attack with Edict of Fury on Hit",
"Cast Edict of Inferno on Kill",
"Attack with Edict of Ire when Hit",
"Attack with Edict of Light when you take a Critical Strike",
"Cast Edict of Reflection when Hit",
"Attack with Edict of Spite when Hit",
"Cast Edict of the Tempest on Hit",
"Cast Edict of the Grave when your Skills or Minions Kill",
"Cast Edict of Thunder on Kill",
"Attack with Edict of War on Kill",
"Cast Edict of Winter when Hit",
},
["MERCILESS"] = {
"Cast Decree of Blades on Hit",
"Cast Decree of Flames on Hit",
"Attack with Decree of Force on Hit",
"Cast Decree of Frost on Kill",
"Attack with Decree of Fury on Hit",
"Cast Decree of Inferno on Kill",
"Attack with Decree of Ire when Hit",
"Attack with Decree of Light when you take a Critical Strike",
"Cast Decree of Reflection when Hit",
"Attack with Decree of Spite when Hit",
"Cast Decree of the Tempest on Hit",
"Cast Decree of the Grave when your Skills or Minions Kill",
"Cast Decree of Thunder on Kill",
"Attack with Decree of War on Kill",
"Cast Decree of Winter when Hit",
},
["ENDGAME"] = {
"Cast Commandment of Blades on Hit",
"Cast Commandment of Flames on Hit",
"Attack with Commandment of Force on Hit",
"Cast Commandment of Frost on Kill",
"Attack with Commandment of Fury on Hit",
"Cast Commandment of Inferno on Kill",
"Attack with Commandment of Ire when Hit",
"Attack with Commandment of Light when you take a Critical Strike",
"Cast Commandment of Reflection when Hit",
"Attack with Commandment of Spite when Hit",
"Cast Commandment of the Tempest on Hit",
"Cast Commandment of the Grave when your Skills or Minions Kill",
"Cast Commandment of Thunder on Kill",
"Attack with Commandment of War on Kill",
"Cast Commandment of Winter when Hit",
},
}

View File

@@ -329,4 +329,23 @@ minions["AnimatedArmour"] = {
},
modList = {
},
}
minions["IcyRagingSpirit"] = {
name = "Grave Spirit",
life = 3,
fireResist = 40,
coldResist = 40,
lightningResist = 40,
chaosResist = 20,
damage = 2,
damageSpread = 0.2,
attackTime = 0.855,
attackRange = 6,
skillList = {
"RagingSpiritMeleeAttack",
},
modList = {
mod("PhysicalDamageConvertToCold", "BASE", 50),
mod("Speed", "MORE", 40, ModFlag.Attack),
},
}

2276
Data/3_0/Skills/glove.lua Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -12,7 +12,7 @@ Adds (5-15) to (20-25) Physical Damage
Adds (5-15) to (20-25) Fire Damage
5% increased Movement Speed
(7-10)% Increased Attack Speed
(15-25)% to Fire Resistance
+(15-25)% to Fire Resistance
{variant:1}Curse Enemies with Flammability on Hit
{variant:2}Curse Enemies with level 10 Flammability on Hit
]],[[

342
Export/Skills/glove.txt Normal file
View File

@@ -0,0 +1,342 @@
-- Path of Building
--
-- Glove enchantment skills
-- Skill data (c) Grinding Gear Games
--
local skills, mod, flag, skill = ...
#skill EnchantmentOfBladesOnHit
#flags spell projectile
fromItem = true,
#mods
#skill EnchantmentOfBladesOnHit2
#flags spell projectile
fromItem = true,
#mods
#skill EnchantmentOfBladesOnHit3
#flags spell projectile
fromItem = true,
#mods
#skill EnchantmentOfBladesOnHit4
#flags spell projectile
fromItem = true,
#mods
#skill EnchantmentOfFlamesOnHit
#flags spell area
fromItem = true,
#mods
#skill EnchantmentOfFlamesOnHit2
#flags spell area
fromItem = true,
#mods
#skill EnchantmentOfFlamesOnHit3
#flags spell area
fromItem = true,
#mods
#skill EnchantmentOfFlamesOnHit4
#flags spell area
fromItem = true,
#mods
#skill EnchantmentOfForceOnHit
#flags attack area
fromItem = true,
#mods
#skill EnchantmentOfForceOnHit2
#flags attack area
fromItem = true,
#mods
#skill EnchantmentOfForceOnHit3
#flags attack area
fromItem = true,
#mods
#skill EnchantmentOfForceOnHit4
#flags attack area
fromItem = true,
#mods
#skill EnchantmentOfFrostOnKill
#flags spell projectile
fromItem = true,
#mods
#skill EnchantmentOfFrostOnKill2
#flags spell projectile
fromItem = true,
#mods
#skill EnchantmentOfFrostOnKill3
#flags spell projectile
fromItem = true,
#mods
#skill EnchantmentOfFrostOnKill4
#flags spell projectile
fromItem = true,
#mods
#skill EnchantmentOfFuryOnHit
#flags attack projectile
fromItem = true,
#mods
#skill EnchantmentOfFuryOnHit2
#flags attack projectile
fromItem = true,
#mods
#skill EnchantmentOfFuryOnHit3
#flags attack projectile
fromItem = true,
#mods
#skill EnchantmentOfFuryOnHit4
#flags attack projectile
fromItem = true,
#mods
#skill EnchantmentOfInfernoOnKill
#flags spell area hit
fromItem = true,
#mods
#skill EnchantmentOfInfernoOnKill2
#flags spell area hit
fromItem = true,
#mods
#skill EnchantmentOfInfernoOnKill3
#flags spell area hit
fromItem = true,
#mods
#skill EnchantmentOfInfernoOnKill4
#flags spell area hit
fromItem = true,
#mods
#skill EnchantmentOfIreWhenHit
#flags attack area duration
fromItem = true,
#mods
#skill EnchantmentOfIreWhenHit2
#flags attack area duration
fromItem = true,
#mods
#skill EnchantmentOfIreWhenHit3
#flags attack area duration
fromItem = true,
#mods
#skill EnchantmentOfIreWhenHit4
#flags attack area duration
fromItem = true,
#mods
#skill EnchantmentOfLightWhenCrit
#flags attack area duration
fromItem = true,
#mods
#skill EnchantmentOfLightWhenCrit2
#flags attack area duration
fromItem = true,
#mods
#skill EnchantmentOfLightWhenCrit3
#flags attack area duration
fromItem = true,
#mods
#skill EnchantmentOfLightWhenCrit4
#flags attack area duration
fromItem = true,
#mods
#skill EnchantmentOfReflectionWhenHit
#flags spell minion duration
minionList = {
"Clone",
},
minionUses = {
["Weapon 1"] = true,
},
fromItem = true,
#mods
#skill EnchantmentOfReflectionWhenHit2
#flags spell minion duration
minionList = {
"Clone",
},
minionUses = {
["Weapon 1"] = true,
},
fromItem = true,
#mods
#skill EnchantmentOfReflectionWhenHit3
#flags spell minion duration
minionList = {
"Clone",
},
minionUses = {
["Weapon 1"] = true,
},
fromItem = true,
#mods
#skill EnchantmentOfReflectionWhenHit4
#flags spell minion duration
minionList = {
"Clone",
},
minionUses = {
["Weapon 1"] = true,
},
fromItem = true,
#mods
#skill EnchantmentOfSpiteWhenHit
#flags attack projectile
fromItem = true,
#mods
#skill EnchantmentOfSpiteWhenHit2
#flags attack projectile
fromItem = true,
#mods
#skill EnchantmentOfSpiteWhenHit3
#flags attack projectile
fromItem = true,
#mods
#skill EnchantmentOfSpiteWhenHit4
#flags attack projectile
fromItem = true,
#mods
#skill EnchantmentOfTempestOnHit
#flags spell area duration
fromItem = true,
#mods
#skill EnchantmentOfTempestOnHit2
#flags spell area duration
fromItem = true,
#mods
#skill EnchantmentOfTempestOnHit3
#flags spell area duration
fromItem = true,
#mods
#skill EnchantmentOfTempestOnHit4
#flags spell area duration
fromItem = true,
#mods
#skill EnchantmentOfTheGraveOnKill
#flags spell minion duration
minionList = {
"IcyRagingSpirit",
},
fromItem = true,
#mods
#skill EnchantmentOfTheGraveOnKill2
#flags spell minion duration
minionList = {
"IcyRagingSpirit",
},
fromItem = true,
#mods
#skill EnchantmentOfTheGraveOnKill3
#flags spell minion duration
minionList = {
"IcyRagingSpirit",
},
fromItem = true,
#mods
#skill EnchantmentOfTheGraveOnKill4
#flags spell minion duration
minionList = {
"IcyRagingSpirit",
},
fromItem = true,
#mods
#skill EnchantmentOfThunderOnKill
#flags spell area hit
fromItem = true,
#mods
#skill EnchantmentOfThunderOnKill2
#flags spell area hit
fromItem = true,
#mods
#skill EnchantmentOfThunderOnKill3
#flags spell area hit
fromItem = true,
#mods
#skill EnchantmentOfThunderOnKill4
#flags spell area hit
fromItem = true,
#mods
#skill EnchantmentOfWarOnKill
#flags attack duration
fromItem = true,
#mods
#skill EnchantmentOfWarOnKill2
#flags attack duration
fromItem = true,
#mods
#skill EnchantmentOfWarOnKill3
#flags attack duration
fromItem = true,
#mods
#skill EnchantmentOfWarOnKill4
#flags attack duration
fromItem = true,
#mods
#skill EnchantmentOfWinterWhenHit
#flags spell projectile area
fromItem = true,
#mods
#skill EnchantmentOfWinterWhenHit2
#flags spell projectile area
fromItem = true,
#mods
#skill EnchantmentOfWinterWhenHit3
#flags spell projectile area
fromItem = true,
#mods
#skill EnchantmentOfWinterWhenHit4
#flags spell projectile area
fromItem = true,
#mods

View File

@@ -162,6 +162,9 @@ directiveTable.skill = function(state, args, out)
out:write('\tgemDex = ', skillGem.Dex, ',\n')
out:write('\tgemInt = ', skillGem.Int, ',\n')
else
if displayName == args and not granted.IsSupport then
displayName = ActiveSkills[granted.ActiveSkillsKey].DisplayedName
end
out:write('\tname = "', displayName, '",\n')
out:write('\thidden = true,\n')
end
@@ -439,12 +442,13 @@ directiveTable.mods = function(state, args, out)
state.gem = nil
end
for _, name in pairs({"act_str","act_dex","act_int","other","minion","spectre","sup_str","sup_dex","sup_int"}) do
for _, name in pairs({"act_str","act_dex","act_int","other","glove","minion","spectre","sup_str","sup_dex","sup_int"}) do
processTemplateFile("Skills/"..name, directiveTable)
end
os.execute("xcopy Skills\\act_*.lua ..\\Data\\3_0\\Skills\\ /Y /Q")
os.execute("xcopy Skills\\sup_*.lua ..\\Data\\3_0\\Skills\\ /Y /Q")
os.execute("xcopy Skills\\other.lua ..\\Data\\3_0\\Skills\\ /Y /Q")
os.execute("xcopy Skills\\glove.lua ..\\Data\\3_0\\Skills\\ /Y /Q")
print("Skill data exported.")

View File

@@ -102,7 +102,7 @@ function calcs.createActiveSkill(activeGem, supportList, summonSkill)
-- Initialise skill flag set ('attack', 'projectile', etc)
local skillFlags = copyTable(activeGem.grantedEffect.baseFlags)
activeSkill.skillFlags = skillFlags
skillFlags.hit = activeSkill.skillTypes[SkillType.Attack] or activeSkill.skillTypes[SkillType.Hit] or activeSkill.skillTypes[SkillType.Projectile]
skillFlags.hit = skillFlags.hit or activeSkill.skillTypes[SkillType.Attack] or activeSkill.skillTypes[SkillType.Hit] or activeSkill.skillTypes[SkillType.Projectile]
-- Process support skills
activeSkill.gemList = { activeGem }
@@ -415,6 +415,7 @@ function calcs.buildActiveSkillModList(env, actor, activeSkill)
minion.minionData = env.data.minions[minionType]
minion.level = activeSkill.skillData.minionLevelIsEnemyLevel and env.enemyLevel or activeSkill.skillData.minionLevel or activeSkill.skillData.levelRequirement
minion.itemList = { }
minion.uses = activeGem.grantedEffect.minionUses
local attackTime = minion.minionData.attackTime * (1 - (minion.minionData.damageFixup or 0))
local damage = env.data.monsterDamageTable[minion.level] * minion.minionData.damage * attackTime
if activeGem.grantedEffect.minionHasItemSet then
@@ -443,17 +444,25 @@ function calcs.buildActiveSkillModList(env, actor, activeSkill)
}
end
minion.weaponData2 = { }
if minion.itemSet then
if activeGem.grantedEffect.minionUses["Weapon 1"] then
local item = env.build.itemsTab.items[minion.itemSet[minion.itemSet.useSecondWeaponSet and "Weapon 1 Swap" or "Weapon 1"].selItemId]
if item then
minion.weaponData1 = item.weaponData[1]
if minion.uses then
if minion.uses["Weapon 1"] then
if minion.itemSet then
local item = env.build.itemsTab.items[minion.itemSet[minion.itemSet.useSecondWeaponSet and "Weapon 1 Swap" or "Weapon 1"].selItemId]
if item then
minion.weaponData1 = item.weaponData[1]
end
else
minion.weaponData1 = env.player.weaponData1
end
end
if activeGem.grantedEffect.minionUses["Weapon 2"] then
local item = env.build.itemsTab.items[minion.itemSet[minion.itemSet.useSecondWeaponSet and "Weapon 2 Swap" or "Weapon 2"].selItemId]
if item and item.weaponData then
minion.weaponData2 = item.weaponData[2]
if minion.uses["Weapon 2"] then
if minion.itemSet then
local item = env.build.itemsTab.items[minion.itemSet[minion.itemSet.useSecondWeaponSet and "Weapon 2 Swap" or "Weapon 2"].selItemId]
if item and item.weaponData then
minion.weaponData2 = item.weaponData[2]
end
else
minion.weaponData2 = env.player.weaponData2
end
end
end

View File

@@ -344,13 +344,18 @@ function calcs.perform(env)
env.minion.modDB:AddList(env.player.itemList["Weapon 2"].modList)
end
end
if env.minion.itemSet then
if env.minion.itemSet or env.minion.uses then
for slotName, slot in pairs(env.build.itemsTab.slots) do
if env.player.mainSkill.activeGem.grantedEffect.minionUses[slotName] then
if slot.weaponSet == 1 and env.minion.itemSet.useSecondWeaponSet then
slotName = slotName .. " Swap"
if env.minion.uses[slotName] then
local item
if env.minion.itemSet then
if slot.weaponSet == 1 and env.minion.itemSet.useSecondWeaponSet then
slotName = slotName .. " Swap"
end
item = env.build.itemsTab.items[env.minion.itemSet[slotName].selItemId]
else
item = env.player.itemList[slotName]
end
local item = env.build.itemsTab.items[env.minion.itemSet[slotName].selItemId]
if item then
env.minion.itemList[slotName] = item
env.minion.modDB:AddList(item.modList or item.slotModList[slot.slotNum])

View File

@@ -12,6 +12,7 @@ local skillTypes = {
"act_dex",
"act_int",
"other",
"glove",
"minion",
"spectre",
"sup_str",
@@ -140,6 +141,7 @@ for _, targetVersion in ipairs(targetVersionList) do
data[targetVersion].enchantments = {
Helmet = dataModule("EnchantmentHelmet"),
Boots = dataModule("EnchantmentBoots"),
Gloves = dataModule("EnchantmentGloves"),
}
data[targetVersion].essences = dataModule("Essence")

View File

@@ -303,7 +303,7 @@ function itemLib.parseItemRaw(item)
local modList, extra = modLib.parseMod[item.targetVersion](rangedLine or line)
if (not modList or extra) and item.rawLines[l+1] then
-- Try to combine it with the next line
modList, extra = modLib.parseMod[item.targetVersion](line.." "..item.rawLines[l+1])
modList, extra = modLib.parseMod[item.targetVersion](line.." "..item.rawLines[l+1], true)
if modList and not extra then
line = line.."\n"..item.rawLines[l+1]
l = l + 1

View File

@@ -137,6 +137,7 @@ local modNameList = {
["to avoid being frozen"] = "AvoidFrozen",
["to avoid being chilled"] = "AvoidChilled",
["to avoid being ignited"] = "AvoidIgnite",
["to avoid elemental ailments"] = { "AvoidShock", "AvoidFrozen", "AvoidChilled", "AvoidIgnite" },
["to avoid elemental status ailments"] = { "AvoidShock", "AvoidFrozen", "AvoidChilled", "AvoidIgnite" },
["damage is taken from mana before life"] = "DamageTakenFromManaBeforeLife",
["effect of curses on you"] = "CurseEffectOnSelf",
@@ -418,6 +419,7 @@ local preFlagList = {
["^attacks with this weapon have "] = { tag = { type = "Condition", var = "XHandAttack" } },
["^attacks have "] = { flags = ModFlag.Attack },
["^melee attacks have "] = { flags = ModFlag.Melee },
["^trap and mine damage "] = { keywordFlags = bor(KeywordFlag.Trap, KeywordFlag.Mine) },
["^left ring slot: "] = { tag = { type = "SlotNumber", num = 1 } },
["^right ring slot: "] = { tag = { type = "SlotNumber", num = 2 } },
["^socketed gems have "] = { tag = { type = "SocketedIn" } },
@@ -432,6 +434,7 @@ local preFlagList = {
["^you and nearby allies [hgd][ae][via][enl] "] = { newAura = true },
["^nearby allies [hgd][ae][via][enl] "] = { newAura = true, newAuraOnlyAllies = true },
["^you and allies affected by your auras have "] = { affectedByAura = true },
["^take "] = { modSuffix = "Taken" },
}
-- List of modifier tags
@@ -517,41 +520,45 @@ local modTagList = {
["while frozen"] = { tag = { type = "Condition", var = "Frozen" } },
["while shocked"] = { tag = { type = "Condition", var = "Shocked" } },
["while not ignited, frozen or shocked"] = { tag = { type = "Condition", varList = { "Ignited", "Frozen", "Shocked" }, neg = true } },
["if you have hit recently"] = { tag = { type = "Condition", var = "HitRecently" } },
["if you've crit recently"] = { tag = { type = "Condition", var = "CritRecently" } },
["if you've dealt a critical strike recently"] = { tag = { type = "Condition", var = "CritRecently" } },
["if you[' ]h?a?ve hit recently"] = { tag = { type = "Condition", var = "HitRecently" } },
["if you[' ]h?a?ve crit recently"] = { tag = { type = "Condition", var = "CritRecently" } },
["if you[' ]h?a?ve dealt a critical strike recently"] = { tag = { type = "Condition", var = "CritRecently" } },
["if you haven't crit recently"] = { tag = { type = "Condition", var = "CritRecently", neg = true } },
["if you've dealt a non%-critical strike recently"] = { tag = { type = "Condition", var = "NonCritRecently" } },
["if you've killed recently"] = { tag = { type = "Condition", var = "KilledRecently" } },
["if you[' ]h?a?ve dealt a non%-critical strike recently"] = { tag = { type = "Condition", var = "NonCritRecently" } },
["if you[' ]h?a?ve killed recently"] = { tag = { type = "Condition", var = "KilledRecently" } },
["if you haven't killed recently"] = { tag = { type = "Condition", var = "KilledRecently", neg = true } },
["if you or your totems have killed recently"] = { tag = { type = "Condition", varList = {"KilledRecently","TotemsKilledRecently"} } },
["if you've killed a maimed enemy recently"] = { tagList = { { type = "Condition", var = "KilledRecently" }, { type = "Condition", var = "EnemyMaimed" } } },
["if you've killed an enemy affected by your damage over time recently"] = { tag = { type = "Condition", var = "KilledAffectedByDotRecently" } },
["if you've frozen an enemy recently"] = { tag = { type = "Condition", var = "FrozenEnemyRecently" } },
["if you've ignited an enemy recently"] = { tag = { type = "Condition", var = "IgnitedEnemyRecently" } },
["if you[' ]h?a?ve killed a maimed enemy recently"] = { tagList = { { type = "Condition", var = "KilledRecently" }, { type = "EnemyCondition", var = "Maimed" } } },
["if you[' ]h?a?ve killed a cursed enemy recently"] = { tagList = { { type = "Condition", var = "KilledRecently" }, { type = "EnemyCondition", var = "Cursed" } } },
["if you[' ]h?a?ve killed a bleeding enemy recently"] = { tagList = { { type = "Condition", var = "KilledRecently" }, { type = "EnemyCondition", var = "Bleeding" } } },
["if you[' ]h?a?ve killed an enemy affected by your damage over time recently"] = { tag = { type = "Condition", var = "KilledAffectedByDotRecently" } },
["if you[' ]h?a?ve frozen an enemy recently"] = { tag = { type = "Condition", var = "FrozenEnemyRecently" } },
["if you[' ]h?a?ve ignited an enemy recently"] = { tag = { type = "Condition", var = "IgnitedEnemyRecently" } },
["if you[' ]h?a?ve been hit recently"] = { tag = { type = "Condition", var = "BeenHitRecently" } },
["if you were hit recently"] = { tag = { type = "Condition", var = "BeenHitRecently" } },
["if you were damaged by a hit recently"] = { tag = { type = "Condition", var = "BeenHitRecently" } },
["if you've taken a critical strike recently"] = { tag = { type = "Condition", var = "BeenCritRecently" } },
["if you've taken a savage hit recently"] = { tag = { type = "Condition", var = "BeenSavageHitRecently" } },
["if you[' ]h?a?ve taken a critical strike recently"] = { tag = { type = "Condition", var = "BeenCritRecently" } },
["if you[' ]h?a?ve taken a savage hit recently"] = { tag = { type = "Condition", var = "BeenSavageHitRecently" } },
["if you have ?n[o']t been hit recently"] = { tag = { type = "Condition", var = "BeenHitRecently", neg = true } },
["if you've taken no damage from hits recently"] = { tag = { type = "Condition", var = "BeenHitRecently", neg = true } },
["if you[' ]h?a?ve taken no damage from hits recently"] = { tag = { type = "Condition", var = "BeenHitRecently", neg = true } },
["if you[' ]h?a?ve blocked recently"] = { tag = { type = "Condition", varList = { "BlockedAttackRecently", "BlockedSpellRecently" } } },
["if you've blocked an attack recently"] = { tag = { type = "Condition", var = "BlockedAttackRecently" } },
["if you've blocked a spell recently"] = { tag = { type = "Condition", var = "BlockedSpellRecently" } },
["if you've blocked a hit from a unique enemy recently"] = { tag = { type = "Condition", var = "BlockedHitFromUniqueEnemyRecently" } },
["if you've attacked recently"] = { tag = { type = "Condition", var = "AttackedRecently" } },
["if you've cast a spell recently"] = { tag = { type = "Condition", var = "CastSpellRecently" } },
["if you have consumed a corpse recently"] = { tag = { type = "Condition", var = "ConsumedCorpseRecently" } },
["if you've taunted an enemy recently"] = { tag = { type = "Condition", var = "TauntedEnemyRecently" } },
["if you've used a warcry recently"] = { tag = { type = "Condition", var = "UsedWarcryRecently" } },
["if you've used a fire skill in the past 10 seconds"] = { tag = { type = "Condition", var = "UsedFireSkillInPast10Sec" } },
["if you've used a cold skill in the past 10 seconds"] = { tag = { type = "Condition", var = "UsedColdSkillInPast10Sec" } },
["if you've used a lightning skill in the past 10 seconds"] = { tag = { type = "Condition", var = "UsedLightningSkillInPast10Sec" } },
["if you've summoned a totem recently"] = { tag = { type = "Condition", var = "SummonedTotemRecently" } },
["if you've used a movement skill recently"] = { tag = { type = "Condition", var = "UsedMovementSkillRecently" } },
["if you[' ]h?a?ve blocked an attack recently"] = { tag = { type = "Condition", var = "BlockedAttackRecently" } },
["if you[' ]h?a?ve blocked a spell recently"] = { tag = { type = "Condition", var = "BlockedSpellRecently" } },
["if you[' ]h?a?ve blocked a hit from a unique enemy recently"] = { tag = { type = "Condition", var = "BlockedHitFromUniqueEnemyRecently" } },
["if you[' ]h?a?ve attacked recently"] = { tag = { type = "Condition", var = "AttackedRecently" } },
["if you[' ]h?a?ve cast a spell recently"] = { tag = { type = "Condition", var = "CastSpellRecently" } },
["if you[' ]h?a?ve consumed a corpse recently"] = { tag = { type = "Condition", var = "ConsumedCorpseRecently" } },
["if you[' ]h?a?ve taunted an enemy recently"] = { tag = { type = "Condition", var = "TauntedEnemyRecently" } },
["if you[' ]h?a?ve used a warcry recently"] = { tag = { type = "Condition", var = "UsedWarcryRecently" } },
["if you[' ]h?a?ve used a fire skill recently"] = { tag = { type = "Condition", var = "UsedFireSkillRecently" } },
["if you[' ]h?a?ve used a cold skill recently"] = { tag = { type = "Condition", var = "UsedColdSkillRecently" } },
["if you[' ]h?a?ve used a fire skill in the past 10 seconds"] = { tag = { type = "Condition", var = "UsedFireSkillInPast10Sec" } },
["if you[' ]h?a?ve used a cold skill in the past 10 seconds"] = { tag = { type = "Condition", var = "UsedColdSkillInPast10Sec" } },
["if you[' ]h?a?ve used a lightning skill in the past 10 seconds"] = { tag = { type = "Condition", var = "UsedLightningSkillInPast10Sec" } },
["if you[' ]h?a?ve summoned a totem recently"] = { tag = { type = "Condition", var = "SummonedTotemRecently" } },
["if you[' ]h?a?ve used a movement skill recently"] = { tag = { type = "Condition", var = "UsedMovementSkillRecently" } },
["if you detonated mines recently"] = { tag = { type = "Condition", var = "DetonatedMinesRecently" } },
["if you've crit in the past 8 seconds"] = { tag = { type = "Condition", var = "CritInPast8Sec" } },
["if you[' ]h?a?ve crit in the past 8 seconds"] = { tag = { type = "Condition", var = "CritInPast8Sec" } },
["if energy shield recharge has started recently"] = { tag = { type = "Condition", var = "EnergyShieldRechargeRecently" } },
-- Enemy status conditions
["at close range"] = { tag = { type = "Condition", var = "AtCloseRange" }, flags = ModFlag.Hit },
@@ -637,6 +644,7 @@ local specialModList = {
["spend energy shield before mana for skill costs"] = { },
["energy shield protects mana instead of life"] = { flag("EnergyShieldProtectsMana") },
-- Ascendancy notables
["can allocate passives from the %a+'s starting point"] = { },
["movement skills cost no mana"] = { mod("ManaCost", "MORE", -100, nil, 0, KeywordFlag.Movement) },
["projectiles have (%d+)%% additional chance to pierce targets at the start of their movement, losing this chance as the projectile travels farther"] = function(num) return { mod("PierceChance", "BASE", num, { type = "DistanceRamp", ramp = {{10,1},{120,0}} }) } end,
["projectile critical strike chance increased by arrow pierce chance"] = { mod("CritChance", "INC", 1, nil, ModFlag.Projectile, 0, { type = "PerStat", stat = "PierceChance", div = 1 }) },
@@ -670,6 +678,7 @@ local specialModList = {
["skills from your helmet penetrate (%d+)%% elemental resistances"] = function(num) return { mod("ElementalPenetration", "BASE", num, { type = "SocketedIn", slotName = "Helmet" }) } end,
["skills from your gloves have (%d+)%% increased area of effect"] = function(num) return { mod("AreaOfEffect", "INC", num, { type = "SocketedIn", slotName = "Gloves" }) } end,
["skills from your boots leech (%d+)%% of damage as life"] = function(num) return { mod("DamageLifeLeech", "BASE", num, { type = "SocketedIn", slotName = "Boots" }) } end,
["skills in your helm can have up to (%d+) additional totems? summoned at a time"] = function(num) return { mod("ActiveTotemLimit", "BASE", num, { type = "SocketedIn", slotName = "Helmet" }) } end,
["(%d+)%% less totem damage per totem"] = function(num) return { mod("Damage", "MORE", -num, nil, 0, KeywordFlag.Totem, { type = "PerStat", stat = "ActiveTotemLimit", div = 1 }) } end,
["poison you inflict with critical strikes deals (%d+)%% more damage"] = function(num) return { mod("PoisonDamageOnCrit", "MORE", 100) } end,
["bleeding you inflict on maimed enemies deals (%d+)%% more damage"] = function(num) return { mod("Damage", "MORE", num, nil, 0, KeywordFlag.Bleed, { type = "EnemyCondition", var = "Maimed"}) } end,
@@ -731,6 +740,14 @@ local specialModList = {
["cast level (%d+) (.+) when you deal a critical strike"] = function(num, _, skill) return { mod("ExtraSkill", "LIST", { name = gemNameLookup[skill:gsub(" skill","")] or "Unknown", level = num }) } end,
["cast level (%d+) (.+) when hit"] = function(num, _, skill) return { mod("ExtraSkill", "LIST", { name = gemNameLookup[skill:gsub(" skill","")] or "Unknown", level = num }) } end,
["cast level (%d+) (.+) when you kill an enemy"] = function(num, _, skill) return { mod("ExtraSkill", "LIST", { name = gemNameLookup[skill:gsub(" skill","")] or "Unknown", level = num }) } end,
["cast (.+) on hit"] = function(_, skill) return { mod("ExtraSkill", "LIST", { name = gemNameLookup[skill] or "Unknown", level = 1 }) } end,
["attack with (.+) on hit"] = function(_, skill) return { mod("ExtraSkill", "LIST", { name = gemNameLookup[skill] or "Unknown", level = 1 }) } end,
["cast (.+) when hit"] = function(_, skill) return { mod("ExtraSkill", "LIST", { name = gemNameLookup[skill] or "Unknown", level = 1 }) } end,
["attack with (.+) when hit"] = function(_, skill) return { mod("ExtraSkill", "LIST", { name = gemNameLookup[skill] or "Unknown", level = 1 }) } end,
["cast (.+) on kill"] = function(_, skill) return { mod("ExtraSkill", "LIST", { name = gemNameLookup[skill] or "Unknown", level = 1 }) } end,
["attack with (.+) on kill"] = function(_, skill) return { mod("ExtraSkill", "LIST", { name = gemNameLookup[skill] or "Unknown", level = 1 }) } end,
["cast (.+) when your skills or minions kill"] = function(_, skill) return { mod("ExtraSkill", "LIST", { name = gemNameLookup[skill] or "Unknown", level = 1 }) } end,
["attack with (.+) when you take a critical strike"] = function( _, skill) return { mod("ExtraSkill", "LIST", { name = gemNameLookup[skill] or "Unknown", level = 1 }) } end,
["%d+%% chance to attack with level (%d+) (.+) on melee hit"] = function(num, _, skill) return { mod("ExtraSkill", "LIST", { name = gemNameLookup[skill:gsub(" skill","")] or "Unknown", level = num }) } end,
["%d+%% chance to cast level (%d+) (.+) on hit"] = function(num, _, skill) return { mod("ExtraSkill", "LIST", { name = gemNameLookup[skill:gsub(" skill","")] or "Unknown", level = num }) } end,
["%d+%% chance to cast level (%d+) (.+) on kill"] = function(num, _, skill) return { mod("ExtraSkill", "LIST", { name = gemNameLookup[skill:gsub(" skill","")] or "Unknown", level = num }) } end,
@@ -900,6 +917,8 @@ local specialModList = {
["you have onslaught while you have fortify"] = { flag("Condition:Onslaught", { type = "Condition", var = "Fortify" }) },
["reserves (%d+)%% of life"] = function(num) return { mod("ExtraLifeReserved", "BASE", num) } end,
["items and gems have (%d+)%% reduced attribute requirements"] = function(num) return { mod("GlobalAttributeRequirements", "INC", -num) } end,
["prefixes:"] = { },
["suffixes:"] = { },
-- Skill-specific enchantment modifiers
["(%d+)%% increased decoy totem life"] = function(num) return { mod("TotemLife", "INC", num, { type = "SkillName", skillName = "Decoy Totem" }) } end,
["(%d+)%% increased ice spear critical strike chance in second form"] = function(num) return { mod("CritChance", "INC", num, { type = "SkillName", skillName = "Ice Spear" }, { type = "SkillPart", skillPart = 2 }) } end,
@@ -1329,7 +1348,7 @@ local function parseMod(line, order)
local modList = { }
for i, name in ipairs(type(nameList) == "table" and nameList or { nameList }) do
modList[i] = {
name = name .. (modSuffix or ""),
name = name .. (modSuffix or misc.modSuffix or ""),
type = modType,
value = type(modValue) == "table" and modValue[i] or modValue,
flags = flags,

View File

@@ -399,7 +399,7 @@ local modFlagList = {
-- List of modifier flags/tags that appear at the start of a line
local preFlagList = {
["^hits deal "] = { flags = ModFlag.Hit },
["^hits deal "] = { keywordFlags = KeywordFlag.Hit },
["^critical strikes deal "] = { tag = { type = "Condition", var = "CriticalStrike" } },
["^minions "] = { addToMinion = true },
["^minions [hd][ae][va][el] "] = { addToMinion = true },
@@ -426,6 +426,7 @@ local preFlagList = {
["^attacks with this weapon have "] = { tag = { type = "Condition", var = "XHandAttack" } },
["^attacks have "] = { flags = ModFlag.Attack },
["^melee attacks have "] = { flags = ModFlag.Melee },
["^trap and mine damage "] = { keywordFlags = bor(KeywordFlag.Trap, KeywordFlag.Mine) },
["^left ring slot: "] = { tag = { type = "SlotNumber", num = 1 } },
["^right ring slot: "] = { tag = { type = "SlotNumber", num = 2 } },
["^socketed gems have "] = { tag = { type = "SocketedIn" } },
@@ -440,6 +441,7 @@ local preFlagList = {
["^you and nearby allies [hgd][ae][via][enl] "] = { newAura = true },
["^nearby allies [hgd][ae][via][enl] "] = { newAura = true, newAuraOnlyAllies = true },
["^you and allies affected by your auras have "] = { affectedByAura = true },
["^take "] = { modSuffix = "Taken" },
}
-- List of modifier tags
@@ -527,7 +529,7 @@ local modTagList = {
["while not ignited, frozen or shocked"] = { tag = { type = "Condition", varList = { "Ignited", "Frozen", "Shocked" }, neg = true } },
["while cursed"] = { tag = { type = "Condition", var = "Cursed" } },
["while not cursed"] = { tag = { type = "Condition", var = "Cursed", neg = true } },
["if you have hit recently"] = { tag = { type = "Condition", var = "HitRecently" } },
["if you[' ]h?a?ve hit recently"] = { tag = { type = "Condition", var = "HitRecently" } },
["if you[' ]h?a?ve crit recently"] = { tag = { type = "Condition", var = "CritRecently" } },
["if you[' ]h?a?ve dealt a critical strike recently"] = { tag = { type = "Condition", var = "CritRecently" } },
["if you haven't crit recently"] = { tag = { type = "Condition", var = "CritRecently", neg = true } },
@@ -535,7 +537,9 @@ local modTagList = {
["if you[' ]h?a?ve killed recently"] = { tag = { type = "Condition", var = "KilledRecently" } },
["if you haven't killed recently"] = { tag = { type = "Condition", var = "KilledRecently", neg = true } },
["if you or your totems have killed recently"] = { tag = { type = "Condition", varList = {"KilledRecently","TotemsKilledRecently"} } },
["if you[' ]h?a?ve killed a maimed enemy recently"] = { tagList = { { type = "Condition", var = "KilledRecently" }, { type = "Condition", var = "EnemyMaimed" } } },
["if you[' ]h?a?ve killed a maimed enemy recently"] = { tagList = { { type = "Condition", var = "KilledRecently" }, { type = "EnemyCondition", var = "Maimed" } } },
["if you[' ]h?a?ve killed a cursed enemy recently"] = { tagList = { { type = "Condition", var = "KilledRecently" }, { type = "EnemyCondition", var = "Cursed" } } },
["if you[' ]h?a?ve killed a bleeding enemy recently"] = { tagList = { { type = "Condition", var = "KilledRecently" }, { type = "EnemyCondition", var = "Bleeding" } } },
["if you[' ]h?a?ve killed an enemy affected by your damage over time recently"] = { tag = { type = "Condition", var = "KilledAffectedByDotRecently" } },
["if you[' ]h?a?ve frozen an enemy recently"] = { tag = { type = "Condition", var = "FrozenEnemyRecently" } },
["if you[' ]h?a?ve ignited an enemy recently"] = { tag = { type = "Condition", var = "IgnitedEnemyRecently" } },
@@ -552,7 +556,7 @@ local modTagList = {
["if you[' ]h?a?ve blocked a hit from a unique enemy recently"] = { tag = { type = "Condition", var = "BlockedHitFromUniqueEnemyRecently" } },
["if you[' ]h?a?ve attacked recently"] = { tag = { type = "Condition", var = "AttackedRecently" } },
["if you[' ]h?a?ve cast a spell recently"] = { tag = { type = "Condition", var = "CastSpellRecently" } },
["if you have consumed a corpse recently"] = { tag = { type = "Condition", var = "ConsumedCorpseRecently" } },
["if you[' ]h?a?ve consumed a corpse recently"] = { tag = { type = "Condition", var = "ConsumedCorpseRecently" } },
["if you[' ]h?a?ve taunted an enemy recently"] = { tag = { type = "Condition", var = "TauntedEnemyRecently" } },
["if you[' ]h?a?ve used a warcry recently"] = { tag = { type = "Condition", var = "UsedWarcryRecently" } },
["if you[' ]h?a?ve used a fire skill recently"] = { tag = { type = "Condition", var = "UsedFireSkillRecently" } },
@@ -651,6 +655,7 @@ local specialModList = {
["energy shield protects mana instead of life"] = { flag("EnergyShieldProtectsMana") },
["modifiers to critical strike multiplier also apply to damage multiplier for ailments from critical strikes at (%d+)%% of their value"] = function(num) return { mod("CritMultiplierAppliesToDegen", "BASE", num) } end,
-- Ascendancy notables
["can allocate passives from the %a+'s starting point"] = { },
["movement skills cost no mana"] = { mod("ManaCost", "MORE", -100, nil, 0, KeywordFlag.Movement) },
["projectiles have (%d+)%% additional chance to pierce targets at the start of their movement, losing this chance as the projectile travels farther"] = function(num) return { mod("PierceChance", "BASE", num, { type = "DistanceRamp", ramp = {{10,1},{120,0}} }) } end,
["projectile critical strike chance increased by arrow pierce chance"] = { mod("CritChance", "INC", 1, nil, ModFlag.Projectile, 0, { type = "PerStat", stat = "PierceChance", div = 1 }) },
@@ -684,6 +689,7 @@ local specialModList = {
["skills from your helmet penetrate (%d+)%% elemental resistances"] = function(num) return { mod("ElementalPenetration", "BASE", num, { type = "SocketedIn", slotName = "Helmet" }) } end,
["skills from your gloves have (%d+)%% increased area of effect"] = function(num) return { mod("AreaOfEffect", "INC", num, { type = "SocketedIn", slotName = "Gloves" }) } end,
["skills from your boots leech (%d+)%% of damage as life"] = function(num) return { mod("DamageLifeLeech", "BASE", num, { type = "SocketedIn", slotName = "Boots" }) } end,
["skills in your helm can have up to (%d+) additional totems? summoned at a time"] = function(num) return { mod("ActiveTotemLimit", "BASE", num, { type = "SocketedIn", slotName = "Helmet" }) } end,
["(%d+)%% less totem damage per totem"] = function(num) return { mod("Damage", "MORE", -num, nil, 0, KeywordFlag.Totem, { type = "PerStat", stat = "ActiveTotemLimit", div = 1 }) } end,
["poison you inflict with critical strikes deals (%d+)%% more damage"] = function(num) return { mod("Damage", "MORE", num, nil, 0, KeywordFlag.Poison, { type = "Condition", var = "CriticalStrike" }) } end,
["bleeding you inflict on maimed enemies deals (%d+)%% more damage"] = function(num) return { mod("Damage", "MORE", num, nil, 0, KeywordFlag.Bleed, { type = "EnemyCondition", var = "Maimed"}) } end,
@@ -746,6 +752,14 @@ local specialModList = {
["cast level (%d+) (.+) when you deal a critical strike"] = function(num, _, skill) return { mod("ExtraSkill", "LIST", { name = gemNameLookup[skill:gsub(" skill","")] or "Unknown", level = num }) } end,
["cast level (%d+) (.+) when hit"] = function(num, _, skill) return { mod("ExtraSkill", "LIST", { name = gemNameLookup[skill:gsub(" skill","")] or "Unknown", level = num }) } end,
["cast level (%d+) (.+) when you kill an enemy"] = function(num, _, skill) return { mod("ExtraSkill", "LIST", { name = gemNameLookup[skill:gsub(" skill","")] or "Unknown", level = num }) } end,
["cast (.+) on hit"] = function(_, skill) return { mod("ExtraSkill", "LIST", { name = gemNameLookup[skill] or "Unknown", level = 1 }) } end,
["attack with (.+) on hit"] = function(_, skill) return { mod("ExtraSkill", "LIST", { name = gemNameLookup[skill] or "Unknown", level = 1 }) } end,
["cast (.+) when hit"] = function(_, skill) return { mod("ExtraSkill", "LIST", { name = gemNameLookup[skill] or "Unknown", level = 1 }) } end,
["attack with (.+) when hit"] = function(_, skill) return { mod("ExtraSkill", "LIST", { name = gemNameLookup[skill] or "Unknown", level = 1 }) } end,
["cast (.+) on kill"] = function(_, skill) return { mod("ExtraSkill", "LIST", { name = gemNameLookup[skill] or "Unknown", level = 1 }) } end,
["attack with (.+) on kill"] = function(_, skill) return { mod("ExtraSkill", "LIST", { name = gemNameLookup[skill] or "Unknown", level = 1 }) } end,
["cast (.+) when your skills or minions kill"] = function(_, skill) return { mod("ExtraSkill", "LIST", { name = gemNameLookup[skill] or "Unknown", level = 1 }) } end,
["attack with (.+) when you take a critical strike"] = function( _, skill) return { mod("ExtraSkill", "LIST", { name = gemNameLookup[skill] or "Unknown", level = 1 }) } end,
["%d+%% chance to attack with level (%d+) (.+) on melee hit"] = function(num, _, skill) return { mod("ExtraSkill", "LIST", { name = gemNameLookup[skill:gsub(" skill","")] or "Unknown", level = num }) } end,
["%d+%% chance to cast level (%d+) (.+) on hit"] = function(num, _, skill) return { mod("ExtraSkill", "LIST", { name = gemNameLookup[skill:gsub(" skill","")] or "Unknown", level = num }) } end,
["%d+%% chance to cast level (%d+) (.+) on kill"] = function(num, _, skill) return { mod("ExtraSkill", "LIST", { name = gemNameLookup[skill:gsub(" skill","")] or "Unknown", level = num }) } end,
@@ -916,6 +930,8 @@ local specialModList = {
["you have onslaught while you have fortify"] = { flag("Condition:Onslaught", { type = "Condition", var = "Fortify" }) },
["reserves (%d+)%% of life"] = function(num) return { mod("ExtraLifeReserved", "BASE", num) } end,
["items and gems have (%d+)%% reduced attribute requirements"] = function(num) return { mod("GlobalAttributeRequirements", "INC", -num) } end,
["prefixes:"] = { },
["suffixes:"] = { },
-- Skill-specific enchantment modifiers
["(%d+)%% increased decoy totem life"] = function(num) return { mod("TotemLife", "INC", num, { type = "SkillName", skillName = "Decoy Totem" }) } end,
["(%d+)%% increased ice spear critical strike chance in second form"] = function(num) return { mod("CritChance", "INC", num, { type = "SkillName", skillName = "Ice Spear" }, { type = "SkillPart", skillPart = 2 }) } end,
@@ -1211,8 +1227,8 @@ local function parseMod(line, order)
end
-- Check for a flag/tag specification at the start of the line
local modFlag
modFlag, line = scan(line, preFlagList)
local preFlag
preFlag, line = scan(line, preFlagList)
-- Check for skill name at the start of the line
local skillTag
@@ -1258,10 +1274,9 @@ local function parseMod(line, order)
skillTag, line = scan(line, skillNameList, true)
end
-- Scan for flags if one hasn't been found already
if not modFlag then
modFlag, line = scan(line, modFlagList, true)
end
-- Scan for flags
local modFlag
modFlag, line = scan(line, modFlagList, true)
-- Find modifier value and type according to form
local modValue = num
@@ -1326,7 +1341,7 @@ local function parseMod(line, order)
local keywordFlags = 0
local tagList = { }
local misc = { }
for _, data in pairs({ modName, modFlag, modTag, modTag2, skillTag }) do
for _, data in pairs({ modName, preFlag, modFlag, modTag, modTag2, skillTag }) do
if type(data) == "table" then
flags = bor(flags, data.flags or 0)
keywordFlags = bor(keywordFlags, data.keywordFlags or 0)
@@ -1348,7 +1363,7 @@ local function parseMod(line, order)
local modList = { }
for i, name in ipairs(type(nameList) == "table" and nameList or { nameList }) do
modList[i] = {
name = name .. (modSuffix or ""),
name = name .. (modSuffix or misc.modSuffix or ""),
type = modType,
value = type(modValue) == "table" and modValue[i] or modValue,
flags = flags,
@@ -1393,21 +1408,25 @@ end
local cache = { }
local unsupported = { }
local count = 0
return function(line)
--local foo = io.open("../unsupported.txt", "w")
--foo:close()
return function(line, isComb)
if not cache[line] then
local modList, extra = parseMod(line, 1)
if modList and extra then
modList, extra = parseMod(line, 2)
end
cache[line] = { modList, extra }
--[[if not cache[line][1] then
if foo and not isComb and not cache[line][1] then
local form = line:gsub("[%+%-]?%d+%.?%d*","{num}")
if not unsupported[form] then
unsupported[form] = true
count = count + 1
ConPrintf("%d %s", count, form)
foo = io.open("../unsupported.txt", "a+")
foo:write(count, ': ', form, '\n')
foo:close()
end
end]]
end
end
return unpack(copyTable(cache[line]))
end

View File

@@ -114,6 +114,7 @@ EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "2.6", "2.6", "{C67A4D0E-AF9E-45AB-9900-0D72C974B6A5}"
ProjectSection(SolutionItems) = preProject
Data\2_6\EnchantmentBoots.lua = Data\2_6\EnchantmentBoots.lua
Data\2_6\EnchantmentGloves.lua = Data\2_6\EnchantmentGloves.lua
Data\2_6\EnchantmentHelmet.lua = Data\2_6\EnchantmentHelmet.lua
Data\2_6\Essence.lua = Data\2_6\Essence.lua
Data\2_6\Minions.lua = Data\2_6\Minions.lua
@@ -129,6 +130,7 @@ EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "3.0", "3.0", "{E58DF0B8-3886-4CF7-B6F7-5EC094049DCF}"
ProjectSection(SolutionItems) = preProject
Data\3_0\EnchantmentBoots.lua = Data\3_0\EnchantmentBoots.lua
Data\3_0\EnchantmentGloves.lua = Data\3_0\EnchantmentGloves.lua
Data\3_0\EnchantmentHelmet.lua = Data\3_0\EnchantmentHelmet.lua
Data\3_0\Essence.lua = Data\3_0\Essence.lua
Data\3_0\Minions.lua = Data\3_0\Minions.lua

View File

@@ -53,6 +53,11 @@ If you'd like to help support the development of Path of Building, I have a [Pat
![ss3](https://cloud.githubusercontent.com/assets/19189971/18089780/f0ff234a-6f04-11e6-8c88-6193fe59a5c4.png)
## Changelog
### 1.4.39 - 2017/06/30
* You can now apply enchantments to Gloves
* Added support for all Glove enchantment skills
* Various minor tweaks and fixes
### 1.4.38 - 2017/06/29
* Added support for Devouring Totem
* Added basic support for Conversion Trap (calculations for mana cost, cooldown and duration)

View File

@@ -1,3 +1,7 @@
VERSION[1.4.39][2017/06/30]
* You can now apply enchantments to Gloves
* Added support for all Glove enchantment skills
* Various minor tweaks and fixes
VERSION[1.4.38][2017/06/29]
* Added support for Devouring Totem
* Added basic support for Conversion Trap (calculations for mana cost, cooldown and duration)

View File

@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<PoBVersion>
<Version number="1.4.38"/>
<Version number="1.4.39"/>
<Source part="program" url="https://raw.githubusercontent.com/Openarl/PathOfBuilding/{branch}/"/>
<Source part="tree" url="https://raw.githubusercontent.com/Openarl/PathOfBuilding/{branch}/tree.zip"/>
<Source url="https://raw.githubusercontent.com/Openarl/PathOfBuilding/{branch}/runtime-win32.zip" part="runtime" platform="win32"/>
<File sha1="2fb719ed2a9648b2dd13a137f650b3c0e48705fa" name="Launch.lua" part="program"/>
<File sha1="72b9bea1871e94a643e4471fd84bbedbc7810336" name="UpdateCheck.lua" part="program"/>
<File sha1="4f17937f2b37784e169a3792b235f2a0a3961e61" name="UpdateApply.lua" part="program"/>
<File sha1="eb7c749e814c764fc485684b361f46f22b824530" name="changelog.txt" part="program"/>
<File sha1="d4ba67e567a41b640a2e7843ebc1344b2ac69dc3" name="changelog.txt" part="program"/>
<File sha1="3558da442f2fc18c3e1ea751b301be863dee56e8" name="Classes/BuildListControl.lua" part="program"/>
<File sha1="dc2ffb55b4aae04b86886b25bbf219a301b21340" name="Classes/ButtonControl.lua" part="program"/>
<File sha1="c2dcdfa14d43f1c2452d9abbd34979e67291ae19" name="Classes/CalcBreakdownControl.lua" part="program"/>
@@ -21,7 +21,7 @@
<File sha1="276512f60a6634a1c4febd475fe1e280b81b23b4" name="Classes/EditControl.lua" part="program"/>
<File sha1="afa58b85c876e107edcd49e4a01c06a981843ff8" name="Classes/FolderListControl.lua" part="program"/>
<File sha1="ee93a66305ba95fa95bb0c5659a5bab8871c96db" name="Classes/GemSelectControl.lua" part="program"/>
<File sha1="6ce66aec09c905cb3a1fd9a4014b2d14167ccec6" name="Classes/ImportTab.lua" part="program"/>
<File sha1="fcb3122575ce628dd8db190453d707cb8f6944d8" name="Classes/ImportTab.lua" part="program"/>
<File sha1="532e37fb829a9c87bf26c676d1f773e9fa09323f" name="Classes/ItemDBControl.lua" part="program"/>
<File sha1="6db5f76dcc2b41cd62900be8c11be79997e2160f" name="Classes/ItemListControl.lua" part="program"/>
<File sha1="627de0e59c5b1f68f9d0c0913a0a84d564660a8d" name="Classes/ItemSetListControl.lua" part="program"/>
@@ -35,7 +35,7 @@
<File sha1="9bc0d8791e7825e52070e96e7894d29fad70cf98" name="Classes/NotesTab.lua" part="program"/>
<File sha1="ca94b201ae873829e7be39075150ee6bc79be0c3" name="Classes/PassiveSpec.lua" part="program"/>
<File sha1="2802110b05a2ebdf39e62c1e9cfcf72d9538f359" name="Classes/PassiveSpecListControl.lua" part="program"/>
<File sha1="eb83c39c7598c5534458036cf870ca0a31e767b1" name="Classes/PassiveTree.lua" part="program"/>
<File sha1="59116e062d54eeb8c9247465699e8b5de5a38a20" name="Classes/PassiveTree.lua" part="program"/>
<File sha1="fefeaac2e396b46f0b6935a6ac3117c59e909157" name="Classes/PassiveTreeView.lua" part="program"/>
<File sha1="824082f62de7fa5fbe9ea95ee59db8bb6e378b5f" name="Classes/PathControl.lua" part="program"/>
<File sha1="9d91ef81ac4fd8d5a1e16be17bdf199545209d87" name="Classes/PopupDialog.lua" part="program"/>
@@ -51,24 +51,24 @@
<File sha1="4b7675c8b4fe71cade7dd3d70793df1ed8022d01" name="Classes/UndoHandler.lua" part="program"/>
<File sha1="cbed5fe9dd5909c21ca58c123623a1b8159147b3" name="Modules/Build.lua" part="program"/>
<File sha1="44fab56072de8e555ff7e20ee32628230511d1d6" name="Modules/BuildList.lua" part="program"/>
<File sha1="762f6393caf2cb625ee496e50fc0cb422eeecc70" name="Modules/CalcActiveSkill.lua" part="program"/>
<File sha1="2161d63e451c6eea1e78e7f927783bc65ef3e69a" name="Modules/CalcActiveSkill.lua" part="program"/>
<File sha1="b2b8d55258d9763d7c7a4a9ca1f99be3973528a8" name="Modules/CalcBreakdown.lua" part="program"/>
<File sha1="f6abff3650f2ba313232c2edeec474b68bf1c83f" name="Modules/CalcDefence-2_6.lua" part="program"/>
<File sha1="acd2aacff9c45ab880e0d7b3d3309fbf12dd4ecb" name="Modules/CalcDefence-3_0.lua" part="program"/>
<File sha1="bdaa9a0244cec4d7b1ddeb016ec89db32e5ffb04" name="Modules/CalcOffence-2_6.lua" part="program"/>
<File sha1="df92843da3e7ebf7c9dfff8f85ad15512fecf7bd" name="Modules/CalcOffence-3_0.lua" part="program"/>
<File sha1="3e7811afe317e90a00a4c2a652c081131881703a" name="Modules/CalcPerform.lua" part="program"/>
<File sha1="783a485f6d5674f45b06cf003eee7405c84a751b" name="Modules/CalcPerform.lua" part="program"/>
<File sha1="db07750d45df48737f29fc7b0f90c61a95c18359" name="Modules/Calcs.lua" part="program"/>
<File sha1="e767209f276dab7c562bebd967bbc0f3c2ffc104" name="Modules/CalcSections-2_6.lua" part="program"/>
<File sha1="94dcc219aa0bc7764cc2d750113174ed08568819" name="Modules/CalcSections-3_0.lua" part="program"/>
<File sha1="7e0ac24ecd5ce1b4f73327bf193588f54b5ba1d4" name="Modules/CalcSetup.lua" part="program"/>
<File sha1="fb664a2a257ec307cabafe97ca98d95fb1bd63c4" name="Modules/CalcTools.lua" part="program"/>
<File sha1="e7cc0cab4e1e373f780bf9c26d5f7265bcd4ee8c" name="Modules/Common.lua" part="program"/>
<File sha1="54de4b28bbf5bcb0244a4c21b7d191ae5b1eb812" name="Modules/Data.lua" part="program"/>
<File sha1="14dd025972312387df9aaf2c80b22fd96a4a8939" name="Modules/ItemTools.lua" part="program"/>
<File sha1="081909fbc9a19fe359848277116c44fa5415c58e" name="Modules/Data.lua" part="program"/>
<File sha1="440f1615282a6270e89a3ef2b941994b758a6eac" name="Modules/ItemTools.lua" part="program"/>
<File sha1="7b7c9db9660a2d3c158114382a4d717b6a16bbe7" name="Modules/Main.lua" part="program"/>
<File sha1="7eda7b837135fcc68898332ea4414a4258e1bda4" name="Modules/ModParser-2_6.lua" part="program"/>
<File sha1="5c5d589dd59553fca51a240c1c41e7ae010e07da" name="Modules/ModParser-3_0.lua" part="program"/>
<File sha1="8f0799de4fb80b939927efdf99fc18e4f4bb48de" name="Modules/ModParser-2_6.lua" part="program"/>
<File sha1="6fc2e9d8c0841ce68dc6d3d254a7610301fbe330" name="Modules/ModParser-3_0.lua" part="program"/>
<File sha1="4e1067e5444062686cd06783034537e7ff4fbfe1" name="Modules/ModTools.lua" part="program"/>
<File sha1="c345cdcf374d271411aa424ab150c0edbb5a362d" name="Assets/game_ui_small.png" part="program"/>
<File sha1="97b020d8213e09c313536a91528ba5d5ebc4ca0a" name="Assets/patreon_logo.png" part="program"/>
@@ -79,7 +79,7 @@
<File sha1="a725cc402e3b8bbac143ca49695eeabbc1e2ae19" name="Data/Misc.lua" part="program"/>
<File sha1="f4d68a2c4e5ddedc8930baab8ab65201e997fefc" name="Data/New.lua" part="program"/>
<File sha1="99a868a0d4b20ebab0440c24ae60f3e8d4b45905" name="Data/Uniques/amulet.lua" part="program"/>
<File sha1="6713f4b7d5ff0881fca1b9762912928ebca3ec30" name="Data/Uniques/axe.lua" part="program"/>
<File sha1="f72ab0b613aa5286aa015bc2114552ad2a736e43" name="Data/Uniques/axe.lua" part="program"/>
<File sha1="d6ec42ab465b327e611b01c10139034928a5c1de" name="Data/Uniques/belt.lua" part="program"/>
<File sha1="28ad97db08e6b811562186692e2263e0904566c1" name="Data/Uniques/body.lua" part="program"/>
<File sha1="8fae06c1955f32ba2fd4b14b0591b781cab403fa" name="Data/Uniques/boots.lua" part="program"/>
@@ -98,9 +98,10 @@
<File sha1="af3b08c75f819a14b41d93826fa53f3fa04bca5b" name="Data/Uniques/sword.lua" part="program"/>
<File sha1="dbb5de009ec1e08dc50e2feefa4593962ff5f463" name="Data/Uniques/wand.lua" part="program"/>
<File sha1="4a2651bfcb3beb6fe8b9acab18a6792072f7e9b4" name="Data/2_6/EnchantmentBoots.lua" part="program"/>
<File sha1="cc36a59b04a69c76ef76f5b6bc6899fd0ee1666e" name="Data/2_6/EnchantmentGloves.lua" part="program"/>
<File sha1="b305198cafc6800aa5556da07a5eea699c718d3b" name="Data/2_6/EnchantmentHelmet.lua" part="program"/>
<File sha1="170d14d9176a1d7425d4bfa1b3bcc08c5f4fe73c" name="Data/2_6/Essence.lua" part="program"/>
<File sha1="6ecfff08cb71f674f6db4f34d2cbc398af7a767b" name="Data/2_6/Minions.lua" part="program"/>
<File sha1="09c1accc335b4f523e1367966f4c6984b8c8bd84" name="Data/2_6/Minions.lua" part="program"/>
<File sha1="a3273a42111d427166dbab2b54fbe4552ab41b36" name="Data/2_6/ModCorrupted.lua" part="program"/>
<File sha1="1cb3a531266b5c6994a2e82d39d5ac81c52d142d" name="Data/2_6/ModFlask.lua" part="program"/>
<File sha1="842827163ff536bca1eadc10f45d00069439da2d" name="Data/2_6/ModItem.lua" part="program"/>
@@ -130,6 +131,7 @@
<File sha1="ca5062f19c4cabe4dad6eb09ca3b49cca18b7e96" name="Data/2_6/Skills/act_dex.lua" part="program"/>
<File sha1="8a896b6627bc009b1a68f80777117a8287b5a295" name="Data/2_6/Skills/act_int.lua" part="program"/>
<File sha1="72a881445713534431475e529c6018ca863337ab" name="Data/2_6/Skills/act_str.lua" part="program"/>
<File sha1="6b68feb650596bdcc8f68a5679a7bdd5f946ce54" name="Data/2_6/Skills/glove.lua" part="program"/>
<File sha1="baad32910788078f40e7d32a36cdf2ea2762763f" name="Data/2_6/Skills/minion.lua" part="program"/>
<File sha1="76e85fd0461be6583e03f8c9e7ee8f4676740ef3" name="Data/2_6/Skills/other.lua" part="program"/>
<File sha1="31fd0bc92c961dfac0860cbb94d3630f6d9d6426" name="Data/2_6/Skills/spectre.lua" part="program"/>
@@ -137,9 +139,10 @@
<File sha1="55368373e42507db72c603c5039dbbcc68febd57" name="Data/2_6/Skills/sup_int.lua" part="program"/>
<File sha1="f087dc24aa2c67b6e81b18966a9f08f3da17b195" name="Data/2_6/Skills/sup_str.lua" part="program"/>
<File sha1="4a2651bfcb3beb6fe8b9acab18a6792072f7e9b4" name="Data/3_0/EnchantmentBoots.lua" part="program"/>
<File sha1="cc36a59b04a69c76ef76f5b6bc6899fd0ee1666e" name="Data/3_0/EnchantmentGloves.lua" part="program"/>
<File sha1="b305198cafc6800aa5556da07a5eea699c718d3b" name="Data/3_0/EnchantmentHelmet.lua" part="program"/>
<File sha1="170d14d9176a1d7425d4bfa1b3bcc08c5f4fe73c" name="Data/3_0/Essence.lua" part="program"/>
<File sha1="d58871b2b38d1070a1cdd4b054e2f74f479d7fdb" name="Data/3_0/Minions.lua" part="program"/>
<File sha1="08282ca34ded91e304e588234d8d589789469e57" name="Data/3_0/Minions.lua" part="program"/>
<File sha1="9ea85f15626f83fdbd122b57a5701dde87837a20" name="Data/3_0/ModCorrupted.lua" part="program"/>
<File sha1="01e35dba706dbdf12c6bc14770ae5046c8d8e520" name="Data/3_0/ModFlask.lua" part="program"/>
<File sha1="e2802c983e0298d6492511e3db29ac3723e20fe0" name="Data/3_0/ModItem.lua" part="program"/>
@@ -170,6 +173,7 @@
<File sha1="0f872ba12462b9e7c35c69f1a9040b6091da2fb4" name="Data/3_0/Skills/act_dex.lua" part="program"/>
<File sha1="d27856bf1aaa03d7a7a27efd95a83bdd5ac5b1b4" name="Data/3_0/Skills/act_int.lua" part="program"/>
<File sha1="d08655df40c924699c59a30f7004f06bf5fa9198" name="Data/3_0/Skills/act_str.lua" part="program"/>
<File sha1="6a846d1c75ab6b255b6bd96d2fb11b0b66bfb8cd" name="Data/3_0/Skills/glove.lua" part="program"/>
<File sha1="baad32910788078f40e7d32a36cdf2ea2762763f" name="Data/3_0/Skills/minion.lua" part="program"/>
<File sha1="2e6c822b3e8bc5dbcd00ec0c5e4a899cef989e45" name="Data/3_0/Skills/other.lua" part="program"/>
<File sha1="31fd0bc92c961dfac0860cbb94d3630f6d9d6426" name="Data/3_0/Skills/spectre.lua" part="program"/>