This is a level design tutorial for public contributors who would like to make levels for Super Mario Fusion: Revival. We encourage level designers to produce high-quality levels with solid gameplay. We have put up a topic on the Fusion Gameworks forums regarding level design guidelines and advisories for SMF:R. If you deviate too far from these guidelines, the SMF:R devs will tell you to make corrections, or your contributions will not be accepted. The level design advisories are suggestions to make your levels well-structured, interesting, and challenging.
Also see Level list (Super Mario Fusion: Revival) for completed levels and levels to be made.
Lesson 1: The Basics
Get Game Maker
If you don't have it, you can get it here. If you use the lite version, you will be unable to test. With that installed, you'll be able to open the SMF:R source.
Duplicate the Level_Template room resource
See your "rooms" folder? Open it, then open the Official Levels folder. You should see a "LEVEL DESIGNERS..." folder. Open it, and you will see
BowserRampage_Template. Right click
Level_Template and select to duplicate it.
Now you should make a folder (or "group") for it. You can right-click anywhere followed by selecting "create group" to put a folder where you clicked. Just make sure it isn't before the top three rooms, since it's important that they're first. Put your new room there.
By the way, you can right-click anything to change its name. Just saying.
It's my new level. So exciting.
What a level needs
Some things that a level needs is already provided by just duplicating the template. They are as follows:
- The red note block is
obj_musicplayer. It, obviously, provides control over the background music, but also things like the amount of time allowed to finish the stage.
- The hill with eyes thing is
obj_parallax. Parallax scrolling is where the background scrolls slower than the foreground so that it looks like it's farther away. This object lets you do that.
- The fortress icon is
obj_bganimator. It lets you use animated backgrounds; but for now, you can delete it by just right-clicking. This tutorial doesn't involve fancy backgrounds.
- The lil' Mario to the left is
obj_mario. This is the location where the player starts as the room is loaded.
- The other lil' Mario is
obj_midwayspot. This is where the player starts if he reached a checkpoint and died afterwards.
- The graphics below the lil' Marios are called tiles, and the translucent white rectangle over the top of them is made up of two
obj_solid16x1blocks. The solid blocks give collision to the tiles so Mario doesn't fall through them and die.
You can view the code that is executed as an object instance appears by CTRL+Right-clicking the object and selecting "Creation code...".
A level mainly consists of tiles, backgrounds, collisions (solids, water, etc.), Mario's starting point and checkpoint respawn point, the checkpoint itself, ? blocks, bricks, coins, and enemies. Let's focus on tiles first, but be sure to delete the solids by right-clicking them (while the objects tab is open) and then the ugly tiles by clicking on the tiles tab and right-clicking them.
Also, take a quick detour to the Settings tab, and change "width" to 3200 or something. 320 is way too short.
Tiles and Backgrounds
Tiles are little 16x16 pixel things that give the level a visible form. Just below the tab is a box where you can choose pieces of a background resource, but we want a background that is explicitly a tileset. So click the drop-down box just below it and navigate through Mario Universe -> Tilesets ->
bg_tileset, and select it. This is the SMB3 tileset, and it is what we will use.
Now you can click on any region on the tileset, and it will select a tile. The selected tile can be placed into the room by left-clicking wherever you want it to go.
When you've done enough of that, there's another graphical thing you need: a background. Click the backgrounds tab, find the drop-down box, and look for
bg_blocks in Mario Universe -> Level Backgrounds -> SMB3. Let's use it (and set the Y offset to -144 so we're not looking up into the sky).
If your practice level looks nothing like this, you're doing it wrong.
Now it is a good time to place objects, like enemies and solid collisions.
To place objects, get on the objects tab and click the drop-down box. Fortunately, objects are (mostly) organized--solid collisions are in the Collisions group, enemies are in the Enemies group, coins are in the Blocks group, coins are in the Items group, the checkpoint and flag/castle are in the Level Progress group... and so on and so forth. I don't think I need to explain most of them for your practice level, but here are a few special cases:
obj_block_sprout is the all-purpose block used for power-ups. Just putting it there will accomplish nothing, however. You'll have to edit the creation code to tell it what item to spawn (tier 2 power-ups like the Fire Flower are automatically replaced with a Super Mushroom if you're a midget).
What you have to do is add this line to the creation code:
sprout = X;
And replace X with the number associated with the item you desire below:
1 = Fire Flower 2 = Hammer Suit 3 = Leaf 4 = Tanooki Suit 5 = Frog Suit 12 = Blue Shell 13 = Yoshi 14 = Kuribo's Shoe 15 = 1up 16 = 3up Moon 17 = Poison Mushroom 18 = Star 19 = Key 20 = Spring 21 = Super Spring 22 = P-Switch 23 = E-Switch (basically a P-switch you can use multiple times) 24 = Ace Coin
Items 6-11 are never used in SMF:R, and in fact should have been removed entirely from the source. DON'T USE THEM!
obj_stopblock is a solid collision that prevents Mario from going over it. This is useful for when you have a hole in a ceiling and don't want Mario to run around freely up there.
obj_parakoopa and its red cousin need to have one of the four directional arrows in the Platform Movers group on top of them if they're going to flutter somewhere in the air, and an arrow of the opposite direction telling them to turn back. It was practical to have those arrows work for more than just moving platforms. (Oh, and you see that "Delete Underlying" checkbox? When checked, you delete the object underneath what you just placed, but when unchecked, you don't. Uncheck it for placing paratroopas and the like, y'hear?)
obj_warptop and its bottom, left, and right cousins define a pipe you can enter. The name of the object indicates where Mario should be relative to the object in order to enter; for example, Mario should be on top of
obj_warptop to enter it. Now how to use them to enter different rooms is beyond the scope of this tutorial, but you can look at levels already made and get an idea of how they work. But enough about that for now, let's place some objects down so Mario has solid ground to stand on, can hit blocks, and can stomp enemies.
Now that's more like it.
As you can see, I put an Ace Coin in a place you aren't going to reach without killing yourself or using the shell of that nice Koopa Troopa over there. Your level should include five ace coins, and they shouldn't always be ripe for the taking--tricks and 1337 skills should be required to get some of them. The finished version of SMF:R will have an Expert Mode that requires you to catch 'em all to clear a level, so don't put them all in places even total wusses can reach.
Now let's discuss level progress objects, because you didn't see me use them and they're pretty darn important.
obj_midwaylinemark the checkpoint of the level. Well, actually, only
obj_midwaypointis just there to look pretty. Embed
obj_midwaypointinto the ground somewhere in the middle of your level and put
obj_midwaylineon it somewhere where Mario can reach it.
- By the way, do you remember
obj_midwayspot, the clone of
obj_mario? It's in the Main folder. Now place it near that checkpoint of yours.
obj_incastlemark the very end of a level. The flagpole is what you jump on and slide down;
obj_incastleis where Mario... goes in the castle. Really, it's that simple.
Speaking of castles, the castle is a tile. Sort of. Go to your tiles tab and dig through Mario Universe -> Objects (why Hello called the group "Objects" when the contents really aren't is anyone's guess) and get
bg_castle. Now put it where its doorframe is right behind
obj_incastle, and you have a working castle.
Now we need to fool around with those special objects in the top right. You know,
The very first thing
obj_musicplayer does in its creation code is call a script with the line:
scr_musicini("Plains", 0, true, true, false);
This script requires, in order:
- Music: this is the title of music as it is defined in smfmusic.ini. Right now, it has "Plains" in this spot.
- Time: of course, this is the number of ticks you're allowed to finish the level before you die for some odd reason. Brawl in the Family implies the timer counts down to your bladder bursting or something; I'm not really sure. But 400 ticks should be more than enough for this widdle stage. A value of 0 indicates unlimited time.
- Music Init: If you want this room to change the song playing upon entering it, this should be set to
true(or 1 -- they're technically the same from a programming point of view). Otherwise, it should be set to
false(or 0). Since this is the first (and only) room in the level, it should be left as
- Level Start: If this is the start of the level, it should be set to
true. Obviously, this should be
- Music Change: If you want the music to change right after leaving this room, it should be set to
true. This is primarily useful for levels with bonus areas... but since this isn't a bonus room, you should leave it alone.
That's all you'll be doing with
obj_musicplayer for now, even though it has a couple of other features like picking block and enemy skins. Now there's
obj_parallax to care for. It's a little bit simpler, as you only have to worry about two things:
num_bkgs: the number of backgrounds this object affects. This variable has beeen deprecated since SMF:R source revision 46, so you can omit this variable.
parallax: the parallax setting for Background 0, which is
bg_blocksif you've been following this tutorial. Right now it's value is 0.3, which means it'll move 30% as fast as the tiles on the foreground as Mario runs all over the place. You can change it if you want, but I think it's fine. you can delete
parallaxbecause you don't have a background for it.
Pick a level tile
Your level made with this tutorial in mind should be complete by now. Now you can give it a level tile!
Look around in the big ol' Rooms folder, and navigate through Official Levels -> World Maps and open rm_World1Map. Assuming JS did the same thing with level tiles I did with the first developer's kit posted, there should be 9 level tiles to the south of the START tile. Let's pick the one immediately south of it. Now edit its creation code.
levelnumb = (put the level number here; not really that important for this level though)
levelname = (put the name of your level here in quotes like "My Level")
myroom = (put the name of your level's first room here)
midwayroom = (put the name of your level's room with the checkpoint here--same as myroom since you have only one room)
If you are using the lite edition of Game Maker, you will have to skip this step. :(
There is a green arrow button in Game Maker's window that runs the game if you click on it. Do so and play through your level. Does if feel like a good Mario level to you? Are there parts that are too hard and should be toned down? Can you get all 5 Ace Coins?
Send it to us...well, not really
In a normal circumstance, you would send your source file to one of us devs for us to determine if we should put it in, tweak it a bit, or reject the design because it has too many problems. Since this is just a tutorial, you won't be doing that. For a serious level, though, you would.
Spend some time browsing through the SMF:R source and get a feel of it before making a real, serious level for the game. Also, you should try to learn how to use Game Maker in general (it has its own basic tutorial and help file for you) so you'll know how to add your own tiles and other stuff to make more customized levels. Thanks for reading, and here's hoping you get a good level contribution or two in Super Mario Fusion: Revival!
Lesson 2: Using the warp system effectively
If you've abided by the first lesson, you're well on your way to making professional levels for SMF:R. However, having only one room to work with is a big limitation. Just about all SMF:R levels have multiple rooms. Thus, it's a good idea to learn how to warp to other rooms.
The warp system requires some objects to be on top of others. Uncheck "delete underlying" when working on warps.
There's quite a handful of objects involved in the warp system. The following are in the "09. Warp" folder unless otherwise noted:
obj_warpmario: This is the object used when the character is warping. It can also be placed in a room instead of
obj_mariowhen you want the character to spawn inside a pipe. When spawned in a room, it moves to the right by default. It's in the Main folder.
obj_noteblock_warp: It's a note block that sends you flying into the air when you pounce on it... into a different room. It requires a code snippet to work. It's in the Blocks folder.
obj_down: Objects in the Platform Movers folder. Although they're used for moving platforms (duh), they can also be used to manipulate the player character's direction in a pipe.
obj_downalso stops the character from being shot into space from
obj_warpleavetown: A warp object for leaving towns. Town development is restricted to the core dev team, so don't worry about this one.
obj_warpright: These objects allow entry into a pipe. The one you should use depends on what direction you want to enter from. For example, if you wish someone to enter a pipe from the top, use
obj_warptoptouch: An object that changes the room to the next on the list when touched (doors and pipes unnecessary). Despite the name, it works when touched from any direction.
obj_warptoptouch, but can warp to any room. It requires a creation code snippet to work properly.
obj_postchange: This object allows for warping to a different spot in the same room when placed over a door's bottom half or in a pipe. It requires a creation code snippet.
obj_warpnextroom: An object that changes the room to the next on the list. It should be placed over a door's bottom half or in a pipe.
obj_warpnextroom, but can warp to any room. It requires a creation code snippet to work properly.
obj_warpcannon: Should the character's warp object touch this as it's going down a pipe, it will shoot the character out of it. Note that you won't have any control over the character unless the character object is stopped with collision solids or
obj_down. Should you wish to use a warp cannon as part of a transition to another room, use
obj_warpcannon, except this is intended for use with those big diagonal Super Mario World pipes.
obj_door_hidden_locked: It's a door. A warp object like
obj_warpnextroomshould be on top of its lower half, otherwise it won't do anything useful. The locked variant requires a key to unlock, and the bomb variant requires explosives to access. The hidden doors only appear when a P-Switch is used.
The code snippet
obj_postchange and the any-room warp objects require a snippet of creation code to work. This snippet, to be precise:
postchange = 1 postx = [New x position] posty = [New y position] posttype = [0 if the character will not be in a pipe, 1 if he will be] myroom = [The room which you wish to warp to]
obj_postchange requires just
obj_noteblock_warp requires only
myroom. Since only the room variable is supplied with
obj_noteblock_warp, the character will spawn where
obj_jumpspawn is as the room is created.
Important information regarding pipe warps
There are a few things to keep in mind when working on pipes.
- All of the pipe you intend to use needs to be covered with solid objects. All of it.
obj_warpmariochanges direction the instant it collides with a platform mover object.
obj_warpmariois 32x32 in size. Therefore, platform mover objects generally need to be placed just outside of your intended trajectory.
obj_mariowhen it is no longer colliding with a solid (the warp cannon scenario is an exception). You can use this functionality to make pipe mazes in one big room. You don't have to have
obj_warptopor its relatives at both ends of a pipe either.
Examples of the warp system being used
You can simply look up levels with warps to get an idea of how they work. Here are a few suggestions:
- Doors, Post Changes, Touch Warps: 1-GH2--Boo Belltower (
- Pipe Maze: Red Switch Palace (
rmSwitchPalaceRed, in the Special folder)
- Warp cannons (both types): 4-SHIP--Belly of the Dragon (
Lesson 3: Using the parallax background system
In Lesson 1, you were given a quick rundown of how the parallax system works. This lesson goes into great detail about how to use this powerful feature. Parallax gives your levels the illusion of depth. The more layers of parallax you use, the more dramatic the illusion of depth your level has. You can use up to 8 background layers for use in the parallax system.
While in the Backgrounds tab in the Room Editor, you can assign specific background resources to up to 8 background layers. You can also set up each layer's initial X and Y offsets, whether or not they are tiled vertically and/or horizontally, as well as horizontal and vertical speeds. For the speeds, it is highly recommend that you assign values to these settings via creation code (examples are below) since the room editor does not allow you to input decimal values for the speeds. The smallest allowed non-zero value, 1, is often too fast for some autoscrolling layers in-game. The parallax system utilizes all of these background layer settings.
Creation code variables
When you edit the creation code of a room's
obj_parallax object (represented by an icon consisting of green hills with eyes), you would use the following variables:
num_bkgs : Number of backgrounds in the Room. (As of SMF:R source revision 46, this variable is deprecated and ignored) parallax[n] : Parallax Rate for the 'x' axis of background layer 'n'. 'n' must be an integer between 0 and 7 inclusive. Use values between 0 and 1. Values close to 1 increase parallax speed. Values close to 0 decrease parallax speed. parallax_y[n] : Parallax rate for the 'y' axis of background layer 'n'. 'n' must be an integer between 0 and 7 inclusive. Use values between 0 and 1. Values close to 1 increase parallax speed. Values close to 0 decrease parallax speed. SPECIAL VALUES TO USE FOR BOTH PARALLAX ARGUMENTS: 0 or 1 : Follows screen scrolling on the given axis, allows BG layer autoscroll settings from room editor (if a BG layer's Hor. Speed and Vert. Speed are both 0, the BG layer moves with the screen scrolling [no parallax at all] in all directions) -1 : Follows the view on the given axis, allows BG layer autoscroll settings from room editor (if a BG layer's Hor. Speed and Vert. Speed are both 0, the BG layer remains completely static in the view.) follow_yview : Set to TRUE to allow horizontal scrolling on all layers while following the view on the 'y' axis. This is a shortcut to setting every BG layer's parallax_y to -1 SPECIAL SCRIPT CALLS: parallax_[n] = width_parallax_scrollrate_bgroom(n) derives a horizontal parallax scroll rate, which fits the width of the background image in background layer 'n' with the width of the room. parallax_y[n] = height_parallax_scrollrate_bgroom(n) derives a vertical parallax scroll rate, which fits the height of the background image in background layer 'n' with the height of the room.
You will notice as you look through many of the
obj_parallax creation codes that they have a line assigning a value to variable
num_bkgs. Do not worry about that variable, since it has been made obsolete with the overhaul of the parallax system and is ignored. When you make your creation code to set up your room's parallaxing, you do not need to use variable
If you want a layer to move at half the rate of the screen scrolling, you would use a parallax value of 0.5 (or 50%). A rate of 10% is represented by a parallax value of 0.1. A value of 0 or 1 will make a layer move at the same rate as the screen scrolling. A value of -1 will make a layer stay unmoving on the screen.
Background layer 0 is the layer that is furthest back. Generally, this layer would have the smallest parallax setting. Background layer 7 is the later that is furthest forward; it is drawn on top of all other background layers and is usually given the highest parallax setting.
Examples of use in official SMF:R levels
World 1-1 (The Entryway), room
parallax = 0.3 parallax = 0.6 parallax = 0.6
This creation code snippet makes background layer 0 move at 30% of the main screen's movement speed, while layers 1 and 2 move at 60% of the main speed.
Parallaxing on both axes
World 1-S2 (Perplex Caverns), room
parallax = 0.3 parallax_y = 0.3 parallax = 0.6 parallax_y = 0.6
Background layer 0 moves at 30% of main scroll speed in both axes. Background layer 1 moves at 60% in both axes.
Static view backgrounds with autoscroll
World 4-F1 (Wretched Winterland), room
parallax = 0.25 parallax = -1 parallax = -1 parallax = 0.50 parallax = 0.75 background_hspeed = -0.15 background_alpha = 0.35
Note you can change a background layer's transparency value (alpha) and horizontal/vertical movement speeds in creation code as well. In this code snippet, background layer 1 will remain completely static in the player's screen (due to its parallax value set to -1). This is useful for stationary sky objects, like the sun or the moon. Setting
parallax_y[n] to -1 will lock background layer 'n' to the view, with no parallax movement in the vertical aspect.
Backgrounds that follow the screen scrolling, with autoscroll
World 5-1 (Cloudy Plains), room
num_bkgs = 2 parallax = 0.3 parallax = 1 (or 0) background_alpha = 0.5 background_hspeed = -0.25
In this code snippet, background layer 1 will follow the screen scrolling, modified by the horizontal move speed settings set by
background_hspeed = -0.25