//вычисляем табличное значение условия попадания в ближнем бою
 public static int MeleeHitCondition(CombatLib.Offence.Melee.OffenceMelee AttackingPlayer, CombatLib.Defence.Melee.DefenceMelee DefendingPlayer,
     ref CombatLib.Phases.PhaseHits.PhaseHits Hits)
 {
     if (AttackingPlayer.WS - DefendingPlayer.WS > 0) Hits.Condition = 3;
     else if (AttackingPlayer.WS * 2 < DefendingPlayer.WS) Hits.Condition = 5;
     else Hits.Condition = 4;
     return Hits.Condition;
 }
 //вычисляем табличное значение условий попадания в
 //дальнем бою
 public static int RangedHitConditions(CombatLib.Offence.Ranged.OffenceRanged AttackingPlayer, ref CombatLib.Phases.PhaseHits.PhaseHits Hits)
 {
     if (AttackingPlayer.BS < 6)
     {
         Hits.Condition = 7 - AttackingPlayer.BS;
     }
     else
     {
         Hits.Condition = 2;
         Hits.AdditionalCondition = 12 - AttackingPlayer.BS;
     }
     return Hits.Condition;
 }
 //вычисляем табличное значение условия ранения в ближнем бою
 public static int MeleeWoundCondition(CombatLib.Offence.Melee.OffenceMelee AttackingPlayer, CombatLib.Defence.Melee.DMInfantry DefendingPlayer,
     ref CombatLib.Phases.PhaseWounds.PhaseWounds Wounds)
 {
     int difference = AttackingPlayer.S - DefendingPlayer.T;
     if (difference >= 2) Wounds.Condition = 2;
     else if ((difference >= -3) && (difference <= 1))
     {
         if (difference <= -2) Wounds.Condition = 6;
         if (difference == -1) Wounds.Condition = 5;
         if (difference == 0) Wounds.Condition = 4;
         if (difference == 1) Wounds.Condition = 3;
     }
     else Wounds.Condition = 7;
     return Wounds.Condition;
 }
Example #4
0
        //Спасброски за пехоту, начальные данные
        //берутся из PhaseWoundsInfantry, результат записывается в PhaseSavesInfantry, случайные числа получаются из экземпляра класса Random, возвращает количество спасенных
        public static int Play(ref CombatLib.Phases.PhaseWounds.PhaseWoundsInfantry Wounds, ref CombatLib.Phases.PhaseSaves.PhaseSavesInfantry Saves, ref Random RndGenerator)
        {
            Console.WriteLine("PlaySaves, aim - infantry"); //отладочный вывод
            int i; //счетчик всех попыток спасения
            Saves.SaveCubes = new int[Wounds.RowWounds]; //выделение памяти под массив кубов на спасброски. Количество бросков = количеству потенциальных ран

            for (i = 0; i < Wounds.RowWounds; i++)
            {
                Saves.SaveCubes[i] = RndGenerator.Next(1, 7);
                if (Saves.SaveCubes[i] >= Saves.Condition) Saves.Saves++;
            }
            Wounds.Wounds = Wounds.RowWounds - Saves.Saves; //Итоговое количество ран = разница между потенциальными и спасшимися
            Saves.SaveCubesStr = CombatLib.Addition.AdditionalFuncs.ReduceCubesToStr(Saves.SaveCubes); //преобразуем кубы на спасы в строку
            return Saves.Saves;
        }
        //Дальний бой против пехоты, начальные данные берутся из потомка OffenceRanged, DRInfantry, PhaseHitsInfantry,
        //результат записывается в экземпляр класса PhaseWoundsInfantry,
        //случайные числа получаются из экземпляра класса Random, возвращает общее количество ран
        //Д А Л Ь Н И Й   Б О Й
        public static int RangedPlay(CombatLib.Offence.Ranged.OffenceRanged AttackingPlayer, CombatLib.Defence.Ranged.DRInfantry DefendingPlayer, CombatLib.Phases.PhaseHits.PhaseHitsInfantry Hits,
            ref CombatLib.Phases.PhaseWounds.PhaseWoundsInfantry Wounds, ref Random RndGenerator)
        {
            Console.WriteLine("PlayWounds, RangedPlay, aim - infantry"); //отладочный вывод

            CombatLib.Phases.PhaseWounds.PhaseWounds baseWounds = Wounds; //создаем указатель на базовый класс для класса фазы ран пехоты, чтобы передать его в функцию
            CombatLib.Addition.AdditionalFuncs.RangedWoundCondition(AttackingPlayer, DefendingPlayer, ref baseWounds); //вычисляем условие ранения

            int i; //счетчик всех бросков на раны
            Wounds.WoundCubes = new int[Hits.Hits]; //выделяем память под массив кубов ран

            for (i = 0; i < Hits.Hits; i++) //цикл бросков кубов
            {
                Wounds.WoundCubes[i] = RndGenerator.Next(1, 7);
                if (Wounds.WoundCubes[i] >= Wounds.Condition) Wounds.RowWounds++;
            }
            Wounds.WoundCubesStr = CombatLib.Addition.AdditionalFuncs.ReduceCubesToStr(Wounds.WoundCubes); //преобразуем кубы на раны в строку
            return Wounds.RowWounds;
        }
