Add an empty weapon to avoid selection of weapons which aren't yet ready. Might all be useful to switch to amNothing in certain situations, like after using up all ropes, instead of bazooka.
authornemo
Tue, 08 Sep 2009 19:44:49 +0000
changeset 2357 babe1a55e284
parent 2356 b756432fd422
child 2358 d4a9c309eb14
Add an empty weapon to avoid selection of weapons which aren't yet ready. Might all be useful to switch to amNothing in certain situations, like after using up all ropes, instead of bazooka.
hedgewars/uAIAmmoTests.pas
hedgewars/uAmmos.pas
hedgewars/uConsts.pas
hedgewars/uLocale.pas
hedgewars/uWorld.pas
--- a/hedgewars/uAIAmmoTests.pas	Tue Sep 08 16:58:43 2009 +0000
+++ b/hedgewars/uAIAmmoTests.pas	Tue Sep 08 19:44:49 2009 +0000
@@ -45,6 +45,7 @@
 
 const AmmoTests: array[TAmmoType] of TAmmoTest =
 			(
+			(proc: nil;              flags: 0), // amNothing
 			(proc: @TestGrenade;     flags: 0), // amGrenade
 			(proc: nil;              flags: 0), // amClusterBomb
 			(proc: @TestBazooka;     flags: 0), // amBazooka
--- a/hedgewars/uAmmos.pas	Tue Sep 08 16:58:43 2009 +0000
+++ b/hedgewars/uAmmos.pas	Tue Sep 08 19:44:49 2009 +0000
@@ -63,7 +63,7 @@
     ammos: TAmmoCounts;
     substr: shortstring; // TEMPORARY
 begin
-TryDo(byte(s[0]) = byte(ord(High(TAmmoType)) + 1), 'Invalid ammo scheme (incompatible frontend)', true);
+TryDo(byte(s[0]) = byte(ord(High(TAmmoType))), 'Invalid ammo scheme (incompatible frontend)', true);
 
 // FIXME - TEMPORARY hardcoded check on shoppa pending creation of probability editor
 substr:= Copy(s,1,15);
@@ -71,7 +71,7 @@
    (substr = '000000990000000') then
     shoppa:= true;
 for a:= Low(TAmmoType) to High(TAmmoType) do
-    if (ord(a) > 14) and (s[ord(a)+1] <> '0') then shoppa:= false;  // TEMPORARY etc - this just avoids updating every time new wep is added
+    if (ord(a) > 14) and (s[ord(a)] <> '0') then shoppa:= false;  // TEMPORARY etc - this just avoids updating every time new wep is added
 inc(StoreCnt);
 TryDo(StoreCnt <= cMaxHHs, 'Ammo stores overflow', true);
 
@@ -79,32 +79,35 @@
 
 for a:= Low(TAmmoType) to High(TAmmoType) do
     begin
-    cnt:= byte(s[ord(a) + 1]) - byte('0');
-    if cnt = 9 then
-        begin
-        cnt:= AMMO_INFINITE;
-        Ammoz[a].Probability:= 0 
-        end;
-    if ((a = amLowGravity) and ((GameFlags and gfLowGravity) <> 0)) or
-       ((a = amInvulnerable) and ((GameFlags and gfInvulnerable) <> 0)) or
-       ((a = amLaserSight) and ((GameFlags and gfLaserSight) <> 0)) or
-       ((a = amVampiric) and ((GameFlags and gfVampiric) <> 0)) then
+    if a <> amNothing then
         begin
-        cnt:= 0;
-        Ammoz[a].Probability:= 0 
-        end
-    else if shoppa then      // FIXME - TEMPORARY REMOVE WHEN CRATE PROBABILITY IS ADDED
-        if cnt <> AMMO_INFINITE then
+        cnt:= byte(s[ord(a)]) - byte('0');
+        if cnt = 9 then
+            begin
+            cnt:= AMMO_INFINITE;
+            Ammoz[a].Probability:= 0 
+            end;
+        if ((a = amLowGravity) and ((GameFlags and gfLowGravity) <> 0)) or
+           ((a = amInvulnerable) and ((GameFlags and gfInvulnerable) <> 0)) or
+           ((a = amLaserSight) and ((GameFlags and gfLaserSight) <> 0)) or
+           ((a = amVampiric) and ((GameFlags and gfVampiric) <> 0)) then
             begin
-            if a = amGirder then
-                Ammoz[a].Probability:= 0
-            else
+            cnt:= 0;
+            Ammoz[a].Probability:= 0 
+            end
+        else if shoppa then      // FIXME - TEMPORARY REMOVE WHEN CRATE PROBABILITY IS ADDED
+            if cnt <> AMMO_INFINITE then
                 begin
-                Ammoz[a].Probability:= 100;
-                Ammoz[a].NumberInCase:= 1;
-                end
-            end;
-    ammos[a]:= cnt
+                if a = amGirder then
+                    Ammoz[a].Probability:= 0
+                else
+                    begin
+                    Ammoz[a].Probability:= 100;
+                    Ammoz[a].NumberInCase:= 1;
+                    end
+                end;
+        ammos[a]:= cnt
+        end
     end;
 
 FillAmmoStore(StoresList[Pred(StoreCnt)], ammos)
@@ -238,12 +241,15 @@
 
 	with Ammo^[CurSlot, CurAmmo] do
 		begin
-		s:= trammo[Ammoz[AmmoType].NameId];
-		if (Count <> AMMO_INFINITE) and not (Hedgehog.Team^.ExtDriven or (Hedgehog.BotLevel > 0)) then
-			s:= s + ' (' + IntToStr(Count) + ')';
-		if (Propz and ammoprop_Timerable) <> 0 then
-			s:= s + ', ' + inttostr(Timer div 1000) + ' ' + trammo[sidSeconds];
-		AddCaption(s, Team^.Clan^.Color, capgrpAmmoinfo);
+        if AmmoType <> amNothing then
+            begin
+		    s:= trammo[Ammoz[AmmoType].NameId];
+		    if (Count <> AMMO_INFINITE) and not (Hedgehog.Team^.ExtDriven or (Hedgehog.BotLevel > 0)) then
+			    s:= s + ' (' + IntToStr(Count) + ')';
+		    if (Propz and ammoprop_Timerable) <> 0 then
+			    s:= s + ', ' + inttostr(Timer div 1000) + ' ' + trammo[sidSeconds];
+		    AddCaption(s, Team^.Clan^.Color, capgrpAmmoinfo);
+            end;
 		if (Propz and ammoprop_NeedTarget) <> 0
 			then begin
 			Gear^.State:= Gear^.State or      gstHHChooseTarget;
--- a/hedgewars/uConsts.pas	Tue Sep 08 16:58:43 2009 +0000
+++ b/hedgewars/uConsts.pas	Tue Sep 08 19:44:49 2009 +0000
@@ -95,7 +95,7 @@
 			sndRideOfTheValkyries, sndDenied, sndPlaced, sndBaseballBat, 
 			sndVaporize, sndWarp, sndSuddenDeath, sndMortar, sndShutter);
 
