public static void Prefix(AbstractActor __instance) { TurnDamageTracker.completedTurnFor(__instance); if (__instance.IsDead || __instance.IsFlaggedForDeath && __instance.HasHandledDeath) { return; } var pilot = __instance.GetPilot(); if (pilot == null) { Logger.LogDebug($"No pilot found for {__instance.Nickname}:{__instance.GUID}"); return; } var index = GetActorIndex(__instance); Logger.LogDebug($"Checking pilot panic for {__instance.Nickname}:{__instance.GUID} recent panic{TrackedActors[index].PanicWorsenedRecently} {TrackedActors[index].PanicStatus.ToString()} Health:{Helpers.ActorHealth(__instance):F3}% v/s {(modSettings.MechHealthForCrit + (((int) TrackedActors[index].PanicStatus) * 10))} Alone:{__instance.Combat.GetAllAlliesOf(__instance).TrueForAll(m => m.IsDead || m == __instance)}"); // reduce panic level //fix https://github.com/gnivler/PanicSystem/issues/54 //dont improve panic system if damage level>crit health+ panicstatus*10% if (!TrackedActors[index].PanicWorsenedRecently && TrackedActors[index].PanicStatus > PanicStatus.Confident && Helpers.ActorHealth(__instance) > (modSettings.MechHealthForCrit + (((int)TrackedActors[index].PanicStatus) * 10)) && !__instance.Combat.GetAllAlliesOf(__instance).TrueForAll(m => m.IsDead || m == __instance)) { Logger.LogDebug($"Improving pilot panic for {__instance.Nickname}:{__instance.GUID}"); TrackedActors[index].PanicStatus--; } TrackedActors[index].PanicWorsenedRecently = false; SaveTrackedPilots(); }
public static void Postfix() { TurnDamageTracker.hintAttackComplete("MechMeleeSequence:CompleteOrders"); }
public static void Prefix(AbstractActor __instance) { TurnDamageTracker.newTurnFor(__instance); }
// returns true if enough damage was inflicted to trigger a panic save private static bool SufficientDamageWasDone(AbstractActor actor, out int heatdamage, out float damageIncludingHeatDamage) { if (actor == null) { damageIncludingHeatDamage = 0; heatdamage = 0; return(false); } float armorDamage; float structureDamage; float previousArmor; float previousStructure; //don't need the damage numbers as we can check the actor itself. TurnDamageTracker.DamageDuringTurn(actor, out armorDamage, out structureDamage, out previousArmor, out previousStructure, out heatdamage); // used in SavingThrows.cs damageIncludingHeatDamage = armorDamage + structureDamage; #if NO_CAC if (true) { #else if (!(actor is Mech) || actor.isHasHeat()) //Battle Armor doesn't have heat { #endif damageIncludingHeatDamage = damageIncludingHeatDamage + (heatdamage * modSettings.HeatDamageFactor); } if (damageIncludingHeatDamage <= 0)//potentially negative if repairs happened. { LogReport($"Damage >>> A: {armorDamage:F3}/{previousArmor:F3} S: {structureDamage:F3}/{previousStructure:F3} NA%) H: {heatdamage}"); LogReport("No damage"); return(false); } var percentDamageDone = damageIncludingHeatDamage / (previousArmor + previousStructure) * 100; LogReport($"Damage >>> A: {armorDamage:F3}/{previousArmor:F3} S: {structureDamage:F3}/{previousStructure:F3} ({percentDamageDone:F2}%) H: {heatdamage}"); if (modSettings.AlwaysPanic) { LogReport("AlwaysPanic"); return(true); } if ((actor is Mech && structureDamage >= modSettings.MinimumMechStructureDamageRequired) || (modSettings.VehiclesCanPanic && actor is Vehicle && structureDamage >= modSettings.MinimumVehicleStructureDamageRequired)) { LogReport("Structure damage requires panic save"); return(true); } if (percentDamageDone <= modSettings.MinimumDamagePercentageRequired) { LogReport("Not enough damage"); return(false); } LogReport("Total damage requires a panic save"); return(true); }
public static void Postfix(ActorMovementSequence __instance) { TurnDamageTracker.hintAttackComplete("ActorMovementSequence:CompleteOrders"); }
private static void Postfix() => TurnDamageTracker.Reset();
public static void Postfix(AttackDirector __instance, MessageCenterMessage message) { TurnDamageTracker.hintAttackComplete("AttackDirector:OnAttackComplete"); }