12 ->
^^
vv
List results:
Search options:
Use \ before commas in usernames
Edit history:
P.JMan: 2010-04-17 07:36:02 am
P.JMan: 2009-10-05 04:37:29 pm
I like Big Butts and I can not lie
Last Updated: 17th, April, 2010 12:33 PM GMT


Note: we probably should have some portion of each section telling the reader where to find the specific command in smile, such as the "View>Tile Size>8x8 Scroll Editor" 'directions' for how to get to each particular option in SMILE, like my FAQ does. i dont see how to integrate this into the FAQ's current structure yet though

Note2: If available, add some stuff on the Special Level Editor. Oh yeah, and please, if you care, place in some of the vital or important addresses in I'm a Genius! And if you want, add the default doorlist index.

Recent FAQ Edit (put in for the last time edited only):
P.JBoy, section 3.6: added Changing the Rate for Collecting Items section.

Code:
              _________                                         
             /   _____/__ ________   ___________                
             \_____  \|  |  \____ \_/ __ \_  __ \               
             /        \  |  /  |_> >  ___/|  | \/               
            /_______  /____/|   __/ \___  >__|                  
                    \/      |__|        \/                      
           _____          __                .__    .___         
          /     \   _____/  |________  ____ |__| __| _/         
         /  \ /  \_/ __ \   __\_  __ \/  _ \|  |/ __ |          
        /    Y    \  ___/|  |  |  | \(  <_> )  / /_/ |          
        \____|__  /\___  >__|  |__|   \____/|__\____ |          
                \/     \/                           \/          
 .___        __                              __             .___
 |   | _____/  |_  ____   ________________ _/  |_  ____   __| _/
 |   |/    \   __\/ __ \ / ___\_  __ \__  \\   __\/ __ \ / __ | 
 |   |   |  \  | \  ___// /_/  >  | \// __ \|  | \  ___// /_/ | 
 |___|___|  /__|  \___  >___  /|__|  (____  /__|  \___  >____ | 
          \/          \/_____/            \/          \/     \/ 
              .____                      .__                    
              |    |    _______  __ ____ |  |                   
              |    |  _/ __ \  \/ // __ \|  |                   
              |    |__\  ___/\   /\  ___/|  |__                 
              |_______ \___  >\_/  \___  >____/                 
                      \/   \/          \/                       
          ___________    .___.__  __                            
          \_   _____/  __| _/|__|/  |_  ___________             
           |    __)_  / __ | |  \   __\/  _ \_  __ \            
           |        \/ /_/ | |  ||  | (  <_> )  | \/            
          /_______  /\____ | |__||__|  \____/|__|               
                  \/      \/                                    
                                                                


---------------------------------------------------------------------------------------
Feel free to make any changes to this Table of Contents.  It's very preliminary, not to mention it's coming from someone who doesn't know everything about SMILE.
---------------------------------------------------------------------------------------

