100 DIM CP(15)
110 CALL CLEAR :: CALL SCREEN(4) :: RANDOMIZE
120 CALL CHAR(35,"FF81BDA1A1BD81FF")
130 CALL COLOR(9,4,4,10,4,4,2,4,4)
140 REM   TITLE LETTERS
150 RESTORE 550 :: FOR I=1 TO 8 :: READ LCP$ :: CALL CHAR(39+I,LCP$) :: NEXT I
160 DISPLAY AT(7,5):"PRESENTING "
170 DISPLAY AT(10,5):"""(.(((.( ( (+(.(.(+ """ :: DISPLAY AT(11,6):"( (/(/( ( (*((()(*" :: DISPLAY AT(12,6):"(/((((()()()(((/()"
180 CALL COLOR(2,5,4) :: DISPLAY AT(15,12):"A DICE GAME BY" :: DISPLAY AT(17,18):"BEN VANG" :: DISPLAY AT(24,5):"# COPY RIGHT 1984"
190 REM  DICE DESIGNS
200 CALL CHAR(116,"3F408080808083838380808080403F00F804020202028282820202020204F800")
210 CALL CHAR(120,"3F409C9C9C8080808080808080403F00F804020202020202020272727204F800")
220 CALL CHAR(124,"3F409C9C9C8083838380808080403F00F804020202028282820272727204F800")
230 CALL CHAR(128,"3F409C9C9C80808080809C9C9C403F00F804727272020202020272727204F800")
240 CALL CHAR(132,"3F409C9C9C80838383809C9C9C403F00F804727272028282820272727204F800")
250 CALL CHAR(136,"3F409C9C9C809C9C9C809C9C9C403F00F804727272027272720272727204F800")
260 CALL CHAR(140,"3F7FFFFFFFFFFFFFFFFFFFFFFF7F3F00F8FCFEFEFEFEFEFEFEFEFEFEFEFCF800")
270 CALL CHAR(33,"00007F3E1C080000")!POINTER TO CURRENT PLAYER
280 REM
290 REM  DEFINE EXTRA LETTERS
300 DATA 65,66,68,69,73,76,78,79,80,82,83,84,85,87,89
310 RESTORE 300 :: FOR I=1 TO 15 :: READ CP(I) :: CALL CHARPAT(CP(I),CP$) :: CALL CHAR(I+96,CP$) :: NEXT I
320 CALL CHAR(96,"")
330 CALL CLEAR
340 DISPLAY AT(12,6):"INSTRUCTIONS? Y" :: ACCEPT AT(12,20)BEEPVALIDATE("YN")SIZE(-1):YN$ :: DISPLAY AT(12,1):""
350 IF YN$="N" THEN 360 ELSE GOSUB 1810
360 CALL MAGNIFY(4) :: CALL COLOR(2,4,4)
370 DISPLAY AT(16,14):"`````````" :: DISPLAY AT(17,14):"`jhmgc  `" :: DISPLAY AT(18,14):"`````````"
380 DISPLAY AT(21,10):"ifaodj`a ifaodj`b" :: DISPLAY AT(22,10):"`iheglk` `iheglk`"
390 DISPLAY AT(23,10):"`      ` `      `" :: DISPLAY AT(24,10):"```````` ````````"
400 DISPLAY AT(1,9):"(.(((.( ( (+(.(.(+" :: DISPLAY AT(2,9):"( (/(/( ( (*((()(*" :: DISPLAY AT(3,9):"(/((((()()()(((/()"
410 CALL COLOR(9,16,13,10,16,13,2,5,4)
420 REM
430 REM  INITIATE GAME
440 FOR I=5 TO 14 :: CALL HCHAR(I,10,32,23) :: NEXT I
450 PAT=116 :: SR=1 :: GOSUB 580
460 FOR I=1 TO 5 :: CALL SPRITE(#I,PAT,2,SR,25,#I+5,140,16,SR,25) :: SR=SR+40 :: PAT=PAT+4 :: CALL SOUND(-50,500-I*50,3) :: NEXT I
470 DISPLAY AT(9,10):"PLEASE ENTER NAMES" :: DISPLAY AT(10,10):"OF THE PLAYERS"
480 DISPLAY AT(12,10):"A" :: DISPLAY AT(14,10):"B"
490 ACCEPT AT(12,12)BEEP :NAME$(1) :: ACCEPT AT(14,12)BEEP :NAME$(2) :: CALL PAUSE(500)
500 IF NAME$(2)="" THEN NAME$(2)="THE COMPUTER" :: DISPLAY AT(14,12):NAME$(2) :: CALL PAUSE(500)
510 DISPLAY AT(9,10):"" :: DISPLAY AT(10,10):"" :: DISPLAY AT(12,10):"" :: DISPLAY AT(14,10):""
520 CALL PAUSE(500) :: GOTO 1430
530 REM
540 REM  DATA FOR LARGE CAPITALS
550 DATA 0F0F0F0F0F0F0F0F,00000000FFFFFFFF,00000000F0F0F0F0,FFFFFFFF00000000
560 DATA 00000000FFFFFFFF,0000007E7E000000,FFFFFFFF0F0F0F0F,0F0F0F0FFFFFFFFF
570 REM
580 REM  RESET VALUES
590 DISPLAY AT(23,10):"`      ` `      `"
600 DISPLAY AT(24,10):"```````` ````````"
610 ROUND=1 :: SC1=0 :: SC2=0 :: PL=1
620 DISPLAY AT(20,10):"!" :: DISPLAY AT(17,20)SIZE(2):"1"
630 SC=0
640 FOR I=1 TO 5 :: HOLD(I)=0 :: NEXT I
650 RETURN
660 REM
670 REM  ERASE AND SHAKE
680 CALL VCHAR(1,9,32,24)
690 FOR I=1 TO 5 :: IF HOLD(I)=72 THEN 710
700 CALL COLOR(#I,4,#I+5,4) :: CALL PAUSE(30)
710 CALL SOUND(-50,500-I*50,3) :: NEXT I
720 FOR I=1 TO 5 :: IF HOLD(I)=72 THEN 750
730 DX(I)=INT(RND*6)*4+116 :: CALL PATTERN(#I,DX(I))
740 CALL SOUND(-50,260+I*50,5)
750 CALL COLOR(#I,2,#I+5,16) :: CALL PAUSE(30) :: NEXT I :: RETURN
760 REM
770 REM  HOLD DICE
780 IF NAME$(2)="THE COMPUTER" AND PL=2 THEN GOSUB 860 :: RETURN
790 CALL VCHAR(1,9,32,24)
800 FOR I=1 TO 5 :: CALL SOUND(50,500,5)
810 CALL HCHAR(I*5-2,9,60) :: CALL WAIT(K) :: CALL SOUND(30,400,5) :: CALL SOUND(30,300,5)
820 IF K=72 OR K=80 OR K=82 THEN 830 ELSE 810
830 IF K=82 THEN 790
840 CALL HCHAR(I*5-2,9,K) :: HOLD(I)=K :: NEXT I :: RETURN
850 REM
860 REM  COMPUTER HOLD ROUTINE
870 H6,H5,H4,H3,HX,X=0
880 FOR I=1 TO 5 :: HOLD(I)=0 :: NEXT I
890 FOR I=1 TO 5
900 IF DX(I)=136 THEN H6=H6+1 :: GOTO 940
910 IF DX(I)=132 THEN H5=H5+1 :: GOTO 940
920 IF DX(I)=128 THEN H4=H4+1 :: GOTO 940
930 IF DX(I)=124 THEN H3=H3+1
940 NEXT I
950 IF THROW=1 AND H6>=3 THEN 960 ELSE IF THROW=2 AND H6>=4 THEN 960 ELSE 1010
960 FOR I=1 TO 5
970 IF DX(I)=136 THEN HOLD(I)=72 :: IF THROW=2 THEN 980 ELSE 1000
980 IF(H6>=4)*(THROW=2)*(DX(I)=136)THEN HOLD(I)=72 :: GOTO 1000
990 HOLD(I)=80
1000 NEXT I
1010 IF H5>=2 THEN 1020 ELSE IF H4>=2 THEN 1030 ELSE IF H3>=2 THEN 1040 ELSE 1150
1020 IF H5>=H4 OR H5>=H3 THEN X=132 :: GOTO 1050
1030 IF H4>=H3 THEN X=128 :: GOTO 1050
1040 X=124 :: GOTO 1050
1050 FOR I=1 TO 5
1060 IF DX(I)=X THEN HOLD(I)=72 :: HX=HX+1
1070 IF HX=3 THEN 1100
1080 NEXT I
1090 IF HX<>3 THEN 1150
1100 FOR I=1 TO 5
1110 IF HOLD(I)=72 THEN 1140
1120 IF DX(I)=136 OR DX(I)=116 THEN HOLD(I)=72 :: GOTO 1140
1130 IF DX(I)=120 THEN HOLD(I)=80
1140 NEXT I
1150 FOR I=1 TO 5
1160 IF HOLD(I)=72 THEN CALL HCHAR(I*5-2,9,72)ELSE CALL HCHAR(I*5-2,9,80)
1170 CALL SOUND(30,400,5) :: CALL SOUND(30,300,5) :: CALL PAUSE(150)
1180 NEXT I :: RETURN
1190 REM
1200 REM  SCORE CONTROL
1210 IF PL=1 THEN SC1=SC1+SC ELSE IF PL=2 THEN SC2=SC2+SC
1220 DISPLAY AT(23,11)SIZE(6):SC1
1230 DISPLAY AT(23,20)SIZE(6):SC2
1240 IF PL=1 THEN PL=2 ELSE IF PL=2 THEN PL=1
1250 IF PL=1 THEN DISPLAY AT(20,10):"!"
1260 IF PL=2 THEN DISPLAY AT(20,10):"         !"
1270 IF PL=1 THEN ROUND=ROUND+1
1280 IF ROUND=OVER THEN 1300
1290 RD$=STR$(ROUND) :: DISPLAY AT(17,20)SIZE(2):RD$
1300 RETURN
1310 REM
1320 REM  DECIDE WINNER
1330 IF SC1>SC2 THEN DISPLAY AT(24,11)SIZE(6):"neggdj" ELSE 1350
1340 DISPLAY AT(12,10):NAME$(1);" WINS" :: GOTO 1400
1350 IF SC2>SC1 THEN DISPLAY AT(24,20)SIZE(6):"neggdj" ELSE 1380
1360 DISPLAY AT(12,10):NAME$(2);" WINS"
1370 REM  CALL SOUND
1380 IF SC1=SC2 THEN DISPLAY AT(24,10):"``led``` ``led```" ELSE 1400
1390 DISPLAY AT(12,10):"IT'S A TIE"
1400 REM  SOUND
1410 RETURN
1420 REM
1430 ! DICE CHALLENGE GAME
1440 OVER=26
1450 DISPLAY AT(10,10)BEEP :"WHEN READY TO PLAY" :: DISPLAY AT(11,10):"PRESS ANY KEY"
1460 CALL WAIT(K) :: DISPLAY AT(10,10):"" :: DISPLAY AT(11,10):"" :: DISPLAY AT(12,10):NAME$(PL);" PLAYS"
1470 THROW,SC,ONES,THREES,FOURS,FIVES,SIXES=0
1480 TWOS=0 :: THROW=THROW+1 :: IF THROW=4 THEN 1570 ELSE GOSUB 670
1490 FOR I=1 TO 5
1500 IF DX(I)=120 THEN TWOS=TWOS+1
1510 IF TWOS=3 THEN SC=SC-500 ELSE 1530
1520 FOR SD=1010 TO 110 STEP-100 :: CALL SOUND(30,SD,5) :: NEXT SD :: DISPLAY AT(14,14):"SCORE";SC :: GOTO 1480
1530 NEXT I
1540 TWOS=0
1550 IF THROW=3 THEN 1570
1560 GOSUB 770 :: GOTO 1480
1570 FOR I=1 TO 5
1580 IF DX(I)=136 THEN SIXES=SIXES+1 :: GOTO 1640
1590 IF DX(I)=132 THEN FIVES=FIVES+1 :: GOTO 1640
1600 IF DX(I)=128 THEN FOURS=FOURS+1 :: GOTO 1640
1610 IF DX(I)=124 THEN THREES=THREES+1 :: GOTO 1640
1620 IF DX(I)=120 THEN TWOS=TWOS+1 :: GOTO 1640
1630 IF DX(I)=116 THEN ONES=ONES+1
1640 NEXT I
1650 IF SIXES=5 THEN SC=SC+1000 :: GOTO 1730
1660 IF FIVES>=3 THEN SC=SC+500 :: GOTO 1700
1670 IF FOURS>=3 THEN SC=SC+400 :: GOTO 1700
1680 IF THREES>=3 THEN SC=SC+300 :: GOTO 1700
1690 IF TWOS>=3 THEN TWOS=TWOS-3
1700 SC=SC+(SIXES*50)
1710 SC=SC+(ONES*50)
1720 SC=SC-(TWOS*50)
1730 DISPLAY AT(14,14):"SCORE";SC :: CALL PAUSE(500)
1740 GOSUB 1200 :: IF ROUND=OVER THEN 1790
1750 IF(PL=1)*((SC1>=5000)+(SC2>=5000))THEN 1790 ELSE DISPLAY AT(12,10)BEEP :NAME$(PL);" PLAYS"
1760 IF NAME$(PL)="THE COMPUTER" THEN DISPLAY AT(14,14):"" :: GOTO 1780
1770 DISPLAY AT(14,10)BEEP :"PRESS KEY TO START" :: CALL WAIT(K) :: DISPLAY AT(14,8):""
1780 GOSUB 630 :: GOTO 1470
1790 GOSUB 1320
1800 CALL WAIT(K) :: GOTO 430
1810 REM  INSTRUCTIONS
1820 CALL CLEAR :: DISPLAY AT(1,8):"INSTRUCTIONS"
1830 DISPLAY AT(3,1):"THE GAME IS PLAYED OVER 25":"ROUNDS OR TO 5000 POINTS":"WHICHEVER COMES FIRST"
1840 DISPLAY AT(7,1):"TWO PERSONS MAY PLAY OR ONE":"PERSON PLAY AGAINST THE":"COMPUTER"
1850 DISPLAY AT(11,1):"TO PLAY AGAINST THE COMPUTER":"JUST PRESS ENTER FOR NAME":"OF PLAYER B"
1860 DISPLAY AT(15,1):"IN EACH ROUND THE DICE ARE":"ROLLED THREE TIMES AND THE":"SCORE IS THEN CALCULATED"
1870 DISPLAY AT(19,1):"AFTER FIRST AND SECOND ROLL":"THE DICE MAY BE HELD BY":"PRESSING H OR PLAYED BY":"PRESSING P"
1880 DISPLAY AT(24,1):"PRESS A KEY TO CONTINUE" :: CALL WAIT(K) :: CALL CLEAR
1890 DISPLAY AT(1,1):"IF H OR P IS PRESSED BY":"MISTAKE JUST PRESS R BEFORE":"LAST ENTRY TO CORRECT"
1900 DISPLAY AT(5,1):"SCORING:"
1910 DISPLAY AT(7,1):"5 SIXES  = 1000 POINTS":"3 FIVES  =  500 POINTS":"3 FOURS  =  400 POINTS":"3 THREES =  300 POINTS"
1920 DISPLAY AT(11,1):"3 TWOS   = -500 POINTS"
1930 DISPLAY AT(13,1):"ONES SCORE 50 POINTS AND IF":"THERE'S LESS THAN 5 SIXES":"THE SIXES ALSO SCORE 50":"POINTS EACH"
1940 DISPLAY AT(18,1):"AFTER LAST ROLL ANY TWOS":"WILL SCORE -50 EACH"
1950 DISPLAY AT(21,1):"GOOD LUCK"
1960 DISPLAY AT(24,1):"PRESS ENTER TO START" :: CALL WAIT(K) :: CALL CLEAR :: RETURN
1970 SUB WAIT(K)
1980 CALL KEY(0,K,S) :: IF S=0 THEN 1980
1990 SUBEND
2000 SUB PAUSE(T)
2010 FOR D=1 TO T :: NEXT D
2020 SUBEND
