More tweaks and fixes

- Added required level on hover to points display
- Various minor fixes to calcs
This commit is contained in:
Openarl
2016-11-02 20:20:57 +10:00
parent 8a87619b38
commit 9ece3b4768
20 changed files with 103 additions and 124 deletions

View File

@@ -45,13 +45,7 @@ function BuildListClass:IsMouseOver()
if not self:IsShown() then
return
end
if self:GetMouseOverControl() then
return true
end
local x, y = self:GetPos()
local width, height = self:GetSize()
local cursorX, cursorY = GetCursorPos()
return cursorX >= x and cursorY >= y and cursorX < x + width and cursorY < y + height
return self:IsMouseInBounds() or self:GetMouseOverControl()
end
function BuildListClass:Draw(viewPort)

View File

@@ -15,10 +15,7 @@ function ButtonClass:IsMouseOver()
if not self:IsShown() then
return false
end
local x, y = self:GetPos()
local width, height = self:GetSize()
local cursorX, cursorY = GetCursorPos()
return cursorX >= x and cursorY >= y and cursorX < x + width and cursorY < y + height
return self:IsMouseInBounds()
end
function ButtonClass:Draw()

View File

@@ -23,13 +23,7 @@ function CalcBreakdownClass:IsMouseOver()
if not self:IsShown() then
return
end
if self:GetMouseOverControl() then
return true
end
local x, y = self:GetPos()
local width, height = self:GetSize()
local cursorX, cursorY = GetCursorPos()
return cursorX >= x and cursorY >= y and cursorX < x + width and cursorY < y + height
return self:IsMouseInBounds() or self:GetMouseOverControl()
end
function CalcBreakdownClass:SetBreakdownData(displayData, pinned)
@@ -354,6 +348,8 @@ function CalcBreakdownClass:FormatModValue(value, modType)
else
return -value.."% less"
end
elseif modType == "FLAG" then
return value and "True" or "False"
else
return value
end

View File

@@ -50,11 +50,9 @@ function CalcSectionClass:IsMouseOver()
if self:GetMouseOverControl() then
return true
end
local x, y = self:GetPos()
local width, height = self:GetSize()
local cursorX, cursorY = GetCursorPos()
local mOver = cursorX >= x and cursorY >= y and cursorX < x + width and cursorY < y + height
local mOver = self:IsMouseInBounds()
if mOver and not self.collapsed and self.enabled then
local cursorX, cursorY = GetCursorPos()
for _, data in ipairs(self.data) do
if data.enabled then
for _, colData in ipairs(data) do

View File

@@ -15,10 +15,7 @@ function CheckBoxClass:IsMouseOver()
if not self:IsShown() then
return false
end
local x, y = self:GetPos()
local width, height = self:GetSize()
local cursorX, cursorY = GetCursorPos()
return cursorX >= x and cursorY >= y and cursorX < x + width and cursorY < y + height
return self:IsMouseInBounds()
end
function CheckBoxClass:Draw(viewPort)

View File

@@ -85,6 +85,13 @@ function ControlClass:IsEnabled()
return self:GetProperty("enabled")
end
function ControlClass:IsMouseInBounds()
local x, y = self:GetPos()
local width, height = self:GetSize()
local cursorX, cursorY = GetCursorPos()
return cursorX >= x and cursorY >= y and cursorX < x + width and cursorY < y + height
end
function ControlClass:SetFocus(focus)
if focus ~= self.hasFocus then
if focus and self.OnFocusGained then

View File

@@ -49,13 +49,7 @@ function EditClass:IsMouseOver()
if not self:IsShown() then
return false
end
if self:GetMouseOverControl() then
return true
end
local x, y = self:GetPos()
local width, height = self:GetSize()
local cursorX, cursorY = GetCursorPos()
return cursorX >= x and cursorY >= y and cursorX < x + width and cursorY < y + height
return self:IsMouseInBounds() or self:GetMouseOverControl()
end
function EditClass:SelectAll()

View File

@@ -164,13 +164,7 @@ function ItemDBClass:IsMouseOver()
if not self:IsShown() then
return
end
if self:GetMouseOverControl() then
return true
end
local x, y = self:GetPos()
local width, height = self:GetSize()
local cursorX, cursorY = GetCursorPos()
return cursorX >= x and cursorY >= y and cursorX < x + width and cursorY < y + height
return self:IsMouseInBounds() or self:GetMouseOverControl()
end
function ItemDBClass:Draw(viewPort)

