The Jetpack 2 Level Editor is a very powerful tool, allowing you to easily create anything from a simple puzzle, to a detailed story with journal entries, to an imaginative maze with moving Tile Groups and custom scripting. The Level Editor is lots of fun, and takes only a short time to master.

Getting to Know the Editor
Drawing Your Level
Playtesting!
Advanced Editing Tools
Tile Groups
Level Settings
Ini Config File
Ini Config: Text Blocks
Ini Config: Scripting
Tile Triggers
Tips for Designing the Best Levels

Getting to Know the Editor

A great way to get started is to view some sample levels.

Press
TAB
to activate the Level Browser. Check out the shared folders, where you can see what other people are building. Load a level to explore the inner details of different level designs.

When you're ready to build your own level, press
SHIFT+N
to create a new level. The Level Settings dialog will appear, with many settings for configuring your level. Right now, the only ones that need your attention are Title and Background. After you name your level, press
ESCAPE
to exit and begin designing your level.

You can save your level at any time by pressing
SHIFT+S

Keyboard Shortcuts

TAB
: Level Browser - Browse your levels, and other user-created levels
SHIFT+N
: New level
SHIFT+S
: Save level
SHIFT+L
: Level settings
SHIFT+A
: Advanced Scripting / Ini Config

Drawing Your Level

You create a level by "drawing" tiles onto the level map. The map has 9 layers (like background, solid, & foreground), and each tile belongs to a specific layer.

Select a Tile

Select a tile with the Tile Picker (
SPACE
), or grab a tile with
Z
or by holding
SPACE
.

0-8
: Switch layers. Each layer remembers its last used tile.
< , >
: Rotate/cycle tile alternates
JDGIFBLTS
: Quick-select certain tiles
PAGE UP/DOWN
: Change tile theme
BACKSPACE
: Put away the tile (stop drawing)

Drawing

While holding a tile,
drag the mouse
to draw with the current tile

Hold SHIFT + click
: Place the tile on the free-range layer instead of the tile's normal layer
Hold CTRL + drag
: Delete tiles

Playtesting!

Playtesting your level is fun, and essential to making sure your designs work in all situations. Share your incomplete level with friends to get feedback and ideas.
TIP: Temporarily move Jetman's starting location to test different parts of your level

Keyboard Shortcuts

ENTER
: Playtest your level
SHIFT+ESCAPE
: Quit back to editor
F2
: Live edit mode
+ / -
: Change game speed

Cheat Keys

Cheating can be essential when testing difficult parts of your level.
(you may substitute
SEMICOLON
for
HOME
)
HOME+INSERT
: Open/close door
HOME+DELETE
: Suicide
HOME+F
: Fill fuel tanks
HOME+I
: Invincible Jetman

Advanced Editing Tools

Select a Rectangular Area

While not holding a tile,
drag the mouse
.

SHIFT+X
: Cut,
SHIFT+C
: Copy,
SHIFT+V
: Paste
DELETE
: Delete the selection
SHIFT+F
: Fill with the current tile
SHIFT + 0-8
: Hide/filter layers
\ (backslash) + A-Z
: Toggle Tile Group
Note: In paste mode, Fill & Delete apply to the clipboard.

Hiding Layers

It's easier to see background layers if you hide foreground layers - especially if you are using the opaque layer to conceal parts of your level.

Hold 0-8
: View only a layer or combination of layers.
Hold SHIFT
while releasing the numbers to lock

Special Tools

SHIFT+T
: Convert level to the current theme
SHIFT+ARROWS
: Shift tiles (with wrap)
Note: In paste mode, these apply to the clipboard. Some commands don't work in live edit mode.

SHIFT+I
: Import a .JET file
SHIFT+E
: Export to .JET file

Tile Groups

Powerful automatic effects are available by using Tile Groups. You can put a group of tiles into motion, trigger disappearing rooms, or cause tiles to be created. A level may have up to 26 groups, represented by the letters of the alphabet.

