Skip to content

MOV is where the two engines diverge most, and the page should lead with that - #282

Merged
dhobi merged 1 commit into
masterfrom
docs/mov-v1-is-the-big-divergence
Aug 23, 2026
Merged

MOV is where the two engines diverge most, and the page should lead with that#282
dhobi merged 1 commit into
masterfrom
docs/mov-v1-is-the-big-divergence

Conversation

@dhobi

@dhobi dhobi commented Aug 23, 2026

Copy link
Copy Markdown
Owner

You asked whether v1 and v4 MOV differ more than the docs let on. Checked it, and the answer is in two parts.

The page itself was right

mov.md's DreamFactory 1 section is the most thorough v1 account in the doc set — seven differences, each with the DF.EXE read behind it. That is why the alignment pass in #279 never touched it, unlike SET and audio, which needed their v1 sections written from scratch.

I verified it rather than assuming. Every claim checks out against mov-v1.ts, including the two gaps it honestly admits to: +0x06 is not wait flags and the movie loop never reads it, and +0x00 is the hotspot count while the reader walks past it instead (disagreeing on 422 of 525 frames, always by finding more).

The census figures are better than accurate — they are guarded. dust/tests/movies.ts pins 152 frames of 6717, 69 segments of 185, 50 films of 160 against the disc, so that paragraph cannot drift without a red test.

The framing was wrong, and it was mine

Dust's movies are the same machine ... with everything v4 factors into per-frame logic containers kept inline

That reads as a packaging difference, and the one-line summaries I wrote in architecture.md and Dust's index repeated it. It is not a packaging difference.

The model survives — chain of segments, frame state machine, hotspots, chained films. Almost every mechanic under it differs, and more of it is behaviour than layout:

v4 v1
advance implicit an authored action 2, target goto; a loop is a backward target
timing frame rate a frame can block until the sound it started finishesmax(hold, what's left)
hotspots a region table typed, variable-stride records walked from a per-frame offset, first hit wins
chains type-3 exit posts a name and there is no return
exiting ESC clears the next-segment pointer any mid-film exit drops the rest of the chain
blit indices 0 and 255 keyed out through a monochrome mask
action frames names 1-based positions

Of the formats the two engines share, this is the one that diverges most — and all three places now say that first. Dust's "what is different, in one paragraph" left films out entirely, which was the same mistake where a reader meets it earliest.

One rule was genuinely missing

The segment teardown follows the next-segment pointer only when playback stopped on the last frame (0x404b9c), so a mid-film exit drops the rest of the chain — v4 reaches the same place by the narrower route of ESC clearing the pointer. Behaviour rather than layout, and exactly the kind a port gets wrong by inventing a return, which mov-v1.ts records having done once already (the wardrobe closing between the diary and the page-reading flat).

Scope

Docs only, no code. VitePress build clean, every anchor and link resolving.

🤖 Generated with Claude Code

…ith that

Asked whether v1 and v4 MOV differ more than the docs let on. Checked, and the
answer is in two parts.

**The page itself was right.** `mov.md`'s DreamFactory 1 section is the most
thorough v1 account in the whole doc set — seven differences, each with the
`DF.EXE` read behind it — which is why the alignment pass never touched it. Every
claim in it checks out against `mov-v1.ts`, including the two gaps it admits to
(`+0x06` is not wait flags and the loop never reads it; `+0x00` is the hotspot
count and the reader walks past it instead). The census figures are better than
accurate — `dust/tests/movies.ts` pins 152 frames of 6717, 69 segments of 185,
50 films of 160 against the disc, so that paragraph cannot drift without going
red.

**The framing was wrong, and it was mine.** "The same machine ... with
everything v4 factors into per-frame logic containers kept inline" reads as a
packaging difference, and so did the one-line summaries I wrote for it in
`architecture.md` and Dust's index. It is not a packaging difference. The MODEL
survives — a chain of segments, a frame state machine, hotspots, chains — and
almost every mechanic under it differs, more of it behaviour than layout:
advance is an authored goto where v4's is implicit, a frame can block until the
sound it started has finished, hotspots are typed variable-stride records rather
than a region table, and two palette indices are keyed out of the blit. Of the
formats the two engines share, this is the one that diverges most, and all three
places now say so first.

Dust's "what is different, in one paragraph" left films out entirely, which was
the same mistake in the place a reader meets it earliest.

One rule was genuinely missing from the list: the segment teardown follows the
next-segment pointer only when playback stopped ON the last frame (0x404b9c), so
a mid-film exit drops the rest of the chain. v4 reaches the same place by the
narrower route of ESC clearing the pointer. Behaviour, not layout, and the kind
a port gets wrong by inventing a return.

No code changed. VitePress build clean, every anchor and link resolving.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@dhobi
dhobi merged commit 9bd4da0 into master Aug 23, 2026
2 checks passed
@dhobi
dhobi deleted the docs/mov-v1-is-the-big-divergence branch August 23, 2026 13:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant