import {compose} from '@avocado/core'; import {StateProperty, Trait} from '@avocado/entity'; import {Context} from '../context'; import {Routines} from '../item/routines'; const decorate = compose( StateProperty('currentRoutine', { track: true, }), StateProperty('isBehaving'), ); export default class Behaved extends decorate(Trait) { static defaultParams() { return { routines: {}, }; } static defaultState() { return { currentRoutine: 'initial', isBehaving: true, } } static describeParams() { return { routines: { type: 'routines', label: 'Routines', }, } } static describeState() { return { isBehaving: { type: 'bool', label: 'Is behaving', }, currentRoutine: { type: 'string', label: 'Current routine', }, } } static type() { return 'behaved'; } constructor(entity, params, state) { super(entity, params, state); this._context = new Context({ entity: this.entity, }); this._currentRoutine = undefined; this._routines = (new Routines()).fromJSON(this.params.routines); this.updateCurrentRoutine(this.state.currentRoutine); } destroy() { this._context.destroy(); this._currentRoutine = undefined; this._routines = undefined; } get context() { return this._context; } updateCurrentRoutine(currentRoutine) { this._currentRoutine = this._routines.routine(currentRoutine); } listeners() { return { currentRoutineChanged: (old, currentRoutine) => { this.updateCurrentRoutine(currentRoutine); }, isDyingChanged: (_, isDying) => { this.entity.isBehaving = !isDying; }, }; } tick(elapsed) { if (AVOCADO_SERVER) { if (this._currentRoutine && this.entity.isBehaving) { this._currentRoutine.tick(this._context, elapsed); } } } }