public override void MapComponentTick()
        {
            base.MapComponentTick();

            if (incidentQueue == null)
            {
                incidentQueue = new IncidentQueue();
            }
            if (incidentQueue.Count <= 1)
            {
                GenericUtility.FillIncidentQueue(map);
            }
            incidentQueue.IncidentQueueTick();

            if (GenTicks.TicksGame > nextQueueInspection)
            {
                nextQueueInspection = GenTicks.TicksGame + GenDate.TicksPerDay;
                GenericUtility.CheckTooManyIncidentsAtOnce(incidentQueue);
            }

            if (GenTicks.TicksGame > nextRogueGuestCheck)
            {
                nextRogueGuestCheck = GenTicks.TicksGame + GenDate.TicksPerHour;
                GuestUtility.CheckForRogueGuests(map);
            }

            if (GenTicks.TicksGame > nextGuestListCheck)
            {
                nextGuestListCheck = GenTicks.TicksGame + GenDate.TicksPerDay / 4;
                PresentLords.Clear();
                RefreshGuestListTotal();
            }
        }
예제 #2
0
        internal static void CheckTooManyIncidentsAtOnce(IncidentQueue incidentQueue)
        {
            var       maxIncidents = Settings.maxIncidentsPer3Days + 1;
            const int rangeOfDays  = 3;

            if (incidentQueue.Count < maxIncidents)
            {
                return;
            }
            int index = 0;

            foreach (QueuedIncident incident in incidentQueue)
            {
                index++;
                if (index == maxIncidents)
                {
                    if (incident.FireTick - GenTicks.TicksGame < GenDate.TicksPerDay * rangeOfDays)
                    {
                        Log.Message($"More than {maxIncidents - 1} visitor groups planned within the next {rangeOfDays} days. Cancelling half.");
                        RemoveSomeIncidents(incidentQueue);
                        return;
                    }
                }
            }
        }
        private void CreateNewIncidentQueue()
        {
            incidentQueue = new IncidentQueue();

            // Add some visits
            float days = Rand.Range(5, 10);

            foreach (var faction in Find.FactionManager.AllFactionsVisible.Where(f => !f.IsPlayer && 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);
            }
        }
예제 #4
0
        public override void MapComponentTick()
        {
            base.MapComponentTick();

            if (incidentQueue == null)
            {
                incidentQueue = new IncidentQueue();
            }
            if (incidentQueue.Count == 0)
            {
                FillIncidentQueue();
            }
            incidentQueue.IncidentQueueTick();
        }
예제 #5
0
 public static bool IncidentQueueAdd_Replacement_Prefix(IncidentQueue __instance, IncidentDef def, int fireTick, IncidentParms parms = null, int retryDurationTicks = 0)
 {
     if (def == IncidentDefOf.TraderCaravanArrival && fireTick == (Find.TickManager.TicksGame + 120000))
     {
         RimWarSettlementComp rwdTown = WorldUtility.GetClosestSettlementOfFaction(parms.faction, parms.target.Tile, 40);
         if (rwdTown != null)
         {
             WorldUtility.CreateTrader(Mathf.RoundToInt(rwdTown.RimWarPoints / 2), WorldUtility.GetRimWarDataForFaction(rwdTown.parent.Faction), rwdTown.parent as RimWorld.Planet.Settlement, rwdTown.parent.Tile, Find.WorldObjects.SettlementAt(parms.target.Tile), WorldObjectDefOf.Settlement);
             rwdTown.RimWarPoints = Mathf.RoundToInt(rwdTown.RimWarPoints / 2);
             return(false);
         }
     }
     return(true);
 }
예제 #6
0
        public static void GetFutureIncidentsLight(int numDays, Map forMap, out List <Pair <IncidentDef, IncidentParms> > allIncidents, out List <float> daysToEvents, StorytellerComp onlyThisComp = null)
        {
            int ticksGame = Find.TickManager.TicksGame;

            daysToEvents = new List <float>();
            IncidentQueue          incidentQueue      = Find.Storyteller.incidentQueue;
            List <IIncidentTarget> allIncidentTargets = Find.Storyteller.AllIncidentTargets;

            tmpOldStoryStates.Clear();
            for (int i = 0; i < allIncidentTargets.Count; i++)
            {
                IIncidentTarget incidentTarget = allIncidentTargets[i];
                tmpOldStoryStates.Add(incidentTarget, incidentTarget.StoryState);
                new StoryState(incidentTarget).CopyTo(incidentTarget.StoryState);
            }
            Find.Storyteller.incidentQueue = new IncidentQueue();
            int num = numDays * 60;

            allIncidents = new List <Pair <IncidentDef, IncidentParms> >();
            for (int j = 0; j < num; j++)
            {
                IEnumerable <FiringIncident> enumerable = (onlyThisComp == null) ? Find.Storyteller.MakeIncidentsForInterval() : Find.Storyteller.MakeIncidentsForInterval(onlyThisComp, Find.Storyteller.AllIncidentTargets);
                foreach (FiringIncident item in enumerable)
                {
                    if (item == null)
                    {
                        Log.Error("Null incident generated.");
                        continue;
                    }
                    if (item.parms.target == forMap)
                    {
                        item.parms.target.StoryState.Notify_IncidentFired(item);
                        allIncidents.Add(new Pair <IncidentDef, IncidentParms>(item.def, item.parms));
                        item.parms.target.StoryState.Notify_IncidentFired(item);
                        int num2 = Find.Storyteller.storytellerComps.IndexOf(item.source);
                        daysToEvents.Add(Find.TickManager.TicksGame.TicksToDays());
                    }
                }
                Find.TickManager.DebugSetTicksGame(Find.TickManager.TicksGame + 1000);
            }
            Find.TickManager.DebugSetTicksGame(ticksGame);
            Find.Storyteller.incidentQueue = incidentQueue;
            for (int k = 0; k < allIncidentTargets.Count; k++)
            {
                tmpOldStoryStates[allIncidentTargets[k]].CopyTo(allIncidentTargets[k].StoryState);
            }
            tmpOldStoryStates.Clear();
        }
