public static List <string> ChooseTraitsFromEggToEgg(GameObject inst) { Debug.Log("ChooseTraitsFromEggToEgg"); var gtc = inst.AddOrGet <GeneticTraitComponent>(); var result = new List <string>(); var fromTraits = inst.GetComponent <AIGeneticTraits>(); Debug.Log("All groups"); var groups = Group.groups; Util.Shuffle <Group>(groups); DebugHelper.LogForEach(groups); if (fromTraits == null) { Debug.Log("No traits present"); } else { Debug.Log("Traits presents"); var traits_present = fromTraits.GetTraitIds(); var traits_locked = new List <GeneticTraitBuilder>(); var groups_locked_list = new List <Group>(); foreach (String t in traits_present) { var trait_locked = traits.Where(x => x.ID == t).FirstOrDefault(); traits_locked.Add(trait_locked); result.Add(t); groups_locked_list.Add(trait_locked.Group); Debug.Log(trait_locked); } Debug.Log("groups_locked"); DebugHelper.LogForEach(groups_locked_list); //groups = groups.Except(groups_locked); List <Group> result_ = groups.Except(groups_locked_list).ToList(); groups = result_; } Debug.Log("groups"); DebugHelper.LogForEach(groups); Chances chances = new Chances(); chances.addChance(0.5f); //1 positive trait chances.addChance(0.25f); //2 positives and 1 negative chances.addChance(0.25f); //None var chance_result = chances.rollChance(); chance_result = 0;//for testing purposes Debug.Log("chance_result " + chance_result); var number_positives = 0; var number_negatives = 0; switch (chance_result) { case 0: number_positives = 1; break; case 1: number_positives = 2; number_negatives = 1; break; case 2: break; } groups.OrderBy(x => Util.GaussianRandom());//is not ordering randomly must be fix var groups_list = groups.ToList(); for (int i = 0; i < number_positives && groups_list.Count() > 0; i++) { var first = groups_list.First(); var temp = ChooseTraitFromGroup(groups.First(), true, true); if (temp != null) { result.Add(temp); } groups_list = groups_list.Where(u => u.Id != first.Id).ToList(); } //for testing result.Clear(); result.Add((new OffColor()).ID); for (int i = 0; i < number_negatives && groups.Count() > 0; i++) { var first = groups.First(); var temp = ChooseTraitFromGroup(groups.First(), true, false); if (temp != null) { result.Add(temp); } groups = groups.Where(u => u.Id != first.Id).ToList(); } /* int numTraitsToChoose = UnityEngine.Random.Range(2, 4); * Debug.Log("------------"); * Debug.Log(inst); * Debug.Log(numTraitsToChoose); * * * foreach (var group in groups) * { * if (group.Key.HasRequirements(inst)) * { * result.Add(ChooseTraitFrom(group)); * } * }*/ Debug.Log(result); DebugHelper.LogForEach(result); // If there are more traits than asked for we don't want to bias to the ones that were chosen first return(result .Where(s => s != null) //.OrderBy(x => Util.GaussianRandom()) //.Take(numTraitsToChoose) .ToList()); }