Guided Path Animation Emitter
Turns what happens on a guide path into animation events, and does nothing at all when nobody is watching.
Every method begins by asking the model whether an animation sink is active and returns immediately when it is not, which is the same guard Conveyor.emitConveyorDefined uses. The check is a field read on a path that already exists, so a model run without animation pays for the emitter only that.
The three events between them are enough to draw the whole thing. The guide path is emitted once per replication and carries its own coordinates, so unlike a conveyor it needs no authored layout -- a link is a line between the two intersections it names and a transporter on zone k of n sits that fraction along it. Movement is sampled on entering a zone, never continuously. State changes carry the rest.
Sampling on entry is what makes congestion visible for free. A blocked transporter emits nothing and so stays exactly where the renderer last drew it, which is exactly where it is; there is no "stopped" event to get wrong, and no risk of a transporter drifting on a canvas while its zone claim is refused. The state stream then says why it is standing still, which matters because a cart parked with nothing to do and a cart stopped by traffic look identical and mean opposite things about the design.
Parameters
the runtime whose guide path and fleet are being animated