コード例 #1
0
ファイル: HarmonyPatches.cs プロジェクト: Taranchuk/RimWar
        public static bool CallForAid_Replacement_Patch(Map map, Faction faction)
        {
            Faction ofPlayer       = Faction.OfPlayer;
            int     goodwillChange = -25;
            bool    canSendMessage = false;
            string  reason         = "GoodwillChangedReason_RequestedMilitaryAid".Translate();

            faction.TryAffectGoodwillWith(ofPlayer, goodwillChange, canSendMessage, true, reason);
            IncidentParms incidentParms = new IncidentParms();

            incidentParms.target  = map;
            incidentParms.faction = faction;
            incidentParms.raidArrivalModeForQuickMilitaryAid = true;
            incidentParms.points = DiplomacyTuning.RequestedMilitaryAidPointsRange.RandomInRange;
            faction.lastMilitaryAidRequestTick = Find.TickManager.TicksGame;
            RimWarData           rwd     = WorldUtility.GetRimWarDataForFaction(faction);
            RimWarSettlementComp rwdTown = rwd.WorldSettlements.RandomElement().GetComponent <RimWarSettlementComp>();

            if (rwdTown != null)
            {
                int pts = Mathf.RoundToInt(rwdTown.RimWarPoints / 2);
                if (rwd.CanLaunch)
                {
                    WorldUtility.CreateLaunchedWarband(pts, rwd, rwdTown.parent as RimWorld.Planet.Settlement, rwdTown.parent.Tile, Find.WorldObjects.SettlementAt(map.Tile), WorldObjectDefOf.Settlement);
                }
                else
                {
                    WorldUtility.CreateWarband(pts, rwd, rwdTown.parent as RimWorld.Planet.Settlement, rwdTown.parent.Tile, Find.WorldObjects.SettlementAt(map.Tile), WorldObjectDefOf.Settlement);
                }
                rwdTown.RimWarPoints = pts;
                return(false);
            }
            return(true);
        }
コード例 #2
0
        private static void DebugResetAllMobileUnits()
        {
            int resetCount            = 0;
            List <WorldObject> woList = Find.WorldObjects.AllWorldObjects;

            if (woList != null && woList.Count > 0)
            {
                for (int i = 0; i < woList.Count; i++)
                {
                    WarObject rwo = woList[i] as WarObject;
                    if (rwo != null)
                    {
                        RimWarData rwd = WorldUtility.GetRimWarDataForFaction(rwo.Faction);
                        if (rwd != null && rwd.WorldSettlements != null && rwd.WorldSettlements.Count > 0)
                        {
                            resetCount++;
                            RimWorld.Planet.Settlement settlement = rwd.WorldSettlements.RandomElement();
                            if (settlement != null)
                            {
                                if (settlement.Destroyed)
                                {
                                    Log.Warning("Detected destroyed settlement in Rim War data for " + rwd.RimWarFaction.Name);
                                }
                                else
                                {
                                    RimWarSettlementComp rwsc = settlement.GetComponent <RimWarSettlementComp>();
                                    if (rwsc != null)
                                    {
                                        rwsc.RimWarPoints += rwo.RimWarPoints;
                                    }
                                    else
                                    {
                                        Log.Warning("Found no Rim War component for settlement " + settlement.Label);
                                        Log.Warning("Settlement in faction " + settlement.Faction);
                                        Log.Warning("Settlement defname " + settlement.def.defName);
                                    }
                                }
                            }
                            else
                            {
                                Log.Warning("Detected null settlement in Rim War data for " + rwd.RimWarFaction.Name);
                            }
                            if (!rwo.Destroyed)
                            {
                                rwo.Destroy();
                            }
                        }
                        else
                        {
                            Log.Warning("Tried to reset unit but no Faction data exists - cleaning up object.");
                            if (!rwo.Destroyed)
                            {
                                rwo.Destroy();
                            }
                        }
                    }
                }
                Log.Message("Reset " + resetCount + " Rim War units.");
            }
        }
