Roll20 uses cookies to improve your experience on our site. Cookies enable you to enjoy certain features, social sharing functionality, and tailor message and display ads to your interests on our site and others. They also help us understand how our site is being used. By continuing to use our site, you consent to our use of cookies. Update your cookie preferences .
×
Create a free account

[Script] CashMaster 5e - a simple script to manage a party's money.

Yey for new update! Great work guys.
Ravenknight said: Yey for new update! Great work guys. Is this just the old screenshot or do you still get duplicate outputs?
No no! It's one GM report and one Sender Transfer Report so I wanted to show that things are working like intended. Sorry for not being clear in my post.
Ah, perfect! I should have looked a bit closer...
Ravenknight said: Michael G. said: Finally got the opportunity to go bug hunting today.  Findings: Target ID: Not a defect.   The error message you're reporting is actually not even in 0.8.  It's part of 0.7.1 and before.  I guess go validate that you're actually running the latest version?  I don't know how the script engine knows to reload itself with new things, so maybe force a restart? Duplicate Messages: -giveNPC and -dropWithReason are the same function under the hood, so I was able to replicate the bug on them, but not on transfer.  Resolved in branch.   I wonder if the transfer issue is also an artifact of 0.7.1? Set Default Character: selecting no token will crash CashMaster.  Resolved in branch. I've submitted a pull request for my changes.  I've also added the ability to remove your default character selection (to be entirely honest, this is mainly a debug tool).  Sorry it took so long to get around to this! Hmm. I have Cashmaster as One-Click install and updated to the latest version and it was 8.0 when testing. I did have 0.7.1 installed in the same campaign before updating. Could it be an artefact? I don't think so?  Honestly, I don't know.  That string is completely absent from 0.8's code, but it is  in previous versions and we don't store error codes in the state or anything so roll20 being weird and handing you an old version was all I could think of.
1534137884
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
I skimmed the previous pages, but couldn't find confirmation: It seems that when using the Shaped Sheet, the script does not write to read from the money fields displayed on the character sheet, but uses created attributes on the Attributes and Abilities pane. Is this the case?
keithcurtis said: I skimmed the previous pages, but couldn't find confirmation: It seems that when using the Shaped Sheet, the script does not write to read from the money fields displayed on the character sheet, but uses created attributes on the Attributes and Abilities pane. Is this the case? keithcurtis, yes, the script is using the attributes pp, gp, ep, sp, and cp. I'm not using the shaped sheet, but I assume that it also just displays these attributes on the character sheet the same way the OGL sheet does. 
1534172996
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
I believe it is a repeating field on the Shaped sheet. At any rate, the script keeps perfect accountancy, but has no agreement with the coinage amounts listed on the Shaped sheet. I.e. if I manually type in 50 in the gp field on the sheet (not the attributes & abilities tab), it has no bearing on Cashmaster's accounting. And vice versa. There is a gp attribute on the tab, but not the sheet.
Hey just a heads up. So I was getting a strange error when I used the !CM -Tool command. When I used it one of my players kept seeing the menu while I couldn't. I figured out why after a bit of trail and error. My display name is Cosmic Latte, and her display name was Cosmic Cocoa. For some reason because of our screen names it was giving her the full api command list (even though she is just a player) when I used the command. We have changed our names so it won't be a problem, but just thought I would tell you about it. Thanks for the useful script!
1534423443
The Aaron
Pro
API Scripter
This needs to be fixed in the API script but it's pretty easy.  you just need to quote the name of the person being whispered to, for example: var historyContent = '/w ' + sender + ' &{template:' + rt[0] + '} {{' + rt[1] + '=<h3>Cash Master</h3><hr>'; becomes: var historyContent = '/w "' + sender + '" &{template:' + rt[0] + '} {{' + rt[1] + '=<h3>Cash Master</h3><hr>'; or var historyContent = `/w "${sender}" &{template:${rt[0}} {{${rt[1]}=<h3>Cash Master</h3><hr>`;
Hi Cosmic Latte, I wasn't able to replicate this issue here, but as The Aaron pointed out, I should have added quotes to the name anyway. Can you give this test version here a try and see if it works for you?&nbsp; <a href="https://raw.githubusercontent.com/arthur-bauer/roll20-cashmaster/release/v0.8.2-0/publish/CashMaster.js" rel="nofollow">https://raw.githubusercontent.com/arthur-bauer/roll20-cashmaster/release/v0.8.2-0/publish/CashMaster.js</a>
1534434914
The Aaron
Pro
API Scripter
It's hard to replicate because the order of matching the first word of a name is not easily determined.&nbsp; I've hit it all the time with "The Aaron" vs "The DM", etc.&nbsp; You'd need to create a second user and change your names to something like "Arthur Prime" and "Arthur Test" and then try the command from both of them to see which would actually get the message addressed to "Arthur".
Yeah, that is what I tried. I run into a small issue with the " (GM)" suffix instead, after adding the quotes, and I was like WTF?! But I think it should be fine now.
1534436060
The Aaron
Pro
API Scripter
Ah yeah, now I remember why I always grab the name like this: let who=(getObj('player',msg.playerid)||{get:()=&gt;'API'}).get('_displayname');
The Aaron said: Ah yeah, now I remember why I always grab the name like this: let who=(getObj('player',msg.playerid)||{get:()=&gt;'API'}).get('_displayname'); That would be the elegant way. I just ripped it off the end of the string... ladies and gentlemen, see the difference between an arcane scriptomancer and a code barbarian.
1534436429
The Aaron
Pro
API Scripter
HAHAHAH.&nbsp; In fairness, your way will automatically handle speaking as a character and expecting the results to be whispered to all that control it. =D
Ah yeah. I totally did that on purpose, of course.
1534567292

Edited 1534595853
GM Michael
API Scripter
I actually have been doing it deliberately in my updates.&nbsp; I have a husband/wife duo that fill in for each other all the time, so I've been wanting to make sure they could both see the log. Also, good catch on the quotes.&nbsp; Arthur, I haven't had a chance to try your latest version, but I assume it fixes it?&nbsp; The source change certainly looks like it would. On an unrelated note: previously, I mentioned the idea of giving CashMaster the ability to function as a store with a series of buy buttons for the default sticker prices.&nbsp; I've seen several scripts that utilize the GM notes section for script data, but that leaves me with fears of collisions.&nbsp; I'm considering (by which I mean I will likely start tomorrow, unless there's already something that does this) writing a new script, GM Note Parser, that would basically allow you to cordon off sections of the GM notes without fully handing them over to scripts, removing the GM's ability to use them.&nbsp; GM Note Parser would be a utility library, similar to The Aaron's APISelection, that other scripts would utilize.&nbsp; Ideally, I'd like to have the shop feature of CashMaster support it as a sort of demo of its usefulness.&nbsp; Basically, what I'm asking is... Would you object to a shop feature? Would you object to the shop feature using a library script? Would you mind if along the road I made CashMaster use APISelection if present? FWIW, I'm presently basically just thinking of it being XML-based so that it's human readable/editable.&nbsp; Imagine a shopkeeper NPC named Jeni who sells potions, rope, and other goodies.&nbsp; Her GM Notes section might look a little like this. Jeni the shopkeeper acts nice the first time the party sees them, but the next time, she should be openly hostile and should have a bandage over her left eye. &lt;GMNoteParser&gt; &lt;CashMaster&gt; &lt;Shop&gt; &lt;Item&gt; Name=Potion Cost=15gp &lt;/Item&gt; &lt;Item&gt; Name=50 ft. Rope Cost=1gp &lt;/Item&gt; &lt;/Shop&gt; &lt;/CashMaster&gt; &lt;/GMNoteParser&gt; I'm open to other formats (and may well change once I get into it), but does that sound at all reasonable?
Michael G., in the meanwhile, this is as much your script as it is mine. ;) So of course no, I don't object. Why should I? The idea is great! Maybe we can even add an import/convert function for some of the popular shop generators like from donjon...
1534595745

Edited 1534600191
GM Michael
API Scripter
Ooh, I'd forgotten about donjon; my campaign has rather nonstandard pricing because I've overhauled enchanting .&nbsp; Hmm...&nbsp; I guess I could add an inflation multiplier? Gold that goes in from donjon is multiplied by a certain value to bring it on par with the campaign? Of course, looking at donjon, I don't see a good way to export it... Would we just have the player copy/paste the whole page with Ctrl+A, Ctrl+C and hope for the best? EDIT: now that I'm on my desktop, I can actually try this.&nbsp; Pasting it into notepad gives you this .&nbsp; Hacky as it might be, I guess we could scrape Description, Shopkeeper, and Items.&nbsp; Then, for pricing, I guess we could use a gigantic lookup table copied from the sanitized item cost list .&nbsp; Obviously, the GM could change it at will later, but that would at least give them a baseline that isn't ludicrous.
1534608157
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
I have found the repeating fields used for currency in the Shaped Sheet. I'm willing to try to cobble together something that will work for my campaign, but I don't think it can be universal (no guarantee of order of fields, since they are user-customizable). Before I dive in, can you give me a heads up on how daunting a task this might be? Thanks!
Michael G. said: Ooh, I'd forgotten about donjon; my campaign has rather nonstandard pricing because I've overhauled enchanting .&nbsp; Hmm...&nbsp; I guess I could add an inflation multiplier? Gold that goes in from donjon is multiplied by a certain value to bring it on par with the campaign? Of course, looking at donjon, I don't see a good way to export it... Would we just have the player copy/paste the whole page with Ctrl+A, Ctrl+C and hope for the best? EDIT: now that I'm on my desktop, I can actually try this.&nbsp; Pasting it into notepad gives you this .&nbsp; Hacky as it might be, I guess we could scrape Description, Shopkeeper, and Items.&nbsp; Then, for pricing, I guess we could use a gigantic lookup table copied from the sanitized item cost list .&nbsp; Obviously, the GM could change it at will later, but that would at least give them a baseline that isn't ludicrous. It sure looks hacky. Hm. Maybe we come up with some other method to quickly populate the GM Notes. I know for sure that otherwise I'll only create one single shop and use that everywhere. ;) Well, guess that needs to brew in my brain over night... keithcurtis said: I have found the repeating fields used for currency in the Shaped Sheet. I'm willing to try to cobble together something that will work for my campaign, but I don't think it can be universal (no guarantee of order of fields, since they are user-customizable). Before I dive in, can you give me a heads up on how daunting a task this might be? Thanks! Keithcurtis, I'm still wondering why the currency suddenly is stored in repeating fields. I remember that, when Kryx had a look at it a while ago, money was stored in the same attributes as in the OGL sheet. The only big difference that the different roll template. Not sure if that has been changed in the sheet?
1534693429
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
Arthur B, A few months ago, Kryx changed the way that currency is recorded, so that people could add lines for things like gems or non-standard currency. It's not yet reflected in the wiki. The script still functions, but is writing to fields that are no longer displayed on the sheet and have no correlation to the omes that are displayed. I'm not sure if this is complete, but I have managed to discover these fields: repeating_currency_ID_quantity repeating_currency_ID_name repeating_currency_ID_value
I'm not sure how we even could go about supporting non-standard currencies like that...&nbsp; I mean, I guess we could allow the user to declare non-standard conversion rates and store them in state, but that would involve a LOT of changes to the code. As for my ShopMaster branch, brief status update (I've got a session today and likely won't get another chance to work on this till next weekend): At present, the buy buttons don't reduce the shop's inventory, but everything else is actually dynamically loaded from the GM Notes.&nbsp; Also, while the original thought was to use XML, due to integrated support, I ended up going with JSON, but I've got it auto-formatting the result, so it's plenty human-readable.&nbsp; Here's what the GM Notes section actually looks like .&nbsp; If anybody has preferences for additional fields (maybe a shop motto/subtitle?), I'm all ears.
1534696051

Edited 1534697105
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
Rats. I was hoping it would be as simple as swapping out attribute names for repeating field names. Example: swap "GP" for "repeating_currency_$2_quantity" There are some other possible workarounds I'll explore, since I really do like the way your shop macro is looking. Michael G. said: I'm not sure how we even could go about supporting non-standard currencies like that...&nbsp; I mean, I guess we could allow the user to declare non-standard conversion rates and store them in state, but that would involve a LOT of changes to the code.
Michael G., a couple of comments from my side: First: I LOVE this. Really. It's awesome. Second: I don't think JSON instead of XML will make any big difference. JSON is a bit more difficult to write, but for the few people who are writing the GM notes by hand, it won't make much of a difference, I assume. Third: It's still awesome. One idea for additional fields: What do you think about optional inline images? Something like this: Keithcurtis: I was afraid that Kryx changed the currency structure on the sheet. That's a bummer. It will require some change to the code, unfortunately, to get shaped support back. I'd probably remove it in the meanwhile until we figured out a good way to do it.
Keith: mapping the standard currencies probably won't be hard, but actually supporting non-standard ones is the difficulty. Arthur: I'm cool with inline images, but I guess we'd just use the token of the NPC shopkeeper?&nbsp; I can't really imagine what else we could draw from.&nbsp; The actual profile image could be an arbitrary shape and show up weird, and actually adding a picture to the GM Notes (which i don't even know if it's possible) would be really weird to read and code for.
Sure, the token image will do nicely. I thought about uploading an image to your library, then getting the URL and putting the URL into the GM notes. But of course the token image is right there, ready to use.
1534716895
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
Inline images: I use inline images for my NPC Directory macro (references to offline images). I can't imagine that they would be hard to code for the API. You'd need some kind of a default image in case none was provided? I'm likely misunderstanding the issue, though. Shaped Currency: I really don't need the non-standard ones. I'll pore through the script and see if I can decipher where substitutions need to be made. Any hints would be most appreciated. Are the references to attributes all in one section or spread throughout?
Oh, the new shop-stuff look gorgeous Michael. :)
1534802695
Kryx
Pro
Sheet Author
API Scripter
Arthur B said: Keithcurtis: I was afraid that Kryx changed the currency structure on the sheet. That's a bummer. It will require some change to the code, unfortunately, to get shaped support back. I'd probably remove it in the meanwhile until we figured out a good way to do it. Should be a matter of reading the names of each currency repeating section looking for keywords, gp for example. Once that is found then the amount can be modified as normal.
Minor Update: expect no major changes this weekend.&nbsp; Some (happy) IRL things came up.&nbsp; That said, I do have this (which is obviously not acceptable, but hey, it's a thing):
Ok, having read through this entire thread I don't see anyone posting problems with the script beyond all the tweaking. I am using the Shaped v19.0.0 character sheets with the v13.7.0 ShapedScript. I have installed the One-Click install version 0.8.1 of CashMaster and selected the appropriate Shaped version on the API page. However, the script does absolutely nothing beyond spitting out that enormous inline help text when I use "!cm -help" in the chat window. Sending the -overview, -status, and -menu commands gives me empty/blank responses from the script. Is there some other configuration that needs to be done? P.S. I tried using the version on Github but there was absolutely no difference.
1535755885
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
If you've read through all the thread, then surely you've seen that the script does not currently work with the Shaped sheet? Or at least, it does not coordinate with the displayed values on the sheet which are a repeating field, and background attributes (that are not displayed). This has been true since Shaped 18.1.
keithcurtis said: If you've read through all the thread, then surely you've seen that the script does not currently work with the Shaped sheet? Or at least, it does not coordinate with the displayed values on the sheet which are a repeating field, and background attributes (that are not displayed). This has been true since Shaped 18.1. I only caught something about it using fields other than the repeating currency section on the sheet. I guess after 3-4 pages I wasn't as diligent.... :(
1535824408
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
For what it's worth, it still technically works with the sheet, you just have to decide whether to use the script or the fields to monitor wealth. At this point, you can't have both. :(
1536009494

Edited 1536009808
GM Michael
API Scripter
Update on ShopMaster: It now technically &nbsp;works.&nbsp; You can create a shop, people can click the buy button, the money is subtracted from their account, and (if they're using OGL) they find a new item in their inventory (or the counter is updated, if they already have one).&nbsp; That said, it's not yet user-friendly because you have to manually write JSON from scratch, which is less than ideal. TODO before Release: Create GUI mechanism for setting up shops (optional) Allow importing from donjon Make crash-resistant
1536418201

Edited 1536420842
GM Michael
API Scripter
Just submitted the Shopmaster pull request to Arthur's branch. Commands to get started are accessible from -menu.&nbsp; BE WARNED: at present, you cannot have commas in your shop descriptions.&nbsp; Changing this will require a change to the way multitargets and multicommands are parsed which will likely happen eventually, so I guess be aware that's coming in case you have any macros that rely on them (it won't be a big change, but you will have to update them when that happens). Future Enhancement Ideas: Allow importing from donjon: this will require the update to multitargets Allow archiving of items: certain items (like general store items or healing potions) will likely show up in many shops across your world.&nbsp; It would be nice if there was a way to archive an item so you didn't have to re-enter it every time.
Michael, awesome! Thanks! I'll be back tomorrow, then I'll give it a try and merge it in. Guess we should update the README as well before we push it out?
1536451208

Edited 1536501003
GM Michael
API Scripter
EDIT: completely rewrote this post for clarity. Yeah, readme needs to be updated. &nbsp; Done. I hadn't actually done all the shops in my campaign when I made the original commit. When I finally did, I noticed a few things:&nbsp; It's enormously frustrating to have complete sentences in descriptions with commas disallowed so I updated the subcommand parser.&nbsp; It now prefers carets to commas as delimiters.&nbsp; The GUI buttons have all been updated to use this now, but it won't break any legacy macros someone has set up. A lot of items are really similar so I added a Duplicate button. Some items come in a lot of configurations (e.g. Spell Scrolls) that need a better display format. I'm not sure how to handle this because previous experience suggests bulleted lists in the UI aren't possible.&nbsp; Maybe I'm doing it wrong somehow..&nbsp; Similar items need a way to be grouped together.&nbsp; I suppose a named but otherwise empty item could be sorta used as a header (especially if caps locked), but that seems hacky.&nbsp; I'm open to ideas. On some of the larger shops, searching for something rapidly becomes cumbersome.&nbsp; I feel like we need searching or a collapsed view...&nbsp; If we were to add an item archive, it would definitely need it.
1536502750

Edited 1536503501
Arthur B
API Scripter
Wow. I've been playing around with this now for a while. This is so much fun now. I merged your branch into my repo and released a new version, v0.9.0. Edit: Just read your post update. Grouping sounds like a good idea. Not sure how we can do this, either. Maybe have some tag in the description that is used for sorting/grouping? And for the larger shops: When we have some grouping functionality, it might not be so difficult to find your stuff. Collapsing or filtering would definitely help, though… Edit2: &nbsp;I also started a PR for the roll20 repo, so it should be available via one-click soon.
1536507265

Edited 1536507291
GM Michael
API Scripter
I just issued another PR, adding a verbosity setting for shops and an update to what triggers refreshes of the shop (so multiple people buying things doesn't flood everyone's chat).
1536508572

Edited 1536509021
Arthur B
API Scripter
Looks great. I just added it and published v0.9.1 . It'll sneak into the PR I sent to the roll20 repo as well.
1536957125

Edited 1536957162
GM Michael
API Scripter
I got bored on my day off... (In case it's not readily apparent from the pic, I started Shaped Sheet support.)
1537023513

Edited 1537026842
GM Michael
API Scripter
Created a pull request from my branch to Arthur's.&nbsp; Should add basic support back to the 5e shaped script.&nbsp; Unless I missed something, Shaped should have all the features that OGL does except for automatic item additions as I haven't figured out how to do that just yet.
1537023753
Kryx
Pro
Sheet Author
API Scripter
Michael G. said: Created a pull request.&nbsp; Should add basic support back to the 5e shaped script. Hey, thanks for adding support for Shaped. What are "automatic item additions"? I can possible provide some guidance if I understand the desired behavior.
1537026155

Edited 1537026934
GM Michael
API Scripter
Right now, for OGL, if you purchase an item through a shop, it'll automatically stick it in your inventory. OGL is doable because all items get stuck in the repeating inventory and therefore have the same fields.&nbsp; In Shaped, they're split up into equipment, armor, offense, ammo, and utility.&nbsp; Correspondingly, I'd need to let the user specify which item type they wanted and then prepare data formats for each of those (not hard, just time consuming and I'm on a mini-vacation).&nbsp; I'd also need to know the section names and suffixes for all the fields to be able to create/update them, but I haven't done the investigation yet to figure out what those are.
1537027548
Kryx
Pro
Sheet Author
API Scripter
All item data has type called&nbsp;item_type_from_srd. I've attached my logic below: if ([ 'Melee Weapon' , 'Ranged Weapon' , ]. includes (data. item_type_from_srd )) { processData. section = exists (data. is_npc ) ? 'action' : 'offense' ; } else if ([ 'Ammunition' ]. includes (data. item_type_from_srd )) { processData. section = 'ammo' ; } else if ([ 'Light Armor' , 'Medium Armor' , 'Heavy Armor' , 'Shield' , ]. includes (data. item_type_from_srd )) { processData. section = 'armor' ; } else if ([ 'Potion' , 'Wand' , ]. includes (data. item_type_from_srd ) || exists (data. damage ) || [ 'antitoxin' , 'ball bearings' , 'caltrops' , 'healer’s kit' , 'holy water' , ]. includes (data. name_from_srd . toLowerCase ())) { processData. section = 'utility' ; } else { processData. section = 'equipment' ; }
1537029958
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
This makes me very happy. Thanks Michael G and Kryx!
1537055247

Edited 1537057219
GM Michael
API Scripter
Kryx said: All item data has type called&nbsp;item_type_from_srd. I've attached my logic below: // snip Got some questions... Is there some combined data object where you store all the SRD data and is that accessible for additional data?&nbsp; I see that you have ShapedSheet.addEntities(...), but that only looks to cover armor.&nbsp; Where are all the other items?&nbsp; Is there a way that I, in another script, can access all the added entities? Can I assume that users of the shaped sheet script have created attachments that have all the data they want? What are all the fields for non-armor items?&nbsp; Is there a comprehensive list somewhere or do I need to go inspect all the character sheet fields and pull out a crystal ball as I guess what they're called? So after attempting an item lookup, it looks &nbsp;like... Armor: not a concern, assuming there's no more fields than what gets stuck in ShapedSheet.addEntities(). Ammo No clue what goes here :( Equipment name type weight weight_system weight_total toggle_details content roll_formula uses Offense: there are so many of these, I'm not going to try typing them out...&nbsp; Here's the output on a search-all after I converted all the results to json... Line 651: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_name", Line 659: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_attack_toggle", Line 667: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_roll_formula", Line 675: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_attack_ability", Line 683: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_attack_damage_formula", Line 691: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_attack_damage_ability", Line 699: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_attack_string", Line 707: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_attack_formula", Line 715: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_to_hit", Line 723: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_attack_damage_string", Line 731: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_attack_damage_average", Line 739: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_weight_system", Line 747: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_weight_total", Line 755: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_attack_damage_die", Line 763: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_attack_damage_type", Line 771: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_attack_second_damage_condition", Line 779: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_attack_second_damage_average", Line 787: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_attack_second_damage_bonus", Line 795: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_attack_second_damage_formula", Line 803: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_attack_second_damage_die", Line 811: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_attack_second_damage_type", Line 819: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_toggle_details", Line 827: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_proficiency", Line 835: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_reach", Line 843: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_attack_damage_bonus", Line 851: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_attack_bonus", Line 859: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_weight", Line 867: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_weight_per_use", Line 875: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_saving_throw_toggle", Line 883: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_saving_throw_dc", Line 891: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_saving_throw_damage_formula", Line 899: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_saving_throw_damage_string", Line 907: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_saving_throw_damage_average", Line 915: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_saving_throw_ability", Line 923: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_attack_second_damage_ability", Line 931: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_saving_throw_bonus", Line 939: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_saving_throw_damage_dice", Line 947: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_saving_throw_damage_die", Line 955: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_saving_throw_damage_ability", Line 963: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_saving_throw_damage_type", Line 971: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_saving_throw_second_damage_condition", Line 979: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_saving_throw_second_damage_average", Line 987: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_saving_throw_second_damage_die", Line 995: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_saving_throw_second_damage_ability", Line 1003: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_saving_throw_second_damage_formula", Line 1011: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_saving_throw_second_damage_bonus", Line 1019: "name": "repeating_offense_-LMN6J-GkNktiwVlHfdI_saving_throw_second_damage_type", Utility Line 1027: "name": "repeating_utility_-LMUUoHXqT-FzMvLae8F_name", Line 1035: "name": "repeating_utility_-LMUUoHXqT-FzMvLae8F_weight_system", Line 1043: "name": "repeating_utility_-LMUUoHXqT-FzMvLae8F_weight_total", Line 1051: "name": "repeating_utility_-LMUUoHXqT-FzMvLae8F_uses", Line 1059: "name": "repeating_utility_-LMUUoHXqT-FzMvLae8F_roll_formula", Line 1060: "current": "{{uses=@{uses}}} {{repeating_item=repeating_utility_-lmuuohxqt-fzmvlae8f}} {{heal=[[2[bonus]]]}}", Line 1067: "name": "repeating_utility_-LMUUoHXqT-FzMvLae8F_type", Line 1075: "name": "repeating_utility_-LMUUoHXqT-FzMvLae8F_heal_toggle", Line 1083: "name": "repeating_utility_-LMUUoHXqT-FzMvLae8F_heal_die", Line 1091: "name": "repeating_utility_-LMUUoHXqT-FzMvLae8F_heal_bonus", Line 1099: "name": "repeating_utility_-LMUUoHXqT-FzMvLae8F_weight", Line 1107: "name": "repeating_utility_-LMUUoHXqT-FzMvLae8F_toggle_details", all of this is going to be a ton of work...&nbsp; Unless you have some import mechanism for items, I don't think I see myself getting around to it.&nbsp; Even on OGL, I didn't actually populate the attack and resource fields, leaving that up to the player...