About Map Rando

Super Metroid Map Rando randomly arranges the rooms of the classic SNES game Super Metroid while ensuring they fit together in a geometrically consistent way. The in-game map accurately reflects the arrangement of the rooms, allowing players to track and make sense of the randomized world as they explore. Finding and activating map stations will help the player gain more information to decide where to go.

Map randomization create unique challenges and puzzles that players must solve. On the higher difficulty settings, there are many tricky techniques that may be required in order to beat the game. Players can customize the difficulty settings to select individual techniques that they know how to do. An interactive spoiler map is available, allowing players to get a hint in case they get stumped.

To beat the game, the player must complete the required objectives, defeat Mother Brain, and escape by returning to the Ship. By default, the objectives are to defeat the bosses Kraid, Phantoon, Draygon, and Ridley. Completing the objectives opens the way to reach Mother Brain.

Even on lower difficulty settings, one consequence of map randomization is that players will likely encounter risks of dying to powerful enemies while they have few or no items, or of getting stuck in places they can't get out of. The randomizer includes many features that reduce these risks but do not eliminate them (for more detail and a full list of changes, see below):

Except for the doors, room layouts are generally exactly the same as the vanilla game. There are only a handful of minor changes, described in detail below. No platforms are added or removed, and no changes are made to special objects such as gates, bomb blocks, crumble blocks, or Power Bomb blocks.1

Even with the quality-of-life changes, it takes practice to master the wide variety of challenging situations that can come up with randomized maps. For players that are newer to Super Metroid, before trying Map Rando it is recommended to first gain some experience with the vanilla game and possibly with another randomizer such as VARIA Randomizer. It is also possible to play Map Rando without the map randomization, by selecting "Vanilla map" on the Generate page.

To help players learn the tricks which are possible in this game, a library of over 1000 strat demonstration videos is available. These are integrated into the Logic pages on each release, or they can be viewed immediately as they are being developed on videos.maprando.com. Others are welcome to join in the effort of creating videos, as this project is still far from complete: anyone interested can reach out in the #development channel of the Discord.


Randomizer changes

Aside from randomizing the map and items, many small changes are made to improve quality-of-life and adapt the game to behave "as it should" in the context of map and item randomization. The following are the changes that are either built into the randomizer or enabled by default (See the Generate page for more details and descriptions of all quality-of-life options, including those disabled by default):

Map enhancements
Special inputs
Saving & loading
Doors
Item spawns
Suit behavior

In the vanilla game, Gravity suit includes almost all the benefits of Varia suit, apparently based on the expectation that the player will get Varia before Gravity. In the randomizer, Varia suit behaves as in vanilla, but Gravity suit alone has only the incremental effects that Gravity gives on top of Varia in the vanilla game: Gravity suit alone provides no heat protection and only 50% protection against other damage (including lava). This makes the suits become "complementary", meaning their effects stack to give the same effect as combined Varia + Gravity suits in the vanilla game:

Suit combination Heat Lava Rainbow beam Other damage
Power Suit 0% 0% 0% 0%
Varia 100% 50% 50% 50%
Gravity (Map Rando) 0% 50% 0% 50%
Gravity (vanilla) 100% 100% 0% 75%
Varia + Gravity 100% 100% 50% 75%

Note that the only case where the randomizer differs from the vanilla game is with Gravity alone.

Endgame
Fast transitions & cutscenes
Layout changes
Other changes

How it works

Randomization happens in a few phases: map generation, item placement, escape timer calculation, and ROM patching. Map generation is done offline ahead-of-time, while the others happen in real-time when a user requests the system to generate a game.

Map generation

At the core of the map generation process is a machine-learning model trained to arrange Super Metroid rooms onto a 72 x 72 grid, while satisfying the following constraints:

Maps produced by the model go through a few steps of post-processing:

The processed maps are then collected and stored off. The randomizer currently uses a pool of approximately 18,000 "Tame" maps and 15,000 "Wild" maps. The difference between these two map pools is that for "Tame" maps, one-ways will have relatively short return paths that loop back around; this is implemented by an extra term in the map generation model's scoring of candidate room placements, and also by a filter applied to completed maps during post-processing.

It took about a year to develop the initial model architecture and training process, including about two months of continuous training on a pair of RTX 3080 Ti GPUs. The original model suffered from some quirkiness where it almost always connected certain groups of rooms together. A newer model with a number of improvements was trained for about 4 months on a pair of RTX 4090 GPUs, leading to greater variety in room connections, better balancing of save stations, and better connectivity (e.g. shorter paths from one end of the map to the other).

Item placement

