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); } }
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."); } }
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; } }
static bool Prefix(LanceConfiguratorPanel __instance, ref LanceConfiguration __result) { try { return(false); } catch (Exception e) { Logger.LogError(e); return(false); } }
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); } }
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}"; }
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()); } }
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); }
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); } }
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."); } }
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; }
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); } }
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); }
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)); } }
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)); } }
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()); }
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); } }
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()); } }
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"); } } }
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()); } }
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); }