Example #1
0
        public override bool StateCanOccur(Pawn pawn)
        {
            if (!base.StateCanOccur(pawn))
            {
                return(false);
            }
            if (!pawn.Spawned)
            {
                return(false);
            }
            List <ChemicalDef> allDefsListForReading = DefDatabase <ChemicalDef> .AllDefsListForReading;

            for (int i = 0; i < allDefsListForReading.Count; i++)
            {
                if (AddictionUtility.CanBingeOnNow(pawn, allDefsListForReading[i], def.drugCategory))
                {
                    return(true);
                }
                if (def.drugCategory == DrugCategory.Hard && AddictionUtility.CanBingeOnNow(pawn, allDefsListForReading[i], DrugCategory.Social))
                {
                    return(true);
                }
            }
            return(false);
        }
        /// <summary>Does the ingestion outcome special.</summary>
        /// <param name="pawn">The pawn.</param>
        /// <param name="ingested">The ingested.</param>
        protected override void DoIngestionOutcomeSpecial(Pawn pawn, Thing ingested)
        {
            foreach (HediffDef h in AllCompleteDefs.Concat(AllPartialDefs))
            {
                if (!h.CanInfect(pawn))
                {
                    continue;
                }

                Hediff hediff = HediffMaker.MakeHediff(h, pawn);

                float num;
                if (severity > 0f)
                {
                    num = severity;
                }
                else
                {
                    num = h.initialSeverity;
                }
                if (divideByBodySize)
                {
                    num /= pawn.BodySize;
                }
                AddictionUtility.ModifyChemicalEffectForToleranceAndBodySize(pawn, toleranceChemical, ref num);
                hediff.Severity = num;
                pawn.health.AddHediff(hediff, null, null);
            }
        }
Example #3
0
        protected override void DoIngestionOutcomeSpecial(Pawn pawn, Thing ingested)
        {
            Hediff hediffAdd = HediffMaker.MakeHediff(hediffDefAdd, pawn, null);
            float  num;

            if (severity > 0f)
            {
                num = severity;
            }
            else
            {
                num = hediffDefAdd.initialSeverity;
            }
            if (divideByBodySize)
            {
                num /= pawn.BodySize;
            }
            AddictionUtility.ModifyChemicalEffectForToleranceAndBodySize(pawn, toleranceChemical, ref num);
            hediffAdd.Severity = num;
            pawn.health.AddHediff(hediffAdd, null, null, null);

            Hediff hediffRemove = pawn.health.hediffSet.hediffs.Find((Hediff h) => h.def == hediffDefRemove);

            if (hediffRemove != null)
            {
                pawn.health.RemoveHediff(hediffRemove);
            }
        }
        // Token: 0x06000031 RID: 49 RVA: 0x00002E20 File Offset: 0x00001020
        protected override void DoIngestionOutcomeSpecial(Pawn pawn, Thing ingested)
        {
            bool flag = AddictionUtility.AddictedToAnything(pawn);

            if (flag)
            {
                foreach (ChemicalDef chemical in DefDatabase <ChemicalDef> .AllDefs)
                {
                    bool flag2 = AddictionUtility.IsAddicted(pawn, chemical);
                    if (flag2)
                    {
                        Hediff hediff  = AddictionUtility.FindAddictionHediff(pawn, chemical);
                        Hediff hediff2 = AddictionUtility.FindToleranceHediff(pawn, chemical);
                        pawn.health.RemoveHediff(hediff);
                        bool flag3 = hediff2 != null;
                        if (flag3)
                        {
                            pawn.health.RemoveHediff(hediff2);
                        }
                    }
                }
                foreach (HediffDef def in this.BeneficialAddictiveDrugHediffs)
                {
                    Hediff firstHediffOfDef = pawn.health.hediffSet.GetFirstHediffOfDef(def, false);
                    bool   flag4            = firstHediffOfDef != null;
                    if (flag4)
                    {
                        pawn.health.RemoveHediff(firstHediffOfDef);
                    }
                }
            }
        }
Example #5
0
        protected override void DoIngestionOutcomeSpecial(Pawn pawn, Thing ingested)
        {
            List <Hediff> hediffs = pawn.health.hediffSet.hediffs.Where(hd => hd.def == hediffDef).ToList();

            foreach (Hediff hediff in hediffs)
            {
                float newSeverity = hediff.Severity;

                float effect = severity;

                if (divideByBodySize)
                {
                    effect /= pawn.BodySize;
                }

                AddictionUtility.ModifyChemicalEffectForToleranceAndBodySize(pawn, toleranceChemical, ref effect);

                if (isScalar)
                {
                    newSeverity *= effect;
                }
                else
                {
                    newSeverity += effect;
                }

                hediff.Severity = newSeverity;
            }
        }
        protected override void DoIngestionOutcomeSpecial(Pawn pawn, Thing ingested)
        {
            if (ingested != null && ingested is BloodBagThingWithComps bag)
            {
                if (!pawn.GetBloodType()?.BloodType.CanGetBlood(bag?.BloodType) ?? false)
                {
                    //TODO blood incompatibility, MVP FoodPoison
                    var d = pawn?.health?.AddHediff(RimWorld.HediffDefOf.FoodPoisoning);
                    if (d != null)
                    {
                        d.Severity = Rand.Value / 3f;
                    }
                }
            }

            Hediff hediff = HediffMaker.MakeHediff(this.hediffDef, pawn, (BodyPartRecord)null);
            float  effect = (double)this.severity <= 0.0 ? this.hediffDef.initialSeverity : this.severity;

            if (this.divideByBodySize)
            {
                effect /= pawn.BodySize;
            }
            AddictionUtility.ModifyChemicalEffectForToleranceAndBodySize(pawn, this.toleranceChemical, ref effect);
            hediff.Severity = effect;
            pawn.health.AddHediff(hediff, (BodyPartRecord)null, new DamageInfo?(), (DamageWorker.DamageResult)null);
        }
