123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243 |
- PROCEDURE ShowLines;
- BEGIN
- IF NOT nonupdatemode THEN
- BEGIN
- IF UseColor THEN
- TextColor(Yellow);
- GotoXY(40,16); Write('Lines: ',Lines:4,' Level: ',Level);
- 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.08, (C) by Marco van de Voort');
- 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 DisplMainFieldMono;
- {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 DisplMainField.}
- {$ENDIF}
- END;
- PROCEDURE DisplMainFieldColor;
- {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 DisplMainField.}
- {$ENDIF}
- END;
- PROCEDURE DisplMainField;
- {Main redraw routine; Check in what mode we are and call appropriate routine}
- BEGIN
- IF UseColor THEN
- DisplMainFieldColor
- ELSE
- DisplMainFieldMono;
- 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;
- $Log$
- Revision 1.2 2000-07-13 11:33:08 michael
- + removed logs
-
- }
|