예제 #1
0
 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;
        }
예제 #3
0
        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);
        }
예제 #4
0
 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);
예제 #5
0
 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);
예제 #6
0
 public static Coordinate Coordinates(this Scaffold.Village village) => new Coordinate
 {
     X = village.X.Value, Y = village.Y.Value
 };