Code:
/--------------------------------------------------------\
| __________     ___.   .__                   _____      |
||__    ___/____ \_ |__ |  |   ____     _____/ ____\     |
|  |    |  \__  \ | __ \|  | _/ __ \   /  _ \   __\      |
|  |    |   / __ \| \_\ \  |_\  ___/  (  <_> )  |        |
|  |____|  (____  /___  /____/\___  >  \____/|__|        |
|               \/    \/          \/                     |
|_________                __                 __          |
|\_   ___ \  ____   _____/  |_  ____   _____/  |_  ______|
|/    \  \/ /  _ \ /    \   __\/ __ \ /    \   __\/  ___/|
|\     \___(  <_> )   |  \  | \  ___/|   |  \  |  \___ \ |
| \______  /\____/|___|  /__|  \___  >___|  /__| /____  >|
|        \/            \/          \/     \/          \/ |
\--------------------------------------------------------/


I.  Intro to SMILE (?)

II.  Established Hacker Recommendations
|
|-II.1  Testing [X]
|-II.2  Backup Warning [X]
...

III. SMILE Editing
|
1.  Beginning SMILE
|
|-1.1  Changing Rooms [X]
|-1.2  Tiles [X]
|---1.2a  Placing Tiles [X]
|---1.2b  The Clipboard [X]
|---1.2c  Tile Properties [X]
|---1.2d  Slopes and Basic BTS [X]
|---1.2e  Room Memory Limitations [X]
|-1.3  Item/Door PLMS [X]
|-1.4  The 8x8 Scroll Editor [X]
|-1.5  Changing Graphics Sets [X]
|-1.6  Changing Music [X]
|-1.7  Map Editor [X]
...

2.  Intermediate SMILE
|
|-2.1  The FX1 Dialog [X]
|-2.2  Room Properties [X]
|-2.3  State Properties [X]
|-2.4  Enemy Properties
|-2.5  Room Expansion
|-2.6  Moving Rooms [X]
|-2.7  Pointers [X]
|-2.8  The Graphics Editor [X]
|-2.9  Samus Aran Beauty Salon (SABS) [X]
|-2.10 Text Editor [X]
|-2.11 Game Behavior Dialog
|-2.12 Layer 2 [X]
|-2.13 Door Editing [X]
|---2.13a Doors [X]
|---2.13b Elevators [X]
|-2.14 Save Stations
...

3.  Advanced SMILE
|
|-3.1  Adding New Doors [X]
|-3.2  Making New Rooms [X]
|-3.3  Changing Game Physics (Is this an advanced technique or more intermediate?)
|-3.4  Scrolling PLMs
|-3.5  Increasing Room Size Limits [X]
|-3.6  Change the Rate for Collecting Items
...

4.  Other SMILE Functions
|
|-4.1  Level to Bitmap
|-4.2  Backup and Recovery System
|-4.3  Headers
|-4.4  ROM Expansion
|-4.5  IPS Patch Creation/Application [X]
|-4.6  File Compare [X]
...

5.  Random SM Quirks
|
|-5.1  Strange Rooms [X]
|-5.2  Scrolling Sky Error [X] <- Updated with a bit more info!
...

6.  SMILE Version History (what's new.rtf) [X]

IV.  Appendix
|
|-A.1  Music Combinations (Copy from mdbformat.txt)
|-A.2  FX1 Palette Blend List [X]
...

Bonus: Crys is dah name's guide to designing levels!



---------------------------------------------------------------------------------------

I.  Intro to SMILE


*Ask Jathys if he wants to write this*


II.  Established Hacker Recommendations


    SMILE doesn't always work exactly as you may think it does or want it to. You should do extensive testing of rooms while/after you're building them using SMILE's room test feature by pressing E in the level editor where you want to appear, you'll need to set up your emulator with SMILE with the options at File - Preferences - Run Settings. When in doubt about something, always try to test it, you don't want to spend a large amount of time building a room only to find that it doesn't work because of some minor glitch that could've been avoided.



    Random (or not-so-random) errors can sometimes creep up on you while editting in SMILE. Even during normal level editting and not just while making risky edits, you should be backing up every time you accomplish something you deem significant. During what can be deemed risky editting, such as room expansion, where you know errors are likely to occur, it's best to be making even more frequent backups of your work. Also keep a few backups for long term archival purposes in case you run into an error you missed a few days ago and it's such a critical error that you can't work around it. The easiest way to backup your work is just to make a copy of the ROM after you've saved your changes. SMILE also has a backup system, but it has its own quirks for you to learn. If you haven't figured out how it works, it's best to rely on manual backups, which are more simple to understand, although they take up more space.

   
   
Code:
/------------------------------------------------------------\
|__________              .__              .__                |
|\______   \ ____   ____ |__| ____   ____ |__| ____    ____  |
| |    |  _// __ \ / ___\|  |/    \ /    \|  |/    \  / ___\ |
| |    |   \  ___// /_/  >  |   |  \   |  \  |   |  \/ /_/  >|
| |______  /\___  >___  /|__|___|  /___|  /__|___|  /\___  / |
|        \/     \/_____/         \/     \/        \//_____/  |
|                                                            |
|  _________   _____  .___.____     ___________              |
| /   _____/  /     \ |   |    |    \_   _____/              |
| \_____  \  /  \ /  \|   |    |     |    __)_               |
| /        \/    Y    \   |    |___  |        \              |
|/_______  /\____|__  /___|_______ \/_______  /              |
|        \/         \/            \/        \/               |
\------------------------------------------------------------/



1.1 Changing Rooms


    When you open SMILE you'll be shown a picture. (Samus Aran Larry King Interview in V1.0, mesh of other stuff in V0.7, no clue what you see in earlier versions)  This isn't a room so you must choose a room you want to edit.
    To change rooms, all you need to do is click on the small drop-down window in the mid-upper-right of the editor.  In the drop down menu will be a list of the rooms you can edit.  Choose one of them and start editing.
    *NOTE*:  Some rooms have strange quirks in them and should not be edited.  Refer to section 5.1 Strange Rooms for more details.



1.2 Tiles


    This section and its subsections deals with the basic aspects of room creation, such as placing tiles, copy and paste, and slopes.



    Placing tiles is easy.  All you have to do is left click on any one the tiles along the bottom of the screen and then place them in the room by left clicking again in the main window.  You can also click and drag to create multiples of the same tile.
    If you right click on a tile in the main window, you'll copy it to the clipboard (more on that in a bit).  You can now place that tile down without having to pick it up from the bottom window.  If you right click and drag across multiple tiles, you'll copy all of them to the clipboard.  You can then paste down multiple tiles for quick room building.




    When you copy a tile, it gets sent to the clipboard.  The clipboard is shown by default when you open SMILE, but to know where it is, it's the left tab under the room selection drop-down box.  It's also labeled "Clipboard" :P.
    Selecting multiple tiles will copy them all to the clipboard.  From there you can paste them wherever you need them.  However, if you only want to paste some of the multiple tiles selected, click on the individual tiles on the clipboard.  The tiles will turn a burgundy color.  When the tile is burgundy, it will not be pasted with the rest of the tiles.
    Lastly, by checking the Horizontal/Vertical Flip boxes, you'll flip the contents of the clipboard horizontally/vertically.



 
  The tile properties are the basic attribute of the block. There are 16 types, and you can choose which one you want from the scroll bar just under the clipboard. Once you select the tile property, it's applied to the first block in the clipboard.
 
  Most of the properties are pretty basic. "Air. X-RAY." is a normal air block and is affected by x-ray; "Slope." allows slopes to be used on the block; "Air. Fool X-RAY." is just like normal air except it's unaffected by x-ray; "Treadmill." is a block that slows or speeds up Samus based on its BTS; "Shootable Air." is a block that you can pass through just like air, but when you shoot it, it crumbles; "Horizontal." is a block that copies everything from the tile to the left of it except the graphics; "Air???" is just unknown; "Bombable Air." is like shootable air except it crumbles when you bomb it rather than shoot it; "Solid Block." is a normal solid block, nothing special about it; "Door." is what you move into and the game transitions the room; "Spike Block." are blocks that hurt you when you touch them; "Crumble Block." is a block that crumbles when Samus comes into contact with it; "Shot Block." is just like shootable air expept solid, when you shoot it, it crumbles; "Vertical." is like horizontal, it copies everything from the tile above it except the graphics; "Grapple Block." is a block that Samus can grapple onto using the grappling hook; finally "Bomb Block." is like shot block, except it crumbles when you bomb it rather than shoot it.




    BTS is a special block attribute that when used can create all kinds of effects. This determines how a block is constructed, how it behaves when shot, how it respawns. To apply BTS attributes to a tile, drag the BTS you want to use on top of a tile.

  Using BTS, you can make slopes and shotblocks (respawning or not). Slopes are mostly common-sense; drag the slope you want over to the tile. In order for a slope to work properly in-game, however, you need to also drag the green "box" tile "behind" the slope, so to speak. Slopes won't interact with flat surfaces without the green box BTS at the high end of a slope:
              _
/| = Slope    |_| = Box  _=Ground

  _ ____      _____
/||_|        /|   
-Right!-    -Wrong-

  If you find your mod has slopes that you can't run up normally, make sure there's a green box BTS behind them. That's the only complication for making slopes.
 
  You can also use BTS to make sets of blocks that crumble in groups (2x2, 1x2, 2x1). Notice that there's a dropdown list under BTS that can be selected? Change the value of that list (default is 00) to 0A, and make sure the BTS is not vertically or horizontally flipped. Then, drag one of the BTS values in the first row onto the first tile in your group (the topleft-most tile in your 2x2, 1x2, or 2x1). The first four in the top row are for respawning blocks, and the last four in that row are for non-respawning blocks. Once you've dragged the BTS to a tile, right-click that tile and change its tile type to whatever you want (shot block, bomb block, crumble block, etc.)
  You'll then need to check "horizontal flip" and "vertical flip" on the BTS properties panel. When the BTS is flipped both ways, drag the final red circle onto the tiles that are a part of the group (all tiles but the topleft-most one in your 2x2, 1x2, or 2x1 group). This should give the tile a small green circle. If this tile is directly below the topleft-most tile in the group, set its tile property to "vertical"; otherwise, set its property to "horizontal". It sounds complicated, but it's very easy to do, so experiment with it and you'll have the hang of it in no time.


 
    Choose any room and save it.  Do you see the fraction in the title of the window?  That shows the room's memory.
    Example: 600/5000.  what you've used / how much space there
    The top of the fraction shows how much space you've currently taken up in a room.  The bottom half show the total amount of space for the room, or the "cap".  As long as you are under the cap, you'll be fine.  However, if you go over the cap and foolishly choose to ignore the automatic warnings SMILE will give you, you need to watch because the other rooms may start to get overwritten, or "eaten", by the room you're editing.
    Some tiles take up more room memory than others.  Slopes and BTS also contribute to the amount of memory taken up.  Be careful that you don't go over the room cap by saving often and checking that fraction.


1.3 Item/Doorcap PLMs


Hover Over PLM -> Right-click -> Type
    All items are classified as "PLMs" in SM. Thus, changing PLMs is the same, and you can change anything else classified as a PLM into an item and vise versa.

    PLMs are basically items, gates, doorcaps, and other little weird things hanging around in Super Metroid. Rightclick on a PLM and scroll through the list of numbers to change one PLM to another. Like even the "S" Icons and "Arrow" PLMs can be changed into a Charge Beam or something. You just need a unique Index number for items and doors.  If you have two items with the same index and unknown values the game will count whichever one you picked up first and remove the other one from the game.  This is because the game thinks that you've picked up all items with that index.  A good example of this happening is in Limit where you are presented with the choice of either taking Super Missiles or Power Bombs.  The same thing can happen for the doorcaps as well.
    Try to find an item in a different room you know you won't use, move it out of reach, and use its index for your new item. Door caps and items use different indexes though, so a door cap with say, index "03" can't be removed to allow you to add an item with the index "03." However, the low bits of the unknown is also used as part of the index, and so an unknown 01 and index 03 will be different from a unknown 00 index 03. Changing the unknown to 80 will make the item or door always respawn.
    Some gray doorcaps have unique indexes.  You'll want to keep track of these, as they only open when certain events have been activated, normally when a certain boss has been defeated.  These will be noted in a later section.
    In addition, setting a gray door's Unknown to 0C will make it open only when a certain number of enemies in the room are killed.  This can be changed in the Enemy Editor, explained later.

Values for Doors and Shutters ~[Squishy_Ichigo]~

DOORS
  Grey Doors - Set the high nibble to:
      Main Boss (00 - 03)
      Mini Boss, Mother Brain (04 - 07)
      Torizo (08 - 0B)
      Enemy Killed (0C - 0F)
      Always Closed (10 - 13)
      Dachoras and Etecoons Saved (Event Bit 000F is set) (18 - 1B)
(if I recall correctly, This info is in the latest version of smile.)
  Open With Item - Set the Items High Nibble as 02, Doors High Nibble as 00,  and Low Nibble the same (Can't be in the same room)

SHUTTERS/GATES
  Change the index of the gate top.
      00-Standard Normal shot gate facing left
      02-^ facing right
      04-Missile gate facing left
      06-^ facing right
      08-Super Missile gate facing left
      0A-^ facing right
      0C-Power Bomb gate facing left
      0E-^ facing right
  Also: the shaft piece needs an index of 00 and unknown of 80.
  ALSO: The shutter must always be the PLM index before the Shot gate.
Never have the pieces in two different scroll areas



1.4 The 8x8 Scroll Editor


Preferences -> View -> Tile Size -> 8x8 (Scroll Editor)
    This lets you edit scroll info. Blue and green both have full scroll capability, and a red block means the "camera" will not scroll within that block. (Thus you dont want to have the player move through these red blocks. They're mostly for hiding stuff.) Green and blue scrolls will react differently to floor doors/ceiling doors and green scrolls tend to show tiles all the way to the "bottom" and "top" of the room, while blue ones hide the bottom 2 lines of tiles in a room. The top 2 lines of a room will never be visible, the status bar will always cover them.


1.5 Changing Graphics sets


    On the right side of SMILE there are a couple of drop-down boxes.  One is labeled Graphic Set and the other two are labeled Music.  To change the graphics for that room, use the drop down box to choose the graphics set you want.  Keep in mind you have to change the background of the room to one that naturally draws its tiles from the new graphic set to make the room look right.  You will do this by changing the values in the Pointers dialog, explained later.


1.6 Changing Music


    This is easy enough to do.  Right under the Graphic Set box are two drop-down boxes labeled Music.  Changing the selections in these two boxes to right combinations will change the music in that room.  A list of the Music Combinations can be found in the Appendix.


1.7 Map Editor


Tools -> Map Editor

  This lets you edit the map of an area. It's not that different from editing rooms. While looking at the map, you can hit "E" to enter (one of) the room(s) located at the spot the mouse is pointing at, or hit "M" to move your current room's location to the mouse cursor's location. Be sure to save your map, of course.


Code:
/---------------------------------------------------------------------------\
|.___        __                                  .___.__        __          |
||   | _____/  |_  ___________  _____   ____   __| _/|__|____ _/  |_  ____  |
||   |/    \   __\/ __ \_  __ \/     \_/ __ \ / __ | |  \__  \\   __\/ __ \ |
||   |   |  \  | \  ___/|  | \/  Y Y  \  ___// /_/ | |  |/ __ \|  | \  ___/ |
||___|___|  /__|  \___  >__|  |__|_|  /\___  >____ | |__(____  /__|  \___  >|
|         \/          \/            \/     \/     \/         \/          \/ |
|  _________   _____  .___.____     ___________                             |
| /   _____/  /     \ |   |    |    \_   _____/                             |
| \_____  \  /  \ /  \|   |    |     |    __)_                              |
| /        \/    Y    \   |    |___  |        \                             |
|/_______  /\____|__  /___|_______ \/_______  /                             |
|        \/         \/            \/        \/                              |
\---------------------------------------------------------------------------/


2.1 The FX1 Dialog


Edit -> FX1
    This can change whether theres water, acid, lava, etc. in the room. (You have to experiment with the "surface numbers" under it to get it to whatever level you want.) The A/B section under that has a lot of stuff on animating spike tiles, changing bg effects like the waterfall effects in Maridia, etc.
   
    Warning: If the FX1 boxes are red, don't edit this, as it's disabled in that room, because the game doesn't have space for it.

More Indepth with FX1 ~[Squishy_Ichigo]~

Select -
  RED - Use the FX1 Pointer of another room to change this rooms FX
  WHITE - Fully editable
  YELLOW - Two or more FX depending on Door you come through (door pointer) Find a door pointer by looking at door out of a room connected to this room
  ADDING $10 bytes allows you to change the other FX properties for that room. (Only if the box is yellow!)
  Example: If the pointer isn't FFFF or 0000 (ex. C000) adding $10 bytes (ex. C010) will allow changes for other FX changes. (Change it back to the original number when done (ex C000))
Layer3Type - type of FX1
Palette Blend - Color the FX1 will have
Surface Delay - How long to wait before it starts rising to Surface New
Surface Speed - Speed at which it rises
Surface New - Were it rises to
Surface Start - Beginning point
  ALSO: Surface # counts in pixels from the top (Counts in Hex of course!)
        1 tile = 10 pixels
        1 scroll area = 16 tiles
        1 scroll area = 160 pixels
      Example : 0000 is at the top, and 0010 is 1 tile down, 0020 is two tiles down, 0100 is one scroll area down)



2.2 Room Properties


Edit -> Room Properties
    The height and width fields will change the height and width of the room.

    Warning: Changing width (expanding horizontally) will screw up the current tile configuration of the room and you'll have to redo it. Changing the height will only add a bunch of garbage below the normal room though, so you can clear that space out and use it.

    Warning: When expanding rooms horizontally, you will find that it kills some of the tile formations you may need. For example, since the only way to get doors of specific numbers is to
copypaste other doors of the same number, you may screw up your room if you destroy the doors in it. Thus, what you should do is to copypaste every door in your room near each other into a small clump (but keep them fully formed and normal) so they're next to each other, then copy this and keep it in SMILE's memory while you do the expansion. Then you can expand the room horizontally and after that, copypaste the doors back in and place them back where you need them.

    If the room has scroll blocks, you have to use the Scroll editor to assign the space you just added green, red, or blue blocks.

    Warning: There are limits to how big you can make a room. Namely, the tile data limit for that specific room and the scroll data limit. If you try to make it too much bigger than normal, you can cause errors, so don't push it. Especially with the scroll data (through the scroll editor). If you add too many scroll blocks, you may get rooms after the one you're editting being "eaten" and thus totally destroyed, which you definitely don't want. Thus, don't expand rooms too much beyond their normal capacity unless you know what you're doing. Especially important is backing up the game before expanding rooms too much - to test how large you can safely get them. It is possible with hex-editing to design rooms without fear of size limitations. This is covered in the Advanced SMILE section.

    One saving grace about the SM engine is, it interprets no scrolls on a particular block as a green scroll - so you can have rooms that have no scroll blocks through part of them and still have the room work in most cases.


2.3 State Properties


Edit -> State Properties
    You can change under what conditions a room goes into another state. When you're in the second state (or third/fourth state depending on which you want to alter the conditions for), go to state properties. There will be a drop down box with many different options, such as "zebes alive," etc. Using these, you can alter what conditions will cause that state to load. If you go to that option while the default state is up though, it'll just say there are no values to alter.


2.4 Enemy Properties


Hover Over Enemy -> Right-click -> Species
    Basically any enemy can be changed into any other with the right configurations. When in doubt, look for a sample enemy thats placed in the original game and works there. Then copy its data and enter that data into your own enemy in a different room. Be sure to copy every value, because although some variables have a range within which you can alter the enemy's behavior, some enemies just won't work if you leave the Graphic Unknown 00 or such. (For example, Space Pirates.)

    Whenever you're altering which enemies are in specific rooms, be sure to remove enemies you won't be putting in a room from the "allowed" list and adding the enemies which you will be using to the list as well.

    As you alter more enemies you'll run into specific quirks that are unique to specific enemies - like Metroids have to be in slot 001 to work and they don't always make the correct sound effects - or the fact that Covens don't seem to work outside the Wrecked Ship. The slots seem to be specifically for graphics. If you have two different enemies in slot 007 for example, the enemy earlier on the list in slot 007 will take on the pallette of the later enemy in slot 007. You can use this to your advantage to get some bizarre color combos, like purple Rios using Zoomers and many other interesting palette shifts.

PM: I guess I could help add to this section with some details about the variables. Anybody who has a clue or info to add to the blank spots and such, please contribute.
Species ID: The 4-digit ID number, and the name in the yellow box (some of these are actually misleading, by not according to their official name). If you got the Chrono Trigger Knight (usually exposed by Offscreen Enemy to 0,0), the enemy is actually there, it's just not registered in the enemy index.
HP: How much damage it can withstand (corresponds with vulnerabilities and the projectile damage)
Damage: How much energy they take from you (this is assuming you're just wearing the Power Suit only, Varia divides by 2, Gravity by 4, I think)
Width/Height:
Sound:
Death Animation: How they blow up when killed.
00-small round, 01-screw attack, 02-large round, 03-small series, 04-large series
Grapple: How they react when you shoot the Grapple Beam at them. (the following values are the last two digits, just leave the first two digits as 80. Format is grapple effect, enemy affect unless said otherwise)
05-latches, stops until released, 06-ignores, stops, 07-curves, unaffected, 0A-latches, killed, 0F-stopped, unaffected, 14-latches, unaffected, 19-latches, delay die, 1E-latches, Samus hurt and knocked off, 23-die Samus die (I guess insta-kill on Samus if she latched on), 37-enemy killed, 3C-enemy becomes untouchable
Hurt Flash:
Layer:
00-very front, 02-in front of Samus, 05-between Samus and background, 08-behind all
Palette: Simple enough for most enemies (exceptions are few, including bosses that have palette state-shifts). You can shift palettes like in the GFX Editor.
Vulnerable:
Initiation AI:
Item Drop: Affects the chances of what pickups the enemies drop.
Enemy Tiles:
Enemy Touch: What damage you get by touching that enemy.
Enemy Shot: Same thing, only from projectile shots.
8023-Normal harm, 804C-no effect, A953-Mocktroid, EDEB-Metroid, 802D-normal shot hit to enemy, DC1C-shot reflected
PB Reaction: What they do after getting hit by a Power Bomb.


2.5 Room Expansion


Edit -> Room Properties
  See 3.5 and 2.2.


2.6 Moving Rooms


Tools -> Map Editor


2.7 Pointers


Edit -> Pointers

    Level Data-The pointer to the location where the room's data (tiles) is stored. Note that the bank can be changed; this means you can point anywhere in the file.

    FX1 (Bank 83, 18000-1FFFF)- The effects for graphics and liquids in a room.

    Enemy Population (Bank A1, 108000-108FFFF)-The information for what enemies belong in a room.
   
    Enemy Set (Bank B4, 1A0000-1A7FFF)-Information for physical placement and type of enemies in the room. This is different from population.

    Scroll (Bank 8F, 78000-7FFFF)- The scroll pointers for a room. Since you can use the scroll editor, you probably shouldn't change this unless you know what you're doing.
  0000 = All screens with blue scroll blocks
  0001 = All screens with green scroll blocks


    Unknown1/RoomVar-For Jathy's RoomVar editor. No information about this system is currently available. Best to leave it alone.
Note: RoomVar (State) only works in 1.23.

    FX2 (Bank 8F, 78000-7FFFF)- You almost never needed to change this, most rooms just use 0000; it factors into the landing site areas in Crateria and a few other rooms. This is also used for the "exploding Zebes/Ceres" effect in the escape sequence.

    PLM (Bank 8F, 78000-7FFFF) - Determines what PLMs are in a room.

    BG_Data (Bank 8F, 78000-7FFFF)- changing this will change the background configuration. Go find a room you like the background of, check out its number, for example, B920 or whatever, and you can go to a different room, enter it as that rooms BG_Data and use it in that room. If the BG_Data of a room is 0000, then the Layer2 bg is being used instead of the BG_Data pointer.

    Layer1_2 (Bank 8F, 78000-7FFFF)- Affects segments of the backgrounds in specific rooms but it seems to be a major focus in parts of the backgrounds of Maridian rooms and the "landing site" areas in Crateria.
   
    Door Out (Bank 8F, 78000-7FFFF)-Points towards info on how many doors are in a room and where they lead.


2.8 The Graphics Editor


Tools -> Graphics Editor

  The Graphics Editor is a powerful and handy tool. It can be used to add in entirely new tilesets or completely retool old ones.
 
  Palette Editor-Used to change the colors used by tilesets. Each tileset has eight palettes. The first color in every palette is actually the "transparent" color; no matter what color you set this to, it will always be invisible in-game. The first two palettes are used in CREs and by PLMs and shouldn't be edited recklessly; the first three usable colors (the ones that come after the invisible color) in the third and fourth palettes are also used by PLMs.
 
  The palette, for no apparent reason, is limited to 218 bytes in Super Metroid by default. Going over this limit will likely corrupt tilesets after it, so don't do it! If you want a bigger palette, you can instead change the pointers for it via hex-editing. This process is explained in the Advanced guide.
 
  You can also save a palette for editing outside of SMILE with the "Save TO" option, or load an edited palette into the graphics editor with the Load FROM" option. Size limits still apply when loading in new palettes, though.
 
  Tile Table Editor-This is used to edit the tile table of a tileset (the tiles in the bottom window of SMILE). At the top of this window is a set of four 8x8 boxes; these four boxes compose one tile. On the right is displayed the 8x8 tiles that can be used; drag one of these onto the 8x8 box in the tile to replace it. Each individual box has can be flipped horizontally and/or vertically and can use a different palette set. Clicking on a box makes it "background" which means that Samus/sprites will always be drawn in front of it instead of behind it; a background box will be displayed with a small red box in its middle corner. Be sure to click "Save to ROM" when done editing each individual tile, or changes will be lost.
  IMPORTANT! Adding new tiles to UNUSED (little white x's) portions of the table can completely corrupt later tilesets! Be sure to back up before taking that chance!
 
  Tile Editing (Export)-If you want to draw entirely new tiles for a tileset, you need to export and edit its graphics file (GFX). There's a couple applications that can edit these files; I recommend Tile Layer Pro (TLP). You can make CREs (information used across all tilesets, like door appearances, missle pickups, save stations, etc.) or individual tilesets into graphics files. These files can then be opened in TLP and edited. When you've created new graphics and are ready to import them back, use the appropriate "Save to ROM" option to import the edited GFX file back in.

  Special GFX-For editing intro screens or the title screen.
 
  PM's Note regarding Mode 7: Most tile editors are incapable of doing this format (even Tile Layer Pro). One that's capable I'm aware of at the moment is in WindHex32. Since SMILE can't read this format in levels conventionally (those Ceres rooms that are mentioned in 5.1, though they don't matter much), it's best to leave it alone.
 
  And another thing: If you're asked to limit the palette (such as the Escape State in Ceres), use a backup first. Casually, the palette range is 211-218.


2.9 Samus Aran Beauty Salon


Tools -> Beauty Salon

  The Beauty Salon allows you to edit Samus' suit palettes and a bit more.
 
  Samus Palettes:
    Suit-Select the suit you want to edit.
    Condition-The suit palette changes depending on various factors. The colors for screw attack or the suit's warm glow in heated areas are affected here. When changing the suit colors, be sure to change all conditions, so that the suit doesn't change colors all the time.
    Samus Picture-Displays the new colors.
    Palette Options-You can change individual colors on the palettes on the top-middle portion of the screen by clicking on them and editing the three color bars at the bottom-left. Please don't give Samus a neon green/yellow/pink armor. Be gentle on the eyes of your hack's players.
    Other Options-You can use the displayed options to more easily edit the varying palettes used under certain conditions. The bottom-right color bar affects what color is pulsed or washed into when using the Heat Glow or Wash Out Colors options.
   
  After editing each condition, be sure to use the "Save to ROM" button to save changes done.
 
  Shifting the bar under the Samus Picture to the right allows you to edit a few other features, like the palette for the title or intro screens. The offset of the "I'm a genius!" option can be changed to the offset of any palette in the game and the amount of colors located at that address. Obviously you shouldn't mess with this if you aren't a genius.

 
2.10 Text Editor


Tools -> Text Editor

  Self-explanitory, really. This can be used to edit the text in the intro, the text that appears at the beginning of escape sequences, or the names of areas on the map.


2.11 Game Behavior Dialog


  These are almost all self-explanitory functions. All values here are stored in hex (except for escape timers), so if you set a Big Energy pickup's energy value to "10" you'll actually get 17 energy from it.

Edit -> Special -> Game Behavior


2.12 Layer 2


Edit -> Special -> Layer 2 -> Add|Remove

  Layer2 can be used for backgrounds. Note that adding a second layer is almost definitely going to take up extra tile space in the room, and making complex backgrounds will take up even more room. Keep in mind the limits of your room's size when doing this!


2.13 Door Editing


Hover over door tiles -> Shift+Right-click -> Various Door Options
    Shift+Rightclick on the back of "Door A" and select clone door, then enter a name. Then go find whatever door you want to link it to, for example "Door B", clone that door, then go back to Door A and shift+rightclick it again and select "Edit door." Select whatever you named the clone of Door B and then click 'transfer properties' and 'remember'. Then go to Door B and repeat that process only give it Door A's information.

    Important: If your door is going to transverse areas, like from Crateria to Brinstar, you need to manually set the "bitflag" to 40. If you don't do this, the map will get screwed up. Leave the mouse over the second "field" in the door editor and you'll see that field is the bitflag. It's usually 00.

    Important: Doors are tied to a specific door # in the door editor. If you delete a door with a harder to find #, you may run into problems. Don't delete doors carelessly.

To make any tile a door, or change the door # ~[Squishy_Ichigo]~
  Double click on the desired tile in the bottom left window of SMILE to bring up the "Make Defaults" window.  This window allows you to change the defualt property and BTS value of the tile.  For doors, your going to want the "Propery Byte" to be set  "Door" and the "BTS" to be set to the number you want the door to be. You could also use the scroll down "act as" bar for the tile your currently holding.


    You don't have to worry about the color of doors - as the portion of the door that gives it its color is merely a door cap - a PLM that can be easily dragged and placed on different doors to your liking, as long as the room has PLMs in it.

    Some rooms will not accept ceiling or floor doors. These are typically rooms with no scroll blocks. There is also a difference between green and blue scroll blocks with regard to how they interact with ceiling or floor doors. If you're getting an error while going through one, try changing the scroll near it from green or blue or visa versa. Floordoors seem to have an affinity for blue scroll areas and ceilingdoors have an affinity for green. However, this is not always the case, in some rooms its reversed or they won't work at all. Don't plan out door positions without testing to see if they work with regards to ceiling or floor doors, as they are more finicky than left/right doors.

    Also, while elevators work similar to door transitions, it's not recommended that you try to edit them in SMILE yet, unless you really know what you're doing.



Please note that I do not know everything about elevators, namely their bitflags and what they do. I just copy bitflag settings from pre-existing elevator doors and it's worked thus far.

SMILE's file:

D73F (it's an elevator*)
[Special] = 2C00
[Speed] = 0000/0001 for down/up
[Speed 2] = Y position to make the elevator first appear when entering the room on an elevator. 0018 is a common value for elevators going down into a room.  0Z40 works quite well for elevators going up into a room, where Z is the screen just below where you emerge from.

*Do not include this in the Enemy Allowed list or it will crash your room.
**Door tiles with a RoomID of 0000 must be directly underneath the elevator, or you won't be able to stand on and use it.
***Elevators need 2 door in their path to function correctly.  More information on this is included with the door editor.


The first thing you need to know about elevators is how to set up their doors. It's not difficult. Underneath the elevator enemy, you need door tiles with code that has no room ID. You really only need the first 3 boxes in the door editor. Just use the bitflags from another elevator door and I don't think the direction really matters for this one. This is a sample door that's working in my hack.
0000 F8 03 00 00 00 00 0000 0000

For the door tiles that cause the room transition while on an elevator, it's the same thing, only with a room ID involved. Another example:
B236 A0 02 00 00 00 00 0000 0000

Now that you know all you should need to know to create doors for custom elevators, the more tricky parts come into play.

Quote from: SMILE files
[Speed 2] = Y position to make the elevator first appear when entering the room on an elevator. 0018 is a common value for elevators going down into a room.  0Z40 works quite well for elevators going up into a room, where Z is the screen just below where you emerge from.

About this, you can get some interesting graphics errors if you make the elevator appear outside the range of the room itself, but please refrain from doing so, it may cause other more serious errors. The one time I tried ended up with the room being corrupted somehow, since then I've just followed SMILE's instructions here and its worked out well.


How to set up an elevator to pass through multiple rooms. The checklist of needed materials:

1. An elevator enemy in every room
2. 2 rooms for each room in-between the top and bottom rooms of the shaft.

There is a reason all elevators in Super Metroid only have one door transition on their way. The direction you set an elevator to go when you ride it also sets the direction the elevator moves when you enter the room on an elevator. An elevator that heads up will only head down when you emerge into the room on an elevator, and vice versa. The direction of the door you go does not affect which direction the elevator heads.

So, what can you do? Notice I mention 2 rooms for each room in-between the top and bottom.  When you ride down, you will head through one half of those rooms, each with the elevator enemy in them set to up. Then, when you ride the elevator back up, the door up will point to the other half, which will have the elevator enemy set to down. A simple rule is every room you go through should have an elevator the opposite direction of the first room.

In case you didn't quite get that, here's a visual example.

Rooms: 00(D) , 01(D), 02(U), and 03(U). (D and U mean the elevator enemy in them is set to down or up, respectively)

The setup for going down from the top is this order:

00(D)
02(U)
03(U)

For going back up, you want to go through:

00(D)
01(D)
03(U)


One last note. When riding down on an elevator, they tend to be whiny about going all the way down to go through a door that is on the bottom of the room. If you ever encounter problems with elevators stopping short of the door, put the door one screen up from the bottom and make the bottom screen a red scroll. That usually fixes the problem.


2.14 Save Stations


Edit -> Area Load Stations

Region : The area its in (Ex. Crateria, Brinstar, etc)
Index : (using SMILE 1.32) The same number as the [low] on the save station PLM
RoomID: the room its in
Door Data: value for a door that connects to that room, just press "L" over a door in another room that connects to RoomID.
Unknown: Usually 0000, sometimes 0001?
Scroll X: Horizontal Scroll - Counts "scroll areas" for example, 0000 is the top left 0100 the next one to the right, and so on!
Scroll Y: Same as Scroll X, just with vertical. EX. 0000 is the top left, and 0100 is the next one down!
Samus Y: Vertical count on pixels 0000 is the top, and inceasing the number goes down
Samus X: Horizontal count on pixels 0000 is the middle?, increasing the number goes right
Save:
Done:
Thread title: 
Edit history:
P.JMan: 2010-04-17 07:38:59 am
P.JMan: 2010-04-17 07:37:54 am
P.JMan: 2010-04-17 07:28:01 am
P.JMan: 2010-04-17 07:27:14 am
P.JMan: 2009-10-05 04:38:54 pm
I like Big Butts and I can not lie
Code:
/------------------------------------------------------------\
|   _____       .___                                     .___|
|  /  _  \    __| _/__  _______    ____   ____  ____   __| _/|
| /  /_\  \  / __ |\  \/ /\__  \  /    \_/ ___\/ __ \ / __ | |
|/    |    \/ /_/ | \   /  / __ \|   |  \  \__\  ___// /_/ | |
|\____|__  /\____ |  \_/  (____  /___|  /\___  >___  >____ | |
|        \/      \/            \/     \/     \/    \/     \/ |
|  _________   _____  .___.____     ___________              |
| /   _____/  /     \ |   |    |    \_   _____/              |
| \_____  \  /  \ /  \|   |    |     |    __)_               |
| /        \/    Y    \   |    |___  |        \              |
|/_______  /\____|__  /___|_______ \/_______  /              |
|        \/         \/            \/        \/               |
\------------------------------------------------------------/



3.1 Adding New Doors


  Adding new doors is one of the easier things to do in hex, but learning it for the first time is a little complicated, so be sure to make a back-up. Here's a step-by-step guide. You'll need a hex editor for this! If you don't have one, find one online, many of them are free and easy to use. I personally use HxD.
 
  Open up your Super Metroid ROM in SMILE. Go to Edit -> Pointers. Notice the "Door Out" information there? there's four characters that can be edited there, and two before them in grey that can't be. These six values are actually three sets of two. Let's take the landing site of Crateria: the pointer for this room's doors is 8F 92 7B. Now, plug those numbers into the two boxes at the bottom of the Pointer window. It should look like this: $8F 927B. Notice that, as you type these numbers in, a set of somewhat-corresponding numbers appears at the very top of the window. Strange, though: 927B is the same, but 8F turned into 07!
  The reason why this happens is a bit complicated, and not really important for what we're doing here in adding doors. You just need to open up your Super Metroid ROM in your hex editor and use its goto function. Type in the new address in the top of the window (07927B) and you'll be taken to a bunch of numbers and letters.
  Hmm, this stuff doesn't make any sense. What in the world does "16 89 22 89 2E 89" mean? Well, that stuff's actually more pointers! It's a lot of fun, isn't it? So if we want to add new doors, we need to go to where this information is being stored. Well, that place happens to be bank 83 (don't worry about why it's bank 83, it just is). So let's jump up there. But wait, where the heck is bank 83? That's easy enough to figure out... type it in on the pointer window! putting in 83 in there gives us a new address to go to: 18000. So let's jump there.
  Well, there's a bunch of stuff here. We want to add new doors without screwing up anything that's already here. Now, we have to use bank 83, because... well, we have to, okay? You don't need to worry about why. Fortunately there's a nice big chunk of free space (all those FF's) at the bottom of this bank (bank 83 spans from 18000 to 1FFFF). So, starting around 1AD80, we can go ahead and make new door data. Using one line for each door you want to have in the room, type in this filler data:

  F8 91 00 05 8E 16 08 01 00 80 00 00 FF FF FF FF

  The particular values aren't particularly important anyway, it's just good to have something there. You'll be able to edit where this door goes in SMILE after we change the pointers. One line of this equals one door, so for a room that has (or will have) three doors, paste that door in three times. This is what it should look like at the end, starting from 1AD80:
 
  F8 91 00 05 8E 16 08 01 00 80 00 00 FF FF FF FF
  F8 91 00 05 8E 16 08 01 00 80 00 00 FF FF FF FF
  F8 91 00 05 8E 16 08 01 00 80 00 00 FF FF FF FF

  Note the address at the first byte of each door. In this example, it's 1AD80. The second door is at 1AD90, and the third door is at 1ADA0.

  Now, we have the door data here we need, so what we need to do next is go back to bank 8F and set up some pointers there to lead to these doors. To do this, we'll want to go to the end of bank 8F where there's also some free space. Let's jump to 78000 and look through that bank (78000-7FFFF)...
 
  Darn, not as much space here, is there? It's okay, though, we only need one line for each room. 7E9B0 looks clean. That's what we'll use. Remember the address for the doors? 1AD80, 1AD90, 1ADA0? Well, the game already knows the bank or the "1" in that address, so we don't need that. What we DO need is a pointer for where in that bank the doors are.
  Pointers here are REVERSED, though! We can't just type in AD80! Switch those bytes around, baby. You should end up with 80 AD 90 AD A0 AD FF FF... Oooh, but there's one more thing to do. Change the two FF's after the last door's pointer to 01 01, so that SMILE doesn't weird out trying to read it. This is what we should end up with at 7E9B0:
 
  80 AD 90 AD A0 AD 01 01 FF FF FF FF FF FF FF FF
 
  That's it! you've made new doors and a new door pointer. Now the only thing left to do is to go to the room you want to use these three brand new doors in and change its Door Out pointer to the new address (in this case, 7E9B0). Remember, the game knows the bank or the "7" so you just need to type in "E9B0" in the Door Out box and save your pointers.
  If you're using SMILE 1.32 you should be fine; if you're using SMILE 1.23 or older the program will crash at this point. Don't worry, go back into the room and see if your new door shows up in the door editor. If it does, problem solved, and you've got a new door. Once you've done this one time, you'll never forget, just like riding a bike, only without the wind in your hair.


3.2 Making New Rooms


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 pointr 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.


3.3 Changing Game Physics



3.4 Scrolling PLMs



3.5 Increasing Room Size Limits


  If you're tired of running out of space for a room, there's a cure. You'll just need some free space in the SMC to work with. SMILE has an option for expanding ROM space, so that's the best way to get some more room. The banks created by the "expand ROM" option will start at E0 and go on from there. A single bank is good enough for at least a dozen large rooms, so let's just expand it once for now.
  What you'll want to do next is open up the room you want to edit and pull up the pointers window. Change the Level Data pointer to point to free space. For your first new room, this would be E08000 (300000 in hex). Note this is E0-8-000 and not E0-0-000! Pointers will never have anything below 8000 in the second two bytes! As long as you make sure you're above 8000 for the bytes after the bank, go ahead and save, and you'll see right away that your size limit has changed to some ridiculous value. You can now edit to your heart's content and not worry a smidgen about silly room size issues.
  There is one more thing you should do, though, and that's add this room to the "level_entries" text file for SMILE, stored under the Smile/files folder. Add its hex location (300000) at the end of the file. This will make sure that SMILE keeps you from overwriting other rooms.
  Any time you decide to do this to rooms hereafter, you'll need to take an extra step and open up your ROM in a hex editor. Check where the free space begins after your new room at the very end of the ROM, so that you're not overwriting your first new room with your second one. If your new room goes from hex address 300000 to 301200, you'll want to use an address somewhere else. If you want to leave yourself a few hundred bytes in case you decide to edit the old first room later on, You should pick an address like 301400. Plug that into your pointer window to see what the pointer for that location should be (in this case, it's E09400, again, NOT E01400, as that's not above 8000!). Put this value into your Level Data pointer, and save. Don't forget to add this room's hex address (301400) to the "level_entries" file!


3.6 Changing the Rate for Collecting Items


There's a load of RAM addresses and values around $8B:E62F:
At $8B:E70D, there are 5 RAM pointers: $09C4 $09D4 $09C8 $09CC $09D0
At $8B:E717, there are 5 16-bit values: $0064 $0064 $0005 $0005 $0005

It takes the value from each RAM address, and divides it by its respective 16-bit value, which gives you for example:
$09C4 is your max health, dividing it by 100 gives the number of energy tanks you have.
Those 5 values are then totalled up.

At $8B:E721, are values to 'test' against your collected items: $0001 $0020 $0004 $1000 $0002 $0008 $0100 $0200 $2000 $4000 $8000
At $8B:E737, are values to 'test' against your collected beams: $0001 $0002 $0004 $0008 $1000
To test these values, is to see if they are part of the value they're being tested to, that is, if you ANDed the value you're testing for to the variable, it would be non-zero.  E.g., if you had the items Screw Attack and Varia Suit, which would make your collected items $0009, then testing it for $0001 and $0008 would be true, whereas testing it for $0004 or $0002 would be false.
It totals the number of true tests, and adds it to the previous total.  That then gives you your percentage.



Code:
/-----------------------------------------------------------\
|________   __  .__                                         |
|\_____  \_/  |_|  |__   ___________                        |
| /   |   \   __\  |  \_/ __ \_  __ \                       |
|/    |    \  | |   Y  \  ___/|  | \/                       |
|\_______  /__| |___|  /\___  >__|                          |
|        \/          \/     \/                              |
|  _________   _____  .___.____     ___________             |
| /   _____/  /     \ |   |    |    \_   _____/             |
| \_____  \  /  \ /  \|   |    |     |    __)_              |
| /        \/    Y    \   |    |___  |        \             |
|/_______  /\____|__  /___|_______ \/_______  /             |
|        \/         \/            \/        \/              |
|___________                   __  .__                      |
|\_   _____/_ __  ____   _____/  |_|__| ____   ____   ______|
| |    __)|  |  \/    \_/ ___\   __\  |/  _ \ /    \ /  ___/|
| |     \ |  |  /   |  \  \___|  | |  (  <_> )   |  \\___ \ |
| \___  / |____/|___|  /\___  >__| |__|\____/|___|  /____  >|
|     \/             \/     \/                    \/     \/ |
\-----------------------------------------------------------/



4.1 Level to Bitmap


File -> Special -> Level to Bitmap
    This will create a bitmap image of the entire room you are currently editing.  By turning on and off the different layers and Views, you can create different images.
If your taking screen shots for a topic, Don't use this please! Take a in-game one.


4.2 Backup and Recovery System


Preferences -> Back Up and Recovery
  No idea if this is useful or not. I just copy/paste my back-ups, I recommend you do the same, and often. If you're curious as to what this is, it just makes an IPS patch file in your backups folder. It says name of ROM, date and time it was saved. If you need to save the bandwidth on e-mail backup transfer, or if you need to save space on your hard drive, go for it.


4.3 Headers


Tools -> Header
  For the addition or removal of headers. Headers aren't needed for anything and are generally a nuisance, but since ROMs usually come with headers there's bound to be people using both ROMs with and without them. If a patch doesn't work, always check to see if it's headered or unheadered first. If you EVER decide to work with a header, just add $200 to every pointer and offset.


4.4 ROM Expansion


Tools -> Expand Rom
  Extremely useful. Allows you to add extra space to the end of the ROM. Needed to increase room size limits, add graphics, etc.

 
4.5 IPS Patch Creation/Application


Tools -> IPS -> Create a patch
  Works just like any other patching tool, just less one step. Be in your edited ROM. Pick any pure (unchanged) ROM. Then that's it. Your patch is made!

Tools -> IPS -> Apply a patch
  This is for in-SMILE tests, unless you want to just plain out hard-patch and test your hack in your emulator.

Tools -> IPS -> Apply entire folder
  If you have a crapload of patches to stack up all at once and have them all in one folder, use this option.


4.6 File Compare

  The reliability of this feature is unknown. One thing it did was show every 10000 bytes on the top status bar. In the same folder as the ROM, it will give a Text File of the first ROM. It will show offsets that have different bytes.
Snippet of an example is (#1 is the ROM you're in, #2 is the one checked):
Offset : #1 #2
$112810: 00 EA
Most likely if you compare two ROMs of the different size, all the "extra bytes" are read by "FF" and the other has their own bytes.



Code:
/-----------------------------------------------------------------------\
|__________                    .___                 _________   _____   |
|\______   \_____    ____    __| _/____   _____    /   _____/  /     \  |
| |       _/\__  \  /    \  / __ |/  _ \ /     \   \_____  \  /  \ /  \ |
| |    |   \ / __ \|   |  \/ /_/ (  <_> )  Y Y  \  /        \/    Y    \|
| |____|_  /(____  /___|  /\____ |\____/|__|_|  / /_______  /\____|__  /|
|        \/      \/     \/      \/            \/          \/         \/ |
|________        .__        __                                          |
|\_____  \  __ __|__|______|  | __  ______                              |
| /  / \  \|  |  \  \_  __ \  |/ / /  ___/                              |
|/   \_/.  \  |  /  ||  | \/    <  \___ \                               |
|\_____\ \_/____/|__||__|  |__|_ \/____  >                              |
|       \__>                    \/     \/                               |
\-----------------------------------------------------------------------/


5.1 Strange Rooms


    Certain rooms are not fully editable or have some issues when editting them.  These include 79C5E (Brinstar fireflies), 7A293 (Brinstar fireflies 2), 7B6EE (Lower Norfair Demon/firefly Room), 7DEDE (Large Room in the Tourian Escape). Removing the Layer2 of the first two of these may fix your problems with them - but the latter two don't seem to be savable. SMILE thinks they have negative space available.
    KEJ: This is due to the memory being shuffled around. I think you can actually tell SMILE to ignore the negative space and save anyways - so long as you didn't make the room larger or too much more detailed, it should be fine.
    Certain rooms have errored graphic sets and thus you can't see what you're editting when you edit their tiles so I recommend not doing so in these rooms, but in the case of Kraid's room and some rooms like this, you can still edit the doors inside it. I wouldn't recommend trying to edit said rooms unless you really know what you're doing.  These include 7A59F (Kraid's room), 7DF45 (Ceres elevator room), 7E0B5 (Ceres Ridleyfight).
    Draygon's room doesn't always seem to show changes you're making to it - specifically around the edges it seems - which makes it difficult to edit it extensively. Actually this is the result of Draygon's room being entirely stored as a layer2 background. Remove the layer2 and then you can begin editting it fully.
    Ridley, Kraid, or Draygon don't seem to be in their rooms!  This one had me for awhile. Go to Help>Offscreen Enemies to 0,0 in SMILE. Kraid's ancillary parts are in the room but his actual HP value is stored in an enemy offscreen.
    *NOTE*:  FP here.  Room 7E82C is the Super Metroid debug room.  It's probably not recommended editing nor adding this room to your hack.  Not 100% sure if this is the case. (NOTE TO SELF ask about this in jzd.)



5.2 Scrolling Sky Error


    Scrolling sky background errors temporarily after changing doors that connect to the landing site rooms with the scrolling sky background.
    This one's a killer. It happens any time you alter a door's properties in one of the three huge scrolling sky rooms. There's a lot of workarounds for it but none are really perfect. My recommendation would be to not change the doors in these rooms and don't change the doors in rooms that connect to these rooms and just use the ability to change the room properties of the surrounding rooms (size and such) to make them taller and change them to your needs. You can also turn a lot of red scroll areas to green to get different sized rooms. On another note, I remember Drewseph saying he removed the scroll from his sky to fix this problem in SMRedesign but I have no idea how he did that. I assume it is beyond the scope of SMILE itself.
   
On the other hand: if you Remove Fx2 and layer 1_2, then change the background pointer to whatever background you want. (That is in the tile set you use)
Then set layer 2 scroll to c1c1
and set layer1_2 pointer to 91d4
and you have a back ground that dosen't scroll.
But yeah, Not the Sky Scrolling back ground.
This way you can use the room in a bit more ways though!

Update: http://interdpth.arc-nova.org/PJs%20stuff/IPS%20patches/Super%20Metroid%20Scrolling%20Sky%20Fix%20Patch.ips  <----a link to a fix for the scrolling sky problem. For unheadered ROMs.



Code:
/------------------------------------------------\
|  _________   _____  .___.____     ___________  |
| /   _____/  /     \ |   |    |    \_   _____/  |
| \_____  \  /  \ /  \|   |    |     |    __)_   |
| /        \/    Y    \   |    |___  |        \  |
|/_______  /\____|__  /___|_______ \/_______  /  |
|        \/         \/            \/        \/   |
|____   ____                  .__                |
|\   \ /   /___________  _____|__| ____   ____   |
| \   Y   // __ \_  __ \/  ___/  |/  _ \ /    \  |
|  \     /\  ___/|  | \/\___ \|  (  <_> )   |  \ |
|   \___/  \___  >__|  /____  >__|\____/|___|  / |
|              \/           \/               \/  |
|  ___ ___ .__          __                       |
| /   |   \|__| _______/  |_  ___________ ___.__.|
|/    ~    \  |/  ___/\   __\/  _ \_  __ <   |  ||
|\    Y    /  |\___ \  |  | (  <_> )  | \/\___  ||
| \___|_  /|__/____  > |__|  \____/|__|   / ____||
|       \/         \/                     \/     |
\------------------------------------------------/



SMILE (Super Metroid Integrated Level Editor) Version 1.32
-04/08/08-

04/08/08 (1.32):
Some more bug fixes that I thought I had included in the last release
In-editor documents for both enemies and plm's (plus more accurate images for some)
% key can be used to re-open the last room you worked opened (even after closing the editor)
Map editor allows for coding that Kejardon made to allow map saving to function correctly in game
I'm sure there's more stuff, but I forgot

12/31/07 (1.23):
Load rooms directly from the map editor
Varia/Gravity Suits now read correctly in the PLM editor
Added RoomVar support (my own data type, to be made public shortly)
Added LOTS of new screen modes (plus improved auto-hide menus)
Tweaked 32x32 tile view, since it's actually useful with the new screen modes
Allow enemies to be moved without snapping to the grid
Move the ship as a single unit (shift cancels this)
Drag/Drop the ship icon where you want it in the Map Editor
Added a basic Scroll PLM editing.
Added a very basic Background Editor
Added a projectile editor (Game Behavior)
Added support for text reference in the enemy/plm forms... Files still need to be added
A tremendous number of bug fixes (you have no idea)

07/17/06 (1.00):
"    Back up and Recovery system.
"    IPS support (creating, applying, and applying an entire folder of patches)... clearmem.ips, gravity.ips, and torizo.ips bundled for public use.
"    Text Editor (green intro text, bomb text, area name text, JTE engine (patch not provided yet).
"    Samus Palette Editor.
"    More game properties.
"    Minor stuff I'm forgetting.
"    Bug fixes.

12/25/05 (0.70):
"    Re-Added Pointer Pop-Ups
"    Added partial support for Area Load Stations
"    Added support for enemy palettes to be converted to YY-Char format
"    Rip/Save scenery palettes to/from TLP/YY-Char formats
"    Rip/Save scenery graphic sheets for editing in a tile editor
"    Added support for editing tile tables (ie- choose which 8x8's make p the 16x16 tiles)
"    Changed CRE ignoring to be done based on area (Ceres) instead of the sheet number
"    Added support for an ASM code (available at a later date) to allow for more than one bank to be used for enemy populations
"    Lots of bug fixes
"    Lots of stuff I'm either forgetting or choosing not to list

06/07/05 (0.50):
"    Added support to De/Recompress graphics for editing in a tile editor
"    Added support for YY-Char palettes (in addition to TLP)
"    Added ability to load and save palette files for scenery
"    Fixed the hex -> dec bug in the music control
"    Convert enemy palettes to Tile Layer format (TPL) . . . Saved in folder with your ROM, as EnemyID.TPL.

06/01/05 (0.40):
"    Set maximum number of bombs, missiles, and beams visible on screen at once (from 1-5)
"    Set duration of bomb timer
"    Convert enemy palettes to Tile Layer format (TPL) . . . Saved in folder with your ROM, as EnemyID.TPL.
"    Load and save Tile Layer palettes (TPL) for enemy palettes
"    Improved support for changing songs in an area (control and track)
"    Added support for "barrier blocks" in the special blocks bts menu
"    Fixed a few more bugs

05/03/05 (0.35):
"    Added support for adding new rooms (type in the new offset, then save)
"    Added support for adding/removing enemies from a room
"    Added support for adding/removing plm's from a room
"    Fixed an "unknown" music entry (west maridia)
"    Fixed a few bugs

03/07/05 (0.30):
"    Fixed the bug that caused a crash when clearing Show Intro or Red Powerbomb
"    Fixed some mini-map bugs
"    Fixed enable/disable in clipboard
"    Added support for different color themes in mini-map, though you can't see them
"    A few behind the scenes changes that will be apparent in the next release

01/11/05 (0.25):
"    Added the rest of the enemy props (and fixed some old)
"    Added Item Drop editing
"    Added support for second part of enemy allowed list
"    Added ability to move offscreen enemies/plms on screen
"    Added default gravity editing
"    Fixed potential errors in Room Header form
"    Fixed a *critical* error in the Pointer Editor (using $0000 would write data to the start of the bank, even though $0000 signifies that there should be no pointer)
"    Added primitive map editing support
"    Added a tile type preview to help identify the solidness of tiles in your level
"    Fixed the overflow error caused when a n00b tries to expand the ROM beyond bank $FF
"    Added a file comparer, to speed up error fixing in the future
"    Added ability to change the # of hits it takes to open pink/green doors

11/24/04 (0.18):
"    Added palette editing (scenery)
"    Added a pointer editor for most the pointers handled by the editor
"    Rooms are loaded from a list, instead of hardcoded, so you can add/subtract them (if you move pointers around)
"    Added support for changing ceres/zebes timers, plus intro toggle
"    Added support for expanding the ROM
"    Changed hotkeys for door editing

08/08/04 (0.15):
"    Added FX1 support.
"    Fixed a bug that would crash the editor if beta room opened first
"    Added PLM Editing (ie- you can change items/door shells).
"    Fixed a bug that caused rooms with no enemies to "create" enemies when you saved.
"    Added lots of new properties to Enemy Editor (including Palette Editing).
"    Added an easier way to drag-n-drop BTS values.

06/01/04 (0.1):
"    Added Door Editing.
"    Added PLM Editing (ie- you can change items/door shells).
"    Fixed a bug that caused rooms with no enemies to "create" enemies when you saved.
"    Added lots of new properties to Enemy Editor (including Palette Editing).
"    Added an easier way to drag-n-drop BTS values.
"    Fixed a lot of tiny bugs.


03/16/04 (0.0691):
"    Added state editor.
"    Added defaults for Common Room Elements (CRE) and 7 graphic sheets (1, 2, 22, 23, 24, 25, 26).
"    Added legna.dll (will be used in most my projects for now on).
"    Allow user to get offsets for various data that SMILE doesn't yet handle (in state editor)
"    Removed dependency on Ultima's msdll.dll.
"    Fixed a bug that saved Layer 2 with one byte less than it should have had.
"    Fixed the double-click on the menu bug.

11/27/03 (0.055):
"    Added autoscroll when dragging enemies.
"    Allow user to safely increase room size (in screens) . . . *Scroll data may still overwrite other data though*
"    Allow user to add/remove Layer 2 from rooms.
"    Re-added (temporarily) a feature that will allow default values to be made for the menus.
"    Fixed a bug that saved enemy speeds above $7FFF incorrectly.
"    Fixed bugs related to clicking the "x" on room header and state editor forms.
"    Fixed bug that gave Layer 2 one byte more than it should have had in most rooms.
"    Fixed a bug that caused a Subscript Out Of Range error when dragging off the lower right corner of the map.
"    Fixed a bug in dragging up-right and down-left in the menu (also fixes errors from dragging off the menu's edge).
"    Fixed overflow error when making room dimensions too large, too smaller, or in decimal (stupid users).

11/11/03 (0.045):
"    Changed the way headers are detected.
"    Started converting some code to C++ (dll) . . . No visible changes to the user.
"    Selecting tiles from menu can now be done with left or right mouse buttons.
"    Rooms with no enemies no longer crash after being saved.
"    Warning if new data is too large and will overwrite other data.
"    Added Prop-X support to the enemy editor.
"    Refresh level when changing room dimensions.
"    Dialogue window defaulted to the folder you've got SMILE in, instead of C:\.
"    Black line bug gone for good.

10/19/03:
"    Scroll area boxes can now be seen in other editing views.
"    Removed scroll value #3 (yellow) from the scroll viewer, since it isn't supposed to exist anyway.
"    Adjusted scroll area boxes by one pixel, to eliminate the illusion that there's different colors (ie- red & green makes yellow).
"    Changed the mouse icon used in dragging/dropping from the BTS menu to make it easier on the eyes.
"    Made the clipboard grid much easier on the eyes.
"    Click-n-Drag to select tiles in multiple directions now.
"    Fixed a bug that saved graphic sheet and music track/control to Standard states, regardless of the state selected.
"    Select music from a list with song titles

10/12/03:
"    Faster pasting/flipping of large groups of tiles.
"    Re-added 32x32 tile view.
"    Optional larger window (also, autohide menu).
"    Minor speed improvement when loading rooms.
"    Removed enemies from scroll view ... was saving incorrectly (ie- bugs).
"    Save to Bitmap feature now saves to romName_Address.bmp instead of romName.smc.bmp.
"    Load/Save INI file.
"    Disable pieces of the clipboard.
"    BTS Menu.  Support for most slopes and special tiles.
"    Fixed the black line bug (twice) and the green line bug.
"    Fixed orientation flipping bug in property scroller (also, automatically updates clipboard).
"    Fixed bug that prevented grid from showing if Layer 1 and 2 were both off.
"    Fixed mouse wheel bug (clicking outside map).
"    Scrollbars now scroll the right distance in all view modes.
"    *.BIN file is deleted after closing the program.
"    Fixed a graphical bug that showed old graphics on redrawn areas.




APPENDIX:

A.1  Music Comination List


Music:
00 00 = no change
## 00 = no music
## 01 = Samus appears clip
## 02 = Item aquired clip
## 03 = Elevator music
## 04 = Continue music
00 05 = No change. If entered from a ## 00-04 room, switches to ##
00 06 = Gold Statue music
## 07 = Mute, game crashes when you enter a door
03 05 = Intro music
03 06 = Intro music when Start is pressed
06 05 = Empty Zebes w/ Thunder
06 06 = Thunder alone
06 07 = Empty Zebes w/o Thunder
09 05 = Space Pirate music
09 06 = Gold Statue (?)
0C 05 = Samus's Theme
0C 06 = Strange chord
0F 05 = Green Brinstar Fadein
0F 06 = Mute/crash
12 05 = Red Brinstar Fadein
12 06 = Mute/crash
15 05 = Upper Norfair
15 06 = Electric Guitar chord, fades out
18 05 = Lower Norfair
18 06 = Mute/crash
1B 05 = Eastern Maridia
1B 06 = Western Maridia
1E 05 = Tourian
1E 06 = No music
21 05 = Mother Brain fight
21 06 = Mute/crash
24 05 = Boss fight (Ridley)
24 06 = Music before fight w/ Bomb Torizo
24 07 = Escape music
27 05 = Boss fight (Kraid)
27 06 = Music before fight w/ Kraid
2A 05 = Miniboss (Spore Spawn)
2A 06 = Mute/crash
2D 05 = Colony to Zebes
2D 06 = Ceres
30 05 = Wrecked Ship asleep
30 06 = Wrecked Ship alive
33 05 = Zebes goes boom
33 06 = Mute/crash
36 05 = Typewriter music
36 06 = Mute/crash
39 05 = Death
39 06 = *THONK* (Don't ask), no music
3C 05 = Credits
3C 06 = Mute/crash
3F 05 = "The last metroid is in captivity"
3F 06 = No music
42 05 = "The galaxy is at peace"
42 06 = No music
45 05 = Boss music (Kraid)
45 06 = Music before fight w/ Kraid
48 05 = Samus's theme
48 06 = Strange chord
4B 05 = Space Pirates
4B 06 = Statue room



A.2  FX1 Palette Blend list


Well, I just got done painstakingly going through all of the fx1 palette blends. I remember discussing them with someone (probably Dmantra) and we came to the conclusion that we needed to know what they all look like. In short, a large majority of them (they range from 00-FF) look like complete shit, gave me an instant headache, or were repeats of previous values.

However, 18 of them were easy on the eyes, and looked either good or decent. These 18, with a small description, are behind the spoiler tag. The descriptions are set up as follows:
XX = color of lava, what the part above the lava looks like

00 = transparent grey, regular background
02 = orange, regular background
03 = red, background is tinted blue
05 = dark red/blue mix, regular background
09 = green, background is tinted blue
22 = light grey, regular background
27 = pale blue, background is tinted green
2B = dark blue, regular background
3E = blue, regular background
42 = grey-blue, regular background
48 = green-blue, regular background
53 = purple, background is slightly tinted a pinkish color
54 = mostly clear, regular background
6B = purple, background is slightly lighter than usual
E4 = a darker mostly clear, regular background
E6 = perfectly clear, slightly lighter background
EE = lavender, regular background

Now then, you'll notice I said lava, and not fx. This is because:
A: I didn't try it on anything but water/lava/acid
B: Water is exactly the same as lava for palette purposes with one exception (see below)
C: For the first 20 or so values that I checked, acid stayed the same orange-yellow color it always is, so I assumed that for the most part, it doesn't change based on the palette blend value, but rather on some other fx1 option.

The difference between water and lava (other than in-game effects of course) is that water sometimes gets a line of regular air between it and the area above it. This doesn't happen with lava. I recommend that you use only the blends with "regular background" in their description for water, because if there is no tint to the background, the line problem disappears.



Bonus! Crys's guide to designing levels



  Now if you have read this guide, You will know how to make stuff. But how will you use it to make a hack? Well, this is where the fun starts!
  The first thing you should do is set the player to skip the intro, mainly since this will save you time and the space station should (If you ask me) be done later, if at all.
  Right, the landing site is a good place to start. Moving the ship is some thing you should avoide unless you really need to and you know how. Now, the landing site room will be used for the landing site. Why you ask? You have a better idea? Thought not.
  Now, if you're going to use any custom GFX for this area (self made or downloaded), put them in now. If you're new to designing, you should mess around with the tiles for a bit, see what goes where and so on. For example, you don't need to line up the GFX like SM did. On the other hand not all combinations are good!(Cough DMantra Cough) Get a feel for what looks natural or appropriate.
  After you've gotten the hang of how to use tiles, you should design a room around the ship. A smart idea is to have this as the center of an area since it has so many doors.
  Got the room done? Well, then, we'll move on. The next step is to make other rooms. The first thing to do is the remove the whole inside of the room. (except PLM's and stuff)


Now what you would want to do next is decide what the room will be out of these:
1.An Action room.
2.An Puzzle room.
3.An Exception room.

An action room is a room with enemies inside where you have to fight your way out. They mainly are just plain walk and shoot.

A puzzle room is a room with some sort of puzzle, but they could have a few enemies to kill before you solve the puzzle.
What can a puzzle be? Well, don't ask me, If you can't make out new puzzles then you should most likely quit SM hacking.

An exception room is a room where an item is hidden, or before a boss room, etc.
They need a bit more thinking. For example, Before the boss you may want to put a hint that there is a boss in the next room. If you hide an item you will want to put some sort of hint. A big or a small hint is up to you. Other then that, the exception room works just like a different form of Puzzle/Action room.

<------------->
Now the next part is to design a area.
Areas are like "Crateria, Norfair" etc.
An area is a structure of rooms. There are three ways to design a area.
1. Make a map in paint (or some thing) of the area and type of door and item placement, etc.
2. Make a map as you go on, Mainly to not overlap another room in structure.
3. Just make the rooms and don't care about map or areas to much. (If you do this, use the patch for no maping in-game!)

Now if you made a map you will know how to design, If you did not make a map, just take a random room you like and design it.

-> If you made a map: The first thing you should do is find a room with the number of doors you want AND the number of PLMs / enemies that match one of the rooms in the area plan. You can add more PLM's/enemies, But that is not covered at this part. And it saves time if it have the numbers you need any way.
Keep in mind that SMILE do have a map editor. I never really use it my self. But if you do make a map for your hack you will have to look into it.

<------------->
Slopes are a returning problem for some people. The green box like slope is needed after a /| slope to put samus on top of it.
Keep in mind that if you have the /| in th roof like this: \| then you need to flip the Green box upside down. That will make Samus get UNDER it. (instead of making her stuck in the roof. ...now that is a good idea for a hack. Samus stuck in dah roof. hahaha, just joking. ^o^; )




------[More on part A coming soon]-------



This is mainly a list of good things to think on when designing not a step-by-step guide!!!!!!

1]- Wall jumping?
2]- HAXORZZZ!!!
3]- MockBalling?
4]- Easy or hard?
5]- What type of hack?
6]- ASM

