
Press F1 while in the Options menu to active DEVELOPER'S MODE - although this will unlock all levels, be warned that this will remove any record of your progress!  Press F1 again while the ball is still in the launching cannon (in-game) to open up the level editing interface.  

It's mouse driven, and has instructions on the screen.  Here are some basic controls for the in-game map editor:

Mouse click:
--Right click on values to change them quickly, left click for 1 by 1 (notice that each value has a negative and positive side to click on)
--Left click to select items to paint with, and then left click on the map area to place them
--Right click to relocate the player's start cannon
--Click on the Bumper sign to switch whether the level starts with inflated bumpers

Key F1 in DEV MODE while in-game: if the player is in a cannon, the map editor will open up
Key F2 in DEV MODE while in-game: goto previous level
Key F3 in DEV MODE while in-game: goto next level
Key F5 in DEV MODE while in-game: return to start cannon at no penalty (required to open map editor)


There are a few things you should know about the level format, since you'll need to edit it by hand to chance the level title, the background image file, and to put your name in it as the map author.

Levels are labelled l###.dat in the dat/ folder within the RowdyRollerz directory.  For example, level 1 (the first level that loads) opens up l001.dat for level information.  Open l001.dat or any other level data file in a plain text editor to change their contents.  To see the map line up correctly you'll want to use a fixed-width font, not a proportional one - i.e. "monotype" or "System" or "Terminal" instead of "Times New Roman" or "Verdana."  Every letter must be of equal width, whethers it's a lowercase 'i' or a capital 'W', because that's what will make your level grid line up for easy visualization.

When you open a l###.dat file in a text editor, you'll see something like this:
-----------------------------------

[MapArrows]
r00 = ################
r01 = #!qi49u_VVVVVVV#
r02 = #pr05-_>>>>>>>$#
r03 = #bj16|_>>>>>>>$#
r04 = #sk27h_>AAA<AAA#
r05 = #tf38e_>AAA<_c_#
r06 = #_l__u_>vvv<_p_#
r07 = #>>VVV>}]]w{__l#
r08 = #>@>>>>}*[[{_h_#
r09 = #>>AAAAA^^^<_p_#
r10 = ################

[MapVals]
inflateBumpers = 1
levelTime = 50
reserveBalls = 1
difficulty = 1
ballSpeed = 1.000000
gravityPower = 1.000000
arrowSpeed = 1.000000
backgroundjpg = dat//l001.jpg
levelTitle = This is a level title!!!!!
author = First L

-----------------------------------
The [MapArrows] section is the actual level layout.  Items, arrows, the starting point and any finishing targets are all on the MapArrows grid.  Be sure to leave the "r## = " in order at the beginning of each line, because that's how the game is reading the sections.

The [MapVals] section has various variables affecting the level.  'inflateBumpers' = 0 means the level starts with open gutters, whereas 1 would mean the bumpers start inflated.  'levelTime' isn't in seconds, but changing the values and testing your levels will give you a sense of the time scale (40 is easy, 30 is reasonable, 20 can be tough).  'reserveBalls' is how many "extra lives" the player can lose on this level before being sent back to the previous level.  'difficulty' is currently unused, but may be used in future versions to determine music, effects, graphical sets, etc.  'ballSpeed' is a scalar on the ball's maximum speed in this level, 'gravityPower" is a scalar on the levels' gravity, and 'arrowSpeed' is a scalar on how much influence arrows have on the ball's velocity.  'backgroundjpg' is the name of the jpg image to use for the level's background (feel free to reuse the images included) 'levelTitle' is the name that will flash at the top when the level starts, 'author' name is only used on the map selection screen.  Sorry folks, but the game's credits are hard-coded :-P.

Levels are a grid of 16x11.  Every spot in the grid has to have some kind of symbol in it.  The types of symbols are:

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

@ : PLAYER_START :: Only one of these should show up in the level.  This is the launch point.  The spot beneath the player's ball is just assumed blank.

_ : NONE :: Blank.  The ball carries it's momentum.  Nothing fancy.

# : GUTTER :: The program automatically determines corners, t sections, crossing points, etc.  Gutters can cause the ball to get trapped and roll down/left, until it arrives at a bottom-left corner (pipe extends up and right), which has a terminating hole in it.  A ball can bounce out of the gutter if it has enough momentum.  If the player gets a smiley face ("h") the gutters inflate into bumper bowling pads, making the level enormously easier.  Typically gutters surround the level, but they can also be removed, or cut through the middle of the level in sections.

V : DOWN :: Down arrow.  Causes the ball's vertical velocity to tend towards down.  If the player pushes an up or down key, all vertical arrows switch direction.

> : RIGHT :: Right arrow.  Causes the ball's horizontal velocity to tend towards right.  If the player pushes an left or right key, all horizontal arrows switch direction.

< : LEFT :: Left arrow.  Causes the ball's horizontal velocity to tend towards left.  If the player pushes an left or right key, all horizontal arrows switch direction.

A : UP :: Up arrow.  Causes the ball's vertical velocity to tend towards up.  If the player pushes an up or down key, all vertical arrows switch direction

