Skip to content

Commit 5690fac

Browse files
committed
eggs: offsets keep the sprite set small, caps delimit the stack, and there is a blip editor
A DGRP entry places each sprite at its own offset, so one band drawing instanced at rising offsets is an entire stack. The parts list does not grow with the number of bands, only the entry list does, and because the egg looks the same from every angle the same entries serve all four rotations. So a heavy egg is simply a tall egg: add band entries, the body grows, the art is unchanged, and height becomes an honest advertisement of capacity readable in silhouette before a single colour is decoded. White cap on top, coloured blips between, black cap at the bottom. The polarity gives the reading order and the two caps give the extent, so a variable-length code needs no length field and no terminator — the message is whole when both caps are in frame. A blank blip is part of the alphabet rather than an absence of one: it aligns short codes, separates groups the way a resistor's tolerance gap does, and lets one silhouette carry payloads of different lengths. At the closest zoom a row can break into three or four arcs, with the leading arc carrying the row's coarse value and drawn to dominate when the row collapses, so segments refine a value they never contradict. And a blip editor, because anything with an alphabet needs a tool that shows you the alphabet. Lay out the stack from the same registry the compile uses, preview all three zooms plus the far silhouette at once since every interesting failure is a failure at one distance, run the recognizer on the preview so an egg that cannot be read is wrong while you are still looking at it, and abuse the preview with night lighting, fire tint, colour-blind filters and hand-held blur. Output is the YAML the compile already eats, and every saved egg leaves its decode case behind as a test. Players get the same editor. An egg is a stack of coloured rings, anyone who can pick colours can mint one, and minting writes an .iff they can hand to a friend — the low floor arriving in the tooling rather than being claimed in a document.
1 parent 9d29c0f commit 5690fac

2 files changed

Lines changed: 21 additions & 0 deletions

File tree

‎apps/screen-angel/EGGS.yml‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,24 @@ visual_design:
112112
the_payoff: "Combinatorial appearance without combinatorial art. A hundred distinct eggs are a hundred DGRP selections over the same dozen sprites, not a hundred drawings."
113113
palettes: "Band color comes from PALT selection where the game allows it, which moves color out of the pixels and into data — the same reason the original content pipeline did it that way."
114114
state_changes: "Kind, state and 'has news' are ordinary object graphic-state changes. The game already switches an object's appearance when its state changes; an egg is just an object that does it meaningfully."
115+
offsets_are_what_make_the_set_small: "A DGRP entry places each sprite at its own offset, so ONE band drawing instanced at rising offsets is an entire stack. The parts list does not grow with the number of bands, only the entry list does — and since the egg looks the same from every angle, the same entries serve all four rotations."
116+
telescoping_eggs: "A heavy egg is a tall egg. Need more payload, add more band entries and the body grows; the sprite set is unchanged. Height becomes an honest advertisement of capacity, readable in silhouette before a single colour is decoded — a big egg is carrying something big."
117+
the_stack_is_self_delimiting: "White cap on top, coloured blips between, black cap at the bottom. The polarity gives the reading order and the two caps give the extent, so a variable-length code needs no length field and no terminator — you have found the whole message when you have found both caps."
118+
the_zero_blip: "An empty slot is a legal symbol. Blank blips give alignment when a code is shorter than the space it sits in, separate groups the way a resistor's tolerance gap does, and let a fixed-height egg carry a variable payload without changing its silhouette."
119+
segmented_rings: "At the closest zoom a ring can be broken into three or four arcs, multiplying what one row of the stack holds. Coarse reads are unaffected because the leading arc carries the row's coarse value and is drawn wide enough to dominate when the row collapses to a couple of pixels — the segments refine a value they never contradict (OPTICAL-CHANNEL.yml, band_codes)."
120+
121+
the_blip_editor:
122+
why_it_exists: "Anything with an alphabet needs a tool that shows you the alphabet. Hand-editing offset tables to see whether a code reads at medium zoom is exactly the kind of work that stops people from making eggs at all."
123+
what_it_does:
124+
lay_out_the_stack: "Pick blips, order them, set groups, drop in zeros, split a ring into arcs. The palette and the legal symbol set come from the same registry the compile uses, so an illegal egg cannot be drawn."
125+
preview_every_zoom_at_once: "The three zooms side by side, plus a simulated far-out silhouette, because the interesting failures are all failures at ONE distance."
126+
round_trip_immediately: "The recognizer runs on the preview and prints what it read. If the editor cannot decode its own picture, the egg is wrong while you are still looking at it."
127+
abuse_the_preview: "Night lighting, fire tint, weather, a colour-blind filter, a JPEG pass, and a hand-held-phone blur. The lighting states that will break a palette are enumerable, so enumerate them here rather than discovering them in a stream (MOBILE-CAMERA.yml)."
128+
emit_the_source: "Output is the same YAML the compile consumes — bands, offsets, palettes, states, and the symbol registry entries. No exported binary, nothing to keep in sync (compiled_from_one_source)."
129+
generate_the_tests: "Every egg the editor saves adds its own decode case to the conformance suite. The tests are a by-product of authoring rather than a separate chore."
130+
who_it_is_for:
131+
us: "Faster than reasoning about offset tables, and it is the only honest way to check legibility claims."
132+
players: "The floor is low on purpose. An egg is a stack of coloured rings — anyone who can pick colours can mint one, and minting writes an .iff they can hand to a friend (the_egg_is_its_own_file). The fidelity of the art is what decides whether that sentence is true, which is the whole masking argument arriving in the tooling (moollm skills/design-sense/lenses/masking.md)."
115133
zoom_is_the_resolution_dial:
116134
the_shape: "Zoomed all the way out the egg says one thing — I am an egg, over here — plus the first band or two. Zoom in and more bands appear. All the way in is the full-resolution egg with the whole stack. Detail on demand, where the demand is the camera."
117135
big_endian:

