Beispiel #1
0
        public static void RegenerateDescendants()
        {
            if (!GameUtils.IsFutureWorld() || Traveler.Settings.mDisableDescendants)
            {
                return;
            }

            try
            {
                OccultProcessed.Clear();

                foreach (FutureDescendantService.FutureDescendantHouseholdInfo info in FutureDescendantService.sPersistableData.ActiveDescendantHouseholdsInfo)
                {
                    if (info.HasAncestorFromHousehold(Household.ActiveHousehold) && info.DescendantHousehold != null)
                    {
                        Annihilation.Cleanse(info.DescendantHousehold);
                    }
                }

                PostFutureWorldLoadProcess(GetInstance());
            }
            catch (Exception e)
            {
                Common.Exception("RegenerateDescendants", e);
            }
        }
Beispiel #2
0
        protected override bool Run(MiniSimDescription me, bool singleSelection)
        {
            if (!Prompt(me))
            {
                return(false);
            }

            Annihilation.Cleanse(me);
            return(true);
        }
Beispiel #3
0
        public static void WipeDescendants()
        {
            if (FutureDescendantService.sPersistableData == null)
            {
                return;
            }

            if (Household.ActiveHousehold == null)
            {
                return;
            }

            foreach (FutureDescendantService.FutureDescendantHouseholdInfo info in FutureDescendantService.sPersistableData.ActiveDescendantHouseholdsInfo)
            {
                if (info.HasAncestorFromHousehold(Household.ActiveHousehold))
                {
                    FutureDescendantService.sPersistableData.InvalidDescendantHouseholdsInfo.Add(info);

                    if (info.DescendantHousehold != null && !GameUtils.IsFutureWorld())
                    {
                        foreach (ulong id in info.mHouseholdMembers)
                        {
                            MiniSimDescription mini = MiniSims.Find(id);
                            if (mini != null)
                            {
                                foreach (SimDescription desc in Household.ActiveHousehold.AllSimDescriptions)
                                {
                                    mini.RemoveMiniRelatioship(desc.SimDescriptionId);
                                }
                            }
                        }
                    }

                    if (info.DescendantHousehold != null && GameUtils.IsFutureWorld())
                    {
                        Annihilation.Cleanse(info.DescendantHousehold);
                    }
                }
            }

            foreach (FutureDescendantService.FutureDescendantHouseholdInfo info in FutureDescendantService.sPersistableData.InvalidDescendantHouseholdsInfo)
            {
                FutureDescendantService.sPersistableData.ActiveDescendantHouseholdsInfo.Remove(info);
            }

            if (GameUtils.IsFutureWorld())
            {
                // will axe map tags
                GetInstance().RemoveInactiveDescendantHouseholds();
            }
        }
        public override void OnDelayedWorldLoadFinished()
        {
            Overwatch.Log("CleanupFakeMetaAutonomy");

            if (FakeMetaAutonomy.mToDestroy != null)
            {
                foreach (SimDescription sim in new List <SimDescription>(FakeMetaAutonomy.mToDestroy))
                {
                    if (Annihilation.Cleanse(sim))
                    {
                        Overwatch.Log("Destroyed: " + sim.FullName);

                        FakeMetaAutonomy.mToDestroy.Remove(sim);
                    }
                }
            }

            if ((FakeMetaAutonomy.Instance != null) && (FakeMetaAutonomy.Instance.mPool != null))
            {
                int index = 0;
                while (index < FakeMetaAutonomy.Instance.mPool.Count)
                {
                    SimDescription sim = FakeMetaAutonomy.Instance.mPool[index];

                    bool keep = true;
                    if (sim == null)
                    {
                        keep = false;
                    }
                    else if (sim.Genealogy == null)
                    {
                        keep = false;
                    }

                    if (keep)
                    {
                        index++;
                    }
                    else
                    {
                        Overwatch.Log("Removed: " + sim.FullName);

                        FakeMetaAutonomy.Instance.mPool.RemoveAt(index);
                    }
                }
            }
        }
