com.evoluzion.Mundo.java Source code

Java tutorial

Introduction

Here is the source code for com.evoluzion.Mundo.java

Source

/*Copyright 2014 Adolfo R. Zurita*/

/*This file is part of EvoluZion.
    
EvoluZion is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
    
EvoluZion is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.
    
You should have received a copy of the GNU Lesser General Public License
along with EvoluZion.  If not, see <http://www.gnu.org/licenses/>.*/

package com.evoluzion;

import java.awt.HeadlessException;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Serializable;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Comparator;

import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileNameExtensionFilter;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.TimeUtils;
import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils.Collections;

public class Mundo implements Serializable {

    /**
        * 
        */
    private static final long serialVersionUID = 1L;
    protected Evoluzion ev;//clase prinsipal
    MenuInicio mi; // menu inicio
    Texto tx;
    Array<Senergia> ase; //lista de energia verde
    Array<Qenergia> aqe; //lista de energia roja (biomasa)
    Array<Organismo> aorg; //lista de organismos
    Array<Organismo> aEspesies, aEspesiesTotales; //listas de organismos colectados segun especies

    float ancho, alto, ratio; //dimenciones de la pantalla
    //
    float deltaX = 0; //delta de x entre dos individuos
    float deltaY = 0; //delta de y entre dos individuos
    float medSpeed; //se usa para el calcula de velosidad media
    float temperatura = 25;
    float medTem;
    float eficiencia = 1;
    //suma de toda la masa libre

    int dias, horas, minutos, minutos2, minutos3, segundos, segundos2, segundos3, segundos4, segundos5; //anota el paso del tiempo
    long edad, delta, delta2, delta3, tiempo; // mide diferencia de tiempo entre una accion y la siguiente 
    int tiempoMaximo = 0;
    int Masatotal;
    int tiempoMuestreo;
    int tiempoCatastrofe;
    int tiempoATB;
    int cantidadMuestras;
    int contadorMuestreo;
    int Senergia;
    int Qbiomasa;
    int numOrg;
    int numSen;
    int numQen;
    int EnRe;
    int BioRe;
    float medSize;
    int medMut;
    int medLon;
    int pausaGame = 1;// 1= play -1=stop
    int zoom = 2;
    int index = 0;
    int maximo = 1000; //numero maximo de organismos
    int ingles = -1; //-1=false 1=true

    float minStar1, minStar2;
    float TempFinal1, TempFinal2, tempXSecond1, tempXSecond2;
    float deltaTime1, deltaTime2;

    int antibiotico = -1; //1= true -1= false

    int horizontalTransferRate;

    boolean colectarancho = false;
    boolean colectaralto = false;
    boolean colectSpeed = false;
    boolean colectColor = false;
    boolean colectSentir = false;
    boolean colectPredador = false;
    boolean colectCazar = false;
    boolean colectEscapar = false;
    boolean colectRadioconsiente = false;
    boolean colectarTasaMut = false;
    boolean colectarLongevidad = false;
    boolean colectarTemp = false;
    boolean colectarResistencia = false;

    boolean mutarColor = true;
    boolean mutarSize = true;
    boolean mutarSpeed = true;
    boolean mutarSentir = true;
    boolean mutarPredador = true;
    boolean mutarCazar = true;
    boolean mutarEscapar = true;
    boolean mutarRadioconsiente = true;
    boolean mutarTasaMut = true;
    boolean mutarLongevidad = true;
    boolean mutarTemp = true;
    boolean mutarResistencia = true;

    boolean cargarPoblacion = false;
    boolean moverMasa;

    String ruta, poblacion;
    StringBuffer linea, orgNombre; //se usa para archivar los resultado
    String nombre;
    TextureAtlas textuRA_ENER, textura_ORG, textura_organismos; // contine las imagenes
    Texture auraATB, transferido;
    Archivar f_datos, f_genes, f_arbol, f_proteoma, f_poblacion, f_mutantes; //para archivar
    NumberFormat format = new DecimalFormat("0.000");
    //private Quadtree quad;

    Quadtree quad;

