hedgewars/HHHandlers.inc
changeset 7 b472e4b1a106
parent 4 bcbd7adb4e4b
child 15 6200cca92480
equal deleted inserted replaced
6:9c1f00e7b43e 7:b472e4b1a106
    40 AllInactive:= false;
    40 AllInactive:= false;
    41 if (TurnTimeLeft = 0) or (Gear.Damage > 0) then
    41 if (TurnTimeLeft = 0) or (Gear.Damage > 0) then
    42    begin
    42    begin
    43    if ((Gear.State and (gstMoving or gstFalling)) = 0)
    43    if ((Gear.State and (gstMoving or gstFalling)) = 0)
    44       and (CurAmmoGear = nil) then Gear.dX:= 0.0000001 * Sign(Gear.dX);
    44       and (CurAmmoGear = nil) then Gear.dX:= 0.0000001 * Sign(Gear.dX);
    45    {$WARNINGS OFF}Gear.State:= Gear.State and not gstHHDriven;{$WARNINGS ON}
    45    Gear.State:= Gear.State and not gstHHDriven;
       
    46    if Gear.Damage > 0 then
       
    47       Gear.State:= Gear.State and not gstHHJumping;
    46    exit
    48    exit
    47    end;
    49    end;
    48 
    50 
    49 if CurAmmoGear <> nil then
    51 if CurAmmoGear <> nil then
    50    begin
    52    begin
    74             end else Gear.Message:= Gear.Message and not gm_Attack;
    76             end else Gear.Message:= Gear.Message and not gm_Attack;
    75 
    77 
    76 
    78 
    77 if (Gear.State and gstFalling) <> 0 then
    79 if (Gear.State and gstFalling) <> 0 then
    78    begin
    80    begin
       
    81    // it could be the source to trick: double-backspace jump -> vertical wall
       
    82    // collision - > (abs(Gear.dX) < 0.0000002) -> backspace -> even more high jump
    79    if ((Gear.Message and gm_HJump) <> 0) and ((Gear.State and gstHHJumping) <> 0) then
    83    if ((Gear.Message and gm_HJump) <> 0) and ((Gear.State and gstHHJumping) <> 0) then
    80       if (abs(Gear.dX) < 0.0000002) and (Gear.dY < -0.02) then
    84       if (abs(Gear.dX) < 0.0000002) and (Gear.dY < -0.02) then
    81          begin
    85          begin
    82          Gear.dY:= -0.25;
    86          Gear.dY:= -0.25;
    83          Gear.dX:= Sign(Gear.dX) * 0.02
    87          Gear.dX:= Sign(Gear.dX) * 0.02
    84          end;
    88          end;
    85    Gear.Message:= Gear.Message and not (gm_LJump or gm_HJump);
    89    Gear.Message:= Gear.Message and not (gm_LJump or gm_HJump);     
    86    if TestCollisionXwithGear(Gear, Sign(Gear.dX)) then Gear.dX:= 0.0000001 * Sign(Gear.dX);
    90    if TestCollisionXwithGear(Gear, Sign(Gear.dX)) then Gear.dX:= 0.0000001 * Sign(Gear.dX);
    87    Gear.X:= Gear.X + Gear.dX;
    91    Gear.X:= Gear.X + Gear.dX;
    88    Gear.dY:= Gear.dY + cGravity;
    92    Gear.dY:= Gear.dY + cGravity;
    89    if (Gear.dY < 0)and TestCollisionYwithGear(Gear, -1) then Gear.dY:= 0; 
    93    if (Gear.dY < 0)and TestCollisionYwithGear(Gear, -1) then Gear.dY:= 0; 
    90    Gear.Y:= Gear.Y + Gear.dY;
    94    Gear.Y:= Gear.Y + Gear.dY;
   201    if (Gear.dY < 0) and HHTestCollisionYwithGear(Gear, -1) then Gear.dY:= 0;
   205    if (Gear.dY < 0) and HHTestCollisionYwithGear(Gear, -1) then Gear.dY:= 0;
   202    Gear.State:= Gear.State or gstFalling or gstMoving;
   206    Gear.State:= Gear.State or gstFalling or gstMoving;
   203    Gear.dY:= Gear.dY + cGravity
   207    Gear.dY:= Gear.dY + cGravity
   204    end else begin
   208    end else begin
   205    CheckHHDamage(Gear);
   209    CheckHHDamage(Gear);
       
   210    if ((abs(Gear.dX) + abs(Gear.dY)) < 0.55)
       
   211       and ((Gear.State and gstHHJumping) <> 0) then Gear.dX:= 0.0000001 * Sign(Gear.dX);
       
   212    Gear.State:= Gear.State and not (gstFalling or gstHHJumping);
   206    if Gear.dY > 0    then Gear.dY:= 0;
   213    if Gear.dY > 0    then Gear.dY:= 0;
   207    Gear.State:= Gear.State and not gstFalling;
       
   208    if ((Gear.State and gstMoving) <> 0) then Gear.dX:= Gear.dX * Gear.Friction
   214    if ((Gear.State and gstMoving) <> 0) then Gear.dX:= Gear.dX * Gear.Friction
   209    end;
   215    end;
   210 
   216 
   211 
   217 
   212 if (Gear.State and gstMoving) <> 0 then
   218 if (Gear.State and gstMoving) <> 0 then
   249          doMakeExplosion(round(Gear.X), round(Gear.Y), 30, EXPLAutoSound);
   255          doMakeExplosion(round(Gear.X), round(Gear.Y), 30, EXPLAutoSound);
   250          AddGear(round(Gear.X), round(Gear.Y), gtGrave, 0).Hedgehog:= Gear.Hedgehog;
   256          AddGear(round(Gear.X), round(Gear.Y), gtGrave, 0).Hedgehog:= Gear.Hedgehog;
   251          DeleteGear(Gear);
   257          DeleteGear(Gear);
   252          SetAllToActive
   258          SetAllToActive
   253          end;
   259          end;
   254       AllInactive:= false;  (* почему этого тут не было? *)
   260       AllInactive:= false;  
   255       exit
   261       exit
   256       end;
   262       end;
   257 
   263 
   258 AllInactive:= false;
   264 AllInactive:= false;
   259 
   265