Skip to content

Theatre of Magic

Channel Name

This table was developed in the #tna channel (Total Nuclear Annihilation by Spooky Pinball / Scott Danesi). The extraction files use the "tna" abbreviation.

Total Nuclear Annihilation (TNA) is a Spooky Pinball original design by Scott Danesi that received an extensive VPW treatment with official asset licensing. Scott provided 70+ lightshow animation files, all music, sound effects, display animations, and art exports. The project features RGB GI lighting, PupDMD integration, Scorbit support, DOF/SSF implementation, and a unique cabinet design with parallel glass.

Build Notes

Official Asset Collaboration

Scott Danesi and Spooky Pinball granted permission to use official assets: music, art (lower than printable format), sound effects, and display animations. Requirements: credit "built with permission from Spooky Pinball and Scott Danesi (Danesi Designs, LLC)." Art protected by baked ambient occlusion making extraction unusable for printing. Music owned by Scott (not Spooky).

The process for getting official assets:

  1. Establish contact through streaming/social media
  2. Show existing VPX work to demonstrate quality
  3. Propose as advertising/promotion for the real table
  4. Address IP concerns (baked lighting protects art)
  5. Get written permission with attribution requirements
  6. Small controlled group for direct communication

Cabinet Geometry

TNA has a unique cabinet where playfield and glass are nearly parallel (same angle), similar to EM and early SS tables. Table slope is 6.5-7 degrees (most set to 6.5). Cabinet is rectangular box-shaped with no angles. For VR/FS POV, inclination should be at or near 0. Z-scale should always be 1.

NFozzy Rubber Band Setup

Rubber bands: visible but non-collidable, with an invisible wall in their location assigned the zcol_RubberBands physics material. This separates the visual "band" from the physical "post" portion. Posts use standard collidable primitives.

Fluorescent Plastic Protectors

Extra wall primitives under plastic walls with 2 materials and 2 images (surface and brighter side). Uses BL_Acrylic.mat material with DisableLighting = 1. Color options (green, blue, purple, off) are script-selectable. Especially impressive in VR.

Shadow Layer

Create shadows in Photoshop with each GI bulb on its own layer. Export as single image. In VPX, split into separate flashers for GI-reactive behavior. Flashers use opacity control tied to light state.

Flipper Type

TNA uses Williams WPC flipper mechs (not Stern). The table feels fast primarily because the main play area is essentially half a normal playfield. Most TNAs do not have overly aggressive slope. NFozzy: 90/later physics, flipper strength 2500-3250 range.

Ball Size

Correct ball size for 1-1/16" ball in VPX is 50. Looks more realistic at 51-52 but physics are made for 50.

Inlane Speed Limiter

Inlane speed limited to 10 units. Lane guide physics: elasticity 0.42 (NF plastic value), friction exaggerated to 0.9 to tame ball speed.

Version History

TNA reached 80+ beta versions and 28 RC versions. Key releases:

  • RC11: Reworked acrylic protectors (iaakki)
  • RC15: Super Secret Skillshot CCW loop check (gtxjoe)
  • RC25: Music subfolder check, tilt code refactor (apophis)
  • v2.0.1: Digital nudge tilt fix (apophis)
  • v2.1: Released on VPU
  • v2.1.2: Scorbit ForceAsynch for coop mode stutter fix (Arelyel)

RC Discipline

28 RC versions should not be repeated. RC should be feature-ready with only minor bug fixes. Major changes should trigger a version bump.

Scripting

Lightshow Animation System

Scott Danesi provided lightshow files with 2 seconds (64 frames) of RGB hex data per light. Converted to VBScript arrays using Thalamus's Perl script. The script walks all 119 RGB lights through 32 frames per second. A snapshot/restore mechanism saves light state before animation and restores after.

Perl converter: pastebin.com/X1HAjwn0

Fleep Audio + DOF Conflict

