!*! Updated on 03-Jan-94 at 3:50 PM by Tim; edit time: 0:01:00
!*************************** AMUS Program Label ******************************
! Filename: BATTL3.BAS                                      Date: 1/3/94
! Category: GAME         Hash Code:                      Version: 3.0(1)
! Initials: TRON/AM      Name: Tim Shoemaker
! Company: Datatronics                             Telephone #: 9099287704
! Related Files: NONE
! Min. Op. Sys.: DBASIC                        Expertise Level:
! Special: must have DBASIC or DRUN to execute this. may be modified for other
! Description: a Multi terminal battleship game based on BATTL2.BAS. This one
! allows for easier placement of pieces, and faster game play.
!
!***************************************************************************!
!                                                                           !
!                                BATTL3.BAS                                 !
!                      Battleship for the Alpha Micro                       !
!                WITH "GRAPHIC" INTERFACE AND MODS FOR DBASIC
!                                                                           !
!***************************************************************************!
!Copyright (C) 1986 by UltraSoft.  All Rights Reserved.
!FreeWare from UltraSoft.  May be distributed free of charge.
!
!Written by: David Pallmann
!
!Edit History:
!1.0 29-Mar-86 created. /DFP
!2.0 01-May-86 Two-user version of BATTLE.BAS /RPW (CENTAURI) (512) 631-9141
!3.0 03-Jan 94 changed to a graphic screen by Tim Shoemaker (714) 455-3493

       PROGRAM BATTL3,3.0

MAP1 OPP'RECORD
       MAP2 OPP'ROW,F,6
       MAP2 OPP'COL,F,6

       MAP1 XXX,S,1
       R'MARGIN = 1
       T'MARGIN = 3
       OLD'OPP'ROW = 2 :OLD'OPP'COL = 2
       MAP1 PIECE'MARKER,S,5

       MAP1 PROMPT,S,20
       MAP1 ENTRY,S,30
       MAP1 HCHAR,S,1,"7"      !Hit marker.
       MAP1 MCHAR,S,1,"-"      !Missed marker.
       MAP1 CCHAR,S,1,"."      !Coordinate marker.
       MAP1 DELAY,F,6,2000     !Delay loop for error mess.
       MAP1 CNAM,S,6           !Opponent's job name.
       MAP1 PNAM,S,6           !This player's job name.
       MAP1 CBRD(10,10),B,1    !COMPUTER BOARD
       MAP1 PBRD(10,10),B,1    !PLAYER BOARD
       MAP1 PIMG(10,10),B,1    !PLAYER IMAGE OF COMPUTER BOARD
       MAP1 CSHIP(5),F         !SHIP COUNTS
       MAP1 PSHIP(5),F         !SHIP COUNTS
       MAP1 NAME(5),S,20       !SHIP NAMES
       MAP1 LENGTH(5),F        !SHIP LENGTHS
       MAP1 CDOWN,F            !COMPUTER SHIPS SANK
       MAP1 PDOWN,F            !PLAYER SHIPS SANK
       MAP1 HR,F               !HIT ROW
       MAP1 HC,F               !HIT COLUMN
       MAP1 SR,F               !SAVED HIT ROW
       MAP1 SC,F               !SAVED HIT COLUMN
       MAP1 HFLAG,F            !HIT FLAG
       MAP1 I,F                !LOOP INDEX
       MAP1 J,F                !LOOP INDEX
       MAP1 K,F                !LOOP INDEX
       MAP1 R,F                !ROW
       MAP1 C,F                !COLUMN
       MAP1 R1,F               !ROW
       MAP1 C1,F               !COLUMN
       MAP1 D,F                !DIRECTION
       MAP1 VD,F               !VERTICAL DIRECTION
       MAP1 HD,F               !HORIZONTAL DIRECTION
       MAP1 L,F                !LENGTH OF CURRENT SHIP
       MAP1 TEXT,S,10          !INPUT STRING
       MAP1 HITS,F             !PLAYER HITS
       MAP1 CHITS,F            !COMPUTER HITS
       MAP1 FLAG,F             !FLAG
       MAP1 USR'BUF            !Borrowed from A.B. USRBUF.CPY
               MAP2 UB'RCN,B,2
               MAP2 UB'UID,S,6
               MAP2 UB'NAME,S,30
               MAP2 UB'FIL,X,62
       MAP1 CNAME,S,30
       MAP1 ANSWER,S,1

       ?TAB(-1,0);"           *+*+*+*+BATTLESHIP*+*+*+*+*+"
