示例#1
0
        static void Postfix(LanceHeaderWidget __instance, List <MechDef> mechs)
        {
            try {
                Settings settings = Helper.LoadSettings();

                LanceConfiguratorPanel LC = (LanceConfiguratorPanel)ReflectionHelper.GetPrivateField(__instance, "LC");
                if (LC.IsSimGame)
                {
                    float num2 = 0f;
                    int   lanceTonnageRating = SimGameBattleSimulator.GetLanceTonnageRating(LC.sim, mechs, out num2);
                    Fields.cbill = 0f;
                    if (settings.CostByTons)
                    {
                        foreach (MechDef def in mechs)
                        {
                            Fields.cbill += (float)def.Chassis.Tonnage * settings.cbillsPerTon;
                        }
                    }
                    else
                    {
                        foreach (MechDef def in mechs)
                        {
                            Fields.cbill += (float)def.Description.Cost * settings.percentageOfMechCost;
                        }
                    }

                    TextMeshProUGUI simLanceTonnageText = (TextMeshProUGUI)ReflectionHelper.GetPrivateField(__instance, "simLanceTonnageText");
                    simLanceTonnageText.text = string.Format("Operation Costs: {0} ¢ / Lance Weight: {1} TONS", (int)Fields.cbill, (int)num2);
                }
            }
            catch (Exception e) {
                Logger.LogError(e);
            }
        }
示例#2
0
        public static void CalculateTonnage()
        {
            GameObject lanceConfigPanelGo = GameObject.Find("uixPrfScrn_LC_LanceConfig-Screen(Clone)");

            if (lanceConfigPanelGo != null)
            {
                float tonnage = 0f;
                LanceConfiguratorPanel lanceConfigPanel = lanceConfigPanelGo.GetComponent <LanceConfiguratorPanel>();
                LanceLoadoutSlot[]     loadoutSlots     = (LanceLoadoutSlot[])AccessTools.Field(typeof(LanceConfiguratorPanel), "loadoutSlots").GetValue(lanceConfigPanel);

                foreach (LanceLoadoutSlot lanceLoadoutSlot in loadoutSlots)
                {
                    if (lanceLoadoutSlot.SelectedMech != null)
                    {
                        tonnage += lanceLoadoutSlot.SelectedMech.MechDef.Chassis.Tonnage;
                    }
                }

                MissionControl.Instance.PlayerLanceDropTonnage = tonnage;
            }
            else
            {
                Main.Logger.LogError("[CalculateTonnage] Unable to get object 'uixPrfScrn_LC_LanceConfig-Screen(Clone)'. Name must have changed in an BT update.");
            }
        }
示例#3
0
 static void Prefix(LanceConfiguratorPanel __instance, ref int maxUnits, Contract contract)
 {
     try
     {
         if (contract != null)
         {
             maxUnits = Settings.MAX_ADDITINAL_MECH_SLOTS + DropManagement.settings.additinalMechSlots;
             __instance.UpdateSlotsCount(maxUnits);
             if (contract.Override != null)
             {
                 if (contract.Override.maxNumberOfPlayerUnits < 4)
                 {
                     maxUnits = contract.Override.maxNumberOfPlayerUnits;
                 }
             }
         }
         else
         {
             maxUnits = Settings.MAX_ADDITINAL_MECH_SLOTS + Settings.MAX_ADDITINAL_MECH_SLOTS;
             DropManagement.baysAlreadyAdded = 0;
             __instance.UpdateSlotsCount(maxUnits);
             //SkirmishUIFix(__instance,maxUnits);
         }
     }
     catch (Exception e)
     {
         Logger.M.TWL(0, e.ToString());
     }
 }
        public static void Postfix(LanceHeaderWidget __instance, List <MechDef> mechs)
        {
            LanceConfiguratorPanel lanceConfiguratorPanel = (LanceConfiguratorPanel)ReflectionHelper.GetPrivateField(__instance, "LC");

            if (!lanceConfiguratorPanel.IsSimGame)
            {
                return;
            }

            Contract activeContract = (Contract)ReflectionHelper.GetPrivateField(__instance, "activeContract");

            if (activeContract == null)
            {
                return;
            }

            int difficulty   = activeContract.Difficulty;
            int tonnageLimit = 0;

            if (!TonnageLimitByMissionDifficulty.GetTonnageLimit(difficulty, out tonnageLimit))
            {
                return;
            }

            float lanceTonnage = 0;

            foreach (MechDef mech in mechs)
            {
                lanceTonnage += mech.Chassis.Tonnage;
            }

            TextMeshProUGUI tonnageText = (TextMeshProUGUI)ReflectionHelper.GetPrivateField(__instance, "simLanceTonnageText");

            tonnageText.text = string.Format("{0} / {1} TONS", (int)lanceTonnage, tonnageLimit);
        }
 public static void Prefix(LanceConfiguratorPanel __instance, LanceLoadoutSlot[] ___loadoutSlots, bool ___mechWarningsCheckResolved)
 {
     ModState.runContinueConfirmClickedPost = false;
     if (___mechWarningsCheckResolved)
     {
         ModState.runContinueConfirmClickedPost = true;
     }
 }
示例#6
0
 static bool Prefix(LanceConfiguratorPanel __instance, ref LanceConfiguration __result)
 {
     try {
         return(false);
     } catch (Exception e) {
         Logger.LogError(e);
         return(false);
     }
 }
示例#7
0
 static void Postfix(LanceConfiguratorPanel __instance, ref LanceConfiguration __result, LanceLoadoutSlot[] ___loadoutSlots)
 {
     try {
         if (CustomUnitsAPI.Detected())
         {
             return;
         }
         Fields.callsigns.Clear();
         LanceConfiguration lanceConfiguration = new LanceConfiguration();
         for (int i = 0; i < ___loadoutSlots.Length; i++)
         {
             LanceLoadoutSlot lanceLoadoutSlot = ___loadoutSlots[i];
             MechDef          mechDef          = null;
             PilotDef         pilotDef         = null;
             if (lanceLoadoutSlot.SelectedMech != null)
             {
                 mechDef = lanceLoadoutSlot.SelectedMech.MechDef;
             }
             if (lanceLoadoutSlot.SelectedPilot != null)
             {
                 pilotDef = lanceLoadoutSlot.SelectedPilot.Pilot.pilotDef;
             }
             if (mechDef != null && pilotDef != null)
             {
                 if (i < Settings.DEFAULT_MECH_SLOTS)
                 {
                     lanceConfiguration.AddUnit(__instance.playerGUID, mechDef, pilotDef);
                 }
                 else
                 {
                     //if (i >= BiggerDrops.settings.additinalMechSlots + Settings.DEFAULT_MECH_SLOTS) { break; }
                     Logger.M.TWL(0, "LanceConfiguratorPanel.CreateLanceConfiguration. Index:" + i + " additional slots border:" + (BiggerDrops.settings.additinalMechSlots + Settings.DEFAULT_MECH_SLOTS) + " player slots border:" + (BiggerDrops.settings.additinalPlayerMechSlots + Settings.DEFAULT_MECH_SLOTS));
                     if (i >= BiggerDrops.settings.additinalPlayerMechSlots + Settings.DEFAULT_MECH_SLOTS)
                     {
                         Fields.callsigns.Add(pilotDef.Description.Callsign);
                         //EMPLOYER ID
                         Logger.M.WL(1, "adding to employer lance " + Settings.EMPLOYER_LANCE_GUID + " mech:" + mechDef.Description.Id + " pilot:" + pilotDef.Description.Id);
                         lanceConfiguration.AddUnit(Settings.EMPLOYER_LANCE_GUID, mechDef, pilotDef);
                     }
                     else
                     {
                         Logger.M.WL(1, "adding to player lance " + __instance.playerGUID + " mech:" + mechDef.Description.Id + " pilot:" + pilotDef.Description.Id);
                         lanceConfiguration.AddUnit(__instance.playerGUID, mechDef, pilotDef);
                     }
                 }
             }
         }
         __result = lanceConfiguration;
     } catch (Exception e) {
         Logger.LogError(e);
     }
 }
