If you have a question not covered below, drop us an email at elarelapp (at) gmail.com and we'll be glad to answer. Note that all information below is current as of v1.2.

Controls
Creating a level
Level format
Object update rules

Controls & keyboard shortcuts

qquick-saves the current level (will overwrite previous quick-save for that level)
eloads the quick-save for the current level (if there is one)
vopens a dialog to let you choose where to save the current level
lopens a dialog to let you choose where to load a level (either saved or new)
rrestarts the current level
spacewaits a turn
arrow keysmoves the main character.
tchanges the current tileset
stoggles sound on/off
Escsaves and exits to main menu

Creating your own level
The elarel level editor can be accessed by launching editor.jar if you are on Windows (located in your elarel folder), or by downloading it from the download page if you are on Mac. Note that the level editor requires Java 1.7+.

When you have finished your level, you can save it in the userlevels directory, which should be the default save location already in the editor (see below for correct userlevel locations). You must save your level under the name levelx, where x is the next unused userlevel number. (E.g. if you have already have 9 user levels, then you should save your level as level10.)

Correct userlevel locations are as follows:

Mac App Store version
/Users/[user]/Library/Containers/com.campbelljc.elarel/Data/Library/Application Support/elarel/levels/user

Mac
/Users/[user]/Library/Application Support/elarel/levels/user

Windows
\Users\[user]\AppData\roaming\elarel\levels\user

You can also manually create a level without the help of the level editor.
Instructions on how to do so are below.

Level format
elarel has a simple level format. Level files are simple text (.txt) files, and are arranged in the form of the playing grid, with two characters for each space in the grid. The first character is for regular objects, e.g. a blackball, arrow, treasure chest, player, etc. The second character is reserved for objects that should be placed on the "ground": ice, arrow passages, secret passages, slanted walls, and one-way doors. This allows for two objects, one on the ground and one "standing" on top of it, e.g. a player standing on ice, or an arrow in an arrow passage.

You can see examples of the level format by examining the default levels in the levels directory.

Here are the characters representing the various objects:

(empty space)Empty space
@Player
0Blackball
cChest
xStatic block
XPushable static block
OUnbreakable block
HStairs
mSpider (sea-monster if on water)
sHand
SHawk (killer sea-monster if on water)
g, 9Gravity shift
>, <, ^, vArrows
PPickaxe
FFire
pPushblock
IIcy pushblock
1, 2, 3, 4Pushbuttons
G, 6On/off generators
V, 5Two-sided generators
#Fence
oHole
bBalloon
iIce (ground)
8Secret passage (ground)
/, \Slanted walls (ground)
|, -, +Arrow passages (ground)
(, ), n, uOne-way doors (ground)
fFallfloor (ground)
[, ], U, AConveyor belts
CClosed chest
.Goal
wSea
RSea rock
WWhirlpool
rRaft
{, }, Z, zFast-forwards
D, dOpen/closed drawbridge
lLever
$Pressure plate
e, EDoor
k, K, ', "Laser
_Cart
QEvil block monster

Some objects can be connected to each other. E.g., a lever is connected to the various objects which are toggled when the lever is pressed. These connections are specified at the bottom of the level file, and use the following syntax:

{c(x, y), c(x, y), c(x, y), c(x, y)}
(where c is either 'b' or 'g') (one group of connected objects per line).

Each line contains one grouping of connected objects within a set of curly brackets. Inside the brackets, each object is specified by 3 attributes: whether it is on the board ('b') or the ground ('g'), and its x and y coordinates on the level map.

For example, if a lever at coordinates (7, 13) should toggle a conveyor belt at coordinates (5, 14) (i.e., when the lever is toggled, the conveyor belt rotates), then that would be expressed with the following line:
{b(7, 13), g(5, 14)}
(since the lever is a board object and the conveyor belt is a ground object).

Object update rules
Each time the player makes a move, the game will loop through all objects on the screen and see if they will also make a move or react in some way to the player's movement. This mechanism is called the update method of the object. For example, a spider moves each turn, so it will always have one update. A blackball typically does not have an update, unless the player has pushed it or disturbed it in some way, in which case it will react typically by moving in the direction of gravity, if possible. While falling, it may encounter other objects (e.g., more blackballs) and cause them in turn to move. There are thus some objects that do not update at all, some which always update but only once, and some which can update more than once in a turn. The following shows the order in which the objects update:

First, the objects that only update once will be checked for movement:
cart, raft, spider, sea monster, turret, pressure plate, sea

Then, the objects that could update more than once will be checked:
laser, conveyor belt, balloon, falling floor, fast forward, blackball, arrow, smart monster, spike, fence, pushbutton

If after all objects has updated and the board state is different to what it was before the updates occurred, the latter list of objects will be checked again to see if they can move. This check will continue to repeat until no changes in board state occur from the start to end of one sweep of objects updating.