Hey, lark... you're pretty close. You're going to need to make 3 small changes, though. Explanation (Feel free to skip) 1. When you use a sheet-call (like retrieving an ability from your -J- character), that will expand immediately, and will add the associated verbiage (and line-breaks) to your command. That will happen before the message is handed to the scripts, so by the time forselected sees the message, the command line is actually *several* command lines... and it will only get the first. For that reason you'll want to defer the resolution of the ability retrieval by using forselected's deferral syntax. !forselected(^) You can actually pick any character, it just has to be a character that ONLY appears where you want it to be removed when forselected dispatches the outbound message... like this: %^{-J-|add-trunk-DL} 2. Also, when forselected dispatches the outbound message, it waits to receive the returned message object from Roll20 (which will have no selected token, since it was a message sent from a mod script), and it gives to that message object the next selected token in the queue. In the case of a multi-line outbound message, forselected will only be able to do that to the first line -- subsequent lines will spawn new messages to which forselected will have no visibility. To get around that, you'll want to make sure you have ZeroFrame installed, too, and then you can use ZeroFrame's batching construction to turn all of those separate commands into a single message. (ZeroFrame will dispatch them independently, but IT will then handle handing off the token it received from forselected as the selected token of each independent message.) 3. One peculiarity of the Walls script is that it collects information over several command lines to build the wall. If we start sending lines for wall 2 while wall 1 is still building/collecting, we'll run into a problem. So to get around that, we're going to use a ZeroFrame {&delay} tag in the forselected line to make sure one set of wall instructions have a chance to clear before we send the next. One second should do it, but you can adjust depending on the speed of your game. The delay tag will, itself, need to be deferred so that it isn't detected until the message coming out of forselected: {^& delay 1} I know. It's weedy down in the weeds. Solution (TL;DR) Change your add-trunk-DL ability to read like this: !{{ !walls begin !walls viewbox 400 400 !walls strokecolor #00ff00 !walls fillcolor transparent !walls strokewidth 5 !walls moveto 200.00 175.00 !walls curveto 233.45 175.00 233.36 225.00 200.00 225.00 !walls curveto 166.64 225.00 166.55 175.00 200.00 175.00 !walls lineto 200.00 175.00 !walls end }} And change your triggering command to read like this: !forselected(^) %^{-J-|add-trunk-DL} {^&delay 1}