Virtueller Flipper in alten Flippergehäuse im Eigenbau (Dokumentation)

„VPIN“ – Wieso? Weshalb? Warum?…

Da mich als 70er Kind schon immer das Thema Spielautomaten faszinierte, ich von meinem Start mit „Pong“ über den Atari VCS zu C64, Amiga, Atari ST, I386 bis Heute mit aktuellen PC´s das Thema immer noch leidenschaftlich „verfolge„, dachte ich mir nach anspielen des Tisches „MARS“ von Pinball FX2:

So ein gedrehter Bildschirm wäre doch besser und das ganze noch angesteuert über Buttons in einem alten Flippergehäuse dann auch noch cool.

Nach vielen Stunden in Foren und Suchmaschinen hab ich dann erfahren, dass es sogenannte „VPINs“ also Virtuelle Pinball´s im Gehäuse eines Flipperautomat (kurz Flipper) schon gibt… und einiges an zusätzlich machbarer Variation.

Also… ging es los… diese Dokumentation fasst drei Ausbaustufen (deswegen sieht man z.B. unterschiedliche Hardware auf manchen Bildern, aber die Einkaufsliste ist up2date) zusammen und es steckt an Zeit (Dauer) ca. 1,25 Jahre drin… doch zuerst mal ein kleines Video:

Einkaufsliste (Hardware & Teile)

Computer/TV:

Microcontroller

Netzteile/Spannung/Lüftung

Kabel & Stecker

Buttons

Verschiedenes

LEDs:

Surround Sound Feedback (SSF):

Sonstiges:

‚Eh da‘ Kosten (vorhanden):

  • Maus & Tastatur
  • Schrauben, Spax…
  • Spachtelmasse
  • Farben & Spraydosen
  • diverser Kleingruscht

Ein bischen Theorie

Was ist denn ein Virtueller Flipper (VPIN) und wie ist das mit der Hardware und so?

Kurz auf einem höheren Fluglevel erklärt ist das folgendermaßen:

Es ist ein altes Flippergehäuse in dem ein Computer und drei Bildschirme stecken. Darauf läuft Windows und unterschiedliche Flippersimulationen. Aber auch sehr, sehr viel zusätzliche Software welche z.B. die Schnittstelle zu Mikrocontrollern herstellt, die wiederum als Tastatur, Sensor agieren oder z.B. LEDs steuern. Auch zusätzliche coole Dinge wie Bass-shaker oder Exciter sind noch eingebaut, die das Spielgefühl weiter verstärken… und oben drüber liegt ein sogenanntes „Frontend“ (Software) was mit Windows automatisch gestartet wird und die Steuerung der einzelnen Simulationen und deren „Flippertische“ übernimmt.

Bei einem virtuellen Flipper ist ja nicht nur ein einzelner „Tisch“ möglich… aber mehr dazu später.

Diese Dokumentation ist eine Zusammenfassung von zwei Bau- und Konfigurationsprojekten (V1 & V2 Update).

VPIN-Overview

VPIN-Übersicht

Los geht´s… mit dem Gehäuse

Das Gehäuse

Als erstes hab ich mir bezüglich Virtueller Flipper ein (nicht virtuelles) altes Flippergehäuse (PinBall Champ82) gekauft inkl. Münzeinwurf, Scheibe & Siderails.

Nach dem ich eine Menge meiner analogen Freizeit in digitalen Foren (vor allem zu empfehlen ist das Forum von Flippermarkt.de), Blogs, Youtube & Co. und auch diversen Baumärkten verbracht habe.. waren die ersten Schritte mal grob klar.

Am Gehäuse habe ich erst mal innen alle Leisten & Hölzer entfernt, ein Loch und eine Verstärkung für den Subwoofer gebastelt sowie hinten ein Loch für die Revisionsklappe konstruiert (um später bequem an den PC zu kommen). Dann ging es an die ganzen Metallteile und diese u.a. zu entrosten (Flugrost) in einem schönen Cola-Bad (ohne Jack Daniels) und sie anschließend zu polieren bzw. schleifen.

In meiner V1 hatte ich den (FullHD) Samsung UE40J6250 als „Spielfeld-TV“ gewählt. Mein Flippergehäuse hat 52 cm, der TV hatte „entkleidet“ immer noch ca. 52,6 cm (den Rahmen vorne lies ich zum „zentrieren der Front“ dran) also war der Plan: auf jeder Seite eine Nut von 0,5 cm Tiefe zu fräßen.

In der V2 habe ich dann den PROLITE X4071UHSU-B1 verwendet (4K), der passte so rein… allerdings sind unten noch die Knöpfe (An/aus etc.) und stehen ein bisschen über… die liegen aber jetzt perfekt versenkt in der Nut. Für die Monitor-Halterung habe ich ein Winkelprofil angepasst und mit gutem Gewebeklebeband überzogen, damit keine Kratzer auf dem Monitorgehäuse entstehen.

Mit Hilfe eines Lochschneiders konnte ich die 28 mm Löcher für die zusätzlichen Flipper-Buttons und die 4 Navigations-Buttons in die entsprechenden Bleche schneiden.

Ich hab für das Spielfeld 15 mm Abstand von der Glasscheibe gelassen, damit die Luft dort auch noch ein bisschen zirkulieren kann. Dann konnte ich endlich die Nut für den Playfield-TV in das Gehäuse fräßen (die Oberfräße ist wirklich ein tolles Werkzeug) und das ganze anschließend noch an den Wandhalterungsschrauben stabilisieren.

Dann ging es weiter mit der Oberfräße und ich hab die ganzen Löcher und Nuten für die Buttons eingearbeitet und diese so angebracht, dass Sie nicht mit dem Zentrierring ‚abstehen’ sondern schön am Gehäuse anliegen.

Auch das Gehäuse bzw. der PC und Bildschirm innen benötigen eine Zirkulation… also hab ich mit der Stichsäge (+ Feile und Schmirgelpapier) dann noch für die Ventilator Ausschnitte gesorgt (» ansaugend rechts » ausblasend links »).

Die beleuchteten Buttons kann man so zerlegen, dass es möglich ist ein Schneidplott-Aufkleber oder eigener Ausdruck vor den Knopf zu legen. In Kombination mit LED´s als Beleuchtung kommt das ganz gut. So hab ich für die wichtigsten Tasten (Pfeile Links, Rechts, Oben, Unten; ESC, Tab, Launch & Start) eine kleine Grafik erstellt, das ganze ausgedruckt, ausgeschnitten und so sieht das dann aus (siehe Bilder rechts).

Ich hab vor dem bekleben dann noch alle Teile schwarz Matt (RAL 9005) gestrichen bzw. lackiert und dann ging es auch schon los mit dem bekleben der Folie. Das ganze ging ganz gut ohne große Luftblasen und wie immer bei so einem Projekt macht es wirklich Spaß dann das Ganze zusammen zu bauen (siehe Galerie). Auch die Revisionsklappe hinten einfach mal „genauer“ anschauen.

Das Design war recht aufwändig… alleine die rechte/linke Seite des Flipper hat um die 100 Ebenen und sollte so angelegt werden, dass es auch zusammenspielt bei Übergängen aber nach 5 Nächten war die Arbeit getan und die frisch gedruckten Klebefolien waren eine Woche später im Hause.

Bei der Folie an der Seite sollte man zu zweit sein, dann klappt das aber ganz gut… auch hier habe ich den Ausschnitt für die Ventilatoren eingeschnitten und die mit einem Fön über die Kannten gezogen. Anschließend habe ich auch wie bei der Backbox 10×10 mm Kannten angebracht und dann konnte das Gehäuse auch endlich mal „auf eigenen Beinen stehen“.

Da ein Abstand zwischen Blende und Playfield-Monitor ist hab ich hier je einen Aufkleber unten und oben angebracht (damit man nicht nach innen sieht) und am Playfield-Monitor eine kleine schwarze Kunststoffleiste angeklebt welche bis hoch zur Glasscheibe geht.

Was „elektronisch“ alles passiert, seht Ihr später.

Die Backbox

Wie oben in der Einkaufsliste erwähnt habe ich mir einen 17“ Monitor und 27“ TV aus Ebay-Kleinanzeigen besorgt und daraus ergab sich auch die Aufteilung, was aber auch mit sich bringt in der sogenannten Backbox (dem Kopfteil des Flipperautomats) sowie im unteren Flipper-Gehäuse entsprechend Platz zu schaffen für den 17“ Monitor welcher als Dot-Matrixanzeige zum Einsatz kommt.

Damit das Dot-Matrix-Display (DMD) also somit der DMD-Monitor in der Höhe justierbar ist (um diesen genau in den Ausschnitt einzupassen) und entsprechend stabil auf den Boden der Backbox verschraubt ist.

Zwecks Belüftung hab ich unten links für den “ansaugenden Ventilator” ein Loch mit dem Steckdosenbohrer gebohrt (120er auf 80er Adapter) und oben rechts ein exakten Ausschnitt für den „ausblasenden 120er Ventilator“ mit der Stichsäge ausgesägt damit die Abwärme nach oben steigen und abgeführt werden kann und natürlich von unten mit frischer Luft versorgt wird.

Parallel hab ich mit der Oberfräße 3 Nuten (á 16 mm Breit, 4,2 mm Tief) eingelassen um die LED-Streifen dann ebenerdig einzulassen (mehr dazu später). Dann war noch mehrmaliges spachteln, schleifen und lackieren angesagt.

Das  Anbringen der Folie ging ganz gut und mit einem Fön konnte ich die Ecken des Ventilatorausschnittes schön ‚reinbiegen’…. ansonsten ist das eine sehr exakte, langwierige Arbeit da die ganzen Nuten und Überstände sorgfältig mit dem ‚Cutter-Messer‘ geschnitten werden müssen.

Danach hab ich mich dazu entschieden 10×10 mm Aluminiumleisten an die Kannten an zu bringen, damit die Folie an diesen Stellen geschützt ist. Das ganze auf Gehrung gesägt und Schwarz Matt (RAL 9005) lackiert und mit einem sehr guten Kleber angebracht.

Der letzte Teil war dann die Front, das sogenannte ‚Backglass‚… in meinem Fall dann eher das ‚Backwood‘ :-). Nach lackieren & Co. habe ich als Halterung für den 27″ Led zur Fixierung 2 Holzstücke genommen dann mit einem feinen Lochblech (welches oben im Holz eben eingelassen ist) und Moosgummi unter Spannung gebracht. Die Lautsprecher des Wavemaster-Systems (siehe Einkaufsliste) angeschraubt, Kabel gekürzt und fertig war das Back-Wood.

Nach dem dann der komplette Einsatz dann aufgeschraubt war konnte ich den DMD-Monitor anbringen und zum Schluss dann noch die Holzblende anbringen.

Soviel mal zum Gehäuse… natürlich habe ich parallel an Elektronik & Software gebastelt… doch dazu später mehr.

Das Innenleben

PC

Der Computer ist ein normaler PC (siehe oben Komponenten) den ich mit Platinenfüßen auf ein Holzbrett geschraubt habe, die PCIe Karten zusätzlich noch mit einer Gewindestange fixiert.

Um alles ein zuschalten habe ich mich für eine „Master-Slave Steckdosenleiste“ entschieden. Der Einschaltknopf des PC (am Mainboard „Power“) also sprich das Netzteil ist der „Master“ und die restlichen Komponenten werden dann als „Slave“ eingeschalten.

Ausschalten kann man das ganzen dann über das VPINFrontend“ (Details weiter unten) mit den Flippertasten (in dem der PC herunterfährt).

Angebracht habe ich die Buttons unter dem Gehäuse (weiß „Power“, rot „Reset“, die kleinen weißen „WIN Volume lauter/leiser“, der Drehregler ist die Lautstärke der Moody-Systems).

Das ganze ist ein „3 Screen Setup“ und ich habe es so gelöst, dass  Monitor #1 (TV) das Spielfeld im Hochformat, Monitor #2 das DMD und Monitor #3 das Backglass ist. Entgegen dem Standardsetup die Monitore seitlich anzuordnen habe ich bei meinem Setup „übereinander“ gewählt, weil ich oft davor stehe und im WIN arbeite (neue Tische installieren und einrichten etc.)… ich fand das praktischer (und außerdem macht irgend ein Penner die Schrift jedes Jahr kleiner und kleiner und kleiner…)

Sonstiges: der Computer fährt nochmal ins WIN, im Bios habe ich die USB-Spannungsversorgung ausgeschalten (sonst sind die Microcontroller dauerhaft an) und im WIN starten dann einige Programme per Batch-Datei/Autostart doch dazu später mehr.

LEDs

Für meinen Virtuellen Flipper verwende ich folgende unterschiedliche Setups:

  1. WS2801 LEDs mit einem Raspberry Pi2 (RPI) Controller (um das „Spielfeld“ nach unten zu projizieren (wie Ambilight))
  2. WS2812B LEDs mit einem Teensy 3.2 Controller (um Farben/Trigger/Events aus dem Spiel auf das Spielfeld & hinter das Backglass zu legen)
  3. RGB-LEDs um die Flipper- & Magma-Buttons mit der entsprechenden Farbe zu beleuchten
  4. (ein)Farbige LEDs um einfach die Buttons zu beleuchten bzw. aus dem Spiel Events wie z.B. ein „blinken“ auf den Buttons zu legen

Von der Spannungsversorgung her sind die folgendermaßen angeschlossen:

  • Die WS2801 LEDs werden am 5V Netzteil (siehe Einkaufsliste) mit +5 und GND (-) angeschlossen und parallel kommt GND noch mal am RPI an Pin 9, sowie „DI“ an Pin 19 und „CK (Clock)“ an Pin 23
  • Die WS2812B LEDs am Teensy Octo-Adapter (Netzwerk-Kabel) mit Orange/Orange-Weiss: Stripe #1 und
  • Blau/Blau-Weiss: Stripe #2. Die Spannung (+5V und GND) werden abgesichert vom Netzteil direkt in die LED-Stripes eingespeist (siehe Bilder). Wichtig: alle 180 LED neu einspeisen.
  • Die einfarbigen und RGB-Buttons werden am Pinscape Controller angeschlossen (siehe Bilder)… aber Achtung: das wird „gegen Masse geschallten“, sprich: es gibt „einen Plus“ (PIN 18) und die anderen Kabel (R, G, B..) sind „Masse“ (hat mich einen RGB-Button gekostet)