コード例 #3
0
ファイル: HarmonyPatches.cs プロジェクト: Taranchuk/RimWar
            private static void Postfix(FactionManager __instance, Faction faction)
            {
                RimWarData rwd = WorldUtility.GetRimWarDataForFaction(faction);

                if (rwd != null)
                {
                    WorldUtility.RemoveRWDFaction(rwd);
                }
            }
コード例 #4
0
 private static void Postfix(WorldObject __instance)
 {
     if (__instance is RimWorld.Planet.Settlement)
     {
         RimWarData rwd = WorldUtility.GetRimWarDataForFaction(__instance.Faction);
         for (int i = 0; i < rwd.FactionSettlements.Count; i++)
         {
             if (rwd.FactionSettlements[i].Tile == __instance.Tile)
             {
                 rwd.FactionSettlements.Remove(rwd.FactionSettlements[i]);
                 break;
             }
         }
         if (rwd.FactionSettlements.Count <= 0)
         {
             WorldUtility.RemoveRWDFaction(rwd);
         }
     }
 }
コード例 #5
0
ファイル: HarmonyPatches.cs プロジェクト: Taranchuk/RimWar
        //private static void DrawFactionRow_WithFactionPoints_Postfix(Faction faction, float rowY, Rect fillRect, ref float __result)
        //{
        //    if (!Prefs.DevMode)
        //    {
        //        Rect rect = new Rect(35f, rowY + __result, 250f, 80f);
        //        StringBuilder stringBuilder = new StringBuilder();
        //        string text = stringBuilder.ToString();
        //        float width = fillRect.width - rect.xMax;
        //        float num = Text.CalcHeight(text, width);
        //        float num2 = Mathf.Max(80f, num);
        //        Rect position = new Rect(10f, rowY + 10f, 15f, 15f);
        //        Rect rect2 = new Rect(0f, rowY + __result, fillRect.width, num2);
        //        if (Mouse.IsOver(rect2))
        //        {
        //            GUI.DrawTexture(rect2, TexUI.HighlightTex);
        //        }
        //        Text.Font = GameFont.Small;
        //        Text.Anchor = TextAnchor.UpperLeft;
        //        Widgets.DrawRectFast(position, faction.Color);
        //        string label = "RW_FactionPower".Translate(WorldUtility.GetRimWarDataForFaction(faction) == null ? 0 : WorldUtility.GetRimWarDataForFaction(faction).TotalFactionPoints);
        //        label += "\n" + "RW_FactionBehavior".Translate(WorldUtility.GetRimWarDataForFaction(faction).behavior.ToString());
        //        Widgets.Label(rect, label);
        //        if (!faction.IsPlayer)
        //        {

        //        }
        //        __result += num2;
        //    }
        //}

        private static void Settlement_InspectString_WithPoints_Postfix(RimWorld.Planet.Settlement __instance, ref string __result)
        {
            if (!__instance.Faction.def.hidden)
            {
                RimWarSettlementComp rwsc = __instance.GetComponent <RimWarSettlementComp>();
                RimWarData           rwd  = WorldUtility.GetRimWarDataForFaction(__instance.Faction);
                if (rwsc != null && rwd != null)
                {
                    string text = "";
                    if (!__result.NullOrEmpty())
                    {
                        text += "\n";
                    }

                    text += "RW_SettlementPoints".Translate(rwsc.RimWarPoints + "\n" + "RW_FactionBehavior".Translate(rwd.behavior.ToString()));

                    __result += text;
                }
            }
        }
