Пример #1
0
        public int Apply(int value)
        {
            if (_initialisationFunction != null)
            {
                return(value + _cachedValue);
            }

            if (_costFunction != null && (_condition == null || _condition.Eval(_owner)))
            {
                if (_operator == EffectOperator.SUB)
                {
                    return(value - _costFunction.Invoke(_owner));
                }
                if (_operator == EffectOperator.SET)
                {
                    return(_costFunction.Invoke(_owner));
                }
                if (_operator == EffectOperator.ADD)
                {
                    return(value + _costFunction.Invoke(_owner));
                }
                if (_operator == EffectOperator.MUL)
                {
                    return(value * _costFunction.Invoke(_owner));
                }
            }

            if (_isAppliedThisTurn)
            {
                return(_value);
            }

            return(value);
        }
Пример #2
0
 public int Apply(int value)
 {
     if (_condition == null || _condition.Eval(_owner))
     {
         if (_costFunction != null)
         {
             if (_operator == EffectOperator.SUB)
             {
                 return(value - _costFunction.Invoke(_owner));
             }
             if (_operator == EffectOperator.SET)
             {
                 return(_costFunction.Invoke(_owner));
             }
             if (_operator == EffectOperator.ADD)
             {
                 return(value + _costFunction.Invoke(_owner));
             }
             if (_operator == EffectOperator.MUL)
             {
                 return(value * _costFunction.Invoke(_owner));
             }
         }
     }
     return(value);
 }
Пример #3
0
        private void Trigger(IEntity sender)
        {
            if (_isTriggered)
            {
                return;
            }

            switch (_triggerSource)
            {
            case TriggerSource.ALL:
                break;

            case TriggerSource.FRIENDLY:
                if (sender.Controller != Owner.Controller)
                {
                    return;
                }
                break;

            default:
                throw new NotImplementedException();
            }

            if (_condition != null)
            {
                if (!(sender is IPlayable p))
                {
                    p = _owner;
                }

                if (!(_condition.Eval(p)))
                {
                    return;
                }
            }

            if (_initialisationFunction != null)
            {
                _cachedValue += _costFunction.Invoke((IPlayable)sender);
            }
            else
            {
                _isTriggered = true;

                _owner.Game.TriggerManager.EndTurnTrigger += _removedHandler;
            }
        }
Пример #4
0
        public static ISimpleTask SummonAllFriendlyDiedThisTurn(SelfCondition condition = null)
        {
            return(new CustomTask((g, c, s, t, stack) =>
            {
                BoardZone board = c.BoardZone;
                if (board.IsFull)
                {
                    return;
                }

                int num = c.NumFriendlyMinionsThatDiedThisTurn;
                ReadOnlySpan <IPlayable> graveyard = c.GraveyardZone.GetSpan();
                Span <int> buffer = stackalloc int[num]; int k = 0;

                for (int i = graveyard.Length - 1, j = 0; j < num; --i)
                {
                    if (!graveyard[i].ToBeDestroyed)
                    {
                        continue;
                    }
                    if (graveyard[i].Card.Type != CardType.MINION)
                    {
                        continue;
                    }
                    j++;
                    if ((!condition?.Eval(graveyard[i]) ?? false))
                    {
                        continue;
                    }
                    buffer[k++] = i;
                }

                for (--k; k >= 0; --k)
                {
                    Entity.FromCard(in c, graveyard[buffer[k]].Card,
                                    zone: board, creator: in s);
                    if (board.IsFull)
                    {
                        return;
                    }
                }
            }));
        }
        private void Trigger(IEntity sender)
        {
            if (_isTriggered)
            {
                return;
            }

            switch (_triggerSource)
            {
            case TriggerSource.ALL:
                break;

            case TriggerSource.FRIENDLY:
                if (sender.Controller != Owner.Controller)
                {
                    return;
                }
                break;

            default:
                throw new NotImplementedException();
            }

            if (_condition != null)
            {
                if (!(sender is IPlayable p))
                {
                    return;
                }

                if (!(_condition.Eval(p)))
                {
                    return;
                }
            }

            _owner.Game.TriggerManager.EndTurnTrigger += _removedHandler;

            _isTriggered = true;
        }