    public Mundo(Evoluzion ev, String ruta, String nombre, String poblacion, int numOrg, int numSen, int numQen,
            int Senergia, int Qbiomasa, boolean cargarPoblacion, boolean moverMasa, String genesPedidos,
            int ingles) {

        this.ev = ev;

        this.numOrg = numOrg;
        this.numSen = numSen;
        this.numQen = numQen;
        this.Senergia = Senergia;
        this.Qbiomasa = Qbiomasa;
        this.cargarPoblacion = cargarPoblacion;
        this.moverMasa = moverMasa;
        this.nombre = nombre;
        this.ruta = ruta;
        this.poblacion = poblacion;
        this.ingles = ingles;

        tx = new Texto();
        if (ingles == 1) {
            tx.setIngles();
        }
        if (ingles == -1) {
            tx.setEspanol();
        }

        orgNombre = new StringBuffer("a");

        //quaddtree

        //   quad = new Quadtree(0, new Rectangle(0,0,ancho,alto));

        // tamao de la pantalla
        ancho = Gdx.graphics.getWidth();
        alto = Gdx.graphics.getHeight();

        //listas
        ase = new Array<Senergia>();
        aqe = new Array<Qenergia>();
        aorg = new Array<Organismo>();
        aEspesies = new Array<Organismo>();
        aEspesiesTotales = new Array<Organismo>();

        quad = new Quadtree(0, new Rectangle(0, 0, ancho, alto));

        // set time to 0   
        setDelta();
        setDelta2();
        setDelta3();
        setTiempo();

        linea = new StringBuffer();// used to write text in files

        textuRA_ENER = new TextureAtlas("data/energia.pack");
        textura_ORG = new TextureAtlas("data/objetos.pack");
        textura_organismos = new TextureAtlas("data/organ.pack");
        auraATB = new Texture("data/auraATB.png");
        transferido = new Texture("data/Transferido.png");

        //agregar cuantos de energia solar

        float x = 0;
        float y = alto;
        for (int i = 0; i < this.numSen; i++) {

            Vector2 pos = new Vector2((float) Math.random() * ancho, (float) Math.random() * alto);

            x = x + 20;
            if (x >= ancho) {
                x = 0;
                y = y - 20;
            }

            ase.add(new Senergia(pos, this));
        }

        //agregar materia

        for (int i = 0; i < numQen; i++) {

            Vector2 pos = new Vector2((float) (Math.random() * (ancho - 5 + 1)) + 5, (float) Math.random() * alto);

            aqe.add(new Qenergia(pos, moverMasa, this));
        }

        //agregar materia invisible para usarla en el balanse de masa

        for (int i = 0; i < numQen / 3; i++) {

            Vector2 pos = new Vector2((float) (Math.random() * (ancho - 5 + 1)) + 5, (float) Math.random() * alto);

            Qenergia qe = new Qenergia(pos, moverMasa, this);
            qe.visible = false;
            aqe.add(qe);
        }

        //colecta la primera especie en la lista

        for (Organismo or : aorg) {

            boolean igual = false;

            String id = or.identificador;
            for (Organismo or2 : aEspesies) {

                if (id.equals(or2.nombre)) {
                    igual = true;
                }

            }
            if (igual == false) {
                aEspesies.add(or);
            }

        }

        for (Organismo or : aorg) {

            boolean igual = false;
            String id = or.identificador;

            for (Organismo or2 : aEspesiesTotales) {

                if (id.equals(or2.nombre)) {
                    igual = true;
                }

            }
            if (igual == false) {
                aEspesiesTotales.add(or);
            }

        }

        //manejamos los archivos
        f_datos = new Archivar();
        f_genes = new Archivar();
        f_proteoma = new Archivar();
        f_arbol = new Archivar();
        f_poblacion = new Archivar();
        f_mutantes = new Archivar();

    }

    // end of cronstructor metod

    // metods

    public void agregarPrimerosOrg(int num) {

        for (int i = 0; i < num; i++) {

            Vector2 pos = new Vector2((float) Math.random() * ancho, (float) Math.random() * alto);
            Vector2 dir = new Vector2((float) Math.random() * 20, (float) Math.random() * 20);
            if (dir.x < 10) {
                dir.x = dir.x * (-1);
            }
            if (dir.x > 10) {
                dir.x = dir.x - 10;
            }
            if (dir.y < 10) {
                dir.y = dir.y * (-1);
            }
            if (dir.y > 10) {
                dir.y = dir.y - 10;
            }

            aorg.add(new Organismo(new Genoma(), pos, orgNombre, this));
            aorg.get(i).direccion = dir;

        }
        int o = BiomasaTotal() / Qbiomasa;
        //System.out.println(BiomasaTotal());
        for (int i = 0; i < o; i++) {

            Qenergia qe = aqe.get(i);
            qe.visible = false;

        }

        Masatotal = MateriaLibre() + BiomasaTotal();

    }

    //methods for quantifying values or do Statistics

    public float temOptimaMedia() {
        medTem = 0;
        int size = aorg.size;
        if (size > 0) {
            for (int i = size - 1; i >= 0; i--) {
                medTem = medTem + aorg.get(i).tempOptima;
            }
        }
        if (size == 0) {
            size = 1;
        }

        return medTem / size;
    }

    public int cantidadPredadores() {
        int carnivoros = 0;
        int size = aorg.size;
        for (int i = size - 1; i >= 0; i--) {
            if (aorg.get(i).carnivoro == true) {
                carnivoros = carnivoros + 1;
            }
        }
        return carnivoros;
    }

    public int cantidadResistentes() {
        int resistente = 0;
        int size = aorg.size;
        for (int i = size - 1; i >= 0; i--) {
            if (aorg.get(i).resistenciaATB == true) {
                resistente = resistente + 1;
            }
        }
        return resistente;
    }

