Files
libretro/emulators/visual-pinball.yml
T
Abdessamad Derraz cae30d1e8f feat: collect Visual Pinball plugin data trees
Nixie's layouts at vpinball e4a79a5, PinMAME memmaps at tomlogic/pinball-memory-maps 68c1b337 and game definitions at vpinball/pinmame-game-defs 6eece7e5: the subset every platform build copies into third-party/. 1,280 files, each matched to its upstream git blob, documented as three directory entries.
2026-10-20 00:34:58 +02:00

587 lines
32 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-10-20"
source_commit: "e4a79a5d58df3d543ffb5360ae8458cfdf4cb7bb"
core_version: "10.8.1"
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 (src/parts/pintable.cpp:1538-1541), and a .vpz
pack, a zip or a plain folder of JSON part files, is read through the JSON
serializer instead (src/parts/pintable.cpp:1447,
src/utils/JSONSerializer.cpp:1096-1102). Every build other than the Windows
editor compiles the shared source set with __STANDALONE__ and links
libwinevbs, Wine's VBScript engine with its COM and ATL headers, beside SDL3,
SDL3_ttf, FreeImage, hidapi, libspatialaudio and libmysofa with zlib
(make/CMakeLists_app.txt:535-556,607-617, make/CMakeLists_sources.txt:829-835).
AlphaDMD, AltSound, B2S, DMDUtil, DOF, FlexDMD, HelloScript, HelloWorld,
Inspector, Nixie, PinMAME, PUP, RemoteControl, Serum, UpscaleDMD, VNI and WMP
are plugins staged in plugins/ next to the binary, ../PlugIns on macOS
(make/CMakeLists_plugins.txt:21-25,39-55). The player scans that folder and
loads every subfolder whose plugin.cfg names a library for the running
platform (src/core/player.cpp:145, src/core/FileLocator.cpp:216-222,
plugins/plugins/MsgPluginManager.cpp:425-436).
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 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 VPinballX.ini is found: in
the preferences folder gives AppPrefData, else beside the executable gives
AppOnly, else AppPrefData (src/core/FileLocator.h:11-25,60,66-69,
src/core/FileLocator.cpp:195-206). The preferences folder is the SDL
preference path for VPinballX with a major.minor subfolder
(src/core/FileLocator.cpp:46-53). 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:400-433,
src/core/ScriptGlobalTable.cpp:350-379). The
scripts/ directory the build ships carries the 73 .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), copied from
src/scripts (make/CMakeLists_app.txt:633-637). The Windows editor's
completion parser asks for core.vbs through the same search without a table,
so in the seven installation and preferences locations, and shows a warning
box when none holds it (src/ui/win/codeview.cpp:2053-2061,
src/core/FileLocator.cpp:238-245).
Table scripts also read four directory properties. UserDirectory is the
table's user folder, created on demand, TablesDirectory the system documents
folder or the installation folder when SDL reports none, MusicDirectory the
table's music folder with an optional subfolder, ScriptsDirectory scripts/
under the installation folder. Each fails when its directory does not exist
(src/core/ScriptGlobalTable.cpp:381-422, src/core/FileLocator.cpp:251-259).
In AppPrefData mode user/, music/, cache/<table name>/ and autosave/ sit
beside the table. A folder missing there on a read is looked up the AppOnly
way, where user/ hangs off the installation folder, the cache sits under
Cache/<table name> in the preferences folder and music/ is tried under the
installation folder, the table folder, then the preferences folder
(src/core/FileLocator.cpp:267-398).
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, the first two
loaded with no fallback (src/renderer/Renderer.cpp:176-188),
the bumper and kicker textures (src/parts/bumper.cpp:150,162,174,188,
src/parts/kicker.cpp:200-241), the segment display textures
(src/renderer/Renderer.cpp:1503-1521), TableSizes.csv, the table size
database (src/core/TableDB.cpp:16), vpinball.png for the window icon
(src/renderer/Window.cpp:280), LiberationSans-Regular.ttf, the font textboxes
and decals fall back to when neither the table folder, as
<FontName>-<Style>.ttf, nor the table file carries the font, nor on builds
with the Windows SDK an installed font matches
(src/renderer/TextRenderer.cpp:125-196), and which PUP adds after the fonts
of a pack's FONTS folder (plugins/pup/PUPManager.cpp:468-475),
fabian-hrir.sofa, listed below, the editor/ part icons
(src/ui/live/editor/EditorChrome.cpp:200) and four starter tables,
blankTable.vpx, exampleTable.vpx, lightSeqTable.vpx and strippedTable.vpx:
the live editor loads blankTable.vpx when started without a table or when
the requested one fails to load, and its New Table menu loads any of the
four (src/core/AppCommands.cpp:287-293, src/ui/live/EditorUI.cpp:339-358).
OpenGL builds also get shaders-10.8.1/, the .glfx and .fxh sources parsed at
runtime (src/core/FileLocator.cpp:223, src/renderer/Shader.cpp:1803-1804,2207-2210,
make/CMakeLists_app.txt:639-649), and the directory is not copied for the BGFX
renderer. Four plugins carry resources of their own: plugins/flexdmd/assets/
holds the bitmap fonts UltraDMD asks for by resource name, the
FlexDMD.Resources. prefix being stripped before the lookup
(plugins/flexdmd/UltraDMD.cpp:20-24,32-34,
plugins/flexdmd/resources/AssetManager.cpp:103-109,260-280),
plugins/nixie/layouts/ the default .nix layouts and the glass textures they
name (plugins/nixie/NixiePlugin.cpp:96-110, plugins/nixie/Nixie.cpp:45-65,104-129),
plugins/inspector/assets/ the pages of the inspector's web server
(plugins/inspector/InspectorPlugin.cpp:618-626), and plugins/pinmame/ the
memmaps/ and gamedefs/ trees the platform scripts fetch from
tomlogic/pinball-memory-maps at 68c1b33 and vpinball/pinmame-game-defs at
6eece7e (make/CMakeLists_plugin_PinMAME.txt:115-122, platforms/config.sh:12-13,
platforms/linux-x64/external.sh:252-258,558-561).
Two parts of that tree ship without a reader on the desktop targets.
docs/Changelog.txt is read by the About dialog
(src/ui/win/dialogs/AboutDialog.cpp:34), which only the Windows editor
build reaches, the editor being compiled out of every __STANDALONE__ build
(src/core/stdafx.h:36-40, src/core/AppCommands.cpp:14-18,
make/CMakeLists_app.txt:78-80), and assets/web/, vpx.html with its scripts
and style sheets, is served by the web server that only the iOS and Android
library build compiles (lib/src/WebServer.cpp:92-99,
make/CMakeLists_sources.txt:837-845, make/CMakeLists_app.txt:679).
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 when that folder holds roms/, else the
PinMAMEPath setting, else $HOME/.pinmame on Linux and macOS, <prefpath>/pinmame
on iOS and Android, and the registered Visual PinMAME install folder with its
registry folder settings on Windows
(plugins/pinmame/PinMAMEPlugin.cpp:216,274-294,437-509). libpinmame then hangs
roms, nvram, samples, cfg, hi, inp, memcard and sta off that root
(pinmame src/libpinmame/libpinmame.cpp:85-91,1141-1146) and reads alias.txt
from it, a list that renames a requested game before the driver lookup
(pinmame src/libpinmame/libpinmame.cpp:361-394,400-403). A memmaps folder,
beside roms/ in the table's pinmame folder, under the PinMAMEPath setting or
shipped in the plugin folder, is scanned for an index.json that maps the ROM
name to an NVRAM memory map, loaded with the platforms/<platform>.json it
names, and a gamedefs folder found the same way supplies
catalog/pinmame.json, which maps the driver to a game definition naming the
machine's inputs and outputs (plugins/pinmame/PinMAMEPlugin.cpp:445-472,
plugins/pinmame/Controller.cpp:184-284).
A ROM set is one zip per machine, and every ROM is looked up in the game's
zip first, then up its parent chain (pinmame src/common.c:1343-1348).
PinMAME carries neither GAME_IS_BIOS_ROOT nor ROM_SYSTEM_BIOS. What it has
are nine container sets flagged NOT_A_DRIVER, gts1, gts1s, gts80, gts80s,
gts80a, gts80as, allied, gp_110 and recel, each the parent of its family's
games and holding the family's system ROMs. A game declares its system ROMs
in its own set as well, so they are read from the game zip when it carries
them and from the container zip otherwise. The Allied Leisure and Game Plan
110 games declare nothing else. The nine are listed below.
Two shared data files sit outside that ROM content and are listed below as
well. 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:1132). 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/PinMAMEPlugin.cpp:411-427, pinmame src/libpinmame/libpinmame.h:451-467),
so osd_is_key_pressed always answers 0
(pinmame src/libpinmame/libpinmame.cpp:576-582) and the menu cannot be opened.
The pinmame observations were read at 5386aa17fbed2cf41470cea252c38ed77eac64e5,
the revision the build scripts fetch (platforms/config.sh:11), and the libdof
ones at 4908f45a5bd3b05369885b23f39465d589a32c1f (platforms/config.sh:17).
files:
- name: gts1.zip
path: "pinmame/roms/gts1.zip"
system: vpinball
category: bios_zip
required: false
description: "Gottlieb System 1 system ROMs"
source_ref: "pinmame src/wpc/gts1games.c:15-22,33-34, pinmame src/wpc/gts1.h:229-233, pinmame src/common.c:1343-1348, pinmame src/fileio.c:953-966"
note: >-
Container set, parent of every System 1 game. The path is the layout
beside a table, and roms/ sits the same way under the PinMAMEPath setting or
$HOME/.pinmame. Each game declares the same two ROMs and reads them from
its own zip first, so this archive is only reached when the game zip
lacks them. A member is matched by name, then by checksum.
contents:
- name: A1752CF.bin
size: 2048
crc32: "614a3bd9"
sha1: "febca18fb6f96037ca82e515dd161dfcb0e4c776"
- name: A1753CE.bin
size: 2048
crc32: "4cd312dd"
sha1: "31245daa9972ef8652caee69986585bb8239e86e"
- name: gts1s.zip
path: "pinmame/roms/gts1s.zip"
system: vpinball
category: bios_zip
required: false
description: "Gottlieb System 1 with sound board, system ROMs"
source_ref: "pinmame src/wpc/gts1games.c:24-31,36-37, pinmame src/wpc/gts1.h:229-233"
note: "Container set, clone of gts1 with the same two ROMs, so gts1.zip answers for it."
contents:
- name: A1752CF.bin
size: 2048
crc32: "614a3bd9"
sha1: "febca18fb6f96037ca82e515dd161dfcb0e4c776"
- name: A1753CE.bin
size: 2048
crc32: "4cd312dd"
sha1: "31245daa9972ef8652caee69986585bb8239e86e"
- name: gts80.zip
path: "pinmame/roms/gts80.zip"
system: vpinball
category: bios_zip
required: false
description: "Gottlieb System 80 with speech board, system ROMs"
source_ref: "pinmame src/wpc/gts80games.c:48-60,62-74,90-91"
note: >-
Container set, parent of the System 80 games, which declare the same two
ROMs themselves. The 7-digit conversions declare u2g807dc.bin and
u3g807dc.bin in their place, which this set does not hold.
contents:
- name: u2_80.bin
size: 4096
crc32: "4f0bc7b1"
sha1: "612cbacdca5cfa6ad23940796df3b7c385be79fe"
- name: u3_80.bin
size: 4096
crc32: "1e69f9d0"
sha1: "ad738cac2555830257b531e5e533b15362f624b9"
- name: gts80s.zip
path: "pinmame/roms/gts80s.zip"
system: vpinball
category: bios_zip
required: false
description: "Gottlieb System 80, system ROMs"
source_ref: "pinmame src/wpc/gts80games.c:48-60,92-93"
note: "Container set, clone of gts80 with the same two ROMs, so gts80.zip answers for it."
contents:
- name: u2_80.bin
size: 4096
crc32: "4f0bc7b1"
sha1: "612cbacdca5cfa6ad23940796df3b7c385be79fe"
- name: u3_80.bin
size: 4096
crc32: "1e69f9d0"
sha1: "ad738cac2555830257b531e5e533b15362f624b9"
- name: gts80a.zip
path: "pinmame/roms/gts80a.zip"
system: vpinball
category: bios_zip
required: false
description: "Gottlieb System 80A with speech board, system ROMs"
source_ref: "pinmame src/wpc/gts80games.c:76-88,95-96"
note: "Container set, parent of the System 80A games, which declare the same two ROMs themselves."
contents:
- name: u2_80a.bin
size: 4096
crc32: "241de1d4"
sha1: "9d5942704cbdec6565d6335e33e9f7e4c60a41ac"
- name: u3_80a.bin
size: 4096
crc32: "2d77ccdc"
sha1: "47241ccd365e8d74d5aa5b775acf6445cc95b8a8"
- name: gts80as.zip
path: "pinmame/roms/gts80as.zip"
system: vpinball
category: bios_zip
required: false
description: "Gottlieb System 80A, system ROMs"
source_ref: "pinmame src/wpc/gts80games.c:76-88,97-98"
note: "Container set, clone of gts80a with the same two ROMs, so gts80a.zip answers for it."
contents:
- name: u2_80a.bin
size: 4096
crc32: "241de1d4"
sha1: "9d5942704cbdec6565d6335e33e9f7e4c60a41ac"
- name: u3_80a.bin
size: 4096
crc32: "2d77ccdc"
sha1: "47241ccd365e8d74d5aa5b775acf6445cc95b8a8"
- name: allied.zip
path: "pinmame/roms/allied.zip"
system: vpinball
category: bios_zip
required: false
description: "Allied Leisure system ROMs"
source_ref: "pinmame src/wpc/allied.c:872-879"
note: >-
Container set, parent of the Allied Leisure games. Those games declare
these three ROMs and no other, so each one runs from its own zip or from
this one.
contents:
- name: alliedu5.bin
size: 1024
crc32: "e4fb64fb"
sha1: "a3d9de7cbfb42180a860e0bbbeaeba96d8bd1e20"
- name: alliedu6.bin
size: 1024
crc32: "dca980dd"
sha1: "3817d75413854d889fc1ce4fd6a51d820d1e0534"
- name: alliedu3.bin
size: 1024
crc32: "13f42789"
sha1: "baa0f73fda08a3c5d6f1423fb329e4febb07ef97"
- name: gp_110.zip
path: "pinmame/roms/gp_110.zip"
system: vpinball
category: bios_zip
required: false
description: "Game Plan Model 110 system ROMs"
source_ref: "pinmame src/wpc/gpgames.c:68-74, pinmame src/wpc/gp.h:201-205"
note: >-
Container set, parent of the Game Plan cocktail games. Those games declare
these two ROMs and no other, so each one runs from its own zip or from
this one.
contents:
- name: a-110.u12
size: 2048
crc32: "ed0d518b"
sha1: "8f3ca8792ad907c660d9149a1aa3a3528c7573e3"
- name: b1-110.u13
size: 2048
crc32: "a223f2e8"
sha1: "767e15e19e11399935c890c1d1034dccf1ad7f92"
- name: recel.zip
path: "pinmame/roms/recel.zip"
system: vpinball
category: bios_zip
required: false
description: "Recel System III shared program"
source_ref: "pinmame src/wpc/recelgames.c:72-75, pinmame src/wpc/recel.h:120-131"
note: "Container set, parent of the Recel games, which declare the same two ROMs beside their own game PROM."
contents:
- name: a2361.b1
size: 2048
crc32: "d0c4695d"
sha1: "4846adb3f6c292626840ba5255ffc5e788a69301"
- name: a2362.b2
size: 2048
crc32: "39a70611"
sha1: "8545e168a5f256150bcff12d1e6d8efffd08c3cd"
- 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, 1782, src/core/player.cpp:435-437"
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
the player sets to 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:85-91,1141-1146,
pinmame src/libpinmame/fileio.c:146, pinmame src/win32com/VPinMAMEConfig.cpp:127).
- name: cheat.dat
system: vpinball
category: game_data
required: false
description: "MAME cheat database, read when the PinMAME plugin's Cheat setting is on"
source_ref: "pinmame src/cheat.c:8434,8602-8614, pinmame src/mame.c:590-596, pinmame src/libpinmame/libpinmame.cpp:1205-1208, plugins/pinmame/PinMAMEPlugin.cpp:217,529, plugins/pinmame/Controller.cpp:163"
note: >-
Off by default: PinmameSetConfig zeroes options, and the plugin's Cheat
setting, false unless the user changes it, is handed to PinmameSetCheat
before each 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.
- name: fabian-hrir.sofa
path: "assets/fabian-hrir.sofa"
system: vpinball
required: false
bundled: true
size: 1766147
sha1: "5bf46cfb6472b81f4aa7fb2c87bc79afc23109d7"
md5: "b98b60a050e3c2edfa7a59863c625c61"
description: "FABIAN full-sphere HRIR set, the HRTF of the binaural spatial audio renderer"
source_ref: "src/audio/SpatialAudio.cpp:49-56,344-361, make/CMakeLists_app.txt:633-637"
note: >-
Read from assets/ under the installation folder when libspatialaudio is
built with libmysofa, which every build script does. The headphone and VR
binauralizer then runs second order ambisonics on it. A missing or
unreadable file logs "Failed to load the binaural HRTF" and audio falls
back to loudspeaker decoding. The file sits in src/assets, which the build
copies beside the binary.
- name: "plugins/nixie/layouts/"
type: directory
path: "plugins/nixie/layouts/"
system: vpinball
required: false
bundled: true
description: "Nixie default score display layouts, twelve .nix files and the four glass textures they name"
source_ref: "plugins/nixie/NixiePlugin.cpp:96-110, plugins/nixie/Nixie.cpp:45-65,104-129, make/CMakeLists_plugin_Nixie.txt:92-95"
note: >-
Copied from plugins/nixie/layouts in vpinball at e4a79a5. It is the last
source each Nixie window falls back to, after the table's own .nix and
the LayoutFolder setting. Every .nix file in the folder is parsed, and
glass images are read relative to the layout that names them. Without
the folder the windows get no default layout.
- name: "plugins/pinmame/memmaps/"
type: directory
path: "plugins/pinmame/memmaps/"
system: vpinball
required: false
bundled: true
description: "NVRAM memory maps, index.json with the maps/ and platforms/ files it names"
source_ref: "plugins/pinmame/PinMAMEPlugin.cpp:465-472, plugins/pinmame/Controller.cpp:184-242, make/CMakeLists_plugin_PinMAME.txt:115-122, platforms/config.sh:12, platforms/linux-x64/external.sh:252-254,558-559"
note: >-
From tomlogic/pinball-memory-maps at
68c1b3373ba74cd07f42fba9d56db63ea28212dc, which every platform script
fetches and copies as index.json, maps/ and platforms/. The plugin falls
back to this folder when neither the table's pinmame folder nor the
PinMAMEPath setting holds a memmaps folder. Without one no memory map is
loaded and the machine still runs.
- name: "plugins/pinmame/gamedefs/"
type: directory
path: "plugins/pinmame/gamedefs/"
system: vpinball
required: false
bundled: true
description: "PinMAME game definitions, catalog/pinmame.json, the machines/ files it names and the controllers/ files those reference"
source_ref: "plugins/pinmame/PinMAMEPlugin.cpp:465-472, plugins/pinmame/Controller.cpp:244-284, make/CMakeLists_plugin_PinMAME.txt:115-122, platforms/config.sh:13, platforms/linux-x64/external.sh:256-258,560-561"
note: >-
From vpinball/pinmame-game-defs at
6eece7e53de9463bf783b9476ce3aeb98e2e7256, which every platform script
fetches and copies as catalog/, machines/ and controllers/. The plugin
falls back to this folder the same way as memmaps. Without
catalog/pinmame.json PinMAME receives an empty game definition and the
machine still runs.
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: "make/CMakeLists_app.txt:633-637"
entries:
- what: "scripts/, the .vbs library tables include"
source_ref: "src/core/FileLocator.cpp:400-433, src/core/ScriptGlobalTable.cpp:350-379, src/ui/win/codeview.cpp:2053-2061"
- what: "assets/, textures, segment display maps, TableSizes.csv, the window icon, the fallback font, the editor icons"
source_ref: "src/renderer/Renderer.cpp:176-188,1503-1521, src/parts/bumper.cpp:150,162,174,188, src/parts/kicker.cpp:200-241, src/core/TableDB.cpp:16, src/renderer/Window.cpp:280, src/renderer/TextRenderer.cpp:184-185, plugins/pup/PUPManager.cpp:472-474, src/ui/live/editor/EditorChrome.cpp:200"
- what: "assets/blankTable.vpx, exampleTable.vpx, lightSeqTable.vpx, strippedTable.vpx"
source_ref: "src/core/AppCommands.cpp:287-293, src/ui/live/EditorUI.cpp:339-358"
note: "The live editor's default table and its four New Table templates."
- what: "shaders-10.8.1/, .glfx and .fxh parsed at runtime by the OpenGL renderer"
source_ref: "src/core/FileLocator.cpp:223, src/renderer/Shader.cpp:1803-1804, src/renderer/Shader.cpp:2207-2210, make/CMakeLists_app.txt:639-649"
- what: "plugins/<name>/plugin.cfg, the descriptor naming each plugin's library"
source_ref: "src/core/player.cpp:145, plugins/plugins/MsgPluginManager.cpp:425-436"
- what: "plugins/flexdmd/assets/, the bitmap fonts UltraDMD names as FlexDMD.Resources.*"
source_ref: "plugins/flexdmd/UltraDMD.cpp:20-24,32-34, plugins/flexdmd/resources/AssetManager.cpp:103-109,260-280, make/CMakeLists_plugin_FlexDMD.txt:179-182"
- what: "plugins/nixie/layouts/, the default .nix score display layouts and their glass textures"
source_ref: "plugins/nixie/NixiePlugin.cpp:96-110, plugins/nixie/Nixie.cpp:45-65,104-129, make/CMakeLists_plugin_Nixie.txt:92-95"
note: >-
The last source each of the backglass, score view and topper windows
falls back to. Every .nix file in the folder is parsed, and a file is
kept only when it parses completely.
- what: "plugins/inspector/assets/, the inspector web pages"
source_ref: "plugins/inspector/InspectorPlugin.cpp:618-626, make/CMakeLists_plugin_Inspector.txt:96"
- what: "plugins/pinmame/memmaps/ and plugins/pinmame/gamedefs/, the NVRAM memory maps and game definitions"
source_ref: "make/CMakeLists_plugin_PinMAME.txt:115-122, plugins/pinmame/PinMAMEPlugin.cpp:465-472, platforms/config.sh:12-13, platforms/linux-x64/external.sh:252-258,558-561"
note: >-
Copied only when the platform script has fetched them into
third-party/: index.json, maps/ and platforms/ from
tomlogic/pinball-memory-maps, catalog/, machines/ and controllers/
from vpinball/pinmame-game-defs. A table's own pinmame folder or the
PinMAMEPath setting takes precedence.
shipped_without_a_reader:
note: "Copied into the build output but unreachable in the desktop standalone binary"
entries:
- what: "docs/Changelog.txt"
source_ref: "src/ui/win/dialogs/AboutDialog.cpp:34, src/core/stdafx.h:36-40, src/core/AppCommands.cpp:14-18, make/CMakeLists_app.txt:636"
note: "The About dialog belongs to the Windows editor, compiled out of every standalone build."
- what: "assets/web/, vpx.html and the files it pulls"
source_ref: "lib/src/WebServer.cpp:92-99, make/CMakeLists_sources.txt:837-845"
note: "The web server is compiled into the iOS and Android library build only."
user_supplied_paths:
note: "Per table, keyed on the table folder or the ROM name"
entries:
- what: "PinMAME ROM sets, <pinmame root>/roms/<romname>.zip"
source_ref: "plugins/pinmame/PinMAMEPlugin.cpp:437-509, pinmame src/libpinmame/libpinmame.cpp:86,1141-1143"
note: >-
One zip per machine. The root is the pinmame folder beside the table
when it holds roms/, else the PinMAMEPath setting, else $HOME/.pinmame
on Linux and macOS and <prefpath>/pinmame on iOS and Android.
Batocera patches the Linux fallback to <prefpath>/pinmame. On Windows
the last resort is the registered Visual PinMAME install folder, whose
rompath, nvram, samples, cfg and hiscore registry settings replace
the default subfolders.
- what: "PinMAME game aliases, <pinmame root>/alias.txt"
source_ref: "pinmame src/libpinmame/libpinmame.cpp:361-394,400-403"
note: "Optional. Each line pairs a requested game name with the ROM set loaded in its place."
- what: "NVRAM memory maps, memmaps/index.json and the map files it names"
source_ref: "plugins/pinmame/PinMAMEPlugin.cpp:448,459-460,468-469, plugins/pinmame/Controller.cpp:184-242"
note: >-
Optional. index.json maps the ROM name to a map file, whose
_metadata.platform names the platforms/<platform>.json loaded with it.
- what: "game definitions, gamedefs/catalog/pinmame.json and the definition it names"
source_ref: "plugins/pinmame/PinMAMEPlugin.cpp:449,461-462,470-471, plugins/pinmame/Controller.cpp:244-284"
note: "Optional. The catalog's drivers array maps the ROM name to a definition file under gamedefs/."
- what: "backglass, <table basename>.directb2s, else <table folder name>.directb2s"
source_ref: "plugins/b2s/B2SServer.cpp:317-323,446-463,487-491, plugins/b2s/B2SPlugin.cpp:76"
note: >-
Looked up in the table folder, or in the WorkingDir a table script
sets. Edits made in the plugin's backglass editor are written back to
the file through a temporary file renamed over it
(plugins/b2s/B2SServer.cpp:107-109).
- what: "Serum colorizations, <table folder>/serum/<rom>/<rom>.cROMc or .cRZ, else the SerumPath setting"
source_ref: "plugins/serum/serum.cpp:51,727-771"
note: "A namespace folder may sit above the ROM folder, and PinMAME games are also looked up in <table folder>/pinmame/altcolor."
- what: "VNI colorizations, <table folder>/vni/<rom>/<rom>.pal with an optional .vni, else the VniPath setting"
source_ref: "plugins/vni/vni.cpp:39,326-376"
note: "pin2dmd.pal and pin2dmd.vni are accepted in the same folder, and PinMAME games are also looked up in <table folder>/pinmame/altcolor."
- what: "alternative sound packages, <table folder>/altsound/<rom>, else <table folder>/pinmame/altsound/<rom>, else the plugin's Folder setting"
source_ref: "plugins/altsound/AltSoundPlugin.cpp:28,114-151"
note: "The library appends altsound/<rom> to the parent of the folder found, so that folder must be named altsound with this exact case."
- what: "PUP video packs, <table folder>/pupvideos/<rom>, else pupvideos/ under the PUPFolder setting"
source_ref: "plugins/pup/PUPManager.cpp:136-164, plugins/pup/PUPPlugin.cpp:66,298-309"
note: "A namespace folder may sit above the ROM folder."
- what: "Nixie layouts, <table basename>.nix, else <table folder name>.nix, else the LayoutFolder setting"
source_ref: "plugins/nixie/NixiePlugin.cpp:23,60-113, plugins/nixie/Nixie.cpp:45-65,104-129"
note: >-
The setting names one .nix file or a folder of them. Each window walks
the chain on its own and stops at the first source with a layout
targeting it. Glass and picture images are read relative to the
layout file.
- what: "DOF configuration, <prefpath>/directoutputconfig/GlobalConfig_B2SServer.xml, else ./directoutputconfig/ under the working directory"
source_ref: "plugins/dof/DOFPlugin.cpp:288-293, libdof src/DOF.cpp:36-45"
note: "The global configuration names the cabinet and table configuration files libdof reads next."
- what: "table music, music/ beside the table"
source_ref: "src/core/ScriptGlobalTable.cpp:120-134, src/core/FileLocator.cpp:267-398"
note: "In the legacy layout, music/ under the installation folder, then the table folder, then the preferences folder."
- what: "textbox and decal fonts, <table folder>/<FontName>-<Style>.ttf"
source_ref: "src/renderer/TextRenderer.cpp:116-153, src/parts/textbox.cpp:602, src/parts/decal.cpp:135"
note: "A font embedded in the table file is tried next."
- what: "table sidecars, the .vbs script override, the per-table .ini and the legacy .pov"
source_ref: "src/parts/pintable.cpp:1495-1511, src/parts/pintable.cpp:1058-1110, src/parts/pintable.h:599-613"
note: >-
The .vbs is searched like a script library under the table's name,
then beside the table under its folder's name. The .ini takes the
table's name, then its folder's name, a settings profile variant of
each being tried first. The .pov is imported only when no .ini
exists, else autopov.pov when present.
generated_files:
- what: "VPinballX.ini, the settings file"
source_ref: "src/core/VPApp.cpp:293-307, src/core/AppCommands.cpp:543-549"
note: >-
Looked up in the preferences folder, then beside the binary. When
neither holds one the preferences path is kept. -Ini names another file.
Batocera seeds it from the assets/Default_VPinballX.ini its pinned tree
carries and rewrites it before every launch.
- what: "VPReg.ini, values saved by table scripts in the table's user folder, and vpinball.log in the preferences folder"
source_ref: "src/core/ScriptGlobalTable.cpp:525-558, src/utils/Logger.cpp:160-161"
- what: "<table>.info, the frontend information file beside the table"
source_ref: "src/parts/pintable.cpp:1113-1124,1190-1215, src/parts/pintable.h:615-616, src/core/player.cpp:985,999"
note: "Only its VPX section is written, with the run count, the last run date and the play time."
- what: "PinMAME state: nvram/, cfg/, hi/, inp/, memcard/ and sta/"
source_ref: "pinmame src/libpinmame/libpinmame.cpp:87,89-90,1144-1146"
note: "Written by PinMAME as the machine runs."