Пример #6
0
        private void Validate(IEntity source)
        {
            if (_isSecret && _owner.IsExhausted && _triggerType != TriggerType.TURN_START)
            {
                return;
            }

            switch (TriggerSource)
            {
            case TriggerSource.ALL:
                break;

            case TriggerSource.FRIENDLY:
                if (source.Controller != _owner.Controller)
                {
                    return;
                }
                break;

            case TriggerSource.ENEMY when source.Controller == _owner.Controller: return;

            case TriggerSource.SELF:
                if (source.Id != _sourceId)
                {
                    return;
                }
                break;

            case TriggerSource.ALL_MINIONS:
                if (!(source is Minion))
                {
                    return;
                }
                break;

            case TriggerSource.MINIONS:
                if (!(source is Minion) || source.Controller != _owner.Controller)
                {
                    return;
                }
                break;

            case TriggerSource.MINIONS_EXCEPT_SELF:
                if (!(source is Minion) || source.Controller != _owner.Controller || source.Id == _sourceId ||
                    source.Zone.Type != Zone.PLAY)
                {
                    return;
                }
                break;

            case TriggerSource.ALL_MINIONS_EXCEPT_SELF:
                if (!(source is Minion) || source == _owner)
                {
                    return;
                }
                break;

            case TriggerSource.OP_MINIONS:
                if (!(source is Minion) || source.Controller == _owner.Controller)
                {
                    return;
                }
                break;

            case TriggerSource.HERO:
                if (!(source is Hero) || source.Controller != _owner.Controller)
                {
                    return;
                }
                break;

            case TriggerSource.ENCHANTMENT_TARGET:
                if (!(_owner is Enchantment e) || e.Target.Id != source.Id)
                {
                    return;
                }
                break;

            case TriggerSource.WEAPON:
                if (!(source is Weapon w) || w.Controller != source.Controller)
                {
                    return;
                }
                break;

            case TriggerSource.HERO_POWER:
                if (!(source is HeroPower hp) || hp.Controller != source.Controller)
                {
                    return;
                }
                break;

            case TriggerSource.FRIENDLY_SPELL_CASTED_ON_THE_OWNER:
                if (!(source is Spell) || source.Controller != _owner.Controller || Game.CurrentEventData?.EventTarget != _owner)
                {
                    return;
                }
                break;

            case TriggerSource.FRIENDLY_SPELL_CASTED_ON_OWN_MINIONS:
                if (!(source is Spell) || source.Controller != _owner.Controller || Game.CurrentEventData?.EventTarget?.Controller != _owner.Controller)
                {
                    return;
                }
                break;

            case TriggerSource.FRIENDLY_EVENT_SOURCE:
                if (Game.CurrentEventData?.EventSource.Controller != _owner.Controller)
                {
                    return;
                }
                break;
            }

            //bool extra = false;

            switch (_triggerType)
            {
            case TriggerType.PLAY_CARD when source.Id == _owner.Id:
            case TriggerType.SUMMON when source == _owner:
            case TriggerType.AFTER_SUMMON when source.Id == _owner.Id:
            case TriggerType.TURN_START when !EitherTurn && source != _owner.Controller:
            case TriggerType.DEATH when _owner.ToBeDestroyed:
            case TriggerType.INSPIRE when !EitherTurn && Game.CurrentPlayer != _owner.Controller:
            case TriggerType.SHUFFLE_INTO_DECK when Game.CurrentEventData?.EventSource.Card.AssetId == 49269:
                return;

            case TriggerType.TURN_END:
            case TriggerType.WORGEN_TRANSFORM:
                if (!EitherTurn && source != _owner.Controller)
                {
                    return;
                }
                //if (!(SingleTask is RemoveEnchantmentTask) && Owner.Controller.ExtraEndTurnEffect)
                // extra = true;
                break;
            }

            if (Condition != null)
            {
                IPlayable s = source as IPlayable ?? _owner;
                if (!Condition.Eval(s))
                {
                    return;
                }
            }

            Validated = true;
        }
        public void Update()
        {
            if (_on)
            {
                int value;

                if (_isSwitching)
                {
                    value = _condition.Eval(_owner) ? 1 : 0;

                    if (value == _lastValue)
                    {
                        return;
                    }


                    if (_tag == GameTag.ATK)
                    {
                        ATK.Effect(_operator, _lastValue).RemoveFrom(_owner);
                        ATK.Effect(_operator, value).ApplyTo(_owner);
                    }
                    else
                    {
                        new Effect(_tag, _operator, _lastValue).RemoveFrom(_owner);
                        new Effect(_tag, _operator, value).ApplyTo(_owner);
                    }
                }
                else
                {
                    value = _valueFunction(_owner);

                    if (_tag == GameTag.ATK)
                    {
                        if (!(_owner is Character c))
                        {
                            if (_owner is Weapon)
                            {
                                c = _owner.Controller.Hero;
                            }
                            else
                            {
                                throw new Exception($"Can't apply ATK aura {this} to entity {_owner}");
                            }
                        }

                        if (_operator == EffectOperator.SET)
                        {
                            c._modifiedATK = 0;
                            ATK.Effect(EffectOperator.ADD, _lastValue).RemoveAuraFrom(c);
                            value = value - (c.AuraEffects?.ATK ?? 0);
                            ATK.Effect(EffectOperator.ADD, value).ApplyAuraTo(c);
                        }
                        else
                        {
                            ATK.Effect(_operator, _lastValue).RemoveAuraFrom(c);
                            ATK.Effect(_operator, value).ApplyAuraTo(c);
                        }
                    }
                    else
                    {
                        new Effect(_tag, _operator, _lastValue).RemoveAuraFrom(_owner);
                        new Effect(_tag, _operator, value).ApplyAuraTo(_owner);
                    }
                }

                _lastValue = value;
            }
            else
            {
                if (_isSwitching)
                {
                    if (_tag == GameTag.ATK)
                    {
                        ATK.Effect(_operator, _lastValue).RemoveFrom(_owner);
                    }
                    else
                    {
                        new Effect(_tag, _operator, _lastValue).RemoveFrom(_owner);
                    }
                }
                else
                {
                    if (_tag == GameTag.ATK)
                    {
                        ATK.Effect(_operator, _lastValue).RemoveAuraFrom(_owner is Weapon ? _owner.Controller.Hero : _owner);
                    }
                    else
                    {
                        new Effect(_tag, _operator, _lastValue).RemoveAuraFrom(_owner);
                    }
                }

                _owner.Game.Auras.Remove(this);
            }
        }
