//Not doing gene crossover, but rather asexual reproduction
    public BloopDNA[] Crossover(BloopDNA bloopDNA)
    {
        BloopDNA[] bloopDNACrossover = new BloopDNA[2];

        /*
         * The general idea of gene crossover for these creatures
         * Gene = node_1, node_1_Data, node_1_#_of_Muscles, node_1_Muscle_Conn_Incidies_X, node_1_Muscle_X_minDist, node_1_Muscle_X_maxDist, node_1_Muscle_X_damp, node_1_Muscle_X_freq
         * Example:
         * Node A is connected to B, Node B is not connected to A.
         * Node A Data:  [X: 1f, Y: 2f, Friction: 0.5f, Bouncyness: 0.1f]
         *  Node A - B Muscle Data: [minDist: 0.5f, maxDist: 1f, Damp: 0.25f, Freq: 2.5f]
         * Node B Data:  [X: 0f, Y: 1f, Friction: 1f, Bouncyness: 0f]
         *       __________________   _____________________   ______________
         * Gene = [1f, 2f, 0.5f, 0.1f,  0.5f, 1f, 0.25f, 2.5f,  0f, 1f, 1f, 0f]
         *       ------------------   ---------------------   --------------
         *          Muscle A data      A-B connection data     Muscle B data
         *
         #ofNodes
         #OfMuscles = Σ(#ofMusclesOfNode[i])
         *            i=1
         *
         * Total gene size = (#ofNodes + #OfMuscles)*4
         */

        int thisBloopGeneSize  = (numberOfNodes + numberOfMuscles) * 4;
        int nodeCrossoverPoint = Random.Range(0, numberOfNodes);

        return(bloopDNACrossover);
    }
 public void Activate()
 {
     bloopDNA = new BloopDNA();
     bloopDNA.GenerateRandomBloopDNA();
     timeToLive = 10f; //15
     CreateCreatureFromDNA();
 }
 public void Activate()
 {
     bloopDNA = new BloopDNA();
     bloopDNA.GenerateRandomBloopDNA();
     timeToLive = 10f; //15
     CreateCreatureFromDNA();
 }
    public BloopDNA CopyDNA()
    {
        BloopDNA newDNA = new BloopDNA(numberOfNodes,
                                       multiNodeMuscularConnectionIndices,
                                       multiNodeMuscularData,
                                       nodeData,
                                       numberOfMuscles,
                                       fitness);

        return(newDNA);
    }
    public BloopDNA[] AsexualReproduce()
    {
        BloopDNA[] bloopDNACrossover = new BloopDNA[2];

        bloopDNACrossover[0] = this.CopyDNA();
        bloopDNACrossover[1] = this.CopyDNA();

        if (Random.Range(0, 100) <= 5)
        {
            bloopDNACrossover[0].Mutate();
        }

        bloopDNACrossover[1].Mutate();

        bloopDNACrossover[0].parentSpecieName = speciesName;
        bloopDNACrossover[1].parentSpecieName = speciesName;

        return(bloopDNACrossover);
    }
    public void UpdateCounter(BloopDNA bloopDNA)
    {
        lock (mutex)
        {
            creatureFinishedCounter++;
            //Debug.Log(creatureFinishedCounter);
            if (generationNumber == 1)
            {
                bloopDNAList.Add(bloopDNA);
            }

            if (creatureFinishedCounter == creaturesPerGeneration)
            {
                Breed();
            }
            else if (creatureFinishedCounter % numberOfCreaturesPerRun == 0)
            {
                if (generationNumber == 1)
                {
                    for (int i = creatureFinishedCounter; i < (creatureFinishedCounter + numberOfCreaturesPerRun); i++)
                    {
                        bloopCreatures[i] = (GameObject)Instantiate(bloopCreaturePrefab);
                        bloopCreatures[i].transform.parent = transform;
                        bloopCreatures[i].SendMessage("Activate");
                    }
                }
                else
                {
                    for (int i = creatureFinishedCounter; i < (creatureFinishedCounter + numberOfCreaturesPerRun); i++)
                    {
                        bloopCreatures[i] = (GameObject)Instantiate(bloopCreaturePrefab);
                        bloopCreatures[i].transform.parent = transform;
                        bloopCreatures[i].SendMessage("ActivateWithDNA", bloopDNAList[i]);
                    }
                }
            }
        }
    }
 public BloopData()
 {
     bloopDNA = new BloopDNA();
     bloopDNA.GenerateRandomBloopDNA();
 }
 public BloopData()
 {
     bloopDNA = new BloopDNA();
     bloopDNA.GenerateRandomBloopDNA();
 }
 public void ActivateWithDNAForever(BloopDNA dna)
 {
     bloopDNA = dna;
     timeToLive = 1000f;
     CreateCreatureFromDNA();
 }
 public void ActivateWithDNA(BloopDNA dna)
 {
     bloopDNA = dna;
     timeToLive = 10f; //15
     CreateCreatureFromDNA();
 }
    public void UpdateCounter(BloopDNA bloopDNA)
    {
        lock (mutex)
        {
            creatureFinishedCounter++;
            //Debug.Log(creatureFinishedCounter);
            if(generationNumber == 1)
                bloopDNAList.Add(bloopDNA);

            if (creatureFinishedCounter == creaturesPerGeneration)
            {
                Breed();
            }
            else if (creatureFinishedCounter % numberOfCreaturesPerRun == 0)
            {
                if (generationNumber == 1)
                {
                    for (int i = creatureFinishedCounter; i < (creatureFinishedCounter + numberOfCreaturesPerRun); i++)
                    {
                        bloopCreatures[i] = (GameObject)Instantiate(bloopCreaturePrefab);
                        bloopCreatures[i].transform.parent = transform;
                        bloopCreatures[i].SendMessage("Activate");
                    }
                }
                else
                {
                    for (int i = creatureFinishedCounter; i < (creatureFinishedCounter + numberOfCreaturesPerRun); i++)
                    {
                        bloopCreatures[i] = (GameObject)Instantiate(bloopCreaturePrefab);
                        bloopCreatures[i].transform.parent = transform;
                        bloopCreatures[i].SendMessage("ActivateWithDNA", bloopDNAList[i]);
                    }
                }

            }
        }
    }
    public BloopDNA[] AsexualReproduce()
    {
        BloopDNA[] bloopDNACrossover = new BloopDNA[2];

        bloopDNACrossover[0] = this.CopyDNA();
        bloopDNACrossover[1] = this.CopyDNA();

        if(Random.Range(0,100)<=5)
            bloopDNACrossover[0].Mutate();

        bloopDNACrossover[1].Mutate();

        bloopDNACrossover[0].parentSpecieName = speciesName;
        bloopDNACrossover[1].parentSpecieName = speciesName;

        return bloopDNACrossover;
    }
    //Not doing gene crossover, but rather asexual reproduction
    public BloopDNA[] Crossover(BloopDNA bloopDNA)
    {
        BloopDNA[] bloopDNACrossover = new BloopDNA[2];

        /*
         The general idea of gene crossover for these creatures
         Gene = node_1, node_1_Data, node_1_#_of_Muscles, node_1_Muscle_Conn_Incidies_X, node_1_Muscle_X_minDist, node_1_Muscle_X_maxDist, node_1_Muscle_X_damp, node_1_Muscle_X_freq
         Example:
         Node A is connected to B, Node B is not connected to A.
         Node A Data:  [X: 1f, Y: 2f, Friction: 0.5f, Bouncyness: 0.1f]
            Node A - B Muscle Data: [minDist: 0.5f, maxDist: 1f, Damp: 0.25f, Freq: 2.5f]
         Node B Data:  [X: 0f, Y: 1f, Friction: 1f, Bouncyness: 0f]
                 __________________   _____________________   ______________
         Gene = [1f, 2f, 0.5f, 0.1f,  0.5f, 1f, 0.25f, 2.5f,  0f, 1f, 1f, 0f]
                 ------------------   ---------------------   --------------
                    Muscle A data      A-B connection data     Muscle B data

                      #ofNodes
         #OfMuscles = Σ(#ofMusclesOfNode[i])
                      i=1

         Total gene size = (#ofNodes + #OfMuscles)*4
        */

        int thisBloopGeneSize = (numberOfNodes + numberOfMuscles)*4;
        int nodeCrossoverPoint = Random.Range(0,numberOfNodes);
        return bloopDNACrossover;
    }
    public BloopDNA CopyDNA()
    {
        BloopDNA newDNA = new BloopDNA(numberOfNodes,
                                       multiNodeMuscularConnectionIndices,
                                       multiNodeMuscularData,
                                       nodeData,
                                       numberOfMuscles,
                                       fitness);

        return newDNA;
    }
 public void ActivateWithDNA(BloopDNA dna)
 {
     bloopDNA   = dna;
     timeToLive = 10f; //15
     CreateCreatureFromDNA();
 }
 public void ActivateWithDNAForever(BloopDNA dna)
 {
     bloopDNA   = dna;
     timeToLive = 1000f;
     CreateCreatureFromDNA();
 }