133 begin |
133 begin |
134 dmg:= ModifyDamage(min(dmg div 2, Radius), Gear); |
134 dmg:= ModifyDamage(min(dmg div 2, Radius), Gear); |
135 //AddFileLog('Damage: ' + inttostr(dmg)); |
135 //AddFileLog('Damage: ' + inttostr(dmg)); |
136 if (Mask and EXPLNoDamage) = 0 then |
136 if (Mask and EXPLNoDamage) = 0 then |
137 begin |
137 begin |
138 if not Gear^.Invulnerable then |
138 if Gear^.Hedgehog^.Effects[heInvulnerable] = 0 then |
139 ApplyDamage(Gear, AttackingHog, dmg, dsExplosion) |
139 ApplyDamage(Gear, AttackingHog, dmg, dsExplosion) |
140 else |
140 else |
141 Gear^.State:= Gear^.State or gstWinner; |
141 Gear^.State:= Gear^.State or gstWinner; |
142 end; |
142 end; |
143 if ((Mask and EXPLDoNotTouchAny) = 0) and (((Mask and EXPLDoNotTouchHH) = 0) or (Gear^.Kind <> gtHedgehog)) then |
143 if ((Mask and EXPLDoNotTouchAny) = 0) and (((Mask and EXPLDoNotTouchHH) = 0) or (Gear^.Kind <> gtHedgehog)) then |
146 Gear^.dX:= Gear^.dX + SignAs(_0_005 * dmg + cHHKick, tdX)/(Gear^.Density/_3); |
146 Gear^.dX:= Gear^.dX + SignAs(_0_005 * dmg + cHHKick, tdX)/(Gear^.Density/_3); |
147 Gear^.dY:= Gear^.dY + SignAs(_0_005 * dmg + cHHKick, tdY)/(Gear^.Density/_3); |
147 Gear^.dY:= Gear^.dY + SignAs(_0_005 * dmg + cHHKick, tdY)/(Gear^.Density/_3); |
148 |
148 |
149 Gear^.State:= (Gear^.State or gstMoving) and (not gstLoser); |
149 Gear^.State:= (Gear^.State or gstMoving) and (not gstLoser); |
150 if Gear^.Kind = gtKnife then Gear^.State:= Gear^.State and (not gstCollision); |
150 if Gear^.Kind = gtKnife then Gear^.State:= Gear^.State and (not gstCollision); |
151 if not Gear^.Invulnerable then |
151 if Gear^.Hedgehog^.Effects[heInvulnerable] = 0 then |
152 Gear^.State:= (Gear^.State or gstMoving) and (not gstWinner); |
152 Gear^.State:= (Gear^.State or gstMoving) and (not gstWinner); |
153 Gear^.Active:= true; |
153 Gear^.Active:= true; |
154 if Gear^.Kind <> gtFlame then FollowGear:= Gear |
154 if Gear^.Kind <> gtFlame then FollowGear:= Gear |
155 end; |
155 end; |
156 if ((Mask and EXPLPoisoned) <> 0) and (Gear^.Kind = gtHedgehog) and (not Gear^.Invulnerable) and ((Gear^.State and gstHHDeath) = 0) then |
156 if ((Mask and EXPLPoisoned) <> 0) and (Gear^.Kind = gtHedgehog) and (Gear^.Hedgehog^.Effects[heInvulnerable] = 0) and (Gear^.State and gstHHDeath = 0) then |
157 Gear^.Hedgehog^.Effects[hePoisoned] := 1; |
157 Gear^.Hedgehog^.Effects[hePoisoned] := 1; |
158 end; |
158 end; |
159 |
159 |
160 end; |
160 end; |
161 gtGrave: begin |
161 gtGrave: begin |
703 CheckGearNear:= nil |
702 CheckGearNear:= nil |
704 end; |
703 end; |
705 |
704 |
706 procedure CheckCollision(Gear: PGear); inline; |
705 procedure CheckCollision(Gear: PGear); inline; |
707 begin |
706 begin |
708 if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) |
707 if (TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) <> 0) |
709 or (TestCollisionYwithGear(Gear, hwSign(Gear^.dY)) <> 0) then |
708 or (TestCollisionYwithGear(Gear, hwSign(Gear^.dY)) <> 0) then |
710 Gear^.State := Gear^.State or gstCollision |
709 Gear^.State := Gear^.State or gstCollision |
711 else |
710 else |
712 Gear^.State := Gear^.State and (not gstCollision) |
711 Gear^.State := Gear^.State and (not gstCollision) |
713 end; |
712 end; |
714 |
713 |
715 procedure CheckCollisionWithLand(Gear: PGear); inline; |
714 procedure CheckCollisionWithLand(Gear: PGear); inline; |
716 begin |
715 begin |
717 if TestCollisionX(Gear, hwSign(Gear^.dX)) |
716 if (TestCollisionX(Gear, hwSign(Gear^.dX)) <> 0) |
718 or TestCollisionY(Gear, hwSign(Gear^.dY)) then |
717 or (TestCollisionY(Gear, hwSign(Gear^.dY)) <> 0) then |
719 Gear^.State := Gear^.State or gstCollision |
718 Gear^.State := Gear^.State or gstCollision |
720 else |
719 else |
721 Gear^.State := Gear^.State and (not gstCollision) |
720 Gear^.State := Gear^.State and (not gstCollision) |
722 end; |
721 end; |
723 |
722 |
724 function MakeHedgehogsStep(Gear: PGear) : boolean; |
723 function MakeHedgehogsStep(Gear: PGear) : boolean; |
725 begin |
724 begin |
726 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 |
727 begin |
726 begin |
728 Gear^.Y:= Gear^.Y - _1; |
727 Gear^.Y:= Gear^.Y - _1; |
729 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 |
730 begin |
729 begin |
731 Gear^.Y:= Gear^.Y - _1; |
730 Gear^.Y:= Gear^.Y - _1; |
732 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 |
733 begin |
732 begin |
734 Gear^.Y:= Gear^.Y - _1; |
733 Gear^.Y:= Gear^.Y - _1; |
735 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 |
736 begin |
735 begin |
737 Gear^.Y:= Gear^.Y - _1; |
736 Gear^.Y:= Gear^.Y - _1; |
738 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 |
739 begin |
738 begin |
740 Gear^.Y:= Gear^.Y - _1; |
739 Gear^.Y:= Gear^.Y - _1; |
741 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 |
742 begin |
741 begin |
743 Gear^.Y:= Gear^.Y - _1; |
742 Gear^.Y:= Gear^.Y - _1; |
744 if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then |
743 if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) <> 0 then |
745 Gear^.Y:= Gear^.Y + _6 |
744 Gear^.Y:= Gear^.Y + _6 |
746 end else Gear^.Y:= Gear^.Y + _5 else |
745 end else Gear^.Y:= Gear^.Y + _5 else |
747 end else Gear^.Y:= Gear^.Y + _4 else |
746 end else Gear^.Y:= Gear^.Y + _4 else |
748 end else Gear^.Y:= Gear^.Y + _3 else |
747 end else Gear^.Y:= Gear^.Y + _3 else |
749 end else Gear^.Y:= Gear^.Y + _2 else |
748 end else Gear^.Y:= Gear^.Y + _2 else |
750 end else Gear^.Y:= Gear^.Y + _1 |
749 end else Gear^.Y:= Gear^.Y + _1 |
751 end; |
750 end; |
752 |
751 |
753 if not TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then |
752 if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) = 0 then |
754 begin |
753 begin |
755 Gear^.X:= Gear^.X + SignAs(_1, Gear^.dX); |
754 Gear^.X:= Gear^.X + SignAs(_1, Gear^.dX); |
756 MakeHedgehogsStep:= true |
755 MakeHedgehogsStep:= true |
757 end else |
756 end else |
758 MakeHedgehogsStep:= false; |
757 MakeHedgehogsStep:= false; |
967 Gear^.Active:= true; |
966 Gear^.Active:= true; |
968 DeleteCI(Gear); |
967 DeleteCI(Gear); |
969 Gear^.State:= Gear^.State or gstMoving; |
968 Gear^.State:= Gear^.State or gstMoving; |
970 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); |
971 // 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 |
972 if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then |
971 if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) <> 0 then |
973 begin |
972 begin |
974 if not (TestCollisionXwithXYShift(Gear, _0, -3, hwSign(Gear^.dX)) |
973 if (TestCollisionXwithXYShift(Gear, _0, -3, hwSign(Gear^.dX)) = 0) and |
975 or (TestCollisionYwithGear(Gear, -1) <> 0)) then |
974 (TestCollisionYwithGear(Gear, -1) = 0) then |
976 Gear^.Y:= Gear^.Y - _1; |
975 Gear^.Y:= Gear^.Y - _1; |
977 if not (TestCollisionXwithXYShift(Gear, _0, -2, hwSign(Gear^.dX)) |
976 if (TestCollisionXwithXYShift(Gear, _0, -2, hwSign(Gear^.dX)) = 0) and |
978 or (TestCollisionYwithGear(Gear, -1) <> 0)) then |
977 (TestCollisionYwithGear(Gear, -1) = 0) then |
979 Gear^.Y:= Gear^.Y - _1; |
978 Gear^.Y:= Gear^.Y - _1; |
980 if not (TestCollisionXwithXYShift(Gear, _0, -1, hwSign(Gear^.dX)) |
979 if (TestCollisionXwithXYShift(Gear, _0, -1, hwSign(Gear^.dX)) = 0) and |
981 or (TestCollisionYwithGear(Gear, -1) <> 0)) then |
980 (TestCollisionYwithGear(Gear, -1) = 0) then |
982 Gear^.Y:= Gear^.Y - _1; |
981 Gear^.Y:= Gear^.Y - _1; |
983 end |
982 end |
984 end; |
983 end; |
985 |
984 |
986 |
985 |