v } { ^ :: Down, Right, Left, and Up "Double Strength" Arrows.  These affect the ball's velocity vector twice as fast.  The ball's max speed is temporarily increased, as well.  These arrows bounce quickly, glow, and have two heads, like a fast-forward button on a VCR.

w ] [ * :: Down, Right, Left, and Up "Stiff" Arrows.  These arrows cannot be flipped by the player, but otherwise behave as ordinary player arrows do.  These arrows do not bounce, have a black outline, are colored opposite of normal arrows, and have thin lines going across them.

$ : DESTINATION :: Each level needs one of these, because it's the only way a player can advance.  You can place more than 1 in the level to have multiple exit points.

! : LAVA :: Causes the player to lose a ball.  Once enough balls are lost, the player is sent back a level.

p : PINBALLBOUNCER :: Just like the old pinball machine bouncers.  This is just a circular component which causes a ball to speed away violently after it makes contact.

s : MUDPIT :: Causes a ball to slow down significantly.  Also kills any bounce in the ball.

t : RANDOMTELEPORTER :: Makes the ball appear at a random location on the map.  Note that this isn't fool-proof, and if it isn't used in levels specifically made for it, could potentially leave the player trapped.

q : SPINNERCW :: An arrow that spins constantly clockwise, but otherwise acts like one of the standard arrows.

r : SPINNERCCW :: An arrow that spins constantly counter-clockwise, but otherwise acts like one of the standard arrows.

j : SPRING :: Makes the ball jump.  At full speed the ball will clear about 3 tiles if it hits a spring.  The ball will bounce to rolling again.  As long as the ball isn't on the ground, it doesn't respond to any tiles underneath it.  If a ball lands on a barricade that it cannot roll from (brick wall, ice cube) then it will just keep bouncing forward until it finds space.

k : SUPERSPRING :: Like the spring, but with significantly higher power.

f : FLAME :: Heats the ball into becoming red hot for a short duration.  During those seconds that the ball is still red, it can burn right through Ice Cubes on the map that previously stood in the way.

i : ICE :: Acts like a brick wall, except that it will disappear if the ball hits it while heated by fire.

- : POLARIZEMOTION_HORIZ :: Turns all magnitude into horizontal velocity of similar heading.  This can be used to very tightly constrain motion over a distance or before a jump spring.

| : POLARIZEMOTION_VERT :: Turns all magnitude into vertical velocity of similar heading.  This can be used to very tightly constrain motion over a distance or before a jump spring.

h : INFLATE_GUTTERS :: Toggles to being a pushed button if it's currently up (and moving).  This is a yellow Happy smiley face button that causes the gutters to become filled with repelling blue bumpers.  You can add more than one of these per level, and they'll all shut off and turn on at the same time when one of them is hit.  DEFLATE_GUTTERS does the opposite effect, and causes all of these switches to rise.

u : DEFLATE_GUTTERS :: Toggles to being a pushed button if it's currently up (and moving).  This is a green Unhappy frowny face button that causes the bumpers to vanish, exposing the gutters.  You can add more than one of these per level, and they'll all shut off and turn on at the same time when one of them is hit.  INFLATE_GUTTERS does the opposite effect, and causes all of these switches to rise.

c : CLOCK_REFILL :: Gives the player all of their time back, no matter how low on time the player was.  This item is removed once picked up.

e : BALL_EXTRA :: Adds 1 to the player's ball reserves for a level.  This item is removed once picked up.  Consider reducing the number of balls the player begins with, and then scattering these around in easy-to-reach locations if you want to add dimension to your level.

b : BRICKWALL_STATIC :: The ball bounces off the brick wall.  Nothing special.

l : LAUNCHCANNON_STATIC :: Acts as a reuseable cannon to launch the ball from.  The player has full control over angle and power from the cannon by using the arrows, and spacebar fires.  These re-appear from the firing point, meaning that the start location of any level is now a reuseable firing point that the player can steer back to for control.

0 : UNDERGROUNDPIPE1A_STATIC :: Teleports the ball instantly to 1, i.e. UNDERGROUNDPIPE1B_STATIC
1 : UNDERGROUNDPIPE1B_STATIC :: Teleports the ball instantly to 0, i.e. UNDERGROUNDPIPE1A_STATIC
[Teleporters work in pairs. (0,1) (2,3) (4,5) (6,7) (8,9) are the five funtioning pairs of teleporters available to you as a level designer.  The portal rims are color coded, so the player doesn't have to guess where the teleports will come out.]

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

Levels are only loaded from the file at the start of each mission, so as long as there is a .dat and image .jpg (of proper pixel dimensions - see the included examples) for the next level, the game will keep reading them and playing.  You can edit a level and then reload the game and immediately see the changes.  The code does not need to be recompiled each time.

General Map Making Tips:
-Don't put a teleporter on the map unless it's pair is present (even digit and the next odd, or odd digit and the previous even).
-Don't put more than one starting position.
-Don't put a gutter piece on its own or it will convert to lava (gutters must connect as pipes)
-Don't make a level ridiculously hard, or even good players won't appreciate it.
-Avoid entire rows of horizontal arrows, or colums of all vertical arrows, because the player could get the ball trapped in these sections and be forced to run out of time.
-Start by making a map where the arrows cause the player to win naturally, then go through and switch wide areas of arrows so the player has to time switching.
-Think outside the box.  Maybe make a level that's islands surrounded by lava with jumps & teleporters between, or a level that's all just brick walls (no arrows?) and the player has to angle the first shot correctly.  Experiment with strange gutter configurations, and ways to make fire-ice puzzles interesting.

Thanks for taking an interest in mapping for Rowdy Rollerz.  I think you'll find it fun, and discover that making a fun map can be a fairly entertaining game in its own right!

Also, note that maps will load MUCH slower on the map scrolling screen if you are in developer's mode.  This is because it will recheck and re-render the thumbnail for each map accessed, to ensure that the next non-map editing player will have accurate mini-maps.

To disable the Developer mode, you must fill the "Reset progress" bar in the Options menu.

-Chris
cdeleon@andrew.cmu.edu

