!********************************
!*                              *
!*  Program:    PACMAN.BAS      *
!*  Author:     David Pallmann  *
!*  Created:    16-May-85       *
!*                              *
!********************************
!Standardized graphic char calls...TAB(-1, etc).  Allows use with
!   non-AlphaMicro CRT's.   RRM  21 Dec 1987.
!XCALLS: PACMAN, VERIFY

       PROGRAM PACMAN, 1.01

       MAP1 S(20,70), S, 1

       MAP1 GRAPH, S, 1
       MAP1 CHAR, S, 1
       MAP1 CHAMP, S, 80
       MAP1 TEXT, S, 70

       MAP1 X(4), F, 6
       MAP1 Y(4), F, 6

       MAP1 C, F, 6
       MAP1 DOTS, F, 6
       MAP1 DRAG, F, 6
       MAP1 CUR, F, 6
       MAP1 FRUIT, F, 6
       MAP1 FRUIT'FLAG, F, 6
       MAP1 HIGH'SCORE, F, 6
       MAP1 I, F, 6
       MAP1 J, F, 6
       MAP1 LIVES, F, 6
       MAP1 PAC, S, 1
       MAP1 POWER, F, 6
       MAP1 REF'DRAG, F, 6
       MAP1 SCORE, F, 6
       MAP1 R, F, 6
       MAP1 X, F, 6
       MAP1 Y, F, 6

       ON ERROR GOTO ERROR'TRAP

GET'PARAM:
       GRAPH = "Y"

INIT:   !       XCALL VERIFY, "PACMAN.SBR"
       XCALL PACMAN
       SCORE = 0
       REF'DRAG = 5
       LIVES = 5
       FRUIT = 0

NEW'GAME:
       DRAG = REF'DRAG
       DOTS = 0
       POWER = 0
       PAC = "<"
       PRINT TAB(-1,11);
       LOOKUP "PACMAN.DAT", I
       IF I=0 THEN GOTO LOAD'SCREEN
       OPEN #1, "PACMAN.DAT", INPUT
       INPUT LINE #1, CHAMP
       INPUT #1, HIGH'SCORE
       CLOSE #1

LOAD'SCREEN:
       PRINT TAB(-1,29);
       RESTORE
       PRINT TAB(-1,0);
       PRINT TAB(-1,11);
       FOR I = 1 TO 20
           READ TEXT
           FOR J = 1 TO 70
               CHAR = MID(TEXT,J,1)
               CALL DISPLAY
               S(I,J) = CHAR
               NEXT J
           PRINT
          NEXT I

       PRINT TAB(-1,12);
       PRINT TAB(22,1); "< < < < <";
       PRINT TAB(1,33); " PAC-MAN ";
       FOR I = 1 TO 4
           Y(I) = 3
           X(I) = 35
           PRINT TAB(Y(I),X(I)); "@";
           NEXT I

       IF HIGH'SCORE=0 THEN GOTO RESET'USER
       PRINT TAB(22,40); "High Score"; HIGH'SCORE; "by "; CHAMP;

RESET'USER:
       Y = 19
       X = 35
       GOTO PUT'PAC

USER'STROBE:
       XCALL PACMAN, CHAR
       IF CHAR="" THEN GOTO MOVE'GHOSTS
       IF CHAR=CHR(27) THEN GOTO END'GAME
       IF CHAR=CHR(11) THEN GOTO UP
       IF CHAR=CHR(10) THEN GOTO DOWN
       IF CHAR=CHR(8) THEN GOTO LEFT
       IF CHAR=CHR(12) THEN GOTO RIGHT
       IF CHAR="H" THEN GOTO HOLD
       GOTO MOVE'GHOSTS

HOLD:   PRINT TAB(-1,12);
       PRINT TAB(1,20); "HOLD";

HOLD2:  XCALL PACMAN, CHAR
       IF CHAR="" THEN GOTO HOLD2
       PRINT TAB(-1,11);
       PRINT TAB(1,20); "----";
       GOTO USER'STROBE

UP:     IF S(Y-1,X)="*" THEN GOTO MOVE'GHOSTS
       CALL REMOVE'PAC
       Y = Y-1
       PAC = "V"
       GOTO PUT'PAC

DOWN:   IF S(Y+1,X)="*" THEN GOTO MOVE'GHOSTS
       CALL REMOVE'PAC
       Y = Y+1
       PAC = "^"
       GOTO PUT'PAC

LEFT:   IF S(Y,X-2)="*" THEN GOTO MOVE'GHOSTS
       CALL REMOVE'PAC
       X = X-2
       PAC = ">"
       IF X<3 THEN X = 67
       GOTO PUT'PAC

