Under the microscope: Vigilante 8 and friends (Dreamcast, PlayStation, Nintendo 64)
New cheat codes for Vigilante 8, Vigilante 8: Second Offense, and Star Wars Demolition
Luxoflux developed three games before being acquired by Activision in 2002:
Vigilante 8 for PlayStation and Nintendo 64
Vigilante 8: Second Offense for PlayStation, Nintendo 64, and Dreamcast
Star Wars Demolition for PlayStation and Dreamcast
Each of the games uses a similar system for cheat codes: On one of the options screens, pressing certain buttons will reveal a hidden input field. You enter a passcode in the field, and its effect will be applied if it’s recognized.
It’s not just the user interface that’s common: all three games use a similar system for processing passcodes. To prevent prying eyes from reading them out of the binary, they are first converted to numeric values (Space=00, A=01, B=02, etc.). After that, they’re scrambled and checked.
The first of these games I looked at was Vigilante 8: Second Offense for Dreamcast. Its scrambling function is located at 8c0b07e0 (NTSC-U version). Here’s my Python adaptation of its algorithm, which is based on Ghidra’s decompilation of the SH-4 machine code:
def get_scrambled(numeric_input):
x = 0x7B
output_data = []
for n in numeric_input:
x = (x * 0x2B + 0x43) & 0xFF
if n == 0x00:
y = 0x5F
else:
y = n + 0x40
output_data.append(y ^ x)
return bytes(output_data)Take a look at some of the known passcodes before and after scrambling. Some of them have letters in the same positions. The scrambled versions of those passcodes match at those positions too:

Indeed, the x values in the function above don’t depend on user input, just position. The y values are the ones that vary by letter, and they’re XOR-ed with the x values. This means that if we know the scrambled version of each letter at each position, we can reverse the scrambling process.
Here’s my Python code that generates the (scrambled_data, position) → letter mapping:
letter_map = ' ABCDEFGHIJKLMNOPQRSTUVWXYZ'
scramble_map = {}
for i in range(len(letter_map)):
for j in range(10):
numeric_input = [0] * 10
numeric_input[j] = i
scrambled_data = get_scrambled(numeric_input)
x = scrambled_data[j]
scramble_map[x, j] = letter_map[i]This mapping allows for efficient reversal of the scrambled passcodes the game checks after input.
Vigilante 8: 2nd Offense (PlayStation, Nintendo 64, Dreamcast)
To access the passcodes menu, go to Options > Game Status. Then Select a player and hold L+R (L1+R1 on PlayStation).
This game’s scrambled data starts at memory address 8c112df0 (Dreamcast NTSC-U version). Descrambling produces this list of passcodes:
These all match with the ones on GameFAQs, except for LLA_PUENUT, which is new.
This gives you +50 on each player’s stats:
It works on PlayStation, Nintendo 64, and Dreamcast.
Star Wars Demolition (PlayStation, Dreamcast)
The next game I examined was Star Wars Demolition on Dreamcast. This game’s passcodes are entered by going to Options > Preferences and then holding L+R (L1+R1 on PlayStation).
The algorithm it uses for scrambling is identical to Vigilante 8: Second Offense. The function is at 801e8124 (NTSC-U Dreamcast) and the scrambled data starts at 801f9560. Descrambling yields these passcodes:
All of these are on GameFAQs except for GET_GUNGAN. What’s the effect? You get to hunt little Jar Jar Binks guys in the Droid Hunt game:
As far as I can tell, this is the same effect as the GUNGANHUNT passcode. I’m not sure why the developers put it in twice!
This works on the PlayStation version as well. Jar Jar says “So rude” when you attack him.
Vigilante 8 (PlayStation, Nintendo 64)
We’ll go backward now, to Vigilante 8 on PlayStation. Access the passcodes screen by going to Options > Game Status. Press X and then press Circle.
This game’s scrambling algorithm is different from the one in the other two games, but not by much. Its letter → number mapping has A=00, B=01, …, Space=1A.
Descrambling the data that starts at 801ef99c yields:
There’s a new one here, too! CHANGE_HOUSTON doesn’t appear on the cheat sites. As far as I can tell, it doesn’t do anything – Ghidra doesn’t detect any code that depends on the memory value it changes. Presumably it was meant to affect the character named Houston 3.
The Nintendo 64 version’s scrambling function is different from the PlayStation version’s, and it allows for numbers as well as letters in passcodes. Descrambling the data starting at 803f6448 reveals these:
There are four new ones here: GET_EVERYTHING, HIGHER_DENSITY, AIR_RESISTANCE, and CAR_RANDOMIZER.
GET_EVERYTHING unlocks everything, as you might expect:
HIGHER_DENSITY and AIR_RESISTANCE both set bits on the 4-byte field at 80181570. The game checks those bits, but the effect during gameplay isn’t obvious. One presumes they are meant to affect the game’s physics – leave a comment if you can detect a difference when they’re enabled.
CAR_RANDOMIZER sets a bit on the same field, but the game doesn’t seem to check it.
Outro
You can see the full script I used to recover the passcodes for each of these games on GitHub.
For more adventures in finding new cheat codes for retro games, see my archive. What should I be looking at next?

