Mercurial > rg
diff 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 diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/console.pas Sun Dec 08 19:39:15 2013 +0100 @@ -0,0 +1,340 @@ +{ 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. +
