Exemple #1
0
        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());
                    }
                }
            }
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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);
                    }
                }
            }
        }
Exemple #5
0
        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));
        }