!*! Updated on 08-Nov-90 at 12:28 PM by Paul Ciosek; edit time: 0:00:51
!*************************** AMUS Program Label ******************************
! Filename: MASTMD.RUN                                      Date: 11/8/90
! Category:              Hash Code: 737-703-541-565      Version: 1.0(1)         
! Initials:              Name: G. KIRBY
! Company: PROTECH DATA SYSTEMS                    Telephone #:           
! Related Files: mastmd.dat
! Min. Op. Sys.:                               Expertise Level: INT
! Special: need to load input.sbr to run 
! Description: mastermind game, quite fun
! 
! 
!*****************************************************************************
!*! Updated on 01-Nov-90 at 11:05 AM by Paul Ciosek; edit time: 0:04:56
! MASTERMIND BOARD

MAP1 BOARD
     MAP2 TOP,S,1,"-"
     MAP2 SIDE,S,1,"!"
     MAP2 ENTRY,S,10
     MAP2 ANSWER,S,10
     MAP2 GUESS,S,10
     MAP2 ANSWER1,S,10
MAP1 KEY,F,6
MAP1 MSGE,S,27

MAP1 BOARDL
     MAP2 TOPL,S,47,"                      ZPZ                      "
     MAP2 MIDL,S,47,"                      ZXZ                      "
     MAP2 BOTL,S,47,"                      Z=Z                      "
     MAP2 SIDEL,S,47,"                       V                       "
     MAP2 QST,S,25,"                       V "
     MAP2 ANSWER2,S,25,"                       V "

MAP1 NM1,S,39,"                              E-T-S-A-M"
MAP1 NM2,S,39,"R-M-I-N-D                              "
MAP1 NAME,S,10,"MASTEDNIMR"
MAP1 TRMCHR'MAP
  MAP2 TRMCHR'FLAGS,F,6
  MAP2 TRMCHR'FILL(7),F,6

INST:
250  PRINT TAB(-1,0) : XCALL NOECHO : FILEBASE 1 : RANDOMIZE
	CALL DRAW'HEADER
	CALL INSTRUCTION
	?TAB(2,1);TAB(-1,10);
SCOREBOARD:
	?TAB(2,1);TAB(-1,36);
	Y=1 : W=19 : X=60 : H=1 : CALL DRAW'BOX
	Y=4 : W=19 : X=60 : H=3 : CALL DRAW'BOX
	?TAB(-1,23);
	FOR I=62 TO 78 : ?TAB(3,I);"P";TAB(4,I);"="; : NEXT I
	FOR I=62 TO 79 : ?TAB(6,I);"Z"; : NEXT I
	?TAB(6,60);"TZ";TAB(6,80);"Y";TAB(4,72);"X";TAB(8,72);"="; &
		TAB(5,72);"V";TAB(6,72);"X";TAB(7,72);"V";
	?TAB(8,63);"PP";TAB(8,76);"PP";
	?TAB(9,62);"R==S";TAB(9,75);"R==S";TAB(10,62);"7777";TAB(10,75);"7777";

	?TAB(2,79);TAB(-1,24);TAB(-1,33);TAB(2,61);TAB(-1,32);"<<<SCORE-BOARD>>>"
     PRINT TAB(5,61); "GAMES WON"; TAB(7,61); "GAMES LOST" : CALL SCORES

	Y=12 : W=19 : X=60 : H=3 : CALL DRAW'BOX
	Y=17 : W=29 : X=50 : H=1 : CALL DRAW'BOX
	?TAB(19,62);TAB(-1,23);"P";TAB(19,80);"Y";TAB(20,62); &
		"V";TAB(20,80);"V";TAB(21,62); &
		"QZZZZZZZZZZZZZZZZZU";TAB(-1,24);TAB(-1,37);
CLEAR:
100  ! CLEAR FIELDS
	?TAB(20,63);SPACE(17);TAB(23,48);TAB(-1,9);
	CALL RESET'BOARD

