示例#1
0
        private static int GetDamageOverlaysCount(Thing b, int hp)
        {
            float num   = (float)hp / (float)b.MaxHitPoints;
            int   count = ThingsToxicDamageSectionLayerUtility.GetAvailableOverlays(b).Count;

            return(count - Mathf.FloorToInt((float)count * num));
        }
示例#2
0
        private void DrawFullThingCorners(Thing b)
        {
            if (b.def.graphicData == null)
            {
                return;
            }
            if (b.def.graphicData.damageData == null)
            {
                return;
            }
            Rect     damageRect             = ThingsToxicDamageSectionLayerUtility.GetDamageRect(b);
            float    damageTexturesAltitude = this.GetDamageTexturesAltitude(b);
            float    num = Mathf.Min(Mathf.Min(damageRect.width, damageRect.height), 1.5f);
            Material mat;
            Material mat2;
            Material mat3;
            Material mat4;

            ThingsToxicDamageSectionLayerUtility.GetCornerMats(out mat, out mat2, out mat3, out mat4, b);
            float num2 = num * Rand.Range(0.9f, 1f);
            float num3 = num * Rand.Range(0.9f, 1f);
            float num4 = num * Rand.Range(0.9f, 1f);
            float num5 = num * Rand.Range(0.9f, 1f);
            List <DamageOverlay> overlays = ThingsToxicDamageSectionLayerUtility.GetOverlays(b);

            for (int i = 0; i < overlays.Count; i++)
            {
                switch (overlays[i])
                {
                case DamageOverlay.TopLeftCorner:
                {
                    Rect rect = new Rect(damageRect.xMin, damageRect.yMax - num2, num2, num2);
                    Printer_Plane.PrintPlane(this, new Vector3(rect.center.x, damageTexturesAltitude, rect.center.y), rect.size, mat, 0f, false, null, null, 0f, 0f);
                    break;
                }

                case DamageOverlay.TopRightCorner:
                {
                    Rect rect2 = new Rect(damageRect.xMax - num3, damageRect.yMax - num3, num3, num3);
                    Printer_Plane.PrintPlane(this, new Vector3(rect2.center.x, damageTexturesAltitude, rect2.center.y), rect2.size, mat2, 90f, false, null, null, 0f, 0f);
                    break;
                }

                case DamageOverlay.BotLeftCorner:
                {
                    Rect rect3 = new Rect(damageRect.xMin, damageRect.yMin, num5, num5);
                    Printer_Plane.PrintPlane(this, new Vector3(rect3.center.x, damageTexturesAltitude, rect3.center.y), rect3.size, mat4, 270f, false, null, null, 0f, 0f);
                    break;
                }

                case DamageOverlay.BotRightCorner:
                {
                    Rect rect4 = new Rect(damageRect.xMax - num4, damageRect.yMin, num4, num4);
                    Printer_Plane.PrintPlane(this, new Vector3(rect4.center.x, damageTexturesAltitude, rect4.center.y), rect4.size, mat3, 180f, false, null, null, 0f, 0f);
                    break;
                }
                }
            }
        }
示例#3
0
        private void DrawLinkableCornersAndEdges(Thing b)
        {
            if (b.def.graphicData == null)
            {
                return;
            }
            DamageGraphicData damageData = b.def.graphicData.damageData;

            if (damageData == null)
            {
                return;
            }
            float damageTexturesAltitude  = this.GetDamageTexturesAltitude(b);
            List <DamageOverlay> overlays = ThingsToxicDamageSectionLayerUtility.GetOverlays(b);
            IntVec3 position = b.Position;
            Vector3 vector   = new Vector3((float)position.x + 0.5f, damageTexturesAltitude, (float)position.z + 0.5f);
            float   x        = Rand.Range(0.4f, 0.6f);
            float   z        = Rand.Range(0.4f, 0.6f);
            float   x2       = Rand.Range(0.4f, 0.6f);
            float   z2       = Rand.Range(0.4f, 0.6f);

            for (int i = 0; i < overlays.Count; i++)
            {
                switch (overlays[i])
                {
                case DamageOverlay.TopLeftCorner:
                    Printer_Plane.PrintPlane(this, vector, Vector2.one, damageData.cornerTLMat, 0f, false, null, null, 0f, 0f);
                    break;

                case DamageOverlay.TopRightCorner:
                    Printer_Plane.PrintPlane(this, vector, Vector2.one, damageData.cornerTRMat, 90f, false, null, null, 0f, 0f);
                    break;

                case DamageOverlay.BotLeftCorner:
                    Printer_Plane.PrintPlane(this, vector, Vector2.one, damageData.cornerBLMat, 270f, false, null, null, 0f, 0f);
                    break;

                case DamageOverlay.BotRightCorner:
                    Printer_Plane.PrintPlane(this, vector, Vector2.one, damageData.cornerBRMat, 180f, false, null, null, 0f, 0f);
                    break;

                case DamageOverlay.LeftEdge:
                    Printer_Plane.PrintPlane(this, vector + new Vector3(0f, 0f, z2), Vector2.one, damageData.edgeLeftMat, 270f, false, null, null, 0f, 0f);
                    break;

                case DamageOverlay.RightEdge:
                    Printer_Plane.PrintPlane(this, vector + new Vector3(0f, 0f, z), Vector2.one, damageData.edgeRightMat, 90f, false, null, null, 0f, 0f);
                    break;

                case DamageOverlay.TopEdge:
                    Printer_Plane.PrintPlane(this, vector + new Vector3(x, 0f, 0f), Vector2.one, damageData.edgeTopMat, 0f, false, null, null, 0f, 0f);
                    break;

                case DamageOverlay.BotEdge:
                    Printer_Plane.PrintPlane(this, vector + new Vector3(x2, 0f, 0f), Vector2.one, damageData.edgeBotMat, 180f, false, null, null, 0f, 0f);
                    break;
                }
            }
        }
