public bool Attack(BattleUnitsStack target) { if (_state != BattleState.InGame) { return(false); } var source = GetCurrentStack(); if (source.GetArmy() == target.GetArmy()) { return(false); } var hitPoints = DamageUtils.CalcDamageHitPoints(source, target); // Fire before attack event var beforeAttackEventArgs = new BeforeAttackEventArgs(source, target, hitPoints); EventBus.OnBeforeAttack(this, beforeAttackEventArgs); if (beforeAttackEventArgs.Cancel) { return(false); } hitPoints = beforeAttackEventArgs.HitPoints; target.Damage(hitPoints); // Fire after attack event EventBus.OnAfterAttack(this, new AfterAttackEventArgs(source, target, hitPoints)); if (target.IsAlive() && !target.IsAnswered()) { var answerHitPoints = DamageUtils.CalcDamageHitPoints(target, source); // Fire before answer event var beforeAnswerEventArgs = new BeforeAnswerEventArgs(source, target, answerHitPoints); EventBus.OnBeforeAnswer(this, beforeAnswerEventArgs); if (!beforeAnswerEventArgs.Cancel) { answerHitPoints = beforeAnswerEventArgs.HitPoints; source.Damage(answerHitPoints); target.SetAnswered(beforeAnswerEventArgs.IsAnswered); // Fire after answer event EventBus.OnAfterAnswer(this, new AfterAnswerEventArgs(source, target, hitPoints, beforeAnswerEventArgs.IsAnswered)); } } NextTurn(); return(true); }
public static void OnBeforeAnswer(object sender, BeforeAnswerEventArgs args) { BeforeAnswer?.Invoke(sender, args); }