sam-ecs
Version:
A specialized entity component system
119 lines (106 loc) • 3.21 kB
JavaScript
;
//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
});
};