Maverick (Data East/Sega 1994)¶
Data East/Sega System 3B standard-width build (2021-2024) led by sixtoe with apophis79, iaakki, rothbauerw, and pinstratsdan. Notable for the Rubberizer tuning lessons on slow/flat tables, the InRotRect function for rotation-aware drop target collision, RTX dynamic ball shadow implementation, and the discovery of missing tilt functionality through competition play.
Build Story¶
Maverick used the Data East/Sega System 3B platform with widebody dimensions and a Sega 192-column DMD (same as Baywatch and Batman Forever -- real pin2dmd hardware cannot display these properly). The table plays more like an EM era game due to all the drop targets, with a slope of 4.7 making it noticeably flatter than most tables. A VP Chat competition revealed 3+ undiscovered bugs in the released table -- missing tilt, stuck ball areas, and a drop target ball-launch bug -- establishing competition play as a testing best practice.
Table-Specific Details¶
Mechanisms & Hardware¶
Roth drop target ball-launch bug: The Roth drop target code checks if a ball is over a target when it raises and applies BOT(b).velz = 20 to pop the ball up. Two bugs: (1) velz=20 is too high (should be ~10), (2) no Z-height check means balls on ramps above the drop targets also get launched. On Maverick, balls riding a wire ramp above the drop target bank were catapulted during target reset. Fix: add BOT(b).z < prim.z+DTDropUnits+25 check.
InRotRect function: The original Roth drop target InRect check assumes targets face directly toward flippers. For rotated targets, apophis79 created InRotRect that rotates each corner around the target center point using dCos/dSin, then adds the prim position back. Must rotate around the center point, not (0,0) -- requires translate-rotate-translate pattern.
Missing tilt functionality: Maverick shipped with no tilt -- infinite nudging was possible without penalty. vpmNudge.TiltSwitch and vpmNudge.Sensitivity were never added to the script. Tilt is switch 1 on the DE Maverick ROM. sixtoe: "I don't ever nudge or tilt, so, you know..." -- a reminder to implement features even if the developer does not personally use them.
Art & Visuals¶
RTX dynamic ball shadows: iaakki's approach uses elliptical primitives (not flashers, which cannot be stretched dynamically). The shadow pivot point is at the tip, glued to ball position, with roty updated based on direction to the nearest bulb. Distance to the bulb changes shadow length. Shadows fade when GI goes off; ambient shadow stays. For multiball, 4 shadow sources per ball is optimal but raises performance concerns (5-ball multiball = 25 shadow primitives). Workaround: only display shadows on balls closest to flippers.
Image optimization: Maverick dropped from 190MB to 100MB through image optimization alone. Key technique: match resolution to visible area -- an inlane texture reduced from 4K to 2K (inlanes are ~1/8th of the table length) provided identical quality at 4x smaller file size.
Physics & Gameplay¶
Rubberizer on slow tables: Rubberizer settings that work well on faster tables can make slow/flat tables like Maverick feel "springy" and hard to control. pinstratsdan found Rubberizer 1 made the ball difficult to catch, preferring Rubberizer 0. iaakki confirmed: "The difference with rubberizer on and off should be quite small. It should give just 1-2 more bounces per flip." Each table needs its own tuning.
Real table physics calibration: Real machine owner Randy (who repairs and sets up machines to factory spec) provided feedback. Final values: slope 4.7 (originally 5.0 -- "a very flat table compared to most others, by design"), flipper strength 2600, plunger return 112.
Sega 192-column DMD: Real DMD hardware (pin2dmd etc.) cannot display this non-standard column count. Known limitation for cabinet players.
Known Issues¶
MP3 positional audio broken: Converting Fleep sounds from WAV to MP3 broke SSF positional audio. VPX uses bass for MP3 but internal Windows audio for rolling sounds (WAV) -- the routing differs between formats. Always use WAV format for table mechanical sounds.
LoadController is internal only: Using LoadController("VPMALT") in the table script worked in VPX 10.6 but crashed in 10.7. DJRobX: "LoadController is supposed to be an internal function." Fix: handle ball release through standard keydown/keyup handlers.
Lauren Belle mode ROM bug: Locked balls release prematurely during this mode -- confirmed as a ROM bug that also occurs on real tables. Documented on Pinside.
Techniques Developed Here¶
- Competition play as testing methodology was established from the Maverick VP Chat competition
- InRotRect for rotation-aware collision developed here
- WAV vs MP3 for table sounds -- the routing difference was discovered here
- Image resolution matched to visible area -- the inlane texture example
- Rubberizer is table-dependent -- slow tables need different values
See Also¶
- Monster Bash -- sling threshold tuning via PAPA video comparison
- Jurassic Park -- Data East physics reference values shared with Maverick