// Github: https://github.com/dedurrett/
// By: David E. Durrett Jr.
// Contact: https://app.roll20.net/users/76/davemania
// API Commands:
// !token-fate - Execute while you have a group of tokens selected for best results
// !token-fate-w - Execute while you have a group of tokens selected for best results whispered to the GM!
// Both of the above commands will now accept a single integer or inline roll argument! Tokens equal to the number passed can now suffer the same fate!
var TokenFate = TokenFate || (function() {
'use strict';
var version = '1.1.0',
lastUpdate = 1559219311,
multiFate = 1,
msgStart = "",
selectedToken = "",
checkInstall = function() {
log('TokenFate v'+version+' ['+(new Date(lastUpdate*1000))+']');
},
// Line Feed character is sometimes replaced at end of line 19:
outputSelectedToken = function (tokenName) {
if (msgStart=="") { sendChat("", "/desc "); }
sendChat("", msgStart + "
Fate has chosen:
" + tokenName + "
");
},
randomSelection = function (tokens) {
if( tokens.length ) {
var i = randomInteger(tokens.length)-1;
selectedToken = tokens[i].get("name");
if (selectedToken == null) {
randomSelection(_.without(tokens,tokens[i]));
return;
}
if (selectedToken == "") {
if (tokens[i].get("represents") != "" && tokens[i].get("represents") != null){
selectedToken = getObj("character", tokens[i].get("represents")).get("name");
}
}
if (selectedToken == "") {
randomSelection(_.without(tokens,tokens[i]));
return;
}
outputSelectedToken(selectedToken);
if (multiFate>1) {
multiFate--;
randomSelection(_.without(tokens,tokens[i]));
}
}
else {
outputSelectedToken("No Token");
multiFate=1;
}
},
handleMessages = function(msg)
{
if('api' !== msg.type ) {
return;
}
//This sorcery shamelessly taken from The Aaron's Ammo script
if(_.has(msg,'inlinerolls')){
msg.content = _.chain(msg.inlinerolls)
.reduce(function(m,v,k){
m['$[['+k+']]']=v.results.total || 0;
return m;
},{})
.reduce(function(m,v,k){
return m.replace(k,v);
},msg.content)
.value();
}
var args = msg.content.split(/\s+/),
objs;
switch(args[0])
{
case '!token-fate':
msgStart= "";
break;
case '!token-fate-w':
msgStart= "/w gm ";
break;
}
if (args.length > 1) {
if (Number.isInteger(Number(args[1]))) {
multiFate=Number(args[1]);
}
}
if (args.shift().includes("!token-fate")) {
objs = _.chain(msg.selected)
.map(function(o){
return getObj(o._type,o._id);
})
.reject(_.isUndefined)
.value();
randomSelection(objs);
}
},
registerEventHandlers = function(){
on('chat:message',handleMessages);
};
return {
CheckInstall: checkInstall,
RegisterEventHandlers: registerEventHandlers
};
}());
on('ready',function(){
'use strict';
TokenFate.CheckInstall();
TokenFate.RegisterEventHandlers();
});