Esempio n. 1
0
        private async Task <IEnumerable <GameAction> > CreateActionsForOtherVillages(IEnumerable <VillageModel> villages, VillageModel capital, TTB.DAL.Models.GameModels.Enums.Tribe tribe)
        {
            var villagesUnderAttack = villages.Where(x => x.Attacks != null && x.Attacks.Any() && !x.IsCapital);
            var trader = await _unitRepository.GetUnit("trader", tribe);

            var highPriorityReceivers = new List <VillageModel> {
                capital
            };
            var result = new List <GameAction>();

            foreach (var villageUnderAttack in villagesUnderAttack)
            {
                if (villageUnderAttack.IsSaveResourcesFeatureOn)
                {
                    var to = FindVillageToSendResources(villageUnderAttack, highPriorityReceivers, trader);
                    if (to == null)
                    {
                        to = FindVillageToSendResources(villageUnderAttack, villages, trader);
                    }

                    if (to != null)
                    {
                        result.Add(new SendResourcesAction
                        {
                            Action  = GameActionType.SEND_RESOURCES,
                            Village = _mapper.Map <Village>(villageUnderAttack),
                            To      = _mapper.Map <Village>(to)
                        });
                    }

                    var units = new List <UnitModel>();
                    if (villageUnderAttack.PreferableUnits != null)
                    {
                        var searchTasks = new List <Task <UnitModel> >();
                        foreach (var pref in villageUnderAttack.PreferableUnits)
                        {
                            searchTasks.Add(_unitRepository.GetUnit(pref, tribe));
                        }

                        units = (await Task.WhenAll(searchTasks)).ToList();
                    }
                    else
                    {
                        units = (await _unitRepository.GetUnitsByType(tribe, UnitType.FOOT_TROOPS))
                                .Where(x => x.Attack < x.DeffenceAgainstCavalry && x.Attack < x.DeffenceAgainstInfantry)
                                .ToList();
                    }

                    result.Add(new TrainArmyAction
                    {
                        Action       = GameActionType.TRAIN_ARMY,
                        Village      = _mapper.Map <Village>(villageUnderAttack),
                        UnitsToTrain = units.ToDictionary(x => x.LocalizedNameRu, x => (int)TrainArmyFlag.MAX)
                    });
                }

                if (villageUnderAttack.IsSaveTroopsFeatureOn)
                {
                    result.Add(new SendArmyAction
                    {
                        Action  = GameActionType.SEND_ARMY,
                        Village = _mapper.Map <Village>(villageUnderAttack),
                        To      = new Village
                        {
                            Name = SendArmyKey
                        },
                        SendAll = true,
                        Type    = SendArmyType.RAID
                    });
                }
            }

            return(result);
        }
Esempio n. 2
0
        private async Task <TrainArmyAction> CreateActionsForTroops(VillageModel village, TTB.DAL.Models.GameModels.Enums.Tribe tribe, GameActionType actionType)
        {
            var units = new List <UnitModel>();

            if (village.PreferableUnits != null)
            {
                var searchTasks = new List <Task <UnitModel> >();
                foreach (var pref in village.PreferableUnits)
                {
                    searchTasks.Add(_unitRepository.GetUnit(pref, tribe));
                }

                units = (await Task.WhenAll(searchTasks)).ToList();
            }
            else
            {
                var createOffenceTroops = village.Types?.Contains(VillageType.OFFENCE);
                var unitsToCreate       = createOffenceTroops.HasValue && createOffenceTroops.Value || village.IsCapital && !createOffenceTroops.HasValue
                    ? await _unitRepository.GetOffenceUnits(tribe)
                    : await _unitRepository.GetDeffenceUnits(tribe);

                units = unitsToCreate.ToList();
            }
            var action = new TrainArmyAction
            {
                Action       = actionType,
                Village      = _mapper.Map <Village>(village),
                UnitsToTrain = units.ToDictionary(x => x.LocalizedNameRu, x => (int)TrainArmyFlag.MAX)
            };

            return(action);
        }