 Rem File: Dndcnfg1 for Dndbbs Version v5.0a Release r2.0 Tweak t5.0a
 Rem $Include: 'dndcnfg.inc'
 Rem $Include: 'datim.bi'

' DOS Data Transfer Area
Type DTAtype
 Drive As String*1
 SearchTemplate As String*11
 SearchAttr As String*1
 EntryCount As String*2
 ClusterNumber As String*2
 Reserved As String*4
 FileAttr As String*1
 FileTime As String*2
 FileDate As String*2
 FileSize As String*4
 ASCIIZfilename As String*13
End Type

Sub Display.Main.Screen
 On Local Error Goto ErrorExit20
 VarX$=Ucase$(Environ$("BLIND"))
 If VarX$="ON" Or VarX$="-1" Or VarX$="TRUE" Then
    Border.Off=True
 Endif
 VarX$=Ucase$(Environ$("BLINDCHAR"))
 If VarX$="ON" Or VarX$="-1" Or VarX$="TRUE" Then
    Border.Char=-1
 Endif
 Locate ,,1
 Call ANSI(4,33,44)
 Call ANSI(3,0,0)
 If Local.Mode Then
    Call Shell.ANSI.Program(1)
    If Border.Off=False Then
       Call ANSI(2,1,2)
       If Border.Char=0 Then
          Strng2 = Chr$(201) + String$(76, 205) + Chr$(187)
       Else
          Strng2 = "+" + String$(76, "-") + "+"
       Endif
       Call Scrn(Strng2)
    Endif
 Endif
 Call ANSI(4,36,44)
 Call ANSI(2,4,5)
 Strng2="Dungeons And Dragons Bulletin Board System Sysop Config v"+Version$+" r"+Release$+" t"+Tweak$
 Call Scrn(Strng2)
 Call ANSI(4,33,44)
 Temp1=1
 For Temp=2 To 24
    Call ANSI(4,33,44)
    If Local.Mode Then
       If Border.Off=False Then
          Call ANSI(2,Temp,2)
          If Border.Char=0 Then
             Strng2=Chr$(186)
          Else
             Strng2="|"
          Endif
          Call Scrn(Strng2)
       Endif
    Endif
    If Temp=Menu2(Temp1,1) Then
       Var1=Menu2(Temp1,1)
       Var2=Menu2(Temp1,2)
       Call ANSI(2,Var1,Var2)
       Strng2="F"+Mid$(Str$(Temp1),2)+" "
       Call Scrn(Strng2)
       Call ANSI(4,37,44)
       Strng2=Left$(Menu1(Temp1),1)
       Call Scrn(Strng2)
       Call ANSI(4,33,44)
       Strng2=Rtrim$(Mid$(Menu1(Temp1),2))
       Call Scrn(Strng2)
       Call ANSI(4,33,44)
       Var1=Menu2(Temp1+4,1)
       Var2=Menu2(Temp1+4,2)
       Call ANSI(2,Var1,Var2)
       Strng2="F"+Right$(Str$(Temp1+4),1)+" "
       Call Scrn(Strng2)
       Call ANSI(4,37,44)
       Strng2=Left$(Menu1(Temp1+4),1)
       Call Scrn(Strng2)
       Call ANSI(4,33,44)
       Strng2=Rtrim$(Mid$(Menu1(Temp1+4),2))
       Call Scrn(Strng2)
       Temp1=Temp1+1
    Endif
    If Local.Mode Then
       If Border.Off=False Then
          Call ANSI(2,Temp,79)
          If Border.Char=0 Then
             Strng2=Chr$(186)
          Else
             Strng2="|"
          Endif
          Call Scrn(Strng2)
       Endif
    Endif
 Next
 If Local.Mode Then
    If Border.Off=False Then
       Call ANSI(2,25,2)
       If Border.Char=0 Then
          Strng2 = Chr$(200) + String$(76, 205) + Chr$(188)
       Else
          Strng2 = "+" + String$(76, "-") + "+"
       Endif
       Call Scrn(Strng2)
    Endif
 Endif
 Temp=1
 TempX=1
 Call Status.Line
 Call Display.File
 Call Main.Menu.Select2
ErrorResume20:
 Exit Sub
ErrorExit20:
 Resume ErrorResume20
End Sub

Sub Main.Edit
 On Local Error Goto ErrorExit21
 Call Mouse.Driver(2)
 Color 7,1 : Cls
 Call Mouse.Driver(1)
 Select Case TempX
 Case 1
    Call Edit.Page.One
 Case 2
    Call Edit.Page.Two
 Case 3
    Call Edit.Page.Three
 Case 4
    Call Edit.Page.Four
 Case 5
    Call Edit.Page.Five
 Case 6
    Call Edit.Page.Six
 Case 7
    Call Edit.Page.Seven
 Case 8
    Call Edit.Page.Eight
 End Select
 Call Mouse.Driver(2)
 Color 7,1 : Cls
 Call Mouse.Driver(1)
ErrorResume21:
 Exit Sub
ErrorExit21:
 Resume ErrorResume21
End Sub

Sub Display.Border(Var$)
 On Local Error Goto ErrorExit22
 VarX$=Ucase$(Environ$("BLIND"))
 If VarX$="ON" Or VarX$="-1" Or VarX$="TRUE" Then
    Border.Off=True
 Endif
 VarX$=Ucase$(Environ$("BLINDCHAR"))
 If VarX$="ON" Or VarX$="-1" Or VarX$="TRUE" Then
    Border.Char=-1
 Endif
 Call ANSI(4,37,44)
 Call ANSI(3,0,0)
 If Local.Mode Then
    Call Shell.ANSI.Program(1)
    If Border.Off=False Then
       Call ANSI(4,36,44)
       Call ANSI(2,1,1)
       If Border.Char=0 Then
          Strng = Chr$(201) + String$(78, 205) + Chr$(187)
       Else
          Strng = "+" + String$(78, "-") + "+"
       Endif
       Call Scrn(Strng)
   Endif
 Endif
 Call ANSI(4,32,44)
 Var$=" "+Var$+" "
 VarX=Int(40-Len(Var$)/2+1)
 Call ANSI(2,1,VarX)
 Call Scrn(Var$)
 Call ANSI(4,36,44)
 If Local.Mode Then
    If Border.Off=False Then
       For Temp=2 To 24
          Call ANSI(2,Temp,1)
          If Border.Char=0 Then
             Strng = Chr$(186)
          Else
             Strng = "|"
          Endif
          Call Scrn(Strng)
          Call ANSI(2,Temp,80)
          If Border.Char=0 Then
             Strng = Chr$(186)
          Else
             Strng = "|"
          Endif
          Call Scrn(Strng)
       Next
       Call ANSI(2,25,1)
       If Border.Char=0 Then
          Strng=Chr$(200)+String$(78,205)
       Else
          Strng="+"+String$(78,"-")
       Endif
       Call Scrn(Strng)
    Endif
 Endif
 If Local.Mode Then
    If Border.Off=False Then
       Color 11,1
       Locate 25,80,0
       If Border.Char=0 Then
          Print Chr$(188);
       Else
          Print "+";
       Endif
       Locate 1,1,1
    Endif
 Endif
 Call ANSI(2,25,5)
 Call ANSI(4,32,44)
 Strng=" Select: Cursor Up/Dn "
 Call Scrn(Strng)
 Call ANSI(2,25,28)
 Strng=" Screen: Page Up/Dn "
 Call Scrn(Strng)
 Call ANSI(2,25,49)
 Strng=" Edit: <enter> "
 Call Scrn(Strng)
 Call ANSI(2,25,65)
 Strng=" Quit: Escape "
 Call Scrn(Strng)
ErrorResume22:
 Exit Sub
ErrorExit22:
 Resume ErrorResume22
End Sub

Sub Main.Select
 On Local Error Goto ErrorExit23
 Temp=False
 Select Case Len(Strng3)
 Case 1
    TempQ=Asc(Strng3)
    If TempQ=9 Or TempQ=15 Then
       Eat$=Nul
    Else
       Exit Sub
    Endif
 Case 2
    TempQ=Asc(Right$(Strng3,1))
 End Select
 Select Case TempQ
 Case 59 To 68 ' F1 To F10
    Temp=TempQ-58
    Strng3=Chr$(13)
 Case 94 To 103 ' Ctrl-F1 To Ctrl-F10
    Temp=TempQ-93
    Strng3=Chr$(13)
 Case 104 To 113 ' Alt-F1 To Alt-F10
    Temp=TempQ-103
    Strng3=Chr$(13)
 Case 72, 141, 152
    If TempX>1 Then
       Temp=TempX-1
    Endif
 Case 80, 145, 160
    If TempX<8 Then
       Temp=TempX+1
    Endif
 Case 15, 75, 155, 115
    If TempX>4 Then
       Temp=TempX-4
    Endif
 Case 9, 77, 157, 116
    If TempX<5 Then
       Temp=TempX+4
    Endif
 Case 71, 119
    If TempX<>1 Then
       Temp=1
    Endif
 Case 79, 117
    If TempX<>8 Then
       Temp=8
    Endif
 Case 73, 132
    If TempX<5 And TempX<>1 Then
       Temp=1
    Endif
    If TempX>4 And TempX<>5 Then
       Temp=5
    Endif
 Case 81, 118
    If TempX<5 And TempX<>4 Then
       Temp=4
    Endif
    If TempX>4 And TempX<>8 Then
       Temp=8
    Endif
 End Select
 If Temp Then
    Call Main.Menu.Select
 Endif
ErrorResume23:
 Exit Sub
ErrorExit23:
 Resume ErrorResume23
End Sub

Sub Main.Menu.Select
 On Local Error Goto ErrorExit24
 Locate ,,1
 Var1=Menu2(TempX,1)
 Var2=Menu2(TempX,2)+3
 Call ANSI(2,Var1,Var2)
 Call ANSI(4,37,44)
 Strng2=Left$(Menu1(TempX),1)
 Call Scrn(Strng2)
 Call ANSI(4,33,44)
 Strng2=Rtrim$(Mid$(Menu1(TempX),2))
 Call Scrn(Strng2)
 TempX=Temp
 Call Main.Menu.Select2
ErrorResume24:
 Exit Sub
ErrorExit24:
 Resume ErrorResume24
End Sub

Sub Main.Menu.Select2
 On Local Error Goto ErrorExit24a
 Var1=Menu2(TempX,1)
 Var2=Menu2(TempX,2)+3
 Call ANSI(2,Var1,Var2)
 Call ANSI(4,37,45)
 Strng2=Left$(Menu1(TempX),1)
 Call Scrn(Strng2)
 Call ANSI(4,33,45)
 Strng2=Rtrim$(Mid$(Menu1(TempX),2))
 Call Scrn(Strng2)
ErrorResume24a:
 Exit Sub
ErrorExit24a:
 Resume ErrorResume24a
End Sub

Sub Status.Message
 On Local Error Goto ErrorExit25
 Call ANSI(4,37,44)
 Call ANSI(2,22,4)
 Strng=Space$(74)
 Call Scrn(Strng)
 Call ANSI(2,23,4)
 Strng=Space$(74)
 Call Scrn(Strng)
 If Len(Strng3) Then
    Var=Len(Strng3)+10
    Call ANSI(2,23,4)
    Call ANSI(4,37,44)
    Strng=Strng3+"Press "
    Call Scrn(Strng)
    Call ANSI(2,23,Var)
    Call ANSI(4,32,44)
    Strng="<enter>"
    Call Scrn(Strng)
    Call ANSI(2,23,Var+7)
    Call ANSI(4,37,44)
    Strng=" to continue."
    Call Scrn(Strng)
    Strng3=Nul
    Do While Lost.Carrier=False
       Call Read.Keyboard(Strng3)
       If Strng3=Chr$(13) Then
          Exit Do
       Endif
       Call Mouse.Driver(3)
       If Mouse.Button2 Then
          Exit Do
       Endif
       If Mouse.Button3 Then
          Call Terminate.Program(True)
          End
       Endif
       If Mouse.Button Then
          If Mouse.Row=23 Then
             If Mouse.Column>=Var And Mouse.Column<=Var+6 Then
                Exit Do
             Endif
          Endif
       Endif
    Loop
 Endif
ErrorResume25:
 Exit Sub
ErrorExit25:
 Resume ErrorResume25
End Sub

Sub Status.Line
 On Local Error Goto ErrorExit26
 Call ANSI(4,37,44)
 Call ANSI(2,22,4)
 Strng2=" Highlight menu choice, press"
 Call Scrn(Strng2)
 Call ANSI(2,22,42)
 Strng2=" to select option, "
 Call Scrn(Strng2)
 Call ANSI(2,22,69)
 Strng2=" to quit."
 Call Scrn(Strng2)
 Call ANSI(2,23,14)
 Strng2="  load default,"
 Call Scrn(Strng2)
 Call ANSI(2,23,39)
 Strng2="  write config,"
 Call Scrn(Strng2)
 Call ANSI(2,23,64)
 Strng2="  read config."
 Call Scrn(Strng2)
 Call ANSI(2,24,63)
 Strng2="  display help."
 Call Scrn(Strng2)
 Call ANSI(4,32,44)
 Call ANSI(2,22,33)
 Strng2=" <return>"
 Call Scrn(Strng2)
 Call ANSI(2,22,60)
 Strng2=" <escape>"
 Call Scrn(Strng2)
 Call ANSI(2,23,4)
 Strng2=" Control-D"
 Call Scrn(Strng2)
 Call ANSI(2,23,29)
 Strng2=" Control-W"
 Call Scrn(Strng2)
 Call ANSI(2,23,54)
 Strng2=" Control-R"
 Call Scrn(Strng2)
 Call ANSI(2,24,54)
 Strng2=" Control-H"
 Call Scrn(Strng2)