Example #7
0
        protected override void DoIngestionOutcomeSpecial(Pawn pawn, Thing ingested)
        {
            if (raceDependencies != null)
            {
                for (int i = 0; i < raceDependencies.Count; i++)
                {
                    raceDependencies raceDependency = raceDependencies[i];
                    if (pawn.def == raceDependency.race)
                    {
                        Hediff hediffRace = HediffMaker.MakeHediff(raceDependency.hediffDef, pawn, null);
                        float  numRace;
                        if (raceDependency.severity > 0f)
                        {
                            numRace = raceDependency.severity;
                        }
                        else
                        {
                            numRace = raceDependency.hediffDef.initialSeverity;
                        }

                        if (raceDependency.divideByBodySize)
                        {
                            numRace /= pawn.BodySize;
                        }
                        AddictionUtility.ModifyChemicalEffectForToleranceAndBodySize(pawn, raceDependency.toleranceChemical, ref numRace);
                        hediffRace.Severity = numRace;
                        pawn.health.AddHediff(hediffRace, null, null);

                        return;
                    }
                }
            }

            Hediff hediff = HediffMaker.MakeHediff(hediffDef, pawn, null);
            float  num;

            if (severity > 0f)
            {
                num = severity;
            }
            else
            {
                num = hediffDef.initialSeverity;
            }

            if (divideByBodySize)
            {
                num /= pawn.BodySize;
            }
            AddictionUtility.ModifyChemicalEffectForToleranceAndBodySize(pawn, toleranceChemical, ref num);
            hediff.Severity = num;
            pawn.health.AddHediff(hediff, null, null);
        }
        protected override void DoIngestionOutcomeSpecial(Pawn pawn, Thing ingested)
        {
            Hediff hediff = HediffMaker.MakeHediff(hediffDef, pawn);
            float  effect = ((!(severity > 0f)) ? hediffDef.initialSeverity : severity) * ingested.stackCount;

            if (divideByBodySize)
            {
                effect /= pawn.BodySize;
            }
            AddictionUtility.ModifyChemicalEffectForToleranceAndBodySize(pawn, toleranceChemical, ref effect);
            hediff.Severity = effect;
            pawn.health.AddHediff(hediff);
        }
Example #9
0
 private bool CanFindLuciferiumAddict(Map map, out Pawn pawn)
 {
     pawn = null;
     foreach (Pawn pawn2 in map.mapPawns.FreeColonists)
     {
         if (AddictionUtility.IsAddicted(pawn2, ThingDefOfReconAndDiscovery.Luciferium))
         {
             pawn = pawn2;
             return(true);
         }
     }
     return(false);
 }
    protected override void DoWeatherOutcomeSpecial(Pawn pawn, GameCondition gameCondition)
    {
        var hediff = HediffMaker.MakeHediff(hediffDef, pawn);
        var num    = severity > 0f ? severity : hediffDef.initialSeverity;

        if (divideByBodySize)
        {
            num /= pawn.BodySize;
        }

        AddictionUtility.ModifyChemicalEffectForToleranceAndBodySize(pawn, toleranceChemical, ref num);
        hediff.Severity = num;
        pawn.health.AddHediff(hediff);
    }
Example #11
0
        private int BingeableAddictionsCount(Pawn pawn)
        {
            int           num     = 0;
            List <Hediff> hediffs = pawn.health.hediffSet.hediffs;

            for (int i = 0; i < hediffs.Count; i++)
            {
                Hediff_Addiction hediff_Addiction = hediffs[i] as Hediff_Addiction;
                if (hediff_Addiction != null && AddictionUtility.CanBingeOnNow(pawn, hediff_Addiction.Chemical, DrugCategory.Any))
                {
                    num++;
                }
            }
            return(num);
        }