Appendix
Vigilante 8: 2nd Offense (PlayStation, Dreamcast)
Scrambled Passcode
-------------------- ----------
aba84fbe5bd1abbff985 GO_MONSTER
a2a84fb446deaea2e88e NO_GRAVITY
a4a85db64bdeb4a4f292 HOME_ALONE
a9ab52ba57d1b1bdf29e ELBICNIVNI
a0a85eb44bd2b7bdf592 LONG_MOVIE
a1ae48b650c0bbaaee84 MIXED_CARS
a8b559a551c0b7a5f08e DRIVE_ONLY
a0ab51ac50d0aabff39f LLA_DORTOH
a0ab51ac44cabda5e983 LLA_PUENUT*
a0ab51ac5fdcb7a7f282 LLA_KCOLNU
aeab51a040c0bea2ee92 BLAST_FIRE
bea640ba50c0bea2ee92 RAPID_FIRE
b9a954b646c0bea2ee92 UNDER_FIRE
aba84fa058d0afb4f198 GO_SLOW_MO
aba84fbe55c7a7b9f98d GO_MAX_REZ
aba84fa155d2b5a2f290 GO_RAMMING
a1a842b64bcca8aef993 MORE_SPEED
bdb259b05fc0a8a7fd8e QUICK_PLAY
a6a653b84bd6acb4e987 JACK_IT_UP
a4ae4fb051d6b4a2f290 HI_CEILING
a3ab54ac58daaeaef084 OLD_LEVELSStar Wars Demolition
Scrambled Passcode
-------------------- ----------
bfab5fa44bd2b7b4f399 SLOW_MO_ON
a0a84fb446deaeb4f399 LO_GRAV_ON
a2a84fb155dbbca2f984 NO_BADDIES
bea659a051c0aca3f99a RAISE_THEM
a1a846ba51c0aba3f380 MOVIE_SHOW
a1b25ca75dc0bbaaee84 MULTI_CARS
bba644a75bc0aba3f387 WATTO_SHOP
a9bf44a155ddadbfe884 EXTRABUTTS
aaae42b646deacaee987 FIRERATEUP
a5b343ac55c0acb9fd87 ITS_A_TRAP
bfa654ac59d0aea2f984 SAD_MOVIES
aea15dac52dabda7f583 BFM_FEELIT
b8af42bc40cbb4aee987 THROTTLEUP
a2a84fa351dab3a2f290 NO_PEEKING
abb25eb455d1b0bef283 GUNGANHUNT
aba244ac53cab6acfd99 GET_GUNGAN*Vigilante 8 (PlayStation)
Scrambled Passcode
---------------------------- --------------
a1a85ea040daaacbeb9f2526a8dc MONSTER_WHEELS
bea254a657dad8acee96362ab0d6 REDUCE_GRAVITY
aba830a05dd8b0bfef92252aaac8 GO_SIGHTSEEING
a5c747ba58d3d8a5f3834027adca I_WILL_NOT_DIE
bfa255d355d3b4cbf198362aa1dc SEE_ALL_MOVIES
bfa65db634dcb0aaee962337a1dd SAME_CHARACTER
aba65eb447bfb9a7f0f72826b6ca GANGS_ALL_HERE
a5a946ba40dad8bdf5842937abdd INVITE_VISITOR
bfa253a151cbd8a7f394212fa1dc SECRET_LOCALES
abae5dbe51bfbcaa9c802f31afdc GIMME_DA_WORKS
a8a251b758c6d8a6f584332aa8ca DEADLY_MISSILE
afaf51bd53dad8a3f3823337abc1 CHANGE_HOUSTON*
a4a642b751ccaccbf3914022a8c3 HARDEST_OF_ALLVigilante 8 (Nintendo 64)
Scrambled Passcode
---------------------------- --------------
aba244ac56d6bfb4eb9f2526a8dc GET_BIG_WHEELS
adb85dbc5bd1a7acf9832134a5d6 A_MOON_GETAWAY
bca840a658deaca2f3993f2cb1db POPULATION_OUT
a0ae46ba5ad8a7adf3852535a1dd LIVING_FOREVER
a0a85eb44bccb4a2f892332babd8 LONG_SLIDESHOW
a1ae48ac59deaca8f4882322b6dc MIX_MATCH_CARS
aba65eb447c0ada5f0982328a1cb GANGS_UNLOCKED
abae5dbe51c0bcaae3962c2aa1c1 GIMME_DA_ALIEN
a0a246b658c0aba3f3853420b1db LEVEL_SHORTCUT
aba244ac51c9bdb9e583282aaac8 GET_EVERYTHING*
a1ae43a05dd3bdb4fd833422a7c4 MISSILE_ATTACK
aaae42b64bd1b7b4f09e2d2ab0dc FIRE_NO_LIMITS
a5b851be4bcbb7befb9f3f24b1d6 I_AM_TOUGH_GUY
aba84fa151deb4a7e588332fabd8 GO_REALLY_SLOW
a1a648ac46daaba4f082342aabc1 MAX_RESOLUTION
a4ae57bb51cda7aff999332ab0d6 HIGHER_DENSITY*
adae42ac46daaba2ef83212da7ca AIR_RESISTANCE*
afa642ac46deb6aff39a2939a1dd CAR_RANDOMIZER*














