feat: module 08 push chains

Movement planned in full, then committed: a Planner builds a plan
(moving and destroyed ids) by running content's movement responses
(OPEN/SHUT, PUSH, STOP) for every step, rolling back failed branches.
Edge of level blocks; YOU objects move furthest-ahead first; rules are
reparsed once after movement. Harness: move/move_dir(Dir), posOf,
kindsAt. Expansion Drop: PULL as one word plus one content response.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Lucas Winther
2026-10-29 04:05:42 +01:00
co-authored by Claude Opus 5.5
parent d993457772
commit bd80cefbef
64 changed files with 6933 additions and 0 deletions
+8
View File
@@ -26,6 +26,7 @@ Researched 2026-10-28. Every behavioral claim below cites a page that was actual
- `IS` row: "performs snapshot-based noun transformations. Multiple noun predicates may produce multiple objects; an identity result protects the source."
- `FLOAT` row: "Partial | Separates `OPEN`/`SHUT` interactions by float layer. It is not applied to the other overlap/effect properties." (This differs from the official game. See g.)
- ARCHITECTURE.md: "Parse horizontal and vertical `NOUN IS NOUN/PROPERTY` rules from text tiles." / "Text tiles are movable blockers during movement checks, even when they do not have an explicit `PUSH` rule." / "Rules are rebuilt after every move, so moving text can immediately change the active rule set."
- Also loaded (2026-10-29, for Module 8): `Sources/baba-is-auto/Games/Game.cpp` at commit 2305a3d (raw). Movement is two-phase. `Game::CanMove` (line 1756) checks the move recursively before anything changes: "// Check boundary" returns false off the map, then STOP, then whether the pushed objects can move. `Game::ProcessMove` (line 1865) and `Game::ProcessPush` (line 1910) then move the objects. PUSH, STOP, text and OPEN/SHUT are branches inside `CanMove`.
- **Course use:** a good example of how to represent rules as data and pin behavior with tests. Do **not** use it as an authority on official game semantics. It does not implement IS NOT for properties or nouns, it hard-codes text as pushable, and its FLOAT is partial.
### 2. Game Developer: "Designing Baba Is You's delightfully innovative rule-writing system"
@@ -91,6 +92,7 @@ All pages were loaded as wikitext via `https://babaiswiki.fandom.com/api.php?act
| STOP | loaded | "STOP is a property that prevents most forms of movement from moving into the object." / "Some movement checks also override STOP to allow a movement, including EAT OPEN SHUT WEAK." / "FLOAT does not allow bypassing STOP." |
| OPEN | loaded | "If an OPEN object is on, or moved onto, a same-float SHUT object (or vice-versa), both are removed." / "The movement check applies to standard forms of movement, including FEAR AUTO CHILL FALL MOVE NUDGEDOWN PULL PUSH SHIFT YOU YOU2 3D." / "If the movement check succeeds in finding an "unlock", the normal obstruction of movement by STOP PUSH PULL does not apply. *** However, other obstructing objects may still prevent the movement, and this will also prevent the destruction from OPEN SHUT since no movement actually occurs." / "Destruction happens before the moving object actually moves onto the other object, therefore anything it HAS will spawn on the space the object was moving from." / "Only one SHUT object is destroyed per OPEN object (and vice versa), based on the first object in update order." / "If both the OPEN and SHUT objects are SAFE, the check fails. If only one is, the check succeeds and the appropriate object is destroyed." |
| SHUT | loaded | "If a SHUT object is on, or moved onto, a same-float OPEN object (or vice-versa), both are removed. As OPEN and SHUT are a pair, see OPEN for details." |
| PULL (loaded 2026-10-29, for Module 8) | loaded | "PULL is a Property that makes an object pullable by any moving object. PULL also makes the object "solid" for collision checks like STOP does." / "If something directly adjacent from a PULL object moves away from it, the PULL object will try to move in the same direction." / "If a PULL object is being PULLed by a PULL movement, it can move through solid objects (though will still PUSH things)." / "If LEVEL IS PULL, the overall level can be pulled at the border, rotating it internally but not visually." / "If the same PULL object is being PULLed in multiple ways in the same movement stage, the result is based on update order." |
| HOT | loaded | "HOT is a property that causes the object to destroy any same-float MELT objects it contacts." / "An object that is both HOT and MELT destroys itself." |
| MELT | loaded | "MELT is a property that causes the object to be destroyed if contacting any same-float object that is HOT." / "MELT obeys HAS and SAFE as expected." |
| SINK | loaded | "SINK is a property that causes an object to destroy all overlapping same-float objects along with itself when there is at least one overlapping object." / "A stack of two or more SINK objects will mutually SINK each other." / "SINKing order: Overlapping objects are destroyed (unless SAFE) in priority order, then the SINK object itself." / "SINK has no movement check, only an overlap check." |
@@ -194,6 +196,12 @@ Inference status: this follows directly from the documented order. The wiki give
- Only one SHUT is destroyed per OPEN in a movement check.
- The interaction fails if the two are on different float levels, if both are SAFE, or if another obstructing object is on the door tile.
- **The edge of the level (added 2026-10-29, for Module 8).** No source read says in so many words that the edge blocks ordinary movement.
- The Rule page lists LEVEL IS STOP among the base rules, and the PULL page says "If LEVEL IS PULL, the overall level can be pulled at the border". Together they suggest the border is where the LEVEL object's base STOP applies. This is an inference.
- Esolangs says "If an object is to leave the bounds of the level, it is immediately destroyed", which concerns objects that do leave the bounds by other means.
- baba-is-auto refuses a move off the map ("// Check boundary" in `Game::CanMove`), but it is not an authority.
- **Several YOU objects in one move.** No source read gives the order in which several YOU objects move, or what happens when one YOU object pushes another that is also PUSH.
### g. FLOAT and hazards; what SINK destroys
- **FLOAT gates hazards.** HOT, MELT, SINK, DEFEAT, WIN, OPEN/SHUT, BOOM, WEAK, EAT and others "require that the interacting objects are both FLOAT or both not FLOAT" (FLOAT page).
- **FLOAT does not gate collision.** It does not affect STOP, PUSH, PULL or SWAP ("FLOAT does not allow bypassing STOP"). OPEN/SHUT is the exception.