darker-engine
Version:
ecs lightweight library
59 lines (58 loc) • 2.38 kB
TypeScript
/**
* Engine
*/
export interface EngineType<I, C extends string | number, D> {
setSystems: (...systems: SystemFunction<C>[]) => Promise<void>;
getEntityList: () => EntityType<I, C, D>[];
getEntityListByType: (type: I) => EntityType<I, C, D>[];
getEntityListByComponents: (...componentList: C[]) => EntityType<I, C, D>[];
getEntity: (id: number) => EntityType<I, C, D> | undefined;
addEntity: (...entities: SimpleEntityType<I, C, D>[]) => Promise<EntityType<I, C, D>[]>;
removeEntity: (...idList: number[]) => Promise<void>;
getSystem: (name: number) => SystemType<C> | undefined;
clear: () => void;
load: () => Promise<void>;
hardReload: () => Promise<void>;
__debug__: {
swapSystem: (systemId: number, system: SystemFunction<C>) => Promise<void>;
getSystem: (name: string) => SystemType<C> | undefined;
};
}
/**
* System
*/
export interface SystemType<C> {
id: number;
name: string;
components: C[];
onAdd?: (id: number) => Promise<void>;
onUpdate?: (id: number, component?: C) => Promise<void>;
onRemove?: (id: number) => Promise<void>;
onLoad?: () => Promise<void>;
onDestroy?: () => Promise<void>;
}
export type SystemFunction<C> = () => Promise<Omit<SystemType<C>, 'id' | 'name'>>;
/**
* Entity
*/
export interface EntityType<I, C extends string | number, D> {
readonly type: I;
readonly data: Partial<D>;
readonly components: C[];
id: number;
safe?: boolean;
getData: () => Record<number, any>;
getComponent: <T extends keyof D>(component: T, deepClone?: boolean) => D[T];
getComponents: <T extends keyof D>(components: T[], deepClone?: boolean) => {
[K in T]: D[K];
};
getComponentTypes: () => C[];
hasComponent: (component: number) => boolean;
updateComponent: <T extends keyof D>(component: T, data?: D[T]) => Promise<EntityType<I, C, D> | undefined>;
removeComponent: (component: C) => Promise<void>;
}
export type SimpleEntityType<I, C extends string | number, D> = Omit<EntityType<I, C, D>, 'getData' | 'getComponent' | 'getComponents' | 'getComponentTypes' | 'hasComponent' | 'updateComponent' | 'removeComponent'>;
export type EntityTypeFunction<I, C extends string | number, D, P> = (props: P) => SimpleEntityType<I, C, D>;
export type DarkerMap<T extends string | number, S> = {
[key in T]: S;
};