‎apps/screen-angel/OPTICAL-CHANNEL.yml‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,9 @@ band_codes:
266266
frame: "Fixed sentinel bands top and bottom, like the guard bars on a barcode. They mark where the code starts, which way is up, and how tall a band is at this zoom."
267267
payload: "Version, type, then value bands. Four value bands over ten colors is ten thousand distinct messages; six over twelve is about twenty-one bits, which is plenty for a type plus an id plus a magnitude."
268268
order_is_big_endian: "Most significant band first, so the code degrades by truncation rather than by corruption. Kind, version, identity, magnitude, fine parameters — in that order, always (EGGS.yml, zoom_is_the_resolution_dial)."
269+
the_zero_symbol: "A blank blip is part of the alphabet, not an absence of one. It aligns short codes, separates groups, and lets one egg silhouette carry payloads of different lengths."
270+
length_needs_no_field: "The caps delimit the stack and their polarity orders it — white end first, black end last. A code is complete when both caps are in frame, which is why a telescoping egg carrying more bands needs no change to the format (EGGS.yml, the_stack_is_self_delimiting)."
271+
segments_refine_rows: "At the closest zoom a row may be split into three or four arcs. The leading arc is the row's coarse value and is drawn to dominate when the row collapses, so a segmented row is a legal read at every zoom and a richer one up close. Refinement never contradicts the prefix."
269272
check_digit: "One band is a mod-10 check over the others. Cheap to compute, cheap to verify, and it turns the whole failure class of 'misread one color' into a discarded read instead of a wrong action. One per disclosure group, not one at the end, so that every legal partial read is checkable."
270273
the_calibration_band:
271274
the_problem: "Games light their sprites. Night, indoor lamps, room tinting, and disaster effects all shift hue and brightness, so a band's rendered color is not the color the artist authored."

0 commit comments

Comments
 (0)