public static Mote ThrowCasingTurret(Thing caster, Map map, int weaponDamage, ThingDef moteDef) { if (!caster.Position.ShouldSpawnMotesAt(map) || map.moteCounter.Saturated) { return(null); } Building_TurretGun turret = caster as Building_TurretGun; TurretTop turrettop = Traverse.Create(turret).Field("top").GetValue <TurretTop>(); float angle = Traverse.Create(turrettop).Field("curRotationInt").GetValue <float>(); MoteThrownCasing moteThrown = (MoteThrownCasing)ThingMaker.MakeThing(moteDef, null); if (BulletCasingMoteSettings.uncapCasingSize) { moteThrown.Scale = GenMath.LerpDouble(5f, 50f, 0.2f, 0.5f, weaponDamage); } else { moteThrown.Scale = GenMath.LerpDoubleClamped(5f, 75f, 0.2f, 0.5f, weaponDamage); } moteThrown.exactPosition = caster.TrueCenter(); moteThrown.rotationRate = Rand.Range(-360f, 360f); moteThrown.speed = Rand.Range(BulletCasingMoteSettings.velocityFactor.min, BulletCasingMoteSettings.velocityFactor.max); moteThrown.rotation = angle; moteThrown.velocityRandom = new Vector3(Rand.Range(-4f, 4f), 0f, Rand.Range(-4f, 4f)); GenSpawn.Spawn(moteThrown, caster.Position, map, WipeMode.Vanish); return(moteThrown); }
public static float GetFallColorFactor(float latitude, int dayOfYear) { float a = GenCelestial.AverageGlow(latitude, dayOfYear); float b = GenCelestial.AverageGlow(latitude, dayOfYear + 1); float x = Mathf.LerpUnclamped(a, b, PlantFallColors.FallSlopeComponent); return GenMath.LerpDoubleClamped(PlantFallColors.FallColorBegin, PlantFallColors.FallColorEnd, 0f, 1f, x); }
public static Mote ThrowCasing(Pawn caster, Map map, int weaponDamage, ThingDef moteDef) { if (!caster.Position.ShouldSpawnMotesAt(map) || map.moteCounter.Saturated) { return(null); } float angle = (caster.TargetCurrentlyAimingAt.CenterVector3 - caster.DrawPos).AngleFlat(); MoteThrownCasing moteThrown = (MoteThrownCasing)ThingMaker.MakeThing(moteDef, null); if (BulletCasingMoteSettings.uncapCasingSize) { moteThrown.Scale = GenMath.LerpDouble(5f, 30f, 0.2f, 0.4f, weaponDamage); } else { moteThrown.Scale = GenMath.LerpDoubleClamped(5f, 30f, 0.2f, 0.4f, weaponDamage); } moteThrown.exactPosition = caster.Position.ToVector3Shifted(); moteThrown.exactPosition += Quaternion.AngleAxis(angle, Vector3.up) * new Vector3(0f, 0f, 0.3f); //puts the casing slightly infront of the pawn moteThrown.rotationRate = Rand.Range(-360f, 360f); moteThrown.speed = Rand.Range(BulletCasingMoteSettings.velocityFactor.min, BulletCasingMoteSettings.velocityFactor.max); moteThrown.rotation = angle; moteThrown.velocityRandom = new Vector3(Rand.Range(-3f, 3f), 0f, Rand.Range(-3f, 3f)); GenSpawn.Spawn(moteThrown, caster.Position, map, WipeMode.Vanish); return(moteThrown); }
private float PlantChoiceWeight(ThingDef plantDef, IntVec3 c, Dictionary <ThingDef, float> distanceSqToNearbyClusters, float wholeMapNumDesiredPlants, float plantDensity) { float commonalityOfPlant = this.GetCommonalityOfPlant(plantDef); float commonalityPctOfPlant = this.GetCommonalityPctOfPlant(plantDef); float num = commonalityOfPlant; float result; if (num <= 0f) { result = num; } else { float num2 = 0.5f; if ((float)this.map.listerThings.ThingsInGroup(ThingRequestGroup.Plant).Count > wholeMapNumDesiredPlants / 2f && !plantDef.plant.cavePlant) { num2 = (float)this.map.listerThings.ThingsOfDef(plantDef).Count / (float)this.map.listerThings.ThingsInGroup(ThingRequestGroup.Plant).Count / commonalityPctOfPlant; num *= WildPlantSpawner.GlobalPctSelectionWeightBias.Evaluate(num2); } if (plantDef.plant.GrowsInClusters && num2 < 1.1f) { float num3 = (!plantDef.plant.cavePlant) ? this.map.Biome.PlantCommonalitiesSum : this.CavePlantsCommonalitiesSum; float x = commonalityOfPlant * plantDef.plant.wildClusterWeight / (num3 - commonalityOfPlant + commonalityOfPlant * plantDef.plant.wildClusterWeight); float num4 = 1f / (3.14159274f * (float)plantDef.plant.wildClusterRadius * (float)plantDef.plant.wildClusterRadius); num4 = GenMath.LerpDoubleClamped(commonalityPctOfPlant, 1f, 1f, num4, x); float f; if (distanceSqToNearbyClusters.TryGetValue(plantDef, out f)) { float x2 = Mathf.Sqrt(f); num *= GenMath.LerpDoubleClamped((float)plantDef.plant.wildClusterRadius * 0.9f, (float)plantDef.plant.wildClusterRadius * 1.1f, plantDef.plant.wildClusterWeight, num4, x2); } else { num *= num4; } } if (plantDef.plant.wildEqualLocalDistribution) { float f2 = wholeMapNumDesiredPlants * commonalityPctOfPlant; float num5 = (float)Mathf.Max(this.map.Size.x, this.map.Size.z) / Mathf.Sqrt(f2); float num6 = num5 * 2f; if (plantDef.plant.GrowsInClusters) { num6 = Mathf.Max(num6, (float)plantDef.plant.wildClusterRadius * 1.6f); } num6 = Mathf.Max(num6, 7f); if (num6 <= 25f) { num *= this.LocalPlantProportionsWeightFactor(c, commonalityPctOfPlant, plantDensity, num6, plantDef); } } result = num; } return(result); }
private static float PlantChoiceWeight2(WildPlantSpawner __instance, ThingDef plantDef, IntVec3 c, Dictionary <ThingDef, float> distanceSqToNearbyClusters, float wholeMapNumDesiredPlants, float plantDensity) { float commonalityOfPlant = GetCommonalityOfPlant2(map(__instance), plantDef); float commonalityPctOfPlant = GetCommonalityPctOfPlant2(__instance, plantDef); float num = commonalityOfPlant; if (num <= 0f) { return(num); } float num2 = 0.5f; if ((float)map(__instance).listerThings.ThingsInGroup(ThingRequestGroup.Plant).Count > wholeMapNumDesiredPlants / 2f && !plantDef.plant.cavePlant) { num2 = (float)map(__instance).listerThings.ThingsOfDef(plantDef).Count / (float)map(__instance).listerThings.ThingsInGroup(ThingRequestGroup.Plant).Count / commonalityPctOfPlant; num *= GlobalPctSelectionWeightBias.Evaluate(num2); } if (plantDef.plant.GrowsInClusters && num2 < 1.1f) { float num3 = plantDef.plant.cavePlant ? __instance.CavePlantsCommonalitiesSum : map(__instance).Biome.PlantCommonalitiesSum; float x = commonalityOfPlant * plantDef.plant.wildClusterWeight / (num3 - commonalityOfPlant + commonalityOfPlant * plantDef.plant.wildClusterWeight); float outTo = 1f / ((float)Math.PI * (float)plantDef.plant.wildClusterRadius * (float)plantDef.plant.wildClusterRadius); outTo = GenMath.LerpDoubleClamped(commonalityPctOfPlant, 1f, 1f, outTo, x); if (distanceSqToNearbyClusters.TryGetValue(plantDef, out float value)) { float x2 = Mathf.Sqrt(value); num *= GenMath.LerpDoubleClamped((float)plantDef.plant.wildClusterRadius * 0.9f, (float)plantDef.plant.wildClusterRadius * 1.1f, plantDef.plant.wildClusterWeight, outTo, x2); } else { num *= outTo; } } if (plantDef.plant.wildEqualLocalDistribution) { float f = wholeMapNumDesiredPlants * commonalityPctOfPlant; float a = (float)Mathf.Max(map(__instance).Size.x, map(__instance).Size.z) / Mathf.Sqrt(f) * 2f; if (plantDef.plant.GrowsInClusters) { a = Mathf.Max(a, (float)plantDef.plant.wildClusterRadius * 1.6f); } a = Mathf.Max(a, 7f); if (a <= 25f) { num *= LocalPlantProportionsWeightFactor2(__instance, c, commonalityPctOfPlant, plantDensity, a, plantDef); } } return(num); }
public static float GetManhunterOnDamageChance(Pawn pawn, float distance, Thing instigator) { float num = PawnUtility.GetManhunterOnDamageChance(pawn.kindDef); num *= GenMath.LerpDoubleClamped(1f, 30f, 3f, 1f, distance); if (instigator != null) { num *= 1f - instigator.GetStatValue(StatDefOf.HuntingStealth, true); } return(num); }
protected override float MtbHours(Pawn pawn) { Room room = pawn.GetRoom(); if (room == null) { return(18f); } int num = (room.IsHuge ? 9999 : room.CellCount); float num2 = GenMath.LerpDoubleClamped(2f, 25f, 6f, 1f, num); return(18f / num2); }
protected override float MtbHours(Pawn pawn) { Room room = pawn.GetRoom(RegionType.Set_Passable); if (room == null) { return(18f); } int num = (!room.IsHuge) ? room.CellCount : 9999; float num2 = GenMath.LerpDoubleClamped(2f, 25f, 6f, 1f, (float)num); return(18f / num2); }
public override float Calculate(Pawn observer, Pawn assessed) { XenoRomanceExtension observerExtension = observer.def.GetModExtension <XenoRomanceExtension>(); XenoRomanceExtension assessedExtension = assessed.def.GetModExtension <XenoRomanceExtension>(); float assessedMaturityPct = Mathf.Clamp01(Mathf.InverseLerp(assessedExtension.youngAdultAge, assessed.RaceProps.lifeExpectancy, assessed.ageTracker.AgeBiologicalYearsFloat)); float observerMaturityPct = Mathf.Clamp01(Mathf.InverseLerp(observerExtension.youngAdultAge, observer.RaceProps.lifeExpectancy, observer.ageTracker.AgeBiologicalYearsFloat)); float observerAgeTolerance = GenMath.LerpDoubleClamped(observerExtension.youngAdultAge, observerExtension.midlifeAge, observerExtension.minimumAgeDeviation, observerExtension.maximumAgeDeviation, observer.ageTracker.AgeBiologicalYearsFloat); float ageTolerancePct = (observerAgeTolerance / observer.RaceProps.lifeExpectancy); float ageDifference = Mathf.Abs(observerMaturityPct - assessedMaturityPct); return(Mathf.Clamp01(Mathf.Pow(ageTolerancePct / ageDifference, ageDeviationDampener))); //People are generally attracted to members of their own age group. //For young pawns, this is very significant. //As pawns get older, age is less of a factor. /* * float observerAge = observer.ageTracker.AgeBiologicalYearsFloat; * float assessedAge = assessed.ageTracker.AgeBiologicalYearsFloat; * float ageDifference = Math.Abs(observerAge - assessedAge); * float acceptableAgeDifference = AttractionUtility.GetAgeDeviation(observer); * if (ageDifference - acceptableAgeDifference <= 0f) * { * return 1f; * } * * float ageFactor = acceptableAgeDifference / ageDifference; * * //Makes females pawns more tolerant of old age difference. * //Some people really don't like this, which is why it can be toggled off in the settings. * if (GRHelper.ShouldApplyFemaleDifference(observer.gender)) * { * if (observerAge < assessedAge) * { * ageFactor = Mathf.Pow(ageFactor, GenderedAgePreference); * } * } */ }
public void Notify_ColonistViolentlyDownedOrKilled(Pawn p) { if (p.RaceProps.Humanlike) { float num = (float)(this.shortTermFactor - 1.0); float num2 = (float)(this.longTermFactor - 1.0); int num3 = PawnsFinder.AllMapsCaravansAndTravelingTransportPods_FreeColonists.Count(); switch (num3) { case 0: num = (float)(num * 0.0); num2 = (float)(num2 * 0.0); break; case 1: num = (float)(num * 0.0); num2 = (float)(num2 * 0.0); break; case 2: num = (float)(num * 0.0); num2 = (float)(num2 * 0.0); break; case 3: num = (float)(num * 0.0); num2 = (float)(num2 * 0.20000000298023224); break; case 4: num = (float)(num * 0.15000000596046448); num2 = (float)(num2 * 0.40000000596046448); break; case 5: num = (float)(num * 0.25); num2 = (float)(num2 * 0.60000002384185791); break; case 6: num = (float)(num * 0.30000001192092896); num2 = (float)(num2 * 0.699999988079071); break; case 7: num = (float)(num * 0.34999999403953552); num2 = (float)(num2 * 0.75); break; case 8: num = (float)(num * 0.40000000596046448); num2 = (float)(num2 * 0.800000011920929); break; case 9: num = (float)(num * 0.44999998807907104); num2 = (float)(num2 * 0.85000002384185791); break; case 10: num = (float)(num * 0.5); num2 = (float)(num2 * 0.89999997615814209); break; case 11: num = (float)(num * 0.550000011920929); num2 = (float)(num2 * 0.9100000262260437); break; case 12: num = (float)(num * 0.60000002384185791); num2 = (float)(num2 * 0.92000001668930054); break; case 13: num = (float)(num * 0.64999997615814209); num2 = (float)(num2 * 0.93000000715255737); break; case 14: num = (float)(num * 0.699999988079071); num2 = (float)(num2 * 0.93999999761581421); break; case 15: num = (float)(num * 0.75); num2 = (float)(num2 * 0.949999988079071); break; default: num *= GenMath.LerpDoubleClamped(16f, 30f, 0.8f, 1f, (float)num3); num2 *= GenMath.LerpDoubleClamped(16f, 30f, 0.95f, 1f, (float)num3); break; } this.shortTermFactor = (float)(1.0 + num); this.longTermFactor = (float)(1.0 + num2); } }
public static float GetManhunterOnDamageChance(Pawn pawn, float distance) { float manhunterOnDamageChance = PawnUtility.GetManhunterOnDamageChance(pawn.kindDef); return(manhunterOnDamageChance * GenMath.LerpDoubleClamped(1f, 30f, 3f, 1f, distance)); }
public static void DoGraph(Rect position) { ResetRange++; if (ResetRange >= 500) { ResetRange = 0; WindowMax = 0; } Text.Font = GameFont.Small; var settings = position.TopPartPixels(30f); position = position.BottomPartPixels(position.height - 30f); Widgets.DrawBoxSolid(position, Analyzer.Settings.GraphCol); GUI.color = Color.grey; Widgets.DrawBox(position, 2); GUI.color = Color.white; if (!Analyzer.Profiles.ContainsKey(key)) { return; } var prof = Analyzer.Profiles[key]; if (prof.History.times.Length <= 0) { return; } var mescou = prof.History.times.Length; if (mescou > entryCount) { mescou = entryCount; } var gap = position.width / mescou; var car = settings.RightPartPixels(200f); car.x -= 15; entryCount = (int)Widgets.HorizontalSlider(car, entryCount, 10, 2000, true, string.Intern($"{entryCount} Entries")); car = new Rect(car.xMax + 5, car.y + 2, 10, 10); Widgets.DrawBoxSolid(car, Analyzer.Settings.LineCol); if (Widgets.ButtonInvisible(car, true)) { if (Find.WindowStack.WindowOfType <colourPicker>() != null) { Find.WindowStack.RemoveWindowsOfType(typeof(colourPicker)); } else { var cp = new colourPicker { Setcol = () => Analyzer.Settings.LineCol = colourPicker.CurrentCol }; cp.SetColor(Analyzer.Settings.LineCol); Find.WindowStack.Add(cp); } } car.y += 12; Widgets.DrawBoxSolid(car, Analyzer.Settings.GraphCol); if (Widgets.ButtonInvisible(car, true)) { if (Find.WindowStack.WindowOfType <colourPicker>() != null) { Find.WindowStack.RemoveWindowsOfType(typeof(colourPicker)); } else { var cp = new colourPicker { Setcol = () => Analyzer.Settings.GraphCol = colourPicker.CurrentCol }; cp.SetColor(Analyzer.Settings.GraphCol); Find.WindowStack.Add(cp); } } if (Analyzer.Settings.AdvancedMode) { var memr = settings.LeftPartPixels(20f); if (Widgets.ButtonImageFitted(memr, mem, ShowMem ? Color.white : Color.grey)) { ShowMem = !ShowMem; } GUI.color = Color.white; TooltipHandler.TipRegion(memr, "Toggle garbage tracking, approximation of total garbage produced by the selected log"); memr.x = memr.xMax; memr.width = 300f; if (ShowMem) { Text.Anchor = TextAnchor.MiddleLeft; Widgets.Label(memr, totalBytesStr); } } Text.Anchor = TextAnchor.MiddleCenter; Widgets.Label(settings, hoverValStr); Text.Anchor = TextAnchor.UpperLeft; maxBytes = 0; minBytes = 0; var LastMax = max; max = 0; GUI.BeginGroup(position); position = position.AtZero(); for (var i = 0; i < mescou; i++) { var bytes = prof.History.mem[i]; var TM = prof.History.times[i]; if (i == 0) { minBytes = bytes; maxBytes = bytes; max = TM; } if (bytes < minBytes) { minBytes = bytes; } if (bytes > maxBytes) { maxBytes = bytes; } if (TM > max) { max = TM; } } if (max > WindowMax) { WindowMax = (float)max; } var DoHover = false; for (var i = 0; i < mescou; i++) { var bytes = prof.History.mem[i]; var TM = prof.History.times[i]; var y = GenMath.LerpDoubleClamped(0, WindowMax, position.height, position.y, (float)TM); var MEMy = GenMath.LerpDoubleClamped(minBytes, maxBytes, position.height, position.y, bytes); var screenPoint = new Vector2(position.xMax - gap * i, y); var MEMscreenPoint = new Vector2(position.xMax - gap * i, MEMy); if (i != 0) { Widgets.DrawLine(last, screenPoint, Analyzer.Settings.LineCol, 1f); if (ShowMem) { Widgets.DrawLine(lastMEM, MEMscreenPoint, Color.grey, 2f); } var vag = new Rect(screenPoint.x - gap / 2f, position.y, gap, position.height); //if (Widgets.ButtonInvisible(vag)) //{ // Log.Warning(prof.History.stack[i]); // Find.WindowStack.Windows.Add(new StackWindow { stkRef = prof.History.stack[i] }); //} if (Mouse.IsOver(vag)) { DoHover = true; if (i != hoverVal) { hoverVal = i; hoverValStr = $"{TM} {prof.History.hits[i]} calls"; } SimpleCurveDrawer.DrawPoint(screenPoint); } } last = screenPoint; lastMEM = MEMscreenPoint; } if (LastMax != max) { MaxStr = $"Max {max}ms"; } if (LASTtotalBytesStr < prof.BytesUsed) { LASTtotalBytesStr = prof.BytesUsed; totalBytesStr = $"Mem {(long)(prof.BytesUsed / (long)1024)} Kb"; } var LogMaxY = GenMath.LerpDoubleClamped(0, WindowMax, position.height, position.y, (float)max); var crunt = position; crunt.y = LogMaxY; Widgets.Label(crunt, MaxStr); Widgets.DrawLine(new Vector2(position.x, LogMaxY), new Vector2(position.xMax, LogMaxY), Color.red, 1f); last = Vector2.zero; GUI.EndGroup(); }
public void Notify_ColonistViolentlyDownedOrKilled(Pawn p) { if (!p.RaceProps.Humanlike) { return; } float num = this.shortTermFactor - 1f; float num2 = this.longTermFactor - 1f; int num3 = PawnsFinder.AllMapsCaravansAndTravelingTransportPods_FreeColonists.Count <Pawn>(); switch (num3) { case 0: num *= 0f; num2 *= 0f; break; case 1: num *= 0f; num2 *= 0f; break; case 2: num *= 0f; num2 *= 0f; break; case 3: num *= 0f; num2 *= 0.2f; break; case 4: num *= 0.15f; num2 *= 0.4f; break; case 5: num *= 0.25f; num2 *= 0.6f; break; case 6: num *= 0.3f; num2 *= 0.7f; break; case 7: num *= 0.35f; num2 *= 0.75f; break; case 8: num *= 0.4f; num2 *= 0.8f; break; case 9: num *= 0.45f; num2 *= 0.85f; break; case 10: num *= 0.5f; num2 *= 0.9f; break; case 11: num *= 0.55f; num2 *= 0.91f; break; case 12: num *= 0.6f; num2 *= 0.92f; break; case 13: num *= 0.65f; num2 *= 0.93f; break; case 14: num *= 0.7f; num2 *= 0.94f; break; case 15: num *= 0.75f; num2 *= 0.95f; break; default: num *= GenMath.LerpDoubleClamped(16f, 30f, 0.8f, 1f, (float)num3); num2 *= GenMath.LerpDoubleClamped(16f, 30f, 0.95f, 1f, (float)num3); break; } this.shortTermFactor = 1f + num; this.longTermFactor = 1f + num2; }