hedgewars/uAmmos.pas
changeset 295 8834f3cb620e
parent 288 929c44745fd9
child 351 29bc9c36ad5f
--- 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.