Leftover Debugging Features
Now with even more breakage than in Splatterhouse 2!
The Menu Strings
Stored alongside the Options menu text, starting at $5015 (JP), are the following strings:
; after the text for the control options ROM:00005015 dc.b $B ROM:00005016 dc.b $12 ROM:00005017 dc.b 'OBJ TEST',0 ROM:00005020 dc.b $B ROM:00005021 dc.b $14 ROM:00005022 dc.b 'PLAYER TEST',0 ROM:0000502E dc.b $B ROM:0000502F dc.b $16 ROM:00005030 dc.b 'EXIT',0 ; immediately followed by the EXIT that is actually used in the options menu; I think this one is just in a different position
It's likely the debugging features were meant to be accessed in the Options Menu itself, but the code that would theoretically have accessed these strings was likely removed (see below, on removed cheats, to see what I mean about these clean removals). The patch codes I give below will jump you into these screens by selecting EXIT from the Options menu; the low byte of the patch code values are the screen mode numbers.
Use 479C:0009 (JP) (Gens/GS). This is identical to the OBJ Test from Splatterhouse 2, right down to having the same controls, though the weird drawing bugs are all gone and in their place... the numbers don't show up correctly (using garbage tiles instead of number tiles; the number tiles are in VRAM). Hit Start to return to the Options menu (which is how I eventually decided to go with doing this through the Options menu).
Use 479C:000A (JP) (Gens/GS). This is a simple player sprite animation test. Use Left and Right to change the direction Rick faces, Up and Down to select an animation, and Start to go back to the Options screen. (Do A, B, and C do anything? TODO). As with the OBJ TEST, the sprite number shown does not use the correct tiles (they are in VRAM).
At $2CC7 (JP)/$2D97 (US) lies the following text routine data, immediately after the title screen menu strings:
; from the JP version; the data is identical in the US version ROM:00002CC7 dc.b $11 ROM:00002CC8 dc.b $16 ROM:00002CC9 dc.b 'STAGE NO ',0 ROM:00002CD3 dc.b $E ROM:00002CD4 dc.b $17 ROM:00002CD5 dc.b 'PLAYER STOCK ',0
Nothing in the title screen code ever refers to these strings and there does not appear to be any code left that lets you select a stage and life count outside of the password system. In fact, the list of title screen submodes (which starts at $286C (JP)/$292E (US)) is mostly comprised of pointers to the first string on the list (the PRESS START BUTTON string) (starting after the submode that represents the title screen main loop), which may indicate that the code was completely removed from the game but the screen mode list was not updated.
Disassemble the rest of the game code to see otherwise, though I'm (andlabs) mostly convinced the submode list is obvious proof.
|This page or section needs more images. |
There's a whole lotta words here, but not enough pictures. Please fix this.
The game is mostly the same between versions, even down to the English text (which explains the Engrishy moments) though the US version added text explaining the basics of the game after you start. However, some tweaks were made to the gameplay when the game was localized outside Japan. Most notably, the spin kick was made more powerful, and the button inputs for special moves were switched around. Moves that subtract from Rick's powered-up form no longer do so. Time limits are shorter. The name also changed from Splatterhouse Part 3 to just Splatterhouse 3. In the emulated ROM version in the reboot, the digitized cut-scene pictures were completely redone.
The game has 5 main stages and six "Strange Zone X" stages that have the same name but are unique. You will enter a Strange Zone if you finish a stage quickly, and on the worst path where the timer is zero you will skip Strange Zones.
Memory locations of interest:
- 0xFF0166 : Stage number
- 0xFF018D : Backup stage number when in a strange zone, used to get back on the main game path once the zone is complete.
- 0xFF018C : Route flags; bits 1,0 store the outcome of the level you previously beat; bit 7 is set when you're currently in a strange zone.
|Stage Number||Stage Name|
|0x04||The Dark Stone|
|0x06||Strange Zone 0x06|
|0x07||Strange Zone 0x07|
|0x08||Strange Zone 0x08|
|0x09||Strange Zone 0x09|
|0x0A||Strange Zone 0x0A|
|0x0B||Strange Zone 0x0B|
The game's ending and progression of stages depend on how quickly you clear a level. Each stage has four possible outcomes when you finish it: the current time is above the 1st limit, above the 2nd limit, above zero, or zero. A table at address 0x3CAA stores the time limits. Some outcomes are disabled by setting the start time below the 1st limit by one second so it can never be achieved. Because the outcomes are meaningless after "The Mask" those table entries are garbage, they're the start of a following table.
|Stage||Start time||1st limit||2nd limit||Outcome if above 1st||Outcome if above 2nd||Outcome if nonzero||Outcome if zero|
|1st Floor||6:00||3:00||2:00||Strange Zone 0x06 then 3rd Floor||Strange Zone 0x08 then 2nd Floor||2nd Floor||2nd Floor|
|2nd Floor||6:00||3:00||2:00||Strange Zone 0x07 then Basement||Strange Zone 0x09 then 3rd Floor||3rd Floor||3rd Floor|
|3rd Floor||7:00||7:01||2:00||(Unreachable)||Strange Zone 0x0A then Basement||Basement||Basement|
|Basement||7:00||7:01||2:00||(Unreachable)||Strange Zone 0x0B then The Dark Stone||The Dark Stone||The Dark Stone|
|The Dark Stone||10:00||10:01||10:01||(Unreachable)||(Unreachable)||The Mask||The Mask|
|The Mask||60:00||(Invalid)||(Invalid)||(Unreachable)||(Unreachable)||Game over||Game over|
If you use a Game Genie code or similar to force the timer to a high enough value you can reach some of the unreachable outcomes; in this case the stage progression is incorrect and you will loop back and play older stages or the game will crash when it looks up out-of-bounds stage data.
Game event flags
The game stores the four timer outcomes for each stage yielding six sets of four flags. However the game only uses bit 0 (timer expired) for "1st Floor", "2nd Floor" and "Basement" when it comes to passwords and endings. While the other flags are computed they are never acted upon in-game.
|Stage||Flag address||Flag bit||Flag set||Flag clear|
|1st Floor||0xFF0090||0||Timer expired; Jennifer died||Timer was nonzero; Jennifer was infected or evaded capture|
|2nd Floor||0xFF0091||0||Timer expired; Jennifer became a mindless beast||Timer was nonzero; Jennifer survived her illness|
|Basement||0xFF0092||0||Timer expired; David died||Timer was nonzero; David survived|
There are four endings possible:
- All flags clear: Good ending, everyone lived.
- Any combination of Jennifer flags set: Bad ending, Jennifer died
- David flag set: Bad ending, David died.
- All flags set: Worst ending, Jennifer and David died.
The passwords encode the stage number, the three flags described earlier, and an additional byte related to memory address 0xFF0096 and may be related to cut scenes displayed between stages.
While it would seem that having passwords where both Jennifer flags are set seems contradictory as this indicates she died twice, these passwords covers the route where she dies during the 1st Floor and the timer expires while playing the 2nd Floor.
|Password||Stage||Jennifer flag 1||Jennifer flag 2||David flag|
|NOILCK||The Dark Stone||SET||SET|
|TSAEBD||The Dark Stone||SET||SET||SET|
|RAOBVW||The Dark Stone||SET||SET|
|REYALS||The Dark Stone||SET||SET|
|AIKITI||The Dark Stone||SET|
|HTRACM||The Dark Stone||SET|
|ELPOEB||The Dark Stone||SET|
|RUATNC||The Dark Stone|
|NILVED||Strange Zone 0x06|
|ETIRPS||Strange Zone 0x07|
|REYALF||Strange Zone 0x07||SET|
|GOFMTS||Strange Zone 0x08|
|HCTERG||Strange Zone 0x09|
|SERAGA||Strange Zone 0x09||SET|
|LEZAJM||Strange Zone 0x0A||SET||SET|
|TARESA||Strange Zone 0x0A||SET|
|SECOLQ||Strange Zone 0x0A||SET|
|SORABV||Strange Zone 0x0A|
|SARDNA||Strange Zone 0x0B||SET||SET|
|ROGIBA||Strange Zone 0x0B||SET|
|XASABR||Strange Zone 0x0B||SET|
|HARUON||Strange Zone 0x0B|
The Splatterhouse series
|NES||Splatterhouse: Wanpaku Graffiti|
|Genesis||Splatterhouse 2 • Splatterhouse 3|