-
Notifications
You must be signed in to change notification settings - Fork 0
/
EntityController.mjs
137 lines (98 loc) · 4.29 KB
/
EntityController.mjs
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
import Entity from '../entity/Entity.mjs';
import Compendium from '../compendium/Compendium.mjs';
import { UPDATE_SELF } from '../tools/constants.mjs';
function EntityController() {
this.entityCompendium = new Compendium();
this.entityTypes = {};
document.addEventListener('createEntityType', e => this._createEntityType({ entityTypeData: e.detail }));
document.addEventListener('destroyEntityType', e => this._destroyEntityType({ entityTypeName: e.detail }));
this.entityClickActions = {};
document.addEventListener('setEntityClickAction', e => this.setEntityClickAction({ ...e.detail }));
document.addEventListener('unsetEntityClickAction', e => this.unsetEntityClickAction({ ...e.detail }));
};
EntityController.prototype.createEntity = function({ boardId, entityTypeName, coords }) {
const entityType = this.entityTypes[entityTypeName];
const entity = new entityType();
entity.updateLocationData({
locationData: { boardId, coords },
});
this.entityCompendium.add({ entry: entity });
return entity.id;
};
EntityController.prototype.getEntityTypeData = function({ entityTypeName }) {
const entityType = this.entityTypes[entityTypeName];
const entity = new entityType();
const entityTypeData = { ...entity };
entity.selfDestruct();
return entityTypeData;
};
EntityController.prototype.destroyEntity = function({ entityId }) {
const entity = this.entityCompendium.get({ id: entityId });
entity.selfDestruct();
this.entityCompendium.remove({ id: entityId });
};
EntityController.prototype.destroyEntities = function({ entityIds }) {
for (const entityId of entityIds) {
this.destroyEntity({ entityId });
};
};
EntityController.prototype.requestUpdate = function({ entityId, neighborhoodData }) {
const entity = this.entityCompendium.get({ id: entityId });
return entity.requestUpdate({ neighborhoodData });
};
EntityController.prototype.performUpdate = function({ entityId, action }) {
if (!action) { return null };
const entity = this.entityCompendium.get({ id: entityId });
entity.incrementTickCount();
return action.call(entity);
};
EntityController.prototype.performEntityClickAction = function({ entityId }) {
const entity = this.entityCompendium.get({ id: entityId });
const actionName = this.entityClickActions[entity.typeName];
if (!actionName) { throw new Error('entity has not been assigned click action.')};
const action = entity.actions[actionName].bind(entity);
return this.performUpdate({ entityId, action });
};
EntityController.prototype.getCanvas = function({ entityId }) {
const entity = this.entityCompendium.get({ id: entityId });
return entity.canvas;
};
EntityController.prototype.getLocationData = function({ entityId }) {
const entity = this.entityCompendium.get({ id: entityId });
return entity.locationData;
};
EntityController.prototype.getImageData = function({ entityId }) {
const entity = this.entityCompendium.get({ id: entityId });
return { ...entity.imageData };
};
EntityController.prototype.getNeighborhoodBlueprints = function({ entityId }) {
const entity = this.entityCompendium.get({ id: entityId });
return entity.neighborhoodBlueprints;
};
EntityController.prototype.setEntityClickAction = function({ entityTypeName, clickActionName }) {
if (!this.entityTypes[entityTypeName]) {
throw new Error('cannot set entity click action; cannot find entity.')
};
const sampleEntity = new this.entityTypes[entityTypeName]();
const entityActionNames = Object.keys(sampleEntity.actions);
sampleEntity.selfDestruct();
if (!entityActionNames.includes(clickActionName)) {
throw new Error('cannot set entity click action; cannot find action.')
};
this.entityClickActions[entityTypeName] = clickActionName;
};
EntityController.prototype.unsetEntityClickAction = function({ entityTypeName }) {
this.entityClickActions[entityTypeName] = null;
};
EntityController.prototype._createEntityType= function({ entityTypeData }) {
const typeName = entityTypeData.typeName;
this.entityTypes[typeName] = function() {
Entity.call(this, entityTypeData);
};
this.entityTypes[typeName].prototype = Object.create(Entity.prototype);
this.entityTypes[typeName].prototype.constructor = this.entityTypes[typeName];
};
EntityController.prototype._destroyEntityType = function({ entityTypeName }) {
delete this.entityTypes[entityTypeName];
};
export default EntityController;