示例#8
0
        public static void Postfix(LanceContractDetailsWidget __instance, LanceConfiguratorPanel LC, Contract contract)
        {
            var actualSalvage = contract.SalvagePotential;

            if (actualSalvage > 0)
            {
                actualSalvage  = Mathf.FloorToInt(contract.Override.salvagePotential * contract.PercentageContractSalvage);
                actualSalvage += LC.Sim.Constants.Finances.ContractFloorSalvageBonus;
            }

            var actualPrioritySalvage = Math.Min(7, Mathf.FloorToInt(actualSalvage * LC.Sim.Constants.Salvage.PrioritySalvageModifier));

            Traverse.Create(__instance).Field("MetaMaxSalvageField").GetValue <TextMeshProUGUI>().text = $"{actualPrioritySalvage} / {actualSalvage}";
        }
示例#9
0
 static void Prefix(LanceConfiguratorPanel __instance, ref int maxUnits, Contract contract)
 {
     try {
         if (CustomUnitsAPI.Detected())
         {
             return;
         }
         if (contract != null)
         {
             maxUnits = Settings.MAX_ADDITINAL_MECH_SLOTS + BiggerDrops.settings.additinalMechSlots;
             __instance.UpdateSlotsCount(maxUnits);
             if (contract.Override != null)
             {
                 if (contract.IsFlashpointContract | contract.IsFlashpointCampaignContract)
                 {
                     if (BiggerDrops.settings.limitFlashpointDrop)
                     {
                         maxUnits = 4;
                     }
                 }
                 if (BiggerDrops.settings.respectFourDropLimit)
                 {
                     if (contract.Override.maxNumberOfPlayerUnits != -1)
                     {
                         maxUnits = contract.Override.maxNumberOfPlayerUnits;
                     }
                 }
                 else
                 {
                     if (contract.Override.maxNumberOfPlayerUnits < 4)
                     {
                         maxUnits = contract.Override.maxNumberOfPlayerUnits;
                     }
                 }
             }
         }
         else
         {
             maxUnits = Settings.MAX_ADDITINAL_MECH_SLOTS + Settings.MAX_ADDITINAL_MECH_SLOTS;
             BiggerDrops.baysAlreadyAdded = 0;
             __instance.UpdateSlotsCount(maxUnits);
             //SkirmishUIFix(__instance,maxUnits);
         }
     } catch (Exception e) {
         Logger.M.TWL(0, e.ToString());
     }
 }
示例#10
0
 static void Prefix(LanceConfiguratorPanel __instance, ref int maxUnits, Contract contract)
 {
     try {
         if (contract != null)
         {
             maxUnits = Settings.MAX_ADDITINAL_MECH_SLOTS + BiggerDrops.settings.additinalMechSlots;
         }
         else
         {
             maxUnits = Settings.MAX_ADDITINAL_MECH_SLOTS + Settings.MAX_ADDITINAL_MECH_SLOTS;
             __instance.UpdateSlotsCount(maxUnits);
             //SkirmishUIFix(__instance,maxUnits);
         }
     } catch (Exception e) {
         Logger.M.TWL(0, e.ToString());
     }
 }
        public static void Postfix(LanceConfiguratorPanel __instance, ref bool __result)
        {
            if (!__instance.IsSimGame)
            {
                return;
            }

            if (__instance.activeContract == null)
            {
                return;
            }

            int difficulty   = __instance.activeContract.Difficulty;
            int tonnageLimit = 0;

            if (!TonnageLimitByMissionDifficulty.GetTonnageLimit(difficulty, out tonnageLimit))
            {
                return;
            }

            float          lanceTonnage = 0;
            List <MechDef> mechs        = TonnageLimitByMissionDifficulty.GetMechDefs(__instance);

            foreach (MechDef mech in mechs)
            {
                lanceTonnage += mech.Chassis.Tonnage;
            }

            if (lanceTonnage <= tonnageLimit)
            {
                return;
            }

            __instance.lanceValid = false;

            String errorString = String.Format("Lance exceeds tonnage limit by {0} tons\n", lanceTonnage - tonnageLimit);

            LanceHeaderWidget headerWidget = (LanceHeaderWidget)ReflectionHelper.GetPrivateField(__instance, "headerWidget");

            headerWidget.RefreshLanceInfo(__instance.lanceValid, errorString, mechs);

            ReflectionHelper.SetPrivateField(__instance, "lanceErrorText", errorString);

            __result = __instance.lanceValid;
        }
        public static List <MechDef> GetMechDefs(LanceConfiguratorPanel lancePanel)
        {
            List <MechDef> mechs = new List <MechDef>();

            for (var i = 0; i < lancePanel.maxUnits; i++)
            {
                var lanceLoadoutSlot = ((LanceLoadoutSlot[])ReflectionHelper.GetPrivateField(lancePanel, "loadoutSlots"))[i];

                if (lanceLoadoutSlot.SelectedMech == null)
                {
                    continue;
                }

                mechs.Add(lanceLoadoutSlot.SelectedMech.MechDef);
            }

            return(mechs);
        }
示例#13
0
 static void Postfix(LanceConfiguratorPanel __instance, Contract contract)
 {
     Logger.M.TWL(0, "LanceConfiguratorPanel.SetData postfix");
     try {
         if (contract == null)
         {
             Logger.M.WL(1, "contract is null");
             //__instance.lanceMaxTonnage = BiggerDrops.settings.defaultMaxTonnage;
             return;
         }
         else
         if (contract.Override.lanceMaxTonnage == -1)
         {
             __instance.lanceMaxTonnage = BiggerDrops.settings.defaultMaxTonnage;
         }
     } catch (Exception e) {
         Logger.LogError(e);
     }
 }
