Release 1.0.27

- More uniques updated
- Fixed range on Leo ES Recharge on rings
- Added combobox to skill gem name
- Added percent inc/dec to some stat comparisons
This commit is contained in:
Openarl
2016-09-12 21:46:34 +10:00
parent 778e36fd7b
commit b53811ac2a
15 changed files with 300 additions and 47 deletions

View File

@@ -199,7 +199,7 @@ function EditClass:OnKeyDown(key, doubleClick)
end
local shift = IsKeyDown("SHIFT")
if key == "LEFTBUTTON" then
if not self:IsMouseOver() then
if not self.Object:IsMouseOver() then
return
end
if doubleClick then
@@ -288,7 +288,8 @@ function EditClass:OnKeyDown(key, doubleClick)
end
end
elseif key == "TAB" then
return self:TabAdvance(shift and -1 or 1)
local newSel = self.Object:TabAdvance(shift and -1 or 1)
return newSel
end
return self
end

View File

@@ -0,0 +1,228 @@
-- Path of Building
--
-- Class: Gem Select
-- Gem selection combobox
--
local launch, main = ...
local t_insert = table.insert
local t_sort = table.sort
local m_min = math.min
local m_max = math.max
local m_floor = math.floor
local GemSelectClass = common.NewClass("GemSelectControl", "EditControl", function(self, anchor, x, y, width, height, changeFunc)
self.EditControl(anchor, x, y, width, height)
self.controls.scrollBar = common.New("ScrollBarControl", {"TOPRIGHT",self,"TOPRIGHT"}, -1, 0, 16, 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, 10) + 2
end
self.controls.scrollBar.shown = function()
return self.dropped and self.controls.scrollBar.enabled
end
self.list = { }
self.gemChangeFunc = changeFunc
self.changeFunc = function()
self.dropped = true
self.selIndex = 0
self:BuildList()
self.gemChangeFunc(self.buf)
end
end)
function GemSelectClass:BuildList()
self.controls.scrollBar.offset = 0
wipeTable(self.list)
self.searchStr = self.buf
if self.searchStr:match("%S") then
-- Search for gem name using increasingly broad search patterns
local patternList = {
"^ "..self.searchStr:gsub("%a", function(a) return "["..a:upper()..a:lower().."]" end).."$", -- Exact match (case-insensitive)
"^"..self.searchStr:gsub("%a", " %0%%l+").."$", -- Simple abbreviation ("CtF" -> "Cold to Fire")
"^"..self.searchStr:gsub(" ",""):gsub("%l", "%%l*%0").."%l+$", -- Abbreviated words ("CldFr" -> "Cold to Fire")
"^"..self.searchStr:gsub(" ",""):gsub("%a", ".*%0"), -- Global abbreviation ("CtoF" -> "Cold to Fire")
"^"..self.searchStr:gsub(" ",""):gsub("%a", function(a) return ".*".."["..a:upper()..a:lower().."]" end), -- Case insensitive global abbreviation ("ctof" -> "Cold to Fire")
}
for i, pattern in ipairs(patternList) do
for name in pairs(data.gems) do
if name ~= "_default" and (" "..name):match(pattern) then
t_insert(self.list, name)
end
end
if self.list[1] then
break
end
end
else
for name in pairs(data.gems) do
if name ~= "_default" then
t_insert(self.list, name)
end
end
end
if not self.list[1] then
self.list[1] = "<No matches>"
end
t_sort(self.list)
end
function GemSelectClass: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()
local dropExtra = self.dropped and (height - 4) * m_min(#self.list, 10) + 2 or 0
local mOver = cursorX >= x and cursorY >= y and cursorX < x + width and cursorY < y + height + dropExtra
local mOverComp
if mOver then
if cursorY < y + height then
mOverComp = "BODY"
else
mOverComp = "DROP"
end
end
return mOver, mOverComp
end
function GemSelectClass:Draw(viewPort)
self.EditControl:Draw(viewPort)
local x, y = self:GetPos()
local width, height = self:GetSize()
local enabled = self:IsEnabled()
local mOver, mOverComp = self:IsMouseOver()
local dropHeight = (height - 4) * m_min(#self.list, 10)
local scrollBar = self.controls.scrollBar
scrollBar:SetContentDimension((height - 4) * #self.list, dropHeight)
if self.dropped then
SetDrawLayer(nil, 5)
SetDrawColor(1, 1, 1)
DrawImage(nil, x, y + height, width, dropHeight + 4)
SetDrawColor(0, 0, 0)
DrawImage(nil, x + 1, y + height + 1, width - 2, dropHeight + 2)
SetDrawLayer(nil, 0)
end
if self.dropped then
SetDrawLayer(nil, 5)
local cursorX, cursorY = GetCursorPos()
self.hoverSel = mOver and math.floor((cursorY - y - height + scrollBar.offset) / (height - 4)) + 1
if self.hoverSel and self.hoverSel < 1 then
self.hoverSel = nil
end
SetViewport(x + 2, y + height + 2, width - 4, dropHeight)
local minIndex = m_floor(scrollBar.offset / 16 + 1)
local maxIndex = m_min(m_floor((scrollBar.offset + dropHeight) / 16 + 1), #self.list)
for index = minIndex, maxIndex do
local y = (index - 1) * (height - 4) - scrollBar.offset
if index == self.hoverSel or index == self.selIndex then
SetDrawColor(0.33, 0.33, 0.33)
DrawImage(nil, 0, y, width - 4, height - 4)
end
SetDrawColor(1, 1, 1)
local gemData = data.gems[self.list[index]]
if gemData then
if gemData.strength then
SetDrawColor(data.colorCodes.STRENGTH)
elseif gemData.dexterity then
SetDrawColor(data.colorCodes.DEXTERITY)
elseif gemData.intelligence then
SetDrawColor(data.colorCodes.INTELLIGENCE)
end
end
DrawString(0, y, "LEFT", height - 4, "VAR", self.list[index])
end
SetViewport()
self:DrawControls(viewPort)
SetDrawLayer(nil, 0)
end
end
function GemSelectClass:OnFocusGained()
self.EditControl:OnFocusGained()
if not self.dropped then
self.dropped = true
self.selIndex = 0
self:BuildList()
end
end
function GemSelectClass:OnFocusLost()
self.dropped = false
end
function GemSelectClass:OnKeyDown(key, doubleClick)
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 self.dropped then
if key:match("BUTTON") and not self:IsMouseOver() then
self.dropped = false
return
end
if key == "LEFTBUTTON" then
if self.hoverSel and data.gems[self.list[self.hoverSel]] then
self.dropped = false
self:SetText(self.list[self.hoverSel])
self.gemChangeFunc(self.buf)
return self
end
elseif key == "RETURN" then
self.dropped = false
return self
elseif key == "WHEELUP" then
self.controls.scrollBar:Scroll(-1)
elseif key == "WHEELDOWN" then
self.controls.scrollBar:Scroll(1)
elseif key == "DOWN" then
if self.selIndex < #self.list then
self.selIndex = self.selIndex + 1
self:SetText(self.list[self.selIndex])
self.gemChangeFunc(self.buf)
end
elseif key == "UP" then
if self.selIndex > 0 then
self.selIndex = self.selIndex - 1
if self.selIndex == 0 then
self:SetText(self.searchStr)
else
self:SetText(self.list[self.selIndex])
end
self.gemChangeFunc(self.buf)
end
end
end
local newSel = self.EditControl:OnKeyDown(key, doubleClick)
return newSel == self.EditControl and self or newSel
end
function GemSelectClass: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
end
local newSel = self.EditControl:OnKeyUp(key)
return newSel == self.EditControl and self or newSel
end

View File

@@ -177,7 +177,7 @@ function SkillsTabClass:CreateGemSlot(index)
self.gemSlots[index] = slot
-- Gem name specification
slot.nameSpec = common.New("EditControl", nil, 0, 0, 200, 20, nil, nil, "[ %a']", 30, function(buf)
slot.nameSpec = common.New("GemSelectControl", nil, 0, 0, 250, 20, function(buf)
if not self.displaySkill.gemList[index] then
self.displaySkill.gemList[index] = { nameSpec = "", level = 1, quality = 0 }
end

View File

@@ -1479,6 +1479,7 @@ gems["Phase Run"] = {
}
}
gems["Poacher's Mark"] = {
dexterity = true,
curse = true,
spell = true,
aoe = true,
@@ -1900,6 +1901,7 @@ gems["Siege Ballista"] = {
}
}
gems["Smoke Mine"] = {
dexterity = true,
spell = true,
mine = true,
aoe = true,

View File

@@ -101,6 +101,7 @@ gems["Arctic Breath"] = {
}
}
gems["Assassin's Mark"] = {
intelligence = true,
curse = true,
spell = true,
aoe = true,

View File

@@ -1301,6 +1301,7 @@ gems["Shield Charge"] = {
}
}
gems["Shockwave Totem"] = {
strength = true,
spell = true,
totem = true,
aoe = true,

View File

@@ -79,13 +79,13 @@ Requires Level 65, 177 Str
50% increased Shock Duration on You
Take no Extra Damage from Critical Strikes
]],[[
Voidwalker
Voidwalker
Murder Boots
Evasion: (398)
Energy Shield: (54)
Evasion: (386 to 450)
Energy Shield: (52 to 61)
Requires Level 69, 82 Dex, 42 Int
+41 to Dexterity
147% increased Evasion and Energy Shield
+(30-50) to Dexterity
(140-180)% increased Evasion and Energy Shield
30% increased Movement Speed
20% chance to Avoid Projectiles while Phasing
You have Phasing if you've Killed Recently
@@ -120,9 +120,9 @@ Causes Bleeding on Melee Critical Strike
Obscurantis
Lion Pelt
Requires Level 70, 150 Dex
+495 to Accuracy Rating
112% increased Evasion Rating
+51 to maximum Life
+(300-500) to Accuracy Rating
(100-120)% increased Evasion Rating
+(50-80) to maximum Life
1% increased Projectile Attack Damage per 200 Accuracy Rating
]],[[
Slivertongue
@@ -130,7 +130,7 @@ Harbinger Bow
Bow
Requires Level 68, 212 Dex
(30 to 50)% increased Critical Strike Chance
Adds 70 to 200 Physical Damage
Adds (60-75) to (170-220) Physical Damage
100% increased Critical Strike Chance with arrows that Fork
Arrows that Pierce cause Bleeding
Arrows always Pierce after Chaining
@@ -139,8 +139,8 @@ Snakepit
Sapphire Ring
Requires Level 68
+(20 to 30)% to Cold Resistance
33% increased Cold Damage
7% increased Cast Speed
(20-40)% increased Cold Damage
(5-10)% increased Cast Speed
Spells have an additional Projectile
]],[[
Brain Rattler
@@ -163,7 +163,7 @@ Midnight Blade
One Handed Sword
Requires Level 68, 113 Str, 113 Dex
18% increased Accuracy Rating
Adds 72 to 127 Physical Damage
Adds (65-75) to (110-130) Physical Damage
100% increased Burning Damage if you've Ignited an Enemy Recently
Recovery 1% of Maximum Life when you Ignite an Enemy
100% increased Melee Physical Damage against Ignited Enemies
@@ -173,7 +173,7 @@ Citrine Amulet
Requires Level 68
+(16 to 24) to Strength and Dexterity
10% chance to Ignite
53% increased Damage while Ignited
(50-70)% increased Damage while Ignited
Take 100 Fire Damage when you Ignite an Enemy
2% of Fire Damage Leeched as Life while Ignited
]],[[
@@ -245,7 +245,7 @@ Crusader Gloves
Armour: (194)
Energy Shield: (57)
Requires Level 66, 51 Str, 51 Int
(85)% increased Armour and Energy Shield
(80-120)% increased Armour and Energy Shield
+2 Accuracy Rating per 2 Intelligence
+1 Life per 4 Dexterity
+1 Mana per 4 Strength

View File

@@ -81,7 +81,7 @@ Prefixes:
{range:0}Adds (0-22 to 0-40) Cold Damage to Attacks
{range:0}Adds (0-7 to 0-72) Lightning Damage to Attacks
{range:0}(0 to 42)% increased Elemental Damage with Weapons
{range:0}(10 to 20)% faster start of Energy Shield Recharge
{range:0}(0 to 20)% faster start of Energy Shield Recharge
Suffixes:
{str}
{dex}

View File

@@ -180,40 +180,41 @@ function buildMode:Init(dbFileName, buildName)
-- This defines the stats in the side bar, and also which stats show in node/item comparisons
-- This may be user-customisable in the future
self.displayStats = {
{ mod = "total_averageHit", label = "Average Hit", fmt = ".1f" },
{ mod = "total_speed", label = "Attack/Cast Rate", fmt = ".2f" },
{ mod = "total_averageHit", label = "Average Hit", fmt = ".1f", compPercent = true },
{ mod = "total_speed", label = "Attack/Cast Rate", fmt = ".2f", compPercent = true },
{ mod = "total_critChance", label = "Crit Chance", fmt = ".2f%%", pc = true },
{ mod = "total_critMultiplier", label = "Crit Multiplier", fmt = "d%%", pc = true },
{ mod = "total_hitChance", label = "Hit Chance", fmt = "d%%", pc = true, condFunc = function(v,o) return v < 1 end },
{ mod = "total_dps", label = "Total DPS", fmt = ".1f" },
{ mod = "total_damageDot", label = "DoT DPS", fmt = ".1f" },
{ mod = "bleed_dps", label = "Bleed DPS", fmt = ".1f" },
{ mod = "ignite_dps", label = "Ignite DPS", fmt = ".1f" },
{ mod = "poison_dps", label = "Poison DPS", fmt = ".1f" },
{ mod = "total_manaCost", label = "Mana Cost", fmt = "d" },
{ mod = "total_dps", label = "Total DPS", fmt = ".1f", compPercent = true },
{ mod = "total_damageDot", label = "DoT DPS", fmt = ".1f", compPercent = true },
{ mod = "bleed_dps", label = "Bleed DPS", fmt = ".1f", compPercent = true },
{ mod = "ignite_dps", label = "Ignite DPS", fmt = ".1f", compPercent = true },
{ mod = "poison_dps", label = "Poison DPS", fmt = ".1f", compPercent = true },
{ mod = "total_manaCost", label = "Mana Cost", fmt = "d", compPercent = true },
{ },
{ mod = "total_str", label = "Strength", fmt = "d" },
{ mod = "total_dex", label = "Dexterity", fmt = "d" },
{ mod = "total_int", label = "Intelligence", fmt = "d" },
{ },
{ mod = "total_life", label = "Total Life", fmt = "d" },
{ mod = "total_life", label = "Total Life", fmt = "d", compPercent = true },
{ mod = "spec_lifeInc", label = "%Inc Life from Tree", fmt = "d%%", condFunc = function(v,o) return v > 0 and o.total_life > 1 end },
{ mod = "total_lifeUnreserved", label = "Unreserved Life", fmt = "d", condFunc = function(v,o) return v < o.total_life end },
{ mod = "total_lifeUnreserved", label = "Unreserved Life", fmt = "d", condFunc = function(v,o) return v < o.total_life end, compPercent = true },
{ mod = "total_lifeUnreservedPercent", label = "Unreserved Life", fmt = "d%%", pc = true, condFunc = function(v,o) return v < 1 end },
{ mod = "total_lifeRegen", label = "Life Regen", fmt = ".1f" },
{ },
{ mod = "total_mana", label = "Total Mana", fmt = "d" },
{ mod = "total_mana", label = "Total Mana", fmt = "d", compPercent = true },
{ mod = "spec_manaInc", label = "%Inc Mana from Tree", fmt = "d%%" },
{ mod = "total_manaUnreserved", label = "Unreserved Mana", fmt = "d", condFunc = function(v,o) return v < o.total_mana end },
{ mod = "total_manaUnreserved", label = "Unreserved Mana", fmt = "d", condFunc = function(v,o) return v < o.total_mana end, compPercent = true },
{ mod = "total_manaUnreservedPercent", label = "Unreserved Mana", fmt = "d%%", pc = true, condFunc = function(v,o) return v < 1 end },
{ mod = "total_manaRegen", label = "Mana Regen", fmt = ".1f" },
{ },
{ mod = "total_energyShield", label = "Energy Shield", fmt = "d" },
{ mod = "total_energyShield", label = "Energy Shield", fmt = "d", compPercent = true },
{ mod = "spec_energyShieldInc", label = "%Inc ES from Tree", fmt = "d%%" },
{ mod = "total_energyShieldRegen", label = "Energy Shield Regen", fmt = ".1f" },
{ mod = "total_evasion", label = "Evasion rating", fmt = "d" },
{ mod = "total_evasion", label = "Evasion rating", fmt = "d", compPercent = true },
{ mod = "spec_evasionInc", label = "%Inc Evasion from Tree", fmt = "d%%" },
{ mod = "total_armour", label = "Armour", fmt = "d" },
{ mod = "total_evadeChance", label = "Evade Chance", fmt = "d%%", pc = true },
{ mod = "total_armour", label = "Armour", fmt = "d", compPercent = true },
{ mod = "spec_armourInc", label = "%Inc Armour from Tree", fmt = "d%%" },
{ mod = "total_blockChance", label = "Block Chance", fmt = "d%%", pc = true },
{ mod = "total_spellBlockChance", label = "Spell Block Chance", fmt = "d%%", pc = true },
@@ -497,7 +498,11 @@ function buildMode:AddStatComparesToTooltip(baseOutput, compareOutput, header)
if count == 0 then
main:AddTooltipLine(14, header)
end
main:AddTooltipLine(14, string.format("%s%+"..statData.fmt.." %s", diff > 0 and data.colorCodes.POSITIVE or data.colorCodes.NEGATIVE, diff * (statData.pc and 100 or 1), statData.label))
local line = string.format("%s%+"..statData.fmt.." %s", diff > 0 and data.colorCodes.POSITIVE or data.colorCodes.NEGATIVE, diff * (statData.pc and 100 or 1), statData.label)
if statData.compPercent then
line = line .. string.format(" (%+.1f%%)", (compareOutput[statData.mod] or 0) / (baseOutput[statData.mod] or 0) * 100 - 100)
end
main:AddTooltipLine(14, line)
count = count + 1
end
end

View File

@@ -79,6 +79,7 @@ function common.New(className, ...)
error("Class '"..className.."' has no constructor")
end
local object = setmetatable({ }, class)
object.Object = object
if class._parents then
-- Add parent and superparent class proxies
object._parentInit = { }

View File

@@ -47,6 +47,7 @@ local classList = {
"SkillsTab",
"SkillListControl",
"SlotSelectControl",
"GemSelectControl",
"ItemsTab",
"ItemSlotControl",
"ItemListControl",
@@ -99,7 +100,7 @@ function main:Init()
self.anchorUpdate = common.New("Control", nil, 2, 0, 0, 0)
self.anchorUpdate.y = function()
return self.screenH - 2
return self.screenH - 4
end
self.controls.applyUpdate = common.New("ButtonControl", {"BOTTOMLEFT",self.anchorUpdate,"BOTTOMLEFT"}, 0, 0, 110, 20, "^x50E050Update Ready", function()
local changeList = { }

View File

@@ -69,6 +69,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Classes", "Classes", "{7EE4
Classes\ControlHost.lua = Classes\ControlHost.lua
Classes\DropDownControl.lua = Classes\DropDownControl.lua
Classes\EditControl.lua = Classes\EditControl.lua
Classes\GemSelectControl.lua = Classes\GemSelectControl.lua
Classes\Grid.lua = Classes\Grid.lua
Classes\ImportTab.lua = Classes\ImportTab.lua
Classes\ItemDBControl.lua = Classes\ItemDBControl.lua

View File

@@ -48,6 +48,12 @@ 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.0.27 - 2016/09/12
* More updates to 2.4.0 uniques; most of them should have the correct roll ranges now
* Added a dropdown to the skill gem name field
* Now shows Evade Chance in side bar
* Node/item stat comparisons now show percentage increase/decrease for many stats (DPS, life, etc)
### 1.0.26 - 2016/09/09
* More updates to 2.4.0 uniques
* Re-nerfed Voidheart

View File

@@ -1,3 +1,8 @@
VERSION[1.0.27][2016/09/12]
* More updates to 2.4.0 uniques; most of them should have the correct roll ranges now
* Added a dropdown to the skill gem name field
* Now shows Evade Chance in side bar
* Node/item stat comparisons now show percentage increase/decrease for many stats (DPS, life, etc)
VERSION[1.0.26][2016/09/09]
* More updates to 2.4.0 uniques
* Re-nerfed Voidheart

View File

@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<PoBVersion>
<Version number="1.0.26"/>
<Version number="1.0.27"/>
<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="7ebf2b5d0d580e334023fa2ae23cc36b8d4c6f9c" name="Launch.lua" part="program"/>
<File sha1="cb07c8d4819eb81df9e98ab9039e0c9adf74c150" name="UpdateCheck.lua" part="program"/>
<File sha1="4f17937f2b37784e169a3792b235f2a0a3961e61" name="UpdateApply.lua" part="program"/>
<File sha1="6ebb3d6bd43c8d5802a14ecc9f66ea47f90431bd" name="changelog.txt" part="program"/>
<File sha1="7254ad2dcd9472591908b9c86b500fe848753bdc" name="changelog.txt" part="program"/>
<File sha1="aef7145f378d0a1d5dc6f5f2d3c08d2a1b6ef264" name="Classes/BuildListControl.lua" part="program"/>
<File sha1="34fdf53db3b3231ce446749227e178847b982771" name="Classes/ButtonControl.lua" part="program"/>
<File sha1="ffe8c54a8006cb7acc34ba5c6e50772081a0a694" name="Classes/CalcsTab.lua" part="program"/>
@@ -15,7 +15,8 @@
<File sha1="e71f8367d62de41b0b80b764ddced8fb80f50ce7" name="Classes/Control.lua" part="program"/>
<File sha1="1d35e3a3d8427d30254e7d8983562d0d4d8dc733" name="Classes/ControlHost.lua" part="program"/>
<File sha1="7c23b2ae9eb3b9b02a5da8afce64e2cb191b36b3" name="Classes/DropDownControl.lua" part="program"/>
<File sha1="40c44fc6371bf664a887cf0a81f1d76e0ffa17f1" name="Classes/EditControl.lua" part="program"/>
<File sha1="6bcd33ef200e2029dbed26598f1c66a3e4dbd3d6" name="Classes/EditControl.lua" part="program"/>
<File sha1="7b013926ba9582ac09d09410b1358575fcbb3f80" name="Classes/GemSelectControl.lua" part="program"/>
<File sha1="c8774a6e9a39fe8f2d434889abe2533aee78fc47" name="Classes/Grid.lua" part="program"/>
<File sha1="85aae0489332ca754538757560ec1adaf3383fc2" name="Classes/ImportTab.lua" part="program"/>
<File sha1="b0b313cca6ba333c0c98b73ed0c0d3a640e28c20" name="Classes/ItemDBControl.lua" part="program"/>
@@ -30,28 +31,28 @@
<File sha1="f2f2bda4a5a26e54cce51614e3ad48b6f7182671" name="Classes/ScrollBarControl.lua" part="program"/>
<File sha1="261dcf54a4542e6160fd7024d8edf4fc095d9c71" name="Classes/SectionControl.lua" part="program"/>
<File sha1="4903e6dedf251e1cef5aba47229b1d6d02e5b806" name="Classes/SkillListControl.lua" part="program"/>
<File sha1="47ee592eaf6976041e6e5b9b18f9121dc0916a55" name="Classes/SkillsTab.lua" part="program"/>
<File sha1="b2b3a3c4d9fad1462fb047ffd1d0e9c92f4b9638" 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="787ac0d738443206c15ec36544089465eec87048" name="Classes/TreeTab.lua" part="program"/>
<File sha1="4b7675c8b4fe71cade7dd3d70793df1ed8022d01" name="Classes/UndoHandler.lua" part="program"/>
<File sha1="b62de829c5f1deb139dd1f8b74236c79b6025a71" name="Modules/Build.lua" part="program"/>
<File sha1="c729604180c1bf3753afee7bc39055c1c2f08a0d" name="Modules/Build.lua" part="program"/>
<File sha1="c03a7796aea3e9aa832fbb92c1f674ef5af690ca" name="Modules/BuildList.lua" part="program"/>
<File sha1="09ce2f4b2660c4d651f2ee3be2f137702c2164cb" name="Modules/Calcs.lua" part="program"/>
<File sha1="d4439a94dda4c3d3aa23ac123ba378a35174e425" name="Modules/CalcsView.lua" part="program"/>
<File sha1="3fd280d8abfa60264495daad42f8ccaa92cdcd46" name="Modules/Common.lua" part="program"/>
<File sha1="3260bd50f67b7a51973c66157d3af20446bf291e" name="Modules/Common.lua" part="program"/>
<File sha1="cb25bd581587ba5b35f77ca7b245334be1e5186a" name="Modules/Data.lua" part="program"/>
<File sha1="6de97695b61787194e6241af8cc4da5943476a70" name="Modules/ItemTools.lua" part="program"/>
<File sha1="a465ad94e34ec555f549e7addfb4a9771ec58f3c" name="Modules/Main.lua" part="program"/>
<File sha1="2559a1318044beb53eb232f04c130149dfe8562e" name="Modules/Main.lua" part="program"/>
<File sha1="c87bf5090f48c5f78244a60b29d73c2518c4c4db" name="Modules/ModParser.lua" part="program"/>
<File sha1="bc49ce1b5e15da40476a9c99c4c690b323c0e7ad" name="Modules/ModTools.lua" part="program"/>
<File sha1="e7ee7e5b6388facb7bf568517ecc401590757df7" name="Assets/ring.png" part="program"/>
<File sha1="5261f2f7c189932ddb2e172598a914a210022457" name="Data/New.lua" part="program"/>
<File sha1="4883a0e2af6aa54e436d34d9b22164fb638867b7" name="Data/Rares.lua" part="program"/>
<File sha1="ce2d294cf8e25a8ea400bdf50e19bb09f52dc430" name="Data/Gems/act_dex.lua" part="program"/>
<File sha1="92e26ae3e528074fd71719cc08b56ce518fa3a94" name="Data/Gems/act_int.lua" part="program"/>
<File sha1="a4543e78ef0dba1f1a6ffe396a1432e2473bd2c0" name="Data/Gems/act_str.lua" part="program"/>
<File sha1="698c46ec242133014f6904d276b27106580ea392" name="Data/New.lua" part="program"/>
<File sha1="dc1d602e0f895fa6a795f889fee555416d29af08" name="Data/Rares.lua" part="program"/>
<File sha1="23687ec832bc60a802bc1a47ba6105ec2c73d7f5" name="Data/Gems/act_dex.lua" part="program"/>
<File sha1="f4030deac217c9f5dc142b0c76495d3961e89074" name="Data/Gems/act_int.lua" part="program"/>
<File sha1="fd9d3b92b266bf509edd57a76f3fcf0a9addd4b0" name="Data/Gems/act_str.lua" part="program"/>
<File sha1="997177289512d8d107f45b440cddcd8ccea890fd" name="Data/Gems/other.lua" part="program"/>
<File sha1="d030ece7613ffadf27fbd4450d0dadcd6299aeee" name="Data/Gems/sup_dex.lua" part="program"/>
<File sha1="6b8404bb706b805600aca6f602f90f7e70dc0610" name="Data/Gems/sup_int.lua" part="program"/>