1000 !-------------------!
1010 !  ALPHA SCRABBLE   !
1020 !-------------------!
1030 ! MODIFIED FOR MULTI-PLAYERS JUNE 1984, RIC WEINSTEIN,PRESTON MACON
1040 REM ...... COPYRIGHT JAN 1983, BOB FOWLER
1050
1060 !-------------------!
1070 !  MAP DEFINITIONS  !
1080 !-------------------!
1090 MAP1 INLINE,S,100
1100 REM ...... LETTERS (98 LETTERS + 2 WILDCARDS)
1110   MAP1 L1
1120     MAP2 L11$,S,50,"AAAAAAAAABBCCDDDDEEEEEEEEEEEEFFGGGHHIIIIIIIIIJKLLL"
1130     MAP2 L12$,S,50,"LMMNNNNNNOOOOOOOOPPQRRRRRRSSSSTTTTTTUUUUVVWWXYYZ**"
1140   MAP1 L2, @L1
1150     MAP2 ALLTILES$,S,100
1160   MAP1 TILES$,S,100
1170
1180 REM ...... ARRAY OF BOARD LETTERS (ALPHA)
1190   MAP1 B1
1200     MAP2 BOARDL$(15,15),S,1 ! Actual letters in board (or blanks)
1210   MAP1 B2, @B1
1220     MAP2 BOARDL$,S,225     ! Used for whole-board searches
1230
1240 REM ...... ARRAY OF BOARD SCORES
1250   MAP1 B3
1260     MAP2 BOARDS(15,15),B,1 ! 0=blank or wildcard , 1-10=letter score
1270   MAP1 B4, @B3
1280     MAP2 B5$,S,225         ! Used to initialize BOARDS array
1290
1300 REM ...... ARRAY OF PREMIUMS
1310   MAP1 P1
1320     MAP2 PREMIUM(15,15),S,1 ! 0=none , 1=DL , 2=TL , 3=DW , 4=TW
1330   MAP1 P2, @P1
1340     MAP2 P301$,S,15,"400100040001004"
1350     MAP2 P302$,S,15,"030002000200030"
1360     MAP2 P303$,S,15,"003000101000300"
1370     MAP2 P304$,S,15,"100300010003001"
1380     MAP2 P305$,S,15,"000030000030000"
1390     MAP2 P306$,S,15,"020002000200020"
1400     MAP2 P307$,S,15,"001000101000100"
1410     MAP2 P308$,S,15,"400100030001004"
1420     MAP2 P309$,S,15,"001000101000100"
1430     MAP2 P310$,S,15,"020002000200020"
1440     MAP2 P311$,S,15,"000030000030000"
1450     MAP2 P312$,S,15,"100300010003001"
1460     MAP2 P313$,S,15,"003000101000300"
1470     MAP2 P314$,S,15,"030002000200030"
1480     MAP2 P315$,S,15,"400100040001004"
1490
1500 REM ...... TEST PLAY DATA ARRAYS
1510 REM ...... MULTIPLAY STORES ALL POSSIBLE PLAYS FROM 1 TABLE ENTRY
1520 REM        # OF MULTIPLAYS RARELY EXCEEDS 10, BUT CAN !
1530   MAP1 MULTIPLAY(20)
1540     MAP2 MPROW,B,1
1550     MAP2 MPCOL,B,1
1560     MAP2 MPDIR,B,1       ! 0,1 FOR HORIZONTAL/VERTICAL
1570     MAP2 MPSCORE,B,2
1580   MAP1 MMP,F,6,20        ! MAXIMUM # OF WORDS IN MULTI-PLAY SCAN
1590
1600 REM ...... TABLEPLAYS STORES THE WORD TABLE DISPLAYED ON CRT
1610   MAP1 TABLEPLAY'ALL(11)   ! ARRAY SIZE MUST = MTP+1 (SEE BELOW)
1620     MAP2 TABLEPLAY         ! THIS ARRAY MATCHES MULTIPLAY ARRAY ABOVE
1630       MAP3 TPROW,B,1
1640       MAP3 TPCOL,B,1
1650       MAP3 TPDIR,B,1       ! 0,1 FOR HORIZONTAL/VERTICAL
1660       MAP3 TPSCORE,B,2
1670     MAP2 TPWORD$,S,15
1680   MAP1 MTP,F,6,10          ! MAXIMUM # OF WORDS IN TABLE OF PLAYS
1690
1700 REM ...... ACTUALPLAY STORES THE POSITIONS PLAYED (IN CASE OF ERASURE)
1710   MAP1 ACTUAL'PLAY(7)
1720     MAP2 PROW,B,1
1730     MAP2 PCOL,B,1
1740     MAP2 PCHAR$,S,1
1750   MAP1 NPTILES,F,6       ! NUMBER OF TILES PLAYED
1760
1770 REM ...... MISCELLANEOUS MAPS
1780 REM --------------- A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
1790   MAP1 LVAL$,S,52," 1 3 3 2 1 4 2 4 1 8 5 1 3 1 1 310 1 1 1 1 4 4 8 410"
1800   MAP1 RACK$(4),S,7           ! LETTERS IN PLAYERS' RACKS
1810   MAP1 LRACK$(4),S,7          ! PLAYER'S LAST RACK
1820   MAP1 NRACK$(4),S,7          ! NEW RACK (DURING REARRANGE)
1830   MAP1 WORKRACK$(4),S,7       ! WORK RACK AREA
1840   MAP1 PLAY$,S,15          ! WORD "PLAYED" ON BOARD
1850   MAP1 PLAYUCS$,S,15       ! PLAY IN UP CASE
1860   MAP1 PLAYWILD$,S,15      ! PLAY IN UPPER CASE + WILDCARDS
1870   MAP1 P3
1880     MAP2 PLAYSCR(15),B,1   ! LETTER VALUES IN PLAY
1890  MAP1 P4
1900    MAP2 PLAYWSCR(15),B,1  ! LETTER VALUES IN PLAY + WILDCARD CHANGES
1910  MAP1 CROSS'WORD$,S,15    ! CROSS WORD (PERPENDICULAR TO PLAY) WORK AREA
1920  MAP1 CWORD'SAVES(10)     ! EXTRA WORDS DATA
1930    MAP2 CROSS'WORDS$,S,15
1940    MAP2 CROSS'WORD'SCORES,B,2
1950  MAP1 HOLES$,S,15         ! (INTERSECTION) HOLES IN PLAY WORD
1960  MAP1 FHOLE,F,6           ! FIRST HOLE IN PLAY WORD
1970  MAP1 CHAR$,S,1           ! 1-LETTER WORK AREA
1980  MAP1 NPLAYERS,B,4,1      ! NUMBER OF PLAYERS
1990  MAP1 ME(4),B,1            ! USER'S PLAYER NUMBER
2000    ME(1)=1:ME(2)=2:ME(3)=3:ME(4)=4
2010  MAP1 REPLACE$,S,7        ! REPLACEMENT TILES
2020  MAP1 SCORES(4),F,6       ! ALL PLAYERS' SCORES
2030  MAP1 VOWELS$,S,10,"AEIOUY*"      ! ALL WORDS MUST HAVE >0 OF THESE
2040  MAP1 NOYES$,S,1          ! QUERY (Y,N,Q)
2050  MAP1 TEMP'FIELDS
2060    MAP2 WAIT,F,6
2070    MAP2 SEED,F,6
2080    MAP2 NOPLAYS,F,6
2090    MAP2 SCORE(4),F,6
2100    MAP2 LSCORE,F,6
2110    MAP2 NTP,F,6
2120    MAP2 YYY,F,6
2130    MAP2 SELECT,F,6
2140    MAP2 I,F,6
2150    MAP2 LP,F,6
2160    MAP2 NERROR,F,6
2170    MAP2 NHOLES,F,6
2180    MAP2 NMP,F,6
2190    MAP2 NVOWEL,F,6
2200    MAP2 LVALAN,F,6
2210    MAP2 NOLD,F,6
2220    MAP2 NNEW,F,6
2230    MAP2 MROW,F,6
2240    MAP2 MCOL,F,6
2250    MAP2 DROW,F,6
2260    MAP2 DCOL,F,6
2270    MAP2 PL,F,6
2280    MAP2 LMATCH,F,6
2290    MAP2 NMATCH,F,6
2300    MAP2 WN,F,6
2310    MAP2 CASE,F,6
2320    MAP2 R,F,6
2330    MAP2 L,F,6
2340    MAP2 FILEN,F,6
2350    MAP2 FNAME$,S,10
2360    MAP2 THERE,F,6
2370    MAP2 DTP,F,6
2380    MAP2 ITP,F,6
2390    MAP2 LTIME,F,6
2400    MAP2 ROW,F,6
2410    MAP2 COL,F,6
2420    MAP2 CLEAR,F,6
2430    MAP2 DUMMY,F,6
2440    MAP2 LVALA,F,6
2450    MAP2 P,F,6
2460    MAP2 WORD'SCORE,F,6
2470    MAP2 MULTIPLIER,F,6
2480    MAP2 PLAY'SCORE,F,6
2490    MAP2 IROW,F,6
2500    MAP2 ICOL,F,6
2510    MAP2 NCROSS,F,6
2520    MAP2 NINTERSECT,F,6
2530    MAP2 CROSS'FLAG,F,6
2540    MAP2 CROSS'WORD'SCORE,F,6
2550    MAP2 CROSS'MULTIPLIER,F,6
2560    MAP2 CWDIR,F,6
2570    MAP2 C1$,S,10
2580    MAP2 C2$,S,10
2590    MAP2 DUP,F,6
2600    MAP2 LVALN,F,6
2610    MAP2 LVALA$,S,10
2620    MAP2 FROW,F,6
2630    MAP2 CROW,F,6
2640    MAP2 FCOL,F,6
2650    MAP2 CCOL,F,6
2660    MAP2 CDROW,F,6
2670    MAP2 CDCOL,F,6
2680    MAP2 ROWX,F,6
2690    MAP2 COLX,F,6
2700    MAP2 AA,X,1
2710    MAP2 INITIALS(4),S,10
2720 !-------------!
2730 !  NEXT GAME  !
2740 !-------------!
2750
2760 NEXT'GAME:
2770   WAIT=0
2780  !ON ERROR GO TO ABORT'GAME
2790   SEED=0                                                   ! DELETE
2800   PRINT TAB(-1,0);
2810   INPUT "DO YOU WISH TO RESTART A PREVIOUS GAME ? ";YN$
2820   IF YN$[1,1] = "Y" THEN GOTO RESTART
2830   INPUT "ENTER RND SEED (DEFAULTS TO RANDOM SEED) : ",SEED ! ****** DELETE
2840   IF(SEED=0) THEN RANDOMIZE   ELSE DUMMY=RND(-SEED)        ! DELETE
2850 ENTER'PLAYERS:
2860   PRINT
2870   INPUT "ENTER THE NUMBER OF PLAYERS (FROM 1 TO 4) ";NPLAYERS
2880   IF (NPLAYERS <1) OR (NPLAYERS > 4) THEN PRINT TAB(24,1); "INVALID NUMBER... PLEASE RE-ENTER" : GOTO ENTER'PLAYERS
2890   PRINT
2900   FOR X = 1 TO NPLAYERS
2910   PRINT "ENTER PLAYER #";STR(X);"'S NAME "; : INPUT "";INITIALS(X)
2920   PRINT
2930   NEXT X
2940   PRINT TAB(-1,0); TAB(-1,12);
2950 REM ...... ASK FOR INITIALS ? USE INITIALS & STORE FINAL SCORES ?
2935 REM ...... PICK RANDOM NUMBER TO DECIDE WHO GOES FIRST
2960 REM ...... CLEAR BOARD OF LETTERS
2970   B5$=""                         ! initialize BOARDS values
2980   BOARDL$=SPACE(225)            ! initialize BOARDL$ and BOARDL$(n,n)
2990
3000 REM ...... SHUFFLE LETTER "TILES"
3010 !   RANDOMIZE                      ! ****** REMOVE "!" AFTER DEBUGGING
3020   TILES$=ALLTILES$               ! START OFF WITH FULL 100 TILES
3030   GOSUB SHUFFLE'LETTERS
3040   GOSUB DISPLAY'BOARD
3050   GOSUB DISPLAY'MENU
3060   NOPLAYS=1                      ! =0 AFTER FIRST PLAY
3070   FOR I = 1 TO 4 : SCORE(I)=0 : NEXT I
3080   LSCORE=0                       ! SCORE BEFORE LAST MOVE
3090
3100 NEXT'TURN:
3110   NTP=0 : WILDCARD'LETTER$ = ""
3120   YYY = YYY + 1
3130   IF YYY = (NPLAYERS+1) THEN YYY = 1
3140   IF YYY = SKIP THEN PRINT TAB(23,1);TAB(-1,9);CHR$(7);"Player # ";&
         STR(YYY);" lost turn because of challenge. CR to Continue"; : &
            INPUT "";AAA :PRINT TAB(23,1);TAB(-1,9); SKIP = 0 :&
               GOTO NEXT'TURN
