diff --git a/src/game/g_items.pas b/src/game/g_items.pas
index 2ddc8586710e50b14d9ed833eb27dd65569f609a..a70bd54a61f9da0f9827996db6e1d654090da1df 100644 (file)
--- a/src/game/g_items.pas
+++ b/src/game/g_items.pas
-(* Copyright (C) DooM 2D:Forever Developers
+(* Copyright (C) Doom 2D: Forever Developers
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
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_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_JETPACK', gItemsTexturesID[ITEM_JETPACK]);
end;
procedure g_Items_LoadData();
end;
procedure g_Items_LoadData();
g_Frames_CreateWAD(nil, 'FRAMES_ITEM_WHITESPHERE', GameWAD+':TEXTURES\SWHITE', 32, 32, 4, True);
g_Frames_CreateWAD(nil, 'FRAMES_ITEM_ARMORGREEN', GameWAD+':TEXTURES\ARMORGREEN', 32, 16, 3, True);
g_Frames_CreateWAD(nil, 'FRAMES_ITEM_ARMORBLUE', GameWAD+':TEXTURES\ARMORBLUE', 32, 16, 3, True);
g_Frames_CreateWAD(nil, 'FRAMES_ITEM_WHITESPHERE', GameWAD+':TEXTURES\SWHITE', 32, 32, 4, True);
g_Frames_CreateWAD(nil, 'FRAMES_ITEM_ARMORGREEN', GameWAD+':TEXTURES\ARMORGREEN', 32, 16, 3, True);
g_Frames_CreateWAD(nil, 'FRAMES_ITEM_ARMORBLUE', GameWAD+':TEXTURES\ARMORBLUE', 32, 16, 3, True);
+ g_Frames_CreateWAD(nil, 'FRAMES_ITEM_JETPACK', GameWAD+':TEXTURES\JETPACK', 32, 32, 3, True);
g_Frames_CreateWAD(nil, 'FRAMES_ITEM_INVUL', GameWAD+':TEXTURES\INVUL', 32, 32, 4, True);
g_Frames_CreateWAD(nil, 'FRAMES_ITEM_INVIS', GameWAD+':TEXTURES\INVIS', 32, 32, 4, True);
g_Frames_CreateWAD(nil, 'FRAMES_ITEM_RESPAWN', GameWAD+':TEXTURES\ITEMRESPAWN', 32, 32, 5, True);
g_Frames_CreateWAD(nil, 'FRAMES_ITEM_INVUL', GameWAD+':TEXTURES\INVUL', 32, 32, 4, True);
g_Frames_CreateWAD(nil, 'FRAMES_ITEM_INVIS', GameWAD+':TEXTURES\INVIS', 32, 32, 4, True);
g_Frames_CreateWAD(nil, 'FRAMES_ITEM_RESPAWN', GameWAD+':TEXTURES\ITEMRESPAWN', 32, 32, 5, True);
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');
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');
- g_Texture_CreateWADEx('ITEM_JETPACK', GameWAD+':TEXTURES\JETPACK');
InitTextures();
InitTextures();
g_Frames_DeleteByName('FRAMES_ITEM_WHITESPHERE');
g_Frames_DeleteByName('FRAMES_ITEM_ARMORGREEN');
g_Frames_DeleteByName('FRAMES_ITEM_ARMORBLUE');
g_Frames_DeleteByName('FRAMES_ITEM_WHITESPHERE');
g_Frames_DeleteByName('FRAMES_ITEM_ARMORGREEN');
g_Frames_DeleteByName('FRAMES_ITEM_ARMORBLUE');
+ g_Frames_DeleteByName('FRAMES_ITEM_JETPACK');
g_Frames_DeleteByName('FRAMES_ITEM_INVUL');
g_Frames_DeleteByName('FRAMES_ITEM_INVIS');
g_Frames_DeleteByName('FRAMES_ITEM_RESPAWN');
g_Frames_DeleteByName('FRAMES_ITEM_INVUL');
g_Frames_DeleteByName('FRAMES_ITEM_INVIS');
g_Frames_DeleteByName('FRAMES_ITEM_RESPAWN');
g_Texture_Delete('ITEM_SUIT');
g_Texture_Delete('ITEM_WEAPON_KASTET');
g_Texture_Delete('ITEM_MEDKIT_BLACK');
g_Texture_Delete('ITEM_SUIT');
g_Texture_Delete('ITEM_WEAPON_KASTET');
g_Texture_Delete('ITEM_MEDKIT_BLACK');
- g_Texture_Delete('ITEM_JETPACK');
freeIds.Free();
freeIds := nil;
freeIds.Free();
freeIds := nil;
case it.ItemType of
ITEM_ARMOR_GREEN: if g_Frames_Get(ID, 'FRAMES_ITEM_ARMORGREEN') then it.Animation := TAnimation.Create(ID, True, 20);
ITEM_ARMOR_BLUE: if g_Frames_Get(ID, 'FRAMES_ITEM_ARMORBLUE') 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);
ITEM_ARMOR_BLUE: if g_Frames_Get(ID, 'FRAMES_ITEM_ARMORBLUE') then it.Animation := TAnimation.Create(ID, True, 20);
+ ITEM_JETPACK: if g_Frames_Get(ID, 'FRAMES_ITEM_JETPACK') then it.Animation := TAnimation.Create(ID, True, 15);
ITEM_SPHERE_BLUE: if g_Frames_Get(ID, 'FRAMES_ITEM_BLUESPHERE') then it.Animation := TAnimation.Create(ID, True, 15);
ITEM_SPHERE_WHITE: if g_Frames_Get(ID, 'FRAMES_ITEM_WHITESPHERE') then it.Animation := TAnimation.Create(ID, True, 20);
ITEM_INVUL: if g_Frames_Get(ID, 'FRAMES_ITEM_INVUL') then it.Animation := TAnimation.Create(ID, True, 20);
ITEM_SPHERE_BLUE: if g_Frames_Get(ID, 'FRAMES_ITEM_BLUESPHERE') then it.Animation := TAnimation.Create(ID, True, 15);
ITEM_SPHERE_WHITE: if g_Frames_Get(ID, 'FRAMES_ITEM_WHITESPHERE') then it.Animation := TAnimation.Create(ID, True, 20);
ITEM_INVUL: if g_Frames_Get(ID, 'FRAMES_ITEM_INVUL') then it.Animation := TAnimation.Create(ID, True, 20);
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 not ggItems[i].slotIsUsed then continue; // just in case
with ggItems[i] do
begin
with ggItems[i] do
begin
for i := 0 to High(ggItems) do
begin
it := @ggItems[i];
for i := 0 to High(ggItems) do
begin
it := @ggItems[i];
+ if (not it.slotIsUsed) or (it.ItemType = ITEM_NONE) then continue; // just in case
if not it.alive then continue;
if (it.dropped <> dropflag) then continue;
if not it.alive then continue;
if (it.dropped <> dropflag) then continue;
it: PItem;
trig: Integer;
begin
it: PItem;
trig: Integer;
begin
- if not g_Items_ValidId(ID) then raise Exception.Create('g_Items_Remove: invalid item id');
+ if not g_Items_ValidId(ID) then
+ begin
+ //writeln('g_Items_Remove: invalid item id: ', ID);
+ raise Exception.Create('g_Items_Remove: invalid item id');
+ //exit;
+ end;
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');
begin
// Ñ÷èòàåì êîëè÷åñòâî ñóùåñòâóþùèõ ïðåäìåòîâ
count := 0;
begin
// Ñ÷èòàåì êîëè÷åñòâî ñóùåñòâóþùèõ ïðåäìåòîâ
count := 0;
- for i := 0 to High(ggItems) do if (ggItems[i].ItemType <> ITEM_NONE) then Inc(count);
+ for i := 0 to High(ggItems) do if (ggItems[i].ItemType <> ITEM_NONE) and (ggItems[i].slotIsUsed) then Inc(count);
// Êîëè÷åñòâî ïðåäìåòîâ
utils.writeInt(st, LongInt(count));
// Êîëè÷åñòâî ïðåäìåòîâ
utils.writeInt(st, LongInt(count));
for i := 0 to High(ggItems) do
begin
for i := 0 to High(ggItems) do
begin
- if (ggItems[i].ItemType <> ITEM_NONE) then
+ if (ggItems[i].ItemType <> ITEM_NONE) and (ggItems[i].slotIsUsed) then
begin
// Ñèãíàòóðà ïðåäìåòà
utils.writeSign(st, 'ITEM');
begin
// Ñèãíàòóðà ïðåäìåòà
utils.writeSign(st, 'ITEM');
for i := 0 to High(ggItems) do
begin
it := @ggItems[i];
for i := 0 to High(ggItems) do
begin
it := @ggItems[i];
- if it.Respawnable then
+ if not it.slotIsUsed then continue;
+ if it.Respawnable and (it.ItemType <> ITEM_NONE) then
begin
it.QuietRespawn := True;
it.RespawnTime := 0;
begin
it.QuietRespawn := True;
it.RespawnTime := 0;
begin
for idx := High(ggItems) downto 0 do
begin
begin
for idx := High(ggItems) downto 0 do
begin
- if ggItems[idx].alive then
+ if ggItems[idx].alive and ggItems[idx].slotIsUsed then
begin
result := cb(@ggItems[idx]);
if result then exit;
begin
result := cb(@ggItems[idx]);
if result then exit;
begin
for idx := 0 to High(ggItems) do
begin
begin
for idx := 0 to High(ggItems) do
begin
- if ggItems[idx].alive then
+ if ggItems[idx].alive and ggItems[idx].slotIsUsed then
begin
result := cb(@ggItems[idx]);
if result then exit;
begin
result := cb(@ggItems[idx]);
if result then exit;
ITEM_KEY_BLUE: g_AddDynLight(it.Obj.X+(it.Obj.Rect.Width div 2), it.Obj.Y+(it.Obj.Rect.Height div 2), 24, 0.0, 0.0, 1.0, 0.6);
ITEM_ARMOR_GREEN: g_AddDynLight(it.Obj.X+(it.Obj.Rect.Width div 2), it.Obj.Y+(it.Obj.Rect.Height div 2), 42, 0.0, 1.0, 0.0, 0.6);
ITEM_ARMOR_BLUE: g_AddDynLight(it.Obj.X+(it.Obj.Rect.Width div 2), it.Obj.Y+(it.Obj.Rect.Height div 2), 42, 0.0, 0.0, 1.0, 0.6);
ITEM_KEY_BLUE: g_AddDynLight(it.Obj.X+(it.Obj.Rect.Width div 2), it.Obj.Y+(it.Obj.Rect.Height div 2), 24, 0.0, 0.0, 1.0, 0.6);
ITEM_ARMOR_GREEN: g_AddDynLight(it.Obj.X+(it.Obj.Rect.Width div 2), it.Obj.Y+(it.Obj.Rect.Height div 2), 42, 0.0, 1.0, 0.0, 0.6);
ITEM_ARMOR_BLUE: g_AddDynLight(it.Obj.X+(it.Obj.Rect.Width div 2), it.Obj.Y+(it.Obj.Rect.Height div 2), 42, 0.0, 0.0, 1.0, 0.6);
+ ITEM_JETPACK: g_AddDynLight(it.Obj.X+(it.Obj.Rect.Width div 2), it.Obj.Y+(it.Obj.Rect.Height div 2), 32, 1.0, 1.0, 1.0, 0.6);
ITEM_SPHERE_BLUE: g_AddDynLight(it.Obj.X+(it.Obj.Rect.Width div 2), it.Obj.Y+(it.Obj.Rect.Height div 2), 32, 0.0, 1.0, 0.0, 0.6);
ITEM_SPHERE_WHITE: g_AddDynLight(it.Obj.X+(it.Obj.Rect.Width div 2), it.Obj.Y+(it.Obj.Rect.Height div 2), 32, 1.0, 1.0, 1.0, 0.6);
ITEM_INVUL: g_AddDynLight(it.Obj.X+(it.Obj.Rect.Width div 2), it.Obj.Y+(it.Obj.Rect.Height div 2), 32, 1.0, 0.0, 0.0, 0.6);
ITEM_SPHERE_BLUE: g_AddDynLight(it.Obj.X+(it.Obj.Rect.Width div 2), it.Obj.Y+(it.Obj.Rect.Height div 2), 32, 0.0, 1.0, 0.0, 0.6);
ITEM_SPHERE_WHITE: g_AddDynLight(it.Obj.X+(it.Obj.Rect.Width div 2), it.Obj.Y+(it.Obj.Rect.Height div 2), 32, 1.0, 1.0, 1.0, 0.6);
ITEM_INVUL: g_AddDynLight(it.Obj.X+(it.Obj.Rect.Width div 2), it.Obj.Y+(it.Obj.Rect.Height div 2), 32, 1.0, 0.0, 0.0, 0.6);