Ich habe alles was aus dem 5V Netzteil kommt entsprechende abgesichert… das ganze kann man sich gut errechnen (siehe Bilder)… bei mir habe ich es meist so aufgeteilt, dass 2A reichen (sehr wichtig für die Lebensdauer der LEDs sowie abfackeln des Flippers).

Wie ich diese dann letztendlich im VPIN ansteuere findet Ihr bei der Software / den Microcontrollern.

Surround Sound Feedback (SSF)

SSF steht nicht für Schweizer Sportfernsehen… nein für „Surround Sound Feedback“…. wichtig hierbei ist das Wort „Feedback“.

Einfach gesagt wird das Feedback „fühlbar“ durch Bass-Pumps (Bassshaker/Körperschallwandler) und „hörbar“ durch sogenannte Exciter.

SSF kann man zusammen mit DOF (Direct Output Framework) und Magnetventil-basierten Geschichten wie Schützen etc. betreiben oder auch alleine. Ich persönlich betreibe es alleine (ohne Schütze & Co.), finde es sehr einfach und effektiv…. eigentlich fast das coolste an meinem Virutellem Flipper (VPIN).

Man kann aber auch Schweizer SportFernsehen schauen…

aber Ok… wie gehts?!

Man nimmt eine 7.1 Soundkarte und nutzt:

  • Front für sein normales System, welches im Backglass angebracht ist (in meine Fall das „Moody“, welches ja einen Subwoofer mit Fequenzweiche enthält)
  • Center/Subwoofer bleibt leer
  • Side für Bass-Pumps & Exciter hinten (nähe Backglass)
  • Rear für die Bass-Pumps & Exciter vorne (nähe Flipperbuttons)

» Siehe Skizze in der Galerie.

Wie die Lautsprecher, Exciter & Bass-Pumps angebracht sind, seht ihr auch am besten auf den Fotos in der Galerie.

Angesteuert habe ich das ganze durch 2.1 Endstufen…. und zwar 4 Stück, damit ich die Bass-Pumps jeweils am Subwoofer-Ausgang betreiben kann. Wie man auch auf den Bildern sieht: L/R wird an der Soundkarte mit einem „Klinke <> Chinch“ Kabel aufgetrennt, dann geht es jeweils in den linken oder rechten Kanal des Amps und von dort weiter an Exciter (Ton) und Bass-Pump (Vibration).

Ich empfehle Amps an denen eine kleine Klangregelung und separate Lautstärke für Subwoofer- & Speaker-Ausgang vorhanden ist. Auch ein hochwertiges Netzteil um Störgeräusche auf den Bass-Pumps (somit z.B. doofe Vibrationen) zu vermeiden.

Abgesichert ist jede Endstufe mit 2A. Alle Teile findet Ihr oben in der „Einkaufsliste„.

Zum anbringen der Komponenten kann ich nur folgendes mitgeben:

  • Netzteil sollte ein bisschen „Kühlung“ bekommen (irgendwo im Luftstrom platzieren)
  • Die Bass-Pumps sollten nicht unbedingt neben elektronisch kritischen Komponenten angebracht werden
  • Amps so platzieren, dass Ihr gut „nachregeln“ könnt

Ich wurde schon öfters gefragt.. aber auf das „nudging“ (Tilt & Co) hat das kein Einfluss, da bei mir der Pinscape-Controller (auf dem der Sensor sitzt) vorne in der Mitte des Cabs auf einem Brett angebracht ist.

Es ist auf jeden Fall bemerkenswert, wenn im „virtuellen Spiel“ die Flipperfinger, Slingshots & Bumper angetriggert werden und man hört und spürt es auf dem Gehäuse!!!

Auch wenn die Kugel rollt oder gegen Holz, Kunststoff oder Metall prellt… spürt und hört man das… ein super tolles „Feedback“… ich kann es nur empfehlen!

Wie das alles eingestellt und konfiguriert wird, seht Ihr unter „Software„.

Die Microcontroller

Raspberry Pi

Den Raspberry Pi 2 nutze ich in Verbindung mit OpenElec, WS2801 LED´s und Hyperion um den Rand des „Playfields“ nach unten auf dem Boden zu projizieren.

Wie ich das genau gelöst habe, findet Ihr ein bisschen detaillierter auf dieser Seite: Ambilight mit dem Raspberry PI im Eigenbau

  • Anzahl LEDs links/rechts: je 12
  • Anzahl LEDs vorne/hinten: je 32

HyperCon Settings:

HyperCon Config - General
HyperCon Config - Process
HyperCon Config - Grabber
VPIN: Rapsberry Pi WS2801 LEDs

VPIN: Rapsberry Pi WS2801 LEDs

Beispielvideo (damals noch mit Ambilight auch auf dem Backglass):

Pinscape KL25Z

Der Pinscape KL25Z ist eins der Herzstücke in meinem virtuellen Flipper / VPIN, das ganze ist OpenSource (Webseite) was ich zusätzlich eine sehr gute Sache finde.

Ich nutze den Pinscape inkl. des Mainboards (Erweiterungsplatine) für:

  • meine Buttons (Button klicken)
  • die Steuerung der Beleuchtung von Start / launch Ball Button sowie den 4 RGB-Flipperbuttons
  • das „nudging“ (Sensor) – sprich den Flipper durch Stöße beeinflussen
  • den analogen „Plunger“

Buttons

Bei den (Arcade)Buttons habe ich ein paar Icons gestaltet, mit dem Drucker ausgedruckt, ausgeschnitten und zwischen Knopf & Platte angebracht… der Effekt: Buttons mit beleuchteten Symbolen (siehe Bilder).

Ich habe die folgenden Buttons am Pinscape angeschlossen:

  • Blau oben – Taste: „E
    • Frontend: Cancel/Escape/Exit Game
    • Visual Pinball: –
    • Pinball FX: –
  • Blau mitte – Taste: „ESC
    • Frontend: –
    • Visual Pinball: –
    • Pinball FX: ins Menu
  • Blau unten – Taste: „Tab
    • Frontend: Info
    • Visual Pinball: –
    • Pinball FX: Tab im Menu
  • Links, Rechts, Oben, Unten
    • Pfeiltasten des Keyboards… um in Pinball FX durch die Menüs zu navigieren
  • Geldauswurf – Taste: „3
    • Frontend: Coin1
    • Visual Pinball: Add credit
    • Pinball FX: Ansichtsmodus(Kamera)
  • Rot oben – Taste: „Enter
    • Frontend: Select/Enter
    • Visual Pinball: Plunger
    • Pinball FX: Plunger/Enter(Menu)
  • Rot mitte – Taste: „S
    • Frontend: Launch
    • Visual Pinball: Start Game
    • Pinball FX: Wizard-Kraft
  • Flipper Links – Taste: „Shift L
    • Frontend: zurück
    • Visual Pinball: Flipper L
    • Pinball FX: Flipper L
  • Magnasave Links – Taste: „Ctrl L
    • Frontend: Seite zurück
    • Visual Pinball: Magnasave L/Nudge L
    • Pinball FX: Nudge L*
  • Flipper Rechts – Taste: „Shift R
    • Frontend: vor
    • Visual Pinball: Flipper R
    • Pinball FX: Flipper R
  • Magnasave Rechts – Taste: „Ctrl R
    • Frontend: nächste Seite
    • Visual Pinball: Magnasave R/Nudge R
    • Pinball FX: Nudge R*

*Hinweis: die Magnasave Tasten sind in Pinball FX mit den Tasten „L / R“ belegt…. und in der DOFlinx Config (siehe weiter unten) dann gemapped auf „Nudge L/R via » Ctrl L & R“.

  • Vol up (WIN Lautstärke +)
  • Vol down (WIN Lautstärke -)

Outputs (Steuerung der Beleuchtung)

Die Outputs des Pinscape nütze ich um:

  • bei den RGB-Flipper- & Magnasave-Buttons die entsprechende Farbe einzustellen
  • bei dem Launch Ball- / Start-Buttons (Select/Enter bzw. Start Game – siehe Buttons) die LED leuchten oder pulsieren zu lassen

Anwendungsfall ist sozusagen: ich kann die Flipper-Buttons mit den originalen Farben der echten Tische belegen und Interaktion (wenn Geld eingeworfen in Visual Pinball + Credits genug da, dann pulsiere den „Start Game“ Button) aus dem Spiel oder Frontend heraus steuern .

  • Output 50-52 (RGB): Flipper Rechts
  • Output 53-55 (RGB): Flipper Links
  • Output 56-58 (RGB): Magmasave Rechts
  • Output 59-61 (RGB): Magmasave Links
  • Output 62: Launch Ball
  • Output 65: Start Game

PIN-Belegung am Pinscape seht Ihr rechts in den Bildern. Das ganze ist auch so im DOF-Config-Tool eingetragen… somit ist bei DOF-Unterstützung (im Spiel/Frontend…) dann für den entsprechenden Tisch, die entsprechende Farbe/Aktion hinterlegt.

Mehr zu DOF (direct output framework) weiter unten in der Kategorie „Software„.

 

Nudging

Das Nudging (Synonym für anregen, lenken, formen) ist eine verhaltensökonomische Methode, bei der versucht wird, das Verhalten von Menschen auf vorhersagbare Weise zu beeinflussen… beim „flippern“ ist damit gemeint: die Kugel mit mechanischer Einwirkung (durch anstoßen, rütteln) auf das Cabinet » zu beeinflussen.

Und da unser Spielfeld „digital“ und das Cabinet (Flippergehäuse) „analog“ ist… stellt in diesem Fall der Beschleunigungssensor des Pinscape-Controllers die Brücke her.

Und ich muss schon sagen: es ist verdammt cool, wenn man den Flipper rüttelt und die Kugel oder sogar Elemente auf dem Spielfeld sich daraus abgeleitet bewegen/beeinflussen.

Wie genau… seht Ihr unten bei Software (Visual Pinball, DOFLinx…).. am Pinscape habe ich die Dynamik des Sensors auf +/- 1G und die Zentrierung auf „Auto-Center“ eingestellt.

Mein Pinscape ist so eingebaut, dass die USB-Anschlüsse nach hinten zeigen.

Plunger

Bei dem Plunger (Kolben) verhält es sich wie oben beim „nudgen“… wir haben ein „echten Plunger“ für ein „digitales Spielfeld“. Manche Flippertische (wie z.B. der Terminator 2) haben auch einen „Abschussknopf“… da nutze ich dann den Button von oben (Launch Ball).

Man kann es auch so lösen, dass wenn man diesen Knopf länger gedrückt hält, dieser den Plunger „aufzieht“….. das ist aber:

  • „fummelig“, da man z.B. um einen Skillshot zu machen, dann zum richtigen Zeitpunkt loslassen muss
  • nicht so cool…

Es ist schon cooler und „spiel freundlicher“ wenn man den Plunger (in echt) zieht und auf dem Spielfeld dann auch der Plunger auf die gleiche Position fährt (inkl. Nachkorrektur).

Kurz und einfach erklärt: der Plunger via Pinscape funktioniert wie ein Joystick mit der entsprechenden Achse.

Verbaut habe ich ein Potentiometer (Poti) mit einem Widerstand von 10 kOhm und einem Schiebe-weg von 100 mm.
Angeschlossen ist der Poti mit 3 Kabeln an den entsprechenden PINs (siehe Bilder). Das Poti ist mittels 3D-Druck-Halter am Plunger angebracht und in der Pinscape-Software kalibriert.

Ich möchte auch noch auf die sehr gute Dokumentation von MJR verweisen (Details zum Plunger).

Wie das in Visual Pinball eingestellt ist und was dazu noch in Pinball FX3 zu tun ist findet Ihr auch weiter unten bei „Software“.

Teensy 3.2

Der Teensy (welchen ich auf ein Teensy Octo-Board gelötet habe) übernimmt die Steuerung von (WS2812B) LEDs auf dem Spielfeld aus dem Spiel/Frontend heraus.

Die meisten nutzen LEDs im Playfield, unter dem Flipper „undercab“…. ich habe das ein bisschen anders. Da bei mir „undercab“ ja der Raspberry macht (was ich schöner finde, da ein bisschen „Bewegung der wirklichen Spiels“ zu sehen ist) habe ich folgendes Setup:

In Summe sind es 405 LEDs verteilt auf:

Stripe #1 (RJ45 Kabel – Orange/Orange-Weiss)

  • Playfield Rechts: 126
  • Playfield Hinten: 69
  • Playfield Links: 126

Stripe #2 (RJ45 Kabel – Blau/Blau-Weiss)

  • Backbox Links: 28
  • Backbox Oben: 28
  • Backbox Rechts: 28

Also ich nutze „RGB Undercab Complex MX“ für meine Backbox links/rechts… das hat z.B. den Effekt: das der Hintergrund in der entsprechenden Tischfarbe / Flippertisch LED-Animation den Raum beleuchtet… und ich nutze „Playfield back“ parallel auf der „Backbox oben“, was den Effekt hat, wenn z.B. bei einem Flippertisch das Stroboskop auf dem Spielfeld angeht, der Raum auch kurz mitmacht (sieht nach meinem Geschmack sehr cool aus).

Ge-flashed ist der Teensy via Arduino mit der „OctoWS2811Ext.h“ (siehe Bild).

Jede Spannungsversorgung habe ich (bei meiner Anzahl LEDs) mit 2A abgesichert… gerechnet habe ich folgendermaßen:

132 Led´s sind ca. 7,92A, davon 25% = ~2A

Eingespeist (+5V) habe ich:

  • Playfield rechts + hinten (195 LEDs)
  • Playfield links (126 LEDs)
  • Backbox links, oben, rechts (84 LEDs)

