Under the microscope: Batman: Vengeance (PlayStation 2, GameCube, Xbox)
The surprise that's been hiding in Batman: Vengeance's debug symbols
In this edition, I’m examining the 2001 game Batman: Vengeance. This one is based on the New Batman Adventures TV show, which aired between Batman: The Animated Series and Batman Beyond.
The game drew mixed reactions: The Electric Playground thought it was one of the most disappointing games of 2001. But GamePro’s review said that “Bat-fans… will be delighted” by it.
Are there any secrets hiding in this game? I checked the PlayStation 2 version, and was pleased to find that it shipped with debug symbols. You can view them in the PCSX2 emulator’s debugger, which makes it easy to search for interesting function and variable names:
There are several functions with the name CheatCode in them. The most compelling ones seem to be associated with the five codes listed on IGN’s cheat guide:
Infinite Batarangs
120 points
Infinite Bat Launchers
Infinite Handcuffs
All cheats enabled
Is that everything? Not quite – here’s another function with an interesting name:
003f06d0 CAIMenuCinematic::fn_vUnlockAllCinematicsIt’s called by another function, CAIMenuCinematic::fn_vCheckSequence. This one is new!
The function executes when you’re on the Cinematics screen, which isn’t available when you first start playing. You have to start a new game, watch the intro movie, and then return to the main menu to access it.
This “check sequence” function implements a state machine with three states. You start in state 0. When you press all four shoulder buttons, a counter increments and you move into state 1. The logic for this state looks something like this pseudo-Python:
if state == 0:
if (
is_button_held(L2_BUTTON) and
is_button_held(R2_BUTTON) and
is_button_held(L1_BUTTON) and
is_button_held(R1_BUTTON)
):
state = 1
counter += 1You fall back to state 0 if you release the shoulder buttons. But if you keep them held and press L3, the counter from above increments again. This counter serves as an index into an array of “next state” values, so its value determines which state you wind up in.
State 1’s logic resembles this pseudo-Python:
if state == 1:
if (
is_button_held(L2_BUTTON) and
is_button_held(R2_BUTTON) and
is_button_held(L1_BUTTON) and
is_button_held(R1_BUTTON) and
was_button_pressed(L3_BUTTON)
):
state = STATE_TRANSITIONS[counter]
counter += 1State 2’s logic is similar, but the button that triggers an update is R3. You can fall out of states 1 and 2 by pressing a button other than L3/R3, or by going 200 milliseconds without pressing a button.
The state transition array is:
01 01 02 01 02 01 01 02 01 01 02 01 02 01 01This corresponds to the following button sequence:
L3, L3, R3,
L3, R3, L3,
L3, R3, L3,
L3, R3, L3,
R3, L3, L3If you hold L1+L2+R1+R2 while entering that sequence, the CAIMenuCinematic::fn_vUnlockAllCinematics function will execute.
You might think that this would give you access to all of the FMVs, but instead it replaces the Cinematic menu with a special Easter egg screen!
The screen has pictures of people who were presumably on the development staff. Everyone’s listed under goofy nicknames rather than their real names.
You can get to the same screen on the GameCube version, too. Start a new game, then quit and go to the Cinematics screen. Hold L+R and enter this sequence:
Y, Y, X,
Y, X, Y,
Y, X, Y,
Y, X, Y,
X, Y, YThe same trick works on the Xbox version. Once you’re on the Cinematics screen, hold L+R and enter this sequence with the left stick and right stick buttons:
LSB, LSB, RSB,
LSB, RSB, LSB,
LSB, RSB, LSB,
LSB, RSB, LSB,
RSB, LSB, LSBThere’s not a clear correspondence between the nicknames and the list of staff on MobyGames. If you know who the pictured people are, leave a comment!
Outro
For more on games with silly Easter eggs meant to entertain the development staff, see the articles on Bugriders, Need For Speed: High Stakes, The Crow: City of Angels, and Phoenix 3.
And for even more retro game reverse engineering articles, subscribe to Rings of Saturn here on Substack:









I like it when they have the Devs photos in a game, instead of just credits text!