mirror of
https://github.com/Abdess/retroarch_system.git
synced 2026-10-10 13:33:24 -05:00
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.
204 lines
12 KiB
YAML
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."
|