Skip to content

RollerCoaster Tycoon

A complete table rebuild by gedankekojote97, who owns the real machine and used it as the definitive reference for sounds, physics, and visual accuracy. The project evolved from a mod of JP's version into a full rebuild with physical measurements, extensive VR room work (including an animated roller coaster), and innovative rendering techniques like individual LED lightmaps and filament bulb rendering. Major updates progressed from v1.0 through v2.0 to v2.3.

Build Notes

Flupper Dome Flashers

When scaling up primitives for dome flashers, everything must be scaled proportionally. Initial implementation had flasher images too large -- more subtle flash images work better.

Scrambled Egg Spinner Physics

The spinner has 12 switch pulses per revolution. VPinMame's emulator timer isn't fast enough to register all pulses on solid hits. Solution: put UpdateLeds on 10ms timer and fix switch timing in script.

Layout Adjustment to Match Blender Meshes

Adjusted VPX layout to match Blender meshes exactly. Many physics objects were off -- Blender meshes are more accurate since they were measured from the real machine. Adjusted flipper shapes (length/diameters), removed Fleep drop target sound routine, made drop targets not detect hits from behind.

New Recorded Sounds

All sounds recorded from the real machine using iPhone. Includes: flippers (up/down/hold), slingshots, drop targets, attract mode standby hum. Key lesson: record all sounds from the same position (player position) for consistent volume levels. Added a general volume variable in script for easy adjustment.

ROM Version Change (7.02 to 7.01)

Mode start bugged in ROM 7.02 -- starts with sw37 instead of proper behavior. Switched to 7.01 (rct701). Also added upper flipper scripts to lower flipper scripts since solenoids don't enable properly in 7.01.

Toolkit Import and Optimization

4K batch import with optimizations: removed DMD reflections, backface set to 40, file size reduced to 245MB. For movables, unchecked "static" setting. All light faders set to None for performance.

Topper Design

Custom topper using backglass entrance imagery with roller coaster toys, modeled in Blender then baked using toolkit. Uses RCT color palette (yellow, red, black).

Reflection Arrays

Update reflection arrays with objects relevant to the project. What you include gets reflected on objects using "playfield reflections" reflection probe. Added targets, drop targets, spinning disc, and dummy.

Pop Bumper Strength Variation

Real RCT machine increases pop bumper power progressively during certain modes. Solution: read SolModCallback array values and write them to pop bumpers for next pop (accept being one power level behind).

3D & Art

Mini LED Display Implementation

105 individual LEDs on score display, each with its own 2K lightmap. Creates realistic reflections off flashers below the LED screen. Renders one texture at a time, so GPU isn't overwhelmed. Alternative: VPX 10.8 multiple DMD support.

Insert Rendering (LED vs Incandescent)

Real machine uses LED bulbs with frosted domes -- very bright with less detail. Decision: match real machine LEDs even though blown out. May need a VPX light above the playfield to balance.

Filament Bulb Rendering

Visible bulbs rendered with filament details and emission. Challenges: emissive meshes can't use compositor grouping (longer render times), projection bug where light rendered onto every lightmap behind it. Glass material uses roughness to diffuse light. Shadows from filament strings disabled via Ray Visibility.

Ball Image Rendering

Ball rendered with VR room reflected. Problem: static table reflections clash with VPX dynamic reflections. Solution: render ball with only room and backglass, remove cab/playfield (use black plane).

VR Room (Roller Coaster Station)

Features an operational roller coaster that drives into/out of a station with animated gates. Over 1300 lightmaps. Safety bars animate. LOD textures and meshes significantly improved VR room appearance.

VR Room Angle Fix

The VR room was rebuilt but had a 3-degree rotation offset and scaling issues. For future work: create flat VR floor by setting primitive RotX to '6' in VPX, then match modeled floor to that angle.

New Materials (2.0 Update)

New environment and lighting without blown out colors. Updated materials for apron, metal ramps, rocket tube, plastics, ramps, siderails, and stickers.

Scripting

PWM Flashers and GICallback

With modsol=2, GICallback outputs multiple consecutive True/False values. Use GICallback2 which outputs continuous float values instead.

Flipper Buzz Sound Fix

Flipper buzz continues after releasing button. Fix: in left flipper keyup, comment out old line and add corrected sound stop.

Standalone VBScript Const Order

VBScript engine on standalone (and Wine) requires Const variables to be declared before first reference. Move Const cGameName before any code that uses it.

Troubleshooting

VUK Ball Stuck at Multiball

When two balls enter VUK simultaneously, they get stuck. Solution: delay the kicker by 100ms:

swRocket_in.TimerEnabled = True
swRocket_in.TimerInterval = 100

Standup Target Animations Not Firing

VPX bug: _animate subs don't fire for invisible VPX target objects (works for gates, triggers, spinners). Solution: use Roth standup code instead.

Lightmap Reflections Performance

Over 1300 lightmaps. Turn off reflections for all lightmaps (set reflection probe to none). This fixes framerate issues during multi-flasher scenes.

Refraction Ghost Artifacts

Flasher above clear ramp shows ghost refractions. Fix options: separate flasher from Parts collection, import as own primitive above ramps, or per niwak: make the opaque part's material transparent so it renders in the transparent pass.

Playfield Shadow from Wire Ramps

Wire ramps cast shadows during Blender baking, including onto flipper surfaces. Solutions: hide flippers in Blender during bake, remove ambient light, or bake flippers in two positions and swap textures mid-stroke.

Blurry Graphics on Lower-End GPUs

RTX 2060 Super with 4GB VRAM shows blurry textures. VPX automatically reduces texture size when running out of memory. GPU with 8GB VRAM runs fine.

DOF Not Working with New ROM

Table uses rct701 instead of rctycn. Solution: update DOF config with ROM alias for rct701.

ROM Volume Settings

ROM sounds too soft. Access volume controls: set .Hidden = 0 in script, press F1, enable default DMD, hover over DMD panel, press ~ key, use left/right arrows.

Plunger Visualization with Digital Plunger

Red line doesn't work with real digital plunger hardware (only keyboard input). Fixed to work with plunger hardware.

Game Knowledge

Ballsave Not Enabled by Default

Ballsave disabled in ROM standard values. Access service menu (or ~ key) to enable. "If you die in RCT, you die -- same as in the real theme park."

Backglass Hum Sound

The constant humming is real -- comes from transformer or power driver boards. Made optional since it can be bothersome. Default changed to OFF.

Stern Plunger Cover Design

Apron part is very high compared to plunger -- can barely see it from player position. "Design fail" on Stern's part.

Best Practices

Performance Profiling

  1. Check "Enable Performance Measurements" in VPX settings
  2. Run table and press F11 twice for performance chart
  3. Play until frame issue occurs, exit and close VPX
  4. Check vpinball.log bottom for 10 longest frames with timing breakdown

Backface Culling Optimization

Set backface to 40 for LED board elements. In VR, provides significant performance benefits.

Dirty Glass and Reflection Options

Added dirty glass and reflections as user-configurable options in the Tweak menu.

Free Play ROM Setting

Change in service menu. Also enable ballsave in ROM since disabled by default.