No Fear: Dangerous Sports¶
A VPW mod based on Ninuzzu's 1.1 version from VPU, developed by kev_v with significant contributions from sixtoe, apophis79, tomate80, and others. The project demonstrates the recommended incremental feature implementation workflow for VPW tables, progressing through nFozzy physics, Fleep sounds, dynamic ball shadows, Flupper domes, Lampz, 3D inserts, and the Blender toolkit.
Build Notes¶
Recommended VPW Feature Implementation Order¶
- nFozzy physics (flippers, targets, drop targets)
- Fleep sounds
- Dynamic ball shadows
- Flupper domes (only replace flashers that actually have domes on the real machine)
- Lampz (handles other flasher lighting)
- 3D inserts (can start early but needs final playfield before visible)
- Physical trough
- Light tuning (comes last)
Playfield Scan Quality¶
Playfield scans don't need to be perfectly clean. Remove lumps of dirt, hairs, and anything "bad," but leave natural wear from a real scan -- scratches and minor wear add realism. SmaugDragon's 15-scan stitch at 600 DPI produced a massive improvement over the original VPX playfield.
Playfield Swap Impact¶
When swapping to a new playfield scan, expect significant work. The old VPX playfield dimensions may have been wrong (too narrow, too short), meaning ALL physical objects, walls, bumpers, primitives, ramps, and lamps need repositioning.
Post-Import Checklist for Blender Toolkit¶
After importing a new batch from the Blender toolkit:
- Set "Hide parts behind" checkbox on BM_Playfield
- Add reflection probe to playfield (strength ~0.2-0.3, roughness ~1-2)
- Add refraction probes to visible ramp primitives (each overlapping layer needs its own)
- Set toolkit plastic ramps as not visible (use Blender-rendered versions instead)
- Re-connect GI lightmaps to VPX lights if names differ
- Set playfield image to actual playfield texture for correct ball reflections
- Remove ramp-off textures if using DL-based approach
GI Lightmap Connection¶
GI lightmaps from the Blender toolkit must be connected to VPX lights. For future raytraced shadow support, match each lightmap to its exact VPX light name. After every toolkit batch import, these connections need re-verification.
PWM Updates (UseVPMModSol=2)¶
The PWM update was a quick ~5 minute change because the table was built on latest VPW methods. Changes: removed InitPWM sub, updated UpdateGI and FlashMod subs, set all light fader models to None.
PWM Brightness
PWM outputs are more realistic -- ROMs usually don't send full brightness to prevent overheating, so inserts may need to be slightly brighter than real gameplay to compensate.
3D & Art¶
3D Insert Implementation¶
- Export insert primitives from the VPW Example Table
- Cut out insert areas from the playfield image (alpha holes)
- Place on/off insert primitives at correct positions
- Integrate into Lampz code
- Assign playfield image to the light objects
- For very large inserts (like the No Fear logo), custom insert primitives may be needed
Insert Mask Creation¶
Create two layer masks: one for the insert shape (full circle) and one for the text/graphics inside. For toolkit compatibility, cut the entire circle for the insert mask. Using layer masks in Photoshop means the work can be reused for both direct VPX implementation and Blender toolkit approaches.
Render Probe Setup for Ramp Refractions¶
- Open VPX Render Probe Manager
- Add a refraction probe -- each overlapping layer needs its own
- Apply probes to the ramp primitives
Separate Side Rails for VR¶
Side rails and lock down bar should be kept as separate objects rather than baked into the "parts" primitive. This allows hiding them individually for VR cabinet mode.
Mayo Light Technique (Glass Dirt Simulation)¶
"Mayo lights" are floating VPX lights placed above the playfield (at glass height) to simulate flashers hitting dirty/greasy glass. Key considerations:
- Balance levels carefully -- initial implementations were way too bright
- Skip mayo lights under opaque objects (like the skull)
- Mayo lights intentionally extend past side rails since they simulate glass-level effects
Ramp Improvements via Materials Only¶
Dramatic visual improvement to ramps can be achieved with just texture and VPX material changes -- no model changes needed. Proper UV unwrapping of textures is essential for tangential objects like sidewalls, targets, and plastics.
Backface Culling Value¶
In VPX, backface culling 0 means full removal (opposite of what you might expect). The value 40 is the sweet spot for most objects.
Scripting¶
Integrating Custom Effects with Lampz¶
For custom lamp effects (like skull eyes):
Callbacks don't get the filter automatically, so apply Lampz.FilterOut() manually:
Sub SkullDisableLighting(DLintensity, ByVal aLvl)
If Lampz.UseFunc Then aLvl = Lampz.FilterOut(aLvl)
SkullJaw.blenddisablelighting = aLvl * DLintensity
End Sub
Replacing LampState with Lampz.State¶
Any existing code that references LampState(n) must be updated to Lampz.State(n). In No Fear, the jump loop wasn't working because the magnets couldn't activate without the light state being read correctly.
Hooking Ramp Lighting to GI¶
AddBall/RemoveBall in cvpmDictionary¶
KickBackIM.AddBall and KickBackIM.RemoveBall only manage a reference count and switch state in a cvpmDictionary -- they do NOT create or destroy balls.
Troubleshooting¶
BallMass and Physics Review Checklist¶
- BallMass should be 1.0, not 1.25
- Left and right flipper strength should match (unless table-specific reason)
- Flipper elasticity: typical 0.88, elasticity falloff typical 0.15
- Check for visible physics walls that should be hidden
- Fill dead zones near flippers with rubber walls
Drop Target Appears Black¶
When copying a drop target primitive from the example table and assigning a new texture, check the material assignment. A ball shadow material accidentally applied to the drop target causes pitch black rendering.
Dynamic Ball Shadows Appear as Squares¶
Ensure all ball shadow primitives have the correct ball shadow image assigned. Use the latest VPW Example Table version for the correct shadow image.
VPX Trigger Shape "None" Causes Ball Fall-Through¶
Triggers with shape "None" can cause balls to fall through ramps. Changing to "Star" shape eliminates the problem. "None" shaped triggers can also be very off-center from where the actual trigger zone is.
Overlapping Switches Prevent Magnets¶
If magnet triggers and switch triggers overlap in the same physical space, magnets may not fire. Separate the overlapping positions.
Opto Switches May Need Inverted Logic¶
Opto logic is sometimes inverted compared to regular switches. If a VUK or subway mechanism isn't behaving correctly, try swapping the switch assignments.
B2S Backglass Not Lighting with PWM¶
When using UseVPMModSol=2, B2S backglass lights don't illuminate. The fix involved translating 0-255 PWM values into binary lamp states with a threshold of 64. Reported on GitHub (vpinball/pinmame#229).
VR Backglass Shadow from Raytraced Light¶
A weird shadow on the VR backglass was caused by the backglass GI lightmap being connected to a VPX light with "Raytraced ball shadows" enabled. Change to a different light on the same GI string without raytraced shadows.
Game Knowledge¶
Magnet Mechanics¶
No Fear has 3 magnets. One at the back of the left ramp assists weak ramp shots. In certain modes, the magnets STOP the ball from going up the ramp and divert it. Without working magnets, the jump loop doesn't function.
Flipper Hardware¶
No Fear uses the FL-11629, the most powerful flipper coil Williams makes. Flipper tuning should wait until table layout is confirmed and ramp heights are correct, then tune from gameplay videos.
Resources¶
- VPX scripting reference: Orbital Pin Docs
- VBScript reference: VP Forums Tutorial
- Waifu2x for upscaling pinball assets (free, open-source AI upscaler -- use 2x scale with medium noise reduction)
Best Practices¶
- Stick with a specific VPX version during development; if you upgrade, remain on the upgraded version
- Always keep a backup in the previous VPX version
- Release tables with Legacy POV as default (Window mode POV was not finished)