diff -r fe71e55d2d7b -r 2aed85310727 hedgewars/uAI.pas --- a/hedgewars/uAI.pas Fri Jan 26 18:39:40 2007 +0000 +++ b/hedgewars/uAI.pas Fri Jan 26 22:36:21 2007 +0000 @@ -24,7 +24,7 @@ procedure FreeActionsList; implementation -{uses uTeams, uConsts, SDLh, uAIMisc, uGears, uAIAmmoTests, uAIActions, uMisc, +uses uTeams, uConsts, SDLh, uAIMisc, uGears, uAIAmmoTests, uAIActions, uMisc, uAIThinkStack, uAmmos; var BestActions: TActions; @@ -32,26 +32,26 @@ AIThinkStart: Longword; isThinking: boolean = false; -}procedure FreeActionsList; +procedure FreeActionsList; begin -{isThinking:= false; +isThinking:= false; BestActions.Count:= 0; BestActions.Pos:= 0 -}end; -{ +end; + procedure TestAmmos(var Actions: TActions; Me: PGear); var Time, BotLevel: Longword; Angle, Power, Score, ExplX, ExplY, ExplR: integer; i: integer; a, aa: TAmmoType; begin -BotLevel:= PHedgehog(Me.Hedgehog).BotLevel; +BotLevel:= PHedgehog(Me^.Hedgehog)^.BotLevel; for i:= 0 to Pred(Targets.Count) do if (Targets.ar[i].Score >= 0) then begin - with CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog] do - a:= Ammo[CurSlot, CurAmmo].AmmoType; + with CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog] do + a:= Ammo^[CurSlot, CurAmmo].AmmoType; aa:= a; repeat if CanUseAmmo[a] then @@ -62,32 +62,32 @@ BestActions:= Actions; inc(BestActions.Score, Score); - AddAction(BestActions, aia_Weapon, Longword(a), 500); - if Time <> 0 then AddAction(BestActions, aia_Timer, Time div 1000, 400); - if (Angle > 0) then AddAction(BestActions, aia_LookRight, 0, 200) - else if (Angle < 0) then AddAction(BestActions, aia_LookLeft, 0, 200); + 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); if (Ammoz[a].Ammo.Propz and ammoprop_NoCrosshair) = 0 then begin - Angle:= integer(Me.Angle) - Abs(Angle); + Angle:= integer(Me^.Angle) - Abs(Angle); if Angle > 0 then begin - AddAction(BestActions, aia_Up, aim_push, 500); - AddAction(BestActions, aia_Up, aim_release, Angle) + AddAction(BestActions, aia_Up, aim_push, 500, 0, 0); + AddAction(BestActions, aia_Up, aim_release, Angle, 0, 0) end else if Angle < 0 then begin - AddAction(BestActions, aia_Down, aim_push, 500); - AddAction(BestActions, aia_Down, aim_release, -Angle) + AddAction(BestActions, aia_Down, aim_push, 500, 0, 0); + AddAction(BestActions, aia_Down, aim_release, -Angle, 0, 0) end end; - AddAction(BestActions, aia_attack, aim_push, 800); - AddAction(BestActions, aia_attack, aim_release, Power); + 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); end end; if a = High(TAmmoType) then a:= Low(TAmmoType) else inc(a) - until (a = aa) or (PHedgehog(Me.Hedgehog).AttacksNum > 0) + until (a = aa) or (PHedgehog(Me^.Hedgehog)^.AttacksNum > 0) end end; @@ -101,9 +101,9 @@ CanGo: boolean; AltMe: TGear; begin -BotLevel:= PHedgehog(Me.Hedgehog).BotLevel; +BotLevel:= PHedgehog(Me^.Hedgehog)^.BotLevel; -if (Me.State and gstAttacked) = 0 then maxticks:= max(0, TurnTimeLeft - 5000 - 4000 * BotLevel) +if (Me^.State and gstAttacked) = 0 then maxticks:= max(0, TurnTimeLeft - 5000 - 4000 * BotLevel) else maxticks:= TurnTimeLeft; BaseRate:= RatePlace(Me); @@ -115,12 +115,12 @@ exit end; - AddAction(Actions, Me.Message, aim_push, 10); - if (Me.Message and gm_Left) <> 0 then AddAction(Actions, aia_WaitXL, round(Me.X), 0) - else AddAction(Actions, aia_WaitXR, round(Me.X), 0); - AddAction(Actions, Me.Message, aim_release, 0); + AddAction(Actions, Me^.Message, aim_push, 10, 0, 0); + if (Me^.Message and gm_Left) <> 0 then AddAction(Actions, aia_WaitXL, hwRound(Me^.X), 0, 0, 0) + else AddAction(Actions, aia_WaitXR, hwRound(Me^.X), 0, 0, 0); + AddAction(Actions, Me^.Message, aim_release, 0, 0, 0); steps:= 0; - if ((Me.State and gstAttacked) = 0) then TestAmmos(Actions, Me); + if ((Me^.State and gstAttacked) = 0) then TestAmmos(Actions, Me); while not PosInThinkStack(Me) do begin @@ -132,23 +132,23 @@ if Push(ticks, Actions, AltMe, Me^.Message) then with ThinkStack.States[Pred(ThinkStack.Count)] do begin - AddAction(MadeActions, aia_HJump, 0, 305); - AddAction(MadeActions, aia_HJump, 0, 350); - if (Me.dX < 0) then AddAction(MadeActions, aia_WaitXL, round(AltMe.X), 0) - else AddAction(MadeActions, aia_WaitXR, round(AltMe.X), 0); + AddAction(MadeActions, aia_HJump, 0, 305, 0, 0); + AddAction(MadeActions, aia_HJump, 0, 350, 0, 0); + if (Me^.dX < 0) then AddAction(MadeActions, aia_WaitXL, hwRound(AltMe.X), 0, 0, 0) + else AddAction(MadeActions, aia_WaitXR, hwRound(AltMe.X), 0, 0, 0); end; if (BotLevel < 3) and (GoInfo.JumpType = jmpLJump) then // ljump support if Push(ticks, Actions, AltMe, Me^.Message) then with ThinkStack.States[Pred(ThinkStack.Count)] do begin - AddAction(MadeActions, aia_LJump, 0, 305); - if (Me.dX < 0) then AddAction(MadeActions, aia_WaitXL, round(AltMe.X), 0) - else AddAction(MadeActions, aia_WaitXR, round(AltMe.X), 0); + AddAction(MadeActions, aia_LJump, 0, 305, 0, 0); + if (Me^.dX < 0) then AddAction(MadeActions, aia_WaitXL, hwRound(AltMe.X), 0, 0, 0) + else AddAction(MadeActions, aia_WaitXR, hwRound(AltMe.X), 0, 0, 0); end; if not CanGo then break; inc(steps); - Actions.actions[Actions.Count - 2].Param:= round(Me.X); + Actions.actions[Actions.Count - 2].Param:= hwRound(Me^.X); Rate:= RatePlace(Me); if Rate > BaseRate then begin @@ -161,7 +161,7 @@ if GoInfo.FallPix >= FallPixForBranching then Push(ticks, Actions, Me^, Me^.Message xor 3); // aia_Left xor 3 = aia_Right - if ((Me.State and gstAttacked) = 0) + if ((Me^.State and gstAttacked) = 0) and ((steps mod 4) = 0) then begin if SDL_GetTicks - AIThinkStart > 3 then @@ -182,7 +182,7 @@ AIThinkStart:= SDL_GetTicks; BackMe:= Me^; WalkMe:= BackMe; -if (Me.State and gstAttacked) = 0 then +if (Me^.State and gstAttacked) = 0 then if Targets.Count > 0 then begin Walk(@WalkMe); @@ -191,15 +191,15 @@ if BestActions.Score < -1023 then begin BestActions.Count:= 0; - AddAction(BestActions, aia_Skip, 0, 250); + AddAction(BestActions, aia_Skip, 0, 250, 0, 0); end; - Me.State:= Me.State and not gstHHThinking + Me^.State:= Me^.State and not gstHHThinking end end else else begin FillBonuses(true); Walk(@WalkMe); - AddAction(BestActions, aia_Wait, GameTicks + 100, 100); + AddAction(BestActions, aia_Wait, GameTicks + 100, 100, 0, 0); end end; @@ -207,25 +207,25 @@ var a: TAmmoType; tmp: integer; begin -if ((Me.State and gstAttacking) <> 0) or isInMultiShoot then exit; +if ((Me^.State and gstAttacking) <> 0) or isInMultiShoot then exit; ThinkingHH:= Me; isThinking:= true; ClearThinkStack; -Me.State:= Me.State or gstHHThinking; -Me.Message:= 0; +Me^.State:= Me^.State or gstHHThinking; +Me^.Message:= 0; FillTargets; if Targets.Count = 0 then begin - OutError('AI: no targets!?'); + OutError('AI: no targets!?', false); exit end; -FillBonuses((Me.State and gstAttacked) <> 0); +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]) and HHHasAmmo(PHedgehog(Me^.Hedgehog), a); BestActions.Count:= 0; BestActions.Pos:= 0; @@ -236,14 +236,14 @@ BestActions.Score:= Low(integer); Think(Me) -end; } +end; procedure ProcessBot(FrameNo: Longword); -//const LastFrameNo: Longword = 0; +const LastFrameNo: Longword = 0; begin -{with CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog] do +with CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog] do if (Gear <> nil) - and ((Gear.State and gstHHDriven) <> 0) + and ((Gear^.State and gstHHDriven) <> 0) and (TurnTimeLeft < cHedgehogTurnTime - 50) then if not isThinking then if (BestActions.Pos >= BestActions.Count) then StartThink(Gear) @@ -253,6 +253,6 @@ LastFrameNo:= FrameNo; Think(Gear) end; -}end; +end; end.