PORTCLUB
Port nativo

Brick Blaster (brickblaster-c)

Port nativo de Brick Blaster (brickblaster-c) para PC.

Brick Blaster (brickblaster-c)

Port nativo basado en su ficha de origen.

README del repositorio

Brick Blaster — C/raylib port

Status: preview Upstream ASM source EOS Archive License: GPL v3 Build Release

▶️ Play it on itch.io — Jouer sur itch.io — in your browser, no install

Mirror without the store page: konsomejona.github.io/brickblaster-c

⬇️ Download the game here — Téléchargez le jeu ici — Windows / Linux / macOS

Status: preview. Gameplay internals (constants, level format, XOR codec, power-up tables, collision LUT, frame pacing) are ported byte-for-byte with ASM line citations, and the August 2026 parity pass closed the remaining known divergences — see the checklist and audit-2026-08-13-parity.md.

Based on the original x86 assembly sources of BrickBlaster, released for MS-DOS on Media Pocket 1999 by the Eclipse demomaker team and open-sourced under GPL v3 in 2024. Upstream repo: david4599/BrickBlaster — contains the original MAIN.ASM, HISCORE.ASM, FONTE.ASM, EDITOR.ASM, FILE.ASM, DRAW.ASM, MOUSE.ASM, Blaster.inc, Blaster.cfg (FR / EN / ES) and the Watcom/DirectX toolchain to rebuild the 1999 binary.

Companion archive: david4599/BrickBlaster-EOS-Archive — the unmodified archival snapshot: original sources and 1999 binaries, the WinEOS 4.00 Alpha runtime, and the standalone EOS 3.05 / 3.06 DOS extenders (EOS = Eclipse Operating System, the custom DOS extender the Eclipse demomaker team built for their productions, later adapted to Windows/DirectX as WinEOS to host BrickBlaster).

This repo is a C/raylib translation of those sources, byte-exact for all gameplay constants and file formats. Every non-trivial function cites its ASM line in a comment.

This port uses raylib 5.0 for rendering, audio, and input, and runs on Windows, macOS, Linux, the Web (WebAssembly) and Android (experimental — see android/README.md).

What is BrickBlaster?

A polished Arkanoid-style brick breaker with:

  • 40 levels per world, 2 worlds (Space, Arcade)
  • 24 power-ups (multi-ball, iron ball, laser, magnetic paddle, ghost, teleporters, bonus/malus, …)
  • Monsters that spawn periodically and must be dodged or destroyed
  • 2-player coop and versus (duel) modes
  • Separate level editor to design and test your own levels
  • Demo / attract mode with AI paddle
  • UI localized in English, French, German, Spanish, Italian, Portuguese (in-game power-up labels stay in the original game config — FR / EN / ES)

Standalone level editor

The BrickBlaster level editor is a separate C/raylib application, with its own executable and built-in playtest engine. It includes the original EDITOR.ASM source, the converted C sources and the original graphics. The game does not need to be installed to run it.

Download the editor · Full illustrated guide. Version 0.1.0 provides a tested Linux ARM64 binary; other platforms can build from source and are not validated by that archive.

Original-style level editor Playing a level inside the editor

  1. Extract the editor archive and launch brickblaster-editor, keeping assets/ next to it. Use F11 or drag and drop to import an existing world.
  2. Select bricks with F1–F4 / F9 and colours with F5–F8. Left click draws, right click erases; Esc opens the commands menu.
  3. Press Tab, then Space, to test the current level. P pauses, R restarts and Tab returns to the unchanged drawing.
  4. F12 saves the whole world (.lv0/.lv1/.lv2, 31,200 bytes); Ctrl E exports one level (.lvl, 390 bytes). Enter the destination path and press Enter. PgUp/PgDn select a level; Ctrl Insert appends one.

World files preserve the original binary format. Individual .lvl files are an editor extension, and the main game's release does not expose a custom-level file picker. Use the editor's built-in test to play your changes immediately. The original layout, resources and routines have targeted parity checks; documented extensions and limitations mean this is not a claim of complete equivalence with the 1999 executable.

The 1999 retail edition

Brick Blaster shipped on 5 October 1999 as a boxed CD-ROM on Media Pocket's budget line, developed by Carapace (Softplace), in a complete French edition. The packaging advertises 80 levels and a two-player mode.

