From ccd8a98315bc9ec2285035149c0c8322832939ad Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Sun, 4 Oct 2026 17:42:50 +0200 Subject: [PATCH] feat: reprofile visual pinball, realign three profiles --- emulators/lightspark.yml | 8 +- emulators/ruffle.yml | 16 +- emulators/supermodel.yml | 20 +- emulators/visual-pinball.yml | 461 +++++++++++++++++++++++++++-------- 4 files changed, 378 insertions(+), 127 deletions(-) diff --git a/emulators/lightspark.yml b/emulators/lightspark.yml index e43117b7..14040b0b 100644 --- a/emulators/lightspark.yml +++ b/emulators/lightspark.yml @@ -4,7 +4,7 @@ core_classification: game_engine source: "https://github.com/lightspark/lightspark" upstream: "https://github.com/lightspark/lightspark" profiled_date: "2026-08-08" -source_commit: "d51ab60193b7baa56b2f6ec55f9a7789f99f6ee9" +source_commit: "bfe122834a17ab63a80f5ec36ff7c0dbfcac0321" core_version: "0.9.0" display_name: "Adobe Flash (Lightspark)" cores: @@ -24,7 +24,7 @@ notes: | Startup reads nothing. The two GLSL shaders sit in the tree as src/lightspark.frag and src/lightspark.vert but the preprocessor pulls them into string literals, "directly include shader source to avoid filesystem - access" (src/backends/rendering.cpp:1039-1042,1059-1062), which is also how + access" (src/backends/rendering.cpp:1059-1062,1079-1082), which is also how 0.8.7 builds them. The face given to nanoVG for text is Roboto Medium, decoded at runtime from a base85 array in the binary (src/launcher.cpp:1567, src/platforms/engineutils.cpp:500-502), and the launcher icon face is embedded @@ -36,7 +36,7 @@ notes: | Fonts named by the content go through fontconfig, which answers with whatever face the host has installed: FcFontMatch then FcPatternGetString(FC_FILE) hands a path straight to nvgCreateFont (src/backends/cachedsurface.cpp:147-168). No - name, path, size or hash is fixed anywhere, README:27-30 marks fontconfig + name, path, size or hash is fixed anywhere, README.md:27-30 marks fontconfig itself optional, and an unmatched family leaves nanoVGFontID at -1 and falls back to the embedded face. @@ -44,7 +44,7 @@ notes: | commit and at 0.8.7 (src/parsing/textfile.cpp:74-106). fontPath holds "TimesNewRoman.ttf" on Windows (src/backends/rendering.cpp:102) but reaches only cairo_select_font_face, which takes a family name rather than a path, and - only under ENABLE_CAIRO (src/backends/rendering.cpp:1274), left FALSE by + only under ENABLE_CAIRO (src/backends/rendering.cpp:1294), left FALSE by CMakeLists.txt. Files the player writes rather than expects: lightspark.conf, an INI carrying diff --git a/emulators/ruffle.yml b/emulators/ruffle.yml index 3cf6fdfc..8a731c45 100644 --- a/emulators/ruffle.yml +++ b/emulators/ruffle.yml @@ -4,7 +4,7 @@ core_classification: game_engine source: "https://github.com/ruffle-rs/ruffle" upstream: "https://github.com/ruffle-rs/ruffle" profiled_date: "2026-09-17" -source_commit: "74ade97342205ac55d264f2ceb1e642573a21d48" +source_commit: "ed55e72394d21d7784b0a914fd4525608c6a5661" core_version: "0.6.0" display_name: "Adobe Flash (Ruffle)" cores: @@ -24,7 +24,7 @@ notes: | vulkan --config /var/data/ruffle --save-directory /ruffle `. The ActionScript class library is compiled by build_playerglobal into playerglobal_avm1.swf and playerglobal_avm2.swf and linked into the binary - from OUT_DIR (core/src/avm1/globals.rs:89, core/src/avm2/globals.rs:548), so + from OUT_DIR (core/src/avm1/globals.rs:88, core/src/avm2/globals.rs:549), so startup reads nothing. Locale texts, wgsl shaders, the window icon and the OpenH264 license are embedded the same way (desktop/src/gui/locale.rs:7-12, desktop/src/app.rs:464, render/wgpu/src/shaders.rs:30-95, @@ -33,7 +33,7 @@ notes: | H.264 video is the one external dependency. external_video is a default feature and pulls ruffle_video_external with openh264 - (desktop/Cargo.toml:26,83,90), and enable_openh264 defaults to true + (desktop/Cargo.toml:27,84,92), and enable_openh264 defaults to true (desktop/src/preferences.rs:291,316). OpenH264Codec::load first dlopens the system sonames libopenh264.so.7, libopenh264.so.2.4.1 and libopenh264.so on Linux, then falls back to /ruffle/video/ and fetches the Cisco binary @@ -45,7 +45,7 @@ notes: | (video/external/src/decoder/openh264.rs:135-146), and WelsGetCodecVersion must answer 2.4.1 exactly (video/external/src/decoder/openh264.rs:46,153-166). The cache root comes from dirs::cache_dir(), ~/.cache/ruffle by default, and - --cache-directory moves it (desktop/src/cli.rs:29-33,140). Without the library + --cache-directory moves it (desktop/src/cli.rs:31-35,148). Without the library the player still starts: ExternalVideoBackend wraps SoftwareVideoBackend, so H.263, Screen Video and VP6 keep decoding and only H.264 streams fail (video/external/src/backend.rs:41,51-69,73-80). @@ -59,7 +59,7 @@ notes: | to freetype, which routes Linux builds through FreetypeFontRenderer instead; the freetype default feature only compiles that branch, the preference selects it (desktop/src/backends/ui.rs:190-192,443-487,489-519, - desktop/src/preferences/read.rs:74-75, desktop/Cargo.toml:83). The families + desktop/src/preferences/read.rs:74-75, desktop/Cargo.toml:84). The families asked for are Times New Roman, Arial, Courier New and their metric-compatible substitutes, plus the CJK, Hebrew, Arabic and Thai faces (desktop/src/player.rs:361-414, desktop/src/gui/controller.rs:620-694), and @@ -68,15 +68,15 @@ notes: | fixed anywhere. The compiled-in Noto Sans subset sits behind the default_font feature, which the web and exporter crates enable and the desktop build does not (core/src/player.rs:84-85, core/Cargo.toml:82,95, web/Cargo.toml:63-65, - exporter/Cargo.toml:16, desktop/Cargo.toml:22), so on the desktop an + exporter/Cargo.toml:16, desktop/Cargo.toml:23), so on the desktop an unmatched family leaves the run without that face rather than falling back to a bundled one. Files the player writes rather than expects: preferences.toml, bookmarks.toml and recents.toml under --config, each defaulted when absent (desktop/src/preferences.rs:54-96), .sol SharedObjects under --save-directory - (frontend-utils/src/backends/storage.rs:31-60, desktop/src/cli.rs:129-130), - and the log file under /ruffle/log (desktop/src/main.rs:155-166). + (frontend-utils/src/backends/storage.rs:31-60, desktop/src/cli.rs:137-138), + and the log file under /ruffle/log (desktop/src/main.rs:165-176). ruffle-bundle.toml is the manifest inside a .ruf bundle, which is content alongside the .swf rather than a runtime input (frontend-utils/src/bundle/info.rs:11, frontend-utils/src/bundle.rs:42-53). diff --git a/emulators/supermodel.yml b/emulators/supermodel.yml index d2f148e5..15a1ae0f 100644 --- a/emulators/supermodel.yml +++ b/emulators/supermodel.yml @@ -7,9 +7,9 @@ source: upstream: "https://github.com/trzy/Supermodel" profiled_date: "2026-09-17" source_commit: - standalone: "24d2ffcfc7f14229337f05f4920fe26b56633d9d" - libretro: "9f0a51daf6cef6ec2a304538f18c6dbb4c4b9da2" -upstream_commit: "24d2ffcfc7f14229337f05f4920fe26b56633d9d" + standalone: "8b4de239bf3e0fd921f4383edcd3c21c2e62067b" + libretro: "84bc106b45b279bf868a53b9232897c8dc10ca17" +upstream_commit: "8b4de239bf3e0fd921f4383edcd3c21c2e62067b" core_version: standalone: "0.3a-WIP" libretro: "v0.3a-libretro" @@ -51,7 +51,7 @@ notes: | and Saves/.st are written by the emulator itself. ref: Src/OSD/Windows/FileSystemPath.cpp:28-49, Src/OSD/OSX/FileSystemPath.cpp:28-48, Src/OSD/Unix/FileSystemPath.cpp:51-157, Src/OSD/SDL/Main.cpp:1394-1413, - Src/OSD/SDL/Main.cpp:1451, Src/OSD/SDL/Main.cpp:2239 + Src/OSD/SDL/Main.cpp:1445, Src/OSD/SDL/Main.cpp:2233 Libretro: retro_init joins "supermodel" to the frontend system directory and the core creates that directory through the VFS. Supermodel.ini, Games.xml and @@ -63,7 +63,7 @@ notes: | afterwards. Music.xml has no embedded copy. ref: Src/OSD/libretro/libretro.cpp:855-863, Src/OSD/libretro/libretro.cpp:889-894, Src/OSD/libretro/libretro.cpp:1113, Src/OSD/libretro/LibretroWrapper.cpp:166-206, - Src/OSD/libretro/LibretroWrapper.cpp:208-228, Makefile:638-647, Makefile:653-655 + Src/OSD/libretro/LibretroWrapper.cpp:208-228, Makefile:640-653, Makefile:659-661 Libretro NVRAM is the frontend .srm through the memory API. On the first frame a .nv written by the standalone build is imported from the save directory @@ -94,7 +94,7 @@ files: md5: "0c7cfc0cba2f2cd674d94e093936f9f8" description: "ROM set definitions" note: "Parsed at startup into the game database. Every ROM region, file name and CRC32 the loader matches against comes from here, so an unreadable file leaves no set to resolve and the launch returns before the emulator is built. The path is a config key, so -game-xml-file moves it. Nothing about the file is verified beyond parsing; the hash is that of the copy the pinned revision ships." - source_ref: "Src/OSD/SDL/Main.cpp:117, Src/OSD/SDL/Main.cpp:1506, Src/OSD/SDL/Main.cpp:1963, Src/OSD/SDL/Main.cpp:2326-2336, Src/GameLoader.cpp:549-559, Src/GameLoader.cpp:1014-1017" + source_ref: "Src/OSD/SDL/Main.cpp:117, Src/OSD/SDL/Main.cpp:1500, Src/OSD/SDL/Main.cpp:1957, Src/OSD/SDL/Main.cpp:2319-2329, Src/GameLoader.cpp:549-559, Src/GameLoader.cpp:1014-1017" - name: Games.xml path: "supermodel/Games.xml" @@ -111,7 +111,7 @@ files: - "29fd5bc40cea222e040c1a1cfd60ea2e" description: "ROM set definitions, libretro copy" note: "Read through the VFS from {system}/supermodel/Games.xml, or Config/Games.xml under it, and parsed from memory. When the read yields nothing the bytes compiled in from Config/Games.xml are parsed instead, so the core identifies every set without a file on disk; a file that is present takes precedence. The second hash is the embedded array, which predates the indentation cleanup of the repository copy by one tab." - source_ref: "Src/OSD/libretro/LibretroWrapper.cpp:187-206, Src/OSD/libretro/LibretroWrapper.cpp:221-222, Src/OSD/libretro/LibretroWrapper.cpp:822, Src/OSD/libretro/LibretroWrapper.cpp:834-859, Src/GameLoader.cpp:1019-1030, Makefile:645-647" + source_ref: "Src/OSD/libretro/LibretroWrapper.cpp:187-206, Src/OSD/libretro/LibretroWrapper.cpp:221-222, Src/OSD/libretro/LibretroWrapper.cpp:822, Src/OSD/libretro/LibretroWrapper.cpp:834-859, Src/GameLoader.cpp:1019-1030, Makefile:651-653" - name: Supermodel.ini path: "supermodel/Supermodel.ini" @@ -124,7 +124,7 @@ files: md5: "06533608174992f6ea180ae190011778" description: "Configuration override" note: "Read from {system}/supermodel/Supermodel.ini, or Config/Supermodel.ini under it, when present; a file that fails to parse aborts the load. Core options are applied over it afterwards, so it only reaches keys the options do not set and per-game sections. Extracted from the embedded copy when absent." - source_ref: "Src/OSD/libretro/LibretroWrapper.cpp:187-206, Src/OSD/libretro/LibretroWrapper.cpp:219-220, Src/OSD/libretro/LibretroWrapper.cpp:812-817, Src/OSD/libretro/LibretroWrapper.cpp:858, Src/OSD/libretro/LibretroWrapper.cpp:865-866, Makefile:653-655" + source_ref: "Src/OSD/libretro/LibretroWrapper.cpp:187-206, Src/OSD/libretro/LibretroWrapper.cpp:219-220, Src/OSD/libretro/LibretroWrapper.cpp:812-817, Src/OSD/libretro/LibretroWrapper.cpp:858, Src/OSD/libretro/LibretroWrapper.cpp:865-866, Makefile:659-661" - name: p1crosshair.bmp standalone_path: "Assets/p1crosshair.bmp" @@ -136,7 +136,7 @@ files: bundled: true description: "Player 1 light gun crosshair texture" note: "Both bitmaps are read on every launch whatever CrosshairStyle holds, since the load runs before the style decides anything, and a null surface aborts startup ahead of the Model 3 object. 32 bit BMP with alpha, sides a multiple of 2. The libretro build opens the same two files from the Assets directory of the standalone layout, outside the frontend directories, but forces the vector style and never draws them, and its repository does not ship them." - source_ref: "Src/OSD/SDL/Crosshair.cpp:34-51, Src/OSD/SDL/Main.cpp:2379-2385, Assets/DIR.txt, Src/OSD/libretro/libretroCrosshair.cpp:36-60, Src/OSD/libretro/LibretroWrapper.cpp:465-471, Src/OSD/libretro/LibretroConfigProvider.h:361" + source_ref: "Src/OSD/SDL/Crosshair.cpp:34-51, Src/OSD/SDL/Main.cpp:2372-2378, Assets/DIR.txt, Src/OSD/libretro/libretroCrosshair.cpp:36-60, Src/OSD/libretro/LibretroWrapper.cpp:465-471, Src/OSD/libretro/LibretroConfigProvider.h:361" - name: p2crosshair.bmp standalone_path: "Assets/p2crosshair.bmp" @@ -148,7 +148,7 @@ files: bundled: true description: "Player 2 light gun crosshair texture" note: "Read in the same call as the player 1 bitmap and equally fatal when it fails to load." - source_ref: "Src/OSD/SDL/Crosshair.cpp:35, 49-51, Src/OSD/SDL/Main.cpp:2379-2385, Src/OSD/libretro/libretroCrosshair.cpp:39, 55-58" + source_ref: "Src/OSD/SDL/Crosshair.cpp:35, 49-51, Src/OSD/SDL/Main.cpp:2372-2378, Src/OSD/libretro/libretroCrosshair.cpp:39, 55-58" - name: Music.xml path: "supermodel/Music.xml" diff --git a/emulators/visual-pinball.yml b/emulators/visual-pinball.yml index d85a5032..d7385e92 100644 --- a/emulators/visual-pinball.yml +++ b/emulators/visual-pinball.yml @@ -3,9 +3,9 @@ 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" +profiled_date: "2026-10-04" +source_commit: "a31565f1589c17afd0502a8c6a690f408ede14b2" +core_version: "10.8.1" display_name: "Visual Pinball X" cores: - vpinball @@ -17,24 +17,30 @@ 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 + program, read through POLE (src/parts/pintable.cpp:1424-1427). 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 and hidapi; PinMAME, AltSound, + DMDUtil, DOF, FlexDMD, B2S, PUP, Serum, VNI and ScoreView are plugins staged + in plugins/ next to the binary (make/CMakeLists_app.txt:525-546,597-603, + make/CMakeLists_sources.txt:809-815, make/CMakeLists_plugins.txt:21-25,39-56). + ES-DE finds VPinballX_BGFX or VPinballX_GL and runs ` -play `, Batocera builds the standalone tree at 3ec37c7f9a into /usr/bin/vpinball and runs `VPinballX_GL -PrefPath -Ini /VPinballX.ini -Play `, RetroBat drives the Windows build with its registered VPinMAME COM server. - File location now sits in one class. FileLocator holds m_appPath, the + 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 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 + 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 /pinmame. Table scripts pull their libraries through SearchScript, which walks ten @@ -42,97 +48,319 @@ notes: | 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 + src/core/ScriptGlobalTable.cpp:346-375). 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), 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). + scripts (WPC.vbs, sam.vbs, s11.vbs, zac.vbs and the rest), copied from + src/scripts (make/CMakeLists_app.txt:619-623). 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:377-418, 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 (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). + 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 -