home *** CD-ROM | disk | FTP | other *** search
/ ftp.wwiv.com / ftp.wwiv.com.zip / ftp.wwiv.com / pub / MISC / DNDOOR45.ZIP / DNDS1.BAS < prev    next >
BASIC Source File  |  2000-04-28  |  106KB  |  2,456 lines

  1.  Rem * Filename: dnds1.bas Version: v4.5 r1.0
  2.  Rem * This subprogram contains most display and find routines.
  3.  
  4.  Rem $Include: 'dnddoor.inc'
  5.  
  6.  Rem * This routines displays information of the action file.
  7.  Rem * input variables:
  8.  Rem *   Number - the room file record.
  9.  
  10. Sub Display.Action(Number)
  11.  On Local Error Resume Next ' local error resume
  12.  Graphics.Off=False ' reset color
  13.  Outpt="Action number"+Str$(Number)+":" ' action number message
  14.  Call IO.O ' send output message
  15.  Graphics.Off=True ' reset color
  16.  If ActionRecord.MonsterTrigger Then ' check action trigger
  17.     ' get monster trigger record
  18.     Call Read.Record(MonsterFile,ActionRecord.MonsterTrigger)
  19.     Outpt=MonsterRecord.MonsterName ' store monster name
  20.     Outpt=Rtrim$(Outpt) ' trim name
  21.     Inpt=Str$(ActionRecord.MonsterTrigger)+", "+Outpt+"." ' make message
  22.  Else ' check trigger
  23.     Inpt=" <none>" ' make default message
  24.  Endif ' end check trigger
  25.  Outpt="[A]Monster trigger in effect for monster:"+Inpt ' make message
  26.  Call IO.O ' send output message
  27.  If ActionRecord.SpellTrigger Then ' check action trigger
  28.     Call Read.Record(SpellFile,ActionRecord.SpellTrigger) ' get spell record
  29.     Outpt=SpellRecord.SpellName ' store spell name
  30.     Outpt=Rtrim$(Outpt) ' trim name
  31.     Inpt=Str$(ActionRecord.SpellTrigger)+", "+Outpt+"." ' make message
  32.  Else ' check trigger
  33.     Inpt=" <none>" ' make default message
  34.  Endif ' end check trigger
  35.  Outpt="[B]Spell trigger in effect for spell:"+Inpt
  36.  Call IO.O ' send output message
  37.  If ActionRecord.MonsterTalk Then ' check action trigger
  38.     Call Read.Record(MonsterFile,ActionRecord.MonsterTalk) ' get monster record
  39.     Outpt=MonsterRecord.MonsterName ' store monster name
  40.     Outpt=Rtrim$(Outpt) ' trim name
  41.     Inpt=Str$(ActionRecord.MonsterTalk)+", "+Outpt+"." ' make message
  42.  Else ' check trigger
  43.     Inpt=" <none>" ' make default message
  44.  Endif ' end check trigger
  45.  Outpt="[C]Monster talk trigger in effect for monster:"+Inpt ' make message
  46.  Call IO.O ' send output message
  47.  If ActionRecord.Level>False Then ' check action trigger
  48.     Inpt=Str$(ActionRecord.Level) ' make message
  49.  Else ' check trigger
  50.     Inpt=" <none>" ' make default message
  51.  Endif ' end check trigger
  52.  Outpt="[D]High level room entry:"+Inpt ' message
  53.  If ActionRecord.Level<False Then ' check action trigger
  54.     Inpt=Str$(Abs(ActionRecord.Level)) ' make message
  55.  Else ' check trigger
  56.     Inpt=" <none>" ' make default message
  57.  Endif ' end check trigger
  58.  Outpt=Outpt+", Low level room entry:"+Inpt ' message
  59.  Call IO.O ' send output message
  60.  Outpt="Restricted room directions:" ' make message
  61.  Call IO.O ' send output message
  62.  If ActionRecord.Restrictions>False Then ' check action trigger
  63.     Outpt=Nul ' reset message
  64.     For Direction.Number=1 To 12 ' loop through directions
  65.        ' check restriction trigger
  66.        If ActionRecord.Restrictions And 2^Direction.Number Then
  67.           Outpts=Direction(Direction.Number) ' make direction name
  68.           Outpt=Outpt+Outpts+", " ' append direction
  69.        Endif ' end check trigger
  70.     Next ' end loop
  71.     If ActionRecord.Restrictions And 2^13 Then ' check restriction trigger
  72.        Outpt=Outpt+"enter portal, " ' append message
  73.     Endif ' end check trigger
  74.     If Len(Outpt) Then ' check string length
  75.        Outpt=Left$(Outpt,Len(Outpt)-2) ' truncate comma
  76.     Endif ' end check string length
  77.  Else ' check trigger
  78.     Outpt="<none>" ' default message
  79.  Endif ' end check trigger
  80.  Call IO.O ' send output message
  81.  Outpt="[E]Action hits for:"
  82.  Select Case ActionRecord.HitPoints ' check action trigger
  83.  Case Is>False
  84.     Inpt=Str$(ActionRecord.HitPoints)+" fatigue" ' make message
  85.  Case Is<False
  86.     Inpt=Str$(Abs(ActionRecord.HitPoints))+" vitality" ' make message
  87.  Case Else ' check trigger
  88.     Inpt=" <none>" ' default message
  89.  End Select ' end check trigger
  90.  Outpt=Outpt+Inpt
  91.  Call IO.O ' send output message
  92.  If ActionRecord.EncounterRate Then ' check action trigger
  93.     Inpt=Str$(ActionRecord.EncounterRate) ' make message
  94.  Else ' check trigger
  95.     Inpt=" <none>" ' default message
  96.  Endif ' end check trigger
  97.  Outpt="[F]Encounter rate:"+Inpt
  98.  If ActionRecord.HealthRate Then ' check action trigger
  99.     Inpt=Str$(ActionRecord.HealthRate) ' make message
  100.  Else ' check trigger
  101.     Inpt=" <none>" ' default message
  102.  Endif ' end check trigger
  103.  Outpt=Outpt+", Health rate:"+Inpt
  104.  Call IO.O ' send output message
  105.  Outpt="[G]Inventory: "
  106.  Select Case ActionRecord.Inventory ' make selection of inventory actions
  107.  Case 1 ' weapon action
  108.     Inpt="breaks weapons" ' make message
  109.  Case 2 ' shield action
  110.     Inpt="smashes shields" ' make message
  111.  Case 3 ' armor action
  112.     Inpt="wrecks armor" ' make message
  113.  Case 4 ' magic item action
  114.     Inpt="drains magic items" ' make message
  115.  Case Else ' check trigger
  116.     Inpt="<none>"
  117.  End Select ' end selection of inventory actions
  118.  Outpt=Outpt+Inpt
  119.  Call IO.O
  120.  If ActionRecord.Fumble Then ' check action trigger
  121.     Outpt="[H]Action fumbles." ' make message
  122.  Else ' check trigger
  123.     Outpt="[H]Action does not fumble." ' make message
  124.  Endif ' end check trigger
  125.  Call IO.O ' send output message
  126.  If ActionRecord.Teleport Then ' check action trigger
  127.     Outpt="[I]Action teleports to room"+Str$(ActionRecord.Teleport)+"."
  128.  Else ' check trigger
  129.     Outpt="[I]Action does not teleport." ' make message
  130.  Endif ' end check trigger
  131.  Call IO.O ' send output message
  132.  If ActionRecord.RustRate Then ' check action trigger
  133.     Inpt=Str$(ActionRecord.RustRate) ' make message
  134.  Else ' check trigger
  135.     Inpt=" <none>" ' default message
  136.  Endif ' end check trigger
  137.  Outpt="[J]Action has weapon rusting rate of"+Inpt+" rounds." ' message
  138.  Call IO.O ' send output message
  139.  If ActionRecord.StealRate Then ' check action trigger
  140.     Inpt=Str$(ActionRecord.StealRate) ' make message
  141.  Else ' check trigger
  142.     Inpt=" <none>" ' default message
  143.  Endif ' end check trigger
  144.  Outpt="[K]Action has monster stealing rate of"+Inpt+" rounds." ' message
  145.  Call IO.O ' send output message
  146.  Outpt="[L]Action attributes: " ' make edit display message
  147.  If ActionRecord.Attribute1=LitRoom Then ' check attribute
  148.     Outpt=Outpt+"Lit" ' append attribute message
  149.  Else ' check attribute
  150.     If ActionRecord.Attribute1=UnLitRoom Then ' check attribute
  151.        Outpt=Outpt+"Unlit" ' append attribute message
  152.     Endif ' end check attribute
  153.  Endif ' end check attribute
  154.  Outpt=Outpt+", " ' append comma
  155.  Select Case ActionRecord.Attribute2 ' select attribute
  156.  Case Land ' check attribute
  157.     Outpt=Outpt+"Land" ' append attribute message
  158.  Case Air ' check attribute
  159.     Outpt=Outpt+"Air" ' append attribute message
  160.  Case Water ' check attribute
  161.     Outpt=Outpt+"Water" ' append attribute message
  162.  End Select ' end select attribute
  163.  Call IO.O ' send attribute message
  164.  Outpt="[X]Clear action" ' make alternate display message
  165.  Call IO.O ' send alternate display message
  166. End Sub
  167.  
  168.  Rem * This routines displays information on the monster file.
  169.  Rem * input variables:
  170.  Rem *   Number - the monster file record.
  171.  
  172. Sub Display.Monster(Number)
  173.  On Local Error Resume Next ' local error resume
  174.  Graphics.Off=False ' reset color
  175.  Outpt="Monster number"+Str$(Number)+":" ' monster number message
  176.  Call IO.O ' send output message
  177.  Graphics.Off=True ' reset color
  178.  Outpt="[A]Monster name: "+Rtrim$(MonsterRecord.MonsterName) ' message
  179.  Call IO.O ' send output message
  180.  Outpt="[B]Plural of monster name: "+MonsterRecord.PluralName ' message
  181.  Call IO.O ' send output message
  182.  Outpt="[C]Monster level:"+Str$(MonsterRecord.Level) ' message
  183.  Call IO.O ' send output message
  184.  Outpt="[D]Magical monster: " ' message
  185.  If MonsterRecord.Magic Then ' verify monster
  186.     Outpt=Outpt+"Yes" ' add to message
  187.  Else ' verify
  188.     Outpt=Outpt+"No" ' add to message
  189.  Endif ' end verify
  190.  Call IO.O ' send output message
  191.  Outpt="[E]Hit points:"+Str$(MonsterRecord.Hits) ' message
  192.  Call IO.O ' send output message
  193.  Outpt="[F]Experience points:"+Str$(MonsterRecord.Experience) ' message
  194.  Call IO.O ' send output message
  195.  Outpt="[G]Gold points:"+Str$(MonsterRecord.Gold) ' message
  196.  Call IO.O ' send output message
  197.  Outpt="[H]Number appearing:"+Str$(MonsterRecord.NumberAppearing) ' message
  198.  Call IO.O ' send output message
  199.  Outpt="[I]Poisonous monster: " ' message
  200.  If MonsterRecord.Poison Then ' verify monster
  201.     Outpt=Outpt+"Yes("+Mid$(Str$(MonsterRecord.PoisonPercent),2)+ _
  202.     " percent)" ' message
  203.  Else ' verify
  204.     Outpt=Outpt+"No" ' add to message
  205.  Endif ' end verify
  206.  Call IO.O ' send output message
  207.  Outpt="[J]Level draining monster: " ' message
  208.  If MonsterRecord.LevelDrain Then ' verify monster
  209.     Outpt=Outpt+"Yes("+Mid$(Str$(MonsterRecord.DrainPercent),2)+ _
  210.     " percent)" ' message
  211.  Else ' verify
  212.     Outpt=Outpt+"No" ' add to message
  213.  Endif ' end verify
  214.  Call IO.O ' send output message
  215.  Outpt="[K]Monster blocks exits: " ' message
  216.  If MonsterRecord.Block Then ' verify monster
  217.     Outpt=Outpt+"Yes("+Mid$(Str$(MonsterRecord.BlockPercent),2)+ _
  218.     " percent)" ' message
  219.  Else ' verify
  220.     Outpt=Outpt+"No" ' add to message
  221.  Endif ' end verify
  222.  Call IO.O ' send output message
  223.  Outpt="[L]Monster prevents treasure take: " ' message
  224.  If MonsterRecord.Prevent Then ' verify monster
  225.     Outpt=Outpt+"Yes("+Mid$(Str$(MonsterRecord.PreventPercent),2)+ _
  226.     " percent)" ' message
  227.  Else ' verify
  228.     Outpt=Outpt+"No" ' add to message
  229.  Endif ' end verify
  230.  Call IO.O ' send output message
  231.  Outpt="[M]Monster follows player: " ' message
  232.  If MonsterRecord.Follow Then ' verify monster
  233.     Outpt=Outpt+"Yes("+Mid$(Str$(MonsterRecord.FollowPercent),2)+ _
  234.     " percent)("+Mid$(Str$(MonsterRecord.Teleport),2)+"% teleport)"
  235.  Else ' verify
  236.     Outpt=Outpt+"No" ' add to message
  237.  Endif ' end verify
  238.  Call IO.O ' send output message
  239.  Outpt="[N]Monster casts spells: " ' message
  240.  Spell.Number=MonsterRecord.Spell ' store spell number
  241.  If Spell.Number=False Then ' verify monster
  242.     Outpt=Outpt+"No" ' add to message
  243.  Else ' verify
  244.     ' file bounds
  245.     If Spell.Number>False And _
  246.     Spell.Number<=Lof(SpellFile)/Len(SpellRecord) Then
  247.        Call Read.Record(SpellFile,Spell.Number) ' get spell record
  248.        Outpt=Outpt+"Yes, "+Rtrim$(SpellRecord.SpellName)+ _
  249.        "("+Mid$(Str$(MonsterRecord.SpellPercent),2)+" percent)" ' message
  250.     Endif ' end check file bounds
  251.  Endif ' end verify
  252.  Call IO.O ' send output message
  253.  Outpt="[O]Monster jails attacker: " ' message
  254.  If MonsterRecord.Jail Then ' verify monster
  255.     Outpt=Outpt+"Yes" ' add to message
  256.  Else ' verify
  257.     Outpt=Outpt+"No" ' add to message
  258.  Endif ' end verify
  259.  Call IO.O ' send output message
  260.  Outpt="[P]Encounter rate:"+Str$(MonsterRecord.Rate)+ _
  261.  "("+Mid$(Str$(MonsterRecord.RatePercent),2)+" percent)" ' message
  262.  Call IO.O ' send output message
  263.  Outpt="[R]Permanent monster: " ' message
  264.  If MonsterRecord.Permanent Then ' verify monster
  265.     Outpt=Outpt+"Yes" ' add to message
  266.  Else ' verify
  267.     Outpt=Outpt+"No" ' add to message
  268.  Endif ' end verify
  269.  Call IO.O ' send output message
  270.  Outpt="[S]Monster uses psionics: " ' message
  271.  If MonsterRecord.Psionic=False Then ' verify monster
  272.     Outpt=Outpt+"No" ' add to message
  273.  Else ' verify
  274.     Spell.Number=MonsterRecord.PsionicSpell ' store psionic spell number
  275.     ' file bounds
  276.     If Spell.Number>False And _
  277.     Spell.Number<=Lof(SpellFile)/Len(SpellRecord) Then
  278.        Call Read.Record(SpellFile,Spell.Number) ' get spell record
  279.        Outpt=Outpt+"Yes, "+SpellRecord.SpellName ' message
  280.     Endif ' end check file bounds
  281.  Endif ' end verify
  282.  Call IO.O ' send output message
  283.  Outpt="[T]Carries treasure" ' message
  284.  Call IO.O ' send output message
  285. End Sub ' end routine
  286.  
  287.  Rem * This routines displays information on the monster class file.
  288.  Rem * input variables:
  289.  Rem *   Number - the monster class file record.
  290.  
  291. Sub Display.Monster.Class(Number)
  292.  On Local Error Resume Next ' local error resume
  293.  Graphics.Off=False ' reset color
  294.  Outpt="Monster class number"+Str$(Number)+":"
  295.  Call IO.O ' send output message
  296.  Graphics.Off=True ' reset color
  297.  For Array.Number=1 To 10 ' loop through the monster classes
  298.     ' get monster number in class
  299.     Monster.Index=MonclassRecord.Monsters(Array.Number)
  300.     ' file bounds
  301.     If Monster.Index>False And _
  302.     Monster.Index<=Lof(MonsterFile)/Len(MonsterRecord) Then
  303.        Call Read.Record(MonsterFile,Monster.Index) ' get monster record
  304.        Outpt="Monster number"+Str$(Array.Number)+":"+ _
  305.        Rtrim$(MonsterRecord.MonsterName) ' make display message
  306.        Call IO.O ' send output message
  307.     Endif ' end check file bounds
  308.  Next ' end loop through monster class
  309. End Sub ' end routine to display monster class
  310.  
  311.  Rem * This routines displays information on the nonplayer file.
  312.  Rem * input variables:
  313.  Rem *   Number - the nonplayer file record.
  314.  
  315. Sub Display.Nonplayer(Number)
  316.  On Local Error Resume Next ' local error resume
  317.  Graphics.Off=False ' reset color
  318.  Outpt="Nonplayer number"+Str$(Number)+":" ' nonplayer number message
  319.  Call IO.O ' send output message
  320.  Graphics.Off=True ' reset color
  321.  Outpt="[A]Nonplayer name: "+Rtrim$(MonsterRecord.MonsterName) ' message
  322.  Call IO.O ' send output message
  323.  Outpt="[B]Nonplayer rooms: "+MonsterRecord.PluralName ' message
  324.  Call IO.O ' send output message
  325.  Outpt="[C]Nonplayer level:"+Str$(MonsterRecord.Level) ' message
  326.  Call IO.O ' send output message
  327.  Outpt="[D]Hit points:"+Str$(MonsterRecord.Hits) ' message
  328.  Call IO.O ' send output message
  329.  Outpt="[E]Experience points:"+Str$(MonsterRecord.Experience) ' message
  330.  Call IO.O ' send output message
  331.  Outpt="[F]Gold points:"+Str$(MonsterRecord.Gold) ' message
  332.  Call IO.O ' send output message
  333.  Outpt="[G]Poisonous nonplayer: " ' message
  334.  If MonsterRecord.Poison Then ' verify nonplayer
  335.     Outpt=Outpt+"Yes("+Mid$(Str$(MonsterRecord.PoisonPercent),2)+ _
  336.     " percent)" ' message
  337.  Else ' verify
  338.     Outpt=Outpt+"No" ' add to message
  339.  Endif ' end verify
  340.  Call IO.O ' send output message
  341.  Outpt="[H]Level draining nonplayer: " ' message
  342.  If MonsterRecord.LevelDrain Then ' verify nonplayer
  343.     Outpt=Outpt+"Yes("+Mid$(Str$(MonsterRecord.DrainPercent),2)+ _
  344.     " percent)" ' message
  345.  Else ' verify
  346.     Outpt=Outpt+"No" ' add to message
  347.  Endif ' end verify
  348.  Call IO.O ' send output message
  349.  Outpt="[I]Nonplayer blocks exits: " ' message
  350.  If MonsterRecord.Block Then ' verify nonplayer
  351.     Outpt=Outpt+"Yes("+Mid$(Str$(MonsterRecord.BlockPercent),2)+ _
  352.     " percent)" ' message
  353.  Else ' verify
  354.     Outpt=Outpt+"No" ' add to message
  355.  Endif ' end verify
  356.  Call IO.O ' send output message
  357.  Outpt="[J]Nonplayer prevents treasure take: " ' message
  358.  If MonsterRecord.Prevent Then ' verify nonplayer
  359.     Outpt=Outpt+"Yes("+Mid$(Str$(MonsterRecord.PreventPercent),2)+ _
  360.     " percent)" ' message
  361.  Else ' verify
  362.     Outpt=Outpt+"No" ' add to message
  363.  Endif ' end verify
  364.  Call IO.O ' send output message
  365.  Outpt="[K]Nonplayer follows player: " ' message
  366.  If MonsterRecord.Follow Then ' verify nonplayer
  367.     Outpt=Outpt+"Yes("+Mid$(Str$(MonsterRecord.FollowPercent),2)+ _
  368.     " percent)("+Mid$(Str$(MonsterRecord.Teleport),2)+"% teleport)" ' message
  369.  Else ' verify
  370.     Outpt=Outpt+"No" ' add to message
  371.  Endif ' end verify
  372.  Call IO.O ' send output message
  373.  Outpt="[L]Nonplayer casts spells: " ' message
  374.  Spell.Number=MonsterRecord.Spell ' store spell number
  375.  If Spell.Number=False Then ' verify nonplayer
  376.     Outpt=Outpt+"No" ' add to message
  377.  Else ' verify
  378.     ' file bounds
  379.     If Spell.Number>False And _
  380.     Spell.Number<=Lof(SpellFile)/Len(SpellRecord) Then
  381.        Call Read.Record(SpellFile,Spell.Number) ' get spell record
  382.        Outpt=Outpt+"Yes, "+Rtrim$(SpellRecord.SpellName)+"("+ _
  383.        Mid$(Str$(MonsterRecord.SpellPercent),2)+" percent)" ' message
  384.     Endif ' end check file bounds
  385.  Endif ' end verify
  386.  Call IO.O ' send output message
  387.  Outpt="[M]Nonplayer jails attacker: " ' message
  388.  If MonsterRecord.Jail Then ' verify nonplayer
  389.     Outpt=Outpt+"Yes" ' add to message
  390.  Else ' verify
  391.     Outpt=Outpt+"No" ' add to message
  392.  Endif ' end verify
  393.  Call IO.O ' send output message
  394.  Outpt="[N]Encounter rate:"+Str$(MonsterRecord.Rate)+ _
  395.  "("+Mid$(Str$(MonsterRecord.RatePercent),2)+" percent)" ' message
  396.  Call IO.O ' send output message
  397.  Outpt="[O]Nonplayer uses psionics: " ' message
  398.  If MonsterRecord.Psionic=False Then ' verify nonplayer
  399.     Outpt=Outpt+"No" ' add to message
  400.  Else ' verify
  401.     Spell.Number=MonsterRecord.PsionicSpell ' store psionic spell number
  402.     ' file bounds
  403.     If Spell.Number>False And _
  404.     Spell.Number<=Lof(SpellFile)/Len(SpellRecord) Then
  405.        Call Read.Record(SpellFile,Spell.Number) ' get spell record
  406.        Outpt=Outpt+"Yes, "+SpellRecord.SpellName ' message
  407.     Endif ' end check file bounds
  408.  Endif ' end verify
  409.  Call IO.O ' send output message
  410.  Outpt="[P]Carries treasure:" ' message
  411.  Call IO.O ' send output message
  412.  For Array.Number=1 To 5 ' loop through nonplayer treasure
  413.     ' get nonplayer treasure number
  414.     Treasure.Number=MonsterRecord.Treasure(Array.Number)
  415.     If Treasure.Number>False And _
  416.     Treasure.Number<=Lof(TreasureFile)/Len(TreasureRecord) Then ' file bounds
  417.        Call Read.Record(TreasureFile,Treasure.Number) ' get treasure record
  418.        Outpt=TreasureRecord.TreasureName ' store treasure name
  419.        Call IO.O ' send output message
  420.     Endif ' end check file bounds
  421.  Next ' end loop through nonplayer treasure
  422. End Sub ' end routine
  423.  
  424.  Rem * This routines displays information on the object file.
  425.  Rem * input variables:
  426.  Rem *   Number - the object file record.
  427.  
  428. Sub Display.Object(Number)
  429.  On Local Error Resume Next ' local error resume
  430.  Graphics.Off=False ' reset color
  431.  Outpt="Object number"+Str$(Number)+":" ' object number message
  432.  Call IO.O ' send output message
  433.  Graphics.Off=True ' reset color
  434.  Outpt="[A]Object name: "+Rtrim$(ObjectRecord.ObjectName) ' message
  435.  Call IO.O ' send output message
  436.  Outpt="[B]Object identifier: "+Lcase$(Rtrim$(ObjectRecord.ShortName))
  437.  Call IO.O ' send output message
  438.  Outpt="[C]Room number link:"+Str$(ObjectRecord.RoomLink) ' message
  439.  Call IO.O ' send output message
  440.  Outpt="[D]Trapped portal: " ' message
  441.  Select Case ObjectRecord.Trap ' selection of object trap type
  442.  Case False ' verify object
  443.     Outpt=Outpt+"No" ' add to message
  444.  Case 1 ' verify object
  445.     Outpt=Outpt+"poison needles" ' message
  446.  Case 2 ' berify object
  447.     Outpt=Outpt+"teleport to"+Str$(ObjectRecord.Teleport) ' message
  448.  Case 3 ' verify object
  449.     Outpt=Outpt+"hits for"+Str$(Abs(ObjectRecord.Teleport))+" " ' message
  450.     Select Case Object.Teleport ' selection of object trap hit type
  451.     Case Is<False ' verify object
  452.        Outpt=Outpt+"vitality" ' message
  453.     Case Else ' verify object
  454.        Outpt=Outpt+"fatigue" ' message
  455.     End Select ' end selection of object hit type
  456.  End Select ' end selection of object type
  457.  Call IO.O ' send output message
  458.  Outpt="[E]Long description:" ' message
  459.  Call IO.O ' send output message
  460.  Outpt=Rtrim$(ObjectRecord.LongDesc) ' message
  461.  If Outpt=Nul Then ' check message
  462.     Outpt="<none>" ' reset
  463.  Endif ' end check message
  464.  Call IO.O ' send output message
  465.  Outpt="[F]Entry description:" ' message
  466.  Call IO.O ' send output message
  467.  Outpt=Rtrim$(ObjectRecord.ShortDesc) ' message
  468.  If Outpt=Nul Then ' check message
  469.     Outpt="<none>" ' reset
  470.  Endif ' end check message
  471.  Call IO.O ' send output message
  472.  Outpt="[G]Hidden object: " ' message
  473.  If ObjectRecord.Hidden Then ' verify object
  474.     Outpt=Outpt+"Yes" ' add to message
  475.  Else ' verify
  476.     Outpt=Outpt+"No" ' add to message
  477.  Endif ' end verify
  478.  Call IO.O ' send output message
  479.  Outpt="[H]Invisible object: " ' message
  480.  If ObjectRecord.Invisible Then ' verify object
  481.     Outpt=Outpt+"Yes" ' add to message
  482.  Else ' verify
  483.     Outpt=Outpt+"No" ' add to message
  484.  Endif ' end verify
  485.  Call IO.O ' send output message
  486.  Outpt="[I]Jail attacker trap: " ' message
  487.  If ObjectRecord.JailTrap Then ' verify object
  488.     Outpt=Outpt+"Yes" ' add to message
  489.  Else ' verify
  490.     Outpt=Outpt+"No" ' add to message
  491.  Endif ' end verify
  492.  Call IO.O ' send output message
  493.  Outpt="[J]Locked portal: " ' message
  494.  If ObjectRecord.DoorLock=2 Then ' verify object
  495.     Outpt=Outpt+"Yes" ' add to message
  496.  Else ' verify
  497.     Outpt=Outpt+"No" ' add to message
  498.  Endif ' end verify
  499.  Call IO.O ' send output message
  500.  Outpt="[K]Relocking portal: " ' message
  501.  If ObjectRecord.Relocks Then ' verify object
  502.     Outpt=Outpt+"Yes" ' add to message
  503.  Else ' verify
  504.     Outpt=Outpt+"No" ' add to message
  505.  Endif ' end verify
  506.  Call IO.O ' send output message
  507.  Outpt="[L]Key number:"+Str$(ObjectRecord.Keyed) ' message
  508.  Call IO.O ' send output message
  509.  Outpt="[M]Permanent object: " ' message
  510.  If ObjectRecord.Permanent Then ' verify object
  511.     Outpt=Outpt+"Yes" ' add to message
  512.  Else ' verify
  513.     Outpt=Outpt+"No" ' add to message
  514.  Endif ' end verify
  515.  Call IO.O ' send output message
  516.  Outpt="[N]Object is a light: " ' message
  517.  If ObjectRecord.LightRoom=False Then ' verify object
  518.     Outpt=Outpt+"No" ' add to message
  519.  Else ' verify
  520.     Outpt=Outpt+"Yes, Light Time: " ' message
  521.     If ObjectRecord.LightTime=False Then ' verify object
  522.        Outpt=Outpt+"<any>" ' message
  523.     Else ' verify
  524.        Outpt=Outpt+"From:"+Right$(Str$(ObjectRecord.FromHour+100),2)+":"+ _
  525.        Right$(Str$(ObjectRecord.FromMin+100),2)+" to "+ _
  526.        Right$(Str$(ObjectRecord.ToHour+100),2)+":"+ _
  527.        Right$(Str$(ObjectRecord.ToMin+100),2) ' message
  528.     Endif ' end verify
  529.  Endif ' end verify
  530.  Call IO.O ' send output message
  531. End Sub ' end routine
  532.  
  533.  Rem * This routines displays information on the room file.
  534.  Rem * input variables:
  535.  Rem *   Number! - the room file record.
  536.  
  537. Sub Display.Room.Desc(Number!)
  538.  On Local Error Resume Next ' local error resume
  539.  Graphics.Off=False ' reset color
  540.  Outpt="Room number"+Str$(Number!)+": Action"+Str$(RoomRecord.Action)+ _
  541.  ": Monster class:"+Str$(RoomRecord.MonsterClass)+"." ' make room message
  542.  Call IO.O ' send output message
  543.  Outpt="Short description:" ' message
  544.  Call IO.O ' send output message
  545.  Graphics.Off=True ' reset color
  546.  Outpt=Rtrim$(RoomRecord.ShortDesc) ' message
  547.  If Instr(Outpt,Chr$(0)) Then ' find any null characters from old structures
  548.     Outpt=Left$(Outpt,Instr(Outpt,Chr$(0))-1) ' truncate off nulls
  549.  Endif ' end find old nulls
  550.  Call IO.O ' send output message
  551.  Graphics.Off=False ' reset color
  552.  Outpt="Long description:" ' message
  553.  Call IO.O ' send output message
  554.  Graphics.Off=True ' reset color
  555.  For Array.Number=1 To 4 ' loop through all four long room description lines
  556.     Outpt=RoomRecord.LongDesc(Array.Number) ' get next room description line
  557.     Outpt=Rtrim$(Outpt) ' trim room description line
  558.     If Instr(Outpt,Chr$(0)) Then ' find any nul characters from old files
  559.        Outpt=Left$(Outpt,Instr(Outpt,Chr$(0))-1) ' truncate off nulls
  560.     Endif ' end find old nulls
  561.     If Outpt=Nul Then ' check if long description ends
  562.        Exit For ' exit long description display loop
  563.     Endif ' end check description end
  564.     Call IO.O ' send output message
  565.  Next ' end long room description loop
  566. End Sub ' end routine
  567.  
  568.  Rem * This routines displays information on the spell file.
  569.  Rem * input variables:
  570.  Rem *   Number - the spell file record.
  571.  
  572. Sub Display.Spell(Number)
  573.  On Local Error Resume Next ' local error resume
  574.  Graphics.Off=False ' reset color
  575.  Outpt="Spell number"+Str$(Number)+":" ' spell number message
  576.  Call IO.O ' send output message
  577.  Graphics.Off=True ' reset color
  578.  Outpt="[A]Spell name: "+Rtrim$(SpellRecord.SpellName) ' message
  579.  Call IO.O ' send output message
  580.  Outpt="[B]Spell chant:" ' message
  581.  Call IO.O ' send output message
  582.  Outpt=Lcase$(Rtrim$(SpellRecord.Chant)) ' message
  583.  Call IO.O ' send output message
  584.  Outpt="[C]Spell cast description:" ' message
  585.  Call IO.O ' send output message
  586.  Outpt=Rtrim$(SpellRecord.Desc)
  587.  Call IO.O ' send output message
  588.  Outpt="[D]Spell level:"+Str$(SpellRecord.Level) ' message
  589.  Call IO.O ' send output message
  590.  Outpt="[E]" ' set to option
  591.  Select Case SpellRecord.SpellType ' selection of spell type
  592.  Case Enchant
  593.     Inpt="Enchant" ' message
  594.  Case Offense
  595.     Inpt="Offense" ' message
  596.  Case Bless
  597.     Inpt="Bless" ' message
  598.  Case Wish
  599.     Inpt="Wish" ' message
  600.  Case Poison
  601.     Inpt="Poison" ' message
  602.  Case Vigor
  603.     Inpt="Vigor" ' message
  604.  Case Heal
  605.     Inpt="Heal" ' message
  606.  Case CurePoison
  607.     Inpt="Curepoison" ' message
  608.  Case LevelDrain
  609.     Inpt="Level Drain" ' message
  610.  Case Teleport
  611.     Inpt="Teleport to Room"+Str$(SpellRecord.Teleport)
  612.  Case Befuddled
  613.     Inpt="Befuddle" ' message
  614.  Case TurnUndead
  615.     Inpt="Turn Undead" ' message
  616.  Case PassDoor
  617.     Inpt="Pass Door" ' message
  618.  Case Conjure
  619.     Inpt="Conjure" ' message
  620.  Case Psionic
  621.     Inpt="Psionic" ' message
  622.  Case DetectLock
  623.     Inpt="Detect Lock" ' message
  624.  Case DetectEvil
  625.     Inpt="Detect Evil" ' message
  626.  Case DetectTrap
  627.     Inpt="Detect Trap" ' message
  628.  Case Intoxicate
  629.     Inpt="Intoxicate" ' message
  630.  Case SetTrap
  631.     Inpt="Set Trap" ' message
  632.  Case Hiding
  633.     Inpt="Hide" ' message
  634.  Case Search
  635.     Inpt="Search" ' message
  636.  Case Invisibility
  637.     Inpt="Invisibility" ' message
  638.  Case Identify
  639.     Inpt="Identify" ' message
  640.  Case Enlighten
  641.     Inpt="Enlighten" ' message
  642.  Case Illuminate
  643.     Inpt="Illuminate" ' message
  644.  Case Psyche
  645.     Inpt="Psyche" ' message
  646.  Case Telepathy
  647.     Inpt="Telepathy" ' message
  648.  Case Else ' other
  649.     Inpt="<none>" ' message
  650.  End Select ' end selection of spell type
  651.  Outpt=Outpt+"Spell type: "+Inpt ' message
  652.  Call IO.O ' send output message
  653.  Outpt="[F]Spell is psionic: " ' message
  654.  If SpellRecord.Psionic=False Then ' verify spell
  655.     Outpt=Outpt+"No" ' add to message
  656.  Else ' verify
  657.     Outpt=Outpt+"Yes, " ' message
  658.     Select Case SpellRecord.PsionicMode ' selection of spell psionic type
  659.     Case PsiAttack
  660.        Outpt=Outpt+"Attack" ' message
  661.     Case PsiDefense
  662.        Outpt=Outpt+"Defense" ' message
  663.     Case Else ' other
  664.        Outpt=Outpt+"<none>" ' message
  665.     End Select ' end selection of spell type
  666.  Endif ' end verify
  667.  Call IO.O ' send output message
  668.  Outpt="[G]Characters which can cast spell:" ' message
  669.  Call IO.O ' send output message
  670.  Spell.Cast=False ' set spell cast found flag
  671.  For Class.Number=1 To 8 ' loop through spell cast flags
  672.     If SpellRecord.ClassType And 2^Class.Number Then ' compare spell cast flag
  673.        Class.Type$=Class.Name(Class.Number) ' store class name
  674.        Class.Type$=Rtrim$(Class.Type$) ' trim name
  675.        ' uppercase first word
  676.        Mid$(Class.Type$,1,1)=Ucase$(Mid$(Class.Type$,1,1))
  677.        Outpt=Outpt+Class.Type$+", " ' append to output string
  678.        Spell.Cast=True ' set spell cast found flag
  679.     Endif ' end compare spell cast flags
  680.  Next ' end loop through spell cast flags
  681.  If Spell.Cast Then ' check spell cast found flag
  682.     Outpt=Left$(Outpt,Len(Outpt)-2)+"." ' message
  683.  Else ' check spell flag
  684.     Outpt="<none>" ' message
  685.  Endif ' end check spell cast found flag
  686.  Call IO.O ' send output message
  687.  Outpt="[H]Spell ingredients:" ' message
  688.  Call IO.O ' send output message
  689.  Spell.Ingredient=False ' set spell ingredient found flag
  690.  For Array.Number=1 To 5 ' loop through spell ingerdients
  691.     ' get spell ingredient number
  692.     Treasure.Number=SpellRecord.Ingred(Array.Number)
  693.     If Treasure.Number>False And _
  694.     Treasure.Number<=Lof(TreasureFile)/Len(TreasureRecord) Then ' file bounds
  695.        Call Read.Record(TreasureFile,Treasure.Number) ' get treasure record
  696.        Ingredient.Name$=TreasureRecord.TreasureName ' store treasure name
  697.        Ingredient.Name$=Rtrim$(Ingredient.Name$) ' trim name
  698.        Ingredient.Name$=Lcase$(Ingredient.Name$) ' lowercase name
  699.        ' uppercase first word
  700.        Mid$(Ingredient.Name$,1,1)=Ucase$(Mid$(Ingredient.Name$,1,1))
  701.        Outpt=Outpt+Ingredient.Name$+", " ' message
  702.        Spell.Ingredient=True ' set spell ingredient found flag
  703.     Endif ' end check file bounds
  704.  Next ' end loop through spell ingredients
  705.  If Spell.Ingredient Then ' check spell ingredient found flag
  706.     Outpt=Left$(Outpt,Len(Outpt)-2)+"." ' message
  707.  Else ' check spell ingredient
  708.     Outpt="<none>" ' message
  709.  Endif ' end check spell ingredient found flag
  710.  Call IO.O ' send output message
  711.  Outpt="[I]Spell casting type which requires ingredients:" ' message
  712.  Call IO.O ' send output message
  713.  Spell.Requirement=False ' set ingredient requirement flag
  714.  If SpellRecord.SpellFlag And Use.Spell.Type Then ' verify spell
  715.     Outpt="use command, " ' message
  716.     Spell.Requirement=True ' set ingredient flag
  717.  Endif ' end verify
  718.  If SpellRecord.SpellFlag And Scroll.Spell.Type Then ' verify spell
  719.     Outpt=Outpt+"read scroll, " ' message
  720.     Spell.Requirement=True ' set ingredient flag
  721.  Endif ' end verify
  722.  If SpellRecord.SpellFlag And Cast.Spell.Type Then ' verify spell
  723.     Outpt=Outpt+"cast spell, " ' message
  724.     Spell.Requirement=True ' set ingredient flag
  725.  Endif ' end verify
  726.  If Spell.Requirement Then ' check ingredient flag
  727.     Outpt=Left$(Outpt,Len(Outpt)-2)+"." ' message
  728.  Else ' check flag
  729.     Outpt="<none>" ' message
  730.  Endif ' end check ingredient flag
  731.  Call IO.O ' send output message
  732. End Sub ' end routine
  733.  
  734.  Rem * This routines displays information on the treasure file.
  735.  Rem * input variables:
  736.  Rem *   Number - the treasure file record.
  737.  
  738. Sub Display.Treasure(Number)
  739.  On Local Error Resume Next ' local error resume
  740.  Graphics.Off=False ' reset color
  741.  Outpt="Treasure number"+Str$(Number)+":" ' treasure number message
  742.  Call IO.O ' send output message
  743.  Graphics.Off=True ' reset color
  744.  Outpt="[A]Treasure name: "+TreasureRecord.TreasureName ' message
  745.  Outpt=Left$(Outpt,40) ' truncate string
  746.  Outpt=Outpt+Space$(40-Len(Outpt)) ' pad with blanks
  747.     Outpt=Outpt+"[U]Treasure is coins: " ' message
  748.  If TreasureRecord.Coin Then ' verify treasure
  749.     Outpt=Outpt+"Yes" ' add to message
  750.  Else ' verify
  751.     Outpt=Outpt+"No" ' add to message
  752.  Endif ' end verify
  753.  Call IO.O ' send output message
  754.  Outpt="[B]Treasure identifier: "+Lcase$(TreasureRecord.ShortName) ' message
  755.  Outpt=Left$(Outpt,40) ' truncate string
  756.  Outpt=Outpt+Space$(40-Len(Outpt)) ' pad with blanks
  757.     Outpt=Outpt+"[V]Treasure is a potion: " ' message
  758.  If TreasureRecord.Potion Then ' verify treasure
  759.     Outpt=Outpt+"Yes" ' add to message
  760.  Else ' verify
  761.     Outpt=Outpt+"No" ' add to message
  762.  Endif ' end verify
  763.  Call IO.O ' send output message
  764.  Outpt="[C]Weight:"+Str$(TreasureRecord.Weight) ' message
  765.  Outpt=Left$(Outpt,40) ' truncate string
  766.  Outpt=Outpt+Space$(40-Len(Outpt)) ' pad with blanks
  767.     Outpt=Outpt+"[W]Treasure is a scroll: " ' message
  768.  If TreasureRecord.Scroll Then ' verify treasure
  769.     Outpt=Outpt+"Yes" ' add to message
  770.  Else ' verify
  771.     Outpt=Outpt+"No" ' add to message
  772.  Endif ' end verify
  773.  Call IO.O ' send output message
  774.  Outpt="[D]Gold coin value:"+Str$(TreasureRecord.Gold) ' message
  775.  Outpt=Left$(Outpt,40) ' truncate string
  776.  Outpt=Outpt+Space$(40-Len(Outpt)) ' pad with blanks
  777.     Outpt=Outpt+"[X]Treasure is invisible: " ' message
  778.  If TreasureRecord.Invisible Then ' verify treasure
  779.     Outpt=Outpt+"Yes" ' add to message
  780.  Else ' verify
  781.     Outpt=Outpt+"No" ' add to message
  782.  Endif ' end verify
  783.  Call IO.O ' send output message
  784.  Outpt="[E]Treasure type: " ' message
  785.  If TreasureRecord.Loadable Then ' check treasure type
  786.     Outpt=Outpt+"Loadable" ' append message
  787.  Else ' check next type
  788.     If TreasureRecord.Launchable Then ' check treasure type
  789.        Outpt=Outpt+"Launchable" ' append message
  790.     Else ' check next type
  791.        Select Case TreasureRecord.Type ' selection of treasure type
  792.        Case False ' verify treasure type
  793.           If TreasureRecord.Plus=False Then ' verify weapon type
  794.              Outpt=Outpt+"Treasure" ' message
  795.           Else ' verify type
  796.              Outpt=Outpt+"Weapon" ' message
  797.           Endif ' end verify treasure type
  798.        Case Is<False ' verify shield type
  799.           Outpt=Outpt+"Shield" ' message
  800.        Case Is>False ' verify armor type
  801.           Outpt=Outpt+"Armor" ' message
  802.        End Select ' end selection of treasure type
  803.     Endif ' end check treasure type
  804.  Endif ' end check treasure type
  805.  Outpt=Left$(Outpt,40) ' truncate string
  806.  Outpt=Outpt+Space$(40-Len(Outpt)) ' pad with blanks
  807.  Outpt=Outpt+"[Y]Treasure is a container: " ' message
  808.  If TreasureRecord.Container Then ' verify treasure
  809.     Outpt=Outpt+"Yes" ' add to message
  810.  Else ' verify
  811.     Outpt=Outpt+"No" ' add to message
  812.  Endif ' end verify
  813.  Call IO.O ' send output message
  814.  Outpt="[F]Hit plus:"+Str$(Abs(TreasureRecord.Plus)) ' message
  815.  Outpt=Left$(Outpt,40) ' truncate string
  816.  Outpt=Outpt+Space$(40-Len(Outpt)) ' pad with blanks
  817.  Outpt=Outpt+"[Z]Container is locked: " ' message
  818.  If TreasureRecord.Locked=1 And TreasureRecord.Closed=1 Then ' verify treasure
  819.     Outpt=Outpt+"Yes" ' add to message
  820.  Else ' verify
  821.     Outpt=Outpt+"No" ' add to message
  822.  Endif ' end verify
  823.  Call IO.O ' send output message
  824.  Outpt="[G]Charges:"+Str$(TreasureRecord.Charges) ' message
  825.  Outpt=Left$(Outpt,40) ' truncate string
  826.  Outpt=Outpt+Space$(40-Len(Outpt)) ' pad with blanks
  827.     Outpt=Outpt+"[1]Treasure key number:"+Str$(TreasureRecord.Keyed) ' message
  828.  Call IO.O ' send output message
  829.  Outpt="[H]Weapon class: " ' message
  830.  ' selection of treasure proficiency type
  831.  Select Case TreasureRecord.Proficiency
  832.  Case Blunt
  833.     Outpt=Outpt+"Blunt" ' message
  834.  Case Pole
  835.     Outpt=Outpt+"Pole" ' message
  836.  Case Sharp
  837.     Outpt=Outpt+"Sharp" ' message
  838.  Case Thrusting
  839.     Outpt=Outpt+"Thrusting" ' message
  840.  Case Else ' other
  841.     Outpt=Outpt+"None" ' message
  842.  End Select ' end selection of weapon proficiency type
  843.  Outpt=Left$(Outpt,40) ' truncate string
  844.  Outpt=Outpt+Space$(40-Len(Outpt)) ' pad with blanks
  845.     Outpt=Outpt+"[2]Treasure is fuel: " ' message
  846.  If TreasureRecord.FuelType=False Then ' verify treasure
  847.     Outpt=Outpt+"No" ' add to message
  848.  Else ' verify
  849.     Outpt=Outpt+"Yes:"+Str$(TreasureRecord.FuelCharges)+" charges" ' message
  850.  Endif ' end verify
  851.  Call IO.O ' send output message
  852.  Outpt="[I]Treasure is permanent: " ' message
  853.  If TreasureRecord.Permanent Then ' verify treasure
  854.     Outpt=Outpt+"Yes" ' add to message
  855.  Else ' verify
  856.     Outpt=Outpt+"No" ' add to message
  857.  Endif ' end verify
  858.  Outpt=Left$(Outpt,40) ' truncate string
  859.  Outpt=Outpt+Space$(40-Len(Outpt)) ' pad with blanks
  860.     Outpt=Outpt+"[3]Weapon rusts: " ' message
  861.  If TreasureRecord.Rustable Then ' verify treasure
  862.     Outpt=Outpt+"Yes:"+Str$(TreasureRecord.RustPercent)+"%"
  863.  Else ' verify
  864.     Outpt=Outpt+"No" ' add to message
  865.  Endif ' end verify
  866.  Call IO.O ' send output message
  867.  Outpt="[J]Treasure is edible: " ' message
  868.  If TreasureRecord.Edible Then ' verify treasure
  869.     Outpt=Outpt+"Yes" ' add to message
  870.  Else ' verify
  871.     Outpt=Outpt+"No" ' add to message
  872.  Endif ' end verify
  873.  Outpt=Left$(Outpt,40) ' truncate string
  874.  Outpt=Outpt+Space$(40-Len(Outpt)) ' pad with blanks
  875.     Outpt=Outpt+"[4]Weapon is stealable: " ' message
  876.  If TreasureRecord.Stealable Then ' verify treasure
  877.     Outpt=Outpt+"Yes:"+Str$(TreasureRecord.StealPercent)+"%"
  878.  Else ' verify
  879.     Outpt=Outpt+"No" ' add to message
  880.  Endif ' end verify
  881.  Call IO.O ' send output message
  882.  Outpt="[K]Treasure is magical: " ' message
  883.  Spell.Number=TreasureRecord.Spell ' store spell number
  884.  If Spell.Number=False Then ' verify treasure
  885.     Outpt=Outpt+"No" ' add to message
  886.  Else ' verify
  887.     ' file bounds
  888.     If Spell.Number>False And _
  889.     Spell.Number<=Lof(SpellFile)/Len(SpellRecord) Then
  890.        Call Read.Record(SpellFile,Spell.Number) ' get spell record
  891.        Outpt=Outpt+"Yes, "+Rtrim$(SpellRecord.SpellName)+" spell" ' message
  892.     Endif ' end check file bounds
  893.  Endif ' end verify
  894.  Call IO.O ' send output message
  895.  Outpt="[L]Treasure is a ring: " ' message
  896.  Select Case TreasureRecord.RingType
  897.  Case 1
  898.     Outpt=Outpt+"protection from poison" ' message
  899.  Case 2
  900.     Outpt=Outpt+"protection from level drain" ' message
  901.  Case 3
  902.     Outpt=Outpt+"protection from spell: " ' message
  903.     Spell.Number=TreasureRecord.RingSpell ' store ring spell number
  904.     If Spell.Number=True Then ' verify treasure
  905.        Outpt=Outpt+"generic spell" ' message
  906.     Else ' verify
  907.        ' file bounds
  908.        If Spell.Number>False And _
  909.        Spell.Number<=Lof(SpellFile)/Len(SpellRecord) Then
  910.           Call Read.Record(SpellFile,Spell.Number) ' get spell record
  911.           Outpt=Outpt+Rtrim$(Lcase$(SpellRecord.SpellName))+" spell" ' message
  912.        Endif ' end check file bounds
  913.     Endif ' end verify
  914.  Case Else ' verify
  915.     Outpt=Outpt+"No" ' add to message
  916.  End Select
  917.  Call IO.O ' send output message
  918.  Outpt="[M]Treasure is a light: " ' message
  919.  If TreasureRecord.LightType=False Then ' verify treasure
  920.     Outpt=Outpt+"No" ' add to message
  921.  Else ' verify
  922.     Outpt=Outpt+"Yes, Charges:"+Str$(TreasureRecord.LightCharges) ' message
  923.  Endif ' end verify
  924.  Call IO.O ' send output message
  925.  Outpt="[N]Treasure is a vehicle: " ' message
  926.  If TreasureRecord.Vehicle=False Then ' verify treasure
  927.     Outpt=Outpt+"No" ' add to message
  928.  Else ' verify
  929.     Outpt=Outpt+"Yes, hits:"+Str$(TreasureRecord.VehicleHits) ' message
  930.  Endif ' end verify
  931.  Call IO.O ' send output message
  932.  Outpt="[O]Treasure loads from devices: " ' message
  933.  If TreasureRecord.Ammunition Then ' verify treasure
  934.     Outpt=Outpt+"Yes" ' add to message
  935.  Else ' verify
  936.     Outpt=Outpt+"No" ' add to message
  937.  Endif ' end verify
  938.  Call IO.O ' send output message
  939.  Outpt="[P]Treasure is loadable: " ' message
  940.  If TreasureRecord.Loadable Then ' verify treasure
  941.     Outpt=Outpt+"Yes: Loads(" ' add to message
  942.     ' store ammunition treasure number
  943.     Treasure.Number=TreasureRecord.AmmoLoads
  944.     If Treasure.Number>False And _
  945.     Treasure.Number<=Lof(TreasureFile)/Len(TreasureRecord) Then ' file bounds
  946.        Call Share.Record(TreasureFile,Number) ' store current treasure record
  947.        Call Read.Record(TreasureFile,Treasure.Number) ' get treasure record
  948.        Outpt=Outpt+Rtrim$(TreasureRecord.TreasureName)+")" ' message
  949.        Call Read.Record(TreasureFile,Number) ' restore treasure record
  950.     Else ' check file bounds
  951.        Outpt=Outpt+"<none>)" ' append message
  952.     Endif ' end check file bounds
  953.  Else ' verify
  954.     Outpt=Outpt+"No" ' add to message
  955.  Endif ' end verify
  956.  Call IO.O ' send output message
  957.  Outpt="[R]Treasure launchs from devices: " ' message
  958.  If TreasureRecord.LaunchAmmo Then ' verify treasure
  959.     Outpt=Outpt+"Yes" ' add to message
  960.  Else ' verify
  961.     Outpt=Outpt+"No" ' add to message
  962.  Endif ' end verify
  963.  Call IO.O ' send output message
  964.  Outpt="[S]Treasure is launchable: " ' message
  965.  If TreasureRecord.Launchable Then ' verify treasure
  966.     Outpt=Outpt+"Yes: Launchs(" ' add to message
  967.     ' store ammunition treasure number
  968.     Treasure.Number=TreasureRecord.LaunchLoads
  969.     If Treasure.Number>False And _
  970.     Treasure.Number<=Lof(TreasureFile)/Len(TreasureRecord) Then ' file bounds
  971.        Call Share.Record(TreasureFile,Number) ' store current treasure record
  972.        Call Read.Record(TreasureFile,Treasure.Number) ' get treasure record
  973.        Outpt=Outpt+Rtrim$(TreasureRecord.TreasureName)+")" ' message
  974.        Call Read.Record(TreasureFile,Number) ' restore treasure record
  975.     Else ' check file bounds
  976.        Outpt=Outpt+"<none>)" ' append message
  977.     Endif ' end check file bounds
  978.  Else ' verify
  979.     Outpt=Outpt+"No" ' add to message
  980.  Endif ' end verify
  981.  Call IO.O ' send output message
  982.  Outpt="[T]Launchable device can be moved: " ' message
  983.  If TreasureRecord.Movable Then ' verify treasure
  984.     Outpt=Outpt+"Yes" ' add to message
  985.  Else ' verify
  986.     Outpt=Outpt+"No" ' add to message
  987.  Endif ' end verify
  988.  Call IO.O ' send output message
  989. End Sub ' end routine
  990.  
  991.  Rem * This routines displays information on the user file.
  992.  Rem * input variables:
  993.  Rem *   Number - the user file record.
  994.  
  995. Sub Display.User(Number)
  996.  On Local Error Resume Next ' local error resume
  997.  Graphics.Off=False ' reset color
  998.  Outpt="User number"+Str$(Number)+"." ' user number message
  999.  Call IO.O ' send output message
  1000.  Graphics.Off=True ' reset color
  1001.  Inpt=UserRecord.CodeName ' store player codename
  1002.  Call Decrypt(Inpt) ' decrypt codename
  1003.  Inpt=Rtrim$(Inpt) ' trim codename
  1004.  Inpt=Lcase$(Inpt) ' lowercase codename
  1005.  Mid$(Inpt,1,1)=Ucase$(Mid$(Inpt,1,1)) ' uppercase first word
  1006.  Outpt="[A]Codename: "+Inpt+" " ' message
  1007.  Inpt=String$(10,Mask$) ' mask passwword
  1008.  If Local.Mode Then ' check console
  1009.     Inpt=UserRecord.PassWord ' store password
  1010.     Call Decrypt(Inpt) ' decrypt password
  1011.     Inpt=Rtrim$(Inpt) ' trim password
  1012.     Inpt=Lcase$(Inpt) ' lowercase password
  1013.  Endif ' end check
  1014.  Outpt=Outpt+"[B]Password: "+Inpt ' message
  1015.  Call IO.O ' send output message
  1016.  Outpt="[C]Level:"+Str$(UserRecord.Level) ' message
  1017.  Call IO.O ' send output message
  1018.  Outpt="[D]" ' set to option
  1019.  Class.Number=UserRecord.ClassType ' store player class type
  1020.  Select Case Class.Number ' selection of class type
  1021.  Case 1 To 10 ' check class type
  1022.     Class.Type$=Class.Name(Class.Number) ' store class name
  1023.  Case Else ' check
  1024.     Class.Type$=Class.Name(1) ' default class name
  1025.  End Select ' end selection of class type
  1026.  Outpt=Outpt+"Class: "+Rtrim$(Class.Type$) ' message
  1027.  Call IO.O ' send output message
  1028.  Outpt="[E]" ' set to option
  1029.  Weapon.Number=UserRecord.Proficiency ' store player proficiency number
  1030.  Select Case Weapon.Number ' selection of proficiency
  1031.  Case 1 To 4 ' check type
  1032.     Weapon.Type$=Weapon.Type.Name(Weapon.Number) ' store proficiency name
  1033.  Case Else ' check
  1034.     Weapon.Type$=Weapon.Type.Name(1) ' default name
  1035.  End Select ' end seelction of proficiency
  1036.  Outpt=Outpt+"Weapon proficiency: "+Rtrim$(Weapon.Type$) ' message
  1037.  Call IO.O ' send output message
  1038.  Outpt="[F]Blunt%:"+Str$(UserRecord.Weapons(1))+" " ' message
  1039.  Outpt=Outpt+"[G]Pole%:"+Str$(UserRecord.Weapons(2)) ' message
  1040.  Call IO.O ' send output message
  1041.  Outpt="[H]Sharp%:"+Str$(UserRecord.Weapons(3))+" " ' message
  1042.  Outpt=Outpt+"[I]Thrusting%:"+Str$(UserRecord.Weapons(4)) ' message
  1043.  Call IO.O ' send output message
  1044.  Outpt="[J]Classname: " ' message
  1045.  Inpt=UserRecord.ClassName
  1046.  Call Decrypt(Inpt)
  1047.  Inpt=Rtrim$(Inpt)
  1048.  Outpt=Outpt+Inpt
  1049.  Call IO.O ' send output message
  1050.  Outpt="[K]Strength:"+Str$(UserRecord.Stats(1)) ' message
  1051.  Call IO.O ' send output message
  1052.  Outpt="[L]Intelligence:"+Str$(UserRecord.Stats(2)) ' message
  1053.  Call IO.O ' send output message
  1054.  Outpt="[M]Wisdom:"+Str$(UserRecord.Stats(3)) ' message
  1055.  Call IO.O ' send output message
  1056.  Outpt="[N]Dexterity:"+Str$(UserRecord.Stats(4)) ' message
  1057.  Call IO.O ' send output message
  1058.  Outpt="[O]Constitution:"+Str$(UserRecord.Stats(5)) ' message
  1059.  Call IO.O ' send output message
  1060.  Outpt="[P]Piety:"+Str$(UserRecord.Stats(6)) ' message
  1061.  Call IO.O ' send output message
  1062.  Outpt="[R]Charisma:"+Str$(UserRecord.Stats(7)) ' message
  1063.  Call IO.O ' send output message
  1064.  Outpt="[S]Experience:"+Str$(UserRecord.Experience) ' message
  1065.  Call IO.O ' send output message
  1066.  Outpt="[T]Gold:"+Str$(UserRecord.Gold) ' message
  1067.  Call IO.O ' send output message
  1068.  Outpt="[U]Room number:"+Str$(UserRecord.Room) ' message
  1069.  Call IO.O ' send output message
  1070.  Outpt="[V]Call restrictions." ' message
  1071.  Call IO.O ' send output message
  1072.  Outpt="[W]Inventory." ' message
  1073.  Call IO.O ' send output message
  1074.  Outpt="[X]Special characters: " ' message
  1075.  Special.Flag=False
  1076.  If UserRecord.Flags And Special.Char1 Then ' verify user
  1077.     Outpt=Outpt+"Town Mayor, " ' message
  1078.     Special.Flag=True
  1079.  Endif ' end verify
  1080.  If UserRecord.Flags And Special.Char2 Then ' verify user
  1081.     Outpt=Outpt+"Governor, " ' message
  1082.     Special.Flag=True
  1083.  Endif ' end verify
  1084.  If UserRecord.Flags And Special.Char3 Then ' verify user
  1085.     Outpt=Outpt+"Guild Master, " ' message
  1086.     Special.Flag=True
  1087.  Endif ' end verify
  1088.  If UserRecord.Flags And Special.Char4 Then ' verify user
  1089.     Outpt=Outpt+"Sysop, " ' message
  1090.     Special.Flag=True
  1091.  Endif ' end verify
  1092.  If Special.Flag Then ' verify user
  1093.     Outpt=Left$(Outpt,Len(Outpt)-2)+"." ' message
  1094.  Else ' verify
  1095.     Outpt=Outpt+"None." ' message
  1096.  Endif ' end verify
  1097.  Call IO.O ' send output message
  1098.  Outpt="[!]Delete user" ' message
  1099.  Call IO.O ' send output message
  1100.  Graphics.Off=False ' reset color
  1101. End Sub ' end routine
  1102.  
  1103.  Rem * routine used by the editor to find monster file number
  1104.  Rem * of a monster name.
  1105.  Rem * output variables:
  1106.  Rem *   Number - record number of monster.
  1107.  Rem * processing variables:
  1108.  Rem *   Inpt - monster name or number to search for.
  1109.  Rem *   Parsed.Value - monster number increment.
  1110.  
  1111. Sub Find.Monster(Number)
  1112.  On Local Error Resume Next ' local error resume
  1113.  Outpt="Monster name, or number" ' input prompt
  1114.  Outpt=Outpt+"(1-"+Mid$(Str$(Lof(MonsterFile)/Len(MonsterRecord)),2)+")? "
  1115.  Call IO.I ' get input
  1116.  If Inpt=Nul Then ' compare input length
  1117.     Number=False ' reset number found
  1118.     Exit Sub ' exit routine
  1119.  Endif ' end compare length
  1120.  Call Parse.Num(Inpt,Parsed.Value) ' parse number
  1121.  Number.Count=False ' reset monster found counter
  1122.  For Number=1 To Lof(MonsterFile)/Len(MonsterRecord) ' loop through monsters
  1123.     Call Read.Record(MonsterFile,Number) ' get monster record
  1124.     ' compare monster record name to input monster name,
  1125.     ' truncated to input length
  1126.     If Left$(MonsterRecord.MonsterName,Len(Inpt))=Inpt Then ' compare
  1127.        Number.Count=Number.Count+1 ' increment monster found counter
  1128.        ' compare parsed number of monster to search for
  1129.        If Parsed.Value=False Or Number.Count=Parsed.Value Then ' compare
  1130.           Exit Sub ' exit routine
  1131.        Endif ' end compare counters
  1132.     Endif ' end compare monster names
  1133.  Next ' end loop through monster file
  1134.  Number=Int(Val(Inpt)) ' convert input to integer
  1135.  If Number<=False Or _
  1136.  Number>Lof(MonsterFile)/Len(MonsterRecord) Then ' file bounds
  1137.     Outpt=Range$ ' make error message
  1138.     Call IO.O ' send error message
  1139.     Number=False ' reset monster found
  1140.  Else ' end check file bounds
  1141.     Call Read.Record(MonsterFile,Number) ' get monster record number
  1142.  Endif ' end check file bounds
  1143. End Sub ' end routine
  1144.  
  1145.  Rem * routine used by the editor to find nonplayer file number
  1146.  Rem * of a nonplayer name.
  1147.  Rem * output variables:
  1148.  Rem *   Number - record number of nonplayer.
  1149.  Rem * processing variables:
  1150.  Rem *   Inpt - nonplayer name or number to search for.
  1151.  Rem *   Parsed.Value - nonplayer number increment.
  1152.  
  1153. Sub Find.Nonplayer(Number)
  1154.  On Local Error Resume Next ' local error resume
  1155.  Outpt="Nonplayer name, or number" ' input prompt
  1156.  Outpt=Outpt+"(1-"+Mid$(Str$(Lof(NonPlayerFile)/Len(MonsterRecord)),2)+")? "
  1157.  Call IO.I ' get input
  1158.  If Inpt=Nul Then ' compare input length
  1159.     Number=False ' reset number found
  1160.     Exit Sub ' exit routine
  1161.  Endif ' end compare length
  1162.  Call Parse.Num(Inpt,Parsed.Value) ' parse number
  1163.  Number.Count=False ' reset nonplayer counter
  1164.  For Number=1 To Lof(NonPlayerFile)/Len(MonsterRecord) ' loop through nonplayers
  1165.     Call Read.Record(NonPlayerFile,Number) ' get nonplayer record
  1166.     ' compare nonplayer record name to input nonplayer name,
  1167.     ' truncated to input length
  1168.     If Left$(MonsterRecord.MonsterName,Len(Inpt))=Inpt Then ' compare
  1169.        Number.Count=Number.Count+1 ' increment nonplayer found counter
  1170.        ' compare parsed number of object to search for
  1171.        If Parsed.Value=False Or Number.Count=Parsed.Value Then ' compare
  1172.           Exit Sub ' exit routine
  1173.        Endif ' end compare counters
  1174.     Endif ' end compare nonplayer names
  1175.  Next ' end loop through nonplayer file
  1176.  Number=Int(Val(Inpt)) ' convert input to integer
  1177.  If Number<=False Or _
  1178.  Number>Lof(NonPlayerFile)/Len(MonsterRecord) Then ' file bounds
  1179.     Outpt=Range$ ' make error message
  1180.     Call IO.O ' send error message
  1181.     Number=False ' reset nonplayer found
  1182.  Else ' end check file bounds
  1183.     Call Read.Record(NonPlayerFile,Number) ' get nonplayer record number
  1184.  Endif ' end check file bounds
  1185. End Sub ' end routine
  1186.  
  1187.  Rem * routine used by the editor to find the object file number
  1188.  Rem * of an object name.
  1189.  Rem * output variables:
  1190.  Rem *   Number - record number of object.
  1191.  Rem * processing variables:
  1192.  Rem *   Inpt - object name or number to search for.
  1193.  Rem *   Parsed.Value - object number increment.
  1194.  
  1195. Sub Find.Objects(Number)
  1196.  On Local Error Resume Next ' local error resume
  1197.  Outpt="Object name, or number" ' make input prompt
  1198.  Outpt=Outpt+"(1-"+Mid$(Str$(Lof(ObjectFile)/Len(ObjectRecord)),2)+")? "
  1199.  Call IO.I ' get input
  1200.  If Inpt=Nul Then ' compare input length
  1201.     Number=False ' reset number found
  1202.     Exit Sub ' exit routine
  1203.  Endif ' end compare length
  1204.  Call Parse.Num(Inpt,Parsed.Value) ' get parsed number
  1205.  Number.Count=False ' reset spell found counter
  1206.  For Number=1 To Lof(ObjectFile)/Len(ObjectRecord) ' loop through object file
  1207.     Call Read.Record(ObjectFile,Number) ' get object record
  1208.     ' compare object record name to input object name,
  1209.     ' truncated to input length
  1210.     If Left$(ObjectRecord.ObjectName,Len(Inpt))=Inpt Then ' compare
  1211.        Number.Count=Number.Count+1 ' increment object counter
  1212.        ' compare parsed number of object to search for
  1213.        If Parsed.Value=False Or Number.Count=Parsed.Value Then ' compare
  1214.           Exit Sub ' exit routine
  1215.        Endif ' end compare counters
  1216.     Endif ' end compare object names
  1217.  Next ' end loop through object file
  1218.  Number=Int(Val(Inpt)) ' convert input to integer
  1219.  If Number<=False Or _
  1220.  Number>Lof(ObjectFile)/Len(ObjectRecord) Then ' file bounds
  1221.     Outpt=Range$ ' make error message
  1222.     Call IO.O ' send error message
  1223.     Number=False ' reset object number to zero
  1224.  Else ' end check file bounds
  1225.     Call Read.Record(ObjectFile,Number) ' get object record number
  1226.  Endif ' end check file bounds
  1227. End Sub ' end routine
  1228.  
  1229.  Rem * routine used by the editor to find the spell file number
  1230.  Rem * of a spell name.
  1231.  Rem * output variables:
  1232.  Rem *   Number - record number of spell.
  1233.  Rem * processing variables:
  1234.  Rem *   Inpt - spell name or number to search for.
  1235.  Rem *   Parsed.Value - spell number increment.
  1236.  
  1237. Sub Find.Spell(Number)
  1238.  On Local Error Resume Next ' local error resume
  1239.  Outpt="Spell name, or number" ' input prompt
  1240.  Outpt=Outpt+"(1-"+Mid$(Str$(Lof(SpellFile)/Len(SpellRecord)),2)+")? "
  1241.  Call IO.I ' get input
  1242.  If Inpt=Nul Then ' check length of input
  1243.     Number=False ' reset number found
  1244.     Exit Sub ' exit routine
  1245.  Endif ' end check length
  1246.  Call Parse.Num(Inpt,Parsed.Value) ' parse out number
  1247.  Number.Count=False ' reset spell found counter
  1248.  For Number=1 To Lof(SpellFile)/Len(SpellRecord) ' loop through spell file
  1249.     Call Read.Record(SpellFile,Number) ' get spell record
  1250.     ' compare spell record name to input spell name, truncated to input length
  1251.     If Left$(SpellRecord.SpellName,Len(Inpt))=Inpt Then ' compare
  1252.        Number.Count=Number.Count+1 ' increment spell found
  1253.        ' compare parsed number of spell to search for
  1254.        If Parsed.Value=False Or Number.Count=Parsed.Value Then ' compare
  1255.           Exit Sub ' exit routine
  1256.        Endif ' end compare counters
  1257.     Endif ' end compare spell names
  1258.  Next ' end loop through spell file
  1259.  Number=Int(Val(Inpt)) ' convert input to integer
  1260.  If Number<=False Or _
  1261.  Number>Lof(SpellFile)/Len(SpellRecord) Then ' compare file bounds
  1262.     Outpt=Range$ ' make error message
  1263.     Call IO.O ' send error message
  1264.     Number=False ' reset return spell number to zero
  1265.  Else ' end compare spell number
  1266.     Call Read.Record(SpellFile,Number) ' get spell record number
  1267.  Endif ' end check file bounds
  1268. End Sub ' end routine
  1269.  
  1270.  Rem * routine used by the editor to find the treasure file number
  1271.  Rem * of a treasure name.
  1272.  Rem * output variables:
  1273.  Rem *   Number - record number of spell.
  1274.  Rem * processing variables:
  1275.  Rem *   Inpt - spell name or number to search for.
  1276.  Rem *   Parsed.Value - spell number increment.
  1277.  
  1278. Sub Find.Treasure(Number)
  1279.  On Local Error Resume Next ' local error resume
  1280.  Outpt="Treasure name, or number" ' input prompt
  1281.  Outpt=Outpt+"(1-"+Mid$(Str$(Lof(TreasureFile)/Len(TreasureRecord)),2)+")? "
  1282.  Call IO.I ' get input
  1283.  If Inpt=Nul Then ' compare input length
  1284.     Number=False ' reset number found
  1285.     Exit Sub ' exit routine
  1286.  Endif ' end compare length
  1287.  Call Parse.Num(Inpt,Parsed.Value) ' parse number
  1288.  Number.Count=False ' reset treasure found counter
  1289.  For Number=1 To Lof(TreasureFile)/Len(TreasureRecord) ' loop through treasure
  1290.     Call Read.Record(TreasureFile,Number) ' get treasure record
  1291.     ' compare treasure record name to input treasure name,
  1292.     ' truncated to input length
  1293.     If Left$(TreasureRecord.TreasureName,Len(Inpt))=Inpt Then ' compare
  1294.        Number.Count=Number.Count+1 ' increment treasure found counter
  1295.        ' compare parsed number of treasure to search for
  1296.        If Parsed.Value=False Or Number.Count=Parsed.Value Then ' compare
  1297.           Exit Sub ' exit routine
  1298.        Endif ' end compare counters
  1299.     Endif ' end compare treasure names
  1300.  Next ' end loop through treasure file
  1301.  Number=Int(Val(Inpt)) ' convert input to integer
  1302.  If Number<=False Or _
  1303.  Number>Lof(TreasureFile)/Len(TreasureRecord) Then ' file bounds
  1304.     Outpt=Range$ ' make error message
  1305.     Call IO.O ' send error message
  1306.     Number=False ' reset treasure found
  1307.  Else ' end check file bounds
  1308.     Call Read.Record(TreasureFile,Number) ' get treasure record number
  1309.  Endif ' end check file bounds
  1310. End Sub ' end routine
  1311.  
  1312.  Rem * routine for player to hold an item of inventory.
  1313.  
  1314. Sub Hold.Object
  1315.  On Local Error Resume Next ' local error resume
  1316.  Call Check.Inventory.Treasure ' check player inventory treasure mneomnic
  1317.  If Index.Number=False Then ' found treasure file index
  1318.     Outpt="You aren't carrying that!" ' make message
  1319.     Call IO.O ' send message
  1320.     Exit Sub ' exit routine
  1321.  Endif ' end compare player inventory
  1322.  If TreasureRecord.Type>False Then ' compare treasure type
  1323.     Outpt="You can't hold that!" ' make message
  1324.     Call IO.O ' send message
  1325.     Exit Sub ' exit routine
  1326.  Endif ' end compare treasure type
  1327.  If TreasureRecord.Loadable Then ' verify treasure type
  1328.     Outpt="You can't hold that!" ' make output message
  1329.     Call IO.O ' send message
  1330.     Exit Sub ' exit routine
  1331.  Endif ' end verify treasure type
  1332.  If TreasureRecord.Launchable Then ' verify treasure type
  1333.     Outpt="You can't hold that!" ' make output message
  1334.     Call IO.O ' send message
  1335.     Exit Sub ' exit routine
  1336.  Endif ' end verify treasure type
  1337.  ' compute treasure charges remaining
  1338.  If UserRecord.Charges(Array.Number)=False Then
  1339.     Outpt="You can't, it has zero charges!" ' make message
  1340.     Call IO.O ' send message
  1341.     Exit Sub ' exit routine
  1342.  Endif ' end compare treasure charges
  1343.  Item.Plus=Abs(TreasureRecord.Plus)
  1344.  Select Case TreasureRecord.Type ' select treasure type
  1345.  Case Is<False ' compare treasure type to shield
  1346.     Weapon3=Item.Plus ' set variable of holding shield plus
  1347.     ' set variable of holding shield of inventory array index
  1348.     Weapon5=Array.Number
  1349.  Case False ' compare treasure type to weapon
  1350.     If Item.Plus=False Then ' verify weapon type
  1351.        Outpt="You can't hold that!" ' make output message
  1352.        Call IO.O ' send message
  1353.        Exit Sub ' exit routine
  1354.     Endif ' end verify weapon type
  1355.     Index.Number=TreasureRecord.Proficiency ' store treasure proficiency
  1356.     If UserRecord.ClassType=Cleric Then ' compare player classtype to cleric
  1357.        Select Case Index.Number ' select treasure proficiency type
  1358.        Case 3 To 4 ' compare to sharp or thrusting
  1359.           Outpt="Clerics may only use blunt or pole type weapons!" ' message
  1360.           Call IO.O ' send message
  1361.           Exit Sub ' exit routine
  1362.        End Select ' end compare weapon proficiency type
  1363.     Endif ' end compare to cleric
  1364.     Weapon2=Item.Plus ' set variable of holding weapon plus
  1365.     ' set variable of holding weapon of inventory array index
  1366.     Weapon6=Array.Number
  1367.     Weapon10=Index.Number ' set variable of holding weapon proficiency type
  1368.  End Select ' end select treasure type
  1369.  Outpt="You hold "+Outpts+"(+"+Mid$(Str$(Item.Plus),2)+")!" ' format message
  1370.  Call IO.O ' send message
  1371. End Sub ' end routine to hold an item
  1372.  
  1373.  Rem * routine for player to wear an item of inventory.
  1374.  
  1375. Sub Wear.Object
  1376.  On Local Error Resume Next ' local error resume
  1377.  Call Check.Inventory.Treasure ' check player inventory treasure mnemonic
  1378.  If Index.Number=False Then ' found treasure index
  1379.     Outpt="You aren't carrying that!" ' make message
  1380.     Call IO.O ' send message
  1381.     Exit Sub ' exit routine
  1382.  Endif ' end compare index
  1383.  If TreasureRecord.Type<=False Then ' commpare treasure type
  1384.     If TreasureRecord.RingType=False Then ' compare ring type
  1385.        Outpt="You can't wear that!" ' make message
  1386.        Call IO.O ' send message
  1387.        Exit Sub ' exit routine
  1388.     Endif ' end compare ring
  1389.  Endif ' end compare treasure type
  1390.  If UserRecord.Charges(Array.Number)=False Then ' compare player charges array
  1391.     Outpt="You can't, it has zero charges!" ' make message
  1392.     Call IO.O ' send message
  1393.     Exit Sub ' exit routine
  1394.  Endif ' end compare charges
  1395.  Item.Plus=Abs(TreasureRecord.Plus) ' store treasure item plus hits
  1396.  Select Case TreasureRecord.Type ' selecct treasure type
  1397.  Case Is>False ' treasure type is armor
  1398.     Weapon1=Item.Plus ' set variable of wearing item to plus
  1399.     ' set variable of wearing item to inventory array index
  1400.     Weapon4=Array.Number
  1401.     Plus$="(+"+Mid$(Str$(Item.Plus),2)+")" ' make plus message
  1402.  Case Else ' treasure type is ring
  1403.     Weapon7=Array.Number ' set wearing ring item to inventory array index
  1404.     Weapon8=TreasureRecord.RingType ' set wearing ring type variable
  1405.     Weapon9=TreasureRecord.RingSpell ' set wearing ring spell type variable
  1406.     Plus$=Nul ' clear plus message
  1407.  End Select ' end select treasure type
  1408.  Outpt="You wear "+Outpts+Plus$+"!" ' format message
  1409.  Call IO.O ' send message
  1410. End Sub ' end routine to wear an item
  1411.  
  1412.  Rem * routine to return an item from being held or worn.
  1413.  
  1414. Sub Return.Object
  1415.  On Local Error Resume Next ' local error resume
  1416.  Call Check.Inventory.Treasure ' check player inventory mnemonic
  1417.  If Index.Number=False Then ' treasure index of item
  1418.     Outpt="You aren't carrying that!" ' make message
  1419.     Call IO.O ' send message
  1420.     Exit Sub ' exit routine
  1421.  Endif ' end compare treasure inventory
  1422.  Outpt="You return "+Outpts+"!" ' format message
  1423.  Select Case Array.Number ' select treasure inventory array variable
  1424.  Case Weapon4 ' compare treasure inventory array to armor variable
  1425.     Weapon1=False ' reset shield holding variable
  1426.     Weapon4=False ' reset shield holding variable
  1427.     Call IO.O ' send message
  1428.  Case Weapon5 ' compare treasure inventory array to shield variable
  1429.     Weapon3=False ' reset shield holding variable
  1430.     Weapon5=False ' reset shield holding variable
  1431.     Call IO.O ' send message
  1432.  Case Weapon6 ' compare treasure inventory array to weapon variable
  1433.     Weapon2=False ' reset shield holding variable
  1434.     Weapon6=False ' reset shield holding variable
  1435.     Weapon10=False ' reset shield holding variable
  1436.     Call IO.O ' send message
  1437.  Case Weapon7 ' compare treasure inventory array to ring variable
  1438.     Weapon7=False ' reset shield holding variable
  1439.     Weapon8=False ' reset shield holding variable
  1440.     Weapon9=False ' reset shield holding variable
  1441.     Call IO.O ' send message
  1442.  Case Else ' no matching variables being held or worn
  1443.     Outpt="Your aren't wearing that!" ' make message
  1444.     Call IO.O ' send message
  1445.  End Select ' end select treasure array variable
  1446. End Sub ' end routine to return item
  1447.  
  1448.  Rem * routine to reset an item with original charges if broken.
  1449.  
  1450. Sub Fix.Object
  1451.  On Local Error Resume Next ' local error resume
  1452.  Call Examine.Treasure ' check treasure mnemonic
  1453.  If Index.Number=False Then ' treasure index
  1454.     Outpt="You can't fix that!" ' make message
  1455.     Call IO.O ' send message
  1456.     Exit Sub ' exit routine
  1457.  Endif ' end check treasure
  1458.  If TreasureRecord.Spell Then ' treasure has spell
  1459.     Outpt="You can't fix that!" ' make message
  1460.     Call IO.O ' send message
  1461.     Exit Sub ' exit routine
  1462.  Endif ' end compare spell
  1463.  If TreasureRecord.Plus=False Then ' treasure is not weapon, armor, shield
  1464.     Outpt="You can't fix that!" ' make message
  1465.     Call IO.O ' send message
  1466.     Exit Sub ' exit routine
  1467.  Endif ' end compare spell
  1468.  If UserRecord.Charges(Array.Number) Then ' check remaining treasure charges
  1469.     Outpt="That's not broken!" ' make message
  1470.     Call IO.O ' send message
  1471.     Exit Sub ' exit routine
  1472.  Endif ' end compare charges
  1473.  If UserRecord.Stats(3)<7 Then ' compute random chance
  1474.     Outpt="You didn't fix it!" ' make message
  1475.     Call IO.O ' send message
  1476.     Exit Sub ' exit routine
  1477.  Endif ' end random chance
  1478.  If Abs(TreasureRecord.Plus)>10 Then ' compare treasure plus
  1479.     Outpt="You didn't fix it!" ' make message
  1480.     Call IO.O ' send message
  1481.     Exit Sub ' exit routine
  1482.  Endif ' end compare plus
  1483.  If Rnd<.5 Then ' random chance
  1484.     Outpt="You didn't fix it!" ' make message
  1485.     Call IO.O ' send message
  1486.     Exit Sub ' exit routine
  1487.  Endif ' end chance
  1488.  Item.Charges=TreasureRecord.Charges ' store treasure maximum charges
  1489.  If Item.Charges>250 Then ' only repair item to maximum of 250 charges
  1490.     Item.Charges=250 ' set storage variable to 250 charges
  1491.  Endif ' end compare charges
  1492.  Select Case Type.Number ' select room or inventory
  1493.  Case 1 ' treasure fixed in room
  1494.     ' reset room treasure charges
  1495.     RoomRecord.TreCharges(Array.Number)=Item.Charges
  1496.     Call Share.Room.Record(Room) ' write room record
  1497.  Case 0 ' treasure fixed in inventory
  1498.     ' reset inventory treasure charges
  1499.     UserRecord.Charges(Array.Number)=Item.Charges
  1500.  End Select ' end treasure fixed charges
  1501.  Outpt="You fix it!" ' make message
  1502.  Call IO.O ' send message
  1503. End Sub ' end fix routine
  1504.  
  1505.  Rem * routine to drink an item.
  1506.  
  1507. Sub Drink.Potion
  1508.  On Local Error Resume Next ' local error resume
  1509.  Call Check.Inventory.Treasure ' check treasure mnemonic
  1510.  If Index.Number=False Then ' inventory treasure index
  1511.     Outpt="You can't drink that!" ' make message
  1512.     Call IO.O ' send message
  1513.     Exit Sub ' exit routine
  1514.  Endif ' end treasure index
  1515.  If TreasureRecord.Potion=False Then ' compare treasure to potion
  1516.     Outpt="That's not a potion!" ' make message
  1517.     Call IO.O ' send message
  1518.     Exit Sub ' exit routine
  1519.  Endif ' end compare potion
  1520.  ' check inventory charges remaining
  1521.  If UserRecord.Charges(Array.Number)=False Then
  1522.     Outpt="You can't, it's empty!" ' make message
  1523.     Call IO.O ' send message
  1524.     Exit Sub ' exit routine
  1525.  Endif ' end compare charges
  1526.  Spell.Number=TreasureRecord.Spell ' get treasure spell number
  1527.  ' check spell file
  1528.  If Spell.Number>False And Spell.Number<=Lof(SpellFile)/Len(SpellRecord) Then
  1529.     Call Read.Record(SpellFile,Spell.Number) ' get spell record
  1530.     ' reduce charges
  1531.     UserRecord.Charges(Array.Number)=UserRecord.Charges(Array.Number)-1
  1532.     Magic.Spell=SpellRecord.SpellType ' store spell type
  1533.     Multiplier=SpellRecord.Level ' store spell level
  1534.     Monster.Number=False ' monster not being attacked
  1535.     Parser=False ' no extra parameters
  1536.     Index.Number=False ' not cast on an object
  1537.     Outpt="You drink "+Outpts+"!" ' format message
  1538.     Call IO.O ' send message
  1539.     Call Magic(True) ' cast the spell
  1540.     Exit Sub ' exit routine
  1541.  Endif ' end check spell file
  1542.  Outpt="You can't drink that!" ' make message
  1543.  Call IO.O ' send message
  1544. End Sub ' end drink potion
  1545.  
  1546.  Rem * routine to eat an item.
  1547.  
  1548. Sub Eat.Object
  1549.  On Local Error Resume Next ' local error resume
  1550.  Call Check.Inventory.Treasure ' check treasure mnemonic
  1551.  If Index.Number=False Then ' inventory treasure index
  1552.     Outpt="You can't eat that!" ' make message
  1553.     Call IO.O ' send message
  1554.     Exit Sub ' exit routine
  1555.  Endif ' end treasure index
  1556.  If TreasureRecord.Edible=False Then ' compare treasure to food
  1557.     Outpt="That's not edible!" ' make message
  1558.     Call IO.O ' send message
  1559.     Exit Sub ' exit routine
  1560.  Endif ' end compare food
  1561.  ' check inventory charges remaining
  1562.  If UserRecord.Charges(Array.Number)=False Then
  1563.     Outpt="You can't, it's been eaten!" ' make message
  1564.     Call IO.O ' send message
  1565.     Exit Sub ' exit routine
  1566.  Endif ' end compare charges
  1567.  Spell.Number=TreasureRecord.Spell ' get treasure spell number
  1568.  ' check spell file
  1569.  If Spell.Number>False And Spell.Number<=Lof(SpellFile)/Len(SpellRecord) Then
  1570.     Call Read.Record(SpellFile,Spell.Number) ' get spell record
  1571.     ' reduce charges
  1572.     UserRecord.Charges(Array.Number)=UserRecord.Charges(Array.Number)-1
  1573.     Magic.Spell=SpellRecord.SpellType ' store spell type
  1574.     Multiplier=SpellRecord.Level ' store spell level
  1575.     Monster.Number=False ' monster not being attacked
  1576.     Parser=False ' no extra parameters
  1577.     Index.Number=False ' not cast on a target
  1578.     Outpt="You eat "+Outpts+"!" ' format message
  1579.     Call IO.O ' send message
  1580.     Call Magic(True) ' cast the spell
  1581.     Exit Sub ' exit routine
  1582.  Endif ' end check spell file
  1583.  Outpt="You can't eat that!" ' make message
  1584.  Call IO.O ' send message
  1585. End Sub ' end eat routine
  1586.  
  1587.  Rem * routine to load device with charges from an item, loads device on
  1588.  Rem * ground or player inventory, removes item from from room or inventory.
  1589.  
  1590. Sub Load.Object
  1591.  On Local Error Resume Next ' local error resume
  1592.  Call Examine.Treasure ' check treasure mnemonic
  1593.  If Index.Number=False Then ' found treasure index
  1594.     Outpt="You can't load that!" ' make message
  1595.     Call IO.O ' send message
  1596.     Exit Sub ' exit routine
  1597.  Endif ' end treasure index
  1598.  Load.Type=False ' set load type flag
  1599.  If TreasureRecord.Loadable=True Then ' treasure can be loaded
  1600.     ' store treasure index which loads device
  1601.     Device.Type=TreasureRecord.AmmoLoads
  1602.     Load.Type=True ' set load type flag
  1603.  Endif ' end compare loaded treasure
  1604.  If TreasureRecord.Launchable=True Then ' treasure can be launched
  1605.     ' store treasure index which launchs item
  1606.     Device.Type=TreasureRecord.LaunchLoads
  1607.     Load.Type=1 ' set load type flag
  1608.  Endif ' end compare launched treasure
  1609.  If Load.Type=False Then ' compare load type flag
  1610.     Outpt="You can't load that!" ' make message
  1611.     Call IO.O ' send message
  1612.     Exit Sub ' exit routine
  1613.  Endif ' end compare load type
  1614.  ' check index bounds
  1615.  If Device.Type<False Or Device.Type>Lof(TreasureFile)/Len(TreasureRecord) Then
  1616.     Outpt="There's no ammunition!" ' make message
  1617.     Call IO.O ' send message
  1618.     Exit Sub ' exit routine
  1619.  Endif ' end check index bounds
  1620.  Charges.Number=False ' set treasure ammunition flag
  1621.  Call Read.Record(TreasureFile,Device.Type) ' get treasure index of ammunition
  1622.  If Load.Type=True Then ' check load type
  1623.     If TreasureRecord.Ammunition Then ' treasure index ammunition found
  1624.        Charges.Number=True ' set treasure ammunition flag
  1625.     Endif ' end compare ammunition index
  1626.  Endif ' end load type
  1627.  If Load.Type=1 Then ' check load type
  1628.     If TreasureRecord.LaunchAmmo Then ' treasure index ammunition found
  1629.        Charges.Number=True ' set treasure ammunition flag
  1630.     Endif ' end compare ammunition index
  1631.  Endif ' end load type
  1632.  If Charges.Number=False Then ' check ammunition flag
  1633.     Outpt="There's no ammunition!" ' make message
  1634.     Call IO.O ' send message
  1635.     Exit Sub ' exit routine
  1636.  Endif ' end check ammunition
  1637.  Ammo.Used=False ' set ammunition used flag
  1638.  For Inventory.Number=1 To 20 ' loop through all player inventory
  1639.     ' compare inventory index to ammo index
  1640.     If Device.Type=UserRecord.Inv(Inventory.Number) Then
  1641.        ' remove ammo from inventory
  1642.        Call Discard.Inventory(Inventory.Number,True)
  1643.        Ammo.Used=True ' set ammunition used flag
  1644.        Exit For ' exit loop to find ammo index
  1645.     Endif ' end compare inventory index
  1646.  Next ' end loop to find ammo index
  1647.  If Ammo.Used=False Then ' check ammunition used flag
  1648.     For Inventory.Number=1 To 20 ' loop through all room inventory
  1649.        ' compare room inventory to
  1650.        If Device.Type=RoomRecord.Treasure(Inventory.Number) Then
  1651.           ' ammo index, remove room ammo
  1652.           Call Discard.Room.Treasure(Inventory.Number)
  1653.           Ammo.Used=True ' set ammunition used flag
  1654.           Exit For ' exit loop to find ammo index
  1655.        Endif ' end compare inventory index
  1656.     Next ' end loop to find ammo index
  1657.  Endif ' end ammunition used flag
  1658.  If Ammo.Used=False Then ' check ammunition used flag
  1659.     Outpt="There's no ammunition!" ' make message
  1660.     Call IO.O ' send message
  1661.     Exit Sub ' exit routine
  1662.  Endif ' end check ammunition used flag
  1663.  Device.Loaded=False ' set ammunition loaded flag
  1664.  Select Case Type.Number ' select room or inventory
  1665.  Case 0 ' treasure loaded in player inventory
  1666.     ' store increment charges
  1667.     Device.Charges=UserRecord.Charges(Array.Number)+1
  1668.     If Device.Charges>10 Then ' compare to maximum charges
  1669.        Device.Loaded=True ' set ammunition loaded flag
  1670.     Else ' compare less than maximum
  1671.        UserRecord.Charges(Array.Number)=Device.Charges ' increment charges
  1672.     Endif ' end compare maximum charges
  1673.  Case 1 ' treasure loaded in room inventory
  1674.     ' store increment charges
  1675.     Device.Charges=RoomRecord.TreCharges(Array.Number)+1
  1676.     If Device.Charges>10 Then ' compare to maximum charges
  1677.        Device.Loaded=True ' set ammunition loaded flag
  1678.     Else ' compare less than maximum
  1679.        RoomRecord.TreCharges(Array.Number)=Device.Charges ' increment charges
  1680.     Endif ' end compare maximum charges
  1681.     Call Share.Room.Record(Room) ' write room record
  1682.  End Select ' end compare inventory to load
  1683.  If Device.Loaded Then ' compare ammunition loaded flag
  1684.     Outpt="The device can't load that much!" ' make message
  1685.  Else ' ammunition loaded
  1686.     Outpt="You load the device!" ' make message
  1687.  Endif ' end compare ammunition loaded flag
  1688.  Call IO.O ' send message
  1689. End Sub ' end routine to load ammunition to an item
  1690.  
  1691.  Rem * routine to fire a device at a monster in room, device explodes in
  1692.  Rem * player by chance, device discharges harmlessly.
  1693.  
  1694. Sub Fire.Object
  1695.  On Local Error Resume Next ' local error resume
  1696.  Call Find.Inventory ' check player inventory for mnemonic of device to fire
  1697.  If Index.Number=False Then ' found treasure index to player inventory
  1698.     Outpt="You can't fire that!" ' make message
  1699.     Call IO.O ' send message
  1700.     Exit Sub ' exit routine
  1701.  Endif ' end check treasure index
  1702.  If TreasureRecord.Loadable=False Then ' check device can be loaded
  1703.     Outpt="You can't fire that!" ' make message
  1704.     Call IO.O ' send message
  1705.     Exit Sub ' exit routine
  1706.  Endif ' end compare device
  1707.  If TreasureRecord.AmmoLoads=False Then ' check item which loads device
  1708.     Outpt="It's not loaded with ammunition!" ' make message
  1709.     Call IO.O ' send message
  1710.     Exit Sub ' exit routine
  1711.  Endif ' end compare device
  1712.  Call Read.Record(TreasureFile,TreasureRecord.AmmoLoads) ' get record ammo used
  1713.  If TreasureRecord.Ammunition=False Then ' item which loads device is nto ammo
  1714.     Outpt="It's not loaded with ammunition!" ' make message
  1715.     Call IO.O ' send message
  1716.     Exit Sub ' exit routine
  1717.  Endif ' end compare device
  1718.  ' read treasure record index of device to fire
  1719.  Call Read.Record(TreasureFile,Index.Number)
  1720.  If Parser=False Then ' check second parameter of monster to fire at
  1721.     Outpt="Fire at what?" ' make message
  1722.     Call IO.O ' send message
  1723.     Exit Sub ' exit routine
  1724.  Endif ' end compare monster
  1725.  ' compare remaining charges in device
  1726.  If UserRecord.Charges(Array.Number)=False Then
  1727.     Outpt="It's not loaded!" ' make message
  1728.     Call IO.O ' send message
  1729.     Exit Sub ' exit routine
  1730.  Endif ' end compare device
  1731.  ' decrement charges
  1732.  UserRecord.Charges(Array.Number)=UserRecord.Charges(Array.Number)-1
  1733.  Parsed.Command1=Parsed.Command2 ' get second parameter of monster
  1734.  Call Numeric ' parse out temp variable
  1735.  If Rnd<.2 Then ' compute random chance
  1736.     Outpt="Bang! The ammunition explodes in your face!" ' device backfires
  1737.     Call IO.O ' send message
  1738.     Outpt="The device hits you for" ' string preceding points hit on player
  1739.     Hits#=Cdbl(Int(Rnd*Abs(TreasureRecord.Plus)+1)) ' calculate random hits
  1740.     Call Hit.Player(Hits#) ' routine to get hits on player
  1741.     Exit Sub ' exit routine
  1742.  Endif ' end random chance
  1743.  If Rnd<.2 Then ' random chance
  1744.     Outpt="The device fires harmlessly!" ' make message
  1745.     Call IO.O ' send message
  1746.     Exit Sub ' exit routine
  1747.  Endif ' end random chance
  1748.  Treasure.Name$=TreasureRecord.ShortName ' store treasure name being fired
  1749.  Treasure.Name$=Rtrim$(Treasure.Name$) ' strip trailing blanks
  1750.  Treasure.Name$=Lcase$(Treasure.Name$) ' format to lower case
  1751.  Call Check.Monster ' find monster being fired at in parsed string
  1752.  If Monster.Number Then ' monster found from second parameter
  1753.     Outpts=MonsterArray(Monster.Number).MonsterName ' store monster name
  1754.     Outpts=Rtrim$(Outpts) ' strip trailing blanks
  1755.     Outpts=Lcase$(Outpts) ' format to lower case
  1756.     Outpt="You fire the "+Treasure.Name$+" at the "+Outpts+"!" ' format message
  1757.     Call IO.O ' send message
  1758.     Multiplier=Abs(TreasureRecord.Plus) ' calculate hits on monster multiplier
  1759.     Call Hit.Monster ' routine to attack monster in Monster.Number
  1760.     Exit Sub ' exit routine
  1761.  Endif ' end compare monster to fire at
  1762.  Outpt="The device fires into empty air!" ' make message
  1763.  Call IO.O ' send message
  1764. End Sub ' end routine to fire a device at a monster
  1765.  
  1766.  Rem * dm/sysop routine to get an item from treasure or object files and
  1767.  Rem * add to room, interactive function during remote logon also.
  1768.  
  1769. Sub Drop.Object
  1770.  On Local Error Resume Next ' local error resume
  1771.  Parsed.Command1=Stored.Parsed.Command2 ' get entire second half of command
  1772.  Call Numeric ' parse temp variable
  1773.  Inpt=Parsed.Command1 ' put full name of item in variable
  1774.  Inpt=Lcase$(Inpt) ' convert to lower case
  1775.  Call Drop(True) ' routine to put item name in room
  1776. End Sub ' end dm/sysop drop routine
  1777.  
  1778.  Rem * routine to bless an object by increasing the magical charges.
  1779.  
  1780. Sub Bless.Object
  1781.  On Local Error Resume Next ' local error resume
  1782.  If Normal.User Then ' check player is normal player
  1783.     If UserRecord.ClassType<>Cleric Then ' compare player class type to cleric
  1784.        Outpt="Only clerics can bless!" ' make message
  1785.        Call IO.O ' send message
  1786.        Exit Sub ' exit routine
  1787.     Endif ' end compare class type
  1788.  Endif ' end compare player type
  1789.  Call Examine.Treasure ' check treasure mnemonic
  1790.  If Index.Number Then ' found treasure index
  1791.     Charges.Number=TreasureRecord.Spell ' store treasure spell type
  1792.     If Charges.Number=False Then ' compare treasure spell type
  1793.        Outpt="You can't bless that!" ' make message
  1794.        Call IO.O ' send message
  1795.        Exit Sub ' exit routine
  1796.     Endif ' end compare treasure type
  1797.     ' check file bounds
  1798.     If Charges.Number>False And _
  1799.     Charges.Number<Lof(SpellFile)/Len(SpellRecord) Then
  1800.        ' read spell record from treasure index
  1801.        Call Read.Record(SpellFile,Charges.Number)
  1802.        If SpellRecord.SpellType=4 Then ' compare spell to wish
  1803.           Outpt="You can't bless that!" ' make message
  1804.           Call IO.O ' send message
  1805.           Exit Sub ' exit routine
  1806.        Endif ' and compare spell
  1807.        Object.Blessed=False ' set object blessed flag
  1808.        Max.Charges=TreasureRecord.Charges ' store maximum charges
  1809.        Select Case Type.Number ' select room or inventory
  1810.        Case 0 ' bless item in player inventory
  1811.           ' get incremented charges
  1812.           Type.Charges=UserRecord.Charges(Array.Number)+1
  1813.           If Type.Charges>Max.Charges Then ' compare maximum charges
  1814.              Object.Blessed=True ' set bless flag
  1815.           Else ' compare charges
  1816.              ' set incremented charges
  1817.              UserRecord.Charges(Array.Number)=Type.Charges
  1818.           Endif ' end compare maximum charges
  1819.        Case 1 ' bless item in room inventory
  1820.           ' get incremented charges
  1821.           Type.Charges=RoomRecord.TreCharges(Array.Number)+1
  1822.           If Type.Charges>Max.Charges Then ' compare maximum charges
  1823.              Object.Blessed=True ' set bless flag
  1824.           Else ' compare charges
  1825.              ' set incremented charges
  1826.              RoomRecord.TreCharges(Array.Number)=Type.Charges
  1827.              Call Share.Room.Record(Room) ' write room record
  1828.           Endif ' end compare maximum charges
  1829.        End Select ' end inventory type
  1830.        If Object.Blessed Then ' compare bless flag
  1831.           Outpt="Nothing happens!" ' make message
  1832.        Else ' compare bless flag
  1833.           Outpt="You bless it!" ' make message
  1834.        Endif ' end compare flag
  1835.        Call IO.O ' send message
  1836.        Exit Sub ' exit routine
  1837.     Endif
  1838.  Endif
  1839.  Outpt="You can't bless that!" ' make message
  1840.  Call IO.O ' send message
  1841. End Sub ' end routine to bless an object
  1842.  
  1843.  Rem * routine to curse a monster by decreasing hits.
  1844.  
  1845. Sub Curse.Object
  1846.  On Local Error Resume Next ' local error resume
  1847.  If Normal.User Then ' check player type
  1848.     If UserRecord.ClassType<>Cleric Then ' check player class type to cleric
  1849.        Outpt="Only clerics can curse!" ' make message
  1850.        Call IO.O ' send message
  1851.        Exit Sub ' exit routine
  1852.     Endif ' end compare class type
  1853.  Endif ' end compare player type
  1854.  Call Check.Monster ' search for monster parameter
  1855.  If Monster.Number Then ' index found to monster array
  1856.     Outpts=MonsterArray(Monster.Number).MonsterName ' store full monster name
  1857.     Outpts=Rtrim$(Outpts) ' strip trailing blanks
  1858.     Outpts=Lcase$(Outpts) ' convert to lower case
  1859.     Outpt="You curse the "+Outpts+"!" ' format message
  1860.     Call IO.O ' send message
  1861.     Multiplier=Int(UserRecord.Stats(6)/2) ' compute hits on monster multiplier
  1862.     Call Hit.Monster ' routine to attack a monster
  1863.     Exit Sub ' exit routine
  1864.  Endif ' end get monster index
  1865.  Outpt="You can't curse that!" ' make message
  1866.  Call IO.O ' send message
  1867. End Sub ' end routine to curse a monster
  1868.  
  1869.  Rem * routine to bless player (bless without parameter).
  1870.  
  1871. Sub Bless.Self
  1872.  On Local Error Resume Next ' local error resume
  1873.  If Normal.User Then ' check player type
  1874.     If UserRecord.ClassType<>Cleric Then ' check player class type
  1875.        Outpt="Only clerics can bless!" ' message for clerics only
  1876.        Call IO.O ' send message
  1877.        Exit Sub ' exit routine
  1878.     Endif ' end compare class type
  1879.  Endif ' end compare player type
  1880.  Type.Charges=UserRecord.Stats(6)+1 ' store incremented piety
  1881.  If Type.Charges>MaxStat Then ' compare to maximum piety
  1882.     Outpt="Nothing happens!" ' make message
  1883.     Call IO.O ' send message
  1884.     Exit Sub ' exit routine
  1885.  Endif ' end compare piety
  1886.  UserRecord.Stats(6)=Type.Charges ' update new piety
  1887.  Outpt="You feel a glow about you!" ' make message
  1888.  Call IO.O ' send message
  1889.  Outpt="Your piety is now"+Str$(Type.Charges)+"!" ' format message
  1890.  Call IO.O ' send message
  1891. End Sub ' end routine to bless self
  1892.  
  1893. Rem * routine to curse player (curse without parameter).
  1894.  
  1895. Sub Curse.Self
  1896.  On Local Error Resume Next ' local error resume
  1897.  If Normal.User Then ' check player type
  1898.     If UserRecord.ClassType<>Cleric Then ' check player class type
  1899.        Outpt="Only clerics can curse!" ' make message
  1900.        Call IO.O ' send message
  1901.        Exit Sub ' exit routine
  1902.     Endif ' end compare class type
  1903.  Endif ' end compare player type
  1904.  Type.Charges=UserRecord.Stats(6)-1 ' store decremented piety
  1905.  If Type.Charges<=False Then ' compare to minimum piety
  1906.     Outpt="Nothing happens!" ' make message
  1907.     Call IO.O ' send message
  1908.     Exit Sub ' exit routine
  1909.  Endif ' end compare piety
  1910.  UserRecord.Stats(6)=Type.Charges ' set new piety
  1911.  Outpt="You feel a darkening about you!" ' make message
  1912.  Call IO.O ' send message
  1913.  Outpt="Your piety is now"+Str$(Type.Charges)+"!" ' format message
  1914.  Call IO.O ' send message
  1915. End Sub ' end routine to curse self
  1916.  
  1917.  Rem * routine to move a lanuch type object to a nearby room and move player
  1918.  Rem * to room also, verify room traps.
  1919.  
  1920. Sub Move.Object
  1921.  On Local Error Resume Next ' local error resume
  1922.  Call Parse ' parse out parameters
  1923.  If Parser Then ' check for first parameter
  1924.     Call Numeric '  parse temp variable from first parameter
  1925.  Endif ' end check parameter
  1926.  Call Examine.Treasure ' check treasure mnemonic in inventory or room
  1927.  If Index.Number=False Then ' locate treasure index
  1928.     Outpt="You can't move that!" ' make message
  1929.     Call IO.O ' send message
  1930.     Exit Sub ' exit routine
  1931.  Endif ' end compare treasure
  1932.  If TreasureRecord.Movable=False Then ' compare treasure can be moved
  1933.     Outpt="You can't move that!" ' make message
  1934.     Call IO.O ' send message
  1935.     Exit Sub ' exit routine
  1936.  Endif ' end compare treasure
  1937.  If TreasureRecord.Launchable=False Then ' compare treasure can be launched
  1938.     Outpt="You can't move that!" ' make message
  1939.     Call IO.O ' send message
  1940.     Exit Sub ' exit routine
  1941.  Endif ' end compare treasure
  1942.  If Parser=False Then ' compare parameter parsed
  1943.     Outpt="Move which direction?" ' no direction specified
  1944.     Call IO.O ' send message
  1945.     Exit Sub ' exit routine
  1946.  Endif ' end check parse
  1947.  Treasure.Name$=Outpts ' store full treasure name to be moved
  1948.  Item.Number=Array.Number ' store treasure index to array
  1949.  Item.Charges=Charges.Number ' store treasure charges
  1950.  Item.Index=Index.Number ' store treasure index to file
  1951.  User.Command=Parsed.Command2 ' get second parameter
  1952.  Call Get.Direction(Direction.Number) ' compare moving parameter to direction
  1953.  If Direction.Number Then ' direction found flag set
  1954.     Next.Room=RoomRecord.Direct(Direction.Number) ' get room number direction
  1955.     If Next.Room=False Then ' compare room number
  1956.        Outpt="You can't move it there!" ' make message
  1957.        Call IO.O ' send message
  1958.        Exit Sub ' exit routine
  1959.     Endif ' end compare room number
  1960.  Else ' no direction flag set, check for moving through an object
  1961.     Parsed.Command1=User.Command ' get second parameter
  1962.     Call Check.Room.Objects ' check with mnemonic name of object in room
  1963.     If Index.Number=False Then ' check object index
  1964.        Outpt="You can't move it there!" ' make message
  1965.        Call IO.O ' send message
  1966.        Exit Sub ' exit routine
  1967.     Endif ' end compare room object
  1968.     If ObjectRecord.RoomLink=False Then ' verify room object links to room
  1969.        Outpt="You can't move it there!" ' make message
  1970.        Call IO.O ' send message
  1971.        Exit Sub ' exit routine
  1972.     Endif ' end compare object is a portal
  1973.     If ObjectRecord.JailTrap Then ' verify room is trapped
  1974.        Outpt="Trapped portal!" ' make message
  1975.        Call IO.O ' send message
  1976.        Exit Sub ' exit routine
  1977.     Endif ' end compare room trap
  1978.     If ObjectRecord.Closed Then ' compare room closed
  1979.        If Pass.Door=False Then ' check is passdoor spell cast
  1980.           Outpt="You can't, it's closed!" ' make message
  1981.           Call IO.O ' send message
  1982.           Exit Sub ' exit routine
  1983.        Endif ' end cmpare passdoor
  1984.     Endif ' end compare object closed
  1985.     If ObjectRecord.Relocks Then ' object portal closes after entry
  1986.        ObjectRecord.DoorLock=2 ' set object portal lock
  1987.        ObjectRecord.Closed=True ' set object portal closed
  1988.        Call SHare.Record(ObjectFile,Index.Number) ' write object record
  1989.     Endif ' end compare relocking object portal
  1990.     Pass.Door=False ' reset passdoor spell
  1991.     Next.Room=ObjectRecord.RoomLink ' get room number to enter portal
  1992.  Endif ' end compare move to a direction or to a portal
  1993.  Swap Room,Next.Room ' interchange current room with next room to move item
  1994.  Call Read.Room.Record(Room) ' read next room to move item to room file
  1995.  ' routine to add room item
  1996.  Call Add.Room.Treasure(Item.Index,Item.Charges,False,Item.Added)
  1997.  Swap Room,Next.Room ' interchange current room with next room
  1998.  Call Read.Room.Record(Room) ' read current room record
  1999.  If Item.Added Then ' add item to room flag
  2000.     Select Case Type.Number ' select room or inventory
  2001.     Case 0 ' treasure moved from player inventory
  2002.        Call Discard.Inventory(Item.Number,True) ' remove item from inventory
  2003.     Case 1 ' treasure moved from room
  2004.        Call Discard.Room.Treasure(Item.Number) ' remove item from room
  2005.     End Select ' end compare treasure moved
  2006.     Outpt="You move "+Treasure.Name$+"!" ' format message
  2007.     Call IO.O ' send message
  2008.     Call Enter.Room ' move player to next room
  2009.     Exit Sub ' exit routine
  2010.  Endif ' end locate empty room inventory
  2011.  Outpt="You can't move it there!" ' make message
  2012.  Call IO.O ' send message
  2013. End Sub ' end routine to move an item
  2014.  
  2015.  Rem * routine to launch an item in a specific direction to smash through
  2016.  Rem * a random amount of object portal locks connected through successive
  2017.  Rem * rooms, or to launch a weapon at a monster.
  2018.  
  2019. Sub Launch.Object
  2020.  On Local Error Resume Next ' local error resume
  2021.  Call Parse ' get first parameter
  2022.  If Parser Then ' found parameter
  2023.     Call Numeric ' parse number after # sign
  2024.  Endif ' end compare parse
  2025.  Call Examine.Treasure ' check treasure mnemonic to room or player inventory
  2026.  If Index.Number=False Then ' treasure index not found
  2027.     Outpt="You can't launch that!" ' make message
  2028.     Call IO.O ' send message
  2029.     Exit Sub ' exit routine
  2030.  Endif ' end compare index
  2031.  If TreasureRecord.Launchable=False Then ' check if treasure can be launched
  2032.     Outpt="That's not a launchable device!" ' make message
  2033.     Call IO.O ' send message
  2034.     Exit Sub ' exit routine
  2035.  Endif ' end compare item to launch
  2036.  If Parser=False Then ' compare second parameter
  2037.     Outpt="Launch where?" ' make message
  2038.     Call IO.O ' send message
  2039.     Exit Sub ' exit routine
  2040.  Endif ' end compare second parameter
  2041.  Item.Launched=False ' item was launched flag
  2042.  Item.Type=Type.Number ' store inventory type
  2043.  Item.Index=Array.Number ' store launched item index to array
  2044.  Item.Charges=Charges.Number ' store launched item charges
  2045.  If Charges.Number=False Then ' compare remaining charges in device
  2046.     Outpt="You can't, it's not loaded!" ' make message
  2047.     Call IO.O ' send message
  2048.     Exit Sub ' exit routine
  2049.  Endif ' end compare device
  2050.  If Item.Charges>10 Then ' compare device charges
  2051.     Item.Charges=10 ' reset maximum charges
  2052.  Endif ' end compare device
  2053.  Launch.Number=False ' variable of number of loads launched
  2054.  Treasure.Name$=TreasureRecord.ShortName ' store name of device
  2055.  Treasure.Name$=Rtrim$(Treasure.Name$) ' strip trailing blanks
  2056.  Treasure.Name$=Lcase$(Treasure.Name$) ' convert to lower case
  2057.  User.Command=Parsed.Command2 ' get second parameter
  2058.  Parsed.Command1=User.Command ' store parameter
  2059.  Call Get.Direction(Direction.Number) ' determine direction to launch at
  2060.  If Direction.Number Then ' returned variable contains direction number
  2061.     Next.Room=RoomRecord.Direct(Direction.Number) ' get next room direction
  2062.     If Next.Room=False Then ' compare room number
  2063.        Outpt="You can't launch at that!" ' make message
  2064.        Call IO.O ' send message
  2065.        Exit Sub ' exit routine
  2066.     Endif ' end compare room number
  2067.     Item.Launched=True ' set item is launched flag
  2068.     Outpts=Direction(Direction.Number) ' store direction name
  2069.     Outpts=Rtrim$(Outpts) ' strip trailing blanks
  2070.     Outpts=Lcase$(Outpts) ' convert to lower case
  2071.     Outpt="You launch the "+Treasure.Name$+" "+Outpts+"!" ' format message
  2072.     Call IO.O ' send message
  2073.     ' loop through all charges in device to launch
  2074.     For Launchs=1 To Item.Charges
  2075.        Graphics.Off=False ' color normal
  2076.        Outpt="For launch"+Str$(Launchs)+";" ' format message of launch number
  2077.        Call IO.O ' send message
  2078.        Launch.Number=Launch.Number+1 ' increment number of launches
  2079.        Graphics.Off=True ' color white
  2080.        Outpt="The device launchs: " ' message
  2081.        Carriage.Return=True ' suppress cr/lf
  2082.        Call IO.O ' send message
  2083.        Outpt=Outpts+", " ' first direction device launches
  2084.        Carriage.Return=True ' suppress cr/lf
  2085.        Call IO.O ' send direction message
  2086.        Locks.Smashed=False ' counter of number of locks smashed
  2087.        Chained.Rooms=False ' number of rooms chained to
  2088.        Call Chain.Rooms(Next.Room,Room) ' routine to send launched item
  2089.        Outpt="and stopped!" ' trailing message
  2090.        Call IO.O ' send message
  2091.     Next ' end loop through all device launch charges
  2092.     If Locks.Smashed=False Then ' compare number of locks smashed
  2093.        Outpt="You didn't smash anything!" ' make message
  2094.     Else ' compare lock number
  2095.        Outpt="You smashed open" ' format message
  2096.        Outpt=Outpt+Str$(Locks.Smashed) ' with number of locks smashed
  2097.        If Locks.Smashed=1 Then ' compare number
  2098.           Outpt=Outpt+" lock.." ' append message
  2099.        Else ' compare number
  2100.           Outpt=Outpt+" locks!" ' append message
  2101.        Endif ' end compare
  2102.     Endif ' end compare number
  2103.     Call IO.O ' send message
  2104.     Graphics.Off=False ' color normal
  2105.     Call Read.Room.Record(Room) ' read current room record
  2106.  Else ' verify monster to launch at
  2107.     Call Check.Monster ' find monster mnemonic to launch device at
  2108.     If Monster.Number Then ' found monster variable indexed to array
  2109.        Multiplier=Abs(TreasureRecord.Plus) ' compute attack multiplier
  2110.        ' store full monster name
  2111.        Outpts=MonsterArray(Monster.Number).MonsterName
  2112.        Outpts=Rtrim$(Outpts) ' strip trailing blanks
  2113.        Outpts=Lcase$(Outpts) ' convert to lower case
  2114.        Outpt="You launch "+Treasure.Name$+" at the "+Outpts+"!" ' make message
  2115.        Call IO.O ' send message
  2116.        Item.Launched=True ' set item is launched flag
  2117.        Graphics.Off=True ' color white
  2118.        ' loop through all charges in device to launch
  2119.        For Launchs=1 To Item.Charges
  2120.           ' format message of launch number
  2121.           Outpt="For launch"+Str$(Launchs)+";"
  2122.           Call IO.O ' send message
  2123.           Launch.Number=Launch.Number+1 ' increment number of launches
  2124.           Call Attack.Monster ' routine to hit monster
  2125.           Call Check.Monster ' reverify monster being attacked
  2126.           If Monster.Number=False Then ' monster is not found
  2127.              Exit For ' exit device launch loop
  2128.           Endif ' end compare monster
  2129.        Next ' end loop through all device launch charges
  2130.        Graphics.Off=False ' color normal
  2131.     Endif ' end find monster
  2132.  Endif ' end compare launch direction or monster
  2133.  If Item.Launched=False Then ' device was launched flag
  2134.     Outpt="You can't launch at that!" ' make message
  2135.     Call IO.O ' send message
  2136.     Exit Sub ' exit routine
  2137.  Endif ' end compare if launched
  2138.  If Item.Type=False Then ' device launched from player inventory
  2139.     ' compute loads launched decrement
  2140.     Total.Charges=UserRecord.Charges(Item.Index)-Launch.Number
  2141.     If Total.Charges<False Then ' compare lower limit
  2142.        Total.Charges=False ' set lower limit
  2143.     Endif ' end compare limit
  2144.     UserRecord.Charges(Item.Index)=Total.Charges ' store inventory charges
  2145.  Else ' device lanuched from room
  2146.     ' compute loads launched decrement
  2147.     Total.Charges=RoomRecord.TreCharges(Item.Index)-Launch.Number
  2148.     If Total.Charges<False Then ' compare lower limit
  2149.        Total.Charges=False ' set lower limit
  2150.     Endif ' end compare limit
  2151.     RoomRecord.TreCharges(Item.Index)=Total.Charges ' store room charges
  2152.     Call Share.Room.Record(Room) ' write room record
  2153.  Endif ' end compare launched from
  2154. End Sub ' end routine to launch an item from a device
  2155.  
  2156.  Rem * routine to recursively enter rooms by nearby room links, smashing a
  2157.  Rem * random number of portals.
  2158.  
  2159. Sub Chain.Rooms(Chain.Room!,Previous.Room!)
  2160.  ' Chain.Room! is a passed parameter of the next room to access.
  2161.  ' Previous.Room! stores the called room number to be restored upon exit.
  2162.  On Local Error Resume Next ' local error resume
  2163.  Call Read.Room.Record(Chain.Room!) ' get next chained to room
  2164.  For Array.Number=1 To 20 ' loop through all objects in room
  2165.     Object.Number=RoomRecord.Object(Array.Number) ' get object index to file
  2166.     ' check object file bounds
  2167.     If Object.Number>False And _
  2168.     Object.Number<=Lof(ObjectFile)/Len(ObjectRecord) Then
  2169.        Call Read.Record(ObjectFile,Object.Number) ' get the object record
  2170.        If ObjectRecord.DoorLock=2 Then ' check if object is locked
  2171.           If Rnd>.66 Then ' compute random chance
  2172.              Locks.Smashed=Locks.Smashed+1 ' increment locks smashed counter
  2173.              ObjectRecord.DoorLock=1 ' set object unlocked
  2174.              ObjectRecord.Closed=False ' set object to open
  2175.              Call SHare.Record(ObjectFile,Object.Number) ' write object record
  2176.           Endif ' end random chance
  2177.        Endif ' end compare object lock
  2178.     Endif ' end end object bounds
  2179.  Next ' end loop through all objects
  2180.  For Direction.Number=1 to 12 ' loop through all directions in chained to room
  2181.     Next.Room=RoomRecord.Direct(Direction.Number) ' get the room number of the
  2182.     If Next.Room Then ' direction and compare to
  2183.        If Next.Room<>Previous.Room! Then ' the current room in routine
  2184.           If Rnd>.66 Then ' compute random chance
  2185.              If Chained.Rooms<5 Then ' compare to maximum of 5 recursive calls
  2186.                 Carriage.Return=True ' suppress cr/lf
  2187.                 Outpt=Direction(Direction.Number) ' get direction name
  2188.                 Outpt=Rtrim$(Outpt)+", " ' format message
  2189.                 Call IO.O ' send message
  2190.                 ' increment number of recursively chained rooms
  2191.                 Chained.Rooms=Chained.Rooms+1
  2192.                 Call Chain.Rooms(Next.Room,Chain.Room!) ' routine calls self tp
  2193.                 Call Read.Room.Record(Chain.Room!) 'next room get previous room
  2194.                 Exit Sub ' exit routine (recursively exiting previous calls)
  2195.              Endif ' end compare maximum
  2196.           Endif ' end random chance
  2197.        Endif ' end compare to current room
  2198.     Endif ' end compare next direction
  2199.  Next ' end loop through all directions in called room (exit recursively)
  2200. End Sub ' end routine to recursively loop through all objects in neraby rooms
  2201.  
  2202.  Rem * routine for player to steal an item from a monster.
  2203.  
  2204. Sub Steal.Object
  2205.  On Local Error Resume Next ' local error resume
  2206.  If Normal.User Then ' check player type
  2207.     If UserRecord.ClassType<>Thief Then ' check player class type
  2208.        Outpt="Only thieves can steal!" ' make message
  2209.        Call IO.O ' send message
  2210.        Exit Sub ' exit routine
  2211.     Endif ' end compare class type
  2212.  Endif ' end compare player type
  2213.  Call ParseX ' parse the second parameter
  2214.  If Parser Then ' parse the
  2215.     Call Numeric ' number after the # sign
  2216.  Endif ' end parse
  2217.  If Parser=False Then ' no second parameter
  2218.     Outpt="Steal from whom?" ' make message
  2219.     Call IO.O ' send message
  2220.     Exit Sub ' exit routine
  2221.  Endif ' end compare parse
  2222.  Call Check.Monster ' verify monster mnemonic
  2223.  If Monster.Number Then ' monster index
  2224.     Parsed.Command1=Lcase$(Parsed.Command2) ' get first parameter
  2225.     Call Numeric ' parse number
  2226.     For Array.Number=1 To 5 ' loop through all monster treasure
  2227.        ' get monster treasure index
  2228.        Treasure.Number=MonsterArray(Monster.Number).Treasure(Array.Number)
  2229.        ' check file bounds
  2230.        If Treasure.Number>False And _
  2231.        Treasure.Number<=Lof(TreasureFile)/Len(TreasureRecord) Then
  2232.           Call Read.Record(TreasureFile,Treasure.Number) 'read treasure record
  2233.           Inpt=TreasureRecord.ShortName ' store short treasure mnemonic
  2234.           Inpt=Rtrim$(Inpt) ' strip trailing blanks
  2235.           Inpt=Lcase$(Inpt) ' convert to lower case
  2236.           Inpt=Left$(Inpt,Len(Parsed.Command1)) ' shorten to parsed length
  2237.           If Inpt=Parsed.Command1 Then ' compare treasure to parsed treasure
  2238.              ' compare monster to magical, or permanent
  2239.              If MonsterArray(Monster.Number).Magic<=True Or _
  2240.              MonsterArray(Monster.Number).Permanent<=True Then
  2241.                 Outpt="You can't steal from that monster!" ' make message
  2242.                 Call IO.O ' send message
  2243.                 Exit Sub ' exit routine
  2244.              Endif ' end compare monster
  2245.              ' compute random chance
  2246.              If Int(Rnd*5+5)>UserRecord.Stats(4)/2 Then
  2247.                 Outpt="Didn't work!" ' make message
  2248.                 Call IO.O ' send message
  2249.                 Exit Sub ' exit routine
  2250.              Endif ' end random chance
  2251.              Inpt=TreasureRecord.TreasureName ' get full name of treasure
  2252.              Inpt=Rtrim$(Inpt) ' strip trailing blanks
  2253.              Inpt=Lcase$(Inpt) ' convert to lower case
  2254.              ' get monster name
  2255.              Outpts=MonsterArray(Monster.Number).MonsterName
  2256.              Outpts=Rtrim$(Outpts) ' strip trailing blanks
  2257.              Outpts=Lcase$(Outpts) ' convert to lower case
  2258.              Item.Charges=TreasureRecord.Charges ' store charges
  2259.              ' add to player inventory
  2260.              Call Add.Inventory(Treasure.Number,Item.Charges,Item.Added)
  2261.              If Item.Added Then ' flag set to add inventory
  2262.                 Outpt="You steal "+Inpt+" from the "+Outpts+"!" ' make message
  2263.                 Call IO.O ' send message
  2264.                 ' clear element in monster inventory array
  2265.                 MonsterArray(Monster.Number).Treasure(Array.Number)=False
  2266.                 Exit Sub ' exit routine
  2267.              Endif ' end compare flag
  2268.           Endif ' end compare treasure
  2269.        Endif ' end compare treasure
  2270.     Next ' end loop through all monster inventory
  2271.  Endif ' end find monster number
  2272.  Outpt="You can't steal that!" ' make message
  2273.  Call IO.O ' send message
  2274. End Sub ' end routine to steal
  2275.  
  2276.  Rem * routine to throw an item of player inventory at monster, weapon falls
  2277.  Rem * into the room.
  2278.  
  2279. Sub Throw.Object
  2280.  On Local Error Resume Next ' local error resume
  2281.  If Normal.User Then ' verify player type
  2282.     If UserRecord.ClassType<>Thief Then ' verify player class type
  2283.        Outpt="Only thieves can throw!" ' make message
  2284.        Call IO.O ' send message
  2285.        Exit Sub ' exit routine
  2286.     Endif ' end compare class type
  2287.  Endif ' end compare player type
  2288.  Call ParseX ' get second parameter
  2289.  If Parser Then ' parse parameter
  2290.     Call Numeric ' store number
  2291.  Endif ' end compare parse
  2292.  If Parser=False Then ' missing second parameter
  2293.     Outpt="Throw at whom?" ' make message
  2294.     Call IO.O ' send message
  2295.     Exit Sub ' exit routine
  2296.  Endif ' end compare parameter
  2297.  Call Check.Monster ' find monster in room
  2298.  If Monster.Number Then ' found monster index
  2299.     Last.Monster=Parsed.Command1 ' reset last monster attacked
  2300.     Parsed.Command1=Ucase$(Parsed.Command2) ' get first parameter
  2301.     Call Numeric ' parse number sign
  2302.     Call Check.Inventory.Treasure ' search player inventory for treasure
  2303.     If Index.Number>False Then ' found treasure index in player inventory
  2304.        ' weapon being held must match the weapon thrown
  2305.        If Weapon6=Array.Number Then
  2306.           Multiplier=Weapon2 ' set attack multiplier
  2307.           Inpt=MonsterArray(Monster.Number).MonsterName ' get monster name
  2308.           Inpt=Rtrim$(Inpt) ' strip trailing blanks
  2309.           Inpt=Lcase$(Inpt) ' convert to lower case
  2310.           Outpt="You throw "+Outpts+" at the "+Inpt+"!" ' format message
  2311.           Call IO.O ' send message
  2312.           If Int(Rnd*5+2)>UserRecord.Stats(4)/2 Then ' compute random chance
  2313.              Outpt="You missed!" ' make message
  2314.              Call IO.O ' send message
  2315.           Else ' random chance
  2316.              Parsed.Command1=Last.Monster ' reset parameter to last monster
  2317.              Last.Command.Number=55 ' reset the command number to attack
  2318.              Call Attack.Monster ' routine to hit monster
  2319.           Endif ' end random chance
  2320.           Call Discard.Inventory(Weapon6,False) ' remove item from inventory
  2321.           Exit Sub ' exit routine
  2322.        Endif ' end compare weapon being held
  2323.        Outpt="You aren't holding the weapon!" ' make message
  2324.        Call IO.O ' send message
  2325.        Exit Sub ' exit routine
  2326.     Endif ' end search for weapon to throw
  2327.  Endif ' end search for monster
  2328.  Outpt="You can't throw that!" ' make message
  2329.  Call IO.O ' send message
  2330. End Sub ' end routine to throw an object
  2331.  
  2332.  Rem * routine to fuel an item from the charges of another item.
  2333.  
  2334. Sub Fuel.Object
  2335.  On Local Error Resume Next ' local error resume
  2336.  Call Find.Inventory ' parse first parameter, search player inventory
  2337.  Treasure.Name$=TreasureRecord.ShortName ' store treasure short mnemonic name
  2338.  Treasure.Name$=Rtrim$(Treasure.Name$) ' strip trailing blanks
  2339.  Treasure.Name$=Lcase$(Treasure.Name$) ' convert to lower case
  2340.  If Index.Number=False Then ' compare treasure index
  2341.     Outpt="You can't fuel that!" ' make message
  2342.     Call IO.O ' send message
  2343.     Exit Sub ' exit routine
  2344.  Endif ' end compare index
  2345.  If TreasureRecord.LightType=False Then ' check treasure can be fueled
  2346.     Outpt="You can't fuel that!" ' make message
  2347.     Call IO.O ' send message
  2348.     Exit Sub ' exit routine
  2349.  Endif ' end compare treasure
  2350.  If TreasureRecord.LightCharges=False Then ' check treasure can be fueled
  2351.     Outpt="It has no light charges!" ' make message
  2352.     Call IO.O ' send message
  2353.     Exit Sub ' exit routine
  2354.  Endif ' end compare treasure
  2355.  If UserRecord.Charges(Array.Number) Then ' check treasure already fueled
  2356.     Outpt="It's already fueled!" ' make message
  2357.     Call IO.O ' send message
  2358.     Exit Sub ' exit routine
  2359.  Endif ' end compare treasure
  2360.  Fuel.Charges=TreasureRecord.LightCharges ' store treasure light charges
  2361.  Item.Number=Array.Number ' store treasure array index
  2362.  If Parser=False Then ' compare second parameter
  2363.     Outpt="Fuel with what?" ' make message
  2364.     Call IO.O ' send message
  2365.     Exit Sub ' exit routine
  2366.  Endif ' end compare parse
  2367.  Parsed.Command1=Parsed.Command2 ' get second parameter
  2368.  Call Numeric ' parse number
  2369.  Call Find.Inventory ' search player inventory
  2370.  If Index.Number=False Then ' compare treasure index
  2371.     Outpt="You can't fuel with that!" ' make message
  2372.     Call IO.O ' send message
  2373.     Exit Sub ' exit routine
  2374.  Endif ' end compare index
  2375.  If TreasureRecord.FuelType=False Then ' check treasure is a fuel
  2376.     Outpt="You can't fuel with that!" ' make message
  2377.     Call IO.O ' send message
  2378.     Exit Sub ' exit routine
  2379.  Endif ' end compare treasure
  2380.  If TreasureRecord.FuelCharges<=False Then ' check treasure fuel amount
  2381.     Outpt="It has no fuel charges!" ' make message
  2382.     Call IO.O ' send message
  2383.     Exit Sub ' exit routine
  2384.  Endif ' end compare treasure
  2385.  If UserRecord.Charges(Array.Number)=False Then ' check fuel charges
  2386.     Outpt="It has no fuel charges!" ' make message
  2387.     Call IO.O ' send message
  2388.     Exit Sub ' exit routine
  2389.  Endif ' end compare treasure
  2390.  ' decrement fuel
  2391.  UserRecord.Charges(Array.Number)=UserRecord.Charges(Array.Number)-1
  2392.  UserRecord.Charges(Item.Number)=Fuel.Charges ' add fuel charges to treasure
  2393.  Outpt="You fuel the "+Treasure.Name$+"!" ' format message
  2394.  Call IO.O ' send message
  2395. End Sub ' end routine to fuel an item
  2396.  
  2397.  Rem * routine to light an item.
  2398.  
  2399. Sub Light.Object
  2400.  On Local Error Resume Next ' local error resume
  2401.  Call Check.Inventory.Treasure ' search for player inventory treasure
  2402.  If Index.Number=False Then ' compare treasure index
  2403.     Outpt="You can't light that!" ' make message
  2404.     Call IO.O ' send message
  2405.     Exit Sub ' exit routine
  2406.  Endif ' end compare treasure index
  2407.  If TreasureRecord.LightType=False Then ' check treasure is a light
  2408.     Outpt="That's not a light!" ' make message
  2409.     Call IO.O ' send message
  2410.     Exit Sub ' exit routine
  2411.  Endif ' end compare treasure
  2412.  If UserRecord.Charges(Array.Number)=False Then ' check treasure is fueled
  2413.     Outpt="You can't, it's not fueled!" ' make message
  2414.     Call IO.O ' send message
  2415.     Exit Sub ' exit routine
  2416.  Endif ' end compare treasure
  2417.  ' check treasure is already lit
  2418.  If UserRecord.Charges(Array.Number)<False Then
  2419.     Outpt="It's already lit!" ' make message
  2420.     Call IO.O ' send message
  2421.     Exit Sub ' exit routine
  2422.  Endif ' end compare treasure
  2423.  ' set inventory charges
  2424.  UserRecord.Charges(Array.Number)=-UserRecord.Charges(Array.Number)
  2425.  Outpts=TreasureRecord.ShortName ' to negative to indicate treasure is a light
  2426.  Outpts=Rtrim$(Outpts) ' store treasure name, strip trailing blanks
  2427.  Outpts=Lcase$(Outpts) ' convert to lower case
  2428.  Outpt="You light the "+Outpts+"!" ' format message
  2429.  Call IO.O ' send message
  2430. End Sub ' end routine to light an item
  2431.  
  2432. Rem * dm/sysop routine to discard an item of inventory to nowhere, can be
  2433. Rem * used interactively during remote with function key.
  2434.  
  2435. Sub Discard.Object
  2436.  On Local Error Resume Next ' local error resume
  2437.  Call Check.Inventory.Treasure ' find treasure in player inventory
  2438.  If Index.Number Then ' treasure index to player array
  2439.     ' routine to remove from inventory
  2440.     Call Discard.Inventory(Array.Number,True)
  2441.     Outpt="You discard "+Outpts+"!" ' format message
  2442.     Call IO.O ' send message
  2443.     Exit Sub ' exit routine
  2444.  Endif ' end search treasure inventory
  2445.  Call Num ' decrement parse counter
  2446.  Call Check.Inventory.Objects ' find object in player inventory
  2447.  If Index.Number Then ' object index to player array
  2448.     Call Discard.Inventory.Object(Array.Number)
  2449.     Outpt="You discard "+Outpts+"!" ' format message
  2450.     Call IO.O ' send message
  2451.     Exit Sub ' exit routine
  2452.  Endif ' end search object inventory
  2453.  Outpt="You can't discard that!" ' make message
  2454.  Call IO.O ' send message
  2455. End Sub ' end routine to discard an item
  2456.