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 / EDIT1.BAS < prev    next >
BASIC Source File  |  1993-01-07  |  135KB  |  5,289 lines

  1.  Rem edit1.bas v2.9c
  2.  Rem $Include: 'dndbbs.inc'
  3.  
  4. Sub Search.Object
  5.  On Local Error Goto 10002
  6.  Do
  7.     Temp1$=Nul
  8.     Temp1=False
  9.     Temp3=False
  10.     Temp4=False
  11.     Temp6=False
  12.     Temp7=False
  13.     Temp8=False
  14.     Temp9=False
  15.     Temp10=False
  16.     Do
  17.        Graphics.Off=True
  18.        If TempC=False Then
  19.           Strng="[A]object name substring"
  20.           If Temp1$<>Nul Then
  21.              Strng=Strng+Space$(30-Len(Strng))
  22.              Strng=Strng+"("+Temp1$+")"
  23.           Endif
  24.           Call IO.O
  25.           Strng="[B]room link number"
  26.           If Temp1 Then
  27.              Strng=Strng+Space$(30-Len(Strng))
  28.              Strng=Strng+"("+Mid$(Str$(Temp1),2)+")"
  29.           Endif
  30.           Call IO.O
  31.           Strng="[C]key number"
  32.           If Temp3 Then
  33.              Strng=Strng+Space$(30-Len(Strng))
  34.              Strng=Strng+"("+Mid$(Str$(Temp3),2)+")"
  35.           Endif
  36.           Call IO.O
  37.           Strng="[D]invisible objects"
  38.           If Temp4 Then
  39.              Strng=Strng+Space$(30-Len(Strng))
  40.              Strng=Strng+"(selected)"
  41.           Endif
  42.           Call IO.O
  43.           Strng="[E]hidden objects"
  44.           If Temp6 Then
  45.              Strng=Strng+Space$(30-Len(Strng))
  46.              Strng=Strng+"(selected)"
  47.           Endif
  48.           Call IO.O
  49.           Strng="[F]trapped objects"
  50.           If Temp7 Then
  51.              Strng=Strng+Space$(30-Len(Strng))
  52.              Strng=Strng+"(selected)"
  53.           Endif
  54.           Call IO.O
  55.           Strng="[G]locked objects"
  56.           If Temp8 Then
  57.              Strng=Strng+Space$(30-Len(Strng))
  58.              Strng=Strng+"(selected)"
  59.           Endif
  60.           Call IO.O
  61.           Strng="[H]objects which relock"
  62.           If Temp9 Then
  63.              Strng=Strng+Space$(30-Len(Strng))
  64.              Strng=Strng+"(selected)"
  65.           Endif
  66.           Call IO.O
  67.           Strng="[I]nonpermanent objects"
  68.           If Temp10 Then
  69.              Strng=Strng+Space$(30-Len(Strng))
  70.              Strng=Strng+"(selected)"
  71.           Endif
  72.           Call IO.O
  73.           Graphics.Off=False
  74.        Endif
  75.        Strng="Object search option(s to search, q to quit)?"
  76.        Line.Length=TempD
  77.        No.Input.Out="Q"
  78.        Call IO.I
  79.        Select Case Ucase$(Out2)
  80.        Case "A"
  81.           Strng="Object name substring?"
  82.           Call IO.I
  83.           Out2=Lcase$(Out2)
  84.           Temp1$=Out2
  85.        Case "B"
  86.           Strng="Room link number?"
  87.           Call IO.I
  88.           Temp1=Int(Val(Out2))
  89.        Case "C"
  90.           Strng="Key number?"
  91.           Call IO.I
  92.           Temp3=Int(Val(Out2))
  93.        Case "D"
  94.           Temp4=True
  95.        Case "E"
  96.           Temp6=True
  97.        Case "F"
  98.           Temp7=True
  99.        Case "G"
  100.           Temp8=True
  101.        Case "H"
  102.           Temp9=True
  103.        Case "I"
  104.           Temp10=True
  105.        Case "S"
  106.           Strng="Enter range:"
  107.           Call IO.O
  108.           Temp5=Lof(6)/Len(ObjectRecord)
  109.           Temp$=Mid$(Str$(Temp5),2)
  110.           Strng="From(1-"+Temp$+")?"
  111.           No.Input.Out="1"
  112.           Call IO.I
  113.           Temp=Int(Val(Out2))
  114.           If Temp<1 Or Temp>Temp5 Then
  115.              Strng=Range$
  116.              Call IO.O
  117.              Exit Do
  118.           Endif
  119.           Strng="To("+Mid$(Str$(Temp),2)+"-"+Temp$+")?"
  120.           No.Input.Out=Temp$
  121.           Call IO.I
  122.           Temp2=Int(Val(Out2))
  123.           If Temp2<Temp Then
  124.              Strng=Range$
  125.              Call IO.O
  126.              Exit Do
  127.           Endif
  128.           If Temp2>Temp5 Then
  129.              Temp2=Temp5
  130.           Endif
  131.           For Temp5=Temp To Temp2
  132.              Get 6,Temp5,ObjectRecord
  133.              TempX=False
  134.              If Temp1$<>Nul Then
  135.                 If Instr(ObjectRecord.ObjectName,Temp1$) Then
  136.                    TempX=True
  137.                 Endif
  138.              Endif
  139.              If Temp1 Then
  140.                 If ObjectRecord.RoomLink=Temp1 Then
  141.                    TempX=True
  142.                 Endif
  143.              Endif
  144.              If Temp3 Then
  145.                 If ObjectRecord.Keyed=Temp3 Then
  146.                    TempX=True
  147.                 Endif
  148.              Endif
  149.              If Temp4 Then
  150.                 If ObjectRecord.Invisible Then
  151.                    TempX=True
  152.                 Endif
  153.              Endif
  154.              If Temp6 Then
  155.                 If ObjectRecord.Hidden Then
  156.                    TempX=True
  157.                 Endif
  158.              Endif
  159.              If Temp7 Then
  160.                 If ObjectRecord.JailTrap Then
  161.                    TempX=True
  162.                 Endif
  163.              Endif
  164.              If Temp8 Then
  165.                 If ObjectRecord.Closed Then
  166.                    TempX=True
  167.                 Endif
  168.              Endif
  169.              If Temp9 Then
  170.                 If ObjectRecord.Relocks Then
  171.                    TempX=True
  172.                 Endif
  173.              Endif
  174.              If Temp10 Then
  175.                 If ObjectRecord.Permanent=False Then
  176.                    TempX=True
  177.                 Endif
  178.              Endif
  179.              If TempX Then
  180.                 Call Display.Object(False)
  181.                 Call More.Prompt
  182.                 If No Then
  183.                    Exit Do
  184.                 Endif
  185.              Endif
  186.           Next
  187.           Exit Do
  188.        Case "Q"
  189.           Exit Sub
  190.        End Select
  191.     Loop
  192.  Loop
  193. 10001
  194.  Exit Sub
  195. 10002
  196.  Resume 10001
  197. End Sub
  198.  
  199. Sub Search.Monsters
  200.  On Local Error Goto 10012
  201.  Do
  202.     Temp1$=Nul
  203.     Temp1=False
  204.     Temp3=False
  205.     Temp4=False
  206.     Temp6=False
  207.     Temp7=False
  208.     Temp8=False
  209.     Temp9=False
  210.     Temp10=False
  211.     Temp11=False
  212.     Temp12=False
  213.     Temp13=False
  214.     Do
  215.        Graphics.Off=True
  216.        If TempC=False Then
  217.           Strng="[A]monster name substring"
  218.           If Temp1$<>Nul Then
  219.              Strng=Strng+Space$(30-Len(Strng))
  220.              Strng=Strng+"("+Temp1$+")"
  221.           Endif
  222.           Call IO.O
  223.           Strng="[B]monster level"
  224.           If Temp1 Then
  225.              Strng=Strng+Space$(30-Len(Strng))
  226.              Strng=Strng+"("+Mid$(Str$(Temp1),2)+")"
  227.           Endif
  228.           Call IO.O
  229.           Strng="[C]hit points"
  230.           If Temp3>False And Temp4>False Then
  231.              Strng=Strng+Space$(30-Len(Strng))
  232.              Strng=Strng+"("+Mid$(Str$(Temp3),2)+"-"+Mid$(Str$(Temp4),2)+")"
  233.           Endif
  234.           Call IO.O
  235.           Strng="[D]experience"
  236.           If Temp6>False And Temp7>False Then
  237.              Strng=Strng+Space$(30-Len(Strng))
  238.              Strng=Strng+"("+Mid$(Str$(Temp6),2)+"-"+Mid$(Str$(Temp7),2)+")"
  239.           Endif
  240.           Call IO.O
  241.           Strng="[E]poisons"
  242.           If Temp8 Then
  243.              Strng=Strng+Space$(30-Len(Strng))
  244.              Strng=Strng+"(selected)"
  245.           Endif
  246.           Call IO.O
  247.           Strng="[F]drains levels"
  248.           If Temp9 Then
  249.              Strng=Strng+Space$(30-Len(Strng))
  250.              Strng=Strng+"(selected)"
  251.           Endif
  252.           Call IO.O
  253.           Strng="[G]casts spells"
  254.           If Temp10 Then
  255.              Strng=Strng+Space$(30-Len(Strng))
  256.              Strng=Strng+"(selected)"
  257.           Endif
  258.           Call IO.O
  259.           Strng="[H]jails attacker"
  260.           If Temp11 Then
  261.              Strng=Strng+Space$(30-Len(Strng))
  262.              Strng=Strng+"(selected)"
  263.           Endif
  264.           Call IO.O
  265.           Strng="[I]psionic monsters"
  266.           If Temp12 Then
  267.              Strng=Strng+Space$(30-Len(Strng))
  268.              Strng=Strng+"(selected)"
  269.           Endif
  270.           Call IO.O
  271.           Strng="[J]equation"
  272.           If Temp13 Then
  273.              Strng=Strng+Space$(30-Len(Strng))
  274.              Strng=Strng+"(selected)"
  275.           Endif
  276.           Call IO.O
  277.           Graphics.Off=False
  278.        Endif
  279.        Strng="Monster search option(s to search, q to quit)?"
  280.        Line.Length=TempD
  281.        No.Input.Out="Q"
  282.        Call IO.I
  283.        Select Case Ucase$(Out2)
  284.        Case "A"
  285.           Strng="Monster name substring?"
  286.           Call IO.I
  287.           Out2=Lcase$(Out2)
  288.           Temp1$=Out2
  289.        Case "B"
  290.           Strng="Monster level?"
  291.           Call IO.I
  292.           Temp1=Int(Val(Out2))
  293.        Case "C"
  294.           Strng="Enter range:"
  295.           Call IO.O
  296.           No.Input.Out="1"
  297.           Strng="From?"
  298.           Call IO.I
  299.           Temp3=Int(Val(Out2))
  300.           No.Input.Out="10"
  301.           Strng="To?"
  302.           Call IO.I
  303.           Temp4=Int(Val(Out2))
  304.        Case "D"
  305.           Strng="Enter range:"
  306.           Call IO.O
  307.           No.Input.Out="1"
  308.           Strng="From?"
  309.           Call IO.I
  310.           Temp6=Int(Val(Out2))
  311.           No.Input.Out="10"
  312.           Strng="To?"
  313.           Call IO.I
  314.           Temp7=Int(Val(Out2))
  315.        Case "E"
  316.           Temp8=True
  317.        Case "F"
  318.           Temp9=True
  319.        Case "G"
  320.           Temp10=True
  321.        Case "H"
  322.           Temp11=True
  323.        Case "I"
  324.           Temp12=True
  325.        Case "J"
  326.           Temp13=True
  327.        Case "S"
  328.           Strng="Enter range:"
  329.           Call IO.O
  330.           Temp5=Lof(7)/Len(MonsterRecord)
  331.           Temp$=Mid$(Str$(Temp5),2)
  332.           Strng="From(1-"+Temp$+")?"
  333.           No.Input.Out="1"
  334.           Call IO.I
  335.           Temp=Int(Val(Out2))
  336.           If Temp<1 Or Temp>Temp5 Then
  337.              Strng=Range$
  338.              Call IO.O
  339.              Exit Do
  340.           Endif
  341.           Strng="To("+Mid$(Str$(Temp),2)+"-"+Temp$+")?"
  342.           No.Input.Out=Temp$
  343.           Call IO.I
  344.           Temp2=Int(Val(Out2))
  345.           If Temp2<Temp Then
  346.              Strng=Range$
  347.              Call IO.O
  348.              Exit Do
  349.           Endif
  350.           If Temp2>Temp5 Then
  351.              Temp2=Temp5
  352.           Endif
  353.           For Temp5=Temp To Temp2
  354.              TempX=False
  355.              Get 7,Temp5,MonsterRecord
  356.              If Temp1$<>Nul Then
  357.                 If Instr(MonsterRecord.MonsterName,Temp1$) Then
  358.                    TempX=True
  359.                 Endif
  360.              Endif
  361.              If Temp1 Then
  362.                 If MonsterRecord.Level=Temp1 Then
  363.                    TempX=True
  364.                 Endif
  365.              Endif
  366.              If Temp3 And Temp4 Then
  367.                 If MonsterRecord.Hits>=Temp3 And_
  368.                 MonsterRecord.Hits<=Temp4 Then
  369.                    TempX=True
  370.                 Endif
  371.              Endif
  372.              If Temp6 And Temp7 Then
  373.                 If MonsterRecord.Experience>=Temp6 And_
  374.                 MonsterRecord.Experience<=Temp7 Then
  375.                    TempX=True
  376.                 Endif
  377.              Endif
  378.              If Temp8 Then
  379.                 If MonsterRecord.Poison Then
  380.                    TempX=True
  381.                 Endif
  382.              Endif
  383.              If Temp9 Then
  384.                 If MonsterRecord.LevelDrain Then
  385.                    TempX=True
  386.                 Endif
  387.              Endif
  388.              If Temp10 Then
  389.                 If MonsterRecord.Spell Then
  390.                    TempX=True
  391.                 Endif
  392.              Endif
  393.              If Temp11 Then
  394.                 If MonsterRecord.Jail Then
  395.                    TempX=True
  396.                 Endif
  397.              Endif
  398.              If Temp12 Then
  399.                 If MonsterRecord.Psionic Then
  400.                    TempX=True
  401.                 Endif
  402.              Endif
  403.              If Temp13 Then
  404.                 If MonsterRecord.Equation Then
  405.                    TempX=True
  406.                 Endif
  407.              Endif
  408.              If TempX Then
  409.                 Call Display.Monster(False)
  410.                 Call More.Prompt
  411.                 If No Then
  412.                    Exit Do
  413.                 Endif
  414.              Endif
  415.           Next
  416.           Exit Do
  417.        Case "Q"
  418.           Exit Sub
  419.        End Select
  420.     Loop
  421.  Loop
  422. 10011
  423.  Exit Sub
  424. 10012
  425.  Resume 10011
  426. End Sub
  427.  
  428. Sub Search.Nonplayers
  429.  On Local Error Goto 10022
  430.  Do
  431.     Temp1$=Nul
  432.     Temp1=False
  433.     Temp3=False
  434.     Temp4=False
  435.     Temp6=False
  436.     Temp7=False
  437.     Temp8=False
  438.     Temp9=False
  439.     Temp10=False
  440.     Temp11=False
  441.     Temp12=False
  442.     Temp13=False
  443.     Do
  444.        Graphics.Off=True
  445.        If TempC=False Then
  446.           Strng="[A]nonplayer name substring"
  447.           If Temp1$<>Nul Then
  448.              Strng=Strng+Space$(30-Len(Strng))
  449.              Strng=Strng+"("+Temp1$+")"
  450.           Endif
  451.           Call IO.O
  452.           Strng="[B]nonplayer level"
  453.           If Temp1 Then
  454.              Strng=Strng+Space$(30-Len(Strng))
  455.              Strng=Strng+"("+Mid$(Str$(Temp1),2)+")"
  456.           Endif
  457.           Call IO.O
  458.           Strng="[C]hit points"
  459.           If Temp3>False And Temp4>False Then
  460.              Strng=Strng+Space$(30-Len(Strng))
  461.              Strng=Strng+"("+Mid$(Str$(Temp3),2)+"-"+Mid$(Str$(Temp4),2)+")"
  462.           Endif
  463.           Call IO.O
  464.           Strng="[D]experience"
  465.           If Temp6>False And Temp7>False Then
  466.              Strng=Strng+Space$(30-Len(Strng))
  467.              Strng=Strng+"("+Mid$(Str$(Temp6),2)+"-"+Mid$(Str$(Temp7),2)+")"
  468.           Endif
  469.           Call IO.O
  470.           Strng="[E]poisons"
  471.           If Temp8 Then
  472.              Strng=Strng+Space$(30-Len(Strng))
  473.              Strng=Strng+"(selected)"
  474.           Endif
  475.           Call IO.O
  476.           Strng="[F]drains levels"
  477.           If Temp9 Then
  478.              Strng=Strng+Space$(30-Len(Strng))
  479.              Strng=Strng+"(selected)"
  480.           Endif
  481.           Call IO.O
  482.           Strng="[G]casts spells"
  483.           If Temp10 Then
  484.              Strng=Strng+Space$(30-Len(Strng))
  485.              Strng=Strng+"(selected)"
  486.           Endif
  487.           Call IO.O
  488.           Strng="[H]jails attacker"
  489.           If Temp11 Then
  490.              Strng=Strng+Space$(30-Len(Strng))
  491.              Strng=Strng+"(selected)"
  492.           Endif
  493.           Call IO.O
  494.           Strng="[I]psionic nonplayers"
  495.           If Temp12 Then
  496.              Strng=Strng+Space$(30-Len(Strng))
  497.              Strng=Strng+"(selected)"
  498.           Endif
  499.           Call IO.O
  500.           Strng="[J]equation"
  501.           If Temp13 Then
  502.              Strng=Strng+Space$(30-Len(Strng))
  503.              Strng=Strng+"(selected)"
  504.           Endif
  505.           Call IO.O
  506.           Graphics.Off=False
  507.        Endif
  508.        Strng="Nonplayer search option(s to search, q to quit)?"
  509.        Line.Length=TempD
  510.        No.Input.Out="Q"
  511.        Call IO.I
  512.        Select Case Ucase$(Out2)
  513.        Case "A"
  514.           Strng="Nonplayer name substring?"
  515.           Call IO.I
  516.           Out2=Lcase$(Out2)
  517.           Temp1$=Out2
  518.        Case "B"
  519.           Strng="Nonplayer level?"
  520.           Call IO.I
  521.           Temp1=Int(Val(Out2))
  522.        Case "C"
  523.           Strng="Enter range:"
  524.           Call IO.O
  525.           No.Input.Out="1"
  526.           Strng="From?"
  527.           Call IO.I
  528.           Temp3=Int(Val(Out2))
  529.           No.Input.Out="10"
  530.           Strng="To?"
  531.           Call IO.I
  532.           Temp4=Int(Val(Out2))
  533.        Case "D"
  534.           Strng="Enter range:"
  535.           Call IO.O
  536.           No.Input.Out="1"
  537.           Strng="From?"
  538.           Call IO.I
  539.           Temp6=Int(Val(Out2))
  540.           No.Input.Out="10"
  541.           Strng="To?"
  542.           Call IO.I
  543.           Temp7=Int(Val(Out2))
  544.        Case "E"
  545.           Temp8=True
  546.        Case "F"
  547.           Temp9=True
  548.        Case "G"
  549.           Temp10=True
  550.        Case "H"
  551.           Temp11=True
  552.        Case "I"
  553.           Temp12=True
  554.        Case "J"
  555.           Temp13=True
  556.        Case "S"
  557.           Strng="Enter range:"
  558.           Call IO.O
  559.           Temp5=Lof(9)/Len(MonsterRecord)
  560.           Temp$=Mid$(Str$(Temp5),2)
  561.           Strng="From(1-"+Temp$+")?"
  562.           No.Input.Out="1"
  563.           Call IO.I
  564.           Temp=Int(Val(Out2))
  565.           If Temp<1 Or Temp>Temp5 Then
  566.              Strng=Range$
  567.              Call IO.O
  568.              Exit Do
  569.           Endif
  570.           Strng="To("+Mid$(Str$(Temp),2)+"-"+Temp$+")?"
  571.           No.Input.Out=Temp$
  572.           Call IO.I
  573.           Temp2=Int(Val(Out2))
  574.           If Temp2<Temp Then
  575.              Strng=Range$
  576.              Call IO.O
  577.              Exit Do
  578.           Endif
  579.           If Temp2>Temp5 Then
  580.              Temp2=Temp5
  581.           Endif
  582.           For Temp5=Temp To Temp2
  583.              TempX=False
  584.              Get 9,Temp5,MonsterRecord
  585.              If Temp1$<>Nul Then
  586.                 If Instr(MonsterRecord.MonsterName,Temp1$) Then
  587.                    TempX=True
  588.                 Endif
  589.              Endif
  590.              If Temp1 Then
  591.                 If MonsterRecord.Level=Temp1 Then
  592.                    TempX=True
  593.                 Endif
  594.              Endif
  595.              If Temp3 And Temp4 Then
  596.                 If MonsterRecord.Hits>=Temp3 And_
  597.                 MonsterRecord.Hits<=Temp4 Then
  598.                    TempX=True
  599.                 Endif
  600.              Endif
  601.              If Temp6 And Temp7 Then
  602.                 If MonsterRecord.Experience>=Temp6 And_
  603.                 MonsterRecord.Experience<=Temp7 Then
  604.                    TempX=True
  605.                 Endif
  606.              Endif
  607.              If Temp8 Then
  608.                 If MonsterRecord.Poison Then
  609.                    TempX=True
  610.                 Endif
  611.              Endif
  612.              If Temp9 Then
  613.                 If MonsterRecord.LevelDrain Then
  614.                    TempX=True
  615.                 Endif
  616.              Endif
  617.              If Temp10 Then
  618.                 If MonsterRecord.Spell Then
  619.                    TempX=True
  620.                 Endif
  621.              Endif
  622.              If Temp11 Then
  623.                 If MonsterRecord.Jail Then
  624.                    TempX=True
  625.                 Endif
  626.              Endif
  627.              If Temp12 Then
  628.                 If MonsterRecord.Psionic Then
  629.                    TempX=True
  630.                 Endif
  631.              Endif
  632.              If Temp13 Then
  633.                 If MonsterRecord.Equation Then
  634.                    TempX=True
  635.                 Endif
  636.              Endif
  637.              If TempX Then
  638.                 Call Display.Nonplayer(False)
  639.                 Call More.Prompt
  640.                 If No Then
  641.                    Exit Do
  642.                 Endif
  643.              Endif
  644.           Next
  645.           Exit Do
  646.        Case "Q"
  647.           Exit Sub
  648.        End Select
  649.     Loop
  650.  Loop
  651. 10021
  652.  Exit Sub
  653. 10022
  654.  Resume 10021
  655. End Sub
  656.  
  657. Sub Search.Spells
  658.  On Local Error Goto 10032
  659.  Do
  660.     Temp1$=Nul
  661.     Temp2$=Nul
  662.     Temp3=False
  663.     Temp4=False
  664.     Temp6=False
  665.     Temp7=False
  666.     Temp8=False
  667.     Temp9=False
  668.     Do
  669.        Graphics.Off=True
  670.        If TempC=False Then
  671.           Strng="[A]spell name substring"
  672.           If Temp1$<>Nul Then
  673.              Strng=Strng+Space$(30-Len(Strng))
  674.              Strng=Strng+"("+Temp1$+")"
  675.           Endif
  676.           Call IO.O
  677.           Strng="[B]chant substring"
  678.           If Temp2$<>Nul Then
  679.              Strng=Strng+Space$(30-Len(Strng))
  680.              Strng=Strng+"("+Temp2$+")"
  681.           Endif
  682.           Call IO.O
  683.           Strng="[C]spell level"
  684.           If Temp3 Then
  685.              Strng=Strng+Space$(30-Len(Strng))
  686.              Strng=Strng+"(selected)"
  687.           Endif
  688.           Call IO.O
  689.           Strng="[D]psionic spells"
  690.           If Temp4 Then
  691.              Strng=Strng+Space$(30-Len(Strng))
  692.              Strng=Strng+"(selected)"
  693.           Endif
  694.           Call IO.O
  695.           Strng="[E]spell type"
  696.           If Temp6 Then
  697.              Strng=Strng+Space$(30-Len(Strng))
  698.              Strng=Strng+"(Type:"+Str$(Temp6)+")"
  699.           Endif
  700.           Call IO.O
  701.           Strng="[F]requires ingredients"
  702.           If Temp7 Then
  703.              Strng=Strng+Space$(30-Len(Strng))
  704.              Strng=Strng+"(selected)"
  705.           Endif
  706.           Call IO.O
  707.           Strng="[G]casting type"
  708.           If Temp8 Then
  709.              Strng=Strng+Space$(30-Len(Strng))
  710.              Select Case Temp8
  711.              Case 1
  712.                 Strng=Strng+"(use)"
  713.              Case 2
  714.                 Strng=Strng+"(read)"
  715.              Case 3
  716.                 Strng=Strng+"(cast)"
  717.              End Select
  718.           Endif
  719.           Call IO.O
  720.           Strng="[H]equation"
  721.           If Temp9 Then
  722.              Strng=Strng+Space$(30-Len(Strng))
  723.              Strng=Strng+"(selected)"
  724.           Endif
  725.           Call IO.O
  726.           Graphics.Off=False
  727.        Endif
  728.        Strng="Spell search option(s to search, q to quit)?"
  729.        Line.Length=TempD
  730.        No.Input.Out="Q"
  731.        Call IO.I
  732.        Select Case Ucase$(Out2)
  733.        Case "A"
  734.           Strng="Spell name substring?"
  735.           Call IO.I
  736.           Out2=Lcase$(Out2)
  737.           Temp1$=Out2
  738.        Case "B"
  739.           Strng="Chant substring?"
  740.           Call IO.I
  741.           Out2=Ucase$(Out2)
  742.           Temp2$=Out2
  743.        Case "C"
  744.           Strng="Spell level?"
  745.           Call IO.I
  746.           Temp3=Int(Val(Out2))
  747.        Case "D"
  748.           Temp4=True
  749.        Case "E"
  750.           Call Spell.Types
  751.           Strng="Spell type?"
  752.           Line.Length=TempD
  753.           No.Input.Out="A"
  754.           Call IO.I
  755.           Out2=Ucase$(Out2)
  756.           Temp6=Instr("ABCDEFGHIJKLMNOPRSTUVWXYZ123",Out2)
  757.        Case "F"
  758.           Temp7=True
  759.        Case "G"
  760.           Graphics.Off=True
  761.           Strng="[1]use command"
  762.           Call IO.O
  763.           Strng="[2]read scroll"
  764.           Call IO.O
  765.           Strng="[3]cast spell"
  766.           Call IO.O
  767.           Graphics.Off=False
  768.           Line.Length=TempD
  769.           Strng="Casting type("+Enter$+"=none)?"
  770.           Call IO.I
  771.           Select Case Int(Val(Out2))
  772.           Case 1
  773.              Temp8=Use.Spell.Type
  774.           Case 2
  775.              Temp8=Scroll.Spell.Type
  776.           Case 3
  777.              Temp8=Cast.Spell.Type
  778.           Case Else
  779.              Temp8=False
  780.           End Select
  781.        Case "H"
  782.           Temp9=True
  783.        Case "S"
  784.           Strng="Enter range:"
  785.           Call IO.O
  786.           Temp5=Lof(4)/Len(SpellRecord)
  787.           Temp$=Mid$(Str$(Temp5),2)
  788.           Strng="From(1-"+Temp$+")?"
  789.           No.Input.Out="1"
  790.           Call IO.I
  791.           Temp=Int(Val(Out2))
  792.           If Temp<1 Or Temp>Temp5 Then
  793.              Strng=Range$
  794.              Call IO.O
  795.              Exit Do
  796.           Endif
  797.           Strng="To("+Mid$(Str$(Temp),2)+"-"+Temp$+")?"
  798.           No.Input.Out=Temp$
  799.           Call IO.I
  800.           Temp2=Int(Val(Out2))
  801.           If Temp2<Temp Then
  802.              Strng=Range$
  803.              Call IO.O
  804.              Exit Do
  805.           Endif
  806.           If Temp2>Temp5 Then
  807.              Temp2=Temp5
  808.           Endif
  809.           For Temp5=Temp To Temp2
  810.              TempX=False
  811.              Get 4,Temp5,SpellRecord
  812.              If Temp1$<>Nul Then
  813.                 If Instr(SpellRecord.SpellName,Temp1$) Then
  814.                    TempX=True
  815.                 Endif
  816.              Endif
  817.              If Temp2$<>Nul Then
  818.                 If Instr(SpellRecord.Chant,Temp2$) Then
  819.                    TempX=True
  820.                 Endif
  821.              Endif
  822.              If Temp3 Then
  823.                 If SpellRecord.Level=Temp3 Then
  824.                    TempX=True
  825.                 Endif
  826.              Endif
  827.              If Temp4 Then
  828.                 If SpellRecord.Psionic Then
  829.                    TempX=True
  830.                 Endif
  831.              Endif
  832.              If Temp6 Then
  833.                 If SpellRecord.SpellType=Temp6 Then
  834.                    TempX=True
  835.                 Endif
  836.              Endif
  837.              If Temp7 Then
  838.                 For TempY=1 To 5
  839.                    If SpellRecord.Ingred(TempY)>False Then
  840.                       TempX=True
  841.                       Exit For
  842.                    Endif
  843.                 Next
  844.              Endif
  845.              If Temp8 Then
  846.                 If SpellRecord.SpellFlag And Temp8 Then
  847.                    TempX=True
  848.                 Endif
  849.              Endif
  850.              If Temp9 Then
  851.                 If SpellRecord.Equation=True Then
  852.                    TempX=True
  853.                 Endif
  854.              Endif
  855.              If TempX Then
  856.                 Call Display.Spell(False)
  857.                 Call More.Prompt
  858.                 If No Then
  859.                    Exit Do
  860.                 Endif
  861.              Endif
  862.           Next
  863.           Exit Do
  864.        Case "Q"
  865.           Exit Sub
  866.        End Select
  867.     Loop
  868.  Loop
  869. 10031
  870.  Exit Sub
  871. 10032
  872.  Resume 10031
  873. End Sub
  874.  
  875. Sub Search.Treasure
  876.  On Local Error Goto 10042
  877.  Do
  878.     Temp1$=Nul
  879.     Temp1=False
  880.     Temp3=False
  881.     Temp4=False
  882.     Temp6=False
  883.     Temp7=False
  884.     Temp8=False
  885.     Temp9=False
  886.     Temp10=False
  887.     Temp11=False
  888.     Temp12=False
  889.     Temp13=False
  890.     Temp14=False
  891.     Temp15=False
  892.     Temp16=False
  893.     Temp17=False
  894.     Temp18=False
  895.     Temp19=False
  896.     Temp20=False
  897.     Temp21=False
  898.     Temp22=False
  899.     Do
  900.        Graphics.Off=True
  901.        If TempC=False Then
  902.           Strng="[A]treasure name substring"
  903.           If Temp1$<>Nul Then
  904.              Strng=Strng+Space$(30-Len(Strng))
  905.              Strng=Strng+"("+Temp1$+")"
  906.           Endif
  907.           Call IO.O
  908.           Strng="[B]weight"
  909.           If Temp1>False And Temp2>False Then
  910.              Strng=Strng+Space$(30-Len(Strng))
  911.              Strng=Strng+"("+Mid$(Str$(Temp1),2)+"-"+Mid$(Str$(Temp2),2)+")"
  912.           Endif
  913.           Call IO.O
  914.           Strng="[C]value"
  915.           If Temp4>False And Temp6>False Then
  916.              Strng=Strng+Space$(30-Len(Strng))
  917.              Strng=Strng+"("+Mid$(Str$(Temp4),2)+"-"+Mid$(Str$(Temp6),2)+")"
  918.           Endif
  919.           Call IO.O
  920.           Strng="[D]hit plus"
  921.           If Temp7 Then
  922.              Strng=Strng+Space$(30-Len(Strng))
  923.              Strng=Strng+"("+Mid$(Str$(Temp7),2)+")"
  924.           Endif
  925.           Call IO.O
  926.           Strng="[E]strikes"
  927.           If Temp8 Then
  928.              Strng=Strng+Space$(30-Len(Strng))
  929.              Strng=Strng+"("+Mid$(Str$(Temp7),2)+")"
  930.           Endif
  931.           Call IO.O
  932.           Strng="[F]coins"
  933.           If Temp11 Then
  934.              Strng=Strng+Space$(30-Len(Strng))
  935.              Strng=Strng+"(selected)"
  936.           Endif
  937.           Call IO.O
  938.           Strng="[G]potions"
  939.           If Temp12 Then
  940.              Strng=Strng+Space$(30-Len(Strng))
  941.              Strng=Strng+"(selected)"
  942.           Endif
  943.           Call IO.O
  944.           Strng="[H]scrolls"
  945.           If Temp13 Then
  946.              Strng=Strng+Space$(30-Len(Strng))
  947.              Strng=Strng+"(selected)"
  948.           Endif
  949.           Call IO.O
  950.           Strng="[I]loadable"
  951.           If Temp14 Then
  952.              Strng=Strng+Space$(30-Len(Strng))
  953.              Strng=Strng+"(selected)"
  954.           Endif
  955.           Call IO.O
  956.           Strng="[J]ammunition"
  957.           If Temp15 Then
  958.              Strng=Strng+Space$(30-Len(Strng))
  959.              Strng=Strng+"(selected)"
  960.           Endif
  961.           Call IO.O
  962.           Strng="[K]receptacles"
  963.           If Temp16 Then
  964.              Strng=Strng+Space$(30-Len(Strng))
  965.              Strng=Strng+"(selected)"
  966.           Endif
  967.           Call IO.O
  968.           Strng="[L]key number"
  969.           If Temp9 Then
  970.              Strng=Strng+Space$(30-Len(Strng))
  971.              Strng=Strng+"("+Mid$(Str$(Temp9),2)+")"
  972.           Endif
  973.           Call IO.O
  974.           Strng="[M]spell name"
  975.           If Temp10 Then
  976.              Strng=Strng+Space$(30-Len(Strng))
  977.              Strng=Strng+"(number:"+Str$(Temp10)+")"
  978.           Endif
  979.           Call IO.O
  980.           Strng="[N]rings"
  981.           If Temp17 Then
  982.              Strng=Strng+Space$(30-Len(Strng))
  983.              Strng=Strng+"(selected)"
  984.           Endif
  985.           Call IO.O
  986.           Strng="[O]rustable"
  987.           If Temp18 Then
  988.              Strng=Strng+Space$(30-Len(Strng))
  989.              Strng=Strng+"(selected)"
  990.           Endif
  991.           Call IO.O
  992.           Strng="[P]stealable"
  993.           If Temp19 Then
  994.              Strng=Strng+Space$(30-Len(Strng))
  995.              Strng=Strng+"(selected)"
  996.           Endif
  997.           Call IO.O
  998.           Strng="[R]edible"
  999.           If Temp20 Then
  1000.              Strng=Strng+Space$(30-Len(Strng))
  1001.              Strng=Strng+"(selected)"
  1002.           Endif
  1003.           Call IO.O
  1004.           Strng="[T]launchable
  1005.           If Temp21 Then
  1006.              Strng=Strng+Space$(30-Len(Strng))
  1007.              Strng=Strng+"(selected)"
  1008.           Endif
  1009.           Call IO.O
  1010.           Strng="[U]launch ammo"
  1011.           If Temp22 Then
  1012.              Strng=Strng+Space$(30-Len(Strng))
  1013.              Strng=Strng+"(selected)"
  1014.           Endif
  1015.           Call IO.O
  1016.           Graphics.Off=False
  1017.        Endif
  1018.        Strng="Treasure search option(s to search, q to quit)?"
  1019.        Line.Length=TempD
  1020.        No.Input.Out="Q"
  1021.        Call IO.I
  1022.        Select Case Ucase$(Out2)
  1023.        Case "A"
  1024.           Strng="Treasure name substring?"
  1025.           Call IO.I
  1026.           Out2=Lcase$(Out2)
  1027.           Temp1$=Out2
  1028.        Case "B"
  1029.           Strng="Enter range:"
  1030.           Call IO.O
  1031.           Strng="From?"
  1032.           No.Input.Out="1"
  1033.           Call IO.I
  1034.           Temp1=Int(Val(Out2))
  1035.           Strng="To?"
  1036.           No.Input.Out="10"
  1037.           Call IO.I
  1038.           Temp3=Int(Val(Out2))
  1039.        Case "C"
  1040.           Strng="Enter range:"
  1041.           Call IO.O
  1042.           Strng="From?"
  1043.           No.Input.Out="1"
  1044.           Call IO.I
  1045.           Temp4=Int(Val(Out2))
  1046.           Strng="To?"
  1047.           No.Input.Out="10"
  1048.           Call IO.I
  1049.           Temp6=Int(Val(Out2))
  1050.        Case "D"
  1051.           Strng="Hit plus?"
  1052.           Call IO.I
  1053.           Temp7=Int(Val(Out2))
  1054.        Case "E"
  1055.           Strng="Charges?"
  1056.           Call IO.I
  1057.           Temp8=Int(Val(Out2))
  1058.        Case "F"
  1059.           Temp11=True
  1060.        Case "G"
  1061.           Temp12=True
  1062.        Case "H"
  1063.           Temp13=True
  1064.        Case "I"
  1065.           Temp14=True
  1066.        Case "J"
  1067.           Temp15=True
  1068.        Case "K"
  1069.           Temp16=True
  1070.        Case "L"
  1071.           Strng="Key number?"
  1072.           Call IO.I
  1073.           Temp9=Int(Val(Out2))
  1074.        Case "M"
  1075.           Call Find.Spell
  1076.           If Temp Then
  1077.              Temp10=Temp
  1078.           Endif
  1079.        Case "N"
  1080.           Temp17=True
  1081.        Case "O"
  1082.           Temp18=True
  1083.        Case "P"
  1084.           Temp19=True
  1085.        Case "R"
  1086.           Temp20=True
  1087.        Case "T"
  1088.           Temp21=True
  1089.        Case "U"
  1090.           Temp22=True
  1091.        Case "S"
  1092.           Strng="Enter range:"
  1093.           Call IO.O
  1094.           Temp5=Lof(8)/Len(TreasureRecord)
  1095.           Temp$=Mid$(Str$(Temp5),2)
  1096.           Strng="From(1-"+Temp$+")?"
  1097.           No.Input.Out="1"
  1098.           Call IO.I
  1099.           Temp=Int(Val(Out2))
  1100.           If Temp<1 Or Temp>Temp5 Then
  1101.              Strng=Range$
  1102.              Call IO.O
  1103.              Exit Do
  1104.           Endif
  1105.           Strng="To("+Mid$(Str$(Temp),2)+"-"+Temp$+")?"
  1106.           No.Input.Out=Temp$
  1107.           Call IO.I
  1108.           Temp2=Int(Val(Out2))
  1109.           If Temp2<Temp Then
  1110.              Strng=Range$
  1111.              Call IO.O
  1112.              Exit Do
  1113.           Endif
  1114.           If Temp2>Temp5 Then
  1115.              Temp2=Temp5
  1116.           Endif
  1117.           For Temp5=Temp To Temp2
  1118.              TempX=False
  1119.              Get 8,Temp5,TreasureRecord
  1120.              If Temp1$<>Nul Then
  1121.                 If Instr(TreasureRecord.TreasureName,Temp1$) Then
  1122.                    TempX=True
  1123.                 Endif
  1124.              Endif
  1125.              If Temp1 And Temp3 Then
  1126.                 If TreasureRecord.Weight>=Temp1 And_
  1127.                 TreasureRecord.Weight<=Temp3 Then
  1128.                    TempX=True
  1129.                 Endif
  1130.              Endif
  1131.              If Temp4 And Temp6 Then
  1132.                 If TreasureRecord.Gold>=Temp4 And_
  1133.                 TreasureRecord.Gold<=Temp6 Then
  1134.                    TempX=True
  1135.                 Endif
  1136.              Endif
  1137.              If Temp7 Then
  1138.                 If Abs(TreasureRecord.Plus)=Temp7 Then
  1139.                    TempX=True
  1140.                 Endif
  1141.              Endif
  1142.              If Temp8 Then
  1143.                 If Abs(TreasureRecord.Charges)=Temp8 Then
  1144.                    TempX=True
  1145.                 Endif
  1146.              Endif
  1147.              If Temp9 Then
  1148.                 If TreasureRecord.Keyed=Temp9 Then
  1149.                    TempX=True
  1150.                 Endif
  1151.              Endif
  1152.              If Temp10 Then
  1153.                 If TreasureRecord.Spell=Temp10 Then
  1154.                    TempX=True
  1155.                 Endif
  1156.              Endif
  1157.              If Temp11 Then
  1158.                 If TreasureRecord.Coin Then
  1159.                    TempX=True
  1160.                 Endif
  1161.              Endif
  1162.              If Temp12 Then
  1163.                 If TreasureRecord.Potion Then
  1164.                    TempX=True
  1165.                 Endif
  1166.              Endif
  1167.              If Temp13 Then
  1168.                 If TreasureRecord.Scroll Then
  1169.                    TempX=True
  1170.                 Endif
  1171.              Endif
  1172.              If Temp14 Then
  1173.                 If TreasureRecord.Loadable Then
  1174.                    TempX=True
  1175.                 Endif
  1176.              Endif
  1177.              If Temp15 Then
  1178.                 If TreasureRecord.Ammunition Then
  1179.                    TempX=True
  1180.                 Endif
  1181.              Endif
  1182.              If Temp16 Then
  1183.                 If TreasureRecord.Recep Then
  1184.                    TempX=True
  1185.                 Endif
  1186.              Endif
  1187.              If Temp17 Then
  1188.                 If TreasureRecord.RingType Then
  1189.                    TempX=True
  1190.                 Endif
  1191.              Endif
  1192.              If Temp18 Then
  1193.                 If TreasureRecord.Rustable Then
  1194.                    TempX=True
  1195.                 Endif
  1196.              Endif
  1197.              If Temp19 Then
  1198.                 If TreasureRecord.Stealable Then
  1199.                    TempX=True
  1200.                 Endif
  1201.              Endif
  1202.              If Temp20 Then
  1203.                 If TreasureRecord.Edible Then
  1204.                    TempX=True
  1205.                 Endif
  1206.              Endif
  1207.              If Temp21 Then
  1208.                 If TreasureRecord.Launchable Then
  1209.                    TempX=True
  1210.                 Endif
  1211.              Endif
  1212.              If Temp22 Then
  1213.                 If TreasureRecord.LaunchAmmo Then
  1214.                    TempX=True
  1215.                 Endif
  1216.              Endif
  1217.              If TempX Then
  1218.                 Call Display.Treasure(False)
  1219.                 Call More.Prompt
  1220.                 If No Then
  1221.                    Exit Do
  1222.                 Endif
  1223.              Endif
  1224.           Next
  1225.           Exit Do
  1226.        Case "Q"
  1227.           Exit Sub
  1228.        End Select
  1229.     Loop
  1230.  Loop
  1231. 10041
  1232.  Exit Sub
  1233. 10042
  1234.  Resume 10041
  1235. End Sub
  1236.  
  1237. Sub Search.Description
  1238.  On Local Error Goto 10052
  1239.  Do
  1240.     Temp1$=Nul
  1241.     Temp2$=Nul
  1242.     Do
  1243.        Graphics.Off=True
  1244.        If TempC=False Then
  1245.           Strng="[A]long description"
  1246.           If Temp1$<>Nul Then
  1247.              Strng=Strng+Space$(30-Len(Strng))
  1248.              Strng=Strng+"("+Temp1$+")"
  1249.           Endif
  1250.           Call IO.O
  1251.           Strng="[B]short description"
  1252.           If Temp2$<>Nul Then
  1253.              Strng=Strng+Space$(30-Len(Strng))
  1254.              Strng=Strng+"("+Temp2$+")"
  1255.           Endif
  1256.           Call IO.O
  1257.           Graphics.Off=False
  1258.        Endif
  1259.        Strng="Description search option(s to search, q to quit)?"
  1260.        Line.Length=TempD
  1261.        No.Input.Out="Q"
  1262.        Call IO.I
  1263.        Select Case Ucase$(Out2)
  1264.        Case "A"
  1265.           Strng="Long description substring?"
  1266.           Call IO.I
  1267.           Out2=Lcase$(Out2)
  1268.           Temp1$=Out2
  1269.        Case "B"
  1270.           Strng="Short description substring?"
  1271.           Call IO.I
  1272.           Out2=Lcase$(Out2)
  1273.           Temp2$=Out2
  1274.        Case "S"
  1275.           Strng="Enter range:"
  1276.           Call IO.O
  1277.           Temp3=Lof(5)/Len(RoomRecord)
  1278.           Temp$=Mid$(Str$(Temp3),2)
  1279.           Strng="From(1-"+Temp$+")?"
  1280.           No.Input.Out="1"
  1281.           Call IO.I
  1282.           Temp=Int(Val(Out2))
  1283.           If Temp<1 Or Temp>Temp3 Then
  1284.              Strng=Range$
  1285.              Call IO.O
  1286.              Exit Do
  1287.           Endif
  1288.           Strng="To("+Mid$(Str$(Temp),2)+"-"+Temp$+")?"
  1289.           No.Input.Out=Temp$
  1290.           Call IO.I
  1291.           Temp2=Int(Val(Out2))
  1292.           If Temp2<Temp Then
  1293.              Strng=Range$
  1294.              Call IO.O
  1295.              Exit Do
  1296.           Endif
  1297.           If Temp2>Temp3 Then
  1298.              Temp2=Temp3
  1299.           Endif
  1300.           For Temp5=Temp To Temp2
  1301.              TempX=False
  1302.              Get 5,Temp5,RoomRecord
  1303.              If Temp1$<>Nul Then
  1304.                 For Temp3=1 To 4
  1305.                    Out3=Lcase$(RoomRecord.LongDesc(Temp3))
  1306.                    If Instr(Out3,Temp1$) Then
  1307.                       TempX=True
  1308.                       Exit For
  1309.                    Endif
  1310.                 Next
  1311.              Endif
  1312.              If Temp2$<>Nul Then
  1313.                 Out3=Lcase$(RoomRecord.ShortDesc)
  1314.                 If Instr(Out3,Temp2$) Then
  1315.                    TempX=True
  1316.                 Endif
  1317.              Endif
  1318.              If TempX Then
  1319.                 Call Display.Room
  1320.                 Call More.Prompt
  1321.                 If No Then
  1322.                    Exit Do
  1323.                 Endif
  1324.              Endif
  1325.           Next
  1326.           Exit Do
  1327.        Case "Q"
  1328.           Exit Sub
  1329.        End Select
  1330.     Loop
  1331.  Loop
  1332. 10051
  1333.  Exit Sub
  1334. 10052
  1335.  Resume 10051
  1336. End Sub
  1337.  
  1338. Sub Add.User
  1339.  On Local Error Goto 10062
  1340.  Temp4=Lof(3)/Len(UserRecord)+1
  1341.  Strng=Deleted$
  1342.  Call Valid(Strng,30)
  1343.  Call Encrypt(Strng,True)
  1344.  UserRecord.CodeName=Strng
  1345.  Strng=Deleted$
  1346.  Call Valid(Strng,20)
  1347.  Call Encrypt(Strng,False)
  1348.  UserRecord.PassWord=Strng
  1349.  Strng=Deleted$
  1350.  Call Valid(Strng,20)
  1351.  Call Encrypt(Strng,True)
  1352.  UserRecord.ClassName=Strng
  1353.  UserRecord.ClassType=False
  1354.  For Temp6=1 To 7
  1355.     UserRecord.Stats(Temp6)=False
  1356.  Next
  1357.  For Temp6=1 To 4
  1358.     UserRecord.Weapons(Temp6)=False
  1359.  Next
  1360.  UserRecord.Room=False
  1361.  UserRecord.Level=False
  1362.  UserRecord.Experience=False
  1363.  UserRecord.Gold=False
  1364.  UserRecord.Borrow=False
  1365.  UserRecord.NumCalls=False
  1366.  UserRecord.Fatigue=False
  1367.  UserRecord.FatigueMax=False
  1368.  UserRecord.Vitality=False
  1369.  UserRecord.VitalityMax=False
  1370.  UserRecord.Magic=False
  1371.  UserRecord.MagicMax=False
  1372.  UserRecord.Psionic=False
  1373.  UserRecord.PsionicMax=False
  1374.  UserRecord.Poison=False
  1375.  UserRecord.Invisible=False
  1376.  UserRecord.Race=False
  1377.  UserRecord.Proficiency=False
  1378.  UserRecord.Bank=False
  1379.  UserRecord.PlayersKilled=False
  1380.  UserRecord.MonstersKilled=False
  1381.  UserRecord.Brief=False
  1382.  Strng=Date$
  1383.  Call Valid(Strng,10)
  1384.  Call Encrypt(Strng,True)
  1385.  UserRecord.DateOn=Strng
  1386.  UserRecord.Align1=False
  1387.  UserRecord.Align2=False
  1388.  UserRecord.Flags=False
  1389.  UserRecord.MaxCalls=False
  1390.  UserRecord.FromHour=False
  1391.  UserRecord.FromMin=False
  1392.  UserRecord.ToHour=False
  1393.  UserRecord.ToMin=False
  1394.  Put 3,Temp4,UserRecord
  1395. 10061
  1396.  Exit Sub
  1397. 10062
  1398.  Resume 10061
  1399. End Sub
  1400.  
  1401. Sub Edit.User
  1402.  On Local Error Goto 10072
  1403.  If Lof(3)=False Then
  1404.     Call Add.User
  1405.  Endif
  1406.  Do
  1407.     Graphics.Off=True
  1408.     If TempC=False Then
  1409.        Strng="[A]dd"
  1410.        Call IO.O
  1411.        Strng="[C]hange"
  1412.        Call IO.O
  1413.        Strng="[L]ist"
  1414.        Call IO.O
  1415.        Strng="[P]ack"
  1416.        Call IO.O
  1417.        Strng="[S]earch"
  1418.        Call IO.O
  1419.        Graphics.Off=False
  1420.     Endif
  1421.     Strng="User edit option(q to quit)?"
  1422.     Line.Length=TempD
  1423.     No.Input.Out="Q"
  1424.     Call IO.I
  1425.     Select Case Ucase$(Out2)
  1426.     Case "A"
  1427.        Call Add.User
  1428.     Case "C"
  1429.        Call Change.User
  1430.     Case "L"
  1431.        Call List.User
  1432.     Case "P"
  1433.        Call Pack.Users
  1434.     Case "S"
  1435.        Call Search.Users
  1436.     Case "Q"
  1437.        Exit Sub
  1438.     End Select
  1439.  Loop
  1440. 10071
  1441.  Exit Sub
  1442. 10072
  1443.  Resume 10071
  1444. End Sub
  1445.  
  1446. Sub List.User
  1447.  On Local Error Goto 10082
  1448.  Do
  1449.     Graphics.Off=True
  1450.     If TempC=False Then
  1451.        Strng="[D]ayfile"
  1452.        Call IO.O
  1453.        Strng="[L]ist"
  1454.        Call IO.O
  1455.        Strng="[T]op ten"
  1456.        Call IO.O
  1457.        Strng="[U]sers"
  1458.        Call IO.O
  1459.        Graphics.Off=False
  1460.     Endif
  1461.     Strng="User list option(q to quit)?"
  1462.     Line.Length=TempD
  1463.     No.Input.Out="Q"
  1464.     Call IO.I
  1465.     Select Case Ucase$(Out2)
  1466.     Case "D"
  1467.        Call Read.Dayfile
  1468.     Case "L"
  1469.        Call Show.Users
  1470.     Case "T"
  1471.        Call Top.Ten
  1472.     Case "U"
  1473.        Call User.Report
  1474.     Case "Q"
  1475.        Exit Sub
  1476.     End Select
  1477.  Loop
  1478. 10081
  1479.  Exit Sub
  1480. 10082
  1481.  Resume 10081
  1482. End Sub
  1483.  
  1484. Sub User.Report
  1485.  On Local Error Goto 10092
  1486.  Graphics.Off=True
  1487.  Strng="DNDBBS V"+Version$+" User List For "+FNclock$+"."
  1488.  Call IO.O
  1489.  Strng=Nul
  1490.  Call IO.O
  1491.  Strng="Number User Name                      Class Name"
  1492.  Strng=Strng+"           Race     Level"
  1493.  Call IO.O
  1494.  Strng=String$(73,"-")
  1495.  Call IO.O
  1496.  Temp5=4
  1497.  Allow.Break=True
  1498.  For Temp3=1 To Lof(3)/Len(UserRecord)
  1499.     Get 3,Temp3,UserRecord
  1500.     Strng=UserRecord.CodeName
  1501.     Call Decrypt(Strng)
  1502.     If Left$(Strng,9)<>Deleted$ Then
  1503.        Strng=Mid$(Str$(Temp3),2)+"."
  1504.        Strng=Strng+Space$(7-Len(Strng))
  1505.        Out2=UserRecord.CodeName
  1506.        Call Decrypt(Out2)
  1507.        Strng=Strng+Out2+" "
  1508.        Out2=UserRecord.ClassName
  1509.        Call Decrypt(Out2)
  1510.        Strng=Strng+Out2+" "
  1511.        If UserRecord.Race<1 Then
  1512.           UserRecord.Race=1
  1513.        Endif
  1514.        Out2=Race(UserRecord.Race)
  1515.        Out2=Rtrim$(Out2)
  1516.        Out2=Out2+Space$(8-Len(Out2))
  1517.        Strng=Strng+Out2
  1518.        If UserRecord.Level<1 Then
  1519.           Out2=" -dead-"
  1520.        Else
  1521.           Out2=Str$(UserRecord.Level)
  1522.        Endif
  1523.        Out2=Out2+Space$(7-Len(Out2))
  1524.        If UserRecord.Flags And Locked.User Then
  1525.           Out2=Out2+Mask$
  1526.        Endif
  1527.        If UserRecord.ClassType>8 Then
  1528.           Out2=Out2+"*"
  1529.        Endif
  1530.        Strng=Strng+Out2
  1531.        Call IO.O
  1532.        If Break Then
  1533.           Exit For
  1534.        Endif
  1535.        Temp5=Temp5+1
  1536.        If Temp5=23 Then
  1537.           Temp5=False
  1538.           Call More.Prompt
  1539.           If No Then
  1540.              Exit For
  1541.           Endif
  1542.        Endif
  1543.     Endif
  1544.  Next
  1545.  If Temp5 Then
  1546.     Call More.Prompt
  1547.  Endif
  1548.  Allow.Break=False
  1549. 10091
  1550.  Exit Sub
  1551. 10092
  1552.  Resume 10091
  1553. End Sub
  1554.  
  1555. Sub Read.DayFile
  1556.  On Local Error Goto 10102
  1557.  Close 13
  1558.  Temp5=False
  1559.  Graphics.Off=True
  1560.  Allow.Break=True
  1561.  Open Day.File.FileName For Input Shared As #13
  1562.  Do While Not Eof(13) And Not Lost.Carrier
  1563.     Line Input #13,Strng
  1564.     Call IO.O
  1565.     If Break Then
  1566.        Exit Do
  1567.     Endif
  1568.     Temp5=Temp5+1
  1569.     If Temp5=23 Then
  1570.        Temp5=False
  1571.        Call More.Prompt
  1572.        If No Then
  1573.           Exit Do
  1574.        Endif
  1575.     Endif
  1576.  Loop
  1577.  Allow.Break=False
  1578.  If Temp5 Then
  1579.     Call More.Prompt
  1580.  Endif
  1581. 10101
  1582.  Exit Sub
  1583. 10102
  1584.  Resume 10101
  1585. End Sub
  1586.  
  1587. Sub Change.User
  1588.  On Local Error Goto 10112
  1589.  Graphics.Off=False
  1590.  Strng="User name, or number?"
  1591.  No.Input.Out="1"
  1592.  Call IO.I
  1593.  Temp7=False
  1594.  Out2=Ucase$(Out2)
  1595.  If Instr(Out2,"#") Then
  1596.     Temp7=Val(Mid$(Out2,Instr(Out2,"#")+1))
  1597.     Out2=Left$(Out2,Instr(Out2,"#")-1)
  1598.  Endif
  1599.  TempX=False
  1600.  No.Input=False
  1601.  Temp4=Len(Out2)
  1602.  For Temp5=1 To Lof(3)/Len(UserRecord)
  1603.     Get 3,Temp5,UserRecord
  1604.     Out3=UserRecord.CodeName
  1605.     Call Decrypt(Out3)
  1606.     If Left$(Out3,Temp4)=Out2 Then
  1607.        TempX=TempX+1
  1608.        If Temp7=False Or TempX=Temp7 Then
  1609.           No.Input=True
  1610.           Exit For
  1611.        Endif
  1612.     Endif
  1613.  Next
  1614.  If No.Input=False Then
  1615.     Temp5=Int(Val(Out2))
  1616.     If Temp5>False And Temp5<=Lof(3)/Len(UserRecord) Then
  1617.        No.Input=True
  1618.     Endif
  1619.  Endif
  1620.  If No.Input=False Then
  1621.     Strng="User name not found."
  1622.     Call IO.O
  1623.     Exit Sub
  1624.  Endif
  1625.  Get 3,Temp5,UserRecord
  1626.  Out3=UserRecord.CodeName
  1627.  Call Decrypt(Out3)
  1628.  If Left$(Out3,9)=Deleted$ Then
  1629.     Strng="Deleted user record."
  1630.     Call IO.O
  1631.     Exit Sub
  1632.  Endif
  1633.  Call Modify.User
  1634. 10111
  1635.  Exit Sub
  1636. 10112
  1637.  Resume 10111
  1638. End Sub
  1639.  
  1640. Sub Show.Users
  1641.  On Local Error Goto 10122
  1642.  Strng="Enter range:"
  1643.  Call IO.O
  1644.  Temp3=Lof(3)/Len(UserRecord)
  1645.  Temp$=Mid$(Str$(Temp3),2)
  1646.  Strng="From(1-"+Temp$+")?"
  1647.  No.Input.Out="1"
  1648.  Call IO.I
  1649.  Temp=Int(Val(Out2))
  1650.  If Temp<1 Then
  1651.     Strng=Range$
  1652.     Call IO.O
  1653.     Exit Sub
  1654.  Endif
  1655.  Strng="To("+Mid$(Str$(Temp),2)+"-"+Temp$+")?"
  1656.  No.Input.Out=Temp$
  1657.  Call IO.I
  1658.  Temp2=Int(Val(Out2))
  1659.  If Temp2<Temp Then
  1660.     Strng=Range$
  1661.     Call IO.O
  1662.     Exit Sub
  1663.  Endif
  1664.  If Temp2>Temp3 Then
  1665.     Temp2=Temp3
  1666.  Endif
  1667.  For Temp5=Temp To Temp2
  1668.     Get 3,Temp5,UserRecord
  1669.     Out3=UserRecord.CodeName
  1670.     Call Decrypt(Out3)
  1671.     If Left$(Out3,9)<>Deleted$ Then
  1672.        Call Display.User(False)
  1673.        Call More.Prompt
  1674.        If No Then
  1675.           Exit For
  1676.        Endif
  1677.     Endif
  1678.  Next
  1679. 10121
  1680.  Exit Sub
  1681. 10122
  1682.  Resume 10121
  1683. End Sub
  1684.  
  1685. Sub Display.User(TempX)
  1686.  On Local Error Goto 10132
  1687.  If TempX Then
  1688.     If TempC Then
  1689.        Exit Sub
  1690.     Endif
  1691.  Endif
  1692.  Graphics.Off=True
  1693.  Strng="User number"+Str$(Temp5)+"."
  1694.  Call IO.O
  1695.  Strng=""
  1696.  If TempX Then
  1697.     Strng="[A]"
  1698.  Endif
  1699.  Out2=UserRecord.CodeName
  1700.  Call Decrypt(Out2)
  1701.  Out2=Rtrim$(Out2)
  1702.  Strng=Strng+"Username: "+Out2+" "
  1703.  If Local.Mode=False And Config2(81)=False Then
  1704.     Out2=String$(10,Mask$)
  1705.  Else
  1706.     Out2=UserRecord.PassWord
  1707.     Call Decrypt(Out2)
  1708.     Out2=Rtrim$(Out2)
  1709.  Endif
  1710.  If TempX Then
  1711.     Strng=Strng+"[B]"
  1712.  Endif
  1713.  Strng=Strng+"Password: "+Out2
  1714.  Call IO.O
  1715.  Strng=""
  1716.  If TempX Then
  1717.     Strng="[C]"
  1718.  Endif
  1719.  Strng=Strng+"Level:"+Str$(UserRecord.Level)
  1720.  Call IO.O
  1721.  Strng=""
  1722.  If TempX Then
  1723.     Strng="[D]"
  1724.  Endif
  1725.  Strng=Strng+"Class: "+Rtrim$(Class.Name(UserRecord.ClassType))
  1726.  Call IO.O
  1727.  Strng=""
  1728.  If TempX Then
  1729.     Strng="[E]"
  1730.  Endif
  1731.  Strng=Strng+"Weapon proficiency: "+_
  1732.  Rtrim$(Weapon.Type.Name(UserRecord.Proficiency))
  1733.  Call IO.O
  1734.  Strng=""
  1735.  If TempX Then
  1736.     Strng="[F]"
  1737.  Endif
  1738.  Strng=Strng+"Blunt proficiency%:"+Str$(UserRecord.Weapons(1))
  1739.  Call IO.O
  1740.  Strng=""
  1741.  If TempX Then
  1742.     Strng="[G]"
  1743.  Endif
  1744.  Strng=Strng+"Pole proficiency%:"+Str$(UserRecord.Weapons(2))
  1745.  Call IO.O
  1746.  Strng=""
  1747.  If TempX Then
  1748.     Strng="[H]"
  1749.  Endif
  1750.  Strng=Strng+"Sharp proficiency%:"+Str$(UserRecord.Weapons(3))
  1751.  Call IO.O
  1752.  Strng=""
  1753.  If TempX Then
  1754.     Strng="[I]"
  1755.  Endif
  1756.  Strng=Strng+"Thrusting proficiency%:"+Str$(UserRecord.Weapons(4))
  1757.  Call IO.O
  1758.  Strng=""
  1759.  If TempX Then
  1760.     Strng="[J]"
  1761.  Endif
  1762.  Strng=Strng+"Classname: "
  1763.  Out2=UserRecord.ClassName
  1764.  Call Decrypt(Out2)
  1765.  Out2=Rtrim$(Out2)
  1766.  Strng=Strng+Out2
  1767.  Call IO.O
  1768.  Strng=""
  1769.  If TempX Then
  1770.     Strng="[K]"
  1771.  Endif
  1772.  Strng=Strng+"Strength:"+Str$(UserRecord.Stats(1))
  1773.  Call IO.O
  1774.  Strng=""
  1775.  If TempX Then
  1776.     Strng="[L]"
  1777.  Endif
  1778.  Strng=Strng+"Intelligence:"+Str$(UserRecord.Stats(2))
  1779.  Call IO.O
  1780.  Strng=""
  1781.  If TempX Then
  1782.     Strng="[M]"
  1783.  Endif
  1784.  Strng=Strng+"Wisdom:"+Str$(UserRecord.Stats(3))
  1785.  Call IO.O
  1786.  Strng=""
  1787.  If TempX Then
  1788.     Strng="[N]"
  1789.  Endif
  1790.  Strng=Strng+"Dexterity:"+Str$(UserRecord.Stats(4))
  1791.  Call IO.O
  1792.  Strng=""
  1793.  If TempX Then
  1794.     Strng="[O]"
  1795.  Endif
  1796.  Strng=Strng+"Constitution:"+Str$(UserRecord.Stats(5))
  1797.  Call IO.O
  1798.  Strng=""
  1799.  If TempX Then
  1800.     Strng="[P]"
  1801.  Endif
  1802.  Strng=Strng+"Piety:"+Str$(UserRecord.Stats(6))
  1803.  Call IO.O
  1804.  Strng=""
  1805.  If TempX Then
  1806.     Strng="[R]"
  1807.  Endif
  1808.  Strng=Strng+"Charisma:"+Str$(UserRecord.Stats(7))
  1809.  Call IO.O
  1810.  Strng=""
  1811.  If TempX Then
  1812.     Strng="[S]"
  1813.  Endif
  1814.  Strng=Strng+"Experience:"+Str$(UserRecord.Experience)
  1815.  Call IO.O
  1816.  Strng=""
  1817.  If TempX Then
  1818.     Strng="[T]"
  1819.  Endif
  1820.  Strng=Strng+"Gold:"+Str$(UserRecord.Gold)
  1821.  Call IO.O
  1822.  Strng=""
  1823.  If TempX Then
  1824.     Strng="[U]"
  1825.  Endif
  1826.  Strng=Strng+"Room number:"+Str$(UserRecord.Room)
  1827.  Call IO.O
  1828.  Strng=""
  1829.  If TempX Then
  1830.     Strng="[V]Call restrictions."
  1831.     Call IO.O
  1832.     Strng="[W]Inventory."
  1833.     Call IO.O
  1834.  Endif
  1835.  Strng=""
  1836.  If TempX Then
  1837.     Strng="[X]"
  1838.  Endif
  1839.  Strng=Strng+"Special characters: "
  1840.  Temp=False
  1841.  If UserRecord.Flags And Special.Char1 Then
  1842.     Strng=Strng+"town mayor, "
  1843.     Temp=True
  1844.  Endif
  1845.  If UserRecord.Flags And Special.Char2 Then
  1846.     Strng=Strng+"governor, "
  1847.     Temp=True
  1848.  Endif
  1849.  If UserRecord.Flags And Special.Char3 Then
  1850.     Strng=Strng+"guild master, "
  1851.     Temp=True
  1852.  Endif
  1853.  If UserRecord.Flags And Special.Char4 Then
  1854.     Strng=Strng+"sysop, "
  1855.     Temp=True
  1856.  Endif
  1857.  If Temp Then
  1858.     Strng=Left$(Strng,Len(Strng)-2)+"."
  1859.  Else
  1860.     Strng=Strng+"none."
  1861.  Endif
  1862.  Call IO.O
  1863.  If TempX Then
  1864.     Strng="[!]delete User"
  1865.     Call IO.O
  1866.  Endif
  1867.  Graphics.Off=False
  1868. 10131
  1869.  Exit Sub
  1870. 10132
  1871.  Resume 10131
  1872. End Sub
  1873.  
  1874. Sub Modify.User
  1875.  On Local Error Goto 10142
  1876.  Do
  1877.     Call Display.User(True)
  1878.     Graphics.Off=False
  1879.     Strng="User change option(q to quit)?"
  1880.     Line.Length=TempD
  1881.     No.Input.Out="Q"
  1882.     Call IO.I
  1883.     Select Case Ucase$(Out2)
  1884.     Case "A"
  1885.        If Local.Mode=False And Config2(81)=False Then
  1886.           Strng="Remote DMs cannot edit username."
  1887.           Call IO.O
  1888.        Else
  1889.           Strng="Username?"
  1890.           No.Input.Out=Deleted$
  1891.           Call IO.I
  1892.           Out2=Ucase$(Out2)
  1893.           Call Valid(Out2,30)
  1894.           If Out2=Nul Then
  1895.              Strng="Illegal characters in codename."
  1896.              Call IO.O
  1897.           Else
  1898.              Call Encrypt(Out2,True)
  1899.              UserRecord.CodeName=Out2
  1900.           Endif
  1901.        Endif
  1902.     Case "B"
  1903.        If Local.Mode=False And Config2(81)=False Then
  1904.           Strng="Remote DMs cannot edit password."
  1905.           Call IO.O
  1906.        Else
  1907.           Out2=UserRecord.PassWord
  1908.           Call Decrypt(Out2)
  1909.           If Out2=Nul Then
  1910.              Strng="This password has a checksum error."
  1911.              Call IO.O
  1912.           Endif
  1913.           Strng="Password?"
  1914.           No.Input.Out=Deleted$
  1915.           Call IO.I
  1916.           Out2=Ucase$(Out2)
  1917.           Call Valid(Out2,20)
  1918.           If Out2=Nul Then
  1919.              Strng="Illegal characters in password."
  1920.              Call IO.O
  1921.           Else
  1922.              Call Encrypt(Out2,False)
  1923.              UserRecord.PassWord=Out2
  1924.           Endif
  1925.        Endif
  1926.     Case "C"
  1927.        Strng="Level?"
  1928.        No.Input.Out="1"
  1929.        Call IO.I
  1930.        Temp3=Int(Val(Out2))
  1931.        UserRecord.Level=Temp3
  1932.        If Temp3>9999 Then
  1933.           Strng="User has dungeon master access."
  1934.           Call IO.O
  1935.        Else
  1936.           If Temp3>999 Then
  1937.              Strng="User has assistant dungeon master access."
  1938.              Call IO.O
  1939.           Endif
  1940.        Endif
  1941.        Call New.Stats
  1942.     Case "D"
  1943.        Do
  1944.           Graphics.Off=True
  1945.           If TempC=False Then
  1946.              For Temp3=1 To 9
  1947.                 Strng="["+Chr$(64+Temp3)+"]"+Rtrim$(Class.Name(Temp3))
  1948.                 Call IO.O
  1949.              Next
  1950.              If Local.Mode Then
  1951.                 Strng="[J]"+Rtrim$(Class.Name(10))
  1952.                 Call IO.O
  1953.              Endif
  1954.              Graphics.Off=False
  1955.           Endif
  1956.           Strng="Class option(q to quit)?"
  1957.           Line.Length=TempD
  1958.           No.Input.Out="Q"
  1959.           Call IO.I
  1960.           Temp$=Ucase$(Out2)
  1961.           Select Case Temp$
  1962.           Case "A" To "I"
  1963.              UserRecord.ClassType=(Asc(Temp$)-64)
  1964.              Call New.Stats
  1965.           Case "J"
  1966.              If Local.Mode Then
  1967.                 UserRecord.ClassType=10
  1968.                 Call New.Stats
  1969.              Endif
  1970.           Case "Q"
  1971.              Exit Do
  1972.           End Select
  1973.        Loop
  1974.     Case "E"
  1975.        Do
  1976.           Graphics.Off=True
  1977.           If TempC=False Then
  1978.              For Temp3=1 To 4
  1979.                 Strng="["+Chr$(64+Temp3)+"]"+_
  1980.                 Rtrim$(Weapon.Type.Name(Temp3))
  1981.                 Call IO.O
  1982.              Next
  1983.              Graphics.Off=False
  1984.           Endif
  1985.           Strng="Weapon proficiency(q to quit)?"
  1986.           Line.Length=TempD
  1987.           No.Input.Out="Q"
  1988.           Call IO.I
  1989.           Temp$=Ucase$(Out2)
  1990.           Select Case Temp$
  1991.           Case "A" To "D"
  1992.              UserRecord.Proficiency=(Asc(Temp$)-64)
  1993.           Case "Q"
  1994.              Exit Do
  1995.           End Select
  1996.        Loop
  1997.     Case "F"
  1998.        Strng="Blunt weapon proficiency%(1-100)?"
  1999.        No.Input.Out="10"
  2000.        Call IO.I
  2001.        UserRecord.Weapons(1)=Int(Val(Out2))
  2002.     Case "G"
  2003.        Strng="Pole weapon proficiency%(1-100)?"
  2004.        No.Input.Out="10"
  2005.        Call IO.I
  2006.        UserRecord.Weapons(2)=Int(Val(Out2))
  2007.     Case "H"
  2008.        Strng="Sharp weapon proficiency%(1-100)?"
  2009.        No.Input.Out="10"
  2010.        Call IO.I
  2011.        UserRecord.Weapons(3)=Int(Val(Out2))
  2012.     Case "I"
  2013.        Strng="Thrusting weapon proficiency%(1-100)?"
  2014.        No.Input.Out="10"
  2015.        Call IO.I
  2016.        UserRecord.Weapons(4)=Int(Val(Out2))
  2017.     Case "J"
  2018.        Strng="Classname?"
  2019.        No.Input.Out=Deleted$
  2020.        Call IO.I
  2021.        Call Valid(Out2,20)
  2022.        If Out2=Nul Then
  2023.           Strng="Illegal characters in classname."
  2024.           Call IO.O
  2025.        Else
  2026.           Call Encrypt(Out2,True)
  2027.           UserRecord.ClassName=Out2
  2028.        Endif
  2029.     Case "K"
  2030.        Strng="Strength?"
  2031.        No.Input.Out=Mid$(Str$(Config1(4)),2)
  2032.        Call IO.I
  2033.        UserRecord.Stats(1)=Int(Val(Out2))
  2034.     Case "L"
  2035.        Strng="Intelligence?"
  2036.        No.Input.Out=Mid$(Str$(Config1(4)),2)
  2037.        Call IO.I
  2038.        UserRecord.Stats(2)=Int(Val(Out2))
  2039.     Case "M"
  2040.        Strng="Wisdom?"
  2041.        No.Input.Out=Mid$(Str$(Config1(4)),2)
  2042.        Call IO.I
  2043.        UserRecord.Stats(3)=Int(Val(Out2))
  2044.     Case "N"
  2045.        Strng="Dexterity?"
  2046.        No.Input.Out=Mid$(Str$(Config1(4)),2)
  2047.        Call IO.I
  2048.        UserRecord.Stats(4)=Int(Val(Out2))
  2049.     Case "O"
  2050.        Strng="Constitution?"
  2051.        No.Input.Out=Mid$(Str$(Config1(4)),2)
  2052.        Call IO.I
  2053.        UserRecord.Stats(5)=Int(Val(Out2))
  2054.     Case "P"
  2055.        Strng="Piety?"
  2056.        No.Input.Out=Mid$(Str$(Config1(4)),2)
  2057.        Call IO.I
  2058.        UserRecord.Stats(6)=Int(Val(Out2))
  2059.     Case "R"
  2060.        Strng="Charisma?"
  2061.        No.Input.Out=Mid$(Str$(Config1(4)),2)
  2062.        Call IO.I
  2063.        UserRecord.Stats(7)=Int(Val(Out2))
  2064.     Case "S"
  2065.        Strng="Experience?"
  2066.        No.Input.Out="128"
  2067.        Call IO.I
  2068.        UserRecord.Experience=Val(Out2)
  2069.     Case "T"
  2070.        Strng="Gold?"
  2071.        No.Input.Out=Mid$(Str$(Config2(32)),2)
  2072.        Call IO.I
  2073.        UserRecord.Gold=Val(Out2)
  2074.     Case "U"
  2075.        Strng="Room number?"
  2076.        No.Input.Out=Mid$(Str$(Val(Config3(24))),2)
  2077.        Call IO.I
  2078.        UserRecord.Room=Int(Val(Out2))
  2079.     Case "V"
  2080.        Graphics.Off=True
  2081.        Strng="Calls made today?"
  2082.        No.Input.Out="0"
  2083.        Call IO.I
  2084.        UserRecord.NumCalls=Int(Val(Out2))
  2085.        Strng="Maximum calls per day?"
  2086.        No.Input.Out=Mid$(Str$(Config2(1)),2)
  2087.        Call IO.I
  2088.        UserRecord.MaxCalls=Int(Val(Out2))
  2089.        Strng="Timeon restriction(from hour: form HH)?"
  2090.        No.Input.Out="00"
  2091.        Call IO.I
  2092.        UserRecord.FromHour=Int(Val(Out2))
  2093.        Strng="Timeon restriction(from minute: form MM)?"
  2094.        No.Input.Out="00"
  2095.        Call IO.I
  2096.        UserRecord.FromMin=Int(Val(Out2))
  2097.        Strng="Timeon restriction(to hour: form HH)?"
  2098.        No.Input.Out="00"
  2099.        Call IO.I
  2100.        UserRecord.ToHour=Int(Val(Out2))
  2101.        Strng="Timeon restriction(to minute: form MM)?"
  2102.        No.Input.Out="00"
  2103.        Call IO.I
  2104.        UserRecord.ToMin=Int(Val(Out2))
  2105.        Graphics.Off=False
  2106.     Case "W"
  2107.        Call Edit.Inventory
  2108.     Case "X"
  2109.        Do
  2110.           Graphics.Off=True
  2111.           If TempC=False Then
  2112.              Strng="[A]town mayor"
  2113.              Call IO.O
  2114.              Strng="[B]governor"
  2115.              Call IO.O
  2116.              Strng="[C]guild master"
  2117.              Call IO.O
  2118.              Strng="[D]sysop"
  2119.              Call IO.O
  2120.              Strng="[E]none"
  2121.              Call IO.O
  2122.              Graphics.Off=False
  2123.           Endif
  2124.           Strng="Special class option(q to quit)?"
  2125.           Line.Length=TempD
  2126.           No.Input.Out="Q"
  2127.           Call IO.I
  2128.           Select Case Ucase$(Out2)
  2129.           Case "A"
  2130.              UserRecord.Flags=UserRecord.Flags Or Special.Char1
  2131.              Strng="User is now town mayor."
  2132.              Call IO.O
  2133.           Case "B"
  2134.              UserRecord.Flags=UserRecord.Flags Or Special.Char2
  2135.              Strng="User is now governor."
  2136.              Call IO.O
  2137.           Case "C"
  2138.              UserRecord.Flags=UserRecord.Flags Or Special.Char3
  2139.              Strng="User is now guild master."
  2140.              Call IO.O
  2141.           Case "D"
  2142.              UserRecord.Flags=UserRecord.Flags Or Special.Char4
  2143.              Strng="User is now sysop."
  2144.              Call IO.O
  2145.           Case "E"
  2146.              UserRecord.Flags=UserRecord.Flags And Not Special.Char1
  2147.              UserRecord.Flags=UserRecord.Flags And Not Special.Char2
  2148.              UserRecord.Flags=UserRecord.Flags And Not Special.Char3
  2149.              UserRecord.Flags=UserRecord.Flags And Not Special.Char4
  2150.              Strng="User is cleared of special character class."
  2151.              Call IO.O
  2152.           Case "Q"
  2153.              Exit Do
  2154.           End Select
  2155.        Loop
  2156.     Case "!"
  2157.        Strng="Are you sure(y/n)?"
  2158.        Line.Length=TempD
  2159.        No.Input.Out="N"
  2160.        Call IO.I
  2161.        If Yes Then
  2162.           Call Delete.User
  2163.           Strng="User deleted."
  2164.           Call IO.O
  2165.           Exit Do
  2166.        Endif
  2167.     Case "Q"
  2168.        Exit Do
  2169.     End Select
  2170.  Loop
  2171.  Put 3,Temp5,UserRecord
  2172. 10141
  2173.  Exit Sub
  2174. 10142
  2175.  Resume 10141
  2176. End Sub
  2177.  
  2178. Sub Pack.Users
  2179.  On Local Error Goto 10152
  2180.  Strng="Delete -dead- users(y/n)?"
  2181.  Line.Length=TempD
  2182.  No.Input.Out="Y"
  2183.  Call IO.I
  2184.  TempX=False
  2185.  If Yes Then
  2186.     TempX=True
  2187.  Endif
  2188.  TempZ=False
  2189.  Strng="Delete users before date(y/n)?"
  2190.  Line.Length=TempD
  2191.  No.Input.Out="N"
  2192.  Call IO.I
  2193.  If Yes Then
  2194.     TempZ=True
  2195.     Strng="Enter date:"
  2196.     No.Input.Out="01-01-1980"
  2197.     Call IO.I
  2198.     Temp#=Int(DateValue#(Out2))
  2199.  Endif
  2200.  Graphics.Off=True
  2201.  Strng="Making backup of userfile.."
  2202.  Call IO.O
  2203.  Close 13
  2204.  FileName=Config3(11)+Config3(21)+".BAK"
  2205.  Open FileName For Random Shared As #13 Len=Len(UserRecord)
  2206.  Strng="User record copied:"+Space$(5)
  2207.  Carriage.Return=True
  2208.  Call IO.O
  2209.  For Temp3=1 To Lof(3)/Len(UserRecord)
  2210.     Get 3,Temp3,UserRecord
  2211.     Put 13,Temp3,UserRecord
  2212.     For Temp5=1 To 5
  2213.        Call Back.Space
  2214.     Next
  2215.     Strng=Str$(Temp3)
  2216.     Strng=Strng+Space$(5-Len(Strng))
  2217.     Carriage.Return=True
  2218.     Call IO.O
  2219.  Next
  2220.  Close 13
  2221.  Call IO.O
  2222.  Strng="User record deleted:"+Space$(5)
  2223.  Carriage.Return=True
  2224.  Call IO.O
  2225.  For Temp3=1 To Lof(3)/Len(UserRecord)
  2226.     Get 3,Temp3,UserRecord
  2227.     Call New.Stats
  2228.     Out3=UserRecord.CodeName
  2229.     Call Decrypt(Out3)
  2230.     Temp=False
  2231.     If TempX Then
  2232.        If UserRecord.Level=False Then
  2233.           Temp=True
  2234.        Endif
  2235.     Endif
  2236.     If TempZ Then
  2237.        Out2=UserRecord.DateOn
  2238.        Call Decrypt(Out2)
  2239.        If Int(DateValue#(Out2))<Temp# Then
  2240.           Temp=True
  2241.        Endif
  2242.     Endif
  2243.     If Temp Then
  2244.        If Left$(Out3,9)<>Deleted$ Then
  2245.           For Temp5=1 To 5
  2246.              Call Back.Space
  2247.           Next
  2248.           Strng=Str$(Temp3)
  2249.           Strng=Strng+Space$(5-Len(Strng))
  2250.           Carriage.Return=True
  2251.           Call IO.O
  2252.        Endif
  2253.        Call Delete.User
  2254.     Endif
  2255.     Put 3,Temp3,UserRecord
  2256.  Next
  2257.  Strng=Nul
  2258.  Call IO.O
  2259.  Graphics.Off=False
  2260.  Strng="User file packed."
  2261.  Call IO.O
  2262. 10151
  2263.  Exit Sub
  2264. 10152
  2265.  Resume 10151
  2266. End Sub
  2267.  
  2268. Sub Delete.User
  2269.  On Local Error Goto 10162
  2270.  Strng=Deleted$
  2271.  Call Valid(Strng,30)
  2272.  Call Encrypt(Strng,True)
  2273.  UserRecord.CodeName=Strng
  2274.  Strng=Deleted$
  2275.  Call Valid(Strng,20)
  2276.  Call Encrypt(Strng,False)
  2277.  UserRecord.PassWord=Strng
  2278.  Strng=Deleted$
  2279.  Call Valid(Strng,20)
  2280.  Call Encrypt(Strng,True)
  2281.  UserRecord.ClassName=Strng
  2282.  UserRecord.Level=False
  2283.  UserRecord.Flags=False
  2284.  UserRecord.ClassType=False
  2285.  UserRecord.ToMin=False
  2286.  UserRecord.ToHour=False
  2287.  UserRecord.FromMin=False
  2288.  UserRecord.FromHour=False
  2289.  UserRecord.MaxCalls=False
  2290.  For Temp6=1 To 15
  2291.     UserRecord.Inv(Temp6)=False
  2292.     UserRecord.Charges(Temp6)=False
  2293.  Next
  2294.  For Temp6=1 To 5
  2295.     UserRecord.Object(Temp6)=False
  2296.     UserRecord.ObjCharges(Temp6)=False
  2297.  Next
  2298. 10161
  2299.  Exit Sub
  2300. 10162
  2301.  Resume 10161
  2302. End Sub
  2303.  
  2304. Sub Search.Users
  2305.  On Local Error Goto 10172
  2306.  Do
  2307.     Temp1$=Nul
  2308.     Temp2$=Nul
  2309.     Temp3$=Nul
  2310.     Temp1=False
  2311.     Temp3=False
  2312.     Temp4=False
  2313.     Temp6=False
  2314.     Temp7=False
  2315.     Temp8=False
  2316.     Temp9=False
  2317.     Temp10=False
  2318.     Temp11=False
  2319.     Temp12=False
  2320.     Temp13#=False
  2321.     Temp14#=False
  2322.     Temp15#=False
  2323.     Temp16#=False
  2324.     Temp17=False
  2325.     Temp18=False
  2326.     Do
  2327.        Graphics.Off=True
  2328.        If TempC=False Then
  2329.           Strng="[A]username substring"
  2330.           If Temp1$<>Nul Then
  2331.              Strng=Strng+Space$(30-Len(Strng))
  2332.              Strng=Strng+"("+Temp1$+")"
  2333.           Endif
  2334.           Call IO.O
  2335.           Strng="[B]password substring"
  2336.           If Temp2$<>Nul Then
  2337.              Strng=Strng+Space$(30-Len(Strng))
  2338.              Strng=Strng+"("+Temp2$+")"
  2339.           Endif
  2340.           Call IO.O
  2341.           Strng="[C]classname substring"
  2342.           If Temp3$<>Nul Then
  2343.              Strng=Strng+Space$(30-Len(Strng))
  2344.              Strng=Strng+"("+Temp3$+")"
  2345.           Endif
  2346.           Call IO.O
  2347.           Strng="[D]level"
  2348.           If Temp1 Then
  2349.              Strng=Strng+Space$(30-Len(Strng))
  2350.              Strng=Strng+"("+Mid$(Str$(Temp1),2)+")"
  2351.           Endif
  2352.           Call IO.O
  2353.           Strng="[E]class"
  2354.           If Temp3 Then
  2355.              Strng=Strng+Space$(30-Len(Strng))
  2356.              Strng=Strng+"("+Rtrim$(Class.Name(Temp3))+")"
  2357.           Endif
  2358.           Call IO.O
  2359.           Strng="[F]weapon proficiency"
  2360.           If Temp4 Then
  2361.              Strng=Strng+Space$(30-Len(Strng))
  2362.              Strng=Strng+"("+Rtrim$(Weapon.Type.Name(Temp4))+")"
  2363.           Endif
  2364.           Call IO.O
  2365.           Strng="[G]strength"
  2366.           If Temp6 Then
  2367.              Strng=Strng+Space$(30-Len(Strng))
  2368.              Strng=Strng+"("+Mid$(Str$(Temp6),2)+")"
  2369.           Endif
  2370.           Call IO.O
  2371.           Strng="[H]intelligence"
  2372.           If Temp7 Then
  2373.              Strng=Strng+Space$(30-Len(Strng))
  2374.              Strng=Strng+"("+Mid$(Str$(Temp7),2)+")"
  2375.           Endif
  2376.           Call IO.O
  2377.           Strng="[I]wisdom"
  2378.           If Temp8 Then
  2379.              Strng=Strng+Space$(30-Len(Strng))
  2380.              Strng=Strng+"("+Mid$(Str$(Temp8),2)+")"
  2381.           Endif
  2382.           Call IO.O
  2383.           Strng="[J]dexterity"
  2384.           If Temp9 Then
  2385.              Strng=Strng+Space$(30-Len(Strng))
  2386.              Strng=Strng+"("+Mid$(Str$(Temp9),2)+")"
  2387.           Endif
  2388.           Call IO.O
  2389.           Strng="[K]constitution"
  2390.           If Temp10 Then
  2391.              Strng=Strng+Space$(30-Len(Strng))
  2392.              Strng=Strng+"("+Mid$(Str$(Temp10),2)+")"
  2393.           Endif
  2394.           Call IO.O
  2395.           Strng="[L]piety"
  2396.           If Temp11 Then
  2397.              Strng=Strng+Space$(30-Len(Strng))
  2398.              Strng=Strng+"("+Mid$(Str$(Temp11),2)+")"
  2399.           Endif
  2400.           Call IO.O
  2401.           Strng="[M]charisma"
  2402.           If Temp12 Then
  2403.              Strng=Strng+Space$(30-Len(Strng))
  2404.              Strng=Strng+"("+Mid$(Str$(Temp12),2)+")"
  2405.           Endif
  2406.           Call IO.O
  2407.           Strng="[N]experience"
  2408.           If Temp13# Then
  2409.              If Temp14# Then
  2410.                 Strng=Strng+Space$(30-Len(Strng))
  2411.                 Strng=Strng+"("+Mid$(Str$(Temp13#),2)+"-"+_
  2412.                 Mid$(Str$(Temp14#),2)+")"
  2413.              Endif
  2414.           Endif
  2415.           Call IO.O
  2416.           Strng="[O]gold"
  2417.           If Temp15# Then
  2418.              If Temp16# Then
  2419.                 Strng=Strng+Space$(30-Len(Strng))
  2420.                 Strng=Strng+"("+Mid$(Str$(Temp15#),2)+"-"+_
  2421.                 Mid$(Str$(Temp16#),2)+")"
  2422.              Endif
  2423.           Endif
  2424.           Call IO.O
  2425.           Strng="[P]room number"
  2426.           If Temp17 Then
  2427.              Strng=Strng+Space$(30-Len(Strng))
  2428.              Strng=Strng+"("+Mid$(Str$(Temp17),2)+")"
  2429.           Endif
  2430.           Call IO.O
  2431.           Strng="[R]special character"
  2432.           If Temp18 Then
  2433.              Strng=Strng+Space$(30-Len(Strng))
  2434.              Select Case Temp18
  2435.              Case 1
  2436.                 Strng=Strng+"(town mayor)"
  2437.              Case 2
  2438.                 Strng=Strng+"(governor)"
  2439.              Case 3
  2440.                 Strng=Strng+"(guild master)"
  2441.              Case 4
  2442.                 Strng=Strng+"(sysop)"
  2443.              End Select
  2444.           Endif
  2445.           Call IO.O
  2446.  
  2447.           Graphics.Off=False
  2448.        Endif
  2449.        Strng="User search option(s to search, q to quit)?"
  2450.        Line.Length=TempD
  2451.        No.Input.Out="Q"
  2452.        Call IO.I
  2453.        Select Case Ucase$(Out2)
  2454.        Case "A"
  2455.           Strng="Username substring?"
  2456.           Call IO.I
  2457.           Out2=Ucase$(Out2)
  2458.           Temp1$=Out2
  2459.        Case "B"
  2460.           Strng="Password substring?"
  2461.           Call IO.I
  2462.           Out2=Ucase$(Out2)
  2463.           Temp2$=Out2
  2464.        Case "C"
  2465.           Strng="Classname substring?"
  2466.           Call IO.I
  2467.           Out2=Ucase$(Out2)
  2468.           Temp3$=Out2
  2469.        Case "D"
  2470.           Strng="Level?"
  2471.           Call IO.I
  2472.           Temp1=Int(Val(Out2))
  2473.        Case "E"
  2474.           If TempC=False Then
  2475.              Graphics.Off=True
  2476.              For Temp5=1 To 10
  2477.                 Strng="["+Mid$(Str$(Temp5),2)+"]"+Rtrim$(Class.Name(Temp5))
  2478.                 Call IO.O
  2479.              Next
  2480.              Graphics.Off=False
  2481.           Endif
  2482.           Strng="Class(1-10)?"
  2483.           Call IO.I
  2484.           Temp3=Int(Val(Out2))
  2485.           If Temp3<1 Or Temp3>10 Then
  2486.              Temp3=False
  2487.           Endif
  2488.        Case "F"
  2489.           If TempC=False Then
  2490.              Graphics.Off=True
  2491.              For Temp5=1 To 4
  2492.                 Strng="["+Mid$(Str$(Temp5),2)+"]"+_
  2493.                 Rtrim$(Weapon.Type.Name(Temp5))
  2494.                 Call IO.O
  2495.              Next
  2496.              Graphics.Off=False
  2497.           Endif
  2498.           Strng="Weapon proficiency(1-4)?"
  2499.           Call IO.I
  2500.           Temp4=Int(Val(Out2))
  2501.           If Temp4<1 Or Temp4>4 Then
  2502.              Temp4=False
  2503.           Endif
  2504.        Case "G"
  2505.           Strng="Strength?"
  2506.           Call IO.I
  2507.           Temp6=Int(Val(Out2))
  2508.        Case "H"
  2509.           Strng="Intelligence?"
  2510.           Call IO.I
  2511.           Temp7=Int(Val(Out2))
  2512.        Case "I"
  2513.           Strng="Wisdom?"
  2514.           Call IO.I
  2515.           Temp8=Int(Val(Out2))
  2516.        Case "J"
  2517.           Strng="Dexterity?"
  2518.           Call IO.I
  2519.           Temp9=Int(Val(Out2))
  2520.        Case "K"
  2521.           Strng="Constitution?"
  2522.           Call IO.I
  2523.           Temp10=Int(Val(Out2))
  2524.        Case "L"
  2525.           Strng="Piety?"
  2526.           Call IO.I
  2527.           Temp11=Int(Val(Out2))
  2528.        Case "M"
  2529.           Strng="Charisma?"
  2530.           Call IO.I
  2531.           Temp12=Int(Val(Out2))
  2532.        Case "N"
  2533.           Strng="Enter range:"
  2534.           Call IO.O
  2535.           No.Input.Out="1"
  2536.           Strng="From?"
  2537.           Call IO.I
  2538.           Temp13#=Val(Out2)
  2539.           No.Input.Out="10"
  2540.           Strng="To?"
  2541.           Call IO.I
  2542.           Temp14#=Val(Out2)
  2543.        Case "O"
  2544.           Strng="Enter range:"
  2545.           Call IO.O
  2546.           No.Input.Out="1"
  2547.           Strng="From?"
  2548.           Call IO.I
  2549.           Temp15#=Val(Out2)
  2550.           No.Input.Out="10"
  2551.           Strng="To?"
  2552.           Call IO.I
  2553.           Temp16#=Val(Out2)
  2554.        Case "P"
  2555.           Strng="Room number?"
  2556.           Call IO.I
  2557.           Temp17=Int(Val(Out2))
  2558.        Case "R"
  2559.           If TempC=False Then
  2560.              Graphics.Off=True
  2561.              Strng="[1]town mayor"
  2562.              Call IO.O
  2563.              Strng="[2]governor"
  2564.              Call IO.O
  2565.              Strng="[3]guild master"
  2566.              Call IO.O
  2567.              Strng="[4]sysop"
  2568.              Call IO.O
  2569.              Graphics.Off=False
  2570.           Endif
  2571.           Strng="Special character(1-4)?"
  2572.           Call IO.I
  2573.           Temp18=Int(Val(Out2))
  2574.           If Temp18<1 Or Temp18>4 Then
  2575.              Temp18=False
  2576.           Endif
  2577.        Case "S"
  2578.           Strng="Enter range:"
  2579.           Call IO.O
  2580.           Temp5=Lof(3)/Len(UserRecord)
  2581.           Temp$=Mid$(Str$(Temp5),2)
  2582.           Strng="From(1-"+Temp$+")?"
  2583.           No.Input.Out="1"
  2584.           Call IO.I
  2585.           Temp=Int(Val(Out2))
  2586.           If Temp<1 Or Temp>Temp5 Then
  2587.              Strng=Range$
  2588.              Call IO.O
  2589.              Exit Do
  2590.           Endif
  2591.           Strng="To("+Mid$(Str$(Temp),2)+"-"+Temp$+")?"
  2592.           No.Input.Out=Temp$
  2593.           Call IO.I
  2594.           Temp2=Int(Val(Out2))
  2595.           If Temp2<Temp Then
  2596.              Strng=Range$
  2597.              Call IO.O
  2598.              Exit Do
  2599.           Endif
  2600.           If Temp2>Temp5 Then
  2601.              Temp2=Temp5
  2602.           Endif
  2603.           For Temp5=Temp To Temp2
  2604.              Get 3,Temp5,UserRecord
  2605.              TempX=False
  2606.              If Temp1$<>Nul Then
  2607.                 Call Decrypt(UserRecord.Codename)
  2608.                 If Instr(Out3,Temp1$) Then
  2609.                    TempX=True
  2610.                 Endif
  2611.              Endif
  2612.              If Temp2$<>Nul Then
  2613.                 Call Decrypt(UserRecord.Password)
  2614.                 If Instr(Out3,Temp2$) Then
  2615.                    TempX=True
  2616.                 Endif
  2617.              Endif
  2618.              If Temp3$<>Nul Then
  2619.                 Call Decrypt(UserRecord.Classname)
  2620.                 If Instr(Out3,Temp3$) Then
  2621.                    TempX=True
  2622.                 Endif
  2623.              Endif
  2624.              If Temp1 Then
  2625.                 If UserRecord.Level=Temp1 Then
  2626.                    TempX=True
  2627.                 Endif
  2628.              Endif
  2629.              If Temp3 Then
  2630.                 If UserRecord.ClassType=Temp3 Then
  2631.                    TempX=True
  2632.                 Endif
  2633.              Endif
  2634.              If Temp4 Then
  2635.                 If UserRecord.Proficiency=Temp4 Then
  2636.                    TempX=True
  2637.                 Endif
  2638.              Endif
  2639.              If Temp6 Then
  2640.                 If UserRecord.Stats(1)=Temp6 Then
  2641.                    TempX=True
  2642.                 Endif
  2643.              Endif
  2644.              If Temp7 Then
  2645.                 If UserRecord.Stats(2)=Temp7 Then
  2646.                    TempX=True
  2647.                 Endif
  2648.              Endif
  2649.              If Temp8 Then
  2650.                 If UserRecord.Stats(3)=Temp8 Then
  2651.                    TempX=True
  2652.                 Endif
  2653.              Endif
  2654.              If Temp9 Then
  2655.                 If UserRecord.Stats(4)=Temp9 Then
  2656.                    TempX=True
  2657.                 Endif
  2658.              Endif
  2659.              If Temp10 Then
  2660.                 If UserRecord.Stats(5)=Temp10 Then
  2661.                    TempX=True
  2662.                 Endif
  2663.              Endif
  2664.              If Temp11 Then
  2665.                 If UserRecord.Stats(6)=Temp11 Then
  2666.                    TempX=True
  2667.                 Endif
  2668.              Endif
  2669.              If Temp12 Then
  2670.                 If UserRecord.Stats(7)=12 Then
  2671.                    TempX=True
  2672.                 Endif
  2673.              Endif
  2674.              If Temp13 And Temp14 Then
  2675.                 If UserRecord.Experience>=Temp13 And_
  2676.                 UserRecord.Experience<=Temp14 Then
  2677.                    TempX=True
  2678.                 Endif
  2679.              Endif
  2680.              If Temp15 And Temp16 Then
  2681.                 If UserRecord.Gold>=Temp15 And_
  2682.                 UserRecord.Gold<=Temp16 Then
  2683.                    TempX=True
  2684.                 Endif
  2685.              Endif
  2686.              If Temp17 Then
  2687.                 If UserRecord.Room=Temp17 Then
  2688.                    TempX=True
  2689.                 Endif
  2690.              Endif
  2691.              If Temp18 Then
  2692.                 Select Case Temp18
  2693.                 Case 1
  2694.                    If UserRecord.Flags And Special.Char1 Then
  2695.                       TempX=True
  2696.                    Endif
  2697.                 Case 2
  2698.                    If UserRecord.Flags And Special.Char2 Then
  2699.                       TempX=True
  2700.                    Endif
  2701.                 Case 3
  2702.                    If UserRecord.Flags And Special.Char3 Then
  2703.                       TempX=True
  2704.                    Endif
  2705.                 Case 4
  2706.                    If UserRecord.Flags And Special.Char4 Then
  2707.                       TempX=True
  2708.                    Endif
  2709.                 End Select
  2710.              Endif
  2711.              If TempX Then
  2712.                 Call Decrypt(UserRecord.Codename)
  2713.                 If Left$(Out3,9)<>Deleted$ Then
  2714.                    Call Display.User(False)
  2715.                    Call More.Prompt
  2716.                    If No Then
  2717.                       Exit Do
  2718.                    Endif
  2719.                 Endif
  2720.              Endif
  2721.           Next
  2722.           Exit Do
  2723.        Case "Q"
  2724.           Exit Sub
  2725.        End Select
  2726.     Loop
  2727.  Loop
  2728. 10171
  2729.  Exit Sub
  2730. 10172
  2731.  Resume 10171
  2732. End Sub
  2733.  
  2734. Sub Edit.Inventory
  2735.  On Local Error Goto 10182
  2736.  Temp9=True
  2737.  Do
  2738.     Graphics.Off=True
  2739.     If TempC=False Then
  2740.        Strng="[A]dd"
  2741.        Call IO.O
  2742.        Strng="[D]elete"
  2743.        Call IO.O
  2744.        If Temp9 Then
  2745.           Strng="[E]dit Objects"
  2746.        Else
  2747.           Strng="[E]dit Treasure"
  2748.        Endif
  2749.        Call IO.O
  2750.        Strng="[L]ist"
  2751.        Call IO.O
  2752.        Graphics.Off=False
  2753.     Endif
  2754.     Strng="Inventory edit option(q to quit)?"
  2755.     Line.Length=TempD
  2756.     No.Input.Out="Q"
  2757.     Call IO.I
  2758.     Select Case Ucase$(Out2)
  2759.     Case "A"
  2760.        If Temp9 Then
  2761.           Call Find.Treasure
  2762.           If Temp5 Then
  2763.              For Temp2=1 To 15
  2764.                 If UserRecord.Inv(Temp2)=False Then
  2765.                    UserRecord.Inv(Temp2)=Temp5
  2766.                    UserRecord.Charges(Temp2)=TreasureRecord.Charges
  2767.                    Temp5=True
  2768.                    Exit For
  2769.                 Endif
  2770.              Next
  2771.           Endif
  2772.           Strng="Treasure not added to inventory."
  2773.           If Temp5=True Then
  2774.              Strng="Treasure added to inventory."
  2775.           Endif
  2776.           Call IO.O
  2777.        Else
  2778.           Call Find.Object
  2779.           If Temp Then
  2780.              For Temp2=1 To 5
  2781.                 If UserRecord.Object(Temp2)=False Then
  2782.                    UserRecord.Object(Temp2)=Temp
  2783.                    UserRecord.ObjCharges(Temp2)=False
  2784.                    Temp=True
  2785.                    Exit For
  2786.                 Endif
  2787.              Next
  2788.           Endif
  2789.           Strng="Object not added to inventory."
  2790.           If Temp=True Then
  2791.              Strng="Object added to inventory."
  2792.           Endif
  2793.           Call IO.O
  2794.        Endif
  2795.     Case "D"
  2796.        If Temp9 Then
  2797.           Strng="Number to delete?"
  2798.           No.Input.Out="1"
  2799.           Call IO.I
  2800.           Temp=Int(Val(Out2))
  2801.           If Temp>False And Temp<=15 Then
  2802.              If UserRecord.Inv(Temp)>False Then
  2803.                 For Temp5=Temp To 14
  2804.                    UserRecord.Inv(Temp5)=UserRecord.Inv(Temp5+1)
  2805.                    UserRecord.Charges(Temp5)=UserRecord.Charges(Temp5+1)
  2806.                 Next
  2807.                 Temp=True
  2808.                 UserRecord.Inv(15)=False
  2809.                 UserRecord.Charges(15)=False
  2810.              Endif
  2811.           Endif
  2812.           Strng="Treasure not deleted from inventory."
  2813.           If Temp=True Then
  2814.              Strng="Treasure deleted from inventory"
  2815.           Endif
  2816.           Call IO.O
  2817.        Else
  2818.           Strng="Number to delete?"
  2819.           No.Input.Out="1"
  2820.           Call IO.I
  2821.           Temp=Int(Val(Out2))
  2822.           If Temp>False And Temp<=5 Then
  2823.              If UserRecord.Object(Temp)>False Then
  2824.                 For Temp5=Temp To 4
  2825.                    UserRecord.Object(Temp5)=UserRecord.Object(Temp5+1)
  2826.                    UserRecord.ObjCharges(Temp5)=UserRecord.ObjCharges(Temp5+1)
  2827.                 Next
  2828.                 Temp=True
  2829.                 UserRecord.Object(5)=False
  2830.                 UserRecord.ObjCharges(5)=False
  2831.              Endif
  2832.           Endif
  2833.           Strng="Object not deleted from inventory."
  2834.           If Temp=True Then
  2835.              Strng="Object deleted from inventory"
  2836.           Endif
  2837.           Call IO.O
  2838.        Endif
  2839.     Case "L"
  2840.        If Temp9 Then
  2841.           Graphics.Off=True
  2842.           For Temp5=1 To 15
  2843.              Temp=UserRecord.Inv(Temp5)
  2844.              If Temp<False Then
  2845.                 Temp=Abs(Temp)
  2846.                 UserRecord.Inv(Temp5)=Temp
  2847.              Endif
  2848.              If Temp>False And Temp<=Lof(8)/Len(TreasureRecord) Then
  2849.                 Get 8,Temp,TreasureRecord
  2850.                 Out3=TreasureRecord.TreasureName
  2851.                 Out3=Lcase$(Out3)
  2852.                 Strng=Mid$(Str$(Temp5),2)+"."+Out3
  2853.                 Call IO.O
  2854.              Endif
  2855.           Next
  2856.        Else
  2857.           Graphics.Off=True
  2858.           For Temp5=1 To 5
  2859.              Temp=UserRecord.Object(Temp5)
  2860.              If Temp<False Then
  2861.                 UserRecord.Object(Temp5)=False
  2862.                 UserRecord.ObjCharges(Temp5)=False
  2863.              Else
  2864.                 If Temp>False And Temp<=Lof(6)/Len(ObjectRecord) Then
  2865.                    Get 6,Temp,ObjectRecord
  2866.                    Out3=ObjectRecord.ObjectName
  2867.                    Out3=Lcase$(Out3)
  2868.                    Strng=Mid$(Str$(Temp5),2)+"."+Out3
  2869.                    Call IO.O
  2870.                 Endif
  2871.              Endif
  2872.           Next
  2873.        Endif
  2874.     Case "E"
  2875.        Temp9=Not Temp9
  2876.        If Temp9 Then
  2877.           Strng="Now editing treasure."
  2878.        Else
  2879.           Strng="Now editing objects."
  2880.        Endif
  2881.        Call IO.O
  2882.     Case "Q"
  2883.        Exit Do
  2884.     End Select
  2885.  Loop
  2886. 10181
  2887.  Exit Sub
  2888. 10182
  2889.  Resume 10181
  2890. End Sub
  2891.  
  2892. Sub Edit.Room
  2893.  On Local Error Goto 10192
  2894.  If Lof(5)=False Then
  2895.     Call Add.Room
  2896.  Endif
  2897.  Do
  2898.     Graphics.Off=True
  2899.     If TempC=False Then
  2900.        Strng="[A]dd room"
  2901.        Call IO.O
  2902.        Strng="[D]escription edit"
  2903.        Call IO.O
  2904.        Strng="[M]onster class"
  2905.        Call IO.O
  2906.        Strng="[O]bject edit"
  2907.        Call IO.O
  2908.        Strng="[R]oom link"
  2909.        Call IO.O
  2910.        Strng="[T]reasure edit"
  2911.        Call IO.O
  2912.        Graphics.Off=False
  2913.     Endif
  2914.     Strng="Room edit option(q to quit)?"
  2915.     Line.Length=TempD
  2916.     No.Input.Out="Q"
  2917.     Call IO.I
  2918.     Select Case Ucase$(Out2)
  2919.     Case "A"
  2920.        Call Add.Room
  2921.     Case "D"
  2922.        Call Edit.Description
  2923.     Case "M"
  2924.        Call Edit.Room.MonsterClass
  2925.     Case "R"
  2926.        Call Edit.Room.Links
  2927.     Case "O"
  2928.        Call Edit.Room.Object
  2929.     Case "T"
  2930.        Call Edit.Room.Treasure
  2931.     Case "Q"
  2932.        Exit Do
  2933.     End Select
  2934.  Loop
  2935. 10191
  2936.  Exit Sub
  2937. 10192
  2938.  Resume 10191
  2939. End Sub
  2940.  
  2941. Sub Add.Room
  2942.  On Local Error Goto 10202
  2943.  Temp4=Lof(5)/Len(RoomRecord)+1
  2944.  RoomRecord.ShortDesc=Nul
  2945.  RoomRecord.Restrictions=False
  2946.  RoomRecord.MonsterClass=False
  2947.  RoomRecord.SpellTrigger=False
  2948.  RoomRecord.MonsterTrigger=False
  2949.  RoomRecord.HealthRate=False
  2950.  RoomRecord.EncounterRate=False
  2951.  RoomRecord.HitPoints=False
  2952.  RoomRecord.Inventory=False
  2953.  RoomRecord.MonsterTalk=False
  2954.  RoomRecord.Fumble=False
  2955.  RoomRecord.Level=False
  2956.  RoomRecord.Teleport=False
  2957.  RoomRecord.RustRate=False
  2958.  RoomRecord.StealRate=False
  2959.  For Temp6=1 To 4
  2960.     RoomRecord.LongDesc(Temp6)=Nul
  2961.  Next
  2962.  For Temp6=1 To 11
  2963.     RoomRecord.Direct(Temp6)=False
  2964.  Next
  2965.  For Temp6=1 To 10
  2966.     RoomRecord.Object(Temp6)=False
  2967.     RoomRecord.ObjCharges(Temp6)=False
  2968.     RoomRecord.Treasure(Temp6)=False
  2969.     RoomRecord.TreCharges(Temp6)=False
  2970.     RoomRecord.Flags(Temp6)=False
  2971.  Next
  2972.  Put 5,Temp4,RoomRecord
  2973.  Call Edit.Description
  2974.  Call Edit.Room.MonsterClass
  2975. 10201
  2976.  Exit Sub
  2977. 10202
  2978.  Resume 10201
  2979. End Sub
  2980.  
  2981. Sub Edit.Description
  2982.  On Local Error Goto 10212
  2983.  Do
  2984.     Graphics.Off=True
  2985.     If TempC=False Then
  2986.        Strng="[E]dit description"
  2987.        Call IO.O
  2988.        Strng="[L]ist description"
  2989.        Call IO.O
  2990.        Strng="[S]earch description"
  2991.        Call IO.O
  2992.        Graphics.Off=False
  2993.     Endif
  2994.     Strng="Room description edit option(q to quit)?"
  2995.     Line.Length=TempD
  2996.     No.Input.Out="Q"
  2997.     Call IO.I
  2998.     Select Case Ucase$(Out2)
  2999.     Case "E"
  3000.        Call Modify.Description
  3001.     Case "L"
  3002.        Call List.Room
  3003.     Case "S"
  3004.        Call Search.Description
  3005.     Case "Q"
  3006.        Exit Do
  3007.     End Select
  3008.  Loop
  3009. 10211
  3010.  Exit Sub
  3011. 10212
  3012.  Resume 10211
  3013. End Sub
  3014.  
  3015. Sub Modify.Description
  3016.  On Local Error Goto 10222
  3017.  Temp3=Lof(5)/Len(RoomRecord)
  3018.  Strng="Room number(1-"+Mid$(Str$(Temp3),2)+")?"
  3019.  No.Input.Out="1"
  3020.  Call IO.I
  3021.  Temp2=Int(Val(Out2))
  3022.  If Temp2<1 Or Temp2>Temp3 Then
  3023.     Strng=Range$
  3024.     Call IO.O
  3025.     Exit Sub
  3026.  Endif
  3027.  Graphics.Off=True
  3028.  Get 5,Temp2,RoomRecord
  3029.  Strng="Short description:"
  3030.  Call IO.O
  3031.  Strng=Rtrim$(RoomRecord.ShortDesc)
  3032.  Call IO.O
  3033.  Strng="Enter new short description:"
  3034.  Call IO.O
  3035.  Strng="Press "+Enter$+" to leave unchanged."
  3036.  Call IO.O
  3037.  Strng="?"
  3038.  Call IO.I
  3039.  If No.Input=False Then
  3040.     RoomRecord.ShortDesc=Out2
  3041.  Endif
  3042.  Put 5,Temp2,RoomRecord
  3043.  Strng="Edit long description(y/n)?"
  3044.  Line.Length=TempD
  3045.  No.Input.Out="Y"
  3046.  Call IO.I
  3047.  If Yes Then
  3048.     Strng="Enter four lines for new description:"
  3049.     Call IO.O
  3050.     Strng="Press "+Enter$+" when done."
  3051.     Call IO.O
  3052.     For Temp3=1 To 4
  3053.        RoomRecord.LongDesc(Temp3)=Nul
  3054.     Next
  3055.     Word.Wrap=True
  3056.     For Temp3=1 To 4
  3057.        Strng="?"
  3058.        If Temp3=4 Then
  3059.           Word.Wrap=False
  3060.        Endif
  3061.        Call IO.I
  3062.        If No.Input Then
  3063.           Exit For
  3064.        Endif
  3065.        RoomRecord.LongDesc(Temp3)=Out2
  3066.     Next
  3067.     Word.Wrap=False
  3068.     Put 5,Temp2,RoomRecord
  3069.  Endif
  3070. 10221
  3071.  Exit Sub
  3072. 10222
  3073.  Resume 10221
  3074. End Sub
  3075.  
  3076. Sub List.Room
  3077.  On Local Error Goto 10232
  3078.  Strng="Enter range:"
  3079.  Call IO.O
  3080.  Temp3=Lof(5)/Len(RoomRecord)
  3081.  Temp$=Mid$(Str$(Temp3),2)
  3082.  Strng="From(1-"+Temp$+")?"
  3083.  No.Input.Out="1"
  3084.  Call IO.I
  3085.  Temp=Int(Val(Out2))
  3086.  If Temp<1 Then
  3087.     Strng=Range$
  3088.     Call IO.O
  3089.     Exit Sub
  3090.  Endif
  3091.  Strng="To("+Mid$(Str$(Temp),2)+"-"+Temp$+")?"
  3092.  No.Input.Out=Temp$
  3093.  Call IO.I
  3094.  Temp2=Int(Val(Out2))
  3095.  If Temp2<Temp Then
  3096.     Strng=Range$
  3097.     Call IO.O
  3098.     Exit Sub
  3099.  Endif
  3100.  If Temp2>Temp3 Then
  3101.     Temp2=Temp3
  3102.  Endif
  3103.  For Temp5=Temp To Temp2
  3104.     Get 5,Temp5,RoomRecord
  3105.     Call Display.Room
  3106.     Call More.Prompt
  3107.     If No Then
  3108.        Exit For
  3109.     Endif
  3110.  Next
  3111. 10231
  3112.  Exit Sub
  3113. 10232
  3114.  Resume 10231
  3115. End Sub
  3116.  
  3117. Sub Display.Room
  3118.  On Local Error Goto 10242
  3119.  If TempC Then
  3120.     Exit Sub
  3121.  Endif
  3122.  Graphics.Off=True
  3123.  Strng="Room number"+Str$(Temp5)+":"
  3124.  Call IO.O
  3125.  Strng="Short description:"
  3126.  Call IO.O
  3127.  Strng=Rtrim$(RoomRecord.ShortDesc)
  3128.  Call IO.O
  3129.  Strng="Long description:"
  3130.  Call IO.O
  3131.  For Temp3=1 To 4
  3132.     Strng=RoomRecord.LongDesc(Temp3)
  3133.     Strng=Rtrim$(Strng)
  3134.     If Len(Strng) Then
  3135.        Call IO.O
  3136.     Endif
  3137.  Next
  3138. 10241
  3139.  Exit Sub
  3140. 10242
  3141.  Resume 10241
  3142. End Sub
  3143.  
  3144. Sub Edit.Room.MonsterClass
  3145.  On Local Error Goto 10252
  3146.  Temp3=Lof(5)/Len(RoomRecord)
  3147.  Strng="Room number(1-"+Mid$(Str$(Temp3),2)+")?"
  3148.  No.Input.Out="1"
  3149.  Call IO.I
  3150.  Temp=Int(Val(Out2))
  3151.  If Temp<1 Or Temp>Temp3 Then
  3152.     Strng="Out of range"
  3153.     Call IO.O
  3154.     Exit Sub
  3155.  Endif
  3156.  Temp3=Lof(10)/Len(MonclassRecord)
  3157.  Strng="Monster class(1-"+Mid$(Str$(Temp3),2)+")?"
  3158.  No.Input.Out="1"
  3159.  Call IO.I
  3160.  Temp2=Int(Val(Out2))
  3161.  If Temp2<1 Or Temp2>Temp3 Then
  3162.     Strng=Range$
  3163.     Call IO.O
  3164.     Exit Sub
  3165.  Endif
  3166.  Get 5,Temp,RoomRecord
  3167.  RoomRecord.MonsterClass=Temp2
  3168.  Put 5,Temp,RoomRecord
  3169.  Strng="Monster class in room number"+Str$(Temp)+" changed."
  3170.  Call IO.O
  3171. 10251
  3172.  Exit Sub
  3173. 10252
  3174.  Resume 10251
  3175. End Sub
  3176.  
  3177. Sub Edit.Room.Links
  3178.  On Local Error Goto 10262
  3179.  Do
  3180.     Graphics.Off=True
  3181.     If TempC=False Then
  3182.        Strng="[A]dd link"
  3183.        Call IO.O
  3184.        Strng="[R]emove link"
  3185.        Call IO.O
  3186.        Strng="[L]ist links"
  3187.        Call IO.O
  3188.        Strng="[S]earch links"
  3189.        Call IO.O
  3190.        Graphics.Off=False
  3191.     Endif
  3192.     Strng="Room link edit option(q to quit)?"
  3193.     Line.Length=TempD
  3194.     No.Input.Out="Q"
  3195.     Call IO.I
  3196.     Select Case Ucase$(Out2)
  3197.     Case "A"
  3198.        Call Change.Link(True)
  3199.     Case "R"
  3200.        Call Change.Link(False)
  3201.     Case "L"
  3202.        Call List.Links
  3203.     Case "S"
  3204.        Call Search.Links
  3205.     Case "Q"
  3206.        Exit Do
  3207.     End Select
  3208.  Loop
  3209. 10261
  3210.  Exit Sub
  3211. 10262
  3212.  Resume 10261
  3213. End Sub
  3214.  
  3215. Sub Change.Link(TempX)
  3216.  On Local Error Goto 10272
  3217.  Strng="Room number to link?"
  3218.  Call IO.I
  3219.  Temp2=Int(Val(Out2))
  3220.  If Temp2<1 Or Temp2>Lof(5)/Len(RoomRecord) Then
  3221.     Strng=Range$
  3222.     Call IO.O
  3223.     Exit Sub
  3224.  Endif
  3225.  Strng="Direction:"
  3226.  Call IO.O
  3227.  Strng="N, E, S, W, O, U, D, NE, SE, SW, NW."
  3228.  Call IO.O
  3229.  Strng="Which direction?"
  3230.  Call IO.I
  3231.  Select Case Ucase$(Out2)
  3232.  Case "N"
  3233.     Temp7=1
  3234.  Case "E"
  3235.     Temp7=2
  3236.  Case "S"
  3237.     Temp7=3
  3238.  Case "W"
  3239.     Temp7=4
  3240.  Case "O"
  3241.     Temp7=5
  3242.  Case "U"
  3243.     Temp7=6
  3244.  Case "D"
  3245.     Temp7=7
  3246.  Case "NE"
  3247.     Temp7=8
  3248.  Case "SE"
  3249.     Temp7=9
  3250.  Case "SW"
  3251.     Temp7=10
  3252.  Case "NW"
  3253.     Temp7=11
  3254.  Case Else
  3255.     Temp7=False
  3256.  End Select
  3257.  If Temp7=False Then
  3258.     Strng=Range$
  3259.     Call IO.O
  3260.     Exit Sub
  3261.  Endif
  3262.  If TempX=False Then
  3263.     Get 5,Temp2,RoomRecord
  3264.     RoomRecord.Direct(Temp7)=False
  3265.     Put 5,Temp2,RoomRecord
  3266.     Strng="Link removed."
  3267.     Call IO.O
  3268.     Exit Sub
  3269.  Endif
  3270.  Strng="Link to which room number?"
  3271.  Call IO.I
  3272.  Temp=Int(Val(Out2))
  3273.  If Temp<1 Or Temp>Lof(5)/Len(RoomRecord) Then
  3274.     Strng=Range$
  3275.     Call IO.O
  3276.     Exit Sub
  3277.  Endif
  3278.  Get 5,Temp2,RoomRecord
  3279.  RoomRecord.Direct(Temp7)=Temp
  3280.  Put 5,Temp2,RoomRecord
  3281.  Strng="Room"+Str$(Temp2)+" linked to"+Str$(Temp)+"."
  3282.  Call IO.O
  3283.  If Temp7=5 Then
  3284.     Exit Sub
  3285.  Endif
  3286.  Strng="Link back to room"+Str$(Temp2)+"(y/n)?"
  3287.  No.Input.Out="N"
  3288.  Call IO.I
  3289.  If Yes=False Then
  3290.     Exit Sub
  3291.  Endif
  3292.  Select Case Temp7
  3293.  Case 1
  3294.     Temp8=3
  3295.  Case 2
  3296.     Temp8=4
  3297.  Case 3
  3298.     Temp8=1
  3299.  Case 4
  3300.     Temp8=2
  3301.  Case 6
  3302.     Temp8=7
  3303.  Case 7
  3304.     Temp8=6
  3305.  Case 8
  3306.     Temp8=10
  3307.  Case 9
  3308.     Temp8=11
  3309.  Case 10
  3310.     Temp8=8
  3311.  Case 11
  3312.     Temp8=9
  3313.  End Select
  3314.  Get 5,Temp,RoomRecord
  3315.  RoomRecord.Direct(Temp8)=Temp2
  3316.  Put 5,Temp,RoomRecord
  3317.  Strng="Room"+Str$(Temp)+" linked back to"+Str$(Temp2)+"."
  3318.  Call IO.O
  3319. 10271
  3320.  Exit Sub
  3321. 10272
  3322.  Resume 10271
  3323. End Sub
  3324.  
  3325. Sub List.Links
  3326.  On Local Error Goto 10282
  3327.  Strng="Range of room numbers."
  3328.  Call IO.O
  3329.  Temp3=Lof(5)/Len(RoomRecord)
  3330.  Temp$=Mid$(Str$(Temp3),2)
  3331.  Strng="From(1-"+Temp$+")?"
  3332.  No.Input.Out="1"
  3333.  Call IO.I
  3334.  Temp=Int(Val(Out2))
  3335.  If Temp<1 Or Temp>Temp3 Then
  3336.     Strng=Range$
  3337.     Call IO.O
  3338.     Exit Sub
  3339.  Endif
  3340.  Strng="To("+Mid$(Str$(Temp),2)+"-"+Temp$+")?"
  3341.  No.Input.Out=Temp$
  3342.  Call IO.I
  3343.  Temp2=Int(Val(Out2))
  3344.  If Temp2<Temp Then
  3345.     Strng=Range$
  3346.     Call IO.O
  3347.     Exit Sub
  3348.  Endif
  3349.  If Temp2>Temp3 Then
  3350.     Temp2=Temp3
  3351.  Endif
  3352.  Temp6=False
  3353.  For Temp5=Temp To Temp2
  3354.     Get 5,Temp5,RoomRecord
  3355.     Graphics.Off=True
  3356.     Strng="Room number"+Str$(Temp5)+":"
  3357.     Call IO.O
  3358.     For Temp3=1 To 7
  3359.        Out2=Mid$("NESWOUD",Temp3,1)+_
  3360.        Str$(RoomRecord.Direct(Temp3))
  3361.        Strng=Strng+Out2+Space$(10-Len(Out2))
  3362.     Next
  3363.     Call IO.O
  3364.     For Temp3=8 To 11
  3365.        Out2=Mid$("NESESWNW",(Temp3-8)*2+1,2)+_
  3366.        Str$(RoomRecord.Direct(Temp3))
  3367.        Strng=Strng+Out2+Space$(10-Len(Out2))
  3368.     Next
  3369.     Call IO.O
  3370.     Temp6=Temp6+3
  3371.     If Temp6>=22 Then
  3372.        Temp6=False
  3373.        Call More.Prompt
  3374.        If No Then
  3375.           Exit For
  3376.        Endif
  3377.     Endif
  3378.  Next
  3379.  If Temp6 Then
  3380.     Call More.Prompt
  3381.  Endif
  3382. 10281
  3383.  Exit Sub
  3384. 10282
  3385.  Resume 10281
  3386. End Sub
  3387.  
  3388. Sub Search.Links
  3389.  On Local Error Goto 10292
  3390.  Do
  3391.     Temp1=False
  3392.     Temp2=False
  3393.     Do
  3394.        Graphics.Off=True
  3395.        If TempC=False Then
  3396.           Strng="[A]room link"
  3397.           If Temp1 Then
  3398.              Strng=Strng+Space$(30-Len(Strng))
  3399.              Strng=Strng+"("+Mid$(Str$(Temp1),2)+")"
  3400.           Endif
  3401.           Call IO.O
  3402.           Strng="[B]room link and back"
  3403.           If Temp2 Then
  3404.              Strng=Strng+Space$(30-Len(Strng))
  3405.              Strng=Strng+"("+Mid$(Str$(Temp2),2)+")"
  3406.           Endif
  3407.           Call IO.O
  3408.           Graphics.Off=False
  3409.        Endif
  3410.        Strng="Room link search option(s to search, q to quit)?"
  3411.        Line.Length=TempD
  3412.        No.Input.Out="Q"
  3413.        Call IO.I
  3414.        Temp3=Lof(5)/Len(RoomRecord)
  3415.        Temp$=Mid$(Str$(Temp3),2)
  3416.        Select Case Ucase$(Out2)
  3417.        Case "A"
  3418.           Strng="Room link number(1-"+Temp$+")?"
  3419.           No.Input.Out="1"
  3420.           Call IO.I
  3421.           Temp1=Int(Val(Out2))
  3422.           If Temp1<1 Or Temp1>Temp3 Then
  3423.              Strng=Range$
  3424.              Call IO.O
  3425.              Temp1=False
  3426.           Endif
  3427.        Case "B"
  3428.           Strng="Room link number(1-"+Temp$+")?"
  3429.           No.Input.Out="1"
  3430.           Call IO.I
  3431.           Temp2=Int(Val(Out2))
  3432.           If Temp2<1 Or Temp2>Temp3 Then
  3433.              Strng=Range$
  3434.              Call IO.O
  3435.              Temp2=False
  3436.           Endif
  3437.        Case "S"
  3438.           Strng="Enter range:"
  3439.           Call IO.O
  3440.           Temp5=Lof(5)/Len(RoomRecord)
  3441.           Temp$=Mid$(Str$(Temp5),2)
  3442.           Strng="From(1-"+Temp$+")?"
  3443.           No.Input.Out="1"
  3444.           Call IO.I
  3445.           Temp=Int(Val(Out2))
  3446.           If Temp<1 Or Temp>Temp5 Then
  3447.              Strng=Range$
  3448.              Call IO.O
  3449.              Exit Do
  3450.           Endif
  3451.           Strng="To("+Mid$(Str$(Temp),2)+"-"+Temp$+")?"
  3452.           No.Input.Out=Temp$
  3453.           Call IO.I
  3454.           Temp3=Int(Val(Out2))
  3455.           If Temp3<Temp Then
  3456.              Strng=Range$
  3457.              Call IO.O
  3458.              Exit Do
  3459.           Endif
  3460.           If Temp4>Temp5 Then
  3461.              Temp4=Temp5
  3462.           Endif
  3463.           For Temp5=Temp To Temp3
  3464.              Get 5,Temp5,RoomRecord
  3465.              For Temp4=1 To 11
  3466.                 TempX=False
  3467.                 If Temp1 Then
  3468.                    If RoomRecord.Direct(Temp4)=Temp1 Then
  3469.                       TempX=True
  3470.                    Endif
  3471.                 Endif
  3472.                 If Temp2 Then
  3473.                    If RoomRecord.Direct(Temp4)=Temp2 Then
  3474.                       If Temp4=1 Then
  3475.                          Temp8=3
  3476.                       Endif
  3477.                       If Temp4=2 Then
  3478.                          Temp8=4
  3479.                       Endif
  3480.                       If Temp4=3 Then
  3481.                          Temp8=1
  3482.                       Endif
  3483.                       If Temp4=4 Then
  3484.                          Temp8=2
  3485.                       Endif
  3486.                       If Temp4=6 Then
  3487.                          Temp8=7
  3488.                       Endif
  3489.                       If Temp4=7 Then
  3490.                          Temp8=6
  3491.                       Endif
  3492.                       If Temp4=8 Then
  3493.                          Temp8=10
  3494.                       Endif
  3495.                       If Temp4=9 Then
  3496.                          Temp8=11
  3497.                       Endif
  3498.                       If Temp4=10 Then
  3499.                          Temp8=8
  3500.                       Endif
  3501.                       If Temp4=11 Then
  3502.                          Temp8=9
  3503.                       Endif
  3504.                       Get 5,Temp2,RoomRecord
  3505.                       If RoomRecord.Direct(Temp8)=Temp5 Then
  3506.                          TempX=True
  3507.                       Endif
  3508.                       Get 5,Temp5,RoomRecord
  3509.                    Endif
  3510.                 Endif
  3511.                 If TempX Then
  3512.                    Graphics.Off=True
  3513.                    Strng="Room number"+Str$(Temp5)+":"
  3514.                    Call IO.O
  3515.                    If Temp4>False And Temp4<8 Then
  3516.                       Strng=Mid$("NESWOUD",Temp4,1)
  3517.                    Endif
  3518.                    If Temp4>7 And Temp4<12 Then
  3519.                       Strng=Mid$("NESESWNW",(Temp4-1)*2+1,2)
  3520.                    Endif
  3521.                    Strng=Strng+Str$(RoomRecord.Direct(Temp4))
  3522.                    Call IO.O
  3523.                    If Temp2 Then
  3524.                       Get 5,Temp2,RoomRecord
  3525.                       Strng="Room number"+Str$(Temp2)+":"
  3526.                       Call IO.O
  3527.                       If Temp8>False And Temp8<8 Then
  3528.                          Strng=Mid$("NESWOUD",Temp4,1)
  3529.                       Endif
  3530.                       If Temp8>7 And Temp8<12 Then
  3531.                          Strng=Mid$("NESESWNW",(Temp8-1)*2+1,2)
  3532.                       Endif
  3533.                       Strng=Strng+Str$(RoomRecord.Direct(Temp8))
  3534.                       Call IO.O
  3535.                       Get 5,Temp5,RoomRecord
  3536.                    Endif
  3537.                    Call More.Prompt
  3538.                    If No Then
  3539.                       Exit Do
  3540.                    Endif
  3541.                 Endif
  3542.              Next
  3543.           Next
  3544.           Exit Do
  3545.        Case "Q"
  3546.           Exit Sub
  3547.        End Select
  3548.     Loop
  3549.  Loop
  3550. 10291
  3551.  Exit Sub
  3552. 10292
  3553.  Resume 10291
  3554. End Sub
  3555.  
  3556. Sub Edit.Room.Object
  3557.  On Local Error Goto 10302
  3558.  Temp5=Lof(5)/Len(RoomRecord)
  3559.  Strng="Room number(1-"+Mid$(Str$(Temp5),2)+")?"
  3560.  No.Input.Out="1"
  3561.  Call IO.I
  3562.  Temp3=Int(Val(Out2))
  3563.  If Temp3<1 Or Temp3>Temp5 Then
  3564.     Strng=Range$
  3565.     Call IO.O
  3566.     Exit Sub
  3567.  Endif
  3568.  Do
  3569.     Graphics.Off=True
  3570.     If TempC=False Then
  3571.        Strng="[A]dd"
  3572.        Call IO.O
  3573.        Strng="[D]elete"
  3574.        Call IO.O
  3575.        Strng="[L]ist"
  3576.        Call IO.O
  3577.        Graphics.Off=False
  3578.     Endif
  3579.     Strng="Room object edit option(q to quit)?"
  3580.     Line.Length=TempD
  3581.     No.Input.Out="Q"
  3582.     Call IO.I
  3583.     Select Case Ucase$(Out2)
  3584.     Case "A"
  3585.        Call Find.Object
  3586.        If Temp Then
  3587.           For Temp2=1 To 10
  3588.              If RoomRecord.Object(Temp2)=False Then
  3589.                 RoomRecord.Object(Temp2)=Temp
  3590.                 RoomRecord.ObjCharges(Temp2)=False
  3591.                 RoomRecord.Flags(Temp2)=False
  3592.                 Put 5,Temp3,RoomRecord
  3593.                 Temp=True
  3594.                 Exit For
  3595.              Endif
  3596.           Next
  3597.        Endif
  3598.        Strng="Object not added to room."
  3599.        If Temp=True Then
  3600.           Strng="Object added to room."
  3601.        Endif
  3602.        Call IO.O
  3603.     Case "D"
  3604.        Strng="Object number to delete?"
  3605.        No.Input.Out="1"
  3606.        Call IO.I
  3607.        Temp=False
  3608.        Temp5=Int(Val(Out2))
  3609.        If Temp5>False And Temp5<=10 Then
  3610.           If RoomRecord.Object(Temp5) Then
  3611.              RoomRecord.Object(Temp5)=False
  3612.              RoomRecord.ObjCharges(Temp5)=False
  3613.              RoomRecord.Flags(Temp5)=False
  3614.              Temp=True
  3615.              Put 5,Temp3,RoomRecord
  3616.           Endif
  3617.        Endif
  3618.        Strng="Object not deleted from room."
  3619.        If Temp=True Then
  3620.           Strng="Object deleted from room."
  3621.        Endif
  3622.        Call IO.O
  3623.     Case "L"
  3624.        Get 5,Temp3,RoomRecord
  3625.        Graphics.Off=True
  3626.        For Temp5=1 To 10
  3627.           Temp2=RoomRecord.Object(Temp5)
  3628.           If Temp2>False And Temp2<=Lof(6)/Len(ObjectRecord) Then
  3629.              Get 6,Temp2,ObjectRecord
  3630.              Strng=Mid$(Str$(Temp5),2)+"."+Rtrim$(ObjectRecord.ObjectName)
  3631.              Call IO.O
  3632.           Endif
  3633.        Next
  3634.     Case "Q"
  3635.        Exit Do
  3636.     End Select
  3637.  Loop
  3638. 10301
  3639.  Exit Sub
  3640. 10302
  3641.  Resume 10301
  3642. End Sub
  3643.  
  3644. Sub Edit.Room.Treasure
  3645.  On Local Error Goto 10312
  3646.  Temp5=Lof(5)/Len(RoomRecord)
  3647.  Strng="Room number(1-"+Mid$(Str$(Temp5),2)+")?"
  3648.  No.Input.Out="1"
  3649.  Call IO.I
  3650.  Temp3=Int(Val(Out2))
  3651.  If Temp3<1 Or Temp3>Temp5 Then
  3652.     Strng="Out of Range"
  3653.     Call IO.O
  3654.     Exit Sub
  3655.  Endif
  3656.  Do
  3657.     Graphics.Off=True
  3658.     If TempC=False Then
  3659.        Strng="[A]dd"
  3660.        Call IO.O
  3661.        Strng="[D]elete"
  3662.        Call IO.O
  3663.        Strng="[L]ist
  3664.        Call IO.O
  3665.        Graphics.Off=False
  3666.     Endif
  3667.     Strng="Room treasure edit option(q to quit)?"
  3668.     Line.Length=TempD
  3669.     No.Input.Out="Q"
  3670.     Call IO.I
  3671.     Select Case Ucase$(Out2)
  3672.     Case "A"
  3673.        Call Find.Treasure
  3674.        If Temp5 Then
  3675.           For Temp2=1 To 10
  3676.              If RoomRecord.Treasure(Temp2)=False Then
  3677.                 RoomRecord.Treasure(Temp2)=Temp5
  3678.                 RoomRecord.TreCharges(Temp2)=TreasureRecord.Charges
  3679.                 RoomRecord.Flags(Temp2)=False
  3680.                 Temp5=True
  3681.                 Put 5,Temp3,RoomRecord
  3682.                 Exit For
  3683.              Endif
  3684.           Next
  3685.        Endif
  3686.        Strng="Treasure not added to room."
  3687.        If Temp5=True Then
  3688.           Strng="Treasure added to room."
  3689.        Endif
  3690.        Call IO.O
  3691.    Case "D"
  3692.        Strng="Treasure number to delete?"
  3693.        No.Input.Out="1"
  3694.        Call IO.I
  3695.        Temp=False
  3696.        Temp5=Int(Val(Out2))
  3697.        If Temp5>False And Temp5<=10 Then
  3698.           If RoomRecord.Treasure(Temp5) Then
  3699.              RoomRecord.Treasure(Temp5)=False
  3700.              RoomRecord.TreCharges(Temp5)=False
  3701.              RoomRecord.Flags(Temp5)=False
  3702.              Temp=True
  3703.              Put 5,Temp3,RoomRecord
  3704.           Endif
  3705.        Endif
  3706.        Strng="Treasure not deleted from room."
  3707.        If Temp=True Then
  3708.           Strng="Treasure deleted from room."
  3709.        Endif
  3710.        Call IO.O
  3711.     Case "L"
  3712.        Get 5,Temp3,RoomRecord
  3713.        Graphics.Off=True
  3714.        For Temp5=1 To 10
  3715.           Temp2=RoomRecord.Treasure(Temp5)
  3716.           If Temp2>False And Temp2<=Lof(8)/Len(TreasureRecord) Then
  3717.              Get 8,Temp2,TreasureRecord
  3718.              Strng=Mid$(Str$(Temp5),2)+"."+Rtrim$(TreasureRecord.TreasureName)
  3719.              Call IO.O
  3720.           Endif
  3721.        Next
  3722.     Case "Q"
  3723.        Exit Do
  3724.     End Select
  3725.  Loop
  3726. 10311
  3727.  Exit Sub
  3728. 10312
  3729.  Resume 10311
  3730. End Sub
  3731.  
  3732. Sub Display.BaseTypes
  3733.  On Local Error Goto 10322
  3734.  If TempC Then
  3735.     Exit Sub
  3736.  Endif
  3737.  Graphics.Off=True
  3738.  Strng="[1]public"
  3739.  Call IO.O
  3740.  Strng="[2]private"
  3741.  Call IO.O
  3742.  Strng="[3]DMs only"
  3743.  Call IO.O
  3744.  Strng="[4]Sysops only"
  3745.  Call IO.O
  3746.  Strng="[5]Town Mayors only"
  3747.  Call IO.O
  3748.  Strng="[6]Governors only"
  3749.  Call IO.O
  3750.  Strng="[7]Guild Masters only"
  3751.  Call IO.O
  3752.  Strng="[8]Clear base types"
  3753.  Call IO.O
  3754.  Graphics.Off=False
  3755. 10321
  3756.  Exit Sub
  3757. 10322
  3758.  Resume 10321
  3759. End Sub
  3760.  
  3761. Sub Edit.Mail
  3762.  On Local Error Goto 10332
  3763.  Redim Temp.ArrayS(1 To 19) As String
  3764.  Do
  3765.     Graphics.Off=True
  3766.     If TempC=False Then
  3767.        Strng="[A]dd message base"
  3768.        Call IO.O
  3769.        Strng="[C]hange message base"
  3770.        Call IO.O
  3771.        Strng="[D]elete message base"
  3772.        Call IO.O
  3773.        Strng="[E]dit messages"
  3774.        Call IO.O
  3775.        Strng="[L]ist message bases"
  3776.        Call IO.O
  3777.        Strng="[S]earch message bases"
  3778.        Call IO.O
  3779.        Graphics.Off=False
  3780.     Endif
  3781.     Strng="Message base edit option(q to quit)?"
  3782.     Line.Length=TempD
  3783.     No.Input.Out="Q"
  3784.     Call IO.I
  3785.     Select Case Ucase$(Out2)
  3786.     Case "A"
  3787.        Call Add.Base
  3788.     Case "C"
  3789.        Call Change.Base
  3790.     Case "D"
  3791.        Call Delete.Base
  3792.     Case "E"
  3793.        Call Edit.Messages
  3794.     Case "L"
  3795.        Call List.Bases
  3796.     Case "S"
  3797.        Call Search.Bases
  3798.     Case "Q"
  3799.        Exit Do
  3800.     End Select
  3801.  Loop
  3802. 10331
  3803.  Exit Sub
  3804. 10332
  3805.  Resume 10331
  3806. End Sub
  3807.  
  3808. Sub Add.Base
  3809.  On Local Error Goto 10342
  3810.  Do
  3811.     Graphics.Off=True
  3812.     Strng="Message base topic name?"
  3813.     No.Input.Out=None$
  3814.     Call IO.I
  3815.     Out3=Ucase$(Out2)
  3816.     Strng="Message base filename(8 letters DOS)?"
  3817.     No.Input.Out=None$
  3818.     Call IO.I
  3819.     Out4=Ucase$(Out2)
  3820.     Temp2=False
  3821.     Do
  3822.        Call Display.BaseTypes
  3823.        Strng="Message base type option(q to quit)?"
  3824.        Line.Length=TempD
  3825.        No.Input.Out="Q"
  3826.        Call IO.I
  3827.        If Ucase$(Out2)="Q" Then
  3828.           Exit Do
  3829.        Endif
  3830.        Select Case Val(Out2)
  3831.        Case 1
  3832.           Temp2=Temp2 Or Public.Base
  3833.        Case 2
  3834.           Temp2=Temp2 Or Private.Base
  3835.        Case 3
  3836.           Temp2=Temp2 Or DM.Base
  3837.        Case 4
  3838.           Temp2=Temp2 Or Sysop.Base
  3839.        Case 5
  3840.           Temp2=Temp2 Or TownMayor.Base
  3841.        Case 6
  3842.           Temp2=Temp2 Or Governor.Base
  3843.        Case 7
  3844.           Temp2=Temp2 Or GuildMaster.Base
  3845.        Case 8
  3846.           Temp2=False
  3847.        End Select
  3848.     Loop
  3849.     Graphics.Off=False
  3850.     Strng="Add to message base file(y/n)?"
  3851.     Line.Length=TempD
  3852.     No.Input.Out="Y"
  3853.     Call IO.I
  3854.     If Yes Then
  3855.        For Temp=1 To Lof(12)/Len(MessageBaseRecord)
  3856.           Get 12,Temp,MessageBaseRecord
  3857.           If Left$(MessageBaseRecord.BaseMessName,9)=Deleted$ Then
  3858.              Exit For
  3859.           Endif
  3860.        Next
  3861.        MessageBaseRecord.BaseMessName=Out3
  3862.        MessageBaseRecord.BaseFileName=Out4
  3863.        MessageBaseRecord.BaseType=Temp2
  3864.        MessageBaseRecord.EmptyBuffer=False
  3865.        Put 12,Temp,MessageBaseRecord
  3866.     Endif
  3867.     Strng="Add another message base(y/n)?"
  3868.     Line.Length=TempD
  3869.     No.Input.Out="Y"
  3870.     Call IO.I
  3871.     If No Then
  3872.        Exit Do
  3873.     Endif
  3874.  Loop
  3875. 10341
  3876.  Exit Sub
  3877. 10342
  3878.  Resume 10341
  3879. End Sub
  3880.  
  3881. Sub Change.Base
  3882.  On Local Error Goto 10352
  3883.  Temp3=Lof(12)/Len(MessageBaseRecord)
  3884.  Strng="Message base number(1-"+Mid$(Str$(Temp3),2)+")?"
  3885.  No.Input.Out="1"
  3886.  Call IO.I
  3887.  Temp5=Int(Val(Out2))
  3888.  If Temp5<1 Or Temp5>Temp3 Then
  3889.     Strng=Range$
  3890.     Call IO.O
  3891.     Exit Sub
  3892.  Endif
  3893.  Get 12,Temp5,MessageBaseRecord
  3894.  Do
  3895.     Graphics.Off=True
  3896.     If TempC=False Then
  3897.        Strng="[C]lasstype"
  3898.        Call IO.O
  3899.        Strng="[F]ilename"
  3900.        Call IO.O
  3901.        Strng="[T]opic"
  3902.        Call IO.O
  3903.        Graphics.Off=False
  3904.     Endif
  3905.     Strng="Message base change option(q to quit)?"
  3906.     Line.Length=TempD
  3907.     No.Input.Out="Q"
  3908.     Call IO.I
  3909.     Select Case Ucase$(Out2)
  3910.     Case "C"
  3911.        Temp2=MessageBaseRecord.BaseType
  3912.        Do
  3913.           Call Display.BaseTypes
  3914.           Strng="Message base type option(q to quit)?"
  3915.           Line.Length=TempD
  3916.           No.Input.Out="Q"
  3917.           Call IO.I
  3918.           If Ucase$(Out2)="Q" Then
  3919.              Exit Do
  3920.           Endif
  3921.           Select Case Val(Out2)
  3922.           Case 1
  3923.              Temp2=Temp2 Or Public.Base
  3924.           Case 2
  3925.              Temp2=Temp2 Or Private.Base
  3926.           Case 3
  3927.              Temp2=Temp2 Or DM.Base
  3928.           Case 4
  3929.              Temp2=Temp2 Or Sysop.Base
  3930.           Case 5
  3931.              Temp2=Temp2 Or TownMayor.Base
  3932.           Case 6
  3933.              Temp2=Temp2 Or Governor.Base
  3934.           Case 7
  3935.              Temp2=Temp2 Or GuildMaster.Base
  3936.           Case 8
  3937.              Temp2=False
  3938.           End Select
  3939.        Loop
  3940.        MessageBaseRecord.BaseType=Temp2
  3941.     Case "F"
  3942.        Strng="Message base filename(8 letters DOS)?"
  3943.        No.Input.Out=None$
  3944.        Call IO.I
  3945.        MessageBaseRecord.BaseFileName=Ucase$(Out2)
  3946.     Case "T"
  3947.        Strng="Message base topic name?"
  3948.        No.Input.Out=None$
  3949.        Call IO.I
  3950.        MessageBaseRecord.BaseMessName=Ucase$(Out2)
  3951.     Case "Q"
  3952.        Exit Do
  3953.     End Select
  3954.  Loop
  3955.  Put 12,Temp5,MessageBaseRecord
  3956.  Strng="Message base number"+Str$(Temp5)+" changed."
  3957.  Call IO.O
  3958. 10351
  3959.  Exit Sub
  3960. 10352
  3961.  Resume 10351
  3962. End Sub
  3963.  
  3964. Sub Delete.Base
  3965.  On Local Error Goto 10362
  3966.  Temp3=Lof(12)/Len(MessageBaseRecord)
  3967.  Strng="Delete base number(1-"+Mid$(Str$(Temp3),2)+")?"
  3968.  No.Input.Out="1"
  3969.  Call IO.I
  3970.  Temp5=Val(Out2)
  3971.  If Temp5<1 Or Temp5>Temp3 Then
  3972.     Strng=Range$
  3973.     Call IO.O
  3974.     Exit Sub
  3975.  Endif
  3976.  Get 12,Temp5,MessageBaseRecord
  3977.  MessageBaseRecord.BaseMessName=Deleted$
  3978.  MessageBaseRecord.BaseFileName=None$
  3979.  MessageBaseRecord.BaseType=False
  3980.  MessageBaseRecord.EmptyBuffer=False
  3981.  Put 12,Temp5,MessageBaseRecord
  3982.  Strng="Message base number"+Str$(Temp5)+" deleted."
  3983.  Call IO.O
  3984. 10361
  3985.  Exit Sub
  3986. 10362
  3987.  Resume 10361
  3988. End Sub
  3989.  
  3990. Sub Edit.Messages
  3991.  On Local Error Goto 10372
  3992.  Temp3=Lof(12)/Len(MessageBaseRecord)
  3993.  Strng="Enter(P for public, R for private) or,"
  3994.  Call IO.O
  3995.  Strng="Edit base number(1-"+Mid$(Str$(Temp3),2)+")?"
  3996.  No.Input.Out="1"
  3997.  Call IO.I
  3998.  Select Case Ucase$(Out2)
  3999.  Case "P"
  4000.     TempA$="public"
  4001.     TempX$=Config3(58)
  4002.  Case "R"
  4003.     TempA$="private"
  4004.     TempX$=Config3(60)
  4005.  Case Else
  4006.     Select Case Val(Out2)
  4007.     Case 1 To Temp3
  4008.        Get 12,Val(Out2),MessageBaseRecord
  4009.        If Left$(MessageBaseRecord.BaseMessName,9)=Deleted$ Then
  4010.           Strng="Deleted message base."
  4011.           Call IO.O
  4012.           Exit Sub
  4013.        Endif
  4014.        TempA$=Rtrim$(MessageBaseRecord.BaseMessName)
  4015.        TempX$=Rtrim$(MessageBaseRecord.BaseFileName)
  4016.     Case Else
  4017.        Strng=Range$
  4018.        Call IO.O
  4019.        Exit Sub
  4020.     End Select
  4021.  End Select
  4022.  Var$="Editing "+Lcase$(TempA$)+" message base."
  4023.  Call Open.Mail
  4024.  Do
  4025.     Strng=Var$
  4026.     Call IO.O
  4027.     Graphics.Off=True
  4028.     If TempC=False Then
  4029.        Strng="[A]dd message"
  4030.        Call IO.O
  4031.        Strng="[C]hange message"
  4032.        Call IO.O
  4033.        Strng="[D]elete message"
  4034.        Call IO.O
  4035.        Strng="[L]ist messages"
  4036.        Call IO.O
  4037.        Strng="[S]earch messages"
  4038.        Call IO.O
  4039.        Strng="[U]ndelete message"
  4040.        Call IO.O
  4041.        Graphics.Off=False
  4042.     Endif
  4043.     Strng="Message edit option(q to quit)?"
  4044.     Line.Length=TempD
  4045.     No.Input.Out="Q"
  4046.     Call IO.I
  4047.     Select Case Ucase$(Out2)
  4048.     Case "A"
  4049.        Call Add.Message
  4050.     Case "C"
  4051.        Call Change.Message
  4052.     Case "D"
  4053.        Call Delete.Message
  4054.     Case "L"
  4055.        Call List.Messages
  4056.     Case "S"
  4057.        Call Search.Messages
  4058.     Case "U"
  4059.        Call Undelete.Message
  4060.     Case "Q"
  4061.        Exit Do
  4062.     End Select
  4063.  Loop
  4064. 10371
  4065.  Exit Sub
  4066. 10372
  4067.  Resume 10371
  4068. End Sub
  4069.  
  4070. Sub Add.Message
  4071.  On Local Error Goto 10382
  4072.  For Temp2=1 To 19
  4073.     Temp.ArrayS(Temp2)=Nul
  4074.  Next
  4075.  Graphics.Off=True
  4076.  Strng="From(press "+Enter$+" for Sysop)?"
  4077.  No.Input.Out="Sysop"
  4078.  Call IO.I
  4079.  Strng3=Out2
  4080.  Strng="To(press "+Enter$+" for All)?"
  4081.  No.Input.Out="All"
  4082.  Call IO.I
  4083.  Message.To=Ucase$(Out2)
  4084.  Strng="Subject?"
  4085.  Call IO.I
  4086.  Subject=Lcase$(Out2)
  4087.  Strng="Stat(press "+Enter$+" for Sysop)?"
  4088.  No.Input.Out="Sysop"
  4089.  Call IO.I
  4090.  Message.Stat=Out2
  4091.  Strng="Enter message. Maximum 19 lines."
  4092.  Call IO.O
  4093.  Message.Length=False
  4094.  Do
  4095.     Strng="Press "+Enter$+" on a blank line to edit."
  4096.     Call IO.O
  4097.     Do
  4098.        Graphics.Off=True
  4099.        If Message.Length=19 Then
  4100.           Strng="Message buffer full."
  4101.           Call IO.O
  4102.           Exit Do
  4103.        Endif
  4104.        Word.Wrap=True
  4105.        Strng="?"
  4106.        Call IO.I
  4107.        If No.Input Then
  4108.           Exit Do
  4109.        Endif
  4110.        Message.Length=Message.Length+1
  4111.        Temp.ArrayS(Message.Length)=Out2
  4112.     Loop
  4113.     Word.Wrap=False
  4114.     Call More.Prompt
  4115.     Call Edit.Message(VarX)
  4116.     If VarX=-1 Then
  4117.        Strng="Continue editing."
  4118.        Call IO.O
  4119.     Endif
  4120.     If VarX=0 Then
  4121.        Exit Do
  4122.     Endif
  4123.     If VarX=1 Then
  4124.        Call Store.Message
  4125.        Exit Do
  4126.     Endif
  4127.  Loop
  4128. 10381
  4129.  Exit Sub
  4130. 10382
  4131.  Resume 10381
  4132. End Sub
  4133.  
  4134. Sub Change.Message
  4135.  On Local Error Goto 10392
  4136.  Do
  4137.     Graphics.Off=False
  4138.     Temp5=Lof(1)/Len(TableRecord)
  4139.     Strng="Message number to edit(1-"+Mid$(Str$(Temp5),2)+")?"
  4140.     No.Input.Out="1"
  4141.     Call IO.I
  4142.     Temp=Int(Val(Out2))
  4143.     If Temp<1 Or Temp>Temp5 Then
  4144.        Strng=Range$
  4145.        Call IO.O
  4146.     Else
  4147.        Get 1,Temp,TableRecord
  4148.        Strng="Edit message header(y/n)?"
  4149.        Line.Length=TempD
  4150.        No.Input.Out="Y"
  4151.        Call IO.I
  4152.        If Yes Then
  4153.           Graphics.Off=True
  4154.           Strng="From: "+TableRecord.MessageFrom
  4155.           Call IO.O
  4156.           Out2=TableRecord.MessageTo
  4157.           Out2=Rtrim$(Out2)
  4158.           If Out2=Nul Then
  4159.              Out2="ALL"
  4160.           Endif
  4161.           Out2=Lcase$(Out2)
  4162.           Mid$(Out2,1,1)=Ucase$(Mid$(Out2,1,1))
  4163.           Strng="To:   "+Out2
  4164.           Call IO.O
  4165.           Strng="Subj: "+TableRecord.MessageSubject
  4166.           Call IO.O
  4167.           Graphics.Off=False
  4168.           Strng="Enter new message header:"
  4169.           Call IO.O
  4170.           Graphics.Off=True
  4171.           Strng="From(press "+Enter$+" for Sysop)?"
  4172.           No.Input.Out="Sysop"
  4173.           Call IO.I
  4174.           Strng3=Out2
  4175.           Strng="To(press "+Enter$+" for All)?"
  4176.           No.Input.Out="All"
  4177.           Call IO.I
  4178.           Message.To=Ucase$(Out2)
  4179.           Strng="Subject?"
  4180.           Call IO.I
  4181.           Subject=Lcase$(Out2)
  4182.           TableRecord.MessageFrom=Strng3
  4183.           TableRecord.MessageTo=Message.To
  4184.           If Subject<>Nul Then
  4185.              TableRecord.MessageSubject=Subject
  4186.           Endif
  4187.           Put 1,Temp,TableRecord
  4188.        Endif
  4189.        Graphics.Off=False
  4190.        Strng="Edit message text(y/n)?"
  4191.        Line.Length=TempD
  4192.        No.Input.Out="Y"
  4193.        Call IO.I
  4194.        If Yes Then
  4195.           Allow.Break=True
  4196.           Graphics.Off=True
  4197.           For Temp2=TableRecord.MessageStart To_
  4198.              TableRecord.MessageStart+TableRecord.MessageLength-1
  4199.              Get 2,Temp2,MessageRecord
  4200.              Strng=MessageRecord.Message
  4201.              VarX=Instr(Strng,Chr$(1))
  4202.              If VarX Then
  4203.                 Strng=Left$(Strng,VarX-1)
  4204.              Endif
  4205.              Strng=Rtrim$(Strng)
  4206.              Call IO.O
  4207.              If Break Then
  4208.                 Exit For
  4209.              Endif
  4210.           Next
  4211.           Allow.Break=False
  4212.           Do
  4213.              Graphics.Off=False
  4214.              Temp5=TableRecord.MessageLength
  4215.              Strng="Line number to edit(1-"+Mid$(Str$(Temp5),2)+",q to quit)?"
  4216.              No.Input.Out="Q"
  4217.              Call IO.I
  4218.              If Ucase$(Out2)="Q" Then
  4219.                 Exit Do
  4220.              Endif
  4221.              Temp2=Int(Val(Out2))
  4222.              If Temp2<1 Or Temp2>Temp5 Then
  4223.                 Strng=Range$
  4224.                 Call IO.O
  4225.              Else
  4226.                 Strng="New message text:"
  4227.                 Call IO.O
  4228.                 Graphics.Off=True
  4229.                 Strng="?"
  4230.                 Call IO.I
  4231.                 MessageRecord.Message=Left$(Out2,79)+Chr$(1)
  4232.                 Put 2,TableRecord.MessageStart+Temp2-1,MessageRecord
  4233.              Endif
  4234.           Loop
  4235.        Endif
  4236.     Endif
  4237.     Graphics.Off=False
  4238.     Strng="Edit another message(y/n)?"
  4239.     Line.Length=TempD
  4240.     No.Input.Out="Y"
  4241.     Call IO.I
  4242.     If No Then
  4243.        Exit Do
  4244.     Endif
  4245.  Loop
  4246. 10391
  4247.  Exit Sub
  4248. 10392
  4249.  Resume 10391
  4250. End Sub
  4251.  
  4252. Sub Delete.Message
  4253.  On Local Error Goto 10402
  4254.  Do
  4255.     Temp3=Lof(1)/Len(TableRecord)
  4256.     Strng="Message number to delete(1-"+Mid$(Str$(Temp3),2)+")?"
  4257.     No.Input.Out="1"
  4258.     Call IO.I
  4259.     Graphics.Off=True
  4260.     Temp=Val(Out2)
  4261.     If Temp<1 Or Temp>Temp3 Then
  4262.        Strng=Range$
  4263.        Call IO.O
  4264.     Else
  4265.        Get 1,Temp,TableRecord
  4266.        If TableRecord.MessageKilled="T" Then
  4267.           Strng="Message"+Str$(Temp)+" is already deleted."
  4268.           Call IO.O
  4269.        Else
  4270.           TableRecord.MessageKilled="T"
  4271.           Put 1,Temp,TableRecord
  4272.           Strng="Message"+Str$(Temp)+" deleted."
  4273.           Call IO.O
  4274.        Endif
  4275.     Endif
  4276.     Graphics.Off=False
  4277.     Strng="Delete more messages(y/n)?"
  4278.     Line.Length=TempD
  4279.     No.Input.Out="Y"
  4280.     Call IO.I
  4281.     If No Then
  4282.        Exit Do
  4283.     Endif
  4284.  Loop
  4285. 10401
  4286.  Exit Sub
  4287. 10402
  4288.  Resume 10401
  4289. End Sub
  4290.  
  4291. Sub List.Messages
  4292.  On Local Error Goto 10412
  4293.  Temp5=Lof(1)/Len(TableRecord)
  4294.  Temp$=Mid$(Str$(Temp5),2)
  4295.  Strng="From(1-"+Temp$+")?"
  4296.  No.Input.Out="1"
  4297.  Call IO.I
  4298.  Temp=Int(Val(Out2))
  4299.  Strng="To("+Mid$(Str$(Temp),2)+"-"+Temp$+")?"
  4300.  No.Input.Out=Temp$
  4301.  Call IO.I
  4302.  Temp1=Int(Val(Out2))
  4303.  If Temp<1 Or Temp>Temp1 Or Temp>Temp5 Then
  4304.     Strng=Range$
  4305.     Call IO.O
  4306.     Exit Sub
  4307.  Endif
  4308.  If Temp1>Temp5 Then
  4309.     Temp1=Temp5
  4310.  Endif
  4311.  Graphics.Off=True
  4312.  For Temp2=Temp To Temp1
  4313.     Get 1,Temp2,TableRecord
  4314.     If TableRecord.MessageKilled="T" Then
  4315.        Strng="Message number"+Str$(Temp2)+" was deleted."
  4316.        Call IO.O
  4317.     Else
  4318.        Graphics.Off=True
  4319.        Strng="Msg#:"+Str$(Temp2)+" of"+Str$(Lof(1)/Len(TableRecord))
  4320.        Call IO.O
  4321.        Strng="From: "+TableRecord.MessageFrom
  4322.        Call IO.O
  4323.        Out2=TableRecord.MessageTo
  4324.        Out2=Rtrim$(Out2)
  4325.        If Out2=Nul Then
  4326.           Out2="ALL"
  4327.        Endif
  4328.        Out2=Lcase$(Out2)
  4329.        Mid$(Out2,1,1)=Ucase$(Mid$(Out2,1,1))
  4330.        Strng="To:   "+Out2
  4331.        Call IO.O
  4332.        Strng="Subj: "+TableRecord.MessageSubject
  4333.        Call IO.O
  4334.        Strng="Time: "+TableRecord.MessageTime
  4335.        Call IO.O
  4336.        Allow.Break=True
  4337.        For Temp5=TableRecord.MessageStart To_
  4338.           TableRecord.MessageStart+TableRecord.MessageLength-1
  4339.           Get 2,Temp5,MessageRecord
  4340.           Strng=MessageRecord.Message
  4341.           VarX=Instr(Strng,Chr$(1))
  4342.           If VarX Then
  4343.              Strng=Left$(Strng,VarX-1)
  4344.           Endif
  4345.           Strng=Rtrim$(Strng)
  4346.           Call IO.O
  4347.           If Break Then
  4348.              Exit For
  4349.           Endif
  4350.        Next
  4351.     Endif
  4352.     Allow.Break=False
  4353.     Call More.Prompt
  4354.     If No Then
  4355.        Exit For
  4356.     Endif
  4357.  Next
  4358. 10411
  4359.  Exit Sub
  4360. 10412
  4361.  Resume 10411
  4362. End Sub
  4363.  
  4364. Sub Search.Messages
  4365.  On Local Error Goto 10422
  4366.  Do
  4367.     TempA$=Nul
  4368.     TempB$=Nul
  4369.     TempC$=Nul
  4370.     TempE$=Nul
  4371.     TempF$=Nul
  4372.     Do
  4373.        Graphics.Off=True
  4374.        If TempC=False Then
  4375.           Strng="[A]from user"
  4376.           If TempA$<>Nul Then
  4377.              Strng=Strng+Space$(30-Len(Strng))
  4378.              Strng=Strng+"("+TempA$+")"
  4379.           Endif
  4380.           Call IO.O
  4381.           Strng="[B]subject header"
  4382.           If TempB$<>Nul Then
  4383.              Strng=Strng+Space$(30-Len(Strng))
  4384.              Strng=Strng+"("+TempB$+")"
  4385.           Endif
  4386.           Call IO.O
  4387.           Strng="[C]date of message"
  4388.           If TempC$<>Nul Then
  4389.              Strng=Strng+Space$(30-Len(Strng))
  4390.              Strng=Strng+"("+TempC$+")"
  4391.           Endif
  4392.           Call IO.O
  4393.           Strng="[D]to user"
  4394.           If TempE$<>Nul Then
  4395.              Strng=Strng+Space$(30-Len(Strng))
  4396.              Strng=Strng+"("+TempE$+")"
  4397.           Endif
  4398.           Call IO.O
  4399.           Strng="[E]message text"
  4400.           If TempF$<>Nul Then
  4401.              Strng=Strng+Space$(30-Len(Strng))
  4402.              Strng=Strng+"("+TempF$+")"
  4403.           Endif
  4404.           Call IO.O
  4405.           Graphics.Off=False
  4406.        Endif
  4407.        Strng="Message search option(s to search, q to quit)?"
  4408.        Line.Length=TempD
  4409.        No.Input.Out="Q"
  4410.        Graphics.Off=False
  4411.        Call IO.I
  4412.        Select Case Ucase$(Out2)
  4413.        Case "A"
  4414.           Strng="Username?"
  4415.           Call IO.I
  4416.           TempA$=Ucase$(Out2)
  4417.        Case "B"
  4418.           Strng="Subject substring?"
  4419.           Call IO.I
  4420.           TempB$=Ucase$(Out2)
  4421.        Case "C"
  4422.           Strng="Search date?"
  4423.           Call IO.I
  4424.           TempC$=Ucase$(Out2)
  4425.        Case "D"
  4426.           Strng="Username?"
  4427.           Call IO.I
  4428.           TempE$=Ucase$(Out2)
  4429.        Case "E"
  4430.           Strng="Message text substring?"
  4431.           Call IO.I
  4432.           TempF$=Ucase$(Out2)
  4433.        Case "S"
  4434.           Strng="Searching messages."
  4435.           Call IO.O
  4436.           For Temp=1 To Lof(1)/Len(TableRecord)
  4437.              Get 1,Temp,TableRecord
  4438.              Temp2=False
  4439.              If TempA$<>Nul Then
  4440.                 If Instr(Ucase$(TableRecord.MessageFrom),TempA$) Then
  4441.                    Temp2=True
  4442.                 Endif
  4443.              Endif
  4444.              If TempB$<>Nul Then
  4445.                 If Instr(Ucase$(TableRecord.MessageSubject),TempB$) Then
  4446.                    Temp2=True
  4447.                 Endif
  4448.              Endif
  4449.              If TempC$<>Nul Then
  4450.                 If Int(DateValue#(TableRecord.MessageTime))=_
  4451.                 Int(DateValue#(TempC$)) Then
  4452.                    Temp2=True
  4453.                 Endif
  4454.              Endif
  4455.              If TempE$<>Nul Then
  4456.                 If Rtrim$(TableRecord.MessageTo)=Nul Then
  4457.                    If TempE$="ALL" Then
  4458.                       Temp2=True
  4459.                    Endif
  4460.                 Else
  4461.                    If Instr(Ucase$(TableRecord.MessageTo),TempE$) Then
  4462.                       Temp2=True
  4463.                    Endif
  4464.                 Endif
  4465.              Endif
  4466.              If TempF$<>Nul Then
  4467.                 For Temp4=TableRecord.MessageStart+1 To_
  4468.                    TableRecord.MessageStart+TableRecord.MessageLength-1
  4469.                    Get 2,Temp4,MessageRecord
  4470.                    If Instr(Ucase$(MessageRecord.Message),TempF$) Then
  4471.                       Temp2=True
  4472.                       Temp3=Temp4-TableRecord.MessageStart
  4473.                       Exit For
  4474.                    Endif
  4475.                 Next
  4476.              Endif
  4477.              If Temp2 Then
  4478.                 Graphics.Off=True
  4479.                 Strng="From: "+TableRecord.MessageFrom
  4480.                 Call IO.O
  4481.                 Out2=TableRecord.MessageTo
  4482.                 Out2=Rtrim$(Out2)
  4483.                 If Out2=Nul Then
  4484.                    Out2="ALL"
  4485.                 Endif
  4486.                 Out2=Lcase$(Out2)
  4487.                 Mid$(Out2,1,1)=Ucase$(Mid$(Out2,1,1))
  4488.                 Strng="To:   "+Out2
  4489.                 Call IO.O
  4490.                 Strng="Subj: "+TableRecord.MessageSubject
  4491.                 Call IO.O
  4492.                 Strng="Time: "+TableRecord.MessageTime
  4493.                 Call IO.O
  4494.                 Strng="Msg#:"+Str$(Temp)+" of"+Str$(Lof(1)/Len(TableRecord))
  4495.                 Call IO.O
  4496.                 If TempF$<>Nul Then
  4497.                    Strng="Text substring found in line"+Str$(Temp3)+":"
  4498.                    Call IO.O
  4499.                    Strng=MessageRecord.Message
  4500.                    VarX=Instr(Strng,Chr$(1))
  4501.                    If VarX Then
  4502.                       Strng=Left$(Strng,VarX-1)
  4503.                    Endif
  4504.                    Strng=Rtrim$(Strng)
  4505.                    Call IO.O
  4506.                 Endif
  4507.                 Call More.Prompt
  4508.                 If No Then
  4509.                    Exit Do
  4510.                 Endif
  4511.              Endif
  4512.           Next
  4513.           Exit Do
  4514.        Case "Q"
  4515.           Exit Sub
  4516.        End Select
  4517.     Loop
  4518.  Loop
  4519. 10421
  4520.  Exit Sub
  4521. 10422
  4522.  Resume 10421
  4523. End Sub
  4524.  
  4525. Sub Undelete.Message
  4526.  On Local Error Goto 10452
  4527.  Do
  4528.     Temp3=Lof(1)/Len(TableRecord)
  4529.     Strng="Message number to undelete(1-"+Mid$(Str$(Temp3),2)+")?"
  4530.     No.Input.Out="1"
  4531.     Call IO.I
  4532.     Temp=Val(Out2)
  4533.     If Temp<1 Or Temp>Temp3 Then
  4534.        Strng=Range$
  4535.        Call IO.O
  4536.     Else
  4537.        Get 1,Temp,TableRecord
  4538.        If TableRecord.MessageKilled="F" Then
  4539.           Strng="Message"+Str$(Temp)+" is not deleted."
  4540.           Call IO.O
  4541.        Else
  4542.           TableRecord.MessageKilled="F"
  4543.           Put 1,Temp,TableRecord
  4544.           Strng="Message"+Str$(Temp)+" undeleted."
  4545.           Call IO.O
  4546.        Endif
  4547.     Endif
  4548.     Graphics.Off=False
  4549.     Strng="Unelete more messages(y/n)?"
  4550.     Line.Length=TempD
  4551.     No.Input.Out="Y"
  4552.     Call IO.I
  4553.     If No Then
  4554.        Exit Do
  4555.     Endif
  4556.  Loop
  4557. 10451
  4558.  Exit Sub
  4559. 10452
  4560.  Resume 10451
  4561. End Sub
  4562.  
  4563. Sub List.Bases
  4564.  On Local Error Goto 10462
  4565.  Graphics.Off=True
  4566.  Temp1=False
  4567.  For Temp=1 To Lof(12)/Len(MessageBaseRecord)
  4568.     Get 12,Temp,MessageBaseRecord
  4569.     If Left$(MessageBaseRecord.BaseMessName,9)=Deleted$ Then
  4570.        Strng="#"+Mid$(Str$(Temp),2)+": deleted."
  4571.        Call IO.O
  4572.     Else
  4573.        Out2=MessageBaseRecord.BaseMessName
  4574.        Out2=Rtrim$(Out2)
  4575.        Out2=Lcase$(Out2)
  4576.        Strng="#"+Mid$(Str$(Temp),2)+": "+Out2+", Type: "
  4577.        If MessageBaseRecord.BaseType And Public.Base Then
  4578.           Strng=Strng+"(public) "
  4579.        Endif
  4580.        If MessageBaseRecord.BaseType And Private.Base Then
  4581.           Strng=Strng+"(private) "
  4582.        Endif
  4583.        If MessageBaseRecord.BaseType And DM.Base Then
  4584.           Strng=Strng+"(DMs only) "
  4585.        Endif
  4586.        If MessageBaseRecord.BaseType And Sysop.Base Then
  4587.           Strng=Strng+"(Sysops only) "
  4588.        Endif
  4589.        If MessageBaseRecord.BaseType And TownMayor.Base Then
  4590.           Strng=Strng+"(Town Mayor) "
  4591.        Endif
  4592.        If MessageBaseRecord.BaseType And Governor.Base Then
  4593.           Strng=Strng+"(Governor) "
  4594.        Endif
  4595.        If MessageBaseRecord.BaseType And GuildMaster.Base Then
  4596.           Strng=Strng+"(Guild Master) "
  4597.        Endif
  4598.        Strng=Rtrim$(Strng)
  4599.        Call IO.O
  4600.        Temp1=Temp1+1
  4601.        If Temp1>22 Then
  4602.           Temp1=False
  4603.           Call More.Prompt
  4604.           If No Then
  4605.              Exit For
  4606.           Endif
  4607.        Endif
  4608.     Endif
  4609.  Next
  4610.  If Temp1 Then
  4611.     Call More.Prompt
  4612.  Endif
  4613. 10461
  4614.  Exit Sub
  4615. 10462
  4616.  Resume 10461
  4617. End Sub
  4618.  
  4619. Sub Search.Bases
  4620.  On Local Error Goto 10472
  4621.  TempA=False
  4622.  TempA$=Nul
  4623.  TempB$=Nul
  4624.  Do
  4625.     Graphics.Off=True
  4626.     If TempC=False Then
  4627.        Strng="[A]message base name"
  4628.        If TempA$<>Nul Then
  4629.           Strng=Strng+Space$(30-Len(Strng))
  4630.           Strng=Strng+"("+TempA$+")"
  4631.        Endif
  4632.        Call IO.O
  4633.        Strng="[B]message base filename"
  4634.        If TempB$<>Nul Then
  4635.           Strng=Strng+Space$(30-Len(Strng))
  4636.           Strng=Strng+"("+TempB$+")"
  4637.        Endif
  4638.        Call IO.O
  4639.        Strng="[C]message base type"
  4640.        If TempA Then
  4641.           Strng=Strng+Space$(30-Len(Strng))
  4642.           Strng=Strng+"(type:"+Str$(TempA)+")"
  4643.        Endif
  4644.        Call IO.O
  4645.        Graphics.Off=False
  4646.     Endif
  4647.     Strng="Message base search option(s to search, q to quit)?"
  4648.     Line.Length=TempD
  4649.     No.Input.Out="Q"
  4650.     Graphics.Off=False
  4651.     Call IO.I
  4652.     Select Case Ucase$(Out2)
  4653.     Case "A"
  4654.        Strng="Message base name substring?"
  4655.        Call IO.I
  4656.        TempA$=Ucase$(Out2)
  4657.     Case "B"
  4658.        Strng="Message base filename(8 letter DOS)?"
  4659.        Call IO.I
  4660.        TempB$=Ucase$(Out2)
  4661.     Case "C"
  4662.        Do
  4663.           Call Display.BaseTypes
  4664.           Strng="Message base type option(q to quit)?"
  4665.           Line.Length=TempD
  4666.           No.Input.Out="Q"
  4667.           Call IO.I
  4668.           If Ucase$(Out2)="Q" Then
  4669.              Exit Do
  4670.           Endif
  4671.           Temp=Val(Out2)
  4672.           Select Case Temp
  4673.           Case 1
  4674.              TempA=TempA Or Public.Base
  4675.           Case 2
  4676.              TempA=TempA Or Private.Base
  4677.           Case 3
  4678.              TempA=TempA Or DM.Base
  4679.           Case 4
  4680.              TempA=TempA Or Sysop.Base
  4681.           Case 5
  4682.              TempA=TempA Or TownMayor.Base
  4683.           Case 6
  4684.              TempA=TempA Or Governor.Base
  4685.           Case 7
  4686.              TempA=TempA Or GuildMaster.Base
  4687.           Case 8
  4688.              TempA=False
  4689.           End Select
  4690.        Loop
  4691.     Case "S"
  4692.        Strng="Searching message bases."
  4693.        Call IO.O
  4694.        Temp6=False
  4695.        Graphics.Off=True
  4696.        For Temp=1 To Lof(12)/Len(MessageBaseRecord)
  4697.           Get 12,Temp,MessageBaseRecord
  4698.           Temp2=False
  4699.           If TempA$<>Nul Then
  4700.              If Instr(MessageBaseRecord.BaseMessName,TempA$) Then
  4701.                 Temp2=True
  4702.              Endif
  4703.           Endif
  4704.           If TempB$<>Nul Then
  4705.              If Rtrim$(MessageBaseRecord.BaseFileName)=TempB$ Then
  4706.                 Temp2=True
  4707.              Endif
  4708.           Endif
  4709.           If TempA Then
  4710.              If MessageBaseRecord.BaseType=TempA Then
  4711.                 Temp2=True
  4712.              Endif
  4713.           Endif
  4714.           If Temp2 Then
  4715.              Graphics.Off=True
  4716.              Out2=MessageBaseRecord.BaseMessName
  4717.              Out2=Rtrim$(Out2)
  4718.              Out2=Lcase$(Out2)
  4719.              Strng="Message base number"+Str$(Temp)+": "+Out2
  4720.              Call IO.O
  4721.              Temp6=Temp6+1
  4722.              If Temp6>22 Then
  4723.                 Temp6=False
  4724.                 Call More.Prompt
  4725.                 If No Then
  4726.                    Exit Sub
  4727.                 Endif
  4728.              Endif
  4729.           Endif
  4730.        Next
  4731.        If Temp6 Then
  4732.           Call More.Prompt
  4733.        Endif
  4734.        TempA=False
  4735.        TempA$=Nul
  4736.        TempB$=Nul
  4737.     Case "Q"
  4738.        Exit Do
  4739.     End Select
  4740.  Loop
  4741. 10471
  4742.  Exit Sub
  4743. 10472
  4744.  Resume 10471
  4745. End Sub
  4746.  
  4747. Sub Edit.Message(Var)
  4748.  On Local Error Goto 10482
  4749.  Do
  4750.     Graphics.Off=True
  4751.     If TempC=False Then
  4752.        Strng="[A]bort"
  4753.        Call IO.O
  4754.        Strng="[C]ontinue"
  4755.        Call IO.O
  4756.        Strng="[D]elete"
  4757.        Call IO.O
  4758.        Strng="[E]dit"
  4759.        Call IO.O
  4760.        Strng="[I]nsert"
  4761.        Call IO.O
  4762.        Strng="[L]ist"
  4763.        Call IO.O
  4764.        Strng="[R]eplace"
  4765.        Call IO.O
  4766.        Graphics.Off=False
  4767.     Endif
  4768.     Line.Length=TempD
  4769.     No.Input.Out="S"
  4770.     Strng="Message edit option(s to store)?"
  4771.     Call IO.I
  4772.     Select Case Ucase$(Out2)
  4773.     Case "A"
  4774.        Strng="Are you sure(y/n)?"
  4775.        No.Input.Out="N"
  4776.        Call IO.I
  4777.        If Yes Then
  4778.           Var=0
  4779.           Exit Do
  4780.        Endif
  4781.     Case "C"
  4782.        Var=-1
  4783.        Exit Do
  4784.     Case "D"
  4785.        Call Delete.Line
  4786.     Case "E"
  4787.        Call Edit.Line
  4788.     Case "I"
  4789.        Call Insert.Lines
  4790.     Case "L"
  4791.        Call List.Lines
  4792.     Case "R"
  4793.        Call Replace.Line
  4794.     Case "S"
  4795.        Var=1
  4796.        Exit Do
  4797.     End Select
  4798.  Loop
  4799. 10481
  4800.  Exit Sub
  4801. 10482
  4802.  Resume 10481
  4803. End Sub
  4804.  
  4805. Sub List.Lines
  4806.  On Local Error Goto 10484
  4807.  Line.Length=1
  4808.  No.Input.Out="Y"
  4809.  Strng="Display line numbers(y/n)?"
  4810.  Call IO.I
  4811.  If Yes Then
  4812.     TempX=True
  4813.  Else
  4814.     TempX=False
  4815.  Endif
  4816.  Graphics.Off=True
  4817.  For Temp=1 To Message.Length
  4818.     Strng=Nul
  4819.     If TempX Then
  4820.        Strng=Right$(Str$(Temp+10),1)+":"
  4821.     Endif
  4822.     Strng=Strng+Temp.ArrayS(Temp)
  4823.     Strng=Left$(Strng,79)
  4824.     Call IO.O
  4825.  Next
  4826.  Call More.Prompt
  4827. 10483
  4828.  Exit Sub
  4829. 10484
  4830.  Resume 10483
  4831. End Sub
  4832.  
  4833. Sub Replace.Line
  4834.  On Local Error Goto 10492
  4835.  Strng="Line number?"
  4836.  Call IO.I
  4837.  Temp=Int(Val(Out2))
  4838.  If Temp<1 Or Temp>Message.Length Then
  4839.     Strng=Range$
  4840.     Call IO.O
  4841.     Exit Sub
  4842.  Endif
  4843.  Strng="Replacement line:"
  4844.  Call IO.O
  4845.  Strng="?"
  4846.  Call IO.I
  4847.  Temp.ArrayS(Temp)=Out2
  4848.  Strng="Line number"+Str$(Temp)+" replaced."
  4849.  Call IO.O
  4850. 10491
  4851.  Exit Sub
  4852. 10492
  4853.  Resume 10491
  4854. End Sub
  4855.  
  4856. Sub Edit.Line
  4857.  On Local Error Goto 10502
  4858.  Strng="Line number?"
  4859.  Call IO.I
  4860.  Temp=Int(Val(Out2))
  4861.  If Temp<1 Or Temp>Message.Length Then
  4862.     Strng=Range$
  4863.     Call IO.O
  4864.     Exit Sub
  4865.  Endif
  4866.  Strng="Replace what word?"
  4867.  Call IO.I
  4868.  Temp$=Out2
  4869.  Strng="Replace with what word?"
  4870.  Call IO.I
  4871.  Temp2$=Out2
  4872.  If Temp$=Nul Or Temp$=Temp2$ Then
  4873.     Strng="No changes made."
  4874.     Call IO.O
  4875.     Exit Sub
  4876.  Endif
  4877.  Temp2=False
  4878.  Temp1=Instr(Temp.ArrayS(Temp),Temp$)
  4879.  Do While Temp1
  4880.     If Temp2=1 Then
  4881.        Strng="Replace all words?"
  4882.        Call IO.I
  4883.        If No Then
  4884.           Exit Do
  4885.        Endif
  4886.     Endif
  4887.     Temp.ArrayS(Temp)=Left$(Temp.ArrayS(Temp),Temp1-1)+_
  4888.     Temp2$+Mid$(Temp.ArrayS(Temp),Temp1+Len(Temp$))
  4889.     Temp.ArrayS(Temp)=Left$(Temp.ArrayS(Temp),80)
  4890.     Temp2=Temp2+1
  4891.     Temp1=Instr(Temp.ArrayS(Temp),Temp$)
  4892.  Loop
  4893.  Strng="No changes made."
  4894.  If Temp2 Then
  4895.     Strng="Changed"+Str$(Temp2)+" words."
  4896.  Endif
  4897.  Call IO.O
  4898. 10501
  4899.  Exit Sub
  4900. 10502
  4901.  Resume 10501
  4902. End Sub
  4903.  
  4904. Sub Delete.Line
  4905.  On Local Error Goto 10512
  4906.  Strng="From line number(1-"+Mid$(Str$(Message.Length),2)+")?"
  4907.  Call IO.I
  4908.  Temp=Int(Val(Out2))
  4909.  If Temp<1 Or Temp>Message.Length Then
  4910.     Strng=Range$
  4911.     Call IO.O
  4912.     Exit Sub
  4913.  Endif
  4914.  Strng="To line number("+Mid$(Str$(Temp),2)+"-"+_
  4915.  Mid$(Str$(Message.Length),2)+")?"
  4916.  Call IO.I
  4917.  Temp2=Int(Val(Out2))
  4918.  If Temp2<Temp Or Temp2>Message.Length Then
  4919.     Strng=Range$
  4920.     Call IO.O
  4921.     Exit Sub
  4922.  Endif
  4923.  For Temp3=1 To Temp2-Temp+1
  4924.     Message.Length=Message.Length-1
  4925.     For Temp1=Temp To Message.Length
  4926.        Temp.ArrayS(Temp1)=Temp.ArrayS(Temp1+1)
  4927.     Next
  4928.  Next
  4929.  If Message.Length=False Then
  4930.     Strng="No message left."
  4931.     Call IO.O
  4932.     Exit Sub
  4933.  Endif
  4934.  Strng="Line numbers"+Str$(Temp)+" to"+Str$(Temp2)+" deleted."
  4935.  Call IO.O
  4936. 10511
  4937.  Exit Sub
  4938. 10512
  4939.  Resume 10511
  4940. End Sub
  4941.  
  4942. Sub Insert.Lines
  4943.  On Local Error Goto 10522
  4944.  If Message.Length>18 Then
  4945.     Strng="Message buffer full."
  4946.     Call IO.O
  4947.     Exit Sub
  4948.  Endif
  4949.  Strng="Before line number?"
  4950.  Call IO.I
  4951.  Temp=Int(Val(Out2))
  4952.  If Temp<1 Or Temp>Message.Length Then
  4953.     Strng=Range$
  4954.     Call IO.O
  4955.     Exit Sub
  4956.  Endif
  4957.  Graphics.Off=True
  4958.  Do While Message.Length<19
  4959.     Word.Wrap=True
  4960.     Strng="?"
  4961.     Call IO.I
  4962.     Word.Wrap=False
  4963.     If No.Input Then
  4964.        Exit Do
  4965.     Endif
  4966.     For Temp1=Message.Length To Temp Step -1
  4967.        Temp.ArrayS(Temp1+1)=Temp.ArrayS(Temp1)
  4968.     Next
  4969.     Temp.ArrayS(Temp)=Out2
  4970.     Temp=Temp+1
  4971.     Message.Length=Message.Length+1
  4972.  Loop
  4973.  Graphics.Off=False
  4974.  If Message.Length=19 Then
  4975.     Strng="Message buffer full."
  4976.     Call IO.O
  4977.  Endif
  4978.  Call More.Prompt
  4979. 10521
  4980.  Exit Sub
  4981. 10522
  4982.  Resume 10521
  4983. End Sub
  4984.  
  4985. Sub Store.Message
  4986.  On Local Error Goto 10532
  4987.  Strng="Storing message.."
  4988.  Call IO.O
  4989.  TableRecord.MessageTime=FNclock$
  4990.  TableRecord.MessageFrom=Strng3
  4991.  TableRecord.MessageKilled="F"
  4992.  TableRecord.MessageTo=Message.To
  4993.  TableRecord.MessageSubject=Subject
  4994.  TableRecord.MessageLength=Message.Length+1
  4995.  TableRecord.MessageStart=Lof(2)/Len(MessageRecord)+1
  4996.  Put 1,Lof(1)/Len(TableRecord)+1,TableRecord
  4997.  Strng="Stat: "+Message.Stat
  4998.  MessageRecord.Message=Left$(Strng,79)+Chr$(1)
  4999.  Put 2,Lof(2)/Len(MessageRecord)+1,MessageRecord
  5000.  For Temp=1 To Message.Length
  5001.     MessageRecord.Message=Left$(Temp.ArrayS(Temp),79)+Chr$(1)
  5002.     Put 2,Lof(2)/Len(MessageRecord)+1,MessageRecord
  5003.  Next
  5004. 10531
  5005.  Exit Sub
  5006. 10532
  5007.  Resume 10531
  5008. End Sub
  5009.  
  5010. Sub Open.Mail
  5011.  On Local Error Goto 10542
  5012.  Close 1, 2
  5013.  FileName=Config3(54)+TempX$+".TBL"
  5014.  Open FileName For Random Shared As #1 Len=Len(TableRecord)
  5015.  FileName=Config3(54)+TempX$+".DAT"
  5016.  Open FileName For Random Shared As #2 Len=Len(MessageRecord)
  5017. 10541
  5018.  Exit Sub
  5019. 10542
  5020.  Resume 10541
  5021. End Sub
  5022.  
  5023. Sub New.Stats
  5024.  On Local Error Goto 10560
  5025. 10551
  5026.  Temp#=Cdbl(Training.Room(UserRecord.ClassType,1))*Cdbl(UserRecord.Level)
  5027. 10552
  5028.  If Temp#>MaxInt Then
  5029.     Temp#=MaxInt
  5030.  Endif
  5031. 10553
  5032.  UserRecord.FatigueMax=Cint(Temp#)
  5033. 10554
  5034.  Temp#=Cdbl(Training.Room(UserRecord.ClassType,2))*Cdbl(UserRecord.Level)
  5035.  If Temp#>MaxInt Then
  5036.     Temp#=MaxInt
  5037.  Endif
  5038. 10555
  5039.  UserRecord.VitalityMax=Cint(Temp#)
  5040. 10556
  5041.  Temp#=Cdbl(Training.Room(UserRecord.ClassType,3))*Cdbl(UserRecord.Level)
  5042.  If Temp#>MaxInt Then
  5043.     Temp#=MaxInt
  5044.  Endif
  5045. 10557
  5046.  UserRecord.MagicMax=Cint(Temp#)
  5047. 10558
  5048.  Temp#=Cdbl(Training.Room(UserRecord.ClassType,4))*Cdbl(UserRecord.Level)
  5049.  If Temp#>MaxInt Then
  5050.     Temp#=MaxInt
  5051.  Endif
  5052.  UserRecord.PsionicMax=Cint(Temp#)
  5053.  If UserRecord.Fatigue<False Or_
  5054.  UserRecord.Fatigue>UserRecord.FatigueMax Then
  5055.     UserRecord.Fatigue=UserRecord.FatigueMax
  5056.  Endif
  5057.  If UserRecord.Vitality<False Or_
  5058.  UserRecord.Vitality>UserRecord.VitalityMax Then
  5059.     UserRecord.Vitality=UserRecord.VitalityMax
  5060.  Endif
  5061.  If UserRecord.Magic<False Or_
  5062.  UserRecord.Magic>UserRecord.MagicMax Then
  5063.     UserRecord.Magic=UserRecord.MagicMax
  5064.  Endif
  5065.  If UserRecord.Psionic<False Or_
  5066.  UserRecord.Psionic>UserRecord.PsionicMax Then
  5067.     UserRecord.Psionic=UserRecord.PsionicMax
  5068.  Endif
  5069.  If Config2(48) Then
  5070.     If UserRecord.Level>=10 Then
  5071.        If UserRecord.ClassType>=1 And UserRecord.ClassType<=10 Then
  5072.           Out2=High.Class.Name(UserRecord.ClassType)
  5073.           Call Valid(Out2,20)
  5074.           If Out2=Nul Then
  5075.              Strng="Illegal characters in high classname."
  5076.              Call IO.O
  5077.           Else
  5078.              Call Encrypt(Out2,True)
  5079.              UserRecord.ClassName=Out2
  5080.           Endif
  5081.        Endif
  5082.     Endif
  5083.  Endif
  5084. 10559
  5085.  Exit Sub
  5086. 10560
  5087.  If Erl=10551 Then
  5088.     Resume 10552
  5089.  Endif
  5090.  If Erl=10553 Then
  5091.     Resume 10554
  5092.  Endif
  5093.  If Erl=10555 Then
  5094.     Resume 10556
  5095.  Endif
  5096.  If Erl=10557 Then
  5097.     Resume 10558
  5098.  Endif
  5099.  Resume 10559
  5100. End Sub
  5101.  
  5102. Sub Top.Ten
  5103.  On Local Error Goto 10564
  5104.  Graphics.Off=True
  5105.  TempX=Lof(3)/Len(UserRecord)
  5106.  Redim Temp.Array1(1 To TempX) As Integer,_
  5107.        Temp.ArrayZ(1 To TempX) As Double
  5108.  Strng="DNDBBS V"+Version$+" Top Ten Player Rankings For "+FNclock$+"."
  5109.  Call IO.O
  5110.  Strng=Nul
  5111.  Call IO.O
  5112.  TempZ=False
  5113.  For Temp.User.Index=1 To TempX
  5114.     Get 3,Temp.User.Index,UserRecord
  5115.     Strng=UserRecord.CodeName
  5116.     Call Decrypt(Strng)
  5117.     If (UserRecord.Flags And Locked.User)=False Then
  5118.        If Left$(Strng,9)<>Deleted$ Then
  5119.           If UserRecord.Level>1 Then
  5120.              TempZ=TempZ+1
  5121.              Temp.Array1(TempZ)=Temp.User.Index
  5122. 10561        TempA#=UserRecord.PlayersKilled*UserRecord.Level*2+_
  5123.              UserRecord.MonstersKilled*UserRecord.Level
  5124. 10562        Temp.ArrayZ(TempZ)=TempA#
  5125.           Endif
  5126.        Endif
  5127.     Endif
  5128.  Next
  5129.  
  5130. ' metzner sort
  5131.  TempQ=4
  5132.  While TempQ<=TempZ
  5133.     TempQ=TempQ*2
  5134.  Wend
  5135.  TempQ=Int((TempQ-1)/2)
  5136.  While TempQ>False
  5137.     For Var=1 To TempZ-TempQ
  5138.        VarX=Var
  5139.        While VarX>False
  5140.           If Temp.ArrayZ(VarX)<Temp.ArrayZ(VarX+TempQ) Then
  5141.              Swap Temp.Array1(VarX),Temp.Array1(VarX+TempQ)
  5142.              Swap Temp.ArrayZ(VarX),Temp.ArrayZ(VarX+TempQ)
  5143.              VarX=VarX-TempQ
  5144.           Else
  5145.              VarX=False
  5146.           Endif
  5147.        Wend
  5148.    Next
  5149.    TempQ=Int(TempQ/2)
  5150. Wend
  5151. ' end sort
  5152.  
  5153.  If TempZ>10 Then
  5154.     TempZ=10
  5155.  Endif
  5156.  Strng="Username                      Level Classname            Ranking"
  5157.  Call IO.O
  5158.  Strng=String$(64,"-")
  5159.  Call IO.O
  5160.  TempX=False
  5161.  For Temp1=1 To TempZ
  5162.     Get 3,Temp.Array1(Temp1),UserRecord
  5163.     Strng=UserRecord.CodeName
  5164.     Call Decrypt(Strng)
  5165.     Strng=Lcase$(Strng)
  5166.     Mid$(Strng,1,1)=Ucase$(Mid$(Strng,1,1))
  5167.     If UserRecord.Level>32000 Then
  5168.        Strng=Strng+"Ghod  "
  5169.     Else
  5170.        Strng=Strng+Str$(UserRecord.Level)
  5171.        Strng=Strng+Space$(6-Len(Str$(UserRecord.Level)))
  5172.     Endif
  5173.     Out2=UserRecord.ClassName
  5174.     Call Decrypt(Out2)
  5175.     Strng=Strng+Out2
  5176.     TempX=True
  5177.     Strng=Strng+Str$(Temp.ArrayZ(Temp1))
  5178.     Call IO.O
  5179.  Next
  5180.  If TempX=False Then
  5181.     Strng="No users have top scores."
  5182.     Call IO.O
  5183.  Endif
  5184.  Redim Temp.Array1(1) As Integer,_
  5185.        Temp.ArrayZ(1) As Double
  5186.  Call More.Prompt
  5187. 10563
  5188.  Exit Sub
  5189. 10564
  5190.  If Erl=10561 Then
  5191.     Resume 10562
  5192.  Endif
  5193.  Resume 10563
  5194. End Sub
  5195.  
  5196. Sub More.Prompt
  5197.  On Local Error Goto 10572
  5198.  Graphics.Off=False
  5199.  Strng=More$
  5200.  No.Echo=True
  5201.  Line.Length=1
  5202.  Call IO.I
  5203.  No.Echo=False
  5204. 10571
  5205.  Exit Sub
  5206. 10572
  5207.  Resume 10571
  5208. End Sub
  5209.  
  5210. Sub Valid(Var$,Var)
  5211.  On Local Error Goto 10582
  5212.  If Len(Var$)/2<>Len(Var$)\2 Then
  5213.     Var$=Var$+" "
  5214.  Endif
  5215.  If Var/2<>Var\2 Then
  5216.     Var=Var+1
  5217.  Endif
  5218.  Var$=Left$(Var$,Var)
  5219.  Var$=Var$+Space$(Var-Len(Var$))
  5220.  For Var1=1 To Var
  5221.     Var2=Asc(Mid$(Var$,Var1,1))
  5222.     If Var2<32 Or Var2>127 Then
  5223.        Var$=Nul
  5224.        Exit Sub
  5225.     Endif
  5226.  Next
  5227. 10581
  5228.  Exit Sub
  5229. 10582
  5230.  Resume 10581
  5231. End Sub
  5232.  
  5233. Sub Encrypt(Var$,Var)
  5234.  On Local Error Goto 10592
  5235.  Var1$=Nul
  5236.  For Var2=1 To Len(Var$) Step 2
  5237.     Var1=0
  5238.     VarA=Asc(Mid$(Var$,Var2,1))
  5239.     VarB=Asc(Mid$(Var$,Var2+1,1))
  5240.     If Var Then
  5241.        Var1=20000
  5242.     Else
  5243.        If (VarA+VarB)/2=(VarA+VarB)\2 Then
  5244.           Var1=10000
  5245.        Endif
  5246.     Endif
  5247.     Var1=Var1+(VarA-32)*100+(VarB-32)
  5248.     Var1$=Var1$+Mki$(Var1)
  5249.  Next
  5250.  Var$=Var1$
  5251. 10591
  5252.  Exit Sub
  5253. 10592
  5254.  Resume 10591
  5255. End Sub
  5256.  
  5257. Sub Decrypt(Var$)
  5258.  On Local Error Goto 10602
  5259.  Var1$=Nul
  5260.  For Var=1 To Len(Var$) Step 2
  5261.     Var1=Cvi(Mid$(Var$,Var,2))
  5262.     Var2=Var1\100
  5263.     VarA=Var1-Var2*100
  5264.     Var1=Var2
  5265.     VarA=VarA+32
  5266.     Var2=Var1\100
  5267.     VarB=Var1-Var2*100
  5268.     VarB=VarB+32
  5269.     If Var2=0 Then
  5270.        If ((VarA+VarB)/2)=((VarA+VarB)\2) Then
  5271.           Var$=Nul
  5272.           Exit Sub
  5273.        Endif
  5274.     Endif
  5275.     If Var2=1 Then
  5276.        If ((VarA+VarB)/2)<>((VarA+VarB)\2) Then
  5277.           Var$=Nul
  5278.           Exit Sub
  5279.        Endif
  5280.     Endif
  5281.     Var1$=Var1$+Chr$(VarB)+Chr$(VarA)
  5282.  Next
  5283.  Var$=Var1$
  5284. 10601
  5285.  Exit Sub
  5286. 10602
  5287.  Resume 10601
  5288. End Sub
  5289.