示例#4
0
        private void PrintScratches(Thing b)
        {
            int num = 0;
            List <DamageOverlay> overlays = ThingsToxicDamageSectionLayerUtility.GetOverlays(b);

            for (int i = 0; i < overlays.Count; i++)
            {
                if (overlays[i] == DamageOverlay.Scratch)
                {
                    num++;
                }
            }
            if (num == 0)
            {
                return;
            }
            Rect  rect = ThingsToxicDamageSectionLayerUtility.GetDamageRect(b);
            float num2 = Mathf.Min(0.5f * Mathf.Min(rect.width, rect.height), 1f);

            rect = rect.ContractedBy(num2 / 2f);
            if (rect.width <= 0f || rect.height <= 0f)
            {
                return;
            }
            float num3 = Mathf.Max(rect.width, rect.height) * 0.7f;

            SectionLayer_ThingsToxicDamage.scratches.Clear();
            Rand.PushState();
            Rand.Seed = b.thingIDNumber * 3697;
            for (int j = 0; j < num; j++)
            {
                this.AddScratch(b, rect.width, rect.height, ref num3);
            }
            Rand.PopState();
            float            damageTexturesAltitude = this.GetDamageTexturesAltitude(b);
            IList <Material> scratchMats            = ThingsToxicDamageSectionLayerUtility.GetScratchMats(b);

            Rand.PushState();
            Rand.Seed = b.thingIDNumber * 7;
            for (int k = 0; k < SectionLayer_ThingsToxicDamage.scratches.Count; k++)
            {
                float x    = SectionLayer_ThingsToxicDamage.scratches[k].x;
                float y    = SectionLayer_ThingsToxicDamage.scratches[k].y;
                float rot  = Rand.Range(0f, 360f);
                float num4 = num2;
                if (rect.width > 0.95f && rect.height > 0.95f)
                {
                    num4 *= Rand.Range(0.85f, 1f);
                }
                Vector3 center = new Vector3(rect.xMin + x, damageTexturesAltitude, rect.yMin + y);
                Printer_Plane.PrintPlane(this, center, new Vector2(num4, num4), scratchMats.RandomElement <Material>(), rot, false, null, null, 0f, 0f);
            }
            Rand.PopState();
        }
示例#5
0
 private void PrintCornersAndEdges(Thing b)
 {
     Rand.PushState();
     Rand.Seed = b.thingIDNumber * 3;
     if (ThingsToxicDamageSectionLayerUtility.UsesLinkableCornersAndEdges(b))
     {
         this.DrawLinkableCornersAndEdges(b);
     }
     else
     {
         this.DrawFullThingCorners(b);
     }
     Rand.PopState();
 }
示例#6
0
        public static void DebugDraw()
        {
            if (!Prefs.DevMode || !DebugViewSettings.drawDamageRects || Find.CurrentMap == null)
            {
                return;
            }
            Thing Thing = Find.Selector.FirstSelectedObject as Thing;

            if (Thing == null)
            {
                return;
            }
            Material material   = DebugSolidColorMats.MaterialOf(Color.red);
            Rect     damageRect = ThingsToxicDamageSectionLayerUtility.GetDamageRect(Thing);
            float    y          = 14.99f;
            Vector3  pos        = new Vector3(damageRect.x + damageRect.width / 2f, y, damageRect.y + damageRect.height / 2f);
            Vector3  s          = new Vector3(damageRect.width, 1f, damageRect.height);

            Graphics.DrawMesh(MeshPool.plane10, Matrix4x4.TRS(pos, Quaternion.identity, s), material, 0);
        }
示例#7
0
        public static List <DamageOverlay> GetOverlays(Thing b)
        {
            ThingsToxicDamageSectionLayerUtility.overlays.Clear();
            ThingsToxicDamageSectionLayerUtility.overlaysWorkingList.Clear();
            ThingsToxicDamageSectionLayerUtility.overlaysWorkingList.AddRange(ThingsToxicDamageSectionLayerUtility.GetAvailableOverlays(b));
            if (!ThingsToxicDamageSectionLayerUtility.overlaysWorkingList.Any <DamageOverlay>())
            {
                return(ThingsToxicDamageSectionLayerUtility.overlays);
            }
            Rand.PushState();
            Rand.Seed = Gen.HashCombineInt(b.thingIDNumber, 1958376471);
            int damageOverlaysCount = ThingsToxicDamageSectionLayerUtility.GetDamageOverlaysCount(b, b.Map.GetComponent <MapComponent_MapEvents>().ToxicDamages[b]);
            int num = 0;

            while (num < damageOverlaysCount && ThingsToxicDamageSectionLayerUtility.overlaysWorkingList.Any <DamageOverlay>())
            {
                DamageOverlay item = ThingsToxicDamageSectionLayerUtility.overlaysWorkingList.RandomElement <DamageOverlay>();
                ThingsToxicDamageSectionLayerUtility.overlaysWorkingList.Remove(item);
                ThingsToxicDamageSectionLayerUtility.overlays.Add(item);
                num++;
            }
            Rand.PopState();
            return(ThingsToxicDamageSectionLayerUtility.overlays);
        }
