static void Postfix(CardManager.DiscardCardParams discardCardParams, bool fromNaturalPlay) { ProviderManager.TryGetProvider(out SaveManager saveManager); ProviderManager.TryGetProvider(out RoomManager roomManager); if (saveManager == null || roomManager == null) { return; } if (saveManager.PreviewMode) { return; } RoomState room = roomManager.GetRoom(roomManager.GetSelectedRoom()); List <CharacterState> toProcessCharacters = new List <CharacterState>(); room.AddCharactersToList(toProcessCharacters, Team.Type.Heroes | Team.Type.Monsters); foreach (CharacterState toProcessCharacter in toProcessCharacters) { foreach (IRoomStateModifier roomStateModifier in toProcessCharacter.GetRoomStateModifiers()) { IRoomStateCardDiscardedAdvancedModifier mod; if ((mod = roomStateModifier as IRoomStateCardDiscardedAdvancedModifier) != null) { mod.OnCardDiscarded(discardCardParams, roomManager.GetSelectedRoom()); } } } }
static IEnumerator Postfix(IEnumerator __result, CombatManager __instance, RoomState room) { ProviderManager.TryGetProvider <RoomManager>(out RoomManager roomManager); List <CharacterState> targets = new List <CharacterState>(); room.AddCharactersToList(targets, Team.Type.Heroes); yield return(WardManager.TriggerWards("RandomDamage", room.GetRoomIndex(), targets)); yield return(__result); }
static bool Prefix(CardManager __instance, CardState cardState, CardTraitData cardTraitData) { // With the base value set, we now have to override the result to not remove Consume if all of the following are true: // - Card already has the Consume temporary Trait // - Trait Data to be removed is of type Consume // - RoomStateModifierStartersConsumeRebate is present on the selected floor // - The card is a starter // We do this because we don't want to conflict with the Discard remove consume handled via the RoomModifierData itself if (cardState != null && cardState.HasTrait(typeof(CardTraitExhaustState))) { if (cardTraitData != null && cardTraitData.GetTraitStateName() == "CardTraitExhaustState") { // Trait matches, so search RoomModifierData ProviderManager.TryGetProvider(out RoomManager roomManager); if (roomManager == null) { return(true); } RoomState room = roomManager.GetRoom(roomManager.GetSelectedRoom()); List <CharacterState> toProcessCharacters = new List <CharacterState>(); room.AddCharactersToList(toProcessCharacters, Team.Type.Heroes | Team.Type.Monsters); foreach (CharacterState toProcessCharacter in toProcessCharacters) { foreach (IRoomStateModifier roomStateModifier in toProcessCharacter.GetRoomStateModifiers()) { RoomStateModifierStartersConsumeRebate stateOfType; if ((stateOfType = roomStateModifier as RoomStateModifierStartersConsumeRebate) != null) { // Room Modifier matches, so now check if it's a starter if (RoomStateModifierStartersConsumeRebate.IsCardStarterSpell(cardState)) { // In the case where we're saying "we found a card that should still have the Consume trait", we want to add it to the list // This tells the RoomModifierData that it's a card it should be tracking now that Diligent's effect has worn off // We make sure it's not already in the list because multiple things could be played on this floor after Diligent's effect wears off if (!stateOfType.cardsWeHaveModified.Contains(cardState)) { stateOfType.cardsWeHaveModified.Add(cardState); } // Is a starter, so override and force it to not remove the trait return(stateOfType.allowRemovals); } } } } } } return(true); }
static void Postfix(RoomState __instance, Team.Type team, int pivotIndex) { List <CharacterState> toProcessCharacters = new List <CharacterState>(); __instance.AddCharactersToList(toProcessCharacters, Team.Type.Monsters); foreach (CharacterState toProcessCharacter in toProcessCharacters) { foreach (IRoomStateModifier roomStateModifier in toProcessCharacter.GetRoomStateModifiers()) { IRoomStateSpawnPointsModifier roomStateShiftPointOccupantsModifier; if ((roomStateShiftPointOccupantsModifier = roomStateModifier as IRoomStateSpawnPointsModifier) != null) { roomStateShiftPointOccupantsModifier.ShiftSpawnPoints(toProcessCharacter, __instance, team, pivotIndex); } } } }
public override IEnumerator OnTrigger(List <CharacterState> targets) { ProviderManager.TryGetProvider <RoomManager>(out RoomManager roomManager); if (targets.Count < 1) { yield break; } RoomState room = roomManager.GetRoom(targets[0].GetCurrentRoomIndex()); targets.Clear(); room.AddCharactersToList(targets, Team.Type.Heroes); if (targets.Count > 0) { CharacterState randomizedTarget = targets[RandomManager.Range(0, targets.Count, RngId.Battle)]; // Don't target units with Phased while (randomizedTarget.HasStatusEffect("untouchable")) { targets.Remove(randomizedTarget); if (targets.Count > 0) { randomizedTarget = targets[RandomManager.Range(0, targets.Count, RngId.Battle)]; } else { break; } } // Double check that we haven't emptied the targets list due to phased checks if (targets.Count > 0) { yield return(ProviderManager.CombatManager.ApplyDamageToTarget(power, randomizedTarget, new CombatManager.ApplyDamageToTargetParameters())); } } yield return(new WaitForSeconds(0.3f)); }