示例#14
0
        static void Postfix(LanceConfiguratorPanel __instance)
        {
            Main.LogDebug("[LanceConfiguratorPanelContinueConfirmClickedPatch] Patching");
            GameObject lanceHeaderWidgetGo = GameObject.Find("uixPrfPanel_LC_LanceConfigTopBar-Widget-MANAGED");

            if (lanceHeaderWidgetGo != null)
            {
                LanceHeaderWidget           lanceHeaderWidget = lanceHeaderWidgetGo.GetComponent <LanceHeaderWidget>();
                SGDifficultyIndicatorWidget lanceRatingWidget = (SGDifficultyIndicatorWidget)AccessTools.Field(typeof(LanceHeaderWidget), "lanceRatingWidget").GetValue(lanceHeaderWidget);

                MissionControl.Instance.PlayerLanceDropDifficultyValue = lanceRatingWidget.Difficulty;
                MissionControl.Instance.PlayerLanceDropSkullRating     = lanceRatingWidget.Difficulty / 2f;
                CalculateTonnage();
            }
            else
            {
                Main.Logger.LogError("[LanceConfiguratorPanelContinueConfirmClickedPatch] Unable to get object 'uixPrfPanel_LC_LanceConfigTopBar-Widget-MANAGED'. Name must have changed in an BT update.");
            }
        }
示例#15
0
        public static void Postfix(LanceConfiguratorPanel __instance, ref bool __result)
        {
            float lanceTonnage = 0;

            if (DropLimit.Settings.OnlyInSimGame && !__instance.IsSimGame)
            {
                return;
            }

            var mechs = new List <MechDef>();

            for (var i = 0; i < __instance.maxUnits; i++)
            {
                var lanceLoadoutSlot = Traverse.Create(__instance).Field("loadoutSlots").GetValue <LanceLoadoutSlot[]>()[i];

                if (lanceLoadoutSlot.SelectedMech == null)
                {
                    continue;
                }

                mechs.Add(lanceLoadoutSlot.SelectedMech.MechDef);
                lanceTonnage += lanceLoadoutSlot.SelectedMech.MechDef.Chassis.Tonnage;
            }

            if (lanceTonnage <= DropLimit.Settings.MaxTonnage)
            {
                return;
            }

            __instance.lanceValid = false;

            var headerWidget = Traverse.Create(__instance).Field("headerWidget").GetValue <LanceHeaderWidget>();

            headerWidget.RefreshLanceInfo(__instance.lanceValid, "Lance cannot exceed tonnage limit", mechs);

            Traverse.Create(__instance).Field("lanceErrorText").SetValue("Lance cannot exceed tonnage limit\n");

            __result = __instance.lanceValid;
        }
示例#16
0
 static void Postfix(LanceHeaderWidget __instance, List <MechDef> mechs)
 {
     try {
         LanceConfiguratorPanel LC = (LanceConfiguratorPanel)AccessTools.Field(typeof(LanceHeaderWidget), "LC").GetValue(__instance);
         if (LC.IsSimGame)
         {
             Settings settings = Helper.LoadSettings();
             SGDifficultyIndicatorWidget lanceRatingWidget = (SGDifficultyIndicatorWidget)AccessTools.Field(typeof(LanceHeaderWidget), "lanceRatingWidget").GetValue(__instance);
             TextMeshProUGUI             label             = lanceRatingWidget.transform.parent.GetComponentsInChildren <TextMeshProUGUI>().FirstOrDefault(t => t.transform.name == "label-lanceRating");
             label.text = "Lance Rating";
             int totalMechWorth = 0;
             foreach (MechDef mech in mechs)
             {
                 totalMechWorth += Mathf.RoundToInt(Helper.CalculateCBillValue(mech));
             }
             lanceRatingWidget.SetDifficulty(Mathf.Min(10, totalMechWorth / settings.CostPerHalfSkull));
         }
     }
     catch (Exception e) {
         Logger.LogError(e);
     }
 }
示例#17
0
        static void Prefix(LanceConfiguratorPanel __instance, ref List <Pilot> pilots)
        {
            if (ModState.SimGameState == null)
            {
                return;                                // Only patch if we're in SimGame
            }
            // Remove any pilots who are aerospace, mechtechs, or medtechs
            Mod.Log.Debug?.Write("Filtering pilots for LanceConfiguratorPanel");
            List <Pilot> selectablePilots = new List <Pilot>();

            foreach (Pilot p in pilots)
            {
                CrewDetails details = ModState.GetCrewDetails(p.pilotDef);
                if (details.IsMechWarrior || details.IsVehicleCrew)
                {
                    Mod.Log.Debug?.Write($"Pilot {p.Name} is a mechwarrior or vehicle crew, adding as option");
                    selectablePilots.Add(p);
                }
            }

            pilots.Clear();
            pilots.AddRange(selectablePilots);
        }
示例#18
0
        public static void Postfix(LanceLoadoutSlot __instance, GameObject ___initiativeObj, TextMeshProUGUI ___initiativeText,
                                   UIColorRefTracker ___initiativeColor, HBSTooltip ___initiativeTooltip, LanceConfiguratorPanel ___LC)
        {
            Mod.Log.Trace?.Write("LLS:RID:post - entered.");

            if (___initiativeObj == null || ___initiativeText == null || ___initiativeColor == null || ___initiativeTooltip == null)
            {
                return;
            }

            bool bothSelected = __instance.SelectedMech != null && __instance.SelectedPilot != null;

            if (!bothSelected)
            {
                ___initiativeText.SetText("-");
                ___initiativeColor.SetUIColor(UIColor.MedGray);
            }
            else
            {
                // --- MECH ---
                MechDef       selectedMechDef = __instance.SelectedMech.MechDef;
                List <string> details         = new List <string>();

                // Static initiative from tonnage
                int initPhase    = PhaseHelper.TonnageToPhase((int)Math.Ceiling(__instance.SelectedMech.MechDef.Chassis.Tonnage));
                int initLabelVal = (Mod.MaxPhase + 1) - initPhase;
                details.Add(new Text(Mod.Config.LocalizedText[ModConfig.LT_TT_BASE], new object[] { initLabelVal }).ToString());

                // Any bonuses from equipment
                int    componentBonus = UnitHelper.GetNormalizedComponentModifier(__instance.SelectedMech.MechDef);
                string componentColor = "FFFFFF";
                if (componentBonus > 0)
                {
                    componentColor = "00FF00";
                }
                if (componentBonus < 0)
                {
                    componentColor = "FF0000";
                }
                details.Add(new Text(Mod.Config.LocalizedText[ModConfig.LT_TT_COMPONENT], new object[] { componentColor, componentBonus }).ToString());
                Mod.Log.Debug?.Write($"Component bonus is: {componentBonus}");

                // --- LANCE ---
                int lanceBonus = 0;
                if (___LC != null)
                {
                    lanceBonus = ___LC.lanceInitiativeModifier;
                }
                string lanceColor = "FFFFFF";
                if (lanceBonus > 0)
                {
                    lanceColor = "00FF00";
                }
                if (lanceBonus < 0)
                {
                    lanceColor = "FF0000";
                }
                details.Add(new Text(Mod.Config.LocalizedText[ModConfig.LT_TT_LANCE], new object[] { lanceColor, lanceBonus }).ToString());

                // --- PILOT ---
                // TODO: Get pilot modifiers from abilities - coordinate with BD
                Pilot selectedPilot = __instance.SelectedPilot.Pilot;
                int   pilotBonus    = 0;
                foreach (Ability ability in selectedPilot.PassiveAbilities)
                {
                    foreach (EffectData effectData in ability.Def.EffectData)
                    {
                        if (effectData.effectType == EffectType.StatisticEffect && effectData.statisticData != null && effectData.statisticData.statName == "BaseInitiative")
                        {
                            int mod = Int32.Parse(effectData.statisticData.modValue) * -1;
                            if (effectData.statisticData.operation == StatCollection.StatOperation.Int_Add)
                            {
                                pilotBonus += mod;
                            }
                            else if (effectData.statisticData.operation == StatCollection.StatOperation.Int_Subtract)
                            {
                                pilotBonus -= mod;
                            }
                        }
                    }
                }

                string pilotColor = "FFFFFF";
                if (pilotBonus > 0)
                {
                    pilotColor = "00FF00";
                }
                if (pilotBonus < 0)
                {
                    pilotColor = "FF0000";
                }
                details.Add(new Text(Mod.Config.LocalizedText[ModConfig.LT_TT_PILOT], new object[] { pilotColor, pilotBonus }).ToString());

                // --- Badge ---
                int summaryInitLabel = initLabelVal + componentBonus + pilotBonus + lanceBonus;
                if (summaryInitLabel > Mod.MaxPhase)
                {
                    summaryInitLabel = Mod.MaxPhase;
                }
                else if (summaryInitLabel < Mod.MinPhase)
                {
                    summaryInitLabel = Mod.MinPhase;
                }
                ___initiativeText.SetText($"{summaryInitLabel}");
                ___initiativeText.color = Color.black;
                ___initiativeColor.SetUIColor(UIColor.White);

                // --- Tooltip ---
                string             tooltipTitle   = $"{selectedMechDef.Name}: {selectedPilot.Name}";
                string             detailsS       = String.Join("\n", details.ToArray());
                string             tooltipText    = new Text(Mod.Config.LocalizedText[ModConfig.LT_LC_TT_SUMMARY], new object[] { detailsS, summaryInitLabel }).ToString();
                BaseDescriptionDef initiativeData = new BaseDescriptionDef("LLS_MECH_TT", tooltipTitle, tooltipText, null);
                ___initiativeTooltip.enabled = true;
                ___initiativeTooltip.SetDefaultStateData(TooltipUtilities.GetStateDataFromObject(initiativeData));
            }
        }