Beispiel #5
0
        protected override void PrivatePerformAction(bool prompt)
        {
            try
            {
                Overwatch.Log("Kill All Homeless");

                if ((!prompt) || (AcceptCancelDialog.Show(Common.Localize("KillAllHomeless:Prompt"))))
                {
                    List <Household> list = new List <Household>();
                    int iSimCount         = 0;

                    foreach (Household household in Household.sHouseholdList)
                    {
                        if (household.IsSpecialHousehold)
                        {
                            continue;
                        }

                        if (household.InWorld)
                        {
                            continue;
                        }

                        if (Households.IsPassport(household))
                        {
                            continue;
                        }

                        if (Households.IsRole(household))
                        {
                            continue;
                        }

                        if (Households.IsLunarCycleZombie(household))
                        {
                            continue;
                        }

                        if (Households.IsActiveDaycare(household))
                        {
                            continue;
                        }

                        iSimCount += Households.NumSims(household);
                        list.Add(household);
                    }

                    foreach (Household household in list)
                    {
                        Annihilation.Cleanse(household);
                    }

                    if (iSimCount > 0)
                    {
                        Overwatch.AlarmNotify(Common.Localize("KillAllHomeless:Success", false, new object[] { iSimCount }));
                    }
                }
            }
            catch (Exception exception)
            {
                Common.Exception(Name, exception);
            }
        }
