Merge remote-tracking branch 'origin/dev'

This commit is contained in:
Openarl
2017-07-18 00:24:54 +10:00
17 changed files with 186 additions and 69 deletions

View File

@@ -513,7 +513,7 @@ function PassiveTreeViewClass:Zoom(level, viewPort)
end
function PassiveTreeViewClass:DoesNodeMatchSearchStr(node)
if node.type == "mastery" then
if node.type == "classStart" or node.type == "mastery" then
return
end
@@ -540,6 +540,12 @@ function PassiveTreeViewClass:DoesNodeMatchSearchStr(node)
end
end
end
-- Check node type
local errMsg, match = PCall(string.match, node.type:lower(), self.searchStr:lower())
if match then
return true
end
end
function PassiveTreeViewClass:AddNodeName(tooltip, node)

View File

@@ -327,14 +327,15 @@ function SkillsTabClass:CreateGemSlot(index)
self.build.buildFlag = true
end)
slot.enabled.tooltipFunc = function(tooltip)
tooltip:Clear()
if self.displayGroup.gemList[index] then
local calcFunc, calcBase = self.build.calcsTab:GetMiscCalculator(self.build)
if calcFunc then
self.displayGroup.gemList[index].enabled = not self.displayGroup.gemList[index].enabled
local output = calcFunc()
self.displayGroup.gemList[index].enabled = not self.displayGroup.gemList[index].enabled
self.build:AddStatComparesToTooltip(tooltip, calcBase, output, self.displayGroup.gemList[index].enabled and "^7Disabling this gem will give you:" or "^7Enabling this gem will give you:")
if tooltip:CheckForUpdate(self.build.outputRevision) then
if self.displayGroup.gemList[index] then
local calcFunc, calcBase = self.build.calcsTab:GetMiscCalculator(self.build)
if calcFunc then
self.displayGroup.gemList[index].enabled = not self.displayGroup.gemList[index].enabled
local output = calcFunc()
self.displayGroup.gemList[index].enabled = not self.displayGroup.gemList[index].enabled
self.build:AddStatComparesToTooltip(tooltip, calcBase, output, self.displayGroup.gemList[index].enabled and "^7Disabling this gem will give you:" or "^7Enabling this gem will give you:")
end
end
end
end

1
Data/2_6/ModCache.lua Normal file

File diff suppressed because one or more lines are too long

1
Data/3_0/ModCache.lua Normal file

File diff suppressed because one or more lines are too long

View File