!       ?TAB(10,1);"1.  PLAY AGAINST THE COMPUTER."
!       ?TAB(11,1);"2.  PLAY AGAINST ANOTHER USER."
WHICH:
!       ?TAB(15,1);"_ <-- Enter your choice.";TAB(15,1);
!       INPUT "",WHICH
!       IF WHICH=1 CHAIN "BATTLE"
!       IF WHICH<>2 GOTO WHICH
       ?TAB(20,1);"______ <-- Enter name of job to play against.";TAB(20,1);
       INPUT "",CNAM
       CNAM = RTRIM(CNAM)
       XCALL STRIP,CNAM
       IF LEN(CNAM)<1 GOTO WHICH
SND'MSG:
       ?TAB(21,1);"_ <-- Send message to "+CNAM+"? (Y/N)";TAB(21,1);
       INPUT "",ANSWER
       IF UCS(ANSWER)<>"Y" GOTO INIT1
       ?TAB(22,1);
       RUNDOS "SEND "+CNAM+" <HOW ABOUT A GAME OF BATTLESHIP?>"
       GOTO SND'MSG
INIT1:
!       LOOKUP "MEM:GINDTA.SV",ABF
!       IF ABF THEN &
!               XCALL DB,14,USR'BUF : &
!               PNAM=UB'UID
!       IF ABF=0 THEN XCALL JOBNAM,PNAM
!       XCALL STRIP,PNAM
       PNAM = .JOBNAME
       LOOKUP PNAM+".OPP",B
       WHEN B = 0
               ALLOCATE PNAM+".OPP",1
       WEND
       OPEN #34,PNAM+".OPP",RANDOM,12,OPP'RECNO
       OPP'RECNO = 0
       OPP'ROW = 1
       OPP'COL = 1
       WRITE #34,OPP'RECORD
       CLOSE #34
       OPEN #34,PNAM+".OPP",RANDOM,12,OPP'RECNO

INIT:   RANDOMIZE
       FOR I=1 TO 5
           READ NAME(I),LENGTH(I)
           CSHIP(I)=LENGTH(I)
           PSHIP(I)=LENGTH(I)
           NEXT
       DATA BATTLESHIP,5
       DATA DESTROYER,4
       DATA CRUISER,3
       DATA SUBMARINE,3
       DATA PT BOAT,2

NEWGAM: PRINT TAB(-1,0); TAB(-1,11);
       CALL PLACE'SQUARES
!       FOR I=1 TO 10
!           PRINT TAB(1,I*2+2); STR(I);
!           PRINT TAB(13,I*2+2); STR(I);
!           PRINT TAB(I+1,1); CHR(I+64);
!           PRINT TAB(I+13,1); CHR(I+64);
!           FOR J=1 TO 10
!               CBRD(I,J)=0 : PBRD(I,J)=0 : PIMG(I,J)=0
!               PRINT TAB(I+1,J*2+2); CCHAR;
!               PRINT TAB(I+13,J*2+2); CCHAR;
!               NEXT
!           NEXT
!       PRINT TAB(6,25); "OPPONENT'S";
!       PRINT TAB(7,25); "FIELD";
!       PRINT TAB(17,25);"YOUR";
!       PRINT TAB(18,25);"FIELD";
!       PRINT TAB(-1,12);
!       IF ABF=0 PROMPT="YOUR NAME? " : CALL INPUT : UB'NAME=ENTRY
       UB'NAME = .USERNAME
!       PRINT TAB(19,25);PNAM;" (";UB'NAME;")";

       PRINT TAB(1,50); "**  BATTLESHIP  **";
       LOOKUP PNAM+".BAT",FOUND
       IF FOUND CALL LOAD'OLD'BOARD : GOTO START'PLAY

       PRINT TAB(-1,11);
       PRINT TAB(2,40); "POSITION PIECE USING NUMBER PAD... HIT '5' TO PLACE PIECE, HIT '0' TO ROTATE"
       FOR I=1 TO 5
