/// <summary>
        /// Пытается найти предмет в сумке
        /// </summary>
        /// <param name="slotData">Сумка, в которой ведётся поиск</param>
        /// <param name="item">Искомый предмет</param>
        /// <returns>Возвращает контейнер предмета + позиция этого предмета в сумке</returns>
        public ItemSlot FindItemSlot(SlotData slotData, Item item)
        {
            if(slotData==null)
                return null;

            foreach(ItemSlot itemSlot in slotData.Items)
                if(itemSlot.item == item)
                    return itemSlot;

            return null;
        }
        /// <summary>
        /// Пытается добавить предмет item в слот slotData
        /// </summary>
        /// <param name="slotData">Сумка, в которую пытаются добавить предмет</param>
        /// <param name="item">Добавляемый предмет</param>
        /// <returns>Возвращает число экземпляров item НЕ ДОБАВЛЕННЫХ в слот</returns>
        public int AddItem(SlotData slotData, Item item)
        {
            foreach (ItemSlot i in slotData.Items) { // пытаемся найти идентичные предметы и попробовать объединить их
                if (i.item.Equals(item) && !i.item.isFullCount()) { // если предмет идентичен, и он не полностью укомплектован

                    if (item.getCount() != 0) // пока у нас есть остаток экземпляров, которые надо раскидать
                        item.setCount(i.item.incCount(item.getCount()));

                    if (item.getCount() == 0) // экземпляры кончились, можно выходить
                        return 0;

                }
            }

            for (int y = 1; y <= slotData.position.CellsYCount; y++) { // пытаемся найти свободную область, и засунуть предмет целиком (не разделяя)
                for (int x = 1; x <= slotData.position.CellsXCount; x++) {

                    bool result = true;
                    foreach (ItemSlot i in slotData.Items) {

                        if (x >= i.getPosition().X &&
                           x < i.getPosition().X + i.item.getSize().getWidth() &&
                           y >= i.getPosition().Y &&
                           y < i.getPosition().Y + i.item.getSize().getHeight()) {
                            result = false;
                            break;
                        }

                    }

                    if (result) { // предметы можно полностью добавить
                        slotData.Items.Add(new ItemSlot(item.Clone(), new ItemPosition(x, y)));
                        return 0;
                    }

                }

            }

            return item.getCount();
        }
Esempio n. 3
0
        public void TryInit()
        {
            if(slot==null)
                slot = new SlotData();

            if(slot.position.CellsXCount<1)
                slot.position.CellsXCount=1;

            if(slot.position.CellsYCount<1)
                slot.position.CellsYCount=1;

            if(background==null)
                background = DImageList.getInstance().getImage("external_inventory_background");

            if(correctCellImage==null)
                correctCellImage = DImageList.getInstance().getImage("inventory_correct_cell");

            if(playerInventory==null)
                playerInventory = SingletonNames.getInventory().GetComponent<UInventory>();

            if(drawService==null)
                drawService = new ItemDrawService(playerInventory.iconStyle, playerInventory.iconShadow);

            titleStyle = playerInventory.titleStyle;

            titleText   = CLang.getInstance().get(titleTextId);
            captionText = CLang.getInstance().get(captionTextId);
        }
Esempio n. 4
0
        void Start()
        {
            slot = new SlotData();

                foreach(string item in initListItems)
                    addItem(DObjectList.getInstance().getItem(item));

                background = DImageList.getInstance().getImage("external_inventory_background");
                correctCellImage = DImageList.getInstance().getImage("inventory_correct_cell");

                playerInventory = SingletonNames.getInventory().GetComponent<UInventory>();
                drawService = new ItemDrawService(playerInventory.iconStyle, playerInventory.iconShadow);
                titleStyle = playerInventory.titleStyle;

                titleText = CLang.getInstance().get(titleTextId);
                captionText = CLang.getInstance().get(captionTextId);

                initListItems.Clear();

                slot.position.CellsXCount = cellXCount;
                slot.position.CellsYCount = cellYCount;
        }
        /// <summary>
        /// Возвращает предмет, который занимает ячейку {cellX,cellY}
        /// </summary>
        /// <param name="cellX"></param>
        /// <param name="cellY"></param>
        /// <returns>Если предмет не найден вернёт null</returns>
        public ItemSlot getItem(SlotData slot, int cellX, int cellY)
        {
            foreach (ItemSlot item in slot.Items) {

                if ((item.getPosition().X == cellX && item.getPosition().Y == cellY)) // предмет лежит в этой ячейке
                    return item;

                if (cellX >= item.getPosition().X
                    && cellX < item.getPosition().X + item.item.getSize().getWidth()
                    && cellY >= item.getPosition().Y
                    && cellY < item.getPosition().Y + item.item.getSize().getHeight()) // предмет занимает эту ячейку
                    return item;

            }

            return null;
        }
        private bool sortByTopLeft(SlotData slotData, List<ItemBounds> bounds)
        {
            foreach (ItemBounds bound in bounds)
                bound.Reset();

            ItemBounds i = null;

            while ((i = findMaxSizeY(bounds)) != null) {

                for (int x = 1; x <= slotData.position.CellsXCount; x++) {
                    for (int y = 1; y <= slotData.position.CellsYCount; y++) {

                        i.X = x;
                        i.Y = y;

                        if (!getCollision(bounds, i)) // предмет нашёл пустое место
                            i.setFix(true);

                        if (i.isFix())
                            break;

                    }

                    if (i.isFix())
                        break;
                }

                if (!i.isFix()) { // сортировка не удалась
                    return false;
                }

            }

            slotData.Items.Clear();

            foreach (ItemBounds bound in bounds)
                slotData.Items.Add(bound.createItemSlot()); // перемещаем предметы

            return true;
        }
        /// <summary>
        /// Пытается выполнить сортировку предметов в сумке
        /// </summary>
        /// <param name="slotData">Сумка, в которой выполняется сортировка</param>
        /// <returns>Возвращает логический результат операции сортировки</returns>
        public bool SortData(SlotData slotData)
        {
            List<ItemBounds> bounds    = new List<ItemBounds>();

            foreach (ItemSlot item in slotData.Items)
                bounds.Add(new ItemBounds(item)); // формируем все рамки

            if (sortByLeftTop(slotData, bounds)) // сортируем по левому краю сверху
                return true;

            if (sortByTopLeft(slotData, bounds)) // сортируем по верху слева
                return true;

            return false;
        }
 /// <summary>
 /// Пытается удалить предмет item из сумки slotData
 /// </summary>
 /// <param name="slotData">Сумка, из которой удаляют предмет</param>
 /// <param name="item">Предмет который удаляют из сумки</param>
 /// <returns>Возвращает логическое значение совершения операции удаления</returns>
 public bool RemoveItem(SlotData slotData, ItemSlot item)
 {
     return slotData.Items.Remove(item);
 }