! ! D5000U - UPDATE rename to ! D5000C - COLOR VERSION OF D5000 ! !*************************** AMUS Program Label ****************************** ! Filename: D5000C.RUN Date: 12/06/93 ! Category: GAME Hash Code: 615-507-304-012 Version: 3.0(110) ! Initials: low/AM Name: David Krecklow ! Company: Compu-Center Co., Inc. Telephone #: 8053251004 ! Related Files: D5000U.BAS, D5000U.HLP, D5000.CMD, D5000.INT ! Min. Op. Sys.: ANY Expertise Level: BEG ! Special: N ! Description: Uses ACCEPT.SBR, NOECHO.SBR, SLEEP.SBR & TRMCHR.SBR ! A Dice Game (see D5000U.HLP for explination) ! !***************************************************************************** PROGRAM D5000C,3.0(110) SIGNIFICANCE 11 ! *********************************************************************** ! * * ! * ******** **** **** **** * * ! * * **** * * * * * * * * ! * ** ** * * * * * * * * ! * ** * * * * * * * ! * ****** **** **** **** * * ! * * ! *********************************************************************** ! ! A COMPUTER DICE GAME by David Krecklow 01/01/1984 ! 805/325-1004 ! D5000C - COLOR VERSION 07/15/1990 ! cleaned up 08/01/1991 ! ! This game may not be copied or reproduced in any ! manner for sale without permission of the author. ! ! Donated to AMUS 08/16/91 100 MAP1 NOP,F !number of players MAP1 NOD,F !number of dice MAP1 W,F !winning score MAP1 MSOB,F !minimum score to get on the board MAP1 MS,F !minimum score MAP1 NM,S,10 MAP1 WORKING'VAR MAP2 X$,S,10 MAP2 X,F MAP2 I,F MAP2 NO1,F MAP2 NO2,F MAP2 NO3,F MAP2 NO4,F MAP2 NO5,F MAP2 NO6,F MAP2 XD,F MAP2 R,F MAP2 CL,F MAP2 DICNT,F MAP2 REAL'TUFF,F MAP2 TUFF,F MAP2 WINR,F MAP2 K,F MAP2 L,F MAP2 T,F MAP2 PLR,F MAP2 LAST,F MAP2 RCTL,F MAP2 TCTL,F MAP2 NMCTL,F MAP2 NOTHING,F MAP2 MINUS,F MAP2 TOTAL,F MAP2 SCORE,F MAP2 WIN'SCR,F MAP2 PK,F MAP2 RL,F MAP2 ENTRY,F,6 MAP2 DELAY,B,2,3 MAP2 CHAR,B,1 MAP1 INT'DATA MAP2 SPIN'FLG,F,6,1 ! spin flag 1 = true MAP2 SPIN'DRG,F,6,.1 ! spin drag used for xcall sleep time MAP2 MDLAY,F,6,3 ! message delay time MAP2 WFCLR,F,6,5 ! writing fore & back colors MAP2 WBCLR,F,6,0 MAP2 DFCLR,F,6,1 ! dice fore & back colors MAP2 DBCLR,F,6,4 MAP2 GFCLR,F,6,9 ! grid fore & back colors MAP2 GBCLR,F,6,10 MAP2 SFCLR,F,6,0 ! score fore & back colors MAP2 SBCLR,F,6,9 MAP2 IFCLR,F,6,1 ! insult fore & back colors MAP2 IBCLR,F,6,2 MAP2 MFCLR,F,6,0 ! message fore & back colors MAP2 MBCLR,F,6,3 MAP2 NFCLR,F,6,1 ! name fore & back colors MAP2 NBCLR,F,6,4 MAP2 ILINE,S,30 ! ini file input line MAP1 ROLL(6) MAP2 DI,F MAP2 DICTL,F MAP2 NO,F MAP2 GT,F MAP2 XX,S,9 MAP2 PLRROW,F MAP2 PLNAM,S,10 ! !VARIABLES FOR TRMCHR.SBR ! ! MAP1 XTC'MAP MAP2 XTC'FLG,F ! flags MAP2 XTC'ROWS,F ! number of rows MAP2 XTC'COLS,F ! number of columns MAP2 XTC'CLR,F ! number of colors supported MAP2 XTC'FORE,F ! current foreground color MAP2 XTC'BACK,F ! current background color MAP2 XTC'WROW,F ! rows in current window MAP2 XTC'WCOL,F ! columns in current window 200 MAP1 DESC,S,36," ONES TWOS THREESFOURS FIVES SIXES " XX(1)=" * " ! ,-----, XX(2)="* *" ! | * * | XX(3)="* * *" ! | * * | XX(4)="* * * *" ! | * * | XX(5)="* * * * *" ! `-----' XX(6)="* ** ** *" ON ERROR GOTO ER'TRAP XCALL NOECHO XCALL TRMCHR,XTC'STAT,XTC'MAP !============================================================ ! START: ? TAB(-1,14);TAB(-1,0);TAB(1,5); ? TAB(-2,1)TAB(-3,4);" 5 0 0 0 - A COMPUTER DICE GAME"; & " by David Krecklow " CALL CHECK'INI ? TAB(-2,7);TAB(-3,0); CALL BART'SAYS START1: ? TAB(3,1);"Enter the number of players (up to six) "; XCALL ACCEPT,ENTRY X$=CHR(ENTRY) NOP=VAL(X$) ? NOP; IF NOP<1 OR NOP>6 THEN ? CHR(7); : GOTO START1 !=============================================== ! NAMES: ? TAB(-2,1); ? TAB(3,1);TAB(-1,10);"Now enter the names of each Player " NMCTL=0 FOR I= 1 TO NOP NAM0: IF I>NOP THEN GOTO NMCNG FCLR=1+I BCLR=0 IF FCLR=2 OR FCLR=4 OR FCLR=6 THEN BCLR=1 ? TAB(-2,FCLR);TAB(-3,BCLR); ? TAB(I+4,9);" Player #";I;"__________ "; FOR K=1 TO 10 NAM1: ? TAB(I+4,K+20); XCALL ACCEPT,ENTRY X=ENTRY IF X=13 THEN K=10 : GOTO NAM2 IF X=127 AND K>1 THEN K=K-1 : PLNAM(I)[K,K]="" : & ? TAB(I+4,K+20);"_";TAB(I+4,K+20); : GOTO NAM1 IF X=127 AND K=1 THEN GOTO NAM1 IF X<32 OR X>126 THEN ? CHR(7); : GOTO NAM1 ? TAB(I+4,K+20);CHR(X); PLNAM(I)[K,K]=CHR(X) NAM2: NEXT K X=(9-INT(LEN(PLNAM(I))))/2 : X=INT(X) NM=PLNAM(I) IF X>0 THEN PLNAM(I)=SPACE(X)+NM PLNAM(I)=PLNAM(I)+SPACE(10) ON NMCTL GOTO NMCNG NEXT I NMCNG: ? TAB(-2,1);TAB(-3,0); NMCTL=1 ? TAB(23,1);TAB(-1,9);"Player number to change or 'RET' > "; XCALL ACCEPT,ENTRY : I=ENTRY IF I>48 AND I<55 THEN I=I-48 : PLNAM(I)="" : GOTO NAM0 !============================================================ ! DEFAULTS: NOD=5 W=5 MSOB=500 MS=50 !============================================================ ! INSTRUC: ? TAB(3,1);TAB(-1,10); ? TAB(-2,7) ? "This game is played by rolling five dice at the start of each TURN" ? " A TURN consists of one or more ROLLS, you may keep rolling " ? " as long as you score with at least one di" ? " If no dice on a roll score your turn is over and you lose your" ? " points for that turn" ? TAB(-2,6) ? "If you score you may pick up the non-scoring dice and keep rolling" ? " or stop and take your points" ? " You may also pick up dice that score on each roll as long as you" ? " leave at least 50 points on each roll" ? TAB(-2,5) ? "Scores requiring more than one di must all be in one roll" ? "You may not combine dice from seperate rolls into scoring combinations" ? " Five of a kind wins the game " ? " Straights (1-5 or 2-6) score 1500" ? " Three ones scores 1000" ? " Three of anything else scores that number times 100" ? "Ones not included in other combinations score 100" ? "Fives not included in other combinations score 50" ? ? TAB(-2,1); ? "Any key to continue >"; XCALL ACCEPT,ENTRY ? ? TAB(-2,6) ? "You must score ";MSOB;" to get on the board the first time " ? "Enter the numbers of the dice to pick up after your roll" ? " Non-scoring dice will be picked-up automatically" ? "Enter a 'S' or '.' to stop your turn and take your score " ? " or RETURN to roll again" ? "If all five dice score after one or more rolls they will all roll again" ? " and you may continue your turn till you stop or fail to score" ? "If none of the dice rolled scores you lose your points for that turn" ? " and the next player rolls" ? TAB(-2,3); ? "5000 wins the game - each player gets one more turn to top the winner" ? " If another player tops the winner the game continues until" ? " all other players including the original winner get one more turn" ? ? TAB(-2,1); ? "PRESS RETURN to start the game >"; XCALL ACCEPT,ENTRY !============================================================ ! SCREEN: ? TAB(-1,14);TAB(-1,0) ? TAB(-1,23);TAB(-2,GFCLR);TAB(-3,GBCLR); FOR L=1 TO 13 FOR T=1 TO NOP ? TAB(-1,11);TAB(-1,47);TAB(-1,12);SPACE(11); ? TAB(-1,11);TAB(-1,47);TAB(-1,12); NEXT T ? NEXT L ? TAB(-1,13);TAB(1,1); FOR T=1 TO NOP ? TAB(-1,11);TAB(-1,47);" ";TAB(-1,12);TAB(-1,24); & TAB(-2,NFCLR)TAB(-3,NBCLR);PLNAM(T); & TAB(-2,GFCLR);TAB(-3,GBCLR); & TAB(-1,23);TAB(-1,11);TAB(-1,47);TAB(-1,12); NEXT T FOR T=1 TO NOP ? TAB(2,((T*13)-12));TAB(-1,44); ? TAB(-1,11); FOR L=1 TO 11 ? TAB(-1,46); NEXT L ? TAB(-1,43); ? TAB(-1,12); NEXT T FOR T=1 TO NOP ? TAB(13,((T*13)-12));TAB(-1,44); ? TAB(-1,11); FOR L=1 TO 11 ? TAB(-1,46); NEXT L ? TAB(-1,43); ? TAB(-1,12); NEXT T FOR T=1 TO NOP ? TAB(15,((T*13)-12));TAB(-1,40); ? TAB(-1,11); FOR L=1 TO 11 ? TAB(-1,46); NEXT L ? TAB(-1,41); ? TAB(-1,12); NEXT T ? TAB(-1,24);TAB(-2,WFCLR);TAB(-3,WBCLR); !============================================================ ! ! MAIN LOOP FOR PLAY ! UP: FOR PLR=1 TO NOP IF LAST=PLR THEN PLR=10 : GOTO EUP CALL CLEAR'DICE : CALL CLEAR'SCR ? TAB(16,1);TAB(-1,10);SPACE(80);TAB(16,1); & TAB(PLR*12-8+PLR-2); & TAB(-2,1);TAB(-3,2);" UP ^ "; & TAB(-2,WFCLR);TAB(-3,WBCLR); RCTL=0 ? TAB(17,1);TAB(-1,9);"RETURN to roll....."; XCALL ACCEPT,ENTRY IF UCS(CHR(ENTRY))="M" CALL MENU CALL ROLL ! return @ end'roll IF RCTL=0 AND LAST<1 THEN GOTO TUFF IF RCTL=0 AND LAST>0 THEN GOTO REAL'TUFF EUP: NEXT PLR IF PLR>9 THEN GOTO DONE GOTO UP !================================================================= ! ROLL THE DICE ! ROLL: XD=NOD NXT'ROLL: RCTL=0 ? TAB(17,1);TAB(-1,10);TAB(-1,7); FOR R=1 TO XD DI(R)=INT(6*RND(0)+1) DICTL(R)=0 IF DI(R)=1 THEN NO1=NO1+1 : IF RCTL<2 THEN RCTL=RCTL+1 IF DI(R)=2 THEN NO2=NO2+1 IF DI(R)=3 THEN NO3=NO3+1 IF DI(R)=4 THEN NO4=NO4+1 IF DI(R)=5 THEN NO5=NO5+1 : IF RCTL<2 THEN RCTL=RCTL+1 IF DI(R)=6 THEN NO6=NO6+1 NEXT R RANDOMIZE !================================================================= ! DISPLAY DICE ! CALL CLEAR'DICE : CALL CLEAR'SCR ? TAB(-1,23);TAB(-1,29); ? TAB(-2,DFCLR);TAB(-3,DBCLR); FOR CL=1 TO XD SPIN=CL CALL SPIN'DICE FOR R=1 TO 5 IF R=1 THEN ? TAB(16+R,CL*8);TAB(-1,38); & TAB(-1,46);TAB(-1,46);TAB(-1,46);TAB(-1,46);TAB(-1,46); & TAB(-1,39); : GOTO NXT'R IF R=5 THEN ? TAB(16+R,CL*8);TAB(-1,40); & TAB(-1,46);TAB(-1,46);TAB(-1,46);TAB(-1,46);TAB(-1,46); & TAB(-1,41); : GOTO NXT'R ? TAB(16+R,CL*8);TAB(-1,47);" ";TAB(-1,24); & (XX(DI(CL))[((R-1)*3-2);3]);TAB(-1,23); & " ";TAB(-1,47); NXT'R: NEXT R NEXT CL ? TAB(-1,24);TAB(-1,28);TAB(-2,WFCLR);TAB(-3,WBCLR); ? TAB(-1,8); !================================================================= ! CHECK SCORE ! IF NO1=5 OR NO2=5 OR NO3=5 OR NO4=5 OR NO5=5 OR NO6=5 THEN GOTO FIVE IF (NO1>0 AND NO2>0 AND NO3>0 AND NO4>0 AND NO5>0) OR & (NO2>0 AND NO3>0 AND NO4>0 AND NO5>0 AND NO6>0) THEN CALL STRGHT IF (NO1>2 OR NO2>2 OR NO3>2 OR NO4>2 OR NO5>2 OR NO6>2) THEN CALL THREE IF RCTL=0 THEN GOTO END'ROLL SCORE=SCORE+(NO1*100)+(NO5*50) CALL DISP'SCR SCORE: FOR I=1 TO XD ? TAB(22,I*8+4);I USING "#"; IF DICTL(I)=3 THEN ? "*"; NEXT I CXD=XD IF RCTL>=3 THEN CXD=CXD-RCTL CXD=CXD-NO1-NO5 IF CXD<1 THEN ? TAB(-2,MFCLR);TAB(-3,MBCLR); & TAB(21,51);SPACE(27);TAB(-1,22); & TAB(21,50);TAB(-1,21); & " ALL DICE MAY ROLL AGAIN ";TAB(-1,22); & TAB(-2,WFCLR);TAB(-3,WBCLR); IF XD>1 THEN IF RCTL>1 AND RCTL<5 THEN CALL PICK'UP IF LAST<>0 THEN IF SCORE+TOTAL+GT(PLR)<=WIN'SCR THEN & ? TAB(23,1);TAB(-1,10);"You must beat ";WIN'SCR;" RETURN to roll..."; : & XCALL ACCEPT,ENTRY : RL=0 : GOTO SCR1 IF LAST<>0 THEN IF SCORE+TOTAL+GT(PLR)>WIN'SCR THEN CALL NEW'WINR : & GT(PLR)=SCORE+TOTAL+GT(PLR) : & XCALL ACCEPT,ENTRY : RL=0 : GOTO SCR1 SCR0: ? TAB(23,1);TAB(-1,10);"RETURN to roll again or 'S' or '.' to stop "; XCALL ACCEPT,ENTRY : RL=ENTRY IF RL=27 THEN GOTO SCORE IF RL<>13 AND RL<>83 AND RL<>115 AND RL<>46 THEN GOTO SCR0 SCR1: IF RCTL>=3 THEN XD=XD-RCTL XD=XD-NO1-NO5 NO1=0 : NO2=0 : NO3=0 : NO4=0 : NO5=0 : NO6=0 IF XD<1 THEN XD=NOD TOTAL=TOTAL+SCORE SCORE=0 ? TAB(21,50);TAB(-1,35); IF RL<>83 AND RL<>115 AND RL<>46 THEN GOTO NXT'ROLL !============================================================ ! END'ROLL: IF RCTL<>0 THEN IF (TOTAL+GT(PLR))0 THEN GT(PLR)=GT(PLR)+TOTAL IF RCTL<>0 THEN IF PLRROW(PLR)>9 THEN CALL CLEAR'COL : & PLRROW(PLR)=1 : & ? TAB(PLRROW(PLR)+2,PLR*13-9); & (GT(PLR)-TOTAL) USING "######";" *"; IF RCTL<>0 THEN PLRROW(PLR)=PLRROW(PLR)+1 : & ? TAB(PLRROW(PLR)+2,PLR*13-9);TOTAL USING "######"; TOTAL=0 ? TAB(14,PLR*13-9);GT(PLR) USING "######"; ? TAB(-2,WFCLR);TAB(-3,WBCLR); IF LAST=0 THEN IF GT(PLR)>4999 THEN CALL OVER'FIVE RETURN !============================================================ ! PICK'UP: ? TAB(23,1);TAB(-1,10);"ENTER the number of the di to reroll "; XCALL ACCEPT,ENTRY : PK=ENTRY IF PK=13 THEN ? TAB(24,1);SPACE(50); : & RETURN X$=CHR(PK) : PK=VAL(X$) IF X$="0" THEN RETURN IF PK<1 OR PK>5 THEN GOTO PICK'UP IF PK>XD THEN ? TAB(-2,MFCLR);TAB(-3,MBCLR); & TAB(24,1);CHR(7);" 1 to ";XD;" "; & TAB(-2,WFCLR);TAB(-3,WBCLR); : & XCALL ACCEPT,ENTRY : & PK=ENTRY : GOTO PICK'UP IF DICTL(PK)=9 THEN ? TAB(-2,MFCLR);TAB(-3,MBCLR); & TAB(24,1);CHR(7);" YOU HAVE PICKED UP THAT "; & "ONE BEFORE ";TAB(-2,WFCLR);TAB(-3,WBCLR); : & XCALL ACCEPT,ENTRY : GOTO PICK'UP IF DICTL(PK)=3 THEN GOTO PICK'UP'THREE IF DI(PK)=1 THEN GOTO PICK'UP'ONE IF DI(PK)=5 THEN GOTO PICK'UP'FIVE CALL CLEAR'DICE1 GOTO PICK'UP PICK'UP'ONE: SCORE=SCORE-100 IF SCORE<50 THEN GOTO PICK'UP'ERR NO1=NO1-1 DICTL(PK)=9 CALL CLEAR'DICE1 CALL DISP'SCR GOTO PICK'UP PICK'UP'FIVE: SCORE=SCORE-50 IF SCORE<50 THEN GOTO PICK'UP'ERR NO5=NO5-1 DICTL(PK)=9 CALL CLEAR'DICE1 CALL DISP'SCR GOTO PICK'UP PICK'UP'THREE: MINUS=100*DI(PK) IF DI(PK)=1 THEN MINUS=1000 SCORE =SCORE-MINUS IF SCORE<50 THEN GOTO PICK'UP'ERR FOR R=1 TO XD IF DICTL(R)=3 THEN PK=R : CALL CLEAR'DICE1 : & DICTL(R)=9 NEXT R CALL DISP'SCR RCTL=1 GOTO PICK'UP PICK'UP'ERR: ? TAB(23,1);TAB(-1,10);CHR(7); & "YOU MUST KEEP AT LEAST 50 POINTS ON EACH ROLL "; XCALL ACCEPT,ENTRY SCORE=SCORE+MINUS GOTO PICK'UP !============================================================ ! DISP'SCR: ? TAB(-2,SFCLR);TAB(-3,SBCLR); ? TAB(17,55);" This roll "; ? TAB(-2,2);TAB(-3,1);SCORE USING "#####";" "; ? TAB(-2,SFCLR);TAB(-3,SBCLR); ? TAB(18,55);" This turn "; ? TAB(-2,1);TAB(-3,2);(SCORE+TOTAL) USING "#####";" "; ? TAB(-2,SFCLR);TAB(-3,SBCLR); ? TAB(19,55);" Score if taken "; ? TAB(-2,1);TAB(-3,4);(SCORE+TOTAL+GT(PLR)) USING "#####";" "; ? TAB(-2,WFCLR);TAB(-3,WBCLR); RETURN !=========================================================== ! SPIN'DICE: IF SPIN'FLG=0 THEN RETURN ? TAB(-1,29);TAB(-1,24); FOR T=1 TO 8-XD TINDX=TIME ! index for delay FOR SPX=SPIN TO XD SPP=INT(7*RND(0)+1) IF SPP=1 THEN CALL SD1 IF SPP=2 THEN CALL SD2 IF SPP=3 THEN CALL SD3 IF SPP=4 THEN CALL SD4 IF SPP=5 THEN CALL SD5 IF SPP=6 THEN CALL SD6 IF SPP=7 THEN CALL SD7 NEXT SPX ! IF TINDX=TIME THEN IF SPIN'DRG<>0 THEN & ! XCALL SLEEP,SPIN'DRG ! delay if needed IF SPIN'DRG<>0 THEN CALL SDDLY NEXT T ? TAB(-1,28);TAB(-1,23);TAB(-3,DBCLR); RETURN SDDLY: ! IF TINDX+SPIN'DRG