-[1]-
Walljumping?

Walljumping is a great thing that exists in SM.
It could be used to design great things.
How ever, If you decide to go for the majority of the people who play ROM-Hacks then you got a problem. Unless you're good at SM you will stay away if the hack NEEDS walljumping.

If your hack uses walljumping then I hope it is a pro hack (Check [4] Easy or hard)
OR that the hack has an easy-to-try-and-fail hint showing the easy step of walljumping and how to do it, like the original SM did with the Etecoons, etc...  It could just be some GFX of the buttons on the wall, even. (You need to force the player to do it though if your hack will have a lot of walljumping.)


-> Even if your hack needs walljumping, Don't make it tedious! (If your hack uses one-wall walljumping then it is a pro hack.) For example, You could make a shaft that is not that wide but no platforms, and a few monsters on the wall. Then you have to walljump, shoot the enemy, then drop down, rinse, and repeat. That would be around the level of what is okay for a normal gamer.  Get the point? Walljump is okay if it is not used in OVER 40% of the rooms.

-[2]-
HAXORZZZ!!!
Some bugs like mockball are popular (check [3] for more info), but most glitch tricks like these are unknown for normal gamers, and the target with a SM hack is not always a SM hacker or a SM pro. It's most likely the normal gamer. At least thats what you should aim for!
So don't add in any green gate glitches and the likes, please!


