示例#1
0
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            Map map;

            if (!this.TryGetRandomAvailableTargetMap(out map))
            {
                return(false);
            }
            SettlementBase settlementBase = IncidentWorker_QuestTradeRequest.RandomNearbyTradeableSettlement(map.Tile);

            if (settlementBase == null)
            {
                return(false);
            }
            TradeRequestComp component = settlementBase.GetComponent <TradeRequestComp>();

            if (!this.TryGenerateTradeRequest(component, map))
            {
                return(false);
            }
            string text = "LetterCaravanRequest".Translate(new object[]
            {
                settlementBase.Label,
                TradeRequestUtility.RequestedThingLabel(component.requestThingDef, component.requestCount).CapitalizeFirst(),
                (component.requestThingDef.GetStatValueAbstract(StatDefOf.MarketValue, null) * (float)component.requestCount).ToStringMoney("F0"),
                GenThing.ThingsToCommaList(component.rewards, true, true, -1).CapitalizeFirst(),
                GenThing.GetMarketValue(component.rewards).ToStringMoney("F0"),
                (component.expiration - Find.TickManager.TicksGame).ToStringTicksToDays("F0"),
                CaravanArrivalTimeEstimator.EstimatedTicksToArrive(map.Tile, settlementBase.Tile, null).ToStringTicksToDays("0.#")
            });

            GenThing.TryAppendSingleRewardInfo(ref text, component.rewards);
            Find.LetterStack.ReceiveLetter("LetterLabelCaravanRequest".Translate(), text, LetterDefOf.PositiveEvent, settlementBase, settlementBase.Faction, null);
            return(true);
        }
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            Map  map;
            bool result;

            if (!this.TryGetRandomAvailableTargetMap(out map))
            {
                result = false;
            }
            else
            {
                Settlement settlement = IncidentWorker_ArcaneScriptCaravan.RandomNearbyTradeableSettlement(parms.target.Tile);
                if (settlement == null)
                {
                    return(false);
                }
                else
                {
                    TradeRequestComp component = settlement.GetComponent <TradeRequestComp>();
                    if (!this.GenerateCaravanRequest(component, (Map)parms.target))
                    {
                        return(false);
                    }
                    Find.LetterStack.ReceiveLetter("LetterLabelArcaneScriptCaravan".Translate(), "LetterArcaneScriptCaravan".Translate(new object[]
                    {
                        settlement.Label,
                        GenLabel.ThingLabel(component.requestThingDef, null, component.requestCount).CapitalizeFirst(),
                        component.rewards[0].LabelCap,
                        (component.expiration - Find.TickManager.TicksGame).ToStringTicksToDays("F0")
                    }), LetterDefOf.PositiveEvent, settlement, null);
                    return(true);
                }
            }
            return(result);
        }
示例#3
0
        public static void TradeRequests()
        {
            Map currentMap = Find.CurrentMap;
            IncidentWorker_QuestTradeRequest incidentWorker_QuestTradeRequest = (IncidentWorker_QuestTradeRequest)IncidentDefOf.Quest_TradeRequest.Worker;
            StringBuilder stringBuilder = new StringBuilder();

            stringBuilder.AppendLine("Randomly-generated trade requests for map " + currentMap.ToString() + ":");
            stringBuilder.AppendLine();
            for (int i = 0; i < 50; i++)
            {
                SettlementBase settlementBase = IncidentWorker_QuestTradeRequest.RandomNearbyTradeableSettlement(currentMap.Tile);
                if (settlementBase == null)
                {
                    break;
                }
                stringBuilder.AppendLine("Settlement: " + settlementBase.LabelCap);
                TradeRequestComp component = settlementBase.GetComponent <TradeRequestComp>();
                if (incidentWorker_QuestTradeRequest.TryGenerateTradeRequest(component, currentMap))
                {
                    stringBuilder.AppendLine("Duration: " + (component.expiration - Find.TickManager.TicksGame).ToStringTicksToDays("F1"));
                    string str = GenLabel.ThingLabel(component.requestThingDef, null, component.requestCount) + " ($" + (component.requestThingDef.BaseMarketValue * (float)component.requestCount).ToString("F0") + ")";
                    stringBuilder.AppendLine("Request: " + str);
                    string str2 = GenThing.ThingsToCommaList(component.rewards, false, true, -1) + " ($" + (from t in component.rewards
                                                                                                            select t.MarketValue * (float)t.stackCount).Sum().ToString("F0") + ")";
                    stringBuilder.AppendLine("Reward: " + str2);
                }
                else
                {
                    stringBuilder.AppendLine("TryGenerateTradeRequest failed.");
                }
                stringBuilder.AppendLine();
                settlementBase.GetComponent <TradeRequestComp>().Disable();
            }
            Log.Message(stringBuilder.ToString(), false);
        }
示例#4
0
        public static void TradeRequestsSampled()
        {
            Map currentMap = Find.CurrentMap;
            IncidentWorker_QuestTradeRequest incidentWorker_QuestTradeRequest = (IncidentWorker_QuestTradeRequest)IncidentDefOf.Quest_TradeRequest.Worker;
            Dictionary <ThingDef, int>       counts = new Dictionary <ThingDef, int>();

            for (int i = 0; i < 100; i++)
            {
                SettlementBase settlementBase = IncidentWorker_QuestTradeRequest.RandomNearbyTradeableSettlement(currentMap.Tile);
                if (settlementBase == null)
                {
                    break;
                }
                TradeRequestComp component = settlementBase.GetComponent <TradeRequestComp>();
                if (incidentWorker_QuestTradeRequest.TryGenerateTradeRequest(component, currentMap))
                {
                    if (!counts.ContainsKey(component.requestThingDef))
                    {
                        counts.Add(component.requestThingDef, 0);
                    }
                    Dictionary <ThingDef, int> dictionary;
                    ThingDef requestThingDef;
                    (dictionary = counts)[requestThingDef = component.requestThingDef] = dictionary[requestThingDef] + 1;
                }
                settlementBase.GetComponent <TradeRequestComp>().Disable();
            }
            DebugTables.MakeTablesDialog(from d in DefDatabase <ThingDef> .AllDefs
                                         where counts.ContainsKey(d)
                                         orderby counts[d] descending
                                         select d, new TableDataGetter <ThingDef>("defName", (ThingDef d) => d.defName), new TableDataGetter <ThingDef>("appearance rate in " + 100 + " trade requests", (ThingDef d) => ((float)counts[d] / 100f).ToStringPercent()));
        }