GETLEN:

     PRINT TAB(13,78);TAB(-1,33);TAB(13,61);TAB(-1,32); &
	"HOW MANY NUMBERS:";TAB(-1,33);TAB(15,61);SPACE(17);
     XCALL INPUT,15,69,2,1,"#E",ENTRY,INXCTL,1
     IF INXCTL = 2 GOTO ENDIT
     NOM = VAL(ENTRY)
     IF NOM < 1 OR NOM > 10 GOTO GETLEN

GETSIZ:
350  FOR COUNT = 1 TO NOM
     TOPL[(COUNT*2)+24;2] = "ZZ" : TOPL[23-(COUNT*2);2] = "ZZ" : QST[23-(COUNT*2);2] = "? "
     BOTL[(COUNT*2)+24;2] = "ZZ" : BOTL[23-(COUNT*2);2] = "ZZ"
     MIDL[(COUNT*2)+24;2] = "ZZ" : MIDL[23-(COUNT*2);2] = "ZZ"
     NEXT COUNT
     NOM = NOM * 2
     TOPL[21-NOM;2] = "RZ" : TOPL[26+NOM;2] = "ZS"
     MIDL[21-NOM;2] = "TZ" : MIDL[26+NOM;2] = "ZY"
     BOTL[21-NOM;2] = "QZ" : BOTL[26+NOM;2] = "ZU"
     SIDEL[21-NOM;2] = "V " : SIDEL[26+NOM;2] = " V"
     QST[21-NOM;2] = "V " : ANSWER2[21-NOM;2] = "V "
     NOM = NOM/2

PRINTIT:
400  PRINT TAB(4,1);TAB(-1,23);TAB(6,1); MIDL; TAB(5,1); SIDEL; &
	TAB(5,1); QST; TAB(4,1); TOPL
     GOES = NOM + 4 : IF NOM >8 THEN GOES = GOES + 1
     FOR COUNT = 1 TO GOES
     PRINT TAB(6+COUNT,1); SIDEL
     NEXT COUNT
     PRINT TAB(6+COUNT,1); BOTL;TAB(-1,24);

GETVAL:
450  FOR COUNT = 1 TO NOM
     ANS = INT((RND(10)*9)+1) : IF ANS > 9 ANS = 9
     ANSWER = ANSWER+STR(ANS)
     NEXT COUNT
     TRY = 0

GUESSIT:
500  TRY = TRY+1 : IF TRY > GOES GOTO LOSTIT
     PRINT TAB(13,78);TAB(-1,33);TAB(13,61);TAB(-1,32);" MAKE YOUR GUESS ";TAB(-1,33);
     XCALL INPUT,15,70-(INT(NOM/2)),NOM,1,"A ",ENTRY,INXCTL,1
     GUESS = ENTRY
     IF LEN(GUESS) < NOM GOTO GUESSIT
     IF GUESS # INT(GUESS) GOTO GUESSIT
     ?TAB(13,61);" ENTER YOUR GUESS";
     ANSWER1 = ANSWER

PRIGSS:
550  STRY = NOM : FOR COUNT = 1 TO NOM
     ANSWER2[23-(COUNT*2),23-(COUNT*2)] = GUESS[STRY,STRY] : STRY = STRY-1
     NEXT COUNT
	G=INSTR(1,ANSWER2,"V") : G1=INSTR(G+1,ANSWER2,"V")
     PRINT TAB(TRY+6,2+G); ANSWER2[G+2,G1-1]; &
		TAB(TRY+6,2+G+G1+1);ANSWER2[G1+2,25];
     IF GUESS = ANSWER CALL GOTIT : GOTO MOREPLAY

CHECKIT:
600  STRY = 0 : FOR COUNT = 1 TO NOM
     IF GUESS[COUNT,COUNT] = ANSWER1[COUNT,COUNT] THEN GUESS[COUNT,COUNT] = " " : &
     ANSWER1[COUNT,COUNT] = " " : STRY = STRY + 1 : PRINT TAB(TRY+6,24+(STRY*2)); "X"
     NEXT COUNT
     FOR COUNT = 1 TO NOM
     IF GUESS[COUNT,COUNT] # " " CALL CHECK
     NEXT COUNT
     GOTO GUESSIT

