From 699b72db461bcf96897feb56c2c2b7152c6fe77a Mon Sep 17 00:00:00 2001 From: meleki Date: Sat, 26 Sep 2026 19:36:56 +0200 Subject: [PATCH] Describe the Asset kind, Spawn's asset input and Child by name (#237) --- Behaviors.md | 10 ++++++---- Development.md | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Behaviors.md b/Behaviors.md index 463e183..143ab8d 100644 --- a/Behaviors.md +++ b/Behaviors.md @@ -74,7 +74,9 @@ playing use the same two words. the slot the kind it was. A **texture is a kind wherever a kind is picked** — a variable, a struct field, a list item, an Any port of `Properties`, a field of `Pack` — and the `Texture` node hands one into the graph, as `Number` and `Text` do a number and a text; a **state machine** is the same - kind of kind, with the `State machine` node. **Every kind is one row of one + kind of kind, with the `State machine` node. An **asset** is one too (`{"$asset": "crate"}`, the + `Asset` node): declared as a variable or picked in a list it offers every placeable asset, which + is what `Spawn` places, so a list of assets and an `Item at` spawn one of several. **Every kind is one row of one table** (`core/properties/kinds.ts`): its word and mark, what it travels as on an edge, its empty value, how a value is read as it, whether it is tagged and where it may be picked. The kind lists, the `+ …` menus, the tags, the port fields and the literal nodes all follow from the row, so a new @@ -109,9 +111,9 @@ playing use the same two words. set to `a` also hears `A`, and a key picked with Shift held is stored lower-case. A key is let go under the name it went down as, even when Shift changes in between (`1` down, `!` up). - **Node set** (`src/core/graph/nodes/`, one file per node): events `On start`, `On enable`, `On update`, `On disable`, `On destroy` (see *Lifecycle*), `On key down/up/held`, - `On timer` (fires on the first frame past each due time; `late` says by how much, so `time - late` is exactly a multiple of the interval), `On collision enter/stay/exit` (stay every frame, or with an interval; while playing enter and stay tell normal, impulse and point of the contact), `On click` (the mouse pressed on the owner — anywhere when it has none), `On animation finished`, `On state entered`, `On state exited` (one output per state, see *State machines*), `Start` · flow `Branch`, `Sequence`, `Repeat`, `Run behavior`, `End`, and the four that move or follow a state machine, `State branch`, `Set state`, `Set state by name`, `State transition` (see *State machines*) · data `Self`, `Owner`, `Parent`, `Object by name`, `Name of`, + `On timer` (fires on the first frame past each due time; `late` says by how much, so `time - late` is exactly a multiple of the interval), `On collision enter/stay/exit` (stay every frame, or with an interval; while playing enter and stay tell normal, impulse and point of the contact), `On click` (the mouse pressed on the owner — anywhere when it has none), `On animation finished`, `On state entered`, `On state exited` (one output per state, see *State machines*), `Start` · flow `Branch`, `Sequence`, `Repeat`, `Run behavior`, `End`, and the four that move or follow a state machine, `State branch`, `Set state`, `Set state by name`, `State transition` (see *State machines*) · data `Self`, `Owner`, `Parent`, `Object by name`, `Child by name` (the nearest object of that name below the given one: its children, then their children, and so on; within a level the first in hierarchy order, nothing when none is called so), `Name of`, `Is asset` (is this object an instance of asset X — how you tell what you collided with), - `Variables`, `Properties` (every property row of the target's type, the transform rows `scale`, `rotation`, `mirrorX`, `mirrorY` included — how a graph turns a sprite), `Get position` (local and world), `Is enabled`, literals `Number`/`Text`/`Boolean`/`Texture`/`State machine`/`Sound`/`Scene`, `Add/Subtract/Multiply/Divide`, + `Variables`, `Properties` (every property row of the target's type, the transform rows `scale`, `rotation`, `mirrorX`, `mirrorY` included — how a graph turns a sprite), `Get position` (local and world), `Is enabled`, literals `Number`/`Text`/`Boolean`/`Texture`/`State machine`/`Sound`/`Scene`/`Animation`/`Asset`, `Add/Subtract/Multiply/Divide`, `Min/Max/Abs/Sqrt/Clamp`, `Floor/Ceil/Round`, `Modulo`, `Random`, `Time`, `To text`, `To number`, `Join text`, `Substring`, `Find text`, `Equals`, `First not empty` (a, unless a is empty, then b; the setting *Empty means* says how much counts as empty: *Any empty value* is nothing, 0, "", false, an empty @@ -129,7 +131,7 @@ playing use the same two words. same for two numbers, and for a number against a typed text that is a number, like `130`), `And/Or/Not`, `Key is down`, `Mouse position`, `Mouse button`, `Is hovered`, `Is touching`, `Get velocity`, `Current state` (name and id), `Is in state` (one boolean per state) · actions `Move` (dx, dy, scale, dt — connect an event's dt for per-second movement; in the object's own axes, which a turned parent turns too; with *Collide with solids* it slides along what it hits, less friction, and outputs `blocked x/y`, `hit` and the contact `normal x/y`, see [Colliders](Colliders)), `Set position`, `Spawn` - (asset setting + x/y/z, optional parent → outputs the new object), `Destroy`, `Emit` (starts a particle source over, see *Particles*), + (asset input + x/y/z, optional parent → outputs the new object; the asset is picked on the node or arrives over an edge, from an `Asset` node, a variable or a list item. A pick saved while it was still a setting reads as that input's value, so older projects spawn as before; the same holds for the asset of `Is asset`), `Destroy`, `Emit` (starts a particle source over, see *Particles*), `Play sound` / `Stop sound` (see [Sounds](Sounds): the asset says how loud and whether it loops, the node's `volume` multiplies that and its `loop` either leaves it alone or overrules it in either direction; every play is a voice of its own, so two in a row overlap, and the voice ends with the diff --git a/Development.md b/Development.md index 00665cc..345f2db 100644 --- a/Development.md +++ b/Development.md @@ -15,7 +15,7 @@ npm run build # writes dist/ and regenerates index.html php tools/make-user.php [admin|user] # an account; every tool signs in (see Accounts) php tests/php/accounts.test.php # the API's account rules, no server needed (CI's gate job) php tests/php/snapshots.test.php # the snapshot store (#231), the same way -node tools/seed-e2e.mjs && node tools/e2e.mjs # 1401 editor checks, screenshots in /tmp/gm-e2e-*.png +node tools/seed-e2e.mjs && node tools/e2e.mjs # 1403 editor checks, screenshots in /tmp/gm-e2e-*.png GM_STEPS=20 node tools/e2e.mjs # or 1-12, or 6,20 — a subset while working on one step ./e2e.sh start [GM_STEPS] # the same run detached, see below ./e2e.sh status # live progress, or the last run's result