示例#19
0
        public static void Postfix(LanceLoadoutSlot __instance, GameObject ___initiativeObj, TextMeshProUGUI ___initiativeText,
                                   UIColorRefTracker ___initiativeColor, HBSTooltip ___initiativeTooltip, LanceConfiguratorPanel ___LC)
        {
            if (___initiativeObj == null || ___initiativeText == null || ___initiativeColor == null || ___initiativeTooltip == null)
            {
                return;
            }

            //SkillBasedInit.Logger.Log($"LanceLoadoutSlot::RefreshInitiativeData::post - disabling text");
            bool bothSelected = __instance.SelectedMech != null && __instance.SelectedPilot != null;

            if (!bothSelected)
            {
                ___initiativeText.SetText("-");
                ___initiativeColor.SetUIColor(UIColor.MedGray);
            }
            else
            {
                int initValue = 0;

                // --- MECH ---
                MechDef       selectedMechDef = __instance.SelectedMech.MechDef;
                List <string> details         = new List <string>();

                // Static initiative from tonnage
                float tonnage    = __instance.SelectedMech.MechDef.Chassis.Tonnage;
                int   tonnageMod = UnitHelper.GetTonnageModifier(tonnage);
                initValue += tonnageMod;
                details.Add($"Tonnage Base: {tonnageMod}");

                // Any special modifiers by type - NA, Mech is the only type

                // Any modifiers that come from the chassis/mech/vehicle defs
                int componentsMod = UnitHelper.GetNormalizedComponentModifier(selectedMechDef);
                initValue += componentsMod;
                if (componentsMod > 0)
                {
                    details.Add($"<space=2em><color=#00FF00>{componentsMod:+0} components</color>");
                }
                else if (componentsMod < 0)
                {
                    details.Add($"<space=2em><color=#FF0000>{componentsMod:0} components</color>");
                }

                // Modifier from the engine
                int engineMod = UnitHelper.GetEngineModifier(selectedMechDef);
                initValue += engineMod;
                if (engineMod > 0)
                {
                    details.Add($"<space=2em><color=#00FF00>{engineMod:+0} engine</color>");
                }
                else if (engineMod < 0)
                {
                    details.Add($"<space=2em><color=#FF0000>{engineMod:0} engine</color>");
                }

                // --- PILOT ---
                Pilot selectedPilot = __instance.SelectedPilot.Pilot;

                int tacticsMod = PilotHelper.GetTacticsModifier(selectedPilot);
                details.Add($"<space=2em>{tacticsMod:+0} tactics");
                initValue += tacticsMod;

                int pilotTagsMod = PilotHelper.GetTagsModifier(selectedPilot);
                details.AddRange(PilotHelper.GetTagsModifierDetails(selectedPilot));
                initValue += pilotTagsMod;

                int[] randomnessBounds = PilotHelper.GetRandomnessBounds(selectedPilot);

                // --- LANCE ---
                if (___LC != null)
                {
                    initValue += ___LC.lanceInitiativeModifier;
                    if (___LC.lanceInitiativeModifier > 0)
                    {
                        details.Add($"<space=2em><color=#00FF00>{___LC.lanceInitiativeModifier:+0} lance</color>");
                    }
                    else if (___LC.lanceInitiativeModifier < 0)
                    {
                        details.Add($"<space=2em><color=#FF0000>{___LC.lanceInitiativeModifier:0} lance</color>");
                    }
                }

                // --- Badge ---
                ___initiativeText.SetText($"{initValue}");
                ___initiativeText.color = Color.black;
                ___initiativeColor.SetUIColor(UIColor.White);

                // --- Tooltip ---
                int maxInit = Math.Max(initValue - randomnessBounds[0], Mod.MinPhase);
                int minInit = Math.Max(initValue - randomnessBounds[1], Mod.MinPhase);
                details.Add($"Total:{initValue}");
                details.Add($"<space=2em><color=#FF0000>-{randomnessBounds[0]} to -{randomnessBounds[1]} randomness</color> (piloting)");
                details.Add($"<b>Expected Phase<b>: {maxInit} to {minInit}");

                string             tooltipTitle   = $"{selectedMechDef.Name}: {selectedPilot.Name}";
                string             tooltipText    = String.Join("\n", details.ToArray());
                BaseDescriptionDef initiativeData = new BaseDescriptionDef("LLS_MECH_TT", tooltipTitle, tooltipText, null);
                ___initiativeTooltip.enabled = true;
                ___initiativeTooltip.SetDefaultStateData(TooltipUtilities.GetStateDataFromObject(initiativeData));
            }
        }
