SCRIPT ERROR For reference, the error message generated was: SyntaxError: Invalid or unexpected token
ON THE TABLE. The blood art shows on tokens, like before, and I can click them. When the 3rd bar is assigned to health and I do damage to the token, nothing happens. CODE This makes me think I'm missing something. /////////////////////////////////////////////////
/***********************************************/
var BloodAndHonor = {
author: {
name: "John C." || "Echo" || "SplenectomY",
company: "Team Asshat" || "The Alehounds",
contact: "<a href="mailto:echo@TeamAsshat.com" rel="nofollow">echo@TeamAsshat.com</a>"
},
version: "0.8.2", // The Aaron - Patched for playerIsGM(), createObj(), and randomInteger() crash.
gist: "<a href="https://gist.github.com/SplenectomY/097dac3e427ec50f32c9" rel="nofollow">https://gist.github.com/SplenectomY/097dac3e427ec50f32c9</a>",
forum: "<a href="https://app.roll20.net/forum/post/1477230/" rel="nofollow">https://app.roll20.net/forum/post/1477230/</a>",
wiki: "<a href="https://wiki.roll20.net/Script:Blood_And_Honor:_Automatic_blood_spatter,_pooling_and_trail_effects" rel="nofollow">https://wiki.roll20.net/Script:Blood_And_Honor:_Automatic_blood_spatter,_pooling_and_trail_effects</a>",
/***********************************************/
/////////////////////////////////////////////////
// This value should match the size of a standard grid in your campaign
// Default is 70 px x 70 px square, Roll20's default.
tokenSize: 70,
bar: 1,
// YOU MUST ADD YOUR OWN SPATTERS AND POOLS TO YOUR LIBRARY
// AND GET THE IMAGE LINK VIA YOUR WEB BROWSER.
// FOLLOW THE INSTRUCTIONS HERE:
// <a href="https://wiki.roll20.net/API:Objects#imgsrc_and_avatar_property_restrictions" rel="nofollow">https://wiki.roll20.net/API:Objects#imgsrc_and_avatar_property_restrictions</a>
// You can add as many as you'd like to either category.
// Spatters are also used for blood trails.
spatters: [
"<a href="https://s3.amazonaws.com/files.d20.io/images/733741/VyNM_dcwowvUJRz4uIY4eQ/max.png?1585128480" rel="nofollow">https://s3.amazonaws.com/files.d20.io/images/733741/VyNM_dcwowvUJRz4uIY4eQ/max.png?1585128480</a>",
"<a href="https://s3.amazonaws.com/files.d20.io/images/733736/UXfvZ8wX9UO5Q2Vca3VSjQ/max.png?1585128474" rel="nofollow">https://s3.amazonaws.com/files.d20.io/images/733736/UXfvZ8wX9UO5Q2Vca3VSjQ/max.png?1585128474</a>",
"<a href="https://s3.amazonaws.com/files.d20.io/images/733737/9QAVylkn7yUHgHX2r5xjPw/max.png?1585128475" rel="nofollow">https://s3.amazonaws.com/files.d20.io/images/733737/9QAVylkn7yUHgHX2r5xjPw/max.png?1585128475</a>",
"<a href="https://s3.amazonaws.com/files.d20.io/images/733738/MdkzTSpFb0VyZyACAngtmg/max.png?1585128477" rel="nofollow">https://s3.amazonaws.com/files.d20.io/images/733738/MdkzTSpFb0VyZyACAngtmg/max.png?1585128477</a>",
"<a href="https://s3.amazonaws.com/files.d20.io/images/733739/Jku1qm791Jo5EJW2KFaZVg/max.png?1585128478" rel="nofollow">https://s3.amazonaws.com/files.d20.io/images/733739/Jku1qm791Jo5EJW2KFaZVg/max.png?1585128478</a>",
"<a href="https://s3.amazonaws.com/files.d20.io/images/733740/VmK3eb87GvsZ-nDCBk5IQw/max.png?1585128479" rel="nofollow">https://s3.amazonaws.com/files.d20.io/images/733740/VmK3eb87GvsZ-nDCBk5IQw/max.png?1585128479</a>",
"<a href="https://s3.amazonaws.com/files.d20.io/images/733742/h9Gi1DNDda4vps5iTtaq9g/max.png?1585128483" rel="nofollow">https://s3.amazonaws.com/files.d20.io/images/733742/h9Gi1DNDda4vps5iTtaq9g/max.png?1585128483</a>",
"<a href="https://s3.amazonaws.com/files.d20.io/images/733743/QdiYCuM9bu5gIqdJ-2cShg/max.png?1585128484" rel="nofollow">https://s3.amazonaws.com/files.d20.io/images/733743/QdiYCuM9bu5gIqdJ-2cShg/max.png?1585128484</a>",
"<a href="https://s3.amazonaws.com/files.d20.io/images/733744/2-vqJCxXxfVn--oHFiUWHQ/max.png?1585128486" rel="nofollow">https://s3.amazonaws.com/files.d20.io/images/733744/2-vqJCxXxfVn--oHFiUWHQ/max.png?1585128486</a>",
"<a href="https://s3.amazonaws.com/files.d20.io/images/733747/8meZ0p0IRuEoqAcKK1kGNQ/max.png?1585128996" rel="nofollow">https://s3.amazonaws.com/files.d20.io/images/733747/8meZ0p0IRuEoqAcKK1kGNQ/max.png?1585128996</a>",
],
pools: [
"<a href="https://s3.amazonaws.com/files.d20.io/images/733741/VyNM_dcwowvUJRz4uIY4eQ/max.png?1585128480" rel="nofollow">https://s3.amazonaws.com/files.d20.io/images/733741/VyNM_dcwowvUJRz4uIY4eQ/max.png?1585128480</a>",
"<a href="https://s3.amazonaws.com/files.d20.io/images/733740/VmK3eb87GvsZ-nDCBk5IQw/max.png?1585128479" rel="nofollow">https://s3.amazonaws.com/files.d20.io/images/733740/VmK3eb87GvsZ-nDCBk5IQw/max.png?1585128479</a>",
],
chooseBlood: function chooseBlood(type) {
if (type == "spatter") return BloodAndHonor.spatters[randomInteger(BloodAndHonor.spatters.length) - 1];
if (type == "pool") return BloodAndHonor.pools[randomInteger(BloodAndHonor.pools.length) - 1];
},
getOffset: function getOffset() {
if (randomInteger(2) == 1) return 1;
else return -1;
},
bloodColor: function bloodColor(gmnotes) {
if (gmnotes.indexOf("bloodcolor_purple") !== -1) return "#0000ff";
if (gmnotes.indexOf("bloodcolor_blue") !== -1) return "#00ffff";
if (gmnotes.indexOf("bloodcolor_orange") !== -1) return "#ffff00";
if (gmnotes.indexOf("bloodcolor_black") !== -1) return "#000000";
if (gmnotes.indexOf("bloodcolor_green") !== -1) return "#008000";
else return "transparent";
},
createBlood: function createBlood(gPage_id,gLeft,gTop,gWidth,gType,gColor) {
gLeft = gLeft + (randomInteger(Math.floor(gWidth / 2)) * BloodAndHonor.getOffset());
gTop = gTop + (randomInteger(Math.floor(gWidth / 2)) * BloodAndHonor.getOffset());
setTimeout(function(){
toFront(createObj("graphic",{
imgsrc: gType,
gmnotes: "blood",
pageid: gPage_id,
left: gLeft,
tint_color: gColor,
top: gTop,
rotation: randomInteger(360) - 1,
width: gWidth,
height: gWidth,
layer: "map"
}));
},50);
},
timeout: 0,
onTimeout: function theFinalCountdown() {
if (BloodAndHonor.timeout > 0) {
BloodAndHonor.timeout--;
} else {
return;
}
}
};
const getActivePages = (()=>{
let lastCall = 0;
let fn = () => [...new Set([
Campaign().get('playerpageid'),
...Object.values(Campaign().get('playerspecificpages')),
...findObjs({
type: 'player',
online: true
})
.filter((p)=>playerIsGM(p.id))
.map((p)=>p.get('lastpage'))
])
];
let last = [];
return () => {
if((Date.now()-300) > lastCall){
last = fn();
lastCall = Date.now();
}
return last;
};
})();
const isPlayerPage = (id) => getActivePages().includes(id);
on("ready", function() {
setInterval(function(){BloodAndHonor.onTimeout();},1000);
on(`change:graphic:bar${BloodAndHonor.bar}_value`, function(obj, prev) {
if(isPlayerPage(obj.get('pageid'))){
if (obj.get(`bar${BloodAndHonor.bar}_max`) === "" || obj.get("layer") != "objects" || (obj.get("gmnotes")).indexOf("noblood") !== -1)
return;
// Create spatter near token if "bloodied".
// Chance of spatter depends on severity of damage
else if (obj.get(`bar${BloodAndHonor.bar}_value`) <= obj.get(`bar${BloodAndHonor.bar}_max`) / 2 && prev[`bar${BloodAndHonor.bar}_value`] > obj.get(`bar${BloodAndHonor.bar}_value`) && obj.get(`bar${BloodAndHonor.bar}_value`) > 0) {
var m=parseInt(obj.get(`bar${BloodAndHonor.bar}_max`),10)||1,
v=parseInt(obj.get(`bar${BloodAndHonor.bar}_value`),10)||1,
r=randomInteger(m);
if (r>v) {
var bloodMult = 1 + ((obj.get(`bar${BloodAndHonor.bar}_value`) - prev[`bar${BloodAndHonor.bar}_value`]) / obj.get(`bar${BloodAndHonor.bar}_max`));
BloodAndHonor.createBlood(obj.get("_pageid"), obj.get("left"), obj.get("top"), Math.floor(BloodAndHonor.tokenSize * bloodMult), BloodAndHonor.chooseBlood("spatter"), BloodAndHonor.bloodColor(obj.get("gmnotes")));
}
}
// Create pool near token if health drops below 1.
else if (obj.get(`bar${BloodAndHonor.bar}_value`) <= 0) {
BloodAndHonor.createBlood(obj.get("_pageid"), obj.get("left"), obj.get("top"), Math.floor(BloodAndHonor.tokenSize * 1.5), BloodAndHonor.chooseBlood("pool"), BloodAndHonor.bloodColor(obj.get("gmnotes")));
}
}
});
//Make blood trails, chance goes up depending on how injured a token is
on("change:graphic:lastmove", function(obj) {
if(isPlayerPage(obj.get('pageid')) && BloodAndHonor.timeout === 0) {
if (obj.get(`bar${BloodAndHonor.bar}_value`) <= obj.get(`bar${BloodAndHonor.bar}_max`) / 2 && (obj.get("gmnotes")).indexOf("noblood") == -1) {
var m=parseInt(obj.get(`bar${BloodAndHonor.bar}_max`),10)||1,
v=parseInt(obj.get(`bar${BloodAndHonor.bar}_value`),10)||1,
r=randomInteger(m);
if (r>v) {
BloodAndHonor.createBlood(obj.get("_pageid"), obj.get("left"), obj.get("top"), Math.floor(BloodAndHonor.tokenSize / 2), BloodAndHonor.chooseBlood("spatter"), BloodAndHonor.bloodColor(obj.get("gmnotes")));
BloodAndHonor.timeout += 2;
}
}
}
});
on("chat:message", function(msg) {
if (msg.type == "api" && msg.content.indexOf("!clearblood") !== -1) {
if (!playerIsGM(msg.playerid)) {
sendChat(msg.who,"/w " + msg.who + " You are not authorized to use that command!");
return;
} else {
let objects = filterObjs(function(obj) {
return obj.get("type") == "graphic" &&
obj.get("gmnotes") == "blood" &&
isPlayerPage(obj.get('pageid')) ;
});
_.each(objects, function(obj) {
obj.remove();
});
}
}
});
});