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); } }
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 bool CreateAndAddDescendant(FutureDescendantService.FutureDescendantHouseholdInfo ths) { Household descendantHousehold = ths.DescendantHousehold; if (descendantHousehold == null) { return(false); } List <SimDescription> potentialParents = new List <SimDescription>(); foreach (SimDescription description in descendantHousehold.SimDescriptions) { if (description.YoungAdultOrAbove) { potentialParents.Add(description); } } bool noParents; SimDescription child = GenerateOffspring(potentialParents, out noParents); if (child == null) { if (noParents) { if (Instantiate(ths) == null) { return(false); } } } else { descendantHousehold.Add(child); ths.mHouseholdMembers.Add(child.SimDescriptionId); SimUtils.HouseholdCreationSpec.UpdateHouseholdLTR(ref descendantHousehold, descendantHousehold.Name, false); } return(true); }
private static bool ProcessSim(FutureDescendantService ths, SimDescription simDesc) { try { if (FutureDescendantService.sPersistableData == null) { return false; } else if (simDesc == null) { return false; } else if (Household.ActiveHousehold != simDesc.Household) { return false; } else if ((Household.RoommateManager != null) && Household.RoommateManager.IsNPCRoommate(simDesc)) { return false; } else if (simDesc.IsRobot) { return false; } else if (simDesc.Genealogy == null) { return false; } List<SimDescription> children = Relationships.GetChildren(simDesc); bool processed = false; if ((children != null) && (children.Count > 0x0)) { foreach (SimDescription child in children) { processed |= ProcessSim(ths, child); } } if (!processed) { foreach (FutureDescendantService.FutureDescendantHouseholdInfo info in FutureDescendantService.sPersistableData.ActiveDescendantHouseholdsInfo) { if (info.IsSimAProgenitor(simDesc.SimDescriptionId) || info.IsSimAnAncestor(simDesc.SimDescriptionId)) { return true; } } Common.StringBuilder msg = new Common.StringBuilder("FutureDescendantHouseholdInfo"); msg += Common.NewLine + simDesc.FullName; FutureDescendantService.FutureDescendantHouseholdInfo item = new FutureDescendantService.FutureDescendantHouseholdInfo(); List<SimDescription> tests = new List<SimDescription>(); try { tests.Add(simDesc); item.AddProgenitorSim(simDesc.SimDescriptionId); SimDescription mate = simDesc.Partner; if (mate == null) { mate = GetPotentialMate(simDesc, tests, true); if (mate == null) { mate = GetPotentialMate(simDesc, tests, false); if (mate == null) { msg += Common.NewLine + "Fail"; return false; } } } msg += Common.NewLine + mate.FullName; tests.Add(mate); item.AddProgenitorSim(mate.SimDescriptionId); SimDescription inLaw = GetPotentialInLaw(simDesc, mate, tests, true); if (inLaw == null) { inLaw = GetPotentialInLaw(simDesc, mate, tests, false); if (inLaw == null) { msg += Common.NewLine + "Fail"; return false; } } msg += Common.NewLine + inLaw.FullName; tests.Add(inLaw); item.AddProgenitorSim(inLaw.SimDescriptionId); mate = inLaw.Partner; if (mate == null) { mate = GetPotentialMate(inLaw, tests, true); if (mate == null) { mate = GetPotentialMate(inLaw, tests, false); if (mate == null) { msg += Common.NewLine + "Fail"; return false; } } } msg += Common.NewLine + mate.FullName; item.AddProgenitorSim(mate.SimDescriptionId); if (item.mProgenitorSimIds.Count != 4) { msg += Common.NewLine + "Fail"; return false; } } finally { Common.DebugWriteLog(msg); } FutureDescendantService.sPersistableData.ActiveDescendantHouseholdsInfo.Add(item); } return true; } catch (Exception e) { Common.Exception(simDesc, e); return false; } }
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); }
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); } }
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); } }