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);
        }
Пример #2
0
		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);
        }
Пример #5
0
        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);
        }
Пример #6
0
        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);
        }
Пример #9
0
        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);
            }
        }
Пример #11
0
        public static float GetManhunterOnDamageChance(Pawn pawn, float distance)
        {
            float manhunterOnDamageChance = PawnUtility.GetManhunterOnDamageChance(pawn.kindDef);

            return(manhunterOnDamageChance * GenMath.LerpDoubleClamped(1f, 30f, 3f, 1f, distance));
        }
Пример #12
0
        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();
        }
Пример #13
0
        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;
        }