Ejemplo n.º 1
0
        public static bool IsCloselyRelated(SimDescription a, SimDescription b, bool thoroughCheck)
        {
            if ((a == null) || (b == null))
            {
                return(false);
            }

            if (a == b)
            {
                return(true);
            }

            if (!SimTypes.IsEquivalentSpecies(a, b))
            {
                return(false);
            }

            if (a.IsRobot)
            {
                return(false);
            }

            if (b.IsRobot)
            {
                return(false);
            }

            if (FutureDescendantService.IsAncestorOf(a, b) || FutureDescendantService.IsAncestorOf(b, a))
            {
                return(true);
            }

            return(IsCloselyRelated(a.Genealogy, b.Genealogy, thoroughCheck));
        }
        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;
        }
Ejemplo n.º 3
0
        public static List <IDescendantHouseholdUiData> GetTimeAlamanacDescendantHouseholdData(FutureDescendantService instance)
        {
            // custom
            BuildDescendantHouseholdSpecs(instance);
            List <IDescendantHouseholdUiData> list = new List <IDescendantHouseholdUiData>();
            List <ulong> remove = new List <ulong>();

            foreach (ulong num in FutureDescendantService.sPersistableData.DescendantHouseholdsMap.Keys)
            {
                // Overwatch does this too but no harm in doing it here too
                if (SimDescription.Find(num) == null && MiniSims.Find(num) == null)
                {
                    remove.Add(num);
                }

                FutureDescendantService.DescendantHouseholdUiData item = new FutureDescendantService.DescendantHouseholdUiData
                {
                    mAncestorSimId = num
                };
                int  householdWealthScore = 0;
                int  numberOfMembers      = 0;
                bool flag = false;
                foreach (FutureDescendantService.FutureDescendantHouseholdInfo info in FutureDescendantService.sPersistableData.DescendantHouseholdsMap[num])
                {
                    if (remove.Contains(num) && info.IsSimAnAncestor(num))
                    {
                        FutureDescendantService.sPersistableData.InvalidDescendantHouseholdsInfo.Add(info);
                        flag = true;
                        continue;
                    }

                    if (!info.HasAncestorFromHousehold(Household.ActiveHousehold))
                    {
                        flag = true;
                        continue;
                    }

                    foreach (ulong num4 in info.mHouseholdMembers)
                    {
                        IMiniSimDescription iMiniSimDescription = SimDescription.GetIMiniSimDescription(num4);
                        if ((iMiniSimDescription != null) && !item.mHouseholdMembers.Contains(iMiniSimDescription))
                        {
                            item.mHouseholdMembers.Add(iMiniSimDescription);
                        }
                    }
                    householdWealthScore += info.mCurrentHouseholdWealthScore;
                    numberOfMembers      += info.mCurrentDesiredHouseholdSize;
                }
                householdWealthScore /= Math.Max(1, FutureDescendantService.sPersistableData.DescendantHouseholdsMap[num].Count);
                numberOfMembers      /= Math.Max(1, FutureDescendantService.sPersistableData.DescendantHouseholdsMap[num].Count);
                item.mHouseholdWorth  = FutureDescendantService.GetWealthTypeString(householdWealthScore);
                item.mHouseholdSize   = FutureDescendantService.GetHouseholdSizeString(numberOfMembers);
                if (item != null && !flag)
                {
                    list.Add(item);
                }
            }
            return(list);
        }
Ejemplo n.º 4
0
 public static FutureDescendantService GetInstance()
 {
     if (FutureDescendantService.sInstance == null)
     {
         FutureDescendantService.CreateInstance();
     }
     return(FutureDescendantService.GetInstance());
 }
Ejemplo n.º 5
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.º 6
0
        protected override bool Allow(GameHitParameters <GameObject> parameters)
        {
            if (!Common.kDebugging)
            {
                return(false);
            }

            if (FutureDescendantService.GetInstance() == null)
            {
                return(false);
            }

            return(base.Allow(parameters));
        }
