/// <summary>
 /// A general function used to Apply a Card Trigger in different ways, dependant on parameters
 /// </summary>
 /// <param name="cardTrigger">CardTrigger to be Applied</param>
 /// <param name="playedCard">Card to apply triggers to</param>
 /// <param name="fireAllMonsterTriggersInRoom">Whether Apply Card Triggers should fire on monster's Instead, requires Trigger to have an associated character trigger</param>
 /// <param name="roomIndex">Room to fire triggers in, -1 defaults to selected room</param>
 /// <param name="ignoreDeadInTargeting">Whether effects applied by the trigger should ignore dead in targetting</param>
 /// <param name="triggeredCharacter">Character used to determine how many times Card Trigger should be applied</param>
 /// <param name="cardTriggerFiredCallback">Action to take after applying trigger</param>
 /// <returns></returns>
 public static void ApplyCardTriggers(CardTrigger cardTrigger, CardState playedCard, bool fireAllMonsterTriggersInRoom = false, int roomIndex = -1, bool ignoreDeadInTargeting = true, CharacterState triggeredCharacter = null, Action cardTriggerFiredCallback = null)
 {
     Trainworks.Log(BepInEx.Logging.LogLevel.Info, $"Applying {cardTrigger.Name}");
     if (ProviderManager.TryGetProvider <CombatManager>(out CombatManager combatManager))
     {
         combatManager.StartCoroutine(
             combatManager.ApplyCardTriggers(
                 cardTrigger.GetEnum(),
                 playedCard,
                 fireAllMonsterTriggersInRoom,
                 roomIndex,
                 ignoreDeadInTargeting,
                 triggeredCharacter,
                 cardTriggerFiredCallback
                 )
             );
     }
 }
 /// <summary>
 /// A function used to fire a card trigger, causing the effects of the corresponding trigger on the playedCard to be fired.
 /// </summary>
 /// <param name="cardTrigger">CardTrigger to be Fired</param>
 /// <param name="playedCard">Card to Fire Trigger on</param>
 /// <param name="roomIndex">Room to fire trigger in, -1 is current room</param>
 /// <param name="ignoreDeadInTargeting">Whether effect should ignore dead in targeting</param>
 /// <param name="triggeredCharacter">Character used for applying effects</param>
 /// <param name="fireCount">how many times the trigger fires</param>
 /// <param name="cardTriggerFiredCallback">Action to call after function is called</param>
 /// <returns></returns>
 public static void FireCardTriggers(CardTrigger cardTrigger, CardState playedCard, int roomIndex = -1, bool ignoreDeadInTargeting = true, CharacterState triggeredCharacter = null, int fireCount = 1, Action cardTriggerFiredCallback = null)
 {
     if (ProviderManager.TryGetProvider <CombatManager>(out CombatManager combatManager))
     {
         combatManager.StartCoroutine(
             (IEnumerator)AccessTools.Method(
                 typeof(CombatManager),
                 "FireCardTriggers"
                 )
             .Invoke(combatManager,
                     new object[7]
         {
             cardTrigger.GetEnum(),
             playedCard,
             roomIndex,
             ignoreDeadInTargeting,
             triggeredCharacter,
             fireCount,
             cardTriggerFiredCallback
         }
                     )
             );
     }
 }
 /// <summary>
 /// Associates two triggers with eachother allowing MT to cast from one trigger to another
 /// </summary>
 /// <param name="cardTrigger">CardTrigger to be Associated</param>
 /// <param name="characterTrigger">CharacterTrigger to be Associated</param>
 public static void AssociateTriggers(CardTrigger cardTrigger, CharacterTrigger characterTrigger)
 {
     CharToCardTriggerDict[characterTrigger.GetEnum()] = cardTrigger.GetEnum();
     CardToCharTriggerDict[cardTrigger.GetEnum()]      = characterTrigger.GetEnum();
 }