Release 1.2.32

- Add support for ignite stacking with Emberwake
- Added Savage Hit conditional
- Total DPS inc Poison now factors in hit chance
- Fixed Ice Spear second form crit chance
- Fixed vaal keyword flag being absent on vaal skills
This commit is contained in:
Openarl
2017-01-15 03:46:10 +10:00
parent 584d594855
commit 8d59fe4258
11 changed files with 145 additions and 36 deletions

View File

@@ -64,6 +64,9 @@ local varList = {
{ var = "conditionBeenHitRecently", type = "check", label = "Have you been Hit Recently?", apply = function(val, modList, enemyModList)
modList:NewMod("Misc", "LIST", { type = "Condition", var = "BeenHitRecently" }, "Config", { type = "Condition", var = "Combat" })
end },
{ var = "conditionBeenSavageHitRecently", type = "check", label = "Have you been Savage Hit Recently?", apply = function(val, modList, enemyModList)
modList:NewMod("Misc", "LIST", { type = "Condition", var = "BeenSavageHitRecently" }, "Config", { type = "Condition", var = "Combat" })
end },
{ var = "buffPendulum", type = "check", label = "Is Pendulum of Destruction active?", ifNode = 57197, apply = function(val, modList, enemyModList)
modList:NewMod("Misc", "LIST", { type = "Condition", var = "PendulumOfDestruction" }, "Config", { type = "Condition", var = "Combat" })
end },
@@ -198,21 +201,21 @@ local ConfigTabClass = common.NewClass("ConfigTab", "UndoHandler", "ControlHost"
else
local control
if varData.type == "check" then
control = common.New("CheckBoxControl", {"TOPLEFT",lastSection,"TOPLEFT"}, 216, 0, 18, nil, function(state)
control = common.New("CheckBoxControl", {"TOPLEFT",lastSection,"TOPLEFT"}, 224, 0, 18, nil, function(state)
self.input[varData.var] = state
self:AddUndoState()
self:BuildModList()
self.build.buildFlag = true
end)
elseif varData.type == "number" then
control = common.New("EditControl", {"TOPLEFT",lastSection,"TOPLEFT"}, 216, 0, 50, 18, "", nil, "^%-%d", 4, function(buf)
control = common.New("EditControl", {"TOPLEFT",lastSection,"TOPLEFT"}, 224, 0, 50, 18, "", nil, "^%-%d", 4, function(buf)
self.input[varData.var] = tonumber(buf)
self:AddUndoState()
self:BuildModList()
self.build.buildFlag = true
end)
elseif varData.type == "list" then
control = common.New("DropDownControl", {"TOPLEFT",lastSection,"TOPLEFT"}, 216, 0, 126, 16, varData.list, function(sel, selVal)
control = common.New("DropDownControl", {"TOPLEFT",lastSection,"TOPLEFT"}, 224, 0, 118, 16, varData.list, function(sel, selVal)
self.input[varData.var] = selVal.val
self:AddUndoState()
self:BuildModList()

View File

@@ -9,8 +9,20 @@ local ipairs = ipairs
local m_min = math.min
local m_max = math.max
local DropDownClass = common.NewClass("DropDownControl", "Control", function(self, anchor, x, y, width, height, list, selFunc, tooltip)
local DropDownClass = common.NewClass("DropDownControl", "Control", "ControlHost", function(self, anchor, x, y, width, height, list, selFunc, tooltip)
self.Control(anchor, x, y, width, height)
self.ControlHost()
self.controls.scrollBar = common.New("ScrollBarControl", {"TOPRIGHT",self,"TOPRIGHT"}, -1, 0, 18, 0, (height - 4) * 4)
self.controls.scrollBar.y = function()
local width, height = self:GetSize()
return height + 1
end
self.controls.scrollBar.height = function()
return (height - 4) * m_min(#self.list, 30) + 2
end
self.controls.scrollBar.shown = function()
return self.dropped and self.controls.scrollBar.enabled
end
self.list = list or { }
self.sel = 1
self.selFunc = selFunc
@@ -43,6 +55,14 @@ function DropDownClass:SetSel(newSel)
end
end
function DropDownClass:ScrollSelIntoView()
local width, height = self:GetSize()
local scrollBar = self.controls.scrollBar
local dropHeight = (height - 4) * m_min(#self.list, 30)
scrollBar:SetContentDimension((height - 4) * #self.list, dropHeight)
scrollBar:ScrollIntoView((self.sel - 2) * (height - 4), 3 * (height - 4))
end
function DropDownClass:IsMouseOver()
if not self:IsShown() then
return false
@@ -50,7 +70,7 @@ function DropDownClass:IsMouseOver()
local x, y = self:GetPos()
local width, height = self:GetSize()
local cursorX, cursorY = GetCursorPos()
local dropExtra = self.dropped and (height - 4) * #self.list + 2 or 0
local dropExtra = self.dropped and (height - 4) * m_min(#self.list, 30) + 2 or 0
local mOver
if self.dropUp then
mOver = cursorX >= x and cursorY >= y - dropExtra and cursorX < x + width and cursorY < y + height
@@ -73,7 +93,10 @@ function DropDownClass:Draw(viewPort)
local width, height = self:GetSize()
local enabled = self:IsEnabled()
local mOver, mOverComp = self:IsMouseOver()
local dropExtra = (height - 4) * #self.list + 4
local dropHeight = (height - 4) * m_min(#self.list, 30)
local dropExtra = dropHeight + 4
local scrollBar = self.controls.scrollBar
scrollBar:SetContentDimension((height - 4) * #self.list, dropHeight)
self.dropUp = y + height + dropExtra > viewPort.height
local dropY = self.dropUp and y - dropExtra or y + height
if not enabled then
@@ -133,14 +156,15 @@ function DropDownClass:Draw(viewPort)
SetViewport()
if self.dropped then
SetDrawLayer(nil, 5)
self:DrawControls(viewPort)
local cursorX, cursorY = GetCursorPos()
self.hoverSel = mOver and math.floor((cursorY - dropY) / (height - 4)) + 1
self.hoverSel = mOver and not scrollBar:IsMouseOver() and math.floor((cursorY - dropY + scrollBar.offset) / (height - 4)) + 1
if self.hoverSel and self.hoverSel < 1 then
self.hoverSel = nil
end
SetViewport(x + 2, dropY + 2, width - 4, #self.list * (height - 4))
SetViewport(x + 2, dropY + 2, scrollBar.enabled and width - 22 or width - 4, dropHeight)
for index, listVal in ipairs(self.list) do
local y = (index - 1) * (height - 4)
local y = (index - 1) * (height - 4) - scrollBar.offset
if index == self.hoverSel then
SetDrawColor(0.5, 0.4, 0.3)
DrawImage(nil, 0, y, width - 4, height - 4)
@@ -162,13 +186,23 @@ function DropDownClass:OnKeyDown(key)
if not self:IsShown() or not self:IsEnabled() then
return
end
local mOverControl = self:GetMouseOverControl()
if mOverControl and mOverControl.OnKeyDown then
self.selControl = mOverControl
return mOverControl:OnKeyDown(key) and self
else
self.selControl = nil
end
if key == "LEFTBUTTON" or key == "RIGHTBUTTON" then
local mOver, mOverComp = self:IsMouseOver()
if not mOver or (self.dropped and mOverComp == "BODY") then
self.dropped = false
return self
end
self.dropped = true
if not self.dropped then
self.dropped = true
self:ScrollSelIntoView()
end
elseif key == "ESCAPE" then
self.dropped = false
end
@@ -179,6 +213,15 @@ function DropDownClass:OnKeyUp(key)
if not self:IsShown() or not self:IsEnabled() then
return
end
if self.selControl then
local newSel = self.selControl:OnKeyUp(key)
if newSel then
return self
else
self.selControl = nil
end
return self
end
if key == "LEFTBUTTON" or key == "RIGHTBUTTON" then
local mOver, mOverComp = self:IsMouseOver()
if not mOver then
@@ -187,16 +230,32 @@ function DropDownClass:OnKeyUp(key)
local x, y = self:GetPos()
local width, height = self:GetSize()
local cursorX, cursorY = GetCursorPos()
local dropExtra = (height - 4) * #self.list + 4
local dropExtra = (height - 4) * m_min(#self.list, 30) + 4
local dropY = self.dropUp and y - dropExtra or y + height
self:SetSel(math.floor((cursorY - dropY) / (height - 4)) + 1)
self:SetSel(math.floor((cursorY - dropY + self.controls.scrollBar.offset) / (height - 4)) + 1)
self.dropped = false
end
elseif key == "WHEELDOWN" or key == "DOWN" then
self:SetSel(self.sel + 1)
elseif key == "WHEELDOWN" then
if self.dropped and self.controls.scrollBar.enabled then
self.controls.scrollBar:Scroll(1)
else
self:SetSel(self.sel + 1)
end
return self
elseif key == "WHEELUP" or key == "UP" then
elseif key == "DOWN" then
self:SetSel(self.sel + 1)
self:ScrollSelIntoView()
return self
elseif key == "WHEELUP" then
if self.dropped and self.controls.scrollBar.enabled then
self.controls.scrollBar:Scroll(-1)
else
self:SetSel(self.sel - 1)
end
return self
elseif key == "UP" then
self:SetSel(self.sel - 1)
self:ScrollSelIntoView()
return self
end
return self.dropped and self

View File

@@ -229,7 +229,7 @@ gems["Blade Flurry"] = {
--"is_area_damage" = ?
nil, --"base_skill_show_average_damage_instead_of_dps" = ?
--"skill_can_add_multiple_charges_per_action" = ?
mod("Damage", "MORE", 100, ModFlag.Attack, 0, { type = "SkillPart", skillPart = 2 }),
mod("Damage", "MORE", 120, ModFlag.Attack, 0, { type = "SkillPart", skillPart = 2 }),
skill("dpsMultiplier", 3, { type = "SkillPart", skillPart = 3 }),
},
qualityMods = {

View File

@@ -2378,7 +2378,7 @@ gems["Ice Spear"] = {
skill("damageEffectiveness", 0.8),
skill("critChance", 7),
--"base_is_projectile" = 1
mod("CritChance", "INT", 600, 0, 0, { type = "SkillPart", skillPart = 2 }), --"ice_spear_second_form_critical_strike_chance_+%" = 600
mod("CritChance", "INC", 600, 0, 0, { type = "SkillPart", skillPart = 2 }), --"ice_spear_second_form_critical_strike_chance_+%" = 600
mod("PierceChance", "BASE", 100, 0, 0, { type = "SkillPart", skillPart = 1 }),
},
qualityMods = {

View File

@@ -236,10 +236,13 @@ function buildMode:Init(dbFileName, buildName)
{ mod = "TotalDot", label = "DoT DPS", fmt = ".1f", compPercent = true },
{ mod = "BleedDPS", label = "Bleed DPS", fmt = ".1f", compPercent = true },
{ mod = "IgniteDPS", label = "Ignite DPS", fmt = ".1f", compPercent = true },
{ mod = "IgniteDamage", label = "Total Damage per Ignite", fmt = ".1f", compPercent = true },
{ mod = "WithIgniteDPS", label = "Total DPS inc. Ignite", fmt = ".1f", compPercent = true },
{ mod = "WithIgniteAverageDamage", label = "Average Dmg. inc. Ignite", fmt = ".1f", compPercent = true },
{ mod = "PoisonDPS", label = "Poison DPS", fmt = ".1f", compPercent = true },
{ mod = "PoisonDamage", label = "Total Damage per Poison", fmt = ".1f", compPercent = true },
{ mod = "WithPoisonDPS", label = "Total DPS inc. Poison", fmt = ".1f", compPercent = true },
{ mod = "WithPoisonAverageHit", label = "Average Hit inc. Poison", fmt = ".1f", compPercent = true },
{ mod = "WithPoisonAverageDamage", label = "Average Dmg. inc. Poison", fmt = ".1f", compPercent = true },
{ mod = "ManaCost", label = "Mana Cost", fmt = "d", compPercent = true, lowerIsBetter = true, condFunc = function() return true end },
{ },
{ mod = "Str", label = "Strength", fmt = "d" },

View File

@@ -211,6 +211,7 @@ return {
{ label = "Effective DPS Mod", flag = "effective", { format = "x {3:output:IgniteEffMult}", { breakdown = "IgniteEffMult" }, { label = "Enemy modifiers", modName = { "FireResist", "ElementalResist", "DamageTaken", "DotTaken", "FireDamageTaken", "BurningDamageTaken", "ElementalDamageTaken" }, enemy = true }, }, },
{ label = "Ignite DPS", { format = "{1:output:IgniteDPS}", { breakdown = "IgniteDPS" }, }, },
{ label = "Ignite Duration", { format = "{2:output:IgniteDuration}s", { breakdown = "IgniteDuration" }, { label = "Player modifiers", modName = "EnemyIgniteDuration", cfg = "skill" }, { label = "Enemy modifiers", modName = "SelfIgniteDuration", enemy = true }, }, },
{ label = "Dmg. per Ignite", flag = "igniteCanStack", { format = "{1:output:IgniteDamage}", { breakdown = "IgniteDamage" }, }, },
} },
{ 1, "MiscEffects", 1, "Other Effects", data.colorCodes.OFFENCE, {
flag = "hit",

View File

@@ -258,6 +258,9 @@ local function buildActiveSkillModList(env, activeSkill)
if skillFlags.movement then
skillKeywordFlags = bor(skillKeywordFlags, KeywordFlag.Movement)
end
if skillFlags.vaal then
skillKeywordFlags = bor(skillKeywordFlags, KeywordFlag.Vaal)
end
if skillFlags.lightning then
skillKeywordFlags = bor(skillKeywordFlags, KeywordFlag.Lightning)
end
@@ -2181,7 +2184,7 @@ local function performCalcs(env)
"5.00s ^8(base duration)"
}
if output.DurationMod ~= 1 then
t_insert(breakdown.BleedDuration, s_format("x %.2f ^8(duration modifier)", output.DurationMod))
t_insert(breakdown.BleedDuration, s_format("x %.2f ^8(duration modifier)", calcMod(modDB, dotCfg, "Duration")))
end
if debuffDurationMult ~= 1 then
t_insert(breakdown.BleedDuration, s_format("/ %.2f ^8(debuff expires slower/faster)", 1 / debuffDurationMult))
@@ -2248,7 +2251,7 @@ local function performCalcs(env)
s_format("%.2fs ^8(base duration)", durationBase)
}
if output.DurationMod ~= 1 then
t_insert(breakdown.PoisonDuration, s_format("x %.2f ^8(duration modifier)", output.DurationMod))
t_insert(breakdown.PoisonDuration, s_format("x %.2f ^8(duration modifier)", calcMod(modDB, dotCfg, "Duration")))
end
if debuffDurationMult ~= 1 then
t_insert(breakdown.PoisonDuration, s_format("/ %.2f ^8(debuff expires slower/faster)", 1 / debuffDurationMult))
@@ -2258,7 +2261,7 @@ local function performCalcs(env)
breakdown.PoisonDamage = {
s_format("%.1f ^8(damage per second)", output.PoisonDPS),
s_format("x %.2fs ^8(poison duration)", output.PoisonDuration),
s_format("= %.1f ^8damage per poison stack", output.PoisonDamage),s
s_format("= %.1f ^8damage per poison stack", output.PoisonDamage),
}
end
end
@@ -2306,6 +2309,10 @@ local function performCalcs(env)
output.IgniteDPS = baseVal * (1 + inc/100) * more * effMult
local incDur = modDB:Sum("INC", dotCfg, "EnemyIgniteDuration") + enemyDB:Sum("INC", nil, "SelfIgniteDuration")
output.IgniteDuration = 4 * (1 + incDur / 100) * debuffDurationMult
if modDB:Sum("FLAG", nil, "IgniteCanStack") then
output.IgniteDamage = output.IgniteDPS * output.IgniteDuration
skillFlags.igniteCanStack = true
end
if breakdown then
breakdown.IgniteDPS = {
s_format("Ignite mode: %s ^8(can be changed in the Configuration tab)", igniteMode == "CRIT" and "Crit Damage" or "Average Damage"),
@@ -2325,6 +2332,13 @@ local function performCalcs(env)
t_insert(breakdown.IgniteDPS, s_format("= %.1f", baseVal, 1))
t_insert(breakdown.IgniteDPS, "Ignite DPS:")
dotBreakdown(breakdown.IgniteDPS, baseVal, inc, more, effMult, output.IgniteDPS)
if skillFlags.igniteCanStack then
breakdown.IgniteDamage = {
s_format("%.1f ^8(damage per second)", output.IgniteDPS),
s_format("x %.2fs ^8(ignite duration)", output.IgniteDuration),
s_format("= %.1f ^8damage per ignite stack", output.IgniteDamage)
}
end
if output.IgniteDuration ~= 4 then
breakdown.IgniteDuration = {
s_format("4.00s ^8(base duration)", durationBase)
@@ -2411,18 +2425,31 @@ local function performCalcs(env)
end
-- Calculate combined DPS estimate, including DoTs
output.CombinedDPS = output[(env.mode_average and "AverageDamage") or "TotalDPS"] + output.TotalDot
local baseDPS = output[(env.mode_average and "AverageDamage") or "TotalDPS"] + output.TotalDot
output.CombinedDPS = baseDPS
if skillFlags.poison then
if env.mode_average then
output.CombinedDPS = output.CombinedDPS + output.PoisonChance / 100 * output.PoisonDamage
output.WithPoisonAverageHit = output.CombinedDPS
output.CombinedDPS = output.CombinedDPS + output.HitChance / 100 * output.PoisonChance / 100 * output.PoisonDamage
output.WithPoisonAverageDamage = output.CombinedDPS
else
output.CombinedDPS = output.CombinedDPS + output.PoisonChance / 100 * output.PoisonDamage * (output.HitSpeed or output.Speed)
output.CombinedDPS = output.CombinedDPS + output.HitChance / 100 * output.PoisonChance / 100 * output.PoisonDamage * (output.HitSpeed or output.Speed)
output.WithPoisonDPS = output.CombinedDPS
end
end
if skillFlags.ignite then
output.CombinedDPS = output.CombinedDPS + output.IgniteDPS
if skillFlags.igniteCanStack then
local igniteDPS
if env.mode_average then
igniteDPS = output.HitChance / 100 * output.IgniteChance / 100 * output.IgniteDamage
output.WithIgniteAverageDamage = baseDPS + igniteDPS
else
igniteDPS = output.HitChance / 100 * output.IgniteChance / 100 * output.IgniteDamage * (output.HitSpeed or output.Speed)
output.WithIgniteDPS = baseDPS + igniteDPS
end
output.CombinedDPS = output.CombinedDPS + igniteDPS
else
output.CombinedDPS = output.CombinedDPS + output.IgniteDPS
end
end
if skillFlags.bleed then
output.CombinedDPS = output.CombinedDPS + output.BleedDPS

View File

@@ -380,6 +380,7 @@ local modTagList = {
["if you'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 savage hit recently"] = { tag = { type = "Condition", var = "BeenSavageHitRecently" } },
["if you haven't been hit recently"] = { tag = { type = "Condition", var = "NotBeenHitRecently" } },
["if you've taken no damage from hits recently"] = { tag = { type = "Condition", var = "NotBeenHitRecently" } },
["if you've blocked a hit from a unique enemy recently"] = { tag = { type = "Condition", var = "BlockedHitFromUniqueEnemyRecently" } },
@@ -539,6 +540,7 @@ local specialModList = {
["your physical damage can chill"] = { flag("PhysicalCanChill") },
["your physical damage can shock"] = { flag("PhysicalCanShock") },
["your chaos damage poisons enemies"] = { mod("PoisonChance", "BASE", 100) },
["you can inflict up to (%d+) ignites on an enemy"] = { flag("IgniteCanStack") },
["melee attacks cause bleeding"] = { mod("BleedChance", "BASE", 100, nil, ModFlag.Melee) },
["melee attacks poison on hit"] = { mod("PoisonChance", "BASE", 100, nil, ModFlag.Melee) },
["attacks cause bleeding when hitting cursed enemies"] = { mod("BleedChance", "BASE", 100, { type = "Condition", var = "EnemyCursed" }) },

View File

@@ -48,6 +48,14 @@ 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.2.32 - 2017/01/15
* The program now calculates Total Damage per Ignite and Total DPS inc. Ignite when you have Emberwake equipped
* Added a "Have you been Savage Hit Recently?" option to the Configuration tab
* The calculation of Total DPS inc. Poison now factors in hit chance
* Fixed the bonus crit chance for Ice Spear's second form
* Vaal skills now correctly benefit from Vaal skill modifiers
* The breakdown for poison duration now correctly displays the poison duration modifier instead of the skill modifier
### 1.2.31 - 2017/01/08
* Added two new templates for sceptre attack builds
* Corrected the implicits on the wand and sceptre templates

View File

@@ -1,3 +1,9 @@
VERSION[1.2.32][2017/01/11]
* The program now calculates Total Damage per Ignite and Total DPS inc. Ignite when you have Emberwake equipped
* The calculation of Total DPS inc. Poison now factors in hit chance
* Fixed the bonus crit chance for Ice Spear's second form
* Vaal skills now correctly benefit from Vaal skill modifiers
* The breakdown for poison duration now correctly displays the poison duration modifier instead of the skill modifier
VERSION[1.2.31][2017/01/08]
* Added two new templates for sceptre attack builds
* Corrected the implicits on the wand and sceptre templates

View File

@@ -1,23 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<PoBVersion>
<Version number="1.2.31"/>
<Version number="1.2.32"/>
<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="46a39bc720b0339359fe598ea2828a9a43ecbcea" name="Launch.lua" part="program"/>
<File sha1="d8e42beeb38baabcc197d658e4c0af33419eeff3" name="UpdateCheck.lua" part="program"/>
<File sha1="4f17937f2b37784e169a3792b235f2a0a3961e61" name="UpdateApply.lua" part="program"/>
<File sha1="b69d208eed270adc8358754f2b2d57892926657b" name="changelog.txt" part="program"/>
<File sha1="8964717f8952b8cf320939b99d034f96db7abc75" name="changelog.txt" part="program"/>
<File sha1="231a4fe264d84294427edacbf3e29ec4b301712e" name="Classes/BuildListControl.lua" part="program"/>
<File sha1="47c28993f5653955c9e76714775d87ac22b077da" name="Classes/ButtonControl.lua" part="program"/>
<File sha1="5a4b4930533a97f4d87231a6024b7f48ff0bad89" name="Classes/CalcBreakdownControl.lua" part="program"/>
<File sha1="23171916fa590c5344b17e67bd8d378574922388" name="Classes/CalcSectionControl.lua" part="program"/>
<File sha1="0256fbb994946900a82b45ec4108a94643bd0c91" name="Classes/CalcsTab.lua" part="program"/>
<File sha1="5d30e33c23cabf22917c02eb7df1963a5a27cb6a" name="Classes/CheckBoxControl.lua" part="program"/>
<File sha1="f7549ef19056c9607a5392a465740cec452cc806" name="Classes/ConfigTab.lua" part="program"/>
<File sha1="70bebdd6d7dcadddfef6429bc6dcc42072d8b04b" 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="3e1ac525cb454844527ee3c586ed21b9e2b0446b" name="Classes/DropDownControl.lua" part="program"/>
<File sha1="95d665ada6515e8ce739b790a59213bdee75b6a5" name="Classes/DropDownControl.lua" part="program"/>
<File sha1="b80bce946bd080f77b00704353d0f782a2a2de72" name="Classes/EditControl.lua" part="program"/>
<File sha1="3dca397c5ed010ed2c5c0551b103c009cfa83c60" name="Classes/GemSelectControl.lua" part="program"/>
<File sha1="0d739a663e36ebecefaff9101e9b66346c2fd3c3" name="Classes/ImportTab.lua" part="program"/>
@@ -42,22 +42,22 @@
<File sha1="a4f9cc96ba474d0a75c768a0eabec92837e027cf" name="Classes/TextListControl.lua" part="program"/>
<File sha1="74e2261bb0803451c80e4eeef83834a7c3930b92" name="Classes/TreeTab.lua" part="program"/>
<File sha1="4b7675c8b4fe71cade7dd3d70793df1ed8022d01" name="Classes/UndoHandler.lua" part="program"/>
<File sha1="acb2b28aaf4acfa4c7d0801a26672e1fedc752c8" name="Modules/Build.lua" part="program"/>
<File sha1="b902b15ed69d661ed0eabb4c2a5a5e9fcd4ecc9d" name="Modules/Build.lua" part="program"/>
<File sha1="8a07fe01c53b785ebb6256236e781fbaabd36c0e" name="Modules/BuildList.lua" part="program"/>
<File sha1="b054c34a6acbeeb15b1a95f2b036ab823cd03239" name="Modules/Calcs.lua" part="program"/>
<File sha1="5f4cb49ac9956007505e8ed599918946c2daf0e0" name="Modules/CalcSections.lua" part="program"/>
<File sha1="603cefb675097203dc5e8fb7c92d0784fe991e9d" name="Modules/Calcs.lua" part="program"/>
<File sha1="97e9fa0d605a80106fa6718f4cb10ac8063a8f1c" name="Modules/CalcSections.lua" part="program"/>
<File sha1="0f9df7b91a548b008693102854b108693205309c" name="Modules/Common.lua" part="program"/>
<File sha1="2b393e960721c36dc4c99645a507d7232cbd6f0e" name="Modules/Data.lua" part="program"/>
<File sha1="786d2dfd1fde410d5319d55b04878c44c26307cf" name="Modules/ItemTools.lua" part="program"/>
<File sha1="6165a0baf0c7d1cb6adf9bef68bfa9d9d3ad67ec" name="Modules/Main.lua" part="program"/>
<File sha1="b0543cab88ce52db0eb6644c510f923be9b93fa6" name="Modules/ModParser.lua" part="program"/>
<File sha1="9b9e86f6aabf5e6a8a6fd0b9fccfcd25bc4aa2d5" name="Modules/ModParser.lua" part="program"/>
<File sha1="5f93a9d8f58e0d5990a1f84e1ab1d53fbd35fb56" 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"/>
<File sha1="24596d013ecc9170990670c4e02f1b38c326db9e" name="Data/New.lua" part="program"/>
<File sha1="0623dabce4ba730d770abfbb0087dc5c9bbce501" name="Data/Rares.lua" part="program"/>
<File sha1="d74215f5f768cd3ef5a778b8d8dcf83611c1d98f" name="Data/Gems/act_dex.lua" part="program"/>
<File sha1="8abf13452b80746049bcc555dfc3d1aa43c0010c" name="Data/Gems/act_int.lua" part="program"/>
<File sha1="0ed7355917efa5619982fca0aeb8385dac265854" name="Data/Gems/act_dex.lua" part="program"/>
<File sha1="b2a047c3dea22689d73632c8b3ae02aa41957eb3" name="Data/Gems/act_int.lua" part="program"/>
<File sha1="79343ddf8c2ff5b0e4f73e5ff83bce5d8222a4af" name="Data/Gems/act_str.lua" part="program"/>
<File sha1="fb08097a2a2d5065d98e70a080e1025e85eb3e4c" name="Data/Gems/other.lua" part="program"/>
<File sha1="56d472af3b6da1de572670c06530be247d29d61a" name="Data/Gems/sup_dex.lua" part="program"/>