Cameron Main
Arcade Paradise: DOOM Arcade Cabinet
A MelonLoader mod that adds a fully playable DOOM arcade machine to Arcade Paradise.
DOOM running inside the custom Arcade Paradise cabinet.
Project Overview
This project began as an experiment in extending a commercial Unity game with a new arcade machine. The mod injects a DOOM cabinet into Arcade Paradise's existing arcade and Arcademania systems, allowing it to be discovered, purchased, delivered, placed and played like a native machine.
Rather than building a separate game window, the mod embeds the Managed Doom engine and bridges its software-rendered output, input, sound and music systems into the arcade cabinet inside Unity.
Key Features
- Injects a playable DOOM arcade cabinet into Arcade Paradise.
- Adds the cabinet to the Arcademania shop with a purchase and delivery flow.
- Supports cabinet placement and restores its position after saving and reloading.
- Provides an attract mode when the cabinet is idle.
- Renders DOOM gameplay directly onto the cabinet screen.
- Applies custom cabinet artwork supplied as a runtime asset.
- Connects DOOM keyboard and mouse input to the host game.
- Supports sound effects and MIDI music through Unity audio and MeltySynth.
- Includes shop, PDA and tutorial text overrides for the injected machine.
Technical Implementation
The mod was written in C# for MelonLoader and targets an IL2CPP Unity game. Harmony patches hook into the game's existing machine, shop, delivery, save and interaction flows rather than replacing them wholesale.
The cabinet is created by cloning an existing arcade-machine prefab, replacing its machine data with a unique runtime data object, registering it with the arcade machine manager and attaching a custom DoomArcadeManager component.
Managed Doom runs as the embedded game engine. Custom Unity bridge classes translate its video framebuffer into a Unity texture, map player input to Doom events, route sound effects to Unity audio and provide MIDI playback through MeltySynth.
Engineering Challenges
- Working with decompiled IL2CPP game assemblies and incomplete runtime type information.
- Registering managed components with Unity's IL2CPP domain.
- Making a dynamically created machine participate in native shop and delivery systems.
- Keeping the injected machine's purchase state separate for each save.
- Capturing the final placed position instead of the temporary delivery-animation position.
- Maintaining the DOOM screen material after the host game's interaction code changes it.




