private void FillIncidentQueue() { // Add some visits float days = Rand.Range(8f, 15f); foreach (var faction in Find.FactionManager.AllFactionsVisible.Where(f => !f.IsPlayer && f != Faction.OfPlayer && f.PlayerGoodwill > 0).OrderByDescending(f => f.PlayerGoodwill)) { Log.Message(faction.GetCallLabel() + " are coming after " + days + " days."); GuestUtility.PlanNewVisit(map, days, faction); days += Rand.Range(10f, 15f); } }
private static void TryCreateVisit(Map map, float days, Faction faction, float travelFactor = 1) { var travelDays = GenericUtility.GetTravelDays(faction, map); // ReSharper disable once CompareOfFloatsByEqualityOperator if (travelDays == GenericUtility.NoBasesLeft) { return; } GuestUtility.PlanNewVisit(map, days + travelDays * travelFactor, faction); }
public override bool TryExecute(IncidentParms parms) { if (!TryResolveParms(parms)) { return(false); } if (parms.faction == Faction.OfPlayer) { return(false); } Map map = (Map)parms.target; if (parms.points < 40) { Log.ErrorOnce("Trying to spawn visitors, but points are too low.", 9827456); return(false); } if (parms.faction == null) { Log.ErrorOnce("Trying to spawn visitors, but couldn't find valid faction.", 43638973); return(false); } if (!parms.spawnCenter.IsValid) { Log.ErrorOnce("Trying to spawn visitors, but could not find a valid spawn point.", 94839643); return(false); } string reasons; // We check here instead of CanFireNow, so we can reschedule the visit. // Any reasons not to come? if (CheckCanCome(map, parms.faction, out reasons)) { // No, spawn return(SpawnGroup(parms, map)); } // Yes, ask the player for permission ShowAskMayComeDialog(parms.faction, reasons, // Permission, spawn () => SpawnGroup(parms, map), // No permission, come again later () => { Log.Message("Come back later"); GuestUtility.PlanNewVisit(map, Rand.Range(2f, 5f), parms.faction); }); return(true); }
private bool SpawnGroup(IncidentParms parms, Map map) { List <Pawn> visitors; try { //Log.Message(string.Format("Spawning visitors from {0}, at {1}.", parms.faction, parms.spawnCenter)); visitors = SpawnPawns(parms); CheckVisitorsValid(visitors); } catch (Exception e) { Log.ErrorOnce("Something failed when spawning visitors: " + e.Message + "\n" + e.StackTrace, 464365853); GuestUtility.PlanNewVisit(map, Rand.Range(1f, 3f), parms.faction); return(true); // be gone, event } if (visitors == null || visitors.Count == 0) { return(false); } foreach (var visitor in visitors) { GuestUtility.AddNeedJoy(visitor); GuestUtility.AddNeedComfort(visitor); visitor.FixTimetable(); visitor.FixDrugPolicy(); //Log.Message(visitor.NameStringShort + ": " // + visitor.drugs.CurrentPolicy[ThingDefOf.Luciferium].allowedForJoy); visitor.GetComp <CompGuest>().sentAway = false; } var spot = GetSpot(map, visitors.First().GetGuestArea()); if (!spot.IsValid) { Log.ErrorOnce("Visitors failed to find a valid travel target.", 827358325); foreach (var visitor in visitors) { visitor.DestroyOrPassToWorld(); } return(false); } GiveItems(visitors); CreateLord(parms.faction, spot, visitors, map); return(true); }
private static float PlanRevisit(Faction faction, float targetGoodwill, Map currentMap, bool sentAway) { float days; if (faction.defeated) { return(100); } if (targetGoodwill < -50) { return(100); } else if (targetGoodwill > 0) { days = Mathf.Lerp(Rand.Range(5f, 7f), Rand.Range(0f, 2f), targetGoodwill / 100f); } else { days = Mathf.Lerp(Rand.Range(7f, 12f), Rand.Range(25f, 30f), targetGoodwill / -100f); } if (sentAway) { days += 10; } Map randomVisitMap = Rand.Value < 0.1f ? Find.Maps.Where(m => m.IsPlayerHome).RandomElement() : currentMap; if (Rand.Value < targetGoodwill / 100f && Rand.Value < 0.2f) { // Send another friendly faction as well Faction newFaction; if (Find.FactionManager.AllFactionsVisible.Where(f => f != faction && !f.defeated && !f.HostileTo(Faction.OfPlayer)).TryRandomElement(out newFaction)) { GuestUtility.PlanNewVisit(currentMap, days * 2 + GenericUtility.GetTravelDays(newFaction, currentMap), newFaction); } } //Log.Message(faction.def.LabelCap + " will visit again in " + days + " days (+" + GenericUtility.GetTravelDays(faction, randomVisitMap)*2 + " days for travel)."); GuestUtility.PlanNewVisit(randomVisitMap, days + GenericUtility.GetTravelDays(faction, randomVisitMap) * 2, faction); return(days); }
public override bool TryExecute(IncidentParms parms) { if (!TryResolveParms(parms)) { return(false); } Map map = (Map)parms.target; // We check here instead of CanFireNow, so we can reschedule the visit. if (!CheckCanCome(map, parms.faction)) { GuestUtility.PlanNewVisit(map, Rand.Range(1f, 3f), parms.faction); return(false); } if (parms.points < 40) { Log.ErrorOnce("Trying to spawn visitors, but points are too low.", 9827456); return(false); } if (parms.faction == null) { Log.ErrorOnce("Trying to spawn visitors, but couldn't find valid faction.", 43638973); return(false); } if (!parms.spawnCenter.IsValid) { Log.ErrorOnce("Trying to spawn visitors, but could not find a valid spawn point.", 94839643); return(false); } List <Pawn> visitors; try { //Log.Message(string.Format("Spawning visitors from {0}, at {1}.", parms.faction, parms.spawnCenter)); visitors = SpawnPawns(parms); } catch (Exception e) { Log.ErrorOnce("Something failed when spawning visitors: " + e.Message + "\n" + e.StackTrace, 464365853); return(true); // be gone, event } if (visitors == null || visitors.Count == 0) { return(false); } foreach (var visitor in visitors) { GuestUtility.AddNeedJoy(visitor); GuestUtility.AddNeedComfort(visitor); visitor.FixTimetable(); visitor.FixDrugPolicy(); //Log.Message(visitor.NameStringShort + ": " // + visitor.drugs.CurrentPolicy[ThingDefOf.Luciferium].allowedForJoy); } var rooms = GetRooms(visitors[0], map); if (rooms.Length > 0) { var spot = rooms[0].room.Cells.Where(c => c.Roofed(map)).RandomElement(); GiveItems(visitors); CreateLord(parms.faction, spot, visitors, map); return(true); } return(false); }
public override bool TryExecute(IncidentParms parms) { if (!TryResolveParms(parms)) { return(false); } Map map = parms.target as Map; // Is map not available anymore? if (map == null) { return(true); } if (parms.points < 40) { Log.ErrorOnce("Trying to spawn visitors, but points are too low.", 9827456); return(false); } if (parms.faction == null) { Log.ErrorOnce("Trying to spawn visitors, but couldn't find valid faction.", 43638973); return(false); } if (!parms.spawnCenter.IsValid) { Log.ErrorOnce("Trying to spawn visitors, but could not find a valid spawn point.", 94839643); return(false); } if (parms.faction == Faction.OfPlayer) { Log.ErrorOnce("Trying to spawn visitors, but they are of Faction.OfPlayer.", 3464363); return(true); } if (parms.faction.RelationWith(Faction.OfPlayer).hostile) { Log.ErrorOnce("Trying to spawn visitors, but they are hostile to the player (now).", 4736345); return(true); } string reasons; // We check here instead of CanFireNow, so we can reschedule the visit. // Any reasons not to come? if (CheckCanCome(map, parms.faction, out reasons)) { // No, spawn return(SpawnGroup(parms, map)); } // Yes, ask the player for permission var spawnDirection = GetSpawnDirection(map, parms.spawnCenter); ShowAskMayComeDialog(parms.faction, map, reasons, spawnDirection, // Permission, spawn () => SpawnGroup(parms, map), // No permission, come again later () => { GuestUtility.PlanNewVisit(map, Rand.Range(2f, 5f), parms.faction); }); return(true); }