ErrorResume26:
 Exit Sub
ErrorExit26:
 Resume ErrorResume26
End Sub

' display filename info
Sub Display.File
 On Local Error Goto ErrorExit26a
 DIM ASCIIZ As String*260
 DIM BASIC.DTA.SEG As Integer
 DIM BASIC.DTA.OFF As Integer
 DIM DTAfile AS DTAtype
 DIM File.Date AS STRING * 10
 DIM File.Time AS STRING * 8
 DIM File.Size AS DOUBLE
 DIM File.Work.Date AS SINGLE
 DIM File.Work.Time AS SINGLE
 DIM WorkHour AS SINGLE
 DIM WorkMinute AS SINGLE
 DIM WorkSeconds AS SINGLE
 DIM WorkDay AS SINGLE
 DIM WorkMonth AS SINGLE
 DIM WorkYear AS SINGLE

 ' store basic dta
 Call StdinInt(31,0)
 BASIC.DTA.SEG=OutregsX.ES
 BASIC.DTA.OFF=OutregsX.BX

 ' clear filename info
 Call ANSI(4,37,44)
 Call ANSI(2,24,5)
 Strng=Space$(50)
 Call Scrn(Strng)

 ' check filename
 If FileName=Nul Then
    ' display info
    Call ANSI(4,37,44)
    Call ANSI(2,24,5)
    Strng="File: <defaults> "+Fclock$
    Call Scrn(Strng)
    Exit Sub
 Endif

 ' store asciiz filename
 ASCIIZ = DND.Path + FileName + CHR$(0)

 ' restore directory search dta
 InregsX.DS = VARSEG(DTAfile)
 InregsX.DX = VARPTR(DTAfile)
 Call StdinInt(26,0)

 ' find first filename
 InregsX.CX = &H27
 InregsX.DS = VARSEG(ASCIIZ)
 InregsX.DX = VARPTR(ASCIIZ)
 Call StdinInt(78,0)

 ' check flag error
 IF (OutregsX.Flags And &H1) = &H0 Then

    ' construct file date and time for display
    File.Work.Time = ASC(MID$(DTAfile.FileTime, 2, 1))
    File.Work.Time = File.Work.Time * &H100 + ASC(MID$(DTAfile.FileTime, 1, 1))
    File.Work.Date = ASC(MID$(DTAfile.FileDate, 2, 1))
    File.Work.Date = File.Work.Date * &H100 + ASC(MID$(DTAfile.FileDate, 1, 1))
    WorkHour = INT(File.Work.Time / 2048)
    WorkMinute = INT((File.Work.Time AND &H7E0) / 32)
    WorkSeconds = INT((File.Work.Time AND &H1F) / 2)
    WorkYear = INT(File.Work.Date / 512)
    WorkMonth = INT((File.Work.Date AND &H1E0) / 32)
    WorkDay = INT(File.Work.Date AND &H1F)
    WorkYear = WorkYear + 1980
    File.Date = RIGHT$(STR$(WorkMonth + 100), 2) + "-" + RIGHT$(STR$(WorkDay + 100), 2) + "-" + MID$(STR$(WorkYear), 2)
    File.Time = RIGHT$(STR$(WorkHour + 100), 2) + ":" + RIGHT$(STR$(WorkMinute + 100), 2) + ":" + RIGHT$(STR$(WorkSeconds + 100), 2)

    ' calculate file size
    File.Size = File.Size + ASC(MID$(DTAfile.FileSize, 4, 1))
    File.Size = File.Size * &H100 + ASC(MID$(DTAfile.FileSize, 3, 1))
    File.Size = File.Size * &H100 + ASC(MID$(DTAfile.FileSize, 2, 1))
    File.Size = File.Size * &H100 + ASC(MID$(DTAfile.FileSize, 1, 1))

    ' display filename info
    Var$=DTAfile.ASCIIZFileName
    If Instr(Var$,Chr$(0)) Then
       Var$=Left$(Var$,Instr(Var$,Chr$(0))-1)
    Endif
    Var$=Lcase$(Rtrim$(Var$))
    Mid$(Var$,1,1)=Ucase$(Mid$(Var$,1,1))
    Var2$="File: "+Var$+" "+File.Date+" "+File.Time+" "
    Var3$=Format$(File.Size, "#,##0")
    If Len(Var3$)>6 Then
       Var3$="<none>"
    Else
       Var3$=Var3$+" bytes."
    Endif
    Var2$=Var2$+Var3$

    ' display file info
    Call ANSI(4,37,44)
    Call ANSI(2,24,5)
    Call Scrn(Var2$)
 Endif
ErrorResume26a:
 ' restore basic dta
 InregsX.DS = BASIC.DTA.SEG
 InregsX.DX = BASIC.DTA.OFF
 Call StdinInt(26,0)
 Exit Sub
ErrorExit26a:
 Resume ErrorResume26a
End Sub

Sub Edit.Defaults
 On Local Error Goto ErrorExit27
 Call Display.Border("Terminal Defaults")
 Call ANSI(4,33,44)
 Call ANSI(2,2,2)
 Strng2="Custom terminal defaults:"
 Call Scrn(Strng2)
 Call ANSI(4,37,44)
 Call ANSI(2,3,2)
 Strng2="Echo:"
 Call Scrn(Strng2)
 Call ANSI(4,36,44)
 Call ANSI(2,3,20)
 If Config.Array2(86)=False Then
    Strng2="Yes"
 Else
    Strng2="No"
 Endif
 Call Scrn(Strng2)
 Call ANSI(4,37,44)
 Call ANSI(2,4,2)
 Strng2="Linefeeds:"
 Call Scrn(Strng2)
 Call ANSI(4,36,44)
 Call ANSI(2,4,20)
 If Config.Array2(87)=False Then
    Strng2="Yes"
 Else
    Strng2="No"
 Endif
 Call Scrn(Strng2)
 Call ANSI(4,37,44)
 Call ANSI(2,5,2)
 Strng2="Linelength:"
 Call Scrn(Strng2)
 Call ANSI(4,36,44)
 Call ANSI(2,5,20)
 Strng2=Mid$(Str$(Config.Array2(88)),2)
 Call Scrn(Strng2)
 Call ANSI(4,37,44)
 Call ANSI(2,6,2)
 Strng2="Pagelength:"
 Call Scrn(Strng2)
 Call ANSI(4,36,44)
 Call ANSI(2,6,20)
 Strng2=Mid$(Str$(Config.Array2(89)),2)
 Call Scrn(Strng2)

 Call ANSI(4,37,44)
 Call ANSI(2,7,2)
 Strng2="Wordwrap:"
 Call Scrn(Strng2)
 Call ANSI(4,36,44)
 Call ANSI(2,7,20)
 If Config.Array2(90)=False Then
    Strng2="Yes"
 Else
    Strng2="No"
 Endif
 Call Scrn(Strng2)

 Call ANSI(4,37,44)
 Call ANSI(2,8,2)
 Strng2="Uppercase:"
 Call Scrn(Strng2)
 Call ANSI(4,36,44)
 Call ANSI(2,8,20)
 If Config.Array2(150) Then
    Strng2="Yes"
 Else
    Strng2="No"
 Endif
 Call Scrn(Strng2)

 Xcoor=3
 Ycoor=20
 Row=3
 Column=20
 Line.Length=3
 If Config.Array2(86)=False Then
    TempC$="Yes"
 Else
    TempC$="No"
 Endif
 Call ScreenEdit
 Yes=Ucase$(Left$(TempC$,1))="Y"
 If Yes Then
    Config.Array2(86)=False
 Else
    Config.Array2(86)=True
 Endif
 Call ANSI(4,36,44)
 Call ANSI(2,3,20)
 If Config.Array2(86)=False Then
    Strng2="Yes"
 Else
    Strng2="No"
 Endif
 Call Scrn(Strng2)
 Xcoor=4
 Ycoor=20
 Row=4
 Column=20
 Line.Length=3
 If Config.Array2(87)=False Then
    TempC$="Yes"
 Else
    TempC$="No"
 Endif
 Call ScreenEdit
 Yes=Ucase$(Left$(TempC$,1))="Y"
 If Yes Then
    Config.Array2(87)=False
 Else
    Config.Array2(87)=True
 Endif
 Call ANSI(4,36,44)
 Call ANSI(2,4,20)
 If Config.Array2(87)=False Then
    Strng2="Yes"
 Else
    Strng2="No"
 Endif
 Call Scrn(Strng2)
 Xcoor=5
 Ycoor=20
 Row=5
 Column=20
 Line.Length=3
 TempC$=Mid$(Str$(Config.Array2(88)),2)
 Call ScreenEdit
 Config.Array2(88)=Int(Val(TempC$)+.5)
 Call ANSI(4,36,44)
 Call ANSI(2,5,20)
 Strng2=Mid$(Str$(Config.Array2(88)),2)
 Call Scrn(Strng2)
 Xcoor=6
 Ycoor=20
 Row=6
 Column=20
 Line.Length=3
 TempC$=Mid$(Str$(Config.Array2(89)),2)
 Call ScreenEdit
 Config.Array2(89)=Int(Val(TempC$)+.5)
 Call ANSI(4,36,44)
 Call ANSI(2,6,20)
 Strng2=Mid$(Str$(Config.Array2(89)),2)
 Call Scrn(Strng2)

 Xcoor=7
 Ycoor=20
 Row=7
 Column=20
 Line.Length=3
 If Config.Array2(90)=False Then
    TempC$="Yes"
 Else
    TempC$="No"
 Endif
 Call ScreenEdit
 Yes=Ucase$(Left$(TempC$,1))="Y"
 If Yes Then
    Config.Array2(90)=False
 Else
    Config.Array2(90)=True
 Endif
 Call ANSI(4,36,44)
 Call ANSI(2,7,20)
 If Config.Array2(90)=False Then
    Strng2="Yes"
 Else
    Strng2="No"
 Endif
 Call Scrn(Strng2)

 Xcoor=8
 Ycoor=20
 Row=8
 Column=20
 Line.Length=3
 If Config.Array2(150) Then
    TempC$="Yes"
 Else
    TempC$="No"
 Endif
 Call ScreenEdit
 Yes=Ucase$(Left$(TempC$,1))="Y"
 If Yes Then
    Config.Array2(150)=True
 Else
    Config.Array2(150)=False
 Endif
 Call ANSI(4,36,44)
 Call ANSI(2,8,20)
 If Config.Array2(150) Then
    Strng2="Yes"
 Else
    Strng2="No"
 Endif
 Call Scrn(Strng2)

 Call Display.Page.One.B
 For Temp=22 To 42
    Call Select.Page.One(Temp,False)
 Next
 Call Select.Page.One(30,True)
 Temp1=30
ErrorResume27:
 Exit Sub
ErrorExit27:
 Resume ErrorResume27
End Sub