-[3]-
MockBalling?

Mockball is normally seen in hacks, It's not to hard to do when you get the hang of it.
So it would be okay to include it for one or two extra items, (like X-Ray or some thing)
If it is used in more then 3% of the hack's rooms though, I would call it a pro hack.

-[4]-
Easy or hard?
This is a returning subject: many of the SM hackers today seams to like dead ass hacks to challenge themselves. I for my own sake don't find this any fun at all.
Sure it may be fun for the minority, but a normal gamer or any other who actually plays hacks only (without being hackers themselves) would avoid them.
I call these "pro hacks." Now by ONLY changing the layout of the maps (move rooms) you created something hard since it is new to explore. Then add up new puzzles and game play! Already you have a new thing that is hard for anyone since it is new.
You "can" add extreme hardness if you want, but that limits the players and those who enjoy it. SM-R by Drew is at the line of a normal and a pro hack if you ask me. It was made extremely hard at some points. (grapple over lava with high gravity. Hard walljump. Etc)
Think before you hack!

Assbunnies! <= Wait a minute, what the hell?

-[5]-
There are many types of hacks. There are "pro" hacks, but I already covered those, standard hacks, those that are around the same as SM, and exploration hacks. Exploration hacks normally have some sort of deep story and a bit less fighting. (But that's not to say that they are easy)
Before you get to far into your hack it would be smart to pick what one to do.


-[6]-
Assembly or ASM for short is the type of code SM is coded in. If you know ASM you got no limitation when hacking.
However, ASM is not a skill. For example, when designing a room you get better and better. That is skill. ASM is knowledge; The more you know the better you are. The only limit you got is hardware limit. (And how much time your willing to spend. Coding stuff takes time.)
Keep in mind that you should make a hack around your code; Not code around your hack!
If you are willing to learn then the people in #jzd will try and help you when they got time.
Keep in mind that this is a hobby for most of us. It's not our job to help you.


-----[End of part B]------


Graphics or GFX as I will refer it to is basically what you see: An image with colors.
Super Metroid has a good GFX editor and I think I'm the one who have messed with it the most other than Jathys. It has quite a few good functions. Example you can change the palette with it. The palette in the SNES engine is 16 colors. One is transparent. (the first color in SM's case)
Palette is something easy to change. But hard to master. It takes time to learn what's good to mix and what is not. You should not make one sided palettes at least. For example, if your FG(ForeGround) is green don't make your BG(BackGround) green. It's generally a good idea to keep variation on the colors on the FG too. While the BG can be one colored. The FX1 menu also lets you add layers on top of that change the palette.

