case study19 min read$44

I Added Two-on-Two Tag Teams to Arcade UMK3. Here's v0.4.

A clean-ROM patch for arcade Ultimate Mortal Kombat 3 rev 1.2: HP+HK tags and LP+LK assists for all 23 fighters. In v0.4 Rain gets his Trilogy kit (Lightning, a Mind Control Orb you can steer, both of his fatalities), and the RAIN WINS line that has sat unused in the ROM since 1995 finally prints. Only U54 and U63 change.

All versions · Every public patch

Help shape what comes next ↓
umk3mortal-kombatwolf-unittms34010tag-team
On this page

UMK3 TAG turns arcade Ultimate Mortal Kombat 3 into a two-on-two tag game. You pick two fighters, swap them with HP+HK, and call the one on the bench in for an assist with LP+LK, like in Marvel vs. Capcom. It runs on the stock umk3 driver in MAME and FinalBurn Neo. The patch only changes the two program chips, U54 and U63. Every other ROM in your set is copied as it is.

This is v0.4, the first build I'm putting on the site. It fixes the bugs I hit in v0.3, and it finishes Rain: the purple ninja Ed Boon slipped into the arcade game in 1995 without ever making him playable.

UMK3 TAG v0.4 trailer. Every gameplay shot is the v0.4 build on the Wolf Unit test core, recorded at the board's native 54.71 Hz with its own sound.YouTube ↗

Ed Boon wanted a purple ninja in UMK3 and ran out of time

Rain has always been in arcade UMK3. You just never got to play him. He shows up for about a second of the attract mode, running at Shao Kahn, and that's it.

In a 2011 interview on the PlayStation Blog, Boon explained where he came from. He was looking for a ninja color nobody had used yet, and he was a big Prince fan, so: purple, Rain. The game was already finished and there was no time to build a real character, so he hacked in that short attract-mode bit instead. The life bar didn't have the word "Rain" ready either, so he put it together by hand out of the game's own letters.

Native 400x254 capture scaled 3x from an unpatched rev 1.2 set: the attract-mode clip of Rain in burgundy-purple fighting Shao Kahn on the portal stage, with RAIN lettered in the P1 life bar
Stock rev 1.2 attract mode, recorded from an unpatched set. Rain against Shao Kahn, with RAIN in the bar. This is all of him the arcade game ever showed.

Midway made him a real character later. In the 16-bit ports of UMK3 and in Mortal Kombat Trilogy he has his own moves: Lightning, the Mind Control Orb and the Super Roundhouse, plus a fatality where lightning keeps hitting the other fighter until they explode.

The v0.3 build of UMK3 TAG came with a feature list called "Ed Boon's unfinished UMK3 wishes". It had no sources, and I couldn't find Boon asking for most of what was on it: tag teams, Kameos, Fatal Blows, brutalities for everyone. Those are in UMK3 TAG because I wanted them, not because he did, so the list is gone. What I could source is Rain, and one line of text in the ROM.

The arcade ROM has said RAIN WINS since 1995, and v0.4 prints it

The Cutting Room Floor lists the unused text in the arcade ROM. One of the lines is RAIN WINS, at offset 0x33E2A, sitting next to the real winner lines. The game never shows it, because the table it uses to pick the winner line never points there.

Here's the byte math, so you can check it yourself. The two program chips are interleaved: U54 holds the even bytes and U63 the odd ones. The TMS34010 addresses memory in bits, and the program starts at $FF800000, so offset 0x33E2A is bit address $FF800000 + 0x33E2A × 8 = $FF99F150. The winner-line table at $FF99E610 has no entry for it.

v0.4 changes six bytes where the game picks the winner line. The stock code calls a routine and shifts the result to index that table. v0.4 jumps to new code instead:

byte patch $033C80 · U54+U63 program image6 bytes · 6 changed
before3F0D99FFA024
after80C00000FEFF
Bit address $FF99E400: CALLR $FF99DDB0 + SLL 5,A0 becomes JAUC $FFFE0000, the new winner-line code.

If the winning side's active fighter is Rain, the new code hands back $FF99F150, the original 1995 string. Chameleon and Khameleon get their own CHAMELEON WINS and KHAMELEON WINS lines in new space instead of the base ninja's name. Everyone else goes through the stock table like before.

