Skip to content

visual-pinball - RetroBIOS

Type standalone
Classification Game engines
Source https://github.com/vpinball/vpinball
Version 10.8.0
Profiled 2026-08-08
Cores vpinball, visual-pinball
Systems vpinball
Source analysis

shipped_with_the_binary:

- **note:** Copied into the build output next to the executable and installed as one unit by every distribution, so they arrive with the emulator rather than being sourced separately.
- **source_ref:** CMakeLists.txt:948
**entries:**

- what: scripts/, the .vbs library tables include, source_ref: src/parts/pintable.cpp:470-480, main.h:118-119, main.cpp:890-892, codeview.cpp:3233-3247
- what: assets/, textures, TableSizes.csv, vpx.html, the two defaults, source_ref: src/renderer/Renderer.cpp:204, src/parts/bumper.cpp:244, src/parts/kicker.cpp:274, src/core/TableDB.cpp:16, LiveUI.cpp:1705-1706, lib/src/WebServer.cpp:94
- what: shader10.8.0/, .glfx and .fxh compiled at runtime, source_ref: src/renderer/Shader.cpp:1419
- what: flexdmd/, the bitmap fonts UltraDMD names as FlexDMD.Resources.*, source_ref: plugins/flexdmd/UltraDMD.cpp:32, plugins/flexdmd/UltraDMD.cpp:20-22
- what: user/ and tables/, the two roots exposed to table scripts as directory properties, source_ref: src/parts/pintable.cpp:484-521

shipped_without_a_reader:

- **note:** Copied into the build output but unreachable in the standalone binary
**entries:**

- what: assets/blankTable.vpx, exampleTable.vpx, lightSeqTable.vpx, strippedTable.vpx, source_ref: src/ui/win/WinEditor.cpp:2240, note: InitBuiltinTable is one #ifndef __STANDALONE__ block; the editor's New Table entries are the only callers.
- what: docs/Changelog.txt, source_ref: dialogs/AboutDialog.cpp:27-31, CMakeLists.txt:949, note: The About dialog is not in the standalone source list.

user_supplied_paths:

- **note:** Per table, keyed on the table folder or the ROM name, with no fixed filename
**entries:**

- what: PinMAME ROM sets, <pinmame root>/roms/<romname>.zip, source_ref: plugins/pinmame/PinMAMEPlugin.cpp:448-451, pinmame src/libpinmame/libpinmame.cpp:816, note: One zip per machine. The root is the pinmame folder beside the table when present, else the PinMAMEPath setting, else $HOME/.pinmame; Batocera patches that last fallback to <prefpath>/pinmame.
- what: backglass, <table basename>.directb2s, source_ref: plugins/b2slegacy/forms/FormBackglass.cpp:370, note: Version-checked against the B2S server on load; absence only warns.
- what: Serum colorizations, the folder named by the SerumPath setting, source_ref: plugins/serum/serum.cpp:60, note: Handed to libdmdutil as a path when the AltColor setting is on and the directory exists.
- what: alternative sound packages, under the PinMAME root by ROM name, source_ref: plugins/altsound/AltSoundPlugin.cpp:189-193
- what: PUP video packs, <table folder>/pupvideos, source_ref: plugins/pup/PUPManager.cpp:125, plugins/pup/PUPPlugin.cpp:288
- what: table music, music/ beside the install, the table or the preferences path, source_ref: src/audio/AudioPlayer.cpp:75-77, src/parts/pintable.cpp:524-545
- what: table sidecars, the .vbs script override and the per-table .ini, source_ref: src/parts/pintable.cpp:704,794

generated_files:

  • what: VPinballX.ini, the settings file, source_ref: lib/src/VPinballLib.cpp:192, note: Created on first run under the preferences path, or read from beside the binary when one is there. Batocera seeds it from assets/Default_VPinballX.ini and rewrites it before every launch.
  • what: VPReg.ini, per-table settings; vpinball.log, source_ref: src/utils/Logger.cpp:167, standalone/README.md:512-534
  • what: PinMAME state: nvram/, cfg/, hi/, inp/, memcard/, sta/ and ini/, source_ref: pinmame src/libpinmame/libpinmame.cpp:817-823, plugins/pinmame/Controller.cpp:166-171, note: The ini directory is created when missing; the others are written by PinMAME as the machine runs.
Technical notes

Pinball table simulator. The table is the content: .vpx and .vpt files are OLE Compound Documents holding the geometry, textures, sounds and a VBScript program, read through POLE on non-Windows platforms. The standalone branch ports the Windows original by embedding Wine's VBScript engine, stubbing COM and ATL from Wine and ReactOS sources, and linking libpinmame, libaltsound, libdmdutil, libdof and BASS in place of the Windows COM servers (standalone/README.md:11-120). ES-DE finds VPinballX_BGFX or VPinballX_GL and runs <binary> -play <rom>, Batocera builds the standalone tree at 3ec37c7f9a into /usr/bin/vpinball and runs VPinballX_GL -PrefPath <dir> -Ini <dir>/VPinballX.ini -Play <rom>, RetroBat drives the Windows build with its registered VPinMAME COM server.

Two path roots decide where everything is read from. m_szMyPath is the install directory, m_szMyPrefPath is ~/.vpinball or whatever -PrefPath names, and loading a table sets the working directory to the table's own folder (main.cpp:408, src/parts/pintable.cpp:2497,11165). Batocera's 001-default-path.patch redirects the PinMAME root from $HOME/.pinmame to /pinmame.

