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(); } }
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); } }
public override void MapComponentTick() { base.MapComponentTick(); if (incidentQueue == null) { incidentQueue = new IncidentQueue(); } if (incidentQueue.Count == 0) { FillIncidentQueue(); } incidentQueue.IncidentQueueTick(); }
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); }
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(); }
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."); }
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(); }