Browse Source

Graphical version +2fixes

marco 25 years ago
parent
commit
3f1c1e087b
1 changed files with 101 additions and 293 deletions
  1. 101 293
      install/demo/fpctris.pp

+ 101 - 293
install/demo/fpctris.pp

@@ -6,6 +6,7 @@
 
 
     FPCTris implements a simple Crt driven Tetrisish game to demonstrate the
     FPCTris implements a simple Crt driven Tetrisish game to demonstrate the
     Crt unit. (KeyPressed, ReadKey, GotoXY, Delay,TextColor,TextBackground)
     Crt unit. (KeyPressed, ReadKey, GotoXY, Delay,TextColor,TextBackground)
+    Quality games cost money, so that's why this one is free.
 
 
     See the file COPYING.FPC, included in this distribution,
     See the file COPYING.FPC, included in this distribution,
     for details about the copyright.
     for details about the copyright.
@@ -18,6 +19,13 @@
 
 
 PROGRAM FPCTris;
 PROGRAM FPCTris;
 { Trying to make a tetris from zero as a demo for FPC.
 { Trying to make a tetris from zero as a demo for FPC.
+  Problems: - Colorsupport is a hack which handicaps creating a better
+               update mechanism.
+            - Graph version input command has no cursor.
+            - Graph or text is decided runtime.
+            - Linux status graph version unknown at this moment.
+            - CVS source gameunit was used. Dunno how big the changes to
+               gameunit to accomodate the new games.
 
 
   Coordinate system:
   Coordinate system:
 
 
@@ -35,9 +43,13 @@ TheHeight-1
 
 
 }
 }
 
 
-Uses Crt,Dos,GameUnit;
+Uses Crt,Dos,
+{$IFDEF UseGraphics}
+ Graph,
+{$ENDIF}
+ GameUnit;
 
 
-{$dEFINE DoubleCache} {Try to write as less characters to console as possible}
+{$DEFINE DoubleCache}
 
 
 CONST TheWidth  = 11; {Watch out, also correct RowMask!}
 CONST TheWidth  = 11; {Watch out, also correct RowMask!}
       TheHeight = 20;
       TheHeight = 20;
@@ -47,13 +59,25 @@ CONST TheWidth  = 11; {Watch out, also correct RowMask!}
       NrLevels  = 12; {Number of levels currenty defined}
       NrLevels  = 12; {Number of levels currenty defined}
       FieldSpace= 177;
       FieldSpace= 177;
 
 
+      DisplGrX=110;
+      DisplGrY=90;
+      DisplGrScale=16;
+      HelpY=130;
+
+      {$IFDEF UseGraphics}
+       BaseX     =300;   {Coordinates of highscores}
+       BaseY     =HelpY+20+8*LineDistY;  {y coordinate relative to other options}
+      {$ELSE}
+       BaseX     =40;
+       BaseY     =9;
+      {$ENDIF}
 
 
 TYPE TetrisFieldType = ARRAY [0..25] OF LONGINT;
 TYPE TetrisFieldType = ARRAY [0..25] OF LONGINT;
      LevelInfoType   = ARRAY [0..NrLevels-1] OF LONGINT;
      LevelInfoType   = ARRAY [0..NrLevels-1] OF LONGINT;
-     FigureType      = LONGINT;    { actually array[0..3][0..3] of bit rounded up to a longint}
+     FigureType      = LONGINT;    { actually array[0..4][0..4] of bit rounded up to a longint}
      CHARSET         = SET OF CHAR;
      CHARSET         = SET OF CHAR;
 
 
