Gestion des morts

This commit is contained in:
Paul Gross 2020-05-14 12:36:15 +02:00
parent 84d63bd9c6
commit 4718e00771
11 changed files with 151 additions and 80 deletions

View File

@ -12,7 +12,8 @@ public abstract class CarteCondition extends CarteEffet implements Serializable{
*
*/
private static final long serialVersionUID = 903022795821166067L;
private Condition condition;
public CarteCondition() {
super("","");
this.condition = new Condition();
@ -21,12 +22,11 @@ public abstract class CarteCondition extends CarteEffet implements Serializable{
public CarteCondition(String nom, String description) {
super(nom, description);
}
private Condition condition;
/*

View File

@ -120,7 +120,7 @@ public class CreatingCardsTest {
// Ténèbre
// Araignée Sanguinaire
/*
DatabaseManager.queryInsertObject(17, new CartePiochable(CartePiochable.Type.TENEBRE,new EffetMultiple(new EffetChoisirCible(new ActionAltererStatistiquesJoueur(Joueur.PLAYER_HP, -2, true)),
new EffetSelf(new ActionAltererStatistiquesJoueur(Joueur.PLAYER_HP, -2, true)))));
@ -135,18 +135,18 @@ public class CreatingCardsTest {
DatabaseManager.queryInsertObject(20, new CartePiochable(CartePiochable.Type.TENEBRE,new EffetMultiple(new EffetChoisirCible(new ActionAltererStatistiquesJoueur(Joueur.PLAYER_HP, -2, true)),
new EffetSelf(new ActionAltererStatistiquesJoueur(Joueur.PLAYER_HP, 1, true)))));
*/
// Dynamite
// 21
// Hache tueuse
for(int i = 0; i <= 2; i++) {
DatabaseManager.queryInsertObject(22+i,new CarteEquipementStat(CartePiochable.Type.TENEBRE,
DatabaseManager.queryInsertObject(22,new CarteEquipementStat(CartePiochable.Type.TENEBRE,
new EffetSelf(new ActionAltererStatistiquesJoueur(Joueur.PLAYER_DAMAGE, 1, true))));
}
/*
DatabaseManager.queryInsertObject(22,new CarteEquipementStat(CartePiochable.Type.TENEBRE,
new EffetSelf(new ActionAltererStatistiquesJoueur(Joueur.PLAYER_DAMAGE, 1, true))));
@ -171,7 +171,7 @@ public class CreatingCardsTest {
));
// 29
*/
DatabaseManager.queryInsertObject(30,new CartePiochable(CartePiochable.Type.TENEBRE,
new EffetChoisirCible(new ActionVoler(ActionVoler.VOLER))));

View File

@ -46,7 +46,7 @@ public class ActionAltererStatistiquesJoueur extends Action{
{
j2.addToStat(key, valeur);
}else {
j2.setStat(key, valeur);
j2.updateStat(key, valeur);
}
}
@ -82,6 +82,6 @@ public class ActionAltererStatistiquesJoueur extends Action{
mot2 = " le ";
}
return mot1+" "+valeur+" "+key+mot2+"joueur";
return mot1+" "+Math.abs(valeur)+" "+key+mot2+"joueur";
}
}

View File

@ -396,19 +396,17 @@ public class PlateauController implements Initializable {
final ResourceBundle bundle = ResourceBundle.getBundle("domaine.properties.langue", Locale.FRANCE);
final FXMLLoader fxmlLoader = new FXMLLoader(fxmlURL, bundle);
Pane root = (Pane)fxmlLoader.load();
//CartePiochable lzj = fxmlLoader.getController();
//lzj.setImageView(this.getImageCarte(j.getCarteLieu()));
JoueurIHM jihm = getJoueurIHM(j);
jihm.setZoneJoueur(root);
}
public void afficherEffet(Joueur j) throws IOException {
public void afficherEffet(Joueur j) throws IOException {
final URL fxmlURL = getClass().getResource("/ihm/ressources/Jouer_tour(2b)piocher_carte.fxml");
final ResourceBundle bundle = ResourceBundle.getBundle("domaine.properties.langue", Locale.FRANCE);
final FXMLLoader fxmlLoader = new FXMLLoader(fxmlURL, bundle);
Pane root = (Pane)fxmlLoader.load();
//CartePiochable lzj = fxmlLoader.getController();
//lzj.setImageView(this.getImageCarte(j.getCarteLieu()));
JoueurIHM jihm = getJoueurIHM(j);
jihm.setZoneJoueur(root);
}
@ -460,7 +458,7 @@ public void afficherEffet(Joueur j) throws IOException {
InputStream fileSound1 = getClass().getResourceAsStream("/ihm/ressources/musique/BEEP1.wav");
EffetSonore.playSoundEffect(fileSound1);
System.out.println("Jeu en pause ...");
final URL fxmlURL = getClass().getResource("/ihm/ressources/Pause.fxml");
final ResourceBundle bundle = ResourceBundle.getBundle("domaine.properties.langue", Locale.FRANCE);
@ -542,17 +540,15 @@ public void afficherEffet(Joueur j) throws IOException {
VBox v= (VBox)a.getChildren().get(0);
AnchorPane b=(AnchorPane)s.getItems().get(1);
ImageView i= (ImageView)b.getChildren().get(0);
v.setRotate(180);
i.setRotate(180);
s.setRotate(180);
}
jihm.getZoneJoueur();
jihm.setZoneJoueur(root);
}
public Map<String,BufferedImage> getMapRessourcesDosCartes() {
return mapRessourcesDosCartes;
}
@ -565,13 +561,13 @@ public void afficherEffet(Joueur j) throws IOException {
public void afficherChoisirAction(Joueur joueur, List<Action> list) {
List<Button> buttons = new ArrayList<Button>();
for(Action a : list) {
Button button = interpret(a);
buttons.add(button);
button.setOnAction(x -> {
this.choixAction = a;
GestionnaireJeu.notifyPlateau();
});

View File

@ -9,6 +9,6 @@ public enum Contexte {
ACTIVER_EFFET_LIEU,
EFFET_BOB,
LANCER_DES_4,
LANCER_DES_6, CHOISIR_VISION, CHOISIR_ACTION
LANCER_DES_6, CHOISIR_VISION, CHOISIR_ACTION, EFFET_CHARLES
}

View File

@ -15,7 +15,6 @@ import carte.CartePiochable;
import carte.CartePiochable.Type;
import carte.CarteVision;
import database.RessourceLoader;
import effet.Effet;
import effet.action.Action;
import ihm.controller.PlateauController;
import javafx.application.Platform;

View File

@ -33,6 +33,7 @@ public class Joueur {
public static final String PLAYER_NB_EQUIPEMENTS = "nb_equipements";
private Map<String, Integer> stats;
private boolean deathState;
@ -44,6 +45,7 @@ public class Joueur {
this.nom = nom;
this.revele = false;
this.gestionnaireEquipements = new GestionnaireEquipements(this);
this.deathState = false;
stats = new HashMap<>();
@ -65,15 +67,32 @@ public class Joueur {
return this.cartePersonnage.getEquipe();
}
private void changeStat(String key, int valeur) {
this.stats.put(key, valeur);
}
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);
}
//pour tests IA
public void setHP(int val) {
this.stats.put("HP", val);
@ -84,9 +103,9 @@ public class Joueur {
this.stats.put("nb_equipements", val);
}
//pour tests IA
public void setDamage(int val) {
this.stats.put("DAMAGE", val);
}
public void setDamage(int val) {
this.stats.put("DAMAGE", val);
}
private void updateVie() {
int damage = damageTaken();
@ -99,9 +118,7 @@ public class Joueur {
}
private void updateVictoirePlateau() {
int result = victoire() ? 0 : 1;
this.plateau.setStat(Plateau.PARTIE_FINIE, result);
this.plateau.victoire(this);
}
public boolean victoire() {
@ -161,7 +178,7 @@ public class Joueur {
if(key.contentEquals(PLAYER_HP)) {
this.plateau.alerationVie(this,valeur);
}
this.setStat(key,valeurBase+valeur);
this.updateStat(key,valeurBase+valeur);
}
@ -179,7 +196,7 @@ public class Joueur {
public void setCartePersonnage(CartePersonnage cp) {
this.cartePersonnage = cp;
this.changeStat(PLAYER_HP, cp.getPv());
this.setStat(PLAYER_HP, cp.getPv());
}
public void setPlateau(Plateau plateau2) {
@ -279,4 +296,10 @@ public class Joueur {
public Joueur choisir(List<Joueur> adjacents, Contexte attaquer) {
return this.plateau.choisir(this,adjacents, attaquer);
}
public Map<String, Integer> getStats() {
return this.stats;
}
}

View File

@ -14,7 +14,6 @@ import carte.CarteLieuMultiple;
import carte.CarteLieuType;
import carte.CartePiochable;
import database.RessourceLoader;
import effet.Effet;
import effet.EffetChoisirCible;
import effet.EffetChoisirEffet;
import effet.EffetSelf;
@ -23,6 +22,7 @@ import effet.action.ActionVoler;
import ihm.controller.PlateauController;
import personnage.Allie;
import personnage.CartePersonnage;
import personnage.CartePersonnage.Equipe;
import personnage.Franklin;
import personnage.Vampire;
@ -40,6 +40,7 @@ public class Plateau extends Thread{
public static final String NB_MORTS_HUNTER = "nb_morts_hunter";
public static final String NB_MORTS_SHADOW = "nb_morts_shadow";
public static final String PARTIE_FINIE = "partie_finie";
public static final String WIN_CHARLES = "victoire_charles";
private Map<String, Integer> stats;
@ -262,53 +263,44 @@ public class Plateau extends Thread{
int nbJoueurs = this.joueurs.size();
int i = 0;
while(true) {
while(!isPartieTerminee()) {
System.out.println(joueurs.size());
Joueur currentJoueur = this.joueurs.get(i % nbJoueurs);
System.out.println("\n\n\n\n\n");
System.out.println("Au tour de "+currentJoueur.getNom());
System.out.println("Lancement des dés.");
deplacer(currentJoueur);
if(isPartieTerminee()) break;
System.out.println("Vous êtes désormais sur le lieu "+currentJoueur.getCarteLieu().getNom());
System.out.println("Voulez vous activer l'effet du lieu ?");
gj.afficherLieu(currentJoueur);
Joueur currentJoueur = this.joueurs.get(i % nbJoueurs);
if(currentJoueur.choisir(Contexte.ACTIVER_EFFET_LIEU)) {
System.out.println("Vous activez l'effet du lieu.");
System.out.println("Vous avez "+currentJoueur.getStat(Joueur.PLAYER_HP)+" pv");
currentJoueur.utiliserEffetLieu();
System.out.println("Vous passez a "+currentJoueur.getStat(Joueur.PLAYER_HP)+" pv");
if(!currentJoueur.isDead()) {
deplacer(currentJoueur);
if(isPartieTerminee()) break;
}
System.out.println("\n");
System.out.println("Souhaitez vous attaquer quelqu'un ?");
if(currentJoueur.choisir(Contexte.ATTAQUER)){
if(currentJoueur.hasOpponents()) {
List<Joueur> adjacents = currentJoueur.getJoueursRange();
Joueur cible = (Joueur) currentJoueur.choisir(adjacents,Contexte.ATTAQUER);
attaquer(currentJoueur,cible);
gj.afficherLieu(currentJoueur);
if(currentJoueur.choisir(Contexte.ACTIVER_EFFET_LIEU)) {
currentJoueur.utiliserEffetLieu();
if(isPartieTerminee()) break;
}else {
System.out.println("Il n'y a personne a attaquer.");
}
if(currentJoueur.choisir(Contexte.ATTAQUER)){
if(currentJoueur.hasOpponents()) {
List<Joueur> adjacents = currentJoueur.getJoueursRange();
Joueur cible = (Joueur) currentJoueur.choisir(adjacents,Contexte.ATTAQUER);
attaquer(currentJoueur,cible);
if(isPartieTerminee()) break;
}else {
System.out.println("Il n'y a personne a attaquer.");
}
}
i++;
}
i++;
}
List<Joueur> gagnants = new ArrayList<Joueur>();
System.out.println(this.stats);
for(Joueur j : joueurs) {
if(j.victoire()) {
gagnants.add(j);
System.out.println("CartePersonnage "+j.getCartePersonnage()+" Stats "+j.getStats());
}
}
// TODO Liste des gagnants
// TODO Evaluate every winners
}
}
public boolean isPartieTerminee() {
@ -445,17 +437,31 @@ public class Plateau extends Thread{
CarteLieu cl = joueur.getCarteLieu();
joueurs.addAll(cl.getJoueurs());
joueurs.remove(joueur);
joueurs.addAll(cl.getJoueursAdjacents());
joueurs.remove(joueur);
removeDeads(joueurs);
return (Joueur) gj.choisir(joueur, joueurs, Joueur.class);
}
private void removeDeads(List<Joueur> joueurs) {
List<Joueur> toRemove = new ArrayList<Joueur>();
for(Joueur j : joueurs) {
if(j.isDead()) {
toRemove.add(j);
}
}
joueurs.removeAll(toRemove);
}
public Joueur choisirParmisTous(Joueur joueur) {
List<Joueur> joueurs = new ArrayList<Joueur>();
joueurs.addAll(this.getJoueurs());
joueurs.remove(joueur);
removeDeads(joueurs);
return (Joueur) gj.choisir(joueur, joueurs, Joueur.class);
}
@ -485,4 +491,39 @@ public class Plateau extends Thread{
public Joueur choisir(Joueur joueur, List<Joueur> adjacents, Contexte attaquer) {
return gj.choisirJoueur(joueur, adjacents, attaquer);
}
public void death(Joueur joueur) {
Equipe ej = joueur.getEquipe();
switch(ej) {
case SHADOW:
this.updateStat(NB_MORTS_SHADOW,1,true);
break;
case HUNTER:
this.updateStat(NB_MORTS_HUNTER,1,true);
break;
case NEUTRE:
this.updateStat(NB_MORTS_NEUTRAL,1,true);
break;}
this.updateStat(NB_MORTS,1,true);
}
private void updateStat(String key , int value, boolean ajouter) {
if(ajouter) {
int valeurBase = this.getStat(key);
this.setStat(key, valeurBase+value);
}else {
this.setStat(key, value);
}
}
public void victoire(Joueur joueur) {
if(joueur.victoire()) {
this.updateStat(PARTIE_FINIE, 1, false);
}
}
}

View File

@ -1,6 +1,7 @@
package personnage;
import carte.CarteCondition;
import condition.Condition;
import main.Joueur;
public abstract class CartePersonnage extends CarteCondition {
@ -19,7 +20,6 @@ public abstract class CartePersonnage extends CarteCondition {
super(nom, description);
this.pv = pv;
this.joueur = joueur;
}
public abstract void utiliser();

View File

@ -1,9 +1,12 @@
package personnage;
import condition.Condition;
import condition.ConditionStatistiques;
import effet.Effet;
import effet.EffetSelf;
import effet.action.Action;
import effet.action.ActionAltererStatistiquesJoueur;
import main.Contexte;
import main.Joueur;
import main.Plateau;
@ -15,7 +18,10 @@ public class Charles extends CartePersonnage{
Action action = new ActionAltererStatistiquesJoueur("HP",-2,true);
Effet effet = new EffetSelf(action);
this.setEffet(effet);
Condition winCondition = new ConditionStatistiques(ConditionStatistiques.PLATEAU, Plateau.WIN_CHARLES, 1, ConditionStatistiques.EQUAL);
this.setCondition(winCondition);
}
public Charles() {
@ -24,6 +30,9 @@ public class Charles extends CartePersonnage{
Action action = new ActionAltererStatistiquesJoueur("HP",-2,true);
Effet effet = new EffetSelf(action);
this.setEffet(effet);
Condition winCondition = new ConditionStatistiques(ConditionStatistiques.PLATEAU, Plateau.WIN_CHARLES, 1, ConditionStatistiques.EQUAL);
this.setCondition(winCondition);
}
@Override
@ -32,20 +41,22 @@ public class Charles extends CartePersonnage{
Joueur joueur = this.getJoueur();
super.attaquer(j, blessure);
if(joueur.getStat(Joueur.PLAYER_HP) > 2 && joueur.getRevele()){
if(joueur.getStat(Joueur.PLAYER_HP) > 2 && joueur.getRevele()
&& joueur.choisir(Contexte.EFFET_CHARLES)){
Plateau p = j.getPlateau();
utiliser(joueur);
p.attaquer(this.getJoueur(), j);
}
}
Plateau p = j.getPlateau();
if(j.isDead() && (p.getStat(Plateau.NB_MORTS) >= 3)) {
p.setStat(Plateau.WIN_CHARLES, 1);
}
}
@Override
public void utiliser() {
/*
System.out.println("vie avant : " + this.getJoueur().getCartePersonnage().getPv());
this.getJoueur().setStat("HP", this.getJoueur().getStat("HP") - 2);
System.out.println("vie apres : " + this.getJoueur().getCartePersonnage().getPv());
*/
}
}

View File

@ -1,3 +1,4 @@
package personnage;
import condition.WinConditionHunter;