public void accionSubirNivel(String usuario, String tipoUnidad) {
    String campo;
    if (tipoUnidad.equalsIgnoreCase("tecnologia")) campo = "nivel";
    else if (tipoUnidad.equalsIgnoreCase("arma")) campo = "arma";
    else campo = "armadura";

    try {
      Connection conn = Conectar.conectar();

      Statement st = conn.createStatement();

      st.executeQuery(
          "UPDATE usuarios SET "
              + campo
              + "=(SELECT "
              + campo
              + "+1 FROM usuarios WHERE nick='"
              + usuario
              + "') WHERE nick='"
              + usuario
              + "'");

      st.executeQuery("DELETE FROM investigaciones WHERE idInvestigacion = " + idConstruccion);

      st.executeQuery("commit");

      st.close();
      conn.close();

    } catch (SQLException ex) {
      System.out.println(
          ex.getMessage() + ex.getErrorCode() + " :: Fallo subir nivel investigacion");
    }
  }
  public void accionInsertarEdificio(int idReg, int idUni) { // aqui se ejecuta el estamento
    try { // de insertar edificios
      Connection conn = Conectar.conectar();

      Statement st = conn.createStatement(); // añade 1
      System.out.println(idReg + "    " + idUni);
      st.executeQuery(
          "INSERT INTO edificiosregion VALUES (" + idReg + ", " + idUni + ", " + 1 + ")");

      if (cuentaatras == 0
          && cantidad > 0) // y decrementa las tareas pendientes en la base de datos
      st.executeQuery(
            "UPDATE construcciones SET cantidad = (SELECT cantidad-1 FROM construcciones WHERE idConstruccion = "
                + idConstruccion
                + ") WHERE idConstruccion = "
                + idConstruccion);

      if (cuentaatras == 0 && cantidad == 0) {
        System.out.println(idConstruccion);
        st.executeQuery("DELETE FROM construcciones WHERE idConstruccion = " + idConstruccion);
      }

      st.executeQuery("commit");

      st.close();
      conn.close();

    } catch (SQLException ex) {
      System.out.println(
          ex.getMessage() + ex.getErrorCode() + " :: Fallo de conexion del temporizador");

      if (ex.getErrorCode() == 00001) {
        Connection conn;
        try {
          conn = Conectar.conectar();
          // Si no se ha podido ejecutar la insercion porque la clave ya existe, se actualiza la
          // tabla
          Statement st = conn.createStatement();
          st.executeQuery(
              "UPDATE edificiosregion SET cantidad = (SELECT cantidad+1 FROM edificiosregion WHERE idRegion = "
                  + idReg
                  + "AND idEdificio = "
                  + idUni
                  + ") WHERE idRegion = "
                  + idReg
                  + " AND idEdificio = "
                  + idUni);

          if (cuentaatras == 0
              && cantidad > 0) // y decrementa las tareas pendientes en la base de datos
          st.executeQuery(
                "UPDATE construcciones SET cantidad = (SELECT cantidad-1 FROM construcciones WHERE idConstruccion = "
                    + idConstruccion
                    + ") WHERE idConstruccion = "
                    + idConstruccion);

          if (cuentaatras == 0 && cantidad == 0) {
            System.out.println(idConstruccion);
            st.executeQuery("DELETE FROM construcciones WHERE idConstruccion = " + idConstruccion);
          }

          st.executeQuery("commit");

          st.close();
          conn.close();

        } catch (SQLException ex1) {
          System.out.println(ex1.getMessage() + " :: Fallo en catch de insertar");
        }
      }
    }
  }
  public void accionEjecutarMovimiento() {
    try {
      Connection conn = Conectar.conectar();

      Statement st = conn.createStatement();

      ResultSet rs =
          st.executeQuery("SELECT propietario FROM regiones WHERE idRegion = " + idRegionDestino);
      String propietario = "nulo";
      if (rs.next()) {
        propietario = rs.getString(1);
      }

      // Si el territorio esta
      // vacio****************************************************************************
      if (propietario.equalsIgnoreCase("Deshabitado")) {
        String nombre = generaNombre();

        st.executeQuery(
            "UPDATE regiones SET nombreRegion = '"
                + nombre
                + "', propietario = '"
                + usuario
                + "' WHERE idRegion = "
                + idRegionDestino);
        st.executeQuery(
            "INSERT INTO edificiosregion VALUES ("
                + idRegionDestino
                + ", "
                + 1400
                + ", "
                + 1
                + ")");
        for (int i = 0; i < pelotones.size(); i = i + 2) {
          st.executeQuery(
              "INSERT INTO despliegues VALUES ("
                  + idRegionDestino
                  + ", "
                  + pelotones.get(i)
                  + ", "
                  + pelotones.get(i + 1)
                  + ")");
        }
        st.executeQuery("DELETE movimientos WHERE idTropa = " + idTropa);
        st.executeQuery("commit");

        System.out.println("Query ejecutado.");
      }

      // Si el territorio te pertenece
      // *******************************************************************************
      else if (propietario.equalsIgnoreCase(usuario)) {
        ResultSet rs2 =
            st.executeQuery("select * from despliegues where idRegion = " + idRegionDestino);
        ArrayList<Despliegue> despliegues = new ArrayList<Despliegue>();
        while (rs2.next()) {
          despliegues.add(new Despliegue(rs2.getInt(1), rs2.getInt(2), rs2.getInt(3)));
        }
        Boolean encontrado = false;

        for (int i = 0; i < pelotones.size(); i = i + 2) {
          encontrado = false;

          for (Despliegue despliegue : despliegues) {
            if (pelotones.get(i).equals(despliegue.getIdUnidad())) {
              st.executeQuery(
                  "update despliegues set cantidad = "
                      + (despliegue.getCantidad() + pelotones.get(i + 1))
                      + " where idRegion = "
                      + idRegionDestino
                      + " and idUnidad = "
                      + despliegue.getIdUnidad());
              encontrado = true;
            }
          }
          if (!encontrado) {
            st.executeQuery(
                "INSERT INTO despliegues VALUES ("
                    + idRegionDestino
                    + ", "
                    + pelotones.get(i)
                    + ", "
                    + pelotones.get(i + 1)
                    + ")");
          }
        }
        st.executeQuery("DELETE movimientos WHERE idTropa = " + idTropa);
        st.executeQuery("commit");

        System.out.println("Query ejecutado.");
        rs2.close();
      }

      // Si es un territorio enemigo ( COMBATE )
      // *****************************************************************************
      else {
        int ataque = 0;
        int defensa = 0;
        int defenemiga = 0;
        int ataenemigo = 0;

        SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy HH:mm");
        java.util.Date fecha = new java.util.Date();
        String fechahora = formato.format(fecha);

        // Recolectamos el ataque y la defensa del enemigo
        ResultSet rs3 =
            st.executeQuery("select * from despliegues where idRegion = " + idRegionDestino);
        ArrayList<Despliegue> despliegues = new ArrayList<Despliegue>();
        while (rs3.next()) {
          despliegues.add(new Despliegue(rs3.getInt(1), rs3.getInt(2), rs3.getInt(3)));
        }

        for (Despliegue despliegue : despliegues) {
          if (despliegue.getIdUnidad() == 4100) {
            ataenemigo = ataenemigo + (15 * despliegue.getCantidad());
            defenemiga = defenemiga + (30 * despliegue.getCantidad());
          } else if (despliegue.getIdUnidad() == 4101) {
            ataenemigo = ataenemigo + (25 * despliegue.getCantidad());
            defenemiga = defenemiga + (50 * despliegue.getCantidad());
          } else if (despliegue.getIdUnidad() == 4102) {
            ataenemigo = ataenemigo + (55 * despliegue.getCantidad());
            defenemiga = defenemiga + (20 * despliegue.getCantidad());
          } else if (despliegue.getIdUnidad() == 4103) {
            ataenemigo = ataenemigo + 800;
            ataenemigo = ataenemigo * ((ataenemigo * 10) / 100);
            defenemiga = defenemiga + 600;
          } else if (despliegue.getIdUnidad() == 4104) {
            ataenemigo = ataenemigo + (400 * despliegue.getCantidad());
            defenemiga = defenemiga + (100 * despliegue.getCantidad());
          } else if (despliegue.getIdUnidad() == 4102) {
            ataenemigo = ataenemigo + (50 * despliegue.getCantidad());
            defenemiga = defenemiga + (800 * despliegue.getCantidad());
          }
        }

        // Recolectamos informacion de edificios defensivos
        ResultSet rs4 =
            st.executeQuery("select * from edificiosregion where idRegion = " + idRegionDestino);
        ArrayList<EdificiosRegion> despliegues2 = new ArrayList<EdificiosRegion>();
        while (rs4.next()) {
          despliegues2.add(new EdificiosRegion(rs4.getInt(1), rs4.getInt(2), rs4.getInt(3)));
        }

        for (EdificiosRegion despliegue2 : despliegues2) {
          if (despliegue2.idEdificio == 1300) {
            ataenemigo = ataenemigo + (200 * despliegue2.cantidad);
            defenemiga = defenemiga + (1000 * despliegue2.cantidad);
          } else if (despliegue2.idEdificio == 1301) {
            ataenemigo = ataenemigo + (500 * despliegue2.cantidad);
            defenemiga = defenemiga + (500 * despliegue2.cantidad);
          }
        }

        // Recolectamos ataque y defensa nuestra***************************
        for (int i = 0; i < pelotones.size(); i = i + 2) {
          if (pelotones.get(i) == 4100) {
            ataque = ataque + (15 * pelotones.get(i + 1));
            defensa = defensa + (30 * pelotones.get(i + 1));
          } else if (pelotones.get(i) == 4101) {
            ataque = ataque + (25 * pelotones.get(i + 1));
            defensa = defensa + (50 * pelotones.get(i + 1));
          } else if (pelotones.get(i) == 4102) {
            ataque = ataque + (55 * pelotones.get(i + 1));
            defensa = defensa + (20 * pelotones.get(i + 1));
          } else if (pelotones.get(i) == 4103) {
            ataque = ataque + 800;
            ataque = ataque * ((ataenemigo * 10) / 100);
            defensa = defensa + 600;
          } else if (pelotones.get(i) == 4104) {
            ataque = ataque + (400 * pelotones.get(i + 1));
            defensa = defensa + (100 * pelotones.get(i + 1));
          } else if (pelotones.get(i) == 4100) {
            ataque = ataque + (50 * pelotones.get(i + 1));
            defensa = defensa + (800 * pelotones.get(i + 1));
          }
        }

        int ataque1 = defenemiga - ataque;
        int ataque2 = defensa - ataenemigo;
        // Capturamos el nick del enemigo***************
        String enemigo = "Deshabitado";
        ResultSet rsenemigo =
            st.executeQuery("select propietario from regiones where idRegion = " + idRegionDestino);
        if (rsenemigo.next()) {
          enemigo = rsenemigo.getString(1);
        }

        // 1 ---  Si el enemigo tiene vida inferior a 0 y tu no
        if (ataque1 <= 0 && ataque2 > 0) {
          // Se conquista el territorio, se compra aldea y se recolocan las unidades sobrantes
          // dependiendo del ataque 2

          st.executeQuery(
              "UPDATE regiones SET propietario = '"
                  + usuario
                  + "' WHERE idRegion = "
                  + idRegionDestino);

          st.executeQuery(
              "DELETE edificiosregion WHERE idRegion = "
                  + idRegionDestino
                  + " AND idEdificio != "
                  + 1400);

          st.executeQuery("DELETE despliegues WHERE idRegion = " + idRegionDestino);

          st.executeQuery("DELETE construcciones WHERE idRegion = " + idRegionDestino);

          st.executeQuery("DELETE movimientos WHERE idTropa = " + idTropa);

          // Escribimos un mensaje al usuario con los resultados de la batalla
          st.executeQuery(
              "INSERT INTO mensajes VALUES (s_mensajes.NEXTVAL, 'System', '"
                  + usuario
                  + "', 'Informe de Batalla', '"
                  + "¡Enhorabuena!#Has ganado la batalla en el territorio ["
                  + idRegionDestino
                  + "].#Daño Recibido-> "
                  + ataenemigo
                  + ".#Daño causado-> "
                  + ataque
                  + ".', '"
                  + fechahora
                  + "')");

          // Escribimos un mensaje al enemigo con los resultados de la batalla
          st.executeQuery(
              "INSERT INTO mensajes VALUES (s_mensajes.NEXTVAL, 'System', '"
                  + enemigo
                  + "', 'Informe de Batalla', '"
                  + "Lo siento.#Has perdido la batalla en el territorio ["
                  + idRegionDestino
                  + "].#Daño Recibido-> "
                  + ataque
                  + ".#Daño causado-> "
                  + ataenemigo
                  + ".', '"
                  + fechahora
                  + "')");

          System.out.println(ataque2);
          // Algoritmo para ver el porcentaje de unidades que me quedan
          int porcperdido = (int) (ataque2 * 100) / defensa;

          for (int i = 0; i < pelotones.size(); i = i + 2) {
            pelotones.set(i + 1, (int) (pelotones.get(i + 1) * porcperdido) / 100);
          }
          for (int i = 0; i < pelotones.size(); i = i + 2) {
            st.executeQuery(
                "INSERT INTO despliegues VALUES ("
                    + idRegionDestino
                    + ", "
                    + pelotones.get(i)
                    + ", "
                    + pelotones.get(i + 1)
                    + ")");
          }
        }

        // 2 --- Los 2 tienen la vida a 0 o menos
        else if (ataque1 <= 0 && ataque2 <= 0) {
          // El enemigo se queda con el territorio pero pierde todos los edificios y se recolocan
          // unidades dependiendo de ataque1.

          st.executeQuery(
              "DELETE edificiosregion WHERE idRegion = "
                  + idRegionDestino
                  + " AND idEdificio != "
                  + 1400);

          st.executeQuery("DELETE movimientos WHERE idTropa = " + idTropa);

          st.executeQuery("DELETE despliegues WHERE idRegion = " + idRegionDestino);

          // Escribimos un mensaje al usuario con los resultados de la batalla
          st.executeQuery(
              "INSERT INTO mensajes VALUES (s_mensajes.NEXTVAL, 'System', '"
                  + usuario
                  + "', 'Informe de Batalla', '"
                  + "Lo siento.#Has perdido la batalla en el territorio ["
                  + idRegionDestino
                  + "].#Daño Recibido-> "
                  + ataenemigo
                  + ".#Daño causado-> "
                  + ataque
                  + ".', '"
                  + fechahora
                  + "')");

          // Escribimos un mensaje al enemigo con los resultados de la batalla
          st.executeQuery(
              "INSERT INTO mensajes VALUES (s_mensajes.NEXTVAL, 'System', '"
                  + enemigo
                  + "', 'Informe de Batalla', '"
                  + "¡Enhorabuena!#Has conseguido defender tu territorio ubicado en ["
                  + idRegionDestino
                  + "].#"
                  + "Aunque has perdido todas tus tropas y edificios.#Daño Recibido-> "
                  + ataque
                  + ".#Daño causado-> "
                  + ataenemigo
                  + ".', '"
                  + fechahora
                  + "')");
        }

        // 3 -- Tu pierdes la batalla
        else if (ataque1 > 0 && ataque2 <= 0) {
          // El enemigo recoloca unidades y tu lo pierdes todo
          st.executeQuery("DELETE movimientos WHERE idTropa = " + idTropa);

          int porcperdido = (int) (ataque1 * 100) / defenemiga;

          for (Despliegue despliegue : despliegues) {
            despliegue.setCantidad((int) (despliegue.getCantidad() * porcperdido) / 100);
          }
          for (Despliegue despliegue : despliegues) {
            st.executeQuery(
                "UPDATE despliegues SET cantidad = "
                    + despliegue.getCantidad()
                    + " WHERE idRegion = "
                    + idRegionDestino
                    + " AND idUnidad = "
                    + despliegue.getIdUnidad());
          }

          // Escribimos un mensaje al usuario con los resultados de la batalla
          st.executeQuery(
              "INSERT INTO mensajes VALUES (s_mensajes.NEXTVAL, 'System', '"
                  + usuario
                  + "', 'Informe de Batalla', '"
                  + "Lo siento.#Has perdido la batalla en el territorio ["
                  + idRegionDestino
                  + "].#Daño Recibido-> "
                  + ataenemigo
                  + ".#Daño causado-> "
                  + ataque
                  + ".', '"
                  + fechahora
                  + "')");

          // Escribimos un mensaje al enemigo con los resultados de la batalla
          st.executeQuery(
              "INSERT INTO mensajes VALUES (s_mensajes.NEXTVAL, 'System', '"
                  + enemigo
                  + "', 'Informe de Batalla', '"
                  + "¡Enhorabuena!#Has conseguido defender tu territorio ubicado en ["
                  + idRegionDestino
                  + "].#Daño Recibido-> "
                  + ataque
                  + ".#Daño causado-> "
                  + ataenemigo
                  + ".', '"
                  + fechahora
                  + "')");

        }
        // 4 --- Los 2 quedan con vida**************************************************************
        else if (ataque1 > 0 && ataque2 > 0) {
          // Se recolocan unidades en los 2.

          st.executeQuery("DELETE movimientos WHERE idTropa = " + idTropa);

          int porcperdido1 = (int) (ataque1 * 100) / defenemiga;

          for (Despliegue despliegue : despliegues) {
            despliegue.setCantidad((int) (despliegue.getCantidad() * porcperdido1) / 100);
          }
          for (Despliegue despliegue : despliegues) {
            st.executeQuery(
                "UPDATE despliegues SET cantidad = "
                    + despliegue.getCantidad()
                    + " WHERE idRegion = "
                    + idRegionDestino
                    + " AND idUnidad = "
                    + despliegue.getIdUnidad());
          }

          int porcperdido2 = (int) (ataque2 * 100) / defensa;

          for (int i = 0; i < pelotones.size(); i = i + 2) {
            pelotones.set(i + 1, (int) (pelotones.get(i + 1) * porcperdido2) / 100);
          }
          for (int i = 0; i < pelotones.size(); i = i + 2) {
            st.executeQuery(
                "UPDATE despliegues SET cantidad = (SELECT cantidad+"
                    + pelotones.get(i + 1)
                    + " FROM despliegues WHERE idRegion = "
                    + idRegion
                    + " AND idUnidad = "
                    + pelotones.get(i)
                    + ") WHERE idRegion = "
                    + idRegion
                    + " AND idUnidad = "
                    + pelotones.get(i));
          }

          // Escribimos un mensaje al usuario con los resultados de la batalla
          st.executeQuery(
              "INSERT INTO mensajes VALUES (s_mensajes.NEXTVAL, 'System', '"
                  + usuario
                  + "', 'Informe de Batalla', '"
                  + "Lo siento.#Has perdido la batalla en la region ["
                  + idRegionDestino
                  + "].#"
                  + "Aunque has recuperado algunas unidades.#Daño Recibido-> "
                  + ataenemigo
                  + ".#Daño causado-> "
                  + ataque
                  + ".', '"
                  + fechahora
                  + "')");

          // Escribimos un mensaje al enemigo con los resultados de la batalla
          st.executeQuery(
              "INSERT INTO mensajes VALUES (s_mensajes.NEXTVAL, 'System', '"
                  + enemigo
                  + "', 'Informe de Batalla', '"
                  + "¡Enhorabuena!#Has conseguido defender tu territorio ubicado en ["
                  + idRegionDestino
                  + "].#Daño Recibido-> "
                  + ataque
                  + ".#Daño causado-> "
                  + ataenemigo
                  + ".', '"
                  + fechahora
                  + "')");
        }

        st.executeQuery("commit");
        rs3.close();
        rs4.close();
        rsenemigo.close();
      }

      st.close();
      rs.close();
      conn.close();
    } catch (SQLException e) {
      System.out.println(e.getMessage() + " Fallo ejecutar movimiento.");
    }
  }