7 g_textures
, g_phys
, g_saveload
, BinEditor
;
13 InitX
, InitY
: Integer;
17 QuietRespawn
: Boolean;
18 SpawnTrigger
: Integer;
20 Animation
: TAnimation
;
23 procedure g_Items_LoadData();
24 procedure g_Items_FreeData();
25 procedure g_Items_Init();
26 procedure g_Items_Free();
27 function g_Items_Create(X
, Y
: Integer; ItemType
: Byte;
28 Fall
, Respawnable
: Boolean; AdjCoord
: Boolean = False; ForcedID
: Integer = -1): DWORD
;
29 procedure g_Items_Update();
30 procedure g_Items_Draw();
31 procedure g_Items_Pick(ID
: DWORD
);
32 procedure g_Items_Remove(ID
: DWORD
);
33 procedure g_Items_SaveState(var Mem
: TBinMemoryWriter
);
34 procedure g_Items_LoadState(var Mem
: TBinMemoryReader
);
37 gItems
: Array of TItem
= nil;
38 gItemsTexturesID
: Array [1..35] of DWORD
;
39 gMaxDist
: Integer = 1;
40 ITEM_RESPAWNTIME
: Integer = 60 * 36;
45 g_basic
, e_graphics
, g_sound
, g_main
, g_gfx
, g_map
,
46 Math
, g_game
, g_triggers
, g_console
, SysUtils
, g_player
, g_net
, g_netmsg
,
50 ITEM_SIGNATURE
= $4D455449; // 'ITEM'
52 ITEMSIZE
: Array [ITEM_MEDKIT_SMALL
..ITEM_MAX
] of Array [0..1] of Byte =
53 (((14), (15)), // MEDKIT_SMALL
54 ((28), (19)), // MEDKIT_LARGE
55 ((28), (19)), // MEDKIT_BLACK
56 ((31), (16)), // ARMOR_GREEN
57 ((31), (16)), // ARMOR_BLUE
58 ((25), (25)), // SPHERE_BLUE
59 ((25), (25)), // SPHERE_WHITE
61 ((14), (27)), // OXYGEN
62 ((25), (25)), // INVUL
63 ((62), (24)), // WEAPON_SAW
64 ((63), (12)), // WEAPON_SHOTGUN1
65 ((54), (13)), // WEAPON_SHOTGUN2
66 ((54), (16)), // WEAPON_CHAINGUN
67 ((62), (16)), // WEAPON_ROCKETLAUNCHER
68 ((54), (16)), // WEAPON_PLASMA
69 ((61), (36)), // WEAPON_BFG
70 ((54), (16)), // WEAPON_SUPERPULEMET
71 (( 9), (11)), // AMMO_BULLETS
72 ((28), (16)), // AMMO_BULLETS_BOX
73 ((15), ( 7)), // AMMO_SHELLS
74 ((32), (12)), // AMMO_SHELLS_BOX
75 ((12), (27)), // AMMO_ROCKET
76 ((54), (21)), // AMMO_ROCKET_BOX
77 ((15), (12)), // AMMO_CELL
78 ((32), (21)), // AMMO_CELL_BIG
79 ((22), (29)), // AMMO_BACKPACK
80 ((16), (16)), // KEY_RED
81 ((16), (16)), // KEY_GREEN
82 ((16), (16)), // KEY_BLUE
83 (( 1), ( 1)), // WEAPON_KASTET
84 ((43), (16)), // WEAPON_PISTOL
85 ((14), (18)), // BOTTLE
86 ((16), (15)), // HELMET
87 ((32), (24)), // JETPACK
88 ((25), (25))); // INVIS
90 procedure InitTextures();
92 g_Texture_Get('ITEM_MEDKIT_SMALL', gItemsTexturesID
[ITEM_MEDKIT_SMALL
]);
93 g_Texture_Get('ITEM_MEDKIT_LARGE', gItemsTexturesID
[ITEM_MEDKIT_LARGE
]);
94 g_Texture_Get('ITEM_MEDKIT_BLACK', gItemsTexturesID
[ITEM_MEDKIT_BLACK
]);
95 g_Texture_Get('ITEM_SUIT', gItemsTexturesID
[ITEM_SUIT
]);
96 g_Texture_Get('ITEM_OXYGEN', gItemsTexturesID
[ITEM_OXYGEN
]);
97 g_Texture_Get('ITEM_WEAPON_SAW', gItemsTexturesID
[ITEM_WEAPON_SAW
]);
98 g_Texture_Get('ITEM_WEAPON_SHOTGUN1', gItemsTexturesID
[ITEM_WEAPON_SHOTGUN1
]);
99 g_Texture_Get('ITEM_WEAPON_SHOTGUN2', gItemsTexturesID
[ITEM_WEAPON_SHOTGUN2
]);
100 g_Texture_Get('ITEM_WEAPON_CHAINGUN', gItemsTexturesID
[ITEM_WEAPON_CHAINGUN
]);
101 g_Texture_Get('ITEM_WEAPON_ROCKETLAUNCHER', gItemsTexturesID
[ITEM_WEAPON_ROCKETLAUNCHER
]);
102 g_Texture_Get('ITEM_WEAPON_PLASMA', gItemsTexturesID
[ITEM_WEAPON_PLASMA
]);
103 g_Texture_Get('ITEM_WEAPON_BFG', gItemsTexturesID
[ITEM_WEAPON_BFG
]);
104 g_Texture_Get('ITEM_WEAPON_SUPERPULEMET', gItemsTexturesID
[ITEM_WEAPON_SUPERPULEMET
]);
105 g_Texture_Get('ITEM_AMMO_BULLETS', gItemsTexturesID
[ITEM_AMMO_BULLETS
]);
106 g_Texture_Get('ITEM_AMMO_BULLETS_BOX', gItemsTexturesID
[ITEM_AMMO_BULLETS_BOX
]);
107 g_Texture_Get('ITEM_AMMO_SHELLS', gItemsTexturesID
[ITEM_AMMO_SHELLS
]);
108 g_Texture_Get('ITEM_AMMO_SHELLS_BOX', gItemsTexturesID
[ITEM_AMMO_SHELLS_BOX
]);
109 g_Texture_Get('ITEM_AMMO_ROCKET', gItemsTexturesID
[ITEM_AMMO_ROCKET
]);
110 g_Texture_Get('ITEM_AMMO_ROCKET_BOX', gItemsTexturesID
[ITEM_AMMO_ROCKET_BOX
]);
111 g_Texture_Get('ITEM_AMMO_CELL', gItemsTexturesID
[ITEM_AMMO_CELL
]);
112 g_Texture_Get('ITEM_AMMO_CELL_BIG', gItemsTexturesID
[ITEM_AMMO_CELL_BIG
]);
113 g_Texture_Get('ITEM_AMMO_BACKPACK', gItemsTexturesID
[ITEM_AMMO_BACKPACK
]);
114 g_Texture_Get('ITEM_KEY_RED', gItemsTexturesID
[ITEM_KEY_RED
]);
115 g_Texture_Get('ITEM_KEY_GREEN', gItemsTexturesID
[ITEM_KEY_GREEN
]);
116 g_Texture_Get('ITEM_KEY_BLUE', gItemsTexturesID
[ITEM_KEY_BLUE
]);
117 g_Texture_Get('ITEM_WEAPON_KASTET', gItemsTexturesID
[ITEM_WEAPON_KASTET
]);
118 g_Texture_Get('ITEM_WEAPON_PISTOL', gItemsTexturesID
[ITEM_WEAPON_PISTOL
]);
119 g_Texture_Get('ITEM_JETPACK', gItemsTexturesID
[ITEM_JETPACK
]);
122 procedure g_Items_LoadData();
124 e_WriteLog('Loading items data...', MSG_NOTIFY
);
126 g_Sound_CreateWADEx('SOUND_ITEM_RESPAWNITEM', GameWAD
+':SOUNDS\RESPAWNITEM');
127 g_Sound_CreateWADEx('SOUND_ITEM_GETRULEZ', GameWAD
+':SOUNDS\GETRULEZ');
128 g_Sound_CreateWADEx('SOUND_ITEM_GETWEAPON', GameWAD
+':SOUNDS\GETWEAPON');
129 g_Sound_CreateWADEx('SOUND_ITEM_GETITEM', GameWAD
+':SOUNDS\GETITEM');
131 g_Frames_CreateWAD(nil, 'FRAMES_ITEM_BLUESPHERE', GameWAD
+':TEXTURES\SBLUE', 32, 32, 4, True);
132 g_Frames_CreateWAD(nil, 'FRAMES_ITEM_WHITESPHERE', GameWAD
+':TEXTURES\SWHITE', 32, 32, 4, True);
133 g_Frames_CreateWAD(nil, 'FRAMES_ITEM_ARMORGREEN', GameWAD
+':TEXTURES\ARMORGREEN', 32, 16, 3, True);
134 g_Frames_CreateWAD(nil, 'FRAMES_ITEM_ARMORBLUE', GameWAD
+':TEXTURES\ARMORBLUE', 32, 16, 3, True);
135 g_Frames_CreateWAD(nil, 'FRAMES_ITEM_INVUL', GameWAD
+':TEXTURES\INVUL', 32, 32, 4, True);
136 g_Frames_CreateWAD(nil, 'FRAMES_ITEM_INVIS', GameWAD
+':TEXTURES\INVIS', 32, 32, 4, True);
137 g_Frames_CreateWAD(nil, 'FRAMES_ITEM_RESPAWN', GameWAD
+':TEXTURES\ITEMRESPAWN', 32, 32, 5, True);
138 g_Frames_CreateWAD(nil, 'FRAMES_ITEM_BOTTLE', GameWAD
+':TEXTURES\BOTTLE', 16, 32, 4, True);
139 g_Frames_CreateWAD(nil, 'FRAMES_ITEM_HELMET', GameWAD
+':TEXTURES\HELMET', 16, 16, 4, True);
140 g_Frames_CreateWAD(nil, 'FRAMES_FLAG_RED', GameWAD
+':TEXTURES\FLAGRED', 64, 64, 5, False);
141 g_Frames_CreateWAD(nil, 'FRAMES_FLAG_BLUE', GameWAD
+':TEXTURES\FLAGBLUE', 64, 64, 5, False);
142 g_Frames_CreateWAD(nil, 'FRAMES_FLAG_DOM', GameWAD
+':TEXTURES\FLAGDOM', 64, 64, 5, False);
143 g_Texture_CreateWADEx('ITEM_MEDKIT_SMALL', GameWAD
+':TEXTURES\MED1');
144 g_Texture_CreateWADEx('ITEM_MEDKIT_LARGE', GameWAD
+':TEXTURES\MED2');
145 g_Texture_CreateWADEx('ITEM_WEAPON_SAW', GameWAD
+':TEXTURES\SAW');
146 g_Texture_CreateWADEx('ITEM_WEAPON_PISTOL', GameWAD
+':TEXTURES\PISTOL');
147 g_Texture_CreateWADEx('ITEM_WEAPON_KASTET', GameWAD
+':TEXTURES\KASTET');
148 g_Texture_CreateWADEx('ITEM_WEAPON_SHOTGUN1', GameWAD
+':TEXTURES\SHOTGUN1');
149 g_Texture_CreateWADEx('ITEM_WEAPON_SHOTGUN2', GameWAD
+':TEXTURES\SHOTGUN2');
150 g_Texture_CreateWADEx('ITEM_WEAPON_CHAINGUN', GameWAD
+':TEXTURES\MGUN');
151 g_Texture_CreateWADEx('ITEM_WEAPON_ROCKETLAUNCHER', GameWAD
+':TEXTURES\RLAUNCHER');
152 g_Texture_CreateWADEx('ITEM_WEAPON_PLASMA', GameWAD
+':TEXTURES\PGUN');
153 g_Texture_CreateWADEx('ITEM_WEAPON_BFG', GameWAD
+':TEXTURES\BFG');
154 g_Texture_CreateWADEx('ITEM_WEAPON_SUPERPULEMET', GameWAD
+':TEXTURES\SPULEMET');
155 g_Texture_CreateWADEx('ITEM_AMMO_BULLETS', GameWAD
+':TEXTURES\CLIP');
156 g_Texture_CreateWADEx('ITEM_AMMO_BULLETS_BOX', GameWAD
+':TEXTURES\AMMO');
157 g_Texture_CreateWADEx('ITEM_AMMO_SHELLS', GameWAD
+':TEXTURES\SHELL1');
158 g_Texture_CreateWADEx('ITEM_AMMO_SHELLS_BOX', GameWAD
+':TEXTURES\SHELL2');
159 g_Texture_CreateWADEx('ITEM_AMMO_ROCKET', GameWAD
+':TEXTURES\ROCKET');
160 g_Texture_CreateWADEx('ITEM_AMMO_ROCKET_BOX', GameWAD
+':TEXTURES\ROCKETS');
161 g_Texture_CreateWADEx('ITEM_AMMO_CELL', GameWAD
+':TEXTURES\CELL');
162 g_Texture_CreateWADEx('ITEM_AMMO_CELL_BIG', GameWAD
+':TEXTURES\CELL2');
163 g_Texture_CreateWADEx('ITEM_AMMO_BACKPACK', GameWAD
+':TEXTURES\BPACK');
164 g_Texture_CreateWADEx('ITEM_KEY_RED', GameWAD
+':TEXTURES\KEYR');
165 g_Texture_CreateWADEx('ITEM_KEY_GREEN', GameWAD
+':TEXTURES\KEYG');
166 g_Texture_CreateWADEx('ITEM_KEY_BLUE', GameWAD
+':TEXTURES\KEYB');
167 g_Texture_CreateWADEx('ITEM_OXYGEN', GameWAD
+':TEXTURES\OXYGEN');
168 g_Texture_CreateWADEx('ITEM_SUIT', GameWAD
+':TEXTURES\SUIT');
169 g_Texture_CreateWADEx('ITEM_WEAPON_KASTET', GameWAD
+':TEXTURES\KASTET');
170 g_Texture_CreateWADEx('ITEM_MEDKIT_BLACK', GameWAD
+':TEXTURES\BMED');
171 g_Texture_CreateWADEx('ITEM_JETPACK', GameWAD
+':TEXTURES\JETPACK');
176 procedure g_Items_FreeData();
178 e_WriteLog('Releasing items data...', MSG_NOTIFY
);
180 g_Sound_Delete('SOUND_ITEM_RESPAWNITEM');
181 g_Sound_Delete('SOUND_ITEM_GETRULEZ');
182 g_Sound_Delete('SOUND_ITEM_GETWEAPON');
183 g_Sound_Delete('SOUND_ITEM_GETITEM');
185 g_Frames_DeleteByName('FRAMES_ITEM_BLUESPHERE');
186 g_Frames_DeleteByName('FRAMES_ITEM_WHITESPHERE');
187 g_Frames_DeleteByName('FRAMES_ITEM_ARMORGREEN');
188 g_Frames_DeleteByName('FRAMES_ITEM_ARMORBLUE');
189 g_Frames_DeleteByName('FRAMES_ITEM_INVUL');
190 g_Frames_DeleteByName('FRAMES_ITEM_INVIS');
191 g_Frames_DeleteByName('FRAMES_ITEM_RESPAWN');
192 g_Frames_DeleteByName('FRAMES_ITEM_BOTTLE');
193 g_Frames_DeleteByName('FRAMES_ITEM_HELMET');
194 g_Frames_DeleteByName('FRAMES_FLAG_RED');
195 g_Frames_DeleteByName('FRAMES_FLAG_BLUE');
196 g_Frames_DeleteByName('FRAMES_FLAG_DOM');
197 g_Texture_Delete('ITEM_MEDKIT_SMALL');
198 g_Texture_Delete('ITEM_MEDKIT_LARGE');
199 g_Texture_Delete('ITEM_WEAPON_SAW');
200 g_Texture_Delete('ITEM_WEAPON_PISTOL');
201 g_Texture_Delete('ITEM_WEAPON_KASTET');
202 g_Texture_Delete('ITEM_WEAPON_SHOTGUN1');
203 g_Texture_Delete('ITEM_WEAPON_SHOTGUN2');
204 g_Texture_Delete('ITEM_WEAPON_CHAINGUN');
205 g_Texture_Delete('ITEM_WEAPON_ROCKETLAUNCHER');
206 g_Texture_Delete('ITEM_WEAPON_PLASMA');
207 g_Texture_Delete('ITEM_WEAPON_BFG');
208 g_Texture_Delete('ITEM_WEAPON_SUPERPULEMET');
209 g_Texture_Delete('ITEM_AMMO_BULLETS');
210 g_Texture_Delete('ITEM_AMMO_BULLETS_BOX');
211 g_Texture_Delete('ITEM_AMMO_SHELLS');
212 g_Texture_Delete('ITEM_AMMO_SHELLS_BOX');
213 g_Texture_Delete('ITEM_AMMO_ROCKET');
214 g_Texture_Delete('ITEM_AMMO_ROCKET_BOX');
215 g_Texture_Delete('ITEM_AMMO_CELL');
216 g_Texture_Delete('ITEM_AMMO_CELL_BIG');
217 g_Texture_Delete('ITEM_AMMO_BACKPACK');
218 g_Texture_Delete('ITEM_KEY_RED');
219 g_Texture_Delete('ITEM_KEY_GREEN');
220 g_Texture_Delete('ITEM_KEY_BLUE');
221 g_Texture_Delete('ITEM_OXYGEN');
222 g_Texture_Delete('ITEM_SUIT');
223 g_Texture_Delete('ITEM_WEAPON_KASTET');
224 g_Texture_Delete('ITEM_MEDKIT_BLACK');
225 g_Texture_Delete('ITEM_JETPACK');
228 function FindItem(): DWORD
;
232 if gItems
<> nil then
233 for i
:= 0 to High(gItems
) do
234 if gItems
[i
].ItemType
= ITEM_NONE
then
242 SetLength(gItems
, 32);
247 Result
:= High(gItems
) + 1;
248 SetLength(gItems
, Length(gItems
) + 32);
252 procedure g_Items_Init();
256 if gMapInfo
.Height
> gPlayerScreenSize
.Y
then
257 a
:= gMapInfo
.Height
- gPlayerScreenSize
.Y
259 a
:= gMapInfo
.Height
;
261 if gMapInfo
.Width
> gPlayerScreenSize
.X
then
262 b
:= gMapInfo
.Width
- gPlayerScreenSize
.X
266 gMaxDist
:= Trunc(Hypot(a
, b
));
269 procedure g_Items_Free();
273 if gItems
<> nil then
275 for i
:= 0 to High(gItems
) do
276 gItems
[i
].Animation
.Free();
281 function g_Items_Create(X
, Y
: Integer; ItemType
: Byte;
282 Fall
, Respawnable
: Boolean; AdjCoord
: Boolean = False; ForcedID
: Integer = -1): DWORD
;
288 find_id
:= FindItem()
292 if Integer(find_id
) > High(gItems
) then
293 SetLength(gItems
, find_id
+ 32);
296 gItems
[find_id
].ItemType
:= ItemType
;
297 gItems
[find_id
].Respawnable
:= Respawnable
;
298 if g_Game_IsServer
and (ITEM_RESPAWNTIME
= 0) then
299 gItems
[find_id
].Respawnable
:= False;
300 gItems
[find_id
].InitX
:= X
;
301 gItems
[find_id
].InitY
:= Y
;
302 gItems
[find_id
].RespawnTime
:= 0;
303 gItems
[find_id
].Fall
:= Fall
;
304 gItems
[find_id
].Live
:= True;
305 gItems
[find_id
].QuietRespawn
:= False;
307 g_Obj_Init(@gItems
[find_id
].Obj
);
308 gItems
[find_id
].Obj
.X
:= X
;
309 gItems
[find_id
].Obj
.Y
:= Y
;
310 gItems
[find_id
].Obj
.Rect
.Width
:= ITEMSIZE
[ItemType
][0];
311 gItems
[find_id
].Obj
.Rect
.Height
:= ITEMSIZE
[ItemType
][1];
313 gItems
[find_id
].Animation
:= nil;
314 gItems
[find_id
].SpawnTrigger
:= -1;
316 // Êîîðäèíàòû îòíîñèòåëüíî öåíòðà íèæíåãî ðåáðà:
318 with gItems
[find_id
] do
320 Obj
.X
:= X
- (Obj
.Rect
.Width
div 2);
321 Obj
.Y
:= Y
- Obj
.Rect
.Height
;
326 // Óñòàíîâêà àíèìàöèè:
327 with gItems
[find_id
] do
331 if g_Frames_Get(ID
, 'FRAMES_ITEM_ARMORGREEN') then
332 Animation
:= TAnimation
.Create(ID
, True, 20);
334 if g_Frames_Get(ID
, 'FRAMES_ITEM_ARMORBLUE') then
335 Animation
:= TAnimation
.Create(ID
, True, 20);
337 if g_Frames_Get(ID
, 'FRAMES_ITEM_BLUESPHERE') then
338 Animation
:= TAnimation
.Create(ID
, True, 15);
340 if g_Frames_Get(ID
, 'FRAMES_ITEM_WHITESPHERE') then
341 Animation
:= TAnimation
.Create(ID
, True, 20);
343 if g_Frames_Get(ID
, 'FRAMES_ITEM_INVUL') then
344 Animation
:= TAnimation
.Create(ID
, True, 20);
346 if g_Frames_Get(ID
, 'FRAMES_ITEM_INVIS') then
347 Animation
:= TAnimation
.Create(ID
, True, 20);
349 if g_Frames_Get(ID
, 'FRAMES_ITEM_BOTTLE') then
350 Animation
:= TAnimation
.Create(ID
, True, 20);
352 if g_Frames_Get(ID
, 'FRAMES_ITEM_HELMET') then
353 Animation
:= TAnimation
.Create(ID
, True, 20);
360 procedure g_Items_Update();
368 if gItems
<> nil then
369 for i
:= 0 to High(gItems
) do
370 if gItems
[i
].ItemType
<> ITEM_NONE
then
379 m
:= g_Obj_Move(@Obj
, True, True);
381 // Ñîïðîòèâëåíèå âîçäóõà:
382 if gTime
mod (GAME_TICK
*2) = 0 then
383 Obj
.Vel
.X
:= z_dec(Obj
.Vel
.X
, 1);
384 // Åñëè âûïàë çà êàðòó:
385 if WordBool(m
and MOVE_FALLOUT
) then
387 if SpawnTrigger
= -1 then
391 if g_Game_IsServer
and g_Game_IsNet
then MH_SEND_ItemDestroy(True, i
);
397 // Åñëè èãðîêè ïîáëèçîñòè:
398 if gPlayers
<> nil then
400 j
:= Random(Length(gPlayers
)) - 1;
402 for k
:= 0 to High(gPlayers
) do
405 if j
> High(gPlayers
) then
408 if (gPlayers
[j
] <> nil) and gPlayers
[j
].Live
and
409 g_Obj_Collide(@gPlayers
[j
].Obj
, @Obj
) then
411 if g_Game_IsClient
then Continue
;
413 if not gPlayers
[j
].PickItem(ItemType
, Respawnable
, r
) then
416 if g_Game_IsNet
then MH_SEND_PlayerStats(gPlayers
[j
].UID
);
420 1. I_NONE,I_CLIP,I_SHEL,I_ROCKET,I_CELL,I_AMMO,I_SBOX,I_RBOX,I_CELP,I_BPACK,I_CSAW,I_SGUN,I_SGUN2,I_MGUN,I_LAUN,I_PLAS,I_BFG,I_GUN2
421 +2. I_MEGA,I_INVL,I_SUPER
422 3. I_STIM,I_MEDI,I_ARM1,I_ARM2,I_AQUA,I_KEYR,I_KEYG,I_KEYB,I_SUIT,I_RTORCH,I_GTORCH,I_BTORCH,I_GOR1,I_FCAN
425 if gSoundEffectsDF
then
427 if ItemType
in [ITEM_SPHERE_BLUE
, ITEM_SPHERE_WHITE
, ITEM_INVUL
,
428 ITEM_INVIS
, ITEM_MEDKIT_BLACK
, ITEM_JETPACK
] then
429 g_Sound_PlayExAt('SOUND_ITEM_GETRULEZ',
430 gPlayers
[j
].Obj
.X
, gPlayers
[j
].Obj
.Y
)
432 if ItemType
in [ITEM_WEAPON_SAW
, ITEM_WEAPON_PISTOL
, ITEM_WEAPON_SHOTGUN1
, ITEM_WEAPON_SHOTGUN2
,
433 ITEM_WEAPON_CHAINGUN
, ITEM_WEAPON_ROCKETLAUNCHER
, ITEM_WEAPON_PLASMA
,
434 ITEM_WEAPON_BFG
, ITEM_WEAPON_SUPERPULEMET
, ITEM_AMMO_BACKPACK
] then
435 g_Sound_PlayExAt('SOUND_ITEM_GETWEAPON',
436 gPlayers
[j
].Obj
.X
, gPlayers
[j
].Obj
.Y
)
438 g_Sound_PlayExAt('SOUND_ITEM_GETITEM',
439 gPlayers
[j
].Obj
.X
, gPlayers
[j
].Obj
.Y
);
443 if ItemType
in [ITEM_SPHERE_BLUE
, ITEM_SPHERE_WHITE
, ITEM_SUIT
,
444 ITEM_MEDKIT_BLACK
, ITEM_INVUL
, ITEM_INVIS
, ITEM_JETPACK
] then
445 g_Sound_PlayExAt('SOUND_ITEM_GETRULEZ',
446 gPlayers
[j
].Obj
.X
, gPlayers
[j
].Obj
.Y
)
448 if ItemType
in [ITEM_WEAPON_SAW
, ITEM_WEAPON_PISTOL
, ITEM_WEAPON_SHOTGUN1
, ITEM_WEAPON_SHOTGUN2
,
449 ITEM_WEAPON_CHAINGUN
, ITEM_WEAPON_ROCKETLAUNCHER
, ITEM_WEAPON_PLASMA
,
450 ITEM_WEAPON_BFG
, ITEM_WEAPON_SUPERPULEMET
] then
451 g_Sound_PlayExAt('SOUND_ITEM_GETWEAPON',
452 gPlayers
[j
].Obj
.X
, gPlayers
[j
].Obj
.Y
)
454 g_Sound_PlayExAt('SOUND_ITEM_GETITEM',
455 gPlayers
[j
].Obj
.X
, gPlayers
[j
].Obj
.Y
);
458 // Íàäî óáðàòü ñ êàðòû, åñëè ýòî íå êëþ÷, êîòîðûì íóæíî ïîäåëèòüñÿ ñ äðóãèì èãðîêîì:
461 if not Respawnable
then
466 if g_Game_IsNet
then MH_SEND_ItemDestroy(False, i
);
478 if Respawnable
and g_Game_IsServer
then
480 DecMin(RespawnTime
, 0);
481 if (RespawnTime
= 0) and (not Live
) then
483 if not QuietRespawn
then
484 g_Sound_PlayExAt('SOUND_ITEM_RESPAWNITEM', InitX
, InitY
);
486 if g_Frames_Get(ID
, 'FRAMES_ITEM_RESPAWN') then
488 Anim
:= TAnimation
.Create(ID
, False, 4);
489 g_GFX_OnceAnim(InitX
+(Obj
.Rect
.Width
div 2)-16, InitY
+(Obj
.Rect
.Height
div 2)-16, Anim
);
502 if g_Game_IsNet
then MH_SEND_ItemSpawn(QuietRespawn
, i
);
503 QuietRespawn
:= False;
507 if Animation
<> nil then
512 procedure g_Items_Draw();
516 if gItems
<> nil then
517 for i
:= 0 to High(gItems
) do
518 if gItems
[i
].Live
then
520 if g_Collide(Obj
.X
, Obj
.Y
, Obj
.Rect
.Width
, Obj
.Rect
.Height
,
521 sX
, sY
, sWidth
, sHeight
) then
523 if Animation
= nil then
524 e_Draw(gItemsTexturesID
[ItemType
], Obj
.X
, Obj
.Y
, 0, True, False)
526 Animation
.Draw(Obj
.X
, Obj
.Y
, M_NONE
);
528 if g_debug_Frames
then
530 e_DrawQuad(Obj
.X
+Obj
.Rect
.X
,
532 Obj
.X
+Obj
.Rect
.X
+Obj
.Rect
.Width
-1,
533 Obj
.Y
+Obj
.Rect
.Y
+Obj
.Rect
.Height
-1,
539 procedure g_Items_Pick(ID
: DWORD
);
541 gItems
[ID
].Live
:= False;
542 gItems
[ID
].RespawnTime
:= ITEM_RESPAWNTIME
;
545 procedure g_Items_Remove(ID
: DWORD
);
547 gItems
[ID
].ItemType
:= ITEM_NONE
;
549 if gItems
[ID
].Animation
<> nil then
551 gItems
[ID
].Animation
.Free();
552 gItems
[ID
].Animation
:= nil;
555 gItems
[ID
].Live
:= False;
557 if gItems
[ID
].SpawnTrigger
> -1 then
559 g_Triggers_DecreaseSpawner(gItems
[ID
].SpawnTrigger
);
560 gItems
[ID
].SpawnTrigger
:= -1;
564 procedure g_Items_SaveState(var Mem
: TBinMemoryWriter
);
569 // Ñ÷èòàåì êîëè÷åñòâî ñóùåñòâóþùèõ ïðåäìåòîâ:
571 if gItems
<> nil then
572 for i
:= 0 to High(gItems
) do
573 if gItems
[i
].ItemType
<> ITEM_NONE
then
576 Mem
:= TBinMemoryWriter
.Create((count
+1) * 60);
578 // Êîëè÷åñòâî ïðåäìåòîâ:
584 for i
:= 0 to High(gItems
) do
585 if gItems
[i
].ItemType
<> ITEM_NONE
then
587 // Ñèãíàòóðà ïðåäìåòà:
588 sig
:= ITEM_SIGNATURE
; // 'ITEM'
591 Mem
.WriteByte(gItems
[i
].ItemType
);
593 Mem
.WriteBoolean(gItems
[i
].Respawnable
);
594 // Êîîðäèíàòû ðåñïóíà:
595 Mem
.WriteInt(gItems
[i
].InitX
);
596 Mem
.WriteInt(gItems
[i
].InitY
);
597 // Âðåìÿ äî ðåñïàóíà:
598 Mem
.WriteWord(gItems
[i
].RespawnTime
);
599 // Ñóùåñòâóåò ëè ýòîò ïðåäìåò:
600 Mem
.WriteBoolean(gItems
[i
].Live
);
601 // Ìîæåò ëè îí ïàäàòü:
602 Mem
.WriteBoolean(gItems
[i
].Fall
);
603 // Èíäåêñ òðèããåðà, ñîçäàâøåãî ïðåäìåò:
604 Mem
.WriteInt(gItems
[i
].SpawnTrigger
);
606 Obj_SaveState(@gItems
[i
].Obj
, Mem
);
610 procedure g_Items_LoadState(var Mem
: TBinMemoryReader
);
612 count
, i
, a
: Integer;
621 // Êîëè÷åñòâî ïðåäìåòîâ:
627 for a
:= 0 to count
-1 do
629 // Ñèãíàòóðà ïðåäìåòà:
631 if sig
<> ITEM_SIGNATURE
then // 'ITEM'
633 raise EBinSizeError
.Create('g_Items_LoadState: Wrong Item Signature');
638 i
:= g_Items_Create(0, 0, b
, False, False);
640 Mem
.ReadBoolean(gItems
[i
].Respawnable
);
641 // Êîîðäèíàòû ðåñïóíà:
642 Mem
.ReadInt(gItems
[i
].InitX
);
643 Mem
.ReadInt(gItems
[i
].InitY
);
644 // Âðåìÿ äî ðåñïàóíà:
645 Mem
.ReadWord(gItems
[i
].RespawnTime
);
646 // Ñóùåñòâóåò ëè ýòîò ïðåäìåò:
647 Mem
.ReadBoolean(gItems
[i
].Live
);
648 // Ìîæåò ëè îí ïàäàòü:
649 Mem
.ReadBoolean(gItems
[i
].Fall
);
650 // Èíäåêñ òðèããåðà, ñîçäàâøåãî ïðåäìåò:
651 Mem
.ReadInt(gItems
[i
].SpawnTrigger
);
653 Obj_LoadState(@gItems
[i
].Obj
, Mem
);