/// <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); } } } }
void DisplaySaveTree(SaveTreeBaseRecord parent) { for (int i = 0; i < parent.Children.Count; i++) { RecordTypes recordType = parent.Children[i].RecordType; if (recordType == RecordTypes.Door || recordType == RecordTypes.Goods) { continue; } string textLabel = recordType.ToString(); if (recordType == RecordTypes.Item || recordType == RecordTypes.Spell) { textLabel += string.Format(" [{0}]", GetItemOrSpellName(parent.Children[i])); } // Check if item equipped if (recordType == RecordTypes.Item) { //ItemRecord itemRecord = (ItemRecord)parent.Children[i]; //textLabel += string.Format(" [id={0}]", itemRecord.RecordRoot.RecordID); int equippedIndex = GetEquippedIndex(parent.Children[i] as ItemRecord); if (equippedIndex != -1) { //textLabel = string.Format("(*={0:00}) {1}", equippedIndex, textLabel); } } // Tag container types if (recordType == RecordTypes.Container && parent.RecordType == RecordTypes.Character) { string[] tags = { " [Weapons & Armor]", " [Magic Items]", " [Clothing & Misc]", " [Ingredients]", " [Wagon]", " [House]", " [Ship]", " [Tavern Rooms]", " [Item Repairers]" }; ContainerRecord containerRecord = (ContainerRecord)parent.Children[i]; textLabel += tags[containerRecord.RecordRoot.SpriteIndex]; } EditorGUILayout.LabelField(textLabel); GUILayoutHelper.Indent(() => { DisplaySaveTree(parent.Children[i]); }); } }
void DisplaySaveTree(SaveTreeBaseRecord parent) { for (int i = 0; i < parent.Children.Count; i++) { RecordTypes recordType = parent.Children[i].RecordType; if (recordType == RecordTypes.Door || recordType == RecordTypes.UnknownItemRecord) { continue; } string textLabel = recordType.ToString(); if (recordType == RecordTypes.Item || recordType == RecordTypes.Spell) { textLabel += string.Format(" [{0}]", GetItemOrSpellName(parent.Children[i])); } // Check if item equipped if (recordType == RecordTypes.Item) { //ItemRecord itemRecord = (ItemRecord)parent.Children[i]; //textLabel += string.Format(" [id={0}]", itemRecord.RecordRoot.RecordID); int equippedIndex = GetEquippedIndex(parent.Children[i] as ItemRecord); if (equippedIndex != -1) { //textLabel = string.Format("(*={0:00}) {1}", equippedIndex, textLabel); } } // Tag wagon container if (recordType == RecordTypes.Container && parent.RecordType == RecordTypes.Character) { ContainerRecord containerRecord = (ContainerRecord)parent.Children[i]; if (containerRecord.IsWagon) { textLabel += " [Wagon]"; } } EditorGUILayout.LabelField(textLabel); GUILayoutHelper.Indent(() => { DisplaySaveTree(parent.Children[i]); }); } }
/// <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; // Add to local inventory or wagon DaggerfallUnityItem newItem = new DaggerfallUnityItem((ItemRecord)record); 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 >> 8)) { equipTable.EquipItem(newItem); } } } }
/// <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); } } } }