Skip to content

Instantly share code, notes, and snippets.

@shdwjk
Created January 11, 2019 01:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shdwjk/8246c42c8c5550a4986050175062fc94 to your computer and use it in GitHub Desktop.
Save shdwjk/8246c42c8c5550a4986050175062fc94 to your computer and use it in GitHub Desktop.
AssureTempHPMarkers
/* global TokenMod, ChatSetAttr */
on('ready', () => {
// Configuration parameters
const HPBarNum = 3;
const TempHPMarker = 'chained-heart';
const DeadMarker = 'dead';
const TempHPAttributeName = 'temp_hp';
/////////////////////////////////////////////
const clearURL = /images\/4277467\/iQYjFOsYC5JsuOPUCI9RGA\/.*.png/;
const bar = `bar${HPBarNum}_value`;
const lnk = `bar${HPBarNum}_link`;
const max = `bar${HPBarNum}_max`;
const mrk = `status_${TempHPMarker}`;
const ded = `status_${DeadMarker}`;
const checkTempHP = (obj) => {
let v = parseFloat(obj.get('current'));
findObjs({
type: 'graphic',
represents: obj.get('characterid')
})
.filter( (t) => t.get(lnk) !== '')
.filter( (t) => !clearURL.test(t.get('imgsrc') ) )
.forEach((g)=>{
g.set(mrk,(v>0 ? (v>9 ? true : v) : false) );
});
};
const assureTempHPMarkers = () => {
let queue = findObjs({
type: 'attribute',
name: TempHPAttributeName
});
const burndownQueue = ()=>{
if(queue.length){
let attr = queue.shift();
checkTempHP(attr);
setTimeout(burndownQueue,0);
}
};
burndownQueue();
};
const temporalTempHPCache = {};
const accountForHPBarChange = (obj,prev) => {
// 1. did hp change and is it a scale
const hpMax = parseInt(obj.get(max),10);
let hp = parseInt(obj.get(bar),10);
const diff = hp-parseFloat(prev[bar]);
if( !isNaN(hpMax) && diff !== 0 ) {
let changes = {};
// 2. does it represent a character
// 3. does the hp bar represent an attribute
const character = getObj('character',obj.get('represents'));
if( diff < 0 && character && obj.get(lnk)!=='' ){
// 4. is there temp hp
const temp_hp = findObjs({
type: 'attribute',
characterid: character.id,
name: TempHPAttributeName
})[0];
if( temp_hp ) {
const now = Date.now();
// 5. have we accounted for it.
if( !temporalTempHPCache.hasOwnProperty(character.id) || (now-temporalTempHPCache[character.id].when)>300 ) {
// calculate necessary change
const tempHP = parseFloat(temp_hp.get('current'))||0;
const newTmpHP = Math.max((tempHP+diff),0);
const toHeal = tempHP - newTmpHP;
temporalTempHPCache[character.id]={
when: now,
toHeal: toHeal
};
temp_hp.set('current', newTmpHP);
checkTempHP(temp_hp);
}
hp += temporalTempHPCache[character.id].toHeal;
changes[bar] = hp;
}
}
if(hp > hpMax) {
hp = hpMax;
changes[bar] = hp;
changes[ded] = false;
} else if(hp <= 0) {
hp=0;
changes[bar] = hp;
changes[ded] = true;
} else {
changes[ded] = false;
}
obj.set(changes);
}
};
const onAttributeChange = (obj) => {
if(obj.get('name') === TempHPAttributeName){
checkTempHP(obj);
}
};
on("change:attribute", onAttributeChange);
on("change:token", accountForHPBarChange);
if('undefined' !== typeof TokenMod && TokenMod.ObserveTokenChange){
TokenMod.ObserveTokenChange(accountForHPBarChange);
}
if('undefined' !== typeof ChatSetAttr && ChatSetAttr.registerObserver){
ChatSetAttr.registerObserver('change',onAttributeChange);
}
assureTempHPMarkers();
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment