Skip to content

Instantly share code, notes, and snippets.

@jsm174
Last active April 1, 2025 01:22
Show Gist options
  • Save jsm174/e5aa4ebe70052b5cf2ef49ab40c35dfb to your computer and use it in GitHub Desktop.
Save jsm174/e5aa4ebe70052b5cf2ef49ab40c35dfb to your computer and use it in GitHub Desktop.
VPX Standalone: Reverse Engineering PinUP Player

VPX Standalone: Reverse Engineering PinUP Player

What is PinUP Player

From the website:

Pinup Player: a program the can be controlled and triggered to play various types media. This can be played on multiple “screens and layers” and displayed on many different “monitors / TVs” in Windows.

Motivation

Many Visual Pinball tables use PUP for having animated backglasses and custom DMDs. We would really like people who use VPX Standalone to be able to enjoy the same tables that Windows users can.

Why reverse engineer?

Since PUP is a closed-source project, we don't have any options. Fortunately, David (Nailbuster) has been incredibly generous in answering several of my questions!

Where are we at now?

Several games are playable. Many have missing video layers and labels with incorrect font sizes.

I test regularly test with the following games:

  • Batman 66
  • Total Nuclear Annihilation
  • Transformers
  • Monster Bash
  • Tron NEON
  • Darkest Dungeon
  • Futurama

Configuration Files

PUP usually uses 4 configuration files:

  • PinUpPlayer.ini
  • screens.pup
  • playlists.pup
  • triggers.pup

PinUpPlayer.ini

This file includes master settings for all screens.

[INFO]
ScreenXPos=4
ScreenYPos=7
ScreenWidth=500
ScreenHeight=125
volume=100
hidestopped=3
AspectWide=0
AspectHigh=0
fitToWindow=1
ScreenRotation=0
DebugMode=1
VideoDriver=0
FirstRun=0
[INFO1]
ScreenXPos=1400
ScreenYPos=302
ScreenWidth=512
ScreenHeight=128
volume=100
hidestopped=3
AspectWide=0
AspectHigh=0
fitToWindow=1
ScreenRotation=0
DebugMode=1
VideoDriver=0
FirstRun=0
.
.
[INFO10]

In VPX Standalone, these are in the VPinballX.ini:

[Standalone]
PUP<Name>Screen =
PUP<Name>Window =
PUP<Name>WindowX =
PUP<Name>WindowY =
PUP<Name>WindowWidth = 
PUP<Name>WindowHeight =
PUP<Name>WindowRotation =

Since all screens are supported, at this time, only the following can render physical windows:

Name Screen
Topper 0
Backglass 2
DMD 1
Playfield 3
FullDMD 5

If for example you needed to change the Topper to screen 2, you would have the entry:

[Standalone]
PUPTopperScreen = 2

screens.pup

This csv file sets the layout of screens:

ScreenNum,ScreenDes,PlayList,PlayFile,Loopit,Active,Priority,CustomPos
0,Topper,Topper,Topper_Frame1.mp4,0,ForceOn,,
1,DMD,,,0,off,,
2,Backglass,BGDefault,BG_Default1.mp4,0,ForceOn,,
3,PlayField,,,0,off,,
4,Music,,,0,off,,
5,Menu,,,0,off,,
6,Select,,,0,off,,
7,Other1/BackGlass2,,,0,off,,
8,Other2/Topper2,,,0,off,,
9,GameInfo,,,0,off,,
10,GameHelp,,,0,off,,

The headers in the csv do not appear to match the the PuP Pack Editor:

Screenshot 2024-06-05 at 8 36 46 PM

screens.pup PuP Pack Editor
ScreenNum ScreenNum
ScreenDes ScreenDes
PlayList Background Playlist
PlayFile Background Filename
Loopit Transparent
Active Mode
Priority Volume %
CustomPos CustomPos

Question: What are values when the columns are empty? ex, volume% 100 or 0?

playlists.pup

This csv file represents media playlists. Playlists are folders in pupvideos/<rom> directory

ScreenNum,Folder,Des,AlphaSort,RestSeconds,Volume,Priority
0,Topper,,0,30,100,0
0,AttractMode,,0,30,100,0
0,BallDrain,,1,3,100,0
0,BGDefault,,0,30,100,5
0,ExtraBall,,0,30,100,0
0,MultiBall,,0,30,100,0
0,PuPOverlays,,0,30,100,0
0,RandomScoring,,0,30,100,0
0,ShootAgain,,0,30,100,0
0,SkillShot,,1,30,100,0

Screenshot 2024-06-05 at 8 57 37 PM

playlists.pup PuP Pack Editor
ScreenNum
Folder Folder (Playlist)
Des Description
AlphaSort Randomize
RestSeconds RestSeconds
Volume Volume
Priority Priority

From PinUpPlayerReference.txt:

  • playlists (unlimited) that are really just subfolders of your table root that contain videos.
  • the PinUpPlayer(PUP) will manage playlists and shuffle them
  • RestSeconds is what I use to 'limit' the amount of videos being played. So lets say you want a ramp video to play, but since I set it to 60... you can hit that ramp multiple times but no videos will play until the restSeconds time has passed since last video played.
  • <Sort 1=shuffle, 0 = alpha> So if you want to progress game videos you could name the first one 001.mp4, 002.mp4...099.mp4 That way alpha sort will play in your order.

From PuP-Pack Editor v1.4 Help:

  • AlphaSort: OFF=Random/shuffle, 1= alpha sort
  • Priority (0..10): if another video is playing the one with higher prioirty 'wins'...

Question: What are values when the columns are empty? ex, volume% 100 or 0? Question: Are the files sorted by case sensitivity? ie: alpha1.png, bat1.png, Alpha2.png Note: I think I've seen really priorities way different than 0..10, maybe -1, and 60 (double check so not confusing this with volume, etc)

Update 03-31-2025:

  • Confirmed with @nailbuster that PuP-Pack Editor v1.4 Help is incorrect about AlphaSort. The correct values are: Random=1, AlphaSort=0

triggers.pup

This csv file represents triggers

ID,Active,Descript,Trigger,ScreenNum,PlayList,PlayFile,Volume,Priority,Length,Counter,RestSeconds,Loop,Defaults
2,1,Overlay_Frame,D0,2,PuPOverlays,Metal.png,,,,6,,,0
71,1,Creature1,D1,2,Creature,"Creature Surfacing.mp4",0,3,,,3,,0
4,1,Creature2,D2,2,Creature,"Creature Hand.mp4",0,3,,,3,,0
6,1,Creature3,D3,2,Creature,"Creature Swim2.mp4",0,3,,,3,,0
9,1,"Creature Feature",D4,2,"Creature_Creature Feature",,0,3,,,3,,0
10,1,"Creature Targets",D5,2,Creature,,0,3,,,3,,0
11,1,"Monster Torso",D6,2,Monster_Torso,,0,2,,,3,,0

Screenshot 2024-06-05 at 9 27 57 PM

triggers.pup PuP Pack Editor
ID
Active Active
Descript Descript
Trigger Trigger
ScreenNum Screen
PlayList Playlist
PlayFile PlayFile
Volume Volume
Priority Priority
Counter Counter
RestSeconds RestSeconds
Loop PlayAction
Defaults

From PinUpPlayerReference.txt:

  • priority(0=none, 1..9) will override the restSeconds....so for a drain or something similar
  • if filename="" then will play next file in playlist (don't have to specify filename, only playlist).

From PuP-Pack Editor v1.4 Help:

  • Trigger example separate by ',' commas (unlimited triggers, but max 5 checks/trigger)
  • if you don't put = then assumes '1'
  • do NOT use leading zeros like S04=1, its S4=1
  • Counter=20 means it will 'FIRE' video every 20 triggers.
  • loop will loop video until a new video is displayed.
  • restseconds: will not repeat trigger until restseconds have passed. if you leave blank then will use playlist default.

Question: Does Counter 'FIRE' the very first time? or does it wait for 20 triggers? does restseconds factor into counter?

@francisdb
Copy link

All trigger PlayAction types are documented here: https://www.nailbuster.com/wikipinup/doku.php?id=pup_capture

@francisdb
Copy link

francisdb commented Mar 16, 2025

@jsm174
Copy link
Author

jsm174 commented Mar 21, 2025

@francisdb - Made public

@francisdb
Copy link

@francisdb - Made public

linked from my repo

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment