/** * Teste si un personnage doit etre connecte : il est mort, il triche, ou son temps sur l'arene * est ecoule. Si oui, le deconnecte. * * @param refRMI reference du personnage * @return vrai si le personnage a ete deconnecte, faux sinon * @throws RemoteException */ private boolean verifieDeconnexion(int refRMI) throws RemoteException { boolean res = true; Personnage personnage = (Personnage) elementFromRef(refRMI); if (!personnage.estVivant()) { // on teste si le client est vivant logger.info( Constantes.nomClasse(this), nomRaccourciClient(refRMI) + " est mort... Client ejecte"); deconnecte(refRMI, "Vous etes mort...", "mort naturelle"); } else if (!verifieCaracts(personnage)) { // on teste la triche logger.info( Constantes.nomClasse(this), nomRaccourciClient(refRMI) + " est un tricheur... Client ejecte"); deconnecte(refRMI, "Vous etes mort pour cause de triche...", "SHAME!"); } else if (!personnages.get(refRMI).resteTours()) { // on teste le nombre de tours logger.info( Constantes.nomClasse(this), "Fin du nombre de tours de " + nomRaccourciClient(refRMI) + "... Client ejecte"); deconnecte(refRMI, "Temps autorise dans l'arene ecoule, vous etes elimine !", "temps ecoule"); } else { res = false; } return res; }
/** * 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); } } }
/** * Verifie que les caracteristiques du personnage sont valides (pour eviter la triche). * * @param personnage personnage * @return vrai si les caracteristiques sont valides (entre min et max) */ private boolean verifieCaracts(Personnage personnage) { boolean res = true; HashMap<Caracteristique, Integer> caracts = personnage.getCaracts(); int valeurTemp; for (Caracteristique c : caracts.keySet()) { valeurTemp = caracts.get(c); if (valeurTemp < c.getMin() || valeurTemp > c.getMax()) { res = false; } } return res; }
public Orks(String nom, String groupe, HashMap<Caracteristique, Integer> caracts) { super(nom, groupe, caracts); super.setNom("Ork " + nom); }
public boolean Vampirise(int refRMI, int refRMIAdv) throws RemoteException { boolean res = false; VuePersonnage client = personnages.get(refRMI); VuePersonnage clientAdv = personnages.get(refRMIAdv); if (personnages.get(refRMI).isActionExecutee()) { // si une action a deja ete executee logActionDejaExecutee(refRMI); } else { // sinon, on tente de jouer l'interaction IConsole console = consoleFromRef(refRMI); IConsole consoleAdv = consoleFromRef(refRMIAdv); int distance = Calculs.distanceChebyshev( personnages.get(refRMI).getPosition(), personnages.get(refRMIAdv).getPosition()); // on teste la distance entre les personnages if (distance <= Constantes.DISTANCE_MIN_INTERACTION) { Personnage pers = (Personnage) elementFromRef(refRMI); Personnage persAdv = (Personnage) elementFromRef(refRMIAdv); // on teste que les deux personnages soient en vie if (pers.estVivant() && persAdv.estVivant()) { console.log( Level.INFO, Constantes.nomClasse(this), "Je decoupe " + nomRaccourciClient(refRMIAdv)); consoleAdv.log( Level.INFO, Constantes.nomClasse(this), "Je me fait massacrer par " + nomRaccourciClient(refRMI)); logger.info( Constantes.nomClasse(this), nomRaccourciClient(refRMI) + " attaque " + nomRaccourciClient(consoleAdv.getRefRMI())); new Vampirise(this, client, clientAdv).interagit(); personnages.get(refRMI).executeAction(); // si l'adversaire est mort if (!persAdv.estVivant()) { setPhrase(refRMI, "Je tue " + nomRaccourciClient(consoleAdv.getRefRMI())); console.log( Level.INFO, Constantes.nomClasse(this), "Je tue " + nomRaccourciClient(refRMI)); logger.info( Constantes.nomClasse(this), nomRaccourciClient(refRMI) + " tue " + nomRaccourciClient(consoleAdv.getRefRMI())); } res = true; } else { logger.warning( Constantes.nomClasse(this), nomRaccourciClient(refRMI) + " a tente d'interagir avec " + nomRaccourciClient(refRMIAdv) + ", alors qu'il est mort..."); console.log( Level.WARNING, Constantes.nomClasse(this), nomRaccourciClient(refRMIAdv) + " est deja mort !"); } } else { logger.warning( Constantes.nomClasse(this), nomRaccourciClient(refRMI) + " a tente d'interagir avec " + nomRaccourciClient(refRMIAdv) + ", alors qu'il est trop eloigne... Distance de chebyshev = " + distance); console.log( Level.WARNING, "AVERTISSEMENT ARENE", nomRaccourciClient(refRMIAdv) + " est trop eloigne !\nDistance = " + distance); } } return res; }