-{The figures: }
+{The figures, are converted to binary bitmaps on startup.}
 
 
 CONST GraphFigures : ARRAY[0..4] OF String[80] =(
 CONST GraphFigures : ARRAY[0..4] OF String[80] =(
 '.*... .*... .*... ..*.. .*... .*... **... **... ..**. .**.. ..*.. *....',
 '.*... .*... .*... ..*.. .*... .*... **... **... ..**. .**.. ..*.. *....',
@@ -356,123 +380,11 @@ BEGIN
     FOR J:=0 TO 4 DO
     FOR J:=0 TO 4 DO
      BEGIN
      BEGIN
       IF (K AND AndTable[J+5*I])<>0 THEN
       IF (K AND AndTable[J+5*I])<>0 THEN
-       ColorField[TopY+I,TopX-Tune+J]:=CurrentCol;
+       ColorField[TopY+I,TopX-Tune+J]:=CurrentCol
      END;
      END;
   END;
   END;
 END;
 END;
 
 
-PROCEDURE DisplMainFieldTextMono;
-{Displays the grid with a simple buffering algoritm, depending on
-conditional DoubleBuffer}
-
-VAR Row,Column,Difference,StartRow,EndRow : LONGINT;
-    S : String;
-
-BEGIN
- FOR Row:=0 TO TheHeight-1 DO
-  BEGIN
-   {$IFDEF DoubleCache}
-    IF BackField[Row]<>MainField[Row] THEN
-     BEGIN
-    {$ENDIF}
-   FillChar(S[1],2*TheWidth,#32);
-   StartRow:=0;
-   EndRow:=TheWidth-1;
-   {$IFDEF DoubleCache}
-    Difference:=MainField[Row] XOR BackField[Row];     {Calc differences in line}
-    {Search for first and last bit changed}
-    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);
-   {$ENDIF}
-   {Prepare a string}
-   GotoXY(PosXField+2*StartRow,PosYField+Row);
-   S[0]:=CHR(2*(EndRow-StartRow+1));
-   FOR Column:=0 TO EndRow-StartRow DO
-    BEGIN
-     IF (MainField[Row] AND AndTable[StartRow+Column])<>0 THEN
-      BEGIN
-       S[Column*2+1]:=Style[5];
-       S[Column*2+2]:=Style[5];
-      END;
-    END;
-   {Write the string}
-   Write(S);
-   {$IFDEF DoubleCache}
-    END;
-   {$ENDIF}
-  END;
- {$IFDEF DoubleCache}
-  BackField:=MainField;     {Keep a copy of the screen for faster updates
-                              of terminals, for next DisplMainFieldText.}
- {$ENDIF}
-END;
-
-PROCEDURE DisplMainFieldTextColor;
-{Same as above, but also use ColorField to output colors,
- the buffering is the same, but the colors make it less efficient.}
-
-VAR Row,Column,Difference,StartRow,EndRow,
-    L : LONGINT;
-    S   : String;
-    LastCol : LONGINT;
-
-BEGIN
- LastCol:=255;
- FOR Row:=0 TO TheHeight-1 DO
-  BEGIN
-   {$IFDEF DoubleCache}
-    IF BackField[Row]<>MainField[Row] THEN
-     BEGIN
-    {$ENDIF}
-   FillChar(S[1],2*TheWidth,#32);
-   StartRow:=0;
-   EndRow:=TheWidth-1;
-   {$IFDEF DoubleCache}
-    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);
-   {$ENDIF}
-   GotoXY(PosXField+2*StartRow,PosYField+Row);
-   FOR Column:=0 TO EndRow-StartRow DO
-    BEGIN
-     IF (MainField[Row] AND AndTable[StartRow+Column])<>0 THEN
-      BEGIN
-       L:=ColorField[Row,StartRow+Column];
-       IF L=0 THEN
-        L:=CurrentCol;
-       IF L<>LastCol THEN
-        BEGIN
-         TextColor(L);
-         Write(Style[5],Style[5]);
-        END;
-      END
-     ELSE
-      Write('  ');
-    END;
-   {$IFDEF DoubleCache}
-    END;
-   {$ENDIF}
-  END;
- {$IFDEF DoubleCache}
-  BackField:=MainField;     {Keep a copy of the screen for faster updates
-                              of terminals, for next DisplMainFieldText.}
- {$ENDIF}
-END;
-
-PROCEDURE DisplMainFieldText;
-{Main redraw routine; Check in what mode we are and call appropriate routine}
-
-BEGIN
- IF UseColor THEN
-  DisplMainFieldTextColor
- ELSE
-  DisplMainFieldTextMono;
-END;
-
 PROCEDURE RedrawScreen;
 PROCEDURE RedrawScreen;
 {Frustrates the caching system so that the entire screen is redrawn}
 {Frustrates the caching system so that the entire screen is redrawn}
 
 
@@ -500,54 +412,12 @@ Temp:=RANDOM(TotalChance);
  GetNextFigure:=TheFigure;
  GetNextFigure:=TheFigure;
 END;
 END;
 
 
-PROCEDURE ShowNextFigure(ThisFig:LONGINT);
-
-VAR I,J,K  : LONGINT;
-    S      : String[8];
-
-BEGIN
- IF UseColor THEN
-  TextColor(White);
- IF NOT nonupdatemode THEN
-  BEGIN
-   FOR I:=0 TO 4 DO
-    BEGIN
-     FillChar(S,9,' ');
-     S[0]:=#8;
-     K:=Figures[ThisFig][FigureNr];
-     IF (I+TopY)<=TheHeight THEN
-      FOR J:=0 TO 4 DO
-       BEGIN
-        IF (K AND AndTable[J+5*I])<>0 THEN
-         BEGIN
-          S[J*2+1]:=Style[5];
-          S[J*2+2]:=Style[5];
-         END
-       END;
-     GotoXY(50,11+I); Write(S);
-    END;
-  END;
-END;
-
-PROCEDURE FixScores;
-
-BEGIN
-   IF UseColor THEN
-    SetDefaultColor;
-   GotoXY(40,18);
-   Write('Score :',Score);
-END;
-
-PROCEDURE ShowLines;
+{$IFDEF UseGraphics}
+ {$I ftrisgr.inc}
+{$ELSE}
+ {$I ftristxt.inc}
+{$ENDIF}
 
 
-BEGIN
- IF NOT nonupdatemode THEN
-  BEGIN
-   IF UseColor THEN
-    TextColor(Yellow);
-   GotoXY(40,16); Write('Lines: ',Lines:4,'    Level: ',Level);
-  END;
-END;
 
 
 FUNCTION InitAFigure(VAR TheFigure:LONGINT) : BOOLEAN;
 FUNCTION InitAFigure(VAR TheFigure:LONGINT) : BOOLEAN;
 {A new figure appears in the top of the screen. If return value=FALSE then
 {A new figure appears in the top of the screen. If return value=FALSE then
@@ -572,97 +442,6 @@ BEGIN
  ShowNextFigure(NextFigure);
  ShowNextFigure(NextFigure);
  CurrentCol:=RANDOM(14)+1;
  CurrentCol:=RANDOM(14)+1;
 END;
 END;
-{
-PROCEDURE ShowHighScore;
-
-VAR I : LONGINT;
-
-BEGIN
- GotoXY(50,9); Write('The Highscores');
- FOR I:=0 TO 9 DO
-  BEGIN
-   GotoXY(40,20-I);
-   Write(HighScore[I].Name,' ':(13-Length(HighScore[I].Name)),' ',HighScore[I].Score:5);
-  END;
-END;
-}
-PROCEDURE ShowGameMode;
-
-BEGIN
- IF NOT nonupdatemode THEN
-  BEGIN
-   GotoXY(61,13);
-   IF NrFigures<>7 THEN
-    write('Extended')
-   ELSE
-    write('Standard');
-  END;
-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}
-
-VAR I : LONGINT;
-
-BEGIN
- SetDefaultColor;
- GotoXY(40,4);
- Write('FPCTris v0.07, (C) by the FPC team.');
- GotoXY(40,6);
- Write('A demo of the FPC Crt unit, and');
- GotoXY(40,7);
- Write(' its portability');
- FOR I:=9 TO 24 DO
-  BEGIN
-   GotoXY(40,I);
-   Write(' ':38);
-  END;
- ShowGameMode;
- IF nonupdatemode THEN
-  BEGIN
-   IF HelpMode THEN
-    BEGIN
-   GotoXY(40,9);
-   Write('Arrow left/right to move, down to drop');
-   GotoXY(40,10);
-   Write('arrow-up to rotate the piece');
-   GotoXY(40,11);
-   Write('"P" to pause');
-   GotoXY(40,12);
-   Write('"E" Mode (standard or extended)');
-   GotoXY(40,13);
-   Write('"C" switches between color/mono mode');
-   GotoXY(40,14);
-   Write('Escape to quit');
-   GotoXY(40,15);
-   Write('"S" to show the highscores');
-   {$IFDEF Linux}
-   GotoXY(40,16);
-   Write('"i" try to switch to IBM character set');
-   {$ENDIF}
-   END
-   ELSE
-    ShowHighScore;
-  END
- ELSE
-  BEGIN
-   GotoXY(40,9);
-   Write('"h" to display the helpscreen');
-  END;
-
- FOR I :=0 TO TheHeight-1 DO
-  BEGIN
-   GotoXY(PosXField-1 ,PosYField+I); Write(Style[2]);
-   GotoXY(PosXField+2*TheWidth ,PosYField+I); Write(Style[2]);
-  END;
- GotoXY(PosXField-1,PosYField+TheHeight);
- Write(Style[3]);
- FOR I:=0 TO (2*TheWidth)-1 DO
-  Write(Style[1]);
- Write(Style[4]);
-END;
 
 
 PROCEDURE FixLevel(Lines:LONGINT);
 PROCEDURE FixLevel(Lines:LONGINT);
 
 
@@ -699,12 +478,14 @@ BEGIN
   END;
   END;
 
 
  INC(Lines,LocalLines);
  INC(Lines,LocalLines);
- INC(Score,ProgressiveFactor[LocalLines]*LocalLines);
 
 
  I:=Level;
  I:=Level;
  FixLevel(Lines);
  FixLevel(Lines);
  IF LocalLines<>0 THEN
  IF LocalLines<>0 THEN
-  ShowLines;
+  BEGIN
+   INC(Score,ProgressiveFactor[LocalLines]*LocalLines);
+   ShowLines;
+  END;
  {$IFDEF DoubleCache}
  {$IFDEF DoubleCache}
   IF UseColor THEN
   IF UseColor THEN
    RedrawScreen;
    RedrawScreen;
@@ -737,6 +518,16 @@ VAR I,J : LONGINT;
     S   : String;
     S   : String;
 
 
 BEGIN
 BEGIN
+ {$IFDEF UseGraphics}
+  Str(Score:5,S);
+  SetFillStyle(SolidFill,0);            {Clear part of playfield}
+  Bar(DisplGrX+DisplGrScale,DisplGrY + ((TheHeight DIV 2)-2)*DisplGrScale,
+      DisplGrX+(TheWidth-1)*(DisplGrScale), DisplGrY + DisplGrScale*((TheHeight DIV 2)+5));
+  SetTextStyle(0,Horizdir,2);
+  OuttextXY(DisplGrX+DisplGrScale,DisplGrY+ DisplGrScale*((TheHeight DIV 2)-1),'GAME OVER');
+  SetTextStyle(0,Horizdir,1);
+  OutTextXY(DisplGrX+DisplGrScale,DisplGrY+ DisplGrScale*((TheHeight DIV 2)+3),'Score= '+S);
+ {$ELSE}
  FOR J:=9 TO 22 DO
  FOR J:=9 TO 22 DO
     BEGIN
     BEGIN
      GotoXY(40,J);
      GotoXY(40,J);
@@ -746,39 +537,45 @@ BEGIN
   TextColor(White);
   TextColor(White);
  GotoXY(40,23);
  GotoXY(40,23);
  Writeln('Game Over, score = ',Score);
  Writeln('Game Over, score = ',Score);
+ {$ENDIF}
  I:=SlipInScore(Score);
  I:=SlipInScore(Score);
  IF I<>0 THEN
  IF I<>0 THEN
   BEGIN
   BEGIN
    NonUpdateMode:=TRUE;
    NonUpdateMode:=TRUE;
    HelpMode:=FALSE;
    HelpMode:=FALSE;
    ShowHighScore;
    ShowHighScore;
-   InputStr(S,40,21-I,10,FALSE,AlfaBeta);
+   {$IFDEF UseGraphics}
+    OutTextXY(450,HelpY+20+(17-I+1)*LineDistY,S);
+    GrInputStr(S,300,HelpY+20+(17-I+1)*LineDistY,16,12,10,FALSE,AlfaBeta);
+   {$ELSE}
+    InputStr(S,40,21-I,10,FALSE,AlfaBeta);
+   {$ENDIF}
    HighScore[I-1].Name:=S;
    HighScore[I-1].Name:=S;
   END;
   END;
  ShowHighScore;
  ShowHighScore;
 END;
 END;
 
 
-{$IFNDEF FPC}
-PROCEDURE SetCursorSize(CurDat:WORD);ASSEMBLER;
-ASM
-  mov ah,1
-  mov cx,CurDat
-  int $10
-END;
-
-{The two procedures below are standard (and os-independant) in FPC's Crt}
-PROCEDURE CursorOn;
-BEGIN
-  SetCursorSize($090A);
-END;
+VAR gd,gm : INTEGER;
+    Error : LONGINT;
+    {$IFDEF UseGraphics}
+    Pal   : PaletteType;
+    {$ENDIF}
 
 
-PROCEDURE CursorOff;
 BEGIN
 BEGIN
-  SetCursorSize($FFFF);
-END;
-{$ENDIF}
+ {$IFDEF UseGraphics}
+  gm:=vgahi;
+  gd:=vga;
+  InitGraph(gd,gm,'');
+  if GraphResult <> grOk then
+    begin
+      Writeln('Graph driver ',gd,' graph mode ',gm,' not supported');
+      Halt(1);
+    end;
+  SetFillStyle(SolidFill,1);
+  GetDefaultPalette(Pal);
+  SetAllPalette(Pal);
+ {$ENDIF}
 
 
-BEGIN
  {Here should be some terminal-detection for Linux}
  {Here should be some terminal-detection for Linux}
  nonupdatemode:=FALSE;
  nonupdatemode:=FALSE;
  HelpMode :=TRUE;
  HelpMode :=TRUE;
@@ -790,8 +587,8 @@ BEGIN
  ClrScr;
  ClrScr;
  CursorOff;
  CursorOff;
  RANDOMIZE;
  RANDOMIZE;
- HighX:=40;
- HighY:=9;
+ HighX:=BaseX;
+ HighY:=BaseY;
  CreateFiguresArray;                  { Load and precalculate a lot of stuff}
  CreateFiguresArray;                  { Load and precalculate a lot of stuff}
  IF UseColor THEN
  IF UseColor THEN
   Style:= ColorString
   Style:= ColorString
@@ -811,10 +608,10 @@ BEGIN
                                         one}
                                         one}
  InitAFigure(TheFigure);              {The second figure is the figure to be
  InitAFigure(TheFigure);              {The second figure is the figure to be
                                        displayed as NEXT. That's this char :-)}
                                        displayed as NEXT. That's this char :-)}
- DisplMainFieldText;                  {Display/update the grid}
+ DisplMainField;                  {Display/update the grid}
  Counter:=0;                          {counts up to IterationPerDelay}
  Counter:=0;                          {counts up to IterationPerDelay}
- DelayTime:=100;                      {Time of delay}
- IterationPerDelay:=5;                {= # Delays per shift down of figure}
+ DelayTime:=200;                      {Time of delay}
+ IterationPerDelay:=4;                {= # Delays per shift down of figure}
  Lines:=0;                            {Lines that have disappeared}
  Lines:=0;                            {Lines that have disappeared}
  Score:=0;
  Score:=0;
  ShowLines;
  ShowLines;
@@ -884,6 +681,7 @@ ORD('q'),
              EndGame:=TRUE;
              EndGame:=TRUE;
             END;
             END;
 
 
+{$IFNDEF UseGraphics}
 ORD('C'),
 ORD('C'),
  ORD('c') : BEGIN
  ORD('c') : BEGIN
              UseColor:=NOT UseColor;
              UseColor:=NOT UseColor;
@@ -896,15 +694,7 @@ ORD('C'),
               END;
               END;
              CreateFrame;
              CreateFrame;
              RedrawScreen;
              RedrawScreen;
-             DisplMainFieldText;
-            END;
-
-ORD('H'),
- ORD('h') : BEGIN
-             nonupdatemode:=NOT nonupdatemode;
-             CreateFrame;
-             ShowLines;
-             ShowNextFigure(NextFigure);
+             DisplMainField;
             END;
             END;
  ORD('S'),
  ORD('S'),
   ORD('s') : BEGIN
   ORD('s') : BEGIN
@@ -919,6 +709,14 @@ ORD('H'),
                ShowLines;
                ShowLines;
                ShowNextFigure(NextFigure);
                ShowNextFigure(NextFigure);
               END;
               END;
+{$ENDIF}
+ORD('H'),
+ ORD('h') : BEGIN
+             nonupdatemode:=NOT nonupdatemode;
+             CreateFrame;
+             ShowLines;
+             ShowNextFigure(NextFigure);
+            END;
 ORD('E'),
 ORD('E'),
  ORD('e'): BEGIN                            {Extra figures on/off}
  ORD('e'): BEGIN                            {Extra figures on/off}
             IF NrFigures<>NrFiguresLoaded THEN
             IF NrFigures<>NrFiguresLoaded THEN
@@ -936,8 +734,10 @@ ORD('p') : BEGIN                             {"p" : Pause}
             IF Key=0 THEN
             IF Key=0 THEN
              Key:=ORD(ReadKey);
              Key:=ORD(ReadKey);
            END;
            END;
+{$IFNDEF UseGraphics}
 {$IFDEF Linux}
 {$IFDEF Linux}
  ORD('i')  : write(#27+'(K');
  ORD('i')  : write(#27+'(K');
+{$ENDIF}
 {$ENDIF}
 {$ENDIF}
         END; {END OF Key CASE}
         END; {END OF Key CASE}
       END { OF If KeyPressed}
       END { OF If KeyPressed}
@@ -973,7 +773,7 @@ ORD('p') : BEGIN                             {"p" : Pause}
         BEGIN
         BEGIN
          FixMainFieldLines;
          FixMainFieldLines;
          FixFigureInField(Figures[TheFigure][FigureNr],TopX,TopY,FALSE);
          FixFigureInField(Figures[TheFigure][FigureNr],TopX,TopY,FALSE);
-         DisplMainFieldText;
+         DisplMainField;
          Delay(DelayTime*IterationPerDelay);
          Delay(DelayTime*IterationPerDelay);
         END
         END
       ELSE
       ELSE
@@ -986,12 +786,15 @@ ORD('p') : BEGIN                             {"p" : Pause}
   ELSE
   ELSE
    IF FixHickup>1 THEN
    IF FixHickup>1 THEN
     DEC(FixHickup);
     DEC(FixHickup);
- DisplMainFieldText;
+ DisplMainField;
  UNTIL EndGame;
  UNTIL EndGame;
  FixHighScores;
  FixHighScores;
  CursorOn;
  CursorOn;
  SetDefaultColor;
  SetDefaultColor;
  GotoXY(1,25);
  GotoXY(1,25);
+ {$IFDEF UseGraphics}
+  TextMode(CO80);
+ {$ENDIF}
 END;
 END;
 
 
 CONST FileName='fpctris.scr';
 CONST FileName='fpctris.scr';
@@ -1008,7 +811,12 @@ END.
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.2  1999-06-01 19:24:32  peter
+  Revision 1.3  1999-12-31 17:03:50  marco
+
+
+  Graphical version +2fixes
+
+  Revision 1.2  1999/06/01 19:24:32  peter
     * updates from marco
     * updates from marco
 
 
   Revision 1.1  1999/05/27 21:36:33  peter
   Revision 1.1  1999/05/27 21:36:33  peter