
The Ambidex Game is Kotaro Uchikoshi's vision of the Prisoner's Dilemma. You either work in a pair, or a solo, and there can only be up to three solo and pair groups. Each group of solos and pairs are put against the other in a game where they have to choose to Ally, or to Betray. If both teams ally, then each one of the members in the group get 2 points. If one chooses ally and gets betrayed, the betrayed participant(s) loses 2 points while the ones who betray get 3 points, if both betray, no points for any; and so on.
I thought it would be a highly interesting concept to take into a LAN game. Maybe you want to put your friend's trust at test, or perhaps you want to place 9 strangers together in one facility going against eachother, which seems like a nice sunday plan.
- Desktop exe: Runs as server + host UI in a frameless window (only allows one instance per computer, localhost exists for browser clients on port 3000)
- Android APK: Join-only client with a simple UI
- Wii U Homebrew: Join-only client with dual-screen support (TV + DRC)
- Nintendo 3DS Homebrew: Join-only client with dual-screen support (top + bottom)
- LAN multiplayer: No internet required, works over local network
- Terminal-style UI: Source Code Pro font, teal color scheme, retro terminal aesthetic
- Ambidex gameplay: Ally/Betray votes, slot pairings, real-time results reveal
- OST Music Player: Built-in player with VLR/999 soundtrack for the host.
- Download the latest
AmbidexGame.exefrom Releases - Run it — the first instance starts the server and opens the host UI
- Players on the same network open
http://<host-ip>:3000in a browser - Or use the Android APK to scan/connect
# Install dependencies
npm install
# Run server locally
npm start
# Build Windows exe
npm run build
# Build Android APK (requires Android SDK + Capacitor)
npx cap sync android
cd android
./gradlew assembleDebug
# Build Wii U homebrew (requires devkitPro with wiiu-dev)
cd wiiu
make
# Build 3DS homebrew (requires devkitPro with 3ds-dev)
cd 3ds
make- HOST GAME: Start a server and manage players, rounds and solo/pairs grouping.
- JOIN TEAM: Enter the host's LAN IP to connect as a player
- Fullscreen toggle: Bottom-right corner (PC only)
- Music player: Bottom-left corner in the host menu — select and play VLR/999 tracks
ambidex-game/
├── server.js # Express + Socket.IO server
├── public/ # Web client files (served statically)
│ ├── index.html # Desktop/web client
│ ├── mobile.html # Android client
│ ├── css/ # style.css + style-mobile.css
│ ├── js/game.js # Game logic + socket handlers
│ ├── vendor/ # Vendored libs (socket.io.min.js)
│ ├── img/ # Backgrounds, logo, favicon
│ ├── icons/ # App/exe icons (used by build scripts)
│ ├── sfx/ # Sound effects (.wav)
│ └── music/ # OST tracks (.mp3)
├── android/ # Capacitor Android project
├── wiiu/ # Wii U homebrew client (unfinished, gitignored)
│ ├── source/ # C source code
│ └── Makefile # devkitPro build
├── 3ds/ # Nintendo 3DS homebrew client
│ ├── source/ # C source code
│ ├── gfx/ # Screen images + tex3ds files
│ ├── romfs/ # Source WAVs (embedded at build time)
│ ├── tools/gen_wavs.ps1 # Regenerates source/wav_data.c
│ └── Makefile # devkitARM build
├── dist/ # Build outputs (gitignored)
├── scripts/
│ ├── prebuild.js # Patches icon into the nexe cache (pre-compile)
│ ├── patch-gui.js # Flips exe subsystem to GUI (no console)
│ └── make-ico.js / generate-icons.ps1 # Icon generation
└── capacitor.config.ts # Capacitor configuration
- Server: Node.js, Express, Socket.IO
- Client: Vanilla JS, CSS, Socket.IO Client
- Desktop: Nexe (bundles server into Windows exe)
- Android: Capacitor v8 (wraps web client as native APK)
- Wii U: devkitPro + libctru + SDL2 (homebrew)
- 3DS: devkitPro + libctru (homebrew, framebuffer rendering)
All Zero Escape series assets (music, images, sound effects) used in this project are the property of Spike Chunsoft and Chunsoft. This is a fan work and is not affiliated with or endorsed by them.
See NOTICE.md for detailed attributions.
MIT — © 2026 Misakii-P
