Skip to content

The Simpsons Pinball Party

Major rebuild project with extensive technical discussion about table development, physics, rendering, and scripting.

Build Notes

Adding nFozzy Physics and Fleep to Existing Tables

First attempt at bringing nFozzy physics and Fleep sounds to a table. Used awesome guides from rothbauerw, apophis, bord, Benji. All settings are stock nFozzy settings from tutorial based on table manufacture date (2003). Process involves copying physics elements and sound code from tutorial tables, then tuning to match the specific machine.

Contributors: idigstuff (2022-02-17)

Getting Author Permission for Table Updates

Received official approval from original table author (32a) for update project. Author's guidance: "I never had a problem with anyone modding my tables, the only thing I asked is that they had significant changes, not just 'My personal settings' mods that don't bring anything new to the table. You are more then welcome to mod anything I made." Important to seek permission and ensure updates provide real value.

Contributors: idigstuff, 32assassin (2022-02-27)

Playfield Image Preparation

For 600 DPI scans in 300 DPI containers: straighten, scale to correct size. Pull darkest parts of black keylines up to true black to solve low contrast without messing up colors. Export as 150 DPI version for VPX work - plenty of resolution and easy to work with. Final will be color corrected and scaled to 4K.

Contributors: bord (2022-03-22)

Replacing nFozzy Rubber Elements with Meshes

Repositioned all playfield level posts, lane guides, and rubbers from Blender to VPX. Replaced nFozzy rubber elements with repositioned meshes for better visual accuracy. Moved meshes into "New Layer 0" collection, physics meshes into "New Layer 1". This provides better control over appearance while maintaining physics.

Contributors: bord (2022-04-07)

Stern Stock Parts Library for VP

Modeled all stock parts from Simpsons manual to aid building. These Stern parts are scaled and positioned for VP use. Includes posts, guides, standard hardware. Available in Blender format for import into other Stern projects.

Contributors: bord (2022-04-05)

Table Positioning and Alignment

Change VPX table dimensions to 952.94 x 2117.65 for accuracy based on real measurements. Many errors found in original build - models, positions, even basic alignment. Recommendation: With new accurate playfield scan, consider total remodel for accuracy. Use placement maps to guide repositioning of all elements.

Contributors: bord, iaakki (2022-03-28)

Cabinet Mode and VR Options Automation

Automated cabinet mode, desktop mode, and VR room options in script. Handles different rendering requirements for each view mode. New RenderingMode property only available in 10.7.1+, not 10.7.0 - needed adjustment for compatibility.

Contributors: apophis79 (2022-05-26)

Flipper Mechanical Sound for Auto-Engaged Flippers

For flippers that auto-engage (like showing ball eject location), add mechanical sound to solenoid sub. Example for top right flipper:

RandomSoundFlipper TopRightFlipper
TopRightFlipper.RotateToEnd
Add these two lines to SolTopRightFlipper sub. Repeat for other auto-engaged flippers. May need to comment out regular flipper sound call to avoid doubling.

Contributors: Rawd, idigstuff (2022-05-02)

Nuts and Bolts Detail Pass

Many nuts and bolts missing from table compared to real machine. Should add these for accuracy. Small detail work but contributes to overall realism. Can be added to dedicated layer for easy management.

Contributors: iaakki, Sixtoe (2022-05-27)

Scripting

Flipper Lag Fix

Upper left flipper lag fixed by adding RotateToEnd and RotateToStart to left flipper solenoid call while leaving normal SolUPFLeftFlipper sub intact. Same treatment for upper right flipper for safety. Lag common issue on multi-flipper tables.

Contributors: Darkstar, Gedank, Wylte (2022-04-18)

Modulated Flashers with ObjTargetLevel

Changed flashers to use ObjTargetLevel instead of simple on/off - follows ROM events better for more accurate lighting sequences. Testing showed flashers don't emit 0-255 values with SolModCallback (only 0 and 1), but ObjTargetLevel provides better gradation. Monster Bash flasher code might be applicable for full modulation implementation.

Contributors: iaakki (2022-05-27)

Couch Multiball Memory Setting

Couch EB Memory setting per manual: YES or NO (default NO). When YES, Extra Ball from Couch Multiball retained ball-to-ball for same player. When NO, feature goes out at end of each ball. This explains why balls weren't releasing at game end - set to MEMORY instead of NEVER. Changing to NEVER releases balls at game end. Include in release NVRAM or document in instructions.

