Пример #1
0
 public DiseaseSourceInfo(Tag sourceObject, Sickness.InfectionVector vector, float factor, Vector3 position)
 {
     this.sourceObject = sourceObject;
     this.vector       = vector;
     this.factor       = factor;
     this.position     = position;
 }
Пример #2
0
 internal SerializedGermExposure(string germID, Sickness.InfectionVector vector,
                                 int total)
 {
     this.germID = germID;
     this.total  = total;
     this.vector = vector;
 }
Пример #3
0
 public void TryInjectDisease(byte disease_idx, int count, Tag source, Sickness.InfectionVector vector)
 {
     if (disease_idx != 255)
     {
         Disease disease = Db.Get().Diseases[disease_idx];
         InjectDisease(disease, count, source, vector);
     }
 }
Пример #4
0
            /// <summary>
            /// Applied before InjectDisease runs.
            /// </summary>
            internal static bool Prefix(GermExposureMonitor.Instance __instance, int count,
                                        Disease disease, Tag source, Sickness.InfectionVector vector)
            {
                var manager = __instance.gameObject?.AddOrGet <GermIntegrator>();

                if (manager != null)
                {
                    manager.InjectDisease(__instance, disease, count, source, vector);
                }
                return(manager == null);
            }
Пример #5
0
            public static bool Prefix(GermExposureMonitor.Instance __instance, Disease disease, int count,
                                      Tag source,
                                      Sickness.InfectionVector vector)
            {
                var isExposureValidForTraits = AccessTools.Method(__instance.GetType(), "IsExposureValidForTraits");

                if (isExposureValidForTraits == null)
                {
                    return(false);
                }

                foreach (var exposureType in GermExposureMonitor.exposureTypes)
                {
                    if (disease.id == (HashedString)exposureType.germ_id &&
                        count * 1.5 > exposureType.exposure_threshold &&
                        (bool)isExposureValidForTraits.Invoke(__instance, new object[] { exposureType }))
                    {
                        var totalValue = Db.Get().Attributes.GermResistance.Lookup(__instance.gameObject)
                                         .GetTotalValue();
                        var contractionChance =
                            (float)(0.5 - 0.5 * Math.Tanh(0.5 * (exposureType.base_resistance + totalValue)));

                        __instance.lastDiseaseSources[disease.id] =
                            new DiseaseSourceInfo(source, vector, contractionChance);

                        __instance.SetExposureState(exposureType.germ_id,
                                                    GermExposureMonitor.ExposureState.Exposed);
                        var amount = Mathf.Clamp01(contractionChance);
                        GermExposureTracker.Instance.AddExposure(exposureType, amount);
                        float addCount = count;
                        if (vector == Sickness.InfectionVector.Inhalation)
                        {
                            addCount *= 1.0f;
                        }

                        var hostedGerms = __instance.gameObject.GetComponent <GermHost>().GetGerms(disease);
                        if (hostedGerms > 0 && addCount * 11 < hostedGerms)
                        {
                            addCount = addCount * (addCount * 11 / hostedGerms);
                        }

                        __instance.gameObject.GetComponent <GermHost>().AddGerms(disease, addCount);
                        //Debug.Log("added " + count + " germs to a dupe. ");
                    }
                }

                var refreshStatusItems = AccessTools.Method(__instance.GetType(), "RefreshStatusItems");

                refreshStatusItems?.Invoke(__instance, new object[] { });

                return(false);
            }
Пример #6
0
        // Called by GermExposureMonitor when a Duplicant encounters germs.
        internal void InjectDisease(GermExposureMonitor.Instance monitor, Disease disease,
                                    int count, Tag source, Sickness.InfectionVector vector)
        {
            var sicknesses = Db.Get().Sicknesses;

            foreach (var exposure in TUNING.GERM_EXPOSURE.TYPES)
            {
                if (disease.id == exposure.germ_id && IsExposureValidForTraits(exposure))
                {
                    // Null sickness ID for smelled flowers
                    string id       = exposure.sickness_id;
                    var    sickness = (id == null) ? null : sicknesses.Get(id);
                    if (sickness == null || sickness.infectionVectors.Contains(vector))
                    {
                        DoInjectDisease(monitor, disease, count, source, new GermExposure(
                                            vector, exposure));
                    }
                }
            }
        }
Пример #7
0
        // Retrieves the threshold for a given infection vector.
        public int GetThreshold(Sickness.InfectionVector vector)
        {
            int threshold = 0;

            switch (vector)
            {
            case Sickness.InfectionVector.Contact:
            case Sickness.InfectionVector.Exposure:
                // Exposure is only used for sunburn
                threshold = ContactThreshold;
                break;

            case Sickness.InfectionVector.Digestion:
                threshold = IngestionThreshold;
                break;

            case Sickness.InfectionVector.Inhalation:
                threshold = InhalationThreshold;
                break;
            }
            return(threshold);
        }
