Skip to content

Instantly share code, notes, and snippets.

@10c8
Created February 10, 2025 19:44

Revisions

  1. 10c8 created this gist Feb 10, 2025.
    1 change: 1 addition & 0 deletions readme.txt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1 @@
    Play this game by pasting the script in http://www.puzzlescript.net/editor.html
    1,542 changes: 1,542 additions & 0 deletions script.txt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,1542 @@
    (-
    - Human Puzzle Machine
    - Human Resource Machine demake in PuzzleScript
    -
    - by 0x77
    - version 0.1
    -)

    title [DEV] Human Puzzle Machine
    homepage 10c8.github.io

    background_color #362B25
    text_color #F8F4F1

    ( realtime_interval .2 )
    ( realtime_interval .01 )

    zoomscreen 18x14

    ( Disable while editing )
    run_rules_on_level_start

    ( Enable (maybe?) while editing )
    verbose_logging
    ( debug )

    ========
    OBJECTS
    ========
    ( Background )
    BACKGROUND .
    #4b382b

    ( Player )
    PLAYER @
    transparent

    ( Held )
    HELD ?
    #45332a

    ( Program Counter )
    PC #
    #49382c #7CCa40 #a58f7e #b9a08d
    10023
    11023
    11123
    11023
    10023

    ( Conveyor Belt )
    BELT_MID
    #5e5e5e
    BELT_IN_STR $
    transparent
    BELT_OUT_STR ¥
    transparent
    BELT_END ,
    transparent #2a2723
    .....
    .....
    .....
    .....
    11111

    ( Opcodes )
    OP_IN
    #9cb55b #415320
    00000
    10011
    11001
    10011
    00000
    OP_IN_1
    #9cb55B #415320
    00000
    10110
    00101
    10101
    00000
    OP_IN_2
    #9cb55b #415320

    OP_OUT
    #9cb55b #415320
    00000
    01011
    11010
    01011
    00000
    OP_OUT_1
    #9CB55B #415320
    00000
    10101
    10101
    10111
    00000
    OP_OUT_2
    #9CB55B #415320
    00000
    01110
    00100
    00100
    00000

    OP_CPY
    #5C2E21 #C96B52
    11111
    01100
    10101
    11100
    11111
    OP_CPY_1
    #5C2E21 #C96B52
    11111
    01000
    11000
    01011
    11111
    OP_CPY_2
    #5C2E21 #C96B52
    11111
    10101
    10001
    11011
    11111

    OP_PST
    #5C2E21 #C96B52
    11111
    11100
    10100
    01101
    11111
    OP_PST_1
    #5C2E21 #C96B52
    11111
    01100
    01101
    11001
    11111
    OP_PST_2
    #5C2E21 #C96B52
    11111
    10001
    11011
    11011
    11111

    OP_ADD
    #C28F64 #593D27
    00000
    10001
    11011
    10010
    00000
    OP_ADD_1
    #C28F64 #593D27
    00000
    00110
    10101
    10110
    00000
    OP_ADD_2
    #C28F64 #593D27
    00000
    01100
    01010
    01100
    00000

    OP_SUB
    #C28F64 #593D27
    00000
    00001
    11001
    00011
    00000
    OP_SUB_1
    #C28F64 #593D27
    00000
    10101
    00101
    00111
    00000
    OP_SUB_2
    #C28F64 #593D27
    00000
    01100
    01110
    01110
    00000

    OP_INC
    #C28F64 #593D27
    00000
    01011
    10001
    00011
    00000
    OP_INC_1
    #C28F64 #593D27
    00000
    10110
    00101
    10101
    00000
    OP_INC_2
    #C28F64 #593D27
    00000
    01110
    01000
    01110
    00000

    OP_DEC
    #C28F64 #593D27
    00000
    00011
    10010
    01011
    00000
    OP_DEC_1
    #C28F64 #593D27
    00000
    00111
    10110
    00111
    00000
    OP_DEC_2
    #C28F64 #593D27
    00000
    01110
    01000
    01110
    00000

    OP_JMP
    #3F4055 #8D8FB6
    11111
    01100
    11110
    11100
    11111
    OP_JMP_1
    #3F4055 #8D8FB6
    11111
    01000
    11000
    11010
    11111
    OP_JMP_2
    #3F4055 #8D8FB6
    11111
    10001
    10001
    10111
    11111

    OP_JPZ
    #3F4055 #8D8FB6
    11111
    01100
    01110
    11100
    11111
    OP_JPZ_1
    #3F4055 #8D8FB6
    11111
    01000
    11000
    11011
    11111
    OP_JPZ_2
    #3F4055 #8D8FB6
    11111
    10011
    11011
    11001
    11111

    OP_JPN
    #3F4055 #8D8FB6
    11111
    01100
    01110
    01100
    11111
    OP_JPN_1
    #3F4055 #8D8FB6
    11111
    01000
    11000
    11011
    11111
    OP_JPN_2
    #3F4055 #8D8FB6
    11111
    10011
    10101
    10101
    11111

    ( Numbers )
    CNT
    TRANSPARENT

    MARK_BLUE
    #8c90b4
    MARK_ORANGE
    #c28f64
    MARK_RED
    #c86a54
    CODE_LABEL
    transparent
    MEM_LABEL \
    #949962

    POS
    #9dcb58
    NEG :
    #c86a54

    N0 0
    #302c27
    .....
    .000.
    .0.0.
    .000.
    .....
    N1 1
    #302c27
    .....
    .00..
    ..0..
    .000.
    .....
    N2 2
    #302c27
    .....
    .00..
    ..0..
    ..00.
    .....
    N3 3
    #302c27 #505434
    .....
    .000.
    ..10.
    .000.
    .....
    N4 4
    #302c27
    .....
    .0.0.
    .000.
    ...0.
    .....
    N5 5
    #302c27
    .....
    ..00.
    ..0..
    .00..
    .....
    N6 6
    #302c27 #505434
    .....
    .0...
    .010.
    .000.
    .....
    N7 7
    #302c27
    .....
    .000.
    ...0.
    ..0..
    .....
    N8 8
    #302c27 #505434
    .....
    .00..
    .010.
    ..00.
    .....
    N9 9
    #302c27 #505434
    .....
    .000.
    .010.
    ...0.
    .....

    O0
    #302c27
    .....
    .000.
    .0.0.
    .000.
    .....
    O1
    #302c27
    .....
    .00..
    ..0..
    .000.
    .....
    O2
    #302c27
    .....
    .00..
    ..0..
    ..00.
    .....
    O3
    #302c27 #505434
    .....
    .000.
    ..10.
    .000.
    .....
    O4
    #302c27
    .....
    .0.0.
    .000.
    ...0.
    .....
    O5
    #302c27
    .....
    ..00.
    ..0..
    .00..
    .....
    O6
    #302c27 #505434
    .....
    .0...
    .010.
    .000.
    .....
    O7
    #302c27
    .....
    .000.
    ...0.
    ..0..
    .....
    O8
    #302c27 #505434
    .....
    .00..
    .010.
    ..00.
    .....
    O9
    #302c27 #505434
    .....
    .000.
    .010.
    ...0.
    .....

    M0
    #302c27
    .....
    .000.
    .0.0.
    .000.
    .....
    M1
    #302c27
    .....
    .00..
    ..0..
    .000.
    .....
    M2
    #302c27
    .....
    .00..
    ..0..
    ..00.
    .....
    M3
    #302c27 #505434
    .....
    .000.
    ..10.
    .000.
    .....
    M4
    #302c27
    .....
    .0.0.
    .000.
    ...0.
    .....
    M5
    #302c27
    .....
    ..00.
    ..0..
    .00..
    .....
    M6
    #302c27 #505434
    .....
    .0...
    .010.
    .000.
    .....
    M7
    #302c27
    .....
    .000.
    ...0.
    ..0..
    .....
    M8
    #302c27 #505434
    .....
    .00..
    .010.
    ..00.
    .....
    M9
    #302c27 #505434
    .....
    .000.
    .010.
    ...0.
    .....
    MX
    #302c27
    .....
    .0.0.
    ..0..
    .0.0.
    .....

    ( UI )
    CURSOR ¤
    #ffffff
    00.00
    0...0
    .....
    0...0
    00.00

    CUR_RED
    #ff0000
    00.00
    0...0
    .....
    0...0
    00.00

    CUR_YELLOW
    #ffff00
    00.00
    0...0
    .....
    0...0
    00.00

    CUR_BLUE
    #00bbff
    00.00
    0...0
    .....
    0...0
    00.00

    CUR_JUMP
    #49382c #8c90b4 #a58f7e #b9a08d
    10023
    11023
    11123
    11023
    10023

    CUR_DIM
    #888888
    00.00
    0...0
    .....
    0...0
    00.00

    CODE_PANEL_C ×
    #bca08b

    CODE_PANEL_L
    #a88f7c #bca08b
    ...01
    ...01
    ...01
    ...01
    ...01

    CODE_PANEL_B
    #bca08b #a88f7c #706053 #968072
    00000
    11111
    .....
    22222
    33333

    PANEL_C ø
    #968072

    PANEL_T
    #706053 #968072
    .....
    .....
    .....
    00000
    11111

    PANEL_B
    #968072 #706053
    00000
    11111
    .....
    .....
    .....

    PANEL_L
    #706053 #968072
    ...01
    ...01
    ...01
    ...01
    ...01

    PANEL_R
    #968072 #706053
    01...
    01...
    01...
    01...
    01...

    ICON_IN
    #444f2d #9cb65b
    .....
    .011.
    .001.
    .011.
    .....

    ICON_OUT
    #9cb65b #444f2d
    .....
    .001.
    .011.
    .001.
    .....

    ICON_CPY
    #5c2e21 #c96b52
    .....
    .011.
    .101.
    .111.
    .....

    ICON_PST
    #c96b52 #5c2e21
    .....
    .000.
    .010.
    .100.
    .....

    ICON_JMP
    #3f4055 #8d8fb6
    .....
    .011.
    .111.
    .111.
    .....

    ( Special )
    R_TICK '
    transparent
    M_TICK "
    transparent

    CODE_POS ²
    transparent
    CODE_STR *
    transparent
    CODE_END _
    transparent

    QUEUE_END %
    transparent

    OUT_STR {
    transparent
    OUT_END }
    transparent

    MATH_ADD +
    transparent
    MATH_ADD_B ß
    transparent

    MATH_Q_A -
    transparent
    MATH_Q_B ä
    transparent

    INC
    transparent
    DEC
    transparent

    MEM_SLOT ¡
    #505434

    OPS_BTN_ROW_0 ç
    transparent
    OPS_BTN_ROW_1 ¿
    transparent
    OPS_BTN_ROW_2 å
    transparent

    OP_DATA
    transparent
    OP_EMPTY
    red

    PC_ANCHOR ®
    #49382c #8c90b4 #a58f7e #b9a08d
    10023
    .1023
    ..123
    .1023
    10023

    OP_ANCHOR þ
    blue

    ICON_ANCHOR
    transparent

    SEL_TMP æ
    transparent

    LABEL ;
    transparent

    HAND =
    transparent

    FINISHED
    transparent

    ( States )
    S_PLAY
    #00ff00
    S_PLAY_START
    #ffff00
    S_PLAY_WAIT
    orange
    S_IDLE
    #ff0000 #000000
    .....
    .....
    .....
    .....
    11110
    S_EDIT_START
    #ff0000 #000000
    .....
    .....
    .....
    .....
    11101
    S_EDIT
    #ff0000 #000000
    .....
    .....
    .....
    .....
    11100
    S_CHANGE_START
    #ff0000 #000000
    .....
    .....
    .....
    .....
    11011
    S_CHANGE
    #ff0000 #000000
    .....
    .....
    .....
    .....
    11010
    S_CHANGE_MOVING
    #ff0000 #000000
    .....
    .....
    .....
    .....
    11001
    S_CHANGE_CANCEL
    #ff0000 #000000
    .....
    .....
    .....
    .....
    11000
    S_MEM_SEL_ED
    #ff0000 #000000
    .....
    .....
    .....
    .....
    10111
    S_MEM_SEL_CH
    #ff0000 #000000
    .....
    .....
    .....
    .....
    10110
    S_LINE_SEL_ED
    #ff0000 #000000
    .....
    .....
    .....
    .....
    10101
    S_LINE_SEL_CH
    #ff0000 #000000
    .....
    .....
    .....
    .....
    10100

    =======
    LEGEND
    =======
    ( Conveyor Belt )
    BELT = BELT_MID or BELT_IN_STR or BELT_OUT_STR or BELT_END

    ( Opcodes )
    OPCODE = OP_IN or OP_OUT or OP_CPY or OP_PST or OP_ADD or OP_SUB or OP_INC or OP_DEC or OP_JMP or OP_JPZ or OP_JPN
    OP_OTHER = OPCODE
    OP_PART = OP_IN_1 or OP_IN_2 or OP_OUT_1 or OP_OUT_2 or OP_CPY_1 or OP_CPY_2 or OP_PST_1 or OP_PST_2 or OP_ADD_1 or OP_ADD_2 or OP_SUB_1 or OP_SUB_2 or OP_INC_1 or OP_INC_2 or OP_DEC_1 or OP_DEC_2 or OP_JMP_1 or OP_JMP_2 or OP_JPZ_1 or OP_JPZ_2 or OP_JPN_1 or OP_JPN_2

    OPS_JMP = OP_JMP or OP_JPZ or OP_JPN
    OPS_MEM = OP_CPY or OP_PST

    A = OP_IN
    B = OP_OUT
    C = OP_CPY
    D = OP_PST
    E = OP_ADD
    F = OP_SUB
    G = OP_INC
    H = OP_DEC
    I = OP_JMP
    J = OP_JPZ
    K = OP_JPN

    ( Numbers )
    NUM = N0 or N1 or N2 or N3 or N4 or N5 or N6 or N7 or N8 or N9
    O = O0 or O1 or O2 or O3 or O4 or O5 or O6 or O7 or O8 or O9
    M = M0 or M1 or M2 or M3 or M4 or M5 or M6 or M7 or M8 or M9 or MX
    OTHER_M = M
    MATH = MATH_ADD or MATH_ADD_B or MATH_Q_A or MATH_Q_B
    MARK = MARK_BLUE or MARK_ORANGE or MARK_RED or CODE_LABEL or MEM_LABEL
    SIGN = POS or NEG

    ( UI )
    PANEL = PANEL_C or PANEL_T or PANEL_B or PANEL_L or PANEL_R
    CODE_PANEL = CODE_PANEL_C or CODE_PANEL_L or CODE_PANEL_B
    ICON = ICON_IN or ICON_OUT or ICON_CPY or ICON_PST or ICON_JMP
    CUR_DECO = CUR_YELLOW or CUR_RED or CUR_BLUE or CUR_JUMP or CUR_DIM
    CODE_CUR_TGT = OPCODE or OP_DATA

    ( States )
    S_MEM_SEL_X = S_MEM_SEL_ED or S_MEM_SEL_CH
    S_LINE_SEL_X = S_LINE_SEL_ED or S_LINE_SEL_CH
    STATE = S_PLAY or S_PLAY_START or S_PLAY_WAIT or S_IDLE or S_EDIT_START or S_EDIT or S_CHANGE_START or S_CHANGE or S_CHANGE_MOVING or S_CHANGE_CANCEL or S_MEM_SEL_X or S_LINE_SEL_X

    ( Combos )
    ¶ = PLAYER and R_TICK and S_IDLE
    ó = ICON_ANCHOR and PANEL_C

    =======
    SOUNDS
    =======

    ================
    COLLISIONLAYERS
    ================
    ( BG )
    BACKGROUND
    STATE HELD BELT PANEL CODE_PANEL
    PC PC_ANCHOR OP_ANCHOR ICON_ANCHOR
    OPCODE OP_PART ICON
    OP_EMPTY
    MATH OP_DATA
    CNT MARK INC DEC
    M
    MEM_SLOT
    SIGN
    NUM O
    R_TICK M_TICK CODE_POS CODE_STR CODE_END QUEUE_END OUT_STR OUT_END OPS_BTN_ROW_0 OPS_BTN_ROW_1 OPS_BTN_ROW_2 SEL_TMP LABEL HAND FINISHED
    PLAYER CURSOR
    CUR_DECO

    ======
    RULES
    ======
    ( Realtime fix )
    ( [ STATIONARY @ ] ["] -> [ @ ] ['] )
    ( [ MOVING @ ] ['] -> [ MOVING @ ] ["] )

    (( Setup ))
    ( UI )
    RIGHT [ NO × | × ] -> [ CODE_PANEL_L | × ]
    UP [ NO × | × ] -> [ CODE_PANEL_B | × ]

    RIGHT [ } | N0 ] [ ç NO ICON | | | | ] -> [ } | N0 ] [ ç PANEL_C ICON_IN CURSOR | ICON_OUT | ICON_CPY | ICON_PST | ICON_JMP ]

    RIGHT [ NO ø | ø ] -> [ PANEL_L | ø ]
    RIGHT [ ø | NO ø ] -> [ ø | PANEL_R ]
    UP [ NO ø | ø ] -> [ PANEL_B | ø ]

    ( Belts )
    UP [ $ | NO BELT ] -> [ $ | BELT_MID ]
    DOWN [ ¥ | NO BELT ] -> [ ¥ | BELT_MID ]

    UP [ BELT_MID | NO BELT NO ¥ ] -> [ BELT_MID | BELT_MID ]
    DOWN [ BELT_MID | NO BELT NO , ] -> [ BELT_MID | BELT_MID ]

    ( Memory slots )
    DOWN [ N0 NO ¡ | \ ] -> [ ¡ M0 | \ N0 ]
    DOWN [ N1 NO ¡ | \ ] -> [ ¡ M1 | \ N1 ]
    DOWN [ N2 NO ¡ | \ ] -> [ ¡ M2 | \ N2 ]
    DOWN [ N3 NO ¡ | \ ] -> [ ¡ M3 | \ N3 ]
    DOWN [ N4 NO ¡ | \ ] -> [ ¡ M4 | \ N4 ]
    DOWN [ N5 NO ¡ | \ ] -> [ ¡ M5 | \ N5 ]
    DOWN [ N6 NO ¡ | \ ] -> [ ¡ M6 | \ N6 ]
    DOWN [ N7 NO ¡ | \ ] -> [ ¡ M7 | \ N7 ]
    DOWN [ N8 NO ¡ | \ ] -> [ ¡ M8 | \ N8 ]
    DOWN [ N9 NO ¡ | \ ] -> [ ¡ M9 | \ N9 ]

    ( DEBUG: Mark math numbers )
    RIGHT [ MATH | N0 ] -> [ MATH | POS M0 ]
    RIGHT [ MATH | N1 ] -> [ MATH | POS M1 ]
    RIGHT [ MATH | N2 ] -> [ MATH | POS M2 ]
    RIGHT [ MATH | N3 ] -> [ MATH | POS M3 ]
    RIGHT [ MATH | N4 ] -> [ MATH | POS M4 ]
    RIGHT [ MATH | N5 ] -> [ MATH | POS M5 ]
    RIGHT [ MATH | N6 ] -> [ MATH | POS M6 ]
    RIGHT [ MATH | N7 ] -> [ MATH | POS M7 ]
    RIGHT [ MATH | N8 ] -> [ MATH | POS M8 ]
    RIGHT [ MATH | N9 ] -> [ MATH | POS M9 ]

    ( Mark level number )
    RIGHT [ } | NUM ] -> [ } | MARK_BLUE NUM ]

    ( Code lines counter )
    RIGHT [ ² | NO M ] -> [ ² | MARK_RED M0 ]

    ( Mark jump labels )
    RIGHT [ ; | NUM ] -> [ ; | CODE_LABEL NUM ]
    RIGHT [ ; | | NUM ] -> [ ; | | CODE_LABEL NUM ]

    ( Sign numbers on queue )
    DOWN [ NO SIGN NO MARK NUM | NO - ] -> [ POS NUM | ]
    DOWN [ NO SIGN NO MARK NUM | - ] -> [ NEG NUM | ]

    (( Handle state ))
    (
    - TODO:
    - [ ] Halt on invalid states
    - [ ] Restore initial inputs and clear output after halting (after confirmation)
    - [ ] Explain the currently targeted button with a tooltip to the side of the cursor
    - [ ] Highlight jump target on hover
    - [ ] Highlight memory target on hover
    - [ ] Eye candy
    - [ ] Player character
    - [ ] Conveyor belt animation
    )
    ( PLAY_START )
    LATE ['][ @ S_PLAY_START ] [ * ] -> ['][ @ S_PLAY_WAIT ] [ * # ]

    ( PLAY )
    ( Advance the PC )
    ( NOTE: We stagger it a bit so that jumps are better visualized )
    RIGHT ['][ @ S_PLAY ] [ # | NO OPCODE ] -> ['][ @ S_IDLE ] [ | ]

    DOWN ['][ @ S_PLAY ] [ # | ] -> ['][ @ S_PLAY_WAIT ] [ | # ]

    RIGHT ['][ @ S_PLAY_WAIT ] [ # ] [ ® ] -> ['][ @ S_PLAY ] [ ] [ # ]

    RIGHT ['][ @ S_PLAY_WAIT ] -> ['][ @ S_PLAY ]

    ( IDLE )
    ( DEBUG: Play on ACTION )
    [ ACTION @ S_IDLE ] [ CURSOR NO ICON ] -> [ @ S_PLAY_START ] [ CURSOR ]

    ( Opcode tooltips )
    RIGHT [ ACTION @ S_IDLE ] [ CURSOR ICON_IN ] [ ² | | ] -> [ @ S_EDIT_START ] [ CURSOR ICON_IN ] [ ² | | OP_IN ]
    RIGHT [ ACTION @ S_IDLE ] [ CURSOR ICON_OUT ] [ ² | | ] -> [ @ S_EDIT_START ] [ CURSOR ICON_OUT ] [ ² | | OP_OUT ]
    RIGHT [ ACTION @ S_IDLE ] [ CURSOR ICON_CPY ] [ ² | | ] -> [ @ S_EDIT_START ] [ CURSOR ICON_CPY ] [ ² | | OP_CPY ]
    RIGHT [ ACTION @ S_IDLE ] [ CURSOR ICON_PST ] [ ² | | ] -> [ @ S_EDIT_START ] [ CURSOR ICON_PST ] [ ² | | OP_PST ]
    RIGHT [ ACTION @ S_IDLE ] [ CURSOR ICON_JMP ] [ ² | | ] -> [ @ S_EDIT_START ] [ CURSOR ICON_JMP ] [ ² | | OP_JMP ]
    ( ... )

    ( Moving into the top border enters CHANGE mode )
    [ UP @ S_IDLE ] [ CURSOR | CODE_PANEL_B ] -> [ @ S_CHANGE_START ] [ CURSOR | CODE_PANEL_B ]

    ( Cursor movement )
    [ MOVING @ S_IDLE ] [ CURSOR ] -> [ @ S_IDLE ] [ MOVING CURSOR ]

    LEFT [ S_IDLE ] [ LEFT CURSOR | PANEL_L ] -> [ S_IDLE ] [ CURSOR | PANEL_L ]
    RIGHT [ S_IDLE ] [ RIGHT CURSOR | PANEL_R ] -> [ S_IDLE ] [ CURSOR | PANEL_R ]
    DOWN [ S_IDLE ] [ DOWN CURSOR | PANEL_B ] -> [ S_IDLE ] [ CURSOR | PANEL_B ]

    ( EDIT_START )
    ( If code is full, we can't add anything else, so we return to IDLE )
    RIGHT [ S_EDIT_START ] [ ² | MX | OPCODE ] -> [ S_IDLE ] [ ² | MX | ]

    ( Place the cursor at the last line of code )
    RIGHT [ S_EDIT_START ] [ CURSOR ] [ ² | M0 | OPCODE ] [ | | | | | ; | N0 ] -> [ S_EDIT ] [ ] [ ² | M0 | ] [ CURSOR OPCODE | | | | | ; | N0 ]
    RIGHT [ S_EDIT_START ] [ CURSOR ] [ ² | M1 | OPCODE ] [ | | | | | ; | N1 ] -> [ S_EDIT ] [ ] [ ² | M1 | ] [ CURSOR OPCODE | | | | | ; | N1 ]
    RIGHT [ S_EDIT_START ] [ CURSOR ] [ ² | M2 | OPCODE ] [ | | | | | ; | N2 ] -> [ S_EDIT ] [ ] [ ² | M2 | ] [ CURSOR OPCODE | | | | | ; | N2 ]
    RIGHT [ S_EDIT_START ] [ CURSOR ] [ ² | M3 | OPCODE ] [ | | | | | ; | N3 ] -> [ S_EDIT ] [ ] [ ² | M3 | ] [ CURSOR OPCODE | | | | | ; | N3 ]
    RIGHT [ S_EDIT_START ] [ CURSOR ] [ ² | M4 | OPCODE ] [ | | | | | ; | N4 ] -> [ S_EDIT ] [ ] [ ² | M4 | ] [ CURSOR OPCODE | | | | | ; | N4 ]
    RIGHT [ S_EDIT_START ] [ CURSOR ] [ ² | M5 | OPCODE ] [ | | | | | ; | N5 ] -> [ S_EDIT ] [ ] [ ² | M5 | ] [ CURSOR OPCODE | | | | | ; | N5 ]
    RIGHT [ S_EDIT_START ] [ CURSOR ] [ ² | M6 | OPCODE ] [ | | | | | ; | N6 ] -> [ S_EDIT ] [ ] [ ² | M6 | ] [ CURSOR OPCODE | | | | | ; | N6 ]
    RIGHT [ S_EDIT_START ] [ CURSOR ] [ ² | M7 | OPCODE ] [ | | | | | ; | N7 ] -> [ S_EDIT ] [ ] [ ² | M7 | ] [ CURSOR OPCODE | | | | | ; | N7 ]
    RIGHT [ S_EDIT_START ] [ CURSOR ] [ ² | M8 | OPCODE ] [ | | | | | ; | N8 ] -> [ S_EDIT ] [ ] [ ² | M8 | ] [ CURSOR OPCODE | | | | | ; | N8 ]
    RIGHT [ S_EDIT_START ] [ CURSOR ] [ ² | M9 | OPCODE ] [ | | | | | ; | N9 ] -> [ S_EDIT ] [ ] [ ² | M9 | ] [ CURSOR OPCODE | | | | | ; | N9 ]

    ( EDIT )
    ( Interact to add an opcode with a parameter and enter MEMORY/LINE SELECT mode, then return to IDLE )
    RIGHT [ ACTION @ S_EDIT ] [ CURSOR OPS_MEM | | | | ] [ ¡ M0 ] -> [ @ S_MEM_SEL_ED ] [ OPS_MEM | | | | æ ] [ ¡ M0 CURSOR ]

    RIGHT [ ACTION @ S_EDIT ] [ CURSOR OPS_JMP |||| ] [ |||||| ; | N0 ] -> [ @ S_LINE_SEL_ED ] [ OPS_JMP |||| æ ] [ CURSOR |||||| ; | N0 ]

    ( Interact to add a simple opcode and return to IDLE )
    [ ACTION @ S_EDIT ] [ CURSOR ] [ ç ] [ ² ] -> [ @ S_IDLE ] [ ] [ ç CURSOR ] [ ² INC ]

    ( Move left to cancel addition and return to IDLE)
    RIGHT [ LEFT @ S_EDIT ] [ CURSOR OPCODE | OP_PART | OP_PART ] [ ç ] -> [ @ S_IDLE ] [ | | ] [ ç CURSOR ]

    ( Handle swapping code lines on vertical movement )
    UP [ UP @ S_EDIT ] [ CURSOR OPCODE | OP_OTHER ] -> [ @ S_EDIT ] [ UP CURSOR OPCODE + | OP_OTHER - ]
    DOWN [ DOWN @ S_EDIT ] [ CURSOR OPCODE | OP_OTHER ] -> [ @ S_EDIT ] [ DOWN CURSOR OPCODE - | OP_OTHER + ]

    ( CHANGE_START )
    ( Entering CHANGE mode with empty code returns you back to IDLE )
    RIGHT [ S_CHANGE_START ] [ ² | M0 ] [ NO OPCODE | | | | | ; | N0 ] -> [ S_IDLE ] [ ² | M0 ] [ | | | | | ; | N0 ]

    ( Otherwise, we place the cursor at the last line of code )
    RIGHT [ S_CHANGE_START ] [ CURSOR ] [ ² | M1 ] [ | | | | | ; | N0 ] -> [ S_CHANGE ] [ ] [ ² | M1 ] [ CURSOR | | | | | ; | N0 ]
    RIGHT [ S_CHANGE_START ] [ CURSOR ] [ ² | M2 ] [ | | | | | ; | N1 ] -> [ S_CHANGE ] [ ] [ ² | M2 ] [ CURSOR | | | | | ; | N1 ]
    RIGHT [ S_CHANGE_START ] [ CURSOR ] [ ² | M3 ] [ | | | | | ; | N2 ] -> [ S_CHANGE ] [ ] [ ² | M3 ] [ CURSOR | | | | | ; | N2 ]
    RIGHT [ S_CHANGE_START ] [ CURSOR ] [ ² | M4 ] [ | | | | | ; | N3 ] -> [ S_CHANGE ] [ ] [ ² | M4 ] [ CURSOR | | | | | ; | N3 ]
    RIGHT [ S_CHANGE_START ] [ CURSOR ] [ ² | M5 ] [ | | | | | ; | N4 ] -> [ S_CHANGE ] [ ] [ ² | M5 ] [ CURSOR | | | | | ; | N4 ]
    RIGHT [ S_CHANGE_START ] [ CURSOR ] [ ² | M6 ] [ | | | | | ; | N5 ] -> [ S_CHANGE ] [ ] [ ² | M6 ] [ CURSOR | | | | | ; | N5 ]
    RIGHT [ S_CHANGE_START ] [ CURSOR ] [ ² | M7 ] [ | | | | | ; | N6 ] -> [ S_CHANGE ] [ ] [ ² | M7 ] [ CURSOR | | | | | ; | N6 ]
    RIGHT [ S_CHANGE_START ] [ CURSOR ] [ ² | M8 ] [ | | | | | ; | N7 ] -> [ S_CHANGE ] [ ] [ ² | M8 ] [ CURSOR | | | | | ; | N7 ]
    RIGHT [ S_CHANGE_START ] [ CURSOR ] [ ² | M9 ] [ | | | | | ; | N8 ] -> [ S_CHANGE ] [ ] [ ² | M9 ] [ CURSOR | | | | | ; | N8 ]
    RIGHT [ S_CHANGE_START ] [ CURSOR ] [ ² | MX ] [ | | | | | ; | N9 ] -> [ S_CHANGE ] [ ] [ ² | MX ] [ CURSOR | | | | | ; | N9 ]

    ( CHANGE )
    ( Interacting with an opcode enters MOVING mode )
    [ ACTION @ S_CHANGE ] [ CURSOR OPCODE ] -> [ @ S_CHANGE_MOVING ] [ CURSOR OPCODE ]

    ( Interacting with an opcode parameter enters MEMORY/LINE SELECT mode )
    [ ACTION @ S_CHANGE ] [ OPS_MEM |||| CURSOR OP_DATA ] [ ¡ M0 ] -> [ @ S_MEM_SEL_CH ] [ OPS_MEM |||| OP_DATA æ ] [ ¡ M0 CURSOR ]

    [ ACTION @ S_CHANGE ] [ OPS_JMP |||| CURSOR OP_DATA ] [ |||||| ; | N0 ] -> [ @ S_LINE_SEL_CH ] [ OPS_JMP |||| OP_DATA æ ] [ CURSOR |||||| ; | N0 ]

    ( Cursor movement )
    UP [ UP @ S_CHANGE ] [ CURSOR | CODE_CUR_TGT ] -> [ @ S_CHANGE ] [ UP CURSOR | CODE_CUR_TGT ]
    DOWN [ DOWN @ S_CHANGE ] [ CURSOR | CODE_CUR_TGT ] -> [ @ S_CHANGE ] [ DOWN CURSOR | CODE_CUR_TGT ]

    RIGHT [ RIGHT @ S_CHANGE ] [ CURSOR OPCODE | | | | OP_DATA ] -> [ @ S_CHANGE ] [ OPCODE | | | | CURSOR OP_DATA ]
    RIGHT [ LEFT @ S_CHANGE ] [ OPCODE | | | | CURSOR OP_DATA ] -> [ @ S_CHANGE ] [ CURSOR OPCODE | | | | OP_DATA ]

    ( Moving down into an empty line returns you to IDLE mode )
    DOWN [ DOWN @ S_CHANGE ] [ CURSOR NO OP_DATA | NO CODE_CUR_TGT ] [ ç ] -> [ @ S_IDLE ] [ | ] [ ç CURSOR ]

    [ S_CHANGE ] [ CURSOR NO CODE_CUR_TGT ] [ ² | M0 ] [ ç ] -> [ S_IDLE ] [ ] [ ² | M0 ] [ ç CURSOR ]
    [ S_CHANGE ] [ CURSOR NO CODE_CUR_TGT ] -> [ S_CHANGE ] [ UP CURSOR ]

    ( CHANGE_MOVING )
    ( Interact to finish moving and return to CHANGE mode )
    [ ACTION @ S_CHANGE_MOVING ] -> [ @ S_CHANGE ]

    ( Handle swapping code lines on vertical movement )
    UP [ UP @ S_CHANGE_MOVING ] [ CURSOR OPCODE | OP_OTHER ] -> [ @ S_CHANGE_MOVING ] [ UP CURSOR OPCODE + | OP_OTHER - ]
    DOWN [ DOWN @ S_CHANGE_MOVING ] [ CURSOR OPCODE | OP_OTHER ] -> [ @ S_CHANGE_MOVING ] [ DOWN CURSOR OPCODE - | OP_OTHER + ]

    ( Move left to delete the currently held opcode and return to IDLE mode )
    RIGHT [ LEFT @ S_CHANGE_MOVING ] [ CURSOR OPCODE | OP_PART | OP_PART | | OP_EMPTY ] [ ² ] -> [ @ S_CHANGE ] [ CURSOR | | | | ] [ ² DEC ]
    RIGHT [ LEFT @ S_CHANGE_MOVING ] [ CURSOR OPCODE | OP_PART | OP_PART | | OP_DATA MARK NUM ] [ ² ] -> [ @ S_CHANGE ] [ CURSOR | | | | ] [ ² DEC ]

    ( MEM_SEL_* )
    ( Interact to select a memory slot and return to CHANGE mode if you came from it, or to IDLE otherwise )
    DOWN [ ACTION @ S_MEM_SEL_ED ] [ CURSOR | \ NUM ] [ OP_EMPTY æ ] [ ç ] [ ² ] -> [ @ S_IDLE ] [ | \ NUM ] [ NUM ] [ ç CURSOR ] [ ² INC ]

    DOWN [ ACTION @ S_MEM_SEL_CH ] [ CURSOR | \ NUM ] [ æ ] -> [ @ S_CHANGE ] [ | \ NUM ] [ CURSOR NUM ]

    ( Cursor movement )
    LEFT [ LEFT @ S_MEM_SEL_X ] [ CURSOR | MEM_SLOT ] -> [ @ S_MEM_SEL_X ] [ LEFT CURSOR | MEM_SLOT ]
    RIGHT [ RIGHT @ S_MEM_SEL_X ] [ CURSOR | MEM_SLOT ] -> [ @ S_MEM_SEL_X ] [ RIGHT CURSOR | MEM_SLOT ]

    DOWN [ DOWN @ S_MEM_SEL_X ] [ CURSOR | \ N0 ] [ | \ N5 ] -> [ @ S_MEM_SEL_X ] [ | \ N0 ] [ CURSOR | \ N5 ]
    DOWN [ DOWN @ S_MEM_SEL_X ] [ CURSOR | \ N1 ] [ | \ N6 ] -> [ @ S_MEM_SEL_X ] [ | \ N1 ] [ CURSOR | \ N6 ]
    DOWN [ DOWN @ S_MEM_SEL_X ] [ CURSOR | \ N2 ] [ | \ N7 ] -> [ @ S_MEM_SEL_X ] [ | \ N2 ] [ CURSOR | \ N7 ]
    DOWN [ DOWN @ S_MEM_SEL_X ] [ CURSOR | \ N3 ] [ | \ N8 ] -> [ @ S_MEM_SEL_X ] [ | \ N3 ] [ CURSOR | \ N8 ]
    DOWN [ DOWN @ S_MEM_SEL_X ] [ CURSOR | \ N4 ] [ | \ N9 ] -> [ @ S_MEM_SEL_X ] [ | \ N4 ] [ CURSOR | \ N9 ]

    DOWN [ UP @ S_MEM_SEL_X ] [ CURSOR | \ N5 ] [ | \ N0 ] -> [ @ S_MEM_SEL_X ] [ | \ N5 ] [ CURSOR | \ N0 ]
    DOWN [ UP @ S_MEM_SEL_X ] [ CURSOR | \ N6 ] [ | \ N1 ] -> [ @ S_MEM_SEL_X ] [ | \ N6 ] [ CURSOR | \ N1 ]
    DOWN [ UP @ S_MEM_SEL_X ] [ CURSOR | \ N7 ] [ | \ N2 ] -> [ @ S_MEM_SEL_X ] [ | \ N7 ] [ CURSOR | \ N2 ]
    DOWN [ UP @ S_MEM_SEL_X ] [ CURSOR | \ N8 ] [ | \ N3 ] -> [ @ S_MEM_SEL_X ] [ | \ N8 ] [ CURSOR | \ N3 ]
    DOWN [ UP @ S_MEM_SEL_X ] [ CURSOR | \ N9 ] [ | \ N4 ] -> [ @ S_MEM_SEL_X ] [ | \ N9 ] [ CURSOR | \ N4 ]

    ( LINE_SEL_* )
    ( Interact to select a code line and return to CHANGE mode if you came from it, or to IDLE otherwise )
    [ ACTION @ S_LINE_SEL_ED ] [ CURSOR |||||| ; | NUM ] [ OP_EMPTY æ ] [ ç ] [ ² ] -> [ @ S_IDLE ] [ |||||| ; | NUM ] [ NUM ] [ ç CURSOR ] [ ² INC ]

    [ ACTION @ S_LINE_SEL_CH ] [ CURSOR |||||| ; | NUM ] [ æ ] -> [ @ S_CHANGE ] [ |||||| ; | NUM ] [ CURSOR NUM ]

    ( Cursor movement )
    UP [ UP @ S_LINE_SEL_X ] [ CURSOR | CODE_PANEL_L ] -> [ @ S_LINE_SEL_X ] [ UP CURSOR | CODE_PANEL_L ]
    DOWN [ DOWN @ S_LINE_SEL_X ] [ CURSOR | CODE_PANEL_L ] -> [ @ S_LINE_SEL_X ] [ DOWN CURSOR | CODE_PANEL_L ]

    ( ANY )
    ( Prevent invalid cursor movements )
    [ MOVING @ ] -> [ @ ]

    ( Update cursor decoration depending on state )
    LATE [ CUR_DECO ] -> [ ]

    LATE [ S_EDIT ] [ CURSOR ] -> [ S_EDIT ] [ CURSOR CUR_YELLOW ]
    LATE [ S_CHANGE_MOVING ] [ CURSOR ] -> [ S_CHANGE_MOVING ] [ CURSOR CUR_YELLOW ]
    LATE [ S_LINE_SEL_X ] [ CURSOR ] -> [ S_LINE_SEL_X ] [ CURSOR CUR_JUMP ]

    (( Handle opcode rendering and movement ))
    ( Perform a swap between two opcodes )
    (
    - 1. Temporarily store the one that's going up, along with its data.
    - 2. Move the one that's going down, along with its data, leaving an anchor for the stored one.
    - 3. Restore the stored one at the anchor.
    )
    RIGHT [ OPCODE + | | | | OP_DATA MARK NUM ] [ ² | | | | | | ] -> [ | | | | ] [ ² | | OPCODE | | | | OP_DATA MARK NUM ]
    RIGHT [ OPCODE + | | | | OP_EMPTY OP_DATA ] [ ² | | | | | | ] -> [ | | | | ] [ ² | | OPCODE | | | | OP_EMPTY OP_DATA ]
    RIGHT [ OPCODE + | | | | OP_EMPTY ] [ ² | | | | | | ] -> [ | | | | ] [ ² | | OPCODE | | | | OP_EMPTY ]

    RIGHT [ OPCODE - | | | | OP_DATA MARK NUM ] -> [ OPCODE þ | | | | þ OP_DATA MARK NUM ]
    RIGHT [ OPCODE - | | | | OP_EMPTY OP_DATA ] -> [ OPCODE þ | | | | þ OP_EMPTY OP_DATA ]
    RIGHT [ OPCODE - | | | | OP_EMPTY ] -> [ OPCODE þ | | | | þ OP_EMPTY ]

    DOWN [ OPCODE þ | ] -> [ þ | OPCODE ]
    DOWN [ OP_DATA þ | ] -> [ þ | OP_DATA ]
    DOWN [ OP_EMPTY þ | ] -> [ | OP_EMPTY ]
    DOWN [ MARK þ | ] -> [ þ | MARK ]
    DOWN [ NUM þ | ] -> [ | NUM ]

    RIGHT [ ² | | OPCODE | | | | OP_DATA MARK NUM ] [ þ | | | | ] -> [ ² | | | | | | ] [ OPCODE | | | | OP_DATA MARK NUM ]
    RIGHT [ ² | | OPCODE | | | | OP_EMPTY OP_DATA ] [ þ | | | | ] -> [ ² | | | | | | ] [ OPCODE | | | | OP_EMPTY OP_DATA ]
    RIGHT [ ² | | OPCODE | | | | OP_EMPTY ] [ þ | | | | ] -> [ ² | | | | | | ] [ OPCODE | | | | OP_EMPTY ]

    ( Delete invalid opcode visuals and their related data )
    RIGHT [ NO OPCODE | OP_PART | OP_PART | | OP_DATA MARK NUM ] -> [ | | | | ]
    RIGHT [ NO OPCODE | OP_PART | OP_PART | | OP_EMPTY OP_DATA ] -> [ | | | | ]
    RIGHT [ NO OPCODE | OP_PART | OP_PART | | OP_EMPTY ] -> [ | | | | ]

    UP [ OPCODE NO ICON_ANCHOR | NO OPCODE ] -> [ | OPCODE ]

    LATE RIGHT [ CURSOR NO ICON ] [ ICON_ANCHOR OPCODE | OP_PART | OP_PART ] -> [ CURSOR ] [ ICON_ANCHOR | | ]

    LATE RIGHT [ CURSOR ICON_IN ] [ ICON_ANCHOR | | ] -> [ CURSOR ICON_IN ] [ ICON_ANCHOR OP_IN | OP_IN_1 | OP_IN_2 ]
    LATE RIGHT [ CURSOR ICON_OUT ] [ ICON_ANCHOR | | ] -> [ CURSOR ICON_OUT ] [ ICON_ANCHOR OP_OUT | OP_OUT_1 | OP_OUT_2 ]
    LATE RIGHT [ CURSOR ICON_CPY ] [ ICON_ANCHOR | | ] -> [ CURSOR ICON_CPY ] [ ICON_ANCHOR OP_CPY | OP_CPY_1 | OP_CPY_2 ]
    LATE RIGHT [ CURSOR ICON_PST ] [ ICON_ANCHOR | | ] -> [ CURSOR ICON_PST ] [ ICON_ANCHOR OP_PST | OP_PST_1 | OP_PST_2 ]
    LATE RIGHT [ CURSOR ICON_JMP ] [ ICON_ANCHOR | | ] -> [ CURSOR ICON_JMP ] [ ICON_ANCHOR OP_JMP | OP_JMP_1 | OP_JMP_2 ]

    ( Keep opcodes stacked at the top of the code panel )
    (
    - NOTE: We have to repeat this a bunch of times because we can only move a group of `OP_EMPTY` or `OP_DATA`
    - at once with every try.
    )
    UP [ OP_EMPTY | NO OP_EMPTY NO OP_DATA ] -> [ | OP_EMPTY ]
    UP [ OP_DATA MARK NUM | NO OP_EMPTY NO OP_DATA ] -> [ | OP_DATA MARK NUM ]
    UP [ OP_EMPTY | NO OP_EMPTY NO OP_DATA ] -> [ | OP_EMPTY ]
    UP [ OP_DATA MARK NUM | NO OP_EMPTY NO OP_DATA ] -> [ | OP_DATA MARK NUM ]
    UP [ OP_EMPTY | NO OP_EMPTY NO OP_DATA ] -> [ | OP_EMPTY ]
    UP [ OP_DATA MARK NUM | NO OP_EMPTY NO OP_DATA ] -> [ | OP_DATA MARK NUM ]
    UP [ OP_EMPTY | NO OP_EMPTY NO OP_DATA ] -> [ | OP_EMPTY ]
    UP [ OP_DATA MARK NUM | NO OP_EMPTY NO OP_DATA ] -> [ | OP_DATA MARK NUM ]
    UP [ OP_EMPTY | NO OP_EMPTY NO OP_DATA ] -> [ | OP_EMPTY ]
    UP [ OP_DATA MARK NUM | NO OP_EMPTY NO OP_DATA ] -> [ | OP_DATA MARK NUM ]

    ( Another pass for deleting invalid opcode visuals )
    RIGHT [ NO OPCODE | OP_PART | OP_PART ] -> [ | | ]

    ( Insert opcode visuals into recently added/moved code lines )
    RIGHT [ OP_IN NO ICON_ANCHOR | | | | ] -> [ OP_IN | OP_IN_1 | OP_IN_2 | | OP_EMPTY ]
    RIGHT [ OP_OUT NO ICON_ANCHOR | | | | ] -> [ OP_OUT | OP_OUT_1 | OP_OUT_2 | | OP_EMPTY ]
    RIGHT [ OP_CPY NO ICON_ANCHOR | | | | ] -> [ OP_CPY | OP_CPY_1 | OP_CPY_2 | | OP_DATA ]
    RIGHT [ OP_PST NO ICON_ANCHOR | | | | ] -> [ OP_PST | OP_PST_1 | OP_PST_2 | | OP_DATA ]
    RIGHT [ OP_ADD NO ICON_ANCHOR | | | | ] -> [ OP_ADD | OP_ADD_1 | OP_ADD_2 | | OP_DATA ]
    RIGHT [ OP_SUB NO ICON_ANCHOR | | | | ] -> [ OP_SUB | OP_SUB_1 | OP_SUB_2 | | OP_DATA ]
    RIGHT [ OP_INC NO ICON_ANCHOR | | | | ] -> [ OP_INC | OP_INC_1 | OP_INC_2 | | OP_DATA ]
    RIGHT [ OP_DEC NO ICON_ANCHOR | | | | ] -> [ OP_DEC | OP_DEC_1 | OP_DEC_2 | | OP_DATA ]
    RIGHT [ OP_JMP NO ICON_ANCHOR | | | | ] -> [ OP_JMP | OP_JMP_1 | OP_JMP_2 | | OP_DATA ]
    RIGHT [ OP_JPZ NO ICON_ANCHOR | | | | ] -> [ OP_JPZ | OP_JPZ_1 | OP_JPZ_2 | | OP_DATA ]
    RIGHT [ OP_JPN NO ICON_ANCHOR | | | | ] -> [ OP_JPN | OP_JPN_1 | OP_JPN_2 | | OP_DATA ]

    ( Mark newly added opcodes that require parameters as empty )
    [ OP_DATA NO NUM ] -> [ OP_EMPTY OP_DATA ]

    ( Mark opcode parameter numbers )
    RIGHT [ OPS_JMP | | | NUM ] -> [ OPS_JMP | | | MARK_BLUE NUM ]
    RIGHT [ OPS_JMP | | | | NUM ] -> [ OPS_JMP | | | | MARK_BLUE NUM ]

    RIGHT [ OPS_MEM | | | NUM ] -> [ OPS_MEM | | | MARK_ORANGE NUM ]
    RIGHT [ OPS_MEM | | | | NUM ] -> [ OPS_MEM | | | | MARK_ORANGE NUM ]

    (( Run the opcode pointed at by the Program Counter ))
    ( IN )
    RIGHT ['][ @ S_PLAY ] [ # | OP_IN ] [ = | NO NUM ] -> ['][ @ S_IDLE ] [ # | OP_IN ] [ = | ] ( Can't IN with no numbers in input queue )

    RIGHT ['][ @ S_PLAY ] [ # | OP_IN ] [ ? NUM ] -> ['][ @ S_IDLE ] [ # | OP_IN ] [ ? NUM ] ( Can't IN while holding a number )

    RIGHT ['][ @ S_PLAY ] [ # | OP_IN ] [ = | SIGN NUM ] [ ? NO NUM ] -> ['][ @ S_PLAY ] [ # | OP_IN ] [ = | ] [ ? SIGN NUM ]

    ( OUT )
    RIGHT ['][ @ S_PLAY ] [ # | OP_OUT ] [ ? NO NUM ] -> ['][ @ S_IDLE ] [ # | OP_OUT ] [ ? ] ( Can't OUT without holding a number )

    RIGHT ['][ @ S_PLAY ] [ # | OP_OUT ] [ ? SIGN NUM ] [ ¥ ] -> ['][ @ S_PLAY ] [ # | OP_OUT ] [ ? ] [ ¥ SIGN NUM ]

    ( CPY )
    RIGHT ['][ @ S_PLAY ] [ # | OP_CPY | | | | N0 ] [ ¡ M0 NO NUM ] -> ['][ @ S_IDLE ] [ # | OP_CPY | | | | N0 ] [ ¡ M0 ] ( Can't CPY an empty memory slot )

    RIGHT ['][ @ S_PLAY ] [ # | OP_CPY | | | | N0 ] [ ? ] [ ¡ M0 SIGN NUM ] -> ['][ @ S_PLAY ] [ # | OP_CPY | | | | N0 ] [ ? SIGN NUM ] [ ¡ M0 SIGN NUM ]

    ( PST )
    RIGHT ['][ @ S_PLAY ] [ # | OP_PST | | | | N0 ] [ ? NO NUM ] -> ['][ @ S_IDLE ] [ # | OP_PST | | | | N0 ] [ ? ] ( Can't PST without holding a number )

    RIGHT ['][ @ S_PLAY ] [ # | OP_PST | | | | N0 ] [ ? SIGN NUM ] [ ¡ M0 ] -> ['][ @ S_PLAY ] [ # | OP_PST | | | | N0 ] [ ? ] [ ¡ M0 SIGN NUM ]

    ( JMP )
    RIGHT ['][ @ S_PLAY ] [ # | OP_JMP | | | | N0 ] [ | | | | | | ; | N0 ] -> ['][ @ S_PLAY_WAIT ] [ # | OP_JMP | | | | N0 ] [ ® | | | | | | ; | N0 ]
    RIGHT ['][ @ S_PLAY ] [ # | OP_JMP | | | | N1 ] [ | | | | | | ; | N1 ] -> ['][ @ S_PLAY_WAIT ] [ # | OP_JMP | | | | N1 ] [ ® | | | | | | ; | N1 ]
    RIGHT ['][ @ S_PLAY ] [ # | OP_JMP | | | | N2 ] [ | | | | | | ; | N2 ] -> ['][ @ S_PLAY_WAIT ] [ # | OP_JMP | | | | N2 ] [ ® | | | | | | ; | N2 ]
    RIGHT ['][ @ S_PLAY ] [ # | OP_JMP | | | | N3 ] [ | | | | | | ; | N3 ] -> ['][ @ S_PLAY_WAIT ] [ # | OP_JMP | | | | N3 ] [ ® | | | | | | ; | N3 ]
    RIGHT ['][ @ S_PLAY ] [ # | OP_JMP | | | | N4 ] [ | | | | | | ; | N4 ] -> ['][ @ S_PLAY_WAIT ] [ # | OP_JMP | | | | N4 ] [ ® | | | | | | ; | N4 ]
    RIGHT ['][ @ S_PLAY ] [ # | OP_JMP | | | | N5 ] [ | | | | | | ; | N5 ] -> ['][ @ S_PLAY_WAIT ] [ # | OP_JMP | | | | N5 ] [ ® | | | | | | ; | N5 ]
    RIGHT ['][ @ S_PLAY ] [ # | OP_JMP | | | | N6 ] [ | | | | | | ; | N6 ] -> ['][ @ S_PLAY_WAIT ] [ # | OP_JMP | | | | N6 ] [ ® | | | | | | ; | N6 ]
    RIGHT ['][ @ S_PLAY ] [ # | OP_JMP | | | | N7 ] [ | | | | | | ; | N7 ] -> ['][ @ S_PLAY_WAIT ] [ # | OP_JMP | | | | N7 ] [ ® | | | | | | ; | N7 ]
    RIGHT ['][ @ S_PLAY ] [ # | OP_JMP | | | | N8 ] [ | | | | | | ; | N8 ] -> ['][ @ S_PLAY_WAIT ] [ # | OP_JMP | | | | N8 ] [ ® | | | | | | ; | N8 ]
    RIGHT ['][ @ S_PLAY ] [ # | OP_JMP | | | | N9 ] [ | | | | | | ; | N9 ] -> ['][ @ S_PLAY_WAIT ] [ # | OP_JMP | | | | N9 ] [ ® | | | | | | ; | N9 ]

    (( Perform math operations ))
    (
    - We really don't want to have to implement every single combination of operands and signs...
    - It's really easy to implement math one step at a time, but the bigger the numbers, the more turns
    - it'd take to finish, and we want to do it in a *single turn*.
    - Thankfully, we can perform both ADD and SUB with addition by transforming the operands beforehand.
    -
    - ADD +A +B = C -> nothing
    - ADD +A -B = C -> nothing
    - ADD -A +B = C -> swap A and B
    - ADD -A -B = C -> ~A, ~B and ~C
    -
    - SUB +A +B = C -> ~B
    - SUB +A -B = C -> ~B, swap A and B
    - SUB -A +B = C -> ~A, ~B and ~C
    - SUB -A -B = C -> ~A and ~C
    )

    RIGHT [ + | + ] [ ß | ] [ - | POS M ] [ ä | SIGN OTHER_M ] -> [ + | POS M ] [ ß | SIGN OTHER_M ] [ - | ] [ ä | ] ( do nothing )
    RIGHT [ + | + ] [ ß | ] [ - | NEG M ] [ ä | POS OTHER_M ] -> [ + | POS OTHER_M ] [ ß | NEG M ] [ - | ] [ ä | ] ( swap A and B )
    RIGHT [ + | + ] [ ß | ] [ - | NEG M ] [ ä | NEG OTHER_M ] -> [ + | POS M ] [ ß | POS OTHER_M ] [ - | ] [ ä | - ] ( ~A, ~B and ~C )

    RIGHT [ + | - ] [ ß | ] [ - | POS M ] [ ä | POS OTHER_M ] -> [ + | POS M ] [ ß | NEG OTHER_M ] [ - | ] [ ä | ] ( ~B )
    RIGHT [ + | - ] [ ß | ] [ - | POS M ] [ ä | NEG OTHER_M ] -> [ + | POS OTHER_M ] [ ß | POS M ] [ - | ] [ ä | ] ( ~B, swap A and B )
    RIGHT [ + | - ] [ ß | ] [ - | NEG M ] [ ä | POS OTHER_M ] -> [ + | POS M ] [ ß | NEG OTHER_M ] [ - | ] [ ä | - ] ( ~A, ~B and ~C )
    RIGHT [ + | - ] [ ß | ] [ - | NEG M ] [ ä | NEG OTHER_M ] -> [ + | POS M ] [ ß | NEG OTHER_M ] [ - | ] [ ä | - ] ( ~A and ~C )

    ( Calculate )
    RIGHT [ + | SIGN M ] [ ß | M0 ] -> [ + | SIGN M ] [ ß | ]
    RIGHT [ + | M0 ] [ ß | SIGN M ] -> [ + | SIGN M ] [ ß | ]

    RIGHT [ + | POS M1 ] [ ß | POS M1 ] -> [ + | POS M2 ] [ ß | ]
    RIGHT [ + | POS M1 ] [ ß | POS M2 ] -> [ + | POS M3 ] [ ß | ]
    RIGHT [ + | POS M1 ] [ ß | POS M3 ] -> [ + | POS M4 ] [ ß | ]
    RIGHT [ + | POS M1 ] [ ß | POS M4 ] -> [ + | POS M5 ] [ ß | ]
    RIGHT [ + | POS M1 ] [ ß | POS M5 ] -> [ + | POS M6 ] [ ß | ]
    RIGHT [ + | POS M1 ] [ ß | POS M6 ] -> [ + | POS M7 ] [ ß | ]
    RIGHT [ + | POS M1 ] [ ß | POS M7 ] -> [ + | POS M8 ] [ ß | ]
    RIGHT [ + | POS M1 ] [ ß | POS M8 ] -> [ + | POS M9 ] [ ß | ]

    RIGHT [ + | POS M2 ] [ ß | POS M1 ] -> [ + | POS M3 ] [ ß | ]
    RIGHT [ + | POS M2 ] [ ß | POS M2 ] -> [ + | POS M4 ] [ ß | ]
    RIGHT [ + | POS M2 ] [ ß | POS M3 ] -> [ + | POS M5 ] [ ß | ]
    RIGHT [ + | POS M2 ] [ ß | POS M4 ] -> [ + | POS M6 ] [ ß | ]
    RIGHT [ + | POS M2 ] [ ß | POS M5 ] -> [ + | POS M7 ] [ ß | ]
    RIGHT [ + | POS M2 ] [ ß | POS M6 ] -> [ + | POS M8 ] [ ß | ]
    RIGHT [ + | POS M2 ] [ ß | POS M7 ] -> [ + | POS M9 ] [ ß | ]

    RIGHT [ + | POS M3 ] [ ß | POS M1 ] -> [ + | POS M4 ] [ ß | ]
    RIGHT [ + | POS M3 ] [ ß | POS M2 ] -> [ + | POS M5 ] [ ß | ]
    RIGHT [ + | POS M3 ] [ ß | POS M3 ] -> [ + | POS M6 ] [ ß | ]
    RIGHT [ + | POS M3 ] [ ß | POS M4 ] -> [ + | POS M7 ] [ ß | ]
    RIGHT [ + | POS M3 ] [ ß | POS M5 ] -> [ + | POS M8 ] [ ß | ]
    RIGHT [ + | POS M3 ] [ ß | POS M6 ] -> [ + | POS M9 ] [ ß | ]

    RIGHT [ + | POS M4 ] [ ß | POS M1 ] -> [ + | POS M5 ] [ ß | ]
    RIGHT [ + | POS M4 ] [ ß | POS M2 ] -> [ + | POS M6 ] [ ß | ]
    RIGHT [ + | POS M4 ] [ ß | POS M3 ] -> [ + | POS M7 ] [ ß | ]
    RIGHT [ + | POS M4 ] [ ß | POS M4 ] -> [ + | POS M8 ] [ ß | ]
    RIGHT [ + | POS M4 ] [ ß | POS M5 ] -> [ + | POS M9 ] [ ß | ]

    RIGHT [ + | POS M5 ] [ ß | POS M1 ] -> [ + | POS M6 ] [ ß | ]
    RIGHT [ + | POS M5 ] [ ß | POS M2 ] -> [ + | POS M7 ] [ ß | ]
    RIGHT [ + | POS M5 ] [ ß | POS M3 ] -> [ + | POS M8 ] [ ß | ]
    RIGHT [ + | POS M5 ] [ ß | POS M4 ] -> [ + | POS M9 ] [ ß | ]

    RIGHT [ + | POS M6 ] [ ß | POS M1 ] -> [ + | POS M7 ] [ ß | ]
    RIGHT [ + | POS M6 ] [ ß | POS M1 ] -> [ + | POS M8 ] [ ß | ]
    RIGHT [ + | POS M6 ] [ ß | POS M1 ] -> [ + | POS M9 ] [ ß | ]

    RIGHT [ + | POS M7 ] [ ß | POS M1 ] -> [ + | POS M8 ] [ ß | ]
    RIGHT [ + | POS M7 ] [ ß | POS M2 ] -> [ + | POS M9 ] [ ß | ]

    RIGHT [ + | POS M8 ] [ ß | POS M1 ] -> [ + | POS M9 ] [ ß | ]

    RIGHT [ + | POS M1 ] [ ß | NEG M1 ] -> [ + | POS M0 ] [ ß | ]
    RIGHT [ + | POS M1 ] [ ß | NEG M2 ] -> [ + | NEG M1 ] [ ß | ]
    RIGHT [ + | POS M1 ] [ ß | NEG M3 ] -> [ + | NEG M2 ] [ ß | ]
    RIGHT [ + | POS M1 ] [ ß | NEG M4 ] -> [ + | NEG M3 ] [ ß | ]
    RIGHT [ + | POS M1 ] [ ß | NEG M5 ] -> [ + | NEG M4 ] [ ß | ]
    RIGHT [ + | POS M1 ] [ ß | NEG M6 ] -> [ + | NEG M5 ] [ ß | ]
    RIGHT [ + | POS M1 ] [ ß | NEG M7 ] -> [ + | NEG M6 ] [ ß | ]
    RIGHT [ + | POS M1 ] [ ß | NEG M8 ] -> [ + | NEG M7 ] [ ß | ]
    RIGHT [ + | POS M1 ] [ ß | NEG M9 ] -> [ + | NEG M8 ] [ ß | ]

    RIGHT [ + | POS M2 ] [ ß | NEG M1 ] -> [ + | POS M1 ] [ ß | ]
    RIGHT [ + | POS M2 ] [ ß | NEG M2 ] -> [ + | POS M0 ] [ ß | ]
    RIGHT [ + | POS M2 ] [ ß | NEG M3 ] -> [ + | NEG M1 ] [ ß | ]
    RIGHT [ + | POS M2 ] [ ß | NEG M4 ] -> [ + | NEG M2 ] [ ß | ]
    RIGHT [ + | POS M2 ] [ ß | NEG M5 ] -> [ + | NEG M3 ] [ ß | ]
    RIGHT [ + | POS M2 ] [ ß | NEG M6 ] -> [ + | NEG M4 ] [ ß | ]
    RIGHT [ + | POS M2 ] [ ß | NEG M7 ] -> [ + | NEG M5 ] [ ß | ]
    RIGHT [ + | POS M2 ] [ ß | NEG M8 ] -> [ + | NEG M6 ] [ ß | ]
    RIGHT [ + | POS M2 ] [ ß | NEG M9 ] -> [ + | NEG M7 ] [ ß | ]

    RIGHT [ + | POS M3 ] [ ß | NEG M1 ] -> [ + | POS M2 ] [ ß | ]
    RIGHT [ + | POS M3 ] [ ß | NEG M2 ] -> [ + | POS M1 ] [ ß | ]
    RIGHT [ + | POS M3 ] [ ß | NEG M3 ] -> [ + | POS M0 ] [ ß | ]
    RIGHT [ + | POS M3 ] [ ß | NEG M4 ] -> [ + | NEG M1 ] [ ß | ]
    RIGHT [ + | POS M3 ] [ ß | NEG M5 ] -> [ + | NEG M2 ] [ ß | ]
    RIGHT [ + | POS M3 ] [ ß | NEG M6 ] -> [ + | NEG M3 ] [ ß | ]
    RIGHT [ + | POS M3 ] [ ß | NEG M7 ] -> [ + | NEG M4 ] [ ß | ]
    RIGHT [ + | POS M3 ] [ ß | NEG M8 ] -> [ + | NEG M5 ] [ ß | ]
    RIGHT [ + | POS M3 ] [ ß | NEG M9 ] -> [ + | NEG M6 ] [ ß | ]

    RIGHT [ + | POS M4 ] [ ß | NEG M1 ] -> [ + | POS M3 ] [ ß | ]
    RIGHT [ + | POS M4 ] [ ß | NEG M2 ] -> [ + | POS M2 ] [ ß | ]
    RIGHT [ + | POS M4 ] [ ß | NEG M3 ] -> [ + | POS M1 ] [ ß | ]
    RIGHT [ + | POS M4 ] [ ß | NEG M4 ] -> [ + | POS M0 ] [ ß | ]
    RIGHT [ + | POS M4 ] [ ß | NEG M5 ] -> [ + | NEG M1 ] [ ß | ]
    RIGHT [ + | POS M4 ] [ ß | NEG M6 ] -> [ + | NEG M2 ] [ ß | ]
    RIGHT [ + | POS M4 ] [ ß | NEG M7 ] -> [ + | NEG M3 ] [ ß | ]
    RIGHT [ + | POS M4 ] [ ß | NEG M8 ] -> [ + | NEG M4 ] [ ß | ]
    RIGHT [ + | POS M4 ] [ ß | NEG M9 ] -> [ + | NEG M5 ] [ ß | ]

    RIGHT [ + | POS M5 ] [ ß | NEG M1 ] -> [ + | POS M4 ] [ ß | ]
    RIGHT [ + | POS M5 ] [ ß | NEG M2 ] -> [ + | POS M3 ] [ ß | ]
    RIGHT [ + | POS M5 ] [ ß | NEG M3 ] -> [ + | POS M2 ] [ ß | ]
    RIGHT [ + | POS M5 ] [ ß | NEG M4 ] -> [ + | POS M1 ] [ ß | ]
    RIGHT [ + | POS M5 ] [ ß | NEG M5 ] -> [ + | POS M0 ] [ ß | ]
    RIGHT [ + | POS M5 ] [ ß | NEG M6 ] -> [ + | NEG M1 ] [ ß | ]
    RIGHT [ + | POS M5 ] [ ß | NEG M7 ] -> [ + | NEG M2 ] [ ß | ]
    RIGHT [ + | POS M5 ] [ ß | NEG M8 ] -> [ + | NEG M3 ] [ ß | ]
    RIGHT [ + | POS M5 ] [ ß | NEG M9 ] -> [ + | NEG M4 ] [ ß | ]

    RIGHT [ + | POS M6 ] [ ß | NEG M1 ] -> [ + | POS M5 ] [ ß | ]
    RIGHT [ + | POS M6 ] [ ß | NEG M2 ] -> [ + | POS M4 ] [ ß | ]
    RIGHT [ + | POS M6 ] [ ß | NEG M3 ] -> [ + | POS M3 ] [ ß | ]
    RIGHT [ + | POS M6 ] [ ß | NEG M4 ] -> [ + | POS M2 ] [ ß | ]
    RIGHT [ + | POS M6 ] [ ß | NEG M5 ] -> [ + | POS M1 ] [ ß | ]
    RIGHT [ + | POS M6 ] [ ß | NEG M6 ] -> [ + | POS M0 ] [ ß | ]
    RIGHT [ + | POS M6 ] [ ß | NEG M7 ] -> [ + | NEG M1 ] [ ß | ]
    RIGHT [ + | POS M6 ] [ ß | NEG M8 ] -> [ + | NEG M2 ] [ ß | ]
    RIGHT [ + | POS M6 ] [ ß | NEG M9 ] -> [ + | NEG M3 ] [ ß | ]

    RIGHT [ + | POS M7 ] [ ß | NEG M1 ] -> [ + | POS M6 ] [ ß | ]
    RIGHT [ + | POS M7 ] [ ß | NEG M2 ] -> [ + | POS M5 ] [ ß | ]
    RIGHT [ + | POS M7 ] [ ß | NEG M3 ] -> [ + | POS M4 ] [ ß | ]
    RIGHT [ + | POS M7 ] [ ß | NEG M4 ] -> [ + | POS M3 ] [ ß | ]
    RIGHT [ + | POS M7 ] [ ß | NEG M5 ] -> [ + | POS M2 ] [ ß | ]
    RIGHT [ + | POS M7 ] [ ß | NEG M6 ] -> [ + | POS M1 ] [ ß | ]
    RIGHT [ + | POS M7 ] [ ß | NEG M7 ] -> [ + | POS M0 ] [ ß | ]
    RIGHT [ + | POS M7 ] [ ß | NEG M8 ] -> [ + | NEG M1 ] [ ß | ]
    RIGHT [ + | POS M7 ] [ ß | NEG M9 ] -> [ + | NEG M2 ] [ ß | ]

    RIGHT [ + | POS M8 ] [ ß | NEG M1 ] -> [ + | POS M7 ] [ ß | ]
    RIGHT [ + | POS M8 ] [ ß | NEG M2 ] -> [ + | POS M6 ] [ ß | ]
    RIGHT [ + | POS M8 ] [ ß | NEG M3 ] -> [ + | POS M5 ] [ ß | ]
    RIGHT [ + | POS M8 ] [ ß | NEG M4 ] -> [ + | POS M4 ] [ ß | ]
    RIGHT [ + | POS M8 ] [ ß | NEG M5 ] -> [ + | POS M3 ] [ ß | ]
    RIGHT [ + | POS M8 ] [ ß | NEG M6 ] -> [ + | POS M2 ] [ ß | ]
    RIGHT [ + | POS M8 ] [ ß | NEG M7 ] -> [ + | POS M1 ] [ ß | ]
    RIGHT [ + | POS M8 ] [ ß | NEG M8 ] -> [ + | POS M0 ] [ ß | ]
    RIGHT [ + | POS M8 ] [ ß | NEG M9 ] -> [ + | NEG M1 ] [ ß | ]

    RIGHT [ + | POS M9 ] [ ß | NEG M1 ] -> [ + | POS M8 ] [ ß | ]
    RIGHT [ + | POS M9 ] [ ß | NEG M2 ] -> [ + | POS M7 ] [ ß | ]
    RIGHT [ + | POS M9 ] [ ß | NEG M3 ] -> [ + | POS M6 ] [ ß | ]
    RIGHT [ + | POS M9 ] [ ß | NEG M4 ] -> [ + | POS M5 ] [ ß | ]
    RIGHT [ + | POS M9 ] [ ß | NEG M5 ] -> [ + | POS M4 ] [ ß | ]
    RIGHT [ + | POS M9 ] [ ß | NEG M6 ] -> [ + | POS M3 ] [ ß | ]
    RIGHT [ + | POS M9 ] [ ß | NEG M7 ] -> [ + | POS M2 ] [ ß | ]
    RIGHT [ + | POS M9 ] [ ß | NEG M8 ] -> [ + | POS M1 ] [ ß | ]
    RIGHT [ + | POS M9 ] [ ß | NEG M9 ] -> [ + | POS M0 ] [ ß | ]

    ( Invert the result if necessary )
    RIGHT [ + | POS ] [ ä | - ] -> [ + | NEG ] [ ä | ]
    RIGHT [ + | NEG ] [ ä | - ] -> [ + | POS ] [ ä | ]

    ( Return the result )
    RIGHT [ + | SIGN M0 ] [ ? ] -> [ + | ] [ ? SIGN N0 ]
    RIGHT [ + | SIGN M1 ] [ ? ] -> [ + | ] [ ? SIGN N1 ]
    RIGHT [ + | SIGN M2 ] [ ? ] -> [ + | ] [ ? SIGN N2 ]
    RIGHT [ + | SIGN M3 ] [ ? ] -> [ + | ] [ ? SIGN N3 ]
    RIGHT [ + | SIGN M4 ] [ ? ] -> [ + | ] [ ? SIGN N4 ]
    RIGHT [ + | SIGN M5 ] [ ? ] -> [ + | ] [ ? SIGN N5 ]
    RIGHT [ + | SIGN M6 ] [ ? ] -> [ + | ] [ ? SIGN N6 ]
    RIGHT [ + | SIGN M7 ] [ ? ] -> [ + | ] [ ? SIGN N7 ]
    RIGHT [ + | SIGN M8 ] [ ? ] -> [ + | ] [ ? SIGN N8 ]
    RIGHT [ + | SIGN M9 ] [ ? ] -> [ + | ] [ ? SIGN N9 ]

    ( Move numbers in input queue up )
    UP [ BELT SIGN NUM | BELT_MID NO NUM ] -> [ BELT | BELT_MID SIGN NUM ]

    ( Move numbers in output queue down when necessary )
    [ ¥ SIGN N0 ] -> [ ¥ SIGN O0 ]
    [ ¥ SIGN N1 ] -> [ ¥ SIGN O1 ]
    [ ¥ SIGN N2 ] -> [ ¥ SIGN O2 ]
    [ ¥ SIGN N3 ] -> [ ¥ SIGN O3 ]
    [ ¥ SIGN N4 ] -> [ ¥ SIGN O4 ]
    [ ¥ SIGN N5 ] -> [ ¥ SIGN O5 ]
    [ ¥ SIGN N6 ] -> [ ¥ SIGN O6 ]
    [ ¥ SIGN N7 ] -> [ ¥ SIGN O7 ]
    [ ¥ SIGN N8 ] -> [ ¥ SIGN O8 ]
    [ ¥ SIGN N9 ] -> [ ¥ SIGN O9 ]

    DOWN [ ¥ SIGN O ] -> [ ¥ DOWN SIGN DOWN O ]

    DOWN [ DOWN SIGN DOWN O | SIGN O ] -> [ DOWN SIGN DOWN O | DOWN SIGN DOWN O ]

    ( Increment/decrement the current number of code lines )
    [ INC | M9 ] -> [ | MX ]
    [ INC | M8 ] -> [ | M9 ]
    [ INC | M7 ] -> [ | M8 ]
    [ INC | M6 ] -> [ | M7 ]
    [ INC | M5 ] -> [ | M6 ]
    [ INC | M4 ] -> [ | M5 ]
    [ INC | M3 ] -> [ | M4 ]
    [ INC | M2 ] -> [ | M3 ]
    [ INC | M1 ] -> [ | M2 ]
    [ INC | M0 ] -> [ | M1 ]

    [ DEC | M1 ] -> [ | M0 ]
    [ DEC | M2 ] -> [ | M1 ]
    [ DEC | M3 ] -> [ | M2 ]
    [ DEC | M4 ] -> [ | M3 ]
    [ DEC | M5 ] -> [ | M4 ]
    [ DEC | M6 ] -> [ | M5 ]
    [ DEC | M7 ] -> [ | M6 ]
    [ DEC | M8 ] -> [ | M7 ]
    [ DEC | M9 ] -> [ | M8 ]
    [ DEC | MX ] -> [ | M9 ]

    ( Check for win conditions )
    ( DOWN [ N0 | ¥ | O2 | O8 | O7 | O6 | O2 | O6 ] -> [ FINISHED | | | | | | | ] )

    ==============
    WINCONDITIONS
    ==============
    SOME FINISHED

    =======
    LEVELS
    =======
    ¶...........*×××××;0.+..
    %............×××××;1.ß..
    .............×××××;2....
    .....?.......×××××;3.-..
    .........0...×××××;4.ä..
    .,.......¥...×××××;5....
    =2...........×××××;6....
    .6.01234.....×××××;7....
    .7.\\\\\.....×××××;8....
    .6...........×××××;9....
    .2.56789...._...........
    .8.\\\\\.....çøøøø......
    ............¿øøøøø......
    ............åøøóøø......
    .$.......,..............
    }0..²...................

    ( @"......#A....;0.+....... )
    ( %?.......D..00;1......... )
    ( .........A....;2......... )
    ( .........B....;3.-....... )
    ( ...01234.C..00;4......... )
    ( .,.\\\\\.B....;5......... )
    ( =........I..00;6.²0...... )
    ( ...56789......;7......... )
    ( ...\\\\\......;8......... )
    ( ..............;9......... )
    ( ........_................ )
    ( ......................... )
    ( .$.......¤............... )
    ( %267628.................. )
    ( ......................... )
    ( {......................}0 )