(- - 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 - [ ] Make cursor larger when hovering an opcode - [ ] 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 )