public ObservableCollection <StringIntPair> GetGuardianRewards()
        {
            ObservableCollection <StringIntPair> pairs = new ObservableCollection <StringIntPair>();

            foreach (string humanName in DataPathTranslations.GuardianRankRewards.Values)
            {
                bool bUpdatedRankData = false;
                foreach (GuardianRankRewardSaveGameData rankData in loadedProfile.GuardianRank.RankRewards)
                {
                    string h = DataPathTranslations.GetHumanRewardString(rankData.RewardDataPath);
                    if (h.Equals(humanName))
                    {
                        Console.WriteLine("Rank Data ({0}): {1}", humanName, rankData.NumTokens);
                        pairs.Add(new StringIntPair(humanName, rankData.NumTokens));
                        bUpdatedRankData = true;
                        break;
                    }
                }
                if (!bUpdatedRankData)
                {
                    pairs.Add(new StringIntPair(humanName, 0));
                }
            }

            return(pairs);
        }
        private void UnlockRoomDecorations(object sender, System.Windows.RoutedEventArgs e)
        {
            List <string> roomDecos = DataPathTranslations.GetDecorationAssetPaths();

            foreach (string assetPath in roomDecos)
            {
                bool bAlreadyOwned = false;
                foreach (CrewQuartersDecorationItemSaveGameData d in loadedProfile.UnlockedCrewQuartersDecorations)
                {
                    if (d.DecorationItemAssetPath.Equals(assetPath))
                    {
                        bAlreadyOwned = true;
                        break;
                    }
                }
                if (!bAlreadyOwned)
                {
                    CrewQuartersDecorationItemSaveGameData d = new CrewQuartersDecorationItemSaveGameData()
                    {
                        DecorationItemAssetPath = assetPath,
                        IsNew = true
                    };
                    loadedProfile.UnlockedCrewQuartersDecorations.Add(d);
                    Console.WriteLine("Doesnt own room deco: {0}", assetPath);
                }
            }
        }
        private void ReadGUIData()
        {
            foreach (StringIntPair p in GuardianRankDataGrid.Items)
            {
                string assetPath      = DataPathTranslations.GetRewardAssetPathString(p.str);
                bool   bRankDataSaved = false;

                foreach (GuardianRankRewardSaveGameData rankData in loadedProfile.GuardianRank.RankRewards)
                {
                    if (rankData.RewardDataPath.Equals(assetPath))
                    {
                        rankData.NumTokens = (int)p.Value;
                        bRankDataSaved     = true;
                        break;
                    }
                }

                if (!bRankDataSaved)
                {
                    loadedProfile.GuardianRank.RankRewards.Add(new GuardianRankRewardSaveGameData()
                    {
                        RewardDataPath = assetPath, NumTokens = (int)p.Value
                    });
                }

                if (p.Value == 0)
                {
                    loadedProfile.GuardianRank.RankRewards.RemoveAll(x => x.RewardDataPath.Equals(assetPath));
                }
            }

            loadedProfile.GuardianRank.GuardianExperience = (int)loadedProfile.GuardianRank.NewGuardianExperience;

            // If the save loaded previously never had any golden keys, the hashes won't be here... :/
            if (
                !loadedProfile.BankInventoryCategoryLists.Select(x => x.BaseCategoryDefinitionHash).Contains(DataPathTranslations.GoldenKeyHash) && GoldenKeys.Value != null)
            {
                loadedProfile.BankInventoryCategoryLists.Add(new InventoryCategorySaveData
                {
                    BaseCategoryDefinitionHash = DataPathTranslations.GoldenKeyHash,
                    Quantity = (int)GoldenKeys.Value
                });
            }
        }
        private void UnlockCustomizations(object sender, System.Windows.RoutedEventArgs e)
        {
            List <string> customizationAssetPaths        = DataPathTranslations.GetCustomizationAssetPaths();
            List <OakCustomizationSaveGameData> saveData = loadedProfile.UnlockedCustomizations;
            List <OakCustomizationSaveGameData> output   = new List <OakCustomizationSaveGameData>();

            foreach (string assetPath in customizationAssetPaths)
            {
                string lowerAsset = assetPath.ToLower();

                if (lowerAsset.Contains("default") || (lowerAsset.Contains("emote") && (lowerAsset.Contains("wave") || lowerAsset.Contains("cheer") || lowerAsset.Contains("laugh") || lowerAsset.Contains("point"))))
                {
                    continue;
                }

                //if (!lowerAsset.Contains("beastmaster")) continue;

                bool bAlreadyOwnsCustomization = false;
                foreach (OakCustomizationSaveGameData customizatonData in saveData)
                {
                    if (customizatonData.CustomizationAssetPath.Equals(assetPath))
                    {
                        bAlreadyOwnsCustomization = true;
                        break;
                    }
                }
                if (!bAlreadyOwnsCustomization)
                {
                    OakCustomizationSaveGameData d = new OakCustomizationSaveGameData
                    {
                        CustomizationAssetPath = assetPath,
                        IsNew = true
                    };
                    output.Add(d);
                    Console.WriteLine("Doesn't own customization: {0}", assetPath);
                }
            }
            saveData.AddRange(output);
        }
        private void UnlockCustomizations(object sender, System.Windows.RoutedEventArgs e)
        {
            List <string> customizationAssetPaths        = DataPathTranslations.GetCustomizationAssetPaths();
            List <OakCustomizationSaveGameData> saveData = loadedProfile.UnlockedCustomizations;
            List <OakCustomizationSaveGameData> output   = new List <OakCustomizationSaveGameData>();

            foreach (string assetPath in customizationAssetPaths)
            {
                string lowerAsset = assetPath.ToLower();

                if (lowerAsset.Contains("default") || (lowerAsset.Contains("emote") && (lowerAsset.Contains("wave") || lowerAsset.Contains("cheer") || lowerAsset.Contains("laugh") || lowerAsset.Contains("point"))))
                {
                    continue;
                }

                bool bAlreadyOwnsCustomization = false;
                foreach (OakCustomizationSaveGameData customizatonData in saveData)
                {
                    if (customizatonData.CustomizationAssetPath.Equals(assetPath))
                    {
                        bAlreadyOwnsCustomization = true;
                        break;
                    }
                }
                if (!bAlreadyOwnsCustomization)
                {
                    OakCustomizationSaveGameData d = new OakCustomizationSaveGameData
                    {
                        CustomizationAssetPath = assetPath,
                        IsNew = true
                    };
                    output.Add(d);
                    Console.WriteLine("Doesn't own customization: {0}", assetPath);
                }
            }
            saveData.AddRange(output);

            // The weapon trinkets / skins use a different format so we'll want to add this
            List <OakInventoryCustomizationPartInfo> weaponOut = new List <OakInventoryCustomizationPartInfo>();

            foreach (uint assetHash in DataPathTranslations.GetWeaponCustomizationPaths())
            {
                bool bOwnsHash = false;
                foreach (OakInventoryCustomizationPartInfo partInfo in loadedProfile.UnlockedInventoryCustomizationParts)
                {
                    if (partInfo.CustomizationPartHash.Equals(assetHash))
                    {
                        bOwnsHash = true;
                        break;
                    }
                }
                if (!bOwnsHash)
                {
                    OakInventoryCustomizationPartInfo customizationInfo = new OakInventoryCustomizationPartInfo
                    {
                        CustomizationPartHash = assetHash,
                        IsNew = true
                    };
                    weaponOut.Add(customizationInfo);
                }
            }
            loadedProfile.UnlockedInventoryCustomizationParts.AddRange(weaponOut);
        }