Example #6
0
        //Спасброски за технику, начальные данные
        //берутся из PhaseWoundsVehicle, результат записывается в PhaseSavesVehicle, случайные числа получаются из экземпляра класса Random, возвращает количество спасенных
        public static int Play(ref CombatLib.Phases.PhaseWounds.PhaseWoundsVehicle Wounds, ref CombatLib.Phases.PhaseSaves.PhaseSavesVehicle Saves, ref Random RndGenerator)
        {
            Console.WriteLine("PlaySaves, aim - vehicle"); //отладочный вывод
            int i; //счетчик всех попыток спасения
            Saves.SaveCubes = new int[Wounds.RowWounds]; //выделение памяти под массив кубов на спасброски. Количество бросков = количеству потенциальных ран

            for (i = 0; i < Wounds.RowPunchedWounds; i++) //В первом цикле пробуем спасать пробивающие раны в силу их наибольшей опасности
            {
                Saves.SaveCubes[i] = RndGenerator.Next(1, 7);
                if (Saves.SaveCubes[i] >= Saves.Condition) Saves.PunchedSaves++;
            }
            for (i = Wounds.RowPunchedWounds; i < Wounds.RowWounds; i++) //Нумерация i такова, чтобы продолжить заполнение массива после спасов на пробивающие раны
            {
                Saves.SaveCubes[i] = RndGenerator.Next(1, 7);
                if (Saves.SaveCubes[i] >= Saves.Condition) Saves.SlidingSaves++;
            }
            Saves.Saves = Saves.PunchedSaves + Saves.SlidingSaves; //Обновляем количество спасенных в итоге
            Wounds.PunchedWounds = Wounds.RowPunchedWounds - Saves.PunchedSaves; //Обновляем количество ран в итоге после спасов
            Wounds.SlidingWounds = Wounds.RowSlidingWounds - Saves.SlidingSaves;
            Wounds.Wounds = Wounds.RowWounds - Saves.Saves;
            Saves.SaveCubesStr = CombatLib.Addition.AdditionalFuncs.ReduceCubesToStr(Saves.SaveCubes); //преобразуем кубы на спасы в строку
            return Saves.Saves;
        }
        //Ближний бой против техники, начальные данные берутся из потомка OffenceMelee, DMVehicle, PhaseHitsVehicle,
        //результат записывается в экземпляр класса PhaseWoundsVehicle,
        //случайные числа получаются из экземпляра класса Random, возвращает общее количество ран
        public static int MeleePlay(CombatLib.Offence.Melee.OffenceMelee AttackingPlayer, CombatLib.Defence.Melee.DMVehicle DefendingPlayer, CombatLib.Phases.PhaseHits.PhaseHitsVehicle Hits,
            ref CombatLib.Phases.PhaseWounds.PhaseWoundsVehicle Wounds, ref Random RndGenerator)
        {
            Console.WriteLine("PlayWounds, MeleePlay, aim - vehicle");

            CombatLib.Phases.PhaseWounds.PhaseWounds baseWounds = Wounds; //создаем указатель на базовый класс для класса фазы ран техники, чтобы передать его в функцию
            CombatLib.Addition.AdditionalFuncs.VehicleWoundCondition(DefendingPlayer, ref baseWounds); //вычисляем условие ранения

            int i; //счетчик всех бросков на раны
            Wounds.WoundCubes = new int[Hits.Hits]; //выделяем память под массив кубов ран

            for (i = 0; i < Hits.Hits; i++) //цикл бросков кубов
            {
                Wounds.WoundCubes[i] = RndGenerator.Next(1, 7);
                if (Wounds.WoundCubes[i] + AttackingPlayer.S < Wounds.Condition) continue; //если куб + сила атакующего меньше условия попадания, то ничего не происходит
                else if (Wounds.WoundCubes[i] + AttackingPlayer.S == Wounds.Condition) Wounds.RowSlidingWounds++; //если эта величина равна условию попадания, то ранение по технике засчитывается,
                //скользящее
                else Wounds.RowPunchedWounds++; //если больше, то ранение - пробивающее
            }
            Wounds.RowWounds = Wounds.RowPunchedWounds + Wounds.RowSlidingWounds;
            Wounds.WoundCubesStr = CombatLib.Addition.AdditionalFuncs.ReduceCubesToStr(Wounds.WoundCubes); //преобразуем кубы на раны в строку
            return Wounds.RowWounds;
        }
