1984 · Activision

Ghostbusters

This minisite was contributed by air, unorig. It’s currently claimed by unorig who is editing it to reach a Gold tier standard.

Bugs, claims the code contradicts, what was left in and never used, and the questions still open.

01 · Checked against the guides

Where the code and the guides disagree

The manual, online guides, and cheat lists make claims about the game that its code settles. Each of these was tested on the game's own code.

The claimWhat the code does
The manual: the game ends when PK energy reaches 9,999.1Nothing happens at 9,999. The game ends when the Keymaster and the Gatekeeper meet at Zuul, which in test runs happened anywhere from 8,495 to 9,999 (Map).
Online guides: GOOD TRY is the ending for having enough money but not reaching Zuul.GOOD TRY is shown when the Marshmallow Man catches two men on Zuul's street ($8B10, Gameplay).
Cheat lists: POKE 22014,9 gives unlimited lives.22014 ($55FE) is a character on the screen that the start-up clears and nothing reads.
Cheat lists: POKE 38454,96 makes everything free.True: it puts an RTS at the start of money_subtract ($9636), so cars, equipment and the Marshmallow Man's damage all cost nothing. The Play tab has it as a switch.

02 · Bugs

Four bugs, and what each one does

None of these stops the game. Three change what a player sees; one shows only in memory.

Bug: "more money than you started with" means "not less"

The meeting forecloses only when the balance is below the starting balance: the three-byte comparison lets an equal one through. A player who spends nothing and earns nothing goes on to Zuul, and at the end the game prints YOU MADE MORE MONEY THAN YOU STARTED WITH.

Bug: a blank name and 458 give a fortune that always loses

A blank name with account number 458 decodes to a top byte of hexadecimal $A0, which the game prints as ":" and calculates with as 100 (YOU HAVE $:00000). Spending money works, because the processor's decimal subtraction treats $A0 as 100. Earning it does not reach that far: money_add ($9664) stops at 99. At the meeting at Zuul the balance can never equal $A0, so the bank forecloses every time.

Bug: every drive leaves two bytes on the stack

State $14 reaches next_state with JSR ($8070) where every other handler jumps, and nothing takes the return address off again. The stack pointer sinks by two per drive. The stack wraps inside its page, and nothing the game keeps there is overwritten, so no player sees it.

Bug: ten traps read ":"

The status report (space in play) prints the number of empty traps as one character: the count plus the code for 0. The station wagon carries 11 items, so with at least $12,000 to spend it can hold 10 or 11 traps, and the report then says ":" or ";".

03 · Left in the code

An item nobody can buy, and a building nobody visits

Some of the game's data and code can never be reached in play, and one rule can leave a building out of the game for good.

Secret: an eighth item with a price and no shelf

The price table (item_price, $A1DC) has eight entries. Item 4, sprite shape $37, costs $600 and sets no equipment flag. No shelf holds it (shelf_shapes, $AAB3), so it cannot be bought. Its picture is still among the game's sprites, between the bait and the trap.

The ghost trap (left) and item 4 (right), unpacked from the game's sprite data and drawn in the shop's colours at four times the C64's pixels.

The picture looks like the trap with its doors open: the same base, with the same row of dashes, under two raised flaps. Item 4 also costs the same $600 as a trap. A second kind of trap may have been cut, but the code does not say what item 4 was meant to be.

A building the Marshmallow Man forgets

The game keeps one Marshmallow building ($80). If PK energy crosses the next thousand before the alert, a new building is picked and the old one is left at state $F8. It never ages out of it: the stage table sends stage 2 back to $F8. That building is never haunted and never stomped for the rest of the game, and it shows white to a sensor near the logo. In the eight runs from 5,000 no alert came at all, because Roamers reaching Zuul pushed the meter up a thousand at a time.

Never usedWhere
Speech phrase 0$F4EA table
The speech player's two-bit decoders$F267, $F3E2
Sound effects 1 and 4$3DC8, $3DED
Item 4, $600$A1DC
sprite_y_distance, set_balance_10000$9C76, $9CF1
Two runs of three NOPs, where a call was$90D1, $90DB

04 · Open questions

What we have not settled

Everything above was traced in the code or seen when the game ran. These are the questions the code leaves open, or that nobody has checked yet.