Example #12
0
        private void ChooseRandomChemical()
        {
            addictions.Clear();
            List <Hediff> hediffs = pawn.health.hediffSet.hediffs;

            for (int i = 0; i < hediffs.Count; i++)
            {
                Hediff_Addiction hediff_Addiction = hediffs[i] as Hediff_Addiction;
                if (hediff_Addiction != null && AddictionUtility.CanBingeOnNow(pawn, hediff_Addiction.Chemical, DrugCategory.Any))
                {
                    addictions.Add(hediff_Addiction.Chemical);
                }
            }
            if (addictions.Count > 0)
            {
                chemical     = addictions.RandomElement();
                drugCategory = DrugCategory.Any;
                addictions.Clear();
            }
            else
            {
                chemical = (from x in DefDatabase <ChemicalDef> .AllDefsListForReading
                            where AddictionUtility.CanBingeOnNow(pawn, x, def.drugCategory)
                            select x).RandomElementWithFallback();
                if (chemical != null)
                {
                    drugCategory = def.drugCategory;
                }
                else
                {
                    chemical = (from x in DefDatabase <ChemicalDef> .AllDefsListForReading
                                where AddictionUtility.CanBingeOnNow(pawn, x, DrugCategory.Any)
                                select x).RandomElementWithFallback();
                    if (chemical != null)
                    {
                        drugCategory = DrugCategory.Any;
                    }
                    else
                    {
                        chemical = DefDatabase <ChemicalDef> .AllDefsListForReading.RandomElement();

                        drugCategory = DrugCategory.Any;
                    }
                }
            }
        }
        private void ChooseRandomChemical()
        {
            MentalState_BingingDrug.addictions.Clear();
            List <Hediff> hediffs = this.pawn.health.hediffSet.hediffs;

            for (int i = 0; i < hediffs.Count; i++)
            {
                Hediff_Addiction hediff_Addiction = hediffs[i] as Hediff_Addiction;
                if (hediff_Addiction != null && AddictionUtility.CanBingeOnNow(this.pawn, hediff_Addiction.Chemical, DrugCategory.Any))
                {
                    MentalState_BingingDrug.addictions.Add(hediff_Addiction.Chemical);
                }
            }
            if (MentalState_BingingDrug.addictions.Count > 0)
            {
                this.chemical     = MentalState_BingingDrug.addictions.RandomElement <ChemicalDef>();
                this.drugCategory = DrugCategory.Any;
                MentalState_BingingDrug.addictions.Clear();
            }
            else
            {
                this.chemical = (from x in DefDatabase <ChemicalDef> .AllDefsListForReading
                                 where AddictionUtility.CanBingeOnNow(this.pawn, x, this.def.drugCategory)
                                 select x).RandomElementWithFallback(null);
                if (this.chemical != null)
                {
                    this.drugCategory = this.def.drugCategory;
                }
                else
                {
                    this.chemical = (from x in DefDatabase <ChemicalDef> .AllDefsListForReading
                                     where AddictionUtility.CanBingeOnNow(this.pawn, x, DrugCategory.Any)
                                     select x).RandomElementWithFallback(null);
                    if (this.chemical != null)
                    {
                        this.drugCategory = DrugCategory.Any;
                    }
                    else
                    {
                        this.chemical = DefDatabase <ChemicalDef> .AllDefsListForReading.RandomElement <ChemicalDef>();

                        this.drugCategory = DrugCategory.Any;
                    }
                }
            }
        }
        protected override void DoIngestionOutcomeSpecial(Pawn pawn, Thing ingested)
        {
            if (Rand.Chance(diseaseChance))
            {
                Hediff disease = HediffMaker.MakeHediff(HediffDefOf.Flu, pawn);
                disease.Severity = 0.1f;
                pawn.health.AddHediff(disease);
            }
            Hediff hediff = HediffMaker.MakeHediff(hediffDef, pawn);
            float  effect = (!(severity > 0f)) ? hediffDef.initialSeverity : severity;

            if (divideByBodySize)
            {
                effect /= pawn.BodySize;
            }
            AddictionUtility.ModifyChemicalEffectForToleranceAndBodySize(pawn, toleranceChemical, ref effect);
            hediff.Severity = effect;
            pawn.health.AddHediff(hediff);
        }
Example #15
0
        private void ChooseRandomChemical()
        {
            addictions.Clear();
            List <Hediff> hediffs = pawn.health.hediffSet.hediffs;

            for (var i = 0; i < hediffs.Count; i++)
            {
                var hediff_Addiction = hediffs[i] as Hediff_Addiction;
                if (hediff_Addiction != null && AddictionUtility.CanBingeOnNow(pawn, hediff_Addiction.Chemical, DrugCategory.Any))
                {
                    addictions.Add(hediff_Addiction.Chemical);
                }
            }

            if (addictions.Count > 0)
            {
                chemical     = addictions.RandomElement();
                drugCategory = DrugCategory.Any;
                addictions.Clear();
                return;
            }

            chemical = DefDatabase <ChemicalDef> .AllDefsListForReading.Where(IsValidChemical).RandomElementWithFallback();

            if (chemical != null)
            {
                drugCategory = def.drugCategory;
                return;
            }

            chemical = DefDatabase <ChemicalDef> .AllDefsListForReading.Where(IsValidChemical).RandomElementWithFallback();

            if (chemical != null)
            {
                drugCategory = DrugCategory.Any;
                return;
            }

            chemical = DefDatabase <ChemicalDef> .AllDefsListForReading.RandomElement();

            drugCategory = DrugCategory.Any;
        }
        public override void OnIntervalPassed(Pawn pawn, Hediff cause)
        {
            if (pawn.health.hediffSet.hediffs.Any(x => hediffDefs.Any(y => y == x.def)))
            {
                return;
            }

            RandUtilities.PushState();

            if (Rand.RangeInclusive(0, 100) <= completeChance)
            {
                hediffDef = hediffDefsComplete.RandomElement();
            }
            else
            {
                hediffDef = hediffDefs.RandomElement();
            }

            Hediff hediff = HediffMaker.MakeHediff(hediffDef, pawn);
            float  num;

            if (severity > 0f)
            {
                num = severity;
            }
            else
            {
                num = hediffDef.initialSeverity;
            }

            if (divideByBodySize)
            {
                num /= pawn.BodySize;
            }

            AddictionUtility.ModifyChemicalEffectForToleranceAndBodySize(pawn, toleranceChemical, ref num);
            hediff.Severity = num;
            pawn.health.AddHediff(hediff);

            RandUtilities.PopState();
        }
