100 REM ***WATCHPERSON*** 110 REM 120 REM (C) MAC OGLESBY MARCH 1980 130 REM 140 REM LAST REVISED: 2021-11-02 150 REM 160 REM COPYRIGHT 1980 BY MAC OGLESBY 170 REM 175 REM Spectrum port by John Elliott 180 REM 1000 REM INITIALIZATION 1010 BORDER 0: PAPER 0: INK 6: BRIGHT 1: CLS 1012 REM S$ HOLDS THE PET 40x22 SCREEN, OF WHICH WE DISPLAY A 32x22 WINDOW 1015 DIM S$(880) 1020 DIM C(25) 1021 DIM D(25) 1022 DIM L(25) 1023 DIM V$(4,8) 1030 LET V$(1)="Ogleboro" 1040 LET V$(2)="Kunktown" 1050 LET V$(3)="Lindburg" 1060 DIM A(4) 1061 DIM A$(4,3) 1062 LET A(1)=-40 1063 LET A(2)=1 1064 LET A(3)=40 1065 LET A(4)=-1 1070 LET A$(1)=" N " 1071 LET A$(2)=" E " 1072 LET A$(3)=" S " 1073 LET A$(4)=" W " 1120 LET S$=" " 1130 LET P$=" " 1140 LET Q$="\A\A\A\A\A\A\A\A\A\A\A\A\A\A\A\A\A\A\A\A\A\A\A\A\A\A\A\A\A\A\A\A" 1145 REM 1160 LET VN=1 1161 GOSUB 8000 1170 PRINT AT 19,0; INK 4; "Welcome, Watchperson..." 1180 LET X$="Want instructions? Yes or No" 1190 GOSUB 9505 1195 LET N$=Y$ 1200 CLS 1201 REM 1...5...10...15...20...25...30.. 1210 PRINT INK 7;"As watchperson, you have been" 1215 PRINT INK 7;"hired to walk all the streets of" 1220 PRINT INK 7;"a village without retracing any" 1230 PRINT INK 7;"of your steps." 1235 PRINT 1240 PRINT INK 7;"Choose a village: ";INK 4;"O";INK 7;"gleboro," 1245 PRINT INK 4;"K"; INK 7;"unktown, or ";INK 4; "L"; INK 7; "indburg." 1250 PRINT INK 7;"Lindburg is the hardest." 1260 LET X$="Please type O, K, or L" 1270 GOSUB 9505 1280 IF Y$="O" OR Y$="K" OR Y$="L" THEN GOTO 1290 1285 GOTO 1270 1290 LET VN=1*(Y$="O")+2*(Y$="K")+3*(Y$="L") 1300 IF N$="N" THEN GOTO 1470 1305 LET B$="Footprints" 1306 CLS 1310 PRINT AT 4,20; 1315 FOR J=1 TO LEN B$ 1316 PRINT B$(J); 1317 PAUSE 2 1318 NEXT J 1320 PRINT AT 6,18; INK 5; "\E" 1340 FOR J=1 TO 12 1341 PRINT AT 6,18-J; INK 5; "\E" 1342 PAUSE 2 1343 NEXT J 1350 FOR J=1 TO 4 1351 PRINT AT 6-J,6; INK 5; "\B" 1352 PAUSE 2 1353 NEXT J 1360 FOR J=1 TO 9 1361 PRINT AT 2,6+J; INK 5; "\C" 1362 PAUSE 2 1363 NEXT J 1370 FOR J=1 TO 6 1371 PRINT AT 2+J,15; INK 5; "\D" 1372 PAUSE 2 1373 NEXT J 1380 FOR J=1 TO 12 1381 PRINT AT 8,15-J; INK 5; "\E" 1382 PAUSE 2 1383 NEXT J 1390 FOR J=13 TO 15 1391 PRINT AT 8,15-J; INK 5; "." 1392 PAUSE 2 1393 NEXT J 1400 PAUSE 16 1405 PRINT AT 10,0;INK 7;"Although you may ";INK 2; "not"; INK 7; " walk twice" 1406 PRINT AT 11,0;INK 7;"on ";INK 2;"any "; INK 7; "street, you may revisit" 1407 PRINT AT 12,0;INK 7;"corners." 1410 PRINT AT 14,0;INK 7;"Remember, your task is to walk" 1420 PRINT AT 15,0;INK 7;"along "; INK 2; "all"; INK 7; " of the streets." 1430 PRINT AT 17,0;INK 4;"Good luck!" 1450 LET X$="Press ENTER to start..." 1460 GOSUB 9505 1470 GOSUB 8000 1480 LET Z0=0 1485 LET S=0 1490 FOR J=1 TO NC 1491 LET U=C(J) 1492 LET U$=CHR$(J + CODE("A")-1) 1493 GOSUB 6000 1494 NEXT J 1500 PRINT AT 20,0;P$(TO 32);AT 20,0; INK 4; "Start where?" 1510 LET X$="Pick one of the letters shown" 1520 GOSUB 9505 1530 IF CODE Y$>=CODE "A" AND CODE Y$ < CODE "A"+NC THEN GOTO 1550 1540 GOTO 1520 1550 LET Z0=C(CODE Y$ - CODE "A" + 1) 1560 LET X$="Type X to cancel starting point" 1600 LET B$="" 1610 FOR J=1 TO 4 1620 IF S$(Z0+A(J))=" " THEN LET B$=B$+A$(J) 1630 NEXT J 1700 PRINT AT 20,0;INK 7;"Walk which way? ";B$, 1710 GOSUB 9505 1715 PRINT AT 20,0;S$(765 TO 797) 1720 IF S>0 THEN GOTO 1740 1730 IF Y$="X" THEN GOTO 1480 1740 IF Y$="N" THEN LET D=-40: GOSUB 6200 1750 IF Y$="E" THEN LET D=1: GOSUB 6200 1760 IF Y$="S" THEN LET D=40: GOSUB 6200 1770 IF Y$="W" THEN LET D=-1: GOSUB 6200 1780 IF S$(Z0+D)<>" " THEN GOTO 1700 1790 IF S>0 THEN GOTO 1825 1800 FOR J=1 TO NC 1801 LET U$=" " 1802 LET U=C(J) 1803 GOSUB 6000 1804 NEXT J 1810 LET X$=" " 1830 LET S=S+1 1835 LET U=Z0 1836 LET U$=Z$ 1837 GOSUB 6000 1840 LET CR=0 1850 LET Z0=Z0+D 1851 LET U=Z0 1852 LET U$=Z$ 1853 GOSUB 6000 1855 LET S=S+1 1860 FOR J=1 TO 4 1865 REM PRINT AT 19,0;S$(Z0+A(J));" CR=";CR;" " 1870 IF S$(Z0+A(J))<>" " THEN GOTO 1880 1871 LET CR=CR+1 1872 LET D1=A(J) 1880 NEXT J 1890 IF CR=0 THEN GOTO 1960 1900 IF CR=1 OR CR=11 THEN GOTO 1975 1910 IF CR=10 THEN GOTO 2000 1920 IF CR<5 OR CR=12 THEN GOTO 1973 1930 LET CC=CODE(S$(Z0+D)) 1960 IF CC >= 145 AND CC <= 148 THEN GOTO 1971 1970 GOTO 2000 1971 LET CR=10 1972 GOTO 1850 1973 LET D=0 1974 GOTO 1600 1975 LET D=D1: GOSUB 6200 1976 GOTO 1840 2000 REM END OF GAME CELEBRATION 2050 LET B$="You were supposed to walk every street!" 2052 IF S<>TS THEN GOTO 2110 2100 LET B$="Excellent You walked every street!" 2200 FOR J=1 TO 7 2210 PRINT AT 19,0;INK J; B$ 2220 PAUSE 5 2250 NEXT J 2300 LET X$="Press Y to play again; N to stop" 2310 GOSUB 9505 2320 IF Y$="Y" THEN RUN 2325 PRINT AT 19,0;S$(725 TO 757) 2330 PRINT AT 20,0;"Thanks for walking my streets." 2340 PRINT AT 21,0;" Bye for now, Watchperson..." 2350 STOP 6000 REM UPDATE S$ AND REPAINT THE CORRESPONDING SCREEN CELL 6005 LET S$(U)=U$ 6010 LET R=INT(U/40) 6020 LET C=U-(40*R) 6025 LET CC=CODE U$ 6030 PRINT AT R+1,C-5; 6035 IF CC >= 145 AND CC <= 148 THEN PRINT INK 5; U$: RETURN 6036 PRINT U$ 6040 RETURN 6200 REM SELECT FOOTPRINT DIRECTION GRAPHIC FROM D 6210 IF D=-40 THEN LET Z$="\B": RETURN 6220 IF D=1 THEN LET Z$="\C": RETURN 6230 IF D=40 THEN LET Z$="\D": RETURN 6240 IF D=-1 THEN LET Z$="\E": RETURN 6250 RETURN 8000 REM READ VILLAGE DATA AND DRAW IT 8001 RESTORE 8000 8002 FOR Z=0 TO 39: READ D: POKE USR "A"+Z,D: NEXT Z 8003 DATA 85,170, 85,170,85,170, 85,170: REM 50% grey 8004 DATA 0,102,102, 96, 0,102,102, 6: REM footsteps N 8005 DATA 0,110,110, 0, 0,230,230, 0: REM footsteps E 8006 DATA 96,102,102, 0, 6,102,102, 0: REM footsteps S 8007 DATA 0,103,103, 0, 0,118,118, 0: REM footsteps W 8009 CLS 8010 GOSUB 9000 + 100 * VN 8200 FOR Z=0 TO 21 8201 LET S$(Z*40+1 TO Z*40+40)=P$ 8202 NEXT Z 8203 LET X=(40-LH)/2 8204 FOR Z=0 TO WH 8205 LET S$(Z*40 + X+1 TO Z*40+X+1+LH) = Q$( TO LH) 8206 NEXT Z 8230 LET PX=SD 8240 LET S$(SD)=" " 8250 FOR I=1 TO NS 8260 FOR J=1 TO L(I) 8270 LET PX=PX+D(I) 8275 LET S$(PX)=" " 8280 NEXT J 8290 NEXT I 8300 FOR J=1 TO NC 8301 LET S$(C(J)) = CHR$(J + CODE("A")-1) 8302 NEXT J 8310 LET S$(5 TO 7) = " N " 8320 LET S$(45 TO 47)= "W+E" 8330 LET S$(85 TO 87)= " S " 8390 FOR Z=1 TO 21 8391 PRINT AT Z,0;S$(Z*40-35 TO Z*40-4); 8392 NEXT Z 8394 PRINT AT 0,X;"Map of "; V$(VN) 8400 RETURN 9100 REM DATA FOR VILLAGES 9101 REM OGLEBORO 9110 LET LH=22 9115 LET WH=17 9120 LET NC=14 9125 LET TS=120 9130 LET C(1)=56 9131 LET C(2)=65 9132 LET C(3)=171 9133 LET C(4)=176 9134 LET C(5)=185 9135 LET C(6)=190 9136 LET C(7)=336 9137 LET C(8)=345 9138 LET C(9)=350 9139 LET C(10)=496 9140 LET C(11)=505 9141 LET C(12)=510 9142 LET C(13)=611 9143 LET C(14)=625 9149 LET NS=14 9150 LET D(1)=1 9151 LET L(1)=19 9152 LET D(2)=40 9153 LET L(2)=8 9154 LET D(3)=-1 9155 LET L(3)=5 9156 LET D(4)=40 9157 LET L(4)=3 9158 LET D(5)=-1 9159 LET L(5)=14 9160 LET D(6)=-40 9161 LET L(6)=11 9162 LET D(7)=1 9163 LET L(7)=5 9164 LET D(8)=40 9165 LET L(8)=8 9166 LET D(9)=1 9167 LET L(9)=14 9168 LET D(10)=-40 9169 LET L(10)=4 9170 LET D(11)=-1 9171 LET L(11)=14 9172 LET D(12)=-40 9173 LET L(12)=7 9174 LET D(13)=1 9175 LET L(13)=9 9176 LET D(14)=40 9177 LET L(14)=10 9198 LET SD=171 9199 RETURN 9200 REM KUNKTOWN 9210 LET LH=24 9215 LET WH=19 9220 LET NC=19 9225 LET TS=157 9230 LET C(1)=54 9231 LET C(2)=63 9232 LET C(3)=67 9233 LET C(4)=170 9234 LET C(5)=174 9235 LET C(6)=183 9236 LET C(7)=187 9237 LET C(8)=191 9238 LET C(9)=334 9239 LET C(10)=343 9240 LET C(11)=347 9241 LET C(12)=454 9242 LET C(13)=463 9243 LET C(14)=467 9244 LET C(15)=570 9245 LET C(16)=574 9246 LET C(17)=583 9247 LET C(18)=694 9248 LET C(19)=711 9249 LET NS=14 9250 LET D(1)=1 9251 LET L(1)=21 9252 LET D(2)=40 9253 LET L(2)=13 9254 LET D(3)=-1 9255 LET L(3)=17 9256 LET D(4)=-40 9257 LET L(4)=6 9258 LET D(5)=1 9259 LET L(5)=13 9260 LET D(6)=-40 9261 LET L(6)=10 9262 LET D(7)=-1 9263 LET L(7)=13 9264 LET D(8)=40 9265 LET L(8)=7 9266 LET D(9)=1 9267 LET L(9)=13 9268 LET D(10)=-40 9269 LET L(10)=7 9270 LET D(11)=-1 9271 LET L(11)=4 9272 LET D(12)=40 9273 LET L(12)=13 9274 LET D(13)=-1 9275 LET L(13)=13 9276 LET D(14)=-40 9277 LET L(14)=10 9298 LET SD=170 9299 RETURN 9300 REM LINDBURG 9310 LET LH=28 9315 LET WH=20 9320 LET NC=25 9325 LET TS=195 9330 LET C(1)=56 9331 LET C(2)=65 9332 LET C(3)=69 9333 LET C(4)=73 9334 LET C(5)=172 9335 LET C(6)=176 9336 LET C(7)=185 9337 LET C(8)=189 9338 LET C(9)=328 9339 LET C(10)=332 9340 LET C(11)=336 9341 LET C(12)=345 9342 LET C(13)=349 9343 LET C(14)=492 9344 LET C(15)=496 9345 LET C(16)=505 9346 LET C(17)=509 9347 LET C(18)=612 9348 LET C(19)=616 9349 LET C(20)=625 9350 LET C(21)=629 9351 LET C(22)=728 9352 LET C(23)=732 9353 LET C(24)=736 9354 LET C(25)=753 9355 LET NS=20 9356 LET D(1)=1 9357 LET L(1)=21 9358 LET D(2)=40 9359 LET L(2)=7 9360 LET D(3)=-1 9361 LET L(3)=17 9362 LET D(4)=40 9363 LET L(4)=3 9364 LET D(5)=-1 9365 LET L(5)=4 9366 LET D(6)=-40 9367 LET L(6)=10 9368 LET D(7)=1 9369 LET L(7)=4 9370 LET D(8)=40 9371 LET L(8)=4 9372 LET D(9)=1 9373 LET L(9)=17 9374 LET D(10)=40 9375 LET L(10)=3 9376 LET D(11)=-1 9377 LET L(11)=4 9378 LET D(12)=-40 9379 LET L(12)=14 9380 LET D(13)=-1 9381 LET L(13)=9 9382 LET D(14)=40 9383 LET L(14)=17 9384 LET D(15)=1 9385 LET L(15)=17 9386 LET D(16)=-40 9387 LET L(16)=17 9388 LET D(17)=-1 9389 LET L(17)=4 9390 LET D(18)=40 9391 LET L(18)=3 9392 LET D(19)=-1 9393 LET L(19)=17 9394 LET D(20)=40 9395 LET L(20)=4 9398 LET SD=328 9399 RETURN 9500 REM GET A CHARACTER 9506 LET Y$=INKEY$ 9507 IF Y$<>"" THEN GOTO 9506 9510 PRINT AT 21,0; INK 7; FLASH 1; X$ 9512 LET ZT=105 9540 LET Y$=INKEY$ 9550 IF Y$="" THEN GOTO 9540 9570 PRINT AT 21,0;P$(TO 32) 9574 LET YC = CODE Y$ 9575 IF YC >= 97 AND YC <= 122 THEN LET Y$=CHR$(YC-32) 9580 RETURN