Repository navigation
Pin renderedstep/engine#98's head (064084f): let a floor fall in a game when its countdown runs out, and the player on it with it - #374
Merged
Conversation
…me when its countdown runs out, and the player on it with it
Stage 6 of the dungeon plan, server half ("The countdown and the collapse").
A floor that says `minutes:` gives way in a game that many story minutes
after that game first stood on it; a player on it then dies with it. The
collapse is the game's only: the world's rows are untouched (VISION.md
principle 7). The narrator is not told. A world without `minutes` plays as
before; no checked-in story world turns it on.
- Migration 20261031120000 AddMinutesToFloorsAndFellAtToPlaythroughFloors,
the engine's version and declaration. schema.rb moves to 2026_10_31_120000.
- Floor validates `minutes` as a positive integer or nil.
Playthrough::FloorReached#falls_at and #fallen?.
- Playthrough#fallen?(location) mirrors Game::fallen (the room's own floor
row or its parent's, the first by id). #cast_in returns nobody on a fallen
floor, so #foes_in follows; #exits leaves such rooms out, and
Classifier#exits_here now reads #exits, so Mechanics::State follows.
- Loader reads floor `minutes` (a positive integer only; absent writes nil);
the exporter writes it when set.
- The extension's glance_json, Playthrough::Glance (Floor, #floor,
#collapse, console lines) and Protocol::V1#glance carry `floor` and
`collapse`; docs/protocol/v1/openapi.json and v1.md add them as revision 1.7.
- The play page's end notice prints the collapse sentence on its own line
before the death statement, which is unchanged.
- Story::Doctor: floor_fallen_with_no_countdown (manual, never repaired).
- SqlitePackage already copies playthrough_floors column for column; its
test now pins fell_at.
- Sweep: world a-floor-that-falls, scripts waiting-out-a-floor and
a-floor-falls-behind-you, goldens vendored and checks files written.
calebl
added a commit
to renderedstep/engine
that referenced
this pull request
Oct 30, 2026
…ver 383a67d The game's pin PR (renderedstep/server#374) reads minutes:, so the dump is now the one its own loader writes from a schema load: minutes is written by the loader rather than by hand. The rows are the same; only timestamps, the schema digest and the order the dump lists them in moved. No golden or records file moves.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stage 6 of the dungeon plan, server half ("The countdown and the collapse").
A floor that says
minutes:gives way in a game that many story minutesafter that game first stood on it; a player on it then dies with it. The
collapse is the game's only: the world's rows are untouched (VISION.md
principle 7). The narrator is not told. A world without
minutesplays asbefore; no checked-in story world turns it on.
the engine's version and declaration. schema.rb moves to 2026_10_31_120000.
minutesas a positive integer or nil.Playthrough::FloorReached#falls_at and #fallen?.
row or its parent's, the first by id). #cast_in returns nobody on a fallen
floor, so #foes_in follows; #exits leaves such rooms out, and
Classifier#exits_here now reads #exits, so Mechanics::State follows.
minutes(a positive integer only; absent writes nil);the exporter writes it when set.
#collapse, console lines) and Protocol::V1#glance carry
floorandcollapse; docs/protocol/v1/openapi.json and v1.md add them as revision 1.7.before the death statement, which is unchanged.
test now pins fell_at.
a-floor-falls-behind-you, goldens vendored and checks files written.
Against the engine PR's list
renderedstep/engine#98 lists 11 items under "What the server pin PR must change". This PR covers all of them, with three differences:
Playthrough::FloorReached(tableplaythrough_floors), the name stage 5 gave it, notPlaythrough::Floor.Mechanics::Statereads exits throughPlaythrough::Classifier#exits_here. That method used to readLocation#exitsdirectly, so it now readsPlaythrough#exits.parity/worlds/a-floor-that-falls.sqlbelongs to the engine repo. I built it from this branch's loader as the engine's parity README says, in a scratch export of this commit. Its rows match the engine PR's hand-made dump exactly. The only differences are the position of theschema_migrationsrow andar_internal_metadata.schema_sha1, which come from loading the schema rather than migrating. The engine PR can keep its dump or take this one.Gates (both provider keys unset, no model calls)
bin/rails test: 5474 runs, 0 failures, 0 errors (includesrake game:sweep)bin/rails engine:rust_gates: PASSED, 112 scriptsbin/rails engine:vendored: VENDORED at 064084fbundle exec rubocop: no offenses.bin/rails zeitwerk:check: all good.bin/brakeman: no warnings.Once renderedstep/engine#98 merges, this moves to its merge commit.