{$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; 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); 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('Ä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.