Sub Edit.Levels
 On Local Error Goto ErrorExit28
 Call Display.Border("Player Levels")
 Call ANSI(4,33,44)
 Call ANSI(2,2,2)
 Strng2="Increments for players during level increase:"
 Call Scrn(Strng2)
 For Temp=1 To 10
    Call ANSI(4,32,44)
    Call ANSI(2,Temp*2+1,2)
    Strng2=Rtrim$(Class.Name(Temp))+"/"+Rtrim$(High.Class.Name(Temp))+":"
    Call Scrn(Strng2)
 Next
 For Num=1 To 10
    For Num1=1 To 4
       Call Display.Class(Num,Num1,False)
    Next
 Next
 Num=1
 Num1=1
 TempA=1
 TempB=40
 Call Display.Class(1,1,True)
 Do While Lost.Carrier=False
    Strng3=Nul
    Do While Strng3=Nul
       If Lost.Carrier Then
          Exit Do
       Endif
       Call Read.Keyboard(Strng3)
       Call Mouse.Driver(3)
       If Mouse.Button2 Then
          Strng3=Chr$(27)
       Endif
       If Mouse.Button3 Then
          Call Terminate.Program(True)
          End
       Endif
       If Mouse.Button Then
          Call Mouse.Select(9,40,False)
          If Len(Strng3) Then
	     Exit Do
	  Endif
          Call Edit.Mouse.Button
          If Len(Strng3) Then
             Exit Do
          Endif
       Endif
       If Mouse.Row Or Mouse.Column Then
          Call Mouse.Select(9,40,True)
          If Len(Strng3) Then
	     Exit Do
	  Endif
       Endif
    Loop
    Select Case Len(Strng3)
    Case 1
       Select Case Strng3
       Case Chr$(27)
          Exit Do
       Case Chr$(9)
          If Num1<4 Then
             Call Display.Class(Num,Num1,False)
             Num1=Num1+1
             Call Display.Class(Num,Num1,True)
          Endif
       Case Chr$(13)
          Xcoor=Num*2+2
          Ycoor=(Num1-1)*20+11
          Row=Xcoor
          Column=Ycoor
          Line.Length=5
          TempC$=Mid$(Str$(Training.Stats(Num,Num1)),2)
          Call ScreenEdit
          Training.Stats(Num,Num1)=Int(Val(TempC$)+.5)
          Call Display.Class(Num,Num1,True)
       End Select
    Case 2
       Select Case Asc(Left$(Strng3,1))
       Case 0
          Select Case Asc(Right$(Strng3,1))
          Case 72, 141, 152, 132
             If Num>1 Then
                Call Display.Class(Num,Num1,False)
                Num=Num-1
                Call Display.Class(Num,Num1,True)
             Endif
          Case 80, 145, 160, 118
             If Num<10 Then
                Call Display.Class(Num,Num1,False)
                Num=Num+1
                Call Display.Class(Num,Num1,True)
             Endif
          Case 73, 75, 15
             If Num1>1 Then
                Call Display.Class(Num,Num1,False)
                Num1=Num1-1
                Call Display.Class(Num,Num1,True)
             Endif
          Case 77, 81
             If Num1<4 Then
                Call Display.Class(Num,Num1,False)
                Num1=Num1+1
                Call Display.Class(Num,Num1,True)
             Endif
          Case 71 ' home
             If Num1<>1 Then
                Call Display.Class(Num,Num1,False)
                Num1=1
                Call Display.Class(Num,Num1,True)
             Endif
          Case 79 ' end
             If Num1<>4 Then
                Call Display.Class(Num,Num1,False)
                Num1=4
                Call Display.Class(Num,Num1,True)
             Endif
          Case 117 ' ctrl-end
             Call Display.Class(Num,Num1,False)
             Num=10 : Num1=4
             Call Display.Class(Num,Num1,True)
          Case 119 ' ctrl-home
             Call Display.Class(Num,Num1,False)
             Num=1 : Num1=1
             Call Display.Class(Num,Num1,True)
          End Select
       Case 1
          Temp2=Asc(Right$(Strng3,1))
          Var1=Int((Temp2-1)/10)+1
          Var2=Temp2-(Var1-1)*10
          If Var2<>Num Or Var1<>Num1 Then
             Call Display.Class(Num,Num1,False)
             Num=Var2
             Num1=Var1
             Call Display.Class(Num,Num1,True)
          Endif
       End Select
    End Select
 Loop
 Call Display.Page.One.A
 For Temp=1 To 21
    Call Select.Page.One(Temp,False)
 Next
 Call Select.Page.One(21,True)
 Temp1=21
 TempA=1
 TempB=21
ErrorResume28:
 Exit Sub
ErrorExit28:
 Resume ErrorResume28
End Sub

Sub Edit.Classnames
 On Local Error Goto ErrorExit29
 Call Display.Border("Player Classnames")
 Call ANSI(4,33,44)
 Call ANSI(2,2,2)
 Strng2="Custom level ten class names:"
 Call Scrn(Strng2)
 Call ANSI(4,37,44)
 For Temp=1 To 10
    Call Display.High.Class(Temp,False)
 Next
 Call Display.High.Class(1,True)
 Num=1
 TempA=1
 TempB=10
 Do While Lost.Carrier=False
    Strng3=Nul
    Do While Strng3=Nul
       If Lost.Carrier Then
          Exit Do
       Endif
       Call Read.Keyboard(Strng3)
       Call Mouse.Driver(3)
       If Mouse.Button2 Then
          Strng3=Chr$(27)
       Endif
       If Mouse.Button3 Then
          Call Terminate.Program(True)
          End
       Endif
       If Mouse.Button Then
          Call Mouse.Select(8,10,False)
          If Len(Strng3) Then
	     Exit Do
	  Endif
          Call Edit.Mouse.Button
          If Len(Strng3) Then
             Exit Do
          Endif
       Endif
       If Mouse.Row Or Mouse.Column Then
          Call Mouse.Select(8,10,True)
          If Len(Strng3) Then
	     Exit Do
	  Endif
       Endif
    Loop
    Select Case Len(Strng3)
    Case 1
       Select Case Strng3
       Case Chr$(27)
          Exit Do
       Case Chr$(9)
          If Num<10 Then
             Call Display.High.Class(Num,False)
             Num=Num+1
             Call Display.High.Class(Num,True)
          Endif
       Case Chr$(13)
          Xcoor=Num+2
          Ycoor=22
          Row=Num+2
          Column=22
          Line.Length=15
          TempC$=Rtrim$(High.Class.Name(Num))
          Call ScreenEdit
          Strng3=TempC$
          Mid$(Strng3,1,1)=Ucase$(Mid$(Strng3,1,1))
          High.Class.Name(Num)=Strng3
          Call Display.High.Class(Num,True)
       End Select
    Case 2
       Select Case Asc(Left$(Strng3,1))
       Case 0
          Select Case Asc(Right$(Strng3,1))
          Case 71, 119, 73, 132 ' home, pageup
             If Num<>1 Then
                Call Display.High.Class(Num,False)
                Num=1
                Call Display.High.Class(Num,True)
             Endif
          Case 79, 117, 81, 118 ' end, pagedn
             If Num<>10 Then
                Call Display.High.Class(Num,False)
                Num=10
                Call Display.High.Class(Num,True)
             Endif
          Case 72, 141, 152, 15
             If Num>1 Then
                Call Display.High.Class(Num,False)
                Num=Num-1
                Call Display.High.Class(Num,True)
             Endif
          Case 80, 145, 160
             If Num<10 Then
                Call Display.High.Class(Num,False)
                Num=Num+1
                Call Display.High.Class(Num,True)
             Endif
          End Select
       Case 1
          Temp2=Asc(Right$(Strng3,1))
          If Temp2<>Num Then
             Call Display.High.Class(Num,False)
             Num=Temp2
             Call Display.High.Class(Num,True)
          Endif
       End Select
    End Select
 Loop
 Call Display.Page.One.B
 For Temp=22 To 42
    Call Select.Page.One(Temp,False)
 Next
 Call Select.Page.One(38,True)
 Temp1=38
 TempA=22
 TempB=42
ErrorResume29:
 Exit Sub
ErrorExit29:
 Resume ErrorResume29
End Sub

Sub Display.Class(Var1,Var2,Var3)
 On Local Error Goto ErrorExit30
 Locate ,,1
 Call ANSI(4,37,44)
 Call ANSI(2,Var1*2+2,(Var2-1)*20+2)
 Select Case Var2
 Case 1
    Strng2="Fatigue "
 Case 2
    Strng2="Vitality"
 Case 3
    Strng2="Magic   "
 Case 4
    Strng2="Psionic "
 End Select
 Strng2=Strng2+Space$(6)
 Call Scrn(Strng2)
 If Var3=False Then
    Call ANSI(4,33,44)
 Else
    Call ANSI(4,37,45)
 Endif
 Call ANSI(2,Var1*2+2,(Var2-1)*20+11)
 Strng2=Mid$(Str$(Training.Stats(Var1,Var2)),2)
 Strng2=Strng2+Space$(5-Len(Strng2))
 Call Scrn(Strng2)
ErrorResume30:
 Exit Sub
ErrorExit30:
 Resume ErrorResume30
End Sub

Sub Display.High.Class(Var1,Var2)
 On Local Error Goto ErrorExit31
 Locate ,,1
 Call ANSI(4,37,44)
 Call ANSI(2,Var1+2,2)
 Strng2=Rtrim$(Class.Name(Var1))+":"
 Call Scrn(Strng2)
 If Var2=False Then
    Call ANSI(4,33,44)
 Else
    Call ANSI(4,37,45)
 Endif
 Call ANSI(2,Var1+2,22)
 Strng2=Space$(20)
 Call Scrn(Strng2)
 Call ANSI(2,Var1+2,22)
 Strng2=Rtrim$(High.Class.Name(Var1))
 Call Scrn(Strng2)
ErrorResume31:
 Exit Sub
ErrorExit31:
 Resume ErrorResume31
End Sub

Sub Load.Defaults(Var)
 On Local Error Goto Default.Error
 Call Open.Arrays
 Redim Edit.Data(1 To 12) As String,_
 Menu1(1 To 10) As String*25,_
 Menu2(1 To 10, 1 To 2) As Integer
 Data.Error=False
 DND.Path=Ucase$(Environ$("DNDBBS"))
 If DND.Path<>Nul Then
    If Right$(DND.Path,1)<>"\" Then
       DND.Path=DND.Path+"\"
    Endif
 Endif
 Restore Default.Data
 For Temp1=1 To 10
    For Temp2=1 To 4
       Read Training.Stats(Temp1,Temp2)
    Next
 Next
 For Temp=1 To 20
    Read Room.Array(Temp)
 Next
 For Temp=1 To MaxConfigArray1
    Read Config.Array1(Temp)
 Next
 For Temp=1 To MaxConfigArray2
    Read Config.Array2(Temp)
 Next
 For Temp=1 To MaxConfigArray3
    Read Config.Array3(Temp)
 Next
 If DND.Path="" Then
    Path1$ = Curdir$
    If Right$(Path1$,1)<>"\" Then
       Path1$=Path1$+"\"
    Endif
    Var$=Path1$+"DNDDAT\*.*"
    If Dir$(Var$)="" Then
       Config.Array3(11)=Path1$ ' dnddat
    Else
       Config.Array3(11)=Path1$+"DNDDAT\" ' dnddat
    Endif
    Var$=Path1$+"DNDDOC\*.*"
    If Dir$(Var$)="" Then
       Config.Array3(52)=Path1$ ' dnddoc
    Else
       Config.Array3(52)=Path1$+"DNDDOC\" ' dnddoc
    Endif
    Var$=Path1$+"DNDMESS\*.*"
    If Dir$(Var$)="" Then
       Config.Array3(54)=Path1$ ' dndmess
    Else
       Config.Array3(54)=Path1$+"DNDMESS\" ' dndmess
    Endif
 Else
    Var$=DND.Path+"DNDDAT\*.*"
    If Dir$(Var$)="" Then
       Config.Array3(11)="C:\DNDBBS50\" ' dnddat
    Else
       Config.Array3(11)=DND.Path+"DNDDAT\" ' dnddat
    Endif
    Var$=DND.Path+"DNDDOC\*.*"
    If Dir$(Var$)="" Then
       Config.Array3(52)="C:\DNDBBS50\" ' dnddoc
    Else
       Config.Array3(52)=DND.Path+"DNDDOC\" ' dnddoc
    Endif
    Var$=DND.Path+"DNDMESS\*.*"
    If Dir$(Var$)="" Then
       Config.Array3(54)="C:\DNDBBS50\" ' dndmess
    Else
       Config.Array3(54)=DND.Path+"DNDMESS\" ' dndmess
    Endif
 Endif
 For Temp=1 To 10
    Read High.Class.Name(Temp)
 Next
 For Temp=1 To 8
    Read Race(Temp)
 Next
 For Temp=1 To 10
    Read Class.Name(Temp)
 Next
 For Temp=1 To 7
    Read Stat(Temp)
 Next
 For Temp=1 To 12
    Read Direction(Temp)
 Next
 For Temp=1 To 10
    Read Numeral(Temp)
 Next
 For Temp=1 To 4
    Read Weapon.Type.Name(Temp)
 Next
 For Temp=1 To 3
    Read Alignment.Name1(Temp)
 Next
 For Temp=1 To 3
    Read Alignment.Name2(Temp)
 Next
 For Temp=1 To 50
    Read Strip.Data(Temp)
 Next
 For Temp1=1 To MaxUserCommands
    Read Command.Abbr(Temp1)
    For Temp2=1 To 3
       Read Command.Set(Temp1,Temp2)
    Next
    Read Command.Param(Temp1)
    For Temp2=1 To 8
       Read Command.Class(Temp1,Temp2)
    Next
    For Temp2=1 To 4
       Read Command.Time(Temp1,Temp2)
    Next
    Read Command.Limit(Temp1)
    Read Attack.Command(Temp1)
 Next
 For Temp=1 To MaxDMCommands
    Read DMCommands(Temp)
    Read DMCommand.Param(Temp)
    For Temp2=1 To 3
       Read DM.Command.Class(Temp,Temp2)
    Next
 Next
 For Temp=1 To MaxSysopCommands
    Read Sysop.Commands(Temp)
    Read Sysop.Command.Class(Temp)
 Next
 For Temp=1 To MaxNodeCommands
    Read Node.Commands(Temp)
    For Temp2=1 To 8
       Node.Command.Class(Temp,Temp2)=False
    Next
 Next
 For Temp=1 To 26
    Read Letter.Command(Temp)
 Next
 For Temp=1 To 10
    Read Temp.ArrayS(Temp)
    Read Temp.Array1(Temp)
    Read Temp.Array2(Temp)
 Next
 For Temp=1 To 8
    Read Menu1(Temp)
    Read Menu2(Temp,1)
    Read Menu2(Temp,2)
 Next
 For Temp=1 To 12
    Read Edit.Data(Temp)
 Next
 For Temp1=1 To 10
    Read InventoryNames(Temp1)
 Next

 ' moved to inline code 03/13/2022
 Call SetModems
