public override void Notify_GeneratedByQuestGen(SitePart part, Slate slate, List <Rule> outExtraDescriptionRules, Dictionary <string, string> outExtraDescriptionConstants) { base.Notify_GeneratedByQuestGen(part, slate, outExtraDescriptionRules, outExtraDescriptionConstants); string label = part.conditionCauser.TryGetComp <CompCauseGameCondition_PsychicSuppression>().gender.GetLabel(); outExtraDescriptionRules.Add(new Rule_String("affectedGender", label)); }
public override void Notify_GeneratedByQuestGen(SitePart part, Slate slate, List <Rule> outExtraDescriptionRules, Dictionary <string, string> outExtraDescriptionConstants) { // Duplicate code so modularize in Util Util.SitePartWorker_Base_Notify_GeneratedByQuestGen(part, outExtraDescriptionRules, outExtraDescriptionConstants); // Replaces PrisonerWillingToJoinQuestUtility.GeneratePrisoner Pawn pawn = GameComponent.GetRandomAllyForSpawning(); pawn.guest.SetGuestStatus(part.site.Faction, true); Util.DressPawnIfCold(pawn, part.site.Tile); part.things = new ThingOwner <Pawn>(part, true, LookMode.Deep); part.things.TryAdd(pawn, true); string text; PawnRelationUtility.Notify_PawnsSeenByPlayer(Gen.YieldSingle <Pawn>(pawn), out text, true, false); outExtraDescriptionRules.AddRange(GrammarUtility.RulesForPawn("prisoner", pawn, outExtraDescriptionConstants, true, true)); string output; if (!text.NullOrEmpty()) { output = "\n\n" + "PawnHasTheseRelationshipsWithColonists".Translate(pawn.LabelShort, pawn) + "\n\n" + text; } else { output = ""; } outExtraDescriptionRules.Add(new Rule_String("prisonerFullRelationInfo", output)); }
public override void Notify_GeneratedByQuestGen(SitePart part, Slate slate, List <Rule> outExtraDescriptionRules, Dictionary <string, string> outExtraDescriptionConstants) { base.Notify_GeneratedByQuestGen(part, slate, outExtraDescriptionRules, outExtraDescriptionConstants); string output = part.conditionCauser.TryGetComp <CompCauseGameCondition_TemperatureOffset>().temperatureOffset.ToStringTemperatureOffset(); outExtraDescriptionRules.Add(new Rule_String("temperatureOffset", output)); }
public override void Notify_GeneratedByQuestGen(SitePart part, Slate slate, List <Rule> outExtraDescriptionRules, Dictionary <string, string> outExtraDescriptionConstants) { base.Notify_GeneratedByQuestGen(part, slate, outExtraDescriptionRules, outExtraDescriptionConstants); string threatsInfo_NewTmp = GetThreatsInfo_NewTmp(part.parms, part.site.Faction); outExtraDescriptionRules.Add(new Rule_String("threatsInfo", threatsInfo_NewTmp)); }
public override void GenerateFresh(string seed) { var worldobjects = DefDatabase<WorldObjectDef>.AllDefsListForReading.FindAll(wo => wo.HasModExtension<SpawnAtWorldGen>()); foreach (var worldObject in worldobjects) { SpawnAtWorldGen ext = worldObject.GetModExtension<SpawnAtWorldGen>(); for (int i = 0; i < ext.spawnCount; i++) { Site wo = (Site)WorldObjectMaker.MakeWorldObject(worldObject); // Set faction if (ext.spawnPartOfFaction != null) wo.SetFaction(Find.FactionManager.FirstFactionOfDef(ext.spawnPartOfFaction)); // Find tile wo.Tile = RandomTileFor(wo, ext, 500); // Parts SitePartParams parms = new SitePartParams { points = 500f }; foreach (var part in ext.parts) { SitePart sitePart = new SitePart(wo, part, parms); wo.AddPart(sitePart); } Find.WorldObjects.Add(wo); } } }
public static void OnPostDestroyReschedule(SitePart sitePart) { // If recruited, will have been flagged on map generate: schedule will fire on DoRecruit // If abandoned but pawn alive, also will have been flagged on map generate: schedule will fire on PassToWorld // If quest failed without entering the map, flag here: schedule will fire on PassToWorld if (GameComponent.NextEventTick == -1) { GameComponent.FlagNextEventReadyForScheduling(); } if (sitePart.things != null && sitePart.things.Any) { Pawn pawn = (Pawn)sitePart.things[0]; // If pawn is dead on post destroy: schedule it HERE! if (pawn.Dead) { GameComponent.TryScheduleNextEvent(); } } // No "thing" in SitePart, pawn is recruited, or something else happened. // As mentioned above, if recruited, schedule will already have fired on DoRecruit. // If not recruited for whatever reason (likely dead, according to tests): schedule it HERE! else if (GameComponent.NextEventTick == 0) { GameComponent.TryScheduleNextEvent(); } }
public static bool ItemStashHas(ThingDef thingDef) { List <Site> sites = Find.WorldObjects.Sites; for (int i = 0; i < sites.Count; i++) { Site site = sites[i]; for (int j = 0; j < site.parts.Count; j++) { SitePart sitePart = site.parts[j]; if (sitePart.things == null) { continue; } for (int k = 0; k < sitePart.things.Count; k++) { if (sitePart.things[k].def == thingDef) { return(true); } } } } return(false); }
public override void Notify_GeneratedByQuestGen(SitePart part, Slate slate, List <Rule> outExtraDescriptionRules, Dictionary <string, string> outExtraDescriptionConstants) { base.Notify_GeneratedByQuestGen(part, slate, outExtraDescriptionRules, outExtraDescriptionConstants); WeatherDef weather = part.conditionCauser.TryGetComp <CompCauseGameCondition_ForceWeather>().weather; outExtraDescriptionRules.AddRange(GrammarUtility.RulesForDef("weather", weather)); }
public override void SitePartWorkerTick(SitePart sitePart) { if (!sitePart.conditionCauser.DestroyedOrNull() && !sitePart.conditionCauser.Spawned) { sitePart.conditionCauser.Tick(); } }
private void GetLetterText(Pawn prisoner, Site site, SitePart sitePart, int days, out string letter, out string label) { letter = this.def.letterText.Formatted(site.Faction.Name, prisoner.ageTracker.AgeBiologicalYears, prisoner.story.Title, SitePartUtility.GetDescriptionDialogue(site, sitePart), prisoner.Named("PAWN")).AdjustedFor(prisoner, "PAWN").CapitalizeFirst(); if (PawnUtility.EverBeenColonistOrTameAnimal(prisoner)) { letter = letter + "\n\n" + "PawnWasFormerlyColonist".Translate(prisoner.LabelShort, prisoner); } string text; PawnRelationUtility.Notify_PawnsSeenByPlayer(Gen.YieldSingle <Pawn>(prisoner), out text, true, false); label = this.def.letterLabel; if (!text.NullOrEmpty()) { string text2 = letter; letter = string.Concat(new string[] { text2, "\n\n", "PawnHasTheseRelationshipsWithColonists".Translate(prisoner.LabelShort, prisoner), "\n\n", text }); label = label + " " + "RelationshipAppendedLetterSuffix".Translate(); } letter = letter + "\n\n" + "PrisonerRescueTimeout".Translate(days, prisoner.LabelShort, prisoner.Named("PRISONER")); }
protected override bool TryExecuteWorker(IncidentParms parms) { Caravan caravan = parms.target as Caravan; bool result; if (caravan == null) { result = false; } else { int tile; Site site = (Site)WorldObjectMaker.MakeWorldObject(SiteDefOfReconAndDiscovery.RD_Adventure); TileFinder.TryFindPassableTileWithTraversalDistance(caravan.Tile, 1, 2, out tile, (int t) => !Find.WorldObjects.AnyMapParentAt(t), false); site.Tile = tile; Faction faction = Find.FactionManager.RandomEnemyFaction(true, false, true, TechLevel.Spacer); site.SetFaction(faction); site.AddPart(new SitePart(site, SiteDefOfReconAndDiscovery.RD_AbandonedColony, SiteDefOfReconAndDiscovery.RD_AbandonedColony.Worker.GenerateDefaultParams(StorytellerUtility.DefaultSiteThreatPointsNow(), tile, faction))); SitePart holoDisk = new SitePart(site, SiteDefOfReconAndDiscovery.RD_HoloDisk, SiteDefOfReconAndDiscovery.RD_HoloDisk.Worker.GenerateDefaultParams(StorytellerUtility.DefaultSiteThreatPointsNow(), tile, faction)); holoDisk.hidden = true; site.parts.Add(holoDisk); if (Rand.Value < 0.3f) { SitePart scatteredManhunters = new SitePart(site, SiteDefOfReconAndDiscovery.RD_ScatteredManhunters, SiteDefOfReconAndDiscovery.RD_ScatteredManhunters.Worker.GenerateDefaultParams (StorytellerUtility.DefaultSiteThreatPointsNow(), tile, faction)); scatteredManhunters.hidden = true; site.parts.Add(scatteredManhunters); } if (Rand.Value < 0.1f) { SitePart mechanoidForces = new SitePart(site, SiteDefOfReconAndDiscovery.RD_MechanoidForces, SiteDefOfReconAndDiscovery.RD_MechanoidForces.Worker.GenerateDefaultParams (StorytellerUtility.DefaultSiteThreatPointsNow(), tile, faction)); mechanoidForces.hidden = true; site.parts.Add(mechanoidForces); } if (Rand.Value < 0.05f) { SitePart stargate = new SitePart(site, SiteDefOfReconAndDiscovery.RD_Stargate, SiteDefOfReconAndDiscovery.RD_Stargate.Worker.GenerateDefaultParams (StorytellerUtility.DefaultSiteThreatPointsNow(), tile, faction)); stargate.hidden = true; site.parts.Add(stargate); } Find.WorldObjects.Add(site); if (site == null) { result = false; } else { base.SendStandardLetter(parms, caravan); result = true; } } return(result); }
public override void Notify_GeneratedByQuestGen(SitePart part, Slate slate, List <Rule> outExtraDescriptionRules, Dictionary <string, string> outExtraDescriptionConstants) { base.Notify_GeneratedByQuestGen(part, slate, outExtraDescriptionRules, outExtraDescriptionConstants); int mechanoidsCount = GetMechanoidsCount(part.site, part.parms); outExtraDescriptionRules.Add(new Rule_String("count", mechanoidsCount.ToString())); outExtraDescriptionConstants.Add("count", mechanoidsCount.ToString()); }
public override string GetPostProcessedThreatLabel(Site site, SitePart siteCoreOrPart) { return(string.Concat(base.GetPostProcessedThreatLabel(site, siteCoreOrPart), " (", GenLabel.BestKindLabel(siteCoreOrPart.parms.animalKind, Gender.None, true), ")" )); }
public static string GetDescriptionDialogue(Site site, SitePart sitePart) { if (sitePart != null && !sitePart.def.alwaysHidden) { return(sitePart.def.Worker.GetPostProcessedDescriptionDialogue(site, sitePart)); } return("HiddenOrNoSitePartDescription".Translate()); }
public override void Notify_GeneratedByQuestGen(SitePart part, Slate slate, List <Rule> outExtraDescriptionRules, Dictionary <string, string> outExtraDescriptionConstants) { base.Notify_GeneratedByQuestGen(part, slate, outExtraDescriptionRules, outExtraDescriptionConstants); var asker = slate.Get <Pawn>("asker"); var site = part.ParentHolder as Site; site.SetFaction(asker.Faction); }
public override void Init(Site site, SitePart sitePart) { sitePart.conditionCauser = ThingMaker.MakeThing(sitePart.def.conditionCauserDef); CompCauseGameCondition compCauseGameCondition = sitePart.conditionCauser.TryGetComp <CompCauseGameCondition>(); compCauseGameCondition.RandomizeSettings(); compCauseGameCondition.LinkWithSite(sitePart.site); }
public override string GetPostProcessedThreatLabel(Site site, SitePart sitePart) { if (site.MainSitePartDef == SitePartDefOf.PreciousLump) { return(null); } return(base.GetPostProcessedThreatLabel(site, sitePart)); }
public override void Notify_SiteMapAboutToBeRemoved(SitePart sitePart) { base.Notify_SiteMapAboutToBeRemoved(sitePart); if (!sitePart.conditionCauser.DestroyedOrNull() && sitePart.conditionCauser.Spawned && sitePart.conditionCauser.Map == sitePart.site.Map) { sitePart.conditionCauser.DeSpawn(); sitePart.conditionCauserWasSpawned = false; } }
public static string GetDescriptionDialogue(Site site, SitePart sitePart) { if (sitePart != null && !sitePart.def.defaultHidden) { return(sitePart.def.description); } return("HiddenOrNoSitePartDescription".Translate()); }
public override void Notify_GeneratedByQuestGen(SitePart part, Slate slate, List <Rule> outExtraDescriptionRules, Dictionary <string, string> outExtraDescriptionConstants) { base.Notify_GeneratedByQuestGen(part, slate, outExtraDescriptionRules, outExtraDescriptionConstants); int enemiesCount = GetEnemiesCount(part.site, part.parms); float num = QuestTuning.PointsToRaidSourceRaidsMTBDaysCurve.Evaluate(part.parms.threatPoints); outExtraDescriptionRules.Add(new Rule_String("enemiesCount", enemiesCount.ToString())); outExtraDescriptionRules.Add(new Rule_String("mtbDays", ((int)(num * 60000f)).ToStringTicksToPeriod(allowSeconds: true, shortForm: false, canUseDecimals: false))); }
public override string GetPostProcessedThreatLabel(Site site, SitePart sitePart) { string text = base.GetPostProcessedThreatLabel(site, sitePart); if (site.HasWorldObjectTimeout) { text += " (" + "DurationLeft".Translate(site.WorldObjectTimeoutTicksLeft.ToStringTicksToPeriod(true, false, true, true)) + ")"; } return(text); }
public override void Notify_GeneratedByQuestGen(SitePart part, Slate slate, List <Rule> outExtraDescriptionRules, Dictionary <string, string> outExtraDescriptionConstants) { base.Notify_GeneratedByQuestGen(part, slate, outExtraDescriptionRules, outExtraDescriptionConstants); int animalsCount = GetAnimalsCount(part.parms); string output = GenLabel.BestKindLabel(part.parms.animalKind, Gender.None, plural: true, animalsCount); outExtraDescriptionRules.Add(new Rule_String("count", animalsCount.ToString())); outExtraDescriptionRules.Add(new Rule_String("kindLabel", output)); outExtraDescriptionConstants.Add("count", animalsCount.ToString()); }
public override void Notify_GeneratedByQuestGen(SitePart part, Slate slate, List <Rule> outExtraDescriptionRules, Dictionary <string, string> outExtraDescriptionConstants) { base.Notify_GeneratedByQuestGen(part, slate, outExtraDescriptionRules, outExtraDescriptionConstants); Faction faction = Find.FactionManager.AllFactionsListForReading.Find(f => !f.defeated && !f.IsPlayer && f.RelationKindWith(Faction.OfPlayer) == FactionRelationKind.Hostile && f.def.defName.Contains("VFEV_Vikings")); if (faction == null) { faction = Find.FactionManager.RandomEnemyFaction(false, false, true, TechLevel.Neolithic); } part.site.SetFaction(faction); }
public override void Notify_GeneratedByQuestGen(SitePart part, Slate slate, List <Rule> outExtraDescriptionRules, Dictionary <string, string> outExtraDescriptionConstants) { base.Notify_GeneratedByQuestGen(part, slate, outExtraDescriptionRules, outExtraDescriptionConstants); ThingDef thingDef = slate.Get <ThingDef>("itemStashSingleThing", null, false); IEnumerable <ThingDef> enumerable = slate.Get <IEnumerable <ThingDef> >("itemStashThings", null, false); List <Thing> list = this.GenThingList(); part.things = new ThingOwner <Thing>(part, false, LookMode.Deep); part.things.TryAddRangeOrTransfer(list, false, false); outExtraDescriptionRules.Add(new Rule_String("itemStashContents", GenLabel.ThingsLabel(list, " - "))); outExtraDescriptionRules.Add(new Rule_String("itemStashContentsValue", GenThing.GetMarketValue(list).ToStringMoney(null))); }
private void StartRaid(Map map, SitePart sitePart) { IncidentParms incidentParms = StorytellerUtility.DefaultParmsNow(IncidentCategoryDefOf.ThreatBig, map); incidentParms.forced = true; incidentParms.points *= 0.6f; if (IncidentDefOf.RaidEnemy.Worker.CanFireNow(incidentParms)) { IncidentDefOf.RaidEnemy.Worker.TryExecute(incidentParms); sitePart.lastRaidTick = Find.TickManager.TicksGame; } }
protected override bool TryExecuteWorker(IncidentParms parms) { bool result; Faction faction; if ((from wo in Find.WorldObjects.AllWorldObjects where wo.def == SiteDefOfReconAndDiscovery.RD_AdventurePeaceTalks select wo).Count <WorldObject>() > 0) { result = false; } else if (!this.TryFindFaction(out faction, (Faction f) => f != Faction.OfPlayer && f.PlayerGoodwill < 0f && f.def.CanEverBeNonHostile && f.def.humanlikeFaction)) { result = false; } else { int tile; if (TileFinder.TryFindNewSiteTile(out tile)) { Site site = (Site)WorldObjectMaker.MakeWorldObject(SiteDefOfReconAndDiscovery.RD_AdventurePeaceTalks); site.Tile = tile; site.SetFaction(faction); site.AddPart(new SitePart(site, SiteDefOfReconAndDiscovery.RD_PeaceTalks, SiteDefOfReconAndDiscovery.RD_PeaceTalks.Worker.GenerateDefaultParams(StorytellerUtility.DefaultSiteThreatPointsNow(), tile, faction))); SitePart peaceTalksFaction = new SitePart(site, SiteDefOfReconAndDiscovery.RD_PeaceTalksFaction, SiteDefOfReconAndDiscovery.RD_PeaceTalksFaction.Worker.GenerateDefaultParams(StorytellerUtility.DefaultSiteThreatPointsNow(), tile, faction)); peaceTalksFaction.hidden = true; site.parts.Add(peaceTalksFaction); site.GetComponent <QuestComp_PeaceTalks>().StartQuest(faction); int num = 5; site.GetComponent <TimeoutComp>().StartTimeout(num * 60000); base.SendStandardLetter(parms, site, new NamedArgument[] { faction.leader.Label, faction.Name, num.ToString() }); Find.WorldObjects.Add(site); result = true; } else { result = false; } } return(result); }
protected override void ScatterAt(IntVec3 loc, Map map, GenStepParams parms, int count = 1) { Faction faction = (map.ParentFaction != null && map.ParentFaction != Faction.OfPlayer) ? map.ParentFaction : Find.FactionManager.RandomEnemyFaction(); CellRect rect = CellRect.CenteredOn(loc, 10, 10).ClipInsideMap(map); SitePart sitePart = currentParams.sitePart; sitePart.conditionCauserWasSpawned = true; ResolveParams resolveParams = default(ResolveParams); resolveParams.rect = rect; resolveParams.faction = faction; resolveParams.conditionCauser = sitePart.conditionCauser; RimWorld.BaseGen.BaseGen.globalSettings.map = map; RimWorld.BaseGen.BaseGen.symbolStack.Push("conditionCauserRoom", resolveParams); RimWorld.BaseGen.BaseGen.Generate(); }
public override void SitePartWorkerTick(SitePart sitePart) { base.SitePartWorkerTick(sitePart); if (sitePart.lastRaidTick != -1 && !((float)Find.TickManager.TicksGame > (float)sitePart.lastRaidTick + 90000f)) { return; } List <Map> maps = Find.Maps; for (int i = 0; i < maps.Count; i++) { if (maps[i].IsPlayerHome && sitePart.site.IsHashIntervalTick(2500) && Rand.MTBEventOccurs(QuestTuning.PointsToRaidSourceRaidsMTBDaysCurve.Evaluate(sitePart.parms.threatPoints), 60000f, 2500f)) { StartRaid(maps[i], sitePart); } } }
protected override bool TryExecuteWorker(IncidentParms parms) { bool result; Faction faction; if ((from wo in Find.WorldObjects.AllWorldObjects where wo.def == SiteDefOfReconAndDiscovery.RD_AdventurePeaceTalks select wo).Count <WorldObject>() > 0) { result = false; } else if (!this.TryFindFaction(out faction, (Faction f) => f != Faction.OfPlayer && f.PlayerGoodwill >= 0)) { result = false; } else { int tile; if (TileFinder.TryFindNewSiteTile(out tile)) { Site site = (Site)WorldObjectMaker.MakeWorldObject(WorldObjectDefOf.Site); site.Tile = tile; site.SetFaction(faction); site.AddPart(new SitePart(site, SiteDefOfReconAndDiscovery.RD_Festival, SiteDefOfReconAndDiscovery.RD_Festival.Worker.GenerateDefaultParams(StorytellerUtility.DefaultSiteThreatPointsNow(), tile, faction))); // TODO: check if this works correctly SitePart outpost = new SitePart(site, SitePartDefOf.Outpost, SitePartDefOf.Outpost.Worker.GenerateDefaultParams(StorytellerUtility.DefaultSiteThreatPointsNow(), tile, faction)); outpost.hidden = true; site.parts.Add(outpost); int num = 8; site.GetComponent <TimeoutComp>().StartTimeout(num * 60000); base.SendStandardLetter(parms, site, new NamedArgument[] { faction.Name }); Find.WorldObjects.Add(site); result = true; } else { result = false; } } return(result); }
private void GetLetterText(Pawn prisoner, Site site, SitePart sitePart, int days, out string letter, out string label) { letter = def.letterText.Formatted(site.Faction.Name, prisoner.ageTracker.AgeBiologicalYears, prisoner.story.Title, SitePartUtility.GetDescriptionDialogue(site, sitePart), prisoner.Named("PAWN")).AdjustedFor(prisoner).CapitalizeFirst(); if (PawnUtility.EverBeenColonistOrTameAnimal(prisoner)) { letter = letter + "\n\n" + "PawnWasFormerlyColonist".Translate(prisoner.LabelShort, prisoner); } PawnRelationUtility.Notify_PawnsSeenByPlayer(Gen.YieldSingle(prisoner), out string pawnRelationsInfo, informEvenIfSeenBefore: true, writeSeenPawnsNames: false); label = def.letterLabel; if (!pawnRelationsInfo.NullOrEmpty()) { string text = letter; letter = text + "\n\n" + "PawnHasTheseRelationshipsWithColonists".Translate(prisoner.LabelShort, prisoner) + "\n\n" + pawnRelationsInfo; label = label + " " + "RelationshipAppendedLetterSuffix".Translate(); } letter = letter + "\n\n" + "PrisonerRescueTimeout".Translate(days, prisoner.LabelShort, prisoner.Named("PRISONER")); }