Next up: Map16.
Map16 is what it sounds like. Using four 8x8 to make a 16x16 tile.
Each of the four 8x8 can use one palette (line). You can also use the same tile more then once with another palette line. It will take up another space on tile map though.
The tile map is basicly the page under the level editor with all the tiles that are loaded in the area. CRE is loaded in most areas. The tiles with four "x" on the them are free. You got a limited number of space though. If you map out to much you will overwrite.

If you want to mix tile sets or actually draw GFX then you need a tile layer. Once you got a tile layer set up be sure to rip the right GFX file from the ROM with SMILE. (Not all GFX is compressed! All enemy GFX can be found laying some where in the ROM)
If you want to mix tile sets it's only a copy paste work. If you want to draw yourself then be sure to read up on some Pixel art guides first! It helps!
To get the right palette to load in the tile layer. There are two ways. If you use TLP then SMILE can rip a area palette file for you. If you use YY-Chr (I recommend this one) then you will have to load a ZSNES save state. It would show all palette lines that are loaded in that state. You will have to scroll till you find the right line though.



-----[Please fix any misspellings you find]-------
~[Post questions here ( or stuff you want covered) ]~

Post here BEFORE you add some thing OTHER than spell checking.
I will also add the spell checked stuff in my color so it looks nicer.
That's all mates! =)
Acclaimed Threshold
Constant Sorrows
This looks like the newest version. Thanks for doing this, PJ, stickying. Should cut down on the newbie problems.

