--- a/hedgewars/uAmmos.pas Sun Dec 10 12:09:32 2006 +0000
+++ b/hedgewars/uAmmos.pas Sun Dec 10 15:55:53 2006 +0000
@@ -7,17 +7,37 @@
procedure AddAmmoStore(s: shortstring);
procedure AssignStores;
+procedure AddAmmo(Hedgehog: pointer; ammo: TAmmoType);
+function HHHasAmmo(Hedgehog: pointer; Ammo: TAmmoType): boolean;
+procedure PackAmmo(Ammo: PHHAmmo; Slot: integer);
+procedure OnUsedAmmo(Ammo: PHHAmmo);
implementation
-uses uMisc, uTeams;
+uses uMisc, uTeams, uGears;
+type TAmmoCounts = array[TAmmoType] of Longword;
var StoresList: array[0..Pred(cMaxHHs)] of PHHAmmo;
StoreCnt: Longword = 0;
-procedure AddAmmoStore(s: shortstring);
+procedure FillAmmoStore(Ammo: PHHAmmo; var cnts: TAmmoCounts);
var mi: array[0..cMaxSlotIndex] of byte;
a: TAmmoType;
- cnt: Longword;
- tmp: PHHAmmo;
+begin
+FillChar(mi, sizeof(mi), 0);
+FillChar(Ammo^, sizeof(Ammo^), 0);
+for a:= Low(TAmmoType) to High(TAmmoType) do
+ if cnts[a] > 0 then
+ begin
+ TryDo(mi[Ammoz[a].Slot] <= cMaxSlotAmmoIndex, 'Ammo slot overflow', true);
+ Ammo[Ammoz[a].Slot, mi[Ammoz[a].Slot]]:= Ammoz[a].Ammo;
+ Ammo[Ammoz[a].Slot, mi[Ammoz[a].Slot]].Count:= cnts[a];
+ inc(mi[Ammoz[a].Slot])
+ end
+end;
+
+procedure AddAmmoStore(s: shortstring);
+var cnt: Longword;
+ a: TAmmoType;
+ ammos: TAmmoCounts;
begin
TryDo(byte(s[0]) = byte(ord(High(TAmmoType)) + 1), 'Invalid ammo scheme (incompatible frontend)', true);
@@ -25,21 +45,15 @@
TryDo(StoreCnt <= cMaxHHs, 'Ammo stores overflow', true);
new(StoresList[Pred(StoreCnt)]);
-tmp:= StoresList[Pred(StoreCnt)];
-FillChar(mi, sizeof(mi), 0);
for a:= Low(TAmmoType) to High(TAmmoType) do
begin
cnt:= byte(s[ord(a) + 1]) - byte('0');
- if cnt > 0 then
- begin
- if cnt >= 9 then cnt:= AMMO_INFINITE;
- TryDo(mi[Ammoz[a].Slot] <= cMaxSlotAmmoIndex, 'Ammo slot overflow', true);
- tmp[Ammoz[a].Slot, mi[Ammoz[a].Slot]]:= Ammoz[a].Ammo;
- tmp[Ammoz[a].Slot, mi[Ammoz[a].Slot]].Count:= cnt;
- inc(mi[Ammoz[a].Slot])
- end
+ if cnt = 9 then cnt:= AMMO_INFINITE;
+ ammos[a]:= cnt
end;
+
+FillAmmoStore(StoresList[Pred(StoreCnt)], ammos)
end;
function GetAmmoByNum(num: Longword): PHHAmmo;
@@ -62,4 +76,70 @@
end
end;
+procedure AddAmmo(Hedgehog: pointer; ammo: TAmmoType);
+var ammos: TAmmoCounts;
+ slot, ami: integer;
+ hhammo: PHHAmmo;
+begin
+FillChar(ammos, sizeof(ammos), 0);
+hhammo:= PHedgehog(Hedgehog).Ammo;
+
+for slot:= 0 to cMaxSlotIndex do
+ for ami:= 0 to cMaxSlotAmmoIndex do
+ 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]);
+FillAmmoStore(hhammo, ammos)
+end;
+
+procedure PackAmmo(Ammo: PHHAmmo; Slot: integer);
+var ami: integer;
+ b: boolean;
+begin
+ repeat
+ b:= false;
+ ami:= 0;
+ while (not b) and (ami < cMaxSlotAmmoIndex) do
+ if (Ammo[Slot, ami].Count = 0)
+ and (Ammo[Slot, ami + 1].Count > 0) then b:= true
+ else inc(ami);
+ if b then // there's a free item in ammo stack
+ begin
+ Ammo[Slot, ami]:= Ammo[Slot, ami + 1];
+ Ammo[Slot, ami + 1].Count:= 0
+ end;
+ until not b;
+end;
+
+procedure OnUsedAmmo(Ammo: PHHAmmo);
+var s, a: Longword;
+begin
+with CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog] do
+ begin
+ if CurAmmoGear = nil then begin s:= CurSlot; a:= CurAmmo end
+ else begin s:= AltSlot; a:= AltAmmo end;
+ with Ammo[s, a] do
+ if Count <> AMMO_INFINITE then
+ begin
+ dec(Count);
+ if Count = 0 then PackAmmo(Ammo, CurSlot)
+ end
+ end
+end;
+
+function HHHasAmmo(Hedgehog: pointer; Ammo: TAmmoType): boolean;
+var slot, ami: integer;
+begin
+Slot:= Ammoz[Ammo].Slot;
+ami:= 0;
+Result:= false;
+while (not Result) and (ami <= cMaxSlotAmmoIndex) do
+ begin
+ with PHedgehog(Hedgehog).Ammo[Slot, ami] do
+ if (AmmoType = Ammo) and (Count > 0) then Result:= true;
+ inc(ami)
+ end
+end;
+
end.