示例#20
0
 static void Postfix(LanceConfiguratorPanel __instance, string lanceId, ref LanceDef __result)
 {
     LanceLoadoutSlot[] loadoutSlots = (LanceLoadoutSlot[])AccessTools.Field(typeof(LanceConfiguratorPanel), "loadoutSlots").GetValue(__instance);
     Logger.M.TWL(0, "LanceConfiguratorPanel.CreateLanceDef result:", true);
     Logger.M.WL(0, __result.ToJSON());
 }
示例#21
0
 static void Prefix(LanceConfiguratorPanel __instance, string lanceId)
 {
     LanceLoadoutSlot[] loadoutSlots = (LanceLoadoutSlot[])AccessTools.Field(typeof(LanceConfiguratorPanel), "loadoutSlots").GetValue(__instance);
     Logger.M.TWL(0, "LanceConfiguratorPanel.CreateLanceDef " + lanceId + " slots:" + loadoutSlots.Length, true);
 }
        static void Postfix(LanceHeaderWidget __instance, List <MechDef> mechs, LocalizableText ___simLanceTonnageText, LanceConfiguratorPanel ___LC)
        {
            try {
                if (___LC.IsSimGame)
                {
                    DropCostManager.Instance.CalculateLanceCost(mechs);

                    // longer strings interfere with messages about incorrect lance configurations
                    ___simLanceTonnageText.SetText($"DROP COST: ¢{DropCostManager.Instance.FormattedCosts}   LANCE WEIGHT: {DropCostManager.Instance.LanceTonnage} TONS");
                    if (DCECore.settings.diffMode != EDifficultyType.NotActive)
                    {
                        SGDifficultyIndicatorWidget lanceRatingWidget = (SGDifficultyIndicatorWidget)AccessTools
                                                                        .Field(typeof(LanceHeaderWidget), "lanceRatingWidget").GetValue(__instance);
                        TextMeshProUGUI label = lanceRatingWidget.transform.parent
                                                .GetComponentsInChildren <TextMeshProUGUI>()
                                                .FirstOrDefault(t => t.transform.name == "label-lanceRating");
                        label.text = "Lance Rating";
                        int difficulty = DropCostManager.Instance.RawCost / DCECore.settings.valuePerHalfSkull;
                        DCECore.modLog.Debug?.Write($"Calculated Drop Rating: {difficulty}, total value: {DropCostManager.Instance.RawCost}");
                        lanceRatingWidget.SetDifficulty(difficulty);
                    }
                }
            }
            catch (Exception e) {
                DCECore.modLog.Error?.Write(e);
            }
        }
示例#23
0
        public static void UpdateSlotsCount(this LanceConfiguratorPanel panel, int maxUnits)
        {
            Logger.M.TWL(0, "LanceConfiguratorPanel.UpdateSlotsCount " + maxUnits);
            try {
                LanceLoadoutSlot[] loadoutSlots = (LanceLoadoutSlot[])AccessTools.Field(typeof(LanceConfiguratorPanel), "loadoutSlots").GetValue(panel);
                if (maxUnits <= loadoutSlots.Length)
                {
                    Logger.M.TWL(1, "already fixed");
                    return;
                }
                ;
                GameObject primelayout = panel.transform.FindRecursive("uixPrfPanel_LC_LanceSlots-Widget-MANAGED").gameObject;
                GameObject newLayout   = GameObject.Instantiate(primelayout);
                newLayout.transform.parent = primelayout.transform.parent;
                newLayout.name             = "AlliedSlots";
                GameObject slot1 = newLayout.transform.FindRecursive("lanceSlot1").gameObject;
                GameObject slot2 = newLayout.transform.FindRecursive("lanceSlot2").gameObject;
                GameObject slot3 = newLayout.transform.FindRecursive("lanceSlot3").gameObject;
                GameObject slot4 = newLayout.transform.FindRecursive("lanceSlot4").gameObject;
                primelayout.transform.FindRecursive("simbg").gameObject.active                  = false;
                newLayout.transform.FindRecursive("simbg").gameObject.active                    = false;
                newLayout.transform.FindRecursive("layout-lanceRating").gameObject.active       = false;
                newLayout.transform.FindRecursive("lanceSlotHeader-Campaign").gameObject.active = true;
                newLayout.transform.FindRecursive("txt-unreadyLanceError").gameObject.active    = false;
                TextMeshProUGUI aiText = newLayout.transform.FindRecursive("label-readyLanceHeading").gameObject.GetComponent <TextMeshProUGUI>();
                aiText.text = BiggerDrops.settings.additionalLanceName;
                primelayout.transform.position   = new Vector3(650, 315, primelayout.transform.position.z);
                primelayout.transform.localScale = new Vector3(0.7f, 0.7f, 0.7f);
                newLayout.transform.position     = new Vector3(650, 83, primelayout.transform.position.z);
                newLayout.transform.localScale   = new Vector3(0.7f, 0.7f, 0.7f);

                GameObject deployButton = panel.transform.FindRecursive("DeployBttn-layout").gameObject;
                deployButton.transform.position = new Vector3(1675, 175, deployButton.transform.position.z);

                //LanceLoadoutSlot[] loadoutSlots = (LanceLoadoutSlot[])AccessTools.Field(typeof(LanceConfiguratorPanel), "loadoutSlots").GetValue(panel);
                List <LanceLoadoutSlot> list = loadoutSlots.ToList();
                int addUnits = maxUnits - Settings.DEFAULT_MECH_SLOTS;
                if (addUnits > 0)
                {
                    list.Add(slot1.GetComponent <LanceLoadoutSlot>());
                }
                if (addUnits > 1)
                {
                    list.Add(slot2.GetComponent <LanceLoadoutSlot>());
                }
                if (addUnits > 2)
                {
                    list.Add(slot3.GetComponent <LanceLoadoutSlot>());
                }
                if (addUnits > 3)
                {
                    list.Add(slot4.GetComponent <LanceLoadoutSlot>());
                }
                loadoutSlots = list.ToArray <LanceLoadoutSlot>();
                AccessTools.Field(typeof(LanceConfiguratorPanel), "loadoutSlots").SetValue(panel, loadoutSlots);

                float[]      slotMaxTonnages = (float[])AccessTools.Field(typeof(LanceConfiguratorPanel), "slotMaxTonnages").GetValue(panel);
                float[]      slotMinTonnages = (float[])AccessTools.Field(typeof(LanceConfiguratorPanel), "slotMinTonnages").GetValue(panel);
                List <float> listMaxTonnages = slotMaxTonnages.ToList();
                List <float> listMinTonnages = slotMinTonnages.ToList();
                if (addUnits > 0)
                {
                    listMaxTonnages.Add(-1);
                }
                if (addUnits > 1)
                {
                    listMaxTonnages.Add(-1);
                }
                if (maxUnits > 2)
                {
                    listMaxTonnages.Add(-1);
                }
                if (addUnits > 3)
                {
                    listMaxTonnages.Add(-1);
                }
                if (addUnits > 0)
                {
                    listMinTonnages.Add(-1);
                }
                if (addUnits > 1)
                {
                    listMinTonnages.Add(-1);
                }
                if (addUnits > 2)
                {
                    listMinTonnages.Add(-1);
                }
                if (addUnits > 3)
                {
                    listMinTonnages.Add(-1);
                }
                slotMaxTonnages = listMaxTonnages.ToArray <float>();
                slotMinTonnages = listMinTonnages.ToArray <float>();
                AccessTools.Field(typeof(LanceConfiguratorPanel), "slotMaxTonnages").SetValue(panel, slotMaxTonnages);
                AccessTools.Field(typeof(LanceConfiguratorPanel), "slotMinTonnages").SetValue(panel, slotMinTonnages);
                Logger.M.TWL(0, "Skirmish UI fixed");
            } catch (Exception e) {
                Logger.M.TWL(0, e.ToString());
            }
        }