示例#8
0
 public static List <DamageOverlay> GetAvailableOverlays(Thing b)
 {
     ThingsToxicDamageSectionLayerUtility.availableOverlays.Clear();
     if (ThingsToxicDamageSectionLayerUtility.GetScratchMats(b).Any <Material>())
     {
         int   num        = 3;
         Rect  damageRect = ThingsToxicDamageSectionLayerUtility.GetDamageRect(b);
         float num2       = damageRect.width * damageRect.height;
         if (num2 > 4f)
         {
             num += Mathf.RoundToInt((num2 - 4f) * 0.54f);
         }
         for (int i = 0; i < num; i++)
         {
             ThingsToxicDamageSectionLayerUtility.availableOverlays.Add(DamageOverlay.Scratch);
         }
     }
     if (ThingsToxicDamageSectionLayerUtility.UsesLinkableCornersAndEdges(b))
     {
         if (b.def.graphicData != null && b.def.graphicData.damageData != null)
         {
             IntVec3           position   = b.Position;
             DamageGraphicData damageData = b.def.graphicData.damageData;
             if (damageData.edgeTopMat != null && ThingsToxicDamageSectionLayerUtility.DifferentAt(b, position.x, position.z + 1) && ThingsToxicDamageSectionLayerUtility.SameAndDamagedAt(b, position.x + 1, position.z) && ThingsToxicDamageSectionLayerUtility.DifferentAt(b, position.x + 1, position.z + 1))
             {
                 ThingsToxicDamageSectionLayerUtility.availableOverlays.Add(DamageOverlay.TopEdge);
             }
             if (damageData.edgeRightMat != null && ThingsToxicDamageSectionLayerUtility.DifferentAt(b, position.x + 1, position.z) && ThingsToxicDamageSectionLayerUtility.SameAndDamagedAt(b, position.x, position.z + 1) && ThingsToxicDamageSectionLayerUtility.DifferentAt(b, position.x + 1, position.z + 1))
             {
                 ThingsToxicDamageSectionLayerUtility.availableOverlays.Add(DamageOverlay.RightEdge);
             }
             if (damageData.edgeBotMat != null && ThingsToxicDamageSectionLayerUtility.DifferentAt(b, position.x, position.z - 1) && ThingsToxicDamageSectionLayerUtility.SameAndDamagedAt(b, position.x + 1, position.z) && ThingsToxicDamageSectionLayerUtility.DifferentAt(b, position.x + 1, position.z - 1))
             {
                 ThingsToxicDamageSectionLayerUtility.availableOverlays.Add(DamageOverlay.BotEdge);
             }
             if (damageData.edgeLeftMat != null && ThingsToxicDamageSectionLayerUtility.DifferentAt(b, position.x - 1, position.z) && ThingsToxicDamageSectionLayerUtility.SameAndDamagedAt(b, position.x, position.z + 1) && ThingsToxicDamageSectionLayerUtility.DifferentAt(b, position.x - 1, position.z + 1))
             {
                 ThingsToxicDamageSectionLayerUtility.availableOverlays.Add(DamageOverlay.LeftEdge);
             }
             if (damageData.cornerTLMat != null && ThingsToxicDamageSectionLayerUtility.DifferentAt(b, position.x - 1, position.z) && ThingsToxicDamageSectionLayerUtility.DifferentAt(b, position.x, position.z + 1))
             {
                 ThingsToxicDamageSectionLayerUtility.availableOverlays.Add(DamageOverlay.TopLeftCorner);
             }
             if (damageData.cornerTRMat != null && ThingsToxicDamageSectionLayerUtility.DifferentAt(b, position.x + 1, position.z) && ThingsToxicDamageSectionLayerUtility.DifferentAt(b, position.x, position.z + 1))
             {
                 ThingsToxicDamageSectionLayerUtility.availableOverlays.Add(DamageOverlay.TopRightCorner);
             }
             if (damageData.cornerBRMat != null && ThingsToxicDamageSectionLayerUtility.DifferentAt(b, position.x + 1, position.z) && ThingsToxicDamageSectionLayerUtility.DifferentAt(b, position.x, position.z - 1))
             {
                 ThingsToxicDamageSectionLayerUtility.availableOverlays.Add(DamageOverlay.BotRightCorner);
             }
             if (damageData.cornerBLMat != null && ThingsToxicDamageSectionLayerUtility.DifferentAt(b, position.x - 1, position.z) && ThingsToxicDamageSectionLayerUtility.DifferentAt(b, position.x, position.z - 1))
             {
                 ThingsToxicDamageSectionLayerUtility.availableOverlays.Add(DamageOverlay.BotLeftCorner);
             }
         }
     }
     else
     {
         Material x;
         Material x2;
         Material x3;
         Material x4;
         ThingsToxicDamageSectionLayerUtility.GetCornerMats(out x, out x2, out x3, out x4, b);
         if (x != null)
         {
             ThingsToxicDamageSectionLayerUtility.availableOverlays.Add(DamageOverlay.TopLeftCorner);
         }
         if (x2 != null)
         {
             ThingsToxicDamageSectionLayerUtility.availableOverlays.Add(DamageOverlay.TopRightCorner);
         }
         if (x4 != null)
         {
             ThingsToxicDamageSectionLayerUtility.availableOverlays.Add(DamageOverlay.BotLeftCorner);
         }
         if (x3 != null)
         {
             ThingsToxicDamageSectionLayerUtility.availableOverlays.Add(DamageOverlay.BotRightCorner);
         }
     }
     return(ThingsToxicDamageSectionLayerUtility.availableOverlays);
 }
