Back to Napplet Machines V8
SOURCE / PINNED RELEASE

Made of little things.

Napplet Machines V8

Release
b3f614e739f0…
Author-recorded commit
534f19acb4ba…
License
LICENSE
Author’s source reference
nostr://npub182jczunncwe0jn6frpqwq3e0qjws7yqqnc3auccqv9nte2dnd63scjm4rf/wss%3A%2F%2Fgit.napplet.soy%2F/n-b5572362d4a

Archive hash verified: 0f7feb97e2c3d336…. The source-to-build association is the author’s claim; it has not been independently rebuilt.

docs/game-design.md
# Pocket Circuit — build contract

Purpose: make, drive and race miniature 3D circuits with up to six players.

- Three-lap races, quick checkpoint respawns, four car setups, AI fills empty seats.
- Physics: fixed 60 Hz, front/rear tire slip forces with finite traction, a smoothed
  steering rack and yaw inertia. Space/touch handbrake releases rear grip for drifts;
  countersteer and release to recover. S/down provides service braking and reverse.
  Oriented chassis contacts use mass, contact position, bounded friction and yaw
  inertia; rear impacts push through the bumper rather than a circular proxy.
  Suspension follows road-relative vertical velocity; chassis pitch/roll follow the
  surface in the car's heading, including at rest and in reverse. Gravity, crest
  launches and quick recoveries remain. This is a lightweight driving simulation
  tuned for playful racing, not a full automotive simulator. Protocol v5 carries
  steering and handbrake state for deterministic prediction and reconciliation.
- Input: keyboard, native standard-mapped gamepads and two-thumb touch controls.
  Controller slots are claimed with a fresh bottom-face-button press; triggers are
  analog, the left stick / D-pad steers, east face drifts, north face recovers and
  Menu pauses local races. Shoulder buttons choose cars and D-pad up/down chooses a
  course in the garage. Disconnect clears input and pauses local racing; reconnect
  requires an explicit claim. No new NAP or hard capability requirement.
  Touch uses a spring-centred analog steering bar and a single sliding pedal pad:
  gas, service brake/reverse, or gas plus handbrake. Only these two controls occupy
  the bottom thumb zones; race actions, camera and HUD stay at the top. Pointer
  cancellation, resize, blur and pause clear inputs. Existing keyboard controls remain.
- Track model: versioned closed cubic Catmull–Rom spline (equivalent cubic Bézier
  segments), editable XY knots, Z elevation and width at each knot. Width blends
  smoothly between knots. Add-point mode places a knot at the clicked XY location,
  splitting the nearest section and inheriting its elevation, width and walls.
  Each point owns the following section's wall toggle and thickness (0.3–2 m).
  Walls straddle the road edge, have solid tops/end caps and matching collision
  boundaries. Select sections directly in the plan to edit their walls.
  Version 3 widens version 1/2 saved drafts by 30% exactly once, preserving
  their other point and wall settings. Point widths range from 5 to 20.8 m. Multiplayer
  uses a new game protocol identifier so incompatible track formats never mix.
  Drawing creates knots; sampling, collision and 3D mesh share the same geometry.
- Procedural low-poly cars, trees, rocks and track; no remote assets or engine loaders.
- NAPs: optional storage for drafts/settings; CVM for
  named Soy rooms; WebRTC for game messages. No relay escape hatches. No hard requires:
  local AI racing and editor work when multiplayer or storage is unavailable.
- Backend context is generated by soyli, never authored. Rooms use soy.rooms.v1.
- Authority: room creator; membership validated against CVM. Explicit peer allowlists,
  reopened on membership changes. No host migration; host departure ends the session.
- Networking: host star, 20 Hz snapshots, 30 Hz input batches carrying 60 Hz sequenced
  commands. Host processes each command once; guest replay/reconciliation; interpolated
  opponents. Bounded queues, stale packet rejection, no direct networking APIs.
- Track transfers are room control messages. Personal drafts use NAP-STORAGE. This
  iteration does not promise a public track catalogue or power-ups.
- Art direction: toy-box Grand Prix. Saturated coral, electric blue, lemon yellow,
  aqua and lime; dark ink outlines, checkerboard tabs, racing stripes and chunky
  sticker-like controls. Bungee display lettering and Nunito Sans UI are bundled
  with their OFL licenses. Garage/car details use the selected car's color; rooms
  use blue; workshop tools use yellow/aqua. Compact 13px tools; touch controls
  grow to 44px. No duplicate app name/masthead.
- Scenery: bright molded-plastic playset, colorful trees, flowers, rock clusters,
  course banners, a checkerboard start gantry and seeded trackside pit garages,
  grandstands and timing towers. Building footprints stay clear of every road section;
  identical track geometry generates the same scenery on every client. Each preset has its own art
  palette. Cars have contrasting racing liveries, wheel hubs and distinctive body
  details. HUD uses opaque readable race plates over the scene. Decorative scenery
  stays clear of the track and introduces no new collision or game rules. A layered
  island shoreline, offshore islets, waves, sailboats, faceted hills and richer ponds
  give the race a miniature landscape backdrop. Geometry is static and bounded.
- Tiers: compact stacks garage and scene; regular/wide have side tools; editing shows
  plan and live 3D together when wide. Minimum 280×240 because driving and spline
  manipulation need separated input targets. Below: concise resize notice; state lives.
- Theme: app-owned midnight violet (#282044) on html/body/root and surrounding
  interface, with warm cream text and the existing vivid racing accents.
  Host light/dark changes leave the UI and course palettes intact. Reduced motion disables interface
  entrance effects. Loading/errors inline; denied rooms and failed saves are retryable.

Verification: upstream guidance/type/build/conformance, deterministic physics/geometry
tests, soyli host check, independent-browser six-player latency scenario, editor/save
and touch scenarios, specified frame sizes and both themes. Internet/TURN and real
phone testing are reported separately from local browser evidence.

## Larger circuits and corner geometry

The workshop supports a 260 × 260 m control-point area (twice the previous span
on each axis), with plan framing and the island/camera derived from the circuit.
Existing drafts retain their coordinates, elevations and section settings. Seven authored
courses mix broad passing straights, technical esses, elevated/open sections and
an over/under crossing. Original courses also receive deliberate width and wall
variation. The toy-box art, two-thumb layout and app-owned theme policy are retained.

Tight inside turns close into a rounded, filled pocket instead of tapering the
road. The geometry removes local loops from the offset boundary and rounds the
join. Point widths are retained; only overlapping inner corners are joined.
The road mesh, thick wall boundary and exact triangle-based driving surface share
that result, including elevation. Distant branches and overpasses stay separate.
Curve sampling follows bend angle and segment length; spatial buckets bound road
and wall contact costs. Drafts use version 3; room protocol v5 separates clients
with older generated collision geometry. No new NAP domains, dependencies, network
paths or persistence keys are needed.

All seven presets have 30% wider roads, retaining their relative width variation.
Earlier saved drafts widen once on load, then save in version 3; current drafts
round-trip unchanged. The editor ceiling increases from 16 to 20.8 m, with 0.05 m
adjustments to accommodate migrated half-metre widths.