00010 REM CLASSIC SOKOBAN FOR MICROBEE 00020 REM MAP CODES 0 FLOOR 1 WALL 2 BOX 3 GOAL 4 BOX ON GOAL 5 PLAYER 6 PLAYER ON GOAL 00030 CLS 00040 DIM M(10,10) 00045 GOSUB 4000 00050 L=1 00060 GOSUB 1000 00070 GOSUB 2000 00080 REM MAIN LOOP 00090 K1$=KEY$ 00100 IF K1$="" THEN 90 00110 D=0:E=0 00120 IF K1$="W" OR K1$="w" THEN LET E=-1 00130 IF K1$="S" OR K1$="s" THEN LET E=1 00140 IF K1$="A" OR K1$="a" THEN LET D=-1 00150 IF K1$="D" OR K1$="d" THEN LET D=1 00160 IF K1$="R" OR K1$="r" THEN GOSUB 1000:GOSUB 2000:GOTO 90 00170 IF D=0 AND E=0 THEN 90 00180 P=X+D:Q=Y+E 00190 IF Q<1 OR Q>H OR P<1 OR P>W THEN 90 00200 C=M(Q,P) 00210 IF C=1 THEN 90 00215 F=0 00220 IF C<>2 AND C<>4 THEN 260 00225 F=1 00230 A=P+D:B=Q+E 00240 IF B<1 OR B>H OR A<1 OR A>W THEN 90 00250 GOSUB 500 00255 IF O=1 THEN 90 00260 IF M(Y,X)=6 THEN LET M(Y,X)=3 ELSE LET M(Y,X)=0 00270 IF M(Q,P)=3 OR M(Q,P)=4 THEN LET M(Q,P)=6 ELSE LET M(Q,P)=5 00272 REM REDRAW ONLY THE CHANGED TILES 00274 I=Y:J=X:GOSUB 2600 00276 I=Q:J=P:GOSUB 2600 00278 IF F=1 THEN LET I=B:LET J=A:GOSUB 2600 00280 X=P:Y=Q 00300 GOSUB 3000 00310 IF G<>1 THEN 90 00315 CURS 1,H+3 00320 PRINT"LEVEL ";L;" CLEARED!" 00330 FOR T=1 TO 2000:NEXT T 00340 L=L+1 00350 IF L>7 THEN LET L=1 00360 GOSUB 1000 00370 GOSUB 2000 00380 GOTO 90 00500 REM PUSH BOX FROM Q,P TO B,A - O=1 MEANS BLOCKED 00505 O=0 00510 N=M(B,A) 00520 IF N=1 OR N=2 OR N=4 THEN LET O=1:RETURN 00530 IF N=3 THEN LET M(B,A)=4 ELSE LET M(B,A)=2 00540 IF M(Q,P)=4 THEN LET M(Q,P)=3 ELSE LET M(Q,P)=0 00550 RETURN 01000 REM LOAD LEVEL L 01010 RESTORE 5000 01020 FOR J=1 TO L 01030 READ H,W 01040 FOR I=1 TO H 01050 FOR P=1 TO W 01060 READ C 01070 M(I,P)=C 01080 IF C=5 THEN LET X=P:LET Y=I 01090 NEXT P 01100 NEXT I 01110 NEXT J 01120 RETURN 02000 REM FULL RENDER - ONCE PER LEVEL ONLY 02010 CLS 02020 PRINT"SOKOBAN - LEVEL ";L 02030 FOR I=1 TO H 02040 FOR J=1 TO W 02050 GOSUB 2600 02060 NEXT J 02070 NEXT I 02080 CURS 1,H+2 02090 PRINT"WASD MOVE R RESTART"; 02095 RETURN 02600 REM DRAW ONE TILE AT MAP ROW I COL J 02610 C=M(I,J) 02620 CURS (J*2)-1,I+1 02630 IF C=1 THEN 2700 02640 IF C=2 OR C=4 THEN 2750 02650 IF C=5 OR C=6 THEN 2850 02660 IF C=3 THEN PRINT". "; ELSE PRINT" "; 02670 RETURN 02700 PRINT"##"; 02710 RETURN 02750 INVERSE 02760 PRINT"X"; 02770 NORMAL 02780 IF C=4 THEN PRINT"."; ELSE PRINT" "; 02790 RETURN 02850 PCG 02860 PRINT"ij"; 02870 NORMAL 02880 RETURN 03000 REM CHECK WIN - ANY UNPLACED BOX MEANS NOT SOLVED 03010 G=1 03020 FOR I=1 TO H 03030 FOR J=1 TO W 03040 IF M(I,J)=2 THEN LET G=0 03050 NEXT J 03060 NEXT I 03070 RETURN 04000 REM LOAD BEE PCG TILES I AND J 04010 RESTORE 4500 04020 FOR P=65168 TO 65199 04030 READ C 04040 POKE P,C 04050 NEXT P 04060 RETURN 04500 REM PCG I - BEE LEFT 04510 DATA 8,4,59,123,121,59,7,15,28,31,28,31,15,7,9,16 04520 REM PCG J - BEE RIGHT 04530 DATA 16,32,220,222,158,220,224,240,56,248,56,248,240,224,144,8 05000 DATA 6,7 05010 DATA 1,1,1,1,1,1,1 05020 DATA 1,0,0,0,0,0,1 05030 DATA 1,0,2,2,0,0,1 05040 DATA 1,0,0,3,3,0,1 05050 DATA 1,0,0,5,0,0,1 05060 DATA 1,1,1,1,1,1,1 05070 DATA 7,8 05080 DATA 1,1,1,1,1,1,1,1 05090 DATA 1,0,0,0,0,0,0,1 05100 DATA 1,0,2,0,0,2,0,1 05110 DATA 1,0,0,1,1,0,0,1 05120 DATA 1,0,3,0,0,3,0,1 05130 DATA 1,0,0,0,5,0,0,1 05140 DATA 1,1,1,1,1,1,1,1 05150 DATA 7,8 05160 DATA 1,1,1,1,1,1,1,1 05170 DATA 1,0,0,0,0,0,0,1 05180 DATA 1,0,2,0,2,0,2,1 05190 DATA 1,0,0,1,0,0,0,1 05200 DATA 1,3,0,0,3,0,3,1 05210 DATA 1,0,0,5,0,0,0,1 05220 DATA 1,1,1,1,1,1,1,1 05230 DATA 8,9 05240 DATA 1,1,1,1,1,1,1,1,1 05250 DATA 1,0,0,0,0,0,0,0,1 05260 DATA 1,0,2,0,0,2,0,0,1 05270 DATA 1,0,0,0,1,1,0,0,1 05280 DATA 1,0,0,2,0,0,0,0,1 05290 DATA 1,0,3,0,3,0,3,0,1 05300 DATA 1,0,0,0,5,0,0,0,1 05310 DATA 1,1,1,1,1,1,1,1,1 05320 DATA 8,9 05330 DATA 1,1,1,1,1,1,1,1,1 05340 DATA 1,0,0,0,0,0,0,0,1 05350 DATA 1,0,2,0,2,0,2,0,1 05360 DATA 1,0,0,0,1,0,0,0,1 05370 DATA 1,0,0,0,2,0,0,0,1 05380 DATA 1,0,3,0,3,0,3,0,1 05390 DATA 1,0,0,0,3,5,0,0,1 05400 DATA 1,1,1,1,1,1,1,1,1 05410 DATA 8,9 05420 DATA 1,1,1,1,1,1,1,1,1 05430 DATA 1,0,0,1,0,0,0,0,1 05440 DATA 1,0,2,0,0,2,0,0,1 05450 DATA 1,0,0,1,1,0,0,0,1 05460 DATA 1,0,0,2,0,2,0,0,1 05470 DATA 1,0,3,0,0,3,0,0,1 05480 DATA 1,3,0,0,5,0,3,0,1 05490 DATA 1,1,1,1,1,1,1,1,1 05500 DATA 8,8 05510 DATA 1,1,1,1,1,1,1,1 05520 DATA 1,5,0,0,0,1,3,1 05530 DATA 1,1,1,1,0,1,0,1 05540 DATA 1,3,0,0,0,0,0,1 05550 DATA 1,0,1,1,2,1,0,1 05560 DATA 1,2,1,0,0,0,0,1 05570 DATA 1,0,0,0,1,0,0,1 05580 DATA 1,1,1,1,1,1,1,1