The Dishwasher: Dead Samurai · DishSoap
The Dishwasher: Dead Samurai
OrigenXbox 360
TecnologíaPort Nativo C/C++ (Reimplementación de Motor)
Disponible paraAndroid
Ver proyecto oficialSobre el proyecto
The Dishwasher: Dead Samurai es un videojuego de acción y aventura publicado por Xbox Game Studios en 2009.
Información oficial del proyecto
The Dishwasher: Dead Samurai — native Android port
A native Android (arm64-v8a) port of the Xbox 360 XBLA title The Dishwasher: Dead Samurai, built by decompiling the game's managed code and recompiling it ahead-of-time against MonoGame for .NET.
This is a static (ahead-of-time) recompilation of the game's managed code — not an emulator. It does not include, download or distribute the game. You must own a legitimate copy and import your own game data to play.
Not affiliated with, authorised, endorsed by, or connected to Microsoft, Xbox, Xbox LIVE, or Ska Studios. All game names, marks, code, art, audio and text remain the property of their respective owners. No game content is included or distributed by this project.
Contents
- What this is
- What works
- Install and import your own game data
- How it works
- Building from source
- Changelog
- Licence and legal
What this is
The Xbox 360 version of The Dishwasher: Dead Samurai is an XNA Game Studio / .NET Compact Framework title: its game logic ships as managed IL. This project decompiles that IL to C#, ports it from XNA 3.0 to the XNA 4.0–compatible MonoGame API, and compiles it to native ARM64 with .NET for Android.
The result is a normal Android app (com.recomp.dishwasher) that runs directly
on the CPU/GPU — there is no PowerPC emulation and no runtime JIT of console
code. In that sense it is a static recompilation: the game's logic is turned
into native ARM64 ahead of time.
It is not:
- ❌ an emulator;
- ❌ a build of the game — it contains no game code or assets;
- ❌ usable without your own copy of the game.
The public APK
The released APK is the public / content-free variant. It ships only this project's own code:
- the Android platform layer and shims,
- the 19 re-authored shaders (as compiled MGFX),
- the first-run importer and the SHA-256 ownership manifest.
Everything derived from the game — textures, fonts, audio — is produced on your device from your own copy, then compared against a manifest of SHA-256 hashes. Nothing is downloaded. The check is tolerant: a file that differs (a different game revision) or is missing is a warning, not a blocker.
What works
| Feature | Status |
|---|---|
| Full single-player story, arcade, guitar solo, shop, comics | ✅ |
| Touch input (menus and the death screen; tap = select/activate, swipe = d-pad) | ✅ |
| Optional on-screen gamepad + editable layout (default OFF) | ✅ |
| Gamepad (Bluetooth/USB, Xbox-style mapping) | ✅ |
| Rumble / vibration routing (phone and/or controller; OFF/PHONE/CONTROLLER/BOTH) | ✅ |
| Widescreen, uniform scaling (e.g. 2400×1080, no stretch/crop) | ✅ |
| LAN co-op / System Link over UDP (verified with two phones) | ✅ |
| Local split-screen co-op | ✅ |
Saves (profile.sav, settings.sav) with autosave on pause/stop and on EXIT | ✅ |
| In-app Android Settings (FPS lock: Unlimited/30/60/120; FPS counter) | ✅ |
| Real EXIT (saves through the game's own routines, then quits) | ✅ |
| No storage-device screen; first-run save created automatically | ✅ |
| On-device import of your own game data (tolerant SHA-256 check) | ✅ |
| On-device audio decoding (XMA → PCM/OGG) | ✅ |
Known limits: a gamepad is recommended for gameplay (the optional on-screen pad is a
fallback); controller vibration is first-class only on Android 12+, on Android ≤ 11 it is
best-effort via Bluetooth HID (Xbox One-family pads) while the phone vibrator always works;
arm64-v8a only; saves are app-private and lost on uninstall; long music tracks decode on
first play (a short hitch). See docs/PROJECT_STATE.md §9 for the full list.
Install and import your own game data
1. Install the APK
Download the latest release APK from the Releases page and install it on an arm64-v8a Android device (Android 5.0 / API 21 or newer):
adb install -r dishwasher-public-arm64-<version>.apk
Verify the download against the published SHA-256 checksum first:
sha256sum -c dishwasher-public-arm64-<version>.apk.sha256
2. Import your game data
On first launch the app shows an import screen and asks for your own copy of the game. You can supply it in any of these forms:
- the retail XBLA
.zip— the app unpacks the STFS/LIVE package inside it; - a
.zipof extracted game files; - a folder of extracted game files (Android's document picker).
Every required original file is compared against its exact byte size and SHA-256 hash from a bundled manifest, but the check is tolerant:
- a differing file (a different game revision) is a warning and is still imported — a different revision's asset is a valid asset;
- a missing file is a warning; that asset is simply not derived (e.g. a missing audio bank means that sound is absent, and the rest still works);
- the import is only refused when there is nothing usable — no usable
file at all, or a missing core boot file (
data/levels.zdx,gfx/text.xnb,gfx/Arials.xnb,Resources/dishX.Resources.Strings.resources).
The screen shows a concise summary (X matched · Y differed · Z missing) and
says whether the import is fine and continuing or which features may be missing;
the full per-file detail is written to the log (adb logcat -s Dishwasher,
[import] lines), never dumped on screen. Per-file derive failures are logged
and never abort the import. Strict ownership gating can be re-enabled at build
time with -p:DishwasherStrictContent=true (PublicBuild.StrictContentValidation,
default false).
After the check the app derives textures and fonts from the game's XNB files and decodes the audio banks on your device, using whatever was found, then starts the game.
You must legally own the game. This project provides no game files, no links to them, and no way to obtain them. You are responsible for complying with the law where you live.
How it works
- No assets are shipped. The public APK contains only our compiled shaders and a hash manifest.
- Tolerant ownership check. On import, 458 original files (
data/**,gfx/**.xnb,gfx/maps/maps.zdx,Resources/**,sfx/**banks) are compared by size + SHA-256 againstimport-manifest.json. Mismatches and missing files are warnings, not blockers; only "nothing usable" (no usable content, or a missing core boot file) is refused. - Textures and fonts are derived on-device from the game's XNB v2 files by a C# decoder, producing straight-alpha PNGs and runtime SpriteFonts — pixel- identical to the project's Python reference exporter.
- Audio is decoded on-device by a small bundled XMA decoder
(minimal FFmpeg + libvorbis/libogg behind our
libdishaudio.sobridge). - The port itself replaces XNA 3.0 with MonoGame and reimplements the console services (LIVE/GamerServices, storage, networking) as Android shims, plus touch input, a widescreen backbuffer, an FPS limiter, saves, and the LAN co-op session layer.
Technical deep-dives live under docs/, including
docs/PROJECT_STATE.md and the per-subsystem notes in
docs/notes/android/.
Building from source
This repository contains our code only. To build it you must supply your own
decompiled copy of the game — see BUILDING.md, which covers:
- obtaining and unpacking your own copy;
- decompiling
game.exeto C# withilspycmd 9.1.0.7988; - the manual XNA 3 → MonoGame porting edits you must re-apply (not included);
- the toolchain (.NET 8, Android SDK 35, NDK r28b, JDK 21, Wine);
- exact commands for the public, arm64-only, internal and debug builds;
- how to sign the release APK with your own keystore.
Changelog
1.0.1 — death-screen touch fix
- Fixed: the YOU ARE DEAD! screen (and its ARE YOU SURE? box) now
responds to touch. The screen sits inside the level but is not gameplay and is
not drawn by the menu system, so it fell between the two touch paths and all
touches were discarded — touch-only players were stuck there and a controller
was required.
CONTINUE,RESTART LEVEL,END, and the confirm/cancel choices are now tapped directly; a greyed-outCONTINUE(no continues left) is correctly inert, and a tap that misses every row does nothing. Seedocs/notes/android/death-screen-touch.md. - No other behaviour changed.
1.0 — first public release
- Public, content-free arm64-v8a build with on-device import, tolerant SHA-256 ownership check, and on-device texture/font/audio derivation.
Licence and legal
- Original code, scripts and artwork in this repository: MIT — see
LICENSE. - Third-party components and their licences: see
THIRD-PARTY-NOTICES.md. Notably, the public build bundles FFmpeg (LGPL-2.1-or-later, dynamically linked) and libogg/libvorbis (BSD-3-Clause), and uses MonoGame (MS-PL), NVorbis (MIT) and OpenAL Soft (LGPL). - No game content is included or distributed. The Dishwasher: Dead Samurai and all of its content are © their respective owners (Ska Studios and others). This is an unofficial fan project, not affiliated with or endorsed by Microsoft, Xbox, Xbox LIVE, or Ska Studios. You must own the game.