51 lines
No EOL
1.3 KiB
JavaScript
51 lines
No EOL
1.3 KiB
JavaScript
import { distF, uuidv4 } from './util.js'
|
|
|
|
class NPC {
|
|
constructor(you) {
|
|
let pos = { x: Math.random() * 1000 - 50, y: Math.random() * 1000 - 50 };
|
|
let vel = { x: 0, y: 0 };
|
|
|
|
this.pos = pos;
|
|
this.vel = vel;
|
|
|
|
this.you = you || uuidv4();
|
|
|
|
this.type = 'NPC';
|
|
|
|
this.immortal = true;
|
|
|
|
this.posOff = { x: 0, y: 0 };
|
|
|
|
this.serverProps = [
|
|
'type', 'pos', 'vel', 'you', 'immortal', 'posOff'
|
|
];
|
|
}
|
|
handleTick(game) {
|
|
let { entities } = game;
|
|
|
|
let rEntity, i = 0;
|
|
|
|
while ((!rEntity || rEntity.type != 'Player' || rEntity.health <= 0) && i < 100) {
|
|
rEntity = entities[Math.floor(Math.random() * entities.length)];
|
|
i++;
|
|
}
|
|
|
|
let jitter = entities.filter(x => x.type == 'Player' && x && x.health > 0).length;
|
|
|
|
if (Math.random() < 0.01) {
|
|
this.posOff.x = (Math.random() * 50 - 25) * jitter;
|
|
this.posOff.y = (Math.random() * 50 - 25) * jitter;
|
|
}
|
|
|
|
this.vel.x += (rEntity.pos.x - this.pos.x + this.posOff.x) * 0.0002;
|
|
this.vel.y += (rEntity.pos.y - this.pos.y + this.posOff.y) * 0.0002;
|
|
|
|
this.vel.x *= 0.995;
|
|
this.vel.y *= 0.995;
|
|
|
|
this.pos.x += this.vel.x;
|
|
this.pos.y += this.vel.y;
|
|
}
|
|
}
|
|
|
|
export default NPC; |