/// <summary> /// Start a new combat from the given RandomCombat object. /// </summary> public static void StartNewCombat(RandomCombat randomCombat) { // check the parameter if (randomCombat == null) { throw new ArgumentNullException("randomCombat"); } // determine how many monsters will be in the combat int monsterCount = randomCombat.MonsterCountRange.GenerateValue(Session.Random); // determine the total probability int totalWeight = 0; foreach (WeightedContentEntry<Monster> entry in randomCombat.Entries) { totalWeight += entry.Weight; } // generate each monster List<CombatantMonster> generatedMonsters = new List<CombatantMonster>(); for (int i = 0; i < monsterCount; i++) { int monsterChoice = Session.Random.Next(totalWeight); foreach (WeightedContentEntry<Monster> entry in randomCombat.Entries) { if (monsterChoice < entry.Weight) { generatedMonsters.Add( new CombatantMonster(entry.Content)); break; } else { monsterChoice -= entry.Weight; } } } // randomize the list of monsters List<CombatantMonster> randomizedMonsters = new List<CombatantMonster>(); while ((generatedMonsters.Count > 0) && (randomizedMonsters.Count <= MonsterPositions.Length)) { int index = Session.Random.Next(generatedMonsters.Count); randomizedMonsters.Add(generatedMonsters[index]); generatedMonsters.RemoveAt(index); } // start the combat StartNewCombat(GenerateCombatantsFromParty(), randomizedMonsters, randomCombat.FleeProbability); }
/// <summary> /// Check if a random combat should start. If so, start combat immediately. /// </summary> /// <returns>True if combat was started, false otherwise.</returns> public static bool CheckForRandomCombat(RandomCombat randomCombat) { // check the parameter if ((randomCombat == null) || (randomCombat.CombatProbability <= 0)) { return false; } // check to see if combat has already started if (CombatEngine.IsActive) { return false; } // check to see if the random combat starts int randomCombatCheck = random.Next(100); if (randomCombatCheck < randomCombat.CombatProbability) { // start combat immediately CombatEngine.StartNewCombat(randomCombat); return true; } // combat not started return false; }