protected static bool LoadSocializingActionAvailability(BooterHelper.DataBootFile actionAvailability)
        {
            if (actionAvailability.GetTable("ActiveTopic") == null)
            {
                BooterLogger.AddError(actionAvailability + ": No ActiveTopic");
                return false;
            }

            SocialManager.ParseStcActionAvailability(actionAvailability.Data);
            SocialManager.ParseActiveTopic(actionAvailability.Data);

            return true;
        }
        private static void ParseOpportunitySetup(BooterHelper.DataBootFile file, int total)
        {
            XmlDbTable table = file.GetTable("OpportunitiesSetup");
            if (table == null) return;

            BooterLogger.AddTrace(file + ": Found Setup = " + table.Rows.Count);

            if (total != table.Rows.Count)
            {
                BooterLogger.AddError(file + ": Found Too few Setup " + total + " < " + table.Rows.Count);
            }

            foreach (XmlDbRow row in table.Rows)
            {
                OpportunityNames names = GenericManager<OpportunityNames, Opportunity, Opportunity>.ParseGuid(row["GUID"]);

                #region NEWCODE
                if (names == OpportunityNames.Undefined)
                {
                    names = unchecked((OpportunityNames)ResourceUtils.HashString64(row["GUID"]));
                }
                #endregion

                if (GenericManager<OpportunityNames, Opportunity, Opportunity>.sDictionary.ContainsKey((ulong)names))
                {
                    string[] strArray5;
                    string[] strArray6;
                    Opportunity opportunity = GenericManager<OpportunityNames, Opportunity, Opportunity>.sDictionary[(ulong) names];
                    Opportunity.OpportunitySharedData sharedData = opportunity.SharedData;
                    string name = row.GetString("Object");
                    if (name != string.Empty)
                    {
                        ParserFunctions.TryParseEnum<OpportunityObjectTypes>(name, out sharedData.mSetupObjectType, OpportunityObjectTypes.Undefined);
                    }
                    sharedData.mSetupObjectData = row.GetString("ObjectData");
                    if (sharedData.mSetupObjectType == OpportunityObjectTypes.Keystone)
                    {
                        OpportunityManager.sKeystonesThatComeFromAdventures[sharedData.mSetupObjectData] = true;
                    }
                    sharedData.mSetupObjectTreasureSpawner = row.GetString("ObjectTreasureSpawner");
                    sharedData.SetFlags(Opportunity.OpportunitySharedData.FlagField.SetupObjectRequiredOnCompletion, row.GetBool("RequiredOnCompletion"));
                    sharedData.SetFlags(Opportunity.OpportunitySharedData.FlagField.DeleteSetupObjectOnCompletion, row.GetBool("DeleteOnCompletion"));
                    if (!string.IsNullOrEmpty(row.GetString("DeleteOnFailure")))
                    {
                        sharedData.SetFlags(Opportunity.OpportunitySharedData.FlagField.DeleteSetupObjectOnFailure, row.GetBool("DeleteOnFailure"));
                    }
                    else
                    {
                        sharedData.SetFlags(Opportunity.OpportunitySharedData.FlagField.DeleteSetupObjectOnFailure, sharedData.HasFlags(Opportunity.OpportunitySharedData.FlagField.DeleteSetupObjectOnCompletion));
                    }
                    if (sharedData.HasFlags(Opportunity.OpportunitySharedData.FlagField.DeleteSetupObjectOnCompletion))
                    {
                        sharedData.HasFlags(Opportunity.OpportunitySharedData.FlagField.DeleteSetupObjectOnFailure);
                    }
                    string str2 = row.GetString("ObjectStateForCompletion");
                    if (str2 != string.Empty)
                    {
                        string[] strArray = null;
                        if (ParserFunctions.ParseCommaSeparatedString(str2, out strArray))
                        {
                            ParserFunctions.TryParseEnum<OpportunityObjectState>(strArray[0x0], out sharedData.mSetupObjectCompletionState, OpportunityObjectState.Undefined);
                            if (strArray.Length == 0x2)
                            {
                                sharedData.mSetupObjectCompletionStateData = strArray[0x1];
                            }
                        }
                    }
                    row.TryGetEnum<OpportunityCompletionTNSType>("CompletionTNSType", out sharedData.mCompletionTNSType, OpportunityCompletionTNSType.Info);
                    Opportunity.OpportunitySharedData.DestinationInventoryType simInventory = Opportunity.OpportunitySharedData.DestinationInventoryType.SimInventory;
                    row.TryGetEnum<Opportunity.OpportunitySharedData.DestinationInventoryType>("DestinationInventory", out simInventory, Opportunity.OpportunitySharedData.DestinationInventoryType.SimInventory);
                    sharedData.mDestinationInventoryType = simInventory;
                    string str3 = row.GetString("Target");
                    if (str3 != string.Empty)
                    {
                        ParserFunctions.TryParseEnum<OpportunityTargetTypes>(str3, out sharedData.mTargetType, OpportunityTargetTypes.Undefined);
                    }
                    else if (name != string.Empty)
                    {
                        sharedData.mTargetType = OpportunityTargetTypes.SetupObject;
                    }
                    sharedData.mTargetData = row.GetString("TargetData");
                    string str4 = row.GetString("Source");
                    if (str4 != string.Empty)
                    {
                        ParserFunctions.TryParseEnum<OpportunityTargetTypes>(str4, out sharedData.mSourceType, OpportunityTargetTypes.Undefined);
                    }
                    sharedData.mSourceData = row.GetString("SourceData");
                    string str5 = row.GetString("TargetInteractionName");
                    if (str5 != string.Empty)
                    {
                        sharedData.mTargetInteractionName = "Gameplay/Excel/Opportunities/OpportunitiesSetup:" + str5;
                    }
                    sharedData.mSocialTextKeys = row.GetStringList("TargetSocialTextKeys", ',');
                    sharedData.SetFlags(Opportunity.OpportunitySharedData.FlagField.TargetInteractionIgnoreTarget, row.GetBool("TargetInteractionIgnoreTarget"));
                    sharedData.mTargetInteractionLikingToAccept = row.GetFloat("TargetInteractionLikingToAccept");
                    ParserFunctions.TryParseEnum<Role.RoleType>(row.GetString("TargetRoleRequired"), out sharedData.mTargetRoleRequired, Role.RoleType.None);
                    string str6 = row.GetString("TargetWorldRequired");
                    if ((str6 == "HomeWorld") || (sharedData.mProductVersion == ProductVersion.BaseGame))
                    {
                        sharedData.mTargetWorldRequired = WorldName.SunsetValley;
                    }
                    else
                    {
                        ParserFunctions.TryParseEnum<WorldName>(str6, out sharedData.mTargetWorldRequired, WorldName.Undefined);
                    }
                    sharedData.mTargetInteractionLength = row.GetFloat("TargetInteractionLength");
                    sharedData.mTargetInteractionDays = row.GetString("TargetInteractionDays");
                    sharedData.mTargetInteractionStartTime = ParserFunctions.ParseTime(row.GetString("TargetInteractionStartTime"));
                    sharedData.mTargetInteractionEndTime = ParserFunctions.ParseTime(row.GetString("TargetInteractionEndTime"));
                    string str7 = row.GetString("TargetInteractionCommodity");
                    if (!string.IsNullOrEmpty(str7))
                    {
                        string[] strArray2 = null;
                        if (ParserFunctions.ParseCommaSeparatedString(str7, out strArray2) && (strArray2.Length == 0x2))
                        {
                            ParserFunctions.TryParseEnum<CommodityKind>(strArray2[0x0], out sharedData.mTargetCommodity, CommodityKind.None);
                            float.TryParse(strArray2[0x1], out sharedData.mTargetCommodityDesiredValue);
                        }
                    }
                    string str8 = row.GetString("TargetInteractionItemRequired");
                    if (str8 != string.Empty)
                    {
                        string[] strArray3 = null;
                        if (ParserFunctions.ParseSemicolonSeparatedString(str8, out strArray3, false))
                        {
                            for (int i = 0x0; i < strArray3.Length; i++)
                            {
                                string[] strArray4 = null;
                                if (ParserFunctions.ParseCommaSeparatedString(strArray3[i].Trim(), out strArray4, false))
                                {
                                    for (int j = 0x0; j < strArray4.Length; j++)
                                    {
                                        strArray4[j] = strArray4[j].Trim();
                                    }
                                    if ((!OpportunityManager.ParseTargetInteractionItemInfo(strArray4, ref sharedData) && OpportunityManager.sDoValidation) && (sharedData.mRequiredItems != null))
                                    {
                                        int count = sharedData.mRequiredItems.Count;
                                    }
                                }
                            }
                        }
                    }
                    int num3 = (sharedData.mRequiredItems == null) ? 0x0 : sharedData.mRequiredItems.Count;
                    sharedData.SetFlags(Opportunity.OpportunitySharedData.FlagField.UseCollectibleProgressText, row.GetBool("TargetUseCollectibleProgressText"));
                    string str10 = row.GetString("TargetDeletionSortingFunction");
                    if ((!string.IsNullOrEmpty(str10) && (OpportunityManager.sOpportunitiesSortClassType != null)) && ParserFunctions.ParseSemicolonSeparatedString(str10, out strArray5))
                    {
                        int length = strArray5.Length;
                        for (int k = 0x0; k < strArray5.Length; k++)
                        {
                            MethodInfo method = OpportunityManager.sOpportunitiesSortClassType.GetMethod(strArray5[k], BindingFlags.Public | BindingFlags.Static);
                            if (method != null)
                            {
                                sharedData.mRequiredItems[k].mInventorySortFn = Delegate.CreateDelegate(typeof(InventoryItemSortDelegate), method) as InventoryItemSortDelegate;
                            }
                        }
                    }
                    if (ParserFunctions.ParseSemicolonSeparatedString(row.GetString("TargetInteractionNumberItemsRequired"), out strArray6))
                    {
                        int num10 = strArray6.Length;
                        for (int m = 0x0; m < strArray6.Length; m++)
                        {
                            List<int> list;
                            int num6 = 0x0;
                            int num7 = 0x0;
                            ParserFunctions.ParseCommaSeperatedInt(strArray6[m], out list);
                            if (list.Count == 0x1)
                            {
                                num6 = num7 = list[0x0];
                            }
                            else if (list.Count == 0x2)
                            {
                                num6 = Math.Min(list[0x0], list[0x1]);
                                num7 = Math.Max(list[0x0], list[0x1]);
                            }
                            sharedData.mRequiredItems[m].mTargetInteractionNumberItemsRequiredMin = num6;
                            sharedData.mRequiredItems[m].mTargetInteractionNumberItemsRequiredMax = num7;
                        }
                    }
                    if ((sharedData.mRequiredItems == null) || ((sharedData.mRequiredItems.Count == 0x1) && (sharedData.mRequiredItems[0x0].mTargetInteractionNumberItemsRequiredMin <= 0x0)))
                    {
                        sharedData.SetFlags(Opportunity.OpportunitySharedData.FlagField.UseCollectibleProgressText, false);
                    }
                    sharedData.SetFlags(Opportunity.OpportunitySharedData.FlagField.TargetInteractionItemsDeleted, row.GetBool("TargetInteractionItemsDeleted"));
                    string str12 = row.GetString("TargetProceduralDeletionFunction");
                    if (!string.IsNullOrEmpty(str12) && (OpportunityManager.sOpportunitiesDeletionDelegateClassType != null))
                    {
                        MethodInfo info2 = OpportunityManager.sOpportunitiesDeletionDelegateClassType.GetMethod(str12, BindingFlags.Public | BindingFlags.Static);
                        if (info2 != null)
                        {
                            sharedData.mTargetProceduralDeletionDelegate = Delegate.CreateDelegate(typeof(OpportunityTargetProceduralDeletionDelegate), info2) as OpportunityTargetProceduralDeletionDelegate;
                        }
                    }
                    if ((OpportunityManager.sDoValidation && (sharedData.mRequiredItems != null)) && (sharedData.mRequiredItems.Count > 0x0))
                    {
                        for (int n = 0x0; n < sharedData.mRequiredItems.Count; n++)
                        {
                            if (((sharedData.TargetInteractionItemRequired(n) != null) && (sharedData.mTargetProceduralDeletionDelegate == null)) && ((sharedData.mRequiredItems[n].mTargetInteractionNumberItemsRequiredMin <= 0x0) && (sharedData.mGuid != OpportunityNames.EP1_Quest_Necteaux6)))
                            {
                                OpportunityNames mGuid = sharedData.mGuid;
                            }
                        }
                    }
                    string str13 = row.GetString("AdventureMapTagTarget");
                    if (!string.IsNullOrEmpty(str13))
                    {
                        string[] strArray7;
                        ParserFunctions.ParseCommaSeparatedString(str13, out strArray7);
                        if (strArray7.Length == 0x2)
                        {
                            ParserFunctions.TryParseEnum<AdventureMapTagTargetType>(strArray7[0x0], out sharedData.mAdventureMapTagTargetType, AdventureMapTagTargetType.None);
                            if (sharedData.mAdventureMapTagTargetType != AdventureMapTagTargetType.None)
                            {
                                sharedData.mAdventureMapTagTarget = strArray7[0x1];
                            }
                        }
                    }
                    string str14 = row.GetString("OppMapDagDisplayType");
                    if (!string.IsNullOrEmpty(str14))
                    {
                        ParserFunctions.TryParseEnum<Opportunity.OpportunitySharedData.MapTagOppDisplayType>(str14, out sharedData.MapTagDisplayType, Opportunity.OpportunitySharedData.MapTagOppDisplayType.Normal);
                    }
                    DaysOfTheWeek none = DaysOfTheWeek.None;
                    if (row.TryGetEnum<DaysOfTheWeek>("EventDay", out none, DaysOfTheWeek.None))
                    {
                        sharedData.mEventDay = none;

                        if (row.GetString("EventStartTime") != null)
                        {
                            sharedData.mEventStartTime = ParserFunctions.ParseTime(row.GetString("EventStartTime"));
                        }
                        else
                        {
                            BooterLogger.AddError(file + ": EventStartTime missing " + row["GUID"]);
                        }

                        if (row.GetString("EventEndTime") != null)
                        {
                            sharedData.mEventEndTime = ParserFunctions.ParseTime(row.GetString("EventEndTime"));
                        }
                        else
                        {
                            BooterLogger.AddError(file + ": EventEndTime missing " + row["GUID"]);
                        }

                        sharedData.mEventSetup = row.GetString("EventSetup");
                    }
                    opportunity.SourceData = sharedData.mSourceData;
                    opportunity.SourceType = sharedData.mSourceType;
                    opportunity.TargetData = sharedData.mTargetData;
                    opportunity.TargetType = sharedData.mTargetType;
                }
            }
        }
        private static void ParseOpportunityNames(BooterHelper.DataBootFile file, int total)
        {
            XmlDbTable table = file.GetTable("Names");
            if (table == null) return;

            BooterLogger.AddTrace(file + ": Found Names = " + table.Rows.Count);

            if (total != table.Rows.Count)
            {
                BooterLogger.AddError(file + ": Found Too few Names " + total + " < " + table.Rows.Count);
            }

            foreach (XmlDbRow row in table.Rows)
            {
                OpportunityNames names = GenericManager<OpportunityNames, Opportunity, Opportunity>.ParseGuid(row["GUID"]);

                // new Code
                if (names == OpportunityNames.Undefined)
                {
                    names = unchecked((OpportunityNames)ResourceUtils.HashString64(row["GUID"]));
                }

                bool sDoValidation = OpportunityManager.sDoValidation;
                if (GenericManager<OpportunityNames, Opportunity, Opportunity>.sDictionary.ContainsKey((ulong)names))
                {
                    Opportunity.OpportunitySharedData sharedData = GenericManager<OpportunityNames, Opportunity, Opportunity>.sDictionary[(ulong)names].SharedData;
                    sharedData.mName.Add("Gameplay/Excel/Opportunities/Names:" + row.GetString("OpportunityName"));
                    sharedData.mDescription.Add("Gameplay/Excel/Opportunities/Names:" + row.GetString("OpportunityDescription"));
                    string str3 = row.GetString("OpportunityHint");
                    sharedData.mHint.Add(string.IsNullOrEmpty(str3) ? string.Empty : ("Gameplay/Excel/Opportunities/Names:" + str3));
                    string str4 = row.GetString("CompletionText");
                    sharedData.mCompletionText.Add(string.IsNullOrEmpty(str4) ? string.Empty : ("Gameplay/Excel/Opportunities/Names:" + str4));
                    string str5 = row.GetString("SecondaryCompletionText");
                    sharedData.mSecondaryCompletionText.Add(string.IsNullOrEmpty(str5) ? string.Empty : ("Gameplay/Excel/Opportunities/Names:" + str5));
                    string str6 = row.GetString("FailureText");
                    sharedData.mFailureText.Add(string.IsNullOrEmpty(str6) ? string.Empty : ("Gameplay/Excel/Opportunities/Names:" + str6));
                    string str7 = row.GetString("ProgressText");
                    sharedData.mProgressText.Add(string.IsNullOrEmpty(str7) ? string.Empty : ("Gameplay/Excel/Opportunities/Names:" + str7));
                }
                else
                {
                    BooterLogger.AddError(file + ": Names Unknown Opp " + row["GUID"]);
                }
            }
        }
        private static void ParseOpportunityRequirements(BooterHelper.DataBootFile file, int total)
        {
            XmlDbTable table = file.GetTable("OpportunitiesRequirements");
            if (table == null) return;

            BooterLogger.AddTrace(file + ": Found Req = " + table.Rows.Count);

            if (total != table.Rows.Count)
            {
                BooterLogger.AddError(file + ": Found Too few Req " + total + " < " + table.Rows.Count);
            }

            foreach (XmlDbRow row in table.Rows)
            {
                OpportunityNames opportunityKey = GenericManager<OpportunityNames, Opportunity, Opportunity>.ParseGuid(row["GUID"]);

                // New code
                if (opportunityKey == OpportunityNames.Undefined)
                {
                    opportunityKey = unchecked((OpportunityNames)ResourceUtils.HashString64(row["GUID"]));
                }

                bool sDoValidation = OpportunityManager.sDoValidation;
                if (GenericManager<OpportunityNames, Opportunity, Opportunity>.sDictionary.ContainsKey((ulong)opportunityKey))
                {
                    Opportunity opp = GenericManager<OpportunityNames, Opportunity, Opportunity>.sDictionary[(ulong)opportunityKey];

                    Opportunity.OpportunitySharedData sharedData = opp.SharedData;
                    sharedData.mRequirementList = ParseRequirements(row, opportunityKey);
                    List<string> stringList = row.GetStringList("CustomRequirementFunction", ',');
                    if (stringList.Count > 0)
                    {
                        sharedData.mRequirementDelegate = (OpportunityRequirementDelegate)OpportunityManager.ParseDelegatePair(stringList[0], stringList[1], typeof(OpportunityRequirementDelegate));
                    }
                }
                else
                {
                    BooterLogger.AddError(file + ": Req Unknown Opp " + row["GUID"]);
                }
            }
        }
        private static void ParseOpportunityCompletion(BooterHelper.DataBootFile file, int total)
        {
            XmlDbTable table = file.GetTable("OpportunitiesCompletion");
            if (table == null) return;

            BooterLogger.AddTrace(file + ": Found Completion = " + table.Rows.Count);

            if (total != table.Rows.Count)
            {
                BooterLogger.AddError(file + ": Found Too few Completion " + total + " < " + table.Rows.Count);
            }

            foreach (XmlDbRow row in table.Rows)
            {
                OpportunityNames names = GenericManager<OpportunityNames, Opportunity, Opportunity>.ParseGuid(row["GUID"]);

                // New code
                if (names == OpportunityNames.Undefined)
                {
                    names = unchecked((OpportunityNames)ResourceUtils.HashString64(row["GUID"]));
                }

                OpportunityNames names2 = GenericManager<OpportunityNames, Opportunity, Opportunity>.ParseGuid(row["TriggerOpportunityOnCompletion"]);
                bool sDoValidation = OpportunityManager.sDoValidation;
                if (GenericManager<OpportunityNames, Opportunity, Opportunity>.sDictionary.ContainsKey((ulong)names))
                {
                    Opportunity.OpportunitySharedData sharedData = GenericManager<OpportunityNames, Opportunity, Opportunity>.sDictionary[(ulong)names].SharedData;
                    sharedData.mCompletionTriggerOpportunity = names2;
                    if (names2 != OpportunityNames.Undefined)
                    {
                        GenericManager<OpportunityNames, Opportunity, Opportunity>.sDictionary[(ulong)names2].SharedData.mParentOpportunity = names;
                    }
                    sharedData.SetFlags(Opportunity.OpportunitySharedData.FlagField.TriggerQuietly, row.GetBool("TriggerQuietly"));
                    sharedData.SetFlags(Opportunity.OpportunitySharedData.FlagField.ShowRewardText, row.GetBool("ShowRewardText"));
                    sharedData.mCompletionWinChance = row.GetFloat("CompletionWinChance");
                    sharedData.mWinRewardsList = ParseRewards(row, OpportunityManager.sCompletionWinRewardColumns, 0x4);
                    sharedData.mLossRewardsList = ParseRewards(row, OpportunityManager.sCompletionLossRewardColumns, 0x4);
                    sharedData.mFailureRewardsList = ParseRewards(row, OpportunityManager.sFailureRewardColumns, 0x4);
                    sharedData.mModifierList = ParseModifiers(row, OpportunityManager.sCompletionModifierColumns, 0x4);
                    List<string> stringList = row.GetStringList("CustomOnWinCompletionFunction", ',');
                    if (stringList.Count > 0x0)
                    {
                        bool flag2 = OpportunityManager.sDoValidation;
                        sharedData.mWinCompletionDelegate = (OpportunityCompletionDelegate)OpportunityManager.ParseDelegatePair(stringList[0x0], stringList[0x1], typeof(OpportunityCompletionDelegate));
                    }
                    List<string> list2 = row.GetStringList("CustomOnLossCompletionFunction", ',');
                    if (list2.Count > 0x0)
                    {
                        bool flag3 = OpportunityManager.sDoValidation;
                        sharedData.mLossCompletionDelegate = (OpportunityCompletionDelegate)OpportunityManager.ParseDelegatePair(list2[0x0], list2[0x1], typeof(OpportunityCompletionDelegate));
                    }
                }
            }

            foreach (Opportunity opportunity in GenericManager<OpportunityNames, Opportunity, Opportunity>.sDictionary.Values)
            {
                OpportunityTargetTypes types;
                string str;
                OpportunityTargetTypes types2;
                string str2;
                if (((opportunity.SharedData.mSourceType == OpportunityTargetTypes.PreviousSource) || (opportunity.SharedData.mSourceType == OpportunityTargetTypes.PreviousTarget)) && (OpportunityManager.FindOriginalSourceOrTarget(opportunity, opportunity.SharedData.mSourceType, out types, out str) != null))
                {
                    opportunity.SharedData.mOriginalSourceType = types;
                }
                if (((opportunity.SharedData.mTargetType == OpportunityTargetTypes.PreviousSource) || (opportunity.SharedData.mTargetType == OpportunityTargetTypes.PreviousTarget)) && (OpportunityManager.FindOriginalSourceOrTarget(opportunity, opportunity.SharedData.mTargetType, out types2, out str2) != null))
                {
                    opportunity.SharedData.mOriginalTargetType = types2;
                }
            }
        }