// Convert Colony Bases to Settlements (this.Colony) for loading
        private void ConvertToCurrentGameSettlements()
        {
            var toAdd    = new List <Settlement>();
            var toRemove = new List <Colony>();

            foreach (var mapParent in this.WorldData.WorldObjectsHolder.MapParents)
            {
                if (!(mapParent is Colony))
                {
                    continue;
                }

                var colony = (Colony)mapParent;

                if (this.Colony == null || colony.PersistentColonyData == null || this.Colony.ColonyData == null || colony.PersistentColonyData.UniqueId != this.Colony.ColonyData.UniqueId)
                {
                    continue;
                }

                if (colony.Map == null)
                {
                    var map = Current.Game.FindMap(colony.Tile);

                    if (map != null)
                    {
                        map.info.parent = colony;
                    }
                    else
                    {
                        Log.Error("Null map for colony " + colony.PersistentColonyData.UniqueId + " at " + colony.Tile);

                        continue;
                    }
                }

                var settlement =
                    (Settlement)WorldObjectSameIDMaker.MakeWorldObject(WorldObjectDefOf.Settlement, colony.ID);
                settlement.SetFaction(Faction.OfPlayer);
                colony.Map.info.parent = settlement;
                settlement.Tile        = colony.Tile;

                settlement.Name          = colony.Name;
                settlement.namedByPlayer = colony.NamedByPlayer; // Prevents non-stop renaming.

                toAdd.Add(settlement);
                toRemove.Add(colony);
            }

            toAdd.Do(settlement => this.WorldData.WorldObjectsHolder.Add(settlement));
            toAdd.Clear();

            toRemove.Do(colony => this.WorldData.WorldObjectsHolder.Remove(colony));
            toRemove.Clear();
        }
Beispiel #2
0
        // Convert Settlements to Colony Bases (this.Colony) for saving
        private void ConvertCurrentGameSettlements()
        {
            // Concurrency errors :/
            var toAdd    = new List <Colony>();
            var toRemove = new List <Settlement>();

            foreach (var settlement in this.Game.World.worldObjects.Settlements)
            {
                if (settlement.Faction != Faction.OfPlayer)
                {
                    continue;
                }

                if (settlement.Map?.info == null)
                {
                    continue;
                }

                var colony = (Colony)WorldObjectSameIDMaker.MakeWorldObject(PersistentWorldsDefOf.Colony, settlement.ID);
                settlement.Map.info.parent = colony;
                colony.Tile          = settlement.Tile;
                colony.Name          = settlement.Name;
                colony.NamedByPlayer = settlement.namedByPlayer;

                colony.PersistentColonyData = this.LoadSaver.Status == PersistentWorldLoadSaver.PersistentWorldLoadStatus.Converting ? this.Colonies[0].ColonyData : this.Colony.ColonyData;

                toAdd.Add(colony);
                toRemove.Add(settlement);
            }

            toAdd.Do(colony => this.Game.World.worldObjects.Add(colony));
            toAdd.Clear();

            toRemove.Do(settlement =>
            {
                // Try to fix errors in conversion?
                try
                {
                    this.Game.World.worldObjects.Remove(settlement);
                }
                catch (NullReferenceException)
                {
                    Log.Warning($"{nameof(ConvertCurrentGameSettlements)}: NRE thrown while removing WorldObject. ID: {settlement.ID}");
                }
            });

            toRemove.Clear();
        }
        // Convert Settlements to Colony Bases (this.Colony) for saving
        private void ConvertCurrentGameSettlements()
        {
            // Concurrency errors :/
            var toAdd    = new List <Colony>();
            var toRemove = new List <Settlement>();

            foreach (var settlement in this.Game.World.worldObjects.Settlements)
            {
                if (settlement.Faction != Faction.OfPlayer)
                {
                    continue;
                }

                if (settlement.Map?.info == null)
                {
                    continue;
                }

                var colony = (Colony)WorldObjectSameIDMaker.MakeWorldObject(PersistentWorldsDefOf.Colony, settlement.ID);
                settlement.Map.info.parent = colony;
                colony.Tile          = settlement.Tile;
                colony.Name          = settlement.Name;
                colony.NamedByPlayer = settlement.namedByPlayer;

                colony.PersistentColonyData = this.LoadSaver.Status == PersistentWorldLoadSaver.PersistentWorldLoadStatus.Converting ? this.Colonies[0].ColonyData : this.Colony.ColonyData;

                toAdd.Add(colony);
                toRemove.Add(settlement);
            }

            toAdd.Do(colony => this.Game.World.worldObjects.Add(colony));
            toAdd.Clear();

            toRemove.Do(settlement => this.Game.World.worldObjects.Remove(settlement));
            toRemove.Clear();
        }
Beispiel #4
0
        private void ConvertColoniesToAbandonedColonies(PersistentColony persistentColony)
        {
            var toAdd    = new List <AbandonedColony>();
            var toRemove = new List <Settlement>();

            foreach (var settlement in this.WorldData.WorldObjectsHolder.Settlements)
            {
                if (settlement.Faction != Faction.OfPlayer)
                {
                    continue;
                }

                if (settlement.Map?.info == null)
                {
                    continue;
                }

                var abandonedColony =
                    (AbandonedColony)WorldObjectSameIDMaker.MakeWorldObject(PersistentWorldsDefOf.AbandonedColony,
                                                                            settlement.ID);

                settlement.Map.info.parent = abandonedColony;
                abandonedColony.Tile       = settlement.Tile;

                abandonedColony.Name = persistentColony.ColonyData.ColonyFaction.Name;

                toAdd.Add(abandonedColony);
                toRemove.Add(settlement);
            }

            toAdd.Do(abandonedColony => this.WorldData.WorldObjectsHolder.Add(abandonedColony));
            toAdd.Clear();

            toRemove.Do(settlement => this.WorldData.WorldObjectsHolder.Remove(settlement));
            toRemove.Clear();
        }