Exemple #1
0
  /**
   * Calculates if there is an enemy at sight.
   *
   * <p>This method scans the list <tt> m_FOVObjects</tt> (objects in the Field Of View of the
   * agent) looking for an enemy. If an enemy agent is found, a value of <tt> TRUE</tt> is returned
   * and variable <tt> m_AimedAgent</tt> is updated. Note that there is no criterion (proximity,
   * etc.) for the enemy found. Otherwise, the return value is <tt> FALSE</tt>.
   *
   * <p><em> It's very useful to overload this method. </em>
   *
   * @return <tt> TRUE</tt>: enemy found / <tt> FALSE</tt> enemy not found
   */
  protected boolean GetAgentToAim() {

    if (m_FOVObjects.isEmpty()) {
      m_AimedAgent = null;
      return false;
    }

    Iterator it = m_FOVObjects.iterator();
    while (it.hasNext()) {
      CSight s = (CSight) it.next();
      if (s.getType() >= CPack.PACK_NONE) {
        continue;
      }

      int eTeam = s.getTeam();

      if (m_eTeam == eTeam) continue;

      m_AimedAgent = s;
      return true;
    }
    m_AimedAgent = null;
    return false;
  }
  /**
   * Este metodo inserta en una lista los enemigos a la vista y asigna a m_AimedAgent aquel q está
   * tiene menos vida, en el caso que tenga amigos a la vista, calcula la diferencia entre el ángulo
   * del m_AimedAgent y el amigo si es <=1, no dispara
   *
   * @return En el caso que hayan enemigos a la vista devuelve true y sino false.
   */
  protected boolean GetAgentToAim_EnemigoMenosVida() {
    m_AimedAgent = null;

    // si no tengo ningún agente en el campo de visión devuelvo false
    if (m_FOVObjects.isEmpty()) {
      return false;
    }

    ArrayList<CSight> enemigos = new ArrayList<CSight>();
    ArrayList<CSight> amigos = new ArrayList<CSight>();
    boolean bfuegoAmigo = false;
    @SuppressWarnings("unchecked")
    Iterator<?> it = m_FOVObjects.iterator();
    int iMenorVida = Integer.MAX_VALUE;
    int iVida = 0;
    CSight enemigoMenorVida = null;
    double distanciaAmigo = 0f;
    double distanciaEnemigo = 0f;
    while (it.hasNext()) {
      CSight s = (CSight) it.next();
      if (s.getType() >= CPack.PACK_NONE) {
        continue;
      }

      int eTeam = s.getTeam();

      if (m_eTeam != eTeam) // si se trata de un enemigo, se añade a la lista de enemigos.
      {
        enemigos.add(s);
      } else // si es amigo
      {
        amigos.add(s);
      }
    }

    if (!enemigos.isEmpty()) {
      for (int i = 0; i <= enemigos.size() - 1; i++) {
        iVida = enemigos.get(i).getHealth();

        if (iVida < iMenorVida) {
          enemigoMenorVida = enemigos.get(i);
          iMenorVida = iVida;
        }
      }

      if (!amigos.isEmpty()) {
        for (int j = 0; j <= amigos.size() - 1; j++) {
          if (Math.abs(amigos.get(j).getAngle() - enemigoMenorVida.getAngle())
              <= 1) // si estan en el mismo ángulo de tiro o con un grado de diferencia
          // No se dispara por peligro de fuego amigo
          {
            distanciaAmigo = this.distanciaManhattan(this.m_Movement.getPosition(), amigos.get(j));
            distanciaEnemigo =
                this.distanciaManhattan(this.m_Movement.getPosition(), enemigoMenorVida);
            if (distanciaAmigo <= distanciaEnemigo) {
              bfuegoAmigo = true;
            }
          }
        }
        if (!bfuegoAmigo) // si no hay ningún amigo en mismo o +1 ángulo se dispara
        {
          m_AimedAgent = enemigoMenorVida;
        }

      } else // si no tengo amigos en el campo de visión se dispara.
      {
        m_AimedAgent = enemigoMenorVida;
      }
    }
    if (m_AimedAgent != null) {
      return true;
    } else {
      return false;
    }
  }
  /**
   * Este metodo inserta en una lista los enemigos a la vista y asigna a m_AimedAgent aquel q está
   * más cercano,en el caso que tenga amigos a la vista, calcula la diferencia entre el ángulo del
   * m_AimedAgent y el amigo si es <=1, no dispara En el caso que hayan enemigos a la vista devuelve
   * true y sino false.
   *
   * @return
   */
  protected boolean GetAgentToAim_EnemigoMasCercano() {
    m_AimedAgent = null;
    boolean bfuegoAmigo = false;

    // si no tengo ningún agente en el campo de visión devuelvo false
    if (m_FOVObjects.isEmpty()) {
      return false;
    }

    ArrayList<CSight> enemigos = new ArrayList<CSight>();
    ArrayList<CSight> amigos = new ArrayList<CSight>();
    @SuppressWarnings("unchecked")
    Iterator<?> it = m_FOVObjects.iterator();
    double distanciaMenor = Double.MAX_VALUE;
    double distancia = 0f;
    CSight enemigoMascercano = null;
    while (it.hasNext()) {
      CSight s = (CSight) it.next();
      if (s.getType() >= CPack.PACK_NONE) {
        continue;
      }

      int eTeam = s.getTeam();

      if (m_eTeam != eTeam) // si se trata de un enemigo, se añade a la lista de enemigos.
      {
        enemigos.add(s);
      } else // si es amigo
      {
        amigos.add(s);
      }
    }

    if (!enemigos.isEmpty()) {
      for (int i = 0; i <= enemigos.size() - 1; i++) {
        distancia = this.distanciaManhattan(this.m_Movement.getPosition(), enemigos.get(i));

        if (distancia < distanciaMenor) {
          enemigoMascercano = enemigos.get(i);
          distanciaMenor = distancia;
        }
      }

      if (!amigos.isEmpty()) {
        for (int j = 0; j <= amigos.size() - 1; j++) {
          if (Math.abs(amigos.get(j).getAngle() - enemigoMascercano.getAngle())
              <= 1) // si estan en el mismo ángulo de tiro o con un grado de diferencia
          {
            if (this.distanciaManhattan(this.m_Movement.getPosition(), amigos.get(j))
                <= distanciaMenor) // y ademas está a una distancia menor que el agente enmigo
              // No se dispara por peligro de fuego amigo
              bfuegoAmigo = true;
          }
        }
        if (!bfuegoAmigo) // si no hay ningún amigo en mismo o +1 ángulo y más cerca que el enemigo
                          // se dispara
        {
          m_AimedAgent = enemigoMascercano;
        }

      } else // si no tengo amigos en el campo de visión se dispara.
      {
        m_AimedAgent = enemigoMascercano;
      }
    }
    if (m_AimedAgent != null) {
      return true;
    } else {
      return false;
    }
  }