hedgewars/GSHandlers.inc
changeset 6765 8fcd2508c49f
parent 6761 e95f7509a5c5
child 6785 a8aa5984185f
equal deleted inserted replaced
6764:e56ff0231540 6765:8fcd2508c49f
  2970 end;
  2970 end;
  2971 
  2971 
  2972 procedure doStepCakeDown(Gear: PGear);
  2972 procedure doStepCakeDown(Gear: PGear);
  2973 var 
  2973 var 
  2974     gi: PGear;
  2974     gi: PGear;
  2975     dmg: LongInt;
  2975     dmg, dmgBase: LongInt;
       
  2976     fX, fY, tdX, tdY: hwFloat;
  2976 begin
  2977 begin
  2977     AllInactive := false;
  2978     AllInactive := false;
  2978 
  2979 
  2979     inc(Gear^.Tag);
  2980     inc(Gear^.Tag);
  2980     if Gear^.Tag < 100 then
  2981     if Gear^.Tag < 100 then
  2981         exit;
  2982         exit;
  2982     Gear^.Tag := 0;
  2983     Gear^.Tag := 0;
  2983 
  2984 
  2984     if Gear^.Pos = 0 then
  2985     if Gear^.Pos = 0 then
  2985         begin
  2986         begin
       
  2987 ///////////// adapted from doMakeExplosion ///////////////////////////
       
  2988         //fX:= Gear^.X;
       
  2989         //fY:= Gear^.Y;
       
  2990         //fX.QWordValue:= fX.QWordValue and $FFFFFFFF00000000;
       
  2991         //fY.QWordValue:= fY.QWordValue and $FFFFFFFF00000000;
       
  2992         fX:= int2hwFloat(hwRound(Gear^.X));
       
  2993         fY:= int2hwFloat(hwRound(Gear^.Y));
       
  2994         dmgBase:= cakeDmg shl 1 + cHHRadius div 2;
  2986         gi := GearsList;
  2995         gi := GearsList;
  2987         while gi <> nil do
  2996         while gi <> nil do
  2988             begin
  2997             begin
  2989             dmg := cakeDmg * 2 - hwRound(Distance(gi^.X - Gear^.X, gi^.Y - Gear^.Y));
  2998             if gi^.Kind = gtHedgehog then
  2990             if (dmg > 1) and (gi^.Kind = gtHedgehog) then
  2999                 begin
  2991                 if (CurrentHedgehog^.Gear = gi) and (not gi^.Invulnerable) then
  3000                 dmg:= 0;
  2992                     gi^.State := gi^.State or gstLoser
  3001                 tdX:= gi^.X-fX;
  2993             else
  3002                 tdY:= gi^.Y-fY;
  2994                 gi^.State := gi^.State or gstWinner;
  3003                 if hwRound(hwAbs(tdX)+hwAbs(tdY)) < dmgBase then
       
  3004                     dmg:= dmgBase - max(hwRound(Distance(tdX, tdY)),gi^.Radius);
       
  3005                 if (dmg > 1) then dmg:= ModifyDamage(min(dmg div 2, cakeDmg), gi);
       
  3006                 if (dmg > 1) then
       
  3007                     if (CurrentHedgehog^.Gear = gi) and (not gi^.Invulnerable) then
       
  3008                         gi^.State := gi^.State or gstLoser
       
  3009                     else
       
  3010                         gi^.State := gi^.State or gstWinner;
       
  3011                 end;
  2995             gi := gi^.NextGear
  3012             gi := gi^.NextGear
  2996             end;
  3013             end;
       
  3014 //////////////////////////////////////////////////////////////////////
  2997         Gear^.doStep := @doStepCakeExpl;
  3015         Gear^.doStep := @doStepCakeExpl;
  2998         PlaySound(sndCake)
  3016         PlaySound(sndCake)
  2999         end
  3017         end
  3000     else dec(Gear^.Pos)
  3018     else dec(Gear^.Pos)
  3001 end;
  3019 end;