Level Format

Levels are made of objects. Object data is stored under <level>, as an array of
arrays. The top-level delimiter (between object arrays) is "|" (pipe symbol);
within object arrays, the delimiter is "," (comma). As an example:

  3,150,30|1,0,0

..is equivalent to this array:

  [[3, 150, 30], [1, 0, 0]]

The project XML document format is defined in CreatorProject.buildDocument
alongside the converse buildProject decode function.

The <level> contents format is defined in Creator.levels.exportEnvironmentData.
The term "environment" refers to the objects stored in a level.

Each environment object follows this format:

  ID, XPOS, -YPOS[, ROTATION[, TILEID[, graphics stuff ] ] ]


Coordinate Grid

The object grid is more or less a cartesian coordinate system. Each object has
an X and Y position (its "coordinate"), which represents where it is placed in
the scene.

The X value determines its position on the X axis, which runs from left to
right. The X value of 30 denotes 30 units right from the center.

The Y value determines its position on the Y axis, which runs from top to
bottom. Note, however, that in the save format, an object's Y position is the
opposite of its actual game value. If an object's saved Y value is 30, it is
really positioned at -30 on the Y axis, which is 30 units above the center.

The positioning of tile-like objects along the "snap" grid may best be
described with a diagram of a number line:

  -180    -120     -60      0      +60     +90     +180
    |---*---|---*---|---*---|---*---|---*---|---*---|
      -150     -90     -30     +30     +90    +150

Each tick line in the diagram (pipe symbols: "|") mark the visible edge of two
tiles. Stars ("*") mark the actual coordinate of tiles. In simpler terms, a
tile's coordinate values are physically placed in the center of the displayed
shape (not on a corner).

Most tiles have a physical size of 60x60 units. Large Tiles also have
coordinates that represent their centers; since they are twice the size of
normal tiles, their center is offset respectively. Where a normal tile may be
positioned at (30, 90, 150) a Large Tile may be positioned at (60, 180, 300).


Level Verification

When a level is loaded and there is no player object, a new player object will
be placed at the coordiantes (0, 0).


List of Objects

Following this paragraph is a list of objects and their format, sorted by
object ID. It only contains objects from the categories "Blocks & Tiles",
"Walls & Decoration", and "Switches & Doors" currently; and is only guaranteed
to be up to dat through to the date of April 18, 2017.

