hedgewars/uAIMisc.pas
changeset 6775 22b5fb7217db
parent 6774 237b96f06aae
child 6776 7a05f48bfa43
equal deleted inserted replaced
6774:237b96f06aae 6775:22b5fb7217db
   288 end;
   288 end;
   289 
   289 
   290 // Flags are not defined yet but 1 for checking drowning and 2 for assuming land erasure.
   290 // Flags are not defined yet but 1 for checking drowning and 2 for assuming land erasure.
   291 function RateExplosion(Me: PGear; x, y, r: LongInt; Flags: LongWord = 0): LongInt;
   291 function RateExplosion(Me: PGear; x, y, r: LongInt; Flags: LongWord = 0): LongInt;
   292 var i, dmg, dmgBase, rate, erasure: LongInt;
   292 var i, dmg, dmgBase, rate, erasure: LongInt;
   293     dX, dY: real;
   293     dX, dY, dmgMod: real;
   294 begin
   294 begin
       
   295 dmgMod:= 0.01 * hwFloat2Float(cDamageModifier) * cDamagePercent;
   295 rate:= 0;
   296 rate:= 0;
   296 // add our virtual position
   297 // add our virtual position
   297 with Targets.ar[Targets.Count] do
   298 with Targets.ar[Targets.Count] do
   298     begin
   299     begin
   299     Point.x:= hwRound(Me^.X);
   300     Point.x:= hwRound(Me^.X);
   307 for i:= 0 to Targets.Count do
   308 for i:= 0 to Targets.Count do
   308     with Targets.ar[i] do
   309     with Targets.ar[i] do
   309         begin
   310         begin
   310         dmg:= 0;
   311         dmg:= 0;
   311         if abs(Point.x - x) + abs(Point.y - y) < dmgBase then
   312         if abs(Point.x - x) + abs(Point.y - y) < dmgBase then
   312             dmg:= hwRound(_0_01 * cDamageModifier * min((dmgBase - LongInt(DistanceI(Point.x - x, Point.y - y).Round)) div 2, r) * cDamagePercent);
   313             dmg:= trunc(dmgMod * min((dmgBase - trunc(sqrt(sqr(Point.x - x)+sqr(Point.y - y)))) div 2, r));
   313 
   314 
   314         if dmg > 0 then
   315         if dmg > 0 then
   315             begin
   316             begin
   316             if Flags and 1 <> 0 then
   317             if Flags and 1 <> 0 then
   317                 begin
   318                 begin
   338 RateExplosion:= rate * 1024;
   339 RateExplosion:= rate * 1024;
   339 end;
   340 end;
   340 
   341 
   341 function RateShove(Me: PGear; x, y, r, power, kick: LongInt; gdX, gdY: real; Flags: LongWord): LongInt;
   342 function RateShove(Me: PGear; x, y, r, power, kick: LongInt; gdX, gdY: real; Flags: LongWord): LongInt;
   342 var i, dmg, rate: LongInt;
   343 var i, dmg, rate: LongInt;
   343     dX, dY: real;
   344     dX, dY, dmgMod: real;
   344 begin
   345 begin
       
   346 dX:= gdX * 0.005 * kick;
       
   347 dY:= gdY * 0.005 * kick;
       
   348 dmgMod:= 0.01 * hwFloat2Float(cDamageModifier) * cDamagePercent;
   345 Me:= Me; // avoid compiler hint
   349 Me:= Me; // avoid compiler hint
   346 rate:= 0;
   350 rate:= 0;
   347 for i:= 0 to Pred(Targets.Count) do
   351 for i:= 0 to Pred(Targets.Count) do
   348     with Targets.ar[i] do
   352     with Targets.ar[i] do
   349         begin
   353         begin
   350         dmg:= 0;
   354         dmg:= 0;
   351         if abs(Point.x - x) + abs(Point.y - y) < r then
   355         if abs(Point.x - x) + abs(Point.y - y) < r then
   352             begin
   356             begin
   353             dmg:= r - hwRound(DistanceI(Point.x - x, Point.y - y));
   357             dmg:= r - trunc(sqrt(sqr(Point.x - x)+sqr(Point.y - y)));
   354             dmg:= hwRound(_0_01 * cDamageModifier * dmg * cDamagePercent);
   358             dmg:= trunc(dmg * dmgMod);
   355             end;
   359             end;
   356         if dmg > 0 then
   360         if dmg > 0 then
   357             begin
   361             begin
   358             if Flags and 1 <> 0 then
       
   359                 begin
       
   360                 dX:= gdX * 0.005 * kick;
       
   361                 dY:= gdY * 0.005 * kick;
       
   362                 end;
       
   363             if (Flags and 1 <> 0) and TraceShoveDrown(Me, Point.x, Point.y, dX, dY) then
   362             if (Flags and 1 <> 0) and TraceShoveDrown(Me, Point.x, Point.y, dX, dY) then
   364                 if Score > 0 then
   363                 if Score > 0 then
   365                     inc(rate, KillScore + Score div 10)   // Add a bit of a bonus for bigger hog drownings
   364                     inc(rate, KillScore + Score div 10)   // Add a bit of a bonus for bigger hog drownings
   366                 else
   365                 else
   367                     dec(rate, KillScore * friendlyfactor div 100 - Score div 10) // and more of a punishment for drowning bigger friendly hogs
   366                     dec(rate, KillScore * friendlyfactor div 100 - Score div 10) // and more of a punishment for drowning bigger friendly hogs
   380 RateShove:= rate * 1024
   379 RateShove:= rate * 1024
   381 end;
   380 end;
   382 
   381 
   383 function RateShotgun(Me: PGear; gdX, gdY: real; x, y: LongInt): LongInt;
   382 function RateShotgun(Me: PGear; gdX, gdY: real; x, y: LongInt): LongInt;
   384 var i, dmg, baseDmg, rate, erasure: LongInt;
   383 var i, dmg, baseDmg, rate, erasure: LongInt;
   385     dX, dY: real;
   384     dX, dY, dmgMod: real;
   386 begin
   385 begin
       
   386 dmgMod:= 0.01 * hwFloat2Float(cDamageModifier) * cDamagePercent;
   387 rate:= 0;
   387 rate:= 0;
       
   388 gdX*=0.01;
       
   389 gdY*=0.01;
   388 // add our virtual position
   390 // add our virtual position
   389 with Targets.ar[Targets.Count] do
   391 with Targets.ar[Targets.Count] do
   390     begin
   392     begin
   391     Point.x:= hwRound(Me^.X);
   393     Point.x:= hwRound(Me^.X);
   392     Point.y:= hwRound(Me^.Y);
   394     Point.y:= hwRound(Me^.Y);
   400     with Targets.ar[i] do
   402     with Targets.ar[i] do
   401         begin
   403         begin
   402         dmg:= 0;
   404         dmg:= 0;
   403         if abs(Point.x - x) + abs(Point.y - y) < baseDmg then
   405         if abs(Point.x - x) + abs(Point.y - y) < baseDmg then
   404             begin
   406             begin
   405             dmg:= min(baseDmg - hwRound(DistanceI(Point.x - x, Point.y - y)), 25);
   407             dmg:= min(baseDmg - trunc(sqrt(sqr(Point.x - x)+sqr(Point.y - y))), 25);
   406             dmg:= hwRound(_0_01 * cDamageModifier * dmg * cDamagePercent);
   408             dmg:= trunc(dmg * dmgMod);
   407             end;
   409             end;
   408         if dmg > 0 then
   410         if dmg > 0 then
   409             begin
   411             begin
   410             dX:= gdX * dmg * 0.01;
   412             dX:= gdX * dmg;
   411             dY:= gdY * dmg * 0.01;
   413             dY:= gdY * dmg;
   412             if dX < 0 then dX:= dX - 0.01
   414             if dX < 0 then dX:= dX - 0.01
   413             else dX:= dX + 0.01;
   415             else dX:= dX + 0.01;
   414             if TraceDrown(x, y, Point.x, Point.y, dX, dY, erasure) then
   416             if TraceDrown(x, y, Point.x, Point.y, dX, dY, erasure) then
   415                 if Score > 0 then
   417                 if Score > 0 then
   416                     inc(rate, KillScore + Score div 10)   // Add a bit of a bonus for bigger hog drownings
   418                     inc(rate, KillScore + Score div 10)   // Add a bit of a bonus for bigger hog drownings
   437 
   439 
   438 for i:= 0 to Pred(Targets.Count) do
   440 for i:= 0 to Pred(Targets.Count) do
   439     with Targets.ar[i] do
   441     with Targets.ar[i] do
   440         begin
   442         begin
   441          // hammer hit radius is 8, shift is 10
   443          // hammer hit radius is 8, shift is 10
   442         r:= hwRound(DistanceI(Point.x - x, Point.y - y));
   444         if abs(Point.x - x) + abs(Point.y - y) < 18 then
       
   445         r:= trunc(sqrt(sqr(Point.x - x)+sqr(Point.y - y)));
   443 
   446 
   444         if r <= 18 then
   447         if r <= 18 then
   445             if Score > 0 then 
   448             if Score > 0 then 
   446                 inc(rate, Score div 3)
   449                 inc(rate, Score div 3)
   447             else 
   450             else