' For Temp1=1 To 30
'    Read Modem.Connect(Temp1)
'    Read Modem.String(Temp1)
' Next

 For Temp1=1 To 30
    Modem.Allow(Temp1)=True
 Next
 Call Get.Environment
 FileName=Nul
Default.Resume:
 If Var Then
    If Data.Error Then
       Strng3=" Error reading defaults. "
    Else
       Strng3=" Default configuration loaded. "
    Endif
    Call Status.Message
    Call Display.File
 Endif
 Exit Sub
Default.Error:
 Data.Error=True
 Resume Default.Resume
End Sub

Sub Read.Config
 On Local Error Goto Read.Error
 Strng3=Nul
 Call Status.Message
 Call ANSI(4,33,44)
 Call ANSI(2,23,5)
 Strng2="Enter node number(<enter>,0-9,A-Z,10-99): "
 Call Scrn(Strng2)
 Xcoor=23
 Ycoor=47
 Row=23
 Column=47
 Line.Length=2
 TempC$=Nul
 Call ScreenEdit
 If Inserting=-2 Then ' escape
    Strng3=" Error, node must be <enter>,0-9,A-Z,10-99. "
    Call Status.Message
    Call Display.File
    Exit Sub
 Endif
 FileName=Nul
 TempC$=Ucase$(TempC$)
 Select Case Len(TempC$)
 Case 0
    FileName="DND.CFG"
 Case 1
    Select Case TempC$
    Case "0" To "9"
       FileName="DND"+TempC$+".CFG"
    Case "A" To "Z"
       FileName="DND"+TempC$+".CFG"
    Case Else
       Strng3=" Error, node must be <enter>,0-9,A-Z,10-99. "
       Call Status.Message
       Call Display.File
       Exit Sub
    End Select
 Case 2
    VarX=Int(Val(TempC$)+.5)
    If VarX>=10 And VarX<=99 Then
       FileName="DND"+TempC$+".CFG"
    Else
       Strng3=" Error, node must be <enter>,0-9,A-Z,10-99. "
       Call Status.Message
       Call Display.File
       Exit Sub
    Endif
 End Select
 Call Open.Arrays
 Data.Error=False
 TempA$=DND.Path+FileName
 Close #TempFile1
 Open TempA$ For Input Shared As #TempFile1
 Input #TempFile1,Var$
 For Temp=1 To MaxConfigArray1
    Input #TempFile1,Config.Array1(Temp)
 Next
 For Temp=1 To MaxConfigArray2
    Input #TempFile1,Config.Array2(Temp)
 Next
 For Temp=1 To MaxConfigArray3
    Line Input #TempFile1,Config.Array3(Temp)
 Next
 For Temp1=1 To 10
    For Temp2=1 To 4
       Input #TempFile1,Training.Stats(Temp1,Temp2)
    Next
 Next
 For Temp=1 To 20
    Line Input #TempFile1,Room.Array(Temp)
 Next
 For Temp=1 To 10
    Line Input #TempFile1,High.Class.Name(Temp)
 Next
 For Temp=1 To 8
    Line Input #TempFile1,Race(Temp)
 Next
 For Temp=1 To 10
    Line Input #TempFile1,Class.Name(Temp)
 Next
 For Temp=1 To 7
    Line Input #TempFile1,Stat(Temp)
 Next
 For Temp=1 To 12
    Line Input #TempFile1,Direction(Temp)
 Next
 For Temp=1 To 10
    Line Input #TempFile1,Numeral(Temp)
 Next
 For Temp=1 To 4
    Line Input #TempFile1,Weapon.Type.Name(Temp)
 Next
 For Temp=1 To 3
    Line Input #TempFile1,Alignment.Name1(Temp)
 Next
 For Temp=1 To 3
    Line Input #TempFile1,Alignment.Name2(Temp)
 Next
 For Temp1=1 To MaxUserCommands
    Line Input #TempFile1,Command.Abbr(Temp1)
    For Temp2=1 To 3
       Line Input #TempFile1,Command.Set(Temp1,Temp2)
    Next
    Input #TempFile1,Command.Param(Temp1)
    For Temp2=1 To 8
       Input #TempFile1,Command.Class(Temp1,Temp2)
    Next
    For Temp2=1 To 4
       Input #TempFile1,Command.Time(Temp1,Temp2)
    Next
    Input #TempFile1,Command.Limit(Temp1)
    Input #TempFile1,Attack.Command(Temp1)
 Next
 For Temp=1 To MaxDMCommands
    Line Input #TempFile1,DMCommands(Temp)
    Input #TempFile1,DMCommand.Param(Temp)
    For Temp2=1 To 3
       Input #TempFile1,DM.Command.Class(Temp,Temp2)
    Next
 Next
 For Temp=1 To MaxSysopCommands
    Line Input #TempFile1,Sysop.Commands(Temp)
    Input #TempFile1,Sysop.Command.Class(Temp)
 Next
 For Temp=1 To MaxNodeCommands
    Line Input #TempFile1,Node.Commands(Temp)
    For Temp2=1 To 8
       Input #TempFile1,Node.Command.Class(Temp,Temp2)
    Next
 Next
 For Temp=1 To 26
    Input #TempFile1,Letter.Command(Temp)
 Next
 For Temp=1 To 50
    Line Input #TempFile1,Strip.Data(Temp)
 Next
 For Temp=1 To 10
    Line Input #TempFile1,Temp.ArrayS(Temp)
    Input #TempFile1,Temp.Array1(Temp)
    Input #TempFile1,Temp.Array2(Temp)
 Next
 For Temp1=1 To 10
    Line Input #TempFile1,InventoryNames(Temp1)
 Next
 For Temp1=1 To 30
    Input #TempFile1,Modem.Connect(Temp1)
    Line Input #TempFile1,Modem.String(Temp1)
    Input #TempFile1,Modem.Allow(Temp1)
 Next
' Call Get.Environment
Read.Resume:
 Close #TempFile1
 FileName=Lcase$(FileName)
 Mid$(FileName,1,1)=Ucase$(Mid$(FileName,1,1))
 If Data.Error Then
    Call Load.Defaults(False)
    Strng3=" Error reading file "+FileName+" from disk. "
    Call Status.Message
 Else
    Strng3=" File "+FileName+" read from disk. "
    Call Status.Message
 Endif
 Call Display.File
 Exit Sub
Read.Error:
 Data.Error=True
 Resume Read.Resume
End Sub

Sub Write.Config
 On Local Error Goto Write.Error
 Data.Error=False
 Strng3=Nul
 Call Status.Message
 Call ANSI(4,33,44)
 Call ANSI(2,23,5)
 Strng2="Enter node number(<enter>,0-9,A-Z,10-99): "
 Call Scrn(Strng2)
 Xcoor=23
 Ycoor=47
 Row=23
 Column=47
 Line.Length=2
 TempC$=Nul
 Call ScreenEdit
 If Inserting=-2 Then ' escape
    Strng3=" Error, node must be <enter>,0-9,A-Z,10-99. "
    Call Status.Message
    Call Display.File
    Exit Sub
 Endif
 FileName=Nul
 Var$=Ucase$(TempC$)
 Select Case Len(Var$)
 Case 0
    FileName="DND.CFG"
 Case 1
    Select Case Var$
    Case "0" To "9"
       FileName="DND"+Var$+".CFG"
    Case "A" To "Z"
       FileName="DND"+Var$+".CFG"
    Case Else
       Strng3=" Error, node must be <enter>,0-9,A-Z,10-99. "
       Call Status.Message
       Call Display.File
       Exit Sub
    End Select
 Case 2
    VarX=Int(Val(Var$)+.5)
    If VarX>=10 And VarX<=99 Then
       FileName="DND"+Var$+".CFG"
    Else
       Strng3=" Error, node must be <enter>,0-9,A-Z,10-99. "
       Call Status.Message
       Call Display.File
       Exit Sub
    Endif
 End Select
 TempA$=DND.Path+FileName
 Close #TempFile1
 Open TempA$ For Output Shared As #TempFile1
 Print #TempFile1,Config.Array3(53)
 For Temp=1 To MaxConfigArray1
    Print #TempFile1,Ltrim$(Str$(Config.Array1(Temp)))
 Next
 For Temp=1 To MaxConfigArray2
    Print #TempFile1,Ltrim$(Str$(Config.Array2(Temp)))
 Next
 For Temp=1 To MaxConfigArray3
    If Temp=24 Then
       Var2$=Room.Array(11) ' safe havens
       If Len(Var2$) Then
          If Instr(Var2$,",") Then
             Var2$=Left$(Var2$,Instr(Var2$,",")-1)
          Endif
          Config.Array3(24)=Var2$ ' clerical resurrection room
       Endif
    Endif
    If Right$(Config3$(Temp),1)=" " Then ' store appended spaces
       Print #TempFile1,Config3$(Temp)+Chr$(1)
    Else
       Print #TempFile1,Config3$(Temp)
    Endif
 Next
 For Temp1=1 To 10
    For Temp2=1 To 4
       Print #TempFile1,Ltrim$(Str$(Training.Stats(Temp1,Temp2)))
    Next
 Next
 For Temp=1 To 20
    Print #TempFile1,Rtrim$(Room.Array(Temp))
 Next
 For Temp=1 To 10
    Print #TempFile1,Rtrim$(High.Class.Name(Temp))
 Next
 For Temp=1 To 8
    Print #TempFile1,Rtrim$(Race(Temp))
 Next
 For Temp=1 To 10
    Print #TempFile1,Rtrim$(Class.Name(Temp))
 Next
 For Temp=1 To 7
    Print #TempFile1,Rtrim$(Stat(Temp))
 Next
 For Temp=1 To 12
    Print #TempFile1,Rtrim$(Direction(Temp))
 Next
 For Temp=1 To 10
    Print #TempFile1,Rtrim$(Numeral(Temp))
 Next
 For Temp=1 To 4
    Print #TempFile1,Rtrim$(Weapon.Type.Name(Temp))
 Next
 For Temp=1 To 3
    Print #TempFile1,Rtrim$(Alignment.Name1(Temp))
 Next
 For Temp=1 To 3
    Print #TempFile1,Rtrim$(Alignment.Name2(Temp))
 Next
 For Temp1=1 To MaxUserCommands
    Print #TempFile1,Command.Abbr(Temp1)
    For Temp2=1 To 3
       Print #TempFile1,Rtrim$(Command.Set(Temp1,Temp2))
    Next
    Print #TempFile1,Ltrim$(Str$(Command.Param(Temp1)))
    For Temp2=1 To 8
       Print #TempFile1,Ltrim$(Str$(Command.Class(Temp1,Temp2)))
    Next
    For Temp2=1 To 4
       Print #TempFile1,Ltrim$(Str$(Command.Time(Temp1,Temp2)))
    Next
    Print #TempFile1,Ltrim$(Str$(Command.Limit(Temp1)))
    Print #TempFile1,Ltrim$(Str$(Attack.Command(Temp1)))
 Next
 For Temp=1 To MaxDMCommands
    Print #TempFile1,Rtrim$(DMCommands(Temp))
    Print #TempFile1,Ltrim$(Str$(DMCommand.Param(Temp)))
    For Temp2=1 To 3
       Print #TempFile1,Ltrim$(Str$(DM.Command.Class(Temp,Temp2)))
    Next
 Next
 For Temp=1 To MaxSysopCommands
    Print #TempFile1,Rtrim$(Sysop.Commands(Temp))
    Print #TempFile1,Ltrim$(Str$(Sysop.Command.Class(Temp)))
 Next
 For Temp=1 To MaxNodeCommands
    Print #TempFile1,Rtrim$(Node.Commands(Temp))
    For Temp2=1 To 8
       Print #TempFile1,Ltrim$(Str$(Node.Command.Class(Temp,Temp2)))
    Next
 Next
 For Temp=1 To 26
    Print #TempFile1,Ltrim$(Str$(Letter.Command(Temp)))
 Next
 For Temp=1 To 50
    Print #TempFile1,Rtrim$(Strip.Data(Temp))
 Next
 For Temp=1 To 10
    Print #TempFile1,Rtrim$(Temp.ArrayS(Temp))
    Print #TempFile1,Ltrim$(Str$(Temp.Array1(Temp)))
    Print #TempFile1,Ltrim$(Str$(Temp.Array2(Temp)))
 Next
 For Temp1=1 To 10
    Print #TempFile1,InventoryNames(Temp1)
 Next
 For Temp1=1 To 30
    Print #TempFile1,Modem.Connect(Temp1)
    Print #TempFile1,Modem.String(Temp1)
    Print #TempFile1,Modem.Allow(Temp1)
 Next
Write.Resume:
 Close #TempFile1
 FileName=Lcase$(FileName)
 Mid$(FileName,1,1)=Ucase$(Mid$(FileName,1,1))
 If Data.Error Then
    Strng3=" Error"+Str$(Data.Error)+" writing file "+FileName+" to disk. "
    FileName=Nul
 Else
    Strng3=" File "+FileName+" written to disk. "
 Endif
 Call Status.Message
 Call Display.File
 Exit Sub
