REM Subroutines:
REM Line 50 -> WANT INSTRUCTIONS? (Y/N)
REM Line 100 -> PRINT INSTRUCTIONS
REM Line 200 -> SET UP GAME
REM Line 220 -> INIT PLAYFIELD
REM Line 500 -> PRINT MAZE PATTERN
REM Line 600 -> MAKE MOVE
REM Line 800 -> RESULT CALCULATION
REM Line 1400 -> PLAYER QUIT (Pressed 0)
REM Line 1500 -> PLAYER HIT FENCE
REM Line 1600 -> ROBOT HIT PLAYER
REM Line 1700 -> PLAYER WIN, NEW GAME?
REM Line 2000 -> END.

10 REM CHASE AS MODIFIED TO RUN ON SWTP 6800
20 REM WITH 4K BASIC BY HERMAN DEMONSTOY 10-16-76

  REM Comments by ~vidak, 2021-08-20

49 REM DOES USER WANT INSTRUCTIONS?

50 PRINT "THIS IS THE GAME OF CHASE"
60 PRINT "WANT INSTRUCTIONS (1=YES. 0=NO)";
70 INPUT Y
80 IF Y = 0 GOTO 200 REM Go to set up game.
90 IF Y <> 1 GOTO 60 REM Repeat request for instructions.

99 REM If Y = 1, fall through to here.

100 PRINT "YOU ARE IN A HIGH VOLTAGE MAZE WITH 5"
110 PRINT "SECURITY MACHINES '+' TRYING TO DESTROY YOU"
120 PRINT "YOU MUST MANEUVER THE SECURITY MACHINES INTO"
130 PRINT "THE MAZE 'X' TO SURVIVE. GOOD LUCK"
140 PRINT "MOVES ARE: 7,8,9"
150 PRINT "           4,*,6  '5' IS NO MOVE"
160 PRINT "           1,2,3  '0' TO END THE GAME"
170 PRINT

199 REM SET UP GAME.

200 DIM A(10,20), E(21), F(21)

   REM ** A is array of playfield state symbols       **
   REM ** B is temp integer for object y values       **
   REM ** C is temp integer for object x values       **
   REM ** D is temp integer for looping               **
   REM ** E is array of y coords of playfield objects **
   REM ** F is array of x coords of playfield objects **
   REM ** G is integer which counts dead robots       **

210 G=0

   REM Below, we initialise the playfield.

220 FOR B = 1 TO 10
230     FOR C = 1 TO 20
240     LET A(B,C) = 0 REM Make every playfield space blank.
250     IF B = 1 THEN A(B,C) = 1 REM Top border is all fences.
260     IF B = 10 THEN A(B,C) = 1 REM Bottom border is all fences.
270     IF C = 1 THEN A(B,C) = 1 REM Left border, all fences.
280     IF C = 20 THEN A(B,C) = 1 REM Right border, all fences.
290 NEXT C
300 NEXT B

310 FOR D = 1 TO 21 REM A list: 5 robots, 1 player, 15 electric fences

       REM RNG 20 times.

320     LET B = INT(RND(0) * 8) + 2 REM I assume, here, RNG between 2 and 10.
330     LET C = INT(RND(0) * 18) + 2 REM Again, RNG between 2 and 20.

       REM ** The above statements work like this:
       REM ** INT(RND(0) * X ) + Y -> generate some random integer between [Y, X + 1)
       REM **                      -> where the integer is equivalent to [Y, X]
       REM **                      -> Note about notation: [, or ] stand for inclusive
       REM **                      ->                      (, or ) stand for exclusive

340     IF A(B,C) <> 0 GOTO 320 REM IF ARRAY IS MAZE BORDER, RNG AGAIN
350     A(B,C) = 1 REM OTHERWISE ARRAY ELEMENT IS ELECTRIC FENCE
360     IF D < 6 THEN A(B,C) = 2 REM FIRST 5 TIMES THROUGH D, ARRAY ELEMENT IS ROBOT
370     IF D = 6 THEN A(B,C) = 3 REM OTHERWISE ASSIGN ELEMENT AS PLAYER
380     E(D) = B REM STORE PLAYFIELD OBJECT Y VALUE
390     F(D) = C REM STORE PLAYFIELD OBJECT X VALUE
400 NEXT D