Assigning Tile Groups

Every tile in your level can by a member of any number of groups. When Tile Groups are visible, each tile is overlayed with its group letters.

\ (backslash) or Eszett
: View Tile Groups
While viewing:
\ (backslash) + A-Z
: Toggle Tile Group

Tile Group Effect Editor

SHIFT+G
: Edit Tile Group effects
While you edit the group's effect, a preview of the effect is shown.
You may also assign tile groups to tiles from this dialog.

Tile Group Settings

name
: For your own reference. Spaces are not allowed.
triggerRange=#
: In tiles. Only applies to trigger "proximity". The maximum range is 5 tiles.
globalSound=$id
: The sound played when the group activates. The sound has no position. See list at Scripting/playSound.

Triggers

atStart
: Run when the level starts
proximity
: Run when the player enters a certain range of any tile in the group
proximityStop
: (requires "proximity") Stops when the player leaves the proximity of the group
triggerRestarts
: Re-triggering the group restarts it from the beginning
onceOnly
: The group can only be run once
autoReverse
: When the group is triggered OFF, it first reverses to the beginning, then stops. Does not apply to scripts.

Effects

To run a script as a group's effect, use
[when $groupName]
. Scripts are not reversible.
create
: Create the tiles in the group, if they don't already exist at their starting locations.
destroy
: Destroy the tiles in the group. If "duration" is set, uses a fade out effect first.
fadeIn
: Changes the opacity of the tiles to make them visible.
fadeOut
: Changes the opacity of the tiles to make them disappear. Use with the opaque layer to reveal hidden rooms.

moveLine
: Move the group in a line
   
angle=#
: The direction to move, in degrees. 0=right, 90=down.
   
distance=#
: The distance to move, in tiles
moveEllipse
: Move the group in a circle or oval
   
center=x,y
: The center point, in tiles
   
track=x,y
: Rotate a single tracking point instead of each tile. Maintain's the group's shape.
   
axisRatio=#
: Adjust the shape. 1=circle.
makeDynamic
: Make static tiles like bricks, become movable and affected by gravity
   
randomPush=#
: Increase the spread of the objects by giving them a push
phase
: Phase out the phaseable tiles in the group

General Effect Settings

duration=$seconds
: How long the effect lasts before stopping or reversing
options=$options
: reversed, pingPong
easing=$type
: none, slow-fast, fast-slow, slow-fast-slow, fast-slow-fast, endBounce
iterations=#
: How many times the effect repeats. To reset the counter, use triggerRestarts

Effect Options

reversed
: Forward & reverse are swapped. Ignored by scripts.
pingPong
: When the effect ends, it will reverse to the beginning. This counts as 2 iterations.

Level Settings

Achievements

Achievements enhance gameplay by giving players extra goals. In Jetpack 2 this is especially useful: achievements are used to give expert players a run for their money, while beginners are still able to beat the level. Try to make your achievements clever, and tricky.

Par & Master Times

The Par & Master Times are another kind of achievement, to make the game more challenging for experts.

To beat these times, a player must collect all the treasure AND the idol before making it out the exit door. Make sure to include these when measuring your level's times.

Par Time
: An average player should be able to beat this time after a few tries.
Master Time
: An expert player must navigate the level almost perfectly to beat this time.
TIP: You MUST include getting all the treasure AND the idol when measuring Par & Master Times!

Other Settings

Reset on Death
: Normally, when the player dies, the world continues to run. This setting forces the world to reset on death. Certain designs may need this to prevent the player from entering an unwinnable scenario. Avoid using this setting unless absolutely necessary.

Disable Stains
: Smoke and blood stains may look good on the walls, but if your level has any "open air" spaces where there is no back wall, they look odd. Use this setting to disable them.

Ini Config File

The Ini Config file can contain configuration settings, text blocks, journal entries, or scripting.
TIP: Case matters - camelCase is recommended

Settings Sections

