public void SetupTooltip(StatTooltipData tooltipData, MechDef mechDef) { tooltipData.dataList.Clear(); { var value = mechDef.MechDefAssignedArmor; value *= ArmorMultiplier(mechDef); value *= DamageReductionMultiplierAll(mechDef); tooltipData.dataList.Add("<u>" + Strings.T("Armor") + "</u>", $"{value}"); } { var value = DamageReductionMultiplierAll(mechDef); tooltipData.dataList.Add("<u>" + Strings.T("Damage Reduction") + "</u>", Strings.T("{0} %", value)); /* * <float>("DamageReductionMultiplierAll", 1f); * <float>("DamageReductionMultiplierMelee", 1f); * <float>("DamageReductionMultiplierEnergy", 1f); * <float>("DamageReductionMultiplierBallistic", 1f); * <float>("DamageReductionMultiplierMissile", 1f); * <float>("DamageReductionMultiplierAntipersonnel", 1f); */ } { // stats.MaxStructureFactor var value = mechDef.MechDefMaxStructure; value *= StructureMultiplier(mechDef); tooltipData.dataList.Add(Strings.T("Structure"), $"{value}"); } { // used by vanilla .. ReceivedInstabilityMultiplier var stability = MaxStability(mechDef); var unsteadyThreshold = UnsteadyThreshold(mechDef); tooltipData.dataList.Add(Strings.T("Stability / Unsteady"), $"{stability} / {unsteadyThreshold}"); } { var value = MaxEvasivePips(mechDef); tooltipData.dataList.Add(Strings.T("Max Evasive Pips"), $"{value}"); } { var value = ToHitThisActor(mechDef); value += GetTargetSizeModifier(mechDef.Chassis.weightClass); tooltipData.dataList.Add(Strings.T("Defense"), $"{value}"); /* * <float>("ToHitThisActor", 0f); * <float>("ToHitThisActorBallistic", 0f); * <float>("ToHitThisActorEnergy", 0f); * <float>("ToHitThisActorMissile", 0f); * <float>("ToHitThisActorSmall", 0f); * <float>("ToHitThisActorMelee", 0f); * <float>("ToHitThisActorDirectFire", 0f); */ } }
public void SetupTooltip(StatTooltipData tooltipData, MechDef mechDef) { tooltipData.dataList.Clear(); { var melee = MechDefFirepowerStatistics.GetMelee(mechDef); var meleeFirepower = GetFirepower(mechDef, true); tooltipData.dataList.Add("<u>" + Strings.T("Melee Damage") + "</u>", $"{melee.Damage + meleeFirepower.TotalDamage}"); //tooltipData.dataList.Add(Strings.T("Melee Total Damage"), $"{melee.Damage + meleeFirepower.TotalDamage}"); tooltipData.dataList.Add(Strings.T("Melee Stability Dmg"), $"{melee.Instability + meleeFirepower.TotalInstability}"); tooltipData.dataList.Add(Strings.T("M.Heat/Struct.Dmg"), $"{melee.HeatDamage + meleeFirepower.TotalHeatDamage}/{melee.StructureDamage + meleeFirepower.TotalStructureDamage}"); //tooltipData.dataList.Add(Strings.T("Melee Accuracy"), $"{melee.Accuracy}"); //tooltipData.dataList.Add(Strings.T("Melee Sup. Accuracy"), $"{meleeFirepower.AverageAccuracy}"); } { var firepower = GetFirepower(mechDef, false); tooltipData.dataList.Add("<u>" + Strings.T("Ranged Damage") + "</u>", $"{firepower.TotalDamage}"); tooltipData.dataList.Add(Strings.T("Ranged Stability Dmg"), $"{firepower.TotalInstability}"); //tooltipData.dataList.Add(Strings.T("Ranged Average Accuracy"), $" {firepower.AverageAccuracy}"); tooltipData.dataList.Add(Strings.T("R.Heat/Struct.Dmg"), $"{firepower.TotalHeatDamage}/{firepower.TotalStructureDamage}"); } //{ // var dfa = MechDefFirepowerStatistics.GetDFA(mechDef); // tooltipData.dataList.Add(Strings.T("DFA D/I/A/S"), $"{dfa.Damage} / {dfa.Instability} / {dfa.Accuracy} / {dfa.StructureDamage}"); //} }
public static void Postfix(StatTooltipData __instance, MechDef def) { try { var movement = def.GetEngineMovement(); if (movement == null) { return; } var tooltipData = __instance; tooltipData.dataList.Remove("Max Move"); tooltipData.dataList.Remove("Max Sprint"); var combat = CombatGameConstants.GetInstance(UnityGameInstance.BattleTechGame); var hexWidth = combat.MoveConstants.ExperimentalGridDistance; __instance.dataList.Add("Max Move", $"{movement.WalkSpeed}m / {Mathf.Round(movement.WalkSpeed / hexWidth)} hex"); __instance.dataList.Add("Max Sprint", $"{movement.RunSpeed}m / {Mathf.Round(movement.RunSpeed / hexWidth)} hex"); __instance.dataList.Add("TT Walk MP", $"{movement.MovementPoint}"); } catch (Exception e) { Control.mod.Logger.LogError(e); } }
public static void Postfix(StatTooltipData __instance) { mechDef = null; if (movement != null) { __instance.dataList.Add("TT Walk MP", movement.MovementPoint.ToString()); movement = null; } }
public static void Postfix(StatTooltipData __instance, MechDef def) { try { OverrideStatTooltipsFeature.RangeStat.SetupTooltip(__instance, def); } catch (Exception e) { Control.Logger.Error.Log(e); } }
public static void Postfix(StatTooltipData __instance, MechDef def) { try { OverrideStatTooltipsFeature.HeatEfficiencyStat.SetupTooltip(__instance, def); } catch (Exception e) { Control.mod.Logger.LogError(e); } }
public void SetupTooltip(StatTooltipData tooltipData, MechDef mechDef) { var stats = new MechDefHeatEfficiencyStatistics(mechDef); tooltipData.dataList.Clear(); tooltipData.dataList.Add("<u>" + Strings.T("Heat Sinking") + "</u>", Strings.T("{0} Heat", stats.HeatSinking)); tooltipData.dataList.Add("<u>" + Strings.T("Alpha Strike") + "</u>", Strings.T("{0} Heat", stats.AlphaStrike)); tooltipData.dataList.Add(Strings.T("Jump Heat"), Strings.T("{0} Heat", stats.JumpHeat)); tooltipData.dataList.Add(Strings.T("Heat Levels"), Strings.T("{0} / {1} Heat", stats.Overheat, stats.MaxHeat)); }
public void SetupTooltip(StatTooltipData tooltipData, MechDef mechDef) { tooltipData.dataList.Clear(); var firepower = GetFirepower(mechDef); tooltipData.dataList.Add("<u>" + Strings.T("Medium Range Dmg") + "</u>", $"{firepower.TotalDamage}"); tooltipData.dataList.Add(Strings.T("Instability Damage"), $"{firepower.TotalInstability}"); tooltipData.dataList.Add(Strings.T("Heat Damage"), $"{firepower.TotalHeatDamage}"); tooltipData.dataList.Add(Strings.T("Structure Damage"), $"{firepower.TotalStructureDamage}"); tooltipData.dataList.Add(Strings.T("Average Accuracy"), $"{-firepower.AverageAccuracy}"); }
public static void Postfix(StatTooltipData __instance, MechDef def) { try { if (!def.Chassis.ChassisTags.Contains("chassis_heatsinks")) { return; } Logger.Debug("[StatTooltipData_SetHeatData_POSTFIX] (" + def.Description.Id + ") def.Chassis.Heatsinks: " + def.Chassis.Heatsinks); CombatGameConstants cgc = CombatGameConstants.GetInstance(UnityGameInstance.BattleTechGame); float num = ((float)def.Chassis.Heatsinks + (float)cgc.Heat.InternalHeatSinkCount) * cgc.Heat.DefaultHeatSinkDissipationCapacity; Logger.Debug("[StatTooltipData_SetHeatData_POSTFIX] (" + def.Description.Id + ") ChassisDissipationCapacity: " + num); for (int i = 0; i < def.Inventory.Length; i++) { if (def.Inventory[i].ComponentDefType == ComponentType.HeatSink) { HeatSinkDef heatSinkDef = def.Inventory[i].Def as HeatSinkDef; if (heatSinkDef != null) { num += heatSinkDef.DissipationCapacity; } } } Logger.Debug("[StatTooltipData_SetHeatData_POSTFIX] (" + def.Description.Id + ") TotalDissipationCapacity: " + num); __instance.dataList.Remove("Heat Sinking"); __instance.dataList.Add(Strings.T("Heat Sinking"), Strings.T("{0} Heat", new object[] { num.ToString() })); } catch (Exception e) { Logger.Error(e); } }
public void SetupTooltip(StatTooltipData tooltipData, MechDef mechDef) { tooltipData.dataList.Clear(); { var firepower = GetLongRangeFirepower(mechDef); tooltipData.dataList.Add("<u>" + Strings.T("Long Range Dmg") + "</u>", $"{firepower.TotalDamage}"); } { var firepower = GetExtremeLongRangeFirepower(mechDef); tooltipData.dataList.Add("<u>" + Strings.T("Very Long Range Dmg") + "</u>", $"{firepower.TotalDamage}"); } { var firepower = GetIndirectFirepower(mechDef); // TODO apply range limits and add copy to medium range stat tooltipData.dataList.Add(Strings.T("Indirect Range Dmg"), $"{firepower.TotalDamage}"); } { var firepower = GetFirepower(mechDef); tooltipData.dataList.Add(Strings.T("Stability Dmg"), $"{firepower.TotalInstability}"); tooltipData.dataList.Add(Strings.T("Heat / Struct.Dmg"), $"{firepower.TotalHeatDamage} / {firepower.TotalStructureDamage}"); tooltipData.dataList.Add(Strings.T("Average Accuracy"), $"{-firepower.AverageAccuracy}"); } }
public void SetupTooltip(StatTooltipData tooltipData, MechDef mechDef) { tooltipData.dataList.Clear(); }
public static void Postfix(StatTooltipData __instance) { mechDef = null; __instance.dataList.Add("TT Walk MP", string.Format("{0}", TTWalkSpeed)); }
public void SetupTooltip(StatTooltipData tooltipData, MechDef mechDef) { var stats = new MechDefMovementStatistics(mechDef); tooltipData.dataList.Clear();
public static bool Prefix(StatTooltipData __instance, MechDef def) { try { Logger.Debug($"[StatTooltipData_SetDurabilityData_PREFIX] Adding base Chassis.Stability value to the tooltip (including bonus from special gear)"); // Mostly copied from original method float mechDefCurrentStructure = def.MechDefCurrentStructure; float mechDefCurrentArmor = def.MechDefCurrentArmor; float stabilityDefenses = 0f; float dfaSelfDamage = def.Chassis.DFASelfDamage; //MAD: Add hit defense, check for special gear bool hasBallisticSiegeCompensators = false; float hitDefenses = 0f; //DAM List <float> list = new List <float>(); for (int i = 0; i < def.Inventory.Length; i++) { if ((def.Inventory[i].DamageLevel == ComponentDamageLevel.Functional || def.Inventory[i].DamageLevel == ComponentDamageLevel.Installing) && def.Inventory[i].ComponentDefType == ComponentType.Upgrade && def.Inventory[i].DamageLevel != ComponentDamageLevel.Destroyed) { UpgradeDef upgradeDef = def.Inventory[i].Def as UpgradeDef; if (upgradeDef != null) { for (int j = 0; j < upgradeDef.statusEffects.Length; j++) { float effectMod = Utilities.GetEffectMod(upgradeDef.statusEffects[j], "ReceivedInstabilityMultiplier", StatisticEffectData.TargetCollection.NotSet, StatCollection.StatOperation.Float_Multiply, WeaponSubType.NotSet); dfaSelfDamage -= Utilities.GetEffectMod(upgradeDef.statusEffects[j], "DFASelfDamage", StatisticEffectData.TargetCollection.NotSet, StatCollection.StatOperation.Float_Subtract, WeaponSubType.DFA); //MAD: Add hit defense hitDefenses += Utilities.GetEffectMod(upgradeDef.statusEffects[j], "ToHitThisActor", StatisticEffectData.TargetCollection.NotSet, StatCollection.StatOperation.Float_Add, WeaponSubType.NotSet); //DAM if (effectMod > 0f) { list.Add(effectMod); } } if (upgradeDef.Description.Id == "Gear_General_GM_Ballistic_Siege_Compensators") { hasBallisticSiegeCompensators = true; Logger.Info($"[StatTooltipData_SetDurabilityData_PREFIX] hasBallisticSiegeCompensators: {hasBallisticSiegeCompensators}"); } } } } for (int k = 0; k < list.Count; k++) { if (k > 0) { stabilityDefenses *= list[k]; } else { stabilityDefenses = list[k]; } } if (stabilityDefenses != 0f) { stabilityDefenses *= 100f; stabilityDefenses = 100f - stabilityDefenses; } string stabilityDefensesStr = string.Format("{0}%", stabilityDefenses.ToString()); //MAD: Add base stability float stability = def.Chassis.Stability + (hasBallisticSiegeCompensators ? 40f : 0f); //MAD: Add hit defense (Multiply by 5 as 1f is translated to +-5% chance to hit) hitDefenses = Mathf.FloorToInt(hitDefenses * 5); string hitDefensesStr = string.Format("{0}%", hitDefenses.ToString()); //MAD: Add armor weight string armorTonnage = Math.Round((decimal)(mechDefCurrentArmor * UnityGameInstance.BattleTechGame.MechStatisticsConstants.TONNAGE_PER_ARMOR_POINT), 2).ToString("F2").Replace(".", ","); string armorStr = $"{mechDefCurrentArmor} ({armorTonnage} tons)"; //MAD: Modified/Expanded output (Column 1) __instance.dataList.Add(Strings.T("Structure"), mechDefCurrentStructure.ToString()); __instance.dataList.Add(Strings.T("Armor"), armorStr); __instance.dataList.Add(Strings.T("Stability"), stability.ToString()); // Column 2 __instance.dataList.Add(Strings.T("DFA Self Dmg"), dfaSelfDamage.ToString()); __instance.dataList.Add(Strings.T("Hit Def"), hitDefensesStr); __instance.dataList.Add(Strings.T("Stability Def"), stabilityDefensesStr); // Skipping original method return(false); } catch (Exception e) { Logger.Error(e); __instance.dataList.Clear(); return(true); } }
public static bool Prefix(StatTooltipData __instance, MechDef def) { try { Logger.Debug($"[StatTooltipData_SetFirepowerData_PREFIX] Fixing max stability damage value and respecting special gear..."); float allDmg = 0f; float stbDmg = 0f; float energyDmg = 0f; float ballisticDmg = 0f; float missileDmg = 0f; float supportDmg = 0f; bool hasOptimizedCapacitors = false; bool hasBallisticSiegeCompensators = false; for (int i = 0; i < def.Inventory.Length; i++) { if ((def.Inventory[i].DamageLevel == ComponentDamageLevel.Functional || def.Inventory[i].DamageLevel == ComponentDamageLevel.Installing) && def.Inventory[i].DamageLevel != ComponentDamageLevel.Destroyed) { if (def.Inventory[i].Def.Description.Id == "Gear_General_Optimized_Capacitors") { hasOptimizedCapacitors = true; Logger.Info($"[StatTooltipData_SetFirepowerData_PREFIX] hasOptimizedCapacitors: {hasOptimizedCapacitors}"); } if (def.Inventory[i].Def.Description.Id == "Gear_General_GM_Ballistic_Siege_Compensators") { hasBallisticSiegeCompensators = true; Logger.Info($"[StatTooltipData_SetFirepowerData_PREFIX] hasBallisticSiegeCompensators: {hasBallisticSiegeCompensators}"); } if (def.Inventory[i].ComponentDefType == ComponentType.Weapon) { WeaponDef weaponDef = def.Inventory[i].Def as WeaponDef; if (weaponDef != null) { // Energy weapons if (weaponDef.WeaponCategoryValue.IsEnergy) { //Logger.Info($"[StatTooltipData_SetFirepowerData_PREFIX] {weaponDef.Description.Name} is an energy weapon"); if (weaponDef.Type == WeaponType.COIL) { allDmg += ((weaponDef.ShotsWhenFired > 0) ? (weaponDef.Damage * 3f * (float)weaponDef.ShotsWhenFired) : (weaponDef.Damage * 3f)); stbDmg += ((weaponDef.ShotsWhenFired > 0) ? (weaponDef.Instability * (float)weaponDef.ShotsWhenFired) : weaponDef.Instability); energyDmg += ((weaponDef.ShotsWhenFired > 0) ? (weaponDef.Damage * 3f * (float)weaponDef.ShotsWhenFired) : (weaponDef.Damage * 3f)); } else { allDmg += ((weaponDef.ShotsWhenFired > 0) ? (weaponDef.Damage * (float)weaponDef.ShotsWhenFired) : weaponDef.Damage); stbDmg += ((weaponDef.ShotsWhenFired > 0) ? (weaponDef.Instability * (float)weaponDef.ShotsWhenFired) : weaponDef.Instability); energyDmg += ((weaponDef.ShotsWhenFired > 0) ? (weaponDef.Damage * (float)weaponDef.ShotsWhenFired) : weaponDef.Damage); } Logger.Info($"[StatTooltipData_SetFirepowerData_PREFIX] ({weaponDef.Description.Name}) energyDmg: {energyDmg}"); } // Ballistic weapons else if (weaponDef.WeaponCategoryValue.IsBallistic) { //Logger.Info($"[StatTooltipData_SetFirepowerData_PREFIX] {weaponDef.Description.Name} is a ballistic weapon"); allDmg += ((weaponDef.ShotsWhenFired > 0) ? (weaponDef.Damage * (float)weaponDef.ShotsWhenFired) : weaponDef.Damage); stbDmg += ((weaponDef.ShotsWhenFired > 0) ? (weaponDef.Instability * (float)weaponDef.ShotsWhenFired) : weaponDef.Instability); ballisticDmg += ((weaponDef.ShotsWhenFired > 0) ? (weaponDef.Damage * (float)weaponDef.ShotsWhenFired) : weaponDef.Damage); Logger.Info($"[StatTooltipData_SetFirepowerData_PREFIX] ({weaponDef.Description.Name}) ballisticDmg: {ballisticDmg}"); } // Missiles else if (weaponDef.WeaponCategoryValue.IsMissile) { //Logger.Info($"[StatTooltipData_SetFirepowerData_PREFIX] {weaponDef.Description.Name} is a missile weapon"); allDmg += ((weaponDef.ShotsWhenFired > 0) ? (weaponDef.Damage * (float)weaponDef.ShotsWhenFired) : weaponDef.Damage); stbDmg += ((weaponDef.ShotsWhenFired > 0) ? (weaponDef.Instability * (float)weaponDef.ShotsWhenFired) : weaponDef.Instability); missileDmg += ((weaponDef.ShotsWhenFired > 0) ? (weaponDef.Damage * (float)weaponDef.ShotsWhenFired) : weaponDef.Damage); Logger.Info($"[StatTooltipData_SetFirepowerData_PREFIX] ({weaponDef.Description.Name}) missileDmg: {missileDmg}"); } // Support else if (weaponDef.WeaponCategoryValue.IsSupport) { //Logger.Info($"[StatTooltipData_SetFirepowerData_PREFIX] {weaponDef.Description.Name} is a support weapon"); if (weaponDef.Type == WeaponType.COIL) { allDmg += ((weaponDef.ShotsWhenFired > 0) ? (weaponDef.Damage * 3f * (float)weaponDef.ShotsWhenFired) : (weaponDef.Damage * 3f)); stbDmg += ((weaponDef.ShotsWhenFired > 0) ? (weaponDef.Instability * (float)weaponDef.ShotsWhenFired) : weaponDef.Instability); supportDmg += ((weaponDef.ShotsWhenFired > 0) ? (weaponDef.Damage * 3f * (float)weaponDef.ShotsWhenFired) : (weaponDef.Damage * 3f)); } else { allDmg += ((weaponDef.ShotsWhenFired > 0) ? (weaponDef.Damage * (float)weaponDef.ShotsWhenFired) : weaponDef.Damage); stbDmg += ((weaponDef.ShotsWhenFired > 0) ? (weaponDef.Instability * (float)weaponDef.ShotsWhenFired) : weaponDef.Instability); supportDmg += ((weaponDef.ShotsWhenFired > 0) ? (weaponDef.Damage * (float)weaponDef.ShotsWhenFired) : weaponDef.Damage); } Logger.Info($"[StatTooltipData_SetFirepowerData_PREFIX] ({weaponDef.Description.Name}) supportDmg: {supportDmg}"); } // Everything else else { Logger.Info($"[StatTooltipData_SetFirepowerData_PREFIX] {weaponDef.Description.Name} is uncategorized"); allDmg += ((weaponDef.ShotsWhenFired > 0) ? (weaponDef.Damage * (float)weaponDef.ShotsWhenFired) : weaponDef.Damage); stbDmg += ((weaponDef.ShotsWhenFired > 0) ? (weaponDef.Instability * (float)weaponDef.ShotsWhenFired) : weaponDef.Instability); } } } } } string energyDmgStr = $"{energyDmg}"; if (hasOptimizedCapacitors) { int additionalEnergyDmg = (int)Math.Round(energyDmg * 0.2f); Logger.Info($"[StatTooltipData_SetFirepowerData_PREFIX] additionalEnergyDmg: {additionalEnergyDmg}"); allDmg += additionalEnergyDmg; energyDmgStr = $"{energyDmg} ({energyDmg + additionalEnergyDmg})"; } string ballisticDmgStr = $"{ballisticDmg}"; if (hasBallisticSiegeCompensators) { int additionalBallisticDmg = (int)Math.Round(ballisticDmg * 0.2f); Logger.Info($"[StatTooltipData_SetFirepowerData_PREFIX] additionalBallisticDmg: {additionalBallisticDmg}"); allDmg += additionalBallisticDmg; ballisticDmgStr = $"{ballisticDmg} ({ballisticDmg + additionalBallisticDmg})"; } // Column 1 __instance.dataList.Add(Strings.T("Max Dmg"), allDmg.ToString()); __instance.dataList.Add(Strings.T("Energy"), energyDmgStr); __instance.dataList.Add(Strings.T("Support"), supportDmg.ToString()); // Column 2 __instance.dataList.Add(Strings.T("Max Stability Dmg"), stbDmg.ToString()); __instance.dataList.Add(Strings.T("Ballistic"), ballisticDmgStr); __instance.dataList.Add(Strings.T("Missile"), missileDmg.ToString()); // Skipping original method return(false); } catch (Exception e) { Logger.Error(e); __instance.dataList.Clear(); return(true); } }