Exemplo n.º 1
0
 // Get the experience threshold for the specified level and difficulty.
 public static int GetExperienceThreshold(int level, EncounterDifficulty difficulty)
 {
     return(xpThresholdMatrix[level, (int)difficulty]);
 }
Exemplo n.º 2
0
        /// <summary>
        /// Generates a random encounter
        /// </summary>
        /// <param name="difficulty">The desired encounter difficulty</param>
        /// <returns>A created encounter or null if no encounter could be created with given parameters</returns>
        public static Encounter CreateEncounter(EncounterDifficulty difficulty)
        {
            double experience = StoredData.PlayerExperience[StoredData.PlayerLevel - 1, (int)difficulty] * StoredData.PlayerCount;

            if (difficulty == EncounterDifficulty.Deadly)
            {
                experience *= 1.05; // Increase the cap on deadly encounters by 5%
            }

            Encounter encounter = new Encounter();

            // Get a random monster to base the rest of the encounter on
            Monster firstMonster = Monster.GetRandomMonster();

            firstMonster.SetRandomPersonality();
            firstMonster.SetRandomRelationShip();

            int count = 0;

            while (firstMonster.GetExperience() > experience)
            {
                if (count++ == 20)
                {
                    return(null);
                }

                firstMonster = Monster.GetRandomMonster();
                firstMonster.SetRandomPersonality();
                firstMonster.SetRandomRelationShip();
            }

            encounter.Monsters.Add(firstMonster);

            // Add random monsters appropriate to the first monster until the encounter is sufficiently difficult
            while (encounter.GetEffectiveExperience() < experience)
            {
                if (encounter.Monsters.Count > 20)
                {
                    return(null);
                }

                Monster newMonster = firstMonster.GetRandomAppropriateMonster();
                newMonster.SetRandomPersonality();
                newMonster.SetRandomRelationShip();

                encounter.Monsters.Add(newMonster);
            }

            encounter.Monsters.RemoveAt(encounter.Monsters.Count - 1); // Remove the last one because the while statement added one monster above the maximum allowed difficulty

            // 5% chance that the encounter is tied to a random infernal cult
            // Add the cult to a given monster and randomly to additional monsters that have access to the same cult
            if (Utility.Random.Next(100) > 94)
            {
                int monsterIndex = encounter.Monsters.FindIndex(monster => monster.InfernalCults.Count > 0);

                if (monsterIndex > -1)
                {
                    encounter.InfernalCult = GetRandomInfernalCult(encounter.Monsters[monsterIndex].InfernalCults);
                    encounter.Monsters[monsterIndex].InfernalCult = encounter.InfernalCult;

                    for (int i = 0; i < encounter.Monsters.Count; i++)
                    {
                        if (i != monsterIndex && encounter.Monsters[i].InfernalCults.Where(cult => cult.ID == encounter.InfernalCult.ID).ToArray().Length > 0 && Utility.Random.Next(100) > 94)
                        {
                            encounter.Monsters[i].InfernalCult = encounter.InfernalCult;
                        }
                    }
                }
            }

            return(encounter);
        }