html-tower/static/engine.js

137 lines
3.6 KiB
JavaScript
Raw Normal View History

2024-05-19 04:37:53 +00:00
console.log("loading engine");
const initEvent = () => {
let subscribers = {};
return (message, ...messageArgs) => {
switch (message) {
case "addSubscriber":
let subscriberName = messageArgs[0];
let subscriberFunc = messageArgs[1];
subscribers[subscriberName] = subscriberFunc;
break;
case "raise":
let delta = messageArgs[0];
let eventData = messageArgs[1];
Object.entries(subscribers).forEach(([id, subscriber]) => {
subscriber(delta, eventData);
});
break;
}
};
};
const engine = (() => {
let queue = [];
let timer;
let state;
2024-05-19 04:37:53 +00:00
let time = Date.now();
let entities = {};
2024-05-19 22:07:43 +00:00
let components = {};
2024-05-19 04:37:53 +00:00
let events = {};
const engineTick = 1000 / 60;
const tick = () => {
let now = Date.now();
let delta = now - time;
time = now;
while (queue.length > 0) {
let eventName = queue.shift();
events[eventName]("raise", delta);
}
timer = setTimeout(tick, engineTick);
};
const halt = () => {
console.log("halted");
state="halted";
2024-05-19 04:37:53 +00:00
clearTimeout(timer);
};
return (message, ...messageArgs) => {
switch (message) {
2024-05-19 22:07:43 +00:00
case "queueEvent": {
2024-05-19 04:37:53 +00:00
queue.push(messageArgs[0]);
break;
2024-05-19 22:07:43 +00:00
}
case "events": {
2024-05-19 04:37:53 +00:00
return events;
2024-05-19 22:07:43 +00:00
}
case "entities": {
return entities;
}
case "components": {
return components;
}
case "world": {
return {
entities,
components,
events,
};
}
case "registerEntity": {
let node = messageArgs[0];
entities[node.id] = [];
2024-05-19 04:37:53 +00:00
break;
2024-05-19 22:07:43 +00:00
}
case "removeEntity": {
let node = messageArgs[0];
entities[node.id].forEach(([componentType, component]) => {
delete components[componentType].instances[component];
2024-05-19 22:07:43 +00:00
});
delete entities[node.id];
2024-05-19 22:07:43 +00:00
queue.push((_) => node.remove());
2024-05-19 04:37:53 +00:00
break;
2024-05-19 22:07:43 +00:00
}
case "registerComponentType": {
let [componentType, constructor] = messageArgs;
components[componentType] = {
constructor,
instances: {}
};
2024-05-19 04:37:53 +00:00
break;
2024-05-19 22:07:43 +00:00
}
case "getComponentConstructor": {
let [componentType] = messageArgs;
return components [componentType].constructor(engine);
}
2024-05-19 22:07:43 +00:00
case "addComponent": {
let [entity, componentType, component] = messageArgs;
entities[entity.id].push([componentType, component]);
components[componentType].instances[entity.id] = component;
2024-05-19 22:07:43 +00:00
break;
}
case "registerEvent": {
let eventName = messageArgs[0];
2024-05-19 04:37:53 +00:00
let newEvent = initEvent();
2024-05-19 22:07:43 +00:00
events[eventName] = newEvent;
2024-05-19 04:37:53 +00:00
break;
2024-05-19 22:07:43 +00:00
}
case "subscribeToEvent": {
let [eventName, subscriberName, newSubscriber] = messageArgs;
events[eventName]("addSubscriber", subscriberName, newSubscriber);
2024-05-19 04:37:53 +00:00
break;
2024-05-19 22:07:43 +00:00
}
case 'start': {
state="running";
2024-05-19 04:37:53 +00:00
tick();
break;
2024-05-19 22:07:43 +00:00
}
case 'state': {
return state;
}
2024-05-19 22:07:43 +00:00
case 'halt': {
2024-05-19 04:37:53 +00:00
halt();
break;
2024-05-19 22:07:43 +00:00
}
2024-05-19 04:37:53 +00:00
};
};
})();
initCollisionSystem (engine);
2024-05-19 22:07:43 +00:00
initTransformSystem(engine);
2024-05-19 04:37:53 +00:00
inputSystem(engine);
playerSystem(engine);
initEnvironmentSystem (engine);
2024-05-19 04:37:53 +00:00
engine("start");