home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-385-Vol-1of3.iso / d / dnd29c4.zip / SOURCE.ZIP / DNDSUB2.BAS < prev    next >
BASIC Source File  |  1993-01-07  |  73KB  |  3,068 lines

  1.  Rem dndsub2.bas v2.9c
  2.  Rem $Include: 'dndbbs.inc'
  3.  
  4. Sub Login
  5.  On Local Error Goto 10002
  6.  Call Prelogin
  7.  If Bypass.Login Then
  8.     Call Alt.Login(Logged.In)
  9.     If Logged.In Then
  10.        Call Get.User.Stats(Logged.In)
  11.     Endif
  12.     If Logged.In=False Then
  13.        Strng="Bad bypass login"
  14.        Call Error.Message
  15.     Endif
  16.     Call Display.Prenotice
  17.     Call Update.Login
  18.     Call Login.User
  19.     Exit Sub
  20.  Endif
  21.  Call Display.Prenotice
  22.  Do While Security.Guard
  23.     If Config2(4) Then
  24.        Call Out.File(Prelog.FileName)
  25.        If Break=False Then
  26.           Strng=Nul
  27.           Call IO.O
  28.        Endif
  29.     Endif
  30.     Login.Try=False
  31.     Do While Security.Guard
  32.        New.User=False
  33.        Call Get.Codename
  34.        Call Get.PassWord
  35.        Call Find.PassWord(Logged.User)
  36.        If Logged.User Then
  37.           Call Verify.PassWord(Logged.Pass)
  38.           If Logged.Pass Then
  39.              Exit Do
  40.           Endif
  41.           If Login.Try>=3 Then
  42.              Call Hang.Up(7)
  43.              Exit Sub
  44.           Endif
  45.           Login.Try=Login.Try+1
  46.           Strng="Illegal password attempt!"
  47.           Call IO.O
  48.        Else
  49.           Call Get.Newuser.Record
  50.           Call Verify.Newuser(New.User)
  51.           If New.User>False Then
  52.              Call Hang.Up(8)
  53.              Exit Sub
  54.           Endif
  55.           If New.User<False Then
  56.              Call Init.Newuser
  57.              Call Verify.Newlogin(New.User,True)
  58.              If New.User Then
  59.                 Exit Do
  60.              Endif
  61.           Endif
  62.        Endif
  63.     Loop
  64.     If Config2(6) Then
  65.        Call Out.File(Notice.FileName)
  66.        If Break=False Then
  67.           Strng=Nul
  68.           Call IO.O
  69.        Endif
  70.     Endif
  71.     Call Update.Login
  72.     If New.User=False Then
  73.        Exit Do
  74.     Endif
  75.     If New.User Then
  76.        Call Roll.Character
  77.        Call Verify.Newlogin(New.User,False)
  78.        If New.User Then
  79.           Call Clear.LogFile
  80.           Exit Do
  81.        Endif
  82.     Endif
  83.  Loop
  84.  If New.User Then
  85.     Strng="Wait.."
  86.     Call IO.O
  87.     Call Init.Mail
  88.  Endif
  89.  If Config2(5) Then
  90.     Call Out.File(Welcome.FileName)
  91.     If Break=False Then
  92.        Strng=Nul
  93.        Call IO.O
  94.     Endif
  95.  Endif
  96.  Call Login.User
  97. 10001
  98.  Exit Sub
  99. 10002
  100.  Resume 10001
  101. End Sub
  102.  
  103. Sub Find.PassWord(Var)
  104.  On Local Error Goto 10012
  105.  Var=False
  106.  For User.Index=1 To Lof(3)/Len(UserRecord)
  107.     Get 3,User.Index,UserRecord
  108.     Out2=Rtrim$(CodeName.Temp)
  109.     Strng=UserRecord.CodeName
  110.     Call Decrypt(Strng)
  111.     Strng=Rtrim$(Strng)
  112.     If Strng=Out2 Then
  113.        Var=True
  114.        Exit For
  115.     Endif
  116.  Next
  117. 10011
  118.  Exit Sub
  119. 10012
  120.  Resume 10011
  121. End Sub
  122.  
  123. Sub Verify.PassWord(Var)
  124.  On Local Error Goto 10022
  125.  If Node>False Then
  126.     Call Search.Mess(User.Index)
  127.     If Temp Then
  128.        Strng="That codename is active on another node."
  129.        Call IO.O
  130.        Var=False
  131.        Exit Sub
  132.     Endif
  133.  Endif
  134.  Strng=UserRecord.PassWord
  135.  Call Decrypt(Strng)
  136.  If Len(Strng)=False Then
  137.     Strng="Password has a checksum error."
  138.     Call IO.O
  139.     Var=False
  140.     Exit Sub
  141.  Endif
  142.  Strng=Rtrim$(Strng)
  143.  Out2=Rtrim$(PassWord.Temp)
  144.  If Strng=Out2 Then
  145.     Var=True
  146.     Exit Sub
  147.  Endif
  148. 10021
  149.  Exit Sub
  150. 10022
  151.  Resume 10021
  152. End Sub
  153.  
  154. Sub Verify.Newlogin(Var,Var1)
  155.  On Local Error Goto 10032
  156.  Do While Security.Guard
  157.     Graphics.Off=False
  158.     If Var1 Then
  159.        Strng=Config3(5)
  160.     Else
  161.        Strng=Config3(77)
  162.     Endif
  163.     No.Echo=True
  164.     Line.Length=1
  165.     Call IO.I
  166.     No.Echo=False
  167.     If Out2=" " Then
  168.        Var=False
  169.        Exit Sub
  170.     Endif
  171.     If No.Input Then
  172.        Var=True
  173.        Exit Sub
  174.     Endif
  175.  Loop
  176. 10031
  177.  Exit Sub
  178. 10032
  179.  Resume 10031
  180. End Sub
  181.  
  182. Sub Get.Codename
  183.  On Local Error Goto 10042
  184.  Do While Security.Guard
  185.     Do While Security.Guard
  186.        Strng=Nul
  187.        Call IO.O
  188.        Strng="Codename? "
  189.        Line.Length=30
  190.        Call IO.I
  191.        Out2=Ltrim$(Out2)
  192.        Out2=Rtrim$(Out2)
  193.        Out2=Ucase$(Out2)
  194.        CodeName.Temp=Out2
  195.        If Len(CodeName.Temp)>False Then
  196.           Strng=CodeName.Temp
  197.           Call Valid.Name(Strng)
  198.           If TempA=False Then
  199.              Strng="Illegal codename."
  200.              Call IO.O
  201.           Else
  202.              Call Valid(CodeName.Temp,30)
  203.              If Len(CodeName.Temp)>False Then
  204.                 Exit Do
  205.              Endif
  206.              Strng="Illegal characters in codename."
  207.              Call IO.O
  208.           Endif
  209.        Endif
  210.     Loop
  211.     Strng=Rtrim$(CodeName.Temp)
  212.     Strng=Lcase$(Strng)
  213.     Mid$(Strng,1,1)=Ucase$(Mid$(Strng,1,1))
  214.     Strng="You are "+Chr$(34)+Strng+Chr$(34)+"(y/n)?"
  215.     No.Input.Out="Y"
  216.     Call IO.I
  217.     If Yes Then
  218.        Exit Do
  219.     Endif
  220.  Loop
  221. 10041
  222.  Exit Sub
  223. 10042
  224.  Resume 10041
  225. End Sub
  226.  
  227. Sub Get.PassWord
  228.  On Local Error Goto 10052
  229.  Do While Security.Guard
  230.     Strng=Nul
  231.     Call IO.O
  232.     Strng="Password? "
  233.     Line.Length=20
  234.     Hide=True
  235.     Call IO.I
  236.     Hide=False
  237.     Out2=Ltrim$(Out2)
  238.     Out2=Rtrim$(Out2)
  239.     Out2=Ucase$(Out2)
  240.     PassWord.Temp=Out2
  241.     If Len(PassWord.Temp)>False Then
  242.        Call Valid(PassWord.Temp,20)
  243.        If Len(PassWord.Temp)>False Then
  244.           Exit Do
  245.        Endif
  246.        Strng="Illegal characters in password."
  247.        Call IO.O
  248.     Endif
  249.  Loop
  250. 10051
  251.  Exit Sub
  252. 10052
  253.  Resume 10051
  254. End Sub
  255.  
  256. Sub Get.Newuser.Record
  257.  On Local Error Goto 10062
  258.  For User.Index=1 To Lof(3)/Len(UserRecord)
  259.     Get 3,User.Index,UserRecord
  260.     Strng=UserRecord.CodeName
  261.     Call Decrypt(Strng)
  262.     If Left$(Strng,9)=Deleted$ Then
  263.        Exit For
  264.     Endif
  265.  Next
  266.  Get 3,User.Index,UserRecord
  267.  Strng="Username not found in files."
  268.  Call IO.O
  269. 10061
  270.  Exit Sub
  271. 10062
  272.  Resume 10061
  273. End Sub
  274.  
  275. Sub Verify.Newuser(Var)
  276.  On Local Error Goto 10072
  277.  If Config2(61)=False Then
  278.     Var=True
  279.     Exit Sub
  280.  Endif
  281.  Do While Security.Guard
  282.     Strng=Config3(14)
  283.     No.Input.Out="C"
  284.     Call IO.I
  285.     Var=False
  286.     Select Case Ucase$(Out2)
  287.     Case "C"
  288.        Strng=Nul
  289.        Call IO.O
  290.        Strng="Verify password: "
  291.        Hide=True
  292.        Line.Length=20
  293.        Call IO.I
  294.        Hide=False
  295.        Out2=Ltrim$(Out2)
  296.        Out2=Rtrim$(Out2)
  297.        Out2=Ucase$(Out2)
  298.        Strng=Rtrim$(PassWord.Temp)
  299.        If Strng<>Out2 Then
  300.           Strng="Passwords don't match!"
  301.           Call IO.O
  302.           Exit Do
  303.        Endif
  304.        Strng=Config3(2)
  305.        If Len(Strng)>False Then
  306.           Call IO.O
  307.           Call IO.O
  308.        Endif
  309.        Var=True
  310.        Exit Do
  311.     Case "H"
  312.        Var=1
  313.        Exit Do
  314.     Case "R"
  315.        Exit Do
  316.     End Select
  317.  Loop
  318. 10071
  319.  Exit Sub
  320. 10072
  321.  Resume 10071
  322. End Sub
  323.  
  324. Sub Roll.Character
  325.  On Local Error Goto 10082
  326.  TempZ=False
  327.  If Config2(51)=False Then
  328.     If Config2(53)=False Then
  329.        If Config2(54)=False Then
  330.           Strng="List help text during character logon(y/n)?"
  331.           No.Input.Out="N"
  332.           Call IO.I
  333.           If Yes Then
  334.              TempZ=True
  335.           Endif
  336.        Endif
  337.     Endif
  338.  Endif
  339.  If Config2(54) Then
  340.     UserRecord.ClassType=1
  341.     Strng=Class.Name(1)
  342.     Call Valid(Strng,20)
  343.     If Strng=Nul Then
  344.        Strng="<checksum>"
  345.        Call Valid(Strng,20)
  346.     Endif
  347.     Call Encrypt(Strng,True)
  348.     UserRecord.ClassName=Strng
  349.  Else
  350.     If TempZ Then
  351.        Call Logon.Help(2)
  352.     Endif
  353.     Call Modify.Class
  354.  Endif
  355.  If Config2(51) Then
  356.     Call Roll.Stats
  357.  Else
  358.     If TempZ Then
  359.        Call Logon.Help(3)
  360.     Endif
  361.     Call Modify.Stats
  362.  Endif
  363.  If Config2(54) Then
  364.     UserRecord.Race=1
  365.  Else
  366.     If TempZ Then
  367.        Call Logon.Help(4)
  368.     Endif
  369.     Call Modify.Race
  370.  Endif
  371.  If Config2(52)=False Then
  372.     Call Init.Race.Stats
  373.  Endif
  374.  If Config2(53) Then
  375.     UserRecord.Proficiency=3
  376.     For Temp3=1 To 4
  377.        UserRecord.Weapons(Temp3)=False
  378.     Next
  379.     UserRecord.Weapons(3)=10
  380.  Else
  381.     If TempZ Then
  382.        Call Logon.Help(5)
  383.     Endif
  384.     Call Modify.Proficiency
  385.  Endif
  386.  If Config2(52)=False Then
  387.     Call Init.Proficiency.Stats
  388.  Endif
  389.  Call Init.Stats
  390.  If Config2(53) Then
  391.     UserRecord.Align1=False
  392.     UserRecord.Align2=False
  393.  Else
  394.     If TempZ Then
  395.        Call Logon.Help(6)
  396.     Endif
  397.     Call Modify.Alignment
  398.  Endif
  399.  Call Display.Init.Stats
  400. 10081
  401.  Exit Sub
  402. 10082
  403.  Resume 10081
  404. End Sub
  405.  
  406. Sub Logon.Help(VarY)
  407.  On Local Error Goto 10092
  408.  Close 13
  409.  Open Logon.Help.FileName For Random Shared As #13 Len=Len(HelpRecord1)
  410.  Graphics.Off=True
  411.  Strng=Nul
  412.  Call IO.O
  413.  Restore Logon.Data
  414.  For VarX=1 To VarY
  415.     Read TempA, TempB
  416.  Next
  417.  For TempC=TempA To TempB
  418.     Get 13,TempC,HelpRecord1
  419.     Strng=Space$(3)+Rtrim$(HelpRecord1.Text)
  420.     Call IO.O
  421.  Next
  422.  Call IO.O
  423.  Call More.Prompt
  424.  Graphics.Off=False
  425. 10091
  426.  Exit Sub
  427. 10092
  428.  Resume 10091
  429. End Sub
  430.  
  431. Logon.Data:
  432.  Data 2,4,5,9,10,18,19,27,28,33,34,38,39,42
  433.  
  434. Sub Modify.Alignment
  435.  On Local Error Goto 10102
  436.  Do While Security.Guard
  437.     Graphics.Off=False
  438.     Strng="Player Alignment:"
  439.     Call IO.O
  440.     Strng="Press "+Enter$+" for default."
  441.     Call IO.O
  442.     Graphics.Off=True
  443.     For Temp5=1 To 3
  444.        Strng=Mid$(Str$(Temp5),2)+"> "+Rtrim$(Alignment.Name1(Temp5))
  445.        Call IO.O
  446.     Next
  447.     Strng="?"
  448.     No.Input.Out="2"
  449.     Call IO.I
  450.     Temp2=Int(Val(Out2))
  451.     If Temp2>=1 And Temp2<=3 Then
  452.        Exit Do
  453.     Endif
  454.  Loop
  455.  UserRecord.Align1=Temp2-2
  456.  Do While Security.Guard
  457.     Graphics.Off=False
  458.     Strng="Player Alignment:"
  459.     Call IO.O
  460.     Strng="Press "+Enter$+" for default."
  461.     Call IO.O
  462.     Graphics.Off=True
  463.     For Temp5=1 To 3
  464.        Strng=Mid$(Str$(Temp5),2)+"> "+Rtrim$(Alignment.Name2(Temp5))
  465.        Call IO.O
  466.     Next
  467.     Strng="?"
  468.     No.Input.Out="2"
  469.     Call IO.I
  470.     Temp2=Int(Val(Out2))
  471.     If Temp2>=1 And Temp2<=3 Then
  472.        Exit Do
  473.     Endif
  474.  Loop
  475.  UserRecord.Align2=Temp2-2
  476. 10101
  477.  Exit Sub
  478. 10102
  479.  Resume 10101
  480. End Sub
  481.  
  482. Sub Modify.Class
  483.  On Local Error Goto 10112
  484.  Strng=Nul
  485.  Call IO.O
  486.  Do While Security.Guard
  487.     Graphics.Off=False
  488.     Call IO.O
  489.     Strng="Select your character class:"
  490.     Call IO.O
  491.     Strng="Press "+Enter$+" for default."
  492.     Call IO.O
  493.     Temp1=8
  494.     If Config2(7) Then
  495.        If Disable.DM=False Then
  496.           Temp1=10
  497.        Endif
  498.     Endif
  499.     Graphics.Off=True
  500.     For Temp5=1 To Temp1
  501.        Strng=Mid$(Str$(Temp5),2)
  502.        If Temp5=10 Then
  503.           Strng=Mask$
  504.        Endif
  505.        Strng=Strng+"> "+Rtrim$(Class.Name(Temp5))
  506.        Call IO.O
  507.     Next
  508.     Strng="?"
  509.     No.Input.Out="1"
  510.     Call IO.I
  511.     Temp5=Int(Val(Out2))
  512.     If Out2=Mask$ Then
  513.        Temp5=10
  514.     Endif
  515.     If Temp5>=1 And Temp5<=Temp1 Then
  516.        Exit Do
  517.     Endif
  518.  Loop
  519.  UserRecord.ClassType=Temp5
  520.  Strng=Class.Name(UserRecord.ClassType)
  521.  Call Valid(Strng,20)
  522.  If Strng=Nul Then
  523.     Strng="<checksum>"
  524.     Call Valid(Strng,20)
  525.  Endif
  526.  Call Encrypt(Strng,True)
  527.  UserRecord.ClassName=Strng
  528. 10111
  529.  Exit Sub
  530. 10112
  531.  Resume 10111
  532. End Sub
  533.  
  534. Sub Modify.Stats
  535.  On Local Error Goto 10122
  536.  Do While Security.Guard
  537.     Do While Security.Guard
  538.        Graphics.Off=False
  539.        Strng="Enter character statistics, range from"
  540.        Strng=Strng+Str$(Config2(8))+" to"+Str$(Config2(9))+"."
  541.        Call IO.O
  542.        Strng="Average less than or equal to"+Str$(Config1(4))+"."
  543.        Call IO.O
  544.        Strng="Press "+Enter$+" for default."
  545.        Call IO.O
  546.        Temp!=False
  547.        For Temp2=1 To 7
  548.           Do While Security.Guard
  549.              Graphics.Off=True
  550.              Strng=Rtrim$(Stat(Temp2))+">"
  551.              No.Input.Out=Mid$(Str$(Config1(4)),2)
  552.              Call IO.I
  553.              Temp=Int(Val(Out2))
  554.              If Temp<Config2(8) Or Temp>Config2(9) Then
  555.                 Graphics.Off=False
  556.                 Strng="The average statistic must range from"+_
  557.                 Str$(Config2(8))+" to"+Str$(Config2(9))+"."
  558.                 Call IO.O
  559.              Else
  560.                 Temp!=Temp!+Temp
  561.                 UserRecord.Stats(Temp2)=Temp
  562.                 Exit Do
  563.              Endif
  564.           Loop
  565.        Next
  566.        Temp!=Temp!/7!
  567.        TempX$=Str$(Temp!)
  568.        TempX=Instr(TempX$,".")
  569.        If TempX=False Then
  570.           Out2=TempX$
  571.        Else
  572.           Out2=Left$(TempX$,TempX-1)+"."+Mid$(TempX$,TempX+1,1)
  573.        Endif
  574.        Graphics.Off=False
  575.        If Temp!<=Config1(4) Then
  576.           Exit Do
  577.        Endif
  578.        Strng="Average"+Out2+" to high. Try again."
  579.        Call IO.O
  580.     Loop
  581.     Strng="Your average is"+Out2+". Change anything(y/n)?"
  582.     No.Input.Out="N"
  583.     Call IO.I
  584.     If No Then
  585.        Exit Do
  586.     Endif
  587.  Loop
  588. 10121
  589.  Exit Sub
  590. 10122
  591.  Resume 10121
  592. End Sub
  593.  
  594. Sub Roll.Stats
  595.  On Local Error Goto 10132
  596.  Redim Temp.Array1(1 To 7) As Integer
  597.  Do While Security.Guard
  598.     Strng="Rolling random character stats."
  599.     Call IO.O
  600.     Do While Security.Guard
  601.        Temp!=False
  602.        For Temp1=1 To 7
  603.           Temp2=Int(Rnd*(Config2(9)-Config2(8)+1)+Config2(8))
  604.           Temp!=Temp!+Temp2
  605.           Temp.Array1(Temp1)=Temp2
  606.        Next
  607.        Temp!=Temp!/7!
  608.        If Temp!<=Config1(4) Then
  609.           Exit Do
  610.        Endif
  611.     Loop
  612.     Graphics.Off=True
  613.     Strng=Nul
  614.     For Temp1=1 To 7
  615.        Strng=Strng+Left$(Stat(Temp1),3)+">"
  616.        Strng=Strng+Str$(Temp.Array1(Temp1))+" "
  617.     Next
  618.     Call IO.O
  619.     Strng="Keep these stats(y/n)?"
  620.     No.Input.Out="Y"
  621.     Call IO.I
  622.     If Yes Then
  623.        Exit Do
  624.     Endif
  625.  Loop
  626.  For Temp1=1 To 7
  627.     UserRecord.Stats(Temp1)=Temp.Array1(Temp1)
  628.  Next
  629. 10131
  630.  Exit Sub
  631. 10132
  632.  Resume 10131
  633. End Sub
  634.  
  635. Sub Modify.Race
  636.  On Local Error Goto 10142
  637.  Do While Security.Guard
  638.     Graphics.Off=False
  639.     Strng="Select your character race:"
  640.     Call IO.O
  641.     Strng="Press "+Enter$+" for default."
  642.     Call IO.O
  643.     Graphics.Off=True
  644.     For Temp5=1 To 8
  645.        Strng=Mid$(Str$(Temp5),2)+">"+Rtrim$(Race(Temp5))
  646.        Call IO.O
  647.     Next
  648.     Strng="?"
  649.     No.Input.Out="1"
  650.     Call IO.I
  651.     Temp2=Int(Val(Out2))
  652.     If Temp2>=1 And Temp2<=8 Then
  653.        UserRecord.Race=Temp2
  654.        Exit Do
  655.     Endif
  656.  Loop
  657. 10141
  658.  Exit Sub
  659. 10142
  660.  Resume 10141
  661. End Sub
  662.  
  663. Sub Modify.Proficiency
  664.  On Local Error Goto 10152
  665.  Do While Security.Guard
  666.     Graphics.Off=False
  667.     Strng="Weapon Proficiency:"
  668.     Call IO.O
  669.     Strng="Clerics may only use blunt or pole type weapons."
  670.     Call IO.O
  671.     Strng="Press "+Enter$+" for default."
  672.     Call IO.O
  673.     Graphics.Off=True
  674.     For Temp5=1 To 4
  675.        Strng=Mid$(Str$(Temp5),2)+"> "+Rtrim$(Weapon.Type.Name(Temp5))
  676.        Call IO.O
  677.     Next
  678.     Strng="?"
  679.     No.Input.Out="3"
  680.     If UserRecord.ClassType=4 Then
  681.        No.Input.Out="1"
  682.     Endif
  683.     Call IO.I
  684.     Temp2=Int(Val(Out2))
  685.     If UserRecord.ClassType=4 Then
  686.        If Temp2=1 Or Temp2=2 Then
  687.           Exit Do
  688.        Endif
  689.     Else
  690.        If Temp2>=1 And Temp2<=4 Then
  691.           Exit Do
  692.        Endif
  693.     Endif
  694.  Loop
  695.  UserRecord.Proficiency=Temp2
  696.  For Temp3=1 To 4
  697.     UserRecord.Weapons(Temp3)=False
  698.  Next
  699.  UserRecord.Weapons(Temp2)=10
  700. 10151
  701.  Exit Sub
  702. 10152
  703.  Resume 10151
  704. End Sub
  705.  
  706. Sub Init.Proficiency.Stats
  707.  On Local Error Goto 10162
  708.  Graphics.Off=False
  709.  If UserRecord.Race=3 Then
  710.     UserRecord.Weapons(UserRecord.Proficiency)=15
  711.     Strng="Gnomes weapon proficiency is raised to 15%"
  712.     Call IO.O
  713.  Endif
  714.  If UserRecord.Race=6 Then
  715.     UserRecord.Weapons(4)=UserRecord.Weapons(4)+5
  716.     Strng="Half-elves thrusting weapon proficiency is raised by 5%"
  717.     Call IO.O
  718.  Endif
  719.  If UserRecord.Race=7 Then
  720.     UserRecord.Weapons(3)=UserRecord.Weapons(3)+5
  721.     Strng="Half-orcs sharp weapon proficiency is raised by 5%"
  722.     Call IO.O
  723.  Endif
  724. 10161
  725.  Exit Sub
  726. 10162
  727.  Resume 10161
  728. End Sub
  729.  
  730. Sub Init.Race.Stats
  731.  On Local Error Goto 10172
  732.  Graphics.Off=False
  733.  If UserRecord.Race=1 Then
  734.     UserRecord.Stats(1)=UserRecord.Stats(1)+1
  735.     Strng="Humans strength is raised one point."
  736.     Call IO.O
  737.  Endif
  738.  If UserRecord.Race=2 Then
  739.     UserRecord.Stats(4)=UserRecord.Stats(4)+1
  740.     Strng="Elves dexterity is raised by one point."
  741.     Call IO.O
  742.  Endif
  743.  If UserRecord.Race=4 Then
  744.     UserRecord.Stats(2)=UserRecord.Stats(2)+1
  745.     Strng="Dwarves intelligence is raised by one point."
  746.     Call IO.O
  747.  Endif
  748.  If UserRecord.Race=5 Then
  749.     UserRecord.Stats(3)=UserRecord.Stats(3)+1
  750.     Strng="Halflings wisdom is raised by one point."
  751.     Call IO.O
  752.  Endif
  753.  If UserRecord.Race=8 Then
  754.     UserRecord.Stats(1)=UserRecord.Stats(1)+1
  755.     UserRecord.Stats(4)=UserRecord.Stats(4)+1
  756.     Strng="Ogres strength and dexterity are raised by one point."
  757.     Call IO.O
  758.  Endif
  759. 10171
  760.  Exit Sub
  761. 10172
  762.  Resume 10171
  763. End Sub
  764.  
  765. Sub Init.Stats
  766.  On Local Error Goto 10182
  767.  UserRecord.Room=Val(Config3(24))
  768.  UserRecord.Level=1
  769.  UserRecord.Experience=128
  770.  UserRecord.Gold=Config2(32)
  771.  UserRecord.Bank=False
  772.  UserRecord.Borrow=False
  773.  UserRecord.Brief=False
  774.  UserRecord.FatigueMax=Training.Room(UserRecord.ClassType,1)
  775.  UserRecord.VitalityMax=Training.Room(UserRecord.ClassType,2)
  776.  UserRecord.MagicMax=Training.Room(UserRecord.ClassType,3)
  777.  UserRecord.PsionicMax=Training.Room(UserRecord.ClassType,4)
  778.  UserRecord.Fatigue=UserRecord.FatigueMax
  779.  UserRecord.Vitality=UserRecord.VitalityMax
  780.  UserRecord.Magic=UserRecord.MagicMax
  781.  UserRecord.Psionic=UserRecord.PsionicMax
  782.  UserRecord.MaxCalls=False
  783.  UserRecord.FromHour=False
  784.  UserRecord.FromMin=False
  785.  UserRecord.ToHour=False
  786.  UserRecord.ToMin=False
  787.  UserRecord.Flags=False
  788. 10181
  789.  Exit Sub
  790. 10182
  791.  Resume 10181
  792. End Sub
  793.  
  794. Sub Display.Init.Stats
  795.  On Local Error Goto 10192
  796.  Graphics.Off=False
  797.  Strng="Your character statistics are:"
  798.  Call IO.O
  799.  Graphics.Off=True
  800.  Strng="Level:"+Str$(UserRecord.Level)
  801.  Strng=Strng+Space$(20-Len(Strng))
  802.  Strng2=Alignment.Name1(UserRecord.Align1+2)
  803.  Strng2=Rtrim$(Strng2)
  804.  Mid$(Strng2,1,1)=Ucase$(Mid$(Strng2,1,1))
  805.  Strng=Strng+"Align1: "+Strng2
  806.  Call IO.O
  807.  Strng="Gold: "+Str$(UserRecord.Gold)
  808.  Strng=Strng+Space$(20-Len(Strng))
  809.  Strng2=Alignment.Name2(UserRecord.Align2+2)
  810.  Strng2=Rtrim$(Strng2)
  811.  Mid$(Strng2,1,1)=Ucase$(Mid$(Strng2,1,1))
  812.  Strng=Strng+"Align2: "+Strng2
  813.  Call IO.O
  814.  Strng="Room: "+Str$(UserRecord.Room)
  815.  Strng=Strng+Space$(20-Len(Strng))
  816.  Temp2=UserRecord.Proficiency
  817.  Strng2=Weapon.Type.Name(Temp2)
  818.  Strng2=Rtrim$(Strng2)
  819.  Mid$(Strng2,1,1)=Ucase$(Mid$(Strng2,1,1))
  820.  Strng=Strng+"Prof:   "+Strng2
  821.  Strng2=Str$(UserRecord.Weapons(Temp2))
  822.  Strng=Strng+">"+Strng2+"%"
  823.  Call IO.O
  824.  Strng="Exp:  "+Str$(UserRecord.Experience)
  825.  Strng=Strng+Space$(20-Len(Strng))
  826.  Strng=Strng+Left$(Stat(1),3)+":   "+Str$(UserRecord.Stats(1))
  827.  Call IO.O
  828.  Strng="Fat:  "+Str$(UserRecord.Fatigue)
  829.  Strng=Strng+Space$(20-Len(Strng))
  830.  Strng=Strng+Left$(Stat(2),3)+":   "+Str$(UserRecord.Stats(2))
  831.  Call IO.O
  832.  Strng="Vit:  "+Str$(UserRecord.Vitality)
  833.  Strng=Strng+Space$(20-Len(Strng))
  834.  Strng=Strng+Left$(Stat(3),3)+":   "+Str$(UserRecord.Stats(3))
  835.  Call IO.O
  836.  Strng="Mag:  "+Str$(UserRecord.Magic)
  837.  Strng=Strng+Space$(20-Len(Strng))
  838.  Strng=Strng+Left$(Stat(4),3)+":   "+Str$(UserRecord.Stats(4))
  839.  Call IO.O
  840.  Strng="Psi:  "+Str$(UserRecord.Psionic)
  841.  Strng=Strng+Space$(20-Len(Strng))
  842.  Strng=Strng+Left$(Stat(5),3)+":   "+Str$(UserRecord.Stats(5))
  843.  Call IO.O
  844.  Strng="Race:  "+Race(UserRecord.Race)
  845.  Strng=Strng+Space$(20-Len(Strng))
  846.  Strng=Strng+Left$(Stat(6),3)+":   "+Str$(UserRecord.Stats(6))
  847.  Call IO.O
  848.  Strng2=UserRecord.ClassName
  849.  Call Decrypt(Strng2)
  850.  Mid$(Strng2,1,1)=Ucase$(Mid$(Strng2,1,1))
  851.  Strng2=Left$(Strng2,10)
  852.  Strng="Class: "+Strng2
  853.  Strng=Strng+Space$(20-Len(Strng))
  854.  Strng=Strng+Left$(Stat(7),3)+":   "+Str$(UserRecord.Stats(7))
  855.  Call IO.O
  856.  Call More.Prompt
  857. 10191
  858.  Exit Sub
  859. 10192
  860.  Resume 10191
  861. End Sub
  862.  
  863. Sub Update.Login        
  864.  On Local Error Goto 10202
  865.  If Security.Guard=False Then
  866.     Exit Sub
  867.  Endif
  868.  If Lost.Carrier Then
  869.     Exit Sub
  870.  Endif
  871.  Logged.In=True
  872.  Strng=UserRecord.DateOn
  873.  Call Decrypt(Strng)
  874.  If Strng<>Date$ Then
  875.     UserRecord.NumCalls=False
  876.  Endif
  877.  If UserRecord.ClassType<=8 Then
  878.     TempX=False
  879.     UserRecord.NumCalls=UserRecord.NumCalls+1
  880.     If UserRecord.MaxCalls>False Then
  881.        If UserRecord.NumCalls>UserRecord.MaxCalls Then
  882.           TempX=True
  883.        Endif
  884.     Else
  885.        If UserRecord.NumCalls>Config2(1) Then
  886.           TempX=True
  887.        Endif
  888.     Endif
  889.     If TempX Then
  890.        Put 3,User.Index,UserRecord
  891.        Call Hang.Up(5)
  892.        Exit Sub
  893.     Endif
  894.  Endif
  895.  TempX=False
  896.  Temp1!=Csng(UserRecord.FromHour*3600!+UserRecord.FromMin*60!)
  897.  Temp2!=Csng(UserRecord.ToHour*3600!+UserRecord.ToMin*60!)
  898.  If Temp1!>False Or Temp2!>False Then
  899.     If Timer<Temp1! Or Timer>Temp2! Then
  900.        TempX=True
  901.     Endif
  902.  Endif
  903.  If TempX Then
  904.     Put 3,User.Index,UserRecord
  905.     Call Hang.Up(6)
  906.     Exit Sub
  907.  Endif
  908.  If Config2(2)=False Then
  909.     If UserRecord.ClassType<9 Then
  910.        UserRecord.Invisible=False
  911.     Endif
  912.  Endif
  913.  Two.Minutes.Left=False
  914.  If UserRecord.ClassType>=9 Then
  915.     Time.Left=Config1(3)*60
  916.  Else
  917.     If UserRecord.Level<=1 Then
  918.        Time.Left=Config1(1)*60
  919.     Else
  920.        Time.Left=Config1(2)*60
  921.     Endif
  922.  Endif
  923.  If Time.Left>Door.Time Then
  924.     If Door.Time>False Then
  925.        Time.Left=Door.Time
  926.     Endif
  927.  Endif
  928.  Temp!=Time.Override*60!
  929.  If Time.Left>Temp! Then
  930.     If Temp!>False Then
  931.        Time.Left=Temp!
  932.     Endif
  933.  Endif
  934. 10201
  935.  Exit Sub
  936. 10202
  937.  Resume 10201
  938. End Sub
  939.  
  940. Sub Init.Newuser
  941.  On Local Error Goto 10212
  942.  UserRecord.NumCalls=False
  943.  UserRecord.ClassType=False
  944.  Strng=CodeName.Temp
  945.  Call Valid(Strng,30)
  946.  Call Encrypt(Strng,True)
  947.  UserRecord.CodeName=Strng
  948.  Strng=PassWord.Temp
  949.  Call Valid(Strng,20)
  950.  Call Encrypt(Strng,False)
  951.  UserRecord.PassWord=Strng
  952.  Strng=Deleted$
  953.  Call Valid(Strng,20)
  954.  Call Encrypt(Strng,True)
  955.  UserRecord.ClassName=Strng
  956.  Strng=Date$
  957.  Call Valid(Strng,10)
  958.  Call Encrypt(Strng,True)
  959.  UserRecord.DateOn=Strng
  960.  UserRecord.MaxCalls=False
  961.  UserRecord.FromHour=False
  962.  UserRecord.FromMin=False
  963.  UserRecord.ToHour=False
  964.  UserRecord.ToMin=False
  965. 10211
  966.  Exit Sub
  967. 10212
  968.  Resume 10211
  969. End Sub
  970.  
  971. Sub Prelogin
  972.  On Local Error Goto 10222
  973.  Number.Monsters=False
  974.  Number.MonstersMax=20
  975.  Number.Users=False
  976.  Number.UsersMax=20
  977.  Room.Treasure.Max=20
  978.  Treasure.Max=15
  979.  Players.Killed=False
  980.  Monsters.Killed=False
  981.  Time.On=Time$
  982.  Timeon=Timer
  983.  Time.Left=600
  984.  Two.Minutes.Left=False
  985.  Chat.Annoy=Config2(68)
  986.  Call Update.Mess(1)
  987.  Security.Guard=True
  988.  Color.Graphics=False
  989.  Extended.ANSI=False
  990.  Local.Avatar=False
  991.  Graphics.Status=False
  992.  Redim Learned.Spells(1 To Spells.Max) As Integer,_
  993.        MonsterArray(1 To 20) As MonsterType,_
  994.        MonsterIndex(1 To 20) As Integer,_
  995.        Room.Inventory(1 To 20) As Integer,_
  996.        Room.Inventory.Charges(1 To 20) As Integer,_
  997.        Treasure(1 To 15) As Integer,_
  998.        Treasure.Charges(1 To 15) As Integer,_
  999.        UserArray(1 To 20) As UserType,_
  1000.        UserIndex(1 To 20) As Integer
  1001. 10221
  1002.  Exit Sub
  1003. 10222
  1004.  Resume 10221
  1005. End Sub
  1006.  
  1007. Sub Alt.Login(Var)
  1008.  On Local Error Goto 10232
  1009.  CodeName.Temp=Left$(Bypass.CodeName,30)
  1010.  Call Valid(CodeName.Temp,30)
  1011.  If CodeName.Temp=Nul Then
  1012.     Var=False
  1013.     Exit Sub
  1014.  Endif
  1015.  Strng=Rtrim$(CodeName.Temp)
  1016.  Call Valid.Name(Strng)
  1017.  If TempA=False Then
  1018.     Var=False
  1019.     Exit Sub
  1020.  Endif
  1021.  Logged.User=False
  1022.  Strng=Rtrim$(CodeName.Temp)
  1023.  For User.Index=1 To Lof(3)/Len(UserRecord)
  1024.     Get 3,User.Index,UserRecord
  1025.     Out2=UserRecord.CodeName
  1026.     Call Decrypt(Out2)
  1027.     Out2=Rtrim$(Out2)
  1028.     If Strng=Out2 Then
  1029.        Logged.User=True
  1030.        Exit For
  1031.     Endif
  1032.  Next
  1033.  If Logged.User=False Then
  1034.     Var=False
  1035.     Exit Sub
  1036.  Endif
  1037.  If Node>False Then
  1038.     Call Search.Mess(User.Index)
  1039.     If Temp Then
  1040.        Var=False
  1041.        Exit Sub
  1042.     Endif
  1043.  Endif
  1044.  Strng=UserRecord.PassWord
  1045.  Call Decrypt(Strng)
  1046.  If Strng=Nul Then
  1047.     Var=False
  1048.     Exit Sub
  1049.  Endif
  1050.  Var=True
  1051.  Strng=Rtrim$(Strng)
  1052.  PassWord.Temp=Strng
  1053. 10231
  1054.  Exit Sub
  1055. 10232
  1056.  Resume 10231
  1057. End Sub
  1058.  
  1059. Sub Get.ANSI
  1060.  On Local Error Goto 10242
  1061.  Do
  1062.     Strng="Use ANSI color(y/n/h)?"
  1063.     No.Input.Out="H"
  1064.     Call IO.I
  1065.     Select Case Ucase$(Out2)
  1066.     Case "H"
  1067.        Call Logon.Help(1)
  1068.     Case "Y"
  1069.        Color.Graphics=True
  1070.        Exit Do
  1071.     Case "N"
  1072.        If Color.Graphics Then
  1073.           Graphics.Off=True
  1074.           Strng=Chr$(27)+"[0;1m"
  1075.           Call Scrn(Strng)
  1076.           Call Put.Modem(Strng)
  1077.        Endif
  1078.        Color.Graphics=False
  1079.        Extended.ANSI=False
  1080.        Exit Do
  1081.     End Select
  1082.  Loop
  1083. 10241
  1084.  Exit Sub
  1085. 10242
  1086.  Resume 10241
  1087. End Sub
  1088.  
  1089. Sub Get.Avatar
  1090.  On Local Error Goto 10252
  1091.  Do
  1092.     Strng="Use Avatar codes(y/n/h)?"
  1093.     No.Input.Out="H"
  1094.     Call IO.I
  1095.     Select Case Ucase$(Out2)
  1096.     Case "H"
  1097.        Call Logon.Help(7)
  1098.     Case "Y"
  1099.        Extended.ANSI=True
  1100.        Exit Do
  1101.     Case "N"
  1102.        If Extended.ANSI Then
  1103.           Graphics.Off=True
  1104.           Strng=Chr$(27)+"[0;1m"
  1105.           Call Scrn(Strng)
  1106.           Call Put.Modem(Strng)
  1107.        Endif
  1108.        Extended.ANSI=False
  1109.        Exit Do
  1110.     End Select
  1111.  Loop
  1112. 10251
  1113.  Exit Sub
  1114. 10252
  1115.  Resume 10251
  1116. End Sub
  1117.  
  1118. Sub Check.ANSI
  1119.  On Local Error Goto 10262
  1120.  If Local.Mode Then
  1121.     Exit Sub
  1122.  Endif
  1123.  Color.Graphics=False
  1124.  Call Put.Modem(Chr$(27)+"[6n")
  1125.  Buffer=Nul
  1126.  Timer.Temp!=Timer+2
  1127.  Do While Timer.Temp!>Timer
  1128.     Call Get.Modem
  1129.  Loop
  1130.  Out$=Chr$(27)+"["
  1131.  If Instr(Buffer,Out$) Then
  1132.     Color.Graphics=True
  1133.  Endif
  1134.  Buffer=Nul
  1135.  If Color.Graphics=False Then
  1136.     For Temp=1 To 4
  1137.        Call Back.Space
  1138.     Next
  1139.  Endif
  1140. 10261
  1141.  Exit Sub
  1142. 10262
  1143.  Resume 10261
  1144. End Sub
  1145.  
  1146. Sub Check.Avatar
  1147.  On Local Error Goto 10272
  1148.  If Local.Mode Then
  1149.     Exit Sub
  1150.  Endif
  1151.  Extended.ANSI=False
  1152.  Call Put.Modem(Chr$(27)+"[23;1H")
  1153.  Call Put.Modem(Chr$(22)+Chr$(8)+Chr$(24)+Chr$(1))
  1154.  Call Put.Modem(Chr$(27)+"[6n")
  1155.  Buffer=Nul
  1156.  Timer.Temp!=Timer+2
  1157.  Do While Timer.Temp!>Timer
  1158.     Call Get.Modem
  1159.  Loop
  1160.  Out$=Chr$(27)+"[24;1R"
  1161.  If Instr(Buffer,Out$) Then
  1162.     Extended.ANSI=True
  1163.  Endif
  1164.  Buffer=Nul
  1165.  If Extended.ANSI=False Then
  1166.     For Temp=1 To 4
  1167.        Call Back.Space
  1168.     Next
  1169.  Endif
  1170. 10271
  1171.  Exit Sub
  1172. 10272
  1173.  Resume 10271
  1174. End Sub
  1175.  
  1176. Sub Get.Graphics
  1177.  On Local Error Goto 10282
  1178.  If Local.Mode Then
  1179.     Strng="Graphics status line is for remote users."
  1180.     Call IO.O
  1181.     Exit Sub
  1182.  Endif
  1183.  Call Check.ANSI
  1184.  If Color.Graphics Then
  1185.     Strng="Remote ANSI detected."
  1186.     Call IO.O
  1187.     Call Check.Avatar
  1188.     If Extended.ANSI Then
  1189.        Strng="Remote Avatar detected."
  1190.        Call IO.O
  1191.     Endif
  1192.  Endif
  1193.  If Color.Graphics=False Then
  1194.     Strng="Remote ANSI not detected."
  1195.     Call IO.O
  1196.     Exit Sub
  1197.  Endif
  1198.  Strng="Turn on status line(y/n)?"
  1199.  No.Input.Out="Y"
  1200.  Call IO.I
  1201.  If Yes Then
  1202.     Graphics.Status=True
  1203.     Call Status.Line(False)
  1204.     Exit Sub
  1205.  Endif
  1206.  If Graphics.Status Then
  1207.     If Extended.ANSI Then
  1208.        Call Avatar(2,25,1)
  1209.     Else
  1210.        Call ANSI(2,25,1)
  1211.     Endif
  1212.     Temp$=TempD$+Space$(79)
  1213.     Call Display.Status.Line2
  1214.  Endif
  1215.  Graphics.Status=False
  1216. 10281
  1217.  Exit Sub
  1218. 10282
  1219.  Resume 10281
  1220. End Sub
  1221.  
  1222. Sub Login.User
  1223.  On Local Error Goto 10292
  1224.  Call Bank.Interest
  1225.  If UserRecord.Race<=False Then
  1226.     UserRecord.Race=1
  1227.  Endif
  1228.  Put 3,User.Index,UserRecord
  1229.  If Config2(38) Then
  1230.     Strng=Nul
  1231.     Call IO.O
  1232.     Strng="Check for new mail(y/n)?"
  1233.     No.Input.Out="Y"
  1234.     Call IO.I
  1235.     If Yes Then
  1236.        Call New.Mail
  1237.     Endif
  1238.  Endif
  1239.  Strng=Nul
  1240.  Call IO.O
  1241.  If Config2(14) Then
  1242.     Strng=Config3(6)
  1243.     If Strng<>Nul Then
  1244.        No.Echo=True
  1245.        Line.Length=1
  1246.        Call IO.I
  1247.        No.Echo=False
  1248.     Endif
  1249.  Endif
  1250.  If Config2(70) Then
  1251.     FileName=Day.Log.FileName
  1252.     Call Clean.UpdateFile
  1253.  Endif
  1254.  If Config2(71) Then
  1255.     FileName=Day.File.FileName
  1256.     Call Clean.UpdateFile
  1257.  Endif
  1258.  Call Display.LogFile
  1259.  Call Update.Mess(4)
  1260.  Strng="Logged on"
  1261.  If Local.Mode=False Then
  1262.     Strng=Strng+": baud"+Str$(Modem.Baud*100)
  1263.  Endif
  1264.  Call Update.DayFile(Strng,True)
  1265.  Room=UserRecord.Room
  1266.  If UserRecord.Level=False Then
  1267.     Strng="You are level zero. You can use the train command once free."
  1268.     Call IO.O
  1269.  Endif
  1270.  Call Clear.Mess
  1271.  Out2="just logged on"
  1272.  If Node Then
  1273.     Out2=Out2+" (Node "+Chr$(Node)+")"
  1274.  Endif
  1275.  Call Send.Mess(4,False,False,Out2)
  1276.  Weapon1=False
  1277.  Weapon2=False
  1278.  Weapon3=False
  1279.  Weapon4=False
  1280.  Weapon5=False
  1281.  Weapon6=False
  1282.  Weapon7=False
  1283.  Weapon8=False
  1284.  Weapon9=False
  1285.  Weapon10=False
  1286.  If Lost.Carrier Then
  1287.     Security.Guard=False
  1288.     Logged.In=False
  1289.  Endif
  1290. 10291
  1291.  Exit Sub
  1292. 10292
  1293.  Resume 10291
  1294. End Sub
  1295.  
  1296. Sub Display.Prenotice
  1297.  On Local Error Goto 10302
  1298.  Strng=Nul
  1299.  If Config2(3) Then
  1300.     Strng="DNDBBS V"+Version$+" online at "+FNclock$+"."
  1301.     If Bypass.Login Then
  1302.        Strng=Strng+" (bypass login)"
  1303.     Endif
  1304.  Endif
  1305.  If Local.Mode Then
  1306.     Color.Graphics=True
  1307.     If Config2(84) And Config2(85) Then
  1308.        Local.Avatar=True
  1309.     Endif
  1310.     Call IO.O
  1311.     Exit Sub
  1312.  Endif
  1313.  Carriage.Return=True
  1314.  Call IO.O
  1315.  Call Pause.Second
  1316.  Call IO.O
  1317.  Call Pause.Second
  1318.  If Config2(73) Then
  1319.     Call Check.ANSI
  1320.  Endif
  1321.  If Color.Graphics Then
  1322.     If Config2(85) Then
  1323.        Call Check.Avatar
  1324.     Endif
  1325.  Endif
  1326.  If Color.Graphics=False Then
  1327.     If Config2(72) Then
  1328.        Strng=Nul
  1329.        Call IO.O
  1330.        Call Get.ANSI
  1331.     Endif
  1332.     If Color.Graphics Then
  1333.        If Config2(84) Then
  1334.           Strng=Nul
  1335.           Call IO.O
  1336.           Call Get.Avatar
  1337.        Endif
  1338.     Endif
  1339.  Endif
  1340. 10301
  1341.  Exit Sub
  1342. 10302
  1343.  Resume 10301
  1344. End Sub
  1345.  
  1346. Sub Display.Information
  1347.  On Local Error Goto 10312
  1348.  If Not Normal.User Then
  1349.     Var=Val(Parsed.Command1)
  1350.     If Var>False And Var<=Lof(5)/Len(RoomRecord) Then
  1351.        Swap Var, Room
  1352.        Get 5,Room,RoomRecord
  1353.        Call Show.Room
  1354.        Swap Var, Room
  1355.        Get 5,Room,RoomRecord
  1356.        Exit Sub
  1357.     Endif
  1358.  Endif
  1359.  Strng=UserRecord.CodeName
  1360.  Call Decrypt(Strng)
  1361.  Strng=Left$(Strng,Len(Parsed.Command1))
  1362.  If Strng=Parsed.Command1 Then
  1363.     Call Display.Stats
  1364.     Exit Sub
  1365.  Endif
  1366.  Call Search.Mess(False)
  1367.  If Temp=Room Then
  1368.     Out2=MessWorkRecord1.UserName
  1369.     Out2=Rtrim$(Out2)
  1370.     Out2=Lcase$(Out2)
  1371.     Graphics.Off=True
  1372.     Mid$(Out2,1,1)=Ucase$(Mid$(Out2,1,1))
  1373.     Strng=Out2+" is level"+Str$(MessWorkRecord1.Level)+"."
  1374.     Call IO.O
  1375.     If Last.Command.Number=Identify.Command Then
  1376.        If MessWorkRecord1.ClassType=8 Then
  1377.           Out3="She "
  1378.        Else
  1379.           Out3="He "
  1380.        Endif
  1381.        Strng=Out3+"is a "+Rtrim$(Race(MessWorkRecord1.Race))+" "+_
  1382.        Rtrim$(Class.Name(MessWorkRecord1.ClassType))+"."
  1383.        Call IO.O
  1384.        Strng="Vitals: "+Mid$(Str$(MessWorkRecord1.Fatigue),2)+"/"+_
  1385.        Mid$(Str$(MessWorkRecord1.FatigueMax),2)+_
  1386.        " Fat"+Str$(MessWorkRecord1.Vitality)+"/"+_
  1387.        Mid$(Str$(MessWorkRecord1.VitalityMax),2)+_
  1388.        " Vit"+Str$(MessWorkRecord1.Magic)+"/"+_
  1389.        Mid$(Str$(MessWorkRecord1.MagicMax),2)+_
  1390.        " Mag"+Str$(MessWorkRecord1.Psionic)+"/"+_
  1391.        Mid$(Str$(MessWorkRecord1.PsionicMax),2)+" Psi"
  1392.        Call IO.O
  1393.        Strng="Stats: "
  1394.        For Temp2=1 To 7
  1395.           Strng=Strng+Left$(Stat(Temp2),3)+_
  1396.           Str$(MessWorkRecord1.Stats(Temp2))+" "
  1397.        Next
  1398.        Call IO.O
  1399.        Strng="Weapons: "
  1400.        For Temp2=1 To 4
  1401.           Strng=Strng+Rtrim$(Weapon.Type.Name(Temp2))+">"+_
  1402.           Str$(MessWorkRecord1.Weapons(Temp2))+"% "
  1403.        Next
  1404.        Call IO.O
  1405.        Strng=Out3+"is aligned "+_
  1406.        Rtrim$(Alignment.Name1(MessWorkRecord1.Align1+2))+" "+_
  1407.        Rtrim$(Alignment.Name2(MessWorkRecord1.Align2+2))+"."
  1408.        Call IO.O
  1409.        Strng=Out3+"has"+Str$(MessWorkRecord1.Gold)+" gold and"+_
  1410.        Str$(MessWorkRecord1.Experience)+" experience."
  1411.        Call IO.O
  1412.        Strng=Out3+"is carrying the following items:"
  1413.        Call IO.O
  1414.        Temp9=False
  1415.        Do
  1416.           For Temp1=1 To 20
  1417.              Temp2=MessWorkRecord1.Treasure(Temp1)
  1418.              If Temp2 Then
  1419.                 Carriage.Return=True
  1420.                 Call IO.O
  1421.                 Get 8,Temp2,TreasureRecord
  1422.                 Out3=TreasureRecord.TreasureName
  1423.                 Out3=Rtrim$(Out3)
  1424.                 If TreasureRecord.Invisible Then
  1425.                    Out3=Out3+" [inv]"
  1426.                 Endif
  1427.                 Strng=Out3+", "
  1428.                 Temp9=Temp9+1
  1429.                 If Temp9=1 Then
  1430.                    Mid$(Strng,1,1)=Ucase$(Mid$(Strng,1,1))
  1431.                 Endif
  1432.              Endif
  1433.           Next
  1434.           Var=MessWorkRecord1.NextRecord
  1435.           If Var>False Then
  1436.              Get 1,Var,MessWorkRecord1
  1437.           Else
  1438.              Exit Do
  1439.           Endif
  1440.        Loop
  1441.        If Temp9=False Then
  1442.           Strng="Nothing at all."
  1443.        Else
  1444.           Strng=Left$(Strng,Len(Strng)-2)+"."
  1445.           If Temp9>1 Then
  1446.              Strng="and "+Strng
  1447.           Endif
  1448.        Endif
  1449.        Call IO.O
  1450.     Endif
  1451.     Graphics.Off=False
  1452.     Exit Sub
  1453.  Endif
  1454.  Call Examine.Treasure
  1455.  If Temp7 Then
  1456.     If Temp4 Then
  1457.        Prefix1="It's "
  1458.     Else
  1459.        Prefix1="You are carrying "
  1460.     Endif
  1461.     Graphics.Off=True
  1462.     If TreasureRecord.Scroll Then
  1463.        If TreasureRecord.Spell Then
  1464.           Temp2=TreasureRecord.Spell
  1465.           If Temp2>False And Temp2<=Spells.Max Then
  1466.              SpellRecord=SpellArray(Temp2)
  1467.              Out2=SpellRecord.Chant
  1468.              Out2=Rtrim$(Out2)
  1469.              Out2=Lcase$(Out2)
  1470.              Strng="It reads: '"+Out2+"'."
  1471.              Call IO.O
  1472.              Strng="It disintegrated!"
  1473.              Call IO.O
  1474.              Select Case Temp4
  1475.              Case 0
  1476.                 Call Discard(Temp5,True)
  1477.              Case -1
  1478.                 Call Discard.Inventory(Temp5)
  1479.              Case 1
  1480.                 Call Discard.Treasure(Temp5)
  1481.              End Select
  1482.           Endif
  1483.        Endif
  1484.        Exit Sub
  1485.     Endif
  1486.     Strng=Prefix1+Out3
  1487.     If TreasureRecord.Keyed Then
  1488.        Strng=Strng+" (#"+Right$(Str$(TreasureRecord.Keyed+100000!),4)+")"
  1489.     Endif
  1490.     If TreasureRecord.Plus Then
  1491.        Strng=Strng+"(+"+Mid$(Str$(Abs(TreasureRecord.Plus)),2)+")"
  1492.     Endif
  1493.     If TreasureRecord.Spell Then
  1494.        SpellRecord=SpellArray(TreasureRecord.Spell)
  1495.        Strng=Strng+"(+"+Mid$(Str$(SpellRecord.Level),2)+")"
  1496.     Endif
  1497.     If TreasureRecord.Invisible Then
  1498.        Strng=Strng+" [inv]"
  1499.     Else
  1500.        If Temp4=1 Then
  1501.           If RoomRecord.Flags(Temp5)=Hidden.Object Then
  1502.              Strng=Strng+" [inv]"
  1503.           Endif
  1504.        Endif
  1505.     Endif
  1506.     Call IO.O
  1507.     If TreasureRecord.Proficiency Then
  1508.        Strng=Weapon.Type.Name(TreasureRecord.Proficiency)
  1509.        Strng=Rtrim$(Strng)
  1510.        Strng="This is a "+Strng+" weapon."
  1511.        Call IO.O
  1512.     Endif
  1513.     If Last.Command.Number=Identify.Command Then
  1514.        Strng="It is worth"+Str$(TreasureRecord.Gold)+" gold peices."
  1515.        Call IO.O
  1516.        Strng="It weighs"+Str$(TreasureRecord.Weight)+" pounds."
  1517.        Call IO.O
  1518.        If TreasureRecord.RingType Then
  1519.           Select Case TreasureRecord.RingType
  1520.           Case 1
  1521.              Strng="protection from poison."
  1522.           Case 2
  1523.              Strng="protection from level drain."
  1524.           Case 3
  1525.              Strng="protection from spells."
  1526.           End Select
  1527.           Strng="It's ring spell is "+Strng
  1528.           Call IO.O
  1529.        Endif
  1530.        If TreasureRecord.Spell Then
  1531.           SpellRecord=SpellArray(TreasureRecord.Spell)
  1532.           Strng="It's magical spell is "+Rtrim$(SpellRecord.SpellName)+"."
  1533.           Call IO.O
  1534.        Endif
  1535.        If TreasureRecord.Loadable Or TreasureRecord.Launchable Then
  1536.           If Temp6<=False Then
  1537.              Strng="It's not loaded."
  1538.           Else
  1539.              Strng="It's loaded with"+Str$(Temp6)+" charges."
  1540.           Endif
  1541.           Call IO.O
  1542.        Else
  1543.           If TreasureRecord.RingType Or TreasureRecord.Spell Or_
  1544.           TreasureRecord.Plus Then
  1545.              If Temp6<=False Then
  1546.                 Strng="It's empty of charges."
  1547.              Else
  1548.                 Strng="It has"+Str$(Temp6)+" charges."
  1549.              Endif
  1550.              Call IO.O
  1551.           Endif
  1552.        Endif
  1553.        If TreasureRecord.Ammunition Or TreasureRecord.LaunchAmmo Then
  1554.           Strng="It's ammunition."
  1555.           Call IO.O
  1556.        Endif
  1557.        If TreasureRecord.Potion Then
  1558.           Strng="It's a potion."
  1559.           Call IO.O
  1560.        Endif
  1561.        If TreasureRecord.Edible Then
  1562.           Strng="It is edible."
  1563.           Call IO.O
  1564.        Endif
  1565.     Endif
  1566.     If TreasureRecord.Recep Then
  1567.        If TreasureRecord.Locked>False Then
  1568.           Strng="It is locked."
  1569.           Call IO.O
  1570.           Exit Sub
  1571.        Endif
  1572.        If TreasureRecord.Closed>False Then
  1573.           Strng="It is closed."
  1574.           Call IO.O
  1575.           Exit Sub
  1576.        Endif
  1577.        Strng="It contains the following treasure:"
  1578.        Call IO.O
  1579.        Temp9=False
  1580.        Call Open.Recep.File
  1581.        Strng=Nul
  1582.        For Temp5=1 To Lof(13)/Len(RecepRec)
  1583.           Get 13,Temp5,RecepRec
  1584.           Temp2=RecepRec.Inv
  1585.           Temp1=RecepRec.Invis
  1586.           Temp=True
  1587.           If Temp2 Then
  1588.              If Temp1=True Then
  1589.                 If Normal.User Then
  1590.                    Temp=False
  1591.                 Endif
  1592.              Endif
  1593.              If Temp=True Then
  1594.                 Carriage.Return=True
  1595.                 Call IO.O
  1596.                 Get 8,Abs(Temp2),TreasureRecord
  1597.                 Out3=TreasureRecord.TreasureName
  1598.                 Out3=Rtrim$(Out3)
  1599.                 If Temp1=True Then
  1600.                    Out3=Out3+" [inv]"
  1601.                 Endif
  1602.                 Strng=Out3+", "
  1603.                 Temp9=Temp9+1
  1604.                 If Temp9=1 Then
  1605.                    Mid$(Strng,1,1)=Ucase$(Mid$(Strng,1,1))
  1606.                 Endif
  1607.              Endif
  1608.           Endif
  1609.        Next
  1610.        If Temp9=False Then
  1611.           Strng="Nothing at all."
  1612.        Else
  1613.           Strng=Left$(Strng,Len(Strng)-2)+"."
  1614.           If Temp9>1 Then
  1615.              Strng="and "+Strng
  1616.           Endif
  1617.        Endif
  1618.        Call IO.O
  1619.     Endif
  1620.     Graphics.Off=False
  1621.     Exit Sub
  1622.  Endif
  1623.  Call Num
  1624.  Temp4=0
  1625.  Prefix1="It's "
  1626.  Call Check.Room.Objects
  1627.  If Temp7=False Then
  1628.     Call Num
  1629.     Temp4=-1
  1630.     Prefix1="You are carrying "
  1631.     Call Check.Inventory.Objects
  1632.  Endif
  1633.  If Temp7 Then
  1634.     Graphics.Off=True
  1635.     Strng=Prefix1+Out3
  1636.     If ObjectRecord.DoorLock>1 Then
  1637.        Strng=Strng+" [locked]"
  1638.     Endif
  1639.     If ObjectRecord.DoorLock=1 Then
  1640.        If ObjectRecord.Closed Then
  1641.           Strng=Strng+" [closed]"
  1642.        Endif
  1643.     Endif
  1644.     If ObjectRecord.Invisible Then
  1645.        Strng=Strng+" [inv]"
  1646.     Endif
  1647.     Strng=Strng+"."
  1648.     Call IO.O
  1649.     If Last.Command.Number=Identify.Command Then
  1650.        If ObjectRecord.Keyed Then
  1651.           Strng="It requires key number "+_
  1652.           Right$(Str$(ObjectRecord.Keyed+100000!),4)+"."
  1653.           Call IO.O
  1654.        Endif
  1655.     Endif
  1656.     Strng=ObjectRecord.LongDesc
  1657.     Strng=Rtrim$(Strng)
  1658.     If Strng<>Nul Then
  1659.        Call IO.O
  1660.     Endif
  1661.     Graphics.Off=False
  1662.     Exit Sub
  1663.  Endif
  1664.  Call Num
  1665.  Call Check.Monster
  1666.  If Monster.Temp Then
  1667.     Graphics.Off=True
  1668.     Call The.Or.An
  1669.     Temp4=MonsterArray(Monster.Temp).Level
  1670.     Strng="It's "+Prefix1+Out3
  1671.     Strng=Strng+" (level"+Str$((Temp4-1)*2+1)+" to"+Str$(Temp4*2)+")"
  1672.     Call IO.O
  1673.     If Last.Command.Number=Identify.Command Then
  1674.        Strng="It has"+Str$(MonsterArray(Monster.Temp).Hits)+" hits and"+_
  1675.        Str$(MonsterArray(Monster.Temp).Experience)+" experience."
  1676.        Call IO.O
  1677.        Strng="It carries the following treasure:"
  1678.        Call IO.O
  1679.        Temp9=False
  1680.        For Temp4=1 To 5
  1681.           Temp2=MonsterArray(Monster.Temp).Treasure(Temp4)
  1682.           If Temp2>False And Temp2<=Lof(8)/Len(TreasureRecord) Then
  1683.              Carriage.Return=True
  1684.              Call IO.O
  1685.              Get 8,Temp2,TreasureRecord
  1686.              Out3=TreasureRecord.TreasureName
  1687.              Strng=Rtrim$(Out3)+", "
  1688.              Temp9=Temp9+1
  1689.              If Temp9=1 Then
  1690.                 Mid$(Strng,1,1)=Ucase$(Mid$(Strng,1,1))
  1691.              Endif
  1692.           Endif
  1693.        Next
  1694.        If Temp9=False Then
  1695.           Strng="Nothing at all."
  1696.        Else
  1697.           Strng=Left$(Strng,Len(Strng)-2)+"."
  1698.           If Temp9>1 Then
  1699.              Strng="and "+Strng
  1700.           Endif
  1701.        Endif
  1702.        Call IO.O
  1703.        Temp4=MonsterArray(Monster.Temp).Spell
  1704.        If Temp4>False And Temp4<=Spells.Max Then
  1705.           SpellRecord=SpellArray(Temp4)
  1706.           Strng="It can cast "+Rtrim$(SpellRecord.SpellName)+" spells!"
  1707.           Call IO.O
  1708.        Endif
  1709.        If MonsterArray(Monster.Temp).Poison Then
  1710.           Strng="It can poison!"
  1711.           Call IO.O
  1712.        Endif
  1713.        If MonsterArray(Monster.Temp).LevelDrain Then
  1714.           Strng="It can drain levels!"
  1715.           Call IO.O
  1716.        Endif
  1717.        If MonsterArray(Monster.Temp).Psionic Then
  1718.           Strng="It can cast psi spells!"
  1719.           Call IO.O
  1720.        Endif
  1721.     Endif
  1722.     Graphics.Off=False
  1723.     Exit Sub
  1724.  Endif
  1725.  Call Num
  1726.  Call Check.User
  1727.  If User.Temp Then
  1728.     Out2=UserArray(User.Temp).CodeName
  1729.     Call Decrypt(Out2)
  1730.     Out2=Rtrim$(Out2)
  1731.     Out2=Lcase$(Out2)
  1732.     Call He.She
  1733.     Graphics.Off=True
  1734.     Strng=Prefix1+"'s "+Out2+" (level"+Str$(UserArray(User.Temp).Level)+")"
  1735.     Call IO.O
  1736.     If Last.Command.Number=Identify.Command Then
  1737.        Strng=Prefix1+" has"+Str$(UserArray(User.Temp).Bank)+" hits and"+_
  1738.        Str$(UserArray(User.Temp).Experience)+" experience."
  1739.        Call IO.O
  1740.        If UserArray(User.Temp).Align1+UserArray(User.Temp).Align2<False Then
  1741.           Strng=Prefix1+" looks friendly."
  1742.        Else
  1743.           Strng=Prefix1+" looks hostile."
  1744.        Endif
  1745.        Call IO.O
  1746.        Strng=Prefix1+" carries the following treasure:"
  1747.        Call IO.O
  1748.        Temp9=False
  1749.        For Temp4=1 To 15
  1750.           Temp2=UserArray(User.Temp).Inv(Temp4)
  1751.           If Temp2 Then
  1752.              Carriage.Return=True
  1753.              Call IO.O
  1754.              Get 8,Temp2,TreasureRecord
  1755.              Out4=TreasureRecord.TreasureName
  1756.              Strng=Rtrim$(Out4)+", "
  1757.              Temp9=Temp9+1
  1758.              If Temp9=1 Then
  1759.                 Mid$(Strng,1,1)=Ucase$(Mid$(Strng,1,1))
  1760.              Endif
  1761.           Endif
  1762.        Next
  1763.        If Temp9=False Then
  1764.           Strng="Nothing at all."
  1765.        Else
  1766.           Strng=Left$(Strng,Len(Strng)-2)+"."
  1767.           If Temp9>1 Then
  1768.              Strng="and "+Strng
  1769.           Endif
  1770.        Endif
  1771.        Call IO.O
  1772.     Endif
  1773.     Graphics.Off=False
  1774.     Exit Sub
  1775.  Endif
  1776.  Strng="I can't examine that!"
  1777.  Call IO.O
  1778. 10311
  1779.  Exit Sub
  1780. 10312
  1781.  Resume 10311
  1782. End Sub
  1783.  
  1784. Sub Check.Next.Room
  1785.  On Local Error Goto 10322
  1786.  Do While Security.Guard
  1787.     If Room>False And Room<=Lof(5)/Len(RoomRecord) Then
  1788.        Get 5,Room,RoomRecord
  1789.        Exit Do
  1790.     Endif
  1791.     If Room>Lof(5)/Len(RoomRecord) Then
  1792.        If Not Normal.User Then
  1793.           Call Add.Room
  1794.           If TempC Then
  1795.              Exit Do
  1796.           Endif
  1797.        Endif
  1798.     Endif
  1799.     If Lof(5)/Len(RoomRecord)>Config2(15) Then
  1800.        Room=Config2(15)
  1801.        Graphics.Off=False
  1802.        Strng="Nondescriptive room number"+Str$(Room)+"!"
  1803.        Call IO.O
  1804.     Else
  1805.        Room=1
  1806.        Graphics.Off=False
  1807.        If Config2(16) Then
  1808.           Node=True
  1809.           Call Hang.Up(10)
  1810.           Exit Sub
  1811.        Endif
  1812.        Exit Sub
  1813.     Endif
  1814.  Loop
  1815. 10321
  1816.  Exit Sub
  1817. 10322
  1818.  Resume 10321
  1819. End Sub
  1820.  
  1821. Sub Display.Room
  1822.  On Local Error Goto 10332
  1823.  Call Check.Next.Room
  1824.  If Security.Guard=False Then
  1825.     Exit Sub
  1826.  Endif
  1827.  Room.Rust.Rate=False
  1828.  If RoomRecord.RustRate>False Then
  1829.     Room.Rust.Rate=RoomRecord.RustRate
  1830.  Endif
  1831.  Room.Steal.Rate=False
  1832.  If RoomRecord.StealRate>False Then
  1833.     Room.Steal.Rate=RoomRecord.StealRate
  1834.  Endif
  1835.  Room.Monster.Rate=Config2(11)
  1836.  If RoomRecord.EncounterRate Then
  1837.     Room.Monster.Rate=RoomRecord.EncounterRate
  1838.  Endif
  1839.  Room.Health.Rate=Config2(10)
  1840.  If RoomRecord.HealthRate Then
  1841.     Room.Health.Rate=RoomRecord.HealthRate
  1842.  Endif
  1843.  Call Show.Room
  1844.  Call Display.Offline.Users
  1845. 10331
  1846.  Exit Sub
  1847. 10332
  1848.  Resume 10331
  1849. End Sub
  1850.  
  1851. Sub Show.Room
  1852.  On Local Error Goto 10334
  1853.  Graphics.Off=True
  1854.  If UserRecord.Brief Or Rtrim$(RoomRecord.LongDesc(1))=Nul Then
  1855.     If Normal.User=False Or Config2(17) Then
  1856.        Strng="(room:"+Str$(Room)+", monclass:"
  1857.        Strng=Strng+Str$(RoomRecord.MonsterClass)+")."
  1858.        Call IO.O
  1859.     Endif
  1860.     Strng=RoomRecord.ShortDesc
  1861.     Strng=Rtrim$(Strng)
  1862.     If Instr(Strng,Chr$(0)) Then
  1863.        Strng=Left$(Strng,Instr(Strng,Chr$(0))-1)
  1864.     Endif
  1865.     Call IO.O
  1866.  Else
  1867.     For Temp2=1 To 4
  1868.        Strng=RoomRecord.LongDesc(Temp2)
  1869.        Strng=Rtrim$(Strng)
  1870.        If Instr(Strng,Chr$(0)) Then
  1871.           Strng=Left$(Strng,Instr(Strng,Chr$(0))-1)
  1872.        Endif
  1873.        If Strng=Nul Then
  1874.           Exit For
  1875.        Endif
  1876.        Call IO.O
  1877.     Next
  1878.  Endif
  1879.  Temp=False
  1880.  If Config2(18) Then
  1881.     If UserRecord.Brief Then
  1882.        Strng=Nul
  1883.     Else
  1884.        Strng="The exits are "
  1885.     Endif
  1886.     For Temp5=1 To 11
  1887.        If RoomRecord.Direct(Temp5) Then
  1888.           Strng=Strng+Rtrim$(Direction(Temp5))+", "
  1889.           Temp=True
  1890.        Endif
  1891.     Next
  1892.     If Temp Then
  1893.        Strng=Left$(Strng,Len(Strng)-2)+"."
  1894.        If UserRecord.Brief Then
  1895.           Mid$(Strng,1,1)=Ucase$(Mid$(Strng,1,1))
  1896.        Endif
  1897.        Call IO.O
  1898.     Endif
  1899.  Endif
  1900.  Temp1=False
  1901.  If Node>False Then
  1902.     Call Search.Mess(True)
  1903.     Strng=Nul
  1904.     For Temp5=1 To 36
  1905.        If Temp5<>(Noden+1) Then
  1906.           If Node.Work.Array1(Temp5)<>Nul Then
  1907.              TempX=True
  1908.              Get 1,Temp5,MessWorkRecord1
  1909.              If MessWorkRecord1.Invisible Then
  1910.                 If Normal.User Then
  1911.                    TempX=False
  1912.                 Endif
  1913.              Endif
  1914.              If TempX Then
  1915.                 Carriage.Return=True
  1916.                 Call IO.O
  1917.                 Temp1=Temp1+1
  1918.                 Strng=Node.Work.Array1(Temp5)
  1919.                 If MessWorkRecord1.Invisible Then
  1920.                    Strng=Strng+" [inv]"
  1921.                 Endif
  1922.                 Strng=Strng+", "
  1923.              Endif
  1924.           Endif
  1925.        Endif
  1926.     Next
  1927.     If Temp1 Then
  1928.        Strng=Left$(Strng,Len(Strng)-2)
  1929.     Endif
  1930.     If Temp1>1 Then
  1931.        Strng="and "+Strng+" are here!"
  1932.        Call IO.O
  1933.     Else
  1934.        If Temp1=1 Then
  1935.           Strng=Strng+" is here!"
  1936.           Call IO.O
  1937.        Endif
  1938.     Endif
  1939.  Endif
  1940.  If UserRecord.Brief=False Then
  1941.     Strng="You see "
  1942.     Carriage.Return=True
  1943.     Call IO.O
  1944.  Endif
  1945.  Strng=Nul
  1946.  Temp8=False
  1947.  Temp1=False
  1948.  If Config2(20) Then
  1949.     For Temp5=1 To 10
  1950.        Temp9=False
  1951.        Temp2=RoomRecord.Object(Temp5)
  1952.        If Temp2>False And Temp2<=Lof(6)/Len(ObjectRecord) Then
  1953.           Get 6,Temp2,ObjectRecord
  1954.           If ObjectRecord.Invisible Then
  1955.              If Normal.User Then
  1956.                 Temp9=True
  1957.              Endif
  1958.           Endif
  1959.           If ObjectRecord.Hidden Then
  1960.              If Normal.User Then
  1961.                 Temp9=True
  1962.              Endif
  1963.           Endif
  1964.           If Temp9=False Then
  1965.              Carriage.Return=True
  1966.              Call IO.O
  1967.              Temp1=Temp1+1
  1968.              If Temp1=1 Then
  1969.                 If UserRecord.Brief Then
  1970.                    Strng="You see "
  1971.                    Carriage.Return=True
  1972.                    Call IO.O
  1973.                 Endif
  1974.              Endif
  1975.              Strng=ObjectRecord.ObjectName
  1976.              Strng=Rtrim$(Strng)
  1977.              If ObjectRecord.DoorLock>1 Then
  1978.                 Strng=Strng+" [locked]"
  1979.              Else
  1980.                 If ObjectRecord.DoorLock Then
  1981.                    If ObjectRecord.Closed Then
  1982.                       Strng=Strng+" [closed]"
  1983.                    Endif
  1984.                 Endif
  1985.              Endif
  1986.              If ObjectRecord.Hidden Then
  1987.                 Strng=Strng+" [hidden]"
  1988.              Else
  1989.                 If ObjectRecord.Invisible Then
  1990.                    Strng=Strng+" [inv]"
  1991.                 Endif
  1992.              Endif
  1993.              Strng=Strng+", "
  1994.              Temp8=True
  1995.           Endif
  1996.        Endif
  1997.     Next
  1998.     For Temp5=1 To 10
  1999.        Temp9=False
  2000.        If RoomRecord.Flags(Temp5)>False Then
  2001.           If Normal.User Then
  2002.              Temp9=True
  2003.           Endif
  2004.        Endif
  2005.        If Temp9=False Then
  2006.           Temp2=RoomRecord.Treasure(Temp5)
  2007.           If Temp2>False And Temp2<=Lof(8)/Len(TreasureRecord) Then
  2008.              Get 8,Temp2,TreasureRecord
  2009.              If TreasureRecord.Invisible Then
  2010.                 If Normal.User Then
  2011.                    Temp9=True
  2012.                 Endif
  2013.              Endif
  2014.              If Temp9=False Then
  2015.                 Carriage.Return=True
  2016.                 Call IO.O
  2017.                 Temp1=Temp1+1
  2018.                 If Temp1=1 Then
  2019.                    If UserRecord.Brief Then
  2020.                       Strng="You see "
  2021.                       Carriage.Return=True
  2022.                       Call IO.O
  2023.                    Endif
  2024.                 Endif
  2025.                 Strng=TreasureRecord.TreasureName
  2026.                 Strng=Rtrim$(Strng)
  2027.                 If TreasureRecord.Locked>False Then
  2028.                    Strng=Strng+" [locked]"
  2029.                 Else
  2030.                    If TreasureRecord.Locked<False Then
  2031.                       If TreasureRecord.Closed>False Then
  2032.                          Strng=Strng+" [closed]"
  2033.                       Endif
  2034.                    Endif
  2035.                 Endif
  2036.                 If TreasureRecord.Invisible Then
  2037.                    Strng=Strng+" [inv]"
  2038.                 Else
  2039.                    If RoomRecord.Flags(Temp5)=Hidden.Object Then
  2040.                       Strng=Strng+" [inv]"
  2041.                    Endif
  2042.                 Endif
  2043.                 If RoomRecord.Flags(Temp5)=Magic.Trap Then
  2044.                    Strng=Strng+" [trap]"
  2045.                 Endif
  2046.                 Strng=Strng+", "
  2047.                 Temp8=True
  2048.              Endif
  2049.           Endif
  2050.        Endif
  2051.     Next
  2052.  Endif
  2053.  For Temp5=1 To Room.Treasure.Max
  2054.     Temp9=False
  2055.     Temp2=Room.Inventory(Temp5)
  2056.     If Temp2>False And Temp2<=Lof(8)/Len(TreasureRecord) Then
  2057.        Get 8,Temp2,TreasureRecord
  2058.        If TreasureRecord.Invisible Then
  2059.           If Normal.User Then
  2060.              Temp9=True
  2061.           Endif
  2062.        Endif
  2063.        If Temp9=False Then
  2064.           Carriage.Return=True
  2065.           Call IO.O
  2066.           Temp1=Temp1+1
  2067.           If Temp1=1 Then
  2068.              If UserRecord.Brief Then
  2069.                 Strng="You see "
  2070.                 Carriage.Return=True
  2071.                 Call IO.O
  2072.              Endif
  2073.           Endif
  2074.           Strng=TreasureRecord.TreasureName
  2075.           Strng=Rtrim$(Strng)
  2076.           If TreasureRecord.Locked>False Then
  2077.              Strng=Strng+" [locked]"
  2078.           Else
  2079.              If TreasureRecord.Locked<False Then
  2080.                 If TreasureRecord.Closed>False Then
  2081.                    Strng=Strng+" [closed]"
  2082.                 Endif
  2083.              Endif
  2084.           Endif
  2085.           If TreasureRecord.Invisible Then
  2086.              Strng=Strng+" [inv]"
  2087.           Endif
  2088.           Strng=Strng+", "
  2089.           Temp8=True
  2090.        Endif
  2091.     Endif
  2092.  Next
  2093.  If Config2(19) Then
  2094.     For Monster.Temp=1 To Number.Monsters
  2095.        Temp1=Temp1+1
  2096.        Carriage.Return=True
  2097.        Call IO.O
  2098.        If Temp1=1 And UserRecord.Brief Then
  2099.           Strng="You see "
  2100.           Carriage.Return=True
  2101.           Call IO.O
  2102.        Endif
  2103.        Out3=MonsterArray(Monster.Temp).MonsterName
  2104.        Out3=Rtrim$(Out3)
  2105.        Call The.Or.An
  2106.        Strng=Strng+Prefix1+Out3+", "
  2107.        Temp8=True
  2108.     Next
  2109.     For User.Temp=1 To Number.Users
  2110.        Temp1=Temp1+1
  2111.        Carriage.Return=True
  2112.        Call IO.O
  2113.        If Temp1=1 And UserRecord.Brief Then
  2114.           Strng="You see "
  2115.           Carriage.Return=True
  2116.           Call IO.O
  2117.        Endif
  2118.        Out3=UserArray(User.Temp).CodeName
  2119.        Call Decrypt(Out3)
  2120.        Out3=Rtrim$(Out3)
  2121.        Out3=Lcase$(Out3)
  2122.        Strng=Strng+Out3+", "
  2123.        Temp8=True
  2124.     Next
  2125.  Endif
  2126.  If Temp8=False Then
  2127.     If UserRecord.Brief=False Then
  2128.        Strng="nothing special."
  2129.     Else
  2130.        Strng="You see nothing."
  2131.     Endif
  2132.  Endif
  2133.  If Temp8 And Strng<>Nul Then
  2134.     Strng=Left$(Strng,Len(Strng)-2)+"."
  2135.     If Temp1>1 Then
  2136.        Strng="and "+Strng
  2137.     Endif
  2138.  Endif
  2139.  Call IO.O
  2140. 10333
  2141.  Exit Sub
  2142. 10334
  2143.  Resume 10333
  2144. End Sub
  2145.  
  2146. Sub Display.Offline.Users
  2147.  On Local Error Goto 10336
  2148.  If Config2(55) Then
  2149.     For Temp1=1 To 11
  2150.        Temp2=RoomRecord.Direct(Temp1)
  2151.        If Temp2>False And Temp2<>Room Then
  2152.           For Temp3=1 To Users.Max
  2153.              If Temp3<>User.Index Then
  2154.                 If Temp2=User.Array1(Temp3) Then
  2155.                    If User.Array3(Temp3)<9 Then
  2156.                       If User.Array2(Temp3)>False Then
  2157.                          Room.Temp=Room
  2158.                          Room=Temp2
  2159.                          Call In.Room(13)
  2160.                          Room=Room.Temp
  2161.                          If TempA=False Then
  2162.                             Call Search.Mess(Temp3)
  2163.                             If Temp=False Then
  2164.                                Strng="There is a player in a nearby room!"
  2165.                                Call IO.O
  2166.                                Exit Sub
  2167.                             Endif
  2168.                          Endif
  2169.                       Endif
  2170.                    Endif
  2171.                 Endif
  2172.              Endif
  2173.           Next
  2174.        Endif
  2175.     Next
  2176.  Endif
  2177. 10335
  2178.  Exit Sub
  2179. 10336
  2180.  Resume 10335
  2181. End Sub
  2182.  
  2183. Sub Display.Stats
  2184.  On Local Error Goto 10342
  2185.  Graphics.Off=True
  2186.  Strng=UserRecord.CodeName
  2187.  Call Decrypt(Strng)
  2188.  Strng=Rtrim$(Strng)
  2189.  Strng=Lcase$(Strng)
  2190.  Mid$(Strng,1,1)=Ucase$(Mid$(Strng,1,1))
  2191.  Strng="Information: "+Strng
  2192.  Call IO.O
  2193.  Call Show.Align
  2194.  Call Show.Health
  2195.  Call Display.Info
  2196.  Call Display.Inventory
  2197. 10341
  2198.  Exit Sub
  2199. 10342
  2200.  Resume 10341
  2201. End Sub
  2202.  
  2203. Sub Display.Inventory
  2204.  On Local Error Goto 10352
  2205.  Graphics.Off=True
  2206.  Strng="You are carrying"+Str$(Number.Inventory)+" items"+_
  2207.  " weighing"+Str$(Weight)+" pounds:"
  2208.  Call IO.O
  2209.  Temp9=False
  2210.  For Temp5=1 To Number.Inventory
  2211.     Temp2=Treasure(Temp5)
  2212.     If Temp2 Then
  2213.        Carriage.Return=True
  2214.        Call IO.O
  2215.        Get 8,Temp2,TreasureRecord
  2216.        Out3=TreasureRecord.TreasureName
  2217.        Out3=Rtrim$(Out3)
  2218.        If TreasureRecord.Invisible Then
  2219.           Out3=Out3+" [inv]"
  2220.        Endif
  2221.        Strng=Out3+", "
  2222.        Temp9=Temp9+1
  2223.        If Temp9=1 Then
  2224.           Mid$(Strng,1,1)=Ucase$(Mid$(Strng,1,1))
  2225.        Endif
  2226.     Endif
  2227.  Next
  2228.  If Normal.User=False Then
  2229.     For Temp5=1 To 5
  2230.        Temp2=UserRecord.Object(Temp5)
  2231.        If Temp2 Then
  2232.           Carriage.Return=True
  2233.           Call IO.O
  2234.           Get 6,Temp2,ObjectRecord
  2235.           Out3=ObjectRecord.ObjectName
  2236.           Out3=Rtrim$(Out3)
  2237.           Strng=Out3+", "
  2238.           Temp9=Temp9+1
  2239.        Endif
  2240.     Next
  2241.  Endif
  2242.  If Temp9=False Then
  2243.     Strng="Nothing at all."
  2244.  Else
  2245.     Strng=Left$(Strng,Len(Strng)-2)+"."
  2246.     If Temp9>1 Then
  2247.        Strng="and "+Strng
  2248.     Endif
  2249.  Endif
  2250.  Call IO.O
  2251.  Call Display.Experience
  2252. 10351
  2253.  Exit Sub
  2254. 10352
  2255.  Resume 10351
  2256. End Sub
  2257.  
  2258. Sub Display.Experience
  2259.  On Local Error Goto 10362
  2260.  Graphics.Off=True
  2261.  Strng="You have"+Str$(UserRecord.Gold)+" gold."
  2262.  Call IO.O
  2263.  Strng="You need"+Str$(UserRecord.Experience)
  2264.  Strng=Strng+" experience points to reach the next level."
  2265.  Call IO.O
  2266.  Call Gold(Temp#)
  2267.  Strng="You need"+Str$(Temp#)+" gold to train for the next level."
  2268.  Call IO.O
  2269. 10361
  2270.  Exit Sub
  2271. 10362
  2272.  Resume 10361
  2273. End Sub
  2274.  
  2275. Sub Display.Info
  2276.  On Local Error Goto 10372
  2277.  Graphics.Off=True
  2278.  If Sysop Then
  2279.     Strng="You are a Sysop!"
  2280.     Call IO.O
  2281.  Endif
  2282.  If Dungeon.Master Then
  2283.     Strng="You are a Dungeon Master!"
  2284.     Call IO.O
  2285.  Endif
  2286.  If Dungeon.Master.Assistant Then
  2287.     Strng="You are an Assistant Dungeon Master!"
  2288.     Call IO.O
  2289.  Endif
  2290.  If Town.Mayor Then
  2291.     Strng="You are the Town Mayor!"
  2292.     Call IO.O
  2293.  Endif
  2294.  If Governor Then
  2295.     Strng="You are the Governor!"
  2296.     Call IO.O
  2297.  Endif
  2298.  If Guild.Master Then
  2299.     Strng="You are the Guild Master!"
  2300.     Call IO.O
  2301.  Endif
  2302.  If UserRecord.Invisible Or Invisible Then
  2303.     Strng="You are invisible!"
  2304.     Call IO.O
  2305.  Endif
  2306.  If UserRecord.Poison Then
  2307.     Strng="You are poisoned!"
  2308.     Call IO.O
  2309.  Endif
  2310.  If Weapon7=False And Weapon1=False Then
  2311.     Strng="You are wearing nothing."
  2312.     Call IO.O
  2313.  Endif
  2314.  If Weapon2=False And Weapon3=False Then
  2315.     Strng="You are holding nothing."
  2316.     Call IO.O
  2317.  Endif
  2318.  If Weapon7 Then
  2319.     Get 8,Abs(Treasure(Weapon7)),TreasureRecord
  2320.     Strng="You are wearing "+TreasureRecord.TreasureName
  2321.     Call IO.O
  2322.  Endif
  2323.  If Weapon1 Then
  2324.     Get 8,Abs(Treasure(Weapon4)),TreasureRecord
  2325.     Strng="You are wearing "+TreasureRecord.TreasureName
  2326.     Call IO.O
  2327.  Endif
  2328.  Strng=Nul
  2329.  If Weapon2 Or Weapon3 Then
  2330.     Strng="You are holding "
  2331.     If Weapon2 Then
  2332.        Get 8,Abs(Treasure(Weapon6)),TreasureRecord
  2333.        Strng=Strng+Rtrim$(TreasureRecord.TreasureName)
  2334.     Endif
  2335.  Endif
  2336.  If Weapon3 Then
  2337.     Get 8,Abs(Treasure(Weapon5)),TreasureRecord
  2338.     If Weapon2 Then
  2339.        Strng=Strng+" and "+Rtrim$(TreasureRecord.TreasureName)+"."
  2340.        Call IO.O
  2341.     Else
  2342.        Strng="You are holding "+Rtrim$(TreasureRecord.TreasureName)+"."
  2343.        Call IO.O
  2344.     Endif
  2345.  Else
  2346.     If Weapon2 Then
  2347.        Strng=Strng+"."
  2348.        Call IO.O
  2349.     Endif
  2350.  Endif
  2351. 10371
  2352.  Exit Sub
  2353. 10372
  2354.  Resume 10371
  2355. End Sub
  2356.  
  2357. Sub Display.Health
  2358.  On Local Error Goto 10382
  2359.  Graphics.Off=True
  2360.  Call Show.Align
  2361.  Call Show.Health
  2362. 10381
  2363.  Exit Sub
  2364. 10382
  2365.  Resume 10381
  2366. End Sub
  2367.  
  2368. Sub Show.Health
  2369.  On Local Error Goto 10392
  2370.  Graphics.Off=True
  2371.  Strng="Vitals: "+Mid$(Str$(UserRecord.Fatigue),2)+"/"+_
  2372.  Mid$(Str$(UserRecord.FatigueMax),2)
  2373.  If Weapon3 Or Weapon1 Then
  2374.     Strng=Strng+"(+"+Mid$(Str$(Weapon3+Weapon1),2)+")"
  2375.  Endif
  2376.  Strng=Strng+" Fat "+Str$(UserRecord.Vitality)+"/"+_
  2377.  Mid$(Str$(UserRecord.VitalityMax),2)+_
  2378.  " Vit "+Str$(UserRecord.Magic)+"/"+_
  2379.  Mid$(Str$(UserRecord.MagicMax),2)+_
  2380.  " Mag "+Str$(UserRecord.Psionic)+"/"+_
  2381.  Mid$(Str$(UserRecord.PsionicMax),2)+" Psi"
  2382.  Call IO.O
  2383.  Strng="Stats: "
  2384.  For Temp5=1 To 7
  2385.     Strng=Strng+Left$(Stat(Temp5),3)+Str$(UserRecord.Stats(Temp5))
  2386.     If Temp5=1 Then
  2387.        If Weapon2 Then
  2388.           Strng=Strng+"(+"+Mid$(Str$(Weapon2),2)+")"
  2389.        Endif
  2390.     Endif
  2391.     Strng=Strng+" "
  2392.  Next
  2393.  Call IO.O
  2394.  Strng="Weapons: "
  2395.  For Temp2=1 To 4
  2396.     Strng=Strng+Rtrim$(Weapon.Type.Name(Temp2))+">"+_
  2397.     Str$(UserRecord.Weapons(Temp2))+"% "
  2398.  Next
  2399.  Call IO.O
  2400. 10391
  2401.  Exit Sub
  2402. 10392
  2403.  Resume 10391
  2404. End Sub
  2405.  
  2406. Sub Show.Align
  2407.  On Local Error Goto 10402
  2408.  Graphics.Off=True
  2409.  If UserRecord.Level<=False Then
  2410.     Strng="You are dead!"
  2411.     Call IO.O
  2412.     Exit Sub
  2413.  Endif
  2414.  Strng="You are a level"
  2415.  If UserRecord.Level>10 Then
  2416.     Strng=Strng+Str$(UserRecord.Level)
  2417.  Else
  2418.     Strng=Strng+" "+Rtrim$(Numeral(UserRecord.Level))
  2419.  Endif
  2420.  If UserRecord.Race<=False Then
  2421.     UserRecord.Race=1
  2422.  Endif
  2423.  Strng=Strng+" "+Rtrim$(Race(UserRecord.Race))+" "
  2424.  Out2=UserRecord.ClassName
  2425.  Call Decrypt(Out2)
  2426.  Strng=Strng+Out2
  2427.  Call IO.O
  2428.  Strng="You are aligned "+_
  2429.  Rtrim$(Alignment.Name1(UserRecord.Align1+2))+" "+_
  2430.  Rtrim$(Alignment.Name2(UserRecord.Align2+2))+"."
  2431.  Call IO.O
  2432. 10401
  2433.  Exit Sub
  2434. 10402
  2435.  Resume 10401
  2436. End Sub
  2437.  
  2438. Sub Display.Memory
  2439.  On Local Error Goto 10412
  2440.  Graphics.Off=True
  2441.  Strng="Free Dynamic Data and Array Space(Heap in Bytes):"+Str$(Fre(-1))+"."
  2442.  Call IO.O
  2443.  Strng="Free Data Segment and String Space(Bytes):"+Str$(Fre(TempX$))+"."
  2444.  Call IO.O
  2445.  Strng="Free Stack Space(Bytes):"+Str$(Fre(-2))+"."
  2446.  Call IO.O
  2447.  Strng="Total Available Memory(K):"
  2448.  Var1=Int((Fre(TempX$)+Fre(-1)+Fre(-2))/1024)
  2449.  Strng=Strng+Str$(Var1)+"."
  2450.  Call IO.O
  2451. 10411
  2452.  Exit Sub
  2453. 10412
  2454.  Resume 10411
  2455. End Sub
  2456.  
  2457. Sub Identify
  2458.  On Local Error Goto 10422
  2459.  If UserRecord.Level<Config2(59) Then
  2460.     Strng="You are not high enough level!"
  2461.     Call IO.O
  2462.     Exit Sub
  2463.  Endif
  2464.  Call Display.Information
  2465. 10421
  2466.  Exit Sub
  2467. 10422
  2468.  Resume 10421
  2469. End Sub
  2470.  
  2471. Sub Status.Line(Var)
  2472.  On Local Error Goto 10432
  2473.  Static Statusline.Mode
  2474.  If Var=-1 Then
  2475.     If Security.Guard=False Then
  2476.        Exit Sub
  2477.     Endif
  2478.     If Logged.In=False Then
  2479.        Exit Sub
  2480.     Endif
  2481.     If Local.Mode Then
  2482.        Exit Sub
  2483.     Endif
  2484.  Endif
  2485.  If Var=-2 Then
  2486.     For Temp5=1 To 10
  2487.        Key Temp5,Nul
  2488.     Next
  2489.     Call Local.ANSI(1,37,15)
  2490.     Var$=TempD$+Space$(79)
  2491.     If Config2(47) Then
  2492.        If Len(Door.Name) Then
  2493.           Call Local.ANSI(2,24,1)
  2494.           Temp$=TempD$+Var$
  2495.           Call Display.Status.Line
  2496.        Endif
  2497.     Endif
  2498.     Call Local.ANSI(2,25,1)
  2499.     Temp$=TempD$+Var$
  2500.     Call Display.Status.Line
  2501.     If Graphics.Status Then
  2502.        If Local.Mode=False Then
  2503.           Call Display.Status.Line2
  2504.        Endif
  2505.     Endif
  2506.     Exit Sub
  2507.  Endif
  2508.  If Var=-1 Then
  2509.     Statusline.Mode=Not Statusline.Mode
  2510.  Endif
  2511.  If Var>0 Then
  2512.     Statusline.Mode=False
  2513.     If Local.Mode Then
  2514.        If Normal.User=False Then
  2515.           Statusline.Mode=True
  2516.        Endif
  2517.     Endif
  2518.     If Config2(47) Then
  2519.        If Len(Door.Name) Then
  2520.           Call Door.Status.Line
  2521.        Endif
  2522.     Endif
  2523.  Endif
  2524.  If Var=0 Then
  2525.     If Graphics.Status Then
  2526.        If Local.Mode=False Then
  2527.           Call Make.Status.Line(VarZ)
  2528.           If VarZ Then
  2529.              Call Display.Status.Line2
  2530.           Endif
  2531.        Endif
  2532.     Endif
  2533.  Endif
  2534.  If Statusline.Mode=False Then
  2535.     Call Make.Status.Line(VarZ)
  2536.     If VarZ Then
  2537.        Call Display.Status.Line
  2538.     Endif
  2539.  Else
  2540.     If Var<>0 Then
  2541.        Call Sysop.Status.Line
  2542.     Endif
  2543.  Endif
  2544. 10431
  2545.  Exit Sub
  2546. 10432
  2547.  Resume 10431
  2548. End Sub
  2549.  
  2550. Sub Make.Status.Line(VarY)
  2551.  On Local Error Goto 10442
  2552.  VarY=False
  2553.  Temp$=UserRecord.CodeName
  2554.  Call Decrypt(Temp$)
  2555.  Temp$=Lcase$(Temp$)
  2556.  If Left$(Temp$,9)=Deleted$ Then
  2557.     Exit Sub
  2558.  Endif
  2559.  VarY=True
  2560.  Mid$(Temp$,1,1)=Ucase$(Mid$(Temp$,1,1))
  2561.  If UserRecord.ClassType=2 Then
  2562.     Temp2$="MU"
  2563.  Else
  2564.     Temp2$=Left$(Class.Name(UserRecord.ClassType),8)
  2565.  Endif
  2566.  If Dungeon.Master.Assistant Then
  2567.     Temp2$="ADM"
  2568.  Endif
  2569.  If Dungeon.Master Then
  2570.     Temp2$="DM"
  2571.  Endif
  2572.  If Sysop Then
  2573.     Temp2$="SYS"
  2574.  Endif
  2575.  Temp$=Temp$+" "+Temp2$
  2576.  Temp$=Left$(Temp$,39)
  2577.  Temp$=Temp$+Space$(39-Len(Temp$))
  2578.  TempX=UserRecord.Fatigue
  2579.  If TempX<False Then
  2580.     TempX=False
  2581.  Endif
  2582.  Temp$=Temp$+" Fat:"+Mid$(Str$(TempX),2)
  2583.  TempX=UserRecord.Vitality
  2584.  If TempX<False Then
  2585.     TempX=False
  2586.  Endif
  2587.  Temp$=Temp$+" Vit:"+Mid$(Str$(TempX),2)
  2588.  TempX=UserRecord.Magic
  2589.  If TempX<False Then
  2590.     TempX=False
  2591.  Endif
  2592.  Temp$=Temp$+" Mag:"+Mid$(Str$(TempX),2)
  2593.  TempX=UserRecord.Psionic
  2594.  If TempX<False Then
  2595.     TempX=False
  2596.  Endif
  2597.  Temp$=Temp$+" Psi:"+Mid$(Str$(TempX),2)
  2598.  TempX=UserRecord.Level
  2599.  If TempX<False Then
  2600.     TempX=False
  2601.  Endif
  2602.  Temp2$=" Lvl:"+Mid$(Str$(TempX),2)
  2603.  If Len(Temp$)+Len(Temp2$)<=79 Then
  2604.     Temp$=Temp$+Temp2$
  2605.  Endif
  2606.  TempX=Room
  2607.  If TempX<False Then
  2608.     TempX=False
  2609.  Endif
  2610.  Temp2$=" Rm:"+Mid$(Str$(TempX),2)
  2611.  If Len(Temp$)+Len(Temp2$)<=79 Then
  2612.     Temp$=Temp$+Temp2$
  2613.  Endif
  2614.  Temp$=Left$(Temp$,79)
  2615.  Temp$=Temp$+Space$(79-Len(Temp$))
  2616.  Call Local.ANSI(2,25,1)
  2617.  Temp$=TempD$+Temp$
  2618. 10441
  2619.  Exit Sub
  2620. 10442
  2621.  Resume 10441
  2622. End Sub
  2623.  
  2624. Sub Sysop.Status.Line
  2625.  On Local Error Goto 10452
  2626.  For Temp5=1 To 10
  2627.     Key Temp5,Nul
  2628.  Next
  2629.  If Local.Mode And Normal.User=False Then
  2630.     Key 1,Config3(9)+"EDIT"+Chr$(13)
  2631.     Key 2,Config3(9)+"STA"+Chr$(13)
  2632.     Key 3,Config3(9)+"DIS "
  2633.     Key 4,Config3(9)+"REDU "
  2634.     Key 5,Config3(9)+"CALL"
  2635.     Key 6,Config3(9)+"KILL "
  2636.     Key 7,Config3(9)+"TELE "
  2637.     Key 8,Config3(9)+"INV"+Chr$(13)
  2638.     Key 9,Config3(9)+"GET "
  2639.     Key 10,Config3(9)+"LINK"+Chr$(13)
  2640.  Endif
  2641.  Call Cursor(False)
  2642.  Call Screen.ANSI(4,37,15)
  2643.  For Temp5=1 To 10
  2644.     Call Screen.ANSI(2,25,Temp5*8-7)
  2645.     TempA$="F"+Right$(Str$(Temp5+10),1)
  2646.     Call Put.Screen(TempA$)
  2647.  Next
  2648.  Call Screen.ANSI(1,7,112)
  2649.  For Temp5=1 To 10
  2650.     Select Case Temp5
  2651.     Case 1
  2652.        TempA$="EDIT"
  2653.     Case 2
  2654.        TempA$="STA"
  2655.     Case 3
  2656.        TempA$="DIS"
  2657.     Case 4
  2658.        TempA$="REDU"
  2659.     Case 5
  2660.        TempA$="CALL"
  2661.     Case 6
  2662.        TempA$="KILL"
  2663.     Case 7
  2664.        TempA$="TELE"
  2665.     Case 8
  2666.        TempA$="INV"
  2667.     Case 9
  2668.        TempA$="GET"
  2669.     Case 10
  2670.        TempA$="LINK"
  2671.     End Select
  2672.     Call Screen.ANSI(2,25,Temp5*8-5)
  2673.     TempA$=Config3(9)+TempA$
  2674.     TempA$=Left$(TempA$,6)
  2675.     TempA$=TempA$+Space$(6-Len(TempA$))
  2676.     If Temp5=10 Then
  2677.        TempA$=Left$(TempA$,5)
  2678.     Endif
  2679.     Call Put.Screen(TempA$)
  2680.  Next
  2681.  Call Cursor(True)
  2682.  Call Restore.Color
  2683. 10451
  2684.  Exit Sub
  2685. 10452
  2686.  Resume 10451
  2687. End Sub
  2688.  
  2689. Sub Display.Status.Line
  2690.  On Local Error Goto 10462
  2691.  Call Cursor(False)
  2692.  Call Screen.ANSI(1,7,112)
  2693.  Call Put.Screen(Temp$)
  2694.  Call Cursor(True)
  2695.  Call Restore.Color
  2696. 10461
  2697.  Exit Sub
  2698. 10462
  2699.  Resume 10461
  2700. End Sub
  2701.  
  2702. Sub Display.Status.Line2
  2703.  On Local Error Goto 10472
  2704.  Var$=Chr$(27)+"[s"
  2705.  Call Put.Modem(Var$)
  2706.  Call Modem.ANSI(1,37,15)
  2707.  Call Put.Modem(Temp$)
  2708.  Var$=Chr$(27)+"[u"
  2709.  Call Put.Modem(Var$)
  2710. 10471
  2711.  Exit Sub
  2712. 10472
  2713.  Resume 10471
  2714. End Sub
  2715.  
  2716. Sub Door.Status.Line
  2717.  On Local Error Goto 10482
  2718.  Call Cursor(False)
  2719.  Call Screen.ANSI(1,7,112)
  2720.  Call Screen.ANSI(2,24,1)
  2721.  Temp2$=Left$(BBS.Name,19)
  2722.  Temp2$=Temp2$+Space$(19-Len(Temp2$))
  2723.  Temp3$=Left$(Door.Name,30)
  2724.  Temp3$=Temp3$+Space$(30-Len(Temp3$))
  2725.  Temp4$=" Time on: "+Time.On
  2726.  Temp$="BBS: "+Temp2$+" Name: "+Temp3$+Temp4$
  2727.  Temp$=Left$(Temp$,79)
  2728.  Temp$=Temp$+Space$(79-Len(Temp$))
  2729.  Call Put.Screen(Temp$)
  2730.  Call Cursor(True)
  2731.  Call Restore.Color
  2732. 10481
  2733.  Exit Sub
  2734. 10482
  2735.  Resume 10481
  2736. End Sub
  2737.  
  2738. Sub Restore.Color
  2739.  On Local Error Goto 10492
  2740.  Call Screen.ANSI(1,37,15)
  2741.  If Color.Graphics Then
  2742.     If Graphics.Off Then
  2743.        Call Screen.ANSI(4,37,15)
  2744.     Else
  2745.        Call Screen.ANSI(4,Color.Code,Avatar.Code)
  2746.     Endif
  2747.  Endif
  2748. 10491
  2749.  Exit Sub
  2750. 10492
  2751.  Resume 10491
  2752. End Sub
  2753.  
  2754. Sub Time.Online 
  2755.  On Local Error Goto 10502
  2756.  Graphics.Off=True
  2757.  Strng="It is now "+FNclock$+"."
  2758.  Call IO.O
  2759.  OnTime#=TimeValue#(Time$)-TimeValue#(Time.On)
  2760.  If OnTime#<False Then
  2761.     OnTime#=OnTime#+TimeValue#("12:00:00")*2
  2762.  Endif
  2763.  Strng="You have been on for"
  2764.  Strng2="."
  2765.  Gosub Time.Display
  2766.  Hours=Int(Time.Left/3600!)
  2767.  Temp.Time=Time.Left-Hours*3600!
  2768.  Minutes=Int(Temp.Time/60!)
  2769.  Seconds=Temp.Time-Minutes*60!
  2770.  OnTime#=TimeSerial#(Hours,Minutes,Seconds)-OnTime#
  2771.  Strng="You have"
  2772.  Strng2=" remaining."
  2773.  Gosub Time.Display
  2774.  Exit Sub
  2775.  
  2776. Time.Display:
  2777.  If Hour&(OnTime#)>0 Then
  2778.     Strng=Strng+Str$(Hour&(OnTime#))+" hours,"
  2779.  Endif
  2780.  If Minute&(OnTime#)>0 Then
  2781.     Strng=Strng+Str$(Minute&(OnTime#))+" minutes,"
  2782.  Endif
  2783.  If Second&(OnTime#)>0 Then
  2784.     Strng=Strng+Str$(Second&(OnTime#))+" seconds"
  2785.  Endif
  2786.  Strng=Strng+Strng2
  2787.  Call IO.O
  2788.  Return
  2789. 10501
  2790.  Exit Sub
  2791. 10502
  2792.  Resume 10501
  2793. End Sub
  2794.  
  2795. Sub Whisper
  2796.  On Local Error Goto 10512
  2797.  Call Parse
  2798.  If Parser=False Then
  2799.     Strng="Whisper what?"
  2800.     Call IO.O
  2801.     Exit Sub
  2802.  Endif
  2803.  Call Search.Mess(False)
  2804.  If Temp<>Room Then
  2805.     Strng="That user is not in this room!"
  2806.     Call IO.O
  2807.     Exit Sub
  2808.  Endif
  2809.  Call Send.Mess(7,TempB,Room,Parsed.Command2)
  2810. 10511
  2811.  Exit Sub
  2812. 10512
  2813.  Resume 10511
  2814. End Sub
  2815.  
  2816. Sub Send.Message
  2817.  On Local Error Goto 10522
  2818.  Call Parse
  2819.  If Parser Then
  2820.     Call Search.Mess(False)
  2821.     If Temp>False Then
  2822.        Call Send.Mess(6,TempB,False,Parsed.Command2)
  2823.        Exit Sub
  2824.     Endif
  2825.  Endif
  2826.  Call Send.Mess(1,False,False,Stored.Parsed.Command1)
  2827. 10521
  2828.  Exit Sub
  2829. 10522
  2830.  Resume 10521
  2831. End Sub
  2832.  
  2833. Sub Weapon.List
  2834.  On Local Error Goto 10532
  2835.  If Config2(50)=False Then
  2836.     Call In.Room(11)
  2837.     If TempA=False Then
  2838.        Strng="Find the Weapons Shoppe."
  2839.        Call IO.O
  2840.        Exit Sub
  2841.     Endif
  2842.  Endif
  2843.  Strng="The Blacksmith says: Here's a list of my inventory."
  2844.  Call IO.O
  2845.  Graphics.Off=True
  2846.  Strng="To purchase, type 'buy #', for example: Buy 12."
  2847.  Call IO.O
  2848.  Out3=Mask$+Mask$+Mask$+"  Weapon.                 Wgt.   Gold.  +"
  2849.  Strng=Out3
  2850.  Call IO.O
  2851.  Temp8=3
  2852.  Temp5=False
  2853.  Var$=Config3(74)
  2854.  Allow.Break=True
  2855.  Do
  2856.     If Instr(Var$,",") Then
  2857.        Var=Val(Left$(Var$,Instr(Var$,",")-1))
  2858.        Var$=Mid$(Var$,Instr(Var$,",")+1)
  2859.     Else
  2860.        Var=Val(Var$)
  2861.        Var$=Nul
  2862.     Endif
  2863.     If Var>False And Var<=Lof(8)/Len(TreasureRecord) Then
  2864.        Temp5=Temp5+1
  2865.        Temp8=Temp8+1
  2866.        Get 8,Var,TreasureRecord
  2867.        Temp1=TreasureRecord.Weight
  2868.        Temp2=TreasureRecord.Gold
  2869.        Temp$=Left$(TreasureRecord.TreasureName,20)
  2870.        Mid$(Temp$,1,1)=Ucase$(Mid$(Temp$,1,1))
  2871.        Strng=Mid$(Str$(Temp5),2)+Space$(6-Len(Str$(Temp5)))+_
  2872.        Temp$+Space$(8-Len(Str$(Temp1)))+Str$(Temp1)+_
  2873.        Space$(8-Len(Str$(Temp2)))+Str$(Temp2)
  2874.        If TreasureRecord.Spell Then
  2875.           SpellRecord=SpellArray(TreasureRecord.Spell)
  2876.           Strng=Strng+" "+Str$(SpellRecord.Level)
  2877.        Else
  2878.           If TreasureRecord.Plus Then
  2879.              Strng=Strng+" "+Str$(Abs(TreasureRecord.Plus))
  2880.           Endif
  2881.        Endif
  2882.        Call IO.O
  2883.        If Break Then
  2884.           Exit Do
  2885.        Endif
  2886.        If Var$=Nul Then
  2887.           Exit Do
  2888.        Endif
  2889.        If Temp8=23 Then
  2890.           Temp8=False
  2891.           Call More.Prompt
  2892.           If No Then
  2893.              Exit Do
  2894.           Endif
  2895.        Endif
  2896.     Endif
  2897.  Loop
  2898. 10531
  2899.  Allow.Break=False
  2900.  Exit Sub
  2901. 10532
  2902.  Resume 10531
  2903. End Sub
  2904.  
  2905. Sub Change.PassWord
  2906.  On Local Error Goto 10542
  2907.  Graphics.Off=True
  2908.  Strng="Change your password(y/n)?"
  2909.  No.Input.Out="N"
  2910.  Call IO.I
  2911.  If No Then
  2912.     Strng="Password not changed."
  2913.     Call IO.O
  2914.     Exit Sub
  2915.  Endif
  2916.  If Yes Then
  2917.     Strng="Type in old password for verification:"
  2918.     Line.Length=20
  2919.     Hide=True
  2920.     Call IO.I
  2921.     Hide=False
  2922.     Out2=Ltrim$(Out2)
  2923.     Out2=Rtrim$(Out2)
  2924.     Out2=Ucase$(Out2)
  2925.     Strng=UserRecord.PassWord
  2926.     Call Decrypt(Strng)
  2927.     If Strng=Nul Then
  2928.        Strng="This password has a checksum error."
  2929.        Call IO.O
  2930.        Exit Sub
  2931.     Endif
  2932.     Strng=Rtrim$(Strng)
  2933.     If Strng<>Out2 Then
  2934.        Strng="Passwords don't match!"
  2935.        Call IO.O
  2936.        Exit Sub
  2937.     Endif
  2938.     Strng="Type in new password(20 char. max.)"
  2939.     Call IO.O
  2940.     Line.Length=20
  2941.     Strng="?"
  2942.     Hide=True
  2943.     Call IO.I
  2944.     Hide=False
  2945.     If No.Input Then
  2946.        Strng="Password not changed."
  2947.        Call IO.O
  2948.        Exit Sub
  2949.     Endif
  2950.     Out2=Ltrim$(Out2)
  2951.     Out2=Rtrim$(Out2)
  2952.     Out2=Ucase$(Out2)
  2953.     Call Valid(Out2,20)
  2954.     If Out2=Nul Then
  2955.        Strng="Illegal characters in password."
  2956.     Else
  2957.        Call Encrypt(Out2,False)
  2958.        UserRecord.PassWord=Out2
  2959.        Strng="Password changed."
  2960.     Endif
  2961.     Call IO.O
  2962.  Endif
  2963. 10541
  2964.  Exit Sub
  2965. 10542
  2966.  Resume 10541
  2967. End Sub
  2968.  
  2969. Sub Align
  2970.  On Local Error Goto 10552
  2971.  If Normal.User Then
  2972.     If UserRecord.Flags And Alignmented Then
  2973.        Strng="You've already changed alignment once!"
  2974.        Call IO.O
  2975.        Exit Sub
  2976.     Endif
  2977.  Endif
  2978.  Strng="Change alignment(y/n)?"
  2979.  No.Input.Out="Y"
  2980.  Call IO.I
  2981.  If Yes Then
  2982.     UserRecord.Flags=UserRecord.Flags Or Alignmented
  2983.     Call Modify.Alignment
  2984.     Strng="Alignment is now "
  2985.     Strng=Strng+Rtrim$(Alignment.Name1(UserRecord.Align1+2))+" "
  2986.     Strng=Strng+Rtrim$(Alignment.Name2(UserRecord.Align2+2))
  2987.     Call IO.O
  2988.  Endif
  2989. 10551
  2990.  Exit Sub
  2991. 10552
  2992.  Resume 10551
  2993. End Sub
  2994.  
  2995. Sub Reroll.Character
  2996.  On Local Error Goto 10562
  2997.  If Normal.User Then
  2998.     If UserRecord.Flags And Rerolled Then
  2999.        Strng="You've already re-rolled your character!"
  3000.        Call IO.O
  3001.        Exit Sub
  3002.     Endif
  3003.  Endif
  3004.  Strng="Re-roll character(y/n)?"
  3005.  No.Input.Out="Y"
  3006.  Call IO.I
  3007.  If Yes Then
  3008.     UserRecord.Flags=UserRecord.Flags Or Rerolled
  3009.     Do While Security.Guard
  3010.        Strng="Character re-roll:"
  3011.        Call IO.O
  3012.        Strng="Change class type/name(y/n)?"
  3013.        No.Input.Out="Y"
  3014.        Call IO.I
  3015.        If Yes Then
  3016.           Call Modify.Class
  3017.        Endif
  3018.        Strng="Character re-roll:"
  3019.        Call IO.O
  3020.        Strng="Change vital statistics(y/n)?"
  3021.        No.Input.Out="Y"
  3022.        Call IO.I
  3023.        If Yes Then
  3024.           Call Modify.Stats
  3025.        Endif
  3026.        Strng="Character re-roll:"
  3027.        Call IO.O
  3028.        Strng="Change character race type/name(y/n)?"
  3029.        No.Input.Out="Y"
  3030.        Call IO.I
  3031.        If Yes Then
  3032.           Call Modify.Race
  3033.        Endif
  3034.        Strng="Character re-roll:"
  3035.        Call IO.O
  3036.        Strng="Change weapon proficiency(y/n)?"
  3037.        No.Input.Out="Y"
  3038.        Call IO.I
  3039.        If Yes Then
  3040.           Call Modify.Proficiency
  3041.        Endif
  3042.        Strng="Character re-roll:"
  3043.        Call IO.O
  3044.        Strng="Change character alignment(y/n)?"
  3045.        No.Input.Out="Y"
  3046.        Call IO.I
  3047.        If Yes Then
  3048.           Call Modify.Alignment
  3049.        Endif
  3050.        Do While Security.Guard
  3051.           Strng="All changes finished(y/n)?"
  3052.           No.Input.Out="Y"
  3053.           Call IO.I
  3054.           If Yes Then
  3055.              Exit Sub
  3056.           Endif
  3057.           If No Then
  3058.              Exit Do
  3059.           Endif
  3060.        Loop
  3061.     Loop
  3062.  Endif
  3063. 10561
  3064.  Exit Sub
  3065. 10562
  3066.  Resume 10561
  3067. End Sub
  3068.