CHECK:
650  LOOK = 0 : FOR COUNT1 = 1 TO NOM
     IF LOOK = 1 GOTO NEXTBIT
     IF GUESS[COUNT,COUNT] # ANSWER1[COUNT1,COUNT1] GOTO NEXTBIT
     LOOK = 1 : STRY = STRY+1 : PRINT TAB(TRY+6,24+(STRY*2)); "O"
     ANSWER1[COUNT1,COUNT1] = " "

NEXTBIT:
700  NEXT COUNT1
     RETURN

LOSTIT:
1000 CALL PRANS : CALL LOSTMSGE
     PRINT TAB(18,79);TAB(-1,35);TAB(18,51);TAB(-1,34);MSGE;TAB(-1,35);
	?TAB(20,63);"<<< YOU  LOSE >>>";
     LOST = LOST + 1 : CALL SCORES
     GOTO MOREPLAY

GOTIT:
1010  STRY = NOM : FOR COUNT = 1 TO NOM
      PRINT TAB(TRY+6,24+(COUNT*2)); "X"
      PRINT TAB(5,23-(COUNT*2)); GUESS[STRY,STRY] : STRY = STRY-1
      NEXT COUNT
      WON = WON + 1 : CALL SCORES
1014  IF TRY = 1 GOTO INONE
      CALL WONMSGE
     PRINT TAB(18,79);TAB(-1,35);TAB(18,51);TAB(-1,34);MSGE;TAB(-1,35);
	?TAB(20,63);"<<<< YOU WIN >>>>";
1016  RETURN
 
INONE:
      KEY = 1
      CALL READMSG
1020  MSGE="YOU LUCKY ** BASTARD YOU **"
     PRINT TAB(18,79);TAB(-1,35);TAB(18,51);TAB(-1,34);MSGE;TAB(-1,35);
	?TAB(20,63);"<<<< YOU WIN >>>>";
      RETURN

MOREPLAY:		! NO NOT FOREPLAY
1030  PRINT TAB(23,48); "CARE TO PLAY AGAIN...(Y/N) : ";
	ANSWER = "" : TRY = 0 : CLOSE #1
      XCALL INPUT,23,77,1,1,"YY",ENTRY,INXCTL,1
	?TAB(18,51);SPACE(29);
      IF UCS(ENTRY[1,1]) = "Y" GOTO CLEAR
	?TAB(23,48);"OH GO ON.....PLEEEEASE !!!      ";
      XCALL INPUT,23,76,1,1,"YY",ENTRY,INXCTL,1
      IF UCS(ENTRY[1,1]) = "Y" GOTO CLEAR
      PRINT TAB(-1,0);"S C A R E D Y    C A T"; : FOR I = 1 TO 2000 : NEXT I
      CHAIN "MN.RUN[110,13]"

PRANS:
1100 STRY = NOM : FOR COUNT = 1 TO NOM
     PRINT TAB(5,23-(COUNT*2)); ANSWER[STRY,STRY] : STRY = STRY-1
     NEXT COUNT
     RETURN

SCORES:
	IF WON>LOST GOTO S'WON
	IF LOST>WON GOTO S'LOST
     PRINT TAB(5,61); "GAMES WON"; TAB(7,61); "GAMES LOST";
1110  PRINT TAB(5,74); WON USING "#,###"; TAB (7,74); LOST USING "#,###"
      RETURN

S'WON:
     PRINT TAB(5,61); "GAMES";TAB(-1,21);"WON";TAB(-1,22); &
	 TAB(7,61); "GAMES LOST";
      PRINT TAB(5,74); WON USING "#,###"; TAB (7,74); LOST USING "#,###"
      RETURN

S'LOST:
     PRINT TAB(7,61); "GAMES";TAB(-1,21);"LOST";TAB(-1,22); &
	 TAB(5,61); "GAMES WON ";
      PRINT TAB(5,74); WON USING "#,###"; TAB (7,74); LOST USING "#,###"
      RETURN

