UNPKG

sam-ecs

Version:

A specialized entity component system

119 lines (106 loc) 3.21 kB
'use strict'; //ClientWorker.js// /** * @description - WebWorker file for the client manager * @author - Sam Faulkner */ onmessage = function onmessage(e) { var data = e.data; var oldState = data.oldState, entityList = oldState.entities, stateChanges = data.deltaState, changeList = stateChanges.entities; var entities = {}; var changes = {}; var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = entityList[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var entity = _step.value; entities[entity.hash] = { 'components': entity.components, 'subState': entity.subState }; } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } var _iteratorNormalCompletion2 = true; var _didIteratorError2 = false; var _iteratorError2 = undefined; try { for (var _iterator2 = changeList[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { var entity = _step2.value; changes[entity.hash] = { 'components': entity.components, 'subState': entity.subState }; } } catch (err) { _didIteratorError2 = true; _iteratorError2 = err; } finally { try { if (!_iteratorNormalCompletion2 && _iterator2.return) { _iterator2.return(); } } finally { if (_didIteratorError2) { throw _iteratorError2; } } } for (var entityHash in changes) { //possible override if (entityHash in entities) { for (var componentName in changes[entityHash].components) { var componentState = changes[entityHash].components[componentName]; // def override if (componentName in entities[entityHash].components) { //override previous state Object.assign(entities[entityHash].components[componentName], componentState); } //new component else { //add new component state. Must call 'init' for component at some point entities[entityHash].components[componentName] = Object.assign({}, componentState); } } } //new entity else { /* the shallow copy is okay because objects are deep copied across * the web worker message boundary anyway */ entities[entityHash] = changes[entityHash]; } } var newEntityList = new Array(); for (var entityHash in entities) { if (entityHash in changes) { newEntityList.push({ 'subState': entities[entityHash].subState, 'components': entities[entityHash].components, 'hash': entityHash }); } } oldState.entities = newEntityList; postMessage({ 'state': oldState, 'tick': data.tick, 'receivedTick': data.receivedTick }); };