Ejemplo n.º 1
0
        private FightPhase ComputePhase(SkillForecast skillForecast, DamageTallyer damageSoFar, IRandomizer randomizer)
        {
            var initiator = skillForecast.Attacker;
            var receiver  = skillForecast.Defender;
            var skill     = _skillDatabase.GetStrategyByType(skillForecast.Type);
            var effects   = skill.FinalizeForecast(skillForecast, randomizer);
            var didMiss   = effects.ReceiverEffects.OfType <Miss>().Any();

            damageSoFar.ApplyDamage(effects.GetDefenderDamage());

            return(new FightPhase {
                Initiator = initiator,
                Receiver = receiver,
                ReceverDies = damageSoFar.IsDead(),
                Response = didMiss ? DefenderResponse.Dodge : DefenderResponse.GetHit,
                Effects = effects,
                Skill = skillForecast.Type
            });
        }
Ejemplo n.º 2
0
        public FightForecast Forecast(ICombatant attacker, ICombatant defender, SkillType type)
        {
            var strategy      = _skillDatabase.GetStrategyByType(type);
            var firstSkill    = strategy.Forecast(attacker, defender);
            var flankForecast = null as SkillForecast;

            if (strategy.SupportsFlanking)
            {
                var direction       = MathUtils.DirectionTo(attacker.Position, defender.Position);
                var flankerPosition = MathUtils.GetPositionAcrossFight(attacker.Position, direction);
                var flankerDistance = MathUtils.ManhattanDistance(defender.Position, flankerPosition);

                var flanker = _map.GetAtPosition(flankerPosition);
                if (flanker != null && flanker.Army == ArmyType.Friendly)
                {
                    var flankerStrategy = ChooseStrategyByDistance(flanker, flankerDistance);
                    if (flankerStrategy != null)
                    {
                        flankForecast = flankerStrategy.Forecast(flanker, defender);
                    }
                }
            }

            var distance         = MathUtils.ManhattanDistance(attacker.Position, defender.Position);
            var counterStrategy  = ChooseStrategyByDistance(defender, distance);
            var defenderforecast = null as SkillForecast;

            if (counterStrategy != null)
            {
                defenderforecast = counterStrategy.Forecast(defender, attacker);
            }

            return(new FightForecast {
                AttackerForecast = firstSkill,
                DefenderForecast = defenderforecast,
                FlankerForecast = flankForecast
            });
        }