[comp.sources.games] v04i014: rubik - Rubik's Cube Simulator in Pascal for VAX/VMS

games@tekred.TEK.COM (05/21/88)

Submitted by: uunet!bsu-cs!starcat (Bud Crittenden)
Comp.sources.games: Volume 4, Issue 14
Archive-name: rubik.shr

	[I haven't tried this, so you're on your own.  -br]

[[Here it is...  It has some open spots for the compiler to chose (such as 
the ending, and whether or not the cube is checked for being solved).]]

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of shell archive."
# Contents:  cube.pas
# Wrapped by billr@saab on Fri May 20 15:02:03 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f cube.pas -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"cube.pas\"
else
echo shar: Extracting \"cube.pas\" \(25565 characters\)
sed "s/^X//" >cube.pas <<'END_OF_cube.pas'
X[INHERIT ('SYS$LIBRARY:STARLET.PEN')]
X(* Rubik's cube simulator for VAX/VMS and ReGIS graphics *)
X(*		by Bud Crittendon			 *)
X
XPROGRAM CUBE(INPUT,OUTPUT,OUTFILE);
X
XConst
X  CubeSize = 35;
X  CubeSep =   CubeSize + 6;
X  CubeCornerX = 200;  
X  CubeCornerY = 200;  
X  TiltAngle = 0.5235987;
X  ColorRed = 1;
X  ColorBlue = 2;
X  ColorYellow = 3;
X
XTYPE
X  Iword       = [WORD] 0..65535;
X  ShortString = PACKED ARRAY [1..12] OF CHAR;
X  Rotate      = (NONE,LEFT,RIGHT,UP,DOWN,FRONT,BACK);
X  Where       = (TILTFRONT,TILTTOP,TILTRIGHT,TILTLEFT,TILTDOWN,TILTBACK);
X  Colors      = (YELLOW,WHITE,BLUE,GREEN,RED,ORANGE);
X  CUBITS = PACKED ARRAY [1..9] OF COLORS;
X  CUBES = PACKED ARRAY [LEFT..BACK] OF CUBITS;
X
XVAR 
X  X,
X  Y,
X  L,
X  C1,
X  C2,
X  CUBESEPX,
X  CUBESEPY,
X  CUBEADJX,
X  CUBEADJY,
X  SCORE,
X  MIXES,
X  MOVES,
X  CUBEADJUST,
X  DIR,
X  I:INTEGER;
X  QUIT,
X  DONE:BOOLEAN;
X  CUBEARRAY:CUBES;
X  CCOLOR,
X  COLOR:COLORS;
X  CTYPE,
X  CUBEPLACE:WHERE;
X  TURN:ROTATE;
X  KEY:CHAR;
X  IOCHAN:IWORD;
X  OUTFILE:TEXT;
X
X(******************************************************************************)
X
X[INITIALIZE]
XPROCEDURE InitializeCubeParams;
X  BEGIN
X    WRITELN(CHR(27),'P1p');
X    WRITELN('S(M0(AD)M1(AR)M2(AB)M3(AY))');
X    WRITELN('l(a2)"A"55aa55aa55aa55aa55aa;');
X    WRITELN(CHR(27),'\');
X
X    FOR I := 1 TO 9 DO BEGIN
X      CUBEARRAY[RIGHT][I] := YELLOW;
X      CUBEARRAY[LEFT][I]  := WHITE;
X      CUBEARRAY[UP][I]    := BLUE;
X      CUBEARRAY[DOWN][I]  := GREEN;
X      CUBEARRAY[FRONT][I] := RED;
X      CUBEARRAY[BACK][I]  := ORANGE;
X      END;
X    DONE  := FALSE;
X    QUIT  := FALSE;
X    MOVES := 0;
X    MIXES := 0;
X    SCORE := 0;
X    CubeAdjX := round(CubeSize * cos(TiltAngle));
X    CubeAdjY := round(CubeSize * sin(TiltAngle));
X    CubeSepX := round(CubeSep  * cos(TiltAngle));
X    CubeSepY := round(CubeSep  * sin(TiltAngle));
X  END;
X
X(******************************************************************************)
X
XPROCEDURE Initialize(VAR CUBEARRAY:CUBES;VAR MIXES,MOVES,SCORE:INTEGER);
X
XBEGIN
X    FOR I := 1 TO 9 DO BEGIN
X      CUBEARRAY[RIGHT][I] := YELLOW;
X      CUBEARRAY[LEFT][I]  := WHITE;
X      CUBEARRAY[UP][I]    := BLUE;
X      CUBEARRAY[DOWN][I]  := GREEN;
X      CUBEARRAY[FRONT][I] := RED;
X      CUBEARRAY[BACK][I]  := ORANGE;
X      END;
X    MOVES := 0;
X    MIXES := 0;
X    SCORE := 0;
X  END;
X
X(******************************************************************************)
X
XPROCEDURE REGIS;
X
XBEGIN
X  WRITELN(CHR(27),'Pp');
XEND;
X
X(******************************************************************************)
X
XPROCEDURE ASCII;
X
XBEGIN
X  WRITELN(CHR(27),'[;H');
X  WRITELN(CHR(27),'\');
XEND;
X
X(******************************************************************************)
X
XPROCEDURE POSITION(ROW,COL:INTEGER);
X
XBEGIN
X  WRITELN('P[',COL:1,',',ROW:1,']');
XEND;
X
X(******************************************************************************)
X
XPROCEDURE RANDOMNUMBER(VAR RANDOM:INTEGER;MINVALUE,MAXVALUE:INTEGER);
X
XTYPE
X  STRING = PACKED ARRAY [1..11] OF CHAR;
X
XVAR
X  CURTIME : STRING;
X  SEED : INTEGER;
X
XBEGIN
X  CURTIME := '00:00:00.00';
X  TIME(CURTIME);
X  RANDOM := 0;
X  SEED := 0;
X  SEED := SEED + 1 * (ORD(CURTIME[10])-48);
X  SEED := SEED + 10 * (ORD(CURTIME[11])-48);
X  RANDOM := ROUND((SEED/99) * (MAXVALUE - MINVALUE)) + MINVALUE;
XEND;
X
X(******************************************************************************)
X 
XPROCEDURE Coords ( VAR CubeNumber: integer;  VAR CubeType: Where);
X  VAR bx,by,ccx,ccy:integer;
X  BEGIN
X    bx := (CubeNumber-1) MOD 3;
X    by := (CubeNumber-1) DIV 3;
X    CASE CubeType OF
X      TILTFRONT,
X      TILTRIGHT,
X      TILTTOP: BEGIN
X                 ccx := CubeCornerX;
X                 ccy := CubeCornerY;
X               END;
X      TILTBACK: BEGIN
X                  ccx := CubeCornerX + CubeSepX*7;
X                  ccy := CubeCornerY - CubeSepy*7;
X                END;
X      TILTLEFT: BEGIN
X                  ccx := CubeCornerX - CubeSepX*7;
X                  ccy := CubeCornerY;
X                END;
X      TILTDOWN: BEGIN
X                  ccx := CubeCornerX;
X                  ccy := CubeCornerY + CubeSepY*10;
X                END;
X      OTHERWISE;
X      END;
X    CASE CubeType OF
X      TILTFRONT,TILTBACK: 
X             BEGIN
X               x := ccx + bx * CubeSep  ;
X               y := ccy + by * CubeSep  ;
X             END;
X      TILTRIGHT,TILTLEFT:
X             BEGIN
X               x := ccx + (CubeSep  * 3) + (bx * CubeSepX);
X               y := ccy + (CubeSep  * by) - (bx * CubeSepY); 
X             END;
X      TILTTOP,TILTDOWN:
X             BEGIN
X               x := ccx + (CubeSepX *3) + (bx*CubeSep) - (by*CubeSepX);
X               y := ccy - (CubeSepY *3) + (by*CubeSepY);
X             END;
X      END;
X  END;
X
X(******************************************************************************)
X
XPROCEDURE SetColor(VAR Color: Colors);
X  BEGIN
X    CASE Color OF
X      RED : BEGIN
X              c1 := ColorRed;
X              c2 := ColorRed;
X            END;
X      YELLOW: 
X            BEGIN
X              c1 := ColorYellow;
X              c2 := ColorYellow;
X            END;
X      BLUE:
X            BEGIN
X              c1 := ColorBlue;
X              c2 := ColorBlue;
X            END;
X      ORANGE:
X            BEGIN 
X              c1 := ColorRed;
X              c2 := ColorYellow;
X            END;
X      WHITE:
X            BEGIN
X              c1 := ColorBlue;
X              c2 := ColorYellow;
X            END;
X      GREEN:
X            BEGIN
X              c1 := ColorBlue;
X              c2 := ColorRed;
X            END;
X      END;
X  END;
X
X(******************************************************************************)
X
XPROCEDURE SetFill(VAR CubeType: Where);
X  VAR solid : boolean;
X  BEGIN
X    solid := (c1 = c2);
X    Write('w(r,i',c1:1,',s');
X    IF solid 
X      THEN
X        BEGIN
X          CASE CubeType OF
X            TILTBACK,TILTLEFT,TILTFRONT,TILTRIGHT: Writeln('1)');
X                                 TILTDOWN,TILTTOP: Writeln('1(x))');
X            END;
X        END
X      ELSE
X        BEGIN
X          CASE CubeType OF
X             TILTBACK,TILTLEFT,TILTFRONT,TILTRIGHT: Writeln('"A")s(i',c2:1,')');
X                               TILTDOWN,TILTTOP: Writeln('"A"(x))s(i',c2:1,')');
X             END;
X        END;
X  END;
X
X(******************************************************************************)
X
XPROCEDURE Square (CubeNumber: integer;
X                  CubeType: Where; Color: Colors);
X
X  BEGIN
X    Coords(CubeNumber,CubeType);  (* Compute X,Y *)
X    Writeln('p[',x,',',y,']t(a2)');   (* Place cursor at x,y *)
X    SetColor(Color);             (* Select c1 and c2 *)
X    CASE CubeType OF
X          TILTFRONT,TILTBACK:
X            BEGIN
X              SetFill(CubeType);
X              Writeln('v[,+',cubesize,'][+',cubesize,']');
X            END;
X      TILTRIGHT,TILTLEFT:
X          BEGIN
X             SetFill(CubeType);
X             Writeln('v[,+',cubesize,'][+',CubeAdjX,
X                     ',-',CubeAdjY,']');
X             Writeln('v[,-',cubesize,'][-',CubeAdjX,
X                     ',+',CubeAdjY,']')
X          END;
X        TILTTOP,TILTDOWN:
X          BEGIN
X             SetFill(CubeType);
X             Writeln('v[-',CubeAdjX,',+',CubeAdjY,
X                     '][+',Cubesize,']');
X             Writeln('v[+',CubeAdjX,',-',CubeadjY,']');
X           END;
X    END;
X  Writeln('w(s0)s(i0)t(a0)');
X END;
X
X(******************************************************************************)
X
XPROCEDURE OPENKEY;
X  VAR
X    STAT : IWORD;
X    DEVNAME: SHORTSTRING;
X  BEGIN
X    DEVNAME := 'TT:';
X    STAT := $ASSIGN(DEVNAME,IOCHAN);
X  END;
X
X(******************************************************************************)
X
XPROCEDURE SHUTKEY;
X  VAR 
X    STAT : IWORD;
X  BEGIN
X    STAT := $DASSGN(IOCHAN);
X  END;
X
X(******************************************************************************)
X  
XFUNCTION GETKEY:CHAR;
X  VAR
X    FUNC,STAT : IWORD;
X    CH : CHAR;
X  BEGIN
X    FUNC := IO$_READVBLK + IO$M_NOECHO + IO$M_NOFILTR;
X    STAT := $QIOW (,IOCHAN,FUNC,,,,CH,1);
X    GETKEY := CH;
X  END;
X
X(******************************************************************************)
X
XPROCEDURE SIDES(TURN:ROTATE);
X
XBEGIN
X  CASE TURN OF 
X    FRONT : FOR I := 1 TO 3 DO BEGIN
X              SQUARE(I,TILTFRONT,CUBEARRAY[FRONT][I]);
X              SQUARE(I+3,TILTFRONT,CUBEARRAY[FRONT][I+3]);
X              SQUARE(I+6,TILTFRONT,CUBEARRAY[FRONT][I+6]);
X              SQUARE((I+6),TILTTOP,CUBEARRAY[UP][I+6]);
X              SQUARE(((I*3)-2),TILTRIGHT,CUBEARRAY[RIGHT][((I*3)-2)]);
X              SQUARE((I+6),TILTDOWN,CUBEARRAY[DOWN][I]);
X              SQUARE(((I*3)-2),TILTLEFT,CUBEARRAY[LEFT][(I*3)]);
X              END;
X    RIGHT : FOR I := 1 TO 3 DO BEGIN
X              SQUARE(I,TILTRIGHT,CUBEARRAY[RIGHT][I]);
X              SQUARE(I+3,TILTRIGHT,CUBEARRAY[RIGHT][I+3]);
X              SQUARE(I+6,TILTRIGHT,CUBEARRAY[RIGHT][I+6]);
X              SQUARE((I*3),TILTTOP,CUBEARRAY[UP][I*3]);
X              SQUARE((I*3),TILTFRONT,CUBEARRAY[FRONT][(I*3)]);
X              SQUARE((I*3),TILTDOWN,CUBEARRAY[DOWN][((4-I)*3)]);
X              SQUARE((I*3),TILTBACK,CUBEARRAY[BACK][((I*3)-2)]);
X              END;
X    UP    : FOR I := 1 TO 3 DO BEGIN
X              SQUARE(I,TILTTOP,CUBEARRAY[UP][I]);
X              SQUARE(I+3,TILTTOP,CUBEARRAY[UP][I+3]);
X              SQUARE(I+6,TILTTOP,CUBEARRAY[UP][I+6]);
X              SQUARE(I,TILTFRONT,CUBEARRAY[FRONT][I]);
X              SQUARE(I,TILTRIGHT,CUBEARRAY[RIGHT][I]);
X              SQUARE(I,TILTLEFT,CUBEARRAY[LEFT][(4-I)]);
X              SQUARE(I,TILTBACK,CUBEARRAY[BACK][(4-I)]);
X              END;
X    BACK  : FOR I := 1 TO 3 DO BEGIN
X              SQUARE(I,TILTBACK,CUBEARRAY[BACK][(4-I)]);
X              SQUARE(I+3,TILTBACK,CUBEARRAY[BACK][(4-I)+3]);
X              SQUARE(I+6,TILTBACK,CUBEARRAY[BACK][(4-I)+6]);
X              SQUARE(I,TILTTOP,CUBEARRAY[UP][I]);
X              SQUARE((I*3),TILTRIGHT,CUBEARRAY[RIGHT][(I*3)]);
X              SQUARE((I*3),TILTLEFT,CUBEARRAY[LEFT][((I*3)-2)]);
X              SQUARE(I,TILTDOWN,CUBEARRAY[DOWN][(I+6)]);
X              END;
X    LEFT  : FOR I := 1 TO 3 DO BEGIN
X              SQUARE(I,TILTLEFT,CUBEARRAY[LEFT][(4-I)]);
X              SQUARE(I+3,TILTLEFT,CUBEARRAY[LEFT][(4-I)+3]);
X              SQUARE(I+6,TILTLEFT,CUBEARRAY[LEFT][(4-I)+6]);
X              SQUARE(((I*3)-2),TILTTOP,CUBEARRAY[UP][((I*3)-2)]);
X              SQUARE(((I*3)-2),TILTFRONT,CUBEARRAY[FRONT][((I*3)-2)]);
X              SQUARE(((I*3)-2),TILTBACK,CUBEARRAY[BACK][(I*3)]);
X              SQUARE(((I*3)-2),TILTDOWN,CUBEARRAY[DOWN][(((4-I)*3)-2)]);
X              END;
X    DOWN  : FOR I := 1 TO 3 DO BEGIN
X              SQUARE(I+6,TILTDOWN,CUBEARRAY[DOWN][I]);
X              SQUARE(I+3,TILTDOWN,CUBEARRAY[DOWN][I+3]);
X              SQUARE(I,TILTDOWN,CUBEARRAY[DOWN][(I+6)]);
X              SQUARE((I+6),TILTFRONT,CUBEARRAY[FRONT][(I+6)]);
X              SQUARE((I+6),TILTRIGHT,CUBEARRAY[RIGHT][(I+6)]);
X              SQUARE((I+6),TILTBACK,CUBEARRAY[BACK][((4-I)+6)]);
X              SQUARE((I+6),TILTLEFT,CUBEARRAY[LEFT][((4-I)+6)]);
X              END;
X    END;
XEND;
X
X(******************************************************************************)
X
XPROCEDURE TURNSIDE(TURN:ROTATE;DIR:INTEGER);
X
XVAR
X  NUMBER:INTEGER;
X  TEMP:COLORS;
X
XBEGIN
X  FOR NUMBER := 1 TO DIR DO BEGIN
X    TEMP               := CUBEARRAY[TURN][1];
X    CUBEARRAY[TURN][1] := CUBEARRAY[TURN][7];
X    CUBEARRAY[TURN][7] := CUBEARRAY[TURN][9];
X    CUBEARRAY[TURN][9] := CUBEARRAY[TURN][3];
X    CUBEARRAY[TURN][3] := TEMP;
X    TEMP               := CUBEARRAY[TURN][2];
X    CUBEARRAY[TURN][2] := CUBEARRAY[TURN][4];
X    CUBEARRAY[TURN][4] := CUBEARRAY[TURN][8];
X    CUBEARRAY[TURN][8] := CUBEARRAY[TURN][6];
X    CUBEARRAY[TURN][6] := TEMP;
X    END;
XEND;
X
X(******************************************************************************)
X
XPROCEDURE CHANGEARRAY(VAR CUBEARRAY:CUBES;TURN:ROTATE;DIR:INTEGER);
X
XVAR
X  TEMPARRAY : PACKED ARRAY [1..3] OF COLORS;
X  TEMP:COLORS;
X  J,
X  X,
X  Y:INTEGER;
X
XBEGIN
X  TURNSIDE(TURN,DIR);
X  FOR X := 1 TO DIR DO BEGIN
X    IF (TURN = UP) THEN
X      FOR J := 1 TO 3 DO BEGIN
X        TEMP                := CUBEARRAY[FRONT][J];
X        CUBEARRAY[FRONT][J] := CUBEARRAY[RIGHT][J];
X        CUBEARRAY[RIGHT][J] := CUBEARRAY[BACK][J];
X        CUBEARRAY[BACK][J]  := CUBEARRAY[LEFT][J];
X        CUBEARRAY[LEFT][J]  := TEMP;
X        END;
X    IF (TURN = DOWN) THEN
X      FOR J := 1 TO 3 DO BEGIN
X        TEMP                  := CUBEARRAY[FRONT][J+6];
X        CUBEARRAY[FRONT][J+6] := CUBEARRAY[LEFT][J+6];
X        CUBEARRAY[LEFT][J+6]  := CUBEARRAY[BACK][J+6];
X        CUBEARRAY[BACK][J+6]  := CUBEARRAY[RIGHT][J+6];
X        CUBEARRAY[RIGHT][J+6] := TEMP;
X        END;
X    IF (TURN = RIGHT) THEN
X      FOR J := 1 TO 3 DO BEGIN
X        TEMP                      := CUBEARRAY[FRONT][(4-J)*3];
X        CUBEARRAY[FRONT][(4-J)*3] := CUBEARRAY[DOWN][(4-J)*3];
X        CUBEARRAY[DOWN][(4-J)*3]  := CUBEARRAY[BACK][(J*3)-2];
X        CUBEARRAY[BACK][(J*3)-2]  := CUBEARRAY[UP][(4-J)*3];
X        CUBEARRAY[UP][(4-J)*3]    := TEMP;
X        END;
X    IF (TURN = LEFT) THEN 
X      FOR J := 1 TO 3 DO BEGIN
X        TEMP                       := CUBEARRAY[FRONT][(J*3)-2];
X        CUBEARRAY[FRONT][(J*3)-2]  := CUBEARRAY[UP][(J*3)-2];
X        CUBEARRAY[UP][(J*3)-2]     := CUBEARRAY[BACK][(4-J)*3];
X        CUBEARRAY[BACK][(4-J)*3]   := CUBEARRAY[DOWN][(J*3)-2];
X        CUBEARRAY[DOWN][(J*3)-2]   := TEMP;
X        END;
X    IF (TURN = FRONT) THEN 
X      FOR J := 1 TO 3 DO BEGIN
X        TEMP                       := CUBEARRAY[UP][J+6];
X        CUBEARRAY[UP][J+6]         := CUBEARRAY[LEFT][(4-J)*3];
X        CUBEARRAY[LEFT][(4-J)*3]   := CUBEARRAY[DOWN][(4-J)];
X        CUBEARRAY[DOWN][(4-J)]     := CUBEARRAY[RIGHT][(J*3)-2];
X        CUBEARRAY[RIGHT][(J*3)-2]  := TEMP
X        END;
X    IF (TURN = BACK) THEN
X      FOR J := 1 TO 3 DO BEGIN
X        TEMP                      := CUBEARRAY[UP][4-J];
X        CUBEARRAY[UP][4-J]        := CUBEARRAY[RIGHT][(4-J)*3];
X        CUBEARRAY[RIGHT][(4-J)*3] := CUBEARRAY[DOWN][J+6];
X        CUBEARRAY[DOWN][J+6]      := CUBEARRAY[LEFT][(J*3)-2];
X        CUBEARRAY[LEFT][(J*3)-2]  := TEMP
X        END;
X    END;
XEND;
X
X(******************************************************************************)
X
XPROCEDURE DRAWCUBE;
X
XVAR
X  I : INTEGER;
X
XBEGIN
X  FOR I := 1 TO 3 DO BEGIN
X    SQUARE(I,TILTTOP,CUBEARRAY[UP][I]);
X    SQUARE(I+3,TILTTOP,CUBEARRAY[UP][I+3]);
X    SQUARE(I+6,TILTTOP,CUBEARRAY[UP][I+6]);
X    SQUARE(I,TILTFRONT,CUBEARRAY[FRONT][I]);
X    SQUARE(I+3,TILTFRONT,CUBEARRAY[FRONT][I+3]);
X    SQUARE(I+6,TILTFRONT,CUBEARRAY[FRONT][I+6]);
X    SQUARE(I,TILTRIGHT,CUBEARRAY[RIGHT][I]);
X    SQUARE(I+3,TILTRIGHT,CUBEARRAY[RIGHT][I+3]);
X    SQUARE(I+6,TILTRIGHT,CUBEARRAY[RIGHT][I+6]);
X    SQUARE(I,TILTBACK,CUBEARRAY[BACK][(4-I)]);
X    SQUARE(I+3,TILTBACK,CUBEARRAY[BACK][(4-I)+3]);
X    SQUARE(I+6,TILTBACK,CUBEARRAY[BACK][(4-I)+6]);
X    SQUARE(I,TILTLEFT,CUBEARRAY[LEFT][(4-I)]);
X    SQUARE(I+3,TILTLEFT,CUBEARRAY[LEFT][(4-I)+3]);
X    SQUARE(I+6,TILTLEFT,CUBEARRAY[LEFT][(4-I)+6]);
X    SQUARE(I,TILTDOWN,CUBEARRAY[DOWN][I+6]);
X    SQUARE(I+3,TILTDOWN,CUBEARRAY[DOWN][I+3]);
X    SQUARE(I+6,TILTDOWN,CUBEARRAY[DOWN][I]);
X    END;
XEND;
X
X(******************************************************************************)
X
XPROCEDURE TURNCUBE(VAR CUBEARRAY:CUBES;TURN:ROTATE);
X
XVAR
X  TEMPARRAY : PACKED ARRAY [1..9] OF COLORS;
X  J:INTEGER;
X
XBEGIN
X  CASE TURN OF 
X    UP    : BEGIN
X              TURNSIDE(RIGHT,1);
X              TURNSIDE(LEFT,3);
X              FOR J := 1 TO 9 DO BEGIN
X                TEMPARRAY[J]          := CUBEARRAY[UP][J];
X                CUBEARRAY[UP][J]      := CUBEARRAY[FRONT][J];
X                CUBEARRAY[FRONT][J]   := CUBEARRAY[DOWN][J];
X                CUBEARRAY[DOWN][J]    := CUBEARRAY[BACK][10-J];
X                CUBEARRAY[BACK][10-J] := TEMPARRAY[J];
X                END;
X              END;
X    DOWN  : BEGIN
X              TURNSIDE(RIGHT,3);
X              TURNSIDE(LEFT,1);
X              FOR J := 1 TO 9 DO BEGIN
X                TEMPARRAY[J]          := CUBEARRAY[UP][J];
X                CUBEARRAY[UP][J]      := CUBEARRAY[BACK][10-J];
X                CUBEARRAY[BACK][10-J] := CUBEARRAY[DOWN][J];
X                CUBEARRAY[DOWN][J]    := CUBEARRAY[FRONT][J];
X                CUBEARRAY[FRONT][J]   := TEMPARRAY[J];
X                END;
X              END;
X    RIGHT : BEGIN
X              TURNSIDE(UP,3);
X              TURNSIDE(DOWN,1);
X              FOR J := 1 TO 9 DO BEGIN
X                TEMPARRAY[J]          := CUBEARRAY[FRONT][J];
X                CUBEARRAY[FRONT][J]   := CUBEARRAY[LEFT][J];
X                CUBEARRAY[LEFT][J]    := CUBEARRAY[BACK][J];
X                CUBEARRAY[BACK][J]    := CUBEARRAY[RIGHT][J];
X                CUBEARRAY[RIGHT][J]   := TEMPARRAY[J];
X                END;
X              END;
X    LEFT  : BEGIN
X              TURNSIDE(UP,1);
X              TURNSIDE(DOWN,3);
X              FOR J := 1 TO 9 DO BEGIN
X                TEMPARRAY[J]          := CUBEARRAY[FRONT][J];
X                CUBEARRAY[FRONT][J]   := CUBEARRAY[RIGHT][J];
X                CUBEARRAY[RIGHT][J]   := CUBEARRAY[BACK][J];
X                CUBEARRAY[BACK][J]    := CUBEARRAY[LEFT][J];
X                CUBEARRAY[LEFT][J]    := TEMPARRAY[J];
X                END;
X              END;
X    END;
X  DRAWCUBE;
XEND;
X
X(******************************************************************************)
X
XPROCEDURE LOADCUBE(VAR CUBEARRAY:CUBES;VAR MOVES,MIXES:INTEGER);
X
XBEGIN
X  OPEN (FILE_NAME     := 'SYS$LOGIN:CUBE.DAT',
X        FILE_VARIABLE := OUTFILE,
X        HISTORY       := OLD,
X        ACCESS_METHOD := SEQUENTIAL);
X  RESET(OUTFILE);
X  FOR I := 1 TO 9 DO BEGIN
X    READLN(OUTFILE,CUBEARRAY[RIGHT][I]);
X    READLN(OUTFILE,CUBEARRAY[LEFT][I]);
X    READLN(OUTFILE,CUBEARRAY[UP][I]);
X    READLN(OUTFILE,CUBEARRAY[DOWN][I]);
X    READLN(OUTFILE,CUBEARRAY[FRONT][I]);
X    READLN(OUTFILE,CUBEARRAY[BACK][I]);
X    END;
X    READLN(OUTFILE,MOVES,MIXES);
X  CLOSE(OUTFILE);
XEND;
X
X(******************************************************************************)
X
XPROCEDURE SAVECUBE;
X
XBEGIN
X  OPEN (FILE_NAME     := 'SYS$LOGIN:CUBE.DAT',
X        FILE_VARIABLE := OUTFILE,
X        HISTORY       := NEW,
X        ACCESS_METHOD := SEQUENTIAL);
X  REWRITE(OUTFILE);
X  FOR I := 1 TO 9 DO BEGIN
X    WRITELN(OUTFILE,CUBEARRAY[RIGHT][I]);
X    WRITELN(OUTFILE,CUBEARRAY[LEFT][I]);
X    WRITELN(OUTFILE,CUBEARRAY[UP][I]);
X    WRITELN(OUTFILE,CUBEARRAY[DOWN][I]);
X    WRITELN(OUTFILE,CUBEARRAY[FRONT][I]);
X    WRITELN(OUTFILE,CUBEARRAY[BACK][I]);
X    END;
X   WRITELN(OUTFILE,MOVES,MIXES);
X   CLOSE(OUTFILE);
XEND;
X
X(******************************************************************************)
X
XPROCEDURE WRITEMOVES(MOVES:INTEGER);
X
XBEGIN
X  POSITION(50,50);
X  WRITELN('T''Moves : ',MOVES:1,' '' ');
XEND;
X
X(******************************************************************************)
X
XPROCEDURE WRITEMIXES(MIXES:INTEGER);
X
XBEGIN
X  POSITION(70,50);
X  WRITELN('T''Mixes : ',MIXES:1,' '' ');
XEND;
X
X(******************************************************************************)
X
XPROCEDURE DRAWSCREEN;
X
XBEGIN
X  REGIS;
X  Writeln('s(m0(ad)m1(ar)m2(ab)m3(ay))');
X  WRITELN('S(C0)');
X  WRITELN('S(E)');
X  POSITION(50,600);
X  WRITELN('T''Side to move : '' ');
X  POSITION(70,620);
X  WRITELN('T''U = Up'' ');
X  POSITION(90,620);
X  WRITELN('T''D = Down'' ');
X  POSITION(110,620);
X  WRITELN('T''R = Right'' ');
X  POSITION(130,620);
X  WRITELN('T''L = Left'' ');
X  POSITION(150,620);
X  WRITELN('T''F = Front'' ');
X  POSITION(170,620);
X  WRITELN('T''B = Back'' ');
X  POSITION(200,600);
X  WRITELN('T''Direction : '' ');
X  POSITION(220,620);
X  WRITELN('T''+ = +  90 Degrees'' ');
X  POSITION(240,620);
X  WRITELN('T''- = -  90 Degrees'' ');
X  POSITION(260,620);
X  WRITELN('T''2 =   180 Degrees'' ');
X  POSITION(290,600);
X  WRITELN('T''Other Commands : '' ');
X  POSITION(310,620);
X  WRITELN('T''CTRL-F = Fix Cube'' ');
X  POSITION(330,620);
X  WRITELN('T''CTRL-J = Jumble Cube'' ');
X  POSITION(350,620);
X  WRITELN('T''CTRL-L = Load Game'' ');
X  POSITION(370,620);
X  WRITELN('T''CTRL-H = Save Game'' ');
X  POSITION(390,620);
X  WRITELN('T''CTRL-W = Screen Refresh'' ');
X  POSITION(410,620);
X  WRITELN('T''CTRL-Z = Quit Game'' ');
X  POSITION(430,620);
X  WRITELN('T''Arrow Keys = Rotate'' ');
X  WRITEMIXES(MIXES);
X  WRITEMOVES(MOVES);
X  DRAWCUBE;
XEND;
X
X(******************************************************************************)
X
XPROCEDURE CHECKCUBE(VAR DONE:BOOLEAN);
X
XVAR
X  I:INTEGER;
X
XBEGIN
X  DONE := TRUE;
X  FOR I := 1 TO 9 DO BEGIN
X    IF (CUBEARRAY[UP][I]    <> CUBEARRAY[UP][5])    THEN DONE := FALSE;
X    IF (CUBEARRAY[DOWN][I]  <> CUBEARRAY[DOWN][5])  THEN DONE := FALSE;
X    IF (CUBEARRAY[RIGHT][I] <> CUBEARRAY[RIGHT][5]) THEN DONE := FALSE;
X    IF (CUBEARRAY[LEFT][I]  <> CUBEARRAY[LEFT][5])  THEN DONE := FALSE;
X    IF (CUBEARRAY[FRONT][I] <> CUBEARRAY[FRONT][5]) THEN DONE := FALSE;
X    IF (CUBEARRAY[BACK][I]  <> CUBEARRAY[BACK][5])  THEN DONE := FALSE;
X    END;
XEND;
X
X(******************************************************************************)
X
XPROCEDURE ESCAPE(VAR KEY:CHAR);
X
XVAR 
X  KEY2,
X  KEY3:CHAR;
X
XBEGIN
X  KEY2 := ' ';
X  KEY3 := ' ';
X  KEY2 := GETKEY;
X  IF (KEY2 = CHR(63)) OR (KEY2 = CHR(79)) THEN 
X    BEGIN
X      KEY3 := GETKEY;
X      CASE KEY3 OF 
X        CHR(108) : KEY := ',';
X        CHR(109) : KEY := '-';
X        CHR(112) : KEY := '0';
X        CHR(113) : KEY := '1';
X        CHR(114) : KEY := '2';
X        CHR(115) : KEY := '3';
X        CHR(116) : KEY := '4';
X        CHR(117) : KEY := '5';
X        CHR(118) : KEY := '6';
X        CHR(119) : KEY := '7';
X        CHR(120) : KEY := '8';
X        CHR(121) : KEY := '9';
X        END;
X      END;
X    IF (KEY2 = CHR(91)) THEN BEGIN
X      KEY3 := GETKEY;
X      CASE KEY3 OF
X        CHR(65) : TURNCUBE(CUBEARRAY,UP);
X        CHR(66) : TURNCUBE(CUBEARRAY,DOWN);
X        CHR(67) : TURNCUBE(CUBEARRAY,RIGHT);
X        CHR(68) : TURNCUBE(CUBEARRAY,LEFT);
X        END;
X      END;
XEND;
X
X(******************************************************************************)
X
XPROCEDURE MESSCUBE(VAR CUBEARRAY:CUBES);
X
XVAR
X  DONE:BOOLEAN;
X  TEMP,
X  RANDOM2,
X  RANDOM3:INTEGER;
X  RANDOMTURN:ROTATE;
X
XBEGIN
X  FOR I := 1 TO 40 DO BEGIN
X    DONE := FALSE;
X    REPEAT
X      RANDOMNUMBER(RANDOM2,1,6);
X      CASE RANDOM2 OF
X        1 : BEGIN
X              IF (RANDOM2 <> TEMP) AND (TEMP <> 2) THEN
X                RANDOMTURN := FRONT;
X              DONE := TRUE;
X              END;
X        2 : BEGIN
X              IF (RANDOM2 <> TEMP) AND (TEMP <> 1) THEN
X                RANDOMTURN := BACK;
X              DONE := TRUE;
X              END;
X        3 : BEGIN
X              IF (RANDOM2 <> TEMP) AND (TEMP <> 4) THEN
X                RANDOMTURN := LEFT;
X              DONE := TRUE;
X              END;
X        4 : BEGIN
X              IF (RANDOM2 <> TEMP) AND (TEMP <> 3) THEN
X                RANDOMTURN := RIGHT;
X              DONE := TRUE;
X              END;
X        5 : BEGIN
X              IF (RANDOM2 <> TEMP) AND (TEMP <> 6) THEN
X                RANDOMTURN := UP;
X              DONE := TRUE;
X              END;
X        6 : BEGIN
X              IF (RANDOM2 <> TEMP) AND (TEMP <> 5) THEN
X                RANDOMTURN := DOWN;
X              DONE := TRUE;
X              END;
X        END
X      UNTIL DONE;
X    RANDOMNUMBER(RANDOM3,1,2);
X    IF RANDOM3 = 2 THEN
X      RANDOM3 := 3;
X    CHANGEARRAY(CUBEARRAY,RANDOMTURN,RANDOM3);
X    TEMP := RANDOM2;
X    END;
XEND;
X
X(******************************************************************************)
X
XPROCEDURE TYPED(VAR TURN:ROTATE;VAR DIR:INTEGER;VAR DONE:BOOLEAN;VAR 
X                MOVES:INTEGER);
X
XBEGIN
X  TURN := NONE;
X  REPEAT
X    KEY := GETKEY;
X    IF (KEY = CHR(27)) THEN ESCAPE(KEY);
X    CASE KEY OF
X      CHR(6)       : BEGIN
X                       TURN := NONE;
X                       INITIALIZE(CUBEARRAY,MIXES,MOVES,SCORE);
X                       DRAWCUBE;
X                       END;
X      CHR(10)      : BEGIN
X                      MESSCUBE(CUBEARRAY);
X                      MESSCUBE(CUBEARRAY);
X                      MIXES := MIXES +1;
X                      DRAWCUBE;
X                      WRITEMIXES(MIXES);
X                      TURN := NONE;
X                      END;
X      CHR(8)      : BEGIN
X                      SAVECUBE;
X                      END;
X      CHR(12)     : BEGIN
X                      LOADCUBE(CUBEARRAY,MOVES,MIXES);
X                      DRAWCUBE;
X                      WRITEMOVES(MOVES);
X                      WRITEMIXES(MIXES);
X                      TURN := NONE;
X                      END;
X      CHR(26)     : DONE := TRUE;
X      CHR(23)     : DRAWSCREEN;
X      'R','r','6' : TURN := RIGHT;
X      'L','l','4' : TURN := LEFT;
X      'F','f','5' : TURN := FRONT;
X      'B','b','9' : TURN := BACK;
X      'U','u','8' : TURN := UP;
X      'D','d','2' : TURN := DOWN
X    OTHERWISE
X      TURN := NONE;
X      END;
X  UNTIL (TURN <> NONE) OR (KEY = CHR(23)) OR (KEY = CHR(26)) OR 
X        (KEY = CHR(8)) OR (KEY = CHR(12));
X  DIR := 0;
X  IF (KEY <> CHR(23)) AND (KEY <> CHR(26))  AND 
X     (KEY <> CHR(8)) AND (KEY <> CHR(12)) THEN REPEAT
X    KEY := GETKEY;
X    IF (KEY = CHR(27)) THEN ESCAPE(KEY);
X    CASE KEY OF
X      '+',',' : DIR := 1;
X      '2'     : DIR := 2;
X      '-'     : DIR := 3
X    OTHERWISE
X      DIR := 0;
X      END
X    UNTIL (DIR <> 0);  
X  IF (DIR <> 0) THEN MOVES := MOVES + 1;
XEND;
X
X(******************************************************************************)
X
X(* MAIN *)
X
XBEGIN
X  OPENKEY;
X  KEY   := ' ';
X  I := 0;
X    REGIS;
X    WRITELN('T(A0)');
X    DRAWSCREEN;
X    QUIT := FALSE;
X    WHILE NOT(DONE) AND NOT(QUIT) DO BEGIN
X      I := 0;
X      TYPED(TURN,DIR,QUIT,MOVES);
X      CHANGEARRAY(CUBEARRAY,TURN,DIR);
X      SIDES(TURN);
X      WRITEMOVES(MOVES);
X  (*    CHECKCUBE(DONE);*)
X      END;
X  IF DONE THEN BEGIN
X    END;
X  SHUTKEY;
X  ASCII;
XEND.
END_OF_cube.pas
if test 25565 -ne `wc -c <cube.pas`; then
    echo shar: \"cube.pas\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of shell archive.
exit 0