/// <summary> /// Assigns character items from classic save tree. /// </summary> public void AssignItems(SaveTree saveTree) { // Find character record, should always be a singleton CharacterRecord characterRecord = (CharacterRecord)saveTree.FindRecord(RecordTypes.Character); if (characterRecord == null) { return; } // Find all character-owned items List <SaveTreeBaseRecord> itemRecords = saveTree.FindRecords(RecordTypes.Item, characterRecord); // Filter for container-based inventory items List <SaveTreeBaseRecord> filteredRecords = saveTree.FilterRecordsByParentType(itemRecords, RecordTypes.Container); // Add interim Daggerfall Unity items foreach (var record in filteredRecords) { // Get container parent ContainerRecord containerRecord = (ContainerRecord)record.Parent; // Create item, grabbing trapped soul if needed DaggerfallUnityItem newItem = new DaggerfallUnityItem((ItemRecord)record); if (newItem.ItemGroup == ItemGroups.MiscItems && newItem.GroupIndex == 1) { if (record.Children.Count > 0) { TrappedSoulRecord soulRecord = (TrappedSoulRecord)record.Children[0]; newItem.TrappedSoulType = (MobileTypes)soulRecord.RecordRoot.SpriteIndex; } else { newItem.TrappedSoulType = MobileTypes.None; } } // Add to local inventory or wagon if (containerRecord.IsWagon) { wagonItems.AddItem(newItem); } else { items.AddItem(newItem); } // Equip to player if equipped in save for (int i = 0; i < characterRecord.ParsedData.equippedItems.Length; i++) { if (characterRecord.ParsedData.equippedItems[i] == record.RecordRoot.RecordID) { equipTable.EquipItem(newItem, true, false); } } } }
/// <summary> /// Assigns character items from classic save tree. /// </summary> public void AssignItems(SaveTree saveTree) { // Find character record, should always be a singleton CharacterRecord characterRecord = (CharacterRecord)saveTree.FindRecord(RecordTypes.Character); if (characterRecord == null) { return; } // Find all character-owned items List <SaveTreeBaseRecord> itemRecords = saveTree.FindRecords(RecordTypes.Item, characterRecord); // Filter for container-based inventory items List <SaveTreeBaseRecord> filteredRecords = saveTree.FilterRecordsByParentType(itemRecords, RecordTypes.Container); // Add interim Daggerfall Unity items foreach (var record in filteredRecords) { // Get container parent ContainerRecord containerRecord = (ContainerRecord)record.Parent; // Some (most likely hacked) classic items have 0 or 65535 in image data bitfield // Discard these items as they will likely have other bad attributes such as an impossible weight // The goal here is just to prevent game from crashing due to bad item data if ((record as ItemRecord).ParsedData.image1 == 0 || (record as ItemRecord).ParsedData.image1 == 0xffff) { continue; } // Create item, grabbing trapped soul if needed DaggerfallUnityItem newItem = new DaggerfallUnityItem((ItemRecord)record); if (newItem.ItemGroup == ItemGroups.MiscItems && newItem.GroupIndex == 1) { if (record.Children.Count > 0) { TrappedSoulRecord soulRecord = (TrappedSoulRecord)record.Children[0]; newItem.TrappedSoulType = (MobileTypes)soulRecord.RecordRoot.SpriteIndex; } else { newItem.TrappedSoulType = MobileTypes.None; } } // Add to local inventory or wagon if (containerRecord.IsWagon) { wagonItems.AddItem(newItem); } else { items.AddItem(newItem); } // Equip to player if equipped in save for (int i = 0; i < characterRecord.ParsedData.equippedItems.Length; i++) { if (characterRecord.ParsedData.equippedItems[i] == record.RecordRoot.RecordID) { equipTable.EquipItem(newItem, true, false); } } } }