hedgewars/uAIAmmoTests.pas
changeset 15689 975232e840c7
parent 15687 326b024a24e3
child 15690 c4d7eb75fd8a
equal deleted inserted replaced
15688:31ca6451056a 15689:975232e840c7
    28     amtest_NoTrackFall     = $00000008; // skip fall tracing.  
    28     amtest_NoTrackFall     = $00000008; // skip fall tracing.  
    29     amtest_LaserSight      = $00000010; // supports laser sighting
    29     amtest_LaserSight      = $00000010; // supports laser sighting
    30     amtest_NoVampiric      = $00000020; // don't use vampirism with this ammo
    30     amtest_NoVampiric      = $00000020; // don't use vampirism with this ammo
    31     amtest_NoInvulnerable  = $00000040; // don't use invulnerable with this with ammo
    31     amtest_NoInvulnerable  = $00000040; // don't use invulnerable with this with ammo
    32 
    32 
    33 var windSpeed: real;
    33 var aiWindSpeed: real;
    34     aiLaserSighting: boolean;
    34     aiLaserSighting: boolean;
    35 
    35 
    36 type TAttackParams = record
    36 type TAttackParams = record
    37         Time, Bounce, AttacksNum: Longword;
    37         Time, Bounce, AttacksNum: Longword;
    38         Angle, Power: LongInt;
    38         Angle, Power: LongInt;
   175     else targXWrap:= Targ.Point.X - (RightX-LeftX);
   175     else targXWrap:= Targ.Point.X - (RightX-LeftX);
   176 valueResult:= BadTurn;
   176 valueResult:= BadTurn;
   177 repeat
   177 repeat
   178     rTime:= rTime + 300 + Level * 50 + random(300);
   178     rTime:= rTime + 300 + Level * 50 + random(300);
   179     if (WorldEdge = weWrap) and (random(2)=0) then
   179     if (WorldEdge = weWrap) and (random(2)=0) then
   180          Vx:= - windSpeed * rTime * 0.5 + (targXWrap + AIrndSign(2) + AIrndOffset(Targ, Level) - mX) / rTime
   180          Vx:= - aiWindSpeed * rTime * 0.5 + (targXWrap + AIrndSign(2) + AIrndOffset(Targ, Level) - mX) / rTime
   181     else Vx:= - windSpeed * rTime * 0.5 + (Targ.Point.X + AIrndSign(2) + AIrndOffset(Targ, Level) - mX) / rTime;
   181     else Vx:= - aiWindSpeed * rTime * 0.5 + (Targ.Point.X + AIrndSign(2) + AIrndOffset(Targ, Level) - mX) / rTime;
   182     Vy:= cGravityf * rTime * 0.5 - (Targ.Point.Y + 1 - mY) / rTime;
   182     Vy:= cGravityf * rTime * 0.5 - (Targ.Point.Y + 1 - mY) / rTime;
   183     r:= sqr(Vx) + sqr(Vy);
   183     r:= sqr(Vx) + sqr(Vy);
   184     if not (r > 1) then
   184     if not (r > 1) then
   185         begin
   185         begin
   186         x:= mX;
   186         x:= mX;
   191         repeat
   191         repeat
   192             x:= CheckWrap(x);
   192             x:= CheckWrap(x);
   193             x:= x + dX;
   193             x:= x + dX;
   194 
   194 
   195             y:= y + dY;
   195             y:= y + dY;
   196             dX:= dX + windSpeed;
   196             dX:= dX + aiWindSpeed;
   197             //dX:= CheckBounce(x,dX);
   197             //dX:= CheckBounce(x,dX);
   198             dY:= dY + cGravityf;
   198             dY:= dY + cGravityf;
   199             dec(t)
   199             dec(t)
   200         until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 5)) or
   200         until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 5)) or
   201                ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(x), trunc(y), 5))) or (t < -cExtraTime);
   201                ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(x), trunc(y), 5))) or (t < -cExtraTime);
   365         else targXWrap:= Targ.Point.X - (RightX-LeftX);
   365         else targXWrap:= Targ.Point.X - (RightX-LeftX);
   366     timer:= 0;
   366     timer:= 0;
   367     repeat
   367     repeat
   368         rTime:= rTime + 300 + Level * 50 + random(300);
   368         rTime:= rTime + 300 + Level * 50 + random(300);
   369         if (WorldEdge = weWrap) and (random(2)=0) then
   369         if (WorldEdge = weWrap) and (random(2)=0) then
   370              Vx:= - windSpeed * rTime * 0.5 + (targXWrap + AIrndSign(2) - mX) / rTime
   370              Vx:= - aiWindSpeed * rTime * 0.5 + (targXWrap + AIrndSign(2) - mX) / rTime
   371         else Vx:= - windSpeed * rTime * 0.5 + (Targ.Point.X + AIrndSign(2) - mX) / rTime;
   371         else Vx:= - aiWindSpeed * rTime * 0.5 + (Targ.Point.X + AIrndSign(2) - mX) / rTime;
   372         Vy:= cGravityf * rTime * 0.5 - (Targ.Point.Y - 35 - mY) / rTime;
   372         Vy:= cGravityf * rTime * 0.5 - (Targ.Point.Y - 35 - mY) / rTime;
   373         r:= sqr(Vx) + sqr(Vy);
   373         r:= sqr(Vx) + sqr(Vy);
   374         if not (r > 1) then
   374         if not (r > 1) then
   375             begin
   375             begin
   376             x:= mX;
   376             x:= mX;
   380             t:= rTime;
   380             t:= rTime;
   381             repeat
   381             repeat
   382                 x:= CheckWrap(x);
   382                 x:= CheckWrap(x);
   383                 x:= x + dX;
   383                 x:= x + dX;
   384                 y:= y + dY;
   384                 y:= y + dY;
   385                 dX:= dX + windSpeed;
   385                 dX:= dX + aiWindSpeed;
   386                 dY:= dY + cGravityf;
   386                 dY:= dY + cGravityf;
   387                 dec(t)
   387                 dec(t)
   388             until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 5)) or
   388             until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 5)) or
   389                    ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(x), trunc(y), 5))) or (y > cWaterLine);
   389                    ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(x), trunc(y), 5))) or (y > cWaterLine);
   390 
   390 
   487             exit(BadTurn);
   487             exit(BadTurn);
   488 
   488 
   489         // If impact location is close, above us and wind blows in our direction,
   489         // If impact location is close, above us and wind blows in our direction,
   490         // there's a risk of fire flying towards us, so fail in this case.
   490         // there's a risk of fire flying towards us, so fail in this case.
   491         if (Level < 3) and (range <= 600) and (meY >= ry) and
   491         if (Level < 3) and (range <= 600) and (meY >= ry) and
   492             (((ap.Angle < 0) and (windSpeed > 0)) or ((ap.Angle > 0) and (windSpeed < 0))) then
   492             (((ap.Angle < 0) and (aiWindSpeed > 0)) or ((ap.Angle > 0) and (aiWindSpeed < 0))) then
   493             exit(BadTurn);
   493             exit(BadTurn);
   494 
   494 
   495         // Apply inaccuracy
   495         // Apply inaccuracy
   496         if (not aiLaserSighting) then
   496         if (not aiLaserSighting) then
   497             inc(ap.Angle, AIrndSign(random((Level - 1) * 9)));
   497             inc(ap.Angle, AIrndSign(random((Level - 1) * 9)));
   531          targXWrap:= Targ.Point.X + (RightX-LeftX)
   531          targXWrap:= Targ.Point.X + (RightX-LeftX)
   532     else targXWrap:= Targ.Point.X - (RightX-LeftX);
   532     else targXWrap:= Targ.Point.X - (RightX-LeftX);
   533 repeat
   533 repeat
   534     rTime:= rTime + 300 + Level * 50 + random(1000);
   534     rTime:= rTime + 300 + Level * 50 + random(1000);
   535     if (WorldEdge = weWrap) and (random(2)=0) then
   535     if (WorldEdge = weWrap) and (random(2)=0) then
   536          Vx:= - windSpeed * rTime * 0.5 + ((targXWrap + AIrndSign(2)) - meX) / rTime
   536          Vx:= - aiWindSpeed * rTime * 0.5 + ((targXWrap + AIrndSign(2)) - meX) / rTime
   537     else Vx:= - windSpeed * rTime * 0.5 + ((Targ.Point.X + AIrndSign(2)) - meX) / rTime;
   537     else Vx:= - aiWindSpeed * rTime * 0.5 + ((Targ.Point.X + AIrndSign(2)) - meX) / rTime;
   538     Vy:= cGravityf * rTime * 0.5 - (Targ.Point.Y - meY) / rTime;
   538     Vy:= cGravityf * rTime * 0.5 - (Targ.Point.Y - meY) / rTime;
   539     r:= sqr(Vx) + sqr(Vy);
   539     r:= sqr(Vx) + sqr(Vy);
   540     if not (r > 1) then
   540     if not (r > 1) then
   541         begin
   541         begin
   542         x:= meX;
   542         x:= meX;
   546         t:= rTime;
   546         t:= rTime;
   547         repeat
   547         repeat
   548             x:= CheckWrap(x);
   548             x:= CheckWrap(x);
   549             x:= x + dX;
   549             x:= x + dX;
   550             y:= y + dY;
   550             y:= y + dY;
   551             dX:= dX + windSpeed;
   551             dX:= dX + aiWindSpeed;
   552             dY:= dY + cGravityf;
   552             dY:= dY + cGravityf;
   553             dec(t)
   553             dec(t)
   554         until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 5)) or
   554         until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 5)) or
   555                ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(x), trunc(y), 5))) or (t <= 0);
   555                ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(x), trunc(y), 5))) or (t <= 0);
   556         EX:= trunc(x);
   556         EX:= trunc(x);
   602     if (WorldEdge = weWrap) and (random(2)=0) then
   602     if (WorldEdge = weWrap) and (random(2)=0) then
   603          Vx:= (targXWrap + AIrndSign(2) + AIrndOffset(Targ, Level) - meX) / rTime
   603          Vx:= (targXWrap + AIrndSign(2) + AIrndOffset(Targ, Level) - meX) / rTime
   604     else
   604     else
   605          Vx:= (Targ.Point.X + AIrndSign(2) + AIrndOffset(Targ, Level) - meX) / rTime;
   605          Vx:= (Targ.Point.X + AIrndSign(2) + AIrndOffset(Targ, Level) - meX) / rTime;
   606     if (GameFlags and gfMoreWind) <> 0 then
   606     if (GameFlags and gfMoreWind) <> 0 then
   607          Vx:= -(windSpeed / Density) * rTime * 0.5 + Vx;
   607          Vx:= -(aiWindSpeed / Density) * rTime * 0.5 + Vx;
   608     Vy:= cGravityf * rTime * 0.5 - (Targ.Point.Y + 1 - meY) / rTime;
   608     Vy:= cGravityf * rTime * 0.5 - (Targ.Point.Y + 1 - meY) / rTime;
   609     r:= sqr(Vx) + sqr(Vy);
   609     r:= sqr(Vx) + sqr(Vy);
   610 
   610 
   611     if not (r > 1) then
   611     if not (r > 1) then
   612         begin
   612         begin
   617         t:= rTime;
   617         t:= rTime;
   618         repeat
   618         repeat
   619             x:= CheckWrap(x);
   619             x:= CheckWrap(x);
   620             x:= x + dX;
   620             x:= x + dX;
   621             if (GameFlags and gfMoreWind) <> 0 then
   621             if (GameFlags and gfMoreWind) <> 0 then
   622                 dX:= dX + windSpeed / Density;
   622                 dX:= dX + aiWindSpeed / Density;
   623 
   623 
   624             y:= y + dY;
   624             y:= y + dY;
   625             dY:= dY + cGravityf;
   625             dY:= dY + cGravityf;
   626             dec(t)
   626             dec(t)
   627         until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 5)) or
   627         until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 5)) or
   636             exit(BadTurn);
   636             exit(BadTurn);
   637 
   637 
   638         // Sanity check 2: If impact location is close, above us and wind blows
   638         // Sanity check 2: If impact location is close, above us and wind blows
   639         // towards us, there's a risk of fire flying towards us, so fail in this case.
   639         // towards us, there's a risk of fire flying towards us, so fail in this case.
   640         if (Level < 3) and (range <= 600) and (trunc(meY) >= EX) and
   640         if (Level < 3) and (range <= 600) and (trunc(meY) >= EX) and
   641             (((ap.Angle < 0) and (windSpeed > 0)) or ((ap.Angle > 0) and (windSpeed < 0))) then
   641             (((ap.Angle < 0) and (aiWindSpeed > 0)) or ((ap.Angle > 0) and (aiWindSpeed < 0))) then
   642             exit(BadTurn);
   642             exit(BadTurn);
   643 
   643 
   644         if t >= -timeLimit then
   644         if t >= -timeLimit then
   645             value:= RateExplosion(Me, EX, EY, 97) // average of 17 attempts, most good, but some failing spectacularly
   645             value:= RateExplosion(Me, EX, EY, 97) // average of 17 attempts, most good, but some failing spectacularly
   646         else
   646         else
   687     if (WorldEdge = weWrap) and (random(2)=0) then
   687     if (WorldEdge = weWrap) and (random(2)=0) then
   688          Vx:= (targXWrap + AIrndOffset(Targ, Level) - meX) / (TestTime + tDelta)
   688          Vx:= (targXWrap + AIrndOffset(Targ, Level) - meX) / (TestTime + tDelta)
   689     else
   689     else
   690          Vx:= (Targ.Point.X + AIrndOffset(Targ, Level) - meX) / (TestTime + tDelta);
   690          Vx:= (Targ.Point.X + AIrndOffset(Targ, Level) - meX) / (TestTime + tDelta);
   691     if (GameFlags and gfMoreWind) <> 0 then
   691     if (GameFlags and gfMoreWind) <> 0 then
   692          Vx:= -(windSpeed / Density) * (TestTime + tDelta) * 0.5 + Vx;
   692          Vx:= -(aiWindSpeed / Density) * (TestTime + tDelta) * 0.5 + Vx;
   693     Vy:= cGravityf * ((TestTime + tDelta) div 2) - (Targ.Point.Y - meY) / (TestTime + tDelta);
   693     Vy:= cGravityf * ((TestTime + tDelta) div 2) - (Targ.Point.Y - meY) / (TestTime + tDelta);
   694     r:= sqr(Vx) + sqr(Vy);
   694     r:= sqr(Vx) + sqr(Vy);
   695     if not (r > 1) then
   695     if not (r > 1) then
   696         begin
   696         begin
   697         x:= meX;
   697         x:= meX;
   701         t:= TestTime;
   701         t:= TestTime;
   702         repeat
   702         repeat
   703             x:= CheckWrap(x);
   703             x:= CheckWrap(x);
   704             x:= x + dX;
   704             x:= x + dX;
   705             if (GameFlags and gfMoreWind) <> 0 then
   705             if (GameFlags and gfMoreWind) <> 0 then
   706                 dX:= dX + windSpeed / Density;
   706                 dX:= dX + aiWindSpeed / Density;
   707             y:= y + dY;
   707             y:= y + dY;
   708             dY:= dY + cGravityf;
   708             dY:= dY + cGravityf;
   709             dec(t)
   709             dec(t)
   710         until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 5)) or
   710         until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 5)) or
   711                ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(x), trunc(y), 5))) or (t = 0);
   711                ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(x), trunc(y), 5))) or (t = 0);
   751 meX:= hwFloat2Float(Me^.X);
   751 meX:= hwFloat2Float(Me^.X);
   752 meY:= hwFloat2Float(Me^.Y);
   752 meY:= hwFloat2Float(Me^.Y);
   753 repeat
   753 repeat
   754     inc(TestTime, 900);
   754     inc(TestTime, 900);
   755     if (GameFlags and gfMoreWind) <> 0 then
   755     if (GameFlags and gfMoreWind) <> 0 then
   756         Vx:= (-(windSpeed / Density) * (TestTime + tDelta) * 0.5) + ((Targ.Point.X - meX) / (TestTime + tDelta))
   756         Vx:= (-(aiWindSpeed / Density) * (TestTime + tDelta) * 0.5) + ((Targ.Point.X - meX) / (TestTime + tDelta))
   757     // Try to overshoot slightly, seems to pay slightly better dividends in terms of hitting cluster
   757     // Try to overshoot slightly, seems to pay slightly better dividends in terms of hitting cluster
   758     else if meX<Targ.Point.X then
   758     else if meX<Targ.Point.X then
   759         Vx:= ((Targ.Point.X+10) - meX) / (TestTime + tDelta)
   759         Vx:= ((Targ.Point.X+10) - meX) / (TestTime + tDelta)
   760     else
   760     else
   761         Vx:= ((Targ.Point.X-10) - meX) / (TestTime + tDelta);
   761         Vx:= ((Targ.Point.X-10) - meX) / (TestTime + tDelta);
   769         dY:= -Vy;
   769         dY:= -Vy;
   770         t:= TestTime;
   770         t:= TestTime;
   771     repeat
   771     repeat
   772         x:= x + dX;
   772         x:= x + dX;
   773         if (GameFlags and gfMoreWind) <> 0 then
   773         if (GameFlags and gfMoreWind) <> 0 then
   774             dX:= dX + windSpeed / Density;
   774             dX:= dX + aiWindSpeed / Density;
   775         y:= y + dY;
   775         y:= y + dY;
   776         dY:= dY + cGravityf;
   776         dY:= dY + cGravityf;
   777         dec(t)
   777         dec(t)
   778     until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 5)) or
   778     until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 5)) or
   779            ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(x), trunc(y), 5))) or (t = 0);
   779            ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(x), trunc(y), 5))) or (t = 0);
   823     if (WorldEdge = weWrap) and (random(2)=0) then
   823     if (WorldEdge = weWrap) and (random(2)=0) then
   824         Vx:= (targXWrap - meX) / (TestTime + tDelta)
   824         Vx:= (targXWrap - meX) / (TestTime + tDelta)
   825     else
   825     else
   826         Vx:= (Targ.Point.X - meX) / (TestTime + tDelta);
   826         Vx:= (Targ.Point.X - meX) / (TestTime + tDelta);
   827     if (GameFlags and gfMoreWind) <> 0 then
   827     if (GameFlags and gfMoreWind) <> 0 then
   828         Vx:= -(windSpeed / Density) * (TestTime + tDelta) * 0.5 + Vx;
   828         Vx:= -(aiWindSpeed / Density) * (TestTime + tDelta) * 0.5 + Vx;
   829 
   829 
   830     Vy:= cGravityf * ((TestTime + tDelta) div 2) - ((Targ.Point.Y-50) - meY) / (TestTime + tDelta);
   830     Vy:= cGravityf * ((TestTime + tDelta) div 2) - ((Targ.Point.Y-50) - meY) / (TestTime + tDelta);
   831     r:= sqr(Vx)+sqr(Vy);
   831     r:= sqr(Vx)+sqr(Vy);
   832     if not (r > 1) then
   832     if not (r > 1) then
   833         begin
   833         begin
   838         t:= TestTime;
   838         t:= TestTime;
   839         repeat
   839         repeat
   840             x:= CheckWrap(x);
   840             x:= CheckWrap(x);
   841             x:= x + dX;
   841             x:= x + dX;
   842             if (GameFlags and gfMoreWind) <> 0 then
   842             if (GameFlags and gfMoreWind) <> 0 then
   843                  dX:= dX + windSpeed / Density;
   843                  dX:= dX + aiWindSpeed / Density;
   844             y:= y + dY;
   844             y:= y + dY;
   845             dY:= dY + cGravityf;
   845             dY:= dY + cGravityf;
   846             dec(t)
   846             dec(t)
   847        until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 6)) or
   847        until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 6)) or
   848                ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(x), trunc(y), 6))) or (t = 0);
   848                ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(x), trunc(y), 6))) or (t = 0);
   913     if TestTime = 0 then
   913     if TestTime = 0 then
   914         exit(BadTurn);
   914         exit(BadTurn);
   915 
   915 
   916     Vx:= (Targ.Point.X - meX) / TestTime;
   916     Vx:= (Targ.Point.X - meX) / TestTime;
   917     if (GameFlags and gfMoreWind) <> 0 then
   917     if (GameFlags and gfMoreWind) <> 0 then
   918         Vx:= -(windSpeed / Density) * TestTime * 0.5 + Vx;
   918         Vx:= -(aiWindSpeed / Density) * TestTime * 0.5 + Vx;
   919     Vy:= cGravityf * (TestTime div 2) - (Targ.Point.Y - meY) / TestTime;
   919     Vy:= cGravityf * (TestTime div 2) - (Targ.Point.Y - meY) / TestTime;
   920 
   920 
   921     x:= meX;
   921     x:= meX;
   922     dX:= Vx;
   922     dX:= Vx;
   923     y:= meY;
   923     y:= meY;
   924     dY:= -Vy;
   924     dY:= -Vy;
   925 
   925 
   926     repeat
   926     repeat
   927         x:= x + dX;
   927         x:= x + dX;
   928         if (GameFlags and gfMoreWind) <> 0 then
   928         if (GameFlags and gfMoreWind) <> 0 then
   929             dX:= dX + windSpeed / Density;
   929             dX:= dX + aiWindSpeed / Density;
   930         y:= y + dY;
   930         y:= y + dY;
   931         dY:= dY + cGravityf;
   931         dY:= dY + cGravityf;
   932         EX:= trunc(x);
   932         EX:= trunc(x);
   933         EY:= trunc(y);
   933         EY:= trunc(y);
   934     until (((Me = CurrentHedgehog^.Gear) and TestColl(EX, EY, 4)) or
   934     until (((Me = CurrentHedgehog^.Gear) and TestColl(EX, EY, 4)) or
  1432 firstHit:= false;
  1432 firstHit:= false;
  1433 
  1433 
  1434 repeat
  1434 repeat
  1435     X:= X + dX;
  1435     X:= X + dX;
  1436     if (GameFlags and gfMoreWind) <> 0 then
  1436     if (GameFlags and gfMoreWind) <> 0 then
  1437         dX:= dX + windSpeed / Density;
  1437         dX:= dX + aiWindSpeed / Density;
  1438     Y:= Y + dY;
  1438     Y:= Y + dY;
  1439     dY:= dY + cGravityf;
  1439     dY:= dY + cGravityf;
  1440     fexit:= true;
  1440     fexit:= true;
  1441 
  1441 
  1442     for i:= 0 to 9 do
  1442     for i:= 0 to 9 do
  1573         repeat
  1573         repeat
  1574             // Simulate in-air movement
  1574             // Simulate in-air movement
  1575             drillX:= drillX + dX;
  1575             drillX:= drillX + dX;
  1576             drillY:= drillY + dY;
  1576             drillY:= drillY + dY;
  1577             if (GameFlags and gfMoreWind) <> 0 then
  1577             if (GameFlags and gfMoreWind) <> 0 then
  1578                 dX:= dX + windSpeed / Density;
  1578                 dX:= dX + aiWindSpeed / Density;
  1579             dY:= dY + cGravityf;
  1579             dY:= dY + cGravityf;
  1580 
  1580 
  1581             if timerRuns then
  1581             if timerRuns then
  1582                 dec(drillTimer);
  1582                 dec(drillTimer);
  1583 
  1583 
  1722 firstHit:= false;
  1722 firstHit:= false;
  1723 
  1723 
  1724 repeat
  1724 repeat
  1725     X:= X + dX;
  1725     X:= X + dX;
  1726     if (GameFlags and (gfMoreWind or gfInfAttack)) <> 0 then
  1726     if (GameFlags and (gfMoreWind or gfInfAttack)) <> 0 then
  1727         dX:= dX + windSpeed / Density;
  1727         dX:= dX + aiWindSpeed / Density;
  1728     Y:= Y + dY;
  1728     Y:= Y + dY;
  1729     dY:= dY + cGravityf;
  1729     dY:= dY + cGravityf;
  1730     fexit:= true;
  1730     fexit:= true;
  1731 
  1731 
  1732     for i:= 0 to 9 do
  1732     for i:= 0 to 9 do
  1802     if (WorldEdge = weWrap) and (random(2)=0) then
  1802     if (WorldEdge = weWrap) and (random(2)=0) then
  1803          Vx:= (targXWrap + AIrndSign(2) + AIrndOffset(Targ, Level) - meX) / rTime
  1803          Vx:= (targXWrap + AIrndSign(2) + AIrndOffset(Targ, Level) - meX) / rTime
  1804     else
  1804     else
  1805          Vx:= (Targ.Point.X + AIrndSign(2) + AIrndOffset(Targ, Level) - meX) / rTime;
  1805          Vx:= (Targ.Point.X + AIrndSign(2) + AIrndOffset(Targ, Level) - meX) / rTime;
  1806     if (GameFlags and gfMoreWind) <> 0 then
  1806     if (GameFlags and gfMoreWind) <> 0 then
  1807          Vx:= -(windSpeed / Density) * rTime * 0.5 + Vx;
  1807          Vx:= -(aiWindSpeed / Density) * rTime * 0.5 + Vx;
  1808     Vy:= cGravityf * rTime * 0.5 - (Targ.Point.Y + 1 - meY) / rTime;
  1808     Vy:= cGravityf * rTime * 0.5 - (Targ.Point.Y + 1 - meY) / rTime;
  1809     r:= sqr(Vx) + sqr(Vy);
  1809     r:= sqr(Vx) + sqr(Vy);
  1810 
  1810 
  1811     if not (r > 1) then
  1811     if not (r > 1) then
  1812         begin
  1812         begin
  1817         t:= rTime;
  1817         t:= rTime;
  1818         repeat
  1818         repeat
  1819             x:= CheckWrap(x);
  1819             x:= CheckWrap(x);
  1820             x:= x + dX;
  1820             x:= x + dX;
  1821             if (GameFlags and gfMoreWind) <> 0 then
  1821             if (GameFlags and gfMoreWind) <> 0 then
  1822                 dX:= dX + windSpeed / Density;
  1822                 dX:= dX + aiWindSpeed / Density;
  1823 
  1823 
  1824             y:= y + dY;
  1824             y:= y + dY;
  1825             dY:= dY + cGravityf;
  1825             dY:= dY + cGravityf;
  1826             dec(t)
  1826             dec(t)
  1827         until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 2)) or
  1827         until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 2)) or
  2088 
  2088 
  2089 x:= hwFloat2Float(Me^.X) + hwSign(Me^.dX) * 7;
  2089 x:= hwFloat2Float(Me^.X) + hwSign(Me^.dX) * 7;
  2090 y:= hwFloat2Float(Me^.Y);
  2090 y:= hwFloat2Float(Me^.Y);
  2091 dx:= hwSign(Me^.dX) * 0.03;
  2091 dx:= hwSign(Me^.dX) * 0.03;
  2092 if (GameFlags and gfMoreWind) <> 0 then
  2092 if (GameFlags and gfMoreWind) <> 0 then
  2093     dx:= -(windSpeed / Density) + dx;
  2093     dx:= -(aiWindSpeed / Density) + dx;
  2094 dy:= 0;
  2094 dy:= 0;
  2095 t:= 5000;
  2095 t:= 5000;
  2096 repeat
  2096 repeat
  2097     dec(t);
  2097     dec(t);
  2098     if (GameFlags and gfMoreWind) <> 0 then
  2098     if (GameFlags and gfMoreWind) <> 0 then
  2099         dx:= dx + windSpeed / Density;
  2099         dx:= dx + aiWindSpeed / Density;
  2100     x:= x + dx;
  2100     x:= x + dx;
  2101     dy:= dy + cGravityf;
  2101     dy:= dy + cGravityf;
  2102     y:= y + dy;
  2102     y:= y + dy;
  2103 
  2103 
  2104     if TestColl(trunc(x), trunc(y), 3) then
  2104     if TestColl(trunc(x), trunc(y), 3) then
  2138 
  2138 
  2139 x:= hwFloat2Float(Me^.X) + hwSign(Me^.dX) * 7;
  2139 x:= hwFloat2Float(Me^.X) + hwSign(Me^.dX) * 7;
  2140 y:= hwFloat2Float(Me^.Y);
  2140 y:= hwFloat2Float(Me^.Y);
  2141 dx:= hwSign(Me^.dX) * 0.02;
  2141 dx:= hwSign(Me^.dX) * 0.02;
  2142 if (GameFlags and gfMoreWind) <> 0 then
  2142 if (GameFlags and gfMoreWind) <> 0 then
  2143     dx:= -(windSpeed / Density) + dx;
  2143     dx:= -(aiWindSpeed / Density) + dx;
  2144 dy:= 0;
  2144 dy:= 0;
  2145 t:= 10000;
  2145 t:= 10000;
  2146 repeat
  2146 repeat
  2147     dec(t);
  2147     dec(t);
  2148     if (GameFlags and gfMoreWind) <> 0 then
  2148     if (GameFlags and gfMoreWind) <> 0 then
  2149          dx:= dx + windSpeed / Density;
  2149          dx:= dx + aiWindSpeed / Density;
  2150     x:= x + dx;
  2150     x:= x + dx;
  2151     dy:= dy + cGravityf;
  2151     dy:= dy + cGravityf;
  2152     y:= y + dy;
  2152     y:= y + dy;
  2153     if ((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 2)) or
  2153     if ((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 2)) or
  2154         ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(x), trunc(y), 2)) then
  2154         ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(x), trunc(y), 2)) then
  2210     if (WorldEdge = weWrap) and (random(2)=0) then
  2210     if (WorldEdge = weWrap) and (random(2)=0) then
  2211          Vx:= (targXWrap - meX) / rTime
  2211          Vx:= (targXWrap - meX) / rTime
  2212     else
  2212     else
  2213          Vx:= (Targ.Point.X - meX) / rTime;
  2213          Vx:= (Targ.Point.X - meX) / rTime;
  2214     if (GameFlags and gfMoreWind) <> 0 then
  2214     if (GameFlags and gfMoreWind) <> 0 then
  2215          Vx:= -(windSpeed / Density) * rTime * 0.5 + Vx;
  2215          Vx:= -(aiWindSpeed / Density) * rTime * 0.5 + Vx;
  2216     Vy:= cGravityf * rTime * 0.5 - (Targ.Point.Y + 1 - meY) / rTime;
  2216     Vy:= cGravityf * rTime * 0.5 - (Targ.Point.Y + 1 - meY) / rTime;
  2217     r:= sqr(Vx) + sqr(Vy);
  2217     r:= sqr(Vx) + sqr(Vy);
  2218 
  2218 
  2219     if not (r > 1) then
  2219     if not (r > 1) then
  2220         begin
  2220         begin
  2225         t:= rTime;
  2225         t:= rTime;
  2226         repeat
  2226         repeat
  2227             x:= CheckWrap(x);
  2227             x:= CheckWrap(x);
  2228             x:= x + dX;
  2228             x:= x + dX;
  2229             if (GameFlags and gfMoreWind) <> 0 then
  2229             if (GameFlags and gfMoreWind) <> 0 then
  2230                 dX:= dX + windSpeed / Density;
  2230                 dX:= dX + aiWindSpeed / Density;
  2231 
  2231 
  2232             y:= y + dY;
  2232             y:= y + dY;
  2233             dY:= dY + cGravityf;
  2233             dY:= dY + cGravityf;
  2234             dec(t)
  2234             dec(t)
  2235         until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 7)) or
  2235         until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 7)) or