Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
            }
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        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);
            }
        }
Esempio n. 6
0
        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();
            }
        }
Esempio n. 7
0
        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);
        }
Esempio n. 10
0
        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);
        }
Esempio n. 11
0
        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);
        }
Esempio n. 12
0
        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);
 }
Esempio n. 14
0
        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);
        }
Esempio n. 16
0
        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);
        }
Esempio n. 17
0
        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;
            }
        }
Esempio n. 18
0
        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);
        }
Esempio n. 19
0
        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);
 }
Esempio n. 21
0
        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);
                }
            }
        }
Esempio n. 22
0
        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;
                }
            }
        }
Esempio n. 23
0
        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);
        }
Esempio n. 24
0
        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);
            }
        }
Esempio n. 25
0
        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;
                }
            }
        }