LOSTMSGE:
1120  KEY = INT(RND(8)*16)+1 : IF KEY < 9 GOTO LOSTMSGE
      CALL READMSG
      RETURN

WONMSGE:
1150  KEY = INT(RND(8)*8)+1 : IF KEY>8 GOTO WONMSGE
      CALL READMSG
      RETURN

READMSG:
1155  OPEN #1,"MASTMD.DAT",INPUT
      FOR COUNT = 1 TO KEY
      INPUT LINE #1,MSGE
      NEXT COUNT
      RETURN

INSTRUCTION:
1160  PRINT TAB(12,23);"DO YOU REQUIRE INSTRUCTIONS  Y/N " : INS = 1
      XCALL INPUT,12,58,1,0,"AE",ENTRY,INXCTL,1
	IF UCS(ENTRY[1,1]) = "Y" GOTO INSTRUCTIONS
      RETURN

ENDIT:
1170  PRINT TAB(-1,0) : CHAIN "MN.RUN"	! QUIT TO MENU PROGRAM
INSTRUCTIONS:
1200  PRINT TAB(2,1);TAB(-1,10); &
      "The object of this game is to correctly guess the hidden numbers that the"
     ?"computer has picked. How many numbers, however, will be chosen by you."
     ?""
     ?"You will be asked how many numbers you wish to guess (between 1 and 10)"
     ?"...If you choose 1 number  then that could be anything from   1 to 9"
     ?"...If you choose 2 numbers then that could be anything from  11 to 99"
     ?"...If you choose 3 number then that could be anything from  111 to 999"
     ?""
     ?"When you make your guess you will be told how close you were....you will"
     ?"be shown an  X  for a correct number in the correct position  and "
     ?"             O  for a correct number in the wrong position"
     ?""
     ?"For example   If you asked for 4 numbers and the hidden answer is 2324"
     ?"              your guess may be  6423  this would result in you being "
     ?"              given three 'pegs'  X O O  as to how close you were"
     ?"                                  - - -  "
     ?"The X would be because you had correctly guessed the position of the"
     ?"number 2 in the answer. The O O because two other numbers were correctly"
     ?"guessed but not in the right positions (the 3 & 4 are in the wrong place)."
     ?"You would NOT get an X and an O for the number 2 in your guess as you"
     ?"only get a maximum of one 'peg' per number."

      input "HAVE A MIND NUMBING GOOD TIME..............RETURN TO CONTINUE",dummy
      RETURN

DRAW'HEADER:
	?TAB(-1,0);TAB(-1,29);TAB(-1,23);TAB(-1,36);
     PRINT TAB(1,51);TAB(-1,33);TAB(1,30);TAB(-1,32); &
	 "                   ";TAB(-1,33); &
		TAB(23,38);"QZZZZU";TAB(22,38);"S    R";
	FOR I=1 TO 37 : ?TAB(22,I);"Z"; : IF I<37 ?TAB(22,43+I);"Z";
	NEXT I
	?TAB(-1,24);
	?TAB(23,1);TAB(-1,11);"Courtesy of G. Kirby"; &
		TAB(23,60);"Protech Data Systems";TAB(-1,12);TAB(-1,37);
	X=21 : Y=21
	FOR I=1 TO 37
	R=INT(RND(30)*10)+1
	IF I<4 OR I>33 R=10
	IF R<3 AND X1=0 X1=1 ELSE IF R<5 AND Y1=0 Y1=1
	IF X1<>0 X=X-X1 : IF X<19 X1=-1 : X=19
	IF Y1<>0 Y=Y-Y1 : IF Y<19 Y1=-1 : Y=19
	IF X>21 X=21 : X1=0
	IF Y>21 Y=21 : Y1=0
	FOR DELAY=1 TO 900 : NEXT DELAY

	IF X=19 ?TAB(19,I);" ";NM1[39;1]; : &
		?TAB(20,I-1);" /"; : &
		?TAB(21,1);NM1[40-I;I-2];

	IF X=20	?TAB(19,I);" "; &
		TAB(20,I-1);" ";NM1[39;1]; : &
		?TAB(21,1);NM1[40-I;I-1];

	IF X=21 ?TAB(20,I-1);" "; &
		TAB(21,1);NM1[40-I;I];

	IF Y=19 ?TAB(19,79-I);NM2[1;1];" "; : &
		?TAB(20,80-I);"\ "; : &
		?TAB(21,81-I);NM2[3;I];

	IF Y=20	?TAB(19,80-I);" "; &
		TAB(20,80-I);NM2[1;1];" "; : &
		?TAB(21,81-I);NM2[2;I-1];

	IF Y=21 ?TAB(20,80-(I-1));" "; &
		TAB(21,81-I);NM2[1;I];

	NEXT I
