Merge remote-tracking branch 'origin/dev'

This commit is contained in:
Openarl
2017-03-28 01:29:45 +10:00
15 changed files with 123 additions and 92 deletions

View File

@@ -37,6 +37,9 @@ local varList = {
{ var = "buffFortify", type = "check", label = "Do you have Fortify?", ifCond = "Fortify", apply = function(val, modList, enemyModList)
modList:NewMod("Misc", "LIST", { type = "Condition", var = "Fortify" }, "Config", { type = "Condition", var = "Combat" })
end },
{ var = "conditionLeeching", type = "check", label = "Are you Leeching?", ifCond = "Leeching", apply = function(val, modList, enemyModList)
modList:NewMod("Misc", "LIST", { type = "Condition", var = "Leeching" }, "Config", { type = "Condition", var = "Combat" })
end },
{ var = "conditionUsingFlask", type = "check", label = "Do you have a Flask active?", ifCond = "UsingFlask", tooltip = "This is automatically enabled if you have a flask active,\nbut you can use this option to force it if necessary.", apply = function(val, modList, enemyModList)
modList:NewMod("Misc", "LIST", { type = "Condition", var = "UsingFlask" }, "Config", { type = "Condition", var = "Combat" })
end },

View File

@@ -592,7 +592,7 @@ function ImportTabClass:ImportSocketedSkills(item, socketedItems, slotName)
-- Check if this socket group matches an existing one
local repGroup
for index, socketGroup in pairs(self.build.skillsTab.socketGroupList) do
if #socketGroup.gemList == #itemSocketGroup.gemList then
if #socketGroup.gemList == #itemSocketGroup.gemList and (not socketGroup.slot or socketGroup.slot == slotName) then
local match = true
for gemIndex, gem in pairs(socketGroup.gemList) do
if gem.nameSpec:lower() ~= itemSocketGroup.gemList[gemIndex].nameSpec:lower() then

View File

@@ -84,7 +84,7 @@ function ItemSlotClass:Draw(viewPort)
self:DrawControls(viewPort)
local highlight = false
for _, control in pairs({self.itemsTab.controls.itemList, self.itemsTab.controls.uniqueDB, self.itemsTab.controls.rareDB}) do
if control:IsShown() and control.selDragging and control.selDragActive and self.itemsTab:IsItemValidForSlot(control.selItem, self.slotName) then
if control:IsShown() and control.selDragging and control.selDragActive and control.selItem and self.itemsTab:IsItemValidForSlot(control.selItem, self.slotName) then
highlight = true
SetDrawColor(0, 1, 0, 0.25)
DrawImage(nil, x, y, width, height)

View File

@@ -1512,6 +1512,7 @@ gems["Explosive Arrow"] = {
--"active_skill_attack_damage_+%_final" = 0
--"skill_can_fire_arrows" = 1
--"base_is_projectile" = 1
skill("showAverage", true, { type = "SkillPart", skillPart = 1 }),
},
qualityMods = {
mod("EnemyIgniteChance", "BASE", 1), --"base_chance_to_ignite_%" = 1

View File

@@ -1183,6 +1183,7 @@ gems["Essence Drain"] = {
skill("dotIsSpell", true), --"spell_damage_modifiers_apply_to_damage_over_time" = ?
--"base_is_projectile" = ?
skill("debuff", true),
skill("showAverage", true),
},
qualityMods = {
mod("ChaosDamage", "INC", 1), --"chaos_damage_+%" = 1

View File

@@ -263,7 +263,8 @@ Implicits: 2
Adds (32-40) to (48-60) Cold Damage
Adds 1 to (80-100) Lightning Damage
(10-15)% increased Attack Speed
(60-80)% increased Critical Strike Chance
{variant:1}(80-100)% increased Critical Strike Chance
{variant:2,3}(60-80)% increased Critical Strike Chance
{variant:1}25% increased Quantity of Items Dropped by Slain Frozen enemies
{variant:2,3}15% increased Quantity of Items Dropped by Slain Frozen Enemies
{variant:1}50% increased Rarity of Items Dropped by Slain Shocked enemies

View File

@@ -436,7 +436,7 @@ Crimson Jewel
Limited to: 2
Radius: Medium
(4-12)% increased Physical Damage
With at least 40 Strength in Radius, Heavy Strike has a 10% chance to deal Double Damage.
With at least 40 Strength in Radius, Heavy Strike has a 20% chance to deal Double Damage.
]],[[
Winter's Bounty
Cobalt Jewel

View File

@@ -408,13 +408,17 @@ Gain (5-10)% of Physical Damage as Extra Chaos Damage
]],[[
The Oak
Plank Kite Shield
Variant: Pre 2.6.0
Variant: Current
Requires Level 40
+4% to all Elemental Resistances
(80-120)% increased Armour and Energy Shield
+(100-150) to maximum Life
50% reduced Freeze Duration on You
1% of Life Regenerated per Second
5% of Life Regenerated per Second while on Low Life
{variant:1}1% of Life Regenerated per Second
{variant:2}3% of Life Regenerated per Second
{variant:1}5% of Life Regenerated per Second while on Low Life
{variant:2}3% of Life Regenerated per Second while on Low Life
]],[[
Prism Guardian
Archon Kite Shield

View File

@@ -241,7 +241,8 @@ function buildMode:Init(dbFileName, buildName)
{ stat = "Speed", label = "Attack Rate", fmt = ".2f", compPercent = true, flag = "attack" },
{ stat = "Speed", label = "Cast Rate", fmt = ".2f", compPercent = true, flag = "spell" },
{ stat = "HitSpeed", label = "Hit Rate", fmt = ".2f" },
{ stat = "CritChance", label = "Crit Chance", fmt = ".2f%%" },
{ stat = "PreEffectiveCritChance", label = "Crit Chance", fmt = ".2f%%" },
{ stat = "CritChance", label = "Effective Crit Chance", fmt = ".2f%%", condFunc = function(v,o) return v ~= o.PreEffectiveCritChance end },
{ stat = "CritMultiplier", label = "Crit Multiplier", fmt = "d%%", pc = true, condFunc = function(v,o) return o.CritChance > 0 end },
{ stat = "HitChance", label = "Hit Chance", fmt = ".0f%%", flag = "attack" },
{ stat = "TotalDPS", label = "Total DPS", fmt = ".1f", compPercent = true, flag = "notAverage" },

View File

@@ -1353,28 +1353,6 @@ local function performCalcs(env)
end
end
-- Process misc modifiers
for _, value in ipairs(modDB:Sum("LIST", nil, "Misc")) do
if value.type == "Condition" then
condList[value.var] = true
elseif value.type == "EnemyCondition" then
enemyDB.conditions[value.var] = true
elseif value.type == "Multiplier" then
modDB.multipliers[value.var] = (modDB.multipliers[value.var] or 0) + value.value
end
end
-- Process enemy modifiers last in case they depend on conditions that were set by misc modifiers
for _, value in ipairs(modDB:Sum("LIST", nil, "Misc")) do
if value.type == "EnemyModifier" then
enemyDB:AddMod(value.mod)
end
end
-- Process conditions that can depend on other conditions
if condList["EnemyIgnited"] then
condList["EnemyBurning"] = true
end
-- Calculate current and maximum charges
output.PowerChargesMax = modDB:Sum("BASE", nil, "PowerChargesMax")
output.FrenzyChargesMax = modDB:Sum("BASE", nil, "FrenzyChargesMax")
@@ -1416,6 +1394,28 @@ local function performCalcs(env)
condList["AtMaxEnduranceCharges"] = true
end
-- Process misc modifiers
for _, value in ipairs(modDB:Sum("LIST", nil, "Misc")) do
if value.type == "Condition" then
condList[value.var] = true
elseif value.type == "EnemyCondition" then
enemyDB.conditions[value.var] = true
elseif value.type == "Multiplier" then
modDB.multipliers[value.var] = (modDB.multipliers[value.var] or 0) + value.value
end
end
-- Process enemy modifiers last in case they depend on conditions that were set by misc modifiers
for _, value in ipairs(modDB:Sum("LIST", nil, "Misc")) do
if value.type == "EnemyModifier" then
enemyDB:AddMod(value.mod)
end
end
-- Process conditions that can depend on other conditions
if condList["EnemyIgnited"] then
condList["EnemyBurning"] = true
end
-- Add misc buffs
if env.mode_combat then
if condList["Onslaught"] then
@@ -2242,12 +2242,14 @@ local function performCalcs(env)
-- Calculate crit chance, crit multiplier, and their combined effect
if modDB:Sum("FLAG", nil, "NeverCrit") then
output.PreEffectiveCritChance = 0
output.CritChance = 0
output.CritMultiplier = 0
output.CritEffect = 1
else
local baseCrit = source.critChance or 0
if baseCrit == 100 then
output.PreEffectiveCritChance = 100
output.CritChance = 100
else
local base = modDB:Sum("BASE", cfg, "CritChance")
@@ -2262,6 +2264,7 @@ local function performCalcs(env)
if (baseCrit + base) > 0 then
output.CritChance = m_max(output.CritChance, 5)
end
output.PreEffectiveCritChance = output.CritChance
local preLuckyCritChance = output.CritChance
if env.mode_effective and modDB:Sum("FLAG", cfg, "CritChanceLucky") then
output.CritChance = (1 - (1 - output.CritChance / 100) ^ 2) * 100
@@ -2504,6 +2507,7 @@ local function performCalcs(env)
if isAttack then
-- Combine crit stats, average damage and DPS
combineStat("PreEffectiveCritChance", "AVERAGE")
combineStat("CritChance", "AVERAGE")
combineStat("CritMultiplier", "AVERAGE")
combineStat("AverageDamage", "DPS")

View File

@@ -128,11 +128,11 @@ function main:Init()
self:OpenPopup(800, 250, "Update Available", {
common.New("TextListControl", nil, 0, 20, 780, 190, nil, changeList),
common.New("ButtonControl", nil, -45, 220, 80, 20, "Update", function()
main:ClosePopup()
local ret = self:CallMode("CanExit", "UPDATE")
if ret == nil or ret == true then
launch:ApplyUpdate(launch.updateAvailable)
end
main:ClosePopup()
end),
common.New("ButtonControl", nil, 45, 220, 80, 20, "Cancel", function()
main:ClosePopup()

View File

@@ -388,6 +388,9 @@ local modTagList = {
["when in off hand"] = { tag = { type = "SlotNumber", num = 2 } },
["in main hand"] = { tag = { type = "InSlot", num = 1 } },
["in off hand"] = { tag = { type = "InSlot", num = 2 } },
["with main hand"] = { tag = { type = "Condition", var = "MainHandAttack" } },
["with off hand"] = { tag = { type = "Condition", var = "OffHandAttack" } },
["with this weapon"] = { tag = { type = "Condition", var = "XHandAttack" } }, -- The X is replaced when the item modifiers are generated
-- Equipment conditions
["while holding a shield"] = { tag = { type = "Condition", var = "UsingShield" } },
["with shields"] = { tag = { type = "Condition", var = "UsingShield" } },
@@ -402,9 +405,6 @@ local modTagList = {
["if you wear no corrupted items"] = { tag = { type = "Condition", var = "NotUsingCorruptedItem" } },
["if no worn items are corrupted"] = { tag = { type = "Condition", var = "NotUsingCorruptedItem" } },
["if all worn items are corrupted"] = { tag = { type = "Condition", var = "UsingAllCorruptedItems" } },
["with main hand"] = { tag = { type = "Condition", var = "MainHandAttack" } },
["with off hand"] = { tag = { type = "Condition", var = "OffHandAttack" } },
["with this weapon"] = { tag = { type = "Condition", var = "XHandAttack" } }, -- The X is replaced when the item modifiers are generated
-- Player status conditions
["when on low life"] = { tag = { type = "Condition", var = "LowLife" } },
["while on low life"] = { tag = { type = "Condition", var = "LowLife" } },
@@ -425,6 +425,7 @@ local modTagList = {
["during onslaught"] = { tag = { type = "Condition", var = "Onslaught" } },
["while you have onslaught"] = { tag = { type = "Condition", var = "Onslaught" } },
["while phasing"] = { tag = { type = "Condition", var = "Phasing" } },
["while leeching"] = { tag = { type = "Condition", var = "Leeching" } },
["while using a flask"] = { tag = { type = "Condition", var = "UsingFlask" } },
["during effect"] = { tag = { type = "Condition", var = "UsingFlask" } },
["during flask effect"] = { tag = { type = "Condition", var = "UsingFlask" } },
@@ -587,6 +588,7 @@ local specialModList = {
["you and nearby allies have (%d+)%% increased attack, cast and movement speed if you've used a warcry recently"] = function(num) return { mod("Speed", "INC", num, { type = "Condition", var = "UsedWarcryRecently" }), mod("MovementSpeed", "INC", num, { type = "Condition", var = "UsedWarcryRecently" }) } end,
["warcries cost no mana"] = { mod("ManaCost", "MORE", -100, nil, 0, KeywordFlag.Warcry) },
["enemies you taunt take (%d+)%% increased damage"] = function(num) return { mod("Misc", "LIST", { type = "EnemyModifier", mod = mod("DamageTaken", "INC", num) }, { type = "Condition", var = "EnemyTaunted" }) } end,
["you have phasing while at maximum frenzy charges"] = { mod("Misc", "LIST", { type = "Condition", var = "Phasing" }, { type = "Condition", var = "AtMaxFrenzyCharges" }) },
-- Special node types
["(%d+)%% of block chance applied to spells"] = function(num) return { mod("BlockChanceConv", "BASE", num) } end,
["(%d+)%% of block chance applied to spells when on low life"] = function(num) return { mod("BlockChanceConv", "BASE", num, { type = "Condition", var = "LowLife" }) } end,
@@ -805,39 +807,22 @@ for skillName, data in pairs(data.gems) do
skillNameList[" "..skillName:lower().." "] = { tag = { type = "SkillName", skillName = skillName } }
end
end
local function getSimpleConv(src, dst, type, factor)
local function getSimpleConv(srcList, dst, type, remove, factor)
return function(nodeMods, out, data)
if nodeMods then
for _, mod in ipairs(nodeMods) do
if mod.name == src and mod.type == type then
out:NewMod(src, type, -mod.value, "Tree:Jewel", mod.flags, mod.keywordFlags, unpack(mod.tagList))
out:NewMod(dst, type, mod.value * factor, "Tree:Jewel", mod.flags, mod.keywordFlags, unpack(mod.tagList))
end
end
end
end
end
local function getMatchConv(others, dst, type)
return function(nodeMods, out, data)
if nodeMods then
for _, mod in ipairs(nodeMods) do
for _, other in pairs(others) do
if mod.name:match(other) and mod.type == type then
out:NewMod(mod.name, type, -mod.value, "Tree:Jewel", mod.flags, mod.keywordFlags, unpack(mod.tagList))
out:NewMod(mod.name:gsub(other, dst), type, mod.value, "Tree:Jewel", mod.flags, mod.keywordFlags, unpack(mod.tagList))
for _, src in pairs(srcList) do
for _, mod in ipairs(nodeMods) do
if mod.name == src and mod.type == type then
if remove then
out:NewMod(src, type, -mod.value, "Tree:Jewel", mod.flags, mod.keywordFlags, unpack(mod.tagList))
end
if factor then
out:NewMod(dst, type, math.floor(mod.value * factor + 0.5), "Tree:Jewel", mod.flags, mod.keywordFlags, unpack(mod.tagList))
else
out:NewMod(dst, type, mod.value, "Tree:Jewel", mod.flags, mod.keywordFlags, unpack(mod.tagList))
end
end
end
end
end
end
end
local function getSimpleGain(src, dst, type, factor)
return function(nodeMods, out, data)
if nodeMods then
local val = nodeMods:Sum(type, nil, unpack(src))
if val ~= 0 then
out:NewMod(dst, type, math.floor(val * factor + 0.5), "Tree:Jewel")
end
end
end
end
@@ -862,18 +847,21 @@ end
-- List of radius jewel functions
local jewelFuncs = {
-- Conversion jewels
["Strength from Passives in Radius is Transformed to Dexterity"] = getSimpleConv("Str", "Dex", "BASE", 1),
["Dexterity from Passives in Radius is Transformed to Strength"] = getSimpleConv("Dex", "Str", "BASE", 1),
["Strength from Passives in Radius is Transformed to Intelligence"] = getSimpleConv("Str", "Int", "BASE", 1),
["Intelligence from Passives in Radius is Transformed to Strength"] = getSimpleConv("Int", "Str", "BASE", 1),
["Dexterity from Passives in Radius is Transformed to Intelligence"] = getSimpleConv("Dex", "Int", "BASE", 1),
["Intelligence from Passives in Radius is Transformed to Dexterity"] = getSimpleConv("Int", "Dex", "BASE", 1),
["Increases and Reductions to Life in Radius are Transformed to apply to Energy Shield"] = getSimpleConv("Life", "EnergyShield", "INC", 1),
["Increases and Reductions to Energy Shield in Radius are Transformed to apply to Armour at 200% of their value"] = getSimpleConv("EnergyShield", "Armour", "INC", 2),
["Increases and Reductions to Life in Radius are Transformed to apply to Mana at 200% of their value"] = getSimpleConv("Life", "Mana", "INC", 2),
["Increases and Reductions to Physical Damage in Radius are Transformed to apply to Cold Damage"] = getMatchConv({"PhysicalDamage"}, "ColdDamage", "INC"),
["Increases and Reductions to Cold Damage in Radius are Transformed to apply to Physical Damage"] = getMatchConv({"ColdDamage"}, "PhysicalDamage", "INC"),
["Increases and Reductions to other Damage Types in Radius are Transformed to apply to Fire Damage"] = getMatchConv({"PhysicalDamage","ColdDamage","LightningDamage","ChaosDamage"}, "FireDamage", "INC"),
["Strength from Passives in Radius is Transformed to Dexterity"] = getSimpleConv({"Str"}, "Dex", "BASE", true),
["Dexterity from Passives in Radius is Transformed to Strength"] = getSimpleConv({"Dex"}, "Str", "BASE", true),
["Strength from Passives in Radius is Transformed to Intelligence"] = getSimpleConv({"Str"}, "Int", "BASE", true),
["Intelligence from Passives in Radius is Transformed to Strength"] = getSimpleConv({"Int"}, "Str", "BASE", true),
["Dexterity from Passives in Radius is Transformed to Intelligence"] = getSimpleConv({"Dex"}, "Int", "BASE", true),
["Intelligence from Passives in Radius is Transformed to Dexterity"] = getSimpleConv({"Int"}, "Dex", "BASE", true),
["Increases and Reductions to Life in Radius are Transformed to apply to Energy Shield"] = getSimpleConv({"Life"}, "EnergyShield", "INC", true),
["Increases and Reductions to Energy Shield in Radius are Transformed to apply to Armour at 200% of their value"] = getSimpleConv({"EnergyShield"}, "Armour", "INC", true, 2),
["Increases and Reductions to Life in Radius are Transformed to apply to Mana at 200% of their value"] = getSimpleConv({"Life"}, "Mana", "INC", true, 2),
["Increases and Reductions to Physical Damage in Radius are Transformed to apply to Cold Damage"] = getSimpleConv({"PhysicalDamage"}, "ColdDamage", "INC", true),
["Increases and Reductions to Cold Damage in Radius are Transformed to apply to Physical Damage"] = getSimpleConv({"ColdDamage"}, "PhysicalDamage", "INC", true),
["Increases and Reductions to other Damage Types in Radius are Transformed to apply to Fire Damage"] = getSimpleConv({"PhysicalDamage","ColdDamage","LightningDamage","ChaosDamage"}, "FireDamage", "INC", true),
["Passives granting Lightning Resistance or all Elemental Resistances in Radius also grant Chance to Block Spells at 35% of its value"] = getSimpleConv({"LightningResist","ElementalResist"}, "SpellBlockChance", "BASE", false, 0.35),
["Passives granting Cold Resistance or all Elemental Resistances in Radius also grant Chance to Dodge Attacks at 35% of its value"] = getSimpleConv({"ColdResist","ElementalResist"}, "AttackDodgeChance", "BASE", false, 0.35),
["Passives granting Fire Resistance or all Elemental Resistances in Radius also grant Chance to Block at 35% of its value"] = getSimpleConv({"FireResist","ElementalResist"}, "BlockChance", "BASE", false, 0.35),
["Melee and Melee Weapon Type modifiers in Radius are Transformed to Bow Modifiers"] = function(nodeMods, out, data)
if nodeMods then
local mask1 = bor(ModFlag.Axe, ModFlag.Claw, ModFlag.Dagger, ModFlag.Mace, ModFlag.Staff, ModFlag.Sword, ModFlag.Melee)
@@ -920,9 +908,6 @@ local jewelFuncs = {
out:NewMod("DexIntToMeleeBonus", "BASE", data.Dex + data.Int, "Tree:Jewel")
end
end,
["Passives granting Lightning Resistance or all Elemental Resistances in Radius also grant Chance to Block Spells at 35% of its value"] = getSimpleGain({"LightningResist","ElementalResist"}, "SpellBlockChance", "BASE", 0.35),
["Passives granting Cold Resistance or all Elemental Resistances in Radius also grant Chance to Dodge Attacks at 35% of its value"] = getSimpleGain({"ColdResist","ElementalResist"}, "AttackDodgeChance", "BASE", 0.35),
["Passives granting Fire Resistance or all Elemental Resistances in Radius also grant Chance to Block at 35% of its value"] = getSimpleGain({"FireResist","ElementalResist"}, "BlockChance", "BASE", 0.35),
-- Threshold jewels
["With at least 40 Dexterity in Radius, Frost Blades Melee Damage Penetrates 15% Cold Resistance"] = getThreshold("Dex", "ColdPenetration", "BASE", 15, ModFlag.Melee, { type = "SkillName", skillName = "Frost Blades" }),
["With at least 40 Dexterity in Radius, Frost Blades has 25% increased Projectile Speed"] = getThreshold("Dex", "ProjectileSpeed", "INC", 25, { type = "SkillName", skillName = "Frost Blades" }),

View File

@@ -47,6 +47,22 @@ Head over to the [Releases](https://github.com/Openarl/PathOfBuilding/releases)
![ss3](https://cloud.githubusercontent.com/assets/19189971/18089780/f0ff234a-6f04-11e6-8c88-6193fe59a5c4.png)
## Changelog
### 1.3.22 - 2017/03/28
* The sidebar can now displays two Crit Chance values:
1. Crit Chance:
* This is the skill's "real" crit chance, as displayed in the in-game character sheet
* If your crit chance is capped, this value will always be 95%, unlike your effective crit chance (which can be lower)
2. Effective Crit Chance:
* This is the value previously shown as "Crit Chance"
* This estimates your true crit chance, factoring in accuracy and "Crit Chance is Lucky"
* Added an option to the Configuration tab for "Are you Leeching?"
* Essence Drain now uses "Average Damage" mode
* Phasing is now enabled automatically if you have Quartz Infusion and maximum frenzy charges
* The Red/Green/Blue Nightmare jewels now correctly apply to the condition resistance stats in the Sanctuary cluster
* Corrected the crit chance modifier on Pre-2.0.0 Windripper
* Updated "The Oak" to mirror the changes to Springleaf in 2.6
* The program should now correctly prompt to save the current build before updating
### 1.3.21 - 2017/03/20
With this update, the handling of buffs and debuffs has been improved:
* Having multiple copies of the same flask or buff/debuff skill active is now handled correctly

View File

@@ -1,3 +1,18 @@
VERSION[1.3.22][2017/03/28]
* The sidebar can now displays two Crit Chance values:
1. Crit Chance:
* This is the skill's "real" crit chance, as displayed in the in-game character sheet
* If your crit chance is capped, this value will always be 95%, unlike your effective crit chance (which can be lower)
2. Effective Crit Chance:
* This is the value previously shown as "Crit Chance"
* This estimates your true crit chance, factoring in accuracy and "Crit Chance is Lucky"
* Added an option to the Configuration tab for "Are you Leeching?"
* Essence Drain now uses "Average Damage" mode
* Phasing is now enabled automatically if you have Quartz Infusion and maximum frenzy charges
* The Red/Green/Blue Nightmare jewels now correctly apply to the condition resistance stats in the Sanctuary cluster
* Corrected the crit chance modifier on Pre-2.0.0 Windripper
* Updated "The Oak" to mirror the changes to Springleaf in 2.6
* The program should now correctly prompt to save the current build before updating
VERSION[1.3.21][2017/03/20]
With this update, the handling of buffs and debuffs has been improved:
* Having multiple copies of the same flask or buff/debuff skill active is now handled correctly

View File

@@ -1,29 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<PoBVersion>
<Version number="1.3.21"/>
<Version number="1.3.22"/>
<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="7912b22666567d5f0ff46378f5cb22e589e84efd" name="Launch.lua" part="program"/>
<File sha1="d8e42beeb38baabcc197d658e4c0af33419eeff3" name="UpdateCheck.lua" part="program"/>
<File sha1="4f17937f2b37784e169a3792b235f2a0a3961e61" name="UpdateApply.lua" part="program"/>
<File sha1="0181a4e101cef562573966fba6b19849fbe4ebff" name="changelog.txt" part="program"/>
<File sha1="85ec9a895b92d37918385fe83d9184771ba50f0c" name="changelog.txt" part="program"/>
<File sha1="74fff9f369b6e2c98cfdf978c251c9828bcf39dc" name="Classes/BuildListControl.lua" part="program"/>
<File sha1="deffd663ba726d938fcbe2870aab8a4e982587fa" name="Classes/ButtonControl.lua" part="program"/>
<File sha1="ec81fc6c0ee4a4d228f88ec165a0bc7e994278bc" name="Classes/CalcBreakdownControl.lua" part="program"/>
<File sha1="e30db9887e852afc1b149e2ee34cc124bc6d7a0a" name="Classes/CalcSectionControl.lua" part="program"/>
<File sha1="0177c313de6d62cc53c7dfff20a055b26de7c1b7" name="Classes/CalcsTab.lua" part="program"/>
<File sha1="883552932a8f6782815d1b529624a414e93eac10" name="Classes/CheckBoxControl.lua" part="program"/>
<File sha1="9c523953c77e6b50be39bfa2b8c01e6a82b8d0ad" name="Classes/ConfigTab.lua" part="program"/>
<File sha1="7d77a8b207182c17f4c0fdba84569c98f97d8087" name="Classes/ConfigTab.lua" part="program"/>
<File sha1="bbb08f183746d6ec023e2bd08fb7a89d365381da" name="Classes/Control.lua" part="program"/>
<File sha1="ae55fe1093e727872bc01cc94fa987395f944313" name="Classes/ControlHost.lua" part="program"/>
<File sha1="9f05f72260f896eea09c1a8fb28f58973ce4d3ff" name="Classes/DropDownControl.lua" part="program"/>
<File sha1="b9ac0558364612a1f439c830ea0569e3fae673cb" name="Classes/EditControl.lua" part="program"/>
<File sha1="1f3e330b2f7df3e3ed4aec32c939e6355b2a50e8" name="Classes/GemSelectControl.lua" part="program"/>
<File sha1="7bfcf72619cf63d6724c08dd3398fbb76e94d265" name="Classes/ImportTab.lua" part="program"/>
<File sha1="ee5e12ecfca6d69becad050af6b5c70fcc2e5a96" name="Classes/ImportTab.lua" part="program"/>
<File sha1="973a8e8aef65bcaf71812707fb671ee090b67793" name="Classes/ItemDBControl.lua" part="program"/>
<File sha1="5ecb01b4b82c19420b15a116027e00530f673045" name="Classes/ItemListControl.lua" part="program"/>
<File sha1="8dc250cae604f7d7a6485ead2248f06edad61103" name="Classes/ItemSlotControl.lua" part="program"/>
<File sha1="bda86df3dca469c831eb6d0bc2721d73cf3096b1" name="Classes/ItemSlotControl.lua" part="program"/>
<File sha1="38e26ad8b85451da507a84c6ca973113ec2316c9" name="Classes/ItemsTab.lua" part="program"/>
<File sha1="62138c7db82d57d638a16610a26acd0de75d3486" name="Classes/LabelControl.lua" part="program"/>
<File sha1="5563f8abc4bfb9092a6f0de3686d08aa2ccd0f22" name="Classes/ModDB.lua" part="program"/>
@@ -42,15 +42,15 @@
<File sha1="a4f9cc96ba474d0a75c768a0eabec92837e027cf" name="Classes/TextListControl.lua" part="program"/>
<File sha1="7b8a7d52db5ed09d1fa526684bfb295c2e668f10" name="Classes/TreeTab.lua" part="program"/>
<File sha1="4b7675c8b4fe71cade7dd3d70793df1ed8022d01" name="Classes/UndoHandler.lua" part="program"/>
<File sha1="8c68133681e44293ccaace709bc4c3b4f580f851" name="Modules/Build.lua" part="program"/>
<File sha1="5cca4d138f7f6d5993edd6a8a3d4293f086a7dfe" name="Modules/Build.lua" part="program"/>
<File sha1="8a07fe01c53b785ebb6256236e781fbaabd36c0e" name="Modules/BuildList.lua" part="program"/>
<File sha1="29f46be6ffa64380ee24f6986f643f9843204258" name="Modules/Calcs.lua" part="program"/>
<File sha1="f0dc38920601c4e70e6074391d73261009eb5cb3" name="Modules/Calcs.lua" part="program"/>
<File sha1="1a49b23df0a47dba23a906c448c60a5c6db606d2" name="Modules/CalcSections.lua" part="program"/>
<File sha1="761af85f3e1c5601fdb790356a09aefe2f5a64e3" name="Modules/Common.lua" part="program"/>
<File sha1="b4cfb1847f09d22dfd6969cc9e55c64e6d72cac2" name="Modules/Data.lua" part="program"/>
<File sha1="bbeff8fabf5ff65d8571104eb49f0a9694495c0a" name="Modules/ItemTools.lua" part="program"/>
<File sha1="cc69e5d4f5cbc8739340820314629245f317b555" name="Modules/Main.lua" part="program"/>
<File sha1="34eb86c947cbc0fc072756ed0bbd5bd1a5a8b5f6" name="Modules/ModParser.lua" part="program"/>
<File sha1="5a276cfd0bad3ce60585edf734420943c632a9cb" name="Modules/Main.lua" part="program"/>
<File sha1="1d0a0a0dd6e3f238554acf410ca4f3c5f42dc3c0" name="Modules/ModParser.lua" part="program"/>
<File sha1="7d8acc42bbdb948e4f565e1a4111c6b8c0f1f969" name="Modules/ModTools.lua" part="program"/>
<File sha1="e7ee7e5b6388facb7bf568517ecc401590757df7" name="Assets/ring.png" part="program"/>
<File sha1="9a320bfe629b1cf3f14fc77fbbf2508d0a5b2841" name="Assets/small_ring.png" part="program"/>
@@ -58,8 +58,8 @@
<File sha1="15664631a501d837c5c6796217c663457f115bb1" name="Data/ModJewel.lua" part="program"/>
<File sha1="57e45a4b184fb5822e49b5c9be0c7f75b7dd48f7" name="Data/New.lua" part="program"/>
<File sha1="0d6e592ba125e721062cf1d388aa5eccd44703f1" name="Data/Rares.lua" part="program"/>
<File sha1="d4db572b0a4b1b2220c347267366792ac58b93cc" name="Data/Gems/act_dex.lua" part="program"/>
<File sha1="247f17c6627118c7b6f7b08622f4c57261177069" name="Data/Gems/act_int.lua" part="program"/>
<File sha1="674e17c0ef7a6574311bebce42e7e83d31d6cac0" name="Data/Gems/act_dex.lua" part="program"/>
<File sha1="6fe58f498d12c290011ad8d1e45c9d1e35dddb95" name="Data/Gems/act_int.lua" part="program"/>
<File sha1="3463375d5ec812437cef5b6325d3b616c06dbcad" name="Data/Gems/act_str.lua" part="program"/>
<File sha1="5bfb9d035b311f9658e6a31e49bd7fcc87d1d41a" name="Data/Gems/other.lua" part="program"/>
<File sha1="4e82aafe55b1ef7a42e590f6fd6d30ca8430d15b" name="Data/Gems/sup_dex.lua" part="program"/>
@@ -89,17 +89,17 @@
<File sha1="5b4826e6f9242b68a4fe3f008bdd1204cda58f85" name="Data/Uniques/belt.lua" part="program"/>
<File sha1="7ecea8e2420fdcab13e0338c2491eb802d7f8e74" name="Data/Uniques/body.lua" part="program"/>
<File sha1="a6c0cb438c115e924b420d813c09ed0958e8e52c" name="Data/Uniques/boots.lua" part="program"/>
<File sha1="588821ab138c0e7e579a1ad6225c7405ef2934ba" name="Data/Uniques/bow.lua" part="program"/>
<File sha1="e86f8d5debc252af26628a1aeb9526d98fc71a0d" name="Data/Uniques/bow.lua" part="program"/>
<File sha1="b73b16de3df43c7bed47479372c82fbd390248ff" name="Data/Uniques/claw.lua" part="program"/>
<File sha1="e2c2fc4d04fcec13c416818629bffd542886e617" name="Data/Uniques/dagger.lua" part="program"/>
<File sha1="acfc587edffcb9d4810b2b2d30cd510176d8b780" name="Data/Uniques/flask.lua" part="program"/>
<File sha1="3179548d727b1613712b9e4d298158ddafe9c827" name="Data/Uniques/gloves.lua" part="program"/>
<File sha1="7e70825d889ef5dc61cb117ab1ebf7e7f814f54a" name="Data/Uniques/helmet.lua" part="program"/>
<File sha1="81ee65fed4e1c86fc9f096cf78872e18543e7213" name="Data/Uniques/jewel.lua" part="program"/>
<File sha1="2ef66ced53ab63e19775924bf47f0fee0ac3b011" name="Data/Uniques/jewel.lua" part="program"/>
<File sha1="998c53204c6bc4b5796c7598189f9a10522df507" name="Data/Uniques/mace.lua" part="program"/>
<File sha1="940ec4e40778144151a611400174ed79b813c204" name="Data/Uniques/quiver.lua" part="program"/>
<File sha1="3ec41f8199a0c1d3e9376fac864d51e45d10f1e4" name="Data/Uniques/ring.lua" part="program"/>
<File sha1="4297fc1368fbd62136ebe360d99741ce45f203f0" name="Data/Uniques/shield.lua" part="program"/>
<File sha1="ddf7cf4a199071b9f9c6ca36453bc0d3b0348ab5" name="Data/Uniques/shield.lua" part="program"/>
<File sha1="633652f8861e52b7905957b819a63e52718b3eaa" name="Data/Uniques/staff.lua" part="program"/>
<File sha1="7872e848dcb7904709b919f70bfb9ecb1c73401b" name="Data/Uniques/sword.lua" part="program"/>
<File sha1="b4611a28551b3480d0886c624b81242c9cdae6f2" name="Data/Uniques/wand.lua" part="program"/>