Unofficial native Linux port of ROM CHECK FAIL (pygame-ce)
  • Python 97.8%
  • Shell 2.2%
Find a file
2026-10-20 17:25:40 +02:00
LICENSES Add portable distribution packaging and licensing/provenance notices 2026-10-20 15:46:34 +02:00
music Import ROM Check Fail 1.1 source, assets, and pygame port 2026-10-20 15:17:49 +02:00
res Import ROM Check Fail 1.1 source, assets, and pygame port 2026-10-20 15:17:49 +02:00
tools Add 10-second rounds and classic balance option 2026-10-20 17:25:40 +02:00
.gitignore Add portable distribution packaging and licensing/provenance notices 2026-10-20 15:46:34 +02:00
ASSETS.md Add portable distribution packaging and licensing/provenance notices 2026-10-20 15:46:34 +02:00
game.py Add 10-second rounds and classic balance option 2026-10-20 17:25:40 +02:00
install.sh Add portable distribution packaging and licensing/provenance notices 2026-10-20 15:46:34 +02:00
LICENSE Add portable distribution packaging and licensing/provenance notices 2026-10-20 15:46:34 +02:00
main.py Add 10-second rounds and classic balance option 2026-10-20 17:25:40 +02:00
NOTICE.md Add 10-second rounds and classic balance option 2026-10-20 17:25:40 +02:00
Pycap.py Fix image alpha masks and Pycap centisecond timing; add class smoke test 2026-10-20 15:30:23 +02:00
PycapRes.py Fix image alpha masks and Pycap centisecond timing; add class smoke test 2026-10-20 15:30:23 +02:00
README.md Add 10-second rounds and classic balance option 2026-10-20 17:25:40 +02:00
requirements.txt Add Linux launcher, dependency pins, docs, and desktop entry 2026-10-20 15:21:19 +02:00
run.sh Add portable distribution packaging and licensing/provenance notices 2026-10-20 15:46:34 +02:00

ROM CHECK FAIL — native Linux port

Farbs' 2008 glitch platformer running natively on Linux, without Wine.

This is a small compatibility layer: the game logic is Farbs' official game.py (released under MIT), and Pycap.py / PycapRes.py reimplement the original C++ SexyAppFramework ("Pycap") API with pygame-ce. The game renders at its original 256x224 resolution and is scaled 3x by default. This port uses a 10-second round timer and, by default, the Invader and Asteroids balance values from ROM CHECK GO; --classic restores the stock 1.1 balance.

Development note

This port was created with the help of generative AI tools, including the OpenCode coding agent. The maintainer reviewed and tested the result and remains responsible for the release.

Run

./run.sh

Options:

./run.sh --fullscreen       # start fullscreen
./run.sh --scale=4          # window scale factor (default 3)
./run.sh --no-music         # disable music
./run.sh --classic          # stock 1.1 Invader/Asteroids balance
./run.sh --autoplay         # demo/test mode
./run.sh --smoke=8000       # run a fixed number of frames, then exit

Controls: arrow keys, Space, Esc to quit. F11 or Alt+Enter toggles fullscreen.

If .venv is missing:

./install.sh

install.sh creates .venv and installs the pinned dependencies. You need Python 3 and the venv module (on Debian/Ubuntu: python3-venv).

Headless validation of every player, enemy and environment:

.venv/bin/python tools/smoke_test.py

Distribution packages

Build portable release archives:

./tools/make_dist.sh

The archives are written to dist/:

  • romcheckfail-1.1-linux3-x86_64.tar.gz — full playable package, including the original res/ assets and pre-rendered music/.
  • romcheckfail-1.1-linux3-src.tar.gz — source-only package with the MIT port code and game.py, but no original assets or music.

To install from a full archive:

tar xzf romcheckfail-1.1-linux3-x86_64.tar.gz
cd romcheckfail-1.1-linux3-x86_64
./install.sh
./run.sh

The source-only archive needs a res/ directory from a legally obtained copy of the game; see ASSETS.md.

