public static void SendLetterQuestAvailable(Quest quest) { TaggedString label = IncidentDefOf.GiveQuest_Random.letterLabel + ": " + quest.name; TaggedString text; if (quest.initiallyAccepted) { label = "LetterQuestAutomaticallyAcceptedTitle".Translate(quest.name); text = "LetterQuestBecameActive".Translate(quest.name); int questTicksRemaining = GetQuestTicksRemaining(quest); if (questTicksRemaining > 0) { text += " " + "LetterQuestActiveNowTime".Translate(questTicksRemaining.ToStringTicksToPeriod(allowSeconds: false, shortForm: false, canUseDecimals: false)); } } else { text = "LetterQuestBecameAvailable".Translate(quest.name); if (quest.ticksUntilAcceptanceExpiry >= 0) { text += "\n\n" + "LetterQuestRequiresAcceptance".Translate(quest.ticksUntilAcceptanceExpiry.ToStringTicksToPeriod(allowSeconds: false, shortForm: false, canUseDecimals: false)); } } ChoiceLetter choiceLetter = LetterMaker.MakeLetter(label, text, (quest.root != null && quest.root.questAvailableLetterDef != null) ? quest.root.questAvailableLetterDef : IncidentDefOf.GiveQuest_Random.letterDef, LookTargets.Invalid, null, quest); choiceLetter.title = quest.name; Find.LetterStack.ReceiveLetter(choiceLetter); }
public void SendRimWarLetter(TaggedString baseLetterLabel, TaggedString baseLetterText, LetterDef baseLetterDef, IncidentParms parms, LookTargets lookTargets, params NamedArgument[] textArgs) { if (baseLetterLabel.NullOrEmpty() || baseLetterText.NullOrEmpty()) { Log.Error("Sending standard incident letter with no label or text."); } TaggedString taggedString = baseLetterText.Formatted(textArgs); TaggedString text; if (parms.customLetterText.NullOrEmpty()) { text = taggedString; } else { List <NamedArgument> list = new List <NamedArgument>(); if (textArgs != null) { list.AddRange(textArgs); } list.Add(taggedString.Named("BASETEXT")); text = parms.customLetterText.Formatted(list.ToArray()); } TaggedString taggedString2 = baseLetterLabel.Formatted(textArgs); TaggedString label; if (parms.customLetterLabel.NullOrEmpty()) { label = taggedString2; } else { List <NamedArgument> list2 = new List <NamedArgument>(); if (textArgs != null) { list2.AddRange(textArgs); } list2.Add(taggedString2.Named("BASELABEL")); label = parms.customLetterLabel.Formatted(list2.ToArray()); } ChoiceLetter choiceLetter = LetterMaker.MakeLetter(label, text, parms.customLetterDef ?? baseLetterDef, lookTargets, parms.faction, parms.quest, parms.letterHyperlinkThingDefs); //List<HediffDef> list3 = new List<HediffDef>(); //if (!parms.letterHyperlinkHediffDefs.NullOrEmpty()) //{ // list3.AddRange(parms.letterHyperlinkHediffDefs); //} //Log.Message("5"); //if (!def.letterHyperlinkHediffDefs.NullOrEmpty()) //{ // if (list3 == null) // { // list3 = new List<HediffDef>(); // } // list3.AddRange(def.letterHyperlinkHediffDefs); //} //Log.Message("6"); //choiceLetter.hyperlinkHediffDefs = list3; Find.LetterStack.ReceiveLetter(choiceLetter); }
public void IssueDecree(bool causedByMentalBreak, string mentalBreakReason = null) { if (!ModLister.RoyaltyInstalled) { Log.ErrorOnce("Decrees are a Royalty-specific game system. If you want to use this code please check ModLister.RoyaltyInstalled before calling it. See rules on the Ludeon forum for more info.", 281653); return; } IIncidentTarget mapHeld = pawn.MapHeld; IIncidentTarget target = mapHeld ?? Find.World; if (PossibleDecreeQuests.TryRandomElementByWeight((QuestScriptDef x) => NaturalRandomQuestChooser.GetNaturalDecreeSelectionWeight(x, target.StoryState), out QuestScriptDef result)) { lastDecreeTicks = Find.TickManager.TicksGame; Slate slate = new Slate(); slate.Set("points", StorytellerUtility.DefaultThreatPointsNow(target)); slate.Set("asker", pawn); Quest quest = QuestUtility.GenerateQuestAndMakeAvailable(result, slate); target.StoryState.RecordDecreeFired(result); string str = (!causedByMentalBreak) ? ((string)"LetterLabelRandomDecree".Translate(pawn)) : ((string)("WildDecree".Translate() + ": " + pawn.LabelShortCap)); string text = (!causedByMentalBreak) ? ((string)"LetterRandomDecree".Translate(pawn)) : ((string)"LetterDecreeMentalBreak".Translate(pawn)); if (mentalBreakReason != null) { text = text + "\n\n" + mentalBreakReason; } text += "\n\n" + "LetterDecree_Quest".Translate(quest.name); ChoiceLetter let = LetterMaker.MakeLetter(str, text, IncidentDefOf.GiveQuest_Random.letterDef, LookTargets.Invalid, null, quest); Find.LetterStack.ReceiveLetter(let); } }
protected override void RunInt() { Slate slate = QuestGen.slate; QuestPart_Letter questPart_Letter = new QuestPart_Letter(); questPart_Letter.inSignal = (QuestGenUtility.HardcodedSignalWithQuestID(inSignal.GetValue(slate)) ?? slate.Get <string>("inSignal")); LetterDef letterDef = this.letterDef.GetValue(slate) ?? LetterDefOf.NeutralEvent; if (typeof(ChoiceLetter).IsAssignableFrom(letterDef.letterClass)) { ChoiceLetter choiceLetter = LetterMaker.MakeLetter("error", "error", letterDef, QuestGenUtility.ToLookTargets(lookTargets, slate), relatedFaction.GetValue(slate), QuestGen.quest); questPart_Letter.letter = choiceLetter; QuestGen.AddTextRequest("root", delegate(string x) { choiceLetter.label = x; }, QuestGenUtility.MergeRules(labelRules.GetValue(slate), label.GetValue(slate), "root")); QuestGen.AddTextRequest("root", delegate(string x) { choiceLetter.text = x; }, QuestGenUtility.MergeRules(textRules.GetValue(slate), text.GetValue(slate), "root")); } else { questPart_Letter.letter = LetterMaker.MakeLetter(letterDef); questPart_Letter.letter.lookTargets = QuestGenUtility.ToLookTargets(lookTargets, slate); questPart_Letter.letter.relatedFaction = relatedFaction.GetValue(slate); } questPart_Letter.chosenPawnSignal = QuestGenUtility.HardcodedSignalWithQuestID(chosenPawnSignal.GetValue(slate)); questPart_Letter.useColonistsOnMap = useColonistsOnMap.GetValue(slate); questPart_Letter.useColonistsFromCaravanArg = useColonistsFromCaravanArg.GetValue(slate); questPart_Letter.signalListenMode = (signalListenMode.GetValue(slate) ?? QuestPart.SignalListenMode.OngoingOnly); questPart_Letter.filterDeadPawnsFromLookTargets = filterDeadPawnsFromLookTargets.GetValue(slate); QuestGen.quest.AddPart(questPart_Letter); }
private void SendDrop() { GenDate.DayOfYear(ticks, Find.WorldGrid.LongLatOf(map.Tile).x); List <Thing> thingList = new List <Thing>(); thingList.Add(ThingMaker.MakeThing(AvaliDefs.AvaliNexus)); Scribe_Values.Look(ref hasDropped, "hasDropped", false); Map target = map; List <Faction> newFactions = new List <Faction>(); IntVec3 intVec3 = DropCellFinder.TradeDropSpot(target); if (RimValiUtility.PawnOfRaceCount(Faction.OfPlayer, AvaliDefs.RimVali) >= 5 && !hasDropped) { hasDropped = true; for (int a = 0; a < random.Next(2, 5); a++) { Faction faction = FactionGenerator.NewGeneratedFaction(AvaliDefs.AvaliFaction); faction.Name = "IlluminateFactionName".Translate() + ": #" + a.ToString(); faction.SetRelationDirect(Faction.OfPlayer, FactionRelationKind.Ally); newFactions.Add(faction); } DropPodUtility.DropThingsNear(intVec3, target, (IEnumerable <Thing>)thingList); ChoiceLetter choiceLetter = LetterMaker.MakeLetter("IlluminateAirdrop".Translate(), "AirdropEventDesc".Translate(), AvaliMod.AvaliDefs.IlluminateAirdrop, newFactions[random.Next(newFactions.Count)]); Find.LetterStack.ReceiveLetter(choiceLetter, null); } }
private void SendDrop() { Map map = Current.Game.CurrentMap; GenDate.DayOfYear(ticks, Find.WorldGrid.LongLatOf(map.Tile).x); List <Thing> thingList = new List <Thing> { ThingMaker.MakeThing(AvaliDefs.AvaliNexus) }; Scribe_Values.Look(ref hasDropped, "hasDropped", false); Map target = map; List <Faction> newFactions = new List <Faction>(); IntVec3 intVec3 = DropCellFinder.TradeDropSpot(target); if (map.IsPlayerHome) { hasDropped = true; foreach (Faction faction in Find.FactionManager.AllFactions.Where(x => x.def == AvaliDefs.AvaliFaction)) { faction.SetRelationDirect(Faction.OfPlayer, FactionRelationKind.Ally); newFactions.Add(faction); } DropPodUtility.DropThingsNear(intVec3, target, (IEnumerable <Thing>)thingList); ChoiceLetter choiceLetter = LetterMaker.MakeLetter("IlluminateAirdrop".Translate(), "AirdropEventDesc".Translate(), AvaliMod.AvaliDefs.IlluminateAirdrop); Find.LetterStack.ReceiveLetter(choiceLetter, null); } else { SetupDrop(); } }
public static void Make(string label, string text, LetterDef def) { var lclass = def.letterClass; def.letterClass = typeof(OpenUILetter); ChoiceLetter Letter = LetterMaker.MakeLetter(label, text, def); def.letterClass = lclass; Find.LetterStack.ReceiveLetter(Letter); }
private void DoEnter(Caravan caravan, Site site) { LookTargets lookTargets = new LookTargets(caravan.PawnsListForReading); bool draftColonists = site.Faction == null || site.Faction.HostileTo(Faction.OfPlayer); bool num = !site.HasMap; Map orGenerateMap = GetOrGenerateMapUtility.GetOrGenerateMap(site.Tile, MapSize, null); if (num) { Find.TickManager.Notify_GeneratedPotentiallyHostileMap(); PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter_Send(orGenerateMap.mapPawns.AllPawns, "LetterRelatedPawnsSite".Translate(Faction.OfPlayer.def.pawnsPlural), LetterDefOf.NeutralEvent, informEvenIfSeenBefore: true); StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append("LetterCaravanEnteredMap".Translate(caravan.Label, site).CapitalizeFirst()); AppendThreatInfo(stringBuilder, site, orGenerateMap, out var letterDef, out var allLookTargets); TaggedString letterText = null; SettlementUtility.AffectRelationsOnAttacked_NewTmp(site, ref letterText); if (!letterText.NullOrEmpty()) { if (stringBuilder.Length > 0) { stringBuilder.AppendLine(); } stringBuilder.AppendLineTagged(letterText); } List <HediffDef> list = null; foreach (SitePart part in site.parts) { if (part.def.arrivedLetterHediffHyperlinks.NullOrEmpty()) { continue; } if (list == null) { list = new List <HediffDef>(); } foreach (HediffDef arrivedLetterHediffHyperlink in part.def.arrivedLetterHediffHyperlinks) { if (!list.Contains(arrivedLetterHediffHyperlink)) { list.Add(arrivedLetterHediffHyperlink); } } } ChoiceLetter choiceLetter = LetterMaker.MakeLetter("LetterLabelCaravanEnteredMap".Translate(site), stringBuilder.ToString(), letterDef ?? LetterDefOf.NeutralEvent, allLookTargets.IsValid() ? allLookTargets : lookTargets); choiceLetter.hyperlinkHediffDefs = list; Find.LetterStack.ReceiveLetter(choiceLetter); } else { Find.LetterStack.ReceiveLetter("LetterLabelCaravanEnteredMap".Translate(site), "LetterCaravanEnteredMap".Translate(caravan.Label, site).CapitalizeFirst(), LetterDefOf.NeutralEvent, lookTargets); } CaravanEnterMapUtility.Enter(caravan, orGenerateMap, CaravanEnterMode.Edge, CaravanDropInventoryMode.DoNotDrop, draftColonists); }
private static void SendLetter(IncidentParms parms, List <Pawn> pawns) { StringBuilder str = new StringBuilder(); foreach (var t in pawns) { str.AppendLine(t.NameShortColored); } TaggedString text = "RF.Raiders.WarningContent".Translate(parms.faction.NameColored, pawns.Count, parms.faction.def.pawnsPlural, str); ChoiceLetter choiceLetter = LetterMaker.MakeLetter("RF.Raiders.WarningTitle".Translate(), text, RFDefOf.RF_CursedRaiders, pawns, parms.faction); Find.LetterStack.ReceiveLetter(choiceLetter); }
public static void Make(string label, string text, LetterDef def, TravelingIncidentCaravan caravan) { var lclass = def.letterClass; def.letterClass = typeof(SparkUILetter); ChoiceLetter Letter = LetterMaker.MakeLetter(label, text, def); def.letterClass = lclass; if (Letter is SparkUILetter sLetter) { sLetter.caravan = caravan; } Find.LetterStack.ReceiveLetter(Letter); }
public static ChoiceLetter MakeLetter(string labelKeyword, string textKeyword, LetterDef def, LookTargets lookTargets, Faction relatedFaction = null, Quest quest = null) { ChoiceLetter letter = LetterMaker.MakeLetter("error", "error", def, lookTargets, relatedFaction, quest); QuestGen.AddTextRequest(labelKeyword, delegate(string x) { letter.label = x; }); QuestGen.AddTextRequest(textKeyword, delegate(string x) { letter.text = x; }); return(letter); }
protected virtual void SendCrashSiteLetter(WorldObject shotDownBy, MapParent crashSite, TaggedString baseLetterLabel, TaggedString baseLetterText, LetterDef letterDef, LookTargets lookTargets, params NamedArgument[] textArgs) { if (baseLetterLabel.NullOrEmpty() || baseLetterText.NullOrEmpty()) { Log.Error("Sending standard incident letter with no label or text."); } ChoiceLetter choiceLetter = LetterMaker.MakeLetter(baseLetterLabel.Formatted(textArgs), baseLetterText.Formatted(textArgs), letterDef, lookTargets, shotDownBy?.Faction); List <HediffDef> list3 = new List <HediffDef>(); if (!def.letterHyperlinkHediffDefs.NullOrEmpty()) { list3.AddRange(def.letterHyperlinkHediffDefs); } choiceLetter.hyperlinkHediffDefs = list3; Find.LetterStack.ReceiveLetter(choiceLetter, null); }
protected override void DoAction(SignalArgs args) { if (args.TryGetArg("SUBJECT", out Pawn arg)) { ChoiceLetter choiceLetter = letter as ChoiceLetter; if (choiceLetter != null) { choiceLetter.text = choiceLetter.text.Resolve().Formatted(arg.LabelShort, arg.Named("PAWN")).AdjustedFor(arg); } if (!letter.lookTargets.IsValid()) { letter.lookTargets = arg; } } Find.LetterStack.ReceiveLetter(letter); }
protected override void DoAction(object[] args) { Pawn pawn = null; if (args != null && args.Any <object>()) { pawn = (args[0] as Pawn); } if (pawn != null) { ChoiceLetter choiceLetter = this.letter as ChoiceLetter; if (choiceLetter != null) { choiceLetter.text = string.Format(choiceLetter.text, pawn.LabelShort).AdjustedFor(pawn, "PAWN"); } if (!this.letter.lookTargets.IsValid()) { this.letter.lookTargets = pawn; } } Find.LetterStack.ReceiveLetter(this.letter, null); }
public void CheckAndSendNegativeDeadlyAffixLetter(Pawn pawn) { if (Current.ProgramState != ProgramState.Playing) { return; } LootAffixDef deadlyAffix = affixes.FirstOrFallback(lad => lad.IsNegativeDeadly(parent)); if (deadlyAffix == null || pawn.Faction != Faction.OfPlayer) { return; } ChoiceLetter choiceLetter = LetterMaker.MakeLetter( label: "RimLoot_CursedItem".Translate() + ": " + pawn.LabelShortCap + " → " + deadlyAffix.LabelCap, text: "RimLoot_NegativeDeadlyAffixLetter_Text".Translate(pawn.Named("PAWN")), def: DefDatabase <LetterDef> .GetNamed("RimLoot_NegativeDeadlyAffix"), lookTargets: new LookTargets(new GlobalTargetInfo(pawn), new GlobalTargetInfo(parent)) ); Find.LetterStack.ReceiveLetter(choiceLetter); }
protected override void DoAction(object[] args) { Pawn pawn = null; if (args != null && args.Any()) { pawn = (args[0] as Pawn); } if (pawn != null) { ChoiceLetter choiceLetter = letter as ChoiceLetter; if (choiceLetter != null) { choiceLetter.text = choiceLetter.text.Formatted(pawn.LabelShort, pawn.Named("PAWN")).AdjustedFor(pawn); } if (!letter.lookTargets.IsValid()) { letter.lookTargets = pawn; } } Find.LetterStack.ReceiveLetter(letter); }
public void NewArchive(Letter letter, string text, GlobalTargetInfo target) { if (this.EnableArchiving) { MasterArchive newArchive; if (letter != null) { newArchive = new MasterArchive(letter); //Dummify complex letters to avoid players exploiting the archiver if (letter is ChoiceLetter && letter.GetType() != typeof(StandardLetter)) { ChoiceLetter choiceLet = newArchive.letter as ChoiceLetter; newArchive.letter = new DummyStandardLetter { def = choiceLet.def, label = choiceLet.label, lookTarget = choiceLet.lookTarget, disappearAtTick = -1, title = choiceLet.title, text = choiceLet.text }; } } else { newArchive = new MasterArchive(text, target); } this.archives.Add(newArchive); MainTabWindow_Archive.mustRecacheList = true; } }
public static QuestPart_Letter Letter(this Quest quest, LetterDef letterDef, string inSignal = null, string chosenPawnSignal = null, Faction relatedFaction = null, MapParent useColonistsOnMap = null, bool useColonistsFromCaravanArg = false, QuestPart.SignalListenMode signalListenMode = QuestPart.SignalListenMode.OngoingOnly, IEnumerable <object> lookTargets = null, bool filterDeadPawnsFromLookTargets = false, string text = null, RulePack textRules = null, string label = null, RulePack labelRules = null, string getColonistsFromSignal = null) { Slate slate = QuestGen.slate; QuestPart_Letter questPart_Letter = new QuestPart_Letter(); questPart_Letter.inSignal = QuestGenUtility.HardcodedSignalWithQuestID(inSignal) ?? slate.Get <string>("inSignal"); LetterDef letterDef2 = letterDef ?? LetterDefOf.NeutralEvent; if (typeof(ChoiceLetter).IsAssignableFrom(letterDef2.letterClass)) { ChoiceLetter choiceLetter = LetterMaker.MakeLetter("error", "error", letterDef2, QuestGenUtility.ToLookTargets(lookTargets), relatedFaction, QuestGen.quest); questPart_Letter.letter = choiceLetter; QuestGen.AddTextRequest("root", delegate(string x) { choiceLetter.label = x; }, QuestGenUtility.MergeRules(labelRules, label, "root")); QuestGen.AddTextRequest("root", delegate(string x) { choiceLetter.text = x; }, QuestGenUtility.MergeRules(textRules, text, "root")); } else { questPart_Letter.letter = LetterMaker.MakeLetter(letterDef2); questPart_Letter.letter.lookTargets = QuestGenUtility.ToLookTargets(lookTargets); questPart_Letter.letter.relatedFaction = relatedFaction; } questPart_Letter.chosenPawnSignal = QuestGenUtility.HardcodedSignalWithQuestID(chosenPawnSignal); questPart_Letter.useColonistsOnMap = useColonistsOnMap; questPart_Letter.useColonistsFromCaravanArg = useColonistsFromCaravanArg; questPart_Letter.signalListenMode = signalListenMode; questPart_Letter.filterDeadPawnsFromLookTargets = filterDeadPawnsFromLookTargets; questPart_Letter.getColonistsFromSignal = getColonistsFromSignal; QuestGen.quest.AddPart(questPart_Letter); return(questPart_Letter); }
public void SendMessage(ResearchProjectDef def) { ChoiceLetter choiceLetter = LetterMaker.MakeLetter("test", $"Research unlocked: {def.label}", AvaliMod.AvaliDefs.IlluminateAirdrop); Find.LetterStack.ReceiveLetter(choiceLetter, null); }
public void Registerletter(ChoiceLetter choiceLetter) { choiceLetters.Add(choiceLetter); }
public override void Notify_QuestSignalReceived(Signal signal) { base.Notify_QuestSignalReceived(signal); if (!string.IsNullOrEmpty(getColonistsFromSignal) && signal.tag == getColonistsFromSignal) { if (signal.args.TryGetArg("SUBJECT", out var arg)) { ReadPawns(arg.arg); } if (signal.args.TryGetArg("SENT", out var arg2)) { ReadPawns(arg2.arg); } } if (!(signal.tag == inSignal)) { return; } Letter letter = Gen.MemberwiseClone(this.letter); letter.ID = Find.UniqueIDsManager.GetNextLetterID(); ChoiceLetter choiceLetter = letter as ChoiceLetter; if (choiceLetter != null) { choiceLetter.quest = quest; } ChoiceLetter_ChoosePawn choiceLetter_ChoosePawn = letter as ChoiceLetter_ChoosePawn; if (choiceLetter_ChoosePawn != null) { if (useColonistsOnMap != null && useColonistsOnMap.HasMap) { choiceLetter_ChoosePawn.pawns.Clear(); choiceLetter_ChoosePawn.pawns.AddRange(useColonistsOnMap.Map.mapPawns.FreeColonists); choiceLetter_ChoosePawn.chosenPawnSignal = chosenPawnSignal; } if (useColonistsFromCaravanArg && signal.args.TryGetArg("CARAVAN", out Caravan arg3) && arg3 != null) { choiceLetter_ChoosePawn.pawns.Clear(); choiceLetter_ChoosePawn.pawns.AddRange(arg3.PawnsListForReading.Where((Pawn x) => x.IsFreeColonist)); choiceLetter_ChoosePawn.chosenPawnSignal = chosenPawnSignal; } if (!string.IsNullOrEmpty(getColonistsFromSignal)) { colonistsFromSignal.RemoveAll((Pawn x) => x.Dead); choiceLetter_ChoosePawn.pawns.Clear(); choiceLetter_ChoosePawn.pawns.AddRange(colonistsFromSignal); choiceLetter_ChoosePawn.chosenPawnSignal = chosenPawnSignal; } } if (getLookTargetsFromSignal && !letter.lookTargets.IsValid() && SignalArgsUtility.TryGetLookTargets(signal.args, "SUBJECT", out var lookTargets)) { letter.lookTargets = lookTargets; } letter.label = signal.args.GetFormattedText(letter.label); ChoiceLetter choiceLetter2 = letter as ChoiceLetter; bool flag = true; if (choiceLetter2 != null) { choiceLetter2.title = signal.args.GetFormattedText(choiceLetter2.title); choiceLetter2.text = signal.args.GetFormattedText(choiceLetter2.text); if (choiceLetter2.text.NullOrEmpty()) { flag = false; } } if (filterDeadPawnsFromLookTargets) { for (int num = letter.lookTargets.targets.Count - 1; num >= 0; num--) { Thing thing = letter.lookTargets.targets[num].Thing; Pawn pawn = thing as Pawn; if (pawn != null && pawn.Dead) { letter.lookTargets.targets.Remove(thing); } } } if (flag) { Find.LetterStack.ReceiveLetter(letter); } void ReadPawns(object obj) { Pawn item; if ((item = obj as Pawn) != null && !colonistsFromSignal.Contains(item)) { colonistsFromSignal.Add(item); } List <Pawn> source; if ((source = obj as List <Pawn>) != null) { colonistsFromSignal.AddRange(source.Where((Pawn p) => !colonistsFromSignal.Contains(p))); } List <Thing> source2; if ((source2 = obj as List <Thing>) != null) { colonistsFromSignal.AddRange(from Pawn p in source2.Where((Thing t) => t is Pawn) where !colonistsFromSignal.Contains(p) select p); } } }
public override void Tick() { base.Tick(); AdjustPowerNeed(); if (!powerComp.PowerOn && soundSustainer != null && !soundSustainer.Ended) { soundSustainer.End(); } if (flickableComp == null || (flickableComp != null && flickableComp.SwitchIsOn)) { //State machine switch (printerStatus) { case CrafterStatus.Filling: { //Emit smoke if (powerComp.PowerOn && Current.Game.tickManager.TicksGame % 300 == 0) { MoteMaker.ThrowSmoke(Position.ToVector3(), Map, 1f); } //If we aren't being filled, then start. var pendingRequests = orderProcessor.PendingRequests(); bool startPrinting = pendingRequests == null; if (pendingRequests != null && pendingRequests.Count() == 0) { startPrinting = true; } if (startPrinting) { //Initiate printing phase. StartPrinting(); } } break; case CrafterStatus.Crafting: { if (powerComp.PowerOn) { //Emit smoke if (Current.Game.tickManager.TicksGame % 100 == 0) { MoteMaker.ThrowSmoke(Position.ToVector3(), Map, 1.33f); } //Visual effects if (Current.Game.tickManager.TicksGame % 250 == 0) { for (int i = 0; i < 3; i++) { MoteMaker.ThrowMicroSparks(Position.ToVector3() + new Vector3(Rand.Range(-1, 1), 0f, Rand.Range(-1, 1)), Map); } } //Sound effect if (soundSustainer == null || soundSustainer.Ended) { SoundDef soundDef = printerProperties.craftingSound; if (soundDef != null && soundDef.sustain) { SoundInfo info = SoundInfo.InMap(this, MaintenanceType.PerTick); soundSustainer = soundDef.TrySpawnSustainer(info); } } if (soundSustainer != null && !soundSustainer.Ended) { soundSustainer.Maintain(); } //Periodically use resources. nextResourceTick--; if (nextResourceTick <= 0) { nextResourceTick = printerProperties.resourceTick; //Deduct resources from each category. foreach (ThingOrderRequest thingOrderRequest in orderProcessor.requestedItems) { if (thingOrderRequest.nutrition) { //Food if (CountNutrition() > 0f) { //Grab first stack of Nutrition. Thing item = ingredients.First(thing => thing.def.IsIngestible); if (item != null) { int resourceTickAmount = (int)Math.Ceiling((thingOrderRequest.amount / ((double)(printerProperties.ticksToCraft + extraTimeCost) / printerProperties.resourceTick))); int amount = Math.Min(resourceTickAmount, item.stackCount); Thing outThing = null; Corpse outCorpse = item as Corpse; if (outCorpse != null) { if (outCorpse.IsDessicated()) { //If rotten, just drop it. ingredients.TryDrop(outCorpse, InteractionCell, Map, ThingPlaceMode.Near, 1, out outThing); } else { //Not rotten, dump all equipment. ingredients.TryDrop(outCorpse, InteractionCell, Map, ThingPlaceMode.Near, 1, out outThing); outCorpse.InnerPawn?.equipment?.DropAllEquipment(InteractionCell, false); outCorpse.InnerPawn?.apparel?.DropAll(InteractionCell, false); item.Destroy(); } } else { Thing takenItem = ingredients.Take(item, amount); takenItem.Destroy(); } } } } else { //Item if (ingredients.Any(thing => thing.def == thingOrderRequest.thingDef)) { //Grab first stack of Plasteel. Thing item = ingredients.First(thing => thing.def == thingOrderRequest.thingDef); if (item != null) { int resourceTickAmount = (int)Math.Ceiling((thingOrderRequest.amount / ((float)(printerProperties.ticksToCraft + extraTimeCost) / printerProperties.resourceTick))); int amount = Math.Min(resourceTickAmount, item.stackCount); Thing takenItem = ingredients.Take(item, amount); takenItem.Destroy(); } } } } } //Are we done yet? if (printingTicksLeft > 0) { printingTicksLeft--; } else { printerStatus = CrafterStatus.Finished; } } } break; case CrafterStatus.Finished: { if (pawnToPrint != null) { //Clear remaining materials. ingredients.ClearAndDestroyContents(); //Add effects FilthMaker.TryMakeFilth(InteractionCell, Map, RimWorld.ThingDefOf.Filth_Slime, 5); //Spawn GenSpawn.Spawn(pawnToPrint, InteractionCell, Map); pawnToPrint.health.AddHediff(RimWorld.HediffDefOf.CryptosleepSickness); pawnToPrint.needs.mood.thoughts.memories.TryGainMemory(NeedsDefOf.ChJAndroidSpawned); //Make and send letter. ChoiceLetter letter = LetterMaker.MakeLetter("AndroidPrintedLetterLabel".Translate(pawnToPrint.Name.ToStringShort), "AndroidPrintedLetterDescription".Translate(pawnToPrint.Name.ToStringFull), LetterDefOf.PositiveEvent, pawnToPrint); Find.LetterStack.ReceiveLetter(letter); //Reset pawnToPrint = null; printerStatus = CrafterStatus.Idle; extraTimeCost = 0; orderProcessor.requestedItems.Clear(); } } break; default: { if (soundSustainer != null && !soundSustainer.Ended) { soundSustainer.End(); } } break; } } }
public override void Apply(float progress, Dictionary <Pawn, int> totalPresence, LordJob_Ritual jobRitual) { float quality = base.GetQuality(jobRitual, progress); OutcomeChance outcome = this.GetOutcome(quality, jobRitual); LookTargets lookTargets = jobRitual.selectedTarget; string text = null; if (jobRitual.Ritual != null) { this.ApplyAttachableOutcome(totalPresence, jobRitual, outcome, out text, ref lookTargets); } Log.Message(outcome.positivityIndex.ToString()); Pawn sacrifice = jobRitual.PawnWithRole("animal"); float size = sacrifice.RaceProps.baseBodySize; PawnGenerationRequest request = new PawnGenerationRequest(); string str = outcome.label + " " + jobRitual.Ritual.Label; TaggedString taggedString = outcome.description.Formatted(jobRitual.Ritual.Label); switch (outcome.positivityIndex) { case -2: if (size < 0.5) { request = new PawnGenerationRequest(PawnKindDef.Named("AA_Eyeling"), Faction.OfPlayer, PawnGenerationContext.NonPlayer, -1, false, false, false, false, true, false, 1f, false, true, true, false, false); } else if (size < 1.5) { request = new PawnGenerationRequest(PawnKindDef.Named("AA_Eyeling"), Faction.OfPlayer, PawnGenerationContext.NonPlayer, -1, false, false, false, false, true, false, 1f, false, true, true, false, false); } else { request = new PawnGenerationRequest(PawnKindDef.Named("AA_RedGoo"), Faction.OfPlayer, PawnGenerationContext.NonPlayer, -1, false, false, false, false, true, false, 1f, false, true, true, false, false); } break; case -1: if (size < 0.5) { request = new PawnGenerationRequest(PawnKindDef.Named("AA_RedGoo"), Faction.OfPlayer, PawnGenerationContext.NonPlayer, -1, false, false, false, false, true, false, 1f, false, true, true, false, false); } else if (size < 1.5) { request = new PawnGenerationRequest(PawnKindDef.Named("AA_OcularJelly"), Faction.OfPlayer, PawnGenerationContext.NonPlayer, -1, false, false, false, false, true, false, 1f, false, true, true, false, false); } else { request = new PawnGenerationRequest(PawnKindDef.Named("AA_OcularNightling"), Faction.OfPlayer, PawnGenerationContext.NonPlayer, -1, false, false, false, false, true, false, 1f, false, true, true, false, false); } break; case 1: if (size < 0.5) { request = new PawnGenerationRequest(PawnKindDef.Named("AA_RedSpore"), Faction.OfPlayer, PawnGenerationContext.NonPlayer, -1, false, false, false, false, true, false, 1f, false, true, true, false, false); } else if (size < 1.5) { request = new PawnGenerationRequest(PawnKindDef.Named("AA_OcularNightling"), Faction.OfPlayer, PawnGenerationContext.NonPlayer, -1, false, false, false, false, true, false, 1f, false, true, true, false, false); } else { request = new PawnGenerationRequest(PawnKindDef.Named("AA_EngorgedTentacularAberration"), Faction.OfPlayer, PawnGenerationContext.NonPlayer, -1, false, false, false, false, true, false, 1f, false, true, true, false, false); } break; case 2: if (size < 0.5) { request = new PawnGenerationRequest(PawnKindDef.Named("AA_OcularJelly"), Faction.OfPlayer, PawnGenerationContext.NonPlayer, -1, false, false, false, false, true, false, 1f, false, true, true, false, false); } else if (size < 1.5) { request = new PawnGenerationRequest(PawnKindDef.Named("AA_EngorgedTentacularAberration"), Faction.OfPlayer, PawnGenerationContext.NonPlayer, -1, false, false, false, false, true, false, 1f, false, true, true, false, false); } else { request = new PawnGenerationRequest(PawnKindDef.Named("AA_UnblinkingEye"), Faction.OfPlayer, PawnGenerationContext.NonPlayer, -1, false, false, false, false, true, false, 1f, false, true, true, false, false); } break; case 3: request = new PawnGenerationRequest(PawnKindDef.Named("AA_UnblinkingEye"), Faction.OfPlayer, PawnGenerationContext.NonPlayer, -1, false, false, false, false, true, false, 1f, false, true, true, false, false); break; default: request = new PawnGenerationRequest(PawnKindDef.Named("AA_OcularJelly"), Faction.OfPlayer, PawnGenerationContext.NonPlayer, -1, false, false, false, false, true, false, 1f, false, true, true, false, false); break; } Pawn pawn = PawnGenerator.GeneratePawn(request); GenSpawn.Spawn(pawn, jobRitual.selectedTarget.Cell, jobRitual.Map, WipeMode.Vanish); ChoiceLetter let = LetterMaker.MakeLetter(str, taggedString, LetterDefOf.RitualOutcomePositive, lookTargets, null, null, null); Find.LetterStack.ReceiveLetter(let, null); }
public override void Notify_QuestSignalReceived(Signal signal) { base.Notify_QuestSignalReceived(signal); if (!(signal.tag == inSignal)) { return; } Letter letter = Gen.MemberwiseClone(this.letter); letter.ID = Find.UniqueIDsManager.GetNextLetterID(); ChoiceLetter choiceLetter = letter as ChoiceLetter; if (choiceLetter != null) { choiceLetter.quest = quest; } ChoiceLetter_ChoosePawn choiceLetter_ChoosePawn = letter as ChoiceLetter_ChoosePawn; if (choiceLetter_ChoosePawn != null) { if (useColonistsOnMap != null && useColonistsOnMap.HasMap) { choiceLetter_ChoosePawn.pawns.Clear(); choiceLetter_ChoosePawn.pawns.AddRange(useColonistsOnMap.Map.mapPawns.FreeColonists); choiceLetter_ChoosePawn.chosenPawnSignal = chosenPawnSignal; } if (useColonistsFromCaravanArg && signal.args.TryGetArg("CARAVAN", out Caravan arg) && arg != null) { choiceLetter_ChoosePawn.pawns.Clear(); choiceLetter_ChoosePawn.pawns.AddRange(arg.PawnsListForReading.Where((Pawn x) => x.IsFreeColonist)); choiceLetter_ChoosePawn.chosenPawnSignal = chosenPawnSignal; } } if (getLookTargetsFromSignal && !letter.lookTargets.IsValid() && SignalArgsUtility.TryGetLookTargets(signal.args, "SUBJECT", out LookTargets lookTargets)) { letter.lookTargets = lookTargets; } letter.label = signal.args.GetFormattedText(letter.label); ChoiceLetter choiceLetter2 = letter as ChoiceLetter; bool flag = true; if (choiceLetter2 != null) { choiceLetter2.title = signal.args.GetFormattedText(choiceLetter2.title); choiceLetter2.text = signal.args.GetFormattedText(choiceLetter2.text); if (choiceLetter2.text.NullOrEmpty()) { flag = false; } } if (filterDeadPawnsFromLookTargets) { for (int num = letter.lookTargets.targets.Count - 1; num >= 0; num--) { Thing thing = letter.lookTargets.targets[num].Thing; Pawn pawn = thing as Pawn; if (pawn != null && pawn.Dead) { letter.lookTargets.targets.Remove(thing); } } } if (flag) { Find.LetterStack.ReceiveLetter(letter); } }
public override void Tick() { base.Tick(); AdjustPowerNeed(); if (flickableComp == null || (flickableComp != null && flickableComp.SwitchIsOn)) { //State machine switch (crafterStatus) { case CrafterStatus.Filling: { ExtraCrafterTickAction(); //If we aren't being filled, then start. var pendingRequests = orderProcessor.PendingRequests(); bool startPrinting = pendingRequests == null; if (pendingRequests != null && pendingRequests.Count() == 0) { startPrinting = true; } if (startPrinting) { //Initiate printing phase. StartPrinting(); } } break; case CrafterStatus.Crafting: { ExtraCrafterTickAction(); if (powerComp.PowerOn) { //Periodically use resources. nextResourceTick--; if (nextResourceTick <= 0) { nextResourceTick = printerProperties.resourceTick; //Deduct resources from each category. foreach (ThingOrderRequest thingOrderRequest in orderProcessor.requestedItems) { if (thingOrderRequest.nutrition) { //Food if (CountNutrition() > 0f) { //Grab first stack of Nutrition. Thing item = ingredients.First(thing => thing.def.IsIngestible); if (item != null) { int resourceTickAmount = (int)Math.Ceiling((thingOrderRequest.amount / ((double)CraftingTicks / printerProperties.resourceTick))); int amount = Math.Min(resourceTickAmount, item.stackCount); Thing outThing = null; Corpse outCorpse = item as Corpse; if (outCorpse != null) { if (outCorpse.IsDessicated()) { //If rotten, just drop it. ingredients.TryDrop(outCorpse, InteractionCell, Map, ThingPlaceMode.Near, 1, out outThing); } else { //Not rotten, dump all equipment. ingredients.TryDrop(outCorpse, InteractionCell, Map, ThingPlaceMode.Near, 1, out outThing); outCorpse.InnerPawn?.equipment?.DropAllEquipment(InteractionCell, false); outCorpse.InnerPawn?.apparel?.DropAll(InteractionCell, false); item.Destroy(); } } else { Thing takenItem = ingredients.Take(item, amount); takenItem.Destroy(); } } } } else { //Item if (ingredients.Any(thing => thing.def == thingOrderRequest.thingDef)) { //Grab first stack of Plasteel. Thing item = ingredients.First(thing => thing.def == thingOrderRequest.thingDef); if (item != null) { int resourceTickAmount = (int)Math.Ceiling((thingOrderRequest.amount / ((float)CraftingTicks / printerProperties.resourceTick))); int amount = Math.Min(resourceTickAmount, item.stackCount); Thing takenItem = ingredients.Take(item, amount); takenItem.Destroy(); } } } } } //Are we done yet? if (craftingTicksLeft > 0) { craftingTicksLeft--; } else { crafterStatus = CrafterStatus.Finished; } } } break; case CrafterStatus.Finished: { if (pawnBeingCrafted != null) { ExtraCrafterTickAction(); //Clear remaining materials. ingredients.ClearAndDestroyContents(); //Spawn GenSpawn.Spawn(pawnBeingCrafted, InteractionCell, Map); if (printerProperties.hediffOnPawnCrafted != null) { pawnBeingCrafted.health.AddHediff(printerProperties.hediffOnPawnCrafted); } if (printerProperties.thoughtOnPawnCrafted != null) { pawnBeingCrafted.needs.mood.thoughts.memories.TryGainMemory(printerProperties.thoughtOnPawnCrafted); } //Make and send letter. ChoiceLetter letter = LetterMaker.MakeLetter(printerProperties.pawnCraftedLetterLabel.Translate(pawnBeingCrafted.Name.ToStringShort), printerProperties.pawnCraftedLetterText.Translate(pawnBeingCrafted.Name.ToStringFull), LetterDefOf.PositiveEvent, pawnBeingCrafted); Find.LetterStack.ReceiveLetter(letter); //Reset pawnBeingCrafted = null; crafterStatus = CrafterStatus.Idle; FinishAction(); } } break; default: break; } } }