All files / src/workers story-worker.js

0% Statements 0/83
0% Branches 0/1
0% Functions 0/1
0% Lines 0/83

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 80 81 82 83 84                                                                                                                                                                       
import { Story } from '../story.js';

let gameState;
let eventQueue = [];
let pathFindingChanges = [];
let flags;
let mapDim;

const pathFindingWorker = new Worker('./path-finding-worker.js');

pathFindingWorker.onmessage = (e) => {
  pathFindingChanges = pathFindingChanges.concat(e.data);
};

const pathFindingWorker2 = new Worker('./path-finding-worker.js');

pathFindingWorker2.onmessage = (e) => {
  pathFindingChanges = pathFindingChanges.concat(e.data);
};

let lastWorker = 0;
let last = new Date();
const start = new Date();
function updateStory() {
  if (!gameState) {
    postMessage({}); // Important to post an empty change to synchronise
    return;
  }
  const now = new Date() - start;
  const timeSinceLast = new Date() - last;
  last = new Date();
  let changes = Story.updateGameState({
    gameState,
    now,
    timeSinceLast,
    eventQueue,
    flags,
    mapDim,
  });
  eventQueue = [];
  const pathFindingRequests = changes.filter((t) => t.type === 'request-path-finding');
  if (pathFindingRequests.length > 0) {
    const workers = [pathFindingWorker, pathFindingWorker2];
    const worker = workers[lastWorker % 2];
    lastWorker++;
    worker.postMessage({
      type: 'add-requests',
      requests: pathFindingRequests,
    });
    changes = changes
      .filter((t) => t.type !== 'request-path-finding')
      .concat({
        type: 'set-characters-path-finding-request',
        ids: pathFindingRequests.map((t) => t.actor.id),
      });
  }
  if (pathFindingChanges.length > 0) {
    changes = changes.concat(pathFindingChanges);
    pathFindingChanges = [];
  }

  postMessage(changes);
}

onmessage = (e) => {
  switch (e.data.type) {
    case 'update-grid':
      pathFindingWorker.postMessage(e.data);
      pathFindingWorker2.postMessage(e.data);
      mapDim = e.data.mapDim;
      break;
    case 'update-game-state':
      gameState = e.data.gameState;
      flags = e.data.flags;
      updateStory();
      break;
    case 'add-event':
      eventQueue = eventQueue.concat(e.data.event);
      break;
    default:
      console.warn(`Unknown event passed to worker: ${e.data.type}`); // eslint-disable-line no-console
  }
};