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); }
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); }