Leveldateien für smilie# werden im JSON-Format gespeichert und sind beliebig erweiterbar.
{
"levelauthor": "",
"levelname": "",
"map": [
[ 0]
],
"decoration": [
[ 0]
],
"data": [
[null]
],
"players": [
{ "x": 0, "y": 0, "inventory": "" }
],
"intro": [
{ "x": 0, "y": 0, "text": "" }
]
}
Hier sei noch erwähnenswert, dass Elemente wie data oder intro ganz weggelassen werden können, wenn sie nicht gebraucht werden, statt sie mit einem leeren Array zu füllen. Nicht definierte Elemente werden ignoriert und nicht verarbeitet.
Zwingend notwendig sind allerdings levelauthor, levelname, map und wenigstens ein Element in players.
Ein zwei-dimensionaler :array mit der Spielfelddefinition. Größe (Maße) ist in der Theorie unbegrenzt.
// (2-dimensional :array[y][x] of :int ID): 0 :null 1 FIELD_EMPTY 2 FIELD_GEM 3 FIELD_DEATH 4 sprite_conveyor "up" ↑ 5 sprite_conveyor "right" → 6 sprite_conveyor "down" ↓ 7 sprite_conveyor "left" ← 8 new FieldFloating(_id = i++); 9 FIELD_BUTTON or sprite_switch 10 sprite_goal 11 sprite_teleporter 12 sprite_trough up-down ║ 13 sprite_trough left-right ═ 14 sprite_trough up-right ╚ 15 sprite_trough down-right ╔ 16 sprite_trough down-left ╗ 17 sprite_trough up-left ╝ 18 sprite_aperture "green" 19 sprite_aperture "yellow" 20 sprite_aperture "red" 21 sprite_hologram "on" 22 sprite_hologram "off" 23 sprite_locks "key_red" 24 sprite_locks "key_green" 25 sprite_locks "key_blue" 26 sprite_locks "door_red" 27 sprite_locks "door_green" 28 sprite_locks "door_blue" 29 30
Ein zwei-dimensionaler :array mit der Dekorationsfelddefinition. Größe (Maße) ist in der Theorie unbegrenzt und kann von Spielfeldgröße abweichen.
Dabei ist allerdings zu beachten, dass die Dekorationen wie auch das Spielfeld oben links (0, 0) beginnen.
// (2-dimensional :array[y][x] of :int ID): 0 :null 1 DECORATION_SOLARCELL 2 decoration_holobeam "inside" ┐ 3 decoration_holobeam "inside" ┤ 4 decoration_holobeam "inside" ┘ 5 decoration_holobeam "inside" ┴ 6 decoration_holobeam "inside" └ 7 decoration_holobeam "inside" ├ 8 decoration_holobeam "inside" ┌ 9 decoration_holobeam "inside" ┬ 10 decoration_holobeam "outside" └ 11 decoration_holobeam "outside" ┌ 12 decoration_holobeam "outside" ┐ 13 decoration_holobeam "outside" ┘
Statt einer einzelnen Zahl kann allerdings auch ein :array = [:int, :int, …] definiert werden. Diese Dekorationen werden dann übereinander gestapelt.
Ein zwei-dimensionaler :array mit der Definition der feldspezifischen Aktionen als :object mit :array. Sind keine Aktionen vonnöten, kann data = [ [null] ] oder ganz undefiniert bleiben.
Für Funktionen muss wenigstens an der Stelle, an der eine Aktion ausgeführt werden soll, ein :object definiert sein (mit vorausgehenden :null).
Sind Buttons (map = [ [ 9 ] ]) im Spielfeld, muss an deren Stelle zwingend group (entweder null oder [:int, :boolean]) definiert werden.
// (2-dimensional :array[y][x] of :object):
default (no action):
null
actions:
// if "group" is [:int, :boolean], a button will be replaced with a switch sprite
// ^-- TRUE means, it can be pressed
{ "actions": [ ARRAY ], "group": null }
// ARRAY as array of objects
// move floating field
// "tid" is ID of field, as increased by their appeareance
// "mx" target field position X
// "my" target field position Y
{ "type": "move", "data": { "tid": 0, "mx": 0, "my": 0 } }
// teleport player to position
// "mx" target field position X
// "my" target field position Y
// "w" (optional) width of teleportation selection field
// "h" (optional) height of teleportation selection field
{ "type": "teleport", "data": { "mx": 0, "my": 0, "w": 1, "h": 1 } }
// swap conveyors
// "ax" start field X position (including)
// "ay" start field Y position (including)
// "bx" end field X position (including)
// "by" end field Y position (including)
{ "type": "rotate_c", "data": { "ax": 0, "ay": 0, "bx": 1, "by": 1 } }
// rotate troughs
// "ax" start field X position (including)
// "ay" start field Y position (including)
// "bx" end field X position (including)
// "by" end field Y position (including)
{ "type": "rotate_t", "data": { "ax": 0, "ay": 0, "bx": 1, "by": 1 } }
// toggle hologram fields
// "ax" start field X position (including)
// "ay" start field Y position (including)
// "bx" end field X position (including)
// "by" end field Y position (including)
{ "type": "hologram", "data": { "ax": 0, "ay": 0, "bx": 1, "by": 1 } }
// replace a field
// "tid" is map-id, leave it null for no dependency
// "nid" is new map-id (see snippet "map")
// "mx" target field position X
// "my" target field position Y
{ "type": "replace", "data": { "tid": null, "nid": 1, "mx": 0, "my": 0 } }
Ein :array aus :object mit den Eigenschaften :int x und :int y für die jeweilige Startposition und optional :string inventory für ab Beginn getragene Objekte (wie Schlüssel).
// (optional) :string inventory "key_red" red key "key_gren" green key "key_blue" blue key
Ein :array aus :object mit den Eigenschaften :string text, :int x und :int y. Diese Nachrichten werden bei Beginn des Levels in der Reihenfolge der Nachrichten an der angegebenen Position angezeigt. So können Geschichten erzählt, oder Tutorials erstellt werden.