private void StartSpray() { SnowUtility.AddSnowRadial(this.OccupiedRect().RandomCell, Map, 4, -0.06f); spraySustainer = SoundStarter.TrySpawnSustainer(SoundDefOf.GeyserSpray, new TargetInfo(Position, Map)); spraySustainerStartTick = Find.TickManager.TicksGame; }
protected override void Impact(Thing hitThing) { SnowUtility.AddSnowRadial(Position, Map, 2f, 1f); MoteThrown moteThrown = (MoteThrown)ThingMaker.MakeThing(ThingDefOf.Mote_Smoke, null); moteThrown.Scale = Rand.Range(1.5f, 2.5f) * 2; moteThrown.rotationRate = Rand.Range(-30f, 30f); moteThrown.exactPosition = Position.ToVector3(); moteThrown.SetVelocity((float)Rand.Range(30, 40), Rand.Range(0.5f, 0.7f)); GenSpawn.Spawn(moteThrown, Position, Map, WipeMode.Vanish); base.Impact(hitThing); }
public override void CompTick() { base.CompTick(); if (parent.IsHashIntervalTick(60)) { if (Temperature > props.heatSuckMinTemperature) { GenTemperature.PushHeat(parent.Position, parent.MapHeld, -props.coldPerSecond); } SnowUtility.AddSnowRadial(parent.Position, parent.Map, props.snowRadius, props.snowDepth); } }
private void StartSpray() { SnowUtility.AddSnowRadial(this.OccupiedRect().RandomCell, base.Map, 4f, -0.06f); this.spraySustainer = SoundDefOf.GeyserSpray.TrySpawnSustainer(new TargetInfo(base.Position, base.Map, false)); this.spraySustainerStartTick = Find.TickManager.TicksGame; int Count = 0; foreach (Thing thing in GenRadial.RadialDistinctThingsAround(this.Position, this.Map, 10, true)) { if (thing.def.defName == "AB_TarPuddle") { Count++; } } if (Count < 15) { for (int iteration = 0; iteration < 3; iteration++) { IntVec3 intVec; if (!CellFinder.TryRandomClosewalkCellNear(this.Position, this.Map, 7, out intVec)) { break; } Plant plant = intVec.GetPlant(this.Map); if (plant != null && plant.def.defName != "AB_TarPuddle") { plant.Destroy(DestroyMode.Vanish); Thing plantToSpawn = GenSpawn.Spawn(ThingDef.Named("AB_TarPuddle"), intVec, this.Map, WipeMode.Vanish); } else if (plant == null) { Thing plantToSpawn = GenSpawn.Spawn(ThingDef.Named("AB_TarPuddle"), intVec, this.Map, WipeMode.Vanish); } } } }
protected override bool TryCastShot() { Pawn p = this.CasterPawn; Map map = this.CasterPawn.Map; CompAbilityUserMagic comp = this.CasterPawn.GetComp <CompAbilityUserMagic>(); pawns.Clear(); plants.Clear(); GenClamor.DoClamor(p, this.UseAbilityProps.TargetAoEProperties.range, ClamorDefOf.Ability); Effecter snapeFreezeED = TorannMagicDefOf.TM_SnapFreezeED.Spawn(); snapeFreezeED.Trigger(new TargetInfo(this.currentTarget.Cell, map, false), new TargetInfo(this.currentTarget.Cell, map, false)); snapeFreezeED.Cleanup(); SoundInfo info = SoundInfo.InMap(new TargetInfo(this.currentTarget.Cell, map, false), MaintenanceType.None); info.pitchFactor = .4f; info.volumeFactor = 1.2f; TorannMagicDefOf.TM_WindLowSD.PlayOneShot(info); TargetInfo ti = new TargetInfo(this.currentTarget.Cell, map, false); TM_MoteMaker.MakeOverlay(ti, TorannMagicDefOf.TM_Mote_PsycastAreaEffect, map, Vector3.zero, 3f, 0f, .1f, .4f, 1.2f, -3f); float classBonus = 1f; if (p.story != null && p.story.traits != null && p.story.traits.HasTrait(TorannMagicDefOf.HeartOfFrost)) { classBonus = 1.5f; } if (this.currentTarget != null && p != null && comp != null) { this.arcaneDmg = comp.arcaneDmg; this.TargetsAoE.Clear(); this.FindTargets(); float energy = -125000 * this.arcaneDmg * classBonus; GenTemperature.PushHeat(this.currentTarget.Cell, p.Map, energy); for (int i = 0; i < pawns.Count; i++) { if (!pawns[i].RaceProps.IsMechanoid && pawns[i].RaceProps.body.AllPartsVulnerableToFrostbite.Count > 0) { float distanceModifier = 1f / (pawns[i].Position - currentTarget.Cell).LengthHorizontal; if (distanceModifier > 1f) { distanceModifier = 1f; } int bites = Mathf.RoundToInt(Rand.Range(1f, 5f) * classBonus); for (int j = 0; j < bites; j++) { if (Rand.Chance(TM_Calc.GetSpellSuccessChance(this.CasterPawn, pawns[i], true)) && Rand.Chance(distanceModifier)) { TM_Action.DamageEntities(pawns[i], pawns[i].def.race.body.AllPartsVulnerableToFrostbite.RandomElement(), Rand.Range(10, 20) * distanceModifier, 1f, DamageDefOf.Frostbite, p); } if (Rand.Chance(TM_Calc.GetSpellSuccessChance(this.CasterPawn, pawns[i], true)) && Rand.Chance(distanceModifier)) { HealthUtility.AdjustSeverity(pawns[i], HediffDefOf.Hypothermia, distanceModifier / 5f); } } } } for (int i = 0; i < plants.Count; i++) { float distanceModifier = 1f / (plants[i].Position - currentTarget.Cell).LengthHorizontal; if (distanceModifier > 1f) { distanceModifier = 1f; } if (plants[i].def.plant.IsTree) { if (Rand.Chance(distanceModifier / 2f)) { plants[i].MakeLeafless(Plant.LeaflessCause.Cold); } } else { if (Rand.Chance(distanceModifier)) { plants[i].MakeLeafless(Plant.LeaflessCause.Cold); } } plants[i].Notify_ColorChanged(); } List <IntVec3> cellList = GenRadial.RadialCellsAround(this.currentTarget.Cell, this.UseAbilityProps.TargetAoEProperties.range, true).ToList(); bool raining = map.weatherManager.RainRate > 0f || map.weatherManager.SnowRate > 0f; for (int i = 0; i < cellList.Count; i++) { cellList[i] = cellList[i].ClampInsideMap(map); SnowUtility.AddSnowRadial(cellList[i], map, 2.4f, Rand.Range(.08f, .13f)); TM_FleckMaker.ThrowGenericFleck(FleckDefOf.AirPuff, cellList[i].ToVector3Shifted(), map, 2.5f, .05f, .05f, Rand.Range(2f, 3f), Rand.Range(-60, 60), .5f, -70, Rand.Range(0, 360)); } List <IntVec3> windList = GenRadial.RadialCellsAround(this.currentTarget.Cell, this.UseAbilityProps.TargetAoEProperties.range + 1, true).Except(cellList).ToList(); for (int i = 0; i < windList.Count; i++) { windList[i] = windList[i].ClampInsideMap(map); Vector3 angle = TM_Calc.GetVector(windList[i], this.currentTarget.Cell); TM_FleckMaker.ThrowGenericFleck(FleckDefOf.AirPuff, windList[i].ToVector3Shifted(), map, Rand.Range(1.2f, 2f), .45f, Rand.Range(0f, .25f), .5f, -200, Rand.Range(3, 5), (Quaternion.AngleAxis(90, Vector3.up) * angle).ToAngleFlat(), Rand.Range(0, 360)); } } this.burstShotsLeft = 0; return(true); }
private void DoComplexCalcs() { bool flag = false; Profiler.BeginSample("Determine flammability"); Fire.flammableList.Clear(); this.flammabilityMax = 0f; if (!base.Position.GetTerrain(base.Map).extinguishesFire) { if (this.parent == null) { if (base.Position.TerrainFlammableNow(base.Map)) { this.flammabilityMax = base.Position.GetTerrain(base.Map).GetStatValueAbstract(StatDefOf.Flammability, null); } List <Thing> list = base.Map.thingGrid.ThingsListAt(base.Position); for (int i = 0; i < list.Count; i++) { Thing thing = list[i]; if (thing is Building_Door) { flag = true; } float statValue = thing.GetStatValue(StatDefOf.Flammability, true); if (statValue >= 0.01f) { Fire.flammableList.Add(list[i]); if (statValue > this.flammabilityMax) { this.flammabilityMax = statValue; } if (this.parent == null && this.fireSize > 0.4f && list[i].def.category == ThingCategory.Pawn) { list[i].TryAttachFire(this.fireSize * 0.2f); } } } } else { Fire.flammableList.Add(this.parent); this.flammabilityMax = this.parent.GetStatValue(StatDefOf.Flammability, true); } } Profiler.EndSample(); if (this.flammabilityMax < 0.01f) { this.Destroy(DestroyMode.Vanish); } else { Profiler.BeginSample("Do damage"); Thing thing2; if (this.parent != null) { thing2 = this.parent; } else if (Fire.flammableList.Count > 0) { thing2 = Fire.flammableList.RandomElement <Thing>(); } else { thing2 = null; } if (thing2 != null) { if (this.fireSize >= 0.4f || thing2 == this.parent || thing2.def.category != ThingCategory.Pawn) { this.DoFireDamage(thing2); } } Profiler.EndSample(); if (base.Spawned) { Profiler.BeginSample("Room heat"); float num = this.fireSize * 160f; if (flag) { num *= 0.15f; } GenTemperature.PushHeat(base.Position, base.Map, num); Profiler.EndSample(); Profiler.BeginSample("Snow clear"); if (Rand.Value < 0.4f) { float radius = this.fireSize * 3f; SnowUtility.AddSnowRadial(base.Position, base.Map, radius, -(this.fireSize * 0.1f)); } Profiler.EndSample(); Profiler.BeginSample("Grow/extinguish"); this.fireSize += 0.00055f * this.flammabilityMax * 150f; if (this.fireSize > 1.75f) { this.fireSize = 1.75f; } if (base.Map.weatherManager.RainRate > 0.01f) { if (this.VulnerableToRain()) { if (Rand.Value < 6f) { base.TakeDamage(new DamageInfo(DamageDefOf.Extinguish, 10f, 0f, -1f, null, null, null, DamageInfo.SourceCategory.ThingOrUnknown, null)); } } } Profiler.EndSample(); } } }
private void StartSpray() { SnowUtility.AddSnowRadial(this.OccupiedRect().RandomCell, base.Map, 4f, -0.06f); this.spraySustainer = SoundDefOf.GeyserSpray.TrySpawnSustainer(new TargetInfo(base.Position, base.Map, false)); this.spraySustainerStartTick = Find.TickManager.TicksGame; }
public static bool DoComplexCalcs(Fire __instance) { bool flag = false; //flammableList.Clear(); List <Thing> flammableList = new List <Thing>(); flammabilityMax(__instance) = 0.0f; if (null != __instance.Map) { if (!__instance.Position.GetTerrain(__instance.Map).extinguishesFire) { if (__instance.parent == null) { if (__instance.Position.TerrainFlammableNow(__instance.Map)) { flammabilityMax(__instance) = __instance.Position.GetTerrain(__instance.Map).GetStatValueAbstract(StatDefOf.Flammability, (ThingDef)null); } List <Thing> thingList = __instance.Map.thingGrid.ThingsListAt(__instance.Position); for (int index = 0; index < thingList.Count; ++index) { Thing thing = thingList[index]; if (thing is Building_Door) { flag = true; } float statValue = thing.GetStatValue(StatDefOf.Flammability, true); if ((double)statValue >= 0.00999999977648258) { flammableList.Add(thingList[index]); if ((double)statValue > (double)flammabilityMax(__instance)) { flammabilityMax(__instance) = statValue; } if (__instance.parent == null && (double)__instance.fireSize > 0.400000005960464 && (thingList[index].def.category == ThingCategory.Pawn && Rand.Chance(FireUtility.ChanceToAttachFireCumulative(thingList[index], 150f)))) { thingList[index].TryAttachFire(__instance.fireSize * 0.2f); } } } } else { flammableList.Add(__instance.parent); flammabilityMax(__instance) = __instance.parent.GetStatValue(StatDefOf.Flammability, true); } } if ((double)flammabilityMax(__instance) < 0.00999999977648258) { __instance.Destroy(DestroyMode.Vanish); } else { Thing targ = __instance.parent == null ? (flammableList.Count <= 0 ? (Thing)null : flammableList[Rand.Range(0, flammableList.Count)]) : __instance.parent; if (targ != null && ((double)__instance.fireSize >= 0.400000005960464 || targ == __instance.parent || targ.def.category != ThingCategory.Pawn)) { DoFireDamage(__instance, targ); } if (!__instance.Spawned) { return(false); } float energy = __instance.fireSize * 160f; if (flag) { energy *= 0.15f; } GenTemperature.PushHeat(__instance.Position, __instance.Map, energy); if ((double)Rand.Value < 0.400000005960464) { SnowUtility.AddSnowRadial(__instance.Position, __instance.Map, __instance.fireSize * 3f, (float)-((double)__instance.fireSize * 0.100000001490116)); } __instance.fireSize += (float)(0.000549999997019768 * (double)flammabilityMax(__instance) * 150.0); if ((double)__instance.fireSize > 1.75) { __instance.fireSize = 1.75f; } if ((double)__instance.Map.weatherManager.RainRate <= 0.00999999977648258 || !VulnerableToRain(__instance) || (double)Rand.Value >= 6.0) { return(false); } //__instance.TakeDamage(new DamageInfo(DamageDefOf.Extinguish, 10f, 0.0f, -1f, (Thing)null, (BodyPartRecord)null, (ThingDef)null, DamageInfo.SourceCategory.ThingOrUnknown, (Thing)null)); DamageInfo daminfo = new DamageInfo(DamageDefOf.Extinguish, 10f, 0.0f, -1f, (Thing)null, (BodyPartRecord)null, (ThingDef)null, DamageInfo.SourceCategory.ThingOrUnknown, (Thing)null); DamageWorker.DamageResult dresult = new DamageWorker.DamageResult(); Thing_Patch.TakeDamage(__instance, ref dresult, daminfo); } } return(false); }
public override void TargetEffects(LocalTargetInfo targetInfo) { base.TargetEffects(targetInfo); SnowUtility.AddSnowRadial(targetInfo.Cell, this.pawn.Map, 3f, 1f); }
private void DoComplexCalcs() { bool flag = false; flammableList.Clear(); flammabilityMax = 0f; if (!base.Position.GetTerrain(base.Map).extinguishesFire) { if (parent == null) { if (base.Position.TerrainFlammableNow(base.Map)) { flammabilityMax = base.Position.GetTerrain(base.Map).GetStatValueAbstract(StatDefOf.Flammability); } List <Thing> list = base.Map.thingGrid.ThingsListAt(base.Position); for (int i = 0; i < list.Count; i++) { Thing thing = list[i]; if (thing is Building_Door) { flag = true; } float statValue = thing.GetStatValue(StatDefOf.Flammability); if (!(statValue < 0.01f)) { flammableList.Add(list[i]); if (statValue > flammabilityMax) { flammabilityMax = statValue; } if (parent == null && fireSize > 0.4f && list[i].def.category == ThingCategory.Pawn) { list[i].TryAttachFire(fireSize * 0.2f); } } } } else { flammableList.Add(parent); flammabilityMax = parent.GetStatValue(StatDefOf.Flammability); } } if (flammabilityMax < 0.01f) { Destroy(); } else { Thing thing2 = (parent != null) ? parent : ((flammableList.Count <= 0) ? null : flammableList.RandomElement()); if (thing2 != null && (!(fireSize < 0.4f) || thing2 == parent || thing2.def.category != ThingCategory.Pawn)) { DoFireDamage(thing2); } if (base.Spawned) { float num = fireSize * 160f; if (flag) { num *= 0.15f; } GenTemperature.PushHeat(base.Position, base.Map, num); if (Rand.Value < 0.4f) { float radius = fireSize * 3f; SnowUtility.AddSnowRadial(base.Position, base.Map, radius, 0f - fireSize * 0.1f); } fireSize += 0.00055f * flammabilityMax * 150f; if (fireSize > 1.75f) { fireSize = 1.75f; } if (base.Map.weatherManager.RainRate > 0.01f && VulnerableToRain() && Rand.Value < 6f) { TakeDamage(new DamageInfo(DamageDefOf.Extinguish, 10f)); } } } }
private void DoComplexCalcs() { bool flag = false; Fire.flammableList.Clear(); this.flammabilityMax = 0f; if (!base.Position.GetTerrain(base.Map).extinguishesFire) { if (base.parent == null) { if (base.Position.TerrainFlammableNow(base.Map)) { this.flammabilityMax = base.Position.GetTerrain(base.Map).GetStatValueAbstract(StatDefOf.Flammability, null); } List <Thing> list = base.Map.thingGrid.ThingsListAt(base.Position); for (int i = 0; i < list.Count; i++) { Thing thing = list[i]; if (thing is Building_Door) { flag = true; } float statValue = thing.GetStatValue(StatDefOf.Flammability, true); if (!(statValue < 0.0099999997764825821)) { Fire.flammableList.Add(list[i]); if (statValue > this.flammabilityMax) { this.flammabilityMax = statValue; } if (base.parent == null && this.fireSize > 0.40000000596046448 && list[i].def.category == ThingCategory.Pawn) { list[i].TryAttachFire((float)(this.fireSize * 0.20000000298023224)); } } } } else { Fire.flammableList.Add(base.parent); this.flammabilityMax = base.parent.GetStatValue(StatDefOf.Flammability, true); } } if (this.flammabilityMax < 0.0099999997764825821) { this.Destroy(DestroyMode.Vanish); } else { Thing thing2 = (base.parent == null) ? ((Fire.flammableList.Count <= 0) ? null : Fire.flammableList.RandomElement()) : base.parent; if (thing2 != null && (!(this.fireSize < 0.40000000596046448) || thing2 == base.parent || thing2.def.category != ThingCategory.Pawn)) { this.DoFireDamage(thing2); } if (base.Spawned) { float num = (float)(this.fireSize * 160.0); if (flag) { num = (float)(num * 0.15000000596046448); } GenTemperature.PushHeat(base.Position, base.Map, num); if (Rand.Value < 0.40000000596046448) { float radius = (float)(this.fireSize * 3.0); SnowUtility.AddSnowRadial(base.Position, base.Map, radius, (float)(0.0 - this.fireSize * 0.10000000149011612)); } this.fireSize += (float)(0.00054999999701976776 * this.flammabilityMax * 150.0); if (this.fireSize > 1.75) { this.fireSize = 1.75f; } if (base.Map.weatherManager.RainRate > 0.0099999997764825821 && this.VulnerableToRain() && Rand.Value < 6.0) { base.TakeDamage(new DamageInfo(DamageDefOf.Extinguish, 10, -1f, null, null, null, DamageInfo.SourceCategory.ThingOrUnknown)); } } } }
private void DoComplexCalcs() { bool cellContainsDoor = false; Profiler.BeginSample("Determine flammability"); //Determine list of flammables in my cell flammableList.Clear(); flammabilityMax = 0; if (Position.GetTerrain(Map).extinguishesFire) { // immediately extinguish; we just leave flammabilityMax at 0 } else if (parent == null) { if (Position.TerrainFlammableNow(Map)) { flammabilityMax = Position.GetTerrain(Map).GetStatValueAbstract(StatDefOf.Flammability); } var cellThings = Map.thingGrid.ThingsListAt(Position); for (int i = 0; i < cellThings.Count; i++) { var ct = cellThings[i]; if (ct is Building_Door) { cellContainsDoor = true; } var thingFlam = ct.GetStatValue(StatDefOf.Flammability); if (thingFlam < 0.01f) { continue; } //Record its flammability flammableList.Add(cellThings[i]); if (thingFlam > flammabilityMax) { flammabilityMax = thingFlam; } //If I'm a static fire and it's a pawn and I'm big, ignite it if (parent == null && fireSize > MinSizeForIgniteMovables && cellThings[i].def.category == ThingCategory.Pawn) { cellThings[i].TryAttachFire(fireSize * 0.2f); } } } else { //Consider only my parent flammableList.Add(parent); flammabilityMax = parent.GetStatValue(StatDefOf.Flammability); } Profiler.EndSample(); //Determine flammability //Destroy me if I have nothing to burn if (flammabilityMax < 0.01f) { Destroy(); return; } Profiler.BeginSample("Do damage"); { //Choose what I'm going to damage Thing damagee; if (parent != null) { damagee = parent; //Damage parent } else if (flammableList.Count > 0) { damagee = flammableList.RandomElement(); //Damage random flammable thing in cell } else { damagee = null; } //Damage whatever we're supposed to damage if (damagee != null) { //We don't damage the target if it's not our parent, it would attach a fire, and we're too small //This is to avoid tiny fires igniting passing pawns if (!(fireSize < MinSizeForIgniteMovables && damagee != parent && damagee.def.category == ThingCategory.Pawn)) { DoFireDamage(damagee); } } } Profiler.EndSample(); //Do damage //If still spawned (after doing damage)... if (Spawned) { Profiler.BeginSample("Room heat"); //Push some heat float fireEnergy = fireSize * HeatPerFireSizePerInterval; //Hack to reduce impact on doors, otherwise they hit insane temperatures fast if (cellContainsDoor) { fireEnergy *= HeatFactorWhenDoorPresent; } GenTemperature.PushHeat(Position, Map, fireEnergy); Profiler.EndSample(); //Room heat Profiler.BeginSample("Snow clear"); if (Rand.Value < 0.4f) { //Clear some snow around the fire float snowClearRadius = fireSize * SnowClearRadiusPerFireSize; SnowUtility.AddSnowRadial(Position, Map, snowClearRadius, -(fireSize * SnowClearDepthFactor)); } Profiler.EndSample(); //Snow clear Profiler.BeginSample("Grow/extinguish"); //Try to grow the fire fireSize += FireBaseGrowthPerTick * flammabilityMax * ComplexCalcsInterval; if (fireSize > MaxFireSize) { fireSize = MaxFireSize; } //Extinguish from sky (rain etc) if (Map.weatherManager.RainRate > 0.01f) { if (VulnerableToRain()) { if (Rand.Value < BaseSkyExtinguishChance * ComplexCalcsInterval) { TakeDamage(new DamageInfo(DamageDefOf.Extinguish, BaseSkyExtinguishDamage)); } } } Profiler.EndSample(); //Grow/extinguish } }