Plothos' 3.5 & Pathfinder Spell Managers

These are tools and utilities that make it easier to run games. This includes Lib: macro tokens dropped into MapTool to manage the game, a conversion file for CharacterTool to allow use in MapTool, or just about anything else you can think of -- except graphics with macros and anything specific to a particular campaign framework. Those are already covered by the Tilesets subforum and the Links and External Resources forum.

Moderators: dorpond, trevor, Azhrei, giliath, Gamerdude, jay, Mr.Ice

User avatar
aliasmask
RPTools Team
Posts: 9024
Joined: Tue Nov 10, 2009 6:11 pm
Location: Bay Area

Re: Plothos' 3.5 & Pathfinder Spell Managers

Post by aliasmask »

The searchSpellLink returns the original string if it doesn't find a link for it.

User avatar
plothos
Great Wyrm
Posts: 1890
Joined: Sat Jun 21, 2008 1:07 am

Re: Plothos' 3.5 & Pathfinder Spell Managers

Post by plothos »

It's failing in my FW for some reason. I'm unable to track down the problem.
Drop-In Utilities:
My Spell Manager for D&D3.5 and PFRPG
My Inventory Manager for D&D and PFRPG, but more generally useable than that.
My Message Manager -- My Top-Down D&D Token Images
and my Custom Initiative & Status/Spell-Effect Tracker (work in progress, but functional).

User avatar
aliasmask
RPTools Team
Posts: 9024
Joined: Tue Nov 10, 2009 6:11 pm
Location: Bay Area

Re: Plothos' 3.5 & Pathfinder Spell Managers

Post by aliasmask »

Well, here's the token I use. You'll have to run the config to set up for PF.
Attachments
Lib.Spell_database 3.5preload.rptok
(261.91 KiB) Downloaded 157 times

Jwguy
Kobold
Posts: 6
Joined: Thu Jan 12, 2012 2:28 pm

Re: Plothos' 3.5 & Pathfinder Spell Managers

Post by Jwguy »

Unfortunately, this seems to no longer work. Tried it with v1.3.b86 and followed the instructions. Upon copying the from the properties of Lib_Spells, I received multiple instances of the following error:

The line "---" appears to be a comment, but duplicates "---" and must be unique to prevent this warning.

And I am unable to update the properties afterwards. It's a shame, too, since so few developers these days are able to keep these kind of tools up to date and available, and this one looked nice.

User avatar
Azhrei
Site Admin
Posts: 12086
Joined: Mon Jun 12, 2006 1:20 pm
Location: Tampa, FL

Re: Plothos' 3.5 & Pathfinder Spell Managers

Post by Azhrei »

Jwguy wrote:The line "---" appears to be a comment, but duplicates "---" and must be unique to prevent this warning.
Hm, kinda strange.

But any line that starts with a dash is a comment (as described in the notes on that page) so just add another character to the end of the line so that the two lines are different and you should be all set.

User avatar
aliasmask
RPTools Team
Posts: 9024
Joined: Tue Nov 10, 2009 6:11 pm
Location: Bay Area

Re: Plothos' 3.5 & Pathfinder Spell Managers

Post by aliasmask »

plothos wrote:Huh, fiddling with the lib:spells I have in my FW I cannot view known spells (or rather, I get blanks if there is no link), so I thought this was a general problem with the AM db. I'll check to see if something got crossed up. Ugh.
I finally went and tracked this down:
||| View Spells Text |||

Code: Select all

@@ @View Spells Text
@PROPS@ fontColor=silver ; autoExecute=false ; fontSize=11pt ; sortBy=3 ; color=blue ; playerEditable=true ; applyToSelected=false ; group=1 Spell Management ; tooltip= ; minWidth=94 ; 
[h: passed = macro.args]
[h: classviewed = listGet(passed, 0)]
[h: levelviewed = listGet(passed, 1)]
[h: chardata = CasterInfo]
[h: classeshad = listSort(json.fields(chardata),"A")]
[h: classdata = json.get(chardata, classviewed)]

