EDGE Level Documentation

Table of contents

Smooth link transitions


Used Terms

XML File - file written in Extended Markup Language. Consists of tags that can have several parameters and can contain a list of nested tags.

<!--This is an example XML file, also this is a comment-->
<TagList Param1="Value1" Param2="Value2">
    <Nested1/>
    <Nested2/>
</TagList>
<NoList Param3="Value3"/>

PNG File - image file supported by most image editors.

Tick - 1 / 22 of a second. Used for timing in EDGE.

Compiled Feature - a shortcut for more efficient code constructed from basic elements. Upon compilation becomes a common element.


Types Table

A table for all types of parameters used for editing levels:

Name Values & Limits Example
int -2147483648 to 2147483647 556
short -32768 to 32767 -62
word 0 to 65535 256
byte 0 to 255 60
bool True / False True
nullbool True / False / Null Null
volume word x word x byte 15x24x7
2d vector (v2d) byte, byte 1,0
3d vector (v3d) word, word, word 6,900,5
ID text without (,)
template: word + index
Button5
ID with data ID(word), default for word is 0 Platform2(5)
text any text 2nd contact
<type> list <type>, <type>, <type>... ID1, ID2, ID3
version 2 - 4 numbers separated with . 1.20.5
version interval 2 4 number versions separated with , 1.0.123.1, 1.0.246.2
special will be mentioned when used StayDown

Coordinate System

The coord system in EDGE uses Z axis for height, instead of usual Y axis.


Dynamic level parts

Dynamic part of the level is stored in the XML file.

Format:

File: name.xml

Level

Level is a root tag of XML file.

It contains all dynamic elements of the level.

Parameters:

Name Required Type Default Description
ID Yes int - ID of the level. Should be different for each level
Size Yes volume - Size of the level. Each number must be a positive integer
SpawnPoint Yes v3d - Player spawn position
ExitPoint Yes v3d - Exit portal position
Name No text Name of the level
TimeThresholds No word list(5) 1,2,3,4,5 Time required for S+, S, A, B & C rank. Numbers must strictly increase
Theme No byte (0 - 3) 0 Theme of the level. If out of range then the theme will become 0 (level themes)
ModelTheme No byte (0 - 3) Level.Theme Theme of the models in a level. If out of range then the models will be invisible (level themes)
Music No byte (0 - 24) 6 Music ID of the level song. If out of range then the music will become 6 (level music)
MusicJava No bytes (0 - 11) 0 Music ID for the Java version. If out of range then the music will become 0 (level music)
Zoom No short (1 - 6) -1 Initial zoom of the level. If out of range then zoom will become 1
Angle No short 22 Initial angle of the level camera
FieldOfView No short 0 Initial FOV of the level

Moving Platform

Moving Platforms are controllable platforms in the level.

They spawn a block under the target position so player at the same position will stand on this platform.

Parameters:

Name Required Type Default Description
ID No ID - ID for referencing the platform
AutoStart No bool True Defines whether the platform will start moving immediately after level start
LoopStartIndex No byte 1 Define to which waypoint loop back after completing whole waypoint list.

If LoopStartIndex == 0 then platform will stop indefinitely
FullBlock No bool True Define whether the platform is a full block or a half block

If the platform should be moving relatively to other platform, use these parameters:

Name Type Description
RelatedTo ID Specify the platform that this one should follow (Compiled feature *)
Offset v3d Define the offset from the refered platform (Compiled feature *)

If the platform should have unique path, define the path by nested waypoint list:

Waypoints

Waypoints are used to define the moving platform's path.

Parameters:

Name Required Type Default Description
Position Yes v3d - Position of the waypoint
TravelTime No word 0 Defines a time (in ticks *) how long the platform should move from the previous waypoint.
Should be greater then 0 for most cases or else the platform won't move
PauseTime No word 0 Defines a time (in ticks *) how long the platform should wait after reaching current waypoint

Buttons

Common
Button
Null
Button

Buttons are used to control various elements in the level.

Parameters:

Name Type Default Description Valid in ButtonSequence
ID ID - ID for referencing to the button Yes
Visible nullbool True Defines the visiblity of a button.