GETPOS:!            PRINT TAB(-1,11);
!           PRINT TAB(I+7,40); NAME(I); " ("; STR(LENGTH(I)); ")? "; TAB(-1,9);
!           PRINT TAB(-1,12);
!           PROMPT=""
!           CALL INPUT
           PIECE'LENGTH = LENGTH(I)
           CALL PLACE'THE'PIECES
           TEXT=ENTRY
           CALL COORD : IF FLAG THEN GOTO GETPOS
           CALL CHOP
           R1=R : C1=C
           CALL COORD : IF FLAG THEN GOTO GETPOS
           VD=0 : HD=0
           IF R>R1 THEN VD=1
           IF R<R1 THEN VD=-1
           IF C>C1 THEN HD=1
           IF C<C1 THEN HD=-1
!           IF VD#0 AND HD#0 THEN GOTO GETPOS
!           IF VD=0 AND HD=0 THEN GOTO GETPOS
!           IF R1+(LENGTH(I)-1)*VD#R AND C1+(LENGTH(I)-1)*HD#C THEN GOTO GETPOS
           FLAG=0
           FOR J=1 TO LENGTH(I)
               R=R1+(VD*(J-1))
               C=C1+(HD*(J-1))
               IF R>10 OR C>10 GOTO GETPOS     !Watch for subscript out of range.
               IF PBRD(R,C)#0 THEN FLAG=-1
               NEXT J
           IF FLAG THEN GOTO GETPOS
           FOR J=1 TO LENGTH(I)
               PBRD(R1,C1)=I
!               PRINT TAB(R1+13,C1*2+2); CHR(I+96);
               THIS'ROW = R1   :THIS'COL = C1
               PIECE'MARKER = CHR(I+96)+CHR(I+96)+CHR(I+96)+CHR(I+96)+CHR(I+96)
               CALL PLACE'PIECE
               R1=R1+VD : C1=C1+HD
               NEXT
           NEXT
       PRINT TAB(2,1);TAB(-1,9);
!       FOR I=5 TO 12
!           PRINT TAB(I,40); TAB(-1,9);
!           NEXT

       CALL SAVE'BOARD
START'PLAY:
       CALL LOAD'BOARD
       LOOKUP PNAM+".MOV",FOUND
       IF FOUND KILL PNAM+".MOV"

!       PRINT TAB(-1,11);
!       PRINT TAB(5,40); "YOUR GUESS";
!       PRINT TAB(1,40); CNAME+"'S GUESS";
!       PRINT TAB(-1,12);

PLAYER: !PRINT TAB(5,65); TAB(-1,9);
!       PROMPT=""
!       CALL INPUT
       CALL PLACE'YOUR'TORPEDO
       TEXT=ENTRY
       CALL COORD : IF FLAG THEN GOTO PLAYER
       IF R<1 OR R>10 OR C<1 OR C>10 THEN GOTO PLAYER
       IF PIMG(R,C)#0 THEN GOTO PLAYER
       CALL SAVE'MOVE
       CALL WAIT'FOR'MOVE
       IF CBRD(R,C)=0 THEN GOTO MISS

HIT:    PIMG(R,C)=1
!       PRINT TAB(R+1,C*2+2); HCHAR;
       BOARD = 1
       THIS'ROW = R    :THIS'COL = C
       PIECE'MARKER = HCHAR+HCHAR+HCHAR+HCHAR+HCHAR
       PRINT TAB(-1,23);
       CALL PLACE'PIECE
       PRINT TAB(-1,24);
       PRINT TAB(1,20); "HIT "; CHR(7);
       HITS=HITS+1
       I=CBRD(R,C)
       CSHIP(I)=CSHIP(I)-1
       IF CSHIP(I)=0 THEN CDOWN=CDOWN+1 : &
               PRINT TAB(3,20); STR(CDOWN); " OF "+CNAME+"'S SHIPS SANK";
       IF HITS<17 THEN GOTO COMP
       PRINT TAB(2,45); "CONGRATULATIONS, YOU WIN   ";
       CALL DELAY : CALL DELAY
       CALL LOAD'MOVE
       GOTO QUIT

