public DiseaseSourceInfo(Tag sourceObject, Sickness.InfectionVector vector, float factor, Vector3 position) { this.sourceObject = sourceObject; this.vector = vector; this.factor = factor; this.position = position; }
internal SerializedGermExposure(string germID, Sickness.InfectionVector vector, int total) { this.germID = germID; this.total = total; this.vector = vector; }
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); } }
/// <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); }
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); }
// 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)); } } } }
// 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); }
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(); }
public GermExposure(Sickness.InfectionVector vector, ExposureType exposure) { Exposure = exposure ?? throw new ArgumentNullException("exposure"); Vector = vector; }