mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-06-28 22:48:21 +02:00
247 lines
5.4 KiB
PHP
247 lines
5.4 KiB
PHP
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.1 2001-05-03 21:39:33 peter
|
|
* moved to own module
|
|
|
|
Revision 1.2 2000/07/13 11:33:08 michael
|
|
+ removed logs
|
|
|
|
}
|