| additions | ||
| dist | ||
| docker | ||
| utils | ||
| .gitignore | ||
| .htaccess | ||
| colab_reVCDOS.ipynb | ||
| docker-compose.yml | ||
| index.php | ||
| LICENSE | ||
| README.md | ||
| requirements.txt | ||
| server.py | ||
GTA Vice City — HTML5 Port (DOS Zone)
Port made by the DOS.Zone team: dos.zone/reVCDOS
Official implementation: GitHub
Fast Start: Run the server in one click using Google Colab. Click the badge above, run the cell, and use the "Launch Game" button. The tunnel password will be copied automatically — just paste it on the page that opens.
Web-based port of GTA: Vice City running in browser via WebAssembly.
Requirements
- Colab or Docker or Python 3.8+ or PHP 8.0+
- Dependencies from
requirements.txt
Quick Start
-
Clone the repository:
git clone https://v13.next.forgejo.org/Lolendor/reVCDOS.git cd reVCDOS -
Configure Assets (Optional):
By default, the project uses DOS Zone CDN — no local assets needed. For offline hosting you can use:
- Packed archive (
--packedor--unpacked) — single.binfile with all assets - Local folders (
--vcsky_local,--vcbr_local) — unpacked asset directories - Cache mode (
--vcsky_cache,--vcbr_cache) — download from CDN once, serve locally after
- Packed archive (
-
Launch the Application: Choose one of the setup methods below:
- Docker (Recommended for most users) — fast and isolated.
- PHP — Simply upload the folder to your web server (FTP/Hosting).
- Manual Installation — for development and customization.
Setup & Running
Option 1: Using Docker (Recommended)
The easiest way to get started is using Docker Compose:
PACKED=https://folder.morgen.qzz.io/revcdos.bin docker compose up -d --build
To configure server options via environment variables:
# Set port, enable auth and custom saves
IN_PORT=3000 AUTH_LOGIN=admin AUTH_PASSWORD=secret CUSTOM_SAVES=1 docker compose up -d --build
| Environment Variable | Description |
|---|---|
OUT_HOST |
External host (default: 0.0.0.0) |
OUT_PORT |
External port (default: 8000) |
IN_PORT |
Internal container port (default: 8000) |
AUTH_LOGIN |
HTTP Basic Auth username |
AUTH_PASSWORD |
HTTP Basic Auth password |
CUSTOM_SAVES |
Enable local saves (set to 1) |
VCSKY_LOCAL |
Serve vcsky from local directory (set to 1, or path like /data/vcsky) |
VCBR_LOCAL |
Serve vcbr from local directory (set to 1, or path like /data/vcbr) |
VCSKY_URL |
Custom vcsky proxy URL |
VCBR_URL |
Custom vcbr proxy URL |
VCSKY_CACHE |
Cache vcsky files locally while proxying (set to 1) |
VCBR_CACHE |
Cache vcbr files locally while proxying (set to 1) |
PACKED |
Serve from packed archive (filename or URL, e.g., revcdos.bin) |
UNPACKED |
Unpack archive to local folders (filename or URL, auto-sets vcsky/vcbr paths) |
PACK |
Pack a folder and serve from resulting archive (folder path or MD5 hash) |
Option 2: Local Installation
- Install Python dependencies:
pip install -r requirements.txt
- Start the server:
python server.py --packed https://folder.morgen.qzz.io/revcdos.bin
Server starts at http://localhost:8000
Option 3: Shared Hosting on PHP (No installation)
If you want to run the game from a hosted environment with PHP 8.0 or above, just copy the contents of this repo to your desired hosting
By default the index.php and .htaccess will get the job done.
Server Options
| Option | Type | Default | Description |
|---|---|---|---|
--port |
int | 8000 | Server port |
--custom_saves |
flag | disabled | Enable local save files (saves router) |
--login |
string | none | HTTP Basic Auth username |
--password |
string | none | HTTP Basic Auth password |
--vcsky_local |
string/flag | disabled | Serve vcsky from local directory. Use flag for vcsky/ or specify path |
--vcbr_local |
string/flag | disabled | Serve vcbr from local directory. Use flag for vcbr/ or specify path |
--vcsky_url |
string | https://cdn.dos.zone/vcsky/ |
Custom vcsky proxy URL |
--vcbr_url |
string | https://br.cdn.dos.zone/vcsky/ |
Custom vcbr proxy URL |
--vcsky_cache |
flag | disabled | Cache vcsky files locally while proxying |
--vcbr_cache |
flag | disabled | Cache vcbr files locally while proxying |
--packed |
string | disabled | Serve from packed archive file. Accepts file path or URL |
--unpacked |
string | disabled | Unpack archive to unpacked/{hash}/ and serve from there. Accepts file path or URL |
--pack |
string | disabled | Pack a folder and serve from resulting {hash}.bin archive. Accepts folder path or MD5 hash |
Examples:
# Start on custom port
python server.py --port 3000
# Enable local saves
python server.py --custom_saves
# Enable HTTP Basic Authentication
python server.py --login admin --password secret123
# Use local vcsky and vcbr files
python server.py --vcsky_local --vcbr_local
# Cache files locally while proxying (hybrid mode) (recommended)
python server.py --vcsky_cache --vcbr_cache
# Serve from packed archive (local file)
python server.py --packed revcdos.bin
# Serve from packed archive (download from URL if not present)
python server.py --packed https://example.com/revcdos.bin
# Unpack archive and serve from unpacked files
python server.py --unpacked revcdos.bin
# Stream-unpack from URL (downloads and unpacks simultaneously)
python server.py --unpacked https://example.com/revcdos.bin
# Pack a folder and serve from the resulting archive
python server.py --pack /path/to/assets # Creates {folder_hash}.bin
# Pack from existing unpacked folder by MD5 hash
python server.py --pack a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6 # Uses unpacked/{hash}/
Note: HTTP Basic Auth is only enabled when both
--loginand--passwordare provided.
Note: By default, vcsky and vcbr are proxied from DOS Zone CDN. Use
--vcsky_localand--vcbr_localflags to serve files from local directories instead. You can optionally specify a custom path.
Note: Use
--vcsky_cacheand--vcbr_cacheto cache proxied files locally. Files are downloaded once and served from local storage on subsequent requests.
Note:
--packedserves files directly from a compressed archive without unpacking (faster and more compressed).--unpackedextracts the archive once and serves from local files (if you want edit assets).
Note: When using URL with
--unpacked, the archive is streamed and unpacked simultaneously during download usingdownloader_brotli.py.
Note: You can pass a raw MD5 hash (32 hex characters) to
--unpackedto use an existing unpacked folder without needing the original archive. Example: if you haveunpacked/a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6/, you can start the server with--unpacked a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6.
Note:
--packcreates a packed archive from a folder containing subfolders (likevcsky/andvcbr/). Each subfolder is packed sequentially: the first creates the archive, subsequent ones are appended. After packing, the server automatically uses the created archive via--packedmode.
URL Parameters
| Parameter | Values | Description |
|---|---|---|
lang |
en, ru |
Game language |
cheats |
1 |
Enable cheat menu (F3) |
request_original_game |
1 |
Request original game files before play |
fullscreen |
0 |
Disable auto-fullscreen |
max_fps |
1-240 |
Limit frame rate (e.g., 60 for 60 FPS) |
configurable |
1 |
Show configuration UI before play button |
Examples:
http://localhost:8000/?lang=ru— Russian versionhttp://localhost:8000/?lang=en&cheats=1— English + cheatshttp://localhost:8000/?configurable=1— Show settings UI before play
Project Structure
├── server.py # FastAPI proxy server
├── index.php # PHP proxy server
├── .htaccess # Apache config for PHP
├── requirements.txt # Python dependencies
├── revcdos.bin # Packed archive (optional)
├── additions/ # Server extensions
│ ├── auth.py # HTTP Basic Auth middleware
│ ├── cache.py # Proxy caching and brotli decompression
│ ├── packed.py # Packed archive serving module
│ └── saves.py # Local saves router
├── utils/ # Utility modules
│ ├── packer_brotli.py # Archive packer with brotli compression
│ └── downloader_brotli.py # Archive packer with brotli compression
├── unpacked/ # Auto-created by --unpacked flag
│ └── {md5_hash}/ # Unpacked files organized by source hash
│ ├── vcsky/ # Decompressed game assets
│ └── vcbr/ # Brotli-compressed binaries
├── dist/ # Game client files
│ ├── index.html # Main page
│ ├── game.js # Game loader
│ ├── index.js # Module loader
│ ├── GamepadEmulator.js # Touch controls
│ ├── idbfs.js # IndexedDB filesystem
│ ├── jsdos-cloud-sdk.js # Cloud saves (DOS Zone)
│ ├── jsdos-cloud-sdk-local.js # Local saves (--custom_saves)
│ └── modules/ # WASM modules
│ ├── runtime.js # WASM runtime initialization
│ ├── loader.js # Asset/package loading
│ ├── fs.js # Virtual filesystem
│ ├── audio.js # Audio system
│ ├── graphics.js # Rendering pipeline
│ ├── events.js # Input events handling
│ ├── fetch.js # Network requests (Real-time asset streaming)
│ ├── syscalls.js # System calls
│ ├── main.js # Main entry point
│ ├── cheats.js # Cheat engine (F3)
│ ├── asm_consts/ # Language-specific ASM constants
│ │ ├── en.js
│ │ └── ru.js
│ └── packages/ # Language-specific data packages
│ ├── en.js
│ └── ru.js
├── vcbr/ # Brotli-compressed game data (optional)
│ ├── vc-sky-en-v6.data.br
│ ├── vc-sky-en-v6.wasm.br
│ ├── vc-sky-ru-v6.data.br
│ └── vc-sky-ru-v6.wasm.br
└── vcsky/ # Decompressed assets (optional)
├── fetched/ # English version files
│ ├── data/
│ ├── audio/
│ ├── models/
│ └── anim/
└── fetched-ru/ # Russian version files
├── data/
├── audio/
└── ...
Features
- 🎮 Gamepad emulation for touch devices
- ☁️ Cloud saves via js-dos key
- 💾 Local saves (with
--custom_savesflag) - 🌍 English/Russian language support
- 🔧 Built-in cheat engine (memory scanner, cheats)
- 📱 Mobile touch controls
Local Saves
When local saves are enabled (--custom_saves flag), enter any 5-character identifier in the "js-dos key" input field on the start page. This identifier will be used to store your saves in the saves/ directory on the server.
Example: Enter mykey or 12345 — saves will be stored as mykey_vcsky.saves or 12345_vcsky.saves.
Controls (Touch)
Touch controls appear automatically on mobile devices. Virtual joysticks for movement and camera, context-sensitive action buttons.
Cheats
Enable with ?cheats=1, press F3 to open menu:
- Memory scanner (find/edit values)
- All classic GTA VC cheats
- AirBreak (noclip mode)
License
MIT. Do what you want (but credit the port authors and me). Not affiliated with Rockstar Games.
Authors: DOS Zone (@specialist003, @caiiiycuk, @SerGen)
Deobfuscated by: @Lolendor
Russian translation: GamesVoice
Added by the community:
- PHP Support by Rohamgames
Support me
If you find this project useful:
- TON / USDT (TON)
UQAyBchGEKi9NnNQ3AKMQMuO-SGEhMIAKFAbkwwrsiOPj9Gy - ETH / USDT (ERC-20)
0x69Ec02715cF65538Bb03725F03Bd4c85D33F8AC0 - TRX / USDT (TRC-20)
THgNWT9MGW52tF8qFHbAWN25UR6WTeLDMY