diff -r d8a526934b9f -r 82d93eeecebe hedgewars/uAIMisc.pas --- a/hedgewars/uAIMisc.pas Tue Jun 20 21:22:15 2006 +0000 +++ b/hedgewars/uAIMisc.pas Fri Jun 23 20:02:41 2006 +0000 @@ -12,8 +12,8 @@ end; procedure FillTargets; -procedure FillBonuses; -function CheckBonuses(Gear: PGear): integer; +procedure FillBonuses(isAfterAttack: boolean); +function RatePlace(Gear: PGear): integer; function DxDy2AttackAngle(const _dY, _dX: Extended): integer; function TestColl(x, y, r: integer): boolean; function RateExplosion(Me: PGear; x, y, r: integer): integer; @@ -29,7 +29,7 @@ type TBonus = record X, Y: integer; - Radius: Longword; + Radius: integer; Score: integer; end; var bonuses: record @@ -62,8 +62,9 @@ end end; -procedure FillBonuses; +procedure FillBonuses(isAfterAttack: boolean); var Gear: PGear; + MyColor: Longword; procedure AddBonus(x, y: integer; r: Longword; s: integer); begin @@ -77,27 +78,36 @@ begin bonuses.Count:= 0; +MyColor:= PHedgehog(ThinkingHH.Hedgehog).Team.Color; Gear:= GearsList; while Gear <> nil do begin case Gear.Kind of - gtCase: AddBonus(round(Gear.X), round(Gear.Y), 32, 25); - gtMine: AddBonus(round(Gear.X), round(Gear.Y), 45, -50); - gtAmmo_Bomb: AddBonus(round(Gear.X), round(Gear.Y), 50, -100); - gtHedgehog: if Gear.Damage >= Gear.Health then AddBonus(round(Gear.X), round(Gear.Y), 50, -25); + gtCase: AddBonus(round(Gear.X), round(Gear.Y), 33, 25); + gtMine: AddBonus(round(Gear.X), round(Gear.Y), 46, -50); + gtDynamite: AddBonus(round(Gear.X), round(Gear.Y), 150, -75); + gtHedgehog: begin + if Gear.Damage >= Gear.Health then AddBonus(round(Gear.X), round(Gear.Y), 50, -25); + if isAfterAttack + and (ThinkingHH.Hedgehog <> Gear.Hedgehog) + and (MyColor = PHedgehog(Gear.Hedgehog).Team.Color) then AddBonus(round(Gear.X), round(Gear.Y), 100, -1); + end; end; Gear:= Gear.NextGear end end; -function CheckBonuses(Gear: PGear): integer; -var i: integer; +function RatePlace(Gear: PGear): integer; +var i, r: integer; begin Result:= 0; for i:= 0 to Pred(bonuses.Count) do with bonuses.ar[i] do - if sqrt(sqr(Gear.X - X) + sqr(Gear.Y - y)) <= Radius then - inc(Result, Score) + begin + r:= round(sqrt(sqr(Gear.X - X) + sqr(Gear.Y - y))); + if r < Radius then + inc(Result, Score * (Radius - r)) + end; end; function DxDy2AttackAngle(const _dY, _dX: Extended): integer; @@ -151,6 +161,7 @@ else dec(Result, dmg * 3) end; end; +Result:= Result * 1024 end; function HHGo(Gear: PGear): boolean;