Esempio n. 1
0
        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);
            }
        }
Esempio n. 2
0
        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);
        }
Esempio n. 6
0
        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);
        }
Esempio n. 7
0
        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);
        }