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

[Help] Need direction

I'm just starting my adventure into JavaScript just for the API. I have no coding background and I'm not even sure what's possible to do with this. So far, I have done just enough Code Academy and learning by example to splice together pieces of scripts to get a token to move in one direction when triggered by a chat event with a variable to select which token moves. You might recognize parts of this as something of yours- once beautiful, now tortured and defiled to suit my purposes. on("chat:message", function(msg) {   if(msg.type == "api" && msg.content.indexOf("!entr ") !== -1) {       var charName = msg.content.replace("!entr ", "");    var patroltoken = findObjs({_type: "graphic", name: charName})[0];    sendChat(msg.type = " ", "/em" + " " + charName + " " + "enters the arena.");    if(!patroltoken) {        return;     }    var direction = 70;     var stepstaken = 0;    setInterval(function() {      if(stepstaken === 10) {          return;      }      patroltoken.set("top", patroltoken.get("top") + direction);      stepstaken++;    }, 1500); }}); What I need next is to figure out how to add the variable token from the journal page to a specific location on the table, add a pause, and then run what I already have. Later on, I'll need to figure out how to delete the token from the table. I tried jamming a getObj helper function in there to see if it would work, but I'm not sure if that's what I need to do. I'm not asking for written code, just where to look next. Once I have this knowledge under my belt, I think I'll be able to finish my entrance animations without many problems and I can go back to being as terrible at everything else as I am at this.  Thanks, Melvin McSnatch
1367904107
Alex L.
Pro
Sheet Author
You cant currently create tokens (add them to the table) at the moment if that's what you mean.
That is what I mean. I suppose the characters are getting a locker room.  You can change the layer they're on though, right?
1367905422
Alex L.
Pro
Sheet Author
Melvin McSnatch said: That is what I mean. I suppose the characters are getting a locker room.  You can change the layer they're on though, right? Yes myToken.set("layer", something);
Thanks, I got it all working by moving it in between gmlayer and objects.. 
Ladies and Gentlemen, we have !pyro on("chat:message", function(msg) {   if(msg.type == "api" && msg.content.indexOf("!pyro") !== -1) {       var flame1l = findObjs({_type: "graphic", name: "flame1left"})[0];       var flame1r = findObjs({_type: "graphic", name: "Flame1Right"})[0];       var flame2l = findObjs({_type: "graphic", name: "flame2left"})[0];       var flame2r = findObjs({_type: "graphic", name: "flame2right"})[0];       var flame3l = findObjs({_type: "graphic", name: "flame3left"})[0];       var flame3r = findObjs({_type: "graphic", name: "flame3right"})[0];     var pyroOn = function(flamel,flamer,timer) {         setTimeout(function() {         flamel.set("layer", "objects");         flamer.set("layer", "objects");         }, timer);     };     var pyroOff = function(flamel,flamer,timer) {         setTimeout(function() {         flamel.set("layer", "gmlayer");         flamer.set("layer", "gmlayer");         }, timer);     };        pyroOn(flame1l,flame1r,0);            pyroOff(flame1l,flame1r,3000);        pyroOn(flame2l,flame2r,150);            pyroOff(flame2l,flame2r,2750);        pyroOn(flame3l,flame3r,300);            pyroOff(flame3l,flame3r,2500);           }}); Yeehaw. It's not pretty, but it's my recipe for a growing flame and easily expanded for more burns.
I'd be interested in a video of that in action if you get a chance :-)
It's going to get a lot more complicated before it's awesome. My co-DM is working on a new arena just for this. I'll get the pyro recorded soon.
A short video showing what I've done so far.  Video commentary is new to me, so I apologize for that.
Haha, that's awesome. I honestly never thought of using the API to do "animations" that quickly with the pryo like that -- honestly I'm slightly shocked it works. But I'm glad that it does :-) Keep up the great work!
Nice, I like it!
Is there anyway to trigger another script during a script? It would make combining these elements a lot easier. I tried doing a sendChat, but I don't think that works.
Just needs some triggered sound effects. :)
Melvin McSnatch said: Is there anyway to trigger another script during a script? It would make combining these elements a lot easier. I tried doing a sendChat, but I don't think that works. I recommend that once you are in the script, skip sending more messages and just make a function for each smaller action you want to perform. You already have a couple functions for turning the flames on and off. So you could do something like this: var pyro = function() { your code here}; on("chat:message", function(msg) { if(msg.type == "api" && msg.content.indexOf("!pyro") !== -1) { pyro(); } } Then anytime you need to make the pyro happen, you don't have to make a new chat command, but can just do "pyro();" in the code.
I must have botched my attempt at that earlier. I just figured you couldn't call a function from another script (if I'm saying that right).
I haven't actually tried from a different script, but it should technically be possible. You will have to be sure to define the function somewhere accessible. For example, your pyroOn and pyroOff functions aren't available all over the place because they are in the "scope" of the block of code started by:  on("chat:message", function(msg) { This means that anywhere outside that "block" can't call the function because it doesn't even know it exists. A handy way to make it so anything can find it would be to attach it to something global, but that also means your pyroOn function would need to gather its own tokens (flame1l, flame1r) because those are also in the other block. Edit: The fastest way to make pyroOn be accessible elsewhere would be to just move it outside the main chat message block.
Thanks! I had to delete the chat event bit from inside the pyro function to get it to work in other scripts, but it's great. Now I'm just having trouble getting the chat event working outside of the pyro function... Unexpected Identifier. I mean, pyro is global, there's no reason I shouldn't be able to call it.   Missing a parenthesis. 
Any reason this is triggered by any API chat message? on("chat:message", function(msg) {   if(msg.type == "api" && msg.content.indexOf("!entr1 ") !== -1) {     var wrestler = msg.content.replace("!entr1 ", "")};     walking(wrestler);     lights(100,0,0);     pyro(3000);     lights(100,100,3000);});
This line: var wrestler = msg.content.replace("!entr1 ", "")}; Has an extra } at the end, which is ending your if() statement early. So anything after that line is outside the if() statement. Should look like this: on("chat:message", function(msg) {   if(msg.type == "api" && msg.content.indexOf("!entr1 ") !== -1) {     var wrestler = msg.content.replace("!entr1 ", "");     walking(wrestler);     lights(100,0,0);     pyro(3000);     lights(100,100,3000);   } }); As a rule of thumb you should put your closing-bracket on the same indentation line as the if() part so you can clearly tell where it ends.
The editor actually shows you which ones are paired, but it's VERY difficult to see since the highlight is the same color as the line highlight.
Perhaps this is too ambitious for someone at my skill level, but I've changed the pyro function dramatically to be able to program a more complicated show. But it's not working. The specific error is "Unexpected token , " Below is my error message without checking for bad objects. bpos.set("height", size1);              ^ TypeError: Cannot call method 'set' of undefined     at null._onTimeout (evalmachine.<anonymous>:85:14)     at Timer.listOnTimeout [as ontimeout] (timers.js:110:15) var flame1 = findObjs({_type: "graphic", name: "flame1"})[0]; if(!flame1) {         log("object flame1 bad");        return;    }; var flame2 = findObjs({_type: "graphic", name: "flame2"})[0]; if(!flame2) {         log("object flame2 bad");        return;    }; var flame3 = findObjs({_type: "graphic", name: "flame3"})[0]; if(!flame3) {         log("object flame3 bad");        return;    }; var flame4 = findObjs({_type: "graphic", name: "flame4"})[0]; if(!flame4) {         log("object flame4 bad");        return;    }; var flame5 = findObjs({_type: "graphic", name: "flame5"})[0]; if(!flame5) {         log("object flame5 bad");        return;    }; var flame6 = findObjs({_type: "graphic", name: "flame6"})[0]; if(!flame6) {         log("object flame6 bad");        return;    }; var pyro = function(pos1,pos2,pos3,pos4,pos5,pos6,psize,pspeed,delay) {     log("Begin Pyro");     setTimeout(function() {         if(pos1 === 1) {             burn(flame1,psize,pspeed);              log("Bruning pyro 1");         }         else {             log("No pyro 1")         };         if(pos2 === 1) {             burn(flame2,psize,pspeed);             log("Burning pyro 2");         }         else {             log("No pyro 2")         };         if(pos3 === 1) {             burn(flame3,psize,pspeed);             log("Burning pyro 3");         }         else {             log("No pyro 3")         };         if(pos4 === 1) {             burn(flame4,psize,pspeed);             log("Burning pyro 4");         }         else {             log("No pyro 4")         };         if(pos5 === 1) {             burn(flame5,psize,pspeed);             log("Burning pyro 5");         }         else {             log("No pyro 5")         };         if(pos6 === 1) {             burn(flame6,psize,pspeed);             log("Burning pyro 6");         }         else {             log("No pyro 6");         };         log("End Pyro");     }, delay); }; var burn = function(bpos,bsize,bspeed) {      var size1 = (bsize / 4);     var size2 = (bsize / 2);     var size3 = (bsize);     var speed1 = (bspeed / 4);     var speed2 = (bspeed / 2);     var speed3 = (bspeed);         setTimeout(function() {         bpos.set("height", size1);     }, 0);     setTimeout(function() {         bpos.set("layer", "object");     }, 0);     setTimeout(function() {         bpos.set("height", size2);     }, speed1);     setTimeout(function() {         bpos.set("height", size3);     }, speed2);     setTimeout(function() {         bpos.set("height", size2);     }, speed1);     setTimeout(function() {         bpos.set("height", size1);     }, 0);     setTimeout(function() {         bpos.set("layer", "gmlayer");     }, 0); };     on("chat:message", function(msg) {   if(msg.type == "api" && msg.content.indexOf("!pyro") !== -1) {     pyro(1,0,0,0,0,0,10,2000,0);   };  });
You're missing a ) at the end of the first function.     }, bspeed * 0); }); var pyro = function(pos1,pos2,pos3,pos4,pos5,pos6,psize,pspeed,delay) {
Will it always be like this, Badger? Hunting down semi-colons, parenthesis and whatnots? It was missing from the first setTimeout, but it's still not fixed ;(
fpos.set("height", bsize / 4);              ^ TypeError: Cannot call method 'set' of undefined     at null._onTimeout (evalmachine.<anonymous>:18:14)     at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)
1368124232
Alex L.
Pro
Sheet Author
You should be checking if something is a roll20 object by using: if("set" in fpos) {    //good this is a roll20 object } else {    //oh no this isnt a roll20 object what went wrong? } It's always best to check even if you think its impossible for it to not be the right object mainly as scripts could interact in unexpected ways later on once we have people using multipule scripts made by difernt peple.
Alex L. said: You should be checking if something is a roll20 object by using: if("set" in fpos) { &nbsp; &nbsp;//good this is a roll20 object } else { &nbsp; &nbsp;//oh no this isnt a roll20 object what went wrong? } It's always best to check even if you think its impossible for it to not be the right object mainly as scripts could interact in unexpected ways later on once we have people using multipule scripts made by difernt peple. *updated code above:&nbsp; <a href="https://app.roll20.net/forum/post/147972/help-need-direction#post-150662" rel="nofollow">https://app.roll20.net/forum/post/147972/help-need-direction#post-150662</a> I understand your point. Maybe I've&nbsp;implemented your bit of code there wrong, but I'm still&nbsp;receiving&nbsp;the same error (I did replace the comments with a log). I'm damn sure there's a problem with the object, but even using an object I know is a working Roll20 object (from a working, but currently disabled script) I'm still&nbsp;receiving&nbsp;the error. It shouldn't be a scope problem.
1368209150
Alex L.
Pro
Sheet Author
Melvin McSnatch said: Alex L. said: You should be checking if something is a roll20 object by using: if("set" in fpos) { &nbsp; &nbsp;//good this is a roll20 object } else { &nbsp; &nbsp;//oh no this isnt a roll20 object what went wrong? } It's always best to check even if you think its impossible for it to not be the right object mainly as scripts could interact in unexpected ways later on once we have people using multipule scripts made by difernt peple. *updated code above. I understand your point. Maybe I've&nbsp;implemented&nbsp; your bit of code there, but I'm still&nbsp;receiving&nbsp;the same error (I did replace the comments with a log). I'm damn sure there's a problem with the object, but even using an object I know is a working Roll20 object (from a working, but currently disabled script) I'm still&nbsp;receiving&nbsp;the error. It shouldn't be a scope problem. its dificault to be sure without seeing the full code, are you able to post it or give me access to your campaign?
Fixed it. Variables have to be defined within a function. Well, until I tried to fire up all six and now the screen blacks out... It doesn't like that delay on the last .set(layer If the delay is 0, it works. If not, everything goes blank, including the grid.
<a href="http://www.youtube.com/watch?v=5ORJTWLjR7o" rel="nofollow">http://www.youtube.com/watch?v=5ORJTWLjR7o</a> *edit: If you double the height of the image with the other half added transparency, it will enlarge or rotate as intended without offsets. var pyro = function(pos1,pos2,pos3,pos4,pos5,pos6,psize,pspeed,ppeak,delay) { &nbsp; &nbsp; var flame1 = findObjs({_type: "graphic", name: "flame1"})[0]; &nbsp; &nbsp; if(!flame1) { &nbsp; &nbsp; &nbsp; &nbsp; log("object flame1 bad"); &nbsp; &nbsp; &nbsp; &nbsp;return; &nbsp; &nbsp; } &nbsp; &nbsp; var flame2 = findObjs({_type: "graphic", name: "flame2"})[0]; &nbsp; &nbsp; if(!flame2) { &nbsp; &nbsp; &nbsp; &nbsp; log("object flame2 bad"); &nbsp; &nbsp; &nbsp; &nbsp;return; &nbsp; &nbsp; } &nbsp; &nbsp; var flame3 = findObjs({_type: "graphic", name: "flame3"})[0]; &nbsp; &nbsp; if(!flame3) { &nbsp; &nbsp; &nbsp; &nbsp; log("object flame3 bad"); &nbsp; &nbsp; &nbsp; &nbsp;return; &nbsp; &nbsp;} &nbsp; &nbsp; var flame4 = findObjs({_type: "graphic", name: "flame4"})[0]; &nbsp; &nbsp; if(!flame4) { &nbsp; &nbsp; &nbsp; &nbsp; log("object flame4 bad"); &nbsp; &nbsp; &nbsp; &nbsp;return; &nbsp; &nbsp;} &nbsp; &nbsp; var flame5 = findObjs({_type: "graphic", name: "flame5"})[0]; &nbsp; &nbsp; if(!flame5) { &nbsp; &nbsp; &nbsp; &nbsp; log("object flame5 bad"); &nbsp; &nbsp; &nbsp; &nbsp;return; &nbsp; &nbsp;} &nbsp; &nbsp; var flame6 = findObjs({_type: "graphic", name: "flame6"})[0]; &nbsp; &nbsp; if(!flame6) { &nbsp; &nbsp; &nbsp; &nbsp; log("object flame6 bad"); &nbsp; &nbsp; &nbsp; &nbsp;return; &nbsp; &nbsp;} &nbsp; &nbsp; log("Begin Pyro"); &nbsp; &nbsp; setTimeout(function() { &nbsp; &nbsp; &nbsp; &nbsp; if(pos1 === 1) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; burn(flame1,psize,pspeed,ppeak);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log("Bruning pyro 1"); &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; else { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log("No pyro 1") &nbsp; &nbsp; &nbsp; &nbsp; }; &nbsp; &nbsp; &nbsp; &nbsp; if(pos2 === 1) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; burn(flame2,psize,pspeed,ppeak); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log("Burning pyro 2"); &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; else { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log("No pyro 2") &nbsp; &nbsp; &nbsp; &nbsp; }; &nbsp; &nbsp; &nbsp; &nbsp; if(pos3 === 1) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; burn(flame3,psize,pspeed,ppeak); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log("Burning pyro 3"); &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; else { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log("No pyro 3") &nbsp; &nbsp; &nbsp; &nbsp; }; &nbsp; &nbsp; &nbsp; &nbsp; if(pos4 === 1) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; burn(flame4,psize,pspeed,ppeak); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log("Burning pyro 4"); &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; else { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log("No pyro 4") &nbsp; &nbsp; &nbsp; &nbsp; }; &nbsp; &nbsp; &nbsp; &nbsp; if(pos5 === 1) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; burn(flame5,psize,pspeed,ppeak); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log("Burning pyro 5"); &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; else { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log("No pyro 5") &nbsp; &nbsp; &nbsp; &nbsp; }; &nbsp; &nbsp; &nbsp; &nbsp; if(pos6 === 1) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; burn(flame6,psize,pspeed,ppeak); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log("Burning pyro 6"); &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; else { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log("No pyro 6"); &nbsp; &nbsp; &nbsp; &nbsp; }; &nbsp; &nbsp; &nbsp; &nbsp; log("End Pyro"); &nbsp; &nbsp; }, delay); }; var burn = function(bpos,bsize,bspeed,bpeak) {&nbsp; &nbsp; &nbsp; var bminsize = bsize / 7; &nbsp; &nbsp; var bcount = 0; &nbsp; &nbsp; bpos.set("layer", "objects");&nbsp; &nbsp; &nbsp; setInterval(function() { &nbsp; &nbsp; &nbsp; &nbsp; if(bcount === 7) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return; &nbsp; &nbsp; &nbsp; &nbsp; }; &nbsp; &nbsp; &nbsp; &nbsp; bpos.set("top", bpos.get("top") + (bminsize / -7.5) * bcount); &nbsp; &nbsp; &nbsp; &nbsp; bpos.set("height", bminsize * bcount); &nbsp; &nbsp; &nbsp; &nbsp; bcount++; &nbsp; &nbsp; &nbsp; &nbsp; }, bspeed); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setTimeout(function() { &nbsp; &nbsp; &nbsp; &nbsp; var b2count = 0; &nbsp; &nbsp; &nbsp; &nbsp;setInterval(function() { &nbsp; &nbsp; &nbsp; &nbsp; if(b2count === 7) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return; &nbsp; &nbsp; &nbsp; &nbsp; }; &nbsp; &nbsp; &nbsp; &nbsp; bpos.set("top", bpos.get("top") + (bminsize / 7.5) * b2count); &nbsp; &nbsp; &nbsp; &nbsp; bpos.set("height", (bsize - (bminsize * b2count))); &nbsp; &nbsp; &nbsp; &nbsp; b2count++; &nbsp; &nbsp; &nbsp; &nbsp; }, bspeed); &nbsp; &nbsp; },bpeak); }; And here's my sequencer: on("chat:message", function(msg) { &nbsp; if(msg.type == "api" &amp;&amp; msg.content.indexOf("!pyro1") !== -1) { &nbsp; &nbsp; pyro(1,0,0,0,0,0,210,50,500,0); &nbsp; &nbsp; pyro(0,1,0,0,0,0,210,50,500,500); &nbsp; &nbsp; pyro(0,0,1,0,0,0,210,50,500,1000); &nbsp; &nbsp; pyro(0,0,0,1,0,0,210,50,500,1500); &nbsp; &nbsp; pyro(0,0,0,0,1,0,210,50,500,2000); &nbsp; &nbsp; pyro(0,0,0,0,0,1,210,50,500,2500); &nbsp; &nbsp; pyro(1,0,0,0,0,0,110,100,250,3000); &nbsp; &nbsp; pyro(0,1,0,0,0,0,140,100,250,3500); &nbsp; &nbsp; pyro(0,0,1,0,0,0,170,100,250,4000); &nbsp; &nbsp; pyro(0,0,0,1,0,0,210,100,250,4500); &nbsp; &nbsp; pyro(0,0,0,0,1,0,250,100,250,5000); &nbsp; &nbsp; pyro(0,0,0,0,0,1,290,100,250,5500); &nbsp; &nbsp; pyro(1,0,1,0,1,0,300,100,2500,5750); &nbsp; &nbsp; pyro(0,1,0,1,0,1,300,100,500,6500); &nbsp; };&nbsp; });
Looks pretty sweet! This must have been a ton of work.
Ryan L said: Looks pretty sweet! This must have been a ton of work. Thanks. The first entrance is done. Arena art was done by GM Jesse. Token art was designed by me using HeroMachine. Entrance 1
Damn... that's awesome. Bet Riley never thought the API would be used for something like that. You could make it so that the sequencer works via a macro. You'd just have to parse the message from the macro into the various steps.
As of right now, it'll run the animation for any token if added to !entr in the chat. So typing !entr Ricky Cunningham (or setting a macro button for it) launches the whole scene for that token. The second run uses !entr Maxwell Shoal, but uses the same sequence.&nbsp;Most functions can also be called via chat such as !pyro, !lite, and !dark, with default parameters. The sequencer (a list function calls with parameters set on a delay) has to be set up appropriately since the API doesn't like to do more than one function within 50 milliseconds of each other it seems, making everything done with intervals a pain to get smooth animation since there are usually other things going on. There will just be multiple sequences for different entrances. Google Air did an awful job of recording this already choppy animation, which peaks at an astounding 8 frames per second. Next up, fog machine, laser lights, spotlight, moving the token into an overhead view ring, animation for throwing someone down, and figuring out how to get the tokens to return to their starting position after a match. My methods will probably crash the campaign unless I find a better way of doing things. There will easily be over 100 tokens between the wrestlers and their Titan Tron images stored on the GM layer. So that's something I need to figure out. on("chat:message", function(msg) { &nbsp; if(msg.type == "api" &amp;&amp; msg.content.indexOf("!entr") !== -1) { &nbsp; &nbsp; &nbsp; var wrestler = msg.content.replace("!entr ", ""); &nbsp; &nbsp; &nbsp; &nbsp; lights(100,0,0); &nbsp; &nbsp; &nbsp; &nbsp; flsh(1,0,1,1,0,1,70,100,250,3000); &nbsp; &nbsp; &nbsp; &nbsp; appear(wrestler,6000); &nbsp; &nbsp; &nbsp; &nbsp; flsh(1,1,0,0,1,0,70,100,250,4250); &nbsp; &nbsp; &nbsp; &nbsp; flsh(0,0,1,1,0,0,70,100,250,5500); &nbsp; &nbsp; &nbsp; &nbsp; flsh(1,1,0,0,0,1,70,100,250,6500); &nbsp; &nbsp; &nbsp; &nbsp; pyro(1,0,0,0,0,1,35,50,2000,7500); &nbsp; &nbsp; &nbsp; &nbsp; pyro(0,1,0,0,1,0,70,50,1750,7750); &nbsp; &nbsp; &nbsp; &nbsp; pyro(0,0,1,1,0,0,140,50,1500,8000); &nbsp; &nbsp; &nbsp; &nbsp; appear(wrestler + " " + "Pic",8000); &nbsp; &nbsp; &nbsp; &nbsp; lights(100,100,8000); &nbsp; &nbsp; &nbsp; &nbsp; moveDown(wrestler,4,1000,10000); &nbsp; &nbsp; &nbsp; &nbsp; grow(wrestler,140,1000,10000); &nbsp; &nbsp; &nbsp; &nbsp; flsh(1,1,0,0,1,0,70,50,100,12500); &nbsp; &nbsp; &nbsp; &nbsp; flsh(0,0,1,1,0,0,70,50,100,15000); &nbsp; &nbsp; &nbsp; &nbsp; flsh(1,1,0,0,0,1,70,50,100,17500); &nbsp; &nbsp; &nbsp; &nbsp; moveUp(wrestler,4,1000,20000); &nbsp; &nbsp; &nbsp; &nbsp; shrink(wrestler,140,1000,20000); &nbsp; &nbsp; &nbsp; &nbsp; disappear(wrestler,30000) &nbsp; &nbsp; &nbsp; &nbsp; disappear(wrestler + " " + "Pic", 32000) &nbsp; &nbsp; &nbsp; &nbsp; lights(100,0,35000); &nbsp; };&nbsp; });
This is ridiculous. Let me know if you ever reach a point where things aren't working well...I'm actually surprised the latency is good enough to keep all of that in-sync with so much happening at once :-)