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); }
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); }