Ammo schemes and ammo stores support in engine
authorunc0rr
Tue, 05 Dec 2006 17:27:27 +0000
changeset 288 929c44745fd9
parent 287 b0eef98928f8
child 289 604c4a779c20
Ammo schemes and ammo stores support in engine
hedgewars/CCHandlers.inc
hedgewars/CMakeLists.txt
hedgewars/hwengine.dpr
hedgewars/uAmmos.pas
hedgewars/uConsole.pas
hedgewars/uTeams.pas
--- a/hedgewars/CCHandlers.inc	Thu Nov 30 22:36:07 2006 +0000
+++ b/hedgewars/CCHandlers.inc	Tue Dec 05 17:27:27 2006 +0000
@@ -117,11 +117,17 @@
    Gear:= AddGear(0, 0, gtHedgehog, 0);
    Gear.Hedgehog:= @CurrentTeam.Hedgehogs[b];
    PHedgehog(Gear.Hedgehog).Team:= CurrentTeam;
+   CurrentTeam.Hedgehogs[b].AmmoStore:= 0;
    CurrentTeam.Hedgehogs[b].Gear:= Gear
    end
 else OutError(errmsgUnknownVariable + ' "' + id + '"', true)
 end;
 
+procedure chAddAmmoStore(var descr: shortstring);
+begin
+AddAmmoStore(descr)
+end;
+
 procedure chBind(var id: shortstring);
 var s: shortstring;
     b: integer;
--- a/hedgewars/CMakeLists.txt	Thu Nov 30 22:36:07 2006 +0000
+++ b/hedgewars/CMakeLists.txt	Tue Dec 05 17:27:27 2006 +0000
@@ -13,6 +13,7 @@
 	uAIAmmoTests.pas
 	uAIMisc.pas
 	uAIThinkStack.pas
+	uAmmos.pas
 	uCollisions.pas
 	uConsole.pas
 	uConsts.pas
--- a/hedgewars/hwengine.dpr	Thu Nov 30 22:36:07 2006 +0000
+++ b/hedgewars/hwengine.dpr	Tue Dec 05 17:27:27 2006 +0000
@@ -41,7 +41,8 @@
   uLandTemplates in 'uLandTemplates.pas',
   uLandObjects in 'uLandObjects.pas',
   uLandGraphics in 'uLandGraphics.pas',
-  uLocale in 'uLocale.pas';
+  uLocale in 'uLocale.pas',
+  uAmmos in 'uAmmos.pas';
 
 {$INCLUDE options.inc}
 
@@ -218,6 +219,8 @@
 SendIPCRaw(@s[0], Length(s) + 1); // send proto version
 
 InitTeams;
+ParseCommand('ammstore 1111111111111119');
+AssignStores;
 
 if isSoundEnabled then InitSound;
 InitWorld;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hedgewars/uAmmos.pas	Tue Dec 05 17:27:27 2006 +0000
@@ -0,0 +1,65 @@
+unit uAmmos;
+interface
+uses uConsts;
+{$INCLUDE options.inc}
+type PHHAmmo = ^THHAmmo;
+     THHAmmo = array[0..cMaxSlotIndex, 0..cMaxSlotAmmoIndex] of TAmmo;
+
+procedure AddAmmoStore(s: shortstring);
+procedure AssignStores;
+
+implementation
+uses uMisc, uTeams;
+var StoresList: array[0..Pred(cMaxHHs)] of PHHAmmo;
+    StoreCnt: Longword = 0;
+
+procedure AddAmmoStore(s: shortstring);
+var mi: array[0..cMaxSlotIndex] of byte;
+    a: TAmmoType;
+    cnt: Longword;
+    tmp: PHHAmmo;
+begin
+TryDo(byte(s[0]) = byte(ord(High(TAmmoType)) + 1), 'Invalid ammo scheme (incompatible frontend)', true);
+
+inc(StoreCnt);
+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
+    end;
+end;
+
+function GetAmmoByNum(num: Longword): PHHAmmo;
+begin
+TryDo(num < StoreCnt, 'Invalid store number', true);
+Result:= StoresList[num]
+end;
+
+procedure AssignStores;
+var tteam: PTeam;
+    i: Longword;
+begin
+tteam:= TeamsList;
+while tteam <> nil do
+      begin
+      for i:= 0 to cMaxHHIndex do
+          if tteam.Hedgehogs[i].Gear <> nil then
+             tteam.Hedgehogs[i].Ammo:= GetAmmoByNum(tteam.Hedgehogs[i].AmmoStore);
+      tteam:= tteam.Next
+      end
+end;
+
+end.
--- a/hedgewars/uConsole.pas	Thu Nov 30 22:36:07 2006 +0000
+++ b/hedgewars/uConsole.pas	Tue Dec 05 17:27:27 2006 +0000
@@ -33,7 +33,8 @@
 
 implementation
 {$J+}
