hedgewars/uAIAmmoTests.pas
changeset 15701 f8688e1bcc13
parent 15691 c6675acd3c82
child 15702 0436ea41ece5
equal deleted inserted replaced
15700:a3d2f69f3ac1 15701:f8688e1bcc13
   134             (proc: nil;              flags: 0), // amFlamethrower
   134             (proc: nil;              flags: 0), // amFlamethrower
   135             (proc: @TestSMine;       flags: 0), // amSMine
   135             (proc: @TestSMine;       flags: 0), // amSMine
   136             (proc: @TestHammer;      flags: amtest_NoTarget or amtest_NoInvulnerable), // amHammer
   136             (proc: @TestHammer;      flags: amtest_NoTarget or amtest_NoInvulnerable), // amHammer
   137             (proc: @TestResurrector; flags: amtest_NoTarget or amtest_NoInvulnerable or amtest_NoVampiric or amtest_NoLowGravity), // amResurrector
   137             (proc: @TestResurrector; flags: amtest_NoTarget or amtest_NoInvulnerable or amtest_NoVampiric or amtest_NoLowGravity), // amResurrector
   138             (proc: @TestDrillStrike; flags: amtest_Rare), // amDrillStrike
   138             (proc: @TestDrillStrike; flags: amtest_Rare), // amDrillStrike
   139             (proc: nil;              flags: 0), // amSnowball
   139             (proc: @TestSnowball;    flags: amtest_NoInvulnerable or amtest_NoVampiric), // amSnowball
   140             (proc: nil;              flags: 0), // amTardis
   140             (proc: nil;              flags: 0), // amTardis
   141             (proc: nil;              flags: 0), // amLandGun
   141             (proc: nil;              flags: 0), // amLandGun
   142             (proc: nil;              flags: 0), // amIceGun
   142             (proc: nil;              flags: 0), // amIceGun
   143             (proc: @TestKnife;       flags: 0), // amKnife
   143             (proc: @TestKnife;       flags: 0), // amKnife
   144             (proc: nil;              flags: 0), // amRubber
   144             (proc: nil;              flags: 0), // amRubber
   511 
   511 
   512 TestRCPlane:= BadTurn
   512 TestRCPlane:= BadTurn
   513 end;
   513 end;
   514 
   514 
   515 function TestSnowball(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
   515 function TestSnowball(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
       
   516 const timeLimit = 5000;
       
   517       Density : real = 0.5;
   516 var Vx, Vy, r: real;
   518 var Vx, Vy, r: real;
   517     rTime: LongInt;
   519     rTime: LongInt;
   518     EX, EY: LongInt;
   520     EX, EY: LongInt;
   519     valueResult: LongInt;
   521     valueResult: LongInt;
   520     targXWrap, x, y, dX, dY, meX, meY: real;
   522     targXWrap, x, y, dX, dY, meX, meY: real;
   530 ap.ExplR:= 0;
   532 ap.ExplR:= 0;
   531 valueResult:= BadTurn;
   533 valueResult:= BadTurn;
   532 if (WorldEdge = weWrap) then
   534 if (WorldEdge = weWrap) then
   533     if (Targ.Point.X < meX) then
   535     if (Targ.Point.X < meX) then
   534          targXWrap:= Targ.Point.X + (RightX-LeftX)
   536          targXWrap:= Targ.Point.X + (RightX-LeftX)
   535     else targXWrap:= Targ.Point.X - (RightX-LeftX);
   537     else
       
   538          targXWrap:= Targ.Point.X - (RightX-LeftX);
   536 repeat
   539 repeat
   537     rTime:= rTime + 300 + Level * 50 + random(1000);
   540     rTime:= rTime + 300 + Level * 50 + random(300);
   538     if (WorldEdge = weWrap) and (random(2)=0) then
   541     if (WorldEdge = weWrap) and (random(2)=0) then
   539          Vx:= - aiWindSpeed * rTime * 0.5 + ((targXWrap + AIrndSign(2)) - meX) / rTime
   542          Vx:= (targXWrap - meX) / rTime
   540     else Vx:= - aiWindSpeed * rTime * 0.5 + ((Targ.Point.X + AIrndSign(2)) - meX) / rTime;
   543     else
       
   544          Vx:= (Targ.Point.X - meX) / rTime;
       
   545     if (GameFlags and gfMoreWind) <> 0 then
       
   546          Vx:= -(aiWindSpeed / Density) * rTime * 0.5 + Vx
       
   547     else
       
   548          Vx:= -aiWindSpeed * rTime * 0.5 + Vx;
   541     Vy:= aiGravityf * rTime * 0.5 - (Targ.Point.Y - meY) / rTime;
   549     Vy:= aiGravityf * rTime * 0.5 - (Targ.Point.Y - meY) / rTime;
   542     r:= sqr(Vx) + sqr(Vy);
   550     r:= sqr(Vx) + sqr(Vy);
       
   551 
   543     if not (r > 1) then
   552     if not (r > 1) then
   544         begin
   553         begin
   545         x:= meX;
   554         x:= meX;
   546         y:= meY;
   555         y:= meY;
   547         dX:= Vx;
   556         dX:= Vx;
   548         dY:= -Vy;
   557         dY:= -Vy;
   549         t:= rTime;
   558         t:= rTime;
   550         repeat
   559         repeat
   551             x:= CheckWrap(x);
   560             x:= CheckWrap(x);
   552             x:= x + dX;
   561             x:= x + dX;
       
   562             if (GameFlags and gfMoreWind) <> 0 then
       
   563                 dX:= dX + aiWindSpeed / Density
       
   564             else
       
   565                 dX:= dX + aiWindSpeed;
       
   566 
   553             y:= y + dY;
   567             y:= y + dY;
   554             dX:= dX + aiWindSpeed;
       
   555             dY:= dY + aiGravityf;
   568             dY:= dY + aiGravityf;
   556             dec(t)
   569             dec(t)
   557         until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 5)) or
   570         until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 4)) or
   558                ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(x), trunc(y), 5))) or (t <= 0);
   571                ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(x), trunc(y), 4))) or (trunc(y) > cWaterLine) or (t < -timeLimit);
       
   572 
   559         EX:= trunc(x);
   573         EX:= trunc(x);
   560         EY:= trunc(y);
   574         EY:= trunc(y);
   561 
   575 
   562         value:= RateShove(Me, trunc(x), trunc(y), 5, 1, trunc((abs(dX)+abs(dY))*20), -dX, -dY, afTrackFall);
   576         // Sanity check: Make sure we're not too close to impact location
   563         // LOL copypasta: this is score for digging with... snowball
   577         if (Metric(trunc(meX), trunc(meY), EX, EY) <= 40) then
   564         //if value = 0 then
   578             value:= BadTurn
   565         //    value:= - Metric(Targ.Point.X, Targ.Point.Y, EX, EY) div 64;
   579         // Rate attack
   566 
   580         else if (t >= -timeLimit) and (EY <= cWaterLine) then
   567         if valueResult <= value then
   581             // radius intentionally set to 16 for shove because lower values don't work reliably
       
   582             value:= RateShove(Me, EX, EY, 16, 0, trunc((abs(dX)+abs(dY))*20), dX, dY, afTrackFall)
       
   583         else
       
   584             value:= BadTurn;
       
   585 
       
   586         if (value = 0) and (Targ.Kind = gtHedgehog) and (Targ.Score > 0) then
       
   587             value := BadTurn;
       
   588 
       
   589         if (valueResult < value) or ((valueResult = value) and (Level = 1)) then
   568             begin
   590             begin
   569             ap.Angle:= DxDy2AttackAnglef(Vx, Vy) + AIrndSign(random((Level - 1) * 9));
   591             ap.Angle:= DxDy2AttackAnglef(Vx, Vy) + AIrndSign(random((Level - 1) * 12));
   570             ap.Power:= trunc(sqrt(r) * cMaxPower) - random((Level - 1) * 17 + 1);
   592             ap.Power:= trunc(sqrt(r) * cMaxPower) - random((Level - 1) * 22 + 1);
   571             ap.ExplR:= 0;
       
   572             ap.ExplX:= EX;
   593             ap.ExplX:= EX;
   573             ap.ExplY:= EY;
   594             ap.ExplY:= EY;
   574             valueResult:= value
   595             valueResult:= value
   575             end;
   596             end;
   576      end
   597         end
   577 until (rTime > 5050 - Level * 800);
   598 until rTime > 5050 - Level * 800;
   578 TestSnowball:= valueResult
   599 TestSnowball:= valueResult
   579 end;
   600 end;
   580 
   601 
   581 function TestMolotov(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
   602 function TestMolotov(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt;
   582 const timeLimit = 50;
   603 const timeLimit = 50;