コード例 #6
0
        //private static void DrawFactionRow_WithFactionPoints_Postfix(Faction faction, float rowY, Rect fillRect, ref float __result)
        //{
        //    if (!Prefs.DevMode)
        //    {
        //        Rect rect = new Rect(35f, rowY + __result, 250f, 80f);
        //        StringBuilder stringBuilder = new StringBuilder();
        //        string text = stringBuilder.ToString();
        //        float width = fillRect.width - rect.xMax;
        //        float num = Text.CalcHeight(text, width);
        //        float num2 = Mathf.Max(80f, num);
        //        Rect position = new Rect(10f, rowY + 10f, 15f, 15f);
        //        Rect rect2 = new Rect(0f, rowY + __result, fillRect.width, num2);
        //        if (Mouse.IsOver(rect2))
        //        {
        //            GUI.DrawTexture(rect2, TexUI.HighlightTex);
        //        }
        //        Text.Font = GameFont.Small;
        //        Text.Anchor = TextAnchor.UpperLeft;
        //        Widgets.DrawRectFast(position, faction.Color);
        //        string label = "RW_FactionPower".Translate(WorldUtility.GetRimWarDataForFaction(faction) == null ? 0 : WorldUtility.GetRimWarDataForFaction(faction).TotalFactionPoints);
        //        label += "\n" + "RW_FactionBehavior".Translate(WorldUtility.GetRimWarDataForFaction(faction).behavior.ToString());
        //        Widgets.Label(rect, label);
        //        if (!faction.IsPlayer)
        //        {

        //        }
        //        __result += num2;
        //    }
        //}

        private static void Settlement_InspectString_WithPoints_Postfix(RimWorld.Planet.Settlement __instance, ref string __result)
        {
            if (!__instance.Faction.def.hidden)
            {
                RimWarData rwData = WorldUtility.GetRimWarDataForFaction(__instance.Faction);
                if (rwData != null)
                {
                    string text = "";
                    if (!__result.NullOrEmpty())
                    {
                        text += "\n";
                    }
                    for (int i = 0; i < rwData.FactionSettlements.Count; i++)
                    {
                        if (rwData.FactionSettlements[i].Tile == __instance.Tile)
                        {
                            text += "RW_SettlementPoints".Translate(rwData.FactionSettlements[i].RimWarPoints + "\n" + rwData.behavior.ToString());
                            break;
                        }
                    }
                    __result += text;
                }
            }
        }
コード例 #7
0
        public static void CallForAid(WarObject rwo, int pts, Map map, Faction faction, int callRelationsCost, RimWarData rwd, Settlement sendingSettlement)
        {
            Faction ofPlayer       = Faction.OfPlayer;
            bool    canSendMessage = false;
            string  reason         = "GoodwillChangedReason_RequestedMilitaryAid".Translate();

            faction.TryAffectGoodwillWith(ofPlayer, -callRelationsCost, canSendMessage, true, reason);
            sendingSettlement.GetComponent <RimWarSettlementComp>().RimWarPoints -= pts;
            WorldUtility.CreateWarObjectOfType(rwo, pts, rwd, sendingSettlement, sendingSettlement.Tile, Find.WorldObjects.SettlementAt(map.Tile), WorldObjectDefOf.Settlement);
        }