[h: lowestposs = json.get(classdata, "Lowest Level Spell")]
[h: highestposs = json.get(classdata, "Highest Level Spell")]
[h, if(!isNumber(levelviewed)): levelviewed = lowestposs]
[h: levelviewed = max(levelviewed, lowestposs)]
[h: levelviewed = min(levelviewed, highestposs)]
[h: spellsknown = json.get(classdata, "Spells Known")]
[h: maxlev = json.get(classdata, "Max Spell Level")]
[h: classSPD = json.get(classdata, "Spells Per Day")]
[h: minlev = json.get(classdata, "Lowest Level Spell")]
[h: numspecs = json.get(classdata, "Number of Specialties")]
[h: speclist = ""]
[h: numprohibs = json.get(classdata, "Number of Prohibitions")]
[h: numprohibs = eval(numprohibs)]
[h: prohiblist = ""]
[h, if(numspecs > 0), code: {
	[h: sourcej = json.get(classdata, "Source")]
	[h: shelfname = json.get(sourcej, "Shelf")]
	[h: bookname = json.get(sourcej, "Book")]
	[h: bookcasedata = getLibProperty("Bookcase", "Lib:spells")]
	[h: shelfdata = json.get(bookcasedata, shelfname)]
	[h: bookdata = json.get(shelfdata, bookname)]
	[h: classmasterdata = json.get(bookdata, classviewed)]
	[specschools = json.get(classdata, "Specialties")]
	[schoollist = json.get(classmasterdata, "Specialty Spells")]
	[foreach(specschool, specschools), code: {
		[thislist = json.get(schoollist, specschool)]
		[speclist = listAppend(speclist, thislist)]
	}]
}; {}]
[h, if(numprohibs > 0), code:{
	[h: sourcej = json.get(classdata, "Source")]
	[h: shelfname = json.get(sourcej, "Shelf")]
	[h: bookname = json.get(sourcej, "Book")]
	[h: bookcasedata = getLibProperty("Bookcase", "Lib:spells")]
	[h: shelfdata = json.get(bookcasedata, shelfname)]
	[h: bookdata = json.get(shelfdata, bookname)]
	[h: classmasterdata = json.get(bookdata, classviewed)]
	[prohibschools = json.get(classdata, "Prohibitions")]
	[schoollist = json.get(classmasterdata, "Specialty Spells")]
	[foreach(prohibschool, prohibschools), code:{
		[thislist = json.get(schoollist, prohibschool)]
		[prohiblist = listAppend(prohiblist, thislist)]
	}]
}; {}]
[h: numdoms = json.get(classdata, "Number of Domains")]
[h: domlist = "[]"]

[h: domainspells = json.get(classdata, "Domain Spells")]

<html>
  <head></head>
    <body>
      <table border="1" width="800" background="[r:getImage('Lib:spells')]">
        <tr background="[r: getImage('image:fog')]">
          <td>

<font size="+2"><b>[r: classviewed] Spells Known</b></font>
  [r:macroLink("Main", "Spell Main@Lib:spells", "none", "",token.name)]
  [r:macroLink("Learn", "Learn Spell@Lib:spells", "none", passed,token.name)]
  [r:"Known"]
[h: isPrepper = json.get(classdata, "Preps")]
  [r, if(isPrepper=="Yes"): macroLink("Prepare", "Spell Prep@Lib:spells", "none", classviewed+","+levelviewed,token.name); "Prepare"]
  [r, if(isPrepper=="Yes"): macroLink("Prepped", "View Prepped@Lib:spells", "none", classviewed+","+levelviewed,token.name); "Prepped"]
  [r:macroLink("Cast", "Spell Cast@Lib:spells", "none", passed,token.name)]
  [r:macroLink("Spec Abils", "Spec Abil Main@Lib:spells", "none", classviewed+","+levelviewed,token.name)]
