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, Snippet] Tome of Beasts - Monolith Champion's Blatant Dismissal Ability

1521420897
The Aaron
Pro
API Scripter
The Monolith Champion has an interesting trait called Blatant Dismissal: While in a fey court or castle, a monolith champion that scores a successful hit with its greatsword can try to force the substitution of the target with a shadow double. The target must succeed at a DC 14 Charisma saving throw or become invisible, silent, and paralyzed, while an illusory version of itself remains visible and audible—and under the monolith champion’s control, shouting for a retreat or the like. Outside fey locales, this ability does not function. This is pretty cool, but hard to play easily.&nbsp; I made a script to help with this: on('ready',function(){ &nbsp; &nbsp; const clearURL = '<a href="https://s3.amazonaws.com/files.d20.io/images/4277467/iQYjFOsYC5JsuOPUCI9RGA/thumb.png?1401938659" rel="nofollow">https://s3.amazonaws.com/files.d20.io/images/4277467/iQYjFOsYC5JsuOPUCI9RGA/thumb.png?1401938659</a>'; &nbsp; &nbsp; const mirroredProps = [ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'left', 'top', 'width', 'height', 'rotation', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'flipv', 'fliph', 'bar1_value', 'bar1_max', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'bar2_value', 'bar2_max', 'bar3_value', 'bar3_max', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'tint_color', 'lastmove', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'represents','bar1_link','bar2_link','bar3_link', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'light_radius', 'light_dimradius', 'light_otherplayers', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'light_hassight', 'light_angle', 'light_losangle' &nbsp; &nbsp; &nbsp; &nbsp; ]; &nbsp; &nbsp; const doDismissal = (token) =&gt; { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; let baseObj = { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; imgsrc: clearURL, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; layer: token.get('layer'), &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pageid: token.get('pageid'), &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; name: `${token.get('name')} (REAL)`, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; aura1_color: '#ff00ff', &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; aura1_square: false, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; aura1_radius: 0.000001, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; showname: true, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; showplayers_name: false, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; showplayers_bar1: false, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; showplayers_bar2: false, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; showplayers_bar3: false, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; showplayers_aura1: false, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; showplayers_aura2: false, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playersedit_name: true, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playersedit_bar1: true, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playersedit_bar2: true, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playersedit_bar3: true, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playersedit_aura1: true, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playersedit_aura2: true &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _.each(mirroredProps,function(p){ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; baseObj[p]=token.get(p); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; let copy = createObj('graphic',baseObj); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _.defer(()=&gt;{ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; toBack(copy); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; let character = getObj('character', token.get('represents')); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if( character ) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sendChat('',`/w "${character.get('name')}" &lt;div style="border: 5px solid red;border-radius: .5em; padding:.5em; background-color: #ffeeee;"&gt;&lt;div&gt;You have become &lt;code&gt;silent&lt;/code&gt;, &lt;code&gt;invisible&lt;/code&gt;, and &lt;code&gt;paralyzed&lt;/code&gt;.&nbsp; An illusory version of you that is visible and audible has taken your place.&lt;/div&gt;&lt;hr&gt;&lt;div&gt;&lt;b&gt;&lt;i&gt;Please continue to play your Illusory self with the goal of retreating or finding another way out of this place.&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;`); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; }; &nbsp; &nbsp; on('chat:message',function(msg){ &nbsp; &nbsp; &nbsp; &nbsp; var cmd,ids; &nbsp; &nbsp; &nbsp; &nbsp; if('api' !== msg.type || !playerIsGM(msg.playerid) ){ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; ids = msg.content.split(/\s+/); &nbsp; &nbsp; &nbsp; &nbsp; cmd = ids.shift(); &nbsp; &nbsp; &nbsp; &nbsp; ids = _.union(ids, ((msg.selected && _.pluck(msg.selected,'_id')) || []) ); &nbsp; &nbsp; &nbsp; &nbsp; switch(cmd){ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case '!blatant-dismissal': &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _.chain(ids) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .uniq() &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .map( (id) =&gt; getObj('graphic',id) ) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .reject(_.isUndefined) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .each( doDismissal ); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; }); }); Simply select the token for the character that fails their Charisma save and run: !blatant-dismissal This will do 2 things.&nbsp; First, it will whisper to the character a message telling them what happened: It will also create a marker for the Invisible, Silent, Paralyzed token which only the GM and the Player can see.&nbsp; It will continue to cast whatever light and have whatever vision the original has.&nbsp; This means characters with a light source still show up, which can be an interesting visual hint to the remaining players. Anyway, it played out awesomely in today's game and I figured I'd share it in case someone else has a use for it (or wants to mod it for something).
1521422113
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
That's Elephant-gun-to-swat-a-fly cool. :)
1521422311
The Aaron
Pro
API Scripter
Thanks Keith, it was a bunch of fun and really made the encounter play well.&nbsp; As each "character" started retreating on their turn the others all had the "WTF is he DOING?!?!" moment, it was completely awesome.&nbsp; =D&nbsp; 4/5 characters got bound up and the 5th one finally killed it with a magic missile.&nbsp; &nbsp;The cleric said "This has replaced my greatest nightmare of 'giving a speech in my underwear'. "&nbsp; HAHAHAHA!
could be used for duplicity, mirror images perhaps
1521487650
The Aaron
Pro
API Scripter
Could probably modify it for invisibility... would just need to hide real token on the GM layer temporarily and give the players an interface to flip between.&nbsp; Kind of a modified Bump.&nbsp; Couldn't have status markers on the token, but other than that, would be pretty usable.
1521488179
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
Nover C. said: could be used for duplicity, mirror images perhaps Mirror Images has you in the same space as your duplicates, but it might be modifiable for Invoke Duplicity.
1521488847
The Aaron
Pro
API Scripter
If Invoke Duplicity involves a second copy of your token, it would only work if the image is in the user library.&nbsp; Probably dragging in another copy or copy pasting the existing one would be just as good or better.
1521490597
keithcurtis
Forum Champion
Marketplace Creator
API Scripter
Simpler, certainly.
now i just plain to make a macro for this but i think what i would do is have the DC check performed via chat menu as well and then if they fail have the message appear but the rest is fulff for me in term of swapping tokens and such.&nbsp; use case for me would be 1. Click ability on the monster sheet and target player. 2. player receives a whisper with the request for A DC check that i can set on the fly when i clicked the monster action. 3. if DC fails they receive the message and the token receives a ISgm visible aura only white distance 20 FT&nbsp; 3B if a pass i get a gm whisper "player passed" 4. they play until such time as i select a second monster action this one called next chance to save. where they have a higher DC to break free again i can set on the fly.&nbsp; 4A player breaks free then aura goes away and player resumes normal play. 4B if failed Player receives the prior message again and aura get a second aura 40ft larger red. Players who end their turn in the aura then Get a Save DC at step 1. which it would be up to me to manage what stage they are in but visually the aura color can be change manually to track&nbsp;