island-simulator is a peaceful first-person tropical island walking and near-shore swimming
experience built in C++23 with CNA.
AMDGPU hardware qualification is suspended after a confirmed GPUVM fault and desktop-session loss. The cause is still unresolved; do not treat successful software captures as a hardware fix. See the incident report. New wildlife and visual work is currently checked with CPU tests and forced llvmpipe/pixman. After building, a repeatable software-only visual check is:
python3 tools/run_software_capture.py build jungleThis requires kernel-journal visibility. If group membership was granted without a new login,
use sg systemd-journal -c 'python3 tools/run_software_capture.py build jungle'.
The command preserves its image, logs and kernel delta under build/software-captures/, forces
at most eight llvmpipe workers, hides host GPU device nodes, and never clears the separate
hardware qualification failure latch.
The project remains under an active long-form development and polish campaign. The current
rendering policy requests 4x geometric-edge antialiasing on Linux/Web and 2x on Android through
CNA's existing backbuffer path, with explicit applied-sample diagnostics and device fallback.
See antialiasing evidence and cost; software results do not qualify
hardware performance or resolve the GPU incident. The current
playable slice renders a deterministic approximately 500 m island with
portable procedural
sand, wet-edge, soil, and slope material variation, including distance-faded interior substrate
microvariation, broad leaf-humus and cool-moss floor breakup, close analytic soil relief and
smooth pores faded by both distance and pixel footprint, sparse curved leaf litter, close
dry-sand granulation, soft-edged pebble/shell
flecks, subtle shoreline-raked ripples, restrained fixed-sun jungle-floor dappling, and a narrow
noise-mottled, broken-edge
earthen footpath that follows the same authored corridor reserved by vegetation. Two
authored clearings use distinct sunlit-dry and leaf-rich ground treatments with broad irregular
patch breakup derived from terrain noise that was already evaluated. Close jungle soil now adds
one project-owned floor image with a 512-square mip chain and edge-safe rotated source windows,
preserving the authored paths and clearing palettes. It is packaged on all targets; missing data
logs a diagnostic and retains procedural soil. See material review
for provenance, software-only runtime evidence and remaining visual limitations.
Live jungle leaves now use a small mipmapped image to vary vein and tissue colour,
preserving species tint and existing lighting; see leaf material evidence.
An animated tropical
ocean adds distance-faded crossing-wave colour structure, restrained shallow-ridge light and
sunward ripple crests plus view-aligned grazing reflection bands from its existing slope field,
with a shared nine-wave spectrum, gently irregular short-wave normals and per-wave pixel-footprint
filtering. Grazing sky reflections become less transparent than downward views into the lagoon.
Fine waves now vary in strength across slowly moving wind patches, with a wider spread of short
directions and analytically consistent normals; broad water displacement is unchanged.
Supplementary grazing contrast is bounded, and broad breaker foam is limited by shallow depth
and shore distance rather than appearing across deeper water. Fine wave repetition still needs polish.
The sea floor uses continuous sand colours across the waterline, with filtered shallow sand ripples;
water tint and opacity increase with local depth instead of baking turquoise into the substrate.
An exact shore-following foam/wash ribbon uses advancing, fading crests and
pixel-footprint-filtered porous foam instead of a continuous white stripe. The landscape contains
370 procedural coconut palms in coastal groves, 277 broadleaf canopy trees (22 emergents in closed stands), 1,822 ferns/large-leaf plants, 579 low
bushes, 3,116 small forest-floor plants, and 20,499 mesh-grass clusters placed from a shared canopy-light and ground-cover field. It also composes 157
irregular land rocks, 14 emergent near-shore reef outcrops, 13 mossy fallen logs with irregular
near broken-end contours,
31 pieces of sun-bleached beach driftwood, 63 curved fallen palm fronds with asymmetric leaflets,
and 265 near-field
shell/pebble/dry-wrack clusters. Three varied driftwood silhouettes form a non-solid landmark arc
in one sheltered cove;
five rocks and two fallen logs form natural orientation landmarks around the outer rings of the
two authored clearings without blocking their central walking room. Every dense near-island
visual layer has spatial culling and appropriate distance
reduction, while vegetation uses a calm breeze. Five unreachable, haze-softened low islets and 11
simplified palm silhouettes break up the open-ocean horizon in one intentionally always-present
portable static batch.
One beach shallows now contains a large original wooden sailing-ship wreck rather than a small
boat. Its exact 20 m hull is grounded and heeled in the water with a central break, exposed ribs,
partial deck, cabin, snapped mast, bowsprit, and rigging. Twelve planks and substantial fragments
form a separate trail toward the sand. Six conservative hull proxies keep the player out of the
major structure while the smaller debris remains non-solid and traversal-friendly. The complete
3,948-triangle landmark uses a finer curved hull section, localized missing planks, a split broken
keel and rudder, broken deck rails, dark hull openings, and a splintered foremast stump. The debris
trail varies its angle strongly in both directions instead of repeating the ship axis. One portable
GLSL 330 / GLSL ES 300 material adds distance-faded
longitudinal grain, weathering, restrained cracks, wet/submerged darkening, salt wear, and a small
waterline sheen. It remains frustum/distance culled and is submitted as one batch before the
transparent ocean colours its submerged portions; it introduces no quest, pickup, or objective.
Nearby mesh grass bends away from the player: a small stationary body radius expands smoothly with
walking speed and releases after movement stops, entirely inside the existing instanced shader.
The 42-blade near mesh uses five curvature levels per blade, geometric V-folds, and portable
two-sided daylight/root/transmission shading. Shared surface normals follow rest-shape curvature
and instance scale; wind/player motion still uses approximate normal response. Pigment now stays
separate from fixed side lighting, with restrained filtered longitudinal grain; see
grass surface material and evidence. Its close blades are deliberately narrower than the
middle tier, use small deterministic left/right edge asymmetry, and occasionally bend and droop at
the tip instead of repeating broad symmetric ribbons. Their upper width now tapers progressively,
and seed stems attach to the actual curved terminal centre/ridge. A sparse juvenile underlayer, six restrained
seed-bearing stems in the near cluster, and deterministic per-instance blade stature, colour, and
wind variation
keep neighbouring tufts from repeating the shared mesh literally; the cheaper far mesh uses three
levels and still merges into the terrain before culling.
The 42 near blades form seven unequal loose tufts, with outward-facing leaves, short peripheral
blades and related wind phases. This reuses the existing geometry and draw budget.
Nearby palm crowns use nine paired, fuller tapered-leaflet stations on each of 10--12 curved fronds
instead of solid ribbon silhouettes. A cheaper widened ribbon preserves the crown envelope at
distance,
while per-palm 125--145 m thresholds stagger the transition and avoid switching whole cells at once.
The near tier also adds texture-free leaf-scar rings to the trunks and restrained faceted coconut
clusters to two of the four variants without another draw submission. Five irregular faceted root
wedges vary in angle, length, width, and height around each near trunk instead of ending it in a
flat cylinder or a regular stamped star. The palm shader also derives a restrained green-only
frond tint from each existing instance transform, so neighbouring crowns no longer share one
literal green while trunks, roots, coconuts, near/far identity, buffers, and draw count remain
unchanged. Two selected near variants also carry two or three irregular hanging dry-frond
remnants beneath the living crown. Their broken ochre-brown leaflets add sparse age variation
without turning every palm into a uniform dead skirt; the far silhouettes and submission count
remain unchanged.
Nearby broadleaf crowns use small irregular inner foliage masses, visible tapered support
branches, and layered shells of 584 curved canopy blades per tree. Golden-angle sprigs, unequal leaf
sizes and height-dependent tints break up smooth silhouettes without alpha blending or another
draw pass. Eight shared crown forms vary branch architecture as well as leaf posture. The near
meshes have 4,328–4,378 triangles; the 1,064-triangle far tier retains 104 original blades and
primary branches. The foliage is still procedurally stylized rather than photorealistic.
Terrain, grass and jungle ground layers share approximate fixed-sun shade baked from the placed broadleaf crowns,
replacing unrelated noise-based sun patches. The static 4 MiB field preserves ambient skylight;
it is not leaf-exact shadow mapping. Boars sample the same light per body vertex, retaining a
1 MiB CPU field without another GPU texture or draw. Monkeys reuse it through a smoothed body
sample and the existing skinned material, including reduced direct specular light in shade.
Other wildlife and palms are not yet integrated. Understory,
bushes and small plants project their elevated leaves along the same sun direction, retaining
ambient light beneath crowns instead of remaining uniformly bright against shaded soil.
The same near meshes give trunks a restrained secondary growth bend and slight ring/azimuth girth
variation, while each support branch tapers through a deterministic off-axis middle joint instead
of reading as one straight cylinder. Near/far crown anchors agree and collision proxies remain
unchanged; the expanded form set adds shared meshes and variant batches.
Two of the eight near variants also carry one sparse hanging liana
with a curved tapered strand and two small leaves, adding vertical jungle detail without another
instance or draw. Their near trunks now meet the forest floor through four or five
short irregular buttress roots instead of a uniform cylinder, using the same instanced mesh and
draw submissions. Close bark gains restrained procedural longitudinal grain and narrow fissures
that fade before the far tier, without a texture or new pass. A deterministic per-tree 105--129 m
threshold staggers their
transition to the far mesh instead of switching complete scene cells at once.
The shared portable jungle shader uses smooth normals on curved and pointed leaves, with
subtle footprint-filtered veins and a restrained waxy sun reflection nearby. Fine material detail
fades between 16 and 38 m; bark and other geometry retain their geometric two-sided lighting.
Leaf coordinates and normals share the existing vertex buffer; no texture or draw was added.
Its vertex stage also recombines each existing instance transform's scale/yaw coefficients into a
stable restrained foliage tint. The green-only mask leaves bark unchanged, and the shared transform
keeps the same tint identity across near/far LOD without another attribute, texture, or draw.
Low bushes use supported shoots and individual curved leaves. Both detail tiers retain
the complete leaf outlines; far removes inner rib vertices without extra draw submissions.
Two medium understory forms now use pinnate fern fronds, with tapered paired leaflets aligned
to a curved rachis and attached through shared wind vertices. Far meshes retain original leaflet
identities. This adds geometry but no material, texture or draw; mobile cost and moving LOD
quality remain unqualified. Two other forms use broad paddle/lance profiles with mildly
asymmetric margins and cupped surfaces, reusing the same mesh budget.
One near forest-floor variant forms six upright broad leaves on visible petioles, while another
uses five low folded split leaves instead of repeating the strap-leaf rosette. Their
far representations retain reduced original leaf subsets with unchanged batching. Understory, bush, and forest-floor
LOD and maximum-distance selection use actual instance positions after a conservative cell reject,
so first-person detail no longer changes early at a coarse cell boundary.
Land and reef rocks use shared smooth normals, scale/yaw-correct fixed-sun lighting and refined
near silhouettes. Texture-free mineral mottling, filtered fine grain and restrained lichen replace
the former triangle-facet lighting and repetitive strata. Fine detail fades before the far LOD;
broad colour and daylight remain consistent. A fixed mean-sea-level band darkens their wet bases.
This uses one additional normal attribute in the existing instanced pass, not another draw or
texture. A restrained warm/cool tint derived from each
existing instance transform varies neutral stone tones while preserving one identity across the
near/far LOD and leaving wood and foliage colours unchanged.
Nearby fallen logs use the same portable material path for gently irregular cut-end growth rings,
restrained radial drying cracks, and longitudinal bark fissures. Both rock and wood detail fade
out before their LOD transition.
Wood surface normals now follow each instance's rotation and nonuniform scale, with outward-lit
cut ends and separate hard rims. Far wood keeps the same daylight response without close detail.
Sun-bleached driftwood adds a still softer near-only longitudinal weathering treatment. Its third
near variant replaces a simple spike with three curved tapered fork limbs, while cut ends and all
far meshes stay calm and inexpensive. Rocks, fallen logs, and driftwood select range and LOD from
each instance after a conservative cell-bounds rejection rather than switching an entire cell.
Nearby palms, canopy trees, land rocks, fallen wood, driftwood, monkeys, and boars receive subtle
terrain-conforming contact shadows. The twelve-segment soft ellipses use one portable
BasicEffect batch, fade before their bounded draw distances, and cache static terrain sampling
plus movement-thresholded uploads so this grounding cue does not become a per-frame procedural
terrain cost.
Land-rock and wood ellipses are split at rendered terrain triangles to avoid coarse-surface
mismatches. Fallen-log and driftwood model heading now matches placement/support and collision
heading; terrain layout and walking routes are unchanged.
Reef outcrops, the two broken hull sections and twelve wreck fragments now also receive soft
grounding patches. These are clipped to the actual seabed/terrain triangles, drawn beneath the
water in the existing batch, and preserve the gap between the hull halves. They remain contact
approximations, not full mast/rigging or directional shadow silhouettes.
It supports
first-person terrain walking, near-shore swimming, trunk collision, and a soft ocean-current
boundary whose always-shoreward return includes mild coherent coast-parallel circulation,
dual-zone touch input, a subtle depth-responsive near-surface water veil with upper-surface light
scatter that cools and strengthens as the offshore current develops, and speed/depth-responsive
player ripples that expand across the
same animated ocean surface without another draw call. Moving entries and exits also trigger one
short speed-scaled pair of broken surface rings, with depth hysteresis and a cooldown that prevent
shoreline chatter. A fixed sunny gradient sky adds a sun disc
and sparse, layered horizontal high-cloud wisps without a weather simulation. A first
flock of 24 procedural birds follows varied shore, canopy, and high-altitude routes with animated
wing strokes, layered trailing flight feathers on the near silhouette, intermittent glides, banked
turns, slow radial route drift, terrain clearance, visibility culling, and distance-throttled
simulation. Six non-hostile wild boars now forage, rest, wander, and retreat from nearby players
in bounded inland habitats, with solid-prop avoidance, adult/juvenile procedural models,
continuous body/head profiles, folded ears, near nostrils and bent tusks, smooth fixed-sun shading
and terrain-following contact shadows. An original 128x128 opaque directional coat atlas adds
fine body strands through stock BasicEffect; a padded white region leaves eyes, tusks and hooves
unpatterned. The three coat tints and juvenile markings remain shared with the mesh colors.
Legs use connected tapered segments and split near hooves, with a grounded stance and lifted
return phase; short swept bristles follow the same body profile. This is still approximate
procedural animation: individual soles fit the rendered terrain with fixed-length limbs,
but world-space foot locking and stride-speed synchronization remain unfinished.
Use --viewpoint boars for their dedicated inspection camera. This original asset still needs
visual refinement; its current runtime validation covers native llvmpipe and actual browser
WebGL 2 through SwiftShader, not post-incident AMD or Android device qualification.
The juvenile broadleaf ground plant now uses a curved leaf surface and retains real source
leaves in its reduced-detail model. Use --viewpoint ground-broadleaf for its inspection
camera; see ground broadleaf validation for exact scope and cost.
The split-leaf ground plant uses connected, curved lobes with shared near/far source
identities. Its --viewpoint ground camera and validation notes
track the remaining terrain-intersection and LOD limitations.
Shrubs now use rooted woody shoots and smaller individual curved leaves, retaining
all source leaves and outlines at far LOD. Use --viewpoint bush for the targeted camera;
shrub validation records the increased geometry cost and
remaining coverage/animation limitations.
The floor layer includes 199 irregular canopy-associated groups with 866 smaller
companion plants, while preserving paths and clearing accents. See
placement validation for bounds, cost and visual limitations.
Jungle root origins now follow the actual rendered terrain triangles; see
root-contact validation and remaining slope limits.
Near rosette litter also follows slopes through the shared terrain height map;
contact measurements and remaining limits document the change.
Thirty small beach crabs occupy six dry/wet-sand colonies and
alternate asynchronous
pause, forage, and lateral scuttle states. They stay inside terrain-validated home ranges, retreat
briefly from a nearby player, and use articulated near/far silhouettes in one culled batch.
Eighteen butterflies occupy three sunny clearing-edge habitats, alternate rest, flutter, and
nectar-hover behaviour, and stay inside low terrain-relative altitude and home-range bounds. Five
palettes, hinged patterned near wings, a reduced far silhouette, and one culled batch make their
motion readable without filling every clearing. Eight
near-shore schools add 48 animated fish constrained between the seabed and water surface, with
depth-following pitch, banked turns, forked tails, CPU-lit body facets, restrained depth/caustic
colour response, and readable near heads.
Five non-hostile sea turtles follow separate bounded near-shore routes between the seabed and
surface. They alternate slow cruising, seabed foraging, and occasional surfacing, remain outside
land and the outer-current region, and respond mildly to a nearby swimmer. Faceted scute-patterned
shells, articulated flippers, three natural palettes, near/far geometry, and one culled dynamic
batch keep them readable through the water without making them a constant attraction.
One non-hostile shark
occasionally patrols deeper offshore water with matching dive pitch, turn banking, a forked tail,
depth-integrated colour, and restrained near eye/gill detail.
Seven original procedural monkeys roam the interior using a compact, obstacle-aware state machine,
three silhouette meshes, four material palettes, portable CNA GPU skeletal animation, and short
state-transition crossfades. Near animals add restrained crown/cheek fur tufts plus bone-following
finger and toe silhouettes in the existing body draw. Calm idle/observe animals gradually turn
their existing head bone
toward a nearby player within a restrained angle, then relax or retreat without becoming hostile.
The current audio pass adds original procedural shoreline surf, two
varied occasional stronger waves, light canopy breeze, a subtle daytime-jungle texture,
speed/depth-responsive movement through shallow or swimming water, and two restrained
water-entry/exit textures. The same continuous water layer now develops a subtle deeper undertow
bed as the 42--72 m offshore current strengthens, without adding another persistent source. Two
bird phrases and two monkey contact phrases share one positional
voice attached to actual nearby agents. All four persistent loops remove their measured mean
before PCM quantization, avoiding long-lived DC bias without altering one-shot silent endpoints.
Distance-scheduled player footsteps select paired dry-sand or interior-soil textures from actual
resolved travel, vary pitch/pan/gain, and remain silent while swimming or blocked.
All audio is generated without external sound files. The
complete scene runs on Linux/OpenGL 3.3, in an actual Chromium/WebGL 2 context, and in a
KVM-accelerated Android API 35 x86_64 emulator through OpenGL ES 3. The accelerated Android pass
also exercises movement and look gestures, AAudio startup, and background/foreground recovery.
Android uses a centralized mobile quality default that retains all content and close detail while
reducing only distant grass/shadow/wildlife work and the ocean grid; Linux and Web retain the full
portable profile.
Physical-device touch ergonomics, thermals, and sustained mobile-GPU performance are not yet
qualified.
There are deliberately no quests, combat, inventory, crafting, survival systems, score, progression, dynamic weather, or day/night cycle.
The project consumes read-only CNA next and Sharp Runtime next checkouts. Exact qualified
commits are stored in dependencies.lock. The current workspace checkouts are both on next; the
project still creates an ignored, unmodified CNA source export so its build input remains pinned:
tools/materialize_cna_next.shThis does not switch or edit the CNA repository. A separate read-only CNA checkout on next can be
used instead with -DCNA_ROOT_DIR=/path/to/cna.
The machine-wide ccache is required. Sharp Runtime's stricter build policy limits builds that compile its sources to two parallel jobs.
export CCACHE_DIR=/rv/cnaccache
export CCACHE_BASEDIR=/rv
tools/materialize_cna_next.sh
cmake -S . -B build -G Ninja \
-DCMAKE_BUILD_TYPE=Debug \
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
-DCNA_GRAPHICS_RENDERER=OPENGL33
cmake --build build --target island-simulator island_core_tests island_world_report \
island_audio_report --parallel 2
ctest --preset linux-coreThe graphical tests need an isolated display; use the command in docs/build-linux.md rather than
running the full CTest set on the owner's live desktop.
For a stripped, relocatable Linux release bundle, use the dedicated two-worker preset and packager:
export CCACHE_DIR=/rv/cnaccache
export CCACHE_BASEDIR=/rv
cmake --preset linux-release
cmake --build --preset linux-release
tools/package_linux_release.sh build-consumerThis produces build-consumer/island-simulator-linux-x86_64.tar.gz. The archive contains the game,
the exact built libcna.so, dependency licences/notices, attribution, dependency pins, and a
SHA-256 manifest. The executable resolves CNA through $ORIGIN/lib, so the extracted directory
can be moved and launched from an unrelated working directory. Compatible system SDL 3,
SDL_mixer 3, glibc, libstdc++, and an OpenGL 3.3 driver remain explicit host dependencies rather
than silently copied distribution-specific libraries.
Run build/island-simulator. Click inside the window or press a movement key to capture the mouse,
use WASD or the arrow keys to move, and press Shift to toggle between walking and running on land.
Each keyboard toggle briefly confirms WALK MODE 4.3 M/S or RUN MODE 8.0 M/S near the bottom
of the view; no key must remain held.
The selected walk/run mode, camera-motion toggle, audio mute state, and Android touch-look
sensitivity are saved automatically through CNA's platform storage and restored on the next
ordinary launch. Isolated smoke/capture/benchmark runs do not read or change player preferences;
--no-user-settings provides the same isolation for an explicit diagnostic launch.
The executable may be launched from any working directory; current runtime content is embedded or
generated and does not depend on a repository-relative asset path.
On Linux, press Escape once to release the mouse and again to exit. In a browser, Escape only
releases pointer lock; close the tab through the browser UI when finished. Mouse look remains
active while a movement key is held. The controller follows the terrain,
rejects overly steep uphill motion, slides along trunk, solid-rock, and fallen-log proxies, and
enters swimming water with hysteresis. Swimming retains collision with solid emergent reef rocks.
A static 16 m collision grid limits each capsule test to nearby proxies; bounded one-time recovery
prevents a placement or debug teleport from leaving the player embedded in a static proxy.
Geometric step-up and continuous recovery from moving obstacles are not implemented yet.
Walking and swimming apply restrained, speed-responsive positional camera motion; press B to
smoothly disable or restore it.
Press F1 to toggle the developer overlay with frame timing, player/water state, renderer identity
and the actual logical backbuffer size,
culling counts, contact-shadow class/draw statistics, vegetation draw statistics, ambient mix
levels, grass-interaction strength, player-ripple and transition-burst intensity/phase, player-water
gain, wave/splash counts, undertow cue strength, and positional bird/monkey call activity.
While F1 is visible, F2 toggles an x-ray world diagnostic: the authoritative shoreline and three
ocean-current thresholds, nearby collision proxies, the player footprint, shared 8 by 8 scene
cells, all nine terrain-contact samples and normals, wildlife headings, simulation-tier colours,
nearby fish-school centres, the shark route target, monkey home ranges and active movement targets,
three bird-family route volumes, all 24 authored bird spawn headings, and nearby live radial targets,
the last exact attempted/resolved player step with rejection classification,
the exact active inward/circulating-current vector, all six ambient crossfade boundaries, the nearest bird/monkey
audio candidates, and any active positional wildlife emitter. The panel also reports active audio
sources against the six-source ceiling.
In debug builds, F3 toggles a bounded inspection camera while F1 is visible. Mouse look remains
unchanged; WASD flies horizontally, Q/E moves down/up, and Shift increases speed. The player stays
fixed, and hiding F1 immediately restores the first-person camera.
The overlay also shows the four authoritative procedural-layout seeds. Press F4 while it is visible
to copy a stable seed report; the panel reports COPIED only after reading back the same text and
otherwise reports UNAVAILABLE.
Press M to mute or unmute the soundscape. Press B to toggle locomotion camera motion. While the
overlay is visible, F5 through F12 teleport among eight fixed QA locations, including views toward
the south fish shallows, offshore shark, monkey troop, and the active offshore-current field.
The overlay starts
hidden in a normal run and can be enabled at launch with --debug-overlay for automated QA.
Use --world-debug to enable both the panel and world visualization at launch.
The 2026-10-08 AMDGPU GPUVM incident currently requires the fail-closed serial procedure in
docs/incidents/2026-10-08-amdgpu-gpuvm-reset.md; a private compositor still shares the physical
GPU with the desktop. After that incident is closed, tools/run_native_benchmarks.sh provides
warm, uncapped JSON frame-time reports across five fixed scenes plus a 676 m moving traversal. Reports include
min/max/mean scene-population ranges, timing distributions, and exact 120/60/30 Hz budget-miss
counts; methodology and the current Linux release baseline are in docs/performance.md.
Use --startup-report <path> to write a machine-readable first-draw report. It separates
deterministic world construction, framework initialization, GPU/content creation, the interval
before the first draw, and the first submitted draw. Combine it with --smoke-test --overview for
an unattended run; the measurement ends before CNA presents the frame and is therefore not a
GPU-completion timer. The native CTest suite validates the report after an actual OpenGL 3.3 draw.
Use python3 tools/validate_assets.py to enforce the asset provenance gate and
build/island-world-report --output <path> for deterministic terrain, placement, collision,
wildlife, seed, and fingerprint statistics. Native overview captures are followed by
tools/validate_capture.py, which rejects truncated, black/white, flat, or spatially degenerate
P6 output and writes machine-readable metrics. See docs/asset-pipeline.md and
docs/debugging.md.
Use build/island-audio-report --output <path> --wav-directory <directory> to audit every
procedural source and export disposable PCM16 WAV previews for focused listening. See
docs/audio-review.md.
The automated browser smoke test verifies renderer initialization, the portable terrain-material,
animated-ocean, and fixed-sky shaders, hardware-instanced palm/jungle/prop LOD, portable instanced
grass wind, a finite first-draw startup timing line, four frames, clean shutdown, active
overview/beach/jungle/prop/driftwood/reef/shipwreck/crabs/butterflies/turtles/water/
current/grass/frond/distant/bird/fish/shark/monkey screenshots, the transient run-mode confirmation,
and portable overlay text rendering.
The close prop view additionally requires a nonzero one-draw contact-shadow batch.
The driftwood view frames the authored three-silhouette cove group, including the forked third
variant, and requires a nonzero per-instance near-LOD population.
The Chromium harness also drives first-click pointer lock and initialization of all ambient and
positional-wildlife audio resources, WASD, arrow-key movement, Shift run/walk toggling,
simultaneous forward movement and relative mouse look, a deterministic beach-to-water crossing with successful
transition-audio playback, successful land-footstep playback, F2 world
lines, F4 seed-copy execution with explicit clipboard status, F1,
real-Escape pointer release, continued live frames, delayed click reacquisition, canvas focus, and
responsive 16:9 sizing. A narrower Firefox ESR 140.15 WebDriver BiDi gate independently checks the
production shell's first frame, reported WebGL 2 Radeon backend, trusted-click pointer lock,
44.1 kHz audio initialization, persistent Shift enable/disable edges, forward traversal with an
actual footstep, Escape release, delayed pointer-lock reacquisition, and responsive 16:9 sizing.
It also loads dedicated 1280 by 720 jungle, near-surface-water, 20 m shipwreck, beach-crab,
butterfly, and sea-turtle scenes, requires
their live state, and captures each. All Firefox scene frames were visually inspected. A visible
interactive listening pass, the remaining fixed-scene matrix, long tab suspension, audio-focus
behaviour, and fullscreen remain open. The automated Firefox path now does one actual second-tab
activation cycle and requires visible to hidden to visible, resumed animation frames, and
fresh game input after foregrounding.
After the WebGL 2 release build, tools/package_web_release.sh build-probe creates
build-probe/web-release/ with verified uncompressed artifacts, deterministic gzip variants, and
a SHA-256 manifest. The current gzip payload is 2,587,860 bytes, 71.5% below the 9,085,111-byte
uncompressed package. See docs/build-web.md for required server content types and
content-encoding headers; the quick Python development server does not exercise compressed
delivery.
The Android project produces arm64-v8a device and x86_64 emulator APKs with an explicit GLES 3
renderer. The left half of the screen supplies a floating movement stick and the right half uses
relative drag-to-look, with subtle generated premultiplied-alpha control indicators. Near-full
movement-stick travel selects the faster land pace with a warm-gold visual cue; easing inward
returns to analog walking. A small three-dot control at top right cycles low, standard, and high
look sensitivity (0.72/1.00/1.35 times); the highlighted dot shows the current choice. Android
Emulator 36.5.11 runs the API 35 x86_64 AVD with KVM CPU acceleration and host-GPU gfxstream.
The complete current scene, independent movement/look gestures, all sensitivity levels, a
same-process hot resume, force-stop/new-process relaunch, and AAudio pause/resume are validated
there. Dedicated current-source GLES 3 views also validate the inland humus/moss floor material,
the layered near-canopy edge plus irregular trunks and bent support branches, clearing butterflies,
a near-shore sea turtle, and sparse hanging dry-frond variation through the mobile quality profile. The
persistence-qualified run also
requires a touch sensitivity change to survive the cold relaunch. The default arm64-v8a APK is
19,082,004 bytes, contains a 16,271,720-byte stripped
libmain.so, passes app lint, and verifies with APK signature scheme v2. This is meaningful
emulator qualification, but it does not replace physical-device
ergonomics, thermal, driver, and sustained-performance testing. See
docs/build-android.md and PLAN.md for exact evidence and commands.
PLAN.mdis the living development ledger.BUGS.mdrecords confirmed CNA or Sharp Runtime defects and game-side workarounds.ASSET_LICENSES.mdrecords all asset provenance before assets enter a runtime build.docs/asset-pipeline.mddefines the manifest, validation gate, deterministic world report, and external-asset intake procedure.docs/audio-review.mddefines deterministic source analysis, WAV preview export, and the remaining subjective listening protocol.docs/performance.mddefines the repeatable benchmark method, current evidence, and open budgets.