示例#5
0
        public ANRule(TradeRequestComp Comp) : this()
        {
            Quant_       = Comp.requestCount;
            NotifyUnder_ = false;

            ThingDef def = Comp.requestThingDef;

            RuleLabel = "Generated: " + Comp.CompInspectStringExtra();

            //Get type via label
            Type t = ASLibMod.GetSingleton.GetBaseFilters.First(x => x.GetType().FullName == "RWAutoSell.Filters.FilterCat").GetType();    //.First(x. => x.Label == "RWAutoSell.FilterCat".Translate()).GetType();

            //create filtercontainer using type, and populate data
            FilterContainer cat = new FilterContainer(t)
            {
                FilterData = new List <string>()
                {
                    "thg." + def.defName
                }
            };

            Nodes_[0].RootNode.Filters.Add(cat);

            if (def.HasComp(typeof(CompQuality)))
            {
                //and another type/container pair for quality, underlying byte value for normal is '2'
                Type t2 = ASLibMod.GetSingleton.GetBaseFilters.First(x => x.GetType().FullName == "RWAutoSell.Filters.FilterQuality").GetType();
                //Type t2 = ASLibMod.GetSingleton.GetBaseFilters.First(x => x.Label == "Quality".Translate()).GetType();

                List <string> data = new List <string>();
                foreach (QualityCategory qc in QualityUtility.AllQualityCategories)
                {
                    if ((int)qc >= 2)
                    {
                        data.Add(((byte)qc).ToString());
                    }
                }

                FilterContainer qlt = new FilterContainer(t2)
                {
                    FilterData = data
                };
                Nodes_[0].RootNode.Filters.Add(qlt);
            }

            if (def.IsApparel)
            {
                Type t3 = ASLibMod.GetSingleton.GetBaseFilters.First(x => x.GetType().FullName == "RWAutoSell.Filters.FilterApparel").GetType();

                List <string> data = new List <string>();
                data.Add("tnt.1");

                FilterContainer app = new FilterContainer(t3)
                {
                    FilterData = data
                };
                Nodes_[0].RootNode.Filters.Add(app);
            }
        }
示例#6
0
 public override void Cleanup()
 {
     base.Cleanup();
     if (!keepAfterQuestEnds)
     {
         TradeRequestComp component = settlement.GetComponent <TradeRequestComp>();
         if (component != null && component.ActiveRequest)
         {
             component.Disable();
         }
     }
 }
 public override void Notify_QuestSignalReceived(Signal signal)
 {
     base.Notify_QuestSignalReceived(signal);
     if (signal.tag == inSignal)
     {
         TradeRequestComp component = settlement.GetComponent <TradeRequestComp>();
         if (component != null && component.ActiveRequest)
         {
             component.Disable();
         }
     }
 }
示例#8
0
        public override void QuestPartTick()
        {
            base.QuestPartTick();
            if (settlement == null || !settlement.Spawned)
            {
                Complete();
                return;
            }
            TradeRequestComp component = settlement.GetComponent <TradeRequestComp>();

            if (component == null || !component.ActiveRequest)
            {
                Complete(settlement.Named("SUBJECT"));
            }
        }
示例#9
0
        public static List <TradeRequestComp> GetRequests()
        {
            //List<ANRule> possiblerules = new List<ANRule>();
            List <TradeRequestComp> comps = new List <TradeRequestComp>();

            //ANRule rule = new ANRule();

            foreach (WorldObject wo in Find.WorldObjects.AllWorldObjects)
            {
                TradeRequestComp tr = wo.GetComponent <TradeRequestComp>();
                if (tr != null && tr.ActiveRequest)
                {
                    comps.Add(tr); //new ANRule(tr));
                }
            }
            return(comps);
        }
示例#10
0
 public override void AssignDebugData()
 {
     base.AssignDebugData();
     inSignal   = "DebugSignal" + Rand.Int;
     settlement = Find.WorldObjects.Settlements.Where(delegate(Settlement x)
     {
         TradeRequestComp component = x.GetComponent <TradeRequestComp>();
         return(component != null && !component.ActiveRequest && x.Faction != Faction.OfPlayer);
     }).RandomElementWithFallback();
     if (settlement == null)
     {
         settlement = Find.WorldObjects.Settlements.RandomElementWithFallback();
     }
     requestedThingDef = ThingDefOf.Silver;
     requestedCount    = 100;
     requestDuration   = 60000;
 }
示例#11
0
        public bool TryGenerateTradeRequest(TradeRequestComp target, Map map)
        {
            int num = this.RandomOfferDurationTicks(map.Tile, target.parent.Tile);

            if (num < 1)
            {
                return(false);
            }
            if (!IncidentWorker_QuestTradeRequest.TryFindRandomRequestedThingDef(map, out target.requestThingDef, out target.requestCount))
            {
                return(false);
            }
            target.rewards.ClearAndDestroyContents(DestroyMode.Vanish);
            target.rewards.TryAddRangeOrTransfer(IncidentWorker_QuestTradeRequest.GenerateRewardsFor(target.requestThingDef, target.requestCount, target.parent.Faction, map), true, true);
            target.expiration = Find.TickManager.TicksGame + num;
            return(true);
        }
