Under the microscope: Shaq Fu

Shaq Fu, the 1994 Genesis game from Delphine Software, lets players experience the dream of the 1990s: to become basketball legend Shaquille O’Neal as he battles an evil mummy from an alternate dimension.That’s right: Shaq Fu is a 2D fighting game, not a basketball game. I approve – it’s great when pop culture figures star in unexpected genre games. Should the Wu-Tang Clan be in a tournament fighting game? Absolutely. Should Aerosmith be in a light gun game? Definitely. I only regret that there was never a Seinfeld-themed beat-’em-up.

I found a previously-unpublished cheat code for this game. You can use it to speed Shaq’s progress through the Second World and get him back to the First World in time to play in the big charity game. Details are below!

The Instant win cheat

To use this new cheat, select Options from the main menu. If you’ve got a second controller, unplug it from port 2. Use Controller 1 to set the Music test cursor to 5. Then enter this sequence: A (x8), B (x3), C (x5).

The Options screen, ready for cheat entry

If you got it right, the screen will flash. Now, when you’re playing, you can press A+B+C+Left to instantly win a match.

Shaq defeats Voodoo

This works in all of the game modes. If you skip ahead enough, you’ll get the staff credits.

Game credits for Shaq Fu

This cheat enables another effect, too: pressing A+B+C+Start during gameplay resets back to the title screen. Be careful not to lose your progress!


Technical details

There are two well-known cheats for this game. They’re both entered on the Options screen, like the new one described above. The first of these involves entering the sequence A, B, C, C, B, A quickly. After entry, attacking an opponent will produce a spray of blood.

Blood mode enabled

How does this code work? The function at 000034e8 handles input on the Options screen. After the parts that handle moving the menu cursor, there’s a bit that looks like this in Ghidra’s decompiler (after adding labels):

cheat_id = check_sequence_0000d6ae();
if (cheat_id == 50) {
    blood_effect_00fffc01 = 0xff;
    screen_flash_0000df98();
}

The actual work of tracking the code entry is delegated to the function at 0000d6ae, which is a general-purpose sequence detector. It’s used for combo moves during gameplay as well (e.g., Shaq’s Inferno Kick attack: Down, Down+Right, Right+C). This detector function returns the ID of whichever sequence was entered – for blood mode, it’s 50.

The second well-known code involves pressing Up, Down, B, Left, Right, B. This changes which character you control in Story mode. Usually it’s Shaq, but after entering the code, you’ll get the character that corresponds to the selected Music test track.

Playing as Voodoo in Story mode

The relevant logic looks like this. There’s a call to the sequence detector like before, plus another check of the Music test cursor:

cheat_id = check_sequence_0000d6ae();
/* ... */
if (cheat_id_1 == 52) {
    story_character_00fffc40 = music_test_cursor_00fffc37 % 0xc;
    screen_flash_0000df98();
}

The new code from above also calls the sequence detector and checks the Music test cursor. Additionally, it also checks what type of controller is plugged into port 2:

cheat_id = check_sequence_0000d6ae();
/* ... */
if (cheat_id_1 == 51) {
    if ((music_test_cursor_00fffc37 == 5) && (controller_2_type_00ffe89f == 0)) {
          enable_skip_00fffc02 = 0xff;
          screen_flash_0000df98();
    }
}

The controller types are: 0=Nothing, 1=3-button pad, 2=6-button pad.

Controls for a 3-button pad versus a 6-button pad

You can plug in a second controller after entering the code. In multiplayer mode, pressing A+B+C+Left on Controller 2 will make Player 2 win.


Outro

Thanks for reading. As always, feel free to use the information and screenshots in this article for your favorite reference site or wiki.

I’ll be back again soon with another Genesis game under the microscope. Check out my blog for more retro game reverse engineering in the meantime.

Leave a Reply

Your email address will not be published. Required fields are marked *