Renegade-1.19/SOURCE/COMMON2.PAS

1314 lines
42 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{$IFDEF WIN32}
{$I DEFINES.INC}
{$ENDIF}
{$A+,B-,D+,E-,F+,I-,L+,N-,O+,R-,S-,V-}
UNIT Common2;
INTERFACE
USES
Common,
MyIO;
PROCEDURE SKey1(VAR C: Char);
PROCEDURE SaveGeneral(x: Boolean);
PROCEDURE TLeft;
PROCEDURE ChangeUserDataWindow;
PROCEDURE lStatus_Screen(WhichScreen: Byte; CONST Message: AStr; OneKey: Boolean; VAR Answer: AStr);
PROCEDURE Update_Screen;
PROCEDURE ToggleWindow(ShowIt: Boolean);
IMPLEMENTATION
USES
Crt,
Dos,
TimeFunc,
LineChat,
SysOp2G,
SysOp3,
SplitCha
{$IFDEF WIN32}
,VPSysLow
,Windows
{$ENDIF}
;
CONST
SYSKEY_LENGTH = 1269;
SYSKEY: ARRAY [1..1269] OF Char = (
#3 ,#16,'Ú',#26,'M','Ä','¿',#24,'³',#17,#25,#23,#11,'R','e','n','e',
'g','a','d','e',' ','B','u','l','l','e','t','i','n',' ','B','o','a',
'r','d',' ','S','y','s','t','e','m',#25,#23,#3 ,#16,'³',#24,'Ã',#26,
'%','Ä','Â',#26,'&','Ä','´',#24,'³',' ',#14,'A','L','T','+','B',' ',
#15,':',' ',#7 ,'T','o','g','g','l','e',' ','"','B','e','e','p','-',
'a','f','t','e','r','-','e','n','d','"',#25,#5 ,#3 ,'³',' ',#14,'A',
'L','T','+','N',' ',#15,':',' ',#7 ,'S','w','i','t','c','h',' ','t',
'o',' ','n','e','x','t',' ','S','y','s','O','p',' ','w','i','n','d',
'o','w',#25,#2 ,#3 ,'³',#24,'³',' ',#14,'A','L','T','+','C',' ',#15,
':',' ',#7 ,'E','n','t','e','r','/','E','x','i','t',' ','c','h','a',
't',' ','m','o','d','e',#25,#8 ,#3 ,'³',' ',#14,'A','L','T','+','O',
' ',#15,':',' ',#7 ,'C','o','n','f','e','r','e','n','c','e',' ','S',
'y','s','t','e','m',' ','t','o','g','g','l','e',#25,#5 ,#3 ,'³',#24,
'³',' ',#14,'A','L','T','+','D',' ',#15,':',' ',#7 ,'D','u','m','p',
' ','s','c','r','e','e','n',' ','t','o',' ','f','i','l','e',#25,#9 ,
#3 ,'³',' ',#14,'A','L','T','+','P',' ',#15,':',' ',#7 ,'P','r','i',
'n','t',' ','f','i','l','e',' ','t','o',' ','t','h','e',' ','u','s',
'e','r',#25,#7 ,#3 ,'³',#24,'³',' ',#14,'A','L','T','+','E',' ',#15,
':',' ',#7 ,'E','d','i','t',' ','C','u','r','r','e','n','t',' ','U',
's','e','r',#25,#11,#3 ,'³',' ',#14,'A','L','T','+','Q',' ',#15,':',
' ',#7 ,'T','u','r','n',' ','o','f','f',' ','c','h','a','t',' ','p',
'a','g','i','n','g',#25,#9 ,#3 ,'³',#24,'³',' ',#14,'A','L','T','+',
'F',' ',#15,':',' ',#7 ,'G','e','n','e','r','a','t','e',' ','f','a',
'k','e',' ','l','i','n','e',' ','n','o','i','s','e',#25,#4 ,#3 ,'³',
' ',#14,'A','L','T','+','R',' ',#15,':',' ',#7 ,'S','h','o','w',' ',
'c','h','a','t',' ','r','e','q','u','e','s','t',' ','r','e','a','s',
'o','n',#25,#5 ,#3 ,'³',#24,'³',' ',#14,'A','L','T','+','G',' ',#15,
':',' ',#7 ,'T','r','a','p','/','c','h','a','t','-','c','a','p','t',
'u','r','i','n','g',' ','t','o','g','g','l','e','s',' ',' ',#3 ,'³',
' ',#14,'A','L','T','+','S',' ',#15,':',' ',#7 ,'S','y','s','O','p',
' ','W','i','n','d','o','w',' ','o','n','/','o','f','f',#25,#10,#3 ,
'³',#24,'³',' ',#14,'A','L','T','+','H',' ',#15,':',' ',#7 ,'H','a',
'n','g','u','p',' ','u','s','e','r',' ','i','m','m','e','d','i','a',
't','e','l','y',#25,#5 ,#3 ,'³',' ',#14,'A','L','T','+','T',' ',#15,
':',' ',#7 ,'T','o','p','/','B','o','t','t','o','m',' ','S','y','s',
'O','p',' ','w','i','n','d','o','w',#25,#6 ,#3 ,'³',#24,'³',' ',#14,
'A','L','T','+','I',' ',#15,':',' ',#7 ,'T','o','g','g','l','e',' ',
'u','s','e','r',' ','i','n','p','u','t',#25,#11,#3 ,'³',' ',#14,'A',
'L','T','+','U',' ',#15,':',' ',#7 ,'T','o','g','g','l','e',' ','u',
's','e','r',' ','s','c','r','e','e','n',#25,#11,#3 ,'³',#24,'³',' ',
#14,'A','L','T','+','J',' ',#15,':',' ',#7 ,'J','u','m','p',' ','t',
'o',' ','t','h','e',' ','O','S',#25,#14,#3 ,'³',' ',#14,'A','L','T',
'+','V',' ',#15,':',' ',#7 ,'A','u','t','o','-','v','a','l','i','d',
'a','t','e',' ','u','s','e','r',#25,#11,#3 ,'³',#24,'³',' ',#14,'A',
'L','T','+','K',' ',#15,':',' ',#7 ,'K','i','l','l',' ','u','s','e',
'r',' ','w','/','H','A','N','G','U','P','#',' ','f','i','l','e',#25,
#4 ,#3 ,'³',' ',#14,'A','L','T','+','W',' ',#15,':',' ',#7 ,'E','d',
'i','t',' ','U','s','e','r',' ','w','i','t','h','o','u','t',' ','n',
'o','t','i','c','e',#25,#5 ,#3 ,'³',#24,'³',' ',#14,'A','L','T','+',
'L',' ',#15,':',' ',#7 ,'T','o','g','g','l','e',' ','l','o','c','a',
'l',' ','s','c','r','e','e','n',' ','d','i','s','p','l','a','y',' ',
' ',#3 ,'³',' ',#14,'A','L','T','+','Z',' ',#15,':',' ',#7 ,'W','a',
'k','e',' ','u','p',' ','a',' ','s','l','e','e','p','i','n','g',' ',
'u','s','e','r',#25,#6 ,#3 ,'³',#24,'³',' ',#14,'A','L','T','+','M',
' ',#15,':',' ',#7 ,'M','a','k','e','/','T','a','k','e',' ','T','e',
'm','p',' ','S','y','s','O','p',' ','A','c','c','e','s','s',' ',' ',
#3 ,'³',' ',#14,'A','L','T','-','#',' ',#15,':',' ',#7 ,'E','x','e',
'c','u','t','e',' ','G','L','O','B','A','T','#','.','B','A','T',#25,
#10,#3 ,'³',#24,'³',' ',#14,'A','L','T','+','+',' ',#15,':',' ',#7 ,
'G','i','v','e',' ','5',' ','m','i','n','u','t','e','s',' ','t','o',
' ','u','s','e','r',#25,#6 ,#3 ,'³',' ',#14,'A','L','T','+','-',' ',
#15,':',' ',#7 ,'T','a','k','e',' ','5',' ','m','i','n','u','t','e',
's',' ','f','r','o','m',' ','u','s','e','r',#25,#5 ,#3 ,'³',#24,'Ã',
#26,'%','Ä','Á',#26,'&','Ä','´',#24,'³',' ',#14,'C','T','R','L','+',
'H','O','M','E',' ',#15,':',' ',#7 ,'T','h','i','s',' ','h','e','l',
'p',' ','s','c','r','e','e','n',#25,#10,#14,'C','T','R','L','+','S',
'Y','S','R','Q',' ',#15,':',' ',#7 ,'F','a','k','e',' ','s','y','s',
't','e','m',' ','e','r','r','o','r',#25,#7 ,#3 ,'³',#24,'³',' ',#14,
'S','C','R','L','C','K',#25,#3 ,#15,':',' ',#7 ,'T','o','g','g','l',
'e',' ','c','h','a','t',' ','a','v','a','i','l','a','b','i','l','i',
't','y',#25,#2 ,#14,'A','L','T','+','F','1','-','F','5',' ',' ',#15,
':',' ',#7 ,'S','y','s','O','p',' ','W','i','n','d','o','w',' ','1',
' ','-',' ','5',#25,#6 ,#3 ,'³',#24,'À',#26,'M','Ä','Ù',#24,#24,#24,
#24,#24,#24,#24,#24,#24,#24,#24,#24,#24,#24,#24,#24,#24,#24,#24,#24,
#24,#24,#24,#24,#24,#24,#24,#24,#24,#24,#24);
WIN1_LENGTH = 51;
WIN1: ARRAY [1..51] OF Char = (
#15,#23,#25,#27,'A','R',':',#25,#27,'N','S','L',':',#25,#4 ,'T','i',
'm','e',':',#25,#6 ,#24,#25,#27,'A','C',':',#25,#15,'B','a','u','d',
':',#25,#6 ,'D','S','L',':',#25,#4 ,'N','o','d','e',':',#25,#6 ,#24);
WIN2_LENGTH = 42;
WIN2: ARRAY [1..42] OF Char = (
#15,#23,#25,#27,'P','H',':',#25,#18,'F','O',':',#25,#10,'T','e','r',
'm',':',#25,#10,#24,#25,#27,'B','D',':',#25,#18,'L','O',':',#25,#10,
'E','d','i','t',':',#25,#10,#24);
WIN3_LENGTH = 80;
WIN3: ARRAY [1..80] OF Char = (
#15,#23,' ','T','C',':',#25, #6,'C','T',':',#25, #6,'P','P',':',#25,
#6,'F','S',':',#25, #6,'D','L',':',#25,#14,'F','R',':',#25, #5,'T',
'i','m','e',':',#25, #6,#24,' ','T','T',':',#25, #6,'B','L',':',#25,
#6,'E','S',':',#25, #6,'T','B',':',#25, #6,'U','L',':',#25,#14,'P',
'R',':',#25, #5,'N','o','d','e',':',#25, #6,#24);
WIN4_LENGTH = 96;
WIN4: ARRAY [1..96] OF Char = (
#8 ,#23,' ',#15,'T','o','d','a','y',#39,'s',' ',#8 ,'³',' ',' ',#15,
'C','a','l','l','s',':',#25,#7 ,'E','m','a','i','l',':',#25,#7 ,'D',
'L',':',#25,#17,'N','e','w','u','s','e','r','s',':',#25,#9 ,#24,#25,
#2 ,'S','t','a','t','s',' ',#8 ,'³',' ',' ',#15,'P','o','s','t','s',
':',#25,#7 ,'F','e','e','d','b',':',#25,#7 ,'U','L',':',#25,#17,'A',
'c','t','i','v','i','t','y',':',#25,#9 ,#24);
WIN5_LENGTH = 113;
WIN5: ARRAY [1..113] OF Char = (
#8 ,#23,' ',#15,'S','y','s','t','e','m',' ',' ',#8 ,'³',' ',' ',#15,
'C','a','l','l','s',':',#25,#7 ,'D','L',':',#25,#7 ,'D','a','y','s',
' ',':',#25,#6 ,'U','s','e','r','s',':',#25,#6 ,'D','i','s','k','f',
'r','e','e',':',#25,#7 ,#24,' ',' ','S','t','a','t','s',' ',' ',#8 ,
'³',' ',' ',#15,'P','o','s','t','s',':',#25,#7 ,'U','L',':',#25,#7 ,
'H','o','u','r','s',':',#25,#6 ,'M','a','i','l',' ',':',#25,#6 ,'O',
'v','e','r','l','a','y','s',':',#25,#7 ,#24);
{$IFDEF MSDOS}
PROCEDURE BiosScroll(up: Boolean); ASSEMBLER;
ASM
Mov cx,0
Mov dh,MaxDisplayRows
Mov dl,MaxDisplayCols
Mov bh,7
Mov al,2
Cmp up,1
Je @Up
Mov ah,7
Jmp @go
@up:
Mov ah,6
@Go:
Int 10h
END;
{$ENDIF}
{$IFDEF WIN32}
PROCEDURE BiosScroll(up: Boolean);
BEGIN
if (up) then
begin
SysScrollUp(0, 0, MaxDisplayCols-1, MaxDisplayRows-1, 2, 7);
end else
begin
SysScrollDn(0, 0, MaxDisplayCols-1, MaxDisplayRows-1, 2, 7);
end;
END;
{$ENDIF}
PROCEDURE CPR(c1,c2: Byte);
VAR
Flag: FlagType;
BEGIN
FOR Flag := RLogon TO RMsg DO
BEGIN
IF (Flag IN ThisUser.Flags) THEN
TextAttr := c1
ELSE
TextAttr := c2;
Write(Copy('LCVUA*PEKM',(Ord(Flag) + 1),1));
END;
FOR Flag := FNoDLRatio TO FNoDeletion DO
BEGIN
IF (Flag IN ThisUser.Flags) THEN
TextAttr := c1
ELSE
TextAttr := c2;
Write(Copy('1234',(Ord(Flag) - 19),1));
END;
END;
PROCEDURE Clear_Status_Box;
BEGIN
IF (General.IsTopWindow) THEN
Window(1,1,MaxDisplayCols,2)
ELSE
Window(1,(MaxDisplayRows - 1),MaxDisplayCols,MaxDisplayRows);
ClrScr;
Window(1,1,MaxDisplayCols,MaxDisplayRows);
END;
PROCEDURE ToggleWindow(ShowIt: Boolean);
VAR
SaveWhereX,
SaveWhereY,
SaveTextAttr: Byte;
BEGIN
SaveWhereX := WhereX;
SaveWhereY := WhereY;
SaveTextattr := TextAttr;
TextAttr := 7;
IF (General.WindowOn) THEN
BEGIN
Clear_Status_Box;
IF (General.IsTopWindow) THEN
BEGIN
GoToXY(1, MaxDisplayRows);
Write(^J^J);
END;
END
ELSE
BEGIN
IF (General.IsTopWindow AND (SaveWhereY <= (MaxDisplayRows - 2))) THEN
BiosScroll(FALSE)
ELSE IF (NOT General.IsTopWindow AND (SaveWhereY > (MaxDisplayRows - 2))) THEN
BEGIN
BiosScroll(TRUE);
Dec(SaveWhereY,2)
END
ELSE IF (General.IsTopWindow) THEN
Dec(SaveWhereY,2);
END;
General.WindowOn := NOT General.WindowOn;
IF (ShowIt) THEN
Update_Screen;
GoToXY(SaveWhereX,SaveWhereY);
TextAttr := SaveTextAttr;
END;
PROCEDURE lStatus_Screen(WhichScreen: Byte; CONST Message: AStr; OneKey: Boolean; VAR Answer: AStr);
VAR
HistoryFile: FILE OF HistoryRecordType;
History: HistoryRecordType;
User: UserRecordType;
C: Char;
FirstRow,
SecondRow,
SaveWhereX,
SaveWhereY,
SaveTextAttr: Byte;
SaveWindowOn: Boolean;
BEGIN
IF ((InWFCMenu OR (NOT General.WindowOn)) AND (WhichScreen < 99)) OR
(General.NetworkMode AND NOT CoSysOp) THEN
Exit;
SaveWindowOn := General.WindowOn;
IF (NOT General.WindowOn) THEN
ToggleWindow(FALSE);
TLeft;
SaveWhereX := WhereX;
SaveWhereY := WhereY;
SaveTextAttr := TextAttr;
Window(1,1,MaxDisplayCols,MaxDisplayRows);
IF (General.IsTopWindow) THEN
FirstRow := 1
ELSE
FirstRow := (MaxDisplayRows - 1);
SecondRow := (FirstRow + 1);
TextAttr := 120;
LastScreenSwap := 0;
CursorOn(FALSE);
Clear_Status_Box;
IF (WhichScreen < 99) THEN
General.CurWindow := WhichScreen;
CASE WhichScreen OF
1 : WITH ThisUser DO
BEGIN
{$IFDEF MSDOS}
Update_Logo(Win1,ScreenAddr[(FirstRow - 1) * 160],WIN1_LENGTH);
{$ENDIF}
{$IFDEF WIN32}
Update_Logo(Win1, 1, FirstRow, WIN1_LENGTH);
{$ENDIF}
GoToXY(02,FirstRow);
Write(Caps(Name));
GoToXY(33,FirstRow);
FOR C := 'A' TO 'Z' DO
BEGIN
IF (C IN AR) THEN
TextAttr := 116
ELSE
TextAttr := 120;
Write(C);
END;
TextAttr := 120;
GoToXY(65,FirstRow);
IF (TempSysOp) THEN
BEGIN
TextAttr := 244;
Write(255);
TextAttr := 120;
END
ELSE
Write(SL);
GoToXY(75,FirstRow);
Write(NSL DIV 60);
GoToXY(02,SecondRow);
Write(RealName+' #'+IntToStr(UserNum));
GoToXY(33,SecondRow);
CPR(116,120);
TextAttr := 120;
GoToXY(54,SecondRow);
Write(ActualSpeed);
GoToXY(65,SecondRow);
IF (TempSysOp) THEN
BEGIN
TextAttr := 244;
Write(255);
TextAttr := 120;
END
ELSE
Write(DSL);
GoToXY(75,SecondRow);
Write(ThisNode);
END;
2 : WITH ThisUser DO
BEGIN
{$IFDEF MSDOS}
Update_Logo(Win2,ScreenAddr[(FirstRow - 1) * 160],WIN2_LENGTH);
{$ENDIF}
{$IFDEF WIN32}
Update_Logo(Win2, 1, FirstRow, WIN2_LENGTH);
{$ENDIF}
GoToXY(02,FirstRow);
Write(Street);
GoToXY(33,FirstRow);
Write(Ph);
GoToXY(55,FirstRow);
Write(ToDate8(PD2Date(Firston)));
GoToXY(71,FirstRow);
IF (OKRIP) THEN
Write('RIP')
ELSE IF (OKAvatar) THEN
Write('AVATAR')
ELSE IF (OkANSI) THEN
Write('ANSI')
ELSE IF (OkVT100) THEN
Write('VT-100')
ELSE
Write('NONE');
GoToXY(02,SecondRow);
Write(PadLeftStr(Citystate+' '+Zipcode,26));
GoToXY(33,SecondRow);
Write(ToDate8(PD2Date(BirthDate)),', ');
Write(Sex+' ',AgeUser(ThisUser.BirthDate));
GoToXY(55,SecondRow);
Write(ToDate8(PD2Date(Laston)));
GoToXY(71,SecondRow);
IF (FSEditor IN SFlags) THEN
Write('FullScrn')
ELSE
Write('Regular');
END;
3 : WITH ThisUser DO
BEGIN
{$IFDEF MSDOS}
Update_Logo(Win3,ScreenAddr[(FirstRow - 1) * 160],WIN3_LENGTH);
{$ENDIF}
{$IFDEF WIN32}
Update_Logo(Win3, 1, FirstRow, WIN3_LENGTH);
{$ENDIF}
GoToXY(06,FirstRow);
Write(Loggedon);
GoToXY(16,FirstRow);
Write(OnToday);
GoToXY(26,FirstRow);
Write(MsgPost);
GoToXY(36,FirstRow);
Write(Feedback);
GoToXY(46,FirstRow);
Write(IntToStr(Downloads)+'/'+ConvertKB(DK,FALSE));
GoToXY(64,FirstRow);
IF (Downloads > 0) THEN
Write((Uploads / Downloads) * 100:3:0,'%')
ELSE
Write(0);
GoToXY(75,FirstRow);
Write(NSL DIV 60);
GoToXY(06,SecondRow);
Write(TTimeon);
GoToXY(16,SecondRow);
Write(ThisUser.lCredit - ThisUser.Debit);
GoToXY(26,SecondRow);
Write(EmailSent);
GoToXY(36,SecondRow);
Write(TimeBank);
GoToXY(46,SecondRow);
Write(IntToStr(Uploads)+'/'+ConvertKB(UK,FALSE));
GoToXY(64,SecondRow);
IF (Loggedon > 0) THEN
Write((Msgpost / Loggedon) * 100:3:0,'%')
ELSE
Write(0);
GoToXY(75,SecondRow);
Write(ThisNode);
END;
4 : BEGIN
Assign(HistoryFile,General.DataPath+'HISTORY.DAT');
Reset(HistoryFile);
IF (IOResult = 2) THEN
ReWrite(HistoryFile)
ELSE
BEGIN
Seek(HistoryFile,FileSize(HistoryFile) - 1);
Read(HistoryFile,History);
END;
Close(HistoryFile);
WITH History DO
BEGIN
{$IFDEF MSDOS}
Update_Logo(Win4,ScreenAddr[(FirstRow - 1) * 160],WIN4_LENGTH);
{$ENDIF}
{$IFDEF WIN32}
Update_Logo(Win4, 1, FirstRow, WIN4_LENGTH);
{$ENDIF}
GoToXY(20,FirstRow);
Write(Callers);
GoToXY(34,FirstRow);
Write(Email);
GoToXY(45,FirstRow);
Write(IntToStr(Downloads)+'/'+ConvertKB(DK,FALSE));
GoToXY(72,FirstRow);
Write(NewUsers);
GoToXY(20,SecondRow);
Write(Posts);
GoToXY(34,SecondRow);
Write(Feedback);
GoToXY(45,SecondRow);
Write(IntToStr(Uploads)+'/'+ConvertKB(UK,FALSE));
IF (Active > 9999) THEN
Active := 9999;
GoToXY(72,SecondRow);
Write(Active,' min');
END;
END;
5 : WITH History DO
BEGIN
{$IFDEF MSDOS}
Update_Logo(Win5,ScreenAddr[(FirstRow - 1) * 160],WIN5_LENGTH);
{$ENDIF}
{$IFDEF WIN32}
Update_Logo(Win5, 1, FirstRow, WIN5_LENGTH);
{$ENDIF}
GoToXY(20,FirstRow);
Write(General.CallerNum);
GoToXY(31,FirstRow);
Write(General.TotalDloads + Downloads);
GoToXY(45,FirstRow);
Write(General.DaysOnline + 1);
GoToXY(58,FirstRow);
Write(General.NumUsers);
GoToXY(74,FirstRow);
Write(ConvertKB(DiskKbFree(StartDir),FALSE));
GoToXY(20,SecondRow);
Write(General.TotalPosts + Posts);
GoToXY(31,SecondRow);
Write(General.TotalUloads + Uploads);
GoToXY(45,SecondRow);
Write((General.TotalUsage + Active) DIV 60);
LoadURec(User,1);
GoToXY(58,SecondRow);
IF (User.Waiting > 0) THEN
TextAttr := 244;
Write(User.Waiting);
TextAttr := 120;
GoToXY(74,SecondRow);
CASE OverlayLocation OF
0 : Write('Disk');
1 : Write('EMS');
2 : Write('XMS');
END;
END;
100 :
BEGIN
GoToXY((MaxDisplayCols - Length(Message)) DIV 2,FirstRow);
Write(Message);
LastScreenSwap := Timer;
END;
99 :
BEGIN
GoToXY(1,FirstRow);
Write(Message);
IF (OneKey) THEN
Answer := UpCase(ReadKey)
ELSE
BEGIN
GoToXY(2,(FirstRow + 1));
Write('> ');
Local_Input1(Answer,MaxDisplayCols - 4,FALSE);
END;
END;
END;
IF (General.IsTopWindow) THEN
Window(1,3,MaxDisplayCols,MaxDisplayRows)
ELSE
Window(1,1,MaxDisplayCols,MaxDisplayRows - 2);
CursorOn(TRUE);
IF (NOT SaveWindowOn) THEN
ToggleWindow(FALSE);
GoToXY(SaveWhereX,SaveWhereY);
TextAttr := SaveTextAttr;
END;
PROCEDURE Update_Screen;
VAR
Answer: AStr;
BEGIN
lStatus_Screen(General.CurWindow,'',FALSE,Answer);
END;
PROCEDURE SKey1(VAR C: Char);
VAR
S: AStr;
C1: Char;
SaveWhereX,
SaveWhereY,
SaveTextAttr: Byte;
RetCode,
i: Integer;
SaveTimer: LongInt;
SaveInChat: Boolean;
BEGIN
IF (General.NetworkMode AND (NOT CoSysOp OR InWFCMenu)) THEN
Exit;
SaveWhereX := WhereX;
SaveWhereY := WhereY;
SaveTextAttr := TextAttr;
CASE Ord(C) OF
120..129 :
BEGIN {ALT-1 TO ALT-0}
GetDir(0,S);
ChDir(StartDir);
SaveScreen(Wind);
ClrScr;
SaveTimer := Timer;
i := (Ord(C) - 119);
IF (i = 10) THEN
i := 0;
ShellDOS(FALSE,'GLOBAT'+Chr(i + 48),RetCode);
Com_Flush_Recv;
FreeTime := ((FreeTime + Timer) - SaveTimer);
RemoveWindow(Wind);
GoToXY(SaveWhereX,SaveWhereY);
ChDir(S);
END;
104..108 :
lStatus_Screen(((Ord(C) - 104) + 1),'',FALSE,S); { ALT F1-F5 }
114 : RunError(255); { CTRL-PRTSC }
36 : BEGIN
SaveScreen(Wind);
SysOpShell; { ALT-J }
RemoveWindow(Wind);
END;
32 : BEGIN { ALT-D }
lStatus_Screen(99,'Dump screen to what file: ',FALSE,S);
IF (S <> '') THEN
ScreenDump(S);
Update_Screen;
END;
59..68 :
Buf := General.Macro[Ord(C) - 59]; { F1 - F10 }
END;
IF (NOT InWFCMenu) THEN
BEGIN
CASE Ord(C) OF
119 : BEGIN { CTRL-HOME }
SaveScreen(Wind);
{$IFDEF MSDOS}
Update_Logo(SYSKEY,ScreenAddr[0],SYSKEY_LENGTH);
{$ENDIF}
{$IFDEF WIN32}
Update_Logo(SYSKEY, 1, 1, SYSKEY_LENGTH);
{$ENDIF}
CursorOn(FALSE);
C := ReadKey;
IF (C = #0) THEN
C := ReadKey;
CursorOn(TRUE);
RemoveWindow(Wind);
GoToXY(SaveWhereX,SaveWhereY);
Update_Screen;
END;
34 : BEGIN { ALT-G }
lStatus_Screen(99,'Log options - [T]rap activity [C]hat buffering',TRUE,S);
C1 := S[1];
WITH ThisUser DO
CASE C1 OF
'C' : BEGIN
lStatus_Screen(99,'Auto Chat buffering - [O]ff [S]eparate [M]ain (Chat.LOG)',TRUE,S);
C1 := S[1];
IF (C1 IN ['O','S','M']) THEN
ChatFileLog(FALSE);
CASE C1 OF
'O' : BEGIN
Exclude(ThisUser.SFlags,ChatAuto);
Exclude(ThisUser.SFlags,ChatSeparate);
END;
'S' : BEGIN
Include(ThisUser.SFlags,ChatAuto);
Include(ThisUser.SFlags,ChatSeparate);
END;
'M' : BEGIN
Include(ThisUser.SFlags,ChatAuto);
Exclude(ThisUser.SFlags,ChatSeparate);
END;
END;
IF (C1 IN ['S','M']) THEN
ChatFileLog(TRUE);
END;
'T' : BEGIN
lStatus_Screen(99,'Activity Trapping - [O]ff [S]eperate [M]ain (TRAP.LOG)',TRUE,S);
C1 := S[1];
IF (C1 IN ['O','S','M']) THEN
IF (Trapping) THEN
BEGIN
Close(TrapFile);
Trapping := FALSE;
END;
CASE C1 OF
'O' : BEGIN
Exclude(ThisUser.SFlags,TrapActivity);
Exclude(ThisUser.SFlags,TrapSeparate);
END;
'S' : BEGIN
Include(ThisUser.SFlags,TrapActivity);
Include(ThisUser.SFlags,TrapSeparate);
END;
'M' : BEGIN
Include(ThisUser.SFlags,TrapActivity);
Exclude(ThisUser.SFlags,TrapSeparate);
END;
END;
IF (C1 IN ['S','M']) THEN
InitTrapFile;
END;
END;
Update_Screen;
END;
20 : BEGIN { ALT-T }
IF (General.WindowOn) THEN
BiosScroll(General.IsTopWindow);
General.IsTopWindow := NOT General.IsTopWindow;
Update_Screen;
END;
31 : IF (NOT InChat) THEN { ALT-S } { ALT-A }
SysOpSplitChat
ELSE
BEGIN
InChat := FALSE;
ChatReason := '';
END;
47 : IF (UserOn) THEN
BEGIN { ALT-V }
S[1] := #0;
lStatus_Screen(99,'Enter the validation level (!-~) for this user.',TRUE,S);
IF (S[1] IN ['!'..'~']) THEN
BEGIN
AutoValidate(ThisUser,UserNum,S[1]);
lStatus_Screen(100,'This user has been validated.',FALSE,S);
END
ELSE
Update_Screen;
END;
18 : IF (UserOn) THEN
BEGIN { ALT-E }
Wait(TRUE);
SaveScreen(Wind);
ChangeUserDataWindow;
RemoveWindow(Wind);
Update_Screen;
Wait(FALSE);
END;
17 : IF (UserOn) THEN
BEGIN
SaveScreen(Wind);
ChangeUserDataWindow; { ALT-W }
RemoveWindow(Wind);
Update_Screen;
END;
49 : IF (UserOn) THEN { ALT-N }
BEGIN
i := ((General.CurWindow MOD 5) + 1);
lStatus_Screen(i,'',FALSE,S);
END;
23 : IF (ComPortSpeed > 0) AND (NOT Com_Carrier) THEN { ALT-I }
lStatus_Screen(100,'No carrier detected!',FALSE,S)
ELSE IF (ComPortSpeed > 0) THEN
BEGIN
IF (OutCom) THEN
IF (InCom) THEN
InCom := FALSE
ELSE IF (Com_Carrier) THEN
InCom := TRUE;
IF (InCom) THEN
lStatus_Screen(100,'User keyboard ON.',FALSE,S)
ELSE
lStatus_Screen(100,'User keyboard OFF.',FALSE,S);
Com_Flush_Recv;
END;
16 : BEGIN { ALT-Q }
ChatCall := FALSE;
ChatReason := '';
Exclude(ThisUser.Flags,Alert);
Update_Screen;
END;
35 : HangUp := TRUE; { ALT-H }
24 : BEGIN { ALT-O }
ConfSystem := (NOT ConfSystem);
IF (ConfSystem) THEN
lStatus_Screen(100,'The conference system has been turned ON.',FALSE,S)
ELSE
lStatus_Screen(100,'The conference system has been turned OFF.',FALSE,S);
NewCompTables;
END;
130 : BEGIN { ALT-MINUS }
SaveInChat := InChat;
InChat := TRUE;
Dec(ThisUser.TLToday,5);
TLeft;
InChat := SaveInChat;
END;
131 : BEGIN { ALT-PLUS }
SaveInChat := InChat;
InChat := TRUE;
Inc(ThisUser.TLToday,5);
TimeWarn := FALSE;
TLeft;
InChat := SaveInChat;
END;
50 : IF (UserOn) THEN { ALT-M }
BEGIN
TempSysOp := NOT TempSysOp;
IF (TempSysOp) THEN
lStatus_Screen(100,'Temporary SysOp access granted.',FALSE,S)
ELSE
lStatus_Screen(100,'Normal access restored',FALSE,S);
NewCompTables;
END;
30 : ToggleWindow(TRUE); { ALT-A }
46 : IF (NOT InChat) THEN { ALT-C }
SysOpLineChat
ELSE
BEGIN
InChat := FALSE;
ChatReason := '';
END;
72, { Arrow up }
75, { Arrow left }
77, { Arrow Right }
80 : IF ((InChat) OR (Write_Msg)) THEN { Arrow Down }
BEGIN
IF (OKAvatar) THEN
Buf := Buf + ^V
ELSE
Buf := Buf + ^[+'[';
CASE Ord(C) OF
72 : IF (OKAvatar) THEN
Buf := Buf + ^C
ELSE
Buf := Buf + 'A';
75 : IF (OKAvatar) THEN
Buf := Buf + ^E
ELSE
Buf := Buf + 'D';
77 : IF (OKAvatar) THEN
Buf := Buf + ^F
ELSE
Buf := Buf + 'C';
80 : IF (OKAvatar) THEN
Buf := Buf + ^D
ELSE
Buf := Buf + 'B';
END;
END;
22 : IF (ComPortSpeed > 0) AND (OutCom) THEN { ALT-U }
BEGIN
lStatus_Screen(100,'User screen and keyboard OFF',FALSE,S);
OutCom := FALSE;
InCom := FALSE;
END
ELSE IF (ComPortSpeed > 0) AND (Com_Carrier) THEN
BEGIN
lStatus_Screen(100,'User screen and keyboard ON',FALSE,S);
OutCom := TRUE;
InCom := TRUE;
END;
37 : BEGIN { ALT-K }
lStatus_Screen(99,'Display what HangUp file (HANGUPxx) :',FALSE,S);
IF (S <> '') THEN
BEGIN
NL;
NL;
InCom := FALSE;
PrintF('HangUp'+S);
SysOpLog('Displayed HangUp file HangUp'+S);
HangUp := TRUE;
END;
Update_Screen;
END;
48 : BEGIN { ALT-B }
BeepEnd := NOT BeepEnd;
lStatus_Screen(100,'SysOp next '+ShowOnOff(BeepEnd),FALSE,S);
SaveInChat := InChat;
InChat := TRUE;
TLeft;
InChat := SaveInChat;
END;
38 : IF (WantOut) THEN { ALT-L }
BEGIN
TextColor(11);
TextBackGround(0);
Window(1,1,MaxDisplayCols,MaxDisplayRows);
ClrScr;
WantOut := FALSE;
CursorOn(FALSE);
END
ELSE
BEGIN
WantOut := TRUE;
CursorOn(TRUE);
WriteLn('Local display on.');
Update_Screen;
END;
44 : BEGIN { ALT-Z }
lStatus_Screen(100,'Waking up user ...',FALSE,S);
REPEAT
OutKey(^G);
Delay(500);
{$IFDEF MSDOS}
ASM
Int 28h
END;
{$ENDIF}
{$IFDEF WIN32}
Sleep(1);
{$ENDIF}
CheckHangUp;
UNTIL ((NOT Empty) OR (HangUp));
Update_Screen;
END;
19 : lStatus_Screen(100,'Chat request: '+ChatReason,FALSE,S);{ ALT-R }
25 : BEGIN { ALT-P }
lStatus_Screen(99,'Print what file: ',FALSE,S);
IF (S <> '') THEN
BEGIN
NL;
NL;
PrintF(S);
SysOpLog('Displayed file '+S);
END;
Update_Screen;
END;
33 : BEGIN { ALT-F }
Randomize;
S := '';
FOR i := 1 TO Random(50) DO
BEGIN
C1 := Chr(Random(255));
IF NOT (C1 IN [#3,'^','@']) THEN
S := S + C1;
END;
Prompt(S);
END;
END;
END;
{ any processed keys no longer used should be here }
IF (Ord(C) IN [16..20,22..25,30,32..38,44,47..50,104..108,114,119..131]) THEN
C := #0;
TextAttr := SaveTextAttr;
END;
PROCEDURE SaveGeneral(x: Boolean);
VAR
GeneralF: FILE OF GeneralRecordType;
SaveCurWindow: Byte;
SaveWindowOn,
SaveIsTopWindow: Boolean;
BEGIN
Assign(GeneralF,DatFilePath+'RENEGADE.DAT');
Reset(GeneralF);
IF (x) THEN
BEGIN
SaveWindowOn := General.WindowOn;
SaveIsTopWindow := General.IsTopWindow;
SaveCurWindow := General.CurWindow;
Read(GeneralF,General);
General.WindowOn := SaveWindowOn;
General.IsTopWindow := SaveIsTopWindow;
General.CurWindow := SaveCurWindow;
Inc(General.CallerNum,TodayCallers);
TodayCallers := 0;
Inc(General.NumUsers,lTodayNumUsers);
lTodayNumUsers := 0;
Seek(GeneralF,0);
END;
Write(GeneralF,General);
Close(GeneralF);
LastError := IOResult;
END;
PROCEDURE TLeft;
VAR
SaveWhereX,
SaveWhereY,
SaveCurrentColor: Integer;
BEGIN
IF (TimedOut) OR (TimeLock) THEN
Exit;
SaveCurrentColor := CurrentColor;
IF ((NSL <= 0) AND (ChopTime <> 0)) THEN
BEGIN
SysOpLog('Logged user off for system event');
NL;
NL;
Print('^G^7Shutting down for System Event.'^G);
NL;
HangUp := TRUE;
END;
IF (NOT InChat) AND NOT (FNoCredits IN ThisUser.Flags) AND (General.CreditMinute > 0) AND (UserOn) AND (CreditTime > 0) AND
(AccountBalance > ((NSL DIV 60) + 1) * General.CreditMinute) AND (NOT HangUp) THEN
BEGIN
CreditTime := 0;
IF (AccountBalance < ((NSL DIV 60) + 1) * General.CreditMinute) THEN
Inc(CreditTime, NSL - (AccountBalance DIV General.CreditMinute) * 60);
END;
IF (NOT InChat) AND NOT (FNoCredits IN ThisUser.Flags) AND (General.CreditMinute > 0) AND (UserOn) AND
(AccountBalance < (NSL DIV 60) * General.CreditMinute) AND
(NOT InVisEdit) AND (NOT HangUp) THEN
BEGIN
Print(^M^J^G^G'^8Note: ^9Your online time has been adjusted due to insufficient account balance.');
Inc(CreditTime, NSL - (AccountBalance DIV General.CreditMinute) * 60);
END;
IF (NOT TimeWarn) AND (NOT InChat) AND (NSL < 180) AND (UserOn) AND (NOT InVisEdit) AND (NOT HangUp) THEN
BEGIN
Print(^M^J^G^G'^8Warning: ^9You have less than '+IntToStr(NSL DIV 60 + 1)+' '+
Plural('minute',NSL DIV 60 + 1)+' remaining online!'^M^J);
SetC(SaveCurrentColor);
TimeWarn := TRUE;
END;
IF (NOT InChat) AND (NSL <= 0) AND (UserOn) AND (NOT HangUp) THEN
BEGIN
NL;
TimedOut := TRUE;
PrintF('NOTLEFT');
IF (NoFile) THEN
Print('^7You have used up all of your time.');
NL;
HangUp := TRUE;
END;
CheckHangUp;
IF (WantOut) AND (General.WindowOn) AND (General.CurWindow = 1) AND (NOT InWFCMenu) AND NOT
(General.NetworkMode AND NOT CoSysOp) AND (LastScreenSwap = 0) THEN
BEGIN
TextAttr := 120;
SaveWhereX := WhereX;
SaveWhereY := WhereY;
Window(1,1,MaxDisplayCols,MaxDisplayRows);
IF (General.IsTopWindow) THEN
GoToXY(75, 1)
ELSE
GoToXY(75,(MaxDisplayRows - 1));
Write(NSL DIV 60,' ');
IF (General.IsTopWindow) THEN
Window(1,3,MaxDisplayCols,MaxDisplayRows)
ELSE
Window(1,1,MaxDisplayCols,(MaxDisplayRows - 2));
GoToXY(SaveWhereX,SaveWhereY);
TextAttr := SaveCurrentColor;
END;
END;
PROCEDURE gp(i,j: Integer);
VAR
x: Byte;
BEGIN
CASE j OF
0 : GoToXY(58,8);
1 : GoToXY(20,7);
2 : GoToXY(20,8);
3 : GoToXY(20,9);
4 : GoToXY(20,10);
5 : GoToXY(36,7);
6 : GoToXY(36,8);
END;
IF (j IN [1..4]) THEN
x := 5
ELSE
x := 3;
IF (i = 2) THEN
Inc(x);
IF (i > 0) THEN
GoToXY((WhereX + x),WhereY);
END;
PROCEDURE ChangeUserDataWindow;
VAR
S: STRING[39];
C: Char;
SaveWhereX,
SaveWhereY,
SaveTextAttr: Byte;
oo,
i: Integer;
Changed,
Done,
Done1: Boolean;
PROCEDURE Shd(i: Integer; b: Boolean);
VAR
C1: Char;
Counter: Byte;
BEGIN
gp(0,i);
IF (b) THEN
TextColor(14)
ELSE
TextColor(9);
CASE i OF
1 : Write('SL :');
2 : Write('DSL :');
3 : Write('BL :');
4 : Write('Note:');
5 : Write('AR:');
6 : Write('AC:');
END;
IF (b) THEN
BEGIN
TextColor(0);
TextBackGround(7);
END
ELSE
TextColor(14);
Write(' ');
WITH ThisUser DO
CASE i OF
0 : IF (b) THEN
Write('ÄDoneÄ')
ELSE
BEGIN
TextColor(9);
Write('Ä');
TextColor(11);
Write('Done');
TextColor(9);
Write('Ä');
END;
1 : Write(PadLeftInt(SL,3));
2 : Write(PadLeftInt(DSL,3));
3 : Write(PadLeftInt(AccountBalance,5));
4 : Write(PadLeftStr(Note,39));
5 : FOR C1 := 'A' TO 'Z' DO
BEGIN
IF (C1 IN AR) THEN
TextColor(4)
ELSE IF (b) THEN
TextColor(0)
ELSE
TextColor(7);
Write(C1);
END;
6 : IF (b) THEN
CPR($07,$70)
ELSE
CPR($70,$07);
END;
Write(' ');
TextBackGround(0);
CursorOn(i IN [1..4]);
IF (b) THEN
BEGIN
GoToXY(26,12);
TextColor(14);
FOR Counter := 1 TO 41 DO
Write(' ');
GoToXY(26,12);
CASE i OF
0 : Write('Done');
1 : Write('Security Level (0-255)');
2 : Write('Download Security Level (0-255)');
3 : Write('Account balance');
4 : Write('SysOp Note for this user');
5 : Write('Access flags ("!" to toggle all)');
6 : Write('Restrictions & special ("!" to clear)');
END;
END;
END;
PROCEDURE ddwind;
VAR
Counter: Byte;
BEGIN
CursorOn(FALSE);
TextColor(9);
Box(1,18,6,68,13);
Window(19,7,67,12);
ClrScr;
Box(1,18,6,68,11);
Window(19,7,67,10);
Window(1,1,MaxDisplayCols,MaxDisplayRows);
GoToXY(20,12);
TextColor(9);
Write('Desc:');
FOR Counter := 0 TO 6 DO
Shd(Counter,FALSE);
Shd(oo,TRUE);
END;
BEGIN
SaveURec(ThisUser,UserNum);
Infield_Out_Fgrd := 0;
Infield_Out_Bkgd := 7;
InField_Inp_Fgrd := 0;
InField_Inp_Bkgd := 7;
Infield_Arrow_Exit := TRUE;
Infield_Arrow_Exited := FALSE;
SaveWhereX := WhereX;
SaveWhereY := WhereY;
SaveTextAttr := TextAttr;
TextAttr := 7;
oo := 1;
ddwind;
Done := FALSE;
REPEAT
Infield_Arrow_Exited := FALSE;
CASE oo OF
0 : BEGIN
Done1 := FALSE;
Shd(oo,TRUE);
REPEAT
C := ReadKey;
CASE UpCase(C) OF
^M : BEGIN
Done := TRUE;
Done1 := TRUE;
END;
#0 : BEGIN
C := ReadKey;
CASE Ord(C) OF
80,72 : {arrow down, up}
BEGIN
Infield_Arrow_Exited := TRUE;
Infield_Last_Arrow := Ord(C);
Done1 := TRUE;
END;
END;
END;
END;
UNTIL (Done1);
END;
1 : BEGIN
S := IntToStr(ThisUser.SL);
InField1(26,7,S,3);
IF (StrToInt(S) <> ThisUser.SL) THEN
IF (StrToInt(S) >= 0) AND (StrToInt(S) <= 255) THEN
BEGIN
ThisUser.SL := StrToInt(S);
Inc(ThisUser.TLToday,General.TimeAllow[ThisUser.SL] - General.TimeAllow[ThisUser.SL]);
END;
END;
2 : BEGIN
S := IntToStr(ThisUser.DSL);
InField1(26,8,S,3);
IF (StrToInt(S) <> ThisUser.DSL) THEN
IF (StrToInt(S) >= 0) AND (StrToInt(S) <= 255) THEN
ThisUser.DSL := StrToInt(S);
END;
3 : BEGIN
S := IntToStr(AccountBalance);
InField1(26,9,S,5);
AdjustBalance(AccountBalance - StrToInt(S));
END;
4 : BEGIN
S := ThisUser.Note;
InField1(26,10,S,39);
ThisUser.Note := S;
END;
5 : BEGIN
Done1 := FALSE;
REPEAT
C := UpCase(ReadKey);
CASE C OF
#13 : Done1 := TRUE;
#0 : BEGIN
C := ReadKey;
CASE Ord(C) OF
80,72: {arrow down,up}
BEGIN
Infield_Arrow_Exited := TRUE;
Infield_Last_Arrow := Ord(C);
Done1 := TRUE;
END;
END;
END;
'!' : BEGIN
FOR C := 'A' TO 'Z' DO
ToggleARFlag(C,ThisUser.AR,Changed);
Shd(oo,TRUE);
END;
'A'..'Z' :
BEGIN
ToggleARFlag(C,ThisUser.AR,Changed);
Shd(oo,TRUE);
END;
END;
UNTIL (Done1);
END;
6 : BEGIN
S := 'LCVUA*PEKM1234';
Done1 := FALSE;
REPEAT
C := UpCase(ReadKey);
IF (C = #13) THEN
Done1 := TRUE
ELSE IF (C = #0) THEN
BEGIN
C := ReadKey;
CASE Ord(C) OF
80,72: {arrow down,up}
BEGIN
Infield_Arrow_Exited := TRUE;
Infield_Last_Arrow := Ord(C);
Done1 := TRUE;
END;
END;
END
ELSE IF (Pos(C,S) <> 0) THEN
BEGIN
ToggleACFlags(C,ThisUser.Flags,Changed);
Shd(oo,TRUE);
END
ELSE
BEGIN
IF (C = '!') THEN
FOR i := 1 TO Length(S) DO
ToggleACFlags(S[i],ThisUser.Flags,Changed);
Shd(oo,TRUE);
END;
UNTIL (Done1);
END;
END;
IF (NOT Infield_Arrow_Exited) THEN
BEGIN
Infield_Arrow_Exited := TRUE;
Infield_Last_Arrow := 80; {arrow down}
END;
IF (Infield_Arrow_Exited) THEN
CASE Infield_Last_Arrow OF
80,72 :
BEGIN {arrow down,up}
Shd(oo,FALSE);
IF (Infield_Last_Arrow = 80) THEN
BEGIN {arrow down}
Inc(oo);
IF (oo > 6) THEN
oo := 0;
END
ELSE
BEGIN
Dec(oo);
IF (oo < 0) THEN
oo := 6;
END;
Shd(oo,TRUE);
END;
END;
UNTIL (Done);
GoToXY(SaveWhereX,SaveWhereY);
TextAttr := SaveTextAttr;
CursorOn(TRUE);
NewCompTables;
SaveURec(ThisUser,UserNum);
END;
END.