Beispiel #6
0
            protected override void OnPerform()
            {
                int roomId = 0;
                Lot lot    = null;

                if (mTarget.CreatedSim != null)
                {
                    Vector3 location = mTarget.CreatedSim.PositionOnFloor;

                    lot    = mTarget.CreatedSim.LotCurrent;
                    roomId = mTarget.CreatedSim.RoomId;

                    List <GnomeData> gnomes = new List <GnomeData>();

                    if (mTarget.TraitManager.HasElement(TraitNames.CultureChina))
                    {
                        gnomes.Add(new GnomeData(0x000000000098977D, ProductVersion.EP1));
                    }
                    else if ((mTarget.TraitManager.HasElement(TraitNames.CultureEgypt)) || (mTarget.IsMummy))
                    {
                        gnomes.Add(new GnomeData(0x000000000098977C, ProductVersion.EP1));
                    }
                    else if (mTarget.TraitManager.HasElement(TraitNames.CultureFrance))
                    {
                        gnomes.Add(new GnomeData(0x000000000098977E, ProductVersion.EP1));
                    }
                    else if (mTarget.IsVampire)
                    {
                        gnomes.Add(new GnomeData(0x000000000098A1C2, ProductVersion.EP3));
                    }
                    else if (mTarget.IsFrankenstein)
                    {
                        gnomes.Add(new GnomeData(0x0000000000989CD9, ProductVersion.EP2));
                    }
                    else if ((mTarget.IsCelebrity) || (mTarget.AssignedRole is RolePaparazzi))
                    {
                        gnomes.Add(new GnomeData(0x000000000098A1C4, ProductVersion.EP3));
                    }
                    else if (mTarget.Occupation is MagicianCareer)
                    {
                        gnomes.Add(new GnomeData(0x000000000098D215, ProductVersion.EP6)); // Magician
                    }
                    else if (mTarget.Occupation is SingerCareer)
                    {
                        gnomes.Add(new GnomeData(0x000000000098D214, ProductVersion.EP6)); // Singer
                    }
                    else if (mTarget.IsCat)
                    {
                        gnomes.Add(new GnomeData(0x000000000098AAD6, ProductVersion.EP5)); // Pet Cat
                    }
                    else if (mTarget.IsADogSpecies)
                    {
                        gnomes.Add(new GnomeData(0x000000000098AAD5, ProductVersion.EP5)); // Pet Dog
                    }
                    else if (mTarget.IsHorse)
                    {
                        gnomes.Add(new GnomeData(0x000000000098AAD4, ProductVersion.EP5)); // Pet Horse
                    }
                    else
                    {
                        gnomes.Add(new GnomeData(0x000000000000058B, ProductVersion.BaseGame)); // Normal

                        if (GameUtils.IsInstalled(ProductVersion.EP1))
                        {
                            gnomes.Add(new GnomeData(0x000000000098977D, ProductVersion.EP1)); // China
                            gnomes.Add(new GnomeData(0x000000000098977C, ProductVersion.EP1)); // Egypt
                            gnomes.Add(new GnomeData(0x000000000098977E, ProductVersion.EP1)); // France
                        }

                        if (GameUtils.IsInstalled(ProductVersion.EP2))
                        {
                            gnomes.Add(new GnomeData(0x0000000000989EEC, ProductVersion.EP2)); // Caveman
                            gnomes.Add(new GnomeData(0x0000000000989CD9, ProductVersion.EP2)); // Inventor
                            gnomes.Add(new GnomeData(0x0000000000989EDF, ProductVersion.EP2)); // Laundry
                            gnomes.Add(new GnomeData(0x0000000000989CF2, ProductVersion.EP2)); // Sculptor
                        }

                        if (GameUtils.IsInstalled(ProductVersion.EP3))
                        {
                            gnomes.Add(new GnomeData(0x000000000098A1C4, ProductVersion.EP3)); // Celebrity
                            gnomes.Add(new GnomeData(0x000000000098A1C2, ProductVersion.EP3)); // Vampire
                        }

                        if (GameUtils.IsInstalled(ProductVersion.EP5))
                        {
                            gnomes.Add(new GnomeData(0x000000000098AEB1, ProductVersion.EP5)); // Freezer Bunny
                            gnomes.Add(new GnomeData(0x000000000098AAD6, ProductVersion.EP5)); // Pet Cat
                            gnomes.Add(new GnomeData(0x000000000098AAD5, ProductVersion.EP5)); // Pet Dog
                            gnomes.Add(new GnomeData(0x000000000098AAD4, ProductVersion.EP5)); // Pet Horse
                        }

                        if (GameUtils.IsInstalled(ProductVersion.EP6))
                        {
                            gnomes.Add(new GnomeData(0x000000000098D215, ProductVersion.EP6)); // Magician
                            gnomes.Add(new GnomeData(0x000000000098D214, ProductVersion.EP6)); // Singer
                        }
                    }

                    if (gnomes.Count > 0)
                    {
                        GnomeData preferred = RandomUtil.GetRandomObjectFromList(gnomes);

                        MagicGnomeBase gnome = ObjectCreation.CreateObject(preferred.mInstance, preferred.mVersion, null) as MagicGnomeBase;
                        if (gnome != null)
                        {
                            NameComponent name = gnome.GetComponent <NameComponent>();
                            if (name != null)
                            {
                                name.mName = mTarget.FullName;
                            }

                            gnome.SetPosition(location);
                            gnome.AddToWorld();
                        }
                    }
                }

                Genealogy genealogy = mTarget.CASGenealogy as Genealogy;

                if (genealogy != null)
                {
                    genealogy.ClearAllGenealogyInformation();
                }

                foreach (SimDescription other in SimDescription.GetSimDescriptionsInWorld())
                {
                    MiniSimDescription miniOther = MiniSimDescription.Find(other.SimDescriptionId);
                    if (miniOther == null)
                    {
                        continue;
                    }

                    miniOther.RemoveMiniRelatioship(mTarget.SimDescriptionId);
                }

                Annihilation.RemoveMSD(mTarget.SimDescriptionId);

                Relationship.RemoveSimDescriptionRelationships(mTarget);

                Urnstone urnstone = Urnstone.FindGhostsGrave(mTarget);

                if (urnstone != null)
                {
                    if ((urnstone.InInventory) && (urnstone.Parent != null) && (urnstone.Parent.Inventory != null))
                    {
                        urnstone.Parent.Inventory.RemoveByForce(urnstone);
                    }

                    urnstone.DestroyGrave();

                    try
                    {
                        urnstone.Dispose();
                    }
                    catch
                    { }
                }

                try
                {
                    mTarget.Dispose();

                    Assassination skill = Assassination.EnsureSkill(mActor);
                    if (skill != null)
                    {
                        skill.AddPotentialKill(mTarget, true);

                        bool witnessed = false;

                        if (lot != null)
                        {
                            witnessed = Assassination.WasWitnessed(lot, roomId, mActor.SimDescription, mTarget, new List <Sim>());
                        }

                        skill.AddActualKill(mTarget, false, witnessed);
                    }
                }
                catch
                { }
            }
