vBot is a visual programming game. Use a small set of
command tiles to build a program. The program must
control the vBot and make it activate every target
using the limited command set.


See the Wiki for screenshots:

    There is no support for installing yet. Run the
    program directly from the unpacked archive.

    First, make sure all dependencies are installed
    (See DEPENDENCIES below) then proceed to RUNNING.

    Run the program from the command prompt like this:

        python main.py

    Drag program tiles from the bottom right to the spaces above.
    (A double-click will send the tile to the next available space.)

    When your program is ready, press the play button (>).

    If there is a problem, rewind (<<), reprogram, and retry.

        Activate all blue target squares on the level.

        Move robot to blue target squares using the forward, turn left,
            and turn right program tiles. Robot can also jump up or down
            (ONE tile thickness only) using the jump tile.

        When on top of a blue target square use the ! tile to activate.

        Some levels provide additional program space in the form of
            functions f1() or f2()

        Jump in to functions by using the F1 or F2 tiles. When the
            function finishes, control returns to the next tile in
            the calling function.

        Try to create functions that can be used repeatedly in
            your program.

            (tested with python-2.7.9)

            (tested with pyqt-4.11.3)

    vBot is released under GPLv3.

    please report any problems here:

        If you are running from the source repository:

        In order to get the program running properly,
        the file robot.svg must be built first.

        In Inkscape, open robotlinks.svg

        Run the "Embed Images" script.
        Extensions -> Images -> Embed Images

        NOTE: IF Embed Images crashes!
        * open 'Edit > XML Editor...'
        * select the node <sodipodi:namedview ...> in the list on the left
        * select the attribute 'id' in the upper right list
        * at the bottom right, the string of the id is shown in the edit field
            (probably something like "namedview12345" - numbers will vary)
        * overwrite the id string with "base", click on 'Set', close XML Editor

        "Save As" robot.svg in the data/robot folder.

        If you do not want to generate the file yourself,
        try downloading the most recent release and copying
        over the robot.svg file from there.

    Look at the other levels in the "levels" file to see the format.

    Add your level in the position you want it to appear in the game.
        Set the difficulty value between the values of the levels
            it appears between.

            (levels will be sorted by difficulty in the game)

        The level number (#1, #2, etc) is not checked and will be
            regenerated automatically in the next steps.

    Be sure to leave a blank line between levels, and several blank
        lines at the end of all of the levels.

    Add a solution to your level in the matching place in solutions.py

    Test your level and solution with:
        python game.py

    Finally, to rewrite level numbers, run:
        python game.py -R
    If you also want to smooth out level difficulties, use:
        python game.py -R -S

    levels_NEW and solutions_NEW will be written. Copy those files to
        levels and solutions.py respectively.

    To start a remote scorekeeping server, create 2 methods
    available over http.

    levels() should accept a single GET parameter of "name"
    and return a newline separated list of the hashes of
    the levels that person has completed.

    add_level() should accept 2 GET parameters, "name" and
    "lvlhash" and store the hashes of the levels that player
    has completed. Optionally, add_level can take a "points"
    parameter and store the number of points awarded for
    that level.

    If using the "points" parameter, be sure to enable
    send_points in conf.py and look at the get_points
    method in level_points.py