public TerrainConditionFactory()
        {
            TarrainConditions = new List<TerrainCondition>();

            Uri dataUri = new Uri(Constants.TerrainConditionDataPath, UriKind.Relative);
            XElement applicationXml;
            StreamResourceInfo xmlStream = Application.GetResourceStream(dataUri);
            applicationXml = XElement.Load(xmlStream.Stream);
            var data = from wz in applicationXml.Descendants("TerrainCondition")
                       select wz;

            TerrainCondition terrainCondition = null;
            foreach (var d in data)
            {
                terrainCondition = new TerrainCondition();
                terrainCondition.TerrainConditionId = (Int32)d.Element("TerrainConditionId");
                terrainCondition.TerrainConditionDescription = (String)d.Element("TerrainConditionDescription");
                TarrainConditions.Add(terrainCondition);
            }
        }
예제 #2
0
        private int DetermineDefenseGradeOverrides(IUnit attackingUnit, IUnit defendingUnit, 
            TerrainCondition terrainCondition, int defenderDefenseGrade)
        {
            if (attackingUnit is LandCombatUnit && defendingUnit is ISeaUnit)
            {
                defenderDefenseGrade += 8;
            }

            if (attackingUnit.EquipmentClassEnum == EquipmentClassEnum.Artillery &&
                terrainCondition.TerrainConditionEnum != TerrainConditionEnum.Dry)
            {
                defenderDefenseGrade += 3;
            }
            if (defendingUnit.EquipmentClassEnum == EquipmentClassEnum.Artillery)
            {
                defenderDefenseGrade += 3;
            }
            if (attackingUnit.EquipmentClassEnum == EquipmentClassEnum.Infantry &&
                defendingUnit.EquipmentSubClassEnum == EquipmentSubClassEnum.TowedLightAntiTank)
            {
                defenderDefenseGrade += 2;
            }
            if (attackingUnit.EquipmentClassEnum == EquipmentClassEnum.Infantry &&
                defendingUnit.EquipmentSubClassEnum == EquipmentSubClassEnum.TowedHeavyAntiTank)
            {
                defenderDefenseGrade += 2;
            }
            return defenderDefenseGrade;
        }
예제 #3
0
        private Volley CalculateVolley(IUnit attackingUnit, IUnit defendingUnit, 
            Tile attackingTile, Tile defendingTile, TerrainCondition terrainCondition)
        {
            Volley volley = new Volley();

            volley.AttackerUnit = attackingUnit;
            volley.AttackerTile = attackingTile;
            volley.DefenderUnit = defendingUnit;
            volley.DefenderTile = defendingTile;

            int attackerAttackGrade = 0;
            int defenderDefenseGrade = 0;
            int netAttackGrade = 0;

            int attackingUnitStartingStrength = attackingUnit.CurrentStrength;
            int defendingUnitStartingStrength = defendingUnit.CurrentStrength;

            attackerAttackGrade = CalculateAttackGrade(attackingUnit, defendingUnit, defendingTile);
            defenderDefenseGrade = CalculateDefenseGrade(attackingUnit, defendingUnit,
                attackingTile, defendingTile, terrainCondition);
            netAttackGrade = attackerAttackGrade - defenderDefenseGrade;

            SetVolleyResults(attackingUnit, defendingUnit, netAttackGrade);

            int attackingUnitStrengthLoss = attackingUnitStartingStrength - attackingUnit.CurrentStrength;
            int defendingUnitStrengthLoss = defendingUnitStartingStrength - defendingUnit.CurrentStrength;

            if (attackingUnit is ICombatUnit)
            {
                ICombatUnit combatUnit = (ICombatUnit)attackingUnit;
                combatUnit.CurrentAmmo += -1;
            }
            if (defendingUnit is ICombatUnit)
            {
                ICombatUnit combatUnit = (ICombatUnit)defendingUnit;
                combatUnit.CurrentAmmo += -1;
            }

            if (attackingUnitStrengthLoss > 0 && defendingUnitStrengthLoss > 0)
            {
                volley.VollyOutcomeEnum= VolleyOutcomeEnum.AttackerHurt_DefenderHurt;
            }
            else if (attackingUnitStrengthLoss > 0 && defendingUnitStrengthLoss == 0)
            {
                volley.VollyOutcomeEnum = VolleyOutcomeEnum.AttackerHurt_DefenderUnhurt;
            }
            else if (attackingUnitStrengthLoss == 0 && defendingUnitStrengthLoss > 0)
            {
                volley.VollyOutcomeEnum = VolleyOutcomeEnum.AttackerUnhurt_DefenderHurt;
            }
            else
            {
                volley.VollyOutcomeEnum = VolleyOutcomeEnum.AttackerUnhurt_DefenderUnhurt;
            }

            return volley;
        }
예제 #4
0
        private Int32 CalculateDefenseGrade(IUnit attackingUnit, IUnit defendingUnit, 
            Tile attackingTile, Tile defendingTile, TerrainCondition terrainCondition)
        {
            int defenderDefenseGrade = 0;
            if (attackingUnit is IAirUnit)
            {
                defenderDefenseGrade = defendingUnit.Equipment.AirDefense;
            }
            else
            {
                defenderDefenseGrade = defendingUnit.Equipment.GroundDefense;
            }
            defenderDefenseGrade += defendingUnit.CurrentNumberOfStars;
            if (attackingTile.Terrain.RiverInd == true)
            {
                defenderDefenseGrade += 4;
            }
            if (CalculateRuggedDefense(attackingUnit, defendingUnit))
            {
                defenderDefenseGrade += 4;
            }
            defenderDefenseGrade = DetermineDefenseGradeEntrenchment(attackingUnit, defendingUnit, defenderDefenseGrade);
            defenderDefenseGrade = DetermineDefenseGradeOverrides(attackingUnit, defendingUnit, terrainCondition, defenderDefenseGrade);

            return defenderDefenseGrade;
        }