@@ -91,64 +91,58 @@ local function trim_spell_name(string_spell_name)
9191 return string_spell_name
9292end
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
153147end
154148
@@ -286,6 +280,66 @@ local function getUsesAvailable(nodeItem, bWand)
286280 return nUsesAvailable
287281end
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+
289343function 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
417410end
0 commit comments