- **note:** Present in the release and read by the program, but named at runtime rather than by a literal in the code, so there is no fixed filename to record.
**entries:**
- what: Tables\, four demonstration tables, source_ref: FuturePinballSetup_v1.9.1.20101231.exe app/Tables, note: DmdDisplayDemo.fpt, LightSequencerDemo.fpt, Ramp-VUK-Demo.fpt and SegmentDisplayDemo.fpt. The directory itself is the default table path and the last prefix the external script resolver tries.
- what: Feeds\, 385 table screenshots, source_ref: Future Pinball.exe 1.9.1.20101231 .text:0x0043d60f, note: Named st_<id>_<n>_<n>.jpg from the entries of fpLatestTables.xml and fetched with the same libcurl path, so the set changes with the feed.
user_supplied_paths:
- **note:** Named by a table or written by the program, with no fixed filename
**entries:**
- what: external table scripts, tried bare then under Scripts\ then Tables\, source_ref: Future Pinball.exe 1.9.1.20101231 .text:0x004797c0-0x00479905, 0x00478be0, note: LoadExternalScript takes whatever name the table's script passes. The bare attempt resolves against the working directory, which is the table's own folder. No Scripts directory ships.
- what: fpRAM\<table>.fpRAM, per table persistent state, source_ref: Future Pinball.exe 1.9.1.20101231 .text:0x0043aa80, 0x00475602, 0x00475892, note: Built as the prefix, the table name and the .fpRAM extension. Written from play, so it is save data rather than something to obtain. The installer creates the directory empty.
- what: DmdFonts\ and Models\, editor working directories, source_ref: Future Pinball.exe 1.9.1.20101231 .text:0x00443595, 0x00443efc, 0x00516ba8, 0x00516d31, 0x00441fc8, 0x004429bb, 0x004317fa, note: Each site only fills the initial directory of a GetOpenFileName or GetSaveFileName call in the DMD font and model import and export dialogs, so nothing is read until the user picks a file. DmdFonts ships empty and Models is not created at all. Fonts carry .dmdf and models .fpm, both authored rather than distributed.
named_but_not_read:
- **note:** String literals that survive a path scan without ever reaching a file
**entries:**
- what: skin\toolbar.bmp, source_ref: Future Pinball.exe 1.9.1.20101231 .text:0x00438ff5, 0x00448ba0, 0x00432240-0x00432290, note: Passed to the toolbar builder, which calls CreateToolbarEx with hBMInst zero and a bitmap handle held in a global as wBMID. The module has no resource under that name and neither syscall trace shows an open for it, although both traces reach the main window.
- what: tables\ in lower case, source_ref: Future Pinball.exe 1.9.1.20101231 .text:0x00439e40-0x00439e79, note: Searched for inside a feed URL and skipped past to recover the table name, with the literal opps as the fallback. Not a path being built.
- what: .jlb, source_ref: Future Pinball.exe 1.9.1.20101231 .text:0x004414d0, note: A second extension accepted beside .fpl in the library dialogs. No file with it ships and nothing opens one by name.
Technical notes
Closed-source Windows pinball simulator and table editor written by Chris
Leathley for BSP Software Design Solutions. Development stopped with
v1.9.1.20101231, still served from futurepinball.com. Rendering is OpenGL
(88 imports from opengl32 and 4 from glu32); ddraw is loaded by name only to
call DirectDrawCreateEx while enumerating display modes. Physics come from
Newton Game Dynamics, audio from FMOD 3, image decoding from DevIL and the
script editor from Scintilla. The binary registers its own type library at
startup through LoadTypeLib and RegisterTypeLib on its own path, which is the
registration RetroBat checks under TypeLib{FB22A459-4AD0-4CB3-B959-15158F7139F5}
before deciding to relaunch elevated.
ref: Future Pinball.exe 1.9.1.20101231 import directory, .text:0x0042c7a2-0x0042c82e
The release is named 1.9.1.20101231 but the executable inside it carries
FileVersion 1.9.2008.1225 in its version resource and prints
"Version 1.9.1.20091231" in its own banner.
ref: Future Pinball.exe 1.9.1.20101231 .rsrc version, .text:0x0043d288-0x0043d298
Every relative path below hangs off one root. At startup GetModuleFileNameA
fills a buffer, the code scans back to the last backslash and terminates the
string just after it, and that install directory with its trailing separator
is kept for the life of the process.
ref: Future Pinball.exe 1.9.1.20101231 .text:0x00432af0-0x00432b49
A table is an OLE compound document with the .fpt extension and it carries
its own media. Every FMOD load passes FSOUND_LOADMEMORY (mode 0x8130 for
samples, 0x4000a130 for streams) and images go through ilLoadL, the memory
lump entry point, never ilLoadImage. So sounds, music and textures are read
out of the table file and no external media is opened while a table plays.
ref: Future Pinball.exe 1.9.1.20101231 .text:0x00457ede,0x00457f6f,0x00457fe6,0x0045805b,0x004417f6
What a table can pull from outside itself is a resource library. Libraries
are .fpl files, also OLE compound documents, holding models, textures, sounds,
DMD fonts and scripts under one storage per item. The Texture, Sound, Model
and DMD Font managers each offer Import, which copies the item into the table,
and Link, which records the library name and the item name instead; the manual
recommends always linking to the shipped model library. A linked library is
opened by StgOpenStorage on the name as written, which resolves against the
table's own folder, and on failure against the install directory plus
"Libraries\". Both failing raises "Unabled to Open Library - ''" followed
by "There will be some functions missing from the game." as a warning box, and
the program carries on.
ref: Future Pinball.exe 1.9.1.20101231 .text:0x004e6cf0-0x004e6ebf, .rsrc string 149-150,
Future Pinball Manual.chm LibraryResourceManager.html, ModelManager.html, TextureManager.html,
SoundManager.html, FontManager.html
A table script reaches outside itself through LoadExternalScript, whose result
is handed to VBScript's ExecuteGlobal. When the reference ends in .fpl the
script is pulled from that library, otherwise the name is tried as given
against the working directory, then under the install directory with the
"Scripts\" prefix, then with "Tables\", and a miss reports
"Unable to load external script". No Scripts directory ships, so what it holds
is whatever a given table asks for.
ref: Future Pinball.exe 1.9.1.20101231 .text:0x004797c0-0x00479905, 0x00478be0-0x00478c66,
0x00478d20, Future Pinball Manual.chm GlobalScript.html
Settings live in the registry under HKCU\Software\Future Pinball, split into
GamePlayer, GamePlayer\Joypads and Editor keys; there is no ini file.
RetroBat writes resolution, aspect ratio, camera, render preset and the whole
joypad map there before launching. Per table state is written to
fpRAM\
.fpRAM beside the program. Nothing in the program verifies a size
or a hash on any file it opens, so the figures recorded below are those of the
1.9.1.20101231 release and are informative.
ref: Future Pinball.exe 1.9.1.20101231 .text:0x0043aa80,0x00475602,0x00475892,
retrobat emulatorLauncher/Generators/Fpinball.Generator.cs:326-491
Front ends drive it with the documented switches /Open "
", /Play, /Exit
and /ArcadeRender. ES-DE declares it for Windows only, as FUTURE-PINBALL
finding "Future Pinball.exe" and as FUTURE-PINBALL-FPLOADER finding
"BAM\FPLoader.exe", both invoked with /Exit /Play /Open; the fpinball system
is a placeholder on its six other platforms. RetroBat maps the emulator keys
fpinball and bam to one generator, one install folder and the same
"Future Pinball.exe" presence check, swapping only the launched binary, and
optionally starts dmdext against DmdDevice.ini to mirror the DMD. Batocera ran
it in a wine bottle on x86_64 and dropped it for Visual Pinball. BAM is
ravarcade's loader: FPLoader.exe starts the same executable with BAM.dll
injected, and it names none of its own files from inside Future Pinball.
ref: es-de resources/systems/windows/es_find_rules.xml:438-461,
es-de resources/systems/windows/es_systems.xml, Future Pinball Manual.chm CommandLine.html,
retrobat emulatorLauncher/Generators/Fpinball.Generator.cs:109-181,
batocera-linux batocera-Changelog.md:214
20 files | 6 required, 14 optional | 19 in repo, 1 missing
Categories: 11 BIOS, 9 game data
Newton.dllrequiredin repobundled Newton Game Dynamics, the rigid body solver under the ball physics
22 functions bound, FSOUND_Init through the sample and stream calls. Every one of those calls passes FSOUND_LOADMEMORY, so it decodes the table's own buffers rather than reading files.
8 functions bound, ilInit through ilLoadL. Spelled DevIL.dll in the import descriptors and shipped lowercase, which the case insensitive loader treats as one name.
ilu.dllrequiredin repobundled DevIL image utility library, scaling and canvas resize
Only four functions are bound, curl_easy_init, setopt, perform and cleanup, and the single use is fetching the table list from http://www.pinsimdb.org/fpreleases/backend_xml.php under the user agent FuturePinball-agent/1.0. The binding is static all the same, so the process still refuses to start without the file.
SciLexer.dlloptionalin repobundled Scintilla, the editing control behind the table script editor
The one library taken with LoadLibraryA rather than the import directory. A null return puts up "The Scintilla DLL could not be loaded.", stores a null handle and falls through to the rest of startup, so the program runs and only the script editor is lost.
fpModels.fploptionalin repogame_databundled 260 pinball part models, the library the manual tells tables to link
Models cannot be authored outside the development team, so a table that wants a bumper cap or a flipper bat either embeds a copy or links here, and the Model Manager documents linking as the recommended choice. Absent, the table still loads and every model it linked is missing.
fpTextures.fploptionalin repogame_databundled 90 textures for the standard table objects
The manual's worked example is ExecuteGlobal LoadExternalScript("fpScripts.fpl\myscript"), which is the branch taken when a reference carries the .fpl extension. What ships is a single storage named testscript.
NewTable.fptoptionalin repogame_databundled Template opened by File then New
The install directory is copied into the default table path buffer and this name appended, then the result goes through the ordinary table open. It is a full table with a playfield and a plunger, not an empty document.
Future Pinball Manual.chmoptionalin repobundled Development guide, 79 topics
Opened with ShellExecuteA on the install directory plus this path when the help command carries id 0x8043. It is the only description of the library link mechanism and of LoadExternalScript.
Script56.chmoptionalin repo Microsoft Windows Script 5.6 documentation, the VBScript reference
The script editor's help falls to this path for every command id other than 0x8043, again through ShellExecuteA against the install directory. No Future Pinball release ships it: table scripts are VBScript and this is Microsoft's own reference for the language, expected to be dropped into Help beside the manual.
fpLatestTables.xmloptionalin repobundled Cached table list from pinsimdb.org
libcurl writes it, CreateFileA with OPEN_EXISTING reads it back and DeleteFileA drops it when the panel refreshes. The code builds the path as feeds\ against a directory the installer creates as Feeds. A snapshot ships with the release, so the panel has something to show before any fetch.
NPClient.dlloptionalmissing NaturalPoint TrackIR client library, head tracking
The directory is read from HKCU\Software\NaturalPoint\NATURALPOINT\NPClient Location, this name appended and the result given to LoadLibraryA; NP_GetSignature and the rest are then bound with GetProcAddress. A null handle jumps past all tracking setup. It comes from a TrackIR install, not from any Future Pinball distribution, which is why no path is given here.