Example #17
0
        /// <summary>Does the ingestion outcome special.</summary>
        /// <param name="pawn">The pawn.</param>
        /// <param name="ingested">The ingested.</param>
        protected override void DoIngestionOutcomeSpecial(Pawn pawn, Thing ingested)
        {
            float completeChance = LoadedModManager.GetMod <PawnmorpherMod>().GetSettings <PawnmorpherSettings>().partialChance;

            _scratchList.Clear();

            if (Rand.RangeInclusive(0, 100) <= completeChance)
            {
                _scratchList.AddRange(AllCompleteDefs.Where(h => h.CanInfect(pawn)));
            }
            else
            {
                _scratchList.AddRange(AllPartialDefs.Where(h => h.CanInfect(pawn)));
            }

            if (_scratchList.Count == 0)
            {
                return;
            }
            hediffDef = _scratchList.RandElement();

            Hediff hediff = HediffMaker.MakeHediff(hediffDef, pawn);
            float  num;

            if (severity > 0f)
            {
                num = severity;
            }
            else
            {
                num = hediffDef.initialSeverity;
            }

            if (divideByBodySize)
            {
                AddictionUtility.ModifyChemicalEffectForToleranceAndBodySize(pawn, toleranceChemical, ref num);
            }

            hediff.Severity = num;
            pawn.health.AddHediff(hediff, null, null);
        }
Example #18
0
        protected override void DoIngestionOutcomeSpecial(Pawn pawn, Thing ingested)
        {
            HiddenAntibiotics = HediffDef.Named("SuperAntiHidden");

            Hediff hediff = HediffMaker.MakeHediff(this.hediffDef, pawn, null);
            float  num    = (!(this.severity > 0f)) ? this.hediffDef.initialSeverity : this.severity;

            if (this.divideByBodySize)
            {
                num /= pawn.BodySize;
            }
            AddictionUtility.ModifyChemicalEffectForToleranceAndBodySize(pawn, this.toleranceChemical, ref num);
            hediff.Severity = num;
            pawn.health.AddHediff(hediff, null, null);

            List <Hediff> Hediffs = pawn.health.hediffSet.GetHediffs <Hediff>().ToList();

            // Temporary variables used to determine if code runs or not
            int    timesUsed = 0;
            Hediff infection = null;

            foreach (Hediff hediffList in Hediffs)
            {
                var StrHediff = hediffList.ToString();
                if (StrHediff.Contains("SuperAntiHidden"))
                {
                    timesUsed += 1;
                    return;
                }
                if (StrHediff.Contains("Infection"))
                {
                    infection = hediffList;
                }
            }

            if (timesUsed != 1 && infection != null)
            {
                pawn.health.AddHediff(HiddenAntibiotics);
                pawn.health.RemoveHediff(infection);
            }
        }