示例#9
0
        public override void FinalizeInit()
        {
            base.FinalizeInit();
            if (this.ToxicDamagesChunks != null)
            {
                foreach (var b in this.ToxicDamagesChunks)
                {
                    foreach (var t in this.map.thingGrid.ThingsListAt(b.Key))
                    {
                        if (PurpleIvyUtils.IsChunkOrMineable(t))
                        {
                            this.ToxicDamagesChunksDeep[t] = b.Value;
                        }
                    }
                }
            }
            if (this.ToxicDamagesChunksDeep != null)
            {
                foreach (var b in this.ToxicDamagesChunksDeep)
                {
                    this.ToxicDamages[b.Key] = b.Value;
                }
            }

            if (this.ToxicDamagesThings != null)
            {
                foreach (var b in this.ToxicDamagesThings)
                {
                    this.ToxicDamages[b.Key] = b.Value;
                }
            }

            if (this.ToxicDamagesThings != null)
            {
                foreach (var b in this.ToxicDamages)
                {
                    Log.Message("Notifying " + b.Key);
                    ThingsToxicDamageSectionLayerUtility.Notify_ThingHitPointsChanged(this, b.Key, b.Key.MaxHitPoints);
                }
            }

            foreach (Thing t in this.map.listerThings.AllThings)
            {
                Pawn pawn = null;
                if (t is Pawn)
                {
                    pawn = (Pawn)t;
                }
                else if (t is Corpse)
                {
                    Corpse corpse = (Corpse)t;
                    pawn = corpse.InnerPawn;
                }
                else
                {
                    continue;
                }
                AlienInfectionHediff hediff = (AlienInfectionHediff)pawn.health.hediffSet.hediffs
                                              .Where(x => x is AlienInfectionHediff).FirstOrDefault();
                if (hediff != null)
                {
                    var comp = pawn.TryGetComp <AlienInfection>();
                    if (comp == null)
                    {
                        if (hediff.instigator != null)
                        {
                            var dummyCorpse = PurpleIvyDefOf.InfectedCorpseDummy;
                            comp = new AlienInfection();
                            comp.Initialize(dummyCorpse.GetCompProperties <CompProperties_AlienInfection>());
                            comp.parent = pawn;
                            comp.Props.typesOfCreatures = new List <string>()
                            {
                                hediff.instigator.defName
                            };
                            var range = PurpleIvyData.maxNumberOfCreatures[hediff.instigator.race.defName];
                            comp.maxNumberOfCreatures                 = hediff.maxNumberOfCreatures;
                            comp.currentCountOfCreatures              = hediff.currentCountOfCreatures;
                            comp.startOfIncubation                    = hediff.startOfIncubation;
                            comp.tickStartHediff                      = hediff.tickStartHediff;
                            comp.stopSpawning                         = hediff.stopSpawning;
                            comp.Props.maxNumberOfCreatures           = range;
                            comp.Props.incubationPeriod               = new IntRange(10000, 40000);
                            comp.Props.IncubationData                 = new IncubationData();
                            comp.Props.IncubationData.tickStartHediff = new IntRange(2000, 4000);
                            comp.Props.IncubationData.deathChance     = 90;
                            comp.Props.IncubationData.hediff          = HediffDefOf.Pregnant.defName;
                            if (pawn.Dead)
                            {
                                var corpse = pawn.Corpse;
                                corpse.AllComps.Add(comp);
                            }
                            else
                            {
                                pawn.AllComps.Add(comp);
                            }
                        }
                    }
                    else if (pawn.Dead && comp != null)
                    {
                        var corpse = pawn.Corpse;
                        corpse.AllComps.Add(comp);
                    }
                }
            }
        }
示例#10
0
        public void DoDamageToBuildings()
        {
            List <Thing> list = new List <Thing>();

            foreach (var pos2 in GenAdj.CellsAdjacent8Way(this))
            {
                try
                {
                    if (GenGrid.InBounds(pos2, this.Map))
                    {
                        list = this.Map.thingGrid.ThingsListAt(pos2);
                    }
                }
                catch
                {
                    continue;
                }
                for (int i = 0; i < list.Count; i++)
                {
                    if (list[i].Faction != PurpleIvyData.AlienFaction)
                    {
                        if (list[i] is Pawn || list[i] is Gas || list[i] is Mote || list[i] is Filth)
                        {
                            continue;
                        }
                        var comp = this.Map.GetComponent <MapComponent_MapEvents>();
                        if (comp != null)
                        {
                            int oldDamage = 0;
                            if (!comp.ToxicDamages.ContainsKey(list[i]))
                            {
                                if (PurpleIvyUtils.IsChunkOrMineable(list[i]))
                                {
                                    comp.ToxicDamagesChunksDeep[list[i]] = list[i].MaxHitPoints - 1;
                                }
                                else
                                {
                                    //Log.Message("Loading: " + list[i], true);
                                    comp.ToxicDamagesThings[list[i]] = list[i].MaxHitPoints - 1;
                                }
                                oldDamage = list[i].MaxHitPoints;
                                comp.ToxicDamages[list[i]] = list[i].MaxHitPoints - 1;
                            }
                            else
                            {
                                oldDamage = comp.ToxicDamages[list[i]];
                                comp.ToxicDamages[list[i]] -= 1;
                            }
                            //Log.Message("Damaging " + list[i], true);
                            ThingsToxicDamageSectionLayerUtility.Notify_ThingHitPointsChanged(comp, list[i], oldDamage);
                            if (list[i] is Building b && comp.ToxicDamages[b] / 2 < b.MaxHitPoints)
                            {
                                if (b.GetComp <CompBreakdownable>() != null)
                                {
                                    b.GetComp <CompBreakdownable>().DoBreakdown();
                                }
                                if (b.GetComp <CompPowerPlantWind>() != null)
                                {
                                    b.GetComp <CompPowerPlantWind>().PowerOutput /= 2f;
                                }
                                if (b.GetComp <CompPowerTrader>() != null)
                                {
                                    b.GetComp <CompPowerTrader>().PowerOn = false;
                                }
                            }
                        }
                    }
                }
            }
        }