The receipt for this one is simple. The test core records which ROM bytes the game reads. After Rain's fatality in v0.4, the game reads all nine bytes of RAIN WINS at 0x33E2A. Run the same match on v0.3 and it never touches them.

Native 400x254 capture scaled 3x of the v0.4 build in the graveyard: RAIN WINS printed over Rain standing after his lightning fatality, the opponent's remains on the ground
RAIN WINS, printed from the 1995 string at $FF99F150. v0.3 said SCORPION WINS here, the name of the ninja Rain is built on.

Rain's Lightning, orb and fatalities work now

In v0.3 you could pick Rain, but his moves were broken. Lightning and the orb played an animation and drew nothing, so they looked like ordinary knock-ups. His "custom fatality" ran the brutality code. v0.4 rebuilds all three, using Trilogy's Rain as the model, and adds the parts of his Trilogy kit that were still missing: steering the orb and his second fatality.

MoveInputWhat you see in v0.4v0.3
LightningDown+Back+HPRain throws his fist up and a bolt of Midway's own lightning comes down onto the opponent. It launches on hit.Animation only, no bolt
Mind Control OrbDown+Forward+LPA water orb crosses the screen. If it touches, it bursts and the opponent floats for 46 frames so you can follow up. Hold a direction while they float and you move them. Blocked, it does chip damage.Animation only, no orb
Super RoundhouseBack+HKSame as v0.3Worked
Deadly UppercutDown+Forward+HP at FINISH HIM, up closeHe uppercuts the opponent off the top of the screen and they come back down in piecesDidn't exist
Lightning fatalityDown+Forward+HP at FINISH HIM, from about half a screenBoth arms up, six strikes of the same bolt 11 frames apart, a last bolt, then the explosionRan the brutality
BabalityDown+Back+LK at FINISH HIMThe stock Babality routineNone

These are button chords like the rest of UMK3 TAG, not Trilogy's motions. The move lists out there don't even agree on all of Trilogy's inputs, and chords are what everything else in this hack uses.

The two fatalities share one chord and the distance picks which one comes out. That's how Trilogy splits them too: the Deadly Uppercut is a close one there (Forward, Forward, Down, HP) and the lightning works from half a screen (Down, Down, Back, Forward, HK). Here, 90 pixels or closer gets the uppercut and 91 to 180 gets the lightning.

No new graphics went in, and none were needed. My first try drew the bolt and the orb as flat colored rectangles, and they looked hacky next to Midway's sprites. But the arcade graphics ROMs already have real lightning in them: Nightwolf's lightning fatality (Back, Back, Down, HP) calls a bolt down from the sky. Rain's Lightning plays the four full-bolt frames of that animation (frame lists $FF86B520 to $FF86B6C0) with the bolt's own palette at $FFDCCC10.

The orb is Reptile's forceball. Its flight frames ($FF944620 to $FF9446A0) are the orb, and its burst ($FF9446E0 to $FF944820) is the splash when it connects. The only new thing is two water-blue palettes, and those live in the program ROM. The graphics ROMs stay byte for byte. The receipt: the test core logs every ROM byte the game reads, and when Rain throws these moves it reads every one of those stock frame lists.

The bolt draws over the fighters and under the timer and the WINS text, the way Nightwolf's bolt does. To get that, the HUD gets drawn a second time after the effect, but only while a bolt or an orb is on screen.

Native 400x254 capture scaled 3x: Rain with his fist raised while a jagged blue-white lightning bolt, the one from Nightwolf's fatality, comes down from the top of the screen onto Chameleon
Lightning (Down+Back+HP). The bolt is Midway's, from Nightwolf's fatality. On the test core it stays up for 12 frames and takes 20 health off.
Native 400x254 capture scaled 3x: Rain with his palm out as the Mind Control Orb bursts on Chameleon in a blue water splash, Reptile's forceball burst recolored
Mind Control Orb (Down+Forward+LP). Reptile's forceball in water colors. It moves 11 pixels a frame, and on contact the opponent floats for 46 frames.
Native 400x254 capture scaled 3x: Rain with both arms up as the same blue-white lightning bolt strikes the opponent during the FINISH HIM fatality
Lightning fatality (Down+Forward+HP at FINISH HIM). The bolt fires seven times, then the opponent explodes.

