// 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); } }
/// <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); } }
public PilotTracker(Mech mech) { this.mech = mech.GUID; panicStatus = PanicStatus.Confident; panicWorsenedRecently = false; }
public PanicTracker(Mech mech) { trackedMech = mech.GUID; pilotStatus = PanicStatus.Normal; ChangedRecently = false; }
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(); }
public PilotTracker(IGuid mech) { Mech = mech.GUID; PanicStatus = PanicStatus.Confident; PanicWorsenedRecently = false; }
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; } }