diff -r 9e6e8e5a4c2e -r 5a9775b97c7e hedgewars/uAIAmmoTests.pas --- a/hedgewars/uAIAmmoTests.pas Fri Jun 08 14:30:46 2012 +0400 +++ b/hedgewars/uAIAmmoTests.pas Fri Jun 08 18:03:44 2012 +0400 @@ -43,6 +43,7 @@ function TestMortar(Me: PGear; Targ: TPoint; Level: LongInt; var ap: TAttackParams): LongInt; function TestShotgun(Me: PGear; Targ: TPoint; Level: LongInt; var ap: TAttackParams): LongInt; function TestDesertEagle(Me: PGear; Targ: TPoint; Level: LongInt; var ap: TAttackParams): LongInt; +function TestSniperRifle(Me: PGear; Targ: TPoint; Level: LongInt; var ap: TAttackParams): LongInt; function TestBaseballBat(Me: PGear; Targ: TPoint; Level: LongInt; var ap: TAttackParams): LongInt; function TestFirePunch(Me: PGear; Targ: TPoint; Level: LongInt; var ap: TAttackParams): LongInt; function TestWhip(Me: PGear; Targ: TPoint; Level: LongInt; var ap: TAttackParams): LongInt; @@ -97,7 +98,7 @@ (proc: nil; flags: 0), // amExtraTime (proc: nil; flags: 0), // amLaserSight (proc: nil; flags: 0), // amVampiric - (proc: nil; flags: 0), // amSniperRifle + (proc: @TestSniperRifle; flags: 0), // amSniperRifle (proc: nil; flags: 0), // amJetpack (proc: @TestMolotov; flags: 0), // amMolotov (proc: nil; flags: 0), // amBirdy @@ -602,7 +603,56 @@ TestDesertEagle:= BadTurn; exit(BadTurn); end; -t:= 0.5 / sqrt(sqr(Targ.X - x)+sqr(Targ.Y-y)); +t:= 2 / sqrt(sqr(Targ.X - x)+sqr(Targ.Y-y)); +Vx:= (Targ.X - x) * t; +Vy:= (Targ.Y - y) * t; +ap.Angle:= DxDy2AttackAnglef(Vx, -Vy); +d:= 0; + +repeat + x:= x + vX; + y:= y + vY; + if ((trunc(x) and LAND_WIDTH_MASK) = 0)and((trunc(y) and LAND_HEIGHT_MASK) = 0) + and (Land[trunc(y), trunc(x)] <> 0) then + inc(d); +until (Abs(Targ.X - trunc(x)) + Abs(Targ.Y - trunc(y)) < 5) + or (x < 0) + or (y < 0) + or (trunc(x) > LAND_WIDTH) + or (trunc(y) > LAND_HEIGHT) + or (d > 50); + +if Abs(Targ.X - trunc(x)) + Abs(Targ.Y - trunc(y)) < 5 then + begin + fallDmg:= TraceShoveFall(Me, Targ.X, Targ.Y, vX * 0.00125 * 20, vY * 0.00125 * 20); + if fallDmg < 0 then + valueResult:= 204800 + else valueResult:= Max(0, (4 - d div 50) * trunc((7+fallDmg)*dmgMod) * 1024) + end +else + valueResult:= BadTurn; +TestDesertEagle:= valueResult +end; + + +function TestSniperRifle(Me: PGear; Targ: TPoint; Level: LongInt; var ap: TAttackParams): LongInt; +var Vx, Vy, x, y, t, dmg, dmgMod: real; + d: Longword; + fallDmg, valueResult: LongInt; +begin +dmgMod:= 0.01 * hwFloat2Float(cDamageModifier) * cDamagePercent; +Level:= Level; // avoid compiler hint +ap.ExplR:= 0; +ap.Time:= 0; +ap.Power:= 1; +x:= hwFloat2Float(Me^.X); +y:= hwFloat2Float(Me^.Y); +if Abs(trunc(x) - Targ.X) + Abs(trunc(y) - Targ.Y) < 40 then + exit(BadTurn); + +dmg:= sqrt(sqr(Targ.X - x)+sqr(Targ.Y-y)); +t:= 1.5 / dmg; +dmg:= dmg * 0.33333333; Vx:= (Targ.X - x) * t; Vy:= (Targ.Y - y) * t; ap.Angle:= DxDy2AttackAnglef(Vx, -Vy); @@ -619,20 +669,21 @@ or (y < 0) or (trunc(x) > LAND_WIDTH) or (trunc(y) > LAND_HEIGHT) - or (d > 200); + or (d > 23); -if Abs(Targ.X - trunc(x)) + Abs(Targ.Y - trunc(y)) < 3 then +if Abs(Targ.X - trunc(x)) + Abs(Targ.Y - trunc(y)) < 4 then begin - fallDmg:= TraceShoveFall(Me, Targ.X, Targ.Y, vX * 0.005 * 20, vY * 0.005 * 20); + fallDmg:= TraceShoveFall(Me, Targ.X, Targ.Y, vX * 0.00166 * dmg, vY * 0.00166 * dmg); if fallDmg < 0 then - valueResult:= 204800 - else valueResult:= Max(0, (4 - d div 50) * trunc((7+fallDmg)*dmgMod) * 1024) + TestSniperRifle:= BadTurn + else + TestSniperRifle:= Max(0, trunc((dmg + fallDmg) * dmgMod) * 1024) end else - valueResult:= BadTurn; -TestDesertEagle:= valueResult + TestSniperRifle:= BadTurn end; + function TestBaseballBat(Me: PGear; Targ: TPoint; Level: LongInt; var ap: TAttackParams): LongInt; var valueResult: LongInt; x, y: real;