Hey Tim, So first. This is absolutely amazing. That looks beautiful and magical. Far better than I imagined (which was pretty much me attaching something to wheel with the numbers on it so it stuck out farther and it would line up with the box you click on to rotate. That was my original plan! Secondly, you're right. I forgot to scan the other piece and now I'll have to photoshop the numbers in their correct spots as I no longer have the scanner (that'll be simple though). Reducing the space around the images will also be quick and painless for me as well. Now the though stuff. So, I created a screen in the game, named it token. Dropped all the tokens shown above (minus the one wheel). Named the two mentioned for the Sentry Guns as you did, then copy/pasted to the screen that i'll be placing all the board pieces onto and then thats it. Prior to loading the game I had click the API Scripts > Found both TokenMod & SelectManger (the rest you mentioned didn't appear in the list of Roll20 API Script Library) I loaded them, but going into the game itself, I do not receive any of the boxes you have in your image, nor can I find anywhere in the options to the right of accessing the API's sooooo, I'm going to assume I'm missing something extremely important and likely skipping something. I have been trying to find a Roll20 API for Dummy's but I haven't had much luck for that. If this ends up being too much trouble of going back and forth trying to figure things out I'm okay with doing the spin the image till the actual game is over and then I can invest more time in learning API and how to setup these things properly. I absolutely do not want to be a pain in the ass the first time I attempt to use API's in my games! :D Hell I still have to upload all the cards and load each deck as well! lol. And I thought when I first planned this it was going to be simple. lol timmaugh said: Here is a proof of concept of the thing working (details follow below): I followed the steps above for the most part, naming the HUD "SentryHUD", and the right dial "SentryBDial". I didn't utilize the left dial because I think you uploaded the same dial twice (the right hand dial) instead of the one for the left. The left side should have the numbers reversed so that the right-side-up numbers are on the right (to fit through the aperture). But you can just expand on these steps to get that dial tied in and connected. Image Prep The HUD isn't cropped quite right... it had blank space above and below that was counting in the math of sizing/spacing and throwing off the way the tokens placed themselves. If you crop it right at the edge of the HUD overlay graphic and keep the wheels at half the width of the HUD, I think this will all line up better. As it is, you can see the dial doesn't *exactly* sit in the window, and you can see the dial around the edge of the HUD. But this can be corrected by trimming the images properly. Token Setup Name the tokens as mentioned. For SentryBDial, I put the maximum number of rounds it could hold in bar1 current (500) and the rounds remaining in bar3 (500). I didn't do current/max for a single bar because that would generate a colored bar over the token and ruin the effect of the floating HUD. In bar2 I put the rotation required to get the 000/500 position of the dial to line up in the window (121.5). You can play with that using a token-mod line like this: !token-mod --set rotation|120 Select SentryADial and run that line, changing the 120 until you get a rotation that has 000 to the right. Put that number in SentryADial's bar2 current. Required Scripts You'll need TokenMod, ZeroFrame, and Fetch for the handling of the interface. If you utilize the IF logic for the sentry fire messages ("Sentry B fires 25 rounds..."), then you'll want APILogic, too. TokenMod is available from the one-click. The rest you'll have to get from my repo. This thread links to all of the sub-threads, which has links for them all. TokenMod will require that you enable players to use the --ids argument, so run this line from chat once it is installed: !token-mod --config players-can-ids You will be also need a small custom event listener to handle coordinating the move of the dials and the HUD. Install this into another tab in your script order, give it a name that makes sense, and change the token id in the code to be the token ID of your HUD token, once you've added that token to your game: // snippet to catch HUD moves on('change:graphic', (obj, prev) => { if (obj.id === '-MZxSB5CpRitlX7jjkck') { let alignmacro = findObjs({type: 'macro',name:'AlignSentryDials'})[0]; sendChat('API', alignmacro.get('action')); } }); NOTE -- This is a band-aid to get you through your game; I would not release something coded specifically to your game or requiring you to edit the code yourself except that your time is short and I spent my time on the interface/action. Macro Setup I had three macros to animate this. AlignSentryDials : Checks the position and rotation of the SentryBDial token (location based on the HUD's location and rotation based on the values of bar1, bar2, and bar3). Once you get the right image for SentryADial and get that token in and set up, you will have to add the mirror lines for handling its position and rotation. !token-mod {{ --ignore-selected --ids @(SentryBDial.token_id) --set rotation|=[\][\]@(SentryBDial.bar2)+(@(SentryBDial.bar1)-@(SentryBDial.bar3))*360/@(SentryBDial.bar1)\]\] width|[\][\]@(SentryHUD.width)/2\]\] height|[\][\]@(SentryHUD.height)\]\] top|@(SentryHUD.top) left|[\][\]@(SentryHUD.left)+@(SentryBDial.width)/2\]\] }} FireSentryB : This was a simple token-mod call to decrement the SentryB ammunition. I hard-coded it to 25, but you could query for the number and enter it ad hoc. It also uses APILogic to craft a custom message depending on the current state of the ammunition for SentryBDial. After firing, it runs the AlignSentryDials macro. !{&if @(SentryBDial.bar3)>25}SentryB Fires 25 rounds...{&elseif @(SentryBDial.bar3)>0}SentryB fires @(SentryBDial.bar3) rounds and is empty.{&else}SentryB is out of ammunition{&end}{&simple} !token-mod {{ --ignore-selected --ids @(SentryBDial.token_id) --set bar3|[\][\]{0,@(SentryBDial.bar3)-25}kh1\]\] bar3_max| }} !#(AlignSentryDials) ReloadSentryB : Another simple token-mod call to reset the ammunition supply of SentryBDial; queries for how many rounds it should have. It, too, runs the AlignSentryDials macro to properly rotate the dials. !token-mod {{ --ignore-selected --ids @(SentryBDial.token_id) --set bar3|?{Rounds to load|500} bar3_max| }} !#(AlignSentryDials) What's Left These macros are heavy with meta-script interactions, so if you have any questions about what some of the syntax means as you look to mirror the effect for SentryA, post back and I'll try to explain what each part does. SentryA will require a "FireSentryA" macro, a "ReloadSentryA" macro, and it will need to be added to the "AlignSentryDials" macro to be nudged appropriately when the HUD is moved. You might also want a "FireBothSentries" macro that would trigger them firing, decrement their individual counts, and then call the Align macro one time. Hopefully this gets you where you wanted to go!