UNPKG

ecspresso

Version:

A minimal Entity-Component-System library for typescript and javascript.

103 lines (102 loc) 3.35 kB
/** * Steering Plugin for ECSpresso * * Provides simple move-to-target behavior with arrival detection. * Entities with a `moveTarget` component move toward the target position * at their configured `moveSpeed`. The `moveTarget` component is removed * on arrival and an `arriveAtTarget` event is published. */ import { type BasePluginOptions } from 'ecspresso'; import type { ComponentsConfig, EventsConfig } from 'ecspresso'; import type { TransformWorldConfig } from '../spatial/transform'; /** * Target position for an entity to move toward. * Removed automatically when the entity arrives. */ export interface MoveTarget { x: number; y: number; } /** * Component types provided by the steering plugin. */ export interface SteeringComponentTypes { moveTarget: MoveTarget; moveSpeed: number; } /** * Event fired when an entity arrives at its move target. */ export interface ArriveAtTargetEvent { entityId: number; } /** * Event types provided by the steering plugin. */ export interface SteeringEventTypes { arriveAtTarget: ArriveAtTargetEvent; } /** * WorldConfig representing the steering plugin's provided types. * Used as the `Requires` type parameter by plugins that depend on steering. */ export type SteeringWorldConfig = ComponentsConfig<SteeringComponentTypes> & EventsConfig<SteeringEventTypes>; /** * Configuration options for the steering plugin. */ export interface SteeringPluginOptions<G extends string = 'steering'> extends BasePluginOptions<G> { /** Distance threshold to consider arrival (default: 2) */ arrivalThreshold?: number; } /** * Create a moveTarget component. * * @param x Target x position * @param y Target y position * @returns Component object suitable for spreading into spawn() * * @example * ```typescript * ecs.addComponent(entityId, 'moveTarget', createMoveTarget(200, 300).moveTarget); * ``` */ export declare function createMoveTarget(x: number, y: number): Pick<SteeringComponentTypes, 'moveTarget'>; /** * Create a moveSpeed component. * * @param speed Movement speed in pixels per second * @returns Component object suitable for spreading into spawn() * * @example * ```typescript * ecs.spawn({ * ...createTransform(100, 200), * ...createMoveSpeed(150), * }); * ``` */ export declare function createMoveSpeed(speed: number): Pick<SteeringComponentTypes, 'moveSpeed'>; /** * Create a steering plugin for ECSpresso. * * Provides a `move-to-target` system that moves entities with `moveTarget` * and `moveSpeed` components toward their target position. On arrival, * the `moveTarget` component is removed and an `arriveAtTarget` event is published. * * @example * ```typescript * const ecs = ECSpresso.create() * .withPlugin(createTransformPlugin()) * .withPlugin(createSteeringPlugin()) * .build(); * * await ecs.initialize(); * * ecs.spawn({ * ...createTransform(0, 0), * ...createMoveSpeed(100), * ...createMoveTarget(200, 200), * }); * ``` */ export declare function createSteeringPlugin<G extends string = 'steering'>(options?: SteeringPluginOptions<G>): import("ecspresso").Plugin<import("ecspresso").WithEvents<import("ecspresso").WithComponents<import("ecspresso").EmptyConfig, SteeringComponentTypes>, SteeringEventTypes>, TransformWorldConfig, "move-to-target", G, never, never>;