View File

@@ -32,13 +32,7 @@ function ItemListClass:IsMouseOver()
if not self:IsShown() then
return
end
if self:GetMouseOverControl() then
return true
end
local x, y = self:GetPos()
local width, height = self:GetSize()
local cursorX, cursorY = GetCursorPos()
return cursorX >= x and cursorY >= y and cursorX < x + width and cursorY < y + height
return self:IsMouseInBounds() or self:GetMouseOverControl()
end
function ItemListClass:Draw(viewPort)

View File

@@ -172,4 +172,3 @@ function ModListClass:Print()
ConPrintf("%s|%s", modLib.formatMod(mod), mod.source or "?")
end
end

View File

@@ -59,13 +59,14 @@ function PassiveTreeViewClass:Draw(build, viewPort, inputEvents)
local spec = build.spec
local cursorX, cursorY = GetCursorPos()
local mOver = cursorX >= viewPort.x and cursorX < viewPort.x + viewPort.width and cursorY >= viewPort.y and cursorY < viewPort.y + viewPort.height
-- Process input events
local treeClick
for id, event in ipairs(inputEvents) do
if event.type == "KeyDown" then
if event.key == "LEFTBUTTON" then
if cursorX >= viewPort.x and cursorX < viewPort.x + viewPort.width and cursorY >= viewPort.y and cursorY < viewPort.y + viewPort.height then
if mOver then
-- Record starting coords of mouse drag
-- Dragging won't actually commence unless the cursor moves far enough
self.dragX, self.dragY = cursorX, cursorY
@@ -79,13 +80,15 @@ function PassiveTreeViewClass:Draw(build, viewPort, inputEvents)
-- Mouse button went down, but didn't move far enough to trigger drag, so register a normal click
treeClick = "LEFT"
end
elseif event.key == "RIGHTBUTTON" then
treeClick = "RIGHT"
elseif event.key == "WHEELUP" then
self:Zoom(IsKeyDown("SHIFT") and 3 or 1, viewPort)
elseif event.key == "WHEELDOWN" then
self:Zoom(IsKeyDown("SHIFT") and -3 or -1, viewPort)
end
elseif mOver then
if event.key == "RIGHTBUTTON" then
treeClick = "RIGHT"
elseif event.key == "WHEELUP" then
self:Zoom(IsKeyDown("SHIFT") and 3 or 1, viewPort)
elseif event.key == "WHEELDOWN" then
self:Zoom(IsKeyDown("SHIFT") and -3 or -1, viewPort)
end
end
end
end
@@ -130,7 +133,7 @@ function PassiveTreeViewClass:Draw(build, viewPort, inputEvents)
end
local hoverNode
if cursorX >= viewPort.x and cursorX < viewPort.x + viewPort.width and cursorY >= viewPort.y and cursorY < viewPort.y + viewPort.height then
if mOver then
-- Cursor is over the tree, check if it is over a node
local curTreeX, curTreeY = screenToTree(cursorX, cursorY)
for nodeId, node in pairs(spec.nodes) do

View File

@@ -51,13 +51,7 @@ function SkillListClass:IsMouseOver()
if not self:IsShown() then
return
end
if self:GetMouseOverControl() then
return true
end
local x, y = self:GetPos()
local width, height = self:GetSize()
local cursorX, cursorY = GetCursorPos()
return cursorX >= x and cursorY >= y and cursorX < x + width and cursorY < y + height
return self:IsMouseInBounds() or self:GetMouseOverControl()
end
function SkillListClass:Draw(viewPort)

View File

@@ -21,13 +21,7 @@ function TextListClass:IsMouseOver()
if not self:IsShown() then
return
end
if self:GetMouseOverControl() then
return true
end
local x, y = self:GetPos()
local width, height = self:GetSize()
local cursorX, cursorY = GetCursorPos()
return cursorX >= x and cursorY >= y and cursorX < x + width and cursorY < y + height
return self:IsMouseInBounds() or self:GetMouseOverControl()
end
function TextListClass:Draw(viewPort)

View File