Пример #8
0
        private void Validate(IEntity source)
        {
            if (_isSecret && _owner.IsExhausted)
            {
                return;
            }

            switch (TriggerSource)
            {
            case TriggerSource.FRIENDLY:
                if (source.Controller.Id != _controllerId)
                {
                    return;
                }
                break;

            case TriggerSource.ENEMY when source.Controller.Id == _controllerId: return;

            case TriggerSource.SELF:
                if (source.Id != _sourceId)
                {
                    return;
                }
                break;

            case TriggerSource.ALL_MINIONS:
                if (!(source is Minion))
                {
                    return;
                }
                break;

            case TriggerSource.MINIONS:
                if (!(source is Minion) || source.Controller.Id != _controllerId)
                {
                    return;
                }
                break;

            case TriggerSource.MINIONS_EXCEPT_SELF:
                if (!(source is Minion) || source.Controller.Id != _controllerId || source.Id == _sourceId ||
                    source.Zone.Type != Zone.PLAY)
                {
                    return;
                }
                break;

            case TriggerSource.ALL_MINIONS_EXCEPT_SELF:
                if (!(source is Minion) || source == _owner)
                {
                    return;
                }
                break;

            case TriggerSource.HERO:
                if (!(source is Hero) || source.Controller.Id != _controllerId)
                {
                    return;
                }
                break;

            case TriggerSource.ENCHANTMENT_TARGET:
                if (!(_owner is Enchantment e) || e.Target.Id != source.Id)
                {
                    return;
                }
                break;

            case TriggerSource.WEAPON:
                if (!(source is Weapon w) || w.Controller != source.Controller)
                {
                    return;
                }
                break;

            case TriggerSource.HERO_POWER:
                if (!(source is HeroPower hp) || hp.Controller != source.Controller)
                {
                    return;
                }
                break;
            }

            //bool extra = false;

            switch (_triggerType)
            {
            case TriggerType.PLAY_CARD when source.Id == _owner.Id:
            case TriggerType.AFTER_SUMMON when source.Id == _owner.Id:
            case TriggerType.TURN_START when !EitherTurn && source.Id != _controllerId:
            case TriggerType.DEATH when _owner.ToBeDestroyed:
            case TriggerType.INSPIRE when Game.CurrentPlayer != _owner.Controller:
                return;

            case TriggerType.TURN_END:
                if (!EitherTurn && source.Id != _controllerId)
                {
                    return;
                }
                //if (!(SingleTask is RemoveEnchantmentTask) && Owner.Controller.ExtraEndTurnEffect)
                // extra = true;
                break;
            }

            if (Condition != null)
            {
                IPlayable s = source as IPlayable ?? _owner;
                if (!Condition.Eval(s))
                {
                    return;
                }
            }

            Validated = true;
        }