示例#12
0
        public bool TryGenerateTradeRequest(TradeRequestComp target, Map map)
        {
            int num = RandomOfferDurationTicks(map.Tile, target.parent.Tile);

            if (num < 1)
            {
                return(false);
            }
            if (!TryFindRandomRequestedThingDef(map, out target.requestThingDef, out target.requestCount))
            {
                return(false);
            }
            target.rewards.ClearAndDestroyContents();
            target.rewards.TryAddRangeOrTransfer(GenerateRewardsFor(target.requestThingDef, target.requestCount, target.parent.Faction, map), canMergeWithExistingStacks: true, destroyLeftover: true);
            target.expiration = Find.TickManager.TicksGame + num;
            return(true);
        }
示例#13
0
        public override void DoWindowContents(Rect inRect)
        {
            //create a 2 by 1 table
            ASTable table = new ASTable(inRect, 2, 1, 4, 0);

            Rect selectable = table.GetRectangle(0, 0);

            //seperate bottom part for cancel button
            Rect cancelrect = selectable.BottomPartPixels(30f);

            selectable.height -= 30f;

            CompBox.DrawListBox(selectable);

            if (Widgets.ButtonText(cancelrect, "Close".Translate()))
            {
                Close();
            }

            //if something is selected, get comp, create label;
            if (CompBox.GetSelectedIndex != -1)
            {
                TradeRequestComp tc = CompBox.GetSelected;
                Widgets.Label(table.GetRectangle(1, 0),

                              "RWAutoSell.NotifySummary".Translate(tc.parent.Faction.Name, tc.requestCount + "x " + tc.requestThingDef.LabelCap, tc.rewards.ContentsString)

                              //"From: " + Environment.NewLine + tc.parent.Faction.Name + Environment.NewLine + Environment.NewLine +
                              //"Request: " + Environment.NewLine + tc.requestCount + "x " + tc.requestThingDef.LabelCap + Environment.NewLine + Environment.NewLine +
                              //"Reward: " + Environment.NewLine + tc.rewards.ContentsString
                              );

                //create rule, add rule to comp, notify Maintab needs a refresh, close dialog
                if (Widgets.ButtonText(table.GetRectangle(1, 0).BottomPartPixels(30f), "Create"))
                {
                    ANRule newrule = new ANRule(CompBox.GetSelected);
                    map.GetComponent <ANMapComp>().Add(newrule);
                    ASLibMod.GuiRefresh = true;
                    Close();
                }
            }
        }
示例#14
0
 public static IEnumerable <FloatMenuOption> GetFloatMenuOptions(CompLaunchablePawn representative, IEnumerable <IThingHolder> pods, Settlement settlement)
 {
     if (settlement.Faction == Faction.OfPlayer)
     {
         return(Enumerable.Empty <FloatMenuOption>());
     }
     return(ByakheeArrivalActionUtility.GetFloatMenuOptions <ByakheeArrivalAction_GiveGift>(() => ByakheeArrivalAction_GiveGift.CanGiveGiftTo(pods, settlement), () => new ByakheeArrivalAction_GiveGift(settlement), "GiveGiftViaTransportPods".Translate(settlement.Faction.Name, FactionGiftUtility.GetGoodwillChange(pods, settlement).ToStringWithSign()), representative, settlement.Tile, delegate(Action action)
     {
         TradeRequestComp tradeReqComp = settlement.GetComponent <TradeRequestComp>();
         if (tradeReqComp.ActiveRequest && pods.Any((IThingHolder p) => p.GetDirectlyHeldThings().Contains(tradeReqComp.requestThingDef)))
         {
             Find.WindowStack.Add(new Dialog_MessageBox("GiveGiftViaTransportPodsTradeRequestWarning".Translate(), "Yes".Translate(), delegate()
             {
                 action();
             }, "No".Translate(), null, null, false, null, null, WindowLayer.Dialog));
             return;
         }
         action();
     }));
 }
示例#15
0
        public override void Notify_QuestSignalReceived(Signal signal)
        {
            base.Notify_QuestSignalReceived(signal);
            if (!(signal.tag == inSignal))
            {
                return;
            }
            TradeRequestComp component = settlement.GetComponent <TradeRequestComp>();

            if (component != null)
            {
                if (component.ActiveRequest)
                {
                    Log.Error("Settlement " + settlement.Label + " already has an active trade request.");
                    return;
                }
                component.requestThingDef = requestedThingDef;
                component.requestCount    = requestedCount;
                component.expiration      = Find.TickManager.TicksGame + requestDuration;
            }
        }
