Skip to content

Commit 3cf2127

Browse files
author
LocalIdentity
committed
Merge branch 'dev'
2 parents 3e28ad5 + b6436f6 commit 3cf2127

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

96 files changed

+10824
-9553
lines changed

CHANGELOG.md

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,49 @@
1+
### 1.4.170.26 - 2021/02/07
2+
* Add control to set Vaal Timeless Jewel influenced passive skills to random mods (Wires77)
3+
* Add all new uniques in game patch 3.13.0 (Nostrademous, ppoelzl)
4+
* Add support for the following uniques:
5+
* Arn's Anguish
6+
* Doppelgänger
7+
* Graven's Secret
8+
* Olesya's Delight
9+
* Add Flickershade Spectre (Kayella)
10+
* Add support for "Cobra Lash Chains additional times" helmet enchantment (Puddlestomper)
11+
* Add Belt Enchantments to Item Crafting from Harvest improved Offering to the Goddess Uber Lab runs. Not all modifiers parse yet, but most do (Nostrademous)
12+
* Add Elevated Affixes to Item Crafting (Nostrademous)
13+
* Add support for Blizzard Crown implicit (Nostrademous)
14+
* Add support for Brutal, Affliction and Absorption Charge (damage recoup from Absorption Charges is not supported) coverstion from Endurance, Frenzy, Power charges via Unique Belts (Nostrademous)
15+
* Add support for 'On Scorched Ground' in Config Tab when using Legacy of Fury unique boots (Nostrademous)
16+
* Add support and extraction of 'Thirst for Blood' unique ability from Jack, the Axe unique (Nostrademous, LocalIdentity)
17+
* Add support for Doppleganger's insane/sane specification via Config Tab (Nostrademous)
18+
* Add support for Goblinedge Power/Frenzy charge interaction (ppoelzl)
19+
* Add limit cap to Replica Nebulis unique (Wires77)
20+
* Add parsing support for Anomalous Minion Life (ALT-F-X)
21+
* Updated Max Awakening Level for Sirus to scale to 9 achievable through Atlas Passives (Quote_a)
22+
* Add support for Phantasmal Ancestral Protector (ALT-F-X)
23+
* Add support for impale from spells (Wires77)
24+
* Add support for Phantasmal Might from The Black Cane (Wires77)
25+
* Add support for Shield Shatter on Shattershard (Wires77)
26+
* Add support for automatic chill from Summon Skitterbots (Quote_a)
27+
28+
* Fix Timeless Jewel passives not accounting for past skill tree versions (Wires77)
29+
* Fix Spectre stats scaling with Spectre level using incorrect values (zao)
30+
* Fix mod ranges on Legacy of Fury (Nostrademous)
31+
* Fix Endurance/Frenzy/Power charges missing for Minions (Wires77)
32+
* Fix multiple crashes in the skills tab related to gem quality (Nostrademous, ALT-F-X)
33+
* Corrected enforcement of Minion Skill level requirements (zao)
34+
* Fix Enduring Cry's Life Regen calculation (tommysays)
35+
* Fix Ancestral Cry's Armor increase calculation (tommysays)
36+
* Fix Divergent Minion Damage to be an "Increase" instead of "More" as it should have been (Wires77)
37+
* Fix accounting for Abyssal Jewels in Offhand Slots (zao)
38+
* Updated Replica Alberon's Warpath chaos damage gain per strength to new value (RUSshy)
39+
* Fix Flame Wall's secondary not being affected by Area Damage (Wires77)
40+
* Fix Impale Support and Divergent Fortify application of Physical Damage Reduction (Wires77)
41+
* Fix '+1 to Maximum Summon Ballista Totems' to not also increase the allowed count of Ancestral Totems (Wires77)
42+
* Fix Disintegrator to include Block Attack Damage on Ritual variant (Wires77)
43+
* Fix Offering to the Serpent unique gloves stat attributes (PJacek)
44+
* Fix Cameria's Avarice unique mace to state "on Hit" rather than "on Kill" (ALT-F-X)
45+
* Fix Phantasmal Smite quality bonus (ALT-F-X)
46+
* Updated many Configuration Tab tooltips to display updated values (zao)
147
### 1.4.170.25 - 2021/01/16
248
* Fix Trinity Support
349
* Fix Hrimnor's Resolve
@@ -2970,4 +3016,4 @@ Other changes:
29703016
* Fixed an error relating to multipart skills
29713017