3150 NEXT'TILE:
3160   IF(LEN(RACK$(YYY))=7 OR LEN(TILES$)=0) THEN GO TO DISPLAY'RACKS
3170   RACK$(YYY)=RACK$(YYY)+TILES$[1,1]                  ! PICK A TILE, ANY TILE
3180   TILES$=TILES$[2,LEN(TILES$)]             ! REMOVE FROM PILE
3190   GO TO NEXT'TILE
3200
3210 DISPLAY'RACKS:
3220   LRACK$(YYY)=RACK$(YYY)
3230   LSCORE=SCORE(YYY)
3240   GOSUB DISPLAY'ALL'RACKS
3250   IF(LEN(RACK$(YYY)) > 0) THEN GO TO MENU
3260
3270 REM ...... WE HAVE USED UP ALL THE REMAINING TILES !
3280 REM        GAME IS OVER & THIS PLAYER GETS EXTRA POINTS
3255 REM        (= SUM OF ALL UNPLAYED TILES IN OTHER PLAYERS' RACKS)
3290   GO TO END'GAME
3300
3310 !-------------!
3320 !  MAIN MENU  !
3330 !-------------!
3340
3350 MENU:
3360   SELECT=0
3370   PRINT TAB(16,50);SPACE(28);TAB(-1,12);TAB(16,50);"What next ? : ";CHR(7);
3380   INPUT "" SELECT
3390   PRINT TAB(24,1); TAB(-1,9);
3400   GOSUB WAIT
3410   ON SELECT    GO TO REARRANGE'RACK,TRY'WORD,MAKE'PLAY,REPLACE'LETTERS
3420   ON SELECT-04 GO TO MENU2,QUIT,DELETE'PLAY
3430   ON SELECT-90 GO TO DISPLAY'TILES,SET'WAIT,REDO'DISPLAY,MEMORY
3440   ON SELECT-94 GO TO CONVENTION,TRAIL
3450   PRINT "Error --- illegal selection"; CHR(7);
3460   GO TO MENU
3470
3480 REARRANGE'RACK:
3490   PRINT TAB(16,50);TAB(-1,9);TAB(-1,12);"Enter letters";CHR(7);
3500   PLAY$=""
3510   NRACK$(YYY)=""
3520
3530 REARRANGE:
3540   IF(PLAY$="") THEN GO TO DISPLAY'ARR
3550   CHAR$=PLAY$[1,1]
3560   I=INSTR(1,RACK$(YYY),CHAR$)
3570   IF(I <> 0) THEN GO TO OK'ARR
3580   PRINT "Error---"; CHAR$; " not in rack"; CHR(7);
3590   GO TO DISPLAY'ARR
3600
3610 OK'ARR:
3620   NRACK$(YYY)=NRACK$(YYY)+CHAR$
3630   PLAY$=PLAY$[2,LEN(PLAY$)]
3640   IF(I=1) THEN RACK$(YYY)=RACK$(YYY)[2,LEN(RACK$(YYY))] : GO TO REARRANGE
3650   RACK$(YYY)=RACK$(YYY)[1,I-1]+RACK$(YYY)[I+1,LEN(RACK$(YYY))] : GO TO REARRANGE
3660
3670 DISPLAY'ARR:
3680   PRINT TAB(ME(YYY)+18,18); NRACK$(YYY); SPACE(8); TAB(ME(YYY)+18,26); RACK$(YYY);!SPACE(8);
3690   IF(LEN(RACK$(YYY))=0) THEN RACK$(YYY)=NRACK$(YYY) : &
               GOSUB DISPLAY'RACK : GO TO MENU
3700   PRINT TAB(ME(YYY)+18,18+LEN(NRACK$(YYY)));
3710   PLAY$=""
3720   INPUT "" PLAY$
3730   PRINT TAB(24,1); TAB(-1,9);
3740   IF(LEN(PLAY$)=0) THEN PLAY$=RACK$(YYY)
3750   GO TO REARRANGE
3760
3770 TRY'WORD:
3780   IF(NTP=MTP) THEN PRINT CHR(7); : GO TO MENU
3790   IF(NTP=0) THEN GOSUB DISPLAY'TABLE'TITLE
3800   PRINT TAB(16,50);SPACE(29);TAB(16,50);TAB(-1,12); "If no more words, hit return";
3810   PRINT TAB(-1,11); TAB(NTP+1+4,49); NTP+1 USING "#Z"; " ";SPACE(27);TAB(-1,30);TAB(NTP+1+4,52);
3820   INPUT LINE "" PLAY$
3830   LP=LEN(PLAY$)
3840   GOSUB WAIT
3850
3860 REM ....... CHECK FOR RETURN (USER HAS NO MORE WORDS TO TRY)
3870   IF(LP > 0) THEN GO TO CHECK'ONE
3880   PRINT TAB(NTP+1+4,49);SPACE(30);TAB(NTP+1+4,49);
3890   IF(NTP=0) THEN GOSUB ERASE'TABLE
3900   GO TO MENU
3910
3920 CHECK'ONE:
3930   PRINT TAB(24,1); TAB(-1,9);
3940   IF(LP=1) THEN PRINT "Error --- need > 1 letters"; CHR(7); : GO TO TRY'WORD
3950   PLAYUCS$=UCS(PLAY$)
3960   NERROR=0
3970   NHOLES=0
3980   NMP=0
3990   NVOWEL=0
4000
4010 REM ...... SCAN PLAY WORD
4020   FOR I=1 TO LP
4030     CHAR$=PLAYUCS$[I,I]
4040     IF(CHAR$ <> PLAY$[I,I]) THEN NHOLES=NHOLES+1 : GO TO SCRL
4050     IF(CHAR$ >="A" AND CHAR$ <= "Z") THEN GO TO SCRL
4060     IF(CHAR$ <> "*") THEN NERROR=NERROR+1   ELSE PLAYSCR(I)=0
4070     GO TO ENDL1
4080 SCRL:
4090     GOSUB LETTER'SCORE
4100     PLAYSCR(I)=LVALN
4110     NVOWEL=NVOWEL+INSTR(1,VOWELS$,CHAR$)
4120 ENDL1:
4130   NEXT I
4140
4150 REM ...... ANY VOWELS ?
4160   IF(NVOWEL=0) THEN PRINT "Error---no vowels"; CHR(7); : GO TO TRY'WORD
4170   IF(NERROR=0) THEN GO TO DO'TRY
4180   PRINT "Error ---"; NERROR; "illegal letters (use A-Z,a-z,*)"; CHR(7);
4190   GO TO TRY'WORD
4200
4210 DO'TRY:
4220   REM ...... IF THERE ARE >0 HOLES, WE MAY SAFELY SCAN BOARD
4230   IF(NHOLES > 0) THEN GO TO SCAN'BOARD
4240 REM ...... IF NO HOLES, ASK FOR ROW,COLUMN,DIRECTION & BYPASS SCAN
4215   NOLD=0 : NNEW=0
4250   PRINT TAB(-1,12);
4260   FOR I=1 TO 15 : PRINT TAB(I+2,46); I USING "#Z"; : NEXT I
4270 ENTER'ROW:
4280   PRINT TAB(16,50); TAB(-1,9); TAB(-1,12);
4290   PRINT "Hit return to scan whole board";
4300   GOSUB WAIT
4310   MROW=0
4320   PRINT TAB(NTP+1+4,67);SPACE(13);TAB(-1,30);TAB(-1,11);TAB(NTP+1+4,67);
4330   INPUT "" MROW
4340   PRINT TAB(24,1); TAB(-1,9);
4350   IF(MROW=0) THEN GO TO HELP'COLUMN
4360   IF(MROW >= 1 AND MROW <= 15) THEN GO TO HELP'COLUMN
4370   PRINT "Error --- must be 1 to 15"; CHR(7);
4380   GO TO ENTER'ROW
4390
4400 HELP'COLUMN:
4410   FOR I=1 TO 15 : PRINT TAB(I+2,46); "  "; : NEXT I
4420   IF(MROW=0) THEN GO TO SCAN'BOARD
4430   PRINT TAB(-1,12);
4440   PRINT TAB(18,1); "01 02 03 04 05 06 07 08 09 10 11 12 13 14 15";
4450 ENTER'COLUMN:
4460   PRINT TAB(16,50); TAB(-1,9);
4470   MCOL=0
4480   PRINT TAB(NTP+1+4,71); SPACE(8); TAB(-1,11);TAB(NTP+1+4,71);
4490   INPUT "" MCOL
4500   PRINT TAB(24,1); TAB(-1,9);
4510   IF(MCOL >= 1 AND MCOL <= 15) THEN GO TO HELP'DIRECTION
4520   PRINT "Error --- must be 1 to 15"; CHR(7);
4530   GO TO ENTER'COLUMN
4540
4550 HELP'DIRECTION:
4560   PRINT TAB(18,1); SPACE(44);
4570 ENTER'DIRECTION:
4580   CHAR$=""
4590   PRINT TAB(16,50); TAB(-1,9); TAB(-1,12);
4600   PRINT "Enter H(orizontal),V(ertical)";
4610   PRINT TAB(NTP+1+4,75); TAB(-1,11);
4620   INPUT "" CHAR$
4630   PRINT TAB(16,50); TAB(-1,9);
4640   PRINT TAB(24,1); TAB(-1,9);
4650   CHAR$=UCS(CHAR$)
4660   IF(CHAR$="H") THEN DROW=0 : DCOL=1 : GO TO CHECK'8'8
4670   IF(CHAR$="V") THEN DROW=1 : DCOL=0 : GO TO CHECK'8'8
4680   PRINT CHR(7);
4690   GO TO ENTER'DIRECTION
4700
4710 CHECK'8'8:
4720   IF (BOARDL$(8,8) <> "") THEN GOTO GOOD'INPUT
4730!  IF(BOARDL$ <> "") THEN GO TO GOOD'INPUT ! CHECK FOR FIRST PLAY OF GAME
4740   IF(MROW > 8 OR (MROW+((LP-1)*DROW)) < 8) THEN GO TO  BAD'INPUT
4750   IF(NOT(MCOL > 8 OR MCOL+(LP-1)*DCOL < 8)) THEN GO TO GOOD'INPUT
4760
4770 BAD'INPUT:
4780   PRINT "Error --- first play must cover center (8,8)"; CHR(7);
4790   GO TO ENTER'ROW
4800 GOOD'INPUT:
4810   PL=1
4820   GOSUB TEST'PLAY
4830
4840 CHECK'OLD'NEW:
4850   IF(NNEW > 0) THEN GO TO TRY'WORD
4860   PRINT "Warning --- no new plays possible";
4870   IF(NOLD > 0) THEN PRINT " ("; STR$(NOLD); " moves already in table)";
4880   GO TO TRY'WORD
4890
4900 SCAN'BOARD:
4910   IF(BOARDL$="") THEN GO TO FIRST'PLAY
4920   PL=0                            ! PLAY LETTER BEING SCANNED
4930 NEXT'PL:
4940   IF(PL=LP) THEN GO TO END'SCAN
4950   PL=PL+1
4960   IF(NHOLES > 0 AND PLAYUCS$[PL,PL]=PLAY$[PL,PL]) THEN GO TO NEXT'PL
4970   LMATCH=0
4980
4990 NEXT'MATCH:
5000   NMATCH=INSTR(LMATCH+1,BOARDL$,PLAYUCS$[PL,PL])
5010   IF(NMATCH=0) THEN GO TO NEXT'PL
5020   MROW=INT((NMATCH-1)/15)+1 : MCOL=NMATCH-15*(MROW-1)
5030   DROW=0 : DCOL=1 : GOSUB TEST'PLAY : IF(NOYES$="Q") THEN GOTO TRY'WORD
5040   DROW=1 : DCOL=0 : GOSUB TEST'PLAY : IF(NOYES$="Q") THEN GOTO TRY'WORD
5050   LMATCH=NMATCH
5060   GO TO NEXT'MATCH
5070
5080 FIRST'PLAY:
5090   MROW=8 : MCOL=8
5100   PL=0
5110 FP1:
5120   PL=PL+1
5130   DROW=0 : DCOL=1 : GOSUB TEST'PLAY : IF(NOYES$="Q") THEN GOTO TRY'WORD
5140   DROW=1 : DCOL=0 : GOSUB TEST'PLAY : IF(NOYES$="Q") THEN GOTO TRY'WORD
5150   IF(PL<LP) THEN GO TO FP1
5160
5170 END'SCAN:
5180   GO TO CHECK'OLD'NEW
5190
5200 MAKE'PLAY:
5210   IF(NTP=0) THEN PRINT "Error --- no words in table"; CHR(7); : GO TO MENU
5220   WN=1
5230   FOR I=1 TO NTP
5240     IF(TPSCORE(I)>TPSCORE(WN)) THEN WN=I
5250   NEXT I
5260   PRINT TAB(16,50); TAB(-1,9); TAB(-1,12); "Which word # ? :"; WN;
5270   PRINT TAB(16,67);
5280   INPUT "" WN
5290   GOSUB WAIT
5300   PRINT TAB(24,1); TAB(-1,9);
5310   IF(WN >= 1 AND WN <= NTP) THEN GO TO DO'PLAY
5320   PRINT "Error --- not in table"; CHR(7);
5330   GO TO MENU
5340
5350 DO'PLAY:
5360   NTP=WN
5370   CASE=1
5380   GOSUB PLAY'WORD
5390   GOSUB ERASE'TABLE
5400   SCORE(YYY)=SCORE(YYY)+TPSCORE(NTP)
5410   IF(EOF(1)=-1) THEN GO TO CHALLENGE
5420   PRINT #1,TPWORD$(NTP);TAB(15);
543
0   PRINT #1, USING " #Z #Z !", TPROW(NTP),TPCOL(NTP),("HV")[TPDIR(NTP)+1,1];
5440   PRINT #1, USING " #ZZZ #ZZZ", TPSCORE(NTP),SCORE(NTP);
5450   PRINT #1,YYY;
5460   PRINT #1,WILDCARD'LETTER$
5470
5480 CHALLENGE:
5490   ! IF CHALLENGE SUCCEEDS ===> PLAYER LOSES TURN
5500   ! IF CHALLENGE FAILS ===> CHALLENGER LOSES NEXT TURN (FUTURE)
5510   ! AFTER CHALLENGE TIME, PLAYER IS IMMUNE TO FURTHER CHALLENGE
5520    CHAL = 1 : CALL DISPLAY'ALL'RACKS : CHAL = 0
5530    PRINT TAB(8,50);"Last word played was ";TPWORD$(NTP)
5540    PRINT TAB(10,50);
5550    INPUT "Challenge ?";CHAL$
5560    IF CHAL$[1,1] <> "Y" THEN PRINT TAB(8,50);SPACE(29);TAB(10,50);&
               SPACE(29); : GOTO NEXT'TURN1
5570    PRINT TAB(10,50);
5580    INPUT "Player # that is challenging ";NUM
5590 SUCCEED:
5600    PRINT TAB(12,48);
5610    INPUT "Did challenge succeed ?";YESNO1$
5620    FOR X = 8 TO 12 : PRINT TAB(X,48);SPACE(31); : NEXT X
5630    IF YESNO1$[1,1] = "Y" THEN SKIP = 0 : CALL UNPLAY'WORD : GOTO NEXT'TURN1
5640    IF YESNO1$[1,1] = "N" THEN SKIP = NUM : GOTO NEXT'TURN1
5650    GOTO SUCCEED
5660 NEXT'TURN1:
5670 REM ...... END
5680   IF LEN(RACK$(YYY)) = 0 AND TILES$ = SPACE(100) THEN GOTO END'GAME
5690   GO TO NEXT'TURN
5700
5710 REPLACE'LETTERS:
5720   REPLACE$=""
5730   PRINT TAB(16,50); TAB(-1,9); "Which letters ? : ";
5740   INPUT "" REPLACE$
5750   PRINT TAB(24,1); TAB(-1,9);
5760   R=LEN(REPLACE$)
5770   IF(R=0) THEN PRINT CHR(7); : GO TO MENU
5780   IF(R > 7) THEN PRINT CHR(7); : GO TO REPLACE'LETTERS
5790   WORKRACK$(YYY)=RACK$(YYY)
5800   IF(LEN(TILES$) >= R) THEN GO TO REPLACE'CHECK
5810   PRINT "Error --- only"; LEN(TILES$); "tiles left"; CHR(7);
5820   GO TO REPLACE'LETTERS
5830
5840 REPLACE'CHECK:
5850   NERROR=0
5860   FOR L=1 TO R
5870     I=INSTR(1,WORKRACK$(YYY),REPLACE$[L,L])
5880     IF(I=0) THEN NERROR=NERROR+1 : GO TO ENDL3
5890     IF(I=1) THEN WORKRACK$(YYY)=WORKRACK$(YYY)[I+1,LEN(WORKRACK$(YYY))] : GO TO ENDL3
5900     WORKRACK$(YYY)=WORKRACK$(YYY)[1,I-1]+WORKRACK$(YYY)[I+1,LEN(WORKRACK$(YYY))]
5910 ENDL3:
5920   NEXT L
5930
5940   IF(NERROR=0) THEN GO TO DO'REPLACE
5950   PRINT "Error --- mismatches rack"; CHR(7);
5960   GO TO REPLACE'LETTERS
5970
5980 DO'REPLACE:
5990   RACK$(YYY)=WORKRACK$(YYY)+TILES$[1,R]
6000   GOSUB DISPLAY'RACK
6010   TILES$=TILES$[R+1,LEN(TILES$)]+REPLACE$
6020   GOSUB SHUFFLE'LETTERS
6030   IF(NTP > 0) THEN GOSUB ERASE'TABLE
6040   GO TO NEXT'TURN
6050
6060 QUIT:
6070   REM ------ CHANGE THIS FOR MULTIUSERS
6080    PRINT #1,"//"
6090    PRINT #1,BOARDL$
6095    PRINT #1,B5$
6100    PRINT #1,NPLAYERS
6110    FOR X = 1 TO NPLAYERS : PRINT #1,RACK$(X) : NEXT X
6120    FOR X = 1 TO NPLAYERS : PRINT #1,SCORE(X) : NEXT X
6130    FOR X = 1 TO NPLAYERS : PRINT #1,INITIALS(X) : NEXT X
6140    PRINT #1,TILES$ : PRINT #1,YYY
6150   GO TO END'GAME
6160
6170 MENU2:
6180   PRINT "5=this,6=quit,7=delete,";
6190   PRINT "91=tiles,92=wait,93=crt,94=mem,95=demo,96=trail";
6200   GO TO MENU
6210
6220 DISPLAY'TILES:
6230   L=LEN(TILES$)
6240   PRINT "Tiles left : ";
6250   FOR I=0 TO 5 : PRINT TILES$[10*I+1;10]; " "; : NEXT I
6260 ! IF(L > 60) THEN PRINT TAB(23,79-(L-60)); TILES$[61,L];
6270   GO TO MENU
6280
6290 SET'WAIT:
6300   PRINT TAB(16,50); TAB(-1,9); "Seconds to wait : ";
6310   INPUT "" WAIT
6320   GO TO MENU
6330
6340 REDO'DISPLAY:
6350   PRINT TAB(-1,0); TAB(1,15); TAB(-1,12); "ALPHA SCRABBLE";
6360   GOSUB DISPLAY'BOARD
6370   GOSUB DISPLAY'MENU
6380   GOSUB DISPLAY'ALL'RACKS
6390   GOSUB DISPLAY'TABLE
6400   GO TO MENU
6410
6420 MEMORY:
6430   PRINT "Memory left ="; MEM; "bytes";
6440   GO TO MENU
6450
6460 CONVENTION:
6470   TILES$[ 1, 50]="NAEEIRLEFASSROOINEJPSTTIVOAEGADTWHANLEAEEIEGUMIQYV"
6480   TILES$[51,100]="SONPKEMFRXEGBIIBRNRU*IYTDLHTZWAOCOOLNOIDTUDUCAREA*"
6490   RACK$(YYY)=""
6500   GO TO NEXT'TURN
6510
6520 TRAIL:
6530   IF(EOF(1)=0) THEN GO TO MENU
6540   FILEN=0
6550 LOOKUP:
6560   FILEN=FILEN+1
6570   FNAME$="TRAIL."+STR(FILEN)
6580   LOOKUP FNAME$,THERE
6590   IF(THERE <> 0) THEN GO TO LOOKUP
6600
6610 REM ...... NAME FOUND
6620   OPEN #1, FNAME$, OUTPUT
6630   PRINT "Trail kept in file "; FNAME$;
6640   PRINT #1, "TRAIL OF SCRABBLE GAME FROM SEED"; SEED
6650   PRINT #1
6660   PRINT #1, "WORD----------- RW CL D SCOR TSCR P WL"
6670   GO TO MENU
6680
6690 REM ...... PUT OTHER SECRET COMMANDS HERE
6700
6710 DELETE'PLAY:
6720   IF(NTP=0) THEN PRINT "Error---no plays"; CHR(7); : GO TO MENU
6730   PRINT TAB(16,50); "Delete which # : ";
6740   DTP=0
6750   INPUT "" DTP
6760   PRINT TAB(24,1); TAB(-1,9);
6770   IF(DTP > 0 AND DTP <= NTP) THEN GO TO DO'DELETE
6780   PRINT "Error---out of range"; CHR(7); : GO TO MENU
6790
6800 DO'DELETE:
6810   NTP=NTP-1
6820   FOR ITP=DTP TO NTP+1
6830     IF(ITP <= NTP) THEN TABLEPLAY'ALL(ITP)=TABLEPLAY'ALL(ITP+1)
6840   NEXT ITP
6850   GOSUB DISPLAY'TABLE
6860   GO TO MENU
6870
6880 REM ...... STORE FINAL SCORES IN DATA FILE ?
6890
6900 WAIT:
6910   LTIME=TIME
6920 WAIT'LOOP:
6930   IF( (TIME-LTIME)/60 < WAIT) THEN GO TO WAIT'LOOP
6940   RETURN
6950
6960 END'GAME:
6970 ABORT'GAME:
6980   SAVE'YYY = YYY
6990!  GOSUB DISPLAY'ALL'RACKS
7000   IF LEN(RACK$(YYY))<>0 THEN GOTO FINISH
7010 NEXT'END:
7020   YYY = YYY + 1
7030   IF YYY > NPLAYERS THEN YYY = 1
7040   IF YYY = SAVE'YYY THEN GOTO DETERMINE'WINNER
7050   CALL DISPLAY'RACK
7060   FOR I=1 TO LEN(RACK$(YYY))
7070     CHAR$=RACK$(YYY)[I,I]
7080     GOSUB LETTER'SCORE
7090     TEMP'SCORE = TEMP'SCORE + LVALN
7100   NEXT I
7110   SCORE(YYY) = SCORE(YYY)-TEMP'SCORE
7120   SCORE(SAVE'YYY) = SCORE(SAVE'YYY)+TEMP'SCORE
7130   GOTO NEXT'END
7140 DETERMINE'WINNER:
7150   YYY = SAVE'YYY
7160   CALL DISPLAY'RACK
7170   WINNER = SCORE(1) : PLAYER = 1
7180   FOR X = 2 TO NPLAYERS
7190     IF WINNER < SCORE(X) THEN WINNER = SCORE(X) : PLAYER = X
7200   NEXT X
7210   PRINT TAB(10,50);"THE GAME IS OVER THE  "
7220   PRINT TAB(12,50);"WINNER IS PLAYER #";STR(PLAYER);" ";INITIALS(PLAYER);
7230   PRINT TAB(14,50);"CONGRATULATIONS !"
7240   IF EOF(1) = 0 THEN CLOSE #1
7250   END
7260 FINISH:
7270   IF(NTP > 0) THEN GOSUB ERASE'TABLE
7280   PRINT TAB(-1,12); TAB(24,1); TAB(-1,9);
7290   IF(EOF(1)=0) THEN CLOSE #1
7300   END
7310
7320 !---------------------------!
7330 !  VARIOUS SCREEN DISPLAYS  !
7340 !---------------------------!
7350
7360 DISPLAY'BOARD:
7370   PRINT TAB(-1,36);
7380   PRINT TAB(1,15); "ALPHA  SCRABBLE";
7390   FOR ROW=1 TO 15
7400     FOR COL=1 TO 15
7410       GOSUB DISPLAY'LETTER
7420     NEXT COL
7430   NEXT ROW
7440   PRINT TAB(-1,11);
7450   FOR ROWX = 2 TO 15
7460     PRINT TAB(ROWX,80);TAB(-1,30);TAB(ROWX+1,45);TAB(-1,31);
7470   NEXT ROWX
7480   PRINT TAB(-1,23);
7490   FOR COLX = 3 TO 42 STEP 3
7500     FOR ROWX = 3 TO 17
7510       PRINT TAB(ROWX,COLX);TAB(-1,47);
7520     NEXT ROWX
7530   NEXT COLX
7540   PRINT TAB(-1,24);
7550   FOR X = 1 TO NPLAYERS : PRINT TAB(X+18,35); INITIALS(X); : NEXT X
7560   PRINT TAB(-1,37);
7570   RETURN
7580
7590 DISPLAY'MENU:
7600   PRINT TAB(16,50); "What next ? : ";
7610   PRINT TAB(18,50); "(1) Rearrange letters";
7620   PRINT TAB(19,50); "(2) Try word";
7630   PRINT TAB(20,50); "(3) Make play";
7640   PRINT TAB(21,50); "(4) Replace letters";
7650   PRINT TAB(22,50); "(5) 2nd Menu";
7660   RETURN
7670
7680 ERASE'MENU:
7690   FOR I=16 TO 22
7700     PRINT TAB(I,50); TAB(-1,9);
7710   NEXT I
7720   RETURN
7730
7740 DISPLAY'ALL'RACKS:
7750   CLEAR=1                         ! # OF SPACES TO CLEAR RACK DISPLAY
7760   PRINT TAB(-1,11);
7770   FOR I=1 TO NPLAYERS
7780     PRINT TAB(I+18,1);"Player #";STR$(I);" : ";SCORE(I) USING "#ZZZ";" ";
7790 REM ...... DISPLAY A "#" FOR EACH LETTER IN A PLAYER'S RACK AND LETTER VALUE
7800     PRINT ("####### #######")[1,15]; SPACE$(CLEAR);
7810   NEXT I
7820   IF CHAL = 1 THEN RETURN
7830 DISPLAY'RACK:
7840   PRINT TAB(23,1);:INPUT "CR TO CONTINUE ";AA:PRINT TAB(23,1);SPACE(17);
7850   PRINT TAB(-1,12);
7860   P