protected void AddFeature(List <int> members, List <int> tilesForTextDrawPosCalculation)
        {
            WorldFeature worldFeature = new WorldFeature();

            worldFeature.uniqueID = Find.UniqueIDsManager.GetNextWorldFeatureID();
            worldFeature.def      = def;
            worldFeature.name     = NameGenerator.GenerateName(def.nameMaker, Find.WorldFeatures.features.Select((WorldFeature x) => x.name), appendNumberIfNameUsed: false, "r_name");
            WorldGrid worldGrid = Find.WorldGrid;

            for (int i = 0; i < members.Count; i++)
            {
                worldGrid[members[i]].feature = worldFeature;
            }
            AssignBestDrawPos(worldFeature, tilesForTextDrawPosCalculation);
            Find.WorldFeatures.features.Add(worldFeature);
        }
Esempio n. 2
0
        protected void AddFeature(List <int> members, List <int> tilesForTextDrawPosCalculation)
        {
            WorldFeature worldFeature = new WorldFeature();

            worldFeature.uniqueID = Find.UniqueIDsManager.GetNextWorldFeatureID();
            worldFeature.def      = this.def;
            worldFeature.name     = NameGenerator.GenerateName(this.def.nameMaker, from x in Find.WorldFeatures.features
                                                               select x.name, false, "r_name");
            WorldGrid worldGrid = Find.WorldGrid;

            for (int i = 0; i < members.Count; i++)
            {
                worldGrid[members[i]].feature = worldFeature;
            }
            this.AssignBestDrawPos(worldFeature, tilesForTextDrawPosCalculation);
            Find.WorldFeatures.features.Add(worldFeature);
        }
Esempio n. 3
0
        private void WorldPrintsMenu()
        {
            Widgets.Label(new Rect(0, 0, 300, 20), Translator.Translate("WorldPrintsTitle"));

            int  size1              = Find.WorldFeatures.features.Count * 30;
            Rect scrollRectFact     = new Rect(0, 50, 300, 280);
            Rect scrollVertRectFact = new Rect(0, 0, scrollRectFact.x, size1);

            Widgets.BeginScrollView(scrollRectFact, ref scrollPosition, scrollVertRectFact);
            int x = 0;

            foreach (var feat in Find.WorldFeatures.features)
            {
                if (Widgets.ButtonText(new Rect(0, x, 290, 20), feat.name))
                {
                    selectedFeature = feat;
                    Messages.Message($"Selected feature: {selectedFeature.name}", MessageTypeDefOf.NeutralEvent, false);
                }
                x += 22;
            }
            Widgets.EndScrollView();

            if (Widgets.ButtonText(new Rect(0, 340, 300, 20), Translator.Translate("CreateNewFeature")))
            {
                Find.WindowStack.Add(new WorldFeatureCreator());
            }

            if (Widgets.ButtonText(new Rect(0, 365, 300, 20), Translator.Translate("DeleteFeature")))
            {
                DeleteFeature();
            }

            if (Widgets.ButtonText(new Rect(0, 390, 300, 20), Translator.Translate("RemoveAllFeatures")))
            {
                RemoveAllFeatures();
            }

            if (Widgets.ButtonText(new Rect(0, 415, 300, 20), Translator.Translate("EditFeature")))
            {
                EditFeature();
            }
        }
