/// <summary>
        /// Initializes the available mass by element display.
        /// </summary>
        /// <param name="panel">The parent info panel.</param>
        /// <param name="harvestable">The POI to be harvested.</param>
        /// <param name="details">The panel to refresh.</param>
        private void InitElements(SpacePOISimpleInfoPanel panel, HarvestablePOIStates.
                                  Instance harvestable, CollapsibleDetailContentPanel details)
        {
            var elementRows  = panel.elementRows;
            var existingRows = DictionaryPool <Tag, GameObject, SpacePOISimpleInfoPanel> .
                               Allocate();

            foreach (var pair in panel.elementRows)
            {
                existingRows[pair.Key] = pair.Value;
            }
            if (harvestable != null)
            {
                // Shared dictionary, does not allocate
                var sortedElements = ListPool <ElementWeight, SpacePOISimpleInfoPanel> .
                                     Allocate();

                sortedElements.AddRange(harvestable.configuration.GetElementsWithWeights());
                sortedElements.Sort(SortElementsByMassComparer.Instance);
                int n = sortedElements.Count;
                for (int i = 0; i < n; i++)
                {
                    var       pair       = sortedElements[i];
                    SimHashes element    = pair.Key;
                    Tag       elementTag = new Tag(element.ToString());
                    if (!elementRows.TryGetValue(elementTag, out GameObject row))
                    {
                        row = Util.KInstantiateUI(panel.simpleInfoRoot.iconLabelRow, details.
                                                  Content.gameObject, true);
                        elementRows[elementTag] = row;
                    }
                    else
                    {
                        row.SetActive(true);
                    }
                    if (row.TryGetComponent(out HierarchyReferences hr))
                    {
                        var uiSprite = Def.GetUISprite(elementTag, "ui", false);
                        var icon     = hr.GetReference <Image>("Icon");
                        if (uiSprite != null)
                        {
                            icon.sprite = uiSprite.first;
                            icon.color  = uiSprite.second;
                        }
                        hr.GetReference <LocText>("NameLabel").SetText(ElementLoader.
                                                                       FindElementByHash(element).name);
                        hr.GetReference <LocText>("ValueLabel").alignment = TMPro.
                                                                            TextAlignmentOptions.MidlineRight;
                    }
                    existingRows.Remove(elementTag);
                }
                sortedElements.Recycle();
            }
            // Turn off all rows that were not turned on
            foreach (var pair in existingRows)
            {
                pair.Value.SetActive(false);
            }
            existingRows.Recycle();
        }
            /// <summary>
            /// Applied before CreateImmuneInfo runs.
            /// </summary>
            internal static bool Prefix(GameObject ___selectedTarget, ref bool __result,
                                        CollapsibleDetailContentPanel ___immuneSystemPanel)
            {
                bool ok = CreateImmuneInfo(___immuneSystemPanel, ___selectedTarget);

                __result = ok;
                return(!ok);
            }
Exemple #3
0
 private static void InitTraitsPanel(SimpleInfoScreen instance)
 {
     if (TraitsPanel == null || LastParent != instance.gameObject)
     {
         TraitsPanel  = Util.KInstantiateUI <CollapsibleDetailContentPanel>(ScreenPrefabs.Instance.CollapsableContentPanel, instance.gameObject);
         TraitsDrawer = new DetailsPanelDrawer(instance.attributesLabelTemplate, TraitsPanel.Content.gameObject);
         LastParent   = instance.gameObject;
     }
 }
