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); }
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); }
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())); }
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); } }
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(); } } }
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")); } }
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); }
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; }
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); }
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); }
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(); } } }
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(); })); }
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; } }
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; } } } }
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); } } } }