If Visible == Null then the button will be semi-transparent
Yes
Mode special StayDown Defines button behavior (button modes) No
DisableCount byte 0 Defines how many times the button can be pressed No
TriggerAchievements ID with data list empty list Defines the achievements to trigger upon pressing the button No
AffectMovingPlatforms ID with data list empty list Defines the platforms to move upon pressing the button.
ID data defines how many waypoints to proceed
No
AffectButtons ID with data list empty list Defines the buttons to switch upon pressing the button.
If ID data is 0 then the button will be pressed upon starting level
No
AffectBumpers ID with data list empty list Defines the bumpers to switch upon pressing the button No
1st Positioning
Position v3d 0,0,0 Defines the button position in the level Yes
2nd Positioning
MovingPlatformID ID 1st Positioning Sticks the button on the moving platform Yes

Button behavior

A button can be at one of 3 modes:

  • StayDown - upon pressing the button the waypoints will be proceeded and if DisableCount == 0 then the button will stay pressed upon getting off
  • StayUp - acts the same as StayDown button except can be pressed unlimited times
  • Toggle - acts the same as StayUp button except upon getting off returns affected elements to their state before pressing the button

Falling Platforms

Falling Platforms are platforms that fill fall after some time after stepping on them.

They spawn a block under the target position so player at the same position will stand on this platform.

Parameters:

Name Required Type Default Description
Position Yes v3d - Position of the falling platform
FloatTime No word 20 Defines how many time (in ticks *) the falling platform will float after stepping on it

Bumpers

Bumpers are blocks than bump cubes.

Parameters:

Name Required Type Default Description
Position Yes v3d - Position of bumper in the level
ID No ID - ID for referencing the bumper
Enabled No bool True Specifies whether the bumper is enabled or not

To control bumper's direction we use the following tags:

Bumper Directions

North, South, West, East tags are used to define bumper's impulse direction.

Parameters:

Name Type Default Description
StartDelay short 0 Defines the delay (in ticks *) before the impulse start
PulseRate short 0 Defines the pause between each pulse (in ticks *)

Resizers

Resizers change the player's size.

