diff -r 56d2f2d5aad8 -r 4feced261c68 hedgewars/uAIMisc.pas --- a/hedgewars/uAIMisc.pas Sun Jan 19 00:18:28 2014 +0400 +++ b/hedgewars/uAIMisc.pas Tue Jan 21 22:38:13 2014 +0100 @@ -53,7 +53,17 @@ X, Y: LongInt; Radius: LongInt; Score: LongInt; - end; + end; + +Tbonuses = record + Count : Longword; + ar : array[0..Pred(MAXBONUS)] of TBonus; + end; + +Twalkbonuses = record + Count: Longword; + ar: array[0..Pred(MAXBONUS div 8)] of TBonus; // don't use too many + end; procedure initModule; procedure freeModule; @@ -82,22 +92,16 @@ var ThinkingHH: PGear; Targets: TTargets; - bonuses: record - Count: Longword; - ar: array[0..Pred(MAXBONUS)] of TBonus; - end; + bonuses: Tbonuses; - walkbonuses: record - Count: Longword; - ar: array[0..Pred(MAXBONUS div 8)] of TBonus; // don't use too many - end; + walkbonuses: Twalkbonuses; const KillScore = 200; var friendlyfactor: LongInt = 300; var dmgMod: real = 1.0; implementation -uses uCollisions, uVariables, uUtils, uLandTexture, uGearsUtils; +uses uCollisions, uVariables, uUtils, uGearsUtils; var KnownExplosion: record @@ -127,13 +131,13 @@ if (((Gear^.Kind = gtHedgehog) and (Gear <> ThinkingHH) and (Gear^.Health > Gear^.Damage) and - not(Gear^.Hedgehog^.Team^.hasgone)) or + (not Gear^.Hedgehog^.Team^.hasgone)) or ((Gear^.Kind = gtExplosives) and (Gear^.Health > Gear^.Damage)) or ((Gear^.Kind = gtMine) and (Gear^.Health = 0) and (Gear^.Damage < 35)) - ) and + ) and (Targets.Count < 256) then begin with Targets.ar[Targets.Count] do @@ -155,7 +159,7 @@ Score:= Gear^.Damage - Gear^.Health; inc(f) end - else + else begin Score:= Gear^.Health - Gear^.Damage; inc(e) @@ -163,7 +167,7 @@ end else if Gear^.Kind = gtExplosives then Score:= Gear^.Health - Gear^.Damage - else if Gear^.Kind = gtMine then + else if Gear^.Kind = gtMine then Score:= max(0,35-Gear^.Damage); end; inc(Targets.Count) @@ -384,20 +388,20 @@ dmg := 1 + trunc((dY - 0.4) * 70); exit(dmg) end - else + else begin dxdy:= abs(dX)+abs(dY); - if ((Kind = gtMine) and (dxdy > 0.35)) or - ((Kind = gtExplosives) and + if ((Kind = gtMine) and (dxdy > 0.35)) or + ((Kind = gtExplosives) and (((State and gstTmpFlag <> 0) and (dxdy > 0.35)) or - ((State and gstTmpFlag = 0) and - ((abs(odX) > 0.15) or ((abs(odY) > 0.15) and + ((State and gstTmpFlag = 0) and + ((abs(odX) > 0.15) or ((abs(odY) > 0.15) and (abs(odX) > 0.02))) and (dxdy > 0.35)))) then begin dmg := trunc(dxdy * 25); exit(dmg) end - else if (Kind = gtExplosives) and not((abs(odX) > 0.15) or ((abs(odY) > 0.15) and (abs(odX) > 0.02))) and (dY > 0.2) then + else if (Kind = gtExplosives) and (not(abs(odX) > 0.15) or ((abs(odY) > 0.15) and (abs(odX) > 0.02))) and (dY > 0.2) then begin dmg := trunc(dy * 70); exit(dmg) @@ -436,20 +440,20 @@ dmg := trunc((dY - 0.4) * 70); exit(dmg); end - else + else begin dxdy:= abs(dX)+abs(dY); - if ((Kind = gtMine) and (dxdy > 0.4)) or - ((Kind = gtExplosives) and + if ((Kind = gtMine) and (dxdy > 0.4)) or + ((Kind = gtExplosives) and (((State and gstTmpFlag <> 0) and (dxdy > 0.4)) or - ((State and gstTmpFlag = 0) and - ((abs(odX) > 0.15) or ((abs(odY) > 0.15) and + ((State and gstTmpFlag = 0) and + ((abs(odX) > 0.15) or ((abs(odY) > 0.15) and (abs(odX) > 0.02))) and (dxdy > 0.35)))) then begin dmg := trunc(dxdy * 50); exit(dmg) end - else if (Kind = gtExplosives) and not((abs(odX) > 0.15) or ((abs(odY) > 0.15) and (abs(odX) > 0.02))) and (dY > 0.2) then + else if (Kind = gtExplosives) and (not(abs(odX) > 0.15) or ((abs(odY) > 0.15) and (abs(odX) > 0.02))) and (dY > 0.2) then begin dmg := trunc(dy * 70); exit(dmg) @@ -520,7 +524,7 @@ begin dX:= (0.005 * dmg + 0.01) / Density; dY:= dX; - if (Kind = gtExplosives) and (State and gstTmpFlag = 0) and + if (Kind = gtExplosives) and (State and gstTmpFlag = 0) and (((abs(dY) > 0.15) and (abs(dX) < 0.02)) or ((abs(dY) < 0.15) and (abs(dX) < 0.15))) then dX:= 0; @@ -606,8 +610,8 @@ pY:= Point.y-2; fallDmg:= 0; if (Flags and afSetSkip <> 0) then skip:= true; - if not(dead) and (Flags and afTrackFall <> 0) and (Score > 0) and (power < Score) then - if (Kind = gtExplosives) and (State and gstTmpFlag = 0) and + if (not dead) and (Flags and afTrackFall <> 0) and (Score > 0) and (power < Score) then + if (Kind = gtExplosives) and (State and gstTmpFlag = 0) and (((abs(dY) > 0.15) and (abs(dX) < 0.02)) or ((abs(dY) < 0.15) and (abs(dX) < 0.15))) then fallDmg:= trunc(TraceShoveFall(pX, pY, 0, dY, Targets.ar[i]) * dmgMod) @@ -701,7 +705,7 @@ end; if dmg > 0 then begin - if not(dead) and (Score > 0) and (dmg < Score) then + if (not dead) and (Score > 0) and (dmg < Score) then begin pX:= Point.x; pY:= Point.y; @@ -709,9 +713,9 @@ dY:= gdY * dmg / Density; if dX < 0 then dX:= dX - 0.01 else dX:= dX + 0.01; - if (Kind = gtExplosives) and (State and gstTmpFlag = 0) and + if (Kind = gtExplosives) and (State and gstTmpFlag = 0) and (((abs(dY) > 0.15) and (abs(dX) < 0.02)) or - ((abs(dY) < 0.15) and (abs(dX) < 0.15))) then + ((abs(dY) < 0.15) and (abs(dX) < 0.15))) then dX:= 0; if (x and LAND_WIDTH_MASK = 0) and ((y+cHHRadius+2) and LAND_HEIGHT_MASK = 0) and (Land[y+cHHRadius+2, x] and lfIndestructible <> 0) then