Когда я только начинал работу в констракте, я не мог понять даже эту статью с массивом, для меня массив был чем-то неопознанным, но теперь я разобрался с ним и готов с вами поделиться продвинутым инвентарем на основе того движка с изменениями и особенностями:
- Можно перетаскивать предметы посредством Drag and Drop,
- С помощью зажатия Ctrl на клавиатуре можно делить предметы.
- При добавлении предмета в инвентарь (например герой подобрал предмет) он создается в первой незанятой ячейке или добавляется к предмету с таким же ID.

Скоро запишу видео по этому уроку
Начнем по-порядку

Буду использовать тот же самый принцип построения инвентаря, что и в том уроке.
Нам понадобятся:
1) Спрайт слота - Slot - я делал его без анимации, простой кадр.

Для Slot нужна переменная Id, которая показывает уникальный номер по порядку из всех созданных ячеек, следующая переменная - item, в которой будет храниться айди предмета, последняя переменнная - number, где будет записано количество этого предмета.
2) Спрайт предметов - Item - скорость анимации - 0, здесь будем в каждом кадре ставить свой предмет, например для кадра 1 - меч, для кадра 2 - сабля, но первый кадр будет пустой.

Для item нужна переменная number, где будет записано количество этого предмета.
3) Текст Text_number, отображающий количество объектов. Простой текст, только белого цвета.
4) Массив - Inventory - размерность - высота 2 - глубина 1 - ширина как хотим - это будет количество ячеек инвентаря, я взял 20.
5) Объект мыши. (Для перетаскиваний)
6) Объект клавиатуры. (Для разделения предметов)
7) Объект Function - для создания удобных для нас функций:)
Массив используется двумерный, то есть как таблица, в первой строке имя предмета, во второй количество предмета и так для всех столбцов.

23 - это будет 22 кадр анимации предмета item, 11 - его количество.
0-пустой предмет, значит и пустая ячейка.
Перейдем к переменным. У меня их всего три глобальных.

stX отвечает за номер ячейки массива.
itemid отвечает за временное хранение айди предмета.
itemnumber отвечает за временное хранение колличества этого предмета.
Теперь начинаем разбираться с событиями

Первая фунция - open_inv. Она будет включаться тогда, когда мы будем открывать инвентарь. Она будет перерисовывать наш инвентарь. Удалять старый и создавать на его месте новый.
Чтобы удалить старый мы просто в начале функции разрушаем объекты slot, item и text_number.
Также в этой функции есть локальные переменные a, b и с
a и c - их не трогаем, они используются для временного хранения. a - для следующего значения X для слота, c - для значения Y для слота.
b - отступ от ячейки по ширине, например ячейка размером 64х64, чтобы сделать отступ в 16 пикселей, значение должно быть 80, ну надеюсь вы поняли меня.
Дальше мы создаем подсобытие для каждого элемента X в массиве инвентаря мы делаем следующее:
1) сравниваем переменную А - если она равна b*5 (пять - это количество ячеек в строке), то мы добавляем к С - 80(чтобы следующие слоты создавались на 80 пикселей ниже) и переменную А приравниваем к 0, чтобы следующая ячейка создалась под столбцом самой первой ячейки.
2) Если переменная не равна, то:
а) мы делаем одно действие, где добавляем b в нашу переменную А, чтобы следующая ячейка была правее. И создаем объект слот в: по X - будет любое число + a, для Y будет любое число + c. Помню не мог вычислить по тому уроку точное положение инвентаря. Здесь же всё видно. И устанавливаем ему переменные. CurX - это текущий номер столбца массива. Где просто стоит Curx - это обозначает первую строчку столбца, т.е. (CurX,0) (айди предмета), а где стоит (CurX,1) -это обозначает вторую строчку столбца, то есть количество предмета. Для переменной Id у слота используется CurX+1, чтобы наш слот не начинался с айди 0, тогда бы он просто не существовал.
б) Мы сравниваем значение айди предмета в массиве, если оно больше 0, тоесть не пустое, то тогда мы создаем объект item на слое лежащем выше, чем слой со слотами(потому что объект item при перетаскивании будет под спрайтами слотов) и устанавливаем ему переменную и кадр.
в)Подсобытие для б. Мы сравниваем значение количества предмета в массиве, если оно больше 0, то тогда мы создаем текст и ставим ему текст с числом.
Функция готова, теперь ее можно применять когда угодно и где угодно!)
Следующая функция - Get_item
Она Создает предмет в инвентаре.

Переменная additem - будет служить остановкой цикла. Когда она будет равна 1, то цикл перестает проверяться. Переменная Checkitem - будет служить стартом для нового цикла. Принцип такой: сначала проверяется есть ли похожий предмет в инвентаре, если есть то мы к нему складываем количество, если нет такого, то мы запускаем новый цикл где перебираются все ячейки в поисках первой пустой.
Когда Sprite2(наш герой) соприкасается с item2(просто предмет) то мы первой переменной ставим айди предмета, а второй - количество и запускаем функцию.
:Для каждого элемента массива мы делаем проверку:
1) Если в инвентаре есть такой же объект, то мы его складываем.
2) Если такого объекта нет
А) Мы ищем пустую первую ячейку и вставляем в нее предмет.
Функция номер два готова!)
Далее следует самая беда с переносом объекта посредством drag and drop, для начала добавьте это поведение предмету item.


Соберемся и читаем:
Во главе идет проверка, пересекается ли мышь с объектом слота. Это сделано за тем, чтобы предмет точно находил свое место.
Дальше мы при "захвате" нашего предмета: делаем ему масштаб по-больше для красоты


А дальше при "бросании" предмета: мы проверяем нажата ли клавиша ctrl на клавиатуре(и количество предмета больше единицы),
1) если да, то: идет проверка, если предметы одинаковые, то последнему предмету добавляется округленная вверх половина количества перетаскиваемого предмета, а у перетаскиваемого объекта остается округленная вниз половина количества предмета. А если предмета в последней ячейке вообще нет, то мы проделываем штуку с разделением, только мы в последней ячейке добавляем массиву еще и айди, чтобы предмет был виден.(создается копия).
2) если ctrl не зажата, то мы просто меняем предметы местами, если они разные, а если они одинаковые, то тогда мы их складываем. Автор здесь использовал 6 переменных, но мне хватило трех, я вспомнил про паскаль и как там можно с помощью одной переменной поменять значения.
//////Важно! Утром заметил, что при разделении одного объекта и накладывании на другой, инвентарь не воспринимает эту команду и ничего не происходит, дело было вот в чем:

Там просто было два сравнения: когда предметы одинаковые и когда предмета нет, но я забыл добавить сравнение "Если объект не равен предмету и он больше нуля" тогда просто открываем инвентарь, потому что ничего с этим делать не нужно:) Перезалил файл)
Slot.ID = stX+1 это значит что мы как взяли предмет, так никуда не перетаскивая его отпустили, в одну и ту же ячейку, без этого события количество предметов убавляется, а так мы просто оставляем предметы теми же и обновляем инвентарь:)
И если мы не попадаем предметом по ячейке или мы его выкидываем из инвентаря, то он просто обновляет инвентарь и все остается на местах :)
А вот простой пример при старте слоя мы прописываем предметы (в 1, 0 - айди, в 1, 1 - количество)

И простая кнопка для показа или обновления инвентаря.
Всем удачных экспериментов и проб!)