@@ -3218,7 +3218,11 @@ gems["Righteous Fire"] = {
area = true,
fire = true,
setupFunc = function(env, output)
env.mainSkill.skillData.FireDot = (output.Life + output.EnergyShield) * 0.5
if env.mainSkill.skillFlags.totem then
env.mainSkill.skillData.FireDot = output.TotemLife * 0.5
else
env.mainSkill.skillData.FireDot = (output.Life + output.EnergyShield) * 0.5
end
end,
color = 3,
baseFlags = {

View File

@@ -9,6 +9,7 @@ local pairs = pairs
local ipairs = ipairs
local t_insert = table.insert
local m_min = math.min
local m_max = math.max
local buildMode = common.New("ControlHost")
@@ -83,6 +84,12 @@ function buildMode:Init(dbFileName, buildName)
DrawImage(nil, x + 1, y + 1, strW, 18)
SetDrawColor(1, 1, 1)
DrawString(x + 4, y + 2, "LEFT", 16, "FIXED", str)
if control:IsMouseInBounds() then
SetDrawLayer(nil, 10)
main:AddTooltipLine(16, "Required level: "..m_max(1, (100 + used - usedMax)))
main:DrawTooltip(x, y, control.width, control.height, main.viewPort)
SetDrawLayer(nil, 0)
end
end
self.controls.characterLevel = common.New("EditControl", {"LEFT",self.anchorTopBarRight,"RIGHT"}, 0, 0, 106, 20, "", "Level", "[%d]", 3, function(buf)
self.characterLevel = tonumber(buf) or 1

View File

@@ -280,7 +280,7 @@ return {
{ label = "Total Increased", { format = "{0:mod:1}%", { modName = { "Evasion", "ArmourAndEvasion", "Defences" }, modType = "INC" }, }, },
{ label = "Total More", { format = "{0:mod:1}%", { modName = { "Evasion", "ArmourAndEvasion", "Defences" }, modType = "MORE" }, }, },
{ label = "Total", { format = "{0:output:Evasion}", { breakdown = "Evasion" }, }, },
{ label = "Evade Chance", { format = "{0:output:EvadeChance}%", { breakdown = "EvadeChance" }, { label = "Enemy Accuracy modifiers", modName = "Accuracy", enemy = true }, }, },
{ label = "Evade Chance", { format = "{0:output:EvadeChance}%", { breakdown = "EvadeChance" }, { modName = { "CannotEvade" } }, { label = "Enemy Accuracy modifiers", modName = "Accuracy", enemy = true }, }, },
} },
{ 1, "Resist", 3, "Resists", data.colorCodes.DEFENCE, {
extra = data.colorCodes.FIRE.."{0:output:FireResist}+{0:output:FireResistOverCap}^7/"..data.colorCodes.COLD.."{0:output:ColdResist}+{0:output:ColdResistOverCap}^7/"..data.colorCodes.LIGHTNING.."{0:output:LightningResist}+{0:output:LightningResistOverCap}",

View File

@@ -3,7 +3,7 @@
-- Module: Calcs
-- Performs all the offense and defense calculations.
-- Here be dragons!
-- This file is 2500 lines long, over half of which is in one function...
-- This file is 2400 lines long, over half of which is in one function...
--
local pairs = pairs
@@ -916,7 +916,7 @@ local function mergeMainMods(env, repSlotName, repItem)
end
-- Finalise environment and perform the calculations
-- This function is 1400 lines long. Enjoy!
-- This function is 1300 lines long. Enjoy!
local function performCalcs(env)
local modDB = env.modDB
local enemyDB = env.enemyDB
@@ -1036,7 +1036,7 @@ local function performCalcs(env)
-- Merge auxillary modifiers
if env.mode_buffs then
if activeSkill.buffModList then
if activeSkill.buffModList and not activeSkill.skillFlags.totem then
if activeSkill.activeGem.data.golem and modDB:Sum("FLAG", skillCfg, "LiegeOfThePrimordial") and (activeSkill.activeGem.data.fire or activeSkill.activeGem.data.cold or activeSkill.activeGem.data.lightning) then
modDB:ScaleAddList(activeSkill.buffModList, 2)
else
@@ -1167,9 +1167,9 @@ local function performCalcs(env)
if inc ~= 0 or more ~= 1 or (base ~= 0 and extraBase ~= 0) then
local out = { }
if base ~= 0 and extraBase ~= 0 then
out[1] = "("..round(extraBase, 2).." + "..round(base, 2)..") ^8(base)"
out[1] = s_format("(%g + %g) ^8(base)", extraBase, base)
else
out[1] = round(base + extraBase, 2).." ^8(base)"
out[1] = s_format("%g ^8(base)", base + extraBase)
end
if inc ~= 0 then
t_insert(out, s_format("x %.2f", 1 + inc/100).." ^8(increased/reduced)")
@@ -1177,7 +1177,7 @@ local function performCalcs(env)
if more ~= 1 then
t_insert(out, s_format("x %.2f", more).." ^8(more/less)")
end
t_insert(out, "= "..output[...])
t_insert(out, s_format("= %g", output[...]))
breakdown[...] = out
end
end
@@ -1210,18 +1210,18 @@ local function performCalcs(env)
local out = { }
local resistForm = (damageType == "Physical") and "physical damage reduction" or "resistance"
if resist ~= 0 then
t_insert(out, "Enemy "..resistForm..": "..resist.."%")
t_insert(out, s_format("Enemy %s: %d%%", resistForm, resist))
end
if pen ~= 0 then
t_insert(out, "Effective resistance:")
t_insert(out, resist.."% ^8(resistance)")
t_insert(out, "- "..pen.."% ^8(penetration)")
t_insert(out, "= "..(resist-pen).."%")
t_insert(out, s_format("%d%% ^8(resistance)", resist))
t_insert(out, s_format("- %d%% ^8(penetration)", pen))
t_insert(out, s_format("= %d%%", resist - pen))
end
if (resist - pen) ~= 0 and taken ~= 0 then
t_insert(out, "Effective DPS modifier:")
t_insert(out, (1 - (resist - pen) / 100).." ^8("..resistForm..")")
t_insert(out, "x "..(1 + taken / 100).." ^8(increased/reduced damage taken)")
t_insert(out, s_format("%.2f ^8(%s)", 1 - (resist - pen) / 100, resistForm))
t_insert(out, s_format("x %.2f ^8(increased/reduced damage taken)", 1 + taken / 100))
t_insert(out, s_format("= %.3f", mult))
end
return out
@@ -1251,7 +1251,7 @@ local function performCalcs(env)
-- Add attribute bonuses
modDB:NewMod("Life", "BASE", m_floor(output.Str / 2), "Strength")
local strDmgBonus = round((output.Str + modDB:Sum("BASE", nil, "DexIntToMeleeBonus", 0)) / 5)
local strDmgBonus = round((output.Str + modDB:Sum("BASE", nil, "DexIntToMeleeBonus")) / 5)
modDB:NewMod("PhysicalDamage", "INC", strDmgBonus, "Strength", ModFlag.Melee)
modDB:NewMod("Accuracy", "BASE", output.Dex * 2, "Dexterity")
if not modDB:Sum("FLAG", nil, "IronReflexes") then
@@ -1414,9 +1414,9 @@ local function performCalcs(env)
output.EvadeChance = 100 - calcHitChance(output.Evasion, enemyAccuracy)
if breakdown then
breakdown.EvadeChance = {
"Enemy level: "..env.enemyLevel..(env.configInput.enemyLevel and " ^8(overridden from the Configuration tab" or " ^8(can be overridden in the Configuration tab)"),
"Average enemy accuracy: "..enemyAccuracy,
"Approximate evade chance: "..output.EvadeChance.."%",
s_format("Enemy level: %d ^8(%s the Configuration tab)", env.enemyLevel, env.configInput.enemyLevel and "overridden from" or "can be overridden in"),
s_format("Average enemy accuracy: %d", enemyAccuracy),
s_format("Approximate evade chance: %d%%", output.EvadeChance),
}
end
end
@@ -1806,9 +1806,9 @@ local function performCalcs(env)
local convMult = env.conversionTable[damageType].mult
if breakdown then
t_insert(breakdown[damageType], "Hit damage:")
t_insert(breakdown[damageType], ""..min.." to "..max.." ^8(total damage)")
t_insert(breakdown[damageType], s_format("%d to %d ^8(total damage)", min, max))
if convMult ~= 1 then
t_insert(breakdown[damageType], "x "..convMult.." ^8("..((1-convMult)*100).."% converted to other damage types)")
t_insert(breakdown[damageType], s_format("x %g ^8(%g%% converted to other damage types)", convMult, (1-convMult)*100))
end
end
min = min * convMult
@@ -1843,7 +1843,7 @@ local function performCalcs(env)
end
end
if breakdown then
t_insert(breakdown[damageType], "= "..round(min).." to "..round(max))
t_insert(breakdown[damageType], s_format("= %d to %d", min, max))
end
else
min, max = 0, 0
@@ -1910,28 +1910,29 @@ local function performCalcs(env)
do
local more = m_floor(modDB:Sum("MORE", skillCfg, "ManaCost") * 100 + 0.0001) / 100
local inc = modDB:Sum("INC", skillCfg, "ManaCost")
output.ManaCost = m_floor(m_max(0, (skillData.manaCost or 0) * more * (1 + inc / 100) - modDB:Sum("BASE", skillCfg, "ManaCost")))
local base = modDB:Sum("BASE", skillCfg, "ManaCost")
output.ManaCost = m_floor(m_max(0, (skillData.manaCost or 0) * more * (1 + inc / 100) - base))
if breakdown and output.ManaCost ~= (skillData.manaCost or 0) then
breakdown.ManaCost = {
(skillData.manaCost or 0).." ^8(base mana cost)",
s_format("%d ^8(base mana cost)", skillData.manaCost or 0)
}
if more ~= 1 then
t_insert(breakdown.ManaCost, "x "..more.." ^8(mana cost multiplier)")
t_insert(breakdown.ManaCost, s_format("x %.2f ^8(mana cost multiplier)", more))
end
if inc ~= 0 then
t_insert(breakdown.ManaCost, "x "..(1 + inc/100).." ^8(increased/reduced mana cost)")
end
local base = modDB:Sum("BASE", skillCfg, "ManaCost")
t_insert(breakdown.ManaCost, s_format("x %.2f ^8(increased/reduced mana cost)", 1 + inc/100))
end
if base ~= 0 then
t_insert(breakdown.ManaCost, "- "..base.." ^8(- mana cost)")
t_insert(breakdown.ManaCost, s_format("- %d ^8(- mana cost)", base))
end
t_insert(breakdown.ManaCost, "= " .. output.ManaCost)
t_insert(breakdown.ManaCost, s_format("= %d", output.ManaCost))
end
end
-- Calculate skill DOT components
local dotCfg = {
skillName = skillCfg.skillName,
slotName = skillCfg.slotName,
flags = bor(band(skillCfg.flags, ModFlag.SourceMask), ModFlag.Dot, skillData.dotIsSpell and ModFlag.Spell or 0),
keywordFlags = skillCfg.keywordFlags
}
@@ -1966,13 +1967,14 @@ local function performCalcs(env)
end
local inc = modDB:Sum("INC", dotCfg, "Damage", damageType.."Damage", isElemental[damageType] and "ElementalDamage" or nil)
local more = round(modDB:Sum("MORE", dotCfg, "Damage", damageType.."Damage", isElemental[damageType] and "ElementalDamage" or nil), 2)
output[damageType.."Dot"] = baseVal * (1 + inc/100) * more * effMult
local total = baseVal * (1 + inc/100) * more * effMult
output[damageType.."Dot"] = total
output.TotalDot = output.TotalDot + total
if breakdown then
breakdown[damageType.."Dot"] = { }
dotBreakdown(breakdown[damageType.."Dot"], baseVal, inc, more, effMult, output[damageType.."Dot"])
dotBreakdown(breakdown[damageType.."Dot"], baseVal, inc, more, effMult, total)
end
end
output.TotalDot = output.TotalDot + (output[damageType.."Dot"] or 0)
end
-- Calculate bleeding chance and damage
@@ -1982,6 +1984,7 @@ local function performCalcs(env)
skillFlags.bleed = true
skillFlags.duration = true
local dotCfg = {
slotName = skillCfg.slotName,
flags = bor(band(skillCfg.flags, ModFlag.SourceMask), ModFlag.Dot, skillData.dotIsSpell and ModFlag.Spell or 0),
keywordFlags = bor(skillCfg.keywordFlags, KeywordFlag.Bleed)
}
@@ -2035,6 +2038,7 @@ local function performCalcs(env)
skillFlags.poison = true
skillFlags.duration = true
local dotCfg = {
slotName = skillCfg.slotName,
flags = bor(band(skillCfg.flags, ModFlag.SourceMask), ModFlag.Dot, skillData.dotIsSpell and ModFlag.Spell or 0),
keywordFlags = bor(skillCfg.keywordFlags, KeywordFlag.Poison)
}
@@ -2109,6 +2113,7 @@ local function performCalcs(env)
if canDeal.Fire and output.IgniteChance > 0 and sourceDmg > 0 then
skillFlags.ignite = true
local dotCfg = {
slotName = skillCfg.slotName,
flags = bor(band(skillCfg.flags, ModFlag.SourceMask), ModFlag.Dot, skillData.dotIsSpell and ModFlag.Spell or 0),
keywordFlags = skillCfg.keywordFlags,
}
@@ -2373,7 +2378,7 @@ function calcs.buildOutput(build, mode)
end
elseif mode == "CALCS" then
-- Calculate XP modifier
--[[ FIXME
--[[ FIXME?
if input.monster_level and input.monster_level > 0 then
local playerLevel = build.characterLevel
local diff = m_abs(playerLevel - input.monster_level) - 3 - m_floor(playerLevel / 16)

View File

@@ -49,7 +49,7 @@ 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.0 - 2016/11/01
### 1.2.0 - 2016/11/02
With this update, the program's internal modifier system has been completely overhauled.
On its own this overhaul doesn't change much from the user's perspective, but it has opened the way for some
significant upgrades:
@@ -82,6 +82,7 @@ Other changes:
* Some options now have tooltips that explain aspects of their function
* The new class background artworks have been added to the passive skill tree
* Unsupported modifiers are now shown in red instead of white to help convey the fact that they won't work
* The required level for a build's passive tree is now shown when hovering over the points display
* Support gem compatability is now determined using the same data the game itself uses, and should now be 100% accurate
### 1.1.11 - 2016/10/25

View File

@@ -1,4 +1,4 @@
VERSION[1.2.0][2016/11/01]
VERSION[1.2.0][2016/11/02]
With this update, the program's internal modifier system has been completely overhauled.
On its own this overhaul doesn't change much from the user's perspective, but it has opened the way for some
significant upgrades:
@@ -31,6 +31,7 @@ Other changes:
* Some options now have tooltips that explain aspects of their function
* The new class background artworks have been added to the passive skill tree
* Unsupported modifiers are now shown in red instead of white to help convey the fact that they won't work
* The required level for a build's passive tree is now shown when hovering over the points display
* Support gem compatability is now determined using the same data the game itself uses, and should now be 100% accurate
VERSION[1.1.11][2016/10/25]
* Added flat mana to ES armour rare templates

View File

@@ -7,44 +7,44 @@
<File sha1="6bb074e0d3a4043f0e5dcbd25c33f8e5e1f5cfe0" name="Launch.lua" part="program"/>
<File sha1="93e19c2a160eb49993d50d9e2b47ea79962373d9" name="UpdateCheck.lua" part="program"/>
<File sha1="4f17937f2b37784e169a3792b235f2a0a3961e61" name="UpdateApply.lua" part="program"/>
<File sha1="58cdc6d82a5f5fac055f048d6b48ea2fba323276" name="changelog.txt" part="program"/>
<File sha1="aef7145f378d0a1d5dc6f5f2d3c08d2a1b6ef264" name="Classes/BuildListControl.lua" part="program"/>
<File sha1="f41793d6cbf037cddab2079bf9445cf096e295cf" name="Classes/ButtonControl.lua" part="program"/>
<File sha1="4f43a9507cf7e18f07d2f19fda9f83e12558c407" name="Classes/CalcBreakdownControl.lua" part="program"/>
<File sha1="5bb6ef0eb3a0fa5f7ef88fecffadddd95013cd2a" name="Classes/CalcSectionControl.lua" part="program"/>
<File sha1="00fd324c3bd6292e6bcf50eb237846d8504ee0ae" name="changelog.txt" part="program"/>
<File sha1="ea886e9e8ce013ed7d8805174d43becdca1f533e" name="Classes/BuildListControl.lua" part="program"/>
<File sha1="e42437dd7e1b5a1032f1be9852ede4399a003826" name="Classes/ButtonControl.lua" part="program"/>
<File sha1="9b458889148f4cf0e521e2d1090213da84bf3176" name="Classes/CalcBreakdownControl.lua" part="program"/>
<File sha1="7584ee2977e9e4d1351fdc80caa700301d422e7b" name="Classes/CalcSectionControl.lua" part="program"/>
<File sha1="dd707e5d9fefe00cbbbd51cefa94b6de04347b65" name="Classes/CalcsTab.lua" part="program"/>
<File sha1="c8c603b9cae464de06f04dd6ab2e0530dc897bbc" name="Classes/CheckBoxControl.lua" part="program"/>
<File sha1="690f0d9d9ba0cd8092eb660d5d83bb0b9ad9f37d" name="Classes/CheckBoxControl.lua" part="program"/>
<File sha1="130c54c6f5ea929d90128fbd576191833b995dab" name="Classes/ConfigTab.lua" part="program"/>
<File sha1="e71f8367d62de41b0b80b764ddced8fb80f50ce7" name="Classes/Control.lua" part="program"/>
<File sha1="bbb08f183746d6ec023e2bd08fb7a89d365381da" name="Classes/Control.lua" part="program"/>
<File sha1="ae55fe1093e727872bc01cc94fa987395f944313" name="Classes/ControlHost.lua" part="program"/>
<File sha1="8305ea8d306a13160c369c474d19b05024a1f5ef" name="Classes/DropDownControl.lua" part="program"/>
<File sha1="db813fd5ec47e0fb8378962e219d9d86e9e11915" name="Classes/EditControl.lua" part="program"/>
<File sha1="83b030df704dc509cba978298526e03699d8ee3b" name="Classes/EditControl.lua" part="program"/>
<File sha1="dca9446ea1a4846f6de2147b25df7818826f9942" name="Classes/GemSelectControl.lua" part="program"/>
<File sha1="7a1150c0605ff912d8466e8c03fd242fd8140cfd" name="Classes/ImportTab.lua" part="program"/>
<File sha1="5f382e77c5f2321cfae45494f19f75445c92a06f" name="Classes/ItemDBControl.lua" part="program"/>
<File sha1="84ddcc1358c4c6a9c7f047cc882031d0696533d7" name="Classes/ItemListControl.lua" part="program"/>
<File sha1="3b66dcf4b639a99692463ed28a8ba4dc31b332fa" name="Classes/ItemDBControl.lua" part="program"/>
<File sha1="1d35b4c7c20bb6380c8b739658101fb1bf37cc3c" name="Classes/ItemListControl.lua" part="program"/>
<File sha1="b547357491a4faec1d007ae44604b75e05a2613c" name="Classes/ItemSlotControl.lua" part="program"/>
<File sha1="e470dc81148fc9079a0a31ea3b24f5f04754c331" name="Classes/ItemsTab.lua" part="program"/>
<File sha1="e577edeea7685cb2b0cd0d00b901a458ae45add0" name="Classes/LabelControl.lua" part="program"/>
<File sha1="a26d1a34424222856ad018ac43e3c7895d7f05b5" name="Classes/ModDB.lua" part="program"/>
<File sha1="5d8eda690e99ec64bda7379d3d4f8952a21b361a" name="Classes/ModList.lua" part="program"/>
<File sha1="a3ed881ebe1ed7c8931675937b4661d77decc316" name="Classes/ModList.lua" part="program"/>
<File sha1="6f8f98d6ee505af53441c1fe9ad74fbff86d56ad" name="Classes/PassiveSpec.lua" part="program"/>
<File sha1="9a6bce38a62d9c07851cdd095e91f088e37cea4e" name="Classes/PassiveTree.lua" part="program"/>
<File sha1="98496bc834a2a7e46210f7ad8f3e7b3954ae2582" name="Classes/PassiveTreeView.lua" part="program"/>
<File sha1="93dbcaa94237666391a2259a18834b7c479d14bb" name="Classes/PassiveTreeView.lua" part="program"/>
<File sha1="b5d4e4e7cedcabefa029cdefc74db5ac0a82d87f" name="Classes/PopupDialog.lua" part="program"/>
<File sha1="86fee3127d9520144fc741f6fccc3c1d9f1aa532" name="Classes/ScrollBarControl.lua" part="program"/>
<File sha1="261dcf54a4542e6160fd7024d8edf4fc095d9c71" name="Classes/SectionControl.lua" part="program"/>
<File sha1="e42ef80c046adbb0aa0c193f7849fe18f172fdc1" name="Classes/SkillListControl.lua" part="program"/>
<File sha1="ae0f25f993f6f5950469c34e4e2b9b441b5ad5f5" name="Classes/SkillListControl.lua" part="program"/>
<File sha1="272f67304f7f41b6335e19b14479e131c54766fe" name="Classes/SkillsTab.lua" part="program"/>
<File sha1="6317bd9ba391832dccafcb62409a5ce2988d1928" name="Classes/SliderControl.lua" part="program"/>
<File sha1="80527e0e05c986355ce7af2ba026538aec99a63a" name="Classes/SlotSelectControl.lua" part="program"/>
<File sha1="844b8915ca0f2e6af82f2d15978af131a33ad50e" name="Classes/TextListControl.lua" part="program"/>
<File sha1="a4f9cc96ba474d0a75c768a0eabec92837e027cf" name="Classes/TextListControl.lua" part="program"/>
<File sha1="8b8fbea27b00c702ea7bcffa6945cc814cc2fa41" name="Classes/TreeTab.lua" part="program"/>
<File sha1="4b7675c8b4fe71cade7dd3d70793df1ed8022d01" name="Classes/UndoHandler.lua" part="program"/>
<File sha1="11f9b77ce58cd280d93aacbebda6441d4252a965" name="Modules/Build.lua" part="program"/>
<File sha1="360f76ab20204acf85b000c68c981d96132d7c8c" name="Modules/Build.lua" part="program"/>
<File sha1="c03a7796aea3e9aa832fbb92c1f674ef5af690ca" name="Modules/BuildList.lua" part="program"/>
<File sha1="ff32e69e1dc620b91c25579a762a21cebe0fd1df" name="Modules/Calcs.lua" part="program"/>
<File sha1="c975dd78022d928b44d2b5647382b15e60bea100" name="Modules/CalcSections.lua" part="program"/>
<File sha1="a3530c34fe9c7e21992cf4e3b6d52cdc3aaf39a8" name="Modules/Calcs.lua" part="program"/>
<File sha1="99148774ffc1c326f3a50e7d8b3f7a68fe1ede57" name="Modules/CalcSections.lua" part="program"/>
<File sha1="f207df4010cb3c7bc6cce98be2529a3b8a708b8f" name="Modules/Common.lua" part="program"/>
<File sha1="132f51b4be7890360f478df52bc6c77772db75cc" name="Modules/Data.lua" part="program"/>
<File sha1="5ddfa4a5904cefbf2755c231797175c8ae24ac49" name="Modules/ItemTools.lua" part="program"/>
@@ -56,7 +56,7 @@
<File sha1="698c46ec242133014f6904d276b27106580ea392" name="Data/New.lua" part="program"/>
<File sha1="4bda866bb45169b51bd193039a87d7bcc6cbacaa" name="Data/Rares.lua" part="program"/>
<File sha1="48ae2fa7c8fb4de252e264431eb5d80bf835d566" name="Data/Gems/act_dex.lua" part="program"/>
<File sha1="24e96dbdd899bb6a550bbc9735b0598b440c510a" name="Data/Gems/act_int.lua" part="program"/>
<File sha1="74e0fa3fc4d905a5621f45192438aee722146e3e" name="Data/Gems/act_int.lua" part="program"/>
<File sha1="bec392131a513e81be5119805a94ef362bcf56ce" name="Data/Gems/act_str.lua" part="program"/>
<File sha1="f6d7bc0e523b7d97fd3f2a8d2f09476716757ce1" name="Data/Gems/other.lua" part="program"/>
<File sha1="5b3d32761bd9ca5acf06aeecdc86d1cb01182c0f" name="Data/Gems/sup_dex.lua" part="program"/>