private void reCountRecordIndex(ItemRecordData rData, int fromIndex, int toIndex)
    {
        //左移
        if (toIndex < fromIndex)
        {
            if (rData.addIndex == -1 || toIndex < rData.addIndex)
            {
                //直接重新计算
                rData.addIndex = toCountNextItemAddPos(rData.id, toIndex);
            }

            //是之前的删除位置
            if (fromIndex == rData.removeIndex)
            {
                //直接重新计算
                rData.removeIndex = toCountPrevItemRemovePos(rData.id, fromIndex - 1);
            }
        }
        //右移
        else
        {
            if (rData.removeIndex == -1 || toIndex > rData.removeIndex)
            {
                //直接重新计算
                rData.removeIndex = toCountPrevItemRemovePos(rData.id, toIndex);
            }

            //是之前的添加位置
            if (fromIndex == rData.addIndex)
            {
                //直接重新计算
                rData.addIndex = toCountNextItemAddPos(rData.id, fromIndex + 1);
            }
        }
    }
    /** 添加道具(新格子)(对应remove的completely) */
    private void doAddItemNew(int index, ItemRecordData rData, int num, ItemData data)
    {
        addItemToPos(index, data);

        //数目计数
        rData.num += num;

        if (!data.config.enableTimeT.isEmpty())
        {
            _itemTimeSet.add(index);
        }

        _cleanUpDirty = true;

        //更新添加位置
        if (!data.isSingleNumMax())
        {
            if (rData.addIndex == -1 || index < rData.addIndex)
            {
                rData.addIndex = index;
            }
        }

        //更新移除位置
        if (rData.removeIndex == -1 || rData.removeIndex < index)
        {
            rData.removeIndex = index;
        }
    }
        void ReadNativeItemData()
        {
            // Must be an item type
            if (recordType != RecordTypes.Item)
            {
                return;
            }

            // Prepare stream
            MemoryStream stream = new MemoryStream(RecordData);
            BinaryReader reader = new BinaryReader(stream);

            // Read native item data
            parsedData = new ItemRecordData();

            // Item names should only be read until the null terminator.
            long pos = reader.BaseStream.Position;

            parsedData.name            = FileProxy.ReadCString(reader, 0);
            reader.BaseStream.Position = pos + 32;

            parsedData.group             = reader.ReadUInt16();
            parsedData.index             = reader.ReadUInt16();
            parsedData.value             = reader.ReadUInt32();
            parsedData.unknown           = reader.ReadUInt16();
            parsedData.flags             = reader.ReadUInt16();
            parsedData.currentCondition  = reader.ReadUInt16();
            parsedData.maxCondition      = reader.ReadUInt16();
            parsedData.unknown2          = reader.ReadByte();
            parsedData.typeDependentData = reader.ReadByte();
            parsedData.image1            = reader.ReadUInt16();
            parsedData.image2            = reader.ReadUInt16();
            parsedData.material          = reader.ReadUInt16();
            parsedData.color             = reader.ReadByte();
            parsedData.weight            = reader.ReadUInt32();
            parsedData.density           = reader.ReadUInt16();
            parsedData.shear             = reader.ReadUInt16();
            parsedData.fracture          = reader.ReadUInt16();
            parsedData.meltingPoint      = reader.ReadUInt16();
            parsedData.conductivity      = reader.ReadUInt16();
            parsedData.brittleness       = reader.ReadUInt16();
            parsedData.enchantmentPoints = reader.ReadUInt16();
            parsedData.message           = reader.ReadUInt16();
            parsedData.variants          = reader.ReadByte();
            parsedData.drawOrderOrEffect = reader.ReadByte();

            // Read magic effect array
            const int effectCount = 10;

            parsedData.magic = new DaggerfallEnchantment[effectCount];
            for (int i = 0; i < effectCount; i++)
            {
                parsedData.magic[i].type  = (EnchantmentTypes)reader.ReadInt16();
                parsedData.magic[i].param = reader.ReadInt16();
            }

            // Close stream
            reader.Close();
        }
    /** 执行移除一个物品(倒序)(核心) */
    protected override bool doRemoveItemC(int id, int num)
    {
        ItemRecordData rData = getRecordData(id);

        if (rData == null || rData.num < num)
        {
            return(false);
        }

        int      index;
        ItemData data;
        int      dNum;

        while (true)
        {
            index = rData.removeIndex;

            if (index != -1)
            {
                data = _list.get(index);

                //还有剩余
                if (data.num > num)
                {
                    dNum      = num;
                    data.num -= num;
                    num       = 0;

                    _operateRecordList.add2(index, dNum);
                    doRemoveItemPartial(index, rData, dNum);
                }
                else
                {
                    dNum = data.num;
                    num -= data.num;

                    _operateRecordList.add2(index, dNum);
                    _operateRecordRemoveDic.put(index, data);
                    data.canRelease = true;                  //回收标记

                    doRemoveItemCompletely(index, rData, dNum, data);
                }

                if (num == 0)
                {
                    return(true);
                }
            }
            else
            {
                Ctrl.throwError("严重错误,计数没对上");
                return(false);
            }
        }
    }
    /** 部分移除一个格子 */
    private void doRemoveItemPartial(int index, ItemRecordData rData, int num)
    {
        //数目计数
        rData.num -= num;

        //更靠前
        if (rData.addIndex == -1 || index < rData.addIndex)
        {
            rData.addIndex = index;
        }
    }
    /** 添加道具部分 */
    private void doAddItemPartial(int index, ItemRecordData rData, int num, ItemData data)
    {
        //数目计数
        rData.num += num;

        //满了,还是当前位置
        if (data.isSingleNumMax() && rData.addIndex == index)
        {
            rData.addIndex = toCountNextItemAddPos(rData.id, index + 1);
        }
    }
