Beispiel #1
0
        public static void MultipliedAgeTick(ref int interval, Pawn_AgeTracker __instance)
        {
            //Find the pawn this tracker belongs to
            Pawn      pawn          = null;
            FieldInfo pawnFieldInfo = AccessTools.Field(__instance.GetType(), "pawn");

            if (pawnFieldInfo != null && pawnFieldInfo.FieldType.Equals(typeof(Verse.Pawn)))
            {
                pawn = (Verse.Pawn)pawnFieldInfo.GetValue(__instance);
            }

            if (pawn != null)
            {
                //Determine multiplier
                int multiplier = FasterAging.GetPawnAgingMultiplier(pawn);


                //Experimental Chronological age modification
                //I judge this too likely to cause issues and too practically insignificant to include as a default feature.
                if (FasterAging.modifyChronologicalAge)
                {
                    __instance.BirthAbsTicks -= (multiplier - 1) * interval; //Similar system to how the AgeTick patch works, just on the scale of the base interval rather than single ticks. Moves the pawn's birthday to correctly account for modified age rate.
                }


                //Edit the referenced interval value to take the multiplier into account.
                //The game will now run AgeTickMothballed() with this edited interval, accelerating or halting aging.
                interval = multiplier * interval;
            }
        }
Beispiel #2
0
        private static int sum_previous_gains(SkillDef def, Pawn_StoryTracker sto, Pawn_AgeTracker age)
        {
            int total_gain = 0;
            int gain;

            // Gains from backstories
            if (sto.childhood.skillGainsResolved.TryGetValue(def, out gain))
            {
                total_gain += gain;
            }
            if (sto.adulthood.skillGainsResolved.TryGetValue(def, out gain))
            {
                total_gain += gain;
            }

            // Gains from traits
            foreach (var trait in sto.traits.allTraits)
            {
                if (trait.CurrentData.skillGains.TryGetValue(def, out gain))
                {
                    total_gain += gain;
                }
            }

            // Gains from age
            //Rand.PopState();
            //Rand.PushState(RJW_Multiplayer.PredictableSeed());
            var rgain      = Rand.Value * (float)total_gain * 0.35f;
            var age_factor = Mathf.Clamp01((age.AgeBiologicalYearsFloat - 17.0f) / 10.0f);             // Assume nymphs are 17~27

            total_gain += (int)(age_factor * rgain);

            return(Mathf.Clamp(total_gain, 0, 20));
        }
Beispiel #3
0
 public static void DailyRecalc(Pawn_AgeTracker __instance)
 {
     if (Find.TickManager.TicksGame % 60000 == 0)
     {
         //Log.Message("I have performed a daily check");
         MethodInfo info = AccessTools.Method(__instance.GetType(), "RecalculateLifeStageIndex", null, null);
         info.Invoke(__instance, null);
     }
 }
        public void Update()
        {
            Hediff tolerance = base.Pawn.health.hediffSet.GetFirstHediffOfDef(Props.toleranceDef);

            ToleranceFactor      = Mathf.Clamp(Props.toleranceEffectCurve.Evaluate(tolerance?.Severity ?? 0f), Props.minToleranceFactor, Props.maxToleranceFactor);
            AgeChangePerInterval = Props.severityEffectCurve.Evaluate(base.parent.Severity) * ToleranceFactor;
            Pawn_AgeTracker at = base.Pawn.ageTracker;

            TargetAge = AgeFloor + ((at.AgeChronologicalYearsFloat - at.AgeBiologicalYearsFloat) % (AgeCeiling - AgeFloor));
        }
Beispiel #5
0
            public static void PostFix(Pawn_AgeTracker __instance)
            {
                long birthAbsTicksInt      = (long)BIRTH_ABS_TICKS_INT_FIELD.GetValue(__instance);
                long ageBiologicalTicksInt = (long)AGE_BIOLOGICAL_TICKS_INT_FIELD.GetValue(__instance);

                if (birthAbsTicksInt < 0 && (Scribe.mode == LoadSaveMode.Saving || Scribe.mode == LoadSaveMode.PostLoadInit))
                {
                    AGE_BIOLOGICAL_TICKS_INT_FIELD.SetValue(__instance, ageBiologicalTicksInt + Find.TickManager.gameStartAbsTick);
                }
            }