Contributors: Scampa123, idigstuff (2022-05-20)

NVRAM Management for Settings

For release: Either include pre-configured NVRAM file with correct settings (Couch MB Memory = NEVER, etc.) or provide clear instructions on how to adjust settings. Users won't know to change obscure ROM settings otherwise.

Contributors: Scampa123, idigstuff (2022-05-20)

CheckHeads Frame Timer Requirement

CheckHeads sub must be referenced inside a timer (frame timer works) as it needs to be permanently active for Homer head texture swapping to work correctly. Without constant checking, textures won't update properly on flasher events.

Contributors: Sixtoe, Nestorgian (2022-05-25)

3D & Art

Playfield Scan Quality Assessment

When evaluating playfield images, accuracy is real benefit over appearance. Previous versions came from unknown sources with visible problems - saturation issues, lost detail (Duff balloon, UFO interior), bucket fill artifacts, stitching errors. New scans provide proper foundation. Don't whack up saturation - colors should be corrected using LUTs. Always prefer original scans; use color keys when available for calibration.

Contributors: bord, Sixtoe (2022-03-22)

Alpha Cuts and Layer Masks in Photoshop

New playfield requires redoing all alpha cuts. Using layer masks: Create layers with high-res PF image, each has different layer mask - one for overlay, one for holes. Press Alt while clicking layer mask to toggle views. When exporting, downscale to nearly 4K. This approach allows non-destructive editing and easy adjustments.

Contributors: apophis79 (2022-03-27)

Wall Geometry for GI Light Passage

For Game of Thrones-style wall treatment: Raised bottom of walls to ~20, then put stub walls wherever "pillar" needed going from 0-20. Allows GI light to pass through while maintaining structure. For Simpsons, many walls block GI - they need cutouts matching real machine. Use Marco Specialties spare parts diagrams and Pinside photos to identify correct hole positions. Make visible walls as primitives in Blender, use invisible VPX walls for collision. Can set disablelighting and depth bias on primitive walls.

Contributors: skillman604, iaakki (2022-03-03)

GI Lighting Techniques

For GI implementation: Use point light blocked by objects, plus general overall bloom light. Look at tables like Monster Bash, Congo, Cactus Canyon for examples. Can create GI light flasher in Blender - far faster than VPX lights. Process: Export table to Blender, set materials (plastic posts transparent), select all GI bulbs, set emission ~400, disable other lights, set playfield for baking, bake with Cycles. Creates playfield-sized additive flasher that lights up the table. Takes about 35 minutes.

Contributors: Sixtoe, iaakki (2022-02-26)

GI Flasher Baking Workflow

Detailed GI baking process: Export table to Blender, set proper materials (plastic posts slightly transparent), select all GI bulbs and set emission to ~400, disable other lights, set playfield to be baked, bake with Cycles renderer. Result is a playfield-sized additive flasher in VPX. The basic image matches GI Off state, the flasher lights it up. Can include reflections from toys, color hue from colored posts. Used this method for Black Magic (BM) table.

Contributors: iaakki (2022-02-26)

Insert Primitive Implementation with Lampz

Insert primitive workflow: Create primitives named to match lamp numbers (L6, P6, Poff6, etc.). Use latest Flupper example table prims (some rectangle meshes were broken in older versions). Implement Lampz code for proper fading - much better than JP code's binary on/off. Getting even one insert working first, then use find & replace in VSCode to update all at once. Each insert ON primitive must be named correctly and tied into code. Adjust fade times to avoid binary appearance. Can darken by adjusting prim material or light underneath settings.

Contributors: idigstuff, apophis79, iaakki (2022-02-28 to 2022-03-15)

Plastic Primitive Creation Workflow

Easier method than manual Blender tracing: Trace plastics in Adobe Illustrator using bezier curves or image trace tool, export as SVG. Include perfectly playfield-sized shape in SVG for easy UV mapping. Import SVG to Blender, convert to mesh, remove duplicate vertices, limited dissolve, UV map & texture. For layered look: duplicate mesh, give second mesh acrylic texture, raise on Z slightly, extrude outside edges down to meet first flat mesh. This puts screen printing beneath the acrylic layer.

