58 lines
1.1 KiB
JavaScript
58 lines
1.1 KiB
JavaScript
import {compose} from '@avocado/core';
|
|
import {StateProperty, Trait} from '@avocado/entity';
|
|
|
|
const decorate = compose(
|
|
StateProperty('life', {
|
|
track: true,
|
|
}),
|
|
StateProperty('maxLife', {
|
|
track: true,
|
|
}),
|
|
);
|
|
|
|
export class Alive extends decorate(Trait) {
|
|
|
|
static defaultState() {
|
|
return {
|
|
life: 100,
|
|
maxLife: 100,
|
|
};
|
|
}
|
|
|
|
listeners() {
|
|
return {
|
|
|
|
tookDamage: (damage) => {
|
|
this.entity.life -= damage.amount;
|
|
// Clamp health between 0 and max.
|
|
this.entity.life = Math.min(
|
|
Math.max(0, this.entity.life),
|
|
this.entity.maxLife
|
|
);
|
|
},
|
|
|
|
}
|
|
}
|
|
|
|
tick(elapsed) {
|
|
// ded
|
|
// @todo Custom death conditions.
|
|
if (this.entity.life <= 0) {
|
|
const allowDeath = this.entity.invokeHookFlat('allowDeath');
|
|
const overrides = allowDeath.filter((response) => {
|
|
return false === response;
|
|
});
|
|
// Something saved the day.
|
|
if (overrides.length > 0) {
|
|
|
|
}
|
|
else {
|
|
// It's a good day to die.
|
|
this.entity.destroy();
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|