hedgewars/GSHandlers.inc
changeset 3591 c447d5218f6f
parent 3588 eb3b6cc490e1
child 3593 ae50f63e4fa9
equal deleted inserted replaced
3590:66e1bc1ea3a9 3591:c447d5218f6f
   536 const uw: boolean =   false;
   536 const uw: boolean =   false;
   537 begin
   537 begin
   538     AllInactive := false;
   538     AllInactive := false;
   539     gX := hwRound(Gear^.X);
   539     gX := hwRound(Gear^.X);
   540     gY := hwRound(Gear^.Y);
   540     gY := hwRound(Gear^.Y);
   541     nuw := (cWaterLine < hwRound(Gear^.Y) + Gear^.Radius);
   541     nuw := (cWaterLine < gy + Gear^.Radius);
   542     if nuw and not uw then
   542     if nuw and not uw then
   543     begin
   543     begin
   544         AddVisualGear(gX, cWaterLine, vgtSplash);
   544         AddVisualGear(gX, cWaterLine, vgtSplash);
   545         AddVisualGear(gX - 3 + Random(6), cWaterLine, vgtDroplet);
   545         AddVisualGear(gX - 3 + Random(6), cWaterLine, vgtDroplet);
   546         AddVisualGear(gX - 3 + Random(6), cWaterLine, vgtDroplet);
   546         AddVisualGear(gX - 3 + Random(6), cWaterLine, vgtDroplet);
   557             Gear^.SoundChannel := LoopSound(sndBee);
   557             Gear^.SoundChannel := LoopSound(sndBee);
   558             uw := nuw
   558             uw := nuw
   559         end;
   559         end;
   560 
   560 
   561 
   561 
   562     t := Distance(Gear^.dX, Gear^.dY);
   562     if (GameTicks and $F) = 0 then
   563     Gear^.dX := Gear^.Elasticity * (Gear^.dX + _0_000004 * (TargetPoint.X - gX));
   563     begin
   564     Gear^.dY := Gear^.Elasticity * (Gear^.dY + _0_000004 * (TargetPoint.Y - gY));
   564         if (GameTicks and $30) = 0 then
   565 
   565             AddVisualGear(gX, gY, vgtBeeTrace);
   566     t := t / Distance(Gear^.dX, Gear^.dY);
   566         Gear^.dX := Gear^.Elasticity * (Gear^.dX + _0_000064 * (TargetPoint.X - gX));
   567     Gear^.dX := Gear^.dX * t;
   567         Gear^.dY := Gear^.Elasticity * (Gear^.dY + _0_000064 * (TargetPoint.Y - gY));
   568     Gear^.dY := Gear^.dY * t;
   568         // make sure new speed isn't higher than original one (which we stored in Friction variable)
       
   569         t := Gear^.Friction / Distance(Gear^.dX, Gear^.dY);
       
   570         Gear^.dX := Gear^.dX * t;
       
   571         Gear^.dY := Gear^.dY * t;
       
   572     end;
       
   573 
   569     Gear^.X := Gear^.X + Gear^.dX;
   574     Gear^.X := Gear^.X + Gear^.dX;
   570     Gear^.Y := Gear^.Y + Gear^.dY;
   575     Gear^.Y := Gear^.Y + Gear^.dY;
   571 
       
   572     if (GameTicks and $3F) = 0 then
       
   573     begin
       
   574         AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtBeeTrace);
       
   575     end;
       
   576 
   576 
   577     CheckCollision(Gear);
   577     CheckCollision(Gear);
   578     dec(Gear^.Timer);
   578     dec(Gear^.Timer);
   579     if ((Gear^.State and gstCollision) <> 0) or (Gear^.Timer = 0) then
   579     if ((Gear^.State and gstCollision) <> 0) or (Gear^.Timer = 0) then
   580     begin
   580     begin
   600     dec(Gear^.Timer);
   600     dec(Gear^.Timer);
   601     if Gear^.Timer = 0 then
   601     if Gear^.Timer = 0 then
   602     begin
   602     begin
   603         Gear^.SoundChannel := LoopSound(sndBee);
   603         Gear^.SoundChannel := LoopSound(sndBee);
   604         Gear^.Timer := 5000;
   604         Gear^.Timer := 5000;
       
   605         // save initial speed in otherwise unused Friction variable
       
   606         Gear^.Friction := Distance(Gear^.dX, Gear^.dY);
   605         Gear^.doStep := @doStepBeeWork
   607         Gear^.doStep := @doStepBeeWork
   606     end;
   608     end;
   607 end;
   609 end;
   608 
   610 
   609 ////////////////////////////////////////////////////////////////////////////////
   611 ////////////////////////////////////////////////////////////////////////////////