Both claims check out against the data this port ships: assets/levels/Blaster.lv0 and Blaster.lv1 hold 40 playable levels each — 80 across the two selectable worlds. A third file, blaster.lv2, holds 40 more that the 1999 build could never reach: its world-2 branch is commented out in the assembly, so selecting it is a no-op (see src/assets.c assets_select_world). The coop and versus modes survive too: main.c:139 folds nbs_player and dual_flag into the game_mode that game.h:181 still documents as 0 = solo, 1 = coop, 2 = duel.

Twenty-seven years on, the game still surfaces on YouTube: see Brick Blaster - Espace 01-08 - Scores by the channel Nheir, a run through the first eight levels of the Space world.

Licensing note. The cover image above is reproduced for historical documentation of the original release. It is not covered by this repository's GPL v3: the cover artwork belongs to Media Pocket, and the photograph itself comes from a third party. It lives in img/, outside the assets/ tree that holds the game's own data. See PROVENANCE.md §7 for what is and is not established about the rights chain.

Fidelity goal

The target is byte-exact parity with the 1999 x86 binary. The current state of play:

Ported byte-for-byte from the ASM (stable, cross-checked against MAIN.ASM / HISCORE.ASM / FONTE.ASM / EDITOR.ASM / FILE.ASM / DRAW.ASM / MOUSE.ASM / Blaster.inc / Blaster*.cfg):

  • Physics & collision LUT, ball/angle/speed bookkeeping
  • Scoring, per-difficulty spawn frequencies, Time_Between_Option
  • 24-entry struc_options power-up table + per-difficulty frequency triplets
  • High-score XOR codec and blaster.scr on-disk layout
  • Level file format (.lv0 / .lv1 / .lv2, 390 bytes × 80 slots, of which 40 hold a real level — the rest are 0xFF padding, and search_level_number stops at the first one)
  • Sprite tile offsets and per-world palette selection
  • Timing constants (DELAI_OPTION, DELAI_DEMO, bonus life threshold, etc.)

⚠️ These claims describe v0.2.0 and later. The August 2026 audit found 8 major divergences in exactly these areas, and a follow-up pass found two more that changed how the game plays and looks: ball speed-ups ran 3x too slow (the port compensated a frame rate the shipped 1999 binary never had), and the world 1 backgrounds were converted through the wrong palette, so 858 718 pixels per screen were wrong and a dark veil had been added to hide them. Releases up to v0.1.5 predate all of this and do not have the parity their bundled README claims; v0.2.0 is the first release that carries the full parity pass.

Where the material comes from, and what the sources actually say about licensing — including the questions still unanswered upstream: PROVENANCE.md.

Per-iteration audit trail with ASM line citations, newest first:

  • audit-2026-08-13-parity.md — full ASM ↔ C parity audit (August 2026): the 8 P0 divergences, the P1/P2 tail, and §6 quater, the pass that closed everything else

  • audit-findings.md — Audit Findings, April 2026

  • audit-asm-faithful.md — ASM 100% Fidelity Audit (Iter 1), April 2026

    ⚠️ Both April files are historical. Several of their verdicts were later overturned by the August audit — the duel game-over rule, the MONSTER_DELAI "fabrication" claim, the final-FLC frame count and the magnetic-catch semantics. Each is marked inline in the file itself.

Polish checklist vs the 1999 original

Everything below has shipped; the section is kept as a record of what diverged from the 1999 binary and when it was closed. Contributions and bug reports from people who know that binary are genuinely useful — open an issue or a PR.

Done (shipped in post-v0.1.4 commits):

  • ✅ Iron ball: passes through indestructible bricks and renders blue while active — matches MAIN.ASM:2844-2849 + 3862-3864 (sprite_rebond = Off disables the bounce, sprite swap is per-frame in the ball loop). Dual-mode colour swap mirrored.
  • ✅ Teleport power-up: teleports each ball to a random free position inside the play area (skips incassable tiles), mirroring MAIN.ASM:1526-1563 Teleporte_Ball. Same routine is now used by the BRICK_TELEPORTER hit path (was also wrong).
  • ✅ Power-up hitbox: 26×24 (was inflated to 52×48 — leftover from the Wear OS 2x draw path). ASM-exact containment check.
  • ✅ Unbreakable bricks flicker: removed the ambient frame-toggle that pulsed every incassable brick in sync.
  • ✅ ESC binding: ESC toggles pause from gameplay and exits to the main menu from the pause screen (desktop UX; P / click / gamepad still resume as before).
  • ✅ Startup intro: plays only media.png (Media Pocket splash, MAIN.ASM:54 File_Editor = Media.gif) + credit_b.png. The animated intro.flc logo and the remaining credit letters are part of the Credits menu (MAIN.ASM:146-190 @@credit), not launch.
  • ✅ Android doc: android/README.md added (honest scaffold status).