Exemple #7
0
    public void AddItem(string id, int pos, int count)
    {
        if (ItemRecord == null)
        {
            ItemRecord = new Dictionary <int, ItemRecordData>();
        }

        ItemRecordData item = new ItemRecordData {
            ID = id, Pos = pos, Count = count
        };

        ItemRecord.Add(pos, item);
    }
        void ReadNativeItemData()
        {
            // Must be an item type
            if (recordType != RecordTypes.Item)
            {
                return;
            }

            // Prepare stream
            MemoryStream stream = new MemoryStream(RecordData);
            BinaryReader reader = new BinaryReader(stream);

            // Read native item data
            parsedData                   = new ItemRecordData();
            parsedData.name              = FileProxy.ReadCString(reader, 32);
            parsedData.group             = reader.ReadUInt16();
            parsedData.index             = reader.ReadUInt16();
            parsedData.value             = reader.ReadUInt32();
            parsedData.unknown           = reader.ReadUInt16();
            parsedData.flags             = reader.ReadUInt16();
            parsedData.currentCondition  = reader.ReadUInt16();
            parsedData.maxCondition      = reader.ReadUInt16();
            parsedData.unknown2          = reader.ReadByte();
            parsedData.typeDependentData = reader.ReadByte();
            parsedData.image1            = reader.ReadUInt16();
            parsedData.image2            = reader.ReadUInt16();
            parsedData.material          = reader.ReadUInt16();
            parsedData.color             = reader.ReadByte();
            parsedData.weight            = reader.ReadUInt32();
            parsedData.enchantmentPoints = reader.ReadUInt16();
            parsedData.message           = reader.ReadUInt32();

            // Read magic effect array
            const int effectCount = 10;

            parsedData.magic = new DaggerfallEnchantment[effectCount];
            for (int i = 0; i < effectCount; i++)
            {
                parsedData.magic[i].type  = (EnchantmentTypes)reader.ReadInt16();
                parsedData.magic[i].param = reader.ReadInt16();
            }

            // Close stream
            reader.Close();
        }
        void ReadNativeItemData()
        {
            // Must be an item type
            if (recordType != RecordTypes.Item)
            {
                return;
            }

            // Prepare stream
            MemoryStream stream = new MemoryStream(RecordData);
            BinaryReader reader = new BinaryReader(stream);

            // Read native item data
            parsedData                   = new ItemRecordData();
            parsedData.name              = FileProxy.ReadCString(reader, 32);
            parsedData.category1         = reader.ReadUInt16();
            parsedData.category2         = reader.ReadUInt16();
            parsedData.value1            = reader.ReadUInt32();
            parsedData.value2            = reader.ReadUInt32();
            parsedData.hits1             = reader.ReadUInt16();
            parsedData.hits2             = reader.ReadUInt16();
            parsedData.hits3             = reader.ReadUInt16();
            parsedData.image1            = reader.ReadUInt16();
            parsedData.image2            = reader.ReadUInt16();
            parsedData.material          = reader.ReadUInt16();
            parsedData.color             = reader.ReadByte();
            parsedData.weight            = reader.ReadUInt32();
            parsedData.enchantmentPoints = reader.ReadUInt16();
            parsedData.message           = reader.ReadUInt32();

            // Read magic effect array
            const int effectCount = 10;

            parsedData.magic = new ushort[effectCount];
            for (int i = 0; i < effectCount; i++)
            {
                parsedData.magic[i] = reader.ReadUInt16();
            }

            // Close stream
            reader.Close();
        }