Example #19
0
        /// <summary>Does the ingestion outcome special.</summary>
        /// <param name="pawn">The pawn.</param>
        /// <param name="ingested">The ingested.</param>
        protected override void DoIngestionOutcomeSpecial(Pawn pawn, Thing ingested)
        {
            if (!pawn.health.hediffSet.hediffs.Any(x => hediffDefs.Contains(x.def)))
            {
                _scratchList.Clear();

                if (Rand.RangeInclusive(0, 100) <= completeChance)
                {
                    _scratchList.AddRange(hediffDefsComplete.Where(h => h.CanInfect(pawn)));
                }
                else
                {
                    _scratchList.AddRange(hediffDefs.Where(h => h.CanInfect(pawn)));
                }

                if (_scratchList.Count == 0)
                {
                    return;
                }
                _hediffDef = _scratchList.RandElement();

                Hediff hediff = HediffMaker.MakeHediff(_hediffDef, pawn);
                float  num;
                if (severity > 0f)
                {
                    num = severity;
                }
                else
                {
                    num = _hediffDef.initialSeverity;
                }
                if (divideByBodySize)
                {
                    num /= pawn.BodySize;
                }
                AddictionUtility.ModifyChemicalEffectForToleranceAndBodySize(pawn, toleranceChemical, ref num);
                hediff.Severity = num;
                pawn.health.AddHediff(hediff, null, null);
            }
        }
        // Token: 0x06003563 RID: 13667 RVA: 0x00123774 File Offset: 0x00121974
        protected override void DoIngestionOutcomeSpecial(Pawn pawn, Thing ingested)
        {
            this.hediffDef = this.hediffDefs.RandomElement();
            Hediff hediff = HediffMaker.MakeHediff(this.hediffDef, pawn, null);
            float  num;

            if (this.severity > 0f)
            {
                num = this.severity;
            }
            else
            {
                num = this.hediffDef.initialSeverity;
            }
            if (this.divideByBodySize)
            {
                num /= pawn.BodySize;
            }
            AddictionUtility.ModifyChemicalEffectForToleranceAndBodySize(pawn, this.toleranceChemical, ref num);
            hediff.Severity = num;
            pawn.health.AddHediff(hediff, null, null, null);
        }
        protected override void DoIngestionOutcomeSpecial(Pawn pawn, Thing ingested)
        {
            MilkThistleBenefit = HediffDef.Named("MilkThistleBenefit");

            List <Hediff> Hediffs = pawn.health.hediffSet.GetHediffs <Hediff>().ToList();

            foreach (Hediff hediffList in Hediffs)
            {
                if (hediffList.ToString().Contains("Cirrhosis"))
                {
                    Hediff hediff = HediffMaker.MakeHediff(this.hediffDef, pawn, null);
                    float  num    = (!(this.severity > 0f)) ? this.hediffDef.initialSeverity : this.severity;
                    if (this.divideByBodySize)
                    {
                        num /= pawn.BodySize;
                    }
                    AddictionUtility.ModifyChemicalEffectForToleranceAndBodySize(pawn, this.toleranceChemical, ref num);
                    hediff.Severity = num;
                    pawn.health.AddHediff(hediff, null, null);
                }
            }
        }
 protected virtual void DoIngestionOutcomeSpecial(Pawn pawn, Thing ingested)
 {
     if (!AddictionUtility.AddictedToAnything(pawn))
     {
         return;
     }
     using (IEnumerator <ChemicalDef> enumerator = DefDatabase <ChemicalDef> .get_AllDefs().GetEnumerator())
     {
         while (((IEnumerator)enumerator).MoveNext())
         {
             ChemicalDef current = enumerator.Current;
             if (AddictionUtility.IsAddicted(pawn, current))
             {
                 Hediff addictionHediff = (Hediff)AddictionUtility.FindAddictionHediff(pawn, current);
                 Hediff toleranceHediff = AddictionUtility.FindToleranceHediff(pawn, current);
                 ((Pawn_HealthTracker)pawn.health).RemoveHediff(addictionHediff);
                 if (toleranceHediff != null)
                 {
                     ((Pawn_HealthTracker)pawn.health).RemoveHediff(toleranceHediff);
                 }
             }
         }
     }
     using (IEnumerator <HediffDef> enumerator = this.BeneficialAddictiveDrugHediffs.GetEnumerator())
     {
         while (((IEnumerator)enumerator).MoveNext())
         {
             HediffDef current          = enumerator.Current;
             Hediff    firstHediffOfDef = ((HediffSet)((Pawn_HealthTracker)pawn.health).hediffSet).GetFirstHediffOfDef(current, false);
             if (firstHediffOfDef != null)
             {
                 ((Pawn_HealthTracker)pawn.health).RemoveHediff(firstHediffOfDef);
             }
         }
     }
 }
        private static bool IsValidCandidateToRedress(Pawn pawn, PawnGenerationRequest request)
        {
            if (pawn.def != request.KindDef.race)
            {
                return(false);
            }
            if (!request.WorldPawnFactionDoesntMatter && pawn.Faction != request.Faction)
            {
                return(false);
            }
            if (!request.AllowDead)
            {
                if (pawn.Dead || pawn.Destroyed)
                {
                    return(false);
                }
                if (pawn.health.hediffSet.GetBrain() == null)
                {
                    return(false);
                }
            }
            if (!request.AllowDowned && pawn.Downed)
            {
                return(false);
            }
            if (pawn.health.hediffSet.BleedRateTotal > 0.001f)
            {
                return(false);
            }
            if (!request.CanGeneratePawnRelations && pawn.RaceProps.IsFlesh && pawn.relations.RelatedToAnyoneOrAnyoneRelatedToMe)
            {
                return(false);
            }
            if (!request.AllowGay && pawn.RaceProps.Humanlike && pawn.story.traits.HasTrait(TraitDefOf.Gay))
            {
                return(false);
            }
            if (!request.AllowAddictions && AddictionUtility.AddictedToAnything(pawn))
            {
                return(false);
            }
            if (request.ProhibitedTraits != null && request.ProhibitedTraits.Any((TraitDef t) => pawn.story.traits.HasTrait(t)))
            {
                return(false);
            }
            List <SkillRange> skills = request.KindDef.skills;

            if (skills != null)
            {
                for (int i = 0; i < skills.Count; i++)
                {
                    SkillRecord skill = pawn.skills.GetSkill(skills[i].Skill);
                    if (skill.TotallyDisabled)
                    {
                        return(false);
                    }
                    if (skill.Level < skills[i].Range.min || skill.Level > skills[i].Range.max)
                    {
                        return(false);
                    }
                }
            }
            if (request.ForcedTraits != null)
            {
                foreach (TraitDef forcedTrait in request.ForcedTraits)
                {
                    if (!pawn.story.traits.HasTrait(forcedTrait))
                    {
                        return(false);
                    }
                }
            }
            if (request.ValidatorPreGear != null && !request.ValidatorPreGear(pawn))
            {
                return(false);
            }
            if (request.ValidatorPostGear != null && !request.ValidatorPostGear(pawn))
            {
                return(false);
            }
            if (request.FixedBiologicalAge.HasValue && pawn.ageTracker.AgeBiologicalYearsFloat != request.FixedBiologicalAge)
            {
                return(false);
            }
            if (request.FixedChronologicalAge.HasValue && (float)pawn.ageTracker.AgeChronologicalYears != request.FixedChronologicalAge)
            {
                return(false);
            }
            if (request.FixedGender.HasValue && pawn.gender != request.FixedGender)
            {
                return(false);
            }
            if (request.FixedLastName != null && (!(pawn.Name is NameTriple) || ((NameTriple)pawn.Name).Last != request.FixedLastName))
            {
                return(false);
            }
            if (request.FixedMelanin.HasValue && pawn.story != null && pawn.story.melanin != request.FixedMelanin)
            {
                return(false);
            }
            if (request.FixedTitle != null && (pawn.royalty == null || !pawn.royalty.HasTitle(request.FixedTitle)))
            {
                return(false);
            }
            if (request.KindDef.minTitleRequired != null)
            {
                if (pawn.royalty == null)
                {
                    return(false);
                }
                RoyalTitleDef royalTitleDef = pawn.royalty.MainTitle();
                if (royalTitleDef == null || royalTitleDef.seniority < request.KindDef.minTitleRequired.seniority)
                {
                    return(false);
                }
            }
            if (request.Context == PawnGenerationContext.PlayerStarter && Find.Scenario != null && !Find.Scenario.AllowPlayerStartingPawn(pawn, tryingToRedress: true, request))
            {
                return(false);
            }
            if (request.MustBeCapableOfViolence)
            {
                if (pawn.WorkTagIsDisabled(WorkTags.Violent))
                {
                    return(false);
                }
                if (pawn.RaceProps.ToolUser && !pawn.health.capacities.CapableOf(PawnCapacityDefOf.Manipulation))
                {
                    return(false);
                }
            }
            if (request.RedressValidator != null && !request.RedressValidator(pawn))
            {
                return(false);
            }
            if (request.KindDef.requiredWorkTags != 0 && pawn.kindDef != request.KindDef && (pawn.CombinedDisabledWorkTags & request.KindDef.requiredWorkTags) != 0)
            {
                return(false);
            }
            return(true);
        }