Пример #8
0
        public void InjectDisease(Disease disease, int count, Tag source, Sickness.InfectionVector vector)
        {
            ExposureType[] tYPES = GERM_EXPOSURE.TYPES;
            foreach (ExposureType exposureType in tYPES)
            {
                if (disease.id == (HashedString)exposureType.germ_id && count > exposureType.exposure_threshold && HasMinExposurePeriodElapsed(exposureType.germ_id) && IsExposureValidForTraits(exposureType))
                {
                    Sickness sickness = (exposureType.sickness_id == null) ? null : Db.Get().Sicknesses.Get(exposureType.sickness_id);
                    if (sickness == null || sickness.infectionVectors.Contains(vector))
                    {
                        ExposureState exposureState = GetExposureState(exposureType.germ_id);
                        float         exposureTier  = GetExposureTier(exposureType.germ_id);
                        switch (exposureState)
                        {
                        case ExposureState.None:
                        case ExposureState.Contact:
                        {
                            float resistanceToExposureType3 = GetResistanceToExposureType(exposureType, -1f);
                            float contractionChance3        = GetContractionChance(resistanceToExposureType3);
                            SetExposureState(exposureType.germ_id, ExposureState.Contact);
                            if (contractionChance3 > 0f)
                            {
                                lastDiseaseSources[disease.id] = new DiseaseSourceInfo(source, vector, contractionChance3, base.transform.GetPosition());
                                if (exposureType.infect_immediately)
                                {
                                    InfectImmediately(exposureType);
                                }
                                else
                                {
                                    bool flag4 = true;
                                    bool flag5 = vector == Sickness.InfectionVector.Inhalation;
                                    bool flag6 = vector == Sickness.InfectionVector.Digestion;
                                    int  num2  = 1;
                                    if (flag5)
                                    {
                                        flag4 = AssessInhaledGerms(exposureType);
                                    }
                                    if (flag6)
                                    {
                                        num2 = AssessDigestedGerms(exposureType, count);
                                    }
                                    if (flag4)
                                    {
                                        if (flag5)
                                        {
                                            inhaleExposureTick[exposureType.germ_id].ticks = 0;
                                        }
                                        SetExposureState(exposureType.germ_id, ExposureState.Exposed);
                                        SetExposureTier(exposureType.germ_id, (float)num2);
                                        float amount2 = Mathf.Clamp01(contractionChance3);
                                        GermExposureTracker.Instance.AddExposure(exposureType, amount2);
                                    }
                                }
                            }
                            break;
                        }

                        case ExposureState.Exposed:
                            if (exposureTier < 3f)
                            {
                                float resistanceToExposureType = GetResistanceToExposureType(exposureType, -1f);
                                float contractionChance        = GetContractionChance(resistanceToExposureType);
                                if (contractionChance > 0f)
                                {
                                    lastDiseaseSources[disease.id] = new DiseaseSourceInfo(source, vector, contractionChance, base.transform.GetPosition());
                                    if (!exposureType.infect_immediately)
                                    {
                                        bool flag  = true;
                                        bool flag2 = vector == Sickness.InfectionVector.Inhalation;
                                        bool flag3 = vector == Sickness.InfectionVector.Digestion;
                                        int  num   = 1;
                                        if (flag2)
                                        {
                                            flag = AssessInhaledGerms(exposureType);
                                        }
                                        if (flag3)
                                        {
                                            num = AssessDigestedGerms(exposureType, count);
                                        }
                                        if (flag)
                                        {
                                            if (flag2)
                                            {
                                                inhaleExposureTick[exposureType.germ_id].ticks = 0;
                                            }
                                            SetExposureTier(exposureType.germ_id, GetExposureTier(exposureType.germ_id) + (float)num);
                                            float resistanceToExposureType2 = GetResistanceToExposureType(exposureType, -1f);
                                            float contractionChance2        = GetContractionChance(resistanceToExposureType2);
                                            float value  = contractionChance2 - contractionChance;
                                            float amount = Mathf.Clamp01(value);
                                            GermExposureTracker.Instance.AddExposure(exposureType, amount);
                                        }
                                    }
                                }
                            }
                            break;
                        }
                    }
                }
            }
            RefreshStatusItems();
        }
Пример #9
0
 public GermExposure(Sickness.InfectionVector vector, ExposureType exposure)
 {
     Exposure = exposure ?? throw new ArgumentNullException("exposure");
     Vector   = vector;
 }