# HG changeset patch # User Wuzzy # Date 1591922187 -7200 # Node ID 99fe21754b3fd4a33d35a58480c0dc81bf976693 # Parent e21285b7c5e68d5cbb1d55ca14d87d469bb496f8 AI: Add dedicated test for SMine diff -r e21285b7c5e6 -r 99fe21754b3f ChangeLog.txt --- a/ChangeLog.txt Fri Jun 12 00:20:47 2020 +0200 +++ b/ChangeLog.txt Fri Jun 12 02:36:27 2020 +0200 @@ -16,6 +16,7 @@ + - use RC plane (very basic) + - drop mines from a cliff + Low level computer players are more inaccurate with guns + + Various small computer player improvements * Racer: Resize waypoints in custom-sized drawn maps * Mutant: Fix impossible to become mutant after mutant is gone * A Classic Fairytale: Mission 1: Fix possibility of getting stuck in “Leap of Faith” section diff -r e21285b7c5e6 -r 99fe21754b3f hedgewars/uAIAmmoTests.pas --- a/hedgewars/uAIAmmoTests.pas Fri Jun 12 00:20:47 2020 +0200 +++ b/hedgewars/uAIAmmoTests.pas Fri Jun 12 02:36:27 2020 +0200 @@ -56,6 +56,7 @@ function TestAirAttack(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; function TestDrillStrike(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; function TestMineStrike(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; +function TestSMine(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; function TestPiano(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; function TestTeleport(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; function TestHammer(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; @@ -122,7 +123,7 @@ (proc: @TestGrenade; flags: amtest_NoTrackFall), // amGasBomb (proc: @TestShotgun; flags: 0), // amSineGun (proc: nil; flags: 0), // amFlamethrower - (proc: @TestGrenade; flags: 0), // amSMine + (proc: @TestSMine; flags: 0), // amSMine (proc: @TestHammer; flags: amtest_NoTarget), // amHammer (proc: nil; flags: 0), // amResurrector (proc: @TestDrillStrike; flags: amtest_Rare), // amDrillStrike @@ -1646,6 +1647,79 @@ TestMineStrike:= valueResult; end; +function TestSMine(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; +const timeLimit = 50; +var Vx, Vy, r, meX, meY: real; + rTime: LongInt; + EX, EY: LongInt; + valueResult: LongInt; + targXWrap, x, y, dX, dY: real; + t: LongInt; + value: LongInt; +begin +Flags:= Flags; // avoid compiler hint +meX:= hwFloat2Float(Me^.X); +meY:= hwFloat2Float(Me^.Y); +ap.Time:= 0; +rTime:= 350; +ap.ExplR:= 0; +if (WorldEdge = weWrap) then + if (Targ.Point.X < meX) then + targXWrap:= Targ.Point.X + (RightX-LeftX) + else targXWrap:= Targ.Point.X - (RightX-LeftX); +valueResult:= BadTurn; +repeat + rTime:= rTime + 300 + Level * 50 + random(300); + if (WorldEdge = weWrap) and (random(2)=0) then + Vx:= (targXWrap + AIrndSign(2) + AIrndOffset(Targ, Level) - meX) / rTime + else + Vx:= (Targ.Point.X + AIrndSign(2) + AIrndOffset(Targ, Level) - meX) / rTime; + Vy:= cGravityf * rTime * 0.5 - (Targ.Point.Y + 1 - meY) / rTime; + r:= sqr(Vx) + sqr(Vy); + + if not (r > 1) then + begin + x:= meX; + y:= meY; + dX:= Vx; + dY:= -Vy; + t:= rTime; + repeat + x:= CheckWrap(x); + x:= x + dX; + + y:= y + dY; + dY:= dY + cGravityf; + dec(t) + until (((Me = CurrentHedgehog^.Gear) and TestColl(trunc(x), trunc(y), 2)) or + ((Me <> CurrentHedgehog^.Gear) and TestCollExcludingMe(Me^.Hedgehog^.Gear, trunc(x), trunc(y), 2))) or (t < -timeLimit); + + EX:= trunc(x); + EY:= trunc(y); + + if t >= -timeLimit then + if (Level = 1) and (Flags and amtest_NoTrackFall = 0) then + value:= RateExplosion(Me, EX, EY, 61, afTrackFall) + else + value:= RateExplosion(Me, EX, EY, 61); + + if (value = 0) and (Targ.Kind = gtHedgehog) and (Targ.Score > 0) then + value := BadTurn; + + if (valueResult < value) or ((valueResult = value) and (Level < 3)) then + begin + ap.Angle:= DxDy2AttackAnglef(Vx, Vy) + AIrndSign(random((Level - 1) * 9)); + ap.Power:= trunc(sqrt(r) * cMaxPower) - random((Level - 1) * 17 + 1); + ap.ExplR:= 60; + ap.ExplX:= EX; + ap.ExplY:= EY; + valueResult:= value + end; + end +until rTime > 5050 - Level * 800; +TestSMine:= valueResult +end; + function TestPiano(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams; Flags: LongWord): LongInt; const BOUNCES = 5; var X, Y: real;