Example #24
0
        public static void GiveVitaeEffects(Pawn receiver, Pawn donor)
        {
            var pawn = receiver;

            //Give Vitae High Effect
            Hediff vitaeHighHediff = HediffMaker.MakeHediff(VampDefOf.ROMV_VitaeHigh, pawn, null);
            float  numHigh         = 0.75f;

            AddictionUtility.ModifyChemicalEffectForToleranceAndBodySize(pawn, VampDefOf.ROMV_VitaeChemical, ref numHigh);
            vitaeHighHediff.Severity = numHigh;
            pawn.health.AddHediff(vitaeHighHediff, null, null);

            //Give Vitae Tolerance Effect
            Hediff vitaeToleranceHediff = HediffMaker.MakeHediff(VampDefOf.ROMV_VitaeTolerance, pawn, null);
            float  numTol = 0.035f;

            numTol /= receiver.BodySize;
            AddictionUtility.ModifyChemicalEffectForToleranceAndBodySize(pawn, VampDefOf.ROMV_VitaeChemical, ref numTol);
            vitaeToleranceHediff.Severity = numTol;
            pawn.health.AddHediff(vitaeToleranceHediff, null, null);

            const float addictiveness                   = 1.0f;
            const float minToleranceToAddict            = 0.01f;
            const float existingAddictionSeverityOffset = 0.2f;

            var needLevelOffset        = 1f;
            var overdoseSeverityOffset = new FloatRange(0.18f, 0.35f);
            var chemical = VampDefOf.ROMV_VitaeChemical;

            var addictionHediffDef = VampDefOf.ROMV_VitaeAddiction;
            var lookTarget         = receiver;
            var hediff             = AddictionUtility.FindToleranceHediff(lookTarget, VampDefOf.ROMV_VitaeChemical);
            var num             = hediff?.Severity ?? 0f;
            var hediffAddiction = AddictionUtility.FindAddictionHediff(lookTarget, VampDefOf.ROMV_VitaeChemical);

            if (hediffAddiction != null)
            {
                hediffAddiction.Severity += existingAddictionSeverityOffset;
            }
            else if (Rand.Value < addictiveness && num >= minToleranceToAddict)
            {
                lookTarget.health.AddHediff(addictionHediffDef, null, null);
                if (PawnUtility.ShouldSendNotificationAbout(lookTarget))
                {
                    Find.LetterStack.ReceiveLetter("LetterLabelNewlyAddicted".Translate(chemical.label).CapitalizeFirst(),
                                                   "LetterNewlyAddicted".Translate(lookTarget.LabelShort, chemical.label, lookTarget.Named("PAWN"))
                                                   .AdjustedFor(lookTarget, "PAWN").CapitalizeFirst(), LetterDefOf.NegativeEvent, lookTarget, null, null);
                }
                AddictionUtility.CheckDrugAddictionTeachOpportunity(lookTarget);
            }

            if (addictionHediffDef.causesNeed != null)
            {
                var need = lookTarget.needs.AllNeeds.Find((Need x) => x.def == addictionHediffDef.causesNeed);
                if (need != null)
                {
                    AddictionUtility.ModifyChemicalEffectForToleranceAndBodySize(lookTarget, chemical,
                                                                                 ref needLevelOffset);
                    need.CurLevel += needLevelOffset;
                }
            }
//            var firstHediffOfDef = lookTarget.health.hediffSet.GetFirstHediffOfDef(HediffDefOf.DrugOverdose, false);
//            var num2 = firstHediffOfDef?.Severity ?? 0f;
//            if (num2 < 0.9f && Rand.Value < largeOverdoseChance)
//            {
//                var num3 = Rand.Range(0.85f, 0.99f);
//                HealthUtility.AdjustSeverity(lookTarget, HediffDefOf.DrugOverdose, num3 - num2);
//                if (lookTarget.Faction == Faction.OfPlayer)
//                {
//                    Messages.Message("MessageAccidentalOverdose".Translate(new object[]
//                    {
//                        lookTarget.LabelIndefinite(),
//                        chemical.LabelCap
//                    }).CapitalizeFirst(), MessageTypeDefOf.NegativeHealthEvent);
//                }
//            }
//            else
//            {
//                var num4 = overdoseSeverityOffset.RandomInRange / lookTarget.BodySize;
//                if (num4 > 0f)
//                {
//                    HealthUtility.AdjustSeverity(lookTarget, HediffDefOf.DrugOverdose, num4);
//                }
//            }
        }