Die Cabinet.xml:

 

Diese beschreibt sagen wir mal: den Aufbau Eurer LED-Anordnung (Anzahl Stripes, Name, LED-Anzahl, LED-Nummer, Farben, Output, Outputgruppierung etc.)… siehe Bilder.

Meine LEDs habe ich am Spielfeld in einer Leiste angebracht und diese noch mit Spiegelfolie bezogen, in der Backbox sind die LEDs in der entsprechenden Nut eingelassen.

Auch hier ist wie oben bei den „Outputs“ relevant die entsprechenden „Ports“ im DOF-Config-Tool einzutragen, damit die „Trigger des Spiels“ dann jeweils á Flippertisch die entsprechenden LEDs Effekte steuern können (siehe Bilder).

Relevant ist hier vom Prinzip her die „directoutputconfig30.ini“… doch mehr zu „DOF“ und den entsprechenden Einstellungen weiter unten bei „Software„.

 

Hinweis: wo ich locker 3 Tage „Fehlersuche“ verschwendet habe: das Netzwerkkabel „RJ45“ in den korrekten Port (Port1 = Stripe 1-4, Port2 = Stripe 5-8) am Teensy stecken 😉

Software

Locker 50% meiner Projektzeit habe ich für Software verwendet.

Das Kapitel Software ist so ziemlich das größte und aufwendigste…. zumindest so wie ich den VPIN nutze. Deswegen gehe ich hier auf ein paar Dinge ein, aber nicht in aller Tiefe (die einzelnen Dokumentationen der Programme geben ja auch viel her).

Zusammenfassend ist das Ganze ein WIN10 (Pro, wegen Remote-Desktop-Funktionalität) Rechner, welcher beim Einschalten des „Power Switch“ (Mainboard) durch einen Button unten am Cabinet eine Master/Slave Steckdosenleiste aktiviert. Der Computer fährt hoch und versorgt damit die per USB- und Computer-Netzteil Spannung angeschlossenen Geräte (Pinscape, Teensy…) und die Master/Slave-Leiste dann den Rest (RPI, 5V & 13,8V Netzteil, Monitore, TV…).

In Windows wird der Benutzer automatisch angemeldet, über eine Batch-Datei sowie den Autostart werden Programme wie „PinballY, DOFLinx, PinUPPlayer, PINvol, PinSoundStudio… “ gestartet.

Sobald das Frontend (in meinem Fall PinballY) gestartet ist, lässt sich alles bequem über die Buttons steuern.

 

Anbei mal ein grobes Verhältnis der Aufwände:

@echo off
c:
cd c:\DirectOutput
start /min DOFLinx.exe

c:
cd C:\PinUPSystem\PinUPPlayer
start /min PinUpPlayer.exe

c:
cd C:\PinballY\
start PinballY Admin Mode.exe

c:
cd C:\PinSoundStudio\PinSoundStudio-09\
start PinSoundStudio.exe /minimized

Projektphase

Aufwandsverteilung Mechanisch/Technisch/Software während der Projektphase

0% Mechanische Aufwände
(Holz, Metall, usw)
0% Elektrische Aufwände
(Löten, verkabeln, etc.)
0% Software
(Betriebssystem - Frontend)

Regelbetrieb

Aufwandsverteilung im Regelbetrieb (Software)

0% Feintunning (allg.)
(Optimierungen, Addons, Scripte...)
0% Frontend
(Design, Videos, Audio)
0% Tische
(Installation, Konfiguration, SSF)

Aufwandsanteile: Software (während der Projektphase)

Informationen 35%
Recherche, Dokumentation..
OS 5%
Windows
Konfiguration 10%
Hardware, Configs, INIs, ...
Frontend 10%
PinballY, PUPplayer
VPX/FX3 5%
Spiel, Settings...
DOF/DOFLinx 10%
Software<>Hardware
Addons 15%
PINsound, PINvol, Altsound, Scripting...

Ich starte jetzt nicht damit, wie man ein WIN10 installiert… auch die „automatische Anmeldung“ ist im Netz gut zu finden.

Ich starte mal von den „Games“ über das Zusammenspiel von „Gimmicks“ und notwendigen „Tools“ bis hin zum „Frontend“.

Visual Pinball

Visual Pinball

Visual Pinball ist eine Freeware Videospiele-Engine für Flipper-Tische und in Kombination mit Visual PinMAME in der Lage auch die ROMs aus den (echten) Flipperautomaten zu emulieren und mit dem B2S Backglass Server (Plugin) noch ein Backglass zu emulieren. Die Tische bestehen grob aus zwei Teilen: dem Spielfeld-Design und einem Skript, welches das Gameplay steuert.

Achtung: VPX (Visual Pinball 10) ist keine „Plug & Play like Sache“… d.h. wer hier nicht bereit ist ein bisschen in die Tiefe abzusteigen und keine INI-Datei editieren kann, ist hier falsch… aber im Umkehrschluss seit Ihr deswegen ja wahrscheinlich hier (in die Tiefe absteigen etc.).

Starten würde ich mit dem: VPX 10.6 All-in-one Installer (ggf. Beta …).

  • VPX6Setup.exe installieren
  • in c:\Visual Pinball
  • DMD-EXT wählen
  • und weiter (DirectX, .Net usw)
  • und für das 3-Monitor-Setup habe ich noch B2S installiert (direct Backglass)
  • vpinballx.exe noch als „Admin“ laufen lassen

Die neueste SAM-Build (3.3 Beta) entpacken und den folgenden Ordner überschreiben: c:\Visual Pinball\VPinMAME\, dann die Setup.exe darin ausführen…. und dann noch Freezys DMD Extentions (Freezys DLL) installieren für ein schönes DMD (siehe Install Instructions auf der Seite).

Auch mittlerweile kann ich FlexDMD (in Kombination mit Freezy´s DLLs) wärmstens empfehlen…. in kurz: flutscht, sieht top aus.. und bringt sogar Mehrwerte u.a. durch Unterstützung in PinballY… mehr dazu bei den Features und der (relativ einfachen) Installation auf der Git-Seite.

ein Tipp, wie Ihr sicherstellt, dass bei allen Tischen das DMD an der richtigen Stelle sitzt und was genau die Pixel-Position findet Ihr unten unter Tools.

Zwecks Einstellungen hier noch meine DmdDevice.ini:

[global]

; how to downscale SEGA 192x64 pixel games to smaller displays: fit, fill or stretch
resize = fit

; flips the image horizontally
fliphorizontally = false

; flips the image vertically
flipvertically = false

; enable or disable frame-by-frame colorization (inactive in VPX bundle)
colorize = true

; a DMD that renders with nice dots on a computer monitor
[virtualdmd]
enabled = true

; virtual dmd stays on top of all other windows
stayontop = false

; hide the resize grip
hidegrip = false

; x-axis of the window position
left = -3

; y-axis of the window position
top = -936

; width of the dmd in monitor pixels
width = 1296

; height of the dmd in monitor pixels
height = 324

[pindmd1]

; if false, doesn't bother looking for a pinDMD1
enabled = false

[pindmd2]

; if false, doesn't bother looking for a pinDMD2
enabled = false

[pindmd3]

; if false, doesn't bother looking for a pinDMD3
enabled = false

; COM port, e.g. COM3
port =

[pin2dmd]

; if false, doesn't bother looking for a PIN2DMD
enabled = false

; if enabled, writes frames to an .avi file
enabled = false

; path to folder or .avi file. if folder, gamename.avi is used.
path =

 

Der B2S Backglass Server sollte in c:\Visual Pinball\Tables\ liegen…. falls das nicht läuft:

  • B2SBackglassServer.dll » rechte Maustaste » Tab: Allgemein » „Zulassen“
  • B2SBackglassServerRegisterApp.exe » rechte Maustaste » als Administrator ausführen

Was ich so in VPX eingestellt habe, findet Ihr in der Galerie.

Tische in Visual Pinball installieren

Grundsätzlich benötigt man (bis z.B. auf Tische die rein ’nur in VPX‘ gemacht wurden oder in Kombination mit dem PUPPlayer) den Tisch selbst, das Backglass und das Rom.

  • Tischname.vpx » c:\Visual Pinball\Tables
  • Tischname.directb2s » c:\Visual Pinball\Tables
  • ROM.zip » c:\Visual Pinball\Tables\VPinMAME\roms\

Hinweis: ich nutze bei Tischname immer folgende Logik:

  • Name (Brand Jahr)
  • Attack From Mars (Bally 1995)

also auch kein Tischname-V.0815.vpx etc…. denn so ist auch die Ablagestruktur meiner Medien im Frontend.

Alternativ kann man dann noch den Sound ersetzen mit Altsound oder PinSound, sowie sogenannte PUPPacks installieren… doch dazu mehr später.

Quellen für Tische & ROMs: VPForums.org, vpuniverse.com, vpinball.com, worldofvpx.com, Google.

Feintunning:

Da ich ein Sourround Sound Feedback (SSF) Setting habe, optimiere ich so gut wie jeden Tisch… ich ersetze grundsätzlich immer

  • Bumper-Sounds
  • Flipper-up / Flipper-down
  • Slingshots

im Soundmanager (siehe Bilder) und positioniere die Sounds entsprechend (Vorne/Hinten, Links/Rechts), und stelle je nach Tisch dann noch Backglass/Table um (z.B. collide, Plunger-pull, Knocker auf das „BG“).

Wer mag, kann gerne meine Sounds probieren…. hier zum Download:

fR33Styler´s SSF Sounds
Tischposition

Aus VPX kann man mit „F6“ das positionieren des Tisches starten… und mit den Flipper- & Magnasave-Tasten dann Winkel, Größe und Position sowie Beleuchtung etc. einstellen.

Optionen

Im Spiel mit „F1“ kann man auf die „Options“ gehen und dort z.B. Cabinet-Mode und external DMD (siehe oben „FlexDMD„) einstellen.

Color ROM (DMD in Farbe)

Um die ROM zu „colorieren“ gibt es 2 Möglichkeiten: Altcolor (via Pin2DMD einfärben) & ROM patchen (für Stern ROMs)

Vorgehensweis für Altcolor:

