You are making one small place, drawn at 360 x 280 and enlarged with nearest-neighbour pixels. Surfaces use five close tones and a 4 x 4 ordered dither. The sun throws a hard shadow that darkens the ground's own colour. One or two people do one looping action. A tap toggles one state. There is no score, no audio, and no halo around a light.
The pixel kernel (skills/diorama-pixel/kit/pixel.js) is fixed. A change there shifts the three pixel scenes. Put new helpers in kit-src/finish.js, then run node scripts/sync-dither-kit.mjs from the repo root. Never set glow on a material: it forces a face up to a flat brightness and reads as a bloom. A lamp is a paper box. A beam is a thin box of hard pixels.
Write the scene as skills/diorama-dither/examples/<name>.js. One Pixel.scene({ ... }). means is one sentence, at most 140 characters. The scene file stays at or under 260 lines, and the built page at or under 70 KB (71680 bytes). node scripts/validate.mjs on the .js assembles that page and fails the size check when the page is over 71680 bytes. The comparison is <=, the same one the look uses. A pass prints the bytes left, for example 732 bytes left of 71680. An empty scene assembles to 64823 bytes, so 6857 bytes remain for the scene source. That remainder assumes the default title, Dither diorama. The kernel takes the rest. A longer title spends some of that, because the shell writes the title. Two plants built by hand, one animal and a tent already have nothing left once a comma or a colon keeps a space, and the shore rocks are what get cut. Written with the spacing of examples/forge.js, that page was 72351 bytes, 671 over 71680. node scripts/build.mjs examples/<name>.js prints the path and the byte count. What to cut first is in section 6 and in references/yard.md.
1. Decide the picture before the code
Write four lines, then stop and check them against the rules below:
- Ground. A yard or a shore that fills the frame. Name the zones (meadow, earth, rock, sand, water).
- Mass. The one structure, where its front faces, and what must stay visible in front of it (a door, a course of stone, a person).
- People. Who, in the open, facing the work. Standing height is
h × cos(elevation) × scalepixels. Two or three cloth colours. - Life. What loops, and the one thing a tap toggles. The loop is a function of
qthat matches at0and1.
If a person, a door or the front of the structure would sit behind a post, a wheel, a sail or a roof, move the person or the occluder now. The camera does not move.
2. Frame
width: 360, height: 280,fps: 12,duration: 8,still: 2,bayer: 4,shadow: 'hard',rim: true,wind: 8.- Camera
{ az: 45, el: 30, scale: 54 to 62 }.heightrecenters and does not zoom, and it is not the summit. The fit reserves the yard edge. Start near0.6times the tallest point and correct from the still. A band of white above the mass means it is still too high. Too low and the roof is cut. - Ground
rxabout3.4to4.2,rzabout2.6to3.2,wobble0.3to0.4,fade0.3to0.36. Userect: truefor a walled yard. The coloured ground should cover roughly a third to four fifths of the frame. A wide white margin means the yard is too small or the scale is too low. sun: Dither.sun(45, elevation, turn). Elevation36to58degrees.turnof14to20degrees spreads a rotor's shadow so the blades do not stack into one bar. Shadows fall to screen-right. Leave lit ground past the shadow, short of the right-hand wall.
3. Materials
Call Dither.mat(name) and put the result on materials. The names already carry the right texture:
| Surface | Name | Why |
|---|---|---|
| Grass yard | meadow |
Grass grain, plus a fringe of moss blades at the edge so the rim is not a hard oval |
| Path, forge floor | earth |
A zone, not a second slab |
| Courses of wall | stone or rock |
The texture cuts joints. A wall is Dither.wall, which adds a coping |
| Roof | tile |
Horizontal courses |
| Planks, posts, cart | timber, beam, cart |
Grain along the long axis. A narrow pier with that grain on X reads as a wall: use Dither.mat('timber', { grain: 'z' }) and a wide deck, about 2.2 by 0.1 by 1.1 |
| Sail, sack, paper screen | sail, sack, paper |
Cloth, flat, no dither extreme |
| Sea, pond | water, pond |
The texture already moves and sparks. A crest is a short box, not a soft band |
| Snow | snow |
Light blue-white ground, sand grain. Dither.report on #d5e6ee must pass |
| Lamp, ember, ray | lantern, ember, ray |
Solid faces. ray has dither 0. A second, darker dithered tone on alternate segments keeps a ray from reading as one bar |
Dither.report(hex) must come back with five tones, a max gap of 0.08 or less, a cool dark step and a warm light step. Do not hand-build a ramp unless a preset cannot say the hue.
4. Build from helpers
These live on Dither and do not run for a pixel scene:
wall(P, x, z, len, yaw, opt)stone run plus a wider coping.gate(P, x, z, yaw, opt)for the opening.opt.hdefaults to0.66. A yard is four runs and one gate, insiderxandrz.folk(P, x, z, { h, yaw, name, shirt, pants, sleeve, hat, on })a person the pointer can name. Standing pixels areh × cos(elevation) × scale. At elevation 30 and scale 58,h0.4 is about 20. A pitched pose measures a little shorter. The yards useh0.38 to 0.44 at scale 56 to 62. A figure of about 21 pixels reads as a splinter: the face, the sleeve and a case collapse into a few columns. At that camerah0.42is about 21 andh0.40is about 20. Keep a chief or a traveler ath0.48or above there, about 24 pixels, and under0.55, which outgrows the yard. A standing figure keeps the bind-pose sole about0.01 × hunder the origin.onis a deck or other mesh: that sole meets its top exactly and the figure is seated on it. A laterroot.position.yreplaces that. Shirt, pants and sleeve are three colours that sit far apart. A chief that still reads as cloth is shirt#8e2f2a, pants#1c2433, sleeve#cbb892. A traveler is shirt#2c4f78, pants#6b3a2a, sleeve#d7c4a2. AfterP.pose, set the arms so the forearms leave the torso: aworkorholdpose, elbows bent, hands out. A case in the hand is a fourth colour,sack, not the sleeve:Dither.afloat(P.box(0.11, 0.08, 0.13, 'sack', 0, -0.06, 0.05, handR), 'case', 'carried').folksetsroot.namefromname:, and that is enough for the read-out..name =in the source is only for check 8.hull(P, x, z, { h, y, amp, yaw, len, beam, mat, name })a timber box in the water.his the height,ythe centre,ampthe bob stored on the group. The default centre leaves the top just above the plane, so the water cuts the box. The tick setsposition.yfromamp. The mesh isgroup.hull.tree,bush,fringe,fence,lamp.lampis a post, a paper box and a cap. Passshade: 'lantern'or'paper'. Never a glow.- An awning is a thin roof box, about
1.78by0.05by1.08, seated on the front beam.awning: Dither.mat('sail', { stripe: .18, alt: '#a33b32' }).stripeis the band width along the grain. On a roof the default grainxruns the bands across X. Passgrain: 'z'to run them the other way.altis the other ramp: a hex, a ramp name, or an array of hexes. Short valance boxes hang from the front lip and sit on the roof. - A hung lantern is a cord and a box.
Dither.lampstands on the ground. The cord is at least0.04thick, about two pixels. A cord thinner than one voxel (P.px, about0.017at scale 60) misses the picture, or the gap to the beam fails support. The front beam, the cord and the lantern share localz0.42. At yaw about0.68that beam is the one toward the camera. Seat the cord on the beam and the lantern on the cord, with the faces touching. Anemberface on the camera side toggles with.visiblewhen it stays seated on the lantern. A core that travels isDither.afloat(core, 'ember', 'spark'). Seating that core and then moving it fails support:ember misses lantern by 0.091. The afloat core passes support. Neverglow.lookneeds the largest quarter-step over0.002of the frame. A step of0.0003or0.0011fails. One core of0.09by0.10by0.03stayed under that:u * 0.8measured0.0010, and a blink measured0.0005. A core twice that on each side,0.18by0.20by0.06, declared afloat and travelling out byu * 0.35, measured0.0022and passedmotion. - A pot is an 8-sided cylinder on the counter, a wider rim seated on the body, and a lid seated on the rim.
ironis the blue-grey#5c636c. Hide the lid when the pot is open. - Steam under a cover starts at the lip and travels out. Three
sailboxes, the largest about0.28by0.14by0.22,Dither.afloat(g, 'smoke', 'steam'), phasei / 3, placed from(q + phase) % 1. Carry them out byu * 0.35from localzabout0.56. Keep the centre atyof0.80or lower. Aty0.90the puffs cross the awning and the step stays at0.002or under, somotionfails. At0.80and at0.70it passes. Under the awning aty0.70that run measured0.0028. In the open,u * 0.20measured0.0018and failed, andu * 0.22measured0.00202and passed. A sway of0.03withu * 0.12up andu * 0.08out measured0.0007under the cloth. Addingu * 0.12of rise to the0.35run measured0.0017under the awning and failed, because the puff climbs back into the cloth.0.0003and0.0011fail. If the puffs are the only motion, use the outwardu * 0.35. Chimney smoke, above the roof, is the stack case inreferences/yard.md. The greysmokepreset disappears against timber. - Two wheels on this side need two axles. One axle hides its far wheel behind the box. Yaw the cart about
0.85, put an axle near each end, and seat each wheel withDither.seat(wheel, 'cart-wheel', 'ground', axle). The centreyis the radius, 10 sides,rotation.xofπ/2. The bed sits on an axle. The far pair does not stay hidden: on the mill cart, about 20 pixels of those wheels show past the box, up by the rail, on the 360 by 280 canvas.examples/windmill.jsbuilds it this way. folkZoomnames the two people the look crops intozoom-figure.pngandzoom-carter.png. The default is['miller', 'carter']. SetfolkZoom: ['cook', 'customer']to fill those files from other hot groups. A name the hover misses writes no file, including a person listed infolkZoomwho is hidden. Every hot group also getszoom-<name>.pngwhen the hover hits it.lookstill requirespointerandfigures, so a hidden hot person fails both.cap(P, tower, { y, r, over, h })an upright cone.yis the tower top,ris that top's radius,overis the overhang (about0.1),his the slope. A cylinder withrotation.xofπ/2is a lid seen from above. Do not use one for a roof.rotor(P, parent, { y, z, face, len, tilt })four equal sails on a shaft. Yaw the parent so local+Zpoints toward the camera (about0.74at azimuth 45).yandzare the hub on that front face.faceis back inside the cone, so the neck meets the cap.tilt(about0.3) isrotation.x: the shaft drops toward the camera. The cloth stays in front of the stone. Spinrotation.zonly. A cross drawn on the roof is the shaft left attilt0.sway(P, node, base, t, amp, phase)for plants.carry(q)for a lift that rests at both ends of the loop.seat(node, name, on, join)andafloat(node, name, reason). Every solid mesh declares one, or sits inside a group that does and actually meets it. See Support.
Check 8 of validate requires the text .name = in the scene source, comments stripped, for each hot group. parts.hot lists them. name: is enough for the read-out: folk sets root.name from it. name: does not satisfy check 8. One .name = in the file passes the search. A string that contains .name =, or a comparison a.name == 'b', matches too, without assigning a name. The hint says what to hover and names the tap target with the words tap the <name>.
Halt
A platform, a small steam locomotive, a wagon, a clock and a signal. Camera azimuth 45, elevation 30, height 0.78, scale 58. sun: Dither.sun(45, 38, 16). The platform group is (-1.25, 0, 0.28), yaw 0.68. The train group is (0.05, 0, 1.02), yaw 0.95. That scene passed support at one voxel 0.017, frames 2, 4, 6 and 8. The built page was 71567 bytes, 113 left. It fits only after the cuts in section 6. Full seating is in references/yard.md.
- Canopy. Deck
2.3by0.12by1.08, timber grainz, centrey0.06, on the ground. Four posts0.08by0.64by0.08at local(±0.92, 0.44, ±0.38), on the deck. Front beam1.96by0.07by0.08aty0.795,z0.38, on a front post. The back beam is the same size at the samey, atz-0.38, and it is seated on a back post. Tile roof2.12by0.05by1.02aty0.855, on the front beam. - Clock. The disk that reads at 360 by 280 has radius
0.08and depth0.04,paper, eight sides,rotation.xofπ/2. At this camera that face is about 8 pixels tall (0.16 × cos(30°) × 58). Radius0.08is the minimum. A smaller disk is a speck. Group at local(0.88, 0, -0.2), off the traveler. Seat that group on the deck, or on the surface that holds it. Without thaton, support fails. Face aty0.7,z0.05, seated on a post0.07by0.58by0.07. Minute hand0.02by0.09by0.02on a group atz0.072. Hour hand0.07by0.02by0.02on a group atz0.078. Both are iron, seated on the face, in front of the disk.minute.rotation.z = -q * TAU. The hour is that divided by 12. - Signal. Clear of the left wall. An arm inside the wall does not read. Group at local
(-0.35, 0, 0.78). Post0.08by0.86by0.08, centrey0.43. Blade0.05by0.10by0.48ofDither.mat('sail', { stripe: .14, alt: '#a33b32' }), on an arm group aty0.78,z0.04, the blade centred at localz0.2, seated on the post. Loweredrotation.x0.1. Raised-1.25whenc.activeis the chief's root. - Rail. Five sleepers
0.12by0.05by0.58aty0.025,xof-1.05,-0.4,0.25,0.85,1.35, each on the ground, parented to the train so they yaw with it. Two iron rails2.6by0.04by0.06aty0.07,z±0.2,x0.15, each seated on the last sleeper. - Locomotive. Wheels radius
0.15, thickness0.07, 10 sides,rotation.xofπ/2, centrey0.24,z±0.2. Axles atx-0.42and-0.08, each0.05by0.05by0.52, seated on the near wheel.Dither.seat(wheel, 'cart-wheel', rail, axle). Frame0.92by0.08by0.26aty0.29,x-0.22, on the axle. BoilerP.cyl(0.12, 0.12, 0.62, 'iron', …, 8),rotation.zofπ/2, centrey0.43, on the frame. Cab0.38by0.38by0.3at(0.1, 0.52, 0), on the frame, with a paper window0.12by0.10by0.04atz0.16. ChimneyP.cyl(0.06, 0.07, 0.28, 'coal', -0.48, 0.63, 0, train, 6), on the boiler. The base is a little wider than the top. There is no chimney cap. That cap was cut to fit the page. Connecting rod0.46by0.04by0.04aty0.32,z0.23, seated on the near wheel, on the camera side of it. A rod against the boiler disappears. Crank0.04by0.12by0.04at the pin,y0.29. Smoke is threesailboxes, largest0.26by0.13by0.20,Dither.afloat(g, 'smoke', 'smoke'), phasei / 3, base(-0.48, 0.88, 0), riseu * 0.78, outu * 0.18. That is the stack, not the awning recipe. - Wagon. A second pair of the same wheels at
x0.64and1.08, on the same rails. Bed0.98by0.08by0.28aty0.29,x0.88, on the axle. Coach0.90by0.42by0.34aty0.54, on the bed. Roof0.96by0.06by0.40aty0.78, on the coach. Link0.24by0.06by0.08between frame and bed. No door. The door was cut to fit the page. - People. Chief
h0.42and travelerh0.40on the deck are the sizes that seated, and they read as splinters. Use the taller band above.name:on each person is enough for the read-out..name =in the source, as onmaster.root, is only for check 8.
Oasis
Sand, a pond, two palms, a one-mast tent, a well and a camel. Camera azimuth 45, elevation 30, height 0.92, scale 58. Dither.sun(45, 38, 16). The sizes that passed support are in references/yard.md. Dither.tree is a leaf canopy and is not a palm.
- Palm. A 6-sided
beamtrunk with grain on Y, a crown seated on the trunk, and six leaves in two segments (rotation.z-0.48, then-0.42). Each segment is seated on the previous one. - Tent. Yaw near
-0.5so local+Xfaces the camera. Mast, ridge, and twosailflaps pivoted on the ridge atrotation.xnear±0.95, seated on the ridge and coming down to the sand. The end toward the camera stays open. - Camel. The mule, plus a hump, and a second neck segment seated on the first. Each of the four legs ends in a hoof seated on the ground and on the leg.
- Well. A stone cylinder, a rim, a bar, a rope at least
0.04thick (use0.05) seated on the bar, and a bucket seated on the rope. - Feet. A person or an animal next to the pond stays outside the water ellipse. The guide, the traveler and the four camel hooves in that scene do.
- Sparks. A window of about
0.18can miss every framelooksamples (qof0,0.25,0.5and0.75). Put the phase so one of those four falls inside the window. Phase0.795does that atq0.25andq0.75(u0.09). Or send chimney smoke with the sparks: riseu * 0.78, outu * 0.18.
Support
A piece either meets a surface or names why it does not. npm run support and the look both check the still and the frames at a quarter, a half, three quarters and the end of the loop, and exit 1 with the group's name. A mesh with no support fails as has no support. A mesh inside a seated group fails when the nearest mesh is more than one voxel away and the mesh's own bottom is above the ground. Sitting inside the group's box is not enough. A bottom within one voxel of the ground can pass, which is how a tuft or a crest stays. Two meshes that only meet each other still pass. An unnamed mesh is reported as its parent's name plus its child index.
Dither.seat(node, name)rests on the ground. The bottom face is within one voxel ofy = 0(P.px). Sitting slightly in the ground passes. Floating above it fails.folk,wall,gate,fence,lamp,tree,bushandfringealready do this.Dither.seat(node, name, otherNode)— the two solids meet within one voxel. A bed on an axle, a sail on the cap, a leg into the body, a screen on the floor, a shade on its post.- The fourth argument is a second solid. A wheel uses both:
Dither.seat(wheel, 'cart-wheel', 'ground', axle). If the wheel already fails the ground, the axle line is not repeated. Dither.seat(node, name, 'water')— the water plane cuts the body (hull, fish). The bottom stays undery = 0at the highest point of a bob.Dither.seat(node, name, 'surface')— foam whose bottom sits on the water, in a water zone.Dither.afloat(node, name, reason)is the only leave-the-ground. The reason is a non-empty string: a carried sack, a ray, a spark, smoke, an hour mark. A blank reason fails asfloats without a reason.
A figure whose body passes through a solid that is not the ground fails as stands inside. To stand on a plinth, raise the root to the top face and call Dither.seat(root, name, plinth) again.
A figure on the ground must not stand in a water zone. Feet are the figure's x and z. The kernel's place turns a missing or NaN coordinate into 0, so Dither.folk checks x and z before that call and the support check reads the requested pair. A non-finite foot fails as has no place to stand. It does not stand at the origin and pass. Feet go on meadow, earth, sand, snow, rock, a pier deck, or inside a boat. Never on open water. A wheel is a cylinder with rotation.x of π/2 and 10 sides, so a vertex sits at the bottom. Its centre y equals the radius, the axle passes through that hub, and the bed sits on the axle.
Checklist before the first render:
- Every solid mesh has
seatorafloat, or sits in a group that does and meets the nearest mesh. A child parked in the air still fails when that mesh is more than one voxel away, even inside the group's box. A bottom within one voxel of the ground can pass. - Wheels, legs and feet touch. The axle touches the box. Hooves and shoes touch a solid surface.
- A boat's hull is partly under the water. A bridge's piles stand on the banks. Posts reach the ground.
- Nothing floats unless
afloatnames the reason. The check covers a mesh with declared support, or a group that meets the nearest mesh. It does not cover a chain of loose pieces that only touch each other.
5. Motion and the tap
Pose from c.t and c.q only. A loop closes: Math.sin(q * TAU), a full turn q * TAU, or (q + phase) % 1. Do not add speed each frame.
c.active === root is the toggled state. The still frame starts with active clear, so the first state is the one you want at still. The second state must change the picture by more than a few pixels at still + 0.5 seconds: a hidden beam, a swapped screen, a forge mouth, a pose. A joint that moves a couple of pixels will not read and will fail the press check.
Reduced motion and ?still hold the clock. Do not start your own timer.
6. Check, then look
From skills/diorama-dither:
node scripts/validate.mjs examples/<name>.js. The size check assembles the page. A scene under 260 lines still fails when that page is over 71680 bytes. A pass prints the bytes left,732 bytes left of 71680. An empty scene leaves 6857 bytes for the source, assuming the default titleDither diorama. The kernel takes the rest. If the page cannot be built, validate prints one line,FAIL 7 size: page build failed: …, and exits 1. Check 8 requires the text.name =in the scene source. Aname:option onfolkdoes not count for that check.name:is enough for the read-out. A string ora.name == 'b'matches that search as well. When the page is over, cut decoration before the action. On the halt the order that came under the cap was the grass fringe, a steam dome and a buffer beam (the page was still 72955), then a box helper and the chimney cap (still 72559), then no space after a comma or a colon, materials from one'meadow earth …'.split(' '), and the wagon door (71565). Two handmade plants, an animal and a tent start in that tight spacing, and the shore rocks go before the action. Written with the spacing ofexamples/forge.js, that page was 72351 bytes, 671 over. A second copy of a building misses the frame budget as well as the byte cap. The helper, written tight, isfunction(w,h,d,m,x,y,z,p,n,o,j){return Dither.seat(P.box(w,h,d,m,x,y,z,p),n,o,j);}.npm run supportaudits every file inexamples/. One scene:node scripts/support.mjs examples/<name>.js. Then a liftedcart-wheel, a box aty = 4.5inside the mill, and a figure standing in the tower. Each must fail. The line isok negativeand the reason. It does not printFAILfor a miss that was required. Then the water cases. A host in the tea pond must fail. A figure in the lighthouse's open water must fail. A figure on the lighthouse rock must pass. A bad foot coordinate must fail.folk(NaN)andfolk(undefined)must fail. A mesh with no support must fail. A blank float reason must fail. The same run checks the snow report, the gate height, the cold family, a tall sand-post stain, the figure sole and the hull.node scripts/look.mjs examples/<name>.js <outdir>— the look runs the same support check on those frames.motionmust be over0.002of the frame. A step of0.0003or0.0011fails.shadowmust behard.softornonefails. A grass silhouette takes the strong cast check. A hard cast on earth, water, or a cold ground takes the sharp threshold.sharpreads the grass frame att0and keeps the longest dark run. A dark strip on the right edge can beat the real cast: on the halt that strip won withx1355until the sun wasDither.sun(45, 38, 16)and the strip was gone. The counted cast was thenn313,w11,x1148. On sand that sun does not do it alone. The sharp check does not ask for lit ground past the cast, so a run of width105that ends on the frame still passes: the first look gavex1354andbeyond0. On sand the counted run has to leavebeyondgreater than0, andx1at least 40 pixels in from the right edge. If the mass sits on the right, move the mass. A post on sand#d2c09aleaves a tall narrow earth stain, and that stain counts when it is at least 28 pixels tall and at least three times as tall as it is wide. The scene name does not choose it.zoom-figure.pngandzoom-carter.pngusefolkZoom, defaultmillerandcarter, and only when the hover hits that person. Each hot group also getszoom-<name>.png.- Open the still, one moving frame, the hover, the press, the mobile shot and the figure zooms. Look at the wheels, the feet and anything that should meet a neighbour.
The look checks fill, the loop seam, picking, hover, the tap, reduced motion, a hidden tab, off-screen pause, and a median frame at or under 83.3 ms, including CPU throttle 4. A pass is not a picture. Judge the still yourself: the action, the materials, the shadow, and whether the front of the structure is still readable.
node scripts/record.mjs examples/<name>.js <outdir> writes a silent loop.
node scripts/sync-dither-kit.mjs --check must pass after every helper change. Re-hash the three pixel scenes (pier, flower-stall, allotment) at their still frame if the pixel kernel was touched. If it was not, those hashes stay put because a pixel page never loads this finish.
Before the first render
Walk this list. Each line is a failure that already shipped once:
- A rotor drawn on the roof, or a flat disk wider than the tower. The cap is a cone with a small overhang and a visible slope. The shaft and the four sails sit on the front face, tilted down toward the camera, and a person stands on the ground at the door with the sack in the hand.
- A wheel, a hoof, a foot or a post with daylight under it. The axle meets the box. A person stands on ground, rock, a pier or in a boat, never on open water. A hull sits in the water, not on it. Anything else that leaves the ground has
afloatand a reason. - A sail, cart, bush, lamp or gate post crossing the person. With a step in the yard, feet go on meadow or earth, at least
1.2inside the near wall and0.4clear of a step or a slab. The coping covers anyone standing in the opening. - A shadow that is a flat grey bar, or that runs through the right-hand wall. Hard veil, one sun, lit ground beyond. Do not add a second light for a lamp, a ray or dusk. The sharp check measures grass at
t0and keeps the longest dark run. A dark strip on the right edge can be that run. UseDither.sun(45, 38, 16)and do not leave the strip. On sand that sun is not enough: a width of105atx1354andbeyond0still passes. Leavebeyondgreater than0and keepx1at least 40 pixels in from the edge. If the mass is on the right, move it. - A standing figure under about 16 pixels (
h × cos(elevation) × scale) merges, and one near 21 reads as a splinter. At elevation 30 and scale 58,h0.42is about 21. Keep a chief or a traveler ath0.48or above there, about 24, and under0.55. Shirt, pants and sleeve far apart. A case issack, not the sleeve.name:is enough for the read-out..name =in the source is only for check 8. - A yard that leaves a wide white band above the roof.
heightis not the summit: start near0.6times the tallest point and correct from the still. - A lamp or a beam with
glow, or one thick box that reads as a bar. A ray is several segments, thinner toward the tip, one of them a darker dithered tone. Paper and ember stay flat. - A tap whose only change is one joint. Hide or swap a mass the size of a door, a screen or a ray.
- A night that moves the sun or sets
glow. The light is fixed when the page is built. Evening is dark cloth, a striped awning,lanternpanels and a smallembercore you show and hide. The ground stays the day palette. A black sky and a pool of light are outside this finish. The tea house dusk swaps the paper, the lantern cores and one hard disk.
References
references/yard.md: sizes, the yard recipe, rotor numbers, the halt, the oasis, and the shadow and figure checks in one place.skills/diorama-pixel/references/scene-api.md: primitives, the tick context, the pointer. Read that forP.boxandP.pose. Do not copy its soft shadow or its 320 x 240 frame into a dither scene.