Beispiel #7
0
        public static bool AttemptServiceDisposal(SimDescription sim, bool oldAge, string reason)
        {
            if (sim == null)
            {
                return(false);
            }

            bool hasChildren = (Relationships.GetChildren(sim).Count > 0);

            if (!oldAge)
            {
                if (hasChildren)
                {
                    return(false);
                }

                if ((sim.IsHuman) && (sim.TeenOrAbove))
                {
                    bool found = false;
                    foreach (SimDescription other in Households.Humans(sim.Household))
                    {
                        if (other == sim)
                        {
                            continue;
                        }

                        if (other.TeenOrAbove)
                        {
                            found = true;
                            break;
                        }
                    }

                    if (!found)
                    {
                        return(false);
                    }
                }

                foreach (Household house in Household.GetHouseholdsLivingInWorld())
                {
                    if (Notifications.HasSignificantRelationship(house, sim))
                    {
                        return(false);
                    }
                }
            }

            if (hasChildren)
            {
                if (!Annihilation.Perform(sim, false))
                {
                    return(false);
                }

                if (Common.kDebugging)
                {
                    Common.DebugNotify("Disposed: " + sim.FullName + " (" + sim.Species + ")" + Common.NewLine + reason);
                }
            }
            else
            {
                if (!Annihilation.Cleanse(sim))
                {
                    return(false);
                }

                if (Common.kDebugging)
                {
                    Common.DebugNotify("Cleansed: " + sim.FullName + " (" + sim.Species + ")" + Common.NewLine + reason);
                }
            }

            return(true);
        }
Beispiel #8
0
 protected override bool Run(MiniSimDescription me, bool singleSelection)
 {
     return(Annihilation.Cleanse(me));
 }
