import type { VectorPoint } from '../model/Asset'; import type { PropertyBag } from '../model/Properties'; import type { Graph } from './Graph'; /** What running another behavior's graph in place needs: its nodes, its variable defaults, its name. */ export interface BehaviorProgram { name: string; graph: Graph; defaults: PropertyBag; /** The variables a call hands on to the next call from the same site (#229); absent is none. */ kept?: readonly string[]; } /** One state of a machine: the node id is what a port and the runtime hold, the name is the label. */ export interface MachineState { id: string; name: string; } /** * An allowed move between two states, both named by state node id, under the name `State * transition` asks for. The name is empty until someone gives the transition one. */ export interface MachineTransition { from: string; to: string; name: string; } export interface StateMachine { name: string; states: MachineState[]; transitions: MachineTransition[]; /** Id of the state every instance begins in, empty when the machine has no start (see #55). */ start: string; } /** * What a node may look up in the project around its graph: the behaviors it can run, the state * machines it can read, the curves a `Lerp` eases along (#247) and the struct types `Add item` * checks (#254). One handle, so no caller can resolve a node with half of it. */ export interface GraphLookup { behavior(assetId: string): BehaviorProgram | null; machine(assetId: string): StateMachine | null; curve(assetId: string): readonly VectorPoint[] | null; /** A Struct asset as a run knows it: a name and field names, nothing else travels (#254). */ structType(assetId: string): StructShape | null; /** A texture's, frame's or pixel-art frame's own size in pixels; null for no picture. */ textureSize(pictureId: string): { w: number; h: number } | null; } export interface StructShape { name: string; fields: readonly string[]; } export const NO_LOOKUP: GraphLookup = { behavior: () => null, machine: () => null, curve: () => null, structType: () => null, textureSize: () => null, };