Example #25
0
        // Token: 0x06000016 RID: 22 RVA: 0x0000259C File Offset: 0x0000079C
        public static void DoSSVape(Pawn p, Thing t)
        {
            var HediffName = "";
            var defName    = t.def.defName;

            switch (defName)
            {
            case "SSVaperRegular":
                HediffName = "SSVape_Regular_High";
                break;

            case "SSVaperFruity":
                HediffName = "SSVape_Fruity_High";
                break;

            case "SSVaperMenthol":
                HediffName = "SSVape_Menthol_High";
                break;
            }

            if (!HediffName.StartsWith("SSVape"))
            {
                return;
            }

            var hediffdef = DefDatabase <HediffDef> .GetNamed(HediffName, false);

            var SLChemDef = DefDatabase <ChemicalDef> .GetNamed("Smokeleaf");

            if (hediffdef == null)
            {
                return;
            }

            var SeverityToApply = 0.5f;

            if (SSHediffEffecter.HediffEffect(hediffdef, SeverityToApply, p, null, out _))
            {
                var SLTol = DefDatabase <HediffDef> .GetNamed("SmokeleafTolerance");

                if (SLTol != null)
                {
                    var Sev = 0.02f / p.BodySize;
                    SSHediffEffecter.HediffEffect(SLTol, Sev, p, null, out _);
                }

                if (p.RaceProps.IsFlesh)
                {
                    var addictionHediffDef = DefDatabase <HediffDef> .GetNamed("SmokeleafAddiction");

                    var hediff_Addiction = AddictionUtility.FindAddictionHediff(p, SLChemDef);
                    var hediff           = AddictionUtility.FindToleranceHediff(p, SLChemDef);
                    var num = hediff?.Severity ?? 0f;
                    if (hediff_Addiction != null)
                    {
                        hediff_Addiction.Severity += 0.06f;
                    }
                    else if (Rand.Value < 0.01f && num >= 0.15f)
                    {
                        p.health.AddHediff(addictionHediffDef);
                        if (PawnUtility.ShouldSendNotificationAbout(p))
                        {
                            Find.LetterStack.ReceiveLetter(
                                "LetterLabelNewlyAddicted".Translate(SLChemDef.label).CapitalizeFirst(),
                                "LetterNewlyAddicted".Translate(p.LabelShort, SLChemDef.label, p.Named("PAWN"))
                                .AdjustedFor(p).CapitalizeFirst(), LetterDefOf.NegativeEvent, p);
                        }
                    }

                    if (addictionHediffDef.causesNeed != null)
                    {
                        var need = p.needs.AllNeeds.Find(x => x.def == addictionHediffDef.causesNeed);
                        if (need != null)
                        {
                            var effect = 1f;
                            AddictionUtility.ModifyChemicalEffectForToleranceAndBodySize(p, SLChemDef,
                                                                                         ref effect);
                            need.CurLevel += effect;
                        }
                    }
                }
            }

            if (p?.needs != null)
            {
                var need2 = p.needs.TryGetNeed(NeedDefOf.Rest);
                if (need2 != null)
                {
                    var effect2 = -0.1f;
                    AddictionUtility.ModifyChemicalEffectForToleranceAndBodySize(p, SLChemDef, ref effect2);
                    need2.CurLevel += effect2;
                }
            }

            bool joyNeed;

            if (p == null)
            {
                joyNeed = false;
            }
            else
            {
                var needs = p.needs;
                joyNeed = needs?.joy != null;
            }

            if (joyNeed)
            {
                var Chem = DefDatabase <JoyKindDef> .GetNamed("Chemical", false);

                var needs2 = p.needs;
                if (needs2 != null)
                {
                    needs2.joy.GainJoy(0.85f, Chem);
                }
            }

            if (p?.Map != null)
            {
                var BreathOffset = new Vector3(0f, 0f, -0.04f);
                var loc          = p.Drawer.DrawPos + p.Drawer.renderer.BaseHeadOffsetAt(p.Rotation) +
                                   (p.Rotation.FacingCell.ToVector3() * 0.21f) + BreathOffset;
                for (var i = 0; i < 4; i++)
                {
                    ThrowVapeBreathPuff(loc, p.Map, p.Rotation.AsAngle, p.Position.ToVector3());
                    FleckMaker.ThrowSmoke(p.Position.ToVector3(), p.Map, 0.5f);
                }
            }

            var usesLeft = ((SSVapeData)t).SSVapeUses;

            usesLeft--;
            ((SSVapeData)t).SSVapeUses = usesLeft;
            if (usesLeft > 0)
            {
                return;
            }

            t.Destroy();
            if (p == null)
            {
                return;
            }

            GenDrop.TryDropSpawn(
                ThingMaker.MakeThing(DefDatabase <ThingDef> .GetNamed("SSVaperEmpty", false)), p.Position,
                p.Map, ThingPlaceMode.Near, out var newVapeThing);
            ((SSVapeData)newVapeThing).SSVapeType = "empty";
            ((SSVapeData)newVapeThing).SSVapeUses = 0;
        }