Beispiel #6
0
        // -------------------------------------------------------------------------
        // 不老制御
        static bool prefix_AgeTick_EternalYouthTraits(Pawn_AgeTracker __instance)
        {
            Pawn pawn = Traverse.Create(__instance).Field("pawn").GetValue <Pawn>();

            if (core.has_eternalYouth(pawn) || core.has_eternalImmortary(pawn))
            {
                return(false);                //return false to skip execution of the original.
            }
            return(true);
        }
Beispiel #7
0
 static void Postfix(Pawn_AgeTracker __instance, int __state)
 {
     if (Multiplayer.Client == null)
     {
         return;
     }
     if (__state == __instance.AgeBiologicalYears)
     {
         return;
     }
 }
        public static void Patch(Pawn_AgeTracker __instance, Pawn ___pawn)
        {
            bool flag = !Settings.SeparateGender || ___pawn.gender == Gender.Male;

            if (flag)
            {
                Patch_Pawn_AgeTracker_BirthdayBiological_Internal.Patch(__instance, Settings.Male_HasMaxAge, Settings.Male_MaxAge, Settings.Male_MaxAgeChrono);
            }
            else
            {
                Patch_Pawn_AgeTracker_BirthdayBiological_Internal.Patch(__instance, Settings.Female_HasMaxAge, Settings.Female_MaxAge, Settings.Female_MaxAgeChrono);
            }
        }
Beispiel #9
0
        static void Postfix(Pawn_AgeTracker __instance)
        {
            if (Multiplayer.Client == null)
            {
                return;
            }
            if (!__instance.pawn.Spawned)
            {
                return;
            }

            Multiplayer.WorldComp.DirtyTradeForSpawnedThing(__instance.pawn);
        }
 private static bool Prefix(Pawn_AgeTracker __instance, Pawn ___pawn, long ___ageBiologicalTicksInt)
 {
     if (!___pawn.Dead && ___pawn.isOrk())
     {
         for (int i = 0; i < ___pawn.needs.AllNeeds.Count; i++)
         {
             if (___pawn.needs.AllNeeds[i] is Need_Orkoid_Fightyness need_Violence)
             {
                 //	need_Violence.fought = true;
             }
         }
     }
     return(true);
 }
Beispiel #11
0
 static void RecalculateLifeStageIndex(Pawn_AgeTracker __instance)
 {
     if (SkipNextPawnKindDef != null)
     {
         Pawn pawn = (Pawn)Pawn.GetValue(__instance);
         if (SkipNextPawnKindDef == pawn.kindDef)
         {
             if (PreventGraphicUpdate(__instance, pawn))
             {
                 SkipNextPawnKindDef = null;
             }
         }
     }
 }
        // Verse.Pawn_AgeTracker
        public static bool VampireBirthdayBiological(Pawn_AgeTracker __instance)
        {
            Pawn p = Traverse.Create(__instance).Field("pawn").GetValue <Pawn>();

            if (p.RaceProps.Humanlike && (p.IsVampire() || p.IsGhoul()) && PawnUtility.ShouldSendNotificationAbout(p))
            {
                Find.LetterStack.ReceiveLetter("LetterLabelBirthday".Translate(), "ROMV_VampireBirthday".Translate(
                                                   new object[]
                {
                    p.Label,
                    p.ageTracker.AgeBiologicalYears
                }), LetterDefOf.PositiveEvent, p);
                return(false);
            }

            return(true);
        }
        public static void Patch(Pawn_AgeTracker __instance, Pawn ___pawn)
        {
            int  num  = (!Settings.SeparateGender || ___pawn.gender == Gender.Male) ? Settings.Male_AgeTick : Settings.Female_AgeTick;
            bool flag = num == 0;

            if (flag)
            {
                long ageBiologicalTicks = __instance.AgeBiologicalTicks;
                __instance.AgeBiologicalTicks = ageBiologicalTicks - 1L;
            }
            else
            {
                bool flag2 = num > 1;
                if (flag2)
                {
                    __instance.AgeTickMothballed(num - 1);
                }
            }
        }
 public override void CompPostTick(ref float severityAdjustment)
 {
     if (IsCheapIntervalTick(Props.tickInterval))
     {
         Pawn_AgeTracker at = base.Pawn.ageTracker;
         if (at.AgeBiologicalYearsFloat > TargetAge)
         {
             at.AgeBiologicalTicks -= (long)(AgeChangePerInterval * AgeScale);
             // TODO: if Facial Stuff, regenerate hair for younger age
         }
         else
         {
             RemoveRandOldAgeHediff();
             // TODO: if not Facial Stuff, assign random non-gray hair color
             // PawnHairColors.RandomHairColor(pawn.story.SkinColor, pawn.ageTracker.AgeBiologicalYears);
         }
         Update();
     }
 }