The current release is v1.1-linux3 (https://git.t44.org/topy/romcheckfail/releases/tag/v1.1-linux3). Release downloads, including the full package with the original assets, are at https://git.t44.org/topy/romcheckfail/releases. The full package contains Farbs' freeware assets and is not open source; see NOTICE.md for the rights-holder/takedown statement.

Licensing and provenance

The original ROM CHECK FAIL is not technically open source. In 2011 Farbs released only the Python script game.py under the MIT license. The artwork, sound effects, music, levels, title, original binaries and the original C++ engine were not released under an open-source license. The freeware game as a whole remains proprietary freeware.

  • The new Linux port code and game.py are MIT-licensed; see LICENSE.
  • The original assets in res/ are Copyright (C) Farbs and are freeware, not MIT. They are included in the full package for personal compatibility use.
  • The original Pycap / SexyAppFramework C++ engine is not included. The Python shim is an independent pygame-ce reimplementation.
  • The OGG music was rendered with FluidSynth and the GPL-2 TimGM6mb soundfont; the soundfont is not included. See NOTICE.md and LICENSES/.

Do not sell the full package or relicense Farbs' assets. This is an unofficial port and is not affiliated with or endorsed by Farbs. The notices are a good-faith summary, not legal advice.

What is here

  • game.py — official ROM CHECK FAIL 1.1 source, ported to Python 3, with a 10-second round timer and optional ROM CHECK GO balance.
  • main.py — window, main loop, scaling, fullscreen and test flags.
  • Pycap.py — pygame implementation of drawing, sound, music and input.
  • PycapRes.py — image/sound/tune/font loading plus the glitch effects.
  • res/ — original game assets.
  • music/ — the 35 MIDI tunes pre-rendered to OGG.
  • install.sh — creates .venv and installs dependencies.
  • LICENSE — MIT terms for the port code and game.py.
  • NOTICE.md — provenance, asset/music licensing and distribution notes.
  • ASSETS.md — how to supply assets for the source-only package.
  • LICENSES/ — GPL-2 and TimGM6mb notices for the music renditions.
  • tools/render_music.py — optional MIDI-to-OGG renderer.
  • tools/smoke_test.py — headless test of every player/enemy/environment.
  • tools/install_desktop.sh — installs a desktop-menu entry.
  • tools/make_dist.sh — builds the distribution archives.

Differences from the original

  • Python 2.5 -> Python 3 (range handling, integer division, portable paths).
  • The original Pycap C++ framework was replaced by pygame-ce. Pycap's update delta is in centiseconds, so at 60 fps the game receives ~1.667 per frame, not 1.0.
  • Images are composed from the RGB file plus its optional _ alpha-mask file, matching SexyAppFramework. Alpha-only assets (Pac-Man, invaders, moon tiles, fonts) are treated as white images modulated by the mask.
  • MIDI music is pre-rendered to OGG with FluidSynth because MIDI playback through SDL_mixer requires a configured General MIDI synthesizer and Timidity/GUS patches; pre-rendering avoids that runtime dependency.
  • The round timer runs for 10 seconds (1000 centiseconds) instead of the 1.1 source's 5 seconds. The glitch warning starts one second before each swap.
  • By default the Invader and Asteroids player balance follows Farbs' 2016 ROM CHECK GO: Invader moves at 1.5x speed with a 150-centisecond death time, and Asteroids acceleration is 0.075. Pass --classic to restore the stock 1.1 values (Invader 1.0 speed and 200 death time; Asteroids 0.05 acceleration).
  • The startup test pattern uses the shipped 1.0 timing (0.01) instead of the 1.1 source's 0.001. The latter would hold it for about 10 seconds; 0.01 gives the intended ~1 second.

High scores are stored in save.json (ignored by git).

Upstream and existing ports

  • Farbs released the game's source under the MIT license in 2011; the official 1.1 source archive is https://www.farbs.org/ROMCHECKFAIL/game.zip.
  • The only existing native Linux package found was the original 32-bit TuxCap-based build (AUR lib32-romcheckfail-bin). It needs old 32-bit SDL 1.2 libraries and is not maintained; this port is 64-bit and uses pygame-ce.