Write.Error:
 Data.Error=Err
 Resume Write.Resume
End Sub

Sub Get.Environment
 On Local Error Goto ErrorExit32
 Strng2=Environ$("DNDDAT")
 Strng2=Ucase$(Strng2)
 If Strng2<>Nul Then
    Config.Array3(11)=Strng2
    If Right$(Config.Array3(11),1)<>"\" Then
       Config.Array3(11)=Config.Array3(11)+"\"
    Endif
 Endif
 If Config.Array3(11)=Nul Then
    Config.Array3(11)=Curdir$+"\"
 Endif
 Strng2=Environ$("DNDDOC")
 Strng2=Ucase$(Strng2)
 If Strng2<>Nul Then
    Config.Array3(52)=Strng2
    If Right$(Config.Array3(52),1)<>"\" Then
       Config.Array3(52)=Config.Array3(52)+"\"
    Endif
 Endif
 If Config.Array3(52)=Nul Then
    Config.Array3(52)=Curdir$+"\"
 Endif
 Strng2=Environ$("DNDTEMP")
 Strng2=Ucase$(Strng2)
 If Strng2<>Nul Then
    Config.Array3(53)=Strng2
    If Right$(Config.Array3(53),1)<>"\" Then
       Config.Array3(53)=Config.Array3(53)+"\"
    Endif
 Endif
 If Config.Array3(53)=Nul Then
    Config.Array3(53)=Curdir$+"\"
 Endif
 Strng2=Environ$("DNDMESS")
 Strng2=Ucase$(Strng2)
 If Strng2<>Nul Then
    Config.Array3(54)=Strng2
    If Right$(Config.Array3(54),1)<>"\" Then
       Config.Array3(54)=Config.Array3(54)+"\"
    Endif
 Endif
 If Config.Array3(54)=Nul Then
    Config.Array3(54)=Curdir$+"\"
 Endif
 Config.Array3(91)=Dnd.Path+Config.Array3(91) ' inline qbasic
 Config.Array3(92)=Dnd.Path+Config.Array3(92) ' inline edit.com
ErrorResume32:
 Exit Sub
ErrorExit32:
 Resume ErrorResume32
End Sub

Sub Page8.Mouse.Select(Var)
 On Local Error Goto ErrorExit33
 Select Case Temp4
 Case 1
    Restore Page.Eight.DataA
 Case 2
    Restore Page.Eight.DataB
 Case 3
    Restore Page.Eight.DataC
 Case 4
    Restore Page.Eight.DataD
 End Select
 For VarX=1 To TempA
    Read Xcoor,Ycoor,Row,Column,Line.Length
    If Mouse.Row=Xcoor Then
       If Mouse.Column>=Ycoor Then
          If Mouse.Column<=Ycoor+Line.Length-1 Then
             If Var Then
                Strng3=Chr$(1)+Chr$(VarX)
             Else
                Strng3=Chr$(13)
             Endif
             Exit For
          Endif
       Endif
    Endif
 Next
ErrorResume33:
 Exit Sub
ErrorExit33:
 Resume ErrorResume33
End Sub

Sub Edit.Page.Eight
 On Local Error Goto ErrorExit34
 Call Edit.Page.Eight.1
 Do While Lost.Carrier=False
    Strng3=Nul
    Do While Strng3=Nul
       If Lost.Carrier Then
          Exit Do
       Endif
       Call Read.Keyboard(Strng3)
       If Strng3 = Chr$(21) Then ' ^U = pageup
          Strng3 = Chr$(0) + Chr$(73)
       Endif
       If Strng3 = Chr$(14) Then ' ^N = pagedown
          Strng3 = Chr$(0) + Chr$(81)
       Endif
       Call Mouse.Driver(3)
       If Mouse.Button2 Then
          Strng3=Chr$(27)
       Endif
       If Mouse.Button3 Then
          Call Terminate.Program(True)
          End
       Endif
       If Mouse.Button Then
          Call Page8.Mouse.Select(False)
          If Len(Strng3) Then
	     Exit Do
	  Endif
          Call Edit.Mouse.Button
          If Len(Strng3) Then
             Exit Do
          Endif
       Endif
       If Mouse.Row Or Mouse.Column Then
          Call Page8.Mouse.Select(True)
          If Len(Strng3) Then
	     Exit Do
	  Endif
       Endif
    Loop
    Select Case Len(Strng3)
    Case 1
       ' compare letter to left of command
       IF Ucase$(Strng3)>="A" And Ucase$(Strng3)<="Z" Then
          Select Case Temp4
          Case 1
             ' check to right first then from the left
             VarQ = 0
             For VarZ = Temp3 + 1 To MaxUserCommands
                If Left$(Command.Set(VarZ,1),1)=Ucase$(Strng3) Then
                   VarQ = -1
                   Temp1=1
                   Temp3=VarZ
                   For VarX=2 To 7
                      Call Select.Page.EightA(VarX,False)
                   Next
                   Call Select.Page.EightA(1,True)
                   Exit For
                Endif
             Next
             If VarQ = 0 Then
                For VarZ = 1 To Temp3
                   If Left$(Command.Set(VarZ,1),1)=Ucase$(Strng3) Then
                      VarQ = -1
                      Temp1=1
                      Temp3=VarZ
                      For VarX=2 To 7
                         Call Select.Page.EightA(VarX,False)
                      Next
                      Call Select.Page.EightA(1,True)
                      Exit For
                   Endif
                Next
             Endif
          Case 2
             VarQ = 0
             For VarZ = Temp3 + 1 To MaxNodeCommands
                If Left$(Node.Commands(VarZ),1)=Ucase$(Strng3) Then
                   VarQ = -1
                   Temp1=1
                   Temp3=VarZ
                   For VarX=2 To 4
                      Call Select.Page.EightB(VarX,False)
                   Next
                   Call Select.Page.EightB(1,True)
                   Exit For
                Endif
             Next
             If VarQ = 0 Then
                For VarZ = 1 To Temp3
                   If Left$(Node.Commands(VarZ),1)=Ucase$(Strng3) Then
                      VarQ = -1
                      Temp1=1
                      Temp3=VarZ
                      For VarX=2 To 4
                         Call Select.Page.EightB(VarX,False)
                      Next
                      Call Select.Page.EightB(1,True)
                      Exit For
                   Endif
                Next
             Endif
          Case 3
             VarQ = 0
             For VarZ = Temp3 + 1 To MaxDMCommands
                If Left$(DMCommands(VarZ),1)=Ucase$(Strng3) Then
                   VarQ = -1
                   Temp1=1
                   Temp3=VarZ
                   For VarX=2 To 4
                      Call Select.Page.EightC(VarX,False)
                   Next
                   Call Select.Page.EightC(1,True)
                   Exit For
                Endif
             Next
             If VarQ = 0 Then
                For VarZ = 1 To Temp3
                   If Left$(DMCommands(VarZ),1)=Ucase$(Strng3) Then
                      VarQ = -1
                      Temp1=1
                      Temp3=VarZ
                      For VarX=2 To 4
                         Call Select.Page.EightC(VarX,False)
                      Next
                      Call Select.Page.EightC(1,True)
                      Exit For
                   Endif
                Next
             Endif
          Case 4
             VarQ = 0
             For VarZ = Temp3 + 1 To MaxSysopCommands
                If Left$(Sysop.Commands(VarZ),1)=Ucase$(Strng3) Then
                   VarQ = -1
                   Temp1=1
                   Temp3=VarZ
                   For VarX=2 To 4
                      Call Select.Page.EightD(VarX,False)
                   Next
                   Call Select.Page.EightD(1,True)
                   Exit For
                Endif
             Next
             If VarQ = 0 Then
                For VarZ = 1 To Temp3 
                   If Left$(Sysop.Commands(VarZ),1)=Ucase$(Strng3) Then
                      VarQ = -1
                      Temp1=1
                      Temp3=VarZ
                      For VarX=2 To 4
                         Call Select.Page.EightD(VarX,False)
                      Next
                      Call Select.Page.EightD(1,True)
                      Exit For
                   Endif
                Next
             Endif
          End Select
       Endif
       Select Case Strng3
       Case Chr$(27)
          Exit Sub
       Case Chr$(8)
          Select Case Temp4
          Case 1
             Call Help(15)
             Call Edit.Page.Eight.1
          Case 2
             Call Help(16)
             Call Edit.Page.Eight.2
          Case 3
             Call Help(17)
             Call Edit.Page.Eight.3
          Case 4
             Call Help(18)
             Call Edit.Page.Eight.4
          End Select
       Case Chr$(13)
          Select Case Temp4
          Case 1
             Call Edit.Page.EightA.Screen
          Case 2
             Call Edit.Page.EightB.Screen
          Case 3
             Call Edit.Page.EightC.Screen
          Case 4
             Call Edit.Page.EightD.Screen
          End Select
       End Select
    Case 2
       Select Case Asc(Left$(Strng3,1))
       Case 0
          Select Case Asc(Right$(Strng3,1))
          Case 0
             Exit Sub
          Case 72, 141, 152
             Select Case Temp4
             Case 1
                If Temp1>1 Then
                   Call Select.Page.EightA(Temp1,False)
                   Temp1=Temp1-1
                   Call Select.Page.EightA(Temp1,True)
                Endif
             Case 2
                If Temp1>1 Then
                   Call Select.Page.EightB(Temp1,False)
                   Temp1=Temp1-1
                   Call Select.Page.EightB(Temp1,True)
                Endif
             Case 3
                If Temp1>1 Then
                   Call Select.Page.EightC(Temp1,False)
                   Temp1=Temp1-1
                   Call Select.Page.EightC(Temp1,True)
                Endif
             Case 4
                If Temp1>1 Then
                   Call Select.Page.EightD(Temp1,False)
                   Temp1=Temp1-1
                   Call Select.Page.EightD(Temp1,True)
                Endif
             End Select
          Case 80, 145, 160
             Select Case Temp4
             Case 1
                If Temp1<7 Then
                   Call Select.Page.EightA(Temp1,False)
                   Temp1=Temp1+1
                   Call Select.Page.EightA(Temp1,True)
                Endif
             Case 2
                If Temp1<3 Then
                   Call Select.Page.EightB(Temp1,False)
                   Temp1=Temp1+1
                   Call Select.Page.EightB(Temp1,True)
                Endif
             Case 3
                If Temp1<3 Then
                   Call Select.Page.EightC(Temp1,False)
                   Temp1=Temp1+1
                   Call Select.Page.EightC(Temp1,True)
                Endif
             Case 4
                If Temp1<3 Then
                   Call Select.Page.EightD(Temp1,False)
                   Temp1=Temp1+1
                   Call Select.Page.EightD(Temp1,True)
                Endif
             End Select
          Case 73
             Select Case Temp4
             Case 1
                If Temp3>1 Then
                   Temp1=1
                   Temp3=Temp3-1
                   For VarX=2 To 7
                      Call Select.Page.EightA(VarX,False)
                   Next
                   Call Select.Page.EightA(1,True)
                Endif
             Case 2
                If Temp3>1 Then
                   Temp1=1
                   Temp3=Temp3-1
                   For VarX=2 To 4
                      Call Select.Page.EightB(VarX,False)
                   Next
                   Call Select.Page.EightB(1,True)
                Endif
             Case 3
                If Temp3>1 Then
                   Temp1=1
                   Temp3=Temp3-1
                   For VarX=2 To 4
                      Call Select.Page.EightC(VarX,False)
                   Next
                   Call Select.Page.EightC(1,True)
                Endif
             Case 4
                If Temp3>1 Then
                   Temp1=1
                   Temp3=Temp3-1
                   For VarX=2 To 4
                      Call Select.Page.EightD(VarX,False)
                   Next
                   Call Select.Page.EightD(1,True)
                Endif
             End Select
          Case 81
             Select Case Temp4
             Case 1
                If Temp3<MaxUserCommands Then
                   Temp1=1
                   Temp3=Temp3+1
                   For VarX=2 To 7
                      Call Select.Page.EightA(VarX,False)
                   Next
                   Call Select.Page.EightA(1,True)
                Endif
             Case 2
                If Temp3<MaxNodeCommands Then
                   Temp1=1
                   Temp3=Temp3+1
                   For VarX=2 To 4
                      Call Select.Page.EightB(VarX,False)
                   Next
                   Call Select.Page.EightB(1,True)
                Endif
             Case 3
                If Temp3<MaxDMCommands Then
                   Temp1=1
                   Temp3=Temp3+1
                   For VarX=2 To 4
                      Call Select.Page.EightC(VarX,False)
                   Next
                   Call Select.Page.EightC(1,True)
                Endif
             Case 4
                If Temp3<MaxSysopCommands Then
                   Temp1=1
                   Temp3=Temp3+1
                   For VarX=2 To 4
                      Call Select.Page.EightD(VarX,False)
                   Next
                   Call Select.Page.EightD(1,True)
                Endif
             End Select
          Case 118 ' control-page down
             If Local.Mode Or Sysop Then
                If Temp4<4 Then
                   Temp4=Temp4+1
                   Select Case Temp4
                   Case 1
                      Call Edit.Page.Eight.1
                   Case 2
                      Call Edit.Page.Eight.2
                   Case 3
                      Call Edit.Page.Eight.3
                   Case 4
                      Call Edit.Page.Eight.4
                   End Select
                Endif
             Endif
          Case 132 ' control-page up
             If Temp4>1 Then
                Temp4=Temp4-1
                Select Case Temp4
                Case 1
                   Call Edit.Page.Eight.1
                Case 2
                   Call Edit.Page.Eight.2
                Case 3
                   Call Edit.Page.Eight.3
                Case 4
                   Call Edit.Page.Eight.4
                End Select
             Endif
          End Select
       Case 1
          Temp2=Asc(Right$(Strng3,1))
          If Temp2<>Temp1 Then
             Select Case Temp4
             Case 1
                Call Select.Page.EightA(Temp1,False)
                Temp1=Temp2
                Call Select.Page.EightA(Temp1,True)
             Case 2
                Call Select.Page.EightB(Temp1,False)
                Temp1=Temp2
                Call Select.Page.EightB(Temp1,True)
             Case 3
                Call Select.Page.EightC(Temp1,False)
                Temp1=Temp2
                Call Select.Page.EightC(Temp1,True)
             Case 4
                Call Select.Page.EightD(Temp1,False)
                Temp1=Temp2
                Call Select.Page.EightD(Temp1,True)
             End Select
          Endif
       End Select
    End Select
 Loop
