html-tower/static/engine.js
2024-05-19 00:37:53 -04:00

82 lines
2.1 KiB
JavaScript

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 time = Date.now();
let entities = {};
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");
clearTimeout(timer);
};
return (message, ...messageArgs) => {
switch (message) {
case "queueEvent":
queue.push(messageArgs[0]);
break;
case "events":
return events;
break;
case "registerEntity":
break;
case "removeEntity":
break;
case "registerEvent":
{let eventName = messageArgs[0];
let newEvent = initEvent();
events[eventName] = newEvent;}
break;
case "subscribeToEvent":
{let eventName = messageArgs[0];
let subscriberName = messageArgs[1];
let newSubscriber = messageArgs[2];
events[eventName]("addSubscriber", subscriberName, newSubscriber);}
break;
case 'start':
tick();
break;
case 'halt':
halt();
break;
};
};
})();
inputSystem(engine);
playerSystem(engine);
engine("start");