SOURCE / PINNED RELEASE
Made of little things.
Black Site
- Release
- 666bc7c74ebd…
- Author-recorded commit
- 05e95af79676…
- License
- LICENSE
- Author’s source reference
- nostr://npub12lm3rxsva8kfempyjkxupt09e02n3fezurkyadyqfejdc5e0r2kscqty6r/wss%3A%2F%2Fgit.napplet.soy%2F/n-d2225ddc391
Archive hash verified: 1544e072e245c4a8…. The source-to-build association is the author’s claim; it has not been independently rebuilt.
# Listing media
- `icon.png` (512×512) is the napplet icon, selected by `icon` in `napplet.json`.
`icon.svg` is its editable source: an operator's 100° field of view picking out a
hostile while a wall keeps the rest dark. Re-render it to a 512×512 PNG after edits;
manifests accept PNG, JPEG or WebP icons only, not SVG.
- `screenshots/` holds 1200×750 gameplay frames from each map plus the map select
screen, for galleries, store pages and posts. The listing cover that `soyli publish`
signs is still `preview.png` in the project root (`preview.image`).
## Capture recipe
Frames are real captures of the built napplet on Normal difficulty with the default
Assaulter loadout, in a 1200×750 sandboxed `allow-scripts` iframe like
`scripts/smoke-frame.mjs` uses. Each run selects the map, deploys, then drives the
player with real key and mouse input: follow the game's `findPath` toward the nearest
hostile and hold fire whenever it is in line of sight. Frames are taken every 600 ms
and the clearest firefight on each map was kept by hand.
To reach `G`, `findPath` and `los` from the driver, the capture build temporarily
prepends one line to `src/game-bridge.js` and builds into a scratch directory:
```js
globalThis.__BS = () => ({ G, W, H, VIEW_SCALE, findPath, los, SOLID_SHOT });
```
Don't commit that line; the shipped build doesn't expose game state.
The game shows a "make the window bigger" notice below 560×380, so there is no portrait
phone screenshot.
