# HG changeset patch # User unc0rr # Date 1211108083 0 # Node ID b5222ddafe1f1a76036a66bd329a9425f27e6bfd # Parent 769adb0ad082395a01988edf0d8c7f1d72edb67b - Fix bug with picking up ammos from cases, when total ammo count may become more than AMMO_INFINITE - Initial implementation of weapon activation only after some turns diff -r 769adb0ad082 -r b5222ddafe1f hedgewars/HHHandlers.inc --- a/hedgewars/HHHandlers.inc Sat May 17 22:21:45 2008 +0000 +++ b/hedgewars/HHHandlers.inc Sun May 18 10:54:43 2008 +0000 @@ -18,7 +18,7 @@ //////////////////////////////////////////////////////////////////////////////// procedure ChangeAmmo(Gear: PGear); -var slot: Longword; +var slot, i: Longword; begin slot:= Gear^.MsgParam; @@ -32,14 +32,30 @@ if CurSlot = slot then begin + i:= 0; + repeat inc(CurAmmo); - if (CurAmmo > cMaxSlotAmmoIndex) or (Ammo^[slot, CurAmmo].Count = 0) then CurAmmo:= 0 + if (CurAmmo > cMaxSlotAmmoIndex) then + begin + CurAmmo:= 0; + inc(i); + TryDo(i < 2, 'Engine bug: no ammo in current slot', true) + end; + until (Ammo^[slot, CurAmmo].Count > 0) and (Team^.Clan^.TurnNumber > Ammoz[Ammo^[slot, CurAmmo].AmmoType].SkipTurns) end else - if Ammo^[slot, 0].Count > 0 then begin - CurSlot:= slot; - CurAmmo:= 0 - end; + i:= 0; + // check whether there's ammo in slot + while (i <= cMaxSlotAmmoIndex) + and ((Ammo^[slot, i].Count = 0) + or (Team^.Clan^.TurnNumber <= Ammoz[Ammo^[slot, i].AmmoType].SkipTurns)) do inc(i); + + if i <= cMaxSlotAmmoIndex then + begin + CurSlot:= slot; + CurAmmo:= i + end + end end; ApplyAmmoChanges(PHedgehog(Gear^.Hedgehog)^) @@ -50,6 +66,9 @@ weap: TAmmoType; begin weap:= TAmmoType(Gear^.MsgParam); + +if PHedgehog(Gear^.Hedgehog)^.Team^.Clan^.TurnNumber <= Ammoz[weap].SkipTurns then exit; // weapon isn't activated yet + Gear^.MsgParam:= Ammoz[weap].Slot; t:= cMaxSlotAmmoIndex; diff -r 769adb0ad082 -r b5222ddafe1f hedgewars/uAI.pas --- a/hedgewars/uAI.pas Sat May 17 22:21:45 2008 +0000 +++ b/hedgewars/uAI.pas Sun May 18 10:54:43 2008 +0000 @@ -129,7 +129,7 @@ MadeActions: TActions; Hedgehog: TGear; end; - + var Stack: record Count: Longword; States: array[0..Pred(cBranchStackSize)] of TStackEntry; @@ -310,6 +310,7 @@ OutError('AI: no targets!?', false); exit end; + FillBonuses((Me^.State and gstAttacked) <> 0); for a:= Low(TAmmoType) to High(TAmmoType) do CanUseAmmo[a]:= Assigned(AmmoTests[a].proc) and HHHasAmmo(PHedgehog(Me^.Hedgehog)^, a); diff -r 769adb0ad082 -r b5222ddafe1f hedgewars/uAmmos.pas --- a/hedgewars/uAmmos.pas Sat May 17 22:21:45 2008 +0000 +++ b/hedgewars/uAmmos.pas Sun May 18 10:54:43 2008 +0000 @@ -107,7 +107,12 @@ if hhammo^[slot, ami].Count > 0 then ammos[hhammo^[slot, ami].AmmoType]:= hhammo^[slot, ami].Count; -if ammos[ammo] <> AMMO_INFINITE then inc(ammos[ammo], Ammoz[ammo].NumberInCase); +if ammos[ammo] <> AMMO_INFINITE then + begin + inc(ammos[ammo], Ammoz[ammo].NumberInCase); + if ammos[ammo] > AMMO_INFINITE then ammos[ammo]:= AMMO_INFINITE + end; + FillAmmoStore(hhammo, ammos) end; @@ -151,7 +156,8 @@ while (ami <= cMaxSlotAmmoIndex) do begin with Hedgehog.Ammo^[Slot, ami] do - if (AmmoType = Ammo) and (Count > 0) then exit(true); + if (AmmoType = Ammo) then + exit((Count > 0) and (Hedgehog.Team^.Clan^.TurnNumber > Ammoz[AmmoType].SkipTurns)); inc(ami) end; HHHasAmmo:= false @@ -164,7 +170,7 @@ with Hedgehog do begin - if (Ammo^[CurSlot, CurAmmo].Count = 0)then + if (Ammo^[CurSlot, CurAmmo].Count = 0) then begin CurAmmo:= 0; CurSlot:= 0; diff -r 769adb0ad082 -r b5222ddafe1f hedgewars/uConsts.pas --- a/hedgewars/uConsts.pas Sat May 17 22:21:45 2008 +0000 +++ b/hedgewars/uConsts.pas Sun May 18 10:54:43 2008 +0000 @@ -436,6 +436,7 @@ TimeAfterTurn: Longword; minAngle, maxAngle: Longword; isDamaging: boolean; + SkipTurns: Longword; PosCount: Longword; PosSprite: TSprite; end = ( @@ -456,6 +457,7 @@ minAngle: 0; maxAngle: 0; isDamaging: true; + SkipTurns: 0; PosCount: 1; PosSprite: sprWater), (NameId: sidClusterBomb; @@ -475,6 +477,7 @@ minAngle: 0; maxAngle: 0; isDamaging: true; + SkipTurns: 0; PosCount: 1; PosSprite: sprWater), (NameId: sidBazooka; @@ -493,6 +496,7 @@ minAngle: 0; maxAngle: 0; isDamaging: true; + SkipTurns: 0; PosCount: 1; PosSprite: sprWater), (NameId: sidUFO; @@ -512,6 +516,7 @@ minAngle: 0; maxAngle: 0; isDamaging: true; + SkipTurns: 0; PosCount: 1; PosSprite: sprWater), (NameId: sidShotgun; @@ -529,6 +534,7 @@ minAngle: 0; maxAngle: 0; isDamaging: true; + SkipTurns: 0; PosCount: 1; PosSprite: sprWater), (NameId: sidPickHammer; @@ -549,6 +555,7 @@ minAngle: 0; maxAngle: 0; isDamaging: false; + SkipTurns: 0; PosCount: 1; PosSprite: sprWater), (NameId: sidSkip; @@ -566,6 +573,7 @@ minAngle: 0; maxAngle: 0; isDamaging: false; + SkipTurns: 0; PosCount: 1; PosSprite: sprWater), (NameId: sidRope; @@ -586,6 +594,7 @@ minAngle: 0; maxAngle: cMaxAngle div 2; isDamaging: false; + SkipTurns: 0; PosCount: 1; PosSprite: sprWater), (NameId: sidMine; @@ -606,6 +615,7 @@ minAngle: 0; maxAngle: 0; isDamaging: true; + SkipTurns: 0; PosCount: 1; PosSprite: sprWater), (NameId: sidDEagle; @@ -623,6 +633,7 @@ minAngle: 0; maxAngle: 0; isDamaging: true; + SkipTurns: 0; PosCount: 1; PosSprite: sprWater), (NameId: sidDynamite; @@ -643,6 +654,7 @@ minAngle: 0; maxAngle: 0; isDamaging: true; + SkipTurns: 0; PosCount: 1; PosSprite: sprWater), (NameId: sidFirePunch; @@ -662,6 +674,7 @@ MinAngle: 0; maxAngle: 0; isDamaging: true; + SkipTurns: 0; PosCount: 1; PosSprite: sprWater), (NameId: sidWhip; @@ -679,6 +692,7 @@ MinAngle: 0; maxAngle: 0; isDamaging: true; + SkipTurns: 0; PosCount: 1; PosSprite: sprWater), (NameId: sidBaseballBat; @@ -696,6 +710,7 @@ minAngle: 0; maxAngle: cMaxAngle div 2; isDamaging: true; + SkipTurns: 2; PosCount: 1; PosSprite: sprWater), (NameId: sidParachute; @@ -717,6 +732,7 @@ minAngle: 0; maxAngle: 0; isDamaging: false; + SkipTurns: 0; PosCount: 1; PosSprite: sprWater), (NameId: sidAirAttack; @@ -737,6 +753,7 @@ minAngle: 0; maxAngle: 0; isDamaging: true; + SkipTurns: 5; PosCount: 2; PosSprite: sprAmAirplane), (NameId: sidMineStrike; @@ -757,6 +774,7 @@ minAngle: 0; maxAngle: 0; isDamaging: true; + SkipTurns: 5; PosCount: 2; PosSprite: sprAmAirplane), (NameId: sidBlowTorch; @@ -774,6 +792,7 @@ minAngle: 768; maxAngle: 1280; isDamaging: false; + SkipTurns: 0; PosCount: 1; PosSprite: sprWater), (NameId: sidGirder; @@ -794,6 +813,7 @@ minAngle: 0; maxAngle: 0; isDamaging: false; + SkipTurns: 0; PosCount: 8; PosSprite: sprAmGirder), (NameId: sidTeleport; @@ -815,6 +835,7 @@ minAngle: 0; maxAngle: 0; isDamaging: false; + SkipTurns: 0; PosCount: 1; PosSprite: sprWater), (NameId: sidSwitch; @@ -834,6 +855,7 @@ minAngle: 0; maxAngle: 0; isDamaging: false; + SkipTurns: 0; PosCount: 1; PosSprite: sprWater), (NameId: sidMortar; @@ -851,6 +873,7 @@ minAngle: 0; maxAngle: 0; isDamaging: true; + SkipTurns: 0; PosCount: 1; PosSprite: sprWater) ); diff -r 769adb0ad082 -r b5222ddafe1f hedgewars/uTeams.pas --- a/hedgewars/uTeams.pas Sat May 17 22:21:45 2008 +0000 +++ b/hedgewars/uTeams.pas Sun May 18 10:54:43 2008 +0000 @@ -68,6 +68,7 @@ CurrTeam: LongWord; ClanHealth: LongInt; ClanIndex: LongInt; + TurnNumber: LongWord; end; var CurrentTeam: PTeam = nil; @@ -181,6 +182,9 @@ InsertGearToList(Gear); FollowGear:= Gear end; + +inc(CurrentTeam^.Clan^.TurnNumber); + ResetKbd; cWindSpeed:= rndSign(GetRandom * cMaxWindSpeed);