Files
esengine/packages/fsm/src/IStateMachine.ts

365 lines
9.7 KiB
TypeScript
Raw Normal View History

/**
* @zh
* @en State Machine Interface
*
* @zh
* @en Provides core interfaces for finite state machine
*/
// =============================================================================
// 状态配置 | State Configuration
// =============================================================================
/**
* @zh
* @en State configuration
*/
export interface StateConfig<TState extends string = string, TContext = unknown> {
/**
* @zh
* @en State name
*/
readonly name: TState;
/**
* @zh
* @en Callback when entering state
*/
onEnter?: (context: TContext, from: TState | null) => void;
/**
* @zh 退
* @en Callback when exiting state
*/
onExit?: (context: TContext, to: TState) => void;
/**
* @zh
* @en State update callback
*/
onUpdate?: (context: TContext, deltaTime: number) => void;
/**
* @zh
* @en State tags
*/
tags?: string[];
/**
* @zh
* @en State metadata
*/
metadata?: Record<string, unknown>;
}
// =============================================================================
// 转换配置 | Transition Configuration
// =============================================================================
/**
* @zh
* @en Transition condition function
*/
export type TransitionCondition<TContext = unknown> = (context: TContext) => boolean;
/**
* @zh
* @en Transition configuration
*/
export interface TransitionConfig<TState extends string = string, TContext = unknown> {
/**
* @zh
* @en Source state
*/
readonly from: TState;
/**
* @zh
* @en Target state
*/
readonly to: TState;
/**
* @zh
* @en Transition condition
*/
condition?: TransitionCondition<TContext>;
/**
* @zh
* @en Transition priority (higher number = higher priority)
*/
priority?: number;
/**
* @zh
* @en Transition name (for debugging)
*/
name?: string;
}
// =============================================================================
// 状态机事件 | State Machine Events
// =============================================================================
/**
* @zh
* @en State change event
*/
export interface StateChangeEvent<TState extends string = string> {
/**
* @zh
* @en Previous state
*/
readonly from: TState | null;
/**
* @zh
* @en Current state
*/
readonly to: TState;
/**
* @zh
* @en Timestamp
*/
readonly timestamp: number;
}
/**
* @zh
* @en State change listener
*/
export type StateChangeListener<TState extends string = string> = (
event: StateChangeEvent<TState>
) => void;
// =============================================================================
// 状态机接口 | State Machine Interface
// =============================================================================
/**
* @zh
* @en State machine interface
*
* @zh /AI
* @en Generic finite state machine for character/AI state management
*
* @example
* ```typescript
* type PlayerState = 'idle' | 'walk' | 'run' | 'jump' | 'attack';
*
* const fsm = createStateMachine<PlayerState>('idle');
*
* fsm.defineState('idle', {
* onEnter: () => console.log('Entering idle'),
* onExit: () => console.log('Exiting idle')
* });
*
* fsm.defineTransition('idle', 'walk', () => isMoving);
* fsm.defineTransition('walk', 'run', () => isRunning);
*
* fsm.transition('walk'); // 手动转换
* fsm.evaluateTransitions(); // 自动评估条件
* ```
*/
export interface IStateMachine<TState extends string = string, TContext = unknown> {
/**
* @zh
* @en Current state
*/
readonly current: TState;
/**
* @zh
* @en Previous state
*/
readonly previous: TState | null;
/**
* @zh
* @en State machine context
*/
readonly context: TContext;
/**
* @zh
* @en Whether a transition is in progress
*/
readonly isTransitioning: boolean;
/**
* @zh
* @en Current state duration in milliseconds
*/
readonly currentStateDuration: number;
// =========================================================================
// 状态定义 | State Definition
// =========================================================================
/**
* @zh
* @en Define state
*
* @param state - @zh @en State name
* @param config - @zh @en State configuration
*/
defineState(state: TState, config?: Partial<StateConfig<TState, TContext>>): void;
/**
* @zh
* @en Check if state is defined
*
* @param state - @zh @en State name
*/
hasState(state: TState): boolean;
/**
* @zh
* @en Get state configuration
*
* @param state - @zh @en State name
*/
getStateConfig(state: TState): StateConfig<TState, TContext> | undefined;
/**
* @zh
* @en Get all defined states
*/
getStates(): TState[];
// =========================================================================
// 转换定义 | Transition Definition
// =========================================================================
/**
* @zh
* @en Define transition
*
* @param from - @zh @en Source state
* @param to - @zh @en Target state
* @param condition - @zh @en Transition condition
* @param priority - @zh @en Priority
*/
defineTransition(
from: TState,
to: TState,
condition?: TransitionCondition<TContext>,
priority?: number
): void;
/**
* @zh
* @en Remove transition
*
* @param from - @zh @en Source state
* @param to - @zh @en Target state
*/
removeTransition(from: TState, to: TState): void;
/**
* @zh
* @en Get available transitions from state
*
* @param from - @zh @en Source state
*/
getTransitionsFrom(from: TState): TransitionConfig<TState, TContext>[];
// =========================================================================
// 转换操作 | Transition Operations
// =========================================================================
/**
* @zh
* @en Check if can transition to target state
*
* @param to - @zh @en Target state
*/
canTransition(to: TState): boolean;
/**
* @zh
* @en Transition to target state
*
* @param to - @zh @en Target state
* @param force - @zh @en Force transition (ignore condition)
* @returns @zh @en Whether successful
*/
transition(to: TState, force?: boolean): boolean;
/**
* @zh
* @en Evaluate and execute transitions that meet conditions
*
* @returns @zh @en Whether a transition occurred
*/
evaluateTransitions(): boolean;
// =========================================================================
// 生命周期 | Lifecycle
// =========================================================================
/**
* @zh
* @en Update state machine
*
* @param deltaTime - @zh @en Delta time in milliseconds
*/
update(deltaTime: number): void;
/**
* @zh
* @en Reset state machine to initial state
*
* @param initialState - @zh @en Initial state
*/
reset(initialState?: TState): void;
// =========================================================================
// 事件监听 | Event Listening
// =========================================================================
/**
* @zh
* @en Listen to state enter event
*
* @param state - @zh @en State name
* @param callback - @zh @en Callback function
*/
onEnter(state: TState, callback: (from: TState | null) => void): () => void;
/**
* @zh 退
* @en Listen to state exit event
*
* @param state - @zh @en State name
* @param callback - @zh @en Callback function
*/
onExit(state: TState, callback: (to: TState) => void): () => void;
/**
* @zh
* @en Listen to any state change
*
* @param callback - @zh @en Callback function
*/
onChange(callback: StateChangeListener<TState>): () => void;
// =========================================================================
// 调试 | Debug
// =========================================================================
/**
* @zh
* @en Get state history
*/
getHistory(): StateChangeEvent<TState>[];
/**
* @zh
* @en Clear history
*/
clearHistory(): void;
}