Пример #1
0
        public bool ShouldTryToTakeScheduledNow(ThingDef ingestible)
        {
            if (!ingestible.IsDrug)
            {
                return(false);
            }
            if (!AllowedToTakeScheduledNow(ingestible))
            {
                return(false);
            }
            Hediff firstHediffOfDef = pawn.health.hediffSet.GetFirstHediffOfDef(HediffDefOf.DrugOverdose);

            if (firstHediffOfDef != null && firstHediffOfDef.Severity > 0.5f && CanCauseOverdose(ingestible))
            {
                int num = LastTicksWhenTakenDrugWhichCanCauseOverdose();
                if (Find.TickManager.TicksGame - num < 1250)
                {
                    return(false);
                }
            }
            DrugTakeRecord drugTakeRecord = drugTakeRecords.Find((DrugTakeRecord x) => x.drug == ingestible);

            if (drugTakeRecord == null)
            {
                return(true);
            }
            DrugPolicyEntry drugPolicyEntry = CurrentPolicy[ingestible];

            if (drugPolicyEntry.daysFrequency < 1f)
            {
                int   num2 = Mathf.RoundToInt(1f / drugPolicyEntry.daysFrequency);
                float num3 = 1f / (float)(num2 + 1);
                int   num4 = 0;
                float dayPercentNotSleeping = DayPercentNotSleeping;
                for (int i = 0; i < num2; i++)
                {
                    if (dayPercentNotSleeping > (float)(i + 1) * num3 - num3 * 0.5f)
                    {
                        num4++;
                    }
                }
                if (drugTakeRecord.TimesTakenThisDay >= num4)
                {
                    return(false);
                }
                if (drugTakeRecord.TimesTakenThisDay != 0 && (float)(Find.TickManager.TicksGame - drugTakeRecord.lastTakenTicks) / (HoursPerDayNotSleeping * 2500f) < 0.6f * num3)
                {
                    return(false);
                }
                return(true);
            }
            float dayPercentNotSleeping2 = DayPercentNotSleeping;

            Rand.PushState();
            Rand.Seed = Gen.HashCombineInt(GenDate.DaysPassed, pawn.thingIDNumber);
            bool result = dayPercentNotSleeping2 >= Rand.Range(0.1f, 0.35f);

            Rand.PopState();
            return(result);
        }
        public bool AllowedToTakeScheduledNow(ThingDef thingDef)
        {
            bool result;

            if (!thingDef.IsIngestible)
            {
                Log.Error(thingDef + " is not ingestible.", false);
                result = false;
            }
            else if (!thingDef.IsDrug)
            {
                Log.Error("AllowedToTakeScheduledEver on non-drug " + thingDef, false);
                result = false;
            }
            else if (!this.AllowedToTakeScheduledEver(thingDef))
            {
                result = false;
            }
            else
            {
                DrugPolicyEntry drugPolicyEntry = this.CurrentPolicy[thingDef];
                if (drugPolicyEntry.onlyIfMoodBelow < 1f && this.pawn.needs.mood != null && this.pawn.needs.mood.CurLevelPercentage >= drugPolicyEntry.onlyIfMoodBelow)
                {
                    result = false;
                }
                else if (drugPolicyEntry.onlyIfJoyBelow < 1f && this.pawn.needs.joy != null && this.pawn.needs.joy.CurLevelPercentage >= drugPolicyEntry.onlyIfJoyBelow)
                {
                    result = false;
                }
                else
                {
                    DrugTakeRecord drugTakeRecord = this.drugTakeRecords.Find((DrugTakeRecord x) => x.drug == thingDef);
                    if (drugTakeRecord != null)
                    {
                        if (drugPolicyEntry.daysFrequency < 1f)
                        {
                            int num = Mathf.RoundToInt(1f / drugPolicyEntry.daysFrequency);
                            if (drugTakeRecord.TimesTakenThisDay >= num)
                            {
                                return(false);
                            }
                        }
                        else
                        {
                            int num2 = Mathf.Abs(GenDate.DaysPassed - drugTakeRecord.LastTakenDays);
                            int num3 = Mathf.RoundToInt(drugPolicyEntry.daysFrequency);
                            if (num2 < num3)
                            {
                                return(false);
                            }
                        }
                    }
                    result = true;
                }
            }
            return(result);
        }
Пример #3
0
        public void Notify_DrugIngested(Thing drug)
        {
            DrugTakeRecord drugTakeRecord = drugTakeRecords.Find((DrugTakeRecord x) => x.drug == drug.def);

            if (drugTakeRecord == null)
            {
                drugTakeRecord      = new DrugTakeRecord();
                drugTakeRecord.drug = drug.def;
                drugTakeRecords.Add(drugTakeRecord);
            }
            drugTakeRecord.lastTakenTicks = Find.TickManager.TicksGame;
            drugTakeRecord.TimesTakenThisDay++;
        }
 internal bool <> m__0(DrugTakeRecord x)
 {
     return(x.drug == this.drug);
 }