6 g_textures
, g_phys
, g_saveload
, BinEditor
;
12 InitX
, InitY
: Integer;
16 QuietRespawn
: Boolean;
17 SpawnTrigger
: Integer;
19 Animation
: TAnimation
;
22 procedure g_Items_LoadData();
23 procedure g_Items_FreeData();
24 procedure g_Items_Init();
25 procedure g_Items_Free();
26 function g_Items_Create(X
, Y
: Integer; ItemType
: Byte;
27 Fall
, Respawnable
: Boolean; AdjCoord
: Boolean = False; ForcedID
: Integer = -1): DWORD
;
28 procedure g_Items_Update();
29 procedure g_Items_Draw();
30 procedure g_Items_Pick(ID
: DWORD
);
31 procedure g_Items_Remove(ID
: DWORD
);
32 procedure g_Items_SaveState(var Mem
: TBinMemoryWriter
);
33 procedure g_Items_LoadState(var Mem
: TBinMemoryReader
);
36 gItems
: Array of TItem
= nil;
37 gItemsTexturesID
: Array [1..35] of DWORD
;
38 gMaxDist
: Integer = 1;
39 ITEM_RESPAWNTIME
: Integer = 60 * 36;
44 g_basic
, e_graphics
, g_sound
, g_main
, g_gfx
, g_map
,
45 Math
, g_game
, g_triggers
, g_console
, SysUtils
, g_player
, g_net
, g_netmsg
,
49 ITEM_SIGNATURE
= $4D455449; // 'ITEM'
51 ITEMSIZE
: Array [ITEM_MEDKIT_SMALL
..ITEM_MAX
] of Array [0..1] of Byte =
52 (((14), (15)), // MEDKIT_SMALL
53 ((28), (19)), // MEDKIT_LARGE
54 ((28), (19)), // MEDKIT_BLACK
55 ((31), (16)), // ARMOR_GREEN
56 ((31), (16)), // ARMOR_BLUE
57 ((25), (25)), // SPHERE_BLUE
58 ((25), (25)), // SPHERE_WHITE
60 ((14), (27)), // OXYGEN
61 ((25), (25)), // INVUL
62 ((62), (24)), // WEAPON_SAW
63 ((63), (12)), // WEAPON_SHOTGUN1
64 ((54), (13)), // WEAPON_SHOTGUN2
65 ((54), (16)), // WEAPON_CHAINGUN
66 ((62), (16)), // WEAPON_ROCKETLAUNCHER
67 ((54), (16)), // WEAPON_PLASMA
68 ((61), (36)), // WEAPON_BFG
69 ((54), (16)), // WEAPON_SUPERPULEMET
70 (( 9), (11)), // AMMO_BULLETS
71 ((28), (16)), // AMMO_BULLETS_BOX
72 ((15), ( 7)), // AMMO_SHELLS
73 ((32), (12)), // AMMO_SHELLS_BOX
74 ((12), (27)), // AMMO_ROCKET
75 ((54), (21)), // AMMO_ROCKET_BOX
76 ((15), (12)), // AMMO_CELL
77 ((32), (21)), // AMMO_CELL_BIG
78 ((22), (29)), // AMMO_BACKPACK
79 ((16), (16)), // KEY_RED
80 ((16), (16)), // KEY_GREEN
81 ((16), (16)), // KEY_BLUE
82 (( 1), ( 1)), // WEAPON_KASTET
83 ((43), (16)), // WEAPON_PISTOL
84 ((14), (18)), // BOTTLE
85 ((16), (15)), // HELMET
86 ((32), (24)), // JETPACK
87 ((25), (25))); // INVIS
89 procedure InitTextures();
91 g_Texture_Get('ITEM_MEDKIT_SMALL', gItemsTexturesID
[ITEM_MEDKIT_SMALL
]);
92 g_Texture_Get('ITEM_MEDKIT_LARGE', gItemsTexturesID
[ITEM_MEDKIT_LARGE
]);
93 g_Texture_Get('ITEM_MEDKIT_BLACK', gItemsTexturesID
[ITEM_MEDKIT_BLACK
]);
94 g_Texture_Get('ITEM_SUIT', gItemsTexturesID
[ITEM_SUIT
]);
95 g_Texture_Get('ITEM_OXYGEN', gItemsTexturesID
[ITEM_OXYGEN
]);
96 g_Texture_Get('ITEM_WEAPON_SAW', gItemsTexturesID
[ITEM_WEAPON_SAW
]);
97 g_Texture_Get('ITEM_WEAPON_SHOTGUN1', gItemsTexturesID
[ITEM_WEAPON_SHOTGUN1
]);
98 g_Texture_Get('ITEM_WEAPON_SHOTGUN2', gItemsTexturesID
[ITEM_WEAPON_SHOTGUN2
]);
99 g_Texture_Get('ITEM_WEAPON_CHAINGUN', gItemsTexturesID
[ITEM_WEAPON_CHAINGUN
]);
100 g_Texture_Get('ITEM_WEAPON_ROCKETLAUNCHER', gItemsTexturesID
[ITEM_WEAPON_ROCKETLAUNCHER
]);
101 g_Texture_Get('ITEM_WEAPON_PLASMA', gItemsTexturesID
[ITEM_WEAPON_PLASMA
]);
102 g_Texture_Get('ITEM_WEAPON_BFG', gItemsTexturesID
[ITEM_WEAPON_BFG
]);
103 g_Texture_Get('ITEM_WEAPON_SUPERPULEMET', gItemsTexturesID
[ITEM_WEAPON_SUPERPULEMET
]);
104 g_Texture_Get('ITEM_AMMO_BULLETS', gItemsTexturesID
[ITEM_AMMO_BULLETS
]);
105 g_Texture_Get('ITEM_AMMO_BULLETS_BOX', gItemsTexturesID
[ITEM_AMMO_BULLETS_BOX
]);
106 g_Texture_Get('ITEM_AMMO_SHELLS', gItemsTexturesID
[ITEM_AMMO_SHELLS
]);
107 g_Texture_Get('ITEM_AMMO_SHELLS_BOX', gItemsTexturesID
[ITEM_AMMO_SHELLS_BOX
]);
108 g_Texture_Get('ITEM_AMMO_ROCKET', gItemsTexturesID
[ITEM_AMMO_ROCKET
]);
109 g_Texture_Get('ITEM_AMMO_ROCKET_BOX', gItemsTexturesID
[ITEM_AMMO_ROCKET_BOX
]);
110 g_Texture_Get('ITEM_AMMO_CELL', gItemsTexturesID
[ITEM_AMMO_CELL
]);
111 g_Texture_Get('ITEM_AMMO_CELL_BIG', gItemsTexturesID
[ITEM_AMMO_CELL_BIG
]);
112 g_Texture_Get('ITEM_AMMO_BACKPACK', gItemsTexturesID
[ITEM_AMMO_BACKPACK
]);
113 g_Texture_Get('ITEM_KEY_RED', gItemsTexturesID
[ITEM_KEY_RED
]);
114 g_Texture_Get('ITEM_KEY_GREEN', gItemsTexturesID
[ITEM_KEY_GREEN
]);
115 g_Texture_Get('ITEM_KEY_BLUE', gItemsTexturesID
[ITEM_KEY_BLUE
]);
116 g_Texture_Get('ITEM_WEAPON_KASTET', gItemsTexturesID
[ITEM_WEAPON_KASTET
]);
117 g_Texture_Get('ITEM_WEAPON_PISTOL', gItemsTexturesID
[ITEM_WEAPON_PISTOL
]);
118 g_Texture_Get('ITEM_JETPACK', gItemsTexturesID
[ITEM_JETPACK
]);
121 procedure g_Items_LoadData();
123 e_WriteLog('Loading items data...', MSG_NOTIFY
);
125 g_Sound_CreateWADEx('SOUND_ITEM_RESPAWNITEM', GameWAD
+':SOUNDS\RESPAWNITEM');
126 g_Sound_CreateWADEx('SOUND_ITEM_GETRULEZ', GameWAD
+':SOUNDS\GETRULEZ');
127 g_Sound_CreateWADEx('SOUND_ITEM_GETWEAPON', GameWAD
+':SOUNDS\GETWEAPON');
128 g_Sound_CreateWADEx('SOUND_ITEM_GETITEM', GameWAD
+':SOUNDS\GETITEM');
130 g_Frames_CreateWAD(nil, 'FRAMES_ITEM_BLUESPHERE', GameWAD
+':TEXTURES\SBLUE', 32, 32, 4, True);
131 g_Frames_CreateWAD(nil, 'FRAMES_ITEM_WHITESPHERE', GameWAD
+':TEXTURES\SWHITE', 32, 32, 4, True);
132 g_Frames_CreateWAD(nil, 'FRAMES_ITEM_ARMORGREEN', GameWAD
+':TEXTURES\ARMORGREEN', 32, 16, 3, True);
133 g_Frames_CreateWAD(nil, 'FRAMES_ITEM_ARMORBLUE', GameWAD
+':TEXTURES\ARMORBLUE', 32, 16, 3, True);
134 g_Frames_CreateWAD(nil, 'FRAMES_ITEM_INVUL', GameWAD
+':TEXTURES\INVUL', 32, 32, 4, True);
135 g_Frames_CreateWAD(nil, 'FRAMES_ITEM_INVIS', GameWAD
+':TEXTURES\INVIS', 32, 32, 4, True);
136 g_Frames_CreateWAD(nil, 'FRAMES_ITEM_RESPAWN', GameWAD
+':TEXTURES\ITEMRESPAWN', 32, 32, 5, True);
137 g_Frames_CreateWAD(nil, 'FRAMES_ITEM_BOTTLE', GameWAD
+':TEXTURES\BOTTLE', 16, 32, 4, True);
138 g_Frames_CreateWAD(nil, 'FRAMES_ITEM_HELMET', GameWAD
+':TEXTURES\HELMET', 16, 16, 4, True);
139 g_Frames_CreateWAD(nil, 'FRAMES_FLAG_RED', GameWAD
+':TEXTURES\FLAGRED', 64, 64, 5, False);
140 g_Frames_CreateWAD(nil, 'FRAMES_FLAG_BLUE', GameWAD
+':TEXTURES\FLAGBLUE', 64, 64, 5, False);
141 g_Frames_CreateWAD(nil, 'FRAMES_FLAG_DOM', GameWAD
+':TEXTURES\FLAGDOM', 64, 64, 5, False);
142 g_Texture_CreateWADEx('ITEM_MEDKIT_SMALL', GameWAD
+':TEXTURES\MED1');
143 g_Texture_CreateWADEx('ITEM_MEDKIT_LARGE', GameWAD
+':TEXTURES\MED2');
144 g_Texture_CreateWADEx('ITEM_WEAPON_SAW', GameWAD
+':TEXTURES\SAW');
145 g_Texture_CreateWADEx('ITEM_WEAPON_PISTOL', GameWAD
+':TEXTURES\PISTOL');
146 g_Texture_CreateWADEx('ITEM_WEAPON_KASTET', GameWAD
+':TEXTURES\KASTET');
147 g_Texture_CreateWADEx('ITEM_WEAPON_SHOTGUN1', GameWAD
+':TEXTURES\SHOTGUN1');
148 g_Texture_CreateWADEx('ITEM_WEAPON_SHOTGUN2', GameWAD
+':TEXTURES\SHOTGUN2');
149 g_Texture_CreateWADEx('ITEM_WEAPON_CHAINGUN', GameWAD
+':TEXTURES\MGUN');
150 g_Texture_CreateWADEx('ITEM_WEAPON_ROCKETLAUNCHER', GameWAD
+':TEXTURES\RLAUNCHER');
151 g_Texture_CreateWADEx('ITEM_WEAPON_PLASMA', GameWAD
+':TEXTURES\PGUN');
152 g_Texture_CreateWADEx('ITEM_WEAPON_BFG', GameWAD
+':TEXTURES\BFG');
153 g_Texture_CreateWADEx('ITEM_WEAPON_SUPERPULEMET', GameWAD
+':TEXTURES\SPULEMET');
154 g_Texture_CreateWADEx('ITEM_AMMO_BULLETS', GameWAD
+':TEXTURES\CLIP');
155 g_Texture_CreateWADEx('ITEM_AMMO_BULLETS_BOX', GameWAD
+':TEXTURES\AMMO');
156 g_Texture_CreateWADEx('ITEM_AMMO_SHELLS', GameWAD
+':TEXTURES\SHELL1');
157 g_Texture_CreateWADEx('ITEM_AMMO_SHELLS_BOX', GameWAD
+':TEXTURES\SHELL2');
158 g_Texture_CreateWADEx('ITEM_AMMO_ROCKET', GameWAD
+':TEXTURES\ROCKET');
159 g_Texture_CreateWADEx('ITEM_AMMO_ROCKET_BOX', GameWAD
+':TEXTURES\ROCKETS');
160 g_Texture_CreateWADEx('ITEM_AMMO_CELL', GameWAD
+':TEXTURES\CELL');
161 g_Texture_CreateWADEx('ITEM_AMMO_CELL_BIG', GameWAD
+':TEXTURES\CELL2');
162 g_Texture_CreateWADEx('ITEM_AMMO_BACKPACK', GameWAD
+':TEXTURES\BPACK');
163 g_Texture_CreateWADEx('ITEM_KEY_RED', GameWAD
+':TEXTURES\KEYR');
164 g_Texture_CreateWADEx('ITEM_KEY_GREEN', GameWAD
+':TEXTURES\KEYG');
165 g_Texture_CreateWADEx('ITEM_KEY_BLUE', GameWAD
+':TEXTURES\KEYB');
166 g_Texture_CreateWADEx('ITEM_OXYGEN', GameWAD
+':TEXTURES\OXYGEN');
167 g_Texture_CreateWADEx('ITEM_SUIT', GameWAD
+':TEXTURES\SUIT');
168 g_Texture_CreateWADEx('ITEM_WEAPON_KASTET', GameWAD
+':TEXTURES\KASTET');
169 g_Texture_CreateWADEx('ITEM_MEDKIT_BLACK', GameWAD
+':TEXTURES\BMED');
170 g_Texture_CreateWADEx('ITEM_JETPACK', GameWAD
+':TEXTURES\JETPACK');
175 procedure g_Items_FreeData();
177 e_WriteLog('Releasing items data...', MSG_NOTIFY
);
179 g_Sound_Delete('SOUND_ITEM_RESPAWNITEM');
180 g_Sound_Delete('SOUND_ITEM_GETRULEZ');
181 g_Sound_Delete('SOUND_ITEM_GETWEAPON');
182 g_Sound_Delete('SOUND_ITEM_GETITEM');
184 g_Frames_DeleteByName('FRAMES_ITEM_BLUESPHERE');
185 g_Frames_DeleteByName('FRAMES_ITEM_WHITESPHERE');
186 g_Frames_DeleteByName('FRAMES_ITEM_ARMORGREEN');
187 g_Frames_DeleteByName('FRAMES_ITEM_ARMORBLUE');
188 g_Frames_DeleteByName('FRAMES_ITEM_INVUL');
189 g_Frames_DeleteByName('FRAMES_ITEM_INVIS');
190 g_Frames_DeleteByName('FRAMES_ITEM_RESPAWN');
191 g_Frames_DeleteByName('FRAMES_ITEM_BOTTLE');
192 g_Frames_DeleteByName('FRAMES_ITEM_HELMET');
193 g_Frames_DeleteByName('FRAMES_FLAG_RED');
194 g_Frames_DeleteByName('FRAMES_FLAG_BLUE');
195 g_Frames_DeleteByName('FRAMES_FLAG_DOM');
196 g_Texture_Delete('ITEM_MEDKIT_SMALL');
197 g_Texture_Delete('ITEM_MEDKIT_LARGE');
198 g_Texture_Delete('ITEM_WEAPON_SAW');
199 g_Texture_Delete('ITEM_WEAPON_PISTOL');
200 g_Texture_Delete('ITEM_WEAPON_KASTET');
201 g_Texture_Delete('ITEM_WEAPON_SHOTGUN1');
202 g_Texture_Delete('ITEM_WEAPON_SHOTGUN2');
203 g_Texture_Delete('ITEM_WEAPON_CHAINGUN');
204 g_Texture_Delete('ITEM_WEAPON_ROCKETLAUNCHER');
205 g_Texture_Delete('ITEM_WEAPON_PLASMA');
206 g_Texture_Delete('ITEM_WEAPON_BFG');
207 g_Texture_Delete('ITEM_WEAPON_SUPERPULEMET');
208 g_Texture_Delete('ITEM_AMMO_BULLETS');
209 g_Texture_Delete('ITEM_AMMO_BULLETS_BOX');
210 g_Texture_Delete('ITEM_AMMO_SHELLS');
211 g_Texture_Delete('ITEM_AMMO_SHELLS_BOX');
212 g_Texture_Delete('ITEM_AMMO_ROCKET');
213 g_Texture_Delete('ITEM_AMMO_ROCKET_BOX');
214 g_Texture_Delete('ITEM_AMMO_CELL');
215 g_Texture_Delete('ITEM_AMMO_CELL_BIG');
216 g_Texture_Delete('ITEM_AMMO_BACKPACK');
217 g_Texture_Delete('ITEM_KEY_RED');
218 g_Texture_Delete('ITEM_KEY_GREEN');
219 g_Texture_Delete('ITEM_KEY_BLUE');
220 g_Texture_Delete('ITEM_OXYGEN');
221 g_Texture_Delete('ITEM_SUIT');
222 g_Texture_Delete('ITEM_WEAPON_KASTET');
223 g_Texture_Delete('ITEM_MEDKIT_BLACK');
224 g_Texture_Delete('ITEM_JETPACK');
227 function FindItem(): DWORD
;
231 if gItems
<> nil then
232 for i
:= 0 to High(gItems
) do
233 if gItems
[i
].ItemType
= ITEM_NONE
then
241 SetLength(gItems
, 32);
246 Result
:= High(gItems
) + 1;
247 SetLength(gItems
, Length(gItems
) + 32);
251 procedure g_Items_Init();
255 if gMapInfo
.Height
> gPlayerScreenSize
.Y
then
256 a
:= gMapInfo
.Height
- gPlayerScreenSize
.Y
258 a
:= gMapInfo
.Height
;
260 if gMapInfo
.Width
> gPlayerScreenSize
.X
then
261 b
:= gMapInfo
.Width
- gPlayerScreenSize
.X
265 gMaxDist
:= Trunc(Hypot(a
, b
));
268 procedure g_Items_Free();
272 if gItems
<> nil then
274 for i
:= 0 to High(gItems
) do
275 gItems
[i
].Animation
.Free();
280 function g_Items_Create(X
, Y
: Integer; ItemType
: Byte;
281 Fall
, Respawnable
: Boolean; AdjCoord
: Boolean = False; ForcedID
: Integer = -1): DWORD
;
287 find_id
:= FindItem()
291 if Integer(find_id
) > High(gItems
) then
292 SetLength(gItems
, find_id
+ 32);
295 gItems
[find_id
].ItemType
:= ItemType
;
296 gItems
[find_id
].Respawnable
:= Respawnable
;
297 if g_Game_IsServer
and (ITEM_RESPAWNTIME
= 0) then
298 gItems
[find_id
].Respawnable
:= False;
299 gItems
[find_id
].InitX
:= X
;
300 gItems
[find_id
].InitY
:= Y
;
301 gItems
[find_id
].RespawnTime
:= 0;
302 gItems
[find_id
].Fall
:= Fall
;
303 gItems
[find_id
].Live
:= True;
304 gItems
[find_id
].QuietRespawn
:= False;
306 g_Obj_Init(@gItems
[find_id
].Obj
);
307 gItems
[find_id
].Obj
.X
:= X
;
308 gItems
[find_id
].Obj
.Y
:= Y
;
309 gItems
[find_id
].Obj
.Rect
.Width
:= ITEMSIZE
[ItemType
][0];
310 gItems
[find_id
].Obj
.Rect
.Height
:= ITEMSIZE
[ItemType
][1];
312 gItems
[find_id
].Animation
:= nil;
313 gItems
[find_id
].SpawnTrigger
:= -1;
315 // Êîîðäèíàòû îòíîñèòåëüíî öåíòðà íèæíåãî ðåáðà:
317 with gItems
[find_id
] do
319 Obj
.X
:= X
- (Obj
.Rect
.Width
div 2);
320 Obj
.Y
:= Y
- Obj
.Rect
.Height
;
325 // Óñòàíîâêà àíèìàöèè:
326 with gItems
[find_id
] do
330 if g_Frames_Get(ID
, 'FRAMES_ITEM_ARMORGREEN') then
331 Animation
:= TAnimation
.Create(ID
, True, 20);
333 if g_Frames_Get(ID
, 'FRAMES_ITEM_ARMORBLUE') then
334 Animation
:= TAnimation
.Create(ID
, True, 20);
336 if g_Frames_Get(ID
, 'FRAMES_ITEM_BLUESPHERE') then
337 Animation
:= TAnimation
.Create(ID
, True, 15);
339 if g_Frames_Get(ID
, 'FRAMES_ITEM_WHITESPHERE') then
340 Animation
:= TAnimation
.Create(ID
, True, 20);
342 if g_Frames_Get(ID
, 'FRAMES_ITEM_INVUL') then
343 Animation
:= TAnimation
.Create(ID
, True, 20);
345 if g_Frames_Get(ID
, 'FRAMES_ITEM_INVIS') then
346 Animation
:= TAnimation
.Create(ID
, True, 20);
348 if g_Frames_Get(ID
, 'FRAMES_ITEM_BOTTLE') then
349 Animation
:= TAnimation
.Create(ID
, True, 20);
351 if g_Frames_Get(ID
, 'FRAMES_ITEM_HELMET') then
352 Animation
:= TAnimation
.Create(ID
, True, 20);
359 procedure g_Items_Update();
367 if gItems
<> nil then
368 for i
:= 0 to High(gItems
) do
369 if gItems
[i
].ItemType
<> ITEM_NONE
then
378 m
:= g_Obj_Move(@Obj
, True, True);
380 // Ñîïðîòèâëåíèå âîçäóõà:
381 if gTime
mod (GAME_TICK
*2) = 0 then
382 Obj
.Vel
.X
:= z_dec(Obj
.Vel
.X
, 1);
383 // Åñëè âûïàë çà êàðòó:
384 if WordBool(m
and MOVE_FALLOUT
) then
386 if SpawnTrigger
= -1 then
390 if g_Game_IsServer
and g_Game_IsNet
then MH_SEND_ItemDestroy(True, i
);
396 // Åñëè èãðîêè ïîáëèçîñòè:
397 if gPlayers
<> nil then
399 j
:= Random(Length(gPlayers
)) - 1;
401 for k
:= 0 to High(gPlayers
) do
404 if j
> High(gPlayers
) then
407 if (gPlayers
[j
] <> nil) and gPlayers
[j
].Live
and
408 g_Obj_Collide(@gPlayers
[j
].Obj
, @Obj
) then
410 if g_Game_IsClient
then Continue
;
412 if not gPlayers
[j
].PickItem(ItemType
, Respawnable
, r
) then
415 if g_Game_IsNet
then MH_SEND_PlayerStats(gPlayers
[j
].UID
);
419 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
420 +2. I_MEGA,I_INVL,I_SUPER
421 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
424 if gSoundEffectsDF
then
426 if ItemType
in [ITEM_SPHERE_BLUE
, ITEM_SPHERE_WHITE
, ITEM_INVUL
,
427 ITEM_INVIS
, ITEM_MEDKIT_BLACK
, ITEM_JETPACK
] then
428 g_Sound_PlayExAt('SOUND_ITEM_GETRULEZ',
429 gPlayers
[j
].Obj
.X
, gPlayers
[j
].Obj
.Y
)
431 if ItemType
in [ITEM_WEAPON_SAW
, ITEM_WEAPON_PISTOL
, ITEM_WEAPON_SHOTGUN1
, ITEM_WEAPON_SHOTGUN2
,
432 ITEM_WEAPON_CHAINGUN
, ITEM_WEAPON_ROCKETLAUNCHER
, ITEM_WEAPON_PLASMA
,
433 ITEM_WEAPON_BFG
, ITEM_WEAPON_SUPERPULEMET
, ITEM_AMMO_BACKPACK
] then
434 g_Sound_PlayExAt('SOUND_ITEM_GETWEAPON',
435 gPlayers
[j
].Obj
.X
, gPlayers
[j
].Obj
.Y
)
437 g_Sound_PlayExAt('SOUND_ITEM_GETITEM',
438 gPlayers
[j
].Obj
.X
, gPlayers
[j
].Obj
.Y
);
442 if ItemType
in [ITEM_SPHERE_BLUE
, ITEM_SPHERE_WHITE
, ITEM_SUIT
,
443 ITEM_MEDKIT_BLACK
, ITEM_INVUL
, ITEM_INVIS
, ITEM_JETPACK
] then
444 g_Sound_PlayExAt('SOUND_ITEM_GETRULEZ',
445 gPlayers
[j
].Obj
.X
, gPlayers
[j
].Obj
.Y
)
447 if ItemType
in [ITEM_WEAPON_SAW
, ITEM_WEAPON_PISTOL
, ITEM_WEAPON_SHOTGUN1
, ITEM_WEAPON_SHOTGUN2
,
448 ITEM_WEAPON_CHAINGUN
, ITEM_WEAPON_ROCKETLAUNCHER
, ITEM_WEAPON_PLASMA
,
449 ITEM_WEAPON_BFG
, ITEM_WEAPON_SUPERPULEMET
] then
450 g_Sound_PlayExAt('SOUND_ITEM_GETWEAPON',
451 gPlayers
[j
].Obj
.X
, gPlayers
[j
].Obj
.Y
)
453 g_Sound_PlayExAt('SOUND_ITEM_GETITEM',
454 gPlayers
[j
].Obj
.X
, gPlayers
[j
].Obj
.Y
);
457 // Íàäî óáðàòü ñ êàðòû, åñëè ýòî íå êëþ÷, êîòîðûì íóæíî ïîäåëèòüñÿ ñ äðóãèì èãðîêîì:
460 if not Respawnable
then
465 if g_Game_IsNet
then MH_SEND_ItemDestroy(False, i
);
477 if Respawnable
and g_Game_IsServer
then
479 DecMin(RespawnTime
, 0);
480 if (RespawnTime
= 0) and (not Live
) then
482 if not QuietRespawn
then
483 g_Sound_PlayExAt('SOUND_ITEM_RESPAWNITEM', InitX
, InitY
);
485 if g_Frames_Get(ID
, 'FRAMES_ITEM_RESPAWN') then
487 Anim
:= TAnimation
.Create(ID
, False, 4);
488 g_GFX_OnceAnim(InitX
+(Obj
.Rect
.Width
div 2)-16, InitY
+(Obj
.Rect
.Height
div 2)-16, Anim
);
501 if g_Game_IsNet
then MH_SEND_ItemSpawn(QuietRespawn
, i
);
502 QuietRespawn
:= False;
506 if Animation
<> nil then
511 procedure g_Items_Draw();
515 if gItems
<> nil then
516 for i
:= 0 to High(gItems
) do
517 if gItems
[i
].Live
then
519 if g_Collide(Obj
.X
, Obj
.Y
, Obj
.Rect
.Width
, Obj
.Rect
.Height
,
520 sX
, sY
, sWidth
, sHeight
) then
522 if Animation
= nil then
523 e_Draw(gItemsTexturesID
[ItemType
], Obj
.X
, Obj
.Y
, 0, True, False)
525 Animation
.Draw(Obj
.X
, Obj
.Y
, M_NONE
);
527 if g_debug_Frames
then
529 e_DrawQuad(Obj
.X
+Obj
.Rect
.X
,
531 Obj
.X
+Obj
.Rect
.X
+Obj
.Rect
.Width
-1,
532 Obj
.Y
+Obj
.Rect
.Y
+Obj
.Rect
.Height
-1,
538 procedure g_Items_Pick(ID
: DWORD
);
540 gItems
[ID
].Live
:= False;
541 gItems
[ID
].RespawnTime
:= ITEM_RESPAWNTIME
;
544 procedure g_Items_Remove(ID
: DWORD
);
546 gItems
[ID
].ItemType
:= ITEM_NONE
;
548 if gItems
[ID
].Animation
<> nil then
550 gItems
[ID
].Animation
.Free();
551 gItems
[ID
].Animation
:= nil;
554 gItems
[ID
].Live
:= False;
556 if gItems
[ID
].SpawnTrigger
> -1 then
558 g_Triggers_DecreaseSpawner(gItems
[ID
].SpawnTrigger
);
559 gItems
[ID
].SpawnTrigger
:= -1;
563 procedure g_Items_SaveState(var Mem
: TBinMemoryWriter
);
568 // Ñ÷èòàåì êîëè÷åñòâî ñóùåñòâóþùèõ ïðåäìåòîâ:
570 if gItems
<> nil then
571 for i
:= 0 to High(gItems
) do
572 if gItems
[i
].ItemType
<> ITEM_NONE
then
575 Mem
:= TBinMemoryWriter
.Create((count
+1) * 60);
577 // Êîëè÷åñòâî ïðåäìåòîâ:
583 for i
:= 0 to High(gItems
) do
584 if gItems
[i
].ItemType
<> ITEM_NONE
then
586 // Ñèãíàòóðà ïðåäìåòà:
587 sig
:= ITEM_SIGNATURE
; // 'ITEM'
590 Mem
.WriteByte(gItems
[i
].ItemType
);
592 Mem
.WriteBoolean(gItems
[i
].Respawnable
);
593 // Êîîðäèíàòû ðåñïóíà:
594 Mem
.WriteInt(gItems
[i
].InitX
);
595 Mem
.WriteInt(gItems
[i
].InitY
);
596 // Âðåìÿ äî ðåñïàóíà:
597 Mem
.WriteWord(gItems
[i
].RespawnTime
);
598 // Ñóùåñòâóåò ëè ýòîò ïðåäìåò:
599 Mem
.WriteBoolean(gItems
[i
].Live
);
600 // Ìîæåò ëè îí ïàäàòü:
601 Mem
.WriteBoolean(gItems
[i
].Fall
);
602 // Èíäåêñ òðèããåðà, ñîçäàâøåãî ïðåäìåò:
603 Mem
.WriteInt(gItems
[i
].SpawnTrigger
);
605 Obj_SaveState(@gItems
[i
].Obj
, Mem
);
609 procedure g_Items_LoadState(var Mem
: TBinMemoryReader
);
611 count
, i
, a
: Integer;
620 // Êîëè÷åñòâî ïðåäìåòîâ:
626 for a
:= 0 to count
-1 do
628 // Ñèãíàòóðà ïðåäìåòà:
630 if sig
<> ITEM_SIGNATURE
then // 'ITEM'
632 raise EBinSizeError
.Create('g_Items_LoadState: Wrong Item Signature');
637 i
:= g_Items_Create(0, 0, b
, False, False);
639 Mem
.ReadBoolean(gItems
[i
].Respawnable
);
640 // Êîîðäèíàòû ðåñïóíà:
641 Mem
.ReadInt(gItems
[i
].InitX
);
642 Mem
.ReadInt(gItems
[i
].InitY
);
643 // Âðåìÿ äî ðåñïàóíà:
644 Mem
.ReadWord(gItems
[i
].RespawnTime
);
645 // Ñóùåñòâóåò ëè ýòîò ïðåäìåò:
646 Mem
.ReadBoolean(gItems
[i
].Live
);
647 // Ìîæåò ëè îí ïàäàòü:
648 Mem
.ReadBoolean(gItems
[i
].Fall
);
649 // Èíäåêñ òðèããåðà, ñîçäàâøåãî ïðåäìåò:
650 Mem
.ReadInt(gItems
[i
].SpawnTrigger
);
652 Obj_LoadState(@gItems
[i
].Obj
, Mem
);