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; }
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); }
public static FutureDescendantService GetInstance() { if (FutureDescendantService.sInstance == null) { FutureDescendantService.CreateInstance(); } return(FutureDescendantService.GetInstance()); }
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); } }
protected override bool Allow(GameHitParameters <GameObject> parameters) { if (!Common.kDebugging) { return(false); } if (FutureDescendantService.GetInstance() == null) { return(false); } return(base.Allow(parameters)); }
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; }
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); }
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); }
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); }
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; } }
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); }
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); } }
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; }
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; }
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; }