Files
libretro/emulators/visual-pinball.yml
T

473 lines
25 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-04"
source_commit: "8a9f36d227a0e71be33c36418e4e3ffc8c5c2723"
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:1427-1430). 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; PinMAME, AltSound,
DMDUtil, DOF, FlexDMD, B2S, PUP, Serum, VNI and ScoreView are plugins staged
in plugins/ next to the binary (make/CMakeLists_app.txt:533-554,605-615,
make/CMakeLists_sources.txt:811-817, make/CMakeLists_plugins.txt:21-25,39-56).
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,57,63-66,
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:379-412,
src/core/ScriptGlobalTable.cpp:352-381). The
scripts/ directory the build ships carries the 71 .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:631-635). 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:2068-2076,
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:383-424, src/core/FileLocator.cpp:251-259).
In AppPrefData mode user/, music/, cache/ 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 and music/ is tried under the installation
folder, the table folder, then the preferences folder
(src/core/FileLocator.cpp:267-377).
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:148,160,172,186,
src/parts/kicker.cpp:198-239), the segment display textures
(src/renderer/Renderer.cpp:1493-1510), 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 textbox font
used when the table folder holds no <FontName>-<Style>.ttf
(src/parts/textbox.cpp:701-722), 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:277-283, src/ui/live/EditorUI.cpp:338-357).
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:1827-1828,2231-2234,
make/CMakeLists_app.txt:637-647); the directory is not copied for the BGFX
renderer. Three 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,252-272),
plugins/scoreview/layouts/ the default .scv layouts
(plugins/scoreview/ScoreViewPlugin.cpp:64-77) and plugins/inspector/assets/
the pages of the inspector's web server
(plugins/inspector/InspectorPlugin.cpp:618-626).
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 sits in the Windows source
list only (make/CMakeLists_sources.txt:493,542-543,
make/CMakeLists_app.txt:78-80), and assets/web/, vpx.html with its scripts
and style sheet, 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:819-825, 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
(plugins/pinmame/PinMAMEPlugin.cpp:214,322-367). libpinmame then hangs roms,
nvram, samples, cfg, hi, inp, memcard and sta off that root
(pinmame src/libpinmame/libpinmame.cpp:1080-1087) and reads alias.txt from
it, a list that renames a requested game before the driver lookup
(pinmame src/libpinmame/libpinmame.cpp:304-337,343-346). A memmaps folder,
beside roms/ in the table's pinmame folder or under the PinMAMEPath setting,
is scanned for an index.json that maps the ROM name to an NVRAM memory map,
loaded with the platforms/<platform>.json it names
(plugins/pinmame/PinMAMEPlugin.cpp:339,346-347,
plugins/pinmame/Controller.cpp:183-241).
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:1071); 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:304-320, pinmame src/libpinmame/libpinmame.h:422-438),
so osd_is_key_pressed always answers 0
(pinmame src/libpinmame/libpinmame.cpp:519-525) and the menu cannot be opened.
The pinmame observations were read at 268854a18be9ad334569b5654345c06a7d0ef521,
the revision the build scripts fetch (platforms/config.sh:11).
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; 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:70-73, pinmame src/wpc/recel.h:119-130"
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, 1755, src/core/player.cpp:463-465"
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:1080-1087,
pinmame src/libpinmame/fileio.c:141, 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:581-587, pinmame src/libpinmame/libpinmame.cpp:1141-1144, plugins/pinmame/PinMAMEPlugin.cpp:215,373, plugins/pinmame/Controller.cpp:162"
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
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-360, make/CMakeLists_app.txt:631-635"
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 the repository's top-level
assets/ while the build copies src/assets, so no build output carries it.
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:631-635"
entries:
- what: "scripts/, the .vbs library tables include"
source_ref: "src/core/FileLocator.cpp:379-412, src/core/ScriptGlobalTable.cpp:352-381, src/ui/win/codeview.cpp:2068-2076"
- 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,1493-1510, src/parts/bumper.cpp:148,160,172,186, src/parts/kicker.cpp:198-239, src/core/TableDB.cpp:16, src/renderer/Window.cpp:280, src/parts/textbox.cpp:719-720, src/ui/live/editor/EditorChrome.cpp:200"
- what: "assets/blankTable.vpx, exampleTable.vpx, lightSeqTable.vpx, strippedTable.vpx"
source_ref: "src/core/AppCommands.cpp:277-283, src/ui/live/EditorUI.cpp:338-357"
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:1827-1828, src/renderer/Shader.cpp:2231-2234, make/CMakeLists_app.txt:637-647"
- 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,252-272, make/CMakeLists_plugin_FlexDMD.txt:179-182"
- what: "plugins/scoreview/layouts/, the default score view layouts"
source_ref: "plugins/scoreview/ScoreViewPlugin.cpp:64-77, make/CMakeLists_plugin_ScoreView.txt:92"
- what: "plugins/inspector/assets/, the inspector web pages"
source_ref: "plugins/inspector/InspectorPlugin.cpp:618-626, make/CMakeLists_plugin_Inspector.txt:96"
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, make/CMakeLists_sources.txt:542-543, make/CMakeLists_app.txt:634"
note: "The About dialog is in the Windows editor source list only."
- what: "assets/web/, vpx.html and the files it pulls"
source_ref: "lib/src/WebServer.cpp:92-99, make/CMakeLists_sources.txt:819-825"
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:322-367, pinmame src/libpinmame/libpinmame.cpp:1080"
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; Batocera patches that last fallback to
<prefpath>/pinmame.
- what: "PinMAME game aliases, <pinmame root>/alias.txt"
source_ref: "pinmame src/libpinmame/libpinmame.cpp:304-337,343-346"
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:339,346-347, plugins/pinmame/Controller.cpp:183-241"
note: >-
Optional. index.json maps the ROM name to a map file, whose
_metadata.platform names the platforms/<platform>.json loaded with it.
- what: "backglass, <table basename>.directb2s, else <table folder name>.directb2s"
source_ref: "plugins/b2s/B2SServer.cpp:33-45, plugins/b2slegacy/forms/FormBackglass.cpp:370-378,411-423"
note: "The legacy plugin checks the file version against the B2S server version on load."
- what: "Serum colorizations, <table folder>/serum/<rom>/<rom>.cROMc or .cRZ, else the SerumPath setting"
source_ref: "plugins/serum/serum.cpp:49,561-602"
note: "A namespace folder may sit above the ROM folder; 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; 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,110-143"
- what: "PUP video packs, <table folder>/pupvideos/<rom>, else pupvideos/ under the PUPFolder setting"
source_ref: "plugins/pup/PUPManager.cpp:129-157, plugins/pup/PUPPlugin.cpp:64,292-294"
- what: "score view layout, <table basename>.scv, else <table folder name>.scv, else the LayoutFolder setting"
source_ref: "plugins/scoreview/ScoreViewPlugin.cpp:23,46-62"
- what: "table music, music/ beside the table"
source_ref: "src/core/ScriptGlobalTable.cpp:122-136, src/core/FileLocator.cpp:267-377"
note: "In the legacy layout, music/ under the installation folder, then the table folder, then the preferences folder."
- what: "textbox fonts, <table folder>/<FontName>-<Style>.ttf"
source_ref: "src/parts/textbox.cpp:701-722"
- what: "table sidecars, the .vbs script override, the per-table .ini and the legacy .pov"
source_ref: "src/parts/pintable.cpp:1325-1331, src/parts/pintable.cpp:1383-1399, src/parts/pintable.h:560-587"
generated_files:
- what: "VPinballX.ini, the settings file"
source_ref: "src/core/VPApp.cpp:270-284, src/core/AppCommands.cpp:533-539"
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; vpinball.log in the preferences folder"
source_ref: "src/core/ScriptGlobalTable.cpp:527-557, src/utils/Logger.cpp:164-165"
- what: "PinMAME state: nvram/, cfg/, hi/, inp/, memcard/ and sta/"
source_ref: "pinmame src/libpinmame/libpinmame.cpp:1081,1083-1087"
note: "Written by PinMAME as the machine runs."