2019-04-09 09:22:41 -05:00
|
|
|
import {compose, TickingPromise} from '@avocado/core';
|
2019-03-17 23:45:48 -05:00
|
|
|
import {Vector} from '@avocado/math';
|
|
|
|
|
2019-03-23 23:24:18 -05:00
|
|
|
import {StateProperty, Trait} from '../trait';
|
2019-03-17 23:45:48 -05:00
|
|
|
|
|
|
|
const decorate = compose(
|
2019-03-23 23:24:18 -05:00
|
|
|
StateProperty('isMobile'),
|
|
|
|
StateProperty('speed'),
|
2019-03-17 23:45:48 -05:00
|
|
|
)
|
|
|
|
|
|
|
|
class MobileBase extends Trait {
|
|
|
|
|
|
|
|
static defaultState() {
|
|
|
|
return {
|
|
|
|
isMobile: true,
|
|
|
|
speed: 0,
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2019-03-19 11:25:42 -05:00
|
|
|
initialize() {
|
2019-03-17 23:45:48 -05:00
|
|
|
this.requestedMovement = [0, 0];
|
|
|
|
}
|
|
|
|
|
2019-03-20 18:32:54 -05:00
|
|
|
methods() {
|
2019-03-17 23:45:48 -05:00
|
|
|
return {
|
2019-03-20 18:32:54 -05:00
|
|
|
|
2019-04-09 09:22:41 -05:00
|
|
|
moveFor: (duration) => {
|
|
|
|
const direction = Math.floor(Math.random() * 4);
|
|
|
|
let resolve;
|
|
|
|
const promise = new TickingPromise(_resolve => resolve = _resolve);
|
|
|
|
promise.ticker = (elapsed) => {
|
|
|
|
duration -= elapsed;
|
|
|
|
if (duration <= 0) {
|
|
|
|
return resolve();
|
|
|
|
}
|
|
|
|
this.entity.requestMovement(Vector.fromDirection(direction));
|
|
|
|
}
|
|
|
|
return promise;
|
|
|
|
},
|
|
|
|
|
2019-03-23 18:26:35 -05:00
|
|
|
applyMovement: (movement) => {
|
|
|
|
this.entity.x += movement[0];
|
|
|
|
this.entity.y += movement[1];
|
|
|
|
},
|
|
|
|
|
2019-03-17 23:45:48 -05:00
|
|
|
requestMovement: (vector) => {
|
|
|
|
if (!this.isMobile) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
this.requestedMovement = Vector.scale(
|
2019-03-27 17:53:18 -05:00
|
|
|
Vector.normalize(vector),
|
2019-03-17 23:45:48 -05:00
|
|
|
this.speed
|
|
|
|
);
|
|
|
|
this.entity.emit('movementRequest', this.requestedMovement);
|
|
|
|
},
|
2019-03-20 19:31:35 -05:00
|
|
|
|
2019-03-17 23:45:48 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-04-12 13:05:30 -05:00
|
|
|
tick(elapsed) {
|
|
|
|
if (Vector.isZero(this.requestedMovement)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (this.entity.is('physical')) {
|
|
|
|
this.entity.applyImpulse(this.requestedMovement, elapsed);
|
2019-03-17 23:45:48 -05:00
|
|
|
}
|
2019-04-12 13:05:30 -05:00
|
|
|
else {
|
|
|
|
const requestedMovement = Vector.scale(
|
|
|
|
this.requestedMovement,
|
|
|
|
elapsed
|
|
|
|
);
|
|
|
|
this.entity.applyMovement(requestedMovement);
|
|
|
|
}
|
|
|
|
this.requestedMovement = [0, 0];
|
2019-03-17 23:45:48 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
export class Mobile extends decorate(MobileBase) {}
|