MISS:   PIMG(R,C)=-1
!       PRINT TAB(R+1,C*2+2); MCHAR;
       BOARD = 1
       THIS'ROW = R    :THIS'COL = C
       PIECE'MARKER = MCHAR+MCHAR+MCHAR+MCHAR+MCHAR
       CALL PLACE'PIECE
       PRINT TAB(1,20); "MISS";

COMP:
       CALL LOAD'MOVE
!       PRINT TAB(1,65); CHR(R+64); STR(C); " ";
       IF PBRD(R,C)#0 THEN GOTO CHIT

CMISS:
!       PRINT TAB(R+13,C*2+2); MCHAR;
       BOARD = 2
       THIS'ROW = R    :THIS'COL = C
       PIECE'MARKER = MCHAR+MCHAR+MCHAR+MCHAR+MCHAR
       CALL PLACE'PIECE
       PRINT TAB(1,90); "MISS";
       GOTO PLAYER

CHIT:
!       PRINT TAB(R+13,C*2+2); HCHAR;
       BOARD = 2
       THIS'ROW = R    :THIS'COL = C
       PIECE'MARKER = HCHAR+HCHAR+HCHAR+HCHAR+HCHAR
       PRINT TAB(-1,23);
       CALL PLACE'PIECE
       PRINT TAB(-1,24);
       PRINT TAB(1,90); "HIT "; CHR(7);

       CHITS=CHITS+1
       I=PBRD(R,C)
       PSHIP(I)=PSHIP(I)-1
       IF PSHIP(I)=0 THEN PDOWN=PDOWN+1 : &
               PRINT TAB(3,90); STR(PDOWN); " OF YOUR SHIPS SANK";
       IF CHITS<17 THEN GOTO PLAYER
       PRINT TAB(2,45); "SORRY, YOU HAVE LOST. ";
QUIT:
       IF HITS<17 PRINT TAB(2,68); "WIMP!";
       PRINT TAB(3,45); "EFFICIENCY RATING = ";(HITS/TRIES)*100 USING "###";"%";
       FOR I=1 TO 10
           FOR J=1 TO 10
!               IF CBRD(I,J)#0 AND PIMG(I,J)=0 THEN PRINT TAB(I+1,J*2+2); CHR(96+CBRD(I,J));
               WHEN CBRD(I,J) <> 0 AND PIMG(I,J)=0
                       BOARD = 1
                       THIS'ROW = I    :THIS'COL = J
                       X=CBRD(I,J)
                       PIECE'MARKER = CHR(X+96)+CHR(X+96)+CHR(X+96)+CHR(X+96)+CHR(X+96)
                       CALL PLACE'PIECE
               WEND
               NEXT
           NEXT
       PRINT TAB(2,75);
       CALL DELAY : CALL DELAY
       END

COORD:  FLAG=0
       R=ASC(LEFT(TEXT,1))-64
       CALL CHOP
       C=LEFT(TEXT,1)
       CALL CHOP
       IF LEFT(TEXT,1)="0" THEN C=10 : CALL CHOP
       IF R<1 OR R>10 THEN FLAG=-1
       IF C<1 OR C>10 THEN FLAG=-1
       RETURN

CHOP:   TEXT=RIGHT(TEXT,LEN(TEXT)-1)
       RETURN

LOAD'MOVE:
       LOOKUP CNAM+".MOV",FOUND
       IF FOUND=0 ?TAB(2,40);TAB(-1,9); : CALL DELAY : &
               ?"Waiting for "+CNAME+" to move..."; :&
               CALL DELAY : CALL DELAY : GOTO LOAD'MOVE
       ?TAB(3,40);TAB(-1,9);
       OPEN #1,CNAM+".MOV",INPUT
       INPUT #1,R,C
       CLOSE #1
       KILL CNAM+".MOV"
       RETURN

WAIT'FOR'MOVE:
       CALL UPDATE'OPPONENT
       LOOKUP CNAM+".MOV",FOUND
       IF FOUND=0 ?TAB(3,40);TAB(-1,9); : CALL DELAY : &
               ?"Waiting for "+CNAME+" to move..."; :&
               CALL DELAY : CALL DELAY : GOTO WAIT'FOR'MOVE
       RETURN