JUMP'INTO'POT:
	FOR I=1 TO 9 : FOR DELAY=1 TO 900 : NEXT DELAY
	IF I=1 ?TAB(20,38);"\";TAB(19,34);"aaah";
	?TAB(21,28+I);" ";NM1[30,38-I];TAB(22,40);NM1[40-I;1];
	NEXT I : ?TAB(22,40);" ";

	FOR I=1 TO 9 : FOR DELAY=1 TO 900 : NEXT DELAY
	IF I=1 ?TAB(19,34);"    ";TAB(20,38);" "; : &
		?TAB(20,43);"/";TAB(19,44);"aaah";
	?TAB(21,44);NM2[I+1,39];TAB(22,41);NM2[I;1];
	NEXT I : ?TAB(22,41);" ";TAB(21,44);"   ";TAB(20,43);" ";TAB(19,44);"    ";
	
CROSS:
	?TAB(22,35);TAB(-1,23);"U Q";TAB(21,35);"V V";TAB(20,34);"QS RU";
	?TAB(19,34);"RU QS";TAB(18,35);"RZS";TAB(-1,24);

RISE'FROM'POT:
	FOR I1=1 TO 10
	FOR I=21 TO 2 STEP-1 : ?TAB(I,40);NAME[I1;1];TAB(I+1,40);" ";
	FOR DELAY=1 TO 200 : NEXT DELAY
	NEXT I
	X=(I1*2)-1
	IF I1>5 X1=11-I1 : X=((X1+10)+(X1-1))
	?TAB(1,30+X);NAME[I1;1];TAB(2,40);" "; : NEXT I1
	?TAB(4,1);TAB(-1,28);
	RETURN

!--------------------------------------------------------------------------
!	Y = ROW 	X = COL
!	W = WIDTH	H = HEIGHT
DRAW'BOX:
	XCALL TRMCHR,STATUS,TRMCHR'MAP
	IF TRMCHR'FLAGS AND 524288 GOTO AM62A

6000	PRINT TAB(-1,23);TAB(Y,X);TAB(-1,38);
	FOR I = (X+1) TO (X+W) : PRINT TAB(-1,46); : NEXT I
	PRINT TAB(-1,39);
	FOR I = (Y+1) TO (Y+H) : PRINT TAB(I,(X+W+1));TAB(-1,47); : NEXT I
	PRINT TAB((Y+H+1),(X+W+1));TAB(-1,41);
	FOR I = (X+W) TO (X+1) STEP -1 : PRINT TAB((Y+H+1),I);TAB(-1,46); : NEXT I
	PRINT TAB((Y+H+1),X);TAB(-1,40);
	FOR I = (Y+H) TO (Y+1) STEP -1 : PRINT TAB(I,X);TAB(-1,47); : NEXT I
	PRINT TAB(-1,24);
6050	RETURN

AM62A:
	HH = H + 32 : WW = W + 32
	PRINT TAB(Y,X); TAB(-1,92); CHR(HH); CHR(WW);
	RETURN

RESET'BOARD:
     TOPL="                      ZPZ                      "
     MIDL="                      ZXZ                      "
     BOTL="                      Z=Z                      "
     SIDEL="                       V                       "
     QST="                       V "
     ANSWER2="                       V "
	   ?TAB(2,1);TAB(-1,91);CHR(54);CHR(81);" ";
	RETURN