Beispiel #1
0
  @Override
  public boolean ramassePotion(int refRMI, int refPotion) throws RemoteException {
    boolean res = false;

    VuePersonnage vuePersonnage = personnages.get(refRMI);
    VuePotion vuePotion = potions.get(refPotion);

    if (vuePersonnage.isActionExecutee()) {
      // si une action a deja ete executee
      logActionDejaExecutee(refRMI);

    } else {
      // sinon, on tente de jouer l'interaction
      int distance =
          Calculs.distanceChebyshev(vuePersonnage.getPosition(), vuePotion.getPosition());

      // on teste la distance entre le personnage et la potion
      if (distance <= Constantes.DISTANCE_MIN_INTERACTION) {
        new Ramassage(this, vuePersonnage, vuePotion).interagit();
        personnages.get(refRMI).executeAction();

        res = true;
      } else {
        logger.warning(
            Constantes.nomClasse(this),
            nomRaccourciClient(refRMI)
                + " a tente d'interagir avec "
                + vuePotion.getElement().getNom()
                + ", alors qu'il est trop eloigne !\nDistance = "
                + distance);
      }
    }

    return res;
  }
Beispiel #2
0
  @Override
  public HashMap<Integer, Point> getVoisins(int refRMI) throws RemoteException {
    HashMap<Integer, Point> res = new HashMap<Integer, Point>();

    VuePersonnage courant = personnages.get(refRMI);
    VuePersonnage tempPers;

    // personnages
    for (int refVoisin : personnages.keySet()) {
      tempPers = personnages.get(refVoisin);

      if (estVoisin(courant, tempPers)) {
        res.put(refVoisin, tempPers.getPosition());
      }
    }

    VuePotion tempPot;

    // potions
    for (int refVoisin : potions.keySet()) {
      tempPot = potions.get(refVoisin);

      if (estVoisin(courant, tempPot)) {
        res.put(refVoisin, tempPot.getPosition());
      }
    }

    return res;
  }
Beispiel #3
0
  /**
   * Ajoute l'increment donne a la caracteristique donne de l'element correspondant a la vue donnee.
   * L'increment peut etre positif ou negatif.
   *
   * @param vuePersonnage client a mettre a jour
   * @param carac caracteristique a mettre a jour
   * @param increment increment a ajouter a la valeur de la caracteristique courante
   * @throws RemoteException
   */
  public void incrementeCaractElement(
      VuePersonnage vuePersonnage, Caracteristique carac, int increment) throws RemoteException {

    int refRMI = vuePersonnage.getRefRMI();
    IConsole console = consoleFromRef(refRMI);
    Personnage pers = vuePersonnage.getElement();

    if (carac == Caracteristique.VIE && increment < 0) {
      increment = (increment * (100 - pers.getCaract(Caracteristique.ARMURE))) / 100;
    }

    // increment de la caracteristique
    pers.incrementeCaract(carac, increment);

    if (pers.estVivant()) {
      if (increment < 0) {
        console.log(
            Level.INFO,
            Constantes.nomClasse(this),
            "J'ai perdu " + -increment + " points de " + carac);

        if (carac == Caracteristique.VIE) {
          setPhrase(refRMI, "Ouch, j'ai perdu " + increment + " points de vie.");
        }

      } else {
        console.log(
            Level.INFO,
            Constantes.nomClasse(this),
            "J'ai gagne " + increment + " points de " + carac);
      }
    }
  }
Beispiel #4
0
  @Override
  public boolean Fuite(int refRMI, int refRMIaFuir) throws RemoteException {
    boolean res = false;

    VuePersonnage client = personnages.get(refRMI);

    if (client.isActionExecutee()) {
      // si une action a deja ete executee
      logActionDejaExecutee(refRMI);
    } else {
      Point pMoi = this.getPosition(refRMI);
      Point pAFuir = this.getPosition(refRMIaFuir);
      Point objectif = pMoi;
      if (pMoi.getX() - pAFuir.getX() > 0) objectif.x++;
      else objectif.x--;
      if (pMoi.getY() - pAFuir.getY() > 0) objectif.y++;
      else objectif.y--;
      // sinon, on tente de jouer l'interaction
      new Deplacement(client, getVoisins(refRMI)).seDirigeVers(objectif);
      client.executeAction();

      res = true;
    }

    return res;
  }
