Renegade-1.19/COMMON2.PAS

1256 lines
41 KiB
Plaintext
Raw Normal View History

2013-02-04 15:56:58 -08:00
{$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;
CONST
SYSKEY_LENGTH = 1269;
SYSKEY: ARRAY [1..1269] OF Char = (
#3 ,#16,'<27>',#26,'M','<27>','<27>',#24,'<27>',#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,'<27>',#24,'<27>',#26,
'%','<27>','<27>',#26,'&','<27>','<27>',#24,'<27>',' ',#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 ,'<27>',' ',#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 ,'<27>',#24,'<27>',' ',#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 ,'<27>',' ',#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 ,'<27>',#24,
'<27>',' ',#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 ,'<27>',' ',#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 ,'<27>',#24,'<27>',' ',#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 ,'<27>',' ',#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 ,'<27>',#24,'<27>',' ',#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 ,'<27>',
' ',#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 ,'<27>',#24,'<27>',' ',#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 ,'<27>',
' ',#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 ,
'<27>',#24,'<27>',' ',#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 ,'<27>',' ',#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 ,'<27>',#24,'<27>',' ',#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 ,'<27>',' ',#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 ,'<27>',#24,'<27>',' ',
#14,'A','L','T','+','J',' ',#15,':',' ',#7 ,'J','u','m','p',' ','t',
'o',' ','t','h','e',' ','O','S',#25,#14,#3 ,'<27>',' ',#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 ,'<27>',#24,'<27>',' ',#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 ,'<27>',' ',#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 ,'<27>',#24,'<27>',' ',#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 ,'<27>',' ',#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 ,'<27>',#24,'<27>',' ',#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 ,'<27>',' ',#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 ,'<27>',#24,'<27>',' ',#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 ,'<27>',' ',#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 ,'<27>',#24,'<27>',
#26,'%','<27>','<27>',#26,'&','<27>','<27>',#24,'<27>',' ',#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 ,'<27>',#24,'<27>',' ',#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 ,'<27>',#24,'<27>',#26,'M','<27>','<27>',#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 ,'<27>',' ',' ',#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 ,'<27>',' ',' ',#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 ,'<27>',' ',' ',#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 ,
'<27>',' ',' ',#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);
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;
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
Update_Logo(Win1,ScreenAddr[(FirstRow - 1) * 160],WIN1_LENGTH);
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
Update_Logo(Win2,ScreenAddr[(FirstRow - 1) * 160],WIN2_LENGTH);
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
Update_Logo(Win3,ScreenAddr[(FirstRow - 1) * 160],WIN3_LENGTH);
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
Update_Logo(Win4,ScreenAddr[(FirstRow - 1) * 160],WIN4_LENGTH);
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
Update_Logo(Win5,ScreenAddr[(FirstRow - 1) * 160],WIN5_LENGTH);
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);
Update_Logo(SYSKEY,ScreenAddr[0],SYSKEY_LENGTH);
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);
ASM
Int 28h
END;
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('<27>Done<6E>')
ELSE
BEGIN
TextColor(9);
Write('<27>');
TextColor(11);
Write('Done');
TextColor(9);
Write('<27>');
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.