Smooth link transitions
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.
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 |
The coord system in EDGE uses Z
axis for height, instead of usual Y
axis.
Dynamic part of the level is stored in the XML file.
Format:
File: name.xml
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 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 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 |
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 |
A button can be at one of 3 modes:
DisableCount == 0
then the button will stay pressed upon getting offFalling 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 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:
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 change the player's size.
There're 2 types of resizers:
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 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 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 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 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 are helping or hindering the player.
There're 2 types of other cubes:
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 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 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
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 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 affects block height.
0x00 = no block model, 0xFF = full block model
Anything between will generate Blue / 255
height model from the top side.
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 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 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 contains sounds for the level start screen. EDGE uses Colossus & Robotoid FL Studio voices for title sounds.
File format:
Name: levelsfx_name.wav
Here's a quick tutorial for making an EDGE level.
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.
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 |
---|---|---|---|
![]() |
![]() |
![]() |
![]() |
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>
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.