import {compose} from '@avocado/core'; import {Vector} from '@avocado/math'; import {simpleState, Trait} from '../trait'; const decorate = compose( simpleState('isMobile'), simpleState('speed'), ) class MobileBase extends Trait { static defaultState() { return { isMobile: true, speed: 0, }; } constructor(...args) { super(...args); this.requestedMovement = [0, 0]; } actions() { return { requestMovement: (vector) => { if (!this.isMobile) { return; } this.requestedMovement = Vector.scale( Vector.hypotenuse(vector), this.speed ); this.entity.emit('movementRequest', this.requestedMovement); }, } } listeners() { return { tick: (elapsed) => { if (Vector.isZero(this.requestedMovement)) { return; } const requestedMovement = Vector.scale( this.requestedMovement, elapsed ); this.requestedMovement = [0, 0]; this.entity.x += requestedMovement[0]; this.entity.y += requestedMovement[1]; }, } } } export class Mobile extends decorate(MobileBase) {}