-uses uMisc, uStore, Types, uConsts, uGears, uTeams, uIO, uKeys, uWorld, uLand, uRandom;
+uses uMisc, uStore, Types, uConsts, uGears, uTeams, uIO, uKeys, uWorld, uLand,
+     uRandom, uAmmos;
 const cLineWidth: integer = 0;
       cLinesCount = 256;
       
@@ -276,6 +277,7 @@
 RegisterVariable('grave'   , vtCommand, @chGrave        , false);
 RegisterVariable('bind'    , vtCommand, @chBind         , true );
 RegisterVariable('add'     , vtCommand, @chAdd          , false);
+RegisterVariable('ammstore', vtCommand, @chAddAmmoStore , false);
 RegisterVariable('skip'    , vtCommand, @chSkip         , false);
 RegisterVariable('say'     , vtCommand, @chSay          , true );
 RegisterVariable('ammomenu', vtCommand, @chAmmoMenu     , false);
--- a/hedgewars/uTeams.pas	Thu Nov 30 22:36:07 2006 +0000
+++ b/hedgewars/uTeams.pas	Tue Dec 05 17:27:27 2006 +0000
@@ -18,16 +18,16 @@
 
 unit uTeams;
 interface
-uses SDLh, uConsts, uKeys, uGears, uRandom;
+uses SDLh, uConsts, uKeys, uGears, uRandom, uAmmos;
 {$INCLUDE options.inc}
 type PHedgehog = ^THedgehog;
      PTeam     = ^TTeam;
-     PHHAmmo   = ^THHAmmo;
      THedgehog = record
                  Name: string[MAXNAMELEN];
                  Gear: PGear;
                  NameTag, HealthTag: PSDL_Surface;
                  Ammo: PHHAmmo;
+                 AmmoStore: Longword;
                  CurSlot, CurAmmo: LongWord;
                  AltSlot, AltAmmo: LongWord;
                  Team: PTeam;
@@ -35,7 +35,6 @@
                  visStepPos: LongWord;
                  BotLevel  : LongWord; // 0 - Human player
                  end;
-     THHAmmo   = array[0..cMaxSlotIndex, 0..cMaxSlotAmmoIndex] of TAmmo;
      TTeam = record
              Next: PTeam;
              Color, AdjColor: Longword;
@@ -181,19 +180,6 @@
       end;
 end;
 
-procedure FillAmmoGroup(Ammo: PHHAmmo);
-var mi: array[0..cMaxSlotIndex] of byte;
-    a: TAmmoType;
-begin
-FillChar(mi, sizeof(mi), 0);
-for a:= Low(TAmmoType) to High(TAmmoType) do
-    begin
-    TryDo(mi[Ammoz[a].Slot] <= cMaxSlotAmmoIndex, 'Ammo slot overflow', true);
-    Ammo^[Ammoz[a].Slot, mi[Ammoz[a].Slot]]:= Ammoz[a].Ammo;
-    inc(mi[Ammoz[a].Slot])
-    end;
-end;
-
 procedure RecountAllTeamsHealth;
 var p: PTeam;
 begin
@@ -214,14 +200,11 @@
 while p <> nil do
       begin
       th:= 0;
-      FillAmmoGroup(@p.Ammos[0]);
       for i:= 0 to cMaxHHIndex do
           if p.Hedgehogs[i].Gear <> nil then
              begin
              p.Hedgehogs[i].Gear.Health:= 100;
              inc(th, 100);
-             p.Hedgehogs[i].Ammo:= @p.Ammos[0] // 0 means all hedgehogs
-             // will have common set of ammo
              end;
       if th > MaxTeamHealth then MaxTeamHealth:= th;
       p:= p.Next
@@ -239,7 +222,8 @@
      if Ammo[CurSlot, CurAmmo].Count = 0 then
         begin
         CurAmmo:= 0;
-        while (CurAmmo <= cMaxSlotAmmoIndex) and (Ammo[CurSlot, CurAmmo].Count = 0) do inc(CurAmmo)
+        CurSlot:= 0;
+        while (CurSlot <= cMaxSlotIndex) and (Ammo[CurSlot, CurAmmo].Count = 0) do inc(CurSlot)
         end;
 
 with Ammo[CurSlot, CurAmmo] do