Making new rooms is simple if you know hex, if you don't, then you probably shouldn't be reading the advanced section. First, here's the structure of a room: Example room: A98D 0A Room Index 02 Area 0C X 0A Y 08 Width 01 Height 70 Up Scroller A0 Down Scroller 01 Unknown 4 A9D3 Door Out E629 Event based state 02 State event condition A9B9 Alternate state header--- | E5E6 Default state | C79D71 Level Data | 1B Graphic Set | 05 Music1 | 27 Music2 | 84D0 FX1 | BB0E Enemy Population | 8B11 Enemy Set |Alternate state 0101 Layer 2 Scroll |header points A9D7 Scroll |to its state 0000 RoomVar | E8CD FX2 | 8B9E PLM | B84D BG_Data | 91F6 Layer1_2 | | C79D71 Level Data--------------- 1B Graphic Set 00 Music1 00 Music2 84D0 FX1 BB0E Enemy Population 8B11 Enemy Set 0101 Layer 2 Scroll A9D7 Scroll 0000 RoomVar E8CD FX2 8B9E PLM B858 BG_Data 91F6 Layer 1_2 Most, if not all, of Super Metroid's rooms' Door Out and Scroll pointers point to right after the end of the header. This of course isn't necessary. First thing is to find free space in bank $8F, should be easy enough to find. Add the pointer to this free space the mdb.txt file that SMILE uses. Of course, the easiest thing to do is just copy another room's header, which again, shouldn't need instructions. The other method is to make it from scratch, although I don't see why you would, that being said, all you need is a valid level data pointer and room size for the room to open in SMILE; ie. 00 00 00 00 01 01 00 00 00 0000 E6E5 CB92CE 00 00 00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 (reversed values) is valid for SMILE. The only thing you *do* need to handle in hex is states. There are 9 states coded into the game, and you're free to add more. The 'Event based state' as I've called it is a pointer to ASM, the pre-coded routines use the 'State event condition' as a parameter. eg. The E612 Event based state checks if an event has been done, it takes an 8-bit parameter which is which event it checks. Here are the event state pointers build into the game: E5E6 Nothing/Default E5EB dddd Checks which door you've come through E5FF Mother Brain's dead E612 rr Checks if an event has been set E629 bb Checks if a boss has been slayed E640 Checks if morphball has been collected E652 Checks if morphball and missiles have been collected E669 Checks if power bombs have been collected E678 Checks if speedbooster has been collected This by the way, is why SMILE groups specific events together and only allows you to choose from them (the length of the parameter). The order these are put in the room header is the order they're checked in, once a state checks out as true, it's used. So if you have the morphball state, followed by the Mother Brain check, (unless they don't have morphball) the Mother Brain state will never be used. This is why the default state goes last. All Event based states are followed by a pointer which points to the pointers that are used for the room (should be obvious); the exception is of course, the default state, the pointers follow straight after it. Last note, remember that all values and pointers are reversed! And some/most hex editors *insert* when you paste data, compromise the insert by deleting however many of the following bytes as you inserted.