public static void Postfix(SGBarracksRosterSlot __instance) { if (__instance.Pilot == null) { return; } HBSTooltip tooltip = __instance.gameObject.GetComponent <HBSTooltip>() ?? __instance.gameObject.AddComponent <HBSTooltip>(); Pilot pilot = __instance.Pilot; string Desc = tooltip.GetText(); if (String.IsNullOrEmpty(Desc)) { Desc = ""; } foreach (PilotTooltipTag pqTag in Main.settings.pqTooltipTags) { if (pilot.pilotDef.PilotTags.Contains(pqTag.tag)) { Desc += $"{pqTag.tooltipText}\n\n"; } } Desc += PilotQuirkManager.Instance.getPilotToolTip(pilot); Desc += "<b>Pilot Affinities:</b>\n\n"; Desc += PilotAffinityManager.Instance.getPilotToolTip(pilot); var descriptionDef = new BaseDescriptionDef("Tags", pilot.Callsign, Desc, null); tooltip.SetDefaultStateData(TooltipUtilities.GetStateDataFromObject(descriptionDef)); }
static bool Prefix(SGNavigationActiveFactionWidget __instance, List <string> activeFactions, string OwnerFaction, List <HBSButton> ___FactionButtons, List <Image> ___FactionIcons, SimGameState ___simState) { try { ___FactionButtons.ForEach(delegate(HBSButton btn) { btn.gameObject.SetActive(false); }); int index = 0; foreach (string faction in activeFactions) { FactionDef factionDef = FactionEnumeration.GetFactionByName(faction).FactionDef; ___FactionIcons[index].sprite = factionDef.GetSprite(); HBSTooltip component = ___FactionIcons[index].GetComponent <HBSTooltip>(); if (component != null) { component.SetDefaultStateData(TooltipUtilities.GetStateDataFromObject(factionDef)); } ___FactionButtons[index].SetState(ButtonState.Enabled, false); ___FactionButtons[index].gameObject.SetActive(true); index++; } return(false); } catch (Exception e) { Logger.LogError(e); return(true); } }
static void Postfix(SG_HiringHall_Screen __instance, GameObject ___WarningAreaObject, HBSDOTweenButton ___HireButton, LocalizableText ___WarningText, HBSTooltip ___NoHireTooltip, Pilot ___selectedPilot) { Mod.Log.Debug?.Write("Updating MWSelectedPanel:WarningsCheck"); // Use the warnings area to display the contract length terms if (___selectedPilot != null && ___HireButton.State == ButtonState.Enabled) { ___WarningAreaObject.SetActive(true); CrewDetails details = ModState.GetCrewDetails(___selectedPilot.pilotDef); string contractTermS = new Text(Mod.LocalizedText.Labels[ModText.LT_Crew_Contract_Term], new object[] { details.ContractTerm } ).ToString(); ___WarningText.SetText(contractTermS); } }
public static void Postfix(SGContractsWidget __instance, Contract contract, HBSTooltip ___ContractTypeTooltip) { string arg; if (contract.IsPriorityContract) { arg = "Priority"; } else { arg = contract.Override.ContractTypeValue.Name; } var text2 = string.Format("ContractType{0}", arg); text2.Replace(" ", null); var specDesc = Descriptions.GetMissionSpecializationDescription(contract.Override.ContractTypeValue.Name); if (!string.IsNullOrEmpty(text2) && sim.DataManager.Exists(BattleTechResourceType.BaseDescriptionDef, text2)) { var def2 = sim.DataManager.BaseDescriptionDefs.Get(text2); if (!string.IsNullOrEmpty(specDesc)) { if (!def2.Details.Contains(specDesc)) { var details = def2.GetLocalizedDetails(); details.Append(specDesc); var deets = details.ToString(); Traverse.Create(def2).Field("localizedDetails").SetValue(details); Traverse.Create(def2).Property("Details").SetValue(deets); } } ___ContractTypeTooltip.SetDefaultStateData(TooltipUtilities.GetStateDataFromObject(def2)); } }
public static void Postfix(HBSTooltip RoninTooltip, Pilot pilot) { if (RoninTooltip != null) { string text; if (pilot.pilotDef.IsVanguard || pilot.pilotDef.IsRonin) { text = "UnitMechWarriorSpecial"; } else { if (pilot != UnityGameInstance.BattleTechGame.Simulation.Commander) { return; } text = "UnitMechWarriorCommander"; } if (!string.IsNullOrEmpty(text) && UnityGameInstance.BattleTechGame.DataManager.BaseDescriptionDefs.Exists(text)) { BaseDescriptionDef def = UnityGameInstance.BattleTechGame.DataManager.BaseDescriptionDefs.Get(text); RoninTooltip.SetDefaultStateData(TooltipUtilities.GetStateDataFromObject(def)); } } }
public static void AddVariantsToDescriptions( MechBayChassisInfoWidget __instance, ChassisDef ___selectedChassis, TextMeshProUGUI ___mechDetails, HBSTooltip ___chassisStorageTooltip, GameObject ___readyBtnObj, GameObject ___partsCountObj, TextMeshProUGUI ___partsCountText) { if (___selectedChassis == null) { return; } if (!Control.Settings.AssemblyVariants) { return; } var list = ChassisHandler.GetCompatible(___selectedChassis.Description.Id); if (___selectedChassis.MechPartCount != 0) { int min = ChassisHandler.GetInfo(___selectedChassis.Description.Id).MinParts; if (___selectedChassis.MechPartCount >= ___selectedChassis.MechPartMax) { ___readyBtnObj.SetActive(true); ___partsCountObj.SetActive(false); ___chassisStorageTooltip.SetDefaultStateData(TooltipUtilities.GetStateDataFromObject("Enough parts to assemble: Press Ready to move to a Bay")); } else { if (list == null || ___selectedChassis.MechPartCount < min || list.Sum(i => ChassisHandler.GetCount(i.Description.Id)) < ___selectedChassis.MechPartMax) { ___readyBtnObj.SetActive(false); ___partsCountObj.SetActive(true); ___partsCountText.SetText($"{___selectedChassis.MechPartCount} / {___selectedChassis.MechPartMax}"); ___chassisStorageTooltip.SetDefaultStateData(TooltipUtilities.GetStateDataFromObject($"Chassis still needs at least {min} base and total {___selectedChassis.MechPartMax} compatible parts to be completed")); } else { ___readyBtnObj.SetActive(true); ___partsCountObj.SetActive(false); ___chassisStorageTooltip.SetDefaultStateData(TooltipUtilities.GetStateDataFromObject("Chassis can by assembled using other parts: Press Ready to move to a Bay")); } } } else { ___readyBtnObj.SetActive(true); ___partsCountObj.SetActive(false); ___chassisStorageTooltip.SetDefaultStateData(TooltipUtilities.GetStateDataFromObject("Chassis in storage: Press Ready to move to a Bay")); } string add = ""; if (list == null) { add = $"\n<color=#FFFF00>Special mech: cannot be assembled using other variants</color>"; } else if (list.Count > 1) { add = $"\n<color=#32CD32>Compatible with owned variants:"; if (list.Count > Control.Settings.MaxVariantsInDescription + 1) { int showed = 0; foreach (var mechDef in list) { if (mechDef.ChassisID == ___selectedChassis.Description.Id) { continue; } add += "\n" + new Text(mechDef.Description.UIName).ToString(); showed += 1; if (showed == Control.Settings.MaxVariantsInDescription - 1) { break; } } add += $"\n and {Control.Settings.MaxVariantsInDescription - showed} other variants</color>"; } else { foreach (var mechDef in list) { if (mechDef.ChassisID == ___selectedChassis.Description.Id) { continue; } add += "\n" + new Text(mechDef.Description.UIName).ToString(); } add += "</color>"; } } ___mechDetails.SetText(___mechDetails.text + add); }
static void Postfix(Pilot ___pilot, GameObject ___cantBuyMRBOverlay, HBSTooltip ___cantBuyToolTip, LocalizableText ___costText, UIColorRefTracker ___costTextColor) { if (ModState.SimGameState == null) { return; // Only patch if we're in SimGame } Mod.Log.Debug?.Write($"Refreshing availability for pilot: {___pilot.Name}"); // TODO: This may need to be improved, as it's used inside a loop. Maybe write to company stats? CrewDetails details = ModState.GetCrewDetails(___pilot.pilotDef); Mod.Log.Debug?.Write($" -- pilot requires: {details.Size} berths"); int usedBerths = CrewHelper.UsedBerths(ModState.SimGameState.PilotRoster); int availableBerths = ModState.SimGameState.GetMaxMechWarriors() - usedBerths; Mod.Log.Debug?.Write($"AvailableBerths: {availableBerths} = max: {ModState.SimGameState.GetMaxMechWarriors()} - used: {usedBerths}"); // Check berths limitations if (details.Size > availableBerths) { Mod.Log.Info?.Write($"Pilot {___pilot.Name} cannot be hired, not enough berths (needs {details.Size})"); ___cantBuyMRBOverlay.SetActive(true); HBSTooltipStateData tooltipStateData = new HBSTooltipStateData(); tooltipStateData.SetContextString($"DM.BaseDescriptionDefs[{ModConsts.Tooltip_NotEnoughBerths}]"); ___cantBuyToolTip.SetDefaultStateData(tooltipStateData); } // Check type limitations if (!CrewHelper.CanHireMoreCrewOfType(details)) { Mod.Log.Info?.Write($"Pilot {___pilot.Name} cannot be hired, too many of type already employed."); ___cantBuyMRBOverlay.SetActive(true); HBSTooltipStateData tooltipStateData = new HBSTooltipStateData(); tooltipStateData.SetContextString($"DM.BaseDescriptionDefs[{ModConsts.Tooltip_TooManyOfType}]"); ___cantBuyToolTip.SetDefaultStateData(tooltipStateData); } else { Mod.Log.Debug?.Write($"Pilot {___pilot.Name} can be hired, no limiations on max."); } // Set the prices //int purchaseCostAfterReputationModifier = ModState.SimGameState.CurSystem.GetPurchaseCostAfterReputationModifier( // ModState.SimGameState.GetMechWarriorHiringCost(___pilot.pilotDef) // ); // TODO: Apply system cost multiplier // Hiring cost is influenced by: // - current morale rating // - any faction alignment for units // - any reputation modifiers ___costText.SetText(SimGameState.GetCBillString(details.HiringBonus)); UIColor costColor = UIColor.Red; if (details.HiringBonus <= ModState.SimGameState.Funds) { costColor = UIColor.White; } ___costTextColor.SetUIColor(costColor); }
static void Postfix(SGBarracksRosterSlot __instance, Pilot ___pilot, GameObject ___AbilitiesObject, LocalizableText ___callsign, Image ___portrait, SVGImage ___roninIcon, SVGImage ___veteranIcon, LocalizableText ___expertise, HBSTooltip ___ExpertiseTooltip) { if (ModState.SimGameState == null) { return; // Only patch if we're in SimGame } if (___pilot == null) { return; } Mod.Log.Debug?.Write($"POST Calling refresh for pilot: {___pilot.Name}"); CrewDetails details = ModState.GetCrewDetails(___pilot.pilotDef); // Find the common GameObjects we need to manipulate GameObject portraitOverride = GetOrCreateProfileOverride(___portrait); if (details.IsAerospaceCrew || details.IsMechTechCrew || details.IsMedTechCrew || details.IsVehicleCrew) { portraitOverride.SetActive(true); } else { portraitOverride.SetActive(false); } GameObject crewBlock = GetOrCreateCrewBlock(___portrait.gameObject); if (details.IsAerospaceCrew || details.IsMechTechCrew || details.IsMedTechCrew) { crewBlock.SetActive(true); } else { crewBlock.SetActive(false); } GameObject mwStats = ___portrait.transform.parent.parent.gameObject.FindFirstChildNamed(ModConsts.GO_HBS_Profile_Stats_Block); if (details.IsAerospaceCrew || details.IsMechTechCrew || details.IsMedTechCrew) { mwStats.SetActive(false); } else { mwStats.SetActive(true); } GameObject layoutTitleGO = __instance.GameObject.FindFirstChildNamed(ModConsts.GO_HBS_Profile_Layout_Title); Image layoutTitleImg = layoutTitleGO.GetComponent <Image>(); if (details.IsAerospaceCrew) { Mod.Log.Debug?.Write($" -- pilot is Aerospace crew"); layoutTitleImg.color = Mod.Config.Crew.AerospaceColor; ___portrait.gameObject.SetActive(false); ___AbilitiesObject.SetActive(false); ___roninIcon.gameObject.SetActive(false); ___veteranIcon.gameObject.SetActive(false); // Set the portrait icon SVGAsset icon = ModState.SimGameState.DataManager.GetObjectOfType <SVGAsset>(Mod.Config.Icons.CrewPortrait_Aerospace, BattleTechResourceType.SVGAsset); if (icon == null) { Mod.Log.Warn?.Write($"ERROR READING ICON: {Mod.Config.Icons.CrewPortrait_Aerospace}"); } SVGImage image = portraitOverride.GetComponentInChildren <SVGImage>(); image.vectorGraphics = icon; // Set the crew size LocalizableText[] texts = crewBlock.GetComponentsInChildren <LocalizableText>(); LocalizableText lt1 = texts[0]; string sizeText = new Localize.Text(Mod.LocalizedText.Labels[ModText.LT_Crew_Size], new object[] { details.SizeLabel, details.Size }).ToString(); lt1.SetText(sizeText); // Force the font size here, otherwise the right hand panel isn't correct lt1.fontSize = 16f; lt1.fontSizeMin = 16f; lt1.fontSizeMax = 16f; LocalizableText lt2 = texts[1]; string skillText = new Localize.Text(Mod.LocalizedText.Labels[ModText.LT_Skill_Aerospace_Points], new object[] { details.Value }).ToString(); lt2.SetText(skillText); // Force the font size here, otherwise the right hand panel isn't correct lt2.fontSize = 16f; lt2.fontSizeMin = 16f; lt2.fontSizeMax = 16f; // Set the expertise of the crew ___expertise.color = Color.white; ___expertise.SetText(details.ExpertiseLabel); } else if (details.IsMechTechCrew) { Mod.Log.Debug?.Write($" -- pilot is Mechtech crew"); layoutTitleImg.color = Mod.Config.Crew.MechTechCrewColor; ___portrait.gameObject.SetActive(false); ___AbilitiesObject.SetActive(false); ___roninIcon.gameObject.SetActive(false); ___veteranIcon.gameObject.SetActive(false); // Set the portrait icon SVGAsset icon = ModState.SimGameState.DataManager.GetObjectOfType <SVGAsset>(Mod.Config.Icons.CrewPortrait_MechTech, BattleTechResourceType.SVGAsset); if (icon == null) { Mod.Log.Warn?.Write($"ERROR READING ICON: {Mod.Config.Icons.CrewPortrait_MechTech}"); } SVGImage image = portraitOverride.GetComponentInChildren <SVGImage>(); image.vectorGraphics = icon; // Set the crew size LocalizableText[] texts = crewBlock.GetComponentsInChildren <LocalizableText>(); LocalizableText lt1 = texts[0]; string sizeText = new Localize.Text(Mod.LocalizedText.Labels[ModText.LT_Crew_Size], new object[] { details.SizeLabel, details.Size }).ToString(); lt1.SetText(sizeText); // Force the font size here, otherwise the right hand panel isn't correct lt1.fontSize = 16f; lt1.fontSizeMin = 16f; lt1.fontSizeMax = 16f; LocalizableText lt2 = texts[1]; string skillText = new Localize.Text(Mod.LocalizedText.Labels[ModText.LT_Skill_MechTech_Points], new object[] { details.Value }).ToString(); lt2.SetText(skillText); // Force the font size here, otherwise the right hand panel isn't correct lt2.fontSize = 16f; lt2.fontSizeMin = 16f; lt2.fontSizeMax = 16f; // Set the expertise of the crew ___expertise.color = Color.white; ___expertise.SetText(details.ExpertiseLabel); } else if (details.IsMedTechCrew) { Mod.Log.Debug?.Write($" -- pilot is Medtech crew"); layoutTitleImg.color = Mod.Config.Crew.MedTechCrewColor; ___portrait.gameObject.SetActive(false); ___AbilitiesObject.SetActive(false); ___roninIcon.gameObject.SetActive(false); ___veteranIcon.gameObject.SetActive(false); // Set the portrait icon SVGAsset icon = ModState.SimGameState.DataManager.GetObjectOfType <SVGAsset>(Mod.Config.Icons.CrewPortrait_MedTech, BattleTechResourceType.SVGAsset); if (icon == null) { Mod.Log.Warn?.Write($"ERROR READING ICON: {Mod.Config.Icons.CrewPortrait_MedTech}"); } SVGImage image = portraitOverride.GetComponentInChildren <SVGImage>(); image.vectorGraphics = icon; // Set the crew size LocalizableText[] texts = crewBlock.GetComponentsInChildren <LocalizableText>(); LocalizableText lt1 = texts[0]; string sizeText = new Localize.Text(Mod.LocalizedText.Labels[ModText.LT_Crew_Size], new object[] { details.SizeLabel, details.Size }).ToString(); lt1.SetText(sizeText); // Force the font size here, otherwise the right hand panel isn't correct lt1.fontSize = 16f; lt1.fontSizeMin = 16f; lt1.fontSizeMax = 16f; LocalizableText lt2 = texts[1]; string skillText = new Localize.Text(Mod.LocalizedText.Labels[ModText.LT_Skill_MedTech_Points], new object[] { details.Value }).ToString(); lt2.SetText(skillText); // Force the font size here, otherwise the right hand panel isn't correct lt2.fontSize = 16f; lt2.fontSizeMin = 16f; lt2.fontSizeMax = 16f; // Set the expertise of the crew ___expertise.color = Color.white; ___expertise.SetText(details.ExpertiseLabel); } else if (details.IsVehicleCrew) { Mod.Log.Debug?.Write($" -- pilot is Vehicle crew"); layoutTitleImg.color = Mod.Config.Crew.VehicleCrewColor; ___portrait.gameObject.SetActive(false); ___roninIcon.gameObject.SetActive(false); ___callsign.SetText("VCREW: " + ___pilot.Callsign); // Set the portrait icon SVGAsset icon = ModState.SimGameState.DataManager.GetObjectOfType <SVGAsset>(Mod.Config.Icons.CrewPortrait_Vehicle, BattleTechResourceType.SVGAsset); if (icon == null) { Mod.Log.Warn?.Write($"ERROR READING ICON: {Mod.Config.Icons.CrewPortrait_Vehicle}"); } SVGImage image = portraitOverride.GetComponentInChildren <SVGImage>(); image.vectorGraphics = icon; ___expertise.color = Color.white; } else { Mod.Log.Debug?.Write($" -- pilot is Mechwarrior"); ___portrait.gameObject.SetActive(true); } Mod.Log.Debug?.Write($"LayoutTitleImg color set to: {layoutTitleImg.color}"); }
// 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); }
// pass in a bunch of ___ variables so we can get access to private members of MechBayMechInfoObject. // And we'll return false so that the original function doesn't get called. public static bool Prefix(MechBayMechInfoWidget __instance, MechDef ___selectedMech, GameObject ___initiativeObj, TextMeshProUGUI ___initiativeText, HBSTooltip ___initiativeTooltip) { if (___initiativeObj == null || ___initiativeText == null) { return(false); } if (___selectedMech == null) { ___initiativeObj.SetActive(false); return(false); } ___initiativeObj.SetActive(true); int num = 1; // default to assault phase float f_walkSpeed = ___selectedMech.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 } ___initiativeText.SetText($"{num}"); if (___initiativeTooltip != null) { // build the tooltip. Going to use the mech's name and tell where its speed puts it, initiative-wise. string tooltipTitle = $"{___selectedMech.Name}"; string tooltipText = "A max walking speed of " + $"{f_walkSpeed}" + "m per turn means this mech moves in initiative phase " + $"{num}" + "."; BaseDescriptionDef initiativeData = new BaseDescriptionDef("MB_MIW_MECH_TT", tooltipTitle, tooltipText, null); ___initiativeTooltip.enabled = true; ___initiativeTooltip.SetDefaultStateData(TooltipUtilities.GetStateDataFromObject(initiativeData)); } return(false); }
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(MechBayMechInfoWidget __instance, MechDef ___selectedMech, GameObject ___initiativeObj, TextMeshProUGUI ___initiativeText, HBSTooltip ___initiativeTooltip) { Mod.Log.Trace?.Write("MBMIW:SI:post - entered."); if (___initiativeObj == null || ___initiativeText == null) { return; } if (___selectedMech == null) { ___initiativeObj.SetActive(true); ___initiativeText.SetText("-"); } else { List <string> details = new List <string>(); // Static initiative from tonnage int initPhase = PhaseHelper.TonnageToPhase((int)Math.Ceiling(___selectedMech.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(___selectedMech); 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}"); // No Lance bonus // No Pilot bonus // --- Badge --- int summaryInitLabel = initLabelVal + componentBonus; if (summaryInitLabel > Mod.MaxPhase) { summaryInitLabel = Mod.MaxPhase; } else if (summaryInitLabel < Mod.MinPhase) { summaryInitLabel = Mod.MinPhase; } ___initiativeObj.SetActive(true); ___initiativeText.SetText($"{summaryInitLabel}"); // --- Tooltip --- string tooltipTitle = $"{___selectedMech.Name}"; string detailsS = String.Join("\n", details.ToArray()); string tooltipText = new Text(Mod.Config.LocalizedText[ModConfig.LT_MB_TT_SUMMARY], new object[] { detailsS, summaryInitLabel }).ToString(); BaseDescriptionDef initiativeData = new BaseDescriptionDef("MB_MIW_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)); } }
public static void Postfix(MechBayMechInfoWidget __instance, MechDef ___selectedMech, GameObject ___initiativeObj, TextMeshProUGUI ___initiativeText, HBSTooltip ___initiativeTooltip) { if (___initiativeObj == null || ___initiativeText == null) { return; } //SkillBasedInit.Logger.Log($"MechBayMechInfoWidget::SetInitiative::post - disabling text"); if (___selectedMech == null) { ___initiativeObj.SetActive(true); ___initiativeText.SetText("-"); } else { List <string> details = new List <string>(); // Static initiative from tonnage float tonnage = ___selectedMech.Chassis.Tonnage; int tonnageMod = UnitHelper.GetTonnageModifier(tonnage); details.Add($"Tonnage Base: {tonnageMod}"); // Any modifiers that come from the chassis/mech/vehicle defs int componentsMod = UnitHelper.GetNormalizedComponentModifier(___selectedMech); 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(___selectedMech); 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>"); } // --- Badge --- ___initiativeObj.SetActive(true); ___initiativeText.SetText($"{tonnageMod + componentsMod + engineMod}"); // --- Tooltip --- int maxInit = Math.Max(tonnageMod + componentsMod + engineMod, Mod.MinPhase); details.Add($"Expected Phase: <b>{maxInit}</b> "); string tooltipTitle = $"{___selectedMech.Name}"; string tooltipText = String.Join("\n", details.ToArray()); BaseDescriptionDef initiativeData = new BaseDescriptionDef("MB_MIW_MECH_TT", tooltipTitle, tooltipText, null); ___initiativeTooltip.enabled = true; ___initiativeTooltip.SetDefaultStateData(TooltipUtilities.GetStateDataFromObject(initiativeData)); } }
public static void Postfix(SGBarracksSkillPip __instance, SGBarracksSkillPip.PurchaseState purchaseState, bool canClick, bool showXP, bool needXP, bool isLocked, int ___idx, string ___type, HBSTooltip ___AbilityTooltip) { if (purchaseState == SGBarracksSkillPip.PurchaseState.Unselected) { var sim = UnityGameInstance.BattleTechGame.Simulation; var abilityDictionaries = sim.AbilityTree.Select(x => x.Value).ToList(); var abilityDefs = new List <AbilityDef>(); foreach (var abilityDictionary in abilityDictionaries) { abilityDefs.AddRange(abilityDictionary[___idx].Where(x => x.ReqSkill.ToString() == ___type)); } var title = $"{___type}: Level {___idx+1} Ability Options"; var desc = ""; foreach (var ability in abilityDefs) { var abilityFilter = modSettings.abilityReqs.Values.SelectMany(x => x).ToList(); List <AbilityDef> abilitiesWithReqs = abilityDefs.Where(x => abilityFilter.Any(y => y.Equals(x.Id))).ToList(); if (abilitiesWithReqs.Contains(ability)) { var reqAbilityName = modSettings.abilityReqs.FirstOrDefault(x => x.Value.Contains(ability.Description.Id)).Key; var allAbilities = new List <AbilityDef>(); allAbilities = sim.AbilityTree[___type].SelectMany(x => x.Value).ToList(); var reqAbility = allAbilities.Find(x => x.Id == reqAbilityName); // desc += "<b><u>" + ability.Description.Name + "</b></u> - Requires: " + reqAbility.Description.Name + "\n\n" + ability.Description.Details + "\n\n\n"; } else { desc += "<b><u>" + ability.Description.Name + "</b></u>\n\n" + ability.Description.Details + "\n\n\n"; } } var descDef = new BaseDescriptionDef("PilotSpecs", title, desc, null); ___AbilityTooltip.SetDefaultStateData(TooltipUtilities.GetStateDataFromObject(descDef)); } }