@draug/engine 1.0.20 → 1.0.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/graph/dag.ts","../src/ecs/system.ts","../src/ecs/entity.ts","../src/ecs/constant.ts","../src/ecs/events-buffer.ts","../src/core/memory/pool.ts","../src/ecs/components/component-storage.ts","../src/ecs/components/utils.ts","../src/ecs/components/manager.ts","../src/ecs/resources/resources.ts","../src/ecs/command.ts","../src/ecs/query.ts","../src/ecs/plugin/plugin.ts","../src/ecs/world.ts","../src/runtime/runtime.ts","../src/runtime/clock.ts","../src/runtime/loop.ts","../src/assets/assets.ts","../src/logger/logger.ts","../src/engine.ts"],"sourcesContent":["export enum VisitedState {\n Unvisited = 0,\n Visiting = 1,\n Visited = 2,\n}\n\nexport class DAGNode<T> {\n public readonly data: T;\n public readonly vertices: DAGNode<T>[] = [];\n\n constructor(data: T, vertices?: DAGNode<T>[]) {\n this.data = data;\n if (vertices)\n this.vertices = vertices;\n }\n};\n\nexport class ErrDAGCycleDetected extends Error {\n constructor() {\n super(`Cycle detected!`);\n }\n}\nexport function topologicalSort<T>(nodes: Iterable<DAGNode<T>>): DAGNode<T>[] {\n const visited = new Map<DAGNode<T>, VisitedState>();\n const result: DAGNode<T>[] = [];\n\n const dfs = (node: DAGNode<T>) => {\n const state = visited.get(node) ?? VisitedState.Unvisited;\n\n if (state === VisitedState.Visited) return;\n if (state === VisitedState.Visiting) {\n throw new ErrDAGCycleDetected();\n }\n\n visited.set(node, VisitedState.Visiting);\n\n for (const child of node.vertices) {\n dfs(child);\n }\n\n visited.set(node, VisitedState.Visited);\n result.push(node);\n };\n\n\n for (const node of nodes) {\n dfs(node);\n }\n\n return result.reverse();\n}\n","import { DAGNode, topologicalSort } from '../core/graph/dag';\nimport type { ClassType, ComponentType } from '../types/class'\nimport type { World } from \"./world\";\nimport type { QueryParameters } from './query';\nimport type { Logger } from '../logger';\nimport type { Time } from '../runtime/clock';\n\n\nexport class SystemError extends Error {\n constructor(target: Function) {\n super(`[System Error] (System \"${target.name}\".`)\n }\n}\nexport class ErrNotASystem extends Error {\n constructor(target: Function) {\n super(`Provided class \"${target.name}\" is not a System! Extend your class from SystemBase.`)\n }\n}\nexport class ErrMissingSystemMetadata extends SystemError {\n constructor(target: SystemCtor) {\n super(target);\n this.message = `${this.message}: Missing system metadata! Define system class with @System decorator.`\n }\n};\n\nexport enum SystemPhase {\n PRE,\n MAIN,\n POST,\n};\n\nexport type SystemMetadata = {\n /**\n * ECS query definition used to select entities for this system execution.\n *\n * Determines the iteration set passed to {@link SystemBase.compute}.\n * The ECS runtime resolves entities based on this query each update.\n */\n query: Readonly<QueryParameters>;\n /**\n * Explicit list of component types required by the system but not necessarily\n * part of the iteration query.\n *\n * Used for:\n * - ensuring component storages are initialized in the world\n * - safe access via `world.components.getStorage`\n * - dependencies that should not affect entity selection\n *\n * This does NOT influence entity iteration; only runtime validation/setup.\n */\n requiredComponents: Set<ComponentType>;\n /**\n * Systems that must run before this one. Pass constructor arguments\n * `super(OtherSystemCtor, ...)` to add edges; each listed system is scheduled earlier than\n * this instance. Used when {@link SystemsManager.build} computes a topological execution order.\n */\n computeAfter?: Set<SystemCtor>;\n phase?: SystemPhase;\n name: string;\n};\nexport type SystemDecoratorProps = {\n query: SystemMetadata['query'];\n requiredComponents?: ComponentType[];\n computeAfter?: SystemCtor[];\n phase?: SystemPhase;\n name: SystemMetadata['name'];\n};\nconst SystemMetadataSymbol = Symbol(\"system\");\ntype FunctionWithMetadata = Function & { [SystemMetadataSymbol]?: SystemMetadata };\n\nexport function System(props: SystemDecoratorProps): ClassDecorator {\n return (target: Function) => {\n const systemTarget = target as FunctionWithMetadata;\n\n if ('__proto__' in systemTarget && systemTarget.__proto__ !== SystemBase) {\n throw new ErrNotASystem(target);\n }\n\n const query = { ...props.query };\n const requiredComponents = new Set(props.requiredComponents);\n const computeAfter = new Set(props.computeAfter);\n const phase = props.phase ?? SystemPhase.MAIN;\n const name = props.name ?? target.name;\n const metadata: SystemMetadata = { query, requiredComponents, computeAfter, phase, name };\n\n systemTarget[SystemMetadataSymbol] = metadata;\n };\n}\n\nexport function getSystemMetadata(system: SystemCtor): SystemMetadata {\n if (hasMetadata(system)) {\n return system[SystemMetadataSymbol] as SystemMetadata;\n }\n throw new ErrMissingSystemMetadata(system);\n}\n\n\nexport function hasMetadata(ctor: Function): ctor is Required<FunctionWithMetadata> {\n return SystemMetadataSymbol in ctor;\n}\n\nexport function isSystem(ctor: Function): boolean {\n return hasMetadata(ctor);\n}\n\n\nexport type SystemCtor<T extends SystemBase = SystemBase> = ClassType<T>;\n\n/**\n * Arguments passed to {@link SystemBase.compute} on each {@link SystemsManager.update} call.\n */\nexport type SystemComputeContext = {\n /** Entity IDs from the query for this {@link SystemBase.compute} invocation. */\n readonly entities: number[];\n /** ECS world instance. */\n readonly world: World;\n /** Delta time (seconds or your engine's convention) since the previous update. */\n readonly time: Time;\n /** Logger instance for debugging and diagnostics. */\n readonly logger: Logger;\n};\n\nexport type SystemInitContext = {\n world: World;\n logger: Logger;\n};\n\n/**\n * Base class for ECS systems executed by {@link SystemsManager}.\n *\n * Subclasses declare which components they iterate over (`queryComponents`), which component\n * types must exist in the world for registration (`requiredComponents`), and optional ordering\n * relative to other systems (`computeAfter` / `super(OtherSystem)`).\n */\nexport abstract class SystemBase {\n /**\n * Logic for one systems pass: run for all entities in {@link SystemComputeContext.entities}.\n */\n public abstract compute(ctx: SystemComputeContext): void;\n\n public onInit?(ctx: SystemInitContext): void;\n};\n\nexport class SystemsManager {\n private systems_ = new Map<SystemCtor, SystemBase>();\n private executionOrder_: SystemBase[] = [];\n private requiredComponents_: Set<ComponentType> = new Set();\n\n private dirty_ = true;\n\n constructor(\n private readonly world: World,\n private readonly logger: Logger,\n ) { }\n\n public getRequiredComponents(): ComponentType[] {\n return Array.from(this.requiredComponents_);\n }\n\n public register<T extends SystemBase>(sys: T): void {\n const ctor = sys.constructor as SystemCtor<T>;\n if (this.systems_.has(ctor)) throw new Error(\"Duplicate system\");\n const { query, requiredComponents } = getSystemMetadata(ctor);\n\n this.systems_.set(ctor, sys);\n\n const q = query;\n\n for (const c of q.include ?? [])\n this.requiredComponents_.add(c);\n\n for (const c of q.exclude ?? [])\n this.requiredComponents_.add(c);\n\n for (const c of q.anyOf ?? [])\n this.requiredComponents_.add(c);\n for (const c of requiredComponents)\n this.requiredComponents_.add(c);\n\n const meta = getSystemMetadata(ctor);\n\n this.logger.debug(() => `[Systems]: system \"${meta.name}\" was registered`);\n }\n\n public build(): void {\n this.buildSystemsArray();\n for (const sys of this.systems_.values()) {\n sys.onInit?.({ world: this.world, logger: this.logger });\n }\n this.logger.debug(() => `Built ${this.systems_.size} systems`);\n this.dirty_ = false;\n }\n\n private rebuild(): void {\n this.build();\n };\n\n public get<T extends SystemBase>(ctor: SystemCtor<T>): T {\n const s = this.systems_.get(ctor);\n\n if (!s)\n throw new Error(\"System not registered\");\n return s as T;\n }\n\n public update(time: Time): void {\n if (this.dirty_)\n this.rebuild();\n\n this.world.events.swapAll();\n\n for (const s of this.executionOrder_) {\n const { query } = getSystemMetadata(s.constructor as SystemCtor)\n const entities = this.world.query(query);\n s.compute({\n world: this.world,\n entities,\n time,\n logger: this.logger,\n });\n }\n }\n\n private buildSystemsArray(): void {\n const pre: SystemBase[] = [];\n const main: SystemBase[] = [];\n const post: SystemBase[] = [];\n const map = new Map<SystemCtor, DAGNode<SystemBase>>();\n\n for (const [ctor, system] of this.systems_.entries()) {\n const meta = getSystemMetadata(ctor);\n\n switch (meta.phase) {\n case SystemPhase.PRE:\n pre.push(system);\n break;\n\n case SystemPhase.MAIN:\n post.push(system);\n break;\n\n default:\n main.push(system);\n map.set(ctor, new DAGNode(system));\n break;\n }\n }\n\n for (const ctor of map.keys()) {\n const currentNode = map.get(ctor)!;\n const { computeAfter } = getSystemMetadata(ctor);\n for (const depCtor of computeAfter ?? []) {\n const depNode = map.get(depCtor);\n if (!depNode) {\n throw new Error(`Dependency ${depCtor.name} not registered`);\n }\n\n depNode.vertices.push(currentNode);\n }\n }\n\n this.executionOrder_ = [\n ...pre,\n ...topologicalSort(map.values()).map(x => x.data),\n ...post,\n ];\n }\n}","import type { Logger } from \"../logger\";\nimport type { ComponentType } from \"./components\";\nimport { World } from \"./world\";\n\nexport type EntityID = number;\n\nexport class UnregisteredComponentStorageError extends Error {\n constructor(component: ComponentType) {\n super(`Cannot get storage for component ${component.name}. Seems like it's not registered in world.`);\n }\n}\n\nexport class EntityMaskNotFoundError extends Error {\n constructor(id: EntityID) {\n super(`Cannot find bitmask for entity [${id}]. Seems like it's not registered in the EntityManager.`)\n }\n}\n\nexport class EntitiesManager {\n private id_: EntityID = 0;\n \n constructor(private readonly logger: Logger) {}\n \n private nextId(): EntityID {\n return ++this.id_;\n }\n\n public create(): EntityID {\n const id = this.nextId();\n this.logger.debug(() => `[Entities]: Created new entity with ID ${id}`);\n return id;\n }\n};\n\nexport class EntityRef {\n constructor(\n private world: World,\n public id: EntityID,\n ) { }\n\n public with<\n T extends ComponentType[],\n Result extends { [K in keyof T]: InstanceType<T[K]> }\n >(...components: T): Result {\n return components.map(c => {\n const s = this.world.components.getStorage(c);\n return s.tryGet(this.id);\n }) as Result;\n };\n}","export const ECS_DEFAULTS = {\n MAX_ENTITY_COUNT: Math.pow(2, 12),\n} as const;","export class EventBuffer<T extends unknown> {\n private readBuf: T[] = [];\n private writeBuf: T[] = [];\n public write(event: T): void {\n this.writeBuf.push(event);\n };\n\n /**\n * Advances the buffer to the next frame.\n *\n * Performs a double-buffer flip:\n * - Promotes all events written during the previous frame (`writeBuf`)\n * to be readable in the current frame (`readBuf`).\n * - Reuses the previous `readBuf` as the new `writeBuf` and clears it\n * to collect events for the next frame.\n *\n * After calling this method:\n * - `get()` will return a stable snapshot of events produced in the previous frame.\n * - `add()` will write into an empty buffer for the current frame.\n *\n * Guarantees:\n * - No events written during the current frame are visible until the next `swap()`.\n * - Readers observe a consistent, immutable snapshot within a frame.\n *\n * Expected to be called exactly once per frame, before system execution.\n */\n public swap() {\n const tmp = this.readBuf;\n this.readBuf = this.writeBuf;\n this.writeBuf = tmp;\n this.writeBuf.length = 0;\n }\n\n public read(): ReadonlyArray<T> {\n return this.readBuf;\n };\n public size(): number {\n return this.readBuf.length;\n }\n};\n\ntype EventKey<T> = symbol & { __type?: T };\n\nexport function createEventKey<T>(description?: string): EventKey<T> {\n return Symbol(description) as EventKey<T>;\n}\n\nexport class EventBus {\n private storage: Map<symbol, EventBuffer<any>> = new Map();\n public swapAll(): void {\n this.storage.forEach(s => s.swap());\n }\n\n public getBuffer<T>(key: EventKey<T>): EventBuffer<T> {\n let buf = this.storage.get(key);\n if (!buf) {\n buf = new EventBuffer<T>();\n this.storage.set(key, buf);\n }\n return buf;\n }\n}\n","export class ObjectPool<T extends object> {\n private pool_: T[];\n private factory_: () => T;\n private cursor_: number;\n\n constructor(factory: () => T, initialSize = 0) {\n this.pool_ = new Array(initialSize);\n this.factory_ = factory;\n this.cursor_ = initialSize - 1;\n }\n\n acquire(): T {\n if (this.cursor_ >= 0) {\n return this.pool_[this.cursor_--]!;\n }\n return this.factory_();\n }\n\n release(obj: T) {\n this.pool_[++this.cursor_] = obj;\n }\n\n private grow() {\n const oldSize = this.pool_.length;\n const newSize = oldSize * 2;\n for (let i = oldSize; i < newSize; i++) this.pool_[i] = this.factory_();\n this.cursor_ = newSize - 1;\n this.pool_.length = newSize;\n }\n}\n","import { ObjectPool } from \"../../core/memory/pool\";\nimport { Bitmap } from \"bitmap-index\";\nimport { ECS_DEFAULTS } from \"../constant\";\nimport type { ClassType } from \"../../types/class\";\n\nexport class ComponentStorage\n // Only pointer-types.\n <T extends object> {\n private bits_: Bitmap;\n private data_: T[] = [];\n private entityIds_: number[] = [];\n private indexMap_: Map<number, number> = new Map();\n private pool_: ObjectPool<T>;\n private id_: number = 0;\n private size_: number = 0;\n private cls: ClassType<T>\n\n constructor(cap = ECS_DEFAULTS.MAX_ENTITY_COUNT, factory: () => T, cls: ClassType<T>) {\n this.bits_ = new Bitmap(cap);\n this.pool_ = new ObjectPool(factory, 0);\n this.cls = cls;\n }\n public bitmap(): Bitmap {\n return this.bits_;\n }\n\n public get id(): number {\n return this.id_;\n }\n\n public _internalSetId(id: number): number {\n return this.id_ = id;\n }\n\n public add(id: number, initFn?: (obj: T) => T): T {\n if (this.indexMap_.has(id)) {\n throw new Error(`[ComponentStorage \"${this.cls.name}\"]: Entity ${id} already has this component`);\n }\n\n const obj = this.pool_.acquire();\n initFn?.(obj);\n\n const index = this.data_.length;\n this.data_.push(obj);\n this.entityIds_.push(id);\n this.indexMap_.set(id, index);\n\n this.bits_.set(id);\n this.size_++;\n\n return obj;\n }\n\n public remove(id: number): void {\n const index = this.indexMap_.get(id);\n if (index === undefined) return;\n\n this.bits_.remove(id);\n\n const lastIndex = this.data_.length - 1;\n const lastEntityId = this.entityIds_[lastIndex]!;\n const removedObj = this.data_[index]!;\n\n if (index !== lastIndex) {\n this.data_[index] = this.data_[lastIndex]!;\n this.entityIds_[index] = lastEntityId;\n this.indexMap_.set(lastEntityId, index);\n }\n\n this.data_.pop();\n this.entityIds_.pop();\n this.indexMap_.delete(id);\n\n this.pool_.release(removedObj);\n this.size_--;\n }\n\n public get(id: number): T | null {\n const index = this.indexMap_.get(id);\n return index !== undefined ? this.data_[index]! : null;\n }\n\n public tryGet(id: number): T {\n const index = this.indexMap_.get(id);\n if (index === undefined)\n throw new Error(`[ComponentStorage \"${this.cls.name}\"]: Requesting non-existing item with ID ${id}.`);\n return this.data_[index]!;\n }\n\n public writeComponentsToBuf(ids: ReadonlyArray<number>, out: T[]): number {\n let len = 0;\n for (const id of ids) {\n const index = this.indexMap_.get(id);\n if (index !== undefined) out[len++] = this.data_[index]!;\n }\n return len;\n }\n\n public has(id: number): boolean {\n return this.bits_.contains(id);\n }\n\n\n public size(): number {\n return this.size_;\n }\n\n public forEach(cb: (id: number) => void): void {\n for (const id of this.entityIds_) {\n cb(id);\n }\n }\n};\n","const registry = new Map<Function, number>();\nlet id = 0;\n\nexport type ComponentMetadata = {\n name: string;\n id: number;\n};\n\nconst ComponentMetadataSymbol = Symbol(\"component\");\ntype FunctionWithMetadata = Function & { [ComponentMetadataSymbol]: ComponentMetadata };\nexport type ComponentOptions = {\n name: string;\n};\nexport function Component(options: ComponentOptions): ClassDecorator {\n return (target: Function) => {\n const metadata: ComponentMetadata = {\n name: options.name,\n id: ++id,\n };\n\n registry.set(target, metadata.id);\n (target as FunctionWithMetadata)[ComponentMetadataSymbol] = metadata;\n }\n};\n\nexport function getComponentId(ctor: Function): number {\n const id = registry.get(ctor);\n if (id === undefined) {\n throw new Error(`Component not registered: ${ctor.name}`);\n }\n return id;\n}\nclass ErrNotComponent extends Error {\n constructor(ctor: Function) {\n super(`Class ${ctor.name} is not a Component. Use @Component decorator to define components.`);\n }\n}\n\nexport function getComponentMetadata(component: Function): ComponentMetadata {\n if (isComponent(component)) {\n return component[ComponentMetadataSymbol] as ComponentMetadata;\n }\n throw new ErrNotComponent(component);\n}\n\nfunction isComponent(ctor: Function): ctor is FunctionWithMetadata {\n return ComponentMetadataSymbol in ctor;\n}","import { UnregisteredComponentStorageError } from \"../entity\";\nimport { ECS_DEFAULTS } from \"../constant\";\nimport { ComponentStorage } from \"./component-storage\";\nimport type { ComponentType } from \"./types\";\nimport { getComponentId } from \".\";\nimport type { Logger } from \"../../logger\";\nimport { getComponentMetadata } from \"./utils\";\n\ntype RegisterComponentStorageOptions<T extends object> = {\n factory?: () => T;\n}\n\ntype RegisterComponentOptions<T extends object> = RegisterComponentStorageOptions<T>\n\nexport class ComponentAlreadyRegisteredError extends Error {\n constructor(component: ComponentType) {\n super(`Component ${component.name} already registered!`)\n }\n}\n\nexport class ComponentsManager {\n private readonly storages_ = new Map<ComponentType, ComponentStorage<any>>();\n private currId_ = 0;\n private nextId(): number {\n return ++this.currId_;\n }\n\n constructor(\n private readonly logger: Logger,\n private maxEntityCount: number = ECS_DEFAULTS.MAX_ENTITY_COUNT\n ) { }\n\n public register<T extends object>(\n component: ComponentType<T>,\n opts?: RegisterComponentOptions<T>\n ): ComponentStorage<T> {\n if (this.storages_.has(component))\n return this.storages_.get(component)!;\n\n const store: ComponentStorage<T> = this.createComponentStore(component, opts);\n\n this.storages_.set(component, store);\n const meta = getComponentMetadata(component);\n this.logger.debug(() => `[Components]: Registered component \"${meta.name}\"`);\n return store;\n }\n\n private createComponentStore<T extends object>(component: ComponentType<T>, opts?: RegisterComponentOptions<T>): ComponentStorage<T> {\n const factory = opts?.factory ?? ((...args: any[]) => new component(...args));\n const store = new ComponentStorage(this.maxEntityCount, factory, component);\n store._internalSetId(this.nextId());\n return store;\n }\n\n\n public getStorage<T extends object>(component: ComponentType<T>): ComponentStorage<T> {\n const store = this.storages_.get(component);\n if (store === undefined)\n throw new UnregisteredComponentStorageError(component);\n\n return store;\n }\n\n public getComponentId(ctor: ComponentType): number {\n return getComponentId(ctor);\n }\n}","import type { Logger } from \"../../logger\";\nimport type { ClassType } from \"../../types/class\";\n\nexport type ResourceMetadata = {\n name: string;\n};\ntype ResourceParams = {\n name: string;\n};\nconst ResourceMetadataSymbol = Symbol(\"resource\");\ntype FunctionWithMetadata = Function & { [ResourceMetadataSymbol]: ResourceMetadata };\nexport function Resource(params: ResourceParams): ClassDecorator {\n return (target: Function) => {\n const metadata: ResourceMetadata = {\n name: params.name,\n };\n (target as FunctionWithMetadata)[ResourceMetadataSymbol] = metadata;\n }\n}\n\nclass ErrNotResource extends Error {\n constructor(ctor: Function) {\n super(`Class ${ctor.name} is not a Resource. Use @Resource decorator to define resources.`);\n }\n}\n\nexport function getResourceMetadata(resource: Function): ResourceMetadata {\n if (isResource(resource)) {\n return resource[ResourceMetadataSymbol] as ResourceMetadata;\n }\n throw new ErrNotResource(resource);\n}\n\nfunction isResource(ctor: Function): ctor is FunctionWithMetadata {\n return ResourceMetadataSymbol in ctor;\n}\n\n\nexport class ResourcesManager {\n private readonly items_ = new Map<ClassType<any>, unknown>();\n\n constructor(private readonly logger: Logger) { };\n\n public insert<T extends object>(type: ClassType<T>, value: T): T {\n this.items_.set(type, value);\n const metadata = getResourceMetadata(type);\n this.logger.debug(() => `[Resources]: Inserted new Resource \"${metadata.name}\"`);\n return value;\n };\n public get<T extends object>(type: ClassType<T>): T {\n const value = this.items_.get(type);\n const meta = getResourceMetadata(type);\n if (!value)\n throw new Error(`Resource of class ${meta.name} does not exist!`);\n\n return value as T;\n }\n public getOrInsert<T extends object>(type: ClassType<T>, factory: () => T): T {\n let value: T | null = (this.items_.get(type) ?? null) as T | null;\n if (value === null) {\n value = factory();\n this.insert(type, value);\n }\n\n return value;\n }\n public remove<T>(type: ClassType<T>): void {\n const meta = getResourceMetadata(type);\n this.logger.debug(() => `[Resources]: Removed resource \"${meta.name}\"`);\n this.items_.delete(type);\n }\n};\n","import type { Logger } from \"../logger\";\nimport type { ComponentType } from \"./components\";\nimport { getComponentMetadata } from \"./components/utils\";\nimport { World } from \"./world\";\n\nexport type WorldCommand = (world: World) => void;\nexport type ComponentInitFn<C extends ComponentType> =\n (component: InstanceType<C>) => void;\n\nexport type CreateEntityComponentEntry<T extends ComponentType = ComponentType> =\n T extends unknown ? [T, ComponentInitFn<T>] : never;\n\nexport function entry<T extends ComponentType>(\n component: T,\n init: ComponentInitFn<T> = () => { }\n): CreateEntityComponentEntry {\n return [component, init as ComponentInitFn<ComponentType>];\n}\n\nexport class Commands {\n private readonly commandsQueue_: WorldCommand[] = [];\n\n constructor(\n private readonly world: World,\n private readonly logger: Logger,\n ) { }\n\n public add(cmd: WorldCommand): void {\n this.commandsQueue_.push(cmd);\n };\n public flush(world: World): void {\n for (const cmd of this.commandsQueue_)\n cmd(world);\n this.commandsQueue_.length = 0;\n }\n public createEntity(...entries: CreateEntityComponentEntry[]): number {\n const id = this.world.entities.create();\n\n const cmd = (world: World) => {\n for (const [cls, initFn] of entries) {\n world.addComponent(id, cls, initFn);\n }\n }\n this.add(cmd);\n this.logger.debug(() => {\n const components = entries.map(x => getComponentMetadata(x[0]).name).join(\", \")\n return `[Commands.createEntity]: Created new entity with ID ${id}. Linked components: [${components}]`;\n });\n return id;\n }\n};\n","import type { ComponentType } from \"./components\";\nimport type { EntityID } from \"./entity\";\nimport type { World } from \"./world\";\nimport { Bitmap } from \"bitmap-index\";\n\nexport type QueryParameters = {\n include?: ComponentType[];\n exclude?: ComponentType[];\n anyOf?: ComponentType[];\n excludeEntitiesIds?: number[];\n filter?: (id: number) => boolean;\n};\n\ntype CachedQuery = {\n params: QueryParameters;\n bitmap: Bitmap;\n dirty: boolean;\n deps: Set<ComponentType>;\n};\n\nexport class QueryManager {\n private cache = new Map<string, CachedQuery>();\n\n constructor(\n private readonly world: World,\n ) { }\n\n public get(params: QueryParameters): EntityID[] {\n const key = this.getKey(params);\n let entry = this.cache.get(key);\n\n if (!entry) {\n entry = {\n params,\n bitmap: this.compute(params),\n dirty: false,\n deps: this.collectDeps(params),\n };\n this.cache.set(key, entry);\n }\n\n if (entry.dirty) {\n entry.bitmap = this.compute(entry.params);\n entry.dirty = false;\n }\n\n // 1. Динамически применяем исключение конкретных ID \n let targetBitmap = entry.bitmap;\n if (params.excludeEntitiesIds?.length) {\n targetBitmap = entry.bitmap.clone(); \n const excludeBm = new Bitmap();\n for (const id of params.excludeEntitiesIds) {\n excludeBm.set(id);\n }\n targetBitmap.andNot(excludeBm);\n }\n\n // 2. Динамически применяем фильтр\n if (params.filter) {\n const result: number[] = [];\n targetBitmap.range(id => {\n if (params.filter!(id)) result.push(id);\n });\n return result;\n }\n\n return this.extractIds(targetBitmap);\n }\n\n public invalidate(component: ComponentType): void {\n for (const entry of this.cache.values()) {\n if (entry.deps.has(component)) {\n entry.dirty = true;\n }\n }\n }\n\n private getKey(q: QueryParameters): string {\n return [\n this.ids(q.include),\n this.ids(q.exclude),\n this.ids(q.anyOf),\n ].join(\"|\");\n }\n\n private ids(arr?: ComponentType[]): string {\n if (!arr || arr.length === 0) return \"\";\n return arr\n .map(c => this.world.components.getComponentId(c))\n .sort((a, b) => a - b)\n .join(\",\");\n }\n\n private collectDeps(q: QueryParameters): Set<ComponentType> {\n const set = new Set<ComponentType>();\n q.include?.forEach(c => set.add(c));\n q.exclude?.forEach(c => set.add(c));\n q.anyOf?.forEach(c => set.add(c));\n return set;\n }\n\n private compute(params: QueryParameters): Bitmap {\n let result = this.combineBitmaps(params.include, 'and');\n\n const any = this.combineBitmaps(params.anyOf, 'or');\n if (any) {\n result = result ? result.and(any) : any;\n }\n\n if (!result) {\n return new Bitmap();\n }\n\n this.applyExclusions(result, params.exclude);\n return result;\n }\n\n private combineBitmaps(\n components: ComponentType[] | undefined,\n op: 'and' | 'or'\n ): Bitmap | null {\n if (!components?.length) return null;\n\n let result: Bitmap | null = null;\n let hasAtLeastOneValid = false;\n\n for (const c of components) {\n const bm = this.world.components.getStorage(c)?.bitmap();\n\n if (!bm) {\n if (op === 'and') {\n return new Bitmap();\n }\n continue;\n }\n\n hasAtLeastOneValid = true;\n if (!result) {\n result = bm.clone();\n } else {\n op === 'and' ? result.and(bm) : result.or(bm);\n }\n }\n\n if (op === 'or' && !hasAtLeastOneValid) {\n return new Bitmap();\n }\n\n return result;\n }\n\n private applyExclusions(\n target: Bitmap,\n excludeComponents?: ComponentType[],\n ): void {\n if (excludeComponents?.length) {\n for (const c of excludeComponents) {\n const bm = this.world.components.getStorage(c)?.bitmap();\n if (bm) target.andNot(bm);\n }\n }\n }\n\n private extractIds(bitmap: Bitmap): number[] {\n const result: number[] = [];\n bitmap.range(id => { result.push(id) });\n return result;\n }\n}","import type { ClassType, ComponentType } from \"../../types/class\";\nimport { SystemBase } from \"../system\";\nimport type { World } from \"../world\";\nimport { DAGNode, topologicalSort, ErrDAGCycleDetected } from '../../core/graph/dag';\nimport type { Logger } from \"../../logger\";\n\nexport type PluginID = string;\nexport type PluginConstructor = ClassType<PluginBase>;\n\nexport type PluginDependencies = {\n components?: ComponentType[];\n resources?: ClassType<any>[];\n systems?: ClassType<SystemBase>[];\n plugins?: Array<{ plugin: PluginConstructor; version?: string }>;\n}\n\nexport interface PluginMetadata {\n id: PluginID;\n version: string;\n name: string;\n dependencies?: PluginDependencies;\n}\n\nconst PluginMetadataSymbol = Symbol(\"plugin\");\n\nexport function Plugin(metadata: PluginMetadata): ClassDecorator {\n return (target: Function) => {\n if ('__proto__' in target && target.__proto__ !== PluginBase)\n throw new ErrNotAPlugin(target);\n\n (target as FunctionWithMetadata)[PluginMetadataSymbol] = metadata;\n };\n}\n\nexport function getPluginMetadata(plugin: PluginConstructor): PluginMetadata {\n if (hasMetadata(plugin)) {\n return plugin[PluginMetadataSymbol] as PluginMetadata;\n }\n throw new ErrMissingPluginMetadata(plugin);\n}\n\ntype FunctionWithMetadata = Function & { [PluginMetadataSymbol]: PluginMetadata };\n\nexport function hasMetadata(ctor: Function): ctor is FunctionWithMetadata {\n return PluginMetadataSymbol in ctor;\n}\n\nexport function isPlugin(ctor: Function): boolean {\n return hasMetadata(ctor);\n}\n\nexport abstract class PluginBase {\n public onPluginLoad?: () => void;\n public onPluginUnload?: (world: World) => void;\n public onAfterWorldInit?: (world: World) => void;\n}\n\ntype PluginManagerInternalPluginStorageItem<T extends PluginConstructor = PluginConstructor> = {\n ctor: T;\n ctorParams: ConstructorParameters<T>;\n instance?: InstanceType<T>;\n metadata: PluginMetadata;\n};\n\nexport class PluginError extends Error {\n constructor(pluginId: PluginConstructor) {\n super(`Plugin error! Plugin [${pluginId}]`);\n }\n}\n\nexport class ErrNotAPlugin extends Error {\n constructor(target: Function) {\n super(`Provided class ${target.name} is not a Plugin! Every plugin must extends of PluginBase class.`);\n }\n}\n\nexport class ErrMissingPluginMetadata extends Error {\n constructor(plugin: PluginConstructor) {\n super(`Provided class ${plugin.name}: Missing plugin metadata! Define plugin class with @Plugin decorator.`);\n }\n}\n\nexport class ErrUnknownPlugin extends PluginError {\n constructor(pluginId: PluginConstructor) {\n super(pluginId);\n this.message = `${super.message}: Plugin not found in manager.`;\n }\n}\n\nexport class ErrPluginNotInit extends PluginError {\n constructor(pluginId: PluginConstructor) {\n super(pluginId);\n this.message = `${super.message}: Plugin not initiated yet. You must use PluginsManager.build() before getting instance.`;\n }\n}\n\nexport class ErrMissingPluginDependency extends PluginError {\n constructor(pluginId: PluginConstructor, missingDepId: PluginConstructor) {\n super(pluginId);\n this.message = `${super.message}: Missing required dependency [${missingDepId}]. Install it first.`;\n }\n}\n\nexport class ErrDAGCycleDetectedPlugin extends Error {\n constructor() {\n super(`Cycle detected in plugin dependencies!`);\n }\n}\n\nexport class PluginsManager {\n private plugins_: Map<PluginConstructor, PluginManagerInternalPluginStorageItem> = new Map();\n private isInitiated_ = false;\n constructor(private readonly logger: Logger) { }\n\n public install<T extends PluginConstructor>(plugin: T, ...constructorProps: ConstructorParameters<T>): void {\n if (!isPlugin(plugin))\n throw new ErrMissingPluginMetadata(plugin);\n\n const metadata = getPluginMetadata(plugin);\n\n if (this.plugins_.has(plugin))\n return;\n\n const entry: PluginManagerInternalPluginStorageItem<T> = {\n ctor: plugin,\n ctorParams: constructorProps,\n metadata,\n };\n\n this.plugins_.set(plugin, entry);\n this.logger.debug(() => `[Plugins]: Installed plugin ${metadata.name} (${metadata.version})`);\n }\n\n public build(): void {\n if (this.plugins_.size === 0) {\n return;\n }\n const nodes = new Map<PluginConstructor, DAGNode<PluginConstructor>>();\n for (const id of this.plugins_.keys()) {\n nodes.set(id, new DAGNode(id));\n }\n\n for (const [plugin, entry] of this.plugins_) {\n const node = nodes.get(plugin)!;\n const depPlugins = entry.metadata.dependencies?.plugins ?? [];\n\n for (const dep of depPlugins) {\n const depNode = nodes.get(dep.plugin);\n if (!depNode) {\n throw new ErrMissingPluginDependency(plugin, dep.plugin);\n }\n depNode.vertices.push(node);\n }\n }\n\n let sortedNodes: DAGNode<PluginConstructor>[];\n try {\n sortedNodes = topologicalSort(nodes.values());\n } catch (e) {\n if (e instanceof ErrDAGCycleDetected) {\n throw new ErrDAGCycleDetectedPlugin();\n }\n throw e;\n }\n\n for (const node of sortedNodes) {\n const entry = this.plugins_.get(node.data)!;\n const { ctor, ctorParams } = entry;\n const instance = new ctor(...ctorParams) as PluginBase;\n entry.instance = instance;\n instance.onPluginLoad?.();\n }\n\n this.isInitiated_ = true;\n this.logger.debug(() => `[Plugins]: Plugins built successfully!`);\n }\n\n /**\n * @internal\n */\n public __internal__onAfterWorldInit(world: World) {\n for (const p of this.plugins_.values()) {\n p.instance?.onAfterWorldInit?.(world);\n }\n\n }\n\n public getPluginMetadata(plugin: PluginConstructor): PluginMetadata {\n const entry = this.plugins_.get(plugin);\n if (!entry) throw new ErrUnknownPlugin(plugin);\n return entry.metadata;\n }\n\n public getPluginInstance<T extends PluginBase>(plugin: ClassType<T>): T {\n const entry = this.plugins_.get(plugin);\n if (!entry) throw new ErrUnknownPlugin(plugin);\n if (!entry.instance) throw new ErrPluginNotInit(plugin);\n\n if (!this.isInitiated_) {\n throw new ErrPluginNotInit(plugin);\n }\n\n return entry.instance as T;\n }\n\n private resolveId(pluginOrId: PluginConstructor | PluginID): PluginID {\n if (typeof pluginOrId === 'string') {\n return pluginOrId;\n }\n\n if (!isPlugin(pluginOrId)) {\n throw new ErrMissingPluginMetadata(pluginOrId);\n }\n\n return getPluginMetadata(pluginOrId).id;\n }\n};\n","/*\nECS World implementation\n⢀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\n⢻⣿⡗⢶⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣠⣄\n⠀⢻⣇⠀⠈⠙⠳⣦⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⠶⠛⠋⣹⣿⡿\n⠀⠀⠹⣆⠀⠀⠀⠀⠙⢷⣄⣀⣀⣀⣤⣤⣤⣄⣀⣴⠞⠋⠉⠀⠀⠀⢀⣿⡟⠁\n⠀⠀⠀⠙⢷⡀⠀⠀⠀⠀⠉⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⡾⠋⠀⠀\n⠀⠀⠀⠀⠈⠻⡶⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣠⡾⠋⠀⠀⠀⠀\n⠀⠀⠀⠀⠀⣼⠃⠀⢠⠒⣆⠀⠀⠀⠀⠀⠀⢠⢲⣄⠀⠀⠀⢻⣆⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⢰⡏⠀⠀⠈⠛⠋⠀⢀⣀⡀⠀⠀⠘⠛⠃⠀⠀⠀⠈⣿⡀⠀⠀⠀⠀\n⠀⠀⠀⠀⣾⡟⠛⢳⠀⠀⠀⠀⠀⣉⣀⠀⠀⠀⠀⣰⢛⠙⣶⠀⢹⣇⠀⠀⠀⠀\n⠀⠀⠀⠀⢿⡗⠛⠋⠀⠀⠀⠀⣾⠋⠀⢱⠀⠀⠀⠘⠲⠗⠋⠀⠈⣿⠀⠀⠀⠀\n⠀⠀⠀⠀⠘⢷⡀⠀⠀⠀⠀⠀⠈⠓⠒⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⡇⠀⠀⠀\n⠀⠀⠀⠀⠀⠈⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣧⠀⠀⠀\n⠀⠀⠀⠀⠀⠈⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠁⠀⠀⠀\n*/\n\nimport { type ClassType, type ComponentType } from \"../types/class\";\nimport { EntitiesManager, type EntityID, EntityRef } from \"./entity\";\nimport { SystemsManager } from \"./system\";\nimport { ECS_DEFAULTS } from \"./constant\";\nimport { EventBus } from \"./events-buffer\";\nimport { ComponentsManager } from \"./components\";\nimport { ResourcesManager } from \"./resources/resources\";\nimport { Commands } from \"./command\";\nimport { QueryManager, type QueryParameters } from \"./query\";\nimport { PluginsManager } from \"./plugin\";\nimport type { Logger } from \"../logger\";\nimport type { Clock } from \"../runtime\";\n\nexport type WorldConstructor = {\n maxEntityCount?: number;\n logger: Logger;\n};\n\nexport class World {\n public readonly entities: EntitiesManager;\n public readonly components: ComponentsManager;\n public readonly systems: SystemsManager;\n public readonly events: EventBus;\n public readonly resources: ResourcesManager;\n public readonly commands: Commands;\n public readonly queries: QueryManager;\n public readonly plugins: PluginsManager;\n private readonly logger: Logger;\n\n private entityRefs_ = new Map<number, EntityRef>();\n private updatesCount_ = 0;\n public get updatesCount(): number {\n return this.updatesCount_;\n }\n\n constructor(params: WorldConstructor) {\n this.entities = new EntitiesManager(params.logger);\n this.components = new ComponentsManager(params.logger, params.maxEntityCount ?? ECS_DEFAULTS.MAX_ENTITY_COUNT);\n this.systems = new SystemsManager(this, params.logger);\n this.events = new EventBus();\n this.resources = new ResourcesManager(params.logger);\n this.commands = new Commands(this, params.logger);\n this.queries = new QueryManager(this);\n this.plugins = new PluginsManager(params.logger);\n this.logger = params.logger;\n }\n\n public getEntityRef(id: number): EntityRef {\n let ref = this.entityRefs_.get(id);\n if (!ref) {\n ref = new EntityRef(this, id);\n this.entityRefs_.set(id, ref);\n }\n return ref;\n }\n public query(params: QueryParameters): number[] {\n return this.queries.get(params);\n }\n\n public removeComponent<T extends object>(ref: EntityRef, component: ComponentType<T>): void;\n public removeComponent<T extends object>(entity: EntityID, component: ComponentType<T>): void;\n public removeComponent<T extends object>(\n entity: EntityID | EntityRef,\n component: ComponentType<T>\n ): void {\n const id = typeof entity === 'number' ? entity : entity.id;\n\n const storage = this.components.getStorage(component);\n storage.remove(id);\n\n this.queries.invalidate(component);\n }\n\n public addComponent<T extends object>(id: EntityID, component: ClassType<T>, initFn?: (obj: T) => void): T;\n public addComponent<T extends object>(id: EntityRef, component: ClassType<T>, initFn?: (obj: T) => void): T\n public addComponent<T extends object>(entity: EntityID | EntityRef, component: ClassType<T>, initFn?: (obj: T) => void): T {\n const storage = this.components.getStorage(component);\n let id: number;\n if (typeof entity === 'number') {\n id = entity;\n } else {\n id = entity.id;\n }\n const c = storage.add(id, (o) => {\n if (initFn) {\n initFn(o);\n }\n return o;\n });\n this.queries.invalidate(component);\n\n return c;\n };\n\n public update(clock: Clock): void {\n this.systems.update(clock.getTime());\n this.commands.flush(this);\n this.updatesCount_++;\n }\n\n public build(): void {\n this.plugins.build();\n this.logger.debug(() => \"World was built successfully\");\n }\n};\n","import type { World } from \"../ecs/world\";\nimport type { Loop } from \"./loop\";\n\nexport class Runtime {\n constructor(\n private readonly loop: Loop,\n ) { };\n public run(world: World): void {\n this.loop.start(world)\n }\n}; ","export interface TimeSource {\n now(): number;\n}\n\nexport class Clock {\n private lastTimeMs_: number;\n private ellapsedTime_: number = 0;\n private delta_: number = 0;\n private readonly time_: Time = {\n delta: 0,\n elapsed: 0,\n };\n\n public constructor(\n private readonly timeSource_: TimeSource,\n ) {\n this.lastTimeMs_ = timeSource_.now();\n }\n\n\n public get deltaMs(): number {\n return this.delta_;\n }\n public get ellapsedTime(): number {\n return this.ellapsedTime_;\n }\n\n public tick(): void {\n const now = this.timeSource_.now();\n const dt = Math.min(now - this.lastTimeMs_, 100);\n this.delta_ =\n this.time_.delta =\n dt / 1000;\n this.ellapsedTime_ =\n this.time_.elapsed +=\n dt / 1000;\n this.lastTimeMs_ = now;\n }\n\n public getTime(): Readonly<Time> {\n return this.time_;\n }\n};\n\nexport type Time = {\n delta: number;\n elapsed: number;\n};","import { World } from \"../ecs/world\";\nimport { Clock } from \"./clock\";\n\nexport type StepFunction = (dt: number, world: World) => void;\nexport type PlatformLoop = (callback: () => void) => void;\n\nexport class Loop {\n private running = false;\n\n constructor(\n private readonly clock: Clock,\n private readonly stepFn: StepFunction,\n private readonly platformLoop: PlatformLoop,\n ) { };\n\n public start(world: World) {\n this.running = true;\n\n const loop = () => {\n if (!this.running) return;\n\n this.clock.tick();\n this.stepFn(this.clock.deltaMs, world);\n\n this.platformLoop(loop);\n };\n\n this.platformLoop(loop);\n }\n\n public stop() {\n this.running = false;\n }\n};","import type { ClassType } from \"../types/class\";\n\nexport enum AssetState {\n NOT_READY = 1,\n LOADING = 2,\n READY = 3,\n};\nexport type AssetLoader<T> = (url: string) => Promise<T>;\nexport type AssetDisposer<T> = (r: T) => void | Promise<void>;\n\nexport class Asset<TData> {\n private data_: TData | null = null;\n private state_ = AssetState.NOT_READY;\n private loading_: Promise<TData> | null = null;\n private disposed_ = false;\n\n constructor(\n public readonly id: number,\n private readonly url: string,\n private readonly loader: AssetLoader<TData>,\n private readonly disposer: AssetDisposer<TData>,\n ) { }\n\n public async load(): Promise<TData> {\n if (this.state_ === AssetState.READY)\n return this.data_!;\n\n if (this.state_ === AssetState.LOADING)\n return this.loading_!;\n\n this.state_ = AssetState.LOADING;\n this.disposed_ = false;\n\n this.loading_ = this.loader(this.url)\n .then(data => {\n if (this.disposed_) return data;\n\n this.data_ = data;\n this.state_ = AssetState.READY;\n this.loading_ = null;\n return data;\n }).catch(err => {\n this.state_ = AssetState.NOT_READY;\n this.loading_ = null;\n throw err;\n });\n\n return this.loading_;\n }\n private reset() {\n this.data_ = null;\n this.loading_ = null;\n this.state_ = AssetState.NOT_READY;\n }\n\n public async dispose(): Promise<void> {\n this.disposed_ = true;\n\n if (this.data_)\n await this.disposer(this.data_);\n\n this.reset();\n }\n\n public getData(): TData {\n if (this.state_ !== AssetState.READY)\n throw new Error(\"Data is not loaded yet!\");\n return this.data_!;\n }\n}\n\nexport type AssetID = number;\nexport type AssetIDGenerator = () => AssetID;\nexport class AssetStorage<TData> {\n private readonly items_ = new Map<AssetID, Asset<TData>>();\n constructor(\n private readonly nextIdFn_: AssetIDGenerator,\n private readonly defaultLoader_: AssetLoader<TData>,\n private readonly defaultDisposer_: AssetDisposer<TData>,\n ) { };\n\n private newAsset(id: number, url: string, loader: AssetLoader<TData>, disposer: AssetDisposer<TData>): Asset<TData> {\n // TODO: Maybe object pool or something. By now its only allocate new object.\n return new Asset(id, url, loader, disposer);\n }\n\n public add(url: string): Asset<TData> {\n const id = this.nextIdFn_();\n const rs = this.newAsset(id, url, this.defaultLoader_, this.defaultDisposer_);\n this.items_.set(id, rs);\n\n return rs;\n };\n\n public addCustom(url: string, customLoader: AssetLoader<TData>, customDisposer: AssetDisposer<TData>): Asset<TData> {\n const id = this.nextIdFn_();\n const rs = this.newAsset(id, url, customLoader, customDisposer);\n this.items_.set(id, rs);\n\n return rs;\n }\n\n public get(id: AssetID): Asset<TData> | null {\n const item = this.items_.get(id);\n return item ?? null;\n }\n\n public tryGet(id: AssetID): Asset<TData> {\n const item = this.items_.get(id);\n if (!item)\n throw new Error(`Asset with id ${id} in storage ${this.constructor.name} not exist`);\n\n return item;\n }\n\n public async remove(id: AssetID): Promise<void> {\n const item = this.items_.get(id);\n if (!item) return;\n\n await item.dispose();\n this.items_.delete(id);\n }\n\n public async loadAll(): Promise<void> {\n await Promise.all(\n Array.from(this.items_.values(), r => r.load())\n );\n }\n\n public async clearAll(): Promise<void> {\n await Promise.all(\n Array.from(this.items_.values(), r => r.dispose())\n );\n this.items_.clear();\n }\n}\n\nconst NOOP_DISPOSER: AssetDisposer<any> = async () => { };\nexport class AssetsManager {\n private readonly storages_ = new Map<ClassType<Asset<any>>, AssetStorage<any>>();\n private currId = 0;\n private nextIdFn = () => {\n return ++this.currId;\n }\n public register<T>(\n res: ClassType<Asset<T>>,\n defaultLoader: AssetLoader<T>,\n defaultDisposer: AssetDisposer<T> = NOOP_DISPOSER,\n ): AssetStorage<T> {\n const storage = new AssetStorage(\n this.nextIdFn,\n defaultLoader,\n defaultDisposer,\n );\n this.storages_.set(res, storage);\n\n return storage;\n }\n\n public getStorage<T>(res: ClassType<Asset<T>>): AssetStorage<T> | null {\n return this.storages_.get(res) ?? null;\n }\n\n public tryGetStorage<T>(res: ClassType<Asset<T>>): AssetStorage<T> {\n const s = this.storages_.get(res);\n if (!s)\n throw new Error(`Storage ${res.name} is not registered!`);\n\n return s;\n }\n\n public async loadAll(): Promise<void> {\n await Promise.all(Array.from(this.storages_.values(), (s) => s.loadAll()));\n }\n\n public disposeAll(): void {\n Array.from(this.storages_.values(), (s) => s.clearAll())\n }\n}\n","export enum LogLevel {\n Debug,\n Info,\n Warn,\n Error,\n}\nexport type LogMessage = () => string;\n\nexport interface Logger {\n debug(message: LogMessage): void;\n info(message: LogMessage): void;\n warn(message: LogMessage): void;\n error(message: LogMessage): void;\n}\n\nexport class NoopLogger implements Logger {\n public debug(): void { }\n public info(): void { }\n public warn(): void { }\n public error(): void { }\n}","import { AssetsManager } from \"./assets/assets\";\nimport { ECS_DEFAULTS } from \"./ecs/constant\";\nimport { World } from \"./ecs/world\";\nimport { NoopLogger, type Logger } from \"./logger/logger\";\nimport { Loop, Runtime } from \"./runtime\";\n\nexport type EngineConstructor = {\n loop: Loop;\n logger?: Logger;\n maxEntityCount?: number;\n};\n\nexport class Engine {\n public readonly runtime: Runtime;\n public readonly assets = new AssetsManager();\n public readonly world: World;\n public readonly logger: Logger;\n constructor(params: EngineConstructor) {\n this.runtime = new Runtime(params.loop);\n this.logger = params.logger ?? new NoopLogger();\n this.world = new World({\n logger: this.logger,\n maxEntityCount: params.maxEntityCount ?? ECS_DEFAULTS.MAX_ENTITY_COUNT,\n });\n }\n\n public init(): void {\n this.world.build();\n }\n\n public start(): void {\n this.runtime.run(this.world);\n }\n};\n"],"mappings":"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","names":["VisitedState","SystemPhase","id","id","id","id","id","Bitmap","entry","id","hasMetadata","entry","id","World","id","AssetState","id","LogLevel","World"]}
1
+ {"version":3,"sources":["../src/runtime/runtime.ts","../src/runtime/clock.ts","../src/runtime/loop.ts","../src/assets/assets.ts","../src/logger/logger.ts","../src/std/utils.ts","../src/engine.ts"],"sourcesContent":["import type { World } from \"../ecs/world\";\nimport type { Loop } from \"./loop\";\n\nexport class Runtime {\n constructor(\n private readonly loop: Loop,\n ) { };\n public run(world: World): void {\n this.loop.start(world)\n }\n}; ","export interface TimeSource {\n now(): number;\n}\n\nexport class Clock {\n private lastTimeMs_: number;\n private ellapsedTime_: number = 0;\n private delta_: number = 0;\n private readonly time_: Time = {\n delta: 0,\n elapsed: 0,\n };\n\n public constructor(\n private readonly timeSource_: TimeSource,\n ) {\n this.lastTimeMs_ = timeSource_.now();\n }\n\n\n public get deltaMs(): number {\n return this.delta_;\n }\n public get ellapsedTime(): number {\n return this.ellapsedTime_;\n }\n\n public tick(): void {\n const now = this.timeSource_.now();\n const dt = Math.min(now - this.lastTimeMs_, 100);\n this.delta_ =\n this.time_.delta =\n dt / 1000;\n this.ellapsedTime_ =\n this.time_.elapsed +=\n dt / 1000;\n this.lastTimeMs_ = now;\n }\n\n public getTime(): Readonly<Time> {\n return this.time_;\n }\n};\n\nexport type Time = {\n delta: number;\n elapsed: number;\n};","import { World } from \"../ecs/world\";\nimport { Clock } from \"./clock\";\n\nexport type StepFunction = (dt: number, world: World) => void;\nexport type PlatformLoop = (callback: () => void) => void;\n\nexport class Loop {\n private running = false;\n\n constructor(\n private readonly clock: Clock,\n private readonly stepFn: StepFunction,\n private readonly platformLoop: PlatformLoop,\n ) { };\n\n public start(world: World) {\n this.running = true;\n\n const loop = () => {\n if (!this.running) return;\n\n this.clock.tick();\n this.stepFn(this.clock.deltaMs, world);\n\n this.platformLoop(loop);\n };\n\n this.platformLoop(loop);\n }\n\n public stop() {\n this.running = false;\n }\n};","import type { ClassType } from \"../types/class\";\n\nexport enum AssetState {\n NOT_READY = 1,\n LOADING = 2,\n READY = 3,\n};\nexport type AssetLoader<T> = (url: string) => Promise<T>;\nexport type AssetDisposer<T> = (r: T) => void | Promise<void>;\n\nexport class Asset<TData> {\n private data_: TData | null = null;\n private state_ = AssetState.NOT_READY;\n private loading_: Promise<TData> | null = null;\n private disposed_ = false;\n\n constructor(\n public readonly id: number,\n private readonly url: string,\n private readonly loader: AssetLoader<TData>,\n private readonly disposer: AssetDisposer<TData>,\n ) { }\n\n public async load(): Promise<TData> {\n if (this.state_ === AssetState.READY)\n return this.data_!;\n\n if (this.state_ === AssetState.LOADING)\n return this.loading_!;\n\n this.state_ = AssetState.LOADING;\n this.disposed_ = false;\n\n this.loading_ = this.loader(this.url)\n .then(data => {\n if (this.disposed_) return data;\n\n this.data_ = data;\n this.state_ = AssetState.READY;\n this.loading_ = null;\n return data;\n }).catch(err => {\n this.state_ = AssetState.NOT_READY;\n this.loading_ = null;\n throw err;\n });\n\n return this.loading_;\n }\n private reset() {\n this.data_ = null;\n this.loading_ = null;\n this.state_ = AssetState.NOT_READY;\n }\n\n public async dispose(): Promise<void> {\n this.disposed_ = true;\n\n if (this.data_)\n await this.disposer(this.data_);\n\n this.reset();\n }\n\n public getData(): TData {\n if (this.state_ !== AssetState.READY)\n throw new Error(\"Data is not loaded yet!\");\n return this.data_!;\n }\n}\n\nexport type AssetID = number;\nexport type AssetIDGenerator = () => AssetID;\nexport class AssetStorage<TData> {\n private readonly items_ = new Map<AssetID, Asset<TData>>();\n constructor(\n private readonly nextIdFn_: AssetIDGenerator,\n private readonly defaultLoader_: AssetLoader<TData>,\n private readonly defaultDisposer_: AssetDisposer<TData>,\n ) { };\n\n private newAsset(id: number, url: string, loader: AssetLoader<TData>, disposer: AssetDisposer<TData>): Asset<TData> {\n // TODO: Maybe object pool or something. By now its only allocate new object.\n return new Asset(id, url, loader, disposer);\n }\n\n public add(url: string): Asset<TData> {\n const id = this.nextIdFn_();\n const rs = this.newAsset(id, url, this.defaultLoader_, this.defaultDisposer_);\n this.items_.set(id, rs);\n\n return rs;\n };\n\n public addCustom(url: string, customLoader: AssetLoader<TData>, customDisposer: AssetDisposer<TData>): Asset<TData> {\n const id = this.nextIdFn_();\n const rs = this.newAsset(id, url, customLoader, customDisposer);\n this.items_.set(id, rs);\n\n return rs;\n }\n\n public get(id: AssetID): Asset<TData> | null {\n const item = this.items_.get(id);\n return item ?? null;\n }\n\n public tryGet(id: AssetID): Asset<TData> {\n const item = this.items_.get(id);\n if (!item)\n throw new Error(`Asset with id ${id} in storage ${this.constructor.name} not exist`);\n\n return item;\n }\n\n public async remove(id: AssetID): Promise<void> {\n const item = this.items_.get(id);\n if (!item) return;\n\n await item.dispose();\n this.items_.delete(id);\n }\n\n public async loadAll(): Promise<void> {\n await Promise.all(\n Array.from(this.items_.values(), r => r.load())\n );\n }\n\n public async clearAll(): Promise<void> {\n await Promise.all(\n Array.from(this.items_.values(), r => r.dispose())\n );\n this.items_.clear();\n }\n}\n\nconst NOOP_DISPOSER: AssetDisposer<any> = async () => { };\nexport class AssetsManager {\n private readonly storages_ = new Map<ClassType<Asset<any>>, AssetStorage<any>>();\n private currId = 0;\n private nextIdFn = () => {\n return ++this.currId;\n }\n public register<T>(\n res: ClassType<Asset<T>>,\n defaultLoader: AssetLoader<T>,\n defaultDisposer: AssetDisposer<T> = NOOP_DISPOSER,\n ): AssetStorage<T> {\n const storage = new AssetStorage(\n this.nextIdFn,\n defaultLoader,\n defaultDisposer,\n );\n this.storages_.set(res, storage);\n\n return storage;\n }\n\n public getStorage<T>(res: ClassType<Asset<T>>): AssetStorage<T> | null {\n return this.storages_.get(res) ?? null;\n }\n\n public tryGetStorage<T>(res: ClassType<Asset<T>>): AssetStorage<T> {\n const s = this.storages_.get(res);\n if (!s)\n throw new Error(`Storage ${res.name} is not registered!`);\n\n return s;\n }\n\n public async loadAll(): Promise<void> {\n await Promise.all(Array.from(this.storages_.values(), (s) => s.loadAll()));\n }\n\n public disposeAll(): void {\n Array.from(this.storages_.values(), (s) => s.clearAll())\n }\n}\n","export enum LogLevel {\n Debug,\n Info,\n Warn,\n Error,\n}\nexport type LogMessage = () => string;\n\nexport interface Logger {\n debug(message: LogMessage): void;\n info(message: LogMessage): void;\n warn(message: LogMessage): void;\n error(message: LogMessage): void;\n}\n\nexport class NoopLogger implements Logger {\n public debug(): void { }\n public info(): void { }\n public warn(): void { }\n public error(): void { }\n}","import type { World } from \"../ecs/world\";\nimport { Transform, Velocity } from \"./components\";\nimport { MovementSystem } from \"./systems\";\n\nexport function injectStd(world: World): void {\n world.components.register(Transform);\n world.components.register(Velocity);\n world.systems.register(new MovementSystem());\n}\n","import { AssetsManager } from \"./assets/assets\";\nimport { ECS_DEFAULTS } from \"./ecs/constant\";\nimport { World } from \"./ecs/world\";\nimport { NoopLogger, type Logger } from \"./logger/logger\";\nimport { Loop, Runtime } from \"./runtime\";\nimport { injectStd } from \"./std/utils\";\n\nexport type EngineConstructor = {\n loop: Loop;\n logger?: Logger;\n maxEntityCount?: number;\n};\n\nexport interface TickProvider {\n getTick(): number;\n};\n\nexport class Engine implements TickProvider {\n public readonly runtime: Runtime;\n public readonly assets = new AssetsManager();\n public readonly world: World;\n public readonly logger: Logger;\n constructor(params: EngineConstructor) {\n this.runtime = new Runtime(params.loop);\n this.logger = params.logger ?? new NoopLogger();\n this.world = new World({\n logger: this.logger,\n maxEntityCount: params.maxEntityCount ?? ECS_DEFAULTS.MAX_ENTITY_COUNT,\n });\n injectStd(this.world);\n }\n \n public getTick(): number {\n return this.world.updatesCount;\n }\n\n public init(): void {\n this.world.build();\n }\n\n public start(): void {\n this.runtime.run(this.world);\n }\n};\n"],"mappings":"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","names":["AssetState","LogLevel"]}
@@ -0,0 +1,9 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+
4
+ var _chunkGUD2YACAcjs = require('../../chunk-GUD2YACA.cjs');
5
+
6
+
7
+
8
+ exports.Transform = _chunkGUD2YACAcjs.Transform; exports.Velocity = _chunkGUD2YACAcjs.Velocity;
9
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/eugene/my_web_game_draft/game/packages/engine/dist/std/components/index.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACF,4DAAiC;AACjC;AACE;AACA;AACF,+FAAC","file":"/home/eugene/my_web_game_draft/game/packages/engine/dist/std/components/index.cjs"}
@@ -0,0 +1,71 @@
1
+ declare class Vector2 {
2
+ x: number;
3
+ y: number;
4
+ constructor(x?: number, y?: number);
5
+ toVec3(z?: number): Vector3;
6
+ toVec4(z?: number, w?: number): Vector4;
7
+ clone(): Vector2;
8
+ set(x: number, y: number): this;
9
+ equals(v: Vector2): boolean;
10
+ add(other: Vector2): this;
11
+ sub(other: Vector2): this;
12
+ mulScalar(s: number): this;
13
+ divScalar(s: number): this;
14
+ negate(): this;
15
+ length(): number;
16
+ normalize(): Vector2;
17
+ normalized(): Vector2;
18
+ }
19
+ declare class Vector3 {
20
+ x: number;
21
+ y: number;
22
+ z: number;
23
+ constructor(x?: number, y?: number, z?: number);
24
+ toVec2(): Vector2;
25
+ toVec4(w?: number): Vector4;
26
+ clone(): Vector3;
27
+ set(x: number, y: number, z: number): this;
28
+ equals(v: Vector3): boolean;
29
+ add(other: Vector3): this;
30
+ sub(other: Vector3): this;
31
+ mulScalar(s: number): this;
32
+ divScalar(s: number): this;
33
+ negate(): this;
34
+ length(): number;
35
+ normalize(): Vector3;
36
+ normalized(): Vector3;
37
+ }
38
+ declare class Vector4 {
39
+ x: number;
40
+ y: number;
41
+ z: number;
42
+ w: number;
43
+ constructor(x?: number, y?: number, z?: number, w?: number);
44
+ toVec2(): Vector2;
45
+ toVec3(): Vector3;
46
+ clone(): Vector4;
47
+ set(x: number, y: number, z: number, w: number): this;
48
+ equals(v: Vector4): boolean;
49
+ add(other: Vector4): this;
50
+ sub(other: Vector4): this;
51
+ mulScalar(s: number): this;
52
+ divScalar(s: number): this;
53
+ negate(): this;
54
+ length(): number;
55
+ normalize(): Vector4;
56
+ normalized(): Vector4;
57
+ }
58
+
59
+ declare class Transform {
60
+ readonly position: Vector3;
61
+ readonly rotation: Vector3;
62
+ readonly scale: Vector3;
63
+ constructor(position?: Vector3, rotation?: Vector3, scale?: Vector3);
64
+ }
65
+
66
+ declare class Velocity {
67
+ readonly linear: Vector3;
68
+ constructor(linear?: Vector3);
69
+ }
70
+
71
+ export { Transform, Velocity };
@@ -0,0 +1,71 @@
1
+ declare class Vector2 {
2
+ x: number;
3
+ y: number;
4
+ constructor(x?: number, y?: number);
5
+ toVec3(z?: number): Vector3;
6
+ toVec4(z?: number, w?: number): Vector4;
7
+ clone(): Vector2;
8
+ set(x: number, y: number): this;
9
+ equals(v: Vector2): boolean;
10
+ add(other: Vector2): this;
11
+ sub(other: Vector2): this;
12
+ mulScalar(s: number): this;
13
+ divScalar(s: number): this;
14
+ negate(): this;
15
+ length(): number;
16
+ normalize(): Vector2;
17
+ normalized(): Vector2;
18
+ }
19
+ declare class Vector3 {
20
+ x: number;
21
+ y: number;
22
+ z: number;
23
+ constructor(x?: number, y?: number, z?: number);
24
+ toVec2(): Vector2;
25
+ toVec4(w?: number): Vector4;
26
+ clone(): Vector3;
27
+ set(x: number, y: number, z: number): this;
28
+ equals(v: Vector3): boolean;
29
+ add(other: Vector3): this;
30
+ sub(other: Vector3): this;
31
+ mulScalar(s: number): this;
32
+ divScalar(s: number): this;
33
+ negate(): this;
34
+ length(): number;
35
+ normalize(): Vector3;
36
+ normalized(): Vector3;
37
+ }
38
+ declare class Vector4 {
39
+ x: number;
40
+ y: number;
41
+ z: number;
42
+ w: number;
43
+ constructor(x?: number, y?: number, z?: number, w?: number);
44
+ toVec2(): Vector2;
45
+ toVec3(): Vector3;
46
+ clone(): Vector4;
47
+ set(x: number, y: number, z: number, w: number): this;
48
+ equals(v: Vector4): boolean;
49
+ add(other: Vector4): this;
50
+ sub(other: Vector4): this;
51
+ mulScalar(s: number): this;
52
+ divScalar(s: number): this;
53
+ negate(): this;
54
+ length(): number;
55
+ normalize(): Vector4;
56
+ normalized(): Vector4;
57
+ }
58
+
59
+ declare class Transform {
60
+ readonly position: Vector3;
61
+ readonly rotation: Vector3;
62
+ readonly scale: Vector3;
63
+ constructor(position?: Vector3, rotation?: Vector3, scale?: Vector3);
64
+ }
65
+
66
+ declare class Velocity {
67
+ readonly linear: Vector3;
68
+ constructor(linear?: Vector3);
69
+ }
70
+
71
+ export { Transform, Velocity };
@@ -0,0 +1,9 @@
1
+ import {
2
+ Transform,
3
+ Velocity
4
+ } from "../../chunk-SWTBVK53.js";
5
+ export {
6
+ Transform,
7
+ Velocity
8
+ };
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,8 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+ var _chunkCNBFO5GJcjs = require('../../chunk-CNBFO5GJ.cjs');
4
+ require('../../chunk-GUD2YACA.cjs');
5
+
6
+
7
+ exports.MovementSystem = _chunkCNBFO5GJcjs.MovementSystem;
8
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/eugene/my_web_game_draft/game/packages/engine/dist/std/systems/index.cjs"],"names":[],"mappings":"AAAA;AACE;AACF,4DAAiC;AACjC,oCAAiC;AACjC;AACE;AACF,0DAAC","file":"/home/eugene/my_web_game_draft/game/packages/engine/dist/std/systems/index.cjs"}
@@ -0,0 +1,11 @@
1
+ import { F as SystemBase, I as SystemInitContext, G as SystemComputeContext } from '../../system-jRDSVzc9.cjs';
2
+ import 'bitmap-index';
3
+
4
+ declare class MovementSystem extends SystemBase {
5
+ private transformStore;
6
+ private velocityStore;
7
+ onInit(ctx: SystemInitContext): void;
8
+ compute(ctx: SystemComputeContext): void;
9
+ }
10
+
11
+ export { MovementSystem };
@@ -0,0 +1,11 @@
1
+ import { F as SystemBase, I as SystemInitContext, G as SystemComputeContext } from '../../system-jRDSVzc9.js';
2
+ import 'bitmap-index';
3
+
4
+ declare class MovementSystem extends SystemBase {
5
+ private transformStore;
6
+ private velocityStore;
7
+ onInit(ctx: SystemInitContext): void;
8
+ compute(ctx: SystemComputeContext): void;
9
+ }
10
+
11
+ export { MovementSystem };
@@ -0,0 +1,8 @@
1
+ import {
2
+ MovementSystem
3
+ } from "../../chunk-BYP45ZLQ.js";
4
+ import "../../chunk-SWTBVK53.js";
5
+ export {
6
+ MovementSystem
7
+ };
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}