@daneren2005/shared-memory-ecs 1.6.0 → 1.7.1

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.
@@ -0,0 +1,51 @@
1
+ import type { ComponentDefinitionMap, EntityConfigOf } from './component-definition';
2
+ export type EntityClassConstructor = abstract new (...args: never[]) => {
3
+ readonly eid: number;
4
+ };
5
+ export interface EntityClassDefinition {
6
+ entity: EntityClassConstructor;
7
+ components: ReadonlyArray<string>;
8
+ }
9
+ export type EntityClassRegistry = Record<string, EntityClassDefinition>;
10
+ declare const ENTITY_CLASSES_TYPE: unique symbol;
11
+ export type DefinedEntityClasses<R extends ComponentDefinitionMap, Classes extends EntityClassRegistry> = Classes & {
12
+ readonly [ENTITY_CLASSES_TYPE]: R;
13
+ };
14
+ export type EntityInstancesOf<Classes extends EntityClassRegistry> = InstanceType<Classes[keyof Classes & string]['entity']>;
15
+ type RegistryOf<Classes extends EntityClassRegistry> = Classes extends DefinedEntityClasses<infer R, EntityClassRegistry> ? R : never;
16
+ type ComponentKeysOf<Definition> = Definition extends {
17
+ components: ReadonlyArray<infer K>;
18
+ } ? K : never;
19
+ export type EntityClassTemplateConfig<Classes extends EntityClassRegistry, ClassName extends keyof Classes & string, R extends ComponentDefinitionMap = RegistryOf<Classes>> = EntityConfigOf<Pick<R, Extract<ComponentKeysOf<Classes[ClassName]>, keyof R>>> & {
20
+ type: string;
21
+ class: ClassName;
22
+ };
23
+ export type EntityTemplateConfigOf<Classes extends EntityClassRegistry> = {
24
+ [ClassName in keyof Classes & string]: EntityClassTemplateConfig<Classes, ClassName>;
25
+ }[keyof Classes & string];
26
+ export type EntityInstanceConfigOf<Classes extends EntityClassRegistry> = EntityTemplateConfigOf<Classes> extends infer Config ? Config extends object ? Omit<Config, 'class'> & {
27
+ class?: never;
28
+ } : never : never;
29
+ type EntityClassInput<R extends ComponentDefinitionMap> = Record<string, {
30
+ entity: EntityClassConstructor;
31
+ components: ReadonlyArray<keyof R & string>;
32
+ }>;
33
+ type ExactEntityConfig<Classes extends EntityClassRegistry, ClassName extends keyof Classes & string, Type, Config> = Config & EntityClassTemplateConfig<Classes, ClassName> & {
34
+ type: Type;
35
+ } & Record<Exclude<keyof Config, keyof EntityClassTemplateConfig<Classes, ClassName>>, never>;
36
+ type CheckedEntityConfig<Classes extends EntityClassRegistry, Type, Config> = Config extends {
37
+ class: infer ClassName;
38
+ } ? ClassName extends keyof Classes & string ? ExactEntityConfig<Classes, ClassName, Type, Config> : never : never;
39
+ type CheckedEntityConfigs<Classes extends EntityClassRegistry, Configs> = {
40
+ [K in keyof Configs]: CheckedEntityConfig<Classes, K, Configs[K]>;
41
+ };
42
+ export declare function defineEntityClasses<R extends ComponentDefinitionMap, const Classes extends EntityClassInput<R>>(_registry: R, classes: Classes): DefinedEntityClasses<R, Classes>;
43
+ export declare function defineEntityConfigs<Classes extends EntityClassRegistry, const Configs extends Record<string, {
44
+ type: string;
45
+ class: keyof Classes & string;
46
+ }>>(_classes: Classes, configs: Configs & CheckedEntityConfigs<Classes, Configs>): Configs;
47
+ export interface WorkerEntityClassDefinition {
48
+ components: Array<string>;
49
+ }
50
+ export type WorkerEntityClassRegistry = Record<string, WorkerEntityClassDefinition>;
51
+ export {};
@@ -1,7 +1,8 @@
1
1
  import type { ComponentDefinition } from './component-definition';
2
2
  export interface EntityComponent {
3
3
  index: number;
4
- type: string;
4
+ readonly type: string;
5
+ readonly class: string;
5
6
  dead: boolean;
6
7
  isStatic: boolean;
7
8
  }
