Пример реализации функции, которая объединяет одинаковые предметы в инвентаре в единые стаки, с учетом максимально допустимого количества.
function JoinAllItems(): Boolean;
var
i, j, k: Integer;
SearchFlag: Boolean;
Item: TItem;
begin
for i:= Inv.Count-1 downto 1 do begin // пробегаем по всему инвентарю
if (Inv(i).Count = Inv(i).MaxStackSize) or // если фулстак или
(Inv(i).Count = Inv.ItemCount(Inv(i).ID)) then Continue; // или это и есть все итемы, то пропускаем
SearchFlag:= True; // включаем флаг поиска совпадений в других слотах
while (Inv(i).Count < Inv(i).MaxStackSize) and (SearchFlag) do begin // пока не забили до фулстака и включен флаг
if (Inv(i).Count = Inv.ItemCount(Inv(i).ID)) then Break; // если кол-во итемов в этом слоте = кол-ву всех итемов то прекращаем
for k:= i-1 downto 0 do begin // пробегаем инвентарь с найденного итема
if (not ((Inv(k).ID = Inv(i).ID) and (Inv(k).Count < Inv(k).MaxStackSize))) then begin // если нет хотя бы 1 не фул стака
SearchFlag:= False; // то вырубаем флаг поиска соответствий
Break; // выходим из цикла
end;
end;
for j:= i-1 downto 0 do begin // пробегаем инвентарь с найденного итема
if (Inv(j).ID <> Inv(i).ID) or // если ID не совпадает или
(Inv(j).Count = Inv(i).MaxStackSize) or // мы нашли фулстак или
(Inv(j) = Inv(i)) then Continue; // сей объект совпадает с предыдущим, то пропускаем такие
if (Inv(j).ID = Inv(i).ID) then begin //если же нашли совпадение по ID, то
if (Inv(j).Count = Inv(i).MaxStackSize) then Break; // пропускаем фулстаки
Inv.BySlot(Inv(j).Slot, Item); // инициализируем итем по его слоту
if (Inv(j).Count <= Inv(i).MaxStackSize - Inv(i).Count) then begin // если кол-во найденного итема <= того, что нужно добавить, то
Engine.SplitItem(Item, Inv(j).Count, Inv(i).Slot) // добавляем сколько есть
end else begin
Engine.SplitItem(Item, Inv(i).MaxStackSize - Inv(i).Count, Inv(i).Slot); // иначе добавляем сколько нужно до фулстака
end;
end else SearchFlag:= False; //если же НЕ нашли совпадение по ID, то выключаем флаг, чтобы выключить while и перейти на следующий i
end;
end;
end;
end;
begin
JoinAllItems();
end.