SAVE'MOVE:
       LOOKUP PNAM+".MOV",FOUND
       IF FOUND ?TAB(3,40);TAB(-1,9); : CALL DELAY : &
               ?"Waiting for "+CNAME+" to get your move..."; :&
               CALL DELAY : CALL DELAY : GOTO SAVE'MOVE
       ?TAB(3,40);TAB(-1,9);
       OPEN #1,PNAM+".MOV",OUTPUT
       PRINT #1,STR(R);",";STR(C)
       CLOSE #1
       TRIES=TRIES+1
       RETURN

LOAD'BOARD:
       IF ABF PROMPT="OPPONENT'S ID " : CALL INPUT : CNAM=ENTRY
       LOOKUP CNAM+".BAT",FOUND
       IF FOUND=0 ?TAB(3,40);TAB(-1,9); : CALL DELAY : &
               ?"Waiting for "+CNAM+" to set up board..."; :&
               CALL DELAY : CALL DELAY : GOTO LOAD'BOARD
       ?TAB(3,40);TAB(-1,9);
       OPEN #1,CNAM+".BAT",INPUT
       INPUT LINE #1,CNAME
       FOR X = 1 TO 10
               FOR Y = 1 TO 10
                       INPUT #1,CBRD(X,Y)
               NEXT
       NEXT
       CLOSE #1
       KILL CNAM+".BAT"
!       PRINT TAB(5,40);TAB(-1,9);
!       PRINT TAB(8,25);CNAM;" (";CNAME;")";
       OPEN #35,CNAM+".OPP",RANDOM,12,OPP'RECNO
       OPP'RECNO = 0
       RETURN
SAVE'BOARD:
       OPEN #1,PNAM+".BAT",OUTPUT
       PRINT #1,UB'NAME
       FOR X = 1 TO 10
               FOR Y = 1 TO 10
                       PRINT #1,STR(PBRD(X,Y))
               NEXT
       NEXT
       CLOSE #1
       RETURN
LOAD'OLD'BOARD:
       OPEN #1,PNAM+".BAT",INPUT
       INPUT LINE #1,TEXT
       TEXT=""
       FOR X = 1 TO 10
               FOR Y = 1 TO 10
                       INPUT #1,PBRD(X,Y)
!                       IF PBRD(X,Y)<>0 &
!                               PRINT TAB(X+13,Y*2+2); CHR(PBRD(X,Y)+96);
                       WHEN PBRD(X,Y) <> 0
                               THIS'ROW = X    :THIS'COL = Y
                               I=PBRD(X,Y)
                               PIECE'MARKER = CHR(I+96)+CHR(I+96)+CHR(I+96)+CHR(I+96)+CHR(I+96)
                               CALL PLACE'PIECE
                       WEND
               NEXT
       NEXT
       CLOSE #1
       RETURN

INPUT:
       IF LEN(PROMPT)>0 &
               PRINT TAB(-1,11);TAB(5,40);TAB(-1,9);PROMPT;TAB(-1,12);
       INPUT LINE ENTRY
       ENTRY = UCS(RTRIM(ENTRY))
       !XCALL STRIP,ENTRY
       !ENTRY=UCS(ENTRY)
       IF ENTRY[1,1]="Q" OR ENTRY="END" OR ENTRY="BYE" GOTO QUIT
       RETURN

DELAY:  SLEEP 500
       RETURN

!@@@@
       PRINT TAB(-1,0);TAB(-1,80);
       CALL PLACE'SQUARES
       PRINT TAB(1,1);"HIT 'Q' TO QUIT, OR NUMBER PAD TO MOVE... "5" TO PLACE PIECE"
       BOARD = 1
       PRINT TAB(1,1);
       THIS'ROW = 1 :THIS'COL = 1
PLACE'THE'PIECES:
       THIS'PIECE'COL = 1
       THIS'PIECE'ROW = 1
       PIECE'HORZ = 1
!       PIECE'LENGTH = 3
       BOARD = 2
