# HG changeset patch # User unc0rr # Date 1321555475 -10800 # Node ID f2ef5a8cccb4e7b1d43c550de9154ef841d73fda # Parent bd5851ab31573abc2053b346d5e0846569ac87ed - Move actions stack out of Walk procedure - Move test for available weapons into Walk procedure diff -r bd5851ab3157 -r f2ef5a8cccb4 hedgewars/uAI.pas --- a/hedgewars/uAI.pas Thu Nov 17 17:57:45 2011 +0400 +++ b/hedgewars/uAI.pas Thu Nov 17 21:44:35 2011 +0300 @@ -60,6 +60,49 @@ BestActions.Pos:= 0 end; + + +const cBranchStackSize = 12; +type TStackEntry = record + WastedTicks: Longword; + MadeActions: TActions; + Hedgehog: TGear; + end; + +var Stack: record + Count: Longword; + States: array[0..Pred(cBranchStackSize)] of TStackEntry; + end; + +function Push(Ticks: Longword; const Actions: TActions; const Me: TGear; Dir: integer): boolean; +var bRes: boolean; +begin + bRes:= (Stack.Count < cBranchStackSize) and (Actions.Count < MAXACTIONS - 5); + if bRes then + with Stack.States[Stack.Count] do + begin + WastedTicks:= Ticks; + MadeActions:= Actions; + Hedgehog:= Me; + Hedgehog.Message:= Dir; + inc(Stack.Count) + end; + Push:= bRes +end; + +procedure Pop(var Ticks: Longword; var Actions: TActions; var Me: TGear); +begin + dec(Stack.Count); + with Stack.States[Stack.Count] do + begin + Ticks:= WastedTicks; + Actions:= MadeActions; + Me:= Hedgehog + end +end; + + + procedure TestAmmos(var Actions: TActions; Me: PGear; isMoved: boolean); var BotLevel: Byte; ap: TAttackParams; @@ -131,46 +174,6 @@ procedure Walk(Me: PGear); const FallPixForBranching = cHHRadius * 2 + 8; - cBranchStackSize = 12; - -type TStackEntry = record - WastedTicks: Longword; - MadeActions: TActions; - Hedgehog: TGear; - end; - -var Stack: record - Count: Longword; - States: array[0..Pred(cBranchStackSize)] of TStackEntry; - end; - - function Push(Ticks: Longword; const Actions: TActions; const Me: TGear; Dir: integer): boolean; - var bRes: boolean; - begin - bRes:= (Stack.Count < cBranchStackSize) and (Actions.Count < MAXACTIONS - 5); - if bRes then - with Stack.States[Stack.Count] do - begin - WastedTicks:= Ticks; - MadeActions:= Actions; - Hedgehog:= Me; - Hedgehog.Message:= Dir; - inc(Stack.Count) - end; - Push:= bRes - end; - - procedure Pop(var Ticks: Longword; var Actions: TActions; var Me: TGear); - begin - dec(Stack.Count); - with Stack.States[Stack.Count] do - begin - Ticks:= WastedTicks; - Actions:= MadeActions; - Me:= Hedgehog - end - end; - var Actions: TActions; ticks, maxticks, steps, tmp: Longword; BaseRate, BestRate, Rate: integer; @@ -178,12 +181,17 @@ CanGo: boolean; AltMe: TGear; BotLevel: Byte; + a: TAmmoType; begin ticks:= 0; // avoid compiler hint Actions.Count:= 0; Actions.Pos:= 0; Actions.Score:= 0; Stack.Count:= 0; + +for a:= Low(TAmmoType) to High(TAmmoType) do + CanUseAmmo[a]:= Assigned(AmmoTests[a].proc) and HHHasAmmo(Me^.Hedgehog^, a); + BotLevel:= Me^.Hedgehog^.BotLevel; tmp:= random(2) + 1; @@ -289,7 +297,6 @@ end; procedure StartThink(Me: PGear); -var a: TAmmoType; begin if ((Me^.State and (gstAttacking or gstHHJumping or gstMoving)) <> 0) or isInMultiShoot then exit; @@ -313,8 +320,6 @@ end; FillBonuses((Me^.State and gstAttacked) <> 0); -for a:= Low(TAmmoType) to High(TAmmoType) do - CanUseAmmo[a]:= Assigned(AmmoTests[a].proc) and HHHasAmmo(Me^.Hedgehog^, a); AddFileLog('Enter Think Thread'); BeginThread(@Think, Me, ThinkThread) end;