public void AdjustTooltipWeapon(TooltipPrefab_Weapon tooltipInstance, MechComponentDef mechComponentDef) { var tooltip = new TooltipPrefab_WeaponAdapter(tooltipInstance); var reservedSlots = 0; if (mechComponentDef.Is <Weights>(out var weights)) { reservedSlots += weights.ReservedSlots; var mechDef = Global.ActiveMechDef; if (mechDef != null) { var tonnageChanges = CalculateWeightChanges(mechDef, weights); tooltip.tonnage.text = FormatChanges(mechComponentDef.Tonnage, tonnageChanges); } } if (mechComponentDef.Is <DynamicSlots.DynamicSlots>(out var dynamicSlots)) { reservedSlots += dynamicSlots.ReservedSlots; } if (reservedSlots > 0) { tooltip.slots.text = $"{mechComponentDef.InventorySize} + {reservedSlots}"; } }
public void AdjustTooltipWeapon(TooltipPrefab_Weapon tooltip, MechComponentDef componentDef) { foreach (var cc in componentDef.GetComponents <IAdjustTooltipWeapon>()) { cc.AdjustTooltipWeapon(tooltip, componentDef); } }
public static void Postfix(TooltipPrefab_Weapon __instance, object data) { try { if (data is MechComponentDef def) { OverrideDescriptionsFeature.Shared.AdjustTooltipWeapon(__instance, def); } } catch (Exception e) { Control.mod.Logger.LogError(e); } }
public static void TooltipPrefab_Weapon_SetData_Postfix(TooltipPrefab_Weapon __instance, object data, TextMeshProUGUI ___rangeType, TextMeshProUGUI ___damage) { Mod.Log.Debug("TP_W:SD entered."); ___rangeType.enabled = false; Transform rangeLabelT = ___rangeType.gameObject.transform.parent; rangeLabelT.gameObject.SetActive(false); Transform layoutT = rangeLabelT.gameObject.transform.parent; RectTransform rLayoutT = layoutT.gameObject.GetComponent <RectTransform>(); LayoutRebuilder.ForceRebuildLayoutImmediate(rLayoutT); Mod.Log.Debug(" Updating weapon text."); WeaponDef weaponDef = (WeaponDef)data; if (weaponDef != null) { float totalDamage = weaponDef.Damage * weaponDef.ShotsWhenFired * weaponDef.ProjectilesPerShot; if (weaponDef.ShotsWhenFired != 1 && weaponDef.ProjectilesPerShot != 1) { ___damage.SetText($"{weaponDef.Damage.ToString()} x {weaponDef.ShotsWhenFired.ToString()} x {weaponDef.ProjectilesPerShot.ToString()} = {totalDamage}"); } else if (weaponDef.ShotsWhenFired != 1) { ___damage.SetText($"{weaponDef.Damage.ToString()} x {weaponDef.ShotsWhenFired.ToString()} = {totalDamage}"); } else if (weaponDef.ProjectilesPerShot != 1 && !Mod.Config.Fixes.OneShotDamagePerPallet) { ___damage.SetText($"{weaponDef.Damage.ToString()} x {weaponDef.ProjectilesPerShot.ToString()} = {totalDamage}"); } else if (weaponDef.ShotsWhenFired == 1 && weaponDef.ProjectilesPerShot != 1 && Mod.Config.Fixes.OneShotDamagePerPallet) { ___damage.SetText($"{(weaponDef.Damage / weaponDef.ProjectilesPerShot).ToString()} x {weaponDef.ProjectilesPerShot.ToString()} (p) = {weaponDef.Damage}"); } else { ___damage.SetText($"{weaponDef.Damage.ToString()}"); } } }
public static void Postfix(TooltipPrefab_Weapon __instance, object data, TextMeshProUGUI ___body) { Mod.Log.Debug($"TP_W:SD - Init - data:{data} body:{___body}"); SimGameState sgs = UnityGameInstance.BattleTechGame.Simulation; if (data != null && ___body != null && sgs != null) { WeaponDef weaponDef = (WeaponDef)data; float weaponStorageSize = Helper.CalculateGearStorageSize(weaponDef); // Calculate total gear storage size double totalSize = Helper.GetGearInventorySize(sgs); int storageCost = 0; if (totalSize > 0) { // Handle exponentiation of cost int totalCost = Helper.CalculateTotalForGearCargo(sgs, totalSize); double sizeFraction = weaponStorageSize / totalSize; storageCost = (int)Math.Ceiling(totalCost * sizeFraction); Mod.Log.Debug($" totalCost: {totalCost} storageSize: {weaponStorageSize} sizeFraction: {sizeFraction} fractionalCost: {storageCost}"); } else { // Assume no exponentiation when there is no gear double factoredSize = Math.Ceiling(weaponStorageSize * Mod.Config.GearFactor); double scaledUnits = Math.Pow(factoredSize, Mod.Config.GearExponent); storageCost = (int)(Mod.Config.GearCostPerUnit * scaledUnits); Mod.Log.Info($" totalUnits:{weaponStorageSize} x factor:{Mod.Config.GearFactor} = {factoredSize}"); } Text newDetails = new Text(weaponDef.Description.Details + $"\n\n<color=#FF0000>Cargo Cost:{SimGameState.GetCBillString(storageCost)} from {weaponStorageSize}u size</color>"); Mod.Log.Debug($" Setting details: {newDetails}u"); ___body.SetText(newDetails.ToString()); } else { Mod.Log.Debug($"TP_W:SD - Skipping"); } }
public void AdjustTooltipWeapon(TooltipPrefab_Weapon tooltip, MechComponentDef componentDef) { WeightsHandler.Shared.AdjustTooltipWeapon(tooltip, componentDef); }
static void Postfix(TooltipPrefab_Weapon __instance, object data, TextMeshProUGUI ___rangeType, TextMeshProUGUI ___damage) { Mod.Log.Debug?.Write("TP_W:SD entered."); ___rangeType.enabled = false; Transform rangeLabelT = ___rangeType.gameObject.transform.parent; rangeLabelT.gameObject.SetActive(false); Transform layoutT = rangeLabelT.gameObject.transform.parent; RectTransform rLayoutT = layoutT.gameObject.GetComponent <RectTransform>(); LayoutRebuilder.ForceRebuildLayoutImmediate(rLayoutT); WeaponDef weaponDef = (WeaponDef)data; if (weaponDef != null) { Mod.Log.Debug?.Write($" Updating tooltip for weapon: {weaponDef.Description.UIName}"); if (CustomAmmoCategories.isRegistredWeapon(weaponDef.Description.Id)) { // Is a CAC weapon, use HasShells ExtWeaponDef extDef = CustomAmmoCategories.getExtWeaponDef(weaponDef.Description.Id); Mod.Log.Debug?.Write($" Found CAC extension for weapon."); if (extDef == null) { Mod.Log.Warn?.Write($"Failed to load CAC ExtWeaponDef for {weaponDef.Description.Id}, but it was registered!"); return; } /* * "ImprovedBallistic": true, - whether use or not own ballistic weapon effect engine. * Difference between "improved" and vanilla engine: * 1. Improved mode uses ShotsWhenFire properly (vanilla had not used them at all) * 3. Improved mode fire ShotsWhenFire volleys with ProjectilesPerShot bullets in each. * Bullets in one volley fired simultaneously instead of one by one (as in WeaponRealizer) * But damage still dealt once per volley, not per bullet, to keep compatibility with vanilla. * NOTE! If ImprovedBallistic is set DisableClustering is forced to true and "wr-clustered_shots" tag removed from definition. * * "BallisticDamagePerPallet": true - if true damage inflicted per pallet instead of per shot. * Only working with ImprovedBallistic true, ballistic weapon effect and HasShels false * Damage will be divided by ProjectilesPerShot value, heat damage and stable damage too. */ /* * PER HARKONNEN HALLOWED BY THINE NAME * If ImprovedBallistic = false OR * ImprovedBallistic = true AND (HasShells = true or BallisticDamageperPellet = false) - > damage x shots * If ImprovedBallistic = true and BallisticDamageperPellet = true and DamageNotDivided = true > damage x projectiles x shots * If ImprovedBallistic = true and BallisticDamageperPellet = true and DamageNotDivided = false > (damage/projectiles) x projectiles x shots */ if (extDef.ImprovedBallistic) { // Damage is damage * shotsWhenFired (each shot = volley of projectiles, projectiles are visual only) float totalDamage = weaponDef.Damage * weaponDef.ShotsWhenFired; if (weaponDef.ShotsWhenFired != 1) { string localText = $"{weaponDef.Damage} x {weaponDef.ShotsWhenFired} = {totalDamage}"; Mod.Log.Debug?.Write($"ImprovedBallistic weapon damage set to: {localText}<page>"); ___damage.SetText(localText); } if (extDef.HasShells == TripleBoolean.True || extDef.BallisticDamagePerPallet != TripleBoolean.True) { if (weaponDef.ShotsWhenFired != 1) { // damage x shots = total totalDamage = weaponDef.Damage * weaponDef.ShotsWhenFired; string localText = $"{weaponDef.Damage} x {weaponDef.ShotsWhenFired} = {totalDamage}"; Mod.Log.Debug?.Write($"ImprovedBallistic + HasShells || !BallisticDamagePerPallet weapon damage set to: {localText}; ShotsWhenFired != 1"); ___damage.SetText(localText); } else { totalDamage = weaponDef.Damage * weaponDef.ShotsWhenFired; string localText = $"{totalDamage}"; Mod.Log.Debug?.Write($"ImprovedBallistic + HasShells || !BallisticDamagePerPallet weapon damage set to: {localText}; ShotsWhenFired == 1"); ___damage.SetText(localText); } } if (extDef.BallisticDamagePerPallet == TripleBoolean.True && extDef.DamageNotDivided == TripleBoolean.True) { if (weaponDef.ShotsWhenFired != 1 && weaponDef.ProjectilesPerShot != 1) { totalDamage = weaponDef.Damage * weaponDef.ProjectilesPerShot * weaponDef.ShotsWhenFired; string localText = $"{weaponDef.Damage} x {weaponDef.ProjectilesPerShot} x {weaponDef.ShotsWhenFired} = {totalDamage}"; Mod.Log.Debug?.Write($"ImprovedBallistic + BallisticDamagePerPallet + DamageNotDivided weapon damage set to: {localText}; ProjectilesPerShot != 1 AND ShotsWhenFired != 1"); ___damage.SetText(localText); } else if (weaponDef.ShotsWhenFired == 1 && weaponDef.ProjectilesPerShot != 1) { totalDamage = weaponDef.Damage * weaponDef.ProjectilesPerShot * weaponDef.ShotsWhenFired; string localText = $"{weaponDef.Damage} x {weaponDef.ProjectilesPerShot}= {totalDamage}"; Mod.Log.Debug?.Write( $"ImprovedBallistic + BallisticDamagePerPallet + DamageNotDivided weapon damage set to: {localText}; ProjectilesPerShot != 1 BUT ShotsWhenFired == 1"); ___damage.SetText(localText); } else if (weaponDef.ShotsWhenFired != 1 && weaponDef.ProjectilesPerShot == 1) { totalDamage = weaponDef.Damage * weaponDef.ProjectilesPerShot * weaponDef.ShotsWhenFired; string localText = $"{weaponDef.Damage} x {weaponDef.ShotsWhenFired} = {totalDamage}"; Mod.Log.Debug?.Write($"ImprovedBallistic + BallisticDamagePerPallet + DamageNotDivided weapon damage set to: {localText}; ProjectilesPerShot == 1 BUT ShotsWhenFired != 1"); ___damage.SetText(localText); } else { totalDamage = weaponDef.Damage * weaponDef.ProjectilesPerShot * weaponDef.ShotsWhenFired; string localText = $"{totalDamage}"; Mod.Log.Debug?.Write($"ImprovedBallistic + HasShells || !BallisticDamagePerPallet weapon damage set to: {localText}; ShotsWhenFired AND ProjectilesPerShot == 1"); ___damage.SetText(localText); } } if (extDef.BallisticDamagePerPallet == TripleBoolean.True && extDef.DamageNotDivided != TripleBoolean.True) { if (weaponDef.ShotsWhenFired != 1 && weaponDef.ProjectilesPerShot != 1) { float damagePerPellet = weaponDef.Damage / weaponDef.ProjectilesPerShot; totalDamage = damagePerPellet * weaponDef.ShotsWhenFired * weaponDef.ProjectilesPerShot; string localText = $"{damagePerPellet} x {weaponDef.ShotsWhenFired} x {weaponDef.ProjectilesPerShot} = {totalDamage}"; Mod.Log.Debug?.Write($"ImprovedBallistic + BallisticDamagePerPallet + !DamageNotDivided weapon damage set to: {localText}; ProjectilesPerShot != 1 AND ShotsWhenFired != 1"); ___damage.SetText(localText); } else if (weaponDef.ShotsWhenFired == 1 && weaponDef.ProjectilesPerShot != 1) { float damagePerPellet = weaponDef.Damage / weaponDef.ProjectilesPerShot; totalDamage = damagePerPellet * weaponDef.ShotsWhenFired * weaponDef.ProjectilesPerShot; string localText = $"{damagePerPellet} x {weaponDef.ProjectilesPerShot} = {totalDamage}"; Mod.Log.Debug?.Write($"ImprovedBallistic + BallisticDamagePerPallet + !DamageNotDivided weapon damage set to: {localText}; ProjectilesPerShot != 1 BUT ShotsWhenFired == 1"); ___damage.SetText(localText); } else if (weaponDef.ShotsWhenFired != 1 && weaponDef.ProjectilesPerShot == 1) { float damagePerPellet = weaponDef.Damage / weaponDef.ProjectilesPerShot; totalDamage = damagePerPellet * weaponDef.ShotsWhenFired * weaponDef.ProjectilesPerShot; string localText = $"{damagePerPellet} x {weaponDef.ShotsWhenFired} = {totalDamage}"; Mod.Log.Debug?.Write($"ImprovedBallistic + BallisticDamagePerPallet + !DamageNotDivided weapon damage set to: {localText}; ProjectilesPerShot == 1 BUT ShotsWhenFired != 1"); ___damage.SetText(localText); } else { float damagePerPellet = weaponDef.Damage / weaponDef.ProjectilesPerShot; totalDamage = damagePerPellet * weaponDef.ShotsWhenFired * weaponDef.ProjectilesPerShot; string localText = $"{totalDamage}"; Mod.Log.Debug?.Write($"ImprovedBallistic + BallisticDamagePerPallet + !DamageNotDivided weapon damage set to: {localText}; ProjectilesPerShot == 1 AND ShotsWhenFired == 1"); ___damage.SetText(localText); } } } else { // Vanilla calculations, so ProjectilesPerShot is visual only. See https://github.com/BattletechModders/IRTweaks/issues/8 float totalDamage = weaponDef.Damage * weaponDef.ShotsWhenFired; if (weaponDef.ShotsWhenFired != 1) { string localText = $"{weaponDef.Damage} x {weaponDef.ShotsWhenFired} shots = {totalDamage}"; Mod.Log.Debug?.Write($"Vanilla + ShotsWhenFire > 1 weapon damage set to: {localText}"); ___damage.SetText(localText); } else { string localText = $"{weaponDef.Damage}"; Mod.Log.Debug?.Write($"Vanilla + 1 ShotsWhenFired weapon damage set to: {localText}"); ___damage.SetText(localText); } } /* * "AOEDamage": 0 - if > 0 alternative AoE damage algorithm will be used. Main projectile will not always miss. * Instead it will inflict damage twice one for main target - direct hit (this damage can be have variance) * and second for all targets in AoE range including main. * * "AOEHeatDamage": 0 - if > 0 alternative AoE damage algorithm will be used. Main projectile will not always miss. * Instead it will inflict damage twice one for main target - direct hit (this damage can be have variance) * and second for all targets in AoE range including main. * * "AOEInstability": 0 - instability AoE damage */ } else { // Not a CAC weapon, vanilla, so ProjectilesPerShot is visual only. See https://github.com/BattletechModders/IRTweaks/issues/8 float totalDamage = weaponDef.Damage * weaponDef.ShotsWhenFired; if (weaponDef.ShotsWhenFired != 1) { string localText = $"{weaponDef.Damage} x {weaponDef.ShotsWhenFired} shots = {totalDamage}"; Mod.Log.Debug?.Write($"Vanilla + ShotsWhenFire > 1 weapon damage set to: {localText}"); ___damage.SetText(localText); } else { string localText = $"{weaponDef.Damage}"; Mod.Log.Debug?.Write($"Vanilla + 1 ShotsWhenFired weapon damage set to: {localText}"); ___damage.SetText(localText); } } } }