--- a/hedgewars/uAIAmmoTests.pas Sat Jun 09 21:31:26 2012 +0400
+++ b/hedgewars/uAIAmmoTests.pas Sat Jun 09 23:35:55 2012 +0400
@@ -685,30 +685,51 @@
function TestBaseballBat(Me: PGear; Targ: TPoint; Level: LongInt; var ap: TAttackParams): LongInt;
-var valueResult: LongInt;
- x, y: real;
+var valueResult, a, v1, v2: LongInt;
+ x, y: LongInt;
+ dx, dy: real;
begin
-Level:= Level; // avoid compiler hint
-TestBaseballBat:= BadTurn;
-ap.ExplR:= 0;
-x:= hwFloat2Float(Me^.X);
-y:= hwFloat2Float(Me^.Y);
-if (Level > 2) then
- exit(BadTurn);
+ Level:= Level; // avoid compiler hint
+ ap.ExplR:= 0;
+ ap.Time:= 0;
+ ap.Power:= 1;
+ x:= hwRound(Me^.X);
+ y:= hwRound(Me^.Y);
+
+ a:= 0;
+ valueResult:= 0;
+
+ while a <= cMaxAngle div 2 do
+ begin
+ dx:= sin(a / cMaxAngle * pi) * 0.5;
+ dy:= cos(a / cMaxAngle * pi) * 0.5;
-ap.Time:= 0;
-ap.Power:= 1;
-if (Targ.X) - trunc(x) >= 0 then
- ap.Angle:= cMaxAngle div 4
-else
- ap.Angle:= - cMaxAngle div 4;
+ v1:= RateShove(Me, x - 10, y
+ , 33, 30, 115
+ , -dx, -dy, afTrackFall);
+ v2:= RateShove(Me, x + 10, y
+ , 33, 30, 115
+ , dx, -dy, afTrackFall);
+ if (v1 > valueResult) or (v2 > valueResult) then
+ if (v2 > v1)
+ or {don't encourage turning for no gain}((v2 = v1) and (not Me^.dX.isNegative)) then
+ begin
+ ap.Angle:= a;
+ valueResult:= v2
+ end
+ else
+ begin
+ ap.Angle:= -a;
+ valueResult:= v1
+ end;
-valueResult:= RateShove(Me, trunc(x) + LongWord(10*hwSignf(Targ.X - x)), trunc(y), 15, 30, 115, hwSign(Me^.dX)*0.353, -0.353, afTrackFall);
-if valueResult <= 0 then
- valueResult:= BadTurn
-else
- inc(valueResult);
-TestBaseballBat:= valueResult;
+ a:= a + 15 + random(cMaxAngle div 16)
+ end;
+
+ if valueResult <= 0 then
+ valueResult:= BadTurn;
+
+ TestBaseballBat:= valueResult;
end;
function TestFirePunch(Me: PGear; Targ: TPoint; Level: LongInt; var ap: TAttackParams): LongInt;