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