Beispiel #9
0
        protected void CleanupMiniSims(Dictionary <ulong, IMiniSimDescription> existingSims)
        {
            if (MiniSimDescription.sMiniSims == null)
            {
                return;
            }

            List <MiniSimDescription> miniSims = new List <MiniSimDescription>(MiniSimDescription.sMiniSims.Values);

            foreach (MiniSimDescription miniSim in miniSims)
            {
                try
                {
                    if (miniSim == null)
                    {
                        continue;
                    }

                    if (miniSim.mTraits == null)
                    {
                        // Correction for a reported script error
                        miniSim.mTraits = new List <TraitNames>();
                    }

                    IMiniSimDescription existingSim = null;

                    string reason = null;

                    if (!existingSims.TryGetValue(miniSim.SimDescriptionId, out existingSim))
                    {
                        reason = "No Exist Mini Sim Removed: " + Relationships.GetFullName(miniSim);
                    }
                    else
                    {
                        miniSim.mFirstName = existingSim.FirstName;
                        miniSim.mLastName  = existingSim.LastName;

                        string name = miniSim.FullName;
                        if ((name == null) || (string.IsNullOrEmpty(name.Trim())))
                        {
                            reason = "No Name Mini Sim Removed: " + Relationships.GetFullName(miniSim);
                        }
                        else if (existingSim is MiniSimDescription)
                        {
                            bool found = false;

                            if (miniSim.mHomeLotId != 0)
                            {
                                //Overwatch.Log(" " + Relationships.GetFullName(miniSim) + " HomeLotId Save");

                                found = true;
                            }
                            else if (!string.IsNullOrEmpty(miniSim.JobOrServiceName))
                            {
                                //Overwatch.Log(" " + Relationships.GetFullName(miniSim) + " JobOrServiceName Save");

                                found = true;
                            }
                            else if ((miniSim.MiniRelationships != null) && (miniSim.mMiniRelationships.Count > 0))
                            {
                                //Overwatch.Log(" " + Relationships.GetFullName(miniSim) + " Relation Save");

                                found = true;
                            }
                            else if (miniSim.Genealogy != null)
                            {
                                if ((miniSim.Genealogy.Spouse != null) || (miniSim.Genealogy.Children.Count > 0) || (miniSim.Genealogy.Parents.Count > 0) || (miniSim.Genealogy.Siblings.Count > 0))
                                {
                                    //Overwatch.Log(" " + Relationships.GetFullName(miniSim) + " Genealogy Save");

                                    found = true;
                                }
                            }

                            if (!found)
                            {
                                reason = "No Relation Mini Sim Removed: " + Relationships.GetFullName(miniSim);
                            }
                        }

                        if (!string.IsNullOrEmpty(reason))
                        {
                            try
                            {
                                Annihilation.RemoveMSD(miniSim.SimDescriptionId);

                                Overwatch.Log(reason);
                                continue;
                            }
                            catch (Exception e)
                            {
                                Common.DebugException(miniSim.FullName, e);
                            }
                        }
                    }
                }
                catch (Exception e)
                {
                    Common.Exception(miniSim.FullName, e);
                }
            }

            if (!GameStates.IsOnVacation)
            {
                foreach (MiniSimDescription sim in MiniSimDescription.GetVacationWorldSimDescriptions())
                {
                    try
                    {
                        List <MiniRelationship> relations = new List <MiniRelationship>(sim.MiniRelationships);
                        foreach (MiniRelationship relation in relations)
                        {
                            MiniSimDescription other = MiniSimDescription.Find(relation.SimDescriptionId);
                            if (other == null)
                            {
                                continue;
                            }

                            MiniRelationship otherRelation = other.FindMiniRelationship(sim, false);
                            if (otherRelation == null)
                            {
                                Overwatch.Log("Bad MiniRelationship Dropped " + Relationships.GetFullName(sim));

                                sim.mMiniRelationships.Remove(relation);
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        Common.Exception(sim, e);
                    }
                }
            }
        }
Beispiel #10
0
        public static void CustomAnnihilation(SimDescription badSim, SimDescription goodSim)
        {
            if ((badSim == null) || (goodSim == null))
            {
                return;
            }

            if (object.ReferenceEquals(badSim, goodSim))
            {
                return;
            }

            Overwatch.Log("Annihilation: " + Relationships.GetFullName(badSim));

            if (object.ReferenceEquals(goodSim.mMaternityOutfits, badSim.mMaternityOutfits))
            {
                badSim.mMaternityOutfits = new OutfitCategoryMap();
                Overwatch.Log("Doppleganger mMaternityOutfits copy " + Relationships.GetFullName(badSim));
            }

            if (object.ReferenceEquals(goodSim.mOutfits, badSim.mOutfits))
            {
                badSim.mOutfits = new OutfitCategoryMap();
                Overwatch.Log("Doppleganger mOutfits copy " + Relationships.GetFullName(badSim));
            }

            if (object.ReferenceEquals(goodSim.CelebrityManager, badSim.CelebrityManager))
            {
                badSim.CelebrityManager = null;
                Overwatch.Log("Doppleganger CelebrityManager copy " + Relationships.GetFullName(badSim));
            }

            if (object.ReferenceEquals(goodSim.CareerManager, badSim.CareerManager))
            {
                badSim.CareerManager = null;
                Overwatch.Log("Doppleganger CareerManager copy " + Relationships.GetFullName(badSim));
            }

            /*
             * if ((badSim.Household != null) && (object.ReferenceEquals(goodSim.mHousehold, badSim.mHousehold)))
             * {
             *  badSim.mHousehold = null;
             *  Overwatch.Log("Doppleganger mHousehold copy " + GetFullName(badSim));
             * }
             */

            if ((badSim.mPartner != null) && (object.ReferenceEquals(goodSim.mPartner, badSim.mPartner)))
            {
                badSim.mPartner = null;
                Overwatch.Log("Doppleganger mPartner copy " + Relationships.GetFullName(badSim));
            }

            if (object.ReferenceEquals(goodSim.mGenealogy, badSim.mGenealogy))
            {
                badSim.mGenealogy = new Genealogy(badSim);
                Overwatch.Log("Doppleganger mGenealogy copy " + Relationships.GetFullName(badSim));
            }

            if ((badSim.AssignedRole != null) && (object.ReferenceEquals(goodSim.AssignedRole, badSim.AssignedRole)))
            {
                badSim.AssignedRole = null;
                Overwatch.Log("Doppleganger AssignedRole copy " + Relationships.GetFullName(badSim));
            }

            Annihilation.Perform(badSim, true);
        }
Beispiel #11
0
        public bool CleansingKill(SimDescription sim, SimDescription.DeathType deathType, bool cleanse)
        {
            AddTry("CleansingKill");

            if (!GameStates.IsLiveState)
            {
                IncStat("CleansingKill Mode Save");
                return(false);
            }

            string name = sim.FullName;

            if (cleanse)
            {
                Annihilation.CleanseGenealogy(sim);

                SetCleansed(sim);
            }

            bool bSuccess = false;

            Sim createdSim = sim.CreatedSim;

            if (createdSim != null)
            {
                try
                {
                    if (createdSim.InteractionQueue != null)
                    {
                        createdSim.InteractionQueue.CancelAllInteractions();

                        SpeedTrap.Sleep();
                    }

                    if ((deathType != SimDescription.DeathType.None) || (cleanse))
                    {
                        if (createdSim.Kill(deathType))
                        {
                            bSuccess = true;
                        }
                    }
                }
                catch (Exception e)
                {
                    Common.DebugException(createdSim, e);
                }
            }

            if (!bSuccess)
            {
                if (createdSim == PlumbBob.SelectedActor)
                {
                    IntroTutorial.ForceExitTutorial();
                }

                if (Sims == null)
                {
                    AddSuccess("CleansingKill: Destruct Fail");
                    return(false);
                }

                if (!Annihilation.Perform(sim, cleanse))
                {
                    Main.RemoveSim(sim.SimDescriptionId);
                }
                else
                {
                    if (!cleanse)
                    {
                        sim.Dispose(true, false, true);
                    }

                    // Special case to stop HangWithCoworker bounces
                    Careers.RemoveSim(sim.SimDescriptionId);
                }

                bSuccess = true;
            }

            if (bSuccess)
            {
                AddSuccess("CleansingKill: Success");

                IncStat("Killed: " + name, Common.DebugLevel.High);

                return(true);
            }
            else
            {
                return(false);
            }
        }
        public static void RunStatic()
        {
            if (!GameUtils.IsInstalled(ProductVersion.EP11))
            {
                return;
            }

            Overwatch.Log("CleanupFutureDescendantService");

            FutureDescendantService instance = FutureDescendantService.GetInstance();

            if (instance != null)
            {
                List <ulong> removeFromMap        = new List <ulong>();
                List <ulong> simsToPossiblyVanish = new List <ulong>();
                List <ulong> simsToKeep           = new List <ulong>();
                Dictionary <ulong, FutureDescendantService.FutureDescendantHouseholdInfo> houses = new Dictionary <ulong, FutureDescendantService.FutureDescendantHouseholdInfo>();

                foreach (ulong num in FutureDescendantService.sPersistableData.DescendantHouseholdsMap.Keys)
                {
                    bool flag = false;
                    IMiniSimDescription ancestorSim = SimDescription.GetIMiniSimDescription(num);
                    if (ancestorSim == null)
                    {
                        flag = true;
                        removeFromMap.Add(num);
                    }

                    foreach (FutureDescendantService.FutureDescendantHouseholdInfo info in FutureDescendantService.sPersistableData.DescendantHouseholdsMap[num])
                    {
                        Household descendantHousehold = info.DescendantHousehold;

                        if (descendantHousehold != null)
                        {
                            if (!houses.ContainsKey(info.mHouseholdId))
                            {
                                houses.Add(info.mHouseholdId, info);
                            }

                            foreach (SimDescription desc in descendantHousehold.SimDescriptions)
                            {
                                if (flag)
                                {
                                    if (!simsToKeep.Contains(desc.SimDescriptionId))
                                    {
                                        simsToPossiblyVanish.Add(desc.SimDescriptionId);
                                    }
                                }
                                else
                                {
                                    if (simsToPossiblyVanish.Contains(desc.SimDescriptionId))
                                    {
                                        simsToPossiblyVanish.Remove(desc.SimDescriptionId);
                                    }
                                    simsToKeep.Add(desc.SimDescriptionId);
                                }
                            }
                        }
                    }
                }

                foreach (ulong num in removeFromMap)
                {
                    FutureDescendantService.sPersistableData.DescendantHouseholdsMap.Remove(num);

                    Overwatch.Log(" Missing Removed: " + num);
                }

                if (!GameUtils.IsFutureWorld())
                {
                    // because sims can possibly be deleted beyond here and I don't believe you can delete sims who are minisims while in the homeworld?
                    return;
                }
                else
                {
                    // this causes a script error if it deletes Sims while cleanup of relationships is running so let that run and come back in a bit...
                    if (!wasRescheduled)
                    {
                        new Common.AlarmTask(10, TimeUnit.Minutes, RunStatic);
                        wasRescheduled = true;
                        return;
                    }
                }

                Dictionary <ulong, SimDescription> sims = SimListing.GetResidents(false);
                foreach (SimDescription sim in sims.Values)
                {
                    if (sim.TraitManager == null)
                    {
                        continue;
                    }

                    foreach (KeyValuePair <ulong, Trait> trait in sim.TraitManager.mValues)
                    {
                        if ((trait.Value.Guid == TraitNames.DescendantHiddenTrait) && (!simsToKeep.Contains(sim.SimDescriptionId)) && (sim.Household != null && !sim.Household.IsActive))
                        {
                            simsToPossiblyVanish.Add(sim.SimDescriptionId);
                            break;
                        }
                    }
                }

                foreach (ulong desc in simsToPossiblyVanish)
                {
                    IMiniSimDescription mini = SimDescription.GetIMiniSimDescription(desc);
                    if (mini != null)
                    {
                        Annihilation.Cleanse(mini);

                        if (houses.ContainsKey(mini.LotHomeId))
                        {
                            houses[mini.LotHomeId].mHouseholdMembers.Remove(desc);
                        }
                    }

                    Overwatch.Log(" Annihilated: " + mini.FullName);
                }

                FutureDescendantService.sPersistableData.ActiveDescendantHouseholdsInfo = new List <FutureDescendantService.FutureDescendantHouseholdInfo>();
                foreach (KeyValuePair <ulong, FutureDescendantService.FutureDescendantHouseholdInfo> houseInfo in houses)
                {
                    Household house = houseInfo.Value.DescendantHousehold;
                    if ((house != null) && (houseInfo.Value.mHouseholdMembers.Count == 0))
                    {
                        Annihilation.Cleanse(house);
                        Overwatch.Log(" Annihilated household: " + house.Name);
                    }
                    else
                    {
                        FutureDescendantService.sPersistableData.ActiveDescendantHouseholdsInfo.Add(houseInfo.Value);
                    }
                }

                FutureDescendantService.sPersistableData.InvalidDescendantHouseholdsInfo.Clear();
                houses = null;
                simsToPossiblyVanish = null;
                simsToKeep           = null;
            }
        }