Exemple #4
0
 internal static void Postfix(GameObject ___selectedTarget, CollapsibleDetailContentPanel ___immuneSystemPanel, bool __result)
 {
     if (__result)
     {
         AttributeInstance susceptibility = Db.Get().Attributes.Get(HeartAttackMonitor.ATTRIBUTE_ID).Lookup(___selectedTarget);
         if (susceptibility != null)
         {
             ___immuneSystemPanel.SetLabel(HeartAttackMonitor.ATTRIBUTE_ID, susceptibility.modifier.Name + ": " + GameUtil.GetFormattedPercent(100f * Mathf.Clamp01(susceptibility.GetTotalValue())), susceptibility.GetAttributeValueTooltip());
         }
     }
 }
        /// <summary>
        /// Refreshes the space POI info panel.
        /// </summary>
        /// <param name="panel">The parent info panel.</param>
        /// <param name="details">The panel to refresh.</param>
        /// <param name="target">The currently selected object.</param>
        public void Refresh(SpacePOISimpleInfoPanel panel,
                            CollapsibleDetailContentPanel details, GameObject target)
        {
            bool active = false;

            if (target != null)
            {
                bool changed = lastSelection.lastTarget != target;
                if (changed)
                {
                    lastSelection = new LastSelectionDetails(target);
                    if (panel.massHeader == null)
                    {
                        Init(panel, details);
                    }
                }
                var asteroidField = lastSelection.asteroidField;
                var artifact      = lastSelection.artifact;
                var harvestable   = lastSelection.harvestable;
                if (asteroidField != null || artifact != null)
                {
                    if (changed)
                    {
                        InitElements(panel, harvestable, details);
                        panel.artifactsSpacer.transform.SetAsLastSibling();
                        panel.artifactRow.transform.SetAsLastSibling();
                    }
                    if (harvestable != null && massLabel != null)
                    {
                        RefreshMassHeader(harvestable);
                    }
                    RefreshElements(panel, harvestable);
                    if (artifact != null)
                    {
                        RefreshArtifacts(panel, artifact);
                    }
                    if (!wasActive)
                    {
                        details.gameObject.SetActive(true);
                    }
                    active    = true;
                    wasActive = true;
                }
            }
            if (!active && wasActive)
            {
                details.gameObject.SetActive(false);
                wasActive = false;
            }
        }
 protected override void OnPrefabInit()
 {
     base.OnPrefabInit();
     diseaseSourcePanel = Util.KInstantiateUI(ScreenPrefabs.Instance.CollapsableContentPanel, base.gameObject, false).GetComponent <CollapsibleDetailContentPanel>();
     diseaseSourcePanel.SetTitle(UI.DETAILTABS.DISEASE.DISEASE_SOURCE);
     immuneSystemPanel = Util.KInstantiateUI(ScreenPrefabs.Instance.CollapsableContentPanel, base.gameObject, false).GetComponent <CollapsibleDetailContentPanel>();
     immuneSystemPanel.SetTitle(UI.DETAILTABS.DISEASE.IMMUNE_SYSTEM);
     currentGermsPanel = Util.KInstantiateUI(ScreenPrefabs.Instance.CollapsableContentPanel, base.gameObject, false).GetComponent <CollapsibleDetailContentPanel>();
     currentGermsPanel.SetTitle(UI.DETAILTABS.DISEASE.CURRENT_GERMS);
     infoPanel = Util.KInstantiateUI(ScreenPrefabs.Instance.CollapsableContentPanel, base.gameObject, false).GetComponent <CollapsibleDetailContentPanel>();
     infoPanel.SetTitle(UI.DETAILTABS.DISEASE.GERMS_INFO);
     infectionPanel = Util.KInstantiateUI(ScreenPrefabs.Instance.CollapsableContentPanel, base.gameObject, false).GetComponent <CollapsibleDetailContentPanel>();
     infectionPanel.SetTitle(UI.DETAILTABS.DISEASE.INFECTION_INFO);
     Subscribe(-1514841199, OnRefreshDataDelegate);
 }
    private void Refresh()
    {
        if ((Object)selectedTarget == (Object)null)
        {
            return;
        }
        List <Descriptor> allDescriptors = GameUtil.GetAllDescriptors(selectedTarget, true);
        Sicknesses        sicknesses     = selectedTarget.GetSicknesses();

        if (sicknesses != null)
        {
            for (int i = 0; i < sicknesses.Count; i++)
            {
                allDescriptors.AddRange(sicknesses[i].GetDescriptors());
            }
        }
        allDescriptors = allDescriptors.FindAll((Descriptor e) => e.type == Descriptor.DescriptorType.DiseaseSource);
        if (allDescriptors.Count > 0)
        {
            for (int j = 0; j < allDescriptors.Count; j++)
            {
                CollapsibleDetailContentPanel collapsibleDetailContentPanel = diseaseSourcePanel;
                string     id          = "source_" + j.ToString();
                Descriptor descriptor  = allDescriptors[j];
                string     text        = descriptor.text;
                Descriptor descriptor2 = allDescriptors[j];
                collapsibleDetailContentPanel.SetLabel(id, text, descriptor2.tooltipText);
            }
        }
        if (!CreateImmuneInfo())
        {
            goto IL_00ee;
        }
        goto IL_00ee;
IL_00ee:
        if (!CreateDiseaseInfo())
        {
            currentGermsPanel.SetTitle(UI.DETAILTABS.DISEASE.NO_CURRENT_GERMS);
            currentGermsPanel.SetLabel("nodisease", UI.DETAILTABS.DISEASE.DETAILS.NODISEASE, UI.DETAILTABS.DISEASE.DETAILS.NODISEASE_TOOLTIP);
        }
        diseaseSourcePanel.Commit();
        immuneSystemPanel.Commit();
        currentGermsPanel.Commit();
        infoPanel.Commit();
        infectionPanel.Commit();
    }
            public static void Prefix(CollapsibleDetailContentPanel ___immuneSystemPanel,
                                      GameObject ___selectedTarget)
            {
                if (___selectedTarget == null || ___immuneSystemPanel == null)
                {
                    return;
                }

                var host = ___selectedTarget.GetComponent <GermHost>();

                if (host == null)
                {
                    return;
                }

                host.germList.RemoveAll((e) => e == null);
                host.germList.RemoveAll((e) => e.Id == null);

                foreach (var germs in host.germList)
                {
                    if (germs == null)
                    {
                        Debug.Log("germs = null");
                        continue;
                    }

                    if (germs.Amount < 0.5)
                    {
                        continue;
                    }

                    ___immuneSystemPanel.SetTitle("GERM INFO");
                    if (Db.Get().Diseases.GetIndex((HashedString)germs.Id) == byte.MaxValue)
                    {
                        Debug.Log("germs.Id = byte.MaxValue");
                        host.germList.Remove(germs);
                        return;
                    }

                    var germName = Db.Get().Diseases[Db.Get().Diseases.GetIndex((HashedString)germs.Id)].Name;
                    ___immuneSystemPanel.SetLabel("germs_" + germName,
                                                  "" + (int)germs.Amount + " " + germName + " germs ",
                                                  "So many germs!");
                }
            }
        /// <summary>
        /// Performs one-time initialization.
        /// </summary>
        /// <param name="panel">The parent info panel.</param>
        /// <param name="details">The panel to initialize.</param>
        private void Init(SpacePOISimpleInfoPanel panel, CollapsibleDetailContentPanel details)
        {
            var root   = panel.simpleInfoRoot;
            var parent = details.Content.gameObject;
            var header = Util.KInstantiateUI(root.iconLabelRow, parent, true);

            panel.massHeader = header;
            details.SetTitle(STRINGS.UI.CLUSTERMAP.POI.TITLE);
            // Set the icon, name and alignment once
            if (header.TryGetComponent(out HierarchyReferences hr))
            {
                var sprite = Assets.GetSprite("icon_asteroid_type");
                if (sprite != null)
                {
                    hr.GetReference <Image>("Icon").sprite = sprite;
                }
                hr.GetReference <LocText>("NameLabel").SetText(STRINGS.UI.CLUSTERMAP.POI.
                                                               MASS_REMAINING);
                massLabel           = hr.GetReference <LocText>("ValueLabel");
                massLabel.alignment = TMPro.TextAlignmentOptions.MidlineRight;
            }
            else
            {
                massLabel = null;
            }
            if (panel.artifactsSpacer == null)
            {
                var ar = Util.KInstantiateUI(root.iconLabelRow, parent, true);
                panel.artifactsSpacer = Util.KInstantiateUI(root.spacerRow, parent, true);
                panel.artifactRow     = ar;
                if (ar.TryGetComponent(out hr))
                {
                    var icon = hr.GetReference <Image>("Icon");
                    // Triggers an Init if necessary
                    hr.GetReference <LocText>("NameLabel").SetText(STRINGS.UI.CLUSTERMAP.POI.
                                                                   ARTIFACTS);
                    hr.GetReference <LocText>("ValueLabel").alignment = TMPro.
                                                                        TextAlignmentOptions.MidlineRight;
                    icon.sprite = Assets.GetSprite("ic_artifacts");
                    icon.color  = Color.black;
                }
            }
        }
        // Creates the immune system information panel.
        internal static bool CreateImmuneInfo(CollapsibleDetailContentPanel immuneSystemPanel,
                                              GameObject target)
        {
            var  integrator = target.GetComponent <GermIntegrator>();
            bool update     = false;

            if (integrator != null)
            {
                var diseases = Db.Get().Diseases;
                // Create the immune system panel
                immuneSystemPanel.SetTitle(THRESHOLD_TITLE);
                immuneSystemPanel.SetLabel("germ_resistance", Db.Get().Attributes.
                                           GermResistance.Name + ": " + integrator.GetDupeResistance(), STRINGS.
                                           DUPLICANTS.ATTRIBUTES.GERMRESISTANCE.DESC);
                for (int i = 0; i < diseases.Count; i++)
                {
                    CreateOneImmuneInfo(diseases[i], target, integrator, immuneSystemPanel);
                }
                update = true;
            }
            return(update);
        }
