diff -r d8a526934b9f -r 82d93eeecebe hedgewars/uAI.pas --- a/hedgewars/uAI.pas Tue Jun 20 21:22:15 2006 +0000 +++ b/hedgewars/uAI.pas Fri Jun 23 20:02:41 2006 +0000 @@ -65,7 +65,10 @@ for i:= 0 to Pred(Targets.Count) do if Targets.ar[i].Score >= 0 then begin - a:= Low(TAmmoType); + if (CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog].AttacksNum > 0) + then with CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog] do + a:= Ammo[CurSlot, CurAmmo].AmmoType + else a:= Low(TAmmoType); aa:= a; repeat if Assigned(AmmoTests[a]) then @@ -89,47 +92,54 @@ AddAction(BestActions, aia_Down, aim_push, 500); AddAction(BestActions, aia_Down, aim_release, -Angle) end; - AddAction(BestActions, aia_attack, aim_push, 300); + AddAction(BestActions, aia_attack, aim_push, 800); AddAction(BestActions, aia_attack, aim_release, Power); end end; if a = High(TAmmoType) then a:= Low(TAmmoType) else inc(a) - until isInMultiShoot or (a = aa) or (CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog].AttacksNum > 0) + until (a = aa) or (CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog].AttacksNum > 0) end end; procedure Walk(Me: PGear); var Actions: TActions; BackMe: TGear; - Dir, t, avoidt, steps: integer; + Dir, steps, maxsteps: integer; + BestRate, Rate: integer; begin Actions.Score:= 0; Actions.Count:= 0; Actions.Pos:= 0; +BestActions.Count:= 0; +if (Me.State and gstAttacked) = 0 then maxsteps:= (TurnTimeLeft - 4000) div cHHStepTicks + else maxsteps:= 3000; BackMe:= Me^; if (Me.State and gstAttacked) = 0 then TestAmmos(Actions, Me); -avoidt:= CheckBonuses(Me); +BestRate:= RatePlace(Me); for Dir:= aia_Left to aia_Right do begin Me.Message:= Dir; steps:= 0; - while HHGo(Me) do + while HHGo(Me) and (steps < maxsteps) do begin inc(steps); Actions.Count:= 0; - AddAction(Actions, Dir, aim_push, 50); + AddAction(Actions, Dir, aim_push, 250); AddAction(Actions, aia_WaitX, round(Me.X), 0); AddAction(Actions, Dir, aim_release, 0); - t:= CheckBonuses(Me); - if t < avoidt then break - else if (t > 0) or (t > avoidt) then - begin - BestActions:= Actions; - exit - end; + Rate:= RatePlace(Me); + if Rate > BestRate then + begin + BestActions:= Actions; + BestRate:= Rate; + Me.State:= Me.State or gstAttacked // we have better place, go to it and don't use ammo + end + else if Rate < BestRate then + if BestRate > 0 then exit + else 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); if StopThinking then exit; end; Me^:= BackMe @@ -140,27 +150,29 @@ var BackMe: TGear; StartTicks: Longword; begin -{$IFDEF DEBUGFILE}AddFileLog('Enter Think Thread');{$ENDIF} StartTicks:= GameTicks; -ThinkingHH:= Me; -FillTargets; -FillBonuses; BestActions.Score:= Low(integer); if Targets.Count > 0 then begin BackMe:= Me^; Walk(@BackMe); end; -if StartTicks > GameTicks - 1000 then SDL_Delay(500); -Me.State:= Me.State and not gstHHThinking; -{$IFDEF DEBUGFILE}AddFileLog('Exit Think Thread');{$ENDIF} +if ((Me.State and gstAttacked) = 0) + and (StartTicks > GameTicks - 1000) then SDL_Delay(1000); + +if BestActions.Count > 0 then Me.State:= Me.State and not gstHHThinking; ThinkThread:= nil end; procedure StartThink(Me: PGear); begin +if ((Me.State and gstAttacking) <> 0) or isInMultiShoot then exit; Me.State:= Me.State or gstHHThinking; StopThinking:= false; +ThinkingHH:= Me; +FillTargets; +FillBonuses((Me.State and gstAttacked) <> 0); +{$IFDEF DEBUGFILE}AddFileLog('Enter Think Thread');{$ENDIF} ThinkThread:= SDL_CreateThread(@Think, Me) end;