Release 1.4.12
- Added shared item list - Added options screen - Added toasts - Program now always updates on first run, but continues if update check fails - Updated libcurl to 7.54.0
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
-- Class: Control
|
||||
-- UI control base class
|
||||
--
|
||||
local launch, main = ...
|
||||
|
||||
local t_insert = table.insert
|
||||
local m_floor = math.floor
|
||||
|
||||
@@ -130,13 +130,17 @@ You can get this from your web browser's cookies while logged into the Path of E
|
||||
end
|
||||
self.controls.generateCodePastebin = common.New("ButtonControl", {"LEFT",self.controls.generateCodeCopy,"RIGHT"}, 8, 0, 140, 20, "Share with Pastebin", function()
|
||||
local id = LaunchSubScript([[
|
||||
local code = ...
|
||||
local code, proxyURL = ...
|
||||
local curl = require("lcurl.safe")
|
||||
local page = ""
|
||||
local easy = curl.easy()
|
||||
easy:setopt_url("https://pastebin.com/api/api_post.php")
|
||||
easy:setopt(curl.OPT_POST, true)
|
||||
easy:setopt(curl.OPT_POSTFIELDS, "api_dev_key=c4757f22e50e65e21c53892fd8e0a9ff&api_option=paste&api_paste_code="..code)
|
||||
easy:setopt(curl.OPT_ACCEPT_ENCODING, "")
|
||||
if proxyURL then
|
||||
easy:setopt(curl.OPT_PROXY, proxyURL)
|
||||
end
|
||||
easy:setopt_writefunction(function(data)
|
||||
page = page..data
|
||||
return true
|
||||
@@ -148,7 +152,7 @@ You can get this from your web browser's cookies while logged into the Path of E
|
||||
else
|
||||
return nil, page
|
||||
end
|
||||
]], "", "", self.controls.generateCodeOut.buf)
|
||||
]], "", "", self.controls.generateCodeOut.buf, launch.proxyURL)
|
||||
if id then
|
||||
self.controls.generateCodeOut:SetText("")
|
||||
self.controls.generateCodePastebin.label = "Creating paste..."
|
||||
|
||||
@@ -13,10 +13,7 @@ local ItemDBClass = common.NewClass("ItemDB", "ListControl", function(self, anch
|
||||
self.ListControl(anchor, x, y, width, height, 16, false)
|
||||
self.itemsTab = itemsTab
|
||||
self.db = db
|
||||
self.dragTargetList = { itemsTab.controls.itemList }
|
||||
for _, slot in pairs(itemsTab.slots) do
|
||||
t_insert(self.dragTargetList, slot)
|
||||
end
|
||||
self.dragTargetList = { }
|
||||
self.sortControl = {
|
||||
NAME = { key = "name", order = 1, dir = "ASCEND", func = function(a,b) return a:gsub("^The ","") < b:gsub("^The ","") end }
|
||||
}
|
||||
@@ -163,8 +160,10 @@ function ItemDBClass:GetRowValue(column, index, item)
|
||||
end
|
||||
|
||||
function ItemDBClass:AddValueTooltip(index, item)
|
||||
self.itemsTab:AddItemTooltip(item, nil, true)
|
||||
return data.colorCodes[item.rarity], true
|
||||
if not main.popups[1] then
|
||||
self.itemsTab:AddItemTooltip(item, nil, true)
|
||||
return data.colorCodes[item.rarity], true
|
||||
end
|
||||
end
|
||||
|
||||
function ItemDBClass:GetDragValue(index, item)
|
||||
|
||||
@@ -13,9 +13,6 @@ local ItemListClass = common.NewClass("ItemList", "ListControl", function(self,
|
||||
self.itemsTab = itemsTab
|
||||
self.label = "^7All items:"
|
||||
self.dragTargetList = { }
|
||||
for _, slot in pairs(itemsTab.slots) do
|
||||
t_insert(self.dragTargetList, slot)
|
||||
end
|
||||
self.controls.sort = common.New("ButtonControl", {"BOTTOMRIGHT",self,"TOPRIGHT"}, -64, -2, 60, 18, "Sort", function()
|
||||
itemsTab:SortItemList()
|
||||
end)
|
||||
@@ -36,8 +33,10 @@ end
|
||||
|
||||
function ItemListClass:AddValueTooltip(index, itemId)
|
||||
local item = self.itemsTab.list[itemId]
|
||||
self.itemsTab:AddItemTooltip(item, nil, true)
|
||||
return data.colorCodes[item.rarity], true
|
||||
if not main.popups[1] then
|
||||
self.itemsTab:AddItemTooltip(item, nil, true)
|
||||
return data.colorCodes[item.rarity], true
|
||||
end
|
||||
end
|
||||
|
||||
function ItemListClass:GetDragValue(index, itemId)
|
||||
|
||||
@@ -104,6 +104,9 @@ function ItemSlotClass:Draw(viewPort)
|
||||
SetDrawColor(0, 1, 0, 0.25)
|
||||
DrawImage(nil, x, y, width, height)
|
||||
end
|
||||
if main.popups[1] then
|
||||
return
|
||||
end
|
||||
if self.nodeId and (self.dropped or (self:IsMouseOver() and (self.otherDragSource or not self.itemsTab.selControl))) then
|
||||
SetDrawLayer(nil, 15)
|
||||
local viewerX = x + width + 5
|
||||
@@ -124,7 +127,7 @@ function ItemSlotClass:Draw(viewPort)
|
||||
SetViewport()
|
||||
SetDrawLayer(nil, 0)
|
||||
end
|
||||
if self:IsMouseOver() and not main.popups[1] then
|
||||
if self:IsMouseOver() then
|
||||
local ttItem
|
||||
if self.dropped then
|
||||
if self.hoverSel then
|
||||
|
||||
@@ -168,12 +168,12 @@ local ItemsTabClass = common.NewClass("ItemsTab", "UndoHandler", "ControlHost",
|
||||
return not self.controls.selectDBLabel:IsShown() or self.controls.selectDB.sel == 2
|
||||
end
|
||||
|
||||
-- Display item
|
||||
-- Create/import item
|
||||
self.controls.craftDisplayItem = common.New("ButtonControl", {"TOPLEFT",self.controls.itemList,"TOPRIGHT"}, 20, 0, 120, 20, "Craft item...", function()
|
||||
self:CraftItem()
|
||||
end)
|
||||
self.controls.craftDisplayItem.shown = function()
|
||||
return self.displayItem == nil
|
||||
return self.displayItem == nil
|
||||
end
|
||||
self.controls.newDisplayItem = common.New("ButtonControl", {"TOPLEFT",self.controls.craftDisplayItem,"TOPRIGHT"}, 8, 0, 120, 20, "Create custom...", function()
|
||||
self:EditDisplayItemText()
|
||||
@@ -185,6 +185,9 @@ to view/edit the item and add it to your build.
|
||||
You can Control + Click an item to equip it, or drag it onto the slot.
|
||||
This will also add it to your build if it's from the unique/template list.
|
||||
If there's 2 slots an item can go in, holding Shift will put it in the second.]])
|
||||
self.controls.sharedItemList = common.New("SharedItemList", {"TOPLEFT",self.controls.craftDisplayItem, "BOTTOMLEFT"}, 0, 142, 360, 308, self)
|
||||
|
||||
-- Display item
|
||||
self.anchorDisplayItem = common.New("Control", {"TOPLEFT",self.controls.itemList,"TOPRIGHT"}, 20, 0, 0, 0)
|
||||
self.anchorDisplayItem.shown = function()
|
||||
return self.displayItem ~= nil
|
||||
@@ -253,7 +256,21 @@ If there's 2 slots an item can go in, holding Shift will put it in the second.]]
|
||||
end)
|
||||
|
||||
-- Scroll bar
|
||||
self.controls.scrollBarH = common.New("ScrollBarControl", nil, 0, 0, 0, 18, 80, "HORIZONTAL", true)
|
||||
self.controls.scrollBarH = common.New("ScrollBarControl", nil, 0, 0, 0, 18, 100, "HORIZONTAL", true)
|
||||
|
||||
-- Initialise drag target lists
|
||||
t_insert(self.controls.itemList.dragTargetList, self.controls.sharedItemList)
|
||||
t_insert(self.controls.uniqueDB.dragTargetList, self.controls.itemList)
|
||||
t_insert(self.controls.uniqueDB.dragTargetList, self.controls.sharedItemList)
|
||||
t_insert(self.controls.rareDB.dragTargetList, self.controls.itemList)
|
||||
t_insert(self.controls.rareDB.dragTargetList, self.controls.sharedItemList)
|
||||
t_insert(self.controls.sharedItemList.dragTargetList, self.controls.itemList)
|
||||
for _, slot in pairs(self.slots) do
|
||||
t_insert(self.controls.itemList.dragTargetList, slot)
|
||||
t_insert(self.controls.uniqueDB.dragTargetList, slot)
|
||||
t_insert(self.controls.rareDB.dragTargetList, slot)
|
||||
t_insert(self.controls.sharedItemList.dragTargetList, slot)
|
||||
end
|
||||
end)
|
||||
|
||||
function ItemsTabClass:Load(xml, dbFileName)
|
||||
@@ -352,6 +369,15 @@ function ItemsTabClass:Draw(viewPort, inputEvents)
|
||||
end
|
||||
end
|
||||
self:ProcessControlsInput(inputEvents, viewPort)
|
||||
for id, event in ipairs(inputEvents) do
|
||||
if event.type == "KeyUp" then
|
||||
if event.key == "WHEELDOWN" then
|
||||
self.controls.scrollBarH:Scroll(1)
|
||||
elseif event.key == "WHEELUP" then
|
||||
self.controls.scrollBarH:Scroll(-1)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
main:DrawBackground(viewPort)
|
||||
|
||||
@@ -510,6 +536,7 @@ function ItemsTabClass:CreateDisplayItemFromRaw(itemRaw, normalise)
|
||||
if newItem then
|
||||
if normalise then
|
||||
itemLib.normaliseQuality(newItem)
|
||||
itemLib.buildItemModList(newItem)
|
||||
end
|
||||
self:SetDisplayItem(newItem)
|
||||
end
|
||||
|
||||
@@ -245,18 +245,18 @@ function ListClass:OnKeyDown(key, doubleClick)
|
||||
self.selValue = self.list[index]
|
||||
if self.selValue then
|
||||
self.selIndex = index
|
||||
if self.isMutable or self.dragTargetList then
|
||||
self.selCX = cursorX
|
||||
self.selCY = cursorY
|
||||
self.selDragging = true
|
||||
self.selDragActive = false
|
||||
end
|
||||
if self.OnSelect then
|
||||
self:OnSelect(self.selIndex, self.selValue)
|
||||
end
|
||||
if self.OnSelClick then
|
||||
self:OnSelClick(self.selIndex, self.selValue, doubleClick)
|
||||
end
|
||||
if (self.isMutable or self.dragTargetList) and self:IsShown() then
|
||||
self.selCX = cursorX
|
||||
self.selCY = cursorY
|
||||
self.selDragging = true
|
||||
self.selDragActive = false
|
||||
end
|
||||
end
|
||||
end
|
||||
elseif #self.list > 0 then
|
||||
|
||||
@@ -26,6 +26,7 @@ local PassiveTreeViewClass = common.NewClass("PassiveTreeView", function(self)
|
||||
self.zoomY = 0
|
||||
|
||||
self.searchStr = ""
|
||||
self.showStatDifferences = true
|
||||
end)
|
||||
|
||||
function PassiveTreeViewClass:Load(xml, fileName)
|
||||
@@ -43,6 +44,9 @@ function PassiveTreeViewClass:Load(xml, fileName)
|
||||
if xml.attrib.showHeatMap then
|
||||
self.showHeatMap = xml.attrib.showHeatMap == "true"
|
||||
end
|
||||
if xml.attrib.showStatDifferences then
|
||||
self.showStatDifferences = xml.attrib.showStatDifferences == "true"
|
||||
end
|
||||
end
|
||||
|
||||
function PassiveTreeViewClass:Save(xml)
|
||||
@@ -52,6 +56,7 @@ function PassiveTreeViewClass:Save(xml)
|
||||
zoomY = tostring(self.zoomY),
|
||||
searchStr = self.searchStr,
|
||||
showHeatMap = tostring(self.showHeatMap),
|
||||
showStatDifferences = tostring(self.showStatDifferences),
|
||||
}
|
||||
end
|
||||
|
||||
@@ -74,6 +79,8 @@ function PassiveTreeViewClass:Draw(build, viewPort, inputEvents)
|
||||
end
|
||||
elseif event.key == "p" then
|
||||
self.showHeatMap = not self.showHeatMap
|
||||
elseif event.key == "d" and IsKeyDown("CTRL") then
|
||||
self.showStatDifferences = not self.showStatDifferences
|
||||
end
|
||||
elseif event.type == "KeyUp" then
|
||||
if event.key == "LEFTBUTTON" then
|
||||
@@ -376,7 +383,14 @@ function PassiveTreeViewClass:Draw(build, viewPort, inputEvents)
|
||||
local defence = m_max(node.power.defence or 0, 0)
|
||||
local dpsCol = (offence / build.calcsTab.powerMax.offence * 1.5) ^ 0.5
|
||||
local defCol = (defence / build.calcsTab.powerMax.defence * 1.5) ^ 0.5
|
||||
SetDrawColor(dpsCol, (m_max(dpsCol - 0.5, 0) + m_max(defCol - 0.5, 0)) / 2, defCol)
|
||||
local mixCol = (m_max(dpsCol - 0.5, 0) + m_max(defCol - 0.5, 0)) / 2
|
||||
if main.nodePowerTheme == "RED/BLUE" then
|
||||
SetDrawColor(dpsCol, mixCol, defCol)
|
||||
elseif main.nodePowerTheme == "RED/GREEN" then
|
||||
SetDrawColor(dpsCol, defCol, mixCol)
|
||||
elseif main.nodePowerTheme == "GREEN/BLUE" then
|
||||
SetDrawColor(mixCol, dpsCol, defCol)
|
||||
end
|
||||
else
|
||||
SetDrawColor(1, 1, 1)
|
||||
end
|
||||
@@ -427,7 +441,7 @@ function PassiveTreeViewClass:Draw(build, viewPort, inputEvents)
|
||||
local size = 175 * scale / self.zoom ^ 0.4
|
||||
DrawImage(self.highlightRing, scrX - size, scrY - size, size * 2, size * 2)
|
||||
end
|
||||
if node == hoverNode and (node.type ~= "socket" or not IsKeyDown("SHIFT")) then
|
||||
if node == hoverNode and (node.type ~= "socket" or not IsKeyDown("SHIFT")) and not main.popups[1] then
|
||||
-- Draw tooltip
|
||||
SetDrawLayer(nil, 100)
|
||||
local size = m_floor(hoverNode.size * scale)
|
||||
@@ -591,36 +605,42 @@ function PassiveTreeViewClass:AddNodeTooltip(node, build)
|
||||
end
|
||||
|
||||
-- Mod differences
|
||||
local calcFunc, calcBase = build.calcsTab:GetMiscCalculator(build)
|
||||
if calcFunc then
|
||||
if self.showStatDifferences then
|
||||
local calcFunc, calcBase = build.calcsTab:GetMiscCalculator(build)
|
||||
if calcFunc then
|
||||
main:AddTooltipSeparator(14)
|
||||
local path = (node.alloc and node.depends) or self.tracePath or node.path or { }
|
||||
local pathLength = #path
|
||||
local pathNodes = { }
|
||||
for _, node in pairs(path) do
|
||||
pathNodes[node] = true
|
||||
end
|
||||
local nodeOutput, pathOutput
|
||||
if node.alloc then
|
||||
-- Calculate the differences caused by deallocating this node and its dependants
|
||||
nodeOutput = calcFunc({ removeNodes = { [node] = true } })
|
||||
if pathLength > 1 then
|
||||
pathOutput = calcFunc({ removeNodes = pathNodes })
|
||||
end
|
||||
else
|
||||
-- Calculated the differences caused by allocating this node and all nodes along the path to it
|
||||
nodeOutput = calcFunc({ addNodes = { [node] = true } })
|
||||
if pathLength > 1 then
|
||||
pathOutput = calcFunc({ addNodes = pathNodes })
|
||||
end
|
||||
end
|
||||
local count = build:AddStatComparesToTooltip(calcBase, nodeOutput, node.alloc and "^7Unallocating this node will give you:" or "^7Allocating this node will give you:")
|
||||
if pathLength > 1 then
|
||||
count = count + build:AddStatComparesToTooltip(calcBase, pathOutput, node.alloc and "^7Unallocating this node and all nodes depending on it will give you:" or "^7Allocating this node and all nodes leading to it will give you:", pathLength)
|
||||
end
|
||||
if count == 0 then
|
||||
main:AddTooltipLine(14, string.format("^7No changes from %s this node%s.", node.alloc and "unallocating" or "allocating", pathLength > 1 and " or the nodes leading to it" or ""))
|
||||
end
|
||||
main:AddTooltipLine(14, "^x80A080Tip: Press Ctrl+D to disable the display of stat differences.")
|
||||
end
|
||||
else
|
||||
main:AddTooltipSeparator(14)
|
||||
local path = (node.alloc and node.depends) or self.tracePath or node.path or { }
|
||||
local pathLength = #path
|
||||
local pathNodes = { }
|
||||
for _, node in pairs(path) do
|
||||
pathNodes[node] = true
|
||||
end
|
||||
local nodeOutput, pathOutput
|
||||
if node.alloc then
|
||||
-- Calculate the differences caused by deallocating this node and its dependants
|
||||
nodeOutput = calcFunc({ removeNodes = { [node] = true } })
|
||||
if pathLength > 1 then
|
||||
pathOutput = calcFunc({ removeNodes = pathNodes })
|
||||
end
|
||||
else
|
||||
-- Calculated the differences caused by allocating this node and all nodes along the path to it
|
||||
nodeOutput = calcFunc({ addNodes = { [node] = true } })
|
||||
if pathLength > 1 then
|
||||
pathOutput = calcFunc({ addNodes = pathNodes })
|
||||
end
|
||||
end
|
||||
local count = build:AddStatComparesToTooltip(calcBase, nodeOutput, node.alloc and "^7Unallocating this node will give you:" or "^7Allocating this node will give you:")
|
||||
if pathLength > 1 then
|
||||
count = count + build:AddStatComparesToTooltip(calcBase, pathOutput, node.alloc and "^7Unallocating this node and all nodes depending on it will give you:" or "^7Allocating this node and all nodes leading to it will give you:", pathLength)
|
||||
end
|
||||
if count == 0 then
|
||||
main:AddTooltipLine(14, string.format("^7No changes from %s this node%s.", node.alloc and "unallocating" or "allocating", pathLength > 1 and " or the nodes leading to it" or ""))
|
||||
end
|
||||
main:AddTooltipLine(14, "^x80A080Tip: Press Ctrl+D to enable the display of stat differences.")
|
||||
end
|
||||
|
||||
-- Pathing distance
|
||||
|
||||
68
Classes/SharedItemListControl.lua
Normal file
68
Classes/SharedItemListControl.lua
Normal file
@@ -0,0 +1,68 @@
|
||||
-- Path of Building
|
||||
--
|
||||
-- Class: Item list
|
||||
-- Shared item list control.
|
||||
--
|
||||
local launch, main = ...
|
||||
|
||||
local pairs = pairs
|
||||
local t_insert = table.insert
|
||||
local t_remove = table.remove
|
||||
|
||||
local SharedItemListClass = common.NewClass("SharedItemList", "ListControl", function(self, anchor, x, y, width, height, itemsTab)
|
||||
self.ListControl(anchor, x, y, width, height, 16, true, main.sharedItems)
|
||||
self.itemsTab = itemsTab
|
||||
self.label = "^7Shared items:"
|
||||
self.dragTargetList = { }
|
||||
self.controls.delete = common.New("ButtonControl", {"BOTTOMRIGHT",self,"TOPRIGHT"}, 0, -2, 60, 18, "Delete", function()
|
||||
self:OnSelDelete(self.selIndex, self.selValue)
|
||||
end)
|
||||
self.controls.delete.enabled = function()
|
||||
return self.selValue ~= nil
|
||||
end
|
||||
end)
|
||||
|
||||
function SharedItemListClass:GetRowValue(column, index, item)
|
||||
if column == 1 then
|
||||
return data.colorCodes[item.rarity] .. item.name
|
||||
end
|
||||
end
|
||||
|
||||
function SharedItemListClass:AddValueTooltip(index, item)
|
||||
if not main.popups[1] then
|
||||
self.itemsTab:AddItemTooltip(item, nil, true)
|
||||
return data.colorCodes[item.rarity], true
|
||||
end
|
||||
end
|
||||
|
||||
function SharedItemListClass:GetDragValue(index, item)
|
||||
return "Item", item
|
||||
end
|
||||
|
||||
function SharedItemListClass:ReceiveDrag(type, value, source)
|
||||
if type == "Item" then
|
||||
local newItem = itemLib.makeItemFromRaw(value.raw)
|
||||
if not value.id then
|
||||
itemLib.normaliseQuality(newItem)
|
||||
end
|
||||
t_insert(self.list, self.selDragIndex or #self.list, newItem)
|
||||
end
|
||||
end
|
||||
|
||||
function SharedItemListClass:OnSelClick(index, item, doubleClick)
|
||||
if doubleClick then
|
||||
self.itemsTab:CreateDisplayItemFromRaw(item.raw, true)
|
||||
end
|
||||
end
|
||||
|
||||
function SharedItemListClass:OnSelCopy(index, item)
|
||||
Copy(itemLib.createItemRaw(item):gsub("\n","\r\n"))
|
||||
end
|
||||
|
||||
function SharedItemListClass:OnSelDelete(index, item)
|
||||
main:OpenConfirmPopup("Delete Item", "Are you sure you want to remove '"..item.name.."' from the shared item list?", "Delete", function()
|
||||
t_remove(self.list, index)
|
||||
self.selIndex = nil
|
||||
self.selValue = nil
|
||||
end)
|
||||
end
|
||||
@@ -488,6 +488,7 @@ function SkillsTabClass:CreateUndoState()
|
||||
state.socketGroupList = { }
|
||||
for _, socketGroup in ipairs(self.socketGroupList) do
|
||||
local newGroup = copyTable(socketGroup, true)
|
||||
newGroup.gemList = { }
|
||||
for index, gem in pairs(socketGroup.gemList) do
|
||||
newGroup.gemList[index] = copyTable(gem, true)
|
||||
end
|
||||
|
||||
@@ -81,10 +81,13 @@ local TreeTabClass = common.NewClass("TreeTab", "ControlHost", function(self, bu
|
||||
self.controls.treeSearch = common.New("EditControl", {"LEFT",self.controls.export,"RIGHT"}, 8, 0, 300, 20, "", "Search", "%c%(%)", 100, function(buf)
|
||||
self.viewer.searchStr = buf
|
||||
end)
|
||||
self.controls.treeHeatMap = common.New("CheckBoxControl", {"LEFT",self.controls.treeSearch,"RIGHT"}, 130, 0, 20, "Show node power:", function(state)
|
||||
self.controls.treeHeatMap = common.New("CheckBoxControl", {"LEFT",self.controls.treeSearch,"RIGHT"}, 130, 0, 20, "Show Node Power:", function(state)
|
||||
self.viewer.showHeatMap = state
|
||||
end)
|
||||
self.controls.treeHeatMap.tooltip = "When enabled, an estimate of the offensive and defensive strength of\neach unallocated passive is calculated and displayed visually.\nOffensive power shows as red, defensive power as blue."
|
||||
self.controls.treeHeatMap.tooltip = function()
|
||||
local offCol, defCol = main.nodePowerTheme:match("(%a+)/(%a+)")
|
||||
return "When enabled, an estimate of the offensive and defensive strength of\neach unallocated passive is calculated and displayed visually.\nOffensive power shows as "..offCol:lower()..", defensive power as "..defCol:lower().."."
|
||||
end
|
||||
end)
|
||||
|
||||
function TreeTabClass:Draw(viewPort, inputEvents)
|
||||
|
||||
58
Launch.lua
58
Launch.lua
@@ -19,22 +19,21 @@ function launch:OnInit()
|
||||
self.versionPlatform = "?"
|
||||
self.lastUpdateCheck = GetTime()
|
||||
self.subScripts = { }
|
||||
ConPrintf("Loading main script...")
|
||||
local changeLogFile = io.open("changelog.txt")
|
||||
if changeLogFile then
|
||||
changeLogFile:close()
|
||||
else
|
||||
-- Changelog isn't present, this must be a fresh installation
|
||||
local firstRunFile = io.open("first.run", "r")
|
||||
if firstRunFile then
|
||||
firstRunFile:close()
|
||||
os.remove("first.run")
|
||||
-- This is a fresh installation
|
||||
-- Perform an immediate update to download the latest version
|
||||
ConClear()
|
||||
ConPrintf("Please wait while we complete installation...\n")
|
||||
local updateMode = LoadModule("UpdateCheck")
|
||||
if not updateMode or updateMode == "none" then
|
||||
Exit("Failed to install.")
|
||||
else
|
||||
local updateMode, errMsg = LoadModule("UpdateCheck")
|
||||
if not updateMode then
|
||||
self.updateErrMsg = errMsg
|
||||
elseif updateMode ~= "none" then
|
||||
self:ApplyUpdate(updateMode)
|
||||
return
|
||||
end
|
||||
return
|
||||
end
|
||||
local xml = require("xml")
|
||||
local localManXML = xml.LoadXMLFile("manifest.xml")
|
||||
@@ -54,6 +53,7 @@ function launch:OnInit()
|
||||
-- Enable dev mode to disable updates and set user path to be the script path
|
||||
self.devMode = true
|
||||
end
|
||||
ConPrintf("Loading main script...")
|
||||
local errMsg
|
||||
errMsg, self.main = PLoadModule("Modules/Main", self)
|
||||
if errMsg then
|
||||
@@ -106,8 +106,6 @@ function launch:OnFrame()
|
||||
if self.promptMsg then
|
||||
local r, g, b = unpack(self.promptCol)
|
||||
self:DrawPopup(r, g, b, "^0%s", self.promptMsg)
|
||||
elseif self.updateChecking then
|
||||
self:DrawPopup(0, 0.5, 0, "^0%s", self.updateMsg)
|
||||
end
|
||||
if self.doRestart then
|
||||
local screenW, screenH = GetScreenSize()
|
||||
@@ -132,7 +130,7 @@ function launch:OnKeyDown(key, doubleClick)
|
||||
end
|
||||
elseif self.promptMsg then
|
||||
self:RunPromptFunc(key)
|
||||
elseif not self.updateChecking then
|
||||
else
|
||||
if self.main and self.main.OnKeyDown then
|
||||
local errMsg = PCall(self.main.OnKeyDown, self.main, key, doubleClick)
|
||||
if errMsg then
|
||||
@@ -143,7 +141,7 @@ function launch:OnKeyDown(key, doubleClick)
|
||||
end
|
||||
|
||||
function launch:OnKeyUp(key)
|
||||
if not self.promptMsg and not self.updateChecking then
|
||||
if not self.promptMsg then
|
||||
if self.main and self.main.OnKeyUp then
|
||||
local errMsg = PCall(self.main.OnKeyUp, self.main, key)
|
||||
if errMsg then
|
||||
@@ -156,7 +154,7 @@ end
|
||||
function launch:OnChar(key)
|
||||
if self.promptMsg then
|
||||
self:RunPromptFunc(key)
|
||||
elseif not self.updateChecking then
|
||||
else
|
||||
if self.main and self.main.OnChar then
|
||||
local errMsg = PCall(self.main.OnChar, self.main, key)
|
||||
if errMsg then
|
||||
@@ -167,9 +165,7 @@ function launch:OnChar(key)
|
||||
end
|
||||
|
||||
function launch:OnSubCall(func, ...)
|
||||
if func == "ConPrintf" and self.updateChecking then
|
||||
self.updateMsg = string.format(...)
|
||||
elseif func == "UpdateProgress" then
|
||||
if func == "UpdateProgress" then
|
||||
self.updateProgress = string.format(...)
|
||||
end
|
||||
if _G[func] then
|
||||
@@ -192,18 +188,7 @@ end
|
||||
|
||||
function launch:OnSubFinished(id, ...)
|
||||
if self.subScripts[id].type == "UPDATE" then
|
||||
local ret = (...)
|
||||
self.updateAvailable = ret
|
||||
if self.updateChecking then
|
||||
if not ret then
|
||||
self:ShowPrompt(1, 0, 0, self.updateMsg .. "\n\nPress Enter/Escape to dismiss")
|
||||
elseif ret == "none" then
|
||||
self:ShowPrompt(0, 0, 0, "No update available.", function(key) return true end)
|
||||
else
|
||||
self:ShowPrompt(0.2, 0.8, 0.2, "An update has been downloaded.\n\nClick 'Update Ready' at bottom left when you are ready to update.", function(key) return true end)
|
||||
end
|
||||
self.updateChecking = false
|
||||
end
|
||||
self.updateAvailable, self.updateErrMsg = ...
|
||||
self.updateCheckRunning = false
|
||||
elseif self.subScripts[id].type == "DOWNLOAD" then
|
||||
local errMsg = PCall(self.subScripts[id].callback, ...)
|
||||
@@ -234,7 +219,7 @@ function launch:DownloadPage(url, callback, cookies)
|
||||
-- Download the given page in the background, and calls the provided callback function when done:
|
||||
-- callback(pageText, errMsg)
|
||||
local id = LaunchSubScript([[
|
||||
local url, cookies = ...
|
||||
local url, cookies, proxyURL = ...
|
||||
ConPrintf("Downloading page at: %s", url)
|
||||
local curl = require("lcurl.safe")
|
||||
local page = ""
|
||||
@@ -244,6 +229,9 @@ function launch:DownloadPage(url, callback, cookies)
|
||||
if cookies then
|
||||
easy:setopt(curl.OPT_COOKIE, cookies)
|
||||
end
|
||||
if proxyURL then
|
||||
easy:setopt(curl.OPT_PROXY, proxyURL)
|
||||
end
|
||||
easy:setopt_writefunction(function(data)
|
||||
page = page..data
|
||||
return true
|
||||
@@ -265,7 +253,7 @@ function launch:DownloadPage(url, callback, cookies)
|
||||
else
|
||||
return page
|
||||
end
|
||||
]], "", "ConPrintf", url, cookies)
|
||||
]], "", "ConPrintf", url, cookies, self.proxyURL)
|
||||
if id then
|
||||
self.subScripts[id] = {
|
||||
type = "DOWNLOAD",
|
||||
@@ -292,12 +280,12 @@ function launch:CheckForUpdate(inBackground)
|
||||
if self.updateCheckRunning then
|
||||
return
|
||||
end
|
||||
self.updateChecking = not inBackground
|
||||
self.updateCheckBackground = inBackground
|
||||
self.updateMsg = "Initialising..."
|
||||
self.updateProgress = "Checking..."
|
||||
self.lastUpdateCheck = GetTime()
|
||||
local update = io.open("UpdateCheck.lua", "r")
|
||||
local id = LaunchSubScript(update:read("*a"), "GetScriptPath,GetRuntimePath,GetWorkDir,MakeDir", "ConPrintf,UpdateProgress")
|
||||
local id = LaunchSubScript(update:read("*a"), "GetScriptPath,GetRuntimePath,GetWorkDir,MakeDir", "ConPrintf,UpdateProgress", self.proxyURL)
|
||||
if id then
|
||||
self.subScripts[id] = {
|
||||
type = "UPDATE"
|
||||
|
||||
@@ -250,7 +250,7 @@ function buildMode:Init(dbFileName, buildName)
|
||||
self.controls.statBox = common.New("TextListControl", {"TOPLEFT",self.controls.mainSocketGroup,"BOTTOMLEFT"}, 0, 62, 300, 0, {{x=170,align="RIGHT_X"},{x=174,align="LEFT"}})
|
||||
self.controls.statBox.height = function(control)
|
||||
local x, y = control:GetPos()
|
||||
return main.screenH - 30 - y
|
||||
return main.screenH - main.mainBarHeight - 4 - y
|
||||
end
|
||||
|
||||
-- Initialise class dropdown
|
||||
@@ -623,11 +623,11 @@ function buildMode:OpenSaveAsPopup()
|
||||
popup.controls.save.enabled = true
|
||||
end),
|
||||
save = common.New("ButtonControl", nil, -45, 70, 80, 20, "Save", function()
|
||||
main:ClosePopup()
|
||||
self.dbFileName = newFileName
|
||||
self.buildName = newBuildName
|
||||
main.modeArgs = { newFileName, newBuildName }
|
||||
self:SaveDBFile()
|
||||
main:ClosePopup()
|
||||
end),
|
||||
common.New("ButtonControl", nil, 45, 70, 80, 20, "Cancel", function()
|
||||
main:ClosePopup()
|
||||
|
||||
@@ -630,16 +630,17 @@ function calcs.offence(env, actor)
|
||||
local base = modDB:Sum("BASE", cfg, "CritChance")
|
||||
local inc = modDB:Sum("INC", cfg, "CritChance")
|
||||
local more = modDB:Sum("MORE", cfg, "CritChance")
|
||||
local enemyExtra = env.mode_effective and enemyDB:Sum("BASE", nil, "SelfExtraCritChance") or 0
|
||||
output.CritChance = (baseCrit + base) * (1 + inc / 100) * more
|
||||
if env.mode_effective then
|
||||
output.CritChance = output.CritChance + enemyDB:Sum("BASE", nil, "SelfExtraCritChance")
|
||||
end
|
||||
local preCapCritChance = output.CritChance
|
||||
output.CritChance = m_min(output.CritChance, 95)
|
||||
if (baseCrit + base) > 0 then
|
||||
output.CritChance = m_max(output.CritChance, 5)
|
||||
end
|
||||
output.PreEffectiveCritChance = output.CritChance
|
||||
if enemyExtra ~= 0 then
|
||||
output.CritChance = m_min(output.CritChance + enemyExtra, 100)
|
||||
end
|
||||
local preLuckyCritChance = output.CritChance
|
||||
if env.mode_effective and modDB:Sum("FLAG", cfg, "CritChanceLucky") then
|
||||
output.CritChance = (1 - (1 - output.CritChance / 100) ^ 2) * 100
|
||||
@@ -649,7 +650,6 @@ function calcs.offence(env, actor)
|
||||
output.CritChance = output.CritChance * output.HitChance / 100
|
||||
end
|
||||
if breakdown and output.CritChance ~= baseCrit then
|
||||
local enemyExtra = enemyDB:Sum("BASE", nil, "SelfExtraCritChance")
|
||||
breakdown.CritChance = { }
|
||||
if base ~= 0 then
|
||||
t_insert(breakdown.CritChance, s_format("(%g + %g) ^8(base)", baseCrit, base))
|
||||
@@ -662,24 +662,25 @@ function calcs.offence(env, actor)
|
||||
if more ~= 1 then
|
||||
t_insert(breakdown.CritChance, s_format("x %.2f", more).." ^8(more/less)")
|
||||
end
|
||||
if env.mode_effective and enemyExtra ~= 0 then
|
||||
t_insert(breakdown.CritChance, s_format("+ %g ^8(extra chance for enemy to be crit)", enemyExtra))
|
||||
end
|
||||
t_insert(breakdown.CritChance, s_format("= %g", preLuckyCritChance))
|
||||
t_insert(breakdown.CritChance, s_format("= %.2f%% ^8(crit chance)", output.PreEffectiveCritChance))
|
||||
if preCapCritChance > 95 then
|
||||
local overCap = preCapCritChance - 95
|
||||
t_insert(breakdown.CritChance, s_format("Crit is overcapped by %.2f%% (%d%% increased Critical Strike Chance)", overCap, overCap / more / (baseCrit + base) * 100))
|
||||
end
|
||||
if enemyExtra ~= 0 then
|
||||
t_insert(breakdown.CritChance, s_format("+ %g ^8(extra chance for enemy to be crit)", enemyExtra))
|
||||
t_insert(breakdown.CritChance, s_format("= %.2f%% ^8(chance to crit against enemy)", preLuckyCritChance))
|
||||
end
|
||||
if env.mode_effective and modDB:Sum("FLAG", cfg, "CritChanceLucky") then
|
||||
t_insert(breakdown.CritChance, "Crit Chance is Lucky:")
|
||||
t_insert(breakdown.CritChance, s_format("1 - (1 - %.4f) x (1 - %.4f)", preLuckyCritChance / 100, preLuckyCritChance / 100))
|
||||
t_insert(breakdown.CritChance, s_format("= %.2f", preHitCheckCritChance))
|
||||
t_insert(breakdown.CritChance, s_format("= %.2f%%", preHitCheckCritChance))
|
||||
end
|
||||
if env.mode_effective and output.HitChance < 100 then
|
||||
t_insert(breakdown.CritChance, "Crit confirmation roll:")
|
||||
t_insert(breakdown.CritChance, s_format("%.2f", preHitCheckCritChance))
|
||||
t_insert(breakdown.CritChance, s_format("%.2f%%", preHitCheckCritChance))
|
||||
t_insert(breakdown.CritChance, s_format("x %.2f ^8(chance to hit)", output.HitChance / 100))
|
||||
t_insert(breakdown.CritChance, s_format("= %.2f", output.CritChance))
|
||||
t_insert(breakdown.CritChance, s_format("= %.2f%%", output.CritChance))
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -865,6 +866,15 @@ function calcs.offence(env, actor)
|
||||
enemyDB.conditions.HitByLightningDamage = output.LightningHitAverage > 0
|
||||
end
|
||||
|
||||
if breakdown then
|
||||
-- For each damage type, calculate percentage of total damage
|
||||
for _, damageType in ipairs(dmgTypeList) do
|
||||
if output[damageType.."HitAverage"] > 0 then
|
||||
t_insert(breakdown[damageType], s_format("Portion of total damage: %d%%", output[damageType.."HitAverage"] / (totalHitMin + totalHitMax) * 200))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local hitRate = output.HitChance / 100 * (globalOutput.HitSpeed or globalOutput.Speed) * (skillData.dpsMultiplier or 1)
|
||||
|
||||
-- Calculate leech
|
||||
|
||||
@@ -8,6 +8,7 @@ local calcs = ...
|
||||
local pairs = pairs
|
||||
local ipairs = ipairs
|
||||
local t_insert = table.insert
|
||||
local m_min = math.min
|
||||
local m_ceil = math.ceil
|
||||
local m_floor = math.floor
|
||||
local s_format = string.format
|
||||
@@ -178,7 +179,7 @@ local function doActorAttribsPoolsConditions(env, actor)
|
||||
end
|
||||
for _, value in ipairs(modDB:Sum("LIST", nil, "GrantReserved"..pool.."AsAura")) do
|
||||
local auraMod = copyTable(value.mod)
|
||||
auraMod.value = m_floor(auraMod.value * reserved)
|
||||
auraMod.value = m_floor(auraMod.value * m_min(reserved, max))
|
||||
modDB:NewMod("ExtraAura", "LIST", { mod = auraMod })
|
||||
end
|
||||
end
|
||||
@@ -255,7 +256,16 @@ local function doActorMisc(env, actor)
|
||||
end
|
||||
end
|
||||
|
||||
-- Finalise environment and perform the calculations
|
||||
-- Finalises the environment and performs the stat calculations:
|
||||
-- 1. Merges keystone modifiers
|
||||
-- 2. Initialises minion skills
|
||||
-- 3. Initialises the main skill's minion, if present
|
||||
-- 4. Merges flask effects
|
||||
-- 5. Calculates reservations
|
||||
-- 6. Sets conditions and calculates attributes and life/mana pools (doActorAttribsPoolsConditions)
|
||||
-- 7. Processes buffs and debuffs
|
||||
-- 8. Processes charges and misc buffs (doActorMisc)
|
||||
-- 9. Calculates defence and offence stats (calcs.defence, calcs.offence)
|
||||
function calcs.perform(env)
|
||||
local modDB = env.modDB
|
||||
local enemyDB = env.enemyDB
|
||||
|
||||
@@ -81,12 +81,12 @@ function calcs.buildNodeModList(env, nodeList, finishJewels)
|
||||
end
|
||||
|
||||
-- Initialise environment:
|
||||
-- 1. Initialises the modifier databases
|
||||
-- 1. Initialises the player and enemy modifier databases
|
||||
-- 2. Merges modifiers for all items
|
||||
-- 3. Builds a list of jewels with radius functions
|
||||
-- 4. Merges modifiers for all allocated passive nodes
|
||||
-- 5. Builds a list of active skills and their supports
|
||||
-- 6. Builds modifier lists for all active skills
|
||||
-- 5. Builds a list of active skills and their supports (calcs.createActiveSkill)
|
||||
-- 6. Builds modifier lists for all active skills (calcs.buildActiveSkillModList)
|
||||
function calcs.initEnv(build, mode, override)
|
||||
override = override or { }
|
||||
|
||||
|
||||
181
Modules/Main.lua
181
Modules/Main.lua
@@ -62,6 +62,7 @@ local classList = {
|
||||
"ItemSlotControl",
|
||||
"ItemListControl",
|
||||
"ItemDBControl",
|
||||
"SharedItemListControl",
|
||||
"CalcsTab",
|
||||
"CalcSectionControl",
|
||||
"CalcBreakdownControl",
|
||||
@@ -85,7 +86,8 @@ function main:Init()
|
||||
self.userPath = GetUserPath().."/Path of Building/"
|
||||
MakeDir(self.userPath)
|
||||
end
|
||||
self.buildPath = self.userPath.."Builds/"
|
||||
self.defaultBuildPath = self.userPath.."Builds/"
|
||||
self.buildPath = self.defaultBuildPath
|
||||
MakeDir(self.buildPath)
|
||||
|
||||
self.tree = common.New("PassiveTree")
|
||||
@@ -114,17 +116,25 @@ function main:Init()
|
||||
end
|
||||
end
|
||||
|
||||
self.sharedItems = { }
|
||||
|
||||
self.anchorUpdate = common.New("Control", nil, 2, 0, 0, 0)
|
||||
self.anchorUpdate.y = function()
|
||||
return self.screenH - 4
|
||||
end
|
||||
self.controls.applyUpdate = common.New("ButtonControl", {"BOTTOMLEFT",self.anchorUpdate,"BOTTOMLEFT"}, 0, 0, 110, 20, "^x50E050Update Ready", function()
|
||||
self.controls.options = common.New("ButtonControl", {"BOTTOMLEFT",self.anchorUpdate,"BOTTOMLEFT"}, 0, 0, 70, 20, "Options", function()
|
||||
self:OpenOptionsPopup()
|
||||
end)
|
||||
self.controls.about = common.New("ButtonControl", {"BOTTOMLEFT",self.anchorUpdate,"BOTTOMLEFT"}, 230, 0, 70, 20, "About", function()
|
||||
self:OpenAboutPopup()
|
||||
end)
|
||||
self.controls.applyUpdate = common.New("ButtonControl", {"BOTTOMLEFT",self.anchorUpdate,"BOTTOMLEFT"}, 0, -28, 110, 20, "^x50E050Update Ready", function()
|
||||
self:OpenUpdatePopup()
|
||||
end)
|
||||
self.controls.applyUpdate.shown = function()
|
||||
return launch.updateAvailable and launch.updateAvailable ~= "none"
|
||||
end
|
||||
self.controls.checkUpdate = common.New("ButtonControl", {"BOTTOMLEFT",self.anchorUpdate,"BOTTOMLEFT"}, 0, 0, 120, 18, "", function()
|
||||
self.controls.checkUpdate = common.New("ButtonControl", {"BOTTOMLEFT",self.anchorUpdate,"BOTTOMLEFT"}, 0, -28, 120, 18, "", function()
|
||||
launch:CheckForUpdate()
|
||||
end)
|
||||
self.controls.checkUpdate.shown = function()
|
||||
@@ -136,17 +146,36 @@ function main:Init()
|
||||
self.controls.checkUpdate.enabled = function()
|
||||
return not launch.updateCheckRunning
|
||||
end
|
||||
self.controls.versionLabel = common.New("LabelControl", {"BOTTOMLEFT",self.anchorUpdate,"BOTTOMLEFT"}, 124, 0, 0, 14, "")
|
||||
self.controls.versionLabel = common.New("LabelControl", {"BOTTOMLEFT",self.anchorUpdate,"BOTTOMLEFT"}, 124, -28, 0, 14, "")
|
||||
self.controls.versionLabel.label = function()
|
||||
return "^8Version: "..launch.versionNumber..(launch.versionBranch == "dev" and " (Dev)" or "")
|
||||
end
|
||||
self.controls.about = common.New("ButtonControl", {"BOTTOMLEFT",self.anchorUpdate,"BOTTOMLEFT"}, 250, 0, 50, 20, "About", function()
|
||||
self:OpenAboutPopup()
|
||||
end)
|
||||
self.controls.devMode = common.New("LabelControl", {"BOTTOMLEFT",self.anchorUpdate,"BOTTOMLEFT"}, 0, 0, 0, 18, "^1Dev Mode")
|
||||
self.controls.devMode = common.New("LabelControl", {"BOTTOMLEFT",self.anchorUpdate,"BOTTOMLEFT"}, 0, -28, 0, 18, "^1Dev Mode")
|
||||
self.controls.devMode.shown = function()
|
||||
return launch.devMode
|
||||
end
|
||||
self.controls.dismissToast = common.New("ButtonControl", {"BOTTOMLEFT",self.anchorUpdate,"BOTTOMLEFT"}, 0, function() return -self.mainBarHeight + self.toastHeight end, 80, 20, "Dismiss", function()
|
||||
self.toastMode = "HIDING"
|
||||
self.toastStart = GetTime()
|
||||
end)
|
||||
self.controls.dismissToast.shown = function()
|
||||
return self.toastMode == "SHOWN"
|
||||
end
|
||||
|
||||
self.mainBarHeight = 58
|
||||
self.toastMessages = { }
|
||||
|
||||
if launch.devMode and GetTime() < 15000 then
|
||||
t_insert(self.toastMessages, [[
|
||||
^xFF7700Warning: ^7Developer Mode active!
|
||||
The program is currently running in developer
|
||||
mode, which is not intended for normal use.
|
||||
If you are not expecting this, then you may have
|
||||
set up the program from the source .zip instead
|
||||
of using one of the installers. If that is the case,
|
||||
please reinstall using one of the installers from
|
||||
the "Releases" section of the GitHub page.]])
|
||||
end
|
||||
|
||||
self.inputEvents = { }
|
||||
self.popups = { }
|
||||
@@ -155,6 +184,7 @@ function main:Init()
|
||||
self.accountSessionIDs = { }
|
||||
|
||||
self.buildSortMode = "NAME"
|
||||
self.nodePowerTheme = "RED/BLUE"
|
||||
|
||||
self:SetMode("BUILD", false, "Unnamed build")
|
||||
|
||||
@@ -200,6 +230,58 @@ function main:OnFrame()
|
||||
|
||||
self:CallMode("OnFrame", self.inputEvents, self.viewPort)
|
||||
|
||||
if launch.updateErrMsg then
|
||||
t_insert(self.toastMessages, string.format("Update check failed!\n%s", launch.updateErrMsg))
|
||||
launch.updateErrMsg = nil
|
||||
end
|
||||
if launch.updateAvailable and launch.updateAvailable ~= "none" and not self.updateAvailableShown then
|
||||
t_insert(self.toastMessages, "Update Available\nAn update has been downloaded and is ready\nto be applied.")
|
||||
self.updateAvailableShown = true
|
||||
end
|
||||
|
||||
-- Run toasts
|
||||
if self.toastMessages[1] then
|
||||
if not self.toastMode then
|
||||
self.toastMode = "SHOWING"
|
||||
self.toastStart = GetTime()
|
||||
self.toastHeight = #self.toastMessages[1]:gsub("[^\n]","") * 16 + 20 + 40
|
||||
end
|
||||
if self.toastMode == "SHOWING" then
|
||||
local now = GetTime()
|
||||
if now >= self.toastStart + 250 then
|
||||
self.toastMode = "SHOWN"
|
||||
else
|
||||
self.mainBarHeight = 58 + self.toastHeight * (now - self.toastStart) / 250
|
||||
end
|
||||
end
|
||||
if self.toastMode == "SHOWN" then
|
||||
self.mainBarHeight = 58 + self.toastHeight
|
||||
elseif self.toastMode == "HIDING" then
|
||||
local now = GetTime()
|
||||
if now >= self.toastStart + 75 then
|
||||
self.toastMode = nil
|
||||
self.mainBarHeight = 58
|
||||
t_remove(self.toastMessages, 1)
|
||||
else
|
||||
self.mainBarHeight = 58 + self.toastHeight * (1 - (now - self.toastStart) / 75)
|
||||
end
|
||||
end
|
||||
if self.toastMode then
|
||||
SetDrawColor(0.85, 0.85, 0.85)
|
||||
DrawImage(nil, 0, self.screenH - self.mainBarHeight, 312, self.mainBarHeight)
|
||||
SetDrawColor(0.1, 0.1, 0.1)
|
||||
DrawImage(nil, 0, self.screenH - self.mainBarHeight + 4, 308, self.mainBarHeight - 4)
|
||||
SetDrawColor(1, 1, 1)
|
||||
DrawString(4, self.screenH - self.mainBarHeight + 8, "LEFT", 20, "VAR", self.toastMessages[1]:gsub("\n.*",""))
|
||||
DrawString(4, self.screenH - self.mainBarHeight + 28, "LEFT", 16, "VAR", self.toastMessages[1]:gsub("^[^\n]*\n?",""))
|
||||
end
|
||||
end
|
||||
|
||||
-- Draw main controls
|
||||
SetDrawColor(0.85, 0.85, 0.85)
|
||||
DrawImage(nil, 0, self.screenH - 58, 312, 58)
|
||||
SetDrawColor(0.1, 0.1, 0.1)
|
||||
DrawImage(nil, 0, self.screenH - 54, 308, 54)
|
||||
self:DrawControls(self.viewPort)
|
||||
|
||||
if self.popups[1] then
|
||||
@@ -274,10 +356,32 @@ function main:LoadSettings()
|
||||
self.accountSessionIDs[child.attrib.accountName] = child.attrib.sessionID
|
||||
end
|
||||
end
|
||||
elseif node.elem == "SharedItems" then
|
||||
for _, child in ipairs(node) do
|
||||
if child.elem == "Item" then
|
||||
local item = { raw = "" }
|
||||
itemLib.parseItemRaw(item)
|
||||
for _, subChild in ipairs(child) do
|
||||
if type(subChild) == "string" then
|
||||
item.raw = subChild
|
||||
itemLib.parseItemRaw(item)
|
||||
end
|
||||
end
|
||||
itemLib.buildItemModList(item)
|
||||
t_insert(self.sharedItems, item)
|
||||
end
|
||||
end
|
||||
elseif node.elem == "Misc" then
|
||||
if node.attrib.buildSortMode then
|
||||
self.buildSortMode = node.attrib.buildSortMode
|
||||
end
|
||||
launch.proxyURL = node.attrib.proxyURL
|
||||
if node.attrib.buildPath then
|
||||
self.buildPath = node.attrib.buildPath
|
||||
end
|
||||
if node.attrib.nodePowerTheme then
|
||||
self.nodePowerTheme = node.attrib.nodePowerTheme
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -303,7 +407,17 @@ function main:SaveSettings()
|
||||
t_insert(accounts, { elem = "Account", attrib = { accountName = accountName, sessionID = sessionID } })
|
||||
end
|
||||
t_insert(setXML, accounts)
|
||||
t_insert(setXML, { elem = "Misc", attrib = { buildSortMode = self.buildSortMode } })
|
||||
local sharedItems = { elem = "SharedItems" }
|
||||
for _, item in ipairs(self.sharedItems) do
|
||||
t_insert(sharedItems, { elem = "Item", [1] = item.raw })
|
||||
end
|
||||
t_insert(setXML, sharedItems)
|
||||
t_insert(setXML, { elem = "Misc", attrib = {
|
||||
buildSortMode = self.buildSortMode,
|
||||
proxyURL = launch.proxyURL,
|
||||
buildPath = (self.buildPath ~= self.defaultBuildPath and self.buildPath or nil),
|
||||
nodePowerTheme = self.nodePowerTheme,
|
||||
} })
|
||||
local res, errMsg = common.xml.SaveXMLFile(setXML, self.userPath.."Settings.xml")
|
||||
if not res then
|
||||
launch:ShowErrMsg("Error saving 'Settings.xml': %s", errMsg)
|
||||
@@ -311,6 +425,55 @@ function main:SaveSettings()
|
||||
end
|
||||
end
|
||||
|
||||
function main:OpenOptionsPopup()
|
||||
local controls = { }
|
||||
controls.proxyType = common.New("DropDownControl", {"TOPLEFT",nil,"TOPLEFT"}, 150, 20, 80, 18, {{val="http",label="HTTP"},{val="socks5",label="SOCKS"}})
|
||||
controls.proxyLabel = common.New("LabelControl", {"RIGHT",controls.proxyType,"LEFT"}, -4, 0, 0, 16, "^7Proxy server:")
|
||||
controls.proxyURL = common.New("EditControl", {"LEFT",controls.proxyType,"RIGHT"}, 4, 0, 206, 18)
|
||||
if launch.proxyURL then
|
||||
local scheme, url = launch.proxyURL:match("(%w+)://(.+)")
|
||||
controls.proxyType:SelByValue(scheme)
|
||||
controls.proxyURL:SetText(url)
|
||||
end
|
||||
controls.buildPath = common.New("EditControl", {"TOPLEFT",nil,"TOPLEFT"}, 150, 44, 290, 18)
|
||||
controls.buildPathLabel = common.New("LabelControl", {"RIGHT",controls.buildPath,"LEFT"}, -4, 0, 0, 16, "^7Build save path:")
|
||||
if self.buildPath ~= self.defaultBuildPath then
|
||||
controls.buildPath:SetText(self.buildPath)
|
||||
end
|
||||
controls.buildPath.tooltip = "Overrides the default save location for builds.\nThe default location is: '"..self.defaultBuildPath.."'"
|
||||
controls.nodePowerTheme = common.New("DropDownControl", {"TOPLEFT",nil,"TOPLEFT"}, 150, 68, 100, 18, {{val="RED/BLUE",label="Red & Blue"},{val="RED/GREEN",label="Red & Green"},{val="GREEN/BLUE",label="Green & Blue"}}, function(sel, value)
|
||||
self.nodePowerTheme = value.val
|
||||
end)
|
||||
controls.nodePowerThemeLabel = common.New("LabelControl", {"RIGHT",controls.nodePowerTheme,"LEFT"}, -4, 0, 0, 16, "^7Node Power colours:")
|
||||
controls.nodePowerTheme.tooltip = "Changes the colour scheme used for the node power display on the passive tree."
|
||||
controls.nodePowerTheme:SelByValue(self.nodePowerTheme)
|
||||
local initialNodePowerTheme = self.nodePowerTheme
|
||||
controls.save = common.New("ButtonControl", nil, -45, 120, 80, 20, "Save", function()
|
||||
if controls.proxyURL.buf:match("%w") then
|
||||
launch.proxyURL = controls.proxyType.list[controls.proxyType.sel].val .. "://" .. controls.proxyURL.buf
|
||||
else
|
||||
launch.proxyURL = nil
|
||||
end
|
||||
if controls.buildPath.buf:match("%S") then
|
||||
self.buildPath = controls.buildPath.buf
|
||||
if not self.buildPath:match("[\\/]$") then
|
||||
self.buildPath = self.buildPath .. "/"
|
||||
end
|
||||
else
|
||||
self.buildPath = self.defaultBuildPath
|
||||
end
|
||||
if self.mode == "LIST" then
|
||||
self.modes.LIST:BuildList()
|
||||
end
|
||||
main:ClosePopup()
|
||||
end)
|
||||
controls.cancel = common.New("ButtonControl", nil, 45, 120, 80, 20, "Cancel", function()
|
||||
self.nodePowerTheme = initialNodePowerTheme
|
||||
main:ClosePopup()
|
||||
end)
|
||||
self:OpenPopup(450, 150, "Options", controls, "save", nil, "cancel")
|
||||
end
|
||||
|
||||
function main:OpenUpdatePopup()
|
||||
local changeList = { }
|
||||
for line in io.lines("changelog.txt") do
|
||||
|
||||
@@ -88,6 +88,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Classes", "Classes", "{7EE4
|
||||
Classes\PopupDialog.lua = Classes\PopupDialog.lua
|
||||
Classes\ScrollBarControl.lua = Classes\ScrollBarControl.lua
|
||||
Classes\SectionControl.lua = Classes\SectionControl.lua
|
||||
Classes\SharedItemListControl.lua = Classes\SharedItemListControl.lua
|
||||
Classes\SkillListControl.lua = Classes\SkillListControl.lua
|
||||
Classes\SkillsTab.lua = Classes\SkillsTab.lua
|
||||
Classes\SliderControl.lua = Classes\SliderControl.lua
|
||||
|
||||
11
README.md
11
README.md
@@ -53,6 +53,17 @@ If you'd like to help support the development of Path of Building, I have a [Pat
|
||||

|
||||
|
||||
## Changelog
|
||||
### 1.4.12 - 2017/05/19
|
||||
* The Items tab now has a "Shared items" list which is shared between all of your builds
|
||||
* Added an Options screen, accessed via a new button at the bottom left corner. The following options have been added:
|
||||
* Proxy server: specifies the proxy that the program should use when updating or importing characters
|
||||
* Build save path: overrides the default save location for builds
|
||||
* Node Power colours: changes the colour scheme used for the node power display
|
||||
* The breakdowns for hit damage types now show the percentage of total hit damage that is being dealt as that type
|
||||
* Some friendly toasts have set up camp in the bottom left corner, and may appear occasionally to convey various messages
|
||||
* With the new installer versions, the program will always update itself when started for the first time, but will still
|
||||
start even if the update check fails
|
||||
|
||||
### 1.4.11 - 2017/05/16
|
||||
* Fixed a stack overflow error that could occur when trying to view breakdowns in the Calcs tab
|
||||
* Fixed interaction between weapon swap and skills granted by items
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
-- Module: Update Check
|
||||
-- Checks for updates
|
||||
--
|
||||
local proxyURL = ...
|
||||
|
||||
local xml = require("xml")
|
||||
local sha1 = require("sha1")
|
||||
@@ -19,6 +20,10 @@ local function downloadFileText(url)
|
||||
local text = ""
|
||||
local easy = curl.easy()
|
||||
easy:setopt_url(url)
|
||||
easy:setopt(curl.OPT_ACCEPT_ENCODING, "")
|
||||
if proxyURL then
|
||||
easy:setopt(curl.OPT_PROXY, proxyURL)
|
||||
end
|
||||
easy:setopt_writefunction(function(data)
|
||||
text = text..data
|
||||
return true
|
||||
@@ -29,8 +34,8 @@ local function downloadFileText(url)
|
||||
return text
|
||||
end
|
||||
ConPrintf("Download failed (%s)", error:msg())
|
||||
if globalRetryLimit == 0 then
|
||||
break
|
||||
if globalRetryLimit == 0 or i == 5 then
|
||||
return nil, error:msg()
|
||||
end
|
||||
globalRetryLimit = globalRetryLimit - 1
|
||||
end
|
||||
@@ -86,7 +91,7 @@ if localManXML and localManXML[1].elem == "PoBVersion" then
|
||||
end
|
||||
if not localVer or not localSource or not localBranch or not next(localFiles) then
|
||||
ConPrintf("Update check failed: invalid local manifest")
|
||||
return
|
||||
return nil, "Invalid local manifest"
|
||||
end
|
||||
localSource = localSource:gsub("{branch}", localBranch)
|
||||
|
||||
@@ -94,10 +99,10 @@ localSource = localSource:gsub("{branch}", localBranch)
|
||||
local remoteVer
|
||||
local remoteFiles = { }
|
||||
local remoteSources = { }
|
||||
local remoteManText = downloadFileText(localSource.."manifest.xml")
|
||||
local remoteManText, errMsg = downloadFileText(localSource.."manifest.xml")
|
||||
if not remoteManText then
|
||||
ConPrintf("Update check failed: couldn't download version manifest")
|
||||
return
|
||||
return nil, "Couldn't download version manifest.\nReason: "..errMsg.."\nCheck your internet connectivity.\nIf you are using a proxy, specify it in Options."
|
||||
end
|
||||
local remoteManXML = xml.ParseXML(remoteManText)
|
||||
if remoteManXML and remoteManXML[1].elem == "PoBVersion" then
|
||||
@@ -126,7 +131,7 @@ if remoteManXML and remoteManXML[1].elem == "PoBVersion" then
|
||||
end
|
||||
if not remoteVer or not next(remoteSources) or not next(remoteFiles) then
|
||||
ConPrintf("Update check failed: invalid remote manifest")
|
||||
return
|
||||
return nil, "Invalid remote manifest"
|
||||
end
|
||||
|
||||
-- Build lists of files to be updated or deleted
|
||||
@@ -225,7 +230,7 @@ for name, zip in pairs(zipFiles) do
|
||||
end
|
||||
if failedFile then
|
||||
ConPrintf("Update failed: one or more files couldn't be downloaded")
|
||||
return
|
||||
return nil, "One or more files couldn't be downloaded.\nCheck your internet connectivity,\nor try again later."
|
||||
end
|
||||
|
||||
-- Create new manifest
|
||||
|
||||
@@ -1,3 +1,13 @@
|
||||
VERSION[1.4.12][2017/05/19]
|
||||
* The Items tab now has a "Shared items" list which is shared between all of your builds
|
||||
* Added an Options screen, accessed via a new button at the bottom left corner. The following options have been added:
|
||||
* Proxy server: specifies the proxy that the program should use when updating or importing characters
|
||||
* Build save path: overrides the default save location for builds
|
||||
* Node Power colours: changes the colour scheme used for the node power display
|
||||
* The breakdowns for hit damage types now show the percentage of total hit damage that is being dealt as that type
|
||||
* Some friendly toasts have set up camp in the bottom left corner, and may appear occasionally to convey various messages
|
||||
* With the new installer versions, the program will always update itself when started for the first time, but will still
|
||||
start even if the update check fails
|
||||
VERSION[1.4.11][2017/05/16]
|
||||
* Fixed a stack overflow error that could occur when trying to view breakdowns in the Calcs tab
|
||||
* Fixed interaction between weapon swap and skills granted by items
|
||||
|
||||
45
manifest.xml
45
manifest.xml
@@ -1,13 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<PoBVersion>
|
||||
<Version number="1.4.11"/>
|
||||
<Version number="1.4.12"/>
|
||||
<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="3670580bf9df1a454c24c4d08f0ec718f40b53bb" name="Launch.lua" part="program"/>
|
||||
<File sha1="72b9bea1871e94a643e4471fd84bbedbc7810336" name="UpdateCheck.lua" part="program"/>
|
||||
<File sha1="4f17937f2b37784e169a3792b235f2a0a3961e61" name="UpdateApply.lua" part="program"/>
|
||||
<File sha1="b0e42a8db9250e9b5be96b4471a3745f9079c9bb" name="changelog.txt" part="program"/>
|
||||
<File sha1="125d41380b8ade6a3a4f331ad787946f3bd280c5" name="changelog.txt" part="program"/>
|
||||
<File sha1="3ff73a3c46cb7bd8a53c9d47a893dd2b4c5c60ab" name="Classes/BuildListControl.lua" part="program"/>
|
||||
<File sha1="dc2ffb55b4aae04b86886b25bbf219a301b21340" name="Classes/ButtonControl.lua" part="program"/>
|
||||
<File sha1="9391d403c4ad8e59fd02fba76158acb4159e0562" name="Classes/CalcBreakdownControl.lua" part="program"/>
|
||||
@@ -15,18 +15,18 @@
|
||||
<File sha1="e43c0c851f7cfb022baba23bcbdc4c96b4078a53" name="Classes/CalcsTab.lua" part="program"/>
|
||||
<File sha1="573b791867ada18da1e93de8fc33ce6cf9ec9ab3" name="Classes/CheckBoxControl.lua" part="program"/>
|
||||
<File sha1="4a83db8e6a6c83756795192e81c3237839ef3cb3" name="Classes/ConfigTab.lua" part="program"/>
|
||||
<File sha1="bbb08f183746d6ec023e2bd08fb7a89d365381da" name="Classes/Control.lua" part="program"/>
|
||||
<File sha1="2cb1067db9cdb9e9d5327c41ec4781aaf2c036e1" name="Classes/Control.lua" part="program"/>
|
||||
<File sha1="45be3d636d1eaff18bed7095478c22abfd0590ef" name="Classes/ControlHost.lua" part="program"/>
|
||||
<File sha1="9f05f72260f896eea09c1a8fb28f58973ce4d3ff" name="Classes/DropDownControl.lua" part="program"/>
|
||||
<File sha1="4fadcbb94abdd8793c8041fab9269e0f41ebc73a" name="Classes/EditControl.lua" part="program"/>
|
||||
<File sha1="f3de897d524a19b7838ada898aae9af23d12cd21" name="Classes/GemSelectControl.lua" part="program"/>
|
||||
<File sha1="d6c2758c03ef6b052678210396d8c2f5cb7a0946" name="Classes/ImportTab.lua" part="program"/>
|
||||
<File sha1="7bde7b84e4925162ab869ed788c52453d7ad1c44" name="Classes/ItemDBControl.lua" part="program"/>
|
||||
<File sha1="9ddb90cd201b691298ec2fd97004f5807271b153" name="Classes/ItemListControl.lua" part="program"/>
|
||||
<File sha1="0d8d46af9ea346867e2a4f324baa835022a42267" name="Classes/ItemSlotControl.lua" part="program"/>
|
||||
<File sha1="d1d5d7a65e6c860bf112da90f5d267313b1da3d9" name="Classes/ItemsTab.lua" part="program"/>
|
||||
<File sha1="3f9330cb27c65546c644195b53bff07ef841858e" name="Classes/ImportTab.lua" part="program"/>
|
||||
<File sha1="9967648bc98f10803eef3862781acd68d0364af8" name="Classes/ItemDBControl.lua" part="program"/>
|
||||
<File sha1="2620eaacffba09ed80c2c41142e9e052eeef4207" name="Classes/ItemListControl.lua" part="program"/>
|
||||
<File sha1="b7c3df4a3b9cdd19efac5d92273aa72d409fa833" name="Classes/ItemSlotControl.lua" part="program"/>
|
||||
<File sha1="05f693476b683a8e021d07a73a0cfa6edd992df5" name="Classes/ItemsTab.lua" part="program"/>
|
||||
<File sha1="62138c7db82d57d638a16610a26acd0de75d3486" name="Classes/LabelControl.lua" part="program"/>
|
||||
<File sha1="94a2e5bdbd18bed6c1ad5f2de52a58e71f4ed6cf" name="Classes/ListControl.lua" part="program"/>
|
||||
<File sha1="1316547bcb3af0866aa9c58eb39b38c1965ef23d" name="Classes/ListControl.lua" part="program"/>
|
||||
<File sha1="75c943489d007c34793f6568c28cee2bc1843e75" name="Classes/MinionListControl.lua" part="program"/>
|
||||
<File sha1="ed86df273035636fea3589ad48f9bcc18aba5346" name="Classes/ModDB.lua" part="program"/>
|
||||
<File sha1="d4911a6780f4f8cf2b30cd88565a801fa9563fef" name="Classes/ModList.lua" part="program"/>
|
||||
@@ -34,31 +34,32 @@
|
||||
<File sha1="cf400bb69d6668bdb44f595572b84194ac728b72" name="Classes/PassiveSpec.lua" part="program"/>
|
||||
<File sha1="2802110b05a2ebdf39e62c1e9cfcf72d9538f359" name="Classes/PassiveSpecListControl.lua" part="program"/>
|
||||
<File sha1="bcd74b6409a4d39d27b2f4db8106daf763d97f47" name="Classes/PassiveTree.lua" part="program"/>
|
||||
<File sha1="c66811dc709dc18d88ce9fcaec53161c7ca650fe" name="Classes/PassiveTreeView.lua" part="program"/>
|
||||
<File sha1="b9cdf2afc4fbb5244d2d30660c03509209aa95e4" name="Classes/PassiveTreeView.lua" part="program"/>
|
||||
<File sha1="9d91ef81ac4fd8d5a1e16be17bdf199545209d87" 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="0296172fbd4634107766cf78b4ec428739942f37" name="Classes/SharedItemListControl.lua" part="program"/>
|
||||
<File sha1="0d6551c10866549a2f808c5b11be05e2cfa70fe3" name="Classes/SkillListControl.lua" part="program"/>
|
||||
<File sha1="560bd7cfeb4b354e4b7c9b8b28862714569b0683" name="Classes/SkillsTab.lua" part="program"/>
|
||||
<File sha1="a8bf069bb97a05c1d304f3aef44c29bcda4d3d99" name="Classes/SkillsTab.lua" part="program"/>
|
||||
<File sha1="6317bd9ba391832dccafcb62409a5ce2988d1928" name="Classes/SliderControl.lua" part="program"/>
|
||||
<File sha1="ada27b91a3c466689111429105edd4ee28ad0c3f" name="Classes/TextListControl.lua" part="program"/>
|
||||
<File sha1="73f7b9a0657e616be4252dcc5e57e8bb057d2606" name="Classes/TreeTab.lua" part="program"/>
|
||||
<File sha1="c5344a84f4a6ffbfe56b66fb95a3e24b53fcca43" name="Classes/TreeTab.lua" part="program"/>
|
||||
<File sha1="4b7675c8b4fe71cade7dd3d70793df1ed8022d01" name="Classes/UndoHandler.lua" part="program"/>
|
||||
<File sha1="c01971cdd5bc9ed758cacdace3403bbeda71aef9" name="Modules/Build.lua" part="program"/>
|
||||
<File sha1="e206c9e01cc46c0bd9ab5b1ea17b40e9f1d340ec" name="Modules/Build.lua" part="program"/>
|
||||
<File sha1="e5fba9a6bf560a005e7b756ac5b703e36eb8ba59" name="Modules/BuildList.lua" part="program"/>
|
||||
<File sha1="403311a61d926adb1150a75d8100032f45c2ef17" name="Modules/CalcActiveSkill.lua" part="program"/>
|
||||
<File sha1="b2b8d55258d9763d7c7a4a9ca1f99be3973528a8" name="Modules/CalcBreakdown.lua" part="program"/>
|
||||
<File sha1="8647664477fef0e771500b96342496c83ab3fe4f" name="Modules/CalcDefence.lua" part="program"/>
|
||||
<File sha1="a8758ac6817d509cc3c5913402d38fb022185651" name="Modules/CalcOffence.lua" part="program"/>
|
||||
<File sha1="a91717945f21ce2c65d12dc8e5573c7c21a2f489" name="Modules/CalcPerform.lua" part="program"/>
|
||||
<File sha1="6f33ceca6c83007d1a539cb9c1803a29a75e5463" name="Modules/CalcOffence.lua" part="program"/>
|
||||
<File sha1="20abad519a1ff09cf9e529f61f88609daef28d48" name="Modules/CalcPerform.lua" part="program"/>
|
||||
<File sha1="23c918fa7005af4413a9875571fe56946c76a931" name="Modules/Calcs.lua" part="program"/>
|
||||
<File sha1="39a28dc4f69724dfda868d8253fd65943bd9e325" name="Modules/CalcSections.lua" part="program"/>
|
||||
<File sha1="5308683d3c078886b6217418b12e6766b75623f4" name="Modules/CalcSetup.lua" part="program"/>
|
||||
<File sha1="cf88209fc039477f700336e764ffacfe531f5211" name="Modules/CalcSetup.lua" part="program"/>
|
||||
<File sha1="d15500aeb71f04993850bc9401d1e20e3436c795" name="Modules/CalcTools.lua" part="program"/>
|
||||
<File sha1="1a3f16372f27e7b94d373e6c61affb4ebe478b13" name="Modules/Common.lua" part="program"/>
|
||||
<File sha1="b87a64e3b2d14246dcc2e19fa65bb44eed1428f8" name="Modules/Data.lua" part="program"/>
|
||||
<File sha1="d5d22f2fca12cd9148ec17016aa2741ee844a692" name="Modules/ItemTools.lua" part="program"/>
|
||||
<File sha1="ae4b307aceb643ac23d6fd2ea5ec02e5234a43e9" name="Modules/Main.lua" part="program"/>
|
||||
<File sha1="0790c92233323739ceb0671fb2cc4df92f9af621" name="Modules/Main.lua" part="program"/>
|
||||
<File sha1="6f572a9c9c5b6d85739f4c0cfda8386b4874af34" name="Modules/ModParser.lua" part="program"/>
|
||||
<File sha1="08bfd94f291b10dbdc75c94d7f2928c8bbd1a1d7" name="Modules/ModTools.lua" part="program"/>
|
||||
<File sha1="c345cdcf374d271411aa424ab150c0edbb5a362d" name="Assets/game_ui_small.png" part="program"/>
|
||||
@@ -123,9 +124,9 @@
|
||||
<File sha1="b4611a28551b3480d0886c624b81242c9cdae6f2" name="Data/Uniques/wand.lua" part="program"/>
|
||||
<File platform="win32" sha1="7e5a3242c9a4296dc8377feb4c9d824f3f0a3cc1" name="Path of Building.exe" part="runtime"/>
|
||||
<File platform="win32" sha1="7a973d3c0b5121e6aad0dcb9323be5b432fc63e7" name="lua51.dll" part="runtime"/>
|
||||
<File platform="win32" sha1="987a5860c997da90f7ec468ee62b4a0e87de10cf" name="SimpleGraphic.dll" part="runtime"/>
|
||||
<File platform="win32" sha1="54affb3a261404479b5cc932753c0a36446992d9" name="libcurl.dll" part="runtime"/>
|
||||
<File platform="win32" sha1="5b9c38e7a05a615e45a6b00ad1ff1a92832bcc84" name="lcurl.dll" part="runtime"/>
|
||||
<File platform="win32" sha1="a361d8767947cab6807a4fb4b2575b480be4d4ae" name="SimpleGraphic.dll" part="runtime"/>
|
||||
<File platform="win32" sha1="5f68674e22a389dddeb72078b7d9d69d29881bdd" name="libcurl.dll" part="runtime"/>
|
||||
<File platform="win32" sha1="d2a79684bd7abd05847d3825900c5617f41fac4b" name="lcurl.dll" part="runtime"/>
|
||||
<File platform="win32" sha1="294f5209c0abdf173435bce8234f1f94887ab1a9" name="lzip.dll" part="runtime"/>
|
||||
<File sha1="74cc6c47e7cda18211e57b9e062368eab3c26bab" name="SimpleGraphic/Fonts/Bitstream Vera Sans Mono.10.tga" part="runtime"/>
|
||||
<File sha1="1977206f0efc5035834ecbf93ca7d046010d8aab" name="SimpleGraphic/Fonts/Bitstream Vera Sans Mono.12.tga" part="runtime"/>
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user