Table scripts pull their libraries through GetTextFile, which walks seven locations in order: the working directory, then user/, scripts/ and tables/ under the install directory, then the same three under the preferences path (src/parts/pintable.cpp:470-480, main.h:118-119, main.cpp:890-892). The scripts/ directory the build ships carries the ~70 .vbs files tables include by name, core.vbs and controller.vbs beside the per-manufacturer machine scripts (WPC.vbs, sam.vbs, s11.vbs, zac.vbs and the rest), and the editor's completion parser reads core.vbs over the same search order (codeview.cpp:3233-3247, CMakeLists.txt:948). The same four roots are handed to table scripts as the UserDirectory, TablesDirectory, MusicDirectory and ScriptsDirectory properties, each falling back from the install directory to the table folder to the preferences path (src/parts/pintable.cpp:484-560).

The rest of the install tree is read the same way and ships with the binary: assets/ holds BallEnv.exr, AODither.webp and EnvMap.webp (src/renderer/Renderer.cpp:204), the bumper and kicker textures (src/parts/bumper.cpp:244, src/parts/kicker.cpp:274), TableSizes.csv, which the live UI reads to guess the glass position of a table that does not declare one (src/core/TableDB.cpp:16, LiveUI.cpp:1705-1706), vpx.html for the built-in web server (lib/src/WebServer.cpp:94) and Default_gamecontrollerdb.txt; shader10.8.0/ holds the .glfx and .fxh sources compiled at runtime (src/renderer/Shader.cpp:1419); flexdmd/ holds the bitmap fonts UltraDMD asks for by resource name, the FlexDMD.Resources. prefix being stripped before the lookup (plugins/flexdmd/UltraDMD.cpp:32, plugins/flexdmd/UltraDMD.cpp:20-22).

Two parts of that tree ship without a reader on this target. The four starter tables in assets/, blankTable.vpx, exampleTable.vpx, lightSeqTable.vpx and strippedTable.vpx, are loaded only by InitBuiltinTable, whose body is one #ifndef __STANDALONE__ block (src/ui/win/WinEditor.cpp:2240), and docs/Changelog.txt is read by dialogs/AboutDialog.cpp:27-31, which is not in the standalone source list at all.

PinMAME is where the emulation happens. Tables that recreate a real solid state machine hand a ROM name to the controller, which resolves its root as the pinmame folder beside the table, else the PinMAMEPath setting, else $HOME/.pinmame (plugins/pinmame/PinMAMEPlugin.cpp:448-451). libpinmame then hangs roms, nvram, samples, cfg, hi, inp, memcard and sta off that root (pinmame src/libpinmame/libpinmame.cpp:816-823). Every ROM set is a game, one zip per machine; PinMAME declares no BIOS root set anywhere in its tree, and carries neither GAME_IS_BIOS_ROOT nor ROM_SYSTEM_BIOS, so nothing in the ROM path is shared between machines.

Three shared data files sit outside that per-machine content and are listed below. Two more that the MAME lineage would suggest are unreachable here. The mechanical sample set named by pinmame_sample_names, "*pinmame" followed by eighteen .wav members (pinmame src/wpc/wpcsam.c:31-57), is dead twice over: readsamples returns before opening anything unless options.use_samples is set (pinmame src/common.c:271), the two files that register that option live in src/windows/config.c and src/unix/sound.c and neither is in the libpinmame source list, and PinmameSetConfig zeroes the whole options struct (pinmame src/libpinmame/libpinmame.cpp:807); independently, SAMPLESINTERFACE is defined at pinmame src/wpc/wpcsam.h:23 and no driver in the tree references it. history.dat and mameinfo.dat (pinmame src/datafile.c:619-623, 649-653) are read only by displayhistory, a page of the MAME on-screen menu (pinmame src/usrintrf.c:2846-2851), and by the listing path in pinmame src/info.c:820 which libpinmame never calls; VPX passes NULL for fn_IsKeyPressed, the thirteenth member of PinmameConfig (plugins/pinmame/Controller.cpp:73, pinmame src/libpinmame/libpinmame.h:418-433), so osd_is_key_pressed always answers 0 (pinmame src/libpinmame/libpinmame.cpp:355-361) and the menu cannot be opened.

The pinmame observations were read at f102dc6cce7eb51e64427dd0b52bed37dbd2adea.

2 files | 0 required, 2 optional | 2 in repo, 0 missing Categories: 2 game data

hiscore.dat optional in repo game_data
MAME high score memory map database, read once per machine start

  • System: vpinball
  • Source: pinmame src/hiscore.c:18, pinmame src/hiscore.c:223-230, pinmame src/cpuexec.c:332-334, pinmame src/cpuexec.c:393, pinmame src/cpuexec.c:1755
  • Platforms: lakka, retroarch, retropie
  • hs_open is called unconditionally at the top of cpu_run for every PinMAME machine, and the whole body sits behind if (f), so an absent file is a no-op. It resolves to a bare filename against the working directory, which is the table's own folder: libpinmame sets paths for eight file types and FILETYPE_HIGHSCORE_DB is not among them, and the option table that would supply a default is linked only by the Windows COM build (pinmame src/libpinmame/libpinmame.cpp:816-823, pinmame src/libpinmame/fileio.c:140, pinmame src/win32com/VPinMAMEConfig.cpp:127).

cheat.dat optional in repo game_data
MAME cheat database, read when the per-ROM ini enables cheats

  • System: vpinball
  • Source: pinmame src/cheat.c:8434, pinmame src/cheat.c:8602-8614, pinmame src/mame.c:578-583, plugins/pinmame/Controller.cpp:156
  • Off by default: PinmameSetConfig zeroes options, and VPX only turns it on from the cheat key of /ini/.ini, which it also rewrites on every run. With it on, InitCheat loads the database and an absent file leaves the menu showing "cheat database not found" (pinmame src/cheat.c:2463). Same bare-filename resolution as hiscore.dat.

Generated on 2026-08-23T16:12:06Z