SoundFXDOF skips WAV playback if DOF hardware is detected. Fleep subs always play sound WAVs. For solenoid-related sounds, add DOF hardware checks before playing Fleep sounds. Rolling and positional sounds should play regardless.

Combined Fleep + NFozzy Flipper Collide

Sub LeftFlipper_Collide(parm)
    FlipperLeftHitParm = parm/10
    If FlipperLeftHitParm > 1 Then FlipperLeftHitParm = 1
    FlipperLeftHitParm = FlipperUpSoundLevel * FlipperLeftHitParm
    CheckLiveCatch Activeball, LeftFlipper, LFCount, parm
    RandomSoundRubberFlipper(parm)
End Sub

CheckLiveCatch must be called in flipper collide subs for NFozzy live catch to work.

PupDMD Page System

Only one label page visible at a time. Labels on page 1 reference other pages via JSON. SetPage calls switch the visible page. Game scoring typically on page 1. Videos/splashes overlay via SetPage.

Scorbit Integration

Scorbit must be disabled if UsePinup=0. Requires QRtoken.exe to be unblocked. Two QR codes: pairing (startup) and claiming (ball on plunger lane if paired). QR labels need proper page assignment in PupDMD JSON.

DOF Event Codes

Key TNA DOF codes:

125: Autoplunge
126-128: Shaker Intensity 1-3
129: Knocker
130: Beacon Motor
136-138: Drop Target Solenoids
145-149: Undercab colors (White/Blue/Red/Green/Purple)
176-179: Reactor states (Ready/Started/Critical/Destroyed)

Fleep SSF Shaker

Configuration constants:

  • ShakerIntensity: "Low"/"Normal"/"High" (different vibration sample sets)
  • ShakerSoundLevel: Volume level
  • ShakerMotor: Disabled / Sound only (SSF) / DOF only / Sound + DOF

SetLight RGB Color Definitions

Select Case col
    Case "red": RGB(128,0,0) / RGB(255,0,0)
    Case "orange": RGB(18,3,0) / RGB(255,64,0)
    Case "green": RGB(0,32,0) / RGB(0,200,0)
    Case "blue": RGB(0,0,128) / RGB(0,0,255)
End Select

First value = dim color, second = full color.

ExtractRGB Utility

Function ExtractRGB(color)
  Dim red, green, blue
  red = color And &HFF
  green = (color \ &H100) And &HFF
  blue = (color \ &H10000) And &HFF
  ExtractRGB = Array(red, green, blue)
End Function

Standard utility added to the VPW example table.

GI Bulb Primitive Color Changing

VPX 10.7.2+ enables color-changing primitive bulbs for GI. Each GI bulb is a separate "string" with individual RGB control.

Desktop Tilt Mechanism

Separate mechanical tilt from digital tilt. Digital nudge (keyboard) should accumulate warnings that decay. Mechanical tilt (accelerometer) should accumulate and NOT decay during a single ball.

Test Mode Debug Keys

Enable TestMode in script for debug keys: W=Reactor Ready, E=Started, R=Critical, T=Destroyed, Y=Loop shots, U=LeftScoop, 2=Drain blockers.

Gate Scatter Workaround

VPX gates lack a scatter value property. Custom code simulates ball deflection through gates.

vpmtimer.add is Broken

vpmtimer.add is broken and should never be used. It causes performance issues including videos not firing correctly.

3D & Art

Metal Wall Baking in Blender

Bake with default ambient only (no other lights) so GI can light dynamically in VPX. Use Blender 3.4 (materials from 3.4 break when appended to 3.2). UV map required. Use viewport shading with car paint material to reveal shading flaws.

Gate Primitive Setup

Gate bracket and flap primitives: Size at 100,100,100, bracket z=0, flap z=78. Gate flaps animate on roty: pgateRight.roty = gater.currentangle * 0.33. Gates open only ~30 degrees.

Baked Lighting for Asset Protection

Baked ambient occlusion onto textures makes images unusable for reproduction while looking good in-game. This was the approach agreed upon with Spooky Pinball.

