Add ScummVM support and generalize manifest zip lookup

Add scummvm to the Dockerfile. Its binary lives at /usr/games/scummvm
(Debian's convention for game packages), not reliably on $PATH under a
non-login shell, so manifests reference it by absolute path.

Generalize the manifest schema from a bare "zip" filename (implicitly
under Games\dosbox\ on the SMB share) to "zip_path" (a full path
relative to the share root), since the SCUMM games' zips live in their
own folders (Games\Monkey Island\, Games\Indiana Jones\, etc.) rather
than being colocated with their manifest like stuntcar/t7g were.
Manifests themselves still all live in the Games\dosbox\ catalog
directory regardless of where the actual zip sits.

Added and verified (install/start/stop/uninstall via monkey2) manifests
for: monkey, monkey2, atlantis, indy3, tentacle. Skipped the German CD
release of Day of the Tentacle (loose files at the zip root, no single
top-level folder - incompatible with the current extraction convention)
and Curse of Monkey Island (untested, much larger).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NiNnj78HGx1KWyCCo39HSz
This commit is contained in:
2026-07-28 14:29:11 +02:00
co-authored by Claude Sonnet 5
parent 17426584cd
commit afb18f1b38
4 changed files with 50 additions and 26 deletions
+36 -16
View File
@@ -14,24 +14,44 @@
listing every `*.zip` on the SMB share with an Installed/Install status per game; the
user clicks "Install" to fetch+extract a specific game into `${GAMES_HOME}` on demand.
- **Manifest-driven games + Start/Stop/Uninstall (test balloon, `stuntcar` only)**: games are
no longer discovered from raw `*.zip` files on the share. `setup_server.py` now lists
`*.json` manifests instead (one per game, e.g. `Games\dosbox\stuntcar.json`), each
declaring `name`/`title`/`zip`/`start_cmd`. The web page grew Start/Stop/Uninstall buttons
- **Manifest-driven games + Start/Stop/Uninstall**: games are no longer discovered from raw
`*.zip` files on the share. `setup_server.py` lists `*.json` manifests instead (one per
game, in the `Games\dosbox\` catalog directory), each declaring
`name`/`title`/`zip_path`/`start_cmd`. The web page grew Start/Stop/Uninstall buttons
alongside Install, driven entirely by that manifest — nothing about a game's identity or
how to run it is hardcoded in the image anymore. Only `stuntcar.json` exists on the share
so far (as a deliberate pilot); `t7g` has no manifest yet and will not show up in the setup
page until one is added (`t7g.json` with a `start_cmd` for its `dosbox-0.74-3.conf`).
`game.sh`/`scripts/start_game.sh` (the old `docker exec`-based launch path, with its
hardcoded `DOSBOX_VERSION`/`run.bat` convention) were intentionally left untouched for this
pilot and now overlap with the new Start button — worth reconciling (or removing) once the
manifest approach is rolled out to all games.
how to run it is hardcoded in the image anymore. Started as a `stuntcar`-only pilot, now
extended to 6 games (see the SCUMM item below). `t7g` still has no manifest and won't show
up in the setup page until one is added (`t7g.json` with a `start_cmd` for its
`dosbox-0.74-3.conf`). `game.sh`/`scripts/start_game.sh` (the old `docker exec`-based
launch path, with its hardcoded `DOSBOX_VERSION`/`run.bat` convention) were intentionally
left untouched during the pilot and still overlap with the new Start button — worth
reconciling (or removing) once every remaining game has a manifest.
- Create manifests for SCUMM engine games (Monkey Island, Day of the Tentacle, Indiana Jones,
etc.). Note these are usually best run via ScummVM rather than raw DOSBox — `scummvm` isn't
installed in the image yet, so this may need a Dockerfile change (add the `scummvm`
package) alongside the manifests themselves, and each manifest's `start_cmd` would invoke
`scummvm` with the right game-id instead of `dosbox run.bat -conf ...`.
- ~~Create manifests for SCUMM engine games~~ Done: `scummvm` added to the Dockerfile
(`/usr/games/scummvm`, not on `$PATH` by default under a non-login shell — manifests use
the absolute path). Manifests live in the usual `Games\dosbox\*.json` catalog directory on
the share, but their `zip_path` now points at wherever the game's zip actually already
lived (`Games\Monkey Island\...`, `Games\Indiana Jones\...`, etc.) — this required
generalizing the manifest schema from a bare `zip` filename (implicitly under
`Games\dosbox\`) to a full `zip_path` relative to the share root, since these games weren't
colocated with dosbox's. Added and verified end-to-end (install/start/stop/uninstall) via
`monkey2`:
- `monkey` — The Secret of Monkey Island
- `monkey2` — Monkey Island 2: LeChuck's Revenge
- `atlantis` — Indiana Jones and the Fate of Atlantis
- `indy3` — Indiana Jones and the Last Crusade
- `tentacle` — Day of the Tentacle
Skipped the German CD release of Day of the Tentacle on the share (`Day Of The Tentacle
(CD DOS, German).zip`) — unlike every other zip here, it doesn't wrap its contents in a
single top-level folder (loose files at the zip root plus a stray `MANIAC/` dir for the
embedded Maniac Mansion easter egg), so it doesn't fit the current "zip's top-level folder
== install name" extraction convention. Also skipped Curse of Monkey Island (much larger,
untested) — could be added the same way if wanted.
ScummVM's own game-target IDs (`monkey`, `monkey2`, `atlantis`, `indy3`, `tentacle`)
happened to exactly match each zip's existing top-level folder name, so no change was
needed to the install/extraction logic itself, only to where zips are looked up from.
- Get game sound actually audible during play. `--device /dev/snd` is passed through and
`alsa-utils` is installed, so DOSBox can write to an ALSA device inside the container, but