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); }
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); }
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; } }
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; }
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); } }
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; }