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); }
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); }
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(); } }
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; } }
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); }