home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-385-Vol-1of3.iso / d / dnd29c4.zip / SOURCE.ZIP / DNDSUB3.BAS < prev    next >
BASIC Source File  |  1993-01-07  |  81KB  |  3,063 lines

  1.  Rem dndsub3.bas v2.9c
  2.  Rem $Include: 'dndbbs.inc'
  3.  
  4. Sub Attack.Monster
  5.  On Local Error Goto 10002
  6.  Prefix1=Nul
  7.  User.Temp=False
  8.  Monster.Temp=False
  9.  Call In.Room(13)
  10.  If TempA Then
  11.     Strng="This is a safe haven!"
  12.     Call IO.O
  13.     Exit Sub
  14.  Endif
  15.  Call Check.Room.Objects
  16.  If Temp7 Then
  17.     If ObjectRecord.JailTrap Then
  18.        Call Jail
  19.        Exit Sub
  20.     Endif
  21.     Strng="Nothing happens.."
  22.     Call IO.O
  23.     Exit Sub
  24.  Endif
  25.  Call Search.Mess(False)
  26.  If Temp=Room Then
  27.     User.Temp=TempB
  28.     Out3=MessWorkRecord1.UserName
  29.     Out3=Rtrim$(Out3)
  30.     Out3=Lcase$(Out3)
  31.     Call Hit.Game.Player
  32.     Exit Sub
  33.  Endif
  34.  Call Check.User
  35.  If User.Temp Then
  36.     Out3=Lcase$(Out3)
  37.     If UserArray(User.Temp).Align1+UserArray(User.Temp).Align2<False Then
  38.        If UserRecord.Align1+UserRecord.Align2<False Then
  39.           Strng="Your alignment might change!"
  40.           Call IO.O
  41.        Endif
  42.     Endif
  43.     Call Hit.User
  44.     Exit Sub
  45.  Endif
  46.  Previous.Command=False
  47.  If Intoxicated>False Then
  48.     Strng="You are too drunk to fight!"
  49.     Call IO.O
  50.     Exit Sub
  51.  Endif
  52.  Call Check.Monster
  53.  If Monster.Temp=False Then
  54.     Strng="You can't attack that!"
  55.     Call IO.O
  56.     Exit Sub
  57.  Endif
  58.  If MonsterArray(Monster.Temp).Jail Then
  59.     Call Jail
  60.     Exit Sub
  61.  Endif
  62.  Call The.Or.An
  63.  Out3=MonsterArray(Monster.Temp).MonsterName
  64.  Out3=Rtrim$(Out3)
  65.  Out3=Lcase$(Out3)
  66.  Select Case Last.Command.Number
  67.  Case 7
  68.     If Last.Command.Type Then
  69.        If UserRecord.ClassType=8 Then
  70.           If MonsterArray(Monster.Temp).Magic<=True Then
  71.              Strng="Didn't work!"
  72.              Call IO.O
  73.              Exit Sub
  74.           Endif
  75.           If Int(Rnd*10+4)>UserRecord.Stats(7) Then
  76.              Strng="Didn't work!"
  77.              Call IO.O
  78.              Exit Sub
  79.           Endif
  80.           MonsterArray(Monster.Temp).Magic=5
  81.           Strng="It worked!"
  82.           Call IO.O
  83.           Exit Sub
  84.        Endif
  85.     Endif
  86.     Strng="Your class does not allow that!"
  87.     Call IO.O
  88.     Exit Sub
  89.  Case 58
  90.     If Last.Command.Type Then
  91.        If UserRecord.ClassType=8 Then
  92.           If Int(Rnd*12+5)>(UserRecord.Stats(6)+UserRecord.Stats(7)) Then
  93.              Strng="Didn't work!"
  94.              Call IO.O
  95.              Exit Sub
  96.           Endif
  97.           Call Monster.Died
  98.           Exit Sub
  99.        Endif
  100.     Endif
  101.     Strng="Your class does not allow that!"
  102.     Call IO.O
  103.     Exit Sub
  104.  Case 60
  105.     If MonsterArray(Monster.Temp).Magic<=True Then
  106.        Strng="Didn't work!"
  107.        Call IO.O
  108.        Exit Sub
  109.     Endif
  110.     If Config2(63) Then
  111.        Out2=Config3(35)
  112.        Call Equate(Temp#)
  113.     Else
  114.        Temp#=(Rnd*5+UserRecord.Level)>MonsterArray(Monster.Temp).Level
  115.     Endif
  116.     If Temp# Then
  117.        Previous.Command=True
  118.        MonsterArray(Monster.Temp).Magic=4
  119.        Strng="It worked!"
  120.        Call IO.O
  121.        Exit Sub
  122.     Endif
  123.     Strng="Didn't work!"
  124.     Call IO.O
  125.     Exit Sub
  126.  Case 61
  127.     If MonsterArray(Monster.Temp).Magic<=True Then
  128.        Strng="Didn't work!"
  129.        Call IO.O
  130.        Exit Sub
  131.     Endif
  132.     If Config2(63) Then
  133.        Out2=Config3(34)
  134.        Call Equate(Temp#)
  135.     Else
  136.        Temp#=UserRecord.Stats(4)>(Rnd*5+MonsterArray(Monster.Temp).Level/2)
  137.     Endif
  138.     If Temp# Then
  139.        Previous.Command=Last.Command.Number
  140.        MonsterArray(Monster.Temp).Magic=3
  141.        Strng="It worked!"
  142.        Call IO.O
  143.        Exit Sub
  144.     Endif
  145.     Strng="Didn't work!"
  146.     Call IO.O
  147.     Exit Sub
  148.  Case 62
  149.     Previous.Command=Last.Command.Number
  150.     Strng="It worked!"
  151.     Call IO.O
  152.     Exit Sub
  153.  Case 65
  154.     Magic.Spell=12
  155.  Case 67
  156.     If UserRecord.ClassType=8 Then
  157.        If MonsterArray(Monster.Temp).LevelDrain Then
  158.           Strng="Didn't work!"
  159.           Call IO.O
  160.           Exit Sub
  161.        Endif
  162.        If Int(Rnd*8+5)>UserRecord.Stats(6) Then
  163.           Strng="Didn't work!"
  164.           Call IO.O
  165.           Exit Sub
  166.        Endif
  167.        MonsterArray(Monster.Temp).Level=_
  168.        MonsterArray(Monster.Temp).Level-1
  169.        Strng="You drain a level from the "+Out3+"!"
  170.        Call IO.O
  171.        If MonsterArray(Monster.Temp).Level<=False Then
  172.           Strng="You killed the "+Out3+"!"
  173.           Call IO.O
  174.           Call Monster.Died
  175.           Exit Sub
  176.        Endif
  177.     Endif
  178.     Strng="Your class does not allow that!"
  179.     Call IO.O
  180.     Exit Sub
  181.  Case 68
  182.     If MonsterArray(Monster.Temp).Magic<=True Then
  183.        Strng="Didn't work!"
  184.        Call IO.O
  185.        Exit Sub
  186.     Endif
  187.     If (UserRecord.Stats(3)+UserRecord.Stats(4))>_
  188.     (Rnd*10+MonsterArray(Monster.Temp).Level/2) Then
  189.        Previous.Command=True
  190.        MonsterArray(Monster.Temp).Magic=6
  191.        Strng="It worked!"
  192.        Call IO.O
  193.        Exit Sub
  194.     Endif
  195.     Strng="Didn't work!"
  196.     Call IO.O
  197.     Exit Sub
  198.  Case 70
  199.     Previous.Command=Last.Command.Number
  200.     Strng="It worked!"
  201.     Call IO.O
  202.     Exit Sub
  203.  Case 39, 40
  204.     If Weapon5 Then
  205.        Weapon3=False
  206.        Weapon5=False
  207.        Strng="You return your shield!"
  208.        Call IO.O
  209.     Endif
  210.  Case 82, 83
  211.     If Weapon6 Then
  212.        Weapon2=False
  213.        Weapon6=False
  214.        Weapon10=False
  215.        Strng="You return your weapon!"
  216.        Call IO.O
  217.     Endif
  218.  End Select
  219.  If Magic.Spell Then
  220.     Select Case Magic.Spell
  221.     Case 5
  222.        If MonsterArray(Monster.Temp).Poison Then
  223.           Strng="Didn't work!"
  224.           Call IO.O
  225.           Exit Sub
  226.        Endif
  227.        If Rnd>.5 Then
  228.           Strng="Didn't work!"
  229.           Call IO.O
  230.           Exit Sub
  231.        Endif
  232.        MonsterArray(Monster.Temp).Poison=UserRecord.Level
  233.        Strng="You poison the "+Out3+"!"
  234.        Call IO.O
  235.        Exit Sub
  236.     Case 9
  237.        If MonsterArray(Monster.Temp).LevelDrain Then
  238.           Strng="Didn't work!"
  239.           Call IO.O
  240.           Exit Sub
  241.        Endif
  242.        If Rnd>.5 Then
  243.           Strng="Didn't work!"
  244.           Call IO.O
  245.           Exit Sub
  246.        Endif
  247.        MonsterArray(Monster.Temp).Level=_
  248.        MonsterArray(Monster.Temp).Level-1
  249.        Strng="You drain a level from the "+Out3+"!"
  250.        Call IO.O
  251.        If MonsterArray(Monster.Temp).Level<=False Then
  252.           Strng="You killed the "+Out3+"!"
  253.           Call IO.O
  254.           Call Monster.Died
  255.        Endif
  256.        Exit Sub
  257.     Case 11
  258.        If MonsterArray(Monster.Temp).Magic<=True Then
  259.           Strng="Didn't work!"
  260.           Call IO.O
  261.           Exit Sub
  262.        Endif
  263.        If Rnd>.5 Then
  264.           Strng="Didn't work!"
  265.           Call IO.O
  266.        Endif
  267.        MonsterArray(Monster.Temp).Magic=4
  268.        Strng="It worked!"
  269.        Call IO.O
  270.        Exit Sub
  271.     Case 12
  272.        If MonsterArray(Monster.Temp).LevelDrain=False Then
  273.           Strng="That's not undead!"
  274.           Call IO.O
  275.           Exit Sub
  276.        Endif
  277.        If Config2(63) Then
  278.           Out2=Config3(33)
  279.           Call Equate(Temp#)
  280.        Else
  281.           Temp#=(Rnd*UserRecord.Level+2)>MonsterArray(Monster.Temp).Level
  282.        Endif
  283.        If Temp# Then
  284.           Strng="You damned the "+Out3+"!"
  285.           Call IO.O
  286.           MonsterArray(Monster.Temp).Level=_
  287.           MonsterArray(Monster.Temp).Level-1
  288.           Strng="You drain a level from the "+Out3+"!"
  289.           Call IO.O
  290.           If MonsterArray(Monster.Temp).Level<=False Then
  291.              Strng="You killed the "+Out3+"!"
  292.              Call IO.O
  293.              Call Monster.Died
  294.              Exit Sub
  295.           Endif
  296.        Endif
  297.        Strng="Didn't work!"
  298.        Call IO.O
  299.        Exit Sub
  300.     Case 19
  301.        If MonsterArray(Monster.Temp).Magic<=True Then
  302.           Intoxicated=UserRecord.Level
  303.           Strng="You just became very drunk!"
  304.           Call IO.O
  305.           Exit Sub
  306.        Endif
  307.        If Rnd>.5 Then
  308.           Strng="Didn't work!"
  309.           Call IO.O
  310.           Exit Sub
  311.        Endif
  312.        MonsterArray(Monster.Temp).Magic=3
  313.        Strng="It worked!"
  314.        Call IO.O
  315.        Exit Sub
  316.     End Select
  317.  Endif
  318.  If Magic.Spell=False Then
  319.     If UserRecord.Fatigue<=False Then
  320.        UserRecord.Fatigue=False
  321.        Strng="You are too exhausted to fight!"
  322.        Call IO.O
  323.        Exit Sub
  324.     Endif
  325.     If MonsterArray(Monster.Temp).Magic<=True Then
  326.        Strng="A magical force prevents your attack!"
  327.        Call IO.O
  328.        Exit Sub
  329.     Endif
  330.  Endif
  331.  If MonsterArray(Monster.Temp).Permanent<True Then
  332.     Strng="A mysterious force prevents your attack!"
  333.     Call IO.O
  334.     Exit Sub
  335.  Endif
  336.  If Last.Command.Type Then
  337.     Select Case Last.Command.Number
  338.     Case 59, 60
  339.        If Weapon3 Then
  340.           Previous.Command=True
  341.           Strng="It worked!"
  342.           Call IO.O
  343.           Exit Sub
  344.        Endif
  345.        Previous.Command=False
  346.        Strng="You are not holding a shield!"
  347.        Call IO.O
  348.        Exit Sub
  349.     End Select
  350.  Endif
  351.  If Config2(63) Then
  352.     Out2=Config3(32)
  353.     Call Equate(Temp#)
  354.  Else
  355.     Temp#=(Rnd*10+MonsterArray(Monster.Temp).Level/10)>UserRecord.Stats(4)/2
  356.  Endif
  357.  If Temp# Then
  358.     If Magic.Spell Then
  359.        Strng="You missed!"
  360.        Call IO.O
  361.        Exit Sub
  362.     Endif
  363.     If Config2(63) Then
  364.        Out2=Config3(36)
  365.        Call Equate(Temp#)
  366.     Else
  367.        Temp#=(Rnd*15)>UserRecord.Stats(1)
  368.     Endif
  369.     If Temp# Then
  370.        Call Fumble
  371.     Endif
  372.     Strng="You missed the "+Out3+"!"
  373.     Call IO.O
  374.     Exit Sub
  375.  Endif
  376.  If Magic.Spell=False Then
  377.     Strng=Nul
  378.     Index=43
  379.     Select Case Weapon2
  380.     Case False
  381.        Strng="Punch!"
  382.     Case Else
  383.        Temp!=Rnd
  384.        If Temp!>Config1(27) Then
  385.           Strng="Double damage!"
  386.           Index=Index-1
  387.        Endif
  388.        If Temp!>Config1(26) Then
  389.           Strng="Triple damage!"
  390.           Index=Index-1
  391.        Endif
  392.        If Temp!>Config1(25) Then
  393.           Strng="Deathly damage!"
  394.           Index=Index-1
  395.        Endif
  396.     End Select
  397.     Multiplier=Config2(Index)
  398.  Endif
  399.  Select Case Last.Command.Number
  400.  Case 39, 40
  401.     Multiplier=2
  402.     Previous.Command=Last.Command.Number
  403.  Case 45
  404.     Multiplier=Multiplier+1
  405.  Case 55, 56, 57, 58
  406.     If Strng<>Nul Then
  407.        Call IO.O
  408.     Endif
  409.  Case 59
  410.     If Hidden.Player Then
  411.        Multiplier=Multiplier+1
  412.     Else
  413.        Strng="The "+Out3+" sees you!"
  414.        Call IO.O
  415.        Multiplier=Multiplier-1
  416.     Endif
  417.  Case 63
  418.     Multiplier=Multiplier+1
  419.     Previous.Command=Last.Command.Number
  420.  Case 64
  421.     Strng="Argh! You charge towards the "+Out3+"!"
  422.     Call IO.O
  423.     Multiplier=Multiplier+1
  424.     Previous.Command=Last.Command.Number
  425.  Case 66
  426.     Multiplier=Multiplier+1
  427.  Case 69
  428.     Strng="Your fists fly at the monster!"
  429.     Call IO.O
  430.     Multiplier=Config2(42)
  431.  Case 76
  432.     Multiplier=Multiplier+2
  433.  Case 82, 83
  434.     Multiplier=2
  435.     Previous.Command=Last.Command.Number
  436.  End Select
  437.  If Magic.Spell=False Then
  438.     If Weapon2 Then
  439.        Treasure.Charges(Weapon6)=Treasure.Charges(Weapon6)-1
  440.        If Treasure.Charges(Weapon6)<=False Then
  441.           Treasure.Charges(Weapon6)=False
  442.           Get 8,Treasure(Weapon6),TreasureRecord
  443.           Out2=TreasureRecord.ShortName
  444.           Out2=Rtrim$(Out2)
  445.           Out2=Lcase$(Out2)
  446.           Strng="Your "+Out2+" breaks in half!"
  447.           Call IO.O
  448.           Call Discard(Weapon6,False)
  449.        Endif
  450.     Endif
  451.  Endif
  452.  Magic.Spell=True
  453.  Call Hit.Monster
  454. 10001
  455.  Exit Sub
  456. 10002
  457.  Resume 10001
  458. End Sub
  459.  
  460. Sub Jail
  461.  On Local Error Goto 10012
  462.  Strng="You were just thrown in jail!"
  463.  Call IO.O
  464.  Next.Room=Val(Config3(25))
  465.  Out2=UserRecord.CodeName
  466.  Call Decrypt(Out2)
  467.  Out2=Rtrim$(Out2)
  468.  Out2=Lcase$(Out2)
  469.  Out2=Out2+" was just thrown in jail!"
  470.  Call Send.Mess(8,False,Room,Out2)
  471.  Strng="was thrown in jail"
  472.  Call Update.DayFile(Strng,False)
  473.  Call Enter.Room
  474. 10011
  475.  Exit Sub
  476. 10012
  477.  Resume 10011
  478. End Sub
  479.  
  480. Sub Hit.Monster
  481.  On Local Error Goto 10022
  482.  Hidden.Player=False
  483.  If Config2(63) Then
  484.     Out2=Config3(30)
  485.     If Magic.Spell=False Then
  486.        If Last.Command.Number=71 Then
  487.           Out2=Config3(43)
  488.        Endif
  489.     Else
  490.        If SpellRecord.Equation=True Then
  491.           Out2=SpellRecord.SpellEquate
  492.           Out2=Rtrim$(Out2)
  493.        Endif
  494.     Endif
  495.     Call Equate(Temp#)
  496.  Else
  497.     If Last.Command.Number=71 Then
  498.        Temp#=Int(Rnd*UserRecord.Stats(2)+UserRecord.Stats(3)*_
  499.        (Psi.Attack.Mode+Multiplier))
  500.     Else
  501.        Temp#=Int((Rnd*UserRecord.Stats(1)+UserRecord.Level/2)+_
  502.        (Multiplier+(UserRecord.Weapons(UserRecord.Proficiency)/100))+Weapon2)
  503.     Endif
  504.  Endif
  505.  Magic.Spell=False
  506.  If Temp#>MaxInt Then
  507.     Temp2=MaxInt
  508.  Else
  509.     Temp2=Int(Temp#)
  510.  Endif
  511.  Strng="You hit the "+Out3+" for"
  512.  If Temp2=1 Then
  513.     Strng=Strng+" one hit.."
  514.  Else
  515.     If Temp2>=2 And Temp2<=10 Then
  516.        Strng=Strng+" "+Rtrim$(Numeral(Temp2))+" hits!"
  517.     Else
  518.        Strng=Strng+Str$(Temp2)+" hits!"
  519.     Endif
  520.  Endif
  521.  If Temp2<=False Then
  522.     Strng="You missed!"
  523.     Call IO.O
  524.     Exit Sub
  525.  Endif
  526.  Call IO.O
  527.  If MonsterArray(Monster.Temp).Magic>=False Then
  528.     If MonsterArray(Monster.Temp).Permanent=False Then
  529.        If MonsterArray(Monster.Temp).Hits-Temp2>False Then
  530.           If Temp2>MonsterArray(Monster.Temp).Hits*Config1(14) Then
  531.              Strng="The "+Out3+" flees from your attack!"
  532.              Call IO.O
  533.              MonsterArray(Monster.Temp).Experience=_
  534.              Int(MonsterArray(Monster.Temp).Experience/2)
  535.              Call Monster.Died
  536.              Exit Sub
  537.           Endif
  538.        Endif
  539.     Endif
  540.  Endif
  541.  If MonsterArray(Monster.Temp).Magic=True Then
  542.     MonsterArray(Monster.Temp).Magic=-2
  543.  Endif
  544.  MonsterArray(Monster.Temp).Hits=MonsterArray(Monster.Temp).Hits-Temp2
  545.  If MonsterArray(Monster.Temp).Hits<=False Then
  546.     Strng="You just killed the "+Out3+"!"
  547.     Call IO.O
  548.     Call Monster.Died
  549.  Endif
  550. 10021
  551.  Exit Sub
  552. 10022
  553.  Resume 10021
  554. End Sub
  555.  
  556. Sub Monster.Died
  557.  On Local Error Goto 10032
  558.  If MonsterArray(Monster.Temp).Permanent<True Then
  559.     Call Remove.Monster
  560.     Exit Sub
  561.  Endif
  562.  Graphics.Off=True
  563.  Last.Command.Number=False
  564.  Strng="killed "+Prefix1+Out3
  565.  Call Update.DayFile(Strng,False)
  566.  Strng="On it you find "
  567.  Carriage.Return=True
  568.  Call IO.O
  569.  Temp9=False
  570.  For Temp2=1 To 5
  571.     Temp5=MonsterArray(Monster.Temp).Treasure(Temp2)
  572.     If Temp5>False And Temp5<=Lof(8)/Len(TreasureRecord) Then
  573.        Carriage.Return=True
  574.        Call IO.O
  575.        Get 8,Temp5,TreasureRecord
  576.        Strng=Rtrim$(TreasureRecord.TreasureName)+", "
  577.        Temp9=Temp9+1
  578.        For Temp1=1 To Room.Treasure.Max
  579.           If Room.Inventory(Temp1)=False Then
  580.              Exit For
  581.           Endif
  582.        Next
  583.        If Temp1>Room.Treasure.Max Then
  584.           Call Expand.Room
  585.        Endif
  586.        Room.Inventory(Temp1)=Temp5
  587.        Room.Inventory.Charges(Temp1)=TreasureRecord.Charges
  588.     Endif
  589.  Next
  590.  If Temp9=False Then
  591.     Strng="nothing.."
  592.  Else
  593.     Strng=Left$(Strng,Len(Strng)-2)+"."
  594.     If Temp9>1 Then
  595.        Strng="and "+Strng
  596.     Endif
  597.  Endif
  598.  Call IO.O
  599.  Monsters.Killed=Monsters.Killed+1
  600.  UserRecord.MonstersKilled=UserRecord.MonstersKilled+1
  601.  Choice=MonsterIndex(Monster.Temp)
  602.  If MonsterArray(Monster.Temp).Permanent=True Then
  603.     Get 7,Choice,MonsterRecord
  604.     MonsterRecord.Permanent=False
  605.     Put 7,Choice,MonsterRecord
  606.  Endif
  607.  If Weapon2 And Weapon10 Then
  608.     Temp2=MonsterArray(Monster.Temp).Level-UserRecord.Level
  609.     If Temp2>False Then
  610.        If Weapon10=UserRecord.Proficiency Then
  611.           Temp2=Temp2*10
  612.        Else
  613.           Temp2=Temp2*5
  614.        Endif
  615.        If Temp2>100 Then
  616.           Temp2=100
  617.        Endif
  618.        If Temp2>UserRecord.Weapons(Weapon10) Then
  619.           UserRecord.Weapons(Weapon10)=Temp2
  620.        Endif
  621.     Endif
  622.  Endif
  623.  Temp1=MonsterArray(Monster.Temp).Experience
  624.  If Temp1>False Then
  625.     If UserRecord.Experience>False Then
  626.        If Temp1>10 Then
  627.           Strng="gained"+Str$(Temp1)+" experience points"
  628.           Out2="!"
  629.        Else
  630.           If Temp1=1 Then
  631.              Strng="gained one experience point"
  632.              Out2=".."
  633.           Else
  634.              Strng="gained "+Rtrim$(Numeral(Temp1))+" experience points"
  635.              Out2="."
  636.           Endif
  637.        Endif
  638.        Strng2="You "+Strng+Out2
  639.        Call Update.DayFile(Strng,False)
  640.        Strng=Strng2
  641.        Call IO.O
  642.        UserRecord.Experience=UserRecord.Experience-Temp1
  643.        If UserRecord.Experience<False Then
  644.           UserRecord.Experience=False
  645.           Strng="You now have zero experience to Train!"
  646.           Call IO.O
  647.           Call Train
  648.        Endif
  649.     Endif
  650.  Endif
  651.  Call Remove.Monster
  652. 10031
  653.  Exit Sub
  654. 10032
  655.  Resume 10031
  656. End Sub
  657.  
  658. Sub Hit.User
  659.  On Local Error Goto 10042
  660.  Hidden.Player=False
  661.  UserArray(User.Temp).Align1=False
  662.  UserArray(User.Temp).Align2=False
  663.  If Config2(63) Then
  664.     Out2=Config3(30)
  665.     Call Equate(Temp#)
  666.  Else
  667.     Temp#=Int((Rnd*UserRecord.Stats(1)+UserRecord.Level/2)+_
  668.     (Multiplier+(UserRecord.Weapons(UserRecord.Proficiency)/100))+Weapon2)
  669.  Endif
  670.  If Temp#>MaxInt Then
  671.     Temp2=MaxInt
  672.  Else
  673.     Temp2=Int(Temp#)
  674.  Endif
  675.  Strng="You hit "+Out3+" for"
  676.  If Temp2=1 Then
  677.     Strng=Strng+" one hit.."
  678.  Else
  679.     If Temp2>=2 And Temp2<=10 Then
  680.        Strng=Strng+" "+Rtrim$(Numeral(Temp2))+" hits!"
  681.     Else
  682.        Strng=Strng+Str$(Temp2)+" hits!"
  683.     Endif
  684.  Endif
  685.  If Temp2<=False Then
  686.     Strng="You missed!"
  687.     Call IO.O
  688.     Exit Sub
  689.  Endif
  690.  Call IO.O
  691.  UserArray(User.Temp).Bank=UserArray(User.Temp).Bank-Temp2
  692.  If UserArray(User.Temp).Bank<=False Then
  693.     Strng="You just killed "+Out3+"!"
  694.     Call IO.O
  695.     Call User.Died
  696.  Endif
  697. 10041
  698.  Exit Sub
  699. 10042
  700.  Resume 10041
  701. End Sub
  702.  
  703. Sub User.Died
  704.  On Local Error Goto 10052
  705.  Graphics.Off=True
  706.  Last.Command.Number=False
  707.  Out3=Lcase$(Out3)
  708.  Strng="killed "+Out3
  709.  Call Update.DayFile(Strng,False)
  710.  Strng=UserRecord.CodeName
  711.  Call Decrypt(Strng)
  712.  Strng=Rtrim$(Strng)
  713.  Strng=Lcase$(Strng)
  714.  Mid$(Strng,1,1)=Ucase$(Mid$(Strng,1,1))
  715.  Out2=Strng+" killed you"
  716.  Temp2=UserIndex(User.Temp)
  717.  Call Update.LogFile(Out2,Temp2)
  718.  Call Him.Her
  719.  Strng="On "+Prefix1+" you find "
  720.  Carriage.Return=True
  721.  Call IO.O
  722.  Temp9=False
  723.  For Temp2=1 To 15
  724.     Temp5=UserArray(User.Temp).Inv(Temp2)
  725.     If Temp5>False And Temp5<=Lof(8)/Len(TreasureRecord) Then
  726.        Carriage.Return=True
  727.        Call IO.O
  728.        Get 8,Temp5,TreasureRecord
  729.        Strng=Rtrim$(TreasureRecord.TreasureName)+", "
  730.        Temp9=Temp9+1
  731.        For Temp1=1 To Room.Treasure.Max
  732.           If Room.Inventory(Temp1)=False Then
  733.              Exit For
  734.           Endif
  735.        Next
  736.        If Temp1>Room.Treasure.Max Then
  737.           Call Expand.Room
  738.        Endif
  739.        Room.Inventory(Temp1)=Temp5
  740.        Room.Inventory.Charges(Temp1)=TreasureRecord.Charges
  741.     Endif
  742.  Next
  743.  If Temp9=False Then
  744.     Strng="nothing.."
  745.  Else
  746.     Strng=Left$(Strng,Len(Strng)-2)+"."
  747.     If Temp9>1 Then
  748.        Strng="and "+Strng
  749.     Endif
  750.  Endif
  751.  Call IO.O
  752.  Put 3,User.Index,UserRecord
  753.  Temp2=UserIndex(User.Temp)
  754.  Get 3,Temp2,UserRecord
  755.  Temp5=Val(Config3(24))
  756.  User.Array1(Temp2)=Temp5
  757.  UserRecord.Room=Temp5
  758.  Temp5=User.Array2(Temp2)-1
  759.  User.Array2(Temp2)=Temp5
  760.  UserRecord.Level=Temp5
  761.  Temp3#=UserRecord.Gold
  762.  UserRecord.Gold=False
  763.  For Temp6=1 To 15
  764.     UserRecord.Inv(Temp6)=False
  765.     UserRecord.Charges(Temp6)=False
  766.  Next
  767.  Aligned=UserRecord.Align1+UserRecord.Align2
  768.  Put 3,Temp2,UserRecord
  769.  Get 3,User.Index,UserRecord
  770.  If Temp3#>False Then
  771.     Strng="You found"+Str$(Temp3#)+" gold!"
  772.     Call IO.O
  773.     Strng="found"+Str$(Temp3#)+" gold"
  774.     Call Update.DayFile(Strng,False)
  775.     UserRecord.Gold=UserRecord.Gold+Temp3#
  776.  Endif
  777.  If Aligned<False Then
  778.     If UserRecord.Align1+UserRecord.Align2<False Then
  779.        Strng="Your alignment changed!"
  780.        Call IO.O
  781.        UserRecord.Align2=1
  782.        If UserRecord.Level-UserArray(User.Temp).Level<5 Then
  783.           UserRecord.Align1=False
  784.        Else
  785.           UserRecord.Align1=1
  786.        Endif
  787.        Strng="alignment changed to "+_
  788.        Rtrim$(Alignment.Name1(UserRecord.Align1+2))+" "+_
  789.        Rtrim$(Alignment.Name2(UserRecord.Align2+2))
  790.        Call Update.DayFile(Strng,False)
  791.     Endif
  792.  Endif
  793.  Players.Killed=Players.Killed+1
  794.  UserRecord.PlayersKilled=UserRecord.PlayersKilled+1
  795.  Temp1=UserArray(User.Temp).Experience
  796.  If Temp1>False Then
  797.     If UserRecord.Experience>False Then
  798.        If Temp1>10 Then
  799.           Strng="gained"+Str$(Temp1)+" experience points"
  800.           Out2="!"
  801.        Else
  802.           If Temp1=1 Then
  803.              Strng="gained one experience point"
  804.              Out2=".."
  805.           Else
  806.              Strng="gained "+Rtrim$(Numeral(Temp1))+" experience points"
  807.              Out2="."
  808.           Endif
  809.        Endif
  810.        Strng2="You "+Strng+Out2
  811.        Call Update.DayFile(Strng,False)
  812.        Strng=Strng2
  813.        Call IO.O
  814.        UserRecord.Experience=UserRecord.Experience-Temp1
  815.        If UserRecord.Experience<False Then
  816.           UserRecord.Experience=False
  817.           Strng="You now have zero experience to Train!"
  818.           Call IO.O
  819.           Call Train
  820.        Endif
  821.     Endif
  822.  Endif
  823.  Call Remove.User
  824. 10051
  825.  Exit Sub
  826. 10052
  827.  Resume 10051
  828. End Sub
  829.  
  830. Sub Hit.Game.Player
  831.  On Local Error Goto 10062
  832.  Strng=Nul
  833.  Select Case Last.Command.Number
  834.  Case 45, 76
  835.     Multiplier=Multiplier+2
  836.  Case Else
  837.     Index=43
  838.     Select Case Weapon2
  839.     Case False
  840.        Strng="Punch!"
  841.     Case Else
  842.        Temp!=Rnd
  843.        If Temp!>Config1(27) Then
  844.           Strng="Double damage!"
  845.           Index=Index-1
  846.        Endif
  847.        If Temp!>Config1(26) Then
  848.           Strng="Triple damage!"
  849.           Index=Index-1
  850.        Endif
  851.        If Temp!>Config1(25) Then
  852.           Strng="Deathly damage!"
  853.           Index=Index-1
  854.        Endif
  855.        Multiplier=Config2(Index)
  856.     End Select
  857.  End Select
  858.  If Strng<>Nul Then
  859.     Call IO.O
  860.  Endif
  861.  If Config2(63) Then
  862.     Out2=Config3(30)
  863.     Call Equate(Temp#)
  864.  Else
  865.     Temp#=Int((Rnd*UserRecord.Stats(1)+UserRecord.Level/2)+_
  866.     (Multiplier+(UserRecord.Weapons(UserRecord.Proficiency)/100))+Weapon2)
  867.  Endif
  868.  If Temp#>MaxInt Then
  869.     Temp2=MaxInt
  870.  Else
  871.     Temp2=Int(Temp#)
  872.  Endif
  873.  Strng="You hit "+Out3+" for"
  874.  If Temp2=1 Then
  875.     Strng=Strng+" one hit.."
  876.  Else
  877.     If Temp2>=2 And Temp2<=10 Then
  878.        Strng=Strng+" "+Rtrim$(Numeral(Temp2))+" hits!"
  879.     Else
  880.        Strng=Strng+Str$(Temp2)+" hits!"
  881.     Endif
  882.  Endif
  883.  If Temp2<=False Then
  884.     Strng="You missed!"
  885.     Call IO.O
  886.     Exit Sub
  887.  Endif
  888.  Call IO.O
  889.  Out2=Str$(Temp2)
  890.  Call Send.Mess(9,User.Temp,Room,Out2)
  891. 10061
  892.  Exit Sub
  893. 10062
  894.  Resume 10061
  895. End Sub
  896.  
  897. Sub Remove.Monster
  898.  On Local Error Goto 10072
  899.  For Temp5=Monster.Temp To Number.Monsters-1
  900.     MonsterIndex(Temp5)=MonsterIndex(Temp5+1)
  901.     MonsterArray(Temp5)=MonsterArray(Temp5+1)
  902.  Next
  903.  Number.Monsters=Number.Monsters-1
  904.  If Number.Monsters<False Then
  905.     Number.Monsters=False
  906.  Endif
  907. 10071
  908.  Exit Sub
  909. 10072
  910.  Resume 10071
  911. End Sub
  912.  
  913. Sub Remove.User
  914.  On Local Error Goto 10082
  915.  For Temp5=User.Temp To Number.Users-1
  916.     UserIndex(Temp5)=UserIndex(Temp5+1)
  917.     UserArray(Temp5)=UserArray(Temp5+1)
  918.  Next
  919.  Number.Users=Number.Users-1
  920.  If Number.Users<False Then
  921.     Number.Users=False
  922.  Endif
  923. 10081
  924.  Exit Sub
  925. 10082
  926.  Resume 10081
  927. End Sub
  928.  
  929. Sub User.Attack
  930.  On Local Error Goto 10092
  931.  Call In.Room(13)
  932.  If TempA Then
  933.     Exit Sub
  934.  Endif
  935.  For User.Temp=1 To Number.Users
  936.     Var=UserIndex(User.Temp)
  937.     Call Search.Mess(Var)
  938.     If Temp Then
  939.        Call Remove.User
  940.     Endif
  941.  Next
  942.  For User.Temp=1 To Number.Users
  943.     Out3=UserArray(User.Temp).CodeName
  944.     Call Decrypt(Out3)
  945.     Out3=Rtrim$(Out3)
  946.     Out3=Lcase$(Out3)
  947.     Mid$(Out3,1,1)=Ucase$(Mid$(Out3,1,1))
  948.     If Hidden.Player=False Then
  949.        Aligned=UserArray(User.Temp).Align1+UserArray(User.Temp).Align2
  950.        If Aligned>=False Then
  951.           If Config2(63) Then
  952.              Out2=Config3(31)
  953.              Call Equate(Temp#)
  954.           Else
  955.              Temp#=(UserRecord.Stats(4)/2)>_
  956.              (Rnd*10+UserArray(User.Temp).Level/10)
  957.           Endif
  958.           If Temp# Then
  959.              Strng=Out3+" missed!"
  960.              Call IO.O
  961.           Else
  962.              If Previous.Command=True Then
  963.                 Multiplier=Multiplier-1
  964.                 Previous.Command=False
  965.              Endif
  966.              If Config2(63) Then
  967.                 Out2=Config3(29)
  968.                 Call Equate(Temp#)
  969.              Else
  970.                 Temp#=Rnd*(UserArray(User.Temp).Bank/10-_
  971.                 (Weapon1+Weapon3)/2)*Multiplier
  972.              Endif
  973.              If Temp#>MaxInt Then
  974.                 Temp2=MaxInt
  975.              Else
  976.                 Temp2=Int(Temp#)
  977.              Endif
  978.              Prefix1=Nul
  979.              Prefix2=Nul
  980.              Temp3#=UserRecord.Gold
  981.              Call Get.Hits
  982.              If TempD Then
  983.                 Graphics.Off=True
  984.                 Last.Command.Number=False
  985.                 Out3=UserArray(User.Temp).CodeName
  986.                 Call Decrypt(Out3)
  987.                 Out3=Rtrim$(Out3)
  988.                 Out3=Lcase$(Out3)
  989.                 Strng="was killed by "+Out3
  990.                 Call Update.DayFile(Strng,False)
  991.                 Strng=UserRecord.CodeName
  992.                 Call Decrypt(Strng)
  993.                 Strng=Rtrim$(Strng)
  994.                 Strng=Lcase$(Strng)
  995.                 Out2="You killed "+Strng
  996.                 Temp2=UserIndex(User.Temp)
  997.                 Call Update.Logfile(Out2,Temp2)
  998.                 If Temp3#>False Then
  999.                    Out2="You found"+Str$(Temp3#)+" gold on "+Strng
  1000.                    Call Update.LogFile(Out2,Temp2)
  1001.                 Endif
  1002.                 Put 3,User.Index.UserRecord
  1003.                 Get 3,Temp2,UserRecord
  1004.                 UserRecord.PlayersKilled=UserRecord.PlayersKilled+1
  1005.                 UserRecord.Gold=UserRecord.Gold+Temp3#
  1006.                 Put 3,Temp2,UserRecord
  1007.                 Get 3,User.Index,UserRecord
  1008.                 Exit For
  1009.              Endif
  1010.           Endif
  1011.        Endif
  1012.     Endif
  1013.  Next
  1014. 10091
  1015.  Exit Sub
  1016. 10092
  1017.  Resume 10091
  1018. End Sub
  1019.  
  1020. Sub Monster.Attack
  1021.  On Local Error Goto 10102
  1022.  Call In.Room(13)
  1023.  If TempA Then
  1024.     Exit Sub
  1025.  Endif
  1026.  Monster.Cycle=Monster.Cycle+1
  1027.  If Monster.Cycle>=Room.Monster.Rate Then
  1028.     Monster.Cycle=False
  1029.  Endif
  1030.  For Monster.Temp=1 To Number.Monsters
  1031.     Temp6=MonsterArray(Monster.Temp).Magic
  1032.     If Temp6>=False Then
  1033.        If UserRecord.Stats(6)<=1 Then
  1034.           Temp6=False
  1035.        Endif
  1036.        If Temp6>False Then
  1037.           Temp6=Temp6-1
  1038.        Endif
  1039.        MonsterArray(Monster.Temp).Magic=Temp6
  1040.     Endif
  1041.     If Temp6<True Then
  1042.        Temp6=False
  1043.     Endif
  1044.     If MonsterArray(Monster.Temp).Magic<=True Then
  1045.        If MonsterArray(Monster.Temp).Level>=Config2(37) Then
  1046.           If Monster.Cycle=False Then
  1047.              Temp#=MonsterArray(Monster.Temp).Hits+_
  1048.              Int(MonsterArray(Monster.Temp).Hits*Config1(9))
  1049.              If Temp#<Config2(62) Then
  1050.                 MonsterArray(Monster.Temp).Hits=Temp#
  1051.              Endif
  1052.           Endif
  1053.        Endif
  1054.     Endif
  1055.     If Hidden.Player=False And Temp6=False Then
  1056.        Out3=MonsterArray(Monster.Temp).MonsterName
  1057.        Out3=Rtrim$(Out3)
  1058.        Out3=Lcase$(Out3)
  1059.        Multiplier=MonsterArray(Monster.Temp).Level+1
  1060.        If MonsterArray(Monster.Temp).LevelDrain Then
  1061.           If Rnd<(MonsterArray(Monster.Temp).DrainPercent/100) Then
  1062.              Strng="The "+Out3+" casts a level drain spell!"
  1063.              Call IO.O
  1064.              If Weapon7 And Weapon8=2 Then
  1065.                 Treasure.Charges(Weapon7)=Treasure.Charges(Weapon7)-_
  1066.                 MonsterArray(Monster.Temp).Level
  1067.                 Strng="Your ring absorbs the level drain!"
  1068.                 Call IO.O
  1069.                 If Treasure.Charges(Weapon7)<=False Then
  1070.                    Strng="Your ring disintegrated!"
  1071.                    Call IO.O
  1072.                    Call Discard(Weapon7,True)
  1073.                 Endif
  1074.              Else
  1075.                 UserRecord.Level=UserRecord.Level-1
  1076.                 Strng="was drained a level"
  1077.                 Call Update.DayFile(Strng,False)
  1078.                 Call New.Stats
  1079.                 Strng="You've been drained a level!"
  1080.                 Call IO.O
  1081.                 Call Experience(Temp#)
  1082.                 UserRecord.Experience=Temp#
  1083.                 If UserRecord.Level<=False Then
  1084.                    UserRecord.Level=1
  1085.                    Call The.Or.An
  1086.                    Message1="You were just killed by "+Prefix1+" "+Out3+"!"
  1087.                    Strng="was killed by "+Prefix1+" "+Out3
  1088.                    Call Update.DayFile(Strng,False)
  1089.                    Call Player.Died
  1090.                    Exit For
  1091.                 Endif
  1092.              Endif
  1093.           Endif
  1094.        Endif
  1095.        If MonsterArray(Monster.Temp).Poison Then
  1096.           If Rnd<(MonsterArray(Monster.Temp).PoisonPercent/100) Then
  1097.              Strng="The "+Out3+" casts a poison spell!"
  1098.              Call IO.O
  1099.              If Weapon7 And Weapon8=1 Then
  1100.                 Treasure.Charges(Weapon7)=Treasure.Charges(Weapon7)-_
  1101.                 MonsterArray(Monster.Temp).Level
  1102.                 Strng="Your ring absorbs the poison spell!"
  1103.                 Call IO.O
  1104.                 If Treasure.Charges(Weapon7)<=False Then
  1105.                    Strng="Your ring disintegrated!"
  1106.                    Call IO.O
  1107.                    Call Discard(Weapon7,True)
  1108.                 Endif
  1109.              Else
  1110.                 UserRecord.Poison=True
  1111.                 Strng="You've been poisoned!"
  1112.                 Call IO.O
  1113.              Endif
  1114.           Endif
  1115.        Endif
  1116.        Magic.Spell=False
  1117.        Temp4=MonsterArray(Monster.Temp).Spell
  1118.        If Temp4>False And Temp4<=Spells.Max Then
  1119.           SpellRecord=SpellArray(Temp4)
  1120.           Magic.Spell=SpellRecord.SpellType
  1121.           If Magic.Spell=2 Then
  1122.              If Rnd<(MonsterArray(Monster.Temp).SpellPercent/100) Then
  1123.                 Strng="The "+Out3+" casts a "+_
  1124.                 Rtrim$(SpellRecord.SpellName)+" spell!"
  1125.                 Call IO.O
  1126.                 If Weapon7 And Weapon8=3 Then
  1127.                    If Weapon9=True Or Weapon9=_
  1128.                    MonsterArray(Monster.Temp).Spell Then
  1129.                       Treasure.Charges(Weapon7)=_
  1130.                       Treasure.Charges(Weapon7)-SpellRecord.Level
  1131.                       Strng="Your ring absorbs the spell!"
  1132.                       Call IO.O
  1133.                       If Treasure.Charges(Weapon7)<=False Then
  1134.                          Strng="Your ring disintegrated!"
  1135.                          Call IO.O
  1136.                          Call Discard(Weapon7,True)
  1137.                       Endif
  1138.                    Endif
  1139.                 Else
  1140.                    Multiplier=Int((MonsterArray(Monster.Temp).Level+_
  1141.                    SpellRecord.Level)/2+.5)
  1142.                 Endif
  1143.              Endif
  1144.           Endif
  1145.        Endif
  1146.        If MonsterArray(Monster.Temp).Poison>False Then
  1147.           If Monster.Cycle=False Then
  1148.              MonsterArray(Monster.Temp).Poison=_
  1149.              MonsterArray(Monster.Temp).Poison-1
  1150.              Strng="Poison drains the "+Out3+"!"
  1151.              Call IO.O
  1152.              MonsterArray(Monster.Temp).Hits=_
  1153.              MonsterArray(Monster.Temp).Hits-_
  1154.              Int(UserRecord.Level*UserRecord.Stats(7)/_
  1155.              MonsterArray(Monster.Temp).Level)
  1156.              If MonsterArray(Monster.Temp).Hits<=False Then
  1157.                 Strng="The "+Out3+" died from poison!"
  1158.                 Call IO.O
  1159.                 Call Monster.Died
  1160.                 Exit For
  1161.              Endif
  1162.           Endif
  1163.        Endif
  1164.        If Config2(63) Then
  1165.           Out2=Config3(31)
  1166.           Call Equate(Temp#)
  1167.        Else
  1168.           Temp#=(UserRecord.Stats(4)/2)>_
  1169.           (Rnd*10+MonsterArray(Monster.Temp).Level/10)
  1170.        Endif
  1171.        If Temp# Then
  1172.           Strng="The "+Out3+" missed!"
  1173.           Call IO.O
  1174.        Else
  1175.           If Previous.Command=True Then
  1176.              Multiplier=Multiplier-1
  1177.              Previous.Command=False
  1178.           Endif
  1179.           If Config2(63) Then
  1180.              If MonsterArray(Monster.Temp).Psionic=False Then
  1181.                 Out2=Config3(29)
  1182.              Else
  1183.                 Out2=Nul
  1184.                 If MonsterArray(Monster.Temp).Equation=True Then
  1185.                    Out2=MonsterArray(Monster.Temp).MonsterEquate
  1186.                    Out2=Rtrim$(Out2)
  1187.                 Endif
  1188.                 If Out2=Nul Then
  1189.                    Out2=Config3(44)
  1190.                 Endif
  1191.              Endif
  1192.              Call Equate(Temp#)
  1193.           Endif
  1194.           If Config2(63)=False Then
  1195.              If MonsterArray(Monster.Temp).Psionic=False Then
  1196.                 Temp#=Rnd*(MonsterArray(Monster.Temp).Hits/10-_
  1197.                 (Weapon1+Weapon3)/2)*Multiplier
  1198.              Else
  1199.                 Temp#=Rnd*(MonsterArray(Monster.Temp).Hits/10-_
  1200.                 Psi.Defense.Mode)*MonsterArray(Monster.Temp).Psionic
  1201.              Endif
  1202.           Endif
  1203.           If Temp#>MaxInt Then
  1204.              Temp2=MaxInt
  1205.           Else
  1206.              Temp2=Int(Temp#)
  1207.           Endif
  1208.           Call The.Or.An
  1209.           Prefix2=Prefix1
  1210.           Prefix1="The "
  1211.           Call Get.Hits
  1212.           If TempD Then
  1213.              Exit For
  1214.           Endif
  1215.        Endif
  1216.     Endif
  1217.  Next
  1218. 10101
  1219.  Exit Sub
  1220. 10102
  1221.  Resume 10101
  1222. End Sub
  1223.  
  1224. Sub Player.Attack
  1225.  On Local Error Goto 10112
  1226.  Graphics.Off=True
  1227.  Monster.Temp=False
  1228.  Prefix2=Nul
  1229.  Out6=Out3
  1230.  Call Hit.Player(Temp2)
  1231.  If UserRecord.Vitality=False Then
  1232.     Out2="was just killed by "+Out6+"!"
  1233.     Call Send.Mess(4,False,False,Out2)
  1234.     Last.Command="<dead>"
  1235.     Call Update.Mess(4)
  1236.     Call Read.Mess
  1237.  Endif
  1238. 10111
  1239.  Exit Sub
  1240. 10112
  1241.  Resume 10111
  1242. End Sub
  1243.  
  1244. Sub Get.Hits
  1245.  On Local Error Goto 10122
  1246.  TempD=False
  1247.  Select Case Previous.Command
  1248.  Case 39
  1249.     Temp2=Temp2-UserRecord.Stats(4)/2-UserRecord.Stats(1)/2
  1250.  Case 40
  1251.     Temp2=Temp2-(UserRecord.Stats(4)+UserRecord.Stats(1))/2
  1252.  Case 61
  1253.     Temp2=Temp2-UserRecord.Stats(4)/2-UserRecord.Stats(1)
  1254.  Case 62
  1255.     Temp2=Temp2-UserRecord.Stats(4)-UserRecord.Stats(1)
  1256.  Case 63
  1257.     Temp2=Temp2+UserRecord.Stats(4)/2+UserRecord.Stats(1)
  1258.  Case 64
  1259.     Temp2=Temp2+UserRecord.Stats(4)+UserRecord.Stats(1)
  1260.  Case 70
  1261.     Temp2=Temp2-UserRecord.Stats(1)/2
  1262.  Case 82
  1263.     Temp2=Temp2+UserRecord.Stats(4)/2+UserRecord.Stats(1)/2
  1264.  Case 83
  1265.     Temp2=Temp2+(UserRecord.Stats(4)+UserRecord.Stats(1))/2
  1266.  End Select
  1267.  Temp2=Int(Temp2)
  1268.  Previous.Command=False
  1269.  If Temp2<=False Then
  1270.     Strng=Prefix1+Out3+" missed!"
  1271.     Call IO.O
  1272.     Exit Sub
  1273.  Endif
  1274.  If Monster.Temp Then
  1275.     If Magic.Spell=False Then
  1276.        Strng=Prefix1+Out3+" attacks you"
  1277.        If MonsterArray(Monster.Temp).Psionic Then
  1278.           Strng=Strng+" with psionics"
  1279.        Endif
  1280.        Strng=Strng+"!"
  1281.        Call IO.O
  1282.     Endif
  1283.  Endif
  1284.  If UserRecord.Invisible Then
  1285.     Strng="Your invisibility protects you!"
  1286.     Call IO.O
  1287.     Exit Sub
  1288.  Endif
  1289.  If Vehicle2 Then
  1290.     If Rnd>.75 Then
  1291.        Get 8,Vehicle3,TreasureRecord
  1292.        Out2=TreasureRecord.ShortName
  1293.        Out2=Rtrim$(Out2)
  1294.        Out2=Lcase$(Out2)
  1295.        Strng=Prefix1+Out3+" hits your "+Out2+" for"+Str$(Temp2)+" hits!"
  1296.        Call IO.O
  1297.        Vehicle2=Vehicle2-Temp2
  1298.        If Vehicle2<=False Then
  1299.           RoomRecord.Treasure(Vehicle1)=Vehicle3
  1300.           RoomRecord.Treasure(Vehicle1)=False
  1301.           Vehicle2=False
  1302.           Vehicle3=False
  1303.           Strng=Prefix1+Out3+" damaged your "+Out2+"!"
  1304.           Call IO.O
  1305.        Endif
  1306.     Endif
  1307.  Endif
  1308.  Strng=Prefix1+Out3+" hits you for"
  1309.  Call Hit.Player(Temp2)
  1310.  If UserRecord.Vitality=False Then
  1311.     TempD=True
  1312.     Exit Sub
  1313.  Endif
  1314.  If Weapon3 Then
  1315.     Treasure.Charges(Weapon5)=Treasure.Charges(Weapon5)-1
  1316.     If Treasure.Charges(Weapon5)<=False Then
  1317.        Treasure.Charges(Weapon5)=False
  1318.        Get 8,Treasure(Weapon5),TreasureRecord
  1319.        Out2=TreasureRecord.ShortName
  1320.        Out2=Rtrim$(Out2)
  1321.        Out2=Lcase$(Out2)
  1322.        Strng="Your "+Out2+" breaks in half!"
  1323.        Call IO.O
  1324.        Call Discard(Weapon5,False)
  1325.     Endif
  1326.  Endif
  1327.  If Weapon1 Then
  1328.     Treasure.Charges(Weapon4)=Treasure.Charges(Weapon4)-1
  1329.     If Treasure.Charges(Weapon4)<=False Then
  1330.        Treasure.Charges(Weapon4)=False
  1331.        Get 8,Treasure(Weapon4),TreasureRecord
  1332.        Out2=TreasureRecord.ShortName
  1333.        Out2=Rtrim$(Out2)
  1334.        Out2=Lcase$(Out2)
  1335.        Strng="Your "+Out2+" crumbles!"
  1336.        Call IO.O
  1337.        Call Discard(Weapon4,False)
  1338.     Endif
  1339.  Endif
  1340. 10121
  1341.  Exit Sub
  1342. 10122
  1343.  Resume 10121
  1344. End Sub
  1345.  
  1346. Sub Hit.Player(Var)
  1347.  On Local Error Goto 10132
  1348.  If Var>False Then
  1349.     If UserRecord.Fatigue-Var>=False Then
  1350.        UserRecord.Fatigue=UserRecord.Fatigue-Var
  1351.        Strng=Strng+Str$(Var)+" fatigue points!"
  1352.        Call IO.O
  1353.        Exit Sub
  1354.     Endif
  1355.     Var=Var-UserRecord.Fatigue
  1356.     If UserRecord.Fatigue>False Then
  1357.        Strng=Strng+Str$(UserRecord.Fatigue)+" fatigue and"
  1358.     Endif
  1359.     UserRecord.Fatigue=False
  1360.  Endif
  1361.  Var1=Abs(Var)
  1362.  If Var1>False Then
  1363.     Strng=Strng+Str$(Var1)+" vitality points!"
  1364.     Call IO.O
  1365.     If UserRecord.Vitality-Var1<=False Then
  1366.        UserRecord.Vitality=False
  1367.        Message1="You were just killed!"
  1368.        Strng="was killed by "+Prefix2+Out3
  1369.        Call Update.DayFile(Strng,False)
  1370.        Call Player.Died
  1371.        Exit Sub
  1372.     Endif
  1373.     UserRecord.Vitality=UserRecord.Vitality-Var1
  1374.  Endif
  1375. 10131
  1376.  Exit Sub
  1377. 10132
  1378.  Resume 10131
  1379. End Sub
  1380.  
  1381. Sub Fumble
  1382.  On Local Error Goto 10142
  1383.  If Weapon2 Or Weapon3 Then
  1384.     Strng="You fumbled! "
  1385.     Out2="You dropped your "
  1386.     Graphics.Off=True
  1387.     Carriage.Return=True
  1388.     Call IO.O
  1389.     If Weapon3 Then
  1390.        Get 8,Treasure(Weapon5),TreasureRecord
  1391.        Out4=TreasureRecord.ShortName
  1392.        Out4=Rtrim$(Out4)
  1393.        Out4=Lcase$(Out4)
  1394.        Call Discard(Weapon5,False)
  1395.        If Weapon2 Then
  1396.           Strng=" and "+Out4
  1397.        Else
  1398.           Strng=Out2+Out4+"!"
  1399.        Endif
  1400.     Else
  1401.        Strng=Nul
  1402.     Endif
  1403.     If Weapon2 Then
  1404.        Get 8,Treasure(Weapon6),TreasureRecord
  1405.        Out4=TreasureRecord.ShortName
  1406.        Out4=Rtrim$(Out4)
  1407.        Out4=Lcase$(Out4)
  1408.        Strng=Out2+Out4+Strng+"!"
  1409.        Call Discard(Weapon6,False)
  1410.     Endif
  1411.     Call IO.O
  1412.     Graphics.Off=False
  1413.  Endif
  1414. 10141
  1415.  Exit Sub
  1416. 10142
  1417.  Resume 10141
  1418. End Sub
  1419.  
  1420. Sub Encounter.User
  1421.  On Local Error Goto 10152
  1422.  Call In.Room(13)
  1423.  If TempA Then
  1424.     Exit Sub
  1425.  Endif
  1426.  Put 3,User.Index,UserRecord
  1427.  For TempX=1 To Users.Max
  1428.     If TempX<>User.Index Then
  1429.        If Room=User.Array1(TempX) Then
  1430.           If User.Array2(TempX)>False Then
  1431.              If User.Array3(TempX)<=7 Then
  1432.                 Call Search.Mess(TempX)
  1433.                 If Temp=False Then
  1434.                    Get 3,TempX,UserRecord
  1435.                    Out2=UserRecord.CodeName
  1436.                    Call Decrypt(Out2)
  1437.                    Out2=Left$(Out2,9)
  1438.                    If Out2<>Deleted$ Then
  1439.                       Temp1=False
  1440.                       For Temp=1 To 15
  1441.                          If UserRecord.Inv(Temp)<False Then
  1442.                             Temp1=Temp1+1
  1443.                             UserRecord.Inv(Temp1)=Abs(UserRecord.Inv(Temp))
  1444.                             UserRecord.Charges(Temp1)=UserRecord.Charges(Temp)
  1445.                          Else
  1446.                             UserRecord.Inv(Temp)=False
  1447.                             UserRecord.Charges(Temp)=False
  1448.                          Endif
  1449.                       Next
  1450.                       For Temp=1 To 5
  1451.                          If UserRecord.Object(Temp)<False Then
  1452.                             UserRecord.Object(Temp)=False
  1453.                             UserRecord.ObjCharges(Temp)=False
  1454.                          Endif
  1455.                       Next
  1456.                       Put 3,TempX,UserRecord
  1457.                       If Number.Users=Number.UsersMax Then
  1458.                          Call Expand.Users
  1459.                       Endif
  1460.                       Number.Users=Number.Users+1
  1461.                       UserIndex(Number.Users)=TempX
  1462.                       Get 3,TempX,UserArray(Number.Users)
  1463.                       If Config2(63) Then
  1464.                          Out2=Config3(37)
  1465.                          Call Equate(Temp#)
  1466.                       Else
  1467.                          Temp#=(UserRecord.Fatigue+UserRecord.Vitality+_
  1468.                          UserRecord.Magic)*UserRecord.Level+UserRecord.Stats(1)
  1469.                       Endif
  1470.                       UserArray(Number.Users).Bank=Int(Temp#)
  1471.                       UserArray(Number.Users).Experience=UserRecord.Level*10
  1472.                    Endif
  1473.                 Endif
  1474.              Endif
  1475.           Endif
  1476.        Endif
  1477.     Endif
  1478.  Next
  1479.  Get 3,User.Index,UserRecord
  1480. 10151
  1481.  Exit Sub
  1482. 10152
  1483.  Resume 10151
  1484. End Sub
  1485.  
  1486. Sub Encounter.Permanent
  1487.  On Local Error Goto 10162
  1488.  If Nonplyrs.Max>False Then
  1489.     For VarX=1 To Nonplyrs.Max
  1490.        Var1$=","+Rtrim$(NonplyrsArray(VarX))+","
  1491.        Var2$=","+Mid$(Str$(Room),2)+","
  1492.        If Instr(Var1$,Var2$) Then
  1493.           Number.Monsters=Number.Monsters+1
  1494.           If Number.Monsters=Number.MonstersMax Then
  1495.              Call Expand.Monsters
  1496.           Endif
  1497.           MonsterIndex(Number.Monsters)=VarX
  1498.           Get 4,VarX,MonsterArray(Number.Monsters)
  1499.           MonsterArray(Number.Monsters).Magic=True
  1500.           MonsterArray(Number.Monsters).Permanent=-2
  1501.        Endif
  1502.     Next
  1503.  Endif
  1504.  If RoomRecord.MonsterClass Then
  1505.     For Temp1=1 To 10
  1506.        Choice=Monster.Class(RoomRecord.MonsterClass,Temp1)
  1507.        If Choice>False And Choice<=Lof(7)/Len(MonsterRecord) Then
  1508.           Get 7,Choice,MonsterRecord
  1509.           If MonsterRecord.Permanent=True Then
  1510.              Number.Appearing=1
  1511.              Call Get.Monster.Stats
  1512.           Endif
  1513.        Endif
  1514.     Next
  1515.  Endif
  1516. 10161
  1517.  Exit Sub
  1518. 10162
  1519.  Resume 10161
  1520. End Sub
  1521.  
  1522. Sub Summon.Monster
  1523.  On Local Error Goto 10172
  1524.  Choice=Int(Val(Parsed.Command1))
  1525.  Call Get.Monster
  1526. 10171
  1527.  Exit Sub
  1528. 10172
  1529.  Resume 10171
  1530. End Sub
  1531.  
  1532. Sub Call.Monster
  1533.  On Local Error Goto 10182
  1534.  If RoomRecord.MonsterClass Then
  1535.     If RoomRecord.MonsterClass<=Monclass.Max Then
  1536.        Choice=Monster.Class(RoomRecord.MonsterClass,Int(Rnd*10+1))
  1537.        Call Get.Monster
  1538.     Endif
  1539.  Endif
  1540. 10181
  1541.  Exit Sub
  1542. 10182
  1543.  Resume 10181
  1544. End Sub
  1545.  
  1546. Sub Encounter.Monster
  1547.  On Local Error Goto 10192
  1548.  TempX=RoomRecord.MonsterClass
  1549.  If TempX Then
  1550.     If TempX<=Monclass.Max Then
  1551.        If Monster.Rate1=MaxInt Then
  1552.           Monster.Rate1=1
  1553.        Else
  1554.           Monster.Rate1=Monster.Rate1+1
  1555.        Endif
  1556.        For Temp1=1 To 10
  1557.           If Monster.Rate(TempX,Temp1) Then
  1558.              If Monster.Rate1/Monster.Rate(TempX,Temp1)=_
  1559.              Int(Monster.Rate1/Monster.Rate(TempX,Temp1)) Then
  1560.                 If Rnd<(Monster.Percent(TempX,Temp1)/100) Then
  1561.                    Choice=Monster.Class(TempX,Temp1)
  1562.                    Call Get.Monster
  1563.                 Endif
  1564.              Endif
  1565.           Endif
  1566.        Next
  1567.        Monster.Rate2=Monster.Rate2+1
  1568.        If Monster.Rate2>=Room.Monster.Rate Then
  1569.           Monster.Rate2=False
  1570.           Choice=Monster.Class(TempX,Int(Rnd*10+1))
  1571.           If MonsterRecord.Rate=False Then
  1572.              If Rnd<Config1(5) Then
  1573.                 Call Get.Monster
  1574.              Endif
  1575.           Endif
  1576.        Endif
  1577.     Endif
  1578.  Endif
  1579. 10191
  1580.  Exit Sub
  1581. 10192
  1582.  Resume 10191
  1583. End Sub
  1584.  
  1585. Sub Get.Monster
  1586.  On Local Error Goto 10202
  1587.  If Choice>False And Choice<=Lof(7)/Len(MonsterRecord) Then
  1588.     Get 7,Choice,MonsterRecord
  1589.     If MonsterRecord.Permanent=False Then
  1590.        Number.Appearing=Int(Rnd*MonsterRecord.NumberAppearing)+1
  1591.        If Number.Appearing>10 Then
  1592.           Strng=Str$(Number.Appearing)+" "+Rtrim$(MonsterRecord.PluralName)
  1593.        Else
  1594.           If Number.Appearing>1 Then
  1595.              Strng=" "+Rtrim$(Numeral(Number.Appearing))+" "+_
  1596.              Rtrim$(MonsterRecord.PluralName)
  1597.           Else
  1598.              If Instr("aeiou",Left$(MonsterRecord.MonsterName,1)) Then
  1599.                 Strng="an "
  1600.              Else
  1601.                 Strng="a "
  1602.              Endif
  1603.              Strng=" "+Strng+Rtrim$(MonsterRecord.MonsterName)
  1604.           Endif
  1605.        Endif
  1606.        Strng="You encounter"+Strng+"!"
  1607.        Call IO.O
  1608.        Call Get.Monster.Stats
  1609.     Endif
  1610.  Endif
  1611. 10201
  1612.  Exit Sub
  1613. 10202
  1614.  Resume 10201
  1615. End Sub
  1616.  
  1617. Sub Get.Monster.Stats
  1618.  On Local Error Goto 10212
  1619.  For Temp2=1 To Number.Appearing
  1620.     Number.Monsters=Number.Monsters+1
  1621.     If Number.Monsters=Number.MonstersMax Then
  1622.        Call Expand.Monsters
  1623.     Endif
  1624.     MonsterIndex(Number.Monsters)=Choice
  1625.     Get 7,Choice,MonsterArray(Number.Monsters)
  1626.     If MonsterArray(Number.Monsters).Psionic Then
  1627.        Temp4=MonsterArray(Number.Monsters).PsionicSpell
  1628.        MonsterArray(Number.Monsters).Psionic=False
  1629.        If Temp4>False And Temp4<=Spells.Max Then
  1630.           SpellRecord=SpellArray(Temp4)
  1631.           If SpellRecord.Psionic Then
  1632.              If SpellRecord.PsionicMode=1 Then
  1633.                 MonsterArray(Number.Monsters).Psionic=SpellRecord.Level
  1634.              Endif
  1635.           Endif
  1636.        Endif
  1637.     Endif
  1638.     If MonsterArray(Number.Monsters).Permanent=False Then
  1639.        For Temp4=1 To 5
  1640.           If Rnd>Config1(24) Then
  1641.              MonsterArray(Number.Monsters).Treasure(Temp4)=False
  1642.           Endif
  1643.        Next
  1644.     Endif
  1645.  Next
  1646.  If RoomRecord.MonsterTrigger=Choice Then
  1647.     If RoomRecord.MonsterTalk=False Then
  1648.        Out3="As you step forward,"
  1649.        Out4="The monster hits you for"
  1650.        Call Actions
  1651.     Endif
  1652.  Endif
  1653. 10211
  1654.  Exit Sub
  1655. 10212
  1656.  Resume 10211
  1657. End Sub
  1658.  
  1659. Sub Player.Died
  1660.  On Local Error Goto 10222
  1661.  UserRecord.Poison=False
  1662.  Vehicle2=False
  1663.  Vehicle3=False
  1664.  Weapon1=False
  1665.  Weapon2=False
  1666.  Weapon3=False
  1667.  Weapon4=False
  1668.  Weapon5=False
  1669.  Weapon6=False
  1670.  Weapon7=False
  1671.  Weapon8=False
  1672.  Weapon9=False
  1673.  Weapon10=False
  1674.  If Normal.User=False Then
  1675.     Strng=Message1
  1676.     Call IO.O
  1677.     Strng="You were resurrected!"
  1678.     Call IO.O
  1679.     Next.Room=Val(Config3(24))
  1680.     Number.Monsters=False
  1681.     Call Enter.Room
  1682.     Exit Sub
  1683.  Endif
  1684.  Temp4=UserRecord.Stats(5)
  1685.  If Temp4>1 Then
  1686.     UserRecord.Stats(5)=Temp4-1
  1687.     Strng="lost one "+Rtrim$(Stat(5))+" point"
  1688.     Call Update.DayFile(Strng,False)
  1689.  Endif
  1690.  Temp4=UserRecord.Stats(6)
  1691.  If Temp4>1 Then
  1692.     UserRecord.Stats(6)=Temp4-1
  1693.     Strng="lost one "+Rtrim$(Stat(6))+" point"
  1694.     Call Update.DayFile(Strng,False)
  1695.  Endif
  1696.  If Rnd>.5 Then
  1697.     Temp2=Int(Rnd*4+1)
  1698.     Temp4=UserRecord.Stats(Temp2)
  1699.     If Temp4>1 Then
  1700.        UserRecord.Stats(Temp2)=Temp4-1
  1701.        Strng="lost one "+Rtrim$(Stat(Temp2))+" point"
  1702.        Call Update.DayFile(Strng,False)
  1703.     Endif
  1704.  Endif
  1705.  UserRecord.Gold=Config2(32)
  1706.  Number.Monsters=False
  1707.  UserRecord.Poison=False
  1708.  Weight=False
  1709.  Temp2=False
  1710.  For Temp1=1 To 10
  1711.     If RoomRecord.Treasure(Temp1)=False Then
  1712.        Temp2=Temp2+1
  1713.        If Temp2>Number.Inventory Then
  1714.           Exit For
  1715.        Endif
  1716.        RoomRecord.Treasure(Temp1)=Treasure(Temp2)
  1717.        RoomRecord.TreCharges(Temp1)=Treasure.Charges(Temp2)
  1718.        RoomRecord.Flags(Temp1)=False
  1719.     Endif
  1720.  Next
  1721.  Put 5,Room,RoomRecord
  1722.  For Temp6=1 To 15
  1723.     UserRecord.Inv(Temp6)=False
  1724.     UserRecord.Charges(Temp6)=False
  1725.  Next
  1726.  Number.Inventory=False
  1727.  UserRecord.Fatigue=False
  1728.  UserRecord.Vitality=False
  1729.  UserRecord.Magic=False
  1730.  UserRecord.Psionic=False
  1731.  Room=Val(Config3(24))
  1732.  Next.Room=Val(Config3(24))
  1733.  Strng=Message1
  1734.  Call IO.O
  1735.  Out2="has just died!"
  1736.  Call Send.Mess(4,False,False,Out2)
  1737.  Temp#=(Int(Rnd*10+10)+UserRecord.Stats(5)/2)>20
  1738.  If Config2(63) Then
  1739.     Out2=Config3(45)
  1740.     Call Equate(Temp#)
  1741.  Endif
  1742.  If Temp#=False Then
  1743.     Strng="Constitution roll failed!"
  1744.     Call IO.O
  1745.     Temp1=Int(UserRecord.Level*.5+.5)
  1746.     If Temp1>10 Then
  1747.        Strng="lost"+Str$(Temp1)+" levels"
  1748.     Else
  1749.        Strng="lost "+Rtrim$(Numeral(Temp1))+" level"
  1750.     Endif
  1751.     Call Update.DayFile(Strng,False)
  1752.     UserRecord.Level=Temp1
  1753.     Call Zero.Stats
  1754.     Strng="You were not resurrected.."
  1755.     Call IO.O
  1756.     If Config2(39) Then
  1757.        Call Hang.Up(9)
  1758.        Exit Sub
  1759.     Else
  1760.        Call Enter.Room
  1761.     Endif
  1762.     Exit Sub
  1763.  Endif
  1764.  UserRecord.Level=UserRecord.Level-1
  1765.  Strng="lost one level"
  1766.  Call Update.DayFile(Strng,False)
  1767.  Strng="You were resurrected!"
  1768.  Call IO.O
  1769.  If UserRecord.Stats(5)<=1 Then
  1770.     Strng="Except your constitution failed!"
  1771.     Call IO.O
  1772.     UserRecord.Level=1
  1773.  Endif
  1774.  Call Zero.Stats
  1775.  Call Enter.Room
  1776. 10221
  1777.  Exit Sub
  1778. 10222
  1779.  Resume 10221
  1780. End Sub
  1781.  
  1782. Sub Zero.Stats
  1783.  On Local Error Goto 10232
  1784.  Call Experience(Temp#)
  1785.  UserRecord.Experience=Temp#
  1786.  Call New.Stats
  1787.  Call Put.User.Record
  1788.  UserRecord.Flags=UserRecord.Flags And Not Rerolled
  1789.  UserRecord.Flags=UserRecord.Flags And Not Alignmented
  1790.  Put 3,User.Index,UserRecord
  1791. 10231
  1792.  Exit Sub
  1793. 10232
  1794.  Resume 10231
  1795. End Sub
  1796.  
  1797. Sub Cast.Spell(Var)
  1798.  On Local Error Goto 10242
  1799.  If Weapon2 Then
  1800.     Strng="You must return your weapon first!"
  1801.     Call IO.O
  1802.     Exit Sub
  1803.  Endif
  1804.  Temp1=False
  1805.  Temp2=False
  1806.  Temp3=False
  1807.  If Var Then
  1808.     If UserRecord.Magic=False Then
  1809.        Strng="You have no more spell points!"
  1810.        Call IO.O
  1811.        Exit Sub
  1812.     Endif
  1813.     Strng="Chant? "
  1814.     Call IO.I
  1815.     Out2=Ucase$(Out2)
  1816.     Temp5=False
  1817.     For Temp2=1 To Spells.Max
  1818.        SpellRecord=SpellArray(Temp2)
  1819.        Out4=SpellRecord.Chant
  1820.        Out4=Rtrim$(Out4)
  1821.        Out4=Ucase$(Out4)
  1822.        If Out4=Out2 Then
  1823.           If SpellRecord.Psionic=False Then
  1824.              Temp5=True
  1825.              Exit For
  1826.           Endif
  1827.        Endif
  1828.        Out4=SpellRecord.SpellName
  1829.        Out4=Rtrim$(Out4)
  1830.        Out4=Ucase$(Out4)
  1831.        If Out4=Out2 Then
  1832.           If SpellRecord.Psionic=False Then
  1833.              If Learned.Spells(Temp2) Then
  1834.                 Temp5=True
  1835.                 Exit For
  1836.              Endif
  1837.           Endif
  1838.        Endif
  1839.     Next
  1840.     If Temp5=False Then
  1841.        Strng="Wrong spell chant!"
  1842.        Call IO.O
  1843.        Exit Sub
  1844.     Endif
  1845.     Temp1=Cast.Spell.Type
  1846.  Else
  1847.     Call Find.Inventory
  1848.     If Temp7=False Then
  1849.        Strng="You can't use that!"
  1850.        Call IO.O
  1851.        Exit Sub
  1852.     Endif
  1853.     If TreasureRecord.Potion Then
  1854.        Strng="You can't use that!"
  1855.        Call IO.O
  1856.        Exit Sub
  1857.     Endif
  1858.     If TreasureRecord.Edible Then
  1859.        Strng="You can't use that!"
  1860.        Call IO.O
  1861.        Exit Sub
  1862.     Endif
  1863.     If TreasureRecord.Scroll Then
  1864.        Strng="The scroll disintegrated!"
  1865.        Call IO.O
  1866.        Call Discard(Temp5,True)
  1867.        Temp1=Scroll.Spell.Type
  1868.     Else
  1869.        If TreasureRecord.Spell=False Then
  1870.           Strng="That's not a magical device!"
  1871.           Call IO.O
  1872.           Exit Sub
  1873.        Endif
  1874.        If Treasure.Charges(Temp5)=False Then
  1875.           Strng="You can't, it's empty!"
  1876.           Call IO.O
  1877.           Exit Sub
  1878.        Endif
  1879.        Temp6=Treasure.Charges(Temp5)
  1880.        Temp6=Temp6-1
  1881.        If Temp6<False Then
  1882.           Temp6=False
  1883.        Endif
  1884.        Treasure.Charges(Temp5)=Temp6
  1885.        Temp1=Use.Spell.Type
  1886.     Endif
  1887.     Temp2=TreasureRecord.Spell
  1888.     Temp3=True
  1889.  Endif
  1890.  Temp7=False
  1891.  SpellRecord=SpellArray(Temp2)
  1892.  Magic.Spell=SpellRecord.SpellType
  1893.  Multiplier=SpellRecord.Level
  1894.  If Parser Then
  1895.     Parsed.Command1=Parsed.Command2
  1896.     Call Examine.Treasure
  1897.     If Temp7 Then
  1898.        Temp7=-Temp7
  1899.     Endif
  1900.     If Temp7=False Then
  1901.        Call Num
  1902.        Call Check.Inventory.Objects
  1903.        If Temp7=False Then
  1904.           Call Num
  1905.           Call Check.Room.Objects
  1906.        Endif
  1907.     Endif
  1908.  Endif
  1909.  Call Magic
  1910. 10241
  1911.  Exit Sub
  1912. 10242
  1913.  Resume 10241
  1914. End Sub
  1915.  
  1916. Sub Magic
  1917.  On Local Error Goto 10254
  1918.  If Temp7<False Then
  1919.     If Magic.Spell=1 Then
  1920.        If TreasureRecord.Spell=False Then
  1921.           Strng="Improper spell target for chant!"
  1922.           Call IO.O
  1923.           Exit Sub
  1924.        Endif
  1925.     Else
  1926.        If Magic.Spell=6 Then
  1927.           If TreasureRecord.Vehicle=False Then
  1928.              Strng="Improper spell target for chant!"
  1929.              Call IO.O
  1930.              Exit Sub
  1931.           Endif
  1932.        Else
  1933.           If Magic.Spell<>21 Then
  1934.              Strng="Improper spell target for chant!"
  1935.              Call IO.O
  1936.              Exit Sub
  1937.           Endif
  1938.        Endif
  1939.     Endif
  1940.  Endif
  1941.  If Temp7>False Then
  1942.     Strng="Improper spell target for chant!"
  1943.     Call IO.O
  1944.     Exit Sub
  1945.  Endif
  1946.  If Temp7=False Then
  1947.     If Parser Then
  1948.        Temp7=True
  1949.        Select Case Magic.Spell
  1950.        Case 2, 5, 9, 11, 12, 19, 28
  1951.           Temp7=False
  1952.        End Select
  1953.        If Temp7 Then
  1954.           Strng="Improper spell target for chant!"
  1955.           Call IO.O
  1956.           Exit Sub
  1957.        Endif
  1958.     Endif
  1959.  Endif
  1960.  If Temp3=False Then
  1961.     If Multiplier>UserRecord.Level Then
  1962.        Strng="You are not high enough level to cast the spell!"
  1963.        Call IO.O
  1964.        Exit Sub
  1965.     Endif
  1966.     If UserRecord.Magic=False Then
  1967.        Strng="You have no more spell points!"
  1968.        Call IO.O
  1969.        Exit Sub
  1970.     Endif
  1971.     If (SpellRecord.ClassType And 2^UserRecord.ClassType)=False Then
  1972.        If Normal.User=True Then
  1973.           Strng="Your class can't cast that spell!"
  1974.           Call IO.O
  1975.           Exit Sub
  1976.        Endif
  1977.     Endif
  1978.     Temp6=UserRecord.Magic
  1979.     Temp6=Temp6-Multiplier
  1980.     If Temp6<False Then
  1981.        Temp6=False
  1982.     Endif
  1983.     UserRecord.Magic=Temp6
  1984.  Endif
  1985.  If SpellRecord.SpellFlag And Temp1 Then
  1986.     For Temp=1 To 5
  1987.        TempA=SpellRecord.Ingred(Temp)
  1988.        If TempA>False And TempA<=Lof(8)/Len(TreasureRecord) Then
  1989.           Temp9=False
  1990.           For TempB=1 To Number.Inventory
  1991.              If Treasure(TempB)=TempA Then
  1992.                 Temp9=True
  1993.                 Exit For
  1994.              Endif
  1995.           Next
  1996.           Get 8,TempA,TreasureRecord
  1997.           If Temp9=False Then
  1998.              Strng="You don't have the correct spell ingredients!"
  1999.              Call IO.O
  2000.              Out2=TreasureRecord.TreasureName
  2001.              Out2=Rtrim$(Out2)
  2002.              Out2=Lcase$(Out2)
  2003.              Strng="You need "+Out2+"!"
  2004.              Call IO.O
  2005.              Exit Sub
  2006.           Endif
  2007.           If Treasure.Charges(TempB)<=False Then
  2008.              Out2=TreasureRecord.ShortName
  2009.              Out2=Rtrim$(Out2)
  2010.              Out2=Lcase$(Out2)
  2011.              Strng="The "+Out2+" are used up!"
  2012.              Call IO.O
  2013.              Exit Sub
  2014.           Endif
  2015.           Treasure.Charges(TempB)=Treasure.Charges(TempB)-1
  2016.        Endif
  2017.     Next
  2018.  Endif
  2019.  Out6=SpellRecord.SpellName
  2020.  Out6=Rtrim$(Out6)
  2021.  Out6=Lcase$(Out6)
  2022.  If Instr("aeiou",Left$(Out6,1)) Then
  2023.     Out6=" an "+Out6
  2024.  Else
  2025.     Out6=" a "+Out6
  2026.  Endif
  2027.  Strng="cast"+Out6+" spell"
  2028.  Call Update.DayFile(Strng,False)
  2029.  Strng=SpellRecord.Desc
  2030.  Strng=Rtrim$(Strng)
  2031.  If Strng=Nul Then
  2032.     Strng="You cast"+Out6+" spell!"
  2033.  Endif
  2034.  Call IO.O
  2035.  Out2=UserRecord.CodeName
  2036.  Call Decrypt(Out2)
  2037.  Out2=Rtrim$(Out2)
  2038.  Out2=Lcase$(Out2)
  2039.  Strng=SpellRecord.SpellName
  2040.  Strng=Rtrim$(Strng)
  2041.  Out2=Out2+" casts a "+Strng+" spell!"
  2042.  Call Send.Mess(8,False,Room,Out2)
  2043.  Get 5,Room,RoomRecord
  2044.  If RoomRecord.SpellTrigger=Temp2 Then
  2045.     Out3="As the spell is cast,"
  2046.     Out4="You are hit for"
  2047.     Call Actions
  2048.  Endif
  2049.  For Temp=1 To 10
  2050.     If RoomRecord.Flags(Temp)=Magic.Trap Then
  2051.        If RoomRecord.Treasure(Temp)=True Then
  2052.           If UserRecord.Stats(2)<Int(Rnd*6+10) Then
  2053.              Temp2=Int(Rnd*10+UserRecord.Level)*RoomRecord.TreCharges(Temp)
  2054.              RoomRecord.Treasure(Temp)=False
  2055.              RoomRecord.TreCharges(Temp)=False
  2056.              RoomRecord.Flags(Temp)=False
  2057.              Put 5,Room,RoomRecord
  2058.              Strng="You triggered a magical trap!"
  2059.              Call IO.O
  2060.              Prefix2=Nul
  2061.              Strng="The trap hit you for"
  2062.              Out3="an exploding trap"
  2063.              Call Hit.Player(Temp2)
  2064.              Exit For
  2065.           Endif
  2066.        Endif
  2067.     Endif
  2068.  Next
  2069.  Select Case Magic.Spell
  2070.  Case 2, 5, 9, 11, 12, 19
  2071.    Call Attack.Monster
  2072.    Exit Sub
  2073.  Case 1
  2074.     If Temp7<False Then
  2075.        SpellRecord=SpellArray(TreasureRecord.Spell)
  2076.        If SpellRecord.SpellType=4 Then
  2077.           Strng="You can't recharge that!"
  2078.           Call IO.O
  2079.           Exit Sub
  2080.        Endif
  2081. 10243  Temp#=Cdbl(UserRecord.Level)
  2082.        Temp#=Temp#*2#
  2083. 10244  If Temp#<0 Or Temp#>MaxInt Then
  2084.           Temp#=MaxInt
  2085.        Endif
  2086.        If Treasure.Charges(Temp5)+Temp#>MaxInt Then
  2087.           Treasure.Charges(Temp5)=MaxInt
  2088.        Else
  2089.           Treasure.Charges(Temp5)=Treasure.Charges(Temp5)+Temp#
  2090.        Endif
  2091.        If Treasure.Charges(Temp5)>TreasureRecord.Charges Then
  2092.           Treasure.Charges(Temp5)=TreasureRecord.Charges
  2093.        Endif
  2094.        Strng="You recharge it!"
  2095.        Call IO.O
  2096.        Exit Sub
  2097.     Endif
  2098. 10245
  2099.     Temp#=Cdbl(UserRecord.Level+Multiplier)
  2100.     Temp#=Temp#*Config2(23)
  2101. 10246
  2102.     If Temp#<0 Or Temp#>MaxInt Then
  2103.        Temp#=MaxInt
  2104.     Endif
  2105.     If UserRecord.Magic+Temp#>MaxInt Then
  2106.        UserRecord.Magic=MaxInt
  2107.     Else
  2108.        UserRecord.Magic=UserRecord.Magic+Temp#
  2109.     Endif
  2110.     Call New.Stats
  2111.     Strng="You now have"+Str$(UserRecord.Magic)+" magic points!"
  2112.     Call IO.O
  2113.     Exit Sub
  2114.  Case 3
  2115.     If UserRecord.Stats(6)<Config2(31) Then
  2116.        UserRecord.Stats(6)=UserRecord.Stats(6)+1
  2117.        Strng=Rtrim$(Stat(6))
  2118.        Strng="gained one "+Strng+" point"
  2119.        Call Update.DayFile(Strng,False)
  2120.        Strng="You feel a magical glow about you!"
  2121.        Call IO.O
  2122.        Exit Sub
  2123.     Endif
  2124.     Strng="Nothing happened.."
  2125.     Call IO.O
  2126.     Exit Sub
  2127.  Case 4
  2128.     If Temp1=Use.Spell.Type Or Temp1=Scroll.Spell.Type Then
  2129.        UserRecord.Flags=UserRecord.Flags And Not Wished
  2130.     Endif
  2131.     Strng="The Ghods thunder.."
  2132.     Call IO.O
  2133.     Strng="What do you wish for?"
  2134.     Call IO.I
  2135.     Stored.Parsed.Command2=Out2
  2136.     Parsed.Command1=Stored.Parsed.Command2
  2137.     Call Numeric
  2138.     Out2=Parsed.Command1
  2139.     Out2=Lcase$(Out2)
  2140.     Call Drop(False)
  2141.  Case 6
  2142.     If Temp7<False Then
  2143.        Get 5,Room,RoomRecord
  2144.        Temp2=RoomRecord.TreCharges(Temp5)
  2145.        Temp2=Temp2+UserRecord.Level*2
  2146.        If Temp2>TreasureRecord.VehicleHits Then
  2147.           Temp2=TreasureRecord.VehicleHits
  2148.        Endif
  2149.        RoomRecord.TreCharges(Temp5)=Temp2
  2150.        Out3=TreasureRecord.ShortName
  2151.        Out3=Rtrim$(Out3)
  2152.        Put 5,Room,RoomRecord
  2153.        Strng="The "+Out3+" now has"+Str$(Temp2)+" hits!"
  2154.        Call IO.O
  2155.        Exit Sub
  2156.     Endif
  2157. 10247
  2158.     Temp#=Cdbl(UserRecord.Level+Multiplier)
  2159.     Temp#=Temp#*Config2(21)
  2160. 10248
  2161.     If Temp#<0 Or Temp#>MaxInt Then
  2162.        Temp#=MaxInt
  2163.     Endif
  2164.     If UserRecord.Fatigue+Temp#>MaxInt Then
  2165.        UserRecord.Fatigue=MaxInt
  2166.     Else
  2167.        UserRecord.Fatigue=UserRecord.Fatigue+Temp#
  2168.     Endif
  2169.     Call New.Stats
  2170.     Strng="You now have"+Str$(UserRecord.Fatigue)+" fatigue points!"
  2171.     Call IO.O
  2172.     Exit Sub
  2173.  Case 7
  2174. 10249
  2175.     Temp#=Cdbl(UserRecord.Level+Multiplier)
  2176.     Temp#=Temp#*Config2(22)
  2177. 10250
  2178.     If Temp#<0 Or Temp#>MaxInt Then
  2179.        Temp#=MaxInt
  2180.     Endif
  2181.     If UserRecord.Vitality+Temp#>MaxInt Then
  2182.        UserRecord.Vitality=MaxInt
  2183.     Else
  2184.        UserRecord.Vitality=UserRecord.Vitality+Temp#
  2185.     Endif
  2186.     Call New.Stats
  2187.     Strng="You now have"+Str$(UserRecord.Vitality)+" vitality points!"
  2188.     Call IO.O
  2189.     Exit Sub
  2190.  Case 8
  2191.     If UserRecord.Poison Then
  2192.        UserRecord.Poison=False
  2193.        Strng="The poison disappeared!"
  2194.        Call IO.O
  2195.        Exit Sub
  2196.     Endif
  2197.     Strng="Nothing happened!"
  2198.     Call IO.O
  2199.     Exit Sub
  2200.  Case 10
  2201.     Next.Room=SpellRecord.Teleport
  2202.     Call Teleport
  2203.     Call Enter.Room
  2204.     Exit Sub
  2205.  Case 13
  2206.     Pass.Door=True
  2207.     Strng="You hear a click!"
  2208.     Call IO.O
  2209.     Exit Sub
  2210.  Case 14
  2211.     For Temp5=1 To Monclass.Max
  2212.        Choice=Monster.Class(Temp5,Int(Rnd*10+1))
  2213.        If Choice Then
  2214.           Get 7,Choice,MonsterRecord
  2215.           If MonsterRecord.Level=UserRecord.Level Then
  2216.              Call Get.Monster
  2217.              Exit Sub
  2218.           Endif
  2219.        Endif
  2220.     Next
  2221.     Strng="Nothing conjures!"
  2222.     Call IO.O
  2223.     Exit Sub
  2224.  Case 15
  2225.     Strng="You can't cast a psi spell!"
  2226.     Call IO.O
  2227.     Exit Sub
  2228.  Case 16
  2229.     For Temp5=1 To 10
  2230.        Temp4=RoomRecord.Object(Temp5)
  2231.        If Temp4>False And Temp4<=Lof(6)/Len(ObjectRecord) Then
  2232.           Get 6,Temp4,ObjectRecord
  2233.           If ObjectRecord.Invisible Or ObjectRecord.Hidden Then
  2234.              Strng="You detect hidden objects here!"
  2235.              Call IO.O
  2236.              Exit Sub
  2237.           Endif
  2238.        Endif
  2239.     Next
  2240.     Strng="You detect nothing."
  2241.     Call IO.O
  2242.     Exit Sub
  2243.  Case 17
  2244.     Temp2=False
  2245.     Temp4=False
  2246.     For Temp5=1 To 11
  2247.        Get 5,Room,RoomRecord
  2248.        Temp1=RoomRecord.Direct(Temp5)
  2249.        If Temp1 Then
  2250.           Get 5,Temp1,RoomRecord
  2251.           If RoomRecord.MonsterClass>Temp2 Then
  2252.              Temp4=Temp5
  2253.              Temp2=RoomRecord.MonsterClass
  2254.           Endif
  2255.        Endif
  2256.     Next
  2257.     Get 5,Room,RoomRecord
  2258.     If Temp4 Then
  2259.        Strng="You detect evil going "+Rtrim$(Direction(Temp4))+"!"
  2260.        Call IO.O
  2261.        Exit Sub
  2262.     Endif
  2263.     Strng="You detect no evil presence."
  2264.     Call IO.O
  2265.     Exit Sub
  2266.  Case 18
  2267.     For Temp5=1 To 10
  2268.        Temp4=RoomRecord.Object(Temp5)
  2269.        If Temp4>False And Temp4<=Lof(6)/Len(ObjectRecord) Then
  2270.           Get 6,Temp4,ObjectRecord
  2271.           If ObjectRecord.Trap Then
  2272.              Strng="You detect traps here!"
  2273.              Call IO.O
  2274.              Exit Sub
  2275.           Endif
  2276.        Endif
  2277.     Next
  2278.     Strng="You detect nothing."
  2279.     Call IO.O
  2280.     Exit Sub
  2281.  Case 20
  2282.     Temp9=False
  2283.     For Temp5=1 To 10
  2284.        If RoomRecord.Treasure(Temp5)=False Then
  2285.           Temp9=True
  2286.           Exit For
  2287.        Endif
  2288.     Next
  2289.     If Temp9=False Then
  2290.        Strng="You didn't set the trap!"
  2291.        Call IO.O
  2292.        Exit Sub
  2293.     Endif
  2294.     If UserRecord.Stats(2)<Int(Rnd*5+5) Then
  2295.        Strng="You didn't set the trap!"
  2296.        Call IO.O
  2297.        Exit Sub
  2298.     Endif
  2299.     If UserRecord.Stats(2)+UserRecord.Stats(3)<Int(Rnd*10+5) Then
  2300.        Strng="The trap explodes in your face!"
  2301.        Call IO.O
  2302.        Prefix2=Nul
  2303.        Temp2=Int(Rnd*10+2)*UserRecord.Level
  2304.        Strng="The trap hit you for"
  2305.        Out3="setting a trap"
  2306.        Call Hit.Player(Temp2)
  2307.        Exit Sub
  2308.     Endif
  2309.     RoomRecord.Treasure(Temp5)=True
  2310.     RoomRecord.TreCharges(Temp5)=UserRecord.Level
  2311.     RoomRecord.Flags(Temp5)=Magic.Trap
  2312.     Put 5,Room,RoomRecord
  2313.     Strng="You set a magical trap!"
  2314.     Call IO.O
  2315.     Exit Sub
  2316.  Case 21
  2317.     Temp9=False
  2318.     For Temp=1 To 10
  2319.        If RoomRecord.Treasure(Temp)=False Then
  2320.           Temp9=True
  2321.           Exit For
  2322.        Endif
  2323.     Next
  2324.     If Temp9=False Then
  2325.        Strng="You didn't hide the object!"
  2326.        Call IO.O
  2327.        Exit Sub
  2328.     Endif
  2329.     If UserRecord.Stats(2)<Int(Rnd*5+4) Then
  2330.        Strng="You didn't hide the object!"
  2331.        Call IO.O
  2332.        Exit Sub
  2333.     Endif
  2334.     Call Discard(Temp5,True)
  2335.     RoomRecord.Treasure(Temp)=Abs(Temp7)
  2336.     RoomRecord.TreCharges(Temp)=Temp6
  2337.     RoomRecord.Flags(Temp)=Magically.Hidden
  2338.     Put 5,Room,RoomRecord
  2339.     Strng="You hide the object magically!"
  2340.     Call IO.O
  2341.     Exit Sub
  2342.  Case 22
  2343.     Graphics.Off=True
  2344.     Strng="You find "
  2345.     Carriage.Return=True
  2346.     Call IO.O
  2347.     Temp8=False
  2348.     Temp1=False
  2349.     Strng=Nul
  2350.     For Temp5=1 To 10
  2351.        Out2=Nul
  2352.        If RoomRecord.Flags(Temp5)=Magically.Hidden Then
  2353.           Temp2=RoomRecord.Treasure(Temp5)
  2354.           If Temp2>False And Temp2<=Lof(8)/Len(TreasureRecord) Then
  2355.              Get 8,Temp2,TreasureRecord
  2356.              Out2=TreasureRecord.TreasureName
  2357.              Out2=Rtrim$(Out2)+" [inv]"
  2358.           Endif
  2359.        Endif
  2360.        If Strng<>Nul And Out2<>Nul Then
  2361.           Carriage.Return=True
  2362.           Call IO.O
  2363.           Temp1=Temp1+1
  2364.        Endif
  2365.        If Out2<>Nul Then
  2366.           Temp8=True
  2367.           Strng=Out2+", "
  2368.        Endif
  2369.     Next
  2370.     If Temp8=False Then
  2371.        Strng="nothing special.."
  2372.     Endif
  2373.     If Temp8 And Strng<>Nul Then
  2374.        Strng=Left$(Strng,Len(Strng)-2)+"."
  2375.        If Temp1>1 Then
  2376.           Strng="and "+Strng
  2377.        Endif
  2378.     Endif
  2379.     Call IO.O
  2380.     Graphics.Off=False
  2381.     Exit Sub
  2382.  Case 23
  2383.     Invisible=Int((UserRecord.Level+2)/Room.Health.Rate)
  2384.     If Invisible>False Then
  2385.        UserRecord.Invisible=True
  2386.        Strng="You are now invisible!"
  2387.        Call IO.O
  2388.        Exit Sub
  2389.     Endif
  2390.     UserRecord.Invisible=False
  2391.     Invisible=False
  2392.     Strng="Didn't work!"
  2393.     Call IO.O
  2394.     Exit Sub
  2395.  Case 24
  2396.     Parsed.Command1=Last.Monster
  2397.     Call Check.Monster
  2398.     If Monster.Temp=False Then
  2399.        Strng="You are not fighting a monster now!"
  2400.        Call IO.O
  2401.        Exit Sub
  2402.     Endif
  2403.     Graphics.Off=True
  2404.     Call The.Or.An
  2405.     Out3=MonsterArray(Monster.Temp).MonsterName
  2406.     Out3=Rtrim$(Out3)
  2407.     Out3=Lcase$(Out3)
  2408.     Temp4=MonsterArray(Monster.Temp).Level
  2409.     Strng="You are fighting "+Prefix1+Out3+_
  2410.     " (level"+Str$((Temp4-1)*2+1)+" to"+Str$(Temp4*2)+")"
  2411.     Call IO.O
  2412.     Strng="The "+Out3+" has"+Str$(MonsterArray(Monster.Temp).Hits)+_
  2413.     " hits and"+Str$(MonsterArray(Monster.Temp).Experience)+" experience."
  2414.     Call IO.O
  2415.     Temp4=MonsterArray(Monster.Temp).Spell
  2416.     If Temp4>False And Temp4<=Spells.Max Then
  2417.        SpellRecord=SpellArray(Temp4)
  2418.        Strng="It can cast "+Rtrim$(SpellRecord.SpellName)+" spells."
  2419.        Call IO.O
  2420.     Endif
  2421.     If MonsterArray(Monster.Temp).Poison Then
  2422.        Strng="It can poison."
  2423.        Call IO.O
  2424.     Endif
  2425.     If MonsterArray(Monster.Temp).LevelDrain Then
  2426.        Strng="It can drain levels."
  2427.        Call IO.O
  2428.     Endif
  2429.     If MonsterArray(Monster.Temp).Psionic Then
  2430.        Strng="It can cast psi spells."
  2431.        Call IO.O
  2432.     Endif
  2433.     If MonsterArray(Monster.Temp).Magic Then
  2434.        Strng="It is magical."
  2435.        Call IO.O
  2436.     Endif
  2437.     If MonsterArray(Monster.Temp).Block Then
  2438.        Strng="It blocks exits."
  2439.        Call IO.O
  2440.     Endif
  2441.     If MonsterArray(Monster.Temp).Prevent Then
  2442.        Strng="It prevents treasure take."
  2443.        Call IO.O
  2444.     Endif
  2445.     If MonsterArray(Monster.Temp).Follow Then
  2446.        Strng="It follows users."
  2447.        Call IO.O
  2448.     Endif
  2449.     If MonsterArray(Monster.Temp).Jail Then
  2450.        Strng="It jails attacker."
  2451.        Call IO.O
  2452.     Endif
  2453.     If MonsterArray(Monster.Temp).Teleport Then
  2454.        Strng="It can teleport."
  2455.        Call IO.O
  2456.     Endif
  2457.     Graphics.Off=False
  2458.     Exit Sub
  2459.  Case 25
  2460.     Graphics.Off=True
  2461.     Strng="You see "
  2462.     Carriage.Return=True
  2463.     Call IO.O
  2464.     Temp1=False
  2465.     Temp8=False
  2466.     Strng=Nul
  2467.     For Temp5=1 To 10
  2468.        Out2=Nul
  2469.        If RoomRecord.Flags(Temp5)=Hidden.Object Then
  2470.           Temp2=RoomRecord.Treasure(Temp5)
  2471.           If Temp2>False And Temp2<=Lof(8)/Len(TreasureRecord) Then
  2472.              Get 8,Temp2,TreasureRecord
  2473.              Out2=TreasureRecord.TreasureName
  2474.              Out2=Rtrim$(Out2)+" [inv]"
  2475.           Endif
  2476.        Endif
  2477.        If Strng<>Nul And Out2<>Nul Then
  2478.           Carriage.Return=True
  2479.           Call IO.O
  2480.           Temp1=Temp1+1
  2481.        Endif
  2482.        If Out2<>Nul Then
  2483.           Temp8=True
  2484.           Strng=Out2+", "
  2485.        Endif
  2486.     Next
  2487.     If Temp8=False Then
  2488.        Strng="nothing special.."
  2489.     Endif
  2490.     If Temp8 And Strng<>Nul Then
  2491.        Strng=Left$(Strng,Len(Strng)-2)+"."
  2492.        If Temp1>1 Then
  2493.           Strng="and "+Strng
  2494.        Endif
  2495.     Endif
  2496.     Call IO.O
  2497.     Graphics.Off=False
  2498.     Exit Sub
  2499.  Case 26
  2500.     Graphics.Off=True
  2501.     Strng="You see "
  2502.     Carriage.Return=True
  2503.     Call IO.O
  2504.     Temp8=False
  2505.     Temp1=False
  2506.     Strng=Nul
  2507.     For Temp5=1 To 10
  2508.        Out2=Nul
  2509.        If RoomRecord.Flags(Temp5)=Magic.Trap Then
  2510.           If RoomRecord.Treasure(Temp5)=True Then
  2511.              Out2="a magical trap "
  2512.              Out2=Out2+"["+Mid$(Str$(RoomRecord.TreCharges(Temp5)),2)+" hits]"
  2513.           Endif
  2514.        Endif
  2515.        If Strng<>Nul And Out2<>Nul Then
  2516.           Carriage.Return=True
  2517.           Call IO.O
  2518.           Temp1=Temp1+1
  2519.        Endif
  2520.        If Out2<>Nul Then
  2521.           Temp8=True
  2522.           Strng=Out2+", "
  2523.        Endif
  2524.     Next
  2525.     If Temp8=False Then
  2526.        Strng="nothing special.."
  2527.     Endif
  2528.     If Strng<>Nul Then
  2529.        Strng=Left$(Strng,Len(Strng)-2)+"."
  2530.        If Temp1>1 Then
  2531.           Strng="and "+Strng
  2532.        Endif
  2533.     Endif
  2534.     Call IO.O
  2535.     Graphics.Off=False
  2536.     Exit Sub
  2537.  Case 27
  2538. 10251
  2539.     Temp#=Cdbl(UserRecord.Level+Multiplier)
  2540.     Temp#=Temp#*Config2(82)
  2541. 10252
  2542.     If Temp#<0 Or Temp#>MaxInt Then
  2543.        Temp#=MaxInt
  2544.     Endif
  2545.     If UserRecord.Psionic+Temp#>MaxInt Then
  2546.        UserRecord.Psionic=MaxInt
  2547.     Else
  2548.        UserRecord.Psionic=UserRecord.Psionic+Temp#
  2549.     Endif
  2550.     Call New.Stats
  2551.     Strng="You now have"+Str$(UserRecord.Psionic)+" psionic points!"
  2552.     Call IO.O
  2553.     Exit Sub
  2554.  Case 28
  2555.     If UserRecord.Psionic=False Then
  2556.        Strng="You have no more psionic points!"
  2557.        Call IO.O
  2558.        Exit Sub
  2559.     Endif
  2560.     Temp6=UserRecord.Psionic
  2561.     Temp6=Temp6-Multiplier
  2562.     If Temp6<False Then
  2563.        Temp6=False
  2564.     Endif
  2565.     UserRecord.Psionic=Temp6
  2566.     If Len(Parsed.Command1) Then
  2567.        Call Search.Mess(False)
  2568.        If Temp=False Then
  2569.           Out2=Parsed.Command1
  2570.           Out2=Lcase$(Out2)
  2571.           Strng=Out2+" is not online!"
  2572.           Call IO.O
  2573.           Exit Sub
  2574.        Endif
  2575.        Strng="Message:"
  2576.        Call IO.I
  2577.        Call Send.Mess(10,TempB,False,Out2)
  2578.        Exit Sub
  2579.     Endif
  2580.     Strng="Message:"
  2581.     Call IO.I
  2582.     Call Send.Mess(11,False,False,Out2)
  2583.     Exit Sub
  2584.  Case Else
  2585.     Strng="You can't cast that spell!"
  2586.     Call IO.O
  2587.  End Select
  2588. 10253
  2589.  Exit Sub
  2590. 10254
  2591.  If Erl=10243 Then
  2592.     Resume 10244
  2593.  Endif
  2594.  If Erl=10245 Then
  2595.     Resume 10246
  2596.  Endif
  2597.  If Erl=10247 Then
  2598.     Resume 10248
  2599.  Endif
  2600.  If Erl=10249 Then
  2601.     Resume 10250
  2602.  Endif
  2603.  If Erl=10251 Then
  2604.     Resume 10252
  2605.  Endif
  2606.  Resume 10253
  2607. End Sub
  2608.  
  2609. Sub Psi.Mode
  2610.  On Local Error Goto 10262
  2611.  Temp3=False
  2612.  Out2="attack"
  2613.  Out3=Lcase$(Parsed.Command1)
  2614.  If Out2=Out3 Then
  2615.     Temp3=1
  2616.  Endif
  2617.  Out2="defense"
  2618.  If Out2=Out3 Then
  2619.     Temp3=2
  2620.  Endif
  2621.  If Temp3=False Then
  2622.     Strng="You can only use psi mode attack or defense!"
  2623.     Call IO.O
  2624.     Exit Sub
  2625.  Endif
  2626.  Strng="Psi spell?"
  2627.  Call IO.I
  2628.  Out2=Ucase$(Out2)
  2629.  Out2=Rtrim$(Out2)
  2630.  Temp9=False
  2631.  For Temp5=1 To Spells.Max
  2632.     SpellRecord=SpellArray(Temp5)
  2633.     Strng=SpellRecord.Chant
  2634.     Strng=Rtrim$(Strng)
  2635.     If Strng=Out2 Then
  2636.        If SpellRecord.Psionic Then
  2637.           Temp9=True
  2638.           Exit For
  2639.        Endif
  2640.     Endif
  2641.  Next
  2642.  If Temp9=False Then
  2643.     Strng="Unknown psi spell!"
  2644.     Call IO.O
  2645.     Exit Sub
  2646.  Endif
  2647.  Out6=SpellRecord.SpellName
  2648.  Out6=Rtrim$(Out6)
  2649.  Out6=Lcase$(Out6)
  2650.  If Temp3<>SpellRecord.PsionicMode Then
  2651.     Strng="Incorrect spell for psi mode!"
  2652.     Call IO.O
  2653.     Exit Sub
  2654.  Endif
  2655.  Temp1=SpellRecord.Level
  2656.  If UserRecord.Psionic=False Then
  2657.     Strng="You have no more psi points!"
  2658.     Call IO.O
  2659.     Exit Sub
  2660.  Endif
  2661.  Temp6=UserRecord.Psionic
  2662.  Temp6=Temp6-Temp1
  2663.  If Temp6<False Then
  2664.     Temp6=False
  2665.  Endif
  2666.  UserRecord.Psionic=Temp6
  2667.  If Temp3=1 Then
  2668.     Psi.Attack.Mode=Temp1
  2669.  Else
  2670.     Psi.Defense.Mode=Temp1
  2671.  Endif
  2672.  Strng="You cast a "+Out6+" psi spell!"
  2673.  Call IO.O
  2674.  Strng="cast a "+Out6+" psi spell"
  2675.  Call Update.DayFile(Strng,False)
  2676.  Parsed.Command1=Last.Monster
  2677.  Out2=UserRecord.CodeName
  2678.  Call Decrypt(Out2)
  2679.  Out2=Rtrim$(Out2)
  2680.  Out2=Lcase$(Out2)
  2681.  Out2=Out2+" casts a psionic spell!"
  2682.  Call Send.Mess(8,False,Room,Out2)
  2683.  If Temp3=2 Then
  2684.     Strng="Your psi defense mode is now active."
  2685.     Call IO.O
  2686.  Endif
  2687. 10261
  2688.  Exit Sub
  2689. 10262
  2690.  Resume 10261
  2691. End Sub
  2692.  
  2693. Sub Talk.To.Monster
  2694.  On Local Error Goto 10272
  2695.  Call Check.Monster
  2696.  If Monster.Temp=False Then
  2697.     Call Check.User
  2698.     If User.Temp=False Then
  2699.        Strng="You can't talk to that!"
  2700.        Call IO.O
  2701.        Exit Sub
  2702.     Endif
  2703.     Call He.She
  2704.     Strng=Prefix1+" sneers wickedly at you.."
  2705.     Call IO.O
  2706.     Exit Sub
  2707.  Endif
  2708.  Temp2=MonsterArray(Monster.Temp).Talk(Int(Rnd*5+1))
  2709.  Strng=Nul
  2710.  If Temp2>False And Temp2<=Lof(9)/Len(MonsterTalkRecord) Then
  2711.     Get 9,Temp2,MonsterTalkRecord
  2712.     Strng=Rtrim$(MonsterTalkRecord.TalkMessage)
  2713.  Endif
  2714.  If Strng=Nul Then
  2715.     Strng="The monster doesn't reply!"
  2716.  Endif
  2717.  Call IO.O
  2718.  Get 5,Room,RoomRecord
  2719.  If MonsterIndex(Monster.Temp)=RoomRecord.MonsterTalk Then
  2720.     Out3="As you begin to speak,"
  2721.     Out4="The monster hits you for"
  2722.     Call Actions
  2723.  Endif
  2724. 10271
  2725.  Exit Sub
  2726. 10272
  2727.  Resume 10271
  2728. End Sub
  2729.  
  2730. Sub Offer
  2731.  On Local Error Goto 10282
  2732.  Call Parse
  2733.  If Parser=False Then
  2734.     Strng="Offer to whom?"
  2735.     Call IO.O
  2736.     Exit Sub
  2737.  Endif
  2738.  Temp$=Parsed.Command1
  2739.  Parsed.Command1=Parsed.Command2
  2740.  Call Parse
  2741.  If Parser Then
  2742.     If Node<=False Then
  2743.        Strng="You can't offer!"
  2744.        Call IO.O
  2745.        Exit Sub
  2746.     Endif
  2747.     Temp2$=Parsed.Command1
  2748.     Temp3$=Parsed.Command2
  2749.     Call Search.Mess(False)
  2750.     VarX=TempC
  2751.     If TempB=User.Index Or Temp<>Room Then
  2752.        Strng="You can't offer to that player!"
  2753.        Call IO.O
  2754.        Exit Sub
  2755.     Endif
  2756.     Get 1,VarX,MessWorkRecord1
  2757.     If MessWorkRecord1.OfferTime>False Then
  2758.        Strng=MessWorkRecord1.UserName
  2759.        Strng=Rtrim$(Strng)
  2760.        Strng=Lcase$(Strng)
  2761.        Mid$(Strng,1,1)=Ucase$(Mid$(Strng,1,1))
  2762.        Strng=Strng+" already has an offer!"
  2763.        Call IO.O
  2764.        Exit Sub
  2765.     Endif
  2766.     VarA=False
  2767.     Parsed.Command1=Temp3$
  2768.     Call Search.User.Inventory
  2769.     If Temp7=False Then
  2770.        VarA=Int(Val(Parsed.Command1))
  2771.     Endif
  2772.     If Temp7=False And VarA=False Then
  2773.        Strng="You can't offer for that!"
  2774.        Call IO.O
  2775.        Exit Sub
  2776.     Endif
  2777.     Var1=Temp5
  2778.     Var2=Temp6
  2779.     Var3=Temp7
  2780.     VarB=False
  2781.     Parsed.Command1=Temp$
  2782.     Call Check.Inventory.Treasure
  2783.     If Temp7=False Then
  2784.        VarB=Int(Val(Parsed.Command1))
  2785.     Endif
  2786.     If Temp7=False And VarB=False Then
  2787.        Strng="You can't offer that!"
  2788.        Call IO.O
  2789.        Exit Sub
  2790.     Endif
  2791.     If VarB>False Then
  2792.        If UserRecord.Gold-VarB<False Then
  2793.           Strng="You don't have that much gold!"
  2794.           Call IO.O
  2795.           Exit Sub
  2796.        Endif
  2797.     Endif
  2798.     Var4=Temp5
  2799.     Var5=Temp6
  2800.     Var6=Temp7
  2801.     TempX=VarX
  2802.     Gosub Send.Node.Offer
  2803.     TempX=Noden+1
  2804.     Gosub Send.Node.Offer
  2805.     Out2="offers you"
  2806.     If VarB>False Then
  2807.        Out2=Out2+Str$(VarB)+" gold"
  2808.     Else
  2809.        Get 8,Var6,TreasureRecord
  2810.        Out3=TreasureRecord.TreasureName
  2811.        Out3=Rtrim$(Out3)
  2812.        Out3=Lcase$(Out3)
  2813.        Out2=Out2+" "+Out3
  2814.     Endif
  2815.     Out2=Out2+" for"
  2816.     If VarA>False Then
  2817.        Out2=Out2+Str$(VarA)+" gold"
  2818.     Else
  2819.        Get 8,Var3,TreasureRecord
  2820.        Out3=TreasureRecord.TreasureName
  2821.        Out3=Rtrim$(Out3)
  2822.        Out3=Lcase$(Out3)
  2823.        Out2=Out2+" "+Out3
  2824.     Endif
  2825.     Out2=Out2+"!"
  2826.     Call Send.Mess(19,TempB,Room,Out2)
  2827.     Exit Sub
  2828.  Endif
  2829.  Call Check.Monster
  2830.  If Monster.Temp=False Then
  2831.     Strng="That's not here!"
  2832.     Call IO.O
  2833.     Exit Sub
  2834.  Endif
  2835.  Temp9=False
  2836.  Temp2=False
  2837.  If MonsterArray(Monster.Temp).Magic=False Then
  2838.     If MonsterArray(Monster.Temp).Permanent=False Then
  2839.        Parsed.Command1=Temp$
  2840.        Call Check.Inventory.Treasure
  2841.        If Temp7 Then
  2842.           If TreasureRecord.Recep Then
  2843.              Temp9=True
  2844.           Endif
  2845.           If TreasureRecord.Spell Then
  2846.              SpellRecord=SpellArray(TreasureRecord.Spell)
  2847.              If SpellRecord.SpellType=4 Then
  2848.                 Temp9=True
  2849.              Endif
  2850.           Endif
  2851.           If Abs(TreasureRecord.Plus)>=Config2(27) Then
  2852.              Temp9=True
  2853.           Endif
  2854.        Else
  2855.           Temp2=Int(Val(Parsed.Command1))
  2856.           If Temp2>False Then
  2857.              If Temp2>Config1(15)*MonsterArray(Monster.Temp).Level Then
  2858.                 If UserRecord.Gold-Temp2>=False Then
  2859.                    Temp9=True
  2860.                 Endif
  2861.              Endif
  2862.           Endif
  2863.        Endif
  2864.     Endif
  2865.  Endif
  2866.  If Temp9=False Then
  2867.     Strng="The monster ignores your offer!"
  2868.     Call IO.O
  2869.     Exit Sub
  2870.  Endif
  2871.  Call Remove.Monster
  2872.  If Temp2 Then
  2873.     UserRecord.Gold=UserRecord.Gold-Temp2
  2874.     Strng="The monster takes your offer and leaves!"
  2875.     Call IO.O
  2876.     Exit Sub
  2877.  Endif
  2878.  Call Discard(Temp5,True)
  2879.  Strng="The monster trades with you and leaves!"
  2880.  Call IO.O
  2881.  Exit Sub
  2882.  
  2883. Send.Node.Offer:
  2884.  Get 1,TempX,MessWorkRecord1
  2885.  MessWorkRecord1.OfferTime=Timer+30!
  2886.  If VarB>False Then
  2887.     MessWorkRecord1.GoldOffer=VarB
  2888.     MessWorkRecord1.ItemOffer=False
  2889.     MessWorkRecord1.OfferCharges=False
  2890.  Else
  2891.     MessWorkRecord1.GoldOffer=False
  2892.     MessWorkRecord1.ItemOffer=Var6
  2893.     MessWorkRecord1.OfferCharges=Var5
  2894.  Endif
  2895.  If VarA>False Then
  2896.     MessWorkRecord1.GoldFor=VarA
  2897.     MessWorkRecord1.ItemFor=False
  2898.     MessWorkRecord1.ForCharges=False
  2899.  Else
  2900.     MessWorkRecord1.GoldFor=False
  2901.     MessWorkRecord1.ItemFor=Var3
  2902.     MessWorkRecord1.ForCharges=Var2
  2903.  Endif
  2904.  MessWorkRecord1.FromNode=Noden+1
  2905.  Put 1,TempX,MessWorkRecord1
  2906.  Return
  2907. 10281
  2908.  Exit Sub
  2909. 10282
  2910.  Resume 10281
  2911. End Sub
  2912.  
  2913. Sub Accept.Offer
  2914.  On Local Error Goto 10292
  2915.  If Node<=False Then
  2916.     Strng="There are no offers!"
  2917.     Call IO.O
  2918.     Exit Sub
  2919.  Endif
  2920.  Get 1,Noden+1,MessWorkRecord1
  2921.  If MessWorkRecord1.OfferTime<=False Then
  2922.     Strng="There are no offers to accept!"
  2923.     Call IO.O
  2924.     Exit Sub
  2925.  Endif
  2926.  Var1=MessWorkRecord1.GoldFor
  2927.  If Var1>False Then
  2928.     If UserRecord.Gold-Var1<False Then
  2929.        Strng="You don't have enough gold to trade!"
  2930.        Call IO.O
  2931.        Exit Sub
  2932.     Endif
  2933.  Else
  2934.     Var2=False
  2935.     For Temp5=1 To Number.Inventory
  2936.        If Treasure(Temp5)=MessWorkRecord1.ItemFor Then
  2937.           Var2=Temp5
  2938.           Exit For
  2939.        Endif
  2940.     Next
  2941.     If Var2=False Then
  2942.        Strng="You don't have the item to trade!"
  2943.        Call IO.O
  2944.     Endif
  2945.  Endif
  2946.  Strng="You accept the offer and trade!"
  2947.  Call IO.O
  2948.  If Var1>False Then
  2949.     UserRecord.Gold=UserRecord.Gold-Var1
  2950.  Else
  2951.     Call Discard(Temp5,True)
  2952.  Endif
  2953.  Var1=MessWorkRecord1.GoldOffer
  2954.  If Var1>False Then
  2955.     UserRecord.Gold=UserRecord.Gold+Var1
  2956.  Else
  2957.     Temp7=MessWorkRecord1.ItemOffer
  2958.     Temp6=MessWorkRecord1.OfferCharges
  2959.     Call Add.Inventory(Temp7,Temp6)
  2960.  Endif
  2961.  Temp1=MessWorkRecord1.FromNode
  2962.  MessWorkRecord1.OfferTime=False
  2963.  Put 1,Noden+1,MessWorkRecord1
  2964.  Get 1,Temp1,MessWorkRecord1
  2965.  MessWorkRecord1.OfferTime=True
  2966.  Put 1,Temp1,MessWorkRecord1
  2967. 10291
  2968.  Exit Sub
  2969. 10292
  2970.  Resume 10291
  2971. End Sub
  2972.  
  2973. Sub Rust.Weapon
  2974.  On Local Error Goto 10302
  2975.  If Room.Rust.Rate=False Then
  2976.     Exit Sub
  2977.  Endif
  2978.  Rust.Rate=Rust.Rate+1
  2979.  If Rust.Rate<Room.Rust.Rate Then
  2980.     Exit Sub
  2981.  Endif
  2982.  Rust.Rate=False
  2983.  Temp1=Weapon2
  2984.  Temp2=Weapon6
  2985.  Gosub Rust.Inventory
  2986.  Temp1=Weapon3
  2987.  Temp2=Weapon5
  2988.  Gosub Rust.Inventory
  2989.  Temp1=Weapon1
  2990.  Temp2=Weapon4
  2991.  Gosub Rust.Inventory
  2992.  Temp1=Weapon8
  2993.  Temp2=Weapon7
  2994.  Gosub Rust.Inventory
  2995.  Exit Sub
  2996.  
  2997. Rust.Inventory:
  2998.  If Temp1 Then
  2999.     Get 8,Treasure(Temp2),TreasureRecord
  3000.     If TreasureRecord.Rustable=True Then
  3001.        If Rnd<(TreasureRecord.RustPercent/100) Then
  3002.           Strng=TreasureRecord.ShortName
  3003.           Strng=Rtrim$(Strng)
  3004.           Strng=Lcase$(Strng)
  3005.           Strng="Your "+Strng+" rusts!"
  3006.           Call IO.O
  3007.           Call Discard(Temp2,True)
  3008.        Endif
  3009.     Endif
  3010.  Endif
  3011.  Return
  3012. 10301
  3013.  Exit Sub
  3014. 10302
  3015.  Resume 10301
  3016. End Sub
  3017.  
  3018. Sub Steal.Treasure
  3019.  On Local Error Goto 10312
  3020.  If Room.Steal.Rate=False Then
  3021.     Exit Sub
  3022.  Endif
  3023.  Steal.Rate=Steal.Rate+1
  3024.  If Steal.Rate<Room.Steal.Rate Then
  3025.     Exit Sub
  3026.  Endif
  3027.  Steal.Rate=False
  3028.  If Number.Monsters=False Then
  3029.     Exit Sub
  3030.  Endif
  3031.  For Temp2=1 To Number.Inventory
  3032.     If Treasure(Temp2) Then
  3033.        Get 8,Treasure(Temp2),TreasureRecord
  3034.        If TreasureRecord.Stealable=True Then
  3035.           If Rnd<(TreasureRecord.StealPercent/100) Then
  3036.              For Temp3=1 To Number.Monsters
  3037.                 If MonsterArray(Temp3).Permanent=False Then
  3038.                    For Temp4=1 To 5
  3039.                       If MonsterArray(Temp3).Treasure(Temp4)=False Then
  3040.                          MonsterArray(Temp3).Treasure(Temp4)=Treasure(Temp2)
  3041.                          Strng=MonsterArray(Temp3).MonsterName
  3042.                          Strng=Rtrim$(Strng)
  3043.                          Out2=TreasureRecord.ShortName
  3044.                          Out2=Rtrim$(Out2)
  3045.                          Out2=Lcase$(Out2)
  3046.                          Strng="The "+Strng+" steals your "+Out2+"!"
  3047.                          Call IO.O
  3048.                          Call Discard(Temp2,True)
  3049.                          Exit Sub
  3050.                       Endif
  3051.                    Next
  3052.                 Endif
  3053.              Next
  3054.           Endif
  3055.        Endif
  3056.     Endif
  3057.  Next
  3058. 10311
  3059.  Exit Sub
  3060. 10312
  3061.  Resume 10311
  3062. End Sub
  3063.