PROCEDURE ShowLines;

VAR S,S2 : String;

BEGIN
  SetFillStyle(SolidFill,0);
  Bar(300,460,550,478);
  Str(Lines:4,S2);
  S:='Lines : ';
  S:=S+S2+'   Level: ';
  Str(Level:4,S2);
  S:=S+S2;
  OutTextXY(300,460,S);
END;

PROCEDURE ShowGameMode;

BEGIN
   SetFillStyle(SolidFill,0);
   Bar(20,440,154,458);
   IF NrFigures<>7 THEN
    OutTextXY(20,440,'GameMode: Extended')
   ELSE
    OutTextXY(20,440,'GameMode: Standard')
END;

PROCEDURE CreateFrame;
{Used once to print the "background" of the screen (not the background grid,
but the text, and the cadre around the playfield)}

BEGIN
 setbkcolor(black);
 setviewport(0,0,getmaxx,getmaxy,clipoff);
 clearviewport;
 SetTextStyle(0,Horizdir,2);
 OuttextXY(30,50,'FPCTris v0.08, (C) by Marco v/d Voort.');
 SetTextStyle(0,Horizdir,1);
 OutTextXY(300,HelpY-30,'A demo of the FPC Graph unit');

 VLine(DisplGrX-1,DisplGrY,DisplGrY+DisplGrScale*TheHeight);
 VLine(DisplGrX+TheWidth*DisplGrScale,DisplGrY,DisplGrY+DisplGrScale*TheHeight);
 HLine(DisplGrX-1,DisplGrX+TheWidth*DisplGrScale,DisplGrY+DisplGrScale*TheHeight);

 {Clean below area}
 ShowGameMode;
 OutTextXY(300,HelpY,'Arrow left/right to move, down to drop');
 OutTextXY(300,HelpY+LineDistY,'arrow-up to rotate the piece');
 OutTextXY(300,HelpY+2*LineDistY,'"P" to pause');
 OutTextXY(300,HelpY+3*LineDistY,'"E" Mode (standard or extended)');
 OutTextXY(300,HelpY+5*LineDistY,'Escape to quit');
 OutTextXY(300,HelpY+20+6*LineDistY,'The Highscores');
 ShowHighScore;
END;

PROCEDURE DisplMainField;
{Graph mode version. Always caches.}


VAR Row,Column,StartRow,EndRow,
    L : LONGINT;
    Difference   : CARDINAL;
{    LastCol : LONGINT; }

BEGIN
 FOR Row:=0 TO TheHeight-1 DO
  BEGIN
   IF BackField[Row]<>MainField[Row] THEN
    BEGIN
     StartRow:=0;
     EndRow:=TheWidth-1;
     Difference:=MainField[Row] XOR BackField[Row];     {Calc differences in line}
     WHILE ((Difference AND AndTable[StartRow])=0) AND
        (StartRow<(TheWidth-1)) DO
      INC(StartRow);
     WHILE ((Difference AND AndTable[EndRow])=0) AND (EndRow>0) DO
      DEC(EndRow);
     FOR Column:=StartRow To EndRow DO
      BEGIN
       IF (MainField[Row] AND AndTable[Column])<>0 THEN
       BEGIN
         L:=ColorField[Row,Column];
         IF L=0 THEN
          L:=CurrentCol;
         IF L<>255 THEN
          BEGIN
           L:=L AND 15;
           SetFillStyle(SolidFill,L);
           Bar((Column)*DisplGrScale+DisplGrX,DisplGrY+DisplGrScale*Row,(Column+1)*DisplGrScale-1+DisplGrX,DisplGrY+DisplGrScale*(Row)+DisplGrScale-1);
          END;
        END
       ELSE
        BEGIN
           SetFillStyle(SolidFill,0);
           Bar((Column)*DisplGrScale+DisplGrX,DisplGrY+DisplGrScale*Row,(Column+1)*DisplGrScale-1+DisplGrX,DisplGrY+DisplGrScale*(Row)+DisplGrScale-1);
        END
      END;
   END;
  END;
  BackField:=MainField;     {Keep a copy of the screen for faster updates
                              of terminals, for next DisplMainField.}
END;

PROCEDURE ShowNextFigure(ThisFig:LONGINT);

CONST NextFigX=10;
      NextFigY=120;
      NextFigDim=16;

VAR I,J : LONGINT;
    K   : CARDINAL;
BEGIN
 IF NOT nonupdatemode THEN
  BEGIN
   FOR I:=0 TO 4 DO
    BEGIN
     K:=Figures[ThisFig][FigureNr] AND MagicMasks[I];
     IF K=0 THEN
      BEGIN
       SetFillStyle(SolidFill,0);
       Bar(NextFigX,NextFigY+I*NextFigDim,NextFigX+5*NextFigDim-1,NextFigY+(I+1)*NextFigDim);
      END
     ELSE
      BEGIN
       FOR J:=0 TO 5 DO
         IF (K And AndTable[J+5*I])=0 THEN
          BEGIN
           SetFillStyle(SolidFill,0);
           Bar(NextFigX+J*NextFigDim,NextFigY+I*NextFigDim,NextFigX++(J+1)*NextFigDim,NextFigY+(I+1)*NextFigDim);
          END
         ELSE
          BEGIN
           SetFillStyle(SolidFill,1);
           Bar(NextFigX+J*NextFigDim,NextFigY+I*NextFigDim,NextFigX++(J+1)*NextFigDim,NextFigY+(I+1)*NextFigDim);
          END;
       END;
    END;
  END;
END;

PROCEDURE FixScores;

VAR S : String;

BEGIN
   Str(Score:5,S);
   SetFillStyle(SolidFill,0);
   Bar(300,440,450,458);
   OutTextXY(300,440,'Score :'+S);
END;