Ejemplo n.º 7
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);
        }
        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.º 9
0
        protected override OptionResult Run(GameHitParameters <GameObject> parameters)
        {
            Common.StringBuilder results = new Common.StringBuilder("BuildDescendantHouseholdSpecs");

            FutureDescendantService instance = FutureDescendantService.GetInstance();

            instance.CleanUpFutureDescendantService(true);
            instance.InitializeFutureDescendantService();

            FutureDescendantServiceEx.BuildDescendantHouseholdSpecs(instance);

            foreach (FutureDescendantService.FutureDescendantHouseholdInfo info in FutureDescendantService.sPersistableData.ActiveDescendantHouseholdsInfo)
            {
                if (info.HasAncestorFromHousehold(Household.ActiveHousehold))
                {
                    FutureDescendantHouseholdInfoEx.CalculateHouseholdFamilyScore(info, results);
                }
            }

            Common.DebugWriteLog(results);

            return(OptionResult.SuccessClose);
        }
Ejemplo n.º 10
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.º 11
0
            protected override bool OnPerform()
            {
                if ((HudController.Instance != null) && (GameUtils.IsOnVacation()))
                {
                    HudModel model = HudController.Instance.mHudModel as HudModel;
                    if (model != null)
                    {
                        if (model.MinuteChanged != null)
                        {
                            foreach (Delegate del in model.MinuteChanged.GetInvocationList())
                            {
                                TimeControl control = del.Target as TimeControl;
                                if (control != null)
                                {
                                    TimeControlEx.sThs = control;

                                    model.MinuteChanged -= TimeControlEx.sThs.OnMinuteChanged;
                                    model.MinuteChanged -= TimeControlEx.OnMinuteChanged;
                                    model.MinuteChanged += TimeControlEx.OnMinuteChanged;

                                    break;
                                }
                            }
                        }
                    }
                }

                InventoryPanel inventory = InventoryPanel.sInstance;

                if ((inventory != null) && (inventory.Visible))
                {
                    if (inventory.mTimeAlmanacButton != null)
                    {
                        if (GameUtils.IsFutureWorld())
                        {
                            inventory.mTimeAlmanacButton.Visible = (GameStates.TravelHousehold == Household.ActiveHousehold);
                        }

                        if (inventory.mTimeAlmanacButton.Visible)
                        {
                            inventory.mTimeAlmanacButton.Click -= inventory.OnClickTimeAlmanac;
                            inventory.mTimeAlmanacButton.Click -= FutureDescendantServiceEx.OnClickTimeAlmanac;
                            inventory.mTimeAlmanacButton.Click += FutureDescendantServiceEx.OnClickTimeAlmanac;
                        }
                    }
                }

                EditTownPuck puck = EditTownPuck.Instance;

                if (puck != null)
                {
                    if (puck.mReturnToLiveButton != null)
                    {
                        puck.mReturnToLiveButton.Click -= puck.OnReturnToLive;
                        puck.mReturnToLiveButton.Click -= OnReturnToLive;
                        puck.mReturnToLiveButton.Click += OnReturnToLive;
                    }
                }

                EditTownInfoPanel panel = EditTownInfoPanel.Instance;

                if (panel != null)
                {
                    if ((panel.mActionButtons != null) && (panel.mActionButtons.Length > 8) && (panel.mActionButtons[0x8] != null))
                    {
                        panel.mActionButtons[0x8].Click -= panel.OnChangeTypeClick;
                        panel.mActionButtons[0x8].Click -= OnChangeTypeClick;
                        panel.mActionButtons[0x8].Click += OnChangeTypeClick;
                    }
                }

                OptionsDialog options = OptionsDialog.sDialog;

                if (options != null)
                {
                    if (GameUtils.IsInstalled(ProductVersion.EP8))
                    {
                        Button testButton = options.mSeasonWindow.GetChildByID(0xdf085c3, true) as Button;
                        if ((testButton != null) && (!testButton.Enabled))
                        {
                            using (BaseWorldReversion reversion = new BaseWorldReversion())
                            {
                                foreach (Button weather in options.mEnabledWeatherButtons.Values)
                                {
                                    weather.Enabled = true;
                                }

                                if (options.mFahrenheitRadio != null)
                                {
                                    options.mFahrenheitRadio.Enabled = true;
                                }

                                if (options.mCelciusRadio != null)
                                {
                                    options.mCelciusRadio.Enabled = true;
                                }

                                options.SetupSeasonControls(false, ref options.mOldSeasonData);
                            }
                        }
                    }
                }

                FutureDescendantService instance = FutureDescendantServiceEx.GetInstance();

                if (Sims3.UI.Responder.Instance.InLiveMode && Traveler.Settings.mDisableDescendants && instance.mEventListeners.Count > 0)
                {
                    instance.CleanUpEventListeners();
                }

                return(true);
            }
