Here is a combined more advanced version of the status script + THP script that prevents over heals and heals from 0. var THPBAR = 3;
var HPBAR = 1;
var setBar = function (obj, bar, value) {
var link = obj.get('_bar' + bar + '_link');
if (link !== '') {
var attr = findObjs({_type : 'attribute', _id : link});
var attr = attr[0];
attr.set({'current' : value});
}
obj.set('bar' + bar + '_value', value);
};
var addStatusMarker = function(name, token) {
var a = token.get("statusmarkers").split(",");
if(a) {
var index = a.indexOf(name);
if (index == -1) {
a.push(name);
token.set("statusmarkers", a.join());
}
}
}
var removeStatusMarker = function(name, token) {
var a = token.get("statusmarkers").split(",");
if(a) {
var index = a.indexOf(name);
if (index > -1) {
a.splice(index, 1);
token.set("statusmarkers", a.join());
}
}
}
on('change:token', function (obj, prev) {
if (obj.get("isdrawing") == true) { return; }
var HPVALUE = 'bar' + HPBAR + '_value';
var HPMAX = 'bar' + HPBAR + '_max';
var THPVALUE = 'bar' + THPBAR + '_value';
var hp = {'new' : parseInt(obj.get(HPVALUE)), 'old' : parseInt(prev[HPVALUE])};
var maxhp = parseInt(obj.get(HPMAX));
var thp = parseInt(obj.get(THPVALUE));
var target = {};
var bloodiedHp = Math.floor(maxhp * 0.5), deadHp = -bloodiedHp;
if (hp.new !== NaN && hp.new !== hp.old) {
// HP changed and we have THP to spend.
hp.change = hp.new - hp.old;
target[THPVALUE] = 0;
target[HPVALUE] = hp.new;
if (hp.change < 0) {
// HP decreased
if(thp > 0) {
hp.abschange = Math.abs(hp.change);
target[THPVALUE] = (thp > hp.abschange) ? thp - hp.abschange : 0;
target[HPVALUE] = (thp > hp.abschange) ? hp.old : hp.old - (hp.abschange - thp);
}
var currentHp = target[HPVALUE];
if(currentHp <= deadHp) {
currentHp = deadHp;
addStatusMarker("broken-skull", obj);
} else {
removeStatusMarker("broken-skull", obj);
}
if(currentHp <= 0) {
addStatusMarker("dead", obj);
} else {
removeStatusMarker("dead", obj);
}
if(currentHp <= bloodiedHp) {
addStatusMarker("half-heart", obj);
} else {
removeStatusMarker("half-heart", obj);
}
if(currentHp >= maxhp) {
currentHp = maxhp;
}
target[HPVALUE] = currentHp;
} else if(hp.change > 0) {
var currentHp = target[HPVALUE];
if(currentHp <= deadHp) {
currentHp = deadHp;
addStatusMarker("broken-skull", obj);
} else {
removeStatusMarker("broken-skull", obj);
}
if(currentHp <= 0) {
addStatusMarker("dead", obj);
} else {
removeStatusMarker("dead", obj);
}
if(currentHp <= bloodiedHp) {
addStatusMarker("half-heart", obj);
} else {
removeStatusMarker("half-heart", obj);
}
if(currentHp >= maxhp) {
currentHp = maxhp;
}
if(hp.old < 0) {
currentHp = hp.change;
}
target[HPVALUE] = currentHp;
setTimeout(setBar.bind(this, obj, HPBAR, target[HPVALUE]), 10);
}
setTimeout(setBar.bind(this, obj, HPBAR, target[HPVALUE]), 10);
setTimeout(setBar.bind(this, obj, THPBAR, target[THPVALUE]), 10);
}
});