diff --git a/src/game/g_items.pas b/src/game/g_items.pas
index 07c4df2b1d8e929832c6ac67b97f548de27b3d4d..b3d8522465bc8b6da4c182b4ef7586e2a1130020 100644 (file)
--- a/src/game/g_items.pas
+++ b/src/game/g_items.pas
Obj: TObj;
Animation: TAnimation;
dropped: Boolean; // dropped from the monster? drops should be rendered after corpses, so zombie corpse will not obscure ammo container, for example
Obj: TObj;
Animation: TAnimation;
dropped: Boolean; // dropped from the monster? drops should be rendered after corpses, so zombie corpse will not obscure ammo container, for example
+ NeedSend: Boolean;
procedure positionChanged (); //WARNING! call this after monster position was changed, or coldet will not work right!
procedure positionChanged (); //WARNING! call this after monster position was changed, or coldet will not work right!
+ procedure getMapBox (out x, y, w, h: Integer); inline;
+ procedure moveBy (dx, dy: Integer); inline;
property myid: Integer read arrIdx;
end;
property myid: Integer read arrIdx;
end;
function g_Items_Create(X, Y: Integer; ItemType: Byte;
Fall, Respawnable: Boolean; AdjCoord: Boolean = False; ForcedID: Integer = -1): DWORD;
procedure g_Items_SetDrop (ID: DWORD);
function g_Items_Create(X, Y: Integer; ItemType: Byte;
Fall, Respawnable: Boolean; AdjCoord: Boolean = False; ForcedID: Integer = -1): DWORD;
procedure g_Items_SetDrop (ID: DWORD);
+procedure g_Items_PreUpdate();
procedure g_Items_Update();
procedure g_Items_Draw();
procedure g_Items_DrawDrop();
procedure g_Items_Update();
procedure g_Items_Draw();
procedure g_Items_DrawDrop();
TItemEachAliveCB = function (it: PItem): Boolean is nested; // return `true` to stop
function g_Items_ForEachAlive (cb: TItemEachAliveCB; backwards: Boolean=false): Boolean;
TItemEachAliveCB = function (it: PItem): Boolean is nested; // return `true` to stop
function g_Items_ForEachAlive (cb: TItemEachAliveCB; backwards: Boolean=false): Boolean;
-
+function g_Items_NextAlive (startIdx: Integer): PItem;
var
gItemsTexturesID: Array [1..ITEM_MAX] of DWORD;
gMaxDist: Integer = 1; // for sounds
var
gItemsTexturesID: Array [1..ITEM_MAX] of DWORD;
gMaxDist: Integer = 1; // for sounds
- ITEM_RESPAWNTIME: Integer = 60 * 36;
implementation
implementation
// ////////////////////////////////////////////////////////////////////////// //
procedure TItem.positionChanged ();
begin
// ////////////////////////////////////////////////////////////////////////// //
procedure TItem.positionChanged ();
begin
+ NeedSend := NeedSend or (Obj.X <> Obj.oldX) or (Obj.Y <> Obj.oldY);
+end;
+
+procedure TItem.getMapBox (out x, y, w, h: Integer); inline;
+begin
+ x := Obj.X+Obj.Rect.X;
+ y := Obj.Y+Obj.Rect.Y;
+ w := Obj.Rect.Width;
+ h := Obj.Rect.Height;
end;
end;
+procedure TItem.moveBy (dx, dy: Integer); inline;
+begin
+ if (dx <> 0) or (dy <> 0) then
+ begin
+ Obj.X += dx;
+ Obj.Y += dy;
+ positionChanged();
+ end;
+end;
// ////////////////////////////////////////////////////////////////////////// //
const
// ////////////////////////////////////////////////////////////////////////// //
const
((62), (16)), // WEAPON_ROCKETLAUNCHER
((54), (16)), // WEAPON_PLASMA
((61), (36)), // WEAPON_BFG
((62), (16)), // WEAPON_ROCKETLAUNCHER
((54), (16)), // WEAPON_PLASMA
((61), (36)), // WEAPON_BFG
- ((54), (16)), // WEAPON_SUPERPULEMET
+ ((54), (16)), // WEAPON_SUPERCHAINGUN
(( 9), (11)), // AMMO_BULLETS
((28), (16)), // AMMO_BULLETS_BOX
((15), ( 7)), // AMMO_SHELLS
(( 9), (11)), // AMMO_BULLETS
((28), (16)), // AMMO_BULLETS_BOX
((15), ( 7)), // AMMO_SHELLS
((16), (16)), // KEY_RED
((16), (16)), // KEY_GREEN
((16), (16)), // KEY_BLUE
((16), (16)), // KEY_RED
((16), (16)), // KEY_GREEN
((16), (16)), // KEY_BLUE
- (( 1), ( 1)), // WEAPON_KASTET
+ (( 1), ( 1)), // WEAPON_IRONFIST
((43), (16)), // WEAPON_PISTOL
((14), (18)), // BOTTLE
((16), (15)), // HELMET
((43), (16)), // WEAPON_PISTOL
((14), (18)), // BOTTLE
((16), (15)), // HELMET
g_Texture_Get('ITEM_MEDKIT_SMALL', gItemsTexturesID[ITEM_MEDKIT_SMALL]);
g_Texture_Get('ITEM_MEDKIT_LARGE', gItemsTexturesID[ITEM_MEDKIT_LARGE]);
g_Texture_Get('ITEM_MEDKIT_BLACK', gItemsTexturesID[ITEM_MEDKIT_BLACK]);
g_Texture_Get('ITEM_MEDKIT_SMALL', gItemsTexturesID[ITEM_MEDKIT_SMALL]);
g_Texture_Get('ITEM_MEDKIT_LARGE', gItemsTexturesID[ITEM_MEDKIT_LARGE]);
g_Texture_Get('ITEM_MEDKIT_BLACK', gItemsTexturesID[ITEM_MEDKIT_BLACK]);
- g_Texture_Get('ITEM_SUIT', gItemsTexturesID[ITEM_SUIT]);
- g_Texture_Get('ITEM_OXYGEN', gItemsTexturesID[ITEM_OXYGEN]);
+ g_Texture_Get('ITEM_WEAPON_IRONFIST', gItemsTexturesID[ITEM_WEAPON_IRONFIST]);
g_Texture_Get('ITEM_WEAPON_SAW', gItemsTexturesID[ITEM_WEAPON_SAW]);
g_Texture_Get('ITEM_WEAPON_SAW', gItemsTexturesID[ITEM_WEAPON_SAW]);
+ g_Texture_Get('ITEM_WEAPON_PISTOL', gItemsTexturesID[ITEM_WEAPON_PISTOL]);
g_Texture_Get('ITEM_WEAPON_SHOTGUN1', gItemsTexturesID[ITEM_WEAPON_SHOTGUN1]);
g_Texture_Get('ITEM_WEAPON_SHOTGUN2', gItemsTexturesID[ITEM_WEAPON_SHOTGUN2]);
g_Texture_Get('ITEM_WEAPON_CHAINGUN', gItemsTexturesID[ITEM_WEAPON_CHAINGUN]);
g_Texture_Get('ITEM_WEAPON_ROCKETLAUNCHER', gItemsTexturesID[ITEM_WEAPON_ROCKETLAUNCHER]);
g_Texture_Get('ITEM_WEAPON_PLASMA', gItemsTexturesID[ITEM_WEAPON_PLASMA]);
g_Texture_Get('ITEM_WEAPON_BFG', gItemsTexturesID[ITEM_WEAPON_BFG]);
g_Texture_Get('ITEM_WEAPON_SHOTGUN1', gItemsTexturesID[ITEM_WEAPON_SHOTGUN1]);
g_Texture_Get('ITEM_WEAPON_SHOTGUN2', gItemsTexturesID[ITEM_WEAPON_SHOTGUN2]);
g_Texture_Get('ITEM_WEAPON_CHAINGUN', gItemsTexturesID[ITEM_WEAPON_CHAINGUN]);
g_Texture_Get('ITEM_WEAPON_ROCKETLAUNCHER', gItemsTexturesID[ITEM_WEAPON_ROCKETLAUNCHER]);
g_Texture_Get('ITEM_WEAPON_PLASMA', gItemsTexturesID[ITEM_WEAPON_PLASMA]);
g_Texture_Get('ITEM_WEAPON_BFG', gItemsTexturesID[ITEM_WEAPON_BFG]);
- g_Texture_Get('ITEM_WEAPON_SUPERPULEMET', gItemsTexturesID[ITEM_WEAPON_SUPERPULEMET]);
+ g_Texture_Get('ITEM_WEAPON_SUPERCHAINGUN', gItemsTexturesID[ITEM_WEAPON_SUPERCHAINGUN]);
g_Texture_Get('ITEM_WEAPON_FLAMETHROWER', gItemsTexturesID[ITEM_WEAPON_FLAMETHROWER]);
g_Texture_Get('ITEM_AMMO_BULLETS', gItemsTexturesID[ITEM_AMMO_BULLETS]);
g_Texture_Get('ITEM_AMMO_BULLETS_BOX', gItemsTexturesID[ITEM_AMMO_BULLETS_BOX]);
g_Texture_Get('ITEM_WEAPON_FLAMETHROWER', gItemsTexturesID[ITEM_WEAPON_FLAMETHROWER]);
g_Texture_Get('ITEM_AMMO_BULLETS', gItemsTexturesID[ITEM_AMMO_BULLETS]);
g_Texture_Get('ITEM_AMMO_BULLETS_BOX', gItemsTexturesID[ITEM_AMMO_BULLETS_BOX]);
g_Texture_Get('ITEM_KEY_RED', gItemsTexturesID[ITEM_KEY_RED]);
g_Texture_Get('ITEM_KEY_GREEN', gItemsTexturesID[ITEM_KEY_GREEN]);
g_Texture_Get('ITEM_KEY_BLUE', gItemsTexturesID[ITEM_KEY_BLUE]);
g_Texture_Get('ITEM_KEY_RED', gItemsTexturesID[ITEM_KEY_RED]);
g_Texture_Get('ITEM_KEY_GREEN', gItemsTexturesID[ITEM_KEY_GREEN]);
g_Texture_Get('ITEM_KEY_BLUE', gItemsTexturesID[ITEM_KEY_BLUE]);
- g_Texture_Get('ITEM_WEAPON_KASTET', gItemsTexturesID[ITEM_WEAPON_KASTET]);
- g_Texture_Get('ITEM_WEAPON_PISTOL', gItemsTexturesID[ITEM_WEAPON_PISTOL]);
+ g_Texture_Get('ITEM_OXYGEN', gItemsTexturesID[ITEM_OXYGEN]);
+ g_Texture_Get('ITEM_SUIT', gItemsTexturesID[ITEM_SUIT]);
end;
procedure g_Items_LoadData();
end;
procedure g_Items_LoadData();
e_WriteLog('Loading items data...', TMsgType.Notify);
g_Sound_CreateWADEx('SOUND_ITEM_RESPAWNITEM', GameWAD+':SOUNDS\RESPAWNITEM');
e_WriteLog('Loading items data...', TMsgType.Notify);
g_Sound_CreateWADEx('SOUND_ITEM_RESPAWNITEM', GameWAD+':SOUNDS\RESPAWNITEM');
- g_Sound_CreateWADEx('SOUND_ITEM_GETRULEZ', GameWAD+':SOUNDS\GETRULEZ');
+ g_Sound_CreateWADEx('SOUND_ITEM_GETPOWERUP', GameWAD+':SOUNDS\GETPOWERUP');
g_Sound_CreateWADEx('SOUND_ITEM_GETWEAPON', GameWAD+':SOUNDS\GETWEAPON');
g_Sound_CreateWADEx('SOUND_ITEM_GETITEM', GameWAD+':SOUNDS\GETITEM');
g_Sound_CreateWADEx('SOUND_ITEM_GETWEAPON', GameWAD+':SOUNDS\GETWEAPON');
g_Sound_CreateWADEx('SOUND_ITEM_GETITEM', GameWAD+':SOUNDS\GETITEM');
g_Frames_CreateWAD(nil, 'FRAMES_FLAG_DOM', GameWAD+':TEXTURES\FLAGDOM', 64, 64, 5, False);
g_Texture_CreateWADEx('ITEM_MEDKIT_SMALL', GameWAD+':TEXTURES\MED1');
g_Texture_CreateWADEx('ITEM_MEDKIT_LARGE', GameWAD+':TEXTURES\MED2');
g_Frames_CreateWAD(nil, 'FRAMES_FLAG_DOM', GameWAD+':TEXTURES\FLAGDOM', 64, 64, 5, False);
g_Texture_CreateWADEx('ITEM_MEDKIT_SMALL', GameWAD+':TEXTURES\MED1');
g_Texture_CreateWADEx('ITEM_MEDKIT_LARGE', GameWAD+':TEXTURES\MED2');
+ g_Texture_CreateWADEx('ITEM_MEDKIT_BLACK', GameWAD+':TEXTURES\BMED');
+ g_Texture_CreateWADEx('ITEM_WEAPON_IRONFIST', GameWAD+':TEXTURES\IRONFIST');
g_Texture_CreateWADEx('ITEM_WEAPON_SAW', GameWAD+':TEXTURES\SAW');
g_Texture_CreateWADEx('ITEM_WEAPON_PISTOL', GameWAD+':TEXTURES\PISTOL');
g_Texture_CreateWADEx('ITEM_WEAPON_SAW', GameWAD+':TEXTURES\SAW');
g_Texture_CreateWADEx('ITEM_WEAPON_PISTOL', GameWAD+':TEXTURES\PISTOL');
- g_Texture_CreateWADEx('ITEM_WEAPON_KASTET', GameWAD+':TEXTURES\KASTET');
g_Texture_CreateWADEx('ITEM_WEAPON_SHOTGUN1', GameWAD+':TEXTURES\SHOTGUN1');
g_Texture_CreateWADEx('ITEM_WEAPON_SHOTGUN2', GameWAD+':TEXTURES\SHOTGUN2');
g_Texture_CreateWADEx('ITEM_WEAPON_CHAINGUN', GameWAD+':TEXTURES\MGUN');
g_Texture_CreateWADEx('ITEM_WEAPON_ROCKETLAUNCHER', GameWAD+':TEXTURES\RLAUNCHER');
g_Texture_CreateWADEx('ITEM_WEAPON_PLASMA', GameWAD+':TEXTURES\PGUN');
g_Texture_CreateWADEx('ITEM_WEAPON_BFG', GameWAD+':TEXTURES\BFG');
g_Texture_CreateWADEx('ITEM_WEAPON_SHOTGUN1', GameWAD+':TEXTURES\SHOTGUN1');
g_Texture_CreateWADEx('ITEM_WEAPON_SHOTGUN2', GameWAD+':TEXTURES\SHOTGUN2');
g_Texture_CreateWADEx('ITEM_WEAPON_CHAINGUN', GameWAD+':TEXTURES\MGUN');
g_Texture_CreateWADEx('ITEM_WEAPON_ROCKETLAUNCHER', GameWAD+':TEXTURES\RLAUNCHER');
g_Texture_CreateWADEx('ITEM_WEAPON_PLASMA', GameWAD+':TEXTURES\PGUN');
g_Texture_CreateWADEx('ITEM_WEAPON_BFG', GameWAD+':TEXTURES\BFG');
- g_Texture_CreateWADEx('ITEM_WEAPON_SUPERPULEMET', GameWAD+':TEXTURES\SPULEMET');
+ g_Texture_CreateWADEx('ITEM_WEAPON_SUPERCHAINGUN', GameWAD+':TEXTURES\SCHAINGUN');
g_Texture_CreateWADEx('ITEM_WEAPON_FLAMETHROWER', GameWAD+':TEXTURES\FLAMETHROWER');
g_Texture_CreateWADEx('ITEM_AMMO_BULLETS', GameWAD+':TEXTURES\CLIP');
g_Texture_CreateWADEx('ITEM_AMMO_BULLETS_BOX', GameWAD+':TEXTURES\AMMO');
g_Texture_CreateWADEx('ITEM_WEAPON_FLAMETHROWER', GameWAD+':TEXTURES\FLAMETHROWER');
g_Texture_CreateWADEx('ITEM_AMMO_BULLETS', GameWAD+':TEXTURES\CLIP');
g_Texture_CreateWADEx('ITEM_AMMO_BULLETS_BOX', GameWAD+':TEXTURES\AMMO');
g_Texture_CreateWADEx('ITEM_KEY_BLUE', GameWAD+':TEXTURES\KEYB');
g_Texture_CreateWADEx('ITEM_OXYGEN', GameWAD+':TEXTURES\OXYGEN');
g_Texture_CreateWADEx('ITEM_SUIT', GameWAD+':TEXTURES\SUIT');
g_Texture_CreateWADEx('ITEM_KEY_BLUE', GameWAD+':TEXTURES\KEYB');
g_Texture_CreateWADEx('ITEM_OXYGEN', GameWAD+':TEXTURES\OXYGEN');
g_Texture_CreateWADEx('ITEM_SUIT', GameWAD+':TEXTURES\SUIT');
- g_Texture_CreateWADEx('ITEM_WEAPON_KASTET', GameWAD+':TEXTURES\KASTET');
- g_Texture_CreateWADEx('ITEM_MEDKIT_BLACK', GameWAD+':TEXTURES\BMED');
InitTextures();
InitTextures();
e_WriteLog('Releasing items data...', TMsgType.Notify);
g_Sound_Delete('SOUND_ITEM_RESPAWNITEM');
e_WriteLog('Releasing items data...', TMsgType.Notify);
g_Sound_Delete('SOUND_ITEM_RESPAWNITEM');
- g_Sound_Delete('SOUND_ITEM_GETRULEZ');
+ g_Sound_Delete('SOUND_ITEM_GETPOWERUP');
g_Sound_Delete('SOUND_ITEM_GETWEAPON');
g_Sound_Delete('SOUND_ITEM_GETITEM');
g_Sound_Delete('SOUND_ITEM_GETWEAPON');
g_Sound_Delete('SOUND_ITEM_GETITEM');
g_Frames_DeleteByName('FRAMES_FLAG_DOM');
g_Texture_Delete('ITEM_MEDKIT_SMALL');
g_Texture_Delete('ITEM_MEDKIT_LARGE');
g_Frames_DeleteByName('FRAMES_FLAG_DOM');
g_Texture_Delete('ITEM_MEDKIT_SMALL');
g_Texture_Delete('ITEM_MEDKIT_LARGE');
+ g_Texture_Delete('ITEM_MEDKIT_BLACK');
+ g_Texture_Delete('ITEM_WEAPON_IRONFIST');
g_Texture_Delete('ITEM_WEAPON_SAW');
g_Texture_Delete('ITEM_WEAPON_PISTOL');
g_Texture_Delete('ITEM_WEAPON_SAW');
g_Texture_Delete('ITEM_WEAPON_PISTOL');
- g_Texture_Delete('ITEM_WEAPON_KASTET');
g_Texture_Delete('ITEM_WEAPON_SHOTGUN1');
g_Texture_Delete('ITEM_WEAPON_SHOTGUN2');
g_Texture_Delete('ITEM_WEAPON_CHAINGUN');
g_Texture_Delete('ITEM_WEAPON_ROCKETLAUNCHER');
g_Texture_Delete('ITEM_WEAPON_PLASMA');
g_Texture_Delete('ITEM_WEAPON_BFG');
g_Texture_Delete('ITEM_WEAPON_SHOTGUN1');
g_Texture_Delete('ITEM_WEAPON_SHOTGUN2');
g_Texture_Delete('ITEM_WEAPON_CHAINGUN');
g_Texture_Delete('ITEM_WEAPON_ROCKETLAUNCHER');
g_Texture_Delete('ITEM_WEAPON_PLASMA');
g_Texture_Delete('ITEM_WEAPON_BFG');
- g_Texture_Delete('ITEM_WEAPON_SUPERPULEMET');
+ g_Texture_Delete('ITEM_WEAPON_SUPERCHAINGUN');
g_Texture_Delete('ITEM_WEAPON_FLAMETHROWER');
g_Texture_Delete('ITEM_AMMO_BULLETS');
g_Texture_Delete('ITEM_AMMO_BULLETS_BOX');
g_Texture_Delete('ITEM_WEAPON_FLAMETHROWER');
g_Texture_Delete('ITEM_AMMO_BULLETS');
g_Texture_Delete('ITEM_AMMO_BULLETS_BOX');
g_Texture_Delete('ITEM_KEY_BLUE');
g_Texture_Delete('ITEM_OXYGEN');
g_Texture_Delete('ITEM_SUIT');
g_Texture_Delete('ITEM_KEY_BLUE');
g_Texture_Delete('ITEM_OXYGEN');
g_Texture_Delete('ITEM_SUIT');
- g_Texture_Delete('ITEM_WEAPON_KASTET');
- g_Texture_Delete('ITEM_MEDKIT_BLACK');
freeIds.Free();
freeIds := nil;
freeIds.Free();
freeIds := nil;
it.alive := False;
it.SpawnTrigger := -1;
it.ItemType := ITEM_NONE;
it.alive := False;
it.SpawnTrigger := -1;
it.ItemType := ITEM_NONE;
+ it.NeedSend := false;
freeIds.release(LongWord(idx));
end;
freeIds.release(LongWord(idx));
end;
it.alive := false;
it.SpawnTrigger := -1;
it.Respawnable := false;
it.alive := false;
it.SpawnTrigger := -1;
it.Respawnable := false;
+ it.NeedSend := false;
//if not freeIds.hasFree[LongWord(i)] then raise Exception.Create('internal error in item idx manager');
end;
end;
//if not freeIds.hasFree[LongWord(i)] then raise Exception.Create('internal error in item idx manager');
end;
end;
it.slotIsUsed := true;
it.ItemType := ItemType;
it.slotIsUsed := true;
it.ItemType := ItemType;
- if g_Game_IsServer and ((ITEM_RESPAWNTIME = 0) or not LongBool(gGameSettings.Options and GAME_OPTION_RESPAWNITEMS)) then
- it.Respawnable := False
- else
- it.Respawnable := Respawnable;
+ it.Respawnable := Respawnable;
it.InitX := X;
it.InitY := Y;
it.RespawnTime := 0;
it.InitX := X;
it.InitY := Y;
it.RespawnTime := 0;
it.alive := True;
it.QuietRespawn := False;
it.dropped := false;
it.alive := True;
it.QuietRespawn := False;
it.dropped := false;
+ it.NeedSend := false;
g_Obj_Init(@it.Obj);
it.Obj.X := X;
g_Obj_Init(@it.Obj);
it.Obj.X := X;
end;
end;
end;
end;
+ it.Obj.oldX := it.Obj.X;
+ it.Obj.oldY := it.Obj.Y;
+
// Óñòàíîâêà àíèìàöèè
case it.ItemType of
ITEM_ARMOR_GREEN: if g_Frames_Get(ID, 'FRAMES_ITEM_ARMORGREEN') then it.Animation := TAnimation.Create(ID, True, 20);
// Óñòàíîâêà àíèìàöèè
case it.ItemType of
ITEM_ARMOR_GREEN: if g_Frames_Get(ID, 'FRAMES_ITEM_ARMORGREEN') then it.Animation := TAnimation.Create(ID, True, 20);
result := find_id;
end;
result := find_id;
end;
+procedure g_Items_PreUpdate ();
+var
+ i: Integer;
+begin
+ if (ggItems = nil) then Exit;
+ for i := 0 to High(ggItems) do
+ if (ggItems[i].ItemType <> ITEM_NONE) and ggItems[i].slotIsUsed then
+ begin
+ ggItems[i].Obj.oldX := ggItems[i].Obj.X;
+ ggItems[i].Obj.oldY := ggItems[i].Obj.Y;
+ end;
+end;
procedure g_Items_Update ();
var
i, j, k: Integer;
ID: DWord;
Anim: TAnimation;
procedure g_Items_Update ();
var
i, j, k: Integer;
ID: DWord;
Anim: TAnimation;
- m: Word;
+ m, ItemRespawnTime{, PowerupRespawnTime}: Word;
r, nxt: Boolean;
begin
if (ggItems = nil) then exit;
r, nxt: Boolean;
begin
if (ggItems = nil) then exit;
+ // respawn items in 15 seconds regardless of settings during warmup
+ ItemRespawnTime := IfThen(gLMSRespawn = LMS_RESPAWN_NONE, gGameSettings.ItemRespawnTime, 15);
+ //PowerupRespawnTime := IfThen(gLMSRespawn = LMS_RESPAWN_NONE, gGameSettings.PowerupRespawnTime, 15);
+
for i := 0 to High(ggItems) do
begin
if (ggItems[i].ItemType = ITEM_NONE) then continue;
for i := 0 to High(ggItems) do
begin
if (ggItems[i].ItemType = ITEM_NONE) then continue;
// Íàäî óáðàòü ñ êàðòû, åñëè ýòî íå êëþ÷, êîòîðûì íóæíî ïîäåëèòüñÿ ñ äðóãèì èãðîêîì
if r then
begin
// Íàäî óáðàòü ñ êàðòû, åñëè ýòî íå êëþ÷, êîòîðûì íóæíî ïîäåëèòüñÿ ñ äðóãèì èãðîêîì
if r then
begin
- if not Respawnable then g_Items_Remove(i) else g_Items_Pick(i);
+ if not (Respawnable and (ItemRespawnTime > 0)) then
+ g_Items_Remove(i)
+ else
+ g_Items_Pick(i);
if g_Game_IsNet then MH_SEND_ItemDestroy(False, i);
nxt := True;
break;
if g_Game_IsNet then MH_SEND_ItemDestroy(False, i);
nxt := True;
break;
Anim.Free();
end;
Anim.Free();
end;
+ Obj.oldX := InitX;
+ Obj.oldY := InitY;
Obj.X := InitX;
Obj.Y := InitY;
Obj.Vel.X := 0;
Obj.X := InitX;
Obj.Y := InitY;
Obj.Vel.X := 0;
procedure itemsDrawInternal (dropflag: Boolean);
var
procedure itemsDrawInternal (dropflag: Boolean);
var
- i: Integer;
+ i, fX, fY: Integer;
it: PItem;
begin
if (ggItems = nil) then exit;
it: PItem;
begin
if (ggItems = nil) then exit;
begin
if g_Collide(Obj.X, Obj.Y, Obj.Rect.Width, Obj.Rect.Height, sX, sY, sWidth, sHeight) then
begin
begin
if g_Collide(Obj.X, Obj.Y, Obj.Rect.Width, Obj.Rect.Height, sX, sY, sWidth, sHeight) then
begin
+ Obj.lerp(gLerpFactor, fX, fY);
if (Animation = nil) then
begin
if (Animation = nil) then
begin
- e_Draw(gItemsTexturesID[ItemType], Obj.X, Obj.Y, 0, true, false);
+ e_Draw(gItemsTexturesID[ItemType], fX, fY, 0, true, false);
end
else
begin
end
else
begin
- Animation.Draw(Obj.X, Obj.Y, TMirrorType.None);
+ Animation.Draw(fX, fY, TMirrorType.None);
end;
if g_debug_Frames then
end;
if g_debug_Frames then
procedure g_Items_Pick (ID: DWORD);
begin
procedure g_Items_Pick (ID: DWORD);
begin
- if (ID < Length(ggItems)) then
+ if ID >= Length(ggItems) then exit;
+
+ ggItems[ID].Obj.oldX := ggItems[ID].Obj.X;
+ ggItems[ID].Obj.oldY := ggItems[ID].Obj.Y;
+ ggItems[ID].alive := false;
+
+ // Items respawn timer
+ ggItems[ID].RespawnTime := IfThen(gLMSRespawn = LMS_RESPAWN_NONE, gGameSettings.ItemRespawnTime, 15) * 36;
+
+ // Powerup respawn timer
+ if ggItems[ID].ItemType in [ITEM_SPHERE_BLUE, ITEM_SPHERE_WHITE, ITEM_INVUL, ITEM_INVIS,
+ ITEM_MEDKIT_BLACK, ITEM_JETPACK, ITEM_SUIT] then
begin
begin
- ggItems[ID].alive := false;
- ggItems[ID].RespawnTime := ITEM_RESPAWNTIME;
+ ggItems[ID].RespawnTime := IfThen(gLMSRespawn = LMS_RESPAWN_NONE, gGameSettings.PowerupRespawnTime, 15) * 36;
+ end;
+
+ // #### Random powerup respawn ####
+ if (TGameOption.POWERUP_RANDOM in gGameSettings.Options) and (ggItems[ID].ItemType in [
+ ITEM_SPHERE_BLUE, ITEM_SPHERE_WHITE, ITEM_INVUL, ITEM_INVIS, ITEM_MEDKIT_BLACK, ITEM_JETPACK,
+ ITEM_SUIT
+ ]) then
+ begin
+ ggItems[ID].RespawnTime := Max(1, (gGameSettings.PowerupRespawnTime +
+ RandomRange(-gGameSettings.PowerupRespawnRandom, gGameSettings.PowerupRespawnRandom + 1)) * 36);
+ //e_logwritefln ('Randomized powerup %s time: %s', [ggItems[ID].ItemType, ggItems[ID].RespawnTime]);
end;
end;
-end;
+ // #### Random item respawn ####
+ // Randomize respawn for all items (excluding powerups)
+ if (TGameOption.ITEM_ALL_RANDOM in gGameSettings.Options) and (ggItems[ID].ItemType in [
+ ITEM_MEDKIT_SMALL, ITEM_MEDKIT_LARGE, ITEM_ARMOR_GREEN, ITEM_ARMOR_BLUE, ITEM_BOTTLE,
+ ITEM_HELMET, ITEM_OXYGEN, ITEM_AMMO_BULLETS, ITEM_AMMO_BULLETS_BOX, ITEM_AMMO_SHELLS,
+ ITEM_AMMO_SHELLS_BOX, ITEM_AMMO_ROCKET, ITEM_AMMO_ROCKET_BOX, ITEM_AMMO_CELL,
+ ITEM_AMMO_CELL_BIG, ITEM_AMMO_FUELCAN, ITEM_AMMO_BACKPACK, ITEM_WEAPON_SAW,
+ ITEM_WEAPON_SHOTGUN1, ITEM_WEAPON_SHOTGUN2, ITEM_WEAPON_CHAINGUN, ITEM_WEAPON_ROCKETLAUNCHER,
+ ITEM_WEAPON_PLASMA, ITEM_WEAPON_BFG, ITEM_WEAPON_SUPERCHAINGUN, ITEM_WEAPON_FLAMETHROWER
+ ]) then
+ begin
+ ggItems[ID].RespawnTime := Max(1, (gGameSettings.ItemRespawnTime +
+ RandomRange(-gGameSettings.ItemRespawnRandom, gGameSettings.ItemRespawnRandom + 1)) * 36);
+ //e_logwritefln ('Randomized item %s time: %s', [ggItems[ID].ItemType, ggItems[ID].RespawnTime]);
+ end;
+
+ // Randomize respawn for heal/armor
+ if (TGameOption.ITEM_LIFE_RANDOM in gGameSettings.Options) and (ggItems[ID].ItemType in [
+ ITEM_MEDKIT_SMALL, ITEM_MEDKIT_LARGE, ITEM_ARMOR_GREEN, ITEM_ARMOR_BLUE, ITEM_BOTTLE,
+ ITEM_HELMET, ITEM_OXYGEN, ITEM_AMMO_BACKPACK
+ ]) then
+ begin
+ ggItems[ID].RespawnTime := Max(1, (gGameSettings.ItemRespawnTime +
+ RandomRange(-gGameSettings.ItemRespawnRandom, gGameSettings.ItemRespawnRandom + 1)) * 36);
+ //e_logwritefln ('Randomized help item %s time: %s', [ggItems[ID].ItemType, ggItems[ID].RespawnTime]);
+ end;
+
+ // Randomize respawn for ammo
+ if (TGameOption.ITEM_AMMO_RANDOM in gGameSettings.Options) and (ggItems[ID].ItemType in [
+ ITEM_AMMO_BULLETS, ITEM_AMMO_BULLETS_BOX, ITEM_AMMO_SHELLS, ITEM_AMMO_SHELLS_BOX,
+ ITEM_AMMO_ROCKET, ITEM_AMMO_ROCKET_BOX, ITEM_AMMO_CELL, ITEM_AMMO_CELL_BIG, ITEM_AMMO_FUELCAN
+ ]) then
+ begin
+ ggItems[ID].RespawnTime := Max(1, (gGameSettings.ItemRespawnTime +
+ RandomRange(-gGameSettings.ItemRespawnRandom, gGameSettings.ItemRespawnRandom + 1)) * 36);
+ //e_logwritefln ('Randomized ammo %s time: %s', [ggItems[ID].ItemType, ggItems[ID].RespawnTime]);
+ end;
+
+ // Randomize respawn for weapons
+ if (TGameOption.ITEM_WEAPON_RANDOM in gGameSettings.Options) and (ggItems[ID].ItemType in [
+ ITEM_WEAPON_SAW, ITEM_WEAPON_SHOTGUN1, ITEM_WEAPON_SHOTGUN2, ITEM_WEAPON_CHAINGUN,
+ ITEM_WEAPON_ROCKETLAUNCHER, ITEM_WEAPON_PLASMA, ITEM_WEAPON_BFG, ITEM_WEAPON_SUPERCHAINGUN,
+ ITEM_WEAPON_FLAMETHROWER
+ ]) then
+ begin
+ ggItems[ID].RespawnTime := Max(1, (gGameSettings.ItemRespawnTime +
+ RandomRange(-gGameSettings.ItemRespawnRandom, gGameSettings.ItemRespawnRandom + 1)) * 36);
+ //e_logwritefln ('Randomized weapon %s time: %s', [ggItems[ID].ItemType, ggItems[ID].RespawnTime]);
+ end;
+end;
procedure g_Items_Remove (ID: DWORD);
var
procedure g_Items_Remove (ID: DWORD);
var
it := @ggItems[ID];
if (it.arrIdx <> Integer(ID)) then raise Exception.Create('g_Items_Remove: arrIdx desync');
it := @ggItems[ID];
if (it.arrIdx <> Integer(ID)) then raise Exception.Create('g_Items_Remove: arrIdx desync');
+ it.Obj.oldX := it.Obj.X;
+ it.Obj.oldY := it.Obj.Y;
trig := it.SpawnTrigger;
releaseItem(ID);
trig := it.SpawnTrigger;
releaseItem(ID);
for i := 0 to High(ggItems) do
begin
it := @ggItems[i];
for i := 0 to High(ggItems) do
begin
it := @ggItems[i];
+ it.Obj.oldX := it.Obj.X;
+ it.Obj.oldY := it.Obj.Y;
if not it.slotIsUsed then continue;
if it.Respawnable and (it.ItemType <> ITEM_NONE) then
begin
if not it.slotIsUsed then continue;
if it.Respawnable and (it.ItemType <> ITEM_NONE) then
begin
end;
end;
end;
end;
+function g_Items_NextAlive (startIdx: Integer): PItem;
+var
+ idx: Integer;
+begin
+ result := nil;
+ if (ggItems = nil) or (startIdx >= High(ggItems)) then exit;
+ for idx := startIdx + 1 to High(ggItems) do
+ if ggItems[idx].alive and ggItems[idx].slotIsUsed then
+ begin
+ result := @ggItems[idx];
+ exit;
+ end;
+end;
// ////////////////////////////////////////////////////////////////////////// //
procedure g_Items_EmitPickupSound (idx: Integer);
// ////////////////////////////////////////////////////////////////////////// //
procedure g_Items_EmitPickupSound (idx: Integer);
it := @ggItems[idx];
if gSoundEffectsDF then
begin
it := @ggItems[idx];
if gSoundEffectsDF then
begin
- if it.ItemType in [ITEM_SPHERE_BLUE, ITEM_SPHERE_WHITE, ITEM_INVUL,
- ITEM_INVIS, ITEM_MEDKIT_BLACK, ITEM_JETPACK] then
+ if it.ItemType in [ITEM_SPHERE_BLUE, ITEM_SPHERE_WHITE, ITEM_INVUL, ITEM_INVIS,
+ ITEM_JETPACK, ITEM_MEDKIT_BLACK] then
begin
begin
- g_Sound_PlayExAt('SOUND_ITEM_GETRULEZ', x, y);
+ g_Sound_PlayExAt('SOUND_ITEM_GETPOWERUP', x, y);
end
else if it.ItemType in [ITEM_WEAPON_SAW, ITEM_WEAPON_PISTOL, ITEM_WEAPON_SHOTGUN1, ITEM_WEAPON_SHOTGUN2,
ITEM_WEAPON_CHAINGUN, ITEM_WEAPON_ROCKETLAUNCHER, ITEM_WEAPON_PLASMA,
end
else if it.ItemType in [ITEM_WEAPON_SAW, ITEM_WEAPON_PISTOL, ITEM_WEAPON_SHOTGUN1, ITEM_WEAPON_SHOTGUN2,
ITEM_WEAPON_CHAINGUN, ITEM_WEAPON_ROCKETLAUNCHER, ITEM_WEAPON_PLASMA,
- ITEM_WEAPON_BFG, ITEM_WEAPON_SUPERPULEMET, ITEM_WEAPON_FLAMETHROWER,
+ ITEM_WEAPON_BFG, ITEM_WEAPON_SUPERCHAINGUN, ITEM_WEAPON_FLAMETHROWER,
ITEM_AMMO_BACKPACK] then
begin
g_Sound_PlayExAt('SOUND_ITEM_GETWEAPON', x, y);
ITEM_AMMO_BACKPACK] then
begin
g_Sound_PlayExAt('SOUND_ITEM_GETWEAPON', x, y);
end
else
begin
end
else
begin
- if it.ItemType in [ITEM_SPHERE_BLUE, ITEM_SPHERE_WHITE, ITEM_SUIT,
- ITEM_MEDKIT_BLACK, ITEM_INVUL, ITEM_INVIS, ITEM_JETPACK] then
+ if it.ItemType in [ITEM_SPHERE_BLUE, ITEM_SPHERE_WHITE, ITEM_INVUL, ITEM_INVIS,
+ ITEM_SUIT, ITEM_JETPACK, ITEM_MEDKIT_BLACK] then
begin
begin
- g_Sound_PlayExAt('SOUND_ITEM_GETRULEZ', x, y);
+ g_Sound_PlayExAt('SOUND_ITEM_GETPOWERUP', x, y);
end
else if it.ItemType in [ITEM_WEAPON_SAW, ITEM_WEAPON_PISTOL, ITEM_WEAPON_SHOTGUN1, ITEM_WEAPON_SHOTGUN2,
ITEM_WEAPON_CHAINGUN, ITEM_WEAPON_ROCKETLAUNCHER, ITEM_WEAPON_PLASMA,
end
else if it.ItemType in [ITEM_WEAPON_SAW, ITEM_WEAPON_PISTOL, ITEM_WEAPON_SHOTGUN1, ITEM_WEAPON_SHOTGUN2,
ITEM_WEAPON_CHAINGUN, ITEM_WEAPON_ROCKETLAUNCHER, ITEM_WEAPON_PLASMA,
- ITEM_WEAPON_BFG, ITEM_WEAPON_SUPERPULEMET, ITEM_WEAPON_FLAMETHROWER] then
+ ITEM_WEAPON_BFG, ITEM_WEAPON_SUPERCHAINGUN, ITEM_WEAPON_FLAMETHROWER] then
begin
g_Sound_PlayExAt('SOUND_ITEM_GETWEAPON', x, y);
end
begin
g_Sound_PlayExAt('SOUND_ITEM_GETWEAPON', x, y);
end