Action replay code for unused sky in Saturn Doom

fafling

Gear Supporter
This is based on elements published by Mattfrie1 on Doomworld : Saturn Doom has an unused inferno sky background, labeled SKY03 in the game files, that was probably intended to appear in the Ultimate Doom levels where the PSX version displays the animated fire sky (levels 13, 16 to 23 and 30). Instead, the city sky, labeled SKY05, is the one that appears in those levels as well as in later Doom II levels (42 to 47).

Mattfrie1 created an Action replay code that allowed to switch those 2 skies, which would put the inferno sky in all levels where the city sky appeared, not only the ones with the fire sky in the PSX version.

Here's an AR code that displays the inferno sky in the intended Ultimate Doom levels, while leaving the city sky in the Doom II levels :
  • The master code is the same for the 3 regions, it's the default one on my Action replay plus :
    F6000914 C305
    B6002800 0000
  • US version cheat code :
    1601A2EA E133
  • Japanese version cheat code :
    1601A2EE E133
  • European version cheat code :
    1601A2E6 E133
This code is compatible with the AR code for nightmare difficulty.

The AR codes work in Kronos emulator without needing the master code. Codes should be input after the Sega logo, in Tools > Cheat Lists. For Doom, set the video core option to OpenGL, it has less graphics issues than Compute shader in that game.

Below are screenshots of the japanese version in the 1st level where these sky appears, Command center (left is without the code, right is with it) :

Command_center_sky.jpg

Be aware that due to holes in distant floors or ceilings, there will be instances where the red inferno sky will be partially visible where it shouldn't. This also happens with the city sky, but is less often obvious due to the lower part of that sky being mostly dark colors, and missing flat segments being generally surrounded by dark textures thanks to diminishing light shading.

Here's an example in Command center, holes become visible as red pixels in the 2 distant dark corridors (left is without the code, right is with it):

Command_center_holes.jpg

So the switch to the city sky instead of the inferno sky for those levels may not have been a typo, but actually done on purpose by the programmer to hide some of the holes.

In fact, if you try any other sky than the city sky as the animated fire sky replacement, there are visible sky pixels through those holes at this very spot, so the city sky may have been chosen just like this. It's possible to select a different replacement sky by changing the last digit of AR code. Use 1 to 7, the others (0 and 8 to F) display the same sky as the last level played where the replacement doesn't occur, of a fully black sky if no such level has been played before.

Another fact supporting that hypothetical hole hiding strategy is that the sky layer gets disabled when there's no sector with visible sky on screen, leaving a black background. There's no reason to do that performance wise as the sky is a VDP2 layer, so it may just as well be to hide holes in the flats. You can see that behavior in Kronos by disabling the sprite layer. However, notice that In the above screenshots, there's no sector with visible sky on screen, yet the sky layer is still enabled since it's visible through the holes in the flats. It's only disabled if you move forward or strafe to the right. Why ? I don't know...

Regarding the making of the AR code, the lead to find it was given by the PSX version reverse engineered code : in p_setup.c, P_LoadSectors looks for a map parameter named F_SKY followed by 2 digits. Those 2 digits are added to the string SKY to form a texture name. P_Init then checks if the 2nd digit is 9 to enable the fire sky.

Since the Saturn version shares WAD contents and part of its codebase with the PSX version, the method is :
  • Find F_SKY with a text search in the memory editor of Yabause.
  • Set a breakpoint on a byte read on the F_SKY string address.
  • The breakpoint is triggered by a string comparison function during a level loading.
  • Stepping into the function code until it returns jumps to a code that, when the comparison with F_SKY is true, checks if the 2nd character following F_SKY is 9 (the fire sky digit in the PSX version). If that's the case, it's replaced by the character 5 (city sky digit) before being appended to a SKY0 string. The AR code changes the replacement character to 3 (inferno sky digit).
  • The resulting SKY0n string is subsequently used to identify the files to be loaded for the sky graphics (SKY0n.CHR and SKY0n.MAP in directory SKYS).
 
Top