@lagless/core 0.0.36 → 0.0.38

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.
Files changed (102) hide show
  1. package/dist/index.d.ts +11 -0
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/lib/di/di-container.d.ts +7 -0
  4. package/dist/lib/di/di-container.d.ts.map +1 -0
  5. package/dist/lib/di/di-decorators.d.ts +4 -0
  6. package/dist/lib/di/di-decorators.d.ts.map +1 -0
  7. package/dist/lib/di/index.d.ts +3 -0
  8. package/dist/lib/di/index.d.ts.map +1 -0
  9. package/dist/lib/ecs-config.d.ts +16 -0
  10. package/dist/lib/ecs-config.d.ts.map +1 -0
  11. package/dist/lib/ecs-runner.d.ts +20 -0
  12. package/dist/lib/ecs-runner.d.ts.map +1 -0
  13. package/dist/lib/ecs-runner.js +8 -2
  14. package/dist/lib/ecs-runner.js.map +1 -1
  15. package/dist/lib/ecs-simulation.d.ts +64 -0
  16. package/dist/lib/ecs-simulation.d.ts.map +1 -0
  17. package/dist/lib/ecs-simulation.js +57 -1
  18. package/dist/lib/ecs-simulation.js.map +1 -1
  19. package/dist/lib/hash-verification/abstract-hash-verification.system.d.ts +32 -0
  20. package/dist/lib/hash-verification/abstract-hash-verification.system.d.ts.map +1 -0
  21. package/dist/lib/hash-verification/abstract-hash-verification.system.js +5 -0
  22. package/dist/lib/hash-verification/abstract-hash-verification.system.js.map +1 -1
  23. package/dist/lib/hash-verification/create-hash-reporter.d.ts +16 -0
  24. package/dist/lib/hash-verification/create-hash-reporter.d.ts.map +1 -0
  25. package/dist/lib/hash-verification/create-hash-reporter.js +11 -8
  26. package/dist/lib/hash-verification/create-hash-reporter.js.map +1 -1
  27. package/dist/lib/hash-verification/divergence.signal.d.ts +11 -0
  28. package/dist/lib/hash-verification/divergence.signal.d.ts.map +1 -0
  29. package/dist/lib/hash-verification/index.d.ts +4 -0
  30. package/dist/lib/hash-verification/index.d.ts.map +1 -0
  31. package/dist/lib/input/abstract-input-provider.d.ts +62 -0
  32. package/dist/lib/input/abstract-input-provider.d.ts.map +1 -0
  33. package/dist/lib/input/abstract-input-provider.js +8 -1
  34. package/dist/lib/input/abstract-input-provider.js.map +1 -1
  35. package/dist/lib/input/index.d.ts +8 -0
  36. package/dist/lib/input/index.d.ts.map +1 -0
  37. package/dist/lib/input/input-provider-di-token.d.ts +7 -0
  38. package/dist/lib/input/input-provider-di-token.d.ts.map +1 -0
  39. package/dist/lib/input/input-provider-di-token.js +3 -0
  40. package/dist/lib/input/input-provider-di-token.js.map +1 -1
  41. package/dist/lib/input/input-registry.d.ts +8 -0
  42. package/dist/lib/input/input-registry.d.ts.map +1 -0
  43. package/dist/lib/input/local-input-provider.d.ts +7 -0
  44. package/dist/lib/input/local-input-provider.d.ts.map +1 -0
  45. package/dist/lib/input/local-input-provider.js +5 -0
  46. package/dist/lib/input/local-input-provider.js.map +1 -1
  47. package/dist/lib/input/replay-input-provider.d.ts +13 -0
  48. package/dist/lib/input/replay-input-provider.d.ts.map +1 -0
  49. package/dist/lib/input/replay-input-provider.js +5 -0
  50. package/dist/lib/input/replay-input-provider.js.map +1 -1
  51. package/dist/lib/input/rpc-history.d.ts +40 -0
  52. package/dist/lib/input/rpc-history.d.ts.map +1 -0
  53. package/dist/lib/input/rpc.d.ts +8 -0
  54. package/dist/lib/input/rpc.d.ts.map +1 -0
  55. package/dist/lib/mem/abstract-memory.interface.d.ts +6 -0
  56. package/dist/lib/mem/abstract-memory.interface.d.ts.map +1 -0
  57. package/dist/lib/mem/index.d.ts +5 -0
  58. package/dist/lib/mem/index.d.ts.map +1 -0
  59. package/dist/lib/mem/managers/components-manager.d.ts +15 -0
  60. package/dist/lib/mem/managers/components-manager.d.ts.map +1 -0
  61. package/dist/lib/mem/managers/entities-manager.d.ts +32 -0
  62. package/dist/lib/mem/managers/entities-manager.d.ts.map +1 -0
  63. package/dist/lib/mem/managers/entities-manager.js +65 -23
  64. package/dist/lib/mem/managers/entities-manager.js.map +1 -1
  65. package/dist/lib/mem/managers/filters-manager.d.ts +17 -0
  66. package/dist/lib/mem/managers/filters-manager.d.ts.map +1 -0
  67. package/dist/lib/mem/managers/filters-manager.js +19 -4
  68. package/dist/lib/mem/managers/filters-manager.js.map +1 -1
  69. package/dist/lib/mem/managers/player-resources-manager.d.ts +21 -0
  70. package/dist/lib/mem/managers/player-resources-manager.d.ts.map +1 -0
  71. package/dist/lib/mem/managers/prng-manager.d.ts +36 -0
  72. package/dist/lib/mem/managers/prng-manager.d.ts.map +1 -0
  73. package/dist/lib/mem/managers/singletons-manager.d.ts +13 -0
  74. package/dist/lib/mem/managers/singletons-manager.d.ts.map +1 -0
  75. package/dist/lib/mem/managers/tick-manager.d.ts +10 -0
  76. package/dist/lib/mem/managers/tick-manager.d.ts.map +1 -0
  77. package/dist/lib/mem/mem.d.ts +28 -0
  78. package/dist/lib/mem/mem.d.ts.map +1 -0
  79. package/dist/lib/mem/mem.js +4 -2
  80. package/dist/lib/mem/mem.js.map +1 -1
  81. package/dist/lib/prefab.d.ts +16 -0
  82. package/dist/lib/prefab.d.ts.map +1 -0
  83. package/dist/lib/signals/event-emitter.d.ts +9 -0
  84. package/dist/lib/signals/event-emitter.d.ts.map +1 -0
  85. package/dist/lib/signals/signal.d.ts +41 -0
  86. package/dist/lib/signals/signal.d.ts.map +1 -0
  87. package/dist/lib/signals/signal.js +34 -34
  88. package/dist/lib/signals/signal.js.map +1 -1
  89. package/dist/lib/signals/signals.registry.d.ts +9 -0
  90. package/dist/lib/signals/signals.registry.d.ts.map +1 -0
  91. package/dist/lib/signals/signals.registry.js +2 -2
  92. package/dist/lib/signals/signals.registry.js.map +1 -1
  93. package/dist/lib/types/abstract-filter.d.ts +17 -0
  94. package/dist/lib/types/abstract-filter.d.ts.map +1 -0
  95. package/dist/lib/types/abstract-filter.js +22 -21
  96. package/dist/lib/types/abstract-filter.js.map +1 -1
  97. package/dist/lib/types/ecs-types.d.ts +111 -0
  98. package/dist/lib/types/ecs-types.d.ts.map +1 -0
  99. package/dist/lib/types/ecs-types.js.map +1 -1
  100. package/dist/lib/types/index.d.ts +3 -0
  101. package/dist/lib/types/index.d.ts.map +1 -0
  102. package/package.json +4 -5
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/mem/managers/entities-manager.ts"],"sourcesContent":["import { FiltersManager } from './filters-manager.js';\nimport { ComponentsManager } from './components-manager.js';\nimport { IAbstractMemory } from '../abstract-memory.interface.js';\nimport { ECSConfig } from '../../ecs-config.js';\nimport { Prefab } from '../../prefab.js';\nimport { IComponentConstructor } from '../../types/index.js';\nimport { MemoryTracker } from '@lagless/binary';\n\n/** Sentinel value indicating an entity slot is unused / removed. */\nexport const ENTITY_REMOVED_MASK = 0xFFFFFFFF;\n\nexport class EntitiesManager implements IAbstractMemory {\n private _nextEntityId!: Uint32Array;\n private _removedEntitiesLength!: Uint32Array;\n private _removedEntities!: Uint32Array;\n private _entitiesComponentsMasks!: Uint32Array;\n\n constructor(\n private readonly _ECSConfig: ECSConfig,\n private readonly _ComponentsMemory: ComponentsManager,\n private readonly _FiltersMemory: FiltersManager,\n ) {}\n\n public createEntity(prefab?: Prefab): number {\n let entity = this.popRemovedEntities();\n if (entity === undefined) {\n entity = this._nextEntityId[0];\n this._nextEntityId[0]++;\n }\n if (entity >= this._ECSConfig.maxEntities) {\n throw new Error(`Maximum number of entities (${this._ECSConfig.maxEntities}) exceeded`);\n }\n\n this._entitiesComponentsMasks[entity] = 0;\n\n if (prefab) {\n for (const [ ComponentConstructor, Values ] of prefab) {\n const componentInstance = this._ComponentsMemory.get(ComponentConstructor);\n this._entitiesComponentsMasks[entity] |= ComponentConstructor.ID;\n if (!Values) continue;\n for (const [ fieldName, value ] of Object.entries(Values)) {\n if (value === undefined) continue;\n componentInstance.unsafe[fieldName as keyof typeof componentInstance.unsafe][entity] = value;\n }\n }\n }\n\n this.updateFilters(entity, this._entitiesComponentsMasks[entity]);\n\n return entity;\n }\n\n public removeEntity(entity: number): void {\n if (entity < 0 || entity >= this._ECSConfig.maxEntities) {\n throw new Error(`Entity ID ${entity} is out of bounds`);\n }\n\n // Guard against double removal\n if (this._entitiesComponentsMasks[entity] === ENTITY_REMOVED_MASK) {\n return;\n }\n\n this._entitiesComponentsMasks[entity] = ENTITY_REMOVED_MASK;\n\n // Add the entity to the removed entities stack\n this._removedEntities[this._removedEntitiesLength[0]] = entity;\n this._removedEntitiesLength[0]++;\n\n this.updateFilters(entity, ENTITY_REMOVED_MASK);\n }\n\n public isEntityAlive(entity: number): boolean {\n if (entity < 0 || entity >= this._ECSConfig.maxEntities) return false;\n return this._entitiesComponentsMasks[entity] !== ENTITY_REMOVED_MASK;\n }\n\n public addComponent(entity: number, ComponentConstructor: IComponentConstructor): void {\n this._entitiesComponentsMasks[entity] |= ComponentConstructor.ID;\n this.updateFilters(entity, this._entitiesComponentsMasks[entity]);\n }\n\n public removeComponent(entity: number, ComponentConstructor: IComponentConstructor): void {\n this._entitiesComponentsMasks[entity] &= ~ComponentConstructor.ID;\n this.updateFilters(entity, this._entitiesComponentsMasks[entity]);\n }\n\n public hasComponent(entity: number, ComponentConstructor: IComponentConstructor): boolean {\n if (entity < 0 || entity >= this._ECSConfig.maxEntities) {\n throw new Error(`Entity ID ${entity} is out of bounds`);\n }\n return (this._entitiesComponentsMasks[entity] & ComponentConstructor.ID) !== 0;\n }\n\n public hasPrefab(entity: number, prefab: Prefab): boolean {\n for (const [ ComponentConstructor ] of prefab) {\n if ((this._entitiesComponentsMasks[entity] & ComponentConstructor.ID) === 0) {\n return false;\n }\n }\n\n return true;\n }\n\n private updateFilters(entity: number, componentMask: number): void {\n if (componentMask === ENTITY_REMOVED_MASK || componentMask === 0) {\n this._FiltersMemory.removeEntityFromAllFilters(entity);\n } else {\n this._FiltersMemory.updateEntityInAllFilters(entity, componentMask);\n }\n }\n\n private popRemovedEntities(): number | undefined {\n if (this._removedEntitiesLength[0] === 0) {\n return undefined;\n }\n\n const entity = this._removedEntities[this._removedEntitiesLength[0] - 1];\n this._removedEntitiesLength[0]--;\n\n return entity;\n }\n\n public init(arrayBuffer: ArrayBuffer, tracker: MemoryTracker): void {\n this._nextEntityId = new Uint32Array(arrayBuffer, tracker.ptr, 1);\n tracker.add(this._nextEntityId.byteLength);\n\n this._removedEntitiesLength = new Uint32Array(arrayBuffer, tracker.ptr, 1);\n tracker.add(this._removedEntitiesLength.byteLength);\n\n this._removedEntities = new Uint32Array(arrayBuffer, tracker.ptr, this._ECSConfig.maxEntities);\n tracker.add(this._removedEntities.byteLength);\n\n this._entitiesComponentsMasks = new Uint32Array(arrayBuffer, tracker.ptr, this._ECSConfig.maxEntities);\n this._entitiesComponentsMasks.fill(ENTITY_REMOVED_MASK);\n tracker.add(this._entitiesComponentsMasks.byteLength);\n }\n\n public calculateSize(tracker: MemoryTracker): void {\n tracker.add(Uint32Array.BYTES_PER_ELEMENT); // nextEntityId\n tracker.add(Uint32Array.BYTES_PER_ELEMENT); // removedEntitiesLength\n tracker.add(this._ECSConfig.maxEntities * Uint32Array.BYTES_PER_ELEMENT); // removedEntities\n tracker.add(this._ECSConfig.maxEntities * Uint32Array.BYTES_PER_ELEMENT); // entitiesComponentsMasks\n }\n}\n"],"names":["ENTITY_REMOVED_MASK","EntitiesManager","createEntity","prefab","entity","popRemovedEntities","undefined","_nextEntityId","_ECSConfig","maxEntities","Error","_entitiesComponentsMasks","ComponentConstructor","Values","componentInstance","_ComponentsMemory","get","ID","fieldName","value","Object","entries","unsafe","updateFilters","removeEntity","_removedEntities","_removedEntitiesLength","isEntityAlive","addComponent","removeComponent","hasComponent","hasPrefab","componentMask","_FiltersMemory","removeEntityFromAllFilters","updateEntityInAllFilters","init","arrayBuffer","tracker","Uint32Array","ptr","add","byteLength","fill","calculateSize","BYTES_PER_ELEMENT","constructor"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/lib/mem/managers/entities-manager.ts"],"sourcesContent":["import { FiltersManager } from './filters-manager.js';\nimport { ComponentsManager } from './components-manager.js';\nimport { IAbstractMemory } from '../abstract-memory.interface.js';\nimport { ECSConfig } from '../../ecs-config.js';\nimport { Prefab } from '../../prefab.js';\nimport { IComponentConstructor } from '../../types/index.js';\nimport { MemoryTracker } from '@lagless/binary';\n\n/** Sentinel value indicating an entity slot is unused / removed. All mask words are set to 0xFFFFFFFF. */\nexport const ENTITY_REMOVED_MASK = 0xFFFFFFFF;\n\nexport class EntitiesManager implements IAbstractMemory {\n private _nextEntityId!: Uint32Array;\n private _removedEntitiesLength!: Uint32Array;\n private _removedEntities!: Uint32Array;\n private _entitiesComponentsMasks!: Uint32Array;\n\n constructor(\n private readonly _ECSConfig: ECSConfig,\n private readonly _ComponentsMemory: ComponentsManager,\n private readonly _FiltersMemory: FiltersManager,\n private readonly _maskWords: 1 | 2 = 1,\n ) {}\n\n public createEntity(prefab?: Prefab): number {\n let entity = this.popRemovedEntities();\n if (entity === undefined) {\n entity = this._nextEntityId[0];\n this._nextEntityId[0]++;\n }\n if (entity >= this._ECSConfig.maxEntities) {\n throw new Error(`Maximum number of entities (${this._ECSConfig.maxEntities}) exceeded`);\n }\n\n // Clear all mask words for the entity\n const base = entity * this._maskWords;\n for (let w = 0; w < this._maskWords; w++) {\n this._entitiesComponentsMasks[base + w] = 0;\n }\n\n if (prefab) {\n for (const [ ComponentConstructor, Values ] of prefab) {\n const bitIndex = ComponentConstructor.ID;\n const wordOffset = bitIndex >>> 5;\n const bit = 1 << (bitIndex & 31);\n this._entitiesComponentsMasks[base + wordOffset] |= bit;\n if (!Values) continue;\n const componentInstance = this._ComponentsMemory.get(ComponentConstructor);\n for (const [ fieldName, value ] of Object.entries(Values)) {\n if (value === undefined) continue;\n componentInstance.unsafe[fieldName as keyof typeof componentInstance.unsafe][entity] = value;\n }\n }\n }\n\n this.updateFilters(entity);\n\n return entity;\n }\n\n public removeEntity(entity: number): void {\n if (entity < 0 || entity >= this._ECSConfig.maxEntities) {\n throw new Error(`Entity ID ${entity} is out of bounds`);\n }\n\n const base = entity * this._maskWords;\n\n // Guard against double removal (all mask words must be sentinel)\n let isRemoved = true;\n for (let w = 0; w < this._maskWords; w++) {\n if (this._entitiesComponentsMasks[base + w] !== ENTITY_REMOVED_MASK) {\n isRemoved = false;\n break;\n }\n }\n if (isRemoved) return;\n\n // Set all mask words to sentinel\n for (let w = 0; w < this._maskWords; w++) {\n this._entitiesComponentsMasks[base + w] = ENTITY_REMOVED_MASK;\n }\n\n // Add the entity to the removed entities stack\n this._removedEntities[this._removedEntitiesLength[0]] = entity;\n this._removedEntitiesLength[0]++;\n\n this._FiltersMemory.removeEntityFromAllFilters(entity);\n }\n\n public isEntityAlive(entity: number): boolean {\n if (entity < 0 || entity >= this._ECSConfig.maxEntities) return false;\n const base = entity * this._maskWords;\n for (let w = 0; w < this._maskWords; w++) {\n if (this._entitiesComponentsMasks[base + w] !== ENTITY_REMOVED_MASK) return true;\n }\n return false;\n }\n\n public addComponent(entity: number, ComponentConstructor: IComponentConstructor): void {\n const bitIndex = ComponentConstructor.ID;\n const base = entity * this._maskWords;\n const wordOffset = bitIndex >>> 5;\n this._entitiesComponentsMasks[base + wordOffset] |= 1 << (bitIndex & 31);\n this.updateFilters(entity);\n }\n\n public removeComponent(entity: number, ComponentConstructor: IComponentConstructor): void {\n const bitIndex = ComponentConstructor.ID;\n const base = entity * this._maskWords;\n const wordOffset = bitIndex >>> 5;\n this._entitiesComponentsMasks[base + wordOffset] &= ~(1 << (bitIndex & 31));\n this.updateFilters(entity);\n }\n\n public hasComponent(entity: number, ComponentConstructor: IComponentConstructor): boolean {\n if (entity < 0 || entity >= this._ECSConfig.maxEntities) {\n throw new Error(`Entity ID ${entity} is out of bounds`);\n }\n const bitIndex = ComponentConstructor.ID;\n const base = entity * this._maskWords;\n const wordOffset = bitIndex >>> 5;\n return (this._entitiesComponentsMasks[base + wordOffset] & (1 << (bitIndex & 31))) !== 0;\n }\n\n public hasPrefab(entity: number, prefab: Prefab): boolean {\n const base = entity * this._maskWords;\n for (const [ ComponentConstructor ] of prefab) {\n const bitIndex = ComponentConstructor.ID;\n const wordOffset = bitIndex >>> 5;\n if ((this._entitiesComponentsMasks[base + wordOffset] & (1 << (bitIndex & 31))) === 0) {\n return false;\n }\n }\n\n return true;\n }\n\n private updateFilters(entity: number): void {\n const base = entity * this._maskWords;\n\n // Check if entity has any components set (all words zero means empty)\n let isEmpty = true;\n for (let w = 0; w < this._maskWords; w++) {\n if (this._entitiesComponentsMasks[base + w] !== 0) {\n isEmpty = false;\n break;\n }\n }\n\n if (isEmpty) {\n this._FiltersMemory.removeEntityFromAllFilters(entity);\n } else {\n this._FiltersMemory.updateEntityInAllFilters(entity, this._entitiesComponentsMasks, base, this._maskWords);\n }\n }\n\n private popRemovedEntities(): number | undefined {\n if (this._removedEntitiesLength[0] === 0) {\n return undefined;\n }\n\n const entity = this._removedEntities[this._removedEntitiesLength[0] - 1];\n this._removedEntitiesLength[0]--;\n\n return entity;\n }\n\n public init(arrayBuffer: ArrayBuffer, tracker: MemoryTracker): void {\n this._nextEntityId = new Uint32Array(arrayBuffer, tracker.ptr, 1);\n tracker.add(this._nextEntityId.byteLength);\n\n this._removedEntitiesLength = new Uint32Array(arrayBuffer, tracker.ptr, 1);\n tracker.add(this._removedEntitiesLength.byteLength);\n\n this._removedEntities = new Uint32Array(arrayBuffer, tracker.ptr, this._ECSConfig.maxEntities);\n tracker.add(this._removedEntities.byteLength);\n\n this._entitiesComponentsMasks = new Uint32Array(arrayBuffer, tracker.ptr, this._ECSConfig.maxEntities * this._maskWords);\n this._entitiesComponentsMasks.fill(ENTITY_REMOVED_MASK);\n tracker.add(this._entitiesComponentsMasks.byteLength);\n }\n\n public calculateSize(tracker: MemoryTracker): void {\n tracker.add(Uint32Array.BYTES_PER_ELEMENT); // nextEntityId\n tracker.add(Uint32Array.BYTES_PER_ELEMENT); // removedEntitiesLength\n tracker.add(this._ECSConfig.maxEntities * Uint32Array.BYTES_PER_ELEMENT); // removedEntities\n tracker.add(this._ECSConfig.maxEntities * this._maskWords * Uint32Array.BYTES_PER_ELEMENT); // entitiesComponentsMasks\n }\n}\n"],"names":["ENTITY_REMOVED_MASK","EntitiesManager","createEntity","prefab","entity","popRemovedEntities","undefined","_nextEntityId","_ECSConfig","maxEntities","Error","base","_maskWords","w","_entitiesComponentsMasks","ComponentConstructor","Values","bitIndex","ID","wordOffset","bit","componentInstance","_ComponentsMemory","get","fieldName","value","Object","entries","unsafe","updateFilters","removeEntity","isRemoved","_removedEntities","_removedEntitiesLength","_FiltersMemory","removeEntityFromAllFilters","isEntityAlive","addComponent","removeComponent","hasComponent","hasPrefab","isEmpty","updateEntityInAllFilters","init","arrayBuffer","tracker","Uint32Array","ptr","add","byteLength","fill","calculateSize","BYTES_PER_ELEMENT","constructor"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { ECSConfig } from '../../ecs-config.js';
2
+ import { IAbstractMemory } from '../abstract-memory.interface.js';
3
+ import { ECSDeps, IFilterConstructor, IFilterInstance } from '../../types/index.js';
4
+ import { MemoryTracker } from '@lagless/binary';
5
+ export declare class FiltersManager implements IAbstractMemory {
6
+ private readonly _ECSConfig;
7
+ private readonly _ECSDeps;
8
+ private readonly _filtersInstances;
9
+ constructor(_ECSConfig: ECSConfig, _ECSDeps: ECSDeps, _maskWords?: 1 | 2);
10
+ init(arrayBuffer: ArrayBuffer, tracker: MemoryTracker): void;
11
+ calculateSize(tracker: MemoryTracker): void;
12
+ get<FilterCtor extends IFilterConstructor>(FilterConstructor: FilterCtor): InstanceType<FilterCtor>;
13
+ [Symbol.iterator](): MapIterator<[IFilterConstructor, IFilterInstance]>;
14
+ removeEntityFromAllFilters(entity: number): void;
15
+ updateEntityInAllFilters(entity: number, masks: Uint32Array, maskBase: number, maskWords: number): void;
16
+ }
17
+ //# sourceMappingURL=filters-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters-manager.d.ts","sourceRoot":"","sources":["../../../../src/lib/mem/managers/filters-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,qBAAa,cAAe,YAAW,eAAe;IAIlD,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAJ3B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAkD;gBAGjE,UAAU,EAAE,SAAS,EACrB,QAAQ,EAAE,OAAO,EAClC,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC;IAGb,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI;IAO5D,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAM3C,GAAG,CAAC,UAAU,SAAS,kBAAkB,EAAE,iBAAiB,EAAE,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC;IAQnG,CAAC,MAAM,CAAC,QAAQ,CAAC;IAIjB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAMhD,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;CA2B/G"}
@@ -25,10 +25,25 @@ export class FiltersManager {
25
25
  filterInstance.removeEntityFromFilter(entity);
26
26
  }
27
27
  }
28
- updateEntityInAllFilters(entity, componentsMask) {
28
+ updateEntityInAllFilters(entity, masks, maskBase, maskWords) {
29
29
  for (const filterInstance of this._filtersInstances.values()){
30
- const includeOk = !filterInstance.includeMask || (componentsMask & filterInstance.includeMask) === filterInstance.includeMask;
31
- const excludeOk = !filterInstance.excludeMask || (componentsMask & filterInstance.excludeMask) === 0;
30
+ let includeOk = true;
31
+ let excludeOk = true;
32
+ for(let w = 0; w < maskWords; w++){
33
+ const entityMaskWord = masks[maskBase + w];
34
+ var _filterInstance_includeMask_w;
35
+ const incWord = (_filterInstance_includeMask_w = filterInstance.includeMask[w]) != null ? _filterInstance_includeMask_w : 0;
36
+ var _filterInstance_excludeMask_w;
37
+ const excWord = (_filterInstance_excludeMask_w = filterInstance.excludeMask[w]) != null ? _filterInstance_excludeMask_w : 0;
38
+ if (incWord && (entityMaskWord & incWord) >>> 0 !== incWord >>> 0) {
39
+ includeOk = false;
40
+ break;
41
+ }
42
+ if (excWord && (entityMaskWord & excWord) !== 0) {
43
+ excludeOk = false;
44
+ break;
45
+ }
46
+ }
32
47
  if (includeOk && excludeOk) {
33
48
  filterInstance.addEntityToFilter(entity);
34
49
  } else {
@@ -36,7 +51,7 @@ export class FiltersManager {
36
51
  }
37
52
  }
38
53
  }
39
- constructor(_ECSConfig, _ECSDeps){
54
+ constructor(_ECSConfig, _ECSDeps, _maskWords){
40
55
  this._ECSConfig = _ECSConfig;
41
56
  this._ECSDeps = _ECSDeps;
42
57
  this._filtersInstances = new Map();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/mem/managers/filters-manager.ts"],"sourcesContent":["import { ECSConfig } from '../../ecs-config.js';\nimport { IAbstractMemory } from '../abstract-memory.interface.js';\nimport { ECSDeps, IFilterConstructor, IFilterInstance } from '../../types/index.js';\nimport { MemoryTracker } from '@lagless/binary';\n\nexport class FiltersManager implements IAbstractMemory {\n private readonly _filtersInstances = new Map<IFilterConstructor, IFilterInstance>();\n\n constructor(private readonly _ECSConfig: ECSConfig, private readonly _ECSDeps: ECSDeps) {}\n\n public init(arrayBuffer: ArrayBuffer, tracker: MemoryTracker): void {\n for (const FilterConstructor of this._ECSDeps.filters) {\n const filterInstance = new FilterConstructor(this._ECSConfig.maxEntities, arrayBuffer, tracker);\n this._filtersInstances.set(FilterConstructor, filterInstance);\n }\n }\n\n public calculateSize(tracker: MemoryTracker): void {\n for (const FilterDefinition of this._ECSDeps.filters) {\n FilterDefinition.calculateSize(this._ECSConfig.maxEntities, tracker);\n }\n }\n\n public get<FilterCtor extends IFilterConstructor>(FilterConstructor: FilterCtor): InstanceType<FilterCtor> {\n const filterInstance = this._filtersInstances.get(FilterConstructor);\n if (!filterInstance) {\n throw new Error(`Filter ${FilterConstructor.name} not found`);\n }\n return filterInstance as InstanceType<FilterCtor>;\n }\n\n public [Symbol.iterator]() {\n return this._filtersInstances.entries();\n }\n\n public removeEntityFromAllFilters(entity: number): void {\n for (const filterInstance of this._filtersInstances.values()) {\n filterInstance.removeEntityFromFilter(entity);\n }\n }\n\n public updateEntityInAllFilters(entity: number, componentsMask: number): void {\n for (const filterInstance of this._filtersInstances.values()) {\n const includeOk = !filterInstance.includeMask\n || (componentsMask & filterInstance.includeMask) === filterInstance.includeMask;\n const excludeOk = !filterInstance.excludeMask\n || (componentsMask & filterInstance.excludeMask) === 0;\n\n if (includeOk && excludeOk) {\n filterInstance.addEntityToFilter(entity);\n } else {\n filterInstance.removeEntityFromFilter(entity);\n }\n }\n }\n}\n"],"names":["FiltersManager","init","arrayBuffer","tracker","FilterConstructor","_ECSDeps","filters","filterInstance","_ECSConfig","maxEntities","_filtersInstances","set","calculateSize","FilterDefinition","get","Error","name","Symbol","iterator","entries","removeEntityFromAllFilters","entity","values","removeEntityFromFilter","updateEntityInAllFilters","componentsMask","includeOk","includeMask","excludeOk","excludeMask","addEntityToFilter","constructor","Map"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAKA,OAAO,MAAMA;IAKJC,KAAKC,WAAwB,EAAEC,OAAsB,EAAQ;QAClE,KAAK,MAAMC,qBAAqB,IAAI,CAACC,QAAQ,CAACC,OAAO,CAAE;YACrD,MAAMC,iBAAiB,IAAIH,kBAAkB,IAAI,CAACI,UAAU,CAACC,WAAW,EAAEP,aAAaC;YACvF,IAAI,CAACO,iBAAiB,CAACC,GAAG,CAACP,mBAAmBG;QAChD;IACF;IAEOK,cAAcT,OAAsB,EAAQ;QACjD,KAAK,MAAMU,oBAAoB,IAAI,CAACR,QAAQ,CAACC,OAAO,CAAE;YACpDO,iBAAiBD,aAAa,CAAC,IAAI,CAACJ,UAAU,CAACC,WAAW,EAAEN;QAC9D;IACF;IAEOW,IAA2CV,iBAA6B,EAA4B;QACzG,MAAMG,iBAAiB,IAAI,CAACG,iBAAiB,CAACI,GAAG,CAACV;QAClD,IAAI,CAACG,gBAAgB;YACnB,MAAM,IAAIQ,MAAM,CAAC,OAAO,EAAEX,kBAAkBY,IAAI,CAAC,UAAU,CAAC;QAC9D;QACA,OAAOT;IACT;IAEO,CAACU,OAAOC,QAAQ,CAAC,GAAG;QACzB,OAAO,IAAI,CAACR,iBAAiB,CAACS,OAAO;IACvC;IAEOC,2BAA2BC,MAAc,EAAQ;QACtD,KAAK,MAAMd,kBAAkB,IAAI,CAACG,iBAAiB,CAACY,MAAM,GAAI;YAC5Df,eAAegB,sBAAsB,CAACF;QACxC;IACF;IAEOG,yBAAyBH,MAAc,EAAEI,cAAsB,EAAQ;QAC5E,KAAK,MAAMlB,kBAAkB,IAAI,CAACG,iBAAiB,CAACY,MAAM,GAAI;YAC5D,MAAMI,YAAY,CAACnB,eAAeoB,WAAW,IACxC,AAACF,CAAAA,iBAAiBlB,eAAeoB,WAAW,AAAD,MAAOpB,eAAeoB,WAAW;YACjF,MAAMC,YAAY,CAACrB,eAAesB,WAAW,IACxC,AAACJ,CAAAA,iBAAiBlB,eAAesB,WAAW,AAAD,MAAO;YAEvD,IAAIH,aAAaE,WAAW;gBAC1BrB,eAAeuB,iBAAiB,CAACT;YACnC,OAAO;gBACLd,eAAegB,sBAAsB,CAACF;YACxC;QACF;IACF;IA9CAU,YAAY,AAAiBvB,UAAqB,EAAE,AAAiBH,QAAiB,CAAE;aAA3DG,aAAAA;aAAwCH,WAAAA;aAFpDK,oBAAoB,IAAIsB;IAEgD;AA+C3F"}
1
+ {"version":3,"sources":["../../../../src/lib/mem/managers/filters-manager.ts"],"sourcesContent":["import { ECSConfig } from '../../ecs-config.js';\nimport { IAbstractMemory } from '../abstract-memory.interface.js';\nimport { ECSDeps, IFilterConstructor, IFilterInstance } from '../../types/index.js';\nimport { MemoryTracker } from '@lagless/binary';\n\nexport class FiltersManager implements IAbstractMemory {\n private readonly _filtersInstances = new Map<IFilterConstructor, IFilterInstance>();\n\n constructor(\n private readonly _ECSConfig: ECSConfig,\n private readonly _ECSDeps: ECSDeps,\n _maskWords?: 1 | 2,\n ) {}\n\n public init(arrayBuffer: ArrayBuffer, tracker: MemoryTracker): void {\n for (const FilterConstructor of this._ECSDeps.filters) {\n const filterInstance = new FilterConstructor(this._ECSConfig.maxEntities, arrayBuffer, tracker);\n this._filtersInstances.set(FilterConstructor, filterInstance);\n }\n }\n\n public calculateSize(tracker: MemoryTracker): void {\n for (const FilterDefinition of this._ECSDeps.filters) {\n FilterDefinition.calculateSize(this._ECSConfig.maxEntities, tracker);\n }\n }\n\n public get<FilterCtor extends IFilterConstructor>(FilterConstructor: FilterCtor): InstanceType<FilterCtor> {\n const filterInstance = this._filtersInstances.get(FilterConstructor);\n if (!filterInstance) {\n throw new Error(`Filter ${FilterConstructor.name} not found`);\n }\n return filterInstance as InstanceType<FilterCtor>;\n }\n\n public [Symbol.iterator]() {\n return this._filtersInstances.entries();\n }\n\n public removeEntityFromAllFilters(entity: number): void {\n for (const filterInstance of this._filtersInstances.values()) {\n filterInstance.removeEntityFromFilter(entity);\n }\n }\n\n public updateEntityInAllFilters(entity: number, masks: Uint32Array, maskBase: number, maskWords: number): void {\n for (const filterInstance of this._filtersInstances.values()) {\n let includeOk = true;\n let excludeOk = true;\n\n for (let w = 0; w < maskWords; w++) {\n const entityMaskWord = masks[maskBase + w];\n const incWord = filterInstance.includeMask[w] ?? 0;\n const excWord = filterInstance.excludeMask[w] ?? 0;\n\n if (incWord && ((entityMaskWord & incWord) >>> 0) !== (incWord >>> 0)) {\n includeOk = false;\n break;\n }\n if (excWord && (entityMaskWord & excWord) !== 0) {\n excludeOk = false;\n break;\n }\n }\n\n if (includeOk && excludeOk) {\n filterInstance.addEntityToFilter(entity);\n } else {\n filterInstance.removeEntityFromFilter(entity);\n }\n }\n }\n}\n"],"names":["FiltersManager","init","arrayBuffer","tracker","FilterConstructor","_ECSDeps","filters","filterInstance","_ECSConfig","maxEntities","_filtersInstances","set","calculateSize","FilterDefinition","get","Error","name","Symbol","iterator","entries","removeEntityFromAllFilters","entity","values","removeEntityFromFilter","updateEntityInAllFilters","masks","maskBase","maskWords","includeOk","excludeOk","w","entityMaskWord","incWord","includeMask","excWord","excludeMask","addEntityToFilter","constructor","_maskWords","Map"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAKA,OAAO,MAAMA;IASJC,KAAKC,WAAwB,EAAEC,OAAsB,EAAQ;QAClE,KAAK,MAAMC,qBAAqB,IAAI,CAACC,QAAQ,CAACC,OAAO,CAAE;YACrD,MAAMC,iBAAiB,IAAIH,kBAAkB,IAAI,CAACI,UAAU,CAACC,WAAW,EAAEP,aAAaC;YACvF,IAAI,CAACO,iBAAiB,CAACC,GAAG,CAACP,mBAAmBG;QAChD;IACF;IAEOK,cAAcT,OAAsB,EAAQ;QACjD,KAAK,MAAMU,oBAAoB,IAAI,CAACR,QAAQ,CAACC,OAAO,CAAE;YACpDO,iBAAiBD,aAAa,CAAC,IAAI,CAACJ,UAAU,CAACC,WAAW,EAAEN;QAC9D;IACF;IAEOW,IAA2CV,iBAA6B,EAA4B;QACzG,MAAMG,iBAAiB,IAAI,CAACG,iBAAiB,CAACI,GAAG,CAACV;QAClD,IAAI,CAACG,gBAAgB;YACnB,MAAM,IAAIQ,MAAM,CAAC,OAAO,EAAEX,kBAAkBY,IAAI,CAAC,UAAU,CAAC;QAC9D;QACA,OAAOT;IACT;IAEO,CAACU,OAAOC,QAAQ,CAAC,GAAG;QACzB,OAAO,IAAI,CAACR,iBAAiB,CAACS,OAAO;IACvC;IAEOC,2BAA2BC,MAAc,EAAQ;QACtD,KAAK,MAAMd,kBAAkB,IAAI,CAACG,iBAAiB,CAACY,MAAM,GAAI;YAC5Df,eAAegB,sBAAsB,CAACF;QACxC;IACF;IAEOG,yBAAyBH,MAAc,EAAEI,KAAkB,EAAEC,QAAgB,EAAEC,SAAiB,EAAQ;QAC7G,KAAK,MAAMpB,kBAAkB,IAAI,CAACG,iBAAiB,CAACY,MAAM,GAAI;YAC5D,IAAIM,YAAY;YAChB,IAAIC,YAAY;YAEhB,IAAK,IAAIC,IAAI,GAAGA,IAAIH,WAAWG,IAAK;gBAClC,MAAMC,iBAAiBN,KAAK,CAACC,WAAWI,EAAE;oBAC1BvB;gBAAhB,MAAMyB,UAAUzB,CAAAA,gCAAAA,eAAe0B,WAAW,CAACH,EAAE,YAA7BvB,gCAAiC;oBACjCA;gBAAhB,MAAM2B,UAAU3B,CAAAA,gCAAAA,eAAe4B,WAAW,CAACL,EAAE,YAA7BvB,gCAAiC;gBAEjD,IAAIyB,WAAW,AAAED,CAAAA,iBAAiBC,OAAM,MAAO,MAAQA,YAAY,GAAI;oBACrEJ,YAAY;oBACZ;gBACF;gBACA,IAAIM,WAAW,AAACH,CAAAA,iBAAiBG,OAAM,MAAO,GAAG;oBAC/CL,YAAY;oBACZ;gBACF;YACF;YAEA,IAAID,aAAaC,WAAW;gBAC1BtB,eAAe6B,iBAAiB,CAACf;YACnC,OAAO;gBACLd,eAAegB,sBAAsB,CAACF;YACxC;QACF;IACF;IA/DAgB,YACE,AAAiB7B,UAAqB,EACtC,AAAiBH,QAAiB,EAClCiC,UAAkB,CAClB;aAHiB9B,aAAAA;aACAH,WAAAA;aAJFK,oBAAoB,IAAI6B;IAMtC;AA4DL"}
@@ -0,0 +1,21 @@
1
+ import { IAbstractMemory } from '../abstract-memory.interface.js';
2
+ import { ECSConfig } from '../../ecs-config.js';
3
+ import { ECSDeps, IPlayerResourceConstructor, IPlayerResourceInstance, ISingletonConstructor } from '../../types/index.js';
4
+ import { MemoryTracker } from '@lagless/binary';
5
+ export declare class PlayerResourcesManager implements IAbstractMemory {
6
+ private readonly _ECSConfig;
7
+ private readonly _ECSDeps;
8
+ private readonly _playerResourcesRegistry;
9
+ readonly PlayerResources: PlayerResources;
10
+ constructor(_ECSConfig: ECSConfig, _ECSDeps: ECSDeps);
11
+ init(arrayBuffer: ArrayBuffer, tracker: MemoryTracker): void;
12
+ calculateSize(tracker: MemoryTracker): void;
13
+ get<Ctor extends ISingletonConstructor>(SingletonConstructor: Ctor, playerSlot: number): InstanceType<Ctor>;
14
+ [Symbol.iterator](): MapIterator<[IPlayerResourceConstructor, IPlayerResourceInstance[]]>;
15
+ }
16
+ export declare class PlayerResources {
17
+ private readonly _playerResourcesManager;
18
+ constructor(_playerResourcesManager: PlayerResourcesManager);
19
+ get<Ctor extends IPlayerResourceConstructor>(PlayerResourceConstructor: Ctor, playerSlot: number): InstanceType<Ctor>;
20
+ }
21
+ //# sourceMappingURL=player-resources-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-resources-manager.d.ts","sourceRoot":"","sources":["../../../../src/lib/mem/managers/player-resources-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EACL,OAAO,EACP,0BAA0B,EAC1B,uBAAuB,EACvB,qBAAqB,EACtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,qBAAa,sBAAuB,YAAW,eAAe;IAIhD,OAAO,CAAC,QAAQ,CAAC,UAAU;IAAa,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAH7E,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAyE;IAClH,SAAgB,eAAe,EAAE,eAAe,CAAC;gBAEpB,UAAU,EAAE,SAAS,EAAmB,QAAQ,EAAE,OAAO;IAI/E,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI;IAW5D,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAQ3C,GAAG,CAAC,IAAI,SAAS,qBAAqB,EAAE,oBAAoB,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC;IAkB3G,CAAC,MAAM,CAAC,QAAQ,CAAC;CAGzB;AAED,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,uBAAuB;gBAAvB,uBAAuB,EAAE,sBAAsB;IAErE,GAAG,CAAC,IAAI,SAAS,0BAA0B,EAChD,yBAAyB,EAAE,IAAI,EAC/B,UAAU,EAAE,MAAM,GACjB,YAAY,CAAC,IAAI,CAAC;CAGtB"}
@@ -0,0 +1,36 @@
1
+ import { MemoryTracker } from '@lagless/binary';
2
+ import { ECSConfig, RawSeed } from '../../ecs-config.js';
3
+ import { IAbstractMemory } from '../abstract-memory.interface.js';
4
+ export declare class PRNG {
5
+ private readonly _PRNGManager;
6
+ constructor(_PRNGManager: PRNGManager);
7
+ getFloat(): number;
8
+ getFloat53(): number;
9
+ getRandomInt(from: number, to: number): number;
10
+ getRandomIntInclusive(from: number, to: number): number;
11
+ }
12
+ export declare class PRNGManager implements IAbstractMemory {
13
+ private readonly _ECSConfig;
14
+ private _state;
15
+ readonly prng: PRNG;
16
+ private readonly _tmpSeedBuffer;
17
+ constructor(_ECSConfig: ECSConfig);
18
+ init(arrayBuffer: ArrayBuffer, tracker: MemoryTracker): void;
19
+ calculateSize(tracker: MemoryTracker): void;
20
+ /** Returns a uniform float in [0, 1). Uses 32 random bits. */
21
+ getFloat(): number;
22
+ /** Returns a float in [0, 1) using 53 bits of randomness (two 32-bit draws). */
23
+ getFloat53(): number;
24
+ /** Returns integer in [from, to) without modulo bias. */
25
+ getRandomInt(from: number, to: number): number;
26
+ /** Returns integer in [from, to] without modulo bias. */
27
+ getRandomIntInclusive(from: number, to: number): number;
28
+ /** Re-seed the PRNG from a 16-byte seed (e.g. received via ServerHello). */
29
+ reseed(seed: RawSeed): void;
30
+ /** Seed from 128 bits (Uint8Array of 16 bytes). */
31
+ private seed128;
32
+ /** Core step: returns next uint32. */
33
+ private nextUint32;
34
+ getSeedHash(): string;
35
+ }
36
+ //# sourceMappingURL=prng-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prng-manager.d.ts","sourceRoot":"","sources":["../../../../src/lib/mem/managers/prng-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAIlE,qBAAa,IAAI;IACH,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAAZ,YAAY,EAAE,WAAW;IAE/C,QAAQ,IAAI,MAAM;IAIlB,UAAU,IAAI,MAAM;IAIpB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM;IAI9C,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM;CAG/D;AAED,qBAAa,WAAY,YAAW,eAAe;IAO/C,OAAO,CAAC,QAAQ,CAAC,UAAU;IAN7B,OAAO,CAAC,MAAM,CAAe;IAC7B,SAAgB,IAAI,EAAE,IAAI,CAAC;IAE3B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAsB;gBAGlC,UAAU,EAAE,SAAS;IAKjC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI;IAU5D,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAIlD,8DAA8D;IACvD,QAAQ,IAAI,MAAM;IAKzB,gFAAgF;IACzE,UAAU,IAAI,MAAM;IAO3B,yDAAyD;IAClD,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM;IAWrD,yDAAyD;IAClD,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM;IAQ9D,4EAA4E;IACrE,MAAM,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAIlC,mDAAmD;IACnD,OAAO,CAAC,OAAO;IA0Bf,sCAAsC;IACtC,OAAO,CAAC,UAAU;IAoBX,WAAW,IAAI,MAAM;CAM7B"}
@@ -0,0 +1,13 @@
1
+ import { MemoryTracker } from '@lagless/binary';
2
+ import { IAbstractMemory } from '../abstract-memory.interface.js';
3
+ import { ECSDeps, ISingletonConstructor, ISingletonInstance } from '../../types/index.js';
4
+ export declare class SingletonsManager implements IAbstractMemory {
5
+ private readonly _ECSDeps;
6
+ private readonly _singletonsInstances;
7
+ constructor(_ECSDeps: ECSDeps);
8
+ init(arrayBuffer: ArrayBuffer, tracker: MemoryTracker): void;
9
+ calculateSize(tracker: MemoryTracker): void;
10
+ get<Ctor extends ISingletonConstructor>(SingletonConstructor: Ctor): InstanceType<Ctor>;
11
+ [Symbol.iterator](): MapIterator<[ISingletonConstructor, ISingletonInstance]>;
12
+ }
13
+ //# sourceMappingURL=singletons-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"singletons-manager.d.ts","sourceRoot":"","sources":["../../../../src/lib/mem/managers/singletons-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1F,qBAAa,iBAAkB,YAAW,eAAe;IAG3C,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAFrC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAwD;gBAEhE,QAAQ,EAAE,OAAO;IAEvC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI;IAO5D,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAM3C,GAAG,CAAC,IAAI,SAAS,qBAAqB,EAAE,oBAAoB,EAAE,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC;IAQvF,CAAC,MAAM,CAAC,QAAQ,CAAC;CAGzB"}
@@ -0,0 +1,10 @@
1
+ import { MemoryTracker } from '@lagless/binary';
2
+ import { IAbstractMemory } from '../abstract-memory.interface.js';
3
+ export declare class TickManager implements IAbstractMemory {
4
+ private _tickTypedArray;
5
+ get tick(): number;
6
+ setTick(tick: number): void;
7
+ init(arrayBuffer: ArrayBuffer, tracker: MemoryTracker): void;
8
+ calculateSize(tracker: MemoryTracker): void;
9
+ }
10
+ //# sourceMappingURL=tick-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tick-manager.d.ts","sourceRoot":"","sources":["../../../../src/lib/mem/managers/tick-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAElE,qBAAa,WAAY,YAAW,eAAe;IACjD,OAAO,CAAC,eAAe,CAAe;IAEtC,IAAW,IAAI,IAAI,MAAM,CAExB;IAEM,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI3B,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI;IAM5D,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;CAGnD"}
@@ -0,0 +1,28 @@
1
+ import { ECSDeps } from '../types/index.js';
2
+ import { ECSConfig } from '../ecs-config.js';
3
+ import { ComponentsManager } from './managers/components-manager.js';
4
+ import { EntitiesManager } from './managers/entities-manager.js';
5
+ import { SingletonsManager } from './managers/singletons-manager.js';
6
+ import { FiltersManager } from './managers/filters-manager.js';
7
+ import { PlayerResourcesManager } from './managers/player-resources-manager.js';
8
+ import { TickManager } from './managers/tick-manager.js';
9
+ import { PRNGManager } from './managers/prng-manager.js';
10
+ export declare class Mem {
11
+ private readonly _ECSConfig;
12
+ private readonly _ECSDeps;
13
+ readonly tickManager: TickManager;
14
+ readonly prngManager: PRNGManager;
15
+ readonly componentsManager: ComponentsManager;
16
+ readonly singletonsManager: SingletonsManager;
17
+ readonly filtersManager: FiltersManager;
18
+ readonly entitiesManager: EntitiesManager;
19
+ readonly playerResourcesManager: PlayerResourcesManager;
20
+ private readonly _arrayBuffer;
21
+ private readonly _memoryManagers;
22
+ constructor(_ECSConfig: ECSConfig, _ECSDeps: ECSDeps);
23
+ exportSnapshot(): ArrayBuffer;
24
+ applySnapshot(arrayBuffer: ArrayBuffer): void;
25
+ private calculateSize;
26
+ getHash(): number;
27
+ }
28
+ //# sourceMappingURL=mem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mem.d.ts","sourceRoot":"","sources":["../../../src/lib/mem/mem.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAGzD,qBAAa,GAAG;IAYF,OAAO,CAAC,QAAQ,CAAC,UAAU;IAAa,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAX7E,SAAgB,WAAW,EAAE,WAAW,CAAC;IACzC,SAAgB,WAAW,EAAE,WAAW,CAAC;IACzC,SAAgB,iBAAiB,EAAE,iBAAiB,CAAC;IACrD,SAAgB,iBAAiB,EAAE,iBAAiB,CAAC;IACrD,SAAgB,cAAc,EAAE,cAAc,CAAC;IAC/C,SAAgB,eAAe,EAAE,eAAe,CAAC;IACjD,SAAgB,sBAAsB,EAAE,sBAAsB,CAAC;IAE/D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAC3C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAyB;gBAE5B,UAAU,EAAE,SAAS,EAAmB,QAAQ,EAAE,OAAO;IAiC/E,cAAc,IAAI,WAAW;IAI7B,aAAa,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAQpD,OAAO,CAAC,aAAa;IAUd,OAAO,IAAI,MAAM;CAQzB"}
@@ -35,12 +35,14 @@ export class Mem {
35
35
  constructor(_ECSConfig, _ECSDeps){
36
36
  this._ECSConfig = _ECSConfig;
37
37
  this._ECSDeps = _ECSDeps;
38
+ // Derive mask word count from component count (1 word for ≤32, 2 for 33-64)
39
+ const maskWords = Math.max(1, Math.ceil(this._ECSDeps.components.length / 32));
38
40
  this.tickManager = new TickManager();
39
41
  this.prngManager = new PRNGManager(this._ECSConfig);
40
42
  this.componentsManager = new ComponentsManager(this._ECSConfig, this._ECSDeps);
41
43
  this.singletonsManager = new SingletonsManager(this._ECSDeps);
42
- this.filtersManager = new FiltersManager(this._ECSConfig, this._ECSDeps);
43
- this.entitiesManager = new EntitiesManager(this._ECSConfig, this.componentsManager, this.filtersManager);
44
+ this.filtersManager = new FiltersManager(this._ECSConfig, this._ECSDeps, maskWords);
45
+ this.entitiesManager = new EntitiesManager(this._ECSConfig, this.componentsManager, this.filtersManager, maskWords);
44
46
  this.playerResourcesManager = new PlayerResourcesManager(this._ECSConfig, this._ECSDeps);
45
47
  this._memoryManagers = [
46
48
  this.tickManager,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/mem/mem.ts"],"sourcesContent":["// libs/core/src/lib/mem/mem.ts\nimport { ECSDeps } from '../types/index.js';\nimport { ECSConfig } from '../ecs-config.js';\nimport { IAbstractMemory } from './abstract-memory.interface.js';\nimport { ComponentsManager } from './managers/components-manager.js';\nimport { EntitiesManager } from './managers/entities-manager.js';\nimport { SingletonsManager } from './managers/singletons-manager.js';\nimport { FiltersManager } from './managers/filters-manager.js';\nimport { PlayerResourcesManager } from './managers/player-resources-manager.js';\nimport { TickManager } from './managers/tick-manager.js';\nimport { PRNGManager } from './managers/prng-manager.js';\nimport { MemoryTracker } from '@lagless/binary';\n\nexport class Mem {\n public readonly tickManager: TickManager;\n public readonly prngManager: PRNGManager;\n public readonly componentsManager: ComponentsManager;\n public readonly singletonsManager: SingletonsManager;\n public readonly filtersManager: FiltersManager;\n public readonly entitiesManager: EntitiesManager;\n public readonly playerResourcesManager: PlayerResourcesManager;\n\n private readonly _arrayBuffer: ArrayBuffer;\n private readonly _memoryManagers: Array<IAbstractMemory>;\n\n constructor(private readonly _ECSConfig: ECSConfig, private readonly _ECSDeps: ECSDeps) {\n this.tickManager = new TickManager();\n this.prngManager = new PRNGManager(this._ECSConfig);\n this.componentsManager = new ComponentsManager(this._ECSConfig, this._ECSDeps);\n this.singletonsManager = new SingletonsManager(this._ECSDeps);\n this.filtersManager = new FiltersManager(this._ECSConfig, this._ECSDeps);\n this.entitiesManager = new EntitiesManager(this._ECSConfig, this.componentsManager, this.filtersManager);\n this.playerResourcesManager = new PlayerResourcesManager(this._ECSConfig, this._ECSDeps);\n\n this._memoryManagers = [\n this.tickManager,\n this.prngManager,\n this.componentsManager,\n this.singletonsManager,\n this.filtersManager,\n this.entitiesManager,\n this.playerResourcesManager,\n ];\n\n const arrayBufferSize = this.calculateSize();\n\n this._arrayBuffer = new ArrayBuffer(arrayBufferSize);\n\n const tracker = new MemoryTracker();\n\n for (const memoryManager of this._memoryManagers) {\n memoryManager.init(this._arrayBuffer, tracker);\n }\n }\n\n public exportSnapshot(): ArrayBuffer {\n return this._arrayBuffer.slice(0);\n }\n\n public applySnapshot(arrayBuffer: ArrayBuffer): void {\n if (arrayBuffer.byteLength !== this._arrayBuffer.byteLength) {\n throw new Error('Snapshot size mismatch');\n }\n\n new Uint8Array(this._arrayBuffer).set(new Uint8Array(arrayBuffer));\n }\n\n private calculateSize(): number {\n const tracker = new MemoryTracker();\n\n for (const memoryManager of this._memoryManagers) {\n memoryManager.calculateSize(tracker);\n }\n\n return tracker.ptr;\n }\n\n public getHash(): number {\n let hash = 0;\n const dataView = new DataView(this._arrayBuffer);\n for (let i = 0; i < this._arrayBuffer.byteLength; i++) {\n hash = (hash * 31 + dataView.getUint8(i)) >>> 0;\n }\n return hash;\n }\n}\n"],"names":["ComponentsManager","EntitiesManager","SingletonsManager","FiltersManager","PlayerResourcesManager","TickManager","PRNGManager","MemoryTracker","Mem","exportSnapshot","_arrayBuffer","slice","applySnapshot","arrayBuffer","byteLength","Error","Uint8Array","set","calculateSize","tracker","memoryManager","_memoryManagers","ptr","getHash","hash","dataView","DataView","i","getUint8","constructor","_ECSConfig","_ECSDeps","tickManager","prngManager","componentsManager","singletonsManager","filtersManager","entitiesManager","playerResourcesManager","arrayBufferSize","ArrayBuffer","init"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,+BAA+B;AAI/B,SAASA,iBAAiB,QAAQ,mCAAmC;AACrE,SAASC,eAAe,QAAQ,iCAAiC;AACjE,SAASC,iBAAiB,QAAQ,mCAAmC;AACrE,SAASC,cAAc,QAAQ,gCAAgC;AAC/D,SAASC,sBAAsB,QAAQ,yCAAyC;AAChF,SAASC,WAAW,QAAQ,6BAA6B;AACzD,SAASC,WAAW,QAAQ,6BAA6B;AACzD,SAASC,aAAa,QAAQ,kBAAkB;AAEhD,OAAO,MAAMC;IA0CJC,iBAA8B;QACnC,OAAO,IAAI,CAACC,YAAY,CAACC,KAAK,CAAC;IACjC;IAEOC,cAAcC,WAAwB,EAAQ;QACnD,IAAIA,YAAYC,UAAU,KAAK,IAAI,CAACJ,YAAY,CAACI,UAAU,EAAE;YAC3D,MAAM,IAAIC,MAAM;QAClB;QAEA,IAAIC,WAAW,IAAI,CAACN,YAAY,EAAEO,GAAG,CAAC,IAAID,WAAWH;IACvD;IAEQK,gBAAwB;QAC9B,MAAMC,UAAU,IAAIZ;QAEpB,KAAK,MAAMa,iBAAiB,IAAI,CAACC,eAAe,CAAE;YAChDD,cAAcF,aAAa,CAACC;QAC9B;QAEA,OAAOA,QAAQG,GAAG;IACpB;IAEOC,UAAkB;QACvB,IAAIC,OAAO;QACX,MAAMC,WAAW,IAAIC,SAAS,IAAI,CAAChB,YAAY;QAC/C,IAAK,IAAIiB,IAAI,GAAGA,IAAI,IAAI,CAACjB,YAAY,CAACI,UAAU,EAAEa,IAAK;YACrDH,OAAO,AAACA,OAAO,KAAKC,SAASG,QAAQ,CAACD,OAAQ;QAChD;QACA,OAAOH;IACT;IA3DAK,YAAY,AAAiBC,UAAqB,EAAE,AAAiBC,QAAiB,CAAE;aAA3DD,aAAAA;aAAwCC,WAAAA;QACnE,IAAI,CAACC,WAAW,GAAG,IAAI3B;QACvB,IAAI,CAAC4B,WAAW,GAAG,IAAI3B,YAAY,IAAI,CAACwB,UAAU;QAClD,IAAI,CAACI,iBAAiB,GAAG,IAAIlC,kBAAkB,IAAI,CAAC8B,UAAU,EAAE,IAAI,CAACC,QAAQ;QAC7E,IAAI,CAACI,iBAAiB,GAAG,IAAIjC,kBAAkB,IAAI,CAAC6B,QAAQ;QAC5D,IAAI,CAACK,cAAc,GAAG,IAAIjC,eAAe,IAAI,CAAC2B,UAAU,EAAE,IAAI,CAACC,QAAQ;QACvE,IAAI,CAACM,eAAe,GAAG,IAAIpC,gBAAgB,IAAI,CAAC6B,UAAU,EAAE,IAAI,CAACI,iBAAiB,EAAE,IAAI,CAACE,cAAc;QACvG,IAAI,CAACE,sBAAsB,GAAG,IAAIlC,uBAAuB,IAAI,CAAC0B,UAAU,EAAE,IAAI,CAACC,QAAQ;QAEvF,IAAI,CAACV,eAAe,GAAG;YACrB,IAAI,CAACW,WAAW;YAChB,IAAI,CAACC,WAAW;YAChB,IAAI,CAACC,iBAAiB;YACtB,IAAI,CAACC,iBAAiB;YACtB,IAAI,CAACC,cAAc;YACnB,IAAI,CAACC,eAAe;YACpB,IAAI,CAACC,sBAAsB;SAC5B;QAED,MAAMC,kBAAkB,IAAI,CAACrB,aAAa;QAE1C,IAAI,CAACR,YAAY,GAAG,IAAI8B,YAAYD;QAEpC,MAAMpB,UAAU,IAAIZ;QAEpB,KAAK,MAAMa,iBAAiB,IAAI,CAACC,eAAe,CAAE;YAChDD,cAAcqB,IAAI,CAAC,IAAI,CAAC/B,YAAY,EAAES;QACxC;IACF;AAgCF"}
1
+ {"version":3,"sources":["../../../src/lib/mem/mem.ts"],"sourcesContent":["// libs/core/src/lib/mem/mem.ts\nimport { ECSDeps } from '../types/index.js';\nimport { ECSConfig } from '../ecs-config.js';\nimport { IAbstractMemory } from './abstract-memory.interface.js';\nimport { ComponentsManager } from './managers/components-manager.js';\nimport { EntitiesManager } from './managers/entities-manager.js';\nimport { SingletonsManager } from './managers/singletons-manager.js';\nimport { FiltersManager } from './managers/filters-manager.js';\nimport { PlayerResourcesManager } from './managers/player-resources-manager.js';\nimport { TickManager } from './managers/tick-manager.js';\nimport { PRNGManager } from './managers/prng-manager.js';\nimport { MemoryTracker } from '@lagless/binary';\n\nexport class Mem {\n public readonly tickManager: TickManager;\n public readonly prngManager: PRNGManager;\n public readonly componentsManager: ComponentsManager;\n public readonly singletonsManager: SingletonsManager;\n public readonly filtersManager: FiltersManager;\n public readonly entitiesManager: EntitiesManager;\n public readonly playerResourcesManager: PlayerResourcesManager;\n\n private readonly _arrayBuffer: ArrayBuffer;\n private readonly _memoryManagers: Array<IAbstractMemory>;\n\n constructor(private readonly _ECSConfig: ECSConfig, private readonly _ECSDeps: ECSDeps) {\n // Derive mask word count from component count (1 word for ≤32, 2 for 33-64)\n const maskWords = (Math.max(1, Math.ceil(this._ECSDeps.components.length / 32))) as 1 | 2;\n\n this.tickManager = new TickManager();\n this.prngManager = new PRNGManager(this._ECSConfig);\n this.componentsManager = new ComponentsManager(this._ECSConfig, this._ECSDeps);\n this.singletonsManager = new SingletonsManager(this._ECSDeps);\n this.filtersManager = new FiltersManager(this._ECSConfig, this._ECSDeps, maskWords);\n this.entitiesManager = new EntitiesManager(this._ECSConfig, this.componentsManager, this.filtersManager, maskWords);\n this.playerResourcesManager = new PlayerResourcesManager(this._ECSConfig, this._ECSDeps);\n\n this._memoryManagers = [\n this.tickManager,\n this.prngManager,\n this.componentsManager,\n this.singletonsManager,\n this.filtersManager,\n this.entitiesManager,\n this.playerResourcesManager,\n ];\n\n const arrayBufferSize = this.calculateSize();\n\n this._arrayBuffer = new ArrayBuffer(arrayBufferSize);\n\n const tracker = new MemoryTracker();\n\n for (const memoryManager of this._memoryManagers) {\n memoryManager.init(this._arrayBuffer, tracker);\n }\n }\n\n public exportSnapshot(): ArrayBuffer {\n return this._arrayBuffer.slice(0);\n }\n\n public applySnapshot(arrayBuffer: ArrayBuffer): void {\n if (arrayBuffer.byteLength !== this._arrayBuffer.byteLength) {\n throw new Error('Snapshot size mismatch');\n }\n\n new Uint8Array(this._arrayBuffer).set(new Uint8Array(arrayBuffer));\n }\n\n private calculateSize(): number {\n const tracker = new MemoryTracker();\n\n for (const memoryManager of this._memoryManagers) {\n memoryManager.calculateSize(tracker);\n }\n\n return tracker.ptr;\n }\n\n public getHash(): number {\n let hash = 0;\n const dataView = new DataView(this._arrayBuffer);\n for (let i = 0; i < this._arrayBuffer.byteLength; i++) {\n hash = (hash * 31 + dataView.getUint8(i)) >>> 0;\n }\n return hash;\n }\n}\n"],"names":["ComponentsManager","EntitiesManager","SingletonsManager","FiltersManager","PlayerResourcesManager","TickManager","PRNGManager","MemoryTracker","Mem","exportSnapshot","_arrayBuffer","slice","applySnapshot","arrayBuffer","byteLength","Error","Uint8Array","set","calculateSize","tracker","memoryManager","_memoryManagers","ptr","getHash","hash","dataView","DataView","i","getUint8","constructor","_ECSConfig","_ECSDeps","maskWords","Math","max","ceil","components","length","tickManager","prngManager","componentsManager","singletonsManager","filtersManager","entitiesManager","playerResourcesManager","arrayBufferSize","ArrayBuffer","init"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,+BAA+B;AAI/B,SAASA,iBAAiB,QAAQ,mCAAmC;AACrE,SAASC,eAAe,QAAQ,iCAAiC;AACjE,SAASC,iBAAiB,QAAQ,mCAAmC;AACrE,SAASC,cAAc,QAAQ,gCAAgC;AAC/D,SAASC,sBAAsB,QAAQ,yCAAyC;AAChF,SAASC,WAAW,QAAQ,6BAA6B;AACzD,SAASC,WAAW,QAAQ,6BAA6B;AACzD,SAASC,aAAa,QAAQ,kBAAkB;AAEhD,OAAO,MAAMC;IA6CJC,iBAA8B;QACnC,OAAO,IAAI,CAACC,YAAY,CAACC,KAAK,CAAC;IACjC;IAEOC,cAAcC,WAAwB,EAAQ;QACnD,IAAIA,YAAYC,UAAU,KAAK,IAAI,CAACJ,YAAY,CAACI,UAAU,EAAE;YAC3D,MAAM,IAAIC,MAAM;QAClB;QAEA,IAAIC,WAAW,IAAI,CAACN,YAAY,EAAEO,GAAG,CAAC,IAAID,WAAWH;IACvD;IAEQK,gBAAwB;QAC9B,MAAMC,UAAU,IAAIZ;QAEpB,KAAK,MAAMa,iBAAiB,IAAI,CAACC,eAAe,CAAE;YAChDD,cAAcF,aAAa,CAACC;QAC9B;QAEA,OAAOA,QAAQG,GAAG;IACpB;IAEOC,UAAkB;QACvB,IAAIC,OAAO;QACX,MAAMC,WAAW,IAAIC,SAAS,IAAI,CAAChB,YAAY;QAC/C,IAAK,IAAIiB,IAAI,GAAGA,IAAI,IAAI,CAACjB,YAAY,CAACI,UAAU,EAAEa,IAAK;YACrDH,OAAO,AAACA,OAAO,KAAKC,SAASG,QAAQ,CAACD,OAAQ;QAChD;QACA,OAAOH;IACT;IA9DAK,YAAY,AAAiBC,UAAqB,EAAE,AAAiBC,QAAiB,CAAE;aAA3DD,aAAAA;aAAwCC,WAAAA;QACnE,4EAA4E;QAC5E,MAAMC,YAAaC,KAAKC,GAAG,CAAC,GAAGD,KAAKE,IAAI,CAAC,IAAI,CAACJ,QAAQ,CAACK,UAAU,CAACC,MAAM,GAAG;QAE3E,IAAI,CAACC,WAAW,GAAG,IAAIjC;QACvB,IAAI,CAACkC,WAAW,GAAG,IAAIjC,YAAY,IAAI,CAACwB,UAAU;QAClD,IAAI,CAACU,iBAAiB,GAAG,IAAIxC,kBAAkB,IAAI,CAAC8B,UAAU,EAAE,IAAI,CAACC,QAAQ;QAC7E,IAAI,CAACU,iBAAiB,GAAG,IAAIvC,kBAAkB,IAAI,CAAC6B,QAAQ;QAC5D,IAAI,CAACW,cAAc,GAAG,IAAIvC,eAAe,IAAI,CAAC2B,UAAU,EAAE,IAAI,CAACC,QAAQ,EAAEC;QACzE,IAAI,CAACW,eAAe,GAAG,IAAI1C,gBAAgB,IAAI,CAAC6B,UAAU,EAAE,IAAI,CAACU,iBAAiB,EAAE,IAAI,CAACE,cAAc,EAAEV;QACzG,IAAI,CAACY,sBAAsB,GAAG,IAAIxC,uBAAuB,IAAI,CAAC0B,UAAU,EAAE,IAAI,CAACC,QAAQ;QAEvF,IAAI,CAACV,eAAe,GAAG;YACrB,IAAI,CAACiB,WAAW;YAChB,IAAI,CAACC,WAAW;YAChB,IAAI,CAACC,iBAAiB;YACtB,IAAI,CAACC,iBAAiB;YACtB,IAAI,CAACC,cAAc;YACnB,IAAI,CAACC,eAAe;YACpB,IAAI,CAACC,sBAAsB;SAC5B;QAED,MAAMC,kBAAkB,IAAI,CAAC3B,aAAa;QAE1C,IAAI,CAACR,YAAY,GAAG,IAAIoC,YAAYD;QAEpC,MAAM1B,UAAU,IAAIZ;QAEpB,KAAK,MAAMa,iBAAiB,IAAI,CAACC,eAAe,CAAE;YAChDD,cAAc2B,IAAI,CAAC,IAAI,CAACrC,YAAY,EAAES;QACxC;IACF;AAgCF"}
@@ -0,0 +1,16 @@
1
+ import { TypedArrayConstructor } from '@lagless/binary';
2
+ import { IComponentConstructor } from './types/index.js';
3
+ type ComponentValues<TSchema extends Record<string, TypedArrayConstructor>> = {
4
+ [K in keyof TSchema]: number;
5
+ };
6
+ export declare class Prefab {
7
+ private readonly _data;
8
+ with<T extends IComponentConstructor>(Component: T, values?: Partial<ComponentValues<T['schema']>>): Prefab;
9
+ static create(): Prefab;
10
+ [Symbol.iterator](): IterableIterator<[
11
+ IComponentConstructor,
12
+ Partial<ComponentValues<IComponentConstructor['schema']>> | undefined
13
+ ]>;
14
+ }
15
+ export {};
16
+ //# sourceMappingURL=prefab.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefab.d.ts","sourceRoot":"","sources":["../../src/lib/prefab.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,KAAK,eAAe,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,IAAI;KAC3E,CAAC,IAAI,MAAM,OAAO,GAAG,MAAM;CAC7B,CAAC;AAEF,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2G;IAE1H,IAAI,CAAC,CAAC,SAAS,qBAAqB,EACzC,SAAS,EAAE,CAAC,EACZ,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAC7C,MAAM;WAMK,MAAM,IAAI,MAAM;IAIvB,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAC1C;QAAC,qBAAqB;QAAE,OAAO,CAAC,eAAe,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,SAAS;KAAC,CAC/F;CAGF"}
@@ -0,0 +1,9 @@
1
+ export type Listener<T> = (event: T) => void;
2
+ export declare class EventEmitter<TEvent> {
3
+ private readonly _listeners;
4
+ subscribe(listener: Listener<TEvent>): () => void;
5
+ emit(event: TEvent): void;
6
+ clear(): void;
7
+ get hasListeners(): boolean;
8
+ }
9
+ //# sourceMappingURL=event-emitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-emitter.d.ts","sourceRoot":"","sources":["../../../src/lib/signals/event-emitter.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;AAE7C,qBAAa,YAAY,CAAC,MAAM;IAC9B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA+B;IAEnD,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,IAAI;IAKjD,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMzB,KAAK,IAAI,IAAI;IAIpB,IAAW,YAAY,IAAI,OAAO,CAEjC;CACF"}
@@ -0,0 +1,41 @@
1
+ import { EventEmitter } from './event-emitter.js';
2
+ import { ECSConfig } from '../ecs-config.js';
3
+ export interface SignalEvent<TData> {
4
+ tick: number;
5
+ data: TData;
6
+ }
7
+ export interface ISignalConstructor {
8
+ new (...args: any[]): Signal<any>;
9
+ }
10
+ export declare abstract class Signal<TData = unknown> {
11
+ protected readonly _ECSConfig: ECSConfig;
12
+ readonly Predicted: EventEmitter<SignalEvent<TData>>;
13
+ readonly Verified: EventEmitter<SignalEvent<TData>>;
14
+ readonly Cancelled: EventEmitter<SignalEvent<TData>>;
15
+ private readonly _pending;
16
+ private readonly _awaitingVerification;
17
+ private _lastVerifiedTick;
18
+ constructor(_ECSConfig: ECSConfig);
19
+ emit(tick: number, data: TData): void;
20
+ /**
21
+ * Verify/cancel signals for ticks up to verifiedTick.
22
+ * Called each simulation tick from SignalsRegistry.
23
+ * @internal
24
+ */
25
+ _onTick(verifiedTick: number): void;
26
+ /**
27
+ * Перед rollback — очищаем pending для тиков которые будут пересимулированы
28
+ * @internal
29
+ */
30
+ _onBeforeRollback(toTick: number): void;
31
+ /**
32
+ * Очистка данных для тика после verification
33
+ */
34
+ private _cleanupTick;
35
+ /**
36
+ * Shallow comparison данных. Override для custom сравнения.
37
+ */
38
+ protected _dataEquals(a: TData, b: TData): boolean;
39
+ dispose(): void;
40
+ }
41
+ //# sourceMappingURL=signal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signal.d.ts","sourceRoot":"","sources":["../../../src/lib/signals/signal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG7C,MAAM,WAAW,WAAW,CAAC,KAAK;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,KAAK,CAAC;CACb;AAED,MAAM,WAAW,kBAAkB;IAEjC,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;CACnC;AAED,8BACsB,MAAM,CAAC,KAAK,GAAG,OAAO;IAS9B,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,SAAS;IARpD,SAAgB,SAAS,mCAA0C;IACnE,SAAgB,QAAQ,mCAA0C;IAClE,SAAgB,SAAS,mCAA0C;IAEnE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8B;IACvD,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAA8B;IACpE,OAAO,CAAC,iBAAiB,CAAM;gBAEA,UAAU,EAAE,SAAS;IAE7C,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI;IA4B5C;;;;OAIG;IACI,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAgC1C;;;OAGG;IACI,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAS9C;;OAEG;IACH,OAAO,CAAC,YAAY;IAKpB;;OAEG;IACH,SAAS,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,GAAG,OAAO;IAoB3C,OAAO,IAAI,IAAI;CAQvB"}
@@ -32,43 +32,42 @@ export class Signal {
32
32
  }
33
33
  }
34
34
  /**
35
- * Проверка Verified/Cancelled (вызывается каждый тик из SignalsRegistry)
35
+ * Verify/cancel signals for ticks up to verifiedTick.
36
+ * Called each simulation tick from SignalsRegistry.
36
37
  * @internal
37
- */ _onTick(currentTick) {
38
- const verifyTick = currentTick - this._maxInputDelayTick;
39
- if (verifyTick < 0) return;
40
- const awaiting = this._awaitingVerification.get(verifyTick);
41
- if (!awaiting || awaiting.length === 0) {
42
- this._cleanupTick(verifyTick);
43
- return;
44
- }
45
- var _this__pending_get;
46
- const pending = (_this__pending_get = this._pending.get(verifyTick)) != null ? _this__pending_get : [];
47
- const pendingMatched = new Array(pending.length).fill(false);
48
- for (const awaitingData of awaiting){
49
- // Ищем matching событие в pending
50
- let matchIdx = -1;
51
- for(let i = 0; i < pending.length; i++){
52
- if (!pendingMatched[i] && this._dataEquals(pending[i], awaitingData)) {
53
- matchIdx = i;
54
- break;
38
+ */ _onTick(verifiedTick) {
39
+ while(this._lastVerifiedTick < verifiedTick){
40
+ const nextTick = this._lastVerifiedTick + 1;
41
+ const awaiting = this._awaitingVerification.get(nextTick);
42
+ if (awaiting && awaiting.length > 0) {
43
+ var _this__pending_get;
44
+ const pending = (_this__pending_get = this._pending.get(nextTick)) != null ? _this__pending_get : [];
45
+ const pendingMatched = new Array(pending.length).fill(false);
46
+ for (const awaitingData of awaiting){
47
+ let matchIdx = -1;
48
+ for(let i = 0; i < pending.length; i++){
49
+ if (!pendingMatched[i] && this._dataEquals(pending[i], awaitingData)) {
50
+ matchIdx = i;
51
+ break;
52
+ }
53
+ }
54
+ if (matchIdx >= 0) {
55
+ pendingMatched[matchIdx] = true;
56
+ this.Verified.emit({
57
+ tick: nextTick,
58
+ data: awaitingData
59
+ });
60
+ } else {
61
+ this.Cancelled.emit({
62
+ tick: nextTick,
63
+ data: awaitingData
64
+ });
65
+ }
55
66
  }
56
67
  }
57
- if (matchIdx >= 0) {
58
- pendingMatched[matchIdx] = true;
59
- this.Verified.emit({
60
- tick: verifyTick,
61
- data: awaitingData
62
- });
63
- } else {
64
- // Событие было Predicted, но нет в pending после rollback
65
- this.Cancelled.emit({
66
- tick: verifyTick,
67
- data: awaitingData
68
- });
69
- }
68
+ this._cleanupTick(nextTick);
69
+ this._lastVerifiedTick = nextTick;
70
70
  }
71
- this._cleanupTick(verifyTick);
72
71
  }
73
72
  /**
74
73
  * Перед rollback — очищаем pending для тиков которые будут пересимулированы
@@ -108,6 +107,7 @@ export class Signal {
108
107
  dispose() {
109
108
  this._pending.clear();
110
109
  this._awaitingVerification.clear();
110
+ this._lastVerifiedTick = -1;
111
111
  this.Predicted.clear();
112
112
  this.Verified.clear();
113
113
  this.Cancelled.clear();
@@ -119,7 +119,7 @@ export class Signal {
119
119
  this.Cancelled = new EventEmitter();
120
120
  this._pending = new Map();
121
121
  this._awaitingVerification = new Map();
122
- this._maxInputDelayTick = _ECSConfig.maxInputDelayTick;
122
+ this._lastVerifiedTick = -1;
123
123
  }
124
124
  }
125
125
  Signal = _ts_decorate([
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/signals/signal.ts"],"sourcesContent":["import { EventEmitter } from './event-emitter.js';\nimport { ECSConfig } from '../ecs-config.js';\nimport { ECSSignal } from '../di/index.js';\n\nexport interface SignalEvent<TData> {\n tick: number;\n data: TData;\n}\n\nexport interface ISignalConstructor {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n new (...args: any[]): Signal<any>;\n}\n\n@ECSSignal()\nexport abstract class Signal<TData = unknown> {\n public readonly Predicted = new EventEmitter<SignalEvent<TData>>();\n public readonly Verified = new EventEmitter<SignalEvent<TData>>();\n public readonly Cancelled = new EventEmitter<SignalEvent<TData>>();\n\n private readonly _pending = new Map<number, TData[]>();\n private readonly _awaitingVerification = new Map<number, TData[]>();\n private readonly _maxInputDelayTick: number;\n\n constructor(protected readonly _ECSConfig: ECSConfig) {\n this._maxInputDelayTick = _ECSConfig.maxInputDelayTick;\n }\n\n public emit(tick: number, data: TData): void {\n // 1. Добавляем в pending (текущее состояние симуляции)\n let pending = this._pending.get(tick);\n if (!pending) {\n pending = [];\n this._pending.set(tick, pending);\n }\n pending.push(data);\n\n // 2. Проверяем — уже был Predicted для такого tick+data?\n // (случается при rollback + пересимуляции с теми же данными)\n const awaiting = this._awaitingVerification.get(tick);\n const alreadyPredicted = awaiting?.some((a) => this._dataEquals(a, data));\n\n if (!alreadyPredicted) {\n // Первый раз видим это событие — Predicted\n this.Predicted.emit({ tick, data });\n\n // Добавляем в awaiting для будущей verification\n let aw = this._awaitingVerification.get(tick);\n if (!aw) {\n aw = [];\n this._awaitingVerification.set(tick, aw);\n }\n aw.push(data);\n }\n }\n\n /**\n * Проверка Verified/Cancelled (вызывается каждый тик из SignalsRegistry)\n * @internal\n */\n public _onTick(currentTick: number): void {\n const verifyTick = currentTick - this._maxInputDelayTick;\n if (verifyTick < 0) return;\n\n const awaiting = this._awaitingVerification.get(verifyTick);\n if (!awaiting || awaiting.length === 0) {\n this._cleanupTick(verifyTick);\n return;\n }\n\n const pending = this._pending.get(verifyTick) ?? [];\n const pendingMatched = new Array(pending.length).fill(false);\n\n for (const awaitingData of awaiting) {\n // Ищем matching событие в pending\n let matchIdx = -1;\n for (let i = 0; i < pending.length; i++) {\n if (!pendingMatched[i] && this._dataEquals(pending[i], awaitingData)) {\n matchIdx = i;\n break;\n }\n }\n\n if (matchIdx >= 0) {\n pendingMatched[matchIdx] = true;\n this.Verified.emit({ tick: verifyTick, data: awaitingData });\n } else {\n // Событие было Predicted, но нет в pending после rollback\n this.Cancelled.emit({ tick: verifyTick, data: awaitingData });\n }\n }\n\n this._cleanupTick(verifyTick);\n }\n\n /**\n * Перед rollback — очищаем pending для тиков которые будут пересимулированы\n * @internal\n */\n public _onBeforeRollback(toTick: number): void {\n for (const tick of this._pending.keys()) {\n if (tick > toTick) {\n this._pending.delete(tick);\n }\n }\n // _awaitingVerification НЕ очищаем — проверим при verification\n }\n\n /**\n * Очистка данных для тика после verification\n */\n private _cleanupTick(tick: number): void {\n this._awaitingVerification.delete(tick);\n this._pending.delete(tick);\n }\n\n /**\n * Shallow comparison данных. Override для custom сравнения.\n */\n protected _dataEquals(a: TData, b: TData): boolean {\n if (a === b) return true;\n if (typeof a !== 'object' || typeof b !== 'object') return false;\n if (a === null || b === null) return false;\n\n const objA = a as Record<string, unknown>;\n const objB = b as Record<string, unknown>;\n\n const keysA = Object.keys(objA);\n const keysB = Object.keys(objB);\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n if (objA[key] !== objB[key]) {\n return false;\n }\n }\n return true;\n }\n\n public dispose(): void {\n this._pending.clear();\n this._awaitingVerification.clear();\n this.Predicted.clear();\n this.Verified.clear();\n this.Cancelled.clear();\n }\n}\n"],"names":["EventEmitter","ECSConfig","ECSSignal","Signal","emit","tick","data","pending","_pending","get","set","push","awaiting","_awaitingVerification","alreadyPredicted","some","a","_dataEquals","Predicted","aw","_onTick","currentTick","verifyTick","_maxInputDelayTick","length","_cleanupTick","pendingMatched","Array","fill","awaitingData","matchIdx","i","Verified","Cancelled","_onBeforeRollback","toTick","keys","delete","b","objA","objB","keysA","Object","keysB","key","dispose","clear","constructor","_ECSConfig","Map","maxInputDelayTick"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
1
+ {"version":3,"sources":["../../../src/lib/signals/signal.ts"],"sourcesContent":["import { EventEmitter } from './event-emitter.js';\nimport { ECSConfig } from '../ecs-config.js';\nimport { ECSSignal } from '../di/index.js';\n\nexport interface SignalEvent<TData> {\n tick: number;\n data: TData;\n}\n\nexport interface ISignalConstructor {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n new (...args: any[]): Signal<any>;\n}\n\n@ECSSignal()\nexport abstract class Signal<TData = unknown> {\n public readonly Predicted = new EventEmitter<SignalEvent<TData>>();\n public readonly Verified = new EventEmitter<SignalEvent<TData>>();\n public readonly Cancelled = new EventEmitter<SignalEvent<TData>>();\n\n private readonly _pending = new Map<number, TData[]>();\n private readonly _awaitingVerification = new Map<number, TData[]>();\n private _lastVerifiedTick = -1;\n\n constructor(protected readonly _ECSConfig: ECSConfig) {}\n\n public emit(tick: number, data: TData): void {\n // 1. Добавляем в pending (текущее состояние симуляции)\n let pending = this._pending.get(tick);\n if (!pending) {\n pending = [];\n this._pending.set(tick, pending);\n }\n pending.push(data);\n\n // 2. Проверяем — уже был Predicted для такого tick+data?\n // (случается при rollback + пересимуляции с теми же данными)\n const awaiting = this._awaitingVerification.get(tick);\n const alreadyPredicted = awaiting?.some((a) => this._dataEquals(a, data));\n\n if (!alreadyPredicted) {\n // Первый раз видим это событие — Predicted\n this.Predicted.emit({ tick, data });\n\n // Добавляем в awaiting для будущей verification\n let aw = this._awaitingVerification.get(tick);\n if (!aw) {\n aw = [];\n this._awaitingVerification.set(tick, aw);\n }\n aw.push(data);\n }\n }\n\n /**\n * Verify/cancel signals for ticks up to verifiedTick.\n * Called each simulation tick from SignalsRegistry.\n * @internal\n */\n public _onTick(verifiedTick: number): void {\n while (this._lastVerifiedTick < verifiedTick) {\n const nextTick = this._lastVerifiedTick + 1;\n\n const awaiting = this._awaitingVerification.get(nextTick);\n if (awaiting && awaiting.length > 0) {\n const pending = this._pending.get(nextTick) ?? [];\n const pendingMatched = new Array(pending.length).fill(false);\n\n for (const awaitingData of awaiting) {\n let matchIdx = -1;\n for (let i = 0; i < pending.length; i++) {\n if (!pendingMatched[i] && this._dataEquals(pending[i], awaitingData)) {\n matchIdx = i;\n break;\n }\n }\n\n if (matchIdx >= 0) {\n pendingMatched[matchIdx] = true;\n this.Verified.emit({ tick: nextTick, data: awaitingData });\n } else {\n this.Cancelled.emit({ tick: nextTick, data: awaitingData });\n }\n }\n }\n\n this._cleanupTick(nextTick);\n this._lastVerifiedTick = nextTick;\n }\n }\n\n /**\n * Перед rollback — очищаем pending для тиков которые будут пересимулированы\n * @internal\n */\n public _onBeforeRollback(toTick: number): void {\n for (const tick of this._pending.keys()) {\n if (tick > toTick) {\n this._pending.delete(tick);\n }\n }\n // _awaitingVerification НЕ очищаем — проверим при verification\n }\n\n /**\n * Очистка данных для тика после verification\n */\n private _cleanupTick(tick: number): void {\n this._awaitingVerification.delete(tick);\n this._pending.delete(tick);\n }\n\n /**\n * Shallow comparison данных. Override для custom сравнения.\n */\n protected _dataEquals(a: TData, b: TData): boolean {\n if (a === b) return true;\n if (typeof a !== 'object' || typeof b !== 'object') return false;\n if (a === null || b === null) return false;\n\n const objA = a as Record<string, unknown>;\n const objB = b as Record<string, unknown>;\n\n const keysA = Object.keys(objA);\n const keysB = Object.keys(objB);\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n if (objA[key] !== objB[key]) {\n return false;\n }\n }\n return true;\n }\n\n public dispose(): void {\n this._pending.clear();\n this._awaitingVerification.clear();\n this._lastVerifiedTick = -1;\n this.Predicted.clear();\n this.Verified.clear();\n this.Cancelled.clear();\n }\n}\n"],"names":["EventEmitter","ECSConfig","ECSSignal","Signal","emit","tick","data","pending","_pending","get","set","push","awaiting","_awaitingVerification","alreadyPredicted","some","a","_dataEquals","Predicted","aw","_onTick","verifiedTick","_lastVerifiedTick","nextTick","length","pendingMatched","Array","fill","awaitingData","matchIdx","i","Verified","Cancelled","_cleanupTick","_onBeforeRollback","toTick","keys","delete","b","objA","objB","keysA","Object","keysB","key","dispose","clear","constructor","_ECSConfig","Map"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { Signal } from './signal.js';
2
+ export declare class SignalsRegistry {
3
+ private readonly _signals;
4
+ init(signals: Signal[]): void;
5
+ onTick(verifiedTick: number): void;
6
+ onBeforeRollback(toTick: number): void;
7
+ dispose(): void;
8
+ }
9
+ //# sourceMappingURL=signals.registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signals.registry.d.ts","sourceRoot":"","sources":["../../../src/lib/signals/signals.registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IAElC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAS7B,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAMlC,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAMtC,OAAO,IAAI,IAAI;CAMvB"}
@@ -7,9 +7,9 @@ export class SignalsRegistry {
7
7
  this._signals.push(signal);
8
8
  }
9
9
  }
10
- onTick(currentTick) {
10
+ onTick(verifiedTick) {
11
11
  for (const signal of this._signals){
12
- signal._onTick(currentTick);
12
+ signal._onTick(verifiedTick);
13
13
  }
14
14
  }
15
15
  onBeforeRollback(toTick) {