<br><b>[r: token.name]</b><br>

[r, foreach(entry, classeshad, "    "), code:{
	[r, if(entry == classviewed): entry; macroLink(entry, "View Spells@Lib:spells", "none", entry, token.name)]
}]
          </td>
        </tr>
        <tr background="[r: getImage('image:fog')]">
          <td>

[h: num = minlev]
[r, while(num<= maxlev, "<br><br>"), code:{
	[r: "<b>Level "+num+":</b><br>"]
	[h: thislist = json.get(spellsknown, "Level "+num)]
	[r, foreach(spell, thislist), code:{
		[r: "<span style='white-space: nowrap; "]
		[r, if(listFind(speclist, spell)>-1): "font-weight: bold;'>"; "font-weight: normal;'>"]
		[r, if(listFind(prohiblist, spell)>-1): "'color: red;'>"]
		[r: searchSpellLink(spell)]
		[r: "</span>"]
	}]
	[r, if(thislist == ""): "(None)"]
	[r, if(numdoms>0), code:{
		[r: "<br>        <i>Domain:</i> "]
		[h: thesedoms = json.get(domainspells, "Level "+num)]
		[r, foreach(spell, thesedoms): "<span style='white-space:nowrap'>"+searchSpellLink(spell)+"</span>"]
		[r, if(thesedoms == ""): "(None)"]
	}; {}]
	[h: num = num+1]
}]

        </td>
      </tr>
    </table>
  </html>

!!
You basically didn't close the span, so normal text returned wasn't shown, but when I passed back a link it closed the span tag and showed the link.

I also made this small change because it fits my magic system. All spells are spontaneous and the "known" was the same as the SPD so I could see how many different spells I could chose. This fix doesn't change any of the existing classes, but custom classes with no "known" spell limits and are not prepped will show the SPD for known.
||| Learn Spell Text |||

Code: Select all

@@ @Learn Spell Text
@PROPS@ fontColor=silver ; autoExecute=false ; fontSize=11pt ; sortBy=3 ; color=blue ; playerEditable=true ; applyToSelected=false ; group=2 Learning ; tooltip= ; minWidth=94 ; 
[h:passed=macro.args]
[h:classviewed=listGet(passed,0)]
[h:levelviewed=listGet(passed,1)]
[h:charclassdata = json.get(CasterInfo, classviewed)]
[h: maxlev = json.get(charclassdata, "Max Spell Level")]
[h: highestposs = maxlev]
[h: lowestposs = json.get(charclassdata, "Lowest Level Spell")]
[h: curclasslev = json.get(charclassdata, "Class Level")]
[h, if(!isNumber(levelviewed)): levelviewed = lowestposs]
[h: levelviewed = max(levelviewed, lowestposs)]
[h: levelviewed = min(levelviewed, highestposs)]
[h: numspecs = json.get(charclassdata, "Number of Specialties")]
[h: numprohibs = json.get(charclassdata, "Number of Prohibitions")]
[h: numprohibs = eval(numprohibs)]
[h: numdoms = json.get(charclassdata, "Number of Domains")]
[h: cancastprohibs = json.get(charclassdata, "Can Cast Prohibs")]
[h: numberknown = json.get(charclassdata, "Number Known")]
[h: isPrepper = json.get(charclassdata, "Preps")]
[h: classsource = json.get(charclassdata, "Source")]
[h: shelfname = json.get(classsource, "Shelf")]
[h: bookname = json.get(classsource, "Book")]
[h: bookcasedata = getLibProperty("Bookcase", "Lib:spells")]
[h: shelfdata = json.get(bookcasedata, shelfname)]
[h: bookdata = json.get(shelfdata, bookname)]
[h: classmasterdata = json.get(bookdata, classviewed)]
[h: masterspelllists = json.get(classmasterdata, "Spell Lists")]
[h: learnlist = json.get(masterspelllists, "Level "+levelviewed)]
[h, if(numprohibs > 0 && cancastprohibs=="No"), code:{
	[prohibs = json.get(charclassdata, "Prohibitions")]
	[pass = json.set("{}", "List", learnlist, "Class", classviewed, "Schools", prohibs, "Classmasterdata", classmasterdata)]
	[macro("Remove Prohibs@this"): pass]
	[learnlist = macro.return]
}; {}]