Beispiel #15
0
        public static void Notify_EquipmentAddedPostfix(Pawn_AgeTracker __instance)
        {
            Traverse traverse = Traverse.Create(__instance);
            Pawn     pawn     = (Pawn)AM_Pawn_AgeTracker_AgeTick_ActivatableEffect_Patch.pawn.GetValue(__instance);

            if (pawn != null)
            {
                if (pawn.story != null)
                {
                    if (pawn.story.adulthood == null)
                    {
                        if (pawn.isAdult())
                        {
                            List <BackstoryCategoryFilter> backstoryCategoryFiltersFor = AM_PawnBioAndNameGenerator_GiveShuffledBioTo_AdultAge_Patch.GetBackstoryCategoryFiltersFor(pawn, pawn.Faction.def);
                            AM_PawnBioAndNameGenerator_GiveShuffledBioTo_AdultAge_Patch.FillBackstorySlotShuffled(pawn, BackstorySlot.Adulthood, ref pawn.story.adulthood, pawn.story.childhood, backstoryCategoryFiltersFor, pawn.Faction.def);
                        }
                    }
                }
            }
        }
Beispiel #16
0
        // Token: 0x06000004 RID: 4 RVA: 0x000021CC File Offset: 0x000003CC
        public static void Patch(Pawn_AgeTracker __instance, bool HasMaxAge, int MaxAge, bool MaxAgeChrono)
        {
            bool flag = !HasMaxAge;

            if (!flag)
            {
                long ageBiologicalTicks = __instance.AgeBiologicalTicks;
                long num   = ageBiologicalTicks / 3600000L;
                bool flag2 = num > (long)MaxAge;
                if (flag2)
                {
                    num = (num - (long)MaxAge) * 3600000L;
                    __instance.AgeBiologicalTicks -= num;
                    if (MaxAgeChrono)
                    {
                        __instance.AgeChronologicalTicks += num;
                    }
                }
            }
        }
Beispiel #17
0
        static bool PreventGraphicUpdate(Pawn_AgeTracker _this, Pawn pawn)
        {
            int num = -1;
            List <LifeStageAge> lifeStageAges = pawn.RaceProps.lifeStageAges;

            for (int i = lifeStageAges.Count - 1; i >= 0; i--)
            {
                if (lifeStageAges[i].minAge <= _this.AgeBiologicalYearsFloat + 1E-06f)
                {
                    num = i;
                    break;
                }
            }
            if (num == -1)
            {
                num = 0;
            }

            CachedLifeStageIndex.SetValue(_this, num);
            return(num > 0);
        }
 public static void Post_RecalculateLifeStageIndex(Pawn_AgeTracker __instance)
 {
     if (__instance != null)
     {
         Traverse traverse = Traverse.Create(__instance);
         Pawn     pawn     = (Pawn)AvP_Pawn_AgeTracker_RecalculateLifeStageIndex_Xenomorph_Patch.pawn.GetValue(__instance);
         if (pawn != null && !pawn.Dead)
         {
             if (pawn.isXenomorph(out Comp_Xenomorph xenomorph))
             {
                 if (__instance.CurLifeStage == XenomorphDefOf.RRY_XenomorphFullyFormed)
                 {
                     if (pawn.GetLord() == null)
                     {
                         xenomorph.delay = 30;
                     }
                 }
             }
         }
     }
 }
Beispiel #19
0
 static void Prefix(Pawn_AgeTracker __instance, ref int __state)
 {
     __state = __instance.AgeBiologicalYears;
 }
Beispiel #20
0
            public static void Fix(Pawn_AgeTracker __instance, ref int __result)
            {
                long birthAbsTicksInt = (long)BIRTH_ABS_TICKS_INT_FIELD.GetValue(__instance);

                __result = GenDate.DayOfQuadrum(birthAbsTicksInt, 0f);
            }