Listing of file='BLACKBOX' on disk='vmedia/games-droz01.wvd.zip'
# Sector 873, program filename = 'BLACKBOX' 0001 REM % BLACKBOX - Black Box Game - 01/12/82 - R.L. Droz 0090 DIM B$(24,80)1,E$1,M0$1,D(2),L(2),L0(2) 0092 DATA "@","#","$","%","&","*","+","?",HEX(7B),HEX(7C),HEX(7D),HEX(7E),HEX( 7F) 0093 DATA HEX(10),HEX(11),HEX(12),HEX(13),HEX(14),HEX(15),HEX(16),HEX(17),HEX( 18) 0094 DATA HEX(19),HEX(1A),HEX(1B),HEX(1C),HEX(1D),HEX(1E),HEX(1F) 0095 PRINT HEX(03) 0100 INPUT "ROWS,COLUMNS",R,C 0102 IF 2*R+2*C>52 THEN 100 0105 INPUT "NUMBER OF OBJECTS",N 0110 GOSUB '41(R,C) 0115 GOSUB '40("T",R,C) 0120 GOSUB '42(N,R,C) 0125 GOSUB '40("T",R,C) 0126 READ M0$ 0127 GOSUB '44(R,C) 0128 PRINT AT(20,0,79); : PRINTUSING "LOCATION (ROW,COL) = ( ## , ## ) DIRECTION (ROW,COL) = ( +# , +#)", L(1),L(2),D(1),D(2) 0140 GOSUB '45(M0$,"T",R,C) 0175 GOTO 126 0176 END 0299 REM % HIDE N OBJECTS 0300 DEFFN'42(N,R0,C0) 0302 N=MIN(N,R0*C0) 0304 FOR I=1 TO N 0306 R1=INT(R0*RND(1))+1 : C1=INT(C0*RND(1))+1 0308 IF B$(R1+1,C1+1)<>" " THEN GOTO 306 : ELSE B$(R1+1,C1+1)="\81" 0310 NEXT I 0312 RETURN 0314 REM % INITIALIZE BLACK BOX 0316 DEFFN'41(R0,C0) : B$()=ALL(" ") : L=VAL("A") 0318 FOR C1=1 TO C0 0320 B$(1,C1+1)=BIN(L) : IF L<VAL("Z") OR L>=VAL("a") THEN L=L+1 : ELSE L=VAL("a") 0322 NEXT C1 0324 FOR R1=1 TO R0 0326 B$(R1+1,C0+2)=BIN(L) : IF L<VAL("Z") OR L>=VAL("a") THEN L=L+1 : ELSE L=VAL("a") 0328 NEXT R1 0330 FOR R1=1 TO R0 0332 B$(R1+1,1)=BIN(L) : IF L<VAL("Z") OR L>=VAL("a") THEN L=L+1 : ELSE L=VAL("a") 0334 NEXT R1 0336 FOR C1=1 TO C0 0338 B$(R0+2,C1+1)=BIN(L) : IF L<VAL("Z") OR L>=VAL("a") THEN L=L+1 : ELSE L=VAL("a") 0340 NEXT C1 0342 RETURN 0349 REM % GET CO-ORDS AND DIRECTION OF RAY 0350 DEFFN'44(R0,C0) 0351 PRINT AT(22,0,); : LINPUT "Ray entry point?" ?-E$ : IF VER(E$,"A")<>1 THEN 350 0355 IF E$<"a" THEN E=VAL(E$)-VAL("A")+1 : ELSE E=VAL(E$)-VAL("a")+27 0357 IF E>2*R0+R*C0 THEN 351 0360 IF E>C0 THEN 365 : D(1)=1 : D(2)=0 : L(1)=1 : L(2)=E+1 : RETURN 0365 IF E>C0+R0 THEN 370 : D(1)=0 : D(2)=-1 : L(1)=E-C0+1 : L(2)=C0+2 : RETURN 0370 IF E>2*R0+C0 THEN 375 : D(1)=0 : D(2)=1 : L(1)=E-R0-C0+1 : L(2)=1 : RETURN 0375 IF E>2*C0+2*R0 THEN 380 : D(1)=-1 : D(2)=0 : L(1)=R0+2 : L(2)=E-2*R0-C0+1 : RETURN 0380 STOP "BUG!" 0398 REM % TRACE RAY THROUGH BLACK BOX 0399 DIM L7$1,R1(2,2),D1(1,2),L1(1,2),L2(1,2) 0400 DEFFN'45(M0$,L7$,R0,C0) : MAT L0=L : B$(L0(1),L0(2))=M0$ 0402 L1(1,1)=L(1) : L1(1,2)=L(2) 0404 D1(1,1)=D(1) : D1(1,2)=D(2) 0405 IF L7$="T" THEN GOSUB '46(L7$,R0,C0) 0406 REM EDGE HITS & REFLECTIONS 0408 MAT L2=L1+D1 : IF B$(L2(1,1),L2(1,2))<>"\81" THEN 412 0410 MAT L=L0 : B$(L(1),L(2))="\8B" : GOSUB '46(L7$,R0,C0) : RETURN 0412 GOSUB 491 : MAT D2=D1*R1 : MAT L2=L2+D2 0414 IF B$(L2(1,1),L2(1,2))<>"\81" THEN 418 0416 MAT L=L0 : B$(L(1),L(2))="\8D" : GOSUB '46(L7$,R0,C0) : RETURN 0418 MAT D2=(-2)*D2 : MAT L2=L2+D2 : IF B$(L2(1,1),L2(1,2))="\81" THEN 416 0420 REM TAKE A STEP AHEAD 0422 MAT L1=L1+D1 0424 B$(L1(1,1),L1(1,2))=M0$ : IF L7$="T" THEN GOSUB '46(L7$,R0,C0) 0426 REM CHECK FOR EDGE 0428 IF L1(1,1)=1 OR L1(1,1)=R0+2 OR L1(1,2)=1 OR L1(1,2)=C0+2 THEN GOTO 429 : ELSE GOTO 436 0429 L(1)=L1(1,1) : L(2)=L1(1,2) 0430 IF L(1)=L0(1) AND L(2)=L0(2) THEN B$(L(1),L(2))="\8D" : ELSE B$(L(1),L(2))=M0$ 0432 GOSUB '46(L7$,R0,C0) : RETURN 0434 REM MID-BOX MOVEMENTS (hit) 0436 MAT L2=L1+D1 : IF B$(L2(1,1),L2(1,2))<>"\81" THEN 442 0438 MAT L=L0 : B$(L(1),L(2))="\8B" 0439 L1(1,1)=L(1) : L1(1,2)=L(2) : GOSUB '46(L7$,R0,C0) : RETURN 0440 REM (reflection) 0442 GOSUB 491 : MAT D2=D1*R1 : MAT L2=L2+D2 0444 IF B$(L2(1,1),L2(1,2))<>"\81" THEN 458 0446 MAT D2=(-2)*D2 : MAT L2=L2+D2 0448 IF B$(L2(1,1),L2(1,2))<>"\81" THEN 454 0450 MAT D1=(-1)*D1 : GOTO 422 0452 REM (right) 0454 GOSUB 492 : MAT D2=D1 : MAT D1=D2*R1 : GOTO 422 0456 REM (left) 0458 MAT D2=(-2)*D2 : MAT L2=L2+D2 0460 IF B$(L2(1,1),L2(1,2))<>"\81" THEN 422 0462 GOSUB 491 : MAT D2=D1 : MAT D1=D2*R1 : GOTO 422 0464 REM HELPER ROUTINES 0491 R1(1,1),R1(2,2)=0 : R1(1,2)=+1 : R1(2,1)=-1 : RETURN : REM LEFT TURN 0492 R1(1,1),R1(2,2)=0 : R1(1,2)=-1 : R1(2,1)=+1 : RETURN : REM RIGHT TURN 0498 REM % DRAW BLACK BOX 0499 DIM L8$1,M8$80 0500 DEFFN'40(L8$,R0,C0) 0505 I1=(80-4*(C0+2))/2 : D1=(24-R0-2)/2 0510 GOSUB '50(1) 0511 PRINT AT(D1,0); 0512 GOSUB 592 0515 FOR R1=2 TO R0+1 0517 M8$=HEX(0000) 0520 PRINTUSING TO M8$,597,B$(R1,1); 0530 FOR C1=2 TO C0+1 0535 IF L8$="T" THEN PRINTUSING TO M8$,597,B$(R1,C1); : ELSE PRINTUSING TO M8$,597," "; 0540 NEXT C1 0542 PRINTUSING TO M8$,596,B$(R1,C0+2) 0543 GOSUB 592 0545 NEXT R1 0550 GOSUB '50(R0+2) 0551 PRINT TAB(I1);STR(M8$,3,LEN(M8$)-3) 0555 RETURN 0591 REM PRINT 0592 R2=LEN(M8$)-3 0593 M8$=M8$ OR ALL(HEX(80)) 0594 PRINT TAB(I1);STR(M8$,3,R2) 0595 RETURN 0596 % # 0597 % # \86 0598 REM % DISPLAY HELPER 0599 DEFFN'50(R1) 0600 M8$=HEX(0000) 0601 PRINTUSING TO M8$,597," "; 0602 FOR C1=2 TO C0+1 0604 PRINTUSING TO M8$,597,B$(R1,C1); 0606 NEXT C1 0607 PRINTUSING TO M8$,596," " 0610 RETURN 0700 % DEFFN'46(L8$,R0,C0): PRINT AT(1,0);: MAT PRINT L1: MAT PRINT L0: GOSUB '40(L8$,R0,C0): RETURN 0710 DEFFN'46(L8$,R0,C0) : PRINT AT(D1+L1(1,1)-1,I1+4*L1(1,2)-3);B$(L1(1,1),L1(1,2)) : RETURN 8040 DEFFN'4 HEX(8B) 8999 END 9000 DEFFN'0 HEX(86) 9010 DEFFN'1 HEX(81) 9020 DEFFN'2 HEX(8C) 9030 DEFFN'3 HEX(8D)