Because doors don't do enough already

Special thanks to Scyzer and squishy_ichigo for teaching and reteaching my moron ass how to do this. I would also like to thank my future self for writing this, because my present self isn't totally confident that my immediate-future self won't forget it again someday.

Tools you'll need
SMILE (I used version 2.5 for this guide)
Hex editor (I use HxD)

If you've hacked Super Metroid even a little bit, you've probably gotten this pop-up before and had no idea what it meant, or why it didn't always appear.

Go to room 7ACB3 in SMILE and press the 'E' key while your mouse cursor is sitting on one of the pale blue "01" door tiles that are on the left edge. This takes you into room 7AFA3 and also gives you that pop-up. Yet somehow, entering 7AFA3 through the right-side door in 7A788 doesn't give you the pop-up at all. I shouldn't have to tell you by now that this is to make the lava in 7ACB3 start at its 'highest' point if you enter from the right door, while entering from the left door will always give you screen shakes and lava rising from the floor. That pop-up is just alerting you that this is happening. You'll be seeing it in any rooms that you do this to in the future.

Let me clarify that being able to use more than one FX1 pointer for a room does NOT mean you can use more than one effect at a time (like rain+fog or spores+lava). All you're doing is using a neighboring room's door to load an alternate FX1 pointer in place of the default, or changing a room's FX1 pointer without leaving that room by going through a door.

Time to pick a room and do something cool to it. Let's see... go to room 7A253, the good ol' red Brinstar shaft. We're gonna make this room fill up with water when you enter it by coming in through the very bottom-right door (03).

First, you must repoint the room's FX1 to somewhere less cramped, unless you already know exactly how many alternate FX1 pointers you'll need. By less cramped, I mean you should have several lines of free space above and below where you start from (you'll see what I mean in a minute). This room's FX1 pointer is $83:834E, which means going to 1834E with a hex editor. FX1 data is exactly and always 16 bytes long, so starting from 1834E, highlight the next 16 bytes like this:

Right-click those selected bytes and copy them, then scroll down until you hit free space. It doesn't matter exactly where you paste those bytes, as long as it's still somewhere in bank 83. Don't go further than 1FFFF and you'll be fine. I chose 1AE00. Paste them using Ctrl+B or right click > paste write, NOT paste insert! Leave a few lines of FF FF above and below the data you pasted, because you might need them later.

Above: less cramped!

Save the ROM with your hex editor now and go back over to SMILE. Change room 7A253's FX1 pointer from 834E to AE00, click Save Pointers, then click NO to the little window that pops up after that.

Click Edit > FX1 and give the room some rising water! Use whatever values you want if you already know how, or just go with the ones in the picture below. Either way, get the rising water set exactly the way you want it, then save the room with SMILE.

Next we're gonna need to look at some stuff in the neighboring room, so go to room 7A3DD and click Edit > Pointers. Note that the Door Out pointer is $8F:A404, which means going to 7A404 with your hex editor. Here we see the values F6 90 02 91, which are actually 2 pointers to the *real* door data that's in bank 83 (which we don't need to bother with). F690 and 0291 are the pointers, which are reversed, giving us $83:90F6 (190F6) for door 00 and $83:9102 (19102) for door 01.

Since it's door 00 that connects to room 7A253, that's the one we're interested in.

Head back over to 1AE00, where you pasted that FX1 data. Copy the whole line of FX1 data and paste it again in the next line under, so you've got two exact copies. Now change the very first two bytes of the first line you pasted (which are 00 00) to F6 90 and save the ROM with your hex editor. See where this is going?

Go back over to SMILE and change the FX1 pointer from AE00 to AE10, then click Save Pointers and NO to the extra pop-up. Click Edit > FX1 and make it whatever you want. This will be the room's default FX1 that it always uses except when it's flooding. More likely you'll just wanna change Surface New, Surface Speed and Surface Delay back to FFFF, and Surface Start to 09B0 so the room has water that isn't floody. Once you're satisfied, save the room, then change the FX1 pointer back to AE00 yet again.

Congrats! If you followed the steps, everything should be working the way you want it to... BUT WAIT! What if you want it to also flood when you enter through the super missile door on the other side? Easy.

Like before, you'll want to go to the room itself (7A618), look at its Door Out pointer ($8F:A63F), go there with a hex editor (7A63F) and note the 2-byte pointer to bank 83 (FE 91). Go to 1AE00 once more and copy that FX1 line, except this time, paste it above at 1ADF0 and change its first two bytes from 00 00 to FE 91. Finally, change the room's FX1 pointer from AE00 to ADF0. All done!

The default FX1 should always be at the bottom (1AE10), with the door-triggered alternates directly above it in any order, and the room's FX1 pointer pointing to the very top one (1ADF0). You can do this with as many doors that lead into the room as you want. It also works with doors that don't actually take you to a different room (such as the bottom-right area of the green Brinstar elevator room).

One last note: Be careful with rooms that have a lot of doors. It's really easy to accidentally enter the wrong door pointer into the FX1 data when the neighboring room has 12 of them to choose from. For example, say you wanted door 08 in room 79D19 to do something to the FX1 in room 7A0A4. Press 'D' on any of the door tiles to bring up the door editor. In the yellow box, you'll see how many doors the room has (in room 79D19's case, it goes up to door 08). Looking at its Door Out data at 79D40, we see: C6 8D D2 8D DE 8D EA 8D F6 8D 02 8E 0E 8E 1A 8E 26 8E. Here are those same values, just organized a bit:

C6 8D = door 00
D2 8D = door 01
DE 8D = door 02
EA 8D = door 03
F6 8D = door 04
02 8E = door 05
0E 8E = door 06
1A 8E = door 07
26 8E = door 08

End of guide. Go do stuff.

<<-- [top of page] -->>