public static JSON.Village ModelToJson(Scaffold.Village village) { return(new JSON.Village { PlayerId = village.PlayerId, Points = village.Points, VillageId = village.VillageId, VillageName = village.VillageName, VillageRank = village.VillageRank, X = village.X, Y = village.Y }); }
private async Task<bool> CanReadVillage(long villageId, Scaffold.Village queriedVillage = null) { var village = queriedVillage ?? await Profile("Find village", () => CurrentSets.Village.Where(v => v.VillageId == villageId).FirstOrDefaultAsync()); if (village == null) return false; var registeredTribeIds = await Profile("Get registered tribe IDs", () => ( from user in CurrentSets.User join player in CurrentSets.Player on user.PlayerId equals player.PlayerId where player.TribeId != null where user.Enabled select player.TribeId.Value ).Distinct().ToListAsync()); bool canRead = false; if (!village.PlayerId.HasValue) { // Allowed to read for barbarian villages canRead = true; } else { var owningPlayer = await Profile("Get owning player", () => CurrentSets.Player.Where(p => p.PlayerId == village.PlayerId).FirstOrDefaultAsync()); bool canReadFromTribe = true; if (owningPlayer.TribeId != null) { if (Configuration.Security.RestrictAccessWithinTribes) canReadFromTribe = owningPlayer.TribeId.Value != CurrentTribeId; else canReadFromTribe = !registeredTribeIds.Contains(owningPlayer.TribeId.Value); } if (owningPlayer.PlayerId == CurrentPlayerId || !owningPlayer.TribeId.HasValue || canReadFromTribe || CurrentUserIsAdmin) { // Allowed to read if: // // - the player has no tribe // - or the village tribe is different from the player's tribe // - or the current user is an admin canRead = true; } } return canRead; }
public List <CommandInstruction> GenerateOptions(Dictionary <Scaffold.Village, Scaffold.CurrentVillage> availableVillages, Scaffold.Village target) { var result = new List <CommandInstruction>(); var travelCalculator = new TravelCalculator(worldSpeed, unitSpeed); if (availableVillages == null) { throw new ArgumentNullException(nameof(availableVillages)); } foreach ((var source, var currentVillage) in availableVillages.Tupled()) { if (source == null) { throw new ArgumentNullException("source"); } if (currentVillage == null) { throw new ArgumentNullException("currentVillage"); } var villageArmy = ArmyConvert.ArmyToJson(currentVillage.ArmyAtHome); if (villageArmy == null || villageArmy.IsEmpty()) { continue; } foreach (var permutation in ArmyPermutations(villageArmy)) { if (Requirements.Any(r => !r.MeetsRequirement(worldSpeed, unitSpeed, source.Coordinates(), target.Coordinates(), permutation))) { continue; } var travelTroopType = travelCalculator.TravelTroopType(permutation); result.Add(new CommandInstruction { SendFrom = source.VillageId, SendTo = target.VillageId, TroopType = travelTroopType, TravelTime = travelCalculator.CalculateTravelTime(travelTroopType, source, target) }); } } return(result); }
public TimeSpan CalculateTravelTime(JSON.TroopType unitType, Scaffold.Village startVillage, Scaffold.Village endVillage) => CalculateTravelTime(unitType, startVillage.X.Value, startVillage.Y.Value, endVillage.X.Value, endVillage.Y.Value);
public JSON.TroopType EstimateTroopType(TimeSpan travelTime, Scaffold.Village startVillage, Scaffold.Village endVillage) => EstimateTroopType(travelTime, startVillage.X.Value, startVillage.Y.Value, endVillage.X.Value, endVillage.Y.Value);
public static Coordinate Coordinates(this Scaffold.Village village) => new Coordinate { X = village.X.Value, Y = village.Y.Value };