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