RIGHT:  IF S(Y,X+2)="*" THEN GOTO MOVE'GHOSTS
       CALL REMOVE'PAC
       X = X+2
       PAC = "<"
       IF X>67 THEN X = 3
       GOTO PUT'PAC

PUT'PAC:
       PRINT TAB(-1,12);
       PRINT TAB(Y,X-1); TAB(-1,33); PAC;
       IF Y=11 AND X=35 THEN SCORE = SCORE+FRUIT'FLAG : CALL PRINT'SCORE :&
          CALL REMOVE'FRUIT
       FOR I = 1 TO 4
           IF Y(I)=Y AND X(I)=X AND POWER>0 THEN Y(I) = 3 : X(I) = 35 :&
           SCORE = SCORE+200 : CALL PRINT'SCORE
           NEXT I
       IF POWER>0
       IF S(Y,X)="." THEN GOTO DOT
       IF S(Y,X)="o" THEN GOTO POWER'DOT
       GOTO MOVE'GHOSTS

POWER'DOT:
       PRINT CHR(7);
       SCORE = SCORE+90
       POWER = POWER+25+(DRAG*25)
       PRINT TAB(-1,12);

DOT:    S(Y,X) = " "
       SCORE = SCORE+10
       CALL PRINT'SCORE
       DOTS = DOTS-1
       IF DOTS=0 THEN GOTO WIN
       IF DOTS<80 THEN DRAG = 4
       IF DOTS<60 THEN DRAG = 3
       IF DOTS<40 THEN DRAG = 2
       IF DOTS<20 THEN DRAG = 1
       REM PRINT CHR(7);
       GOTO MOVE'GHOSTS

MOVE'GHOSTS:
       FRUIT = FRUIT+0.25
       IF INT(FRUIT/1000)=FRUIT/1000 THEN CALL CREATE'FRUIT
       IF INT(FRUIT/1900)=FRUIT/1900 THEN CALL REMOVE'FRUIT
       IF INT(RND(0)*DRAG)<>0 THEN GOTO USER'STROBE
       IF POWER=1 THEN GOTO END'POWER
       CUR = CUR+1
       IF CUR>4 THEN CUR = 1
       IF POWER>0 THEN POWER = POWER-1 : GOTO RANDOM'MOVEMENT
       GOTO DELIBERATE'MOVEMENT

CREATE'FRUIT:
       IF FRUIT'FLAG>0 THEN RETURN
       FRUIT'FLAG = INT(FRUIT/2)
       PRINT TAB(-1,12);
       PRINT TAB(11,35);
       IF GRAPH="Y" THEN PRINT TAB(-1,23); "H"; TAB(-1,24); ELSE PRINT "%";
       RETURN

REMOVE'FRUIT:
       IF FRUIT'FLAG=0 THEN RETURN
       FRUIT'FLAG = 0
       PRINT TAB(-1,11);
       PRINT TAB(11,35); S(11,33);
       RETURN

END'POWER:
       PRINT CHR(7); CHR(7);
       POWER = 0

DELIBERATE'MOVEMENT:
       R = Y(CUR)
       C = X(CUR)
       IF Y<R THEN R = R-1
       IF Y>R THEN R = R+1
       IF X<C THEN C = C-2
       IF X>C THEN C = C+2
       IF R=Y AND C=X THEN GOTO RANDOM'MOVEMENT
       IF S(R,C)<>"*" THEN GOTO MOVE'GHOST

RANDOM'MOVEMENT:
       R = Y(CUR)
       C = X(CUR)
       I = INT(RND(0)*4)
       IF I=0 THEN R = R-1
       IF I=1 THEN R = R+1
       IF I=2 THEN C = C-2
       IF I=3 THEN C = C+2
       IF S(R,C)="*" THEN GOTO RANDOM'MOVEMENT

MOVE'GHOST:
       PRINT TAB(-1,12);
       IF POWER=0 THEN PRINT TAB(R,C-1); TAB(-1,33); "@"; ELSE &
          PRINT TAB(R,C-1); TAB(-1,32); "@";
       PRINT TAB(-1,11);
       PRINT TAB(Y(CUR),X(CUR)-1); TAB(-1,33); S(Y(CUR),X(CUR));
       Y(CUR) = R
       X(CUR) = C
       IF R=Y AND C=X AND POWER=0 THEN GOTO EAT'HIM'UP
       GOTO USER'STROBE

WIN:    PRINT CHR(7);
       SCORE = SCORE+5000
       IF REF'DRAG>0 THEN REF'DRAG = REF'DRAG-1

