Skip to content

Hook (Data East 1992)

VPW rebuild from v009 to v1.0 release (2020-2021), led by iaakki with sixtoe (VR), cyberpez (subway/code), skitso (lighting), and benji084 (AO/rendering). The build produced foundational lessons on timer performance, GI fading architecture, flasher solenoid discovery for undocumented Data East tables, and merge conflict management in a pre-bot workflow. Hook's watercolor-style playfield art created unique insert cutout challenges.

Build Story

Hook went through 78+ WIP versions plus 7 release candidates before its v1.0 release. The build served as a proving ground for several VPW techniques that were later standardized. The team discovered critical performance problems with 1ms timers, established the per-material GI fade curve system, and refined the flasher solenoid discovery process for Data East tables -- all of which became standard VPW knowledge.

The table also highlighted the pain of collaborative VPX editing without version control. Multiple team members edited RC1 simultaneously, and a single timer value change (diverter timer from 10ms to 100ms) went unnoticed among many VR fixes, causing slideshow-like animation. iaakki's frustration -- "We must STOP doing major changes after first RC is out!" -- helped establish post-RC discipline across VPW.

Table-Specific Details

Mechanisms & Hardware

Subway/scoop reconstruction: The right scoop subway was rebuilt multiple times, borrowing a turnaround mesh from the Funhouse table. cyberpez reworked the subway to remove unnecessary kickers that caused balls to fall through the playfield, replacing bsUpperEject/bsLVuk ball stack logic with direct kicker control via sw48 and sw51 subs.

Skull flasher (Sol13): The skull flasher was not documented anywhere in the Data East manual. cyberpez discovered it by assigning a test flasher to candidate solenoid numbers and using manual ball control to trigger switches -- Sol13 fires 3 times when sw37 (ramp sensor) is hit, matching real table behavior.

Hook flasher SolCallback assignments: - Sol25: Flash 1B (skull) - Sol26: Flash 2B (SetLamp 92) - Sol27: Flash 3B - Sol28: Flash 4B - Sol29: Flash 5B (SetLamp 95) - Sol30: Flash 6B - Sol31: Flash 7B - Sol32: Flash 8B (SetLamp 98)

Flashers at lamp numbers 92, 95, 98 use SetLamp (direct lamp control) rather than custom subs -- these are lamp-matrix flashers that do not need effects code.

Plastic lane guide dampener: Hook's lane guides have no rubber or separate posts -- just bare plastic. iaakki created a custom PlasticsD dampener at 95% of rubber elasticity for realistic collision behavior on these bare-plastic surfaces.

Art & Visuals

Skull dual-layer flasher technique: The skull uses two overlapping primitives (outer + slightly smaller inner) with different materials and DL values. The flasher script incorporates gilevel into the BDL equation to prevent pulsating when GI toggles during a flash cycle. Image-swapping between lit/unlit textures was rejected because images cannot fade smoothly between states.

GI fading system: Custom FadeDisableLightingD and FadeDisableLightingDM functions control how individual primitives respond to GI state changes. Each ramp gets individually tuned BDL values with minimum visibility constants:

Primitive_MainRamp.blenddisablelighting = gilevel * 0.12 + 0.03
Primitive_RightRamp.blenddisablelighting = gilevel * 0.16 + 0.04
The + 0.0x terms ensure ramps remain minimally visible when GI is off.

AO shadow approach: The team tested both baked-into-playfield AO and separate flasher-layer AO. The flasher approach allowed GI-linked fading but caused depth bias clipping artifacts with stacked alpha layers. The team reverted to baked AO after the flasher approach caused too many visual artifacts.

Physics & Gameplay

Ramp roof gap: The main ramp had a height of 135 while the roof ramp above it was at 180, creating only a 45-unit gap. Since balls are 50 units in diameter, they were being squeezed and slowed. Fix: increase the gap or lower the roof.

Ramp propulsion workaround: A targeted ball propulsion script at the ramp entrance switch (sw36) applies a 1.15x speed multiplier for balls in a marginal speed range (-25 to -32), capped at -34 to prevent unnaturally fast ramps. This was eliminated when slope was adjusted from 6.0 to 5.8 degrees.

Known Issues

Wire ramp performance: The main wire ramp primitive (~15,000 polygons) with active materials and non-static rendering caused significant FPS drops. Disabling reflections from objects in the upper half of the playfield (not in the player's field of view) recovered 20-30 FPS without visual impact.

Techniques Developed Here

See Also

  • Last Action Hero -- another Data East table with similar flasher mapping challenges
  • Lethal Weapon 3 -- Data East table with the same schematics-based flasher identification process