import {compose, TickingPromise} from '@avocado/core'; import {TransitionResult} from '@avocado/timing'; import {StateProperty, Trait} from '../trait'; const decorate = compose( StateProperty('name'), StateProperty('isTicking'), ); export class Existent extends decorate(Trait) { static defaultState() { return { name: 'Untitled entity', isTicking: true, }; } static type() { return 'existent'; } constructor(entity, params, state) { super(entity, params, state); this._isDestroying = false; this._isTicking = this.params.isTicking; } methods() { return { destroy: () => { if (this._isDestroying) { return; } this._isDestroying = true; this.entity.isTicking = false; this.entity.emit('destroy'); this.entity.emit('destroyed'); }, destroyGently: () => { if (this.entity.is('alive')) { this.entity.forceDeath(); } else { this.entity.destroy(); } }, transition: (props, duration, easing) => { const result = new TransitionResult( this.entity, props, duration, easing ); return new TickingPromise( (resolve) => { resolve(result.promise); }, (elapsed) => { result.tick(elapsed); }, ); }, }; } }