Also done (shipped in v0.1.5, this list was stale): menu logo pinned with a rounded selection ring and cursor-following label; paddle explosion, telepod and muzzle-flash animations; hit-triggered reflet ripple on unbreakable bricks; the 36-frame intro.flc sequence in the Credits menu. The 3 balles ball-counter glitch was root-caused in the August 2026 audit — power-ups were collectable during the ready ? screen, so a residual multi-ball fell onto the idle paddle; fixed by gating collection on PLAYING (MAIN.ASM:5605).

Still on the list: nothing in the audit's P0-P2 lists. The August 2026 parity pass closed the remaining divergences — one carried effect per player, attract-mode timing, end-of-game flow, .usr volumes and the menu VU meter, sound mapping, wall-bounce positioning, sprite z-order, and the .cfg-sourced end screens. See audit-2026-08-13-parity.md §6 quater.

Two things cannot be made identical, by nature:

  • the audio was converted from .iff / .mod to WAV, which is not bit-reversible;
  • the port decodes PNG, not the 1999 GIF/LZW decoder.

Build

Prerequisites

  • CMake ≥ 3.16. With CMake ≥ 4 the -DCMAKE_POLICY_VERSION_MINIMUM=3.5 flag in every command below is mandatory, not optional: raylib is pinned to 5.0, whose own CMakeLists.txt declares a cmake_minimum_required below the 3.5 policy floor that CMake 4 removed. Without the flag, a bare cmake -B build fails at FetchContent_MakeAvailable(raylib).
  • C99 compiler (MSVC / GCC / Clang)
  • Internet access on first configure (raylib 5.0 is fetched via FetchContent)

Windows (Visual Studio 2022)

cmake -G "Visual Studio 17 2022" -A x64 -B build -DCMAKE_POLICY_VERSION_MINIMUM=3.5
cmake --build build --config Release
build\Release\brickblaster.exe

Linux / macOS

cmake -B build -DCMAKE_POLICY_VERSION_MINIMUM=3.5
cmake --build build
./build/brickblaster

Web (Emscripten)

emcmake cmake -B build-web -DCMAKE_BUILD_TYPE=Release -DCMAKE_POLICY_VERSION_MINIMUM=3.5
cmake --build build-web

