mirror of
https://github.com/Abdess/retroarch_system.git
synced 2026-10-11 05:53:23 -05:00
197 lines
11 KiB
YAML
197 lines
11 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-08-08"
|
|
source_commit: "a8087ea9a3be7208c7def16045e4b5cc0330f80c"
|
|
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.
|
|
|
|
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 <prefpath>/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, standalone/cmake/CMakeLists_gl-linux-x64.txt:698).
|
|
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 (pin3d.cpp:475-477),
|
|
the bumper and kicker textures (src/parts/bumper.cpp:246-290,
|
|
src/parts/kicker.cpp:273-319), TableSizes.csv, which the live UI reads to
|
|
guess the glass position of a table that does not declare one
|
|
(src/core/TableDB.cpp:11-14, LiveUI.cpp:1705-1706), vpx.html for the built-in
|
|
web server (standalone/inc/webserver/WebServer.cpp:32) 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 (standalone/inc/flexdmd/UltraDMD.cpp:31-40,
|
|
standalone/inc/flexdmd/AssetManager.cpp:84-90,232).
|
|
|
|
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/parts/pintable.cpp:1641-1663), 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 (standalone/inc/vpinmame/VPinMAMEController.cpp:165-180). 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
|
|
(standalone/inc/vpinmame/VPinMAMEController.cpp:145-160, 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: "standalone/cmake/CMakeLists_gl-linux-x64.txt:695-720"
|
|
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: "pin3d.cpp:475-477, src/parts/bumper.cpp:246-290, src/parts/kicker.cpp:273-319, src/core/TableDB.cpp:11-14, LiveUI.cpp:1705-1706, standalone/inc/webserver/WebServer.cpp:32"
|
|
- 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: "standalone/inc/flexdmd/UltraDMD.cpp:31-40, standalone/inc/flexdmd/AssetManager.cpp:84-90,232"
|
|
- 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/parts/pintable.cpp:1641-1663"
|
|
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, standalone/cmake/CMakeLists_gl-linux-x64.txt:52-693"
|
|
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: "standalone/inc/vpinmame/VPinMAMEController.cpp:165-180, 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: "standalone/inc/b2s/forms/FormBackglass.cpp:372-415"
|
|
note: "Version-checked against the B2S server on load; absence only warns."
|
|
- what: "Serum colorizations, <pinmame root>/AltColor/"
|
|
source_ref: "standalone/inc/vpinmame/VPinMAMEController.cpp:55-59"
|
|
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: "standalone/inc/vpinmame/VPinMAMEController.cpp:336-338"
|
|
- what: "PUP video packs, <table folder>/pupvideos"
|
|
source_ref: "standalone/inc/pup/PUPManager.cpp:12, standalone/inc/vpinmame/VPinMAMEController.cpp:61-65"
|
|
- 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: "main.cpp:901-914"
|
|
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: "Logger.cpp:58, 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, standalone/inc/vpinmame/VPinMAMEController.cpp:186-198"
|
|
note: "The ini directory is created when missing; the others are written by PinMAME as the machine runs."
|