ErrorResume34:
 Exit Sub
ErrorExit34:
 Resume ErrorResume34
End Sub

Sub Edit.Page.Eight.1
 On Local Error Goto ErrorExit35
 Call Display.Page.Eight.A
 Temp1=1
 Temp3=1
 Temp4=1
 TempA=7
 For VarX=2 To 7
    Call Select.Page.EightA(VarX,False)
 Next
 Call Select.Page.EightA(1,True)
ErrorResume35:
 Exit Sub
ErrorExit35:
 Resume ErrorResume35
End Sub

Sub Edit.Page.Eight.2
 On Local Error Goto ErrorExit36
 Call Display.Page.Eight.B
 Temp1=1
 Temp3=1
 Temp4=2
 TempA=4
 For VarX=2 To 4
    Call Select.Page.EightB(VarX,False)
 Next
 Call Select.Page.EightB(1,True)
ErrorResume36:
 Exit Sub
ErrorExit36:
 Resume ErrorResume36
End Sub

Sub Edit.Page.Eight.3
 On Local Error Goto ErrorExit37
 Call Display.Page.Eight.C
 Temp1=1
 Temp3=1
 Temp4=3
 TempA=4
 For VarX=2 To 4
    Call Select.Page.EightC(VarX,False)
 Next
 Call Select.Page.EightC(1,True)
ErrorResume37:
 Exit Sub
ErrorExit37:
 Resume ErrorResume37
End Sub

Sub Edit.Page.Eight.4
 On Local Error Goto ErrorExit38
 Call Display.Page.Eight.D
 Temp1=1
 Temp3=1
 Temp4=4
 TempA=4
 For VarX=2 To 4
    Call Select.Page.EightD(VarX,False)
 Next
 Call Select.Page.EightD(1,True)
ErrorResume38:
 Exit Sub
ErrorExit38:
 Resume ErrorResume38
End Sub

Sub Select.Page.EightA(VarX,VarY)
 On Local Error Goto ErrorExit39
 If VarY=False Then
    Call ANSI(4,33,44)
 Else
    Call ANSI(4,37,45)
 Endif
 Select Case VarX
 Case 1
    Call ANSI(2,2,11)
    Strng2=Space$(27)
    Call Scrn(Strng2)
    Call ANSI(2,2,11)
    Strng2=Command.Set(Temp3,1)
    Select Case Command.Param(Temp3)
    Case 0
       Strng2=Strng2+"(0 parameters)"
    Case 1
       Strng2=Strng2+"(1 parameter)"
    Case 2
       Strng2=Strng2+"(2 parameters)"
    Case 3
       Strng2=Strng2+"(3 parameters)"
    Case Else
       Strng2=Strng2+"(? parameters)"
    End Select
    Call Scrn(Strng2)
 Case 2
    Call ANSI(2,3,24)
    Strng2="  "
    Call Scrn(Strng2)
    Call ANSI(2,3,24)
    Strng2=Rtrim$(Command.Abbr(Temp3))
    Call Scrn(Strng2)
 Case 3
    Call ANSI(2,4,23)
    Strng2=Space$(12)
    Call Scrn(Strng2)
    Call ANSI(2,4,23)
    Strng2=Rtrim$(Command.Set(Temp3,2))
    Call Scrn(Strng2)
 Case 4
    Call ANSI(2,5,23)
    Strng2=Space$(12)
    Call Scrn(Strng2)
    Call ANSI(2,5,23)
    Strng2=Rtrim$(Command.Set(Temp3,3))
    Call Scrn(Strng2)
 Case 5
    Call ANSI(2,6,29)
    Strng2=Right$(Str$(Command.Time(Temp3,1)+100),2)+":"+_
    Right$(Str$(Command.Time(Temp3,2)+100),2)+" - "+_
    Right$(Str$(Command.Time(Temp3,3)+100),2)+":"+_
    Right$(Str$(Command.Time(Temp3,4)+100),2)
    Call Scrn(Strng2)
 Case 6
    Call ANSI(2,7,41)
    Strng2=Space$(5)
    Call Scrn(Strng2)
    Call ANSI(2,7,41)
    Strng2=Mid$(Str$(Command.Limit(Temp3)),2)
    Call Scrn(Strng2)
 Case 7
    Call ANSI(2,8,44)
    Strng2="Edit"
    Call Scrn(Strng2)
 End Select
ErrorResume39:
 Exit Sub
ErrorExit39:
 Resume ErrorResume39
End Sub

Sub Select.Page.EightB(VarX,VarY)
 On Local Error Goto ErrorExit40
 If VarY=False Then
    Call ANSI(4,33,44)
 Else
    Call ANSI(4,37,45)
 Endif
 Select Case VarX
 Case 1
    Call ANSI(2,2,24)
    Strng2=Space$(3)
    Call Scrn(Strng2)
    Call ANSI(2,2,24)
    If Config.Array2(111) Then
       Strng2="No"
    Else
       Strng2="Yes"
    Endif
    Call Scrn(Strng2)
 Case 2
    Call ANSI(2,3,16)
    Strng2=Space$(10)
    Call Scrn(Strng2)
    Call ANSI(2,3,16)
    Strng2=Node.Commands(Temp3)
    Call Scrn(Strng2)
 Case 3
    Call ANSI(2,4,44)
    Strng2="Edit"
    Call Scrn(Strng2)
 End Select
ErrorResume40:
 Exit Sub
ErrorExit40:
 Resume ErrorResume40
End Sub

Sub Select.Page.EightC(VarX,VarY)
 On Local Error Goto ErrorExit41
 If VarY=False Then
    Call ANSI(4,33,44)
 Else
    Call ANSI(4,37,45)
 Endif
 Select Case VarX
 Case 1
    Call ANSI(2,2,22)
    Strng2=Space$(3)
    Call Scrn(Strng2)
    Call ANSI(2,2,22)
    If Config.Array2(112) Then
       Strng2="No"
    Else
       Strng2="Yes"
    Endif
    Call Scrn(Strng2)
 Case 2
    Call ANSI(2,3,14)
    Strng2=Space$(27)
    Call Scrn(Strng2)
    Call ANSI(2,3,14)
    Strng2=DMCommands(Temp3)
    Select Case DMCommand.Param(Temp3)
    Case 0
       Strng2=Strng2+"(0 parameters)"
    Case 1
       Strng2=Strng2+"(1 parameter)"
    Case 2
       Strng2=Strng2+"(2 parameters)"
    Case Else
       Strng2=Strng2+"(? parameters)"
    End Select
    Call Scrn(Strng2)
 Case 3
    Call ANSI(2,4,44)
    Strng2="Edit"
    Call Scrn(Strng2)
 End Select
ErrorResume41:
 Exit Sub
ErrorExit41:
 Resume ErrorResume41
End Sub

Sub Select.Page.EightD(VarX,VarY)
 On Local Error Goto ErrorExit42
 If VarY=False Then
    Call ANSI(4,33,44)
 Else
    Call ANSI(4,37,45)
 Endif
 Select Case VarX
 Case 1
    Call ANSI(2,2,25)
    Strng2=Space$(3)
    Call Scrn(Strng2)
    Call ANSI(2,2,25)
    If Config.Array2(113) Then
       Strng2="No"
    Else
       Strng2="Yes"
    Endif
    Call Scrn(Strng2)
 Case 2
    Call ANSI(2,3,17)
    Strng2=Space$(12)
    Call Scrn(Strng2)
    Call ANSI(2,3,17)
    Strng2=Sysop.Commands(Temp3)
    Call Scrn(Strng2)
 Case 3
    Call ANSI(2,4,44)
    Strng2="Edit"
    Call Scrn(Strng2)
 End Select
ErrorResume42:
 Exit Sub
ErrorExit42:
 Resume ErrorResume42
End Sub

Sub Edit.Page.EightA.Screen
 On Local Error Goto ErrorExit43
 Restore Page.Eight.DataA
 For Temp2=1 To Temp1
    Read Xcoor,Ycoor,Row,Column,Line.Length
 Next
 Select Case Temp1
 Case 1
    TempC$=Rtrim$(Command.Set(Temp3,1))
    Call ScreenEdit
    Command.Set(Temp3,1)=Ucase$(TempC$)
 Case 2
    TempC$=Rtrim$(Command.Abbr(Temp3))
    Call ScreenEdit
    Command.Abbr(Temp3)=Ucase$(TempC$)
 Case 3
    TempC$=Rtrim$(Command.Set(Temp3,2))
    Call ScreenEdit
    Command.Set(Temp3,2)=Ucase$(TempC$)
 Case 4
    TempC$=Rtrim$(Command.Set(Temp3,3))
    Call ScreenEdit
    Command.Set(Temp3,3)=Ucase$(TempC$)
 Case 5
    Xcoor=6
    Ycoor=29
    Row=6
    Column=29
    Line.Length=2
    TempC$=Right$(Str$(Command.Time(Temp3,1)+100),2)
    Call ScreenEdit
    Command.Time(Temp3,1)=Int(Val(TempC$)+.5)
    Xcoor=6
    Ycoor=32
    Row=6
    Column=32
    Line.Length=2
    TempC$=Right$(Str$(Command.Time(Temp3,2)+100),2)
    Call ScreenEdit
    Command.Time(Temp3,2)=Int(Val(TempC$)+.5)
    Xcoor=6
    Ycoor=37
    Row=6
    Column=37
    Line.Length=2
    TempC$=Right$(Str$(Command.Time(Temp3,3)+100),2)
    Call ScreenEdit
    Command.Time(Temp3,3)=Int(Val(TempC$)+.5)
    Xcoor=6
    Ycoor=40
    Row=6
    Column=40
    Line.Length=2
    TempC$=Right$(Str$(Command.Time(Temp3,4)+100),2)
    Call ScreenEdit
    Command.Time(Temp3,4)=Int(Val(TempC$)+.5)
 Case 6
    Xcoor=7
    Ycoor=41
    Row=7
    Column=41
    Line.Length=5
    TempC$=Mid$(Str$(Command.Limit(Temp3)),2)
    Call ScreenEdit
    Command.Limit(Temp3)=Int(Val(TempC$)+.5)
 Case 7
    For Var=1 To 8
       Call ANSI(4,32,44)
       Call ANSI(2,Var+8,2)
       Strng2=Class.Name(Var)
       Call Scrn(Strng2)
       Call ANSI(4,33,44)
       Call ANSI(2,Var+8,20)
       If Command.Class(Temp3,Var) Then
          Strng2="Yes"
       Else
          Strng2="No"
       Endif
       Call Scrn(Strng2)
    Next
    For Var=1 To 8
       Xcoor=Var+8
       Ycoor=20
       Row=Var+8
       Column=20
       Line.Length=3
       If Command.Class(Temp3,Var) Then
          Strng2="Yes"
       Else
          Strng2="No"
       Endif
       TempC$=Strng2
       Call ScreenEdit
       Yes=Ucase$(Left$(TempC$,1))="Y"
       Command.Class(Temp3,Var)=Yes
       Call ANSI(4,33,44)
       Call ANSI(2,Var+8,20)
       Call Scrn("   ")
       Call ANSI(2,Var+8,20)
       If Command.Class(Temp3,Var) Then
          Strng2="Yes"
       Else
          Strng2="No"
       Endif
       Call Scrn(Strng2)
    Next
    Call ANSI(4,37,44)
    For Var=1 To 8
       Call ANSI(2,Var+8,2)
       Strng2=Space$(40)
       Call Scrn(Strng2)
    Next
 End Select
 Call Select.Page.EightA(Temp1,True)
ErrorResume43:
 Exit Sub
ErrorExit43:
 Resume ErrorResume43
End Sub

