home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Between Heaven & Hell 2
/
BetweenHeavenHell.cdr
/
500
/
433
/
pysign.inc
< prev
next >
Wrap
Text File
|
1986-11-30
|
18KB
|
518 lines
OVERLAY PROCEDURE SignOn;
VAR
FoundSpace : BOOLEAN;
HadNews : BOOLEAN;
EReal : REAL;
ETime : INTEGER;
PassOkay : BOOLEAN;
SONum : INTEGER;
SOChar : CHAR;
SOCntr : INTEGER;
SpCntr : INTEGER;
TestName : UNameType;
XPass : STRING[10];
XPhone : STRING[25];
XRealName : UNameType;
XWidth : INTEGER;
BEGIN
GetDate;
StartDate := Date;
StartMint := Mint;
BreakPoint := 20;
Logoff := TRUE;
NewUser := TRUE;
Postings := 0;
Width := 80;
WizOp := FALSE;
YesNo := 'X';
FOR SOCntr := 1 TO 15 DO
BEGIN
SOUND(500+SOCntr*50);
DELAY(3);
SOUND(1000-SOCntr*50);
DELAY(3);
END;
NOSOUND;
XLF;
IF GotCarrier THEN DELAY(1000);
XLF;
IF AnyKeyPressed THEN SOChar := SerialIn;
CharDuringO := FALSE;
SOCntr := 0;
REPEAT
SOCntr := SOCntr + 1;
IF Banner[SOCntr] <> '?' THEN XLnI(Banner[SOCntr]);
UNTIL CharDuringO OR (SOCntr = 8);
IF CharDuringO
THEN
BEGIN
CharDuringO := FALSE;
XLn(LF+'State your name.'+LF)
END
ELSE
BEGIN
XLF;
XLnI('CURRENT TIME: '+ShowDate(Date,Mint));
XLF;
XLnI('Advance, mortal. State your name or');
XLnI('nickname -- the name you like to be');
XLnI('to be known by.');
XLF;
XLn(' ....................');
END;
CharDuringO := FALSE;
X('<(*)> ');
UserName := Upper(GetInputLn);
TestName := '';
FOR SOCntr := 1 TO LENGTH(UserName) DO
IF UserName[SOCntr] IN ['A'..'Z','0']
THEN TestName := TestName + UserName[SOCntr];
{--- Note how I make life hard for the debugger/besmirchers of Pyroto ---}
IF POS('CK',TestName) - 2 = POS('FU',TestName) THEN UserName := 'TSOTL';
IF POS('TSOTL',TestName) > 0 THEN UserName := 'TSOTL';
IF POS('TS0TL',TestName) > 0 THEN UserName := 'TSOTL';
{ Test for S.O.T. attempt (should be <space>, not full name }
IF UserName = 'SERVANT OF TSOTL' THEN UserName := 'TSOTL';{ i.e. No-go }
IF LENGTH(UserName) > 0
THEN
BEGIN
SOCntr := LENGTH(UserName);
REPEAT
IF UserName[SOCntr] = ' ' THEN DELETE(UserName,SOCntr,1);
IF UserName[SOCntr] = '.' THEN DELETE(UserName,SOCntr,1);
SOCntr := SOCntr - 1;
UNTIL (SOCntr = 0) OR (NOT(UserName[SOCntr] IN [' ','.']));
IF LENGTH(UserName) = 0 THEN UserName := 'SERVANT OF TSOTL';
XLF;
IF (UserName = 'SERVANT OF TSOTL') THEN
BEGIN
XLn('State the Servant''s Word.');
GetTestPass;
IF TestPass = ServantWord
THEN WizOp := TRUE
ELSE
BEGIN
WizOp := FALSE;
UserName := 'TSOTL';
END;
XLn(LF);
END;
IF POS('/'+UserName,AlertName) > 0 THEN
BEGIN
FOR SOCntr := 1000 TO 2000 DO
BEGIN
SOUND(SOCntr);
DELAY(2);
NOSOUND;
DELAY(1);
END;
END;
IF ((POS('TSOTL',UserName) > 0) AND (UserName <> 'SERVANT OF TSOTL'))
THEN XLn(LF+'TSOTL is amused.')
ELSE
BEGIN
IF NOT FindUserRecPtr(UserName) THEN
BEGIN
XLF;
X('One moment please...');
{--- Any room in the file? ---}
SpCntr := 1; { 0 is always SERVANT OF TSOTL }
FoundSpace := FALSE;
RESET(UsersFile);
REPEAT
SEEK(UsersFile,SpCntr);
READ(UsersFile,UsersRec);
{ Level 21 has 30 days, Level 100 has 30 days, Level 500 has 70 }
IF ( UsersRec.Date_Last < ( Date - 20 - (UsersRec.Level DIV 10) ) )
THEN FoundSpace := TRUE
ELSE SpCntr := SpCntr + 1;
UNTIL FoundSpace OR (SpCntr = MaxUsers);
XLF; XLF;
IF NOT FoundSpace THEN
BEGIN
XLn('The Users File is FULL. Please try on');
XLn('another occasion.');
END
ELSE
BEGIN
XLF;
XLn('-------- PLEASE READ CAREFULLY --------');
SlowX('Your name is not known to The Spirit Of'); XLF;
SlowX('The Land. Please provide the staff of'); XLF;
SlowX('the Base Portal with some information'); XLF;
SlowX('so you can be recognized...'); XLF; XLF;
SlowX('********* VERY IMPORTANT NOTE *********'); XLF;
SlowX('You MUST enter a valid name and tele-'); XLF;
SlowX('phone number. If you do not, your'); XLF;
SlowX('access will be terminated. This data'); XLF;
SlowX('will be known ONLY to the staff of'); XLF;
SlowX('the company running this service.'); XLF; XLF;
XLn('If you mis-spoke your name, or do not');
XLn('wish to be recognized, press RETURN for');
XLn('the next question...');
REPEAT
REPEAT
XLF;
XLn('What is your True Name?'); XLF;
XLn(' .................... Max 20 Chars');
X ('<(*)> ');
XRealName := Upper(GetInputLn);
IF (LENGTH(XRealName) <> 0) AND (POS(' ',XRealName) = 0)
THEN XLn(LF+'Your FULL name, please.');
UNTIL (LENGTH(XRealName) = 0) OR (POS(' ',XRealName) > 1) OR LostCarrier;
IF LENGTH(XRealName) > 0 THEN
BEGIN
REPEAT
XLF;
XLn('What is your phone number?'); XLF;
XLn(' XXX-XXX-XXXX <- Use this format');
X ('<(*)> ');
XPhone := GetInputLn; XLF;
UNTIL (LENGTH(XPhone) >= 12) OR LostCarrier;
PassOkay := FALSE;
REPEAT
XLn('By what secret word will we know you?'); XLF;
XLn(' .......... Max 10');
X ('<(*)> ');
XPass := Upper(GetInputLn); XLF;
IF (POS(XPass,XRealName) > 0) OR (XPass = 'TEST')
OR (POS(XPass,UserName) > 0)
THEN XLn('That password is too easy to guess.'+LF)
ELSE PassOkay := TRUE;
UNTIL PassOkay OR LostCarrier;
XLn('How many characters across can your');
XLn('terminal or computer display?'); XLF;
Logoff := FALSE; { Disable drop-checking }
XWidth := GetInt('<(*)> ');
Logoff := TRUE;
IF XWidth = 0 THEN XWidth := 80;
XLF; XLF;
XLn('Reviewing what you entered...'); XLF;
XLn('True Name ...... '+XRealName);
XLn('Phone Number ... '+XPhone);
XLn('Password ....... '+XPass);
XLn('Screen Width ... '+IntToStr(XWidth));
XLF;
X('Is that right? (Y/N) '+XON);
Inputting := TRUE;
YesNo := SerialIn;
SerialOut(YesNo);
Inputting := FALSE;
XLF;
END;
UNTIL ((UPCASE(YesNo) = 'Y') OR (LENGTH(XRealName) = 0));
IF LENGTH(XRealName) = 0 THEN XLn(LF+'Bye for now...');
IF UPCASE(YesNo) = 'Y' THEN
BEGIN
UsersRec.UserName := UserName;
UserNames[SpCntr+1] := UserName;
Postings := 0;
UsersRec.Level := 0;
WITH UsersRec DO
BEGIN
RealName := XRealName; Phone := XPhone;
Password := XPass; Points := 50;
Date_Last := Date; Mint_Last := Mint; Width := XWidth;
MsgsSent := 0; MaxLevel := 15;
Date_A := Date - 7; Mint_A := 1;
Date_B := Date - 7; Mint_B := 1;
Date_C := Date - 7; Mint_C := 1;
Date_D := Date - 7; Mint_D := 1;
Date_P := Date - 7; Mint_P := 1;
Date_S := Date - 7; Mint_S := 1;
Date_X := Date - 7; Mint_X := 1;
END;
RESET(UsersFile);
SEEK(UsersFile,SpCntr);
WRITE(UsersFile,UsersRec);
FLUSH(UsersFile);
XLF;
XLn('You are now known to the Base Portal');
XLn('staff. Please call back in 12 hours.');
XLn('If TSOTL approves, you will be able');
XLn('to start your quest...'); XLF;
XLn('Remember to sign on with your chosen');
XLn('name: '+UserName+'.');
SysLog('L',UserName+' signed up');
END; { User info was good }
END; { Had space in the file }
END { New user }
ELSE
BEGIN
SEEK(UsersFile,UserRecPtr);
READ(UsersFile,UsersRec);
EReal := ElapsedTime(UsersRec.Date_Last,UsersRec.Mint_Last,Date,Mint);
IF EReal > 32000.0 THEN EReal := 32000.0;
IF EReal < 0.0 THEN EReal := 0.0;
ETime := TRUNC(EReal);
IF (NOT WizOp) AND (ETime < 660)
THEN
BEGIN { < 11 hours since he logged off }
XLn('You visited less than 12 hours ago.');
XLn('Please give somebody else a chance.');
ETime := 660 - ETime;
IF ETime <= 90 THEN
BEGIN
X(LF+'Try again in '+IntToStr(ETime)+' minute');
IF ETime = 1
THEN XLn('.')
ELSE XLn('s.');
END;
END
ELSE
BEGIN
XLn('What is your private magic word?');
GetTestPass;
XLF;
IF TestPass = UsersRec.Password
THEN
BEGIN
SysLog('L','On: '+UserName);
XLF;
XLn('"ADVANCE TO THE MOUNTAIN, MORTAL..."'); XLF;
IF (UsersRec.MsgsSent > -6)
THEN XLn('TSOTL will tolerate your presence.')
ELSE XLn('TSOTL wants one LAST look at you.');
IF (UsersRec.Date_Last = 0) AND (NOT WizOp) THEN
BEGIN
XLF;
IF UsersRec.MsgsSent > -6 THEN
XLn('Unfortunately, somebody else WON''T!');
XLn('You''ve been BANISHED! You''ll have to');
XLn('change your name, because you are not');
XLn('appreciated, here!'); XLF;
XLn('Soon, even TSOTL will forget you exist.');
SysLog('I',UserName+' informed of "banished" status');
END
ELSE
BEGIN
Altitude := 0;
AscCnt := 0;
AscLast := -1;
ChatAsk := FALSE;
Communicative := FALSE;
Date_Last := UsersRec.Date_Last;
Date_Warp := -1; { i.e. Inactive }
Explained := FALSE;
FocusString := '';
Level := UsersRec.Level;
IF Level > 500 THEN Level := 500;
Logoff := FALSE;
MaxLev := UsersRec.MaxLevel;
MannaRecharge := FALSE;
Mint_Last := UsersRec.Mint_Last;
Multiple := FALSE;
MyPassword := UsersRec.Password;
NewUser := FALSE;
NonReadInfo := FALSE;
NumSends := 0;
SetManna(UsersRec.Points + ((Date - Date_Last) * (25 + Level)) );
IF (MannaPoints < 0) AND (Level > 0)
THEN Level := Level + (MannaPoints DIV 500) - 1;
Patience := PatienceCalc;
Pleaseable := TRUE;
Postings := UsersRec.MsgsSent - ((Date - Date_Last) DIV 7);
IF Postings > 3050 THEN Postings := 3050;
SlowedTime := FALSE;
StoppedTime := FALSE;
Tactical := FALSE;
TimeOutCntr := 0;
IF Level > 299
THEN TimeOutSecs := 300
ELSE TimeOutSecs := 30;
TuneString := '';
Width := UsersRec.Width;
BreakPoint := Width DIV 2;
Wrapping := FALSE;
{--- WizOp Saver ---}
IF UserName = 'SERVANT OF TSOTL' THEN
BEGIN
IF Postings < 0 THEN Postings := 10;
IF MannaPoints < 0 THEN MannaPoints := 100;
IF Level <> 500 THEN Level := 500;
IF MaxLev <> 0 THEN MaxLev := 0;
END;
Read_A := FALSE; Read_B := FALSE;
Read_C := FALSE; Read_D := FALSE;
Read_P := FALSE; Read_S := FALSE;
Read_X := FALSE;
StatusLine;
WINDOW(1,1,80,25);
TextInverseOn;
GOTOXY(1,2); CLREOL;
WRITE(UserName+' '+UsersRec.RealName+' '+UsersRec.Phone+' MaxLev '+IntToStr(MaxLev));
TextInverseOff;
WINDOW(1,3,80,25);
CLRSCR;
XLF;
HadNews := ReadBoard('G');
IF Level < 4 THEN
BEGIN
XLF;
XLn('Awaiting your commands.');
X('Type'); SlowX(' HELP '); XLn('if you need it.');
END;
END; { Not banished }
END { Password okay }
ELSE
BEGIN
SysLog('I','Imposter gave wrong password for '+UserName);
SysLog('W','Attempted password: '+TestPass);
XLF;
XLn('That is not the correct word.'+LF);
XLn('A bolt of lightning strikes down...');
END; { Password not okay }
END; { Not successive call }
END; { Found UserRecPtr }
END; { Not a TSOTL name }
END; { UserName was not null }
END;
{======= Disconnection =======}
OVERLAY PROCEDURE ShakeMount;
VAR
SMCnt : INTEGER;
BEGIN
WRITELN(#17#16+' Performing Seismoros scrub -- this takes a while');
SOUND(512); DELAY(1000);
SOUND(1024); DELAY(1000);
SOUND(2048); DELAY(1500);
NOSOUND;
FOR SMCnt := 1 TO (MaxUsers - 1) DO
BEGIN
SEEK(UsersFile,SMCnt);
READ(UsersFile,UsersRec);
IF (LENGTH(UsersRec.UserName) > 0) AND (UsersRec.Level > 5) THEN
BEGIN
WITH UsersRec DO
BEGIN
Level := Level DIV (20 + RANDOM(20)) + 2;
IF Points > 0 THEN Points := 10 + RANDOM(50);
MsgsSent := MsgsSent DIV 50;
END;
SEEK(UsersFile,SMCnt);
WRITE(UsersFile,UsersRec);
END; { Valid User }
END; { Scrub Loop }
SeismoActive := FALSE;
END; { SeismoActive }
OVERLAY PROCEDURE Disconnect; { After-visit processing }
VAR
UUCnt : INTEGER;
BEGIN
IF SysFail THEN
BEGIN
XLn('System failure. Shutting down.');
XLn('Our apologies.');
DropCarrier;
ModemCtrl(ModemReset);
END
ELSE
BEGIN
IF NewUser THEN
BEGIN
XLn(LF+'Thanks for stopping by!');
DropCarrier;
END
ELSE
BEGIN
IF POS('PASSWORD',CmdParm) > 0 THEN
BEGIN
XLF;
XLn('Changing Password.');
XLF;
XLn('What is your old password? ');
GetTestPass; XLF;
IF TestPass <> MyPassword
THEN XLn('This is not correct.')
ELSE
BEGIN
REPEAT
XLF;
XLn('What is your new password?');
GetTestPass; XLF;
MyPassword := TestPass;
XLF;
XLn('Type it again, to make sure.');
GetTestPass; XLF;
IF TestPass <> MyPassword THEN XLn(LF+'Try again.');
UNTIL (TestPass = MyPassword) OR LostCarrier;
XLF;
XLn('Password changed.');
END; { Okay to change }
END; { Password change }
CmdParm := '';
XLF;
{----- Check for lackadaisia -----}
IF (NOT (Read_A OR Read_B OR Read_C OR Read_D OR Read_S OR Read_X))
AND (NOT NonReadInfo)
AND Tactical THEN Postings := Postings - 2 - RANDOM(2);
{--- 1-in-3 chance of hit against quiet types ---}
IF (Level > 15)
AND (NOT Communicative) THEN Postings := Postings - (RANDOM(3) DIV 2);
IF Postings > -3
THEN
BEGIN
IF SeismoActive
THEN XLn('Good-bye.')
ELSE XLn('Thank-you for visiting...')
END
ELSE
BEGIN
XLn('TSOTL angrily hurls you'+CR+LF+'from the Mountain.');
SysLog('I',UserName+' thrown off by TSOTL');
END;
DropCarrier;
ModemCtrl(ModemNoAnswer); { Don't answer while updating files }
WRITELN(#17#16+' Updating User Info');
{--- Update User Info ---}
IF FindUserRecPtr(UserName) THEN
BEGIN
UsersRec.Level := Level;
UsersRec.Width := Width;
WITH UsersRec DO
BEGIN
MaxLevel := MaxLev;
MsgsSent := Postings;
Points := MannaPoints;
Date_Last := Date; Mint_Last := Mint;
Password := MyPassword;
IF Postings <= -3
THEN Date_Last := 0
ELSE
BEGIN
IF Read_A THEN BEGIN Date_A := Date; Mint_A := Mint; END;
IF Read_B THEN BEGIN Date_B := Date; Mint_B := Mint; END;
IF Read_C THEN BEGIN Date_C := Date; Mint_C := Mint; END;
IF Read_D THEN BEGIN Date_D := Date; Mint_D := Mint; END;
IF Read_P THEN BEGIN Date_P := Date; Mint_P := Mint; END;
IF Read_S THEN BEGIN Date_S := Date; Mint_S := Mint; END;
IF Read_X THEN BEGIN Date_X := Date; Mint_X := Mint; END;
END;
END;
SEEK(UsersFile, UserRecPtr);
WRITE(UsersFile, UsersRec);
END;
IF SeismoActive THEN ShakeMount;
CLOSE(UsersFile);
CLOSE(MsgTimesFile);
CLOSE(SeismoFile);
{--- Get ready again ---}
{$I-}
ASSIGN(UsersFile,DFLocation + File_Users);
RESET(UsersFile);
IF IORESULT > 0 THEN OpenFail(File_Users);
ASSIGN(MsgTimesFile,DFLocation + File_Times);
RESET(MsgTimesFile);
IF IORESULT > 0 THEN OpenFail(File_Times);
ASSIGN(SeismoFile,DFLocation + File_Seismo);
RESET(SeismoFile);
IF IORESULT > 0 THEN OpenFail(File_Seismo);
{$I+}
END; { Not NewUser }
ResetAnswer;
END; { Not SysFail }
END;