Files
libretro/emulators/visual-pinball.yml
T
Abdessamad Derraz 7e0f27161f feat: reprofile visual-pinball onto FileLocator
VPX moved file location into one class. FileLocator holds the read-only
application path and the preferences path, and picks between two layout
modes from where the application ini sits: AppPrefData splits static
data, settings and tables across three roots, AppOnly keeps everything
in the application folder. The profile still described m_szMyPath and
m_szMyPrefPath, identifiers the tree no longer carries.

Script lookup changed shape with it. SearchScript walks ten locations
case-insensitively, rooted on the table's own folder rather than the
working directory, where the profile documented seven. The editor's
completion parser left that search entirely: ParseVPCore opens core.vbs
at the Scripts subfolder alone and warns when it is absent.

The PinMAME root now prefers a pinmame folder beside the table before
the global setting and the platform default. vpx.html is served by the
web server, the LiveUI no longer naming it.

Four PinMAME citations read as external again: the project word is only
recognised behind a list delimiter, and one of them sat behind "at".
41 refs, 37 anchored, 4 external, none left to read.
2026-09-04 15:09:36 +02:00

204 lines
12 KiB
YAML

emulator: visual-pinball
type: standalone
core_classification: game_engine
source: "https://github.com/vpinball/vpinball"
upstream: "https://github.com/vpinball/vpinball"
profiled_date: "2026-09-04"
source_commit: "d363edb180b8219b4ddd5ec94f87932141efb3b6"
core_version: "10.8.0"
display_name: "Visual Pinball X"
cores:
- vpinball
- visual-pinball
systems:
- vpinball
mode: standalone
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.
File location now sits in one class. FileLocator holds m_appPath, the
read-only installation folder, and m_prefPath, the preferences folder that
-PrefPath overrides, and it works in one of two layout modes: AppPrefData
splits static data, settings and table files across the three, AppOnly keeps
everything in the application folder, which is the legacy Windows 9x
behaviour. Which one applies is decided by where the application ini file is
found (src/core/FileLocator.h:11-25,57,63-66,
src/core/FileLocator.cpp:379-412). Batocera's 001-default-path.patch
redirects the PinMAME root from $HOME/.pinmame to <prefpath>/pinmame.
Table scripts pull their libraries through SearchScript, which walks ten
locations in order, each case-insensitively: the table's own folder, then
user/ and scripts/ beside it, then the installation folder with user/,
scripts/ and tables/ under it, then the preferences folder with user/ and
scripts/ under it (src/core/FileLocator.cpp:379-412,
src/parts/pintable.cpp:470-480, src/core/main.h:118-119). 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 no longer shares that search: ParseVPCore opens core.vbs
at one place, the Scripts application subfolder, and shows a warning box when
it is not there (src/ui/win/codeview.cpp:2171-2179, 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), 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:326-356). 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 in the PinMAME tree (pinmame src/wpc/wpcsam.h:23) and no driver
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.
files:
- name: hiscore.dat
system: vpinball
category: game_data
required: false
description: "MAME high score memory map database, read once per machine start"
source_ref: "pinmame src/hiscore.c:18,223-230, pinmame src/cpuexec.c:332-334,393,1755"
note: >-
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).
- name: cheat.dat
system: vpinball
category: game_data
required: false
description: "MAME cheat database, read when the per-ROM ini enables cheats"
source_ref: "pinmame src/cheat.c:8434,8602-8614, pinmame src/mame.c:578-583, plugins/pinmame/Controller.cpp:156"
note: >-
Off by default: PinmameSetConfig zeroes options, and VPX only turns it on
from the `cheat` key of <pinmame root>/ini/<romname>.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.
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, src/core/main.h:118-119, src/core/FileLocator.cpp:379-412, src/ui/win/codeview.cpp:2171-2179"
- 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, lib/src/WebServer.cpp:94,100"
- 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:326-356, 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"
- 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."