Exemple #10
0
    /** 完全移除一个格子(对应add的new) */
    private void doRemoveItemCompletely(int index, ItemRecordData rData, int num, ItemData data)
    {
        rData.num -= num;

        removeItemFromPos(index);

        //失效时间
        if (!data.config.enableTimeT.isEmpty())
        {
            _itemTimeSet.remove(index);
        }

        _cleanUpDirty = true;

        //没了
        if (rData.num == 0)
        {
            removeRecordData(rData);
        }
        else
        {
            if (ShineSetting.openCheck)
            {
                if (rData.num < 0)
                {
                    Ctrl.throwError("出现道具数目为负");
                }
            }

            if (rData.addIndex == index)
            {
                rData.addIndex = toCountNextItemAddPos(rData.id, index + 1);
            }

            if (rData.removeIndex == index)
            {
                rData.removeIndex = toCountPrevItemRemovePos(rData.id, index - 1);
            }
        }
    }
Exemple #11
0
    /** 执行添加一个物品(核心) */
    protected override bool doAddItemC(int id, int num, ItemData data)
    {
        ItemConfig config;

        if (data != null)
        {
            data.makeConfig();
            config = data.config;
        }
        else
        {
            config = ItemConfig.get(id);
        }

        if (config.type == ItemType.Tool && config.passEnterBag)
        {
            _operateRecordAddListForAutoUse.add2(id, num);
            return(true);
        }

        ItemRecordData rData = getRecordDataAbs(id);

        //超出总上限
        if (config.totalPlusMax > 0 && (rData.num + num) > config.totalPlusMax)
        {
            return(false);
        }

        //是否单个叠加
        bool isSingleOne = config.singlePlusMax == 1;
        //是否绑定
        bool isBind = config.bindByGet || (data != null && data.isBind);
        //失效时间
        long disableTime = config.enableTimeT == null ? -1L : (data != null ? data.disableTime : config.enableTimeT.getNextTime());

        int      itemPos;
        int      index = -1;
        int      tempIndex;
        ItemData tData;
        int      dNum;

        while (true)
        {
            //单个叠加
            if (isSingleOne)
            {
                if (isGridFull())
                {
                    return(false);
                }

                index = _nextFreeGridIndex;
                tData = null;
            }
            else
            {
                //没找到添加位置
                if ((itemPos = rData.addIndex) == -1)
                {
                    if (isGridFull())
                    {
                        return(false);
                    }

                    index = _nextFreeGridIndex;
                    tData = null;
                }
                else
                {
                    //新值
                    if (index < itemPos)
                    {
                        index = itemPos;
                    }

                    //找不到添加位置
                    if ((tempIndex = findNextItemAddPos(id, index, isBind, disableTime, data)) == -1)
                    {
                        if (isGridFull())
                        {
                            return(false);
                        }

                        index = _nextFreeGridIndex;
                        tData = null;
                    }
                    else
                    {
                        tData = _list.get(index = tempIndex);
                    }
                }
            }

            //要叠加
            if (tData != null)
            {
                //装的下
                if (config.singlePlusMax <= 0 || (dNum = (config.singlePlusMax - tData.num)) >= num)
                {
                    dNum = num;
                    num  = 0;
                }
                else
                {
                    num -= dNum;
                }

                tData.num += dNum;              //计数加

                //操作记录
                _operateRecordList.add2(index, dNum);
                doAddItemPartial(index, rData, dNum, tData);

                //完了
                if (num == 0)
                {
                    return(true);
                }
            }
            //新位置
            else
            {
                //单包上限都超的
                if (config.singlePlusMax > 0 && num > config.singlePlusMax)
                {
                    dNum = config.singlePlusMax;
                    num -= dNum;
                }
                else
                {
                    dNum = num;
                    num  = 0;
                }

                //最后的一次加
                if (data != null && num == 0 && isSingleOne)
                {
                    tData     = data;
                    tData.num = dNum;                  //数目再赋值
                }
                else
                {
                    tData            = createItemByType(config.type);
                    tData.id         = id;
                    tData.num        = dNum;
                    tData.config     = config;
                    tData.canRelease = true;                  //标记可回收
                    //额外初始化
                    BaseC.logic.initItem(tData, id);
                }

                //赋值
                tData.isBind      = isBind;
                tData.disableTime = disableTime;

                _operateRecordList.add2(index, dNum);
                doAddItemNew(index, rData, dNum, tData);

                //完了
                if (num == 0)
                {
                    return(true);
                }
            }
        }
    }
