Ejemplo n.º 1
0
        public bool PerformAttack(Action action, Actor attacker, Actor defender, bool?canMiss)
        {
            if (canMiss == null)
            {
                canMiss = true;
            }

            var attackNoun = Noun ?? attacker;

            // See if the attack hits.
            if (canMiss.Value)
            {
                var dodge  = defender.Dodge + StrikeBonus;
                var strike = Rng.Instance.Inclusive(1, 100);

                // There's always at least a 5% chance of missing and a 5% chance of
                // hitting, regardless of all modifiers.
                strike = strike.Clamp(5, 95);

                if (strike < dodge)
                {
                    action.Log("{1} miss[es] {2}.", attackNoun, defender);
                    return(false);
                }
            }

            // Roll for damage.
            var damage = _rollDamage();

            if (damage == 0)
            {
                // Armor cancelled out all damage.
                action.Log("{1} do[es] no damage to {2}.", attackNoun, defender);
                return(true);
            }

            attacker.OnDamage(action, defender, damage);
            if (defender.TakeDamage(action, damage, attackNoun, attacker))
            {
                return(true);
            }

            if (Resistance == 0)
            {
                _elementalSideEffect(defender, action, damage);
            }

            // TODO: Pass in and use element.
            action.AddEvent(EventType.Hit, defender, damage.ToString());
            action.Log("{1} " + Verb + " {2}.", attackNoun, defender);
            return(true);
        }