/// <summary> /// This method should receive the Universe to add Aliens to and a set of AlienDefaultSettings /// /// Default values are handled in AlienCreation.AddAliens /// </summary> /// <param name="universe"></param> /// <param name="alienDefaultSettings"></param> /// <returns> /// Return the newly edited Universe /// </returns> /// <exception cref="FileNotFoundException"></exception> public Universe CreateAliens(Universe universe, AlienDefaultSettings alienDefaultSettings) { // If there are no Planets or Locations for the Problems to be tied to then throw an exception if (universe.Stars == null || universe.Stars.Count == 0) { throw new FileNotFoundException("No locations have been loaded."); } // Set the Universe to the Universe return from ProblemCreation.AddProblems and serialize/return it universe = new AlienCreation().AddAliens(universe, alienDefaultSettings, AlienData); SerializeData(universe); return(universe); }
public Universe AddAliens(Universe universe, AlienDefaultSettings alienDefaultSettings, AlienData alienData) { // If no Characters have been created on the Universe then give it an empty list of them. universe.Aliens ??= new List <Alien>(); var count = alienDefaultSettings.Count < 0 ? Rand.Next(0, universe.Planets.Count) : alienDefaultSettings.Count; var bCount = alienDefaultSettings.BodyTraitCount < 0 ? -1 : alienDefaultSettings.BodyTraitCount; //Generate an Alien var aCount = 0; while (aCount < count) { var alien = new Alien(); IdGen.GenerateId(alien); if (universe.Aliens.Exists(a => a.Id == alien.Id)) { continue; } alien.BodyTraits = new List <string>(); // Alien Body Traits if (bCount > 0) { var bCounter = 0; while (bCounter < bCount) { var trait = alienData.BodyTraits[Rand.Next(0, alienData.BodyTraits.Count)]; if (!alien.BodyTraits.Contains(trait)) { alien.BodyTraits.Add(trait); } else { continue; } bCounter++; } } else // If there were no traits passed in, pick random { while (true) { var trait = alienData.BodyTraits[Rand.Next(0, alienData.BodyTraits.Count)]; if (!alien.BodyTraits.Contains(trait)) { alien.BodyTraits.Add(trait); } else { continue; } if (Rand.Next(0, 6) == 0) { continue; } break; } } alien.Lenses = new List <string>(); // Alien Lenses if (alienDefaultSettings.Lenses == null || alienDefaultSettings.Lenses.Count == 0) { var lCount = Rand.Next(0, 2) + 1; var lCounter = 0; while (lCounter < lCount) { var lens = alienData.Lenses[Rand.Next(0, alienData.Lenses.Count)].Type; if (!alien.Lenses.Contains(lens)) { alien.Lenses.Add(lens); } else { continue; } lCounter++; } } else { alien.Lenses = alienDefaultSettings.Lenses; } alien.SocialStructures = new List <string>(); // Alien Social Structure if (Rand.Next(0, 2) == 0) { alien.SocialStructures.Add(alienData .SocialStructures[Rand.Next(0, alienData.SocialStructures.Count)].Type); } else { var sCounter = 0; var sCount = Rand.Next(0, 3) + 1; alien.MultiPolarType = Rand.Next(0, 2) == 0 ? "Cooperative" : "Competitive"; while (sCounter < sCount) { var type = alienData.SocialStructures[Rand.Next(0, alienData.SocialStructures.Count)].Type; if (!alien.SocialStructures.Contains(type)) { alien.SocialStructures.Add(type); } else { continue; } sCounter++; } } universe.Aliens.Add(alien); aCount++; } universe.Aliens = universe.Aliens.OrderBy(a => a.Id).ToList(); return(universe); }