@@ -9,6 +10,9 @@ export interface EntityComponentConfig {
9
10
  type: string;
10
11
  isStatic?: boolean;
11
12
  }
13
+ export interface EntityClassConfig {
14
+ readonly class: string;
15
+ }
12
16
  export interface EntityComponentSerialization {
13
17
  type?: string;
14
18
  dead?: boolean;
@@ -16,4 +20,5 @@ export interface EntityComponentSerialization {
16
20
  export declare const DEAD_INDEX = 0;
17
21
  export declare const STATIC_INDEX = 1;
18
22
  export declare const TYPE_INDEX = 2;
19
- export declare const entityDefinition: ComponentDefinition<EntityComponent, Uint32Array, EntityComponentConfig, EntityComponentSerialization>;
23
+ export declare const CLASS_INDEX = 3;
24
+ export declare const entityDefinition: ComponentDefinition<EntityComponent, Uint32Array, EntityComponentConfig & Partial<EntityClassConfig>, EntityComponentSerialization>;
@@ -1,16 +1,32 @@
1
1
  import BaseEntity from './entity';
2
2
  import type BaseWorld from './world';
3
3
  import type { ComponentDefinitionMap, ComponentMap } from './component-definition';
4
- export default class EntityFactory<C extends ComponentMap = ComponentMap, Cfg = any> {
5
- world: BaseWorld<ComponentDefinitionMap, C, Cfg>;
4
+ import type { EntityClassRegistry, WorkerEntityClassRegistry } from './entity-class';
5
+ export default class EntityFactory<C extends ComponentMap = ComponentMap, Cfg = any, E extends BaseEntity<C, Cfg> = BaseEntity<C, Cfg>> {
6
+ world: BaseWorld<ComponentDefinitionMap, C, Cfg, E>;
6
7
  configs: {
7
8
  [type: string]: Cfg;
8
9
  };
10
+ classes: EntityClassRegistry;
11
+ private allowedComponents;
9
12
  constructor(configs?: {
10
13
  [type: string]: Cfg;
11
- });
14
+ }, classes?: EntityClassRegistry);
12
15
  register(type: string, config: Cfg): void;
16
+ setWorld(world: BaseWorld<ComponentDefinitionMap, C, Cfg, E>): void;
13
17
  getConfig(config: Cfg): Cfg;
14
- loadEntity(config: Cfg, created?: boolean): BaseEntity<C, Cfg>;
15
- protected createEntity(config: Cfg): BaseEntity<C, Cfg>;
18
+ loadEntity(config: Cfg, created?: boolean): E;
19
+ createAdoptedEntity(type: string, entityClass: string | undefined, eid: number): E;
20
+ isComponentAllowed(entityClass: string | undefined, component: string): boolean;
21
+ getWorkerClasses(): WorkerEntityClassRegistry | undefined;
22
+ getAllowedComponentsForConfig(config: Cfg | undefined): ReadonlySet<string> | undefined;
23
+ protected createEntity(config: Cfg): E;
24
+ private get hasClasses();
25
+ private getClassDefinition;
26
+ private getAllowedComponents;
27
+ private constructEntity;
28
+ private validateTemplate;
29
+ private validateResolvedConfig;
30
+ private validateTypeClass;
31
+ private validateComponentTriggers;
16
32
  }
package/dist/entity.d.ts CHANGED
@@ -7,12 +7,16 @@ export default class BaseEntity<C extends ComponentMap = ComponentMap, Cfg = any
7
7
  config?: Cfg;
8
8
  world: BaseWorld<ComponentDefinitionMap, C, Cfg>;
9
9
  private componentMemoryDeletionScheduled;
10
+ private allowedComponents?;
10
11
  components: Partial<C> & {
11
12
  entity: EntityComponent;
12
13
  };
13
- constructor(world: BaseWorld<ComponentDefinitionMap, C, Cfg>, config?: Cfg, adoptEid?: number);
14
+ constructor(world: BaseWorld<ComponentDefinitionMap, C, Cfg>, config?: Cfg, adoptEid?: number, allowedComponents?: ReadonlySet<string>);
15
+ get id(): number;
16
+ get dead(): boolean;
17
+ get type(): string;
14
18
  loadComponent<K extends keyof C>(name: K, config: any, emitAdded?: boolean): C[K];
15
- attachComponent<K extends keyof C>(name: K, index: number): C[K];
19
+ attachComponent<K extends keyof C>(name: K, index: number, emitAdded?: boolean): C[K];
16
20
  removeComponent<K extends keyof C>(name: K): void;
17
21
  setComponent<K extends keyof C, P extends keyof C[K]>(componentName: K, prop: P, value: C[K][P]): void;
18
22
  /**
@@ -24,4 +28,8 @@ export default class BaseEntity<C extends ComponentMap = ComponentMap, Cfg = any
24
28
  load(config: Cfg): void;
25
29
  save(): Cfg;
26
30
  finishLoading(): void;
31
+ private isComponentAllowed;
32
+ setAllowedComponents(allowedComponents: ReadonlySet<string> | undefined): void;
33
+ private assertComponentAllowed;
34
+ private assertComponentPropertyMutable;
27
35
  }
package/dist/index.d.ts CHANGED
@@ -2,12 +2,16 @@ export { default as BaseWorld } from './world';
2
2
  export type { WorldOptions, WorldConfig } from './world';
3
3
  export { default as BaseEntity } from './entity';
4
4
  export { default as EntityFactory } from './entity-factory';
5
- export { entityDefinition, DEAD_INDEX, STATIC_INDEX, TYPE_INDEX } from './entity-component';
5
+ export { defineEntityClasses, defineEntityConfigs } from './entity-class';
6
+ export type { DefinedEntityClasses, EntityClassConstructor, EntityClassDefinition, EntityClassRegistry, EntityClassTemplateConfig, EntityInstanceConfigOf, EntityInstancesOf, EntityTemplateConfigOf, } from './entity-class';
7
+ export { entityDefinition, CLASS_INDEX, DEAD_INDEX, STATIC_INDEX, TYPE_INDEX } from './entity-component';
6
8
  export { default as ConstantStringCache } from './constant-string-cache';
7
- export type { EntityComponent, EntityComponentConfig, EntityComponentSerialization, } from './entity-component';
9
+ export type { EntityComponent, EntityClassConfig, EntityComponentConfig, EntityComponentSerialization, } from './entity-component';
8
10
  export { default as killEntity } from './actions/kill-entity';
9
11
  export { default as killEntityWorker } from './actions/kill-entity-worker';
10
12
  export { default as createEntityWorker } from './actions/create-entity-worker';
13
+ export { default as addComponentWorker } from './actions/add-component-worker';
14
+ export { default as removeComponentWorker } from './actions/remove-component-worker';
11
15
  export { default as PerformanceTiming, DEFAULT_TICKS_BETWEEN_UPDATES } from './performance-timing';
12
16
  export type { TimingStats, SystemTimingStats, PerformanceStats, PerformanceTimingOptions, } from './performance-timing';
13
17
  export { default as MemoryComponent } from './memory-component';
@@ -23,7 +27,7 @@ export type { EntitySystemConfig } from './systems/entity-system';
23
27
  export { default as EntityWorkerSystem } from './systems/entity-worker-system';
24
28
  export { default as WorkerSystem } from './systems/worker-system';
25
29
  export type { WorkerSystemConfig, WorkerSystemRunFunction } from './systems/worker-system';
26
- export type { EntityWorkerSystemConfig, EntityWorkerSystemQuery, EntityWorkerSystemWorld, EntityWorkerSystemCallbacks, WorkerAllocator, WorkerCreateEntityConfig, WorkerCreatedEntity, EntityUpdateComponents, EntityQueryComponents, EntityUpdateFunction, EntityUpdateInitFunction, EntityUpdatePreRunFunction, EntityRemovedFunction, UpdateEntityConfig, UpdateEntityConfigObject, } from './systems/entity-worker-system';
30
+ export type { EntityWorkerSystemConfig, EntityWorkerSystemQuery, EntityWorkerSystemWorld, EntityWorkerSystemCallbacks, WorkerAllocator, WorkerCreateEntityConfig, WorkerCreatedEntity, WorkerCreatedComponent, WorkerComponentChange, EntityUpdateComponents, EntityQueryComponents, EntityUpdateFunction, EntityUpdateInitFunction, EntityUpdatePreRunFunction, EntityRemovedFunction, UpdateEntityConfig, UpdateEntityConfigObject, } from './systems/entity-worker-system';
27
31
  export { default as WebWorker } from './systems/workers/web-worker';
28
32
  export { default as EntitySystemWebWorker } from './systems/workers/entity-system-web-worker';
29
33
  export { default as createEntitySystemWorker } from './systems/workers/create-entity-system-worker';