hedgewars/HHHandlers.inc
changeset 300 be94799f33d2
parent 295 8834f3cb620e
child 302 7aca131ecd7f
equal deleted inserted replaced
299:098c722e13e1 300:be94799f33d2
   140 AllInactive:= false;
   140 AllInactive:= false;
   141 DeleteCI(Gear);
   141 DeleteCI(Gear);
   142 if (TurnTimeLeft = 0) or (Gear.Damage > 0) then
   142 if (TurnTimeLeft = 0) or (Gear.Damage > 0) then
   143    begin
   143    begin
   144    TurnTimeLeft:= 0;
   144    TurnTimeLeft:= 0;
   145    if ((Gear.State and (gstMoving or gstFalling)) = 0)
       
   146       and (CurAmmoGear = nil) then Gear.dX:= 0.0000001 * hwSign(Gear.dX);
       
   147    Gear.State:= Gear.State and not gstHHDriven;
   145    Gear.State:= Gear.State and not gstHHDriven;
   148    if Gear.Damage > 0 then
   146    if Gear.Damage > 0 then
   149       Gear.State:= Gear.State and not gstHHJumping;
   147       Gear.State:= Gear.State and not gstHHJumping;
   150    exit
   148    exit
   151    end;
   149    end;
   170 if (Gear.State and gstFalling) <> 0 then
   168 if (Gear.State and gstFalling) <> 0 then
   171    begin
   169    begin
   172    // it could be the source to trick: double-backspace jump -> vertical wall
   170    // it could be the source to trick: double-backspace jump -> vertical wall
   173    // collision - > (abs(Gear.dX) < 0.0000002) -> backspace -> even more high jump
   171    // collision - > (abs(Gear.dX) < 0.0000002) -> backspace -> even more high jump
   174    if ((Gear.Message and gm_HJump) <> 0) and ((Gear.State and gstHHJumping) <> 0) then
   172    if ((Gear.Message and gm_HJump) <> 0) and ((Gear.State and gstHHJumping) <> 0) then
   175       if (abs(Gear.dX) < 0.0000002) and (Gear.dY < -0.02) then
   173       if (abs(Gear.dX) < 2 * cLittle) and (Gear.dY < -0.02) then
   176          begin
   174          begin
   177          Gear.dY:= -0.25;
   175          Gear.dY:= -0.25;
   178          Gear.dX:= hwSign(Gear.dX) * 0.02
   176          Gear.dX:= hwSign(Gear.dX) * 0.02
   179          end;
   177          end;
   180    Gear.Message:= Gear.Message and not (gm_LJump or gm_HJump);     
   178    Gear.Message:= Gear.Message and not (gm_LJump or gm_HJump);     
   181    if TestCollisionXwithGear(Gear, hwSign(Gear.dX)) then Gear.dX:= 0.0000001 * hwSign(Gear.dX);
   179    if TestCollisionXwithGear(Gear, hwSign(Gear.dX)) then SetLittle(Gear.dX);
   182    Gear.X:= Gear.X + Gear.dX;
   180    Gear.X:= Gear.X + Gear.dX;
   183    Gear.dY:= Gear.dY + cGravity;
   181    Gear.dY:= Gear.dY + cGravity;
   184    if (Gear.dY < 0)and TestCollisionYwithGear(Gear, -1) then Gear.dY:= 0;
   182    if (Gear.dY < 0)and TestCollisionYwithGear(Gear, -1) then Gear.dY:= 0;
   185    Gear.Y:= Gear.Y + Gear.dY;
   183    Gear.Y:= Gear.Y + Gear.dY;
   186    if (Gear.dY >= 0)and TestCollisionYwithGear(Gear, 1) then
   184    if (Gear.dY >= 0)and TestCollisionYwithGear(Gear, 1) then
   187       begin
   185       begin
   188       CheckHHDamage(Gear);
   186       CheckHHDamage(Gear);
   189       if ((abs(Gear.dX) + abs(Gear.dY)) < 0.55)
   187       if ((abs(Gear.dX) + abs(Gear.dY)) < 0.55)
   190          and ((Gear.State and gstHHJumping) <> 0) then Gear.dX:= 0.0000001 * hwSign(Gear.dX);
   188          and ((Gear.State and gstHHJumping) <> 0) then SetLittle(Gear.dX);
   191       Gear.State:= Gear.State and not (gstFalling or gstHHJumping);
   189       Gear.State:= Gear.State and not (gstFalling or gstHHJumping);
   192       StepTicks:= 300; 
   190       StepTicks:= 300; 
   193       Gear.dY:= 0
   191       Gear.dY:= 0
   194       end;
   192       end;
   195    CheckGearDrowning(Gear);
   193    CheckGearDrowning(Gear);
   231          Gear.State:= Gear.State or gstFalling or gstHHJumping;
   229          Gear.State:= Gear.State or gstFalling or gstHHJumping;
   232          exit
   230          exit
   233          end;
   231          end;
   234       end;
   232       end;
   235    PrevdX:= hwSign(Gear.dX);
   233    PrevdX:= hwSign(Gear.dX);
   236    if (Gear.Message and gm_Left  )<>0 then Gear.dX:= -1.0 else
   234    if (Gear.Message and gm_Left  )<>0 then Gear.dX:= -cLittle else
   237    if (Gear.Message and gm_Right )<>0 then Gear.dX:=  1.0 else exit;
   235    if (Gear.Message and gm_Right )<>0 then Gear.dX:=  cLittle else exit;
   238    StepTicks:= cHHStepTicks;
   236    StepTicks:= cHHStepTicks;
   239    if PrevdX <> hwSign(Gear.dX) then exit;
   237    if PrevdX <> hwSign(Gear.dX) then exit;
   240    PHedgehog(Gear.Hedgehog).visStepPos:= (PHedgehog(Gear.Hedgehog).visStepPos + 1) and 7;
   238    PHedgehog(Gear.Hedgehog).visStepPos:= (PHedgehog(Gear.Hedgehog).visStepPos + 1) and 7;
   241    if TestCollisionXwithGear(Gear, hwSign(Gear.dX)) then
   239    if TestCollisionXwithGear(Gear, hwSign(Gear.dX)) then
   242       begin
   240       begin
   251       if not (TestCollisionXwithXYShift(Gear, 0, -2, hwSign(Gear.dX))
   249       if not (TestCollisionXwithXYShift(Gear, 0, -2, hwSign(Gear.dX))
   252          or TestCollisionYwithGear(Gear, -1)) then Gear.Y:= Gear.Y - 1;
   250          or TestCollisionYwithGear(Gear, -1)) then Gear.Y:= Gear.Y - 1;
   253       if not (TestCollisionXwithXYShift(Gear, 0, -1, hwSign(Gear.dX))
   251       if not (TestCollisionXwithXYShift(Gear, 0, -1, hwSign(Gear.dX))
   254          or TestCollisionYwithGear(Gear, -1)) then Gear.Y:= Gear.Y - 1;
   252          or TestCollisionYwithGear(Gear, -1)) then Gear.Y:= Gear.Y - 1;
   255       end;
   253       end;
   256    if not TestCollisionXwithGear(Gear, hwSign(Gear.dX)) then Gear.X:= Gear.X + Gear.dX;
   254    if not TestCollisionXwithGear(Gear, hwSign(Gear.dX)) then Gear.X:= Gear.X + hwSign(Gear.dX);
   257    Gear.dX:= 0.0000001 * hwSign(Gear.dX);
   255 
   258    SetAllHHToActive;
   256    SetAllHHToActive;
   259 
   257 
   260    if not TestCollisionYwithGear(Gear, 1) then
   258    if not TestCollisionYwithGear(Gear, 1) then
   261    begin
   259    begin
   262    Gear.Y:= Gear.Y + 1;
   260    Gear.Y:= Gear.Y + 1;
   277    Gear.Y:= Gear.Y + 1;
   275    Gear.Y:= Gear.Y + 1;
   278    if not TestCollisionYwithGear(Gear, 1) then
   276    if not TestCollisionYwithGear(Gear, 1) then
   279       begin
   277       begin
   280       Gear.Y:= Gear.Y - 6;
   278       Gear.Y:= Gear.Y - 6;
   281       Gear.dY:= 0;
   279       Gear.dY:= 0;
   282       Gear.dX:= 0.0000001 * hwSign(Gear.dX);
       
   283       Gear.State:= Gear.State or gstFalling
   280       Gear.State:= Gear.State or gstFalling
   284       end;
   281       end;
   285    end
   282    end
   286    end
   283    end
   287    end
   284    end
   301    Gear.State:= Gear.State or gstFalling or gstMoving;
   298    Gear.State:= Gear.State or gstFalling or gstMoving;
   302    Gear.dY:= Gear.dY + cGravity
   299    Gear.dY:= Gear.dY + cGravity
   303    end else begin
   300    end else begin
   304    CheckHHDamage(Gear);
   301    CheckHHDamage(Gear);
   305    if ((abs(Gear.dX) + abs(Gear.dY)) < 0.55)
   302    if ((abs(Gear.dX) + abs(Gear.dY)) < 0.55)
   306       and ((Gear.State and gstHHJumping) <> 0) then Gear.dX:= 0.0000001 * hwSign(Gear.dX);
   303       and ((Gear.State and gstHHJumping) <> 0) then SetLittle(Gear.dX);
   307    Gear.State:= Gear.State and not (gstFalling or gstHHJumping);
   304    Gear.State:= Gear.State and not (gstFalling or gstHHJumping);
   308    if Gear.dY > 0 then Gear.dY:= 0;
   305    if Gear.dY > 0 then Gear.dY:= 0;
   309    if ((Gear.State and gstMoving) <> 0) then Gear.dX:= Gear.dX * Gear.Friction
   306    if ((Gear.State and gstMoving) <> 0) then Gear.dX:= Gear.dX * Gear.Friction
   310    end;
   307    end;
   311 
   308 
   321             if not TestCollisionXwithXYShift(Gear, hwSign(Gear.dX) - Gear.dX, -4, hwSign(Gear.dX)) then begin Gear.X:= Gear.X + Gear.dX; Gear.dX:= Gear.dX * 0.87; Gear.Y:= Gear.Y - 4 end else
   318             if not TestCollisionXwithXYShift(Gear, hwSign(Gear.dX) - Gear.dX, -4, hwSign(Gear.dX)) then begin Gear.X:= Gear.X + Gear.dX; Gear.dX:= Gear.dX * 0.87; Gear.Y:= Gear.Y - 4 end else
   322             if not TestCollisionXwithXYShift(Gear, hwSign(Gear.dX) - Gear.dX, -5, hwSign(Gear.dX)) then begin Gear.X:= Gear.X + Gear.dX; Gear.dX:= Gear.dX * 0.84; Gear.Y:= Gear.Y - 5 end else
   319             if not TestCollisionXwithXYShift(Gear, hwSign(Gear.dX) - Gear.dX, -5, hwSign(Gear.dX)) then begin Gear.X:= Gear.X + Gear.dX; Gear.dX:= Gear.dX * 0.84; Gear.Y:= Gear.Y - 5 end else
   323             if abs(Gear.dX) > 0.02 then Gear.dX:= -Gear.Elasticity * Gear.dX
   320             if abs(Gear.dX) > 0.02 then Gear.dX:= -Gear.Elasticity * Gear.dX
   324                                    else begin
   321                                    else begin
   325                                         Gear.State:= Gear.State and not gstMoving;
   322                                         Gear.State:= Gear.State and not gstMoving;
   326                                         Gear.dX:= 0.0000001 * hwSign(Gear.dX)
   323                                         SetLittle(Gear.dX)
   327                                         end
   324                                         end
   328             else begin
   325             else begin
   329                  Gear.State:= Gear.State and not gstMoving;
   326                  Gear.State:= Gear.State and not gstMoving;
   330                  Gear.dX:= 0.0000001 * hwSign(Gear.dX)
   327                  SetLittle(Gear.dX)
   331                  end
   328                  end
   332          else Gear.dX:= -Gear.Elasticity * Gear.dX;
   329          else Gear.dX:= -Gear.Elasticity * Gear.dX;
   333 
   330 
   334 if ((Gear.State and gstFalling) = 0)and
   331 if ((Gear.State and gstFalling) = 0)and
   335    (sqr(Gear.dX) + sqr(Gear.dY) < 0.0008) then
   332    (sqr(Gear.dX) + sqr(Gear.dY) < 0.0008) then
   336    begin
   333    begin
   337    Gear.State:= Gear.State and not gstMoving;
   334    Gear.State:= Gear.State and not gstMoving;
   338    Gear.dX:= 0.0000001 * hwSign(Gear.dX);
   335    SetLittle(Gear.dX);
   339    Gear.dY:= 0
   336    Gear.dY:= 0
   340    end else Gear.State:= Gear.State or gstMoving;
   337    end else Gear.State:= Gear.State or gstMoving;
   341 
   338 
   342 if (Gear.State and gstMoving) <> 0 then
   339 if (Gear.State and gstMoving) <> 0 then
   343    begin
   340    begin