River Heights Mall Gene Splicer 3000
The River Heights Mall Gene Splicer 3000 is a bespoke arcade game created for Meow Wolf’s Houston location, Radio Tave. Tying directly into the lore and theme of the exhibit, it explores a faction of underground gutter punks known as the Undermallers, living in abandoned malls after humanity has largely transcended nature and lives in giant arcologies. It was developed by Strange Scaffold, and I served as the lead developer on the project.
The Gene Splicer started out as All Hams on Deck 2 — the original mobile game had lapsed from the App Store and Google Play years prior, and I wanted to flex my programming muscle to build a more feature-complete version. This led to me building a new framework in Unity that was extremely flexible, and then the project sat for awhile.
When it came time to build this project, Xalavier Nelson Jr. and I were developing pitches, and I threw out that I had this project that could be used, and I didn’t care about retaining ownership of the code. We developed three pitches, and this was the one that Meow Wolf decided to move forward with, ultimately saving us some dev time.
The overall goal was to make a quick game, since this would be in a public space where people would be moving in and out. As such, there are 4 rounds total and each one is 30 seconds. Between menu, introduction, game and end screen, a player can’t spend more than about 4 minutes at maximum completing the game.
The point of the game is to bounce your limbs around a DNA slop, changing and morphing them over time to become a cool genetically-engineered freak in the most punk way possible.
The main menu sets the overall tone and vibe, like any good menu, offering only the options of 1P and 2P mode. I’ll go through the general 1P flow, design, and implementation, then talk about how the 2P mode was adapted from this, despite that they were largely developed in parallel. Then I’ll talk about the Exquisite Corpse mechanic and how that was achieved.
1-PLAYER MODE
The game opens on a dark, layered background that fades in in sequence with a bunch of sound effects, and the water, paddle and HUD all come into view. This is largely just handled with animations that change the color of sprites over time. The pipes and background have shaders on them that are pretty similar; the one for the background is shown below. It isolates the green from the image, animates its glow with a voronoi noise texture, then reapplies it to the background.
The paddle is a simple collection of three scripts, each with a pretty basic function. The Boat (holdover name from All Hams on Deck 2) controls the basic input and movement functionality. Bind To Screen gets used on most objects in the game, and in this case, kills the velocity to make it easy to turn back when hitting an edge. Velocity Based Rotation tilts the paddle on a slight delay, which is important because the paddle launches objects in its Transform.up direction, meaning the player can angle their bounces.
The actual bouncing objects in the game have too many components for a screenshot, so here’s a breakdown of the different components on the limb, and how some of those components are re-used elsewhere.
Bounceable — any object that bounces around is a bounceable. It controls things like their force when bouncing off of other objects, how it bounces, and fires off several events that other scripts react to.
Bind to Screen — same script as the boat, with the checkboxes flipped, allowing them to bounce off the sides of the screen predictably.
Position Threshold Checker — in this case, checks if the limb falls below the water line, usually ending the round. Used elsewhere to check if objects are offscreen for other reasons.
One Shot Tween — an implementation of DOTween with some pre-set parameters and some that can be tweaked. Used to make objects visually bounce a bit when they collide.
Tracked Object — every object gets added to a tracked object script when it gets added to the scene, allowing for quick deletion when a round ends. Essentially lets me clean up all bounceables and particle effects at a moment’s notice.
Score Giver — Tells the Score Manager singleton to award points. Triggered by the Bounceable’s OnCollision events.
Limb — Tracks which player owns the limb, handles a bunch of events related to limbs getting spawned and destroyed, and allows the graphics on the limb to be updated after X number of bounces.
Velocity Limiter — not actually used, but still on the object. Sets a hard limit on X or Y velocity, either positive or negative. Mostly used on other objects to prevent them flying around too fast and making gameplay unreasonable.
The minigames were originally pitched as, essentially, Stratagems from Helldivers. We quickly realized that a row of inputs wouldn’t work, since we were working with arcade buttons. The solution was to show the pad of 6 buttons that the players would use, and light up the appropriate button.
The minigames start with 3 button presses, and add 2 per round, for a total of 9 presses in round 4. Succeeding in all presses gives the owning player an additional 5 points. Failing launches a volley of DNA at the player which, while giving points for each limb bouncing off an object, can potentially spike the limb into the goo, ending the round. These volleys increase per player and per round, culminating in a maximum of 8 for 2 failed minigames in a 2-player game.
2-PLAYER MODE
The game is largely the same in 2P mode, with some key differences. Just about everything is doubled — there’s a minigame for each player at the same intervals, and there’s a limb for each player (an additional head, and the torsos are split in half). We knew early on that just adding two paddles would have felt bad, and given that we intended for two players to make the same corpse together, it made sense for them to share a paddle.
The solution was to treat it more like a classic Breakout paddle — gone was the rotation (which was as simple as removing the velocity-based rotation script), and in came the connective goo. If something hits a player’s paddle, it goes far off to the side, but the goo is a smooth interpolation between those two sides, mimicking that feel. The goo can stretch and players can pull each other, forcing them to cooperate. They can also pass through each other unhindered. This was achieved by putting a joint on the boats that kept their rigidbodies close, and disabling it when they were a certain distance from each other.
LIMB ASSEMBLY
If you’ve read this far — thanks, and also what the fuck? This is a lot of writing for an obscure arcade release, so either you really care about Meow Wolf or you’re super invested in my career. Either way, I appreciate you.
So the game’s got limbs, and it’s got a lot of them. These are divided into legs, arms, torsos, and heads — making up rounds 1-4 in that order. For 2-player mode, the torsos are divided in half and stitched together with a little sprite asset (not pictured here) , and two heads are tacked on. This allows for some pretty wacky combinations.
Of course, this means that every head needs to connect to every torso, which needs to connect to every arm and leg, and also might need to connect to another half. How is this done? The answer is good tooling.
I absolutely loathe writing custom inspectors in Unity, and I also needed to show my limbs in-game, so I figured I should build a custom scene.
Since each limb was set up as a ScriptableObject, I could mark each limb as a type, and use that to define its connections to other limb types. Each limb could also have its own offset in regards to how it connected to other limbs, allowing for subtle adjustments. Essentially, I could define an “attach point” on each arm, leg, and head, and a torso would define where those attach points would meet its own attach points.
From there, the scene I created allows me to create any number of custom limbs, scroll through the collection on the right side, and enter the appropriate ID’s. Then I can fine-tune the numbers as I see fit, and hide the attach points for a final process check.
Once this functionality existed, I extended it to the 2-player variants. Since the arms/legs were already split assets, I simply cut the torsos in half, leaving the empty space in the image. This allowed me to keep the torsos in place and have them seamlessly connect, since their centers would always be aligned.
With this created, I needed these scripts to work on the actual endgame screen, which was a matter of making the assembly function static and passing in the appropriate LimbAssembler objects. The 2P heads are also slightly tilted to prevent overlap, which is accounted for in the assembly. Since everything revolves around the torsos, we create two separate lists, then simply look through the non-torsos and attach them to the first relevant torso we find, which will always work out due to how the code is written and how many limbs are created.
Finally, I coded a high score system with 4-letter input, naughty language detecting, and threw a bunch of animations and polish in, which left us with the end screen.
This was an incredibly fun project to make, allowing me to work with a ton of interesting and skilled developers while making something that only exists in one physical location in the world. I’m beyond thrilled with how it turned out, and if you want to see it in person, you can always visit Meow Wolf - Radio Tave.