@@ -94,13 +94,13 @@ Has 1 Socket
{variant:1}+2 to Level of Socketed Golem Gems
{variant:2}+3 to Level of Socketed Golem Gems
{variant:1}Socketed Gems are Supported by level 15 Concentrated Effect
{variant:2}Socketed Golem Gems have 25% increased Buff Effect
{variant:2}25% increased Effect of Buffs granted by Socketed Golem Skills
{variant:2}Socketed Golem Skills gain 20% of Maximum Life as Extra Maximum Energy Shield
{variant:1}(10-25)% increased Spell Damage
{variant:2}(20-25)% increased Spell Damage
+(15-25) to maximum Energy Shield
+(20-40)% to Lightning Resistance
{variant:1}Socketed Gems are Supported by level 15 Increased Minion Life
{variant:2}Socketed Golem Gems have 20% of Golem Life added as Energy Shield
]],[[
Call of the Brotherhood
Two-Stone Ring
@@ -316,7 +316,7 @@ Has 1 Socket
{variant:1}+2 to Level of Socketed Golem Gems
{variant:2}+3 to Level of Socketed Golem Gems
{variant:1}Socketed Gems are Supported by level 13 Faster Attacks
{variant:2}Socketed Golem Gems have 20% increased Attack and Cast Speed
{variant:2}Socketed Golem Skills have 20% increased Attack and Cast Speed
Adds (5-10) to (11-15) Physical Damage to Attacks
(5-10)% increased Attack Speed
{variant:1}(1-2)% chance to Dodge Attacks
@@ -403,9 +403,9 @@ Has 1 Socket
{variant:1}Adds (8-12) to (20-30) Fire Damage to Attacks
(20-30)% increased Fire Damage
{variant:1}Socketed Gems are Supported by level 12 Lesser Multiple Projectiles
{variant:2}Socketed Golem Gems have a 25% chance to Taunt on Hit
{variant:2}Socketed Golem Skills have 25% chance to Taunt on Hit
{variant:1}Socketed Gems are Supported by level 17 Increased Minion Damage
{variant:2}Socketed Golem Gems have 5% of Life Regenerated per second
{variant:2}Socketed Golem Skills have 5% Life Regenerated per second
]],[[
Rigwald's Crest
Two-Stone Ring

View File

@@ -382,8 +382,10 @@ function calcs.buildActiveSkillModList(env, actor, activeSkill)
calcs.mergeGemMods(skillModList, activeGem)
-- Add extra modifiers
activeSkill.extraSkillModList = { }
for _, value in ipairs(env.modDB:Sum("LIST", activeSkill.skillCfg, "ExtraSkillMod")) do
skillModList:AddMod(value.mod)
t_insert(activeSkill.extraSkillModList, value.mod)
end
-- Extract skill data

View File

@@ -1400,7 +1400,7 @@ function calcs.offence(env, actor)
if output.ChaosPoisonChance > 0 and output.PoisonChaosMax > 0 then
-- Additional chance for chaos; adjust Physical damage and inflict chance
local chance = (pass == 1) and "PoisonChanceOnCrit" or "PoisonChanceOnHit"
local chaosChance = m_min(100, chance + output.ChaosPoisonChance)
local chaosChance = m_min(100, output[chance] + output.ChaosPoisonChance)
min = min * output[chance] / chaosChance
max = max * output[chance] / chaosChance
output[chance] = chaosChance

View File

@@ -331,6 +331,9 @@ function calcs.perform(env)
for _, mod in ipairs(env.minion.minionData.modList) do
env.minion.modDB:AddMod(mod)
end
for _, mod in ipairs(env.player.mainSkill.extraSkillModList) do
env.minion.modDB:AddMod(mod)
end
if env.aegisModList then
env.minion.itemList["Weapon 3"] = env.player.itemList["Weapon 2"]
env.minion.modDB:AddList(env.aegisModList)

View File

@@ -595,8 +595,10 @@ function calcs.initEnv(build, mode, override)
socketGroup.mainActiveSkillCalcs = m_min(#socketGroupSkillList, socketGroup.mainActiveSkillCalcs or 1)
activeSkillIndex = socketGroup.mainActiveSkillCalcs
else
socketGroup.mainActiveSkill = m_min(#socketGroupSkillList, socketGroup.mainActiveSkill or 1)
activeSkillIndex = socketGroup.mainActiveSkill
activeSkillIndex = m_min(#socketGroupSkillList, socketGroup.mainActiveSkill or 1)
if env.mode == "MAIN" then
socketGroup.mainActiveSkill = activeSkillIndex
end
end
env.player.mainSkill = socketGroupSkillList[activeSkillIndex]
end

View File

@@ -144,6 +144,50 @@ function isMouseInRegion(region)
return cursorX >= region.x and cursorX < region.x + region.width and cursorY >= region.y and cursorY < region.y + region.height
end
-- Write a Lua table to file
local function qFmt(s)
return '"'..s:gsub("\n","\\n"):gsub("\"","\\\"")..'"'
end
function writeLuaTable(out, t, indent)
out:write('{')
if indent then
out:write('\n')
end
for k, v in pairs(t) do
if indent then
out:write(string.rep("\t", indent))
end
if type(k) == "string" and k:match("^%a+$") then
out:write(k, '=')
else
out:write('[')
if type(k) == "number" then
out:write(k)
else
out:write(qFmt(k))
end
out:write(']=')
end
if type(v) == "table" then
writeLuaTable(out, v, indent and indent + 1)
elseif type(v) == "string" then
out:write(qFmt(v))
else
out:write(tostring(v))
end
if next(t, k) ~= nil then
out:write(',')
end
if indent then
out:write('\n')
end
end
if indent then
out:write(string.rep("\t", indent-1))
end
out:write('}')
end
-- Make a copy of a table and all subtables
do
local subTableMap = { }

View File

@@ -111,6 +111,15 @@ function main:Init()
self.defaultBuildPath = self.userPath.."Builds/"
self.buildPath = self.defaultBuildPath
MakeDir(self.buildPath)
if launch.devMode and IsKeyDown("CTRL") then
self.rebuildModCache = true
else
-- Load mod caches
for _, targetVersion in ipairs(targetVersionList) do
LoadModule("Data/"..targetVersion.."/ModCache", modLib.parseModCache[targetVersion])
end
end
self.tree = { }
for _, targetVersion in ipairs(targetVersionList) do
@@ -156,6 +165,30 @@ function main:Init()
end
end
if self.rebuildModCache then
-- Update mod caches
for _, targetVersion in ipairs(targetVersionList) do
local out = io.open("Data/"..targetVersion.."/ModCache.lua", "w")
out:write('local c=...')
for line, dat in pairs(modLib.parseModCache[targetVersion]) do
if not dat[1] or not dat[1][1] or dat[1][1].name ~= "JewelFunc" then
out:write('c["', line, '"]={')
if dat[1] then
writeLuaTable(out, dat[1])
else
out:write('nil')
end
if dat[2] then
out:write(',"', dat[2], '"}')
else
out:write(',nil}')
end
end
end
out:close()
end
end
self.sharedItemList = { }
self.sharedItemSetList = { }

View File

@@ -32,6 +32,7 @@ local formList = {
["penetrates (%d+)%% of"] = "PEN",
["penetrates (%d+)%% of enemy"] = "PEN",
["^([%d%.]+) (.+) regenerated per second"] = "REGENFLAT",
["^([%d%.]+)%% (.+) regenerated per second"] = "REGENPERCENT",
["^([%d%.]+)%% of (.+) regenerated per second"] = "REGENPERCENT",
["^regenerate ([%d%.]+) (.+) per second"] = "REGENFLAT",
["^regenerate ([%d%.]+)%% (.+) per second"] = "REGENPERCENT",
@@ -166,6 +167,7 @@ local modNameList = {
["buff effect"] = "BuffEffect",
["effect of buffs on you"] = "BuffEffectOnSelf",
["effect of buffs granted by your golems"] = { "BuffEffect", tag = { type = "SkillType", skillType = SkillType.Golem } },
["effect of buffs granted by socketed golem skills"] = { "BuffEffect", addToSkill = { type = "SocketedIn", keyword = "golem" } },
["effect of the buff granted by your stone golems"] = { "BuffEffect", tag = { type = "SkillName", skillName = "Summon Stone Golem" } },
["effect of the buff granted by your lightning golems"] = { "BuffEffect", tag = { type = "SkillName", skillName = "Summon Lightning Golem" } },
["effect of the buff granted by your ice golems"] = { "BuffEffect", tag = { type = "SkillName", skillName = "Summon Ice Golem" } },
@@ -382,6 +384,7 @@ local modFlagList = {
["zombie"] = { addToMinion = true, addToMinionTag = { type = "SkillName", skillName = "Raise Zombie" } },
["raised zombie"] = { addToMinion = true, addToMinionTag = { type = "SkillName", skillName = "Raise Zombie" } },
["raised spectre"] = { addToMinion = true, addToMinionTag = { type = "SkillName", skillName = "Raise Spectre" } },
["golem"] = { },
["chaos golem"] = { addToMinion = true, addToMinionTag = { type = "SkillName", skillName = "Summon Chaos Golem" } },
["flame golem"] = { addToMinion = true, addToMinionTag = { type = "SkillName", skillName = "Summon Flame Golem" } },
["increased flame golem"] = { addToMinion = true, addToMinionTag = { type = "SkillName", skillName = "Summon Flame Golem" } },
@@ -426,11 +429,11 @@ local preFlagList = {
["^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" } },
["^socketed gems deal "] = { tag = { type = "SocketedIn" } },
["^socketed curse gems have "] = { tag = { type = "SocketedIn", keyword = "curse" } },
["^socketed melee gems have "] = { tag = { type = "SocketedIn", keyword = "melee" } },
["^socketed golem gems have "] = { tag = { type = "SocketedIn", keyword = "golem" } },
["^socketed gems [hgd][ae][via][enl] "] = { addToSkill = { type = "SocketedIn" } },
["^socketed curse gems [hgd][ae][via][enl] "] = { addToSkill = { type = "SocketedIn", keyword = "curse" } },
["^socketed melee gems [hgd][ae][via][enl] "] = { addToSkill = { type = "SocketedIn", keyword = "melee" } },
["^socketed golem gems [hgd][ae][via][enl] "] = { addToSkill = { type = "SocketedIn", keyword = "golem" } },
["^socketed golem skills [hgd][ae][via][enl] "] = { addToSkill = { type = "SocketedIn", keyword = "golem" } },
["^your flasks grant "] = { },
["^when hit, "] = { },
["^you and allies [hgd][ae][via][enl] "] = { },
@@ -687,10 +690,10 @@ local specialModList = {
} end,
["grants armour equal to (%d+)%% of your reserved life to you and nearby allies"] = function(num) return { mod("GrantReservedLifeAsAura", "LIST", { mod = mod("Armour", "BASE", num / 100) }) } end,
["grants maximum energy shield equal to (%d+)%% of your reserved mana to you and nearby allies"] = function(num) return { mod("GrantReservedManaAsAura", "LIST", { mod = mod("EnergyShield", "BASE", num / 100) }) } end,
["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,
["skills from your helmet penetrate (%d+)%% elemental resistances"] = function(num) return { mod("ExtraSkillMod", "LIST", { mod = mod("ElementalPenetration", "BASE", num) }, { type = "SocketedIn", slotName = "Helmet" }) } end,
["skills from your gloves have (%d+)%% increased area of effect"] = function(num) return { mod("ExtraSkillMod", "LIST", { mod = mod("AreaOfEffect", "INC", num) }, { type = "SocketedIn", slotName = "Gloves" }) } end,
["skills from your boots leech (%d+)%% of damage as life"] = function(num) return { mod("ExtraSkillMod", "LIST", { mod = 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("ExtraSkillMod", "LIST", { mod = 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,
@@ -745,13 +748,13 @@ local specialModList = {
["%+(%d+) to level of socketed (%a+) gems"] = function(num, _, type) return { mod("GemProperty", "LIST", { keyword = type, key = "level", value = num }, { type = "SocketedIn" }) } end,
["%+(%d+)%% to quality of socketed (%a+) gems"] = function(num, _, type) return { mod("GemProperty", "LIST", { keyword = type, key = "quality", value = num }, { type = "SocketedIn" }) } end,
["%+(%d+) to level of active socketed skill gems"] = function(num) return { mod("GemProperty", "LIST", { keyword = "active_skill", key = "level", value = num }, { type = "SocketedIn" }) } end,
["socketed gems fire an additional projectile"] = { mod("ProjectileCount", "BASE", 1, { type = "SocketedIn" }) },
["socketed gems fire (%d+) additional projectiles"] = function(num) return { mod("ProjectileCount", "BASE", num, { type = "SocketedIn" }) } end,
["socketed gems fire an additional projectile"] = { mod("ExtraSkillMod", "LIST", { mod = mod("ProjectileCount", "BASE", 1) }, { type = "SocketedIn" }) },
["socketed gems fire (%d+) additional projectiles"] = function(num) return { mod("ExtraSkillMod", "LIST", { mod = mod("ProjectileCount", "BASE", num) }, { type = "SocketedIn" }) } end,
["socketed gems reserve no mana"] = { mod("ManaReserved", "MORE", -100, { type = "SocketedIn" }) },
["socketed skill gems get a (%d+)%% mana multiplier"] = function(num) return { mod("ExtraSkillMod", "LIST", { mod = mod("ManaCost", "MORE", num - 100) }, { type = "SocketedIn" }) } end,
["socketed gems have blood magic"] = { flag("SkillBloodMagic", { type = "SocketedIn" }) },
["socketed gems gain (%d+)%% of physical damage as extra lightning damage"] = function(num) return { mod("PhysicalDamageGainAsLightning", "BASE", num, { type = "SocketedIn" }) } end,
["socketed red gems get (%d+)%% physical damage as extra fire damage"] = function(num) return { mod("PhysicalDamageGainAsFire", "BASE", num, { type = "SocketedIn", keyword = "strength" }) } end,
["socketed gems gain (%d+)%% of physical damage as extra lightning damage"] = function(num) return { mod("ExtraSkillMod", "LIST", { mod = mod("PhysicalDamageGainAsLightning", "BASE", num) }, { type = "SocketedIn" }) } end,
["socketed red gems get (%d+)%% physical damage as extra fire damage"] = function(num) return { mod("ExtraSkillMod", "LIST", { mod = mod("PhysicalDamageGainAsFire", "BASE", num) }, { type = "SocketedIn", keyword = "strength" }) } end,
-- Extra skill/support
["grants level (%d+) (.+)"] = function(num, _, skill) return extraSkill(skill, num) end,
["casts level (%d+) (.+) when equipped"] = function(num, _, skill) return extraSkill(skill, num) end,
@@ -1010,6 +1013,7 @@ local suffixTypes = {
["converted to cold damage"] = "ConvertToCold",
["converted to fire damage"] = "ConvertToFire",
["converted to chaos damage"] = "ConvertToChaos",
["added as energy shield"] = "GainAsEnergyShield",
["as extra maximum energy shield"] = "GainAsEnergyShield",
["converted to energy shield"] = "ConvertToEnergyShield",
["as physical damage"] = "AsPhysical",
@@ -1240,8 +1244,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
@@ -1287,10 +1291,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
@@ -1354,7 +1357,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)
@@ -1409,7 +1412,7 @@ local function parseMod(line, order)
modList[i] = mod("MinionModifier", "LIST", { mod = effectMod }, misc.addToMinionTag)
end
elseif misc.addToSkill then
-- Skill enchants that add additional effects
-- Skill enchants or socketed gem modifiers that add additional effects
for i, effectMod in ipairs(modList) do
modList[i] = mod("ExtraSkillMod", "LIST", { mod = effectMod }, misc.addToSkill)
end
@@ -1438,4 +1441,4 @@ return function(line)
end]]
end
return unpack(copyTable(cache[line]))
end
end, cache

View File

@@ -32,6 +32,7 @@ local formList = {
["penetrates (%d+)%% of"] = "PEN",
["penetrates (%d+)%% of enemy"] = "PEN",
["^([%d%.]+) (.+) regenerated per second"] = "REGENFLAT",
["^([%d%.]+)%% (.+) regenerated per second"] = "REGENPERCENT",
["^([%d%.]+)%% of (.+) regenerated per second"] = "REGENPERCENT",
["^regenerate ([%d%.]+) (.+) per second"] = "REGENFLAT",
["^regenerate ([%d%.]+)%% (.+) per second"] = "REGENPERCENT",
@@ -167,6 +168,7 @@ local modNameList = {
["buff effect"] = "BuffEffect",
["effect of buffs on you"] = "BuffEffectOnSelf",
["effect of buffs granted by your golems"] = { "BuffEffect", tag = { type = "SkillType", skillType = SkillType.Golem } },
["effect of buffs granted by socketed golem skills"] = { "BuffEffect", addToSkill = { type = "SocketedIn", keyword = "golem" } },
["effect of the buff granted by your stone golems"] = { "BuffEffect", tag = { type = "SkillName", skillName = "Summon Stone Golem" } },
["effect of the buff granted by your lightning golems"] = { "BuffEffect", tag = { type = "SkillName", skillName = "Summon Lightning Golem" } },
["effect of the buff granted by your ice golems"] = { "BuffEffect", tag = { type = "SkillName", skillName = "Summon Ice Golem" } },
@@ -386,6 +388,7 @@ local modFlagList = {
["zombie"] = { addToMinion = true, addToMinionTag = { type = "SkillName", skillName = "Raise Zombie" } },
["raised zombie"] = { addToMinion = true, addToMinionTag = { type = "SkillName", skillName = "Raise Zombie" } },
["raised spectre"] = { addToMinion = true, addToMinionTag = { type = "SkillName", skillName = "Raise Spectre" } },
["golem"] = { },
["chaos golem"] = { addToMinion = true, addToMinionTag = { type = "SkillName", skillName = "Summon Chaos Golem" } },
["flame golem"] = { addToMinion = true, addToMinionTag = { type = "SkillName", skillName = "Summon Flame Golem" } },
["increased flame golem"] = { addToMinion = true, addToMinionTag = { type = "SkillName", skillName = "Summon Flame Golem" } },
@@ -430,11 +433,11 @@ local preFlagList = {
["^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" } },
["^socketed gems deal "] = { tag = { type = "SocketedIn" } },
["^socketed curse gems have "] = { tag = { type = "SocketedIn", keyword = "curse" } },
["^socketed melee gems have "] = { tag = { type = "SocketedIn", keyword = "melee" } },
["^socketed golem gems have "] = { tag = { type = "SocketedIn", keyword = "golem" } },
["^socketed gems [hgd][ae][via][enl] "] = { addToSkill = { type = "SocketedIn" } },
["^socketed curse gems [hgd][ae][via][enl] "] = { addToSkill = { type = "SocketedIn", keyword = "curse" } },
["^socketed melee gems [hgd][ae][via][enl] "] = { addToSkill = { type = "SocketedIn", keyword = "melee" } },
["^socketed golem gems [hgd][ae][via][enl] "] = { addToSkill = { type = "SocketedIn", keyword = "golem" } },
["^socketed golem skills [hgd][ae][via][enl] "] = { addToSkill = { type = "SocketedIn", keyword = "golem" } },
["^your flasks grant "] = { },
["^when hit, "] = { },
["^you and allies [hgd][ae][via][enl] "] = { },
@@ -695,10 +698,10 @@ local specialModList = {
} end,
["grants armour equal to (%d+)%% of your reserved life to you and nearby allies"] = function(num) return { mod("GrantReservedLifeAsAura", "LIST", { mod = mod("Armour", "BASE", num / 100) }) } end,
["grants maximum energy shield equal to (%d+)%% of your reserved mana to you and nearby allies"] = function(num) return { mod("GrantReservedManaAsAura", "LIST", { mod = mod("EnergyShield", "BASE", num / 100) }) } end,
["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,
["skills from your helmet penetrate (%d+)%% elemental resistances"] = function(num) return { mod("ExtraSkillMod", "LIST", { mod = mod("ElementalPenetration", "BASE", num) }, { type = "SocketedIn", slotName = "Helmet" }) } end,
["skills from your gloves have (%d+)%% increased area of effect"] = function(num) return { mod("ExtraSkillMod", "LIST", { mod = mod("AreaOfEffect", "INC", num) }, { type = "SocketedIn", slotName = "Gloves" }) } end,
["skills from your boots leech (%d+)%% of damage as life"] = function(num) return { mod("ExtraSkillMod", "LIST", { mod = 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("ExtraSkillMod", "LIST", { mod = 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,
@@ -754,13 +757,13 @@ local specialModList = {
["%+(%d+) to level of socketed (%a+) gems"] = function(num, _, type) return { mod("GemProperty", "LIST", { keyword = type, key = "level", value = num }, { type = "SocketedIn" }) } end,
["%+(%d+)%% to quality of socketed (%a+) gems"] = function(num, _, type) return { mod("GemProperty", "LIST", { keyword = type, key = "quality", value = num }, { type = "SocketedIn" }) } end,
["%+(%d+) to level of active socketed skill gems"] = function(num) return { mod("GemProperty", "LIST", { keyword = "active_skill", key = "level", value = num }, { type = "SocketedIn" }) } end,
["socketed gems fire an additional projectile"] = { mod("ProjectileCount", "BASE", 1, { type = "SocketedIn" }) },
["socketed gems fire (%d+) additional projectiles"] = function(num) return { mod("ProjectileCount", "BASE", num, { type = "SocketedIn" }) } end,
["socketed gems fire an additional projectile"] = { mod("ExtraSkillMod", "LIST", { mod = mod("ProjectileCount", "BASE", 1) }, { type = "SocketedIn" }) },
["socketed gems fire (%d+) additional projectiles"] = function(num) return { mod("ExtraSkillMod", "LIST", { mod = mod("ProjectileCount", "BASE", num) }, { type = "SocketedIn" }) } end,
["socketed gems reserve no mana"] = { mod("ManaReserved", "MORE", -100, { type = "SocketedIn" }) },
["socketed skill gems get a (%d+)%% mana multiplier"] = function(num) return { mod("ExtraSkillMod", "LIST", { mod = mod("ManaCost", "MORE", num - 100) }, { type = "SocketedIn" }) } end,
["socketed gems have blood magic"] = { flag("SkillBloodMagic", { type = "SocketedIn" }) },
["socketed gems gain (%d+)%% of physical damage as extra lightning damage"] = function(num) return { mod("PhysicalDamageGainAsLightning", "BASE", num, { type = "SocketedIn" }) } end,
["socketed red gems get (%d+)%% physical damage as extra fire damage"] = function(num) return { mod("PhysicalDamageGainAsFire", "BASE", num, { type = "SocketedIn", keyword = "strength" }) } end,
["socketed gems gain (%d+)%% of physical damage as extra lightning damage"] = function(num) return { mod("ExtraSkillMod", "LIST", { mod = mod("PhysicalDamageGainAsLightning", "BASE", num) }, { type = "SocketedIn" }) } end,
["socketed red gems get (%d+)%% physical damage as extra fire damage"] = function(num) return { mod("ExtraSkillMod", "LIST", { mod = mod("PhysicalDamageGainAsFire", "BASE", num) }, { type = "SocketedIn", keyword = "strength" }) } end,
-- Extra skill/support
["grants level (%d+) (.+)"] = function(num, _, skill) return extraSkill(skill, num) end,
["casts level (%d+) (.+) when equipped"] = function(num, _, skill) return extraSkill(skill, num) end,
@@ -1030,6 +1033,7 @@ local suffixTypes = {
["converted to cold damage"] = "ConvertToCold",
["converted to fire damage"] = "ConvertToFire",
["converted to chaos damage"] = "ConvertToChaos",
["added as energy shield"] = "GainAsEnergyShield",
["as extra maximum energy shield"] = "GainAsEnergyShield",
["converted to energy shield"] = "ConvertToEnergyShield",
["as physical damage"] = "AsPhysical",
@@ -1430,7 +1434,7 @@ local function parseMod(line, order)
modList[i] = mod("MinionModifier", "LIST", { mod = effectMod }, misc.addToMinionTag)
end
elseif misc.addToSkill then
-- Skill enchants that add additional effects
-- Skill enchants or socketed gem modifiers that add additional effects
for i, effectMod in ipairs(modList) do
modList[i] = mod("ExtraSkillMod", "LIST", { mod = effectMod }, misc.addToSkill)
end
@@ -1463,4 +1467,4 @@ return function(line, isComb)
end
end
return unpack(copyTable(cache[line]))
end
end, cache

View File

@@ -3,6 +3,7 @@
-- Module: Mod Tools
-- Various functions for dealing with modifiers
--
local launch = ...
local pairs = pairs
local t_insert = table.insert
@@ -42,8 +43,9 @@ function modLib.createMod(modName, modType, modVal, ...)
end
modLib.parseMod = { }
modLib.parseModCache = { }
for _, targetVersion in pairs(targetVersionList) do
modLib.parseMod[targetVersion] = LoadModule("Modules/ModParser-"..targetVersion)
modLib.parseMod[targetVersion], modLib.parseModCache[targetVersion] = LoadModule("Modules/ModParser-"..targetVersion, launch)
end
function modLib.formatFlags(flags, src)

View File

@@ -53,6 +53,13 @@ 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.46 - 2017/04/18
* The passive tree search field can now also match node type (keystone/notable/normal)
* Modifiers that apply to gems socketed in items can now apply to minions summoned by those gems
* Improved the program's startup time
For 3.0 builds:
* Fixed error when using The Consuming Dark
### 1.4.45 - 2017/04/17
* Fixed issue causing tooltips in the Shared Items list to display modifier ranges instead of specific values
* Fixed the node location display in the Items tab covering jewel tooltips

View File

@@ -1,3 +1,9 @@
VERSION[1.4.46][2017/04/18]
* The passive tree search field can now also match node type (keystone/notable/normal)
* Modifiers that apply to gems socketed in items can now apply to minions summoned by those gems
* Improved the program's startup time
For 3.0 builds:
* Fixed error when using The Consuming Dark
VERSION[1.4.45][2017/04/17]
* Fixed issue causing tooltips in the Shared Items list to display modifier ranges instead of specific values
* Fixed the node location display in the Items tab covering jewel tooltips

View File

@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<PoBVersion>
<Version number="1.4.45"/>
<Version number="1.4.46"/>
<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="d678fe3c8097828ee4f1513a792c1b3a9780f536" name="Launch.lua" part="program"/>
<File sha1="72b9bea1871e94a643e4471fd84bbedbc7810336" name="UpdateCheck.lua" part="program"/>
<File sha1="4f17937f2b37784e169a3792b235f2a0a3961e61" name="UpdateApply.lua" part="program"/>
<File sha1="459ab6b0067cc9addf1bacedcb0810bb0d000bad" name="changelog.txt" part="program"/>
<File sha1="5386eaba71b158c1881be59c79ff44fc3de0bbed" name="changelog.txt" part="program"/>
<File sha1="3558da442f2fc18c3e1ea751b301be863dee56e8" name="Classes/BuildListControl.lua" part="program"/>
<File sha1="0e4b2d4a291f26213d81761e3ac0f7525e31f950" name="Classes/ButtonControl.lua" part="program"/>
<File sha1="b2eb6794c0a54a295ed9652afaee2c65fbe4e742" name="Classes/CalcBreakdownControl.lua" part="program"/>
@@ -36,7 +36,7 @@
<File sha1="ca94b201ae873829e7be39075150ee6bc79be0c3" name="Classes/PassiveSpec.lua" part="program"/>
<File sha1="1080dfd1b2ff05b367e7da76e4223d13746ed5e6" name="Classes/PassiveSpecListControl.lua" part="program"/>
<File sha1="7716fe69aa6d142fa02aed47d63f9c956e6f93ce" name="Classes/PassiveTree.lua" part="program"/>
<File sha1="d1eac652f15101dd4fbd9a6200c7a35d8647c5f3" name="Classes/PassiveTreeView.lua" part="program"/>
<File sha1="9e362f147fc0e5cef11d172b04242fc632fe0487" name="Classes/PassiveTreeView.lua" part="program"/>
<File sha1="2f369b35d2319ea8ae1c7ba3b59c012553936a4f" name="Classes/PathControl.lua" part="program"/>
<File sha1="9d91ef81ac4fd8d5a1e16be17bdf199545209d87" name="Classes/PopupDialog.lua" part="program"/>
<File sha1="40aca5f791124ed944cded4e45fb90001c657ca6" name="Classes/ScrollBarControl.lua" part="program"/>
@@ -44,7 +44,7 @@
<File sha1="0d7d2eaf3efb1ec40eada321331fbc248a68d8be" name="Classes/SharedItemListControl.lua" part="program"/>
<File sha1="b3bf0b096a9348900c926aef1b7a822a40df0480" name="Classes/SharedItemSetListControl.lua" part="program"/>
<File sha1="6e7435c7d65c4b7994b491af27579c5ba2ec47e1" name="Classes/SkillListControl.lua" part="program"/>
<File sha1="28c156e087e2dde94de7c3f14b70f7809caf1703" name="Classes/SkillsTab.lua" part="program"/>
<File sha1="f3550bfd017924bcd75bd443ab2c2d95ba952b9a" name="Classes/SkillsTab.lua" part="program"/>
<File sha1="a28a04692f0b244ac648620618a1c43ed13d946a" name="Classes/SliderControl.lua" part="program"/>
<File sha1="eeff0df56df68c5942ba632d2862bc38cff346a9" name="Classes/TextListControl.lua" part="program"/>
<File sha1="2b16b2485f25462f129c575d9c8574cd2308938a" name="Classes/Tooltip.lua" part="program"/>
@@ -53,25 +53,25 @@
<File sha1="4b7675c8b4fe71cade7dd3d70793df1ed8022d01" name="Classes/UndoHandler.lua" part="program"/>
<File sha1="e5863dd79238ffd0a4c2f12b3b15c252933da453" name="Modules/Build.lua" part="program"/>
<File sha1="44fab56072de8e555ff7e20ee32628230511d1d6" name="Modules/BuildList.lua" part="program"/>
<File sha1="4967d7e8aa9adc3c1917cf46dcbce05667ecb5af" name="Modules/CalcActiveSkill.lua" part="program"/>
<File sha1="d56a4bb075bdfed509252ae9f360320f71919494" 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="69cae921c21f45c18b3875a76b35f33958490b7e" name="Modules/CalcOffence-2_6.lua" part="program"/>
<File sha1="e67ffbe1a61f8e22c78d8b36825a34130d849e70" name="Modules/CalcOffence-3_0.lua" part="program"/>
<File sha1="e3ccc7447e549bafb911eec0cf713736c45965ab" name="Modules/CalcPerform.lua" part="program"/>
<File sha1="c5e3b8119036d679adccc3e7ce2608ed5156f4f2" name="Modules/CalcOffence-3_0.lua" part="program"/>
<File sha1="4bef807b99bace9fa535f01cb5fd8027b765f728" name="Modules/CalcPerform.lua" part="program"/>
<File sha1="db07750d45df48737f29fc7b0f90c61a95c18359" name="Modules/Calcs.lua" part="program"/>
<File sha1="1171d2e39c3027e9aeb88935c1973930eec229cf" name="Modules/CalcSections-2_6.lua" part="program"/>
<File sha1="a9ec3ad4c1f4bdf2f2d337f6551ecc39e1fc71a9" name="Modules/CalcSections-3_0.lua" part="program"/>
<File sha1="10f994f575f7f835a0a9a0044317b044af86ceca" name="Modules/CalcSetup.lua" part="program"/>
<File sha1="50460a77f1c036acd3c85201e55b5ac0f0ed4091" 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="e0b177c6205ceedd50ebcb5b1ccc549d6fe29150" name="Modules/Common.lua" part="program"/>
<File sha1="081909fbc9a19fe359848277116c44fa5415c58e" name="Modules/Data.lua" part="program"/>
<File sha1="afc69f0c78a39a448e47432c429c8a9395758d0a" name="Modules/ItemTools.lua" part="program"/>
<File sha1="149bdb985e7cf2a6859248aa8350c701418f03e8" name="Modules/Main.lua" part="program"/>
<File sha1="da775ad2244dbd757cff100fd6904c8ad4c29a86" name="Modules/ModParser-2_6.lua" part="program"/>
<File sha1="28f434d2aec869bb9c4e70944bcd905596070397" name="Modules/ModParser-3_0.lua" part="program"/>
<File sha1="4e1067e5444062686cd06783034537e7ff4fbfe1" name="Modules/ModTools.lua" part="program"/>
<File sha1="04443dfdc31048451224f8adc92b4318fa9309b8" name="Modules/Main.lua" part="program"/>
<File sha1="30c8f0aa6ce613e5dcc348704703eb6e079970c4" name="Modules/ModParser-2_6.lua" part="program"/>
<File sha1="333b3b068835606afadf74d8d985a65aed5cc962" name="Modules/ModParser-3_0.lua" part="program"/>
<File sha1="84906d6bcb280c882eb4dfafb4ec520c61027d04" 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"/>
<File sha1="4ebea5031fd03771a9b637a3fdccf394344e4782" name="Assets/range_guide.png" part="program"/>
@@ -94,7 +94,7 @@
<File sha1="24b171f438c83560f2ecc151a4de72f50f6085d4" name="Data/Uniques/jewel.lua" part="program"/>
<File sha1="97fdb8e588bbdef804d74c3f2db1d5e5e7170ae8" name="Data/Uniques/mace.lua" part="program"/>
<File sha1="a126e38939d92d737b63859fe52170d836013104" name="Data/Uniques/quiver.lua" part="program"/>
<File sha1="264f9286944de6ac7c9099b3f048bedf656d2993" name="Data/Uniques/ring.lua" part="program"/>
<File sha1="7c1ec650759d2c91aee7797c131ad09e084cb727" name="Data/Uniques/ring.lua" part="program"/>
<File sha1="441ac2409a6abe91efc9f4724b18cd2cb227dfa3" name="Data/Uniques/shield.lua" part="program"/>
<File sha1="b7aa5bd684ef32cb30c3378a9ffe7a752a6767c5" name="Data/Uniques/staff.lua" part="program"/>
<File sha1="8d8858d83a338e703152a2ac79f0f0b8c417feda" name="Data/Uniques/sword.lua" part="program"/>
@@ -104,6 +104,7 @@
<File sha1="b305198cafc6800aa5556da07a5eea699c718d3b" name="Data/2_6/EnchantmentHelmet.lua" part="program"/>
<File sha1="170d14d9176a1d7425d4bfa1b3bcc08c5f4fe73c" name="Data/2_6/Essence.lua" part="program"/>
<File sha1="2611aa555e5793e7c1de36c7bc0e7a3fe17f6e5e" name="Data/2_6/Minions.lua" part="program"/>
<File sha1="97af805d1cf426c1eb4ca3af1be842fb8fdafd61" name="Data/2_6/ModCache.lua" part="program"/>
<File sha1="3a83e6bf5e9648edd6a01e57525a771d501d1a37" name="Data/2_6/ModCorrupted.lua" part="program"/>
<File sha1="d96fc1e31349cb8aba1336c1f356b69ff436269b" name="Data/2_6/ModFlask.lua" part="program"/>
<File sha1="c7d3bda476aa6c11a3ea45d93b077b82d61c5dd4" name="Data/2_6/ModItem.lua" part="program"/>
@@ -145,6 +146,7 @@
<File sha1="ca3017638e691f9832adb88cba78e48730204a8a" name="Data/3_0/EnchantmentHelmet.lua" part="program"/>
<File sha1="05bf7be7aa8219e16fba64aca2cdb7bd262c4339" name="Data/3_0/Essence.lua" part="program"/>
<File sha1="f761b485bb9c46c9d76514cae3a66823184b98c2" name="Data/3_0/Minions.lua" part="program"/>
<File sha1="b7095b4a91b0dd3c5ed898b477d5dd0229d38bcc" name="Data/3_0/ModCache.lua" part="program"/>
<File sha1="a594cca6f7ec0c86bce89ee79740ade372ef3d7b" name="Data/3_0/ModCorrupted.lua" part="program"/>
<File sha1="061514fc3ca4b3b2fb6f962659de0bc6284b7f90" name="Data/3_0/ModFlask.lua" part="program"/>
<File sha1="eee385544a178a48834b508542136b0f2ab885a0" name="Data/3_0/ModItem.lua" part="program"/>