Contributors: bord, tomate80 (2022-05-17)

Plastic Guide Redrawing

Redrew plastics by hand as vectors from raster source images - no magic conversion tool. Used reference images and manual tracing. Adjusted color palette to match new playfield scan. Line work thickness critical for small details like eyes, hands, toes. Process: view original, create vector paths, adjust weights, color match. Multiple iterations to get curves and proportions right.

Contributors: Nestorgian, bord, Sixtoe (2022-04-19 to 2022-05-11)

Baking Lit Textures in Blender

For glowing objects (bumper stacks, translucent items): Bring model into Blender with texture, add Blender light inside/on it, bake two versions - light off and light on. UV unwrap the object first, set seams to create simple figures when unwrapped. Then bake texture using Cycles. Creates ON and OFF states. For objects on flashers, may need baked internal lighting combined with disable lighting (DL) settings in VPX. Look at LOTR Balrog for similar implementation example.

Contributors: tomate80, iaakki, apophis79 (2022-04-14 to 2022-04-17)

Monorail and Wire Ramp Modeling

Remade wire ramp primitives to match real table geometry. Created baked textures for shiny wire ramps and monorail ramp. Ramps should go under upper playfield per manual. Wire ramp visual meshes can be positioned independently from physics ramps for best appearance. Physical ramps realigned with new primitives.

Contributors: tomate80 (2022-05-22)

Side Blade and Backwall Lighting

Baked sideblade textures in two versions: black wood (GI on/off) and alternate art (GI on). For black wood: GI ON uses DL=0.3, GI OFF uses DL=0. Can hook to Lampz for DL fade. Lights still visible through black wood sideblades with simple DL method - better approach is bake GI ON and OFF, create diff image, use as additive flasher/primitive. Same for backwall - added missing upper backwall GI bulbs and rebaked textures for much better illumination.

Contributors: tomate80, iaakki, apophis79 (2022-05-25)

Diff Image Technique for GI

For any flat surface or primitive: Bake with GI ON and GI OFF in Blender, create diff image showing only the lighting difference. Use diff as additive flasher (for surfaces) or additive primitive (for 3D objects - new in 10.7.2). Keeps graphics and lighting separated. If you fix PF graphics, don't need to rebake - just update base image, diff lighting still works. This is the method the VPX toolkit uses with light mapper.

Contributors: iaakki (2022-05-26)

Insert Bloom Lights

Added bloom lights on top of inserts to cast light on playfield around insert (see Transporter or BM examples). Inserts added to "Inserts" collection so brightness adjusts with GI - get brighter as GI goes dark. Code in InsertIntensityUpdate sub:

bulb.intensity = bulb.uservalue*(1 + (1-aLvl)*2)
Change the multiplier (2) to adjust bloom intensity with GI off. Can also remove blooms from Inserts collection entirely if too aggressive.

Contributors: apophis79 (2022-05-24)

Flasher Dome Baking Workflow

For 8 flasher domes, would need 4x8=32 bakes plus 16 additional for cabinet mode. Most work is separating flasher images from UV mapped square - everything cut from same areas for consistency. PF bakes easiest - no cutting needed, just smooth noise, increase contrast, resize. Can skip domes under plastics entirely (minimal sideblade contribution). Flashers in sequences (see 1:15 mark PAPA tutorial) show which areas lit by each dome - critical for accurate bakes.

Contributors: iaakki (2022-05-26)

Playfield Reflections

Added playfield reflections to table. Helps sell the 3D look and material properties. Part of overall flasher and lighting improvements.

Contributors: Sixtoe (2022-05-26)

Ball Reflection Properties

Ball HDR image too dark with weird glow. Made brighter ball_HDR image with reduced table reflection on surface. Ball appearance critical for overall table feel. Proper ball image makes huge difference in visual quality.

Contributors: Deleted User, idigstuff (2022-05-20)

Desktop Background Image Design

For desktop background: Keep it dark so table is the star. Simple, minimal design works better than busy graphics. Dark backgrounds make table elements pop and reduce visual competition.

Contributors: HauntFreaks (2022-05-26)

Troubleshooting

VUK Trapdoor Z-Threshold Bug

Ball was failing to trigger the VUK trapdoor. Fix: lower the Z-threshold to match actual ball trajectory. Always verify actual ball Z positions with debug output rather than assuming theoretical values.

