hedgewars/uAI.pas
changeset 543 465e2ec8f05f
parent 542 ec26095f1bed
child 544 9e068d2398ca
--- a/hedgewars/uAI.pas	Sun Jun 17 14:48:15 2007 +0000
+++ b/hedgewars/uAI.pas	Sun Jul 01 11:02:47 2007 +0000
@@ -57,10 +57,10 @@
 BestActions.Pos:= 0
 end;
 
-procedure TestAmmos(var Actions: TActions; Me: PGear);
+procedure TestAmmos(var Actions: TActions; Me: PGear; isMoved: boolean);
 var Time, BotLevel: Longword;
-    Angle, Power, Score, ExplX, ExplY, ExplR: LongInt;
-    i: LongInt;
+    ap: TAttackParams;
+    Score, i: LongInt;
     a, aa: TAmmoType;
 begin
 BotLevel:= PHedgehog(Me^.Hedgehog)^.BotLevel;
@@ -72,35 +72,44 @@
             a:= Ammo^[CurSlot, CurAmmo].AmmoType;
        aa:= a;
        repeat
-        if CanUseAmmo[a] then
+        if (CanUseAmmo[a]) and
+           ((not isMoved) or ((AmmoTests[a].flags and amtest_OnTurn) = 0)) then
            begin
-           Score:= AmmoTests[a](Me, Targets.ar[i].Point, BotLevel, Time, Angle, Power, ExplX, ExplY, ExplR);
+           Score:= AmmoTests[a].proc(Me, Targets.ar[i].Point, BotLevel, ap);
            if Actions.Score + Score > BestActions.Score then
+            if (BestActions.Score < 0) or (Actions.Score + Score > BestActions.Score + LongInt(BotLevel) * 2048) then
               begin
               BestActions:= Actions;
               inc(BestActions.Score, Score);
 
-              AddAction(BestActions, aia_Weapon, Longword(a), 500, 0, 0);
-              if Time <> 0 then AddAction(BestActions, aia_Timer, Time div 1000, 400, 0, 0);
-              if (Angle > 0) then AddAction(BestActions, aia_LookRight, 0, 200, 0, 0)
-              else if (Angle < 0) then AddAction(BestActions, aia_LookLeft, 0, 200, 0, 0);
+              AddAction(BestActions, aia_Weapon, Longword(a), 300 + random(400), 0, 0);
+              if (ap.Time <> 0) then AddAction(BestActions, aia_Timer, ap.Time div 1000, 400, 0, 0);
+              if (ap.Angle > 0) then AddAction(BestActions, aia_LookRight, 0, 200, 0, 0)
+              else if (ap.Angle < 0) then AddAction(BestActions, aia_LookLeft, 0, 200, 0, 0);
               if (Ammoz[a].Ammo.Propz and ammoprop_NoCrosshair) = 0 then
                  begin
-                 Angle:= LongInt(Me^.Angle) - Abs(Angle);
-                 if Angle > 0 then
+                 ap.Angle:= LongInt(Me^.Angle) - Abs(ap.Angle);
+                 if ap.Angle > 0 then
                     begin
-                    AddAction(BestActions, aia_Up, aim_push, 500, 0, 0);
-                    AddAction(BestActions, aia_Up, aim_release, Angle, 0, 0)
-                    end else if Angle < 0 then
+                    AddAction(BestActions, aia_Up, aim_push, 300 + random(250), 0, 0);
+                    AddAction(BestActions, aia_Up, aim_release, ap.Angle, 0, 0)
+                    end else if ap.Angle < 0 then
                     begin
-                    AddAction(BestActions, aia_Down, aim_push, 500, 0, 0);
-                    AddAction(BestActions, aia_Down, aim_release, -Angle, 0, 0)
+                    AddAction(BestActions, aia_Down, aim_push, 300 + random(250), 0, 0);
+                    AddAction(BestActions, aia_Down, aim_release, -ap.Angle, 0, 0)
                     end
                  end;
-              AddAction(BestActions, aia_attack, aim_push, 800, 0, 0);
-              AddAction(BestActions, aia_attack, aim_release, Power, 0, 0);
-              if ExplR > 0 then
-                 AddAction(BestActions, aia_AwareExpl, ExplR, 10, ExplX, ExplY);
+              if (Ammoz[a].Ammo.Propz and ammoprop_NeedTarget) <> 0 then
+                 begin
+                 AddAction(BestActions, aia_Put, 0, 1, ap.AttackPutX, ap.AttackPutY)
+                 end;
+              if (Ammoz[a].Ammo.Propz and ammoprop_AttackingPut) = 0 then
+                 begin
+                 AddAction(BestActions, aia_attack, aim_push, 650 + random(300), 0, 0);
+                 AddAction(BestActions, aia_attack, aim_release, ap.Power, 0, 0);
+                 end;
+              if ap.ExplR > 0 then
+                 AddAction(BestActions, aia_AwareExpl, ap.ExplR, 10, ap.ExplX, ap.ExplY);
               end
            end;
         if a = High(TAmmoType) then a:= Low(TAmmoType)
@@ -188,7 +197,7 @@
 if (Me^.State and gstAttacked) = 0 then maxticks:= max(0, TurnTimeLeft - 5000 - 4000 * BotLevel)
                                    else maxticks:= TurnTimeLeft;
 
-if (Me^.State and gstAttacked) = 0 then TestAmmos(Actions, Me);
+if (Me^.State and gstAttacked) = 0 then TestAmmos(Actions, Me, false);
 BestRate:= RatePlace(Me);
 BaseRate:= max(BestRate, 0);
 
@@ -232,7 +241,7 @@
           end
        else if Rate < BestRate then break;
        if ((Me^.State and gstAttacked) = 0)
-           and ((steps mod 4) = 0) then TestAmmos(Actions, Me);
+           and ((steps mod 4) = 0) then TestAmmos(Actions, Me, true);
        if GoInfo.FallPix >= FallPixForBranching then
           Push(ticks, Actions, Me^, Me^.Message xor 3); // aia_Left xor 3 = aia_Right
        end;
@@ -300,7 +309,7 @@
    end;
 FillBonuses((Me^.State and gstAttacked) <> 0);
 for a:= Low(TAmmoType) to High(TAmmoType) do
-    CanUseAmmo[a]:= Assigned(AmmoTests[a]) and HHHasAmmo(PHedgehog(Me^.Hedgehog), a);
+    CanUseAmmo[a]:= Assigned(AmmoTests[a].proc) and HHHasAmmo(PHedgehog(Me^.Hedgehog), a);
 {$IFDEF DEBUGFILE}AddFileLog('Enter Think Thread');{$ENDIF}
 BeginThread(@Think, Me, ThinkThread)
 end;