[H, if(json.isEmpty(numberknown) && isPrepper == "No"): numberknown = json.get(charclassdata, "Spells Per Day")]

[h: charknownlists = json.get(charclassdata, "Spells Known")]
[h: charknownlist = json.get(charknownlists, "Level "+levelviewed)]

[h: learnlistarr = json.fromList(learnlist)]
[h: charknownlistarr = json.fromList(charknownlist)]
[h: learnlistarr = json.difference(learnlistarr, charknownlistarr)]
[h: learnlist = json.toList(learnlistarr)]
[h: learnlist = listSort(learnlist, "A")]

<html>
  <head></head>
    <body>
      <table border="1" width="800" background="[r:getImage('Lib:spells')]">
        <tr background="[r: getImage('image:fog')]">
          <td>
<font size="+2"><b>Learning [r:classviewed] Spells</b></font>
  [r:macroLink("Main", "Spell Main@Lib:spells", "none", "",token.name)]
  [r:"Learn"]
  [r:macroLink("Known", "View Spells@Lib:spells", "none", classviewed+","+levelviewed,token.name)]
  [r, if(isPrepper=="Yes"): macroLink("Prepare", "Spell Prep@Lib:spells", "none", classviewed+","+levelviewed,token.name); "Prepare"]
  [r, if(isPrepper=="Yes"): macroLink("Prepped", "View Prepped@Lib:spells", "none", classviewed+","+levelviewed,token.name); "Prepped"]
  [r:macroLink("Cast", "Spell Cast@Lib:spells", "none", classviewed+","+levelviewed,token.name)]
  [r:macroLink("Spec Abils", "Spec Abil Main@Lib:spells", "none", classviewed+","+levelviewed,token.name)]
<br><b>[r: token.name]</b><br>

[h: classeshad = listSort(json.fields(CasterInfo),"A")]
[r, foreach(classhad, classeshad, "    "), code:{
	[r, if(classhad == classviewed): classhad; macroLink(classhad, "Learn Spell@Lib:spells", "none", classhad+","+levelviewed, token.name)]
}]

          </td>
        </tr>
        <tr background="[r: getImage('image:fog')]">
          <td>
            <table border="2" width="100%">
              <tr>
                <td width="50%" align="center">
<font size="+1"><b>Known</b></font>
                </td>
                <td width="50%" align="center">
<font size="+1"><b>Options</b></font>
                </td>
              </tr>
              <tr>
                <td width="50%" valign="top">
[r:macroLink("Unlearn Spell","Unlearn A Spell@Lib:spells","none",classviewed+","+levelviewed,token.name)]<br><br>

[h: num = levelviewed]
[r: "<b>Level "+num+":</b>"]
[h: thislist = listSort(json.get(charknownlists, "Level "+num),"A")]
[r, if(numberknown != ""): listCount(thislist)+" / "+listGet(numberknown, num)+" known"]
[r, if(thislist == ""), code: {
	[r: "<br>(None)"]
}; {
	[r:"<br>"]
	[r, foreach(spellentry, thislist): "<span style='white-space:nowrap'>"+spellentry+"</span>"]
}]
[r, if(numdoms > 0), code:{
	[r: "<br>        <i>Domain:</i> "]
	[h: domainspelllists = json.get(charclassdata, "Domain Spells")]
	[h: thisdomlist = listSort(json.get(domainspelllists, "Level "+num), "A")]
	[r, foreach(spellentry, thisdomlist): "<span style='white-space:nowrap'>"+spellentry+"</span>"]
	[r, if(thisdomlist == ""): "(None)"]
}; {}]

                </td>
                <td width="50%" valign="top">