499 REM PRINT MAZE PATTERN
500 FOR B = 1 TO 10
510     FOR C = 1 TO 20
520     IF A(B,C) = 0 PRINT " "; REM SEMICOLON INDICATES PRINT WITHOUT NEW LINE
530     IF A(B,C) = 1 PRINT "X";
540     IF A(B,C) = 2 PRINT "+";
550     IF A(B,C) = 3 PRINT "*";
560     NEXT C
570     PRINT REM NEW LINE
580 NEXT B

599 REM MAKE MOVE
600 B = E(6) REM I ASSUME: PUT (PLAYER Y VALUE) E(6) IN B.
610 C = F(6) REM I ASSUME: PUT (PLAYER X VALUE) F(6) IN C.

620 A(B,C) = 0 REM SET PLAYER PLAYFIELD ARRAY ELEMENT TO A BLANK.

630 INPUT Y REM HERE WE ASK THE USER TO INPUT A MOVEMENT COMMAND

640 IF Y = 5 GOTO 800 REM NO MOVEMENT; SKIP TO RESULTS CALCULATION
645 IF Y = 0 THEN GOTO 1400 REM QUIT GAME; *ON* STATEMENT DOES NOT INDEX FROM ZERO. (:
   REM ** OLD CODE **
   REM
   REM 650 ON Y GOTO 660, 660, 660, 690, 680, 680, 680, 690, 1400

   REM ** ORIGINAL LINE 650 KEYMAP **
   REM ON OLD Y ->   0    1,   2,   3,   4,   5,   6,   7,   8,    9.
   REM ON NEW Y ->   5,   7,   8,   9,   6,   3,   2,   1,   4,    0.
   REM GOTO     -> N/A, 660, 660, 660, 690, 680, 680, 680, 690, 1400.

   REM ** NEW LINE 650 KEYMAP REORGANISED **
   REM NEW Y ->    0,   1,   2,   3,   4,   5,   6,   7,   8,   9.
   REM GOTO  -> 1400, 680, 680, 680, 690, N/A, 690, 660, 660, 660.

   REM ** OLD CODE **
   REM
   REM 690 ON Y GOTO 700, 800, 720, 720, 720, 800, 700, 700

   REM ** ORIGINAL LINE 690 KEYMAP **
   REM ON OLD Y ->   0,   1,   2,   3,   4,   5,   6,   7,   8,         9.
   REM GOTO     -> N/A, 700, 800, 720, 720, 720, 800, 700, 700, FALL-THRU.
   REM ON NEW Y ->   5,   7,   8,   9,   6,   3,   2,   1,   4,         0.

   REM ** NEW LINE 650 KEYMAP REORGANISED **
   REM NEW Y ->         0,   1,   2,   3,   4,   5,   6,   7,   8,   9.
   REM GOTO  -> FALL-THRU, 700, 800, 720, 700, N/A, 720, 700, 800, 720.

   REM KEYPAD:
   REM 7,8,9
   REM 4,*,6
   REM 1,2,3

650 ON Y GOTO 680, 680, 680, 690, 800, 690, 660, 660, 660 REM NOTE: Y VALUE OF 5 REPEATED.


   REM Y VALUES {7, 8, 9} PASS TO HERE (LINE 660)

660 B = B - 1 REM SUBTRACT 1 FROM PLAYER Y COORDS (UP 1 ROW)
670 GOTO 690

   REM NEW Y VALUES {1, 2, 3} PASS HERE (LINE 680)

680 B = B + 1 REM ADD 1 TO PLAYER X COORDS (DOWN 1 ROW)

   REM Y VALUES {4, 6} AND {7, 8, 9} PASS HERE
   REM Y VALUES {1, 2, 3} FALL-THRU HERE. (...LINE 690)

690 ON Y GOTO 700, 700, 720, 720, 800, 720, 700, 800, 720 REM NOTE: Y VALUE OF 5 REPEATED.

   REM Y VALUES {1, 4, 7} PASS HERE (700)

700 C = C - 1 REM SUBTRACT 1 FROM PLAYER X COORDS (LEFT 1 COLUMN)

710 GOTO 800 REM CHECK IF PLAYER HAS TOUCHED FENCE

   REM Y VALUES {3, 6, 9} PASS HERE.

720 C = C + 1 REM ADD 1 TO PLAYER X COORDS (RIGHT 1 COLUMN)

799 REM RESULT CALCULATION

   REM Y VALUES {2, 8} PASSES HERE. (SKIP X COORD MANIPULATION)

800 IF A(B,C) = 1 GOTO 1500 REM Player has touched fence
810 IF A(B,C) = 2 GOTO 1600 REM Player has touched security machine robot.

   REM SET PLAYFIELD CELL BACK TO PLAYER.

820 A(B,C) = 3

   REM SET NEW PLAYER X AND Y COORDS

830 E(6) = B REM NEW Y COORDS
840 F(6) = C REM NEW X COORDS
850 FOR D = 1 TO 5

       REM Below, if any of these cells indicated by the first
       REM 5 in the E,F lists is not a robot, then next D.

860     IF A(E(D),F(D)) <> 2 GOTO 960
870     A(E(D),F(D)) = 0 REM Set robot in playfield state array to a blank.

       REM Below, we make robot x,y coords one unit closer to player.

880     IF E(D) < B THEN E(D) = E(D) + 1
890     IF E(D) > B THEN E(D) = E(D) - 1
900     IF F(D) < C THEN F(D) = F(D) + 1
910     IF F(D) > C THEN F(D) = F(D) - 1

       REM Below, we test to see if new robot coords coincide
       REM with player coords. if so, then player destroyed.

920     IF A(E(D),F(D)) = 3 GOTO 1600

       REM Below, if new robot coords do not coincide with a space,
       REM then it has hit an electric fence. Increment robot dead
       REM counter (G) by 1.

930     IF A(E(D),F(D)) <> 0 THEN G = G + 1

       REM BELOW, IF NEW ROBOT COORDS ARE A BLANK, THEN SET THAT PLAYFIELD
       REM ARRAY ELEMENT TO A ROBOT.

940     IF A(E(D),F(D)) = 0 THEN A(E(D),F(D)) = 2

       REM Below (line 950), if G, the robot dead counter, equals 5, then
       REM player has won, enter new game state.

950     IF G = 5 GOTO 1700
960 NEXT D

   REM Here we are falling through from subroutine RESULT CALULATION.
   REM In this game, the maze is not automatically printed.
   REM It is only printed if the player says yes (1).

970 PRINT "WANT MAP? (1 OR 0)";
980 INPUT Y
990 IF Y = 1 GOTO 500 REM Jump back to PRINT MAZE PATTERN.
995 GOTO 600 REM Else, jump back to MAKE MOVE.

   REM From subroutine MAKE MOVE: Player has pressed 0,
   REM the input for quitting the game.

1400 PRINT "SORRY TO SEE YOU QUIT"
    GOTO 1710

    REM From subroutine RESULT CALCULATION.
    REM Player has walked into a fence.

1500 PRINT "YOU TOUCHED THE FENCE!"
    GOTO 1710

    REM From subroutine RESULT CALCULATION.
    REM Robot has walked into a player.

1600 PRINT "** YOU HAVE BEEN DESTROYED BY A LUCKY COMPUTER **"
    GOTO 1710

    REM From subroutine RESULT CALCULATION.
    REM Game win state.
    REM Player has destroyed all the robots.

1700 PRINT "YOU ARE LUCKY ** YOU DESTROYED ALL THE ENEMIES **"
1710 PRINT "WANT TO PLAY AGAIN? (1 = YES, 0 = NO)";
1720 INPUT Y
1730 IF Y = 1 GOTO 210
1740 PRINT "HOPE YOU DON'T FEEL FENCED IN."
1750 PRINT "TRY AGAIN SOMETIME!"

2000 END