1562 // Bullet Hit |
1562 // Bullet Hit |
1563 if ((Gear^.State and gstDrowning) = 0) and (x and LAND_WIDTH_MASK = 0) and (y and LAND_HEIGHT_MASK = 0) then |
1563 if ((Gear^.State and gstDrowning) = 0) and (x and LAND_WIDTH_MASK = 0) and (y and LAND_HEIGHT_MASK = 0) then |
1564 begin |
1564 begin |
1565 if Gear^.Kind = gtMinigunBullet then |
1565 if Gear^.Kind = gtMinigunBullet then |
1566 begin |
1566 begin |
1567 doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 5, |
1567 doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Karma, |
1568 Gear^.Hedgehog, (EXPLNoDamage or EXPLDoNotTouchHH){ or EXPLDontDraw or EXPLNoGfx}); |
1568 Gear^.Hedgehog, (EXPLNoDamage or EXPLDoNotTouchHH){ or EXPLDontDraw or EXPLNoGfx}); |
1569 VGear := AddVisualGear(hwRound(Gear^.X + Gear^.dX * 5), hwRound(Gear^.Y + Gear^.dY * 5), vgtBulletHit); |
1569 VGear := AddVisualGear(hwRound(Gear^.X + Gear^.dX * 5), hwRound(Gear^.Y + Gear^.dY * 5), vgtBulletHit); |
1570 end |
1570 end |
1571 else |
1571 else |
1572 VGear := AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtBulletHit); |
1572 VGear := AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtBulletHit); |
1605 end; |
1605 end; |
1606 end; |
1606 end; |
1607 |
1607 |
1608 procedure doStepDEagleShot(Gear: PGear); |
1608 procedure doStepDEagleShot(Gear: PGear); |
1609 begin |
1609 begin |
1610 |
|
1611 if Gear^.Data = nil then |
1610 if Gear^.Data = nil then |
1612 // remember who fired this |
1611 // remember who fired this |
1613 if (Gear^.Hedgehog <> nil) and (Gear^.Hedgehog^.Gear <> nil) then |
1612 if (Gear^.Hedgehog <> nil) and (Gear^.Hedgehog^.Gear <> nil) then |
1614 Gear^.Data:= Pointer(Gear^.Hedgehog^.Gear); |
1613 Gear^.Data:= Pointer(Gear^.Hedgehog^.Gear); |
1615 |
1614 |
7159 |
7158 |
7160 //////////////////////////////////////////////////////////////////////////////// |
7159 //////////////////////////////////////////////////////////////////////////////// |
7161 |
7160 |
7162 procedure doStepMinigunBullet(Gear: PGear); |
7161 procedure doStepMinigunBullet(Gear: PGear); |
7163 begin |
7162 begin |
7164 Gear^.Data:= nil; |
7163 if Gear^.Data = nil then |
7165 // remember who fired this |
7164 // remember who fired this |
7166 if (Gear^.Hedgehog <> nil) and (Gear^.Hedgehog^.Gear <> nil) then |
7165 if (Gear^.Hedgehog <> nil) and (Gear^.Hedgehog^.Gear <> nil) then |
7167 Gear^.Data:= Pointer(Gear^.Hedgehog^.Gear); |
7166 Gear^.Data:= Pointer(Gear^.Hedgehog^.Gear); |
7168 |
7167 |
7169 Gear^.X := Gear^.X + Gear^.dX * 2; |
7168 Gear^.X := Gear^.X + Gear^.dX * 2; |
7170 Gear^.Y := Gear^.Y + Gear^.dY * 2; |
7169 Gear^.Y := Gear^.Y + Gear^.dY * 2; |
7171 Gear^.FlightTime := 0; |
7170 Gear^.FlightTime := 0; |
7172 Gear^.doStep := @doStepBulletWork |
7171 Gear^.doStep := @doStepBulletWork |
7242 exit; |
7241 exit; |
7243 |
7242 |
7244 if TestCollisionY(Gear, 1) = 0 then |
7243 if TestCollisionY(Gear, 1) = 0 then |
7245 begin |
7244 begin |
7246 doStepFallingGear(Gear); |
7245 doStepFallingGear(Gear); |
7247 Gear^.Timer := 0; |
7246 if Gear^.Tag <> sentry_Idle then |
7248 Gear^.Tag := sentry_Idle; |
7247 begin |
7249 Gear^.Target.X := 0; |
7248 Gear^.Timer := 0; |
7250 Gear^.Target.Y := 0; |
7249 Gear^.Tag := sentry_Idle; |
|
7250 Gear^.Target.X := 0; |
|
7251 Gear^.Target.Y := 0; |
|
7252 if Gear^.Karma <> 0 then |
|
7253 begin |
|
7254 ClearGlobalHitOrderLeq(Gear^.Karma); |
|
7255 Gear^.Karma := 0; |
|
7256 end; |
|
7257 end; |
7251 exit; |
7258 exit; |
7252 end; |
7259 end; |
7253 |
7260 |
7254 if Gear^.Timer > 0 then dec(Gear^.Timer); |
7261 if Gear^.Timer > 0 then dec(Gear^.Timer); |
7255 |
7262 |
7268 end |
7275 end |
7269 else if Gear^.Tag = sentry_Aiming then |
7276 else if Gear^.Tag = sentry_Aiming then |
7270 begin |
7277 begin |
7271 Gear^.WDTimer := 5 + GetRandom(3); |
7278 Gear^.WDTimer := 5 + GetRandom(3); |
7272 Gear^.Tag := sentry_Attacking; |
7279 Gear^.Tag := sentry_Attacking; |
7273 Gear^.Timer := 200; |
7280 Gear^.Timer := 100; |
7274 end |
7281 end |
7275 else if Gear^.Tag = sentry_Attacking then |
7282 else if Gear^.Tag = sentry_Attacking then |
7276 begin |
7283 begin |
7277 distX := int2hwFloat(Gear^.Target.X) - Gear^.X; |
7284 distX := int2hwFloat(Gear^.Target.X) - Gear^.X; |
7278 distY := int2hwFloat(Gear^.Target.Y) - Gear^.Y; |
7285 distY := int2hwFloat(Gear^.Target.Y) - Gear^.Y; |
7280 distX := distX * invDistance; |
7287 distX := distX * invDistance; |
7281 distY := distY * invDistance; |
7288 distY := distY * invDistance; |
7282 |
7289 |
7283 bullet := AddGear( |
7290 bullet := AddGear( |
7284 hwRound(Gear^.X), hwRound(Gear^.Y), |
7291 hwRound(Gear^.X), hwRound(Gear^.Y), |
7285 gtDEagleShot, 0, |
7292 gtMinigunBullet, 0, |
7286 distX, distY, 0); |
7293 distX * _0_9 + rndSign(getRandomf * _0_1), |
7287 |
7294 distY * _0_9 + rndSign(getRandomf * _0_1), |
7288 bullet^.Boom := 4; |
7295 0); |
7289 bullet^.Health := 15; |
7296 |
|
7297 bullet^.Karma := 12; |
|
7298 bullet^.Pos := 1; |
|
7299 bullet^.WDTimer := GameTicks; |
7290 bullet^.PortalCounter := 1; |
7300 bullet^.PortalCounter := 1; |
7291 bullet^.Elasticity := Gear^.X; |
7301 bullet^.Elasticity := Gear^.X; |
7292 bullet^.Friction := Gear^.Y; |
7302 bullet^.Friction := Gear^.Y; |
7293 bullet^.Data := Pointer(Gear); |
7303 bullet^.Data := Pointer(Gear); |
7294 |
7304 |
7295 CreateShellForGear(Gear, Gear^.WDTimer and 1); |
7305 CreateShellForGear(Gear, Gear^.WDTimer and 1); |
|
7306 PlaySound(sndGun); |
7296 |
7307 |
7297 if Gear^.WDTimer = 0 then |
7308 if Gear^.WDTimer = 0 then |
7298 begin |
7309 begin |
7299 Gear^.Target.X := 0; |
7310 Gear^.Target.X := 0; |
7300 Gear^.Target.Y := 0; |
7311 Gear^.Target.Y := 0; |
|
7312 ClearGlobalHitOrderLeq(Gear^.Karma); |
|
7313 Gear^.Karma := 0; |
7301 Gear^.Tag := sentry_Reloading; |
7314 Gear^.Tag := sentry_Reloading; |
7302 Gear^.Timer := 6000 + GetRandom(2000); |
7315 Gear^.Timer := 6000 + GetRandom(2000); |
7303 end |
7316 end |
7304 else |
7317 else |
7305 begin |
7318 begin |
7306 dec(Gear^.WDTimer); |
7319 dec(Gear^.WDTimer); |
7307 Gear^.Timer := 200; |
7320 Gear^.Timer := 100; |
7308 end |
7321 end |
7309 end; |
7322 end; |
7310 end; |
7323 end; |
7311 |
7324 |
7312 if (Gear^.Tag = sentry_Walking) and ((GameTicks and $1F) = 0) then |
7325 if (Gear^.Tag = sentry_Walking) and ((GameTicks and $1F) = 0) then |
7330 and (hwAbs(distY) < hwAbs(distX)) |
7343 and (hwAbs(distY) < hwAbs(distX)) |
7331 and (TraceAttackPath(Gear^.X, Gear^.Y, HHGear^.X, HHGear^.Y, _4, lfLandMask) <= 18 ) then |
7344 and (TraceAttackPath(Gear^.X, Gear^.Y, HHGear^.X, HHGear^.Y, _4, lfLandMask) <= 18 ) then |
7332 begin |
7345 begin |
7333 Gear^.Target.X := hwRound(HHGear^.X); |
7346 Gear^.Target.X := hwRound(HHGear^.X); |
7334 Gear^.Target.Y := hwRound(HHGear^.Y); |
7347 Gear^.Target.Y := hwRound(HHGear^.Y); |
|
7348 Gear^.Karma := GameTicks; |
7335 Gear^.Tag := sentry_Aiming; |
7349 Gear^.Tag := sentry_Aiming; |
7336 Gear^.Timer := 1800 + GetRandom(400); |
7350 Gear^.Timer := 1800 + GetRandom(400); |
7337 end |
7351 end |
7338 end |
7352 end |
7339 end; |
7353 end; |