The List tab could show one list at a time and was the only place to
see its items. A list now shows its items right where it lives, and a
new Variables tab shows all variables of an asset or placed object.
- InlineList draws the items of a list under its row in the inspector,
in struct fields and in the Variables tab. A list inside a list or a
struct field is drawn the same way, one step indented.
- The index column is the indent. Items sit under their list without an
own margin, and the index column is 16 px wide instead of 28 px.
- Above 20 items (INLINE_LIMIT) the rest collapses into "... N more -
open in tab". During a run the rows show the values from the game.
- ListHead puts "N items" and "+ Item" in one row. "N items" opens the
list in a tab. A separate Open button squeezed the counter to zero
width in the narrow inspector column.
- VariablesEditor shows every variable of a behavior asset, a variables
asset or a placed behavior. On an asset it edits the declarations. On
a placed object an edit only overrides that object, with the usual
reset and push buttons.
- Opening a list inside a tab adds a new tab and keeps the open one.
valuesKey gives each list its own document, so a list that is already
open is shown instead of opened twice.
- Titles read "Pickup · Variables" or "Listy · nums · [3]". The tab
closes when its asset or object is deleted.
- Lists on node inputs stay inline only, a node owns no variables.
- The List tab, ListEditor and the __gm.list hook are gone.
Tests:
- ./check.sh: 181 files, 2645 tests, CHECK EXIT 0
- GM_STEPS=1,21,22,32: ALL PASSED, 123 checks
- e2e 21 is rewritten for inline lists and the new tab, 22 and 32 are
adapted. Sum in README: 1486 (+6 in 21, -1 in 22), counted by hand.
- Counter-probes fail as expected: sub-lists not told apart (1 unit
test), sub-list replacing the open tab, all items drawn inline (60
rows instead of 20), no live values (0 rows at 24 items in a run).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Structs and lists were capped at two fixed levels (list of structs,
struct with a list field). Anything deeper was dropped silently on
load, in node settings and when written to a variable. The cap came
from an early design choice, not from a technical need, so it is
lifted completely instead of adding a third fixed level.
- One kind list NESTED_KINDS replaces ListItemKind and
StructFieldKind. The flat special cases in listItems.ts are gone,
every value goes through one recursive path.
- A struct inside a struct is declared, like a top-level struct.
Values coming in over an edge are brought into that shape. Struct
items in lists still take their fields from the value.
- New valuePath.ts addresses any nested spot by keys and indices.
ListSlot.field is now ListSlot.path.
- Field commands (add, rename, remove) take the path to the struct.
They change declaration, own value and all overrides in one undo
step, as before on the top level.
- Inspector: "+ Field" offers Struct and List on every level. A
nested struct is a header row with its own "+ Field", its fields
are indented one step further.
- List tab: a list item shows "n items" and opens one level deeper.
The title shows the path, e.g. "Listy · nums · [3]".
- Pack in Pack now writes a struct into a struct field instead of
text. Objects are kept at any depth and stripped at every exit.
- A list edit in a struct field without an existing object override
now starts from the shown value instead of an empty struct.
- Old projects load unchanged. Save, load and save again gives the
same result.
Tests:
- ./check.sh: 172 files, 2498 tests, CHECK EXIT 0
- e2e 21 + 22: ALL PASSED, 90 checks (new 21d-iii, 22f-ii,
21d and 22f updated)
- 20 new unit tests in nested-values.test.ts and
nested-list-slot.test.ts, three tests that pinned the old cap
turned around
- 6 counter-probes, each fails 1 to 8 tests, originals restored
and checked with cmp
- Not covered: a nested struct inside a struct item in the list
tab has no e2e click
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>