Minor Update:
--footer now works as Keith;s freetext suggestion. You can put any text in there, and it will be posted after the rolltemplate.
Minor Update:
--footer now works as Keith;s freetext suggestion. You can put any text in there, and it will be posted after the rolltemplate.
GiGs said:
Minor Update:
--footer now works as Keith;s freetext suggestion. You can put any text in there, and it will be posted after the rolltemplate.
Noticed a small issue since this update: I added a footer to a macro then removed it, but a blank 'footer' is still posted after the chat menu. Also noticed the footer isn't whispered like the menu is.
I'm genuinely confused why the extra line would be appearing after you have removed the footer call. Can you post the macro text you are using?
Good point about it not being whispered. I need to add that. By default it just posts in local chat. You can add /w (player name) to the start of the text there, but that's not universal, so I need to change that.
Here's the macro, but I think it's the script because all chat menus now have the blank footer post directly after.
!chatmenu @{selected|character_id} {template:pc}{{charname=@{selected|character_name}}} {{type=ability}} {{smallname=Traits}} {{showchar=[1]}} {{descflag=1}} {{desc=CHATMENU}} --title:XP—@{selected|xp}/@{selected|xp|max} --Senses|Languages --title:Money—@{selected|money_cp} cp, @{selected|money_sp} sp, @{selected|money_gp} gp, @{selected|money_pp} pp --Notes,background= --separator: |
This is in the test game I set up that you have access to, btw, in case you want to see exactly what all is at work there. Also added some npcs in case you want to test with those.
GiGs said:
keithcurtis said:
Hmm. I'm also seeing that I did not realize that the OGL sheet has an acrobatics roll, and an NPC acrobatics roll. Asking a PC to roll NPC acrobatics doesn't take proficiency into account, but it doesn't throw up an error, either. I'll either need to split these into two macros (not difficult), or wait to see what you come up with for filtering. I'll edit my posted code accordingly.
Awesome job!
Edit: Situation also applies to Saves. I don't think that having two statblock reporters is that huge an obstacle, though. I can make the PC version a universal token macro for my players, and reserve the NPC one for DM use.
I'll have to look at the D&D5e sheet and how it does this. What sort of filtering would be needed to make this work properly?
The top level filter would be the "npc" attribute, which has a value of 1 for NPCs and a value of 9 for PCs.
GiGs said:
I'm glad you like it Keith. The default template does take up so much space. I will probably add my own more compact version of it as a third formatting option, for sheets without rolltemplates of their own.
That would be a blessing for no reason other than allowing the players of a game to avoid the big pink buttons without resorting to the GM sending everyone a Stylus definition.
For repeating sections, could a fifth parameter be added which works the same as the fourth parameter, but at lower priority?
Example: For items, my chat menu splits them up by whether they are Consumable, Magic, or Mundane. Section for consumables would look like this
--title:consumables --repeating_gear|name|-rollShowGear|slot|quantity
where the fourth parameter is checked first, printing any items with a non-zero number in the 'slot' field as Consumable. The fifth parameter would then check if the 'quantity' field of each item is greater than zero, and print only those which meet that condition.
Ask and ye shall receive :)
I have a version of the script that allows more complex filtering. You can add any number of filtering options, just add them to the end of the item's parameters. For example, in a repeating section:
--repeating_gear|name|-rollShowGear|slot|quantity
(Use commas for non-repeating items.)
You can also check for specific values, using =, >, <. or ! (for not equal to.
So
--repeating_gear|name|-rollShowGear|slot|quantity>5
or
--repeating_gear|name|-rollShowGear|type=magic|quantity<4
I havent thoroughly tested it, so I'm not adding it to the first page just yet. The code is below:
(PS: Keith, I think the attribute name for prepared spells in 5e sheet is spellprepared, not prepared. I've changed the way names are checked, and just using prepared wont work anymore. )
Edit: updated OP, remoevd script from here.
Nice. I have now separated out ranged attacks from melee. I wanted to report on expendable resources, but the way the sheet reports them is frankly... not optimal. (Four different possible attribute names, depending on order added)
When i use the universal chat menus together with the CLR script to trigger Roll20AM i get my sounds effects twice - both when the chat shows f.ex shortbow as a skill and when the roll happens - any tips on how i can disregard the menu chat?
That sounds really clunky, Keith, I wonder why they are done that way.
Torben, that sounds like an issue with how you have CLR set up, I'm guessing. Does it respond to all chat, or is there something in my script's output that is triggering it? I haven't used it, but I guess you are using it to detect certain words in chat? If you can share your setup, I may be able to spot something.
GiGs said:
That sounds really clunky, Keith, I wonder why they are done that way.
My suspicion is that at least the first one (class_resource) is specific to charactermancer use. I can't remember what the second one is called offhand, but then they become _left and _right (2 columns). I didn't delve too deeply, because it looked like a rabbit hole.
Thanks for that update, GiGs! Seems like it will only work if the field contains exactly the filter word, rather than seeing if the filter word is somewhere in that field. Don't suppose there's a way around that? Example:
--repeating_gear|name|-rollShowGear|special=aura|quantity
where items are printed even if the "special" field says "aura of faint necromancy" or "aura of moderate enchantment"
Understood. Could another character like ~ or something could be used to indicate "field contains" rather than "field matches"?
I've updated the script in the second post, and instructions in the first. I havent used the ~ filter, I've changed the = to incorporate it. I'll repeat the rules here:
The rules are:
Notice the behaviour of > and < is slightly different. > includes the number supplied, and < doesnt. I think this is the most likely needed behaviour, let me know if this is wrong.
Keith, I've also changed the non-roll button trigger from an = to a !, so those non-rolls that were named button= should now be button! Hope this isnt too tiresome!
GiGs said:
- = (an equals sign): tests if the attribute being tested is equal to the given value. If its a text field, it accepts partial matches (so if you supply a test of "=comb" it will match "combat").
I'm noticing a minor issue where items with no value in the field are being printed when using this filter. Any idea why this could be? For example, this
--repeating_gear|name|-rollShowGear|special=aura|quantity
prints all items with the word aura in the special field with a quantity greater than 0, but also prints all items with no value in the special field. (It won't, however, print items that have a value that doesn't include aura, like consumable, in the special field.)
In the meantime, I can work around this by entering none in any special fields that would normally be empty.
Torben, I really need to update CRL at some point, but, you can add additional sections of text to look for like this (this should look for a roll and the text shortbow):
!crl \\create,name=Bow1,text=Shortbow&&## \\sound of arrows...
If you want more in depth help on CRL, let's address them in a separate thread so as not to take this off topic.
Seph said:
GiGs said:
- = (an equals sign): tests if the attribute being tested is equal to the given value. If its a text field, it accepts partial matches (so if you supply a test of "=comb" it will match "combat").
I'm noticing a minor issue where items with no value in the field are being printed when using this filter. Any idea why this could be? For example, this--repeating_gear|name|-rollShowGear|special=aura|quantityprints all items with the word aura in the special field with a quantity greater than 0, but also prints all items with no value in the special field. (It won't, however, print items that have a value that doesn't include aura, like consumable, in the special field.)
In the meantime, I can work around this by entering none in any special fields that would normally be empty.
To be sure I'm understanding you correctly, special is printing items with no value (empty cells), when it's looking for the word aura in that cell?
Edit: aha, i see why that's happening. I'll fix it tonight.
First of all, thanks for this script! Adding menus for use with the official pathfinder sheet is exactly what my group needs.
I'm running into an issue that I'm not sure how to address. I'm pretty sure there has to be a way but so far I haven't been able to figure it out. I have set up the macro to list spells for all levels. The issue is that if a character doesn't have say level 2 or higher spells then I get a bunch of errors for no attribute found. Is there anyway to get it to skip spell levels which aren't present?
Macro
!chatmenu @{selected|character_id} {template:pc}{{charname=@{selected|character_name}}} {{type=ability}} {{smallname=All Menues}} {{showchar=[1]}} {{descflag=1}} {{desc=CHATMENU}} Action Menu --title:Attacks --repeating_attacks|atkname|fullattack --title:Abilities --repeating_spell-like|spelldisplay|spell --title:Cantrips --repeating_spell-0|spelldisplay|spell|spellprepared --title:Level 1 *(@{selected|caster1_spells_prepared_level_1}/@{selected|caster1_spells_total_level_1})* --repeating_spell-1|spelldisplay|spell|spellprepared --title:Level 2 *(@{selected|caster1_spells_prepared_level_2}/@{selected|caster1_spells_total_level_2})* --repeating_spell-2|spelldisplay|spell|spellprepared --title:Level 3 *(@{selected|caster1_spells_prepared_level_3}/@{selected|caster1_spells_total_level_3})* --repeating_spell-3|spelldisplay|spell|spellprepared --title:Level 4 *(@{selected|caster1_spells_prepared_level_4}/@{selected|caster1_spells_total_level_4})* --repeating_spell-4|spelldisplay|spell|spellprepared --title:Level 5 *(@{selected|caster1_spells_prepared_level_5}/@{selected|caster1_spells_total_level_5})* --repeating_spell-5|spelldisplay|spell|spellprepared --title:Level 6 *(@{selected|caster1_spells_prepared_level_6}/@{selected|caster1_spells_total_level_6})* --repeating_spell-6|spelldisplay|spell|spellprepared --title:Level 7 *(@{selected|caster1_spells_prepared_level_7}/@{selected|caster1_spells_total_level_7})* --repeating_spell-7|spelldisplay|spell|spellprepared --title:Level 8 *(@{selected|caster1_spells_prepared_level_8}/@{selected|caster1_spells_total_level_8})* --repeating_spell-8|spelldisplay|spell|spellprepared --title:Level 9 *(@{selected|caster1_spells_prepared_level_9}/@{selected|caster1_spells_total_level_9})* --repeating_spell-9|spelldisplay|spell|spellprepared --title:Skills --Appraise,appraise|Bluff,Bluff|Climb,climb|Craft,craft|Diplomacy,diplomacy --separator: |
Error
Thanks,
Meldogs
It looks like the problem is this bit: @{selected|caster1_spells_prepared_level_1}/@{selected|caster1_spells_total_level_1})
I think that error is caused by roll20 trying to get those attributes and finding they dont exist. Thats not the script, that's roll20 parsing attribute values before it sends them to the script.
Is there any way to to create those attributes and make sure they are zero?
Although not technically part of menu creation, your question does have me thinking about adding a feature to just read attributes in the --title parameter, to avoid this problem. It does seem like a useful feature. It'll have to wait till after the weekend, I'm a bit busy right now.
Meldogs said:
First of all, thanks for this script! Adding menus for use with the official pathfinder sheet is exactly what my group needs.
I'm running into an issue that I'm not sure how to address. I'm pretty sure there has to be a way but so far I haven't been able to figure it out. I have set up the macro to list spells for all levels. The issue is that if a character doesn't have say level 2 or higher spells then I get a bunch of errors for no attribute found. Is there anyway to get it to skip spell levels which aren't present?
Macro
!chatmenu @{selected|character_id} {template:pc}{{charname=@{selected|character_name}}} {{type=ability}} {{smallname=All Menues}} {{showchar=[1]}} {{descflag=1}} {{desc=CHATMENU}} Action Menu --title:Attacks --repeating_attacks|atkname|fullattack --title:Abilities --repeating_spell-like|spelldisplay|spell --title:Cantrips --repeating_spell-0|spelldisplay|spell|spellprepared --title:Level 1 *(@{selected|caster1_spells_prepared_level_1}/@{selected|caster1_spells_total_level_1})* --repeating_spell-1|spelldisplay|spell|spellprepared --title:Level 2 *(@{selected|caster1_spells_prepared_level_2}/@{selected|caster1_spells_total_level_2})* --repeating_spell-2|spelldisplay|spell|spellprepared --title:Level 3 *(@{selected|caster1_spells_prepared_level_3}/@{selected|caster1_spells_total_level_3})* --repeating_spell-3|spelldisplay|spell|spellprepared --title:Level 4 *(@{selected|caster1_spells_prepared_level_4}/@{selected|caster1_spells_total_level_4})* --repeating_spell-4|spelldisplay|spell|spellprepared --title:Level 5 *(@{selected|caster1_spells_prepared_level_5}/@{selected|caster1_spells_total_level_5})* --repeating_spell-5|spelldisplay|spell|spellprepared --title:Level 6 *(@{selected|caster1_spells_prepared_level_6}/@{selected|caster1_spells_total_level_6})* --repeating_spell-6|spelldisplay|spell|spellprepared --title:Level 7 *(@{selected|caster1_spells_prepared_level_7}/@{selected|caster1_spells_total_level_7})* --repeating_spell-7|spelldisplay|spell|spellprepared --title:Level 8 *(@{selected|caster1_spells_prepared_level_8}/@{selected|caster1_spells_total_level_8})* --repeating_spell-8|spelldisplay|spell|spellprepared --title:Level 9 *(@{selected|caster1_spells_prepared_level_9}/@{selected|caster1_spells_total_level_9})* --repeating_spell-9|spelldisplay|spell|spellprepared --title:Skills --Appraise,appraise|Bluff,Bluff|Climb,climb|Craft,craft|Diplomacy,diplomacy --separator: |Error
Thanks,
Meldogs
I think the sheet doesn't create those attributes until those spell levels are made visible on the sheet. Try adding a value in every per day cell for all spell levels like so
then test it out. If you don't get the error message anymore, try removing all the per day values besides the ones accurate for the character's level, and test it again.
I've done that with most of the characters in my game for other reasons, so I haven't seen that error message yet myself. Hope it helps!
Thanks GiGs and Seph for your time. I appreciate you looking at my issue.
You were both right. The problem is that the sheet doesn't have those attributes until you actually put a spell of that level in your list and then click the prepared box. You can then remove the spell and the error disappears because the attributes now exist on the sheet. It isn't totally ideal but I don't know what you could do differently since the sheet appears to create those attributes as needed.
GiGs your script is awesome. I think this is really going to make the transition to the official pathfinder sheet for my group possible. They were spoiled by the community sheet's menus but with this I should be able to create something very similar for them.
- Meldogs
You can probably create and blank those attributes automatically with chatsetattr, but depending on how they are implemented, you might need to wait until they have fixed the problem with the API not triggering sheetworkers.
Interesting idea Keith. Also, thank you for the idea of how to setup the spell section. I forgot to mention that I might have borrowed that from the example that you posted.
- Meldogs
Meldogs said:
Thanks GiGs and Seph for your time. I appreciate you looking at my issue.
You were both right. The problem is that the sheet doesn't have those attributes until you actually put a spell of that level in your list and then click the prepared box. You can then remove the spell and the error disappears because the attributes now exist on the sheet. It isn't totally ideal but I don't know what you could do differently since the sheet appears to create those attributes as needed.
GiGs your script is awesome. I think this is really going to make the transition to the official pathfinder sheet for my group possible. They were spoiled by the community sheet's menus but with this I should be able to create something very similar for them.
- Meldogs
Thanks!
The script already looks for some attributes, and doesnt display them if they dont exist. So I was thinking of including a syntax that let you create a placeholder for an attribute(say, instead of using the @{name|attributename} syntax which forces roll20 to look for it, you could include something like {UCM|attributename|defaultvalue} - no @ symbol, UCM in place of character name). Roll20 wouldnt attempt to parse it, and the script would then look for the attribute and replace that placeholder with its value if it exists, and defaultvalue if it doesnt.
I'll fiddle around with that after the weekend, and see if how it goes.
Btw, GiGs, I just noticed the ! filter doesn't seem to be working either; it currently doesn't print anything. Think it could have something to do with the issue with the = filter?
EDIT: I did some more testing with the filters, and I've mostly gotten the desired results but not sure they're working as intended.
My original attack macro worked as intended before one of the recent updates
--title:Melee --repeating_attacks|atkname|fullattack|atktype=melee --title:Ranged --repeating_attacks|atkname|fullattack|atktype=ranged --title:Special --repeating_attacks|atkname|fullattack|atktype!melee|atktype!ranged
All melee items printed under Melee, ranged under Ranged, and everything that was neither printed under Special. Now this same macro prints melee items under Melee and ranged under Ranged as intended, but all items with no attack value are printed twice—once under Melee, once under Ranged—while nothing is printed under Special.
I've managed to get the desired results by changing the macro to the following, mainly through guesswork
--title:Melee --repeating_attacks|atkname|fullattack|atktype=melee|atktype!- --title:Ranged --repeating_attacks|atkname|fullattack|atktype=ranged|atktype!- --title:Special --repeating_attacks|atkname|fullattack|atktype=bab|atktype!- --repeating_attacks|atkname|fullattack|atktype=fob|atktype!- --repeating_attacks|atkname|fullattack|atktype=- --repeating_attacks|atkname|fullattack|atktype=cmb|atktype!-
No rush on this, obviously; I know you're busy!
Is there anyway to make parts "unclickable" other than setting each as a title? I hope that makes sense. This is the macro I'm using. The Saves are working great but the Defense Statistics can be clicked and produce an error.
!chatmenu @{selected|character_id} {template:pc}{{charname=@{selected|character_name}}} {{type=}} {{smallname=Defenses}} {{showchar=[1]}} {{descflag=1}} {{desc=CHATMENU}} {{shownotes=[1]}} {{notes=**- Fort:**@{selected|fortitude_notes} |**Ref:**@{selected|reflex_notes} |**Will:**@{selected|will_notes} |**AC:**@{selected|ac_notes} |**CMD:**@{selected|cmd_notes} |**SR:**@{selected|sr_notes}}} --separator: | --title:Saves --Fort(@{selected|fortitude}),fortitude --Ref(@{selected|reflex}),reflex --Will(@{selected|will}),will --title:Defense Statistics --AC @{selected|ac} |Touch @{selected|ac_touch} |Flat-Footed @{selected|ac_flatfooted} |CMD @{selected|cmd_mod} |SR @{selected|sr}
This is what it is currently producing.
Thanks,
Meldogs
Your earlier question made me think about handling situations like this more elegantly, and I hope to get some work done on this script tonight (first priority the bugs mentioned earlier).
But looking over this specific macro, I'm wondering, do you need to use a chat menu script for that one? There's no dynamically generated menus, there, you could just use standard macro text in the desc section.
The only buttons you need are for the 3 saving throws, and you can construct them like
[Ref(@{selected|reflex})](~selected|reflex)
or
[Ref(@{selected|reflex})](! %{selected|reflex})
(I think thats the right code, from memory.)
I'm surprised to see the script being used for chat menus that have so little dynamically created content. I didnt anticipate that and need to think about handling layouts that mix dynamic and non-dynamic content better. But Scott's Menu Maker does this already, so you might want to check that out and see if its a better fit for your needs.
GiGs said:
Keith, I've also changed the non-roll button trigger from an = to a !, so those non-rolls that were named button= should now be button! Hope this isnt too tiresome!
I just got around to updating. button! gives a "no ability was found %{Goblin|repeating_npctrait_desc!}". The equals sign still works as it used to.
Meldogs, have you tried using --footer ? It prints the text as a whispered chat message following the menu
keithcurtis said:
GiGs said:
Keith, I've also changed the non-roll button trigger from an = to a !, so those non-rolls that were named button= should now be button! Hope this isnt too tiresome!
I just got around to updating. button! gives a "no ability was found %{Goblin|repeating_npctrait_desc!}". The equals sign still works as it used to.
Thanks! I'll check that.
GiGs said:
Your earlier question made me think about handling situations like this more elegantly, and I hope to get some work done on this script tonight (first priority the bugs mentioned earlier).
But looking over this specific macro, I'm wondering, do you need to use a chat menu script for that one? There's no dynamically generated menus, there, you could just use standard macro text in the desc section.
The only buttons you need are for the 3 saving throws, and you can construct them like
[Ref(@{selected|reflex})](~selected|reflex)or
[Ref(@{selected|reflex})](! %{selected|reflex})(I think thats the right code, from memory.)
I'm surprised to see the script being used for chat menus that have so little dynamically created content. I didnt anticipate that and need to think about handling layouts that mix dynamic and non-dynamic content better. But Scott's Menu Maker does this already, so you might want to check that out and see if its a better fit for your needs.
Thanks for the suggestion. I think I will try using the desc section. I'm not super good at putting this kind of thing together so I appreciate your time and patience.
- Meldogs
Seph said:
Meldogs, have you tried using --footer ? It prints the text as a whispered chat message following the menu
I have used the footer in another macro. I'll look into that too. Thanks Seph
It occurred to me after posting, you could move the defence statistics into the desc section, and use chatmenu for the saves.
Then you can format those defence stats however you want them. Something like (untested)
!chatmenu @{selected|character_id} {template:pc}{{charname=@{selected|character_name}}} {{type=}} {{smallname=Defenses}} {{showchar=[1]}} {{descflag=1}} {{desc=CHATMENU \n**Defense Statistics** \nAC @{selected|ac} |Touch @{selected|ac_touch} |Flat-Footed @{selected|ac_flatfooted} |CMD @{selected|cmd_mod} |SR @{selected|sr} }} {{shownotes=[1]}} {{notes=**- Fort:**@{selected|fortitude_notes} |**Ref:**@{selected|reflex_notes} |**Will:**@{selected|will_notes} |**AC:**@{selected|ac_notes} |**CMD:**@{selected|cmd_notes} |**SR:**@{selected|sr_notes}}} --separator: | --title:Saves --Fort(@{selected|fortitude}),fortitude --Ref(@{selected|reflex}),reflex --Will(@{selected|will}),will
GiGs said:
It occurred to me after posting, you could move the defence statistics into the desc section, and use chatmenu for the saves.
Then you can format those defence stats however you want them. Something like (untested)
!chatmenu @{selected|character_id} {template:pc}{{charname=@{selected|character_name}}} {{type=}} {{smallname=Defenses}} {{showchar=[1]}} {{descflag=1}} {{desc=CHATMENU \n**Defense Statistics** \nAC @{selected|ac} |Touch @{selected|ac_touch} |Flat-Footed @{selected|ac_flatfooted} |CMD @{selected|cmd_mod} |SR @{selected|sr} }} {{shownotes=[1]}} {{notes=**- Fort:**@{selected|fortitude_notes} |**Ref:**@{selected|reflex_notes} |**Will:**@{selected|will_notes} |**AC:**@{selected|ac_notes} |**CMD:**@{selected|cmd_notes} |**SR:**@{selected|sr_notes}}} --separator: | --title:Saves --Fort(@{selected|fortitude}),fortitude --Ref(@{selected|reflex}),reflex --Will(@{selected|will}),will
That is exactly what I was thinking after you mentioned it. Using desc for the defense statistics makes sense. I just couldn't see that before for some reason. Staring at my screen for too long had me stuck in a rut. Thanks again for all the help.
Seph said:
Btw, GiGs, I just noticed the ! filter doesn't seem to be working either; it currently doesn't print anything. Think it could have something to do with the issue with the = filter?
EDIT: I did some more testing with the filters, and I've mostly gotten the desired results but not sure they're working as intended.
My original attack macro worked as intended before one of the recent updates
--title:Melee --repeating_attacks|atkname|fullattack|atktype=melee --title:Ranged --repeating_attacks|atkname|fullattack|atktype=ranged --title:Special --repeating_attacks|atkname|fullattack|atktype!melee|atktype!rangedAll melee items printed under Melee, ranged under Ranged, and everything that was neither printed under Special. Now this same macro prints melee items under Melee and ranged under Ranged as intended, but all items with no attack value are printed twice—once under Melee, once under Ranged—while nothing is printed under Special.
I've managed to get the desired results by changing the macro to the following, mainly through guesswork
--title:Melee --repeating_attacks|atkname|fullattack|atktype=melee|atktype!- --title:Ranged --repeating_attacks|atkname|fullattack|atktype=ranged|atktype!- --title:Special --repeating_attacks|atkname|fullattack|atktype=bab|atktype!- --repeating_attacks|atkname|fullattack|atktype=fob|atktype!- --repeating_attacks|atkname|fullattack|atktype=- --repeating_attacks|atkname|fullattack|atktype=cmb|atktype!-No rush on this, obviously; I know you're busy!
I havent had a chance to work on this, but starting to now. I'm curious about the second version of the macro above. Why is this part necessary in so many of your arguments?
|atktype!-
GiGs said:
I havent had a chance to work on this, but starting to now. I'm curious about the second version of the macro above. Why is this part necessary in so many of your arguments?
|atktype!-
That's the only workaround I've found to keep |atktype=melee and |atktype=ranged from printing special attack entries that have no type, like sneak attack. The attack types are selected from a drop-down rather than typed in, and a blank attack type actually uses the - character.
I'm pretty certain it's linked to the issue I was having with listing gear, where |special=aura would print items that contained 'aura' somewhere in the special field, plus items with an empty special field. My workaround for that was filling empty special fields with 'none'.
Here's a bugfix release, which should (crosses fingers) address Keith and Seph's reports. Give it a try, and if it works, I'll update the 2nd post in the thread.
<deleted: code here is outdated now>
! is now doing what = used to do. I'd do some more testing, but I had some bad results from a rollback and don't want to mess with the game too much until it gets fixed. I'll post the latest iteration then, since I've added more functionality. Thanks again. This script makes the OGL sheet usable for me.