There're 2 types of resizers:

  • ResizerGrow (changes player's size to normal)
  • ResizerShrink (changes player's size to small, 1 / 27 size of original)

Parameters:

Name Required Type Default Description
Position Yes v3d - Position of the resizer
Visible No bool True Defines the visibility of the resizer
Radius No v2d 0,0 Defines the expansion of the resizer hitbox (Compiled feature *)

Prisms

Prisms are used to boost player's speed.

Also it's required to collect all prisms for S or S+ rank.

Name Type Description
Position v3d Position of the prism

Checkpoints

Checkpoints are used to help player progress throught the level.

If you fall into the void or get crushed then you'll respawn on the latest checkpoint.

Parameters:

Name Required Type Default Description
Position Yes v3d - Position of the checkpoint
RespawnZ No short 0 Defines at what Z coordinate the player will respawn
Radius No v2d 0,0 Defines the expansion of the checkpoint hitbox

Camera Triggers

Camera Triggers change the player viewpoint.

Parameters:

Name Required Type Default Description Invalid with Advanced Camera Mode
Position Yes v3d - Position of the trigger - No
Zoom No short (1 - 6, -1) -1 Sets camera zoom (6, 5, 1, 2, 3, 4, from closest to farthest).
If the value is -1 then triggers the advanced camera mode.
You must specify Duration in advanced camera mode.
Angle,FieldOfView No
Angle No short 22 Sets camera view angle Zoom,FieldOfView Yes
FieldOfView No short 22 Sets camera FOV Zoom,Angle Yes
StartDelay No word 0 Defines delay (in ticks *) before translating camera view - Yes
Duration No word 0 Defines time (in ticks *) needed for translating camera view - Yes
SingleUse No bool False Defines whether the trigger can be triggered once or multiple times - Yes

Button Sequences

Button Sequences are used to group several buttons.

Parameters:

Name Type Default Description
SequenceInOrder bool False Defines whether the buttons need to be pressed in order
TriggerAchievements ID with data list empty list Defines the achievements to trigger upon pressing the button
AffectMovingPlatforms ID with data list empty list Defines the platforms to move upon pressing the button.
ID data defines how many waypoints to proceed
AffectButtons ID with data list empty list Defines the buttons to switch upon pressing the button.
If ID data is 0 then the button will be pressed upon starting level
AffectBumpers ID with data list empty list Defines the bumpers to switch upon pressing the button

Other
Cube
Dark
Cube

Other Cubes

Other Cubes are helping or hindering the player.

There're 2 types of other cubes:

  • OtherCube - upon stepping on the question mark, the hologram appears as a hint how to pass a certain level part
  • DarkCube - dark cube that usually hinders the player from passing the level

Parameters:

Name Required Type Default Description
PositionTrigger Yes v3d - Position of the cube trigger
PositionCube Yes v3d - Cube spawn position
MovingBlockSync No ID - If defined, cube will start moving when platform reaches its 1st waypoint.
Radius No v2d 0,0 Defines the expansion of the cube trigger hitbox (Compiled feature *)

To control cube, use the following tags:

Key Events

Key Events are tags for controlling cubes.

Tag format:

Part 1: North, South, West, East
Part 2: Down, Up
Separator: None

Tag Parameters:

Name Type Default Description
TimeOffset word 0 Defines the time offset (in ticks *) from cube spawn when the key should be pressed / released

The following table contains the time offsets for cube to roll certain amount of blocks:

Blocks Ticks Blocks Ticks Blocks Ticks Blocks Ticks
1 8 6 46 11 81 16 111
2 16 7 53 12 87 17 117
3 24 8 60 13 93 18 123
4 32 9 67 14 99 19 129
5 39 10 74 15 105 20 135

Static level parts

Static part of the level is stored using PNG files.

Each PNG file represents a layer of static blocks.

Format:

File: name.layer.png
Size: v2d(Level.Size)
Layers: Level.Size.Z

Block Modes

Each pixel of each layer represents a single block.

Each color channel (RGB) stands for specific block property.

Standard values:

Block RGB Preview Model
Full #FFFFFF
Half #FFFF80
Void #000000

R Channel

R Channel affects block glowing.

R value Result
0x00 - 0x7F Block will generate its model but player can't collide with it
0x80 - 0x9F Static semi-moving block
0xA0 - 0xBF Static moving block
0xC0 - 0xDF Static luminous semi-moving block
0xE0 - 0xFE Static luminous moving block
0xFF Common block

G Channel affects block model texture.

G value Result Model
0x00 - 0x3F Texture darker by 3
0x40 - 0x7F Texture darker by 2
0x80 - 0xBF Texture darker by 1
0xC0 - 0xFF Texture coresponds to Level.ModelTheme

B Channel

B Channel affects block height.

0x00 = no block model, 0xFF = full block model

Anything between will generate Blue / 255 height model from the top side.


Music

Music is the track that will play while you are playing the level. There're currently 25 different tracks in the game.

In addition, you can specify the music for Java version, however it is not used in EDGE Extended.

Tracks 04_Jingle & 14_Space are unused, so they can be replaced by custom levels such as path of piracy.

Music: None

ID Music Java Music ID Music
00 Title Menus 13 Debrief (Level Finished)
01 Eternity Braintonik 14 Space (Unused)
02 Quiet Cube Dance 15 Voyage Geometrique
03 Pad Essai 2 16 M-Zone
04 Jingle (Unused) Essai 1 17 R2
05 Tec Test 18 Mystery Cube
06 Kakkoi (Default) Mystery Cube 19 Duty
07 Dark 03 EDGE 20 Perfect Cell
08 Squadron Jungle 21 Fun
09 8-bits Retardtonic 22 Lol
10 Pixel Oldschool Simon (Duty) 23 Lost Way
11 Jupiter Planant 24 Wall Street
12 Shame -

EDGE Mod Formatting

EDGE Tool supports EDGE Mod files for sharing the levels.

Format:

Extension: .edgemod
Structure: ZIP

Root folder contains 2 files: mod.xml and description.txt.

Description is a file for pack description.

There can be also additional folders. Their contents will be pasted to the respecive folders in EDGE folder:

audio
default
effects
fx
images
levels
localization
models
music
sprites
textures

Mod

Mod is the main file for EDGE Mod. Its root tag is Mod and its contents will be pasted into mapping.xml.

Parameters:

Name Required Type Default Description
ID Yes ID - ID of the mod
Name Yes text Name of the mod
Version Yes version - Version of the mod
Author Yes text Author of the mod
Type No special Level Level or Game. Defines whether the mod is a pack or a game
Conflicts No ID list empty list Specify what EDGE Mods are not allowed to be loaded with this mod
Dependency No ID list empty list Specify what EDGE Mods must be loaded to be installed
InstallAfter No ID list empty list Specify what EDGE Mods must be loaded before this mod
InstallBefore No ID list empty list Specify before what EDGE Mods this one should be installed
EngineVersion No version interval - Define the engine version of the game for this mod to run on

SFX Folder

SFX folder contains sounds for the level start screen. EDGE uses Colossus & Robotoid FL Studio voices for title sounds.

File format:

Name: levelsfx_name.wav

Tutorial

Here's a quick tutorial for making an EDGE level.

Step 1 - Setup:

To make the level, you need to choose its size and name.

Most levels are very short in height.

Name of the level usually follows one of these patterns. Of course, you can choose your own name, however I recommend to use these patterns to avoid conflicts.

levelid
name_id
author_name

You should also choose an ID of the level. Level IDs should be unique for each level.

For example, I'll be using level104_old by WEGFan.

Step 2 - Terrain:

The level consists of hitboxes and dynamic elements.

To define hitboxes and its models we use image files. All images should have the same size.

For each layer, we use multiple images: name.0.png, name.1.png, name.2.png etc.

By default, layer 0 blocks have #FFFF80 (half block) color and other layers blocks have #FFFFFF (full block) color.

Standard program to use are MicroSoft Paint (on Windows) but you may try other programs or even my terrain editor :).

Layers of level104_old:

Layer 0 Layer 1 Layer 2 Layer 3

Step 3 - Core:

All levels have a .xml core file. The root tag is Level.

Core of level104_old:

<Level ID="104" Size="18x13x4" Name="try again" TimeThresholds="65,80,90,100,110" SpawnPoint="1,3,5" ExitPoint="10,10,1" Theme="1" MusicJava="9" Music="18" Zoom="1">
    <MovingPlatform FullBlock="False">
        <Waypoint Position="11,3,1" PauseTime="6"/>
        <Waypoint Position="11,6,1" TravelTime="18" PauseTime="6"/>
        <Waypoint Position="11,3,1" TravelTime="18"/>
    </MovingPlatform>
    <MovingPlatform FullBlock="False">
        <Waypoint Position="13,5,1" PauseTime="6"/>
        <Waypoint Position="13,8,1" TravelTime="18" PauseTime="6"/>
        <Waypoint Position="13,5,1" TravelTime="18"/>
    </MovingPlatform>
    <MovingPlatform FullBlock="False">
        <Waypoint Position="15,5,1" PauseTime="6"/>
        <Waypoint Position="15,8,1" TravelTime="18" PauseTime="6"/>
        <Waypoint Position="15,5,1" TravelTime="18"/>
    </MovingPlatform>
    <MovingPlatform FullBlock="False">
        <Waypoint Position="15,2,1" PauseTime="6"/>
        <Waypoint Position="15,5,1" TravelTime="18" PauseTime="6"/>
        <Waypoint Position="15,2,1" TravelTime="18"/>
    </MovingPlatform>
    <MovingPlatform FullBlock="False">
        <Waypoint Position="23,1,1" PauseTime="6"/>
        <Waypoint Position="17,1,1" TravelTime="18" PauseTime="6"/>
        <Waypoint Position="23,1,1" TravelTime="18"/>
    </MovingPlatform>
    <MovingPlatform FullBlock="False">
        <Waypoint Position="24,1,1" PauseTime="6"/>
        <Waypoint Position="24,4,1" TravelTime="18" PauseTime="6"/>
        <Waypoint Position="24,1,1" TravelTime="18"/>
    </MovingPlatform>
    <MovingPlatform FullBlock="False">
        <Waypoint Position="31,4,1" PauseTime="6"/>
        <Waypoint Position="25,4,1" TravelTime="18" PauseTime="6"/>
        <Waypoint Position="31,4,1" TravelTime="18"/>
    </MovingPlatform>
    <MovingPlatform FullBlock="False">
        <Waypoint Position="25,10,1" PauseTime="6"/>
        <Waypoint Position="25,5,1" TravelTime="18" PauseTime="6"/>
        <Waypoint Position="25,10,1" TravelTime="18"/>
    </MovingPlatform>
    <MovingPlatform FullBlock="False">
        <Waypoint Position="25,11,1" PauseTime="6"/>
        <Waypoint Position="25,6,1" TravelTime="18" PauseTime="6"/>
        <Waypoint Position="25,11,1" TravelTime="18"/>
    </MovingPlatform>
    <MovingPlatform FullBlock="False">
        <Waypoint Position="24,11,1" PauseTime="6"/>
        <Waypoint Position="18,11,1" TravelTime="18" PauseTime="6"/>
        <Waypoint Position="24,11,1" TravelTime="18"/>
    </MovingPlatform>
    <MovingPlatform FullBlock="False">
        <Waypoint Position="23,11,1" PauseTime="6"/>
        <Waypoint Position="17,11,1" TravelTime="18" PauseTime="6"/>
        <Waypoint Position="23,11,1" TravelTime="18"/>
    </MovingPlatform>
    <MovingPlatform FullBlock="False">
        <Waypoint Position="17,13,1" PauseTime="6"/>
        <Waypoint Position="17,12,1" TravelTime="18" PauseTime="6"/>
        <Waypoint Position="17,13,1" TravelTime="18"/>
    </MovingPlatform>
    <MovingPlatform FullBlock="False">
        <Waypoint Position="17,14,1" PauseTime="6"/>
        <Waypoint Position="17,17,1" TravelTime="18" PauseTime="6"/>
        <Waypoint Position="17,14,1" TravelTime="18"/>
    </MovingPlatform>
    <MovingPlatform FullBlock="False">
        <Waypoint Position="16,14,1" PauseTime="6"/>
        <Waypoint Position="10,14,1" TravelTime="18" PauseTime="6"/>
        <Waypoint Position="16,14,1" TravelTime="18"/>
    </MovingPlatform>
    <MovingPlatform FullBlock="False">
        <Waypoint Position="10,12,1" PauseTime="6"/>
        <Waypoint Position="10,13,1" TravelTime="18" PauseTime="6"/>
        <Waypoint Position="10,12,1" TravelTime="18"/>
    </MovingPlatform>
    
    <FallingPlatform Position="5,11,1" FloatTime="10"/>
    <FallingPlatform Position="6,11,1" FloatTime="10"/>
    <FallingPlatform Position="6,10,1" FloatTime="10"/>
    <FallingPlatform Position="7,10,1" FloatTime="10"/>
    <FallingPlatform Position="7,12,1" FloatTime="10"/>
    <FallingPlatform Position="5,9,1" FloatTime="10"/>
    <FallingPlatform Position="3,11,1" FloatTime="10"/>
    <FallingPlatform Position="1,7,1" FloatTime="10"/>

    <Checkpoint Position="2,9,1" RespawnZ="1" Radius="0,1"/>
    <Checkpoint Position="4,11,1" RespawnZ="1" Radius="0,2"/>
    <Checkpoint Position="6,6,1" RespawnZ="1" Radius="0,3"/>
    <Checkpoint Position="9,1,4" RespawnZ="4" Radius="0,4"/>
    <Checkpoint Position="10,3,1" RespawnZ="1" Radius="0,5"/>
    <Checkpoint Position="14,8,1" RespawnZ="1" Radius="0,6"/>
    <Checkpoint Position="16,1,1" RespawnZ="1" Radius="0,7"/>
    <Checkpoint Position="16,12,1" RespawnZ="1" Radius="0,8"/>

    <Prism Position="5,10,1"/>
    <Prism Position="6,12,1"/>
    <Prism Position="7,11,1"/>
    <Prism Position="8,3,1"/>
    <Prism Position="2,11,1"/>
    <Prism Position="6,1,4"/>
    <Prism Position="10,1,1"/>
    <Prism Position="14,8,1"/>
    <Prism Position="16,5,1"/>
    <Prism Position="16,11,1"/>
    <Prism Position="2,7,1"/>
    <Prism Position="0,7,1"/>
</Level>

Step 4 - Compile:

After you made a level, it is time for compilation.

You need to open EDGETool, select the (de)compile tab and drag the .xml file into the compilation field.

You'll receive 2 files: .bin (levels) & .eso (models) file. Each file needs to be copied to the respective folder in EDGE folder.

Then you'll need to actually add the level the game menu: you should paste the following code in the mapping.xml Level.standard / Level.bonus / Level.extended:

<level filename="level_name" leaderboard_id="int_id" name_sfx="sfx_sound"/>

Note the leaderboard_id and name_sfx is optional arguments.

And the last thing, you need to run the game and play the level.