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 / DNDUTIL.BAS < prev    next >
BASIC Source File  |  1993-01-07  |  10KB  |  397 lines

  1.  Rem dndutil.bas v2.9c
  2.  Rem $Include: 'dndbbs.inc'
  3.  
  4.  Rem Purpose: Utility program to be shelled to or called from DOS to
  5.  Rem    create bulletin files for your main BBS using dndbbs as a door.
  6.  
  7.  On Error Goto 10002
  8.  Select Case Command$
  9.  Case "/L"
  10.     TempA=False
  11.  Case "/P"
  12.     TempA=True
  13.  Case Else
  14.     Print "DNDUTIL Usage:"
  15.     Print "   DNDUTIL (option)"
  16.     Print "        where option is:"
  17.     Print "        /L makes report files, or"
  18.     Print "        /P makes & prints reports."
  19.     End
  20.  End Select
  21.  Call Read.Config
  22.  If Data.Error Then
  23.     Strng="Error reading "+FileName+". Writing configure file."
  24.     Print Strng
  25.     Call Write.Config
  26.     Call Read.Config
  27.     If Data.Error Then
  28.        Strng="Error writing "+FileName+". Aborting program."
  29.        Print Strng
  30.        End
  31.     Endif
  32.  Endif
  33.  Call Top.Ten
  34.  Call User.List
  35.  Call Last.User
  36.  Strng="Bulletin files created."
  37.  Print Strng
  38. 10001
  39.  End
  40. 10002
  41.  Strng="Error in dndutil. Quitting."
  42.  Print Strng
  43.  Resume 10001
  44.  
  45. Sub Read.Config
  46.  On Local Error Goto 10004
  47.  DND.Path=Environ$("DNDBBS")
  48.  If DND.Path<>Nul Then
  49.     If Right$(DND.Path,1)<>"\" Then
  50.        DND.Path=DND.Path+"\"
  51.     Endif
  52.  Endif
  53.  Restore Config.Array.Data
  54.  For Temp=1 To 8
  55.     Read Race(Temp)
  56.  Next
  57.  FileName="dndutil.cfg"
  58.  Close
  59.  Data.Error=False
  60.  Open DND.Path+FileName For Input Shared As #1
  61.  Line Input #1,TempX$
  62.  Line Input #1,TempX$
  63.  Line Input #1,TempA$ ' User.Dat file (input)
  64.  Line Input #1,TempX$
  65.  Line Input #1,TempB$ ' Top ten rank bulletin file (output)
  66.  Line Input #1,TempX$
  67.  Line Input #1,TempC$ ' User list bulletin file (output)
  68.  Line Input #1,TempX$
  69.  Line Input #1,TempD$ ' Lastuser.Dat file (input)
  70.  Line Input #1,TempX$
  71.  Line Input #1,TempX$ ' Last user bulletin file (output)
  72.  Line Input #1,TempZ$
  73. 10003
  74.  Exit Sub
  75. 10004
  76.  Data.Error=True
  77.  Resume 10003
  78. End Sub
  79.  
  80. Sub Write.Config
  81.  On Local Error Goto 10006
  82.  Close
  83.  Data.Error=False
  84.  Restore Config.Data
  85.  Open DND.Path+FileName For Output Shared As #1
  86.  For Temp=1 To 12
  87.     Read Temp$
  88.     Print #1,Temp$
  89.  Next
  90. 10005
  91.  Exit Sub
  92. 10006
  93.  Data.Error=True
  94.  Resume 10005
  95. End Sub
  96.  
  97. Sub Top.Ten
  98.  On Local Error Goto 10015
  99.  Close
  100. 10007
  101.  Data.Error=False
  102.  Open TempA$ For Random Shared As #1 Len=Len(UserRecord)
  103.  Open TempB$ For Output Shared As #2
  104. 10008
  105.  If Data.Error Then
  106.     Strng="Error opening "+TempB$+". Edit DNDUTIL.CFG."
  107.     Print Strng
  108.     End
  109.  Endif
  110.  Print "Writing Top Ten report."
  111.  TempX=Lof(1)/Len(UserRecord)
  112.  Redim Temp.Array1(1 To TempX) As Integer,_
  113.        Temp.ArrayZ(1 To TempX) As Double
  114.  Strng="DNDBBS V"+Version$+" Top Ten Player Rankings For "+_
  115.  Left$(FNclock$,13)+"."
  116.  Print #2,Strng
  117.  Strng=Nul
  118.  Print #2,Strng
  119.  TempZ=False
  120.  For Temp.User.Index=1 To TempX
  121.     Get 1,Temp.User.Index,UserRecord
  122.     Strng=UserRecord.CodeName
  123.     Call Decrypt(Strng)
  124.     If (UserRecord.Flags And Locked.User)=False Then
  125.        If Left$(Strng,9)<>Deleted$ Then
  126.           If UserRecord.Level>1 Then
  127.              TempZ=TempZ+1
  128.              Temp.Array1(TempZ)=Temp.User.Index
  129. 10009        TempA#=UserRecord.PlayersKilled*UserRecord.Level*2+_
  130.              UserRecord.MonstersKilled*UserRecord.Level
  131. 10010        Temp.ArrayZ(TempZ)=TempA#
  132.           Endif
  133.        Endif
  134.     Endif
  135.  Next
  136.  TempQ=4
  137.  While TempQ<=TempZ
  138.     TempQ=TempQ*2
  139.  Wend
  140.  TempQ=Int((TempQ-1)/2)
  141.  While TempQ>False
  142.     For Var=1 To TempZ-TempQ
  143.        VarX=Var
  144.        While VarX>False
  145.           If Temp.ArrayZ(VarX)<Temp.ArrayZ(VarX+TempQ) Then
  146.              Swap Temp.Array1(VarX),Temp.Array1(VarX+TempQ)
  147.              Swap Temp.ArrayZ(VarX),Temp.ArrayZ(VarX+TempQ)
  148.              VarX=VarX-TempQ
  149.           Else
  150.              VarX=False
  151.           Endif
  152.        Wend
  153.     Next
  154.     TempQ=Int(TempQ/2)
  155.  Wend
  156.  If TempZ>10 Then
  157.     TempZ=10
  158.  Endif
  159.  Strng="Username                      Level Classname            Ranking"
  160.  Print #2,Strng
  161.  Strng=String$(64,"-")
  162.  Print #2,Strng
  163.  TempX=False
  164.  For Temp1=1 To TempZ
  165.     Get 1,Temp.Array1(Temp1),UserRecord
  166.     Strng=UserRecord.CodeName
  167.     Call Decrypt(Strng)
  168.     Strng=Lcase$(Strng)
  169.     Mid$(Strng,1,1)=Ucase$(Mid$(Strng,1,1))
  170.     If UserRecord.Level>32000 Then
  171.        Strng=Strng+"Ghod  "
  172.     Else
  173.        Strng=Strng+Str$(UserRecord.Level)
  174.        Strng=Strng+Space$(6-Len(Str$(UserRecord.Level)))
  175.     Endif
  176.     Out2=UserRecord.ClassName
  177.     Call Decrypt(Out2)
  178.     Strng=Strng+Out2
  179.     TempX=True
  180.     Strng=Strng+Str$(Temp.ArrayZ(Temp1))
  181.     Print #2,Strng
  182.  Next
  183.  If TempX=False Then
  184.     Strng="No users have top scores."
  185.     Print #2,Strng
  186.  Endif
  187.  Close
  188.  If TempA Then
  189.     Open TempB$ For Input Shared As #1
  190.     Do Until Eof(1)
  191.        Line Input #1,Strng
  192.        Lprint Strng
  193.     Loop
  194.     Lprint Chr$(12);
  195.  Endif
  196. 10014
  197.  Exit Sub
  198. 10015
  199.  If Erl=10007 Then
  200.     Data.Error=True
  201.     Resume 10008
  202.  Endif
  203.  If Erl=10009 Then
  204.     Resume 10010
  205.  Endif
  206.  Resume 10014
  207. End Sub
  208.  
  209. Sub User.List
  210.  On Local Error Goto 10019
  211.  Close
  212. 10016
  213.  Data.Error=False
  214.  Open TempA$ For Random Shared As #1 Len=Len(UserRecord)
  215.  Open TempC$ For Output Shared As #2
  216. 10017
  217.  If Data.Error Then
  218.     Strng="Error opening "+TempC$+". Edit DNDUTIL.CFG."
  219.     Print Strng
  220.     End
  221.  Endif
  222.  Print "Writing User List report."
  223.  Strng="DNDBBS V"+Version$+" User List For "+Left$(FNclock$,13)+"."
  224.  Print #2,Strng
  225.  Strng=Nul
  226.  Print #2,Strng
  227.  Strng="Number User Name                      Class Name"
  228.  Strng=Strng+"           Race     Level"
  229.  Print #2,Strng
  230.  Strng=String$(73,"-")
  231.  Print #2,Strng
  232.  For Temp.User.Index=1 To Lof(1)/Len(UserRecord)
  233.     Get 1,Temp.User.Index,UserRecord
  234.     Strng=UserRecord.CodeName
  235.     Call Decrypt(Strng)
  236.     If Left$(Strng,9)<>Deleted$ Then
  237.        If (UserRecord.Flags And Locked.User)=False Then
  238.           Strng=Mid$(Str$(Temp.User.Index),2)+"."
  239.           Strng=Strng+Space$(7-Len(Strng))
  240.           Out2=UserRecord.CodeName
  241.           Call Decrypt(Out2)
  242.           Strng=Strng+Out2+" "
  243.           Out2=UserRecord.ClassName
  244.           Call Decrypt(Out2)
  245.           Strng=Strng+Out2+" "
  246.           If UserRecord.Race<1 Then
  247.              UserRecord.Race=1
  248.           Endif
  249.           Out2=Race(UserRecord.Race)
  250.           Out2=Rtrim$(Out2)
  251.           Out2=Out2+Space$(8-Len(Out2))
  252.           Strng=Strng+Out2
  253.           If UserRecord.Level<=False Then
  254.              Out2=" -dead-"
  255.           Else
  256.              Out2=Str$(UserRecord.Level)
  257.           Endif
  258.           Out2=Out2+Space$(7-Len(Out2))
  259.           If UserRecord.ClassType>8 Then
  260.              Out2=Out2+"*"
  261.           Endif
  262.           Strng=Strng+Out2
  263.           Print #2,Strng
  264.        Endif
  265.     Endif
  266.  Next
  267.  Close
  268.  If TempA Then
  269.     Open TempC$ For Input Shared As #1
  270.     Do Until Eof(1)
  271.        Line Input #1,Strng
  272.        Lprint Strng
  273.     Loop
  274.     Lprint Chr$(12);
  275.  Endif
  276. 10018
  277.  Exit Sub
  278. 10019
  279.  If Erl=10016 Then
  280.     Data.Error=True
  281.     Resume 10017
  282.  Endif
  283.  Resume 10018
  284. End Sub
  285.  
  286. Sub Last.User
  287.  On Local Error Goto 10024
  288.  Close
  289. 10021
  290.  Data.Error=False
  291.  Open TempD$ For Input Shared As #1
  292.  Open TempX$ For Output Shared As #2
  293. 10022
  294.  If Data.Error Then
  295.     Strng="Error opening "+TempD$+". Edit DNDUTIL.CFG."
  296.     Print Strng
  297.     End
  298.  Endif
  299.  Print "Writing Last User report."
  300.  Strng="DNDBBS V"+Version$+" Last User For "+Left$(FNclock$,13)+"."
  301.  Print #2,Strng
  302.  Strng=Nul
  303.  Print #2,Strng
  304.  Strng="# Username                      Room"
  305.  Strng=Strng+"  Timeon   Timeoff  Total    Score"
  306.  Print #2,Strng
  307.  Strng=String$(70,"-")
  308.  Print #2,Strng
  309.  Redim Temp.ArrayS(1 To 5) As String
  310.  Temp1=False
  311.  Do While Not Eof(1)
  312.     Line Input #1,TempZ$
  313.     Temp1=Temp1+1
  314.     If Temp1>5 Then
  315.        Temp1=5
  316.        For Temp2=1 To 4
  317.           Temp.ArrayS(Temp2)=Temp.ArrayS(Temp2+1)
  318.        Next
  319.     Endif
  320.     Temp.ArrayS(Temp1)=TempZ$
  321.  Loop
  322.  If Temp1>5 Then
  323.     Temp1=5
  324.  Endif
  325.  For Temp2=1 To Temp1
  326.     Strng=Mid$(Str$(Temp2),2)+" "+Temp.ArrayS(Temp2)
  327.     Print #2,Strng
  328.  Next
  329.  Close
  330.  If TempA Then
  331.     Open TempX$ For Input Shared As #1
  332.     Do Until Eof(1)
  333.        Line Input #1,Strng
  334.        Lprint Strng
  335.     Loop
  336.     Lprint Chr$(12);
  337.  Endif
  338. 10023
  339.  Exit Sub
  340. 10024
  341.  If Erl=10021 Then
  342.     Data.Error=True
  343.     Resume 10022
  344.  Endif
  345.  Resume 10023
  346. End Sub
  347.  
  348. Sub Decrypt(Var$)
  349.  On Local Error Goto 10042
  350.  Var1$=Nul
  351.  For Var=1 To Len(Var$) Step 2
  352.     Var1=Cvi(Mid$(Var$,Var,2))
  353.     Var2=Var1\100
  354.     VarA=Var1-Var2*100
  355.     Var1=Var2
  356.     VarA=VarA+32
  357.     Var2=Var1\100
  358.     VarB=Var1-Var2*100
  359.     VarB=VarB+32
  360.     If Var2=0 Then
  361.        If ((VarA+VarB)/2)=((VarA+VarB)\2) Then
  362.           Var$=Nul
  363.           Exit Sub
  364.        Endif
  365.     Endif
  366.     If Var2=1 Then
  367.        If ((VarA+VarB)/2)<>((VarA+VarB)\2) Then
  368.           Var$=Nul
  369.           Exit Sub
  370.        Endif
  371.     Endif
  372.     Var1$=Var1$+Chr$(VarB)+Chr$(VarA)
  373.  Next
  374.  Var$=Var1$
  375. 10041
  376.  Exit Sub
  377. 10042
  378.  Resume 10041
  379. End Sub
  380.  
  381. Config.Data:
  382.  Data "'Editable configure file for dndutil:"
  383.  Data "'Datapath\filename for users.dat file(input)"
  384.  Data "\dnd\data\users.dat"
  385.  Data "'Datapath\filename for user list file(output)"
  386.  Data "\dnd\userlist.txt"
  387.  Data "'Datapath\filename for top ten file(output)"
  388.  Data "\dnd\ranklist.txt"
  389.  Data "'Datapath\filename for lastuser.dat file(input)"
  390.  Data "\dnd\data\lastuser.dat"
  391.  Data "'Datapath\filename for last five users file(output)"
  392.  Data "\dnd\lastlist.txt"
  393.  Data "'End of configure file."
  394.  
  395. Config.Array.Data:
  396.  Data "Human","Elf","Gnome","Dwarf","Halfling","Half-elf","Half-orc","Ogre"
  397.