Skip to content

future-pinball - RetroBIOS

Type standalone
Classification Game engines
Source https://futurepinball.com/
Upstream closed-source
Version 1.9.1.20101231
Profiled 2026-08-11
Cores fpinball, future-pinball
Systems fpinball
Source analysis

shipped_with_the_binary:

- **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.dll required in repo bundled
Newton Game Dynamics, the rigid body solver under the ball physics

  • System: fpinball
  • Size: 436.0 KB
  • Source: Future Pinball.exe 1.9.1.20101231 import directory
  • 83 functions are bound from it, the largest third party surface in the binary. The process does not start without it.

fmod.dll required in repo bundled
FMOD 3 audio engine

  • System: fpinball
  • Size: 159.0 KB
  • Source: Future Pinball.exe 1.9.1.20101231 import directory
  • 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.

devil.dll required in repo bundled
DevIL image decoder

  • System: fpinball
  • Size: 263.0 KB
  • Aliases: DevIL.dll
  • Source: Future Pinball.exe 1.9.1.20101231 import directory
  • 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.dll required in repo bundled
DevIL image utility library, scaling and canvas resize

  • System: fpinball
  • Size: 27.0 KB
  • Aliases: ILU.dll
  • Source: Future Pinball.exe 1.9.1.20101231 import directory
  • 4 functions bound: iluInit, iluScale, iluEnlargeCanvas and iluImageParameter, used to fit imported artwork to texture dimensions.

ilut.dll required in repo bundled
DevIL toolkit layer, image to Windows bitmap conversion

  • System: fpinball
  • Size: 16.0 KB
  • Aliases: ILUT.dll
  • Source: Future Pinball.exe 1.9.1.20101231 import directory
  • 3 functions bound: ilutRenderer, ilutConvertToHBitmap and ilutGetBmpInfo, which produce the preview bitmaps the editor's manager windows draw.

libcurl.dll required in repo bundled
HTTP client for the table feed

  • System: fpinball
  • Size: 612.0 KB
  • Source: Future Pinball.exe 1.9.1.20101231 import directory, .text:0x0043dc70
  • 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.dll optional in repo bundled
Scintilla, the editing control behind the table script editor

  • System: fpinball
  • Size: 398.0 KB
  • Source: Future Pinball.exe 1.9.1.20101231 .text:0x0042c501-0x0042c528
  • 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.fpl optional in repo game_data bundled
260 pinball part models, the library the manual tells tables to link

  • Path: Libraries/fpModels.fpl
  • System: fpinball
  • Size: 4.9 MB
  • Source: Future Pinball.exe 1.9.1.20101231 .text:0x004e6cf0-0x004e6ebf, Future Pinball Manual.chm ModelManager.html
  • 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.fpl optional in repo game_data bundled
90 textures for the standard table objects

  • Path: Libraries/fpTextures.fpl
  • System: fpinball
  • Size: 3.3 MB
  • Source: Future Pinball.exe 1.9.1.20101231 .text:0x004e6cf0-0x004e6ebf, Future Pinball Manual.chm TextureManager.html
  • Carries the surface art the built in parts expect, bulbs, triggers, plungers and the rest. Resolved the same way as every other library.

fpRamps.fpl optional in repo game_data bundled
82 ramp models, keyed by profile, width and height

  • Path: Libraries/fpRamps.fpl
  • System: fpinball
  • Size: 2.7 MB
  • Source: Future Pinball.exe 1.9.1.20101231 .text:0x004e6cf0-0x004e6ebf
  • Storage names encode the shape and the dimensions, ramp-pool-t1_w30_h20 and so on, with a left and a right variant of each.

fpSounds.fpl optional in repo game_data bundled
20 machine sounds, ball release, bumpers, coin in and the rest

  • Path: Libraries/fpSounds.fpl
  • System: fpinball
  • Size: 166.5 KB
  • Source: Future Pinball.exe 1.9.1.20101231 .text:0x004e6cf0-0x004e6ebf, Future Pinball Manual.chm SoundManager.html

fpSphereMaps.fpl optional in repo game_data bundled
11 sphere maps giving metal and plastic parts their reflections

  • Path: Libraries/fpSphereMaps.fpl
  • System: fpinball
  • Size: 218.5 KB
  • Source: Future Pinball.exe 1.9.1.20101231 .text:0x004e6cf0-0x004e6ebf
  • Storage names are bracketed, [chrome-silver], [chrome-gold] and similar, which is how a material references one.

fpDmdFonts.fpl optional in repo game_data bundled
6 dot matrix fonts, named for their cell size

  • Path: Libraries/fpDmdFonts.fpl
  • System: fpinball
  • Size: 57.5 KB
  • Source: Future Pinball.exe 1.9.1.20101231 .text:0x004e6cf0-0x004e6ebf, Future Pinball Manual.chm FontManager.html
  • dmd05x05p through dmd08x13p. A DMD display element with no font draws nothing.

fpPlayfields.fpl optional in repo game_data bundled
3 playfield images, including the plunger cutout template

  • Path: Libraries/fpPlayfields.fpl
  • System: fpinball
  • Size: 355.5 KB
  • Source: Future Pinball.exe 1.9.1.20101231 .text:0x004e6cf0-0x004e6ebf

fpScripts.fpl optional in repo game_data bundled
Script library, holding the one sample script the manual quotes

  • Path: Libraries/fpScripts.fpl
  • System: fpinball
  • Size: 4.0 KB
  • Source: Future Pinball.exe 1.9.1.20101231 .text:0x00478d20, Future Pinball Manual.chm GlobalScript.html
  • 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.fpt optional in repo game_data bundled
Template opened by File then New

  • System: fpinball
  • Size: 221.5 KB
  • Source: Future Pinball.exe 1.9.1.20101231 .text:0x00448ea9-0x00448edb
  • 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.chm optional in repo bundled
Development guide, 79 topics

  • Path: Help/Future Pinball Manual.chm
  • System: fpinball
  • Size: 8.6 MB
  • Source: Future Pinball.exe 1.9.1.20101231 .text:0x00478477-0x004784c4
  • 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.chm optional in repo
Microsoft Windows Script 5.6 documentation, the VBScript reference

  • Path: Help/Script56.chm
  • System: fpinball
  • Source: Future Pinball.exe 1.9.1.20101231 .text:0x004784a3-0x004784c4
  • 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.xml optional in repo bundled
Cached table list from pinsimdb.org

  • Path: Feeds/fpLatestTables.xml
  • System: fpinball
  • Size: 735.0 KB
  • Source: Future Pinball.exe 1.9.1.20101231 .text:0x0043dc70-0x0043dc99, 0x0043e776-0x0043e79c
  • 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.dll optional missing
NaturalPoint TrackIR client library, head tracking

  • System: fpinball
  • Source: Future Pinball.exe 1.9.1.20101231 .text:0x0045f1b8-0x0045f1f8
  • 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.

Generated on 2026-08-23T16:12:06Z