예제 #1
0
    private static void Mutate(Mob mob, Torso[] torsos, List <Head> heads, List <Member> members)
    {
        var iMutation = Random.Range(0, 2 + mob.torso.nbMember);

        switch (iMutation)
        {
        case 0:         // Torso
            var newTorso = Instantiate(torsos[Random.Range(0, torsos.Length)]);
            newTorso.head = mob.torso.head;
            if (newTorso.nbMember == mob.torso.nbMember)
            {
                newTorso.members = mob.torso.members;
            }
            else if (newTorso.nbMember > mob.torso.nbMember)
            {
                newTorso.members.AddRange(mob.torso.members);
                while (newTorso.members.Count < newTorso.nbMember)
                {
                    newTorso.members.Add(Instantiate(mob.torso.members[Random.Range(0, mob.torso.nbMember)]));
                }
            }
            else
            {
                var indexes = new SortedSet <int>();
                while (indexes.Count < newTorso.nbMember)
                {
                    indexes.Add(Random.Range(0, mob.torso.nbMember));
                }
                for (var i = 0; i < mob.torso.nbMember; ++i)
                {
                    if (indexes.Contains(i))
                    {
                        newTorso.members.Add(mob.torso.members[i]);
                    }
                    else
                    {
                        DestroyImmediate(mob.torso.members[i]);
                    }
                }
            }
            DestroyImmediate(mob.torso);
            mob.torso = newTorso;
            break;

        case 1:         // Head
            DestroyImmediate(mob.torso.head);
            mob.torso.head = Instantiate(heads[Random.Range(0, heads.Count)]);
            break;

        default:         // Member
            iMutation -= 2;
            DestroyImmediate(mob.torso.members[iMutation]);
            mob.torso.members[iMutation] = Instantiate(members[Random.Range(0, members.Count)]);
            break;
        }
        mob.ComputeStats();
    }