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] DynamicLightRecorder

1455909751

Edited 1476873385
Lucian
Pro
API Scripter
Script to bind default Dynamic Lighting paths to map tiles This is a script connects dynamic lighting paths with map graphics, so that you can move your map components around without having to worry about manually re-drawing the dynamic lighting paths. Main Features Save dynamic lighting paths for particular map graphics/tiles Automatically redraws the DL paths whenever an instance of a linked graphic is dropped on the canvas Moves linked DL paths with a graphic whenever the graphic is moved, rotated, flipped or scaled Manages user-controllable doors with associated DL paths. Users can rotate doors to see them open. Can export/import DL path definitions to allow sharing with other users Transmogrifier safe More details including full usage information is in the README on GitHub. Github link <a href="https://github.com/Roll20/roll20-api-scripts/tree/master/DynamicLightRecorder" rel="nofollow">https://github.com/Roll20/roll20-api-scripts/tree/master/DynamicLightRecorder</a> Version History Version 1.0.1 Various minor bugfixes. Version 1.0 Major upgrade and internal refactor. Script now supports "local templates" for individual tiles and rotation limits for doors. Also now transmogrifier safe. Version 0.9 Minor bugfix to the selective export functionality Version 0.8: Only a minor functional change - added the ability to selectively wipe templates for individual tiles by selecting them before running !dl-wipe. Underneath the covers, I've completely restructured the code to make it a bit neater and more flexible. It also makes less use of the state object, which is the first step on the way to Transmogrifier compatibility and "detached tiles" that maintain their DL paths without being connected to a generic template for that image. Version 0.7: You can now export a limited set of templates based on your selection. Also there's a fancy-pants logging/tracing framework now, but that's not really interesting to end users (until sh*t goes wrong and it helps me fix it!) Version 0.6: &nbsp;New !dl-directDoor command for use with tokens that already pivot properly so that you can use the token itself as the control for a slightly smarter-looking effect. Version 0.5: &nbsp;Now with a simple redraw command to update existing tiles after you edit the master paths for a tile. Version 0.4: it now has import/export so you can share your carefully drawn light-blocking paths with other Roll20 users. Attention all Marketplace artists! Now you can supply DL paths with tiles that you sell on the marketplace! Version 0.3:&nbsp; now also supports making light-blocking doors with handles to help open them by rotating around the hinge. See the README for more details. Lucian
1455910043
The Aaron
Pro
API Scripter
(The secret to Scriptomancy is the right kind of&nbsp; lazy ! =D)
1455987171
Lucian
Pro
API Scripter
The Aaron said: (The secret to Scriptomancy is the right kind of&nbsp; lazy ! =D) Yeah, Larry Wall rocks even if Perl is the devil's own programming language. I mean, 'elsif'? WTF? Also, it's been a long time since I've read the c2 wiki... I spent a long time on there 10 years ago when I first discovered XP (the other sort) and Agile etc. It has one of my favourite things on the internet: <a href="http://c2.com/cgi/wiki?VeryGoodSeats" rel="nofollow">http://c2.com/cgi/wiki?VeryGoodSeats</a>. Anyway, back to relevant matters, I have updated the script and it now supports doors in roughly the way I think you guys were suggesting. Would be great if you could take a look and provide any feedback/suggestions!&nbsp;
1455989878
Lucian
Pro
API Scripter
Two things I've already noticed: There's a slight miscalculation of where to draw the light-blocking for doors when they aren't exactly vertical or horizontal. So far I've only seen it skew the line by a couple of pixels each way, but it may conceal a more substantial bug somewhere I think I need to provide a more customisable approach for doors. Looking at my library, I've got a bunch of tokens that are pre-designed to be "pivotable" - i.e. the door is drawn in one side of the graphic so rotating it rotates the door around its hinge. It should be simple enough to provide a customisation to support that. Initially I will just provide an option to let you specify that the door graphic is pivotable so it will rotate it around the centre rather than the end of the graphic. Later on I'm thinking maybe that you could draw a rectangular path around the door itself, and select that along with the graphic when calling !dl-door - then the script can work out how best to rotate the image. Lucian
1456004410
Lucian
Pro
API Scripter
New version 0.4 supports Import/Export. Not in SVG for the moment (too lazy!) but it wouldn't be that hard to add in the future. See the GitHub page for more details.
1456008205
Lucian
Pro
API Scripter
Version 0.5: Now with a simple redraw command to update existing tiles after you edit the master paths for a tile.
1456023581
The Aaron
Pro
API Scripter
Wowsa! That's a bundle of activity!! Going to take a look tomorrow... Prepping for session 1 of s new game is sucking up my weekend!?!?
1456179079
Lucian
Pro
API Scripter
Version 0.6: New !dl-directDoor command for use with tokens that already pivot properly so that you can use the token itself as the control for a slightly smarter-looking effect.
1456236172
Lucian
Pro
API Scripter
Version 0.7: You can now export a limited set of templates based on your selection. Also there's a fancy-pants logging/tracing framework now, but that's not really interesting to end users (until sh*t goes wrong and it helps me fix it!)
1456239032
The Aaron
Pro
API Scripter
gonna look at that.. =D
Wait? Iv not had a chance to do this, but do the templates FOLLOW the Tile? Could I say... Makeshift this to work for objects like doors and walls etc?
1456254110
Lucian
Pro
API Scripter
Saevar L. "Liquid-Sonic" said: Wait? Iv not had a chance to do this, but do the templates FOLLOW the Tile? Could I say... Makeshift this to work for objects like doors and walls etc? Yes, that's the idea, the DL paths that you defined are flipped/scaled/rotated/translated to match whatever you do with the token. The only constraint is that the tokens it works with sit on the map layer. So if you have a tile that is a wall, there's no reason why you can't use this system for it - just draw the appropriate dL paths for it and it will work.&nbsp; For doors, I've added specific functionality to support them so that either the door or a transparent control token can exist on the objects layer. If you grant the players control over the token, they will be able to open and close it by rotating the control token. This will update the DL paths for the door as well, so they can crack the door open a fraction if they want to! I hope that the script is fairly generic - I imagine it could be used for a variety of things beyond how I originally conceived of it! Let me know how you get on! Cheers, Lucian
1456352650
Lucian
Pro
API Scripter
Version 0.8: Only a minor functional change - added the ability to selectively wipe templates for individual tiles by selecting them before running !dl-wipe. Underneath the covers, I've completely restructured the code to make it a bit neater and more flexible. It also makes less use of the state object, which is the first step on the way to Transmogrifier compatibility and "detached tiles" that maintain their DL paths without being connected to a generic template for that image.
1456691769
Lucian
Pro
API Scripter
Version 1.0 &nbsp;Massive refactor and several new features added: Local templates - you can create a local template for an individual tile to override the global path definitions for it. Various commands for detaching global templates and wiping local ones etc. Works with doors as well as map tiles Transmogrifier compatibility. All the door relationships are defined on the tokens now, so they translate over correctly. Paths can be fixed up after transmogrification with a special '!dl-tmFixup'&nbsp;command. Tested and ironed out various bugs with the transmogrification process. Door angle control. You can now define the maximum rotation angles for doors to limit how far the players can rotate them. Allows for one-way doors, doors that only open a little crack, etc, etc. I've basically added all the major features that I intend to for the moment, and I think the script is pretty much ready for use, so check it out! I'm sure there are probably bugs still, let me know if you find stuff that isn't mentioned at the bottom of the README and I'll get them fixed. Cheers!
1456742026
Ziechael
Forum Champion
Sheet Author
API Scripter
I have been watching this with great interest as I have dastardly plans for my players that involves redrawing DL on the fly, exactly what this could help with... my question however is this: Would this work with a rollable table of tiles, ie: would changing to a new side trigger the DL lines to be drawn to reflect the new tile shown? Can you tell i've waited until your initial 'major features' rollout is complete before asking ;)
1456744315
Lucian
Pro
API Scripter
Ziechael said: I have been watching this with great interest as I have dastardly plans for my players that involves redrawing DL on the fly, exactly what this could help with... my question however is this: Would this work with a rollable table of tiles, ie: would changing to a new side trigger the DL lines to be drawn to reflect the new tile shown? Hmm, that sounds... Dastardly! I haven't tested it with multi-sided tiles, but it shouldn't be hard to make it work. Out of interest, could you be more specific about what the different tiles in the table are? I'm just wondering if there's a better way to handle it. For example, if the different sides represent different configurations of objects within a room, there might be an argument for placing the objects as individual graphics, defining DL paths for each one, and then having a way to script re-positioning the objects in the room. I could, for example, extend the script to allow you to record named configurations of objects, and then run something like: !dl-moveObjects --position beforeExplosion !dl-moveObjects --position afterExplosion The existing functionality of the script would then redraw the DL paths appropriately. On the other hand, if you've got some dastardly magic/infernal machinery that is totally reconfiguring the space/teleporting the players silently/etc then perhaps the rollable tables thing is the best way to handle it. Final question: are you intending to trigger the rollable table thing from the API (e.g. TokenMod) or are you doing it manually? Some work will be required for the former, possibly including getting Aaron to extend his script to allow listeners, because changes by the API don't (normally) get propagated to other scripts automatically. Cheers,
1456747621