Item placement happens by forward fill: items are first placed in locations that are bireachable (i.e. possible to reach and return back to the starting room) before the player has collected any items, then in a sequence of expanding spheres of bireachable locations based on having collected the previously placed items.

On each step of item placement, among the bireachable item locations that do not yet have an item placed in them, a subset of these locations is selected to place key items in, either randomly (if "Neutral" item placement is selected), or by prioritizing those that require more difficult techniques to reach (if "Forced" is selected). Key items are selected to ensure that progression is unlocked (i.e., at least one new item location becomes bireachable). Filler items are placed in the remaining item locations that are reachable on that step, including locations that are only one-way reachable. The process then repeats with the next set of key items. If on a given step there is no key item that can provide progression, then the randomizer retries with a different map. For more details, see the "Item progression" section of the Generate page.

The logic used to determine reachability of item locations is based on the sm-json-data project. This is a massive repository of Super Metroid strats, currently consisting of over 200,000 lines of manually crafted JSON. For each room, it defines a set of logically meaningful nodes (points or regions within the room) and defines tech, item, and resource requirements for strats traversing between nodes. In heated rooms, this includes heat damage requirements. It also includes information about runways in front of doors and other room details to support cross-room strats such as shinesparks, gravity jumps, and G-mode.

Spoiler data is also generated during the process of item placement, recording which nodes (including item locations) are reachable and/or bireachable on each step, and constructing an obtain & return path for each bireachable item location, which is used in the implementation of the interactive spoiler map.

Escape timer

The escape timer is determined by computing the fastest path from Mother Brain Room to the Ship (including a detour to Bomb Torizo Room if "Save the animals" is enabled). This is based on manually constructed escape timing data which gives a timing between every pair of doors in every room. Extra time is added for leniency based on the difficulty settings.

For escape timings that rely on tech in an important way, this is taken into account by making the timings conditional on the tech (and where applicable, including alternative timings that do not use the tech):

For other more minor uses of tech (e.g. "canMockball"), the base timings assume that the tech can be used, and the difficulty multiplier should be enough to account for the player's potential inability to do the tech on lower difficulty settings.

For timings which are heavily affected by the "Enemies cleared during escape" option, two timings are included in the data, one based on the enemies being present and one based on them not, and the correct one will be used. Otherwise a conservative timing is used which should be doable in both cases.

The escape timings assume that the player has all movement items. If the option "Hyper Beam gives all movement items" is disabled, it possible that the player could defeat Mother Brain but not have the movement items required to execute the escape in time; in this case the player would need to reload to an earlier save (before the escape auto-save) and go back and collect the necessary movement items before reattempting Mother Brain and the escape. A similar scenario could happen if the player needs more energy for the escape (e.g. to perform a shinespark or acid dive): it's possible they could need to go back and collect more tanks or redo the Mother Brain fight with less energy loss (if the option "Refill energy for escape" is disabled).

ROM patching

The final step is to construct a ROM patch which applies the item placements, door connections, map data, and escape time, along with other game changes (as described above) that are either built into the randomizer or selected as options by the user.

The resulting ROM patch, spoiler data, and other information associated with the randomized game are saved off to cloud object storage, allowing users to share the randomized games with one another. Each user needs to use their own vanilla ROM in order to apply the patch to create a playable game.


People & credits

The following people contributed directly to the development of the randomizer, its web service, and/or the underlying logic data:

Many people in the community have created demonstrations of interesting Super Metroid strats, which have then contributed to the logic used by the randomizer:

There are also many ASM patches written by people for earlier projects, which this randomizer reuses or builds on:

Custom sprites are made possible by

Other randomizers have been a significant source of inspiration and ideas, particularly VARIA Randomizer, and also SMZ3 Randomizer which was the first randomizer that we played (Maddo and kyleb). The set of patches used by VARIA was an especially helpful reference.

The following tools and reference materials have been indispensible:

We've also received valuable feedback, suggestions, and bug reports from many players. Though there are too many to mention them all individually, we are grateful for everyone who has shared their ideas and observations! There are a few players who have been involved from an early period who we do have to mention:

Thanks also to the people who have created and shared tools related to the randomizer:


1With randomized maps, softlock risks are so pervasive that they cannot effectively be addressed by changing a few blocks: even if all the special blocks in the entire game were removed (which would eliminate most of the opportunity for interesting puzzles and challenges), water rooms and heated rooms would still be a big problem. This is why we decided to take a different approach, where instead of trying to eliminate softlock risks we added quality-of-life changes to make them less painful.

2Specific graphical fixes include the following (most of which are disabled when using the "Ultra-low quality-of-life" option):