private void Damage(SketchBuildable buildable, CellRect rect, Rot4 dir, Sketch sketch, out bool destroyed) { float num = (!dir.IsHorizontal) ? ((float)(buildable.pos.z - rect.minZ) / (float)rect.Height) : ((float)(buildable.pos.x - rect.minX) / (float)rect.Width); if (dir == Rot4.East || dir == Rot4.South) { num = 1f - num; } if (Rand.Chance(Mathf.Pow(num, 1.32f))) { sketch.Remove(buildable); destroyed = true; SketchTerrain sketchTerrain = buildable as SketchTerrain; if (sketchTerrain != null && sketchTerrain.def.burnedDef != null) { sketch.AddTerrain(sketchTerrain.def.burnedDef, sketchTerrain.pos); } } else { destroyed = false; SketchThing sketchThing = buildable as SketchThing; if (sketchThing != null) { sketchThing.hitPoints = Mathf.Clamp(Mathf.RoundToInt((float)sketchThing.MaxHitPoints * (1f - num) * Rand.Range(1f, 1.2f)), 1, sketchThing.MaxHitPoints); } } }
protected override void ResolveInt(ResolveParams parms) { bool num = parms.symmetryClear ?? true; int origin = parms.symmetryOrigin ?? 0; bool flag = parms.symmetryVertical ?? false; bool flag2 = parms.requireFloor ?? false; bool originIncluded = parms.symmetryOriginIncluded ?? false; if (num) { Clear(parms.sketch, origin, flag, originIncluded); } foreach (SketchBuildable item in parms.sketch.Buildables.ToList()) { if (ShouldKeepAlreadySymmetricalInTheMiddle(item, origin, flag, originIncluded)) { continue; } SketchBuildable sketchBuildable = (SketchBuildable)item.DeepCopy(); SketchThing sketchThing = sketchBuildable as SketchThing; if (sketchThing != null && sketchThing.def.rotatable) { if (flag) { if (!sketchThing.rot.IsHorizontal) { sketchThing.rot = sketchThing.rot.Opposite; } } else if (sketchThing.rot.IsHorizontal) { sketchThing.rot = sketchThing.rot.Opposite; } } MoveUntilSymmetrical(sketchBuildable, item.OccupiedRect, origin, flag, originIncluded); if (flag2 && sketchBuildable.Buildable != ThingDefOf.Wall && sketchBuildable.Buildable != ThingDefOf.Door) { bool flag3 = true; foreach (IntVec3 item2 in sketchBuildable.OccupiedRect) { if (!parms.sketch.AnyTerrainAt(item2)) { flag3 = false; break; } } if (flag3) { parms.sketch.Add(sketchBuildable); } } else { parms.sketch.Add(sketchBuildable); } } }
private void MoveUntilSymmetrical(SketchBuildable buildable, CellRect initial, int origin, bool vertical, bool originIncluded) { if (vertical) { buildable.pos.x += initial.minX - buildable.OccupiedRect.minX; int num = (!originIncluded) ? (origin - initial.maxZ - 1 + origin) : (origin - initial.maxZ + origin); buildable.pos.z += num - buildable.OccupiedRect.minZ; } else { buildable.pos.z += initial.minZ - buildable.OccupiedRect.minZ; int num2 = (!originIncluded) ? (origin - initial.maxX - 1 + origin) : (origin - initial.maxX + origin); buildable.pos.x += num2 - buildable.OccupiedRect.minX; } }
private bool ShouldKeepAlreadySymmetricalInTheMiddle(SketchBuildable buildable, int origin, bool vertical, bool originIncluded) { CellRect occupiedRect = buildable.OccupiedRect; if (vertical) { if (originIncluded) { return(occupiedRect.maxZ - origin == origin - occupiedRect.minZ); } return(occupiedRect.maxZ - origin + 1 == origin - occupiedRect.minZ); } if (originIncluded) { return(occupiedRect.maxX - origin == origin - occupiedRect.minX); } return(occupiedRect.maxX - origin + 1 == origin - occupiedRect.minX); }
private void DoWork(Slate slate) { MonumentMarker value = monumentMarker.GetValue(slate); if (value == null) { if (!storeMarketValueAs.GetValue(slate).NullOrEmpty()) { slate.Set(storeMarketValueAs.GetValue(slate), 0f); } return; } Dictionary <ThingDef, int> dictionary = new Dictionary <ThingDef, int>(); List <Pair <List <StuffCategoryDef>, int> > list2 = new List <Pair <List <StuffCategoryDef>, int> >(); List <List <Pair <ThingDef, int> > > list3 = new List <List <Pair <ThingDef, int> > >(); SketchTerrain sketchTerrain; int num = value.sketch.Entities.Where((SketchEntity x) => (sketchTerrain = (x as SketchTerrain)) != null && sketchTerrain.treatSimilarAsSame).Count(); foreach (SketchEntity entity in value.sketch.Entities) { SketchBuildable sketchBuildable = entity as SketchBuildable; if (sketchBuildable != null) { SketchTerrain st; if (sketchBuildable.Buildable.MadeFromStuff && sketchBuildable.Stuff == null) { int num2 = FindStuffsIndexFor(sketchBuildable.Buildable, list2); if (num2 < 0) { list2.Add(new Pair <List <StuffCategoryDef>, int>(sketchBuildable.Buildable.stuffCategories, sketchBuildable.Buildable.costStuffCount)); } else { list2[num2] = new Pair <List <StuffCategoryDef>, int>(list2[num2].First, list2[num2].Second + sketchBuildable.Buildable.costStuffCount); } if (sketchBuildable.Buildable.costList != null) { for (int i = 0; i < sketchBuildable.Buildable.costList.Count; i++) { ThingDefCountClass thingDefCountClass = sketchBuildable.Buildable.costList[i]; if (!dictionary.TryGetValue(thingDefCountClass.thingDef, out int value2)) { value2 = 0; } dictionary[thingDefCountClass.thingDef] = value2 + thingDefCountClass.count; } } } else if ((st = (sketchBuildable as SketchTerrain)) != null && st.treatSimilarAsSame) { foreach (TerrainDef item in DefDatabase <TerrainDef> .AllDefs.Where((TerrainDef x) => st.IsSameOrSimilar(x))) { if (!item.costList.NullOrEmpty()) { List <Pair <ThingDef, int> > list = new List <Pair <ThingDef, int> >(); foreach (ThingDefCountClass cost in item.costList) { list.Add(new Pair <ThingDef, int>(cost.thingDef, cost.count * num)); } if (!list3.Any((List <Pair <ThingDef, int> > x) => x.ListsEqualIgnoreOrder(list))) { list3.Add(list); } } } } else { List <ThingDefCountClass> list4 = sketchBuildable.Buildable.CostListAdjusted(sketchBuildable.Stuff); for (int j = 0; j < list4.Count; j++) { if (!dictionary.TryGetValue(list4[j].thingDef, out int value3)) { value3 = 0; } dictionary[list4[j].thingDef] = value3 + list4[j].count; } } } } float num3 = 0f; StringBuilder stringBuilder = new StringBuilder(); foreach (Pair <List <StuffCategoryDef>, int> item2 in list2) { if (stringBuilder.Length != 0) { stringBuilder.AppendLine(); } stringBuilder.Append((string)(" - " + "AnyOf".Translate() + ": " + item2.First.Select((StuffCategoryDef x) => x.label).ToCommaList() + " x") + item2.Second); num3 += GetCheapestStuffMarketValue(item2.First, item2.Second); } foreach (KeyValuePair <ThingDef, int> item3 in dictionary) { if (stringBuilder.Length != 0) { stringBuilder.AppendLine(); } stringBuilder.Append(" - " + GenLabel.ThingLabel(item3.Key, null, item3.Value).CapitalizeFirst()); num3 += item3.Key.BaseMarketValue * (float)item3.Value; } if (list3.Any()) { if (stringBuilder.Length != 0) { stringBuilder.AppendLine(); } stringBuilder.Append(" - " + "AnyOf".Translate() + ":"); foreach (List <Pair <ThingDef, int> > item4 in list3) { stringBuilder.AppendLine(); stringBuilder.Append(" - " + item4.Select((Pair <ThingDef, int> x) => x.First.label + " x" + x.Second).ToCommaList()); } num3 += GetCheapestThingMarketValue(list3); } slate.Set(storeAs.GetValue(slate), stringBuilder.ToString()); if (!storeMarketValueAs.GetValue(slate).NullOrEmpty()) { slate.Set(storeMarketValueAs.GetValue(slate), num3); } }