1934 var i,t,targDist,tmpDist: LongWord; |
1934 var i,t,targDist,tmpDist: LongWord; |
1935 targ, tmpG: PGear; |
1935 targ, tmpG: PGear; |
1936 trackSpeed, airFriction, tX, tY: hwFloat; |
1936 trackSpeed, airFriction, tX, tY: hwFloat; |
1937 isUnderwater: Boolean; |
1937 isUnderwater: Boolean; |
1938 begin |
1938 begin |
|
1939 if (Gear^.State and gstFrozen) <> 0 then |
|
1940 begin |
|
1941 if Gear^.Damage > 0 then |
|
1942 begin |
|
1943 doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound); |
|
1944 DeleteGear(Gear) |
|
1945 end; |
|
1946 exit |
|
1947 end; |
1939 isUnderwater:= CheckCoordInWater(hwRound(Gear^.X), hwRound(Gear^.Y) + Gear^.Radius); |
1948 isUnderwater:= CheckCoordInWater(hwRound(Gear^.X), hwRound(Gear^.Y) + Gear^.Radius); |
1940 if Gear^.Pos > 0 then |
1949 if Gear^.Pos > 0 then |
1941 begin |
1950 begin |
1942 airFriction:= _1; |
1951 airFriction:= _1; |
1943 if isUnderwater then |
1952 if isUnderwater then |
2043 begin |
2052 begin |
2044 if targ <> nil then |
2053 if targ <> nil then |
2045 begin |
2054 begin |
2046 tX:=Gear^.X-targ^.X; |
2055 tX:=Gear^.X-targ^.X; |
2047 tY:=Gear^.Y-targ^.Y; |
2056 tY:=Gear^.Y-targ^.Y; |
2048 if (tX.Round+tY.Round < Gear^.Karma) and |
2057 if (tX.Round+tY.Round < Gear^.Boom) and |
2049 (hwRound(hwSqr(tX) + hwSqr(tY)) < sqr(Gear^.Karma)) then |
2058 (hwRound(hwSqr(tX) + hwSqr(tY)) < sqr(Gear^.Boom)) then |
2050 Gear^.State := Gear^.State or gstAttacking |
2059 Gear^.State := Gear^.State or gstAttacking |
2051 end |
2060 end |
2052 else if (Gear^.Angle > 0) and (CheckGearNear(Gear, gtHedgehog, Gear^.Karma, Gear^.Karma) <> nil) then |
2061 else if (Gear^.Angle > 0) and (CheckGearNear(Gear, gtHedgehog, Gear^.Boom, Gear^.Boom) <> nil) then |
2053 Gear^.State := Gear^.State or gstAttacking |
2062 Gear^.State := Gear^.State or gstAttacking |
2054 end |
2063 end |
2055 end |
2064 end |
2056 else // gstAttacking <> 0 |
2065 else // gstAttacking <> 0 |
2057 begin |
2066 begin |
2063 // recheck |
2072 // recheck |
2064 if targ <> nil then |
2073 if targ <> nil then |
2065 begin |
2074 begin |
2066 tX:=Gear^.X-targ^.X; |
2075 tX:=Gear^.X-targ^.X; |
2067 tY:=Gear^.Y-targ^.Y; |
2076 tY:=Gear^.Y-targ^.Y; |
2068 if (tX.Round+tY.Round < Gear^.Karma) and |
2077 if (tX.Round+tY.Round < Gear^.Boom) and |
2069 (hwRound(hwSqr(tX) + hwSqr(tY)) < sqr(Gear^.Karma)) then |
2078 (hwRound(hwSqr(tX) + hwSqr(tY)) < sqr(Gear^.Boom)) then |
2070 begin |
2079 begin |
2071 Gear^.Hedgehog:= CurrentHedgehog; |
2080 Gear^.Hedgehog:= CurrentHedgehog; |
2072 tmpG:= FollowGear; |
2081 tmpG:= FollowGear; |
2073 doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Karma, Gear^.Hedgehog, EXPLAutoSound); |
2082 doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound); |
2074 FollowGear:= tmpG; |
2083 FollowGear:= tmpG; |
2075 DeleteGear(Gear); |
2084 DeleteGear(Gear); |
2076 exit |
2085 exit |
2077 end |
2086 end |
2078 end |
2087 end |
2079 else if (Gear^.Angle > 0) and (CheckGearNear(Gear, gtHedgehog, Gear^.Karma, Gear^.Karma) <> nil) then |
2088 else if (Gear^.Angle > 0) and (CheckGearNear(Gear, gtHedgehog, Gear^.Boom, Gear^.Boom) <> nil) then |
2080 begin |
2089 begin |
2081 Gear^.Hedgehog:= CurrentHedgehog; |
2090 Gear^.Hedgehog:= CurrentHedgehog; |
2082 doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Karma, Gear^.Hedgehog, EXPLAutoSound); |
2091 doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound); |
2083 DeleteGear(Gear); |
2092 DeleteGear(Gear); |
2084 exit |
2093 exit |
2085 end; |
2094 end; |
2086 Gear^.State:= Gear^.State and (not gstAttacking); |
2095 Gear^.State:= Gear^.State and (not gstAttacking); |
2087 Gear^.Timer:= Gear^.WDTimer |
2096 Gear^.Timer:= Gear^.WDTimer |
6142 begin |
6151 begin |
6143 HedgehogChAngle(HHGear); |
6152 HedgehogChAngle(HHGear); |
6144 ndX:= SignAs(AngleSin(HHGear^.Angle), HHGear^.dX) * _4; |
6153 ndX:= SignAs(AngleSin(HHGear^.Angle), HHGear^.dX) * _4; |
6145 ndY:= -AngleCos(HHGear^.Angle) * _4; |
6154 ndY:= -AngleCos(HHGear^.Angle) * _4; |
6146 if (ndX <> dX) or (ndY <> dY) or |
6155 if (ndX <> dX) or (ndY <> dY) or |
6147 ((Target.X <> NoPointX) and (Target.X and LAND_WIDTH_MASK = 0) and |
6156 (((Target.X <> NoPointX) and (Target.X and LAND_WIDTH_MASK = 0) and |
6148 (Target.Y and LAND_HEIGHT_MASK = 0) and ((Land[Target.Y, Target.X] = 0)) and |
6157 (Target.Y and LAND_HEIGHT_MASK = 0) and ((Land[Target.Y, Target.X] = 0)) and |
6149 (not CheckCoordInWater(Target.X, Target.Y))) then |
6158 (not CheckCoordInWater(Target.X, Target.Y))) and (CheckGearNear(gtAirMine, int2hwFloat(Target.X),int2hwFloat(Target.Y), Gear^.Radius*2, Gear^.Radius*2) = nil)) then |
6150 begin |
6159 begin |
6151 updateTarget(Gear, ndX, ndY); |
6160 updateTarget(Gear, ndX, ndY); |
6152 Timer := iceWaitCollision; |
6161 Timer := iceWaitCollision; |
6153 end |
6162 end |
6154 else |
6163 else |
6160 if Target.X = NoPointX then t:= hwRound(hwSqr(X-HHGear^.X)+hwSqr(Y-HHGear^.Y)); |
6169 if Target.X = NoPointX then t:= hwRound(hwSqr(X-HHGear^.X)+hwSqr(Y-HHGear^.Y)); |
6161 |
6170 |
6162 if Target.X <> NoPointX then |
6171 if Target.X <> NoPointX then |
6163 begin |
6172 begin |
6164 CheckCollision(Gear); |
6173 CheckCollision(Gear); |
6165 if (State and gstCollision) <> 0 then |
6174 if ((State and gstCollision) <> 0) or (CheckGearNear(gtAirMine, int2hwFloat(Target.X),int2hwFloat(Target.Y), Gear^.Radius*3, Gear^.Radius*3) <> nil) then |
6166 begin |
6175 begin |
6167 if Timer = iceWaitCollision then |
6176 if Timer = iceWaitCollision then |
6168 begin |
6177 begin |
6169 Timer := iceCollideWithGround; |
6178 Timer := iceCollideWithGround; |
6170 Power := GameTicks; |
6179 Power := GameTicks; |
6205 // Freeze nearby mines/explosives/cases too |
6214 // Freeze nearby mines/explosives/cases too |
6206 iter := GearsList; |
6215 iter := GearsList; |
6207 while iter <> nil do |
6216 while iter <> nil do |
6208 begin |
6217 begin |
6209 if (iter^.State and gstFrozen = 0) and |
6218 if (iter^.State and gstFrozen = 0) and |
6210 ((iter^.Kind = gtExplosives) or (iter^.Kind = gtCase) or (iter^.Kind = gtMine) or (iter^.Kind = gtSMine)) and |
6219 ((iter^.Kind = gtExplosives) or (iter^.Kind = gtAirMine) or (iter^.Kind = gtCase) or (iter^.Kind = gtMine) or (iter^.Kind = gtSMine)) and |
6211 (abs(LongInt(iter^.X.Round) - target.x) + abs(LongInt(iter^.Y.Round) - target.y) + 2 < 2 * iceRadius) |
6220 (abs(LongInt(iter^.X.Round) - target.x) + abs(LongInt(iter^.Y.Round) - target.y) + 2 < 2 * iceRadius) |
6212 and (Distance(iter^.X - int2hwFloat(target.x), iter^.Y - int2hwFloat(target.y)) < int2hwFloat(iceRadius * 2)) then |
6221 and (Distance(iter^.X - int2hwFloat(target.x), iter^.Y - int2hwFloat(target.y)) < int2hwFloat(iceRadius * 2)) then |
6213 begin |
6222 begin |
6214 for t:= 0 to 5 do |
6223 for t:= 0 to 5 do |
6215 begin |
6224 begin |
6249 begin |
6258 begin |
6250 DeleteCI(iter); |
6259 DeleteCI(iter); |
6251 iter^.State:= iter^.State or gstFrozen; |
6260 iter^.State:= iter^.State or gstFrozen; |
6252 AddCI(iter) |
6261 AddCI(iter) |
6253 end |
6262 end |
|
6263 else if iter^.Kind = gtAirMine then |
|
6264 begin |
|
6265 AddCI(iter); |
|
6266 iter^.State:= iter^.State or gstFrozen |
|
6267 end |
6254 else // gtExplosives |
6268 else // gtExplosives |
6255 begin |
6269 begin |
6256 iter^.State:= iter^.State or gstFrozen; |
6270 iter^.State:= iter^.State or gstFrozen; |
6257 iter^.Health:= iter^.Health + cBarrelHealth |
6271 iter^.Health:= iter^.Health + cBarrelHealth |
6258 end |
6272 end |
6319 begin |
6333 begin |
6320 Target.X:= gX; |
6334 Target.X:= gX; |
6321 Target.Y:= gY; |
6335 Target.Y:= gY; |
6322 X:= HHGear^.X; |
6336 X:= HHGear^.X; |
6323 Y:= HHGear^.Y |
6337 Y:= HHGear^.Y |
6324 end; |
6338 end |
|
6339 else if CheckGearNear(Gear, gtAirMine, Gear^.Radius*2, Gear^.Radius*2) <> nil then |
|
6340 begin |
|
6341 Target.X:= gX; |
|
6342 Target.Y:= gY; |
|
6343 X:= HHGear^.X; |
|
6344 Y:= HHGear^.Y |
|
6345 end; |
6325 if (gX > max(LAND_WIDTH,4096)*2) or |
6346 if (gX > max(LAND_WIDTH,4096)*2) or |
6326 (gX < -max(LAND_WIDTH,4096)) or |
6347 (gX < -max(LAND_WIDTH,4096)) or |
6327 (gY < -max(LAND_HEIGHT,4096)) or |
6348 (gY < -max(LAND_HEIGHT,4096)) or |
6328 (gY > max(LAND_HEIGHT,4096)+512) then |
6349 (gY > max(LAND_HEIGHT,4096)+512) then |
6329 begin |
6350 begin |