Posters: do not use this as a second help thread. Only post if you are correcting or adding information to this FAQ.
There is something missing in this FAQ. When you open the certain spoiler tag, it shows nothing. These include:

3.2 Making New Rooms

3.3 Changing Game Physics

3.4 Scrolling PLMs
Acclaimed Threshold
Constant Sorrows
Those aren't missing, no one's written up guides for those sections yet.
I like Big Butts and I can not lie
If you look at the table of contents, only the ones that are checked have been written. Feel free to write the sections up here or via moonedit if ya want
There's nothing in changing game physics either.
I could write a section for scroll plms.

eventually.
Hm, it seems the patch for the sky scroll fix is down.
I believe that that is because the patch was found to have some bugs in it.
Edit history:
P.JMan: 2008-11-20 05:20:34 pm
I like Big Butts and I can not lie
Actually, I moved it into a subdirectory, also fixed the typo, fixed now (thanks for reminding me Wink)
you need to write a section about adding and copying enemies.
with the most detailed info possible.
Quote from rolando:
you need to write a section about adding and copying enemies.
with the most detailed info possible.
...why don't you write it? that sounds pretty rude and demanding.
Quote from Bloodsonic:
Quote from rolando:
you need to write a section about adding and copying enemies.
with the most detailed info possible.
...why don't you write it? that sounds pretty rude and demanding.
oh im sorry i didn't mean it that way

really i am sorry.
Edit history:
Sadiztik Fish: 2008-12-21 03:00:23 am
OMG FLAN!!!!!!!
Just a hint for anyone running out of room space quickly...

If you have areas with slopes that aren't possible to get to in-game, give them a BTS of 00. BTS values take up a lot of room space. Also try not to have any square slopes except after a triangle slope (so you can walk up the slope), as they take up more space as well.

Sometimes you can get tiles that look exactly the same, but take up different ammounts of space. Mostly this happens with air tiles. Try copying one air tile and pasting it over other air tiles to see if the space left goes up or down.

And with blue scroll blocks, don't bother drawing tiles in the lower and upper 2 lines of tiles, as they won't show in game, unless there is a green/blue block directly above or below it.


EDIT:
I hope this is the right place I should post this.
Edit history:
rolando: 2009-02-03 02:53:27 pm
this is what i did to copy/make new room and new door pointers hopefully this will help


follow some of the instructions from above.BUT it changes alittle but i will try to explain to the best of my knowledge.

in hex find room 791F8: and write on paper for notes and to reduce headaches if you need to start from scratch again...and make  back up's!! well the bytes are:

00 00 17 00 09 05 70 A0 00 7B 92 12 E6 0E 61 92
69 E6 47 92 12 E6 00 2D 92 E6 E5 BB C2 C2 01 06
05 C0 80 3D 88 93 81 81 01 83 92 00 00 16 C1 00
80 6A B7 C9 91 BB C2 C2 00 06 06 C0 80 3D 88 93
81 81 01 83 92 00 00 16 C1 00 80 6A B7 C9 91 BB
C2 C2 00 0C 05 D0 80 3D 88 93 81 81 01 83 92 00
00 16 C1 00 80 6A B7 C9 91 BB C2 C2 00 00 00 00
80 0D 8C 83 82 81 01 83 92 00 00 20 C1 26 80 6A
B7 BD 91 16 89 22 89 2E 89 3A 89 00 00 02 02 02
02 02 02 02 00 00 02 02 02 02 02 02 02 01 00 02
02 02 02 02 02 02 00 00 02 02 02 02 02 02 02 01
01 01 01 01 01 01 01 01 13 01 80 01

and the level data is C2C2BB
now i found free space at 2F51C0 (DED1C0)-go to smile/files/level entries go to the very end and type DED1C0 and save.

i typed the bytes at 7E9C0 and save
then i went into the smile/files/mdb and at the very end i typed 7E9C0 and save

ok now open up the rom in smile and go to your new room which is 7E9C0 it should look like the orignal

now open the pointer window and change C2C2BB to DED1C0 but! delete some tiles 1st so you don't overwrite anything else while you save the new level data pointer after that save room.

now in hex go back to offset 7E9C0 and at bytes 14,15,16 type DED1C0 but backwards so it should look like this C0D1DE
example:

00 00 17 00 09 05 70 A0 00 7B 92 12 E6 C0 D1 DE
69 E6 47 92 12 E6 00 2D 92 E6 E5 BB C2 C2 01 06
05 C0 80 3D 88 93 81 81 01 83 92 00 00 16 C1 00
80 6A B7 C9 91 BB C2 C2 00 06 06 C0 80 3D 88 93
81 81 01 83 92 00 00 16 C1 00 80 6A B7 C9 91 BB
C2 C2 00 0C 05 D0 80 3D 88 93 81 81 01 83 92 00
00 16 C1 00 80 6A B7 C9 91 BB C2 C2 00 00 00 00
80 0D 8C 83 82 81 01 83 92 00 00 20 C1 26 80 6A
B7 BD 91 16 89 22 89 2E 89 3A 89 00 00 02 02 02
02 02 02 02 00 00 02 02 02 02 02 02 02 01 00 02
02 02 02 02 02 02 00 00 02 02 02 02 02 02 02 01
01 01 01 01 01 01 01 01 13 01 80 01

