import {compose} from '@avocado/core'; import {StateProperty, Trait} from '@avocado/entity'; import {createContext} from '../context'; import {Routines} from '../item/routines'; const decorate = compose( StateProperty('currentRoutine'), ); export class Behaved extends decorate(Trait) { static defaultParams() { return { routines: {}, }; } static defaultState() { return { currentRoutine: 'initial', } } static type() { return 'behaved'; } constructor(entity, params, state) { super(entity, params, state); this._context = createContext(); this._context.add('entity', this.entity); this._currentRoutine = undefined; this._isBehaving = true; const routinesJSON = this.params.routines; this._routines = (new Routines()).fromJSON(routinesJSON); this._routines.context = this._context; this.updateCurrentRoutine(this.state.get('currentRoutine')); } destroy() { this._context.clear(); this._currentRoutine = undefined; this._routines = undefined; } get context() { return this._context; } set isBehaving(isBehaving) { this._isBehaving = isBehaving; } updateCurrentRoutine(currentRoutine) { this._currentRoutine = this._routines.routine(currentRoutine); } listeners() { return { currentRoutineChanged: (old, currentRoutine) => { this.updateCurrentRoutine(currentRoutine); }, dying: () => { this._isBehaving = false; }, }; } tick(elapsed) { if (this._currentRoutine && this._isBehaving) { this._currentRoutine.tick(elapsed); } } }