Debug
There exists a fair amount of debug functionality leftover in the retail version of Castlevania: Symphony of the Night.
Below is a non-exhaustive list of the debug functionality found within the game.
Debug Print Messages
Debug prints occur throughout the game's execution via calls to FntPrint(...)
, but this data is not ever displayed to the screen (except when data decompression fails). By enabling debug print functionality, various aspects of the game's current state will be displayed on the screen.
Debug print functionality can be enabled with the following GameShark code:
- 800E3D5C 45BF
- 800E3D5E 0C00
- 800E3D60 FFFF
- 800E3D62 2404
This will replace 1 of 3 checks for the hitbox viewing functionality with FntFlush(-1)
, which will cause calls to FntPrint(...)
to be displayed starting at the top-left corner of the screen.
Debug Drawing Environment Counts
When debug prints are enabled, the current counts for each type of polygon can also be viewed with the following GameShark code and pressing the Select button on a 2nd plugged-in controller:
- 800E3D70 8BCF
- 800E3D72 0C03
Note: The Debug Print Messages code must first be enabled for these counts to be visible.
Debug HBLANK Info
When debug prints are enabled, the current HBLANK count can be displayed with the following GameShark code:
- 800BD1C0 0001
- 800E3D08 8C70
- 800E3D0A 0C03
Note: The Debug Print Messages code must first be enabled for this count to be visible.
Tileset / CLUT Viewer
The game includes a tileset viewer that also displays the currently-applied CLUT. The values for the current tileset and CLUT are hardcoded to be 0x20
and 0x200
, respectively.
The tileset viewer can be enabled with the following GameShark code:
- 800BD1C0 0001
- 800E3D00 8AC0
- 800E3D02 0C03
However, while the functionality to display this information remains in the game, the functionality to modify the tileset/CLUT values has been omitted from the final game. This results in only the aforementioned values being the only viewable combination.
This limitation can be bypassed with the GameShark code below, which aims to implement similar functionality.
Note: This code is very long. View at your own risk.
Full GameShark Code
The following GameShark code can be used to view different tilesets/CLUTs with the tileset viewer:
- 800BD1C0 0001
- 800E3D00 D928
- 800E3D02 0C04
- 801364A0 8009
- 801364A2 3C03
- 801364A4 749C
- 801364A6 2463
- 801364A8 0000
- 801364AA 9463
- 801364AC 8013
- 801364AE 3C13
- 801364B0 62B4
- 801364B2 9674
- 801364B4 00A0
- 801364B6 3062
- 801364B8 0005
- 801364BA 1040
- 801364BC 0020
- 801364BE 3062
- 801364C0 0002
- 801364C2 1440
- 801364C4 0001
- 801364C6 2694
- 801364C8 FFFE
- 801364CA 2694
- 801364CC 62B4
- 801364CE A674
- 801364D0 8014
- 801364D2 3C13
- 801364D4 900C
- 801364D6 9674
- 801364D8 A000
- 801364DA 3062
- 801364DC 0004
- 801364DE 1040
- 801364E0 2000
- 801364E2 3062
- 801364E4 0002
- 801364E6 1440
- 801364E8 0001
- 801364EA 2694
- 801364EC FFFE
- 801364EE 2694
- 801364F0 5000
- 801364F2 3062
- 801364F4 0004
- 801364F6 1040
- 801364F8 1000
- 801364FA 3062
- 801364FC 0002
- 801364FE 1440
- 80136500 0010
- 80136502 2694
- 80136504 FFE0
- 80136506 2694
- 80136508 900C
- 8013650A A674
- 8013650C 8AC0
- 8013650E 0803
The following controls can be used on a 2nd plugged-in controller:
Button | Description |
---|---|
Circle | Display next tileset |
Square | Display previous tileset |
Right | Display next CLUT |
Left | Display previous CLUT |
Up | Move forwards 16 CLUTs |
Down | Move backwards 16 CLUTs |
Note: These codes are currently incompatible with the Toggle Layers code.
Level Select
Within the level select functionality, the currently-selected level is displayed via FntPrint(...)
, thus it is recommended to enable debug prints. Otherwise, the only feedback from changing the currently-selected level is an audio cue (the same audio cue in the E3 demo).
Level select functionality can be enabled with the following GameShark code:
- 801B4A38 0004
The level select menu can then be entered by pressing Start at the main menu. The following controls are used for the level select menu:
Button | Description |
---|---|
Right | Move forwards 1 level |
Down | Move forwards 8 levels |
Left | Move backwards 1 level |
Up | Move backwards 8 levels |
Start | Load the currently-selected level |
E3 Demo Functionality
The "NORMAL / SPECIAL" selection functionality found in the E3 demo can be enabled with the following GameShark code:
- 801B4834 0004
However, this will not cause the background to fade nor will it display the "SELECT !!" text as the code to do this has been removed. Instead, it will display an offset blinking rectangle with the same selection audio cue found in the E3 demo.
Hitbox Viewer
The hitboxes of most entities (e.g. Alucard, enemies, pickups, breakables, etc.) can be viewed by using the following GameShark code:
- 800BD1C0 0001
- 801362B0 0001
Noclip Mode
Within this mode, it is possible to move through all collision and cycle through each of Alucard's sprites one frame at a time. It is also possible to disable Alucard's sprite entirely to get a better view of the area, as well as the ability to enable and disable this functionality on command.
You can enable this functionality by entering the following GameShark code, then pressing L2 to enable/disable Noclip mode:
- 80098850 0001
The following controls are used in noclip mode:
Button | Description |
---|---|
D-Pad | Move 16 pixels in the desired direction |
X (hold) + D-Pad | Move continuously in the desired direction |
Triangle | Toggle visilibity of Alucard's sprite |
Square | Display Alucard's next sprite |
Circle | Display Alucard's previous sprite |
L2 | Toggle noclip mode |
Interestingly, when the button settings screen is displayed, it's hardcoded to only display 7 values. However, if this is modified to display all 8 values, it can be seen that an 8th option does in fact exist, and that this option is mapped to the L2 button by default.
This is notable because かいはつ directly translates to the English word "Development" and is a common phrase often indicating leftover debugging functionality in Japanese games.
Exit Screen Freeze (?) Mode
The game is able to exit a frozen screen state (undocumented for now) by pressing Down on a 2nd plugged-in controller.
Toggle Layers
The foreground and background layers can be toggled on or off with the following GameShark code:
- 800E3D00 C509
- 800E3D02 0C03
The following controls can be used on a 2nd plugged-in controller to toggle the layers:
Button | Description |
---|---|
L1 | Toggle foreground |
L2 | Toggle background |
R1 | Unknown (800730A0 ^= 2) |
Note: This code is currently incompatible with the Tileset / CLUT Viewer code.
Control Doppleganger10
It is possible to control Doppleganger10 using a 2nd plugged-in controller by using the following GameShark code:
- 801C2E10 0000
The following controls can be used to perform special actions while controlling Doppleganger10:
Button | Description |
---|---|
R1 | Transform into bat |
R2 | Transform into mist |
Control Doppleganger40
It is possible to control Doppleganger40 using a 2nd plugged-in controller by using the following GameShark code:
- 801C1DD0 0000
The following controls can be used to perform special actions while controlling Doppleganger40:
Button | Description |
---|---|
R1 | Transform into bat |
R2 | Transform into mist |
Down (hold) + Triangle | Perform a high jump |
Control Richter (Boss Fight)
It is possible to control Richter using a 2nd plugged-in controller by using the following GameShark code:
- 801B5A68 0000
The following controls can be used to perform special actions while controlling Richter:
Button | Description |
---|---|
Square | Attack with Richter's whip |
Triangle | Item Crash |
R1 | Blade Dash |
R2 | Uppercut |
Up + Square | Use sub-weapon |
Richter's item crash will use Holy Cross by default, but can be modified by holding the corresponding button when pressing Triangle:
Button | Item Crash |
---|---|
(None) | Holy Cross |
L1 | Spiral Axe |
L2 | Hydro Storm |
Start | Lightning Bolt |
Select | Bible |
Additionally, the sub-weapon that Richter uses is based on the following criteria:
- Cross: Used by default.
- Holy Water: Used when Richter is within 80 pixels of Alucard, or when Richter is at least 24 pixels above Alucard.
- Axe: Used when Alucard is at least 24 pixels above Richter.
Load "dra000.bmp"
There exists functionality to attempt to load the file sim:c:\\bin\\dra000.bmp
while holding up and pressing Select on a 2nd plugged-in controller.
However, this will always crash the game since the function attempts to store the current framebuffer to memory address 0x80200000
.
Load "dra000.mov"
There exists functionality to attempt to load the file sim:c:\\bin\\dra000.mov
when pressing the Triangle button on the main controller.
This function will briefly display an error on screen before returning. However, forcing the game to skip this return will cause the game to crash since the same write to memory address 0x80200000
occurs immediately thereafter.
Underground Caverns Barrier Skip
The barrier separating the Underground Caverns from the Abandoned Pit can be broken by pressing the Triangle button on a 2nd plugged-in controller.
Note that this does not need a code to work and can be performed in-game with no modifications whatsoever.
This skips the need to travel across the waterfall gap and spawn the Skeleton Ape, as well as waiting for the Skeleton Ape to throw the barrel at the barrier.
Additionally, in the bottom-left room with the Oarsman directly under the Castle Entrance loading area, the Triangle button can be pressed on a 2nd plugged-in controller to play the same sound as the barrier breaking.
The player may need to enter the area from the right-hand side or travel right far enough to spawn the entity responsible for this functionality.
Sprite Viewer
There are many sprites in the game that can be viewed by using a 2nd plugged-in controller.
Unless otherwise noted, the controls for each sprite viewer are as follows:
Button | Description |
---|---|
Circle | Display previous sprite |
Square | Display next sprite |
Below is a list of sprites and their accompanying locations where this can be performed.
Blade Master (Colosseum)
A Sprite viewer for the Blade Master can be accessed by setting the entity's current_state
property to 0xFF
.
Owl Knight (Colosseum)
A sprite viewer for the Owl Knight can be accessed by setting the entity's current_state
property to 0x10
.
Valhalla Knight (Colosseum)
A sprite viewer for the Valhalla Knight can be accessed by setting the entity's current_state
property to 0xFF
.
Bone Ark (Catacombs)
A sprite viewer for the Bone Ark can be accessed by setting the entity's current_state
property to 0x10
.
Wall (Abandoned Mine)
A sprite viewer for the wall can be accessed by setting the entity's current_state
property to 0x10
.
Bone Pillar (Royal Chapel)
A sprite viewer for the Bone Pillar can be accessed by setting the entity's current_state
property to 0xFF
.
Skelerang (Royal Chapel)
A sprite viewer for the Skelerang can be accessed by setting the entity's current_state
property to 0x10
.
Spectral Sword (Royal Chapel)
A sprite viewer for the Spectral Sword can be accessed by setting the entity's current_state
property to 0xFF
.
Winged Guard (Royal Chapel)
A sprite viewer for the Winged Guard can be accessed by setting the entity's current_state
property to 0xFF
.
Succubus (Nightmare)
A sprite viewer for the Succubus can be accessed by setting the entity's current_state
property to 0xFF
.
Furniture (Long Library)
A sprite viewer for the furniture can be accessed by setting the entity's current_state
property to 0xFF
.
Flying Zombie (Long Library) [Unused]
A sprite viewer for the Flying Zombie can be accessed by setting the entity's current_state
property to 0x10
.
Spellbook (Long Library)
A sprite viewer for the Spellbook can be accessed by setting the entity's current_state
property to 0x20
.
Note: This sprite viewer uses the following controls on controller 2:
Button | Description |
---|---|
Right | Increase Z value (rotate along Y axis) |
Left | Decrease Z value (rotate along Y axis) |
Circle | Increase Y value (rotate along Z axis) |
Square | Decrease Y value (rotate along Z axis) |
Triangle | Increase X value (rotate along X axis) |
X | Decrease X value (rotate along X axis) |
Select | Reset all coordinates |
Additionally, the following controls are used on controller 1:
Button | Description |
---|---|
Up | Increase HZ value (move further away) |
Down | Decrease HZ value (move closer) |
Lesser Demon (Long Library)
A sprite viewer for the Lesser Demon can be accessed by setting the entity's current_state
property to 0xFF
.
Slogra (Castle Entrance)
A sprite viewer for Slogra can be accessed by setting the entity's current_state
property to 0xFF
.
Gaibon (Castle Entrance)
A sprite viewer for Gaibon can be accessed by setting the entity's current_state
property to 0xFF
.
Minotaur (Reverse Colosseum)
A sprite viewer for the Minotaur can be accessed by setting the entity's current_state
property to 0xFF
.
Azaghal (Reverse Colosseum)
A sprite viewer for Azaghal can be accessed by setting the entity's current_state
property to 0xFF
.
Note: This sprite viewer uses the following controls on controller 2:
Button | Description |
---|---|
Right | Increase Z value (rotate along Y axis) |
Left | Decrease Z value (rotate along Y axis) |
Circle | Increase Y value (rotate along Z axis) |
Square | Decrease Y value (rotate along Z axis) |
Triangle | Increase X value (rotate along X axis) |
X | Decrease X value (rotate along X axis) |
Frozen Half (Reverse Catacombs)
A sprite viewer for the Frozen Half can be accessed by setting the entity's current_state
property to 0xFF
.
Wall (Cave)
A sprite viewer for the wall can be accessed by setting the entity's current_state
property to 0x10
.
Azaghal (Death Wing's Lair)
A sprite viewer for Azaghal can be accessed by setting the entity's current_state
property to 0xFF
.
Note: This sprite viewer uses the following controls on controller 2:
Button | Description |
---|---|
Right | Increase Z value (rotate along Y axis) |
Left | Decrease Z value (rotate along Y axis) |
Circle | Increase Y value (rotate along Z axis) |
Square | Decrease Y value (rotate along Z axis) |
Triangle | Increase X value (rotate along X axis) |
X | Decrease X value (rotate along X axis) |
Flying Zombie (Death Wing's Lair)
A sprite viewer for the Flying Zombie can be accessed by setting the entity's current_state
property to 0x10
.
Dark Octopus (Reverse Caverns)
A sprite viewer for the Dark Octopus can be accessed by setting the entity's current_state
property to 0x10
.
Fire Demon (Necromancy Laboratory)
A sprite viewer for the Fire Demon can be accessed by setting the entity's current_state
property to 0x20
.
Dracula (Final Stage: Bloodlines)
A sprite viewer for Dracula can be accessed by setting the entity's current_state
property to 0xFF
.
Unknown (Olrox's Quarters)
A sprite viewer for an unknown entity that can be accessed by setting the entity's current_state
property to 0x10
.
Olrox (Olrox's Quarters)
A sprite viewer for Olrox can be accessed by setting the entity's current_state
property to 0x20
.
Wall (Olrox's Quarters)
A sprite viewer for the wall can be accessed by setting the entity's current_state
property to 0xFF
.
Skelerang (Olrox's Quarters) [Unused]
A sprite viewer for the Skelerang can be accessed by setting the entity's current_state
property to 0x10
.
Owl Knight (Olrox's Quarters) [Unused]
A sprite viewer for the Owl Knight can be accessed by setting the entity's current_state
property to 0x10
.
Owl Knight (Olrox's Quarters) [No Owl, Unused]
A sprite viewer for the Owl Knight (without the owl) can be accessed by setting the entity's current_state
property to 0x20
.
Granfaloon (Catacombs)
A sprite viewer for Granfaloon can be accessed by setting the entity's current_state
property to 0xFF
.
Minotaurus (Colosseum)
A sprite viewer for the Minotaurus can be accessed by setting the entity's current_state
property to 0xFF
.
Werewolf (Colosseum)
A sprite viewer for the Werewolf can be accessed by setting the entity's current_state
property to 0xFF
.
Gate (Colosseum)
A sprite viewer for the gate can be accessed by setting the entity's current_state
property to 0xFF
.
Wall (Colosseum)
A sprite viewer for the wall overlay (which hides the gate) can be accessed by setting the entity's current_state
property to 0xFF
.
Scylla (Underground Caverns)
A sprite viewer for Scylla can be accessed by setting the entity's current_state
property to 0xFF
.
Hippogryph (Royal Chapel)
A sprite viewer for Hippogryph can be accessed by setting the entity's current_state
property to 0xFF
.
Note: This sprite viewer uses the following controls on controller 1:
Button | Description |
---|---|
Square | Display next sprite |
Wall (Abandoned Mine)
A sprite viewer for the wall can be accessed by setting the entity's current_state
property to 0x10
.
Cerberos (Abandoned Mine)
A sprite viewer for Cerberos can be accessed by setting the entity's current_state
property to 0xFF
.
Gate (Reverse Colosseum)
A sprite viewer for the gate can be accessed by setting the entity's current_state
property to 0xFF
.
Wall (Reverse Colosseum)
A sprite viewer for the wall overlay (which hides the gate) can be accessed by setting the entity's current_state
property to 0xFF
.
Fake Trevor (Reverse Colosseum)
A sprite viewer for Fake Trevor can be accessed by setting the entity's current_state
property to 0xFF
.
Fake Grant (Reverse Colosseum)
A sprite viewer for Fake Grant can be accessed by setting the entity's current_state
property to 0xFF
.
Fake Sypha (Reverse Colosseum)
A sprite viewer for Fake Sypha can be accessed by setting the entity's current_state
property to 0xFF
.
Coffin (Reverse Colosseum)
A sprite viewer for the coffin can be accessed by setting the entity's current_state
property to 0xFF
.
Beelzebub (Necromancy Laboratory)
A sprite viewer for Beelzebub can be accessed by setting the entity's current_state
property to 0xFF
.
Death (Cave)
A sprite viewer for Death can be accessed by setting the entity's current_state
property to 0xFF
.
Death (Cave) [2nd Form]
A sprite viewer for Death can be accessed by setting the entity's current_state
property to 0xFF
.
Medusa (Anti-Chapel)
A sprite viewer for Medusa can be accessed by setting the entity's current_state
property to 0xFF
.
The Creature (Reverse Outer Wall)
A sprite viewer for The Creature can be accessed by setting the entity's current_state
property to 0xFF
.
Dracula (Reverse Castle Center)
A sprite viewer for Dracula can be accessed by setting the entity's current_state
property to 0xFF
.
Wall (Death Wing's Lair)
A sprite viewer for the wall can be accessed by setting the entity's current_state
property to 0xFF
.
Akmodan II (Death Wing's Lair)
A sprite viewer for Akmodan II can be accessed by setting the entity's current_state
property to 0xFF
.