Esempio n. 1
0
        // Returns a float to modify panic roll difficulty based on existing panic level
        internal static float GetPanicModifier(PanicStatus pilotStatus)
        {
            // ReSharper disable once SwitchStatementMissingSomeCases
            switch (pilotStatus)
            {
            case PanicStatus.Unsettled: return(modSettings.UnsettledPanicFactor);

            case PanicStatus.Stressed: return(modSettings.StressedPanicFactor);

            case PanicStatus.Panicked: return(modSettings.PanickedPanicFactor);

            default: return(1f);
            }
        }
Esempio n. 2
0
        /// <summary>
        /// Returns a float to modify panic roll difficulty based on existing panic level
        /// </summary>
        private static float GetPanicModifier(PanicStatus pilotStatus)
        {
            switch (pilotStatus)
            {
            case PanicStatus.Unsettled:
            {
                return(modSettings.UnsettledPanicModifier);
            }

            case PanicStatus.Stressed:
            {
                return(modSettings.StressedPanicModifier);
            }

            case PanicStatus.Panicked:
            {
                return(modSettings.PanickedPanicModifier);
            }

            default:
                return(1f);
            }
        }
Esempio n. 3
0
 public PilotTracker(Mech mech)
 {
     this.mech             = mech.GUID;
     panicStatus           = PanicStatus.Confident;
     panicWorsenedRecently = false;
 }
Esempio n. 4
0
 public PanicTracker(Mech mech)
 {
     trackedMech     = mech.GUID;
     pilotStatus     = PanicStatus.Normal;
     ChangedRecently = false;
 }
Esempio n. 5
0
        public static void Prefix(AbstractActor __instance)
        {
            if (!(__instance is Mech mech) || mech.IsDead || (mech.IsFlaggedForDeath && mech.HasHandledDeath))
            {
                return;
            }

            bool  FoundPilot = false;
            Pilot pilot      = mech.GetPilot();
            int   index      = -1;

            if (pilot == null)
            {
                return;
            }

            index = PanicHelpers.GetTrackedPilotIndex(mech);

            if (index > -1)
            {
                FoundPilot = true;
            }


            if (!FoundPilot)
            {
                PanicTracker panicTracker = new PanicTracker(mech);

                Holder.TrackedPilots.Add(panicTracker); //add a new tracker to tracked pilot, then we run it all over again;;
                index = PanicHelpers.GetTrackedPilotIndex(mech);
                if (index > -1)
                {
                    FoundPilot = true;
                }
                else
                {
                    return;
                }
            }
            PanicStatus originalStatus = Holder.TrackedPilots[index].pilotStatus;

            if (FoundPilot && !Holder.TrackedPilots[index].ChangedRecently)
            {
                if (Holder.TrackedPilots[index].pilotStatus == PanicStatus.Fatigued)
                {
                    Holder.TrackedPilots[index].pilotStatus = PanicStatus.Normal;
                }

                if (Holder.TrackedPilots[index].pilotStatus == PanicStatus.Stressed)
                {
                    Holder.TrackedPilots[index].pilotStatus = PanicStatus.Fatigued;
                }

                if (Holder.TrackedPilots[index].pilotStatus == PanicStatus.Panicked)
                {
                    Holder.TrackedPilots[index].pilotStatus = PanicStatus.Stressed;
                }
            }
            //reset panic values to account for panic level changes if we get this far, and we recovered.

            if (Holder.TrackedPilots[index].ChangedRecently)
            {
                Holder.TrackedPilots[index].ChangedRecently = false;
            }
            else if (Holder.TrackedPilots[index].pilotStatus != originalStatus)
            {
                __instance.StatCollection.ModifyStat <float>("Panic Turn Reset: Accuracy", -1, "AccuracyModifier", StatCollection.StatOperation.Set, 0f, -1, true);
                __instance.StatCollection.ModifyStat <float>("Panic Turn Reset: Mech To Hit", -1, "ToHitThisActor", StatCollection.StatOperation.Set, 0f, -1, true);


                if (Holder.TrackedPilots[index].pilotStatus == PanicStatus.Fatigued)
                {
                    __instance.Combat.MessageCenter.PublishMessage(new AddSequenceToStackMessage(new ShowActorInfoSequence(mech, $"Recovered To Fatigued!", FloatieMessage.MessageNature.Buff, true)));
                    __instance.StatCollection.ModifyStat <float>("Panic Turn: Fatigued Aim", -1, "AccuracyModifier", StatCollection.StatOperation.Float_Add, BasicPanic.Settings.FatiguedAimModifier, -1, true);
                }


                else if (Holder.TrackedPilots[index].pilotStatus == PanicStatus.Stressed)
                {
                    __instance.Combat.MessageCenter.PublishMessage(new AddSequenceToStackMessage(new ShowActorInfoSequence(mech, $"Recovered To Stressed!", FloatieMessage.MessageNature.Buff, true)));
                    __instance.StatCollection.ModifyStat <float>("Panic Turn: Stressed Aim", -1, "AccuracyModifier", StatCollection.StatOperation.Float_Add, BasicPanic.Settings.StressedAimModifier, -1, true);
                    __instance.StatCollection.ModifyStat <float>("Panic Turn: Stressed Defence", -1, "ToHitThisActor", StatCollection.StatOperation.Float_Add, BasicPanic.Settings.StressedToHitModifier, -1, true);
                }

                else //now normal
                {
                    __instance.Combat.MessageCenter.PublishMessage(new AddSequenceToStackMessage(new ShowActorInfoSequence(mech, $"Recovered To Normal!", FloatieMessage.MessageNature.Buff, true)));
                }
            }

            Holder.SerializeActiveJson();
        }