Esempio n. 4
0
        private void CreateNew()
        {
            if (featureName == null)
            {
                Messages.Message($"Enter correct feature name", MessageTypeDefOf.NeutralEvent, false);
                return;
            }

            if (maxLength <= 0)
            {
                Messages.Message($"Enter correct size", MessageTypeDefOf.NeutralEvent, false);
                return;
            }

            if (edit)
            {
                editFeature.name               = featureName;
                editFeature.drawAngle          = rotate;
                editFeature.maxDrawSizeInTiles = maxLength;

                Find.WorldFeatures.textsCreated = false;
                Find.WorldFeatures.UpdateFeatures();

                Messages.Message($"Success", MessageTypeDefOf.NeutralEvent, false);

                return;
            }

            int tile = Find.WorldSelector.selectedTile;

            if (tile < 0)
            {
                Messages.Message($"Select tile", MessageTypeDefOf.NeutralEvent, false);
                return;
            }

            List <int> members = new List <int>();

            members.Add(tile);

            WorldFeature worldFeature = new WorldFeature
            {
                uniqueID = Find.UniqueIDsManager.GetNextWorldFeatureID(),
                def      = DefDatabase <FeatureDef> .GetRandom(),
                name     = featureName
            };
            WorldGrid worldGrid = Find.WorldGrid;

            for (int i = 0; i < members.Count; i++)
            {
                worldGrid[members[i]].feature = worldFeature;
            }
            worldFeature.drawCenter         = worldGrid.GetTileCenter(tile);
            worldFeature.maxDrawSizeInTiles = maxLength;
            worldFeature.drawAngle          = rotate;

            Find.WorldFeatures.features.Add(worldFeature);

            Find.WorldFeatures.textsCreated = false;
            Find.WorldFeatures.UpdateFeatures();

            Messages.Message($"Feature created", MessageTypeDefOf.NeutralEvent, false);
        }
        public override void PostExposeData(object obj)
        {
            if (Scribe.mode == LoadSaveMode.PostLoadInit)
            {
                Map map = obj as Map;
                if (map != null)
                {
                    if (map.retainedCaravanData == null)
                    {
                        map.retainedCaravanData = new RetainedCaravanData(map);
                    }
                    if (map.wildAnimalSpawner == null)
                    {
                        map.wildAnimalSpawner = new WildAnimalSpawner(map);
                    }
                    if (map.wildPlantSpawner == null)
                    {
                        map.wildPlantSpawner = new WildPlantSpawner(map);
                    }
                }
                Thing thing = obj as Thing;
                if (thing != null && thing.def.useHitPoints && thing.MaxHitPoints != thing.HitPoints && Mathf.Abs((float)thing.HitPoints / (float)thing.MaxHitPoints - 0.617f) < 0.02f && thing.Stuff == ThingDefOf.WoodLog)
                {
                    thing.HitPoints = thing.MaxHitPoints;
                }
                Pawn pawn = obj as Pawn;
                if (pawn != null && !pawn.Destroyed && !pawn.Dead && pawn.needs == null)
                {
                    Log.Error(pawn.ToStringSafe() + " has null needs tracker even though he's not dead. Fixing...");
                    pawn.needs = new Pawn_NeedsTracker(pawn);
                    pawn.needs.SetInitialLevels();
                }
                History history = obj as History;
                if (history != null && history.archive == null)
                {
                    history.archive = new Archive();
                }
                WorldInfo worldInfo = obj as WorldInfo;
                if (worldInfo != null && worldInfo.persistentRandomValue == 0)
                {
                    worldInfo.persistentRandomValue = Rand.Int;
                }
                Caravan caravan = obj as Caravan;
                if (caravan != null)
                {
                    if (caravan.forage == null)
                    {
                        caravan.forage = new Caravan_ForageTracker(caravan);
                    }
                    if (caravan.needs == null)
                    {
                        caravan.needs = new Caravan_NeedsTracker(caravan);
                    }
                    if (caravan.carryTracker == null)
                    {
                        caravan.carryTracker = new Caravan_CarryTracker(caravan);
                    }
                    if (caravan.beds == null)
                    {
                        caravan.beds = new Caravan_BedsTracker(caravan);
                    }
                }
                PlaySettings playSettings = obj as PlaySettings;
                if (playSettings != null)
                {
                    playSettings.defaultCareForColonyHumanlike = MedicalCareCategory.Best;
                    playSettings.defaultCareForColonyAnimal    = MedicalCareCategory.HerbalOrWorse;
                    playSettings.defaultCareForColonyPrisoner  = MedicalCareCategory.HerbalOrWorse;
                    playSettings.defaultCareForNeutralFaction  = MedicalCareCategory.HerbalOrWorse;
                    playSettings.defaultCareForNeutralAnimal   = MedicalCareCategory.HerbalOrWorse;
                    playSettings.defaultCareForHostileFaction  = MedicalCareCategory.HerbalOrWorse;
                }
            }
            if (Scribe.mode == LoadSaveMode.LoadingVars)
            {
                Hediff hediff = obj as Hediff;
                if (hediff != null)
                {
                    Scribe_Values.Look(ref hediff.temp_partIndexToSetLater, "partIndex", -1);
                }
                Bill_Medical bill_Medical = obj as Bill_Medical;
                if (bill_Medical != null)
                {
                    Scribe_Values.Look(ref bill_Medical.temp_partIndexToSetLater, "partIndex", -1);
                }
                FactionRelation factionRelation = obj as FactionRelation;
                if (factionRelation != null)
                {
                    bool value = false;
                    Scribe_Values.Look(ref value, "hostile", defaultValue: false);
                    if (value || factionRelation.goodwill <= -75)
                    {
                        factionRelation.kind = FactionRelationKind.Hostile;
                    }
                    else if (factionRelation.goodwill >= 75)
                    {
                        factionRelation.kind = FactionRelationKind.Ally;
                    }
                }
                HediffComp_GetsPermanent hediffComp_GetsPermanent = obj as HediffComp_GetsPermanent;
                if (hediffComp_GetsPermanent != null)
                {
                    bool value2 = false;
                    Scribe_Values.Look(ref value2, "isOld", defaultValue: false);
                    if (value2)
                    {
                        hediffComp_GetsPermanent.isPermanentInt = true;
                    }
                }
                if (obj is World)
                {
                    UniqueIDsManager target = null;
                    Scribe_Deep.Look(ref target, "uniqueIDsManager");
                    if (target != null)
                    {
                        Current.Game.uniqueIDsManager = target;
                    }
                }
                WorldFeature worldFeature = obj as WorldFeature;
                if (worldFeature != null && worldFeature.maxDrawSizeInTiles == 0f)
                {
                    Vector2 value3 = Vector2.zero;
                    Scribe_Values.Look(ref value3, "maxDrawSizeInTiles");
                    worldFeature.maxDrawSizeInTiles = value3.x;
                }
            }
            if (Scribe.mode != LoadSaveMode.ResolvingCrossRefs)
            {
                return;
            }
            Hediff hediff2 = obj as Hediff;

            if (hediff2 != null && hediff2.temp_partIndexToSetLater >= 0 && hediff2.pawn != null)
            {
                if (hediff2.temp_partIndexToSetLater == 0)
                {
                    hediff2.Part = hediff2.pawn.RaceProps.body.GetPartAtIndex(hediff2.temp_partIndexToSetLater);
                }
                else
                {
                    hediff2.pawn.health.hediffSet.hediffs.Remove(hediff2);
                }
                hediff2.temp_partIndexToSetLater = -1;
            }
            Bill_Medical bill_Medical2 = obj as Bill_Medical;

            if (bill_Medical2 != null)
            {
                if (bill_Medical2.temp_partIndexToSetLater == 0)
                {
                    bill_Medical2.Part = bill_Medical2.GiverPawn.RaceProps.body.GetPartAtIndex(bill_Medical2.temp_partIndexToSetLater);
                }
                else
                {
                    bill_Medical2.GiverPawn.BillStack.Bills.Remove(bill_Medical2);
                }
                bill_Medical2.temp_partIndexToSetLater = -1;
            }
        }