示例#24
0
        static void Postfix(LanceHeaderWidget __instance, List <MechDef> mechs)
        {
            if (UnityGameInstance.BattleTechGame.Simulation != null)
            {
                if ((DropCostPerMech.Settings.BEXCE && UnityGameInstance.BattleTechGame.Simulation.Constants.Story.MaximumDebt != 42))
                {
                    return;
                }

                try
                {
                    var    settings        = DropCostPerMech.Settings;
                    string freeTonnageText = "";

                    LanceConfiguratorPanel LC = (LanceConfiguratorPanel)ReflectionHelper.GetPrivateField(__instance, "LC");
                    if (LC.IsSimGame)
                    {
                        int   lanceTonnage = 0;
                        float dropCost     = 0f;
                        if (settings.CostByTons)
                        {
                            foreach (MechDef def in mechs)
                            {
                                dropCost     += (def.Chassis.Tonnage * settings.cbillsPerTon);
                                lanceTonnage += (int)def.Chassis.Tonnage;
                            }
                        }
                        else
                        {
                            foreach (MechDef def in mechs)
                            {
                                dropCost     += (Helper.CalculateCBillValue(def) * settings.percentageOfMechCost);
                                lanceTonnage += (int)def.Chassis.Tonnage;
                            }
                        }
                        if (settings.CostByTons && settings.someFreeTonnage && !settings.NewAlgorithm)
                        {
                            freeTonnageText = $"({settings.freeTonnageAmount} TONS FREE)";
                            dropCost        = Math.Max(0f, (lanceTonnage - settings.freeTonnageAmount) * settings.cbillsPerTon);
                        }
                        else if (settings.CostByTons && settings.someFreeTonnage && settings.NewAlgorithm)
                        {
                            freeTonnageText = $"({settings.freeTonnageAmount} TONS FREE)";
                            if (lanceTonnage >= settings.freeTonnageAmount)
                            {
                                dropCost = (lanceTonnage - settings.freeTonnageAmount) * (lanceTonnage - settings.freeTonnageAmount) * settings.cbillsPerTon / settings.freeTonnageAmount;
                            }
                            else
                            {
                                dropCost = 0;
                            }
                        }

                        string formattedDropCost = string.Format("{0:n0}", dropCost);
                        Fields.DropCost          = dropCost;
                        Fields.LanceTonnage      = lanceTonnage;
                        Fields.FormattedDropCost = formattedDropCost;
                        Fields.FreeTonnageText   = freeTonnageText;

                        TextMeshProUGUI simLanceTonnageText = (TextMeshProUGUI)ReflectionHelper.GetPrivateField(__instance, "simLanceTonnageText");
                        // longer strings interfere with messages about incorrect lance configurations
                        simLanceTonnageText.text = $"DROP COST: \n¢{Fields.FormattedDropCost}\nWEIGHT:\n{Fields.LanceTonnage} TONS";
                    }
                }
                catch (Exception e)
                {
                    Logger.Error(e);
                }
            }
        }
            public static void Postfix(LanceConfiguratorPanel __instance, LanceLoadoutSlot[] ___loadoutSlots)
            {
                ModState.IsSimulatorMission = false;
                if (ModInit.Settings.enableSimulationHotKey)
                {
                    var hk = Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift);
                    if (hk)
                    {
                        ModState.IsSimulatorMission = true;
                    }
                }

                bool flag = false;

                foreach (LanceLoadoutSlot lanceLoadoutSlot in ___loadoutSlots)
                {
                    if (lanceLoadoutSlot.SelectedMech != null)
                    {
                        List <Text> mechFieldableWarnings =
                            MechValidationRules.GetMechFieldableWarnings(__instance.dataManager,
                                                                         lanceLoadoutSlot.SelectedMech.MechDef);
                        if (mechFieldableWarnings.Count > 0)
                        {
                            flag = true;
                        }
                    }
                }
                if (!ModState.runContinueConfirmClickedPost && flag)
                {
                    return;
                }


//                ModState.IsTrainingMission = false;
                ModState.AIGetsPlayerMechs = false;
                ModState.PlayerGetsAIMechs = false;
//                ModState.successReq = "";
                ModState.playerMechs   = new List <ModState.playerMechStore>();
                ModState.AIMechs       = new List <ModState.playerMechStore>();
                ModState.deployedMechs = new List <MechDef>();
                ModState.contractID    = __instance.activeContract.Override.ID;

                if (ModInit.Settings.enableSimulationHotKey)
                {
                    var hk = Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift);
                    if (hk)
                    {
                        ModState.IsSimulatorMission = true;
                    }
                }

                var nonNullSlots = ___loadoutSlots.Where(x => x.SelectedMech != null);

                MechDef newMech;
                var     lanceLoadoutSlots = nonNullSlots as LanceLoadoutSlot[] ?? nonNullSlots.ToArray();

                if (ModInit.Settings.SwapUnitsWithAIContractIDs.ContainsKey(contractID))
                {
                    ModState.AIGetsPlayerMechs = true;
                    ModState.PlayerGetsAIMechs = true;
                    foreach (var slot in lanceLoadoutSlots)
                    {
                        if (slot.SelectedMech?.MechDef == null)
                        {
                            continue;
                        }
                        var newGUID = Guid.NewGuid().ToString();
                        newMech = new MechDef(slot.SelectedMech.MechDef, newGUID, true);

                        ModState.playerMechs.Add(new ModState.playerMechStore(newMech, 0));
                        ModInit.modLog.LogMessage($"Added {slot.SelectedMech.MechDef.Description.Name} to player mechs for AI use.");
                        ModState.deployedMechs.Add(slot.SelectedMech.MechDef);
                    }
                }

                else if (ModInit.Settings.DoppelgangerContractIDs.ContainsKey(contractID))
                {
                    ModState.AIGetsPlayerMechs = true;
                    foreach (var slot in lanceLoadoutSlots)
                    {
                        if (slot.SelectedMech?.MechDef == null)
                        {
                            continue;
                        }
                        var newGUID = Guid.NewGuid().ToString();
                        newMech = new MechDef(slot.SelectedMech.MechDef, newGUID, true);

                        ModState.playerMechs.Add(new ModState.playerMechStore(newMech, 0));
                        ModInit.modLog.LogMessage($"Added {slot.SelectedMech.MechDef.Description.Name} to player mechs for AI use.");
                    }
                }

                if (ModInit.Settings.TrainingContractIDs.ContainsKey(contractID) || ModState.IsSimulatorMission || ModState.DynamicTrainingMissionsDict.ContainsKey(__instance.activeContract.GenerateID()))
                {
//                    ModState.successReq = ModInit.Settings.TrainingContractIDs[contractID];
//                    ModState.IsTrainingMission = true;
                    foreach (var slot in lanceLoadoutSlots)
                    {
                        ModState.deployedMechs.Add(slot.SelectedMech.MechDef);
                        ModInit.modLog.LogMessage($"Adding {slot.SelectedMech.MechDef.Name} to deployedMechs for restore");
                    }
                }
            }
