diff --git a/src/game/g_items.pas b/src/game/g_items.pas
index 0aa9d560ab9b00cd002fbca4ac994b9f80a76ede..23c10df8aadc7d3a1e45197991f8f0317a5bb1a2 100644 (file)
--- a/src/game/g_items.pas
+++ b/src/game/g_items.pas
NeedSend: Boolean;
procedure positionChanged (); //WARNING! call this after monster position was changed, or coldet will not work right!
NeedSend: Boolean;
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 used: Boolean read slotIsUsed;
property myid: Integer read arrIdx;
end;
property myid: Integer read arrIdx;
end;
procedure g_Items_SetDrop (ID: DWORD);
procedure g_Items_PreUpdate();
procedure g_Items_Update();
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_Pick(ID: DWORD);
procedure g_Items_Remove(ID: DWORD);
procedure g_Items_SaveState (st: TStream);
procedure g_Items_Pick(ID: DWORD);
procedure g_Items_Remove(ID: DWORD);
procedure g_Items_SaveState (st: TStream);
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
+ var (* private state *)
+ ggItems: Array of TItem = nil;
+
implementation
uses
Math,
implementation
uses
Math,
- g_basic, e_graphics, g_sound, g_main, g_gfx, g_map,
+ g_basic, g_sound, g_main, g_gfx, g_map,
g_game, g_triggers, g_console, g_player, g_net, g_netmsg,
e_log,
g_grid, binheap, idpool, utils, xstreams;
g_game, g_triggers, g_console, g_player, g_net, g_netmsg,
e_log,
g_grid, binheap, idpool, utils, xstreams;
-
-var
- ggItems: Array of TItem = nil;
-
-
// ////////////////////////////////////////////////////////////////////////// //
var
freeIds: TIdPool = nil;
// ////////////////////////////////////////////////////////////////////////// //
var
freeIds: TIdPool = nil;
NeedSend := NeedSend or (Obj.X <> Obj.oldX) or (Obj.Y <> Obj.oldY);
end;
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;
+
+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
end;
end;
end;
end;
-
-procedure itemsDrawInternal (dropflag: Boolean);
-var
- i, fX, fY: Integer;
- it: PItem;
-begin
- if (ggItems = nil) then exit;
-
- 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;
-
- with it^ do
- 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
- e_Draw(gItemsTexturesID[ItemType], fX, fY, 0, true, false);
- end
- else
- begin
- Animation.Draw(fX, fY, TMirrorType.None);
- end;
-
- if g_debug_Frames then
- begin
- e_DrawQuad(Obj.X+Obj.Rect.X,
- Obj.Y+Obj.Rect.Y,
- Obj.X+Obj.Rect.X+Obj.Rect.Width-1,
- Obj.Y+Obj.Rect.Y+Obj.Rect.Height-1,
- 0, 255, 0);
- end;
- end;
- end;
- end;
-end;
-
-
-procedure g_Items_Draw ();
-begin
- itemsDrawInternal(false);
-end;
-
-procedure g_Items_DrawDrop ();
-begin
- itemsDrawInternal(true);
-end;
-
-
procedure g_Items_SetDrop (ID: DWORD);
begin
if (ID < Length(ggItems)) then
procedure g_Items_SetDrop (ID: DWORD);
begin
if (ID < Length(ggItems)) then
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);