Esempio n. 6
0
        private void AssignBestDrawPos(WorldFeature newFeature, List <int> tilesForTextDrawPosCalculation)
        {
            WorldGrid worldGrid = Find.WorldGrid;

            tmpEdgeTiles.Clear();
            tmpTilesForTextDrawPosCalculationSet.Clear();
            tmpTilesForTextDrawPosCalculationSet.AddRange(tilesForTextDrawPosCalculation);
            Vector3 a = Vector3.zero;

            for (int i = 0; i < tilesForTextDrawPosCalculation.Count; i++)
            {
                int num = tilesForTextDrawPosCalculation[i];
                a += worldGrid.GetTileCenter(num);
                bool flag = worldGrid.IsOnEdge(num);
                if (!flag)
                {
                    worldGrid.GetTileNeighbors(num, tmpNeighbors);
                    for (int j = 0; j < tmpNeighbors.Count; j++)
                    {
                        if (!tmpTilesForTextDrawPosCalculationSet.Contains(tmpNeighbors[j]))
                        {
                            flag = true;
                            break;
                        }
                    }
                }
                if (flag)
                {
                    tmpEdgeTiles.Add(num);
                }
            }
            a /= (float)tilesForTextDrawPosCalculation.Count;
            if (!tmpEdgeTiles.Any())
            {
                tmpEdgeTiles.Add(tilesForTextDrawPosCalculation.RandomElement());
            }
            int bestTileDist = 0;

            tmpTraversedTiles.Clear();
            WorldFloodFiller worldFloodFiller = Find.WorldFloodFiller;
            int                   rootTile    = -1;
            Predicate <int>       passCheck   = (int x) => tmpTilesForTextDrawPosCalculationSet.Contains(x);
            Func <int, int, bool> processor   = delegate(int tile, int traversalDist)
            {
                tmpTraversedTiles.Add(new Pair <int, int>(tile, traversalDist));
                bestTileDist = traversalDist;
                return(false);
            };
            List <int> extraRootTiles = tmpEdgeTiles;

            worldFloodFiller.FloodFill(rootTile, passCheck, processor, 2147483647, extraRootTiles);
            int   num2 = -1;
            float num3 = -1f;

            for (int k = 0; k < tmpTraversedTiles.Count; k++)
            {
                if (tmpTraversedTiles[k].Second == bestTileDist)
                {
                    Vector3 tileCenter   = worldGrid.GetTileCenter(tmpTraversedTiles[k].First);
                    float   sqrMagnitude = (tileCenter - a).sqrMagnitude;
                    if (num2 == -1 || sqrMagnitude < num3)
                    {
                        num2 = tmpTraversedTiles[k].First;
                        num3 = sqrMagnitude;
                    }
                }
            }
            float maxDrawSizeInTiles = (float)bestTileDist * 2f * 1.2f;

            newFeature.drawCenter         = worldGrid.GetTileCenter(num2);
            newFeature.maxDrawSizeInTiles = maxDrawSizeInTiles;
        }
        private void AssignBestDrawPos(WorldFeature newFeature, List <int> tilesForTextDrawPosCalculation)
        {
            WorldGrid worldGrid = Find.WorldGrid;

            tmpEdgeTiles.Clear();
            tmpTilesForTextDrawPosCalculationSet.Clear();
            tmpTilesForTextDrawPosCalculationSet.AddRange(tilesForTextDrawPosCalculation);
            Vector3 zero = Vector3.zero;

            for (int i = 0; i < tilesForTextDrawPosCalculation.Count; i++)
            {
                int num = tilesForTextDrawPosCalculation[i];
                zero += worldGrid.GetTileCenter(num);
                bool flag = worldGrid.IsOnEdge(num);
                if (!flag)
                {
                    worldGrid.GetTileNeighbors(num, tmpNeighbors);
                    for (int j = 0; j < tmpNeighbors.Count; j++)
                    {
                        if (!tmpTilesForTextDrawPosCalculationSet.Contains(tmpNeighbors[j]))
                        {
                            flag = true;
                            break;
                        }
                    }
                }
                if (flag)
                {
                    tmpEdgeTiles.Add(num);
                }
            }
            zero /= (float)tilesForTextDrawPosCalculation.Count;
            if (!tmpEdgeTiles.Any())
            {
                tmpEdgeTiles.Add(tilesForTextDrawPosCalculation.RandomElement());
            }
            int bestTileDist = 0;

            tmpTraversedTiles.Clear();
            Find.WorldFloodFiller.FloodFill(-1, (int x) => tmpTilesForTextDrawPosCalculationSet.Contains(x), delegate(int tile, int traversalDist)
            {
                tmpTraversedTiles.Add(new Pair <int, int>(tile, traversalDist));
                bestTileDist = traversalDist;
                return(false);
            }, int.MaxValue, tmpEdgeTiles);
            int   num2 = -1;
            float num3 = -1f;

            for (int k = 0; k < tmpTraversedTiles.Count; k++)
            {
                if (tmpTraversedTiles[k].Second == bestTileDist)
                {
                    float sqrMagnitude = (worldGrid.GetTileCenter(tmpTraversedTiles[k].First) - zero).sqrMagnitude;
                    if (num2 == -1 || sqrMagnitude < num3)
                    {
                        num2 = tmpTraversedTiles[k].First;
                        num3 = sqrMagnitude;
                    }
                }
            }
            float maxDrawSizeInTiles = (float)bestTileDist * 2f * 1.2f;

            newFeature.drawCenter         = worldGrid.GetTileCenter(num2);
            newFeature.maxDrawSizeInTiles = maxDrawSizeInTiles;
        }
 private static string <AddFeature> m__0(WorldFeature x)
 {
     return(x.name);
 }