import {compose} from '@avocado/core'; import {Vector} from '@avocado/math'; import {StateProperty, Trait} from '../trait'; const decorate = compose( StateProperty('isMobile'), StateProperty('speed'), ) class MobileBase extends Trait { static defaultState() { return { isMobile: true, speed: 0, }; } initialize() { this.requestedMovement = [0, 0]; } methods() { return { applyMovement: (movement) => { this.entity.x += movement[0]; this.entity.y += movement[1]; }, 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; } if (this.entity.is('physical')) { this.entity.applyImpulse(this.requestedMovement, elapsed); } else { const requestedMovement = Vector.scale( this.requestedMovement, elapsed ); this.entity.applyMovement(requestedMovement); } this.requestedMovement = [0, 0]; }, } } } export class Mobile extends decorate(MobileBase) {}