Example #1
0
        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());
        }