示例#26
0
        public static void UpdateSlotsCount(this LanceConfiguratorPanel panel, int maxUnits)
        {
            Logger.M.TWL(0, "LanceConfiguratorPanel.UpdateSlotsCount " + maxUnits);
            try
            {
                var scrollRect = panel.gameObject.AddComponent <ScrollRect>();
                Logger.M.TWL(0, "maxUnits: " + maxUnits);
                LanceLoadoutSlot[] loadoutSlots = (LanceLoadoutSlot[])AccessTools.Field(typeof(LanceConfiguratorPanel), "loadoutSlots").GetValue(panel);

                if (maxUnits <= loadoutSlots.Length)
                {
                    Logger.M.TWL(1, "already fixed");
                    return;
                }
                ;
                GameObject primelayout = panel.transform.FindRecursive("uixPrfPanel_LC_LanceSlots-Widget-MANAGED").gameObject;

                //Setup Lance Count
                List <LanceLoadoutSlot> list = loadoutSlots.ToList();
                //Remove already present lance slots
                int addUnits = maxUnits - Settings.DEFAULT_MECH_SLOTS;
                Logger.M.TWL(0, "addUnits: " + addUnits);

                for (int i = 0; i < DropManagement.baysAlreadyAdded; i++)
                {
                    var slotNum = Settings.DEFAULT_MECH_SLOTS + i;
                    if (list[slotNum])
                    {
                        list.RemoveAt(slotNum);
                    }
                    else
                    {
                        Logger.M.TWL(0, "Error: index not found in UpdateSlotsCount: " + i.ToString());
                    }
                }

                //Create a copy of the lanceslots control
                var             betaLayout = createNewLancePanel(primelayout, list, addUnits, "BetaLance");
                TextMeshProUGUI aiText     = betaLayout.transform.FindRecursive("label-readyLanceHeading").gameObject.GetComponent <TextMeshProUGUI>();
                aiText.text = DropManagement.settings.secondLanceName;
                GameObject charlieLayout = null;

                RectTransform contentTransform = createScrollView(scrollRect, primelayout);
                primelayout.transform.SetParent(contentTransform, true);
                betaLayout.transform.SetParent(contentTransform, true);

                if (addUnits > 4)
                {
                    charlieLayout = createNewLancePanel(primelayout, list, addUnits, "CharlieLance"); //TODO: add and handle the slots from Charlie lance
                    aiText        = charlieLayout.transform.FindRecursive("label-readyLanceHeading").gameObject.GetComponent <TextMeshProUGUI>();
                    aiText.text   = DropManagement.settings.thirdLanceName;
                    charlieLayout.transform.position   = new Vector3(650, 50, primelayout.transform.position.z);
                    charlieLayout.transform.localScale = new Vector3(0.7f, 0.5f, 0.5f);
                    charlieLayout.transform.SetParent(contentTransform, true);
                }
                loadoutSlots = list.ToArray <LanceLoadoutSlot>();

                //shrink both slots to 70% and reposition
                primelayout.transform.position   = new Vector3(650, 395, primelayout.transform.position.z);
                primelayout.transform.localScale = new Vector3(0.7f, 0.5f, 0.5f);
                betaLayout.transform.position    = new Vector3(650, 200, primelayout.transform.position.z);
                betaLayout.transform.localScale  = new Vector3(0.7f, 0.5f, 0.5f);

                GameObject deployButton = panel.transform.FindRecursive("DeployBttn-layout").gameObject;
                deployButton.transform.position = new Vector3(1675, 175, deployButton.transform.position.z);

                AccessTools.Field(typeof(LanceConfiguratorPanel), "loadoutSlots").SetValue(panel, loadoutSlots);

                float[]      slotMaxTonnages = (float[])AccessTools.Field(typeof(LanceConfiguratorPanel), "slotMaxTonnages").GetValue(panel);
                float[]      slotMinTonnages = (float[])AccessTools.Field(typeof(LanceConfiguratorPanel), "slotMinTonnages").GetValue(panel);
                List <float> listMaxTonnages = slotMaxTonnages.ToList();
                List <float> listMinTonnages = slotMinTonnages.ToList();

                //Logger.M.TWL(0, string.Format("Debug BiigerDrops.baysAlreadAdded: {0}", DropManagement.baysAlreadyAdded), true);
                //Logger.M.TWL(0, string.Format("Debug Settings.DEFAULT_MECH_SLOTS: {0}", Settings.DEFAULT_MECH_SLOTS), true);

                for (int i = 0; i < DropManagement.baysAlreadyAdded; i++)
                {
                    listMaxTonnages.RemoveAt(Settings.DEFAULT_MECH_SLOTS + i);
                    listMinTonnages.RemoveAt(Settings.DEFAULT_MECH_SLOTS + i);
                }
                if (addUnits > 0)
                {
                    listMaxTonnages.Add(-1);
                }
                if (addUnits > 1)
                {
                    listMaxTonnages.Add(-1);
                }
                if (addUnits > 2)
                {
                    listMaxTonnages.Add(-1);
                }
                if (addUnits > 3)
                {
                    listMaxTonnages.Add(-1);
                }
                if (addUnits > 4)
                {
                    listMaxTonnages.Add(-1);
                }
                if (addUnits > 5)
                {
                    listMaxTonnages.Add(-1);
                }
                if (addUnits > 6)
                {
                    listMaxTonnages.Add(-1);
                }
                if (addUnits > 7)
                {
                    listMaxTonnages.Add(-1);
                }
                if (addUnits > 0)
                {
                    listMinTonnages.Add(-1);
                }
                if (addUnits > 1)
                {
                    listMinTonnages.Add(-1);
                }
                if (addUnits > 2)
                {
                    listMinTonnages.Add(-1);
                }
                if (addUnits > 3)
                {
                    listMinTonnages.Add(-1);
                }
                if (addUnits > 4)
                {
                    listMinTonnages.Add(-1);
                }
                if (addUnits > 5)
                {
                    listMinTonnages.Add(-1);
                }
                if (addUnits > 6)
                {
                    listMinTonnages.Add(-1);
                }
                if (addUnits > 7)
                {
                    listMinTonnages.Add(-1);
                }
                slotMaxTonnages = listMaxTonnages.ToArray <float>();
                slotMinTonnages = listMinTonnages.ToArray <float>();
                AccessTools.Field(typeof(LanceConfiguratorPanel), "slotMaxTonnages").SetValue(panel, slotMaxTonnages);
                AccessTools.Field(typeof(LanceConfiguratorPanel), "slotMinTonnages").SetValue(panel, slotMinTonnages);
                DropManagement.baysAlreadyAdded = addUnits;
                Logger.M.TWL(0, "Skirmish UI fixed");
            }
            catch (Exception e)
            {
                Logger.M.TWL(0, e.ToString());
            }
        }