Contributors: sixtoe, apophis79 (2025-05-10)

10.6 vs 10.7 Table Compatibility

Tables saved in 10.7 crash when opened in 10.6, even when they don't use 10.7-specific features. Not using .webp or .mp3 files doesn't prevent crashes. 10.6 tables work in 10.7, but not reverse. Important for VR compatibility - VPVR 10.7 was unstable in early 2022 but improved over time. Consider maintaining 10.6 version until 10.7 VR stabilizes.

Contributors: Rawd, idigstuff (2022-03-01)

VPX Crashes and Memory Management

Use x64 version for table editing - manages memory better, fewer crashes when restarting table repeatedly. However, B2S only works with x86 version currently (unless using Fluffhead's 64-bit B2S build). Can have both exes in same folder with different names. X64 requires running setup64.exe in PinMAME folder and clicking Install.

Contributors: apophis79, fluffhead35 (2022-05-25)

Black DMD in 10.7 x64

Black DMD in 10.7 x64 version but works in x86. DMD also rotated in some setups. Launching table from editor crashes in x64 but works when clicking table icon. Solution: Use x86 version for playback if DMD issues persist. May also need Freezy DMD extensions. Updating VPinMAME to latest (from GitHub artifacts, requires sign-in) can help.

Contributors: Skitso, fluffhead35 (2022-05-25)

Ball Stuck Locations

Common stuck ball locations identified: 1. Top of mini-playfield when shooting from top-right flipper into top-left lane - easily nudged loose 2. Above right slingshot, left of multiball saucer - easily nudged loose 3. Halfway down left ramp 4. On top of gate exit to ball launch 5. Under right sling after fast ball over phys_posts prims in inlane

Fixed with adjustment walls and geometry tweaks.

Contributors: PinStratsDan, Thalamus, BountyBob (2022-05-26)

Plunger Lane and Skillshot Tuning

Shooter lane wall angle critical for skillshots. Original setup made Kwik-E-Mart skillshot impossible and CBG skillshot automatic every time. Fixed with plunger wall tuning and plunger release speed adjustment. Also fixed ball stuck issue in process.

Contributors: apophis79, idigstuff (2022-05-15)

Depth Bias Issues and Solutions

Various depth bias issues fixed: insert overlay, plastics on decal/bevel prims. Some plastics need separation from grouped prims to set different depth bias values. Upper PF wall needed adjustment. Proper depth bias prevents z-fighting and ensures correct rendering order.

Contributors: iaakki (2022-05-27)

Backglass Rotation for Cab Setup

Internal DMD appears rotated in some setups and not visible in editor backglass view (only shows when table starts). Need to adjust rotation in script for cabinet orientation. Typically search for "rol" in script but may be set differently in modern implementations.

Contributors: PinStratsDan (2022-05-27)

POV (Point of View) Settings

POV corrected for better viewing angle. BountyBob's cabinet POV shared for reference. Proper POV critical for cabinet playability.

Contributors: tomate80, BountyBob (2022-05-24)

Game Knowledge

Homer Head Toy Implementation

Homer head rotates and changes texture based on flasher events. Head was initially too large and rotation point incorrect. Proper setup: Size Y should match reference photos, rotation should be centered, position adjusted to match real table. Head uses multiple textures that swap based on which flasher fires - nearly one texture per flasher combination. CheckHeads sub must be referenced in timer (frame timer works) to be permanently active. Textures may appear to swap incorrectly if flasher state tracking isn't right.

Contributors: multiple (2022-04-13 to 2022-05-24)

Duff Beer Can Mod Implementation

Created 3D Duff beer can mod in Blender with foam topper. Import settings: specific scale/rotation needed. Material should be plastic in VPX for proper appearance. White foam looks better than textured for cartoon style. Can be lit with disable lighting and blend settings. Make primitive non-static to tie to flasher underneath for lighting effects. Initial version too large - scaled down to not dominate table or stick above table sides.

Contributors: tomate80, idigstuff, Rawd (2022-04-13)

Slingshot Animation

Added slingshot corrections including animated elements. Based on gameplay videos, slingshots on real Simpsons table are very weak compared to other games - tuned strength accordingly.

Contributors: apophis79 (2022-05-15)

Resources

High-Quality Playfield Scan

Perfect 300 DPI playfield scan available (675 MB file). Original was 600 DPI but saved in 300 DPI container. Properly straightened and scaled. Far superior to previous versions which had warping, upscaling, and bad color correction including bucket fill errors. File measurements fully correct after scaling adjustment.

Contributors: ClarkKent, bord (2022-03-22)

Blender VPX Import Toolkit

VBousquet's Blender toolkit can import VPX files directly with one click - includes textures and geometry. Far easier than manual export/import workflow. Great for quick baking setups or visualization. Can then export specific elements back to VPX. Makes it trivial to get table into Blender for lighting work.

Contributors: tomate80, iaakki (2022-05-21)

File Size Optimization with WebP

Converting images to WebP dramatically reduces file size. Also optimize by checking image formats (8-bit vs 16-bit, grayscale, indexed) - mishmash of formats common in unoptimized tables. Consistent format helps VPX performance. For background images in holes/cutouts, use solid black instead of playfield scan data underneath - can save 3+ MB per image depending on complexity.

Contributors: HauntFreaks (2022-05-25)

Layer Organization for Team Development

With 10.7's unlimited layers, could create named layers per developer (Sixtoe-layer, apophis-layer, iaakki-layer). Makes merging much easier - each person works in their layer. Only limitation: big table-wide changes still touch multiple layers (like Sixtoe's alignment work).

