-+-+-+-+-+-+-+-+ START OF PART 3 -+-+-+-+-+-+-+-+
X(* GameLoop                                                                *
V)
X(*                                                                         *
V)
X(* Main gameplay loop here.                                                *
V)
X(*                                                                         *
V)
XPROCEDURE GameLoop;
X
XVAR greebie, next_greebie : Greebie_Type;
XVAR Greebie_Start : INTEGER;
XVAR inChar : CHAR;
XVAR cycle: INTEGER;
XVAR Delay: real;
XVAR still_falling, was_dropped : BOOLEAN;
X     `20
X   PROCEDURE init;
X   BEGIN
X     Options.quit := FALSE;
X     Options.Display_next := TRUE;
X     wow.score := 0;
X     wow.level := 1;
X     wow.lines := 0;
X     wow.stage := 1;
X     wow.lines_target := 12;
X     wow.random := 4;
X     Seed_Initialize;
X     SetUpScreen;      `20
X     ClearGrid( grid );
X     QIO_Write( vt100_esc+'`5B?25l' ); `7BTurn off cursor `7D
X     QIO_Write( vt100_no_application_keypad );     `7BNumeric Keypad  `7D
X     QIO_Write( vt100_esc+'`5B4l' );   `7BReplace Mode    `7D
X     Next_Greebie.x_pos := 6;
X     Next_Greebie.y_pos := 17;
X     Greebie_Start := 4;
X     play := TRUE;
X     Is_Msg := FALSE;
X     still_falling := TRUE;
X     was_dropped := FALSE;
X     cycle := 1;`20
X     delay := initial_delay;
X     WITH greebie DO`20
X       BEGIN
X          shape := Random( 7 ) ;
X          rot := 1;
X          x_pos := Greebie_start;
X          y_pos := 1;
X       END;
X     Next_Greebie.shape := Random( 7 );
X     Next_Greebie.rot := 1;
X     PutShape( greebie, s_draw );
X     Show_wow;
X   END;
X
XBEGIN`7B GameLoop `7D
X   init;
X   QIO_Purge;
X   `7B********************************`7D
X   `7B*  Play Loop                    `7D
X    WHILE play DO `7BOh God, not Kathy playing again is it?`7D
X      BEGIN
X      Sleep( 0,delay );
X      still_falling := TRUE;
X      inchar := QIO_1_Char_Now;
X      CASE Lower_Case(inchar) OF
X         left_key  : Move_Left( greebie );
X         right_key : Move_Right( greebie );
X         down_key  : still_falling := Move_Down( greebie );  `20
X         rotate_key: Rotate_Greebie( greebie );
X         drop_key  : BEGIN
X                       Drop_Greebie( greebie );
X                       was_dropped := TRUE;
X                     END;                     `20
X         redraw_key: ReDraw_Complete_Screen( Next_Greebie );
X         pause_key : Pause;
X         quit_key  :  BEGIN
X                        options.quit := True;
X                        play := False; `7BPiker!`7D
X                      END;
X         END;
X      cycle := cycle + 1;
X      IF ((cycle = 6) AND (play)) OR (was_dropped) THEN
X         BEGIN
X         cycle := 1;
X         IF was_dropped THEN
X            BEGIN
X            still_falling := FALSE;
X            was_dropped := FALSE;
X            END
X         ELSE
X            IF still_falling THEN
X              still_falling := Move_Down( greebie );
X         IF NOT( still_falling ) THEN BEGIN
X            Show_Wow;
X            play := Check_Resting( greebie, delay );
X            Greebie := Next_Greebie;
X            ClearNext( Next_Greebie );
X            WITH greebie DO`20
X              BEGIN
X              x_pos := Greebie_start;
X              y_pos := 1;
X              END;
X            IF play THEN
X              play := Check_Top( greebie );
X            IF play THEN BEGIN
X              Next_Greebie.shape := Random( 7 );
X              Next_Greebie.rot := 1;
X              PutShape( greebie,s_draw );
X              DisplayNext( Next_Greebie );
X            END;
X          END;
X         END; `20
X      END;
X      QIO_Write( VT100_ESC+'`5B?25h' );  `7Bturn cursor on again...`7D
X   END;
X     `20
XPROCEDURE Introduction;
XTYPE
X    filenameStr = VARYING`5B40`5D OF CHAR;
XVAR inkey : CHAR;
X   infile : TEXT;
X
X  PROCEDURE Show_File( filename : filenameStr );
X  VAR line   : VARYING`5B127`5D OF CHAR;
X      notopen: BOOLEAN;
X      oc     : INTEGER;
X  BEGIN
X     notopen := TRUE; oc := 0;
X     WHILE notopen DO
X       BEGIN
X       OPEN ( infile, filename, old, sharing := readonly, error:= continue )
V;
X       IF status( infile ) = 0 THEN
X         BEGIN
X         oc := oc + 1;
X         notopen := FALSE;
X         IF oc > 5 THEN
X           BEGIN
X           QIO_WriteLn( 'ERROR! Unable to open '+filename );
X           Halt;
X           END;
X         END;
X       END;
X     RESET( infile );
X     WHILE NOT( EOF( infile )) DO
X        BEGIN
X        Readln( infile, line );
X        QIO_WriteLn( line );
X        END;
X     CLOSE( infile );
X   END;
X
XBEGIN
X   Clear;
X   QIO_Purge;
X   Show_File( datafile1 );
X   Sleep( 2, 0 );
X   Show_File( datafile2 );
X   REPEAT
X     inkey := QIO_1_Char;
X     IF (inkey = 'i') or  (inkey = 'I') THEN
X     Show_File( datafile3 );
X   UNTIL inkey = ' ';
XEND;
X
XBEGIN
X   Image_Dir;
X   Introduction;
X   InitShapes;
X   GameLoop;
X
X(*   Hall_Of_Fame( wow.score, wow.level ); *)  (* Use if desired - requires
V *)
X                                               (*                  FAME.OBJ
V *)
X
X   Top_Ten(  wow.score  );      (* Inherited from INTERACT library        *)
X                                (*            - note: does not show Level *)
V`20
XEND.  `20
X  `20
X
$ CALL UNPACK TETRIS.PAS;1 1146278201
$ create 'f'
X`5B
X ENVIRONMENT, INHERIT(
X                      'INTERACT'
X                     )
X`5D
X
XMODULE TetShapes( output );
X`7B*************************************************************************
V***
XInits, and draw shapes
X****************************************************************************
V`7D
X
XCONST`20
X      `09ShapesMax = 18;
X      `09e = CHR(27);
X      `09inv = e+'`5B7m';
X`09nml = e+'`5Bm';
X        up  = e+'`5BA';
X`09up2 = e+'`5B2A';
X`09dn  = e+'`5BB';
X        dn2 = e+'`5B2B';
X`09le  = e+'`5BD';
X        le2 = e+'`5B2D';
X        ri  = e+'`5BC';
X        ri2 = e+'`5B2C';
X
XCONST
X        s_clear = 1;
X        s_draw  = 0;`20
X        Grid_width = 10;
X        Grid_length = 20;
X        x_offset = 16;
X        y_offset = 1;
X        max_str_len = 255;
X
XTYPE
X        $ubyte = `5BBYTE`5D 0..255;
X      `09ShapeString = VARYING`5B30`5D OF CHAR;
X        smArrayT    = ARRAY`5B0..3,0..3`5D OF $ubyte;
X
X    shape_table = RECORD`20
X             ch : CHAR;
X             max: INTEGER;
X             pointv : ARRAY`5B0..4`5D OF INTEGER;
X             sm_no : ARRAY`5B0..4`5D OF INTEGER;
X             delta_x : ARRAY`5B0..4`5D OF INTEGER;
X             END;
X
X
XGreebie_Type = RECORD
X                shape : INTEGER;
X                rot   : INTEGER;
X                x_pos, y_pos : INTEGER;
X             END;
X
XVAR`20
X        binshape : ARRAY `5B0..7`5D OF shape_table;
X`20
X      `09Shape  : ARRAY`5B1..7,1..4,0..1`5D OF ShapeString;
X        sm     : ARRAY`5B0..18`5D OF smArrayT :=
X                 ( ( (1,1,1,0),    `20
X                     (0,1,0,0),     `7B object 0, shape 0 `7D
X                     (0,0,0,0),     `7B *** `7D
X                     (0,0,0,0) ),   `7B  *  `7D
X
X                   ( (0,0,1,0),     `7B1 * `7D
X`09`09             (0,1,1,0),     `7B ** `7D
X`09`09             (0,0,1,0),     `7B  * `7D
X                     (0,0,0,0) ),
X
X                   ( (0,1,0,0),    `7B2  *  `7D
X                     (1,1,1,0),    `7B  *** `7D
X                     (0,0,0,0),
X                     (0,0,0,0) ),
X
X                   ( (1,0,0,0),    `7B *  3 `7D
X                     (1,1,0,0),    `7B **   `7D
X                     (1,0,0,0),    `7B *    `7D
X                     (0,0,0,0) ),
X
X                   ( (0,0,0,0),
X                     (1,1,1,1),  `20
X                     (0,0,0,0),   `7Bobject 1 4`7D
X                     (0,0,0,0) ), `7B **** `7D
X
X                   ( (0,1,0,0),    `7B5 * `7D
X                     (0,1,0,0),    `7B  * `7D
X                     (0,1,0,0),    `7B  * `7D
X                     (0,1,0,0) ),  `7B  * `7D
X
X                   ( (1,1,0,0),  `20
X                     (0,1,1,0),   `7Bobject 2`7D
X                     (0,0,0,0),   `7B 6 **  `7D
X                     (0,0,0,0) ), `7B    ** `7D
X
X                   ( (0,1,0,0),   `7B7  * `7D
X                     (1,1,0,0),   `7B  ** `7D
X                     (1,0,0,0),   `7B  *  `7D
X                     (0,0,0,0) ),
X
X                   ( (0,1,1,0),
X                     (1,1,0,0), `7Bobject 3`7D
X                     (0,0,0,0),   `7B 8   ** `7D
X                     (0,0,0,0) ), `7B    **  `7D
X
X                   ( (1,0,0,0),   `7B9  *  `7D
X                     (1,1,0,0),   `7B   ** `7D
X                     (0,1,0,0),   `7B    * `7D
X                     (0,0,0,0) ),
X
X                   ( (1,1,1,0),  `7Bobject 4`7D
X                     (0,0,1,0),`20
X                     (0,0,0,0),  `7B 10 *** `7D
X                     (0,0,0,0) ),`7B      * `7D
X
X                   ( (0,0,1,0),  `7B11  * `7D
X                     (0,0,1,0),  `7B    * `7D
X                     (0,1,1,0),  `7B   ** `7D
X                     (0,0,0,0) ),
X
X                   ( (1,0,0,0), `7B12  *   `7D
X                     (1,1,1,0), `7B    *** `7D
X                     (0,0,0,0),
X                     (0,0,0,0) ),
X
X        `09`09   ( (1,1,0,0),
X                     (1,0,0,0),
X                     (1,0,0,0),
X                     (0,0,0,0) ),
X
X        `09`09   ( (1,1,1,0),   `7B Object 5 `7D
X                     (1,0,0,0),
X                     (0,0,0,0),
X                     (0,0,0,0) ),
X
X        `09`09   ( (0,1,1,0),
X                     (0,0,1,0),
X                     (0,0,1,0),
X                     (0,0,0,0) ), `20
X
X                   ( (0,0,1,0),
X                     (1,1,1,0),
X                     (0,0,0,0),
X                     (0,0,0,0) ),
X
X                   ( (1,0,0,0),
X                     (1,0,0,0),
X                     (1,1,0,0),
X                     (0,0,0,0) ),
X
X                   ( (1,1,0,0),
X                     (1,1,0,0),
X                     (0,0,0,0),
X                     (0,0,0,0) ) );
X
X
XPROCEDURE InitShapes;
X`7B*************************************************************************
V****
XInitialises shapes string
X****************************************************************************
V`7D
XBEGIN
X`09shape`5B1,1,0`5D:='. .'+dn+le2+'.';
X`09shape`5B1,2,0`5D:=ri2+'.'+dn+le2+'..'+dn+le+'.';
X`09shape`5B1,3,0`5D:=ri+'.'+dn+le2+'...';
X`09shape`5B1,4,0`5D:='.'+dn+le+'..'+dn+le2+'.';
X`09
X`09shape`5B2,1,0`5D:=dn+'////';
X`09shape`5B2,2,0`5D:=ri+'/'+dn+le+'/'+dn+le+'/'+dn+le+'/';
X`09shape`5B2,3,0`5D:=dn+'////';
X`09shape`5B2,4,0`5D:=ri+'/'+dn+le+'/'+dn+le+'/'+dn+le+'/';
X
X`09shape`5B3,1,0`5D:='--'+dn+le+'--';
X`09shape`5B3,2,0`5D:=ri+'-'+dn+le2+'--'+dn+le2+'-';
X`09shape`5B3,3,0`5D:='--'+dn+le+'--';
X`09shape`5B3,4,0`5D:=ri+'-'+dn+le2+'--'+dn+le2+'-';
X
X`09shape`5B4,1,0`5D:=ri+'`60`60'+dn+le2+le+'`60`60';
X        shape`5B4,2,0`5D:='`60'+dn+le+'`60`60'+dn+le+'`60';
X`09shape`5B4,3,0`5D:=ri+'`60`60'+dn+le2+le+'`60`60';
X        shape`5B4,4,0`5D:='`60'+dn+le+'`60`60'+dn+le+'`60';
X
X`09shape`5B5,1,0`5D:='`5B`5B`5B'+dn+le+'`5B';
X`09shape`5B5,2,0`5D:=ri2+'`5B'+dn+le+'`5B'+dn+le2+'`5B`5B';
X`09shape`5B5,3,0`5D:='`5B'+dn+le+'`5B`5B`5B';
X`09shape`5B5,4,0`5D:='`5B`5B'+dn+le2+'`5B'+dn+le+'`5B';
X
X`09shape`5B6,1,0`5D:=':::'+dn+le2+le+':';
X`09shape`5B6,2,0`5D:=ri+'::'+dn+le+':'+dn+le+':';
X`09shape`5B6,3,0`5D:=ri2+':'+dn+le2+le+':::';
X`09shape`5B6,4,0`5D:=':'+dn+le+':'+dn+le+'::';
X
X`09shape`5B7,1,0`5D:='++'+dn+le2+'++';
X`09shape`5B7,2,0`5D:='++'+dn+le2+'++';
X`09shape`5B7,3,0`5D:='++'+dn+le2+'++';
X`09shape`5B7,4,0`5D:='++'+dn+le2+'++';
X
X`09shape`5B1,1,1`5D:='   '+dn+le2+' ';
X`09shape`5B1,2,1`5D:=ri2+' '+dn+le2+'  '+dn+le+' ';
X`09shape`5B1,3,1`5D:=ri+' '+dn+le2+'   ';
X`09shape`5B1,4,1`5D:=' '+dn+le+'  '+dn+le2+' ';
X`09
X`09shape`5B2,1,1`5D:=dn+'    ';
X`09shape`5B2,2,1`5D:=ri+' '+dn+le+' '+dn+le+' '+dn+le+' ';
X`09shape`5B2,3,1`5D:=dn+'    ';
X`09shape`5B2,4,1`5D:=ri+' '+dn+le+' '+dn+le+' '+dn+le+' ';
X
X`09shape`5B3,1,1`5D:='  '+dn+le+'  ';
X`09shape`5B3,2,1`5D:=ri+' '+dn+le2+'  '+dn+le2+' ';
X`09shape`5B3,3,1`5D:='  '+dn+le+'  ';
X`09shape`5B3,4,1`5D:=ri+' '+dn+le2+'  '+dn+le2+' ';
X
X`09shape`5B4,1,1`5D:=ri+'  '+dn+le2+le+'  ';
X        shape`5B4,2,1`5D:=' '+dn+le+'  '+dn+le+' ';
X`09shape`5B4,3,1`5D:=ri+'  '+dn+le2+le+'  ';
X        shape`5B4,4,1`5D:=' '+dn+le+'  '+dn+le+' ';
X
X`09shape`5B5,1,1`5D:='   '+dn+le+' ';
X`09shape`5B5,2,1`5D:=ri2+' '+dn+le+' '+dn+le2+'  ';
X`09shape`5B5,3,1`5D:=' '+dn+le+'   ';
X`09shape`5B5,4,1`5D:='  '+dn+le2+' '+dn+le+' ';
X
X`09shape`5B6,1,1`5D:='   '+dn+le2+le+' ';
X`09shape`5B6,2,1`5D:=ri+'  '+dn+le+' '+dn+le+' ';
X`09shape`5B6,3,1`5D:=ri2+' '+dn+le2+le+'   ';
X`09shape`5B6,4,1`5D:=' '+dn+le+' '+dn+le+'  ';
X
X`09shape`5B7,1,1`5D:='  '+dn+le2+'  ';
X`09shape`5B7,2,1`5D:='  '+dn+le2+'  ';
X `20
X   `09shape`5B7,3,1`5D:='  '+dn+le2+'  ';
X`09shape`5B7,4,1`5D:='  '+dn+le2+'  ';
X
X`7B-------------------------------------------------------------------------
V-`7D
X    `7B begin shape 1 definition, four rotations `7D
X
X    binshape`5B1`5D.ch := '.';
X    binshape`5B1`5D.max := 3;
X
X    binshape`5B1`5D.pointv`5B3`5D := 5;`20
X    binshape`5B1`5D.sm_no`5B3`5D := 2;
X    binshape`5B1`5D.delta_x`5B3`5D := 0;
X
X    binshape`5B1`5D.pointv`5B4`5D := 5;`20
X    binshape`5B1`5D.sm_no`5B4`5D := 3;
X    binshape`5B1`5D.delta_x`5B4`5D := 1;
X
X    binshape`5B1`5D.pointv`5B1`5D := 6;`20
X    binshape`5B1`5D.sm_no`5B1`5D := 0;
X    binshape`5B1`5D.delta_x`5B1`5D := 0;
X
X    binshape`5B1`5D.pointv`5B2`5D := 5;`20
X    binshape`5B1`5D.sm_no`5B2`5D := 1;
X    binshape`5B1`5D.delta_x`5B2`5D := 0;
X  `20
X    `7B begin shape 2 definition, four rotations `7D
X
X    binshape`5B2`5D.ch := '/';
X    binshape`5B2`5D.max := 4;
X
X    binshape`5B2`5D.pointv`5B1`5D := 5;`20
X    binshape`5B2`5D.sm_no`5B1`5D := 4;
X    binshape`5B2`5D.delta_x`5B1`5D := 0;
X
X    binshape`5B2`5D.pointv`5B2`5D := 8;`20
X    binshape`5B2`5D.sm_no`5B2`5D := 5;
X    binshape`5B2`5D.delta_x`5B2`5D := 0;
X
X    binshape`5B2`5D.pointv`5B3`5D := 5;`20
X    binshape`5B2`5D.sm_no`5B3`5D := 4;
X    binshape`5B2`5D.delta_x`5B3`5D := 0;
X
X    binshape`5B2`5D.pointv`5B4`5D := 8;`20
X    binshape`5B2`5D.sm_no`5B4`5D := 5;
X    binshape`5B2`5D.delta_x`5B4`5D := 0;
X
X
+-+-+-+-+-+-+-+-  END  OF PART 3 +-+-+-+-+-+-+-+-
