# HG changeset patch # User unc0rr # Date 1178569286 0 # Node ID fd58135a4407e32f0cd1da256a3715ba0688bff2 # Parent f5473c50adbd1586e12928b0dce5df00341dee82 Bots know shotgun behavior better diff -r f5473c50adbd -r fd58135a4407 hedgewars/uAI.pas --- a/hedgewars/uAI.pas Sun May 06 20:50:53 2007 +0000 +++ b/hedgewars/uAI.pas Mon May 07 20:21:26 2007 +0000 @@ -25,22 +25,24 @@ implementation uses uTeams, uConsts, SDLh, uAIMisc, uGears, uAIAmmoTests, uAIActions, uMisc, - uAmmos, uConsole, uCollisions{$IFDEF UNIX}, cthreads{$ENDIF}; + uAmmos, uConsole, uCollisions, SysUtils{$IFDEF UNIX}, cthreads{$ENDIF}; var BestActions: TActions; - ThinkThread: THandle = 0; + CanUseAmmo: array [TAmmoType] of boolean; StopThinking: boolean; - CanUseAmmo: array [TAmmoType] of boolean; - + ThinkThread: THandle; + hasThread: LongInt = 0; + procedure FreeActionsList; begin {$IFDEF DEBUGFILE}AddFileLog('FreeActionsList called');{$ENDIF} -if ThinkThread <> 0 then +if hasThread <> 0 then begin {$IFDEF DEBUGFILE}AddFileLog('Waiting AI thread to finish');{$ENDIF} StopThinking:= true; - WaitForThreadTerminate(ThinkThread, 5000); - ThinkThread:= 0 + repeat + SDL_Delay(10) + until hasThread = 0 end; with CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog] do @@ -64,7 +66,7 @@ BotLevel:= PHedgehog(Me^.Hedgehog)^.BotLevel; for i:= 0 to Pred(Targets.Count) do - if (Targets.ar[i].Score >= 0) then + if (Targets.ar[i].Score >= 0) and (not StopThinking) then begin with CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog] do a:= Ammo^[CurSlot, CurAmmo].AmmoType; @@ -103,7 +105,9 @@ end; if a = High(TAmmoType) then a:= Low(TAmmoType) else inc(a) - until (a = aa) or (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].AttacksNum > 0) + until (a = aa) or + (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].AttacksNum > 0) or + StopThinking end end; @@ -241,15 +245,14 @@ var BackMe, WalkMe: TGear; StartTicks: Longword; begin +InterlockedIncrement(hasThread); StartTicks:= GameTicks; -BestActions.Count:= 0; -BestActions.Pos:= 0; -BestActions.Score:= Low(integer); BackMe:= PGear(Me)^; -WalkMe:= BackMe; + if (PGear(Me)^.State and gstAttacked) = 0 then if Targets.Count > 0 then begin + WalkMe:= BackMe; Walk(@WalkMe); if (StartTicks > GameTicks - 1500) and not StopThinking then SDL_Delay(2000); if BestActions.Score < -1023 then @@ -259,17 +262,17 @@ end; end else else begin - Walk(@WalkMe); while (not StopThinking) and (BestActions.Count = 0) do begin - SDL_Delay(100); FillBonuses(true); WalkMe:= BackMe; - Walk(@WalkMe) + Walk(@WalkMe); + if not StopThinking then SDL_Delay(100) end end; PGear(Me)^.State:= PGear(Me)^.State and not gstHHThinking; -Think:= 0 +Think:= 0; +InterlockedDecrement(hasThread) end; procedure StartThink(Me: PGear); @@ -281,8 +284,14 @@ DeleteCI(Me); // don't let collision info in Land to confuse AI Me^.State:= Me^.State or gstHHThinking; Me^.Message:= 0; + +BestActions.Count:= 0; +BestActions.Pos:= 0; +BestActions.Score:= Low(integer); + StopThinking:= false; ThinkingHH:= Me; + FillTargets; if Targets.Count = 0 then begin @@ -298,19 +307,21 @@ procedure ProcessBot; const StartTicks: Longword = 0; + cStopThinkTime = 40; begin with CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog] do if (Gear <> nil) and ((Gear^.State and gstHHDriven) <> 0) and (TurnTimeLeft < cHedgehogTurnTime - 50) then if ((Gear^.State and gstHHThinking) = 0) then - if (BestActions.Pos >= BestActions.Count) then + if (BestActions.Pos >= BestActions.Count) + and (TurnTimeLeft > cStopThinkTime) then begin StartThink(Gear); StartTicks:= GameTicks end else ProcessAction(BestActions, Gear) - else if (GameTicks - StartTicks) > cMaxAIThinkTime then StopThinking:= true + else if ((GameTicks - StartTicks) > cMaxAIThinkTime) + or (TurnTimeLeft <= cStopThinkTime) then StopThinking:= true end; - end. diff -r f5473c50adbd -r fd58135a4407 hedgewars/uAIAmmoTests.pas --- a/hedgewars/uAIAmmoTests.pas Sun May 06 20:50:53 2007 +0000 +++ b/hedgewars/uAIAmmoTests.pas Mon May 07 20:21:26 2007 +0000 @@ -192,7 +192,9 @@ ry:= hwRound(y); if TestColl(rx, ry, 2) then begin - Result:= RateShove(Me, rx, ry, 25, 25) * 2; + x:= x + vX * 8; + y:= y + vY * 8; + Result:= RateShotgun(Me, rx, ry) * 2; if Result = 0 then Result:= - Metric(Targ.X, Targ.Y, rx, ry) div 64 else dec(Result, Level * 4000); exit(Result) diff -r f5473c50adbd -r fd58135a4407 hedgewars/uAIMisc.pas --- a/hedgewars/uAIMisc.pas Sun May 06 20:50:53 2007 +0000 +++ b/hedgewars/uAIMisc.pas Mon May 07 20:21:26 2007 +0000 @@ -43,6 +43,7 @@ function TestColl(x, y, r: LongInt): boolean; function RateExplosion(Me: PGear; x, y, r: LongInt): LongInt; function RateShove(Me: PGear; x, y, r, power: LongInt): LongInt; +function RateShotgun(Me: PGear; x, y: LongInt): LongInt; function HHGo(Gear, AltGear: PGear; var GoInfo: TGoInfo): boolean; function AIrndSign(num: LongInt): LongInt; @@ -184,7 +185,7 @@ if dmg > 0 then begin dmg:= dmg shr 1; - if dmg > abs(Score) then + if dmg >= abs(Score) then if Score > 0 then inc(Result, KillScore) else dec(Result, KillScore * 3) else @@ -205,7 +206,7 @@ dmg:= r - hwRound(DistanceI(Point.x - x, Point.y - y)); if dmg > 0 then begin - if power > abs(Score) then + if power >= abs(Score) then if Score > 0 then inc(Result, KillScore) else dec(Result, KillScore * 3) else @@ -216,6 +217,35 @@ RateShove:= Result * 1024 end; +function RateShotgun(Me: PGear; x, y: LongInt): LongInt; +var i, dmg, Result: LongInt; +begin +Result:= 0; +// add our virtual position +with Targets.ar[Targets.Count] do + begin + Point.x:= hwRound(Me^.X); + Point.y:= hwRound(Me^.Y); + Score:= - ThinkingHH^.Health + end; +// rate shot +for i:= 0 to Targets.Count do + with Targets.ar[i] do + begin + dmg:= min(cHHRadius + cShotgunRadius - hwRound(DistanceI(Point.x - x, Point.y - y)), 25); + if dmg > 0 then + begin + if dmg >= abs(Score) then + if Score > 0 then inc(Result, KillScore) + else dec(Result, KillScore * 3) + else + if Score > 0 then inc(Result, dmg) + else dec(Result, dmg * 3) + end; + end; +RateShotgun:= Result * 1024 +end; + function HHJump(Gear: PGear; JumpType: TJumpType; var GoInfo: TGoInfo): boolean; var bX, bY: LongInt; Result: boolean; diff -r f5473c50adbd -r fd58135a4407 hedgewars/uConsts.pas --- a/hedgewars/uConsts.pas Sun May 06 20:50:53 2007 +0000 +++ b/hedgewars/uConsts.pas Mon May 07 20:21:26 2007 +0000 @@ -121,9 +121,12 @@ cHHRadius = 9; cHHStepTicks = 38; + cHHZ = 1000; cCurrHHZ = Succ(cHHZ); + cShotgunRadius = 22; + cKeyMaxIndex = 1023; cMaxCaptions = 4; diff -r f5473c50adbd -r fd58135a4407 hedgewars/uGears.pas --- a/hedgewars/uGears.pas Sun May 06 20:50:53 2007 +0000 +++ b/hedgewars/uGears.pas Mon May 07 20:21:26 2007 +0000 @@ -700,7 +700,7 @@ var t: PGear; dmg: integer; begin -Gear^.Radius:= 22; +Gear^.Radius:= cShotgunRadius; t:= GearsList; while t <> nil do begin @@ -725,7 +725,7 @@ end; t:= t^.NextGear end; -DrawExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 22) +DrawExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), cShotgunRadius) end; procedure AmmoShove(Ammo: PGear; Damage, Power: LongInt);