Voraussetzung: Freezy´s DMD Extentions und meine Empfehlung FlexDMD (siehe unter #VPX)

  • Verzeichnis erstellen: c:\Visual Pinball\vpinmame\altcolor\(rom-name)
  • dort die Datei pin2dmd.pal & Pin2DMD.vni ablegen
  • Im Spiel F1 drücken, dort (natürlich „Use external DMD (dll)“ an) dann „Colorize DMD (4 colors)“ anwählen (siehe Bild rechts)
  • Tisch neu starten und farbenfroh sein

Vorgehensweis für ROM patchen:

Voraussetzung: Freezy´s DMD Extentions und meine Empfehlung FlexDMD gilt auch hier (siehe unter #VPX)

  • Verzeichnis erstellen: c:\Visual Pinball\vpinmame\altcolor\(rom-name)
  • dort die Datei pin2dmd.pal ablegen
  • bspatch
    • runterladen, entpacken
    • rechte Maustaste und „Zulassen“ wählen… sowie bei Kompatibilität „als Admin ausführen“
    • DOS Fenster starten (ausführen (WIN+R) » „cmd“)
    • zum Ordner der Dateien navigieren (z.B. c: … cd 0815 …)
    • dann das ROM patchen (d.h. die Original ROM (.bin), die Patchdatei (.diff) sollten dann auch in dem Ordner liegen)
    • Parameter sind: bspatch original-rom.bin neue-color-rom.bin patch.diff
      • also für AC/CD dann als Beispiel: bspatch ACD170LE.bin acd_170hc.bin acd_170hc_ByPinballMikeD.diff
  • die neue ROM dann Packen (mit 7zip / Winrar) z.B. unter dem Namen acd_170hc.zip
  • die ROM (.zip) im Ordner c:\Visual Pinball\vpinmame\roms\ ablegen
  • im Table Script dann bei „cGameName“ den Namen der neuen ROM eintragen
  • Im Spiel F1 drücken, dort (natürlich „Use external DMD (dll)“ an) dann „Colorize DMD (4 colors)“ anwählen (siehe Bild rechts)
  • Tisch neu starten und auch hier „farbenfroh sein“

Wichtig ist noch: der gewählte ROM-Name MUSS in der VPinMame Datenbank vorhanden sein, sonst klappts nicht.

Gute Quellen für: Pin2DMD Colorizations & Color ROM Patches sowie 296 AltColor Color Palletten (nur zum färben).

Altsound

Wichtig hierbei: wenn man einen „altsound“ hat (alternatives Soundpack), muss man in Options unter „Alt. Sound Mode“ eine „1“ einstellen, den Soundpack im exakt gleichen Namen wie des Rom´s unter: c:\Visual Pinball\Tables\VPinMAME\altsound\(rom-name) speichern.

Eine gute Quelle für altsounds: altsound.vpin24.com

Lautstärke innerhalb den Tischen passe ich mit „PINvol“ an… doch mehr dazu weiter unten.

Scripts

Was ich auch noch mache, ist manchmal optimierte Scripte zu verwenden…von Fastflips bis SSF Optimierungen. Ihr müsst nicht das „original Script“ ersetzen… es reicht, wenn Ihr das Script genau so benennt wie Tischname.vpx oder .directb2s (wie oben) und in den Ordner c:\Visual Pinball\Tables\ kopiert.

Checkt mal die repo von „sverrewl„: vpxtable_scripts, ich finde da gibt es einiges gutes und dort steht auch in den Kommentaren was optimiert wurde.

PinSound

PinSound

PinSound steht eigentlich für Soundboards, welches den Flipper von gestern eine höhere Klangqualität verleiht.

Es gibt aber auch eine Software „PinSound Studio Pro“ welche es ermöglicht Sounds zu bearbeiten, anzupassen usw. Leider ist nach der Version 0.9 der Fokus nur noch auf dem „Bearbeiten“.

Bis zur Version „PinSound Studio 0.9“ war es möglich einem VPINMame-Rom einen PinSound-Soundpack zuzuweisen (siehe Bilder)… und was da passiert ist: wenn das Spiel startet, werden die Sounds von dem Pack benutzt anstelle der originalen/alten Rom-Sounds.

Vorgehensweise:

  • PinSound Studio 0.9 installieren
  • Soundpack in den entsprechenden Ordner unter PinSound Studio 0.9 entpacken
  • In PinSound Studio 0.9 die Zuweisung von ROM <> Soundpack machen
  • In VPX bei den „Options“ (F1-Taste) unter „Sound mode“ eine „2“ eintragen
  • Tisch neu starten und Spaß haben

Wichtig ist: VPX und PinSound Studio müssen im Admin-Modus laufen.

Das klingt schon verdammt gut…. ich kann echt empfehlen mal das Terminator 2 oder das Doctor Who Rush Pack zu probieren.

Ihr findet so einige Packs hier in der PinSound Community: Downloads

Pinball FX3

Pinball FX3

Pinball FX3 ist eigentlich am einfachsten einzurichten. Es wird später nicht so einfach die „Toys“ (Leds, SSF..) zum laufen zu bringen, doch später mehr unter DOFLinx.

Ihr installiert das Spiel über Steam, kauft Euch die Tische (am besten in einem Steam-Sale) welche Ihr spielen möchtet… dann fordert Ihr den Cabinet-Code an (dauert 2-3 Tage) und mit diesem könnte Ihr das DMD auf einen separaten Bildschirm legen (siehe Bilder).

Anmerkung: wie Ihr am besten die Pixel-Position für Euer DMD raus findet, steht unter Tools.

Bei den Audio-Einstellungen habe ich gewisse Dinge wie die Spielmechanik zurück genommen und das Ganze im Bezug auf PINvol, VPX, sowie Frontend (PinballY) augeglichen eingestellt… damit die Lautstärkensprünge nicht all-zu-heftig sind, aber auch das Surround-Sound-Feedback über das PUPpack ausgewogen ist (Slingshots, Bumper, Flipper etc. werden da direkt auf die Bass-Pumps und Exciter gegeben und die Spielmechanik kommt noch dezent über das Backglass aus Pinball FX3 „on top“ dazu.

Mehr zu „fR33Styler´s Pinball FX3 SSF PUP-Pack“ und DOFLinx/PUPplayer weiter unten.

Direct Output Framework (DOF)

DOF
DOF (direct output framework)

DOF ist eine Software die es ermöglicht Feedback-Geräte anzusteuern. Also eine Art „Add-On„, das mit Visual Pinball und anderer Software zusammenarbeitet.
DOF kümmert sich um die Kommunikation zwischen der Flippersoftware und den Ausgabesteuergeräten (LedWiz, PacLed, SainSmart-Relaisplatinen, Pinscape und weitere) und übersetzt zwischen den simulierten Spielelementen von VPX und den physischen Geräteanschlüssen des Ausgabecontrollers.

Also.. ansteuern von LEDs, Stroboskop, Shakermotor, Ventilator, Solenoids, Knocker, Glocken(spiel) usw.

DOF zum: Download

Folgende Microcontroller werden automatisch von DOF erkannt: Pinscape, LedWiz, und Pac-Led.

Wichtig ist DOF nach VPX und B2S zu installieren… und am besten in den Ordner: C:\DirectOutput

  • Entpacken in C:\DirectOutput
  • alle neuen DLL- und EXE-Dateien freigeben
    • rechten Maustaste auf die Datei
    • Eigenschaften aus dem Menü
    • Registerkarte „Allgemein“
    • „Sicherheit: Diese Datei stammt von einem anderen Computer und könnte blockiert werden, um diesen Computer zu schützen“
    • Auf Schaltfläche „Zulassen“ klicken
  • Im Ordner c:\Visual Pinball\Plugins\ eine Verknüpfung von C:\DirectOutput anlegen

Jetzt zum testen mal einen VPX Tisch laden, welcher ein interaktives Backglass enthält (das Thema von weiter oben mit den .directb2s Backglass Dateien) und testen.

Auf dem Backglass im Spiel die rechte Maustaste drücken, dann auf „Plugin Settings“ und dann solltet Ihr „DirectOutput“ als Plugin laufen sehen:

VPIN: DOF Plugin

VPIN: DOF Plugin

 

Mehr zu DOF findet Ihr auch ganz gut erklärt bei MJR.

DOF Config Tool

DOF lädt die Cabinet.xml (siehe oben)… und das ist auch die Basis für das ansteuern der LEDs.
Jetzt braucht es noch die „Brücke“: VPX -> Trigger -> was sollen die LEDs tun -> …

Ihr erstellt Euch einen Account und logt Euch im DOF Config Tool ein unter:
configtool.vpuniverse.com

Ausgabegeräte:

In der Navigationsleiste unter „Mein Konto“ könnt Ihr eintragen, wie viele Ausgabegeräte ihr habt. Wenn Ihr einen Pinscape-Controller verwendet, setzt die „Anzahl der Pinscape-Geräte“ auf 1 und lasst die „Anzahl der FRDM-KL25Z-Geräte“ auf 0… dann speichern mit „Save Settings„.

Portzuweisungen:

Navigiert zu den „Port Assignments“ in der Navigation, hier macht man die Mappings zwischen „output port numbers“ und „specific devices“.

Ich habe im Moment ja „nur LEDs“ dran… und wie oben bei den Outputs beschrieben habe ich ja meine 4 RGB Flipper-Tasten, Start- & Launch-Button angesteuert… das sehr Ihr im Bild rechts… zuständig für die Pinscape-Outputs ist die „directoutputconfigini51„.
Achtet auf folgendes: die Outputs sind im DOF Config Tool die selben „Nummern“ wie oben beim #Pinscape eingestellt. 😉

Bei den LED-Stripes ist das ähnlich. Oben in der Cabinet.xml bzw. unter Teensy seht Ihr ja meine Aufteilung der Stripes bzw. ab welcher LED-Adresse was beginnt… das ist hier genau gleich.. zuständig für Teensy & die Stripes ist die „directoutputconfigini30„.

Für beides gilt: jeder Kanal bei RGB-Geschichten belegt einen Port (siehe Bilder).

DOFLinx

DOFLinx
DOFLinx

DOFLinx ist die Brücke für Pinball FX3/Future Pinball und Hardware… im Endeffekt: LEDs sowie SSF (in Kombination mit dem PUPPlayer) und baut auf dem Direct-Output-Framework auf.

Und es macht verdammt Spaß Pinball FX3 mit SSF & LEDs zu spielen.

DOFLinx zum: Download

Wichtig ist DOFLinx im DOF-Ordner zu installieren (C:\DirectOutput)

  • Entpacken in C:\DirectOutput
  • DOFLinx.INI anpassen
  • Pfadangaben in der INI prüfen

DOFLinx starte ich mit dem oben erwähnten Autostart (siehe #Software) und hier noch meine DOFLinx.ini Rechts (aufklappen) zum anschauen und Download.

Zum starten, kann ich nur empfehlen:

DEBUG=2

und schauen, was DOFLinx so tut… man sieht schnell, ob die Trigger von Pinball FX3 ausgelesen werden etc.

Was habe ich noch speziell in der INI gemacht?

Die Joystick „Plunger Settings“ sowie mittlerweile die „Nudge Settings“ habe ich deaktiviert, da ich beides in Pinball FX3 mit X360ce realisiere (siehe weiter unten).

Die Flipper-Buttons mit dem entsprechenden Output [DeviceNo.][Port] belegt (150,153)…. und den Start-Button (162) sowie den Launch Ball- & Fire-Button (165).

Das erzeugt folgendes: in Pinball FX3 sind die Flipper-Tasten entsprechend der definierten Farbe des Tisches beleuchtet, die Buttons blinken je nach Aktion.

Tastatur-Key-Codes findet Ihr hier: https://docs.microsoft.com/de-de/windows/win32/inputdev/virtual-key-codes

Mehr zu „Surround-Sound-Feedback @ Pinball FX3“ und „fR33Stylers-Pinball-FX3-SSF-PUP-Pack“ weiter unten.

DOFLinx

DOFLinx


#############################
#							#
# DOFLinx.ini by fR33Styler	#
#							#	
#############################


####
# The config file for DOFLinx with most common settings as a sample
#
# Note - this works with LEDWiz, PacLed64, Pinscape, Ultimate I/O and Sainsmart (FTDI devices)
# Edit this file as you see fit, lines that start with a hash (#) or are blank are not processed.  This blurb and comments can be cut out if you want.
#
# Output devices outputs are entered in the format of
# device (D) and output number (#) in the format D##, so controller device 1 and output 3 is "103" without the quotes, controller board 2 output 23 is "223" without quotes
#
# The keyboard hex code for the key that is used for each flipper from https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx
#
####

DEBUG=0
SHOW_IN_TASKBAR=0

# Point to your directoutputconfig.ini file.  Your file may have a number, ie directoutputconfig20.ini
# You can point to any of your directoutputconfig.ini files, but only one
# Keep this as the first pararameter to process in your INI file.  The order past ths point is not relevant

DIRECTOUTPUTCONFIG=c:\DirectOutput\config\directoutputconfig.ini
#DIRECTOUTPUTCONFIG=c:\DirectOutput\config\directoutputconfig51.ini
#DIRECTOUTPUTCONFIG=c:\DirectOutput\config\directoutputconfig30.ini
#DIRECTOUTPUTCONFIG=c:\DirectOutput\config\directoutputconfig-colours_only.ini

# The location of the .FX2/3 game specific files included with the DOFLinx release package
# Ensure your path has a \ on the end of it
PATH_FX2=C:\DirectOutput\FX2\
#PATH_FX3=C:\DirectOutput\FX3\
PATH_FX3=C:\DirectOutput\FX3_PUPlayer\

# The path to where you keep all of the .directb2s files that you've downloaded for use with FX3
# Ensure your path has a \ on the end of it
PATH_FX3_B2S=C:\DirectOutput\DOFLinx_FX3_B2S\

# This is the folder where B2SServer.exe can be found on your system
PATH_B2S_SERVER=C:\Visual Pinball\Tables\

# This is the path to where your B2SServer GlobalConfig is located. Needed for addressable led effects.
DIRECTOUTPUTGLOBAL=c:\DirectOutput\config\GlobalConfig_B2SServer.xml

# The list of processes that can activate DOFLinx, in this case, Pinball FX2, Pinball FX3 and Future Pinball
PROCESSES=Pinball FX2,Pinball FX3,Future Pinball

# An over-ride to the default setting given this is just being used with Pinball FX3, not FX2, FP or other systems that may require the default delay
PROCESS_TO_ACTIVE_TIME=1
#PROCESS_TO_ACTIVE_TIME=30000

# Joystick Nudge Settings with keycodes https://docs.microsoft.com/en-gb/windows/win32/inputdev/virtual-key-codes
# Doku: https://www.vpforums.org/index.php?showtopic=42325
# Keys: https://docs.microsoft.com/en-gb/windows/win32/inputdev/virtual-key-codes
# 4C = "L", 52 = "R"
# 

#JOY_PORT=1
#JOY_X_OFFSET=32767
#JOY_Y_OFFSET=32767
#NUDGE_LEFT_POINT=-5500
#NUDGE_RIGHT_POINT=5500
#NUDGE_FORWARD_POINT=4000

#NUDGE_LEFT_POINT=-1900
#NUDGE_RIGHT_POINT=1900
#NUDGE_FORWARD_POINT=2000

# L & R
#NUDGE_LEFT_KEY=4C
#NUDGE_RIGHT_KEY=52

#CTRL
#NUDGE_LEFT_KEY=A2
#NUDGE_RIGHT_KEY=A3

#NUDGE_FORWARD_KEY=20
NUDGE_LEFT_INPUT=A2
NUDGE_RIGHT_INPUT=A3

# Joystick Plunger Settings
# Doku: https://www.vpforums.org/index.php?showtopic=41930&p=425029 Alternativ X360CE: https://www.vpforums.org/index.php?showtopic=36108&p=413506
#PLUNGER_JOYSTICK_NUMBER=1
#PLUNGER_AXIS=Z
#PLUNGER_KEY=0D
#PLUNGER_PULL_POINT=63000
#PLUNGER_RELEASE_POINT=35000

# use default MX displays for Pinball FX2, Pinball FX3 
# the five flashers, flippers, slingshots, bumpers, strobe and beacon
AUTO_MX=1

# Set to 1 to output the game name to the log regardless of the DEBUG flag setting.  Set to 0 to simply follow the DEBUG flag.
# Quite useful when you trying to get the FX3 window game name for setting game specific colours, matching B2S names, etc
OUTPUT_GAME_NAME=0


# Future Pinball Link-Section (for Pinball FX too)
FP_ATTEMPT_LINK=1
#FP_LINK_WAIT_TIME=65000


######## DEVICES and PORTS for FUTURE PINBALL and FX3 ########

# LINK_XX=D##,Default Time,Max Time,Intensity Level
# Intensity Level should normally be left at 255 (max). Only PWM outputs used with something like a Shaker Motor can be less than 255.

# Device and Ports for the 10 solenoid setup for Flippers, Slingshots, Middle 3 solenoids, Back 3 Solenoids.
#LINK_LF=101,50,10000,255
#LINK_RF=102,50,10000,255
#LINK_LS=104,50,1000,255
#LINK_RS=105,50,1000,255
#LINK_ML=106,50,1000,255
#LINK_MC=107,50,1000,255
#LINK_MR=108,50,1000,255
#LINK_BL=109,50,1000,255
#LINK_BC=110,50,1000,255
#LINK_BR=111,50,1000,255

# Device and Ports for the shaker, gear motor, knocker, beacon and strobe
#LINK_SH=112,1000,5000,255
#LINK_GR=113,750,10000,255
#LINK_KN=114,120,500,255
#LINK_BK=115,FLASH,200,255
#LINK_SR=116,ON,0,255

# Device and Ports for the lights inside the various buttons including Start, Extra Ball, Coin, Exit, Launch Ball and Fire
#LINK_ST=117
#LINK_EB=118
#LINK_CN=119
#LINK_EX=120
#LINK_LB=121
#LINK_FR=122

# Device and "RED" ports for the 5 RGB flashers.
#LINK_FLOL=201
#LINK_FLIL=204
#LINK_FLCN=207
#LINK_FLIR=210
#LINK_FLOR=213
#LINK_LF=150,50,10000
#LINK_RF=153,50,10000
#LINK_LS=118,50,500
#LINK_RS=126,50,500
#LINK_ML=127,50,500
#LINK_MC=128,50,500
#LINK_MR=129,50,500
#LINK_BL=130,50,500
#LINK_BC=131,50,500
#LINK_BR=132,50,500
#LINK_SH=115,1000,5000
#LINK_GR=116,750,10000
#LINK_KN=124,120,500
#LINK_SR=217,ON,0
#LINK_BK=218,ON,0
#LINK_FLOL=201
#LINK_FLIL=204
#LINK_FLCN=207
#LINK_FLIR=210
#LINK_FLOR=213
#LINK_ST=102
#LINK_EB=101
#LINK_CN=106
#LINK_EX=104

# Just in case things go wrong (ie no keyup signal is detected, flipper held down for a long time), what is the maximum time a flipper solenoid / contactor can be in in milliseconds
MAX_FLIPPER_ON=5000

# Turn on the attempt to make a full connection to Future Pinball when it is detected as running
FP_ATTEMPT_LINK=1

# Set the key code for the keys being used as Left and Right flippers
# Used for the default fll back if a full link cannot be established
# Left Shift = A0, Right Shift = A1
L_FLIPPER_KEY=A0
R_FLIPPER_KEY=A1

# The device / port for the left and right flippers, set to output device 1, left flipper solenoid on port 1 and right flipper solenoid on port 2
L_FLIPPER_OUTPUT=150
R_FLIPPER_OUTPUT=153

# Link_[DeviceNo.][Port]
LINK_ST=162
LINK_LB=165
LINK_FR=165


# -LIGHTING SECTION--------------------------------------------------------------------------------------------------------------

######### RGB UNDERCAB LIGHTING #########

# RGB Undercabinet Colour Change. RAINBOW = cycle through the colours. RANDOM = use random colour order. RAINBOW_ALTERNATE = hat picks Colour# and Colour#+1 then applies them to alternate RGB devices
#RGB_STYLE=RAINBOW_ALTERNATE
#RGB_STYLE=RANDOM

# What changes the RGB undercabinet colour. TIME = set time period. FLIPPER = flipper press after the RGB_TRIGGER minimum time (to stop rapid colour changes)
#RGB_TRIGGER=TIME
#RGB_TRIGGER=FLIPPER

# The minimum time for change between flipper flips, 1000mS or 1 second
#RGB_MIN_TIME=8000

# The Device and "RED" port for RGB undercabinet lighting
#RGB_OUTPUT=213,216
#RGB_OUTPUT=213,216,156,159
#RGB_OUTPUT=213,216,150,153,156,159
#RGB_OUTPUT=156,159

######### BUTTONS #########

# These are the default and "fallback" type of functions that are used when DOFLinx is made active, but no link to Future Pinball or FX3 is established. 
# Turn on Button lights when DOFLinx is activated (such as EXIT button) - but "mono" Buttons only (no RGB)
BUTTONS_ON=165

######### RGB BUTTONS #########

#Magnasave/Nudging buttons
#56 Rechts
#59 Links
#LINK_LF=156
#LINK_RF=159
#KEY_TO_COLOUR=A0,156,Red,A1,159,Red,A3,156,Red,A4,159,Red

#LINK_P2=218 then use BUTTONS_ON_COLOUR=BUT_P2,Blue
#LINK_P2=156
#BUTTONS_ON_COLOUR=BUT_P2,Blue
#BUTTONS_ON_COLOUR=156,Blue

#BUTTONS_ON_COLOUR=156,Blue,159,Blue
#BUTTONS_ON_COLOUR=156,Blue,159,Blue,150,Yellow,153,Yellow
#BUTTONS_ON_COLOUR=156,Blue,159,Blue,150,153
#BUTTONS_ON_COLOUR=156,Blue,159,Blue,150,Gold,153,Gold
#BUTTONS_ON_COLOUR=150,Red,153,Red,156,Yellow_green,159,Yellow_green

#Nudging (ctrl) makes Magnasave/Nudging RGB Button-Color = red
#KEY_TO_COLOUR_TIMER=A2,156,Red,1500,A3,159,Red,1500



# -Testing Area--------------------------------------------------------------------------------------------------------------
######## KEY TO OUTPUT / COLOUR, etc examples ########

# Make the "4" key (key code 34) to pulse controller/output 119

#KEY_TO_OUTPUT=34,119

# Set the left and right control keys to turn on a specific colour (red) for RGB.
# Example, when nudge keys are used it all goes red.
#KEY_TO_COLOUR=A2,109,Red,A3,109,Red

#Links
#LF = Left flipper
#RF = Right flipper
#LS = Left slingshot
#RS= Right slingshot
#ML = Mid field left solenoid
#MC = Mid field centre solenoid
#MR = Mid field right solenoid
#BL = Back left solenoid
#BC = Back centre solenoid
#BR = Back right solenoid
#SH = Shaker motor
#GR = Gear motor
#KN = Knocker
#FN = Fan
#BE = Bell
#C1 = Chime 1 (high note)
#C2 = Chime 2 (mid note)
#C3 = Chime 3 (low note)

# Devices
#FLOL = Flasher outer left
#FLIL = Flasher Inner Left
#FLCN = Flasher Centre
#FLOR = Flasher Outer Right
#FLIR = Flasher Inner Right

# The other 8 solenoid of a 10 solenoid setup using ports 4 to 11 inclusive
#LINK_LS=104,50,500,255
#LINK_RS=105,50,500,255
#LINK_ML=106,50,500,255
#LINK_MC=107,50,500,255
#LINK_MR=108,50,500,255
#LINK_BL=109,50,500,255
#LINK_BC=110,50,500,255
#LINK_BR=111,50,500,255

# Ports for the shaker, gear motor, knocker, beacon and strobe using ports 12 - 16 inclusive
#LINK_SH=112,1000,5000,255
#LINK_GR=113,750,10000,255
#LINK_KN=114,120,500,255
#LINK_BK=115,FLASH,200,255
#LINK_SR=116,ON,0,255

# Ports for the lights inside the various buttons being Start, Extra Ball, Coin, Exit, Launch Ball and Fire for ports 17 to 22 inclusive

#ST = Start button
#EB = Extra Ball button
#EX = Exit button
#CN = Coin button
#LB = Launch Ball button
#FR = Fire Button
#P1 = Player 1
#P2 = Player 2
#PS = Pause

# -End of Testing Area--------------------------------------------------------------------------------------------------------------



######## GAME COLOURS ########
# Game specific colours in the format of a CSV of Game Name,Colour#1,Colour#2 - colours as they appear in your directoutputconfig
# Thanks to Vizzini here is a great starting list for Pinball FX2
# Extended for FX3 games by DDH69

#GAME_COLOUR=AlienIsolationPinball,Medium_Blue,Lime,Dodger_Blue,Lime_Green
GAME_COLOUR=AlienIsolationPinball,Gold
GAME_COLOUR=AlienvsPredatorPinball,Medium_Blue,Lime_Green,Dodger_Blue,Yellow_Green
GAME_COLOUR=AliensPinball,Medium_Blue,Dark_Golden_Rod,Dodger_Blue
GAME_COLOUR=AmericanDadPinball,Medium_Blue,Lime_Green,Dodger_Blue,Yellow_Green
GAME_COLOUR=ArcherPinball,Medium_Blue,Yellow,Dodger_Blue,Blue_Violet
GAME_COLOUR=Biolab,Dark_Red,Lime,Blue,Cyan,Blue_Violet,Yellow
GAME_COLOUR=Blade,Blue,Blue_Violet,Salmon
GAME_COLOUR=BobaFett,Lime,Golden_Rod,Blue_Violet
GAME_COLOUR=BobsBurgersPinball,Medium_Blue,Lime_Green,Dark_Red,Dodger_Blue,Yellow_Green
GAME_COLOUR=CaptainAmerica,Blue,Dark_Red,Dodger_Blue,Gold
GAME_COLOUR=CastleStorm,Blue,Gold,Lime,Dodger_Blue,Orange,Lime_Green
GAME_COLOUR=CivilWar,Blue,Dark_Red,Dodger_Blue,Light_Salmon
GAME_COLOUR=Deadpool,Dark_Red,Blue,Medium_slate_blue,Dodger_Blue
GAME_COLOUR=DoomPinball,Yellow,Silver,Gray,Dark_Orange,Dim_Gray,Orange_Red,Peru,Crimson
GAME_COLOUR=DoctorStrange,Dark_Red,Blue,Gold,Lime_Green,Dark_Violet,Orange,Dodger_Blue,Lime,Medium_Slate_Blue
GAME_COLOUR=EarthDefense,Dark_Red,Blue,Gold,Dark_Violet,Orange,Dodger_Blue,Lime
GAME_COLOUR=ElDorado,Orange,Lime_Green,Yellow,Coral,Lime,Yellow_Green,Cyan
GAME_COLOUR=EpicQuest,Lime_Green,Dodger_Blue,Yellow_Green,Cyan
GAME_COLOUR=Excalibur,Dark_Red,Blue,Lime,Dodger_Blue,Cyan
GAME_COLOUR=FalloutPinball,Crimson,White,Red,Brown,Light_Steel_Blue,Slate_Blue
GAME_COLOUR=FamilyGuyPinball,Dodger_Blue,Lime_Green,Salmon,Dark_Violet,Yellow_Green
GAME_COLOUR=FantasticFour,Blue,Yellow,Dodger_Blue,Orange_Red
GAME_COLOUR=FearItself,Dark_Red,Blue,Yellow,Lime,Dark_Violet,Orange
GAME_COLOUR=GhostRider,Dodger_Blue,White,Yellow,Light_Salmon,Orange_Red
GAME_COLOUR=GuardiansoftheGalaxy,Dodger_Blue,Orange,Medium_Purple
GAME_COLOUR=IRONMAN,Blue,Dark_Red,Dodger_Blue,Gold
GAME_COLOUR=Mars,Blue,Yellow,Deep_sky_blue,Gold
GAME_COLOUR=MarvelsAntMan,Medium_Blue,Dark_Red,Dodger_Blue
GAME_COLOUR=MarvelsAvengersAgeofUltron,Dark_Red,Dodger_Blue,Lime_Green,Light_Salmon,Cyan
GAME_COLOUR=MarvelsTheAvengers,Blue,Dark_Red,Dodger_Blue,Gold
GAME_COLOUR=MarvelsWomenofPowerAForce,Red,Lime,Gold,Slate_Blue,Tomato,Silver,Dark_Orchid,Spring_Green
GAME_COLOUR=MarvelsWomenofPowerChampions,Dodger_Blue,Yellow,Red,Gray,Golden_Rod,Crimson,Orange
GAME_COLOUR=MoonKnight,Dodger_Blue,Blue,Cyan,Royal_Blue
GAME_COLOUR=MsSplosionMan,Dodger_Blue,Pink,Medium_Blue,Purple,Royal_Blue
GAME_COLOUR=Paranormal,Lime_Green,Dodger_Blue,Yellow_Green
GAME_COLOUR=Pasha,Dark_Violet,Golden_Rod,Dodger_Blue
GAME_COLOUR=PlantsVSZombies,Lime_Green,Yellow_Green,Dodger_Blue
GAME_COLOUR=Portal,Dodger_Blue,Yellow_Green,Medium_Blue,Yellow
GAME_COLOUR=Rome,Dark_Red,Gold,Dodger_Blue,Light_Salmon,Yellow_Green,Orange
GAME_COLOUR=SecretsoftheDeep,Blue,Yellow,Dodger_Blue
GAME_COLOUR=Shaman,Dark_Red,Blue,Gold,Dark_Violet,Orange,Dodger_Blue,Lime
GAME_COLOUR=SorcerersLair,Blue,Blue_Violet,Dodger_Blue,Slate_Blue
GAME_COLOUR=SouthParkButtersVeryOwnPinballGame,Dark_Red,Blue,Gold,Dark_Violet,Orange,Dodger_Blue,Lime_Green
GAME_COLOUR=SouthParkSuperSweetPinball,Dark_Red,Lime,Blue,Gold,Dark_Violet,Orange,Dodger_Blue,Lime_Green,Yellow_Green
GAME_COLOUR=SpiderMan,Dark_Red,Lime,Blue,Gold,Dark_Violet,Orange
GAME_COLOUR=STARWARSDARTHVADER,Light_sky_blue,Dark_Red,Cyan
GAME_COLOUR=StarWarsEpisodeVTheEmpireStrikesBack,Medium_Blue,Yellow,Dark_Red,Dodger_Blue
GAME_COLOUR=StarWarsEpisodeVIReturnoftheJedi,Slate_Blue,Golden_Rod,Medium_Blue,Lime_Green,Dodger_Blue,Yellow
GAME_COLOUR=StarWarsPinballDroids,Medium_Blue,Yellow,Orange,Navy,Gold,Orange_Red
GAME_COLOUR=StarWarsPinballEpisodeIVANewHope,Cyan,Golden_Rod,Dodger_Blue,Yellow
GAME_COLOUR=StarWarsPinballHanSolo,Dodger_Blue,Royal_Blue,Antique_White
GAME_COLOUR=StarWarsPinballMastersoftheForce,Medium_Blue,Salmon,Dodger_Blue,Purple,Cyan,Dark_Red
GAME_COLOUR=StarWarsPinballMightoftheFirstOrder,Light_sky_blue,Dodger_Blue,Dark_Red,Cyan
GAME_COLOUR=StarWarsPinballStarWarsRebels,Medium_Blue,Yellow,Royal_Blue,Orange_Red,Purple,Lime_Green
GAME_COLOUR=StarWarsPinballTheForceAwakens,Dark_Red,Medium_Blue,Blue_Violet
GAME_COLOUR=StarWarsPinballRogueOne,Gray,Silver,Light_Sky_Blue,Teal,Beige,Bisque,Aqua_Marine,Slate_Gray,Dark_Orange
GAME_COLOUR=StarWarsStarfighterAssault,Medium_Blue,Dodger_Blue,Dark_Red
GAME_COLOUR=StarWarsTheCloneWars,Dark_Red,Pink,Medium_Blue,Medium_Turquoise,Lime,Lime_Green
GAME_COLOUR=SuperLeagueASRoma,Lime_Green,Orange,Lime,Yellow,Red
GAME_COLOUR=SuperLeagueZenStudiosFC,Lime_Green,Orange,Lime,Yellow,Red
GAME_COLOUR=SuperLeagueArsenalFC,Lime_Green,Orange,Lime,Yellow,Red
GAME_COLOUR=SuperLeagueLiverpoolFC,Lime_Green,Orange,Lime,Yellow,Red
GAME_COLOUR=SuperLeagueJuventus,Lime_Green,Orange,Lime,Yellow,Red
GAME_COLOUR=SuperLeagueACMilan,Lime_Green,Orange,Lime,Yellow,Red
GAME_COLOUR=SuperLeagueRealMadridCF,Lime_Green,Medium_Blue,Lime,Yellow,Red
GAME_COLOUR=SuperLeagueFCBarcelona,Slate_Blue,Lime_Green,Yellow,Blue_Violet,Lime,Red
GAME_COLOUR=Tesla,Lime_Green,Yellow_Green,Dodger_Blue,Golden_Rod
GAME_COLOUR=TheElderScrollsVSkyrimPinball,Light_Slate_Gray,Gold,Golden_Rod,Dark_Sea_Green,Peru,Tan
GAME_COLOUR=TheInfinity Gauntlet,Dark_Red,Blue,Gold,Dark_Violet,Orange,Dodger_Blue,Lime
GAME_COLOUR=TheWalkingDead,Lime_Green,Royal_Blue,Yellow_Green
GAME_COLOUR=Thor,Dark_Red,Blue,Gold,Dark_Violet,Orange,Dodger_Blue,Lime
GAME_COLOUR=V12,Dark_Red,Blue,Gold,Dark_Violet,Orange,Dodger_Blue
GAME_COLOUR=Venom,Dark_Red,Blue,Dark_Violet,Dodger_Blue
GAME_COLOUR=WildWestRampage,Yellow_Green,Dodger_Blue,Royal_Blue
GAME_COLOUR=Wolverine,Dark_Red,Medium_Blue,Yellow,Dark_Violet
GAME_COLOUR=WorldWarHulk,Lime_Green,Yellow_Green,Dodger_Blue,Lime,Yellow
GAME_COLOUR=XMen,Blue,Blue_Violet,Gold,Dodger_Blue,Slate_Blue,Orange
GAME_COLOUR=ET,Yellow,Amber,Sky_blue,Sienna,Aqua_marine,Slate_gray,Dark_olive_green
GAME_COLOUR=BacktotheFuture,Light_steel_blue,White,Crimson,Gray,Teal,Yellow,Dodger_blue
GAME_COLOUR=Jaws,Dark_turquoise,Gray,White,Salmon,Light_coral,Tan,Papaya_whip,Peru
GAME_COLOUR=SonofZeus,Dark_orange,Silver,Dark_salmon,Amber,Sienna,Light_steel_blue,Firebrick
GAME_COLOUR=AdventureLand,Red,Cyan,Yellow,White,Medium_orchid,Aqua,Dark_turquoise,Medium_purple
GAME_COLOUR=JurassicPark,Lawn_green,Amber,Yellow,Light_slate_gray,Cadet_blue,Black,Rosy_brown,Light_steel_blue,Medium_sea_green,Silver
GAME_COLOUR=JurassicWorld,Light_steel_blue,Silver,Tan,Forest_green,Gray,Cadet_blue,Yellow_green,Teal,Bisque
GAME_COLOUR=JurassicMayhem,Sandy_brown,Forest_green,Dark_green,Dark_olive_green,Dark_khaki,Peru,Tan,Navajo_white,Beige,Dark_golden_rod,Corn_silk
GAME_COLOUR=StarWarsLastJedi,Gold,Orange_Red,Aqua,Coral,Dark_Khaki,Light_Steel_Blue,Yellow_Green,Steel_Blue
GAME_COLOUR=StarWarsAhchToIsland,Peru,Tan,Light_Slate_Gray,Light_Golden_Rod,Turquoise,Deep_Sky_Blue,Spring_Green,Steel_Blue
GAME_COLOUR=WMSFishTales,Forest_green,Medium_spring_green,Pale_green,Aqua,Blue,Golden_Rod,Dark_turquoise,Gold,Deep_sky_blue,Sandy_brown,Green
GAME_COLOUR=WMSGetaway,Red,Steel_blue,Dim_gray,Navy,Dark_red,Teal
GAME_COLOUR=WMSJunkyard,Amber,Lawn_green,Burly_wood,Orange,Peru,Dark_turquoise
GAME_COLOUR=WMSMedievalMadness,Yellow,Amber,Rosy_brown,Firebrick,Forest_green,Gray,Dark_salmon,Dark_orange
GAME_COLOUR=WMSAFM,White,Red,Lime,Amber,Sea_green,Forest_green,Turquoise,Corn_silk
GAME_COLOUR=WMSBlackRose,Khaki,Sky_blue,Orange_red,Gold,Aqua_marine,Tomato,Yellow_green
GAME_COLOUR=WMSPartyZone,Lime,Blue_violet,Orange,Purple,Aqua,Red,Medium_blue,Amber,Yellow,Sandy_brown,Deep_pink
GAME_COLOUR=StarWarsSolo,Burly_Wood,Medium_Sea_Green,Light_Salmon,Silver,Golden_Rod,Dark_Turquoise
GAME_COLOUR=StarWarsCalrissianChronicles,Yellow,Silver,Light_Blue,Gold,White,Amber,Dark_Salmon,Navajo_White
GAME_COLOUR=StarWarsBattleOfMimban,Coral,Gray,Dark_Orange,Salmon,Slate_Gray,Light_Steel_Blue,Peru,Tan
GAME_COLOUR=BallySafeCracker,Orange,Gold,Yellow,Orange_Red,Turquoise,Antique_White,Dim_Gray,Golden_Rod,Crimson
GAME_COLOUR=BallyTheatreOfMagic,Gold,Medium_Slate_Blue,Tomato,Light_Yellow,Plum,Orchid,Golden_Rod,Crimson,Silver
GAME_COLOUR=BallyTheChampionPub,Forest_Green,Gold,Orange_Red,Dark_Blue,Green,Red,Light_Green
GAME_COLOUR=WMSHurricane,Gray,Lawn_Green,Slate_Gray,Dark_Orange,Dark_Blue,Medium_Blue,Cyan,Orange_Red,Papaya_Whip
GAME_COLOUR=WMSRedAndTedRoadShow,Yellow,Orange,Orange_Red,Forest_Green,Yellow_Green,Blue,Navy,Magenta,White
GAME_COLOUR=WMSWhiteWater,Peru,Blue,Royal_Blue,Light_Steel_Blue,Sienna,Aqua,Turquoise,Yellow,Beige
GAME_COLOUR=WMSMonsterBash,Lime,Amber,Dark_Turquoise,Sky_Blue,Lawn_Green,Orchid,Deep_Pink,Thistle,Light_Sky_Blue
GAME_COLOUR=BallyCreatureBlackLagoon,Light_Pink,Green_Yellow,Medium_Sea_Green,Silver,Steel_Blue,Forest_Green,Golden_Rod,Light_Cyan,Orange_Red,Lawn_Green
GAME_COLOUR=WMSTalesoftheArabianNights,Red,Chart_Reuse,Dark_Turquoise,Gold,Silver,Orange,Medium_Violet_Red,Aqua
GAME_COLOUR=WMSCirqusVoltaire,Lime,Yellow,Blue,Red,Orange,Dark_Violet,Deep_Pink,Orchid,Lawn_Green,Gold
GAME_COLOUR=WMSNoGoodGofers,Forest_Green,Peru,Blue,Turquoise,Orange,White,Green_Yellow,Golden_Rod,Sienna

PUPplayer

Pinup Player

Der Pinup Player ist Teil des PinUP Systems, welches auch ein weiteres Frontend namens Pinup Popper beinhaltet.

Ich nutze nur den Pinup Player um sogenannte PuP-Packs (Pinup Player Packs) zu laden…. in Verbindung mit Visual Pinball X sind das dann z.B. Videos & Sounds die auf DMD oder Backglass im Spiel angezeigt werden, bei Pinball FX3 nutze ich das hauptsächlich für Surround-Sound-Feedback.

Pinup Player: Install Guide & Download

Ich empfehle den folgenden Pfad: (C:\PinUPSystem\)

  • Installation
  • Einrichtung der Monitore

Da ich ja ein Hochformat-Bildschirmsetup habe, und auch PinballY als Frontend nutze…. ist bei mir relativ wenig eingestellt (siehe INI).

Ihr könnt nun einfach im Ordner „C:\PinUPSystem\PinUPPlayer\PUPVideos“ für:

  • Visual Pinball X die entsprechend PUP Packs (gleiche Benennung wie der ROM Name) ablegen
  • Pinball FX3 die entsprechenden SSF Sounds (z.B. aus meinem fR33Stylers-Pinball-FX3-SSF-PUP-Pack) ablegen

Alternativ auch mit dem PUP Pack Editor noch anpassen.

VPIN-PUP-Player

PUP-Player


[INFO]
ScreenXPos=0
ScreenYPos=0
ScreenWidth=1920
ScreenHeight=1080
volume=100
hidestopped=3
AspectWide=0
AspectHigh=0
fitToWindow=1
ScreenRotation=0
DebugMode=0
VideoDriver=4
FirstRun=0
[INFO1]
ScreenXPos=-7
ScreenYPos=-937
ScreenWidth=1290
ScreenHeight=360
volume=100
hidestopped=3
AspectWide=0
AspectHigh=0
fitToWindow=1
ScreenRotation=0
DebugMode=0
VideoDriver=0
FirstRun=0
[INFO2]
ScreenXPos=-395
ScreenYPos=-2112
ScreenWidth=1920
ScreenHeight=1080
volume=100
hidestopped=0
AspectWide=0
AspectHigh=0
fitToWindow=1
ScreenRotation=0
DebugMode=0
VideoDriver=0
FirstRun=0
[INFO3]
ScreenXPos=0
ScreenYPos=0
ScreenWidth=1080
ScreenHeight=1920
volume=100
hidestopped=3
AspectWide=0
AspectHigh=0
fitToWindow=1
ScreenRotation=0
DebugMode=0
VideoDriver=0
FirstRun=0
[INFO4]
ScreenXPos=0
ScreenYPos=0
ScreenWidth=1080
ScreenHeight=1100
volume=100
hidestopped=2
AspectWide=0
AspectHigh=0
fitToWindow=1
ScreenRotation=0
DebugMode=0
VideoDriver=0
FirstRun=0
[INFO5]
ScreenXPos=50
ScreenYPos=57
ScreenWidth=800
ScreenHeight=600
volume=100
hidestopped=3
AspectWide=0
AspectHigh=0
fitToWindow=1
ScreenRotation=0
DebugMode=0
VideoDriver=0
FirstRun=0
[INFO6]
ScreenXPos=60
ScreenYPos=67
ScreenWidth=800
ScreenHeight=600
volume=100
hidestopped=3
AspectWide=0
AspectHigh=0
fitToWindow=1
ScreenRotation=0
DebugMode=0
VideoDriver=0
FirstRun=0
[INFO7]
ScreenXPos=-395
ScreenYPos=-2112
ScreenWidth=1936
ScreenHeight=1096
volume=100
hidestopped=0
AspectWide=0
AspectHigh=0
fitToWindow=1
ScreenRotation=0
DebugMode=0
VideoDriver=0
FirstRun=0
[INFO8]
ScreenXPos=80
ScreenYPos=87
ScreenWidth=800
ScreenHeight=600
volume=100
hidestopped=3
AspectWide=0
AspectHigh=0
fitToWindow=1
ScreenRotation=0
DebugMode=0
VideoDriver=0
FirstRun=0
[INFO9]
ScreenXPos=90
ScreenYPos=97
ScreenWidth=800
ScreenHeight=600
volume=100
hidestopped=3
AspectWide=0
AspectHigh=0
fitToWindow=1
ScreenRotation=0
DebugMode=0
VideoDriver=0
FirstRun=0
[INFO10]
ScreenXPos=100
ScreenYPos=107
ScreenWidth=800
ScreenHeight=600
volume=100
hidestopped=3
AspectWide=0
AspectHigh=0
fitToWindow=1
ScreenRotation=0
DebugMode=0
VideoDriver=0
FirstRun=0

fR33Styler´s Pinball FX3 SSF PUP Pack

fR33Styler´s Pinball FX3 SSF PUP Pack
fR33Styler´s Pinball FX3 SSF PUP Pack

Hier findet Ihr zum Download meinen SSF (Surrond Sound Feedback) Pinup Player Sound Pack für Pinball FX3 und DOFLinx.

Einfach entpacken nach: C:\PinUPSystem\PinUPPlayer\PUPVideos\

Viel Spaß damit.

Es empfiehlt sich die Lautstärke der Spielmechanik in Pinball FX3 ein bisschen runter zu drehen… (siehe PinballFX3).. aber am besten „spielen und probieren“.

SSF_PUP-Pack

PUP-Pack

Weitere Tools

Set DMD

SetDMD ist ein Werkzeug mit dem Ihr Eure DMD-Position und ein paar weitere Parameter im DMD für alle installierten ROMs im System auf einmal einstellen könnt.

Link: pinballbulbs.com

Set DMD

X360ce

X360ce ist sehr mächtig, aber ich nutze es um mit meinem Pinscape Controller und dem analogen Plunger (Poti) in Pinball FX3 den Plunger sowie das „nudging“ zu steuern.

Pinball FX3 ist ja ein bisschen ‚Arcade-lastig“… somit kann man den Plunger & Nudge per Joystick bedienen (z.B. auf X-Box/PC…)… X360ce ist hierbei die Brücke und macht dies mit dem Pinscape möglich.

  • x360ce.exe in C:\Steam\steamapps\common\Pinball FX3\ kopieren
  • ausführen
  • einstellen
    • Details siehe Bild rechts, wichtig sind auch die „Regler & Einstellungen“ auf den Bildern
  • linker Stick: Y- & X-Achse testen
  • rechter Stick: Y-Achse testen
  • speichern

Somit sollte eine „xinput1_3.dll“ generiert werden… dann noch in Pinball FX3 in den Einstellungen unter Steuerung kurz prüfen ob beim Controller das auch so passt.

Als „tunning“ kann man noch in der generierten Ini-Datei die beiden Werte (siehe Bilder) auf -195 anpassen (oder jeder Wert dazwischen natürlich auch)… somit verändert sich der Nudge-Effekt.

Link: github.com/x360ce

pbfx2dotmatrix

pbfx2dotmatrix ist ein Werkzeug mit dem Ihr Eure DMD-Pixelposition und DMD-Pixelgröße sehr einfach und bequem herausfinden könnt. Hilfreich für sämtliche INI-Dateien und Einstellungen…. einfach das Fenster da hin positionieren wo es hin soll und so groß ziehen, wie es sein soll… die Pixelwerte ablesen… und fertig.

Link: pinballbulbs.com

VPIN pbfx2dotmatrix

pbfx2dotmatrix

PINvol

PinVol ist ein Open-Source-Programm, das die Steuerung der Audiolautstärke bei Flippertischen anpasst um Lautstärkenunterschiede anzugleichen. Vom Prinzip wird für „jeden Tisch“ die Lautstärke gespeichert (individuell einstellbar) und beim spielen des Tisches geladen.

Superhilfreich um die unterschiedlichen Lautstärken von alten/neuen Tischen… Soundpacks/ROMs usw. anzugleichen.

Link: mjrnet.org

PinVol

PinballY (Frontend)

PinballY ist ein Spielbrowser und Startprogramm für den VPIN im Arcade-Look. Ich bediene den kompletten Flipper damit angefangen von der Übersicht, über Videos bis hin zum Spiel starten und wieder beenden.

 

PinballY hat eine ausgezeichnete Dokumentation und ist komplett „open-source“… den Download findet ihr hier: http://mjrnet.org/pinscape/PinballY.php

Auch hier empfehle ich:

Installation auf „C:\PinballY

Ein paar der Einstellungen seht Ihr in der Galerie. Im Ordner „Scripts“ kann man noch eine „main.js“ mit eigenen Java-Scripten ablegen… den Inhalt, welche ich nutze findet ihr im Akkordeon.

Erweiterungen:

Author: MJR – Link

Code:




//-----------------------------------------------------------------------------------------------//
// Check for a new version of PinballY on each launch (default is false to limit the load on PinballY's servers)
let checkPinballYUpdate = false;



// Check for new release of PinballY (taken from http://mjrnet.org/pinscape/downloads/PinballY/Help/UpdateCheckExample.html)
if (checkPinballYUpdate) {
let request = new HttpRequest();
request.open("GET", "http://mjrnet.org/pinscape/downloads/PinballY/VersionHistory.txt", true);
request.send().then(reply =>
{
if (/^(\d\d)-(\d\d)-(\d\d\d\d) \(\d+\.\d+\.\d+ .+\)$/mi.test(reply))
{
let mm = +RegExp.$1 - 1, dd = +RegExp.$2, yyyy = +RegExp.$3;
let onlineDate = new Date(Date.UTC(yyyy, mm, dd));
if (onlineDate > systemInfo.version.buildDate)
mainWindow.statusLines.upper.add("A new version of PinballY is available!");
}
}).catch(error => {
logfile.log(
"The Javascript version update checker ran into a problem!\nJavascript error: %s\nStack:\n%s",
error.message, error.stack);
});
}



// For debugging purposes
function getMethods(obj) {
var result = [];
for (var id in obj) {
try {
result.push(id + ": " + obj[id].toString() + " / frozen=" + Object.isFrozen(obj[id]) + " / sealed=" + Object.isSealed(obj[id]) + " / type=" + typeof(obj[id]));
} catch (err) {
result.push(id + ": inaccessible");
}
}
return result;
}



Number.prototype.toHHMMSS = function () {
var sec_num = this;
var hours = Math.floor(sec_num / 3600);
var minutes = Math.floor((sec_num - (hours * 3600)) / 60);
var seconds = sec_num - (hours * 3600) - (minutes * 60);
if (hours < 10) {hours = "0"+hours;}
if (minutes < 10) {minutes = "0"+minutes;}
if (seconds < 10) {seconds = "0"+seconds;}
return hours+':'+minutes+':'+seconds;
}



Number.prototype.toDDHHMMSS = function () {
var sec_num = this;
var days = Math.floor(sec_num / 86400);
var hours = Math.floor((sec_num - (days * 86400))/ 3600);
var minutes = Math.floor((sec_num - (days * 86400) - (hours * 3600)) / 60);
var seconds = sec_num - (days * 86400) - (hours * 3600) - (minutes * 60);
if (hours < 10) {hours = "0"+hours;}
if (minutes < 10) {minutes = "0"+minutes;}
if (seconds < 10) {seconds = "0"+seconds;}
return days+"d "+hours+':'+minutes+':'+seconds;
}

Author: vbousquet – Link

Animation und Erweiterung: fR33Styler

Details: Es wird in PinballY im DMD der Tischname, Logo-Animation, die Spielstatistik, HighScore angezeigt passend zum Tisch in Kombination mit flexdmd und folgendem Eintrag in der DMDdevices.ini:

[PinballY]
virtualdmd left = 358
virtualdmd top = -369
virtualdmd width = 703
virtualdmd height = 337

Code (verändert) siehe auch download der main.js bezügl. Unterordner & Logo-Animationen (fR33Styler):


//-----------------------------------------------------------------------------------------------//
// Handle DMD updates
let dmd = null;
let udmd = null;
let hiscores = {};
let info = null;
let shownInfo = null;
let loopCount = 0;
let fso = createAutomationObject("Scripting.FileSystemObject");
let updater;
let manufacturers = {
	"Aliens vs Pinball": ["./Scripts/dmds/manufacturers/Aliens vs Pinball.gif"],
	"Alvin G.": ["./Scripts/dmds/manufacturers/Alvin G..gif"],
	"Bally": ["./Scripts/dmds/manufacturers/bally.gif"],
	"Bethesda Pinball": ["./Scripts/dmds/manufacturers/Bethesda Pinball.gif"],
	"Capcom": ["./Scripts/dmds/manufacturers/capcom.gif"],
	"Data East": ["./Scripts/dmds/manufacturers/dataeast-1.gif", "./Scripts/dmds/manufacturers/dataeast-2.gif"],
	"Foxnext Games": ["./Scripts/dmds/manufacturers/Foxnext Games.gif"],
	"Gottlieb": ["./Scripts/dmds/manufacturers/gottlieb.gif"],
	"Jurassic Pinball": ["./Scripts/dmds/manufacturers/Jurassic Pinball.gif"],
	"Marvel": ["./Scripts/dmds/manufacturers/Marvel.gif"],
	"Midway": ["./Scripts/dmds/manufacturers/bally.gif"],
	"Peyper": ["./Scripts/dmds/manufacturers/peyper.gif"],	
	"Premier": ["./Scripts/dmds/manufacturers/premier.gif"],
	"Rowamet": ["./Scripts/dmds/manufacturers/Rowamet.gif"],	
	"Sega": ["./Scripts/dmds/manufacturers/sega.gif"],
	"Spooky": ["./Scripts/dmds/manufacturers/Spooky.gif"],
	"Star Wars Pinball": ["./Scripts/dmds/manufacturers/Star Wars Pinball.gif"],
	"Stern": ["./Scripts/dmds/manufacturers/stern.gif"],
	"Taito": ["./Scripts/dmds/manufacturers/Taito.gif"],
	"The Walking Dead": ["./Scripts/dmds/manufacturers/The Walking Dead.gif"],
	"Universal Pinball": ["./Scripts/dmds/manufacturers/Universal Pinball.gif"],
	"Williams": ["./Scripts/dmds/manufacturers/williams.gif"],
	"WilliamsFX3Pinball": ["./Scripts/dmds/manufacturers/williams.gif"],
	"VPX": ["./Scripts/dmds/manufacturers/VPX.gif"],
	"VALVe": ["./Scripts/dmds/manufacturers/VALVe.gif"],
	"Zaccaria": ["./Scripts/dmds/manufacturers/Zaccaria.gif"],
	"Zen Studios": ["./Scripts/dmds/manufacturers/Zen Studios.gif"]
}
// logfile.log(getMethods(dmd).join("\n"));
function TestMarshalling() {
	dmd.LockRenderThread();
	let video = dmd.NewVideo("Manufacturer", "./Scripts/dmds/manufacturers/bally.gif");
	logfile.log(getMethods(video).join("\n"));
	// This will fail due to a marshalling problem
	dmd.Stage.AddActor(video);
	dmd.UnlockRenderThread();
}
function UpdateDMD() {
	if (updater !== undefined) clearTimeout(updater);
	updater = undefined;

	if (dmd == null) {
		dmd = createAutomationObject("FlexDMD.FlexDMD");
		dmd.GameName = "PinballY";
		dmd.RenderMode = 2; // 0 = Gray 4 shades, 1 = Gray 16 shades, 2 = Full color
//		dmd.Size = false;
		dmd.Width = 128; // normal:128 - high-res: 896
		dmd.Height = 32; // normal:32 - high-res: 224
		dmd.Show = true;
		dmd.Run = true;
		udmd = dmd.NewUltraDMD();
	}
	
	if (dmd.Run == false) return;

	if (info == null) return;

	if (udmd.IsRendering() && shownInfo != null && info.id == shownInfo.id) {
		// Add a timeout later for when the render queue will be finished
		updater = setTimeout(UpdateDMD, 1000);
		return;
	}
	
	dmd.LockRenderThread();

	if (shownInfo == null || info.id != shownInfo.id) {
		loopCount = 0;
		shownInfo = info;
	} else {
		loopCount++;
	}			

	udmd.CancelRendering();

	if (loopCount == 0) {
		/*let rom = info.resolveROM();
		logfile.log("> Update DMD for:");
		logfile.log("> rom: '".concat(rom.vpmRom, "'"));
		logfile.log("> manufacturer:", info.manufacturer);
		logfile.log("> title:", info.title);
		logfile.log("> year:", info.year);
		logfile.log("> Table type: ", info.tableType);
		logfile.log("> Highscore style: ", info.highScoreStyle);
		if (rom.vpmRom == null) {
			dmd.GameName = "";
		} else {
			dmd.GameName = rom.vpmRom.toString();
		}*/
	}

	
	// Title
	var hasTitle = false;
	if (info.mediaName != null) {
		var extensions = [".gif", ".avi", ".png"];
		for (var i = 0; i < extensions.length; i++) { if (fso.FileExists("./Scripts/dmds/titles/" + info.mediaName + extensions[i])) { queueVideo("./Scripts/dmds/titles/" + info.mediaName + extensions[i], 0, 8, transitionMargin); hasTitle = true; break; } } } if (!hasTitle) { var name = info.title.trim(); var subname = ""; if (name.indexOf('(') != -1) { var sep = info.title.indexOf('('); name = info.title.slice(0, sep - 1).trim(); } if (name.length >= 16) {
			var split = 16;
			for (var i = 15; i > 0; i--) {
				if (name.charCodeAt(i) == 32) {
					subname = name.slice(i).trim();
					name = name.slice(0, i).trim();
					break;
				}
			}
		}
		udmd.DisplayScene00("FlexDMD.Resources.dmds.black.png", name, 15, subname, 15, 0, 5000, 8);
	}

	// Manufacturer
	/*
	let transitionMargin = (20 * 1000) / 60;
	if (info.manufacturer in manufacturers) {
		var medias = manufacturers[info.manufacturer];
		var media = medias[Math.floor(Math.random() * medias.length)];
		queueVideo(media, 10, 8, transitionMargin);
	} else if (info.manufacturer !== undefined) {
		udmd.DisplayScene00("FlexDMD.Resources.dmds.black.png", info.manufacturer, 15, "", 15, 10, 3000, 8);
	}
	*/
	
	

// Manufacturer (incl. Workarround for Pinball FX3 Williams Logo)
    let transitionMargin = (20 * 1000) / 60;
    //kleine Workaround -Erweiterung für Williams "TM" Pinball Problem aus FX3
    let manufacturer_temp = info.manufacturer;
    
    // Wenn Manufacturer mit Williams anfängt, aber mehr als 8 Zeichen hat
    if ((manufacturer_temp.substr(0,8) == "Williams") && (manufacturer_temp.length > 8)){
        manufacturer_temp = "WilliamsFX3Pinball";
    }
    if (manufacturer_temp in manufacturers) {
        var medias = manufacturers[manufacturer_temp];
        var media = medias[Math.floor(Math.random() * medias.length)];
        queueVideo(media, 10, 8, transitionMargin);
    } else if (info.manufacturer !== undefined) {
        udmd.DisplayScene00("FlexDMD.Resources.dmds.black.png", info.manufacturer, 15, "", 15, 10, 3000, 8);
    }


	
	
	// Stats
	if (info.rating >= 0)
		udmd.DisplayScene00("FlexDMD.Resources.dmds.black.png", "Played " + info.playCount + " Rating " + info.rating, 15, "Play time: " + info.playTime.toHHMMSS(), 15, 10, 3000, 8);
	else
		udmd.DisplayScene00("FlexDMD.Resources.dmds.black.png", "Played " + info.playCount + " times", 15, "Playtime " + info.playTime.toHHMMSS(), 15, 10, 3000, 8);

	// Insert Coin
	if (((loopCount + 0) & 1) == 0) {
		udmd.DisplayScene00("./Scripts/dmds/misc/insert-coin_c.gif", "", 15, "", 15, 10, 3000, 8);
	}

	// Drink'n drive
	if (((loopCount + 0) & 1) == 0) {
		udmd.DisplayScene00("./Scripts/dmds/misc/drink-n-drive_c.gif", "", 15, "", 15, 10, 3000, 8);
	}

	// Global stats (every 4 loops)
	if (((loopCount + 1) & 3) == 0) {
		var totalCount = 0;
		var totalTime = 0;
		var nGames = gameList.getGameCount();
		for (var i = 0; i < nGames; i++) {
			var inf = gameList.getGame(i);
			totalCount += inf.playCount;
			totalTime += inf.playTime;
		}
		udmd.DisplayScene00("FlexDMD.Resources.dmds.black.png", "Total play count:" , 15, "" + totalCount, 15, 10, 1500, 8);
		udmd.DisplayScene00("FlexDMD.Resources.dmds.black.png", "Total play time:" , 15, "" + totalTime.toDDHHMMSS(), 15, 10, 1500, 8);
	}
	
	// Highscores
	if (hiscores[info.id] != null) {
		udmd.ScrollingCredits("", hiscores[info.id].join("|"), 15, 14, 2800 + hiscores[info.id].length * 400, 14);
	}

	// Digital Stereo
	if (((loopCount + 0) & 1) == 0) {
		udmd.DisplayScene00("./Scripts/dmds/misc/digital-stereo_c.gif", "", 15, "", 15, 10, 3000, 8);
	}
	
	dmd.UnlockRenderThread();
	logfile.log("< Update DMD done"); // Add a timeout for when the queue will be finished updater = setTimeout(UpdateDMD, 10000); } gameList.on("gameselect", event => {
	logfile.log("> gameselect");
	info = event.game;
	UpdateDMD();
});

gameList.on("highscoresready", event => {
	logfile.log("> highscoresready");
	if (event.success && event.game != null) {
		logfile.log("> scores received");
		for (var i = 0; i < event.scores.length; i++) { event.scores[i] = event.scores[i].replace(/\u00FF/g, ','); } hiscores[event.game.id] = event.scores; if (shownInfo != null && event.game.id == shownInfo.id) { udmd.ScrollingCredits("", hiscores[shownInfo.id].join("|"), 15, 14, 2800 + hiscores[shownInfo.id].length * 400, 14); } } }); mainWindow.on("prelaunch", event => {
	logfile.log("> launch");
	if (dmd != null) {
		udmd.CancelRendering();
		dmd.Run = false;
	}
});

mainWindow.on("postlaunch", event => {
	logfile.log("> postlaunch");
	if (dmd != null) dmd.Run = true;
	UpdateDMD();
});


Author: fR33Styler

Code:


//-----------------------------------------------------------------------------------------------//
// Show image overlay
mainWindow.on("launchoverlayshow", ev => {
let animation = gameList.resolveMedia("Images", "launch-image.jpg");
mainWindow.showWheel(false);
mainWindow.setUnderlay("");
mainWindow.launchOverlay.bg.loadImage(animation);
ev.preventDefault();
});

Author: fR33Styler

Code:


// hide the animated overlay Video as soon as the game has finished loading
mainWindow.on("gamestarted", ev => {
mainWindow.launchOverlay.bg.clear(0xff404040);
mainWindow.showWheel(true);
});

Author: GSadventure – Link

Code: siehe Git-Hub.


//-----------------------------------------------------------------------------------------------//
// Choose a random game from current selection
import "start_random_table.js";

Author: fR33Styler

Code:




//-----------------------------------------------------------------------------------------------//
// Add Hotseat Modes to below Play on menu

// in the main menu, add Hotseat Modes after the
// Play command
let setPlayHotseatModeCommand = command.allocate("PlayHotseatMode");
mainWindow.on("menuopen", ev => {
if (ev.id == "main") {
// main menu - check the current game's system
let game = gameList.getWheelGame(0) || { };
let sys = game.system || { };
if (/pinball fx3\.exe$/i.test(sys.processName)) {
// it's FX3 - add the Hotseat Play Mode command
ev.addMenuItem({ after: command.PlayGame },
{ title: "Play Hotseat Mode", cmd: setPlayHotseatModeCommand });
}
}
});



// Show the mode selection menu when the Play Hotseat Mode command
// is used, and process the commands in that menu.
let Hotseat2ModeCommand = command.allocate("Hotseat2Mode");
let Hotseat3ModeCommand = command.allocate("Hotseat3Mode");
let Hotseat4ModeCommand = command.allocate("Hotseat4Mode");



mainWindow.on("command", ev => {
if (ev.id == setPlayHotseatModeCommand) {
let game = gameList.getWheelGame(0) || { };
let sys = game.system || { };
if (/pinball fx3\.exe$/i.test(sys.processName)) {
mainWindow.showMenu("custom.hotseatmode.fx3", [
{
title: "Hotseat: 2 Players",
cmd: Hotseat2ModeCommand,
},
{
title: "Hotseat: 3 Players",
cmd: Hotseat3ModeCommand,
},
{
title: "Hotseat: 4 Players",
cmd: Hotseat4ModeCommand,
},
{ cmd: -1 }, // separator
{ title: "Cancel", cmd: command.MenuReturn }
]);



// tell the system not to launch the game yet
ev.preventDefault();
}
}



else if (ev.id == command.Hotseat2Mode) {
let game = gameList.getWheelGame(0) || { };
let sys = game.system || { };
if (/pinball fx3\.exe$/i.test(sys.processName)) {
// figure out the hotseatmode options based on the current mode
// launch it with the hotseatmode 2 Players
mainWindow.playGame(game, {
overrides: {
params: "-applaunch 442120 -hotseat_2 -table_[TABLEFILEBASE]"
}
});
// skip the default action, since we did the launch here instead
ev.preventDefault();
}
}



else if (ev.id == command.Hotseat3Mode) {
let game = gameList.getWheelGame(0) || { };
let sys = game.system || { };
if (/pinball fx3\.exe$/i.test(sys.processName)) {
// figure out the hotseatmode options based on the current mode
// launch it with the hotseatmode 3 Players
mainWindow.playGame(game, {
overrides: {
params: "-applaunch 442120 -hotseat_3 -table_[TABLEFILEBASE]"
}
});
// skip the default action, since we did the launch here instead
ev.preventDefault();
}
}



else if (ev.id == command.Hotseat4Mode) {
let game = gameList.getWheelGame(0) || { };
let sys = game.system || { };
if (/pinball fx3\.exe$/i.test(sys.processName)) {
// figure out the hotseatmode options based on the current mode
// launch it with the hotseatmode 4 Players
mainWindow.playGame(game, {
overrides: {
params: "-applaunch 442120 -hotseat_4 -table_[TABLEFILEBASE]"
}
});
// skip the default action, since we did the launch here instead
ev.preventDefault();
}
}



});

Author: MJR » Link

Code:



// -------------------------------------------------------------------------------
// Global variable for keeping track of the current FX3 play
// mode. We'll use the strings "classic" and "new" to represent
// the modes. Initially, we'll restore the saved value from the
// settings file.
let currentFX3ModeKey = "custom.fx3.playMode";
let currentFX3Mode = optionSettings.get(currentFX3ModeKey, "classic");

// in the main menu, add our new Set Play Mode command after the
// Play command
let setPlayModeCommand = command.allocate("SetPlayMode");
mainWindow.on("menuopen", ev => {
if (ev.id == "main") {
// main menu - check the current game's system
let game = gameList.getWheelGame(0) || { };
let sys = game.system || { };
if (/pinball fx3\.exe$/i.test(sys.processName)) {
// it's FX3 - add the Set Play Mode command
ev.addMenuItem({ after: command.PlayHotseatMode },
{ title: "Set Play Mode", cmd: setPlayModeCommand });
}
}
});

//-----------------------------------------------------------------------------------------------//
// Show the mode selection menu when the Set Play Mode command
// is used, and process the commands in that menu.
let classicPhysicsModeCommand = command.allocate("ClassicPhysicsMode");
let newPhysicsModeCommand = command.allocate("NewPhysicsMode");
mainWindow.on("command", ev => {
if (ev.id == setPlayModeCommand) {
let game = gameList.getWheelGame(0) || { };
let sys = game.system || { };
if (/pinball fx3\.exe$/i.test(sys.processName)) {
mainWindow.showMenu("custom.playmode.fx3", [
{
title: "Classic Physics Mode",
cmd: classicPhysicsModeCommand,
radio: currentFX3Mode == "classic"
},
{
title: "New Physics Mode",
cmd: newPhysicsModeCommand,
radio: currentFX3Mode == "new"
},
{ cmd: -1 }, // separator
{ title: "Cancel", cmd: command.MenuReturn }
]);

// tell the system not to launch the game yet
ev.preventDefault();
}
}
else if (ev.id == classicPhysicsModeCommand) {
// set the new mode and save to the settings
optionSettings.set(currentFX3ModeKey, currentFX3Mode = "classic");
}
else if (ev.id == newPhysicsModeCommand) {
// set the new mode and save to the settings
optionSettings.set(currentFX3ModeKey, currentFX3Mode = "new");
}
else if (ev.id == command.PlayGame) {
let game = gameList.getWheelGame(0) || { };
let sys = game.system || { };
if (/pinball fx3\.exe$/i.test(sys.processName)) {
// figure out the extra options based on the current mode
let extra = "";
if (currentFX3Mode == "classic")
extra = "-class ";
else if (currentFX3Mode == "new")
extra = "";

// launch it with the extra options
mainWindow.playGame(game, {
overrides: { params: extra + sys.params }
});

// skip the default action, since we did the launch here instead
ev.preventDefault();
}
}
});

Das Frontend bietet viele tolle Möglichkeiten (angefangen von Filtermöglichkeiten bis hin zu Statistiken und Ratings etc.)… am besten Ihr startet (nach dem Einstellen) mal damit einen Tisch zu konfigurieren (eigentlich nur kurz benennen) und dann könnt Ihr schon die passenden Medien-Dateien (nächster Teil in der Dokumentation) zu ordnen…. und schon sieht das aus wie oben in meinem Video.

Backup

Hier noch ganz kurz meine Backup-Geschichte…

Ich löse das per Batch der wiederum über die „Aufgabensteuerung“ in WIN an jedem letzten Tag des Monats los läuft.

Ich kopiere mir das DELTA, der (für mich) relevanten Dateien auf eine zweite SSD Festplatte.


@echo off

ECHO Datensicherung wird gestartet...
ECHO .
ECHO ..
ECHO ...
ECHO ========================================================

ECHO === sichere Install ====================================
xcopy C:\_HDD-Install D:\_Backup\_HDD-Install /D /E /Y /I
ECHO =
ECHO ===== sichere _Backup ==================================
xcopy C:\_Backup D:\_Backup\_Backup /D /E /Y /I
ECHO =
ECHO ======= sichere Users (Roaming) ========================
xcopy C:\Users\VPIN\AppData\Roaming D:\_Backup\Users\VPIN\AppData\Roaming /D /E /Y /I
ECHO =
ECHO ========= sichere DirectOuptut =========================
xcopy C:\DirectOutput D:\_Backup\DirectOutput /D /E /Y /I
ECHO =
ECHO =========== sichere DOFConfigtoolClient ================
xcopy C:\DOFConfigtoolClient D:\_Backup\DOFConfigtoolClient /D /E /Y /I
ECHO =
ECHO ============= sichere Steam (Games) ====================
xcopy C:\Games\Steam\steamapps\common D:\_Backup\Games\Steam\steamapps\common /D /E /Y /I
ECHO =
ECHO =============== sichere PinAffinity64 ==================
xcopy C:\PinAffinity64 D:\_Backup\PinAffinity64 /D /E /Y /I
ECHO =
ECHO ================= sichere PinballY =====================
xcopy C:\PinballY D:\_Backup\PinballY /D /E /Y /I
ECHO =
ECHO =================== sichere PinSoundStudio =============
xcopy C:\PinSoundStudio D:\_Backup\PinSoundStudio /D /E /Y /I
ECHO =
ECHO ===================== sichere PinUPSystem ==============
xcopy C:\PinUPSystem D:\_Backup\PinUPSystem /D /E /Y /I
ECHO =
ECHO ======================= sichere PinVol =================
xcopy C:\PinVol D:\_Backup\PinVol /D /E /Y /I
ECHO =
ECHO ========================= sichere VPX ==================
xcopy C:\"Visual Pinball" D:\_Backup\"Visual Pinball" /D /E /Y /I

ECHO ...
ECHO ..
ECHO .
ECHO  ----- Dietle VPIN Datensicherung abgeschlossen! -----
ECHO ========================================================

pause

fR33Styler´s VPIN Frontend Media

So und zum Schluss gibt es noch ein Link zu „fR33Styler´s VPIN Frontend Media“… hier findet Ihr meine

  • Backglass-Videos
  • DMD-Videos
  • Playfield-Videos
  • Wheel-Images
  • Launch- & Table-Audios

welche ich in PinballY nutze… um durch die Flippertische zu navigieren.

fR33Styler´s VPIN Frontend Media

fR33Styler´s VPIN Frontend Media

 

Changelog

Ich hoffe der ein oder andere konnte ein bisschen was aus dieser Doku mitnehmen… bzw. ein wenig in das Thema Virtueller Flipper (VPIN) eintauchen… aber vor allem ihr hattet Spaß dabei.

Ralf Dietle