Sub Edit.Page.EightB.Screen
 On Local Error Goto ErrorExit44
 Restore Page.Eight.DataB
 For Temp2=1 To Temp1
    Read Xcoor,Ycoor,Row,Column,Line.Length
 Next
 Select Case Temp1
 Case 1
    If Config.Array2(111) Then
       TempC$="No"
    Else
       TempC$="Yes"
    Endif
    Call ScreenEdit
    No=Ucase$(Left$(TempC$,1))="N"
    Config.Array2(111)=No
 Case 2
    TempC$=Rtrim$(Node.Commands(Temp3))
    Call ScreenEdit
    Node.Commands(Temp3)=Ucase$(TempC$)
 Case 3
    For Var=1 To 8
       Call ANSI(4,32,44)
       Call ANSI(2,Var+4,2)
       Strng2=Class.Name(Var)
       Call Scrn(Strng2)
       Call ANSI(4,33,44)
       Call ANSI(2,Var+4,20)
       If Node.Command.Class(Temp3,Var) Then
          Strng2="Yes"
       Else
          Strng2="No"
       Endif
       Call Scrn(Strng2)
    Next
    For Var=1 To 8
       Xcoor=Var+4
       Ycoor=20
       Row=Var+4
       Column=20
       Line.Length=3
       If Node.Command.Class(Temp3,Var) Then
          Strng2="Yes"
       Else
          Strng2="No"
       Endif
       TempC$=Strng2
       Call ScreenEdit
       Yes=Ucase$(Left$(TempC$,1))="Y"
       Node.Command.Class(Temp3,Var)=Yes
       Call ANSI(4,33,44)
       Call ANSI(2,Var+4,20)
       Call Scrn("   ")
       Call ANSI(2,Var+4,20)
       If Node.Command.Class(Temp3,Var) Then
          Strng2="Yes"
       Else
          Strng2="No"
       Endif
       Call Scrn(Strng2)
    Next
    Call ANSI(4,37,44)
    For Var=1 To 8
       Call ANSI(2,Var+4,2)
       Strng2=Space$(40)
       Call Scrn(Strng2)
    Next
 End Select
 Call Select.Page.EightB(Temp1,True)
ErrorResume44:
 Exit Sub
ErrorExit44:
 Resume ErrorResume44
End Sub

Sub Edit.Page.EightC.Screen
 On Local Error Goto ErrorExit45
 Restore Page.Eight.DataC
 For Temp2=1 To Temp1
    Read Xcoor,Ycoor,Row,Column,Line.Length
 Next
 Select Case Temp1
 Case 1
    If Config.Array2(112) Then
       TempC$="No"
    Else
       TempC$="Yes"
    Endif
    Call ScreenEdit
    No=Ucase$(Left$(TempC$,1))="N"
    Config.Array2(112)=No
 Case 2
    TempC$=Rtrim$(DMCommands(Temp3))
    Call ScreenEdit
    DMCommands(Temp3)=Ucase$(TempC$)
 Case 3
    For Var=1 To 3
       Call ANSI(4,32,44)
       Call ANSI(2,Var+4,2)
       Select Case Var
       Case 1
          Strng2="Guild Master"
       Case 2
          Strng2="Governor"
       Case 3
          Strng2="Town Mayor"
       End Select
       Call Scrn(Strng2)
       Call ANSI(4,33,44)
       Call ANSI(2,Var+4,20)
       If DM.Command.Class(Temp3,Var) Then
          Strng2="Yes"
       Else
          Strng2="No"
       Endif
       Call Scrn(Strng2)
    Next
    For Var=1 To 3
       Xcoor=Var+4
       Ycoor=20
       Row=Var+4
       Column=20
       Line.Length=3
       If DM.Command.Class(Temp3,Var) Then
          Strng2="Yes"
       Else
          Strng2="No"
       Endif
       TempC$=Strng2
       Call ScreenEdit
       Yes=Ucase$(Left$(TempC$,1))="Y"
       DM.Command.Class(Temp3,Var)=Yes
       Call ANSI(4,33,44)
       Call ANSI(2,Var+4,20)
       Call Scrn("   ")
       Call ANSI(2,Var+4,20)
       If DM.Command.Class(Temp3,Var) Then
          Strng2="Yes"
       Else
          Strng2="No"
       Endif
       Call Scrn(Strng2)
    Next
    Call ANSI(4,37,44)
    For Var=1 To 3
       Call ANSI(2,Var+4,2)
       Strng2=Space$(40)
       Call Scrn(Strng2)
    Next
 End Select
 Call Select.Page.EightC(Temp1,True)
ErrorResume45:
 Exit Sub
ErrorExit45:
 Resume ErrorResume45
End Sub

Sub Edit.Page.EightD.Screen
 On Local Error Goto ErrorExit46
 Restore Page.Eight.DataD
 For Temp2=1 To Temp1
    Read Xcoor,Ycoor,Row,Column,Line.Length
 Next
 Select Case Temp1
 Case 1
    If Config.Array2(113) Then
       TempC$="No"
    Else
       TempC$="Yes"
    Endif
    Call ScreenEdit
    No=Ucase$(Left$(TempC$,1))="N"
    Config.Array2(113)=No
 Case 2
    TempC$=Rtrim$(Sysop.Commands(Temp3))
    Call ScreenEdit
    Sysop.Commands(Temp3)=Ucase$(TempC$)
 Case 3
    Call ANSI(4,32,44)
    Call ANSI(2,5,2)
    Strng2="Sysop"
    Call Scrn(Strng2)
    Call ANSI(4,33,44)
    Call ANSI(2,5,20)
    If Sysop.Command.Class(Temp3) Then
       Strng2="Yes"
    Else
       Strng2="No"
    Endif
    Call Scrn(Strng2)
    Xcoor=5
    Ycoor=20
    Row=5
    Column=20
    Line.Length=3
    If Sysop.Command.Class(Temp3) Then
       Strng2="Yes"
    Else
       Strng2="No"
    Endif
    TempC$=Strng2
    Call ScreenEdit
    Yes=Ucase$(Left$(TempC$,1))="Y"
    Sysop.Command.Class(Temp3)=Yes
    Call ANSI(4,33,44)
    Call ANSI(2,5,20)
    Call Scrn("   ")
    Call ANSI(2,5,20)
    If Sysop.Command.Class(Temp3) Then
       Strng2="Yes"
    Else
       Strng2="No"
    Endif
    Call Scrn(Strng2)
    Call ANSI(4,37,44)
    Call ANSI(2,5,2)
    Strng2=Space$(40)
    Call Scrn(Strng2)
 End Select
 Call Select.Page.EightD(Temp1,True)
ErrorResume46:
 Exit Sub
ErrorExit46:
 Resume ErrorResume46
End Sub

' edit field data
' Xcoor, Ycoor, Row, Column, Line.Length.

Page.Eight.DataA:

Data 2,11,2,11,12
Data 3,24,3,24,2
Data 4,23,4,23,12
Data 5,23,5,23,12
Data 6,29,6,29,13
Data 7,41,7,41,5
Data 8,44,8,44,4

Page.Eight.DataB:

Data 2,24,2,24,3
Data 3,16,3,16,10
Data 4,44,4,44,4

Page.Eight.DataC:

Data 2,22,2,22,3
Data 3,14,3,14,12
Data 4,44,4,44,4

Page.Eight.DataD:

Data 2,25,2,25,3
Data 3,17,3,17,12
Data 4,44,4,44,4

Default.Data:

Data 12,4,6,3,9,6,10,5,10,3,5,4,9,6,5,4,11,5,6,3
Data 11,4,6,3,10,3,7,3,9,6,8,3,125,125,125,125,250,250,250,250

Data "1","2","3","4","5","6","7","8","9","10"
Data "11","12","13","14","15","16","17","18","19","20"

Data 15,30,60,12,.5,.5,.5,.5,.1,9
Data .5,.2,.2,.95,1000,.5,.5,.5,1,.25
Data .2,.2,.5,.75,.96,.91,.86,.5,.5,5
Data 10000!,10000!,0,0,0,0,0,1024!,1024!,60!

Data 3,0,-1,-1,-1,-1,-1,8,18,6
Data 10,1,0,-1,1,-1,0,-1,-1,-1
Data 3,2,1,2,25,21,10,10,10,15
Data 25,200,7,7,7,7,15,-1,0,4
Data 3,2,1,-1,0,0,180,-1,3,-1
Data 0,0,0,0,-1,180,3,-1,3,60
Data -1,10000,0,384,0,0,1,0,0,-1
Data -1,-1,-1,-1,-1,-1,-1,-1,0,-1
Data 0,2,0,6,-1,0,0,80,24,0
Data 5,6,-1,10,10,-1,0,-1,0,-1
Data 0,-1,0,0,0,0,-1,-1,-1,-1
Data 0,0,0,0,0,0,0,0,0,64
Data 1024,64,1024,-1,0,-1,0,0,-1,1024
Data 1024,0,1024,5,0,0,0,0,0,0
Data 0,0,75,5,10,0,0,0,0,0

