{$X+,B-,V-} {essential compiler directives} Program Logout; { Fixed by RPL } uses crt,dos,graph,nwConn; { demo of a program that logs out the user, and fills the screen with a worm, functionally equal to the worm of the netware console monitor. } const MaxTailLen = 30; MaxDeviations = 15; MaxSymbols = 5; TailSegments : array[1..MaxSymbols] of byte = (32,176,177,178,219); type BorderColl = (left,right,upside,downside); var gd,gm : integer; color : boolean; wormrecord : record x_head,y_head : integer; ChosenDir : integer; PreferredDir : integer; LengthFactor : integer; TailLen : integer; x,y : array[1..MaxTailLen] of integer; end; procedure Initialization; var CurrSegment : integer; begin randomize; with wormrecord do begin LengthFactor:=random(5)+3; TailLen:=MaxSymbols*LengthFactor; if TailLen>MaxTailLen then TailLen:=MaxTailLen; x_head:=40; y_head:=12; PreferredDir:=random(8); for CurrSegment:=1 to MaxTailLen do begin x[CurrSegment]:=0; y[CurrSegment]:=0; end; end; end; procedure ChooseDir; { This procedure determines the future direction of the worm. } VAR NbrOfDev : integer; begin NbrOfDev:=0; with wormrecord do begin repeat repeat inc (NbrOfDev); ChosenDir:=random(8); until (NbrOfDev>=MaxDeviations) or (ChosenDir=PreferredDir); until abs(PreferredDir-ChosenDir)<>4; PreferredDir:=ChosenDir; end; end; procedure DrawWorm; var CurrSegment : integer; SegmentSym : integer; begin with wormrecord do begin if color then textcolor (7); for CurrSegment:=1 to TailLen do begin SegmentSym:=(CurrSegment-1) div LengthFactor+1; if (x[CurrSegment]<>0) then begin gotoxy (x[CurrSegment],y[CurrSegment]); write (chr(TailSegments[SegmentSym]), chr(TailSegments[SegmentSym])); end; if (CurrSegment77) then begin x_head:=77-(x_head-77); ReverseDir (right); end; if (y_head<1) then begin y_head:=2-y_head; ReverseDir (upside); end; if (y_head>24) then begin y_head:=24-(y_head-24); ReverseDir (downside); end; end; {with} end; procedure logoutservers; { Logs you out form all servers by logging out and detaching on a server by server basis. You are not detached from your primary server. } Var connId:byte; servName:string; primserv:byte; begin GetPrimaryConnectionId(primServ); for connId:=1 to 8 do begin IF GetFileServerName(ConnId,servName) then begin IF LogoutFromFileServer(ConnId) then begin if (connId<>PrimServ) then begin DetachFromFileServer(connId); writeln('You are now detached from fileserver ',servName); end else writeln('You are now logged out from fileserver ',servName); end; end end; delay(2500); end; begin color:=false; detectgraph (gd,gm); color:=(gd<>7); logoutservers; clrscr; Initialization; repeat ChooseDir ; DeterminePos; DrawWorm ; delay (150); until keypressed; clrscr; end.