begin work on proper framework

This commit is contained in:
2025-02-04 16:46:35 -07:00
parent ed0daeef2b
commit b3772052f5
7 changed files with 477 additions and 339 deletions

34
lib/context.ts Normal file
View File

@@ -0,0 +1,34 @@
type ContextStore = Record<string, any>;
const contextStack: ContextStore[] = [];
const defaultContext: ContextStore = {};
export function setDefaultContext(context: ContextStore) {
Object.assign(defaultContext, context);
}
export function withContext<T>(context: ContextStore, fn: () => T): T {
contextStack.push(context);
try {
return fn();
} finally {
contextStack.pop();
}
}
export const ctx = new Proxy(
{},
{
get(_, prop: string) {
for (let i = contextStack.length - 1; i >= 0; i--) {
if (prop in contextStack[i]) return contextStack[i][prop];
}
if (prop in defaultContext) return defaultContext[prop]; // ✅ Fallback to default
throw new Error(`Context variable '${prop}' is not defined.`);
},
},
) as Record<string, any>;
export function getContext() {
return ctx;
}

41
lib/input.ts Normal file
View File

@@ -0,0 +1,41 @@
export class InputManager {
private keyStates: Map<string | number, boolean> = new Map();
private mouseStates: Map<string | number, boolean> = new Map();
private mouseLocation: { x: number; y: number } = { x: 0, y: 0 };
private mouseDelta: { x: number; y: number } = { x: 0, y: 0 };
constructor() {
document.addEventListener("keydown", (e) => {
this.keyStates.set(e.key, true);
});
document.addEventListener("keyup", (e) => {
this.keyStates.set(e.key, false);
});
document.addEventListener("mousedown", (e) => {
this.mouseStates.set(e.button, true);
});
document.addEventListener("mouseup", (e) => {
this.mouseStates.set(e.button, false);
});
self.addEventListener("mousemove", (e) => {
this.mouseLocation = { x: e.clientX, y: e.clientY };
this.mouseDelta = {
x: e.movementX,
y: e.movementY,
};
});
}
getKeyState(key: string | number) {
return this.keyStates.get(key);
}
getMouseState(key: string | number) {
return this.mouseStates.get(key);
}
getMouseLocation() {
return this.mouseLocation;
}
getMouseDelta() {
return this.mouseDelta;
}
}