Home - joric/sokoban GitHub Wiki

Welcome to the sokoban wiki!

  • Live demo: https://joric.github.io/sokoban/
  • This game uses portions of Dizzy Warehouse (1996), Lens (1997) and Fortnoks (1998).
  • This game uses YASS solver. Read Solvers article about automatic solvers.

Keyboard Shortcuts

  • Z / X to undo/redo.
  • Shift + Z / X and to browse levels.
  • W, A, S, D or cursor arrows to move.
  • 1, 2, 3 to switch tileset.
  • R to reset level.
  • E to solve.
  • F (or double tap) to go fullscreen.

Trivia

  • The original Dizzy Warehouse and Lens games have unsolvable level 16.
  • Fortnoks makes level 16 solvable by removing the wall at (5,2).
  • There are two Fortnoks versions in the wild, with sound, and without sound.
  • All games allow level switching with the Z and X keys while holding Shift.
  • Sources are somewhat incomplete, most resource data files are pre-baked.
  • Dizzy Warehouse was popularized by the Thomas Pynchon's book "Bleeding Edge" (2003).

Games

Dizzy Warehouse

  • Walls, gems, game panel, 16x16 font use original graphics.
  • Dizzy animation is original but inspired by "Fast Food" (Codemasters, 1989).
  • Most of the logo graphics is from "Dizzy III - Fantazy World" (Codemasters, 1989).
  • The "bang" animation is from "West Bank" (Gremlin Graphics, 1985).

Lens

PC graphics was packed using splink.exe that links Autodesk Animator sprites (.cel) together. It doesn't have sources, but the format is simple. It's just width, height, data size (2 bytes each, so 6 bytes) and bitmap data, one byte per pixel. Palette data (256 * 3 = 768 bytes) is stored independently in the another file.

Lens uses various sources, sometimes with an altered (rotated) palette.

Fortnoks

  • Walls - original, hand-painted.
  • Font and logo - original, rendered in 3D Studio, DOS version (1990).
  • Gems - gem sprites from Xixit (1995) by Optik Software, Inc.

Music

The Fortnoks music is from Duke Nukem 3D, called "Grab Bag" by Lee Jackson (download here). The archive contains two files, GM1 and GS1, 28956 and 28961 bytes respectively. The game file (FORTNOKS.MID) is smaller (14287 bytes), probably grabbed directly from the game resources. It is subject to copyright, so it requires disclaimers:

Grabbag (Duke Nukem Theme) - composed by Lee Jackson. Copyright (©)1995 Lee Jackson. All rights reserved.

Duke Nukem is (©) 1999-2011 - Gearbox Software, LLC. All rights reserved.
Duke Nukem, the Duke Nukem nuclear symbol, Duke Nukem Forever, Gearbox
Software and the Gearbox logo are registered trademarks of Gearbox Software,
LLC in the U.S. and/or other countries and used here under license.

Remixes: Brandon Blume, Darkman. Xixit music is unused, but it's rippable as s3m with ripper4: https://youtu.be/zQZCZ0GGZds

Sound Effects

Fortnoks uses BSWB (Bells, Whistles and Sound Boards) library for sounds.

Samples use the original GDM (General Digital Music) format which is similar to S3M modules. The easiest way to extract samples from it is to use existing converters/players, e.g. MegaZeux. MegaZeux has gdm2s3m converter:

After converting FORTNOKS.GDM to .s3m you can open it in OpenMPT and save samples as .wav:

image

There is no sequence or patterns, just a few samples:

id file name ofs
17 Yeah.wav end_level 0x10
18 Brlrlrlm.wav place_gem 0x11
19 hahaha.wav fail_level 0x12
20 tumtum.wav move_gem 0x13
21 Builthit.wav select_item 0x14
22 Gbelev02.wav move_in_menu, activate_menu 0x15
23 Item15.wav deactivate_menu 0x16

Maps

All 20 16x10 maps in these games are original (mostly because of the screen size limitation at the time).

PWA

Web version supports PWA (progressive web application), you can install it to work offline.

Assuming you already composed your own manifest.json, you can use mapbox-cli to add offline PWA support, namely sw.js and workbox-*.js (map files are debugging only, you don't need them).

Run this in project root:

npm install workbox-cli --global
workbox wizard # then type . as root directory
workbox generateSW
git add sw.js workbox-*.js

Then you also have to put this into beginning of your js init code:

if ('serviceWorker' in navigator) { navigator.serviceWorker.register('sw.js'); }

Solvers

Moved to Solvers.

⚠️ **GitHub.com Fallback** ⚠️