- CSS 64.4%
- Shell 24.7%
- Makefile 7.4%
- HTML 3.5%
blackICE
A cyberpunk Sokoban that runs in the browser on the Sigil WASM bridges. You are a runner pushing a data payload through hostile ICE to a breach/extraction point: push data-blocks onto ports, collect fragments, open security gates with matching access tokens, dodge a patrolling daemon and corrupted-sector hazards, and reach extraction before the move-based trace timer runs out.
It is a real game and a WASM-bridge validator (one of three consumers gating
the Sigil browser release). See docs/wasm-bridge-report.md
for the bridge findings and the zero-JS-wiring browser-app pattern it prototypes.
Architecture
- Pure rules —
src/blackice/{grid,level,game,levels}.sgl. Zero DOM/bridge references; a future canvas/WebGL renderer drops in without touching these.grid— cell-index geometry and directions.level— the compact text level-string format and its parser.game— game state, the per-move turn (push/gate/hazard/daemon/trace), win/lose resolution, and an undo history stack.levels— the 8-level campaign as level strings.
- Rendering —
src/blackice/render.sgl. The only module that touches the DOM bridge: game/menu state → SXML, mounted under#appviasigil-wasm-dom. - App glue —
src/blackice/main.sgl. App state, input dispatch (sigil-web-dispatch-event), andsigil-browserlocal-storage persistence. - Generic loader —
web/sigil-web-app.js. App-agnostic: boots the runtime and forwards DOM events into Sigil. The app author writes no JS.
Controls
Keyboard: Arrows / WASD move · . wait · U undo · R restart · ESC
sector select · ENTER jack in / next sector.
Touch (mobile): swipe on the grid to move, or use the on-screen D-pad and action buttons (shown automatically on touch devices). Tap a sector to jack in; tap the win/lose banner (or its button) to advance or retry. All touch input is routed through the same key-dispatch path as the keyboard by the generic loader, so the game logic stays input-agnostic.
Build
The WASM/browser release is held pending validation, so blackICE builds against the live monorepo tree via redirects (not a tagged release):
guix shell -m ../sigil/manifest.scm -- \
../sigil/build/dev/bin/sigil build --config web \
--redirects ./dev-redirects.sgl
Output lands in build/web/ (index.html, blackice.wasm, bridge assets, and
the bundled WASI library files). If you rebuild the dev sigil, rm -rf build
first. The incremental cache does not invalidate on a compiler change (see the
report, F8).
Run
Serve the generated web output over HTTP (file:// won't work) and open it:
guix shell -m ../sigil/manifest.scm -- \
../sigil/build/dev/bin/sigil serve --dir build/web
Levels
Levels are plain strings (src/blackice/levels.sgl), so the format doubles as a
shareable/editable representation. Glyphs: # wall · . floor · @ player ·
$ data-block · o port · * block-on-port · f fragment · X extraction ·
^ hazard · D daemon · r/g/b/y token · R/G/B/Y gate. Header lines:
id:, name:, trace: (move budget), route: (daemon patrol, e.g. rrddll).