@@ -74,6 +74,9 @@ function PassiveSpecClass:Init(treeVersion, convert)
7474
7575 -- Keys are mastery node IDs, values are mastery effect IDs
7676 self .masterySelections = { }
77+
78+ -- Keys are node IDs, values are the replacement node
79+ self .hashOverrides = { }
7780end
7881
7982function PassiveSpecClass :Load (xml , dbFileName )
@@ -130,7 +133,35 @@ function PassiveSpecClass:Load(xml, dbFileName)
130133 masteryEffects [tonumber (mastery )] = tonumber (effect )
131134 end
132135 end
133- self :ImportFromNodeList (tonumber (xml .attrib .classId ), tonumber (xml .attrib .ascendClassId ), hashList , masteryEffects )
136+ for _ , node in pairs (xml ) do
137+ if type (node ) == " table" then
138+ if node .elem == " Overrides" then
139+ for _ , child in ipairs (node ) do
140+ if not child .attrib .nodeId then
141+ launch :ShowErrMsg (" ^1Error parsing '%s': 'Override' element missing 'nodeId' attribute" , dbFileName )
142+ return true
143+ end
144+
145+ local nodeId = tonumber (child .attrib .nodeId )
146+
147+ self .hashOverrides [nodeId ] = copyTable (self .nodes [nodeId ], true )
148+ self .hashOverrides [nodeId ].id = nodeId
149+ self .hashOverrides [nodeId ].isTattoo = true
150+ self .hashOverrides [nodeId ].icon = child .attrib .icon
151+ self .hashOverrides [nodeId ].activeEffectImage = child .attrib .activeEffectImage
152+ self .hashOverrides [nodeId ].dn = child .attrib .dn
153+ local modCount = 0
154+ for _ , modLine in ipairs (child ) do
155+ for line in string.gmatch (modLine .. " \r\n " , " ([^\r\n\t ]*)\r ?\n " ) do
156+ self :NodeAdditionOrReplacementFromString (self .hashOverrides [nodeId ], line , modCount == 0 )
157+ modCount = modCount + 1
158+ end
159+ end
160+ end
161+ end
162+ end
163+ end
164+ self :ImportFromNodeList (tonumber (xml .attrib .classId ), tonumber (xml .attrib .ascendClassId ), hashList , self .hashOverrides , masteryEffects )
134165 elseif url then
135166 self :DecodeURL (url )
136167 end
@@ -172,6 +203,20 @@ function PassiveSpecClass:Save(xml)
172203 end
173204 end
174205 t_insert (xml , sockets )
206+
207+ local overrides = {
208+ elem = " Overrides"
209+ }
210+ if self .hashOverrides then
211+ for nodeId , node in pairs (self .hashOverrides ) do
212+ local override = { elem = " Override" , attrib = { nodeId = tostring (nodeId ), icon = tostring (node .icon ), activeEffectImage = tostring (node .activeEffectImage ), dn = tostring (node .dn ) } }
213+ for _ , modLine in ipairs (node .sd ) do
214+ t_insert (override , modLine )
215+ end
216+ t_insert (overrides , override )
217+ end
218+ end
219+ t_insert (xml , overrides )
175220
176221end
177222
@@ -180,13 +225,14 @@ function PassiveSpecClass:PostLoad()
180225end
181226
182227-- Import passive spec from the provided class IDs and node hash list
183- function PassiveSpecClass :ImportFromNodeList (classId , ascendClassId , hashList , masteryEffects , treeVersion )
228+ function PassiveSpecClass :ImportFromNodeList (classId , ascendClassId , hashList , hashOverrides , masteryEffects , treeVersion )
184229 if treeVersion and treeVersion ~= self .treeVersion then
185230 self :Init (treeVersion )
186231 self .build .treeTab .showConvert = self .treeVersion ~= latestTreeVersion
187232 end
188233 self :ResetNodes ()
189234 self :SelectClass (classId )
235+ self .hashOverrides = hashOverrides
190236 -- move above setting allocNodes so we can compare mastery with selection
191237 wipeTable (self .masterySelections )
192238 for mastery , effect in pairs (masteryEffects ) do
@@ -195,6 +241,14 @@ function PassiveSpecClass:ImportFromNodeList(classId, ascendClassId, hashList, m
195241 self .masterySelections [mastery ] = effect
196242 end
197243 end
244+ for id , override in pairs (hashOverrides ) do
245+ local node = self .nodes [id ]
246+ if node then
247+ override .effectSprites = self .tree .spriteMap [override .activeEffectImage ]
248+ override .sprites = self .tree .spriteMap [override .icon ]
249+ self :ReplaceNode (node , override )
250+ end
251+ end
198252 for _ , id in pairs (hashList ) do
199253 local node = self .nodes [id ]
200254 if node then
@@ -706,6 +760,11 @@ function PassiveSpecClass:BuildAllDependsAndPaths()
706760 end
707761
708762 for id , node in pairs (self .nodes ) do
763+ -- If node is tattooed, replace it
764+ if self .hashOverrides [node .id ] then
765+ self :ReplaceNode (node , self .hashOverrides [node .id ])
766+ end
767+
709768 -- If node is conquered, replace it or add mods
710769 if node .conqueredBy and node .type ~= " Socket" then
711770 local conqueredBy = node .conqueredBy
@@ -863,10 +922,10 @@ function PassiveSpecClass:BuildAllDependsAndPaths()
863922 end
864923 end
865924 elseif conqueredBy .conqueror .type == " karui" then
866- local str = isValueInArray (attributes , node .dn ) and " 2" or " 4"
925+ local str = ( isValueInArray (attributes , node .dn ) or node . isTattoo ) and " 2" or " 4"
867926 self :NodeAdditionOrReplacementFromString (node , " \n +" .. str .. " to Strength" )
868927 elseif conqueredBy .conqueror .type == " maraketh" then
869- local dex = isValueInArray (attributes , node .dn ) and " 2" or " 4"
928+ local dex = ( isValueInArray (attributes , node .dn ) or node . isTattoo ) and " 2" or " 4"
870929 self :NodeAdditionOrReplacementFromString (node , " \n +" .. dex .. " to Dexterity" )
871930 elseif conqueredBy .conqueror .type == " templar" then
872931 if isValueInArray (attributes , node .dn ) then
@@ -1048,9 +1107,12 @@ function PassiveSpecClass:ReplaceNode(old, newNode)
10481107 old .modList = new (" ModList" )
10491108 old .modList :AddList (newNode .modList )
10501109 old .sprites = newNode .sprites
1110+ old .effectSprites = newNode .effectSprites
1111+ old .isTattoo = newNode .isTattoo
10511112 old .keystoneMod = newNode .keystoneMod
10521113 old .icon = newNode .icon
10531114 old .spriteId = newNode .spriteId
1115+ old .activeEffectImage = newNode .activeEffectImage
10541116 old .reminderText = newNode .reminderText or { }
10551117end
10561118
@@ -1563,13 +1625,14 @@ function PassiveSpecClass:CreateUndoState()
15631625 classId = self .curClassId ,
15641626 ascendClassId = self .curAscendClassId ,
15651627 hashList = allocNodeIdList ,
1628+ hashOverrides = self .hashOverrides ,
15661629 masteryEffects = selections ,
15671630 treeVersion = self .treeVersion
15681631 }
15691632end
15701633
15711634function PassiveSpecClass :RestoreUndoState (state , treeVersion )
1572- self :ImportFromNodeList (state .classId , state .ascendClassId , state .hashList , state .masteryEffects , treeVersion or state .treeVersion )
1635+ self :ImportFromNodeList (state .classId , state .ascendClassId , state .hashList , state .hashOverrides , state . masteryEffects , treeVersion or state .treeVersion )
15731636 self :SetWindowTitleWithBuildClass ()
15741637end
15751638
0 commit comments