Ejemplo n.º 1
0
        public static void BuildDescendantHouseholdSpecs(FutureDescendantService ths)
        {
            Common.StringBuilder msg = new Common.StringBuilder("BuildDescendantHouseholdSpecs");

            try
            {
                if (Household.ActiveHousehold != null)
                {
                    // Custom
                    for (int i = FutureDescendantService.sPersistableData.ActiveDescendantHouseholdsInfo.Count - 1; i >= 0; i--)
                    {
                        FutureDescendantService.FutureDescendantHouseholdInfo info = FutureDescendantService.sPersistableData.ActiveDescendantHouseholdsInfo[i];
                        if (info.HasAncestorFromHousehold(Household.ActiveHousehold) && info.mProgenitorSimIds.Count != 4)
                        {
                            msg += Common.NewLine + "mProgenitorSimIds wasn't 4 (" + info.mProgenitorSimIds.Count + ") so removing " + info.mHouseholdName;
                            FutureDescendantService.sPersistableData.InvalidDescendantHouseholdsInfo.Add(info);

                            FutureDescendantService.sPersistableData.ActiveDescendantHouseholdsInfo.RemoveAt(i);
                        }
                    }
                    //

                    List <SimDescription> simDescriptions = Household.ActiveHousehold.SimDescriptions;
                    foreach (SimDescription description in simDescriptions)
                    {
                        // Custom
                        ProcessSim(ths, description);
                    }

                    foreach (SimDescription description2 in simDescriptions)
                    {
                        ths.GenerateAncestorMap(description2);
                    }

                    foreach (FutureDescendantService.FutureDescendantHouseholdInfo info in FutureDescendantService.sPersistableData.ActiveDescendantHouseholdsInfo)
                    {
                        if (info.HasAncestorFromHousehold(Household.ActiveHousehold))
                        {
                            info.CalculateHouseholdScores();
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Common.Exception("", e);
            }
            finally
            {
                Common.DebugWriteLog(msg);
            }
        }
Ejemplo n.º 2
0
        public static int CalculateHouseholdFamilyScore(FutureDescendantService.FutureDescendantHouseholdInfo ths, Common.StringBuilder results)
        {
            results.Append(Common.NewLine + "CalculateHouseholdFamilyScore");

            int householdSizeTraitScore = 0x0;

            foreach (ulong num2 in ths.mProgenitorSimIds)
            {
                IMiniSimDescription iMiniSimDescription = SimDescription.GetIMiniSimDescription(num2);
                if (iMiniSimDescription == null)
                {
                    continue;
                }

                results.Append(Common.NewLine + " Progenitor: " + iMiniSimDescription.FullName);

                MiniSimDescription miniSim = iMiniSimDescription as MiniSimDescription;
                SimDescription     fullSim = iMiniSimDescription as SimDescription;
                if (fullSim != null)
                {
                    foreach (Trait trait in fullSim.TraitManager.List)
                    {
                        results.Append(Common.NewLine + "  " + trait.TraitName(fullSim.IsFemale) + " : " + trait.DescendantFamilySizeModifier);

                        householdSizeTraitScore += trait.DescendantFamilySizeModifier;
                    }
                }
                else if (miniSim != null)
                {
                    foreach (TraitNames names in miniSim.Traits)
                    {
                        Trait traitFromDictionary = TraitManager.GetTraitFromDictionary(names);

                        results.Append(Common.NewLine + "  " + traitFromDictionary.TraitName(miniSim.IsFemale) + " : " + traitFromDictionary.DescendantFamilySizeModifier);

                        householdSizeTraitScore += traitFromDictionary.DescendantFamilySizeModifier;
                    }
                }
            }

            results.Append(Common.NewLine + " Score : " + householdSizeTraitScore);

            int result = FutureDescendantService.CalculateDesiredHouseholdSize(householdSizeTraitScore);

            results.Append(Common.NewLine + " Result : " + result);

            return(result);
        }
Ejemplo n.º 3
0
        public static bool CreateAndAddDescendant(FutureDescendantService.FutureDescendantHouseholdInfo ths)
        {
            Household descendantHousehold = ths.DescendantHousehold;

            if (descendantHousehold == null)
            {
                return(false);
            }

            List <SimDescription> potentialParents = new List <SimDescription>();

            foreach (SimDescription description in descendantHousehold.SimDescriptions)
            {
                if (description.YoungAdultOrAbove)
                {
                    potentialParents.Add(description);
                }
            }

            bool           noParents;
            SimDescription child = GenerateOffspring(potentialParents, out noParents);

            if (child == null)
            {
                if (noParents)
                {
                    if (Instantiate(ths) == null)
                    {
                        return(false);
                    }
                }
            }
            else
            {
                descendantHousehold.Add(child);
                ths.mHouseholdMembers.Add(child.SimDescriptionId);

                SimUtils.HouseholdCreationSpec.UpdateHouseholdLTR(ref descendantHousehold, descendantHousehold.Name, false);
            }

            return(true);
        }
        private static bool ProcessSim(FutureDescendantService ths, SimDescription simDesc)
        {
            try
            {
                if (FutureDescendantService.sPersistableData == null)
                {
                    return false;
                }
                else if (simDesc == null)
                {
                    return false;
                }
                else if (Household.ActiveHousehold != simDesc.Household)
                {
                    return false;
                }
                else if ((Household.RoommateManager != null) && Household.RoommateManager.IsNPCRoommate(simDesc))
                {
                    return false;
                }
                else if (simDesc.IsRobot)
                {
                    return false;
                }
                else if (simDesc.Genealogy == null)
                {
                    return false;
                }

                List<SimDescription> children = Relationships.GetChildren(simDesc);
                bool processed = false;
                if ((children != null) && (children.Count > 0x0))
                {
                    foreach (SimDescription child in children)
                    {
                        processed |= ProcessSim(ths, child);
                    }
                }

                if (!processed)
                {
                    foreach (FutureDescendantService.FutureDescendantHouseholdInfo info in FutureDescendantService.sPersistableData.ActiveDescendantHouseholdsInfo)
                    {
                        if (info.IsSimAProgenitor(simDesc.SimDescriptionId) || info.IsSimAnAncestor(simDesc.SimDescriptionId))
                        {
                            return true;
                        }
                    }

                    Common.StringBuilder msg = new Common.StringBuilder("FutureDescendantHouseholdInfo");
                    msg += Common.NewLine + simDesc.FullName;

                    FutureDescendantService.FutureDescendantHouseholdInfo item = new FutureDescendantService.FutureDescendantHouseholdInfo();

                    List<SimDescription> tests = new List<SimDescription>();

                    try
                    {
                        tests.Add(simDesc);

                        item.AddProgenitorSim(simDesc.SimDescriptionId);

                        SimDescription mate = simDesc.Partner;
                        if (mate == null)
                        {
                            mate = GetPotentialMate(simDesc, tests, true);
                            if (mate == null)
                            {
                                mate = GetPotentialMate(simDesc, tests, false);
                                if (mate == null)
                                {
                                    msg += Common.NewLine + "Fail";
                                    return false;
                                }
                            }
                        }

                        msg += Common.NewLine + mate.FullName;

                        tests.Add(mate);

                        item.AddProgenitorSim(mate.SimDescriptionId);

                        SimDescription inLaw = GetPotentialInLaw(simDesc, mate, tests, true);
                        if (inLaw == null)
                        {
                            inLaw = GetPotentialInLaw(simDesc, mate, tests, false);
                            if (inLaw == null)
                            {
                                msg += Common.NewLine + "Fail";
                                return false;
                            }
                        }

                        msg += Common.NewLine + inLaw.FullName;

                        tests.Add(inLaw);

                        item.AddProgenitorSim(inLaw.SimDescriptionId);

                        mate = inLaw.Partner;
                        if (mate == null)
                        {
                            mate = GetPotentialMate(inLaw, tests, true);
                            if (mate == null)
                            {
                                mate = GetPotentialMate(inLaw, tests, false);
                                if (mate == null)
                                {
                                    msg += Common.NewLine + "Fail";
                                    return false;
                                }
                            }
                        }

                        msg += Common.NewLine + mate.FullName;

                        item.AddProgenitorSim(mate.SimDescriptionId);

                        if (item.mProgenitorSimIds.Count != 4)
                        {
                            msg += Common.NewLine + "Fail";
                            return false;
                        }
                    }
                    finally
                    {
                        Common.DebugWriteLog(msg);
                    }

                    FutureDescendantService.sPersistableData.ActiveDescendantHouseholdsInfo.Add(item);
                }
                return true;
            }
            catch (Exception e)
            {
                Common.Exception(simDesc, e);
                return false;
            }
        }
Ejemplo n.º 5
0
        public static Household Instantiate(FutureDescendantService.FutureDescendantHouseholdInfo ths)
        {
            ulong mom1ID = ths.mProgenitorSimIds[0];
            ulong dad1ID = 0;

            // these don't even appear to be being used??
            ulong mom2ID = 0;
            ulong dad2ID = 0;

            if (ths.mProgenitorSimIds.Count >= 2)
            {
                dad1ID = ths.mProgenitorSimIds[1];

                if (ths.mProgenitorSimIds.Count >= 3)
                {
                    mom2ID = ths.mProgenitorSimIds[2];

                    if (ths.mProgenitorSimIds.Count >= 4)
                    {
                        dad2ID = ths.mProgenitorSimIds[3];
                    }
                }
            }

            Household household = ths.DescendantHousehold;

            int currentDesiredHouseholdSize = ths.mCurrentDesiredHouseholdSize;

            if (household != null)
            {
                currentDesiredHouseholdSize -= household.NumMembers;
            }

            if (currentDesiredHouseholdSize <= 0x0)
            {
                return(null);
            }

            if (household == null)
            {
                household = Household.Create();
            }

            List <SimDescription> potentialParents = new List <SimDescription>();
            string familyName = null;

            CASAgeGenderFlags age = CASAgeGenderFlags.YoungAdult | CASAgeGenderFlags.Adult;

            if (RandomUtil.RandomChance(FutureDescendantService.kPercentChanceOfElderlyHousehold))
            {
                age = CASAgeGenderFlags.Elder;
            }

            List <SimDescription> dispose = new List <SimDescription>();

            if (currentDesiredHouseholdSize > 0x0)
            {
                SimDescription mom = CreateDescendant(mom1ID, dad1ID, household, age, CASAgeGenderFlags.Female | CASAgeGenderFlags.Male);
                if (mom == null)
                {
                    return(null);
                }

                potentialParents.Add(mom);
                ths.mHouseholdMembers.Add(mom.SimDescriptionId);
                currentDesiredHouseholdSize--;
                familyName = mom.LastName;
            }

            if (currentDesiredHouseholdSize > 0x0)
            {
                bool disposeSpouse = false;

                Household spouseHouse = household;
                if (RandomUtil.RandomChance(FutureDescendantService.kPercentChanceOfSingleParentHousehold))
                {
                    spouseHouse   = Household.TouristHousehold;
                    disposeSpouse = true;
                }

                CASAgeGenderFlags gender = potentialParents[0].Gender;
                if (!RandomUtil.RandomChance(FutureDescendantService.kPercentChanceOfSameSexHousehold))
                {
                    gender = (potentialParents[0].Gender == CASAgeGenderFlags.Male) ? CASAgeGenderFlags.Female : CASAgeGenderFlags.Male;
                }

                SimDescription dad = CreateDescendant(mom1ID, dad1ID, spouseHouse, potentialParents[0].Age, gender);
                if (dad == null)
                {
                    return(null);
                }

                if (disposeSpouse)
                {
                    dispose.Add(dad);
                }
                else
                {
                    ths.mHouseholdMembers.Add(dad.SimDescriptionId);
                    currentDesiredHouseholdSize--;
                }

                potentialParents.Add(dad);
            }

            while (currentDesiredHouseholdSize > 0x0)
            {
                bool           noParents;
                SimDescription child = GenerateOffspring(potentialParents, out noParents);
                if (child != null)
                {
                    household.Add(child);
                    ths.mHouseholdMembers.Add(child.SimDescriptionId);
                }

                currentDesiredHouseholdSize--;
            }

            SimUtils.HouseholdCreationSpec.UpdateHouseholdLTR(ref household, familyName, false);
            ths.mHouseholdName = FutureDescendantService.LocalizeString(false, "DescendantHouseholdId", new object[] { familyName });
            household.Name     = ths.mHouseholdName;
            ths.mHouseholdId   = household.HouseholdId;

            foreach (SimDescription sim in dispose)
            {
                sim.Dispose(true, true, true);
            }

            return(household);
        }
Ejemplo n.º 6
0
        public static void PostFutureWorldLoadProcess(FutureDescendantService ths)
        {
            Common.StringBuilder msg = new Common.StringBuilder("PostFutureWorldLoadProcess");

            TransitionSettings();

            if (Traveler.Settings.mDisableDescendants)
            {
                msg += Common.NewLine + "Disabled, returning";
                Common.DebugWriteLog(msg);
                ths.RemoveInactiveDescendantHouseholds();
                return;
            }

            try
            {
                ths.PostWorldLoadFixupOfHouseholds();

                // Custom
                ProcessDescendantHouseholds(ths);

                ths.BuildAvailableLotLists();

                foreach (SimDescription description in GameStates.TravelHousehold.SimDescriptions)
                {
                    ths.RemoveDescendantMapTags(description.SimDescriptionId);
                }

                List <FutureDescendantService.FutureDescendantHouseholdInfo> remove = new List <FutureDescendantService.FutureDescendantHouseholdInfo>();
                for (int i = 0x0; i < FutureDescendantService.sPersistableData.ActiveDescendantHouseholdsInfo.Count; i++)
                {
                    bool flag = true;
                    FutureDescendantService.FutureDescendantHouseholdInfo household = FutureDescendantService.sPersistableData.ActiveDescendantHouseholdsInfo[i];
                    if (household.DoesHouseholdLotRequireUpdate())
                    {
                        msg += Common.NewLine + "DoesHouseholdLotRequireUpdate = true";
                        flag = ths.UpdateHouseholdHomeLot(ref household);
                        if (!flag)
                        {
                            msg += Common.NewLine + "UpdateHouseholdHomeLot returned false... removing household " + household.mHouseholdName;
                            remove.Add(household);
                        }
                    }

                    if (flag)
                    {
                        msg += Common.NewLine + "UpdateHouseholdHomeLot returned true";
                        household.UpdateHouseholdRelationship();
                        household.SetupDescendantAlarm();
                        FixupOccults(ths, household);
                        ths.UpdateHouseholdMapTags(household.mAncestorsSimIds, household.DescendantHousehold);
                    }
                }

                foreach (FutureDescendantService.FutureDescendantHouseholdInfo info2 in remove)
                {
                    FutureDescendantService.sPersistableData.ActiveDescendantHouseholdsInfo.Remove(info2);
                    foreach (List <FutureDescendantService.FutureDescendantHouseholdInfo> list2 in FutureDescendantService.sPersistableData.DescendantHouseholdsMap.Values)
                    {
                        if (list2.Contains(info2))
                        {
                            list2.Remove(info2);
                        }
                    }
                    msg += Common.NewLine + "Successfully invalidated " + info2.mHouseholdName;
                    FutureDescendantService.sPersistableData.InvalidDescendantHouseholdsInfo.Add(info2);
                }
                ths.CleanupdAvailableLotLists();
                ths.RemoveInactiveDescendantHouseholds();

                new Common.AlarmTask(20, TimeUnit.Minutes, PackupMinis);
            }
            catch (Exception e)
            {
                Common.Exception("PostFutureWorldLoadProcess", e);
            }
            finally
            {
                Common.DebugWriteLog(msg);
            }
        }
Ejemplo n.º 7
0
        public static void FixupOccults(FutureDescendantService ths, FutureDescendantService.FutureDescendantHouseholdInfo descendantHouseholdInfo)
        {
            Common.StringBuilder msg = new Common.StringBuilder("FixupOccults");

            if (descendantHouseholdInfo == null)
            {
                msg += Common.NewLine + "descendantHouseholdInfo null";
            }

            if (descendantHouseholdInfo.DescendantHousehold == null)
            {
                msg += Common.NewLine + "descendantHouseholdInfo.DescendantHousehold null";
            }

            if (!descendantHouseholdInfo.mFutureDescendantHouseholdInfoDirty)
            {
                msg += Common.NewLine + "mFutureDescendantHosueholdInfoDirty is false";
            }

            if (Traveler.Settings.mChanceOfOccultHybrid == 0)
            {
                msg += Common.NewLine + "Hybrid 0, returning";
                Common.DebugWriteLog(msg);
                ths.FixupOccults(descendantHouseholdInfo);
                return;
            }

            try
            {
                if (((descendantHouseholdInfo != null) && descendantHouseholdInfo.mFutureDescendantHouseholdInfoDirty) && (descendantHouseholdInfo.DescendantHousehold != null))
                {
                    descendantHouseholdInfo.mFutureDescendantHouseholdInfoDirty = false;
                    List <OccultTypes> list  = null;
                    float minAlienPercentage = 0f;
                    float maxAlienPercentage = 0f;
                    if (descendantHouseholdInfo.mProgenitorSimIds != null)
                    {
                        foreach (ulong num in descendantHouseholdInfo.mProgenitorSimIds)
                        {
                            SimDescription item     = null;
                            bool           unpacked = false;
                            msg += Common.NewLine + "Num: " + num;
                            item = FutureDescendantHouseholdInfoEx.CreateProgenitor(num, out unpacked);

                            if (CrossWorldControl.sRetention.transitionedOccults.ContainsKey(num))
                            {
                                list = CrossWorldControl.sRetention.transitionedOccults[num];
                            }
                            else
                            {
                                msg += Common.NewLine + "Couldn't find Sim in transitionedOccults (Maybe they had none?)";
                            }

                            if (item != null)
                            {
                                // EA appears to transition this... I hope :)
                                msg += Common.NewLine + "Working on " + item.FullName;
                                if (SimTypes.IsServiceAlien(item))
                                {
                                    msg += Common.NewLine + "Is full blood Alien";
                                    maxAlienPercentage = 1f;
                                }
                                else
                                {
                                    msg += Common.NewLine + "Died (2)";
                                    if (item.AlienDNAPercentage == 0 && item.IsAlien)
                                    {
                                        msg += Common.NewLine + "IsAlien";
                                        minAlienPercentage = 0;
                                        maxAlienPercentage = 1;
                                    }
                                    else
                                    {
                                        if (item.AlienDNAPercentage > maxAlienPercentage)
                                        {
                                            maxAlienPercentage = item.mAlienDNAPercentage;
                                        }
                                        else if (item.AlienDNAPercentage > minAlienPercentage)
                                        {
                                            minAlienPercentage = item.mAlienDNAPercentage;
                                        }
                                    }
                                }
                            }
                            else
                            {
                                msg += Common.NewLine + "Failed to find SimDesc";
                            }
                        }
                    }

                    if (descendantHouseholdInfo.mHouseholdMembers != null)
                    {
                        foreach (ulong num3 in descendantHouseholdInfo.mHouseholdMembers)
                        {
                            SimDescription newSim = SimDescription.Find(num3);
                            if (newSim != null && !newSim.IsDead)
                            {
                                msg += Common.NewLine + "Processing: " + newSim.FullName;
                                if (Traveler.Settings.mChanceOfOccultMutation == 0)
                                {
                                    msg += Common.NewLine + "Occult Mutation 0";
                                    List <OccultTypes> descendantOccults = OccultTypeHelper.CreateList(newSim, true);
                                    foreach (OccultTypes type in descendantOccults)
                                    {
                                        if (list == null || !list.Contains(type))
                                        {
                                            OccultTypeHelper.Remove(newSim, type, true);
                                        }
                                    }
                                }

                                if (list != null && list.Count > 0)
                                {
                                    msg += Common.NewLine + "Applying Occult Chance to " + newSim.FullName;
                                    bool success = FutureDescendantHouseholdInfoEx.ApplyOccultChance(newSim, list, Traveler.Settings.mChanceOfOccultHybrid, Traveler.Settings.mChanceOfOccultMutation, Traveler.Settings.mMaxOccult);
                                    if (success)
                                    {
                                        msg += Common.NewLine + "Added occults";
                                    }
                                }
                                else
                                {
                                    msg += Common.NewLine + "No occults found...";
                                }

                                if (minAlienPercentage > 0 || maxAlienPercentage > 0 && RandomUtil.CoinFlip())
                                {
                                    float percent = (minAlienPercentage + maxAlienPercentage) / 2f;
                                    float jitter  = SimDescription.kAlienDNAJitterPercent * 2; // 2 generations have passed considering Travelers approach to descendants
                                    percent = RandomUtil.GetFloat(-jitter, jitter);
                                    newSim.SetAlienDNAPercentage(MathUtils.Clamp(percent, 0f, 1f));

                                    msg += Common.NewLine + "Made alien. Percent: " + newSim.mAlienDNAPercentage;
                                }
                            }
                            else
                            {
                                msg += Common.NewLine + "New Sim was null.";
                            }
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Common.Exception("", e);
            }
            finally
            {
                Common.DebugWriteLog(msg);
            }
        }
Ejemplo n.º 8
0
        private static bool ProcessDescendantHouseholds(FutureDescendantService ths)
        {
            Common.StringBuilder msg = new Common.StringBuilder("ProcessDescendantHouseholds");

            for (int i = 0x0; i < FutureDescendantService.sPersistableData.ActiveDescendantHouseholdsInfo.Count; i++)
            {
                try
                {
                    FutureDescendantService.FutureDescendantHouseholdInfo info = FutureDescendantService.sPersistableData.ActiveDescendantHouseholdsInfo[i];
                    Household descendantHousehold = info.DescendantHousehold;
                    if (descendantHousehold != null)
                    {
                        if (Household.ActiveHousehold != null && info.HasAncestorFromHousehold(Household.ActiveHousehold))
                        {
                            msg += Common.NewLine + "descendantHousehold is not null.";
                            while (descendantHousehold.NumMembers > info.mCurrentDesiredHouseholdSize)
                            {
                                msg += Common.NewLine + "Removing descendant because the current size (" + descendantHousehold.NumMembers + ") is greater than the desired (" + info.mCurrentDesiredHouseholdSize + ")";
                                info.RemoveDescendant();
                            }

                            while (descendantHousehold.NumMembers < info.mCurrentDesiredHouseholdSize)
                            {
                                msg += Common.NewLine + "Adding descendant because the current size (" + descendantHousehold.NumMembers + ") is less  than the desired (" + info.mCurrentDesiredHouseholdSize + ")";
                                // Custom
                                if (!FutureDescendantHouseholdInfoEx.CreateAndAddDescendant(info))
                                {
                                    break;
                                }
                            }

                            foreach (ulong num2 in Household.mDirtyNameSimIds)
                            {
                                if (info.IsSimAProgenitor(num2))
                                {
                                    SimDescription description = SimDescription.Find(num2);
                                    if (description != null)
                                    {
                                        foreach (SimDescription description2 in info.DescendantHousehold.SimDescriptions)
                                        {
                                            description2.LastName = description.LastName;
                                        }
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        msg += Common.NewLine + "descendantHousehold is null so instatiating a new one.";
                        // Custom
                        Household household2 = FutureDescendantHouseholdInfoEx.Instantiate(info);
                        FutureDescendantService.sPersistableData.ActiveDescendantHouseholdsInfo[i].mFutureDescendantHouseholdInfoDirty = true;
                        if (household2 == null)
                        {
                            msg += Common.NewLine + "NULL";
                        }
                    }
                }
                catch (Exception e)
                {
                    Common.Exception(i.ToString(), e);
                }
                finally
                {
                    Common.DebugWriteLog(msg);
                }
            }
            Household.ClearDirtyNameSimIDs();
            return(true);
        }
Ejemplo n.º 9
0
        private static bool ProcessSim(FutureDescendantService ths, SimDescription simDesc)
        {
            try
            {
                if (FutureDescendantService.sPersistableData == null)
                {
                    return(false);
                }
                else if (simDesc == null)
                {
                    return(false);
                }
                else if (Household.ActiveHousehold != simDesc.Household)
                {
                    return(false);
                }
                else if ((Household.RoommateManager != null) && Household.RoommateManager.IsNPCRoommate(simDesc))
                {
                    return(false);
                }
                else if (simDesc.IsRobot)
                {
                    return(false);
                }
                else if (simDesc.Genealogy == null)
                {
                    return(false);
                }

                List <SimDescription> children = Relationships.GetChildren(simDesc);
                bool processed = false;
                if ((children != null) && (children.Count > 0x0))
                {
                    foreach (SimDescription child in children)
                    {
                        processed |= ProcessSim(ths, child);
                    }
                }

                if (!processed)
                {
                    foreach (FutureDescendantService.FutureDescendantHouseholdInfo info in FutureDescendantService.sPersistableData.ActiveDescendantHouseholdsInfo)
                    {
                        if (info.IsSimAProgenitor(simDesc.SimDescriptionId) || info.IsSimAnAncestor(simDesc.SimDescriptionId))
                        {
                            return(true);
                        }
                    }

                    Common.StringBuilder msg = new Common.StringBuilder("FutureDescendantHouseholdInfo");
                    msg += Common.NewLine + simDesc.FullName;

                    FutureDescendantService.FutureDescendantHouseholdInfo item = new FutureDescendantService.FutureDescendantHouseholdInfo();

                    List <SimDescription> tests = new List <SimDescription>();

                    try
                    {
                        tests.Add(simDesc);

                        item.AddProgenitorSim(simDesc.SimDescriptionId);

                        SimDescription mate = simDesc.Partner;
                        if (mate == null)
                        {
                            mate = GetPotentialMate(simDesc, tests, true);
                            if (mate == null)
                            {
                                mate = GetPotentialMate(simDesc, tests, false);
                                if (mate == null)
                                {
                                    msg += Common.NewLine + "Fail";
                                    return(false);
                                }
                            }
                        }

                        msg += Common.NewLine + mate.FullName;

                        tests.Add(mate);

                        item.AddProgenitorSim(mate.SimDescriptionId);

                        SimDescription inLaw = GetPotentialInLaw(simDesc, mate, tests, true);
                        if (inLaw == null)
                        {
                            inLaw = GetPotentialInLaw(simDesc, mate, tests, false);
                            if (inLaw == null)
                            {
                                msg += Common.NewLine + "Fail";
                                return(false);
                            }
                        }

                        msg += Common.NewLine + inLaw.FullName;

                        tests.Add(inLaw);

                        item.AddProgenitorSim(inLaw.SimDescriptionId);

                        mate = inLaw.Partner;
                        if (mate == null)
                        {
                            mate = GetPotentialMate(inLaw, tests, true);
                            if (mate == null)
                            {
                                mate = GetPotentialMate(inLaw, tests, false);
                                if (mate == null)
                                {
                                    msg += Common.NewLine + "Fail";
                                    return(false);
                                }
                            }
                        }

                        msg += Common.NewLine + mate.FullName;

                        item.AddProgenitorSim(mate.SimDescriptionId);

                        if (item.mProgenitorSimIds.Count != 4)
                        {
                            msg += Common.NewLine + "Fail";
                            return(false);
                        }
                    }
                    finally
                    {
                        Common.DebugWriteLog(msg);
                    }

                    FutureDescendantService.sPersistableData.ActiveDescendantHouseholdsInfo.Add(item);
                }
                return(true);
            }
            catch (Exception e)
            {
                Common.Exception(simDesc, e);
                return(false);
            }
        }