@draug/engine 1.0.14 → 1.0.16

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.cjs CHANGED
@@ -31,6 +31,7 @@ __export(index_exports, {
31
31
  ComponentStorage: () => ComponentStorage,
32
32
  ComponentsManager: () => ComponentsManager,
33
33
  DAGNode: () => DAGNode,
34
+ Engine: () => Engine,
34
35
  EntitiesManager: () => EntitiesManager,
35
36
  EntityMaskNotFoundError: () => EntityMaskNotFoundError,
36
37
  EntityRef: () => EntityRef,
@@ -43,7 +44,7 @@ __export(index_exports, {
43
44
  ErrUnknownPlugin: () => ErrUnknownPlugin,
44
45
  EventBuffer: () => EventBuffer,
45
46
  EventBus: () => EventBus,
46
- GameLoop: () => GameLoop,
47
+ Loop: () => Loop,
47
48
  ObjectPool: () => ObjectPool,
48
49
  Plugin: () => Plugin,
49
50
  PluginBase: () => PluginBase,
@@ -751,7 +752,7 @@ var QueryManager = class {
751
752
  }
752
753
  };
753
754
 
754
- // src/plugin/plugin.ts
755
+ // src/ecs/plugin/plugin.ts
755
756
  var PluginMetadataSymbol = /* @__PURE__ */ Symbol("plugin");
756
757
  function Plugin(metadata) {
757
758
  return (target) => {
@@ -859,10 +860,17 @@ var PluginsManager = class {
859
860
  for (const node of sortedNodes) {
860
861
  const entry2 = this.plugins_.get(node.data);
861
862
  const { ctor, ctorParams } = entry2;
862
- entry2.instance = new ctor(...ctorParams);
863
+ const instance = new ctor(...ctorParams);
864
+ entry2.instance = instance;
865
+ instance.onPluginLoad?.();
863
866
  }
864
867
  this.isInitiated_ = true;
865
868
  }
869
+ __internal__onAfterWorldInit(world) {
870
+ for (const p of this.plugins_.values()) {
871
+ p.instance?.onAfterWorldInit?.(world);
872
+ }
873
+ }
866
874
  getPluginMetadata(pluginOrId) {
867
875
  const id2 = this.resolveId(pluginOrId);
868
876
  const entry2 = this.plugins_.get(id2);
@@ -972,24 +980,28 @@ var Clock = class {
972
980
  }
973
981
  };
974
982
 
975
- // src/runtime/game-loop.ts
976
- var GameLoop = class {
977
- constructor(clock, stepFn) {
983
+ // src/runtime/loop.ts
984
+ var Loop = class {
985
+ constructor(world, clock, stepFn, platformLoop) {
986
+ this.world = world;
978
987
  this.clock = clock;
979
988
  this.stepFn = stepFn;
989
+ this.platformLoop = platformLoop;
980
990
  }
991
+ world;
981
992
  clock;
982
993
  stepFn;
994
+ platformLoop;
983
995
  running = false;
984
- start(platformLoop) {
996
+ start() {
985
997
  this.running = true;
986
998
  const loop = () => {
987
999
  if (!this.running) return;
988
1000
  this.clock.tick();
989
- this.stepFn(this.clock.dt);
990
- platformLoop(loop);
1001
+ this.stepFn(this.clock.dt, this.world);
1002
+ this.platformLoop(loop);
991
1003
  };
992
- platformLoop(loop);
1004
+ this.platformLoop(loop);
993
1005
  }
994
1006
  stop() {
995
1007
  this.running = false;
@@ -998,14 +1010,12 @@ var GameLoop = class {
998
1010
 
999
1011
  // src/runtime/runtime.ts
1000
1012
  var Runtime = class {
1001
- constructor(world, assets) {
1002
- this.world = world;
1003
- this.assets = assets;
1013
+ constructor(loop) {
1014
+ this.loop = loop;
1004
1015
  }
1005
- world;
1006
- assets;
1007
- update(dt) {
1008
- this.world.update(dt);
1016
+ loop;
1017
+ run() {
1018
+ this.loop.start();
1009
1019
  }
1010
1020
  };
1011
1021
 
@@ -1154,6 +1164,24 @@ var AssetsManager = class {
1154
1164
  Array.from(this.storages_.values(), (s) => s.clearAll());
1155
1165
  }
1156
1166
  };
1167
+
1168
+ // src/engine.ts
1169
+ var Engine = class {
1170
+ runtime;
1171
+ world;
1172
+ assets;
1173
+ constructor(params) {
1174
+ this.world = new World3();
1175
+ this.runtime = new Runtime(params.loop);
1176
+ this.assets = new AssetsManager();
1177
+ }
1178
+ init() {
1179
+ this.world.build();
1180
+ }
1181
+ start() {
1182
+ this.runtime.run();
1183
+ }
1184
+ };
1157
1185
  // Annotate the CommonJS export names for ESM import in node:
1158
1186
  0 && (module.exports = {
1159
1187
  Asset,
@@ -1167,6 +1195,7 @@ var AssetsManager = class {
1167
1195
  ComponentStorage,
1168
1196
  ComponentsManager,
1169
1197
  DAGNode,
1198
+ Engine,
1170
1199
  EntitiesManager,
1171
1200
  EntityMaskNotFoundError,
1172
1201
  EntityRef,
@@ -1179,7 +1208,7 @@ var AssetsManager = class {
1179
1208
  ErrUnknownPlugin,
1180
1209
  EventBuffer,
1181
1210
  EventBus,
1182
- GameLoop,
1211
+ Loop,
1183
1212
  ObjectPool,
1184
1213
  Plugin,
1185
1214
  PluginBase,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../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/singleton-storage.ts","../src/ecs/components/manager.ts","../src/ecs/components/utils.ts","../src/ecs/resources/resources.ts","../src/ecs/command.ts","../src/ecs/query.ts","../src/plugin/plugin.ts","../src/ecs/world.ts","../src/runtime/clock.ts","../src/runtime/game-loop.ts","../src/runtime/runtime.ts","../src/assets/assets.ts"],"sourcesContent":["export {\n System,\n SystemBase,\n SystemError,\n ErrMissingSystemMetadata,\n ErrNotASystem,\n isSystem,\n getSystemMetadata,\n SystemsManager,\n type SystemComputeContext,\n SystemPhase,\n} from './ecs/system';\n\nexport {\n World\n} from './ecs/world';\n\nexport {\n Component,\n ComponentAlreadyRegisteredError,\n ComponentStorage,\n ComponentsManager,\n type IStorage,\n SingletonStorage,\n} from './ecs/components';\n\nexport { ResourcesManager } from './ecs/resources';\n\nexport {\n entry,\n Commands,\n type CreateEntityComponentEntry,\n type ComponentInitFn,\n type WorldCommand,\n} from './ecs/command';\n\nexport {\n EntityMaskNotFoundError,\n EntityRef,\n EntitiesManager,\n UnregisteredComponentStorageError,\n type EntityID,\n} from './ecs/entity';\n\nexport {\n Plugin,\n isPlugin,\n getPluginMetadata,\n PluginBase,\n PluginsManager,\n PluginError,\n ErrMissingPluginMetadata,\n ErrNotAPlugin,\n ErrPluginNotInit,\n ErrUnknownPlugin,\n type PluginID,\n type PluginMetadata,\n type PluginDependencies,\n} from './plugin';\n\nexport {\n EventBuffer,\n EventBus,\n createEventKey,\n} from './ecs/events-buffer';\n\nexport {\n Clock,\n type TimeSource,\n} from './runtime/clock';\n\nexport { GameLoop, type StepFunction } from './runtime/game-loop';\nexport {\n Runtime\n} from './runtime/runtime';\n\nexport type { ClassType, ComponentType } from './types/class';\n\nexport {\n DAGNode,\n ErrDAGCycleDetected,\n VisitedState,\n topologicalSort,\n} from './core/graph/dag';\nexport { ObjectPool } from './core/memory/pool';\n\nexport {\n AssetState,\n Asset,\n AssetStorage,\n AssetsManager,\n type AssetLoader,\n type AssetDisposer,\n type AssetID,\n type AssetIDGenerator,\n} from './assets/assets';\n","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';\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};\nexport type SystemDecoratorProps = {\n query: SystemMetadata['query'];\n requiredComponents?: ComponentType[];\n computeAfter?: SystemCtor[];\n phase?: SystemPhase;\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 metadata: SystemMetadata = { query, requiredComponents, computeAfter, phase };\n\n // Теперь TS позволяет записать значение\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 entities: number[];\n /** ECS world instance. */\n world: World;\n /** Delta time (seconds or your engine's convention) since the previous update. */\n dt: number;\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?(world: World): void;\n};\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 ) { }\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\n public build(): void {\n this.buildSystemsArray();\n for (const sys of this.systems_.values())\n sys.onInit?.(this.world);\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(dt: number): 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({ entities, world: this.world, dt });\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 { 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 private nextId(): EntityID {\n return ++this.id_;\n }\n\n public create(): EntityID {\n return this.nextId();\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, 16),\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 = 1024) {\n this.pool_ = new Array(initialSize);\n for(let i = 0; i < initialSize; i++) {\n this.pool_[i] = factory();\n }\n this.factory_ = factory;\n this.cursor_ = initialSize - 1;\n }\n\n acquire(): T {\n if (this.cursor_ < 0) this.grow();\n return this.pool_[this.cursor_--]!;\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 { SparseSet } from \"ts-sparse-set\";\nimport { ECS_DEFAULTS } from \"../constant\";\nimport type { IStorage } from \"./types\";\nimport type { ClassType } from \"../../types/class\";\n\nexport class ComponentStorage\n // Only pointer-types.\n <T extends object> implements IStorage<T> {\n private bits_: Bitmap;\n private set_: SparseSet<T>;\n private pool_: ObjectPool<T>;\n private id_: number = 0;\n private cls: ClassType<T>\n\n constructor(cap = ECS_DEFAULTS.MAX_ENTITY_COUNT, factory: () => T, cls: ClassType<T>) {\n this.set_ = new SparseSet(cap);\n this.bits_ = new Bitmap(cap);\n this.pool_ = new ObjectPool(factory, cap);\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 const obj = this.pool_.acquire();\n initFn?.(obj);\n const value = this.set_.add(id, obj);\n this.bits_.set(id);\n return value;\n }\n\n public remove(id: number): void {\n const obj = this.set_.get(id);\n if (!obj) return;\n this.bits_.remove(id);\n this.pool_.release(obj);\n this.set_.remove(id);\n }\n\n public get(id: number): T | null {\n return this.set_.get(id);\n }\n\n public tryGet(id: number): T {\n const x = this.set_.get(id);\n if (!x)\n throw new Error(`[ComponentStorage \"${this.cls.name}\"]: Requesting non-existing item with ID ${id}.`);\n return x;\n }\n\n public writeComponentsToBuf(ids: ReadonlyArray<number>, out: T[]): number {\n let len = 0;\n for (const id of ids) {\n const obj = this.set_.get(id);\n if (obj !== null) out[len++] = obj;\n }\n return len;\n }\n\n public has(id: number): boolean {\n return this.bits_.contains(id);\n }\n\n public entityIds(): number[] {\n return Array.from(this.bits_);\n }\n\n public size(): number {\n return this.bits_.count();\n }\n\n public forEach(cb: (id: number) => void): void {\n this.bits_.range(x => cb(x));\n }\n};","import type { Bitmap } from \"bitmap-index\";\nimport type { IStorage } from \"./types\";\n\nexport class SingletonStorage<T extends object> implements IStorage<T> {\n private value: T | null = null;\n private entityId: number | null = null;\n constructor(private factory: () => T) { }\n bitmap(): Bitmap {\n throw new Error(\"Singletone component cannot has a bitmap!\");\n }\n\n public add(id: number, initFn?: ((obj: T) => T) | undefined): T {\n if (this.value !== null)\n throw new Error(\"Singleton already initiated\");\n\n this.entityId = id;\n this.value = this.factory();\n initFn?.(this.value);\n return this.value;\n\n }\n public remove(id: number): void {\n if (!this.validateId(id))\n return;\n this.value = null;\n this.entityId = null;\n }\n public get(id: number): T | null {\n if (!this.validateId(id))\n return null;\n return this.value;\n }\n public tryGet(id: number): T {\n if (!this.validateId(id))\n throw new Error(\"[SingletoneStorage]: ID missmatch.\");\n return this.value!;\n }\n public has(id: number): boolean {\n return this.validateId(id);\n }\n public size(): number {\n return this.value !== null ? 1 : 0;\n }\n public forEach(cb: (id: number) => void): void {\n if(this.entityId !== null) \n cb(this.entityId);\n }\n private validateId(id: number): boolean {\n return this.entityId !== null && id === this.entityId;\n }\n}","import { UnregisteredComponentStorageError } from \"../entity\";\nimport { ECS_DEFAULTS } from \"../constant\";\nimport { ComponentStorage } from \"./component-storage\";\nimport type { ComponentType, IStorage } from \"./types\";\nimport { SingletonStorage } from \"./singleton-storage\";\nimport { getComponentId } from \".\";\n\nexport enum ComponentStorageType {\n COMPONENT_STORAGE = 1,\n SINGLETON_STORAGE = 2,\n};\n\ntype RegisterSingletoneComponentOptions<T extends object> = {\n storageType: ComponentStorageType.SINGLETON_STORAGE;\n factory: () => T;\n}\ntype RegisterComponentStorageOptions<T extends object> = {\n storageType: ComponentStorageType.COMPONENT_STORAGE;\n factory?: () => T;\n}\n\ntype RegisterComponentOptions<T extends object> = RegisterSingletoneComponentOptions<T> | 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, IStorage<any>>();\n private currId_ = 0;\n private nextId(): number {\n return ++this.currId_;\n }\n\n constructor(\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 ): IStorage<T> {\n if (this.storages_.has(component))\n return this.storages_.get(component)!;\n\n let store: IStorage<T>;\n\n switch (opts?.storageType) {\n case ComponentStorageType.SINGLETON_STORAGE:\n store = this.createSingletonStore(opts);\n break;\n case ComponentStorageType.COMPONENT_STORAGE:\n store = this.createComponentStore(component, opts);\n break;\n default: \n store = this.createComponentStore(component, opts);\n break;\n }\n\n this.storages_.set(component, store);\n return store;\n }\n\n private createComponentStore<T extends object>(component: ComponentType<T>, opts?: RegisterComponentOptions<T>): IStorage<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 private createSingletonStore<T extends object>(opts?: RegisterSingletoneComponentOptions<T>): IStorage<T> {\n if(!opts?.factory) {\n throw new Error(\"For singletone storage provide factory is required!\")\n }\n return new SingletonStorage(opts.factory);\n }\n\n public getStorage<T extends object>(component: ComponentType<T>): IStorage<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}","const registry = new Map<Function, number>();\nlet id = 0;\n\nexport function Component(): ClassDecorator {\n return (target: Function) => {\n if (registry.has(target)) return;\n\n registry.set(target, ++id);\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}\n","import type { ClassType } from \"../../types/class\";\n\nexport class ResourcesManager {\n private readonly items_ = new Map<ClassType<any>, unknown>();\n public insert<T extends object>(type: ClassType<T>, value: T): T {\n this.items_.set(type, value);\n return value;\n };\n public get<T extends object>(type: ClassType<T>): T {\n const value = this.items_.get(type);\n if (!value)\n throw new Error(`Resource of class ${type.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.items_.set(type, value);\n }\n\n return value;\n }\n public remove<T>(type: ClassType<T>): void {\n this.items_.delete(type);\n }\n};\n","import type { ComponentType } from \"./components\";\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 ) { }\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 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 \"../ecs/system\";\nimport type { World } from \"../ecs/world\";\nimport { DAGNode, topologicalSort, ErrDAGCycleDetected } from '../core/graph/dag';\n\nexport type PluginID = string;\n\nexport type PluginDependencies = {\n components?: ComponentType[];\n resources?: ClassType<any>[];\n systems?: ClassType<SystemBase>[];\n plugins?: Array<{ id: PluginID; 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: ClassType<PluginBase>): 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?: (world: World) => void;\n public onPluginUnload?: (world: World) => void;\n public onAfterWorldInit?: (world: World) => void;\n}\n\ntype PluginManagerInternalPluginStorageItem<T extends ClassType<PluginBase>> = {\n ctor: T;\n ctorParams: ConstructorParameters<T>;\n instance?: InstanceType<T>;\n metadata: PluginMetadata;\n};\n\nexport class PluginError extends Error {\n constructor(pluginId: string) {\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: ClassType<PluginBase>) {\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: string) {\n super(pluginId);\n this.message = `${super.message}: Plugin not found in manager.`;\n }\n}\n\nexport class ErrPluginNotInit extends PluginError {\n constructor(pluginId: string) {\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: string, missingDepId: string) {\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<PluginID, PluginManagerInternalPluginStorageItem<any>> = new Map();\n private isInitiated_ = false;\n\n public install<T extends ClassType<PluginBase>>(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(metadata.id))\n return;\n\n const entry: PluginManagerInternalPluginStorageItem<T> = {\n ctor: plugin,\n ctorParams: constructorProps,\n metadata,\n };\n\n this.plugins_.set(metadata.id, entry);\n }\n\n public build(): void {\n const nodes = new Map<PluginID, DAGNode<PluginID>>();\n for (const id of this.plugins_.keys()) {\n nodes.set(id, new DAGNode(id));\n }\n\n for (const [id, entry] of this.plugins_) {\n const node = nodes.get(id)!;\n const depPlugins = entry.metadata.dependencies?.plugins ?? [];\n\n for (const dep of depPlugins) {\n const depNode = nodes.get(dep.id);\n if (!depNode) {\n throw new ErrMissingPluginDependency(id, dep.id);\n }\n node.vertices.push(depNode);\n }\n }\n\n let sortedNodes: DAGNode<PluginID>[];\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 entry.instance = new ctor(...ctorParams);\n }\n\n this.isInitiated_ = true;\n }\n\n public getPluginMetadata(pluginOrId: ClassType<PluginBase> | PluginID): PluginMetadata {\n const id = this.resolveId(pluginOrId);\n const entry = this.plugins_.get(id);\n if (!entry) throw new ErrUnknownPlugin(id);\n return entry.metadata;\n }\n\n public getPluginInstance<T extends PluginBase>(pluginOrId: ClassType<T> | PluginID): T {\n if (!this.isInitiated_) {\n throw new Error(\"Plugin instance is not initiated yet. Use PluginManager.build() before use plugins.\");\n }\n\n const id = this.resolveId(pluginOrId);\n\n const entry = this.plugins_.get(id);\n if (!entry) throw new ErrUnknownPlugin(id);\n if (!entry.instance) throw new ErrPluginNotInit(id);\n\n return entry.instance as T;\n }\n\n private resolveId(pluginOrId: ClassType<PluginBase> | 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\";\n\nexport class World {\n public readonly entities = new EntitiesManager();\n public readonly components = new ComponentsManager();\n public readonly systems = new SystemsManager(this);\n public readonly events = new EventBus();\n public readonly resources = new ResourcesManager();\n public readonly commands = new Commands(this);\n public readonly queries = new QueryManager(this);\n public readonly plugins = new PluginsManager();\n\n private entityRefs_ = new Map<number, EntityRef>();\n\n constructor(maxEntityCount: number = ECS_DEFAULTS.MAX_ENTITY_COUNT) {\n this.components = new ComponentsManager(maxEntityCount);\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 return c;\n };\n\n public update(dt: number): void {\n this.systems.update(dt);\n this.commands.flush(this);\n }\n\n public build(): void {\n this.plugins.build();\n }\n};\n","export interface TimeSource {\n now(): number;\n}\n\nexport class Clock {\n private lastTimeMs_: number;\n private elapsedTime_: number = 0;\n private dt_: number = 0;\n\n public constructor(\n private readonly timeSource_: TimeSource,\n ) {\n this.lastTimeMs_ = timeSource_.now();\n }\n\n\n public get dt(): number {\n return this.dt_;\n }\n public get ellapsedTime(): number {\n return this.elapsedTime_;\n }\n\n public tick(): void {\n const now = this.timeSource_.now();\n const dt = now - this.lastTimeMs_;\n this.dt_ = dt;\n this.elapsedTime_ += dt;\n this.lastTimeMs_ = now;\n }\n};","import { Clock } from \"./clock\";\n\nexport type StepFunction = (dt: number) => void;\n\nexport class GameLoop {\n private running = false;\n\n constructor(\n private clock: Clock,\n private stepFn: StepFunction,\n ) { };\n\n\n public start(platformLoop: (callback: () => void) => void) {\n this.running = true;\n\n const loop = () => {\n if (!this.running) return;\n\n this.clock.tick();\n this.stepFn(this.clock.dt);\n\n platformLoop(loop);\n };\n\n platformLoop(loop);\n }\n\n public stop() {\n this.running = false;\n }\n};","import type { AssetsManager } from \"../assets/assets\";\nimport type { World } from \"../ecs/world\";\n\nexport class Runtime {\n constructor(\n public readonly world: World,\n public readonly assets: AssetsManager,\n ){};\n public update(dt: number) {\n this.world.update(dt);\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"],"mappings":"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","names":["World","VisitedState","SystemPhase","id","id","id","id","id","id","import_bitmap_index","entry","id","hasMetadata","entry","id","World","id","AssetState","id"]}
1
+ {"version":3,"sources":["../src/index.ts","../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/singleton-storage.ts","../src/ecs/components/manager.ts","../src/ecs/components/utils.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/clock.ts","../src/runtime/loop.ts","../src/runtime/runtime.ts","../src/assets/assets.ts","../src/engine.ts"],"sourcesContent":["export {\n System,\n SystemBase,\n SystemError,\n ErrMissingSystemMetadata,\n ErrNotASystem,\n isSystem,\n getSystemMetadata,\n SystemsManager,\n type SystemComputeContext,\n SystemPhase,\n} from './ecs/system';\n\nexport {\n World\n} from './ecs/world';\n\nexport {\n Component,\n ComponentAlreadyRegisteredError,\n ComponentStorage,\n ComponentsManager,\n type IStorage,\n SingletonStorage,\n} from './ecs/components';\n\nexport { ResourcesManager } from './ecs/resources';\n\nexport {\n entry,\n Commands,\n type CreateEntityComponentEntry,\n type ComponentInitFn,\n type WorldCommand,\n} from './ecs/command';\n\nexport {\n EntityMaskNotFoundError,\n EntityRef,\n EntitiesManager,\n UnregisteredComponentStorageError,\n type EntityID,\n} from './ecs/entity';\n\nexport {\n Plugin,\n isPlugin,\n getPluginMetadata,\n PluginBase,\n PluginsManager,\n PluginError,\n ErrMissingPluginMetadata,\n ErrNotAPlugin,\n ErrPluginNotInit,\n ErrUnknownPlugin,\n type PluginID,\n type PluginMetadata,\n type PluginDependencies,\n} from './ecs/plugin';\n\nexport {\n EventBuffer,\n EventBus,\n createEventKey,\n} from './ecs/events-buffer';\n\nexport {\n Clock,\n type TimeSource,\n} from './runtime/clock';\n\nexport { Loop, type StepFunction } from './runtime/loop';\nexport {\n Runtime\n} from './runtime/runtime';\n\nexport type { ClassType, ComponentType } from './types/class';\n\nexport {\n DAGNode,\n ErrDAGCycleDetected,\n VisitedState,\n topologicalSort,\n} from './core/graph/dag';\nexport { ObjectPool } from './core/memory/pool';\n\nexport {\n AssetState,\n Asset,\n AssetStorage,\n AssetsManager,\n type AssetLoader,\n type AssetDisposer,\n type AssetID,\n type AssetIDGenerator,\n} from './assets/assets';\n\nexport {\n Engine,\n type EngineConstructor,\n} from './engine'","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';\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};\nexport type SystemDecoratorProps = {\n query: SystemMetadata['query'];\n requiredComponents?: ComponentType[];\n computeAfter?: SystemCtor[];\n phase?: SystemPhase;\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 metadata: SystemMetadata = { query, requiredComponents, computeAfter, phase };\n\n // Теперь TS позволяет записать значение\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 entities: number[];\n /** ECS world instance. */\n world: World;\n /** Delta time (seconds or your engine's convention) since the previous update. */\n dt: number;\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?(world: World): void;\n};\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 ) { }\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\n public build(): void {\n this.buildSystemsArray();\n for (const sys of this.systems_.values())\n sys.onInit?.(this.world);\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(dt: number): 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({ entities, world: this.world, dt });\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 { 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 private nextId(): EntityID {\n return ++this.id_;\n }\n\n public create(): EntityID {\n return this.nextId();\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, 16),\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 = 1024) {\n this.pool_ = new Array(initialSize);\n for(let i = 0; i < initialSize; i++) {\n this.pool_[i] = factory();\n }\n this.factory_ = factory;\n this.cursor_ = initialSize - 1;\n }\n\n acquire(): T {\n if (this.cursor_ < 0) this.grow();\n return this.pool_[this.cursor_--]!;\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 { SparseSet } from \"ts-sparse-set\";\nimport { ECS_DEFAULTS } from \"../constant\";\nimport type { IStorage } from \"./types\";\nimport type { ClassType } from \"../../types/class\";\n\nexport class ComponentStorage\n // Only pointer-types.\n <T extends object> implements IStorage<T> {\n private bits_: Bitmap;\n private set_: SparseSet<T>;\n private pool_: ObjectPool<T>;\n private id_: number = 0;\n private cls: ClassType<T>\n\n constructor(cap = ECS_DEFAULTS.MAX_ENTITY_COUNT, factory: () => T, cls: ClassType<T>) {\n this.set_ = new SparseSet(cap);\n this.bits_ = new Bitmap(cap);\n this.pool_ = new ObjectPool(factory, cap);\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 const obj = this.pool_.acquire();\n initFn?.(obj);\n const value = this.set_.add(id, obj);\n this.bits_.set(id);\n return value;\n }\n\n public remove(id: number): void {\n const obj = this.set_.get(id);\n if (!obj) return;\n this.bits_.remove(id);\n this.pool_.release(obj);\n this.set_.remove(id);\n }\n\n public get(id: number): T | null {\n return this.set_.get(id);\n }\n\n public tryGet(id: number): T {\n const x = this.set_.get(id);\n if (!x)\n throw new Error(`[ComponentStorage \"${this.cls.name}\"]: Requesting non-existing item with ID ${id}.`);\n return x;\n }\n\n public writeComponentsToBuf(ids: ReadonlyArray<number>, out: T[]): number {\n let len = 0;\n for (const id of ids) {\n const obj = this.set_.get(id);\n if (obj !== null) out[len++] = obj;\n }\n return len;\n }\n\n public has(id: number): boolean {\n return this.bits_.contains(id);\n }\n\n public entityIds(): number[] {\n return Array.from(this.bits_);\n }\n\n public size(): number {\n return this.bits_.count();\n }\n\n public forEach(cb: (id: number) => void): void {\n this.bits_.range(x => cb(x));\n }\n};","import type { Bitmap } from \"bitmap-index\";\nimport type { IStorage } from \"./types\";\n\nexport class SingletonStorage<T extends object> implements IStorage<T> {\n private value: T | null = null;\n private entityId: number | null = null;\n constructor(private factory: () => T) { }\n bitmap(): Bitmap {\n throw new Error(\"Singletone component cannot has a bitmap!\");\n }\n\n public add(id: number, initFn?: ((obj: T) => T) | undefined): T {\n if (this.value !== null)\n throw new Error(\"Singleton already initiated\");\n\n this.entityId = id;\n this.value = this.factory();\n initFn?.(this.value);\n return this.value;\n\n }\n public remove(id: number): void {\n if (!this.validateId(id))\n return;\n this.value = null;\n this.entityId = null;\n }\n public get(id: number): T | null {\n if (!this.validateId(id))\n return null;\n return this.value;\n }\n public tryGet(id: number): T {\n if (!this.validateId(id))\n throw new Error(\"[SingletoneStorage]: ID missmatch.\");\n return this.value!;\n }\n public has(id: number): boolean {\n return this.validateId(id);\n }\n public size(): number {\n return this.value !== null ? 1 : 0;\n }\n public forEach(cb: (id: number) => void): void {\n if(this.entityId !== null) \n cb(this.entityId);\n }\n private validateId(id: number): boolean {\n return this.entityId !== null && id === this.entityId;\n }\n}","import { UnregisteredComponentStorageError } from \"../entity\";\nimport { ECS_DEFAULTS } from \"../constant\";\nimport { ComponentStorage } from \"./component-storage\";\nimport type { ComponentType, IStorage } from \"./types\";\nimport { SingletonStorage } from \"./singleton-storage\";\nimport { getComponentId } from \".\";\n\nexport enum ComponentStorageType {\n COMPONENT_STORAGE = 1,\n SINGLETON_STORAGE = 2,\n};\n\ntype RegisterSingletoneComponentOptions<T extends object> = {\n storageType: ComponentStorageType.SINGLETON_STORAGE;\n factory: () => T;\n}\ntype RegisterComponentStorageOptions<T extends object> = {\n storageType: ComponentStorageType.COMPONENT_STORAGE;\n factory?: () => T;\n}\n\ntype RegisterComponentOptions<T extends object> = RegisterSingletoneComponentOptions<T> | 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, IStorage<any>>();\n private currId_ = 0;\n private nextId(): number {\n return ++this.currId_;\n }\n\n constructor(\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 ): IStorage<T> {\n if (this.storages_.has(component))\n return this.storages_.get(component)!;\n\n let store: IStorage<T>;\n\n switch (opts?.storageType) {\n case ComponentStorageType.SINGLETON_STORAGE:\n store = this.createSingletonStore(opts);\n break;\n case ComponentStorageType.COMPONENT_STORAGE:\n store = this.createComponentStore(component, opts);\n break;\n default: \n store = this.createComponentStore(component, opts);\n break;\n }\n\n this.storages_.set(component, store);\n return store;\n }\n\n private createComponentStore<T extends object>(component: ComponentType<T>, opts?: RegisterComponentOptions<T>): IStorage<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 private createSingletonStore<T extends object>(opts?: RegisterSingletoneComponentOptions<T>): IStorage<T> {\n if(!opts?.factory) {\n throw new Error(\"For singletone storage provide factory is required!\")\n }\n return new SingletonStorage(opts.factory);\n }\n\n public getStorage<T extends object>(component: ComponentType<T>): IStorage<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}","const registry = new Map<Function, number>();\nlet id = 0;\n\nexport function Component(): ClassDecorator {\n return (target: Function) => {\n if (registry.has(target)) return;\n\n registry.set(target, ++id);\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}\n","import type { ClassType } from \"../../types/class\";\n\nexport class ResourcesManager {\n private readonly items_ = new Map<ClassType<any>, unknown>();\n public insert<T extends object>(type: ClassType<T>, value: T): T {\n this.items_.set(type, value);\n return value;\n };\n public get<T extends object>(type: ClassType<T>): T {\n const value = this.items_.get(type);\n if (!value)\n throw new Error(`Resource of class ${type.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.items_.set(type, value);\n }\n\n return value;\n }\n public remove<T>(type: ClassType<T>): void {\n this.items_.delete(type);\n }\n};\n","import type { ComponentType } from \"./components\";\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 ) { }\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 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';\n\nexport type PluginID = string;\n\nexport type PluginDependencies = {\n components?: ComponentType[];\n resources?: ClassType<any>[];\n systems?: ClassType<SystemBase>[];\n plugins?: Array<{ id: PluginID; 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: ClassType<PluginBase>): 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 ClassType<PluginBase> = ClassType<PluginBase>> = {\n ctor: T;\n ctorParams: ConstructorParameters<T>;\n instance?: InstanceType<T>;\n metadata: PluginMetadata;\n};\n\nexport class PluginError extends Error {\n constructor(pluginId: string) {\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: ClassType<PluginBase>) {\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: string) {\n super(pluginId);\n this.message = `${super.message}: Plugin not found in manager.`;\n }\n}\n\nexport class ErrPluginNotInit extends PluginError {\n constructor(pluginId: string) {\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: string, missingDepId: string) {\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<PluginID, PluginManagerInternalPluginStorageItem> = new Map();\n private isInitiated_ = false;\n\n public install<T extends ClassType<PluginBase>>(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(metadata.id))\n return;\n\n const entry: PluginManagerInternalPluginStorageItem<T> = {\n ctor: plugin,\n ctorParams: constructorProps,\n metadata,\n };\n\n this.plugins_.set(metadata.id, entry);\n }\n\n public build(): void {\n const nodes = new Map<PluginID, DAGNode<PluginID>>();\n for (const id of this.plugins_.keys()) {\n nodes.set(id, new DAGNode(id));\n }\n\n for (const [id, entry] of this.plugins_) {\n const node = nodes.get(id)!;\n const depPlugins = entry.metadata.dependencies?.plugins ?? [];\n\n for (const dep of depPlugins) {\n const depNode = nodes.get(dep.id);\n if (!depNode) {\n throw new ErrMissingPluginDependency(id, dep.id);\n }\n node.vertices.push(depNode);\n }\n }\n\n let sortedNodes: DAGNode<PluginID>[];\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 }\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(pluginOrId: ClassType<PluginBase> | PluginID): PluginMetadata {\n const id = this.resolveId(pluginOrId);\n const entry = this.plugins_.get(id);\n if (!entry) throw new ErrUnknownPlugin(id);\n return entry.metadata;\n }\n\n public getPluginInstance<T extends PluginBase>(pluginOrId: ClassType<T> | PluginID): T {\n if (!this.isInitiated_) {\n throw new Error(\"Plugin instance is not initiated yet. Use PluginManager.build() before use plugins.\");\n }\n\n const id = this.resolveId(pluginOrId);\n\n const entry = this.plugins_.get(id);\n if (!entry) throw new ErrUnknownPlugin(id);\n if (!entry.instance) throw new ErrPluginNotInit(id);\n\n return entry.instance as T;\n }\n\n private resolveId(pluginOrId: ClassType<PluginBase> | 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\";\n\nexport class World {\n public readonly entities = new EntitiesManager();\n public readonly components = new ComponentsManager();\n public readonly systems = new SystemsManager(this);\n public readonly events = new EventBus();\n public readonly resources = new ResourcesManager();\n public readonly commands = new Commands(this);\n public readonly queries = new QueryManager(this);\n public readonly plugins = new PluginsManager();\n\n private entityRefs_ = new Map<number, EntityRef>();\n\n constructor(maxEntityCount: number = ECS_DEFAULTS.MAX_ENTITY_COUNT) {\n this.components = new ComponentsManager(maxEntityCount);\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 return c;\n };\n\n public update(dt: number): void {\n this.systems.update(dt);\n this.commands.flush(this);\n }\n\n public build(): void {\n this.plugins.build();\n }\n};\n","export interface TimeSource {\n now(): number;\n}\n\nexport class Clock {\n private lastTimeMs_: number;\n private elapsedTime_: number = 0;\n private dt_: number = 0;\n\n public constructor(\n private readonly timeSource_: TimeSource,\n ) {\n this.lastTimeMs_ = timeSource_.now();\n }\n\n\n public get dt(): number {\n return this.dt_;\n }\n public get ellapsedTime(): number {\n return this.elapsedTime_;\n }\n\n public tick(): void {\n const now = this.timeSource_.now();\n const dt = now - this.lastTimeMs_;\n this.dt_ = dt;\n this.elapsedTime_ += dt;\n this.lastTimeMs_ = now;\n }\n};\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 world: World,\n private readonly clock: Clock,\n private readonly stepFn: StepFunction,\n private readonly platformLoop: PlatformLoop,\n ) { };\n\n public start() {\n this.running = true;\n\n const loop = () => {\n if (!this.running) return;\n\n this.clock.tick();\n this.stepFn(this.clock.dt, this.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 { Loop } from \"./loop\";\n\nexport class Runtime {\n constructor(\n private readonly loop: Loop,\n ) { };\n public run(): void {\n this.loop.start()\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","import { AssetsManager } from \"./assets/assets\";\nimport { World } from \"./ecs/world\";\nimport { Runtime } from \"./runtime/runtime\";\nimport { Loop } from \"./runtime/loop\";\n\nexport type EngineConstructor = {\n loop: Loop\n};\n\nexport class Engine {\n public readonly runtime: Runtime;\n public readonly world: World;\n public readonly assets: AssetsManager;\n constructor(params: EngineConstructor) {\n this.world = new World();\n this.runtime = new Runtime(params.loop);\n this.assets = new AssetsManager();\n }\n\n public init(): void {\n this.world.build();\n }\n\n public start(): void {\n this.runtime.run();\n }\n};\n"],"mappings":"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","names":["World","VisitedState","SystemPhase","id","id","id","id","id","id","import_bitmap_index","entry","id","hasMetadata","entry","id","World","id","AssetState","id","World"]}
package/dist/index.d.cts CHANGED
@@ -203,7 +203,7 @@ declare function Plugin(metadata: PluginMetadata): ClassDecorator;
203
203
  declare function getPluginMetadata(plugin: ClassType<PluginBase>): PluginMetadata;
204
204
  declare function isPlugin(ctor: Function): boolean;
205
205
  declare abstract class PluginBase {
206
- onPluginLoad?: (world: World) => void;
206
+ onPluginLoad?: () => void;
207
207
  onPluginUnload?: (world: World) => void;
208
208
  onAfterWorldInit?: (world: World) => void;
209
209
  }
@@ -227,6 +227,7 @@ declare class PluginsManager {
227
227
  private isInitiated_;
228
228
  install<T extends ClassType<PluginBase>>(plugin: T, ...constructorProps: ConstructorParameters<T>): void;
229
229
  build(): void;
230
+ __internal__onAfterWorldInit(world: World): void;
230
231
  getPluginMetadata(pluginOrId: ClassType<PluginBase> | PluginID): PluginMetadata;
231
232
  getPluginInstance<T extends PluginBase>(pluginOrId: ClassType<T> | PluginID): T;
232
233
  private resolveId;
@@ -360,16 +361,50 @@ declare class Clock {
360
361
  tick(): void;
361
362
  }
362
363
 
363
- type StepFunction = (dt: number) => void;
364
- declare class GameLoop {
365
- private clock;
366
- private stepFn;
364
+ type StepFunction = (dt: number, world: World) => void;
365
+ type PlatformLoop = (callback: () => void) => void;
366
+ declare class Loop {
367
+ private readonly world;
368
+ private readonly clock;
369
+ private readonly stepFn;
370
+ private readonly platformLoop;
367
371
  private running;
368
- constructor(clock: Clock, stepFn: StepFunction);
369
- start(platformLoop: (callback: () => void) => void): void;
372
+ constructor(world: World, clock: Clock, stepFn: StepFunction, platformLoop: PlatformLoop);
373
+ start(): void;
370
374
  stop(): void;
371
375
  }
372
376
 
377
+ declare class Runtime {
378
+ private readonly loop;
379
+ constructor(loop: Loop);
380
+ run(): void;
381
+ }
382
+
383
+ declare enum VisitedState {
384
+ Unvisited = 0,
385
+ Visiting = 1,
386
+ Visited = 2
387
+ }
388
+ declare class DAGNode<T> {
389
+ readonly data: T;
390
+ readonly vertices: DAGNode<T>[];
391
+ constructor(data: T, vertices?: DAGNode<T>[]);
392
+ }
393
+ declare class ErrDAGCycleDetected extends Error {
394
+ constructor();
395
+ }
396
+ declare function topologicalSort<T>(nodes: Iterable<DAGNode<T>>): DAGNode<T>[];
397
+
398
+ declare class ObjectPool<T extends object> {
399
+ private pool_;
400
+ private factory_;
401
+ private cursor_;
402
+ constructor(factory: () => T, initialSize?: number);
403
+ acquire(): T;
404
+ release(obj: T): void;
405
+ private grow;
406
+ }
407
+
373
408
  declare enum AssetState {
374
409
  NOT_READY = 1,
375
410
  LOADING = 2,
@@ -420,36 +455,16 @@ declare class AssetsManager {
420
455
  disposeAll(): void;
421
456
  }
422
457
 
423
- declare class Runtime {
458
+ type EngineConstructor = {
459
+ loop: Loop;
460
+ };
461
+ declare class Engine {
462
+ readonly runtime: Runtime;
424
463
  readonly world: World;
425
464
  readonly assets: AssetsManager;
426
- constructor(world: World, assets: AssetsManager);
427
- update(dt: number): void;
428
- }
429
-
430
- declare enum VisitedState {
431
- Unvisited = 0,
432
- Visiting = 1,
433
- Visited = 2
434
- }
435
- declare class DAGNode<T> {
436
- readonly data: T;
437
- readonly vertices: DAGNode<T>[];
438
- constructor(data: T, vertices?: DAGNode<T>[]);
439
- }
440
- declare class ErrDAGCycleDetected extends Error {
441
- constructor();
442
- }
443
- declare function topologicalSort<T>(nodes: Iterable<DAGNode<T>>): DAGNode<T>[];
444
-
445
- declare class ObjectPool<T extends object> {
446
- private pool_;
447
- private factory_;
448
- private cursor_;
449
- constructor(factory: () => T, initialSize?: number);
450
- acquire(): T;
451
- release(obj: T): void;
452
- private grow;
465
+ constructor(params: EngineConstructor);
466
+ init(): void;
467
+ start(): void;
453
468
  }
454
469
 
455
- export { Asset, type AssetDisposer, type AssetID, type AssetIDGenerator, type AssetLoader, AssetState, AssetStorage, AssetsManager, type ClassType, Clock, Commands, Component, ComponentAlreadyRegisteredError, type ComponentInitFn, ComponentStorage, type ComponentType, ComponentsManager, type CreateEntityComponentEntry, DAGNode, EntitiesManager, type EntityID, EntityMaskNotFoundError, EntityRef, ErrDAGCycleDetected, ErrMissingPluginMetadata, ErrMissingSystemMetadata, ErrNotAPlugin, ErrNotASystem, ErrPluginNotInit, ErrUnknownPlugin, EventBuffer, EventBus, GameLoop, type IStorage, ObjectPool, Plugin, PluginBase, type PluginDependencies, PluginError, type PluginID, type PluginMetadata, PluginsManager, ResourcesManager, Runtime, SingletonStorage, type StepFunction, System, SystemBase, type SystemComputeContext, SystemError, SystemPhase, SystemsManager, type TimeSource, UnregisteredComponentStorageError, VisitedState, World, type WorldCommand, createEventKey, entry, getPluginMetadata, getSystemMetadata, isPlugin, isSystem, topologicalSort };
470
+ export { Asset, type AssetDisposer, type AssetID, type AssetIDGenerator, type AssetLoader, AssetState, AssetStorage, AssetsManager, type ClassType, Clock, Commands, Component, ComponentAlreadyRegisteredError, type ComponentInitFn, ComponentStorage, type ComponentType, ComponentsManager, type CreateEntityComponentEntry, DAGNode, Engine, type EngineConstructor, EntitiesManager, type EntityID, EntityMaskNotFoundError, EntityRef, ErrDAGCycleDetected, ErrMissingPluginMetadata, ErrMissingSystemMetadata, ErrNotAPlugin, ErrNotASystem, ErrPluginNotInit, ErrUnknownPlugin, EventBuffer, EventBus, type IStorage, Loop, ObjectPool, Plugin, PluginBase, type PluginDependencies, PluginError, type PluginID, type PluginMetadata, PluginsManager, ResourcesManager, Runtime, SingletonStorage, type StepFunction, System, SystemBase, type SystemComputeContext, SystemError, SystemPhase, SystemsManager, type TimeSource, UnregisteredComponentStorageError, VisitedState, World, type WorldCommand, createEventKey, entry, getPluginMetadata, getSystemMetadata, isPlugin, isSystem, topologicalSort };
package/dist/index.d.ts CHANGED
@@ -203,7 +203,7 @@ declare function Plugin(metadata: PluginMetadata): ClassDecorator;
203
203
  declare function getPluginMetadata(plugin: ClassType<PluginBase>): PluginMetadata;
204
204
  declare function isPlugin(ctor: Function): boolean;
205
205
  declare abstract class PluginBase {
206
- onPluginLoad?: (world: World) => void;
206
+ onPluginLoad?: () => void;
207
207
  onPluginUnload?: (world: World) => void;
208
208
  onAfterWorldInit?: (world: World) => void;
209
209
  }
@@ -227,6 +227,7 @@ declare class PluginsManager {
227
227
  private isInitiated_;
228
228
  install<T extends ClassType<PluginBase>>(plugin: T, ...constructorProps: ConstructorParameters<T>): void;
229
229
  build(): void;
230
+ __internal__onAfterWorldInit(world: World): void;
230
231
  getPluginMetadata(pluginOrId: ClassType<PluginBase> | PluginID): PluginMetadata;
231
232
  getPluginInstance<T extends PluginBase>(pluginOrId: ClassType<T> | PluginID): T;
232
233
  private resolveId;
@@ -360,16 +361,50 @@ declare class Clock {
360
361
  tick(): void;
361
362
  }
362
363
 
363
- type StepFunction = (dt: number) => void;
364
- declare class GameLoop {
365
- private clock;
366
- private stepFn;
364
+ type StepFunction = (dt: number, world: World) => void;
365
+ type PlatformLoop = (callback: () => void) => void;
366
+ declare class Loop {
367
+ private readonly world;
368
+ private readonly clock;
369
+ private readonly stepFn;
370
+ private readonly platformLoop;
367
371
  private running;
368
- constructor(clock: Clock, stepFn: StepFunction);
369
- start(platformLoop: (callback: () => void) => void): void;
372
+ constructor(world: World, clock: Clock, stepFn: StepFunction, platformLoop: PlatformLoop);
373
+ start(): void;
370
374
  stop(): void;
371
375
  }
372
376
 
377
+ declare class Runtime {
378
+ private readonly loop;
379
+ constructor(loop: Loop);
380
+ run(): void;
381
+ }
382
+
383
+ declare enum VisitedState {
384
+ Unvisited = 0,
385
+ Visiting = 1,
386
+ Visited = 2
387
+ }
388
+ declare class DAGNode<T> {
389
+ readonly data: T;
390
+ readonly vertices: DAGNode<T>[];
391
+ constructor(data: T, vertices?: DAGNode<T>[]);
392
+ }
393
+ declare class ErrDAGCycleDetected extends Error {
394
+ constructor();
395
+ }
396
+ declare function topologicalSort<T>(nodes: Iterable<DAGNode<T>>): DAGNode<T>[];
397
+
398
+ declare class ObjectPool<T extends object> {
399
+ private pool_;
400
+ private factory_;
401
+ private cursor_;
402
+ constructor(factory: () => T, initialSize?: number);
403
+ acquire(): T;
404
+ release(obj: T): void;
405
+ private grow;
406
+ }
407
+
373
408
  declare enum AssetState {
374
409
  NOT_READY = 1,
375
410
  LOADING = 2,
@@ -420,36 +455,16 @@ declare class AssetsManager {
420
455
  disposeAll(): void;
421
456
  }
422
457
 
423
- declare class Runtime {
458
+ type EngineConstructor = {
459
+ loop: Loop;
460
+ };
461
+ declare class Engine {
462
+ readonly runtime: Runtime;
424
463
  readonly world: World;
425
464
  readonly assets: AssetsManager;
426
- constructor(world: World, assets: AssetsManager);
427
- update(dt: number): void;
428
- }
429
-
430
- declare enum VisitedState {
431
- Unvisited = 0,
432
- Visiting = 1,
433
- Visited = 2
434
- }
435
- declare class DAGNode<T> {
436
- readonly data: T;
437
- readonly vertices: DAGNode<T>[];
438
- constructor(data: T, vertices?: DAGNode<T>[]);
439
- }
440
- declare class ErrDAGCycleDetected extends Error {
441
- constructor();
442
- }
443
- declare function topologicalSort<T>(nodes: Iterable<DAGNode<T>>): DAGNode<T>[];
444
-
445
- declare class ObjectPool<T extends object> {
446
- private pool_;
447
- private factory_;
448
- private cursor_;
449
- constructor(factory: () => T, initialSize?: number);
450
- acquire(): T;
451
- release(obj: T): void;
452
- private grow;
465
+ constructor(params: EngineConstructor);
466
+ init(): void;
467
+ start(): void;
453
468
  }
454
469
 
455
- export { Asset, type AssetDisposer, type AssetID, type AssetIDGenerator, type AssetLoader, AssetState, AssetStorage, AssetsManager, type ClassType, Clock, Commands, Component, ComponentAlreadyRegisteredError, type ComponentInitFn, ComponentStorage, type ComponentType, ComponentsManager, type CreateEntityComponentEntry, DAGNode, EntitiesManager, type EntityID, EntityMaskNotFoundError, EntityRef, ErrDAGCycleDetected, ErrMissingPluginMetadata, ErrMissingSystemMetadata, ErrNotAPlugin, ErrNotASystem, ErrPluginNotInit, ErrUnknownPlugin, EventBuffer, EventBus, GameLoop, type IStorage, ObjectPool, Plugin, PluginBase, type PluginDependencies, PluginError, type PluginID, type PluginMetadata, PluginsManager, ResourcesManager, Runtime, SingletonStorage, type StepFunction, System, SystemBase, type SystemComputeContext, SystemError, SystemPhase, SystemsManager, type TimeSource, UnregisteredComponentStorageError, VisitedState, World, type WorldCommand, createEventKey, entry, getPluginMetadata, getSystemMetadata, isPlugin, isSystem, topologicalSort };
470
+ export { Asset, type AssetDisposer, type AssetID, type AssetIDGenerator, type AssetLoader, AssetState, AssetStorage, AssetsManager, type ClassType, Clock, Commands, Component, ComponentAlreadyRegisteredError, type ComponentInitFn, ComponentStorage, type ComponentType, ComponentsManager, type CreateEntityComponentEntry, DAGNode, Engine, type EngineConstructor, EntitiesManager, type EntityID, EntityMaskNotFoundError, EntityRef, ErrDAGCycleDetected, ErrMissingPluginMetadata, ErrMissingSystemMetadata, ErrNotAPlugin, ErrNotASystem, ErrPluginNotInit, ErrUnknownPlugin, EventBuffer, EventBus, type IStorage, Loop, ObjectPool, Plugin, PluginBase, type PluginDependencies, PluginError, type PluginID, type PluginMetadata, PluginsManager, ResourcesManager, Runtime, SingletonStorage, type StepFunction, System, SystemBase, type SystemComputeContext, SystemError, SystemPhase, SystemsManager, type TimeSource, UnregisteredComponentStorageError, VisitedState, World, type WorldCommand, createEventKey, entry, getPluginMetadata, getSystemMetadata, isPlugin, isSystem, topologicalSort };
package/dist/index.js CHANGED
@@ -679,7 +679,7 @@ var QueryManager = class {
679
679
  }
680
680
  };
681
681
 
682
- // src/plugin/plugin.ts
682
+ // src/ecs/plugin/plugin.ts
683
683
  var PluginMetadataSymbol = /* @__PURE__ */ Symbol("plugin");
684
684
  function Plugin(metadata) {
685
685
  return (target) => {
@@ -787,10 +787,17 @@ var PluginsManager = class {
787
787
  for (const node of sortedNodes) {
788
788
  const entry2 = this.plugins_.get(node.data);
789
789
  const { ctor, ctorParams } = entry2;
790
- entry2.instance = new ctor(...ctorParams);
790
+ const instance = new ctor(...ctorParams);
791
+ entry2.instance = instance;
792
+ instance.onPluginLoad?.();
791
793
  }
792
794
  this.isInitiated_ = true;
793
795
  }
796
+ __internal__onAfterWorldInit(world) {
797
+ for (const p of this.plugins_.values()) {
798
+ p.instance?.onAfterWorldInit?.(world);
799
+ }
800
+ }
794
801
  getPluginMetadata(pluginOrId) {
795
802
  const id2 = this.resolveId(pluginOrId);
796
803
  const entry2 = this.plugins_.get(id2);
@@ -900,24 +907,28 @@ var Clock = class {
900
907
  }
901
908
  };
902
909
 
903
- // src/runtime/game-loop.ts
904
- var GameLoop = class {
905
- constructor(clock, stepFn) {
910
+ // src/runtime/loop.ts
911
+ var Loop = class {
912
+ constructor(world, clock, stepFn, platformLoop) {
913
+ this.world = world;
906
914
  this.clock = clock;
907
915
  this.stepFn = stepFn;
916
+ this.platformLoop = platformLoop;
908
917
  }
918
+ world;
909
919
  clock;
910
920
  stepFn;
921
+ platformLoop;
911
922
  running = false;
912
- start(platformLoop) {
923
+ start() {
913
924
  this.running = true;
914
925
  const loop = () => {
915
926
  if (!this.running) return;
916
927
  this.clock.tick();
917
- this.stepFn(this.clock.dt);
918
- platformLoop(loop);
928
+ this.stepFn(this.clock.dt, this.world);
929
+ this.platformLoop(loop);
919
930
  };
920
- platformLoop(loop);
931
+ this.platformLoop(loop);
921
932
  }
922
933
  stop() {
923
934
  this.running = false;
@@ -926,14 +937,12 @@ var GameLoop = class {
926
937
 
927
938
  // src/runtime/runtime.ts
928
939
  var Runtime = class {
929
- constructor(world, assets) {
930
- this.world = world;
931
- this.assets = assets;
940
+ constructor(loop) {
941
+ this.loop = loop;
932
942
  }
933
- world;
934
- assets;
935
- update(dt) {
936
- this.world.update(dt);
943
+ loop;
944
+ run() {
945
+ this.loop.start();
937
946
  }
938
947
  };
939
948
 
@@ -1082,6 +1091,24 @@ var AssetsManager = class {
1082
1091
  Array.from(this.storages_.values(), (s) => s.clearAll());
1083
1092
  }
1084
1093
  };
1094
+
1095
+ // src/engine.ts
1096
+ var Engine = class {
1097
+ runtime;
1098
+ world;
1099
+ assets;
1100
+ constructor(params) {
1101
+ this.world = new World3();
1102
+ this.runtime = new Runtime(params.loop);
1103
+ this.assets = new AssetsManager();
1104
+ }
1105
+ init() {
1106
+ this.world.build();
1107
+ }
1108
+ start() {
1109
+ this.runtime.run();
1110
+ }
1111
+ };
1085
1112
  export {
1086
1113
  Asset,
1087
1114
  AssetState,
@@ -1094,6 +1121,7 @@ export {
1094
1121
  ComponentStorage,
1095
1122
  ComponentsManager,
1096
1123
  DAGNode,
1124
+ Engine,
1097
1125
  EntitiesManager,
1098
1126
  EntityMaskNotFoundError,
1099
1127
  EntityRef,
@@ -1106,7 +1134,7 @@ export {
1106
1134
  ErrUnknownPlugin,
1107
1135
  EventBuffer,
1108
1136
  EventBus,
1109
- GameLoop,
1137
+ Loop,
1110
1138
  ObjectPool,
1111
1139
  Plugin,
1112
1140
  PluginBase,
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/singleton-storage.ts","../src/ecs/components/manager.ts","../src/ecs/components/utils.ts","../src/ecs/resources/resources.ts","../src/ecs/command.ts","../src/ecs/query.ts","../src/plugin/plugin.ts","../src/ecs/world.ts","../src/runtime/clock.ts","../src/runtime/game-loop.ts","../src/runtime/runtime.ts","../src/assets/assets.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';\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};\nexport type SystemDecoratorProps = {\n query: SystemMetadata['query'];\n requiredComponents?: ComponentType[];\n computeAfter?: SystemCtor[];\n phase?: SystemPhase;\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 metadata: SystemMetadata = { query, requiredComponents, computeAfter, phase };\n\n // Теперь TS позволяет записать значение\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 entities: number[];\n /** ECS world instance. */\n world: World;\n /** Delta time (seconds or your engine's convention) since the previous update. */\n dt: number;\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?(world: World): void;\n};\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 ) { }\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\n public build(): void {\n this.buildSystemsArray();\n for (const sys of this.systems_.values())\n sys.onInit?.(this.world);\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(dt: number): 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({ entities, world: this.world, dt });\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 { 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 private nextId(): EntityID {\n return ++this.id_;\n }\n\n public create(): EntityID {\n return this.nextId();\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, 16),\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 = 1024) {\n this.pool_ = new Array(initialSize);\n for(let i = 0; i < initialSize; i++) {\n this.pool_[i] = factory();\n }\n this.factory_ = factory;\n this.cursor_ = initialSize - 1;\n }\n\n acquire(): T {\n if (this.cursor_ < 0) this.grow();\n return this.pool_[this.cursor_--]!;\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 { SparseSet } from \"ts-sparse-set\";\nimport { ECS_DEFAULTS } from \"../constant\";\nimport type { IStorage } from \"./types\";\nimport type { ClassType } from \"../../types/class\";\n\nexport class ComponentStorage\n // Only pointer-types.\n <T extends object> implements IStorage<T> {\n private bits_: Bitmap;\n private set_: SparseSet<T>;\n private pool_: ObjectPool<T>;\n private id_: number = 0;\n private cls: ClassType<T>\n\n constructor(cap = ECS_DEFAULTS.MAX_ENTITY_COUNT, factory: () => T, cls: ClassType<T>) {\n this.set_ = new SparseSet(cap);\n this.bits_ = new Bitmap(cap);\n this.pool_ = new ObjectPool(factory, cap);\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 const obj = this.pool_.acquire();\n initFn?.(obj);\n const value = this.set_.add(id, obj);\n this.bits_.set(id);\n return value;\n }\n\n public remove(id: number): void {\n const obj = this.set_.get(id);\n if (!obj) return;\n this.bits_.remove(id);\n this.pool_.release(obj);\n this.set_.remove(id);\n }\n\n public get(id: number): T | null {\n return this.set_.get(id);\n }\n\n public tryGet(id: number): T {\n const x = this.set_.get(id);\n if (!x)\n throw new Error(`[ComponentStorage \"${this.cls.name}\"]: Requesting non-existing item with ID ${id}.`);\n return x;\n }\n\n public writeComponentsToBuf(ids: ReadonlyArray<number>, out: T[]): number {\n let len = 0;\n for (const id of ids) {\n const obj = this.set_.get(id);\n if (obj !== null) out[len++] = obj;\n }\n return len;\n }\n\n public has(id: number): boolean {\n return this.bits_.contains(id);\n }\n\n public entityIds(): number[] {\n return Array.from(this.bits_);\n }\n\n public size(): number {\n return this.bits_.count();\n }\n\n public forEach(cb: (id: number) => void): void {\n this.bits_.range(x => cb(x));\n }\n};","import type { Bitmap } from \"bitmap-index\";\nimport type { IStorage } from \"./types\";\n\nexport class SingletonStorage<T extends object> implements IStorage<T> {\n private value: T | null = null;\n private entityId: number | null = null;\n constructor(private factory: () => T) { }\n bitmap(): Bitmap {\n throw new Error(\"Singletone component cannot has a bitmap!\");\n }\n\n public add(id: number, initFn?: ((obj: T) => T) | undefined): T {\n if (this.value !== null)\n throw new Error(\"Singleton already initiated\");\n\n this.entityId = id;\n this.value = this.factory();\n initFn?.(this.value);\n return this.value;\n\n }\n public remove(id: number): void {\n if (!this.validateId(id))\n return;\n this.value = null;\n this.entityId = null;\n }\n public get(id: number): T | null {\n if (!this.validateId(id))\n return null;\n return this.value;\n }\n public tryGet(id: number): T {\n if (!this.validateId(id))\n throw new Error(\"[SingletoneStorage]: ID missmatch.\");\n return this.value!;\n }\n public has(id: number): boolean {\n return this.validateId(id);\n }\n public size(): number {\n return this.value !== null ? 1 : 0;\n }\n public forEach(cb: (id: number) => void): void {\n if(this.entityId !== null) \n cb(this.entityId);\n }\n private validateId(id: number): boolean {\n return this.entityId !== null && id === this.entityId;\n }\n}","import { UnregisteredComponentStorageError } from \"../entity\";\nimport { ECS_DEFAULTS } from \"../constant\";\nimport { ComponentStorage } from \"./component-storage\";\nimport type { ComponentType, IStorage } from \"./types\";\nimport { SingletonStorage } from \"./singleton-storage\";\nimport { getComponentId } from \".\";\n\nexport enum ComponentStorageType {\n COMPONENT_STORAGE = 1,\n SINGLETON_STORAGE = 2,\n};\n\ntype RegisterSingletoneComponentOptions<T extends object> = {\n storageType: ComponentStorageType.SINGLETON_STORAGE;\n factory: () => T;\n}\ntype RegisterComponentStorageOptions<T extends object> = {\n storageType: ComponentStorageType.COMPONENT_STORAGE;\n factory?: () => T;\n}\n\ntype RegisterComponentOptions<T extends object> = RegisterSingletoneComponentOptions<T> | 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, IStorage<any>>();\n private currId_ = 0;\n private nextId(): number {\n return ++this.currId_;\n }\n\n constructor(\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 ): IStorage<T> {\n if (this.storages_.has(component))\n return this.storages_.get(component)!;\n\n let store: IStorage<T>;\n\n switch (opts?.storageType) {\n case ComponentStorageType.SINGLETON_STORAGE:\n store = this.createSingletonStore(opts);\n break;\n case ComponentStorageType.COMPONENT_STORAGE:\n store = this.createComponentStore(component, opts);\n break;\n default: \n store = this.createComponentStore(component, opts);\n break;\n }\n\n this.storages_.set(component, store);\n return store;\n }\n\n private createComponentStore<T extends object>(component: ComponentType<T>, opts?: RegisterComponentOptions<T>): IStorage<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 private createSingletonStore<T extends object>(opts?: RegisterSingletoneComponentOptions<T>): IStorage<T> {\n if(!opts?.factory) {\n throw new Error(\"For singletone storage provide factory is required!\")\n }\n return new SingletonStorage(opts.factory);\n }\n\n public getStorage<T extends object>(component: ComponentType<T>): IStorage<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}","const registry = new Map<Function, number>();\nlet id = 0;\n\nexport function Component(): ClassDecorator {\n return (target: Function) => {\n if (registry.has(target)) return;\n\n registry.set(target, ++id);\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}\n","import type { ClassType } from \"../../types/class\";\n\nexport class ResourcesManager {\n private readonly items_ = new Map<ClassType<any>, unknown>();\n public insert<T extends object>(type: ClassType<T>, value: T): T {\n this.items_.set(type, value);\n return value;\n };\n public get<T extends object>(type: ClassType<T>): T {\n const value = this.items_.get(type);\n if (!value)\n throw new Error(`Resource of class ${type.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.items_.set(type, value);\n }\n\n return value;\n }\n public remove<T>(type: ClassType<T>): void {\n this.items_.delete(type);\n }\n};\n","import type { ComponentType } from \"./components\";\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 ) { }\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 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 \"../ecs/system\";\nimport type { World } from \"../ecs/world\";\nimport { DAGNode, topologicalSort, ErrDAGCycleDetected } from '../core/graph/dag';\n\nexport type PluginID = string;\n\nexport type PluginDependencies = {\n components?: ComponentType[];\n resources?: ClassType<any>[];\n systems?: ClassType<SystemBase>[];\n plugins?: Array<{ id: PluginID; 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: ClassType<PluginBase>): 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?: (world: World) => void;\n public onPluginUnload?: (world: World) => void;\n public onAfterWorldInit?: (world: World) => void;\n}\n\ntype PluginManagerInternalPluginStorageItem<T extends ClassType<PluginBase>> = {\n ctor: T;\n ctorParams: ConstructorParameters<T>;\n instance?: InstanceType<T>;\n metadata: PluginMetadata;\n};\n\nexport class PluginError extends Error {\n constructor(pluginId: string) {\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: ClassType<PluginBase>) {\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: string) {\n super(pluginId);\n this.message = `${super.message}: Plugin not found in manager.`;\n }\n}\n\nexport class ErrPluginNotInit extends PluginError {\n constructor(pluginId: string) {\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: string, missingDepId: string) {\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<PluginID, PluginManagerInternalPluginStorageItem<any>> = new Map();\n private isInitiated_ = false;\n\n public install<T extends ClassType<PluginBase>>(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(metadata.id))\n return;\n\n const entry: PluginManagerInternalPluginStorageItem<T> = {\n ctor: plugin,\n ctorParams: constructorProps,\n metadata,\n };\n\n this.plugins_.set(metadata.id, entry);\n }\n\n public build(): void {\n const nodes = new Map<PluginID, DAGNode<PluginID>>();\n for (const id of this.plugins_.keys()) {\n nodes.set(id, new DAGNode(id));\n }\n\n for (const [id, entry] of this.plugins_) {\n const node = nodes.get(id)!;\n const depPlugins = entry.metadata.dependencies?.plugins ?? [];\n\n for (const dep of depPlugins) {\n const depNode = nodes.get(dep.id);\n if (!depNode) {\n throw new ErrMissingPluginDependency(id, dep.id);\n }\n node.vertices.push(depNode);\n }\n }\n\n let sortedNodes: DAGNode<PluginID>[];\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 entry.instance = new ctor(...ctorParams);\n }\n\n this.isInitiated_ = true;\n }\n\n public getPluginMetadata(pluginOrId: ClassType<PluginBase> | PluginID): PluginMetadata {\n const id = this.resolveId(pluginOrId);\n const entry = this.plugins_.get(id);\n if (!entry) throw new ErrUnknownPlugin(id);\n return entry.metadata;\n }\n\n public getPluginInstance<T extends PluginBase>(pluginOrId: ClassType<T> | PluginID): T {\n if (!this.isInitiated_) {\n throw new Error(\"Plugin instance is not initiated yet. Use PluginManager.build() before use plugins.\");\n }\n\n const id = this.resolveId(pluginOrId);\n\n const entry = this.plugins_.get(id);\n if (!entry) throw new ErrUnknownPlugin(id);\n if (!entry.instance) throw new ErrPluginNotInit(id);\n\n return entry.instance as T;\n }\n\n private resolveId(pluginOrId: ClassType<PluginBase> | 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\";\n\nexport class World {\n public readonly entities = new EntitiesManager();\n public readonly components = new ComponentsManager();\n public readonly systems = new SystemsManager(this);\n public readonly events = new EventBus();\n public readonly resources = new ResourcesManager();\n public readonly commands = new Commands(this);\n public readonly queries = new QueryManager(this);\n public readonly plugins = new PluginsManager();\n\n private entityRefs_ = new Map<number, EntityRef>();\n\n constructor(maxEntityCount: number = ECS_DEFAULTS.MAX_ENTITY_COUNT) {\n this.components = new ComponentsManager(maxEntityCount);\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 return c;\n };\n\n public update(dt: number): void {\n this.systems.update(dt);\n this.commands.flush(this);\n }\n\n public build(): void {\n this.plugins.build();\n }\n};\n","export interface TimeSource {\n now(): number;\n}\n\nexport class Clock {\n private lastTimeMs_: number;\n private elapsedTime_: number = 0;\n private dt_: number = 0;\n\n public constructor(\n private readonly timeSource_: TimeSource,\n ) {\n this.lastTimeMs_ = timeSource_.now();\n }\n\n\n public get dt(): number {\n return this.dt_;\n }\n public get ellapsedTime(): number {\n return this.elapsedTime_;\n }\n\n public tick(): void {\n const now = this.timeSource_.now();\n const dt = now - this.lastTimeMs_;\n this.dt_ = dt;\n this.elapsedTime_ += dt;\n this.lastTimeMs_ = now;\n }\n};","import { Clock } from \"./clock\";\n\nexport type StepFunction = (dt: number) => void;\n\nexport class GameLoop {\n private running = false;\n\n constructor(\n private clock: Clock,\n private stepFn: StepFunction,\n ) { };\n\n\n public start(platformLoop: (callback: () => void) => void) {\n this.running = true;\n\n const loop = () => {\n if (!this.running) return;\n\n this.clock.tick();\n this.stepFn(this.clock.dt);\n\n platformLoop(loop);\n };\n\n platformLoop(loop);\n }\n\n public stop() {\n this.running = false;\n }\n};","import type { AssetsManager } from \"../assets/assets\";\nimport type { World } from \"../ecs/world\";\n\nexport class Runtime {\n constructor(\n public readonly world: World,\n public readonly assets: AssetsManager,\n ){};\n public update(dt: number) {\n this.world.update(dt);\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"],"mappings":";AAAO,IAAK,eAAL,kBAAKA,kBAAL;AACH,EAAAA,4BAAA,eAAY,KAAZ;AACA,EAAAA,4BAAA,cAAW,KAAX;AACA,EAAAA,4BAAA,aAAU,KAAV;AAHQ,SAAAA;AAAA,GAAA;AAML,IAAM,UAAN,MAAiB;AAAA,EACJ;AAAA,EACA,WAAyB,CAAC;AAAA,EAE1C,YAAY,MAAS,UAAyB;AAC1C,SAAK,OAAO;AACZ,QAAI;AACA,WAAK,WAAW;AAAA,EACxB;AACJ;AAEO,IAAM,sBAAN,cAAkC,MAAM;AAAA,EAC3C,cAAc;AACV,UAAM,iBAAiB;AAAA,EAC3B;AACJ;AACO,SAAS,gBAAmB,OAA2C;AAC1E,QAAM,UAAU,oBAAI,IAA8B;AAClD,QAAM,SAAuB,CAAC;AAE9B,QAAM,MAAM,CAAC,SAAqB;AAC9B,UAAM,QAAQ,QAAQ,IAAI,IAAI,KAAK;AAEnC,QAAI,UAAU,gBAAsB;AACpC,QAAI,UAAU,kBAAuB;AACjC,YAAM,IAAI,oBAAoB;AAAA,IAClC;AAEA,YAAQ,IAAI,MAAM,gBAAqB;AAEvC,eAAW,SAAS,KAAK,UAAU;AAC/B,UAAI,KAAK;AAAA,IACb;AAEA,YAAQ,IAAI,MAAM,eAAoB;AACtC,WAAO,KAAK,IAAI;AAAA,EACpB;AAGA,aAAW,QAAQ,OAAO;AACtB,QAAI,IAAI;AAAA,EACZ;AAEA,SAAO,OAAO,QAAQ;AAC1B;;;AC5CO,IAAM,cAAN,cAA0B,MAAM;AAAA,EACnC,YAAY,QAAkB;AAC1B,UAAM,2BAA2B,OAAO,IAAI,IAAI;AAAA,EACpD;AACJ;AACO,IAAM,gBAAN,cAA4B,MAAM;AAAA,EACrC,YAAY,QAAkB;AAC1B,UAAM,mBAAmB,OAAO,IAAI,uDAAuD;AAAA,EAC/F;AACJ;AACO,IAAM,2BAAN,cAAuC,YAAY;AAAA,EACtD,YAAY,QAAoB;AAC5B,UAAM,MAAM;AACZ,SAAK,UAAU,GAAG,KAAK,OAAO;AAAA,EAClC;AACJ;AAEO,IAAK,cAAL,kBAAKC,iBAAL;AACH,EAAAA,0BAAA;AACA,EAAAA,0BAAA;AACA,EAAAA,0BAAA;AAHQ,SAAAA;AAAA,GAAA;AAwCZ,IAAM,uBAAuB,uBAAO,QAAQ;AAGrC,SAAS,OAAO,OAA6C;AAChE,SAAO,CAAC,WAAqB;AACzB,UAAM,eAAe;AAErB,QAAI,eAAe,gBAAgB,aAAa,cAAc,YAAY;AACtE,YAAM,IAAI,cAAc,MAAM;AAAA,IAClC;AAEA,UAAM,QAAQ,EAAE,GAAG,MAAM,MAAM;AAC/B,UAAM,qBAAqB,IAAI,IAAI,MAAM,kBAAkB;AAC3D,UAAM,eAAe,IAAI,IAAI,MAAM,YAAY;AAC/C,UAAM,QAAQ,MAAM,SAAS;AAC7B,UAAM,WAA2B,EAAE,OAAO,oBAAoB,cAAc,MAAM;AAGlF,iBAAa,oBAAoB,IAAI;AAAA,EACzC;AACJ;AAEO,SAAS,kBAAkB,QAAoC;AAClE,MAAI,YAAY,MAAM,GAAG;AACrB,WAAO,OAAO,oBAAoB;AAAA,EACtC;AACA,QAAM,IAAI,yBAAyB,MAAM;AAC7C;AAGO,SAAS,YAAY,MAAwD;AAChF,SAAO,wBAAwB;AACnC;AAEO,SAAS,SAAS,MAAyB;AAC9C,SAAO,YAAY,IAAI;AAC3B;AAwBO,IAAe,aAAf,MAA0B;AAOjC;AAGO,IAAM,iBAAN,MAAqB;AAAA,EAOxB,YACqB,OACnB;AADmB;AAAA,EACjB;AAAA,EADiB;AAAA,EAPb,WAAW,oBAAI,IAA4B;AAAA,EAC3C,kBAAgC,CAAC;AAAA,EACjC,sBAA0C,oBAAI,IAAI;AAAA,EAElD,SAAS;AAAA,EAMV,wBAAyC;AAC5C,WAAO,MAAM,KAAK,KAAK,mBAAmB;AAAA,EAC9C;AAAA,EAEO,SAA+B,KAAc;AAChD,UAAM,OAAO,IAAI;AACjB,QAAI,KAAK,SAAS,IAAI,IAAI,EAAG,OAAM,IAAI,MAAM,kBAAkB;AAC/D,UAAM,EAAE,OAAO,mBAAmB,IAAI,kBAAkB,IAAI;AAE5D,SAAK,SAAS,IAAI,MAAM,GAAG;AAE3B,UAAM,IAAI;AAEV,eAAW,KAAK,EAAE,WAAW,CAAC;AAC1B,WAAK,oBAAoB,IAAI,CAAC;AAElC,eAAW,KAAK,EAAE,WAAW,CAAC;AAC1B,WAAK,oBAAoB,IAAI,CAAC;AAElC,eAAW,KAAK,EAAE,SAAS,CAAC;AACxB,WAAK,oBAAoB,IAAI,CAAC;AAClC,eAAW,KAAK;AACZ,WAAK,oBAAoB,IAAI,CAAC;AAAA,EACtC;AAAA,EAEO,QAAc;AACjB,SAAK,kBAAkB;AACvB,eAAW,OAAO,KAAK,SAAS,OAAO;AACnC,UAAI,SAAS,KAAK,KAAK;AAAA,EAC/B;AAAA,EAEQ,UAAgB;AACpB,SAAK,MAAM;AAAA,EACf;AAAA,EAEO,IAA0B,MAAwB;AACrD,UAAM,IAAI,KAAK,SAAS,IAAI,IAAI;AAEhC,QAAI,CAAC;AACD,YAAM,IAAI,MAAM,uBAAuB;AAC3C,WAAO;AAAA,EACX;AAAA,EAEO,OAAO,IAAkB;AAC5B,QAAI,KAAK;AACL,WAAK,QAAQ;AAEjB,SAAK,MAAM,OAAO,QAAQ;AAE1B,eAAW,KAAK,KAAK,iBAAiB;AAClC,YAAM,EAAE,MAAM,IAAI,kBAAkB,EAAE,WAAyB;AAC/D,YAAM,WAAW,KAAK,MAAM,MAAM,KAAK;AACvC,QAAE,QAAQ,EAAE,UAAU,OAAO,KAAK,OAAO,GAAG,CAAC;AAAA,IACjD;AAAA,EACJ;AAAA,EAEQ,oBAA0B;AAC9B,UAAM,MAAoB,CAAC;AAC3B,UAAM,OAAqB,CAAC;AAC5B,UAAM,OAAqB,CAAC;AAC5B,UAAM,MAAM,oBAAI,IAAqC;AAErD,eAAW,CAAC,MAAM,MAAM,KAAK,KAAK,SAAS,QAAQ,GAAG;AAClD,YAAM,OAAO,kBAAkB,IAAI;AAEnC,cAAQ,KAAK,OAAO;AAAA,QAChB,KAAK;AACD,cAAI,KAAK,MAAM;AACf;AAAA,QAEJ,KAAK;AACD,eAAK,KAAK,MAAM;AAChB;AAAA,QAEJ;AACI,eAAK,KAAK,MAAM;AAChB,cAAI,IAAI,MAAM,IAAI,QAAQ,MAAM,CAAC;AACjC;AAAA,MACR;AAAA,IACJ;AAEA,eAAW,QAAQ,IAAI,KAAK,GAAG;AAC3B,YAAM,cAAc,IAAI,IAAI,IAAI;AAChC,YAAM,EAAE,aAAa,IAAI,kBAAkB,IAAI;AAC/C,iBAAW,WAAW,gBAAgB,CAAC,GAAG;AACtC,cAAM,UAAU,IAAI,IAAI,OAAO;AAC/B,YAAI,CAAC,SAAS;AACV,gBAAM,IAAI,MAAM,cAAc,QAAQ,IAAI,iBAAiB;AAAA,QAC/D;AAEA,gBAAQ,SAAS,KAAK,WAAW;AAAA,MACrC;AAAA,IACJ;AAEA,SAAK,kBAAkB;AAAA,MACnB,GAAG;AAAA,MACH,GAAG,gBAAgB,IAAI,OAAO,CAAC,EAAE,IAAI,OAAK,EAAE,IAAI;AAAA,MAChD,GAAG;AAAA,IACP;AAAA,EACJ;AACJ;;;AC/OO,IAAM,oCAAN,cAAgD,MAAM;AAAA,EACzD,YAAY,WAA0B;AAClC,UAAM,oCAAoC,UAAU,IAAI,4CAA4C;AAAA,EACxG;AACJ;AAEO,IAAM,0BAAN,cAAsC,MAAM;AAAA,EAC/C,YAAYC,KAAc;AACtB,UAAM,mCAAmCA,GAAE,yDAAyD;AAAA,EACxG;AACJ;AAEO,IAAM,kBAAN,MAAsB;AAAA,EACjB,MAAgB;AAAA,EAChB,SAAmB;AACvB,WAAO,EAAE,KAAK;AAAA,EAClB;AAAA,EAEO,SAAmB;AACtB,WAAO,KAAK,OAAO;AAAA,EACvB;AACJ;AAEO,IAAM,YAAN,MAAgB;AAAA,EACnB,YACY,OACDC,KACT;AAFU;AACD,cAAAA;AAAA,EACP;AAAA,EAFQ;AAAA,EACD;AAAA,EAGJ,QAGF,YAAuB;AACxB,WAAO,WAAW,IAAI,OAAK;AACvB,YAAM,IAAI,KAAK,MAAM,WAAW,WAAW,CAAC;AAC5C,aAAO,EAAE,OAAO,KAAK,EAAE;AAAA,IAC3B,CAAC;AAAA,EACL;AACJ;;;AC3CO,IAAM,eAAe;AAAA,EACxB,kBAAkB,KAAK,IAAI,GAAG,EAAE;AACpC;;;ACFO,IAAM,cAAN,MAAqC;AAAA,EAChC,UAAe,CAAC;AAAA,EAChB,WAAgB,CAAC;AAAA,EAClB,MAAM,OAAgB;AACzB,SAAK,SAAS,KAAK,KAAK;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBO,OAAO;AACV,UAAM,MAAM,KAAK;AACjB,SAAK,UAAU,KAAK;AACpB,SAAK,WAAW;AAChB,SAAK,SAAS,SAAS;AAAA,EAC3B;AAAA,EAEO,OAAyB;AAC5B,WAAO,KAAK;AAAA,EAChB;AAAA,EACO,OAAe;AAClB,WAAO,KAAK,QAAQ;AAAA,EACxB;AACJ;AAIO,SAAS,eAAkB,aAAmC;AACjE,SAAO,OAAO,WAAW;AAC7B;AAEO,IAAM,WAAN,MAAe;AAAA,EACV,UAAyC,oBAAI,IAAI;AAAA,EAClD,UAAgB;AACnB,SAAK,QAAQ,QAAQ,OAAK,EAAE,KAAK,CAAC;AAAA,EACtC;AAAA,EAEO,UAAa,KAAkC;AAClD,QAAI,MAAM,KAAK,QAAQ,IAAI,GAAG;AAC9B,QAAI,CAAC,KAAK;AACN,YAAM,IAAI,YAAe;AACzB,WAAK,QAAQ,IAAI,KAAK,GAAG;AAAA,IAC7B;AACA,WAAO;AAAA,EACX;AACJ;;;AC7DO,IAAM,aAAN,MAAmC;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,SAAkB,cAAc,MAAM;AAC9C,SAAK,QAAQ,IAAI,MAAM,WAAW;AAClC,aAAQ,IAAI,GAAG,IAAI,aAAa,KAAK;AACjC,WAAK,MAAM,CAAC,IAAI,QAAQ;AAAA,IAC5B;AACA,SAAK,WAAW;AAChB,SAAK,UAAU,cAAc;AAAA,EACjC;AAAA,EAEA,UAAa;AACT,QAAI,KAAK,UAAU,EAAG,MAAK,KAAK;AAChC,WAAO,KAAK,MAAM,KAAK,SAAS;AAAA,EACpC;AAAA,EAEA,QAAQ,KAAQ;AACZ,SAAK,MAAM,EAAE,KAAK,OAAO,IAAI;AAAA,EACjC;AAAA,EAEQ,OAAO;AACX,UAAM,UAAU,KAAK,MAAM;AAC3B,UAAM,UAAU,UAAU;AAC1B,aAAS,IAAI,SAAS,IAAI,SAAS,IAAK,MAAK,MAAM,CAAC,IAAI,KAAK,SAAS;AACtE,SAAK,UAAU,UAAU;AACzB,SAAK,MAAM,SAAS;AAAA,EACxB;AACJ;;;AC7BA,SAAS,cAAc;AACvB,SAAS,iBAAiB;AAKnB,IAAM,mBAAN,MAEuC;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA,MAAc;AAAA,EACd;AAAA,EAER,YAAY,MAAM,aAAa,kBAAkB,SAAkB,KAAmB;AAClF,SAAK,OAAO,IAAI,UAAU,GAAG;AAC7B,SAAK,QAAQ,IAAI,OAAO,GAAG;AAC3B,SAAK,QAAQ,IAAI,WAAW,SAAS,GAAG;AACxC,SAAK,MAAM;AAAA,EACf;AAAA,EACO,SAAiB;AACpB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAW,KAAa;AACpB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEO,eAAeC,KAAoB;AACtC,WAAO,KAAK,MAAMA;AAAA,EACtB;AAAA,EAEO,IAAIA,KAAY,QAA2B;AAC9C,UAAM,MAAM,KAAK,MAAM,QAAQ;AAC/B,aAAS,GAAG;AACZ,UAAM,QAAQ,KAAK,KAAK,IAAIA,KAAI,GAAG;AACnC,SAAK,MAAM,IAAIA,GAAE;AACjB,WAAO;AAAA,EACX;AAAA,EAEO,OAAOA,KAAkB;AAC5B,UAAM,MAAM,KAAK,KAAK,IAAIA,GAAE;AAC5B,QAAI,CAAC,IAAK;AACV,SAAK,MAAM,OAAOA,GAAE;AACpB,SAAK,MAAM,QAAQ,GAAG;AACtB,SAAK,KAAK,OAAOA,GAAE;AAAA,EACvB;AAAA,EAEO,IAAIA,KAAsB;AAC7B,WAAO,KAAK,KAAK,IAAIA,GAAE;AAAA,EAC3B;AAAA,EAEO,OAAOA,KAAe;AACzB,UAAM,IAAI,KAAK,KAAK,IAAIA,GAAE;AAC1B,QAAI,CAAC;AACD,YAAM,IAAI,MAAM,sBAAsB,KAAK,IAAI,IAAI,4CAA4CA,GAAE,GAAG;AACxG,WAAO;AAAA,EACX;AAAA,EAEO,qBAAqB,KAA4B,KAAkB;AACtE,QAAI,MAAM;AACV,eAAWA,OAAM,KAAK;AAClB,YAAM,MAAM,KAAK,KAAK,IAAIA,GAAE;AAC5B,UAAI,QAAQ,KAAM,KAAI,KAAK,IAAI;AAAA,IACnC;AACA,WAAO;AAAA,EACX;AAAA,EAEO,IAAIA,KAAqB;AAC5B,WAAO,KAAK,MAAM,SAASA,GAAE;AAAA,EACjC;AAAA,EAEO,YAAsB;AACzB,WAAO,MAAM,KAAK,KAAK,KAAK;AAAA,EAChC;AAAA,EAEO,OAAe;AAClB,WAAO,KAAK,MAAM,MAAM;AAAA,EAC5B;AAAA,EAEO,QAAQ,IAAgC;AAC3C,SAAK,MAAM,MAAM,OAAK,GAAG,CAAC,CAAC;AAAA,EAC/B;AACJ;;;AClFO,IAAM,mBAAN,MAAgE;AAAA,EAGnE,YAAoB,SAAkB;AAAlB;AAAA,EAAoB;AAAA,EAApB;AAAA,EAFZ,QAAkB;AAAA,EAClB,WAA0B;AAAA,EAElC,SAAiB;AACb,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC/D;AAAA,EAEO,IAAIC,KAAY,QAAyC;AAC5D,QAAI,KAAK,UAAU;AACf,YAAM,IAAI,MAAM,6BAA6B;AAEjD,SAAK,WAAWA;AAChB,SAAK,QAAQ,KAAK,QAAQ;AAC1B,aAAS,KAAK,KAAK;AACnB,WAAO,KAAK;AAAA,EAEhB;AAAA,EACO,OAAOA,KAAkB;AAC5B,QAAI,CAAC,KAAK,WAAWA,GAAE;AACnB;AACJ,SAAK,QAAQ;AACb,SAAK,WAAW;AAAA,EACpB;AAAA,EACO,IAAIA,KAAsB;AAC7B,QAAI,CAAC,KAAK,WAAWA,GAAE;AACnB,aAAO;AACX,WAAO,KAAK;AAAA,EAChB;AAAA,EACO,OAAOA,KAAe;AACzB,QAAI,CAAC,KAAK,WAAWA,GAAE;AACnB,YAAM,IAAI,MAAM,oCAAoC;AACxD,WAAO,KAAK;AAAA,EAChB;AAAA,EACO,IAAIA,KAAqB;AAC5B,WAAO,KAAK,WAAWA,GAAE;AAAA,EAC7B;AAAA,EACO,OAAe;AAClB,WAAO,KAAK,UAAU,OAAO,IAAI;AAAA,EACrC;AAAA,EACO,QAAQ,IAAgC;AAC3C,QAAG,KAAK,aAAa;AACjB,SAAG,KAAK,QAAQ;AAAA,EACxB;AAAA,EACQ,WAAWA,KAAqB;AACpC,WAAO,KAAK,aAAa,QAAQA,QAAO,KAAK;AAAA,EACjD;AACJ;;;AC3BO,IAAM,kCAAN,cAA8C,MAAM;AAAA,EACvD,YAAY,WAA0B;AAClC,UAAM,aAAa,UAAU,IAAI,sBAAsB;AAAA,EAC3D;AACJ;AAEO,IAAM,oBAAN,MAAwB;AAAA,EAO3B,YACY,iBAAyB,aAAa,kBAChD;AADU;AAAA,EACR;AAAA,EADQ;AAAA,EAPK,YAAY,oBAAI,IAAkC;AAAA,EAC3D,UAAU;AAAA,EACV,SAAiB;AACrB,WAAO,EAAE,KAAK;AAAA,EAClB;AAAA,EAMO,SACH,WACA,MACW;AACX,QAAI,KAAK,UAAU,IAAI,SAAS;AAC5B,aAAO,KAAK,UAAU,IAAI,SAAS;AAEvC,QAAI;AAEJ,YAAQ,MAAM,aAAa;AAAA,MACvB,KAAK;AACD,gBAAQ,KAAK,qBAAqB,IAAI;AACtC;AAAA,MACJ,KAAK;AACD,gBAAQ,KAAK,qBAAqB,WAAW,IAAI;AACjD;AAAA,MACJ;AACI,gBAAQ,KAAK,qBAAqB,WAAW,IAAI;AACjD;AAAA,IACR;AAEA,SAAK,UAAU,IAAI,WAAW,KAAK;AACnC,WAAO;AAAA,EACX;AAAA,EAEQ,qBAAuC,WAA6B,MAAiD;AACzH,UAAM,UAAU,MAAM,YAAY,IAAI,SAAgB,IAAI,UAAU,GAAG,IAAI;AAC3E,UAAM,QAAQ,IAAI,iBAAiB,KAAK,gBAAgB,SAAS,SAAS;AAC1E,UAAM,eAAe,KAAK,OAAO,CAAC;AAClC,WAAO;AAAA,EACX;AAAA,EAEQ,qBAAuC,MAA2D;AACtG,QAAG,CAAC,MAAM,SAAS;AACf,YAAM,IAAI,MAAM,qDAAqD;AAAA,IACzE;AACA,WAAO,IAAI,iBAAiB,KAAK,OAAO;AAAA,EAC5C;AAAA,EAEO,WAA6B,WAA0C;AAC1E,UAAM,QAAQ,KAAK,UAAU,IAAI,SAAS;AAC1C,QAAI,UAAU;AACV,YAAM,IAAI,kCAAkC,SAAS;AAEzD,WAAO;AAAA,EACX;AAAA,EAEO,eAAe,MAA6B;AAC/C,WAAO,eAAe,IAAI;AAAA,EAC9B;AACJ;;;AC1FA,IAAM,WAAW,oBAAI,IAAsB;AAC3C,IAAI,KAAK;AAEF,SAAS,YAA4B;AACxC,SAAO,CAAC,WAAqB;AACzB,QAAI,SAAS,IAAI,MAAM,EAAG;AAE1B,aAAS,IAAI,QAAQ,EAAE,EAAE;AAAA,EAC7B;AACJ;AAEO,SAAS,eAAe,MAAwB;AACnD,QAAMC,MAAK,SAAS,IAAI,IAAI;AAC5B,MAAIA,QAAO,QAAW;AAClB,UAAM,IAAI,MAAM,6BAA6B,KAAK,IAAI,EAAE;AAAA,EAC5D;AACA,SAAOA;AACX;;;ACfO,IAAM,mBAAN,MAAuB;AAAA,EACT,SAAS,oBAAI,IAA6B;AAAA,EACpD,OAAyB,MAAoB,OAAa;AAC7D,SAAK,OAAO,IAAI,MAAM,KAAK;AAC3B,WAAO;AAAA,EACX;AAAA,EACO,IAAsB,MAAuB;AAChD,UAAM,QAAQ,KAAK,OAAO,IAAI,IAAI;AAClC,QAAI,CAAC;AACD,YAAM,IAAI,MAAM,qBAAqB,KAAK,IAAI,kBAAkB;AAEpE,WAAO;AAAA,EACX;AAAA,EACO,YAA8B,MAAoB,SAAqB;AAC1E,QAAI,QAAmB,KAAK,OAAO,IAAI,IAAI,KAAK;AAChD,QAAI,UAAU,MAAM;AAChB,cAAQ,QAAQ;AAChB,WAAK,OAAO,IAAI,MAAM,KAAK;AAAA,IAC/B;AAEA,WAAO;AAAA,EACX;AAAA,EACO,OAAU,MAA0B;AACvC,SAAK,OAAO,OAAO,IAAI;AAAA,EAC3B;AACJ;;;ACjBO,SAAS,MACZ,WACA,OAA2B,MAAM;AAAE,GACT;AAC1B,SAAO,CAAC,WAAW,IAAsC;AAC7D;AAEO,IAAM,WAAN,MAAe;AAAA,EAGlB,YACqB,OACnB;AADmB;AAAA,EACjB;AAAA,EADiB;AAAA,EAHJ,iBAAiC,CAAC;AAAA,EAM5C,IAAI,KAAyB;AAChC,SAAK,eAAe,KAAK,GAAG;AAAA,EAChC;AAAA,EACO,MAAM,OAAoB;AAC7B,eAAW,OAAO,KAAK;AACnB,UAAI,KAAK;AACb,SAAK,eAAe,SAAS;AAAA,EACjC;AAAA,EACO,gBAAgB,SAA+C;AAClE,UAAMC,MAAK,KAAK,MAAM,SAAS,OAAO;AAEtC,UAAM,MAAM,CAAC,UAAiB;AAC1B,iBAAW,CAAC,KAAK,MAAM,KAAK,SAAS;AACjC,cAAM,aAAaA,KAAI,KAAK,MAAM;AAAA,MACtC;AAAA,IACJ;AACA,SAAK,IAAI,GAAG;AACZ,WAAOA;AAAA,EACX;AACJ;;;ACxCA,SAAS,UAAAC,eAAc;AAiBhB,IAAM,eAAN,MAAmB;AAAA,EAGtB,YACqB,OACnB;AADmB;AAAA,EACjB;AAAA,EADiB;AAAA,EAHb,QAAQ,oBAAI,IAAyB;AAAA,EAMtC,IAAI,QAAqC;AAC5C,UAAM,MAAM,KAAK,OAAO,MAAM;AAC9B,QAAIC,SAAQ,KAAK,MAAM,IAAI,GAAG;AAE9B,QAAI,CAACA,QAAO;AACR,MAAAA,SAAQ;AAAA,QACJ;AAAA,QACA,QAAQ,KAAK,QAAQ,MAAM;AAAA,QAC3B,OAAO;AAAA,QACP,MAAM,KAAK,YAAY,MAAM;AAAA,MACjC;AACA,WAAK,MAAM,IAAI,KAAKA,MAAK;AAAA,IAC7B;AAEA,QAAIA,OAAM,OAAO;AACb,MAAAA,OAAM,SAAS,KAAK,QAAQA,OAAM,MAAM;AACxC,MAAAA,OAAM,QAAQ;AAAA,IAClB;AAGA,QAAI,eAAeA,OAAM;AACzB,QAAI,OAAO,oBAAoB,QAAQ;AACnC,qBAAeA,OAAM,OAAO,MAAM;AAClC,YAAM,YAAY,IAAID,QAAO;AAC7B,iBAAWE,OAAM,OAAO,oBAAoB;AACxC,kBAAU,IAAIA,GAAE;AAAA,MACpB;AACA,mBAAa,OAAO,SAAS;AAAA,IACjC;AAGA,QAAI,OAAO,QAAQ;AACf,YAAM,SAAmB,CAAC;AAC1B,mBAAa,MAAM,CAAAA,QAAM;AACrB,YAAI,OAAO,OAAQA,GAAE,EAAG,QAAO,KAAKA,GAAE;AAAA,MAC1C,CAAC;AACD,aAAO;AAAA,IACX;AAEA,WAAO,KAAK,WAAW,YAAY;AAAA,EACvC;AAAA,EAEO,WAAW,WAAgC;AAC9C,eAAWD,UAAS,KAAK,MAAM,OAAO,GAAG;AACrC,UAAIA,OAAM,KAAK,IAAI,SAAS,GAAG;AAC3B,QAAAA,OAAM,QAAQ;AAAA,MAClB;AAAA,IACJ;AAAA,EACJ;AAAA,EAEQ,OAAO,GAA4B;AACvC,WAAO;AAAA,MACH,KAAK,IAAI,EAAE,OAAO;AAAA,MAClB,KAAK,IAAI,EAAE,OAAO;AAAA,MAClB,KAAK,IAAI,EAAE,KAAK;AAAA,IACpB,EAAE,KAAK,GAAG;AAAA,EACd;AAAA,EAEQ,IAAI,KAA+B;AACvC,QAAI,CAAC,OAAO,IAAI,WAAW,EAAG,QAAO;AACrC,WAAO,IACF,IAAI,OAAK,KAAK,MAAM,WAAW,eAAe,CAAC,CAAC,EAChD,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC,EACpB,KAAK,GAAG;AAAA,EACjB;AAAA,EAEQ,YAAY,GAAwC;AACxD,UAAM,MAAM,oBAAI,IAAmB;AACnC,MAAE,SAAS,QAAQ,OAAK,IAAI,IAAI,CAAC,CAAC;AAClC,MAAE,SAAS,QAAQ,OAAK,IAAI,IAAI,CAAC,CAAC;AAClC,MAAE,OAAO,QAAQ,OAAK,IAAI,IAAI,CAAC,CAAC;AAChC,WAAO;AAAA,EACX;AAAA,EAEQ,QAAQ,QAAiC;AAC7C,QAAI,SAAS,KAAK,eAAe,OAAO,SAAS,KAAK;AAEtD,UAAM,MAAM,KAAK,eAAe,OAAO,OAAO,IAAI;AAClD,QAAI,KAAK;AACL,eAAS,SAAS,OAAO,IAAI,GAAG,IAAI;AAAA,IACxC;AAEA,QAAI,CAAC,QAAQ;AACT,aAAO,IAAID,QAAO;AAAA,IACtB;AAEA,SAAK,gBAAgB,QAAQ,OAAO,OAAO;AAC3C,WAAO;AAAA,EACX;AAAA,EAEQ,eACJ,YACA,IACa;AACb,QAAI,CAAC,YAAY,OAAQ,QAAO;AAEhC,QAAI,SAAwB;AAC5B,QAAI,qBAAqB;AAEzB,eAAW,KAAK,YAAY;AACxB,YAAM,KAAK,KAAK,MAAM,WAAW,WAAW,CAAC,GAAG,OAAO;AAEvD,UAAI,CAAC,IAAI;AACL,YAAI,OAAO,OAAO;AACd,iBAAO,IAAIA,QAAO;AAAA,QACtB;AACA;AAAA,MACJ;AAEA,2BAAqB;AACrB,UAAI,CAAC,QAAQ;AACT,iBAAS,GAAG,MAAM;AAAA,MACtB,OAAO;AACH,eAAO,QAAQ,OAAO,IAAI,EAAE,IAAI,OAAO,GAAG,EAAE;AAAA,MAChD;AAAA,IACJ;AAEA,QAAI,OAAO,QAAQ,CAAC,oBAAoB;AACpC,aAAO,IAAIA,QAAO;AAAA,IACtB;AAEA,WAAO;AAAA,EACX;AAAA,EAEQ,gBACJ,QACA,mBACI;AACJ,QAAI,mBAAmB,QAAQ;AAC3B,iBAAW,KAAK,mBAAmB;AAC/B,cAAM,KAAK,KAAK,MAAM,WAAW,WAAW,CAAC,GAAG,OAAO;AACvD,YAAI,GAAI,QAAO,OAAO,EAAE;AAAA,MAC5B;AAAA,IACJ;AAAA,EACJ;AAAA,EAEQ,WAAW,QAA0B;AACzC,UAAM,SAAmB,CAAC;AAC1B,WAAO,MAAM,CAAAE,QAAM;AAAE,aAAO,KAAKA,GAAE;AAAA,IAAE,CAAC;AACtC,WAAO;AAAA,EACX;AACJ;;;ACnJA,IAAM,uBAAuB,uBAAO,QAAQ;AAErC,SAAS,OAAO,UAA0C;AAC7D,SAAO,CAAC,WAAqB;AACzB,QAAI,eAAe,UAAU,OAAO,cAAc;AAC9C,YAAM,IAAI,cAAc,MAAM;AAElC,IAAC,OAAgC,oBAAoB,IAAI;AAAA,EAC7D;AACJ;AAEO,SAAS,kBAAkB,QAA+C;AAC7E,MAAIC,aAAY,MAAM,GAAG;AACrB,WAAO,OAAO,oBAAoB;AAAA,EACtC;AACA,QAAM,IAAI,yBAAyB,MAAM;AAC7C;AAIO,SAASA,aAAY,MAA8C;AACtE,SAAO,wBAAwB;AACnC;AAEO,SAAS,SAAS,MAAyB;AAC9C,SAAOA,aAAY,IAAI;AAC3B;AAEO,IAAe,aAAf,MAA0B;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AACX;AASO,IAAM,cAAN,cAA0B,MAAM;AAAA,EACnC,YAAY,UAAkB;AAC1B,UAAM,yBAAyB,QAAQ,GAAG;AAAA,EAC9C;AACJ;AAEO,IAAM,gBAAN,cAA4B,MAAM;AAAA,EACrC,YAAY,QAAkB;AAC1B,UAAM,kBAAkB,OAAO,IAAI,kEAAkE;AAAA,EACzG;AACJ;AAEO,IAAM,2BAAN,cAAuC,MAAM;AAAA,EAChD,YAAY,QAA+B;AACvC,UAAM,kBAAkB,OAAO,IAAI,wEAAwE;AAAA,EAC/G;AACJ;AAEO,IAAM,mBAAN,cAA+B,YAAY;AAAA,EAC9C,YAAY,UAAkB;AAC1B,UAAM,QAAQ;AACd,SAAK,UAAU,GAAG,MAAM,OAAO;AAAA,EACnC;AACJ;AAEO,IAAM,mBAAN,cAA+B,YAAY;AAAA,EAC9C,YAAY,UAAkB;AAC1B,UAAM,QAAQ;AACd,SAAK,UAAU,GAAG,MAAM,OAAO;AAAA,EACnC;AACJ;AAEO,IAAM,6BAAN,cAAyC,YAAY;AAAA,EACxD,YAAY,UAAkB,cAAsB;AAChD,UAAM,QAAQ;AACd,SAAK,UAAU,GAAG,MAAM,OAAO,kCAAkC,YAAY;AAAA,EACjF;AACJ;AAEO,IAAM,4BAAN,cAAwC,MAAM;AAAA,EACjD,cAAc;AACV,UAAM,wCAAwC;AAAA,EAClD;AACJ;AAEO,IAAM,iBAAN,MAAqB;AAAA,EAChB,WAAuE,oBAAI,IAAI;AAAA,EAC/E,eAAe;AAAA,EAEhB,QAAyC,WAAc,kBAAkD;AAC5G,QAAI,CAAC,SAAS,MAAM;AAChB,YAAM,IAAI,yBAAyB,MAAM;AAE7C,UAAM,WAAW,kBAAkB,MAAM;AAEzC,QAAI,KAAK,SAAS,IAAI,SAAS,EAAE;AAC7B;AAEJ,UAAMC,SAAmD;AAAA,MACrD,MAAM;AAAA,MACN,YAAY;AAAA,MACZ;AAAA,IACJ;AAEA,SAAK,SAAS,IAAI,SAAS,IAAIA,MAAK;AAAA,EACxC;AAAA,EAEO,QAAc;AACjB,UAAM,QAAQ,oBAAI,IAAiC;AACnD,eAAWC,OAAM,KAAK,SAAS,KAAK,GAAG;AACnC,YAAM,IAAIA,KAAI,IAAI,QAAQA,GAAE,CAAC;AAAA,IACjC;AAEA,eAAW,CAACA,KAAID,MAAK,KAAK,KAAK,UAAU;AACrC,YAAM,OAAO,MAAM,IAAIC,GAAE;AACzB,YAAM,aAAaD,OAAM,SAAS,cAAc,WAAW,CAAC;AAE5D,iBAAW,OAAO,YAAY;AAC1B,cAAM,UAAU,MAAM,IAAI,IAAI,EAAE;AAChC,YAAI,CAAC,SAAS;AACV,gBAAM,IAAI,2BAA2BC,KAAI,IAAI,EAAE;AAAA,QACnD;AACA,aAAK,SAAS,KAAK,OAAO;AAAA,MAC9B;AAAA,IACJ;AAEA,QAAI;AACJ,QAAI;AACA,oBAAc,gBAAgB,MAAM,OAAO,CAAC;AAAA,IAChD,SAAS,GAAG;AACR,UAAI,aAAa,qBAAqB;AAClC,cAAM,IAAI,0BAA0B;AAAA,MACxC;AACA,YAAM;AAAA,IACV;AAEA,eAAW,QAAQ,aAAa;AAC5B,YAAMD,SAAQ,KAAK,SAAS,IAAI,KAAK,IAAI;AACzC,YAAM,EAAE,MAAM,WAAW,IAAIA;AAC7B,MAAAA,OAAM,WAAW,IAAI,KAAK,GAAG,UAAU;AAAA,IAC3C;AAEA,SAAK,eAAe;AAAA,EACxB;AAAA,EAEO,kBAAkB,YAA8D;AACnF,UAAMC,MAAK,KAAK,UAAU,UAAU;AACpC,UAAMD,SAAQ,KAAK,SAAS,IAAIC,GAAE;AAClC,QAAI,CAACD,OAAO,OAAM,IAAI,iBAAiBC,GAAE;AACzC,WAAOD,OAAM;AAAA,EACjB;AAAA,EAEO,kBAAwC,YAAwC;AACnF,QAAI,CAAC,KAAK,cAAc;AACpB,YAAM,IAAI,MAAM,qFAAqF;AAAA,IACzG;AAEA,UAAMC,MAAK,KAAK,UAAU,UAAU;AAEpC,UAAMD,SAAQ,KAAK,SAAS,IAAIC,GAAE;AAClC,QAAI,CAACD,OAAO,OAAM,IAAI,iBAAiBC,GAAE;AACzC,QAAI,CAACD,OAAM,SAAU,OAAM,IAAI,iBAAiBC,GAAE;AAElD,WAAOD,OAAM;AAAA,EACjB;AAAA,EAEQ,UAAU,YAAwD;AACtE,QAAI,OAAO,eAAe,UAAU;AAChC,aAAO;AAAA,IACX;AAEA,QAAI,CAAC,SAAS,UAAU,GAAG;AACvB,YAAM,IAAI,yBAAyB,UAAU;AAAA,IACjD;AAEA,WAAO,kBAAkB,UAAU,EAAE;AAAA,EACzC;AACJ;;;AC3KO,IAAME,SAAN,MAAY;AAAA,EACC,WAAW,IAAI,gBAAgB;AAAA,EAC/B,aAAa,IAAI,kBAAkB;AAAA,EACnC,UAAU,IAAI,eAAe,IAAI;AAAA,EACjC,SAAS,IAAI,SAAS;AAAA,EACtB,YAAY,IAAI,iBAAiB;AAAA,EACjC,WAAW,IAAI,SAAS,IAAI;AAAA,EAC5B,UAAU,IAAI,aAAa,IAAI;AAAA,EAC/B,UAAU,IAAI,eAAe;AAAA,EAErC,cAAc,oBAAI,IAAuB;AAAA,EAEjD,YAAY,iBAAyB,aAAa,kBAAkB;AAChE,SAAK,aAAa,IAAI,kBAAkB,cAAc;AAAA,EAC1D;AAAA,EAEO,aAAaC,KAAuB;AACvC,QAAI,MAAM,KAAK,YAAY,IAAIA,GAAE;AACjC,QAAI,CAAC,KAAK;AACN,YAAM,IAAI,UAAU,MAAMA,GAAE;AAC5B,WAAK,YAAY,IAAIA,KAAI,GAAG;AAAA,IAChC;AACA,WAAO;AAAA,EACX;AAAA,EACO,MAAM,QAAmC;AAC5C,WAAO,KAAK,QAAQ,IAAI,MAAM;AAAA,EAClC;AAAA,EAIO,gBACH,QACA,WACI;AACJ,UAAMA,MAAK,OAAO,WAAW,WAAW,SAAS,OAAO;AAExD,UAAM,UAAU,KAAK,WAAW,WAAW,SAAS;AACpD,YAAQ,OAAOA,GAAE;AAEjB,SAAK,QAAQ,WAAW,SAAS;AAAA,EACrC;AAAA,EAIO,aAA+B,QAA8B,WAAyB,QAA8B;AACvH,UAAM,UAAU,KAAK,WAAW,WAAW,SAAS;AACpD,QAAIA;AACJ,QAAI,OAAO,WAAW,UAAU;AAC5B,MAAAA,MAAK;AAAA,IACT,OAAO;AACH,MAAAA,MAAK,OAAO;AAAA,IAChB;AACA,UAAM,IAAI,QAAQ,IAAIA,KAAI,CAAC,MAAM;AAC7B,UAAI,QAAQ;AACR,eAAO,CAAC;AAAA,MACZ;AACA,aAAO;AAAA,IACX,CAAC;AACD,SAAK,QAAQ,WAAW,SAAS;AACjC,WAAO;AAAA,EACX;AAAA,EAEO,OAAO,IAAkB;AAC5B,SAAK,QAAQ,OAAO,EAAE;AACtB,SAAK,SAAS,MAAM,IAAI;AAAA,EAC5B;AAAA,EAEO,QAAc;AACjB,SAAK,QAAQ,MAAM;AAAA,EACvB;AACJ;;;AC9FO,IAAM,QAAN,MAAY;AAAA,EAKR,YACc,aACnB;AADmB;AAEjB,SAAK,cAAc,YAAY,IAAI;AAAA,EACvC;AAAA,EAHqB;AAAA,EALb;AAAA,EACA,eAAuB;AAAA,EACvB,MAAc;AAAA,EAStB,IAAW,KAAa;AACpB,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,IAAW,eAAuB;AAC9B,WAAO,KAAK;AAAA,EAChB;AAAA,EAEO,OAAa;AAChB,UAAM,MAAM,KAAK,YAAY,IAAI;AACjC,UAAM,KAAK,MAAM,KAAK;AACtB,SAAK,MAAM;AACX,SAAK,gBAAgB;AACrB,SAAK,cAAc;AAAA,EACvB;AACJ;;;AC1BO,IAAM,WAAN,MAAe;AAAA,EAGlB,YACY,OACA,QACV;AAFU;AACA;AAAA,EACR;AAAA,EAFQ;AAAA,EACA;AAAA,EAJJ,UAAU;AAAA,EAQX,MAAM,cAA8C;AACvD,SAAK,UAAU;AAEf,UAAM,OAAO,MAAM;AACf,UAAI,CAAC,KAAK,QAAS;AAEnB,WAAK,MAAM,KAAK;AAChB,WAAK,OAAO,KAAK,MAAM,EAAE;AAEzB,mBAAa,IAAI;AAAA,IACrB;AAEA,iBAAa,IAAI;AAAA,EACrB;AAAA,EAEW,OAAO;AACd,SAAK,UAAU;AAAA,EACnB;AACJ;;;AC5BO,IAAM,UAAN,MAAc;AAAA,EACjB,YACoB,OACA,QACnB;AAFmB;AACA;AAAA,EAClB;AAAA,EAFkB;AAAA,EACA;AAAA,EAEb,OAAO,IAAY;AACtB,SAAK,MAAM,OAAO,EAAE;AAAA,EACxB;AACJ;;;ACTO,IAAK,aAAL,kBAAKC,gBAAL;AACH,EAAAA,wBAAA,eAAY,KAAZ;AACA,EAAAA,wBAAA,aAAU,KAAV;AACA,EAAAA,wBAAA,WAAQ,KAAR;AAHQ,SAAAA;AAAA,GAAA;AAQL,IAAM,QAAN,MAAmB;AAAA,EAMtB,YACoBC,KACC,KACA,QACA,UACnB;AAJkB,cAAAA;AACC;AACA;AACA;AAAA,EACjB;AAAA,EAJgB;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EATb,QAAsB;AAAA,EACtB,SAAS;AAAA,EACT,WAAkC;AAAA,EAClC,YAAY;AAAA,EASpB,MAAa,OAAuB;AAChC,QAAI,KAAK,WAAW;AAChB,aAAO,KAAK;AAEhB,QAAI,KAAK,WAAW;AAChB,aAAO,KAAK;AAEhB,SAAK,SAAS;AACd,SAAK,YAAY;AAEjB,SAAK,WAAW,KAAK,OAAO,KAAK,GAAG,EAC/B,KAAK,UAAQ;AACV,UAAI,KAAK,UAAW,QAAO;AAE3B,WAAK,QAAQ;AACb,WAAK,SAAS;AACd,WAAK,WAAW;AAChB,aAAO;AAAA,IACX,CAAC,EAAE,MAAM,SAAO;AACZ,WAAK,SAAS;AACd,WAAK,WAAW;AAChB,YAAM;AAAA,IACV,CAAC;AAEL,WAAO,KAAK;AAAA,EAChB;AAAA,EACQ,QAAQ;AACZ,SAAK,QAAQ;AACb,SAAK,WAAW;AAChB,SAAK,SAAS;AAAA,EAClB;AAAA,EAEA,MAAa,UAAyB;AAClC,SAAK,YAAY;AAEjB,QAAI,KAAK;AACL,YAAM,KAAK,SAAS,KAAK,KAAK;AAElC,SAAK,MAAM;AAAA,EACf;AAAA,EAEO,UAAiB;AACpB,QAAI,KAAK,WAAW;AAChB,YAAM,IAAI,MAAM,yBAAyB;AAC7C,WAAO,KAAK;AAAA,EAChB;AACJ;AAIO,IAAM,eAAN,MAA0B;AAAA,EAE7B,YACqB,WACA,gBACA,kBACnB;AAHmB;AACA;AACA;AAAA,EACjB;AAAA,EAHiB;AAAA,EACA;AAAA,EACA;AAAA,EAJJ,SAAS,oBAAI,IAA2B;AAAA,EAOjD,SAASA,KAAY,KAAa,QAA4B,UAA8C;AAEhH,WAAO,IAAI,MAAMA,KAAI,KAAK,QAAQ,QAAQ;AAAA,EAC9C;AAAA,EAEO,IAAI,KAA2B;AAClC,UAAMA,MAAK,KAAK,UAAU;AAC1B,UAAM,KAAK,KAAK,SAASA,KAAI,KAAK,KAAK,gBAAgB,KAAK,gBAAgB;AAC5E,SAAK,OAAO,IAAIA,KAAI,EAAE;AAEtB,WAAO;AAAA,EACX;AAAA,EAEO,UAAU,KAAa,cAAkC,gBAAoD;AAChH,UAAMA,MAAK,KAAK,UAAU;AAC1B,UAAM,KAAK,KAAK,SAASA,KAAI,KAAK,cAAc,cAAc;AAC9D,SAAK,OAAO,IAAIA,KAAI,EAAE;AAEtB,WAAO;AAAA,EACX;AAAA,EAEO,IAAIA,KAAkC;AACzC,UAAM,OAAO,KAAK,OAAO,IAAIA,GAAE;AAC/B,WAAO,QAAQ;AAAA,EACnB;AAAA,EAEO,OAAOA,KAA2B;AACrC,UAAM,OAAO,KAAK,OAAO,IAAIA,GAAE;AAC/B,QAAI,CAAC;AACD,YAAM,IAAI,MAAM,iBAAiBA,GAAE,eAAe,KAAK,YAAY,IAAI,YAAY;AAEvF,WAAO;AAAA,EACX;AAAA,EAEA,MAAa,OAAOA,KAA4B;AAC5C,UAAM,OAAO,KAAK,OAAO,IAAIA,GAAE;AAC/B,QAAI,CAAC,KAAM;AAEX,UAAM,KAAK,QAAQ;AACnB,SAAK,OAAO,OAAOA,GAAE;AAAA,EACzB;AAAA,EAEA,MAAa,UAAyB;AAClC,UAAM,QAAQ;AAAA,MACV,MAAM,KAAK,KAAK,OAAO,OAAO,GAAG,OAAK,EAAE,KAAK,CAAC;AAAA,IAClD;AAAA,EACJ;AAAA,EAEA,MAAa,WAA0B;AACnC,UAAM,QAAQ;AAAA,MACV,MAAM,KAAK,KAAK,OAAO,OAAO,GAAG,OAAK,EAAE,QAAQ,CAAC;AAAA,IACrD;AACA,SAAK,OAAO,MAAM;AAAA,EACtB;AACJ;AAEA,IAAM,gBAAoC,YAAY;AAAE;AACjD,IAAM,gBAAN,MAAoB;AAAA,EACN,YAAY,oBAAI,IAA8C;AAAA,EACvE,SAAS;AAAA,EACT,WAAW,MAAM;AACrB,WAAO,EAAE,KAAK;AAAA,EAClB;AAAA,EACO,SACH,KACA,eACA,kBAAoC,eACrB;AACf,UAAM,UAAU,IAAI;AAAA,MAChB,KAAK;AAAA,MACL;AAAA,MACA;AAAA,IACJ;AACA,SAAK,UAAU,IAAI,KAAK,OAAO;AAE/B,WAAO;AAAA,EACX;AAAA,EAEO,WAAc,KAAkD;AACnE,WAAO,KAAK,UAAU,IAAI,GAAG,KAAK;AAAA,EACtC;AAAA,EAEO,cAAiB,KAA2C;AAC/D,UAAM,IAAI,KAAK,UAAU,IAAI,GAAG;AAChC,QAAI,CAAC;AACD,YAAM,IAAI,MAAM,WAAW,IAAI,IAAI,qBAAqB;AAE5D,WAAO;AAAA,EACX;AAAA,EAEA,MAAa,UAAyB;AAClC,UAAM,QAAQ,IAAI,MAAM,KAAK,KAAK,UAAU,OAAO,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAAA,EAC7E;AAAA,EAEO,aAAmB;AACtB,UAAM,KAAK,KAAK,UAAU,OAAO,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC;AAAA,EAC3D;AACJ;","names":["VisitedState","SystemPhase","id","id","id","id","id","id","Bitmap","entry","id","hasMetadata","entry","id","World","id","AssetState","id"]}
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/singleton-storage.ts","../src/ecs/components/manager.ts","../src/ecs/components/utils.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/clock.ts","../src/runtime/loop.ts","../src/runtime/runtime.ts","../src/assets/assets.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';\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};\nexport type SystemDecoratorProps = {\n query: SystemMetadata['query'];\n requiredComponents?: ComponentType[];\n computeAfter?: SystemCtor[];\n phase?: SystemPhase;\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 metadata: SystemMetadata = { query, requiredComponents, computeAfter, phase };\n\n // Теперь TS позволяет записать значение\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 entities: number[];\n /** ECS world instance. */\n world: World;\n /** Delta time (seconds or your engine's convention) since the previous update. */\n dt: number;\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?(world: World): void;\n};\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 ) { }\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\n public build(): void {\n this.buildSystemsArray();\n for (const sys of this.systems_.values())\n sys.onInit?.(this.world);\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(dt: number): 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({ entities, world: this.world, dt });\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 { 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 private nextId(): EntityID {\n return ++this.id_;\n }\n\n public create(): EntityID {\n return this.nextId();\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, 16),\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 = 1024) {\n this.pool_ = new Array(initialSize);\n for(let i = 0; i < initialSize; i++) {\n this.pool_[i] = factory();\n }\n this.factory_ = factory;\n this.cursor_ = initialSize - 1;\n }\n\n acquire(): T {\n if (this.cursor_ < 0) this.grow();\n return this.pool_[this.cursor_--]!;\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 { SparseSet } from \"ts-sparse-set\";\nimport { ECS_DEFAULTS } from \"../constant\";\nimport type { IStorage } from \"./types\";\nimport type { ClassType } from \"../../types/class\";\n\nexport class ComponentStorage\n // Only pointer-types.\n <T extends object> implements IStorage<T> {\n private bits_: Bitmap;\n private set_: SparseSet<T>;\n private pool_: ObjectPool<T>;\n private id_: number = 0;\n private cls: ClassType<T>\n\n constructor(cap = ECS_DEFAULTS.MAX_ENTITY_COUNT, factory: () => T, cls: ClassType<T>) {\n this.set_ = new SparseSet(cap);\n this.bits_ = new Bitmap(cap);\n this.pool_ = new ObjectPool(factory, cap);\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 const obj = this.pool_.acquire();\n initFn?.(obj);\n const value = this.set_.add(id, obj);\n this.bits_.set(id);\n return value;\n }\n\n public remove(id: number): void {\n const obj = this.set_.get(id);\n if (!obj) return;\n this.bits_.remove(id);\n this.pool_.release(obj);\n this.set_.remove(id);\n }\n\n public get(id: number): T | null {\n return this.set_.get(id);\n }\n\n public tryGet(id: number): T {\n const x = this.set_.get(id);\n if (!x)\n throw new Error(`[ComponentStorage \"${this.cls.name}\"]: Requesting non-existing item with ID ${id}.`);\n return x;\n }\n\n public writeComponentsToBuf(ids: ReadonlyArray<number>, out: T[]): number {\n let len = 0;\n for (const id of ids) {\n const obj = this.set_.get(id);\n if (obj !== null) out[len++] = obj;\n }\n return len;\n }\n\n public has(id: number): boolean {\n return this.bits_.contains(id);\n }\n\n public entityIds(): number[] {\n return Array.from(this.bits_);\n }\n\n public size(): number {\n return this.bits_.count();\n }\n\n public forEach(cb: (id: number) => void): void {\n this.bits_.range(x => cb(x));\n }\n};","import type { Bitmap } from \"bitmap-index\";\nimport type { IStorage } from \"./types\";\n\nexport class SingletonStorage<T extends object> implements IStorage<T> {\n private value: T | null = null;\n private entityId: number | null = null;\n constructor(private factory: () => T) { }\n bitmap(): Bitmap {\n throw new Error(\"Singletone component cannot has a bitmap!\");\n }\n\n public add(id: number, initFn?: ((obj: T) => T) | undefined): T {\n if (this.value !== null)\n throw new Error(\"Singleton already initiated\");\n\n this.entityId = id;\n this.value = this.factory();\n initFn?.(this.value);\n return this.value;\n\n }\n public remove(id: number): void {\n if (!this.validateId(id))\n return;\n this.value = null;\n this.entityId = null;\n }\n public get(id: number): T | null {\n if (!this.validateId(id))\n return null;\n return this.value;\n }\n public tryGet(id: number): T {\n if (!this.validateId(id))\n throw new Error(\"[SingletoneStorage]: ID missmatch.\");\n return this.value!;\n }\n public has(id: number): boolean {\n return this.validateId(id);\n }\n public size(): number {\n return this.value !== null ? 1 : 0;\n }\n public forEach(cb: (id: number) => void): void {\n if(this.entityId !== null) \n cb(this.entityId);\n }\n private validateId(id: number): boolean {\n return this.entityId !== null && id === this.entityId;\n }\n}","import { UnregisteredComponentStorageError } from \"../entity\";\nimport { ECS_DEFAULTS } from \"../constant\";\nimport { ComponentStorage } from \"./component-storage\";\nimport type { ComponentType, IStorage } from \"./types\";\nimport { SingletonStorage } from \"./singleton-storage\";\nimport { getComponentId } from \".\";\n\nexport enum ComponentStorageType {\n COMPONENT_STORAGE = 1,\n SINGLETON_STORAGE = 2,\n};\n\ntype RegisterSingletoneComponentOptions<T extends object> = {\n storageType: ComponentStorageType.SINGLETON_STORAGE;\n factory: () => T;\n}\ntype RegisterComponentStorageOptions<T extends object> = {\n storageType: ComponentStorageType.COMPONENT_STORAGE;\n factory?: () => T;\n}\n\ntype RegisterComponentOptions<T extends object> = RegisterSingletoneComponentOptions<T> | 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, IStorage<any>>();\n private currId_ = 0;\n private nextId(): number {\n return ++this.currId_;\n }\n\n constructor(\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 ): IStorage<T> {\n if (this.storages_.has(component))\n return this.storages_.get(component)!;\n\n let store: IStorage<T>;\n\n switch (opts?.storageType) {\n case ComponentStorageType.SINGLETON_STORAGE:\n store = this.createSingletonStore(opts);\n break;\n case ComponentStorageType.COMPONENT_STORAGE:\n store = this.createComponentStore(component, opts);\n break;\n default: \n store = this.createComponentStore(component, opts);\n break;\n }\n\n this.storages_.set(component, store);\n return store;\n }\n\n private createComponentStore<T extends object>(component: ComponentType<T>, opts?: RegisterComponentOptions<T>): IStorage<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 private createSingletonStore<T extends object>(opts?: RegisterSingletoneComponentOptions<T>): IStorage<T> {\n if(!opts?.factory) {\n throw new Error(\"For singletone storage provide factory is required!\")\n }\n return new SingletonStorage(opts.factory);\n }\n\n public getStorage<T extends object>(component: ComponentType<T>): IStorage<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}","const registry = new Map<Function, number>();\nlet id = 0;\n\nexport function Component(): ClassDecorator {\n return (target: Function) => {\n if (registry.has(target)) return;\n\n registry.set(target, ++id);\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}\n","import type { ClassType } from \"../../types/class\";\n\nexport class ResourcesManager {\n private readonly items_ = new Map<ClassType<any>, unknown>();\n public insert<T extends object>(type: ClassType<T>, value: T): T {\n this.items_.set(type, value);\n return value;\n };\n public get<T extends object>(type: ClassType<T>): T {\n const value = this.items_.get(type);\n if (!value)\n throw new Error(`Resource of class ${type.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.items_.set(type, value);\n }\n\n return value;\n }\n public remove<T>(type: ClassType<T>): void {\n this.items_.delete(type);\n }\n};\n","import type { ComponentType } from \"./components\";\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 ) { }\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 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';\n\nexport type PluginID = string;\n\nexport type PluginDependencies = {\n components?: ComponentType[];\n resources?: ClassType<any>[];\n systems?: ClassType<SystemBase>[];\n plugins?: Array<{ id: PluginID; 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: ClassType<PluginBase>): 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 ClassType<PluginBase> = ClassType<PluginBase>> = {\n ctor: T;\n ctorParams: ConstructorParameters<T>;\n instance?: InstanceType<T>;\n metadata: PluginMetadata;\n};\n\nexport class PluginError extends Error {\n constructor(pluginId: string) {\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: ClassType<PluginBase>) {\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: string) {\n super(pluginId);\n this.message = `${super.message}: Plugin not found in manager.`;\n }\n}\n\nexport class ErrPluginNotInit extends PluginError {\n constructor(pluginId: string) {\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: string, missingDepId: string) {\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<PluginID, PluginManagerInternalPluginStorageItem> = new Map();\n private isInitiated_ = false;\n\n public install<T extends ClassType<PluginBase>>(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(metadata.id))\n return;\n\n const entry: PluginManagerInternalPluginStorageItem<T> = {\n ctor: plugin,\n ctorParams: constructorProps,\n metadata,\n };\n\n this.plugins_.set(metadata.id, entry);\n }\n\n public build(): void {\n const nodes = new Map<PluginID, DAGNode<PluginID>>();\n for (const id of this.plugins_.keys()) {\n nodes.set(id, new DAGNode(id));\n }\n\n for (const [id, entry] of this.plugins_) {\n const node = nodes.get(id)!;\n const depPlugins = entry.metadata.dependencies?.plugins ?? [];\n\n for (const dep of depPlugins) {\n const depNode = nodes.get(dep.id);\n if (!depNode) {\n throw new ErrMissingPluginDependency(id, dep.id);\n }\n node.vertices.push(depNode);\n }\n }\n\n let sortedNodes: DAGNode<PluginID>[];\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 }\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(pluginOrId: ClassType<PluginBase> | PluginID): PluginMetadata {\n const id = this.resolveId(pluginOrId);\n const entry = this.plugins_.get(id);\n if (!entry) throw new ErrUnknownPlugin(id);\n return entry.metadata;\n }\n\n public getPluginInstance<T extends PluginBase>(pluginOrId: ClassType<T> | PluginID): T {\n if (!this.isInitiated_) {\n throw new Error(\"Plugin instance is not initiated yet. Use PluginManager.build() before use plugins.\");\n }\n\n const id = this.resolveId(pluginOrId);\n\n const entry = this.plugins_.get(id);\n if (!entry) throw new ErrUnknownPlugin(id);\n if (!entry.instance) throw new ErrPluginNotInit(id);\n\n return entry.instance as T;\n }\n\n private resolveId(pluginOrId: ClassType<PluginBase> | 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\";\n\nexport class World {\n public readonly entities = new EntitiesManager();\n public readonly components = new ComponentsManager();\n public readonly systems = new SystemsManager(this);\n public readonly events = new EventBus();\n public readonly resources = new ResourcesManager();\n public readonly commands = new Commands(this);\n public readonly queries = new QueryManager(this);\n public readonly plugins = new PluginsManager();\n\n private entityRefs_ = new Map<number, EntityRef>();\n\n constructor(maxEntityCount: number = ECS_DEFAULTS.MAX_ENTITY_COUNT) {\n this.components = new ComponentsManager(maxEntityCount);\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 return c;\n };\n\n public update(dt: number): void {\n this.systems.update(dt);\n this.commands.flush(this);\n }\n\n public build(): void {\n this.plugins.build();\n }\n};\n","export interface TimeSource {\n now(): number;\n}\n\nexport class Clock {\n private lastTimeMs_: number;\n private elapsedTime_: number = 0;\n private dt_: number = 0;\n\n public constructor(\n private readonly timeSource_: TimeSource,\n ) {\n this.lastTimeMs_ = timeSource_.now();\n }\n\n\n public get dt(): number {\n return this.dt_;\n }\n public get ellapsedTime(): number {\n return this.elapsedTime_;\n }\n\n public tick(): void {\n const now = this.timeSource_.now();\n const dt = now - this.lastTimeMs_;\n this.dt_ = dt;\n this.elapsedTime_ += dt;\n this.lastTimeMs_ = now;\n }\n};\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 world: World,\n private readonly clock: Clock,\n private readonly stepFn: StepFunction,\n private readonly platformLoop: PlatformLoop,\n ) { };\n\n public start() {\n this.running = true;\n\n const loop = () => {\n if (!this.running) return;\n\n this.clock.tick();\n this.stepFn(this.clock.dt, this.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 { Loop } from \"./loop\";\n\nexport class Runtime {\n constructor(\n private readonly loop: Loop,\n ) { };\n public run(): void {\n this.loop.start()\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","import { AssetsManager } from \"./assets/assets\";\nimport { World } from \"./ecs/world\";\nimport { Runtime } from \"./runtime/runtime\";\nimport { Loop } from \"./runtime/loop\";\n\nexport type EngineConstructor = {\n loop: Loop\n};\n\nexport class Engine {\n public readonly runtime: Runtime;\n public readonly world: World;\n public readonly assets: AssetsManager;\n constructor(params: EngineConstructor) {\n this.world = new World();\n this.runtime = new Runtime(params.loop);\n this.assets = new AssetsManager();\n }\n\n public init(): void {\n this.world.build();\n }\n\n public start(): void {\n this.runtime.run();\n }\n};\n"],"mappings":"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","names":["VisitedState","SystemPhase","id","id","id","id","id","id","Bitmap","entry","id","hasMetadata","entry","id","World","id","AssetState","id","World"]}
package/package.json CHANGED
@@ -1,12 +1,17 @@
1
1
  {
2
2
  "name": "@draug/engine",
3
- "version": "1.0.14",
3
+ "version": "1.0.16",
4
4
  "type": "module",
5
5
  "author": {
6
6
  "name": "future_undefined",
7
7
  "email": "evgenijantonenkov456@gmail.com",
8
8
  "url": "https://github.com/yazmeyaa"
9
9
  },
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "git+https://github.com/yazmeyaa/draug-engine.git",
13
+ "directory": "packages/engine"
14
+ },
10
15
  "description": "Amber game engine. Based on ECS architecture.",
11
16
  "license": "GPL-3.0-only",
12
17
  "readme": "README.md",