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:
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¶
- Check "Enable Performance Measurements" in VPX settings
- Run table and press F11 twice for performance chart
- Play until frame issue occurs, exit and close VPX
- Check
vpinball.logbottom 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.