public void GenerateCaveWithLakeAndEncounter()
        {
            selectedCave.Contents.Miscellaneous = new[] { ContentsTypeConstants.Lake };

            mockPercentileSelector.Setup(s => s.SelectFrom(TableNameConstants.Lakes)).Returns("laketown/Encounter");

            var encounter = new Encounter();
            mockEncounterGenerator.Setup(g => g.Generate(EnvironmentConstants.Dungeon, 90210, "temperature", EnvironmentConstants.TimesOfDay.Night)).Returns(encounter);

            var cave = caveGenerator.Generate(9266, 90210, "temperature").Single();
            Assert.That(cave, Is.EqualTo(selectedCave));
            Assert.That(cave.Contents.Miscellaneous.First(), Is.EqualTo("laketown"));
            Assert.That(cave.Contents.Miscellaneous.Last(), Is.EqualTo(ContentsTypeConstants.Encounter));
            Assert.That(cave.Contents.Miscellaneous.Count(), Is.EqualTo(2));
            Assert.That(cave.Contents.Encounters.Single(), Is.EqualTo(encounter));
        }
        public Encounter Generate(string environment, int level, string temperature, string timeOfDay, params string[] creatureTypeFilters)
        {
            var filtersAreValid = filterVerifier.FiltersAreValid(environment, level, temperature, timeOfDay, creatureTypeFilters);
            if (!filtersAreValid)
                throw new ImpossibleEncounterException();

            var tableName = string.Format(TableNameConstants.LevelXEncounterLevel, level);
            var encounterLevelAndModifier = typeAndAmountPercentileSelector.SelectFrom(tableName).Single();
            var encounterLevel = Convert.ToInt32(encounterLevelAndModifier.Key);
            var modifier = Convert.ToInt32(encounterLevelAndModifier.Value);
            var creatures = new List<Creature>();

            while (creatures.Any() == false || creatures.Contains(null))
            {
                creatures.Clear();

                var encounterCreaturesAndAmounts = creatureCollectionSelector.SelectFrom(encounterLevel, environment, temperature, timeOfDay);
                var iterations = 0;

                while (!filterVerifier.EncounterIsValid(encounterCreaturesAndAmounts, modifier, creatureTypeFilters) && iterations++ < IterationLimit)
                {
                    tableName = string.Format(TableNameConstants.LevelXEncounterLevel, level);
                    encounterLevelAndModifier = typeAndAmountPercentileSelector.SelectFrom(tableName).Single();
                    encounterLevel = Convert.ToInt32(encounterLevelAndModifier.Key);
                    modifier = Convert.ToInt32(encounterLevelAndModifier.Value);

                    encounterCreaturesAndAmounts = creatureCollectionSelector.SelectFrom(encounterLevel, environment, temperature, timeOfDay);
                }

                if (!filterVerifier.EncounterIsValid(encounterCreaturesAndAmounts, modifier, creatureTypeFilters))
                    throw new Exception($"Failed to generate level {level} creature for [{string.Join(",", creatureTypeFilters)}] in {temperature} {environment} {timeOfDay} after {iterations} iterations");

                foreach (var kvp in encounterCreaturesAndAmounts)
                {
                    var newCreature = GetCreature(kvp.Key, kvp.Value, modifier, level, encounterLevel);
                    creatures.Add(newCreature);
                }
            }

            var encounter = new Encounter();
            encounter.Characters = encounterCharacterGenerator.GenerateFrom(creatures);
            encounter.Creatures = EditCreatureTypes(creatures);

            var leadCreature = encounter.Creatures.First();
            encounter.Treasures = GetTreasures(encounter.Creatures, level);

            return encounter;
        }
 public void Setup()
 {
     encounter = new Encounter();
 }
        public void Setup()
        {
            mockPercentileSelector = new Mock<IPercentileSelector>();
            mockEncounterGenerator = new Mock<IEncounterGenerator>();
            mockTreasureGenerator = new Mock<ITreasureGenerator>();
            poolGenerator = new DomainPoolGenerator(mockPercentileSelector.Object, mockEncounterGenerator.Object, mockTreasureGenerator.Object);

            selectedPool = string.Empty;
            encounter = new Encounter();
            treasure = new Treasure();

            mockPercentileSelector.Setup(s => s.SelectFrom(TableNameConstants.Pools)).Returns(() => selectedPool);
            mockEncounterGenerator.Setup(g => g.Generate(EnvironmentConstants.Dungeon, 9266, "temperature", EnvironmentConstants.TimesOfDay.Night)).Returns(encounter);
            mockTreasureGenerator.Setup(g => g.GenerateAtLevel(9266)).Returns(treasure);
        }
 private bool DragonOccured(Encounter encounter)
 {
     return encounter.Creatures.First().Name.Contains("dragon");
 }
 private bool CharacterOccurred(Encounter encounter)
 {
     return encounter.Characters.Any();
 }
        private void AssertEncounter(Encounter encounter)
        {
            Assert.That(encounter.Creatures, Is.Not.Empty);
            Assert.That(encounter.Creatures, Is.All.Not.Null);
            Assert.That(encounter.Characters, Is.Not.Null);
            Assert.That(encounter.Characters, Is.All.Not.Null);

            foreach (var creature in encounter.Creatures)
            {
                Assert.That(creature.Name, Is.Not.Empty);
                Assert.That(creature.Quantity, Is.Positive);
                Assert.That(creature.Description, Is.Not.Null);
            }

            Assert.That(encounter.Treasures, Is.Not.Null);
            Assert.That(encounter.Treasures, Is.All.Not.Null);
            Assert.That(encounter.Treasures.Select(t => t.IsAny), Is.All.True);

            var totalCreatures = encounter.Creatures.Sum(c => c.Quantity);
            Assert.That(encounter.Characters.Count, Is.LessThanOrEqualTo(totalCreatures));
            Assert.That(encounter.Treasures.Count, Is.LessThanOrEqualTo(encounter.Creatures.Count()));
        }