save.

that should be it for the room.

now to make new door out pointer for 7E9C0

(bank 83) go to offset 1AD70-1ADA0 and type this in

CO E9 00 05 8E 16 08 01 00 80 00 00 FF FF FF FF
CO E9 00 05 8E 16 08 01 00 80 00 00 FF FF FF FF
CO E9 00 05 8E 16 08 01 00 80 00 00 FF FF FF FF
CO E9 00 05 8E 16 08 01 00 80 00 00 FF FF FF FF

save.

now go to offset 7E9B0 and type
70 AD 80 AD 90 AD A0 AD
change the two FF's after the last door's pointer to 01 01,so that smile doesn't weird out trying to read it. this is what we should end up with at 7E9B0

70 AD 80 AD 90 AD A0 AD 01 01 FF FF FF FF FF FF FF FF

save.

now in smile in the pointer window-door out type E9C0
save, now a window is going to pop up asking you would you like to free up the space from the original door out pointer click "NO"!!!!
because if you click 'yes' the original door out pointer will get deleted and you WILL run into problems!!

now save room and your good to go!!!!!!!! yay.

and just encase reopen the rom in hex and then save so all the new work you added in smile stays in hex.

i hope this will be put in on of the sections above..
soon if there are no flaws of course.

and how to do post a ips on here because i would like to show you guys alittle of my work..to see if i did everything right....
Super Secret Area - Dead Ahead!
Not really a question for this thread, but:

SMILE > Tools > IPS > Creata a Patch...

Click to reply here, clicking ^Additional Options, in the bottom left.  Browse for the file, and then post your reply.
Quote from Quietus:
Not really a question for this thread, but:

SMILE > Tools > IPS > Creata a Patch...

Click to reply here, clicking ^Additional Options, in the bottom left.  Browse for the file, and then post your reply.
i'll post it in the smile help thread.
Edit history:
Shadow34370: 2009-04-28 08:45:43 am
Went ahead and made up a few videos. The "MoodEdit FAQ Series" i guess... Wink These videos are supposed to help support the text that has already been written. That way it can help show some examples of what the text is trying to tell you. I tried my hardest to keep the videos very simple so beginners can still understand it. (Feel free to add these into FAQ if you wish.  )

Testing


Tiles - Intro


Tiles - BTS Slopes


Tiles - Extra BTS and Tile Properties


Tiles - BTS For Bomb/Shot Blocks


Edit: Yay, More Videos  Dancing

Getting Started - Preparing


Getting Started - Simple Setup


Getting Started - Adding Details


Getting Started - Testing and Finishing Up

Super Secret Area - Dead Ahead!
Those videos have been very helpful.  Thanks.  Any chance of getting one for scroll PLM's?

I know Bloodsonic mentioned writing a guide above, but it's often easier in a video.

Thanks in advance!
Quote from rolando:
this is what i did to copy/make new room and new door pointers hopefully this will help

Thanks. It make sense and it works. But there are some errors in your post.

Should I point to them? Or can I reprint your post with fixed errors and some improvements in?
Quote from JAM:
Quote from rolando:
this is what i did to copy/make new room and new door pointers hopefully this will help

Thanks. It make sense and it works. But there are some errors in your post.

Should I point to them? Or can I reprint your post with fixed errors and some improvements in?
yeah sure!! i made this post before the new SMILE came out,thats why its alittle different now.
Thanks for the reply. When I clicked on the label saying 'Making New Rooms', it doesn't show anything. Any suggestions?
Edit history:
JAM: 2009-09-28 07:02:44 pm
rolando
Well, I don't know a better way now. I try to hack Super Metroid less than a month. Your article and Kej's docs helped me to understand many things.

I did it. Sometimes I used same text that you typed, but with several improvments. I hope you don't mind...


Quote from radicaldreamer121:
Thanks for the reply. When I clicked on the label saying 'Making New Rooms', it doesn't show anything. Any suggestions?

I wrote an article below. I hope it will be in main post sometimes. Sorry for possible grammar errors





How to make a new room (Section 3.2)



1. Open room 791F8 in SMILE. Choose Edit > Pointers to call pointers window.
Write on a paper pointers for Door Data, Level Data and Scroll. If scroll is 0000 or 0001, don't write it. In this case, there is no scrolling data for each screen in mdb. All screens are blue or green. In our case, Door Out pointer is 927B, Scroll pointer is 9283 and Level Data pointer is С2C2BB.

2. Also, remember, how many doors in there. Move cursor to any door and press "D" to call Door Editor. In right part will be several doors listed as Door $00, Door $01 etc. Look at the last door. It's the Door $03. Add 1 in mind to count Door $00 and you'll get 4 doors in the room. Write on paper: "4 doors".
If there are just a pair of doors, then you can easy count them by yourself.



3. Repeat process for all alternative variants of this room. Click ComboBox with E5E6 in it. It's just right from ComboBox with level mdb in it (791F8). Door Out pointer is always the same but Scroll pointer and Level Data pointer sometimes may be different. In our case, the values are the same.

4. Close pointer window. Choose Edit > Room Properties in SMILE. Write on paper room's size. Quit SMILE

5. Let's open room 791F8 in hex.

791F8: ?? ?? ?? ?? ?? ?? ?? ?? 00 00 17 00 09 05 70 A0
79200: 00 7B 92 12 E6 0E 61 92 69 E6 47 92 12 E6 00 2D
79210: 92 E6 E5 BB C2 C2 01 06 05 C0 80 3D 88 93 81 81
79220: 01 83 92 00 00 16 C1 00 80 6A B7 C9 91 BB C2 C2
79230: 00 06 06 C0 80 3D 88 93 81 81 01 83 92 00 00 16
79240: C1 00 80 6A B7 C9 91 BB C2 C2 00 0C 05 D0 80 3D
79250: 88 93 81 81 01 83 92 00 00 16 C1 00 80 6A B7 C9
79260: 91 BB C2 C2 00 00 00 00 80 0D 8C 83 82 81 01 83
79270: 92 00 00 20 C1 26 80 6A B7 BD 91 16 89 22 89 2E
79280: 89 3A 89 00 00 02 02 02 02 02 02 02 00 00 02 02
79290: 02 02 02 02 02 01 00 02 02 02 02 02 02 02 00 00
792A0: 02 02 02 02 02 02 02 01 01 01 01 01 01 01 01 01
792B0: 13 01 80 01

Actually, you don't need the last byte here. It is part of next room. To be more correct, it's a next room's ID (01). So, you actually need to write on paper all bytes from 791FB to 792B2 (not 792B3 !!!)



Let's color it a bit.

See the values on a paper. Door Out pointer is 927B and Scroll pointer is 9283. Door Out pointer is always located at 9 bytes from begining of mdb data. Everything is written backwards in hex. 9EE5 is written as E5 9E.

There is a small door array at 9EE5. Each door pointer have size of 2 bytes. How many doors are in that room? 4 doors. So door array have size of 2*4 bytes, starts at 79EE5 and ends at 79EEC.


791F0:        ?? ?? ?? ?? ?? ?? ?? ?? 00 00 17 00 09 05 70 A0
79200:        00 7B 92 12 E6 0E 61 92 69 E6 47 92 12 E6 00 2D
79210:        92 E6 E5 BB C2 C2 01 06 05 C0 80 3D 88 93 81 81
79220:        01 83 92 00 00 16 C1 00 80 6A B7 C9 91 BB C2 C2
79230:        00 06 06 C0 80 3D 88 93 81 81 01 83 92 00 00 16
79240:        C1 00 80 6A B7 C9 91 BB C2 C2 00 0C 05 D0 80 3D
79250:        88 93 81 81 01 83 92 00 00 16 C1 00 80 6A B7 C9
79260:        91 BB C2 C2 00 00 00 00 80 0D 8C 83 82 81 01 83
79270:        92 00 00 20 C1 26 80 6A B7 BD 91 16 89 22 89 2E
79280:        89 3A 89 00 00 02 02 02 02 02 02 02 00 00 02 02
79290:        02 02 02 02 02 01 00 02 02 02 02 02 02 02 00 00
792A0:        02 02 02 02 02 02 02 01 01 01 01 01 01 01 01 01
792B0:        13 01 80





Legend.

Green: offset from start of ROM
Pink: Door Out pointer. Colored pink to differs it from pointers for pointers (colored yellow).
Blue: door array pointer.
??: data from other place. Don't touch it.

Let's color Scroll data. See at paper, Scroll data starts from 79283 but where it ends? See room dimensions on paper. Each screen in scroll data takes 1 byte. In our case, Width is 8, Height is 5. 9*5=45 screens in total. Convert 45 in hex. You'll get 2D. Add 2D to 79283. You'll get 792B0. Other data will starts there. But next room's mdb starts from 792B3. What's the data is located after Scroll Data? Special scrolling data. Scrolling PLMs are points to this. Let's color these bytes in brown.

If scroll data ends right before next room's mdb, then there is no Special scrolling data for this room.




791F0:        ?? ?? ?? ?? ?? ?? ?? ?? 00 00 17 00 09 05 70 A0
79200:        00 7B 92 12 E6 0E 61 92 69 E6 47 92 12 E6 00 2D
79210:        92 E6 E5 BB C2 C2 01 06 05 C0 80 3D 88 93 81 81
79220:        01 83 92 00 00 16 C1 00 80 6A B7 C9 91 BB C2 C2
79230:        00 06 06 C0 80 3D 88 93 81 81 01 83 92 00 00 16
79240:        C1 00 80 6A B7 C9 91 BB C2 C2 00 0C 05 D0 80 3D
79250:        88 93 81 81 01 83 92 00 00 16 C1 00 80 6A B7 C9
79260:        91 BB C2 C2 00 00 00 00 80 0D 8C 83 82 81 01 83
79270:        92 00 00 20 C1 26 80 6A B7 BD 91 16 89 22 89 2E
79280:        89 3A 89 00 00 02 02 02 02 02 02 02 00 00 02 02
79290:        02 02 02 02 02 01 00 02 02 02 02 02 02 02 00 00
792A0:        02 02 02 02 02 02 02 01 01 01 01 01 01 01 01 01
792B0:        13 01 80





Legend.

Green: offset from start of ROM
Pink: Door Out pointer. Colored pink to differs it from pointers for pointers (colored yellow).
Orange: scroll array. 1 byte for every screen of room. It starts from upper-left corner of room.
Blue: door array pointer
Brown: special scrolling data. Scrolling PLMs are points to this.
??: data from other place. Don't touch it.


Now, let's color Level Data in red. See at paper. C2C2BB. Write it backwards. You'll get BB C2 C2. Search these bytes in your mdb. They are at 79213, 7922D, 79247 and 79261. Write them on paper or remember if you want.

Original state will always be after "E6 E5" bytes. Alternative states will always have a pointer. All bytes after pink ones and before red ones are used for alternative states.

Level Data for alternative state is at 7922D, 79247 and 79261. Everything in hex is stored backwards. Only last 4 digits used in pointers. So, search for "2D 92", "47 92" and "61 92" between pink bytes and first red bytes. Color it in yellow.

2 or 3 bytes before yellow-colored are used to determine what event should happen to load alternative state for this room after that.

12 E6 means E612 -- Events. 0E is a number of event. "Zebes is exploding" is stored under number 0E.
69 E6 means E669 -- item related event "Samus got Power Bombs". No third byte here.
12 E6 means E612 -- Events. 00 is a number of event. "Zebes is awake" is stored under number 00.

Let's color them too.


791F0:        ?? ?? ?? ?? ?? ?? ?? ?? 00 00 17 00 09 05 70 A0
79200:        00 7B 92 12 E6 0E 61 92 69 E6 47 92 12 E6 00 2D
79210:        92 E6 E5 BB C2 C2 01 06 05 C0 80 3D 88 93 81 81
79220:        01 83 92 00 00 16 C1 00 80 6A B7 C9 91 BB C2 C2
79230:        00 06 06 C0 80 3D 88 93 81 81 01 83 92 00 00 16
79240:        C1 00 80 6A B7 C9 91 BB C2 C2 00 0C 05 D0 80 3D
79250:        88 93 81 81 01 83 92 00 00 16 C1 00 80 6A B7 C9
79260:        91 BB C2 C2 00 00 00 00 80 0D 8C 83 82 81 01 83
79270:        92 00 00 20 C1 26 80 6A B7 BD 91 16 89 22 89 2E
79280:        89 3A 89 00 00 02 02 02 02 02 02 02 00 00 02 02
79290:        02 02 02 02 02 01 00 02 02 02 02 02 02 02 00 00
792A0:        02 02 02 02 02 02 02 01 01 01 01 01 01 01 01 01
792B0:        13 01 80


Legend.

Green: offset from start of ROM
Red: pointer for level data
Yellow: pointer for pointer in bank 8F for level data
Aqua: alternative state. It shows what should happen for room to change.
Purple: extra value for alternative state.
Pink: Door Out pointer. Colored pink to differs it from pointers for pointers (colored yellow).
Orange: scroll array. 1 byte for every screen of room. It starts from upper-left corner of room.
Blue: door array pointer.
Brown: special scrolling data. Scrolling PLMs are points to this.
??: data from other place. Don't touch it.






