hedgewars/HHHandlers.inc
branchhedgeroid
changeset 5375 ec4006837feb
parent 5322 1bcc12a30d5d
child 5343 ff7ecf483759
equal deleted inserted replaced
5373:ad1c61a6ab4d 5375:ec4006837feb
   123 if s then ApplyAmmoChanges(HHGear^.Hedgehog^)
   123 if s then ApplyAmmoChanges(HHGear^.Hedgehog^)
   124 end;
   124 end;
   125 
   125 
   126 procedure HHSetTimer(Gear: PGear);
   126 procedure HHSetTimer(Gear: PGear);
   127 var CurWeapon: PAmmo;
   127 var CurWeapon: PAmmo;
       
   128     color: LongWord;
   128 begin
   129 begin
   129 Gear^.Message:= Gear^.Message and not gmTimer;
   130 Gear^.Message:= Gear^.Message and not gmTimer;
   130 CurWeapon:= GetAmmoEntry(Gear^.Hedgehog^);
   131 CurWeapon:= GetAmmoEntry(Gear^.Hedgehog^);
   131 with Gear^.Hedgehog^ do
   132 with Gear^.Hedgehog^ do
   132     if (CurWeapon^.Propz and ammoprop_Timerable) <> 0 then
   133     if ((Gear^.Message and gmPrecise) <> 0) and ((CurWeapon^.Propz and ammoprop_SetBounce) <> 0) then
       
   134         begin
       
   135         color:= Gear^.Hedgehog^.Team^.Clan^.Color;
       
   136         case Gear^.MsgParam of
       
   137             1: begin
       
   138                AddCaption(format(trmsg[sidBounce], trmsg[sidBounce1]), color, capgrpAmmostate);
       
   139                CurWeapon^.Bounciness:= 350;
       
   140                end;
       
   141             2: begin
       
   142                AddCaption(format(trmsg[sidBounce], trmsg[sidBounce2]), color, capgrpAmmostate);
       
   143                CurWeapon^.Bounciness:= 700;
       
   144                end;
       
   145             3: begin
       
   146                AddCaption(format(trmsg[sidBounce], trmsg[sidBounce3]), color, capgrpAmmostate);
       
   147                CurWeapon^.Bounciness:= 1000;
       
   148                end;
       
   149             4: begin
       
   150                AddCaption(format(trmsg[sidBounce], trmsg[sidBounce4]), color, capgrpAmmostate);
       
   151                CurWeapon^.Bounciness:= 2000;
       
   152                end;
       
   153             5: begin
       
   154                AddCaption(format(trmsg[sidBounce], trmsg[sidBounce5]), color, capgrpAmmostate);
       
   155                CurWeapon^.Bounciness:= 4000;
       
   156                end
       
   157             end
       
   158         end
       
   159     else if (CurWeapon^.Propz and ammoprop_Timerable) <> 0 then
   133         begin
   160         begin
   134         CurWeapon^.Timer:= 1000 * Gear^.MsgParam;
   161         CurWeapon^.Timer:= 1000 * Gear^.MsgParam;
   135         with CurrentTeam^ do
   162         with CurrentTeam^ do
   136             ApplyAmmoChanges(Hedgehogs[CurrHedgehog]);
   163             ApplyAmmoChanges(Hedgehogs[CurrHedgehog]);
   137         end;
   164         end;
   138 end;
   165 end;
   139 
   166 
   140 
   167 
   141 procedure Attack(Gear: PGear);
   168 procedure Attack(Gear: PGear);
   142 var xx, yy, newDx, newDy, lx, ly: hwFloat;
   169 var xx, yy, newDx, newDy, lx, ly: hwFloat;
   143     tmpGear: PVisualGear;
   170     speech: PVisualGear;
       
   171     newGear:  PGear;
   144     CurWeapon: PAmmo;
   172     CurWeapon: PAmmo;
   145     altUse: boolean;
   173     altUse: boolean;
   146 begin
   174     elastic: hwFloat;
       
   175 begin
       
   176 newGear:= nil;
   147 bShowFinger:= false;
   177 bShowFinger:= false;
   148 CurWeapon:= GetAmmoEntry(Gear^.Hedgehog^);
   178 CurWeapon:= GetAmmoEntry(Gear^.Hedgehog^);
   149 with Gear^,
   179 with Gear^,
   150      Gear^.Hedgehog^ do
   180      Gear^.Hedgehog^ do
   151      begin
   181      begin
   202             newDy:= yy*Power/cPowerDivisor;
   232             newDy:= yy*Power/cPowerDivisor;
   203             altUse:= false
   233             altUse:= false
   204             end;
   234             end;
   205 
   235 
   206              case CurAmmoType of
   236              case CurAmmoType of
   207                       amGrenade: FollowGear:= AddGear(hwRound(lx), hwRound(ly), gtGrenade,         0, newDx, newDy, CurWeapon^.Timer);
   237                       amGrenade: newGear:= AddGear(hwRound(lx), hwRound(ly), gtGrenade,         0, newDx, newDy, CurWeapon^.Timer);
   208                       amMolotov: FollowGear:= AddGear(hwRound(lx), hwRound(ly), gtMolotov,      0, newDx, newDy, 0);
   238                       amMolotov: newGear:= AddGear(hwRound(lx), hwRound(ly), gtMolotov,      0, newDx, newDy, 0);
   209                   amClusterBomb: FollowGear:= AddGear(hwRound(lx), hwRound(ly), gtClusterBomb,  0, newDx, newDy, CurWeapon^.Timer);
   239                   amClusterBomb: newGear:= AddGear(hwRound(lx), hwRound(ly), gtClusterBomb,  0, newDx, newDy, CurWeapon^.Timer);
   210                       amGasBomb: FollowGear:= AddGear(hwRound(lx), hwRound(ly), gtGasBomb,      0, newDx, newDy, CurWeapon^.Timer);
   240                       amGasBomb: newGear:= AddGear(hwRound(lx), hwRound(ly), gtGasBomb,      0, newDx, newDy, CurWeapon^.Timer);
   211                       amBazooka: FollowGear:= AddGear(hwRound(lx), hwRound(ly), gtShell,        0, newDx, newDy, 0);
   241                       amBazooka: newGear:= AddGear(hwRound(lx), hwRound(ly), gtShell,        0, newDx, newDy, 0);
   212                      amSnowball: FollowGear:= AddGear(hwRound(lx), hwRound(ly), gtSnowball,     0, newDx, newDy, 0);
   242                      amSnowball: newGear:= AddGear(hwRound(lx), hwRound(ly), gtSnowball,     0, newDx, newDy, 0);
   213                           amBee: FollowGear:= AddGear(hwRound(lx), hwRound(ly), gtBee,          0, newDx, newDy, 0);
   243                           amBee: newGear:= AddGear(hwRound(lx), hwRound(ly), gtBee,          0, newDx, newDy, 0);
   214                       amShotgun: begin
   244                       amShotgun: begin
   215                                  PlaySound(sndShotgunReload);
   245                                  PlaySound(sndShotgunReload);
   216                                  CurAmmoGear:= AddGear(hwRound(lx), hwRound(ly), gtShotgunShot,  0, xx * _0_5, yy * _0_5, 0);
   246                                  newGear:= AddGear(hwRound(lx), hwRound(ly), gtShotgunShot,  0, xx * _0_5, yy * _0_5, 0);
   217                                  end;
   247                                  end;
   218                    amPickHammer: CurAmmoGear:= AddGear(hwRound(lx), hwRound(ly) + cHHRadius, gtPickHammer, 0, _0, _0, 0);
   248                    amPickHammer: newGear:= AddGear(hwRound(lx), hwRound(ly) + cHHRadius, gtPickHammer, 0, _0, _0, 0);
   219                          amSkip: ParseCommand('/skip', true);
   249                          amSkip: ParseCommand('/skip', true);
   220                          amRope: CurAmmoGear:= AddGear(hwRound(lx), hwRound(ly), gtRope, 0, xx, yy, 0);
   250                          amRope: newGear:= AddGear(hwRound(lx), hwRound(ly), gtRope, 0, xx, yy, 0);
   221                          amMine: if altUse then
   251                          amMine: if altUse then
   222                                     AddGear(hwRound(lx) + hwSign(dX) * 7, hwRound(ly), gtMine, gstWait, newDx, newDy, 3000)
   252                                     newGear:= AddGear(hwRound(lx) + hwSign(dX) * 7, hwRound(ly), gtMine, gstWait, newDx, newDy, 3000)
   223                                  else
   253                                  else
   224                                     AddGear(hwRound(lx) + hwSign(dX) * 7, hwRound(ly), gtMine, gstWait, SignAs(_0_02, dX), _0, 3000);
   254                                     newGear:= AddGear(hwRound(lx) + hwSign(dX) * 7, hwRound(ly), gtMine, gstWait, SignAs(_0_02, dX), _0, 3000);
   225                         amSMine: FollowGear:= AddGear(hwRound(lx), hwRound(ly), gtSMine,    0, xx*Power/cPowerDivisor, yy*Power/cPowerDivisor, 0);
   255                         amSMine: newGear:= AddGear(hwRound(lx), hwRound(ly), gtSMine,    0, xx*Power/cPowerDivisor, yy*Power/cPowerDivisor, 0);
   226                        amDEagle: CurAmmoGear:= AddGear(hwRound(lx + xx * cHHRadius), hwRound(ly + yy * cHHRadius), gtDEagleShot, 0, xx * _0_5, yy * _0_5, 0);
   256                        amDEagle: newGear:= AddGear(hwRound(lx + xx * cHHRadius), hwRound(ly + yy * cHHRadius), gtDEagleShot, 0, xx * _0_5, yy * _0_5, 0);
   227                       amSineGun: CurAmmoGear:= AddGear(hwRound(lx + xx * cHHRadius), hwRound(ly + yy * cHHRadius), gtSineGunShot, 0, xx * _0_5, yy * _0_5, 0);
   257                       amSineGun: newGear:= AddGear(hwRound(lx + xx * cHHRadius), hwRound(ly + yy * cHHRadius), gtSineGunShot, 0, xx * _0_5, yy * _0_5, 0);
   228                     amPortalGun: begin
   258                     amPortalGun: begin
   229                                  AddGear(hwRound(lx + xx * cHHRadius), hwRound(ly + yy * cHHRadius), gtPortal, 0, xx * _0_6, yy * _0_6, 
   259                                  newGear:= AddGear(hwRound(lx + xx * cHHRadius), hwRound(ly + yy * cHHRadius), gtPortal, 0, xx * _0_6, yy * _0_6, 
   230                                  // set selected color
   260                                  // set selected color
   231                                  CurWeapon^.Pos);
   261                                  CurWeapon^.Pos);
   232                                  end;
   262                                  end;
   233                   amSniperRifle: begin
   263                   amSniperRifle: begin
   234                                  PlaySound(sndSniperReload);
   264                                  PlaySound(sndSniperReload);
   235                                  CurAmmoGear:= AddGear(hwRound(lx + xx * cHHRadius), hwRound(ly + yy * cHHRadius), gtSniperRifleShot, 0, xx * _0_5, yy * _0_5, 0);
   265                                  newGear:= AddGear(hwRound(lx + xx * cHHRadius), hwRound(ly + yy * cHHRadius), gtSniperRifleShot, 0, xx * _0_5, yy * _0_5, 0);
   236                                  end;
   266                                  end;
   237                      amDynamite: AddGear(hwRound(lx) + hwSign(dX) * 7, hwRound(ly), gtDynamite, 0, SignAs(_0_03, dX), _0, 5000);
   267                      amDynamite: newGear:= AddGear(hwRound(lx) + hwSign(dX) * 7, hwRound(ly), gtDynamite, 0, SignAs(_0_03, dX), _0, 5000);
   238                     amFirePunch: CurAmmoGear:= AddGear(hwRound(lx) + hwSign(dX) * 10, hwRound(ly), gtFirePunch, 0, xx, _0, 0);
   268                     amFirePunch: newGear:= AddGear(hwRound(lx) + hwSign(dX) * 10, hwRound(ly), gtFirePunch, 0, xx, _0, 0);
   239                          amWhip: begin
   269                          amWhip: begin
   240                                  CurAmmoGear:= AddGear(hwRound(lx) + hwSign(dX) * 10, hwRound(ly), gtWhip, 0, SignAs(_1, dX), - _0_8, 0);
   270                                  newGear:= AddGear(hwRound(lx) + hwSign(dX) * 10, hwRound(ly), gtWhip, 0, SignAs(_1, dX), - _0_8, 0);
   241                                  PlaySound(sndWhipCrack)
   271                                  PlaySound(sndWhipCrack)
   242                                  end;
   272                                  end;
   243                        amHammer: begin
   273                        amHammer: begin
   244                                  CurAmmoGear:= AddGear(hwRound(lx) + hwSign(dX) * 10, hwRound(ly), gtHammer, 0, SignAs(_1, dX), - _0_8, 0);
   274                                  newGear:= AddGear(hwRound(lx) + hwSign(dX) * 10, hwRound(ly), gtHammer, 0, SignAs(_1, dX), - _0_8, 0);
   245                                  PlaySound(sndWhack)
   275                                  PlaySound(sndWhack)
   246                                  end;
   276                                  end;
   247                   amBaseballBat: begin
   277                   amBaseballBat: begin
   248                                  CurAmmoGear:= AddGear(hwRound(lx) + hwSign(dX) * 10, hwRound(ly), gtShover, gsttmpFlag, xx * _0_5, yy * _0_5, 0);
   278                                  newGear:= AddGear(hwRound(lx) + hwSign(dX) * 10, hwRound(ly), gtShover, gsttmpFlag, xx * _0_5, yy * _0_5, 0);
   249                                  PlaySound(sndBaseballBat) // TODO: Only play if something is hit?
   279                                  PlaySound(sndBaseballBat) // TODO: Only play if something is hit?
   250                                  end;
   280                                  end;
   251                     amParachute: begin
   281                     amParachute: begin
   252                                  CurAmmoGear:= AddGear(hwRound(lx), hwRound(ly), gtParachute, 0, _0, _0, 0);
   282                                  newGear:= AddGear(hwRound(lx), hwRound(ly), gtParachute, 0, _0, _0, 0);
   253                                  PlaySound(sndParachute)
   283                                  PlaySound(sndParachute)
   254                                  end;
   284                                  end;
   255                     // we save CurWeapon^.Pos (in this case: cursor direction) by using it as (otherwise irrelevant) X value of the new gear.
   285                     // we save CurWeapon^.Pos (in this case: cursor direction) by using it as (otherwise irrelevant) X value of the new gear.
   256                     amAirAttack: AddGear(CurWeapon^.Pos, 0, gtAirAttack, 0, _0, _0, 0);
   286                     amAirAttack: newGear:= AddGear(CurWeapon^.Pos, 0, gtAirAttack, 0, _0, _0, 0);
   257                    amMineStrike: AddGear(CurWeapon^.Pos, 0, gtAirAttack, 1, _0, _0, 0);
   287                    amMineStrike: newGear:= AddGear(CurWeapon^.Pos, 0, gtAirAttack, 1, _0, _0, 0);
   258                     amBlowTorch: CurAmmoGear:= AddGear(hwRound(lx), hwRound(ly), gtBlowTorch, 0, SignAs(_0_5, dX), _0, 0);
   288                     amBlowTorch: newGear:= AddGear(hwRound(lx), hwRound(ly), gtBlowTorch, 0, SignAs(_0_5, dX), _0, 0);
   259                        amGirder: CurAmmoGear:= AddGear(0, 0, gtGirder, CurWeapon^.Pos, _0, _0, 0);
   289                        amGirder: newGear:= AddGear(0, 0, gtGirder, CurWeapon^.Pos, _0, _0, 0);
   260                      amTeleport: CurAmmoGear:= AddGear(CurWeapon^.Pos, 0, gtTeleport, 0, _0, _0, 0);
   290                      amTeleport: newGear:= AddGear(CurWeapon^.Pos, 0, gtTeleport, 0, _0, _0, 0);
   261                        amSwitch: CurAmmoGear:= AddGear(hwRound(lx), hwRound(ly), gtSwitcher, 0, _0, _0, 0);
   291                        amSwitch: newGear:= AddGear(hwRound(lx), hwRound(ly), gtSwitcher, 0, _0, _0, 0);
   262                        amMortar: begin
   292                        amMortar: begin
   263                                  playSound(sndMortar);
   293                                  playSound(sndMortar);
   264                                  FollowGear:= AddGear(hwRound(lx), hwRound(ly), gtMortar,  0, xx*cMaxPower/cPowerDivisor, yy*cMaxPower/cPowerDivisor, 0);
   294                                  newGear:= AddGear(hwRound(lx), hwRound(ly), gtMortar,  0, xx*cMaxPower/cPowerDivisor, yy*cMaxPower/cPowerDivisor, 0);
   265                                  end;
   295                                  end;
   266                       amRCPlane: begin
   296                       amRCPlane: begin
   267                                  CurAmmoGear:= AddGear(hwRound(lx), hwRound(ly), gtRCPlane,  0, xx * cMaxPower / cPowerDivisor / 4, yy * cMaxPower / cPowerDivisor / 4, 0);
   297                                  newGear:= AddGear(hwRound(lx), hwRound(ly), gtRCPlane,  0, xx * cMaxPower / cPowerDivisor / 4, yy * cMaxPower / cPowerDivisor / 4, 0);
   268                                  CurAmmoGear^.SoundChannel:= LoopSound(sndRCPlane, nil)
   298                                  newGear^.SoundChannel:= LoopSound(sndRCPlane, nil)
   269                                  end;
   299                                  end;
   270                        amKamikaze: CurAmmoGear:= AddGear(hwRound(lx), hwRound(ly), gtKamikaze, 0, xx * _0_5, yy * _0_5, 0);
   300                        amKamikaze: newGear:= AddGear(hwRound(lx), hwRound(ly), gtKamikaze, 0, xx * _0_5, yy * _0_5, 0);
   271                          amCake: CurAmmoGear:= AddGear(hwRound(lx) + hwSign(dX) * 3, hwRound(ly), gtCake, 0, xx, _0, 0);
   301                          amCake: newGear:= AddGear(hwRound(lx) + hwSign(dX) * 3, hwRound(ly), gtCake, 0, xx, _0, 0);
   272                     amSeduction: CurAmmoGear:= AddGear(hwRound(lx + xx * cHHRadius * 2), hwRound(ly + yy * cHHRadius * 2), gtSeduction, 0, xx * _0_4, yy * _0_4, 0);
   302                     amSeduction: newGear:= AddGear(hwRound(lx + xx * cHHRadius * 2), hwRound(ly + yy * cHHRadius * 2), gtSeduction, 0, xx * _0_4, yy * _0_4, 0);
   273                    amWatermelon: FollowGear:= AddGear(hwRound(lx), hwRound(ly), gtWatermelon,  0, newDx, newDy, CurWeapon^.Timer);
   303                    amWatermelon: newGear:= AddGear(hwRound(lx), hwRound(ly), gtWatermelon,  0, newDx, newDy, CurWeapon^.Timer);
   274                   amHellishBomb: FollowGear:= AddGear(hwRound(lx), hwRound(ly), gtHellishBomb,    0, newDx, newDy, 0);
   304                   amHellishBomb: newGear:= AddGear(hwRound(lx), hwRound(ly), gtHellishBomb,    0, newDx, newDy, 0);
   275                        amNapalm: AddGear(CurWeapon^.Pos, 0, gtAirAttack, 2, _0, _0, 0);
   305                        amNapalm: newGear:= AddGear(CurWeapon^.Pos, 0, gtAirAttack, 2, _0, _0, 0);
   276                         amDrill: FollowGear:= AddGear(hwRound(lx), hwRound(ly), gtDrill, 0, newDx, newDy, 0);
   306                         amDrill: newGear:= AddGear(hwRound(lx), hwRound(ly), gtDrill, 0, newDx, newDy, 0);
   277                       amBallgun: CurAmmoGear:= AddGear(hwRound(X), hwRound(Y), gtBallgun,  0, xx * _0_5, yy * _0_5, 0);
   307                       amBallgun: newGear:= AddGear(hwRound(X), hwRound(Y), gtBallgun,  0, xx * _0_5, yy * _0_5, 0);
   278                     amJetpack: CurAmmoGear:= AddGear(hwRound(lx), hwRound(ly), gtJetpack, 0, _0, _0, 0);
   308                     amJetpack: newGear:= AddGear(hwRound(lx), hwRound(ly), gtJetpack, 0, _0, _0, 0);
   279                     amBirdy: begin
   309                     amBirdy: begin
   280                              PlaySound(sndWhistle);
   310                              PlaySound(sndWhistle);
   281                              CurAmmoGear:= AddGear(hwRound(lx), hwRound(ly) - 32, gtBirdy, 0, _0, _0, 0);
   311                              newGear:= AddGear(hwRound(lx), hwRound(ly) - 32, gtBirdy, 0, _0, _0, 0);
   282                              end;
   312                              end;
   283                       amLowGravity: begin
   313                       amLowGravity: begin
   284                                     PlaySound(sndLowGravity);
   314                                     PlaySound(sndLowGravity);
   285                                     cGravity:= cMaxWindSpeed;
   315                                     cGravity:= cMaxWindSpeed;
   286                                     cGravityf:= 0.00025
   316                                     cGravityf:= 0.00025
   302                       amPiano: begin
   332                       amPiano: begin
   303                                // Tuck the hedgehog away until the piano attack is completed
   333                                // Tuck the hedgehog away until the piano attack is completed
   304                                Unplaced:= true;
   334                                Unplaced:= true;
   305                                X:= _0;
   335                                X:= _0;
   306                                Y:= _0;
   336                                Y:= _0;
   307                                FollowGear:= AddGear(TargetPoint.X, 0, gtPiano, 0, _0, _0, 0);
   337                                newGear:= AddGear(TargetPoint.X, 0, gtPiano, 0, _0, _0, 0);
   308                                PauseMusic
   338                                PauseMusic
   309                                end;
   339                                end;
   310                       amFlamethrower: CurAmmoGear:= AddGear(hwRound(X), hwRound(Y), gtFlamethrower,  0, xx * _0_5, yy * _0_5, 0);
   340                       amFlamethrower: newGear:= AddGear(hwRound(X), hwRound(Y), gtFlamethrower,  0, xx * _0_5, yy * _0_5, 0);
   311                       amLandGun: CurAmmoGear:= AddGear(hwRound(X), hwRound(Y), gtLandGun,  0, xx * _0_5, yy * _0_5, 0);
   341                       amLandGun: newGear:= AddGear(hwRound(X), hwRound(Y), gtLandGun,  0, xx * _0_5, yy * _0_5, 0);
   312                     amResurrector: begin
   342                     amResurrector: begin
   313                         CurAmmoGear:= AddGear(hwRound(lx), hwRound(ly),
   343                         newGear:= AddGear(hwRound(lx), hwRound(ly),
   314                                 gtResurrector, 0, _0, _0, 0);
   344                                 gtResurrector, 0, _0, _0, 0);
   315                         CurAmmoGear^.SoundChannel := LoopSound(sndResurrector);
   345                         newGear^.SoundChannel := LoopSound(sndResurrector);
   316                     end;
   346                     end;
   317                    amDrillStrike: AddGear(CurWeapon^.Pos, 0, gtAirAttack, 3, _0, _0, CurWeapon^.Timer);
   347                    amDrillStrike: newGear:= AddGear(CurWeapon^.Pos, 0, gtAirAttack, 3, _0, _0, CurWeapon^.Timer);
   318                    //amMelonStrike: AddGear(CurWeapon^.Pos, 0, gtAirAttack, 4, _0, _0, 0);
   348                    //amMelonStrike: AddGear(CurWeapon^.Pos, 0, gtAirAttack, 4, _0, _0, 0);
   319                      amStructure: CurAmmoGear:= AddGear(hwRound(lx) + hwSign(dX) * 7, hwRound(ly), gtStructure, gstWait, SignAs(_0_02, dX), _0, 3000);
   349                      amStructure: newGear:= AddGear(hwRound(lx) + hwSign(dX) * 7, hwRound(ly), gtStructure, gstWait, SignAs(_0_02, dX), _0, 3000);
   320                         amTardis: CurAmmoGear:= AddGear(hwRound(X), hwRound(Y), gtTardis, 0, _0, _0, 5000);
   350                         amTardis: newGear:= AddGear(hwRound(X), hwRound(Y), gtTardis, 0, _0, _0, 5000);
       
   351                   end;
       
   352              case CurAmmoType of
       
   353                       amGrenade, amMolotov, 
       
   354                   amClusterBomb, amGasBomb, 
       
   355                       amBazooka, amSnowball, 
       
   356                           amBee, amSMine,
       
   357                        amMortar, amWatermelon,
       
   358                   amHellishBomb, amDrill,
       
   359                         amPiano: FollowGear:= newGear;
       
   360 
       
   361                       amShotgun, amPickHammer,
       
   362                          amRope, amDEagle,
       
   363                       amSineGun, amSniperRifle,
       
   364                     amFirePunch, amWhip,
       
   365                        amHammer, amBaseballBat,
       
   366                     amParachute, amBlowTorch,
       
   367                        amGirder, amTeleport,
       
   368                        amSwitch, amRCPlane,
       
   369                      amKamikaze, amCake,
       
   370                     amSeduction, amBallgun,
       
   371                       amJetpack, amBirdy,
       
   372                  amFlamethrower, amLandGun,
       
   373                   amResurrector, amStructure,
       
   374                        amTardis: CurAmmoGear:= newGear;
   321                   end;
   375                   end;
   322 
   376 
   323         // Clear FollowGear if using on a rope/parachute/saucer etc so focus stays with the hog's movement
   377         // Clear FollowGear if using on a rope/parachute/saucer etc so focus stays with the hog's movement
   324         if altUse then FollowGear:= nil;
   378         if altUse then FollowGear:= nil;
   325 
   379 
       
   380         if (newGear <> nil) and ((Ammoz[newGear^.AmmoType].Ammo.Propz and ammoprop_SetBounce) <> 0) then
       
   381             begin
       
   382             elastic:=  int2hwfloat(CurWeapon^.Bounciness) / _1000;
       
   383 
       
   384             if elastic < _1 then newGear^.Elasticity:= newGear^.Elasticity * elastic
       
   385             else if elastic > _1 then newGear^.Elasticity:= _1 - ((_1-newGear^.Elasticity) / elastic);
       
   386 (* Experimented with friction modifier. Didn't seem helpful 
       
   387             fric:= int2hwfloat(CurWeapon^.Bounciness) / _250;
       
   388             if fric < _1 then newGear^.Friction:= newGear^.Friction * fric
       
   389             else if fric > _1 then newGear^.Friction:= _1 - ((_1-newGear^.Friction) / fric)*)
       
   390             end;
       
   391 
       
   392 
   326         uStats.AmmoUsed(CurAmmoType);
   393         uStats.AmmoUsed(CurAmmoType);
   327 
   394 
   328         if not (SpeechText = '') then
   395         if not (SpeechText = '') then
   329             begin
   396             begin
   330             tmpGear:= AddVisualGear(0, 0, vgtSpeechBubble);
   397             speech:= AddVisualGear(0, 0, vgtSpeechBubble);
   331             if tmpGear <> nil then
   398             if speech <> nil then
   332                begin
   399                begin
   333                tmpGear^.Text:= SpeechText;
   400                speech^.Text:= SpeechText;
   334                tmpGear^.Hedgehog:= Gear^.Hedgehog;
   401                speech^.Hedgehog:= Gear^.Hedgehog;
   335                tmpGear^.FrameTicks:= SpeechType;
   402                speech^.FrameTicks:= SpeechType;
   336                end;
   403                end;
   337             SpeechText:= ''
   404             SpeechText:= ''
   338             end;
   405             end;
   339 
   406 
   340         Power:= 0;
   407         Power:= 0;
   341         if (CurAmmoGear <> nil)
   408         if (CurAmmoGear <> nil)
   342            and ((Ammoz[CurAmmoType].Ammo.Propz and ammoprop_AltUse) = 0){check for dropping ammo from rope} then
   409            and ((Ammoz[CurAmmoType].Ammo.Propz and ammoprop_AltUse) = 0){check for dropping ammo from rope} then
   343            begin
   410            begin
   344            CurAmmoGear^.AmmoType:= CurAmmoType;
       
   345            Message:= Message or gmAttack;
   411            Message:= Message or gmAttack;
   346            CurAmmoGear^.Message:= Message
   412            CurAmmoGear^.Message:= Message
   347            end else begin
   413            end else begin
   348            if not CurrentTeam^.ExtDriven and
   414            if not CurrentTeam^.ExtDriven and
   349              ((Ammoz[CurAmmoType].Ammo.Propz and ammoprop_Power) <> 0) then SendIPC('a');
   415              ((Ammoz[CurAmmoType].Ammo.Propz and ammoprop_Power) <> 0) then SendIPC('a');
   465     i: LongInt;
   531     i: LongInt;
   466     vga: PVisualGear;
   532     vga: PVisualGear;
   467 begin
   533 begin
   468 Gear^.Message:= gmDestroy;
   534 Gear^.Message:= gmDestroy;
   469 PlaySound(sndShotgunReload);
   535 PlaySound(sndShotgunReload);
       
   536 if (Gear^.Pos and posCaseTrap) <> 0 then doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 30, HH^.Hedgehog, EXPLAutoSound)
       
   537 else
   470 case Gear^.Pos of
   538 case Gear^.Pos of
   471        posCaseUtility,
   539        posCaseUtility,
   472        posCaseAmmo: begin
   540        posCaseAmmo: begin
   473                     a:= Gear^.AmmoType;
   541                     a:= Gear^.AmmoType;
   474                     AddAmmo(HH^.Hedgehog^, a);
   542                     AddAmmo(HH^.Hedgehog^, a);