hedgewars/uGearsUtils.pas
changeset 9706 5178d2263521
parent 9685 7d925e82e572
child 9809 1e32628eb167
equal deleted inserted replaced
9704:055fee9da6a0 9706:5178d2263521
   702 CheckGearNear:= nil
   702 CheckGearNear:= nil
   703 end;
   703 end;
   704 
   704 
   705 procedure CheckCollision(Gear: PGear); inline;
   705 procedure CheckCollision(Gear: PGear); inline;
   706 begin
   706 begin
   707     if TestCollisionXwithGear(Gear, hwSign(Gear^.dX))
   707     if (TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) <> 0)
   708     or (TestCollisionYwithGear(Gear, hwSign(Gear^.dY)) <> 0) then
   708     or (TestCollisionYwithGear(Gear, hwSign(Gear^.dY)) <> 0) then
   709         Gear^.State := Gear^.State or gstCollision
   709         Gear^.State := Gear^.State or gstCollision
   710     else
   710     else
   711         Gear^.State := Gear^.State and (not gstCollision)
   711         Gear^.State := Gear^.State and (not gstCollision)
   712 end;
   712 end;
   713 
   713 
   714 procedure CheckCollisionWithLand(Gear: PGear); inline;
   714 procedure CheckCollisionWithLand(Gear: PGear); inline;
   715 begin
   715 begin
   716     if TestCollisionX(Gear, hwSign(Gear^.dX))
   716     if (TestCollisionX(Gear, hwSign(Gear^.dX)) <> 0)
   717     or TestCollisionY(Gear, hwSign(Gear^.dY)) then
   717     or (TestCollisionY(Gear, hwSign(Gear^.dY)) <> 0) then
   718         Gear^.State := Gear^.State or gstCollision
   718         Gear^.State := Gear^.State or gstCollision
   719     else 
   719     else 
   720         Gear^.State := Gear^.State and (not gstCollision)
   720         Gear^.State := Gear^.State and (not gstCollision)
   721 end;
   721 end;
   722 
   722 
   723 function MakeHedgehogsStep(Gear: PGear) : boolean;
   723 function MakeHedgehogsStep(Gear: PGear) : boolean;
   724 begin
   724 begin
   725     if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then if (TestCollisionYwithGear(Gear, -1) = 0) then
   725     if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) <> 0 then if (TestCollisionYwithGear(Gear, -1) = 0) then
   726         begin
   726         begin
   727         Gear^.Y:= Gear^.Y - _1;
   727         Gear^.Y:= Gear^.Y - _1;
   728     if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then if (TestCollisionYwithGear(Gear, -1) = 0) then
   728     if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) <> 0 then if (TestCollisionYwithGear(Gear, -1) = 0) then
   729         begin
   729         begin
   730         Gear^.Y:= Gear^.Y - _1;
   730         Gear^.Y:= Gear^.Y - _1;
   731     if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then if (TestCollisionYwithGear(Gear, -1) = 0) then
   731     if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) <> 0 then if (TestCollisionYwithGear(Gear, -1) = 0) then
   732         begin
   732         begin
   733         Gear^.Y:= Gear^.Y - _1;
   733         Gear^.Y:= Gear^.Y - _1;
   734     if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then if (TestCollisionYwithGear(Gear, -1) = 0) then
   734     if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) <> 0 then if (TestCollisionYwithGear(Gear, -1) = 0) then
   735         begin
   735         begin
   736         Gear^.Y:= Gear^.Y - _1;
   736         Gear^.Y:= Gear^.Y - _1;
   737     if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then if (TestCollisionYwithGear(Gear, -1) = 0) then
   737     if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) <> 0 then if (TestCollisionYwithGear(Gear, -1) = 0) then
   738         begin
   738         begin
   739         Gear^.Y:= Gear^.Y - _1;
   739         Gear^.Y:= Gear^.Y - _1;
   740     if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then if (TestCollisionYwithGear(Gear, -1) = 0) then
   740     if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) <> 0 then if (TestCollisionYwithGear(Gear, -1) = 0) then
   741         begin
   741         begin
   742         Gear^.Y:= Gear^.Y - _1;
   742         Gear^.Y:= Gear^.Y - _1;
   743         if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then
   743         if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) <> 0 then
   744             Gear^.Y:= Gear^.Y + _6
   744             Gear^.Y:= Gear^.Y + _6
   745         end else Gear^.Y:= Gear^.Y + _5 else
   745         end else Gear^.Y:= Gear^.Y + _5 else
   746         end else Gear^.Y:= Gear^.Y + _4 else
   746         end else Gear^.Y:= Gear^.Y + _4 else
   747         end else Gear^.Y:= Gear^.Y + _3 else
   747         end else Gear^.Y:= Gear^.Y + _3 else
   748         end else Gear^.Y:= Gear^.Y + _2 else
   748         end else Gear^.Y:= Gear^.Y + _2 else
   749         end else Gear^.Y:= Gear^.Y + _1
   749         end else Gear^.Y:= Gear^.Y + _1
   750         end;
   750         end;
   751 
   751 
   752     if not TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then
   752     if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) = 0 then
   753         begin
   753         begin
   754         Gear^.X:= Gear^.X + SignAs(_1, Gear^.dX);
   754         Gear^.X:= Gear^.X + SignAs(_1, Gear^.dX);
   755         MakeHedgehogsStep:= true
   755         MakeHedgehogsStep:= true
   756         end else
   756         end else
   757         MakeHedgehogsStep:= false;
   757         MakeHedgehogsStep:= false;
   966                 Gear^.Active:= true;
   966                 Gear^.Active:= true;
   967                 DeleteCI(Gear);
   967                 DeleteCI(Gear);
   968                 Gear^.State:= Gear^.State or gstMoving;
   968                 Gear^.State:= Gear^.State or gstMoving;
   969                 if Gear^.Kind = gtKnife then Gear^.State:= Gear^.State and (not gstCollision);
   969                 if Gear^.Kind = gtKnife then Gear^.State:= Gear^.State and (not gstCollision);
   970                 // move the gear upwards a bit to throw it over tiny obstacles at start
   970                 // move the gear upwards a bit to throw it over tiny obstacles at start
   971                 if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then
   971                 if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) <> 0 then
   972                     begin
   972                     begin
   973                     if not (TestCollisionXwithXYShift(Gear, _0, -3, hwSign(Gear^.dX))
   973                     if (TestCollisionXwithXYShift(Gear, _0, -3, hwSign(Gear^.dX)) = 0) and
   974                     or (TestCollisionYwithGear(Gear, -1) <> 0)) then
   974                        (TestCollisionYwithGear(Gear, -1) = 0) then
   975                         Gear^.Y:= Gear^.Y - _1;
   975                         Gear^.Y:= Gear^.Y - _1;
   976                     if not (TestCollisionXwithXYShift(Gear, _0, -2, hwSign(Gear^.dX))
   976                     if (TestCollisionXwithXYShift(Gear, _0, -2, hwSign(Gear^.dX)) = 0) and
   977                     or (TestCollisionYwithGear(Gear, -1) <> 0)) then
   977                        (TestCollisionYwithGear(Gear, -1) = 0) then
   978                         Gear^.Y:= Gear^.Y - _1;
   978                         Gear^.Y:= Gear^.Y - _1;
   979                     if not (TestCollisionXwithXYShift(Gear, _0, -1, hwSign(Gear^.dX))
   979                     if (TestCollisionXwithXYShift(Gear, _0, -1, hwSign(Gear^.dX)) = 0) and
   980                     or (TestCollisionYwithGear(Gear, -1) <> 0)) then
   980                        (TestCollisionYwithGear(Gear, -1) = 0) then
   981                         Gear^.Y:= Gear^.Y - _1;
   981                         Gear^.Y:= Gear^.Y - _1;
   982                     end
   982                     end
   983                 end;
   983                 end;
   984 
   984 
   985 
   985