Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 300x 300x 200x 200x 200x 200x 200x 300x 300x 300x 300x 300x 300x 300x | import { Util } from './util.js';
/**
* Characters.
* A module containing methods for dealing with characters.
*
* @example
* const newActor = Characters.moveNPC({ npc: characters[i], width, height });
* */
export const Characters = {
/**
* moveNPC.
* This function determines the next move for a given NPC.
* It is given to the physics engine and called there.
* @param {Object} args
* @param {Character} args.npc the npc in question
* @param {number} args.width the width of the whole map
* @param {number} args.height the height of the whole map
* @returns {Character} an updated version of the npc
*/
moveNPC({ npc, width, height }) {
let newNPC = npc;
// Allow for spawn points
if (npc.isNew) {
if (npc.fallbackSpeed == null) {
newNPC = { ...newNPC, speed: npc.width + 1, fallbackSpeed: npc.speed };
} else if (!npc.hasCollision) {
newNPC = { ...newNPC, speed: newNPC.fallbackSpeed, isNew: false };
}
}
// If we're near to destination, set the next waypoint as our destination
if (npc.destination && Util.dist(npc, npc.destination) <= npc.speed) {
let { waypoints } = npc;
waypoints = waypoints || [];
newNPC = {
...newNPC,
destination: waypoints[0],
waypoints: waypoints.slice(1),
};
}
if (newNPC.destination == null) { return newNPC; }
const x = newNPC.x + Math.round(newNPC.width / 2);
const y = newNPC.y + Math.round(newNPC.height / 2);
const xdist = Math.abs(x - newNPC.destination.x);
const xmove = Math.sign(-x + newNPC.destination.x) * Math.min(xdist, newNPC.speed);
const ydist = Math.abs(y - newNPC.destination.y);
const ymove = Math.sign(-y + newNPC.destination.y) * Math.min(ydist, newNPC.speed);
if (xmove !== 0 || ymove !== 0) {
let prefix = '';
let { facing } = newNPC;
if (ymove < 0) {
prefix = 'up';
} else if (ymove > 0) {
prefix = 'down';
}
if (xmove < 0) {
facing = `${prefix}left`;
} else if (xmove > 0) {
facing = `${prefix}right`;
} else if (prefix) {
facing = prefix;
}
newNPC = {
...newNPC,
facing,
x: Math.min(Math.max(newNPC.x + xmove, 0), width - 1),
y: Math.min(Math.max(newNPC.y + ymove, 0), height - 1),
hasCollision: false,
};
}
return newNPC;
},
};
|