Example #26
0
        public static void SetFaction(this Pawn pawn, Faction newFaction, Pawn recruiter = null)
        {
            if (newFaction == pawn.Faction)
            {
                Log.Warning(string.Concat(new object[]
                {
                    "Used ChangePawnFactionTo to change ",
                    pawn,
                    " to same faction ",
                    newFaction
                }));
                return;
            }
            if (pawn.guest != null)
            {
                pawn.guest.SetGuestStatus(null, false);
            }
            if (pawn.Spawned)
            {
                pawn.Map.mapPawns.DeRegisterPawn(pawn);
                pawn.Map.pawnDestinationManager.RemovePawnFromSystem(pawn);
                pawn.Map.designationManager.RemoveAllDesignationsOn(pawn, false);
            }
            if (newFaction == Faction.OfPlayer || pawn.Faction == Faction.OfPlayer)
            {
                Find.ColonistBar.MarkColonistsDirty();
            }
            Lord lord = pawn.GetLord();

            if (lord != null)
            {
                lord.Notify_PawnLost(pawn, PawnLostCondition.ChangedFaction);
            }
            if (pawn.Faction != null && pawn.Faction.leader == pawn)
            {
                pawn.Faction.Notify_LeaderLost();
            }
            if (newFaction == Faction.OfPlayer && pawn.RaceProps.Humanlike)
            {
                pawn.kindDef = newFaction.def.basicMemberKind;
            }

            // Call base SetFaction directly - horrible mojo warning
            MethodInfo method = typeof(Thing).GetMethod("SetFaction", BindingFlags.Public | BindingFlags.Instance);
            IntPtr     fptr   = method.MethodHandle.GetFunctionPointer();

            ((Action <Faction, Pawn>)Activator.CreateInstance(typeof(Action <Faction, Pawn>), pawn, fptr))(newFaction, null);

            PawnComponentsUtility.AddAndRemoveDynamicComponents(pawn, false);
            if (pawn.Faction != null && pawn.Faction.IsPlayer)
            {
                if (pawn.workSettings != null)
                {
                    pawn.workSettings.EnableAndInitialize();
                }
                Find.Storyteller.intenderPopulation.Notify_PopulationGained();
            }
            if (pawn.Drafted)
            {
                pawn.drafter.Drafted = false;
            }
            ReachabilityUtility.ClearCache();
            pawn.health.surgeryBills.Clear();
            if (pawn.Spawned)
            {
                pawn.Map.mapPawns.RegisterPawn(pawn);
            }
            pawn.GenerateNecessaryName();
            if (pawn.playerSettings != null)
            {
                Pawn_PlayerSettings_Detour.ResetPPSMedicalCare(pawn.playerSettings, pawn);
            }
            pawn.ClearMind(true);
            if (!pawn.Dead && pawn.needs.mood != null)
            {
                pawn.needs.mood.thoughts.situational.Notify_SituationalThoughtsDirty();
            }
            if (pawn.Spawned)
            {
                pawn.Map.attackTargetsCache.UpdateTarget(pawn);
            }
            Find.GameEnder.CheckGameOver();
            AddictionUtility.CheckDrugAddictionTeachOpportunity(pawn);
            if (pawn.needs != null)
            {
                pawn.needs.AddOrRemoveNeedsAsAppropriate();
            }
            if (pawn.playerSettings != null)
            {
                pawn.playerSettings.Notify_FactionChanged();
            }
        }
 private bool <ChooseRandomChemical> m__1(ChemicalDef x)
 {
     return(AddictionUtility.CanBingeOnNow(this.pawn, x, DrugCategory.Any));
 }