- [1, XPOS, YPOS] Player
- [3, XPOS, YPOS] Floor
- [4, XPOS, YPOS] Pipe
- [5, XPOS, YPOS, 0, TILEID] Tile
- [6, XPOS, YPOS, 0, TILEID] RampTile (slope top -> right)
- [7, XPOS, YPOS, 0, TILEID] RampTile (slope top -> left)
- [8, XPOS, YPOS, 0, TILEID] StairTile (slope top -> right)
- [9, XPOS, YPOS, 0, TILEID] StairTile (slope top -> left)
- [10, XPOS, YPOS, 0, TILEID] BackWall
- [11, XPOS, YPOS, 0, TILEID] BackWindow (triangle)
- [12, XPOS, YPOS, 0, TILEID] BackWindow (circle)
- [13, XPOS, YPOS, 0, TILEID] BackWall (alternate style)
- [14, XPOS, YPOS] BackLight
- [15, XPOS, YPOS] Water
- [16, XPOS, YPOS] WaterTop
- [17, XPOS, YPOS] Log
- [18, XPOS, YPOS] Bouncer
- [19, XPOS, YPOS] IceBlock
- [20, XPOS, YPOS] WeakFloor
- [21, XPOS, YPOS] Sandblock
- [22, XPOS, YPOS] LamWall (black style 1)
- [23, XPOS, YPOS] LamWall (black style 2)
- [24, XPOS, YPOS] LamWall (black style 3)
- [25, XPOS, YPOS] LamWall (black style 4)
- [26, XPOS, YPOS] LamWall (brown style 1)
- [27, XPOS, YPOS] LamWall (brown style 2)
- [28, XPOS, YPOS] LamWall (brown style 3)
- [29, XPOS, YPOS] LamWall (brown style 4)
- [30, XPOS, YPOS] LamWall (red style 1)
- [31, XPOS, YPOS] LamWall (red style 2)
- [32, XPOS, YPOS] LamWall (red style 3)
- [33, XPOS, YPOS] LamWall (red style 4)
- [34, XPOS, YPOS] TechWall (style 1)
- [35, XPOS, YPOS] TechWall (style 2)
- [36, XPOS, YPOS] LEDWall (style 1)
- [37, XPOS, YPOS] LEDWall (style 2)
- [38, XPOS, YPOS] LEDWall (style 3)
- [39, XPOS, YPOS] LEDWall (style 4)
- [40, XPOS, YPOS] Statue (1x3, "metal"-style)
- [41, XPOS, YPOS] Statue (2x2, "stone"-style)
- [42, XPOS, YPOS] Statue (1x3, "stone"-style)
- [43, XPOS, YPOS] Sign ("DANGER - CRITICAL - RAD LEVEL OVER LIMIT")
- [44, XPOS, YPOS] Sign ("DRINK - ZANPO")
- [45, XPOS, YPOS] Sign ("right arrows"-style)
- [46, XPOS, YPOS] Sign ("left arrows"-style)
- [47, XPOS, YPOS] Meltblock
- [48, XPOS, YPOS] NearLight
- [49, XPOS, YPOS] Ladder
- [50, XPOS, YPOS] Slider
- [51, XPOS, YPOS] Elevator
- [52, XPOS, YPOS] Dynamo
- [53, XPOS, YPOS] Windmill (clockwise)
- [54, XPOS, YPOS] Windmill (counter-clockwise)
- [55, XPOS, YPOS] Gear (clockwise)
- [56, XPOS, YPOS] Gear (counter-clockwise)
- [57, XPOS, YPOS] BigGear (clockwise)
- [58, XPOS, YPOS] BigGear (counter-clockwise)
- [59, XPOS, YPOS] Rod
- [60, XPOS, YPOS] TriGear
- [61, XPOS, YPOS] Teleporter (green)
- [62, XPOS, YPOS] Teleporter (orange)
- [63, XPOS, YPOS] Teleporter (purple)
- [64, XPOS, YPOS] Crate
- [68, XPOS, YPOS] Large Water
- [69, XPOS, YPOS] GoldPanel (style 1)
- [70, XPOS, YPOS] GoldPanel (style 2)
- [71, XPOS, YPOS] CyberPanel (style 1)
- [72, XPOS, YPOS] CyberPanel (style 2)
- [73, XPOS, YPOS] Wire Wall
- [74, XPOS, YPOS] HotWire Wall
- [75, XPOS, YPOS] Angular Wall
- [76, XPOS, YPOS] Rainbow Wall
- [77, XPOS, YPOS] Aqua Wall
- [78, XPOS, YPOS] Rock Pile (slope top -> left)
- [79, XPOS, YPOS] Rock Pile (slope top -> right)
- [80, XPOS, YPOS[, ROTATION]] Tunnel ("dirt"-style)
- [81, XPOS, YPOS[, ROTATION]] Tunnel Corner ("dirt"-style)
- [82, XPOS, YPOS[, ROTATION]] Tunnel Junction (3-way) ("dirt"-style)
- [83, XPOS, YPOS[, ROTATION]] Tunnel Junction (4-way) ("dirt"-style)
- [84, XPOS, YPOS[, ROTATION]] Tunnel End ("dirt"-style)
- [85, XPOS, YPOS[, ROTATION]] Tunnel ("blue"-style)
- [86, XPOS, YPOS[, ROTATION]] Tunnel Corner ("blue"-style)
- [87, XPOS, YPOS[, ROTATION]] Tunnel Junction (3-way) ("blue"-style)
- [88, XPOS, YPOS[, ROTATION]] Tunnel Junction (4-way) ("blue"-style)
- [89, XPOS, YPOS[, ROTATION]] Tunnel End ("blue"-style)
- [90, XPOS, YPOS, 0, TILEID] Large Tile
- [91, XPOS, YPOS, 0, TILEID] LargeBack
- [92, XPOS, YPOS, 0, TILEID] LargeWindow
- [115, XPOS, YPOS] TorchLight
- [116, XPOS, YPOS] TikiTorch
- [117, XPOS, YPOS] BackWall (3x2)
- [218, XPOS, YPOS] Big Elevator
- [219, XPOS, YPOS] 2way Platform
- [250, XPOS, YPOS] AutoDoor
- [251, XPOS, YPOS] TouchDoor
- [252, XPOS, YPOS] TouchFloor
- [253, XPOS, YPOS] BlueKey
- [254, XPOS, YPOS] GreenKey
- [255, XPOS, YPOS] YellowKey
- [256, XPOS, YPOS[, ROTATION]] BlueDoor
- [257, XPOS, YPOS[, ROTATION]] GreenDoor
- [258, XPOS, YPOS[, ROTATION]] YellowDoor
- [259, XPOS, YPOS] BlueSwitch
- [260, XPOS, YPOS] BlueRing
- [261, XPOS, YPOS] GreenSwitch
- [262, XPOS, YPOS] GreenRing
- [263, XPOS, YPOS] YellowSwitch
- [264, XPOS, YPOS] YellowRing
- [265, XPOS, YPOS] PermSwitch (green)
- [266, XPOS, YPOS] PermBlock (green)
- [267, XPOS, YPOS] PermSwitch (orange)
- [268, XPOS, YPOS] PermBlock (orange)
- [269, XPOS, YPOS] Level Door (style 1)
- [270, XPOS, YPOS] Level Door (style 2)
- [271, XPOS, YPOS] Level Door (style 3)
- [272, XPOS, YPOS] Level Door (style 4)
- [273, XPOS, YPOS] Level Door (style 5)
- [274, XPOS, YPOS] Level Door (style 6)
- [275, XPOS, YPOS] RemoteSwitch
- [276, XPOS, YPOS] MagicSwitch
- [277, XPOS, YPOS] OneWayDoor
- [278, XPOS, YPOS, ROTATION, 0, 0, 0, 0, , TARGET_X_OFF, TARGET_Y_OFF] Closer
- [279, XPOS, YPOS] PurpleDoor
- [280, XPOS, YPOS] TrapDoor (fall-only)
- [281, XPOS, YPOS] TrapDoor (jump-only)
- [282, XPOS, YPOS] FakeDoor
- [283, XPOS, YPOS] PurpleKey
- [284, XPOS, YPOS] InvisibleSwitch
- [285, XPOS, YPOS, 0, TILEID, 0, 0, 0, , TARGET_X_OFF, TARGET_Y_OFF] BurstTile
- [286, XPOS, YPOS] CaveIn
- [287, XPOS, YPOS] Cinderblock
- [288, XPOS, YPOS[, 0, 0, 0, 0, 0, TEXT]] Inscription
- [289, XPOS, YPOS] WoodPost
- [351, XPOS, YPOS[, 0, 0, 0, 0, 0, TEXT]] Wizard
- [352, XPOS, YPOS[, 0, 0, 0, 0, 0, TEXT]] General
- [353, XPOS, YPOS[, 0, 0, 0, 0, 0, TEXT]] Owl
- [401, XPOS, YPOS] Brick (2x1 "blue"-themed)
- [402, XPOS, YPOS] Brick (2x2 "blue"-themed)
- [403, XPOS, YPOS] Brick (3x1 "blue"-themed)
- [404, XPOS, YPOS] Brick (2x2 "grey"-themed)
- [405, XPOS, YPOS] Brick (2x2 "dark grey"-themed)
- [406, XPOS, YPOS] Brick (2x2 "grey red"-themed)
- [407, XPOS, YPOS] Brick (2x1 "grass"-themed)
- [408, XPOS, YPOS] Brick (2x2 "dirt panel"-themed)
- [409, XPOS, YPOS] Brick (2x2 "dirt"-themed)
- [410, XPOS, YPOS] Brick (3x1 "grass"-themed)
- [411, XPOS, YPOS] Brick (2x1 "neon"-themed)
- [412, XPOS, YPOS] Brick (2x2 "neon"-themed)
- [413, XPOS, YPOS] Brick (3x1 "neon"-themed)
- [451, XPOS, YPOS] Lava
- [452, XPOS, YPOS] LavaTop
- [456, XPOS, YPOS, 0, TILEID] RampTile (slope bottom -> right)
- [457, XPOS, YPOS, 0, TILEID] RampTile (slope bottom -> left)
- [501, XPOS, YPOS] BackBrick ("blue"-themed)
- [502, XPOS, YPOS] BackBrick ("grey"-themed)
- [503, XPOS, YPOS] BackBrick ("dirt"-themed)
- [504, XPOS, YPOS] BackBrick ("neon"-themed)
- [601, XPOS, YPOS] FrontPlant (2x2)
- [602, XPOS, YPOS] Plant
- [603, XPOS, YPOS] FrontPlant (1x2)
- [604, XPOS, YPOS] FrontGrass
- [605, XPOS, YPOS] Grass
- [606, XPOS, YPOS] Etching (style 1)
- [607, XPOS, YPOS] Etching (style 2)
- [608, XPOS, YPOS] FrontStatue
- [609, XPOS, YPOS] FrontScreen
- [610, XPOS, YPOS] Skulls
- [611, XPOS, YPOS] SpiderWeb (style 1)
- [612, XPOS, YPOS] Window
- [613, XPOS, YPOS[, ROTATION]] Truss
- [614, XPOS, YPOS] Waterspout (style 1)
- [615, XPOS, YPOS] Waterspout (style 2)
- [616, XPOS, YPOS] Waterspout (style 3)
- [617, XPOS, YPOS] SpiderWeb (style 2)
- [618, XPOS, YPOS] WoodPostBehind
- [800, XPOS, YPOS, 0, 0, GRAPHICS..] TextureBlock
- [801, XPOS, YPOS, 0, 0, GRAPHICS..] TextureWall


Ideas

Perhaps a rotated Elevator?
A rotated TikiTorch?
Can other things (not Wizards, Owls, etc) talk?
Multiple player objects?
Rotated MagicSwitch?