The orb steers now, the way the 16-bit UMK3 move list puts it: "move opponent: B/D/F/U". While the opponent is in the air inside the bubble, the caster's joystick moves them 3 pixels a frame left or right (kept inside the camera window), 2 up and 3 down. That code is called from the effect pass, which only runs while a bolt, an orb or a bubble is on screen, so an ordinary fight frame runs the same instructions as before. The receipt casts the orb five times from the same state: holding Left ends the float 84 pixels left of where it ends with no input, Right 52 pixels right (the edge of the screen stops it). Holding Up peaks the float 11 pixels higher, and Down 22 pixels lower.

Trilogy's other Rain fatality is the Deadly Uppercut. He uppercuts the opponent and the body comes back down in slices, stacked in the wrong order. Those slices are art the arcade ROMs don't have. So here the uppercut is his own crouching uppercut, animation 0x0B, and the opponent's process switches to the game's uppercut-flight frames, animation 0x1E. I read both numbers from the fighters' own processes during a normal Down+HP on the test core. The opponent rises 12 pixels a frame off the top of the screen, and the body-chunk burst the other finishers use (create_fx 0x0C) comes down instead of the slices.

Native 400x254 capture scaled 3x in the graveyard: Rain with his fist up after the uppercut while Chameleon tumbles above him toward the top of the screen
Deadly Uppercut (Down+Forward+HP up close at FINISH HIM). The opponent goes off the top of the screen and comes back down in pieces.

What's still missing from Trilogy's Rain is his chain kombos. He still has Scorpion's. On the test core, HP, HP, HK and HK, HK, LK land three hits each, and his Trilogy HP, HP, LP stops at two. Building his own means working out the game's hit-reaction routines first. His Animality and Friendship would need art that isn't in the arcade graphics ROMs.

Round 1 shows Rain before FIGHT now

v0.3 had a bug you saw every match. Before FIGHT, the bars and colors showed the ninjas the secret ones are built on, SCORPION and REPTILE, and only switched to Rain and Chameleon once the fight started.

v0.4 builds the names, the colors and the four team bars during the round intro. On the test core, every sample of the intro has the team HUD up and the same purple on Rain's body as 30 frames after FIGHT. On v0.3, the same frames show Scorpion's yellow and the stock HUD.

Native 400x254 capture scaled 3x of ROUND 1 in the graveyard: Rain in purple on the left and Chameleon on the right, with the team bars already reading RAIN, KHAMELEON, CHAMELEON and SUB-ZERO
ROUND 1, before FIGHT. Rain's purple and the four team names are already up.

Keeping the bars up through KO cost frames, so I took that back

