public static void FinalizeZombieGeneration(Zombie zombie) { var graphicPath = GraphicDatabaseHeadRecords.GetHeadRandom(zombie.gender, zombie.story.SkinColor, zombie.story.crownType).GraphicPath; Traverse.Create(zombie.story).Field("headGraphicPath").SetValue(graphicPath); var request = new PawnGenerationRequest(zombie.kindDef); PawnApparelGenerator.GenerateStartingApparelFor(zombie, request); zombie.apparel.WornApparel.Do(apparel => { Color[] colors = { "442a0a".HexColor(), "615951".HexColor(), "1f4960".HexColor(), "182a64".HexColor(), "73000d".HexColor(), "2c422a".HexColor(), "332341".HexColor() }; (colors.Clone() as Color[]).Do(c => { c.r *= Rand.Range(0.2f, 1f); c.g *= Rand.Range(0.2f, 1f); c.b *= Rand.Range(0.2f, 1f); colors.Add(c); }); colors.Add("000000".HexColor()); apparel.SetColor(colors[Rand.Range(0, colors.Length)]); }); }
public static bool MovePawnToColony(Pawn pawn, Pawn inviter, Map destination) { Map map = destination; if (map.ParentFaction != Faction.OfPlayer) { if (inviter.IsCaravanMember() || PawnUtility.IsTravelingInTransportPodWorldObject(pawn) || inviter.Map.ParentFaction != Faction.OfPlayer) { map = Find.AnyPlayerHomeMap; } else { map = inviter.Map; } } if (!TryFindEntryCell(map, out IntVec3 cell)) { return(false); } if (pawn.apparel.AnyApparelLocked) { var req = PawnGenerationRequest.MakeDefault(); req.Tile = inviter.Map.Tile; PawnApparelGenerator.GenerateStartingApparelFor(pawn, req); } GenSpawn.Spawn(pawn, cell, map, WipeMode.Vanish); Letters.SendJoinLetter(pawn, inviter, map); return(true); }
protected override Job TryGiveJob(Pawn pawn) { //if (pawn.outfits == null) //{ // Log.ErrorOnce(pawn + " tried to run JobGiver_TakeFromLocker without an OutfitTracker", 5643897); // return null; //} if (!pawn.IsPrisoner) { Log.ErrorOnce("Non-prisoner " + pawn + " tried to take from locker.", 764323); return(null); } if (Find.TickManager.TicksGame < pawn.mindState.nextApparelOptimizeTick) { return(null); } //Outfit currentOutfit = pawn.outfits.CurrentOutfit; List <Apparel> wornApparel = pawn.apparel.WornApparel; Thing thing = null; float num = 0f; List <Thing> list = FindItemToWear(pawn); if (list.Count == 0) { SetNextOptimizeTick(pawn); return(null); } var neededWarmth = PawnApparelGenerator.CalculateNeededWarmth(pawn, pawn.Map.Tile, GenLocalDate.Twelfth(pawn)); for (int j = 0; j < list.Count; j++) { Apparel apparel = (Apparel)list[j]; if (apparel.Map.slotGroupManager.SlotGroupAt(apparel.Position) != null) { float num2 = JobGiver_OptimizeApparel.ApparelScoreGain(pawn, apparel); if (num2 >= 0.05f && num2 >= num) { if (ApparelUtility.HasPartsToWear(pawn, apparel.def)) { if (pawn.CanReserveAndReach(apparel, PathEndMode.OnCell, pawn.NormalMaxDanger(), 1, -1, null, false)) { thing = apparel; num = num2; } } } } } if (thing == null) { SetNextOptimizeTick(pawn); return(null); } return(new Job(JobDefOf.Wear, thing)); }
public static void PawnKindsApparelUsage() { List <TableDataGetter <PawnKindDef> > list = new List <TableDataGetter <PawnKindDef> >(); list.Add(new TableDataGetter <PawnKindDef>("defName", (PawnKindDef x) => x.defName)); list.Add(new TableDataGetter <PawnKindDef>("avg $", (PawnKindDef x) => x.apparelMoney.Average.ToString())); list.Add(new TableDataGetter <PawnKindDef>("min $", (PawnKindDef x) => x.apparelMoney.min.ToString())); list.Add(new TableDataGetter <PawnKindDef>("max $", (PawnKindDef x) => x.apparelMoney.max.ToString())); list.Add(new TableDataGetter <PawnKindDef>("points", (PawnKindDef x) => x.combatPower.ToString())); list.AddRange(from a in DefDatabase <ThingDef> .AllDefs where a.IsApparel orderby PawnApparelGenerator.IsHeadgear(a), a.techLevel, a.BaseMarketValue select new TableDataGetter <PawnKindDef>(a.label.Shorten() + "\n$" + a.BaseMarketValue.ToString("F0"), delegate(PawnKindDef k) { if (k.apparelRequired != null && k.apparelRequired.Contains(a)) { return("Rq"); } if (k.apparelDisallowTags != null && k.apparelDisallowTags.Any((string tag) => a.apparel.tags.Contains(tag))) { return("distag"); } if (k.apparelAllowHeadgearChance <= 0f && PawnApparelGenerator.IsHeadgear(a)) { return("nohat"); } List <SpecificApparelRequirement> specificApparelRequirements = k.specificApparelRequirements; if (specificApparelRequirements != null) { for (int i = 0; i < specificApparelRequirements.Count; i++) { if (PawnApparelGenerator.ApparelRequirementHandlesThing(specificApparelRequirements[i], a) && PawnApparelGenerator.ApparelRequirementTagsMatch(specificApparelRequirements[i], a)) { return("SpRq"); } } } if (k.apparelTags != null && a.apparel.tags.Any((string z) => k.apparelTags.Contains(z))) { float baseMarketValue = a.BaseMarketValue; if (k.apparelMoney.max < baseMarketValue) { return("-"); } if (k.apparelMoney.min > baseMarketValue) { return("✓"); } return((1f - (baseMarketValue - k.apparelMoney.min) / (k.apparelMoney.max - k.apparelMoney.min)).ToStringPercent("F0")); } return(""); })); DebugTables.MakeTablesDialog(from x in DefDatabase <PawnKindDef> .AllDefs where x.RaceProps.Humanlike orderby(x.defaultFactionType == null) ? int.MaxValue : ((int)x.defaultFactionType.techLevel), x.combatPower select x, list.ToArray()); }
public static void DressPawnIfCold(Pawn pawn, int tile) { // Create warm apparel in case they freeze to death PawnApparelGenerator.GenerateStartingApparelFor(pawn, new PawnGenerationRequest( pawn.kindDef, pawn.Faction, PawnGenerationContext.NonPlayer, tile, false, false, false, false, true, false, 0f, true, // "forceAddFreeWarmLayerIfNeeded": THIS IS THE MOST IMPORTANT VARIABLE true, true, true, false, false, false, false, 0f, 0f, null, 0f, null, null, null, null, new float?(0.0f), null, null, null, null, null, null, null, null, true, true, true)); }
static bool Prefix() { if (reset) { return(true); } reset = true; PawnApparelGenerator.Reset(); return(true); }
private static void GenerateGearFor(Pawn pawn, PawnGenerationRequest request) { ProfilerThreadCheck.BeginSample("GenerateGearFor"); ProfilerThreadCheck.BeginSample("GenerateStartingApparelFor"); PawnApparelGenerator.GenerateStartingApparelFor(pawn, request); ProfilerThreadCheck.EndSample(); ProfilerThreadCheck.BeginSample("TryGenerateWeaponFor"); PawnWeaponGenerator.TryGenerateWeaponFor(pawn); ProfilerThreadCheck.EndSample(); ProfilerThreadCheck.BeginSample("GenerateInventoryFor"); PawnInventoryGenerator.GenerateInventoryFor(pawn, request); ProfilerThreadCheck.EndSample(); ProfilerThreadCheck.EndSample(); }
static bool CanWear(Zombie zombie, ThingStuffPair pair) { if (pair.thing == null) { return(false); } if (zombie.isMiner && PawnApparelGenerator.IsHeadgear(pair.thing)) { return(false); } return(ApparelUtility.HasPartsToWear(zombie, pair.thing)); }
public static Thing PickBestArmorFor(Pawn pawn) { if (pawn.outfits == null) { return(null); } if (pawn.Faction != Faction.OfPlayer) { return(null); } if (pawn.IsQuestLodger()) { return(null); } Outfit currentOutfit = pawn.outfits.CurrentOutfit; Thing thing = null; float num2 = 0f; List <Thing> list = pawn.Map.listerThings.ThingsInGroup(ThingRequestGroup.Apparel); if (list.Count == 0) { return(null); } neededWarmth = PawnApparelGenerator.CalculateNeededWarmth(pawn, pawn.Map.Tile, GenLocalDate.Twelfth(pawn)); wornApparelScores = new List <float>(); List <Apparel> wornApparel = pawn.apparel.WornApparel; for (int i = 0; i < wornApparel.Count; i++) { wornApparelScores.Add(ApparelScoreRaw(pawn, wornApparel[i])); } for (int j = 0; j < list.Count; j++) { Apparel apparel = (Apparel)list[j]; // && apparel.IsInAnyStorage() if (!apparel.IsBurning() && currentOutfit.filter.Allows(apparel) && !apparel.IsForbidden(pawn) && (apparel.def.apparel.gender == Gender.None || apparel.def.apparel.gender == pawn.gender)) { float num3 = ApparelScoreGain_NewTmp(pawn, apparel, wornApparelScores); if (!(num3 < 0.05f) && !(num3 < num2) && (!CompBiocodable.IsBiocoded(apparel) || CompBiocodable.IsBiocodedFor(apparel, pawn)) && ApparelUtility.HasPartsToWear(pawn, apparel.def) && pawn.CanReserveAndReach(apparel, PathEndMode.OnCell, pawn.NormalMaxDanger())) { thing = apparel; num2 = num3; } } } return(thing); }
static string apparelOkayToWear(Pawn pawn, Apparel apparel) { ApparelProperties app = apparel.def.apparel; if (!pawn.kindDef.apparelRequired.NullOrEmpty() && pawn.kindDef.apparelRequired.Contains(apparel.def)) { return("OK"); } if (!app.CorrectGenderForWearing(pawn.gender)) { return("Wrong gender."); } List <SpecificApparelRequirement> specificApparelRequirements = pawn.kindDef.specificApparelRequirements; if (specificApparelRequirements != null) { for (int i = 0; i < specificApparelRequirements.Count; i++) { if (PawnApparelGenerator.ApparelRequirementHandlesThing(specificApparelRequirements[i], apparel.def) && PawnApparelGenerator.ApparelRequirementTagsMatch(specificApparelRequirements[i], apparel.def)) { return("OK"); } } } if (!pawn.kindDef.apparelTags.NullOrEmpty()) { if (!app.tags.Any((string tag) => pawn.kindDef.apparelTags.Contains(tag))) { return("Required tag missing."); } if ((pawn.royalty == null || pawn.royalty.MostSeniorTitle == null) && app.tags.Contains("Royal") && !pawn.kindDef.apparelTags.Any((string tag) => app.tags.Contains(tag))) { return("Royal apparel on non-royal pawn."); } } if (!pawn.kindDef.apparelDisallowTags.NullOrEmpty() && pawn.kindDef.apparelDisallowTags.Any((string t) => app.tags.Contains(t))) { return("Has a disallowed tag."); } if (pawn.royalty != null && pawn.royalty.AllTitlesInEffectForReading.Any()) { RoyalTitle mostSeniorTitle = pawn.royalty.MostSeniorTitle; if (apparel.TryGetQuality(out var qc) && (int)qc < (int)mostSeniorTitle.def.requiredMinimumApparelQuality) { return("Quality too low."); } } return("OK"); }
public static Pawn GenerateNewTenant() { bool generation = true; Pawn newTenant = null; while (generation) { string race = SettingsHelper.LatestVersion.AvailableRaces.RandomElement(); PawnKindDef random = DefDatabase <PawnKindDef> .AllDefsListForReading.Where(x => x.race.defName == race).RandomElement(); if (random == null) { return(null); } Faction faction = FactionUtility.DefaultFactionFrom(random.defaultFactionType); newTenant = PawnGenerator.GeneratePawn(random, faction); if (newTenant != null && !newTenant.Dead && !newTenant.IsDessicated() && !newTenant.AnimalOrWildMan()) { { if (SettingsHelper.LatestVersion.SimpleClothing) { FloatRange range = newTenant.kindDef.apparelMoney; newTenant.kindDef.apparelMoney = new FloatRange(SettingsHelper.LatestVersion.SimpleClothingMin, SettingsHelper.LatestVersion.SimpleClothingMax); PawnApparelGenerator.GenerateStartingApparelFor(newTenant, new PawnGenerationRequest(random)); newTenant.kindDef.apparelMoney = range; } RemoveExpensiveItems(newTenant); newTenant.GetTenantComponent().IsTenant = true; newTenant.GetTenantComponent().HiddenFaction = faction; newTenant.SetFaction(Faction.OfAncients); if (SettingsHelper.LatestVersion.Weapons) { List <Thing> ammo = newTenant.inventory.innerContainer.Where(x => x.def.defName.Contains("Ammunition")).ToList(); foreach (Thing thing in ammo) { newTenant.inventory.innerContainer.Remove(thing); } } newTenant.DestroyOrPassToWorld(); generation = false; } } } return(newTenant); }
public static void PawnKindsApparelUsage() { List <TableDataGetter <PawnKindDef> > list = new List <TableDataGetter <PawnKindDef> >(); list.Add(new TableDataGetter <PawnKindDef>("defName", (PawnKindDef x) => x.defName)); list.Add(new TableDataGetter <PawnKindDef>("avg $", (PawnKindDef x) => x.apparelMoney.Average.ToString())); list.Add(new TableDataGetter <PawnKindDef>("min $", (PawnKindDef x) => x.apparelMoney.min.ToString())); list.Add(new TableDataGetter <PawnKindDef>("max $", (PawnKindDef x) => x.apparelMoney.max.ToString())); list.Add(new TableDataGetter <PawnKindDef>("points", (PawnKindDef x) => x.combatPower.ToString())); list.AddRange(from a in (from a in DefDatabase <ThingDef> .AllDefs where a.IsApparel select a).OrderBy(PawnApparelGenerator.IsHeadgear).ThenBy((ThingDef a) => a.BaseMarketValue) select new TableDataGetter <PawnKindDef>(a.label.Shorten() + "\n$" + a.BaseMarketValue.ToString("F0"), delegate(PawnKindDef k) { if (k.apparelRequired != null && k.apparelRequired.Contains(a)) { return("Rq"); } if (k.apparelAllowHeadgearChance <= 0f && PawnApparelGenerator.IsHeadgear(a)) { return("nohat"); } if (k.apparelTags != null && a.apparel.tags.Any((string z) => k.apparelTags.Contains(z))) { float baseMarketValue = a.BaseMarketValue; if (k.apparelMoney.max < baseMarketValue) { return("-"); } if (k.apparelMoney.min > baseMarketValue) { return("✓"); } return((1f - (baseMarketValue - k.apparelMoney.min) / (k.apparelMoney.max - k.apparelMoney.min)).ToStringPercent("F0")); } return(string.Empty); })); DebugTables.MakeTablesDialog(from x in DefDatabase <PawnKindDef> .AllDefs where x.RaceProps.Humanlike orderby(x.defaultFactionType == null) ? 2147483647 : ((int)x.defaultFactionType.techLevel), x.combatPower select x, list.ToArray()); }
private static void GenerateStartingApparelFor_Coping(Pawn pawn, Pawn sourcePawn, bool forceApparel) { if ((sourcePawn != null) && ((forceApparel) || (sourcePawn.RaceProps.Humanlike && pawn.RaceProps.Humanlike) || (sourcePawn.def == pawn.def))) { if (sourcePawn.apparel == null || sourcePawn.apparel.WornApparelCount == 0) { return; } while (sourcePawn.apparel.WornApparel.Any()) { Apparel ap; sourcePawn.apparel.TryDrop(sourcePawn.apparel.WornApparel.First(), out ap); pawn.apparel.Wear(ap); } //using (IEnumerator<Apparel> enumerator = .GetEnumerator()) //{ // while (enumerator.MoveNext()) // { // Apparel apparel = (Apparel)enumerator.Current; // Apparel apparel2; // if (apparel.def.MadeFromStuff) // apparel2 = (Apparel)ThingMaker.MakeThing(apparel.def, apparel.Stuff); // else // apparel2 = (Apparel)ThingMaker.MakeThing(apparel.def, null); // apparel2.DrawColor = new Color(apparel.DrawColor.r, apparel.DrawColor.g, apparel.DrawColor.b, apparel.DrawColor.a); // pawn.apparel.Wear(apparel2, true); // } //} } else { PawnApparelGenerator.GenerateStartingApparelFor(pawn); } }
public static bool TryGiveJob(JobGiver_OptimizeApparel __instance, ref Job __result, Pawn pawn) { if (pawn.outfits == null) { Log.ErrorOnce(string.Concat(pawn, " tried to run JobGiver_OptimizeApparel without an OutfitTracker"), 5643897); __result = null; return(false); } if (pawn.Faction != Faction.OfPlayer) { Log.ErrorOnce(string.Concat("Non-colonist ", pawn, " tried to optimize apparel."), 764323); __result = null; return(false); } if (pawn.IsQuestLodger()) { __result = null; return(false); } if (!DebugViewSettings.debugApparelOptimize) { if (Find.TickManager.TicksGame < pawn.mindState.nextApparelOptimizeTick) { __result = null; return(false); } } else { debugSb = new StringBuilder(); debugSb.AppendLine(string.Concat("Scanning for ", pawn, " at ", pawn.Position)); } Outfit currentOutfit = pawn.outfits.CurrentOutfit; List <Apparel> wornApparel = pawn.apparel.WornApparel; for (int num = wornApparel.Count - 1; num >= 0; num--) { if (!currentOutfit.filter.Allows(wornApparel[num]) && pawn.outfits.forcedHandler.AllowedToAutomaticallyDrop(wornApparel[num]) && !pawn.apparel.IsLocked(wornApparel[num])) { Job job = JobMaker.MakeJob(JobDefOf.RemoveApparel, wornApparel[num]); job.haulDroppedApparel = true; __result = job; return(false); } } Thing thing = null; float num2 = 0f; List <Thing> list = pawn.Map.listerThings.ThingsInGroup(ThingRequestGroup.Apparel); if (list.Count == 0) { SetNextOptimizeTick2(pawn); __result = null; return(false); } neededWarmth = PawnApparelGenerator.CalculateNeededWarmth(pawn, pawn.Map.Tile, GenLocalDate.Twelfth(pawn)); //wornApparelScores.Clear(); List <float> wornApparelScores = new List <float>(); for (int i = 0; i < wornApparel.Count; i++) { wornApparelScores.Add(JobGiver_OptimizeApparel.ApparelScoreRaw(pawn, wornApparel[i])); } for (int j = 0; j < list.Count; j++) { Apparel apparel = (Apparel)list[j]; if (currentOutfit.filter.Allows(apparel) && apparel.IsInAnyStorage() && !apparel.IsForbidden(pawn) && !apparel.IsBurning() && (apparel.def.apparel.gender == Gender.None || apparel.def.apparel.gender == pawn.gender)) { float num3 = JobGiver_OptimizeApparel.ApparelScoreGain_NewTmp(pawn, apparel, wornApparelScores); if (DebugViewSettings.debugApparelOptimize) { debugSb.AppendLine(apparel.LabelCap + ": " + num3.ToString("F2")); } if (!(num3 < 0.05f) && !(num3 < num2) && (!EquipmentUtility.IsBiocoded(apparel) || EquipmentUtility.IsBiocodedFor(apparel, pawn)) && ApparelUtility.HasPartsToWear(pawn, apparel.def) && pawn.CanReserveAndReach(apparel, PathEndMode.OnCell, pawn.NormalMaxDanger())) { thing = apparel; num2 = num3; } } } if (DebugViewSettings.debugApparelOptimize) { debugSb.AppendLine("BEST: " + thing); Log.Message(debugSb.ToString()); debugSb = null; } if (thing == null) { SetNextOptimizeTick2(pawn); __result = null; return(false); } __result = JobMaker.MakeJob(JobDefOf.Wear, thing); return(false); }
public override void Notify_GeneratedByQuestGen( [NotNull] SitePart part, [NotNull] Slate slate, [NotNull] List <Rule> outExtraDescriptionRules, Dictionary <string, string> outExtraDescriptionConstants ) { base.Notify_GeneratedByQuestGen(part, slate, outExtraDescriptionRules, outExtraDescriptionConstants); Pawn pawn = null; var isNew = false; if (!QueuedViewers.TryDequeue(out KidnapReport report)) { report = null; } else { pawn = CommandBase.GetOrFindPawn(report.Viewer, true); if (!pawn.IsKidnapped()) { pawn = null; } } pawn ??= report?.GetMostRecentKidnapping(); pawn ??= report?.GetPawns().RandomElementWithFallback(); if (pawn == null) { pawn = PrisonerWillingToJoinQuestUtility.GeneratePrisoner(part.site.Tile, part.site.Faction); isNew = true; } if (pawn != null) { pawn.SetFaction(part.site.Faction); pawn.guest.SetGuestStatus(part.site.Faction, GuestStatus.Prisoner); pawn.mindState.WillJoinColonyIfRescued = true; if (pawn.Dead) { pawn.TryResurrect(); } PawnApparelGenerator.GenerateStartingApparelFor( pawn, new PawnGenerationRequest(pawn.kindDef, pawn.Faction, PawnGenerationContext.NonPlayer, part.site.Tile, forceAddFreeWarmLayerIfNeeded: true) ); } part.things = new ThingOwner <Pawn>(part, true, isNew ? LookMode.Deep : LookMode.Reference); part.things.TryAdd(pawn); PawnRelationUtility.Notify_PawnsSeenByPlayer(Gen.YieldSingle(pawn), out string pawnRelationsInfo, true, false); string output = pawnRelationsInfo.NullOrEmpty() ? "" : $"\n\n{"PawnHasRelationshipsWithColonists".Translate(pawn?.LabelShort, pawn)}\n\n{pawnRelationsInfo}"; slate.Set("prisoner", pawn); outExtraDescriptionRules.Add(new Rule_String("prisonerFullRelationInfo", output)); }
private static void DoPlayLoad() { GraphicDatabase.Clear(); DeepProfiler.Start("Load all active mods."); try { LoadedModManager.LoadAllActiveMods(); } finally { DeepProfiler.End(); } DeepProfiler.Start("Load language metadata."); try { LanguageDatabase.LoadAllMetadata(); } finally { DeepProfiler.End(); } LongEventHandler.SetCurrentEventText("LoadingDefs".Translate()); DeepProfiler.Start("Copy all Defs from mods to global databases."); try { foreach (Type item in typeof(Def).AllSubclasses()) { GenGeneric.InvokeStaticMethodOnGenericType(typeof(DefDatabase <>), item, "AddAllInMods"); } } finally { DeepProfiler.End(); } DeepProfiler.Start("Resolve cross-references between non-implied Defs."); try { DirectXmlCrossRefLoader.ResolveAllWantedCrossReferences(FailMode.Silent); } finally { DeepProfiler.End(); } DeepProfiler.Start("Rebind defs (early)."); try { DefOfHelper.RebindAllDefOfs(true); } finally { DeepProfiler.End(); } DeepProfiler.Start("Generate implied Defs (pre-resolve)."); try { DefGenerator.GenerateImpliedDefs_PreResolve(); } finally { DeepProfiler.End(); } DeepProfiler.Start("Resolve cross-references between Defs made by the implied defs."); try { DirectXmlCrossRefLoader.ResolveAllWantedCrossReferences(FailMode.LogErrors); } finally { DeepProfiler.End(); } DeepProfiler.Start("Rebind DefOfs (final)."); try { DefOfHelper.RebindAllDefOfs(false); } finally { DeepProfiler.End(); } DeepProfiler.Start("Other def binding, resetting and global operations."); try { PlayerKnowledgeDatabase.ReloadAndRebind(); LessonAutoActivator.Reset(); CostListCalculator.Reset(); PawnApparelGenerator.Reset(); RestUtility.Reset(); ThoughtUtility.Reset(); PawnWeaponGenerator.Reset(); ThinkTreeKeyAssigner.Reset(); ThingCategoryNodeDatabase.FinalizeInit(); TrainableUtility.Reset(); HaulAIUtility.Reset(); GenConstruct.Reset(); WorkGiver_FillFermentingBarrel.Reset(); WorkGiver_DoBill.Reset(); Pawn.Reset(); WorkGiver_InteractAnimal.Reset(); WorkGiver_Warden_DoExecution.Reset(); WorkGiver_GrowerSow.Reset(); WorkGiver_Miner.Reset(); MedicalCareUtility.Reset(); InspectPaneUtility.Reset(); GraphicDatabaseHeadRecords.Reset(); DateReadout.Reset(); ResearchProjectDef.GenerateNonOverlappingCoordinates(); WorkGiver_FixBrokenDownBuilding.CacheTranslations(); ItemCollectionGeneratorUtility.Reset(); BaseGen.Reset(); HealthUtility.Reset(); ResourceCounter.ResetDefs(); WildSpawner.Reset(); ApparelProperties.Reset(); } finally { DeepProfiler.End(); } DeepProfiler.Start("Resolve references."); try { foreach (Type item2 in typeof(Def).AllSubclasses()) { if (item2 != typeof(ThingDef)) { GenGeneric.InvokeStaticMethodOnGenericType(typeof(DefDatabase <>), item2, "ResolveAllReferences", true); } } DefDatabase <ThingDef> .ResolveAllReferences(true); } finally { DeepProfiler.End(); } DeepProfiler.Start("Generate implied Defs (post-resolve)."); try { DefGenerator.GenerateImpliedDefs_PostResolve(); } finally { DeepProfiler.End(); } if (Prefs.DevMode) { DeepProfiler.Start("Error check all defs."); try { foreach (Type item3 in typeof(Def).AllSubclasses()) { GenGeneric.InvokeStaticMethodOnGenericType(typeof(DefDatabase <>), item3, "ErrorCheckAllDefs"); } } finally { DeepProfiler.End(); } } LongEventHandler.SetCurrentEventText("Initializing".Translate()); DeepProfiler.Start("Load keyboard preferences."); try { KeyPrefs.Init(); } finally { DeepProfiler.End(); } DeepProfiler.Start("Short hash giving."); try { ShortHashGiver.GiveAllShortHashes(); } finally { DeepProfiler.End(); } LongEventHandler.ExecuteWhenFinished(delegate { DeepProfiler.Start("Load backstories."); try { BackstoryDatabase.ReloadAllBackstories(); } finally { DeepProfiler.End(); } }); LongEventHandler.ExecuteWhenFinished(delegate { DeepProfiler.Start("Inject selected language data into game data."); try { LanguageDatabase.activeLanguage.InjectIntoData(); GenLabel.ClearCache(); } finally { DeepProfiler.End(); } }); LongEventHandler.ExecuteWhenFinished(delegate { StaticConstructorOnStartupUtility.CallAll(); if (Prefs.DevMode) { StaticConstructorOnStartupUtility.ReportProbablyMissingAttributes(); } }); }
static RemoveModernStuff() { DebugString.AppendLine("Lord of the Rings - The Third Age - Start Removal Log"); DebugString.AppendLine("Tech Limiter Active: Max Level = " + MAX_TECHLEVEL.ToString()); giveApproppriateTechLevels(); removedDefs = 0; IEnumerable <ResearchProjectDef> projects = DefDatabase <ResearchProjectDef> .AllDefs.Where(rpd => rpd.techLevel > MAX_TECHLEVEL); things = new HashSet <ThingDef>(DefDatabase <ThingDef> .AllDefs.Where(td => td.techLevel > MAX_TECHLEVEL || (td.researchPrerequisites?.Any(rpd => projects.Contains(rpd)) ?? false) || new[] { "Gun_Revolver", "VanometricPowerCell", "PsychicEmanator", "InfiniteChemreactor", "Joywire", "Painstopper" }.Contains(td.defName))); DebugString.AppendLine("RecipeDef Removal List"); var recipeDefsToRemove = DefDatabase <RecipeDef> .AllDefs.Where(rd => rd.products.Any(tcc => things.Contains(tcc.thingDef)) || rd.AllRecipeUsers.All(td => things.Contains(td)) || projects.Contains(rd.researchPrerequisite)).Cast <Def>().ToList(); recipeDefsToRemove?.RemoveAll(x => x.defName == "ExtractMetalFromSlag" || x.defName == "SmeltWeapon" || x.defName == "DestroyWeapon" || x.defName == "OfferingOfPlants_Meagre" || x.defName == "OfferingOfPlants_Decent" || x.defName == "OfferingOfPlants_Sizable" || x.defName == "OfferingOfPlants_Worthy" || x.defName == "OfferingOfPlants_Impressive" || x.defName == "OfferingOfMeat_Meagre" || x.defName == "OfferingOfMeat_Decent" || x.defName == "OfferingOfMeat_Sizable" || x.defName == "OfferingOfMeat_Worthy" || x.defName == "OfferingOfMeat_Impressive" || x.defName == "OfferingOfMeals_Meagre" || x.defName == "OfferingOfMeals_Decent" || x.defName == "OfferingOfMeals_Sizable" || x.defName == "OfferingOfMeals_Worthy" || x.defName == "OfferingOfMeals_Impressive" || x.defName == "ROMV_ExtractBloodVial" || x.defName == "ROMV_ExtractBloodPack" ); RemoveStuffFromDatabase(typeof(DefDatabase <RecipeDef>), recipeDefsToRemove); DebugString.AppendLine("ResearchProjectDef Removal List"); RemoveStuffFromDatabase(typeof(DefDatabase <ResearchProjectDef>), projects.Cast <Def>()); DebugString.AppendLine("Scenario Part Removal List"); FieldInfo getThingInfo = typeof(ScenPart_ThingCount).GetField("thingDef", BindingFlags.NonPublic | BindingFlags.Instance); foreach (ScenarioDef def in DefDatabase <ScenarioDef> .AllDefs) { foreach (ScenPart sp in def.scenario.AllParts) { if (sp is ScenPart_ThingCount && things.Contains((ThingDef)getThingInfo?.GetValue(sp))) { def.scenario.RemovePart(sp); DebugString.AppendLine("- " + sp.Label + " " + ((ThingDef)getThingInfo?.GetValue(sp)).label + " from " + def.label); } } } foreach (ThingCategoryDef thingCategoryDef in DefDatabase <ThingCategoryDef> .AllDefs) { thingCategoryDef.childThingDefs.RemoveAll(things.Contains); } DebugString.AppendLine("Stock Generator Part Cleanup"); foreach (TraderKindDef tkd in DefDatabase <TraderKindDef> .AllDefs) { for (int i = tkd.stockGenerators.Count - 1; i >= 0; i--) { StockGenerator stockGenerator = tkd.stockGenerators[i]; switch (stockGenerator) { case StockGenerator_SingleDef sd when things.Contains(Traverse.Create(sd).Field("thingDef") .GetValue <ThingDef>()): ThingDef def = Traverse.Create(sd).Field("thingDef") .GetValue <ThingDef>(); tkd.stockGenerators.Remove(stockGenerator); DebugString.AppendLine("- " + def.label + " from " + tkd.label + "'s StockGenerator_SingleDef"); break; case StockGenerator_MultiDef md: Traverse thingListTraverse = Traverse.Create(md).Field("thingDefs"); List <ThingDef> thingList = thingListTraverse.GetValue <List <ThingDef> >(); var removeList = thingList.FindAll(things.Contains); removeList?.ForEach(x => DebugString.AppendLine("- " + x.label + " from " + tkd.label + "'s StockGenerator_MultiDef")); thingList.RemoveAll(things.Contains); if (thingList.NullOrEmpty()) { tkd.stockGenerators.Remove(stockGenerator); } else { thingListTraverse.SetValue(thingList); } break; } } } DebugString.AppendLine("IncidentDef Removal List"); IEnumerable <IncidentDef> incidents = DefDatabase <IncidentDef> .AllDefs .Where(id => new[] { typeof (IncidentWorker_ShipChunkDrop ), AccessTools .TypeByName( "IncidentWorker_ShipPartCrash"), typeof (IncidentWorker_QuestJourneyOffer ), typeof (IncidentWorker_ResourcePodCrash ), //typeof(IncidentWorker_RefugeePodCrash), typeof(IncidentWorker_TransportPodCrash), typeof (IncidentWorker_PsychicDrone ), typeof (IncidentWorker_RansomDemand ), typeof (IncidentWorker_ShortCircuit ), typeof (IncidentWorker_OrbitalTraderArrival ), typeof (IncidentWorker_PsychicSoothe ) }.SelectMany( it => it .AllSubclassesNonAbstract() .Concat( it)) .ToArray() .Contains( id .workerClass) || new[] { "Disease_FibrousMechanites", "Disease_SensoryMechanites", "RaidEnemyEscapeShip", "StrangerInBlackJoin" }.Contains( id .defName)).ToList(); foreach (IncidentDef incident in incidents) { incident.targetTags?.Clear(); incident.baseChance = 0f; incident.allowedBiomes?.Clear(); incident.earliestDay = int.MaxValue; } RemoveStuffFromDatabase(typeof(DefDatabase <IncidentDef>), incidents.Cast <Def>()); DebugString.AppendLine("Replaced Ancient Asphalt Road / Ancient Asphalt Highway with Stone Road"); RoadDef[] targetRoads = { RoadDefOf.AncientAsphaltRoad, RoadDefOf.AncientAsphaltHighway }; RoadDef originalRoad = DefDatabase <RoadDef> .GetNamed("StoneRoad"); List <string> fieldNames = AccessTools.GetFieldNames(typeof(RoadDef)); fieldNames.Remove("defName"); foreach (FieldInfo fi in fieldNames.Select(name => AccessTools.Field(typeof(RoadDef), name))) { object fieldValue = fi.GetValue(originalRoad); foreach (RoadDef targetRoad in targetRoads) { fi.SetValue(targetRoad, fieldValue); } } DebugString.AppendLine("Special Hediff Removal List"); RemoveStuffFromDatabase(typeof(DefDatabase <HediffDef>), (hediffs = new[] { HediffDefOf.Gunshot }).Cast <Def>()); DebugString.AppendLine("RaidStrategyDef Removal List"); RemoveStuffFromDatabase(typeof(DefDatabase <RaidStrategyDef>), DefDatabase <RaidStrategyDef> .AllDefs .Where(rs => typeof(ScenPart_ThingCount).IsAssignableFrom(rs.workerClass)).Cast <Def>()); // ItemCollectionGeneratorUtility.allGeneratableItems.RemoveAll(match: things.Contains); // // foreach (Type type in typeof(ItemCollectionGenerator_Standard).AllSubclassesNonAbstract()) // type.GetMethod(name: "Reset")?.Invoke(obj: null, parameters: null); DebugString.AppendLine("ThingDef Removal List"); RemoveStuffFromDatabase(typeof(DefDatabase <ThingDef>), things.ToArray()); DebugString.AppendLine("ThingSetMaker Reset"); ThingSetMakerUtility.Reset(); DebugString.AppendLine("TraitDef Removal List"); RemoveStuffFromDatabase(typeof(DefDatabase <TraitDef>), // { nameof(TraitDefOf.Prosthophobe), "Prosthophile" } ? DefDatabase <TraitDef> .AllDefs .Where(td => new[] { nameof(TraitDefOf.BodyPurist), "Transhumanist" }.Contains(td.defName)) .Cast <Def>()); DebugString.AppendLine("Designators Resolved Again"); MethodInfo resolveDesignatorsAgain = typeof(DesignationCategoryDef).GetMethod("ResolveDesignators", BindingFlags.NonPublic | BindingFlags.Instance); foreach (DesignationCategoryDef dcd in DefDatabase <DesignationCategoryDef> .AllDefs) { resolveDesignatorsAgain?.Invoke(dcd, null); } DebugString.AppendLine("PawnKindDef Removal List"); RemoveStuffFromDatabase(typeof(DefDatabase <PawnKindDef>), DefDatabase <PawnKindDef> .AllDefs .Where(pkd => (!pkd.defaultFactionType?.isPlayer ?? false) && (pkd.race.techLevel > MAX_TECHLEVEL || pkd.defaultFactionType?.techLevel > MAX_TECHLEVEL) && !pkd.defName.EqualsIgnoreCase("Villager") && !pkd.defName.EqualsIgnoreCase("SpaceRefugee")) .Cast <Def>()); DebugString.AppendLine("FactionDef Removal List"); RemoveStuffFromDatabase(typeof(DefDatabase <FactionDef>), DefDatabase <FactionDef> .AllDefs.Where(fd => !fd.isPlayer && fd.techLevel > MAX_TECHLEVEL).Cast <Def>()); DebugString.AppendLine("BackstoryDef Removal List"); BackstoryHandler.RemoveIncompatibleBackstories(DebugString); DebugString.AppendLine("MapGeneratorDef Removal List"); DebugString.AppendLine("- GenStep_SleepingMechanoids"); DebugString.AppendLine("- GenStep_Turrets"); DebugString.AppendLine("- GenStep_Power"); foreach (MapGeneratorDef mgd in DefDatabase <MapGeneratorDef> .AllDefs) { mgd.genSteps.RemoveAll(gs => gs.genStep is GenStep_SleepingMechanoids || gs.genStep is GenStep_Turrets || gs.genStep is GenStep_Power); } DebugString.AppendLine("RuleDef Removal List"); DebugString.AppendLine("- SymbolResolver_AncientCryptosleepCasket"); DebugString.AppendLine("- SymbolResolver_ChargeBatteries"); DebugString.AppendLine("- SymbolResolver_EdgeMannedMortor"); DebugString.AppendLine("- SymbolResolver_FirefoamPopper"); DebugString.AppendLine("- SymbolResolver_MannedMortar"); DebugString.AppendLine("- SymbolResolver_"); foreach (RuleDef rd in DefDatabase <RuleDef> .AllDefs) { rd.resolvers.RemoveAll(sr => sr is SymbolResolver_AncientCryptosleepCasket || sr is SymbolResolver_ChargeBatteries || sr is SymbolResolver_EdgeMannedMortar || sr is SymbolResolver_FirefoamPopper || sr is SymbolResolver_MannedMortar || sr is SymbolResolver_OutdoorLighting); if (rd.resolvers.Count == 0) { rd.resolvers.Add(new SymbolResolver_AddWortToFermentingBarrels()); } } Log.Message("Removed " + removedDefs + " modern defs"); PawnWeaponGenerator.Reset(); PawnApparelGenerator.Reset(); Debug.Log(DebugString.ToString()); DebugString = new StringBuilder(); }
static RemoveMedievalStuff() { DebugString.AppendLine("RemoveMedievalStuff - Start Removal Log"); DebugString.AppendLine("Tech Max Level = " + MAX_TECHLEVEL); removedDefs = 0; IEnumerable <ResearchProjectDef> projects = new List <ResearchProjectDef>(); if (ModStuff.Settings.LimitResearch) { projects = DefDatabase <ResearchProjectDef> .AllDefs.Where(rpd => rpd.techLevel > MAX_TECHLEVEL); } if (ModStuff.Settings.LimitItems) { things = new HashSet <ThingDef>(DefDatabase <ThingDef> .AllDefs.Where(td => td.techLevel > MAX_TECHLEVEL || (td.researchPrerequisites?.Any(rpd => projects.Contains(rpd)) ?? false))); } DebugString.AppendLine("RecipeDef Removal List"); foreach (var thing in from thing in things where thing.tradeTags != null select thing) { var tags = thing.tradeTags.ToArray(); foreach (var tag in tags) { if (tag.StartsWith("CE_AutoEnableCrafting")) { thing.tradeTags.Remove(tag); } } } DebugString.AppendLine("ResearchProjectDef Removal List"); RemoveStuffFromDatabase(typeof(DefDatabase <ResearchProjectDef>), projects); DebugString.AppendLine("Scenario Part Removal List"); var getThingInfo = typeof(ScenPart_ThingCount).GetField("thingDef", BindingFlags.NonPublic | BindingFlags.Instance); foreach (var def in DefDatabase <ScenarioDef> .AllDefs) { foreach (var sp in def.scenario.AllParts) { if (!(sp is ScenPart_ThingCount) || !things.Contains((ThingDef)getThingInfo?.GetValue(sp))) { continue; } def.scenario.RemovePart(sp); DebugString.AppendLine("- " + sp.Label + " " + ((ThingDef)getThingInfo?.GetValue(sp))?.label + " from " + def.label); } } foreach (var thingCategoryDef in DefDatabase <ThingCategoryDef> .AllDefs) { thingCategoryDef.childThingDefs.RemoveAll(things.Contains); } DebugString.AppendLine("Stock Generator Part Cleanup"); foreach (var tkd in DefDatabase <TraderKindDef> .AllDefs) { for (var i = tkd.stockGenerators.Count - 1; i >= 0; i--) { var stockGenerator = tkd.stockGenerators[i]; switch (stockGenerator) { case StockGenerator_SingleDef sd when things.Contains(Traverse.Create(sd).Field("thingDef").GetValue <ThingDef>()): var def = Traverse.Create(sd).Field("thingDef").GetValue <ThingDef>(); tkd.stockGenerators.Remove(stockGenerator); DebugString.AppendLine("- " + def.label + " from " + tkd.label + "'s StockGenerator_SingleDef"); break; case StockGenerator_MultiDef md: var thingListTraverse = Traverse.Create(md).Field("thingDefs"); var thingList = thingListTraverse.GetValue <List <ThingDef> >(); var removeList = thingList.FindAll(things.Contains); removeList.ForEach(x => DebugString.AppendLine("- " + x.label + " from " + tkd.label + "'s StockGenerator_MultiDef")); thingList.RemoveAll(things.Contains); if (thingList.NullOrEmpty()) { tkd.stockGenerators.Remove(stockGenerator); } else { thingListTraverse.SetValue(thingList); } break; } } } DebugString.AppendLine("ThingDef Removal List"); RemoveStuffFromDatabase(typeof(DefDatabase <ThingDef>), things.ToArray()); DebugString.AppendLine("ThingSetMaker Reset"); ThingSetMakerUtility.Reset(); DebugString.AppendLine("Designators Resolved Again"); var resolveDesignatorsAgain = typeof(DesignationCategoryDef).GetMethod("ResolveDesignators", BindingFlags.NonPublic | BindingFlags.Instance); foreach (var dcd in DefDatabase <DesignationCategoryDef> .AllDefs) { resolveDesignatorsAgain?.Invoke(dcd, null); } if (ModStuff.Settings.LimitPawns) { DebugString.AppendLine("PawnKindDef Removal List"); RemoveStuffFromDatabase(typeof(DefDatabase <PawnKindDef>), DefDatabase <PawnKindDef> .AllDefs.Where(pkd => (!pkd.defaultFactionType?.isPlayer ?? false) && pkd.race.techLevel > MAX_TECHLEVEL)); } if (ModStuff.Settings.LimitFactions) { DebugString.AppendLine("FactionDef Removal List"); RemoveStuffFromDatabase(typeof(DefDatabase <FactionDef>), DefDatabase <FactionDef> .AllDefs.Where(fd => !fd.isPlayer && fd.techLevel > MAX_TECHLEVEL)); if (ModLister.RoyaltyInstalled) { var incident = DefDatabase <IncidentDef> .GetNamedSilentFail("CaravanArrivalTributeCollector"); if (incident != null) { RemoveStuffFromDatabase(typeof(DefDatabase <IncidentDef>), new List <Def> { incident }); } } // foreach (var factionDef in DefDatabase<FactionDef>.AllDefs.Where(fd => !fd.isPlayer && fd.techLevel > MAX_TECHLEVEL)) // { // factionDef.hidden = true; // factionDef.canMakeRandomly = false; // factionDef.maxCountAtGameStart = 0; // } } if (ModStuff.Settings.LogRemovals) { Log.Message(DebugString.ToString()); } else { Log.Message("Removed " + removedDefs + " industrial defs"); } PawnWeaponGenerator.Reset(); PawnApparelGenerator.Reset(); Debug.Log(DebugString.ToString()); DebugString = new StringBuilder(); }
private static void GenerateGearFor(Pawn pawn, PawnGenerationRequest request) { PawnApparelGenerator.GenerateStartingApparelFor(pawn, request); PawnWeaponGenerator.TryGenerateWeaponFor(pawn); PawnInventoryGenerator.GenerateInventoryFor(pawn, request); }
private static void PawnKindApparelCheck() { List <DebugMenuOption> list = new List <DebugMenuOption>(); foreach (PawnKindDef item in from kd in DefDatabase <PawnKindDef> .AllDefs where kd.race == ThingDefOf.Human orderby kd.defName select kd) { PawnKindDef localKindDef = item; list.Add(new DebugMenuOption(localKindDef.defName, DebugMenuOptionMode.Action, delegate { Faction faction = FactionUtility.DefaultFactionFrom(localKindDef.defaultFactionType); bool flag = false; for (int k = 0; k < 100; k++) { Pawn pawn2 = PawnGenerator.GeneratePawn(localKindDef, faction); if (pawn2.royalty != null) { RoyalTitle mostSeniorTitle2 = pawn2.royalty.MostSeniorTitle; if (mostSeniorTitle2 != null && !mostSeniorTitle2.def.requiredApparel.NullOrEmpty()) { for (int l = 0; l < mostSeniorTitle2.def.requiredApparel.Count; l++) { if (!mostSeniorTitle2.def.requiredApparel[l].IsMet(pawn2)) { Log.Error(localKindDef + " (" + mostSeniorTitle2.def.label + ") does not have its title requirements met. index=" + l + logApparel(pawn2)); flag = true; } } } } List <Apparel> wornApparel2 = pawn2.apparel.WornApparel; for (int m = 0; m < wornApparel2.Count; m++) { string text = apparelOkayToWear(pawn2, wornApparel2[m]); if (text != "OK") { Log.Error(text + " - " + wornApparel2[m].Label + logApparel(pawn2)); flag = true; } } Find.WorldPawns.PassToWorld(pawn2, PawnDiscardDecideMode.Discard); } if (!flag) { Log.Message("No errors for " + localKindDef.defName); } })); } Find.WindowStack.Add(new Dialog_DebugOptionListLister(list)); string apparelOkayToWear(Pawn pawn, Apparel apparel) { ApparelProperties app = apparel.def.apparel; if (!pawn.kindDef.apparelRequired.NullOrEmpty() && pawn.kindDef.apparelRequired.Contains(apparel.def)) { return("OK"); } if (!app.CorrectGenderForWearing(pawn.gender)) { return("Wrong gender."); } List <SpecificApparelRequirement> specificApparelRequirements = pawn.kindDef.specificApparelRequirements; if (specificApparelRequirements != null) { for (int i = 0; i < specificApparelRequirements.Count; i++) { if (PawnApparelGenerator.ApparelRequirementHandlesThing(specificApparelRequirements[i], apparel.def) && PawnApparelGenerator.ApparelRequirementTagsMatch(specificApparelRequirements[i], apparel.def)) { return("OK"); } } } if (!pawn.kindDef.apparelTags.NullOrEmpty()) { if (!app.tags.Any((string tag) => pawn.kindDef.apparelTags.Contains(tag))) { return("Required tag missing."); } if ((pawn.royalty == null || pawn.royalty.MostSeniorTitle == null) && app.tags.Contains("Royal") && !pawn.kindDef.apparelTags.Any((string tag) => app.tags.Contains(tag))) { return("Royal apparel on non-royal pawn."); } } if (!pawn.kindDef.apparelDisallowTags.NullOrEmpty() && pawn.kindDef.apparelDisallowTags.Any((string t) => app.tags.Contains(t))) { return("Has a disallowed tag."); } if (pawn.royalty != null && pawn.royalty.AllTitlesInEffectForReading.Any()) { RoyalTitle mostSeniorTitle = pawn.royalty.MostSeniorTitle; if (apparel.TryGetQuality(out QualityCategory qc) && (int)qc < (int)mostSeniorTitle.def.requiredMinimumApparelQuality) { return("Quality too low."); } } return("OK"); } string logApparel(Pawn p) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine(); stringBuilder.AppendLine($"Apparel of {p.LabelShort}:"); List <Apparel> wornApparel = p.apparel.WornApparel; for (int j = 0; j < wornApparel.Count; j++) { stringBuilder.AppendLine(" - " + wornApparel[j].Label); } return(stringBuilder.ToString()); } }
private static Pawn GenerateNewTenant() { var generation = true; Pawn newTenant = null; var currentRaces = SettingsHelper.LatestVersion.AvailableRaces; if (currentRaces == null || currentRaces.Count == 0) { currentRaces = DefDatabase <PawnKindDef> .AllDefsListForReading .Where(x => x.race != null && x.RaceProps.Humanlike && x.RaceProps.IsFlesh && x.RaceProps.ResolvedDietCategory != DietCategory.NeverEats).Select(s => s.race.defName) .Distinct().ToList(); } while (generation) { var race = currentRaces.RandomElement(); var random = DefDatabase <PawnKindDef> .AllDefsListForReading.Where(x => x.race.defName == race) .RandomElement(); if (random == null) { return(null); } var faction = FactionUtility.DefaultFactionFrom(random.defaultFactionType); if (faction == null) { continue; } if (faction.def.pawnGroupMakers.NullOrEmpty()) { continue; } newTenant = PawnGenerator.GeneratePawn(random, faction); if (newTenant == null || newTenant.Dead || newTenant.IsDessicated() || newTenant.AnimalOrWildMan()) { continue; } if (newTenant.royalty != null && !SettingsHelper.LatestVersion.RoyaltyTenants && (newTenant.royalty.CanRequireBedroom() || newTenant.royalty.CanRequireThroneroom())) { continue; } if (SettingsHelper.LatestVersion.SimpleClothing) { var range = newTenant.kindDef.apparelMoney; newTenant.kindDef.apparelMoney = new FloatRange(SettingsHelper.LatestVersion.SimpleClothingMin, SettingsHelper.LatestVersion.SimpleClothingMax); PawnApparelGenerator.GenerateStartingApparelFor(newTenant, new PawnGenerationRequest(random)); newTenant.kindDef.apparelMoney = range; } RemoveExpensiveItems(newTenant); newTenant.GetTenantComponent().IsTenant = true; newTenant.GetTenantComponent().HiddenFaction = faction; newTenant.SetFaction(null); if (SettingsHelper.LatestVersion.Weapons) { var ammo = newTenant.inventory.innerContainer.Where(x => x.def.defName.Contains("Ammunition")) .ToList(); foreach (var thing in ammo) { newTenant.inventory.innerContainer.Remove(thing); } } newTenant.DestroyOrPassToWorld(); generation = false; } return(newTenant); }
static RemoveSpacerStuff() { DebugString.AppendLine("RemoveSpacerStuff - Start Removal Log"); DebugString.AppendLine("Tech Max Level = " + MAX_TECHLEVEL); removedDefs = 0; IEnumerable <ResearchProjectDef> projects = new List <ResearchProjectDef>(); if (ModStuff.Settings.LimitResearch) { projects = DefDatabase <ResearchProjectDef> .AllDefs.Where(rpd => rpd.techLevel > MAX_TECHLEVEL); } if (ModStuff.Settings.LimitItems) { things = new HashSet <ThingDef>(DefDatabase <ThingDef> .AllDefs.Where(td => td.techLevel > MAX_TECHLEVEL || (td.researchPrerequisites?.Any(rpd => projects.Contains(rpd)) ?? false))); } DebugString.AppendLine("RecipeDef Removal List"); foreach (var thing in from thing in things where thing.tradeTags != null select thing) { var tags = thing.tradeTags.ToArray(); foreach (var tag in tags) { if (tag.StartsWith("CE_AutoEnableCrafting")) { thing.tradeTags.Remove(tag); } } } //var recipeDefsToRemove = DefDatabase<RecipeDef>.AllDefs.Where(rd => // rd.products.Any(tcc => things.Contains(tcc.thingDef)) || // rd.AllRecipeUsers.All(td => things.Contains(td)) || // projects.Contains(rd.researchPrerequisite)).Cast<Def>().ToList(); //recipeDefsToRemove?.RemoveAll(x => // x.defName == "ExtractMetalFromSlag" || // x.defName == "SmeltWeapon" || // x.defName == "DestroyWeapon" || // x.defName == "OfferingOfPlants_Meagre" || // x.defName == "OfferingOfPlants_Decent" || // x.defName == "OfferingOfPlants_Sizable" || // x.defName == "OfferingOfPlants_Worthy" || // x.defName == "OfferingOfPlants_Impressive" || // x.defName == "OfferingOfMeat_Meagre" || // x.defName == "OfferingOfMeat_Decent" || // x.defName == "OfferingOfMeat_Sizable" || // x.defName == "OfferingOfMeat_Worthy" || // x.defName == "OfferingOfMeat_Impressive" || // x.defName == "OfferingOfMeals_Meagre" || // x.defName == "OfferingOfMeals_Decent" || // x.defName == "OfferingOfMeals_Sizable" || // x.defName == "OfferingOfMeals_Worthy" || // x.defName == "OfferingOfMeals_Impressive" || // x.defName == "ROMV_ExtractBloodVial" || // x.defName == "ROMV_ExtractBloodPack" // ); //RemoveStuffFromDatabase(typeof(DefDatabase<RecipeDef>), recipeDefsToRemove); DebugString.AppendLine("ResearchProjectDef Removal List"); RemoveStuffFromDatabase(typeof(DefDatabase <ResearchProjectDef>), projects); DebugString.AppendLine("Scenario Part Removal List"); var getThingInfo = typeof(ScenPart_ThingCount).GetField("thingDef", BindingFlags.NonPublic | BindingFlags.Instance); foreach (var def in DefDatabase <ScenarioDef> .AllDefs) { foreach (var sp in def.scenario.AllParts) { if (!(sp is ScenPart_ThingCount) || !things.Contains((ThingDef)getThingInfo?.GetValue(sp))) { continue; } def.scenario.RemovePart(sp); DebugString.AppendLine("- " + sp.Label + " " + ((ThingDef)getThingInfo?.GetValue(sp))?.label + " from " + def.label); } } foreach (var thingCategoryDef in DefDatabase <ThingCategoryDef> .AllDefs) { thingCategoryDef.childThingDefs.RemoveAll(things.Contains); } DebugString.AppendLine("Stock Generator Part Cleanup"); foreach (var tkd in DefDatabase <TraderKindDef> .AllDefs) { for (var i = tkd.stockGenerators.Count - 1; i >= 0; i--) { var stockGenerator = tkd.stockGenerators[i]; switch (stockGenerator) { case StockGenerator_SingleDef sd when things.Contains(Traverse.Create(sd).Field("thingDef") .GetValue <ThingDef>()): var def = Traverse.Create(sd).Field("thingDef") .GetValue <ThingDef>(); tkd.stockGenerators.Remove(stockGenerator); DebugString.AppendLine("- " + def.label + " from " + tkd.label + "'s StockGenerator_SingleDef"); break; case StockGenerator_MultiDef md: var thingListTraverse = Traverse.Create(md).Field("thingDefs"); var thingList = thingListTraverse.GetValue <List <ThingDef> >(); var removeList = thingList.FindAll(things.Contains); removeList.ForEach(x => DebugString.AppendLine("- " + x.label + " from " + tkd.label + "'s StockGenerator_MultiDef")); thingList.RemoveAll(things.Contains); if (thingList.NullOrEmpty()) { tkd.stockGenerators.Remove(stockGenerator); } else { thingListTraverse.SetValue(thingList); } break; } } } //DebugString.AppendLine("IncidentDef Removal List"); //var removedDefNames = new List<string> //{ // "Disease_FibrousMechanites", // "Disease_SensoryMechanites", // "ResourcePodCrash", // "PsychicSoothe", // "RefugeePodCrash", // "RansomDemand", // "MeteoriteImpact", // "PsychicDrone", // "ShortCircuit", // "ShipChunkDrop", // "OrbitalTraderArrival", // "StrangerInBlackJoin", // "DefoliatorShipPartCrash", // "PsychicEmanatorShipPartCrash", // "MechCluster", // "AnimalInsanityMass" //}; //IEnumerable<IncidentDef> incidents = from IncidentDef incident in DefDatabase<IncidentDef>.AllDefs // where removedDefNames.Contains(incident.defName) // select incident; //foreach (IncidentDef incident in incidents) //{ // incident.targetTags?.Clear(); // incident.baseChance = 0f; // incident.allowedBiomes?.Clear(); // incident.earliestDay = int.MaxValue; //} //RemoveStuffFromDatabase(typeof(DefDatabase<IncidentDef>), incidents.Cast<Def>()); //DebugString.AppendLine("Replaced Ancient Asphalt Road / Ancient Asphalt Highway with Stone Road"); //RoadDef[] targetRoads = { RoadDefOf.AncientAsphaltRoad, RoadDefOf.AncientAsphaltHighway }; //RoadDef originalRoad = DefDatabase<RoadDef>.GetNamed("StoneRoad"); //List<string> fieldNames = AccessTools.GetFieldNames(typeof(RoadDef)); //fieldNames.Remove("defName"); //foreach (FieldInfo fi in fieldNames.Select(name => AccessTools.Field(typeof(RoadDef), name))) //{ // object fieldValue = fi.GetValue(originalRoad); // foreach (RoadDef targetRoad in targetRoads) fi.SetValue(targetRoad, fieldValue); //} //DebugString.AppendLine("Special Hediff Removal List"); //RemoveStuffFromDatabase(typeof(DefDatabase<HediffDef>), (hediffs = new[] { HediffDefOf.Gunshot }).Cast<Def>()); //DebugString.AppendLine("RaidStrategyDef Removal List"); //RemoveStuffFromDatabase(typeof(DefDatabase<RaidStrategyDef>), // DefDatabase<RaidStrategyDef>.AllDefs // .Where(rs => typeof(ScenPart_ThingCount).IsAssignableFrom(rs.workerClass)).Cast<Def>()); //// ItemCollectionGeneratorUtility.allGeneratableItems.RemoveAll(match: things.Contains); //// //// foreach (Type type in typeof(ItemCollectionGenerator_Standard).AllSubclassesNonAbstract()) //// type.GetMethod(name: "Reset")?.Invoke(obj: null, parameters: null); DebugString.AppendLine("ThingDef Removal List"); RemoveStuffFromDatabase(typeof(DefDatabase <ThingDef>), things.ToArray()); DebugString.AppendLine("ThingSetMaker Reset"); ThingSetMakerUtility.Reset(); //DebugString.AppendLine("TraitDef Removal List"); //RemoveStuffFromDatabase(typeof(DefDatabase<TraitDef>), // // { nameof(TraitDefOf.Prosthophobe), "Prosthophile" } ? // DefDatabase<TraitDef>.AllDefs // .Where(td => new[] { nameof(TraitDefOf.BodyPurist), "Transhumanist" }.Contains(td.defName)) // .Cast<Def>()); DebugString.AppendLine("Designators Resolved Again"); var resolveDesignatorsAgain = typeof(DesignationCategoryDef).GetMethod("ResolveDesignators", BindingFlags.NonPublic | BindingFlags.Instance); foreach (var dcd in DefDatabase <DesignationCategoryDef> .AllDefs) { resolveDesignatorsAgain?.Invoke(dcd, null); } if (ModStuff.Settings.LimitPawns) { DebugString.AppendLine("PawnKindDef Removal List"); RemoveStuffFromDatabase(typeof(DefDatabase <PawnKindDef>), DefDatabase <PawnKindDef> .AllDefs .Where(pkd => (!pkd.defaultFactionType?.isPlayer ?? false) && (pkd.race.techLevel > MAX_TECHLEVEL || pkd.defaultFactionType?.techLevel > MAX_TECHLEVEL))); } if (ModStuff.Settings.LimitFactions) { DebugString.AppendLine("FactionDef Removal List"); RemoveStuffFromDatabase(typeof(DefDatabase <FactionDef>), DefDatabase <FactionDef> .AllDefs.Where(fd => !fd.isPlayer && fd.techLevel > MAX_TECHLEVEL)); if (ModLister.RoyaltyInstalled) { var incident = DefDatabase <IncidentDef> .GetNamedSilentFail("CaravanArrivalTributeCollector"); if (incident != null) { RemoveStuffFromDatabase(typeof(DefDatabase <IncidentDef>), new List <Def> { incident }); } } } if (ModStuff.Settings.LogRemovals) { Log.Message(DebugString.ToString()); } else { Log.Message("Removed " + removedDefs + " spacer defs"); } PawnWeaponGenerator.Reset(); PawnApparelGenerator.Reset(); Debug.Log(DebugString.ToString()); DebugString = new StringBuilder(); }
private static void DoPlayLoad() { DeepProfiler.Start("GraphicDatabase.Clear()"); try { GraphicDatabase.Clear(); } finally { DeepProfiler.End(); } DeepProfiler.Start("Load all active mods."); try { LoadedModManager.LoadAllActiveMods(); } finally { DeepProfiler.End(); } DeepProfiler.Start("Load language metadata."); try { LanguageDatabase.InitAllMetadata(); } finally { DeepProfiler.End(); } LongEventHandler.SetCurrentEventText("LoadingDefs".Translate()); DeepProfiler.Start("Copy all Defs from mods to global databases."); try { foreach (Type item in typeof(Def).AllSubclasses()) { GenGeneric.InvokeStaticMethodOnGenericType(typeof(DefDatabase <>), item, "AddAllInMods"); } } finally { DeepProfiler.End(); } DeepProfiler.Start("Resolve cross-references between non-implied Defs."); try { DirectXmlCrossRefLoader.ResolveAllWantedCrossReferences(FailMode.Silent); } finally { DeepProfiler.End(); } DeepProfiler.Start("Rebind defs (early)."); try { DefOfHelper.RebindAllDefOfs(earlyTryMode: true); } finally { DeepProfiler.End(); } DeepProfiler.Start("TKeySystem.BuildMappings()"); try { TKeySystem.BuildMappings(); } finally { DeepProfiler.End(); } DeepProfiler.Start("Inject selected language data into game data (early pass)."); try { LanguageDatabase.activeLanguage.InjectIntoData_BeforeImpliedDefs(); } finally { DeepProfiler.End(); } DeepProfiler.Start("Generate implied Defs (pre-resolve)."); try { DefGenerator.GenerateImpliedDefs_PreResolve(); } finally { DeepProfiler.End(); } DeepProfiler.Start("Resolve cross-references between Defs made by the implied defs."); try { DirectXmlCrossRefLoader.ResolveAllWantedCrossReferences(FailMode.LogErrors); } finally { DirectXmlCrossRefLoader.Clear(); DeepProfiler.End(); } DeepProfiler.Start("Rebind DefOfs (final)."); try { DefOfHelper.RebindAllDefOfs(earlyTryMode: false); } finally { DeepProfiler.End(); } DeepProfiler.Start("Other def binding, resetting and global operations (pre-resolve)."); try { PlayerKnowledgeDatabase.ReloadAndRebind(); LessonAutoActivator.Reset(); CostListCalculator.Reset(); Pawn.ResetStaticData(); PawnApparelGenerator.Reset(); RestUtility.Reset(); ThoughtUtility.Reset(); ThinkTreeKeyAssigner.Reset(); ThingCategoryNodeDatabase.FinalizeInit(); TrainableUtility.Reset(); HaulAIUtility.Reset(); GenConstruct.Reset(); MedicalCareUtility.Reset(); InspectPaneUtility.Reset(); GraphicDatabaseHeadRecords.Reset(); DateReadout.Reset(); ResearchProjectDef.GenerateNonOverlappingCoordinates(); BaseGen.Reset(); ResourceCounter.ResetDefs(); ApparelProperties.ResetStaticData(); WildPlantSpawner.ResetStaticData(); PawnGenerator.Reset(); TunnelHiveSpawner.ResetStaticData(); Hive.ResetStaticData(); ExpectationsUtility.Reset(); WealthWatcher.ResetStaticData(); SkillUI.Reset(); QuestNode_GetThingPlayerCanProduce.ResetStaticData(); Pawn_PsychicEntropyTracker.ResetStaticData(); ColoredText.ResetStaticData(); QuestNode_GetRandomNegativeGameCondition.ResetStaticData(); RoyalTitleUtility.ResetStaticData(); RewardsGenerator.ResetStaticData(); WorkGiver_FillFermentingBarrel.ResetStaticData(); WorkGiver_DoBill.ResetStaticData(); WorkGiver_InteractAnimal.ResetStaticData(); WorkGiver_Warden_DoExecution.ResetStaticData(); WorkGiver_GrowerSow.ResetStaticData(); WorkGiver_Miner.ResetStaticData(); WorkGiver_FixBrokenDownBuilding.ResetStaticData(); WorkGiver_ConstructDeliverResources.ResetStaticData(); } finally { DeepProfiler.End(); } DeepProfiler.Start("Resolve references."); try { DeepProfiler.Start("ThingCategoryDef resolver"); try { DefDatabase <ThingCategoryDef> .ResolveAllReferences(); } finally { DeepProfiler.End(); } DeepProfiler.Start("RecipeDef resolver"); try { DeepProfiler.enabled = false; DefDatabase <RecipeDef> .ResolveAllReferences(onlyExactlyMyType : true, parallel : true); DeepProfiler.enabled = true; } finally { DeepProfiler.End(); } DeepProfiler.Start("Static resolver calls"); try { foreach (Type item2 in typeof(Def).AllSubclasses()) { if (!(item2 == typeof(ThingDef)) && !(item2 == typeof(ThingCategoryDef)) && !(item2 == typeof(RecipeDef))) { GenGeneric.InvokeStaticMethodOnGenericType(typeof(DefDatabase <>), item2, "ResolveAllReferences", true, false); } } } finally { DeepProfiler.End(); } DeepProfiler.Start("ThingDef resolver"); try { DefDatabase <ThingDef> .ResolveAllReferences(); } finally { DeepProfiler.End(); } } finally { DeepProfiler.End(); } DeepProfiler.Start("Generate implied Defs (post-resolve)."); try { DefGenerator.GenerateImpliedDefs_PostResolve(); } finally { DeepProfiler.End(); } DeepProfiler.Start("Other def binding, resetting and global operations (post-resolve)."); try { PawnWeaponGenerator.Reset(); BuildingProperties.FinalizeInit(); ThingSetMakerUtility.Reset(); } finally { DeepProfiler.End(); } if (Prefs.DevMode) { DeepProfiler.Start("Error check all defs."); try { foreach (Type item3 in typeof(Def).AllSubclasses()) { GenGeneric.InvokeStaticMethodOnGenericType(typeof(DefDatabase <>), item3, "ErrorCheckAllDefs"); } } finally { DeepProfiler.End(); } } LongEventHandler.SetCurrentEventText("Initializing".Translate()); DeepProfiler.Start("Load keyboard preferences."); try { KeyPrefs.Init(); } finally { DeepProfiler.End(); } DeepProfiler.Start("Short hash giving."); try { ShortHashGiver.GiveAllShortHashes(); } finally { DeepProfiler.End(); } LongEventHandler.ExecuteWhenFinished(delegate { DeepProfiler.Start("Load backstories."); try { BackstoryDatabase.ReloadAllBackstories(); } finally { DeepProfiler.End(); } }); LongEventHandler.ExecuteWhenFinished(delegate { DeepProfiler.Start("Inject selected language data into game data."); try { LanguageDatabase.activeLanguage.InjectIntoData_AfterImpliedDefs(); GenLabel.ClearCache(); } finally { DeepProfiler.End(); } }); LongEventHandler.ExecuteWhenFinished(delegate { DeepProfiler.Start("Static constructor calls"); try { StaticConstructorOnStartupUtility.CallAll(); if (Prefs.DevMode) { StaticConstructorOnStartupUtility.ReportProbablyMissingAttributes(); } } finally { DeepProfiler.End(); } DeepProfiler.Start("Garbage Collection"); try { AbstractFilesystem.ClearAllCache(); GC.Collect(int.MaxValue, GCCollectionMode.Forced); } finally { DeepProfiler.End(); } }); }