Ejemplo n.º 12
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);
            }
        }
        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);
            }
        }
        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);
            }
        }
        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.º 16
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.º 17
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);
            }
        }
Ejemplo n.º 18
0
        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;
            }
        }
        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.º 20
0
        public static void ShowTimeAlmanacDialog()
        {
            if (!Responder.Instance.IsGameStatePending || !Responder.Instance.IsGameStateShuttingDown)
            {
                ICauseEffectUiData                causeEffectData         = null;
                List <ITimeStatueUiData>          timeStatueData          = null;
                List <IDescendantHouseholdUiData> descendantHouseholdInfo = null;
                CauseEffectService                instance = CauseEffectService.GetInstance();
                if (instance != null)
                {
                    causeEffectData = instance.GetTimeAlmanacCauseEffectData();
                    timeStatueData  = instance.GetTimeAlmanacTimeStatueData();
                }
                FutureDescendantService service2 = GetInstance();
                if (service2 != null)
                {
                    // custom
                    descendantHouseholdInfo = GetTimeAlamanacDescendantHouseholdData(service2);
                }
                Sim currentSim = PlumbBob.SelectedActor;
                TimeAlmanacDialog.TimeAlmanacResult result = TimeAlmanacDialog.Show(currentSim.ObjectId, causeEffectData, descendantHouseholdInfo, timeStatueData);
                bool flag  = currentSim.OpportunityManager.HasOpportunity(OpportunityCategory.Special);
                bool flag2 = result != TimeAlmanacDialog.TimeAlmanacResult.DoNothing;
                if (flag2 && flag)
                {
                    string promptText  = Localization.LocalizeString(currentSim.IsFemale, "Ui/Caption/TimeAlmanac:ChangeEventPrompt", new object[] { currentSim, currentSim.OpportunityManager.GetActiveOpportunity(OpportunityCategory.Special).Name });
                    string buttonTrue  = Localization.LocalizeString("Ui/Caption/Global:Yes", new object[0]);
                    string buttonFalse = Localization.LocalizeString("Ui/Caption/Global:No", new object[0]);
                    flag2 = TwoButtonDialog.Show(promptText, buttonTrue, buttonFalse);
                    if (flag2)
                    {
                        currentSim.OpportunityManager.CancelOpportunityByCategory(OpportunityCategory.Special);
                    }
                }
                if (flag2)
                {
                    switch (result)
                    {
                    case TimeAlmanacDialog.TimeAlmanacResult.DoNothing:
                        break;

                    case TimeAlmanacDialog.TimeAlmanacResult.TrashOpportunity:
                        currentSim.OpportunityManager.ClearLastOpportunity(OpportunityCategory.Special);
                        currentSim.OpportunityManager.AddOpportunityNow(OpportunityNames.EP11_Trigger_DystopiaFuture, true, false);
                        return;

                    case TimeAlmanacDialog.TimeAlmanacResult.MeteorOpportunity:
                        if (CauseEffectWorldState.kUtopiaState != instance.GetCurrentCauseEffectWorldState())
                        {
                            if (CauseEffectWorldState.kDystopiaState == instance.GetCurrentCauseEffectWorldState())
                            {
                                currentSim.OpportunityManager.ClearLastOpportunity(OpportunityCategory.Special);
                                currentSim.OpportunityManager.AddOpportunityNow(OpportunityNames.EP11_Undo_DystopiaFuture, true, false);
                                return;
                            }
                            break;
                        }
                        currentSim.OpportunityManager.ClearLastOpportunity(OpportunityCategory.Special);
                        unchecked
                        {
                            currentSim.OpportunityManager.AddOpportunityNow((OpportunityNames)(-5928144135704983787L), true, false);
                        }
                        return;

                    case TimeAlmanacDialog.TimeAlmanacResult.RainbowOpportunity:
                        currentSim.OpportunityManager.ClearLastOpportunity(OpportunityCategory.Special);
                        currentSim.OpportunityManager.AddOpportunityNow(OpportunityNames.EP11_Trigger_UtopiaFuture, true, false);
                        break;

                    default:
                        return;
                    }
                }
            }
        }
        public static List<IDescendantHouseholdUiData> GetTimeAlamanacDescendantHouseholdData(FutureDescendantService instance)
        {
            // custom
            BuildDescendantHouseholdSpecs(instance);
            List<IDescendantHouseholdUiData> list = new List<IDescendantHouseholdUiData>();
            List<ulong> remove = new List<ulong>();
            foreach (ulong num in FutureDescendantService.sPersistableData.DescendantHouseholdsMap.Keys)
            {
                // Overwatch does this too but no harm in doing it here too                
                if (SimDescription.Find(num) == null && MiniSims.Find(num) == null)
                {                    
                    remove.Add(num);                    
                }

                FutureDescendantService.DescendantHouseholdUiData item = new FutureDescendantService.DescendantHouseholdUiData
                {
                    mAncestorSimId = num
                };
                int householdWealthScore = 0;
                int numberOfMembers = 0;
                bool flag = false;
                foreach (FutureDescendantService.FutureDescendantHouseholdInfo info in FutureDescendantService.sPersistableData.DescendantHouseholdsMap[num])
                {                    
                    if (remove.Contains(num) && info.IsSimAnAncestor(num))
                    {
                        FutureDescendantService.sPersistableData.InvalidDescendantHouseholdsInfo.Add(info);
                        flag = true;
                        continue;
                    }

                    if (!info.HasAncestorFromHousehold(Household.ActiveHousehold))
                    {
                        flag = true;
                        continue;
                    }

                    foreach (ulong num4 in info.mHouseholdMembers)
                    {
                        IMiniSimDescription iMiniSimDescription = SimDescription.GetIMiniSimDescription(num4);
                        if ((iMiniSimDescription != null) && !item.mHouseholdMembers.Contains(iMiniSimDescription))
                        {
                            item.mHouseholdMembers.Add(iMiniSimDescription);
                        }
                    }
                    householdWealthScore += info.mCurrentHouseholdWealthScore;
                    numberOfMembers += info.mCurrentDesiredHouseholdSize;
                }
                householdWealthScore /= Math.Max(1, FutureDescendantService.sPersistableData.DescendantHouseholdsMap[num].Count);
                numberOfMembers /= Math.Max(1, FutureDescendantService.sPersistableData.DescendantHouseholdsMap[num].Count);
                item.mHouseholdWorth = FutureDescendantService.GetWealthTypeString(householdWealthScore);
                item.mHouseholdSize = FutureDescendantService.GetHouseholdSizeString(numberOfMembers);
                if (item != null && !flag)
                {
                    list.Add(item);
                }
            }
            return list;
        }        
Ejemplo n.º 22
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);
            }
        }
        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();

                if (!Traveler.Settings.mDisableDescendantModification || (Traveler.Settings.mDisableDescendantModification && !ActiveHouseholdHasDescendants()))
                {
                // 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);
            }
        }
        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;
        }