Skip to content

Haunted House (Gottlieb 1982)

A complete toolkit table build for Gottlieb's uniquely complex 3-playfield, 8-flipper Haunted House. Produced comprehensive toolkit workflow documentation including Blender collection organization, naming conventions, batch export settings, multi-level playfield physics, and GI light collection architecture. Key contributors: apophis79, cyberpez, sixtoe, rothbauerw, tomate80, bord1947, niwak, and benji084.

Build Story

Haunted House is architecturally unique -- three playfields (upper, main, lower) with 8 flippers, requiring solutions for multi-playfield physics that no other VPW table had needed. The build produced some of VPW's most important toolkit documentation, establishing patterns used on every subsequent toolkit table.

Table-Specific Details

Mechanisms & Hardware

  • Three-playfield architecture: Main playfield at Z=0 (VPX 10.8 resolved older limitations). Lower playfield at 11 degrees relative to main -- cyberpez's estimate confirmed by arcade measurement offer from iaakki.
  • Angled flipper setup: Flippers on the lower playfield need two-axis rotation. Set up local axes normally, then rotate globally for the 11-degree slope. Don't check "Use Obj Pos" for flippers. Control RotZ for flipper movement with a fixed RotX offset.
  • Drop target fix for angled playfields: Drop target animation code resets RotX to zero, breaking targets on the lower playfield. Fix: add the playfield angle offset (11 degrees) to RotX in the animate sub, using a z-height check to identify which targets are affected.
  • Kicking standup targets (Gottlieb leaf switch targets): Act as normal standups on grazing hits but kick back like slingshots on solid hits. Implementation uses modified drop target code with configurable kick strength and displacement threshold.
  • Playfield window between main and lower PF provided an opportunity for backglass reflections, but sixtoe warned "fake reflections look bloody awful in VR, always." Better approach: dust/dirt flasher layer with opacity ~200-250 to sell the glass material.

Art & Visuals

  • Blender collection organization: Standard structure established here -- VLM.Bake (static objects, Parts sub-collection, underPF), VLM.Lights (Inserts as Split, GI per string as Grouped with shadow-casting in separate Split, Flashers as Split, Room as Solid), VLM.Movables (targets, flippers, gates, spinners).
  • 31-character naming budget: LM_ + light collection + _ + light name + _ + part collection + _ + part name must total 31 or fewer. Keep all names at most 6 characters.
  • Batch export settings: Nestmap size must be 8192 (not 256). At least one light collection needs "Solid" bake mode or only lightmaps generate (no bakemaps). Render ratio 25% for quick 1K tests. Delete render results directory before re-running. Use "Hide" not "Remove All" export mode.
  • Insert dual-bulb setup: Each insert requires two Blender lights (inside insert + above playfield) but only one VPX light. Insert cups (tray shapes) prevent the flat/deep appearance especially noticeable in VR.
  • GI color mod system: All GI rendered as pure white in Blender, with color applied in VPX script. Enables unlimited user presets, per-group independent coloring, and adjustable room brightness.

Physics & Gameplay

  • DIP switch initialization: ROM DIP switches lack VPX-side defaults. Two approaches: SetDefaultDips function (requires restart) or shipping a pre-configured .nv file (works immediately). Haunted House set to "Replay" mode for match feature.
  • Slingshot rubber animation: Three methods compared -- old-fashioned swap (simplest, compatible with lightmaps), PlayAnim/Blendshape (higher quality but lightmap blending issues), and toolkit built-in sling setup.

Known Issues

Techniques Developed Here

See Also