Esempio n. 1
0
        public ActionResult DoSpecialAction(int position, IArmy myArmy, IArmy enemyArmy, Random random = null)
        {
            if (random == null)
            {
                random = new Random();
            }

            double probability = random.NextDouble();

            //для улучшения сгенерированная вероятность должна принадлежать промежутку [0, ImprovementHeavyUnitProbability)
            if (probability >= ImprovementHeavyUnitProbability)
            {
                return(ActionResult.Empty);
            }

            int[] availibleForImprovement = GetAvailibleForImprovement(position, myArmy).ToArray();

            if (availibleForImprovement.Length == 0)
            {
                return(ActionResult.Empty);
            }

            int index  = availibleForImprovement[random.Next(0, availibleForImprovement.Length)];
            int action = random.Next(0, 4);

            IHeavyInfantry unit = myArmy.GetUnit(index) as IHeavyInfantry;

            switch (action)
            {
            case 0:
                if (unit.ContainsImprovement(typeof(HelmetDecorator)))
                {
                    return(ActionResult.Empty);
                }
                unit = new HelmetDecorator(unit);
                myArmy.ReplaceUnit(unit, index);
                break;

            case 1:
                if (unit.ContainsImprovement(typeof(HorseDecorator)))
                {
                    return(ActionResult.Empty);
                }
                unit = new HorseDecorator(unit);
                myArmy.ReplaceUnit(unit, index);
                break;

            case 2:
                if (unit.ContainsImprovement(typeof(ShieldDecorator)))
                {
                    return(ActionResult.Empty);
                }
                unit = new ShieldDecorator(unit);
                myArmy.ReplaceUnit(unit, index);
                break;

            case 3:
                if (unit.ContainsImprovement(typeof(SwordDecorator)))
                {
                    return(ActionResult.Empty);
                }
                unit = new SwordDecorator(unit);
                myArmy.ReplaceUnit(unit, index);
                break;

            default:
                return(ActionResult.Empty);
            }
            return(new ActionResult(this, unit, ActionResultType.Improvement));
        }
Esempio n. 2
0
        public IUnit DoSpecialAction(IUnit unit)
        {
            if (unit is IAmmunition)
            {
                if (((IAmmunition)unit).Access == null)
                {
                    ((IAmmunition)unit).Access = new Dictionary <int, string>();
                }

                if (((IAmmunition)unit).Access.Count == 4)
                {
                    return(null);
                }

                Component accessory = new AccessoryComponent();

                Random random = new Random();
                int    cloth  = 0;
                bool   end    = true;

                while (end)
                {
                    cloth = random.Next(0, 4);
                    if (((IAmmunition)unit).Access.ContainsKey(cloth))
                    {
                        continue;
                    }
                    else
                    {
                        end = false;
                    }
                }
                var nameAmmunition = "";
                switch (cloth)
                {
                case 0:
                    nameAmmunition = "Helmet";
                    accessory      = new HelmetDecorator(accessory, unit);
                    accessory.AddAccessory();
                    break;

                case 1:
                    nameAmmunition = "Armor";
                    accessory      = new ArmorDecorator(accessory, unit);
                    accessory.AddAccessory();
                    break;

                case 2:
                    nameAmmunition = "Horse";
                    accessory      = new HorseDecorator(accessory, unit);
                    accessory.AddAccessory();
                    break;

                case 3:
                    nameAmmunition = "Peak";
                    accessory      = new PeakDecorator(accessory, unit);
                    accessory.AddAccessory();
                    break;
                }
                ((IAmmunition)unit).Access.Add(cloth, nameAmmunition);
                return(accessory.GetUnit());
            }

            return(null);
        }