Playfield Hole Edges

Alpha Mask value matters: too low (1) shows ugly edges, too high causes cutout issues. Optimal: Alpha Mask 220, hole height -12.5.

Troubleshooting

VPX Version Save Compatibility

Saving in an older VPX version after editing in a newer one can silently delete features. Always save in the same version the project targets.

Blender Material Version Incompatibility

Appending materials from Blender 3.4 into 3.2 causes materials to appear black. Must upgrade to 3.4 and stay there.

SSF Accelerometer Interference

Excessive bass in SSF sounds can trigger the accelerometer/nudge sensor. Fleep Rev02 rebalanced sub frequencies (~50Hz and below). Reactor critical motor sound is most likely to cause issues.

Scorbit Async Stutter

Heartbeat HTTP calls caused severe stutter when no session was active (coop mode). Root cause: StartSession sets HTTP to async but is never called in coop mode. Fix: add ForceAsynch method.

PUP Screen Layering

Priority: ForceOn > ForcePop > ForcePop > ForceBack. If fullDMD is ForceOn, overlay videos (ForcePop) cannot show on top. Use PuPlayer.playlistplayex to play directly on the DMD screen instead.

Plastics Material Assignment

All plastics accidentally had the wrong material applied, breaking GI lighting. Fix: set all to PlasticsActive. Highlights why multiple reviewers are important.

DMD Flasher Position in 10.8 Beta

PUP display appeared inside the backbox in VR. Fix: change Y position to 33 on the DMD flasher primitive.

Game Knowledge

Orbit Gate Mechanics

When reactor is NOT qualified, orbit shots go all the way around (gates open). When ball passes through an inlane, the corresponding gate closes for X seconds, allowing orbits to drop into top lanes/reactor core.

Speaker LED Color States

  • Game start: Purple
  • Reactor Ready: Green
  • Reactor Started: Blue (lights OFF during startup)
  • Reactor Critical: Red
  • Reactor Destroyed: Purple
  • Multiball: Blue (overrides reactor state)

Mystery Awards

Real awards include: 50k/150k Points, Extra Tilt Warning, Complete Keypad, Enable Ballsave, Super Spinner, +1 Bonus X, Light Locks, Max Reactor Value. Conditional exclusions apply when rewards are already active.

Joke awards (displayed but never given): LIONMAN!!!, Warp To Reactor 9, Instant Game Over, 42 Extra Balls, Disable Flippers, and others.

Music Track Order

Music plays in order, not random. Track 1 = pre-reactor, Track 2 = Reactor 1, etc. Multiball music overrides. Song swaps happen on kickout from scoop.

Skill Shot Mechanics

Two types: Regular (use flippers to select lane, awards lane save only) and Hands-Free (do not touch flippers, awards lane save AND Reactor Ready).

Ball Save (SAVE Letters)

Ball passing over an unlit inlane/outlane lights it red. Both flippers cycle lit lanes. Completing S-A-V-E qualifies a save, then triggering the flashing lane activates a 10-second timer. Saves stack with color progression: Red, Orange, Yellow, Green, Blue, Purple.

Reactor State Machine

Ready > Started > Critical > Destroyed > Reset. Super Spinner at 50 spins. Reactor startup is a 12-second animation (cancellable with both flippers).

Resources

  • TNA plastic scans: Google Drive (by EBisLit)
  • Scott Danesi official assets: MEGA
  • Lampshow converter: pastebin.com/X1HAjwn0
  • TNA font: Venera-900.otf

VR Setup

For PUP in VR: use PUPDesktopPunch to punch through VPX window (must be borderless windowed). BM66 desktop BAT provides template configuration. DMD flasher must have "Use as DMD" ticked.

Glass Hit Sounds

Four glass hit sounds from Fleep, randomly played on glass hit events. Glass ceiling implemented as invisible wall/ramp at proper height above playfield (~94-188 units).