Data "PRELOG","Remember your password!","WELCOME","NOTICE","Press <enter> to roll character, or <space> to reenter:","Press <enter> to begin the Adventure:","Command>","Next:","!","\"
Data "","MONCLASS","MONTALK","Enter (C)ontinue, (H)angup, or (R)estart:",".DAT","ROOMS","OBJECTS","MONSTERS","TREASURE","SPELLS"
Data "USERS","NONPLYRS","DNDCNFG","1","1","MAILHELP","MAILEDIT","LOGOFF","RND*10+(MHP/10-(SH+AR+BO+HE+TW+AM)/2+MW/2)*XX","(RND*STR+LVL/2)*(XX+PROF/100)-MS/2-MA/2+WE"
Data "DEX/10>RND*10+MLVL*2","RND*10+MLVL/10>DEX/2","RND*LVL+2>MLVL","DEX>RND*5+MLVL/2","RND*5+LVL>MLVL","RND*10+5>DEX*2","(FAT+VIT+MAG)*LVL+STR","LOGOFFH","ATM0E0Q0X1V1&C1&D2S0=1S2=255","ATA"
Data "ATM0H1","ATZ","(RND*INT+WIS)*(PSIA+XX)","(RND*(MHP/10)-PSID)*MPSI","(RND*10+10)+CON/2>20","PASSWORD","HELP","DNDBBS","LASTUSER","SUMMARY"
Data "DNDUSAGE","","","","EDITHELP","HELP","TEAMUSER","PUBLIC","MESSBASE","PRIVATE"
Data "LOGON",".DOC","DMHELP","HINT","CATALOG","ATD","DNDBBS.LOG","MESSWRK","ALTWRK","DOS"
Data "ACTIONS","DNDBBS.DAY","USERLOG","1,2,3,4,5,6,7,8,9,10,11,12,13,14,15","DNDTMP","DNDEDIT","Press <enter> to use character, or <space> to reroll:","/","|","CONTAINR"
Data "DSKLOG","LPT1:","0","C:\RBBS\","{","USERINV","CTNINV","TEAMINV","ROOMINV","MONINV"
Data "QBASIC.EXE","EDIT.COM","ROOMDESC","1000","20000","BANK","BADLOGIN","10.5","BANKLOG",".LOG"

Data "Lord","Wizard","Assassin","Bard","Monk","Knight","Priest","Empress","Assistant DM","Dungeon Master"
Data "Human","Elf","Gnome","Dwarf","Halfling","Half-elf","Half-orc","Ogre"
Data "Fighter","Magic User","Thief","Cleric","Paladin","Ranger","Druid","Lady","Assistant DM","Dungeon Master"
Data "Strength","Intelligence","Wisdom","Dexterity","Constitution","Piety","Charisma"
Data "north","east","south","west","northeast","southeast","southwest","northwest","up","down","in","out"
Data "one","two","three","four","five","six","seven","eight","nine","ten"
Data "blunt","pole","sharp","thrusting","good","neutral","evil","lawful","neutral","chaotic"

Data "AN","AS","AT","AWAY","BY","FROM","FOR","HE","HER","HERE"
Data "HERS","HIM","HIS","IN","INTO","IS","IT","ITS","LIKE","ME"
Data "MINE","MY","OF","ON","ONTO","OUR","OURS","OVER","SHE","THAT"
Data "THE","THEIR","THESE","THEM","THERE","THEY","THIS","THOSE","TO","UNDER"
Data "UNTO","UPON","US","WHO","WHOM","WHOSE","WITH","YOU","YOUR","YOURS"

' command data set
'  abbreviation, command, synonym 1, synonym 2, number of parameters,
'  eight class restrictions, four time restrictions, command time limit,
'  attack command type.
Data "AC","ACCEPT","TRADE","DECLINE",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "AL","ALIGNMENT","ARRANGE","ADJUST",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "AN","ANSI","<>","<>",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "AP","APPEAL","DELIVER","REDEEM",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "AU","AUTO","LOOP","AUTOMATIC",0,0,0,0,0,0,0,0,0,0,0,0,0,360,0
Data "AV","AVATAR","<>","<>",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "BS","BACKSTAB","HOAX","TRICK",1,0,0,0,0,0,0,0,0,0,0,0,0,0,-1
Data "BK","BANK","TRUST","FUND",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "BT","BEAT","DEFEAT","OVERCOME",1,0,0,0,0,0,0,0,0,0,0,0,0,0,-1
Data "BF","BEFUDDLE","MUDDLE","ADDLE",1,0,0,0,0,0,0,0,0,0,0,0,0,0,-1
Data "BG","BEGUILE","DISCOMFIT","DISCONCERT",0,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,-1
Data "BE","BEMUSE","CONFUSE","CONFOUND",1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,-1
Data "BW","BEWILDER","<>","<>",1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,-1
Data "BH","BEWITCH","<>","<>",1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,-1
Data "BL","BLESS","CONSECRATE","SANCTIFY",0,-1,-1,-1,0,-1,-1,-1,-1,0,0,0,0,0,0
Data "BL","BLESS","CONSECRATE","SANCTIFY",1,-1,-1,-1,0,-1,-1,-1,-1,0,0,0,0,0,0
Data "BR","BREAK","SMASH","CRUSH",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "BR","BREAK","SMASH","CRUSH",2,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "BB","BRIBE","OFFER","<>",2,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "BB","BRIBE","OFFER","<>",3,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "BI","BRIEF","SHORT","VERBOSE",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "BA","BULLETINS","<>","<>",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "BU","BUY","PURCHASE","PAY",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "CZ","CASINO","PLAY","<>",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "CS","CAST","DIRECT","AIM",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "CS","CAST","DIRECT","AIM",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "CT","CATALOG","HELPLIST","SHORTLIST",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "CH","CHARGE","RUSH","<>",1,0,0,0,0,0,0,0,0,0,0,0,0,0,-1
Data "CM","CHARM","ALLURE","ATTRACT",0,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,-1
Data "CA","CHAT","PAGE","<>",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "CI","CIRCLE","SURROUND","<>",1,0,0,0,0,0,0,0,0,0,0,0,0,0,-1
Data "CL","CLOSE","SHUT","<>",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "CO","COMMANDS","DIRECTIONS","INSTRUCTIONS",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "CN","CONFIGURE","SETTINGS","<>",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "CR","COUNTER","NEUTRALIZE","OFFSET",1,0,0,0,0,0,0,0,0,0,0,0,0,0,-1
Data "CU","CURSE","DESECRATE","DAMN",0,-1,-1,-1,0,-1,-1,-1,-1,0,0,0,0,0,0
Data "CU","CURSE","DESECRATE","DAMN",1,-1,-1,-1,0,-1,-1,-1,-1,0,0,0,0,0,0
Data "DY","DAYFILE","PROGRAM","AGENDA",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "DL","DAYLOG","LOGFILE","<>",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "DS","DISCHARGE","EMPTY","<>",2,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "DM","DISMOUNT","EXIT","LEAVE",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "DG","DODGE","AVOID","ELUDE",0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1
Data "DK","DRINK","QUAFF","<>",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "DX","DUPLEX","TELETYPE","UPPERCASE",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "ET","EAT","SWALLOW","INGEST",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "EC","ECHO","RESEND","LOWERCASE",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "EP","EXPERIENCE","PRESENT","<>",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "EX","EXIT","LEAVE","<>",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "FE","FEINT","FAKE","<>",1,0,0,0,0,0,0,0,0,0,0,0,0,0,-1
Data "FI","FIRE","EJECT","EXPEL",2,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "FX","FIX","MEND","RESTORE",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "FX","FIX","MEND","RESTORE",2,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "FY","FLY","<>","<>",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "FO","FOLLOW","TAIL","<>",1,-1,-1,-1,-1,0,0,-1,-1,0,0,0,0,360,0
Data "FU","FUEL","POWER","<>",2,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "GV","GIVE","HAND","<>",2,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "GO","GO","ENTER","WALK",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "GR","GRAPHICS","STATUSLINE","<>",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "GU","GUARD","DEFEND","<>",0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1
Data "HL","HEALTH","REVEAL","DISCLOSE",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "HP","HELP","AID","ASSIST",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "HP","HELP","AID","ASSIST",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "HD","HIDE","CONCEAL","BURY",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "HD","HIDE","CONCEAL","BURY",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "HD","HIDE","CONCEAL","BURY",2,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "HN","HINT","SUGGEST","<>",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "HO","HOLD","DRAW","WIELD",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "HU","HUNT","TRAIL","<>",0,-1,-1,-1,-1,0,0,-1,-1,0,0,0,0,360,0
Data "ID","IDENTIFY","RECOGNIZE","INVESTIGATE",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "ID","IDENTIFY","RECOGNIZE","INVESTIGATE",2,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "IF","INFORMATION","NEWS","ADVICE",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "IV","INVENTORY","DISPLAY","RECORD",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "KI","KILL","ATTACK","HIT",0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1
Data "KI","KILL","ATTACK","HIT",1,0,0,0,0,0,0,0,0,0,0,0,0,0,-1
Data "LT","LASTUSER","RECENT","PREVIOUS",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "LA","LAUNCH","LET","LOOSE",2,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "LR","LEARN","DISCOVER","<>",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "LY","LIGHT","<>","<>",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "LF","LINEFEEDS","<>","<>",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "LL","LINELENGTH","<>","<>",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "LS","LIST","TABLE","DOCUMENT",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "LD","LOAD","<>","<>",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "LK","LOCK","FETTER","SHACKLE",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "LG","LOGIN","RELOGIN","RESTART",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "LO","LOOK","READ","EXAMINE",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "LO","LOOK","READ","EXAMINE",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "LO","LOOK","READ","EXAMINE",2,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "LE","LOSE","ESCAPE","EVADE",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "LU","LUNGE","SIDESTEP","STRIKE",0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1
Data "ML","MAIL","VOTE","MAILBOX",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "MI","MIX","STIR","<>",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "MN","MOUNT","VAULT","STRADDLE",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "MV","MOVE","PUSH","PULL",2,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "NT","NOTICE","<>","<>",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "OP","OPEN","ACCESS","<>",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "PA","PAGELENGTH","<>","<>",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "PC","PANIC","MEANDER","RUN",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "PL","PARLEY","ASK","TALK",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "PR","PARRY","FENCE","<>",1,0,0,0,0,0,0,0,0,0,0,0,0,0,-1
Data "PW","PASSWORD","SECURE","SECURITY",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "PK","PICKLOCK","PRY","<>",1,-1,-1,0,-1,-1,-1,-1,-1,0,0,0,0,0,0
Data "PO","POUR","COMBINE","<>",2,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "PE","PRELOG","<>","<>",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "PP","PRESS","ACTIVATE","<>",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "PS","PSIONIC","ASTRAL","ENERGIZE",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "PM","PUMMEL","BUFFET","THRASH",1,0,0,0,0,0,0,0,0,0,0,0,0,0,-1
Data "PU","PUNCH","POUND","OVERTHROW",1,0,0,0,0,0,0,0,0,0,0,0,0,0,-1
Data "PT","PUT","DROP","SET",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "PT","PUT","DROP","SET",2,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "QU","QUIT","LOGOFF","BYE",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "RC","RECHARGE","CORRECT","<>",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "RL","RELOAD","<>","<>",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "RP","REPAIR","REBUILD","<>",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "RR","REROLL","ROLL","CHARACTER",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "RS","RESIST","OPPOSE","CONFLICT",1,0,0,0,0,0,0,0,0,0,0,0,0,0,-1
Data "RT","RETURN","REVERSE","RECOUP",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "RD","RIDE","TRAVEL","DRIVE",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "SV","SAVE","UPDATE","STORE",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "SH","SEARCH","FIND","SCAN",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "SH","SEARCH","FIND","SCAN",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "SH","SEARCH","FIND","SCAN",2,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "SL","SELL","PAWN","<>",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "SI","SHIELD","PROTECT","<>",0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1
Data "SR","SORT","REARRANGE","ORDER",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "SZ","STEAL","ROB","RIPOFF",2,-1,-1,0,-1,-1,-1,-1,-1,0,0,0,0,0,0
Data "SZ","STEAL","ROB","RIPOFF",3,-1,-1,0,-1,-1,-1,-1,-1,0,0,0,0,0,0
Data "SU","SUICIDE","DEATH","<>",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "SS","SWIM","<>","<>",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "SW","SWITCH","<>","<>",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "TA","TAKE","GET","GRAB",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "TA","TAKE","GET","GRAB",2,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "TM","TEAM","JOIN","MEMBER",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "TW","THROW","TOSS","<>",2,-1,-1,0,-1,-1,-1,-1,-1,0,0,0,0,0,0
Data "TH","THRUST","PIERCE","STAB",1,0,0,0,0,0,0,0,0,0,0,0,0,0,-1
Data "TI","TIME","DATE","CLOCK",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "TP","TOP","BEST","TOPTEN",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "TE","TRACE","MAP","CHART",0,-1,-1,-1,-1,0,0,-1,-1,0,0,0,0,360,0
Data "TC","TRACK","PURSUE","CHASE",0,-1,-1,-1,-1,0,0,-1,-1,0,0,0,0,360,0
Data "TR","TRAIN","TEACH","INSTRUCT",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "TU","TURN","DEFLECT","AVERT",1,0,0,0,0,0,0,0,0,0,0,0,0,0,-1
Data "UN","UNLOCK","FREE","RELEASE",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "US","USE","ACTIVATE","<>",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "US","USE","ACTIVATE","<>",2,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "UR","USERS","USERLIST","<>",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "WA","WAIT","PAUSE","SLEEP",0,0,0,0,0,0,0,0,0,0,0,0,0,360,0
Data "WR","WEAR","DRESS","<>",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "WC","WELCOME","<>","<>",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "WH","WHATIS","EQUATION","<>",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "WS","WISH","HOPE","DREAM",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "WW","WORDWRAP","LIMIT","<>",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "WI","WRITE","SCRIBBLE","DOODLE",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "IB","IMBUE","PURIFY","<>",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "ZA","ZAP","ZOT","<>",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "SK","SMOKE","DRAG","PUFF",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data "BZ","BURN","IGNITE","TORCH",1,0,0,0,0,0,0,0,0,0,0,0,0,0,0

' DM command set, number of parameters, restrictions: guild master, governor, town mayor
Data "ABORT",0,-1,-1,0,"ABORT",1,-1,-1,0,"BROADCAST",0,0,0,0,"CALL",0,0,0,0,"CALL",1,0,0,0
Data "DISCARD",1,-1,0,0,"EDIT",0,-1,-1,0,"EDIT",1,-1,-1,0,"GET",-1,-1,0,0,"HELP",0,0,0,0
Data "HELP",1,0,0,0,"INVISIBLE",0,0,0,0,"KILL",1,-1,0,0,"LINK",0,-1,-1,0,"NOID",0,0,0,0
Data "REDUCE",1,0,0,0,"STATUS",0,0,0,0,"TELEPORT",-1,0,0,0,"ZAP",0,-1,-1,0,"ZAP",1,-1,-1,0

' sysop command set, restriction (0=not restricted, -1=restricted)
Data "CLOCK",-1,"CONFIG",0,"DEBUG",0,"DOS",-1,"EDIT",0,"MONITOR",0
Data "PROGRAM",-1,"REBOOT",-1,"SHELL",-1,"SYSED",0,"USAGE",0,"UTILITY",0
Data "TOGGLE",0,"CONTROL",0,"PASSWORD",0

' node command set
Data "AUTO","BLOCK","BRIEF","CHAT","ECHO","GROUP","NOSEND","SAY","SEND"
Data "STATUS","SENDTO","QUIT","WHISPER","WAIT","WHO","YELL"

' 26 single letter commands, 0 for direction abbreviation
' ansi,brief,casino,down,east,save,guard,hide,in,team,kill,look,mail
Data 3,21,24,0,0,118,59,63,0,132,73,85,90
' north,out,panic,quit,suicide,south,train,up,health,west,time,inf,inv
Data 0,0,97,110,127,0,139,0,60,0,135,71,72

' screen options data
Data "Auto Answer",8,10,"Command Shell",10,10
Data "DOS Command",12,10,"Edit Utility",14,10
Data "Login Sysop",16,10,"Modem Recycle",8,56
Data "Originate Call",10,56,"Reconfigure System",12,56
Data "Screen Editor",14,56,"Terminate Program",16,56

' screen options data
Data "Logon Variables Screen",10,5,"Process Variables Screen",12,5
Data "File Variables Screen",14,5,"Rooms Variables Screen",16,5
Data "Command Variables Screen",10,50,"Modem Variables Screen",12,50
Data "Equation Variables Screen",14,50,"Security Variables Screen",16,50

' default equation parse data

' config.array3(29) - config.array3(37)
Data "RND*10+(MHP/10-(SH+AR+BO+HE+TW+AM)/2+MW/2)*XX"
Data "(RND*STR+LVL/2)*(XX+PROF/100)-MS/2-MA/2+WE"
Data "DEX/10>RND*10+MLVL*2"
Data "RND*10+MLVL/10>DEX/2"
Data "RND*LVL+2>MLVL"
Data "DEX>RND*5+MLVL/2"
Data "RND*5+LVL>MLVL"
Data "RND*10+5>DEX*2"
Data "(FAT+VIT+MAG)*LVL+STR"

' config.array3(43) - config.array3(45)
Data "(RND*INT+WIS)*(PSIA+XX)"
Data "(RND*(MHP/10)-PSID)*MPSI"
Data "(RND*10+10)+CON/2>20"

' default inventory names
Data "armor","boot","helmet","ring","shield"
Data "bracer","weapon","cloak","ring","amulet"
