A state change is something the graph can react to, so the machine announces it (#53, #54, #55, #57)
game-maker / suite (push) Successful in 10m58s
game-maker / suite (push) Successful in 10m58s
Four issues that all reach for the same line: how the current state is read and written. Splitting them into four commits would mean four states of the tree that do not compile, so they arrive together. #55 start state — the machine asset carries an optional `start` holding a State node's id. Right-click a state to set or remove it, a ring in the node's title says which one it is. A dead id (the state was deleted) reads as "no start", so nothing has to clean up after a deletion. #53 entered/exited — `On state entered` and `On state exited`, one exec output per state. Every change now goes through a single `setState` that reports it; BehaviorSystem delivers it after the exec flow that caused it, `exited` of the old before `entered` of the new, round after round until the queue is empty, with a cap that stops a ping-pong graph with an endless-loop error. A local machine tells the instance that switched, a global one tells every instance holding a matching event node. The start state fires `entered` too: per instance for a local machine, once per run for a global one. #57 reading — `Current state` with `name` for showing and `id` for comparing, `Is in state` with one boolean per state. Neither has a `run`, so `read` learned `def` and `lookup`, and the catalog test knows this third kind of node. #54 seeing it — during a run the state machine tab marks every state some instance is holding faintly, and the one held by the selected scene object's instance strongly. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
bc57f61c91
commit
7babf88636
30 files changed
+906
-44
No files matched your search
+8
-1
@@ -188,7 +188,12 @@ export function fakeHandle(props: PropertyBag, parent: EntityHandle | null = nul
|
||||
return { [ENTITY_HANDLE]: true, id: 'h', assetId: 'a', name: 'h', x: 0, y: 0, z: 0, props, parent };
|
||||
}
|
||||
|
||||
export type FakeContext = NodeContext & { logs: string[]; stopped: boolean };
|
||||
/** `changes` records the state moves the context was told about, in the order they were reported. */
|
||||
export type FakeContext = NodeContext & {
|
||||
logs: string[];
|
||||
stopped: boolean;
|
||||
changes: { machineId: string; from: string; to: string }[];
|
||||
};
|
||||
|
||||
/** A NodeContext double: self/owner handles, `speed = 100`, dt 0.5, moves applied directly, `log` and `stop` recorded. */
|
||||
export function fakeContext(overrides: Partial<NodeContext> = {}): FakeContext {
|
||||
@@ -199,6 +204,8 @@ export function fakeContext(overrides: Partial<NodeContext> = {}): FakeContext {
|
||||
variables: { speed: 100 },
|
||||
states: {},
|
||||
shared: emptySharedState(),
|
||||
changes: [],
|
||||
stateChanged: (machineId, from, to) => ctx.changes.push({ machineId, from, to }),
|
||||
time: 0,
|
||||
dt: 0.5,
|
||||
logs,
|
||||
|
||||
Reference in new issue
Block a user