now i found free space at 2F51C0 (DED1C0)-go to smile/files/level entries go to the very end and type DED1C0 and save.
I recomend to expand ROM and use the expanded space instead. After expandind there'll be a free space from 300000 to 307FFF. If this is not enough, expand ROM with SMILE again.

There'll be a free space at 300000. Open file "level_entries.txt" in "smile/files/" folder. Make a new line at the end and write 300000 there (not E08000 !!!). Save changes.




Now search a free space between 78000 and 80000 for mdb (level pointers, scrolling data etc. )

Free space will start at 7E9A0.

Leave a small gap for door pointers. 10 bytes (in hex) is usually enough. The only exception here is using more than 7 doors in new room. If you want to do so, leave a bigger gap. 20, for example.

New mdb will start at 7E9C0.

Open file "mdb.txt" in "smile/files/" folder. Make a new line at the end and write 7E9C0 there. Save changes.


Now open up the rom in smile and go to your new room which is 7E9C0 it should look like the orignal

now open the pointer window and change C2C2BB to E08000. When smile ask you "Copy data or leave it?" click "YES".


WARNING: don't copy level data from alternate rooms to a new place! It will affect an old data.


Quit smile.

If your room have no alternative variants, skip the text between lines
__________________________________________________________

Read this part if your room have an alternative variants.


Open your ROM in hex editor. Go to offset 7E9C0. It will looks like this:

7E9C0:        00 00 17 00 09 05 70 A0 00 7B 92 12 E6 0E 61 92
7E9D0:        69 E6 47 92 12 E6 00 2D 92 E6 E5 00 80 E0 01 06
7E9E0:        05 C0 80 3D 88 93 81 81 01 83 92 00 00 16 C1 00
7E9F0:        80 6A B7 C9 91 BB C2 C2 00 06 06 C0 80 3D 88 93
7EA00:        81 81 01 83 92 00 00 16 C1 00 80 6A B7 C9 91 BB
7EA10:        C2 C2
00 0C 05 D0 80 3D 88 93 81 81 01 83 92 00
7EA20:        00 16 C1 00 80 6A B7 C9 91 BB C2 C2 00 00 00 00
7EA30:        80 0D 8C 83 82 81 01 83 92 00 00 20 C1 26 80 6A
7EA40:        B7 BD 91 16 89 22 89 2E 89 3A 89 00 00 02 02 02
7EA50:        02 02 02 02 00 00 02 02 02 02 02 02 02 01 00 02
7EA60:        02 02 02 02 02 02 00 00 02 02 02 02 02 02 02 01
7EA70:        01 01 01 01 01 01 01 01
13 01 80

Legend.
Green: offset from start of ROM
Red: pointer for level data
Yellow: pointer for pointer in bank 8F for level data
Aqua: alternative state. It shows what should happen for room to change.
Purple: extra value for alternative state.
Pink: Door Out pointer. Colored pink to differs it from pointers for pointers (colored yellow).
Orange: scroll array. 1 byte for every screen of room. It starts from upper-left corner of room.
Blue: door array pointer.
Brown: special scrolling data. Scrolling PLMs are points to this.

Everything is written backwards. Pointer for C2 C2 BB will be BB C2 C2 etc.



7E9CE:        61 92 is a pointer to pointer to 3rd alternative room ($8F 92 61)
7E9D2:        47 92 is a pointer to pointer to 2nd alternative room ($8F 92 47)
7E9D7:        2D 92 is a pointer to pointer to 1st alternative room ($8F 92 2D)


Same thing, in more explaining form...

7E9CE => 79261 => C2C2BB (3rd alt. room)
7E9D2 => 79247 => C2C2BB (2nd alt. room)
7E9D7 => 7922D => C2C2BB (1st alt. room)

See this? Pointers in new room's mdb_stateselect still points to old room's mdb_stateselect.


If you just changes pointers at address 79261 to E08000, it will affect old 3rd alt room because

79206 => 79261 => C2C2BB (3rd alt. room)



As for alternative states...
E6 12 means that special event should happen to change room. Purple byte is a index for event.

7E9CB:        12 E6 0E 61 92

0E is Exploding Zebes event. Pointer for level data for this event will be at bank $8F with offset 92 61 (79261 from start of ROM)



7E9D0:        69 E6 47 92
E6 69 means "Samus has Power Bombs". Pointer for level data for this event will be at bank $8F with offset 92 47 (79247 from start of ROM)

Note that there are no extra value for item check. There are unique alternative state value. For example, E6 40 is for Morphing Ball and E6 52 -- for Morhing Ball and Missiles.



7E9D4:        12 E6 00 2D 92
00 is "Zebes is awake" event. Pointer for level data for this event will be at bank $8F with offset 92 2D (7922D from start of ROM)



7E9D9:  E6 E5 00 80 E0
E6 E5 means standart room. Level data pointer will be right after bytes E6 E5. Pointer (yellow) is not needed. There is E08000 because you've already copied level data from original room (not alternate!).



Ok. You should change yellow colored bytes in hex.


Change 61 92 at 7E9CE to 29 EA (to point to $8F EA29 (7EA29) )
Change 47 92 at 7E9D2 to 0F EA (to point to $8F EAOF (7EA0F) )
Change 2D 92 at 7E9D7 to F5 E9 (to point to $8F E9F5 (7E9F5) )



Now, the pointers in new room looks like:


7E9CE => 7EA29 => C2C2BB (3rd alt. room)
7E9D2 => 7EA0F => C2C2BB (2nd alt. room)
7E9D7 => 7E9F5 => C2C2BB (1st alt. room)




Now you can replace "BB C2 C2" with "00 80 E0" at addresses 7E9F5, 7EA0F, 7EA29 manually in hex editor or open room at 7E9C0 in SMILE and save level data in all alternative rooms to E08000. When smile ask you "Copy data or leave it?" click "NO".


Now pointers will work fine.


__________________________________________________________

now to make new door out pointer for our room.

Open Rom in hex and find a free space in bank 83 (somewhere form 18000 to 20000). It'll be at 1AD66. 1AD68 is ok. Write 12 zeros for each door in your room. Gap is no needed. You actually can edit these doors later in SMILE.

It will looks like this:
1AD60: 4B 82 4B 82 4B 82 FF FF 00 00 00 00 00 00 00 00
1AD70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1AD80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1AD90: 00 00 00 00 00 00 00 00 FF FF FF FF FF FF FF FF

save.

Remember the gap that we leaved at 7E9A0? There'll be pointers to each door. 2 bytes for each, written backwards, linking to bank 83. We'll need to add pointers. 1st will be at 1AD68, 2nd -- at 1AD68 + 0C = 1AD74 etc. I hope you've got it.


go to offset 7E9A0 and type this
68 AD 74 AD 80 AD 8D AD
change the two FF's after the last door's pointer to 01 01,so that smile doesn't weird out trying to read it. this is what we should end up with at 7E9A0

68 AD 74 AD 80 AD 8D AD 01 01 FF FF FF FF FF FF FF FF

save.



now in smile in the pointer window-door out type E9A0 to point to a door pointers array for this room.

save, now a window is going to pop up asking you would you like to free up the space from the original door out pointer click "NO"!!!!
because if you click 'yes' the original door out pointer will get deleted and you WILL run into problems!!

now save room and your good to go!!!!!!!! yay.



I recomend to look carefully in pointers of the room you want to copy. If you just copy all of mdb, then, almost in every case you'll copy scroll data, special scroll data and sometimes door pointers array.


Another example is placed between the lines

__________________________________________________________
Second room of old Brinstar at 79F11. Mdb data is in brackets.

79F10:        80[0F 01 1D 0A 01 02 70 A0 00 57 9F 12 E6 00 3D
79F20:        9F
E6 E5 3A E6 C5 06 00 00 A0 82 C6 9B 95 85 C1
79F30:        C1 5D 9F 00 00 00 00 54 87 BE BA D5 91 3A E6 C5
79F40:        06 00 00 F4 81 8D 91 77 83 C1 C1 5D 9F 00 00 00
79F50:        00 54 87 BE BA BC 91 C2 8E CE 8E DA 8E 01 00 00
79F60:        02 01 01 80
]


Legend.
Green: offset from start of ROM
Red: pointer for level data
Yellow: pointer for pointer in bank 8F for level data
Aqua: alternative state. It shows what should happen for room to change.
Purple: extra value for alternative state.
Pink: Door Out pointer. Colored pink to differs it from pointers for pointers (colored yellow).
Orange: scroll array. 1 byte for every screen of room. It starts from upper-left corner of room.
Blue: door array pointer
Brown: special scrolling data. Scrolling PLMs are points to this.

Door linking
79F1B: => 79F57 => 18EC2
79F1B: => 79F57+2 => 18ECE
79F1B: => 79F57+4 => 18EDA


If you don't want to change original scrolling of the room (or want  change scroll pointer to 0000 or 0001), then copy bytes from 79F11 to 79F5C to a free space. Bytes from 79F5f to 79F63 are a special scroll data.

If mdb contains door array pointer and you don't want to increase the door count, then you may use blue colored space. In that case, gap before new mdb is no needed.

If mdb contains door array pointer and you want to increase the door count, then copy bytes from 79F11 to 79F56 to a free space. Use a gap before mdb to place new door array pointer. If you want to change scrolling for a new room, then write orange-colored bytes in free space right after that.



You can also look pointers for the room you want to copy. In this case, room's mdb starts at 79F11 and ends at 79F63 (because there'll be a next room at 79F64). Open room 79F11 in SMILE and open pointers window for this room. Look carefully for pointers linking to somewhere between 9F11 and 9F63 in bank $8F.

There'll be a Door Out linking to $8F 9F57 and Scroll linking to $8F 9F5D for both states of original room. It's a best way to understand what you'll copy to a free space.

__________________________________________________________

And last thing. If you'll make a totally different room compare to old one (another enemies, music, bg), then you'll need to change pointers for all other things (enemies, music, bg). We only changed pointers to Level Data and Door Out

For example, you want to change enemy types and locations but not affect the old room.
EDIT: Find a free space in bank A1 and change "Enemy Pop/Allowed" pointer to free space but always leave a gap of "FF FF 00" between enemies in different rooms! First two bytes are acting like "stop reading enemies for this room". The last byte used for "Enemies to clear the room".

Find a free space in bank B4 and change "Enemy Set" pointer to free space.
EDIT: Leave a gap of "FF 00" between enemy sets in different rooms.

Now, it's time to edit your enemies.


After opening your new room in SMILE go to Special > "Enemy/PLMs +-" and select amount of enemies that you need.


EDIT:
Same story with PLM's, but they are stored in bank $8F. Gap of "00 00" between PLM's in different rooms is also needed.




Remember the basic thing. If want to change something in new room, look at pointer for this "something" in pointers window, look at it's bank, find a free space in this bank with hex and change pointer for "something".
Thanks for the reply, I got it to work and made myself a new room to play with!. Although I'm still a litte confused on the whole logic behind it (why 7E9C0?), but it works. How many new rooms can you make with this method and what differences would there be with making them? I wanna make a SM hack that'll really make the gamer feel like Zebes is much bigger and labyrinthian, similar to Vagrant Story (PSone Classic!). Any replies will be appreciated.
Edit history:
JAM: 2009-08-25 10:34:10 pm
Quote from radicaldreamer121:
Thanks for the reply, I got it to work and made myself a new room to play with!. Although I'm still a litte confused on the whole logic behind it (why 7E9C0?), but it works.

You're welcome. All pointers and headers for all rooms must be in bank $8F (from 78000 to 80000). If you view that space in hex editor, then you'll see that free space starts from 7E99A and ends with 7FFFF. After adding 1 room, view free space in bank $8F again. Free space will be at 7EA7B (for example). Leave some space for door array pointers and write new room to 7EA8B or 7EA90 or everything else you want.

Quote from radicaldreamer121:
How many new rooms can you make with this method

While there is a free space between 78000 and 80000. After that you can move all PLMs to other bank manually (long process) and there'll be a little more free space in bank $8F.

Quote from radicaldreamer121:
and what differences would there be with making them?

The most hard part is to keep the original data. For example, you wand to add more enemies in the room or change their position. You'll need to change pointer to enemies to a free space (to prevent changing original rooms).

Quote from radicaldreamer121:
I wanna make a SM hack that'll really make the gamer feel like Zebes is much bigger and labyrinthian, similar to Vagrant Story (PSone Classic!). Any replies will be appreciated.

There is also a more easy way for expandind rooms (if you don't care about original rooms and all enemies there). I realize recently that only growing thing in mdb while increasing the room size is scroll data. 1 byte for each screen. If there are more screens, then there are more scroll bytes.

Scroll data in room that I added an article is from 7EA4B to 7EA77.

So, you can just rewrite pointer for Scroll Data and change Pointer to Level Data to free space at the end of the ROM (after). Click "YES" in new window. Now you can expand that room without any fear. You may edit all original rooms in that way. If you want to add more enemies or PLMs in some room, you still need to change enemy (or PLM) pointers to a free space. If you simply increase their amount, enemies (or PLMs) in next room will be rewrited and enemy (or PLM) pointer in next room will be invalid.

When all orignal rooms in some area are changed you can just add more rooms (to 7EAC0 and after that).

Good luck with your hack!



Oh, I forgot about scroll data while creating new rooms. I'll add that info to my article a little bit later. Fixed