Entry 156
"The streams' effect nodes: str0001's clouds"
Documented in Dungeon generation.
Filescrates/piney-stream/src/scene.rscrates/piney-stream/src/lib.rscrates/piney-stream/tests/stream.rscrates/piney-stream/tests/stream_fixture.txttools/test_stream_rs.pydocs/engine/stream.mddocs/engine/animation.md
A GAPS item: the streams' effect objects. The port's scene kept an effect node only for its place in the draw list's layer order, and drew nothing for it.
What there is
A survey of every stream file found Eff nodes in four streams and Particle nodes in none:
- str0001 (stream 2, "Epitaph of the Twilight"): 181 nodes
EFF_srzsmo00toEFF_srzsmo180, allEFF_srzsmo1ofstr0001e, each with an F_Obj record every one of its 2,041 frames. They are the clouds the relic stands among. Without them the relic stood on a bare dark floor. - str0580: 15 smoke nodes. Their records keep them at the origin, so they never start (stream.md already noted they draw nothing).
- str0570 and str9104: one Eff node each, with no records.
The game's code
ccEffObj::Init,StartAnm,EndAnm,AnimateandDrawNoAnm, andDecodeF_Obj's effect branch (stream.md, "Effect nodes").- A node's "part" bit comes from its Obj2 flags.
Decode_Effcopies them into the Eff chunk's +0x10. - With the part bit, a stopped node restarts wherever a record puts it off the origin. The clouds loop that way.
- A record also sets the Eff's scale, turn and transparency, and a translation-only matrix.
The port
piney_stream::scene::EffNodeholds each node's state: its parent, its Eff chunk andpatNum, the part bit, and what the records set.Scene::newbuilds them in the ended state.f_obj_effis the record's branch.Scene::resetends them, asResetScenedoes.Scene::eff_worldgivesDrawNoAnm'slwMatrix.Stream::draw_effect_nodesdraws each running node through piney-effect'sEff. The template for each chunk is read into the effects' assets once. This happens when the player gives the stream its effects, which piney-game always does.
Checks
- The fixture.
tools/test_stream_rs.py fixturenow letsDrawNoAnmrun in eemu and records eachccEff::Draw(pattern): the pattern, the placeDrawNoAnmset, the scale, the turn and the transparency, as a hash of the sorted records a step. Stream 2's run grew from 60 to 200 steps so that nodes stop and restart. That is up to 181 draws a step, and the port's nodes match on every step. - Nothing else moved. No other scene of the fixture draws an effect, and its other lines are unchanged.
- Pictures.
stream_shot --stream 2 --frame 900with--fxshows the white cloud sea under the relic. Without it, the bare floor.
Still unknown
the clouds were not compared with the game's own picture. The effect nodes of ccAnm clumps in other files (effects.md) are still not drawn; no such file was found to have one.