Example #8
0
        //Ближний бой, начальные данные берутся из потомка OffenceMelee, результат записывается в экземпляр потомка класса PhaseHits, случайные числа получаются из
        //экземпляра класса Random, возвращает количество попаданий
        public static int PlayMelee(CombatLib.Offence.Melee.OffenceMelee AttackingPlayer, CombatLib.Defence.Melee.DefenceMelee DefendingPlayer, ref CombatLib.Phases.PhaseHits.PhaseHits Hits,
            ref Random RndGenerator)
        {
            Console.WriteLine("PlayHits, Play Melee"); //отладочный вывод

            CombatLib.Addition.AdditionalFuncs.MeleeHitCondition(AttackingPlayer, DefendingPlayer, ref Hits); ////вычисляем условие попадания

            int i, j, actualSizeOfArr = AttackingPlayer.A; //j - счетчик бросков на попадание без учета перебрасываний, i - счетчик всех бросков на попадания и нулей, обозначающих переброс
            Hits.HitCubes = new int[AttackingPlayer.A]; //выделение памяти под массив кубов на попадание. Количество элементов = количеству атак

            for (i = 0, j = 0; j < AttackingPlayer.A; j++) //цикл бросков кубов
            {
                if (i >= actualSizeOfArr)
                {
                    actualSizeOfArr = i + 1;
                    Array.Resize(ref Hits.HitCubes, actualSizeOfArr);
                }
                Hits.HitCubes[i] = RndGenerator.Next(1, 7);
                if (Hits.HitCubes[i] >= Hits.Condition) Hits.Hits++;
                else if (Hits.AdditionalCondition < 7)
                {
                    i++;
                    if (i >= actualSizeOfArr)
                    {
                        actualSizeOfArr = i + 2;
                        Array.Resize(ref Hits.HitCubes, actualSizeOfArr);
                    }
                    Hits.HitCubes[i] = 0; //отмечаем, что куб был переброшен, добавляя 0 и изменяя счетчик бросков i
                    i++;
                    Hits.HitCubes[i] = RndGenerator.Next(1, 7);
                    if (Hits.HitCubes[i] >= Hits.AdditionalCondition) Hits.Hits++;
                }
                i++;
            }
            Hits.HitCubesStr = CombatLib.Addition.AdditionalFuncs.ReduceCubesToStr(Hits.HitCubes); //преобразуем кубы на ранения в строку
            return Hits.Hits;
        }
 //вычисляем табличное значение условия ранения для техники
 public static int VehicleWoundCondition(CombatLib.Defence.Melee.DMVehicle DefendingPlayer,
     ref CombatLib.Phases.PhaseWounds.PhaseWounds Wounds)
 {
     Wounds.Condition = DefendingPlayer.T;
     return Wounds.Condition;
 }
        //Ф У Н К Ц И И   О Т Ы Г Р Ы Ш А   Б О Я
        //Т Е Х Н И К А   П Р О Т И В   Т Е Х Н И К И
        private void PlayVehicleVSVehicle(CombatLib.Offence.Melee.OMVehicle AttackingPlayer, CombatLib.Defence.Melee.DMVehicle DefendingPlayer)
        {
            /*//отладочные выводы
            MessageBox.Show("VehicleVSVehicle");
            MessageBox.Show(AttackingPlayer.ToString(), "AttackingPlayer");
            MessageBox.Show(DefendingPlayer.ToString(), "DefendingPlayer");*/

            //инициализация объектов
            Random RndGenerator = new Random();
            CombatLib.Phases.PhaseHits.PhaseHitsVehicle Hits = new CombatLib.Phases.PhaseHits.PhaseHitsVehicle();
            CombatLib.Phases.PhaseWounds.PhaseWoundsVehicle Wounds = new CombatLib.Phases.PhaseWounds.PhaseWoundsVehicle();
            CombatLib.Phases.PhaseSaves.PhaseSavesVehicle Saves = new CombatLib.Phases.PhaseSaves.PhaseSavesVehicle();

            //указатели на родителей классов
            CombatLib.Offence.Melee.OffenceMelee baseOMVehicle = AttackingPlayer;
            CombatLib.Defence.Melee.DefenceMelee baseDMVehicle = DefendingPlayer;
            CombatLib.Phases.PhaseHits.PhaseHits basePhaseHitsVehicle = Hits;

            //И Г Р А

            //попадания
            try
            {
                CombatLib.BattleFuncs.PlayHits.PlayMelee(baseOMVehicle, baseDMVehicle, ref basePhaseHitsVehicle, ref RndGenerator);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "Ошибка: " + e.GetType().ToString(), MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }
            if (Hits.Hits == 0)
            {
                this.DisplayResult(Hits);
                return;
            }

            //раны
            try
            {
                CombatLib.BattleFuncs.PlayWounds.MeleePlay(baseOMVehicle, DefendingPlayer, Hits, ref Wounds, ref RndGenerator);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "Ошибка: " + e.GetType().ToString(), MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }

            //спасов нет, поэтому все "сырые" раны станут окончательными
            Wounds.PunchedWounds = Wounds.RowPunchedWounds;
            Wounds.SlidingWounds = Wounds.RowSlidingWounds;
            Wounds.Wounds = Wounds.PunchedWounds + Wounds.SlidingWounds;

            this.DisplayResult(Hits, Wounds, AttackingPlayer.S);
        }
        //Т Е Х Н И К А   П Р О Т И В   П Е Х О Т Ы
        private void PlayVehicleVSInfantry(CombatLib.Offence.Melee.OMVehicle AttackingPlayer, CombatLib.Defence.Melee.DMInfantry DefendingPlayer)
        {
            /*//отладочные выводы
            MessageBox.Show("VehicleVSInfantry");
            MessageBox.Show(AttackingPlayer.ToString(), "AttackingPlayer");
            MessageBox.Show(DefendingPlayer.ToString(), "DefendingPlayer");*/

            //инициализация объектов
            Random RndGenerator = new Random();
            CombatLib.Phases.PhaseHits.PhaseHitsInfantry Hits = new CombatLib.Phases.PhaseHits.PhaseHitsInfantry();
            CombatLib.Phases.PhaseWounds.PhaseWoundsInfantry Wounds = new CombatLib.Phases.PhaseWounds.PhaseWoundsInfantry();
            CombatLib.Phases.PhaseSaves.PhaseSavesInfantry Saves = new CombatLib.Phases.PhaseSaves.PhaseSavesInfantry();

            //указатели на родителей классов
            CombatLib.Offence.Melee.OffenceMelee baseOMVehicle = AttackingPlayer;
            CombatLib.Defence.Melee.DefenceMelee baseDMInfantry = DefendingPlayer;
            CombatLib.Phases.PhaseHits.PhaseHits basePhaseHitsInfantry = Hits;

            ////ПОДГОТОВЛЕНИЯ ПЕРЕД ИГРОЙ
            //вычисление наилучшего спасброска
            Saves.Condition = CombatLib.Addition.AdditionalFuncs.BestSaveThrow(AttackingPlayer.AP, 7, DefendingPlayer.ArmorSave, DefendingPlayer.InvulSave);

            //И Г Р А

            //попадания
            try
            {
                CombatLib.BattleFuncs.PlayHits.PlayMelee(baseOMVehicle, DefendingPlayer, ref basePhaseHitsInfantry, ref RndGenerator);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "Ошибка: " + e.GetType().ToString(), MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }
            if (Hits.Hits == 0)
            {
                this.DisplayResult(Hits);
                return;
            }

            //раны
            try
            {
                CombatLib.BattleFuncs.PlayWounds.MeleePlay(baseOMVehicle, DefendingPlayer, Hits, ref Wounds, ref RndGenerator);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "Ошибка: " + e.GetType().ToString(), MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }
            if (Wounds.RowWounds == 0)
            {
                this.DisplayResult(Hits, Wounds);
                return;
            }

            //спасы
            try
            {
                CombatLib.BattleFuncs.PlaySaves.Play(ref Wounds, ref Saves, ref RndGenerator);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "Ошибка: " + e.GetType().ToString(), MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }
            this.DisplayResult(Hits, Wounds, Saves);
        }
        //против техники
        void DisplayResult(CombatLib.Phases.PhaseHits.PhaseHitsVehicle Hits, CombatLib.Phases.PhaseWounds.PhaseWoundsVehicle Wounds = null, int S = -1, CombatLib.Phases.PhaseSaves.PhaseSavesVehicle Saves = null)
        {
            /*MessageBox.Show(Hits.ToString(), "Попадания", MessageBoxButton.OK);
            if (Wounds != null) MessageBox.Show(Wounds.ToString(), "Раны", MessageBoxButton.OK);
            if (Saves != null) MessageBox.Show(Saves.ToString(), "Спасброски", MessageBoxButton.OK);*/
            WindowResultVehicle Result = new WindowResultVehicle();

            if (Wounds == null)
                SetResultImg(ref Result, Hits.Hits);
            else
                SetResultImg(ref Result, Hits.Hits, Wounds.Wounds);
            Result.Show();

            //Hits
            if (Hits.Condition > 6)
            {
                //hits
                Result.LabelHits.Content = "нельзя попасть";
                Result.LabelAddHitCondInfo.Visibility = System.Windows.Visibility.Hidden;
                Result.LabelAddHitCondition.Visibility = System.Windows.Visibility.Hidden;
                //wounds
                Result.LabelPunchedWoundsInfo.Visibility = System.Windows.Visibility.Hidden;
                Result.LabelPunchedWounds.Visibility = System.Windows.Visibility.Hidden;
                Result.LabelSlidingWoundsInfo.Visibility = System.Windows.Visibility.Hidden;
                Result.LabelSlidingWounds.Visibility = System.Windows.Visibility.Hidden;
                Result.LabelStrengthInfo.Visibility = System.Windows.Visibility.Hidden;
                Result.LabelStrength.Visibility = System.Windows.Visibility.Hidden;
                //saves
                Result.LabelSaveInfo.Visibility = System.Windows.Visibility.Hidden;
                Result.LabelSaves.Visibility = System.Windows.Visibility.Hidden;
                //groups
                Result.GroupHits.Visibility = System.Windows.Visibility.Hidden;
                Result.GroupWounds.Visibility = System.Windows.Visibility.Hidden;
                Result.GroupSaves.Visibility = System.Windows.Visibility.Hidden;
                return;
            }
            else
            {
                Result.LabelHits.Content = Hits.Hits.ToString();
                Result.LabelHitCondition.Content = Hits.Condition.ToString() + "+";

                Result.TextBlockHitCubes.Text = Hits.HitCubesStr;
                Result.TextBlockHitCubes.TextWrapping = TextWrapping.Wrap;
                if (Hits.AdditionalCondition <= 6)
                {
                    Result.LabelAddHitCondition.Content = Hits.AdditionalCondition.ToString() + "+";
                }
                else
                {
                    Result.LabelAddHitCondInfo.Visibility = System.Windows.Visibility.Hidden;
                    Result.LabelAddHitCondition.Visibility = System.Windows.Visibility.Hidden;
                }
            }

            //Wounds
            if ((Wounds == null) || (Wounds.Condition > 14))
            {
                //wounds
                Result.LabelPunchedWoundsInfo.Visibility = System.Windows.Visibility.Hidden;
                Result.LabelPunchedWounds.Visibility = System.Windows.Visibility.Hidden;
                Result.LabelSlidingWoundsInfo.Visibility = System.Windows.Visibility.Hidden;
                Result.LabelSlidingWounds.Visibility = System.Windows.Visibility.Hidden;
                Result.LabelStrengthInfo.Visibility = System.Windows.Visibility.Hidden;
                Result.LabelStrength.Visibility = System.Windows.Visibility.Hidden;
                //saves
                Result.LabelSaveInfo.Visibility = System.Windows.Visibility.Hidden;
                Result.LabelSaves.Visibility = System.Windows.Visibility.Hidden;
                //groups
                Result.GroupWounds.Visibility = System.Windows.Visibility.Hidden;
                Result.GroupSaves.Visibility = System.Windows.Visibility.Hidden;
            }

            if (Wounds == null)
            {
                //wounds
                Result.LabelWoundsInfo.Content = "не попал";
                return;
            }
            else if (Wounds.Condition > 14)
            {
                //wounds
                Result.LabelWoundsInfo.Content = "нельзя ранить";
                return;
            }
            else
            {
                Result.LabelPunchedWounds.Content = Wounds.PunchedWounds.ToString();
                Result.LabelSlidingWounds.Content = Wounds.SlidingWounds.ToString();
                Result.LabelWoundCondition.Content = Wounds.Condition.ToString() + "+";

                Result.TextBlockWoundCubes.Text = Wounds.WoundCubesStr;
                Result.TextBlockWoundCubes.TextWrapping = TextWrapping.Wrap;

                Result.LabelStrength.Content = S.ToString();
            }

            //Saves

            if ((Saves == null) && (Wounds.Wounds != 0))
            {
                //saves
                Result.LabelSaveInfo.Visibility = System.Windows.Visibility.Hidden;
                Result.LabelSaves.Visibility = System.Windows.Visibility.Hidden;
                //groups
                Result.GroupSaves.Visibility = System.Windows.Visibility.Hidden;
                return;
            }

            if ((Saves == null) || (Saves.Condition > 6))
            {
                //groups
                Result.GroupSaves.Visibility = System.Windows.Visibility.Hidden;
            }

            if (Saves == null)
            {
                //saves
                Result.LabelSaves.Content = "не ранил";
                return;
            }
            else if (Saves.Condition > 6)
            {
                //saves
                Result.LabelSaves.Content = "нельзя спасти";
                return;
            }
            else
            {
                Result.LabelSaves.Content = Saves.Saves.ToString();
                Result.LabelSaveCondition.Content = Saves.Condition.ToString() + "+";

                Result.TextBlockSaveCubes.Text = Saves.SaveCubesStr;
                Result.TextBlockSaveCubes.TextWrapping = TextWrapping.Wrap;
            }
            return;
        }
        //Ф У Н К Ц И И   О Т Ы Г Р Ы Ш А   Б О Я
        //Т Е Х Н И К А   П Р О Т И В   Т Е Х Н И К И
        private void PlayVehicleVSVehicle(CombatLib.Offence.Ranged.ORVehicle AttackingPlayer, CombatLib.Defence.Ranged.DRVehicle DefendingPlayer)
        {
            /*//отладочные выводы
            MessageBox.Show("VehicleVSVehicle");
            MessageBox.Show(AttackingPlayer.ToString(), "AttackingPlayer");
            MessageBox.Show(DefendingPlayer.ToString(), "DefendingPlayer");*/

            //инициализация объектов
            Random RndGenerator = new Random();
            CombatLib.Phases.PhaseHits.PhaseHitsVehicle Hits = new CombatLib.Phases.PhaseHits.PhaseHitsVehicle();
            CombatLib.Phases.PhaseWounds.PhaseWoundsVehicle Wounds = new CombatLib.Phases.PhaseWounds.PhaseWoundsVehicle();
            CombatLib.Phases.PhaseSaves.PhaseSavesVehicle Saves = new CombatLib.Phases.PhaseSaves.PhaseSavesVehicle();

            //указатели на родителей классов
            CombatLib.Offence.Ranged.OffenceRanged baseORInfantry = AttackingPlayer;
            CombatLib.Phases.PhaseHits.PhaseHits basePhaseHitsVehicle = Hits;

            ////ПОДГОТОВЛЕНИЯ ПЕРЕД ИГРОЙ
            //вычисление наилучшего спасброска
            Saves.Condition = DefendingPlayer.CoverSave;

            //И Г Р А

            //попадания
            try
            {
                CombatLib.BattleFuncs.PlayHits.PlayRanged(baseORInfantry, ref basePhaseHitsVehicle, ref RndGenerator);
            }
            catch(Exception e)
            {
                MessageBox.Show(e.Message, "Ошибка: " + e.GetType().ToString(), MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }
            if (Hits.Hits == 0)
            {
                this.DisplayResult(Hits);
                return;
            }

            //раны
            try
            {
                CombatLib.BattleFuncs.PlayWounds.RangedPlay(baseORInfantry, DefendingPlayer, Hits, ref Wounds, ref RndGenerator);
            }
            catch(Exception e)
            {
                MessageBox.Show(e.Message, "Ошибка: " + e.GetType().ToString(), MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }
            if (Wounds.RowWounds == 0)
            {
                this.DisplayResult(Hits, Wounds);
                return;
            }

            //спасы
            try
            {
                CombatLib.BattleFuncs.PlaySaves.Play(ref Wounds, ref Saves, ref RndGenerator);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "Ошибка: " + e.GetType().ToString(), MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }
            this.DisplayResult(Hits, Wounds, AttackingPlayer.S, Saves);
        }
        //П Е Х О Т А   П Р О Т И В   П Е Х О Т Ы
        private void PlayInfantryVSInfantry(CombatLib.Offence.Ranged.ORInfantry AttackingPlayer, CombatLib.Defence.Ranged.DRInfantry DefendingPlayer)
        {
            /*//отладочные выводы
            MessageBox.Show("InfantryVSInfantry");
            MessageBox.Show(AttackingPlayer.ToString(), "AttackingPlayer");
            MessageBox.Show(DefendingPlayer.ToString(), "DefendingPlayer");*/

            //инициализация объектов
            Random RndGenerator = new Random(); //генератор рандомных числе - один на все время работы программы со случайной затравкой
            CombatLib.Phases.PhaseHits.PhaseHitsInfantry Hits = new CombatLib.Phases.PhaseHits.PhaseHitsInfantry(); //класс фазы попаданий
            CombatLib.Phases.PhaseWounds.PhaseWoundsInfantry Wounds = new CombatLib.Phases.PhaseWounds.PhaseWoundsInfantry(); //класс фазы ран
            CombatLib.Phases.PhaseSaves.PhaseSavesInfantry Saves = new CombatLib.Phases.PhaseSaves.PhaseSavesInfantry(); //класс фазы спасбросков

            //указатели на родителей классов
            CombatLib.Offence.Ranged.OffenceRanged baseORInfantry = AttackingPlayer; //родитель атакующего игрока
            CombatLib.Phases.PhaseHits.PhaseHits basePhaseHitsInfantry = Hits; //родитель фазы попаданий

            //ПОДГОТОВЛЕНИЯ ПЕРЕД ИГРОЙ
            //вычисление наилучшего спасброска
            Saves.Condition = CombatLib.Addition.AdditionalFuncs.BestSaveThrow(AttackingPlayer.AP, DefendingPlayer.CoverSave, DefendingPlayer.ArmorSave, DefendingPlayer.InvulSave);

            //И Г Р А

            //попадания
            try
            {
                CombatLib.BattleFuncs.PlayHits.PlayRanged(baseORInfantry, ref basePhaseHitsInfantry, ref RndGenerator);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "Ошибка: " + e.GetType().ToString(), MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }
            if (Hits.Hits == 0)
            {
                this.DisplayResult(Hits);
                return;
            }

            //раны
            try
            {
                CombatLib.BattleFuncs.PlayWounds.RangedPlay(baseORInfantry, DefendingPlayer, Hits, ref Wounds, ref RndGenerator);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "Ошибка: " + e.GetType().ToString(), MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }
            if (Wounds.RowWounds == 0)
            {
                this.DisplayResult(Hits, Wounds);
                return;
            }

            //спасы
            try
            {
                CombatLib.BattleFuncs.PlaySaves.Play(ref Wounds, ref Saves, ref RndGenerator);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "Ошибка: " + e.GetType().ToString(), MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }
            this.DisplayResult(Hits, Wounds, Saves);
        }