public BattlefieldVision(PawnModel posessedPawn, Orientation directionOfAttack, UnitsContainer units, MapModel map, BattleCircumstances battleCircumstances) { _posessedPawn = posessedPawn; _directionOfAttack = directionOfAttack; _units = units; _map = map; _battleCircumstances = battleCircumstances; }
public static bool IsActivated(this EffectActivationCircumstances activationCircumstances, BattleCircumstances battleCircumstances) { if (activationCircumstances == EffectActivationCircumstances.Allways) { return(true); } else if (activationCircumstances == EffectActivationCircumstances.StepBattle && battleCircumstances == BattleCircumstances.Step) { return(true); } else if (activationCircumstances == EffectActivationCircumstances.DirectorBattle && battleCircumstances == BattleCircumstances.Director) { return(true); } return(false); }
public BattleResults PerformPassiveOnlyBattleAtPlace(MyHexPosition battleActivatorPosition, BattleCircumstances battleCircumstances) { var arbiter = new BattleArbiter(Units, Projectiles, MapModel); return(arbiter.PerformPassiveBattleAtPlace(battleActivatorPosition, battleCircumstances)); }
public BattleResults PerformPassiveBattleAtPlace(MyHexPosition battleActivatorPosition, BattleCircumstances battleCircumstances) { var battleResults = new BattleResults(); var intruderUnit = _units.GetPawnAt(battleActivatorPosition); // First - Passive effects of all neighbours foreach (var pair in battleActivatorPosition.NeighboursWithDirections) { if (_mapModel.HasTileAt(pair.NeighbourPosition)) // is valid position { if (_units.IsPawnAt(pair.NeighbourPosition)) { var neighbourUnit = _units.GetPawnAt(pair.NeighbourPosition); if (!battleResults.UnitIncapaciated(neighbourUnit)) { battleResults.Add(PerformSingleFight(intruderUnit, neighbourUnit, pair.NeighbourDirection, symbol => symbol.PassiveEffect, battleCircumstances)); if (battleResults.UnitIncapaciated(intruderUnit)) { return(battleResults); } } } } } foreach (var pair in battleActivatorPosition.NeighboursWithDirections) { if (_mapModel.HasTileAt(pair.NeighbourPosition)) // is valid position { if (_units.IsPawnAt(pair.NeighbourPosition)) { var neighbourUnit = _units.GetPawnAt(pair.NeighbourPosition); if (!battleResults.UnitIncapaciated(neighbourUnit)) { battleResults.Add(PerformSingleFight(neighbourUnit, intruderUnit, pair.NeighbourDirection.Opposite(), symbol => symbol.PassiveEffect, battleCircumstances)); if (battleResults.UnitIncapaciated(intruderUnit)) { return(battleResults); } } } } } return(battleResults); }
private BattleEngagement PerformSingleActiveFight(UnitModel attacker, Orientation orientation, BattleCircumstances battleCircumstances) { var engagementResult = new BattleEngagementResult(); var engagement = new BattleEngagement(engagementResult); var attackerSymbolLocalDirection = attacker.Orientation.CalculateLocalDirection(orientation); if (!attacker.Symbols.ContainsKey(attackerSymbolLocalDirection)) { return(engagement); } var symbol = attacker.Symbols[attackerSymbolLocalDirection]; var effect = symbol.ActiveEffect; var attackerBattlefieldVision = new BattlefieldVision(attacker, attackerSymbolLocalDirection, _units, _mapModel, battleCircumstances); if (!effect.IsActivated(attackerBattlefieldVision, attacker.Position)) { return(engagement); } var defender = effect.RetriveTarget(attackerBattlefieldVision, attacker.Position); var defendingSymbolLocalDirection = defender.Orientation.CalculateLocalDirection(orientation.Opposite()); AddEngagementElement(attacker, defender, engagement, effect); effect.Execute(attackerBattlefieldVision, attacker.Position, engagementResult); if (!effect.IsDefendableEffect) { return(engagement); } if (!defender.Symbols.ContainsKey(defendingSymbolLocalDirection)) { return(engagement); } var defenderBattlefieldVision = new BattlefieldVision(defender, defendingSymbolLocalDirection, _units, _mapModel, battleCircumstances); var defenderEffect = defender.Symbols[defendingSymbolLocalDirection].ReactEffect; if (defenderEffect.IsActivated(defenderBattlefieldVision, attacker.Position)) { AddEngagementElement(defender, attacker, engagement, defenderEffect); defenderEffect.Execute(defenderBattlefieldVision, attacker.Position, engagementResult); } return(engagement); }
private BattleEngagement PerformSingleFight(UnitModel defender, UnitModel attacker, Orientation attackerDirectionFromDefender, Func <SymbolModel, IEffect> attackingEffectExtractor, BattleCircumstances battleCircumstances) { var engagementResult = new BattleEngagementResult(); var engagement = new BattleEngagement(engagementResult); if (defender.Owner == attacker.Owner) { return(engagement); } var attackerSymbolLocalDirection = attacker.Orientation.CalculateLocalDirection(attackerDirectionFromDefender.Opposite()); var defendingSymbolLocalDirection = defender.Orientation.CalculateLocalDirection(attackerDirectionFromDefender); if (attacker.Symbols.ContainsKey(attackerSymbolLocalDirection)) { var symbol = attacker.Symbols[attackerSymbolLocalDirection]; var effect = attackingEffectExtractor(symbol); var attackerBattlefieldVision = new BattlefieldVision(attacker, attackerSymbolLocalDirection, _units, _mapModel, battleCircumstances); if (effect.IsActivated(attackerBattlefieldVision, attacker.Position)) { AddEngagementElement(attacker, defender, engagement, effect); effect.Execute(attackerBattlefieldVision, attacker.Position, engagementResult); } if (!effect.IsDefendableEffect) { return(engagement); } if (defender.Symbols.ContainsKey(defendingSymbolLocalDirection)) { var defenderBattlefieldVision = new BattlefieldVision(defender, defendingSymbolLocalDirection, _units, _mapModel, battleCircumstances); var defenderEffect = defender.Symbols[defendingSymbolLocalDirection].ReactEffect; if (defenderEffect.IsActivated(defenderBattlefieldVision, attacker.Position)) { AddEngagementElement(defender, attacker, engagement, defenderEffect); defenderEffect.Execute(defenderBattlefieldVision, attacker.Position, engagementResult); } } } return(engagement); }
public JourneyBattle(BattleCircumstances battleCircumstances) { _battleCircumstances = battleCircumstances; }