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); } }
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(); }
/** 完全移除一个格子(对应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); } } }
/** 执行添加一个物品(核心) */ 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); } } } }
/** 判断是否有单个物品位置(核心) */ 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); } }
private void removeRecordData(ItemRecordData rData) { rData.clear(); }