Skip to content

Commit b6b7ac2

Browse files
author
Wil Thieme
committed
preliminary de-nesting and protect against non-matching names
1 parent 5791f4c commit b6b7ac2

File tree

1 file changed

+107
-114
lines changed

1 file changed

+107
-114
lines changed

scripts/char_invlist_ACIM.lua

Lines changed: 107 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -91,64 +91,58 @@ local function trim_spell_name(string_spell_name)
9191
return string_spell_name
9292
end
9393

94-
local function getSpellFromItemName(sItemName)
95-
local tLoadedModules
96-
97-
local function getLoadedModules()
98-
tLoadedModules = {}
99-
local tAllModules = Module.getModules()
100-
for _, sModuleName in ipairs(tAllModules) do
101-
local tModuleData = Module.getModuleInfo(sModuleName)
102-
if tModuleData.loaded then tLoadedModules[tModuleData.name] = tModuleData.name end
94+
local function findSpellInModule(sModuleName, sSpellName)
95+
local nodeSpellModule = DB.findNode('reference.spells' .. '@' .. sModuleName)
96+
if not nodeSpellModule then return end
97+
for _, nodeSpell in ipairs(DB.getChildList(nodeSpellModule)) do
98+
local sModuleSpellName = DB.getValue(nodeSpell, 'name', '')
99+
if sModuleSpellName ~= '' then
100+
if trim_spell_name(sModuleSpellName) == sSpellName then return nodeSpell end
103101
end
104102
end
103+
end
105104

106-
local function findSpellNode(sSpellName)
107-
local nodeSpellFast = DB.findNode('spelldesc.' .. trim_spell_key(sSpellName) .. '@PFRPG - Spellbook Extended')
108-
or DB.findNode('spelldesc.' .. trim_spell_key(sSpellName) .. '@PFRPG - Spellbook')
109-
or DB.findNode('spelldesc.' .. trim_spell_key(sSpellName) .. '@*')
110-
if nodeSpellFast then return nodeSpellFast end
111-
112-
sSpellName = trim_spell_name(sSpellName)
113-
getLoadedModules()
114-
115-
local function findSpellInModule(sModuleName)
116-
local nodeSpellModule = DB.findNode('reference.spells' .. '@' .. sModuleName)
117-
if not nodeSpellModule then return end
118-
for _, nodeSpell in ipairs(DB.getChildList(nodeSpellModule)) do
119-
local sModuleSpellName = DB.getValue(nodeSpell, 'name', '')
120-
if sModuleSpellName ~= '' then
121-
if trim_spell_name(sModuleSpellName) == sSpellName then return nodeSpell end
122-
end
123-
end
124-
end
125-
126-
local nodeSpell
127-
for _, sModuleName in ipairs(tLoadedModules) do
128-
nodeSpell = findSpellInModule(sModuleName)
129-
if nodeSpell then break end
130-
end
131-
return nodeSpell
105+
local function getLoadedModules(tLoadedModules)
106+
local tAllModules = Module.getModules()
107+
for _, sModuleName in ipairs(tAllModules) do
108+
local tModuleData = Module.getModuleInfo(sModuleName)
109+
if tModuleData.loaded then tLoadedModules[tModuleData.name] = tModuleData.name end
132110
end
111+
end
133112

134-
local function getSpellBetweenParentheses()
135-
local string_spell_name = sItemName:match('%b()')
136-
if string_spell_name then return string_spell_name:sub(2, -2) end
137-
end
113+
local function findSpellNode(sSpellName)
114+
local nodeSpellFast = DB.findNode('spelldesc.' .. trim_spell_key(sSpellName) .. '@PFRPG - Spellbook Extended')
115+
or DB.findNode('spelldesc.' .. trim_spell_key(sSpellName) .. '@PFRPG - Spellbook')
116+
or DB.findNode('spelldesc.' .. trim_spell_key(sSpellName) .. '@*')
117+
if nodeSpellFast then return nodeSpellFast end
118+
119+
local tLoadedModules = {}
120+
getLoadedModules(tLoadedModules)
138121

139-
local function getSpellAfterOf()
140-
sItemName = sItemName:gsub('%[.+%]', '')
141-
local _, j = sItemName:find('of ')
142-
if j then return sItemName:sub(j) end
122+
local nodeSpell
123+
for _, sModuleName in ipairs(tLoadedModules) do
124+
nodeSpell = findSpellInModule(sModuleName, trim_spell_name(sSpellName))
125+
if nodeSpell then break end
143126
end
127+
return nodeSpell
128+
end
144129