示例#16
0
        public void Notify_RelationKindChanged(Faction other, FactionRelationKind previousKind, bool canSendLetter, string reason, GlobalTargetInfo lookTarget, out bool sentLetter)
        {
            if (Current.ProgramState != ProgramState.Playing || other != Faction.OfPlayer)
            {
                canSendLetter = false;
            }
            sentLetter = false;
            FactionRelationKind factionRelationKind = this.RelationKindWith(other);

            if (factionRelationKind == FactionRelationKind.Hostile && Current.ProgramState == ProgramState.Playing)
            {
                foreach (Pawn current in PawnsFinder.AllMapsWorldAndTemporary_Alive.ToList <Pawn>())
                {
                    if ((current.Faction == this && current.HostFaction == other) || (current.Faction == other && current.HostFaction == this))
                    {
                        current.guest.SetGuestStatus(current.HostFaction, true);
                    }
                }
            }
            if (other == Faction.OfPlayer && !this.HostileTo(Faction.OfPlayer))
            {
                List <Site> list  = new List <Site>();
                List <Site> sites = Find.WorldObjects.Sites;
                for (int i = 0; i < sites.Count; i++)
                {
                    if (sites[i].factionMustRemainHostile && sites[i].Faction == this && !sites[i].HasMap)
                    {
                        list.Add(sites[i]);
                    }
                }
                if (list.Any <Site>())
                {
                    string label;
                    string text;
                    if (list.Count == 1)
                    {
                        label = "LetterLabelSiteNoLongerHostile".Translate();
                        text  = "LetterSiteNoLongerHostile".Translate(new object[]
                        {
                            this.Name,
                            list[0].Label
                        });
                    }
                    else
                    {
                        StringBuilder stringBuilder = new StringBuilder();
                        for (int j = 0; j < list.Count; j++)
                        {
                            if (stringBuilder.Length != 0)
                            {
                                stringBuilder.AppendLine();
                            }
                            stringBuilder.Append("  - " + list[j].LabelCap);
                            ImportantPawnComp component = list[j].GetComponent <ImportantPawnComp>();
                            if (component != null && component.pawn.Any)
                            {
                                stringBuilder.Append(" (" + component.pawn[0].LabelCap + ")");
                            }
                        }
                        label = "LetterLabelSiteNoLongerHostileMulti".Translate();
                        text  = "LetterSiteNoLongerHostileMulti".Translate(new object[]
                        {
                            this.Name
                        }) + ":\n\n" + stringBuilder;
                    }
                    Find.LetterStack.ReceiveLetter(label, text, LetterDefOf.NeutralEvent, new LookTargets(from x in list
                                                                                                          select new GlobalTargetInfo(x.Tile)), null, null);
                    for (int k = 0; k < list.Count; k++)
                    {
                        Find.WorldObjects.Remove(list[k]);
                    }
                }
            }
            if (other == Faction.OfPlayer && this.HostileTo(Faction.OfPlayer))
            {
                List <WorldObject> allWorldObjects = Find.WorldObjects.AllWorldObjects;
                for (int l = 0; l < allWorldObjects.Count; l++)
                {
                    if (allWorldObjects[l].Faction == this)
                    {
                        TradeRequestComp component2 = allWorldObjects[l].GetComponent <TradeRequestComp>();
                        if (component2 != null && component2.ActiveRequest)
                        {
                            component2.Disable();
                        }
                    }
                }
            }
            if (canSendLetter)
            {
                string empty = string.Empty;
                this.TryAppendRelationKindChangedInfo(ref empty, previousKind, factionRelationKind, reason);
                if (factionRelationKind == FactionRelationKind.Hostile)
                {
                    Find.LetterStack.ReceiveLetter("LetterLabelRelationsChange_Hostile".Translate(new object[]
                    {
                        this.name
                    }), empty, LetterDefOf.NegativeEvent, lookTarget, this, null);
                    sentLetter = true;
                }
                else if (factionRelationKind == FactionRelationKind.Ally)
                {
                    Find.LetterStack.ReceiveLetter("LetterLabelRelationsChange_Ally".Translate(new object[]
                    {
                        this.name
                    }), empty, LetterDefOf.PositiveEvent, lookTarget, this, null);
                    sentLetter = true;
                }
                else if (factionRelationKind == FactionRelationKind.Neutral)
                {
                    if (previousKind == FactionRelationKind.Hostile)
                    {
                        Find.LetterStack.ReceiveLetter("LetterLabelRelationsChange_NeutralFromHostile".Translate(new object[]
                        {
                            this.name
                        }), empty, LetterDefOf.PositiveEvent, lookTarget, this, null);
                        sentLetter = true;
                    }
                    else
                    {
                        Find.LetterStack.ReceiveLetter("LetterLabelRelationsChange_NeutralFromAlly".Translate(new object[]
                        {
                            this.name
                        }), empty, LetterDefOf.NeutralEvent, lookTarget, this, null);
                        sentLetter = true;
                    }
                }
            }
            if (Current.ProgramState == ProgramState.Playing)
            {
                List <Map> maps = Find.Maps;
                for (int m = 0; m < maps.Count; m++)
                {
                    maps[m].attackTargetsCache.Notify_FactionHostilityChanged(this, other);
                    LordManager lordManager = maps[m].lordManager;
                    for (int n = 0; n < lordManager.lords.Count; n++)
                    {
                        Lord lord = lordManager.lords[n];
                        if (lord.faction == other)
                        {
                            lord.Notify_FactionRelationsChanged(this, previousKind);
                        }
                        else if (lord.faction == this)
                        {
                            lord.Notify_FactionRelationsChanged(other, previousKind);
                        }
                    }
                }
            }
        }
        public bool GenerateCaravanRequest(TradeRequestComp target, Map map)
        {
            int num = this.RandomOfferDuration(map.Tile, target.parent.Tile);

            if (num < 1)
            {
                return(false);
            }
            target.requestThingDef = IncidentWorker_ArcaneScriptCaravan.RandomRequestedThingDef();
            if (target.requestThingDef == null)
            {
                Log.Error("Attempted to create a caravan request, but couldn't find a valid request object");
                return(false);
            }
            Thing   item          = new Thing();
            Faction playerFaction = new Faction();

            playerFaction.def = FactionDefOf.PlayerColony;

            target.requestCount = IncidentWorker_ArcaneScriptCaravan.RandomRequestCount(target.requestThingDef, map);
            target.rewards.ClearAndDestroyContents(DestroyMode.Vanish);
            System.Random random = new System.Random();
            int           rnd    = GenMath.RoundRandom(random.Next(0, 25));

            if (rnd < 1)
            {
                item = ThingMaker.MakeThing(TorannMagicDefOf.BookOfInnerFire, null);
                target.rewards.TryAdd(item, true);
            }
            else if (rnd >= 1 && rnd < 2)
            {
                item = ThingMaker.MakeThing(TorannMagicDefOf.BookOfHeartOfFrost, null);
                target.rewards.TryAdd(item, true);
            }
            else if (rnd >= 2 && rnd < 3)
            {
                item = ThingMaker.MakeThing(TorannMagicDefOf.BookOfStormBorn, null);
                target.rewards.TryAdd(item, true);
            }
            else if (rnd >= 3 && rnd < 4)
            {
                item = ThingMaker.MakeThing(TorannMagicDefOf.BookOfArcanist, null);
                target.rewards.TryAdd(item, true);
            }
            else if (rnd >= 4 && rnd < 5)
            {
                item = ThingMaker.MakeThing(TorannMagicDefOf.BookOfValiant, null);
                target.rewards.TryAdd(item, true);
            }
            else if (rnd >= 5 && rnd < 6)
            {
                item = ThingMaker.MakeThing(TorannMagicDefOf.BookOfSummoner, null);
                target.rewards.TryAdd(item, true);
            }
            else if (rnd >= 6 && rnd < 7)
            {
                item = ThingMaker.MakeThing(TorannMagicDefOf.BookOfGladiator, null);
                target.rewards.TryAdd(item, true);
            }
            else if (rnd >= 7 && rnd < 8)
            {
                item = ThingMaker.MakeThing(TorannMagicDefOf.BookOfDruid, null);
                target.rewards.TryAdd(item, true);
            }
            else if (rnd >= 8 && rnd < 9)
            {
                item = ThingMaker.MakeThing(TorannMagicDefOf.BookOfNecromancer, null);
                target.rewards.TryAdd(item, true);
            }
            else if (rnd >= 9 && rnd < 10)
            {
                item = ThingMaker.MakeThing(TorannMagicDefOf.BookOfPriest, null);
                target.rewards.TryAdd(item, true);
            }
            else if (rnd >= 10 && rnd < 11)
            {
                item = ThingMaker.MakeThing(TorannMagicDefOf.BookOfBladedancer, null);
                target.rewards.TryAdd(item, true);
            }
            else if (rnd >= 11 && rnd < 12)
            {
                item = ThingMaker.MakeThing(TorannMagicDefOf.BookOfSniper, null);
                target.rewards.TryAdd(item, true);
            }
            else if (rnd >= 12 && rnd < 13)
            {
                item = ThingMaker.MakeThing(TorannMagicDefOf.BookOfRanger, null);
                target.rewards.TryAdd(item, true);
            }
            else if (rnd >= 13 && rnd < 14)
            {
                item = ThingMaker.MakeThing(TorannMagicDefOf.BookOfQuestion, null);
                target.rewards.TryAdd(item, true);
            }
            else if (rnd >= 14 && rnd < 15)
            {
                item = ThingMaker.MakeThing(TorannMagicDefOf.BookOfFaceless, null);
                target.rewards.TryAdd(item, true);
            }
            else if (rnd >= 15 && rnd < 16)
            {
                item = ThingMaker.MakeThing(TorannMagicDefOf.BookOfDemons, null);
                target.rewards.TryAdd(item, true);
            }
            else if (rnd >= 16 && rnd < 17)
            {
                item = ThingMaker.MakeThing(TorannMagicDefOf.BookOfBard, null);
                target.rewards.TryAdd(item, true);
            }
            else
            {
                for (int i = 0; i < 3; i++)
                {
                    if (Rand.Range(0, 10) > 9.3f)
                    {
                        item = ThingMaker.MakeThing(TorannMagicDefOf.SpellOf_Blink, null);
                        target.rewards.TryAdd(item, true);
                    }
                    else if (Rand.Range(0, 10) > 9.3f)
                    {
                        item = ThingMaker.MakeThing(TorannMagicDefOf.SpellOf_Teleport, null);
                        target.rewards.TryAdd(item, true);
                    }
                    else if (Rand.Range(0, 10) > 9.3f)
                    {
                        item = ThingMaker.MakeThing(TorannMagicDefOf.SpellOf_Heal, null);
                        target.rewards.TryAdd(item, true);
                    }
                    else if (Rand.Range(0, 10) > 9.3f)
                    {
                        item = ThingMaker.MakeThing(TorannMagicDefOf.SpellOf_Rain, null);
                        target.rewards.TryAdd(item, true);
                    }
                    else if (Rand.Range(0, 10) > 9.3f)
                    {
                        item = ThingMaker.MakeThing(TorannMagicDefOf.SpellOf_Heater, null);
                        target.rewards.TryAdd(item, true);
                    }
                    else if (Rand.Range(0, 10) > 9.3f)
                    {
                        item = ThingMaker.MakeThing(TorannMagicDefOf.SpellOf_Cooler, null);
                        target.rewards.TryAdd(item, true);
                    }
                    else if (Rand.Range(0, 10) > 9.3f)
                    {
                        item = ThingMaker.MakeThing(TorannMagicDefOf.SkillOf_InnerHealing, null);
                        target.rewards.TryAdd(item, true);
                    }

                    else if (Rand.Range(0, 10) > 9.3f)
                    {
                        item = ThingMaker.MakeThing(TorannMagicDefOf.SkillOf_HeavyBlow, null);
                        target.rewards.TryAdd(item, true);
                    }
                    else if (Rand.Range(0, 10) > 9.3f)
                    {
                        item = ThingMaker.MakeThing(TorannMagicDefOf.SpellOf_DryGround, null);
                        target.rewards.TryAdd(item, true);
                    }
                    else if (Rand.Range(0, 10) > 9.3f)
                    {
                        item = ThingMaker.MakeThing(TorannMagicDefOf.SpellOf_WetGround, null);
                        target.rewards.TryAdd(item, true);
                    }
                    else if (Rand.Range(0, 10) > 9.3f)
                    {
                        item = ThingMaker.MakeThing(TorannMagicDefOf.SkillOf_GearRepair, null);
                        target.rewards.TryAdd(item, true);
                    }
                    else if (Rand.Range(0, 10) > 9.3f)
                    {
                        item = ThingMaker.MakeThing(TorannMagicDefOf.SpellOf_ChargeBattery, null);
                        target.rewards.TryAdd(item, true);
                    }
                    else if (Rand.Range(0, 10) > 9.3f)
                    {
                        item = ThingMaker.MakeThing(TorannMagicDefOf.SkillOf_Sprint, null);
                        target.rewards.TryAdd(item, true);
                    }
                    else if (Rand.Range(0, 10) > 9.3f)
                    {
                        item = ThingMaker.MakeThing(TorannMagicDefOf.SpellOf_SmokeCloud, null);
                        target.rewards.TryAdd(item, true);
                    }
                    else if (Rand.Range(0, 10) > 9.3f)
                    {
                        item = ThingMaker.MakeThing(TorannMagicDefOf.SkillOf_FightersFocus, null);
                        target.rewards.TryAdd(item, true);
                    }
                    else if (Rand.Range(0, 10) > 9.3f)
                    {
                        item = ThingMaker.MakeThing(TorannMagicDefOf.SpellOf_EMP, null);
                        target.rewards.TryAdd(item, true);
                    }
                    else if (Rand.Range(0, 10) > 9.3f)
                    {
                        item = ThingMaker.MakeThing(TorannMagicDefOf.SpellOf_Extinguish, null);
                        target.rewards.TryAdd(item, true);
                    }
                    else if (Rand.Range(0, 10) > 9.3f)
                    {
                        item = ThingMaker.MakeThing(TorannMagicDefOf.SkillOf_StrongBack, null);
                        target.rewards.TryAdd(item, true);
                    }
                    else if (Rand.Range(0, 10) > 9.3f)
                    {
                        item = ThingMaker.MakeThing(TorannMagicDefOf.SpellOf_SiphonMana, null);
                        target.rewards.TryAdd(item, true);
                    }
                    else if (Rand.Range(0, 10) > 9.3f)
                    {
                        item = ThingMaker.MakeThing(TorannMagicDefOf.SpellOf_TransferMana, null);
                        target.rewards.TryAdd(item, true);
                    }
                    else if (Rand.Range(0, 10) > 9.3f)
                    {
                        item = ThingMaker.MakeThing(TorannMagicDefOf.SpellOf_ManaShield, null);
                        target.rewards.TryAdd(item, true);
                    }
                    else if (Rand.Range(0, 10) > 9.3f)
                    {
                        item = ThingMaker.MakeThing(TorannMagicDefOf.SkillOf_ThickSkin, null);
                        target.rewards.TryAdd(item, true);
                    }
                    else if (Rand.Range(0, 10) > 9.3f)
                    {
                        item = ThingMaker.MakeThing(TorannMagicDefOf.SpellOf_FertileLands, null);
                        target.rewards.TryAdd(item, true);
                    }
                    else if (Rand.Range(0, 10) > 9.3f)
                    {
                        item = ThingMaker.MakeThing(TorannMagicDefOf.SpellOf_SummonMinion, null);
                        target.rewards.TryAdd(item, true);
                    }
                    else if (Rand.Range(0, 10) > 9.3f)
                    {
                        item = ThingMaker.MakeThing(TorannMagicDefOf.SpellOf_CauterizeWound, null);
                        target.rewards.TryAdd(item, true);
                    }
                    else if (Rand.Range(0, 10) > 9.3f)
                    {
                        item = ThingMaker.MakeThing(TorannMagicDefOf.SpellOf_SpellMending, null);
                        target.rewards.TryAdd(item, true);
                    }
                    else
                    {
                        item = ThingMaker.MakeThing(TorannMagicDefOf.ManaPotion, null);
                        target.rewards.TryAdd(item, true);
                    }
                }
            }

            if (item == null)
            {
                item = ThingMaker.MakeThing(TorannMagicDefOf.BookOfValiant, null);
                target.rewards.TryAdd(item, true);
            }
            target.expiration = Find.TickManager.TicksGame + num;
            return(true);
        }
        public static Quest MakeAndAddTradeRequestQuest(WorldObject destination, string description, TradeRequestComp tradeRequest)
        {
            Quest quest = Quest.MakeRaw();

            quest.SetInitiallyAccepted();
            string text = "Quest" + quest.id + ".TradeRequestSite";

            QuestUtility.AddQuestTag(ref destination.questTags, text);
            QuestPartUtility.MakeAndAddEndCondition <QuestPart_NoWorldObject>(quest, quest.InitiateSignal, QuestEndOutcome.Unknown).worldObject = destination;
            QuestPartUtility.MakeAndAddEndCondition <QuestPart_NoWorldObject>(quest, text + ".TradeRequestFulfilled", QuestEndOutcome.Success);
            if (destination.rewards != null)
            {
                QuestPart_GiveToCaravan questPart_GiveToCaravan = new QuestPart_GiveToCaravan
                {
                    inSignal = text + ".TradeRequestFulfilled",
                    Things   = destination.rewards
                };
                foreach (Thing thing in questPart_GiveToCaravan.Things)
                {
                    thing.holdingOwner = null;
                }
                quest.AddPart(questPart_GiveToCaravan);
            }
            quest.description = description;
            Find.QuestManager.Add(quest);
            return(quest);
        }
        public override void PostLoadSavegame(string loadingVersion)
        {
            oldCrashedShipParts.Clear();
            foreach (UpgradedCrashedShipPart upgradedCrashedShipPart in upgradedCrashedShipParts)
            {
                Thing   thing   = upgradedCrashedShipPart.thing;
                IntVec3 invalid = IntVec3.Invalid;
                Map     map     = null;
                if (thing.Spawned)
                {
                    invalid = thing.Position;
                    map     = thing.Map;
                }
                else
                {
                    Skyfaller obj = thing.ParentHolder as Skyfaller;
                    if (obj == null)
                    {
                        thing.Destroy();
                    }
                    invalid = obj.Position;
                    map     = obj.Map;
                }
                if (!(invalid == IntVec3.Invalid))
                {
                    invalid = new IntVec3(invalid.x - Mathf.CeilToInt((float)thing.def.size.x / 2f), invalid.y, invalid.z);
                    Thing item = null;
                    if (upgradedCrashedShipPart.originalDefName == "CrashedPoisonShipPart" || upgradedCrashedShipPart.originalDefName == "PoisonSpreaderShipPart")
                    {
                        item = ThingMaker.MakeThing(ThingDefOf.DefoliatorShipPart);
                    }
                    else if (upgradedCrashedShipPart.originalDefName == "CrashedPsychicEmanatorShipPart")
                    {
                        item = ThingMaker.MakeThing(ThingDefOf.PsychicDronerShipPart);
                    }
                    ActiveDropPodInfo activeDropPodInfo = new ActiveDropPodInfo();
                    activeDropPodInfo.innerContainer.TryAdd(item, 1);
                    activeDropPodInfo.openDelay = 60;
                    activeDropPodInfo.leaveSlag = false;
                    activeDropPodInfo.despawnPodBeforeSpawningThing = true;
                    activeDropPodInfo.spawnWipeMode = WipeMode.Vanish;
                    DropPodUtility.MakeDropPodAt(invalid, map, activeDropPodInfo);
                }
            }
            upgradedCrashedShipParts.Clear();
            List <Site> sites = Find.WorldObjects.Sites;
            int         l;

            for (l = 0; l < sites.Count; l++)
            {
                if (!Find.QuestManager.QuestsListForReading.Any((Quest x) => x.QuestLookTargets.Contains(sites[l])))
                {
                    Quest quest = Quest.MakeRaw();
                    QuestUtility.GenerateBackCompatibilityNameFor(quest);
                    quest.SetInitiallyAccepted();
                    quest.appearanceTick = sites[l].creationGameTicks;
                    TimeoutComp component = sites[l].GetComponent <TimeoutComp>();
                    if (component != null && component.Active && !sites[l].HasMap)
                    {
                        QuestPartUtility.MakeAndAddQuestTimeoutDelay(quest, component.TicksLeft, sites[l]);
                        component.StopTimeout();
                    }
                    QuestPartUtility.MakeAndAddEndCondition <QuestPart_NoWorldObject>(quest, quest.InitiateSignal, QuestEndOutcome.Unknown).worldObject = sites[l];
                    ChoiceLetter choiceLetter = Find.Archive.ArchivablesListForReading.OfType <ChoiceLetter>().FirstOrDefault((ChoiceLetter x) => x.lookTargets != null && x.lookTargets.targets.Contains(sites[l]));
                    if (choiceLetter != null)
                    {
                        quest.description = choiceLetter.text;
                    }
                    Find.QuestManager.Add(quest);
                }
            }
            List <WorldObject> worldObjects = Find.WorldObjects.AllWorldObjects;
            int k;

            for (k = 0; k < worldObjects.Count; k++)
            {
                if (worldObjects[k].def == WorldObjectDefOf.EscapeShip && !Find.QuestManager.QuestsListForReading.Any((Quest x) => x.PartsListForReading.Any((QuestPart y) => y is QuestPart_NoWorldObject && ((QuestPart_NoWorldObject)y).worldObject == worldObjects[k])))
                {
                    MakeAndAddWorldObjectQuest(worldObjects[k], null);
                }
            }
            int j;

            for (j = 0; j < worldObjects.Count; j++)
            {
                if (worldObjects[j] is PeaceTalks && !Find.QuestManager.QuestsListForReading.Any((Quest x) => x.PartsListForReading.Any((QuestPart y) => y is QuestPart_NoWorldObject && ((QuestPart_NoWorldObject)y).worldObject == worldObjects[j])))
                {
                    Quest        quest2        = MakeAndAddWorldObjectQuest(worldObjects[j], null);
                    ChoiceLetter choiceLetter2 = Find.Archive.ArchivablesListForReading.OfType <ChoiceLetter>().FirstOrDefault((ChoiceLetter x) => x.lookTargets != null && x.lookTargets.targets.Contains(worldObjects[j]));
                    if (choiceLetter2 != null)
                    {
                        quest2.description = choiceLetter2.text;
                    }
                }
            }
            int i;

            for (i = 0; i < worldObjects.Count; i++)
            {
                TradeRequestComp component2 = worldObjects[i].GetComponent <TradeRequestComp>();
                if (component2 != null && component2.ActiveRequest && !Find.QuestManager.QuestsListForReading.Any((Quest x) => x.PartsListForReading.Any((QuestPart y) => y is QuestPart_NoWorldObject && ((QuestPart_NoWorldObject)y).worldObject == worldObjects[i])))
                {
                    Quest        quest3        = MakeAndAddTradeRequestQuest(worldObjects[i], null, component2);
                    ChoiceLetter choiceLetter3 = Find.Archive.ArchivablesListForReading.OfType <ChoiceLetter>().FirstOrDefault((ChoiceLetter x) => x.lookTargets != null && x.lookTargets.targets.Contains(worldObjects[i]));
                    if (choiceLetter3 != null)
                    {
                        quest3.description = choiceLetter3.text;
                    }
                }
            }
        }
