# Tinyworld Island Viewer

> Use when changing the first-class Island Viewer shell, sequential generated-island viewer routing, or viewer-scoped graphics defaults.

- Skill: `jasonkneen/tinyworld-island-viewer` (Agent Skill)
- Install (CLI): `npx skillmds@latest add jasonkneen/tinyworld-island-viewer`
- Raw SKILL.md: https://api.skillmd.com/api/skills/jasonkneen/tinyworld-island-viewer/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: jasonkneen (https://skillmd.com/u/jasonkneen)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/jasonkneen/tinyworld-island-viewer

---


# TinyWorld Island Viewer

Island Viewer is the first-class generated-island viewing surface:

- Shell: `island-viewer.html`
- Styles: `styles/island-viewer.css`
- Generator: `scripts/island-viewer-sequential-generator.js`
- Renderer adapter: `scripts/island-viewer-engine-runtime.js`
- Controller: `scripts/island-viewer.js`
- Compatibility redirect: `random-island-preview.html`

Rules:

- Keep the active generator viewer-only and sequential. `island-viewer.html`
  should load `scripts/island-viewer-sequential-generator.js`, not the giant
  `scripts/tinyworld-island-core.js` copied random-island bundle.
- Keep the builder-engine renderer stack active for now. Do not load
  `scripts/island-viewer-renderer.js` on `island-viewer.html` while
  `scripts/island-viewer-engine-runtime.js` provides the current look.
- The sequential layer stack is: all grass, first house, corner towers, paths,
  extra houses, fenced crops, fenced animals, rock patch, water route, bridge
  detection, strategic lanterns, plain stone outcrops, trees/bushes, then final
  weighted infill.
- The viewer sequential generator must emit schema-valid `v:4` world cells,
  use normal `terrain: "path"` cells for public path output, and expose
  `TinyWorldIslandGenerator.generate(...)` and `.profile(...)`.
- Do not emit `water-bridge` or `bridgeAxis` metadata from the active viewer
  generator. Bridges are allowed only through the new local detector: after
  water carving, scan local crossings with path cells on one axis and water
  cells on the perpendicular axis, then turn only the center water cell into a
  normal `kind: "bridge"`.
- Strategic lanterns are native `kind: "lamp-post"` cells placed after bridge
  detection. Keep them on empty grass cells that touch exactly two perpendicular
  path cells, and keep every pair more than 3 Manhattan spaces apart.
- A manor is a rare native `house` with `buildingType: "manor"`, not a promoted
  cottage. Only roll the 25% manor chance after at least three normal houses
  exist, reserve its footprint during generation, and connect a path from the
  cell in front of its door back into the existing path network before plots,
  rocks, water, or lanterns run.
- Trees and bushes are native `kind: "tree"` / `kind: "bush"` decoration placed
  after the functional path/water/bridge/lamp layers. Only use empty grass cells,
  keep trees spaced out, and let bushes fill smaller remaining border/garden
  opportunities without occupying paths.
- The initial fenced crop plot should keep its four dirt plot cells and fence
  gates, but each cell rolls independently: 25% empty, otherwise evenly between
  wheat, corn, carrot, pumpkin, and sunflower.
- The quarry/rock patch is the canonical ore showcase: its four cells should
  emit `kind: "rock"` with `appearance.oreMetal` covering `copper`, `iron`,
  `silver`, and `gold` once each. Extra infill ore may still pick a deterministic
  metal, but the core patch should visibly expose all four variants. Prefer a
  2x2 quarry; if earlier sequential layers leave no legal 2x2 space, place a
  compact connected four-cell quarry without overwriting paths, water, fences,
  structures, or reserved manor footprint cells.
- After the sparse tree/bush pass, run a final weighted infill loop over normal
  empty buildable cells until none remain. The infill choices should stay within
  native economy objects: crops, plain stone, ore, sheep/cow, bushes, and trees.
  Plain stone should be generated by the dedicated outcrop layer and can be
  extended by this weighted pass, clustered around stone/quarry terrain; do not
  add a post-pass forced stone correction.
  Do not fill water, paths, fences, structures, or reserved manor footprint cells.
- Water route planning must treat path crossings as single-cell crossings per
  connected path area. Do not let water carve two adjacent path cells or run
  along the path before turning back into normal terrain.
- Keep normal viewer chrome minimal. It is not a build screen: visible controls
  should stay viewer actions such as New Island, Load, and Save.
- Put grid/seed and graphics controls in the local/developer defaults helper,
  not in the primary viewer toolbar. Do not expose archetype as a viewer-facing
  economy or card concept; it is only hidden generator input when a caller passes
  it explicitly.
- Generated Island Viewer islands are fixed at `8 x 8`.
- Viewer runtime load applies the normalized 64-cell island once. Do not restore
  the old `clearViewerWorld()` + full reapply double pass, and do not force
  every tile rebuild during initial load. Use the
  `window.__tinyworldIslandViewerLoading` guard to suppress interleaved renders,
  then render once after the island settles.
- Viewer directional sun defaults to `10.0` (1000%). Migrate the old viewer
  default `1.1` only when it still looks untouched; user-edited values should
  stay user-owned.
- Persist viewer defaults only under `tinyworld:island-viewer:*`. Do not write
  viewer graphics into normal builder `tinyworld:render:*` keys.
- Use `npm run stats:island-viewer -- --count 1000` for on-demand sequential
  generator sweeps. The CLI loads the shared Raw Yield economy helper plus the
  viewer generator directly, validates schema/invariants, reports Raw Yield
  score/rarity/leader/resource summaries, and writes reports under
  `stats-runs/island-viewer-sequential/`.

Validation:

- `npm test`
- `npm run build`
- `npm run stats:island-viewer -- --count 1000`
- Check `/island-viewer` or `/island-viewer.html`: page loads through the
  builder-engine renderer, generated saves contain no legacy bridge metadata,
  and the shell does not request `scripts/tinyworld-island-core.js` or
  `scripts/island-viewer-renderer.js`.