Beispiel #5
0
  /** Affiche le classement de la partie dans le logger. */
  private void logClassement() {
    List<VuePersonnage> classement = getPersonnagesClassement();

    String msg = "";
    int i = 1;

    for (VuePersonnage vue : classement) {
      msg += "\n" + i + " : " + vue.getElement().getNomGroupe() + " " + vue.getPhrase();
      i++;
    }

    logger.info(Constantes.nomClasse(this), "Classement :" + msg);
  }
Beispiel #6
0
  /**
   * Verifie que les deux elements sont voisins, l'element courant etant un personnage. Pour etre un
   * voisin : ils doivent etre differents, ils doivent etre a une distance inferieure ou egale a la
   * vision, il doivent etre actifs.
   *
   * @param courant personnage courant
   * @param voisin element voisin
   * @return vrai si l'element donne est bien un voisin
   */
  private boolean estVoisin(VuePersonnage courant, VueElement<?> voisin) throws RemoteException {
    boolean res =
        courant.getElement().estVivant()
            && Calculs.distanceChebyshev(voisin.getPosition(), courant.getPosition())
                <= Constantes.VISION;

    if (voisin instanceof VuePersonnage) { // potion
      res =
          res
              && ((VuePersonnage) voisin).getElement().estVivant()
              && voisin.getRefRMI() != courant.getRefRMI();
    }

    return res;
  }
Beispiel #7
0
  @Override
  public boolean deplaceRapidement(int refRMI, Point objectif) throws RemoteException {
    boolean res = false;

    VuePersonnage client = personnages.get(refRMI);

    if (client.isActionExecutee()) {
      // si une action a deja ete executee
      logActionDejaExecutee(refRMI);
    } else {
      // sinon, on tente de jouer l'interaction
      new DeplacementRapide(client, getVoisins(refRMI)).seDirigeVers(objectif);
      client.executeAction();

      res = true;
    }

    return res;
  }
Beispiel #8
0
  @Override
  public boolean invoquer(int refRMI, int nbSbires) throws RemoteException {
    // TODO Auto-generated method stub
    boolean res = false;

    VuePersonnage invoqueur = personnages.get(refRMI);

    if (invoqueur.isActionExecutee()) {
      // si une action a deja ete executee
      logActionDejaExecutee(refRMI);
    } else {
      // sinon, on tente de jouer l'interaction
      new Invocation(this, invoqueur, nbSbires).invoquerSbires();
      invoqueur.executeAction();

      res = true;
    }

    return res;
  }
Beispiel #9
0
  /**
   * Renvoie la liste des references triees par ordre de passage en fonction de l'initiative.
   *
   * @return liste de toutes les references des personnages de la partie, ordonnee par initiative
   *     (decroissante)
   */
  private List<Integer> getSortedRefs() {
    // on cree une priority queue de paires reference RMI/initiative du
    // personnage
    // en ajoutant des paires dans la queue, elles automatiquement seront
    // classees en suivant leur methode compareTo
    Queue<PaireRefRMIIntitiative> queueRefsInitiative = new PriorityQueue<PaireRefRMIIntitiative>();

    for (VuePersonnage client : personnages.values()) {
      queueRefsInitiative.offer(
          new PaireRefRMIIntitiative(
              client.getRefRMI(), client.getElement().getCaract(Caracteristique.INITIATIVE)));
    }

    // on recupere juste les references
    List<Integer> listeRefsTriees = new ArrayList<Integer>();

    while (!queueRefsInitiative.isEmpty()) {
      listeRefsTriees.add(queueRefsInitiative.poll().getRef());
    }

    return listeRefsTriees;
  }
Beispiel #10
0
  @Override
  public void deconnecte(int refRMI, String cause, String phrase) throws RemoteException {
    // enregistrement des infos de la console lors de sa deconnexion,
    // le but etant de garder des informations sur les deconnectes
    VuePersonnage vuePersonnage = personnages.get(refRMI);

    vuePersonnage.getElement().tue(); // au cas ou ce ne serait pas une mort "naturelle"
    vuePersonnage.setTourMort(tour);
    setPhrase(refRMI, "MORT >_< (" + phrase + ")");

    // ajout a la liste des morts
    personnagesMorts.add(vuePersonnage);

    try {
      // fermeture de la console en donnant la raison
      consoleFromRef(refRMI).deconnecte(cause);

    } catch (UnmarshalException e) {
      e.printStackTrace();
    }

    // suppression de la liste des vivants
    ejectePersonnage(refRMI);
  }