示例#20
0
        public void Notify_RelationKindChanged(Faction other, FactionRelationKind previousKind, bool canSendLetter, string reason, GlobalTargetInfo lookTarget, out bool sentLetter)
        {
            if (Current.ProgramState != ProgramState.Playing || other != OfPlayer)
            {
                canSendLetter = false;
            }
            sentLetter = false;
            ColoredText.ClearCache();
            FactionRelationKind factionRelationKind = RelationKindWith(other);

            if (factionRelationKind == FactionRelationKind.Hostile)
            {
                if (Current.ProgramState == ProgramState.Playing)
                {
                    foreach (Pawn item in PawnsFinder.AllMapsWorldAndTemporary_Alive.ToList())
                    {
                        if ((item.Faction == this && item.HostFaction == other) || (item.Faction == other && item.HostFaction == this))
                        {
                            item.guest.SetGuestStatus(item.HostFaction, prisoner: true);
                        }
                    }
                }
                if (other == OfPlayer)
                {
                    QuestUtility.SendQuestTargetSignals(questTags, "BecameHostileToPlayer", this.Named("SUBJECT"));
                }
            }
            if (other == OfPlayer && !this.HostileTo(OfPlayer))
            {
                List <Site> list  = new List <Site>();
                List <Site> sites = Find.WorldObjects.Sites;
                for (int i = 0; i < sites.Count; i++)
                {
                    if (sites[i].factionMustRemainHostile && sites[i].Faction == this && !sites[i].HasMap)
                    {
                        list.Add(sites[i]);
                    }
                }
                if (list.Any())
                {
                    string str;
                    string str2;
                    if (list.Count == 1)
                    {
                        str  = "LetterLabelSiteNoLongerHostile".Translate();
                        str2 = "LetterSiteNoLongerHostile".Translate(NameColored, list[0].Label);
                    }
                    else
                    {
                        StringBuilder stringBuilder = new StringBuilder();
                        for (int j = 0; j < list.Count; j++)
                        {
                            if (stringBuilder.Length != 0)
                            {
                                stringBuilder.AppendLine();
                            }
                            stringBuilder.Append("  - " + list[j].LabelCap);
                            ImportantPawnComp component = list[j].GetComponent <ImportantPawnComp>();
                            if (component != null && component.pawn.Any)
                            {
                                stringBuilder.Append(" (" + component.pawn[0].LabelCap + ")");
                            }
                        }
                        str  = "LetterLabelSiteNoLongerHostileMulti".Translate();
                        str2 = (string)("LetterSiteNoLongerHostileMulti".Translate(NameColored) + ":\n\n") + stringBuilder;
                    }
                    Find.LetterStack.ReceiveLetter(str, str2, LetterDefOf.NeutralEvent, new LookTargets(list.Select((Site x) => new GlobalTargetInfo(x.Tile))));
                    for (int k = 0; k < list.Count; k++)
                    {
                        list[k].Destroy();
                    }
                }
            }
            if (other == OfPlayer && this.HostileTo(OfPlayer))
            {
                List <WorldObject> allWorldObjects = Find.WorldObjects.AllWorldObjects;
                for (int l = 0; l < allWorldObjects.Count; l++)
                {
                    if (allWorldObjects[l].Faction == this)
                    {
                        TradeRequestComp component2 = allWorldObjects[l].GetComponent <TradeRequestComp>();
                        if (component2 != null && component2.ActiveRequest)
                        {
                            component2.Disable();
                        }
                    }
                }
                foreach (Map map in Find.Maps)
                {
                    map.passingShipManager.RemoveAllShipsOfFaction(this);
                }
            }
            if (canSendLetter)
            {
                TaggedString text = "";
                TryAppendRelationKindChangedInfo(ref text, previousKind, factionRelationKind, reason);
                switch (factionRelationKind)
                {
                case FactionRelationKind.Hostile:
                    Find.LetterStack.ReceiveLetter("LetterLabelRelationsChange_Hostile".Translate(Name), text, LetterDefOf.NegativeEvent, lookTarget, this);
                    sentLetter = true;
                    break;

                case FactionRelationKind.Ally:
                    Find.LetterStack.ReceiveLetter("LetterLabelRelationsChange_Ally".Translate(Name), text, LetterDefOf.PositiveEvent, lookTarget, this);
                    sentLetter = true;
                    break;

                case FactionRelationKind.Neutral:
                    if (previousKind == FactionRelationKind.Hostile)
                    {
                        Find.LetterStack.ReceiveLetter("LetterLabelRelationsChange_NeutralFromHostile".Translate(Name), text, LetterDefOf.PositiveEvent, lookTarget, this);
                        sentLetter = true;
                    }
                    else
                    {
                        Find.LetterStack.ReceiveLetter("LetterLabelRelationsChange_NeutralFromAlly".Translate(Name), text, LetterDefOf.NeutralEvent, lookTarget, this);
                        sentLetter = true;
                    }
                    break;
                }
            }
            if (Current.ProgramState != ProgramState.Playing)
            {
                return;
            }
            List <Map> maps = Find.Maps;

            for (int m = 0; m < maps.Count; m++)
            {
                maps[m].attackTargetsCache.Notify_FactionHostilityChanged(this, other);
                LordManager lordManager = maps[m].lordManager;
                for (int n = 0; n < lordManager.lords.Count; n++)
                {
                    Lord lord = lordManager.lords[n];
                    if (lord.faction == other)
                    {
                        lord.Notify_FactionRelationsChanged(this, previousKind);
                    }
                    else if (lord.faction == this)
                    {
                        lord.Notify_FactionRelationsChanged(other, previousKind);
                    }
                }
            }
        }