Esempio n. 6
0
 public PilotTracker(IGuid mech)
 {
     Mech                  = mech.GUID;
     PanicStatus           = PanicStatus.Confident;
     PanicWorsenedRecently = false;
 }
Esempio n. 7
0
        internal static void ApplyPanicStatus(AbstractActor __instance, PanicStatus panicStatus, bool worsened)
        {
            var actor = __instance;

            int Uid() => Random.Range(1, int.MaxValue);

            var effectManager = UnityGameInstance.BattleTechGame.Combat.EffectManager;

            // remove all PanicSystem effects first
            ClearPanicEffects(actor, effectManager);

            // re-apply effects
            var messageNature = worsened ? FloatieMessage.MessageNature.Debuff : FloatieMessage.MessageNature.Buff;
            var verb          = worsened ? modSettings.PanicWorsenedString : modSettings.PanicImprovedString;

            // account for the space, append it when the verb is defined
            if (!string.IsNullOrEmpty(verb))
            {
                verb += " ";
            }
            var message     = actor.Combat.MessageCenter;
            var dummyWeapon = new WeaponHitInfo();

            switch (panicStatus)
            {
            case PanicStatus.Unsettled:
                LogReport($"{actor.DisplayName} {verb}{modSettings.PanicStates[1]}");
                message.PublishMessage(new AddSequenceToStackMessage(
                                           new ShowActorInfoSequence(actor,
                                                                     $"{verb}{modSettings.PanicStates[1]}",
                                                                     messageNature,
                                                                     false)));
                effectManager.CreateEffect(StatusEffect.UnsettledToHit, "PanicSystemToHit", Uid(), actor, actor, dummyWeapon, 0);
                break;

            case PanicStatus.Stressed:
                LogReport($"{actor.DisplayName} {verb}{modSettings.PanicStates[2]}");
                message.PublishMessage(new AddSequenceToStackMessage(
                                           new ShowActorInfoSequence(actor,
                                                                     $"{verb}{modSettings.PanicStates[2]}",
                                                                     messageNature,
                                                                     false)));
                effectManager.CreateEffect(StatusEffect.StressedToHit, "PanicSystemToHit", Uid(), actor, actor, dummyWeapon, 0);
                effectManager.CreateEffect(StatusEffect.StressedToBeHit, "PanicSystemToBeHit", Uid(), actor, actor, dummyWeapon, 0);
                break;

            case PanicStatus.Panicked:
                LogReport($"{actor.DisplayName} {verb}{modSettings.PanicStates[3]}");
                message.PublishMessage(new AddSequenceToStackMessage(
                                           new ShowActorInfoSequence(actor,
                                                                     $"{verb}{modSettings.PanicStates[3]}",
                                                                     messageNature,
                                                                     false)));
                effectManager.CreateEffect(StatusEffect.PanickedToHit, "PanicSystemToHit", Uid(), actor, actor, dummyWeapon, 0);
                effectManager.CreateEffect(StatusEffect.PanickedToBeHit, "PanicSystemToBeHit", Uid(), actor, actor, dummyWeapon, 0);
                break;

            default:
                LogReport($"{actor.DisplayName} {verb}{modSettings.PanicStates[0]}");
                message.PublishMessage(new AddSequenceToStackMessage(
                                           new ShowActorInfoSequence(actor,
                                                                     $"{verb}{modSettings.PanicStates[0]}",
                                                                     messageNature,
                                                                     false)));
                break;
            }
        }