[h: num=0]
[r, c(10, ""), code:{
	[r, if(num!=levelviewed && num<=maxlev && num>=lowestposs): macroLink(num, "Learn Spell@this", "none", classviewed+","+num, token.name)]
	[r, if(num==levelviewed): num]
	[r, if(num<=maxlev): "    "]
	[h: num=num+1]
}]

<br><br>
<b>Level [r:levelviewed]:</b><br>
[r, if(numspecs > 0), code:{
	[h: pass = json.set("{}", "List", learnlist, "Classviewed", classviewed, "Levelviewed", levelviewed)]
	[r, macro("Spec Learn List Populate@this"): pass]
	[r, if(learnlist == ""): "(None)"]
}; {
	[r, foreach(spellentry, learnlist): macroLink("<span style='white-space:nowrap'>"+spellentry+"</span>", "Learn Spell Wrap@this", "none", classviewed+","+levelviewed+","+spellentry, token.name)]
	[r, if(learnlist == ""): "(None)"]
}]

[r, if(numdoms > 0), code:{
	[h: domains = json.get(charclassdata, "Domains")]
	[h: classdomainspells = json.get(classmasterdata, "Domain Spells")]
	[h: expecteddomainspells = ""]
	[h, foreach(domain, domains), code:{
		[thislist = json.get(classdomainspells, domain)]
		[spellstoadd = json.get(thislist, "Level "+levelviewed)]
		[expecteddomainspells = listAppend(expecteddomainspells, spellstoadd)]
	}]
	[h: expecteddomainspells = listSort(expecteddomainspells, "A")]
	[h: haddomainspells = json.get(domainspelllists, "Level "+levelviewed)]
	[h, if(expecteddomainspells != ""): expectedarr = json.fromList(expecteddomainspells); expectedarr = "[]"]
	[h, if(haddomainspells != ""): hadarr = json.fromList(haddomainspells); hadarr = "[]"]
	[h: missingarr = json.difference(expectedarr, hadarr)]
	[r: "<br>        <i>Domain:</i> "]
	[r, foreach(spellentry, missingarr): macroLink("<span style='white-space:nowrap'>"+spellentry+"</span>", "Learn Domain Spell Wrap@this", "none", classviewed+","+levelviewed+","+spellentry, token.name)]
	[r, if(json.isEmpty(missingarr)): "(None)"]
	
}; {}]

<br><br>

[r, if(numspecs > 0): "<i>Specialty spells in bold. "+if(cancastprohibs == "Yes", "Restricted spells in red.</i><br>", "</i><br>")]
[r: macroLink("Add Houserule Spell", "Add Houserule Spell@this", "none", classviewed+","+levelviewed, token.name)]
[r, if(numdoms > 0): "<br>"+macroLink("Add Houserule Domain Spell", "Add Houserule Domain Spell@this", "none", classviewed+","+levelviewed, token.name)]

                </td>
              </tr>
            </table>
          </td>
        </tr>
      </table>
    </body>
</html>

!!
I'm also thinking the interface could use a face lift. Make it more compact. Also, some pages should have a different frame name based on the token name. So, when using multiple tokens that use the manager, I don't have to browse back to where I was. Having a leaner interface will allow for the manager to dock better. Right now it takes up most of my screen.

Custom frames for each token should be easy:

Code: Select all

[frame("Spells: "+getName()):{
...
}]
Edit: Technically, this is patch I applied to the beta. Just FYI.

User avatar
aliasmask
RPTools Team
Posts: 9024
Joined: Tue Nov 10, 2009 6:11 pm
Location: Bay Area

Re: Plothos' 3.5 & Pathfinder Spell Managers

Post by aliasmask »

