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.
--- 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);