コード例 #8
0
        public static DiaOption RequestTraderOption(Map map, Faction faction, Pawn negotiator)
        {
            RimWarData rwd          = WorldUtility.GetRimWarDataForFaction(faction);
            float      daysToArrive = 0f;
            Settlement wos          = null;
            int        requestCost  = 15;

            if (rwd != null)
            {
                wos = rwd.ClosestSettlementTo(map.Tile, 200);
                if (wos != null)
                {
                    daysToArrive = (float)Utility.ArrivalTimeEstimator.EstimatedTicksToArrive(wos.Tile, map.Tile, (int)(2500f / rwd.movementAttribute)) / 60000f;
                }
            }
            TaggedString taggedString = "RequestTrader".Translate(requestCost);

            if (wos != null)
            {
                taggedString = "RequestTrader".Translate(requestCost) + "\n" + "RW_RequestAddition".Translate(wos.Name, daysToArrive.ToString("#.#"));
            }
            if (wos == null)
            {
                DiaOption diaOptionUnable = new DiaOption(taggedString);
                diaOptionUnable.Disable("RW_NoTownForRequest".Translate());
                return(diaOptionUnable);
            }
            if (faction.PlayerRelationKind != FactionRelationKind.Ally)
            {
                DiaOption diaOption = new DiaOption(taggedString);
                diaOption.Disable("MustBeAlly".Translate());
                return(diaOption);
            }
            if (rwd == null)
            {
                DiaOption diaOptionRWD = new DiaOption(taggedString);
                diaOptionRWD.Disable("RW_InvalidRWD".Translate());
                return(diaOptionRWD);
            }
            if (!faction.def.allowedArrivalTemperatureRange.ExpandedBy(-4f).Includes(map.mapTemperature.SeasonalTemp))
            {
                DiaOption diaOption2 = new DiaOption(taggedString);
                diaOption2.Disable("BadTemperature".Translate());
                return(diaOption2);
            }
            int num = faction.lastTraderRequestTick + 240000 - Find.TickManager.TicksGame;

            if (num > 0)
            {
                DiaOption diaOption3 = new DiaOption(taggedString);
                diaOption3.Disable("WaitTime".Translate(num.ToStringTicksToPeriod()));
                return(diaOption3);
            }
            DiaOption diaOption4 = new DiaOption(taggedString);
            DiaNode   diaNode    = new DiaNode("TraderSent".Translate(faction.leader).CapitalizeFirst());

            diaNode.options.Add(OKToRoot(faction, negotiator));
            DiaNode diaNode2 = new DiaNode("ChooseTraderKind".Translate(faction.leader));

            foreach (TraderKindDef item in from x in faction.def.caravanTraderKinds
                     where x.requestable
                     select x)
            {
                TraderKindDef localTk    = item;
                DiaOption     diaOption5 = new DiaOption(localTk.LabelCap);
                if (localTk.TitleRequiredToTrade != null && (negotiator.royalty == null || localTk.TitleRequiredToTrade.seniority > negotiator.GetCurrentTitleSeniorityIn(faction)))
                {
                    DiaNode   diaNode3   = new DiaNode("TradeCaravanRequestDeniedDueTitle".Translate(negotiator.Named("NEGOTIATOR"), localTk.TitleRequiredToTrade.GetLabelCapFor(negotiator).Named("TITLE"), faction.Named("FACTION")));
                    DiaOption diaOption6 = new DiaOption("GoBack".Translate());
                    diaNode3.options.Add(diaOption6);
                    diaOption5.link = diaNode3;
                    diaOption6.link = diaNode2;
                }
                else
                {
                    diaOption5.action = delegate
                    {
                        Trader trader = WorldUtility.CreateTrader(200, rwd, wos, wos.Tile, Find.WorldObjects.SettlementAt(map.Tile), WorldObjectDefOf.Settlement);
                        trader.traderKind = localTk;
                        wos.GetComponent <RimWarSettlementComp>().RimWarPoints -= 200;
                        faction.lastTraderRequestTick = Find.TickManager.TicksGame;
                        faction.TryAffectGoodwillWith(Faction.OfPlayer, -requestCost, false, true, "GoodwillChangedReason_RequestedTrader".Translate());
                    };
                    diaOption5.link = diaNode;
                }
                diaNode2.options.Add(diaOption5);
            }
            DiaOption diaOption7 = new DiaOption("GoBack".Translate());

            diaOption7.linkLateBind = ResetToRoot(faction, negotiator);
            diaNode2.options.Add(diaOption7);
            diaOption4.link = diaNode2;
            return(diaOption4);
        }
