Extending the demo: The House of the Dead 2 (Dreamcast)
Localization status: not quite done yet
Last Halloween, I patched the demo version of The House of the Dead to extend it and allow exploration of the prototype build it’s based on. In this edition, I’m giving the demo version of The House of the Dead 2 the same treatment.
This demo was built on 1999-05-31, which is after the retail Japanese version (1999-03-02) and before the first English language version (1999-07-28). So the gameplay is complete, but (as we’ll see) the localization isn’t quite finished yet.
The demo normally limits you to the first two stages, but the disc has more data than that. Below I’ll describe how I lifted out the restrictions to make more or less everything playable. I’ll also compare this build to the final U.S. version.
Get my patch from SegaXtreme!
Patching the mode select menu
The demo normally only lets you select Arcade or Options at the menu — the other items are grayed out:
By diffing memory snapshots (you can use Cheat Engine for this), I found that the cursor position for this screen is stored at address 0c2a04fe. By tracing references to that address in Ghidra, I found that the function that handles input for this screen is loaded to 0c489348.
That function has a section that looks like this in pseudo-Python:
if P1_PRESSED_BUTTON & (START_PATTERN | A_PATTERN):
if MODE_SELECT_CURSOR == 0: # Arcade mode is enabled
switch_screens(0x00)
elif MODE_SELECT_CURSOR == 5: # Options mode is enabled
switch_screens(0x0c)
else: # Everything else is disabled
returnI patched out the final return to allow the other menu items work:
0c489564 0900 # Don't return earlyThis fixes everything but Ranking mode, which crashes for unclear reasons in this build
Patching the options menu
This menu has grayed out items as well.
The demo uses a similar trick to the one above to disable these. Here’s some pseudo-Python that captures what it’s doing:
if get_pressed_button(DOWN_PATTERN):
OPTIONS_CURSOR -= 1
allow_select = OPTIONS_CURSOR in (0x03, 0x04, 0x06, 0x0a)
elif get_pressed_button(UP_PATTERN):
OPTIONS_CURSOR += 1
allow_select = OPTIONS_CURSOR in (0x03, 0x04, 0x06, 0x0a)My patch changes the the allow_select logic for both the “down pressed” and “up pressed” paths:
0c432d2c 1800 # Pretend like every option is legal
0c432dbe 1800 # DittoPatching access to later stages
After you finish a stage, the counter at 0c278798 increments. The function at 0c463e40 determines what should happen after that: it lets you keep playing after the first stage, then kicks you to the To be continued screen after the second:
stages_completed += 1
if stages_completed == 2:
game_mode = 0x07 # To be continued
else:
game_mode = 0x01 # Keep playingI changed the logic to match the final game with the patches below:
0c463e7c 0688 # Check for 6 stages completed
0c463e82 0988 # Go to the Name Entry screenNow the game proceeds normally after stage 2, and once you’ve finished the last boss the Name Entry screen appears:
Comparisons
There are lots of text differences between this version and the final North American version. Here are some examples…
The introduction screen for Original Mode uses “Carry Out” instead of “Take Out” as in the final game:
For comparison, the Japanese version’s screen looks like this:
The explanatory text for Boss Mode is less coherent in this version:
This version has the Blood Color option shown — it’s missing in the final version:
Just to linger on that for a moment, you can enable the blood color option in the North American Dreamcast version by setting 0c279bf3 to 01.
Outro
For more explorations of prototype builds hiding out on demo discs, see my Extending the demo page.
Rings of Saturn will return this weekend to discuss a Nintendo 64 (and PlayStation) game that’s on the opposite end of the spectrum from HotD2. Subscribe to get the article when it comes out!











I had the PC port of the first game back in the day and was disappointed they didn't bring Original Mode to more of the ports. It was a fun mode. Glad to see they kept it for this game too.