Exemple #12
0
    /** 判断是否有单个物品位置(核心) */
    protected override bool doHasItemPlaceC(int id, int num, ItemData data)
    {
        ItemConfig config;

        if (data != null)
        {
            data.makeConfig();
            config = data.config;
        }
        else
        {
            config = ItemConfig.get(id);
        }

        ItemRecordData rData = getRecordData(id);

        //自动使用道具
        if (config.type == ItemType.Tool && config.passEnterBag)
        {
            return(true);
        }

        //超出总上限
        if (config.totalPlusMax > 0 && ((rData != null ? rData.num : 0) + num) > config.totalPlusMax)
        {
            return(false);
        }

        //无上限
        if (_gridNum <= 0)
        {
            return(true);
        }

        //超单个上限的
        if (config.singlePlusMax > 0 && num >= config.singlePlusMax)
        {
            int needGridNum = (int)Mathf.Ceil((float)num / config.singlePlusMax);

            return(needGridNum <= doGetFreeGridNum());
        }

        //有空余格子
        if (!isGridFull())
        {
            return(true);
        }

        if (config.singlePlusMax == 1 || config.enableTimeT != null)
        {
            return(false);
        }

        int itemPos = rData != null ? rData.addIndex : -1;

        //没找到添加位置
        if (itemPos == -1)
        {
            return(false);
        }
        else
        {
            ItemData tData = _list.get(itemPos);

            //是否绑定
            bool isBind = config.bindByGet || (data != null && data.isBind);

            if (tData.isBind != isBind)
            {
                return(false);
            }

            if (config.singlePlusMax <= 0)
            {
                return(true);
            }

            return(config.singlePlusMax - tData.num >= num);
        }
    }
Exemple #13
0
 private void removeRecordData(ItemRecordData rData)
 {
     rData.clear();
 }