view console.pas @ 0:62966dd383ed default tip

initial
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Sun, 08 Dec 2013 19:39:15 +0100
parents
children
line wrap: on
line source

{ Display and input routines. }

UNIT Console;

INTERFACE

USES Porting;

CONST	MSGCOL:BYTE=6;	{ Default messages color. }

PROCEDURE Msg(m:STRING);	{ Displays string as a message on the right of the screen. }
PROCEDURE Txt(m:STRING);	{ Displays string as a text on the left of the screen. }
PROCEDURE Stat(m:STRING);	{ Displays string in the upper right part of the screen. }
PROCEDURE PrepScr;		{ Prepares screen (actually does nothing) }
PROCEDURE ResetScr;		{ Brings the screen to previous condition. }
PROCEDURE ClrMsg;		{ Clears the messages window. }
PROCEDURE ClrTxt;		{ Clears the text/map window. }
PROCEDURE PutChr(x,y: INTEGER; c:CHAR; a:BYTE);	{ Displays a character on the screen. }
PROCEDURE Cursor(x,y: INTEGER);	{ Changes cursor position. }

FUNCTION  GetKey:CHAR;		{ Reads a character from keyboard. }
FUNCTION  GetString(l:BYTE):STRING;	{ Allows to input a string. L sets maximum string length. }

FUNCTION  Number(n: INTEGER):STRING;	{ Converts number into a string, three characters long. }
FUNCTION  Num(n: INTEGER):STRING;	{ Converts number into a string. }
FUNCTION  Replace(s,a,b:STRING):STRING;	{ Replaces the first occurance of A in string S with B. }
FUNCTION  Capitalize(s:STRING): STRING;	{ Changes the first letter in the string to upper case. }
FUNCTION  Plural(s:STRING):STRING;	{ Replaces '@s' and makes proper plural form. }

IMPLEMENTATION

VAR	nnl: BOOLEAN;		{ No new line -- should next msg change line? }
	line,txtline: INTEGER;

FUNCTION Capitalize(s:STRING):STRING;
VAR	t: STRING;
BEGIN
	IF s='' THEN Exit;
	t:=s;
	t[1]:=UpCase(t[1]);
	Capitalize:=t;
END;

FUNCTION Plural(s:STRING):STRING;
BEGIN
	s:=Replace(s, 'y@s' , 'ies'  );
	s:=Replace(s, 'fe@s', 'ves'  );
	s:=Replace(s, 'ff@s', 'ves'  );
	s:=Replace(s, 'ex@s', 'icies');
	s:=Replace(s, 'va@s', 'vae'  );
	s:=Replace(s, 's@s' , 'ses'  );
	s:=Replace(s, '@s'  , 's'    );
	
	Plural:=s;
END;

FUNCTION Replace(s,a,b:STRING):STRING;
VAR	d: INTEGER;
BEGIN
	d:=Pos(a,s);
	Replace:=s;
	IF d<=0 THEN Exit;
	Delete(s,d,Length(a));
	Insert(b,s,d);
	Replace:=s;
END;


PROCEDURE PutChr(x,y: INTEGER;c: CHAR; a:BYTE);
BEGIN
	IF (NOT pal_changed) THEN BEGIN
		IF (a=14) THEN a:=6;
		IF (a=13) THEN a:=14;
	END;
	PutChar(x,y,c,a);
END;

PROCEDURE Cursor(x,y: INTEGER);
BEGIN
	GotoXY(x,y);
END;

PROCEDURE ClrMsg;
VAR	x,y: INTEGER;
BEGIN
	FOR y:=5 TO 24 DO
		FOR x:=50 TO 79 DO PutChar(x,y,' ',$07);
	line:=0;
	nnl:=TRUE;
END;

PROCEDURE Msg(m:STRING);
VAR	i,p: INTEGER;
	a,l: BYTE;

PROCEDURE NewLine;
BEGIN
	IF line>=19 THEN ScrollWin(50,5,79,24)
		    ELSE Inc(line);
	i:=0;
END;

BEGIN
	IF NOT nnl THEN NewLine ELSE BEGIN
		FOR i:=50 TO 79 DO PutChar(i,line+5,' ',MSGCOL);
		i:=0;
	END;
	nnl:=FALSE;
	p:=1;
	a:=MSGCOL;
	l:=Length(m);
	REPEAT
		WHILE m[p]='@' DO BEGIN
			Inc(p);
			CASE m[p] OF
				'd': a:=0;
				'b': a:=1;
				'g': a:=2;
				'c': a:=3;
				'r': a:=4;
				'p': a:=5;
				'o': a:=6;
				'w': a:=7;
				'D': a:=8;				
				'B': a:=9;
				'G': a:=10;				
				'C': a:=11;
				'R': a:=12;				
				'P': a:=13;
				'O': a:=14;				
				'W': a:=15;
				'm': a:=MSGCOL;	
				'M': a:=MSGCOL XOR $08;
				'n': NewLine;
				'N': nnl:=TRUE;
				'@': Break;
			END;
			Inc(p);
		END;
		IF p>l THEN Exit;
		IF i>29 THEN NewLine;
		PutChar(50+i,line+5,m[p],a);
		Inc(i);
		Inc(p);
	UNTIL FALSE;