    public float velocidadMedia() {
        medSpeed = 0;
        int size = aorg.size;
        if (size > 0) {
            for (int i = size - 1; i >= 0; i--) {
                medSpeed = medSpeed + aorg.get(i).speed;
            }
        }
        if (size == 0) {
            size = 1;
        }

        return medSpeed / size;
    }

    public int tasaMutMedio() {
        medMut = 0;
        int size = aorg.size;
        if (size > 0) {
            for (int i = size - 1; i >= 0; i--) {
                medMut = medMut + aorg.get(i).tasaMut;
            }
        }
        if (size == 0) {
            size = 1;
        }

        return (medMut / size);
    }

    public float longevidadMedio() {
        medLon = 0;
        int size = aorg.size;
        if (size > 0) {
            for (int i = size - 1; i >= 0; i--) {
                medLon = medLon + aorg.get(i).longevidad;
            }
        }
        if (size == 0) {
            size = 1;
        }

        return (float) (medLon) / 1000 / size;
    }

    public float tamanoMedio() {
        medSize = 0;
        int size = aorg.size;
        if (size > 0) {
            for (int i = size - 1; i >= 0; i--) {
                medSize = medSize + aorg.get(i).capacidad;
            }
        }
        if (size == 0) {
            size = 1;
        }

        return medSize / size;
    }

    public int MateriaLibre() {
        int materia = 0;
        int size = aqe.size;
        for (int i = size - 1; i >= 0; i--) {
            if (aqe.get(i).visible == true) {
                materia = (int) (materia + aqe.get(i).masa);
            }
        }
        return materia;
    }

    public int BiomasaTotal() {
        int biomasaTotal = 0;
        int size = aorg.size;
        for (int i = size - 1; i >= 0; i--) {
            biomasaTotal = (int) (biomasaTotal + aorg.get(i).biomasa);
        }
        return biomasaTotal;
    }

    public int BioenergiaTotal() {
        int energiaTotal = 0;
        int size = aorg.size;
        for (int i = size - 1; i >= 0; i--) {
            energiaTotal = (int) (energiaTotal + aorg.get(i).energia);
        }
        return energiaTotal;
    }

    //to correct rounding errors in the total mass of the system, add or remove mass

    public void chequerBalance() {

        int a = Masatotal - (MateriaLibre() + BiomasaTotal());
        if (a > Qbiomasa) {
            int size = aqe.size;
            for (int i = size - 1; i >= 0; i--) {
                if (aqe.get(i).visible == false) {
                    aqe.get(i).visible = true;
                    i = 0;
                }
            }
        }

        if (a > Qbiomasa) {
            int size = aqe.size;
            for (int i = size - 1; i >= 0; i--) {
                if (aqe.get(i).visible == false) {
                    aqe.get(i).visible = true;
                    i = 0;
                }
            }
        }

        if (a < Qbiomasa * (-1)) {
            int size = aqe.size;
            for (int i = size - 1; i >= 0; i--) {
                if (aqe.get(i).visible == true) {
                    aqe.get(i).visible = false;
                    i = 0;
                }
            }
        }

        if (a < Qbiomasa * (-1)) {
            int size = aqe.size;
            for (int i = size - 1; i >= 0; i--) {
                if (aqe.get(i).visible == true) {
                    aqe.get(i).visible = false;
                    i = 0;
                }
            }
        }
    }

    //kill 95% of all organism

    public void catastrofe() {

        int size = aorg.size;
        for (int i = size - 1; i >= 0; i--) {

            int e = (int) (Math.random() * 10000);

            if (e > 500) {
                aorg.get(i).morir();
            }

        }

    }

    //metodos para colectar los datos

