Ejemplo n.º 1
0
        /// <summary>
        /// Gets the formatted remaining rocket range.
        /// </summary>
        /// <param name="engine">The rocket's engine.</param>
        /// <param name="fuelMass">The fuel mass remaining.</param>
        /// <param name="oxyMass">The oxidizer mass remaining.</param>
        /// <param name="fuelPerDist">The fuel consumed per tile travelled.</param>
        /// <returns>The range tool tip text. The range title is in CACHED_BUILDER.</returns>
        private static string GetRangeLeft(RocketEngineCluster engine, float fuelMass,
                                           float oxyMass, float fuelPerDist)
        {
            var    text = CACHED_BUILDER;
            string fuelUsage, fuelLeft;
            float  burnable = fuelMass, usage = fuelPerDist * Constants.SECONDS_PER_CYCLE;
            bool   oxidizerNeeded = false;

            if (engine == null)
            {
                // You cheater!
                fuelUsage = "0";
                fuelLeft  = "0";
            }
            else if (engine.TryGetComponent(out HEPFuelTank _))
            {
                fuelUsage = GameUtil.GetFormattedHighEnergyParticles(usage);
                fuelLeft  = GameUtil.GetFormattedHighEnergyParticles(fuelMass);
                // Radbolt engine does not require oxidizer
            }
            else
            {
                fuelUsage      = GameUtil.GetFormattedMass(usage);
                fuelLeft       = GameUtil.GetFormattedMass(fuelMass);
                oxidizerNeeded = engine.requireOxidizer;
                if (oxidizerNeeded)
                {
                    burnable = Mathf.Min(burnable, oxyMass);
                }
            }
            text.Clear().AppendLine(ROCKETS.RANGE.TOOLTIP).Append(Constants.
                                                                  TABBULLETSTRING).AppendLine(ROCKETS.FUEL_PER_HEX.NAME).Replace("{0}",
                                                                                                                                 fuelUsage).Append(Constants.TABBULLETSTRING).Append(ROCKETS.FUEL_REMAINING.
                                                                                                                                                                                     NAME).Append(fuelLeft);
            if (oxidizerNeeded)
            {
                text.AppendLine().Append(Constants.TABBULLETSTRING).Append(ROCKETS.
                                                                           OXIDIZER_REMAINING.NAME);
                FormatStringPatches.GetFormattedMass(text, oxyMass);
            }
            string tooltip = text.ToString();

            text.Clear().Append(ROCKETS.RANGE.NAME);
            float range = (fuelPerDist == 0.0f) ? 0.0f : burnable / fuelPerDist;

            FormatStringPatches.GetFormattedRocketRange(text, range, TimeSlice.None, true);
            return(tooltip);
        }
Ejemplo n.º 2
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);
        }