145-
if sItemName and sItemName ~= '' then
146-
local sSpellName = getSpellBetweenParentheses()
147-
if sSpellName then
148-
return findSpellNode(sSpellName)
149-
else
150-
return findSpellNode(getSpellAfterOf())
151-
end
130+
local function getSpellBetweenParentheses(sItemName)
131+
local string_spell_name = sItemName:match('%b()')
132+
if string_spell_name then return string_spell_name:sub(2, -2) end
133+
end
134+
135+
local function getSpellAfterOf(sItemName)
136+
sItemName = sItemName:gsub('%[.+%]', '')
137+
local _, j = sItemName:find('of ')
138+
if j then return sItemName:sub(j) end
139+
end
140+
141+
local function getSpellFromItemName(sItemName)
142+
if not sItemName or sItemName == '' then return end
143+
local sSpellName = getSpellBetweenParentheses(sItemName) or getSpellAfterOf(sItemName)
144+
if sSpellName then
145+
return findSpellNode(sSpellName)
152146
end
153147
end
154148

@@ -286,6 +280,66 @@ local function getUsesAvailable(nodeItem, bWand)
286280
return nUsesAvailable
287281
end
288282

283+
local function addSpellset(nodeChar, nodeSpell, nodeItem, sItemName, nSpellLevel, nCL, nUsesAvailable)
284+
if not nodeChar or not nodeSpell or sItemName == '' or DB.getPath(nodeItem) == '' or nSpellLevel < 0 or nSpellLevel > 9 then return end
285+
local nodeNewSpellClass = DB.createChild(DB.createChild(nodeChar, _sSpellset))
286+
if nodeNewSpellClass then
287+
DB.setValue(nodeNewSpellClass, 'label', 'string', sItemName)
288+
DB.setValue(nodeNewSpellClass, 'castertype', 'string', 'spontaneous')
289+
DB.setValue(nodeNewSpellClass, 'availablelevel' .. nSpellLevel, 'number', nUsesAvailable)
290+
DB.setValue(nodeNewSpellClass, 'source_name', 'string', DB.getPath(nodeItem))
291+
DB.setValue(nodeNewSpellClass, 'cl', 'number', nCL)
292+
DB.setValue(nodeChar, 'spellmode', 'string', 'standard')
293+
local nodeNew = addSpell(nodeSpell, nodeNewSpellClass, nSpellLevel)
294+
if nodeNew then
295+
for _, nodeAction in ipairs(DB.getChildList(nodeNew, 'actions')) do
296+
if DB.getValue(nodeAction, 'type', '') == 'cast' then DB.setValue(nodeAction, 'usereset', 'string', 'consumable') end
297+
end
298+
end
299+
end
300+
end
301+
302+
local function getSpellLevel(nodeSpell)
303+
if not nodeSpell then return 0 end
304+
local nSpellLevel = 0
305+
local sSpellLevelField = DB.getValue(nodeSpell, 'level', '')
306+
local nLowestCasterLevel = 0
307+
if sSpellLevelField == '' then return nSpellLevel, nLowestCasterLevel end
308+
309+
local aSpellClassChoices = StringManager.split(sSpellLevelField, ',')
310+
for _, sSpellClassChoice in ipairs(aSpellClassChoices) do
311+
local sComboClassName, sSpellClassLevel = sSpellClassChoice:match('(.*) (%d)')
312+
if sComboClassName then
313+
for _, sClassChoice in ipairs(StringManager.split(sComboClassName, '/', true)) do
314+
local nCasterLevel = getCasterLevelByClass(sClassChoice, sSpellClassLevel)
315+
if nCasterLevel ~= nil and (nLowestCasterLevel == 0 or nCasterLevel < nLowestCasterLevel) then
316+
nLowestCasterLevel = nCasterLevel
317+
nSpellLevel = tonumber(sSpellClassLevel)
318+
end
319+
end
320+
end
321+
end
322+
return nSpellLevel, nLowestCasterLevel
323+
end
324+
local function updateUsesRemaining(nodeTrigger, nodeItem, nodeSpellSet, nSpellLevel, bWand)
325+
local function writeUses(fieldName)
326+
-- don't update a field that triggered this code to be run
327+
if not (nodeTrigger and DB.getPath(nodeTrigger):match('.+%.inventorylist%..+%.' .. fieldName)) then
328+
DB.removeHandler('charsheet.*.inventorylist.*.' .. fieldName, 'onUpdate', onItemChanged)
329+
local nodeSpellLevel = DB.getChild(nodeSpellSet, 'levels.level' .. nSpellLevel)
330+
local nUsesRemaining = DB.getValue(nodeSpellSet, 'availablelevel' .. nSpellLevel, 0) - DB.getValue(nodeSpellLevel, 'totalcast', 0)
331+
DB.setValue(nodeItem, fieldName, 'number', nUsesRemaining)
332+
DB.addHandler('charsheet.*.inventorylist.*.' .. fieldName, 'onUpdate', onItemChanged)
333+
end
334+
end
335+
336+
if bWand then
337+
writeUses('charge')
338+
else
339+
writeUses('count')
340+
end
341+
end
342+
289343
function inventoryChanged(nodeChar, nodeItem, nodeTrigger)
290344
if not (nodeChar and nodeItem) then return end
291345

@@ -306,31 +360,7 @@ function inventoryChanged(nodeChar, nodeItem, nodeTrigger)
306360
local nodeSpell = getSpellFromItemName(sItemName)
307361
if not nodeSpell then return end
308362

