public bool RedirectDamage(Damage damage, ITarget target) { foreach (var redirection in _redirections.ToList()) { if (redirection.RedirectDamage(damage, target)) { return true; } } return false; }
public static void ReceiveDamage(this ITarget target, Damage damage) { var damageable = target as IDamageable; if (damageable != null) { damageable.ReceiveDamage(damage); } }
//public int CountersCount(CounterType? counterType = null) //{ // if (counterType == null) // return _counters.Count; // return _counters.CountSpecific(counterType.Value); //} //public CombatAbilities GetCombatAbilities() //{ // return _combatRules.GetAbilities(); //} public void DealDamageTo(int amount, IDamageable damageable, bool isCombat) { if (amount <= 0) return; var damage = new Damage( amount: amount, source: this, isCombat: isCombat); damage.Initialize(ChangeTracker); damageable.ReceiveDamage(damage); }
public void ReceiveDamage(Damage damage) { if (!Is().Creature || !IsPermanent) return; if (HasProtectionFrom(damage.Source)) { return; } var amountToPrevent = Game.PreventDamage(new PreventDamageParameters { Amount = damage.Amount, Source = damage.Source, Target = this, IsCombat = damage.IsCombat, QueryOnly = false }); damage.Amount -= amountToPrevent; if (damage.Amount == 0) return; var wasRedirected = Game.RedirectDamage(damage, this); if (wasRedirected) return; Damage += damage.Amount; if (Damage >= Toughness) //|| damage.IsLeathal { _hasLeathalDamage.Value = true; } //if (damage.Source.Has().Lifelink) //{ // var controller = damage.Source.Controller; // controller.Life += damage.Amount; //} Publish(new DamageDealtEvent(this, damage)); }
public void ReceiveDamage(Damage damage) { var p = new PreventDamageParameters { Amount = damage.Amount, Source = damage.Source, Target = this, IsCombat = damage.IsCombat, QueryOnly = false }; var prevented = Game.PreventDamage(p); damage.Amount -= prevented; if (damage.Amount == 0) return; var wasRedirected = Game.RedirectDamage(damage, this); if (wasRedirected) return; var preventedLifeloss = Game.PreventLifeloss(damage.Amount, this, queryOnly: false); Life -= (damage.Amount - preventedLifeloss); //if (damage.Source.Has().Lifelink) //{ // var controller = damage.Source.Controller; // controller.Life += damage.Amount; //} Publish(new DamageDealtEvent(this, damage)); }