예제 #7
0
        private static void RemoveSomeIncidents(IncidentQueue incidentQueue)
        {
            const int     rangeOfDays = 3;
            IncidentQueue backupQueue = new IncidentQueue();

            bool skip      = true;
            int  amount    = 0;
            int  newAmount = 0;

            // Copy and thin
            foreach (QueuedIncident incident in incidentQueue)
            {
                // After range of days copy everything
                if (incident.FireTick - GenTicks.TicksGame >= GenDate.TicksPerDay * rangeOfDays)
                {
                    backupQueue.Add(incident);
                }
                else
                {
                    // Before, copy every second incident
                    amount++;
                    if (!skip)
                    {
                        backupQueue.Add(incident);
                        newAmount++;
                    }
                    skip = !skip;
                }
            }
            // Add them back
            incidentQueue.Clear();
            foreach (QueuedIncident incident in backupQueue)
            {
                incidentQueue.Add(incident);
            }

            Log.Message($"Reduced {amount} visits to {newAmount}, by cancelling every 2nd within the next {rangeOfDays} days.");
        }
예제 #8
0
        public static void GetFutureIncidents(int numDays, Map forMap, out Dictionary <IIncidentTarget, int> incCountsForTarget, out int[] incCountsForComp, out List <Pair <IncidentDef, IncidentParms> > allIncidents, out int threatBigCount, out List <float> daysToEvents, StringBuilder outputSb = null, StorytellerComp onlyThisComp = null)
        {
            int ticksGame = Find.TickManager.TicksGame;

            daysToEvents = new List <float>();
            IncidentQueue          incidentQueue      = Find.Storyteller.incidentQueue;
            List <IIncidentTarget> allIncidentTargets = Find.Storyteller.AllIncidentTargets;

            tmpOldStoryStates.Clear();
            for (int i = 0; i < allIncidentTargets.Count; i++)
            {
                IIncidentTarget incidentTarget = allIncidentTargets[i];
                tmpOldStoryStates.Add(incidentTarget, incidentTarget.StoryState);
                new StoryState(incidentTarget).CopyTo(incidentTarget.StoryState);
            }
            Find.Storyteller.incidentQueue = new IncidentQueue();
            int num = numDays * 60;

            incCountsForComp   = new int[Find.Storyteller.storytellerComps.Count];
            incCountsForTarget = new Dictionary <IIncidentTarget, int>();
            allIncidents       = new List <Pair <IncidentDef, IncidentParms> >();
            threatBigCount     = 0;
            for (int j = 0; j < num; j++)
            {
                IEnumerable <FiringIncident> enumerable = (onlyThisComp == null) ? Find.Storyteller.MakeIncidentsForInterval() : Find.Storyteller.MakeIncidentsForInterval(onlyThisComp, Find.Storyteller.AllIncidentTargets);
                foreach (FiringIncident item in enumerable)
                {
                    if (item == null)
                    {
                        Log.Error("Null incident generated.");
                    }
                    if (item.parms.target == forMap)
                    {
                        item.parms.target.StoryState.Notify_IncidentFired(item);
                        allIncidents.Add(new Pair <IncidentDef, IncidentParms>(item.def, item.parms));
                        item.parms.target.StoryState.Notify_IncidentFired(item);
                        if (!incCountsForTarget.ContainsKey(item.parms.target))
                        {
                            incCountsForTarget[item.parms.target] = 0;
                        }
                        Dictionary <IIncidentTarget, int> dictionary;
                        IIncidentTarget target;
                        (dictionary = incCountsForTarget)[target = item.parms.target] = dictionary[target] + 1;
                        if (item.def.category == IncidentCategoryDefOf.ThreatBig)
                        {
                            threatBigCount++;
                        }
                        int num2 = Find.Storyteller.storytellerComps.IndexOf(item.source);
                        incCountsForComp[num2]++;
                        daysToEvents.Add(Find.TickManager.TicksGame.TicksToDays());
                    }
                }
                Find.TickManager.DebugSetTicksGame(Find.TickManager.TicksGame + 1000);
            }
            Find.TickManager.DebugSetTicksGame(ticksGame);
            Find.Storyteller.incidentQueue = incidentQueue;
            for (int k = 0; k < allIncidentTargets.Count; k++)
            {
                tmpOldStoryStates[allIncidentTargets[k]].CopyTo(allIncidentTargets[k].StoryState);
            }
            tmpOldStoryStates.Clear();
        }