hedgewars/uGearsHandlersMess.pas
changeset 15656 c34cad72cd85
parent 15652 3d8c2ab2b98b
child 15657 72173f800dc4
equal deleted inserted replaced
15655:116307c752f6 15656:c34cad72cd85
  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;