hedgewars/HHHandlers.inc
changeset 73 fe1c62875a19
parent 70 82d93eeecebe
child 74 42257fee61ae
equal deleted inserted replaced
72:aeb2ac1878dc 73:fe1c62875a19
   306 ////////////////////////////////////////////////////////////////////////////////
   306 ////////////////////////////////////////////////////////////////////////////////
   307 procedure doStepHedgehogFree(Gear: PGear);
   307 procedure doStepHedgehogFree(Gear: PGear);
   308 begin
   308 begin
   309 //DeleteCI(Gear);
   309 //DeleteCI(Gear);
   310 if not TestCollisionYwithGear(Gear, 1) then
   310 if not TestCollisionYwithGear(Gear, 1) then
       
   311    if TestCollisionYwithXYShift(Gear, 0, 1, 1) then Gear.Y:= Gear.Y + 1 else
   311    begin
   312    begin
   312    if (Gear.dY < 0) and TestCollisionYwithGear(Gear, -1) then Gear.dY:= 0;
   313    if (Gear.dY < 0) and TestCollisionYwithGear(Gear, -1) then Gear.dY:= 0;
   313    Gear.State:= Gear.State or gstFalling or gstMoving;
   314    Gear.State:= Gear.State or gstFalling or gstMoving;
   314    Gear.dY:= Gear.dY + cGravity
   315    Gear.dY:= Gear.dY + cGravity
   315    end else begin
   316    end else begin
   325 
   326 
   326 if (Gear.State and gstMoving) <> 0 then
   327 if (Gear.State and gstMoving) <> 0 then
   327    if TestCollisionXwithGear(Gear, Sign(Gear.dX)) then
   328    if TestCollisionXwithGear(Gear, Sign(Gear.dX)) then
   328       if ((Gear.State and gstFalling) = 0) then
   329       if ((Gear.State and gstFalling) = 0) then
   329          if abs(Gear.dX) > 0.01 then
   330          if abs(Gear.dX) > 0.01 then
   330             if not TestCollisionXwithXYShift(Gear, 0, -1, Sign(Gear.dX)) then begin Gear.dX:= Gear.dX * 0.90; Gear.Y:= Gear.Y - 1 end else
   331             if not TestCollisionXwithXYShift(Gear, 0, -1, Sign(Gear.dX)) then begin Gear.dX:= Gear.dX * 0.99; Gear.Y:= Gear.Y - 1 end else
   331             if not TestCollisionXwithXYShift(Gear, 0, -2, Sign(Gear.dX)) then begin Gear.dX:= Gear.dX * 0.88; Gear.Y:= Gear.Y - 2 end else
   332             if not TestCollisionXwithXYShift(Gear, 0, -2, Sign(Gear.dX)) then begin Gear.dX:= Gear.dX * 0.98; Gear.Y:= Gear.Y - 2 end else
   332             if not TestCollisionXwithXYShift(Gear, 0, -3, Sign(Gear.dX)) then begin Gear.dX:= Gear.dX * 0.84; Gear.Y:= Gear.Y - 3 end else
   333             if not TestCollisionXwithXYShift(Gear, 0, -3, Sign(Gear.dX)) then begin Gear.dX:= Gear.dX * 0.97; Gear.Y:= Gear.Y - 3 end else
   333             if not TestCollisionXwithXYShift(Gear, 0, -4, Sign(Gear.dX)) then begin Gear.dX:= Gear.dX * 0.81; Gear.Y:= Gear.Y - 4 end else
   334             if not TestCollisionXwithXYShift(Gear, 0, -4, Sign(Gear.dX)) then begin Gear.dX:= Gear.dX * 0.96; Gear.Y:= Gear.Y - 4 end else
   334             if not TestCollisionXwithXYShift(Gear, 0, -5, Sign(Gear.dX)) then begin Gear.dX:= Gear.dX * 0.78; Gear.Y:= Gear.Y - 5 end else
   335             if not TestCollisionXwithXYShift(Gear, 0, -5, Sign(Gear.dX)) then begin Gear.dX:= Gear.dX * 0.95; Gear.Y:= Gear.Y - 5 end else
   335             if abs(Gear.dX) > 0.02 then Gear.dX:= -0.5 * Gear.dX
   336             if abs(Gear.dX) > 0.02 then Gear.dX:= -0.3 * Gear.dX
   336                                    else begin
   337                                    else begin
   337                                         Gear.State:= Gear.State and not gstMoving;
   338                                         Gear.State:= Gear.State and not gstMoving;
   338                                         Gear.dX:= 0.0000001 * Sign(Gear.dX)
   339                                         Gear.dX:= 0.0000001 * Sign(Gear.dX)
   339                                         end
   340                                         end
   340                                    else begin
   341                                    else begin
   347    (sqr(Gear.dX) + sqr(Gear.dY) < 0.0008) then
   348    (sqr(Gear.dX) + sqr(Gear.dY) < 0.0008) then
   348    begin
   349    begin
   349    Gear.State:= Gear.State and not gstMoving;
   350    Gear.State:= Gear.State and not gstMoving;
   350    Gear.dX:= 0.0000001 * Sign(Gear.dX);
   351    Gear.dX:= 0.0000001 * Sign(Gear.dX);
   351    Gear.dY:= 0
   352    Gear.dY:= 0
   352    end else Gear.State:= Gear.State or      gstMoving;
   353    end else Gear.State:= Gear.State or gstMoving;
   353 
   354 
   354 if (Gear.State and gstMoving) <> 0 then
   355 if (Gear.State and gstMoving) <> 0 then
   355    begin
   356    begin
   356    Gear.X:= Gear.X + Gear.dX;
   357    Gear.X:= Gear.X + Gear.dX;
   357    Gear.Y:= Gear.Y + Gear.dY
   358    Gear.Y:= Gear.Y + Gear.dY