From ca5a77af5f21b962917ba0e235ef7d151a0ac18d Mon Sep 17 00:00:00 2001 From: "Yifeng \"Evan\" Wang" <7312949+doodlewind@users.noreply.github.com> Date: Tue, 8 Sep 2026 10:32:06 -0700 Subject: [PATCH 1/3] feat(map): add Ocarina of Time atlas and SD map switching --- README.md | 13 +++- app/model.ts | 44 +++++++++---- app/ui.tsx | 8 +-- docs/OCARINA.md | 81 ++++++++++++++++++++++++ docs/SD_MAP.md | 7 ++- docs/images/CAPTURES.md | 17 +++++ docs/images/oot-capture.json | 35 +++++++++++ docs/images/oot-hyrule-field-3ds.png | Bin 0 -> 205276 bytes host/atlas-format.ts | 2 +- host/atlas.ts | 12 ++-- host/config.ts | 3 +- host/oot-format.ts | 42 +++++++++++++ host/serve-usb.ts | 3 +- host/serve.ts | 7 ++- host/service.ts | 9 ++- package.json | 1 + scripts/deploy-sd.py | 22 ++++--- scripts/prepare-oot.ts | 91 +++++++++++++++++++++++++++ scripts/prepare-sd.ts | 29 ++++----- scripts/sim.ts | 27 ++++---- shared/atlas.ts | 20 ++++++ shared/types.ts | 8 ++- test/atlas.test.ts | 62 ++++++++++++++++++ test/sd.test.ts | 26 +++++++- 24 files changed, 491 insertions(+), 78 deletions(-) create mode 100644 docs/OCARINA.md create mode 100644 docs/images/oot-capture.json create mode 100644 docs/images/oot-hyrule-field-3ds.png create mode 100644 host/oot-format.ts create mode 100644 scripts/prepare-oot.ts create mode 100644 shared/atlas.ts diff --git a/README.md b/README.md index 4b5de55..e73399b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Pocket Map -A map browser for Nintendo 3DS and PSP, built with [PocketJS](https://github.com/pocket-stack/pocketjs) and SolidJS 1.9. Browse **OSM vector maps** or the complete Hyrule map from **The Legend of Zelda: Breath of the Wild**. Pan with the resistive touchpad, zoom, search and save places on the paired Mac. +A map browser for Nintendo 3DS and PSP, built with [PocketJS](https://github.com/pocket-stack/pocketjs) and SolidJS 1.9. Browse **OSM vector maps**, Hyrule from **Breath of the Wild**, or the region and dungeon atlas from **Ocarina of Time**. Pan with the resistive touchpad, zoom, search and save places on the paired Mac. The Mac fetches OSM vector tiles, prepares bounded geometry and streams it to the 3DS GPU drawing path. Four real San Francisco tiles used **79.5% fewer terrain bytes** than the previous raw bitmap path; z14 geometry is reused through display z18. Hyrule retains its complete local raster atlas and 2,576 searchable places, with no internet requests while browsing. See [vector architecture, measurements and limits](docs/VECTOR_MAP.md). @@ -21,6 +21,15 @@ OSM map data © [OpenStreetMap contributors](https://www.openstreetmap.org/copyr Map artwork belongs to Nintendo; the pinned atlas and marker source is [Zelda Dungeon's map repository](https://github.com/zeldadungeon/maps/tree/d32a85656031d861cef38e32eb927a7d08a983a9/public/botw). Downloaded assets and generated databases stay outside Git. +### Ocarina of Time + +The third source uses [Ecksters' OoT Interactive Map](https://github.com/Ecksters/OoT-Interactive-Map/tree/020dab1b787bc18d1990653817765a1024bad43d), with Nintendo map artwork assembled by Peardian. It includes **456 searchable regions and rooms** and a complete **21,845-tile pyramid at levels 0–7**. Both Zelda maps can use prepared SD textures and retain independent camera positions and Mac bookmarks. [Prepare and install Ocarina of Time](docs/OCARINA.md). + +![Ocarina of Time, Hyrule Field — native 3DS build in Azahar reading prepared SD textures without a paired Mac](docs/images/oot-hyrule-field-3ds.png) + +This native Azahar capture reads the installed OoT pack through the 3DS SD +worker with **no paired Mac**. [Capture provenance](docs/images/CAPTURES.md#ocarina-of-time-2026-09-08). + ## PSP over USB The PSP port renders the same OSM vector geometry on its local GE, with a 480×272 single-screen UI, shoulder menus, a virtual keyboard and saved places on the Mac. The Mac performs network requests, vector preparation and image decoding through PocketJS's native USB offload worker. Hyrule retains its raster path. See [PSP setup, controls and measured limits](docs/PSP.md). @@ -74,7 +83,7 @@ queue; it is not a device-render receipt. | Hold L | Search, saved places, save map center, return to pin, or map home | | Hold R | Zoom, label categories, switch map, clear pin, retry, or controls | | Hold ZL + D-pad up/down | Open the vertical zoom rail; tap or hold to change levels | -| Map name on the lower screen | Switch Hyrule / OSM without restarting | +| Map name on the lower screen | Switch OSM / Hyrule / Ocarina of Time without restarting | | Save view / Save place | Name and save the center or selected search result on the Mac | | Saved | Browse, rename, delete with confirmation, or return to a saved location | | Saved page: Prev / Next or D-pad left/right | Turn five-place pages | diff --git a/app/model.ts b/app/model.ts index 0dd65e1..f53d5c3 100644 --- a/app/model.ts +++ b/app/model.ts @@ -9,7 +9,8 @@ import { BTN } from "@pocketjs/framework/input"; import { inputDeltaSeconds, simulationHz, virtualNow } from "@pocketjs/framework/clock"; import { project, worldPosition, positionAt } from "./geo.ts"; import { createSavedPlaces, validPlaces, type MapMode } from "./saved.ts"; -import { HOME, type TileInput, type MapInfo, type SearchInput, type Place, type MapKind } from "../shared/types.ts"; +import { HOME, MAP_KINDS, MAP_NAMES, ATLAS_KINDS, type AtlasKind, type TileInput, type MapInfo, type SearchInput, type Place, type MapKind } from "../shared/types.ts"; +import { validAtlas, atlasPackName } from "../shared/atlas.ts"; import { createMapPrediction } from "./prediction.ts"; import { createAnnotations, LAYERS } from "./annotations.ts"; @@ -45,12 +46,13 @@ export function createMap(io = offload(), viewport = { width: 400, height: 240 } const packs = resourcePacks(); const [useLocalTiles, setUseLocalTiles] = createSignal(true); const [localSource, setLocalSource] = createSignal(); + const [installed, setInstalled] = createSignal>>({}); const localMapAvailable = () => !!packs?.connected() && planar() && useLocalTiles() && localSource() === info()?.source; const [tileStorage, setTileStorage] = createSignal<"local" | "desktop">("desktop"); const camera = createTileCamera({ ...viewport, x: p.x, y: p.y, zoom: HOME.zoom, minZoom: 1, maxZoom: 18, bounds: { width: 256, height: 256, wrapX: true } }); const runtime = createResourceRuntime({ maxConcurrent: 3, startsPerFrame: 1, completionsPerFrame: 1, maxCollections: 6, available: () => !switching() && !!info() && (io.connected() || !!packs && planar()) }); const rasterTiles = createPackedImageCollection(runtime, { key: i => `${i.source}/${i.z}/${i.x}/${i.y}`, - pack: i => useLocalTiles() && planar() ? { name: `hyrule-${i.source}-v1`, entry: 1 + (4 ** i.z - 1) / 3 + i.y * 2 ** i.z + i.x } : undefined, + pack: i => useLocalTiles() && planar() ? { name: info()?.pack ?? atlasPackName(info()?.kind === "oot" ? "oot" : "hyrule", i.source), entry: 1 + (4 ** i.z - 1) / 3 + i.y * 2 ** i.z + i.x } : undefined, fallback: { client: reads, method: "map.tile", payload: JSON.stringify }, materialized: storage => { setTileStorage(storage); if (storage === "local") setLocalSource(info()?.source); }, width: 256, height: 256, maxEntries: tileEntries, maxViews: 2, maxDemandsPerView: 24, retry: { attempts: 3, delayFrames: 90, maxDelayFrames: 360 } }); const vector = () => info()?.render === "mesh"; @@ -86,8 +88,12 @@ export function createMap(io = offload(), viewport = { width: 400, height: 240 } const selectedIndex = () => mode() === "saved" ? saved.selection() : selection(); function select(index: number) { const n = Math.max(0, Math.min(rows().length - 1, index)); if (mode() === "saved") saved.setSelection(n); else setSelection(n); } prediction.reset(camera.view()); - const maps = () => info()?.maps ?? []; - const labelLayers = () => vector() ? [LAYERS[0],LAYERS[4]] : LAYERS; + const maps = createMemo(() => { + const catalog = [...(info()?.maps ?? [])]; + for (const kind of ATLAS_KINDS) { const local = installed()[kind]; if (local && !catalog.some(m => m.kind === kind)) catalog.push({ kind, name: local.name }); } + return catalog; + }); + const labelLayers = () => vector() ? [LAYERS[0],LAYERS[4]] : info()?.kind === "oot" ? [LAYERS[0], { id: "travel" as const, name: "Regions & dungeon rooms" }, LAYERS[4]] : LAYERS; const choices = () => mode() === "sources" ? maps().map(m => m.name) : labelLayers().map(l => l.name); const choosing = () => mode() === "sources" || mode() === "layers"; function openSources() { if (saved.busy() || saved.modal() || typing() || switching()) return; camera.stop(); setSourceError(""); setMode("sources"); setSelection(Math.max(0, maps().findIndex(m => m.kind === info()?.kind))); setMenu(undefined); } @@ -98,13 +104,17 @@ export function createMap(io = offload(), viewport = { width: 400, height: 240 } function switchMap(kind: MapKind) { if (saved.busy() || saved.modal() || typing() || switching()) return; if (kind === info()?.kind) { dismiss(); return; } + const local = kind === "osm" ? undefined : installed()[kind]; + if (!io.connected() && !local) { setSourceError("Connect your Mac to open this map."); setMode("sources"); return; } const old = info(); if (old?.kind) remembered.set(old.kind, { ...camera.view(), pin: pin() }); camera.stop(); if (infoRequest) io.cancel(infoRequest); infoRequest = 0; - setSourceError(""); setRequestedKind(kind); setSwitching(true); retryAt = 0; setMode("map"); setStatus(`Opening ${kind === "hyrule" ? "Hyrule" : "OpenStreetMap"}...`); + setSourceError(""); setRequestedKind(kind); setSwitching(true); retryAt = 0; setMode("map"); setStatus(`Opening ${MAP_NAMES[kind]}...`); + if (local) { installInfo({ ...local, markers: false, maps: info()?.maps }); setLocalSource(local.source); } } let frame = 0, previousSession = 0, infoRequest = 0, retryAt = 0, shiftAt = -10, levelAge = 0, candidateLevel = HOME.zoom; let confirmed = false; let bootstrap = packs ? 0 : -1; + let bootstrapIndex = 0; onCleanup(() => { if (bootstrap > 0) packs?.cancel(bootstrap); }); function installInfo(value: MapInfo) { if (typeof value.source !== "string" || !/^[a-f0-9]{16}$/.test(value.source) || typeof value.name !== "string" || typeof value.attribution !== "string" || !Number.isInteger(value.maxZoom) || value.maxZoom < 1 || value.maxZoom > 18 @@ -113,7 +123,11 @@ export function createMap(io = offload(), viewport = { width: 400, height: 240 } || value.render === "mesh" && (!Number.isInteger(value.dataZoom) || value.dataZoom! < 0 || value.dataZoom! > value.maxZoom) || value.space !== undefined && value.space !== "mercator" && value.space !== "planar" || value.home !== undefined && (!validPlaces([value.home]) || (value.home.space === "planar") !== (value.space === "planar"))) throw new Error("Invalid map provider"); - if (value.maps !== undefined && (!Array.isArray(value.maps) || value.maps.length > 2 || !value.maps.every(m => (m.kind === "hyrule" || m.kind === "osm") && typeof m.name === "string" && m.name.length <= 40))) throw new Error("Invalid map catalog"); + if (value.kind !== undefined && !MAP_KINDS.includes(value.kind) + || value.pack !== undefined && !/^[a-z0-9-]{1,48}$/.test(value.pack) + || value.worldUnits !== undefined && (!Number.isFinite(value.worldUnits) || value.worldUnits <= 0)) throw new Error("Invalid map identity"); + if (value.maps !== undefined && (!Array.isArray(value.maps) || value.maps.length > MAP_KINDS.length || !value.maps.every(m => MAP_KINDS.includes(m.kind) && typeof m.name === "string" && m.name.length <= 40) + || new Set(value.maps.map(m => m.kind)).size !== value.maps.length)) throw new Error("Invalid map catalog"); if (info()?.source !== value.source) { runtime.cancel(); searches.clear(); labels.clear(); annotations.reset(); saved.reset(); setSubmitted(undefined); setQuery(""); tiles.clear(); setFront(undefined); setBack(undefined); setLookAhead([]); setPin(undefined); @@ -196,18 +210,22 @@ export function createMap(io = offload(), viewport = { width: 400, height: 240 } if (infoRequest) { io.cancel(infoRequest); infoRequest = 0; } runtime.cancel(); retryAt = 0; if (session > 0) { if (!packs || !planar() || !useLocalTiles()) tiles.invalidate(); searches.invalidate(); labels.invalidate(); saved.refresh(); setStatus("Connecting map service"); } - else setStatus(localMapAvailable() ? "Hyrule from SD card" : "Mac disconnected - cached map"); + else setStatus(localMapAvailable() ? "Map from SD card" : "Mac disconnected - cached map"); previousSession = session; } if (bootstrap === 0 && packs?.connected()) { - bootstrap = packs.request("pack.read", "hyrule/0", result => { - bootstrap = -1; - if (!result.ok || info() || switching()) return; + const kind = ATLAS_KINDS[bootstrapIndex]; + bootstrap = packs.request("pack.read", `${kind}/0`, result => { + bootstrap = ++bootstrapIndex < ATLAS_KINDS.length ? 0 : -1; + if (!result.ok) return; try { const atlas = JSON.parse(result.value); - if (atlas.format !== "pocket-map-atlas-rgb565-v1" || atlas.tiles !== 21845 || atlas.info?.space !== "planar") return; - installInfo({ ...atlas.info, kind: "hyrule", markers: false }); - setLocalSource(atlas.info.source); setStatus("Hyrule from SD card"); + if (!validAtlas(atlas) || atlas.info.kind !== undefined && atlas.info.kind !== kind) return; + const local = { ...atlas.info, kind, pack: atlas.info.pack ?? atlasPackName(kind, atlas.info.source), markers: false }; + setInstalled(old => ({ ...old, [kind]: local })); + if (!info() && !switching()) { + installInfo(local); setLocalSource(local.source); setStatus("Map from SD card"); + } } catch { /* Optional installation; the paired provider remains available. */ } }) || 0; } diff --git a/app/ui.tsx b/app/ui.tsx index fb41680..68db8b3 100644 --- a/app/ui.tsx +++ b/app/ui.tsx @@ -132,9 +132,9 @@ function Deck(p: { s: MapModel }) { {search} - {typing() ? `${(naming() ? p.s.saved.name() : p.s.query()).slice(-31)}|` : saved() ? "Saved on your paired Mac" : results() ? p.s.query().slice(0, 32) : p.s.localMapAvailable() && !p.s.online() ? "Hyrule on SD - Mac for search & saves" : p.s.online() ? p.s.planar() ? "Hyrule - Breath of the Wild" : "Explore with your Nintendo 3DS" : "Waiting for paired Mac"} + {typing() ? `${(naming() ? p.s.saved.name() : p.s.query()).slice(-31)}|` : saved() ? "Saved on your paired Mac" : results() ? p.s.query().slice(0, 32) : p.s.localMapAvailable() && !p.s.online() ? "Map on SD - Mac for search & saves" : p.s.online() ? p.s.planar() ? p.s.info()?.name ?? "Local atlas" : "Explore with your Nintendo 3DS" : "Waiting for paired Mac"} - + {(name, i) => p.s.choose(i())} />} @@ -151,7 +151,7 @@ export default function MapApp() { hot.text(zoomText, `z${v.zoom.toFixed(1)}`); if (pin) { const pos = worldPosition(pin); let dx = pos.x - v.x; if (!s.planar()) dx -= Math.round(dx / 256) * 256; hot.prop(marker, "translateX", 200 + dx * v.scale - 8); hot.prop(marker, "translateY", 120 + (pos.y - v.y) * v.scale - 22); } - const scale = s.planar() ? { pixels: 64, label: `${Math.round(64 / v.scale * 24000 / 256)} u` } : scaleBar(unproject(v.x, v.y).lat, v.zoom); + const scale = s.planar() ? { pixels: 64, label: `${Math.round(64 / v.scale * (s.info()?.worldUnits ?? 24000) / 256)} u` } : scaleBar(unproject(v.x, v.y).lat, v.zoom); hot.prop(bar, "scaleX", scale.pixels / 70); hot.text(scaleText, scale.label); }); const deck = ; @@ -180,7 +180,7 @@ export default function MapApp() { Pocket Map - {`Stylus / Circle Pad / D-pad: pan\n+ and -: zoom around the map center\nY: search X: return to selected place\nHold L: places Hold R: map controls\nHold ZL + Up/Down: zoom level\n\n${s.planar() ? "Hyrule: Breath of the Wild\nMap art: Nintendo | Data: Zelda Dungeon\nMap and place search stored on your Mac" : "Maps: OpenStreetMap contributors\nosm.org/copyright | Tiles: OSM DE\nPlace search: Photon by komoot"}`} + {`Stylus / Circle Pad / D-pad: pan\n+ and -: zoom around the map center\nY: search X: return to selected place\nHold L: places Hold R: map controls\nHold ZL + Up/Down: zoom level\n\n${s.planar() ? `${s.info()?.name}\n${s.info()?.attribution}\nSD terrain / Mac search and saved places` : "Maps: OpenStreetMap contributors\nosm.org/copyright | Tiles: OSM DE\nPlace search: Photon by komoot"}`} {s.info()?.attribution ?? "Map data"} diff --git a/docs/OCARINA.md b/docs/OCARINA.md new file mode 100644 index 0000000..7de648b --- /dev/null +++ b/docs/OCARINA.md @@ -0,0 +1,81 @@ +# Ocarina of Time atlas + +Pocket Map includes Ocarina of Time as a third source alongside OpenStreetMap +and Breath of the Wild. **The existing PocketJS image collections and SD worker +load this atlas without framework changes.** + +## Prepare and install + +```sh +bun run prepare:oot +bun run prepare:sd --map=oot +bun run 3ds +# Keep ftpd open until upload and complete readback finish. +bun run deploy:sd 192.168.8.102 --map oot +bun run deploy 192.168.8.102 +bun run host 192.168.8.102 --oot +``` + +Exit ftpd, launch Pocket Map, then tap the map name on the lower screen and +choose **Ocarina of Time**. Hold R and choose **Switch map** to open the same +chooser with hardware buttons. Search accepts region names such as **Kakariko** +and **Forest Temple**, or room names such as **Slingshot Room**. Searches and +saved places run on the Mac. Each atlas has a separate bookmark database. + +The app checks `hyrule.prp` and `oot.prp` once during startup. Installed atlases +remain selectable without a paired Mac. A legacy Hyrule installation still +opens first; an OoT-only installation opens OoT. Switching between installed +atlases restores each camera and pin. OSM requires the paired provider. +Offline terrain navigation does not provide offline search or bookmarks. + +The generated OoT pack is **140,997,952 bytes (134.47 MiB)**, with 21,845 images +and one metadata record. Installation uses the same app asset directory as +Hyrule, with separate `oot--v1.prp` and `oot.prp` filenames. The installer +uploads a temporary file, reads the entire file back, compares SHA-256, then +activates the pack and its bootstrap. Interrupted uploads can resume; use +`--restart` if verification reports corruption. Hyrule's files are preserved. + +Raw sources live in `.local/oot-source/repo`, the Mac atlas and search index in +`.local/oot`, and prepared SD files in `.local/3ds/oot`. All are ignored by Git. +Python is needed for the FTP installer; preparation and the Mac provider use +Bun. PSP receives this same atlas through its existing USB image provider; +its build does not read 3DS resource packs. + +## Source and coordinates + +The input is [Ecksters' OoT Interactive Map](https://ootmap.com/), pinned to +[commit 020dab1](https://github.com/Ecksters/OoT-Interactive-Map/tree/020dab1b787bc18d1990653817765a1024bad43d). +The map project credits **Peardian** for its assembled images and Nintendo +owns the game artwork. The repository's MIT license applies to the map project; +Pocket Map does not redistribute the downloaded tile set or relicense the +game artwork. The attribution remains visible on the map. + +This integration uses **Child Angled View**, including the dungeon layouts +placed around the overworld. Adult and top-down variants are not included. +These are an arranged reference atlas, not one continuous in-game surface or +a live player-position feed. + +Upstream tiles use Leaflet Simple CRS at levels 8–15. Pocket Map maps them to +levels 0–7 and converts coordinates with `x = longitude * 256` and +`y = -latitude * 256`. Thus a point addresses the same pixels at every level. +The original rectangular extent is padded with black tiles to complete the +square pyramid. The baker verifies every expected source tile before treating +padding as empty terrain. The scale bar counts source-image units, not metres. + +The build parses the literal scene table without executing downloaded +JavaScript. It indexes **93 regions and 363 rooms**; search opens the largest +mapped polygon section for each area. Region labels appear from level 2 and +room labels from level 6, subject to the existing label-density budget. +Mac preprocessing converts PNGs to RGB565 and builds SQLite FTS and spatial +indices. SD preparation applies PICA texture layout and independently +compresses each record. The guest only requests identified resources. + +## Validation + +The explicit app suites cover three-source request routing, independent saved +place retries, coordinate conversion, variable atlas depths, legacy Hyrule +bootstrap compatibility, offline switching and camera restoration. Compiled +guest replays use the actual OoT atlas for search, map navigation and source +switching. Native and replay captures distinguish emulator rendering from +physical-device interaction. Generated packs are checked by inflating every +record and validating its CRC before upload. diff --git a/docs/SD_MAP.md b/docs/SD_MAP.md index 17c8633..9ee4f16 100644 --- a/docs/SD_MAP.md +++ b/docs/SD_MAP.md @@ -1,5 +1,9 @@ # Hyrule on the 3DS SD card +[Ocarina of Time](OCARINA.md) uses the same SD worker and installer with +`--map=oot` during preparation and `--map oot` during deployment. Its bootstrap +and terrain filenames are separate, so both atlases can remain installed. + The optional SD pack stores the complete Hyrule terrain atlas on the console. **Panning and zooming can load new terrain without a paired Mac**, including at startup. OSM vectors, place search, bookmarks and dynamic marker labels @@ -15,7 +19,8 @@ bun run deploy 192.168.8.102 ``` Exit ftpd and open Pocket Map. The SD bootstrap opens Hyrule directly; the Mac -connection adds search, saved places and the source chooser. The normal +connection adds search and saved places. The source chooser also lists other +installed SD atlases while offline. The normal `bun run host` command remains unchanged. A missing local image can fall back to the paired Mac. Without an installed pack, the original host path remains available. No downloaded artwork, SQLite database or generated pack is committed. diff --git a/docs/images/CAPTURES.md b/docs/images/CAPTURES.md index 4f9cafc..fc43d7f 100644 --- a/docs/images/CAPTURES.md +++ b/docs/images/CAPTURES.md @@ -47,6 +47,23 @@ after its `done` marker appears. The capture session used a separate SD director and restored the existing emulator configuration afterwards. Raw frames, keys, downloaded tiles and working caches stay ignored. +## Ocarina of Time, 2026-09-08 + +`oot-hyrule-field-3ds.png` uses the same native Azahar/Vulkan capture path, +production UI, unscaled screen composition and frame-600 readback described +above. The separate emulator SD directory contains only `oot.prp` and its +prepared terrain pack. **No Mac provider runs for this capture.** The native SD +worker opens the bootstrap after the missing Hyrule probe, loads RGB565 +textures, and displays Hyrule Field at the atlas's default camera. Dynamic +labels are absent because they require the Mac provider. + +[oot-capture.json](oot-capture.json) records source and runtime revisions, +binary and pack hashes, camera coordinates, raw framebuffer hashes and the +published PNG hash. This proves native emulator startup and SD rendering; +it is not a physical-controller test or performance measurement. Use the +same build command with `.local/native-oot/guest` as its output directory and +install the OoT files under the emulator's `pocketjs/assets/c7771f0167312c63/`. + ## Other images - `psp-map.png`, `psp-keyboard.png` and `psp-hyrule.png` are earlier physical PSP diff --git a/docs/images/oot-capture.json b/docs/images/oot-capture.json new file mode 100644 index 0000000..d8caee8 --- /dev/null +++ b/docs/images/oot-capture.json @@ -0,0 +1,35 @@ +{ + "renderer": "Azahar 2125.1.2 / native 3DS / Vulkan / 1x", + "entry": "app/main.tsx", + "runtime": "e2226e8f69990dd8361d79aabf47bcbedc44786d", + "frame": 600, + "pairedMac": false, + "storage": "3DS SD worker reading prepared OoT pack", + "sourceRevision": "020dab1b787bc18d1990653817765a1024bad43d/childAngled/v1", + "camera": { + "id": "o_s81", + "name": "Hyrule Field", + "detail": "Ocarina of Time - Region", + "space": "planar", + "x": 93.89738121360871, + "y": 75.53183042343353, + "zoom": 4 + }, + "nativeBinarySHA256": "24f8893a0290d6fd5afb96cb4089dce91c54446d2af5b8f2ebac13b497d5d9c8", + "resourcePackSHA256": "4e861d021a961bc8da38c5e394f7c8341807620c6faef27c3d61aa8c1cea5232", + "rawFrames": [ + { + "name": "aux-f0600.raw", + "bytes": 307200, + "sha256": "bdc9724e718bb1dfb9dba19c6e2fc3ad049b41e4e90f032c269ad0c0c8557c08" + }, + { + "name": "f0600.raw", + "bytes": 384000, + "sha256": "164d9ca7895b720e872cf05e27559a039fc5e83d017918a83b84c1e2fc21ee10" + } + ], + "image": "oot-hyrule-field-3ds.png", + "pngSHA256": "1cca03408fccf9cfa2acca592b9fff88c370463eba018f73055ef416845f3545", + "physicalInteraction": "Not measured by this capture" +} diff --git a/docs/images/oot-hyrule-field-3ds.png b/docs/images/oot-hyrule-field-3ds.png new file mode 100644 index 0000000000000000000000000000000000000000..223687a836adae624bedd73b62429839042a74b1 GIT binary patch literal 205276 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

dHim6G{sG%|{!mn``}eU8 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

GXbc( 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 7 || x < 0 || y < 0 || x >= 2 ** z || y >= 2 ** z) throw new Error("Invalid atlas tile"); + if (source !== this.info.source || ![z, x, y].every(Number.isInteger) || z < 0 || z > this.info.maxZoom || x < 0 || y < 0 || x >= 2 ** z || y >= 2 ** z) throw new Error("Invalid atlas tile"); const key = `${z}/${x}/${y}`, hit = this.images.get(key); if (hit) { this.hits++; this.images.delete(key); this.images.set(key, hit); return hit; } const row = this.db.query("SELECT pixels FROM tiles WHERE z=? AND x=? AND y=?").get(z, x, y) as { pixels: Uint8Array } | null; diff --git a/host/config.ts b/host/config.ts index a867d07..9e31b72 100644 --- a/host/config.ts +++ b/host/config.ts @@ -1,4 +1,5 @@ -export interface ProviderConfig { tileURL: string; format?: "raster" | "vector"; dataZoom?: number; searchURL: string; name: string; attribution: string; maxZoom: number; cache: string; kind?: "osm" | "hyrule"; atlas?: string } +import type { AtlasKind, MapKind } from "../shared/types.ts"; +export interface ProviderConfig { tileURL: string; format?: "raster" | "vector"; dataZoom?: number; searchURL: string; name: string; attribution: string; maxZoom: number; cache: string; kind?: MapKind; atlas?: string; atlases?: Partial> } export const defaultConfig: ProviderConfig = { tileURL: "https://tiles.versatiles.org/tiles/osm/{z}/{x}/{y}", format: "vector", dataZoom: 14, searchURL: "https://photon.komoot.io/api/", name: "OpenStreetMap", attribution: "OpenStreetMap contributors", maxZoom: 18, cache: ".local/cache.sqlite", diff --git a/host/oot-format.ts b/host/oot-format.ts new file mode 100644 index 0000000..306aaee --- /dev/null +++ b/host/oot-format.ts @@ -0,0 +1,42 @@ +import type { Place } from "../shared/types.ts"; + +export const OOT_REVISION = "020dab1b787bc18d1990653817765a1024bad43d"; +export const OOT_VIEW = "childAngled"; +// Upstream Simple CRS uses scale 2^z; Pocket Map uses 256 * 2^z. +export const OOT_LEVEL_OFFSET = 8; +export const OOT_GRIDS = [[1, 1], [2, 1], [4, 2], [7, 4], [13, 8], [25, 16], [49, 31], [98, 61]] as const; +export type AtlasPlace = Extract & { room: boolean }; +type Area = { id: number; name: string; childAngledCoords?: number[][][]; rooms?: Area[] }; + +/** Read the pinned literal data table; downloaded JavaScript is never executed. */ +export function ootPlaces(text: string): AtlasPlace[] { + const line = text.split("\n").find(l => l.startsWith("var mapData = ")); + if (!line) throw Error("Missing OoT scene table"); + const scenes: Area[] = JSON.parse(line.slice("var mapData = ".length).trim().replace(/;$/, "")); + if (!Array.isArray(scenes)) throw Error("Invalid OoT scene table"); + const places: AtlasPlace[] = []; + function add(area: Area, scene?: Area) { + const polygons = area.childAngledCoords; + if (!Array.isArray(polygons) || !polygons.length) return; + if (!Number.isInteger(area.id) || typeof area.name !== "string") throw Error("Invalid OoT area"); + // A scene may span several floors. Search opens its largest mapped section. + const regions = polygons.map(ring => { + if (!Array.isArray(ring) || ring.length < 3 || !ring.every(p => Array.isArray(p) && p.length === 2 && p.every(Number.isFinite))) throw Error("Invalid OoT polygon"); + let cross = 0, cx = 0, cy = 0; + for (let n = 0; n < ring.length; n++) { + const a = ring[n], b = ring[(n + 1) % ring.length], c = a[0] * b[1] - b[0] * a[1]; + cross += c; cx += (a[0] + b[0]) * c; cy += (a[1] + b[1]) * c; + } + if (Math.abs(cross) < 1e-12) throw Error("Degenerate OoT polygon"); + return { area: Math.abs(cross), x: cx / (3 * cross) * 256, y: -cy / (3 * cross) * 256 }; + }).sort((a, b) => b.area - a.area); + const { x, y } = regions[0]; + if (x < 0 || x >= 256 || y < 0 || y >= 256) throw Error("OoT position outside the atlas"); + const clean = (s: string) => s.replace(/<[^>]+>/g, "").replace(/[^\x20-\x7e]/g, "'").trim(); + places.push({ id: `o_${scene ? `${scene.id}_r` : "s"}${area.id}`, name: clean(area.name).slice(0, 36), + detail: clean(scene ? `${scene.name} - Room ${area.id}` : "Ocarina of Time - Region").slice(0, 60), + space: "planar", x, y, zoom: scene ? 7 : 5, room: !!scene }); + } + for (const scene of scenes) { add(scene); for (const room of scene.rooms ?? []) add(room, scene); } + return places; +} diff --git a/host/serve-usb.ts b/host/serve-usb.ts index d98fcf8..ef596b9 100644 --- a/host/serve-usb.ts +++ b/host/serve-usb.ts @@ -10,7 +10,8 @@ const config = { ...overrides, cache: resolve(root, ".local/cache.sqlite"), atlas: resolve(root, ".local/hyrule"), - kind: process.argv.includes("--hyrule") ? "hyrule" : "osm", + atlases: { hyrule: resolve(root, ".local/hyrule"), oot: resolve(root, ".local/oot") }, + kind: process.argv.includes("--oot") ? "oot" : process.argv.includes("--hyrule") ? "hyrule" : "osm", }; const provider = connectOffloadUsbProvider({ directory: resolve(root, "dist/psplink"), diff --git a/host/serve.ts b/host/serve.ts index 53f5c28..7c5e581 100644 --- a/host/serve.ts +++ b/host/serve.ts @@ -6,11 +6,12 @@ const address = process.argv.slice(2).find(arg => !arg.startsWith("--")) ?? "192 const configPath = resolve(root, ".local/provider.json"); const overrides = await Bun.file(configPath).exists() ? await Bun.file(configPath).json() : {}; const config = { ...defaultConfig, ...overrides, format: overrides.format ?? (overrides.tileURL?.endsWith(".png") ? "raster" : defaultConfig.format), cache: resolve(root, ".local/cache.sqlite") }; -config.kind = process.argv.includes("--osm") ? "osm" : process.argv.includes("--hyrule") ? "hyrule" : config.kind ?? "hyrule"; +config.kind = process.argv.includes("--oot") ? "oot" : process.argv.includes("--osm") ? "osm" : process.argv.includes("--hyrule") ? "hyrule" : config.kind ?? "hyrule"; config.atlas = resolve(root, ".local/hyrule"); -if (config.kind === "hyrule" && !await Bun.file(resolve(config.atlas, "atlas.sqlite")).exists()) throw new Error("Run bun run prepare:hyrule before starting the Hyrule host"); +config.atlases = { hyrule: config.atlas, oot: resolve(root, ".local/oot") }; +if (config.kind !== "osm" && !await Bun.file(resolve(config.atlases[config.kind as "hyrule" | "oot"], "atlas.sqlite")).exists()) throw new Error(`Run bun run prepare:${config.kind} before starting the host`); const key = (await Bun.file(resolve(root, ".local/pair.key")).text()).trim(); connectOffloadProvider({ address, key, worker: new URL("./worker.ts", import.meta.url), isolation: "process", data: config, trace: process.env.POCKET_MAP_TRACE === "1", log: message => console.log(new Date().toISOString(), message) }); -console.log(`Pocket Map: ${config.kind === "hyrule" ? "Hyrule (local atlas)" : config.name} -> ${address}; ${config.kind === "hyrule" ? config.atlas : config.cache}`); +console.log(`Pocket Map: ${config.kind} -> ${address}; local atlases and OSM available through the map chooser`); diff --git a/host/service.ts b/host/service.ts index 5ed71b6..e98226e 100644 --- a/host/service.ts +++ b/host/service.ts @@ -4,7 +4,7 @@ import { MapProvider } from "./provider.ts"; import { AtlasProvider } from "./atlas.ts"; import type { ProviderConfig } from "./config.ts"; import type { NetworkFetch } from "./cache.ts"; -import type { MapKind } from "../shared/types.ts"; +import { ATLAS_KINDS, type MapKind } from "../shared/types.ts"; /** Selection is in each request, never mutable connection-wide state. Old * reads and lost command acknowledgements cannot cross databases on a switch. */ @@ -13,9 +13,12 @@ export class MapService { private selected: MapKind; constructor(config: ProviderConfig, network?: NetworkFetch) { this.providers.set("osm", new MapProvider(config, network)); - if (config.atlas && existsSync(join(config.atlas, "atlas.sqlite"))) this.providers.set("hyrule", new AtlasProvider(config.atlas)); + for (const kind of ATLAS_KINDS) { + const directory = config.atlases?.[kind] ?? (kind === "hyrule" ? config.atlas : undefined); + if (directory && existsSync(join(directory, "atlas.sqlite"))) this.providers.set(kind, new AtlasProvider(directory)); + } this.selected = config.kind ?? "osm"; - if (!this.providers.has(this.selected)) throw new Error("Prepare the Hyrule atlas first"); + if (!this.providers.has(this.selected)) { this.close(); throw new Error(`Run bun run prepare:${this.selected} first`); } } private resolve(source?: string) { if (source === undefined) return this.providers.get(this.selected)!; // Existing guest compatibility. diff --git a/package.json b/package.json index 69feef4..417f4ad 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "deploy": "bun scripts/deploy.ts", "sim": "bun scripts/sim.ts", "prepare:hyrule": "bun scripts/prepare-hyrule.ts", + "prepare:oot": "bun scripts/prepare-oot.ts", "test": "bun test --conditions=browser test/geo.test.ts test/provider.test.ts test/model.test.ts test/bookmarks.test.ts test/transport.test.ts test/atlas.test.ts test/navigation.test.ts test/vector.test.ts test/sd.test.ts test/storage-benchmark.test.ts", "check": "bun run test && runtime/node_modules/.bin/tsc --noEmit", "psp": "bun scripts/psp.ts", diff --git a/scripts/deploy-sd.py b/scripts/deploy-sd.py index 43950f5..752ca2c 100644 --- a/scripts/deploy-sd.py +++ b/scripts/deploy-sd.py @@ -3,15 +3,18 @@ parser = argparse.ArgumentParser(description=__doc__) parser.add_argument('host', nargs='?', default='192.168.8.102') +parser.add_argument('--map', choices=['hyrule', 'oot'], default='hyrule', dest='kind') parser.add_argument('--restart', action='store_true', help='Upload a new temporary copy from byte zero after a readback mismatch') args = parser.parse_args() root = pathlib.Path(__file__).resolve().parent.parent -meta = json.loads((root / '.local/3ds/manifest.json').read_text()) -if not isinstance(meta.get('name'), str) or not re.fullmatch(r'hyrule-[a-f0-9]{16}-v1', meta['name']): +pack_dir = root / '.local/3ds' / ('' if args.kind == 'hyrule' else args.kind) +meta = json.loads((pack_dir / 'manifest.json').read_text()) +if not isinstance(meta.get('name'), str) or not re.fullmatch(args.kind + r'-[a-f0-9]{16}-v1', meta['name']): raise ValueError('Invalid atlas identity') -local = root / '.local/3ds' / (meta['name'] + '.prp') +local = pack_dir / (meta['name'] + '.prp') +receipt_prefix = 'sd' if args.kind == 'hyrule' else 'sd-' + args.kind slot = hashlib.sha256(json.loads((root / 'pocket.json').read_text())['id'].encode()).hexdigest()[:16] base = '/pocketjs/assets/' + slot remote = base + '/' + local.name @@ -83,24 +86,25 @@ def received(block): sha256=digest.hexdigest(), expectedSha256=expected, firstDifference=first_difference) (root / 'dist/qa').mkdir(parents=True, exist_ok=True) -(root / 'dist/qa/sd-verify.json').write_text(json.dumps(verification, indent=2)) +(root / ('dist/qa/' + receipt_prefix + '-verify.json')).write_text(json.dumps(verification, indent=2)) if progress[0] != local.stat().st_size or digest.hexdigest() != expected: ftp.close() raise RuntimeError('Atlas readback differs; rerun with --restart: ' + json.dumps(verification)) if not installed: ftp.rename(partial, remote) # The small bootstrap pointer becomes visible only after its complete atlas. -bootstrap = root / '.local/3ds/hyrule.prp' +bootstrap = pack_dir / (args.kind + '.prp') +bootstrap_remote = base + '/' + args.kind + '.prp' data = bootstrap.read_bytes() with bootstrap.open('rb') as source: - ftp.storbinary('STOR ' + base + '/hyrule.prp.partial', source) + ftp.storbinary('STOR ' + bootstrap_remote + '.partial', source) actual = bytearray() -ftp.retrbinary('RETR ' + base + '/hyrule.prp.partial', actual.extend) +ftp.retrbinary('RETR ' + bootstrap_remote + '.partial', actual.extend) assert actual == data, 'Bootstrap readback differs' -ftp.rename(base + '/hyrule.prp.partial', base + '/hyrule.prp') +ftp.rename(bootstrap_remote + '.partial', bootstrap_remote) ftp.quit() receipt = dict(path=remote, bytes=local.stat().st_size, sha256=expected, verified=True, seconds=time.monotonic()-started) (root / 'dist/qa').mkdir(parents=True, exist_ok=True) -(root / 'dist/qa/sd-install.json').write_text(json.dumps(receipt, indent=2)) +(root / ('dist/qa/' + receipt_prefix + '-install.json')).write_text(json.dumps(receipt, indent=2)) print(json.dumps(receipt), flush=True) diff --git a/scripts/prepare-oot.ts b/scripts/prepare-oot.ts new file mode 100644 index 0000000..6b6aff3 --- /dev/null +++ b/scripts/prepare-oot.ts @@ -0,0 +1,91 @@ +import { createHash } from "node:crypto"; +import { existsSync, mkdirSync, readdirSync, renameSync, rmSync } from "node:fs"; +import { join, resolve } from "node:path"; +import { deflateRawSync } from "node:zlib"; +import { Database } from "bun:sqlite"; +import { createCanvas, loadImage } from "@napi-rs/canvas"; +import { packRGB } from "../host/provider.ts"; +import { OOT_REVISION, OOT_VIEW, OOT_GRIDS, OOT_LEVEL_OFFSET, ootPlaces } from "../host/oot-format.ts"; +import { ATLAS_FORMAT, atlasTileCount, atlasPackName, validAtlas, type AtlasManifest } from "../shared/atlas.ts"; +import type { MapInfo } from "../shared/types.ts"; + +const root = resolve(import.meta.dir, ".."), source = join(root, ".local/oot-source/repo"), + directory = join(root, ".local/oot"), output = join(directory, "atlas.sqlite"); +const revision = `${OOT_REVISION}/${OOT_VIEW}/v1`; +mkdirSync(directory, { recursive: true }); +if (existsSync(output) && existsSync(join(directory, "markers.sqlite")) && !process.argv.includes("--rebuild")) { + const db = new Database(output, { readonly: true }); + const manifest = JSON.parse((db.query("SELECT value FROM metadata WHERE key='manifest'").get() as { value: string }).value); db.close(); + if (!validAtlas(manifest) || manifest.revision !== revision) throw Error("Atlas version differs; use --rebuild"); + console.log(`Ocarina of Time ready: ${manifest.tiles} tiles, ${manifest.places} searchable regions and rooms`); + process.exit(0); +} +async function git(...args: string[]) { + const child = Bun.spawn(["git", ...args], { stdout: "pipe", stderr: "inherit" }); + const text = await new Response(child.stdout).text(); + if (await child.exited) throw Error("OoT source checkout failed"); + return text.trim(); +} +if (!existsSync(join(source, ".git"))) await git("clone", "--depth", "1", "--filter=blob:none", "--no-checkout", "https://github.com/Ecksters/OoT-Interactive-Map.git", source); +await git("-C", source, "sparse-checkout", "set", `maps/${OOT_VIEW}`, "js"); +if (await git("-C", source, "rev-parse", "HEAD") !== OOT_REVISION) await git("-C", source, "fetch", "--depth", "1", "origin", OOT_REVISION); +await git("-C", source, "checkout", "--detach", OOT_REVISION); +const assets = join(source, "maps", OOT_VIEW); +for (let z = 0; z < OOT_GRIDS.length; z++) { + const [w, h] = OOT_GRIDS[z], files = new Set(readdirSync(join(assets, String(z + OOT_LEVEL_OFFSET))).filter(f => f.endsWith(".png"))); + if (files.size !== w * h) throw Error(`Incomplete source level ${z}`); + for (let y = 0; y < h; y++) for (let x = 0; x < w; x++) if (!files.has(`map_tile_${x}_${y}.png`)) throw Error("Missing source tile"); +} +const places = ootPlaces(await Bun.file(join(source, "js/mapdata.js")).text()); +const home = places.find(p => p.name === "Hyrule Field" && !p.room); +if (!home || places.length < 400) throw Error("Incomplete OoT place index"); +const pending = join(directory, "atlas.build.sqlite"), markerPending = join(directory, "markers.build.sqlite"); +for (const path of [pending, markerPending]) if (existsSync(path)) rmSync(path); +const db = new Database(pending), markers = new Database(markerPending); +db.exec(`PRAGMA journal_mode=DELETE; PRAGMA synchronous=NORMAL; + CREATE TABLE metadata(key TEXT PRIMARY KEY,value TEXT NOT NULL); + CREATE TABLE tiles(z INTEGER,x INTEGER,y INTEGER,pixels BLOB NOT NULL,PRIMARY KEY(z,x,y)) WITHOUT ROWID; + CREATE VIRTUAL TABLE place_search USING fts5(id UNINDEXED,name,detail,x UNINDEXED,y UNINDEXED,zoom UNINDEXED,tokenize='unicode61 remove_diacritics 2');`); +markers.exec(`CREATE TABLE metadata(version TEXT,count INTEGER); + CREATE TABLE markers(id INTEGER PRIMARY KEY,name TEXT,kind TEXT,x REAL,y REAL,minZoom INTEGER,maxZoom INTEGER,priority INTEGER); + CREATE VIRTUAL TABLE bounds USING rtree(id,x0,x1,y0,y1);`); +const canvas = createCanvas(256, 256), ctx = canvas.getContext("2d"), + insert = db.query("INSERT INTO tiles VALUES (?,?,?,?)"), blank = deflateRawSync(new Uint8Array(131072), { level: 1 }); +let tiles = 0; +try { + for (let z = 0; z <= 7; z++) { + const [w, h] = OOT_GRIDS[z]; + for (let y = 0; y < 2 ** z; y++) { + const row: Uint8Array[] = []; + for (let x = 0; x < 2 ** z; x++) { + let pixels = blank; + if (x < w && y < h) { + const image = await loadImage(join(assets, String(z + OOT_LEVEL_OFFSET), `map_tile_${x}_${y}.png`)); + if (image.width !== 256 || image.height !== 256) throw Error("Invalid OoT source dimensions"); + ctx.fillStyle = "#000"; ctx.fillRect(0, 0, 256, 256); ctx.drawImage(image, 0, 0); + pixels = deflateRawSync(packRGB(ctx.getImageData(0, 0, 256, 256).data, 256, 256).pixels, { level: 1 }); + } + row.push(pixels); + } + db.transaction(() => { row.forEach((pixels, x) => { insert.run(z, x, y, pixels); tiles++; }); })(); + } + console.log(`OoT level ${z}: ${tiles}/${atlasTileCount(7)} tiles`); + } + const putPlace = db.query("INSERT INTO place_search VALUES (?,?,?,?,?,?)"), putMarker = markers.query("INSERT INTO markers VALUES (?,?,?,?,?,?,?,?)"), putBounds = markers.query("INSERT INTO bounds VALUES (?,?,?,?,?)"); + db.transaction(() => { for (const p of places) putPlace.run(p.id, p.name, p.detail, p.x, p.y, p.zoom); })(); + markers.transaction(() => { + places.forEach((p, n) => { putMarker.run(n + 1, p.name.slice(0, 24), /Village|Kokiri Forest/.test(p.name) ? "village" : "landmark", p.x, p.y, p.room ? 6 : 2, 7, p.room ? 5 : 0); putBounds.run(n + 1, p.x, p.x, p.y, p.y); }); + markers.query("INSERT INTO metadata VALUES (?,?)").run(revision, places.length); + })(); + const identity = createHash("sha256").update(`${ATLAS_FORMAT}/${revision}`).digest("hex").slice(0, 16); + const { room, ...start } = home; + const info: MapInfo = { source: identity, kind: "oot", name: "Ocarina of Time", attribution: "Nintendo | Peardian | Ecksters", + minZoom: 0, maxZoom: 7, space: "planar", local: true, worldUnits: 32768, + pack: atlasPackName("oot", identity), home: { ...start, zoom: 4 } }; + const manifest: AtlasManifest = { format: ATLAS_FORMAT, revision, tiles, places: places.length, info }; + if (!validAtlas(manifest)) throw Error("Incomplete OoT bake"); + db.query("INSERT INTO metadata VALUES ('manifest',?)").run(JSON.stringify(manifest)); + db.close(); markers.close(); renameSync(markerPending, join(directory, "markers.sqlite")); renameSync(pending, output); + await Bun.write(join(directory, "manifest.json"), JSON.stringify(manifest, null, 2)); + console.log(`Ocarina of Time ready: ${tiles} textures and ${places.length} searchable regions and rooms`); +} catch (error) { db.close(); markers.close(); throw error; } diff --git a/scripts/prepare-sd.ts b/scripts/prepare-sd.ts index 1e0d88e..fd2baba 100644 --- a/scripts/prepare-sd.ts +++ b/scripts/prepare-sd.ts @@ -2,12 +2,16 @@ import { Database } from "bun:sqlite"; import { inflateRawSync } from "node:zlib"; import { mkdirSync } from "node:fs"; import { resolve } from "node:path"; +import { validAtlas, atlasPackName } from "../shared/atlas.ts"; +import { ATLAS_KINDS, type AtlasKind } from "../shared/types.ts"; +const kind = (process.argv.find(a => a.startsWith("--map="))?.slice(6) ?? "hyrule") as AtlasKind; +if (!ATLAS_KINDS.includes(kind)) throw Error("Use --map=hyrule or --map=oot"); const root = resolve(import.meta.dir, ".."), runtime = resolve(process.env.POCKETJS_RUNTIME ?? resolve(root, "runtime")); const { createResourcePack, prepareTiledRGB565 } = await import( `${runtime}/tools/resource-pack.ts` ); -const db = new Database(resolve(root, ".local/hyrule/atlas.sqlite"), { +const db = new Database(resolve(root, `.local/${kind}/atlas.sqlite`), { readonly: true, }); const manifest = JSON.parse( @@ -17,25 +21,18 @@ const manifest = JSON.parse( } ).value, ); -if ( - manifest.format !== "pocket-map-atlas-rgb565-v1" || - manifest.tiles !== 21845 || - !/^[a-f0-9]{16}$/.test(manifest.info?.source ?? "") || - manifest.info.space !== "planar" || - manifest.info.minZoom !== 0 || - manifest.info.maxZoom !== 7 -) { +if (!validAtlas(manifest)) { db.close(); - throw Error("Unsupported Hyrule atlas"); + throw Error("Unsupported local atlas"); } -const out = resolve(root, ".local/3ds"); +const out = resolve(root, kind === "hyrule" ? ".local/3ds" : `.local/3ds/${kind}`); mkdirSync(out, { recursive: true }); -const name = `hyrule-${manifest.info.source}-v1`, - pack = createResourcePack(resolve(out, `${name}.prp`), 21846); +const name = atlasPackName(kind, manifest.info.source), + pack = createResourcePack(resolve(out, `${name}.prp`), manifest.tiles + 1); try { pack.add(Buffer.from(JSON.stringify(manifest))); const query = db.query("SELECT pixels FROM tiles WHERE z=? AND x=? AND y=?"); - for (let z = 0; z <= 7; z++) { + for (let z = 0; z <= manifest.info.maxZoom; z++) { for (let y = 0; y < 2 ** z; y++) for (let x = 0; x < 2 ** z; x++) { const row = query.get(z, x, y) as { pixels: Uint8Array } | null; @@ -50,8 +47,8 @@ try { } console.log(`SD atlas level ${z} complete`); } - const receipt = { ...pack.finish(), name, source: manifest.info.source }; - const bootstrap = createResourcePack(resolve(out, "hyrule.prp"), 1); + const receipt = { ...pack.finish(), kind, name, source: manifest.info.source }; + const bootstrap = createResourcePack(resolve(out, `${kind}.prp`), 1); try { bootstrap.add(Buffer.from(JSON.stringify(manifest))); bootstrap.finish(); diff --git a/scripts/sim.ts b/scripts/sim.ts index ee03fe9..9b1daa5 100644 --- a/scripts/sim.ts +++ b/scripts/sim.ts @@ -10,20 +10,21 @@ import { AtlasProvider } from "../host/atlas.ts"; import type { MapModel } from "../app/model.ts"; import type { OffloadImage } from "../runtime/contracts/spec/offload.ts"; const live = process.argv.includes("--live"); -const hyrule = process.argv.includes("--hyrule"); +const hyrule = process.argv.includes("--hyrule"), oot = process.argv.includes("--oot"); +const local = hyrule || oot, kind = oot ? "oot" : "hyrule"; const fixture = createCanvas(256, 256), c = fixture.getContext("2d"); c.fillStyle = "#e8e5d7"; c.fillRect(0, 0, 256, 256); c.fillStyle = "#b3ced7"; c.fillRect(170, 0, 86, 256); for (let x = 14; x < 170; x += 30) { c.fillStyle = "#fffdf4"; c.fillRect(x, 0, 5, 256); } for (let y = 20; y < 256; y += 32) { c.fillStyle = "#fffdf4"; c.fillRect(0, y, 170, 5); } c.fillStyle = "#b8cfa4"; c.fillRect(50, 70, 55, 48); c.fillStyle = "#5e705e"; c.font = "13px Arial"; c.fillText("Replay fixture", 30, 155); -const provider = hyrule ? new AtlasProvider(".local/hyrule") : new MapProvider({ ...defaultConfig, format: "raster", tileURL:"https://tile.openstreetmap.de/{z}/{x}/{y}.png", cache: live ? ".local/cache.sqlite" : ":memory:" }, live ? fetch : (async url => { +const provider = local ? new AtlasProvider(`.local/${kind}`) : new MapProvider({ ...defaultConfig, format: "raster", tileURL:"https://tile.openstreetmap.de/{z}/{x}/{y}.png", cache: live ? ".local/cache.sqlite" : ":memory:" }, live ? fetch : (async url => { if (String(url).includes("photon")) return new Response(JSON.stringify({ features: [ { properties: { osm_type: "R", osm_id: 1, name: "San Francisco", city: "San Francisco", country: "United States", type: "city" }, geometry: { coordinates: [-122.4075, 37.7879] } }, { properties: { osm_type: "N", osm_id: 2, name: "Museum of Modern Art", city: "San Francisco", type: "other" }, geometry: { coordinates: [-122.4007, 37.7859] } }, ] })); return new Response(fixture.toBuffer("image/png")); }) as typeof fetch); -const service = hyrule ? new MapService({ ...defaultConfig, format: "raster", tileURL:"https://tile.openstreetmap.de/{z}/{x}/{y}.png", cache: ":memory:", atlas: ".local/hyrule", kind: "hyrule" }, async () => new Response(fixture.toBuffer("image/png"))) : undefined; +const service = local ? new MapService({ ...defaultConfig, format: "raster", tileURL:"https://tile.openstreetmap.de/{z}/{x}/{y}.png", cache: ":memory:", atlas: ".local/hyrule", atlases: { hyrule: ".local/hyrule", oot: ".local/oot" }, kind }, async () => new Response(fixture.toBuffer("image/png"))) : undefined; const wasm = await createWasmUi(await Bun.file("runtime/hosts/web/pocketjs.wasm").arrayBuffer(), { width: 400, height: 480 }); const ops = wasm.ops; ops.hitTestBoundsAuxiliary = (x, y) => ops.hitTestBounds!(x + 40, y + 240); @@ -77,16 +78,16 @@ async function frames(n: number, buttons = 0, touch?: [number, number], analog = async function tap(x: number, y: number) { await frames(1, 0, [x, y]); await frames(1); } async function press(button: number) { await frames(1, button); await frames(1); } mkdirSync("dist/qa", { recursive: true }); -async function shot(name: string) { await Bun.write(`dist/qa/${hyrule ? "hyrule-" : live ? "live-" : "replay-"}${name}.png`, encodePNG(wasm.render().slice(), 400, 480)); } +async function shot(name: string) { await Bun.write(`dist/qa/${local ? `${kind}-` : live ? "live-" : "replay-"}${name}.png`, encodePNG(wasm.render().slice(), 400, 480)); } await frames(3); await shot("loading"); await frames(75); if (live && !s.front()!.tiles.every(t => s.frontView.state(t.input).status === "ready")) console.log(s.front()!.tiles.map(t => ({ input: t.input, state: s.frontView.state(t.input) }))); check(s.front()!.tiles.every(t => s.frontView.state(t.input).status === "ready"), "All visible tiles materialize through resource demand and native image tickets"); await shot("map"); await tap(30, 18); check(s.mode() === "search", "Search touch button opens local keyboard"); await shot("keyboard"); -if (hyrule) { +if (local) { check(s.annotations.rows().length > 0, "Real indexed game markers materialize as bounded map labels"); - check(s.planar() && s.info()?.local, "Hyrule opens as a local finite atlas with its own home and zoom bounds"); + check(s.planar() && s.info()?.local, "Local atlas opens with its own home and zoom bounds"); s.setQuery("Kakariko"); s.search(); await frames(40); await shot("results"); check(s.places().some(p => p.name.includes("Kakariko")), "SQLite place search finds Kakariko without an HTTP request"); s.go(); await frames(100); await shot("village"); @@ -102,11 +103,11 @@ if (hyrule) { const resume = s.camera.view(); await tap(180, 18); check(s.mode() === "sources", "Map header opens the live source chooser"); await shot("sources"); await tap(130, 53 + s.maps().findIndex(m => m.kind === "osm") * 30); await frames(100); - check(!s.planar() && s.front()!.tiles.every(t => t.input.source === s.info()!.source), "Hyrule switches to synthetic OSM without restarting the guest or daemon"); - await tap(180, 18); await tap(130, 53 + s.maps().findIndex(m => m.kind === "hyrule") * 30); await frames(100); - check(s.planar() && s.camera.view().x === resume.x && s.camera.view().zoom === resume.zoom, "Switching back restores Hyrule coordinates and zoom"); - s.setMode("layers"); await frames(2); await shot("layers"); s.choose(2); await frames(100); - check(s.annotations.layer() === "collectibles" && s.annotations.rows().every(m => m[2] !== "seed" && m[2] !== "treasure"), "Koroks and treasures remain hidden below their useful zoom range"); + check(!s.planar() && s.front()!.tiles.every(t => t.input.source === s.info()!.source), "Local atlas switches to synthetic OSM without restarting the guest or daemon"); + await tap(180, 18); await tap(130, 53 + s.maps().findIndex(m => m.kind === kind) * 30); await frames(100); + check(s.planar() && s.camera.view().x === resume.x && s.camera.view().zoom === resume.zoom, "Switching back restores local atlas coordinates and zoom"); + s.setMode("layers"); await frames(2); await shot("layers"); s.choose(oot ? 1 : 2); await frames(100); + if (!oot) check(s.annotations.layer() === "collectibles" && s.annotations.rows().every(m => m[2] !== "seed" && m[2] !== "treasure"), "Koroks and treasures remain hidden below their useful zoom range"); s.annotations.setLayer("all"); replyDelay = 30; s.camera.jump((32 * 256 - 300) / 64, (32 * 256 + 128) / 64, 6); await frames(180); @@ -194,6 +195,6 @@ if (hyrule) { await frames(50); } } -const receipt = { mode: hyrule ? "complete local Hyrule atlas, compiled guest + Wasm" : live ? "live OSM DE / Photon, compiled guest + Wasm" : "deterministic synthetic provider, compiled guest + Wasm", frames: tick, checks, maxPending, maxResident, maxStaging, ...(service ? service.diagnostics() : provider.diagnostics()), +const receipt = { mode: local ? `complete local ${kind} atlas, compiled guest + Wasm` : live ? "live OSM DE / Photon, compiled guest + Wasm" : "deterministic synthetic provider, compiled guest + Wasm", frames: tick, checks, maxPending, maxResident, maxStaging, ...(service ? service.diagnostics() : provider.diagnostics()), hardwareAcceptance: "pending", performance: "Replay validates behavior and budgets, not device frame time" }; -await Bun.write(`dist/qa/${hyrule ? "hyrule" : live ? "live" : "replay"}.json`, JSON.stringify(receipt, null, 2)); console.log(receipt); service?.close(); provider.close(); +await Bun.write(`dist/qa/${local ? kind : live ? "live" : "replay"}.json`, JSON.stringify(receipt, null, 2)); console.log(receipt); service?.close(); provider.close(); diff --git a/shared/atlas.ts b/shared/atlas.ts new file mode 100644 index 0000000..94c8fd5 --- /dev/null +++ b/shared/atlas.ts @@ -0,0 +1,20 @@ +import { validPosition, type MapInfo, type AtlasKind } from "./types.ts"; + +export const ATLAS_FORMAT = "pocket-map-atlas-rgb565-v1"; +export interface AtlasManifest { format: string; revision: string; tiles: number; places: number; info: MapInfo } +export const atlasTileCount = (maxZoom: number) => (4 ** (maxZoom + 1) - 1) / 3; +export const atlasPackName = (kind: AtlasKind, source: string) => `${kind}-${source}-v1`; + +/** A complete square pyramid fits the native pack's bounded index (65,536 entries). */ +export function validAtlas(value: unknown): value is AtlasManifest { + if (!value || typeof value !== "object") return false; + const a = value as AtlasManifest, i = a.info; + return a.format === ATLAS_FORMAT && !!i && i.space === "planar" && i.minZoom === 0 + && Number.isInteger(i.maxZoom) && i.maxZoom >= 1 && i.maxZoom <= 7 + && a.tiles === atlasTileCount(i.maxZoom) && typeof i.source === "string" && /^[a-f0-9]{16}$/.test(i.source) + && typeof i.name === "string" && i.name.length <= 40 && typeof i.attribution === "string" + && (i.pack === undefined || /^[a-z0-9-]{1,48}$/.test(i.pack)) + && (i.worldUnits === undefined || Number.isFinite(i.worldUnits) && i.worldUnits > 0) + && (i.home === undefined || validPosition(i.home) && i.home.space === "planar" + && Number.isFinite(i.home.zoom) && i.home.zoom >= 0 && i.home.zoom <= i.maxZoom); +} diff --git a/shared/types.ts b/shared/types.ts index 73599c9..e712056 100644 --- a/shared/types.ts +++ b/shared/types.ts @@ -1,8 +1,12 @@ -export type MapKind = "hyrule" | "osm"; +export const MAP_KINDS = ["osm", "hyrule", "oot"] as const; +export type MapKind = typeof MAP_KINDS[number]; +export const ATLAS_KINDS = ["hyrule", "oot"] as const; +export type AtlasKind = typeof ATLAS_KINDS[number]; +export const MAP_NAMES: Record = { osm: "OpenStreetMap", hyrule: "Hyrule - Breath of the Wild", oot: "Ocarina of Time" }; export type Position = { space?: "mercator"; lat: number; lon: number } | { space: "planar"; x: number; y: number }; export type Place = Position & { id: string; name: string; detail: string; zoom: number }; export interface MapInfo { source: string; name: string; attribution: string; maxZoom: number; render?: "mesh"; prefetch?: boolean; dataZoom?: number; minZoom?: number; - space?: "mercator" | "planar"; home?: Place; local?: boolean; markers?: boolean; kind?: MapKind; maps?: { kind: MapKind; name: string }[] } + space?: "mercator" | "planar"; home?: Place; local?: boolean; markers?: boolean; kind?: MapKind; pack?: string; worldUnits?: number; maps?: { kind: MapKind; name: string }[] } export interface TileInput { source: string; z: number; x: number; y: number } export type SearchInput = Position & { query: string; source?: string }; export interface BookmarkPage { items: Place[]; offset: number; total: number } diff --git a/test/atlas.test.ts b/test/atlas.test.ts index c62bb6f..5e964b3 100644 --- a/test/atlas.test.ts +++ b/test/atlas.test.ts @@ -5,6 +5,68 @@ import { mkdtempSync, rmSync } from "node:fs"; import { tmpdir } from "node:os"; import { join } from "node:path"; import { AtlasProvider, ATLAS_FORMAT } from "../host/atlas.ts"; +import { atlasTileCount, validAtlas } from "../shared/atlas.ts"; +import { ootPlaces } from "../host/oot-format.ts"; +import { MapService } from "../host/service.ts"; +import { defaultConfig } from "../host/config.ts"; +import { mkdirSync } from "node:fs"; + +test("OoT Simple CRS coordinates match baked tile indices and source data is parsed as literals", () => { + const polygon = [[[.25, -.125], [.5, -.125], [.5, -.375], [.25, -.375]]]; + const scenes = [{ id: 1, name: "Kakariko Village", childAngledCoords: polygon, + rooms: [{ id: 2, name: "Windmill", childAngledCoords: polygon }] }]; + const places = ootPlaces(`throw new Error('must never execute');\nvar mapData = ${JSON.stringify(scenes)};\n`); + expect(places).toHaveLength(2); + expect(places[0]).toMatchObject({ x: 96, y: 64, space: "planar", room: false }); + expect(places[1]).toMatchObject({ id: "o_1_r2", name: "Windmill", detail: "Kakariko Village - Room 2", zoom: 7, room: true }); + // Upstream z15 and app z7 point at the same source pixels. + expect(places[0].x * 2 ** 7).toBe(.375 * 2 ** 15); + expect(places[0].y * 2 ** 7).toBe(.25 * 2 ** 15); + expect(() => ootPlaces("var mapData = (() => [])();")).toThrow(); + expect(() => ootPlaces(`var mapData = ${JSON.stringify([{ ...scenes[0], childAngledCoords: [[[0, 0], [1, 1], [2, 2]]] }])};`)).toThrow("Degenerate"); +}); + +test("three providers keep tiles, search, and saved-place retries scoped to their own source", async () => { + const root = mkdtempSync(join(tmpdir(), "map-catalog-")); + const ids = { hyrule: "123456789abcdef0", oot: "abcdef0123456789" }; + try { + for (const kind of ["hyrule", "oot"] as const) { + const path = join(root, kind); mkdirSync(path); + const db = new Database(join(path, "atlas.sqlite")), maxZoom = kind === "oot" ? 3 : 7; + db.exec(`CREATE TABLE metadata(key TEXT PRIMARY KEY,value TEXT); + CREATE TABLE tiles(z INTEGER,x INTEGER,y INTEGER,pixels BLOB,PRIMARY KEY(z,x,y)); + CREATE VIRTUAL TABLE place_search USING fts5(id UNINDEXED,name,detail,x UNINDEXED,y UNINDEXED,zoom UNINDEXED);`); + const manifest = { format: ATLAS_FORMAT, tiles: atlasTileCount(maxZoom), info: { + source: ids[kind], name: kind, attribution: "Fixture", kind, space: "planar", minZoom: 0, maxZoom, local: true } }; + expect(validAtlas(manifest)).toBe(true); + expect(validAtlas({ ...manifest, tiles: manifest.tiles + 1 })).toBe(false); + expect(validAtlas({ ...manifest, info: { ...manifest.info, maxZoom: 8 } })).toBe(false); + db.query("INSERT INTO metadata VALUES ('manifest',?)").run(JSON.stringify(manifest)); + const pixels = new Uint8Array(131072).fill(kind === "oot" ? 17 : 29); + db.query("INSERT INTO tiles VALUES (0,0,0,?)").run(deflateRawSync(pixels)); + db.query("INSERT INTO place_search VALUES (?,?,?,?,?,?)").run("village", "Kakariko Village", kind, kind === "oot" ? 70 : 150, 80, 3); + db.close(); + } + const service = new MapService({ ...defaultConfig, cache: ":memory:", kind: "oot", atlases: { hyrule: join(root, "hyrule"), oot: join(root, "oot") } }, () => { throw Error("Unexpected HTTP"); }); + try { + const m = service.methods(), info = JSON.parse(m["map.info"]("{}")); + expect(info.kind).toBe("oot"); expect(info.maps.map((v: any) => v.kind)).toEqual(["osm", "hyrule", "oot"]); + for (const kind of ["hyrule", "oot"] as const) { + const place = JSON.parse(await m["map.search"](JSON.stringify({ source: ids[kind], query: "Kakariko", space: "planar", x: 0, y: 0 })))[0]; + expect(place.detail).toBe(kind); + const image = await m["map.tile"](JSON.stringify({ source: ids[kind], z: 0, x: 0, y: 0 })); + expect(image.pixels[0]).toBe(kind === "oot" ? 17 : 29); + const command = JSON.stringify({ source: ids[kind], kind: "save", op: "shared_retry_token", place }); + const receipt = m["bookmarks.command"](command); + m["map.info"]('{"kind":"osm"}'); + expect(m["bookmarks.command"](command)).toBe(receipt); + expect(JSON.parse(m["bookmarks.list"](JSON.stringify({ source: ids[kind], offset: 0 }))).total).toBe(1); + } + expect(() => m["map.tile"](JSON.stringify({ source: ids.oot, z: 4, x: 0, y: 0 }))).toThrow("Invalid atlas tile"); + expect(() => m["map.info"]('{"kind":"missing"}')).toThrow(); + } finally { service.close(); } + } finally { rmSync(root, { recursive: true, force: true }); } +}); test("local atlas reads packed textures and searches planar places without an HTTP provider", () => { const dir = mkdtempSync(join(tmpdir(), "pocket-map-atlas-")), db = new Database(join(dir, "atlas.sqlite")); diff --git a/test/sd.test.ts b/test/sd.test.ts index ee65f7f..da9d4b2 100644 --- a/test/sd.test.ts +++ b/test/sd.test.ts @@ -10,7 +10,7 @@ import { import { runServicePumps } from "../runtime/framework/src/services.ts"; import { createMap } from "../app/model.ts"; -test("SD bootstrap opens and navigates new Hyrule tiles while the Mac is offline", () => { +test("SD discovery keeps legacy Hyrule and OoT isolated and switches both without a Mac", () => { resetFrameHooks(); const replies: string[] = [], addresses: string[] = [], @@ -20,6 +20,7 @@ test("SD bootstrap opens and navigates new Hyrule tiles while the Mac is offline uploaded = 0, remote = 0; const source = "1234567890abcdef"; + const ootSource = "fedcba0987654321"; const atlas = { format: "pocket-map-atlas-rgb565-v1", tiles: 21845, @@ -47,7 +48,7 @@ test("SD bootstrap opens and navigates new Hyrule tiles while the Mac is offline addresses.push(`${name}/${entry}`); replies.push( JSON.stringify( - name === "hyrule" + name === "oot" ? { id, payload: JSON.stringify({ ...atlas, tiles: 5461, info: { ...atlas.info, source: ootSource, kind: "oot", name: "Ocarina of Time", maxZoom: 6, pack: `oot-${ootSource}-v1` } }) } : name === "hyrule" ? { id, payload: JSON.stringify(atlas) } : { id, image: { token: ++token, width: 256, height: 256 } }, ), @@ -108,8 +109,27 @@ test("SD bootstrap opens and navigates new Hyrule tiles while the Mac is offline expect(s.tiles.stats().entries).toBeLessThanOrEqual(40); expect(addresses[0]).toBe("hyrule/0"); expect( - addresses.slice(1).every((a) => a.startsWith(`hyrule-${source}-v1/`)), + addresses.slice(1).filter(a => a !== "oot/0").every((a) => a.startsWith(`hyrule-${source}-v1/`)), ).toBe(true); + expect(s.maps().map(m => m.kind)).toEqual(["hyrule", "oot"]); + const hyrulePosition = { ...s.camera.view() }; + s.switchMap("oot"); frames(90); + expect(s.info()?.kind).toBe("oot"); + expect(s.info()?.maxZoom).toBe(6); + expect(s.localMapAvailable()).toBe(true); + expect(s.front()!.tiles.every(t => t.input.source === ootSource && s.frontView.state(t.input).status === "ready")).toBe(true); + s.camera.jump(110, 120, 6); frames(90); + expect(addresses.some(a => a.startsWith(`oot-${ootSource}-v1/`))).toBe(true); + s.switchMap("hyrule"); frames(90); + expect(s.camera.view()).toMatchObject(hyrulePosition); + expect(s.front()!.tiles.every(t => t.input.source === source && s.frontView.state(t.input).status === "ready")).toBe(true); + s.switchMap("oot"); frames(90); + expect(s.camera.view()).toMatchObject({ x: 110, y: 120, zoom: 6 }); + s.switchMap("osm"); frames(10); + expect(s.info()?.kind).toBe("oot"); + expect(s.switching()).toBe(false); + expect(s.sourceError()).toContain("Connect your Mac"); + expect(remote).toBe(0); dispose(); expect(freed.length).toBe(uploaded); expect(released.length).toBe(uploaded); From 34859baf440d6af91a58247eb38ba2e0e3b4fa5f Mon Sep 17 00:00:00 2001 From: "Yifeng \"Evan\" Wang" <7312949+doodlewind@users.noreply.github.com> Date: Tue, 8 Sep 2026 11:40:46 -0700 Subject: [PATCH 2/3] fix(map): show distinct full Zelda game titles --- app/model.ts | 5 +++-- app/ui.tsx | 4 ++-- shared/types.ts | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/app/model.ts b/app/model.ts index f53d5c3..d4a65a2 100644 --- a/app/model.ts +++ b/app/model.ts @@ -88,10 +88,11 @@ export function createMap(io = offload(), viewport = { width: 400, height: 240 } const selectedIndex = () => mode() === "saved" ? saved.selection() : selection(); function select(index: number) { const n = Math.max(0, Math.min(rows().length - 1, index)); if (mode() === "saved") saved.setSelection(n); else setSelection(n); } prediction.reset(camera.view()); + const mapName = () => { const value = info(); return value?.kind ? MAP_NAMES[value.kind] : value?.name ?? "OpenStreetMap"; }; const maps = createMemo(() => { const catalog = [...(info()?.maps ?? [])]; for (const kind of ATLAS_KINDS) { const local = installed()[kind]; if (local && !catalog.some(m => m.kind === kind)) catalog.push({ kind, name: local.name }); } - return catalog; + return catalog.map(m => ({ ...m, name: MAP_NAMES[m.kind] })); }); const labelLayers = () => vector() ? [LAYERS[0],LAYERS[4]] : info()?.kind === "oot" ? [LAYERS[0], { id: "travel" as const, name: "Regions & dungeon rooms" }, LAYERS[4]] : LAYERS; const choices = () => mode() === "sources" ? maps().map(m => m.name) : labelLayers().map(l => l.name); @@ -282,7 +283,7 @@ export function createMap(io = offload(), viewport = { width: 400, height: 240 } } if (back() && front()?.tiles.every(t => frontView.state(t.input).status === "ready")) setBack(undefined); }); - return { viewport, io, runtime, tiles, vector, labels, frontView, backView, info, planar, online, zoomHeld, switching, sourceError, maps, choices, choosing, choose, openSources, switchMap, annotations, status, mode, setMode, query, setQuery, submitted, results, places, selection, setSelection, pin, menu, menuIndex, + return { viewport, io, runtime, tiles, vector, labels, frontView, backView, info, mapName, planar, online, zoomHeld, switching, sourceError, maps, choices, choosing, choose, openSources, switchMap, annotations, status, mode, setMode, query, setQuery, submitted, results, places, selection, setSelection, pin, menu, menuIndex, localMapAvailable, tileStorage, useLocalTiles, setLocalTiles(value: boolean) { runtime.cancel(); setUseLocalTiles(value); tiles.clear(); }, shift, symbols, front, back, camera, saved, typing, listing, rows, selectedIndex, select, saveCurrent, lookAhead, search, openSearch, go, zoom, key, dismiss, runMenu, clearBack: () => setBack(undefined), diff --git a/app/ui.tsx b/app/ui.tsx index 68db8b3..9506673 100644 --- a/app/ui.tsx +++ b/app/ui.tsx @@ -132,9 +132,9 @@ function Deck(p: { s: MapModel }) { {search} - {typing() ? `${(naming() ? p.s.saved.name() : p.s.query()).slice(-31)}|` : saved() ? "Saved on your paired Mac" : results() ? p.s.query().slice(0, 32) : p.s.localMapAvailable() && !p.s.online() ? "Map on SD - Mac for search & saves" : p.s.online() ? p.s.planar() ? p.s.info()?.name ?? "Local atlas" : "Explore with your Nintendo 3DS" : "Waiting for paired Mac"} + {typing() ? `${(naming() ? p.s.saved.name() : p.s.query()).slice(-31)}|` : saved() ? "Saved on your paired Mac" : results() ? p.s.query().slice(0, 32) : p.s.localMapAvailable() && !p.s.online() ? "Map on SD - Mac for search & saves" : p.s.online() ? p.s.planar() ? p.s.mapName() : "Explore with your Nintendo 3DS" : "Waiting for paired Mac"} - + {(name, i) => p.s.choose(i())} />} diff --git a/shared/types.ts b/shared/types.ts index e712056..34e533b 100644 --- a/shared/types.ts +++ b/shared/types.ts @@ -2,7 +2,7 @@ export const MAP_KINDS = ["osm", "hyrule", "oot"] as const; export type MapKind = typeof MAP_KINDS[number]; export const ATLAS_KINDS = ["hyrule", "oot"] as const; export type AtlasKind = typeof ATLAS_KINDS[number]; -export const MAP_NAMES: Record = { osm: "OpenStreetMap", hyrule: "Hyrule - Breath of the Wild", oot: "Ocarina of Time" }; +export const MAP_NAMES: Record = { osm: "OpenStreetMap", hyrule: "Breath of the Wild", oot: "Ocarina of Time" }; export type Position = { space?: "mercator"; lat: number; lon: number } | { space: "planar"; x: number; y: number }; export type Place = Position & { id: string; name: string; detail: string; zoom: number }; export interface MapInfo { source: string; name: string; attribution: string; maxZoom: number; render?: "mesh"; prefetch?: boolean; dataZoom?: number; minZoom?: number; From 457a33568a96bc44c24c4f7a7cc55cd2d2cba592 Mon Sep 17 00:00:00 2001 From: "Yifeng \"Evan\" Wang" <7312949+doodlewind@users.noreply.github.com> Date: Tue, 8 Sep 2026 12:58:09 -0700 Subject: [PATCH 3/3] feat(runtime): enable live 3DS guest updates --- README.md | 42 +++++++++++++++++++++++++++++++++++------- package.json | 3 ++- runtime | 2 +- scripts/build.ts | 3 ++- scripts/update.ts | 14 ++++++++++++++ 5 files changed, 54 insertions(+), 10 deletions(-) create mode 100644 scripts/update.ts diff --git a/README.md b/README.md index e73399b..b6b63ae 100644 --- a/README.md +++ b/README.md @@ -57,13 +57,41 @@ Exit ftpd and open **Pocket Map** in HBL. The deployment script installs only th ### Updating this build -**The current `POCKETJS_OFFLOAD` native build excludes the development server -and package storage path.** PocketJS's ordinary 3DS runtime supports guest -updates on port 8131, but that connection is unavailable in this build, even -with a valid development key. Rebuild with `bun run 3ds`, deploy through ftpd, -and restart Pocket Map for guest or native changes. Mac-only provider changes -need only a daemon restart. The offload UI path omits synchronous SD package -work; enabling safe development updates here needs native host integration. +**This build supports runtime guest updates on port 8131 alongside offload and +SD map reads.** Install the updated `.3dsx` once with `bun run 3ds` and +`bun run deploy <3ds-ip>`. While ftpd is open, import the console's development +pairing key into this checkout (the existing device key is preserved): + +```sh +bun runtime/tools/3ds-dev.ts pair --host <3ds-ip> --ftp-port 5000 +``` + +Exit ftpd and open Pocket Map. Subsequent JS and baked UI asset changes use: + +```sh +bun run update # rebuild .pocket and discover the paired runtime +bun run update 192.168.8.102 # explicit IP when broadcast discovery is unavailable +bun runtime/tools/3ds-dev.ts probe --host 192.168.8.102 --out dist/qa/runtime.png +``` + +`L + R + SELECT` opens the native runtime menu. `X` requests a screenshot from +an attached client; `B` closes the menu. `L + R + X` checks an SD-staged +`pending.pocket`. The map's offload pairing and the runtime's device-wide +development pairing are separate keys. + +**A native worker performs transfer, SD writes, hashing, admission and durable +commit.** The existing map keeps rendering during upload. At a GPU-idle +boundary, the runtime restarts JS and the UI tree, fences old offload/SD +requests and releases their GPU resources. It accepts the package only after +its first GPU frame retires and its generation is committed. Rejected packages +restore the previous guest; saved places and prepared terrain packs persist. +The current map position and other in-memory UI state restart with the guest. + +**Guest updates are limited to 8 MiB and the embedded app's exact native plan.** +Native runtime, capability, font configuration, screen configuration or plan +changes require another `.3dsx` deployment. Terrain `.prp` updates still use +`deploy:sd`; they do not need to be retransferred for UI changes. Mac-only +provider changes need only a daemon restart. For request timing and socket backpressure diagnostics, start the host with `POCKET_MAP_TRACE=1 bun run host <3ds-ip>`. It records request IDs, method names, diff --git a/package.json b/package.json index 417f4ad..938ea25 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,8 @@ "host:psp": "bun host/serve-usb.ts", "test:psp:watch": "bun scripts/watch-psp-smoke.ts", "prepare:sd": "bun scripts/prepare-sd.ts", - "deploy:sd": "python3 scripts/deploy-sd.py" + "deploy:sd": "python3 scripts/deploy-sd.py", + "update": "bun scripts/update.ts" }, "dependencies": { "@mapbox/vector-tile": "3.0.0", diff --git a/runtime b/runtime index e2226e8..071b2bd 160000 --- a/runtime +++ b/runtime @@ -1 +1 @@ -Subproject commit e2226e8f69990dd8361d79aabf47bcbedc44786d +Subproject commit 071b2bd5f6e51777e92dde2dd686c177027156aa diff --git a/scripts/build.ts b/scripts/build.ts index f29f4aa..c98a674 100644 --- a/scripts/build.ts +++ b/scripts/build.ts @@ -7,7 +7,8 @@ const plan = resolve3dsBuildPlan(await Bun.file(resolve(root, "pocket.json")).js mkdirSync(resolve(root, "dist"), { recursive: true }); const path = resolve(root, "dist/plan.json"); writeFileSync(path, JSON.stringify(plan, null, 2)); await build3ds([`--plan=${path}`, `--project-root=${root}`, ...process.argv.slice(2)]); -for (const ext of ["3dsx", "pocket", "cia"]) { +// A guest-only build must never copy a stale native binary over dist. +for (const ext of process.argv.includes("--pocket-only") ? ["pocket"] : ["3dsx", "pocket", "cia"]) { const from = resolve(root, `runtime/dist/3ds/pocketmap-main.${ext}`); if (existsSync(from)) copyFileSync(from, resolve(root, `dist/pocketmap-main.${ext}`)); } diff --git a/scripts/update.ts b/scripts/update.ts new file mode 100644 index 0000000..6f2dbe2 --- /dev/null +++ b/scripts/update.ts @@ -0,0 +1,14 @@ +import { resolve } from "node:path"; + +const root = resolve(import.meta.dir, ".."); +const args = process.argv.slice(2); +if (args.length > 1 || args[0]?.startsWith("-")) { + throw new Error("Usage: bun run update [3ds-ip] (Pocket Map must be running)"); +} +async function run(args: string[]): Promise { + const child = Bun.spawn([process.execPath, ...args], { cwd: root, stdin: "inherit", stdout: "inherit", stderr: "inherit" }); + if (await child.exited !== 0) throw new Error(`Command failed: ${args[0]}`); +} +await run(["scripts/build.ts", "--pocket-only"]); +await run(["runtime/tools/3ds-dev.ts", "push", "--package", resolve(root, "dist/pocketmap-main.pocket"), + ...(args[0] ? ["--host", args[0]] : [])]);