コード例 #9
0
        public static DiaOption RequestMilitaryAid_LaunchedWarband_Option(Map map, Faction faction, Pawn negotiator)
        {
            RimWarData rwd          = WorldUtility.GetRimWarDataForFaction(faction);
            float      daysToArrive = 0f;
            Settlement wos          = null;
            int        requestCost  = 25;
            int        minPoints    = 0;

            if (rwd != null)
            {
                minPoints = (int)(Find.WorldObjects.SettlementAt(map.Tile).GetComponent <RimWarSettlementComp>().RimWarPoints *.9f);
                wos       = rwd.ClosestSettlementTo(map.Tile, minPoints);
                if (wos != null)
                {
                    daysToArrive = (float)Utility.ArrivalTimeEstimator.EstimatedTicksToArrive(wos.Tile, map.Tile, 100) / 60000f;
                }
            }
            string text = "RequestMilitaryAid".Translate(requestCost);

            if (wos != null)
            {
                text = "RW_RequestLaunchedWarband".Translate(requestCost, wos.Name, daysToArrive.ToString("#.#"), (int)(minPoints * rwd.combatAttribute));
            }
            if (wos == null)
            {
                DiaOption diaOptionUnable = new DiaOption(text);
                diaOptionUnable.Disable("RW_NoTownForRequest".Translate());
                return(diaOptionUnable);
            }
            if (faction.PlayerRelationKind != FactionRelationKind.Ally)
            {
                DiaOption diaOption = new DiaOption(text);
                diaOption.Disable("MustBeAlly".Translate());
                return(diaOption);
            }
            if (!faction.def.allowedArrivalTemperatureRange.ExpandedBy(-4f).Includes(map.mapTemperature.SeasonalTemp))
            {
                DiaOption diaOption2 = new DiaOption(text);
                diaOption2.Disable("BadTemperature".Translate());
                return(diaOption2);
            }
            int num = faction.lastMilitaryAidRequestTick + 60000 - Find.TickManager.TicksGame;

            if (num > 0)
            {
                DiaOption diaOption3 = new DiaOption(text);
                diaOption3.Disable("WaitTime".Translate(num.ToStringTicksToPeriod()));
                return(diaOption3);
            }
            if (!rwd.CanLaunch)
            {
                DiaOption diaOption4 = new DiaOption(text);
                diaOption4.Disable("RW_FactionIncapableOfTech".Translate(faction.Name));
                return(diaOption4);
            }
            DiaOption             diaOption5 = new DiaOption(text);
            IEnumerable <Faction> source     = (from x in map.attackTargetsCache.TargetsHostileToColony
                                                where GenHostility.IsActiveThreatToPlayer(x)
                                                select((Thing)x).Faction).Where(delegate(Faction x)
            {
                if (x != null)
                {
                    return(!x.HostileTo(faction));
                }
                return(false);
            }).Distinct();

            if (source.Any())
            {
                DiaNode diaNode = new DiaNode("MilitaryAidConfirmMutualEnemy".Translate(faction.Name, (from fa in source
                                                                                                       select fa.Name).ToCommaList(useAnd: true)));
                DiaOption diaOption6 = new DiaOption("CallConfirm".Translate());
                diaOption6.action = delegate
                {
                    Faction ofPlayer       = Faction.OfPlayer;
                    bool    canSendMessage = false;
                    string  reason         = "GoodwillChangedReason_RequestedMilitaryAid".Translate();
                    faction.TryAffectGoodwillWith(ofPlayer, -requestCost, canSendMessage, true, reason);
                    wos.GetComponent <RimWarSettlementComp>().RimWarPoints -= minPoints;
                    WorldUtility.CreateLaunchedWarband(minPoints, rwd, wos, wos.Tile, Find.WorldObjects.SettlementAt(map.Tile), WorldObjectDefOf.Settlement);
                };
                diaOption6.link = FightersSent(faction, negotiator);
                DiaOption diaOption7 = new DiaOption("CallCancel".Translate());
                diaOption7.linkLateBind = ResetToRoot(faction, negotiator);
                diaNode.options.Add(diaOption6);
                diaNode.options.Add(diaOption7);
                diaOption5.link = diaNode;
            }
            else
            {
                diaOption5.action = delegate
                {
                    Faction ofPlayer       = Faction.OfPlayer;
                    bool    canSendMessage = false;
                    string  reason         = "GoodwillChangedReason_RequestedMilitaryAid".Translate();
                    faction.TryAffectGoodwillWith(ofPlayer, -requestCost, canSendMessage, true, reason);
                    wos.GetComponent <RimWarSettlementComp>().RimWarPoints -= minPoints;
                    WorldUtility.CreateLaunchedWarband(minPoints, rwd, wos, wos.Tile, Find.WorldObjects.SettlementAt(map.Tile), WorldObjectDefOf.Settlement);
                };
                diaOption5.link = FightersSent(faction, negotiator);
            }

            return(diaOption5);
        }