    public void guardarPoblacion() {

        try {
            JFileChooser fc = new JFileChooser();
            fc.setCurrentDirectory(new File(ruta));
            FileNameExtensionFilter filter = new FileNameExtensionFilter("poblacin Total" + "     (pob)", "pob");

            fc.setFileFilter(filter);

            int returnVal = fc.showSaveDialog(fc);

            if (fc.getFileFilter() == filter) {

                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    //                     File file = fc.getSelectedFile();

                    f_poblacion.creararchivo(fc.getSelectedFile() + ".pob");

                    StringBuffer linea = new StringBuffer();

                    int size = aorg.size;

                    for (int i = size - 1; i >= 0; i--) {
                        Organismo or = aorg.get(i);
                        linea.replace(0, linea.length(),
                                "<h>" + or.nombre.toString() + "dX" + or.posicion.x + "dY" + or.posicion.y
                                        + "<color>" + or.adn.color + "<ancho>" + or.adn.ancho + "<alto>"
                                        + or.adn.alto + "<speed>" + or.adn.speed + "<temp>" + or.adn.toleranciaTemp
                                        + "<sentir>" + or.adn.sentir + "<alcance>" + or.adn.radioConsiente
                                        + "<cazar>" + or.adn.cazar + "<escapar>" + or.adn.escapar + "<predador>"
                                        + or.adn.predador + "<longevidad>" + or.adn.longevidad + "<tasamut>"
                                        + or.adn.tasaMutacion + "<atb>" + or.adn.resistenciaATB + "\n");
                        f_poblacion.escribirArchivo(linea.toString());
                    }
                    f_poblacion.cerrarArchivo();

                }
            }
        } catch (HeadlessException e) {
            JOptionPane.showMessageDialog(null, "error al escribir el archivo");
            e.printStackTrace();
        }
    }

    public void guardarPoblacionMarcada() {

        try {
            JFileChooser fc = new JFileChooser();
            fc.setCurrentDirectory(new File(ruta));
            FileNameExtensionFilter filter = new FileNameExtensionFilter("poblacin Marcada" + "     (pob)",
                    "pob");

            fc.setFileFilter(filter);

            int returnVal = fc.showSaveDialog(fc);

            if (fc.getFileFilter() == filter) {

                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    //                     File file = fc.getSelectedFile();

                    f_poblacion.creararchivo(fc.getSelectedFile() + ".pob");

                    StringBuffer linea = new StringBuffer();

                    int size = aorg.size;

                    for (int i = size - 1; i >= 0; i--) {
                        Organismo or = aorg.get(i);
                        if (or.marcado == -1) { // -1 == true
                            linea.replace(0, linea.length(),
                                    "<h>" + or.nombre.toString() + "dX" + or.posicion.x + "dY" + or.posicion.y
                                            + "<color>" + or.adn.color + "<ancho>" + or.adn.ancho + "<alto>"
                                            + or.adn.alto + "<speed>" + or.adn.speed + "<temp>"
                                            + or.adn.toleranciaTemp + "<sentir>" + or.adn.sentir + "<alcance>"
                                            + or.adn.radioConsiente + "<cazar>" + or.adn.cazar + "<escapar>"
                                            + or.adn.escapar + "<predador>" + or.adn.predador + "<longevidad>"
                                            + or.adn.longevidad + "<tasamut>" + or.adn.tasaMutacion + "<atb>"
                                            + or.adn.resistenciaATB + "\n");
                            f_poblacion.escribirArchivo(linea.toString());
                        }
                    }
                    f_poblacion.cerrarArchivo();

                }
            }
        } catch (HeadlessException e) {
            JOptionPane.showMessageDialog(null, "error al escribir el archivo");
            e.printStackTrace();
        }
    }

    public void guardarPoblacionNoMaracada() {

        try {
            JFileChooser fc = new JFileChooser();
            fc.setCurrentDirectory(new File(ruta));
            FileNameExtensionFilter filter = new FileNameExtensionFilter("poblacin No Marcada" + "     (pob)",
                    "pob");

            fc.setFileFilter(filter);

            int returnVal = fc.showSaveDialog(fc);

            if (fc.getFileFilter() == filter) {

                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    //                     File file = fc.getSelectedFile();

                    f_poblacion.creararchivo(fc.getSelectedFile() + ".pob");

                    StringBuffer linea = new StringBuffer();

                    int size = aorg.size;

                    for (int i = size - 1; i >= 0; i--) {
                        Organismo or = aorg.get(i);
                        if (or.marcado == 1) { // 1 = false
                            linea.replace(0, linea.length(),
                                    "<h>" + or.nombre.toString() + "dX" + or.posicion.x + "dY" + or.posicion.y
                                            + "<color>" + or.adn.color + "<ancho>" + or.adn.ancho + "<alto>"
                                            + or.adn.alto + "<speed>" + or.adn.speed + "<temp>"
                                            + or.adn.toleranciaTemp + "<sentir>" + or.adn.sentir + "<alcance>"
                                            + or.adn.radioConsiente + "<cazar>" + or.adn.cazar + "<escapar>"
                                            + or.adn.escapar + "<predador>" + or.adn.predador + "<longevidad>"
                                            + or.adn.longevidad + "<tasamut>" + or.adn.tasaMutacion + "<atb>"
                                            + or.adn.resistenciaATB + "\n");
                            f_poblacion.escribirArchivo(linea.toString());
                        }
                    }
                    f_poblacion.cerrarArchivo();

                }
            }
        } catch (HeadlessException e) {
            JOptionPane.showMessageDialog(null, "error al escribir el archivo");
            e.printStackTrace();
        }
    }

    public void leerArchivoPoblacion() {

        for (Organismo or : aorg) {
            aorg.removeValue(or, true);
        }
        ;
        for (Organismo or : aEspesiesTotales) {
            aEspesiesTotales.removeValue(or, true);
        }

        try {

            FileReader fr = new FileReader(poblacion);
            BufferedReader br = new BufferedReader(fr);
            String linea = null;
            while ((linea = br.readLine()) != null) {

                Genoma gen = new Genoma();

                gen.color = new StringBuffer(
                        linea.substring(linea.indexOf("<color>") + 7, linea.indexOf("<ancho>")));
                gen.ancho = new StringBuffer(
                        linea.substring(linea.indexOf("<ancho>") + 7, linea.indexOf("<alto>")));
                gen.alto = new StringBuffer(linea.substring(linea.indexOf("<alto>") + 6, linea.indexOf("<speed>")));
                gen.speed = new StringBuffer(
                        linea.substring(linea.indexOf("<speed>") + 7, linea.indexOf("<temp>")));
                gen.toleranciaTemp = new StringBuffer(
                        linea.substring(linea.indexOf("<temp>") + 6, linea.indexOf("<sentir>")));
                gen.sentir = new StringBuffer(
                        linea.substring(linea.indexOf("<sentir>") + 8, linea.indexOf("<alcance>")));
                gen.radioConsiente = new StringBuffer(
                        linea.substring(linea.indexOf("<alcance>") + 9, linea.indexOf("<cazar>")));
                gen.cazar = new StringBuffer(
                        linea.substring(linea.indexOf("<cazar>") + 7, linea.indexOf("<escapar>")));
                gen.escapar = new StringBuffer(
                        linea.substring(linea.indexOf("<escapar>") + 9, linea.indexOf("<predador>")));
                gen.predador = new StringBuffer(
                        linea.substring(linea.indexOf("<predador>") + 10, linea.indexOf("<longevidad>")));
                gen.longevidad = new StringBuffer(
                        linea.substring(linea.indexOf("<longevidad>") + 12, linea.indexOf("<tasamut>")));
                gen.tasaMutacion = new StringBuffer(
                        linea.substring(linea.indexOf("<tasamut>") + 9, linea.indexOf("<atb>")));
                gen.resistenciaATB = new StringBuffer(linea.substring(linea.indexOf("<atb>") + 5, linea.length()));
                Vector2 pos = new Vector2(
                        Float.parseFloat(linea.substring(linea.indexOf("dX") + 2, linea.indexOf("dY"))),
                        Float.parseFloat(linea.substring(linea.indexOf("dY") + 2, linea.indexOf("<color>"))));
                StringBuffer nombre = new StringBuffer(
                        linea.substring(linea.indexOf("<h>") + 3, linea.indexOf("dX")));

                Organismo or = new Organismo(gen, pos, nombre, this);
                or.direccion.x = (float) (Math.random() * 10);
                or.direccion.y = (float) (Math.random() * 10);
                aorg.add(or);
            }

            int o = BiomasaTotal() / Qbiomasa;
            //System.out.println(BiomasaTotal());
            for (int i = 0; i < o; i++) {

                Qenergia qe = aqe.get(i);
                qe.visible = false;

            }

            Masatotal = MateriaLibre() + BiomasaTotal();

            br.close();
            fr.close();

        } catch (IOException ex) {

            JOptionPane.showMessageDialog(null, "no se puede leer este archivo");

            for (int i = 0; i < numOrg; i++) {

                Vector2 pos = new Vector2((float) Math.random() * ancho, (float) Math.random() * alto);

                Vector2 dir = new Vector2((float) Math.random() * 20, (float) Math.random() * 20);
                if (dir.x < 10) {
                    dir.x = dir.x * (-1);
                }
                if (dir.x > 10) {
                    dir.x = dir.x - 10;
                }
                if (dir.y < 10) {
                    dir.y = dir.y * (-1);
                }
                if (dir.y > 10) {
                    dir.y = dir.y - 10;
                }
                // System.out.println("x "+ dir.x +" y "+dir.y);
                aorg.add(new Organismo(new Genoma(), pos, orgNombre, this));
            }

            ex.printStackTrace();
        }
    }

    //guara las especies que estan en un momento determinado

    //colectar mutantes o especies del momento

    public void colectorEspesies() {

        for (Organismo or : aEspesies) {
            or.cantidad = 1;
            aEspesies.removeValue(or, true);
        }

        for (Organismo or : aorg) {

            boolean igual = false;

            String id = or.nombre.toString();
            for (Organismo or2 : aEspesies) {

                if (id.equals(or2.nombre.toString())) {
                    igual = true;
                    or2.cantidad++;
                }

            }
            if (igual == false) {
                aEspesies.add(or);
            }

        }

        aEspesies.sort();

    }
    //colectar todas las que aparesen

    public void colectorEspesiesTotales() {

        for (Organismo or : aorg) {

            boolean igual = false;
            String id = or.nombre.toString();

            for (Organismo or2 : aEspesiesTotales) {

                if (id.equals(or2.nombre.toString())) {
                    igual = true;
                }

            }
            if (igual == false) {
                aEspesiesTotales.add(or);
            }

        }

    }

    public void archivarGenoma() {
        if (aorg.size > 0) {

            f_genes.escribirArchivo("" + minutos2 + ":" + segundos + "\n");
            int size = aEspesies.size;
            for (int i = size - 1; i >= 0; i--) {
                Organismo or = aEspesies.get(i);
                linea.replace(0, linea.length(), "");
                linea.append(">" + or.nombre.toString() + "\n" + or.adn.colectarGenoma(this) + "\n\n");

                f_genes.escribirArchivo(linea.toString());
            }
            f_genes.escribirArchivo("\n\n");
        }
    }

    public void archivarProteoma() {
        if (aorg.size > 0) {

            f_proteoma.escribirArchivo("" + minutos2 + ":" + segundos + "\n");
            int size = aEspesies.size;
            for (int i = size - 1; i >= 0; i--) {
                Organismo or = aEspesies.get(i);
                linea.replace(0, linea.length(), "");
                linea.append(">" + or.nombre.toString() + "\n" + or.adn.colectarProteoma(this) + "\n\n");

                f_proteoma.escribirArchivo(linea.toString());
            }
            f_proteoma.escribirArchivo("\n\n");
        }
    }

    public void archivarFenotipo() {
        if (aorg.size > 0) {

            f_mutantes.escribirArchivo("" + minutos2 + ":" + segundos);
            int size = aEspesies.size;
            for (int i = size - 1; i >= 0; i--) {
                Organismo or = aEspesies.get(i);

                linea.replace(0, linea.length(), "");
                linea.append(" " + "," + or.nombre.toString() + "," + or.cantidad);

                if (colectaralto == true) {
                    linea.append("," + or.alto);
                }
                if (colectarancho == true) {
                    linea.append("," + or.ancho);
                }
                if (colectSpeed == true) {
                    linea.append("," + or.speed);
                }
                if (colectColor == true) {
                    linea.append("," + or.color);
                }
                if (colectarTasaMut == true) {
                    linea.append("," + or.tasaMut);
                }
                if (colectarTemp == true) {
                    linea.append("," + or.tempOptima);
                }
                if (colectarLongevidad == true) {
                    linea.append("," + or.longevidad);
                }
                if (colectRadioconsiente == true) {
                    linea.append("," + or.radioConsiente);
                }
                if (colectPredador == true) {
                    linea.append("," + or.carnivoro);
                }
                if (colectSentir == true) {
                    linea.append("," + or.sentir);
                }
                if (colectCazar == true) {
                    linea.append("," + or.cazar);
                }
                if (colectEscapar == true) {
                    linea.append("," + or.escapar);
                }
                if (colectarResistencia == true) {
                    linea.append("," + or.resistenciaATB);
                }
                linea.append("\n");

                f_mutantes.escribirArchivo(linea.toString());
            }
            //f_fenoma.escribirArchivo();
        }
    }

    //colecta datos para graficar 
    public void guardarDatos() {

        linea.replace(0, linea.length(),
                "" + minutos2 + ":" + segundos + "," + aorg.size + "," + aEspesies.size + "," + cantidadPredadores()
                        + "," + cantidadResistentes() + "," + velocidadMedia() + "," + tamanoMedio() + ","
                        + longevidadMedio() + "," + tasaMutMedio() + "," + temperatura + "," + temOptimaMedia()
                        + "\n");
        f_datos.escribirArchivo(linea.toString());
    }

    public void tomarMuestras() {

        if (segundos2 >= tiempoMuestreo) {

            colectorEspesies();// colecta las especies o mutante de ese momento   

            guardarDatos();
            archivarGenoma();
            archivarProteoma();
            archivarFenotipo();

            segundos2 = 0;
        }
    }

    public void activarCatastrofe() {

        if (segundos3 >= tiempoCatastrofe && tiempoCatastrofe != 0) {

            catastrofe();

            segundos3 = 0;
        }

    }

    public void activarATB() {

        if (segundos5 == tiempoATB && antibiotico == -1 && tiempoATB != 0) {

            antibiotico = 1;

        }

    }

    public void archivaTodaslasEspecies() {

        StringBuffer linea = new StringBuffer();

        for (Organismo or : aEspesiesTotales) {
            linea.replace(0, linea.length(), "");
            linea.append(">" + or.fechaNacimiento + " " + or.nombre.toString() + "\n" + or.adn.colectarGenoma(this)
                    + "\n");
            f_arbol.escribirArchivo(linea.toString());
        }

        f_arbol.cerrarArchivo();
    }

    // metodo que actualiza el sitema

    public void update() {

        if (tiempoMaximo == 0) {
            if (aorg.size > 0) {

                for (Senergia es : ase) {
                    es.update();
                } //mueve los cuantos de luz
                for (Qenergia eq : aqe) {
                    eq.update();
                } //mueve los cuantos de luz
                for (Organismo or : aorg) {
                    or.update();
                } //mueve los organismos   

                detectarColiciones();
                chequerBalance();
                activarCatastrofe();
                activarATB();
                colectorEspesiesTotales();
                tomarMuestras();
                termociclar();
                contadorTiempo();

            }
        }

        if (tiempoMaximo > 0) {
            if (aorg.size > 0 && segundos4 < tiempoMaximo) {

                for (Senergia es : ase) {
                    es.update();
                } //mueve los cuantos de luz
                for (Qenergia eq : aqe) {
                    eq.update();
                } //mueve los cuantos de luz
                for (Organismo or : aorg) {
                    or.update();
                } //mueve los organismos   

                detectarColiciones();
                chequerBalance();
                activarCatastrofe();
                activarATB();
                colectorEspesiesTotales();
                tomarMuestras();
                termociclar();
                contadorTiempo();

            }
        }
    }

    //method that controls the temperature

    public float termociclar() {

        //primer control de temperatura

        if (deltaTime1 <= 0 && minStar1 != 0 && minutos2 >= minStar1) {
            temperatura = TempFinal1;
        }

        if (deltaTime1 > 0 && minStar1 != 0 && minutos2 >= minStar1 && minutos2 < minStar1 + deltaTime1) {

            if (delta3Time() > msecondTime(1000)) {

                temperatura = temperatura + tempXSecond1;

                setDelta3();

            }
        }

        //segundo control de temperatura

        if (deltaTime2 <= 0 && minStar2 != 0 && minutos2 >= minStar2) {
            temperatura = TempFinal2;
        }

        if (deltaTime2 > 0 && minStar2 != 0 && minutos2 >= minStar2 && minutos2 < minStar2 + deltaTime2) {

            if (delta3Time() > msecondTime(1000)) {

                temperatura = temperatura + tempXSecond2;

                setDelta3();

            }
        }

        return temperatura;

    }

    // metodos que manejan el tiempo de corrida

    public void contadorTiempo() {

        if (deltaTime() > msecondTime(1000)) {

            segundos = segundos + 1;
            segundos2 = segundos2 + 1;
            segundos3 = segundos3 + 1;
            segundos4 = segundos4 + 1;
            segundos5 = segundos5 + 1;

            if (segundos == 60) {
                segundos = 0;
                minutos = minutos + 1;
                minutos2 = minutos2 + 1;
                minutos3 = minutos3 + 1;
            }

            if (minutos == 60) {
                minutos = 0;
                horas = horas + 1;
            }

            if (horas == 24) {
                horas = 0;
                dias = dias + 1;
            }

            setDelta();
        }
    }

    //mide el tiempo transcurrido desde el unltimo set

    public long deltaTime() {
        return TimeUtils.nanoTime() - delta;
    }

    public long delta2Time() {
        return TimeUtils.nanoTime() - delta2;
    }

    public long delta3Time() {
        return TimeUtils.nanoTime() - delta3;
    }

    public long tiemoTime() {
        return TimeUtils.nanoTime() - tiempo;
    }

    //anota el tiempo de juego transcurrido en el momento que se invoca un evento      

    public void setDelta() {
        delta = TimeUtils.nanoTime();
    }

    public void setDelta2() {
        delta2 = TimeUtils.nanoTime();
    }

    public void setDelta3() {
        delta3 = TimeUtils.nanoTime();
    }

    public void setTiempo() {
        tiempo = TimeUtils.nanoTime();
    }

    // convierte de ms a nanosegundos para mas comodidad   
    public long msecondTime(long ms) {

        return ms * 1000000;
    }

    public void detectarColiciones() {

        //organismo toca la energia verde

        for (int i = 0; i < aorg.size; i++) {
            Organismo or = aorg.get(i);
            Rectangle er = or.borde;
            if (or.carnivoro == false) {
                for (int a = 0; a < ase.size; a++) {
                    Senergia se = ase.get(a);
                    Rectangle tr = se.borde;
                    if (se.visible == true) {
                        if (er.overlaps(tr)) {

                            or.energia = or.energia + se.energia;
                            //se.setEnergia(0);
                            se.energia = se.energia - (or.capacidad - or.energia);
                            if (se.energia <= 0) {
                                se.visible = false;
                            }

                            if (or.energia > or.capacidad) {
                                or.energia = or.capacidad;
                            }
                            ;
                            //               
                            //               
                            //               
                            //               

                        }
                    }
                }
            }
        }
        //organismo toca la biomasa

        for (int i = 0; i < aorg.size; i++) {
            Organismo or = aorg.get(i);
            Rectangle er = or.borde;

            if (or.carnivoro == false) {
                for (int a = 0; a < aqe.size; a++) {
                    Qenergia qe = aqe.get(a);
                    Rectangle tr = qe.borde;

                    if (qe.visible == true) {

                        if (er.overlaps(tr)) {

                            if (or.biomasa < or.capacidad) {

                                or.biomasa = or.biomasa + qe.masa;

                                qe.posicion = new Vector2(-100, -100);
                                qe.visible = false;
                                //   qe.setMasa(0);

                            }

                        }
                    }
                }
            }
        }

        quad.clear();
        for (int i = 0; i < aorg.size; i++) {
            quad.insert(aorg.get(i));
        }

        Array<Organismo> returnObjects = new Array<Organismo>();
        for (int i = 0; i < quad.objects.size; i++) {
            returnObjects.clear();
            quad.retrieve(returnObjects, quad.objects.get(i));

            //Organismo toca organismo

            for (int x = 0; x < returnObjects.size; x++) {

                Organismo or = returnObjects.get(i);
                Rectangle er = or.borde;

                for (int a = 0; a < returnObjects.size; a++) {
                    Organismo or2 = returnObjects.get(a);
                    Rectangle er2 = or2.borde;

                    if (er.overlaps(er2)) {
                        if (a != i) {
                            horizontalTransfer(or, or2);//horizontal transfer of genes

                            //   System.out.println("Colision");
                        }

                        if (or.carnivoro == true) {

                            if (!or.identificador.equals(or2.identificador) && or.capacidad >= or2.capacidad) {

                                EnRe = (int) (or.capacidad - or.energia);
                                BioRe = (int) (or.capacidad - or.biomasa);

                                if (EnRe >= or2.energia && EnRe > 0) {
                                    or.energia = or.energia + or2.energia;
                                    or2.energia = 0;
                                }
                                if (EnRe < or2.energia && EnRe > 0) {
                                    or.energia = or.energia + EnRe;
                                    or2.energia = or2.energia - EnRe;
                                }

                                if (BioRe >= or2.biomasa && BioRe > 0) {
                                    or.biomasa = or.biomasa + or2.biomasa;
                                    or2.biomasa = 0;
                                }
                                if (BioRe < or2.biomasa && BioRe > 0) {
                                    or.biomasa = or.biomasa + BioRe;
                                    or2.biomasa = or2.biomasa - BioRe;
                                }

                                if (or2.energia <= 0) {
                                    or2.morir();
                                }

                            }
                        }

                    }
                }
            }
        }
    }

    //Horizontal transfer

    public void horizontalTransfer(Organismo or1, Organismo or2) {

        if (horizontalTransferRate > 0) {
            int random = (int) (Math.random() * horizontalTransferRate);//
            //int pos = (int) (Math.random()*100);
            int gentipe = (int) (Math.random() * 12);

            if (random == 0) {

                switch (gentipe) {
                case 0:
                    or1.adn.alto.insert(0, or2.adn.alto);
                    // if (pos>=50){or1.adn.alto.append(or2.adn.alto);}    
                    break;
                case 1:
                    or1.adn.ancho.insert(0, or2.adn.ancho);
                    // if (pos>=50){or1.adn.ancho.append(or2.adn.ancho);}    
                    break;

                case 2:
                    or1.adn.color.insert(0, or2.adn.color);
                    //if (pos>=50){or1.adn.color.append(or2.adn.color);}    
                    break;

                case 3:
                    or1.adn.speed.insert(0, or2.adn.speed);
                    // if (pos>=50){or1.adn.speed.append(or2.adn.speed);}    
                    break;

                case 4:
                    or1.adn.predador.insert(0, or2.adn.predador);
                    //if (pos>=50){or1.adn.predador.append(or2.adn.predador);}    
                    break;

                case 5:
                    or1.adn.sentir.insert(0, or2.adn.sentir);
                    // if (pos>=50){or1.adn.sentir.append(or2.adn.sentir);}    
                    break;

                case 6:
                    or1.adn.cazar.insert(0, or2.adn.cazar);
                    //if (pos>=50){or1.adn.cazar.append(or2.adn.cazar);}    
                    break;

                case 7:
                    or1.adn.escapar.insert(0, or2.adn.escapar);
                    //if (pos>=50){or1.adn.escapar.append(or2.adn.escapar);}    
                    break;

                case 8:
                    or1.adn.radioConsiente.insert(0, or2.adn.radioConsiente);
                    // if (pos>=50){or1.adn.radioConsiente.append(or2.adn.radioConsiente);}    
                    break;

                case 9:
                    or1.adn.tasaMutacion.insert(0, or2.adn.tasaMutacion);
                    // if (pos>=50){or1.adn.tasaMutacion.append(or2.adn.tasaMutacion);}    
                    break;

                case 10:
                    or1.adn.longevidad.insert(0, or2.adn.longevidad);
                    // if (pos>=50){or1.adn.longevidad.append(or2.adn.longevidad);}    
                    break;

                case 11:
                    or1.adn.toleranciaTemp.insert(0, or2.adn.toleranciaTemp);
                    // if (pos>=50){or1.adn.toleranciaTemp.append(or2.adn.toleranciaTemp);}    
                    break;

                case 12:
                    or1.adn.resistenciaATB.insert(0, or2.adn.resistenciaATB);
                    // if (pos>=50){or1.adn.resistenciaATB.append(or2.adn.resistenciaATB);}    
                    break;

                }
                //System.out.println("Se tranfirio un gen");
                or1.transferred = true;
                or1.translate();

            }
        }
    }

    public void dispose() {

        textuRA_ENER.dispose();
        textura_ORG.dispose();
        auraATB.dispose();
    }

}