Tokenlab: Pathfinder Herolabs -> Maptools converter
Moderators: dorpond, trevor, Azhrei, giliath, Gamerdude, jay, Mr.Ice, lmarkus001
Forum rules
Discussion regarding lmarkus001's framework only. Other posts deleted without notice!
Discussion regarding lmarkus001's framework only. Other posts deleted without notice!
Re: Tokenlab: Pathfinder Herolabs -> Maptools converter
Version 0.15 released. It includes the tracked resources stuff discussed above.
The big change here is that I finally bit the bullet and created a Lib:TokenLab library. Additionally there is a ResourcesJSON property that I put on each token to keep the tracked resources. Because of the above, if you have an existing campaign, you'll have to import the LibTokenLab.rptok, TokenLabImageTable.mttable, and TokenLab-Properties.mtprops file into existing campaign. (The .cmpgn file that ships with the zip file already has all of these.)
I also added basic support for d20, and one of my collaborators made the user interface for Mac friendly.
The big change here is that I finally bit the bullet and created a Lib:TokenLab library. Additionally there is a ResourcesJSON property that I put on each token to keep the tracked resources. Because of the above, if you have an existing campaign, you'll have to import the LibTokenLab.rptok, TokenLabImageTable.mttable, and TokenLab-Properties.mtprops file into existing campaign. (The .cmpgn file that ships with the zip file already has all of these.)
I also added basic support for d20, and one of my collaborators made the user interface for Mac friendly.
Re: Tokenlab: Pathfinder Herolabs -> Maptools converter
Kick donkey. <--- this forum has a weird language filter...
Okay, bugs
The last item on a resource list that has multiples will either decrease or increase by 1 when the window is closed and re-opened.
For example, here I brought crossbow bolts up to 8
Close and re-open and it quickly goes down to 7
Now, lower it down to 3:
Close and re-open, and it raises to 4:
Other bug. I bring in a dwarf barbarian and ranger, impersonate and open up the barbarian and add some values.
Now, I'll select the ranger and bring up her resources from the selection tab and add some arrows:
When I go back to the dwarf his resources have been overwritten by the ranger's resource.
I know select/impersonate was a problem with spells too, but I can see this biting people in the donkey during play if they manage multiple tokens.
Also, love the new file selection box on the Tokenlab configure interface. Was a pain before to always have to type in charname.tptok.
Okay, bugs
The last item on a resource list that has multiples will either decrease or increase by 1 when the window is closed and re-opened.
For example, here I brought crossbow bolts up to 8
Close and re-open and it quickly goes down to 7
Now, lower it down to 3:
Close and re-open, and it raises to 4:
Other bug. I bring in a dwarf barbarian and ranger, impersonate and open up the barbarian and add some values.
Now, I'll select the ranger and bring up her resources from the selection tab and add some arrows:
When I go back to the dwarf his resources have been overwritten by the ranger's resource.
I know select/impersonate was a problem with spells too, but I can see this biting people in the donkey during play if they manage multiple tokens.
Also, love the new file selection box on the Tokenlab configure interface. Was a pain before to always have to type in charname.tptok.
Re: Tokenlab: Pathfinder Herolabs -> Maptools converter
Thanks, great QA. Definitely something on going on with the differences between currentToken(), getSelected(), and getImpersonated(). I played around with it for a while today and didn't make much progress; this is probably going to take a couple of days
Re: Tokenlab: Pathfinder Herolabs -> Maptools converter
Yeah, that entire aspect of maptools might take a bit to wrap around. New weird coding language to learn.
Here's another small nitpick bug from the change in the token file save dialog.
You have a specific behavior(from day 1) that there are token config settings and global config settings. The token settings mean when I go to remake a token, it remembers prior settings for images and the token save path. That's awesome and allows for rapid token remakes on updates. That works fine on the new dialog. Below is a pre-made the the file dialog goes to my token directory:
But when I finish that token up and then start in on a new token it forgets my prior save path and defaults to the application root directory:
I believe what's going on is while you're using the "individual token" config:
When that's null you're not falling back to the global prefs. It looks like you used to do this with the old chooser:
But it seems like you're no longer using the JFileChooser tokenOutputChooser in favor of the new FileDialog(which is better).
You do save the TOKEN_DIR in prefs from the dialog, so that should be working fine. But you might need to null check config.getTokenFileDirectory() and pop in the master TOKEN_DIR pref when it's not set.
Here's another small nitpick bug from the change in the token file save dialog.
You have a specific behavior(from day 1) that there are token config settings and global config settings. The token settings mean when I go to remake a token, it remembers prior settings for images and the token save path. That's awesome and allows for rapid token remakes on updates. That works fine on the new dialog. Below is a pre-made the the file dialog goes to my token directory:
But when I finish that token up and then start in on a new token it forgets my prior save path and defaults to the application root directory:
I believe what's going on is while you're using the "individual token" config:
Code: Select all
dialog.setDirectory(config.getTokenFileDirectory());
Code: Select all
imageChooser = new JFileChooser( this.prefs.get(IMAGE_DIR, "" ) );
tokenOutputChooser = new JFileChooser( this.prefs.get(TOKEN_DIR, "" ) );
setImageFileChooserFilters(imageChooser);
setTokenFileChooserFilters(tokenOutputChooser);
You do save the TOKEN_DIR in prefs from the dialog, so that should be working fine. But you might need to null check config.getTokenFileDirectory() and pop in the master TOKEN_DIR pref when it's not set.
Re: Tokenlab: Pathfinder Herolabs -> Maptools converter
Ok, the above has been fixed (along with added some other UI goodness courtesy of co-developer iamgroot).
Sadly, I am still struggling to fix the impersonate versus selected bug you describe above. Something strange is happening when I try to persist the resources json down to the token. I've put enough time into it now that I must confess the onset of frustration and anguish.
Would appreciate any helpful thoughts on why I'm seeing the saveProperty() function operate on the wrong token - which only happens when you call the macro from an impersonated token; it works just fine if you only call it from selected tokens.
Wall of code below.
Sadly, I am still struggling to fix the impersonate versus selected bug you describe above. Something strange is happening when I try to persist the resources json down to the token. I've put enough time into it now that I must confess the onset of frustration and anguish.
Would appreciate any helpful thoughts on why I'm seeing the saveProperty() function operate on the wrong token - which only happens when you call the macro from an impersonated token; it works just fine if you only call it from selected tokens.
Wall of code below.
TL;DR
Here's the entry macro on the token:
The form macro:
And finally the update resource macro:
The update macro is working just fine, correctly calling back to the form macro without issue. The place where everything goes wrong is here, from the form macro:
Code: Select all
[h: currentToken = currentToken()]
[h: impersonatedToken = getImpersonated()]
[h, if( currentToken != impersonatedToken): activeToken = impersonatedToken; activeToken = currentToken]
[h: Resources = getProperty( "ResourcesJSON", activeToken )]
[h: args = json.set( "{}" , "ID", activeToken, "Resources", Resources )]
[MACRO("ResourceFrame@Lib:TokenLab") : args ]
Code: Select all
[h: title = "Resources"]
[h: activeToken = json.get( macro.args, "ID" ) ]
Resource frame called on token [r:activeToken]
[h: characterName = getProperty("Character", activeToken ) ]
[h: Resources = json.get( macro.args, "Resources" )]
[IF( json.contains( macro.args, "doSave" ) == 1 ), CODE: {
persisting token for [r:characterName] ( [r:activeToken] )
[r:setProperty( "ResourcesJSON", Resources, activeToken )]
}]
[h:ResourceNames = json.fields( Resources )]
[h: imageFormatString = "<img src='%s' border=0 height=45 width=45 alt='%s'>"]
[h: IncrementImage = strformat(imageFormatString, tblImage( "TokenLabImages", 2 ), "Add one to resource used")]
[h: DecrementImage = strformat(imageFormatString, tblImage("TokenLabImages", 3 ), "Subtract one to resource used")]
[h: ResetImage = strformat(imageFormatString, tblImage("TokenLabImages", 4), "Reset to zero")]
[frame(title, "input=1; height=100; width=100"):{
<html>
<head>
<title>[r: title]</title>
<link rel="stylesheet" type="text/css" href="css@Lib:TokenLab">
</head>
<body>
<h2><br>[r:characterName]</h2>
<br>
<table>
[FOREACH ( resourceName, ResourceNames, "" ), CODE: {
<tr>
[h: upargs = json.set("{}", "resourceName", resourceName, "ID", activeToken, "direction", "up" , "Resources", Resources )]
[h: downargs = json.set("{}", "resourceName", resourceName, "ID", activeToken, "direction", "down", "Resources", Resources )]
[h: resetargs = json.set("{}", "resourceName", resourceName, "ID", activeToken, "direction", "reset", "Resources", Resources )]
[h: UpButton = macroLink(IncrementImage, "UpdateResource@Lib:TokenLab", "self", upargs )]
[h: DownButton = macroLink(DecrementImage, "UpdateResource@Lib:TokenLab", "self", downargs )]
[h: ResetButton = macroLink(ResetImage, "UpdateResource@Lib:TokenLab", "self", resetargs )]
[h: used = json.get( json.get( Resources, resourceName ), "used" ) )]
[h: max = json.get( json.get( Resources, resourceName ), "max" ) )]
<td>[r:DownButton]</td>
<td><b><font size = "6" >[r:used] </font> </b><font size="3">/[r:max]</font></td>
<td>[r:UpButton]</td>
<td>[r:ResetButton]</td>
<td> <b> [r:resourceName] <b></td>
</tr>
}]
</table>
</body>
</html>
}]
Code: Select all
[h: resourceName = json.get(macro.args, "resourceName")]
[h: resourceDirection = json.get(macro.args, "direction")]
[h: activeToken = json.get( macro.args, "ID" )]
Update resource called on active token [r:activeToken]
[h: ResourcesJSON = json.get( macro.args, "Resources" )]
[h: Resource = json.get( ResourcesJSON, resourceName )]
[h: used = json.get( Resource, "used" )]
[h: newValue = 0]
[IF( resourceDirection == "up"), CODE: {
[h:newValue = add( used, 1 )]
}]
[IF( resourceDirection == "down"), CODE: {
[h:newValue = subtract( used, 1 )]
}]
[IF( resourceDirection == "reset"), CODE: {
[h:newValue = 0]
}]
[h:Resource = json.set(Resource, "used", newValue)]
[h: Resources = json.set( ResourcesJSON, resourceName, Resource )]
returning resource [r: Resources]
[h:Return = json.set( "{}", "Resources", Resources, "ID", activeToken, "doSave", "1" )]
[MACRO( "ResourceFrame@Lib:TokenLab" ): Return ]
Code: Select all
[IF( json.contains( macro.args, "doSave" ) == 1 ), CODE: {
persisting token for [r:characterName] ( [r:activeToken] )
[r:setProperty( "ResourcesJSON", Resources, activeToken )]
}]
Re: Tokenlab: Pathfinder Herolabs -> Maptools converter
Ok! 0.16 released (download. This should fix the impersonate/selected bug for the resources window. (And for spells as well!) My fix on that was a little cheaty; I basically made it so that you can only run on it on the selected token. if you've selected the impersonated token, it'll work then too. This is a breaking release that will require re-generation of Map Tool tokens.
The default token directory should be fixed - it seems to work for both mac and win, not sure about *NIX.
There are a couple of improvements on the UI as well, but otherwise this is a minor release.
Right now I'm thinking that I'm close to a 1.0 release, which means I'll fix the campaign properties format, which should mean that folks won't have to regenerate tokens on each tokenlab release.
The default token directory should be fixed - it seems to work for both mac and win, not sure about *NIX.
There are a couple of improvements on the UI as well, but otherwise this is a minor release.
Right now I'm thinking that I'm close to a 1.0 release, which means I'll fix the campaign properties format, which should mean that folks won't have to regenerate tokens on each tokenlab release.
Re: Tokenlab: Pathfinder Herolabs -> Maptools converter
Yep, works fine for me on Linux. Everything else also works, except for the spells link on the spells list window. That's still hard linked into the impersonate token.sozin wrote: The default token directory should be fixed - it seems to work for both mac and win, not sure about *NIX.
Do you plan on handling spell memorization and cleric/sorc spells per day? On the simplest level, they could just be tracked resources:
Code: Select all
<spellclass name="Wizard" maxspelllevel="1" spells="Spellbook"><spelllevel level="0" maxcasts="3" used="3"/><spelllevel level="1" maxcasts="2" used="2"/></spellclass>
<spellclass name="Sorcerer" maxspelllevel="1" spells="Spontaneous"><spelllevel level="0" unlimited="yes" used="0"/><spelllevel level="1" maxcasts="6" used="0"/></spellclass>
<spellclass name="Cleric" maxspelllevel="1" spells="Memorized"><spelllevel level="0" maxcasts="3" used="3"/><spelllevel level="1" maxcasts="2" used="2"/></spellclass>
Re: Tokenlab: Pathfinder Herolabs -> Maptools converter
Eek! Nice bug. Yep, tracked spells are next.
Re: Tokenlab: Pathfinder Herolabs -> Maptools converter
0.17 released and ready for download! Lots of nice stuff in this release. Includes:
0) Bug fix for above mentioned spell breadcrumb token permission bug.
1) An improved user interface.
Note that iamgroot (who did this code) has added some new right mouse click options. the 'Configure using portfolio defaults' option asks TokenLab to search through the default pog and portrait folders and find any images that match the character name of the token. this is a big time saver of your image file names match the character name, as you can do this as a bulk operation.
2) Cleaned up MapTool main interface.
I wanted more screen realestate with the spell resources, so I made the basic resources more slimmed down.
3) Spontaneous Spells
If your PC/NPC has spontaneous spells, they'll show up in the Special Resources section:
When you click the Spontaneous Spell Resources button, you get a new dialog:
If you have more than one spontaneous spell casting class, both while show up here. Hitting the Reset all link will send everything down to zero.
4) Memorized Spells
If your PC has memorized spells, they'll show up in the Special Resources - Memorized Spells section. My implementation here is a little hackish: a basically create a button for each level of memorized spells your character knows. (I did this because performance was atrocious when I put them all onto one form. It was taking 5+ seconds to redraw the form.) When you click on one of the spell level buttons you get:
As a bonus, I added a spell reference link, so if you click on the spell name it brings up the spell reference, with a breadcrumb back to the memorized spell form:
Finally, if your PC/NPC has rested and you want to reset all of their memorized spells, just click the red 'Reset all' button.
And that's it! Dracones, I'd love for you to bang around and try to break it before I announce the release on the other forums (paizo.com, etc). Happy New Year!
0) Bug fix for above mentioned spell breadcrumb token permission bug.
1) An improved user interface.
Note that iamgroot (who did this code) has added some new right mouse click options. the 'Configure using portfolio defaults' option asks TokenLab to search through the default pog and portrait folders and find any images that match the character name of the token. this is a big time saver of your image file names match the character name, as you can do this as a bulk operation.
2) Cleaned up MapTool main interface.
I wanted more screen realestate with the spell resources, so I made the basic resources more slimmed down.
3) Spontaneous Spells
If your PC/NPC has spontaneous spells, they'll show up in the Special Resources section:
When you click the Spontaneous Spell Resources button, you get a new dialog:
If you have more than one spontaneous spell casting class, both while show up here. Hitting the Reset all link will send everything down to zero.
4) Memorized Spells
If your PC has memorized spells, they'll show up in the Special Resources - Memorized Spells section. My implementation here is a little hackish: a basically create a button for each level of memorized spells your character knows. (I did this because performance was atrocious when I put them all onto one form. It was taking 5+ seconds to redraw the form.) When you click on one of the spell level buttons you get:
As a bonus, I added a spell reference link, so if you click on the spell name it brings up the spell reference, with a breadcrumb back to the memorized spell form:
Finally, if your PC/NPC has rested and you want to reset all of their memorized spells, just click the red 'Reset all' button.
And that's it! Dracones, I'd love for you to bang around and try to break it before I announce the release on the other forums (paizo.com, etc). Happy New Year!
Re: Tokenlab: Pathfinder Herolabs -> Maptools converter
The default token image logic is good, finds gifs, jpgs and png's. Doesn't seem to work with capitalized extensions under Linux: jpg vs JPG
You also might consider searching for underscores if the import character name has a space in it: AliaElshaw.jpg vs Alia_Elshaw.jpg
But otherwise the above is very very nice.
There's an issue with the memorized spells import that depends on how you have the spells memorized in Hero Lab. Specifically:
VS
In the first example, I have 2 color sprays, but they work fine.
But with the cure light wounds spell, you end up with this on the import which breaks your spell reference hyperlink:
The other thing is there's no 0 level spells tab. Wizards and witches have limited spells per day for this. Sorc and bards are unlimited I think.
And if you could add the ability to delete entries off the memorized spells tab and add entries to it from the spell reference tab, that'd be very handy. That way if a wizard wants to memorized a different spell the next morning, they could delete and add in an entry.
But the way you have the resources setup flows very well. Also, I imported a gestalt wizard/rogue and was happy to see that everything worked out of the box just fine.
The above was all tested with the latest 3.9 version of Herolab, so no worries there that the update has changed the XML.
You also might consider searching for underscores if the import character name has a space in it: AliaElshaw.jpg vs Alia_Elshaw.jpg
But otherwise the above is very very nice.
There's an issue with the memorized spells import that depends on how you have the spells memorized in Hero Lab. Specifically:
VS
In the first example, I have 2 color sprays, but they work fine.
But with the cure light wounds spell, you end up with this on the import which breaks your spell reference hyperlink:
The other thing is there's no 0 level spells tab. Wizards and witches have limited spells per day for this. Sorc and bards are unlimited I think.
And if you could add the ability to delete entries off the memorized spells tab and add entries to it from the spell reference tab, that'd be very handy. That way if a wizard wants to memorized a different spell the next morning, they could delete and add in an entry.
But the way you have the resources setup flows very well. Also, I imported a gestalt wizard/rogue and was happy to see that everything worked out of the box just fine.
The above was all tested with the latest 3.9 version of Herolab, so no worries there that the update has changed the XML.
Re: Tokenlab: Pathfinder Herolabs -> Maptools converter
Thank you! Can you send me the herolabs portfolio file with the Cure light Wounds x2 in it (or explain how you did it)? sozinsky at gmail dot com is the email address if you just want to send it over.
re: level 0 spells - right, duh, forgot about witches and wizards. will fix that asap.
re: spaces->underscores in the regex - yeah, should be an easy change, good idea.
re: allowing wizards to move around their memorized spells based on the spellbook - good idea, will backlog it. I'll be honest, I don't find programming in MapTool's macro language very fun, and so everytime I think about having to do something actually interesting with the language (like what you are describing), something inside me dies in a little I can't wait for native javascript support.
Getting closer to a 1.0 rollout!
re: level 0 spells - right, duh, forgot about witches and wizards. will fix that asap.
re: spaces->underscores in the regex - yeah, should be an easy change, good idea.
re: allowing wizards to move around their memorized spells based on the spellbook - good idea, will backlog it. I'll be honest, I don't find programming in MapTool's macro language very fun, and so everytime I think about having to do something actually interesting with the language (like what you are describing), something inside me dies in a little I can't wait for native javascript support.
Getting closer to a 1.0 rollout!
Re: Tokenlab: Pathfinder Herolabs -> Maptools converter
Portfolio's sent.
But basically how you create the issue is via
In Herolab I've chosen to memorize that spell twice, hence the x2 part.
The xml looks like:
But basically how you create the issue is via
In Herolab I've chosen to memorize that spell twice, hence the x2 part.
The xml looks like:
Code: Select all
<spellsmemorized><spell name="Cure Light Wounds (x2)" level="1"
Re: Tokenlab: Pathfinder Herolabs -> Maptools converter
Will do this in the 0.19 release.You also might consider searching for underscores if the import character name has a space in it: AliaElshaw.jpg vs Alia_Elshaw.jpg
Same.The other thing is there's no 0 level spells tab. Wizards and witches have limited spells per day for this. Sorc and bards are unlimited I think.
Fixed!But with the cure light wounds spell, you end up with this on the import which breaks your spell reference hyperlink
Re: Tokenlab: Pathfinder Herolabs -> Maptools converter
Another quirk from the previous 4e framework Tokenlab was based on. With critical hits it's only rolling x2 damage. For example, on a longbow attack(crit x3) a natural 20 should see the normal 1d8 damage roll with a 2d8 "critical damage" roll.
I also have up the redone tutorial for Tokenlab: http://tarsis.org/?p=55&preview=true
Better resolution and down to 330 megs using shockwave flash.
I also have up the redone tutorial for Tokenlab: http://tarsis.org/?p=55&preview=true
Better resolution and down to 330 megs using shockwave flash.
Re: Tokenlab: Pathfinder Herolabs -> Maptools converter
Ok, version 18 is released. It includes 3 things:
1) It now properly does critical hit multipliers (x3, x4, etc)
2) If a (N)PC name has a space in it, it'll turn the token name in $FIRSTNAME UNDERSCORE $LASTNAME, for example "Derrak_Stoneskull".
3) Fixed a funny bug that Dracones found parsing the rust monster damage dice
1) It now properly does critical hit multipliers (x3, x4, etc)
2) If a (N)PC name has a space in it, it'll turn the token name in $FIRSTNAME UNDERSCORE $LASTNAME, for example "Derrak_Stoneskull".
3) Fixed a funny bug that Dracones found parsing the rust monster damage dice