-	TAmmoType  = (amGrenade, amClusterBomb, amBazooka, amUFO, amShotgun, amPickHammer,
+	TAmmoType  = (amNothing, amGrenade, amClusterBomb, amBazooka, amUFO, amShotgun, amPickHammer,
 			amSkip, amRope, amMine, amDEagle, amDynamite, amFirePunch, amWhip,
 			amBaseballBat, amParachute, amAirAttack, amMineStrike, amBlowTorch,
 			amGirder, amTeleport, amSwitch, amMortar, amKamikaze, amCake,
@@ -681,6 +681,26 @@
 			PosCount: Longword;
 			PosSprite: TSprite;
 			end = (
+			(NameId: sidNothing;
+			NameTex: nil;
+			Probability: 0;
+			NumberInCase: 0;
+			Ammo: (Propz: ammoprop_NoCrosshair or
+						  ammoprop_DontHold or
+                          ammoprop_Utility;
+					Count: AMMO_INFINITE;
+					NumPerTurn: 0;
+					Timer: 0;
+					Pos: 0;
+					AmmoType: amNothing);
+			Slot: 0;
+			TimeAfterTurn: 0;
+			minAngle: 0;
+			maxAngle: 0;
+			isDamaging: false;
+			SkipTurns: 9999;
+			PosCount: 1;
+			PosSprite: sprWater),
 			(NameId: sidGrenade;
 			NameTex: nil;
 			Probability: 0;
--- a/hedgewars/uLocale.pas	Tue Sep 08 16:58:43 2009 +0000
+++ b/hedgewars/uLocale.pas	Tue Sep 08 19:44:49 2009 +0000
@@ -18,7 +18,7 @@
 
 unit uLocale;
 interface
-type TAmmoStrId = (sidGrenade, sidClusterBomb, sidBazooka, sidUFO, sidShotgun,
+type TAmmoStrId = (sidNothing, sidGrenade, sidClusterBomb, sidBazooka, sidUFO, sidShotgun,
 			sidPickHammer, sidSkip, sidRope, sidMine, sidDEagle,
 			sidDynamite, sidBaseballBat, sidFirePunch, sidSeconds,
 			sidParachute, sidAirAttack, sidMineStrike, sidBlowTorch,
@@ -56,7 +56,7 @@
 	first: array[TEventId] of boolean;
 	e: TEventId;
 begin
-
+trammo[sidNothing]:= ' ';
 for e:= Low(TEventId) to High(TEventId) do first[e]:= true;
 
 {$I-}
@@ -77,7 +77,7 @@
 	TryDo(s[6] = '=', 'Load locale: "=" expected', true);
 	Delete(s, 1, 6);
 	case a of
-		0: if (b >=0) and (b <= ord(High(TAmmoStrId))) then trammo[TAmmoStrId(b)]:= s;
+		0: if (b >=0) and (b <= ord(High(TAmmoStrId))) then trammo[TAmmoStrId(b+1)]:= s;
 		1: if (b >=0) and (b <= ord(High(TMsgStrId))) then trmsg[TMsgStrId(b)]:= s;
 		2: if (b >=0) and (b <= ord(High(TEventId))) then begin
 			TryDo(trevt_n[TEventId(b)] < MAX_EVENT_STRINGS, 'Too many event strings in ' + inttostr(a) + ':' + inttostr(b), false);
--- a/hedgewars/uWorld.pas	Tue Sep 08 16:58:43 2009 +0000
+++ b/hedgewars/uWorld.pas	Tue Sep 08 19:44:49 2009 +0000
@@ -123,7 +123,7 @@
 	dec(y, 33);
 	DrawSprite(sprAMSlotName, x, y, 0);
 	for i:= cMaxSlotIndex downto 0 do
-		if Ammo^[i, 0].Count > 0 then
+		if (Ammo^[i, 0].Count > 0) and (Ammo^[i, 0].AmmoType <> amNothing) then
 			begin
 			if (cScreenHeight - CursorPoint.Y >= y - 33) and (cScreenHeight - CursorPoint.Y < y) then Slot:= i;
 			dec(y, 33);
@@ -137,10 +137,10 @@
 
 				if l >= 0 then
 					begin
-					DrawSprite(sprAMAmmosBW, x + t * 33 + 35, y + 1, LongInt(Ammo^[i, t].AmmoType));
+					DrawSprite(sprAMAmmosBW, x + t * 33 + 35, y + 1, LongInt(Ammo^[i, t].AmmoType)-1);
 					DrawSprite(sprTurnsLeft, x + t * 33 + 51, y + 17, l);
 					end else
-					DrawSprite(sprAMAmmos, x + t * 33 + 35, y + 1, LongInt(Ammo^[i, t].AmmoType));
+					DrawSprite(sprAMAmmos, x + t * 33 + 35, y + 1, LongInt(Ammo^[i, t].AmmoType)-1);
 
 				if (Slot = i)
 				and (CursorPoint.X >= x + t * 33 + 35)
@@ -156,7 +156,7 @@
 	DrawSprite(sprAMBorders, x, y, 0);
 
 	if (Pos >= 0) then
-		if Ammo^[Slot, Pos].Count > 0 then
+		if (Ammo^[Slot, Pos].Count > 0) and (Ammo^[Slot, Pos].AmmoType <> amNothing) then
 		begin
 		DrawTexture(cScreenWidth div 2 - 200 + AMxShift, cScreenHeight - 68, Ammoz[Ammo^[Slot, Pos].AmmoType].NameTex);