END;

PROCEDURE ClrTxt;
VAR	x,y: INTEGER;
BEGIN
	FOR y:=0 TO 24 DO
		FOR x:=0 TO 49 DO PutChar(x,y,' ',$07);
	txtline:=-1;
END;


PROCEDURE Txt(m:STRING);
VAR	i,p: INTEGER;
	a,l: BYTE;

PROCEDURE NewLine;
BEGIN
	IF txtline>=24 THEN ScrollWin(0,0,49,24)
		       ELSE Inc(txtline);
	i:=0;
END;

BEGIN
	NewLine;
	p:=1;
	a:=MSGCOL;
	l:=Length(m);
	REPEAT
		WHILE m[p]='@' DO BEGIN
			Inc(p);
			CASE m[p] OF
				'd': a:=0;
				'b': a:=1;
				'g': a:=2;
				'c': a:=3;
				'r': a:=4;
				'p': a:=5;
				'o': a:=6;
				'w': a:=7;
				'D': a:=8;				
				'B': a:=9;
				'G': a:=10;				
				'C': a:=11;
				'R': a:=12;				
				'P': a:=13;
				'O': a:=14;				
				'W': a:=15;
				'm': a:=MSGCOL;	
				'M': a:=MSGCOL XOR $08;
				'n': NewLine;
				'@': Break;
			END;
			Inc(p);
		END;
		IF p>l THEN Exit;
		IF i>49 THEN NewLine;
		PutChar(i,txtline,m[p],a);
		Inc(i);
		Inc(p);
	UNTIL FALSE;
END;

FUNCTION GetString(l:BYTE):STRING;
VAR	c: CHAR;
	s: STRING;
	i: INTEGER;
	a: BYTE;

PROCEDURE NewLine;
BEGIN
	IF line>=19 THEN ScrollWin(50,5,79,24)
		    ELSE Inc(line);
	i:=0;
END;

BEGIN
	IF l=0 THEN Exit;
	IF l>30 THEN l:=30;
	
	IF NOT nnl THEN NewLine ELSE BEGIN
		FOR i:=50 TO 79 DO PutChar(i,line+5,' ',MSGCOL);
		i:=0;
	END;


	a:=MSGCOL XOR $08;
	nnl:=TRUE;

	s:='';
	i:=0;
	REPEAT
		GotoXY(50+i,line+5);
		c:=GetKey;
		IF (i<l) AND (c>=' ') AND (c<#127) THEN BEGIN
			s:=Concat(s,c);
			PutChar(50+i,line+5,c,a);
			Inc(i);
		END;
		IF c=KEYCHR_BS THEN BEGIN
			IF i>0 THEN Dec(i);
			PutChar(50+i,line+5,' ',a);
			s:=Copy(s,1,length(s)-1);
		END;
	UNTIL (c=KEYCHR_CR);
	GetString:=s;
END;

PROCEDURE Stat(m:STRING);
VAR	a: BYTE;
	i,p: INTEGER;

PROCEDURE NewLine;
BEGIN
	ScrollWin(50,0,79,4);
	i:=0;
END;

BEGIN
	NewLine;
	p:=1;
	a:=MSGCOL;
	REPEAT
		WHILE m[p]='@' DO BEGIN
			Inc(p);
			CASE m[p] OF
				'd': a:=0;
				'b': a:=1;
				'g': a:=2;
				'c': a:=3;
				'r': a:=4;
				'p': a:=5;
				'o': a:=6;
				'w': a:=7;
				'D': a:=8;				
				'B': a:=9;
				'G': a:=10;				
				'C': a:=11;
				'R': a:=12;				
				'P': a:=13;
				'O': a:=14;				
				'W': a:=15;
				'm': a:=MSGCOL;
				'M': a:=MSGCOL XOR $08;
				'n': NewLine;
				'v': ;
				'@': Break;
			END;
			Inc(p);
		END;
		IF i>29 THEN NewLine;
		PutChar(50+i,4,m[p],a);
		Inc(p);
		Inc(i);
	UNTIL (p>Length(m));
END;

FUNCTION Number(n: INTEGER):STRING;
VAR	s: STRING[3];
BEGIN
	Str(n:3,s);
	Number:=s;
END;

FUNCTION Num(n: INTEGER):STRING;
VAR	s: STRING;
BEGIN
	Str(n,s);
	Num:=s;
END;

PROCEDURE PrepScr;
VAR	x,y: INTEGER;
BEGIN
{	FOR y:=0 TO 24 DO
		FOR x:=0 TO 79 DO PutChar(x,y,' ',$07);}
END;

PROCEDURE ResetScr;
VAR i,x,y:BYTE;
BEGIN
	FOR y:=0 TO 24 DO FOR x:=0 TO 79 DO PutChar(x,y,' ',$07);
	GotoXY(0,0);
	ResetPal;
END;

FUNCTION GetKey:CHAR;
BEGIN
	GetKey:=GetChr;
END;

BEGIN
	line:=0;
	nnl:=TRUE;
END.