PLACE'PIECE'LOOP:
       ROW'MIN = 1     :ROW'MAX = 10   :COL'MIN = 1    :COL'MAX = 10
       IF PIECE'HORZ = 1 OR PIECE'HORZ = 2                     ROW'MAX = 11- PIECE'LENGTH
       IF PIECE'HORZ = 2 OR PIECE'HORZ = 3 OR PIECE'HORZ = 4   COL'MAX = 11-PIECE'LENGTH
       IF PIECE'HORZ = 4                                       ROW'MIN = 0 + PIECE'LENGTH
       THIS'PIECE'COL = (THIS'PIECE'COL MIN COL'MAX) MAX COL'MIN
       THIS'PIECE'ROW = (THIS'PIECE'ROW MIN ROW'MAX) MAX ROW'MIN

       FOR ADJUSTER=0 TO PIECE'LENGTH - 1
               CALL ADJUST'POSITION
               CALL PLACE'BIG'CURSOR
       NEXT ADJUSTER
       X=GETKEY(-1)
       IF CHR(X) = "Q" PRINT TAB(-1,0);        :END
       XXX = CHR(X)
       FOR ADJUSTER=0 TO PIECE'LENGTH - 1
               CALL ADJUST'POSITION
               CALL UNPLACE'BIG'CURSOR
       NEXT ADJUSTER
       THIS'COL = THIS'PIECE'COL       :THIS'ROW = THIS'PIECE'ROW
       CALL FIGURE'NEW'LOCATION
       THIS'PIECE'COL = THIS'COL
       THIS'PIECE'ROW = THIS'ROW
       WHEN XXX = 5
               ENTRY = ""
               ENTRY = "ABCDEFGHIJ"[THIS'ROW;1]+THIS'COL+","
               ADJUSTER = 1
               CALL ADJUST'POSITION
               ENTRY += "ABCDEFGHIJ"[THIS'ROW;1]+THIS'COL
               RETURN
       WEND
       WHEN XXX = "R" OR XXX = "." OR XXX = "0"
               PIECE'HORZ += 1
               IF PIECE'HORZ > 4 PIECE'HORZ = 1
       WEND
       goto PLACE'PIECE'LOOP

ADJUST'POSITION:
       THIS'COL = THIS'PIECE'COL       :THIS'ROW = THIS'PIECE'ROW
       IF PIECE'HORZ = 1 OR PIECE'HORZ = 2                     THIS'ROW = THIS'ROW + ADJUSTER
       IF PIECE'HORZ = 4                                       THIS'ROW = THIS'ROW - ADJUSTER
       IF PIECE'HORZ = 2 OR PIECE'HORZ = 3 OR PIECE'HORZ = 4   THIS'COL = THIS'COL + ADJUSTER
       RETURN
PLACE'YOUR'TORPEDO:
       BOARD = 1
       THIS'ROW = (YOUR'ROW MIN 10) MAX 1
       THIS'COL = (YOUR'COL MIN 10) MAX 1
       CALL PLACE'BIG'CURSOR
  PYT1:
       CALL UPDATE'OPPONENT
       X=GETKEY(0)
       WHEN X = -1
               SLEEP 500
               GOTO PYT1
       WEND
       IF CHR(X) = "Q" PRINT TAB(-1,0);        :END
       XXX = CHR(X)
       CALL UNPLACE'BIG'CURSOR
       CALL FIGURE'NEW'LOCATION
       YOUR'ROW = THIS'ROW     :YOUR'COL = THIS'COL
       WHEN XXX = 5
               ENTRY = ""
               ENTRY = "ABCDEFGHIJ"[THIS'ROW;1]+THIS'COL
               RETURN
       WEND
       WHEN XXX = "B"
               IF BOARD = 1 BOARD = 2 ELSE BOARD = 1
       WEND
       goto PLACE'YOUR'TORPEDO

UPDATE'OPPONENT:
!       WHEN OLD'THIS'ROW <> THIS'ROW OR OLD'THIS'COL <> THIS'COL
               OPP'ROW = THIS'ROW      :OPP'COL = THIS'COL
               WRITE #34,OPP'RECORD
               CLOSE #34
               OPEN #34,PNAM+".OPP",RANDOM,12,OPP'RECNO
!               PRINT TAB(1,1);"WRITING: ";OPP'ROW;OPP'COL;
!       WEND
   UO2:
       CLOSE #35
       OPEN #35,CNAM+".OPP",RANDOM,12,OPP'RECNO
       READ #35,OPP'RECORD
!       PRINT TAB(2,1);"READING: ";OPP'ROW;OPP'COL;
       IF OPP'ROW = OLD'OPP'ROW AND OPP'COL = OLD'OPP'COL      RETURN
       SAVE'THIS'ROW = THIS'ROW        :SAVE'THIS'COL = THIS'COL       :SAVE'BOARD = BOARD

       BOARD = 2
       THIS'ROW = OLD'OPP'ROW          :THIS'COL = OLD'OPP'COL         :CALL UNPLACE'BIG'CURSOR
       THIS'ROW = OPP'ROW              :THIS'COL = OPP'COL             :CALL PLACE'BIG'CURSOR
!       THIS'ROW= R                     :OPP'COL = C                    :CALL PLACE'BIG'CURSOR

       OLD'OPP'ROW = OPP'ROW           :OLD'OPP'COL = OPP'COL
       THIS'ROW = SAVE'THIS'ROW        :THIS'COL = SAVE'THIS'COL       :BOARD = SAVE'BOARD
       RETURN

FIGURE'NEW'LOCATION:
       IF XXX = 3 OR XXX = 6 OR XXX = 9 THIS'COL = (THIS'COL + 1) MIN 10
       IF XXX = 1 OR XXX = 4 OR XXX = 7 THIS'COL = (THIS'COL - 1) MAX 1
       IF XXX = 7 OR XXX = 8 OR XXX = 9 THIS'ROW = (THIS'ROW - 1) MAX 1
       IF XXX = 1 OR XXX = 2 OR XXX = 3 THIS'ROW = (THIS'ROW + 1) MIN 10
       RETURN

