|
1 unit uAmmos; |
|
2 interface |
|
3 uses uConsts; |
|
4 {$INCLUDE options.inc} |
|
5 type PHHAmmo = ^THHAmmo; |
|
6 THHAmmo = array[0..cMaxSlotIndex, 0..cMaxSlotAmmoIndex] of TAmmo; |
|
7 |
|
8 procedure AddAmmoStore(s: shortstring); |
|
9 procedure AssignStores; |
|
10 |
|
11 implementation |
|
12 uses uMisc, uTeams; |
|
13 var StoresList: array[0..Pred(cMaxHHs)] of PHHAmmo; |
|
14 StoreCnt: Longword = 0; |
|
15 |
|
16 procedure AddAmmoStore(s: shortstring); |
|
17 var mi: array[0..cMaxSlotIndex] of byte; |
|
18 a: TAmmoType; |
|
19 cnt: Longword; |
|
20 tmp: PHHAmmo; |
|
21 begin |
|
22 TryDo(byte(s[0]) = byte(ord(High(TAmmoType)) + 1), 'Invalid ammo scheme (incompatible frontend)', true); |
|
23 |
|
24 inc(StoreCnt); |
|
25 TryDo(StoreCnt <= cMaxHHs, 'Ammo stores overflow', true); |
|
26 |
|
27 new(StoresList[Pred(StoreCnt)]); |
|
28 tmp:= StoresList[Pred(StoreCnt)]; |
|
29 |
|
30 FillChar(mi, sizeof(mi), 0); |
|
31 for a:= Low(TAmmoType) to High(TAmmoType) do |
|
32 begin |
|
33 cnt:= byte(s[ord(a) + 1]) - byte('0'); |
|
34 if cnt > 0 then |
|
35 begin |
|
36 if cnt >= 9 then cnt:= AMMO_INFINITE; |
|
37 TryDo(mi[Ammoz[a].Slot] <= cMaxSlotAmmoIndex, 'Ammo slot overflow', true); |
|
38 tmp[Ammoz[a].Slot, mi[Ammoz[a].Slot]]:= Ammoz[a].Ammo; |
|
39 tmp[Ammoz[a].Slot, mi[Ammoz[a].Slot]].Count:= cnt; |
|
40 inc(mi[Ammoz[a].Slot]) |
|
41 end |
|
42 end; |
|
43 end; |
|
44 |
|
45 function GetAmmoByNum(num: Longword): PHHAmmo; |
|
46 begin |
|
47 TryDo(num < StoreCnt, 'Invalid store number', true); |
|
48 Result:= StoresList[num] |
|
49 end; |
|
50 |
|
51 procedure AssignStores; |
|
52 var tteam: PTeam; |
|
53 i: Longword; |
|
54 begin |
|
55 tteam:= TeamsList; |
|
56 while tteam <> nil do |
|
57 begin |
|
58 for i:= 0 to cMaxHHIndex do |
|
59 if tteam.Hedgehogs[i].Gear <> nil then |
|
60 tteam.Hedgehogs[i].Ammo:= GetAmmoByNum(tteam.Hedgehogs[i].AmmoStore); |
|
61 tteam:= tteam.Next |
|
62 end |
|
63 end; |
|
64 |
|
65 end. |