Contributors: iaakki, Sixtoe (2022-05-27)

Physics Testing Against Real Machine

Played real machine to verify physics. Filmed gameplay for reference. Watched YouTube tutorials (PAPA, Dead_Flip) for upper playfield flipper behavior, ball speed, slingshot strength. Real Simpsons machines notoriously nasty depending on operator lane setup. Upper playfield flippers weaker than expected. Used video clips to tune flipper strength, ball speed, ramp behavior.

Contributors: idigstuff, iaakki (2022-05-20 to 2022-05-21)

Release Testing and Timeline

For Memorial Day weekend release target (May 30, 2026): Assets locked 5 days before release, testing by Friday at latest for Sunday night/Monday release. Halted new features, focused on tweaks and bug fixes. Testing included physics, ball stuck locations, lighting balance, sound mixing, visual quality. Multiple testers provided feedback on physics feel, skillshot difficulty, multiball balance.

Contributors: multiple (2022-05-20 to 2022-05-27)

Project Status Communication

Regular status updates with version number, current issues, next steps posted to channel. Pin current version link and todo list for easy team reference. Clear communication about who has file currently prevents conflicts. Version numbering scheme (.027, .028, etc.) with change notes helps track progress.

Contributors: idigstuff, multiple (2022-03-23)

VR Room Development Workflow

Created VR room with animated elements (Homer thinking of beer/donuts, Bart on skateboard, Maggie crawling). Added shadows to everything for 3D depth. Cabinet art needed for completion - sought high-quality images or direct photos from real machines. Process involves creating room environment separate from table, then importing later.

Contributors: Rawd (2022-02-23)

Cabinet Art Sources

For cabinet artwork, check old file folders from previous work - may have high-res images forwarded by others. Also check with Sixtoe who maintains a small library of cabinet artwork. Real photos from machines work but avoid flash/reflections and shoot straight-on.

Contributors: Rawd, Sixtoe (2022-02-25)

Flupper Flasher Domes Implementation

Table would benefit significantly from swapping in Flupper Domes for flashers. These provide more realistic lighting and bloom effects compared to standard VPX flashers.

Contributors: apophis79 (2022-02-17)

Real vs Collidable Ramps

For visual ramps that don't match physics: Can leave original ramp as non-collidable to make triggers work, but better approach is to use invisible wall at correct height for trigger surface. Walls can be small, moved under apron, set as trigger surface property. For ramps needing custom collision shapes that VPX can't create, use low-poly Blender ramp for collision mesh. Can't cut collidable ramps in VPX like shown in Blender preview.

Contributors: tomate80, apophis79 (2022-05-23)

Development Sequence Timing

Don't worry too much about lighting early in development. Get the table working properly first. Some projects redo GI 4+ times because it was started too early. Best practice: Make game look good in GI Off state first, then light it up area by area. This is how Skitso approaches development as well.

Contributors: iaakki (2022-02-26)