PLACE'PIECE:
       CALL CALC'PLACE'XY
       PRINT TAB(-1,12);
       PRINT TAB(PLACE'X,PLACE'Y);PIECE'MARKER;
       PRINT TAB(-1,11);
       RETURN

CALC'PLACE'XY:
       IF BOARD=1 R'MARGIN = 1 ELSE R'MARGIN = 71
       PLACE'X = T'MARGIN+2+(THIS'ROW-1)*2
       PLACE'Y = R'MARGIN+1+(THIS'COL-1)*6
       RETURN

PLACE'BIG'CURSOR:
       CALL CALC'PLACE'XY
       PRINT TAB(-1,23);
       PRINT TAB(PLACE'X-1,PLACE'Y-1); TAB(-1,49);TAB(-1,49);TAB(-1,49);TAB(-1,49);TAB(-1,49);TAB(-1,49);TAB(-1,49);
       PRINT TAB(PLACE'X,PLACE'Y-1); TAB(-1,49);
       PRINT TAB(PLACE'X,PLACE'Y+5); TAB(-1,49);
       PRINT TAB(PLACE'X+1,PLACE'Y-1); TAB(-1,49);TAB(-1,49);TAB(-1,49);TAB(-1,49);TAB(-1,49);TAB(-1,49);TAB(-1,49);
       PRINT TAB(-1,24);
       RETURN
UNPLACE'BIG'CURSOR:
       CALL CALC'PLACE'XY
       PRINT TAB(-1,23);
       PRINT TAB(PLACE'X-1,PLACE'Y-1); TAB(-1,48);
       PRINT TAB(-1,46);TAB(-1,46);TAB(-1,46);TAB(-1,46);TAB(-1,46);
       PRINT TAB(-1,48);
       PRINT TAB(PLACE'X,PLACE'Y-1); TAB(-1,47);
       PRINT TAB(PLACE'X,PLACE'Y+5); TAB(-1,47);
       PRINT TAB(PLACE'X+1,PLACE'Y-1); TAB(-1,48);
       PRINT TAB(-1,46);TAB(-1,46);TAB(-1,46);TAB(-1,46);TAB(-1,46);
       PRINT TAB(-1,48);
       PRINT TAB(-1,24);
       RETURN




PLACE'SQUARES:
       PRINT TAB(-1,80);TAB(-1,0);
       FOR BOARD = 1 TO 2
               FOR THIS'ROW = 1 TO 10
                       FOR THIS'COL = 1 TO 10
                               CALL UNPLACE'BIG'CURSOR
                       NEXT THIS'COL
               NEXT THIS'ROW
       NEXT BOARD
       PRINT TAB(1,1);
       RETURN