aliasmask wrote:I'm also thinking the interface could use a face lift. Make it more compact. Also, some pages should have a different frame name based on the token name. So, when using multiple tokens that use the manager, I don't have to browse back to where I was. Having a leaner interface will allow for the manager to dock better. Right now it takes up most of my screen.

Custom frames for each token should be easy:

Code: Select all

[frame("Spells: "+getName()):{
...
}]
Hey Plothos. Are you making any changes I should know about. In my quest to reformat some of the output, I'm building some scaffolding around your code to make my code compatible with yours. Right now I'm just focusing on the abilities where all the abilities screens will be different. I've merge the code to account for class and class-independent abilities. It's all basically the same code, just different source variables. I have some more code to write, and some testing to do but it should be done sometime this week. I'm just checking with you to see if you're releasing anything new with this in the near future.

User avatar
aliasmask
RPTools Team
Posts: 9024
Joined: Tue Nov 10, 2009 6:11 pm
Location: Bay Area

Re: Plothos' 3.5 & Pathfinder Spell Managers

Post by aliasmask »

I was thinking, specifically for Tome of Blood, that it would be useful to have a Rest encounter feature. So, it wouldn't refesh the daily charges, but would refresh "encounter" charges or actions.

ClanPsi
Kobold
Posts: 2
Joined: Sat Feb 23, 2013 6:29 am

Re: Plothos' 3.5 & Pathfinder Spell Managers

Post by ClanPsi »

I followed all of the steps to add this to my Pathfinder campaign, but it won't let me go past "3. Set Spells Per Day". Whenever I click it, regardless of the character or class, it gives the following error:

java.lang.NullPointerException
at net.rptools.maptool.client.MapToolVariableResolver.setVariable(MapToolVariableResolver.java:271)
at net.rptools.parser.MapVariableResolver.setVariable(MapVariableResolver.java:32)
at net.rptools.maptool.client.MapToolLineParser.parseLine(MapToolLineParser.java:973)
at net.rptools.maptool.client.MapToolLineParser.runMacroBlock(MapToolLineParser.java:1524)
at net.rptools.maptool.client.MapToolLineParser.runMacro(MapToolLineParser.java:1455)
at net.rptools.maptool.client.MapToolLineParser.runMacro(MapToolLineParser.java:1336)
at net.rptools.maptool.client.functions.MacroLinkFunction.runMacroLink(MacroLinkFunction.java:455)
at net.rptools.maptool.client.functions.MacroLinkFunction.runMacroLink(MacroLinkFunction.java:362)
at net.rptools.maptool.client.ui.htmlframe.HTMLPane$1.hyperlinkUpdate(HTMLPane.java:68)
at javax.swing.JEditorPane.fireHyperlinkUpdate(Unknown Source)
at javax.swing.text.html.HTMLEditorKit$LinkController.activateLink(Unknown Source)
at javax.swing.text.html.HTMLEditorKit$LinkController.mouseClicked(Unknown Source)
at java.awt.AWTEventMulticaster.mouseClicked(Unknown Source)
at java.awt.AWTEventMulticaster.mouseClicked(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at net.rptools.maptool.client.swing.MapToolEventQueue.dispatchEvent(MapToolEventQueue.java:38)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Thank you for your assistance. :)

User avatar
Vhex
Giant
Posts: 162
Joined: Fri Sep 09, 2011 4:41 am
Location: Honolulu, HI

Re: Plothos' 3.5 & Pathfinder Spell Managers

Post by Vhex »

What are your current memory settings? You can find this in mt.cfg if you're on Windows and using Maptool Launcher, in the batch files, or in the shell script you're using to launch.

Also, make sure you're using an updated version from later in the thread.

User avatar
wolph42
Winter Wolph
Posts: 9999
Joined: Fri Mar 20, 2009 5:40 am
Location: Netherlands
Contact:

Re: Plothos' 3.5 & Pathfinder Spell Managers