[group $letter:$name]
: Tile Group settings
[groupEffect $letter:$type]
: Tile Group effect settings

Tile Groups

Advanced users may find it more convenient to edit Tile Groups in the Ini Config file rather than the dialog. This makes editing faster, and allows for copying group settings to other levels. Note: the dialog edits only the first groupEffect for each group.
See Tile Groups for details.

Example

[group A:movingPlatform]
triggers=atStart
[groupEffect A:moveEllipse]
duration=12
options=reversed
track=0,-3.5
axisRatio=1.5

Ini Config: Text Blocks

Text sections of the Ini Config file can contain notes to yourself, journal entries, notification messages, and popup dialog text.

Text Sections

[editorNotes]
: Design goals & notes that should be respected during future editing
[editorTodo]
: Remaining "to do" list for completing the level

[msg $trigger]
: Plain text
[help $trigger]
: Markup for a help popup
[journal $trigger]
: Markup for a journal entry. Journal entries are only added once, no matter how many times they are triggered.

Triggers

See "Scripting/Triggers" for information on triggers.

Markup

In markup, newlines and extra space are ignored. To add a newline, use \n
Flexibility is limited - it's advised to stick to the format of the examples

Available Markup Tokens

<%set $varNames=$values%>
: Set variables & dialog overrides
<%panel%>
text
<%endPanel%>
: A rectangular area
<%image $imageId id=$id%>
: An image. The id affects the style.
Expert use only:
<%define $varName%>
text
<%endDefine%>
: Capture text in a variable
<%textRules id=$id spanclass=$class%>
: Set the id of the text element / wrap the text in a <span>
<%endText%>
: End a textRules block, also serves as a forced newline

Available CSS Classes

jrnSmall, help-header, help-center, help-secondary, help-centerSec, help-bold, help-small, help-more, help-footer

Available Images

$keyLayoutImage, IMG_exitDoor, IMG_idol

Available showGraphic

uiBigArrow_help, uiBigArrow_statusBox, uiBigArrow_fuelTank, uiBigArrow_achv, uiBigArrow_timer

Available Journal Images

IMG_journal_jetpack, IMG_journal_teleporter, IMG_journal_checkpoint, IMG_journal_gem, IMG_journal_idol, IMG_journal_spring, IMG_journal_trackbot, IMG_journal_talisman, IMG_journal_phaser, IMG_journal_switch, IMG_journal_computer

Examples

Storing sign text in the Ini Config

Give the sign tile a trigger ID:
@mulberryBush@
Ini Config:
[msg mulberryBush]
Here we go round
the mulberry bush

Journal entry embedded in a level

[journal autoInit]
Welcome to my level
<%panel id=iconArea%><%image IMG_journal_gem id=journalIcon%><%textRules spanClass=jrnSmall%>
These gems may hold the key to escape.
<%endPanel%>

Simple popup

[help simpleHelp]
<span class='help-center'>Here's some help text.\nAnd some more.</span>

Advanced popup

[help advancedHelp]
<%set title="Advanced Help Box" showGraphic=uiBigArrow_fuelTank moreLink="More Info ..."%>
<span class='help-center'>There's an arrow pointing at the player's fuel.</span>
<span class='help-centerSec'>Here's a picture of a door.</span>\n
<%image IMG_exitDoor%>
<%define moreContent%>
  <span class='help-header'>More Info</span>\n
  Press <span class='key'>MINUS</span> to slow down
<%endDefine%>

Ini Config: Scripting

Script sections run as follows: check TRIGGER / ( select TARGET / execute COMMANDS / repeat )
TIP: Case matters - camelCase is recommended

Script Sections

Each section is it's own self-contained script.
[when $trigger $settings]
: Runs when trigger is set ON
[whenOff $trigger $settings]
: Runs when trigger is set OFF

Triggers

A trigger can be a simple true/false condition that you name and trigger manually, like "heHitTheSwitch". There are also several automatic triggers.
TIP: To avoid confusion, it's recommended to avoid using the same names for triggers & tile groups.

