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");