Edited 1456747688
Ziechael
Forum Champion
Sheet Author
API Scripter
My plan is to have a set of tiles (likely 4x4 or 5x5) with a variety of configurations, ie: 90 degree corner, t-junction, corridor, dead end, small room, cross-roads etc etc all with set entry/exit points so that they can work in almost any configuration or rotation. The ultimate aim is to have a maze that changes it's configuration every few rounds (hence the need to have something that would update the DL depending on the tile shown). There won't be any 'features' that i'm bothered about having DL on, just the walls of the tiles. I doubt i'll even bother with doors. I was thinking of having a token action on the table tile to allow for 1-click random side/rotation angle but i'm not going to bother if it is extra work, you guys already do so much for little ;) Slumming it with a 'right-click&gt;select side&gt;random side' isn't a massive effort for me lol.
1456773141
Lucian
Pro
API Scripter
Ziechael said: My plan is to have a set of tiles (likely 4x4 or 5x5) with a variety of configurations, ie: 90 degree corner, t-junction, corridor, dead end, small room, cross-roads etc etc all with set entry/exit points so that they can work in almost any configuration or rotation. The ultimate aim is to have a maze that changes it's configuration every few rounds (hence the need to have something that would update the DL depending on the tile shown). There won't be any 'features' that i'm bothered about having DL on, just the walls of the tiles. I doubt i'll even bother with doors. Amazing news. It JUST WORKS!. Probably I will be run over by a bus tomorrow, because that sh*t never happens :-) Drop the tiles for the individual sides onto the canvas and define the DL paths for them as normal. Then create your rollable table by dragging the graphics out of your library. As you change the sides of the token, the DL paths update automatically. The only possible problem is that it's not fantastically fast (highly dependent on your network connection and the load of the API server). I'm not sure how much of this I can fix by optimising the script - it may be mainly network/server latency, in which case you'll just have to live with a lag between switching sides and the DL paths updating... I was thinking of having a token action on the table tile to allow for 1-click random side/rotation angle but i'm not going to bother if it is extra work, you guys already do so much for little ;) Slumming it with a 'right-click&gt;select side&gt;random side' isn't a massive effort for me lol. It's probably not that much effort, TBH. When I come back to this in a couple of days I'll PM Aaron and ask him about putting a listener hook into TokenMod. Knowing him, he'll probably have already done it before I ask! :-) Cheers, Lucian
1456778269
Ziechael
Forum Champion
Sheet Author
API Scripter
That's great news :) Thanks for taking a look... I'll have to have a play and see how it goes but the time thing isn't a massive issue for me so i'm optimistic indeed now!!
1456789388
Lucian
Pro
API Scripter
NB: &nbsp;Github link updated (had to move everything onto a branch to be able to submit my changes to Roll20)!
1456819973
Lucian
Pro
API Scripter
And again. The script is now in the Roll20 repository, so I've updated the link to point there.
1456845468
Ziechael
Forum Champion
Sheet Author
API Scripter
Ok tested with a 4-tile table and it works amazingly well. So quick and simple to set up and the 'lag' between DL update was imperceptible to my eyes! This will revolutionise the mind games I play with my players. You have my thanks, admiration and respect =D
1456853289
Ziechael
Forum Champion
Sheet Author
API Scripter
Hmm, made my own tiles, set the DL and made them into a table... however the script doesn't recognise them and apply the DL, is that due to them being in my library as opposed to a universal url like the marketplace?
1456854464
Lucian
Pro
API Scripter
Ziechael said: Hmm, made my own tiles, set the DL and made them into a table... however the script doesn't recognise them and apply the DL, is that due to them being in my library as opposed to a universal url like the marketplace? Arg. I hadn't realised that you couldn't drag from your library to the rollable table image drop target. As a result I guess you are uploading the image again from your local machine when you make the rollable table? If so it will get stored under a different URL so it won't work. All is not lost, however. What we need to do is to make/find a simple script that will set the rollable table item avatar URL to be the same as the one in your library for which you defined the DL paths. Then it will work fine. Does anyone know if there is already a script for generating sided tokens from images on the canvas? There ought to be one really....
1456860976
The Aaron
Pro
API Scripter
I'm not aware of one, but provided the urls are in the user library, it should work fine. &nbsp;You can create rollable tables from from your library, but you must drag from the search results in the library tab, not the popup library listing.
1456862415
Lucian
Pro
API Scripter
Ah. Hadn't thought of that. Anyway, here's something to make it easier: var rollableTableMaker = rollableTableMaker || (function() { &nbsp; &nbsp; 'use strict'; &nbsp; &nbsp; var version = '0.1', &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; checkInstall = function() { &nbsp; &nbsp; &nbsp; &nbsp; log('Rollable Table Maker v'+version+' is ready!'); &nbsp; &nbsp; }, &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; handleInput = function(msg) { &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (msg.type !== "api") { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var args = msg.content.split(/\s+--/); &nbsp; &nbsp; &nbsp; &nbsp; switch(args.shift()) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case '!rtmake': &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(!msg.selected || msg.selected.length === 0) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; report('You must select some graphics to use for your table'); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var nameArg = args.shift(); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!nameArg) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; report('You must specify the --name parameter'); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; nameArg = nameArg.split(/\s+/); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (nameArg[0] !== 'name') { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; report('You must specify the --name parameter'); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else if(nameArg.length &lt; 2) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; report('You must supply a name with the --name parameter'); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else if (nameArg.length !== 2) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; report('Name must not have spaces in'); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log(nameArg); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var table = createObj('rollabletable', {name:nameArg[1], showplayers:false}); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log(table); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var count = 0; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _.each(msg.selected, function(selected, index) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log(index); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var graphic = getObj('graphic', selected._id); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log(graphic); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var attrs = { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; avatar:graphic.get('imgsrc'),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; name:'side' + index,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rollabletableid:table.id &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log(attrs); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var tableItem = createObj('tableitem', attrs); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log(tableItem); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tableItem && count++; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; report ('Created rollable table ' + nameArg[1] + ' with ' + count + ' entries.'); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; }, &nbsp; &nbsp; report = function(msg) { &nbsp; &nbsp; &nbsp; &nbsp; sendChat('Rollable Table Maker', '/w gm ' + msg); &nbsp; &nbsp; }, &nbsp; &nbsp; registerEventHandlers = function() { &nbsp; &nbsp; &nbsp; &nbsp; on('chat:message', handleInput); &nbsp; &nbsp; }; &nbsp; &nbsp; return { &nbsp; &nbsp; &nbsp; &nbsp; CheckInstall: checkInstall, &nbsp; &nbsp; &nbsp; &nbsp; RegisterEventHandlers: registerEventHandlers &nbsp; &nbsp; }; }()); on('ready',function() { &nbsp; &nbsp; 'use strict'; &nbsp; &nbsp; rollableTableMaker.CheckInstall(); &nbsp; &nbsp; rollableTableMaker.RegisterEventHandlers(); }); Select all the graphics that you want to be part of your table, then run !rtmake --name &lt;tablename&gt; It will make the table for you with the right image urls. I tested and it works fine with the DynamicLightRecorder. Cheers, Lucian
1456863233
Ziechael
Forum Champion
Sheet Author
API Scripter
I did it from the tab... however I wonder if it might be the ones i saved the DL for that are wrong... i accidentally dragged them onto the objects layer first, resized and moved to map layer before recording the DL, that might have given the base image a different url? Then when i added them to the table it used the proper url and failed to match it to the saved DL? Will test by performing a wipe and recording the DL again by dragging them straight to the map layer, see if that helps
1456863445
The Aaron
Pro
API Scripter
If imgsrc is from the marketplace, the above will generate a table item with no image. &nbsp;You can use this function&nbsp;&nbsp; <a href="https://wiki.roll20.net/API:Cookbook#getCleanImgsr" rel="nofollow">https://wiki.roll20.net/API:Cookbook#getCleanImgsr</a>... to detect if the image is in the marketplace or not.
1456863740
Ziechael
Forum Champion
Sheet Author
API Scripter
It was as i suspected. Adding the tiles straight to the map layer, resizing and DL linking there did the trick.. tested on a couple of my tiles and it worked. I'll have to do the others when i have time (game night in 10 mins!) but it is so quick and easy to do with this script that my school boy error is but a minor irritation! Sorry for the extra work it has caused but I can confirm that i can use my own tiles without issue now :)
1456930960
Ziechael
Forum Champion
Sheet Author
API Scripter
Got a 26 tile table of 'map bits' set up and working with recorded DL now :) I threw them together in like 10 minutes so the floor doesn't match up as i'd like from tile to tile but it is good enough for a concept piece (no doubt i'll redo the whole thing again before needing it in game lol). The update delay is barely noticeable, certainly not by a human eye, the rotation works beautifully too. Great script... and i'm totally going to be using that rollable table maker too!!
1456931407
Lucian
Pro
API Scripter
Cool, glad it's working out for you! A couple of points to note: The rollable table maker was a 10 minute throw-together. As Aaron points out, it will only work for graphics that were in your library. AFAICT there's no way to make it work for marketplace images - you'll have to make tables that include those by hand, I'm afraid. Now that you're starting to invest some time in this, please take heed of what I said in the README about backups. The global template definitions are stored in the API state for your campaign, and it is not impossible for this to get corrupted and reset (I've seen it happen once myself). For peace of mind, please run the export command once in a while and save the JSON that gets spat out in the chat window to a file somewhere. Then at least if everything goes wrong you can re-import it and you won't have lost your work!
1456935885
Ziechael
Forum Champion
Sheet Author
API Scripter
Duly noted, all my tiles are likely to be custom made and uploaded so no worries about the table maker so still a handy script, will even come in handy for doppelgangers, hats of disguise and other tricky beasts (i use all my own custom tokens too). Thanks for the warning about corruption, i'll admit i glossed over that in the readme in favour of devouring the commands that allowed me to play around with the script immediately (typical man, not reading the instructions... am i right!). Since i'm likely to redo my current tiles to make them 'tile' better i'll leave it for now but will certainly do an export afterwards... who knows if my tiles work out right i might even see about getting them on the marketplace and sharing the exported DL info =D