Example #1
0
        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();
        }
Example #2
0
 public static void Postfix()
 {
     TurnDamageTracker.hintAttackComplete("MechMeleeSequence:CompleteOrders");
 }
Example #3
0
 public static void Prefix(AbstractActor __instance)
 {
     TurnDamageTracker.newTurnFor(__instance);
 }
Example #4
0
        // 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");
 }
Example #6
0
 private static void Postfix() => TurnDamageTracker.Reset();
Example #7
0
 public static void Postfix(AttackDirector __instance, MessageCenterMessage message)
 {
     TurnDamageTracker.hintAttackComplete("AttackDirector:OnAttackComplete");
 }