Post by wolph42 »

Vhex wrote:What are your current memory settings? You can find this in mt.cfg if you're on Windows and using Maptool Launcher, in the batch files, or in the shell script you're using to launch.
npe should not occur due to memory settings (you could get a stack overflow running an embedded macro, *that* would return an npe to the calling macro and *that* could report the npe HOWEVER then you would FIRST get the stack overflow report.... then again... its java and maptool, stranger things have happened.
Vhex wrote: Also, make sure you're using an updated version from later in the thread.
why isn't it in the OP?

User avatar
aliasmask
RPTools Team
Posts: 9024
Joined: Tue Nov 10, 2009 6:11 pm
Location: Bay Area

Re: Plothos' 3.5 & Pathfinder Spell Managers

Post by aliasmask »

Here is my most recent update of it. I fixed a couple of level up bugs and I fixed the spellcraft check link by creating my own "skillRoll" function. skillRoll still requires the 3.5/pathfinder lib token. One you replace your existing lib token for Plothos's beta 3.0 you need to run onCampaignLoad from the new token for the UDF to be defined. If for some reason it doesn't work, try saving and reloading campaign. It also includes some custom spell classes like SLOT_Cleric. Feel free to ignore or delete those.

[file removed - doesn't work with newer FW]

User avatar
wolph42
Winter Wolph
Posts: 9999
Joined: Fri Mar 20, 2009 5:40 am
Location: Netherlands
Contact:

Re: Plothos' 3.5 & Pathfinder Spell Managers

Post by wolph42 »

thanks. I too immediately encountered an bug when I tried to create a level 7 priest (based on the campaign file). Here's part of the log:
Spoiler
2013-02-25 16:02:54,612 [client.MapToolLineParser:1276] DEBUG - Domain8="(None)"
2013-02-25 16:02:54,613 [client.MapToolLineParser:1276] DEBUG - if(Domain9=="", 1, 0)
2013-02-25 16:02:54,615 [model.Token:1038] DEBUG - Evaluating property: 'Domain9' for token Caster(00000000B49ABD2E6D02000000000000)----------------------------------------------------------------------------------
2013-02-25 16:02:54,616 [client.MapToolLineParser:1276] DEBUG - Domain9="(None)"
2013-02-25 16:02:54,617 [client.MapToolLineParser:1276] DEBUG - passinfo="{}"
2013-02-25 16:02:54,618 [client.MapToolLineParser:1276] DEBUG - pass=json.set("{}","Report",passreport,"Output Class","Domain Change","Specific Type","Domain Change","Use Info",passinfo)
2013-02-25 16:02:54,621 [client.MapToolLineParser:1276] DEBUG - "Output@Lib:spells"
2013-02-25 16:02:54,622 [client.MapToolLineParser:1276] DEBUG - pass
2013-02-25 16:02:54,624 [client.MapToolLineParser:1276] DEBUG - passed=macro.args
2013-02-25 16:02:54,626 [client.MapToolLineParser:1276] DEBUG - report=json.get(passed,"Report")
2013-02-25 16:02:54,628 [client.MapToolLineParser:1276] DEBUG - outputclass=json.get(passed,"Output Class")
2013-02-25 16:02:54,630 [client.MapToolLineParser:1276] DEBUG - specifictype=json.get(passed,"Specific Type")
2013-02-25 16:02:54,633 [client.MapToolLineParser:1276] DEBUG - useinfo=json.get(passed,"Use Info")
2013-02-25 16:02:54,635 [client.MapToolLineParser:1276] DEBUG - if(outputclass=="Cast", 1, 0)
2013-02-25 16:02:54,637 [client.MapToolLineParser:1276] DEBUG - ''
2013-02-25 16:02:54,639 [client.MapToolLineParser:1276] DEBUG - if(outputclass=="Convert Cast", 1, 0)
2013-02-25 16:02:54,640 [client.MapToolLineParser:1276] DEBUG - ''
2013-02-25 16:02:54,642 [client.MapToolLineParser:1276] DEBUG - report
2013-02-25 16:02:54,646 [client.MapToolLineParser:1276] DEBUG - passreport=""
2013-02-25 16:02:54,648 [client.MapToolLineParser:1276] DEBUG - CMSLlist=getLibProperty("CMSL","Lib:spells")
2013-02-25 16:02:54,650 [client.MapToolLineParser:1276] DEBUG - CMSL=listGet(CMSLlist,CCL)
2013-02-25 16:02:54,651 [model.Token:1038] DEBUG - Evaluating property: 'CCL' for token Caster(00000000B49ABD2E6D02000000000000)----------------------------------------------------------------------------------
2013-02-25 16:02:54,652 [client.MapToolLineParser:1276] DEBUG - SPDall=getLibProperty("CSPD"+CCL,"Lib:spells","ERROR")
2013-02-25 16:02:54,654 [model.Token:1038] DEBUG - Evaluating property: 'CCL' for token Caster(00000000B49ABD2E6D02000000000000)----------------------------------------------------------------------------------
2013-02-25 16:02:54,655 [client.MapToolLineParser:1293] DEBUG - net.rptools.parser.ParserException: Function "getLibProperty" requires no more than 2 parameters; 3 were provided.

User avatar
wolph42
Winter Wolph
Posts: 9999
Joined: Fri Mar 20, 2009 5:40 am
Location: Netherlands
Contact:

Re: Plothos' 3.5 & Pathfinder Spell Managers

Post by wolph42 »

ok checked out your lib and its even worse... I replaced the one in the campaign file and on running 'spell menu' with the 'caster selected' I got: 'value for casterInfo' here again a part of the log:
Spoiler
2013-02-25 16:11:04,668 [client.MapToolLineParser:1293] DEBUG - net.rptools.parser.ParserException: Unresolved value "CasterInfo".
2013-02-25 16:11:06,525 [macro.MacroManager:373] DEBUG - Starting macro: ImpersonateMacro----------------------------------------------------------------------------------
2013-02-25 16:11:06,527 [client.MapToolLineParser:1276] DEBUG - "Spell Main@Lib:spells"
2013-02-25 16:11:06,527 [client.MapToolLineParser:1276] DEBUG - ""
2013-02-25 16:11:06,530 [client.MapToolLineParser:1276] DEBUG - "Spells: "+getName()
2013-02-25 16:11:06,542 [client.MapToolLineParser:1276] DEBUG - ""
2013-02-25 16:11:06,545 [client.MapToolLineParser:1276] DEBUG - "Spell Main Text@Lib:spells"
2013-02-25 16:11:06,549 [client.MapToolLineParser:1276] DEBUG - ""
2013-02-25 16:11:06,567 [client.MapToolLineParser:1276] DEBUG - chardata = CasterInfo
and I keep m comming:

open spell library (F2) --> class --> cleric -->

Code: Select all

   Invalid condition in IF(json.length(cat1_) == 0) roll option.       Statement options (if any): H, if(json.length(cat1_) == 0), code       Statement Body : { [H: twoDim_ = 0] };{ [H: twoDim_ = if(json.type(json.get(cat1_,0)) == "ARRAY",1,0)] }

User avatar
aliasmask
RPTools Team
Posts: 9024
Joined: Tue Nov 10, 2009 6:11 pm
Location: Bay Area

Re: Plothos' 3.5 & Pathfinder Spell Managers

Post by aliasmask »

I don't recall running across that error. Look like bad syntax with an extra parameter as the error says. I'll see if that is in the version I have. I just may not have run across it yet.

Code: Select all

[SPDall=getLibProperty("CSPD"+CCL,"Lib:spells","ERROR")]
edit: I do not have that line in my version.

Post Reply

Return to “Drop-In Macro Resources”