Produces a static bundle; serve build-web/ over HTTP (opening the .html from file:// will not work).

Android

See android/README.md (Gradle + NDK). The APK is experimental: not yet soak-tested on a physical phone, and scores and settings do not persist.

Build flags

FlagDefaultEffect
-DTAKOHI_BRANDING=OFFONStrip TakoHi publisher splash at end of intro
-DGIF_RECORDER=OFFONRemove F12 GIF capture (reduces binary)
-DBUILD_TESTS=ONOFFBuild bb_tests, the headless parity suite

For a 100%-vanilla build matching the 1999 release exactly:

cmake -B build -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -DTAKOHI_BRANDING=OFF -DGIF_RECORDER=OFF

Controls

ActionKeyboardGamepadTouch
Move paddle← → / A D / mouseLeft stick / D-padDrag
Fire ballSpaceA (Cross)Tap
PauseP / EscStartOn-screen pause button
BackEscB (Circle)On-screen button
Music / SFX volumedrag the menu VU meter—drag
Screenshot GIFF12——

2-player keyboard — P1 arrows + Space, P2 Q/A (left) D (right) + F. A/D also move P1 in solo, but not while P2 is on the keyboard — A is P2's left there (src/input_frame.c:98). 2-player gamepad — P1 on gamepad 0, P2 on gamepad 1.

Project structure

src/              Game source (C99, raylib)
web/              Emscripten shell + web build glue
android/          Gradle project (experimental APK)
img/              README banner and screenshots
assets/
  sprites/        Sprite atlases (PNG — SPRITE.png world 1, SPRITE0.png world 0)
  audio/          Sound effects (WAV, ex-IFF)
  music/          Music tracks (WAV, ex-MOD)
  intro/          Intro animation frames (36 PNG, ex-intro.flc)
  final/          Victory animation frames
  credits/        Credit slides
  menu/ title/    Menu and title screen art
  takohi/         Publisher branding (stripped by -DTAKOHI_BRANDING=OFF)
  levels/         Level files (.lv0 / .lv1 / .lv2 — 80 slots of 390 bytes,
                  40 real levels then 0xFF padding)
  backgrounds/    Menu / hiscore backgrounds
data/
  blaster.cfg     Optional runtime config override (mirrors ASM Blaster.cfg)
  blaster.scr     High scores (persistent, XOR-encoded)
  blaster.usr     Volume settings (2 bytes, per FILE.ASM:813)
third_party/
  gif.h           Public-domain header-only GIF encoder (for F12 recorder)
audit-2026-08-13-parity.md   Full ASM parity audit, August 2026
audit-findings.md            ASM 100% Fidelity Audit (Iter 1), April 2026
audit-asm-faithful.md        Audit Findings, April 2026

Modifications from the 1999 original (GPL §5 notice)

This work is a modified version of BrickBlaster (1999). Per GPL v3 section 5, the following prominent modifications were made in 2026:

  • Full C99 rewrite of the x86 assembly source using raylib 5.0 for rendering, audio, and input abstraction.
  • Target platforms extended from Windows/DOS to Linux, macOS, the Web (WebAssembly) and Android.
  • Main loop converted from vsync-locked 70 Hz (DOS IRQ timer) to 60 Hz via raylib frame pacing with custom SUPPORT_CUSTOM_FRAME_CONTROL.
  • Palette-indexed VGA rendering replaced by RGBA textures. The palette fades in DRAW.ASM (Shade_On/Shade_Off) are approximated with alpha overlays. Night-mode palette swap replaced by an RGBA dim overlay.
  • Audio pipeline: IFF samples converted to WAV; MOD tracks converted to looped WAV streams played via raylib's MusicStream.
  • File I/O: level/high-score/config files kept byte-compatible with the 1999 format; launcher paths adapted to modern OS conventions.
  • Optional compile-time additions (both OFF for vanilla builds):
    • TAKOHI_BRANDING — publisher splash slide at end of intro.
    • GIF_RECORDER — F12 in-game GIF capture for demo recording.

No gameplay constant, scoring rule, power-up table, level layout, or string is intentionally altered — the 24 power-ups match struc_options byte-for-byte and the levels load unchanged from .lv0 / .lv1 / .lv2. A few visible behaviours still diverge while the polish pass is in progress (see checklist); deliberate deviations are tracked in audit-findings.md.

Credits

Original 1999 game (Eclipse demomaker team):

  • Marc Radermacher ("Hacker Croll") — code (BrickBlaster + WinEOS)
  • Christophe Résigné ("Rez") — music
  • Frédéric Box ("Profil") — graphics
  • Régis Vidal ("Light Show") — code (WinEOS)

Developed by Carapace (Softplace), published by Media Pocket.

Source preservation & upstream archive (2024): In early 2024, Marc Radermacher provided the original source tree to david4599 — upstream's wording is "kindly providing the source code of this awesome game and allowing to preserve it" — who published it on GitHub as two repositories:

  • BrickBlaster — the working source tree with a ready-to-use build.bat (Watcom 11.0B + DirectX 6 SDK) and documented patches (FILE.ASM env-var limit and MAIN.ASM privileged-instruction fix) so the 1999 binary rebuilds cleanly on Windows 95 through 11.
  • BrickBlaster-EOS-Archive — the unmodified archival snapshot: original sources and 1999 binaries, WinEOS 4.00 Alpha, and the standalone EOS 3.05 / 3.06 DOS extenders.

C/raylib port (2026): Jonathan Odul (konsomejona).

Third-party:

A huge thanks to Marc Radermacher (edromel.com) for kindly allowing the original sources to be preserved and to david4599 for the archive that made this port possible.

License

GNU General Public License v3.0 — as published with the upstream david4599/BrickBlaster repositories in 2024. The 1999 sources carry no license text of their own; what is and is not established about that chain is written up in PROVENANCE.md. See LICENSE.

This program comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under the conditions of the GPL v3.

Release notes

Release history lives in CHANGELOG.md. The latest tag is v0.2.0 (16 August 2026), which is also the version in CMakeLists.txt. 0.1.6 has a changelog section but was never tagged, and 0.1.7 never existed.

Release convention (by hand, not enforced): a PR that bumps the version or pushes a vX.Y.Z tag should add or update the matching CHANGELOG.md section before the tag is pushed. Nothing checks this today — no CI job reads the changelog. .github/workflows/build.yml ships it alongside each binary artefact, but the GitHub release notes themselves are auto-generated from commits (generate_release_notes: true).

Links

Comentarios (0)

Inicia sesión para dejar un comentario.

Sé el primero en comentar sobre este juego.