My first v0.4 build kept the team HUD up through KO, FINISH HIM and Mercy too, so a secret ninja's name could never flash. It looked fine, but it slowed down the game's own sequences: round transitions took 7 more frames and Mercy took 15 more. UMK3 runs at about 54.7 frames a second, so 15 frames is more than a quarter second, and two older checks (Mercy timing and the CPU's tag timing) started failing.

So v0.4 only draws the team HUD during a fight and during the round intro. Outside of that it does what v0.3 did: the stock HUD takes over at the end of a round and for Mercy. When it does, the secret ninja's stock name is hidden, so the bar never says SCORPION for Rain. It shows no name instead, which is still on my list.

On a fight frame with no bolt or orb on screen (and tournament rules off), the code that runs is exactly what the first v0.4 build ran there. When I added even two instructions per frame in that path, the incoming partner landed a frame later and an old tag test caught it. That happened again with the lightning: my first way of getting it under the HUD was a hook in the game's HUD pass, and that hook alone made the tag-in land a frame late. So the HUD redraw only runs while an effect is up.

The other v0.3 bugs are fixed too

v0.3 problemv0.4
Forward Kameo with Sub-Zero dropped the ice on your own partnerForward drops the Ice Shower on the opponent ($FF9D7A90) and back is the Ice Clone wall ($FF9D7550). They were swapped.
Kung Lao's Kameo forward throw turned the background black and froze himIt uses his Teleport ($FF9D7750). No corruption in the v0.4 recording.
The brutality's hit counter said 2 HITSThe game's own combo readout says 11 HITS
Rain's custom fatality looked like the brutalityHe has both Trilogy fatalities now
The round intro and the win line used the base ninja's nameFixed, see above
Native 400x254 capture scaled 3x in the lava stage: Sub-Zero called as a forward Kameo drops the Ice Shower on Scorpion on the far side while Kitana stays on point
Forward Kameo with Sub-Zero: the Ice Shower lands on the opponent now, not on your own partner.

Three things players kept asking for

I went through what people have asked for in arcade UMK3 over the years: forum threads, the changelogs of other UMK3 hacks, and the patch notes of the newer official collection. Most of it was already in UMK3 TAG. Three things changed for v0.4.

A kombo limit under tournament rules. The known infinites, like Kabal's fireball and spin loops, Stryker's gun, Shang Tsung's eruption juggles and the corner crouch loops, all keep one fighter in one combo without letting them recover. With tournament rules on (Block+Up on the VS screen), no strike connects once the game's own unrecovered-hit count for that fighter reaches 12, until they recover. Finishers are exempt, and it's off by default. The receipt sets the count to 11, 12 and 20 before one ordinary HP: 11 still hits, 12 and 20 don't, and without tournament rules all three hit. I haven't replayed each infinite against it, and a relauncher that resets the game's count would get past it.

Babalities for the hidden fighters. Ermac and Classic Sub-Zero never had one in the arcade game, and neither did the fighters UMK3 TAG adds. Down+Back+LK at FINISH HIM now runs the stock Babality routine ($FFAC1550) for Ermac, Classic Sub-Zero, Human Smoke, Noob Saibot, Rain, Chameleon and Khameleon. It goes through the game's own finisher launch, so the game's usual checks still apply. Kabal's own Babality still works, and the chord does nothing for the regular fighters.

Training mode is gone. Earlier builds had one on the VS screen (Block+Down). This is an arcade game, so I took it out. Block+Down on the VS screen does nothing now.

Everything from the earlier builds is still in v0.4

Rain is the headline, but most of UMK3 TAG is the tag game underneath, and that carries over. The 17 verification groups in the table further down re-check it on v0.4.

  • 23 fighters on clean NVRAM, with Mileena, Ermac and Classic Sub-Zero unlocked from a cold boot, plus Noob Saibot with his own moves, Rain, Chameleon and Khameleon.
  • MvC1-style bars: the point fighter on the full bar, the partner on a slim bar under it, and red life that heals while they sit on the bench.
  • Both fighters on a team have to go down to lose the round. On a timeout, team health decides it.
  • CPU teams through the arcade ladder, with Motaro and Shao Kahn as solo bosses.
  • Engine fixes: charge moves survive the tag and assist chords, Jax and Sektor work the same on the P2 side, throws reveal invisible fighters, Kung Lao's spin and Kitana's fan lift can't loop forever, Shang Tsung morphs work on clean NVRAM, Nightwolf's reflect works in 2-on-2, and Mercy and fatalities clean up stray projectiles.

How to play v0.4

  • Pick your team. Two different fighters per side. Noob Saibot has his own square. For the other secret ninjas, hold Up and press Run when you pick: on Scorpion you get Rain, on Reptile or Human Smoke you get Chameleon, and on Kitana, Jade or Mileena you get Khameleon. Up+Block works too.
  • Tag: HP+HK. Your partner comes in with a homing jump kick. The one leaving backflips out in a win pose and can't be hit on the way out.
  • Assist (Kameo): LP+LK. Your partner flies in, does a move and leaves. In Modern controls, hold Forward, Back, Up or Down with it for their other moves.
  • Kombo Breaker: Forward+Block while you're getting hit. Your partner cuts in.
  • Team Fatal Blow (Modern): Block+LP+LK at low health, once a match.
  • Brutality: Block+Run+HP up close at FINISH HIM.
  • Babality for the hidden fighters: Down+Back+LK at FINISH HIM.
  • Modern extras. Tag Kombo: Forward+HP+HK in the middle of an attack (uses your Run meter). Snapback: Block+HP+HK with a full Run meter. EX special: add Run to a special's last button. Air Kombo: jump punch an airborne opponent, then HP, then HK.
  • Modern is the default. Block+Start on the select screen switches your side to Classic: plain six buttons, no Kameo directions, no Fatal Blow, none of the Modern extras.
  • On the VS screen: Up or Down picks the stage (16 of them, including the hidden Blue Portal), Block+Up turns on WaveNet tournament rules (with the kombo limit), and Start skips straight to the fight.
  • Beat both fighters on a team to win the round. Best two of three.
Native 400x254 capture scaled 3x of the SELECT YOUR TEAMS screen with full-body fighters on both sides: Rain and Khameleon for player 1, Chameleon and Sub-Zero for player 2
The select screen with both teams picked. Rain and Khameleon on the left, Chameleon and Sub-Zero on the right.

To install it:

  1. Extract the zip into its own folder, and keep a backup of your clean rev 1.2 umk3.zip.
  2. On Windows, drag umk3.zip onto BUILD UMK3 TAG PREVIEW.cmd. On a Mac or Linux, run python3 patch_umk3_tag.py --development /path/to/umk3.zip.
  3. Load output/umk3.zip from a separate ROM folder with the stock umk3 driver. Don't mix patched and unpatched sets between two players online.

The patcher checks every ROM in your set by size, CRC32 and SHA-256 and refuses anything that isn't a clean rev 1.2 set. It never changes your original zip.

What I checked on v0.4, and what I didn't

Every number here comes from the v0.4 image itself (93e2f771…ccd0). Receipts from v0.1 to v0.3 don't count for this build. All of it is in RELEASE.json.

CheckWhere it ranResult
Python patcher rebuilds the exact v0.4 ROM set from a clean one, and refuses a set with one byte changedLinux, Python 3PASS
All 17 verification groups: tags, assists, HUD, select, KO, Mercy, CPU, projectiles, throws and the restHeadless Wolf Unit core (FBNeo)3,054 / 3,054
Rain's moves, RAIN WINS and the round intro, from a cold boot with ordinary inputHeadless Wolf Unit core6 / 6
Kombo limit, hidden-fighter Babalities, orb steering and both of Rain's fatalitiesHeadless Wolf Unit core10 / 10
v0.3 feature checks, re-run on v0.4Headless Wolf Unit core35 / 35
v0.2 feature checks, re-run on v0.4Headless Wolf Unit core43 / 43
Frame timing against v0.3Headless Wolf Unit coreIntro +0, round transition +1 to +2, Mercy +1
Windows patcher (BUILD UMK3 TAG PREVIEW.cmd), any PowerShell versionNot run on v0.4UNVERIFIED
Stock Fightcade client, real controllers, a real Wolf Unit board, two machines onlineNot run on v0.4UNVERIFIED
This is a preview build, so test it before you rely on it.

The Windows patcher hasn't been run on this release yet, on any version of PowerShell. If it fails for you on Windows, the Python patcher in the same zip does the same job. Keep your clean umk3.zip, run the patched one from its own folder, and make sure both players have the same build before playing online.

What's still open

  • The VS screen and HUD portraits for Rain, Chameleon and Khameleon still use the base ninja's art. New art would mean changing graphics ROMs.
  • After a round ends, a secret ninja's bar shows no name.
  • Rain still has Scorpion's chain kombos instead of his Trilogy ones, and no Animality or Friendship.
  • The kombo limit hasn't been played against each known infinite, and a relauncher that resets the game's hit count gets past it.
  • Kung Lao's spin Kameo can still end in the spin pose on top of your point fighter.
  • From round 2 on, the round-win medallion draws under the partner's name on the reserve bar.

Sources: the 2011 PlayStation Blog interview with Ed Boon, The Cutting Room Floor on arcade UMK3 for the unused text, Mortal Kombat Warehouse for Rain's home-version moves and Nightwolf's fatality input, the SuperCombo wiki on Trilogy's Rain for his fatalities, and the UMK3 Super NES move list for steering the orb.

Community input · Next release

Help test UMK3 TAG v0.4-preview

Choose up to 3 priorities. No account needed.

Written by Daniel Plas Rivera · 4,161 words · $44

ShareXLinkedIn