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 / DNDSUB1.BAS < prev    next >
BASIC Source File  |  1993-01-07  |  77KB  |  3,270 lines

  1.  Rem dndsub1.bas v2.9c
  2.  Rem $Include: 'dndbbs.inc'
  3.  
  4. Sub Open.Modem
  5.  On Local Error Goto 10015
  6.  Connect=False
  7.  Logged.In=False
  8.  Lost.Carrier=False
  9.  Max.Row=23
  10.  Show.Screen=True
  11.  Call Get.Command
  12. 10011
  13.  BBS.Name=Nul
  14.  Door.Name=Nul
  15.  If Config2(47) And Local.Mode=False Then
  16.     If Bypass.Screen=False Then
  17.        Call Opening.Screen
  18.        Call Display.Time
  19.        Show.Screen=False
  20.     Endif
  21.     Data.Error=False
  22.     Close 13
  23.     Open Door.FileName For Input Shared As #13
  24.     Temp1=False
  25.     Do Until Eof(13)
  26.        Line Input #13,Out2
  27.        Out2=Ucase$(Out2)
  28.        Temp1=Temp1+1
  29.        If Temp1=1 Then
  30.           BBS.Name=Out2
  31.        Endif
  32.        If Temp1=4 Then
  33.           If Val(Mid$(Out2,4))=False Then
  34.              Local.Mode=True
  35.           Endif
  36.        Endif
  37.        If Temp1=5 Then
  38.           Modem.Baud=Int(Val(Out2)/100)
  39.        Endif
  40.        If Temp1=7 Then
  41.           Door.Name=Out2
  42.           If Left$(Out2,5)="SYSOP" Then
  43.              Local.Mode=True
  44.           Endif
  45.        Endif
  46.        If Temp1=8 Then
  47.           If Len(Out2) Then
  48.              Door.Name=Door.Name+" "+Out2
  49.           Endif
  50.        Endif
  51.        If Temp1=12 Then
  52.           Door.Time=Val(Out2)*60!
  53.        Endif
  54.     Loop
  55.     If Len(Door.Name) Then
  56.        Max.Row=22
  57.     Endif
  58.     Connect=True
  59.  Endif
  60. 10012
  61.  If Config2(47) Then
  62.     If Local.Mode Then
  63.        If Bypass.Screen=False Then
  64.           If Show.Screen Then
  65.              Call Opening.Screen
  66.              Call Display.Time
  67.           Endif
  68.           Strng="Local DOOR"
  69.           Call Modem.Status
  70.        Endif
  71.        Call Clear.Screen
  72.        Exit Sub
  73.     Endif
  74.     If Connect=False Or Data.Error Then
  75.        Strng="DOOR file missing"
  76.        Call Error.Message
  77.     Endif
  78.     Call Driver(5)
  79.     If (Outregs.AX And &H80)=False Then
  80.        Strng="DOOR carrier lost"
  81.        Call Error.Message
  82.     Endif
  83.     Strng="DOOR connect"+Str$(Modem.Baud)+"00"
  84.     Call Modem.Status
  85.     Call Driver(4)
  86.     Call Driver(13)
  87.     Call Clear.Screen
  88.     If Config2(45)=False And Modem.Baud=3 Then
  89.        Strng="300 baud access not allowed!"
  90.        Call IO.O
  91.        Strng="300 baud access"
  92.        Call Error.Message
  93.     Endif
  94.     Exit Sub
  95.  Endif
  96. 10013
  97.  If Bypass.Screen Or Bypass.Login Then
  98.     Timeon=Timer
  99.     Time.Left=3600
  100.     Two.Minutes.Left=False
  101.     Color.Graphics=True
  102.     Local.Mode=True
  103.     Call Clear.Screen
  104.     Exit Sub
  105.  Endif
  106.  Recycle=True
  107.  Do While Recycle
  108.     Blank.Menu=True
  109.     Menu.Timer=False
  110.     Blank.Screen=False
  111.     Screen.Timer=False
  112.     Connect=False
  113.     Time.Out!=False
  114.     Call Opening.Screen
  115.     Call Recycle.Modem
  116.     Do Until Connect
  117.        If Local.Mode=False Then
  118.           Call Read.Modem
  119.           If Instr(Out2,"RING") Then
  120.              Time.Out!=Timer+Config2(60)
  121.              Out2=Nul
  122.              Strng="Ring"
  123.              Call Modem.Status
  124.           Endif
  125.           If Instr(Out2,"CONNECT 300") Then
  126.              Modem.Baud=3
  127.              Connect=True
  128.           Endif
  129.           If Instr(Out2,"CONNECT 600") Then
  130.              Modem.Baud=6
  131.              Connect=True
  132.           Endif
  133.           If Instr(Out2,"CONNECT 1200") Then
  134.              Modem.Baud=12
  135.              Connect=True
  136.           Endif
  137.           If Instr(Out2,"CONNECT 2400") Then
  138.              Modem.Baud=24
  139.              Connect=True
  140.           Endif
  141.           If Instr(Out2,"CONNECT 4800") Then
  142.              Modem.Baud=48
  143.              Connect=True
  144.           Endif
  145.           If Instr(Out2,"CONNECT 9600") Then
  146.              Modem.Baud=96
  147.              Connect=True
  148.           Endif
  149.           If Instr(Out2,"CONNECT 19200") Then
  150.              Modem.Baud=192
  151.              Connect=True
  152.           Endif
  153.           If Instr(Out2,"CONNECT 38400") Then
  154.              Modem.Baud=384
  155.              Connect=True
  156.           Endif
  157.           If Time.Out! Then
  158.              If Time.Out!<=Timer Then
  159.                 If Instr(Out2,"CONNECT") Then
  160.                    Modem.Baud=3
  161.                    Connect=True
  162.                    If Config2(45)=False Then
  163.                       Strng="300 baud access not allowed!"
  164.                       Call Send.Modem
  165.                       Connect=False
  166.                    Endif
  167.                 Endif
  168.                 If Connect=False Then
  169.                    Strng="No Carrier"
  170.                    Call Modem.Status
  171.                    Connect=False
  172.                    Time.Out!=False
  173.                    Call Recycle.Modem
  174.                 Endif
  175.              Endif
  176.           Endif
  177.        Endif
  178.        If Timer>=Time.Temp! Then
  179.           Call Display.Time
  180.           Time.Temp!=Timer+.9
  181.           If Blank.Menu=False Then
  182.              Menu.Timer=Menu.Timer+1
  183.              If Menu.Timer>=30 Then
  184.                 Menu.Timer=False
  185.                 Blank.Menu=True
  186.                 Call Screen.ANSI(4,33,0)
  187.                 Call Screen.ANSI(4,44,30)
  188.                 Call Display.Field
  189.                 Selection=1
  190.              Endif
  191.           Endif
  192.           If Blank.Screen=False Then
  193.              Screen.Timer=Screen.Timer+1
  194.              If Screen.Timer>180 Then
  195.                 Screen.Timer=False
  196.                 If Local.Mode=False Then
  197.                    Call Clear.Screen
  198.                    Locate ,,0
  199.                    Blank.Menu=True
  200.                    Blank.Screen=True
  201.                    Selection=1
  202.                 Endif
  203.              Endif
  204.           Endif
  205.        Endif
  206.        TempX$=Inkey$
  207.        TempX=False
  208.        If Len(TempX$) Then
  209.           If Blank.Screen Then
  210.              If Local.Mode Then
  211.                 Strng="Local Mode"
  212.              Else
  213.                 Strng="Waiting For Call"
  214.              Endif
  215.              Call Modem.Status
  216.           Endif
  217.           Menu.Timer=False
  218.           Screen.Timer=False
  219.        Endif
  220.        If Len(TempX$)=1 Then
  221.           TempX$=Ucase$(TempX$)
  222.           If Instr("TLERSCDAOM",TempX$) Then
  223.              Call Menu.Select
  224.           Endif
  225.        Endif
  226.        If Len(TempX$)=2 Then
  227.           TempX=Asc(Right$(TempX$,1))
  228.           If TempX>=59 And TempX<=68 Then
  229.              Call Menu.Select
  230.           Else
  231.              If Blank.Menu=False Then
  232.                 Call Menu.Select
  233.              Else
  234.                 Next.Field=1
  235.                 Call Show.Field
  236.              Endif
  237.           Endif
  238.        Endif
  239.        If TempX$=Chr$(27) Or TempX$="T" Then
  240.           If Blank.Menu Then
  241.              Next.Field=1
  242.              Call Show.Field
  243.           Endif
  244.           If Local.Mode=False Then
  245.              Strng=Config3(41)
  246.              Call Send.Modem
  247.              Strng="Off Hook"
  248.              Call Modem.Status
  249.           Endif
  250.           Call Clear.Screen
  251.           End
  252.        Endif
  253.        If TempX$=Chr$(13) Then
  254.           If Blank.Menu Then
  255.              Next.Field=1
  256.              Call Show.Field
  257.           Endif
  258.           If Selection<=7 Then
  259.              If Local.Mode=False Then
  260.                 Strng=Config3(41)
  261.                 Call Send.Modem
  262.                 Strng="Off Hook"
  263.                 Call Modem.Status
  264.              Endif
  265.           Endif
  266.           Select Case Selection
  267.           Case 1
  268.              Call Clear.Screen
  269.              End
  270.           Case 2
  271.              Timeon=Timer
  272.              Time.Left=3600
  273.              Color.Graphics=True
  274.              Two.Minutes.Left=False
  275.              Local.Mode=True
  276.              Lost.Carrier=False
  277.              Recycle=False
  278.              Exit Do
  279.           Case 3
  280.              Call Shell.Program("edit.exe",True,False)
  281.              Exit Do
  282.           Case 4
  283.              Call Shell.Program("dndcnfg.exe",True,False)
  284.              Exit Do
  285.           Case 5
  286.              Call Shell.Program("dndedit.exe",True,False)
  287.              Exit Do
  288.           Case 6
  289.              Call Clear.Screen
  290.              Strng="Type Exit to return.."
  291.              Call Scrn(Strng)
  292.              Shell
  293.              Exit Do
  294.           Case 7
  295.              Call Clear.Screen
  296.              Line Input "Enter DOS command: ",Var$
  297.              Close 13
  298.              Open DOS.Exit For Output Shared As #13
  299.              Print #13,Var$
  300.              Print #13,"PAUSE"
  301.              Print #13,"EXIT"
  302.              Close 13
  303.              Shell DOS.Exit
  304.              Exit Do
  305.           Case 8
  306.              Time.Out!=Timer+Config2(60)
  307.              Out2=Nul
  308.              Strng=Config3(40)
  309.              Call Send.Modem
  310.              Strng="Auto Answer"
  311.              Call Modem.Status
  312.           Case 9
  313.              Time.Out!=Timer+Config2(60)
  314.              Out2=Nul
  315.              Strng="ATO"
  316.              Call Send.Modem
  317.              Strng="Originate"
  318.              Call Modem.Status
  319.           Case 10
  320.              Connect=False
  321.              Time.Out!=False
  322.              Call Recycle.Modem
  323.           End Select
  324.        Endif
  325.     Loop
  326.     If Local.Mode=False Then
  327.        If Connect Then
  328.           Recycle=False
  329.           Strng="Connect"+Str$(Modem.Baud)+"00"
  330.           Call Modem.Status
  331.           Call Driver(4)
  332.           Call Driver(13)
  333.        Endif
  334.     Endif
  335. 10014
  336.  Loop
  337.  Call Clear.Screen
  338.  Exit Sub
  339. 10015
  340.  Data.Error=True
  341.  If Erl=10011 Then
  342.     Resume 10012
  343.  Endif
  344.  If Erl=10012 Then
  345.     Resume 10013
  346.  Endif
  347.  Resume 10014
  348. End Sub
  349.  
  350. Sub Menu.Select
  351.  On Local Error Goto 10102
  352.  Next.Field=False
  353.  If TempX$=Chr$(9) Then
  354.     TempX=9
  355.  Endif
  356.  Var1=Instr("TLERSCDAOM",TempX$)
  357.  If Var1 Then
  358.     TempX=Var1
  359.  Endif
  360.  Select Case TempX
  361.  Case 1 To 10
  362.     Next.Field=TempX
  363.     TempX$=Chr$(13)
  364.  Case 59 To 68
  365.     Next.Field=TempX-58
  366.     TempX$=Chr$(13)
  367.  Case 72
  368.     If Selection>1 Then
  369.        Next.Field=Selection-1
  370.     Endif
  371.  Case 80
  372.     If Selection<10 Then
  373.        Next.Field=Selection+1
  374.     Endif
  375.  Case 15, 75
  376.     If Selection>5 Then
  377.        Next.Field=Selection-5
  378.     Endif
  379.  Case 9, 77
  380.     If Selection<6 Then
  381.        Next.Field=Selection+5
  382.     Endif
  383.  Case 71
  384.     If Selection<>1 Then
  385.        Next.Field=1
  386.     Endif
  387.  Case 79
  388.     If Selection<>10 Then
  389.        Next.Field=10
  390.     Endif
  391.  Case 73
  392.     If Selection<6 And Selection<>1 Then
  393.        Next.Field=1
  394.     Endif
  395.     If Selection>5 And Selection<>6 Then
  396.        Next.Field=6
  397.     Endif
  398.  Case 81
  399.     If Selection<6 And Selection<>5 Then
  400.        Next.Field=5
  401.     Endif
  402.     If Selection>5 And Selection<>10 Then
  403.        Next.Field=10
  404.     Endif
  405.  End Select
  406.  If Next.Field Then
  407.     Call Show.Field
  408.  Endif
  409. 10101
  410.  Exit Sub
  411. 10102
  412.  Resume 10101
  413. End Sub
  414.  
  415. Sub Show.Field
  416.  On Local Error Goto 10112
  417.  Call Display.Field
  418.  Blank.Menu=False
  419.  Selection=Next.Field
  420.  Var1=Menu2(Selection,1)
  421.  Var2=Menu2(Selection,2)+3
  422.  Call Screen.ANSI(2,Var1,Var2)
  423.  Call Screen.ANSI(4,37,0)
  424.  Call Screen.ANSI(4,41,79)
  425.  Strng=Left$(Menu1(Selection),1)
  426.  Call Scrn(Strng)
  427.  Call Screen.ANSI(4,33,0)
  428.  Call Screen.ANSI(4,41,78)
  429.  Strng=Mid$(Menu1(Selection),2)
  430.  Strng=Rtrim$(Strng)
  431.  Call Scrn(Strng)
  432. 10111
  433.  Exit Sub
  434. 10112
  435.  Resume 10111
  436. End Sub
  437.  
  438. Sub Display.Field
  439.  On Local Error Goto 10122
  440.  Var1=Menu2(Selection,1)
  441.  Var2=Menu2(Selection,2)+3
  442.  Call Screen.ANSI(2,Var1,Var2)
  443.  Call Screen.ANSI(4,37,0)
  444.  Call Screen.ANSI(4,44,31)
  445.  Strng=Left$(Menu1(Selection),1)
  446.  Call Scrn(Strng)
  447.  Call Screen.ANSI(4,33,0)
  448.  Call Screen.ANSI(4,44,30)
  449.  Strng=Mid$(Menu1(Selection),2)
  450.  Strng=Rtrim$(Strng)
  451.  Call Scrn(Strng)
  452. 10121
  453.  Exit Sub
  454. 10122
  455.  Resume 10121
  456. End Sub
  457.  
  458. Sub Recycle.Modem
  459.  On Local Error Goto 10132
  460.  If Local.Mode Then
  461.     Strng="Local Mode"
  462.     Call Modem.Status
  463.     Exit Sub
  464.  Endif
  465.  Strng="Recycle"
  466.  Call Modem.Status
  467.  Call Drop.DTR
  468.  Modem.Baud=Config2(64)
  469.  Call Driver(4)
  470.  Call Driver(13)
  471.  Out2=Nul
  472.  Strng=Config3(42)
  473.  Call Send.Modem
  474.  Time.Temp!=Timer+2
  475.  Init=False
  476.  Do While Time.Temp!>Timer
  477.     Call Read.Modem
  478.     If Instr(Out2,"OK") Then
  479.        Init=True
  480.     Endif
  481.  Loop
  482.  Strng="Reset OK"
  483.  If Init=False Then
  484.     Strng="Reset Timeout"
  485.  Endif
  486.  Call Modem.Status
  487.  Out2=Nul
  488.  If Config2(57)<5 Then
  489.     Strng=Config3(39)
  490.     Call Send.Modem
  491.     Time.Temp!=Timer+2
  492.     Init=False
  493.     Do While Time.Temp!>Timer
  494.        Call Read.Modem
  495.        If Instr(Out2,"OK") Then
  496.           Init=True
  497.        Endif
  498.     Loop
  499.     Strng="Init OK"
  500.     If Init=False Then
  501.        Strng="Init Timeout"
  502.     Endif
  503.     Call Modem.Status
  504.  Endif
  505.  Out2=Nul
  506.  Strng="Waiting For Call"
  507.  Call Modem.Status
  508. 10131
  509.  Exit Sub
  510. 10132
  511.  Resume 10131
  512. End Sub
  513.  
  514. Sub Send.Modem
  515.  On Local Error Goto 10142
  516.  If Local.Mode Then
  517.     Exit Sub
  518.  Endif
  519.  Call Driver(5)
  520.  Do While Outregs.AX And &H40
  521.     Call Driver(5)
  522.  Loop
  523.  Strng=Strng+Chr$(13)
  524.  For Var=1 To Len(Strng)
  525.     Inregs.AX=Asc(Mid$(Strng,Var,1))
  526.     Call Driver(7)
  527.  Next
  528. 10141
  529.  Exit Sub
  530. 10142
  531.  Resume 10141
  532. End Sub
  533.  
  534. Sub Read.Modem
  535.  On Local Error Goto 10152
  536.  Do
  537.     Call Driver(6)
  538.     Char=Outregs.AX And &HFF
  539.     If Char=&HFF Then
  540.        Exit Do
  541.     Endif
  542.     Out2=Out2+Ucase$(Chr$(Char))
  543.  Loop
  544. 10151
  545.  Exit Sub
  546. 10152
  547.  Resume 10151
  548. End Sub
  549.  
  550. Sub Pause.Second
  551.  On Local Error Goto 10162
  552.  Timer.Temp!=Timer+1
  553.  Do While Timer.Temp!>Timer
  554.     VarX$=Inkey$
  555.     If VarX$=Chr$(27) Then
  556.        Chat=False
  557.     Endif
  558.     If VarX$=Chr$(11) Then
  559.        If Allow.Break Then
  560.           Break=True
  561.           If Wait.Mode Or Auto.Mode Or Follow.Mode Then
  562.              Auto.Break=True
  563.           Endif
  564.        Endif
  565.     Endif
  566.  Loop
  567. 10161
  568.  Exit Sub
  569. 10162
  570.  Resume 10161
  571. End Sub
  572.  
  573. Sub Modem.Status
  574.  On Local Error Goto 10172
  575.  If Bypass.Screen Then
  576.     Exit Sub
  577.  Endif
  578.  Out3=Strng
  579.  If Blank.Screen Then
  580.     Blank.Screen=False
  581.     Call Opening.Screen
  582.  Endif
  583.  Call Screen.ANSI(4,37,0)
  584.  Call Screen.ANSI(4,44,31)
  585.  Call Screen.ANSI(2,23,4)
  586.  Strng=Space$(20)
  587.  Call Scrn(Strng)
  588.  Out3=Left$(Out3,20)
  589.  Temp=13-Len(Out3)/2
  590.  Call Screen.ANSI(2,23,Temp)
  591.  Strng=Out3
  592.  Call Scrn(Strng)
  593.  Call Screen.ANSI(2,23,25)
  594.  Var1=Int((Fre(TempX$)+Fre(-1)+Fre(-2))/1024)
  595.  Strng=Str$(Var1)+" KB"
  596.  Call Scrn(Strng)
  597.  Call Screen.ANSI(2,23,40)
  598.  Strng="V"+Version$
  599.  Call Scrn(Strng)
  600.  Call Display.Time
  601.  Strng=Out3
  602. 10171
  603.  Exit Sub
  604. 10172
  605.  Resume 10171
  606. End Sub
  607.  
  608. Sub Display.Time
  609.  On Local Error Goto 10182
  610.  Call Set.Clock
  611.  If Blank.Screen=False Then
  612.     Call Screen.ANSI(4,37,0)
  613.     Call Screen.ANSI(4,44,31)
  614.     Call Screen.ANSI(2,23,56)
  615.     Strng=FormatD$(Now#,"mmm\. d")
  616.     Call Scrn(Strng)
  617.     Call Screen.ANSI(2,23,69)
  618.     Strng=Time$
  619.     Call Scrn(Strng)
  620.  Endif
  621. 10181
  622.  Exit Sub
  623. 10182
  624.  Resume 10181
  625. End Sub
  626.  
  627. Sub Error.Message
  628.  On Local Error Goto 10192
  629.  Max.Row=24
  630.  Call Clear.Screen
  631.  Call Scrn(Strng)
  632. 10191
  633.  End
  634. 10192
  635.  Resume 10191
  636. End Sub
  637.  
  638. Sub Clear.Screen
  639.  On Local Error Goto 10202
  640.  Call Screen.ANSI(4,37,0)
  641.  Call Screen.ANSI(4,40,15)
  642.  Call Screen.ANSI(3,0,0)
  643.  Call Screen.ANSI(2,24,1)
  644.  Call Screen.ANSI(1,37,7)
  645.  Locate Max.Row+1,1,1
  646. 10201
  647.  Exit Sub
  648. 10202
  649.  Resume 10201
  650. End Sub
  651.  
  652. Sub Opening.Screen
  653.  On Local Error Goto 10212
  654.  Selection=1
  655.  Call Screen.ANSI(4,37,0)
  656.  Call Screen.ANSI(4,44,31)
  657.  Call Screen.ANSI(3,0,0)
  658.  Call Screen.ANSI(2,24,1)
  659.  Locate 24,1,0
  660.  Call Screen.ANSI(4,33,0)
  661.  Call Screen.ANSI(4,44,30)
  662.  Call Screen.ANSI(2,2,3)
  663.  Strng=Chr$(214)
  664.  Call Scrn(Strng)
  665.  Strng=String$(74,196)
  666.  Call Scrn(Strng)
  667.  Strng=Chr$(183)
  668.  Call Scrn(Strng)
  669.  Temp1=1
  670.  For Temp5=3 To 24
  671.     Call Screen.ANSI(4,33,0)
  672.     Call Screen.ANSI(4,44,30)
  673.     Call Screen.ANSI(2,Temp5,3)
  674.     Strng=Chr$(186)
  675.     Call Scrn(Strng)
  676.     If Temp5=5 Then
  677.        Call Screen.ANSI(4,37,0)
  678.        Call Screen.ANSI(4,44,31)
  679.        Call Screen.ANSI(2,5,23)
  680.        Strng="Dungeons And Dragons Bulletin Board"
  681.        Call Scrn(Strng)
  682.     Endif
  683.     If Temp5=7 Then
  684.        Call Screen.ANSI(4,37,0)
  685.        Call Screen.ANSI(4,44,31)
  686.        Out2="Adventure System (Node: "
  687.        If Node=False Then
  688.           If Local.Mode Then
  689.              Out2=Out2+"Local"
  690.           Else
  691.              Out2=Out2+"BBS"
  692.           Endif
  693.        Else
  694.           Out2=Out2+Chr$(Node)
  695.        Endif
  696.        Out2=Out2+")"
  697.        Temp2=Int(40-Len(Out2)/2+1)
  698.        Call Screen.ANSI(2,7,Temp2)
  699.        Call Scrn(Out2)
  700.     Endif
  701.     If Temp1<6 Then
  702.        If Temp5=Menu2(Temp1,1) Then
  703.           Call Screen.ANSI(4,33,0)
  704.           Call Screen.ANSI(4,44,30)
  705.           Var1=Menu2(Temp1,1)
  706.           Var2=Menu2(Temp1,2)
  707.           Call Screen.ANSI(2,Var1,Var2)
  708.           Strng="F"+Mid$(Str$(Temp1),2)+" "
  709.           Call Scrn(Strng)
  710.           Call Screen.ANSI(4,37,0)
  711.           Call Screen.ANSI(4,44,31)
  712.           Strng=Left$(Menu1(Temp1),1)
  713.           Call Scrn(Strng)
  714.           Call Screen.ANSI(4,33,0)
  715.           Call Screen.ANSI(4,44,30)
  716.           Strng=Mid$(Menu1(Temp1),2)
  717.           Strng=Rtrim$(Strng)
  718.           Call Scrn(Strng)
  719.           Call Screen.ANSI(4,33,0)
  720.           Call Screen.ANSI(4,44,30)
  721.           Var1=Menu2(Temp1+5,1)
  722.           Var2=Menu2(Temp1+5,2)
  723.           Call Screen.ANSI(2,Var1,Var2)
  724.           Strng="F"+Right$(Str$(Temp1+5),1)+" "
  725.           Call Scrn(Strng)
  726.           Call Screen.ANSI(4,37,0)
  727.           Call Screen.ANSI(4,44,31)
  728.           Strng=Left$(Menu1(Temp1+5),1)
  729.           Call Scrn(Strng)
  730.           Call Screen.ANSI(4,33,0)
  731.           Call Screen.ANSI(4,44,30)
  732.           Strng=Mid$(Menu1(Temp1+5),2)
  733.           Strng=Rtrim$(Strng)
  734.           Call Scrn(Strng)
  735.           Temp1=Temp1+1
  736.        Endif
  737.     Endif
  738.     If Temp5=22 Then
  739.        Call Screen.ANSI(4,36,0)
  740.        Call Screen.ANSI(4,44,27)
  741.        Call Screen.ANSI(2,22,10)
  742.        Strng="Status"
  743.        Call Scrn(Strng)
  744.        Call Screen.ANSI(2,22,26)
  745.        Strng="Memory"
  746.        Call Scrn(Strng)
  747.        Call Screen.ANSI(2,22,40)
  748.        Strng="Version"
  749.        Call Scrn(Strng)
  750.        Call Screen.ANSI(2,22,57)
  751.        Strng="Date"
  752.        Call Scrn(Strng)
  753.        Call Screen.ANSI(2,22,71)
  754.        Strng="Time"
  755.        Call Scrn(Strng)
  756.     Endif
  757.     Call Screen.ANSI(4,33,0)
  758.     Call Screen.ANSI(4,44,30)
  759.     Call Screen.ANSI(2,Temp5,78)
  760.     Strng=Chr$(186)
  761.     Call Scrn(Strng)
  762.  Next
  763.  Call Screen.ANSI(2,24,3)
  764.  Strng=Chr$(211)
  765.  Call Scrn(Strng)
  766.  Strng=String$(74,196)
  767.  Call Scrn(Strng)
  768.  Strng=Chr$(189)
  769.  Call Scrn(Strng)
  770. 10211
  771.  Exit Sub
  772. 10212
  773.  Resume 10211
  774. End Sub
  775.  
  776. Sub Read.Config
  777.  On Local Error Goto 10222
  778.  Call Get.Config
  779.  Call Get.Environment
  780.  Call Make.FileNames
  781.  Call Free.Files
  782.  Call Open.Files
  783.  Call Read.Data
  784.  Call Update.Mess(True)
  785. 10221
  786.  Exit Sub
  787. 10222
  788.  Resume 10221
  789. End Sub
  790.  
  791. Sub Get.Config
  792.  On Local Error Goto 10232
  793.  If Max.Row=False Then
  794.     Max.Row=23
  795.  Endif
  796.  Call Screen.ANSI(4,37,15)
  797.  Locate Max.Row+1,1,1
  798.  Strng="Loading.."+Chr$(13)+Chr$(10)
  799.  Call Scrn(Strng)
  800.  DND.Path=Environ$("DNDBBS")
  801.  If DND.Path<>Nul Then
  802.     If Right$(DND.Path,1)<>"\" Then
  803.        DND.Path=DND.Path+"\"
  804.     Endif
  805.  Endif
  806.  FileName=DND.Path+"DNDBBS"
  807.  If Node Then
  808.     FileName=FileName+Chr$(Node)
  809.  Endif
  810.  Data.Error=False
  811.  FileName=FileName+".CFG"
  812.  Close 13
  813.  Open FileName For Input Shared As #13
  814.  For Temp1=1 To 10
  815.     For Temp2=1 To 4
  816.        Input #13,Training.Room(Temp1,Temp2)
  817.     Next
  818.  Next
  819.  For Temp2=1 To 10
  820.     Line Input #13,Room.Array(Temp2)
  821.  Next
  822.  For Temp2=1 To 30
  823.     Input #13,Config1(Temp2)
  824.  Next
  825.  For Temp2=1 To 85
  826.     Input #13,Config2(Temp2)
  827.  Next
  828.  For Temp2=1 To 77
  829.     Line Input #13,Config3(Temp2)
  830.  Next
  831.  For Temp2=1 To 10
  832.     Line Input #13,High.Class.Name(Temp2)
  833.  Next
  834.  For Temp2=1 To 8
  835.     Line Input #13,Race(Temp2)
  836.  Next
  837.  For Temp2=1 To 10
  838.     Line Input #13,Class.Name(Temp2)
  839.  Next
  840.  For Temp2=1 To 7
  841.     Line Input #13,Stat(Temp2)
  842.  Next
  843.  For Temp2=1 To 11
  844.     Line Input #13,Direction(Temp2)
  845.  Next
  846.  For Temp2=1 To 10
  847.     Line Input #13,Numeral(Temp2)
  848.  Next
  849.  For Temp2=1 To 4
  850.     Line Input #13,Weapon.Type.Name(Temp2)
  851.  Next
  852.  For Temp2=1 To 3
  853.     Line Input #13,Alignment.Name1(Temp2)
  854.  Next
  855.  For Temp2=1 To 3
  856.     Line Input #13,Alignment.Name2(Temp2)
  857.  Next
  858.  For Temp2=1 To 70
  859.     Line Input #13,Strip.Data(Temp2)
  860.  Next
  861.  Redim Command.Set1(1 To 83, 1 To 5) As String*12,_
  862.        Command.Set2(1 To 83, 1 To 5) As String*12
  863.  For Temp2=1 To 83
  864.     For Temp3=1 To 5
  865.        Line Input #13,Command.Set1(Temp2, Temp3)
  866.     Next
  867.  Next
  868.  For Temp2=1 To 83
  869.     For Temp3=1 To 5
  870.        Line Input #13,Command.Set2(Temp2, Temp3)
  871.     Next
  872.  Next
  873.  Redim Sysop.Commands1(1 To 9) As String*10,_
  874.        Sysop.Commands2(1 To 9) As String*10
  875.  For Temp2=1 To 9
  876.     Line Input #13,Sysop.Commands1(Temp2)
  877.  Next
  878.  For Temp2=1 To 9
  879.     Line Input #13,Sysop.Commands2(Temp2)
  880.  Next
  881.  For Temp2=1 To 10
  882.     Line Input #13,Menu1(Temp2)
  883.     Input #13,Menu2(Temp2,1)
  884.     Input #13,Menu2(Temp2,2)
  885.  Next
  886.  For Temp2=11 To 16
  887.     Room.Array(Temp2)=Config3(Temp2+11)
  888.  Next
  889.  If Not Eof(13) Then
  890.     Error 99
  891.  Endif
  892. 10231
  893.  If Data.Error Then
  894.     Strng=FileName+" not found. Run DNDCNFG."
  895.     Call Error.Message
  896.  Endif
  897.  Exit Sub
  898. 10232
  899.  Data.Error=True
  900.  Resume 10231
  901. End Sub
  902.  
  903. Sub Get.Environment
  904.  On Local Error Goto 10242
  905.  Out2=Environ$("DNDDAT")
  906.  If Out2<>Nul Then
  907.     Config3(11)=Out2
  908.     If Right$(Config3(11),1)<>"\" Then
  909.        Config3(11)=Config3(11)+"\"
  910.     Endif
  911.  Endif
  912.  Out2=Environ$("DNDDOC")
  913.  If Out2<>Nul Then
  914.     Config3(52)=Out2
  915.     If Right$(Config3(52),1)<>"\" Then
  916.        Config3(52)=Config3(52)+"\"
  917.     Endif
  918.  Endif
  919.  Out2=Environ$("DNDTEMP")
  920.  If Out2<>Nul Then
  921.     Config3(53)=Out2
  922.     If Right$(Config3(53),1)<>"\" Then
  923.        Config3(53)=Config3(53)+"\"
  924.     Endif
  925.  Endif
  926.  Out2=Environ$("DNDDOOR")
  927.  If Out2<>Nul Then
  928.     Config3(38)=Out2
  929.     If Right$(Config3(38),1)<>"\" Then
  930.        Config3(38)=Config3(38)+"\"
  931.     Endif
  932.  Endif
  933. 10241
  934.  Exit Sub
  935. 10242
  936.  Resume 10241
  937. End Sub
  938.  
  939. Sub Make.FileNames
  940.  On Local Error Goto 10252
  941.  Door.FileName=Config3(38)+"DORINFO"
  942.  If Node Then
  943.     Door.FileName=Door.FileName+Chr$(Node)
  944.  Endif
  945.  Door.FileName=Door.FileName+".DEF"
  946.  Temp.FileName=Config3(53)+Config3(75)
  947.  If Node Then
  948.     Temp.FileName=Temp.FileName+Chr$(Node)
  949.  Endif
  950.  Temp.FileName=Temp.FileName+Config3(15)
  951.  DOS.Exit=DND.Path+Config3(70)
  952.  If Node Then
  953.     DOS.Exit=DOS.Exit+Chr$(Node)
  954.  Endif
  955.  DOS.Exit=DOS.Exit+".BAT"
  956.  Catalog.FileName=Config3(52)+Config3(65)+Config3(62)
  957.  Hint.FileName=Config3(52)+Config3(64)+Config3(62)
  958.  Summary.FileName=Config3(52)+Config3(50)+Config3(62)
  959.  Day.File.FileName=Config3(11)+Config3(72)
  960.  Day.Log.FileName=Config3(11)+Config3(67)
  961.  DMhelp.Filename=Config3(11)+Config3(63)+Config3(15)
  962.  Help.Filename=Config3(11)+Config3(56)+Config3(15)
  963.  LastUser.FileName=Config3(11)+Config3(49)+Config3(15)
  964.  Log.FileName=Config3(11)+Config3(73)+Config3(15)
  965.  Logoff.FileName=Config3(11)+Config3(28)+Config3(15)
  966.  Logon.Help.FileName=Config3(11)+Config3(61)+Config3(15)
  967.  Notice.FileName=Config3(11)+Config3(4)+Config3(15)
  968.  Prelog.FileName=Config3(11)+Config3(1)+Config3(15)
  969.  Welcome.FileName=Config3(11)+Config3(3)+Config3(15)
  970. 10251
  971.  Exit Sub
  972. 10252
  973.  Resume 10251
  974. End Sub
  975.  
  976. Sub Free.Files
  977.  On Local Error Goto 10264
  978. 10261
  979.  Close
  980.  Temp=False
  981.  Do
  982.     Temp=Temp+1
  983.     Open Temp.FileName For Random Shared As Temp
  984.  Loop
  985. 10262
  986.  Close
  987.  Kill Temp.FileName
  988. 10263
  989.  If Temp<16 Then
  990.     Strng="Increase FILES= statement in CONFIG.SYS then reboot."
  991.     Call Error.Message
  992.  Endif
  993.  Exit Sub
  994. 10264
  995.  If Erl=10261 Then
  996.     Resume 10262
  997.  Endif
  998.  Resume 10263
  999. End Sub
  1000.  
  1001. Sub Open.Files
  1002.  On Local Error Goto 10272
  1003.  Close
  1004.  FileName=Config3(53)+Config3(69)+Config3(15)
  1005.  Open FileName For Random Shared As #1 Len=Len(MessWorkRecord1)
  1006.  FileName=Config3(53)+Config3(68)+Config3(15)
  1007.  Open FileName For Random Shared As #2 Len=Len(MessWorkRecord2)
  1008.  FileName=Config3(11)+Config3(21)+Config3(15)
  1009.  Open FileName For Random Shared As #3 Len=Len(UserRecord)
  1010.  FileName=Config3(11)+Config3(22)+Config3(15)
  1011.  Open FileName For Random Shared As #4 Len=Len(MonsterRecord)
  1012.  FileName=Config3(11)+Config3(16)+Config3(15)
  1013.  Open FileName For Random Shared As #5 Len=Len(RoomRecord)
  1014.  FileName=Config3(11)+Config3(17)+Config3(15)
  1015.  Open FileName For Random Shared As #6 Len=Len(ObjectRecord)
  1016.  FileName=Config3(11)+Config3(18)+Config3(15)
  1017.  Open FileName For Random Shared As #7 Len=Len(MonsterRecord)
  1018.  FileName=Config3(11)+Config3(19)+Config3(15)
  1019.  Open FileName For Random Shared As #8 Len=Len(TreasureRecord)
  1020.  FileName=Config3(11)+Config3(13)+Config3(15)
  1021.  Open FileName For Random Shared As #9 Len=Len(MonsterTalkRecord)
  1022.  FileName=Config3(54)+Config3(59)+Config3(15)
  1023.  Open FileName For Random Shared As #10 Len=Len(MessageBaseRecord)
  1024.  FileName=Config3(11)+Config3(12)+Config3(15)
  1025.  Open FileName For Random Shared As #11 Len=Len(MonclassRecord)
  1026.  FileName=Config3(11)+Config3(20)+Config3(15)
  1027.  Open FileName For Random Shared As #12 Len=Len(SpellRecord)
  1028. 10271
  1029.  Exit Sub
  1030. 10272
  1031.  Resume 10271
  1032. End Sub
  1033.  
  1034. Sub Read.Data
  1035.  On Local Error Goto 10282
  1036.  Nonplyrs.Max=Lof(4)/Len(MonsterRecord)
  1037.  If Nonplyrs.Max>False Then
  1038.     Redim NonplyrsArray(1 To Nonplyrs.Max) As String*30
  1039.     For Temp=1 To Nonplyrs.Max
  1040.        Get 4,Temp,MonsterRecord
  1041.        NonplyrsArray(Temp)=MonsterRecord.PluralName
  1042.     Next
  1043.  Endif
  1044.  Users.Max=Lof(3)/Len(UserRecord)
  1045.  If Users.Max=False Then
  1046.     Users.Max=1
  1047.     Put 3,1,UserRecord
  1048.  Endif
  1049.  Redim User.Array1(1 To Users.Max) As Integer,_
  1050.        User.Array2(1 To Users.Max) As Integer,_
  1051.        User.Array3(1 To Users.Max) As Integer
  1052.  For Temp=1 To Users.Max
  1053.     Get 3,Temp,UserRecord
  1054.     User.Array1(Temp)=UserRecord.Room
  1055.     User.Array2(Temp)=UserRecord.Level
  1056.     User.Array3(Temp)=UserRecord.ClassType
  1057.  Next
  1058.  Monclass.Max=Lof(11)/Len(MonclassRecord)
  1059.  If Monclass.Max=False Then
  1060.     Monclass.Max=1
  1061.     Put 11,1,MonclassRecord
  1062.  Endif
  1063.  Redim Monster.Class(1 To Monclass.Max,1 To 10) As Integer,_
  1064.        Monster.Rate(1 To Monclass.Max,1 To 10) As Integer,_
  1065.        Monster.Percent(1 To Monclass.Max,1 To 10) As Integer
  1066.  For Temp=1 To Monclass.Max
  1067.     Get 11,Temp,MonclassRecord
  1068.     For Temp2=1 To 10
  1069.        Monster.Class(Temp,Temp2)=MonclassRecord.Monsters(Temp2)
  1070.     Next
  1071.  Next
  1072.  For TempA=1 To Monclass.Max
  1073.     For Temp=1 To 10
  1074.        Temp5=Monster.Class(TempA,Temp)
  1075.        If Temp5>False And Temp5<=Lof(7)/Len(MonsterRecord) Then
  1076.           Get 7,Temp5,MonsterRecord
  1077.           Monster.Rate(TempA,Temp)=MonsterRecord.Rate
  1078.           Monster.Percent(TempA,Temp)=MonsterRecord.RatePercent
  1079.        Else
  1080.           Monster.Rate(TempA,Temp)=False
  1081.           Monster.Percent(TempA,Temp)=False
  1082.        Endif
  1083.     Next
  1084.  Next
  1085.  Spells.Max=Lof(12)/Len(SpellRecord)
  1086.  If Spells.Max=False Then
  1087.     Spells.Max=1
  1088.     Put 12,1,SpellRecord
  1089.  Endif
  1090.  Redim SpellArray(1 To Spells.Max) As SpellType
  1091.  For Temp=1 To Spells.Max
  1092.     Get 12,Temp,SpellArray(Temp)
  1093.  Next
  1094. 10281
  1095.  Exit Sub
  1096. 10282
  1097.  Resume 10281
  1098. End Sub
  1099.  
  1100. Sub Init.Driver
  1101.  On Local Error Goto 10292
  1102.  If Local.Mode Then
  1103.     Exit Sub
  1104.  Endif
  1105.  If Port.Override>False Then
  1106.     Port=Port.Override-1
  1107.  Else
  1108.     Port=Config2(46)-1
  1109.  Endif
  1110.  Call Driver(1)
  1111.  If (Outregs.AX<>&H1954) Then
  1112.     Strng="FOSSIL driver not installed."
  1113.     Call Error.Message
  1114.  Endif
  1115. 10291
  1116.  Exit Sub
  1117. 10292
  1118.  Resume 10291
  1119. End Sub
  1120.  
  1121. Sub Drop.DTR
  1122.  On Local Error Goto 10302
  1123.  Call Driver(3)
  1124.  Call Driver(2)
  1125.  Call Driver(14)
  1126.  Call Driver(15)
  1127.  Call Pause.Second
  1128.  Call Driver(3)
  1129.  Call Pause.Second
  1130. 10301
  1131.  Exit Sub
  1132. 10302
  1133.  Resume 10301
  1134. End Sub
  1135.  
  1136. Sub Driver(Var)
  1137.  On Local Error Goto 10312
  1138.  Select Case Var
  1139.  Case 1
  1140.     Inregs.AX=&H0400
  1141.  Case 2
  1142.     Inregs.AX=&H0600
  1143.  Case 3
  1144.     Inregs.AX=&H0601
  1145.  Case 4
  1146.     If Config2(65) Then
  1147.        Exit Sub
  1148.     Endif
  1149.     Select Case Modem.Baud
  1150.     Case 3
  1151.        Inregs.AX=&H0043
  1152.     Case 6
  1153.        Inregs.AX=&H0063
  1154.     Case 12
  1155.        Inregs.AX=&H0083
  1156.     Case 24
  1157.        Inregs.AX=&H00A3
  1158.     Case 48
  1159.        Inregs.AX=&H00C3
  1160.     Case 96
  1161.        Inregs.AX=&H00E3
  1162.     Case 192
  1163.        Inregs.AX=&H0003
  1164.     Case 384
  1165.        Inregs.AX=&H0023
  1166.     End Select
  1167.  Case 5
  1168.     Inregs.AX=&H0300
  1169.  Case 6
  1170.     Inregs.AX=&H2000
  1171.  Case 7
  1172.     Inregs.AX=Inregs.AX Or &H0B00
  1173.  Case 11
  1174.     Inregs.AX=&H1001
  1175.  Case 13
  1176.     Inregs.AX=&H0F00
  1177.     If Config2(79) Then
  1178.        Inregs.AX=Inregs.AX Or &H09
  1179.     Endif
  1180.     If Config2(80) Then
  1181.        Inregs.AX=Inregs.AX Or &H02
  1182.     Endif
  1183.  Case 14
  1184.     Inregs.AX=&H0A00
  1185.  Case 15
  1186.     Inregs.AX=&H0900
  1187.  End Select
  1188.  Inregs.DX=Port
  1189.  Call Interrupt(&H14,Inregs,Outregs)
  1190. 10311
  1191.  Exit Sub
  1192. 10312
  1193.  Resume 10311
  1194. End Sub
  1195.  
  1196. Sub Get.Command
  1197.  On Local Error Goto 10322
  1198.  Port.Override=False
  1199.  Time.Override=False
  1200.  Inregs.AX=&H0F00
  1201.  Call Interrupt(&H10,Inregs,Outregs)
  1202.  Video.Page=Outregs.BX
  1203.  Var=False
  1204.  Count=False
  1205.  Temp$=Command$
  1206.  Local.Mode=False
  1207.  Local.Avatar=False
  1208.  If Config2(84) And Config2(85) Then
  1209.     Local.Avatar=True
  1210.  Endif
  1211.  If Temp$="?" Or Temp$="HELP" Then
  1212.     Call Boot.Usage
  1213.  Endif
  1214.  If Temp$=Nul Then
  1215.     Call Boot.Usage
  1216.  Endif
  1217.  Var1=Instr(Temp$,"NAME="+Quote$)
  1218.  If Var1 Then
  1219.     Var1$=Left$(Temp$,Var1-1)
  1220.     Temp2$=Mid$(Temp$,Var1+6)
  1221.     Var2=Instr(Temp2$,Quote$)
  1222.     If Var2 Then
  1223.        Temp$=Rtrim$(Var1$)+Mid$(Temp2$,Var2+1)
  1224.        Temp2$=Left$(Temp2$,Var2-1)
  1225.        If Temp2$<>Nul Then
  1226.           Bypass.CodeName=Temp2$
  1227.           Bypass.Login=True
  1228.           Var=True
  1229.        Endif
  1230.     Endif
  1231.  Endif
  1232.  While Len(Temp$)
  1233.     Var1=Instr(Temp$," ")
  1234.     If Var1=False Then
  1235.        Temp2$=Temp$
  1236.        Temp$=Nul
  1237.     Else
  1238.        Temp2$=Left$(Temp$,Var1-1)
  1239.        Temp$=Mid$(Temp$,Var1+1)
  1240.     Endif
  1241.     TempX=False
  1242.     Count=Count+1
  1243.     If Count=1 And Len(Temp2$)=1 Then
  1244.        Node=Asc(Temp2$)
  1245.        Noden=False
  1246.        If Node>=48 And Node<=57 Then
  1247.           Noden=Node-48
  1248.        Endif
  1249.        If Node>=65 And Node<=90 Then
  1250.           Noden=Node-55
  1251.        Endif
  1252.        If Noden=False Then
  1253.           Strng="NODE must range from 0-9, or A-Z."
  1254.           Call Error.Message
  1255.        Endif
  1256.        TempX=True
  1257.        Var=True
  1258.     Endif
  1259.     If Temp2$="BBS" Then
  1260.        TempX=True
  1261.        Var=True
  1262.     Endif
  1263.     If Temp2$="LOCAL" Then
  1264.        Local.Mode=True
  1265.        TempX=True
  1266.        Var=True
  1267.     Endif
  1268.     If Temp2$="BYPASS" Then
  1269.        Bypass.Screen=True
  1270.        TempX=True
  1271.        Var=True
  1272.     Endif
  1273.     If Temp2$="DISABLE" Then
  1274.        Disable.DM=True
  1275.        TempX=True
  1276.        Var=True
  1277.     Endif
  1278.     If Left$(Temp2$,3)="/P:" Then
  1279.        If Len(Temp2$)=4 Then
  1280.           VarP=Val(Mid$(Temp2$,4,1))
  1281.           If VarP>=1 And Varp<=8 Then
  1282.              Port.Override=VarP
  1283.              TempX=True
  1284.              Var=True
  1285.           Endif
  1286.        Endif
  1287.     Endif
  1288.     If Left$(Temp2$,3)="/T:" Then
  1289.        Time.Override=Int(Val(Mid$(Temp2$,4)))
  1290.        TempX=True
  1291.        Var=True
  1292.     Endif
  1293.     If TempX=False Then
  1294.        Call Boot.Usage
  1295.     Endif
  1296.  Wend
  1297.  If Var=False Then
  1298.     Call Boot.Usage
  1299.  Endif
  1300. 10321
  1301.  Exit Sub
  1302. 10322
  1303.  Resume 10321
  1304. End Sub
  1305.  
  1306. Sub Boot.Usage
  1307.  On Local Error Goto 10332
  1308.  Return$=Chr$(13)+Chr$(10)
  1309.  Strng="DNDBBS usage:"+Return$
  1310.  Call Put.Screen(Strng)
  1311.  Strng="   DNDBBS [node] <boot> (flag)"+Return$
  1312.  Call Put.Screen(Strng)
  1313.  Strng="       [node] is optional (0 to 9, or A to Z),"+Return$
  1314.  Call Put.Screen(Strng)
  1315.  Strng="       <boot> is bbs, local, bypass, disable, and/or, "+_
  1316.  "name="+Chr$(34)+"username"+Chr$(34)+","+Return$
  1317.  Call Put.Screen(Strng)
  1318.  Strng="       (flag) is optional:"+Return$
  1319.  Call Put.Screen(Strng)
  1320.  Strng="          /P:n where n is port override (1-8), and/or,"+Return$
  1321.  Call Put.Screen(Strng)
  1322.  Strng="          /T:n where n is time limit (in minutes)."
  1323.  Call Put.Screen(Strng)
  1324. 10331
  1325.  End
  1326. 10332
  1327.  Resume 10331
  1328. End Sub
  1329.  
  1330. Sub Shell.Program(Var$,Var1,Var2)
  1331.  On Local Error Goto 10342
  1332.  If Logged.In=False Then
  1333.     Call Clear.Screen
  1334.  Endif
  1335.  If Logged.In Then
  1336.     Put 3,User.Index,UserRecord
  1337.     Call Status.Line(-2)
  1338.  Endif
  1339.  Close #13
  1340.  Open Temp.FileName For Output Shared As #13
  1341.  Temp=Color.Code
  1342.  If Local.Mode Then
  1343.     If Local.Avatar Then
  1344.        Temp=Avatar.Code
  1345.     Endif
  1346.  Else
  1347.     If Extended.ANSI Then
  1348.        Temp=Avatar.Code
  1349.     Endif
  1350.  Endif
  1351.  Print #13,Temp
  1352.  Close
  1353.  Chained=False
  1354.  Var2$=DND.Path+Var$
  1355.  If Config2(83)=False Then
  1356.     Remote=Local.Mode
  1357.     Local.Mode=Var1
  1358.     Shelled=Var2
  1359.     Chained=True
  1360.     Chain Var2$
  1361.  Endif
  1362.  Var2$=Var2$+" "+Ltrim$(Str$(Var1))+" "
  1363.  If Node Then
  1364.     Var2$=Var2$+Chr$(Node)
  1365.  Else
  1366.     Var2$=Var2$+"-1"
  1367.  Endif
  1368.  Shell Var2$
  1369.  If Max.Row=22 Then
  1370.     Locate 23,1,1
  1371.     Strng=Nul
  1372.     Call IO.O
  1373.  Endif
  1374.  Call Get.Config
  1375.  Call Open.Files
  1376.  Call Read.Data
  1377.  If Logged.In Then
  1378.     Get 3,User.Index,UserRecord
  1379.     Call Status.Line(1)
  1380.     Call Display.Room
  1381.  Endif
  1382. 10341
  1383.  Exit Sub
  1384. 10342
  1385.  Resume 10341
  1386. End Sub
  1387.  
  1388. Sub Top.Ten
  1389.  On Local Error Goto 10354
  1390.  Put 3,User.Index,UserRecord
  1391.  Strng="(hit <control-k> to interrupt).."
  1392.  Call IO.O
  1393.  Graphics.Off=True
  1394.  TempX=Lof(3)/Len(UserRecord)
  1395.  Redim Temp.Array1(1 To TempX) As Integer,_
  1396.        Temp.ArrayZ(1 To TempX) As Double
  1397.  Strng="DNDBBS V"+Version$+" Top Ten Player Rankings For "+_
  1398.  Left$(FNclock$,13)+"."
  1399.  Call IO.O
  1400.  Strng=Nul
  1401.  Call IO.O
  1402.  TempZ=False
  1403.  For Temp.User.Index=1 To TempX
  1404.     Get 3,Temp.User.Index,UserRecord
  1405.     Strng=UserRecord.CodeName
  1406.     Call Decrypt(Strng)
  1407.     If (UserRecord.Flags And Locked.User)=False Then
  1408.        If Left$(Strng,9)<>Deleted$ Then
  1409.           If UserRecord.Level>1 Then
  1410.              TempZ=TempZ+1
  1411.              Temp.Array1(TempZ)=Temp.User.Index
  1412. 10351        TempA#=UserRecord.PlayersKilled*UserRecord.Level*2+_
  1413.              UserRecord.MonstersKilled*UserRecord.Level
  1414. 10352        Temp.ArrayZ(TempZ)=TempA#
  1415.           Endif
  1416.        Endif
  1417.     Endif
  1418.  Next
  1419.  Call Sort.Array(TempZ,2)
  1420.  If TempZ>10 Then
  1421.     TempZ=10
  1422.  Endif
  1423.  Strng="Username                      Level Classname            Ranking"
  1424.  Call IO.O
  1425.  Strng=String$(64,"-")
  1426.  Call IO.O
  1427.  TempX=False
  1428.  Allow.Break=True
  1429.  For Temp1=1 To TempZ
  1430.     Get 3,Temp.Array1(Temp1),UserRecord
  1431.     Strng=UserRecord.CodeName
  1432.     Call Decrypt(Strng)
  1433.     Strng=Lcase$(Strng)
  1434.     Mid$(Strng,1,1)=Ucase$(Mid$(Strng,1,1))
  1435.     If UserRecord.Level>32000 Then
  1436.        Strng=Strng+"Ghod  "
  1437.     Else
  1438.        Strng=Strng+Str$(UserRecord.Level)
  1439.        Strng=Strng+Space$(6-Len(Str$(UserRecord.Level)))
  1440.     Endif
  1441.     Out2=UserRecord.ClassName
  1442.     Call Decrypt(Out2)
  1443.     Strng=Strng+Out2
  1444.     TempX=True
  1445.     Strng=Strng+Str$(Temp.ArrayZ(Temp1))
  1446.     Call IO.O
  1447.     If Break Then
  1448.        Exit For
  1449.     Endif
  1450.  Next
  1451.  Allow.Break=False
  1452.  If TempX=False Then
  1453.     Strng="No users have top scores."
  1454.     Call IO.O
  1455.  Endif
  1456.  Call More.Prompt
  1457.  Get 3,User.Index,UserRecord
  1458.  Redim Temp.Array1(1) As Integer,_
  1459.        Temp.ArrayZ(1) As Double
  1460. 10353
  1461.  Exit Sub
  1462. 10354
  1463.  If Erl=10351 Then
  1464.     Resume 10352
  1465.  Endif
  1466.  Resume 10353
  1467. End Sub
  1468.  
  1469. Sub Clean.UpdateFile
  1470.  On Local Error Goto 10362
  1471.  Close 13
  1472.  Open FileName For Input Shared As #13
  1473.  Line Input #13,Temp$
  1474.  Strng=FNclock$
  1475.  If Left$(Temp$,9)<>Mid$(Strng,5,9) Then
  1476.     Close 13
  1477.     Kill FileName
  1478.  Endif
  1479. 10361
  1480.  Exit Sub
  1481. 10362
  1482.  Resume 10361
  1483. End Sub
  1484.  
  1485. Sub Clear.LogFile
  1486.  On Local Error Goto 10372
  1487.  Close 13
  1488.  Open Log.FileName For Random Shared As #13 Len=Len(LogRecord)
  1489.  For Temp1=1 To Lof(13)/Len(LogRecord)
  1490.     Get 13,Temp1,LogRecord
  1491.     If LogRecord.User=User.Index Then
  1492.        LogRecord.User=False
  1493.        LogRecord.Message=Nul
  1494.        Put 13,Temp1,LogRecord
  1495.     Endif
  1496.  Next
  1497. 10371
  1498.  Exit Sub
  1499. 10372
  1500.  Resume 10371
  1501. End Sub
  1502.  
  1503. Sub Display.LogFile
  1504.  On Local Error Goto 10382
  1505.  Close 13
  1506.  Open Log.FileName For Random Shared As #13 Len=Len(LogRecord)
  1507.  For Temp1=1 To Lof(13)/Len(LogRecord)
  1508.     Get 13,Temp1,LogRecord
  1509.     If LogRecord.User=User.Index Then
  1510.        Strng=Rtrim$(LogRecord.Message)
  1511.        Call IO.O
  1512.        LogRecord.User=False
  1513.        LogRecord.Message=Nul
  1514.        Put 13,Temp1,LogRecord
  1515.     Endif
  1516.  Next
  1517. 10381
  1518.  Exit Sub
  1519. 10382
  1520.  Resume 10381
  1521. End Sub
  1522.  
  1523. Sub More.Prompt
  1524.  On Local Error Goto 10392
  1525.  Strng=More$
  1526.  Line.Length=1
  1527.  No.Echo=True
  1528.  Call IO.I
  1529. 10391
  1530.  Exit Sub
  1531. 10392
  1532.  Resume 10391
  1533. End Sub
  1534.  
  1535. Sub IO.O
  1536.  On Local Error Goto 10402
  1537.  Static Wrap.Limit
  1538.  If Lost.Carrier Then
  1539.     Exit Sub
  1540.  Endif
  1541.  If Color.Graphics Then
  1542.     Gosub Out.ANSI
  1543.  Endif
  1544.  If Carriage.Return=False Then
  1545.     If Carriage.Input=False Then
  1546.        Strng=Rtrim$(Strng)
  1547.     Endif
  1548.  Endif
  1549.  Break=False
  1550.  For Count=1 To Len(Strng)
  1551.     Call Keyboard(Var)
  1552.     If Chat.Flag Then
  1553.        Chat.Flag=False
  1554.        Exit Sub
  1555.     Endif
  1556.     If Wrap.Limit>False Or Carriage.Return Then
  1557.        OutX$=Mid$(Strng,Count)
  1558.        If Instr(OutX$," ") Then
  1559.           OutX$=Left$(OutX$,Instr(OutX$," "))
  1560.        Endif
  1561.        If Wrap.Limit+Len(OutX$)>80 Then
  1562.           Call Line.Return
  1563.           Wrap.Limit=False
  1564.        Endif
  1565.        Wrap.Limit=Wrap.Limit+1
  1566.        If Mid$(Strng,Count,1)=" " Then
  1567.           If Wrap.Limit>79 Then
  1568.              Call Put.Modem(" ")
  1569.              Wrap.Limit=False
  1570.              Count=Count+1
  1571.           Endif
  1572.           If Wrap.Limit>78 Then
  1573.              Call Line.Return
  1574.              Wrap.Limit=False
  1575.              Count=Count+1
  1576.           Endif
  1577.        Endif
  1578.     Endif
  1579.     If Break Then
  1580.        Exit For
  1581.     Endif
  1582.     VarX$=Mid$(Strng,Count,1)
  1583.     Call Put.Modem(VarX$)
  1584.     Call Scrn(VarX$)
  1585.  Next
  1586.  If Carriage.Return=False Then
  1587.     If Carriage.Input=False Then
  1588.        Wrap.Limit=False
  1589.        Call Line.Return
  1590.     Endif
  1591.  Endif
  1592.  Strng=Nul
  1593.  Carriage.Return=False
  1594.  Carriage.Input=False
  1595.  Exit Sub
  1596.  
  1597. Out.ANSI:
  1598.  If Graphics.Off=False Then
  1599.     Color.Code=Color.Code+1
  1600.     Avatar.Code=Avatar.Code+1
  1601.     If Color.Code<31 Then
  1602.        Color.Code=31
  1603.     Endif
  1604.     If Avatar.Code<10 Then
  1605.        Avatar.Code=10
  1606.     Endif
  1607.     If Color.Code>35 Then
  1608.        Color.Code=31
  1609.     Endif
  1610.     If Avatar.Code>14 Then
  1611.        Avatar.Code=10
  1612.     Endif
  1613.     Call Screen.ANSI(4,Color.Code,Avatar.Code)
  1614.     Call Modem.ANSI(4,Color.Code,Avatar.Code)
  1615.  Endif
  1616.  If Graphics.Off Then
  1617.     Call Screen.ANSI(4,37,15)
  1618.     Call Modem.ANSI(4,37,15)
  1619.  Endif
  1620.  Return
  1621. 10401
  1622.  Exit Sub
  1623. 10402
  1624.  Resume 10401
  1625. End Sub
  1626.  
  1627. Sub IO.I
  1628.  On Local Error Goto 10412
  1629.  Static Var$
  1630.  If Lost.Carrier Then
  1631.     Exit Sub
  1632.  Endif
  1633.  Carriage.Input=True
  1634.  Line.Limit=Len(Strng)
  1635.  Strng=Strng+Var$
  1636.  Call IO.O
  1637.  Out2=Var$
  1638.  Var$=Nul
  1639.  Do
  1640.     Char$=Nul
  1641.     Timeout!=Timer+Config2(56)
  1642.     Do While Char$=Nul And Not Lost.Carrier
  1643.        If Timeout!<=Timer Then
  1644.           Call Hang.Up(1)
  1645.           Exit Sub
  1646.        Endif
  1647.        If Timer>=Timeon Then
  1648.           Temp.Time=Timer-Timeon
  1649.        Else
  1650.           Temp.Time=Timer+86400-Timeon
  1651.        Endif
  1652.        If Temp.Time>=Time.Left Then
  1653.           Call Hang.Up(2)
  1654.           Exit Sub
  1655.        Endif
  1656.        If Time.Left-Temp.Time<120 Then
  1657.           If Two.Minutes.Left=False Then
  1658.              Two.Minutes.Left=True
  1659.              Strng=Nul
  1660.              Call IO.O
  1661.              Call Put.Modem(Chr$(7))
  1662.              Strng="Two Minutes Left!"
  1663.              Call IO.O
  1664.              Exit Sub
  1665.           Endif
  1666.        Endif
  1667.        Call Keyboard(Var)
  1668.        If Var Then
  1669.           Strng=Nul
  1670.           Call IO.O
  1671.           Exit Sub
  1672.        Endif
  1673.        If Chat.Flag Then
  1674.           Chat.Flag=False
  1675.           Exit Sub
  1676.        Endif
  1677.        Call Get.Modem
  1678.        If Len(Buffer) Then
  1679.           Char$=Left$(Buffer,1)
  1680.           Buffer=Mid$(Buffer,2)
  1681.        Endif
  1682.     Loop
  1683.     Char=Asc(Char$)
  1684.     Select Case Char
  1685.     Case 8
  1686.        If Len(Out2) Then
  1687.           Out2=Left$(Out2,Len(Out2)-1)
  1688.           Call Back.Space
  1689.        Endif
  1690.     Case 13
  1691.        If Out2=Nul Then
  1692.           If Len(No.Input.Out) Then
  1693.              Out2=No.Input.Out
  1694.              OutY$=Lcase$(No.Input.Out)
  1695.              Call Scrn(OutY$)
  1696.              Call Put.Modem(OutY$)
  1697.           Endif
  1698.        Endif
  1699.        Call Scrn(Chr$(13))
  1700.        Call Put.Modem(Chr$(13))
  1701.        Exit Do
  1702.     Case 32 To 127
  1703.        VarX$=Char$
  1704.        If No.Echo=False Then
  1705.           If Hide Then
  1706.              VarX$=Mask$
  1707.           Endif
  1708.           Call Put.Modem(VarX$)
  1709.           If Word.Wrap=False Then
  1710.              Call Scrn(VarX$)
  1711.           Endif
  1712.        Endif
  1713.        Out2=Out2+Char$
  1714.        Select Case Word.Wrap
  1715.        Case True
  1716.           Select Case Len(Out2)+Line.Limit
  1717.           Case 0 To 78
  1718.              Call Scrn(VarX$)
  1719.           Case Else
  1720.              TempX=False
  1721.              Word=False
  1722.              For TempY=Len(Out2) To 1 Step -1
  1723.                 If Mid$(Out2,TempY,1)=" " Then
  1724.                    For Var=1 To TempX
  1725.                       Call Back.Space
  1726.                    Next
  1727.                    Var$=Mid$(Out2,TempY+1)
  1728.                    Out2=Left$(Out2,TempY)
  1729.                    Call Scrn(Chr$(13))
  1730.                    Word=True
  1731.                    Exit For
  1732.                 Endif
  1733.                 TempX=TempX+1
  1734.              Next
  1735.              If Word=False Then
  1736.                 Call Scrn(Chr$(13))
  1737.              Endif
  1738.              Call Put.Modem(Chr$(13))
  1739.              Exit Do
  1740.           End Select
  1741.        Case False
  1742.           If Line.Length>False Then
  1743.              If Len(Out2)>=Line.Length Then
  1744.                 Call Scrn(Chr$(13))
  1745.                 Call Put.Modem(Chr$(13))
  1746.                 Exit Do
  1747.              Endif
  1748.           Endif
  1749.        End Select
  1750.     End Select
  1751.  Loop
  1752.  Strng=Nul
  1753.  No.Echo=False
  1754.  No.Input=False
  1755.  Line.Length=False
  1756.  If Out2=Nul Then
  1757.     No.Input=True
  1758.  Endif
  1759.  No.Input.Out=Nul
  1760.  Call Put.Modem(Chr$(10))
  1761.  Var1$=Left$(Out2,1)
  1762.  Yes=Ucase$(Var1$)="Y"
  1763.  No=Ucase$(Var1$)="N"
  1764. 10411
  1765.  Exit Sub
  1766. 10412
  1767.  Resume 10411
  1768. End Sub
  1769.  
  1770. Sub Put.Modem(Var$)
  1771.  On Local Error Goto 10422
  1772.  If Local.Mode Then
  1773.     Exit Sub
  1774.  Endif
  1775.  If Lost.Carrier Then
  1776.     Exit Sub
  1777.  Endif
  1778.  For Count=1 To Len(Var$)
  1779.     Call Check.Carrier
  1780.     If Allow.Break Then
  1781.        Call Driver(11)
  1782.        If (Outregs.AX And &H0001)=1 Then
  1783.           If Wait.Mode Or Auto.Mode Or Follow.Mode Then
  1784.              Auto.Break=True
  1785.           Else
  1786.              Break=True
  1787.           Endif
  1788.           Exit For
  1789.        Endif
  1790.     Endif
  1791.     Call Get.Modem
  1792.     Inregs.AX=Asc(Mid$(Var$,Count,1))
  1793.     Call Driver(7)
  1794.  Next
  1795. 10421
  1796.  Exit Sub
  1797. 10422
  1798.  Resume 10421
  1799. End Sub
  1800.  
  1801. Sub Get.Modem
  1802.  On Local Error Goto 10432
  1803.  If Local.Mode Then
  1804.     Exit Sub
  1805.  Endif
  1806.  If Lost.Carrier Then
  1807.     Exit Sub
  1808.  Endif
  1809.  Call Check.Carrier
  1810.  Call Driver(6)
  1811.  Char=Outregs.AX And &HFF
  1812.  If Char<>&HFF Then
  1813.     Buffer=Buffer+Chr$(Char)
  1814.  Endif
  1815. 10431
  1816.  Exit Sub
  1817. 10432
  1818.  Resume 10431
  1819. End Sub
  1820.  
  1821. Sub Check.Carrier
  1822.  On Local Error Goto 10442
  1823.  If Lost.Carrier Then
  1824.     Exit Sub
  1825.  Endif
  1826.  Call Driver(5)
  1827.  If (Outregs.AX And &H80)=False Then
  1828.     Call Hang.Up(3)
  1829.     Exit Sub
  1830.  Endif
  1831. 10441
  1832.  Exit Sub
  1833. 10442
  1834.  Resume 10441
  1835. End Sub
  1836.  
  1837. Sub Keyboard(Var1)
  1838.  On Local Error Goto 10452
  1839.  VarX$=Inkey$
  1840.  Var1=False
  1841.  Select Case Len(VarX$)
  1842.  Case 0
  1843.     Exit Sub
  1844.  Case 1
  1845.     Var=Asc(VarX$)
  1846.     Select Case Var
  1847.     Case 8, 13, 32 To 127
  1848.        Buffer=Buffer+VarX$
  1849.     Case 11
  1850.        If Allow.Break Then
  1851.           Break=True
  1852.           If Wait.Mode Or Auto.Mode Or Follow.Mode Then
  1853.              Auto.Break=True
  1854.           Endif
  1855.        Endif
  1856.     Case 27
  1857.        If Chat Then
  1858.           Chat.Flag=True
  1859.           Chat=False
  1860.        Else
  1861.           Call Status.Line(True)
  1862.        Endif
  1863.     End Select
  1864.  Case 2
  1865.     If Asc(Right$(VarX$,1))=79 Then
  1866.        Call Hang.Up(4)
  1867.        Exit Sub
  1868.     Endif
  1869.     If Local.Mode=False Then
  1870.        Func.Buffer=Right$(VarX$,1)
  1871.        Var1=True
  1872.     Endif
  1873.  End Select
  1874. 10451
  1875.  Exit Sub
  1876. 10452
  1877.  Resume 10451
  1878. End Sub
  1879.  
  1880. Sub Line.Return
  1881.  On Local Error Goto 10462
  1882.  Var$=Chr$(13)
  1883.  Call Scrn(Var$)
  1884.  Call Put.Modem(Var$)
  1885.  Var$=Chr$(10)
  1886.  Call Put.Modem(Var$)
  1887. 10461
  1888.  Exit Sub
  1889. 10462
  1890.  Resume 10461
  1891. End Sub
  1892.  
  1893. Sub Back.Space
  1894.  On Local Error Goto 10472
  1895.  Var$=Chr$(27)+"[D"+" "+Chr$(27)+"[D"
  1896.  Call Scrn(Var$)
  1897.  Var$=Chr$(8)+" "+Chr$(8)
  1898.  Call Put.Modem(Var$)
  1899. 10471
  1900.  Exit Sub
  1901. 10472
  1902.  Resume 10471
  1903. End Sub
  1904.  
  1905. Sub Function.Key(Var)
  1906.  On Local Error Goto 10482
  1907.  If Local.Mode Then
  1908.     Exit Sub
  1909.  Endif
  1910.  Strng=Nul
  1911.  Out2=Nul
  1912.  Select Case Var
  1913.  Case 59
  1914.     Strng="System Operator is using "+Config3(9)+"Edit. Please wait.."
  1915.     Call IO.O
  1916.     Call Shell.Program("edit.exe",True,True)
  1917.  Case 60
  1918.     Local.Mode=True
  1919.     Call Display.Memory
  1920.     Local.Mode=False
  1921.  Case 61
  1922.     Local.Mode=True
  1923.     Strng=Action.Prompt+Config3(9)+"DIS "
  1924.     Call IO.I
  1925.     Parsed.Command1=Ucase$(Out2)
  1926.     Call Discard.Object
  1927.     Local.Mode=False
  1928.  Case 62
  1929.     Local.Mode=True
  1930.     Strng=Action.Prompt+Config3(9)+"REDUCE "
  1931.     Call IO.I
  1932.     Parsed.Command1=Out2
  1933.     Call Reduce.Monsters
  1934.     Local.Mode=False
  1935.  Case 63
  1936.     Local.Mode=True
  1937.     Strng=Action.Prompt+Config3(9)+"CALL "
  1938.     Call IO.I
  1939.     Local.Mode=False
  1940.     Parsed.Command1=Out2
  1941.     Call Summon.Monster
  1942.  Case 64
  1943.     Local.Mode=True
  1944.     Strng=Action.Prompt+Config3(9)+"KILL "
  1945.     Call IO.I
  1946.     Local.Mode=False
  1947.     Parsed.Command1=Ucase$(Out2)
  1948.     Parsed.Command2=Parsed.Command1
  1949.     Call Kill.Monster
  1950.  Case 65
  1951.     Local.Mode=True
  1952.     Strng=Action.Prompt+Config3(9)+"TELE "
  1953.     Call IO.I
  1954.     Local.Mode=False
  1955.     Parsed.Command1=Out2
  1956.     Parsed.Command2=Parsed.Command1
  1957.     Call Teleport.User
  1958.  Case 66
  1959.     Call Invisibility
  1960.  Case 67
  1961.     Local.Mode=True
  1962.     Strng=Action.Prompt+Config3(9)+"GET "
  1963.     Call IO.I
  1964.     Local.Mode=False
  1965.     Out2=Ucase$(Out2)
  1966.     Stored.Parsed.Command2=Out2
  1967.     Call Drop.Object
  1968.  Case 68
  1969.     Local.Mode=True
  1970.     Call Link.Room
  1971.     Local.Mode=False
  1972.  Case 71
  1973.     Buffer=Nul
  1974.     Func.Buffer=Nul
  1975.     If Chat=False Then
  1976.        Chat=True
  1977.        Call Enter.Chat
  1978.     Endif
  1979.     Chat=False
  1980.  End Select
  1981.  Strng=Nul
  1982.  Out2=Nul
  1983. 10481
  1984.  Exit Sub
  1985. 10482
  1986.  Resume 10481
  1987. End Sub
  1988.  
  1989. Sub Hang.Up(Var)
  1990.  On Local Error Goto 10492
  1991.  If Lost.Carrier Then
  1992.     Exit Sub
  1993.  Endif
  1994.  Strng=Nul
  1995.  Out2=Nul
  1996.  Buffer=Nul
  1997.  Func.Buffer=Nul
  1998.  Timeon=Timer
  1999.  Time.Left=180
  2000.  Select Case Var
  2001.  Case 1
  2002.     Call IO.O
  2003.     OutZ="Connect timeout"
  2004.     Strng=OutZ+"!"
  2005.     Call IO.O
  2006.  Case 2
  2007.     Call IO.O
  2008.     OutZ="Time limit exceeded"
  2009.     Strng=OutZ+"!"
  2010.     Call IO.O
  2011.  Case 3
  2012.     OutZ="Lost carrier"
  2013.     If Lost.Carrier=False Then
  2014.        Strng=Chr$(13)+Chr$(10)+OutZ+"!"
  2015.        Call Scrn(Strng)
  2016.     Endif
  2017.     Strng=Nul
  2018.  Case 4
  2019.     Call IO.O
  2020.     OutZ="Forced logoff"
  2021.     Strng=OutZ+"!"
  2022.     Call IO.O
  2023.  Case 5
  2024.     Call IO.O
  2025.     OutZ="Call limit exceeded"
  2026.     Strng=OutZ+"!"
  2027.     Call IO.O
  2028.  Case 6
  2029.     Call IO.O
  2030.     Call Restriction.Notice
  2031.     OutZ="Call time restriction"
  2032.  Case 7
  2033.     Call IO.O
  2034.     OutZ="Illegal login attempt"
  2035.     Strng=OutZ+"!"
  2036.     Call IO.O
  2037.  Case 8
  2038.     Call IO.O
  2039.     OutZ="Password verification"
  2040.     Strng=OutZ+"!"
  2041.     Call IO.O
  2042.  Case 9
  2043.     Call IO.O
  2044.     OutZ="Not resurrected"
  2045.     Strng=OutZ+"!"
  2046.     Call IO.O
  2047.  Case 10
  2048.     Call IO.O
  2049.     OutZ="Nondescriptive data files"
  2050.     Strng=OutZ+"!"
  2051.     Call IO.O
  2052.  End Select
  2053. 10491
  2054.  Security.Guard=False
  2055.  Lost.Carrier=True
  2056.  Exit Sub
  2057. 10492
  2058.  Resume 10491
  2059. End Sub
  2060.  
  2061. Sub Restriction.Notice
  2062.  On Local Error Goto 10502
  2063.  Strng="Your calls are restricted from"
  2064.  Temp5=UserRecord.FromHour
  2065.  If Temp5>12 Then
  2066.     Strng=Strng+Str$(UserRecord.FromHour-12)
  2067.     Out2="pm"
  2068.  Else
  2069.     Strng=Strng+Str$(UserRecord.FromHour)
  2070.     Out2="am"
  2071.  Endif
  2072.  Strng=Strng+":"+Right$(Str$(UserRecord.FromMin+100),2)+Out2+" to"
  2073.  Temp5=UserRecord.ToHour
  2074.  If Temp5>12 Then
  2075.     Strng=Strng+Str$(UserRecord.ToHour-12)
  2076.     Out2="pm"
  2077.  Else
  2078.     Strng=Strng+Str$(UserRecord.ToHour)
  2079.     Out2="am"
  2080.  Endif
  2081.  Strng=Strng+":"+Right$(Str$(UserRecord.ToMin+100),2)+Out2+"."
  2082.  Call IO.O
  2083. 10501
  2084.  Exit Sub
  2085. 10502
  2086.  Resume 10501
  2087. End Sub
  2088.  
  2089. Sub Out.File(Var$)
  2090.  On Local Error Goto 10512
  2091.  Graphics.Off=True
  2092.  Allow.Break=True
  2093.  TempX=False
  2094.  TempZ=False
  2095.  Close 13
  2096.  Open Var$ For Input Shared As #13
  2097.  Do While Not Eof(13) And Not Lost.Carrier
  2098.     Line Input #13,Strng
  2099.     Call IO.O
  2100.     If Break Then
  2101.        Exit Do
  2102.     Endif
  2103.     TempX=TempX+1
  2104.     If TempX=23 Then
  2105.        TempX=False
  2106.        TempZ=TempZ+1
  2107.        Call More.Prompt
  2108.        If No Then
  2109.           Exit Do
  2110.        Endif
  2111.     Endif
  2112.  Loop
  2113.  Graphics.Off=False
  2114.  If TempZ>False Then
  2115.     If TempX>False Then
  2116.        Call More.Prompt
  2117.     Endif
  2118.  Endif
  2119. 10511
  2120.  Allow.Break=False
  2121.  Exit Sub
  2122. 10512
  2123.  Resume 10511
  2124. End Sub
  2125.  
  2126. Sub Read.DayFile(Var)
  2127.  On Local Error Goto 10522
  2128.  If Var Then
  2129.     FileName=Day.File.FileName
  2130.  Else
  2131.     FileName=Day.Log.FileName
  2132.  Endif
  2133.  Out5=FNclock$
  2134.  Out5=Mid$(Out5,5,9)
  2135.  TempX=False
  2136.  Strng="Dayfile for "+Out5+"."
  2137.  Call IO.O
  2138.  Graphics.Off=True
  2139.  Temp5=1
  2140.  Close 13
  2141.  Open FileName For Input Shared As #13
  2142.  Do While Not Eof(13) And Not Lost.Carrier
  2143.     Line Input #13,Strng
  2144.     If Left$(Strng,9)=Out5 Then
  2145.        Call IO.O
  2146.        TempX=True
  2147.        Temp5=Temp5+1
  2148.     Endif
  2149.     If Temp5=23 Then
  2150.        Temp5=False
  2151.        Call More.Prompt
  2152.        If No Then
  2153.           Exit Do
  2154.        Endif
  2155.     Endif
  2156.  Loop
  2157.  If TempX=False Then
  2158.     Strng="No dayfile log for "+Out5+"."
  2159.     Call IO.O
  2160.     Exit Sub
  2161.  Endif
  2162.  Strng=Nul
  2163.  Call IO.O
  2164.  Graphics.Off=False
  2165.  Strng="Press "+Enter$+" to continue:"
  2166.  Line.Length=1
  2167.  No.Echo=True
  2168.  Call IO.I
  2169.  No.Echo=False
  2170. 10521
  2171.  Exit Sub
  2172. 10522
  2173.  Resume 10521
  2174. End Sub
  2175.  
  2176. Sub Update.Dayfile(Var$,Var)
  2177.  On Local Error Goto 10532
  2178.  Temp$=UserRecord.CodeName
  2179.  Call Decrypt(Temp$)
  2180.  Temp$=Rtrim$(Temp$)
  2181.  Temp$=Lcase$(Temp$)
  2182.  If Temp$=Nul Then
  2183.     Temp$="(prelogin)"
  2184.  Endif
  2185.  Mid$(Temp$,1,1)=Ucase$(Mid$(Temp$,1,1))
  2186.  Mid$(Var$,1,1)=Ucase$(Mid$(Var$,1,1))
  2187.  TempX$=FNclock$
  2188.  TempX$=Mid$(TempX$,5,11)+Temp$+": "+Var$+"."
  2189.  FileName=Day.Log.FileName
  2190.  If Var Then
  2191.     FileName=Day.File.FileName
  2192.  Endif
  2193.  Close 13
  2194.  Open FileName For Append Shared As #13
  2195.  Print #13,TempX$
  2196. 10531
  2197.  Exit Sub
  2198. 10532
  2199.  Resume 10531
  2200. End Sub
  2201.  
  2202. Sub Update.Mess(Var)
  2203.  On Local Error Goto 10542
  2204.  If Node<=False Then
  2205.     Exit Sub
  2206.  Endif
  2207.  Call Zero.Node(Noden+1)
  2208.  Select Case Var
  2209.  Case True
  2210.     Exit Sub
  2211.  Case 1
  2212.     MessWorkRecord1.UserName="Login"
  2213.  Case 2
  2214.     MessWorkRecord1.UserName="Relogin"
  2215.  Case 3
  2216.     MessWorkRecord1.UserName="Logoff"
  2217.  Case 4
  2218.     Strng=UserRecord.CodeName
  2219.     Call Decrypt(Strng)
  2220.     MessWorkRecord1.UserName=Strng
  2221.  End Select
  2222.  Strng=UserRecord.ClassName
  2223.  Call Decrypt(Strng)
  2224.  MessWorkRecord1.ClassName=Strng
  2225.  MessWorkRecord1.TimeOn=Time.On
  2226.  MessWorkRecord1.LastCommand=Last.Command
  2227.  MessWorkRecord1.RoomNumber=Room
  2228.  MessWorkRecord1.UserIndex=User.Index
  2229.  MessWorkRecord1.Level=UserRecord.Level
  2230.  MessWorkRecord1.Fatigue=UserRecord.Fatigue
  2231.  MessWorkRecord1.FatigueMax=UserRecord.FatigueMax
  2232.  MessWorkRecord1.Vitality=UserRecord.Vitality
  2233.  MessWorkRecord1.VitalityMax=UserRecord.VitalityMax
  2234.  MessWorkRecord1.Magic=UserRecord.Magic
  2235.  MessWorkRecord1.MagicMax=UserRecord.MagicMax
  2236.  MessWorkRecord1.Psionic=UserRecord.Psionic
  2237.  MessWorkRecord1.PsionicMax=UserRecord.PsionicMax
  2238.  MessWorkRecord1.Gold=UserRecord.Gold
  2239.  MessWorkRecord1.Experience=UserRecord.Experience
  2240.  MessWorkRecord1.Align1=UserRecord.Align1
  2241.  MessWorkRecord1.Align2=UserRecord.Align2
  2242.  For Var1=1 To 7
  2243.     MessWorkRecord1.Stats(Var1)=UserRecord.Stats(Var1)
  2244.  Next
  2245.  For Var1=1 To 4
  2246.     MessWorkRecord1.Weapons(Var1)=UserRecord.Weapons(Var1)
  2247.  Next
  2248.  MessWorkRecord1.Invisible=UserRecord.Invisible
  2249.  MessWorkRecord1.ClassType=UserRecord.ClassType
  2250.  MessWorkRecord1.Score1=Players.Killed
  2251.  MessWorkRecord1.Score2=Monsters.Killed
  2252.  MessWorkRecord1.Race=UserRecord.Race
  2253.  For Var1=1 To 20
  2254.     MessWorkRecord1.Treasure(Var1)=False
  2255.  Next
  2256.  For Var1=1 To 20
  2257.     MessWorkRecord1.TreasureCharges(Var1)=False
  2258.  Next
  2259.  MessWorkRecord1.NextRecord=True
  2260.  Put 1,Noden+1,MessWorkRecord1
  2261.  Var2=Noden+1
  2262.  Var1=False
  2263.  For VarX=1 To Number.Inventory
  2264.     If Var1=20 Then
  2265.        Var1=False
  2266.        Put 1,Var2,MessWorkRecord1
  2267.        Var3=Var2
  2268.        Var2=36
  2269.        Do
  2270.           Var2=Var2+1
  2271.           Get 1,Var2,MessWorkRecord1
  2272.           If MessWorkRecord1.NextRecord=False Then
  2273.              Exit Do
  2274.           Endif
  2275.           If Var2>Lof(1)/Len(MessWorkRecord1) Then
  2276.              Exit Do
  2277.           Endif
  2278.        Loop
  2279.        Get 1,Var3,MessWorkRecord1
  2280.        MessWorkRecord1.NextRecord=Var2
  2281.        Put 1,Var3,MessWorkRecord1
  2282.        Call Zero.Node(Var2)
  2283.        MessWorkRecord1.NextRecord=True
  2284.     Endif
  2285.     Var1=Var1+1
  2286.     MessWorkRecord1.Treasure(Var1)=Treasure(VarX)
  2287.     MessWorkRecord1.TreasureCharges(Var1)=Treasure.Charges(VarX)
  2288.  Next
  2289.  Put 1,Var2,MessWorkRecord1
  2290. 10541
  2291.  Exit Sub
  2292. 10542
  2293.  Resume 10541
  2294. End Sub
  2295.  
  2296. Sub Zero.Node(Var)
  2297.  On Local Error Goto 10552
  2298.  Get 1,Var,MessWorkRecord1
  2299.  MessWorkRecord1.UserName="<offline>"
  2300.  MessWorkRecord1.ClassName="<offline>"
  2301.  MessWorkRecord1.TimeOn=Nul
  2302.  MessWorkRecord1.LastCommand=Nul
  2303.  MessWorkRecord1.RoomNumber=False
  2304.  MessWorkRecord1.UserIndex=False
  2305.  MessWorkRecord1.Level=False
  2306.  MessWorkRecord1.Fatigue=False
  2307.  MessWorkRecord1.FatigueMax=False
  2308.  MessWorkRecord1.Vitality=False
  2309.  MessWorkRecord1.VitalityMax=False
  2310.  MessWorkRecord1.Magic=False
  2311.  MessWorkRecord1.MagicMax=False
  2312.  MessWorkRecord1.Psionic=False
  2313.  MessWorkRecord1.PsionicMax=False
  2314.  MessWorkRecord1.Gold=False
  2315.  MessWorkRecord1.Experience=False
  2316.  MessWorkRecord1.Align1=False
  2317.  MessWorkRecord1.Align2=False
  2318.  For Var1=1 To 7
  2319.     MessWorkRecord1.Stats(Var1)=False
  2320.  Next
  2321.  For Var1=1 To 4
  2322.     MessWorkRecord1.Weapons(Var1)=False
  2323.  Next
  2324.  MessWorkRecord1.Invisible=False
  2325.  MessWorkRecord1.ClassType=False
  2326.  MessWorkRecord1.Race=False
  2327.  For Var1=1 To 20
  2328.     MessWorkRecord1.Treasure(Var1)=False
  2329.  Next
  2330.  For Var1=1 To 20
  2331.     MessWorkRecord1.TreasureCharges(Var1)=False
  2332.  Next
  2333.  Var2=MessWorkRecord1.NextRecord
  2334.  MessWorkRecord1.NextRecord=False
  2335.  Var3=Lof(1)/Len(MessWorkRecord1)
  2336.  If Var3<36 Then
  2337.     Var3=Var3+1
  2338.     Put 1,Var3,MessWorkRecord1
  2339.     Call Zero.Node(Var3)
  2340.  Endif
  2341.  Put 1,Var,MessWorkRecord1
  2342.  If Var2>False Then
  2343.     Call Zero.Node(Var2)
  2344.  Endif
  2345. 10551
  2346.  Exit Sub
  2347. 10552
  2348.  Resume 10551
  2349. End Sub
  2350.     
  2351. Sub Read.Status
  2352.  On Local Error Goto 10562
  2353.  Strng="(hit <control-k> to interrupt).."
  2354.  Call IO.O
  2355.  Graphics.Off=True
  2356.  Strng="DNDBBS V"+Version$+" Status Report For "+Left$(FNclock$,13)+"."
  2357.  Call IO.O
  2358.  Strng=Nul
  2359.  Call IO.O
  2360.  Strng="P# Username                       Timeon   Last Command    Classname"
  2361.  Call IO.O
  2362.  Strng=String$(68,"-")
  2363.  Call IO.O
  2364.  If Node=False Then
  2365.     Out2=Last.Command
  2366.     Out2=Left$(Out2,15)
  2367.     Out2=Rtrim$(Out2)
  2368.     Out2=Lcase$(Out2)
  2369.     Mid$(Out2,1,1)=Ucase$(Mid$(Out2,1,1))
  2370.     Out2=Out2+Space$(15-Len(Out2))
  2371.     Strng=UserRecord.CodeName
  2372.     Call Decrypt(Strng)
  2373.     Strng=Rtrim$(Strng)
  2374.     Strng=Lcase$(Strng)
  2375.     Mid$(Strng,1,1)=Ucase$(Mid$(Strng,1,1))
  2376.     Strng=Strng+Space$(30-Len(Strng))
  2377.     Strng=Mask$+Mask$+" "+Strng+" "+Time.On+" "+Out2+" "
  2378.     Out2=UserRecord.ClassName
  2379.     Call Decrypt(Out2)
  2380.     Strng=Strng+Out2
  2381.     Call IO.O
  2382.     Call More.Prompt
  2383.     Exit Sub
  2384.  Endif
  2385.  Temp3=3
  2386.  Allow.Break=True
  2387.  For Temp5=1 To 36
  2388.     Get 1,Temp5,MessWorkRecord1
  2389.     If MessWorkRecord1.UserIndex>False Then
  2390.        Strng=MessWorkRecord1.UserName
  2391.        Strng=Rtrim$(Strng)
  2392.        If Left$(Strng,9)<>"<offline>" Then
  2393.           Strng=Lcase$(Strng)
  2394.           Mid$(Strng,1,1)=Ucase$(Mid$(Strng,1,1))
  2395.           Out2=MessWorkRecord1.LastCommand
  2396.           Out2=Left$(Out2,15)
  2397.           Out2=Rtrim$(Out2)
  2398.           Out2=Lcase$(Out2)
  2399.           Mid$(Out2,1,1)=Ucase$(Mid$(Out2,1,1))
  2400.           Out2=Out2+Space$(15-Len(Out2))
  2401.           Out3=MessWorkRecord1.ClassName
  2402.           Out3=Rtrim$(Out3)
  2403.           Strng=Strng+Space$(30-Len(Strng))
  2404.           Strng=Strng+" "+MessWorkRecord1.TimeOn+" "+Out2+" "+Out3
  2405.           If Temp5<=10 Then
  2406.              Strng="P"+Mid$(Str$(Temp5-1),2)+" "+Strng
  2407.           Else
  2408.              Strng="P"+Chr$(Temp5+54)+" "+Strng
  2409.           Endif
  2410.           Call IO.O
  2411.           If Break Then
  2412.              Exit For
  2413.           Endif
  2414.           Temp3=Temp3+1
  2415.           If Temp3=21 Then
  2416.              Temp3=False
  2417.              Call More.Prompt
  2418.              If No Then
  2419.                 Exit For
  2420.              Endif
  2421.           Endif
  2422.        Endif
  2423.     Endif
  2424.  Next
  2425.  Allow.Break=False
  2426.  If Temp3>False Then
  2427.     Call More.Prompt
  2428.  Endif
  2429. 10561
  2430.  Exit Sub
  2431. 10562
  2432.  Resume 10561
  2433. End Sub
  2434.  
  2435. Sub Read.Mess
  2436.  On Local Error Goto 10572
  2437.  If Node<=False Then
  2438.     Exit Sub
  2439.  Endif
  2440.  Var1=False
  2441.  Redim Temp.ArrayS(1 To 10) As String,_
  2442.        Temp.Array1(1 To 10) As Integer,_
  2443.        Temp.Array2(1 To 10) As Integer,_
  2444.        Temp.ArrayX(1 To 10) As Single
  2445.  Graphics.Off=True
  2446.  TempQ=False
  2447.  Get 1,Noden+1,MessWorkRecord1
  2448.  If Left$(MessWorkRecord1.LastCommand,6)="<dead>" Then
  2449.     TempQ=True
  2450.  Endif
  2451.  If MessWorkRecord1.OfferTime=True Then
  2452.     If TempQ=False Then
  2453.        Strng="The offer was accepted!"
  2454.        Call IO.O
  2455.     Endif
  2456.     Var1=MessWorkRecord1.GoldOffer
  2457.     If Var1>False Then
  2458.        Var2=True
  2459.        UserRecord.Gold=UserRecord.Gold-Var1
  2460.        If UserRecord.Gold<False Then
  2461.           UserRecord.Gold=False
  2462.           Var2=False
  2463.        Endif
  2464.     Else
  2465.        Var=False
  2466.        For Temp5=1 To Number.Inventory
  2467.           If Treasure(Temp5)=MessWorkRecord1.ItemOffer Then
  2468.              Var2=True
  2469.              Call Discard(Temp5,True)
  2470.              Exit For
  2471.           Endif
  2472.        Next
  2473.     Endif
  2474.     If Var2=False Then
  2475.        If TempQ=False Then
  2476.           Strng="You don't have the items to trade!"
  2477.           Call IO.O
  2478.       Endif
  2479.     Else
  2480.        Var1=MessWorkRecord1.GoldFor
  2481.        If Var1>False Then
  2482.           UserRecord.Gold=UserRecord.Gold+Var1
  2483.        Else
  2484.           Temp7=MessWorkRecord1.ItemFor
  2485.           Temp6=MessWorkRecord1.ForCharges
  2486.           Call Add.Inventory(Temp7,Temp6)
  2487.        Endif
  2488.     Endif
  2489.     MessWorkRecord1.OfferTime=False
  2490.     Put 1,Noden+1,MessWorkRecord1
  2491.  Endif
  2492.  If MessWorkRecord1.OfferTime>False Then
  2493.     If Timer>MessWorkRecord1.OfferTime Then
  2494.        MessWorkRecord1.OfferTime=False
  2495.        Put 1,Noden+1,MessWorkRecord1
  2496.        If TempQ=False Then
  2497.           Strng="Offer expired."
  2498.           Call IO.O
  2499.        Endif
  2500.     Endif
  2501.  Endif
  2502.  For Var=1 To Lof(2)/Len(MessWorkRecord2)
  2503.     If Var1=10 Then
  2504.        Exit For
  2505.     Endif
  2506.     Get 2,Var,MessWorkRecord2
  2507.     If Mid$(MessWorkRecord2.Flags,Noden+1,1)="0" Then
  2508.        If TempQ Then
  2509.           Var1=1
  2510.        Else
  2511.           Var1=Var1+1
  2512.        Endif
  2513.        Out3=MessWorkRecord2.UserName
  2514.        Out3=Rtrim$(Out3)
  2515.        Out3=Lcase$(Out3)
  2516.        Mid$(Out3,1,1)=Ucase$(Mid$(Out3,1,1))
  2517.        Temp.Array2(Var1)=MessWorkRecord2.UserIndex
  2518.        Select Case MessWorkRecord2.MessageType
  2519.        Case 1
  2520.           Strng=Out3+" Sends: "+MessWorkRecord2.Message
  2521.        Case 2
  2522.           Strng=Out3+" Yells: "+MessWorkRecord2.Message
  2523.        Case 3
  2524.           Strng=Out3+" Says: "+MessWorkRecord2.Message
  2525.        Case 4
  2526.           Strng=Mask$+Mask$+Mask$+" "+Out3+": "+MessWorkRecord2.Message
  2527.        Case 5, 8
  2528.           Strng=MessWorkRecord2.Message
  2529.        Case 6
  2530.           Strng=Out3+" Sends to you: "+MessWorkRecord2.Message
  2531.        Case 7
  2532.           Strng=Out3+" Whispers: "+MessWorkRecord2.Message
  2533.        Case 9
  2534.           Strng=Out3
  2535.           Temp.Array2(Var1)=Cint(Val(Left$(MessWorkRecord2.Message,6)))
  2536.        Case 10
  2537.           Strng=Out3+" Transmits: "+MessWorkRecord2.Message
  2538.        Case 11
  2539.           Strng=Out3+": "+MessWorkRecord2.Message 
  2540.        Case 12, 14
  2541.           Strng=Out3+" aborted program!"
  2542.        Case 13
  2543.           Out2=MessWorkRecord2.Message
  2544.           Strng=Out3+Chr$(1)+Left$(Out2,Instr(2,Out2," "))
  2545.           Temp.Array2(Var1)=Val(Mid$(Out2,Instr(2,Out2," ")))
  2546.        Case 15
  2547.           Out2=MessWorkRecord2.Message
  2548.           Strng=Out3+Chr$(1)+Str$(Val(Out2))
  2549.        Case 16
  2550.           Strng=Out3
  2551.           Temp.Array2(Var1)=Val(MessWorkRecord2.Message)
  2552.        Case 17
  2553.           Strng="You were just struck dead!"
  2554.        Case 18
  2555.           Strng="You were just teleported elsewhere!"
  2556.           Temp.Array2(Var1)=Val(MessWorkRecord2.Message)
  2557.        Case 19
  2558.           Strng=Out3+" "+MessWorkRecord2.Message
  2559.        Case 20
  2560.           Strng=Out3+" loses you!"
  2561.           Temp.Array2(Var1)=MessWorkRecord2.UserIndex
  2562.        Case 21
  2563.           Strng=Out3+" launchs "+MessWorkRecord2.Message
  2564.           Strng=Rtrim$(Strng)
  2565.           Strng=Strng+" at you!"
  2566.        Case 22
  2567.           Strng=Out3+" fires "+MessWorkRecord2.Message
  2568.           Strng=Rtrim$(Strng)
  2569.           Strng=Strng+" at you!"
  2570.        Case 23
  2571.           Strng=Out3+" blesses you!"
  2572.        Case 24
  2573.           Strng=Out3+" curses you!"
  2574.        End Select
  2575.        Temp.ArrayS(Var1)=Rtrim$(Strng)
  2576.        Temp.Array1(Var1)=MessWorkRecord2.MessageType
  2577.        Temp.ArrayX(Var1)=MessWorkRecord2.MessageTime
  2578.        Mid$(MessWorkRecord2.Flags,Noden+1,1)="1"
  2579.        Node.Work.Array1(Var1)=MessWorkRecord2.Flags
  2580.        Put 2,Var,MessWorkRecord2
  2581.     Endif       
  2582.  Next
  2583.  If TempQ Then
  2584.     Exit Sub
  2585.  Endif
  2586.  If Var1=False Then
  2587.     Exit Sub
  2588.  Endif
  2589.  Call Sort.Array(Var1,3)
  2590.  For VarX=1 To Var1
  2591.     Select Case Temp.Array1(VarX)
  2592.     Case 9
  2593.        Strng=Temp.ArrayS(VarX)+" attacks you!"
  2594.        Call IO.O
  2595.        Strng=Temp.ArrayS(VarX)+" hits you for"
  2596.        Temp2=Temp.Array2(VarX)
  2597.        Call Player.Attack
  2598.        If UserRecord.Vitality<=False Then
  2599.           Exit For
  2600.        Endif
  2601.     Case 12, 14
  2602.        Strng=Temp.ArrayS(VarX)
  2603.        Call IO.O
  2604.        Call Abort
  2605.     Case 13
  2606.        Out2=Temp.ArrayS(VarX)
  2607.        Out2=Mid$(Out2,Instr(Out2,Chr$(1))+1)
  2608.        Out3=Temp.ArrayS(VarX)
  2609.        Out3=Left$(Out3,Instr(Out3,Chr$(1))-1)
  2610.        Temp=Val(Out2)
  2611.        If Temp>False And Temp<=Lof(8)/Len(TreasureRecord) Then
  2612.           Get 8,Temp,TreasureRecord
  2613.           Out2=TreasureRecord.TreasureName
  2614.           Out2=Rtrim$(Out2)
  2615.           Out2=Lcase$(Out2)
  2616.           Strng=Out3+" gives you "+Out2+"!"
  2617.           Call IO.O
  2618.           Temp8=Temp
  2619.           Temp9=Temp.Array2(VarX)
  2620.           Call Add.Inventory(Temp8,Temp9)
  2621.        Endif
  2622.     Case 15
  2623.        Out2=Temp.ArrayS(VarX)
  2624.        Out2=Mid$(Out2,Instr(Out2,Chr$(1))+1)
  2625.        Out3=Temp.ArrayS(VarX)
  2626.        Out3=Left$(Out3,Instr(Out3,Chr$(1))-1)
  2627.        Temp#=Val(Out2)
  2628.        Strng=Out3+" gives you"+Str$(Temp#)+" gold!"
  2629.        Call IO.O
  2630.        UserRecord.Gold=UserRecord.Gold+Temp#
  2631.     Case 16
  2632.        For Temp5=1 To Number.Inventory
  2633.           If Treasure(Temp5)=Temp.Array2(VarX) Then
  2634.              Get 8,Treasure(Temp5),TreasureRecord
  2635.              Out2=TreasureRecord.TreasureName
  2636.              Out2=Rtrim$(Out2)
  2637.              Out2=Lcase$(Out2)
  2638.              If Rnd>.66 Then
  2639.                 Out3=Temp.ArrayS(VarX)
  2640.                 Out3=Lcase$(Out3)
  2641.                 Strng="You catch "+Out3+" stealing "+Out2+" from you!"
  2642.                 Call IO.O
  2643.              Endif
  2644.              Call Discard(Temp5,True)
  2645.              Exit For
  2646.           Endif
  2647.        Next
  2648.     Case 17
  2649.        Message1="You were just killed!"
  2650.        Strng="was killed by the Ghods!"
  2651.        Call Update.DayFile(Strng,False)
  2652.        Call Player.Died
  2653.     Case 18
  2654.        Strng=Temp.ArrayS(VarX)
  2655.        Call IO.O
  2656.        Next.Room=Temp.Array2(VarX)
  2657.        Call Teleport
  2658.        Call Enter.Room
  2659.     Case 19
  2660.        Strng=Temp.ArrayS(VarX)
  2661.        Call IO.O
  2662.        Strng="Type 'Accept' to trade."
  2663.        Call IO.O
  2664.     Case 20
  2665.        If Follow.Mode Then
  2666.           If Temp.Array2(VarX)=TempB Then
  2667.              Strng=Temp.ArrayS(VarX)
  2668.              Call IO.O
  2669.              Auto.Break=True
  2670.           Endif
  2671.        Endif
  2672.     Case 23
  2673.        Strng=Temp.ArrayS(VarX)
  2674.        Call IO.O
  2675.        TempZ=False
  2676.        UserRecord.Stats(6)=UserRecord.Stats(6)+1
  2677.        If UserRecord.Stats(6)>Config2(31) Then
  2678.           UserRecord.Stats(6)=Config2(31)
  2679.           TempZ=True
  2680.        Endif
  2681.        Strng="You feel a glow about you!"
  2682.        If TempZ Then
  2683.           Strng="Nothing happens!"
  2684.        Endif
  2685.        Call IO.O
  2686.     Case 24
  2687.        Strng=Temp.ArrayS(VarX)
  2688.        Call IO.O
  2689.        Strng="You feel a darkening about you!"
  2690.        Call IO.O
  2691.        UserRecord.Stats(6)=UserRecord.Stats(6)-1
  2692.        If UserRecord.Stats(6)<False Then
  2693.           UserRecord.Stats(6)=False
  2694.        Endif
  2695.        Call New.Stats
  2696.        If UserRecord.Vitality<=False Then
  2697.           Exit For
  2698.        Endif
  2699.     Case Else
  2700.        Strng=Temp.ArrayS(VarX)
  2701.        Call IO.O
  2702.        If Temp.Array2(VarX)=User.Index Then
  2703.           If Temp.Array1(VarX)<4 Or Temp.Array1(VarX)=11 Then
  2704.              If Node.Work.Array1(VarX)=String$(36,"1") Then
  2705.                 Strng="Nobody else hears you!"
  2706.                 Call IO.O
  2707.              Endif
  2708.           Endif
  2709.        Endif
  2710.     End Select
  2711.  Next
  2712. 10571
  2713.  Exit Sub
  2714. 10572
  2715.  Resume 10571
  2716. End Sub
  2717.  
  2718. Sub Clear.Mess
  2719.  On Local Error Goto 10582
  2720.  If Node<=False Then
  2721.     Exit Sub
  2722.  Endif
  2723.  For Var=1 To Lof(2)/Len(MessWorkRecord2)
  2724.     Get 2,Var,MessWorkRecord2
  2725.     Mid$(MessWorkRecord2.Flags,Noden+1,1)="1"
  2726.     Put 2,Var,MessWorkRecord2
  2727.  Next
  2728. 10581
  2729.  Exit Sub
  2730. 10582
  2731.  Resume 10581
  2732. End Sub
  2733.  
  2734. Sub Send.Mess(Var1,Var2,Var3,Var1$)
  2735.  On Local Error Goto 10592
  2736.  If Node<False Then
  2737.     Exit Sub
  2738.  Endif
  2739.  If Node=False Then
  2740.     Select Case Var1
  2741.     Case 1, 2, 3, 10, 11
  2742.        Strng="Nobody else hears you."
  2743.        Call IO.O
  2744.     End Select
  2745.     Exit Sub
  2746.  Endif
  2747.  If Var1=8 Then
  2748.     If UserRecord.Invisible Then
  2749.        Exit Sub
  2750.     Endif
  2751.  Endif
  2752.  Temp$=String$(36,"0")
  2753.  For Temp4=0 To 35
  2754.     Hidden=False
  2755.     If Temp4=Noden Then
  2756.        Select Case Var1
  2757.        Case 1, 2, 3
  2758.           If Echo Then
  2759.              Hidden=True
  2760.              Strng="Message sent."
  2761.              Call IO.O
  2762.           Endif
  2763.        Case 4, 5
  2764.           Hidden=False
  2765.        Case 6
  2766.           Strng="Message sent."
  2767.           Call IO.O
  2768.           Hidden=True
  2769.        Case 7
  2770.           Strng="Whisper sent."
  2771.           Call IO.O
  2772.           Hidden=True
  2773.        Case 8
  2774.           Hidden=True
  2775.        Case 10
  2776.           Strng="Telepathic message sent."
  2777.           Call IO.O
  2778.           Hidden=True
  2779.        Case 11
  2780.           Strng="Telepathic message sent."
  2781.           Call IO.O
  2782.           If Echo Then
  2783.              Hidden=True
  2784.           Endif
  2785.        Case 12, 14
  2786.           Strng="Program abort sent."
  2787.           Call IO.O
  2788.        End Select
  2789.     Endif
  2790.     If Hidden=False Then
  2791.        Get 1,Temp4+1,MessWorkRecord1
  2792.        If Var1=14 Then
  2793.           If Temp4<>Var2 Then
  2794.              Hidden=True
  2795.           Endif
  2796.        Endif
  2797.        If Var2>False And MessWorkRecord1.UserIndex<>Var2 Then
  2798.           Hidden=True
  2799.        Endif
  2800.        If Var3>False And MessWorkRecord1.RoomNumber<>Var3 Then
  2801.           Hidden=True
  2802.        Endif
  2803.        If Var3<False Then
  2804.           Hidden=True
  2805.           If MessWorkRecord1.RoomNumber=Room Then
  2806.              Hidden=False
  2807.           Else
  2808.              For Temp5=1 To 11
  2809.                 If RoomRecord.Direct(Temp5)>False Then
  2810.                    If MessWorkRecord1.RoomNumber=RoomRecord.Direct(Temp5) Then
  2811.                       Hidden=False
  2812.                       Exit For
  2813.                    Endif
  2814.                 Endif
  2815.              Next
  2816.           Endif
  2817.        Endif
  2818.     Endif
  2819.     If MessWorkRecord1.UserIndex=False Then
  2820.        If MessWorkRecord1.RoomNumber=False Then
  2821.           Hidden=True
  2822.        Endif
  2823.     Endif
  2824.     If Hidden Then
  2825.        Mid$(Temp$,Temp4+1,1)="1"
  2826.     Endif
  2827.  Next
  2828.  If Temp$=String$(36,"1") Then
  2829.     Select Case Var1
  2830.     Case 1, 2, 3, 11
  2831.        Strng="Nobody else hears you!"
  2832.        Call IO.O
  2833.     End Select
  2834.     Exit Sub
  2835.  Endif
  2836.  For Var=1 To Lof(2)/Len(MessWorkRecord2)
  2837.     Get 2,Var,MessWorkRecord2
  2838.     If MessWorkRecord2.Flags=String$(36,"1") Then
  2839.        Exit For
  2840.     Endif
  2841.     If Timer>MessWorkRecord2.MessageTime Then
  2842.        Exit For
  2843.     Endif
  2844.  Next
  2845.  Strng=UserRecord.CodeName
  2846.  Call Decrypt(Strng)
  2847.  MessWorkRecord2.UserName=Strng
  2848.  MessWorkRecord2.MessageType=Var1
  2849.  MessWorkRecord2.UserIndex=User.Index
  2850.  MessWorkRecord2.RoomNumber=Room
  2851.  MessWorkRecord2.Message=Var1$
  2852.  MessWorkRecord2.MessageTime=Timer+30!
  2853.  MessWorkRecord2.Flags=Temp$
  2854.  Put 2,Var,MessWorkRecord2
  2855. 10591
  2856.  Exit Sub
  2857. 10592
  2858.  Resume 10591
  2859. End Sub
  2860.  
  2861. Sub Search.Mess(Var)
  2862.  On Local Error Goto 10602
  2863.  Temp=False
  2864.  If Node<=False Then
  2865.     Exit Sub
  2866.  Endif
  2867.  For VarX=1 To 36
  2868.     Get 1,VarX,MessWorkRecord1
  2869.     Strng=Rtrim$(MessWorkRecord1.UserName)
  2870.     Call Valid.Name(Strng)
  2871.     TempB=MessWorkRecord1.UserIndex
  2872.     TempC=VarX
  2873.     Select Case Var
  2874.     Case True
  2875.        Node.Work.Array1(VarX)=Nul
  2876.        Node.Work.Array2(VarX)=False
  2877.        If MessWorkRecord1.RoomNumber=Room And TempA Then
  2878.           Node.Work.Array1(VarX)=Lcase$(Strng)
  2879.           Node.Work.Array2(VarX)=MessWorkRecord1.Level
  2880.        Endif
  2881.     Case False
  2882.        If TempA Then
  2883.           Strng=MessWorkRecord1.UserName
  2884.           Strng=Rtrim$(Strng)
  2885.           Strng=Lcase$(Strng)
  2886.           Out4=Lcase$(Parsed.Command1)
  2887.           If Left$(Strng,Len(Out4))=Out4 Then
  2888.              Temp=MessWorkRecord1.RoomNumber
  2889.              Exit Sub
  2890.           Endif
  2891.        Endif
  2892.     Case Else
  2893.        If MessWorkRecord1.UserIndex=Var And TempA Then
  2894.           Temp=MessWorkRecord1.RoomNumber
  2895.           Exit Sub
  2896.        Endif
  2897.     End Select
  2898.  Next
  2899. 10601
  2900.  Exit Sub
  2901. 10602
  2902.  Resume 10601
  2903. End Sub
  2904.  
  2905. Sub Expand.Inventory
  2906.  On Local Error Goto 10612
  2907.  Treasure.Max=Treasure.Max+20
  2908.  Redim Preserve Treasure(1 To Treasure.Max) As Integer,_
  2909.        Treasure.Charges(1 To Treasure.Max) As Integer
  2910.  Strng="Only the first 15 items will be stored when you log off."
  2911.  Call IO.O
  2912. 10611
  2913.  Exit Sub
  2914. 10612
  2915.  Resume 10611
  2916. End Sub
  2917.  
  2918. Sub Expand.Room
  2919.  On Local Error Goto 10622
  2920.  Room.Treasure.Max=Room.Treasure.Max+30
  2921.  Redim Preserve Room.Inventory(1 To Room.Treasure.Max) As Integer,_
  2922.        Room.Inventory.Charges(1 To Room.Treasure.Max) As Integer
  2923. 10621
  2924.  Exit Sub
  2925. 10622
  2926.  Resume 10621
  2927. End Sub
  2928.  
  2929. Sub Expand.Monsters
  2930.  On Local Error Goto 10632
  2931.  Number.MonstersMax=Number.MonstersMax+25
  2932.  Redim Preserve MonsterArray(1 To Number.MonstersMax) As MonsterType,_
  2933.        MonsterIndex(1 To Number.MonstersMax) As Integer
  2934. 10631
  2935.  Exit Sub
  2936. 10632
  2937.  Resume 10631
  2938. End Sub
  2939.  
  2940. Sub Expand.Users
  2941.  On Local Error Goto 10642
  2942.  Number.UsersMax=Number.UsersMax+25
  2943.  Redim Preserve UserArray(1 To Number.UsersMax) As UserType,_
  2944.        UserIndex(1 To Number.UsersMax) As Integer
  2945. 10641
  2946.  Exit Sub
  2947. 10642
  2948.  Resume 10641
  2949. End Sub
  2950.  
  2951. Sub Valid.Name(Var$)
  2952.  On Local Error Goto 10652
  2953.  TempA=True
  2954.  Var1$=Lcase$(Var$)
  2955.  If Left$(Var1$,5)="login" Then
  2956.     TempA=False
  2957.  Endif
  2958.  If Left$(Var1$,6)="logoff" Then
  2959.     TempA=False
  2960.  Endif
  2961.  If Left$(Var1$,7)="relogin" Then
  2962.     TempA=False
  2963.  Endif
  2964.  If Left$(Var1$,9)=Deleted$ Then
  2965.     TempA=False
  2966.  Endif
  2967.  If Left$(Var1$,9)="<offline>" Then
  2968.     TempA=False
  2969.  Endif
  2970. 10651
  2971.  Exit Sub
  2972. 10652
  2973.  Resume 10651
  2974. End Sub
  2975.  
  2976. Sub Restrict(Var1)
  2977.  On Local Error Goto 10662
  2978.  TempB=False
  2979.  If RoomRecord.Level>False Then
  2980.     If UserRecord.Level<RoomRecord.Level Then
  2981.        If RoomRecord.Restrictions And 2^Var1 Then
  2982.           TempB=True
  2983.        Endif
  2984.     Endif
  2985.  Endif
  2986.  If RoomRecord.Level<False Then
  2987.     If UserRecord.Level>Abs(RoomRecord.Level) Then
  2988.        If RoomRecord.Restrictions And 2^Var1 Then
  2989.           TempB=True
  2990.        Endif
  2991.     Endif
  2992.  Endif
  2993. 10661
  2994.  Exit Sub
  2995. 10662
  2996.  Resume 10661
  2997. End Sub
  2998.  
  2999. Sub Valid(Var$,Var)
  3000.  On Local Error Goto 10672
  3001.  If Len(Var$)/2<>Len(Var$)\2 Then
  3002.     Var$=Var$+" "
  3003.  Endif
  3004.  If Var/2<>Var\2 Then
  3005.     Var=Var+1
  3006.  Endif
  3007.  Var$=Left$(Var$,Var)
  3008.  Var$=Var$+Space$(Var-Len(Var$))
  3009.  For Var1=1 To Var
  3010.     Var2=Asc(Mid$(Var$,Var1,1))
  3011.     If Var2<32 Or Var2>127 Then
  3012.        Var$=Nul
  3013.        Exit Sub
  3014.     Endif
  3015.  Next
  3016. 10671
  3017.  Exit Sub
  3018. 10672
  3019.  Resume 10671
  3020. End Sub
  3021.  
  3022. Sub Encrypt(Var$,Var)
  3023.  On Local Error Goto 10682
  3024.  Var1$=Nul
  3025.  For Var2=1 To Len(Var$) Step 2
  3026.     Var1=0
  3027.     VarA=Asc(Mid$(Var$,Var2,1))
  3028.     VarB=Asc(Mid$(Var$,Var2+1,1))
  3029.     If Var Then
  3030.        Var1=20000
  3031.     Else
  3032.        If (VarA+VarB)/2=(VarA+VarB)\2 Then
  3033.           Var1=10000
  3034.        Endif
  3035.     Endif
  3036.     Var1=Var1+(VarA-32)*100+(VarB-32)
  3037.     Var1$=Var1$+Mki$(Var1)
  3038.  Next
  3039.  Var$=Var1$
  3040. 10681
  3041.  Exit Sub
  3042. 10682
  3043.  Resume 10681
  3044. End Sub
  3045.  
  3046. Sub Decrypt(Var$)
  3047.  On Local Error Goto 10692
  3048.  Var1$=Nul
  3049.  For Var=1 To Len(Var$) Step 2
  3050.     Var1=Cvi(Mid$(Var$,Var,2))
  3051.     Var2=Var1\100
  3052.     VarA=Var1-Var2*100
  3053.     Var1=Var2
  3054.     VarA=VarA+32
  3055.     Var2=Var1\100
  3056.     VarB=Var1-Var2*100
  3057.     VarB=VarB+32
  3058.     If Var2=0 Then
  3059.        If ((VarA+VarB)/2)=((VarA+VarB)\2) Then
  3060.           Var$=Nul
  3061.           Exit Sub
  3062.        Endif
  3063.     Endif
  3064.     If Var2=1 Then
  3065.        If ((VarA+VarB)/2)<>((VarA+VarB)\2) Then
  3066.           Var$=Nul
  3067.           Exit Sub
  3068.        Endif
  3069.     Endif
  3070.     Var1$=Var1$+Chr$(VarB)+Chr$(VarA)
  3071.  Next
  3072.  Var$=Var1$
  3073. 10691
  3074.  Exit Sub
  3075. 10692
  3076.  Resume 10691
  3077. End Sub
  3078.  
  3079. Sub Update.LogFile(Var$,VarX)
  3080.  On Local Error Goto 10702
  3081.  Close 13
  3082.  Open Log.FileName For Random Shared As #13 Len=Len(LogRecord)
  3083.  For Temp1=1 To Lof(13)/Len(LogRecord)
  3084.     Get 13,Temp1,LogRecord
  3085.     If LogRecord.User=False Then
  3086.        Exit For
  3087.     Endif
  3088.  Next
  3089.  VarX$=Var$+" on "+Mid$(FNclock$,5,9)+"!"
  3090.  LogRecord.Message=VarX$
  3091.  LogRecord.User=VarX
  3092.  Put 13,Temp1,LogRecord
  3093. 10701
  3094.  Exit Sub
  3095. 10702
  3096.  Resume 10701
  3097. End Sub
  3098.  
  3099. Sub Update.LastUser
  3100.  On Local Error Goto 10712
  3101.  Close #13
  3102.  Open LastUser.FileName For Append Shared As #13
  3103.  Strng=UserRecord.CodeName
  3104.  Call Decrypt(Strng)
  3105.  Strng=Lcase$(Strng)
  3106.  Mid$(Strng,1,1)=Ucase$(Mid$(Strng,1,1))
  3107.  Out2=Mid$(Str$(Room),2)
  3108.  Out2=Out2+Space$(5-Len(Out2))
  3109.  Strng=Strng+Out2+" "+Time.On+" "+Time$
  3110.  OnTime#=TimeValue#(Time$)-TimeValue#(Time.On)
  3111.  If OnTime#<False Then
  3112.     OnTime#=OnTime#+TimeValue#("12:00:00")*2
  3113.  Endif
  3114.  Temp$=FormatD$(OnTime#,"hh:mm:ss")
  3115.  Strng=Strng+" "+Temp$
  3116.  TempX!=Players.Killed*UserRecord.Level*2+Monsters.Killed*UserRecord.Level
  3117.  If TempX!=False Then
  3118.     Strng=Strng+" Zero"
  3119.  Else
  3120.     Strng=Strng+Str$(TempX!)
  3121.  Endif
  3122.  Print #13,Strng
  3123.  Close #13
  3124. 10711
  3125.  Exit Sub
  3126. 10712
  3127.  Resume 10711
  3128. End Sub
  3129.  
  3130. Sub Last.User
  3131.  On Local Error Goto 10722
  3132.  Strng="(hit <control-k> to interrupt).."
  3133.  Call IO.O
  3134.  Graphics.Off=True
  3135.  Strng="DNDBBS V"+Version$+" Last User List For "+Left$(FNclock$,13)+"."
  3136.  Call IO.O
  3137.  Strng=Nul
  3138.  Call IO.O
  3139.  Strng="# Username                      Room"
  3140.  Strng=Strng+"  Timeon   Timeoff  Total    Score"
  3141.  Call IO.O
  3142.  Strng=String$(70,"-")
  3143.  Call IO.O
  3144.  Close #13
  3145.  Open LastUser.FileName For Input Shared As #13
  3146.  Redim Temp.ArrayS(1 To 5) As String
  3147.  Temp1=False
  3148.  Do While Not Eof(13)
  3149.     Line Input #13,TempX$
  3150.     Temp1=Temp1+1
  3151.     If Temp1>5 Then
  3152.        Temp1=5
  3153.        For Temp2=1 To 4
  3154.           Temp.ArrayS(Temp2)=Temp.ArrayS(Temp2+1)
  3155.        Next
  3156.     Endif
  3157.     Temp.ArrayS(Temp1)=TempX$
  3158.  Loop
  3159.  Close #13
  3160.  If Temp1>5 Then
  3161.     Temp1=5
  3162.  Endif
  3163.  Allow.Break=True
  3164.  For Temp2=1 To Temp1
  3165.     Strng=Mid$(Str$(Temp2),2)+" "+Temp.ArrayS(Temp2)
  3166.     Call IO.O
  3167.     If Break Then
  3168.        Exit For
  3169.     Endif
  3170.  Next
  3171.  Allow.Break=False
  3172.  Call More.Prompt
  3173. 10721
  3174.  Exit Sub
  3175. 10722
  3176.  Resume 10721
  3177. End Sub
  3178.  
  3179. Sub Whos.On
  3180.  On Local Error Goto 10732
  3181.  Strng="(hit <control-k> to interrupt).."
  3182.  Call IO.O
  3183.  Graphics.Off=True
  3184.  Strng="DNDBBS V"+Version$+" Who Status Report For "+Left$(FNclock$,13)+"."
  3185.  Call IO.O
  3186.  Strng=Nul
  3187.  Call IO.O
  3188.  Strng="P# Username                       Timeon   Room  Score     Classname"
  3189.  Call IO.O
  3190.  Strng=String$(68,"-")
  3191.  Call IO.O
  3192.  If Node=False Then
  3193.     Strng=Mask$+Mask$
  3194.     Out2=UserRecord.CodeName
  3195.     Call Decrypt(Out2)
  3196.     Out2=Rtrim$(Out2)
  3197.     Out2=Lcase$(Out2)
  3198.     Mid$(Out2,1,1)=Ucase$(Mid$(Out2,1,1))
  3199.     Out2=Out2+Space$(30-Len(Out2))
  3200.     Strng=Strng+" "+Out2+" "+Time.On
  3201.     Out2=Mid$(Str$(Room),2)
  3202.     Out2=Out2+Space$(5-Len(Out2))
  3203.     Strng=Strng+" "+Out2
  3204.     TempX!=Players.Killed*UserRecord.Level*2+Monsters.Killed*UserRecord.Level
  3205.     If TempX!=False Then
  3206.        Out2="Zero"
  3207.     Else
  3208.        Out2=Mid$(Str$(TempX!),2)
  3209.     Endif
  3210.     Out2=Out2+Space$(9-Len(Out2))
  3211.     Strng=Strng+" "+Out2
  3212.     Out2=UserRecord.ClassName
  3213.     Call Decrypt(Out2)
  3214.     Out2=Rtrim$(Out2)
  3215.     Strng=Strng+" "+Out2
  3216.     Call IO.O
  3217.     Call More.Prompt
  3218.     Exit Sub
  3219.  Endif
  3220.  Temp3=3
  3221.  Allow.Break=True
  3222.  For Temp5=1 To 36
  3223.     Get 1,Temp5,MessWorkRecord1
  3224.     If MessWorkRecord1.UserIndex>False Then
  3225.        Out2=MessWorkRecord1.UserName
  3226.        If Left$(Out2,9)<>"<offline>" Then
  3227.           If Temp5<=10 Then
  3228.              Strng="P"+Mid$(Str$(Temp5-1),2)
  3229.           Else
  3230.              Strng="P"+Chr$(Temp5+54)
  3231.           Endif
  3232.           Out2=Lcase$(Out2)
  3233.           Mid$(Out2,1,1)=Ucase$(Mid$(Out2,1,1))
  3234.           Strng=Strng+" "+Out2+" "+MessWorkRecord1.TimeOn
  3235.           Out2=Mid$(Str$(MessWorkRecord1.RoomNumber),2)
  3236.           Out2=Out2+Space$(5-Len(Out2))
  3237.           Strng=Strng+" "+Out2
  3238.           TempX!=MessWorkRecord1.Score1*UserRecord.Level*2+_
  3239.           MessWorkRecord1.Score2*UserRecord.Level
  3240.           Out2=Mid$(Str$(TempX!),2)
  3241.           Out2=Out2+Space$(9-Len(Out2))
  3242.           Strng=Strng+" "+Out2
  3243.           Out2=MessWorkRecord1.ClassName
  3244.           Out2=Rtrim$(Out2)
  3245.           Strng=Strng+" "+Out2
  3246.           Call IO.O
  3247.           If Break Then
  3248.              Exit For
  3249.           Endif
  3250.           Temp3=Temp3+1
  3251.           If Temp3=21 Then
  3252.              Temp3=False
  3253.              Call More.Prompt
  3254.              If No Then
  3255.                 Exit For
  3256.              Endif
  3257.           Endif
  3258.        Endif
  3259.     Endif
  3260.  Next
  3261.  Allow.Break=False
  3262.  If Temp3>False Then
  3263.     Call More.Prompt
  3264.  Endif
  3265. 10731
  3266.  Exit Sub
  3267. 10732
  3268.  Resume 10731
  3269. End Sub
  3270.