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:
- Establish contact through streaming/social media
- Show existing VPX work to demonstrate quality
- Propose as advertising/promotion for the real table
- Address IP concerns (baked lighting protects art)
- Get written permission with attribution requirements
- 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 levelShakerMotor: 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¶
Asset Links¶
- 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).