Automatic Triggers

[when autoInit]
: The level is starting for the first time, or restarting
[when autoReady]
: The level is ready to play, any intro transition is complete. Also runs after respawn.
[when autoAction]
: The action has started. Also runs after respawn.
[when autoEachTreasure]
: The player got a treasure.
[when autoEachGem]
: The player got a gem.
[when autoAllGems]
: The player got all the gems. This can reverse on death (perfectionist).
[when autoVictory]
: The player completed the level
[when autoDeath]
: The player died

[when switch:$color]
: A switch was toggled (blue, red, cyan, or silver)
[when $groupName]
: A Tile Group was toggled

Achievement Triggers

Be aware that these are reversible, and some start already on.
achvTreasure
,
achvIdol
,
achvTalisman
,
achvEarthDay
,
achvFuelMiser
,
achvOutOfPhase
,
achvRestYourLegs
,
achvTheMcCoy
,
achvSuperstitious
,
achvSwitchophobe
,
achvNinja
,
achvUntouchable
,
achvTheTrapper
,
achvFoolsGold

Trigger Settings

pauseOnToggle
: When the trigger toggles, pause the script.
stopOnToggle
: When the trigger toggles, terminate the script.
triggerBind
: The script is bound to the thing that triggered it. Allows multiple copies to run at once.

Targets

Syntax:
target $type

Target Types

target player
: Target the player
target trigger
: Target the object that triggered the script
target group=$ids
: Target all the tiles in group(s)
target type=$ids
: Target all tiles of certain type(s)
Jetman, Trackbot, Knight, SteelBall, EyeBall, Peppermint, Bat, BatBot, Flitzer, Missile, Seeker, SpikeWheel, Spring, exitDoor, gem, gem:gone, treasure:coin, treasure:pile, treasure:vase, idol, talisman
target world
: Target the world environment
target camera
: Target the viewport camera

Targetless Commands

wait
: Wait for any "slide" commands to complete
wait $seconds
: Pause script execution. (This could result in multiple copies of the script running at once.)
tick
: Defer execution until the text game tick
repeat @_marker_
: Loop back on the next tick. If @_marker_ is not set, loops back to start.
   
(total=$total OR time=$seconds)
: Repeat $total times or for $seconds seconds.
@_marker_
: A position marker used for looping
use $var=$value
: Set the default values to use with future commands: speed, time, easing

trigger $trigger
: Trigger other Ini Config sections matching $trigger
msg $text
: Display message $text in the notice window. Raw text must be "quoted".
runGroup $ids
: Activate Tile Group
stopGroup $ids
: Deactivate Tile Group
resetGroup $ids
: Reset Tile Group
toggleGroup $ids
: Toggle Tile Group
switch $color=$action
: Activate a switch (blue, red, cyan, or silver). Actions: toggle (default), on, off.
globalSound $id
: Play a sound that has no position.
stopSound
: Stop the current sound.

Targeted Commands

Note "+=2" means add 2 to the current value. Also available: -=, *=, /=
set $prop=$value $prop+=$value
: Set the targets' properties
   
random=$rand
: Multiply each value by a random number from 0-$rand before applying
reset $prop $prop
: Reset changes to the targets' properties. Does not apply to: x, y, angle, fuel.
slide time=$seconds $prop=$value
: Gradually change the targets' properties
   
easing=$type
: none, slow-fast, fast-slow, slow-fast-slow, fast-slow-fast, endBounce
slide (time=$seconds OR speed=$speed) x=$value y=$value
: Using slide to apply motion.
   
curve=$value
: Curve: 0=none, 1=circle, -1=reverse circle
destroy
: Destroy the target
playSound $id
: Play a sound at the target's position: boom, crate, glass, electro, powerup, treasure, idol, achv, notice, warning, retroBuzz, retroLaugh, futureDoor, switchOn, switchOff, switchOnOff, grind, elevator