HALF'TIME:
       PRINT TAB(-1,12);
       FOR I = 2 TO 79
           PRINT TAB(23,I); "<";
           PRINT TAB(23,I-1); " ";
           FOR J = 1 TO 50
               NEXT J
           NEXT I
       PRINT TAB(23,79); " ";
       FOR I = 80 TO 1 STEP -1
           PRINT TAB(23,I); "> ";
           FOR J = 1 TO 50
               NEXT J
           NEXT I
       PRINT TAB(23,1); " ";
       GOTO NEW'GAME

EAT'HIM'UP:
       PRINT CHR(7);
       LIVES = LIVES-1
       PRINT TAB(22,LIVES*2+1); " ";
       IF LIVES>0 THEN GOTO RESET'USER

END'GAME:
       IF SCORE<=HIGH'SCORE THEN GOTO EXIT
       PRINT TAB(-1,12);
       PRINT CHR(7); CHR(7); CHR(7);
       PRINT TAB(23,1); "NEW HIGH SCORE!  WHAT'S YOUR NAME? ";
       INPUT LINE CHAMP
       IF CHAMP="" THEN GOTO END'GAME
       OPEN #1, "PACMAN.DAT", OUTPUT
       PRINT #1, CHAMP
       PRINT #1, SCORE
       CLOSE #1

ERROR'TRAP:
       PRINT TAB(23,1); TAB(-1,24); TAB(-1,12); TAB(-1,28);
       IF ERR(0)<2 THEN END
       PRINT TAB(-1,10); "*** ERROR IN 'PACMAN' LINE=0 FILE=0 ERROR ="; ERR(0);
       PRINT "***"
       END

EXIT:   PRINT TAB(23,1); TAB(-1,24); TAB(-1,12); TAB(-1,28);
       END
       END

REMOVE'PAC:
       PRINT TAB(-1,11);
       PRINT TAB(Y,X-1); TAB(-1,33); S(Y,X);
       RETURN

PRINT'SCORE:
       PRINT TAB(1,70);
       PRINT TAB(-1,12);
       PRINT USING "######"; SCORE;
       RETURN

DISPLAY:
       IF GRAPH="Y" THEN GOTO GRAPHIC'DISPLAY

TEXT'DISPLAY:
       IF INSTR(1,"|-+ABCD",CHAR)<>0 THEN CHAR = "*"
       IF CHAR=" " THEN PRINT TAB(-1,33); ELSE PRINT CHAR;
       IF CHAR="." OR CHAR="o" THEN DOTS = DOTS+1
       RETURN

GRAPHIC'DISPLAY:
       IF INSTR(1,"|-+ABCD",CHAR)=0 THEN GOTO TEXT'DISPLAY
       PRINT TAB(-1,23);
       IF CHAR="|" THEN PRINT TAB(-1,47);      !        V
       IF CHAR="-" THEN PRINT TAB(-1,46);      !       "Z";
       IF CHAR="A" THEN PRINT TAB(-1,40);      !       "Q";
       IF CHAR="B" THEN PRINT TAB(-1,38);      !       "R";
       IF CHAR="C" THEN PRINT TAB(-1,39);      !       "S";
       IF CHAR="D" THEN PRINT TAB(-1,41);      !       "U";

GD'END:
       CHAR = "*"
       PRINT TAB(-1,24);
       RETURN

       DATA ---------------------------------------------------------------------
       DATA B-------------------------------------------------------------------C
       DATA | o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o |
       DATA | . B------------ . ------------C . B-------------- . ----------C . |
       DATA | . | . . . . . . . . . . . . . | . | . . . . . . . . . . . . . | . |
       DATA | . | . --------------------- . | . | . --------------------- . | . |
       DATA | . | . . . . . . . . . . . . . | . | . . . . . . . . . . . . . | . |
       DATA | . . . --------------------- . | . | . --------------------- . . . |
       DATA | . | . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | . |
       DATA | . A---------- . ----------- . ----- . ----------- . ----------D . |
       DATA = . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . =
       DATA | . B---------- . ----------- . ----- . ----------- . ----------C . |
       DATA | . | . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | . |
       DATA | . . . --------------------- . | . | . --------------------- . . . |
       DATA | . | . . . . . . . . . . . . . | . | . . . . . . . . . . . . . | . |
       DATA | . | . --------------------- . | . | . --------------------- . | . |
       DATA | . | . . . . . . . . . . . . . | . | . . . . . . . . . . . . . | . |
       DATA | . A------------ . ------------D . A-------------- . ----------D . |
       DATA | o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o |
       DATA A-------------------------------------------------------------------D