コード例 #10
0
        public static DiaOption RequestMilitaryAid_Warband_Option(Map map, Faction faction, Pawn negotiator)
        {
            RimWarData rwd          = WorldUtility.GetRimWarDataForFaction(faction);
            float      daysToArrive = 0f;
            Settlement wos          = null;
            int        requestCost  = 20;
            int        minPoints    = 0;

            if (rwd != null)
            {
                minPoints = (int)(Find.WorldObjects.SettlementAt(map.Tile).GetComponent <RimWarSettlementComp>().RimWarPoints * 1.15f);
                wos       = rwd.ClosestSettlementTo(map.Tile, minPoints);
                if (wos != null)
                {
                    daysToArrive = (float)Utility.ArrivalTimeEstimator.EstimatedTicksToArrive(wos.Tile, map.Tile, (int)(2800f * (1f / rwd.movementAttribute))) / 60000f;
                }
            }
            string text = "RequestMilitaryAid".Translate(requestCost);

            if (wos != null)
            {
                text = "RW_RequestWarband".Translate(requestCost, wos.Name, daysToArrive.ToString("#.#"), (int)(minPoints * rwd.combatAttribute));
            }
            if (wos == null)
            {
                DiaOption diaOptionUnable = new DiaOption(text);
                diaOptionUnable.Disable("RW_NoTownForRequest".Translate());
                return(diaOptionUnable);
            }
            if (faction.PlayerRelationKind != FactionRelationKind.Ally)
            {
                DiaOption diaOption = new DiaOption(text);
                diaOption.Disable("MustBeAlly".Translate());
                return(diaOption);
            }
            if (!faction.def.allowedArrivalTemperatureRange.ExpandedBy(-4f).Includes(map.mapTemperature.SeasonalTemp))
            {
                DiaOption diaOption2 = new DiaOption(text);
                diaOption2.Disable("BadTemperature".Translate());
                return(diaOption2);
            }
            int num = faction.lastMilitaryAidRequestTick + 60000 - Find.TickManager.TicksGame;

            if (num > 0)
            {
                DiaOption diaOption3 = new DiaOption(text);
                diaOption3.Disable("WaitTime".Translate(num.ToStringTicksToPeriod()));
                return(diaOption3);
            }
            //if (NeutralGroupIncidentUtility.AnyBlockingHostileLord(map, faction))
            //{
            //    DiaOption diaOption4 = new DiaOption(text);
            //    diaOption4.Disable("HostileVisitorsPresent".Translate());
            //    return diaOption4;
            //}
            DiaOption             diaOption5 = new DiaOption(text);
            IEnumerable <Faction> source     = (from x in map.attackTargetsCache.TargetsHostileToColony
                                                where GenHostility.IsActiveThreatToPlayer(x)
                                                select((Thing)x).Faction).Where(delegate(Faction x)
            {
                if (x != null)
                {
                    return(!x.HostileTo(faction));
                }
                return(false);
            }).Distinct();

            if (source.Any())
            {
                DiaNode diaNode = new DiaNode("MilitaryAidConfirmMutualEnemy".Translate(faction.Name, (from fa in source
                                                                                                       select fa.Name).ToCommaList(useAnd: true)));
                DiaOption diaOption6 = new DiaOption("CallConfirm".Translate());
                diaOption6.action = delegate
                {
                    CallForAid(new Warband(), minPoints, map, faction, requestCost, rwd, wos);
                };
                diaOption6.link = FightersSent(faction, negotiator);
                DiaOption diaOption7 = new DiaOption("CallCancel".Translate());
                diaOption7.linkLateBind = ResetToRoot(faction, negotiator);
                diaNode.options.Add(diaOption6);
                diaNode.options.Add(diaOption7);
                diaOption5.link = diaNode;
            }
            else
            {
                diaOption5.action = delegate
                {
                    CallForAid(new Warband(), minPoints, map, faction, requestCost, rwd, wos);
                };
                diaOption5.link = FightersSent(faction, negotiator);
            }

            return(diaOption5);
        }