示例#27
0
        static void Postfix(LanceHeaderWidget __instance, List <MechDef> mechs, LocalizableText ___simLanceTonnageText, LanceConfiguratorPanel ___LC)
        {
            try {
                Settings settings        = Helper.LoadSettings();
                string   freeTonnageText = "";


                if (___LC.IsSimGame)
                {
                    int   lanceTonnage = 0;
                    float dropCost     = 0f;
                    if (settings.CostByTons)
                    {
                        foreach (MechDef def in mechs)
                        {
                            dropCost     += (def.Chassis.Tonnage * settings.cbillsPerTon);
                            lanceTonnage += (int)def.Chassis.Tonnage;
                        }
                    }
                    else
                    {
                        foreach (MechDef def in mechs)
                        {
                            dropCost     += (Helper.CalculateCBillValue(def) * settings.percentageOfMechCost);
                            lanceTonnage += (int)def.Chassis.Tonnage;
                        }
                    }
                    if (settings.CostByTons && settings.someFreeTonnage)
                    {
                        freeTonnageText = $"({settings.freeTonnageAmount} TONS FREE)";
                        dropCost        = Math.Max(0f, (lanceTonnage - settings.freeTonnageAmount) * settings.cbillsPerTon);
                    }

                    string formattedDropCost = string.Format("{0:n0}", dropCost);
                    Fields.DropCost          = dropCost;
                    Fields.LanceTonnage      = lanceTonnage;
                    Fields.FormattedDropCost = formattedDropCost;
                    Fields.FreeTonnageText   = freeTonnageText;

                    // longer strings interfere with messages about incorrect lance configurations
                    ___simLanceTonnageText.SetText($"DROP COST: ¢{Fields.FormattedDropCost}   LANCE WEIGHT: {Fields.LanceTonnage} TONS {Fields.FreeTonnageText}");
                }
            }
            catch (Exception e) {
                Logger.LogError(e);
            }
        }
        // return false so original function does not get called.
        public static bool Prefix(LanceLoadoutSlot __instance, GameObject ___initiativeObj, TextMeshProUGUI ___initiativeText,
                                  UIColorRefTracker ___initiativeColor, HBSTooltip ___initiativeTooltip, LanceConfiguratorPanel ___LC)
        {
            if (___initiativeObj == null || ___initiativeText == null || ___initiativeColor == null)
            {
                return(false);
            }
            if (__instance.SelectedMech == null || __instance.SelectedMech.MechDef == null || __instance.SelectedMech.MechDef.Chassis == null)
            {
                ___initiativeObj.SetActive(false);
                return(false);
            }
            if (__instance.SelectedPilot == null || __instance.SelectedPilot.Pilot == null || __instance.SelectedPilot.Pilot.pilotDef == null)
            {
                ___initiativeObj.SetActive(false);
                return(false);
            }
            ___initiativeObj.SetActive(true);

            int num  = 1;            // default to assault phase
            int num2 = 0;            // default to no modification by effects

            float f_walkSpeed = __instance.SelectedMech.MechDef.Chassis.MovementCapDef.MaxWalkDistance;

            if (f_walkSpeed >= TheEngineInitiative.Settings.MechPhaseSpecialMinSpeed)
            {
                num = 5;                  //special phase
            }
            else if (f_walkSpeed >= TheEngineInitiative.Settings.MechPhaseLightMinSpeed)
            {
                num = 4;                  //light phase
            }
            else if (f_walkSpeed >= TheEngineInitiative.Settings.MechPhaseMediumMinSpeed)
            {
                num = 3;                  //medium phase
            }
            else if (f_walkSpeed >= TheEngineInitiative.Settings.MechPhaseHeavyMinSpeed)
            {
                num = 2;                  //heavy phase
            }
            // check if pilot mods initiative
            if (__instance.SelectedPilot.Pilot.pilotDef.AbilityDefs != null)
            {
                foreach (AbilityDef abilityDef in __instance.SelectedPilot.Pilot.pilotDef.AbilityDefs)
                {
                    foreach (EffectData effect in abilityDef.EffectData)
                    {
                        if (MechStatisticsRules.GetInitiativeModifierFromEffectData(effect, true, null) == 0)
                        {
                            num2 += MechStatisticsRules.GetInitiativeModifierFromEffectData(effect, false, null);
                        }
                    }
                }
            }
            // check if any of the mech's inventory changes initiative.
            if (__instance.SelectedMech.MechDef.Inventory != null)
            {
                foreach (MechComponentRef mechComponentRef in __instance.SelectedMech.MechDef.Inventory)
                {
                    if (mechComponentRef.Def != null && mechComponentRef.Def.statusEffects != null)
                    {
                        foreach (EffectData effect2 in mechComponentRef.Def.statusEffects)
                        {
                            if (MechStatisticsRules.GetInitiativeModifierFromEffectData(effect2, true, null) == 0)
                            {
                                num2 += MechStatisticsRules.GetInitiativeModifierFromEffectData(effect2, false, null);
                            }
                        }
                    }
                }
            }
            // is there a lance bonus?
            int num3 = 0;

            if (___LC != null)
            {
                num3 = ___LC.lanceInitiativeModifier;
            }
            num2 += num3;

            // make sure initiative is within the valid range.
            int num4 = Mathf.Clamp(num + num2, 1, 5);

            //set our text.
            ___initiativeText.SetText($"{num4}");
            if (___initiativeTooltip != null)
            {
                // build the tooltip.  Going to use the mech's name and tell where its speed puts it, initiative-wise.
                string tooltipTitle = $"{__instance.SelectedMech.MechDef.Name}";
                string tooltipText  = "A max walking speed of " + $"{f_walkSpeed}" + "m per turn means this mech moves in initiative phase " + $"{num}" + ".";

                // if there are effects, tell the player what they've changed initiative to.
                if (num2 != 0)
                {
                    tooltipText += " Effects have modified this to phase " + $"{num4}" + ".";
                }
                BaseDescriptionDef initiativeData = new BaseDescriptionDef("MB_MIW_MECH_TT", tooltipTitle, tooltipText, null);
                ___initiativeTooltip.enabled = true;
                ___initiativeTooltip.SetDefaultStateData(TooltipUtilities.GetStateDataFromObject(initiativeData));
            }
            // if we've been bumped up, make it gold, if bumped down, make it red, else white.
            ___initiativeColor.SetUIColor((num2 > 0) ? UIColor.Gold : ((num2 < 0) ? UIColor.Red : UIColor.White));

            return(false);
        }