2020-05-14 13:06:50 +02:00

310 lines
7.0 KiB
Java

package main;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import carte.CarteEquipement;
import carte.CarteLieu;
import effet.Effet;
import ihm.EffetSonore;
import personnage.CartePersonnage;
import personnage.Metamorphe;
import personnage.CartePersonnage.Equipe;
public class Joueur {
private GestionnaireEquipements gestionnaireEquipements;
private String nom;
private boolean revele;
private Plateau plateau;
private CartePersonnage cartePersonnage;
private CarteLieu carteLieu;
// map keys
public static final String PLAYER_HP = "hp";
public static final String PLAYER_TURN = "turn";
public static final String PLAYER_DAMAGE = "damage";
public static final String PLAYER_RESISTANCE = "resistance";
public static final String PLAYER_REVEAL = "reveal";
public static final String PLAYER_IMMUNITY = "immunity";
public static final String PLAYER_NB_EQUIPEMENTS = "nb_equipements";
private Map<String, Integer> stats;
private boolean deathState;
public Joueur(String nom) {
if(nom == null) {
this.nom = "errorNamePlayer";
}
this.nom = nom;
this.revele = false;
this.gestionnaireEquipements = new GestionnaireEquipements(this);
this.deathState = false;
stats = new HashMap<>();
// Initialisation joueur depuis valeurs perso
stats.put(PLAYER_HP, 20);
//stats.put(PLAYER_TURN, 1);
stats.put(PLAYER_DAMAGE, 0);
stats.put(PLAYER_NB_EQUIPEMENTS, 0);
stats.put(PLAYER_RESISTANCE, 0);
stats.put(PLAYER_REVEAL, 0);
stats.put(PLAYER_IMMUNITY, 0);
// immunité à certains effets?
}
//shadows, hunters ou neutre
public Equipe getEquipe() {
return this.cartePersonnage.getEquipe();
}
public void setStat(String key, int valeur) {
this.stats.put(key, valeur);
}
public void updateStat(String key, int valeur) {
setStat(key, valeur);
if(isDeadStat()) {
death();
}
updateVictoirePlateau();
updateVie();
}
public boolean isDeadStat() {
return this.stats.get(PLAYER_HP) <= 0;
}
public boolean isDead() {
return this.deathState;
}
private void death() {
this.deathState = true;
this.plateau.death(this);
InputStream fileSound1 = getClass().getResourceAsStream("/ihm/ressources/musique/cloche.wav");
EffetSonore.playSoundEffect(fileSound1);
}
//pour tests IA
public void setHP(int val) {
this.stats.put("HP", val);
}
//pour tests IA
public void setNbEquip(int val) {
this.stats.put("nb_equipements", val);
}
//pour tests IA
public void setDamage(int val) {
this.stats.put("DAMAGE", val);
}
private void updateVie() {
int damage = damageTaken();
this.plateau.updateVieJoueur(this, damage);
}
public int damageTaken() {
System.out.println(this.cartePersonnage.getPv()+ " "+this.getStat(PLAYER_HP));
return this.cartePersonnage.getPv() - this.getStat(PLAYER_HP);
}
private void updateVictoirePlateau() {
this.plateau.victoire(this);
}
public boolean victoire() {
return this.cartePersonnage.victoire();
}
public int getStat(String key) {
if(stats.containsKey(key)) {
return stats.get(key);
}else {
return -1;
}
}
public List<Joueur> getJoueursAdjacents() {
List<Joueur> joueurs = this.carteLieu.getJoueursAdjacents();
joueurs.remove(this);
return joueurs;
}
public List<CarteEquipement> getEquipements() {
return this.gestionnaireEquipements.getEquipements();
}
public void voler(Joueur j2, CarteEquipement equipement) {
j2.gestionnaireEquipements.retirer(equipement);
this.gestionnaireEquipements.ajouter(equipement);
}
public void attaquer(Joueur j2, int attaqueDice) {
int blessure = evaluerImmunite(j2)*(this.evaluerAttaque(j2) + attaqueDice);
if(blessure > 0)
{
this.cartePersonnage.attaquer(j2, blessure);
}
}
private int evaluerAttaque(Joueur j2) {
return this.getStat(PLAYER_DAMAGE)-j2.getStat(PLAYER_RESISTANCE);
}
private int evaluerImmunite(Joueur j2) {
int nbToursImmune = j2.getStat(PLAYER_IMMUNITY);
return nbToursImmune > 0 ? 0 : 1;
}
public void addToStat(String key, int valeur)
{
int valeurBase = this.getStat(key);
if(key.contentEquals(PLAYER_HP)) {
this.plateau.alerationVie(this,valeur);
}
this.updateStat(key,valeurBase+valeur);
}
public Plateau getPlateau() {
return this.plateau;
}
public boolean getRevele() {
return this.revele;
}
public CartePersonnage getCartePersonnage() {
return this.cartePersonnage;
}
public void setCartePersonnage(CartePersonnage cp) {
this.cartePersonnage = cp;
this.setStat(PLAYER_HP, cp.getPv());
}
public void setPlateau(Plateau plateau2) {
this.plateau = plateau2;
}
public void utiliserEffetLieu() {
this.carteLieu.utiliser(this);
}
public void deplacer(CarteLieu cl) {
if(this.carteLieu != null){
this.carteLieu.remove(this);
}
this.carteLieu = cl;
cl.ajouterJoueur(this);
}
public CarteLieu getCarteLieu() {
return this.carteLieu;
}
public String getNom() {
return this.nom;
}
public void reveal() {
GestionnaireJeu gj = GestionnaireJeu.getGestionnaireJeu();
gj.reveler(this);
this.revele = true;
}
public void setRevele(boolean b) {
this.revele = b;
}
public void ajouterEquipement(CarteEquipement equipement) {
this.gestionnaireEquipements.ajouter(equipement);
}
public void retirerEquipement(CarteEquipement equipement) {
this.gestionnaireEquipements.retirer(equipement);
}
public boolean hasOpponents() {
List<Joueur> joueursRange = this.getJoueursRange();
return !joueursRange.isEmpty();
}
public List<Joueur> getJoueursRange() {
CarteLieu cl = this.carteLieu;
List<Joueur> joueurs = new ArrayList<Joueur>();
joueurs.addAll(cl.getJoueurs());
joueurs.addAll(cl.getJoueursAdjacents());
joueurs.remove(this);
return joueurs;
}
public boolean choisir(Contexte activerEffetLieu) {
return this.plateau.choisir(this, activerEffetLieu);
}
public Object choisir(List<?> list,Class cls) {
return this.plateau.choisir(this,list, cls);
}
public Joueur choisirAdjacents() {
return this.plateau.choisirAdjacents(this);
}
public Joueur choisiParmisTous() {
return this.plateau.choisirParmisTous(this);
}
public void ajouterEquipementIHM(CarteEquipement e) {
this.plateau.ajouterEquipementIHM(this,e);
}
public void removeEquipementIHM(CarteEquipement e) {
this.plateau.retirerEquipementIHM(this,e);
}
public void utiliserCapacite() {
if(revele) {
this.cartePersonnage.utiliser();
}
}
public boolean isMetamorph() {
return this.cartePersonnage instanceof Metamorphe;
}
public Joueur choisir(List<Joueur> adjacents, Contexte attaquer) {
return this.plateau.choisir(this,adjacents, attaquer);
}
public Map<String, Integer> getStats() {
return this.stats;
}
}