309-
local function getSpellLevel()
310-
if not nodeSpell then return 0 end
311-
local nSpellLevel = 0
312-
local sSpellLevelField = DB.getValue(nodeSpell, 'level', '')
313-
local nLowestCasterLevel = 0
314-
if sSpellLevelField ~= '' then
315-
local aSpellClassChoices = StringManager.split(sSpellLevelField, ',')
316-
for _, sSpellClassChoice in ipairs(aSpellClassChoices) do
317-
local sComboClassName, sSpellClassLevel = sSpellClassChoice:match('(.*) (%d)')
318-
if sComboClassName then
319-
local aClassChoices = StringManager.split(sComboClassName, '/', true)
320-
for _, sClassChoice in ipairs(aClassChoices) do
321-
local nCasterLevel = getCasterLevelByClass(sClassChoice, sSpellClassLevel)
322-
if nCasterLevel ~= nil and (nLowestCasterLevel == 0 or nCasterLevel < nLowestCasterLevel) then
323-
nLowestCasterLevel = nCasterLevel
324-
nSpellLevel = tonumber(sSpellClassLevel)
325-
end
326-
end
327-
end
328-
end
329-
end
330-
return nSpellLevel, nLowestCasterLevel
331-
end
332-
333-
local nSpellLevel, nMinCasterLevel = getSpellLevel()
363+
local nSpellLevel, nMinCasterLevel = getSpellLevel(nodeSpell)
334364

335365
local function getCL()
336366
if not nodeItem then return 0 end
@@ -354,25 +384,7 @@ function inventoryChanged(nodeChar, nodeItem, nodeTrigger)
354384

355385
local nodeSpellSet = getSpellSet(nodeChar, DB.getPath(nodeItem))
356386
if nodeSpellSet then
357-
local function updateUsesRemaining()
358-
local function writeUses(fieldName)
359-
-- don't update a field that triggered this code to be run
360-
if not (nodeTrigger and DB.getPath(nodeTrigger):match('.+%.inventorylist%..+%.' .. fieldName)) then
361-
DB.removeHandler('charsheet.*.inventorylist.*.' .. fieldName, 'onUpdate', onItemChanged)
362-
local nodeSpellLevel = DB.getChild(nodeSpellSet, 'levels.level' .. nSpellLevel)
363-
local nUsesRemaining = DB.getValue(nodeSpellSet, 'availablelevel' .. nSpellLevel, 0) - DB.getValue(nodeSpellLevel, 'totalcast', 0)
364-
DB.setValue(nodeItem, fieldName, 'number', nUsesRemaining)
365-
DB.addHandler('charsheet.*.inventorylist.*.' .. fieldName, 'onUpdate', onItemChanged)
366-
end
367-
end
368-
369-
if bWand then
370-
writeUses('charge')
371-
else
372-
writeUses('count')
373-
end
374-
end
375-
updateUsesRemaining()
387+
updateUsesRemaining(nodeTrigger, nodeItem, nodeSpellSet, nSpellLevel, bWand)
376388

377389
if nCarried ~= 2 then
378390
local function removeSpellClass()
@@ -392,26 +404,7 @@ function inventoryChanged(nodeChar, nodeItem, nodeTrigger)
392404
bAdvancedItem = true
393405
end
394406
elseif nCarried == 2 then
395-
local function addSpellset()
396-
if not nodeChar or not nodeSpell or sItemName == '' or DB.getPath(nodeItem) == '' or nSpellLevel < 0 or nSpellLevel > 9 then return end
397-
local nodeNewSpellClass = DB.createChild(DB.createChild(nodeChar, _sSpellset))
398-
if nodeNewSpellClass then
399-
DB.setValue(nodeNewSpellClass, 'label', 'string', sItemName)
400-
DB.setValue(nodeNewSpellClass, 'castertype', 'string', 'spontaneous')
401-
DB.setValue(nodeNewSpellClass, 'availablelevel' .. nSpellLevel, 'number', nUsesAvailable)
402-
DB.setValue(nodeNewSpellClass, 'source_name', 'string', DB.getPath(nodeItem))
403-
DB.setValue(nodeNewSpellClass, 'cl', 'number', nCL)
404-
DB.setValue(nodeChar, 'spellmode', 'string', 'standard')
405-
local nodeNew = addSpell(nodeSpell, nodeNewSpellClass, nSpellLevel)
406-
if nodeNew then
407-
for _, nodeAction in ipairs(DB.getChildList(nodeNew, 'actions')) do
408-
if DB.getValue(nodeAction, 'type', '') == 'cast' then DB.setValue(nodeAction, 'usereset', 'string', 'consumable') end
409-
end
410-
end
411-
end
412-
end
413-
414-
addSpellset()
407+
addSpellset(nodeChar, nodeSpell, nodeItem, sItemName, nSpellLevel, nCL, nUsesAvailable)
415408
end
416409
return bAdvancedItem
417410
end

0 commit comments

Comments
 (0)