Exemple #11
0
 internal SimpleInfoScreenWrapper()
 {
     allGeysers      = null;
     conditionParent = null;
     labelCache      = new Dictionary <string, CachedStorageLabel>(64);
     lastReport      = null;
     lastSelection   = default;
     lastStressEntry = null;
     processHeaders  = new List <ProcessConditionRow>(8);
     processRows     = new List <ProcessConditionRow>(24);
     processVisible  = new List <ProcessConditionRow>(32);
     rocketLabels    = new HashSet <CachedStorageLabel>();
     setInactive     = new HashSet <CachedStorageLabel>();
     statusActive    = false;
     storages        = new List <Storage>(8);
     storageActive   = false;
     storageLabels   = new HashSet <CachedStorageLabel>();
     storageParent   = null;
     stressActive    = false;
     vitalsActive    = false;
     wasPaused       = false;
     instance        = this;
 }
Exemple #12
0
    protected override void OnPrefabInit()
    {
        base.OnPrefabInit();
        statusItemPanel = Util.KInstantiateUI <CollapsibleDetailContentPanel>(ScreenPrefabs.Instance.CollapsableContentPanel, base.gameObject, false);
        statusItemPanel.Content.GetComponent <VerticalLayoutGroup>().padding.bottom = 10;
        statusItemPanel.HeaderLabel.text     = UI.DETAILTABS.SIMPLEINFO.GROUPNAME_STATUS;
        statusItemPanel.scalerMask.hoverLock = true;
        statusItemsFolder = statusItemPanel.Content.gameObject;
        vitalsPanel       = Util.KInstantiateUI <CollapsibleDetailContentPanel>(ScreenPrefabs.Instance.CollapsableContentPanel, base.gameObject, false);
        vitalsPanel.SetTitle(UI.DETAILTABS.SIMPLEINFO.GROUPNAME_CONDITION);
        vitalsContainer = Util.KInstantiateUI(VitalsPanelTemplate, vitalsPanel.Content.gameObject, false).GetComponent <MinionVitalsPanel>();
        fertilityPanel  = Util.KInstantiateUI <CollapsibleDetailContentPanel>(ScreenPrefabs.Instance.CollapsableContentPanel, base.gameObject, false);
        fertilityPanel.SetTitle(UI.DETAILTABS.SIMPLEINFO.GROUPNAME_FERTILITY);
        infoPanel = Util.KInstantiateUI(ScreenPrefabs.Instance.CollapsableContentPanel, base.gameObject, false);
        infoPanel.GetComponent <CollapsibleDetailContentPanel>().HeaderLabel.text = UI.DETAILTABS.SIMPLEINFO.GROUPNAME_DESCRIPTION;
        GameObject gameObject = infoPanel.GetComponent <CollapsibleDetailContentPanel>().Content.gameObject;

        descriptionContainer = Util.KInstantiateUI <DescriptionContainer>(DescriptionContainerTemplate, gameObject, false);
        storagePanel         = Util.KInstantiateUI(ScreenPrefabs.Instance.CollapsableContentPanel, base.gameObject, false);
        stressPanel          = Util.KInstantiateUI(ScreenPrefabs.Instance.CollapsableContentPanel, base.gameObject, false);
        stressDrawer         = new DetailsPanelDrawer(attributesLabelTemplate, stressPanel.GetComponent <CollapsibleDetailContentPanel>().Content.gameObject);
        stampContainer       = Util.KInstantiateUI(StampContainerTemplate, gameObject, false);
        Subscribe(-1514841199, OnRefreshDataDelegate);
    }