Target Properties

These values are ratios unless otherwise noted: "1" represents the full default value. (To reset a value, use the "reset" command, not a number)
all entities
: x (tiles), y (tiles), angle (radians), velX, velY, velAngle, gravity, immobile / visuals: opacity, rotation (radians), scale, blendMode (string)

Jetman
: runAccel, runSpeed, climbAccel, climbSpeedX, climbSpeedY, driftAccel, driftSpeed, jumpUpSlam, jumpSideSlam, jetpackThrust, fuel=0-1, hasPhaseShifter=0/1, forceJump=1, forceJetpack=1, invincible=1
Trackbot / Knight
: runAccel, runSpeed, climbAccel, climbSpeedX, climbSpeedY, driftAccel, driftSpeed, targetTrackRadius
Bat
: accel, speed
BatBot
: accel, speed
Flitzer
: accel, aiTurnChance, aiReverseChance, aiSkipCycles=#
Missile
: accel, speed, sideAccel
Seeker
: speed, orbitGravity, orbitAccel
SpikeWheel
: accel, speed
Spring
: accel, upSpeed, downSpeed
SteelBall / EyeBall / Peppermint
: speed

World
: gravity
Camera
: shake=#tiles
Exit Door
: state=opening/closing
Spear
: state=fire
Alarm
: state=on/off/silent

Examples

Start the game with the red switch off, then toggle it every 3.5 seconds

[when autoInit]
switch red=off
wait 3.5
switch red
repeat line=2

Give the player super jump ability, only while holding the talisman

[when achvTalisman]
target player
set invincible=1
msg "You are now invincible!"

[whenOff achvTalisman]
target player
reset invincible
msg "You are now mortal."

Tile Triggers

Some tiles can display messages. The message can also contain a trigger ID, that triggers Ini Config sections.

Activation

Tiles activated by player touch: textSign, invisibleTrigger, journalIcon, helpIcon
Tiles activated by any touch: triggerTouchSwitch
Tiles activated by player use: triggerSwitch
Note: Contacts existing at level start do not activate triggers.

Syntax

optional text to display @_triggerId_/_setting_/_setting_@
@_triggerId_/_setting_/_setting_@
: Triggers Ini Config sections matching _triggerId_. _setting_ is optional.
TIP: If the triggerId matches a tile group name, that group will also be activated.

Settings

Trigger Type

(none/default): Each activation triggers ON
off
: Each activation triggers OFF
toggle
: First activation triggers ON / Next activation triggers OFF / repeat
held
: Activation triggers ON / Deactivation triggers OFF

Trigger Source

This only applies to touch switches and invisible triggers.
(none/default): invisible triggers=
player
/ touch switches=
all

player
: The player triggers this
entity
: Entities trigger this (enemies)
solid
: Moving blocks trigger this
all
: All of the above

Other

limit=#
: Limit number of times tile can be triggered
destroy
: Destroy when limit reached (if no limit, destroy on activation)

Examples

An invisible trigger that activates a Tile Group only while it is touched

The platform is moving... @movePlatform/held@
Ini Config:
[when movePlatform]
runGroup movingPlatform

A switch that toggles super jump ability

Press to toggle super jump! @setSuperJump/toggle@
Ini Config:
[when setSuperJump]
target player
set jumpUpSlam=2.0
msg "SuperJump on"

[whenOff setSuperJump]
target player
reset jumpUpSlam
msg "SuperJump off"

Tips for Designing the Best Levels

General Tips

Uniqueness

What makes your level stand out from the rest? Here are some ideas.

Appearance

Decide on the look of your level before starting. Will you use heavy symmetry, a curvy flow, or random sections? An open feel, tight corridors, or partitioned rooms? Let the underlying design guide your visual choices.

Achievements

For the best player experience, try to make sure your level has all the available achievements.
I hope you enjoy using the Jetpack 2 Level Editor. I can't wait to see what you come up with!
- Adam Pedersen