Entry 85
The opening arc's cutscenes as the game presents them: subtitles, the music around the streams, and streams 5 and 10's effect tasks
Filescrates/piney-stream/src/subtitle.rscrates/piney-stream/src/event.rscrates/piney-stream/src/effect.rscrates/piney-stream/src/table.rscrates/piney-audio/src/stream.rscrates/piney-game/src/stream.rscrates/piney-game/src/desktop.rstools/test_stream_rs.pydocs/engine/stream.mddocs/engine/sound.md
52 ported the in-engine streams as picture and sound. The arc's cutscenes are:
- stream 3, Aura chased by Skeith;
- streams 4-6, Orca's fall;
- stream 7, BlackRose;
- streams 8-12, the church and the first Data Drain.
The game puts three more things around them, which an agent has now ported and checked:
- the subtitle window;
- the music before, during and after;
- the effect tasks of streams 5 and 10.
Subtitles
- Where they live. The event's
streamisccEventStream(num, 1)(0x001b5670). When a stream has a table inevStrMsgTbl(0x003112f0, or 0x00311510 in Parody Mode), it makes its own layer at 242 and a freshccMessage. It replaces the globalccMsgand leaves it pointing at the freed object afterwards. - What runs each frame.
ccGetStreamDemoMsggives the note's line (or -1 to close).Changeshows it when Movie Text (strWinMode) is on or the line has flag 0x800.Dispdraws the window. - What it does not do. It never reads the pad. At the end it leaves
without a last
Disp, so the window vanishes instead of fading. - When a line shows. The scene's task (24) handles the notes before the event task (32), so a line shows on its note's frame. A skip's close arrives one frame later (the stream's task is 33).
- The drawing. The window is the desktop's
ccMessageport.
The music around the streams
- The functions.
ccSndStreamCtrl(0x0017d190) sets the music before and after a stream, on the area's bank.ccSndStreamBGM(0x0017cb20) plays at event 4's notes, walkingstrSndTbl(0x0030b950) for streams 3, 8 and 58. - In the arc.
- Stream 3 stops the dungeon's music at frame 385 and restarts it fading in after.
- In the church (play type 3), stream 8's note at frame 366 stops sequence 1.
- Stream 12's end starts sequence 1.
- A mistake the sweep caught. Streams 112-119 fade to half and back, not out and then half.
Streams 5 and 10's effect tasks
- The shared part. Both keep
Func_str0001'sccStrEffectCtrl, which the port now shares aseffect::Ctrl, with a cue map per task. - Stream 10, the first drain (
Func_str0300): noise, one-frame white flashes, feedbacks at two scales, andccBufferReverce, which inverts the frame. - Stream 5, Skeith and Orca (
Func_str0120):- feedbacks that hold then fade;
- fades to and from white and black;
- the view's
divZset to 500; - eight hit marks at the cue objects. Cues 610-614 read two entries past
the three-entry
hitRot0120a, into jump-table words the EE's float unit takes as 0.
In the runtime
- On the desktop. piney-game plays the scripts' streams with subtitles
and music (
StreamPlayer::event). Throughstory:4, streams 4 and 5 show their subtitles on the desktop's setup screen at 30 frames a second. - In The World. The API for hosting streams there is at the top of piney-game's stream.rs.
Checked
Against the game in eemu:
-
Subtitles.
test_stream_rs.py subtitlesrunsccEventStreamover the scenes' notes. The Rust side plays each stream for real:- 19 runs: every stream with a table, Movie Text off, Parody Mode, and two skips mid-line;
- 5,729 changing steps, all matching.
-
Music.
test_stream_rs.py music: 1,399 scenarios, command for command. -
The effect tasks.
test_stream_rs.py effects, with every primitive andrandafter every pass:- stream 10: 1,257 passes;
- stream 5: 3,103 passes, including the marks and the
divZchange.
str0001's fixture regenerates byte for byte. -
Re-run in a clean worktree. The stream, desktop, demo and sound suites pass, with the workspace's tests, clippy, fmt and the docs check.
-
Shots. Stream 3's "What the...!", stream 5's noise and feedback, stream 7's BlackRose, stream 10's inversion, and streams 4 and 5 with subtitles on the desktop.
- Streams in The World (the town and field hosts) are not hosted yet. Streams 3 and 7-12 need that. - Not drawn. - Stream 5's eight hit marks:
effHitMarkStris accEffectthat piney-effect lacks. - The view's clip atdivZ, which is not modelled. - Not ported. The arc's other nine effect tasks (Func_str0090, 0110, 0130, 0150, 0240, 0250, 0301, 0305, 0350). - When the call sees the end. The exact frameccEventStream's loop sees the stream end is not pinned down. Every window has closed by then.