29723018
### 1.0.1 - 2016/08/31
2973-
* Fixed an error in the build list screen
3019+
* Fixed an error in the build list screen

Classes/ConfigTab.lua

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,8 +166,8 @@ local ConfigTabClass = newClass("ConfigTab", "UndoHandler", "ControlHost", "Cont
166166
end
167167
elseif varData.ifFlag then
168168
control.shown = function()
169-
local skillModList = self.build.calcsTab.calcsEnv.player.mainSkill.skillModList
170-
local skillFlags = self.build.calcsTab.calcsEnv.player.mainSkill.skillFlags
169+
local skillModList = self.build.calcsTab.mainEnv.player.mainSkill.skillModList
170+
local skillFlags = self.build.calcsTab.mainEnv.player.mainSkill.skillFlags
171171
-- Check both the skill mods for flags and flags that are set via calcPerform
172172
return skillFlags[varData.ifFlag] or skillModList:Flag(nil, varData.ifFlag)
173173
end

Classes/GemSelectControl.lua

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,10 @@ function GemSelectClass:Draw(viewPort)
351351
gemInstance.gemData = gemData
352352
-- Clear the displayEffect so it only displays the temporary gem instance
353353
gemInstance.displayEffect = nil
354+
-- Check valid qualityId, set to 'Default' if missing
355+
if gemInstance.qualityId == nil or gemInstance.qualityId == "" then
356+
gemInstance.qualityId = "Default"
357+
end
354358
-- Add hovered gem to tooltip
355359
self:AddGemTooltip(gemInstance)
356360
-- Calculate with the new gem
@@ -388,6 +392,10 @@ function GemSelectClass:Draw(viewPort)
388392
if mOver and (not self.skillsTab.selControl or self.skillsTab.selControl._className ~= "GemSelectControl" or not self.skillsTab.selControl.dropped) then
389393
local gemInstance = self.skillsTab.displayGroup.gemList[self.index]
390394
if gemInstance and gemInstance.gemData then
395+
-- Check valid qualityId, set to 'Default' if missing
396+
if gemInstance.qualityId == nil or gemInstance.qualityId == "" then
397+
gemInstance.qualityId = "Default"
398+
end
391399
SetDrawLayer(nil, 10)
392400
self.tooltip:Clear()
393401
self:AddGemTooltip(gemInstance)

Classes/Item.lua

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ local catalystTags = {
2121
{ "jewellery_defense", "defences" },
2222
{ "jewellery_elemental" ,"elemental_damage" },
2323
}
24-
local classNames = { ["Marauder"] = true, ["Duelist"] = true, ["Ranger"] = true, ["Shadow"] = true, ["Witch"] = true, ["Templar"] = true, ["Scion"] = true }
2524

2625
local function getCatalystScalar(catalystId, tags, quality)
2726
if not catalystId or type(catalystId) ~= "number" or not catalystTags[catalystId] or not tags or type(tags) ~= "table" or #tags == 0 then
@@ -293,7 +292,8 @@ function ItemClass:ParseRaw(raw)
293292
end
294293
elseif specName == "CatalystQuality" then
295294
self.catalystQuality = tonumber(specVal)
296-
elseif classNames[specName] then
295+
-- Anything else is an explicit with a colon in it (Fortress Covenant, Pure Talent, etc) unless it's part of the custom name
296+
elseif not (self.name:match(specName) and self.name:match(specVal)) then
297297
foundExplicit = true
298298
gameModeStage = "EXPLICIT"
299299
end
@@ -567,9 +567,13 @@ function ItemClass:GetModSpawnWeight(mod, extraTags)
567567
return false
568568
end
569569

570+
local function HasMavenInfluence(modAffix)
571+
return modAffix:match("Elevated")
572+
end
573+
570574
for i, key in ipairs(mod.weightKey) do
571575
if self.base.tags[key] or (extraTags and extraTags[key]) or HasInfluenceTag(key) then
572-
weight = mod.weightVal[i]
576+
weight = (HasInfluenceTag(key) and HasMavenInfluence(mod.affix)) and 1000 or mod.weightVal[i]
573577
break
574578
end
575579
end
@@ -929,8 +933,7 @@ function ItemClass:BuildModListForSlotNum(baseList, slotNum)
929933
for _, mod in ipairs(modList) do
930934
-- Convert accuracy, L/MGoH and PAD Leech modifiers to local
931935
if (
932-
(mod.name == "Accuracy" and mod.flags == 0) or
933-
(mod.name == "ImpaleChance" ) or
936+
(mod.name == "Accuracy" and mod.flags == 0) or (mod.name == "ImpaleChance" and mod.flags ~= ModFlag.Spell) or
934937
((mod.name == "LifeOnHit" or mod.name == "ManaOnHit") and mod.flags == ModFlag.Attack) or
935938
((mod.name == "PhysicalDamageLifeLeech" or mod.name == "PhysicalDamageManaLeech") and mod.flags == ModFlag.Attack)
936939
) and (mod.keywordFlags == 0 or mod.keywordFlags == KeywordFlag.Attack) and not mod[1] then

Classes/ItemSlotControl.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ local ItemSlotClass = newClass("ItemSlotControl", "DropDownControl", function(se
2727
self.items = { }
2828
self.selItemId = 0
2929
self.slotName = slotName
30-
self.slotNum = tonumber(slotName:match("%d+"))
30+
self.slotNum = tonumber(slotName:match("%d+$") or slotName:match("%d+"))
3131
if slotName:match("Flask") then
3232
self.controls.activate = new("CheckBoxControl", {"RIGHT",self,"LEFT"}, -2, 0, 20, nil, function(state)
3333
self.active = state

Classes/ItemsTab.lua

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1719,7 +1719,13 @@ function ItemsTabClass:EnchantDisplayItem(enchantSlot)
17191719

17201720
local controls = { }
17211721
local enchantments = self.displayItem.enchantments
1722-
local haveSkills = not self.displayItem.enchantments[self.build.data.labyrinths[1].name]
1722+
local haveSkills = true
1723+
for _, lab in ipairs(self.build.data.labyrinths) do
1724+
if self.displayItem.enchantments[lab.name] then
1725+
haveSkills = false
1726+
break
1727+
end
1728+
end
17231729
local skillList = { }
17241730
local skillsUsed = { }
17251731
if haveSkills then

Classes/PassiveTreeView.lua

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -812,7 +812,7 @@ function PassiveTreeViewClass:AddNodeTooltip(tooltip, node, build)
812812
tooltip:AddLine(14, colorCodes.TIP.."Tip: Hold Shift or Ctrl to hide this tooltip.")
813813
return
814814
end
815-
815+
816816
-- Node name
817817
self:AddNodeName(tooltip, node, build)
818818
if launch.devModeAlt then
@@ -852,6 +852,14 @@ function PassiveTreeViewClass:AddNodeTooltip(tooltip, node, build)
852852
end
853853
end
854854

855+
-- Conqueror node editing
856+
if node and node.conqueredBy and
857+
(node.conqueredBy.conqueror.type == "vaal"
858+
or node.isNotable) then
859+
tooltip:AddSeparator(14)
860+
tooltip:AddLine(14, colorCodes.TIP.."Tip: Right click to edit the modifiers for this node")
861+
end
862+
855863
-- Mod differences
856864
if self.showStatDifferences then
857865
local calcFunc, calcBase = build.calcsTab:GetMiscCalculator(build)

Classes/SkillsTab.lua

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,9 @@ function SkillsTabClass:GetBaseNameAndQuality(gemTypeLine, quality)
172172
for _, entry in ipairs(alternateGemQualityList) do
173173
if firstword == entry.label then
174174
-- return the gem name minus <altqual> without a leading space and the new resolved type
175+
if entry.type == nil or entry.type == "" then
176+
entry.type = "Default"
177+
end
175178
return otherwords, entry.type
176179
end
177180
end

Classes/TreeTab.lua

Lines changed: 49 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -426,12 +426,12 @@ function TreeTabClass:ModifyNodePopup(selectedNode)
426426
local controls = { }
427427
local modGroups = { }
428428
local smallAdditions = {"Strength", "Dex", "Devotion"}
429-
if not self.build.latestTree.legion.editedNodes then
430-
self.build.latestTree.legion.editedNodes = { }
429+
if not self.build.spec.tree.legion.editedNodes then
430+
self.build.spec.tree.legion.editedNodes = { }
431431
end
432432
local function buildMods(selectedNode)
433433
wipeTable(modGroups)
434-
for _, node in pairs(self.build.latestTree.legion.nodes) do
434+
for _, node in pairs(self.build.spec.tree.legion.nodes) do
435435
if node.id:match("^"..selectedNode.conqueredBy.conqueror.type.."_.+") and node["not"] == (selectedNode.isNotable or false) and not node.ks then
436436
t_insert(modGroups, {
437437
label = node.dn,
@@ -441,7 +441,7 @@ function TreeTabClass:ModifyNodePopup(selectedNode)
441441
})
442442
end
443443
end
444-
for _, addition in pairs(self.build.latestTree.legion.additions) do
444+
for _, addition in pairs(self.build.spec.tree.legion.additions) do
445445
-- exclude passives that are already added (vaal, attributes, devotion)
446446
if addition.id:match("^"..selectedNode.conqueredBy.conqueror.type.."_.+") and not isValueInArray(smallAdditions, addition.dn) and selectedNode.conqueredBy.conqueror.type ~= "vaal" then
447447
t_insert(modGroups, {
@@ -454,11 +454,11 @@ function TreeTabClass:ModifyNodePopup(selectedNode)
454454
end
455455
end
456456
local function addModifier(selectedNode)
457-
local newLegionNode = self.build.latestTree.legion.nodes[modGroups[controls.modSelect.selIndex].id]
457+
local newLegionNode = self.build.spec.tree.legion.nodes[modGroups[controls.modSelect.selIndex].id]
458458
-- most nodes only replace or add 1 mod, so we need to just get the first control
459459
local modDesc = string.gsub(controls[1].label, "%^7", "")
460460
if selectedNode.conqueredBy.conqueror.type == "eternal" or selectedNode.conqueredBy.conqueror.type == "templar" then
461-
self.specList[1]:NodeAdditionOrReplacementFromString(selectedNode, modDesc, true)
461+
self.build.spec:NodeAdditionOrReplacementFromString(selectedNode, modDesc, true)
462462
selectedNode.dn = newLegionNode.dn
463463
selectedNode.sprites = newLegionNode.sprites
464464
selectedNode.icon = newLegionNode.icon
@@ -468,24 +468,30 @@ function TreeTabClass:ModifyNodePopup(selectedNode)
468468
selectedNode.sprites = newLegionNode.sprites
469469
selectedNode.icon = newLegionNode.icon
470470
selectedNode.spriteId = newLegionNode.id
471-
self.specList[1]:NodeAdditionOrReplacementFromString(selectedNode, modDesc, true)
471+
if modDesc ~= "" then
472+
self.specList[1]:NodeAdditionOrReplacementFromString(selectedNode, modDesc, true)
473+
end
472474

473475
-- Vaal is the exception
474-
if controls[2] then
475-
modDesc = string.gsub(controls[2].label, "%^7", "")
476-
self.specList[1]:NodeAdditionOrReplacementFromString(selectedNode, modDesc, false)
476+
local i = 2
477+
while controls[i] do
478+
modDesc = string.gsub(controls[i].label, "%^7", "")
479+
if modDesc ~= "" then
480+
self.specList[1]:NodeAdditionOrReplacementFromString(selectedNode, modDesc, false)
481+
end
482+
i = i + 1
477483
end
478484
else
479485
-- Replace the node first before adding the new line so we don't get multiple lines
480-
if self.build.latestTree.legion.editedNodes[selectedNode.conqueredBy.id] and self.build.latestTree.legion.editedNodes[selectedNode.conqueredBy.id][selectedNode.id] then
481-
self.specList[1]:ReplaceNode(selectedNode, self.build.latestTree.nodes[selectedNode.id])
486+
if self.build.spec.tree.legion.editedNodes[selectedNode.conqueredBy.id] and self.build.spec.tree.legion.editedNodes[selectedNode.conqueredBy.id][selectedNode.id] then
487+
self.build.spec:ReplaceNode(selectedNode, self.build.spec.tree.nodes[selectedNode.id])
482488
end
483-
self.specList[1]:NodeAdditionOrReplacementFromString(selectedNode, modDesc, false)
489+
self.build.spec:NodeAdditionOrReplacementFromString(selectedNode, modDesc, false)
484490
end
485-
if not self.build.latestTree.legion.editedNodes[selectedNode.conqueredBy.id] then
486-
t_insert(self.build.latestTree.legion.editedNodes, selectedNode.conqueredBy.id, {})
491+
if not self.build.spec.tree.legion.editedNodes[selectedNode.conqueredBy.id] then
492+
t_insert(self.build.spec.tree.legion.editedNodes, selectedNode.conqueredBy.id, {})
487493
end
488-
t_insert(self.build.latestTree.legion.editedNodes[selectedNode.conqueredBy.id], selectedNode.id, copyTable(selectedNode, true))
494+
t_insert(self.build.spec.tree.legion.editedNodes[selectedNode.conqueredBy.id], selectedNode.id, copyTable(selectedNode, true))
489495
end
490496

491497
local function constructUI(modGroup)
@@ -496,18 +502,29 @@ function TreeTabClass:ModifyNodePopup(selectedNode)
496502
controls["slider"..i] = nil
497503
i = i + 1
498504
end
499-
for idx, desc in ipairs(modGroup.descriptions) do
500-
controls[idx] = new("LabelControl", {"TOPLEFT", controls["slider"..idx-1] or controls[idx-1] or controls.modSelect,"TOPLEFT"}, 0, 20, 600, 16, "^7"..desc)
501-
totalHeight = totalHeight + 20
502-
if desc:match("%(%-?[%d%.]+%-[%d%.]+%)") then
503-
controls["slider"..idx] = new("SliderControl", {"TOPLEFT",controls[idx],"BOTTOMLEFT"}, 0, 2, 300, 16, function(val)
504-
controls[idx].label = itemLib.applyRange(modGroup.descriptions[idx], val)
505+
-- special handling for custom vaal notables (Might of the Vaal and Legacy of the Vaal)
506+
if next(modGroup.descriptions) == nil then
507+
for idx=1,4 do
508+
controls[idx] = new("EditControl", {"TOPLEFT", controls["slider"..idx-1] or controls[idx-1] or controls.modSelect,"TOPLEFT"}, 0, 20, 600, 16, "", "Modifier "..idx, "%c%(%)", 100, function(buf)
509+
controls[idx].label = buf
505510
end)
506-
controls["slider"..idx]:SetVal(.5)
507-
controls["slider"..idx].width = function()
508-
return controls["slider"..idx].divCount and 300 or 100
509-
end
511+
controls[idx].label = ""
512+
totalHeight = totalHeight + 20
513+
end
514+
else
515+
for idx, desc in ipairs(modGroup.descriptions) do
516+
controls[idx] = new("LabelControl", {"TOPLEFT", controls["slider"..idx-1] or controls[idx-1] or controls.modSelect,"TOPLEFT"}, 0, 20, 600, 16, "^7"..desc)
510517
totalHeight = totalHeight + 20
518+
if desc:match("%(%-?[%d%.]+%-[%d%.]+%)") then
519+
controls["slider"..idx] = new("SliderControl", {"TOPLEFT",controls[idx],"BOTTOMLEFT"}, 0, 2, 300, 16, function(val)
520+
controls[idx].label = itemLib.applyRange(modGroup.descriptions[idx], val)
521+
end)
522+
controls["slider"..idx]:SetVal(.5)
523+
controls["slider"..idx].width = function()
524+
return controls["slider"..idx].divCount and 300 or 100
525+
end
526+
totalHeight = totalHeight + 20
527+
end
511528
end
512529
end
513530
main.popups[1].height = totalHeight + 30
@@ -534,29 +551,29 @@ function TreeTabClass:ModifyNodePopup(selectedNode)
534551
main:ClosePopup()
535552
end)
536553
controls.reset = new("ButtonControl", nil, 0, 75, 80, 20, "Reset Node", function()
537-
if self.build.latestTree.legion.editedNodes[selectedNode.conqueredBy.id] then
538-
self.build.latestTree.legion.editedNodes[selectedNode.conqueredBy.id][selectedNode.id] = nil
554+
if self.build.spec.tree.legion.editedNodes[selectedNode.conqueredBy.id] then
555+
self.build.spec.tree.legion.editedNodes[selectedNode.conqueredBy.id][selectedNode.id] = nil
539556
end
540557
if selectedNode.conqueredBy.conqueror.type == "vaal" and selectedNode.type == "Normal" then
541-
local legionNode = self.build.latestTree.legion.nodes["vaal_small_fire_resistance"]
558+
local legionNode = self.build.spec.tree.legion.nodes["vaal_small_fire_resistance"]
542559
selectedNode.dn = "Vaal small node"
543560
selectedNode.sd = {"Right click to set mod"}
544561
selectedNode.sprites = legionNode.sprites
545562
selectedNode.mods = {""}
546563
selectedNode.modList = new("ModList")
547564
selectedNode.modKey = ""
548565
elseif selectedNode.conqueredBy.conqueror.type == "vaal" and selectedNode.type == "Notable" then
549-
local legionNode = self.build.latestTree.legion.nodes["vaal_notable_curse_1"]
566+
local legionNode = self.build.spec.tree.legion.nodes["vaal_notable_curse_1"]
550567
selectedNode.dn = "Vaal notable node"
551568
selectedNode.sd = {"Right click to set mod"}
552569
selectedNode.sprites = legionNode.sprites
553570
selectedNode.mods = {""}
554571
selectedNode.modList = new("ModList")
555572
selectedNode.modKey = ""
556573
else
557-
self.specList[1]:ReplaceNode(selectedNode, self.build.latestTree.nodes[selectedNode.id])
574+
self.build.spec:ReplaceNode(selectedNode, self.build.spec.tree.nodes[selectedNode.id])
558575
if selectedNode.conqueredBy.conqueror.type == "templar" then
559-
self.specList[1]:NodeAdditionOrReplacementFromString(selectedNode,"+5 to Devotion")
576+
self.build.spec:NodeAdditionOrReplacementFromString(selectedNode,"+5 to Devotion")
560577
end
561578
end
562579
self.modFlag = true

0 commit comments

Comments
 (0)