Exemple #1
0
        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);
        }
Exemple #5
0
        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);
            }
        }