コード例 #11
0
        public static void Debug_FixRimWarSettlements(bool generateReport = false, bool cleanupErrors = false)
        {
            int rwsCount             = 0;
            int wosCount             = 0;
            int rws_no_wosCount      = 0;
            int wos_no_rwsCount      = 0;
            int factionMismatchCount = 0;

            List <WorldObject> woList  = Find.WorldObjects.AllWorldObjects;
            List <WorldObject> wosList = new List <WorldObject>();

            wosList.Clear();
            for (int i = 0; i < woList.Count; i++)
            {
                RimWorld.Planet.Settlement wos = woList[i] as RimWorld.Planet.Settlement;
                if (wos != null)
                {
                    wosList.Add(wos);
                    wosCount++;
                    RimWarSettlementComp rws = WorldUtility.GetRimWarSettlementAtTile(wos.Tile);
                    if (rws != null)
                    {
                        if (wos.Destroyed)
                        {
                            if (generateReport)
                            {
                                Log.Warning(wos.Label + " destroyed but has RWSC");
                            }
                            if (cleanupErrors)
                            {
                                if (generateReport)
                                {
                                    Log.Message("Cleaning RWS...");
                                }
                                //WorldUtility.GetRimWarDataForFaction(wos.Faction)?.WorldSettlements?.Remove(rws);
                            }
                        }
                        else if (wos.Faction != rws.parent.Faction)
                        {
                            factionMismatchCount++;
                            if (generateReport)
                            {
                                Log.Warning(wos.Label + " of Faction " + wos.Faction + " different from RWS Faction " + rws.parent.Faction);
                            }
                            if (cleanupErrors)
                            {
                                if (generateReport)
                                {
                                    Log.Message("Removing RWS from " + rws.parent.Faction + "...");
                                }
                                //WorldUtility.GetRimWarDataForFaction(rws.parent.Faction)?.WorldSettlements?.Remove(rws);
                                if (generateReport)
                                {
                                    Log.Message("Adding RWS to " + wos.Faction + "...");
                                }
                                //rws.Faction = wos.Faction;
                                //WorldUtility.GetRimWarDataForFaction(wos.Faction)?.WorldSettlements?.Add(rws);
                            }
                        }
                    }
                    else
                    {
                        wos_no_rwsCount++;
                        if (generateReport)
                        {
                            Log.Warning("" + wos.Label + " has no RWS");
                        }
                        if (cleanupErrors)
                        {
                            if (generateReport)
                            {
                                Log.Message("Generating RWS for " + wos.Label + "...");
                            }
                            WorldUtility.CreateRimWarSettlement(WorldUtility.GetRimWarDataForFaction(wos.Faction), wos);
                        }
                    }
                }
            }

            List <RimWarData> rwdList = WorldUtility.Get_WCPT().RimWarData;

            for (int i = 0; i < rwdList.Count; i++)
            {
                RimWarData rwd = rwdList[i];
                if (rwd.WorldSettlements != null)
                {
                    for (int j = 0; j < rwd.WorldSettlements.Count; j++)
                    {
                        RimWarSettlementComp rws = rwd.WorldSettlements[j].GetComponent <RimWarSettlementComp>();
                        rwsCount++;
                        int wosHere = 0;
                        List <RimWorld.Planet.Settlement> wosHereList = new List <RimWorld.Planet.Settlement>();
                        wosHereList.Clear();
                        for (int k = 0; k < wosList.Count; k++)
                        {
                            if (wosList[k].Tile == rws.parent.Tile)
                            {
                                wosHere++;
                                wosHereList.Add(wosList[k] as RimWorld.Planet.Settlement);
                                if (wosList[k].Faction != rws.parent.Faction)
                                {
                                    factionMismatchCount++;
                                    if (generateReport)
                                    {
                                        Log.Warning(wosList[k].Label + " of Faction " + wosList[k].Faction + " different from RWS Faction " + rws.parent.Faction);
                                    }
                                    if (cleanupErrors)
                                    {
                                        if (generateReport)
                                        {
                                            Log.Message("Removing RWS from " + rws.parent.Faction + "...");
                                        }
                                        //WorldUtility.GetRimWarDataForFaction(rws.parent.Faction)?.WorldSettlements?.Remove(rws);
                                        if (generateReport)
                                        {
                                            Log.Message("Adding RWS to " + wosList[k].Faction + "...");
                                        }
                                        //rws.Faction = wosList[k].Faction;
                                        //WorldUtility.GetRimWarDataForFaction(wosList[k].Faction)?.WorldSettlements?.Add(rws);
                                    }
                                }
                            }
                        }
                        if (wosHere == 0)
                        {
                            rws_no_wosCount++;
                            if (generateReport)
                            {
                                Log.Warning("No settlement found at " + Find.WorldGrid.LongLatOf(rws.parent.Tile));
                            }
                            if (cleanupErrors)
                            {
                                if (generateReport)
                                {
                                    Log.Warning("Removing RWS...");
                                }
                                //rwd.FactionSettlements.Remove(rws);
                            }
                        }
                        if (wosHere > 1)
                        {
                            if (generateReport)
                            {
                                Log.Warning("Stacked settlements (" + wosHere + ") found at " + Find.WorldGrid.LongLatOf(rws.parent.Tile));
                            }
                            if (cleanupErrors)
                            {
                                while (wosHereList.Count > 1)
                                {
                                    if (generateReport)
                                    {
                                        Log.Message("Destroying settlement...");
                                    }
                                    RimWorld.Planet.Settlement wosHereDes = wosHereList[0];
                                    wosHereList.Remove(wosHereDes);
                                    if (!wosHereDes.Destroyed)
                                    {
                                        wosHereDes.Destroy();
                                    }
                                }
                            }
                        }
                    }
                }
                else
                {
                    if (generateReport)
                    {
                        Log.Warning("Found null RWD");
                    }
                    if (cleanupErrors)
                    {
                        if (generateReport)
                        {
                            Log.Message("Removing RWD...");
                        }
                        rwdList.Remove(rwd);
                    }
                }
            }

            if (generateReport)
            {
                bool errors = wos_no_rwsCount != 0 || rws_no_wosCount != 0 || factionMismatchCount != 0;
                Log.Message("Rim War Settlement Count: " + rwsCount);
                Log.Message("World Settlement Count: " + wosCount);
                if (!errors)
                {
                    Log.Message("No errors found.");
                }
                if (wos_no_rwsCount > 0)
                {
                    Log.Warning("Settlements without RWS component: " + wos_no_rwsCount);
                }
                if (rws_no_wosCount > 0)
                {
                    Log.Warning("Rim War components without Settlement: " + rws_no_wosCount);
                }
                if (factionMismatchCount > 0)
                {
                    Log.Warning("Faction mismatches: " + factionMismatchCount);
                }
            }
        }