Exemple #13
0
        public override void OnCleanUp()
        {
            int n = processHeaders.Count;

            allGeysers = null;
            foreach (var pair in labelCache)
            {
                pair.Value.Dispose();
            }
            labelCache.Clear();
            // Avoid leaking the report
            lastReport      = null;
            lastStressEntry = null;
            lastSelection   = default;
            // Destroy all process rows
            for (int i = 0; i < n; i++)
            {
                processHeaders[i].Dispose();
            }
            n = processRows.Count;
            for (int i = 0; i < n; i++)
            {
                processRows[i].Dispose();
            }
            processHeaders.Clear();
            processRows.Clear();
            processVisible.Clear();
            storages.Clear();
            // All of these were in the label cache so they should already be disposed
            rocketLabels.Clear();
            storageLabels.Clear();
            storageParent   = null;
            conditionParent = null;
            instance        = null;
            base.OnCleanUp();
        }
Exemple #14
0
        /// <summary>
        /// Refreshes the Spaced Out rocket module statistics.
        /// </summary>
        /// <param name="rocketStatus">The info panel to update.</param>
        /// <param name="rocket">The currently selected rocket.</param>
        private static void RefreshRocketStats(CollapsibleDetailContentPanel rocketStatus,
                                               CraftModuleInterface rocket)
        {
            RocketEngineCluster engine = null;
            int   height = 0, maxHeight = TUNING.ROCKETRY.ROCKET_HEIGHT.MAX_MODULE_STACK_HEIGHT;
            var   modules = rocket.clusterModules;
            int   n = modules.Count;
            float oxyMass = 0.0f, fuelMass = 0.0f, fuelPerDist = 0.0f, burden = 0.0f,
                  enginePower = 0.0f;
            var text = CACHED_BUILDER;

            // Find the engine first
            for (int i = 0; i < n; i++)
            {
                var module = modules[i].Get();
                if (module != null && module.TryGetComponent(out engine))
                {
                    var perf = module.performanceStats;
                    fuelPerDist = perf.FuelKilogramPerDistance;
                    enginePower = perf.EnginePower;
                    break;
                }
            }
            for (int i = 0; i < n; i++)
            {
                var module = modules[i].Get();
                if (module != null)
                {
                    if (engine != null)
                    {
                        // Some engines have built-in fuel tanks
                        if (module.TryGetComponent(out IFuelTank fuelTank))
                        {
                            fuelMass += fuelTank.Storage.GetAmountAvailable(engine.fuelTag);
                        }
                        // Do not exclude future combo LF/O tanks from mods ;)
                        if (engine.requireOxidizer && module.TryGetComponent(
                                out OxidizerTank oxyTank))
                        {
                            oxyMass += oxyTank.TotalOxidizerPower;
                        }
                    }
                    if (module.TryGetComponent(out Building building))
                    {
                        height += building.Def.HeightInCells;
                    }
                    burden += module.performanceStats.Burden;
                }
            }
            // Range
            string tooltip = GetRangeLeft(engine, Mathf.Ceil(fuelMass), Mathf.Ceil(oxyMass),
                                          fuelPerDist);

            rocketStatus.SetLabel("RangeRemaining", text.ToString(), tooltip);
            // Speed
            tooltip = GetSpeed(rocket, enginePower, burden);
            rocketStatus.SetLabel("Speed", text.ToString(), tooltip);
            if (engine != null)
            {
                maxHeight = engine.maxHeight;
            }
            // Height
            string maxHeightStr = maxHeight.ToString();

            tooltip = text.Clear().Append(ROCKETS.MAX_HEIGHT.TOOLTIP).Replace("{0}",
                                                                              engine.GetProperName()).Replace("{1}", maxHeightStr).ToString();
            text.Clear().Append(ROCKETS.MAX_HEIGHT.NAME).Replace("{0}", height.
                                                                 ToString()).Replace("{1}", maxHeightStr);
            rocketStatus.SetLabel("MaxHeight", text.ToString(), tooltip);
        }
        // Creates one line of the immune system information panel.
        private static void CreateOneImmuneInfo(Disease disease, GameObject target,
                                                GermIntegrator integrator, CollapsibleDetailContentPanel panel)
        {
            var exposure = GameUtil.GetExposureTypeForDisease(disease);
            var sickness = GameUtil.GetSicknessForDisease(disease);
            ICollection <string> required = exposure.required_traits, excluded = exposure.
                                                                                 excluded_traits, noEffects = exposure.excluded_effects;
            var traits  = target.GetComponent <Traits>();
            var effects = target.GetComponent <Effects>();
            // The part we actually changed
            float threshold = Mathf.Ceil(GermIntegrator.AdjustedThreshold(GermExposureTuning.
                                                                          ThresholdsFor(exposure).GetMinThreshold(), integrator.GetResistance(exposure)));
            string tooltip = "";

            // Check for required traits to catch the disease
            if (required != null && required.Count > 0)
            {
                string traitList = "";
                foreach (string trait in required)
                {
                    if (!traits.HasTrait(trait))
                    {
                        if (traitList.Length > 0)
                        {
                            traitList += ", ";
                        }
                        traitList += Db.Get().traits.Get(trait).Name;
                    }
                }
                if (traitList.Length > 0)
                {
                    // Immune: missing required traits
                    threshold = 0.0f;
                    tooltip   = string.Format(STRINGS.DUPLICANTS.DISEASES.
                                              IMMUNE_FROM_MISSING_REQUIRED_TRAIT, traitList);
                }
            }
            // Check for traits that prevent catching it
            if (excluded != null && excluded.Count > 0)
            {
                string traitList = "";
                foreach (string trait in excluded)
                {
                    if (traits.HasTrait(trait))
                    {
                        if (traitList.Length > 0)
                        {
                            traitList += ", ";
                        }
                        traitList += Db.Get().traits.Get(trait).Name;
                    }
                }
                if (traitList.Length > 0)
                {
                    // Immune: blocking trait
                    threshold = 0.0f;
                    if (tooltip.Length > 0)
                    {
                        tooltip += "\n";
                    }
                    tooltip += string.Format(STRINGS.DUPLICANTS.DISEASES.
                                             IMMUNE_FROM_HAVING_EXLCLUDED_TRAIT, traitList);
                }
            }
            // Check for effects that prevent catching it
            if (noEffects != null && noEffects.Count > 0)
            {
                string effectList = "";
                foreach (string effect in noEffects)
                {
                    if (effects.HasEffect(effect))
                    {
                        if (effectList.Length > 0)
                        {
                            effectList += ", ";
                        }
                        effectList += Db.Get().effects.Get(effect).Name;
                    }
                }
                if (effectList.Length > 0)
                {
                    // Immune: blocking effect
                    threshold = 0.0f;
                    if (tooltip.Length > 0)
                    {
                        tooltip += "\n";
                    }
                    tooltip += string.Format(STRINGS.DUPLICANTS.DISEASES.
                                             IMMUNE_FROM_HAVING_EXCLUDED_EFFECT, effectList);
                }
            }
            // Update the label and tooltip
            if (tooltip.Length == 0)
            {
                if (threshold > 1.0f)
                {
                    tooltip = string.Format(THRESHOLD_TOOLTIP, GameUtil.GetFormattedSimple(
                                                threshold), target.GetProperName(), sickness.Name);
                }
                else
                {
                    tooltip = string.Format(THRESHOLD_TOOLTIP_1, target.GetProperName(),
                                            sickness.Name);
                }
            }
            panel.SetLabel("disease_" + disease.Id, "    • " + disease.Name + ": " +
                           (threshold == 0.0f ? THRESHOLD_IMMUNE.text : GameUtil.GetFormattedSimple(
                                threshold)), tooltip);
        }
    private void BuildFactorsStrings(int diseaseCount, int elementIdx, int environmentCell, float environmentMass, float temperature, HashSet <Tag> tags, Disease disease)
    {
        currentGermsPanel.SetTitle(string.Format(UI.DETAILTABS.DISEASE.CURRENT_GERMS, disease.Name.ToUpper()));
        currentGermsPanel.SetLabel("currentgerms", string.Format(UI.DETAILTABS.DISEASE.DETAILS.DISEASE_AMOUNT, disease.Name, GameUtil.GetFormattedDiseaseAmount(diseaseCount)), string.Format(UI.DETAILTABS.DISEASE.DETAILS.DISEASE_AMOUNT_TOOLTIP, GameUtil.GetFormattedDiseaseAmount(diseaseCount)));
        Element             e = ElementLoader.elements[elementIdx];
        CompositeGrowthRule growthRuleForElement = disease.GetGrowthRuleForElement(e);
        float tags_multiplier_base = 1f;

        if (tags != null && tags.Count > 0)
        {
            tags_multiplier_base = disease.GetGrowthRateForTags(tags, (float)diseaseCount > growthRuleForElement.maxCountPerKG * environmentMass);
        }
        float num = DiseaseContainers.CalculateDelta(diseaseCount, elementIdx, environmentMass, environmentCell, temperature, tags_multiplier_base, disease, 1f);

        currentGermsPanel.SetLabel("finaldelta", string.Format(UI.DETAILTABS.DISEASE.DETAILS.GROWTH_FACTORS.RATE_OF_CHANGE, GameUtil.GetFormattedSimple(num, GameUtil.TimeSlice.PerSecond, "F0")), string.Format(UI.DETAILTABS.DISEASE.DETAILS.GROWTH_FACTORS.RATE_OF_CHANGE_TOOLTIP, GameUtil.GetFormattedSimple(num, GameUtil.TimeSlice.PerSecond, "F0")));
        float num2 = Disease.GrowthRateToHalfLife(1f - num / (float)diseaseCount);

        if (num2 > 0f)
        {
            currentGermsPanel.SetLabel("finalhalflife", string.Format(UI.DETAILTABS.DISEASE.DETAILS.GROWTH_FACTORS.HALF_LIFE_NEG, GameUtil.GetFormattedCycles(num2, "F1")), string.Format(UI.DETAILTABS.DISEASE.DETAILS.GROWTH_FACTORS.HALF_LIFE_NEG_TOOLTIP, GameUtil.GetFormattedCycles(num2, "F1")));
        }
        else if (num2 < 0f)
        {
            currentGermsPanel.SetLabel("finalhalflife", string.Format(UI.DETAILTABS.DISEASE.DETAILS.GROWTH_FACTORS.HALF_LIFE_POS, GameUtil.GetFormattedCycles(0f - num2, "F1")), string.Format(UI.DETAILTABS.DISEASE.DETAILS.GROWTH_FACTORS.HALF_LIFE_POS_TOOLTIP, GameUtil.GetFormattedCycles(num2, "F1")));
        }
        else
        {
            currentGermsPanel.SetLabel("finalhalflife", UI.DETAILTABS.DISEASE.DETAILS.GROWTH_FACTORS.HALF_LIFE_NEUTRAL, UI.DETAILTABS.DISEASE.DETAILS.GROWTH_FACTORS.HALF_LIFE_NEUTRAL_TOOLTIP);
        }
        currentGermsPanel.SetLabel("factors", string.Format(UI.DETAILTABS.DISEASE.DETAILS.GROWTH_FACTORS.TITLE), UI.DETAILTABS.DISEASE.DETAILS.GROWTH_FACTORS.TOOLTIP);
        bool flag = false;

        if ((float)diseaseCount < growthRuleForElement.minCountPerKG * environmentMass)
        {
            currentGermsPanel.SetLabel("critical_status", string.Format(UI.DETAILTABS.DISEASE.DETAILS.GROWTH_FACTORS.DYING_OFF.TITLE, GetFormattedGrowthRate(0f - growthRuleForElement.underPopulationDeathRate)), string.Format(UI.DETAILTABS.DISEASE.DETAILS.GROWTH_FACTORS.DYING_OFF.TOOLTIP, GameUtil.GetFormattedDiseaseAmount(Mathf.RoundToInt(growthRuleForElement.minCountPerKG * environmentMass)), GameUtil.GetFormattedMass(environmentMass, GameUtil.TimeSlice.None, GameUtil.MetricMassFormat.UseThreshold, true, "{0:0.#}"), growthRuleForElement.minCountPerKG));
            flag = true;
        }
        else if ((float)diseaseCount > growthRuleForElement.maxCountPerKG * environmentMass)
        {
            currentGermsPanel.SetLabel("critical_status", string.Format(UI.DETAILTABS.DISEASE.DETAILS.GROWTH_FACTORS.OVERPOPULATED.TITLE, GetFormattedHalfLife(growthRuleForElement.overPopulationHalfLife)), string.Format(UI.DETAILTABS.DISEASE.DETAILS.GROWTH_FACTORS.OVERPOPULATED.TOOLTIP, GameUtil.GetFormattedDiseaseAmount(Mathf.RoundToInt(growthRuleForElement.maxCountPerKG * environmentMass)), GameUtil.GetFormattedMass(environmentMass, GameUtil.TimeSlice.None, GameUtil.MetricMassFormat.UseThreshold, true, "{0:0.#}"), growthRuleForElement.maxCountPerKG));
            flag = true;
        }
        if (!flag)
        {
            currentGermsPanel.SetLabel("substrate", GetFormattedGrowthEntry(growthRuleForElement.Name(), growthRuleForElement.populationHalfLife, UI.DETAILTABS.DISEASE.DETAILS.GROWTH_FACTORS.SUBSTRATE.DIE, UI.DETAILTABS.DISEASE.DETAILS.GROWTH_FACTORS.SUBSTRATE.GROW, UI.DETAILTABS.DISEASE.DETAILS.GROWTH_FACTORS.SUBSTRATE.NEUTRAL), GetFormattedGrowthEntry(growthRuleForElement.Name(), growthRuleForElement.populationHalfLife, UI.DETAILTABS.DISEASE.DETAILS.GROWTH_FACTORS.SUBSTRATE.DIE_TOOLTIP, UI.DETAILTABS.DISEASE.DETAILS.GROWTH_FACTORS.SUBSTRATE.GROW_TOOLTIP, UI.DETAILTABS.DISEASE.DETAILS.GROWTH_FACTORS.SUBSTRATE.NEUTRAL_TOOLTIP));
        }
        int num3 = 0;

        if (tags != null)
        {
            foreach (Tag tag in tags)
            {
                TagGrowthRule growthRuleForTag = disease.GetGrowthRuleForTag(tag);
                if (growthRuleForTag != null)
                {
                    CollapsibleDetailContentPanel collapsibleDetailContentPanel = currentGermsPanel;
                    string id   = "tag_" + num3;
                    string name = growthRuleForTag.Name();
                    float? populationHalfLife   = growthRuleForTag.populationHalfLife;
                    string formattedGrowthEntry = GetFormattedGrowthEntry(name, populationHalfLife.Value, UI.DETAILTABS.DISEASE.DETAILS.GROWTH_FACTORS.SUBSTRATE.DIE, UI.DETAILTABS.DISEASE.DETAILS.GROWTH_FACTORS.SUBSTRATE.GROW, UI.DETAILTABS.DISEASE.DETAILS.GROWTH_FACTORS.SUBSTRATE.NEUTRAL);
                    string name2 = growthRuleForTag.Name();
                    float? populationHalfLife2 = growthRuleForTag.populationHalfLife;
                    collapsibleDetailContentPanel.SetLabel(id, formattedGrowthEntry, GetFormattedGrowthEntry(name2, populationHalfLife2.Value, UI.DETAILTABS.DISEASE.DETAILS.GROWTH_FACTORS.SUBSTRATE.DIE_TOOLTIP, UI.DETAILTABS.DISEASE.DETAILS.GROWTH_FACTORS.SUBSTRATE.GROW_TOOLTIP, UI.DETAILTABS.DISEASE.DETAILS.GROWTH_FACTORS.SUBSTRATE.NEUTRAL_TOOLTIP));
                }
                num3++;
            }
        }
        if (Grid.IsValidCell(environmentCell))
        {
            CompositeExposureRule exposureRuleForElement = disease.GetExposureRuleForElement(Grid.Element[environmentCell]);
            if (exposureRuleForElement != null && exposureRuleForElement.populationHalfLife != float.PositiveInfinity)
            {
                if (exposureRuleForElement.GetHalfLifeForCount(diseaseCount) > 0f)
                {
                    currentGermsPanel.SetLabel("environment", string.Format(UI.DETAILTABS.DISEASE.DETAILS.GROWTH_FACTORS.ENVIRONMENT.TITLE, exposureRuleForElement.Name(), GetFormattedHalfLife(exposureRuleForElement.GetHalfLifeForCount(diseaseCount))), UI.DETAILTABS.DISEASE.DETAILS.GROWTH_FACTORS.ENVIRONMENT.DIE_TOOLTIP);
                }
                else
                {
                    currentGermsPanel.SetLabel("environment", string.Format(UI.DETAILTABS.DISEASE.DETAILS.GROWTH_FACTORS.ENVIRONMENT.TITLE, exposureRuleForElement.Name(), GetFormattedHalfLife(exposureRuleForElement.GetHalfLifeForCount(diseaseCount))), UI.DETAILTABS.DISEASE.DETAILS.GROWTH_FACTORS.ENVIRONMENT.GROW_TOOLTIP);
                }
            }
        }
        float num4 = disease.CalculateTemperatureHalfLife(temperature);

        if (num4 != float.PositiveInfinity)
        {
            if (num4 > 0f)
            {
                currentGermsPanel.SetLabel("temperature", string.Format(UI.DETAILTABS.DISEASE.DETAILS.GROWTH_FACTORS.TEMPERATURE.TITLE, GameUtil.GetFormattedTemperature(temperature, GameUtil.TimeSlice.None, GameUtil.TemperatureInterpretation.Absolute, true, false), GetFormattedHalfLife(num4)), UI.DETAILTABS.DISEASE.DETAILS.GROWTH_FACTORS.TEMPERATURE.DIE_TOOLTIP);
            }
            else
            {
                currentGermsPanel.SetLabel("temperature", string.Format(UI.DETAILTABS.DISEASE.DETAILS.GROWTH_FACTORS.TEMPERATURE.TITLE, GameUtil.GetFormattedTemperature(temperature, GameUtil.TimeSlice.None, GameUtil.TemperatureInterpretation.Absolute, true, false), GetFormattedHalfLife(num4)), UI.DETAILTABS.DISEASE.DETAILS.GROWTH_FACTORS.TEMPERATURE.GROW_TOOLTIP);
            }
        }
    }