From 3dd06a2bd863aa7aee76df57ffc7cece58548ce4 Mon Sep 17 00:00:00 2001
From: Tiago Lousa <tig2468.a@gmail.com>
Date: Thu, 9 Jun 2022 14:21:30 +0200
Subject: [PATCH 01/97] =?UTF-8?q?world=20limite=20faite=20avec=20magouille?=
 =?UTF-8?q?=20(=20=C3=A0=20refaire=20si=20une=20bonne=20m=C3=A9thode=20est?=
 =?UTF-8?q?=20trouve=20)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/fr/sae/terraria/modele/entities/entity/Entity.java   | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/modele/entities/entity/Entity.java b/src/main/java/fr/sae/terraria/modele/entities/entity/Entity.java
index f96fd29..9a728e8 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/entity/Entity.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/entity/Entity.java
@@ -90,7 +90,7 @@ protected Entity(int x, int y)
     public abstract void updates();
 
     /**
-     * Permet de detectés les collisions sur la carte et de son environment.
+     * Permet de detecter les collisions sur la carte et de son environment.
      *
      * @param environment Permet de savoir les tailles des tiles et d'avoir la matrixe de données de la carte.
      * @return Il vas retourner une HashMap qui ne contiendra pas de clé ou 4 clés maximum
@@ -197,7 +197,7 @@ protected boolean worldLimit(final Environment environment)
         double widthMap = (environment.getTileMaps().getWidth()*environment.scaleMultiplicatorWidth*TileMaps.TILE_DEFAULT_SIZE) ;
 
         boolean exceedsScreenOnLeft = offset[0] == Entity.IS_MOVING_LEFT && getX() < 0;
-        boolean exceedsScreenOnRight = offset[0] == Entity.IS_MOVING_RIGHT && getX() > (widthMap - getRect().getWidth());
+        boolean exceedsScreenOnRight = offset[0] == Entity.IS_MOVING_RIGHT && getX()+CollideObjectType.COLLISION_TOLERANCE+velocity + getRect().getWidth() + 3 >= widthMap;
         return (exceedsScreenOnLeft || exceedsScreenOnRight);
     }
 

From d3685c09e5865660a5df7d8f0b6211d500d982a8 Mon Sep 17 00:00:00 2001
From: Tiago Lousa <tig2468.a@gmail.com>
Date: Thu, 9 Jun 2022 14:31:04 +0200
Subject: [PATCH 02/97] =?UTF-8?q?d=C3=A9placement=20de=20la=20dobuleProper?=
 =?UTF-8?q?ty=20opacit=C3=A9=20dans=20Clock?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/fr/sae/terraria/modele/Clock.java    | 19 ++++++++++++++++++-
 .../java/fr/sae/terraria/vue/LightView.java   | 18 ++----------------
 2 files changed, 20 insertions(+), 17 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/modele/Clock.java b/src/main/java/fr/sae/terraria/modele/Clock.java
index a15c226..6849256 100644
--- a/src/main/java/fr/sae/terraria/modele/Clock.java
+++ b/src/main/java/fr/sae/terraria/modele/Clock.java
@@ -1,5 +1,6 @@
 package fr.sae.terraria.modele;
 
+import javafx.beans.property.SimpleDoubleProperty;
 import javafx.beans.property.SimpleIntegerProperty;
 
 
@@ -11,12 +12,13 @@ public class Clock
 
     private final SimpleIntegerProperty minutes;
     private final SimpleIntegerProperty days;
+    private final SimpleDoubleProperty opacityNightFilter;
 
 
     public Clock()
     {
         super();
-
+        opacityNightFilter = new SimpleDoubleProperty(.0);
         this.minutes = new SimpleIntegerProperty(Clock.EIGHT_AM_INGAME);
         this.days = new SimpleIntegerProperty(1);
     }
@@ -29,15 +31,30 @@ public void updates(int ticks)
                 this.days.setValue(getDays()+1);
                 this.minutes.setValue(0);
             } else this.minutes.setValue(getMinutes()+1);
+            updateOpacity();
         }
     }
 
     public SimpleIntegerProperty minutesProperty() { return this.minutes; }
     public SimpleIntegerProperty daysProperty() { return this.days; }
 
+    private void updateOpacity()
+    {
+        if (this.getMinutes() > Clock.MINUTES_IN_A_DAY/2)
+            this.opacityNightFilter.set(((this.getMinutes()*(2. /* Compensation temps */))/Clock.MINUTES_IN_A_DAY) - (1.1 /* Décallage */));
+        else this.opacityNightFilter.set(((Clock.MINUTES_IN_A_DAY - (this.getMinutes()*(4. /* Compensation temps */)))/Clock.MINUTES_IN_A_DAY) - (.1 /* Décallage */));
+    }
 
     public int getMinutes() { return this.minutes.get(); }
     public int getDays() { return this.days.get(); }
 
+    public double getOpacityNightFilter() {
+        return opacityNightFilter.get();
+    }
+
+    public SimpleDoubleProperty opacityNightFilterProperty() {
+        return opacityNightFilter;
+    }
+
     public void setMinutes(int newMinutes) { this.minutes.set(newMinutes); }
 }
diff --git a/src/main/java/fr/sae/terraria/vue/LightView.java b/src/main/java/fr/sae/terraria/vue/LightView.java
index f80be65..336cc1d 100644
--- a/src/main/java/fr/sae/terraria/vue/LightView.java
+++ b/src/main/java/fr/sae/terraria/vue/LightView.java
@@ -25,8 +25,7 @@ public class LightView {
     private static int widthMap;
     private static int tileSize;
 
-    private final SimpleDoubleProperty opacityNightAir;
-    private final SimpleDoubleProperty opacityNightFade;
+
     private final Environment environment;
     private final TileMaps tileMaps;
     private final Circle torchLight;
@@ -47,15 +46,12 @@ public LightView(Clock clock, Pane filterPane, Environment env) {
         widthMap = (int) (env.scaleMultiplicatorWidth*TileMaps.TILE_DEFAULT_SIZE*tileMaps.getWidth());
         delimitationDirtStone = fullStoneArea();
 
-        this.opacityNightAir = new SimpleDoubleProperty(.0);
-        this.opacityNightFade = new SimpleDoubleProperty(.8143);
 
         this.torchLight = new Circle(this.tileSize*CIRCLE_RAY);
 
         this.resetShapes();
         this.addEffects();
 
-        this.clock.minutesProperty().addListener(((obs, oldV, newV) -> updateOpacity()));
 
         this.filterPane.getChildren().addAll(this.actualTunnel, this.actualFade, this.actualAir);
         this.initTochListener(env.getTorches());
@@ -96,14 +92,6 @@ else if (c.wasAdded()){
             }});
     }
 
-    private void updateOpacity()
-    {
-        if (this.clock.getMinutes() > Clock.MINUTES_IN_A_DAY/2)
-            this.opacityNightAir.set(((this.clock.getMinutes()*(2. /* Compensation temps */))/Clock.MINUTES_IN_A_DAY) - (1.1 /* Décallage */));
-        else this.opacityNightAir.set(((Clock.MINUTES_IN_A_DAY - (this.clock.getMinutes()*(4. /* Compensation temps */)))/Clock.MINUTES_IN_A_DAY) - (.1 /* Décallage */));
-    }
-
-
     private int fullStoneArea()
     {
         int line = 0;
@@ -143,9 +131,7 @@ private void addEffects()
         this.actualAir.setFill(NIGHT_COLOR);
         this.actualTunnel.setFill(NIGHT_COLOR);
 
-        this.actualTunnel.opacityProperty().bind(this.opacityNightFade);
-        this.actualFade.opacityProperty().bind(this.opacityNightFade);
-        this.actualAir.opacityProperty().bind(this.opacityNightAir);
+        this.actualAir.opacityProperty().bind(this.clock.opacityNightFilterProperty());
     }
 
     private void addTochLights()

From 4dcf176d7f84cf17a63ec7c64fac3a5091593bb2 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Thu, 9 Jun 2022 14:35:27 +0200
Subject: [PATCH 03/97] Les entity qui sont movable ont une classes qui lui
 sont propre

---
 .../sae/terraria/modele/entities/Arrow.java   |  13 +-
 .../sae/terraria/modele/entities/Rabbit.java  |   6 +-
 .../sae/terraria/modele/entities/Slime.java   |  11 +-
 .../modele/entities/entity/Entity.java        | 130 ---------------
 .../modele/entities/entity/EntityMovable.java | 152 ++++++++++++++++++
 .../entities/entity/MovableObjectType.java    |  66 --------
 .../modele/entities/player/Player.java        |  15 +-
 .../java/fr/sae/terraria/vue/SlimeView.java   |   1 -
 8 files changed, 165 insertions(+), 229 deletions(-)
 create mode 100644 src/main/java/fr/sae/terraria/modele/entities/entity/EntityMovable.java
 delete mode 100644 src/main/java/fr/sae/terraria/modele/entities/entity/MovableObjectType.java

diff --git a/src/main/java/fr/sae/terraria/modele/entities/Arrow.java b/src/main/java/fr/sae/terraria/modele/entities/Arrow.java
index 40b9b46..8b0ba10 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/Arrow.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/Arrow.java
@@ -2,19 +2,18 @@
 
 import fr.sae.terraria.modele.Environment;
 import fr.sae.terraria.modele.entities.entity.CollideObjectType;
-import fr.sae.terraria.modele.entities.entity.Entity;
-import fr.sae.terraria.modele.entities.entity.MovableObjectType;
+import fr.sae.terraria.modele.entities.entity.EntityMovable;
 import fr.sae.terraria.modele.entities.entity.StowableObjectType;
 
 
-public class Arrow extends Entity implements StowableObjectType, MovableObjectType, CollideObjectType
+public class Arrow extends EntityMovable implements StowableObjectType, CollideObjectType
 {
     private final Environment environment;
 
 
     public Arrow(final Environment environment, int x, int y, int velocity)
     {
-        super(x, y);
+        super(x, y, environment);
         this.environment = environment;
 
         this.velocity = velocity;
@@ -23,10 +22,4 @@ public Arrow(final Environment environment, int x, int y, int velocity)
     @Override public void updates() { /* TODO document why this method is empty */ }
     @Override public void move() { /* TODO document why this method is empty */ }
     @Override public void collide() { /* TODO document why this method is empty */ }
-
-    @Override public void moveRight() { super.moveRight(); }
-    @Override public void moveLeft() { super.moveLeft(); }
-    @Override public void jump() { /* UNE FLECHE NE PEUT SAUTER */ }
-    @Override public void fall() { super.fall(); }
-    @Override public void worldLimit() { super.worldLimit(this.environment); }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/Rabbit.java b/src/main/java/fr/sae/terraria/modele/entities/Rabbit.java
index 8d8d32f..5a0da73 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/Rabbit.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/Rabbit.java
@@ -12,7 +12,7 @@
 import java.util.Objects;
 
 
-public class Rabbit extends Entity implements CollideObjectType, ReproductiveObjectType, MovableObjectType, CollapsibleObjectType, SpawnableObjectType
+public class Rabbit extends EntityMovable implements CollideObjectType, ReproductiveObjectType, CollapsibleObjectType, SpawnableObjectType
 {
     public static final int WHEN_SPAWN_A_RABBIT = 2_500;
     public static final double RABBIT_SPAWN_RATE = .2;
@@ -27,7 +27,7 @@ public class Rabbit extends Entity implements CollideObjectType, ReproductiveObj
 
     public Rabbit(final Environment environment, int x, int y)
     {
-        super(x, y);
+        super(x, y, environment);
         this.environment = environment;
 
         this.setPv(3);
@@ -138,7 +138,7 @@ public Rabbit(final Environment environment, int x, int y)
     /** Modifie l'offset qui permet de tomber */
     @Override public void fall() { super.fall(); }
 
-    @Override public void worldLimit()
+    public void worldLimit()
     {
         if (super.worldLimit(this.environment))
             this.offset[0] = (-1) * this.offset[0];
diff --git a/src/main/java/fr/sae/terraria/modele/entities/Slime.java b/src/main/java/fr/sae/terraria/modele/entities/Slime.java
index 721fd28..2a59a73 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/Slime.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/Slime.java
@@ -7,18 +7,15 @@
 import java.util.Objects;
 
 
-public class Slime extends Entity implements CollideObjectType, MovableObjectType, CollapsibleObjectType, SpawnableObjectType
+public class Slime extends EntityMovable implements CollideObjectType, CollapsibleObjectType, SpawnableObjectType
 {
     public static final int WHEN_SPAWN_A_SLIME = 2_500;
     public static final double SLIME_SPAWN_RATE = .2;
 
-    private final Environment environment;
-
 
     public Slime(Environment environment, int x, int y)
     {
-        super(x, y);
-        this.environment = environment;
+        super(x, y, environment);
         this.velocity = 2;
 
         this.setPv(3);
@@ -41,7 +38,7 @@ public Slime(Environment environment, int x, int y)
 
         this.offset[0] = Entity.IDLE;
         if (this.offset[1] == Entity.IS_JUMPING) {
-            if (environment.getPlayer().getX() > this.x.getValue())
+            if (this.environment.getPlayer().getX() > this.x.getValue())
                 this.offset[0] = Entity.IS_MOVING_RIGHT;
             else if (environment.getPlayer().getX() < this.x.getValue())
                 this.offset[0] = Entity.IS_MOVING_LEFT;
@@ -95,5 +92,5 @@ else if (environment.getPlayer().getX() < this.x.getValue())
 
     @Override public void fall() { super.fall(); }
 
-    @Override public void worldLimit() { super.worldLimit(this.environment); }
+    public void worldLimit() { super.worldLimit(this.environment); }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/entity/Entity.java b/src/main/java/fr/sae/terraria/modele/entities/entity/Entity.java
index 9a728e8..f29cefe 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/entity/Entity.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/entity/Entity.java
@@ -1,14 +1,8 @@
 package fr.sae.terraria.modele.entities.entity;
 
-import fr.sae.terraria.modele.Environment;
-import fr.sae.terraria.modele.TileMaps;
-import fr.sae.terraria.modele.entities.Slime;
 import javafx.beans.property.DoubleProperty;
 import javafx.beans.property.SimpleDoubleProperty;
 
-import java.util.HashMap;
-import java.util.Map;
-
 
 /**
  * <h1><b>La classes Entity</b></h1>
@@ -31,7 +25,6 @@
  *
  * <p>Sont implementable grâce à l'interface MovableObjectType</p>
  * @see CollideObjectType
- * @see MovableObjectType
  * @see ReproductiveObjectType
  * @see StowableObjectType
  * @see BreakableObjectType
@@ -53,14 +46,10 @@ public abstract class Entity
     protected final DoubleProperty x;
     protected final DoubleProperty y;
 
-    protected final Gravity gravity = new Gravity();
     protected Animation animation = null;
     protected Rect rect = null;
-    protected double velocity;
     protected double pvMax;
-    protected boolean air;
 
-    public int[] offset;
 
 
     /**
@@ -76,9 +65,6 @@ protected Entity(int x, int y)
         this.pv = new SimpleDoubleProperty(0);
 
         this.pvMax = this.pv.get();
-        this.air = false;
-        this.offset = new int[2];
-        this.velocity = 1;
     }
 
     protected Entity() { this(0, 0); }
@@ -89,133 +75,17 @@ protected Entity(int x, int y)
      */
     public abstract void updates();
 
-    /**
-     * Permet de detecter les collisions sur la carte et de son environment.
-     *
-     * @param environment Permet de savoir les tailles des tiles et d'avoir la matrixe de données de la carte.
-     * @return Il vas retourner une HashMap qui ne contiendra pas de clé ou 4 clés maximum
-     *         left, right, top, bottom sera les clés qui peuvent être present lors d'une detection de collision.
-     *         Il permettra de faire des actions personnalisées les actions faites par l'entité suivant d'où il rentre en collision avec son environment.
-     */
-    protected Map<String, Boolean> collide(final Environment environment)
-    {
-
-        int widthTile = environment.widthTile; int heightTile = environment.heightTile;
-        TileMaps tileMaps = environment.getTileMaps();
-        Map<String, Boolean> whereCollide = new HashMap<>();
-
-        // Detection vide en dessous
-        int yBottom = (int)  (this.getY()+getRect().getHeight()-CollideObjectType.COLLISION_TOLERANCE)/heightTile;
-        int posX = (int) ((this.getX()+((this.offset[0] < 0) ? CollideObjectType.COLLISION_TOLERANCE : -CollideObjectType.COLLISION_TOLERANCE)) + ((this.offset[0] > 0) ? getRect().getWidth() : 0))/widthTile;
-
-        boolean footInTheVoid = tileMaps.getTile(posX, yBottom) == TileMaps.SKY;
-        if (footInTheVoid)
-            this.air = true;
-
-        // Detection collision gauche droite
-        if (this.offset[0] != Entity.IDLE) {
-            int yTop = (int) (getY()+CollideObjectType.COLLISION_TOLERANCE)/heightTile;
-            int futurePositionXLeft = (int) ((getX()+CollideObjectType.COLLISION_TOLERANCE)+(velocity*offset[0]))/widthTile;
-            int futurePositionXRight = (int) ((getX()+(-CollideObjectType.COLLISION_TOLERANCE)+(velocity*offset[0])) + (getRect().getWidth()))/widthTile;
-
-            whereCollide.put("right", tileMaps.getTile(futurePositionXRight, yTop) != TileMaps.SKY || tileMaps.getTile(futurePositionXRight, yBottom) != TileMaps.SKY);
-            whereCollide.put("left", tileMaps.getTile(futurePositionXLeft, yTop) != TileMaps.SKY || tileMaps.getTile(futurePositionXLeft, yBottom) != TileMaps.SKY);
-        }
-
-        // Detection collision en bas et en haut
-        if (this.offset[1] != Entity.IDLE) {
-            int xLeft = (int) (getX()+CollideObjectType.COLLISION_TOLERANCE)/widthTile;
-            int xRight = (int) ((getX()+getRect().getWidth())-CollideObjectType.COLLISION_TOLERANCE)/widthTile;
-
-
-            // Tombe
-            if (this.offset[1] == Entity.IS_FALLING) {
-                this.gravity.degInit = 0;
-                double futurePositionY = gravity.formulaOfTrajectory() ;
-                boolean isCollideBottom = tileMaps.getTile(xLeft, (int) (futurePositionY + this.rect.getHeight())/heightTile) != TileMaps.SKY || tileMaps.getTile(xRight, (int) (futurePositionY + CollideObjectType.COLLISION_TOLERANCE +this.rect.getHeight())/heightTile) != TileMaps.SKY;
-                if (isCollideBottom) {
-                    this.gravity.setJumpPosInit(this);
-                    this.gravity.timer = 0;
-                    this.offset[1] = Entity.IDLE;
-                } else setY(futurePositionY);
-            // Saute
-            } else if (this.offset[1] == Entity.IS_JUMPING) {
-                double futurePositionY = gravity.formulaOfTrajectory();
-
-                boolean isCollideTop = tileMaps.getTile(xLeft, (int) (futurePositionY + CollideObjectType.COLLISION_TOLERANCE)/heightTile) != TileMaps.SKY || tileMaps.getTile(xRight, (int) (futurePositionY + CollideObjectType.COLLISION_TOLERANCE)/heightTile) != TileMaps.SKY;
-                // Quand le joueur monte
-                if (this.gravity.flightTime >= this.gravity.timer ) {
-                    if (isCollideTop) {
-                        this.fall();
-                        this.gravity.timer = 0;
-                        this.gravity.setJumpPosInit(this);
-                    } else this.setY(futurePositionY);
-                    // Quand le joueur decent
-                } else {
-                    boolean isCollideBottom = tileMaps.getTile(xLeft, (int) ((futurePositionY + this.rect.getHeight()) - CollideObjectType.COLLISION_TOLERANCE)/heightTile) != TileMaps.SKY || tileMaps.getTile(xRight,(int) ((futurePositionY + this.rect.getHeight()) - CollideObjectType.COLLISION_TOLERANCE)/heightTile) != TileMaps.SKY;
-
-                    if (isCollideTop) {
-                        this.fall();
-                    } else if (isCollideBottom) {
-                        this.gravity.setJumpPosInit(this);
-                        this.gravity.timer = 0;
-                        this.offset[1] = Entity.IDLE;
-                        this.air = false;
-                    } else this.setY(futurePositionY);
-                }
-            }
-        } else if (this.air) {
-            this.gravity.degInit = 0;
-            int xLeft = (int) (getX()+CollideObjectType.COLLISION_TOLERANCE)/widthTile;
-            int xRight = (int) (getX()-CollideObjectType.COLLISION_TOLERANCE+getRect().getWidth())/widthTile;
-            double futurePositionY = this.gravity.formulaOfTrajectory() + this.rect.getHeight();
-
-            boolean isCollideBottom = tileMaps.getTile(xLeft, (int) (futurePositionY - CollideObjectType.COLLISION_TOLERANCE)/heightTile) != TileMaps.SKY || tileMaps.getTile(xRight, (int) (futurePositionY - CollideObjectType.COLLISION_TOLERANCE)/heightTile) != TileMaps.SKY;
-            if (isCollideBottom) {
-                this.offset[1] = Entity.IDLE;
-                this.air = false;
-                this.gravity.setJumpPosInit(this);
-            } else setY(futurePositionY - this.rect.getHeight());
-        }
-
-        return whereCollide;
-    }
-
-    protected void moveRight() { this.offset[0] = Entity.IS_MOVING_RIGHT; }
-    protected void moveLeft() { this.offset[0] = Entity.IS_MOVING_LEFT; }
-    protected void jump() { this.offset[1] = Entity.IS_JUMPING; }
-    protected void fall() { this.offset[1] = Entity.IS_FALLING; }
-
-    /**
-     * Lorsque le joueur sort de l'ecran et/ou de la carte, la fonction retourne une valeurs boolean qui sera manipulable sur les classes qui l'héritera.
-     * @param environment Permet d'avoir les informations naicessaire sur la carte et l'écran pour que l'entité ne sorte pas.
-     *
-     * @return false = ne sort pas | true = sort de l'écran soit vers la droite ou soit vers le bas
-     */
-    protected boolean worldLimit(final Environment environment)
-    {
-        double widthMap = (environment.getTileMaps().getWidth()*environment.scaleMultiplicatorWidth*TileMaps.TILE_DEFAULT_SIZE) ;
-
-        boolean exceedsScreenOnLeft = offset[0] == Entity.IS_MOVING_LEFT && getX() < 0;
-        boolean exceedsScreenOnRight = offset[0] == Entity.IS_MOVING_RIGHT && getX()+CollideObjectType.COLLISION_TOLERANCE+velocity + getRect().getWidth() + 3 >= widthMap;
-        return (exceedsScreenOnLeft || exceedsScreenOnRight);
-    }
-
-
     public DoubleProperty getPvProperty() { return this.pv; }
     public DoubleProperty getXProperty() { return this.x; }
     public DoubleProperty getYProperty(){ return this.y; }
     public Animation getAnimation() { return this.animation; }
-    public Gravity getGravity() { return this.gravity; }
     public Rect getRect() { return this.rect; }
-    public double getVelocity() { return this.velocity; }
     public double getPvMax() { return this.pv.get(); }
     public double getPv() { return this.pv.get(); }
     public double getX() { return this.x.get(); }
     public double getY() { return this.y.get(); }
 
     public void setRect(int width, int height) { this.rect = new Rect(x.get(), y.get(), width, height); }
-    public void setVelocity(double velocity) { this.velocity = velocity; }
     public void setPv(double pv) { this.pv.set(pv); this.pvMax = pv;}
     public void setX(double x) { this.x.set(x); }
     public void setY(double y) { this.y.set(y); }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/entity/EntityMovable.java b/src/main/java/fr/sae/terraria/modele/entities/entity/EntityMovable.java
new file mode 100644
index 0000000..341b036
--- /dev/null
+++ b/src/main/java/fr/sae/terraria/modele/entities/entity/EntityMovable.java
@@ -0,0 +1,152 @@
+package fr.sae.terraria.modele.entities.entity;
+
+import fr.sae.terraria.modele.Environment;
+import fr.sae.terraria.modele.TileMaps;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+public abstract class EntityMovable extends Entity
+{
+    protected final Environment environment;
+    protected final Gravity gravity;
+
+    protected double velocity;
+    protected boolean air;
+    public int[] offset;
+
+
+    protected EntityMovable(int x, int y, final Environment environment)
+    {
+        super(x, y);
+        this.environment = environment;
+
+        this.gravity = new Gravity();
+        this.offset = new int[2];
+        this.air = false;
+        this.velocity = 1;
+    }
+
+    protected EntityMovable(final Environment environment) { this(0, 0, environment); }
+
+    @Override public abstract void updates();
+    public abstract void move();
+
+    /**
+     * Permet de detectés les collisions sur la carte et de son environment.
+     *
+     * @param environment Permet de savoir les tailles des tiles et d'avoir la matrixe de données de la carte.
+     * @return Il vas retourner une HashMap qui ne contiendra pas de clé ou 4 clés maximum
+     *         left, right, top, bottom sera les clés qui peuvent être present lors d'une detection de collision.
+     *         Il permettra de faire des actions personnalisées les actions faites par l'entité suivant d'où il rentre en collision avec son environment.
+     */
+    protected Map<String, Boolean> collide(final Environment environment)
+    {
+        int widthTile = environment.widthTile; int heightTile = environment.heightTile;
+        TileMaps tileMaps = environment.getTileMaps();
+        Map<String, Boolean> whereCollide = new HashMap<>();
+
+        // Detection vide en dessous
+        int yBottom = (int)  (this.getY()+getRect().getHeight()-CollideObjectType.COLLISION_TOLERANCE)/heightTile;
+        int posX = (int) ((this.getX()+((this.offset[0] < 0) ? CollideObjectType.COLLISION_TOLERANCE : -CollideObjectType.COLLISION_TOLERANCE)) + ((this.offset[0] > 0) ? getRect().getWidth() : 0))/widthTile;
+
+        boolean footInTheVoid = tileMaps.getTile(posX, yBottom) == TileMaps.SKY;
+        if (footInTheVoid)
+            this.air = true;
+
+        // Detection collision gauche droite
+        if (this.offset[0] != Entity.IDLE) {
+            int yTop = (int) (getY()+CollideObjectType.COLLISION_TOLERANCE)/heightTile;
+            int futurePositionXLeft = (int) ((getX()+CollideObjectType.COLLISION_TOLERANCE)+(velocity*offset[0]))/widthTile;
+            int futurePositionXRight = (int) ((getX()+(-CollideObjectType.COLLISION_TOLERANCE)+(velocity*offset[0])) + (getRect().getWidth()))/widthTile;
+
+            whereCollide.put("right", tileMaps.getTile(futurePositionXRight, yTop) != TileMaps.SKY || tileMaps.getTile(futurePositionXRight, yBottom) != TileMaps.SKY);
+            whereCollide.put("left", tileMaps.getTile(futurePositionXLeft, yTop) != TileMaps.SKY || tileMaps.getTile(futurePositionXLeft, yBottom) != TileMaps.SKY);
+        }
+
+        // Detection collision en bas et en haut
+        if (this.offset[1] != Entity.IDLE) {
+            int xLeft = (int) (getX()+CollideObjectType.COLLISION_TOLERANCE)/widthTile;
+            int xRight = (int) ((getX()+getRect().getWidth())-CollideObjectType.COLLISION_TOLERANCE)/widthTile;
+
+
+            // Tombe
+            if (this.offset[1] == Entity.IS_FALLING) {
+                this.gravity.degInit = 0;
+                double futurePositionY = gravity.formulaOfTrajectory() ;
+                boolean isCollideBottom = tileMaps.getTile(xLeft, (int) (futurePositionY + this.rect.getHeight())/heightTile) != TileMaps.SKY || tileMaps.getTile(xRight, (int) (futurePositionY + CollideObjectType.COLLISION_TOLERANCE +this.rect.getHeight())/heightTile) != TileMaps.SKY;
+                if (isCollideBottom) {
+                    this.gravity.setJumpPosInit(this);
+                    this.gravity.timer = 0;
+                    this.offset[1] = Entity.IDLE;
+                } else setY(futurePositionY);
+                // Saute
+            } else if (this.offset[1] == Entity.IS_JUMPING) {
+                double futurePositionY = gravity.formulaOfTrajectory();
+
+                boolean isCollideTop = tileMaps.getTile(xLeft, (int) (futurePositionY + CollideObjectType.COLLISION_TOLERANCE)/heightTile) != TileMaps.SKY || tileMaps.getTile(xRight, (int) (futurePositionY + CollideObjectType.COLLISION_TOLERANCE)/heightTile) != TileMaps.SKY;
+                // Quand le joueur monte
+                if (this.gravity.flightTime >= this.gravity.timer ) {
+                    if (isCollideTop) {
+                        this.fall();
+                        this.gravity.timer = 0;
+                        this.gravity.setJumpPosInit(this);
+                    } else this.setY(futurePositionY);
+                    // Quand le joueur decent
+                } else {
+                    boolean isCollideBottom = tileMaps.getTile(xLeft, (int) ((futurePositionY + this.rect.getHeight()) - CollideObjectType.COLLISION_TOLERANCE)/heightTile) != TileMaps.SKY || tileMaps.getTile(xRight,(int) ((futurePositionY + this.rect.getHeight()) - CollideObjectType.COLLISION_TOLERANCE)/heightTile) != TileMaps.SKY;
+
+                    if (isCollideTop) {
+                        this.fall();
+                    } else if (isCollideBottom) {
+                        this.gravity.setJumpPosInit(this);
+                        this.gravity.timer = 0;
+                        this.offset[1] = Entity.IDLE;
+                        this.air = false;
+                    } else this.setY(futurePositionY);
+                }
+            }
+        } else if (this.air) {
+            this.gravity.degInit = 0;
+            int xLeft = (int) (getX()+CollideObjectType.COLLISION_TOLERANCE)/widthTile;
+            int xRight = (int) (getX()-CollideObjectType.COLLISION_TOLERANCE+getRect().getWidth())/widthTile;
+            double futurePositionY = this.gravity.formulaOfTrajectory() + this.rect.getHeight();
+
+            boolean isCollideBottom = tileMaps.getTile(xLeft, (int) (futurePositionY - CollideObjectType.COLLISION_TOLERANCE)/heightTile) != TileMaps.SKY || tileMaps.getTile(xRight, (int) (futurePositionY - CollideObjectType.COLLISION_TOLERANCE)/heightTile) != TileMaps.SKY;
+            if (isCollideBottom) {
+                this.offset[1] = Entity.IDLE;
+                this.air = false;
+                this.gravity.setJumpPosInit(this);
+            } else setY(futurePositionY - this.rect.getHeight());
+        }
+
+        return whereCollide;
+    }
+
+    protected void moveRight() { this.offset[0] = Entity.IS_MOVING_RIGHT; }
+    protected void moveLeft() { this.offset[0] = Entity.IS_MOVING_LEFT; }
+    protected void jump() { this.offset[1] = Entity.IS_JUMPING; }
+    protected void fall() { this.offset[1] = Entity.IS_FALLING; }
+
+    /**
+     * Lorsque le joueur sort de l'ecran et/ou de la carte, la fonction retourne une valeurs boolean qui sera manipulable sur les classes qui l'héritera.
+     * @param environment Permet d'avoir les informations naicessaire sur la carte et l'écran pour que l'entité ne sorte pas.
+     *
+     * @return false = ne sort pas | true = sort de l'écran soit vers la droite ou soit vers le bas
+     */
+    protected boolean worldLimit(final Environment environment)
+    {
+        double widthMap = (environment.getTileMaps().getWidth()*environment.scaleMultiplicatorWidth*TileMaps.TILE_DEFAULT_SIZE) ;
+
+        boolean exceedsScreenOnLeft = offset[0] == Entity.IS_MOVING_LEFT && getX() < 0;
+        boolean exceedsScreenOnRight = offset[0] == Entity.IS_MOVING_RIGHT && getX()+CollideObjectType.COLLISION_TOLERANCE+velocity + getRect().getWidth() + 3 >= widthMap;
+        return (exceedsScreenOnLeft || exceedsScreenOnRight);
+    }
+
+
+    public double getVelocity() { return this.velocity; }
+    public Gravity getGravity() { return this.gravity; }
+
+    public void setVelocity(double velocity) { this.velocity = velocity; }
+}
diff --git a/src/main/java/fr/sae/terraria/modele/entities/entity/MovableObjectType.java b/src/main/java/fr/sae/terraria/modele/entities/entity/MovableObjectType.java
deleted file mode 100644
index 3202f79..0000000
--- a/src/main/java/fr/sae/terraria/modele/entities/entity/MovableObjectType.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package fr.sae.terraria.modele.entities.entity;
-
-
-/**
- * <h1>Movable Object Type</h1>
- * <h2>Interface utile à un objet qui hérite d'Entity</h2>
- * <img src="https://raw.githubusercontent.com/NaulaN/SAE-Terraria-Like/develop/src/main/resources/fr/sae/terraria/docs/FonctionsMovable.PNG"/>
- * <h2><u>Description:</u></h2>
- * <p>Il permet d'implementer les fonctions qui correspond à une entité qui doit ou qui peut bouger.</p>
- * <p>Il permet surtout de rendre public les functions qui sont en protected donc pas accessible à l'extérieur de la classe</p>
- * @see Entity
- *
- * @author CHRZASZCZ Naulan
- */
-public interface MovableObjectType
-{
-
-
-    /**
-     * Permet que l'entité bouge grâce aux offset modifier à chaque passage de la boucle du jeu.
-     * Donc, il doit être appelé dans "updates()" pour que le joueur puisse être déplacé.
-     *
-     * @see Entity
-     */
-    void move();
-
-    /**
-     * Permet que l'entité lors de ses déplacements, qui ne sortent pas de la carte et aussi nis de l'écran.
-     * Pour l'utilisé dans une classe que vous avez récemment créé, vous devez appeler la fonction dans Entité grâce à "super.worldLimit()".
-     *
-     * @see Entity
-     */
-    void worldLimit();
-
-    /**
-     * Modifie l'indice 0 dans la variable offset qui permet de le déplacer l'entité vers la droite.
-     * Pour l'utilisé dans une classe que vous avez récemment créé, vous devez appeler la fonction dans Entité grâce à "super.moveRight()".
-     *
-     * @see Entity
-     */
-    void moveRight();
-
-    /**
-     * Modifie l'indice 0 dans la variable offset qui permet de le déplacer l'entité vers la gauche.
-     * Pour l'utilisé dans une classe que vous avez récemment créé, vous devez appeler la fonction dans Entité grâce à "super.moveLeft()".
-     *
-     * @see Entity
-     */
-    void moveLeft();
-
-    /**
-     * Modifie l'indice 1 dans la variable offset qui permet d'informer l'entité qui est en train de sauter
-     * Pour l'utilisé dans une classe que vous avez récemment créé, vous devez appeler la fonction dans Entité grâce à "super.jump()".
-     *
-     * @see Entity
-     */
-    void jump();
-
-    /**
-     * Modifie l'indice 1 dans la variable offset qui permet d'informer l'entité qui est en train de tomber
-     * Pour l'utilisé dans une classe que vous avez récemment créé, vous devez appeler la fonction dans Entité grâce à "super.fall()".
-     *
-     * @see Entity
-     */
-    void fall();
-}
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
index d4bbf6d..cc6e72e 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
@@ -16,7 +16,7 @@
 import java.util.Objects;
 
 
-public class Player extends Entity implements CollideObjectType, MovableObjectType, CollapsibleObjectType, SpawnableObjectType
+public class Player extends EntityMovable implements CollideObjectType, CollapsibleObjectType, SpawnableObjectType
 {
     public static final int BREAK_BLOCK_DISTANCE = 1;
 
@@ -25,17 +25,13 @@ public class Player extends Entity implements CollideObjectType, MovableObjectTy
 
     private final ObjectProperty objectWasPickup;
 
-
-    private final Environment environment;
-
     private final Inventory inventory;
     private Stack stackSelected;
 
 
     public Player(final Environment environment)
     {
-        super();
-        this.environment = environment;
+        super(0, 0, environment);
         this.inventory = new Inventory(this);
 
         this.animation = new Animation();
@@ -98,12 +94,7 @@ public Player(final Environment environment)
         this.getGravity().setYInit(y);
     }
 
-    @Override public void moveRight() { super.moveRight(); }
-    @Override public void moveLeft() { super.moveLeft(); }
-    @Override public void jump() { super.jump(); }
-    @Override public void fall() { super.fall(); }
-
-    @Override public void worldLimit()
+    public void worldLimit()
     {
         if (super.worldLimit(this.environment))
             this.offset[0] = Entity.IDLE;
diff --git a/src/main/java/fr/sae/terraria/vue/SlimeView.java b/src/main/java/fr/sae/terraria/vue/SlimeView.java
index 88df45c..9b1e7e5 100644
--- a/src/main/java/fr/sae/terraria/vue/SlimeView.java
+++ b/src/main/java/fr/sae/terraria/vue/SlimeView.java
@@ -2,7 +2,6 @@
 
 import fr.sae.terraria.modele.TileMaps;
 import fr.sae.terraria.modele.entities.Slime;
-import fr.sae.terraria.modele.entities.entity.Entity;
 import javafx.geometry.Rectangle2D;
 import javafx.scene.image.Image;
 import javafx.scene.image.ImageView;

From cef0038965b362c765b928c231aed0a7fd774f77 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Thu, 9 Jun 2022 14:37:28 +0200
Subject: [PATCH 04/97] Clean

---
 src/main/java/fr/sae/terraria/modele/entities/Arrow.java  | 2 --
 src/main/java/fr/sae/terraria/modele/entities/Rabbit.java | 2 --
 2 files changed, 4 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/modele/entities/Arrow.java b/src/main/java/fr/sae/terraria/modele/entities/Arrow.java
index 8b0ba10..7e30145 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/Arrow.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/Arrow.java
@@ -8,13 +8,11 @@
 
 public class Arrow extends EntityMovable implements StowableObjectType, CollideObjectType
 {
-    private final Environment environment;
 
 
     public Arrow(final Environment environment, int x, int y, int velocity)
     {
         super(x, y, environment);
-        this.environment = environment;
 
         this.velocity = velocity;
     }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/Rabbit.java b/src/main/java/fr/sae/terraria/modele/entities/Rabbit.java
index 5a0da73..1b15411 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/Rabbit.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/Rabbit.java
@@ -21,14 +21,12 @@ public class Rabbit extends EntityMovable implements CollideObjectType, Reproduc
     public static final double LUCK_OF_JUMPING = .5;
     public static final int JUMP_FREQUENCY = 50;
 
-    private final Environment environment;
     private final Animation animation;
 
 
     public Rabbit(final Environment environment, int x, int y)
     {
         super(x, y, environment);
-        this.environment = environment;
 
         this.setPv(3);
         this.animation = new Animation();

From d66b42762b939f87ef1698e4d4dad568153fc8c0 Mon Sep 17 00:00:00 2001
From: Tiago Lousa <tig2468.a@gmail.com>
Date: Thu, 9 Jun 2022 16:29:52 +0200
Subject: [PATCH 05/97] =?UTF-8?q?ajout=20vodka=20+=20clear=20impuret=C3=A9?=
 =?UTF-8?q?=20tree=20sheet?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../modele/entities/blocks/TallGrass.java     |  11 ++++++++---
 .../terraria/modele/entities/items/Vodka.java |  10 ++++++++++
 .../sae/terraria/vue/hud/InventoryView.java   |   2 ++
 .../resources/fr/sae/terraria/loots/vodka.png | Bin 0 -> 5052 bytes
 .../fr/sae/terraria/sprites/tree-sheet.png    | Bin 9109 -> 9024 bytes
 5 files changed, 20 insertions(+), 3 deletions(-)
 create mode 100644 src/main/java/fr/sae/terraria/modele/entities/items/Vodka.java
 create mode 100644 src/main/resources/fr/sae/terraria/loots/vodka.png

diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/TallGrass.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/TallGrass.java
index 9fd6929..9acb301 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/TallGrass.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/TallGrass.java
@@ -6,6 +6,7 @@
 import fr.sae.terraria.modele.entities.entity.ReproductiveObjectType;
 import fr.sae.terraria.modele.entities.entity.SpawnableObjectType;
 import fr.sae.terraria.modele.entities.items.Fiber;
+import fr.sae.terraria.modele.entities.items.Vodka;
 import javafx.beans.property.DoubleProperty;
 import javafx.beans.property.SimpleDoubleProperty;
 
@@ -15,10 +16,10 @@
 
 public class TallGrass extends Block implements ReproductiveObjectType, SpawnableObjectType
 {
-    public static final int WHEN_SPAWN_A_TALL_GRASS = 2_500;
-    public static final double TALL_GRASS_SPAWN_RATE = .3;
+    public static final int WHEN_SPAWN_A_TALL_GRASS = 50;
+    public static final double TALL_GRASS_SPAWN_RATE = .8;
     public static final double REPRODUCTION_RATE = 500;
-    public static final double GROWTH_SPEED = .0005;
+    public static final double GROWTH_SPEED = .5;
     public static final int GROWTH_TALL_GRASS_STEP = 6;
     public static final int LOOTS_FIBRE_MAX = 3;
 
@@ -52,6 +53,10 @@ public TallGrass(Environment environment, int x, int y)
         for (int loot = (int) (Math.random()*3)+1; loot < LOOTS_FIBRE_MAX; loot++)
             this.environment.getPlayer().pickup(new Fiber());
         this.environment.getEntities().remove(this);
+
+        if (Math.random() < 0.5){
+            this.environment.getPlayer().pickup(new Vodka());
+        }
     }
 
     /** Reproduit les hautes herbes à gauche et à droite de la haute herbe parente */
diff --git a/src/main/java/fr/sae/terraria/modele/entities/items/Vodka.java b/src/main/java/fr/sae/terraria/modele/entities/items/Vodka.java
new file mode 100644
index 0000000..adfd28d
--- /dev/null
+++ b/src/main/java/fr/sae/terraria/modele/entities/items/Vodka.java
@@ -0,0 +1,10 @@
+package fr.sae.terraria.modele.entities.items;
+
+import fr.sae.terraria.modele.entities.entity.EatableObjectType;
+
+public class Vodka extends Item implements EatableObjectType {
+    @Override
+    public void eat() {
+
+    }
+}
diff --git a/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java b/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java
index 801384c..7a6fad0 100644
--- a/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java
+++ b/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java
@@ -134,6 +134,8 @@ else if (item instanceof Sword)
                         view.setImage(View.loadAnImage("tools/sword.png", itemInventoryWidth, itemInventoryHeight));
                     else if (item instanceof Arrow)
                         view.setImage(null);    // TODO
+                    else if (item instanceof Vodka)
+                        view.setImage(View.loadAnImage("loots/vodka.png", itemInventoryWidth,itemInventoryHeight));
 
                     // Actualise le nombre d'item à l'écran
                     this.texts.get(c.getTo()-1).setText(String.valueOf(stack.getNbItems()));
diff --git a/src/main/resources/fr/sae/terraria/loots/vodka.png b/src/main/resources/fr/sae/terraria/loots/vodka.png
new file mode 100644
index 0000000000000000000000000000000000000000..a33f575f949068432947d70e33598f6d7df03480
GIT binary patch
literal 5052
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
IIxs%-FIKmW`~Uy|

literal 0
HcmV?d00001

diff --git a/src/main/resources/fr/sae/terraria/sprites/tree-sheet.png b/src/main/resources/fr/sae/terraria/sprites/tree-sheet.png
index 77a150d0eb2f68d19f523989a2cf281ccb8d056e..3c07ff119d6e9c929c0ff8898cf40b6845d2a3c4 100644
GIT binary patch
delta 5120
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

delta 5357
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
LNkvXXu0mjfX?8>6


From 10327b0d3960e43a17816659c0ca8be7728ca100 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Thu, 9 Jun 2022 21:08:46 +0200
Subject: [PATCH 06/97] Clean

---
 .../modele/entities/blocks/TallGrass.java     | 15 ++++++-----
 .../terraria/modele/entities/items/Vodka.java | 25 ++++++++++++++++---
 2 files changed, 31 insertions(+), 9 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/TallGrass.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/TallGrass.java
index 9acb301..7209deb 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/TallGrass.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/TallGrass.java
@@ -16,7 +16,7 @@
 
 public class TallGrass extends Block implements ReproductiveObjectType, SpawnableObjectType
 {
-    public static final int WHEN_SPAWN_A_TALL_GRASS = 50;
+    public static final int WHEN_SPAWN_A_TALL_GRASS = 2_500;
     public static final double TALL_GRASS_SPAWN_RATE = .8;
     public static final double REPRODUCTION_RATE = 500;
     public static final double GROWTH_SPEED = .5;
@@ -45,18 +45,21 @@ public TallGrass(Environment environment, int x, int y)
             tallGrassGrowth.set(tallGrassGrowth.get() + GROWTH_SPEED);
     }
 
-    /** Joue un son et donne au joueur entre 1 et 3 de fibre */
+    /**
+     * Joue un son et donne au joueur entre 1 et 3 de fibre avec un pourcentage de chance d'avoir un easter egg
+     */
     @Override public void breaks()
     {
         Environment.playSound("sound/cut.wav", false);
 
         for (int loot = (int) (Math.random()*3)+1; loot < LOOTS_FIBRE_MAX; loot++)
             this.environment.getPlayer().pickup(new Fiber());
-        this.environment.getEntities().remove(this);
 
-        if (Math.random() < 0.5){
-            this.environment.getPlayer().pickup(new Vodka());
-        }
+        boolean mustDropVodka = Math.random() < Vodka.DROP_RATE;
+        if (mustDropVodka)
+            this.environment.getPlayer().pickup(new Vodka(environment));
+
+        this.environment.getEntities().remove(this);
     }
 
     /** Reproduit les hautes herbes à gauche et à droite de la haute herbe parente */
diff --git a/src/main/java/fr/sae/terraria/modele/entities/items/Vodka.java b/src/main/java/fr/sae/terraria/modele/entities/items/Vodka.java
index adfd28d..1a1732f 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/items/Vodka.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/items/Vodka.java
@@ -1,10 +1,29 @@
 package fr.sae.terraria.modele.entities.items;
 
+import fr.sae.terraria.modele.Environment;
 import fr.sae.terraria.modele.entities.entity.EatableObjectType;
 
-public class Vodka extends Item implements EatableObjectType {
-    @Override
-    public void eat() {
+
+/**
+ * <h1>EasterEgg</h1>
+ * <h2><u>Description:</u></h2>
+ * <p>Ce drop lorsque le joueur casse des hautes herbes et une fois bu, l'écran sera troublé</p>
+ */
+public class Vodka extends Item implements EatableObjectType
+{
+    public static final double DROP_RATE = .1;
+
+    private final Environment environment;
+
+
+    public Vodka(final Environment environment)
+    {
+        super();
+        this.environment = environment;
+    }
+
+    @Override public void eat()
+    {
 
     }
 }

From f843f6899133f3a874d99eff7523c620784cf891 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Fri, 10 Jun 2022 10:13:10 +0200
Subject: [PATCH 07/97] Lapin disparait lorsqu'il meurt

---
 .../sae/terraria/modele/entities/Rabbit.java  |  2 +-
 .../java/fr/sae/terraria/vue/RabbitView.java  |  3 +++
 .../fr/sae/terraria/vue/TileMapsView.java     | 21 +++++++++++++++----
 3 files changed, 21 insertions(+), 5 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/modele/entities/Rabbit.java b/src/main/java/fr/sae/terraria/modele/entities/Rabbit.java
index 1b15411..41f05d2 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/Rabbit.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/Rabbit.java
@@ -124,7 +124,7 @@ public Rabbit(final Environment environment, int x, int y)
         this.getGravity().setYInit(y);
         this.setRect(environment.widthTile, environment.heightTile);
         this.environment.getEntities().add(0, this);
-        this.environment.getRabbits().add(0, this);
+        this.environment.getRabbits().add(this);
     }
 
     /** Modifie l'offset qui permet de le déplacer vers la droite */
diff --git a/src/main/java/fr/sae/terraria/vue/RabbitView.java b/src/main/java/fr/sae/terraria/vue/RabbitView.java
index 0c9e533..2ed3744 100644
--- a/src/main/java/fr/sae/terraria/vue/RabbitView.java
+++ b/src/main/java/fr/sae/terraria/vue/RabbitView.java
@@ -61,4 +61,7 @@ public void displayRabbit(final Pane display)
         this.setAnimation();
         display.getChildren().add(this.rabbitImgView);
     }
+
+
+    public ImageView getRabbitImgView() { return this.rabbitImgView; }
 }
diff --git a/src/main/java/fr/sae/terraria/vue/TileMapsView.java b/src/main/java/fr/sae/terraria/vue/TileMapsView.java
index eb01e53..8865ff9 100644
--- a/src/main/java/fr/sae/terraria/vue/TileMapsView.java
+++ b/src/main/java/fr/sae/terraria/vue/TileMapsView.java
@@ -20,6 +20,8 @@
 
 public class TileMapsView
 {
+    private final List<ImageView> rabbitsView = new ArrayList<>();
+
     private final Image torchImg;
     private final Image floorTopImg;
     private final Image floorLeftImg;
@@ -29,6 +31,7 @@ public class TileMapsView
     private final Image dirtImg;
     private final Image tallGrassImg;
 
+    private final Pane displayHostileBeings;
     private final Pane display;
 
     private final Environment environment;
@@ -51,6 +54,7 @@ public TileMapsView(Environment environment,
         super();
         this.environment = environment;
         this.display = displayTileMap;
+        this.displayHostileBeings = displayHostileBeings;
 
         this.tileHeight = (int) (TileMaps.TILE_DEFAULT_SIZE * scaleMultiplicatorHeight);
         this.tileWidth = (int) (TileMaps.TILE_DEFAULT_SIZE * scaleMultiplicatorWidth);
@@ -72,10 +76,6 @@ public TileMapsView(Environment environment,
                         this.createTree((Tree) c.getList().get(0));
                     if (c.getList().get(0) instanceof TallGrass)
                         this.createTallGrass((TallGrass) c.getList().get(0));
-                    if (c.getList().get(0) instanceof Rabbit) {
-                        RabbitView rabbitView = new RabbitView((Rabbit) c.getList().get(0), scaleMultiplicatorWidth, scaleMultiplicatorHeight);
-                        rabbitView.displayRabbit(displayHostileBeings);
-                    }
                     if (c.getList().get(0) instanceof Slime) {
                         SlimeView slimeView = new SlimeView((Slime) c.getList().get(0), scaleMultiplicatorWidth, scaleMultiplicatorHeight);
                         slimeView.displaySlime(displayHostileBeings);
@@ -110,6 +110,19 @@ public TileMapsView(Environment environment,
                 }
             }
         });
+
+        this.environment.getRabbits().addListener((ListChangeListener<? super Rabbit>) c -> {
+            while (c.next()) {
+                if (c.wasAdded()) {
+                    RabbitView rabbitView = new RabbitView(c.getList().get(0), scaleMultiplicatorWidth, scaleMultiplicatorHeight);
+                    rabbitView.displayRabbit(this.displayHostileBeings);
+                    this.rabbitsView.add(rabbitView.getRabbitImgView());
+                } else if (c.wasRemoved()) {
+                    this.displayHostileBeings.getChildren().remove(this.rabbitsView.get(c.getTo()));
+                    this.rabbitsView.remove(c.getTo());
+                }
+            }
+        });
     }
 
     /** Decompose la carte pour afficher un à un les tiles à l'écran */

From 7441fd464443dd854236e429a183c4a5a06927a0 Mon Sep 17 00:00:00 2001
From: Tiago Lousa <tig2468.a@gmail.com>
Date: Fri, 10 Jun 2022 10:49:43 +0200
Subject: [PATCH 08/97] fix items mangeables + ajout view image vdka

---
 .../java/fr/sae/terraria/controller/GameController.java   | 4 ++--
 .../fr/sae/terraria/modele/entities/blocks/TallGrass.java | 8 +++++---
 .../terraria/modele/entities/player/inventory/Stack.java  | 2 ++
 .../java/fr/sae/terraria/vue/hud/ItemSelectedView.java    | 4 ++++
 4 files changed, 13 insertions(+), 5 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/controller/GameController.java b/src/main/java/fr/sae/terraria/controller/GameController.java
index 024d8e4..e3d0887 100644
--- a/src/main/java/fr/sae/terraria/controller/GameController.java
+++ b/src/main/java/fr/sae/terraria/controller/GameController.java
@@ -131,8 +131,8 @@ private void addKeysEventListener(final Stage stage)
             int distanceBetweenBlockPlayerAxisY = Math.abs(yPlayer - yBlock);
 
             boolean isOneBlockDistance = distanceBetweenBlockPlayerAxisY >= 0 && distanceBetweenBlockPlayerAxisY <= Player.BREAK_BLOCK_DISTANCE && distanceBetweenBlockPlayerAxisX >= 0 && distanceBetweenBlockPlayerAxisX <= Player.BREAK_BLOCK_DISTANCE;
-            if (this.player.getStackSelected() instanceof EatableObjectType) {
-                ((EatableObjectType) this.player.getStackSelected()).eat();
+            if (this.player.getStackSelected().getItem() instanceof EatableObjectType) {
+                ((EatableObjectType) this.player.getStackSelected().getItem()).eat();
             } else if (isOneBlockDistance) {
                 if (click.getButton().equals(MouseButton.PRIMARY))
                     this.breakBlock(rectangle);
diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/TallGrass.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/TallGrass.java
index 7209deb..33ecf31 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/TallGrass.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/TallGrass.java
@@ -45,9 +45,7 @@ public TallGrass(Environment environment, int x, int y)
             tallGrassGrowth.set(tallGrassGrowth.get() + GROWTH_SPEED);
     }
 
-    /**
-     * Joue un son et donne au joueur entre 1 et 3 de fibre avec un pourcentage de chance d'avoir un easter egg
-     */
+    /** Joue un son et donne au joueur entre 1 et 3 de fibre */
     @Override public void breaks()
     {
         Environment.playSound("sound/cut.wav", false);
@@ -60,6 +58,10 @@ public TallGrass(Environment environment, int x, int y)
             this.environment.getPlayer().pickup(new Vodka(environment));
 
         this.environment.getEntities().remove(this);
+
+        if (Math.random() < 0.5){
+            this.environment.getPlayer().pickup(new Vodka(environment));
+        }
     }
 
     /** Reproduit les hautes herbes à gauche et à droite de la haute herbe parente */
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
index df3565f..b354372 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
@@ -62,6 +62,8 @@ else if (object instanceof Wood && this.item instanceof Wood)
             return true;
         else if (object instanceof Axe && this.item instanceof Axe)
             return true;
+        else if (object instanceof Vodka && this.item instanceof Vodka)
+            return true;
         else if (object instanceof Bow && this.item instanceof Bow)
             return true;
         else if (object instanceof Pickaxe && this.item instanceof Pickaxe)
diff --git a/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java b/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java
index 3567ec8..2d9234f 100644
--- a/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java
+++ b/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java
@@ -39,6 +39,7 @@ public class ItemSelectedView
     private final Image woodItemImg;
     private final Image torchItemImg;
     private final Image pickaxeItemImg;
+    private final Image vodkaItemImg;
 
     private final Pane display;
 
@@ -53,6 +54,7 @@ public ItemSelectedView(Pane display, Player player, double scaleMultiplicatorWi
         int heightItem = heightTile/2;
 
         this.itemSelectedImgView = new ImageView();
+        this.vodkaItemImg = View.loadAnImage("loots/vodka.png",widthItem,heightItem);
         this.dirtItemImg = View.loadAnImage("tiles/floor-top.png", widthItem, heightItem);
         this.stoneItemImg = View.loadAnImage("tiles/rock-fill.png", widthItem, heightItem);
         this.torchItemImg = View.loadAnImage("tiles/torch.png", widthItem, heightItem);
@@ -94,6 +96,8 @@ else if (item instanceof Iron)
                     this.itemSelectedImgView.setImage(this.ironItemImg);
                 else if (item instanceof Meat)
                     this.itemSelectedImgView.setImage(this.meatItemImg);
+                else if (item instanceof Vodka)
+                    this.itemSelectedImgView.setImage(this.vodkaItemImg);
                 else if (item instanceof Pierre)
                     this.itemSelectedImgView.setImage(this.pierreItemImg);
                 else if (item instanceof Silex)

From 7c95924d276b4cc6d24db329b82d0eeb5fe3af5b Mon Sep 17 00:00:00 2001
From: Tiago Lousa <tig2468.a@gmail.com>
Date: Fri, 10 Jun 2022 11:00:48 +0200
Subject: [PATCH 09/97] fix null pointer exception

---
 src/main/java/fr/sae/terraria/controller/GameController.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/main/java/fr/sae/terraria/controller/GameController.java b/src/main/java/fr/sae/terraria/controller/GameController.java
index e3d0887..895a2da 100644
--- a/src/main/java/fr/sae/terraria/controller/GameController.java
+++ b/src/main/java/fr/sae/terraria/controller/GameController.java
@@ -131,7 +131,7 @@ private void addKeysEventListener(final Stage stage)
             int distanceBetweenBlockPlayerAxisY = Math.abs(yPlayer - yBlock);
 
             boolean isOneBlockDistance = distanceBetweenBlockPlayerAxisY >= 0 && distanceBetweenBlockPlayerAxisY <= Player.BREAK_BLOCK_DISTANCE && distanceBetweenBlockPlayerAxisX >= 0 && distanceBetweenBlockPlayerAxisX <= Player.BREAK_BLOCK_DISTANCE;
-            if (this.player.getStackSelected().getItem() instanceof EatableObjectType) {
+            if (this.player.getStackSelected() != null && this.player.getStackSelected().getItem() instanceof EatableObjectType ) {
                 ((EatableObjectType) this.player.getStackSelected().getItem()).eat();
             } else if (isOneBlockDistance) {
                 if (click.getButton().equals(MouseButton.PRIMARY))

From 38eec349589ff0f28ed3557993cb13a9dc80f121 Mon Sep 17 00:00:00 2001
From: Tiago Lousa <tig2468.a@gmail.com>
Date: Fri, 10 Jun 2022 19:37:42 +0200
Subject: [PATCH 10/97] vodka disparait quand on l'utilise

---
 .../java/fr/sae/terraria/modele/entities/items/Vodka.java   | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/main/java/fr/sae/terraria/modele/entities/items/Vodka.java b/src/main/java/fr/sae/terraria/modele/entities/items/Vodka.java
index 1a1732f..ab03ed5 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/items/Vodka.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/items/Vodka.java
@@ -2,6 +2,8 @@
 
 import fr.sae.terraria.modele.Environment;
 import fr.sae.terraria.modele.entities.entity.EatableObjectType;
+import fr.sae.terraria.modele.entities.player.Player;
+import fr.sae.terraria.modele.entities.player.inventory.Inventory;
 
 
 /**
@@ -24,6 +26,8 @@ public Vodka(final Environment environment)
 
     @Override public void eat()
     {
-
+        Player player = environment.getPlayer();
+        Inventory inventory = player.getInventory();
+        inventory.get().get(inventory.getPosCursor()).remove();
     }
 }

From c2e4730e6efec79a2f910b0a7ded01e8ece8e728 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Fri, 10 Jun 2022 20:17:09 +0200
Subject: [PATCH 11/97] =?UTF-8?q?Refonte=20complet=20de=20TileMapsView,=20?=
 =?UTF-8?q?Fix=20probleme=20avec=20les=20arbres=20est=20sont=20d=C3=A9sorm?=
 =?UTF-8?q?ais=20cassable=20et=20disparais=20une=20fois=20casser,=20les=20?=
 =?UTF-8?q?lapins=20disparaissent=20une=20fois=20tu=C3=A9,=20les=20slimes?=
 =?UTF-8?q?=20disparaissent=20une=20fois=20tu=C3=A9,=20le=20systemes=20de?=
 =?UTF-8?q?=20suppresion=20des=20elements=20de=20la=20vue=20=C3=A0=20?=
 =?UTF-8?q?=C3=A9tais=20optimis=C3=A9,=20animation=20tallgrass=20ajust?=
 =?UTF-8?q?=C3=A9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../terraria/controller/GameController.java   |   1 -
 .../fr/sae/terraria/modele/Environment.java   |  25 +-
 .../sae/terraria/modele/entities/Slime.java   |   4 +-
 .../terraria/modele/entities/blocks/Dirt.java |  12 +-
 .../modele/entities/blocks/Stone.java         |  14 +-
 .../modele/entities/blocks/TallGrass.java     |  18 +-
 .../modele/entities/blocks/Torch.java         |   4 +-
 .../terraria/modele/entities/blocks/Tree.java |   4 +-
 .../java/fr/sae/terraria/vue/LightView.java   |   1 -
 .../java/fr/sae/terraria/vue/SlimeView.java   |   3 +
 .../fr/sae/terraria/vue/TileMapsView.java     | 357 +++++++++---------
 src/main/java/fr/sae/terraria/vue/View.java   |   2 +-
 12 files changed, 239 insertions(+), 206 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/controller/GameController.java b/src/main/java/fr/sae/terraria/controller/GameController.java
index 024d8e4..e2e8e57 100644
--- a/src/main/java/fr/sae/terraria/controller/GameController.java
+++ b/src/main/java/fr/sae/terraria/controller/GameController.java
@@ -150,7 +150,6 @@ private void breakBlock(final Rectangle2D rectangle)
                 ((BreakableObjectType) entity).breaks();
             if (entity instanceof CollapsibleObjectType)    // TODO TEMP, à déplacer
                 ((CollapsibleObjectType) entity).hit();
-
             // Quand tous c'est bien déroulés, aprés avoir trouvé l'entité et l'objet sur l'écran, il arrête de chercher d'autre entité d'où le break
             break;
         }
diff --git a/src/main/java/fr/sae/terraria/modele/Environment.java b/src/main/java/fr/sae/terraria/modele/Environment.java
index 1943e2d..2aef937 100644
--- a/src/main/java/fr/sae/terraria/modele/Environment.java
+++ b/src/main/java/fr/sae/terraria/modele/Environment.java
@@ -3,7 +3,9 @@
 import fr.sae.terraria.Terraria;
 import fr.sae.terraria.modele.entities.Rabbit;
 import fr.sae.terraria.modele.entities.Slime;
+import fr.sae.terraria.modele.entities.blocks.Block;
 import fr.sae.terraria.modele.entities.blocks.Torch;
+import fr.sae.terraria.modele.entities.blocks.Tree;
 import fr.sae.terraria.modele.entities.entity.CollideObjectType;
 import fr.sae.terraria.modele.entities.entity.Entity;
 import fr.sae.terraria.modele.entities.entity.ReproductiveObjectType;
@@ -29,7 +31,9 @@
 
 public class Environment
 {
-    // Permet d'update toutes les entités en une seule boucle.
+    private final ObservableList<Tree> trees;
+    private final ObservableList<Block> blocks;
+    // Permet update toutes les entités en une seule boucle.
     private final ObservableList<Entity> entities;
     // Range des entities en plus pour permettre facilement de savoir combien son t-il sur la carte pour limiter leur apparition
     private final ObservableList<Rabbit> rabbits;
@@ -71,6 +75,8 @@ public Environment(double scaleMultiplicatorWidth, double scaleMultiplicatorHeig
         this.rabbits = FXCollections.observableArrayList();
         this.slimes = FXCollections.observableArrayList();
         this.torches = FXCollections.observableArrayList();
+        this.blocks = FXCollections.observableArrayList();
+        this.trees = FXCollections.observableArrayList();
 
         this.player = new Player(this);
         this.player.setVelocity(5);
@@ -123,8 +129,11 @@ private void gameLoop()
             }
 
             // Ajoute les entités ReproductiveObjectType
-            for (Entity entity : entitiesAtAdded)
-                this.entities.add(0, entity);
+            for (Entity entity : entitiesAtAdded) {
+                this.entities.add(entity);
+                if (entity instanceof Block)
+                    this.blocks.add((Block) entity);
+            }
             entitiesAtAdded.clear();
 
             // Génère aléatoirement des entités
@@ -132,7 +141,7 @@ private void gameLoop()
             boolean nightTime = this.clock.getMinutes() > (Clock.MINUTES_IN_A_DAY)/2;
             boolean weHaveChangedDay = this.previousDays != this.clock.getDays();
             if (weHaveChangedDay)
-                for (int i = 0; i < 3; i++) // Génère par jour, 3 arbres
+                for (int i = 0; i < 3; i++); // Génère par jour, 3 arbres
                     GenerateEntity.tree(this);
             if (dayTime) {  // Génère certaines entités uniquement pendant le jour
                 GenerateEntity.rabbit(this);
@@ -176,10 +185,12 @@ public static Clip playSound(String path, boolean loop)
     }
 
 
+    public ObservableList<Block> getBlocks() { return this.blocks; }
+    public ObservableList<Tree> getTrees() { return this.trees; }
     public ObservableList<Entity> getEntities() { return this.entities; }
-    public ObservableList<Rabbit> getRabbits() { return rabbits; }
-    public ObservableList<Torch> getTorches() { return torches; }
-    public ObservableList<Slime> getSlimes() { return slimes; }
+    public ObservableList<Rabbit> getRabbits() { return this.rabbits; }
+    public ObservableList<Torch> getTorches() { return this.torches; }
+    public ObservableList<Slime> getSlimes() { return this.slimes; }
     public TileMaps getTileMaps() { return this.tileMaps; }
     public Player getPlayer() { return this.player; }
     public Clock getGameClock() { return this.clock; }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/Slime.java b/src/main/java/fr/sae/terraria/modele/entities/Slime.java
index 2a59a73..c5fe6e0 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/Slime.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/Slime.java
@@ -80,8 +80,8 @@ else if (environment.getPlayer().getX() < this.x.getValue())
         this.getGravity().setXInit(x);
         this.getGravity().setYInit(y);
         this.setRect(environment.widthTile, environment.heightTile);
-        this.environment.getEntities().add(0, this);
-        this.environment.getSlimes().add(0, this);
+        this.environment.getEntities().add(this);
+        this.environment.getSlimes().add(this);
     }
 
     @Override public void moveRight() { super.moveRight(); }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/Dirt.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/Dirt.java
index 8cf8f06..cb22393 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/Dirt.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/Dirt.java
@@ -20,6 +20,7 @@ public class Dirt extends Block implements StowableObjectType, CollideObjectType
 
     private final double xOrigin;
     private final double yOrigin;
+    private int typeOfFloor;
 
 
     public Dirt(Environment environment, int x, int y)
@@ -49,6 +50,7 @@ public Dirt(Environment environment, int x, int y)
             int xIndexTile = (int) (getX()/environment.widthTile);
             this.environment.getTileMaps().setTile(TileMaps.SKY, yIndexTile, xIndexTile);
             this.environment.getEntities().remove(this);
+            this.environment.getBlocks().remove(this);
         }
         this.setPv(this.getPv() - 1);
     }
@@ -58,7 +60,7 @@ public Dirt(Environment environment, int x, int y)
         Environment.playSound("sound/axchop.wav", false);
         int widthTile = this.environment.widthTile;
         int heightTile = this.environment.heightTile;
-        
+
         Entity entity = new Dirt(this.environment, x*widthTile, y*heightTile);
         entity.setRect(widthTile, heightTile);
 
@@ -68,6 +70,12 @@ public Dirt(Environment environment, int x, int y)
             inventory.get().get(inventory.getPosCursor()).remove();
 
         this.environment.getTileMaps().setTile(TileMaps.DIRT, y, x);
-        this.environment.getEntities().add(0, entity);
+        this.environment.getEntities().add(entity);
+        this.environment.getBlocks().add((Dirt) entity);
     }
+
+
+    public int getTypeOfFloor() { return this.typeOfFloor; }
+
+    public void setTypeOfFloor(int type) { this.typeOfFloor = type; }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/Stone.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/Stone.java
index c96fb32..21a3478 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/Stone.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/Stone.java
@@ -54,14 +54,17 @@ public Stone(Environment environment, int x, int y)
             int xIndexTile = (int) (getX()/this.environment.widthTile);
             this.environment.getTileMaps().setTile(TileMaps.SKY, yIndexTile, xIndexTile);
             this.environment.getEntities().remove(this);
+            this.environment.getBlocks().remove(this);
         }
 
         // S'il utilise le bon outil, il commencera à casser le bloc sinon use l'outil sans casser le bloc.
         Stack stack = player.getStackSelected();
-        if (stack.getItem() instanceof Pickaxe)
-            this.setPv(this.getPv() - 1);
-        if (stack.getItem() instanceof Tool)
-            ((Tool) stack.getItem()).use();
+        if (!Objects.isNull(stack.getItem())) {
+            if (stack.getItem() instanceof Pickaxe)
+                this.setPv(this.getPv() - 1);
+            if (stack.getItem() instanceof Tool)
+                ((Tool) stack.getItem()).use();
+        }
     }
 
     @Override public void place(int x, int y)
@@ -79,6 +82,7 @@ public Stone(Environment environment, int x, int y)
             inventory.get().get(inventory.getPosCursor()).remove();
 
         this.environment.getTileMaps().setTile(TileMaps.STONE, y, x);
-        this.environment.getEntities().add(0, entity);
+        this.environment.getEntities().add(entity);
+        this.environment.getBlocks().add((Block) entity);
     }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/TallGrass.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/TallGrass.java
index 7209deb..8b5ecbe 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/TallGrass.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/TallGrass.java
@@ -18,8 +18,8 @@ public class TallGrass extends Block implements ReproductiveObjectType, Spawnabl
 {
     public static final int WHEN_SPAWN_A_TALL_GRASS = 2_500;
     public static final double TALL_GRASS_SPAWN_RATE = .8;
-    public static final double REPRODUCTION_RATE = 500;
-    public static final double GROWTH_SPEED = .5;
+    public static final double REPRODUCTION_RATE = 1_250;
+    public static final double GROWTH_SPEED = .01;
     public static final int GROWTH_TALL_GRASS_STEP = 6;
     public static final int LOOTS_FIBRE_MAX = 3;
 
@@ -41,8 +41,8 @@ public TallGrass(Environment environment, int x, int y)
     @Override public void updates()
     {
         // L'animation de pousse
-        if (tallGrassGrowth.get() < GROWTH_TALL_GRASS_STEP)
-            tallGrassGrowth.set(tallGrassGrowth.get() + GROWTH_SPEED);
+        if (((int) (tallGrassGrowth.get())) < TallGrass.GROWTH_TALL_GRASS_STEP)
+            tallGrassGrowth.set(tallGrassGrowth.get() + TallGrass.GROWTH_SPEED);
     }
 
     /**
@@ -60,6 +60,7 @@ public TallGrass(Environment environment, int x, int y)
             this.environment.getPlayer().pickup(new Vodka(environment));
 
         this.environment.getEntities().remove(this);
+        this.environment.getBlocks().remove(this);
     }
 
     /** Reproduit les hautes herbes à gauche et à droite de la haute herbe parente */
@@ -105,7 +106,9 @@ else if (rightIsAvailable)
                     int xTallGrassChildren = (int) ((left == 0) ? (getX() - widthTile) : (getX() + widthTile));
                     int yTallGrassChildren = (int) getY();
 
-                    children.add(new TallGrass(this.environment, xTallGrassChildren, yTallGrassChildren));
+                    TallGrass tallGrassChildren = new TallGrass(this.environment, xTallGrassChildren, yTallGrassChildren);
+                    tallGrassChildren.setRect(widthTile, heightTile);
+                    children.add(tallGrassChildren);
                 }
             }
         }
@@ -117,7 +120,10 @@ else if (rightIsAvailable)
     {
         this.setX(x);
         this.setY(y);
-        this.environment.getEntities().add(0, this);
+        this.setRect(this.environment.widthTile, this.environment.heightTile);
+
+        this.environment.getEntities().add(this);
+        this.environment.getBlocks().add(this);
     }
 
 
diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/Torch.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/Torch.java
index 84b5fe2..7e83cf3 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/Torch.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/Torch.java
@@ -36,6 +36,7 @@ public Torch(Environment environment, int x, int y)
 
         this.environment.getEntities().remove(this);
         this.environment.getTorches().remove(this);
+        this.environment.getBlocks().remove(this);
     }
 
     @Override public void place(int x, int y)
@@ -50,7 +51,8 @@ public Torch(Environment environment, int x, int y)
         if (!Objects.isNull(player.getStackSelected()))
             inventory.get().get(inventory.getPosCursor()).remove();
 
-        environment.getEntities().add(0, entity);
+        environment.getEntities().add(entity);
         environment.getTorches().add(0, entity);
+        environment.getBlocks().add(entity);
     }
 }
\ No newline at end of file
diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/Tree.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/Tree.java
index 741add5..a2736ae 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/Tree.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/Tree.java
@@ -28,12 +28,14 @@ public Tree(Environment environment, int x, int y)
         // Environment.playSound("sound/grassyStep.wav", false);
         this.environment.getPlayer().pickup(new Wood());
         this.environment.getEntities().remove(this);
+        this.environment.getTrees().remove(this);
     }
 
     @Override public void spawn(int x, int y)
     {
         this.setX(x);
         this.setY(y);
-        this.environment.getEntities().add(0, this);
+        this.environment.getEntities().add(this);
+        this.environment.getTrees().add(this);
     }
 }
diff --git a/src/main/java/fr/sae/terraria/vue/LightView.java b/src/main/java/fr/sae/terraria/vue/LightView.java
index 336cc1d..e575968 100644
--- a/src/main/java/fr/sae/terraria/vue/LightView.java
+++ b/src/main/java/fr/sae/terraria/vue/LightView.java
@@ -4,7 +4,6 @@
 import fr.sae.terraria.modele.Environment;
 import fr.sae.terraria.modele.TileMaps;
 import fr.sae.terraria.modele.entities.blocks.Torch;
-import javafx.beans.property.SimpleDoubleProperty;
 import javafx.collections.ListChangeListener;
 import javafx.collections.ObservableList;
 import javafx.scene.layout.Pane;
diff --git a/src/main/java/fr/sae/terraria/vue/SlimeView.java b/src/main/java/fr/sae/terraria/vue/SlimeView.java
index 9b1e7e5..935c84d 100644
--- a/src/main/java/fr/sae/terraria/vue/SlimeView.java
+++ b/src/main/java/fr/sae/terraria/vue/SlimeView.java
@@ -44,4 +44,7 @@ public void displaySlime(final Pane display)
         this.setAnimation();
         display.getChildren().add(this.slimeImgView);
     }
+
+
+    public ImageView getSlimeImgView() { return this.slimeImgView; }
 }
diff --git a/src/main/java/fr/sae/terraria/vue/TileMapsView.java b/src/main/java/fr/sae/terraria/vue/TileMapsView.java
index 8865ff9..9aed0c9 100644
--- a/src/main/java/fr/sae/terraria/vue/TileMapsView.java
+++ b/src/main/java/fr/sae/terraria/vue/TileMapsView.java
@@ -5,10 +5,9 @@
 import fr.sae.terraria.modele.entities.Rabbit;
 import fr.sae.terraria.modele.entities.Slime;
 import fr.sae.terraria.modele.entities.blocks.*;
-import fr.sae.terraria.modele.entities.entity.Entity;
 import javafx.collections.ListChangeListener;
 import javafx.geometry.Rectangle2D;
-import javafx.scene.Node;
+import javafx.scene.Group;
 import javafx.scene.image.Image;
 import javafx.scene.image.ImageView;
 import javafx.scene.layout.Pane;
@@ -20,7 +19,10 @@
 
 public class TileMapsView
 {
-    private final List<ImageView> rabbitsView = new ArrayList<>();
+    private final List<ImageView> rabbitsView;
+    private final List<ImageView> blocksView;
+    private final List<ImageView> slimesView;
+    private final List<Group> treesView;
 
     private final Image torchImg;
     private final Image floorTopImg;
@@ -59,6 +61,11 @@ public TileMapsView(Environment environment,
         this.tileHeight = (int) (TileMaps.TILE_DEFAULT_SIZE * scaleMultiplicatorHeight);
         this.tileWidth = (int) (TileMaps.TILE_DEFAULT_SIZE * scaleMultiplicatorWidth);
 
+        this.rabbitsView = new ArrayList<>();
+        this.blocksView = new ArrayList<>();
+        this.slimesView = new ArrayList<>();
+        this.treesView = new ArrayList<>();
+
         this.floorTopImg = View.loadAnImage("tiles/floor-top.png", tileWidth, tileHeight);
         this.floorLeftImg = View.loadAnImage("tiles/floor-left.png", tileWidth, tileHeight);
         this.floorRightImg = View.loadAnImage("tiles/floor-right.png", tileWidth, tileHeight);
@@ -68,208 +75,200 @@ public TileMapsView(Environment environment,
         this.treeImg = View.loadAnImage("sprites/tree-sheet.png", scaleMultiplicatorWidth, scaleMultiplicatorHeight);
         this.tallGrassImg = View.loadAnImage("tiles/tall-grass.png",tileWidth,tileHeight);
 
-        // Lorsqu'un élément est ajouté, il le dessine automatiquement à l'écran
-        environment.getEntities().addListener((ListChangeListener<Entity>) c -> {
-            while (c.next()) {
-                if (c.wasAdded()) {
-                    if (c.getList().get(0) instanceof Tree)
-                        this.createTree((Tree) c.getList().get(0));
-                    if (c.getList().get(0) instanceof TallGrass)
-                        this.createTallGrass((TallGrass) c.getList().get(0));
-                    if (c.getList().get(0) instanceof Slime) {
-                        SlimeView slimeView = new SlimeView((Slime) c.getList().get(0), scaleMultiplicatorWidth, scaleMultiplicatorHeight);
-                        slimeView.displaySlime(displayHostileBeings);
-                    }
+        // Ajoute et supprime les elements de l'écran qui concerne les blocks
+        this.environment.getBlocks().addListener((ListChangeListener<? super Block>) this::updatesBlocksView);
+        // Ajoute et supprime les elements de l'écran qui concerne les lapins
+        this.environment.getRabbits().addListener((ListChangeListener<? super Rabbit>) this::updatesRabbitView);
+        // Ajoute et supprime les elements de l'écran qui concerne les slimes
+        this.environment.getSlimes().addListener((ListChangeListener<? super Slime>) this::updatesSlimeView);
+        this.environment.getTrees().addListener((ListChangeListener<? super Tree>) this::updatesTreeView);
+    }
 
-                    if (c.getList().get(0) instanceof Torch)
-                        createTorch((Torch) c.getList().get(0));
-                    if (c.getList().get(0) instanceof Dirt)
-                        displayTileMap.getChildren().add(View.createImageView(c.getList().get(0), floorTopImg));
-                    if (c.getList().get(0) instanceof Stone)
-                        displayTileMap.getChildren().add(View.createImageView(c.getList().get(0), stoneImg));
+    private void updatesBlocksView(ListChangeListener.Change<? extends Block> c)
+    {
+        while (c.next()) {
+            if (c.wasAdded()) {
+                ImageView blockView = new ImageView();
+                Block block = c.getAddedSubList().get(0);
+
+                blockView.setImage(null);
+                if (block instanceof Dirt) {
+                    if (((Dirt) block).getTypeOfFloor() == TileMaps.FLOOR_TOP)
+                        blockView.setImage(this.floorTopImg);
+                    else if (((Dirt) block).getTypeOfFloor() == TileMaps.FLOOR_LEFT)
+                        blockView.setImage(this.floorLeftImg);
+                    else if (((Dirt) block).getTypeOfFloor() == TileMaps.FLOOR_RIGHT)
+                        blockView.setImage(this.floorRightImg);
+                    else if (((Dirt) block).getTypeOfFloor() == TileMaps.DIRT)
+                        blockView.setImage(this.dirtImg);
+                    else if (((Dirt) block).getTypeOfFloor() == 0)
+                        blockView.setImage(this.floorTopImg);
+                } else if (block instanceof Stone) {
+                    blockView.setImage(this.stoneImg);
+                } else if (block instanceof TallGrass) {
+                    blockView.setImage(this.tallGrassImg);
+                    ((TallGrass) block).getTallGrassGrowthProperty().addListener((observable, oldValue, newValue) -> blockView.setViewport(new Rectangle2D(0, ((int) ((this.tallGrassImg.getHeight() / (TallGrass.GROWTH_TALL_GRASS_STEP) * newValue.intValue()) - tallGrassImg.getHeight())), this.tallGrassImg.getWidth(), this.tallGrassImg.getHeight())));
+                } else if (block instanceof Torch) {
+                    blockView.setImage(this.torchImg);
                 }
 
-                if (c.wasRemoved()) {
-                    // La position de l'entité
-                    int xEntity = (int) (c.getRemoved().get(0).getRect().get().getMinX());
-                    int yEntity = (int) (c.getRemoved().get(0).getRect().get().getMinY());
-
-                    // Tant qu'on n'a pas trouvé l'objet sur le Pane, il continue la boucle.
-                    Node nodeAtDelete = null; int i = 0;
-                    do {
-                        Node node = display.getChildren().get(i);
-                        int xNode = (int) (node.getTranslateX());
-                        int yNode = (int) (node.getTranslateY());
-
-                        if (xNode == xEntity && yNode == yEntity) {
-                            nodeAtDelete = node;
-                            display.getChildren().remove(nodeAtDelete);
-                        }
-                        i++;
-                    } while (i < display.getChildren().size() && Objects.isNull(nodeAtDelete));
-                }
-            }
-        });
-
-        this.environment.getRabbits().addListener((ListChangeListener<? super Rabbit>) c -> {
-            while (c.next()) {
-                if (c.wasAdded()) {
-                    RabbitView rabbitView = new RabbitView(c.getList().get(0), scaleMultiplicatorWidth, scaleMultiplicatorHeight);
-                    rabbitView.displayRabbit(this.displayHostileBeings);
-                    this.rabbitsView.add(rabbitView.getRabbitImgView());
-                } else if (c.wasRemoved()) {
-                    this.displayHostileBeings.getChildren().remove(this.rabbitsView.get(c.getTo()));
-                    this.rabbitsView.remove(c.getTo());
+                if (!Objects.isNull(blockView.getImage())) {
+                    blockView.translateXProperty().bind(block.getXProperty());
+                    blockView.translateYProperty().bind(block.getYProperty());
+
+                    this.display.getChildren().add(blockView);
+                    this.blocksView.add(blockView);
                 }
             }
-        });
-    }
 
-    /** Decompose la carte pour afficher un à un les tiles à l'écran */
-    public void displayMaps(TileMaps tiles)
-    {
-        for (int y = 0; y < tiles.getHeight() ; y++)
-            for (int x = 0 ; x < tiles.getWidth() ; x++)
-                switch (tiles.getTile(x, y))
-                {
-                    case TileMaps.STONE:
-                        this.createStone(x, y);
-                        break;
-                    case TileMaps.DIRT:
-                        this.createDirt(x, y);
-                        break;
-                    case TileMaps.FLOOR_TOP:
-                    case TileMaps.FLOOR_LEFT:
-                    case TileMaps.FLOOR_RIGHT:
-                        this.createFloor(tiles.getTile(x, y), x, y);
-                        break;
-                    default:
-                        this.errorTile(tiles.getTile(x, y));
-                        break;
-                }
+            if (c.wasRemoved()) {
+                this.display.getChildren().remove(this.blocksView.get(c.getTo()));
+                this.blocksView.remove(c.getTo());
+            }
+        }
     }
 
-    /** Crée et affiche un block de type arbre, il sera +/- grand */
-    private void createTree(final Tree tree)
+    private void updatesRabbitView(ListChangeListener.Change<? extends Rabbit> c)
     {
-        List<ImageView> imagesTree = new ArrayList<>();
-
-        int nbFoliage = ((int) (Math.random()*2))+1;
-        int nbTrunk = ((int) (Math.random()*3))+1;
-
-        Rectangle2D viewportFirstFrame = new Rectangle2D(0, 0, this.tileWidth, this.tileHeight);
-        ImageView firstFrameView = new ImageView();
-        firstFrameView.setImage(this.treeImg);
-        firstFrameView.setViewport(viewportFirstFrame);
-        imagesTree.add(firstFrameView);
-        for (int f = 0; f < nbFoliage; f++) {
-            Rectangle2D viewportSecondFrame = new Rectangle2D(0, this.tileHeight, this.tileWidth, this.tileHeight);
-            ImageView secondFrameView = new ImageView();
-            secondFrameView.setImage(this.treeImg);
-            secondFrameView.setViewport(viewportSecondFrame);
-            imagesTree.add(secondFrameView);
-        }
+        while (c.next()) {
+            if (c.wasAdded()) {
+                RabbitView rabbitView = new RabbitView(c.getAddedSubList().get(0), environment.scaleMultiplicatorWidth, environment.scaleMultiplicatorHeight);
+                rabbitView.displayRabbit(this.displayHostileBeings);
+                this.rabbitsView.add(rabbitView.getRabbitImgView());
+            }
 
-        if (nbTrunk > 1) {
-            Rectangle2D viewportEndTrunk = new Rectangle2D(0, (this.tileHeight*2), this.tileWidth, this.tileHeight);
-            ImageView endTrunkView = new ImageView();
-            endTrunkView.setImage(this.treeImg);
-            endTrunkView.setViewport(viewportEndTrunk);
-            imagesTree.add(endTrunkView);
-
-            for (int t = 0; t < nbTrunk-1; t++) {
-                Rectangle2D viewportTrunk = new Rectangle2D(this.tileWidth, (this.tileHeight*2), this.tileWidth, this.tileHeight);
-                ImageView trunkView = new ImageView();
-                trunkView.setImage(this.treeImg);
-                trunkView.setViewport(viewportTrunk);
-                imagesTree.add(trunkView);
+            if (c.wasRemoved()) {
+                this.displayHostileBeings.getChildren().remove(this.rabbitsView.get(c.getTo()));
+                this.rabbitsView.remove(c.getTo());
             }
-        } else {
-            Rectangle2D viewportTrunk = new Rectangle2D(0, (this.tileHeight*2), this.tileWidth, this.tileHeight);
-            ImageView trunkView = new ImageView();
-            trunkView.setImage(this.treeImg);
-            trunkView.setViewport(viewportTrunk);
-            imagesTree.add(trunkView);
         }
-        Rectangle2D viewportTrunkFoot = new Rectangle2D(0, (this.tileHeight*3), this.tileWidth, this.tileHeight);
-        ImageView trunkFootView = new ImageView();
-        trunkFootView.setImage(this.treeImg);
-        trunkFootView.setViewport(viewportTrunkFoot);
-        imagesTree.add(trunkFootView);
-
-        for (int i = 0; i < imagesTree.size(); i++) {
-            ImageView treeView = imagesTree.get(i);
+    }
 
-            treeView.setY((int) (((tree.getY() + this.tileHeight) + (i * this.tileHeight)) - (this.tileHeight * imagesTree.size())));
-            treeView.setX((int) tree.getX());
+    private void updatesSlimeView(ListChangeListener.Change<? extends Slime> c)
+    {
+        while (c.next()) {
+            if (c.wasAdded()) {
+                SlimeView slimeView = new SlimeView(c.getAddedSubList().get(0), environment.scaleMultiplicatorWidth, environment.scaleMultiplicatorHeight);
+                slimeView.displaySlime(this.displayHostileBeings);
+                this.slimesView.add(slimeView.getSlimeImgView());
+            }
 
-            this.display.getChildren().add(treeView);
+            if (c.wasRemoved()) {
+                this.displayHostileBeings.getChildren().remove(this.slimesView.get(c.getTo()));
+                this.slimesView.remove(c.getTo());
+            }
         }
-
-        tree.setRect(this.tileWidth, (2+nbFoliage+nbTrunk)*this.tileHeight);
     }
 
-    /**
-     * Crée et affiche un block de type Haute Herbe.
-     *  Applique une animation de pousse à la haute herbe
-     */
-    private void createTallGrass(final TallGrass tallGrass)
+    private void updatesTreeView(ListChangeListener.Change<? extends Tree> c)
     {
-        ImageView tallGrassView = new ImageView(this.tallGrassImg);
-        tallGrass.setRect(this.tileWidth, this.tileHeight);
-        tallGrassView.setX(tallGrass.getX());
-        tallGrassView.setY(tallGrass.getY());
-
-        // L'animation de la pousse de la haute herbe
-        tallGrass.getTallGrassGrowthProperty().addListener(((observable, oldValue, newValue) -> {
-            tallGrassView.setViewport(new Rectangle2D(0, 0, this.tallGrassImg.getWidth(), (newValue.intValue() < 1) ? 1 : (this.tallGrassImg.getHeight()/TallGrass.GROWTH_TALL_GRASS_STEP)*newValue.intValue()));
-            tallGrassView.setY((tallGrass.getY() - (this.tallGrassImg.getHeight()/TallGrass.GROWTH_TALL_GRASS_STEP)*newValue.intValue()) + this.tileHeight);
-        }));
-
-        this.display.getChildren().add(tallGrassView);
-    }
+        while (c.next()) {
+            if (c.wasAdded()) {
+                Group group = new Group();
+
+                int nbFoliage = ((int) (Math.random()*2))+1;
+                int nbTrunk = ((int) (Math.random()*3))+1;
+
+                Rectangle2D viewportFirstFrame = new Rectangle2D(0, 0, this.tileWidth, this.tileHeight);
+                ImageView firstFrameView = new ImageView();
+                firstFrameView.setImage(this.treeImg);
+                firstFrameView.setViewport(viewportFirstFrame);
+                group.getChildren().add(firstFrameView);
+
+                for (int f = 0; f < nbFoliage; f++) {
+                    Rectangle2D viewportSecondFrame = new Rectangle2D(0, this.tileHeight, this.tileWidth, this.tileHeight);
+                    ImageView secondFrameView = new ImageView();
+                    secondFrameView.setImage(this.treeImg);
+                    secondFrameView.setViewport(viewportSecondFrame);
+                    group.getChildren().add(secondFrameView);
+                }
 
-    /** Crée et affiche un tile de type pierre */
-    private void createStone(int x, int y)
-    {
-        Stone stoneEntity = new Stone(this.environment, x*this.tileWidth, y*this.tileHeight);
-        stoneEntity.setRect(this.tileWidth, this.tileHeight);
+                if (nbTrunk > 1) {
+                    Rectangle2D viewportEndTrunk = new Rectangle2D(0, (this.tileHeight*2), this.tileWidth, this.tileHeight);
+                    ImageView endTrunkView = new ImageView();
+                    endTrunkView.setImage(this.treeImg);
+                    endTrunkView.setViewport(viewportEndTrunk);
+                    group.getChildren().add(endTrunkView);
+
+                    for (int t = 0; t < nbTrunk-1; t++) {
+                        Rectangle2D viewportTrunk = new Rectangle2D(this.tileWidth, (this.tileHeight*2), this.tileWidth, this.tileHeight);
+                        ImageView trunkView = new ImageView();
+                        trunkView.setImage(this.treeImg);
+                        trunkView.setViewport(viewportTrunk);
+                        group.getChildren().add(trunkView);
+                    }
+                } else {
+                    Rectangle2D viewportTrunk = new Rectangle2D(0, (this.tileHeight*2), this.tileWidth, this.tileHeight);
+                    ImageView trunkView = new ImageView();
+                    trunkView.setImage(this.treeImg);
+                    trunkView.setViewport(viewportTrunk);
+                    group.getChildren().add(trunkView);
+                }
+                Rectangle2D viewportTrunkFoot = new Rectangle2D(0, (this.tileHeight*3), this.tileWidth, this.tileHeight);
+                ImageView trunkFootView = new ImageView();
+                trunkFootView.setImage(this.treeImg);
+                trunkFootView.setViewport(viewportTrunkFoot);
+                group.getChildren().add(trunkFootView);
+
+                Tree tree = c.getAddedSubList().get(0);
+                for (int i = 0; i < group.getChildren().size(); i++) {
+                    ImageView treeView = (ImageView) group.getChildren().get(i);
+
+                    treeView.setY((int) (((tree.getY() + this.tileHeight) + (i * this.tileHeight)) - (this.tileHeight * group.getChildren().size())));
+                    treeView.setX((int) tree.getX());
+                }
+                tree.setRect(this.tileWidth, (2+nbFoliage+nbTrunk)*this.tileHeight);
+                tree.getRect().updates(tree.getX(), tree.getY() - ((2+nbFoliage+nbTrunk)*this.tileHeight) + this.tileHeight);
 
-        this.display.getChildren().add(View.createImageView(stoneEntity, this.stoneImg));
-        this.environment.getEntities().add(stoneEntity);
-    }
+                this.display.getChildren().add(group);
+                this.treesView.add(group);
+            }
+
+            if (c.wasRemoved()) {
+                this.display.getChildren().remove(this.treesView.get(c.getTo()));
+                this.treesView.remove(c.getTo());
+            }
+        }
 
-    /** Crée et affiche un block de type Torch */
-    private void createTorch(final Torch torch)
-    {
-        torch.setRect(this.tileWidth, this.tileHeight);
-        this.display.getChildren().add(View.createImageView(torch, this.torchImg));
     }
 
-    /** Crée et affiche un tile de type terre */
-    private void createDirt(int x, int y)
+    /** Affiche une erreur au cas où si un developer a fait une erreur lors de la saisie d'un tile sur le fichier .json */
+    private void errorTile(final int tile) { if (tile != TileMaps.SKY) System.out.println("Le tile '" + tile + "' n'est pas reconnu."); }
+
+    /** Decompose la carte pour afficher un à un les tiles à l'écran */
+    public void displayMaps(TileMaps tiles)
     {
-        Dirt dirtSprite = new Dirt(this.environment, x*this.tileWidth, y*this.tileHeight);
-        dirtSprite.setRect(this.tileWidth, this.tileHeight);
+        for (int y = 0; y < tiles.getHeight() ; y++)
+            for (int x = 0 ; x < tiles.getWidth() ; x++)
+                switch (tiles.getTile(x, y)) {
+                    case TileMaps.STONE:
+                        Stone stoneEntity = new Stone(this.environment, x*this.tileWidth, y*this.tileHeight);
+                        stoneEntity.setRect(this.tileWidth, this.tileHeight);
 
-        this.display.getChildren().add(View.createImageView(dirtSprite, this.dirtImg));
-        this.environment.getEntities().add(dirtSprite);
-    }
+                        this.environment.getEntities().add(stoneEntity);
+                        this.environment.getBlocks().add(stoneEntity);
+                        break;
+                    case TileMaps.DIRT:
+                        Dirt dirtSprite = new Dirt(this.environment, x*this.tileWidth, y*this.tileHeight);
+                        dirtSprite.setTypeOfFloor(TileMaps.DIRT);
+                        dirtSprite.setRect(this.tileWidth, this.tileHeight);
 
-    /**
-     * Crée et affiche un tile de type sol
-     * @param typeOfFloor Quel face du tile doit être affiché
-     */
-    private void createFloor(int typeOfFloor, int x, int y)
-    {
-        Dirt floorEntity = new Dirt(this.environment, x*this.tileWidth, y*this.tileHeight);
-        Image floorImg = (typeOfFloor == TileMaps.FLOOR_TOP) ? this.floorTopImg : (typeOfFloor == TileMaps.FLOOR_RIGHT) ? this.floorRightImg : this.floorLeftImg;
-        floorEntity.setRect(this.tileWidth, this.tileHeight);
+                        this.environment.getEntities().add(dirtSprite);
+                        this.environment.getBlocks().add(dirtSprite);
+                        break;
+                    case TileMaps.FLOOR_TOP:
+                    case TileMaps.FLOOR_LEFT:
+                    case TileMaps.FLOOR_RIGHT:
+                        Dirt floorEntity = new Dirt(this.environment, x*this.tileWidth, y*this.tileHeight);
+                        floorEntity.setTypeOfFloor(tiles.getTile(x, y));
+                        floorEntity.setRect(this.tileWidth, this.tileHeight);
 
-        this.display.getChildren().add(View.createImageView(floorEntity, floorImg));
-        this.environment.getEntities().add(floorEntity);
+                        this.environment.getEntities().add(floorEntity);
+                        this.environment.getBlocks().add(floorEntity);
+                        break;
+                    default:
+                        this.errorTile(tiles.getTile(x, y));
+                        break;
+                }
     }
-
-    /** Affiche une erreur au cas où si un developer a fait une erreur lors de la saisie d'un tile sur le fichier .json */
-    private void errorTile(final int tile) { if (tile != TileMaps.SKY) System.out.println("Le tile '" + tile + "' n'est pas reconnu."); }
 }
diff --git a/src/main/java/fr/sae/terraria/vue/View.java b/src/main/java/fr/sae/terraria/vue/View.java
index 8463ccb..b83f447 100644
--- a/src/main/java/fr/sae/terraria/vue/View.java
+++ b/src/main/java/fr/sae/terraria/vue/View.java
@@ -28,7 +28,7 @@ public View(final GameController gameController)
     {
         super();
 
-        environment = gameController.environment;
+        this.environment = gameController.environment;
         final Pane displayTiledMap = gameController.displayTiledMap;
         final Pane displayHostileBeings = gameController.displayHostileBeings;
         final Pane displayHUD = gameController.displayHUD;

From a79a8cafc8484ef4f2d842f9ec6a03a57f7addcd Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Fri, 10 Jun 2022 20:48:41 +0200
Subject: [PATCH 12/97] =?UTF-8?q?Les=20items=20dans=20l'inventaire=20sont?=
 =?UTF-8?q?=20centr=C3=A9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/main/java/fr/sae/terraria/vue/hud/InventoryView.java | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java b/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java
index 7a6fad0..8d9e0a5 100644
--- a/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java
+++ b/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java
@@ -142,8 +142,8 @@ else if (item instanceof Vodka)
                     stack.nbItemsProperty().addListener((obs, oldV, newV) -> this.texts.get(c.getTo()-1).setText(String.valueOf(newV.intValue())));
 
                     if (!Objects.isNull(view.getImage())) {
-                        view.setX(this.inventoryBarImgView.getX() + ((c.getTo()-1) * boxeInventoryWidth));
-                        view.setY(this.inventoryBarImgView.getY());
+                        view.setX((this.inventoryBarImgView.getX() + ((c.getTo()-1) * boxeInventoryWidth)) + ((boxeInventoryWidth/2) - (itemInventoryWidth/2)));
+                        view.setY(this.inventoryBarImgView.getY() + ((boxeInventoryWidth/2) - (itemInventoryHeight/2)));
 
                         this.itemsView.add(view);
                         this.display.getChildren().add(view);

From cae748f8ea5a48bf8cec726d957b66241c41ce87 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Fri, 10 Jun 2022 20:51:04 +0200
Subject: [PATCH 13/97] L'image de la pioche est maintenant transparent

---
 .../fr/sae/terraria/tools/pickaxe.png          | Bin 384 -> 5453 bytes
 1 file changed, 0 insertions(+), 0 deletions(-)

diff --git a/src/main/resources/fr/sae/terraria/tools/pickaxe.png b/src/main/resources/fr/sae/terraria/tools/pickaxe.png
index 596520e0aa8900d4560a1d707f2c1f5466fc4ce8..ce02b608ce2394348797aaeb12e0a96e34d8face 100644
GIT binary patch
literal 5453
zcmeHKdpJ~U7a!%4NfJqgV;VXUbH7jIGLu`;#1ulA%bqcqOEZI^!r|aZsc;mLTTbP6
zl2npJp*VCqIiaMKI$sG<NSAL9x;@|dr|0?3f6Y95&))C5)^Dx#d)K?(SxF3cr+Lt&
zPzVGv&&8SU0siVJuQ}@A-DKng3j$Gn9?A5Ud$7V`5~-Lc2mxU72nhfK6apRuqUb8~
z@;%*WuJx9$U#YrwmTK#R2=~E&4BN&_FV4Rhc=Y;Cl8Qb3xN8ijtFG?cgoXi5jgzBp
zQfn*e3^ZNAY^W&5=gRL)+}+bxdbhLfc0F3t)u*j@Z2XpcbIuCaW7URE`Oi~!++Q&8
z+T;hLfg~=B&HPW;!ZW51ZrgX;Z)O><R<E76?99dvT<VDnJnNT&(CtIC?v-~+v`6O1
z^ipT9-#^c;>A)T{ruE^%?U`w3C+K62vmCYz%l#Mp@+Kx|tM)n1$Hg~-Ya*DfFMoi~
zH=8WkAs{{4Qi45Rm)V)%-?zP{H4#al|9r1_kTALgSK!<c7gQHVrDYO!w;p7#GuFzB
z7$0Sr=NW}xHr{tz?KoqvlzTTGjv0N*J?>H9F3gCB!ZwQ%^!582uzT#&O%0AYvYXv<
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
NaarR|FLwxt{V!o<U;6+6

delta 340
zcmV-a0jvJaDu4r!BO3q#b5ch_0Itp)=>Px#1ZP1_K>z@;j|==^1(V<t7k>d2Nkl<Z
zI8S5z4+IPp0IUYorX+&tYqxKM>9q%sfN5-i1xjOp>aHmaPw!u6cy{+LL$JLKR1{*E
zy$mCmeelVD>@ENSm?kY%RR%XV4+be^Ww2orrcP#%`*oS&+~ZI94S)e;+hK-*41s$K
zWB@V1PMQIXYmyWGA6mKMe}9mjHCUVpVhnx&^0SdFAD9gaSde#MfS>^|%`iWM04OYA
z0IvbqG=spdT{{>GvU9=VgVO+9nn8hw><z326k75#gc-15XhsIoikje9!H7nXW*?K^
z3|r2yGV~w+2o=Qyu+)lT0La-OoA12kz^fS<fDHiI3IZy^KNwbB_$`Ig+1LO)3_#8X
m*-VON5P%y1@-yjxfdK$ST)Z*s+s4KK0000<MNUMnLSTX}xQR~y


From 0ddb639f2db64df731983bf251fd6cbe6461784b Mon Sep 17 00:00:00 2001
From: Tiago Lousa <tig2468.a@gmail.com>
Date: Fri, 10 Jun 2022 23:03:49 +0200
Subject: [PATCH 14/97] mise en place DrunkView

---
 .../fr/sae/terraria/modele/Environment.java   |  3 +
 .../terraria/modele/entities/items/Vodka.java |  1 +
 .../modele/entities/player/Player.java        |  8 +-
 .../java/fr/sae/terraria/vue/DrunkView.java   | 78 +++++++++++++++++++
 .../java/fr/sae/terraria/vue/LightView.java   |  5 +-
 src/main/java/fr/sae/terraria/vue/View.java   |  1 +
 6 files changed, 92 insertions(+), 4 deletions(-)
 create mode 100644 src/main/java/fr/sae/terraria/vue/DrunkView.java

diff --git a/src/main/java/fr/sae/terraria/modele/Environment.java b/src/main/java/fr/sae/terraria/modele/Environment.java
index 1943e2d..db8ea5a 100644
--- a/src/main/java/fr/sae/terraria/modele/Environment.java
+++ b/src/main/java/fr/sae/terraria/modele/Environment.java
@@ -8,6 +8,7 @@
 import fr.sae.terraria.modele.entities.entity.Entity;
 import fr.sae.terraria.modele.entities.entity.ReproductiveObjectType;
 import fr.sae.terraria.modele.entities.items.Meat;
+import fr.sae.terraria.modele.entities.items.Vodka;
 import fr.sae.terraria.modele.entities.player.Player;
 import fr.sae.terraria.modele.entities.tools.Pickaxe;
 import javafx.animation.Animation;
@@ -119,7 +120,9 @@ private void gameLoop()
                 this.player.pickup(meat);
 
                 this.player.pickup(new Pickaxe());
+                this.player.pickup(new Vodka(this));
                 caught[0] = true;
+
             }
 
             // Ajoute les entités ReproductiveObjectType
diff --git a/src/main/java/fr/sae/terraria/modele/entities/items/Vodka.java b/src/main/java/fr/sae/terraria/modele/entities/items/Vodka.java
index ab03ed5..0a3f93f 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/items/Vodka.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/items/Vodka.java
@@ -29,5 +29,6 @@ public Vodka(final Environment environment)
         Player player = environment.getPlayer();
         Inventory inventory = player.getInventory();
         inventory.get().get(inventory.getPosCursor()).remove();
+        player.drunkProperty().set(true);
     }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
index cc6e72e..a575308 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
@@ -5,7 +5,9 @@
 import fr.sae.terraria.modele.entities.player.inventory.Inventory;
 import fr.sae.terraria.modele.entities.player.inventory.Stack;
 import fr.sae.terraria.vue.View;
+import javafx.beans.property.BooleanProperty;
 import javafx.beans.property.ObjectProperty;
+import javafx.beans.property.SimpleBooleanProperty;
 import javafx.beans.property.SimpleObjectProperty;
 import javafx.scene.image.Image;
 import javafx.scene.input.KeyCode;
@@ -19,6 +21,7 @@
 public class Player extends EntityMovable implements CollideObjectType, CollapsibleObjectType, SpawnableObjectType
 {
     public static final int BREAK_BLOCK_DISTANCE = 1;
+    public static final int DRUNK_EFFECT_TIME = 600;
 
     private final EnumMap<KeyCode, Boolean> keysInput;
     private final EnumMap<MouseButton, Boolean> mouseInput;
@@ -27,11 +30,13 @@ public class Player extends EntityMovable implements CollideObjectType, Collapsi
 
     private final Inventory inventory;
     private Stack stackSelected;
+    private SimpleBooleanProperty drunk;
 
 
     public Player(final Environment environment)
     {
         super(0, 0, environment);
+        drunk = new SimpleBooleanProperty(false);
         this.inventory = new Inventory(this);
 
         this.animation = new Animation();
@@ -125,6 +130,7 @@ else if (key == KeyCode.Q)
     public Map<KeyCode, Boolean> getKeysInput() { return this.keysInput; }
     public Stack getStackSelected() { return this.stackSelected; }
     public Inventory getInventory() { return this.inventory; }
-
+    public boolean isDrunk() {return drunk.get();}
+    public SimpleBooleanProperty drunkProperty() {return drunk;}
     public void setStackSelected(Stack stackSelected) { this.stackSelected = stackSelected; }
 }
diff --git a/src/main/java/fr/sae/terraria/vue/DrunkView.java b/src/main/java/fr/sae/terraria/vue/DrunkView.java
new file mode 100644
index 0000000..6835dec
--- /dev/null
+++ b/src/main/java/fr/sae/terraria/vue/DrunkView.java
@@ -0,0 +1,78 @@
+package fr.sae.terraria.vue;
+
+import fr.sae.terraria.modele.Environment;
+import fr.sae.terraria.modele.entities.player.Player;
+import javafx.animation.Animation;
+import javafx.animation.KeyFrame;
+import javafx.animation.Timeline;
+import javafx.beans.property.ObjectProperty;
+import javafx.beans.property.SimpleObjectProperty;
+import javafx.scene.effect.DisplacementMap;
+import javafx.scene.effect.FloatMap;
+import javafx.scene.layout.StackPane;
+import javafx.util.Duration;
+
+public class DrunkView {
+
+    private static final int WIDTH_COS = 50;
+    private static final int HEIGHT_COS = 100;
+    private FloatMap floatMap;
+    private ObjectProperty<DisplacementMap> displacementMap;
+    private int startTick;
+    Timeline drunkTimeline;
+    private double timer;
+    Environment environment;
+
+    public DrunkView(Environment environment, StackPane cameraView) {
+        this.environment = environment;
+        this.drunkTimeline = new Timeline();
+        this.timer = 0;
+        this.startTick = 0;
+        this.floatMap = new FloatMap();
+        this.displacementMap = new SimpleObjectProperty<>();
+
+
+        drunkTimeline.setCycleCount(Animation.INDEFINITE);
+        KeyFrame keyFrame = new KeyFrame(Duration.seconds(0.05), (ev -> {
+            updateEffect();
+        }));
+        drunkTimeline.getKeyFrames().add(keyFrame);
+
+        floatMap.setWidth(WIDTH_COS);
+        floatMap.setHeight(HEIGHT_COS);
+
+        cameraView.effectProperty().bind(displacementMap);
+
+        environment.getPlayer().drunkProperty().addListener((o, oldVal, newVal) -> {
+            if (newVal) {
+                displacementMap.set(new DisplacementMap());
+                displacementMap.getValue().setMapData(floatMap);
+                startTick = environment.getTicks();
+                drunkTimeline.play();
+            } else {dissasambleEffect();}
+        });
+    }
+
+
+    private void updateEffect() {
+
+        for (int i = 0; i < WIDTH_COS; i++) {
+            double v = (Math.cos(timer + i / 20.0 * Math.PI) - 0.5) / 40.0;
+            for (int j = 0; j < HEIGHT_COS; j++) {
+                floatMap.setSamples(i, j, 0.0f, (float) v);
+            }
+        }
+        timer += 0.03;
+
+        if (startTick+ Player.DRUNK_EFFECT_TIME <= environment.getTicks()){
+            environment.getPlayer().drunkProperty().set(false);
+        }
+
+    }
+
+    private void dissasambleEffect() {
+        drunkTimeline.stop();
+        displacementMap.set(null);
+    }
+
+}
diff --git a/src/main/java/fr/sae/terraria/vue/LightView.java b/src/main/java/fr/sae/terraria/vue/LightView.java
index 336cc1d..360f6dc 100644
--- a/src/main/java/fr/sae/terraria/vue/LightView.java
+++ b/src/main/java/fr/sae/terraria/vue/LightView.java
@@ -4,7 +4,6 @@
 import fr.sae.terraria.modele.Environment;
 import fr.sae.terraria.modele.TileMaps;
 import fr.sae.terraria.modele.entities.blocks.Torch;
-import javafx.beans.property.SimpleDoubleProperty;
 import javafx.collections.ListChangeListener;
 import javafx.collections.ObservableList;
 import javafx.scene.layout.Pane;
@@ -54,10 +53,10 @@ public LightView(Clock clock, Pane filterPane, Environment env) {
 
 
         this.filterPane.getChildren().addAll(this.actualTunnel, this.actualFade, this.actualAir);
-        this.initTochListener(env.getTorches());
+        this.initTorchListener(env.getTorches());
     }
 
-    private void initTochListener(ObservableList<Torch> torches) {
+    private void initTorchListener(ObservableList<Torch> torches) {
         torches.addListener((ListChangeListener<? super Torch>) c -> {
             while(c.next()){
                 this.filterPane.getChildren().clear();
diff --git a/src/main/java/fr/sae/terraria/vue/View.java b/src/main/java/fr/sae/terraria/vue/View.java
index 8463ccb..9f25e6a 100644
--- a/src/main/java/fr/sae/terraria/vue/View.java
+++ b/src/main/java/fr/sae/terraria/vue/View.java
@@ -44,6 +44,7 @@ public View(final GameController gameController)
         playerView.displayPlayer(displayHostileBeings);
 
         LightView lightView = new LightView(environment.getGameClock(),filter,environment);
+        DrunkView drunkView = new DrunkView(environment,gameController.paneHadCamera);
 
         HUDView HUDView = new HUDView(environment.getPlayer(), environment.getGameClock(), displayHUD, scaleMultiplicatorWidth, scaleMultiplicatorHeight);
         HUDView.display();

From 09ecb72cae4f29aef344afcfaebd9a4e380c0873 Mon Sep 17 00:00:00 2001
From: Tiago Lousa <tig2468.a@gmail.com>
Date: Fri, 10 Jun 2022 23:19:46 +0200
Subject: [PATCH 15/97] =?UTF-8?q?fix=20opacit=C3=A9=20LightView=20+=20fix?=
 =?UTF-8?q?=20erreur=20quand=20un=20block=20=C3=A9tais=20cass=C3=A9=20sans?=
 =?UTF-8?q?=20rien=20dans=20la=20main?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/fr/sae/terraria/modele/entities/blocks/Stone.java     | 2 +-
 src/main/java/fr/sae/terraria/vue/LightView.java               | 3 +++
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/Stone.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/Stone.java
index 21a3478..88cabcd 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/Stone.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/Stone.java
@@ -59,7 +59,7 @@ public Stone(Environment environment, int x, int y)
 
         // S'il utilise le bon outil, il commencera à casser le bloc sinon use l'outil sans casser le bloc.
         Stack stack = player.getStackSelected();
-        if (!Objects.isNull(stack.getItem())) {
+        if (!Objects.isNull(stack)) {
             if (stack.getItem() instanceof Pickaxe)
                 this.setPv(this.getPv() - 1);
             if (stack.getItem() instanceof Tool)
diff --git a/src/main/java/fr/sae/terraria/vue/LightView.java b/src/main/java/fr/sae/terraria/vue/LightView.java
index 360f6dc..52e3e02 100644
--- a/src/main/java/fr/sae/terraria/vue/LightView.java
+++ b/src/main/java/fr/sae/terraria/vue/LightView.java
@@ -122,6 +122,7 @@ private void resetShapes()
 
         this.actualTunnel.setLayoutY(tileSize*(delimitationDirtStone+1));
         this.actualFade.setLayoutY(this.actualTunnel.getLayoutY()-tileSize);
+
     }
 
     private void addEffects()
@@ -131,6 +132,8 @@ private void addEffects()
         this.actualTunnel.setFill(NIGHT_COLOR);
 
         this.actualAir.opacityProperty().bind(this.clock.opacityNightFilterProperty());
+        this.actualFade.setOpacity(0.8);
+        this.actualTunnel.setOpacity(0.8);
     }
 
     private void addTochLights()

From 999527be60754509f1a85805952bb3285d4d2317 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Sat, 11 Jun 2022 00:47:26 +0200
Subject: [PATCH 16/97] =?UTF-8?q?Mise=20en=20clart=C3=A9=20du=20code?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../fr/sae/terraria/modele/Environment.java   |  9 ++--
 .../sae/terraria/modele/entities/Arrow.java   |  2 +-
 .../sae/terraria/modele/entities/Rabbit.java  | 26 ++++------
 .../sae/terraria/modele/entities/Slime.java   | 27 ++++------
 .../modele/entities/blocks/Torch.java         |  4 +-
 .../modele/entities/entity/EntityMovable.java | 50 ++++++++++++-------
 .../modele/entities/player/Player.java        | 25 +++++-----
 src/main/java/fr/sae/terraria/vue/Camera.java |  5 +-
 .../java/fr/sae/terraria/vue/PlayerView.java  |  9 ++--
 .../java/fr/sae/terraria/vue/RabbitView.java  |  5 +-
 10 files changed, 80 insertions(+), 82 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/modele/Environment.java b/src/main/java/fr/sae/terraria/modele/Environment.java
index 6d72878..941b12c 100644
--- a/src/main/java/fr/sae/terraria/modele/Environment.java
+++ b/src/main/java/fr/sae/terraria/modele/Environment.java
@@ -120,15 +120,12 @@ private void gameLoop()
         KeyFrame keyFrame = new KeyFrame(Duration.seconds(Terraria.TARGET_FPS), (ev -> {
             // TODO TEST
             if (!caught[0]) {
-                Torch torch = new Torch(this, 0, 0);
-                this.player.pickup(torch);
-                Meat meat = new Meat(this);
-                this.player.pickup(meat);
-
+                this.player.pickup(new Torch(this));
+                this.player.pickup(new Meat(this));
                 this.player.pickup(new Pickaxe());
                 this.player.pickup(new Vodka(this));
-                caught[0] = true;
 
+                caught[0] = true;
             }
 
             // Ajoute les entités ReproductiveObjectType
diff --git a/src/main/java/fr/sae/terraria/modele/entities/Arrow.java b/src/main/java/fr/sae/terraria/modele/entities/Arrow.java
index 7e30145..d85ea7b 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/Arrow.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/Arrow.java
@@ -12,7 +12,7 @@ public class Arrow extends EntityMovable implements StowableObjectType, CollideO
 
     public Arrow(final Environment environment, int x, int y, int velocity)
     {
-        super(x, y, environment);
+        super(environment, x, y);
 
         this.velocity = velocity;
     }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/Rabbit.java b/src/main/java/fr/sae/terraria/modele/entities/Rabbit.java
index 41f05d2..c05e15b 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/Rabbit.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/Rabbit.java
@@ -26,7 +26,7 @@ public class Rabbit extends EntityMovable implements CollideObjectType, Reproduc
 
     public Rabbit(final Environment environment, int x, int y)
     {
-        super(x, y, environment);
+        super(environment, x, y);
 
         this.setPv(3);
         this.animation = new Animation();
@@ -39,7 +39,7 @@ public Rabbit(final Environment environment, int x, int y)
 
     @Override public void updates()
     {
-        if (this.offset[1] == Entity.IDLE && !this.air) {
+        if (this.isIDLEonY() && !this.air) {
             this.gravity.xInit = this.x.get();
             this.gravity.yInit = this.y.get();
             this.gravity.vInit = this.velocity;
@@ -59,15 +59,15 @@ public Rabbit(final Environment environment, int x, int y)
 
     @Override public void move()
     {
-        this.setX(this.x.get() + this.offset[0] * this.velocity);
+        this.setX(this.x.get() + this.getOffsetMoveX() * this.velocity);
 
-        if (this.offset[1] == Entity.IDLE && this.offset[0] != Entity.IDLE) {
-            int xProbablyVoid = (int) ((getX()+((this.offset[0] == Entity.IS_MOVING_LEFT) ? 0 : this.environment.widthTile)) / this.environment.widthTile);
+        if (this.isIDLEonY() && this.isMoving()) {
+            int xProbablyVoid = (int) ((getX()+((this.isMovingLeft()) ? 0 : this.environment.widthTile)) / this.environment.widthTile);
             int yProbablyVoid = (int) (getY() / environment.heightTile);
 
             // Si du vide risque d'y avoir lors de son déplacement
             if (environment.getTileMaps().getTile(xProbablyVoid, yProbablyVoid + 2) == TileMaps.SKY) {
-                this.offset[0] = (-1) * this.offset[0];
+                this.offset[0] = (-1) * this.getOffsetMoveX();
             } else {
                 boolean mustJump = this.environment.getTicks() % Rabbit.JUMP_FREQUENCY == 0;
                 if (mustJump) {
@@ -97,7 +97,7 @@ public Rabbit(final Environment environment, int x, int y)
 
         if (!whereCollide.isEmpty()) {
             if (whereCollide.get("left").equals(Boolean.TRUE) || whereCollide.get("right").equals(Boolean.TRUE))
-                this.offset[0] = (-1) * this.offset[0];
+                this.offset[0] = (-1) * this.getOffsetMoveX();
         }
     }
 
@@ -123,23 +123,15 @@ public Rabbit(final Environment environment, int x, int y)
         this.getGravity().setXInit(x);
         this.getGravity().setYInit(y);
         this.setRect(environment.widthTile, environment.heightTile);
+
         this.environment.getEntities().add(0, this);
         this.environment.getRabbits().add(this);
     }
 
-    /** Modifie l'offset qui permet de le déplacer vers la droite */
-    @Override public void moveRight() { super.moveRight(); }
-    /** Modifie l'offset qui permet de le déplacer vers la gauche */
-    @Override public void moveLeft() { super.moveLeft(); }
-    /** Modifie l'offset qui permet de le faire sauter */
-    @Override public void jump() { super.jump(); }
-    /** Modifie l'offset qui permet de tomber */
-    @Override public void fall() { super.fall(); }
-
     public void worldLimit()
     {
         if (super.worldLimit(this.environment))
-            this.offset[0] = (-1) * this.offset[0];
+            this.offset[0] = (-1) * this.getOffsetMoveX();
     }
 
 
diff --git a/src/main/java/fr/sae/terraria/modele/entities/Slime.java b/src/main/java/fr/sae/terraria/modele/entities/Slime.java
index c5fe6e0..f93846b 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/Slime.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/Slime.java
@@ -15,7 +15,7 @@ public class Slime extends EntityMovable implements CollideObjectType, Collapsib
 
     public Slime(Environment environment, int x, int y)
     {
-        super(x, y, environment);
+        super(environment, x, y);
         this.velocity = 2;
 
         this.setPv(3);
@@ -28,7 +28,7 @@ public Slime(Environment environment, int x, int y)
     public Slime(Environment environment) { this(environment, 0, 0); }
 
     @Override public void updates() {
-        if (this.offset[1] == Entity.IDLE && !this.air) {
+        if (this.isIDLEonY() && !this.air) {
             this.gravity.xInit = this.x.get();
             this.gravity.yInit = this.y.get();
             this.gravity.vInit = this.velocity;
@@ -36,12 +36,12 @@ public Slime(Environment environment, int x, int y)
             this.gravity.timer = .0;
         }
 
-        this.offset[0] = Entity.IDLE;
-        if (this.offset[1] == Entity.IS_JUMPING) {
+        this.idleOnX();
+        if (this.isJumping()) {
             if (this.environment.getPlayer().getX() > this.x.getValue())
-                this.offset[0] = Entity.IS_MOVING_RIGHT;
+                this.moveRight();
             else if (environment.getPlayer().getX() < this.x.getValue())
-                this.offset[0] = Entity.IS_MOVING_LEFT;
+                this.moveLeft();
         }
 
         this.move();
@@ -58,14 +58,14 @@ else if (environment.getPlayer().getX() < this.x.getValue())
 
         if (!whereCollide.isEmpty())
             if (whereCollide.get("left").equals(Boolean.TRUE) || whereCollide.get("right").equals(Boolean.TRUE))
-                this.offset[0] = Entity.IDLE;
+                this.idleOnX();
     }
 
     @Override public void move()
     {
         if (((int) (this.animation.getFrame()) == 3))
-            if (this.offset[1] != Entity.IS_FALLING) this.jump();
-        this.setX(this.getX() + (this.offset[0] * this.velocity));
+            if (this.isNotFalling()) this.jump();
+        this.setX(this.getX() + (this.getOffsetMoveX() * this.velocity));
     }
 
     @Override public void hit()
@@ -80,17 +80,10 @@ else if (environment.getPlayer().getX() < this.x.getValue())
         this.getGravity().setXInit(x);
         this.getGravity().setYInit(y);
         this.setRect(environment.widthTile, environment.heightTile);
+
         this.environment.getEntities().add(this);
         this.environment.getSlimes().add(this);
     }
 
-    @Override public void moveRight() { super.moveRight(); }
-
-    @Override public void moveLeft() { super.moveLeft(); }
-
-    @Override public void jump() { super.jump(); }
-
-    @Override public void fall() { super.fall(); }
-
     public void worldLimit() { super.worldLimit(this.environment); }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/Torch.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/Torch.java
index 7e83cf3..35bdb53 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/Torch.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/Torch.java
@@ -17,7 +17,7 @@ public class Torch extends Block implements StowableObjectType, PlaceableObjectT
     private double yOrigin;
 
 
-    public Torch(Environment environment, int x, int y)
+    public Torch(final Environment environment, int x, int y)
     {
         super(x, y);
         this.environment = environment;
@@ -26,6 +26,8 @@ public Torch(Environment environment, int x, int y)
         this.yOrigin = y;
     }
 
+    public Torch(final Environment environment) { this(environment, 0, 0); }
+
     @Override public void updates() { /* TODO document why this method is empty */ }
 
     @Override public void breaks()
diff --git a/src/main/java/fr/sae/terraria/modele/entities/entity/EntityMovable.java b/src/main/java/fr/sae/terraria/modele/entities/entity/EntityMovable.java
index 341b036..a555a94 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/entity/EntityMovable.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/entity/EntityMovable.java
@@ -12,12 +12,13 @@ public abstract class EntityMovable extends Entity
     protected final Environment environment;
     protected final Gravity gravity;
 
+    public final int[] offset;
+
     protected double velocity;
     protected boolean air;
-    public int[] offset;
 
 
-    protected EntityMovable(int x, int y, final Environment environment)
+    protected EntityMovable(final Environment environment, int x, int y)
     {
         super(x, y);
         this.environment = environment;
@@ -28,7 +29,7 @@ protected EntityMovable(int x, int y, final Environment environment)
         this.velocity = 1;
     }
 
-    protected EntityMovable(final Environment environment) { this(0, 0, environment); }
+    protected EntityMovable(final Environment environment) { this(environment, 0, 0); }
 
     @Override public abstract void updates();
     public abstract void move();
@@ -41,7 +42,7 @@ protected EntityMovable(int x, int y, final Environment environment)
      *         left, right, top, bottom sera les clés qui peuvent être present lors d'une detection de collision.
      *         Il permettra de faire des actions personnalisées les actions faites par l'entité suivant d'où il rentre en collision avec son environment.
      */
-    protected Map<String, Boolean> collide(final Environment environment)
+    public Map<String, Boolean> collide(final Environment environment)
     {
         int widthTile = environment.widthTile; int heightTile = environment.heightTile;
         TileMaps tileMaps = environment.getTileMaps();
@@ -56,7 +57,7 @@ protected Map<String, Boolean> collide(final Environment environment)
             this.air = true;
 
         // Detection collision gauche droite
-        if (this.offset[0] != Entity.IDLE) {
+        if (this.isMoving()) {
             int yTop = (int) (getY()+CollideObjectType.COLLISION_TOLERANCE)/heightTile;
             int futurePositionXLeft = (int) ((getX()+CollideObjectType.COLLISION_TOLERANCE)+(velocity*offset[0]))/widthTile;
             int futurePositionXRight = (int) ((getX()+(-CollideObjectType.COLLISION_TOLERANCE)+(velocity*offset[0])) + (getRect().getWidth()))/widthTile;
@@ -72,17 +73,17 @@ protected Map<String, Boolean> collide(final Environment environment)
 
 
             // Tombe
-            if (this.offset[1] == Entity.IS_FALLING) {
+            if (this.isFalling()) {
                 this.gravity.degInit = 0;
                 double futurePositionY = gravity.formulaOfTrajectory() ;
                 boolean isCollideBottom = tileMaps.getTile(xLeft, (int) (futurePositionY + this.rect.getHeight())/heightTile) != TileMaps.SKY || tileMaps.getTile(xRight, (int) (futurePositionY + CollideObjectType.COLLISION_TOLERANCE +this.rect.getHeight())/heightTile) != TileMaps.SKY;
                 if (isCollideBottom) {
                     this.gravity.setJumpPosInit(this);
                     this.gravity.timer = 0;
-                    this.offset[1] = Entity.IDLE;
+                    this.idleOnY();
                 } else setY(futurePositionY);
                 // Saute
-            } else if (this.offset[1] == Entity.IS_JUMPING) {
+            } else if (this.isJumping()) {
                 double futurePositionY = gravity.formulaOfTrajectory();
 
                 boolean isCollideTop = tileMaps.getTile(xLeft, (int) (futurePositionY + CollideObjectType.COLLISION_TOLERANCE)/heightTile) != TileMaps.SKY || tileMaps.getTile(xRight, (int) (futurePositionY + CollideObjectType.COLLISION_TOLERANCE)/heightTile) != TileMaps.SKY;
@@ -102,7 +103,7 @@ protected Map<String, Boolean> collide(final Environment environment)
                     } else if (isCollideBottom) {
                         this.gravity.setJumpPosInit(this);
                         this.gravity.timer = 0;
-                        this.offset[1] = Entity.IDLE;
+                        this.idleOnY();
                         this.air = false;
                     } else this.setY(futurePositionY);
                 }
@@ -115,7 +116,7 @@ protected Map<String, Boolean> collide(final Environment environment)
 
             boolean isCollideBottom = tileMaps.getTile(xLeft, (int) (futurePositionY - CollideObjectType.COLLISION_TOLERANCE)/heightTile) != TileMaps.SKY || tileMaps.getTile(xRight, (int) (futurePositionY - CollideObjectType.COLLISION_TOLERANCE)/heightTile) != TileMaps.SKY;
             if (isCollideBottom) {
-                this.offset[1] = Entity.IDLE;
+                this.idleOnY();
                 this.air = false;
                 this.gravity.setJumpPosInit(this);
             } else setY(futurePositionY - this.rect.getHeight());
@@ -124,10 +125,23 @@ protected Map<String, Boolean> collide(final Environment environment)
         return whereCollide;
     }
 
-    protected void moveRight() { this.offset[0] = Entity.IS_MOVING_RIGHT; }
-    protected void moveLeft() { this.offset[0] = Entity.IS_MOVING_LEFT; }
-    protected void jump() { this.offset[1] = Entity.IS_JUMPING; }
-    protected void fall() { this.offset[1] = Entity.IS_FALLING; }
+    public void moveRight() { this.offset[0] = Entity.IS_MOVING_RIGHT; }
+    public void moveLeft() { this.offset[0] = Entity.IS_MOVING_LEFT; }
+    public void jump() { this.offset[1] = Entity.IS_JUMPING; }
+    public void fall() { this.offset[1] = Entity.IS_FALLING; }
+    public void idleOnX() { this.offset[0] = Entity.IDLE; }
+    public void idleOnY() { this.offset[1] = Entity.IDLE; }
+
+    public boolean isMovingRight() { return this.offset[0] == Entity.IS_MOVING_RIGHT; }
+    public boolean isMovingLeft() { return this.offset[0] == Entity.IS_MOVING_LEFT; }
+    public boolean isMoving() { return this.offset[0] != Entity.IDLE; }
+    public boolean isJumping() { return this.offset[1] == Entity.IS_JUMPING; }
+    public boolean isFalling() { return this.offset[1] == Entity.IS_FALLING; }
+    public boolean isNotFalling() { return this.offset[1] != Entity.IS_FALLING; }
+    /** Quand l'entité ne bouge plus sur l'axes des X */
+    public boolean isIDLEonX() { return this.offset[0] == Entity.IDLE; }
+    /** Quand l'entité ne bouge plus sur l'axes des Y */
+    public boolean isIDLEonY() { return this.offset[1] == Entity.IDLE; }
 
     /**
      * Lorsque le joueur sort de l'ecran et/ou de la carte, la fonction retourne une valeurs boolean qui sera manipulable sur les classes qui l'héritera.
@@ -135,18 +149,20 @@ protected Map<String, Boolean> collide(final Environment environment)
      *
      * @return false = ne sort pas | true = sort de l'écran soit vers la droite ou soit vers le bas
      */
-    protected boolean worldLimit(final Environment environment)
+    public boolean worldLimit(final Environment environment)
     {
         double widthMap = (environment.getTileMaps().getWidth()*environment.scaleMultiplicatorWidth*TileMaps.TILE_DEFAULT_SIZE) ;
 
-        boolean exceedsScreenOnLeft = offset[0] == Entity.IS_MOVING_LEFT && getX() < 0;
-        boolean exceedsScreenOnRight = offset[0] == Entity.IS_MOVING_RIGHT && getX()+CollideObjectType.COLLISION_TOLERANCE+velocity + getRect().getWidth() + 3 >= widthMap;
+        boolean exceedsScreenOnLeft = this.isMovingLeft() && this.getX() < 0;
+        boolean exceedsScreenOnRight = this.isMovingRight() && this.getX()+CollideObjectType.COLLISION_TOLERANCE+this.velocity + this.getRect().getWidth() + 3 >= widthMap;
         return (exceedsScreenOnLeft || exceedsScreenOnRight);
     }
 
 
     public double getVelocity() { return this.velocity; }
     public Gravity getGravity() { return this.gravity; }
+    public int getOffsetMoveX() { return this.offset[0]; }
+    public int getOffsetMoveY() { return this.offset[1]; }
 
     public void setVelocity(double velocity) { this.velocity = velocity; }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
index a575308..116fb6e 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
@@ -5,7 +5,6 @@
 import fr.sae.terraria.modele.entities.player.inventory.Inventory;
 import fr.sae.terraria.modele.entities.player.inventory.Stack;
 import fr.sae.terraria.vue.View;
-import javafx.beans.property.BooleanProperty;
 import javafx.beans.property.ObjectProperty;
 import javafx.beans.property.SimpleBooleanProperty;
 import javafx.beans.property.SimpleObjectProperty;
@@ -27,16 +26,17 @@ public class Player extends EntityMovable implements CollideObjectType, Collapsi
     private final EnumMap<MouseButton, Boolean> mouseInput;
 
     private final ObjectProperty objectWasPickup;
+    private final SimpleBooleanProperty drunk;
 
     private final Inventory inventory;
     private Stack stackSelected;
-    private SimpleBooleanProperty drunk;
 
 
     public Player(final Environment environment)
     {
-        super(0, 0, environment);
-        drunk = new SimpleBooleanProperty(false);
+        super(environment, 0, 0);
+
+        this.drunk = new SimpleBooleanProperty(false);
         this.inventory = new Inventory(this);
 
         this.animation = new Animation();
@@ -52,7 +52,7 @@ public Player(final Environment environment)
         // Applique les déplacements selon les valeurs de l'offset
         // this.setX(this.x.get() + this.offset[0] * this.velocity);
 
-        if (this.offset[1] == Entity.IDLE && !air) {
+        if (this.isIDLEonY() && !air) {
             this.gravity.xInit = this.x.get();
             this.gravity.yInit = this.y.get();
             this.gravity.vInit = this.velocity;
@@ -61,7 +61,7 @@ public Player(final Environment environment)
             this.gravity.timer = .0;
         }
 
-        this.offset[0] = Entity.IDLE;
+        this.idleOnX();
         this.eventInput();
         this.collide();
         this.worldLimit();
@@ -72,7 +72,7 @@ public Player(final Environment environment)
         this.animation.loop();
     }
 
-    @Override public void move() { this.setX(this.getX() + this.offset[0] * this.getVelocity()); }
+    @Override public void move() { this.setX(this.getX() + this.getOffsetMoveX() * this.getVelocity()); }
 
     @Override public void collide()
     {
@@ -80,7 +80,7 @@ public Player(final Environment environment)
 
         if (!whereCollide.isEmpty()) {
             if (whereCollide.get("left").equals(Boolean.TRUE) || whereCollide.get("right").equals(Boolean.TRUE))
-                this.offset[0] = Entity.IDLE;
+                this.idleOnX();
         }
     }
 
@@ -102,7 +102,7 @@ public Player(final Environment environment)
     public void worldLimit()
     {
         if (super.worldLimit(this.environment))
-            this.offset[0] = Entity.IDLE;
+            this.idleOnX();
     }
 
     /** Lie les inputs au clavier à une ou des actions. */
@@ -113,7 +113,7 @@ public void eventInput()
         this.keysInput.forEach((key, value) -> {
             if (Boolean.TRUE.equals(value)) {
                 if (key == KeyCode.Z || key == KeyCode.SPACE)
-                    if (this.offset[1] != Entity.IS_FALLING) this.jump();
+                    if (this.isNotFalling()) this.jump();
 
                 if (key == KeyCode.D)
                     this.moveRight();
@@ -125,12 +125,13 @@ else if (key == KeyCode.Q)
 
     public void pickup(StowableObjectType pickupObject) { this.objectWasPickup.set(pickupObject); }
 
+    public SimpleBooleanProperty drunkProperty() { return drunk; }
+
 
     public Map<MouseButton, Boolean> getMouseInput() { return this.mouseInput; }
     public Map<KeyCode, Boolean> getKeysInput() { return this.keysInput; }
     public Stack getStackSelected() { return this.stackSelected; }
     public Inventory getInventory() { return this.inventory; }
-    public boolean isDrunk() {return drunk.get();}
-    public SimpleBooleanProperty drunkProperty() {return drunk;}
+
     public void setStackSelected(Stack stackSelected) { this.stackSelected = stackSelected; }
 }
diff --git a/src/main/java/fr/sae/terraria/vue/Camera.java b/src/main/java/fr/sae/terraria/vue/Camera.java
index bdd0645..fb59137 100644
--- a/src/main/java/fr/sae/terraria/vue/Camera.java
+++ b/src/main/java/fr/sae/terraria/vue/Camera.java
@@ -3,7 +3,6 @@
 import fr.sae.terraria.Terraria;
 import fr.sae.terraria.modele.Environment;
 import fr.sae.terraria.modele.TileMaps;
-import fr.sae.terraria.modele.entities.entity.Entity;
 import fr.sae.terraria.modele.entities.player.Player;
 import javafx.beans.binding.Bindings;
 import javafx.scene.layout.StackPane;
@@ -50,7 +49,7 @@ public Camera(final Environment environment, final StackPane paneHadCamera)
         player.getYProperty().addListener((obs, oldX, newX) -> {
             // Suit le joueur
             centerPlayerOnYIntoCamera[0] = player.getY() - midHeightCamera;
-            if (player.offset[1] == Entity.IS_JUMPING) {
+            if (player.isJumping()) {
                 gap[0] = player.getGravity().yInit - player.getY();
                 centerPlayerOnYIntoCamera[0] = player.getGravity().yInit - midHeightCamera;
                 if (player.getGravity().timer > player.getGravity().flightTime*2 /* Légère bidouille */)
@@ -58,7 +57,7 @@ public Camera(final Environment environment, final StackPane paneHadCamera)
             }
 
             // Décale "proprement" la caméra vers le haut
-            if (player.offset[1] == Entity.IDLE && gap[0] > 0) {
+            if (player.isIDLEonY() && gap[0] > 0) {
                 gap[0] /= 2;
                 centerPlayerOnYIntoCamera[0] = (player.getY() + gap[0]) - midHeightCamera;
             }
diff --git a/src/main/java/fr/sae/terraria/vue/PlayerView.java b/src/main/java/fr/sae/terraria/vue/PlayerView.java
index 6c612ec..74829a6 100644
--- a/src/main/java/fr/sae/terraria/vue/PlayerView.java
+++ b/src/main/java/fr/sae/terraria/vue/PlayerView.java
@@ -1,6 +1,5 @@
 package fr.sae.terraria.vue;
 
-import fr.sae.terraria.modele.entities.entity.Entity;
 import fr.sae.terraria.modele.entities.player.Player;
 import javafx.geometry.Rectangle2D;
 import javafx.scene.image.Image;
@@ -49,14 +48,14 @@ private void setAnimation()
 
         player.getAnimation().getFrameProperty().addListener((obs, oldFrame, newFrame) -> {
             this.playerImgView.setViewport(new Rectangle2D(0, 0, widthPlayer, heightPlayer));
-            if (player.offset[0] == Entity.IDLE && player.offset[1] == Entity.IDLE)
+            if (this.player.isIDLEonX() && this.player.isIDLEonY())
                 this.playerImgView.setImage(this.playerIdleImg);
 
-            if (player.offset[0] == Entity.IS_MOVING_RIGHT || player.offset[0] == Entity.IS_MOVING_LEFT) {
+            if (this.player.isMoving()) {
                 Rectangle2D frameRect = new Rectangle2D((newFrame.intValue() * widthPlayer), 0, widthPlayer, heightPlayer);
 
                 this.playerImgView.setViewport(frameRect);
-                this.playerImgView.setImage((player.offset[0] == -1) ? playerMoveLeftImg : playerMoveRightImg);
+                this.playerImgView.setImage((this.player.isMovingLeft()) ? playerMoveLeftImg : playerMoveRightImg);
             }
         });
     }
@@ -65,6 +64,6 @@ private void setAnimation()
     public void displayPlayer(final Pane display)
     {
         this.setAnimation();
-        display.getChildren().add(playerImgView);
+        display.getChildren().add(this.playerImgView);
     }
 }
diff --git a/src/main/java/fr/sae/terraria/vue/RabbitView.java b/src/main/java/fr/sae/terraria/vue/RabbitView.java
index 2ed3744..79c8f34 100644
--- a/src/main/java/fr/sae/terraria/vue/RabbitView.java
+++ b/src/main/java/fr/sae/terraria/vue/RabbitView.java
@@ -2,7 +2,6 @@
 
 import fr.sae.terraria.modele.TileMaps;
 import fr.sae.terraria.modele.entities.Rabbit;
-import fr.sae.terraria.modele.entities.entity.Entity;
 import javafx.geometry.Rectangle2D;
 import javafx.scene.image.Image;
 import javafx.scene.image.ImageView;
@@ -47,11 +46,11 @@ private void setAnimation()
 
         this.rabbit.getAnimation().getFrameProperty().addListener((obs, oldFrame, newFrame) -> {
             this.rabbitImgView.setViewport(new Rectangle2D(0, 0, this.widthTile, this.heightTile));
-            if (this.rabbit.offset[0] == Entity.IS_MOVING_RIGHT || this.rabbit.offset[0] == Entity.IS_MOVING_LEFT) {
+            if (this.rabbit.isMoving()) {
                 Rectangle2D frameRect = new Rectangle2D((newFrame.intValue() * this.widthTile), 0, this.widthTile, this.heightTile);
 
                 this.rabbitImgView.setViewport(frameRect);
-                this.rabbitImgView.setImage((this.rabbit.offset[0] == -1) ? this.rabbitLeftImg : this.rabbitRightImg);
+                this.rabbitImgView.setImage((this.rabbit.isMovingLeft()) ? this.rabbitLeftImg : this.rabbitRightImg);
             }
         });
     }

From 9a003979904651974f6df5534fe3f721fff55c3d Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Sat, 11 Jun 2022 08:07:04 +0200
Subject: [PATCH 17/97] =?UTF-8?q?Review=20du=20code=20des=20vues=20de=20di?=
 =?UTF-8?q?ff=C3=A9rentes=20entit=C3=A9s.=20Refonte=20complet=20de=20cette?=
 =?UTF-8?q?=20partie?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../modele/entities/entity/Animation.java     |  3 +-
 .../java/fr/sae/terraria/vue/PlayerView.java  | 69 -------------------
 .../java/fr/sae/terraria/vue/RabbitView.java  | 66 ------------------
 .../java/fr/sae/terraria/vue/SlimeView.java   | 50 --------------
 .../fr/sae/terraria/vue/TileMapsView.java     | 10 +--
 src/main/java/fr/sae/terraria/vue/View.java   |  9 ++-
 .../sae/terraria/vue/entities/EntityView.java | 49 +++++++++++++
 .../sae/terraria/vue/entities/PlayerView.java | 45 ++++++++++++
 .../sae/terraria/vue/entities/RabbitView.java | 41 +++++++++++
 .../sae/terraria/vue/entities/SlimeView.java  | 35 ++++++++++
 10 files changed, 184 insertions(+), 193 deletions(-)
 delete mode 100644 src/main/java/fr/sae/terraria/vue/PlayerView.java
 delete mode 100644 src/main/java/fr/sae/terraria/vue/RabbitView.java
 delete mode 100644 src/main/java/fr/sae/terraria/vue/SlimeView.java
 create mode 100644 src/main/java/fr/sae/terraria/vue/entities/EntityView.java
 create mode 100644 src/main/java/fr/sae/terraria/vue/entities/PlayerView.java
 create mode 100644 src/main/java/fr/sae/terraria/vue/entities/RabbitView.java
 create mode 100644 src/main/java/fr/sae/terraria/vue/entities/SlimeView.java

diff --git a/src/main/java/fr/sae/terraria/modele/entities/entity/Animation.java b/src/main/java/fr/sae/terraria/modele/entities/entity/Animation.java
index 6a77374..e1fc54b 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/entity/Animation.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/entity/Animation.java
@@ -1,5 +1,6 @@
 package fr.sae.terraria.modele.entities.entity;
 
+import fr.sae.terraria.vue.entities.PlayerView;
 import javafx.beans.property.DoubleProperty;
 import javafx.beans.property.SimpleDoubleProperty;
 
@@ -8,7 +9,7 @@
  * <h1>Animation</h1>
  * <h2><u>Description:</u></h2>
  * <p>Gére uniquement la valeurs du frame pour que la vue sachent sur quel frame doit afficher l'image.</p>
- * @see fr.sae.terraria.vue.PlayerView
+ * @see PlayerView
  */
 public class Animation
 {
diff --git a/src/main/java/fr/sae/terraria/vue/PlayerView.java b/src/main/java/fr/sae/terraria/vue/PlayerView.java
deleted file mode 100644
index 74829a6..0000000
--- a/src/main/java/fr/sae/terraria/vue/PlayerView.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package fr.sae.terraria.vue;
-
-import fr.sae.terraria.modele.entities.player.Player;
-import javafx.geometry.Rectangle2D;
-import javafx.scene.image.Image;
-import javafx.scene.image.ImageView;
-import javafx.scene.layout.Pane;
-
-
-public class PlayerView
-{
-    private final ImageView playerImgView;
-
-    private final Image playerMoveRightImg;
-    private final Image playerMoveLeftImg;
-    private final Image playerIdleImg;
-
-    private final Player player;
-
-    private int widthPlayer;
-    private int heightPlayer;
-
-
-    public PlayerView(Player player, double scaleMultiplicatorWidth, double scaleMultiplicatorHeight)
-    {
-        this.player = player;
-
-        this.playerIdleImg = View.loadAnImage("sprites/player/player_idle.png", scaleMultiplicatorWidth, scaleMultiplicatorHeight);
-        this.playerMoveRightImg = View.loadAnImage("sprites/player/player_moveRight.png", scaleMultiplicatorWidth, scaleMultiplicatorHeight);
-        this.playerMoveLeftImg = View.loadAnImage("sprites/player/player_moveLeft.png", scaleMultiplicatorWidth, scaleMultiplicatorHeight);
-
-        this.widthPlayer = (int) this.playerIdleImg.getWidth();
-        this.heightPlayer = (int) this.playerIdleImg.getHeight();
-
-        this.playerImgView = View.createImageView(player, playerIdleImg);
-    }
-
-    /** Applique l'animation sur le joueur */
-    private void setAnimation()
-    {
-        // Change la limite de frame de l'animation selon le sprite sheet chargé
-        this.playerImgView.imageProperty().addListener((obs, oldImg, newImg) -> {
-            int newEndFrame = (int) (newImg.getWidth() / widthPlayer);
-            if (this.player.getAnimation().getFrame() >= newEndFrame)
-                this.player.getAnimation().reset();
-            this.player.getAnimation().setEndFrame(newEndFrame);
-        });
-
-        player.getAnimation().getFrameProperty().addListener((obs, oldFrame, newFrame) -> {
-            this.playerImgView.setViewport(new Rectangle2D(0, 0, widthPlayer, heightPlayer));
-            if (this.player.isIDLEonX() && this.player.isIDLEonY())
-                this.playerImgView.setImage(this.playerIdleImg);
-
-            if (this.player.isMoving()) {
-                Rectangle2D frameRect = new Rectangle2D((newFrame.intValue() * widthPlayer), 0, widthPlayer, heightPlayer);
-
-                this.playerImgView.setViewport(frameRect);
-                this.playerImgView.setImage((this.player.isMovingLeft()) ? playerMoveLeftImg : playerMoveRightImg);
-            }
-        });
-    }
-
-    /** Synchronise les coordonnées en x et y du joueur avec l'image et ensuite l'affiche sur le Pane */
-    public void displayPlayer(final Pane display)
-    {
-        this.setAnimation();
-        display.getChildren().add(this.playerImgView);
-    }
-}
diff --git a/src/main/java/fr/sae/terraria/vue/RabbitView.java b/src/main/java/fr/sae/terraria/vue/RabbitView.java
deleted file mode 100644
index 79c8f34..0000000
--- a/src/main/java/fr/sae/terraria/vue/RabbitView.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package fr.sae.terraria.vue;
-
-import fr.sae.terraria.modele.TileMaps;
-import fr.sae.terraria.modele.entities.Rabbit;
-import javafx.geometry.Rectangle2D;
-import javafx.scene.image.Image;
-import javafx.scene.image.ImageView;
-import javafx.scene.layout.Pane;
-
-
-public class RabbitView
-{
-    private final ImageView rabbitImgView;
-
-    private final Image rabbitLeftImg;
-    private final Image rabbitRightImg;
-
-    private final Rabbit rabbit;
-
-    private int widthTile;
-    private int heightTile;
-
-
-    public RabbitView(final Rabbit rabbit, double scaleMultiplicatorWidth, double scaleMultiplicatorHeight)
-    {
-        super();
-        this.rabbit = rabbit;
-
-        this.widthTile = (int) (scaleMultiplicatorWidth * TileMaps.TILE_DEFAULT_SIZE);
-        this.heightTile = (int) (scaleMultiplicatorHeight * TileMaps.TILE_DEFAULT_SIZE);
-
-        this.rabbitLeftImg = View.loadAnImage("sprites/rabbit/rabbit_left.png", widthTile*4, heightTile);
-        this.rabbitRightImg = View.loadAnImage("sprites/rabbit/rabbit_right.png", widthTile*4, heightTile);
-        this.rabbitImgView = View.createImageView(rabbit, rabbitLeftImg);
-    }
-
-    private void setAnimation()
-    {
-        // Change la limite de frame de l'animation selon le sprite sheet chargé
-        this.rabbitImgView.imageProperty().addListener((obs, oldImg, newImg) -> {
-            int newEndFrame = (int) (newImg.getWidth() / this.widthTile);
-            if (this.rabbit.getAnimation().getFrame() >= newEndFrame)
-                this.rabbit.getAnimation().reset();
-            this.rabbit.getAnimation().setEndFrame(newEndFrame);
-        });
-
-        this.rabbit.getAnimation().getFrameProperty().addListener((obs, oldFrame, newFrame) -> {
-            this.rabbitImgView.setViewport(new Rectangle2D(0, 0, this.widthTile, this.heightTile));
-            if (this.rabbit.isMoving()) {
-                Rectangle2D frameRect = new Rectangle2D((newFrame.intValue() * this.widthTile), 0, this.widthTile, this.heightTile);
-
-                this.rabbitImgView.setViewport(frameRect);
-                this.rabbitImgView.setImage((this.rabbit.isMovingLeft()) ? this.rabbitLeftImg : this.rabbitRightImg);
-            }
-        });
-    }
-
-    public void displayRabbit(final Pane display)
-    {
-        this.setAnimation();
-        display.getChildren().add(this.rabbitImgView);
-    }
-
-
-    public ImageView getRabbitImgView() { return this.rabbitImgView; }
-}
diff --git a/src/main/java/fr/sae/terraria/vue/SlimeView.java b/src/main/java/fr/sae/terraria/vue/SlimeView.java
deleted file mode 100644
index 935c84d..0000000
--- a/src/main/java/fr/sae/terraria/vue/SlimeView.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package fr.sae.terraria.vue;
-
-import fr.sae.terraria.modele.TileMaps;
-import fr.sae.terraria.modele.entities.Slime;
-import javafx.geometry.Rectangle2D;
-import javafx.scene.image.Image;
-import javafx.scene.image.ImageView;
-import javafx.scene.layout.Pane;
-
-
-public class SlimeView
-{
-    private final ImageView slimeImgView;
-
-    private final Image slimeImg;
-
-    private final Slime slime;
-    private int widthTile;
-    private int heightTile;
-
-
-    public SlimeView(final Slime slime, double scaleMultiplicatorWidth, double scaleMultiplicatorHeight)
-    {
-        super();
-        this.slime = slime;
-
-        this.widthTile = (int) (scaleMultiplicatorWidth * TileMaps.TILE_DEFAULT_SIZE);
-        this.heightTile = (int) (scaleMultiplicatorHeight * TileMaps.TILE_DEFAULT_SIZE);
-
-        this.slimeImg = View.loadAnImage("sprites/slimes/green_slime.png", widthTile*4, heightTile);
-        this.slimeImgView = View.createImageView(slime, slimeImg);
-    }
-
-    private void setAnimation()
-    {
-        this.slime.getAnimation().getFrameProperty().addListener((obs, oldV, newV) -> {
-            Rectangle2D frameRect = new Rectangle2D(newV.intValue() * this.widthTile, 0, this.widthTile, this.heightTile);
-            this.slimeImgView.setViewport(frameRect);
-        });
-    }
-
-    public void displaySlime(final Pane display)
-    {
-        this.setAnimation();
-        display.getChildren().add(this.slimeImgView);
-    }
-
-
-    public ImageView getSlimeImgView() { return this.slimeImgView; }
-}
diff --git a/src/main/java/fr/sae/terraria/vue/TileMapsView.java b/src/main/java/fr/sae/terraria/vue/TileMapsView.java
index 9aed0c9..70da741 100644
--- a/src/main/java/fr/sae/terraria/vue/TileMapsView.java
+++ b/src/main/java/fr/sae/terraria/vue/TileMapsView.java
@@ -5,6 +5,8 @@
 import fr.sae.terraria.modele.entities.Rabbit;
 import fr.sae.terraria.modele.entities.Slime;
 import fr.sae.terraria.modele.entities.blocks.*;
+import fr.sae.terraria.vue.entities.RabbitView;
+import fr.sae.terraria.vue.entities.SlimeView;
 import javafx.collections.ListChangeListener;
 import javafx.geometry.Rectangle2D;
 import javafx.scene.Group;
@@ -133,8 +135,8 @@ private void updatesRabbitView(ListChangeListener.Change<? extends Rabbit> c)
         while (c.next()) {
             if (c.wasAdded()) {
                 RabbitView rabbitView = new RabbitView(c.getAddedSubList().get(0), environment.scaleMultiplicatorWidth, environment.scaleMultiplicatorHeight);
-                rabbitView.displayRabbit(this.displayHostileBeings);
-                this.rabbitsView.add(rabbitView.getRabbitImgView());
+                rabbitView.display(this.displayHostileBeings);
+                this.rabbitsView.add(rabbitView.getImgView());
             }
 
             if (c.wasRemoved()) {
@@ -149,8 +151,8 @@ private void updatesSlimeView(ListChangeListener.Change<? extends Slime> c)
         while (c.next()) {
             if (c.wasAdded()) {
                 SlimeView slimeView = new SlimeView(c.getAddedSubList().get(0), environment.scaleMultiplicatorWidth, environment.scaleMultiplicatorHeight);
-                slimeView.displaySlime(this.displayHostileBeings);
-                this.slimesView.add(slimeView.getSlimeImgView());
+                slimeView.display(this.displayHostileBeings);
+                this.slimesView.add(slimeView.getImgView());
             }
 
             if (c.wasRemoved()) {
diff --git a/src/main/java/fr/sae/terraria/vue/View.java b/src/main/java/fr/sae/terraria/vue/View.java
index 1da6798..530df87 100644
--- a/src/main/java/fr/sae/terraria/vue/View.java
+++ b/src/main/java/fr/sae/terraria/vue/View.java
@@ -4,6 +4,8 @@
 import fr.sae.terraria.controller.GameController;
 import fr.sae.terraria.modele.Environment;
 import fr.sae.terraria.modele.entities.entity.Entity;
+import fr.sae.terraria.modele.entities.player.Player;
+import fr.sae.terraria.vue.entities.PlayerView;
 import fr.sae.terraria.vue.hud.HUDView;
 import fr.sae.terraria.vue.hud.MouseCursorView;
 import javafx.scene.image.Image;
@@ -17,7 +19,7 @@
 
 public class View
 {
-    private static Environment environment;
+    private Environment environment;
 
 
     /**
@@ -40,8 +42,9 @@ public View(final GameController gameController)
         TileMapsView tileMapsView = new TileMapsView(environment, displayTiledMap, displayHostileBeings, scaleMultiplicatorWidth, scaleMultiplicatorHeight);
         tileMapsView.displayMaps(environment.getTileMaps());
 
-        PlayerView playerView = new PlayerView(environment.getPlayer(), scaleMultiplicatorWidth, scaleMultiplicatorHeight);
-        playerView.displayPlayer(displayHostileBeings);
+        Player player = this.environment.getPlayer();
+        PlayerView playerView = new PlayerView(player, scaleMultiplicatorWidth, scaleMultiplicatorHeight);
+        playerView.display(displayHostileBeings);
 
         LightView lightView = new LightView(environment.getGameClock(),filter,environment);
         DrunkView drunkView = new DrunkView(environment,gameController.paneHadCamera);
diff --git a/src/main/java/fr/sae/terraria/vue/entities/EntityView.java b/src/main/java/fr/sae/terraria/vue/entities/EntityView.java
new file mode 100644
index 0000000..056e809
--- /dev/null
+++ b/src/main/java/fr/sae/terraria/vue/entities/EntityView.java
@@ -0,0 +1,49 @@
+package fr.sae.terraria.vue.entities;
+
+import fr.sae.terraria.modele.entities.entity.Entity;
+import javafx.scene.image.ImageView;
+import javafx.scene.layout.Pane;
+
+
+public abstract class EntityView
+{
+    protected final ImageView imgView;
+    protected final Entity entity;
+
+
+    protected EntityView(final Entity entity)
+    {
+        this.entity = entity;
+
+        this.imgView = new ImageView();
+        this.imgView.translateXProperty().bind(entity.getXProperty());
+        this.imgView.translateYProperty().bind(entity.getYProperty());
+    }
+
+    protected abstract void animation(int frame);
+
+    private void startAnimation()
+    {
+        int widthEntity = this.entity.getRect().getWidth();
+        // int heightEntity = this.entity.getRect().getHeight();
+
+        // Change la limite de frame de l'animation selon le sprite sheet chargé
+        this.imgView.imageProperty().addListener((obs, oldImg, newImg) -> {
+            int newEndFrame = (int) (newImg.getWidth() / widthEntity);
+            if (this.entity.getAnimation().getFrame() >= newEndFrame)
+                this.entity.getAnimation().reset();
+            this.entity.getAnimation().setEndFrame(newEndFrame);
+        });
+
+        this.entity.getAnimation().getFrameProperty().addListener((obs, oldFrame, newFrame) -> this.animation(newFrame.intValue()));
+    }
+
+    public void display(final Pane display)
+    {
+        display.getChildren().add(this.imgView);
+        this.startAnimation();
+    }
+
+
+    public ImageView getImgView() { return this.imgView; }
+}
diff --git a/src/main/java/fr/sae/terraria/vue/entities/PlayerView.java b/src/main/java/fr/sae/terraria/vue/entities/PlayerView.java
new file mode 100644
index 0000000..8b2692a
--- /dev/null
+++ b/src/main/java/fr/sae/terraria/vue/entities/PlayerView.java
@@ -0,0 +1,45 @@
+package fr.sae.terraria.vue.entities;
+
+import fr.sae.terraria.modele.entities.player.Player;
+import fr.sae.terraria.vue.View;
+import javafx.geometry.Rectangle2D;
+import javafx.scene.image.Image;
+
+
+public class PlayerView extends EntityView
+{
+    private final Image playerMoveRightImg;
+    private final Image playerMoveLeftImg;
+    private final Image playerIdleImg;
+
+    private int widthPlayer;
+    private int heightPlayer;
+
+
+    public PlayerView(final Player player, double scaleMultiplicatorWidth, double scaleMultiplicatorHeight)
+    {
+        super(player);
+
+        this.playerIdleImg = View.loadAnImage("sprites/player/player_idle.png", scaleMultiplicatorWidth, scaleMultiplicatorHeight);
+        this.playerMoveRightImg = View.loadAnImage("sprites/player/player_moveRight.png", scaleMultiplicatorWidth, scaleMultiplicatorHeight);
+        this.playerMoveLeftImg = View.loadAnImage("sprites/player/player_moveLeft.png", scaleMultiplicatorWidth, scaleMultiplicatorHeight);
+        this.imgView.setImage(playerIdleImg);
+
+        this.widthPlayer = (int) this.playerIdleImg.getWidth();
+        this.heightPlayer = (int) this.playerIdleImg.getHeight();
+    }
+
+    @Override protected void animation(int frame)
+    {
+        this.imgView.setViewport(new Rectangle2D(0, 0, this.widthPlayer, this.heightPlayer));
+        if (((Player) this.entity).isIDLEonX() && ((Player) this.entity).isIDLEonY())
+            this.imgView.setImage(this.playerIdleImg);
+
+        if (((Player) this.entity).isMoving()) {
+            Rectangle2D frameRect = new Rectangle2D((frame * this.widthPlayer), 0, this.widthPlayer, this.heightPlayer);
+
+            this.imgView.setViewport(frameRect);
+            this.imgView.setImage((((Player) this.entity).isMovingLeft()) ? this.playerMoveLeftImg : this.playerMoveRightImg);
+        }
+    }
+}
diff --git a/src/main/java/fr/sae/terraria/vue/entities/RabbitView.java b/src/main/java/fr/sae/terraria/vue/entities/RabbitView.java
new file mode 100644
index 0000000..abde3b5
--- /dev/null
+++ b/src/main/java/fr/sae/terraria/vue/entities/RabbitView.java
@@ -0,0 +1,41 @@
+package fr.sae.terraria.vue.entities;
+
+import fr.sae.terraria.modele.TileMaps;
+import fr.sae.terraria.modele.entities.Rabbit;
+import fr.sae.terraria.vue.View;
+import javafx.geometry.Rectangle2D;
+import javafx.scene.image.Image;
+
+
+public class RabbitView extends EntityView
+{
+
+    private final Image rabbitLeftImg;
+    private final Image rabbitRightImg;
+
+
+    private int widthTile;
+    private int heightTile;
+
+
+    public RabbitView(final Rabbit rabbit, double scaleMultiplicatorWidth, double scaleMultiplicatorHeight)
+    {
+        super(rabbit);
+
+        this.widthTile = (int) (scaleMultiplicatorWidth * TileMaps.TILE_DEFAULT_SIZE);
+        this.heightTile = (int) (scaleMultiplicatorHeight * TileMaps.TILE_DEFAULT_SIZE);
+
+        this.rabbitLeftImg = View.loadAnImage("sprites/rabbit/rabbit_left.png", widthTile*4, heightTile);
+        this.rabbitRightImg = View.loadAnImage("sprites/rabbit/rabbit_right.png", widthTile*4, heightTile);
+    }
+
+    @Override protected void animation(int frame) {
+        this.imgView.setViewport(new Rectangle2D(0, 0, this.widthTile, this.heightTile));
+        if (((Rabbit) this.entity).isMoving()) {
+            Rectangle2D frameRect = new Rectangle2D((frame * this.widthTile), 0, this.widthTile, this.heightTile);
+
+            this.imgView.setViewport(frameRect);
+            this.imgView.setImage((((Rabbit) this.entity).isMovingLeft()) ? this.rabbitLeftImg : this.rabbitRightImg);
+        }
+    }
+}
diff --git a/src/main/java/fr/sae/terraria/vue/entities/SlimeView.java b/src/main/java/fr/sae/terraria/vue/entities/SlimeView.java
new file mode 100644
index 0000000..05d9104
--- /dev/null
+++ b/src/main/java/fr/sae/terraria/vue/entities/SlimeView.java
@@ -0,0 +1,35 @@
+package fr.sae.terraria.vue.entities;
+
+import fr.sae.terraria.modele.TileMaps;
+import fr.sae.terraria.modele.entities.Slime;
+import fr.sae.terraria.vue.View;
+import javafx.geometry.Rectangle2D;
+import javafx.scene.image.Image;
+import javafx.scene.image.ImageView;
+import javafx.scene.layout.Pane;
+
+
+public class SlimeView extends EntityView
+{
+    private final Image slimeImg;
+
+    private int widthTile;
+    private int heightTile;
+
+
+    public SlimeView(final Slime slime, double scaleMultiplicatorWidth, double scaleMultiplicatorHeight)
+    {
+        super(slime);
+
+        this.widthTile = (int) (scaleMultiplicatorWidth * TileMaps.TILE_DEFAULT_SIZE);
+        this.heightTile = (int) (scaleMultiplicatorHeight * TileMaps.TILE_DEFAULT_SIZE);
+
+        this.slimeImg = View.loadAnImage("sprites/slimes/green_slime.png", widthTile*4, heightTile);
+        this.imgView.setImage(slimeImg);
+    }
+
+    @Override protected void animation(int frame) {
+        Rectangle2D frameRect = new Rectangle2D(frame * this.widthTile, 0, this.widthTile, this.heightTile);
+        this.imgView.setViewport(frameRect);
+    }
+}

From d55ef49a726f6fd3b7a22fdf7a1b48eb1bb1e76e Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Sat, 11 Jun 2022 08:47:49 +0200
Subject: [PATCH 18/97] JavaDocs

---
 .../fr/sae/terraria/modele/Environment.java   |  3 +-
 .../sae/terraria/modele/GenerateEntity.java   |  4 ++
 .../java/fr/sae/terraria/modele/TileMaps.java | 16 +++++++
 .../modele/entities/entity/Entity.java        | 16 +------
 .../fr/sae/terraria/vue/TileMapsView.java     | 43 +++++++++++++++++++
 .../sae/terraria/vue/entities/EntityView.java | 17 ++++++++
 6 files changed, 83 insertions(+), 16 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/modele/Environment.java b/src/main/java/fr/sae/terraria/modele/Environment.java
index 941b12c..967ca08 100644
--- a/src/main/java/fr/sae/terraria/modele/Environment.java
+++ b/src/main/java/fr/sae/terraria/modele/Environment.java
@@ -79,6 +79,7 @@ public Environment(double scaleMultiplicatorWidth, double scaleMultiplicatorHeig
         this.blocks = FXCollections.observableArrayList();
         this.trees = FXCollections.observableArrayList();
 
+        // Fait apparaitre le joueur.
         this.player = new Player(this);
         this.player.setVelocity(5);
         this.player.setPv(4);
@@ -141,7 +142,7 @@ private void gameLoop()
             boolean nightTime = this.clock.getMinutes() > (Clock.MINUTES_IN_A_DAY)/2;
             boolean weHaveChangedDay = this.previousDays != this.clock.getDays();
             if (weHaveChangedDay)
-                for (int i = 0; i < 3; i++); // Génère par jour, 3 arbres
+                for (int i = 0; i < 10; i++) // Génère par jour, 3 arbres
                     GenerateEntity.tree(this);
             if (dayTime) {  // Génère certaines entités uniquement pendant le jour
                 GenerateEntity.rabbit(this);
diff --git a/src/main/java/fr/sae/terraria/modele/GenerateEntity.java b/src/main/java/fr/sae/terraria/modele/GenerateEntity.java
index 2e96b57..ef239ab 100644
--- a/src/main/java/fr/sae/terraria/modele/GenerateEntity.java
+++ b/src/main/java/fr/sae/terraria/modele/GenerateEntity.java
@@ -21,6 +21,10 @@
 import static fr.sae.terraria.modele.entities.blocks.Tree.WHEN_SPAWN_A_TREE;
 
 
+/**
+ * <h1>Generate Entity</h1>
+ * <h2>Une classe qui permet de génère aléatoirement des entités</h2>
+ */
 public class GenerateEntity
 {
     public static final int MAX_SPAWN_RABBIT = 100;
diff --git a/src/main/java/fr/sae/terraria/modele/TileMaps.java b/src/main/java/fr/sae/terraria/modele/TileMaps.java
index 2a7f312..4009aad 100644
--- a/src/main/java/fr/sae/terraria/modele/TileMaps.java
+++ b/src/main/java/fr/sae/terraria/modele/TileMaps.java
@@ -5,6 +5,15 @@
 import java.io.FileReader;
 
 
+/**
+ * <h1>Tile maps</h1>
+ * <h2>Génère à l'écran la carte tuilé</h2>
+ * <h3><u>Description:</u></h3>
+ * <p>Cette classes permet à partir d'un fichier <code>.json</code> de chargé les données de la carte</p>
+ * <p>Il est conservé dans la variable <code>maps</code></p>
+ *
+ * @author CHRZASZCZ Naulan
+ */
 public class TileMaps
 {
     // Constantes
@@ -89,5 +98,12 @@ public void load(final String path)
     public int getWidth() { return this.maps[0].length; }
     public int getTile(int x, int y) { return this.maps[y][x]; }
 
+    /**
+     * Remplace grâce aux coordonnées entrées, un tile par celui qui est mis dans l'argument
+     *
+     * @param tileIndex Le tile qui doit remplacer une autre.
+     * @param x la position horizontal de là où le tile doit être écrit
+     * @param y la position vertical de là où le tile doit être écrit
+     */
     public void setTile(int tileIndex, int y, int x) { this.maps[y][x] = tileIndex; }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/entity/Entity.java b/src/main/java/fr/sae/terraria/modele/entities/entity/Entity.java
index f29cefe..1f94889 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/entity/Entity.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/entity/Entity.java
@@ -7,23 +7,8 @@
 /**
  * <h1><b>La classes Entity</b></h1>
  * <h2><u>Description:</u></h2>
- *
  * <p>Correspond à un element physique qui doit avoir des coordonnées sur un environment.</p>
- * <p>contient des fonctions privates qui peuvent êtres implémenter grâce au interface mise à disposition au sain du même package</p>
- * <p></p>
- * <p>C'est interfaces agissent comme une sorte de pâte à modelé, ils permettent surtout de
- * rendre public les fonctions de Entity qui sont eux protected</p>
- *
- * <h2><u>Comment l'utiliser ?</u></h2>
- * <p>Il suffit d'extend des objects qui vous souhaitez êtres des entitées</p>
- * <p><u>Exemple de code qui hérite de Entity:</u></p>
- * <img src="https://raw.githubusercontent.com/NaulaN/SAE-Terraria-Like/develop/src/main/resources/fr/sae/terraria/docs/ExampleExtendEntity.PNG"/>
- * <p>Donc sur cette exemple dans le jeu, le lapin est considèrer comme une entités.</p>
- * <p></p>
- * <p>Toutes les méthodes/fonctions protected sont appelable vers l'extérieur d'un classes qui l'hérite grâce à des interfaces.</p>
- * <p>Donc pour avoir correctement les fonctions:</p>
  *
- * <p>Sont implementable grâce à l'interface MovableObjectType</p>
  * @see CollideObjectType
  * @see ReproductiveObjectType
  * @see StowableObjectType
@@ -32,6 +17,7 @@
  * @see PlaceableObjectType
  * @see EatableObjectType
  *
+ *
  * @author CHRZASZCZ Naulan
  */
 public abstract class Entity
diff --git a/src/main/java/fr/sae/terraria/vue/TileMapsView.java b/src/main/java/fr/sae/terraria/vue/TileMapsView.java
index 70da741..32e2314 100644
--- a/src/main/java/fr/sae/terraria/vue/TileMapsView.java
+++ b/src/main/java/fr/sae/terraria/vue/TileMapsView.java
@@ -19,11 +19,21 @@
 import java.util.Objects;
 
 
+/**
+ * <h1>Tile maps View</h1>
+ * <h2>Une classes qui se gère de l'affichage de la carte et de ces élèments aditionnel </h2>
+ * <h3><u>Description:</u></h3>
+ * <p>Cette classe permet d'afficher, de supprimer les élèments visible à l'écran</p>
+ *
+ * @author CHRZASZCZ Naulan
+ */
 public class TileMapsView
 {
     private final List<ImageView> rabbitsView;
     private final List<ImageView> blocksView;
     private final List<ImageView> slimesView;
+    // Cette liste marche differement à cause de la classes Group, cette liste conserve un groupe d'images
+    // La classes Group contient plus ou moins d'images selon du fait de comment il génère l'arbre.
     private final List<Group> treesView;
 
     private final Image torchImg;
@@ -68,6 +78,7 @@ public TileMapsView(Environment environment,
         this.slimesView = new ArrayList<>();
         this.treesView = new ArrayList<>();
 
+        // Génération des images
         this.floorTopImg = View.loadAnImage("tiles/floor-top.png", tileWidth, tileHeight);
         this.floorLeftImg = View.loadAnImage("tiles/floor-left.png", tileWidth, tileHeight);
         this.floorRightImg = View.loadAnImage("tiles/floor-right.png", tileWidth, tileHeight);
@@ -83,9 +94,17 @@ public TileMapsView(Environment environment,
         this.environment.getRabbits().addListener((ListChangeListener<? super Rabbit>) this::updatesRabbitView);
         // Ajoute et supprime les elements de l'écran qui concerne les slimes
         this.environment.getSlimes().addListener((ListChangeListener<? super Slime>) this::updatesSlimeView);
+        // Ajoute et supprime un groupe d'élèments de l'écran qui concerne les arbres
         this.environment.getTrees().addListener((ListChangeListener<? super Tree>) this::updatesTreeView);
     }
 
+    /**
+     * Supprime ou affiche les blocs qui sont ajouté dans la liste d'entité <code>List<Block> blocks;</code>
+     *  Une fois affiché, la fonction range l'imageView crée dans la liste <code>List<ImageView> blocksView;</code> de cette classes
+     *
+     *  @param c Cet argument est present car on passe cette fonction en tant que reference (this::updatesBlocksView),
+     *          l'argument est là pour obtenir les informations concernant les modifications dans liste <code>List<Block> blocks;</code>
+     */
     private void updatesBlocksView(ListChangeListener.Change<? extends Block> c)
     {
         while (c.next()) {
@@ -130,6 +149,13 @@ else if (((Dirt) block).getTypeOfFloor() == 0)
         }
     }
 
+    /**
+     * Supprime ou affiche les lapins qui sont ajouté dans la liste d'entité <code>List<Rabbit> rabbits;</code>
+     *  Une fois affiché, la fonction range l'imageView crée dans la liste <code>List<ImageView> rabbitsView;</code> de cette classe
+     *
+     *  @param c Cet argument est present car on passe cette fonction en tant que reference (this::updatesRabbitsView),
+     *          l'argument est là pour obtenir les informations concernant les modifications dans liste <code>List<Block> rabbits;</code>
+     */
     private void updatesRabbitView(ListChangeListener.Change<? extends Rabbit> c)
     {
         while (c.next()) {
@@ -146,6 +172,13 @@ private void updatesRabbitView(ListChangeListener.Change<? extends Rabbit> c)
         }
     }
 
+    /**
+     * Supprime ou affiche les slimes qui sont ajoutés dans la liste d'entité <code>List<Slime> slimes;</code>
+     *  Une fois affiché, la fonction range l'imageView crée dans la liste <code>List<ImageView> slimesView;</code> de cette classe
+     *
+     *  @param c Cet argument est present car on passe cette fonction en tant que reference (this::updatesSlimesView),
+     *          l'argument est là pour obtenir les informations concernant les modifications dans liste <code>List<Slime> slimes;</code>
+     */
     private void updatesSlimeView(ListChangeListener.Change<? extends Slime> c)
     {
         while (c.next()) {
@@ -162,13 +195,23 @@ private void updatesSlimeView(ListChangeListener.Change<? extends Slime> c)
         }
     }
 
+    /**
+     * Supprime ou affiche les groupes d'image de l'arbre qui sont ajouté dans la liste d'entité <code>List<Tree> trees;</code>
+     * Génère une image plus ou moins grande selon le <code>Math.random</code> obtenue.
+     *  Une fois affiché, la fonction range l'imageView crée dans la liste <code>List<ImageView> treesView;</code> de cette classe
+     *
+     *  @param c Cet argument est present car on passe cette fonction en tant que reference (this::updatesRabbitsView),
+     *          l'argument est là pour obtenir les informations concernant les modifications dans liste <code>List<Block> rabbits;</code>
+     */
     private void updatesTreeView(ListChangeListener.Change<? extends Tree> c)
     {
         while (c.next()) {
             if (c.wasAdded()) {
                 Group group = new Group();
 
+                // La hauteur des feuillages
                 int nbFoliage = ((int) (Math.random()*2))+1;
+                // La hauteur du tronc
                 int nbTrunk = ((int) (Math.random()*3))+1;
 
                 Rectangle2D viewportFirstFrame = new Rectangle2D(0, 0, this.tileWidth, this.tileHeight);
diff --git a/src/main/java/fr/sae/terraria/vue/entities/EntityView.java b/src/main/java/fr/sae/terraria/vue/entities/EntityView.java
index 056e809..3a1f6c0 100644
--- a/src/main/java/fr/sae/terraria/vue/entities/EntityView.java
+++ b/src/main/java/fr/sae/terraria/vue/entities/EntityView.java
@@ -5,6 +5,20 @@
 import javafx.scene.layout.Pane;
 
 
+/**
+ * <h1>Entity View</h1>
+ * <h2>Une classe qui permet d'affiché des entités</h2>
+ * <h3><u>Description:</u></h3>
+ * <p>Cette classe permet simplement grâce à la fonction <code>animation()</code> de codé une animations pour une entité en particulier</p>
+ * <p>Cette classe gère les choses suivantes:</p>
+ * <ul>
+ *     <li>Crée une ImageView, pas besoin dans recrée une autre dans les classes qui hériterais cette classes.</li>
+ *     <li>Bindings des positions de l'entité à l'ImageView.</li>
+ *     <li>Change dynamiquement la limite de frame selon l'image utilisé.</li>
+ * </ul>
+ *
+ * @author CHRZASZCZ Naulan
+ */
 public abstract class EntityView
 {
     protected final ImageView imgView;
@@ -20,8 +34,10 @@ protected EntityView(final Entity entity)
         this.imgView.translateYProperty().bind(entity.getYProperty());
     }
 
+    /** l'endroit où il va avoir les animations qui vont êtres programmer. */
     protected abstract void animation(int frame);
 
+    /** La fonction qui permet de démarrer les animations des entités */
     private void startAnimation()
     {
         int widthEntity = this.entity.getRect().getWidth();
@@ -38,6 +54,7 @@ private void startAnimation()
         this.entity.getAnimation().getFrameProperty().addListener((obs, oldFrame, newFrame) -> this.animation(newFrame.intValue()));
     }
 
+    /** Affiche l'entité à l'écran et démarre l'animation */
     public void display(final Pane display)
     {
         display.getChildren().add(this.imgView);

From 4064152c8df1a3598a13af96682111240b5c5c41 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Sat, 11 Jun 2022 09:03:13 +0200
Subject: [PATCH 19/97] =?UTF-8?q?D=C3=A9placement=20code=20dans=20Player.j?=
 =?UTF-8?q?ava?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../terraria/controller/GameController.java   | 63 +++++--------------
 .../modele/entities/player/Player.java        | 34 ++++++++++
 .../sae/terraria/vue/entities/SlimeView.java  |  2 -
 3 files changed, 51 insertions(+), 48 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/controller/GameController.java b/src/main/java/fr/sae/terraria/controller/GameController.java
index 8969053..2df23ec 100644
--- a/src/main/java/fr/sae/terraria/controller/GameController.java
+++ b/src/main/java/fr/sae/terraria/controller/GameController.java
@@ -3,7 +3,7 @@
 import fr.sae.terraria.Terraria;
 import fr.sae.terraria.modele.Environment;
 import fr.sae.terraria.modele.TileMaps;
-import fr.sae.terraria.modele.entities.entity.*;
+import fr.sae.terraria.modele.entities.entity.EatableObjectType;
 import fr.sae.terraria.modele.entities.player.Player;
 import fr.sae.terraria.modele.entities.player.inventory.Inventory;
 import fr.sae.terraria.vue.Camera;
@@ -20,7 +20,6 @@
 import javafx.stage.Stage;
 
 import java.net.URL;
-import java.util.Objects;
 import java.util.ResourceBundle;
 
 
@@ -98,27 +97,14 @@ private void addKeysEventListener(final Stage stage)
 
         stage.addEventFilter(MouseEvent.MOUSE_CLICKED, mouse -> {
             this.player.getMouseInput().put(mouse.getButton(), true);
-            mouse.consume();
-        });
-
-        stage.addEventFilter(MouseEvent.MOUSE_RELEASED, mouse -> {
-            this.player.getMouseInput().put(mouse.getButton(), false);
-            mouse.consume();
-        });
 
-        stage.addEventFilter(ScrollEvent.SCROLL, scroll -> {
-            inventory.setScroll((int) scroll.getDeltaY());
-            scroll.consume();
-        });
-
-        stage.addEventFilter(MouseEvent.MOUSE_CLICKED, click -> {
             final double scaleMultiplicativeWidth = (this.root.getPrefWidth() / Terraria.DISPLAY_RENDERING_WIDTH);
             final double scaleMultiplicativeHeight = ((this.root.getPrefHeight()-this.title.getPrefHeight()) / Terraria.DISPLAY_RENDERING_HEIGHT);
             final int tileWidth = (int) (TileMaps.TILE_DEFAULT_SIZE * scaleMultiplicativeWidth);
             final int tileHeight = (int) (TileMaps.TILE_DEFAULT_SIZE * scaleMultiplicativeHeight);
             // La position correcte sur le Pane
-            double mouseX = click.getSceneX()+((Rectangle) this.displayTiledMap.getParent().getClip()).getX();
-            double mouseY = (click.getSceneY()-this.title.getPrefHeight())+((Rectangle) this.displayTiledMap.getParent().getClip()).getY();
+            double mouseX = mouse.getSceneX()+((Rectangle) this.displayTiledMap.getParent().getClip()).getX();
+            double mouseY = (mouse.getSceneY()-this.title.getPrefHeight())+((Rectangle) this.displayTiledMap.getParent().getClip()).getY();
             // Le bloc où la souris à clicker
             int xBlock = (int) (mouseX/tileWidth);
             int yBlock = (int) (mouseY/tileHeight);
@@ -134,38 +120,23 @@ private void addKeysEventListener(final Stage stage)
             if (this.player.getStackSelected() != null && this.player.getStackSelected().getItem() instanceof EatableObjectType ) {
                 ((EatableObjectType) this.player.getStackSelected().getItem()).eat();
             } else if (isOneBlockDistance) {
-                if (click.getButton().equals(MouseButton.PRIMARY))
-                    this.breakBlock(rectangle);
-                if (click.getButton().equals(MouseButton.SECONDARY))
-                    this.placeBlock(xBlock, yBlock);
+                if (mouse.getButton().equals(MouseButton.PRIMARY))
+                    this.player.interactWithBlock(rectangle);
+                if (mouse.getButton().equals(MouseButton.SECONDARY))
+                    this.player.placeBlock(xBlock, yBlock);
             }
-        });
-    }
 
-    private void breakBlock(final Rectangle2D rectangle)
-    {
-        // Commence a cherché l'entité ciblée
-        for (Entity entity : this.environment.getEntities()) if (entity.getRect().collideRect(rectangle)) {
-            if (entity instanceof BreakableObjectType)
-                ((BreakableObjectType) entity).breaks();
-            if (entity instanceof CollapsibleObjectType)    // TODO TEMP, à déplacer
-                ((CollapsibleObjectType) entity).hit();
-            // Quand tous c'est bien déroulés, aprés avoir trouvé l'entité et l'objet sur l'écran, il arrête de chercher d'autre entité d'où le break
-            break;
-        }
-    }
-
-    private void placeBlock(int xBlock, int yBlock)
-    {
-        boolean haveAnItemOnHand = !Objects.isNull(this.player.getStackSelected());
-        boolean goodPlace = this.environment.getTileMaps().getTile(xBlock, yBlock) == TileMaps.SKY;
+            mouse.consume();
+        });
 
-        if (haveAnItemOnHand && goodPlace) {
-            if (!(this.player.getStackSelected().getItem() instanceof PlaceableObjectType) && !(this.player.getStackSelected() instanceof EatableObjectType))
-                return;
+        stage.addEventFilter(MouseEvent.MOUSE_RELEASED, mouse -> {
+            this.player.getMouseInput().put(mouse.getButton(), false);
+            mouse.consume();
+        });
 
-            if (this.player.getStackSelected().getItem() instanceof PlaceableObjectType)
-                ((PlaceableObjectType) this.player.getStackSelected().getItem()).place(xBlock, yBlock);
-        }
+        stage.addEventFilter(ScrollEvent.SCROLL, scroll -> {
+            inventory.setScroll((int) scroll.getDeltaY());
+            scroll.consume();
+        });
     }
 }
\ No newline at end of file
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
index 116fb6e..10c166e 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
@@ -1,6 +1,7 @@
 package fr.sae.terraria.modele.entities.player;
 
 import fr.sae.terraria.modele.Environment;
+import fr.sae.terraria.modele.TileMaps;
 import fr.sae.terraria.modele.entities.entity.*;
 import fr.sae.terraria.modele.entities.player.inventory.Inventory;
 import fr.sae.terraria.modele.entities.player.inventory.Stack;
@@ -8,6 +9,7 @@
 import javafx.beans.property.ObjectProperty;
 import javafx.beans.property.SimpleBooleanProperty;
 import javafx.beans.property.SimpleObjectProperty;
+import javafx.geometry.Rectangle2D;
 import javafx.scene.image.Image;
 import javafx.scene.input.KeyCode;
 import javafx.scene.input.MouseButton;
@@ -105,6 +107,38 @@ public void worldLimit()
             this.idleOnX();
     }
 
+    public void interactWithBlock(final Rectangle2D rectangle)
+    {
+        int i = 0;
+
+        Entity entity = this.environment.getEntities().get(i);
+        while (i < this.environment.getEntities().size() && !entity.getRect().collideRect(rectangle)) {
+            entity = this.environment.getEntities().get(i);
+            i++;
+        }
+
+        if (i < this.environment.getEntities().size()) {
+            if (entity instanceof BreakableObjectType)
+                ((BreakableObjectType) entity).breaks();
+            if (entity instanceof CollapsibleObjectType)
+                ((CollapsibleObjectType) entity).hit();
+        }
+    }
+
+    public void placeBlock(int xBlock, int yBlock)
+    {
+        boolean haveAnItemOnHand = !Objects.isNull(this.getStackSelected());
+        boolean goodPlace = this.environment.getTileMaps().getTile(xBlock, yBlock) == TileMaps.SKY;
+
+        if (haveAnItemOnHand && goodPlace) {
+            if (!(this.getStackSelected().getItem() instanceof PlaceableObjectType) && !(this.getStackSelected() instanceof EatableObjectType))
+                return;
+
+            if (this.getStackSelected().getItem() instanceof PlaceableObjectType)
+                ((PlaceableObjectType) this.getStackSelected().getItem()).place(xBlock, yBlock);
+        }
+    }
+
     /** Lie les inputs au clavier à une ou des actions. */
     public void eventInput()
     {
diff --git a/src/main/java/fr/sae/terraria/vue/entities/SlimeView.java b/src/main/java/fr/sae/terraria/vue/entities/SlimeView.java
index 05d9104..d55105d 100644
--- a/src/main/java/fr/sae/terraria/vue/entities/SlimeView.java
+++ b/src/main/java/fr/sae/terraria/vue/entities/SlimeView.java
@@ -5,8 +5,6 @@
 import fr.sae.terraria.vue.View;
 import javafx.geometry.Rectangle2D;
 import javafx.scene.image.Image;
-import javafx.scene.image.ImageView;
-import javafx.scene.layout.Pane;
 
 
 public class SlimeView extends EntityView

From 8b49054ddd3d3ead5193e7a168af8b6fcb439869 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Sat, 11 Jun 2022 09:16:09 +0200
Subject: [PATCH 20/97] =?UTF-8?q?D=C3=A9placement=20code,=20clean?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/main/java/fr/sae/terraria/modele/Environment.java     | 2 +-
 src/main/java/fr/sae/terraria/modele/GenerateEntity.java  | 3 +--
 .../java/fr/sae/terraria/modele/entities/blocks/Tree.java | 2 +-
 .../fr/sae/terraria/modele/entities/entity/Entity.java    | 8 +++++---
 .../java/fr/sae/terraria/modele/entities/items/Vodka.java | 1 +
 .../fr/sae/terraria/modele/entities/player/Player.java    | 1 -
 src/main/java/fr/sae/terraria/vue/Camera.java             | 6 +++---
 src/main/java/fr/sae/terraria/vue/DrunkView.java          | 4 +++-
 src/main/java/fr/sae/terraria/vue/TileMapsView.java       | 4 ++--
 src/main/java/fr/sae/terraria/vue/View.java               | 4 ++--
 .../java/fr/sae/terraria/vue/entities/EntityView.java     | 4 ++--
 src/main/java/fr/sae/terraria/vue/hud/HealthBarView.java  | 2 +-
 12 files changed, 22 insertions(+), 19 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/modele/Environment.java b/src/main/java/fr/sae/terraria/modele/Environment.java
index 967ca08..dc7cafa 100644
--- a/src/main/java/fr/sae/terraria/modele/Environment.java
+++ b/src/main/java/fr/sae/terraria/modele/Environment.java
@@ -142,7 +142,7 @@ private void gameLoop()
             boolean nightTime = this.clock.getMinutes() > (Clock.MINUTES_IN_A_DAY)/2;
             boolean weHaveChangedDay = this.previousDays != this.clock.getDays();
             if (weHaveChangedDay)
-                for (int i = 0; i < 10; i++) // Génère par jour, 3 arbres
+                for (int i = 0; i < Tree.TREE_CLUSTER; i++) // Génère par jour, 3 arbres
                     GenerateEntity.tree(this);
             if (dayTime) {  // Génère certaines entités uniquement pendant le jour
                 GenerateEntity.rabbit(this);
diff --git a/src/main/java/fr/sae/terraria/modele/GenerateEntity.java b/src/main/java/fr/sae/terraria/modele/GenerateEntity.java
index ef239ab..0ae4a12 100644
--- a/src/main/java/fr/sae/terraria/modele/GenerateEntity.java
+++ b/src/main/java/fr/sae/terraria/modele/GenerateEntity.java
@@ -18,7 +18,6 @@
 import static fr.sae.terraria.modele.entities.blocks.TallGrass.TALL_GRASS_SPAWN_RATE;
 import static fr.sae.terraria.modele.entities.blocks.TallGrass.WHEN_SPAWN_A_TALL_GRASS;
 import static fr.sae.terraria.modele.entities.blocks.Tree.TREE_SPAWN_RATE;
-import static fr.sae.terraria.modele.entities.blocks.Tree.WHEN_SPAWN_A_TREE;
 
 
 /**
@@ -91,7 +90,7 @@ private static List<Integer> findFloors(TileMaps maps, int y)
     }
 
     /** À un certain moment, grace au tick, il va générer des arbres +/- grand uniquement sur un sol */
-    public static void tree(Environment environment) { generateAnEntity(environment, new Tree(environment), WHEN_SPAWN_A_TREE, TREE_SPAWN_RATE); }
+    public static void tree(Environment environment) { generateAnEntity(environment, new Tree(environment), 1, TREE_SPAWN_RATE); }
     /** À un certain moment, grace au tick, il va générer des hautes herbes sur un sol */
     public static void tallGrass(Environment environment) { generateAnEntity(environment, new TallGrass(environment), WHEN_SPAWN_A_TALL_GRASS, TALL_GRASS_SPAWN_RATE); }
 
diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/Tree.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/Tree.java
index a2736ae..f2180f8 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/Tree.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/Tree.java
@@ -7,8 +7,8 @@
 
 public class Tree extends Block implements SpawnableObjectType
 {
-    public static final int WHEN_SPAWN_A_TREE = 5_000;
     public static final double TREE_SPAWN_RATE = .2;
+    public static final double TREE_CLUSTER = 10;
 
     private final Environment environment;
 
diff --git a/src/main/java/fr/sae/terraria/modele/entities/entity/Entity.java b/src/main/java/fr/sae/terraria/modele/entities/entity/Entity.java
index 1f94889..7de70c4 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/entity/Entity.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/entity/Entity.java
@@ -61,9 +61,11 @@ protected Entity(int x, int y)
      */
     public abstract void updates();
 
-    public DoubleProperty getPvProperty() { return this.pv; }
-    public DoubleProperty getXProperty() { return this.x; }
-    public DoubleProperty getYProperty(){ return this.y; }
+    public DoubleProperty pvProperty() { return this.pv; }
+    public DoubleProperty xProperty() { return this.x; }
+    public DoubleProperty yProperty(){ return this.y; }
+
+
     public Animation getAnimation() { return this.animation; }
     public Rect getRect() { return this.rect; }
     public double getPvMax() { return this.pv.get(); }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/items/Vodka.java b/src/main/java/fr/sae/terraria/modele/entities/items/Vodka.java
index 0a3f93f..e0b3de4 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/items/Vodka.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/items/Vodka.java
@@ -13,6 +13,7 @@
  */
 public class Vodka extends Item implements EatableObjectType
 {
+    public static final int DRUNK_EFFECT_TIME = 600;
     public static final double DROP_RATE = .1;
 
     private final Environment environment;
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
index 10c166e..b1487ce 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
@@ -22,7 +22,6 @@
 public class Player extends EntityMovable implements CollideObjectType, CollapsibleObjectType, SpawnableObjectType
 {
     public static final int BREAK_BLOCK_DISTANCE = 1;
-    public static final int DRUNK_EFFECT_TIME = 600;
 
     private final EnumMap<KeyCode, Boolean> keysInput;
     private final EnumMap<MouseButton, Boolean> mouseInput;
diff --git a/src/main/java/fr/sae/terraria/vue/Camera.java b/src/main/java/fr/sae/terraria/vue/Camera.java
index fb59137..8f832ea 100644
--- a/src/main/java/fr/sae/terraria/vue/Camera.java
+++ b/src/main/java/fr/sae/terraria/vue/Camera.java
@@ -38,7 +38,7 @@ public Camera(final Environment environment, final StackPane paneHadCamera)
         this.clip.xProperty().bind(
                 Bindings.createDoubleBinding(
                         () -> clampRange(player.getX() - this.clip.getWidth()/2, minScrollWidthCamera, maxScrollWidthCamera),
-                        player.getXProperty(), paneHadCamera.widthProperty()
+                        player.xProperty(), paneHadCamera.widthProperty()
                 )
         );
 
@@ -46,7 +46,7 @@ public Camera(final Environment environment, final StackPane paneHadCamera)
         double midHeightCamera = (this.clip.getHeight()/2);
         double[] centerPlayerOnYIntoCamera = new double[1];
         double[] gap = new double[1];
-        player.getYProperty().addListener((obs, oldX, newX) -> {
+        player.yProperty().addListener((obs, oldX, newX) -> {
             // Suit le joueur
             centerPlayerOnYIntoCamera[0] = player.getY() - midHeightCamera;
             if (player.isJumping()) {
@@ -67,7 +67,7 @@ public Camera(final Environment environment, final StackPane paneHadCamera)
         this.clip.yProperty().bind(
                 Bindings.createDoubleBinding(
                         () -> clampRange(centerPlayerOnYIntoCamera[0], minScrollHeightCamera, maxScrollHeightCamera),
-                        player.getYProperty(), paneHadCamera.heightProperty()
+                        player.yProperty(), paneHadCamera.heightProperty()
                 )
         );
 
diff --git a/src/main/java/fr/sae/terraria/vue/DrunkView.java b/src/main/java/fr/sae/terraria/vue/DrunkView.java
index 6835dec..fcb9c76 100644
--- a/src/main/java/fr/sae/terraria/vue/DrunkView.java
+++ b/src/main/java/fr/sae/terraria/vue/DrunkView.java
@@ -1,6 +1,7 @@
 package fr.sae.terraria.vue;
 
 import fr.sae.terraria.modele.Environment;
+import fr.sae.terraria.modele.entities.items.Vodka;
 import fr.sae.terraria.modele.entities.player.Player;
 import javafx.animation.Animation;
 import javafx.animation.KeyFrame;
@@ -16,6 +17,7 @@ public class DrunkView {
 
     private static final int WIDTH_COS = 50;
     private static final int HEIGHT_COS = 100;
+
     private FloatMap floatMap;
     private ObjectProperty<DisplacementMap> displacementMap;
     private int startTick;
@@ -64,7 +66,7 @@ private void updateEffect() {
         }
         timer += 0.03;
 
-        if (startTick+ Player.DRUNK_EFFECT_TIME <= environment.getTicks()){
+        if (startTick+ Vodka.DRUNK_EFFECT_TIME <= environment.getTicks()){
             environment.getPlayer().drunkProperty().set(false);
         }
 
diff --git a/src/main/java/fr/sae/terraria/vue/TileMapsView.java b/src/main/java/fr/sae/terraria/vue/TileMapsView.java
index 32e2314..b83e9aa 100644
--- a/src/main/java/fr/sae/terraria/vue/TileMapsView.java
+++ b/src/main/java/fr/sae/terraria/vue/TileMapsView.java
@@ -134,8 +134,8 @@ else if (((Dirt) block).getTypeOfFloor() == 0)
                 }
 
                 if (!Objects.isNull(blockView.getImage())) {
-                    blockView.translateXProperty().bind(block.getXProperty());
-                    blockView.translateYProperty().bind(block.getYProperty());
+                    blockView.translateXProperty().bind(block.xProperty());
+                    blockView.translateYProperty().bind(block.yProperty());
 
                     this.display.getChildren().add(blockView);
                     this.blocksView.add(blockView);
diff --git a/src/main/java/fr/sae/terraria/vue/View.java b/src/main/java/fr/sae/terraria/vue/View.java
index 530df87..1d6780c 100644
--- a/src/main/java/fr/sae/terraria/vue/View.java
+++ b/src/main/java/fr/sae/terraria/vue/View.java
@@ -88,8 +88,8 @@ public static Image loadAnImage(final String path, double scaleMultiplicatorWidt
     public static ImageView createImageView(final Entity entity, final Image img)
     {
         ImageView imageView = new ImageView(img);
-        imageView.translateXProperty().bind(entity.getXProperty());
-        imageView.translateYProperty().bind(entity.getYProperty());
+        imageView.translateXProperty().bind(entity.xProperty());
+        imageView.translateYProperty().bind(entity.yProperty());
 
         return imageView;
     }
diff --git a/src/main/java/fr/sae/terraria/vue/entities/EntityView.java b/src/main/java/fr/sae/terraria/vue/entities/EntityView.java
index 3a1f6c0..61578f5 100644
--- a/src/main/java/fr/sae/terraria/vue/entities/EntityView.java
+++ b/src/main/java/fr/sae/terraria/vue/entities/EntityView.java
@@ -30,8 +30,8 @@ protected EntityView(final Entity entity)
         this.entity = entity;
 
         this.imgView = new ImageView();
-        this.imgView.translateXProperty().bind(entity.getXProperty());
-        this.imgView.translateYProperty().bind(entity.getYProperty());
+        this.imgView.translateXProperty().bind(entity.xProperty());
+        this.imgView.translateYProperty().bind(entity.yProperty());
     }
 
     /** l'endroit où il va avoir les animations qui vont êtres programmer. */
diff --git a/src/main/java/fr/sae/terraria/vue/hud/HealthBarView.java b/src/main/java/fr/sae/terraria/vue/hud/HealthBarView.java
index e50f58d..4d41b99 100644
--- a/src/main/java/fr/sae/terraria/vue/hud/HealthBarView.java
+++ b/src/main/java/fr/sae/terraria/vue/hud/HealthBarView.java
@@ -44,7 +44,7 @@ private void displayHealthBar(double inventoryBarX, double inventoryBarY)
         }
 
         // Modifie le cœur selon la vie du joueur
-        player.getPvProperty().addListener((obs, oldPv, newPv) -> {
+        player.pvProperty().addListener((obs, oldPv, newPv) -> {
             if (oldPv.intValue() >= 0) {
                 ImageView healthView = healths[oldPv.intValue()-1];
 

From e839ec7268ffc206201bedd9e63618f1b9be998f Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Sat, 11 Jun 2022 09:21:17 +0200
Subject: [PATCH 21/97] =?UTF-8?q?Arrangement=20nom=20interface=20et=20fonc?=
 =?UTF-8?q?tion=20li=C3=A9e?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../fr/sae/terraria/controller/GameController.java    |  6 +++---
 ...tableObjectType.java => ConsumableObjectType.java} | 11 +++++------
 .../sae/terraria/modele/entities/entity/Entity.java   |  2 +-
 .../fr/sae/terraria/modele/entities/items/Meat.java   |  6 +++---
 .../fr/sae/terraria/modele/entities/items/Vodka.java  |  6 +++---
 .../sae/terraria/modele/entities/player/Player.java   |  2 +-
 6 files changed, 16 insertions(+), 17 deletions(-)
 rename src/main/java/fr/sae/terraria/modele/entities/entity/{EatableObjectType.java => ConsumableObjectType.java} (65%)

diff --git a/src/main/java/fr/sae/terraria/controller/GameController.java b/src/main/java/fr/sae/terraria/controller/GameController.java
index 2df23ec..9904f48 100644
--- a/src/main/java/fr/sae/terraria/controller/GameController.java
+++ b/src/main/java/fr/sae/terraria/controller/GameController.java
@@ -3,7 +3,7 @@
 import fr.sae.terraria.Terraria;
 import fr.sae.terraria.modele.Environment;
 import fr.sae.terraria.modele.TileMaps;
-import fr.sae.terraria.modele.entities.entity.EatableObjectType;
+import fr.sae.terraria.modele.entities.entity.ConsumableObjectType;
 import fr.sae.terraria.modele.entities.player.Player;
 import fr.sae.terraria.modele.entities.player.inventory.Inventory;
 import fr.sae.terraria.vue.Camera;
@@ -117,8 +117,8 @@ private void addKeysEventListener(final Stage stage)
             int distanceBetweenBlockPlayerAxisY = Math.abs(yPlayer - yBlock);
 
             boolean isOneBlockDistance = distanceBetweenBlockPlayerAxisY >= 0 && distanceBetweenBlockPlayerAxisY <= Player.BREAK_BLOCK_DISTANCE && distanceBetweenBlockPlayerAxisX >= 0 && distanceBetweenBlockPlayerAxisX <= Player.BREAK_BLOCK_DISTANCE;
-            if (this.player.getStackSelected() != null && this.player.getStackSelected().getItem() instanceof EatableObjectType ) {
-                ((EatableObjectType) this.player.getStackSelected().getItem()).eat();
+            if (this.player.getStackSelected() != null && this.player.getStackSelected().getItem() instanceof ConsumableObjectType) {
+                ((ConsumableObjectType) this.player.getStackSelected().getItem()).consumes();
             } else if (isOneBlockDistance) {
                 if (mouse.getButton().equals(MouseButton.PRIMARY))
                     this.player.interactWithBlock(rectangle);
diff --git a/src/main/java/fr/sae/terraria/modele/entities/entity/EatableObjectType.java b/src/main/java/fr/sae/terraria/modele/entities/entity/ConsumableObjectType.java
similarity index 65%
rename from src/main/java/fr/sae/terraria/modele/entities/entity/EatableObjectType.java
rename to src/main/java/fr/sae/terraria/modele/entities/entity/ConsumableObjectType.java
index 5293bd8..88c107b 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/entity/EatableObjectType.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/entity/ConsumableObjectType.java
@@ -2,23 +2,22 @@
 
 
 /**
- * <h1>Eatable Object Type</h1>
+ * <h1>Consumable Object Type</h1>
  * <h2>Interface utile sur les objets de type rangeable dans l'inventaire</h2>
  * <h3><u>Description:</u></h3>
- * <p>Permet de discerner les objets qui sont mangeable par une entité ou ceux qui ne le sont pas</p>
+ * <p>Permet de discerner les objets qui sont consommable par une entité ou ceux qui ne le sont pas</p>
  *
  * @see fr.sae.terraria.modele.entities.items.Item
+ *
  * @author CHRZASZCZ Naulan
  */
-public interface EatableObjectType
+public interface ConsumableObjectType
 {
 
 
     /**
      * Permet d'appliquer des actions lorsque qu'il mange l'aliment qui est dans la main de l'entité.
      *  Permet de faire des actions personnalisées lorsque l'action manger est activé.
-     *
-     * @see fr.sae.terraria.modele.entities.items.Meat
      */
-    void eat();
+    void consumes();
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/entity/Entity.java b/src/main/java/fr/sae/terraria/modele/entities/entity/Entity.java
index 7de70c4..1f3ea79 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/entity/Entity.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/entity/Entity.java
@@ -15,7 +15,7 @@
  * @see BreakableObjectType
  * @see CollapsibleObjectType
  * @see PlaceableObjectType
- * @see EatableObjectType
+ * @see ConsumableObjectType
  *
  *
  * @author CHRZASZCZ Naulan
diff --git a/src/main/java/fr/sae/terraria/modele/entities/items/Meat.java b/src/main/java/fr/sae/terraria/modele/entities/items/Meat.java
index 63b1137..ac87769 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/items/Meat.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/items/Meat.java
@@ -1,12 +1,12 @@
 package fr.sae.terraria.modele.entities.items;
 
 import fr.sae.terraria.modele.Environment;
-import fr.sae.terraria.modele.entities.entity.EatableObjectType;
+import fr.sae.terraria.modele.entities.entity.ConsumableObjectType;
 import fr.sae.terraria.modele.entities.player.Player;
 import fr.sae.terraria.modele.entities.player.inventory.Inventory;
 
 
-public class Meat extends Item implements EatableObjectType
+public class Meat extends Item implements ConsumableObjectType
 {
     private final Environment environment;
 
@@ -17,7 +17,7 @@ public Meat(final Environment environment)
         this.environment = environment;
     }
 
-    @Override public void eat()
+    @Override public void consumes()
     {
         Player player = environment.getPlayer();
 
diff --git a/src/main/java/fr/sae/terraria/modele/entities/items/Vodka.java b/src/main/java/fr/sae/terraria/modele/entities/items/Vodka.java
index e0b3de4..10ec453 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/items/Vodka.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/items/Vodka.java
@@ -1,7 +1,7 @@
 package fr.sae.terraria.modele.entities.items;
 
 import fr.sae.terraria.modele.Environment;
-import fr.sae.terraria.modele.entities.entity.EatableObjectType;
+import fr.sae.terraria.modele.entities.entity.ConsumableObjectType;
 import fr.sae.terraria.modele.entities.player.Player;
 import fr.sae.terraria.modele.entities.player.inventory.Inventory;
 
@@ -11,7 +11,7 @@
  * <h2><u>Description:</u></h2>
  * <p>Ce drop lorsque le joueur casse des hautes herbes et une fois bu, l'écran sera troublé</p>
  */
-public class Vodka extends Item implements EatableObjectType
+public class Vodka extends Item implements ConsumableObjectType
 {
     public static final int DRUNK_EFFECT_TIME = 600;
     public static final double DROP_RATE = .1;
@@ -25,7 +25,7 @@ public Vodka(final Environment environment)
         this.environment = environment;
     }
 
-    @Override public void eat()
+    @Override public void consumes()
     {
         Player player = environment.getPlayer();
         Inventory inventory = player.getInventory();
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
index b1487ce..5491a0e 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
@@ -130,7 +130,7 @@ public void placeBlock(int xBlock, int yBlock)
         boolean goodPlace = this.environment.getTileMaps().getTile(xBlock, yBlock) == TileMaps.SKY;
 
         if (haveAnItemOnHand && goodPlace) {
-            if (!(this.getStackSelected().getItem() instanceof PlaceableObjectType) && !(this.getStackSelected() instanceof EatableObjectType))
+            if (!(this.getStackSelected().getItem() instanceof PlaceableObjectType) && !(this.getStackSelected() instanceof ConsumableObjectType))
                 return;
 
             if (this.getStackSelected().getItem() instanceof PlaceableObjectType)

From 6eef7f628ae2f35ad760d7a2af5a0a0e1c8eaf8b Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Sat, 11 Jun 2022 13:55:43 +0200
Subject: [PATCH 22/97] =?UTF-8?q?Impl=C3=A9mentation=20d'une=20=C3=A9p?=
 =?UTF-8?q?=C3=A9e?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../terraria/controller/GameController.java   |  4 ++++
 .../fr/sae/terraria/modele/Environment.java   | 11 ++++++----
 .../sae/terraria/modele/GenerateEntity.java   | 10 ++++++----
 .../sae/terraria/modele/entities/Slime.java   | 20 ++++++++++++++++++-
 .../modele/entities/entity/EntityMovable.java |  1 -
 .../entities/player/inventory/Stack.java      |  4 +++-
 .../terraria/modele/entities/tools/Axe.java   | 10 ++--------
 .../modele/entities/tools/Pickaxe.java        |  6 +-----
 .../terraria/modele/entities/tools/Sword.java | 10 +++++-----
 .../terraria/modele/entities/tools/Tool.java  | 13 ++++++++++++
 .../java/fr/sae/terraria/vue/DrunkView.java   |  1 -
 .../terraria/vue/hud/ItemSelectedView.java    |  4 +++-
 12 files changed, 63 insertions(+), 31 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/controller/GameController.java b/src/main/java/fr/sae/terraria/controller/GameController.java
index 9904f48..2ff2b63 100644
--- a/src/main/java/fr/sae/terraria/controller/GameController.java
+++ b/src/main/java/fr/sae/terraria/controller/GameController.java
@@ -2,6 +2,7 @@
 
 import fr.sae.terraria.Terraria;
 import fr.sae.terraria.modele.Environment;
+import fr.sae.terraria.modele.GenerateEntity;
 import fr.sae.terraria.modele.TileMaps;
 import fr.sae.terraria.modele.entities.entity.ConsumableObjectType;
 import fr.sae.terraria.modele.entities.player.Player;
@@ -85,6 +86,9 @@ private void addKeysEventListener(final Stage stage)
                 this.environment.getGameClock().setMinutes(1_000);
             if (key.isShiftDown() && key.isControlDown() && key.getCode().equals(KeyCode.J))
                 this.environment.getGameClock().setMinutes(400);
+            // Fait apparaitre un slime
+            if (key.isShiftDown() && key.isControlDown() && key.getCode().equals(KeyCode.P))
+                GenerateEntity.slime(this.environment);
 
             key.consume();
         });
diff --git a/src/main/java/fr/sae/terraria/modele/Environment.java b/src/main/java/fr/sae/terraria/modele/Environment.java
index dc7cafa..9706e59 100644
--- a/src/main/java/fr/sae/terraria/modele/Environment.java
+++ b/src/main/java/fr/sae/terraria/modele/Environment.java
@@ -13,6 +13,8 @@
 import fr.sae.terraria.modele.entities.items.Vodka;
 import fr.sae.terraria.modele.entities.player.Player;
 import fr.sae.terraria.modele.entities.tools.Pickaxe;
+import fr.sae.terraria.modele.entities.tools.Sword;
+import fr.sae.terraria.modele.entities.tools.Tool;
 import javafx.animation.Animation;
 import javafx.animation.KeyFrame;
 import javafx.animation.Timeline;
@@ -125,6 +127,7 @@ private void gameLoop()
                 this.player.pickup(new Meat(this));
                 this.player.pickup(new Pickaxe());
                 this.player.pickup(new Vodka(this));
+                this.player.pickup(new Sword(Tool.CRAFTED_WITH_WOOD));
 
                 caught[0] = true;
             }
@@ -143,12 +146,12 @@ private void gameLoop()
             boolean weHaveChangedDay = this.previousDays != this.clock.getDays();
             if (weHaveChangedDay)
                 for (int i = 0; i < Tree.TREE_CLUSTER; i++) // Génère par jour, 3 arbres
-                    GenerateEntity.tree(this);
+                    GenerateEntity.treeRandomly(this);
             if (dayTime) {  // Génère certaines entités uniquement pendant le jour
-                GenerateEntity.rabbit(this);
-                GenerateEntity.tallGrass(this);
+                GenerateEntity.rabbitRandomly(this);
+                GenerateEntity.tallGrassRandomly(this);
             } else if (nightTime)    // Génère certaines entités uniquement pendant le soir
-                GenerateEntity.slime(this);
+                GenerateEntity.slimeRandomly(this);
 
             // Updates toutes les entités
             for (Entity entity : this.entities) {
diff --git a/src/main/java/fr/sae/terraria/modele/GenerateEntity.java b/src/main/java/fr/sae/terraria/modele/GenerateEntity.java
index 0ae4a12..3c61068 100644
--- a/src/main/java/fr/sae/terraria/modele/GenerateEntity.java
+++ b/src/main/java/fr/sae/terraria/modele/GenerateEntity.java
@@ -90,21 +90,23 @@ private static List<Integer> findFloors(TileMaps maps, int y)
     }
 
     /** À un certain moment, grace au tick, il va générer des arbres +/- grand uniquement sur un sol */
-    public static void tree(Environment environment) { generateAnEntity(environment, new Tree(environment), 1, TREE_SPAWN_RATE); }
+    public static void treeRandomly(Environment environment) { generateAnEntity(environment, new Tree(environment), 1, TREE_SPAWN_RATE); }
     /** À un certain moment, grace au tick, il va générer des hautes herbes sur un sol */
-    public static void tallGrass(Environment environment) { generateAnEntity(environment, new TallGrass(environment), WHEN_SPAWN_A_TALL_GRASS, TALL_GRASS_SPAWN_RATE); }
+    public static void tallGrassRandomly(Environment environment) { generateAnEntity(environment, new TallGrass(environment), WHEN_SPAWN_A_TALL_GRASS, TALL_GRASS_SPAWN_RATE); }
 
     /** À un certain moment, grace au tick et à l'horloge du jeu, il va générer des lapins sur un sol */
-    public static void rabbit(Environment environment)
+    public static void rabbitRandomly(Environment environment)
     {
         if (environment.getRabbits().size() < MAX_SPAWN_RABBIT)
             generateAnEntity(environment, new Rabbit(environment), WHEN_SPAWN_A_RABBIT, RABBIT_SPAWN_RATE);
     }
 
     /** À un certain moment, grace au tick et à l'horloge du jeu, il va générer des lapins sur un sol  */
-    public static void slime(Environment environment)
+    public static void slimeRandomly(Environment environment)
     {
         if (environment.getSlimes().size() < MAX_SPAWN_SLIME)
             generateAnEntity(environment, new Slime(environment), WHEN_SPAWN_A_SLIME, SLIME_SPAWN_RATE);
     }
+
+    public static void slime(Environment environment) { generateAnEntity(environment, new Slime(environment), 1, 1); }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/Slime.java b/src/main/java/fr/sae/terraria/modele/entities/Slime.java
index f93846b..d9ac18c 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/Slime.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/Slime.java
@@ -2,6 +2,8 @@
 
 import fr.sae.terraria.modele.Environment;
 import fr.sae.terraria.modele.entities.entity.*;
+import fr.sae.terraria.modele.entities.player.inventory.Stack;
+import fr.sae.terraria.modele.entities.tools.Sword;
 
 import java.util.Map;
 import java.util.Objects;
@@ -45,7 +47,7 @@ else if (environment.getPlayer().getX() < this.x.getValue())
         }
 
         this.move();
-        this.collide();     // FIXME: 08/06/2022 : idk pourquoi le collide pose probleme pour le saut du slime
+        this.collide();
         this.worldLimit();
 
         if (!Objects.isNull(this.rect))
@@ -65,12 +67,28 @@ else if (environment.getPlayer().getX() < this.x.getValue())
     {
         if (((int) (this.animation.getFrame()) == 3))
             if (this.isNotFalling()) this.jump();
+
         this.setX(this.getX() + (this.getOffsetMoveX() * this.velocity));
     }
 
     @Override public void hit()
     {
         Environment.playSound("sound/daggerswipe.wav", false);
+
+        if (this.getPv() <= 0) {
+            // this.environment.getPlayer().pickup(new SlimeBall());
+
+            this.environment.getSlimes().remove(this);
+            this.environment.getEntities().remove(this);
+        }
+
+        Stack stack = this.environment.getPlayer().getStackSelected();
+        if (!Objects.isNull(stack)) {
+            if (stack.getItem() instanceof Sword) {
+                Sword sword = (Sword) stack.getItem();
+                this.setPv(this.getPv() - (Sword.DEFAULT_DAMAGE*sword.getMaterial()));
+            }
+        } else this.setPv(this.getPv() - .5);
     }
 
     @Override public void spawn(int x, int y)
diff --git a/src/main/java/fr/sae/terraria/modele/entities/entity/EntityMovable.java b/src/main/java/fr/sae/terraria/modele/entities/entity/EntityMovable.java
index a555a94..245da0f 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/entity/EntityMovable.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/entity/EntityMovable.java
@@ -71,7 +71,6 @@ public Map<String, Boolean> collide(final Environment environment)
             int xLeft = (int) (getX()+CollideObjectType.COLLISION_TOLERANCE)/widthTile;
             int xRight = (int) ((getX()+getRect().getWidth())-CollideObjectType.COLLISION_TOLERANCE)/widthTile;
 
-
             // Tombe
             if (this.isFalling()) {
                 this.gravity.degInit = 0;
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
index b354372..7a312a1 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
@@ -26,7 +26,7 @@ public class Stack
     public static final int MAX = 16;
 
     private StowableObjectType item = null;
-    private IntegerProperty nbItems;
+    private final IntegerProperty nbItems;
 
 
     public Stack()
@@ -72,6 +72,8 @@ else if (object instanceof Sword && this.item instanceof Sword)
             return true;
         else if (object instanceof Arrow && this.item instanceof Arrow)
             return true;
+        else if (object instanceof Sword && this.item instanceof Sword)
+            return true;
         else return false;
     }
 
diff --git a/src/main/java/fr/sae/terraria/modele/entities/tools/Axe.java b/src/main/java/fr/sae/terraria/modele/entities/tools/Axe.java
index c8fae8f..3e38b7b 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/tools/Axe.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/tools/Axe.java
@@ -5,13 +5,7 @@ public class Axe extends Tool
 {
 
 
-    public Axe()
-    {
-        super(Tool.DEFAULT_DURABILITY);
-    }
+    public Axe() { super(Tool.DEFAULT_DURABILITY); }
 
-    @Override public void use()
-    {
-
-    }
+    @Override public void use() { Tool.DEFAULT_WEAR(this); }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/tools/Pickaxe.java b/src/main/java/fr/sae/terraria/modele/entities/tools/Pickaxe.java
index a79a948..2d8dfe2 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/tools/Pickaxe.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/tools/Pickaxe.java
@@ -10,9 +10,5 @@ public Pickaxe()
         super(Tool.DEFAULT_DURABILITY);
     }
 
-    @Override public void use()
-    {
-        if (this.durability.get() > 0)
-            this.durability.set(this.durability.get() - 1);
-    }
+    @Override public void use() { Tool.DEFAULT_WEAR(this); }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/tools/Sword.java b/src/main/java/fr/sae/terraria/modele/entities/tools/Sword.java
index ba09355..ec37ab8 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/tools/Sword.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/tools/Sword.java
@@ -3,15 +3,15 @@
 
 public class Sword extends Tool
 {
+    public static final int DEFAULT_DAMAGE = 2;
 
 
-    protected Sword()
+    public Sword(double material)
     {
         super(Tool.DEFAULT_DURABILITY);
-    }
-
-    @Override public void use()
-    {
 
+        this.material = material;
     }
+
+    @Override public void use() { Tool.DEFAULT_WEAR(this); }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/tools/Tool.java b/src/main/java/fr/sae/terraria/modele/entities/tools/Tool.java
index 67dcddd..996945b 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/tools/Tool.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/tools/Tool.java
@@ -7,10 +7,14 @@
 
 public abstract class Tool implements StowableObjectType
 {
+    public static final double CRAFTED_WITH_WOOD = 1.;
+    public static final double CRAFTED_WITH_IRON = 1.5;
+
     public static final int DEFAULT_DURABILITY = 100;
 
     protected final IntegerProperty durability;
 
+    protected double material;
 
 
     protected Tool(final int durability)
@@ -21,4 +25,13 @@ protected Tool(final int durability)
 
     /** Use l'outil */
     public abstract void use();
+
+    public static void DEFAULT_WEAR(final Tool tool)
+    {
+        if (tool.durability.get() > 0)
+            tool.durability.set(tool.durability.get() - 1);
+    }
+
+
+    public double getMaterial() { return this.material; }
 }
diff --git a/src/main/java/fr/sae/terraria/vue/DrunkView.java b/src/main/java/fr/sae/terraria/vue/DrunkView.java
index fcb9c76..fe16df4 100644
--- a/src/main/java/fr/sae/terraria/vue/DrunkView.java
+++ b/src/main/java/fr/sae/terraria/vue/DrunkView.java
@@ -2,7 +2,6 @@
 
 import fr.sae.terraria.modele.Environment;
 import fr.sae.terraria.modele.entities.items.Vodka;
-import fr.sae.terraria.modele.entities.player.Player;
 import javafx.animation.Animation;
 import javafx.animation.KeyFrame;
 import javafx.animation.Timeline;
diff --git a/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java b/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java
index 2d9234f..ef689a3 100644
--- a/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java
+++ b/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java
@@ -40,6 +40,7 @@ public class ItemSelectedView
     private final Image torchItemImg;
     private final Image pickaxeItemImg;
     private final Image vodkaItemImg;
+    private final Image swordItemImg;
 
     private final Pane display;
 
@@ -66,6 +67,7 @@ public ItemSelectedView(Pane display, Player player, double scaleMultiplicatorWi
         this.meatItemImg = View.loadAnImage("loots/meat.png", widthItem, heightItem);
         this.woodItemImg = View.loadAnImage("loots/wood.png", widthItem, heightItem);
         this.pickaxeItemImg = View.loadAnImage("tools/pickaxe.png", widthItem, heightItem);
+        this.swordItemImg = View.loadAnImage("tools/sword.png", widthItem, heightItem);
 
         // Reset
         player.getInventory().get().addListener((ListChangeListener<? super Stack>) c -> {
@@ -111,7 +113,7 @@ else if (item instanceof Bow)
                 else if (item instanceof Pickaxe)
                     this.itemSelectedImgView.setImage(this.pickaxeItemImg);
                 else if (item instanceof Sword)
-                    this.itemSelectedImgView.setImage(null);
+                    this.itemSelectedImgView.setImage(this.swordItemImg);
                 else if (item instanceof Arrow)
                     this.itemSelectedImgView.setImage(null);
             }

From b9cdf1735006bdde7a72eae736586f77ce88cac4 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Sun, 12 Jun 2022 10:03:29 +0200
Subject: [PATCH 23/97] Add JUnit libs on Gradle

---
 build.gradle | 1 +
 1 file changed, 1 insertion(+)

diff --git a/build.gradle b/build.gradle
index 564b133..f6e9452 100644
--- a/build.gradle
+++ b/build.gradle
@@ -34,6 +34,7 @@ javafx {
 }
 
 dependencies {
+    implementation 'junit:junit:4.13.1'
     testImplementation("org.junit.jupiter:junit-jupiter-api:${junitVersion}")
     testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:${junitVersion}")
 

From 89470b410e89fbe1309a3bd4c9674e4aca1adaf4 Mon Sep 17 00:00:00 2001
From: Tiago Lousa <tig2468.a@gmail.com>
Date: Sat, 11 Jun 2022 09:48:16 +0200
Subject: [PATCH 24/97] correction orthographe jusqu'au package entity

---
 src/main/java/fr/sae/terraria/Terraria.java    |  2 +-
 .../terraria/controller/GameController.java    |  2 +-
 .../terraria/modele/entities/blocks/Block.java |  2 +-
 .../terraria/modele/entities/blocks/Stone.java |  4 ++--
 .../modele/entities/blocks/TallGrass.java      |  6 +++---
 .../modele/entities/entity/Animation.java      |  4 ++--
 .../entities/entity/BreakableObjectType.java   |  4 ++--
 .../entities/entity/CollapsibleObjectType.java |  8 ++++----
 .../entities/entity/CollideObjectType.java     |  8 ++++----
 .../modele/entities/entity/Entity.java         |  2 +-
 .../modele/entities/entity/EntityMovable.java  | 18 +++++++++---------
 .../modele/entities/entity/Gravity.java        |  2 +-
 .../entities/entity/PlaceableObjectType.java   |  6 +++---
 .../entity/ReproductiveObjectType.java         |  2 +-
 14 files changed, 35 insertions(+), 35 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/Terraria.java b/src/main/java/fr/sae/terraria/Terraria.java
index c6e2d52..2547bdf 100644
--- a/src/main/java/fr/sae/terraria/Terraria.java
+++ b/src/main/java/fr/sae/terraria/Terraria.java
@@ -21,7 +21,7 @@
 
 public class Terraria extends Application
 {
-    // Constants
+    // Constantes
     public static final String SRC_PATH = "src/main/resources/fr/sae/terraria/";
     public static final double TARGET_FPS = .017;
     public static final int DISPLAY_RENDERING_WIDTH = 465;
diff --git a/src/main/java/fr/sae/terraria/controller/GameController.java b/src/main/java/fr/sae/terraria/controller/GameController.java
index 2ff2b63..db53065 100644
--- a/src/main/java/fr/sae/terraria/controller/GameController.java
+++ b/src/main/java/fr/sae/terraria/controller/GameController.java
@@ -109,7 +109,7 @@ private void addKeysEventListener(final Stage stage)
             // La position correcte sur le Pane
             double mouseX = mouse.getSceneX()+((Rectangle) this.displayTiledMap.getParent().getClip()).getX();
             double mouseY = (mouse.getSceneY()-this.title.getPrefHeight())+((Rectangle) this.displayTiledMap.getParent().getClip()).getY();
-            // Le bloc où la souris à clicker
+            // Le bloc où la souris à clickée
             int xBlock = (int) (mouseX/tileWidth);
             int yBlock = (int) (mouseY/tileHeight);
             Rectangle2D rectangle = new Rectangle2D(mouseX, mouseY, scaleMultiplicativeWidth, scaleMultiplicativeHeight);
diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
index 90b82ba..74c9251 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
@@ -32,7 +32,7 @@ protected void breakAnimation(final Environment environment, final Block block,
             time[0]++;
         }));
         timeline.getKeyFrames().add(keyFrame);
-        // Faire revenir le bloc à sa position initiale lorsque l'animation est arrêté
+        // Faire revenir le bloc à sa position initiale lorsque l'animation est terminée
         timeline.statusProperty().addListener(c -> {
             block.setX(xOrigin);
             block.setY(yOrigin);
diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/Stone.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/Stone.java
index 88cabcd..a991360 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/Stone.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/Stone.java
@@ -45,7 +45,7 @@ public Stone(Environment environment, int x, int y)
         Environment.playSound("sound/brick" + ((int) (Math.random()*2)+1) + ".wav", false);
         this.breakAnimation(this.environment, this, this.xOrigin, this.yOrigin);
 
-        // Une fois le bloc détruit, il donne la pierre et le supprime de la TileMaps
+        // Une fois le bloc cassé, de la pierre est ramassée et le bloc se supprime du Pane
         Player player = this.environment.getPlayer();
         if (this.getPv() <= 0) {
             player.pickup(this);
@@ -57,7 +57,7 @@ public Stone(Environment environment, int x, int y)
             this.environment.getBlocks().remove(this);
         }
 
-        // S'il utilise le bon outil, il commencera à casser le bloc sinon use l'outil sans casser le bloc.
+        // Peu importe l'outil qu'utilise le joueur, si c'est un outil, il perdra de la durabilité, mais le bloc ne peut que se casser avec une pioche
         Stack stack = player.getStackSelected();
         if (!Objects.isNull(stack)) {
             if (stack.getItem() instanceof Pickaxe)
diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/TallGrass.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/TallGrass.java
index 68514c4..034f1e3 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/TallGrass.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/TallGrass.java
@@ -45,7 +45,7 @@ public TallGrass(Environment environment, int x, int y)
             tallGrassGrowth.set(tallGrassGrowth.get() + TallGrass.GROWTH_SPEED);
     }
 
-    /** Joue un son et donne au joueur entre 1 et 3 de fibre */
+    /** Joue un son et donne au joueur entre 1 et 3 fibres */
     @Override public void breaks()
     {
         Environment.playSound("sound/cut.wav", false);
@@ -61,7 +61,7 @@ public TallGrass(Environment environment, int x, int y)
         this.environment.getBlocks().remove(this);
     }
 
-    /** Reproduit les hautes herbes à gauche et à droite de la haute herbe parente */
+    /** Reproduit des hautes herbes à gauche et à droite de celle parente */
     @Override public List<Entity> reproduction(Environment environment)
     {
         List<Entity> children = new ArrayList<>();
@@ -77,7 +77,7 @@ public TallGrass(Environment environment, int x, int y)
             int x = -1;
             int y = (int) (getY()/heightTile)+1;
 
-            // Check si personne à côté
+            // Check si aucune entité ne se trouve à coté
             int left = 0; int right = 0;
             for (Entity entity : entities) {
                 boolean haveAnEntityOnLeft = entity.getX() == (getX() - widthTile) && entity.getY() == getY();
diff --git a/src/main/java/fr/sae/terraria/modele/entities/entity/Animation.java b/src/main/java/fr/sae/terraria/modele/entities/entity/Animation.java
index e1fc54b..3b31bad 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/entity/Animation.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/entity/Animation.java
@@ -8,7 +8,7 @@
 /**
  * <h1>Animation</h1>
  * <h2><u>Description:</u></h2>
- * <p>Gére uniquement la valeurs du frame pour que la vue sachent sur quel frame doit afficher l'image.</p>
+ * <p>Gère uniquement la valeur du frame pour que la vue sache sur quel frame elle doit se placer</p>
  * @see PlayerView
  */
 public class Animation
@@ -42,6 +42,6 @@ public void loop()
     public double getFrame() { return this.frame.get(); }
     public DoubleProperty getFrameProperty() { return this.frame; }
 
-    /** Spécifie quand l'animation sur le Sprite Sheet doit s'arrêter */
+    /** Spécifie à quelle frame l'animation sur le Sprite Sheet doit s'arrêter */
     public void setEndFrame(int newEndFrame) { this.endFrame = newEndFrame; }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/entity/BreakableObjectType.java b/src/main/java/fr/sae/terraria/modele/entities/entity/BreakableObjectType.java
index c986cc2..07b891a 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/entity/BreakableObjectType.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/entity/BreakableObjectType.java
@@ -5,7 +5,7 @@
  * <h1>Breakable Object Type</h1>
  * <h2>Interface utile à un objet qui hérite d'Entity</h2>
  * <h3><u>Description:</u></h3>
- * <p>Determine un objet qui est cassable</p>
+ * <p>Détermine un objet cassable</p>
  *
  * @see Entity
  * @author CHRZASCZCZ Naulan
@@ -15,7 +15,7 @@ public interface BreakableObjectType
 
 
     /**
-     * Fonction appelée lorsqu'une entité tante de casser une autre entité
+     * Fonction appelée lorsqu'une entité tente de casser une autre entité
      *  Permet de faire des actions personnalisées.
      *
      * @see fr.sae.terraria.modele.entities.blocks.Dirt
diff --git a/src/main/java/fr/sae/terraria/modele/entities/entity/CollapsibleObjectType.java b/src/main/java/fr/sae/terraria/modele/entities/entity/CollapsibleObjectType.java
index 9d57e40..b9b299f 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/entity/CollapsibleObjectType.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/entity/CollapsibleObjectType.java
@@ -5,8 +5,8 @@
  * <h1>Collapsible Object Type</h1>
  * <h2>Interface utile à un objet qui hérite d'Entity</h2>
  * <h3><u>Description:</u></h3>
- * <p>Determine les objets qui sont touchable par une autre entité</p>
- * <p>Il détermine surtout les objets qui sont touchable avec des flèches ou des outils qui inflige des dégâts, qui peuvent en général avoir des dégâts à cause de ses éléments</p>
+ * <p>Détermine les objets qui sont touchable par d'autres entités</p>
+ * <p>Il détermine surtout les objets qui sont touchable avec des flèches ou des outils qui infligent des dégâts, qui peuvent en général avoir des dégâts à cause de ces éléments</p>
  *
  * @see Entity
  * @author CHRZASZCZ Naulan
@@ -16,8 +16,8 @@ public interface CollapsibleObjectType
 
 
     /**
-     * Fonction qui est appelée lorsqu'une entité touche un autre par n'importe quel manière en excluent les collisions entre collision
-     *  Permet de faire des actions personnalisées par entité lorsque une entitée touche un autre
+     * Fonction qui est appelée lorsqu'une entité est touchée par une autre entité par n'importe quel moyen en excluant les collisions entre collision
+     *  Permet de faire des actions personnalisées par entité lorsque une entité en touche une autre
      *
      * @see fr.sae.terraria.modele.entities.Rabbit
      */
diff --git a/src/main/java/fr/sae/terraria/modele/entities/entity/CollideObjectType.java b/src/main/java/fr/sae/terraria/modele/entities/entity/CollideObjectType.java
index 89efdb9..66a8d12 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/entity/CollideObjectType.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/entity/CollideObjectType.java
@@ -5,8 +5,8 @@
  * <h1>CollideObjectType</h1>
  * <h2>Interface utile à un objet qui hérite d'Entity</h2>
  * <h3><u>Description:</u></h3>
- * <p>Permet de discerner les entités qui ne sont pas des objects qui doit rentré en collisions avec d'autre entité</p>
- * <p>Cela peut êtres utile sur les elements qui doit êtres au premier plan et d'autre element qui doit êtres à l'arrière plan</p>
+ * <p>Permet de discerner les entités qui ne sont pas des objects et qui ont des collisions avec d'autres entités</p>
+ * <p>Cela peut être utile sur les elements qui doivent êtres au premier plan et d'autre element qui doit êtres à l'arrière plan</p>
  *
  * @see Entity
  * @author CHRZASZCZ Naulan
@@ -18,8 +18,8 @@ public interface CollideObjectType
 
     /**
      * Permet d'appliquer des collisions à l'entité qui l'utilise sur son environment.
-     * Pour pouvoir être fonctionnel, il doit faire appelle à "super.collide()" est de la rangé dans une variable
-     * de type Map pour permettre d'avoir des données relatif sur où il entre en collision
+     * Pour pouvoir être fonctionnelle, elle doit faire appel à "super.collide()" et de ranger son return dans une variable
+     * de type Map pour permettre d'avoir des données relatives sur les endroit ou l'entité entre en collision avec une autre
      *
      * @see Entity
      */
diff --git a/src/main/java/fr/sae/terraria/modele/entities/entity/Entity.java b/src/main/java/fr/sae/terraria/modele/entities/entity/Entity.java
index 1f3ea79..77633cf 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/entity/Entity.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/entity/Entity.java
@@ -57,7 +57,7 @@ protected Entity(int x, int y)
 
     /**
      * Il permet à chaque passage de la boucle du jeu, de faire diverses fonctions liée à l'Entité.
-     *  Certaine fonction qui sera implementé grâce à des interfaces sera probablement obligatoirement mise dans cette fonction.
+     *  Certaine fonction qui seront implementés grâce à des interfaces seront obligatoirement mise dans cette fonction.
      */
     public abstract void updates();
 
diff --git a/src/main/java/fr/sae/terraria/modele/entities/entity/EntityMovable.java b/src/main/java/fr/sae/terraria/modele/entities/entity/EntityMovable.java
index 245da0f..9936d74 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/entity/EntityMovable.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/entity/EntityMovable.java
@@ -35,12 +35,12 @@ protected EntityMovable(final Environment environment, int x, int y)
     public abstract void move();
 
     /**
-     * Permet de detectés les collisions sur la carte et de son environment.
+     * Permet de detectéer les collisions avec son environnement.
      *
      * @param environment Permet de savoir les tailles des tiles et d'avoir la matrixe de données de la carte.
-     * @return Il vas retourner une HashMap qui ne contiendra pas de clé ou 4 clés maximum
-     *         left, right, top, bottom sera les clés qui peuvent être present lors d'une detection de collision.
-     *         Il permettra de faire des actions personnalisées les actions faites par l'entité suivant d'où il rentre en collision avec son environment.
+     * @return Elle va retourner une HashMap qui ne contiendra pas de clé ou 4 clés maximum
+     *         left, right, top, bottom seront les clés qui peuvent être presentes lors d'une detection de collision.
+     *         Elle permettra de faire des actions personnalisées selon l'endroit où l'entité rentre en collision.
      */
     public Map<String, Boolean> collide(final Environment environment)
     {
@@ -66,7 +66,7 @@ public Map<String, Boolean> collide(final Environment environment)
             whereCollide.put("left", tileMaps.getTile(futurePositionXLeft, yTop) != TileMaps.SKY || tileMaps.getTile(futurePositionXLeft, yBottom) != TileMaps.SKY);
         }
 
-        // Detection collision en bas et en haut
+        // Detection collision bas et haut
         if (this.offset[1] != Entity.IDLE) {
             int xLeft = (int) (getX()+CollideObjectType.COLLISION_TOLERANCE)/widthTile;
             int xRight = (int) ((getX()+getRect().getWidth())-CollideObjectType.COLLISION_TOLERANCE)/widthTile;
@@ -93,7 +93,7 @@ public Map<String, Boolean> collide(final Environment environment)
                         this.gravity.timer = 0;
                         this.gravity.setJumpPosInit(this);
                     } else this.setY(futurePositionY);
-                    // Quand le joueur decent
+                    // Quand le joueur descends
                 } else {
                     boolean isCollideBottom = tileMaps.getTile(xLeft, (int) ((futurePositionY + this.rect.getHeight()) - CollideObjectType.COLLISION_TOLERANCE)/heightTile) != TileMaps.SKY || tileMaps.getTile(xRight,(int) ((futurePositionY + this.rect.getHeight()) - CollideObjectType.COLLISION_TOLERANCE)/heightTile) != TileMaps.SKY;
 
@@ -143,10 +143,10 @@ public Map<String, Boolean> collide(final Environment environment)
     public boolean isIDLEonY() { return this.offset[1] == Entity.IDLE; }
 
     /**
-     * Lorsque le joueur sort de l'ecran et/ou de la carte, la fonction retourne une valeurs boolean qui sera manipulable sur les classes qui l'héritera.
-     * @param environment Permet d'avoir les informations naicessaire sur la carte et l'écran pour que l'entité ne sorte pas.
+     * Lorsque le joueur sort de l'ecran et/ou de la carte, la fonction retourne une valeur boolean qui sera manipulable sur les classes qui heriteront EntityMovable.
+     * @param environment Permet d'avoir les informations nécessaires sur la carte et l'écran pour que l'entité ne sorte pas.
      *
-     * @return false = ne sort pas | true = sort de l'écran soit vers la droite ou soit vers le bas
+     * @return false = ne sort pas | true = sort de l'écran soit vers la droite ou la gauche
      */
     public boolean worldLimit(final Environment environment)
     {
diff --git a/src/main/java/fr/sae/terraria/modele/entities/entity/Gravity.java b/src/main/java/fr/sae/terraria/modele/entities/entity/Gravity.java
index d97b70d..5009fb8 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/entity/Gravity.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/entity/Gravity.java
@@ -36,7 +36,7 @@ private double calcFlightTime()
         return ((this.vInit * this.amplitude) * Math.sin(this.degInit)) / Gravity.VALUE;
     }
 
-    /** Modifie le xInit et le yInit pour modifier le point de départ du saut ou de là où il tombe */
+    /** Modifie le xInit et le yInit pour modifier le point de départ du saut ou de l'endroit où il tombe */
     protected void setJumpPosInit(final Entity entity) { this.xInit = entity.getX(); this.yInit = entity.getY(); }
 
 
diff --git a/src/main/java/fr/sae/terraria/modele/entities/entity/PlaceableObjectType.java b/src/main/java/fr/sae/terraria/modele/entities/entity/PlaceableObjectType.java
index c3a99df..3c2669b 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/entity/PlaceableObjectType.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/entity/PlaceableObjectType.java
@@ -3,9 +3,9 @@
 
 /**
  * <h1>Placeable Object Type</h1>
- * <h2>Interface utile sur les objets qui hérite de block</h2>
+ * <h2>Interface utile sur les objets qui héritent de block</h2>
  * <h3><u>Description:</u></h3>
- * <p>Permet de savoir si un block sera possable sur un sol ou non</p>
+ * <p>Permet de savoir si un block sera posable sur un sol ou non</p>
  *
  * @see fr.sae.terraria.modele.entities.blocks.Stone
  * @author CHRZASZCZ Naulan
@@ -15,7 +15,7 @@ public interface PlaceableObjectType
 
 
     /**
-     * Permet d'appliquer des actions lorsque qu'il tante de poser un block
+     * Permet d'appliquer des actions lorsque qu'il tente de poser un block
      *
      * @param x Les coordonnées du block en x lorsqu'il va êtres poser au sol
      * @param y Les coordonnées du block en y lorsqu'il va êtres poser au sol
diff --git a/src/main/java/fr/sae/terraria/modele/entities/entity/ReproductiveObjectType.java b/src/main/java/fr/sae/terraria/modele/entities/entity/ReproductiveObjectType.java
index 66818ec..329b155 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/entity/ReproductiveObjectType.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/entity/ReproductiveObjectType.java
@@ -9,7 +9,7 @@
  * <h1>Reproduction Object Type</h1>
  * <h2>Interface utile à un objet qui hérite d'Entity</h2>
  * <h3><u>Description:</u></h3>
- * <p>Il permet de savoir si l'entité qui implementer cette interface est une entité qui peut se reproduire entre eux.</p>
+ * <p>Il permet de savoir si l'entité qui implémente cette interface est une entité qui peut se reproduire ou non</p>
  *
  * @see fr.sae.terraria.modele.entities.Rabbit
  * @see fr.sae.terraria.modele.entities.blocks.TallGrass

From 07dd7d7d80eadcd1d0c2de12c0800f3e5a6055ff Mon Sep 17 00:00:00 2001
From: Tiago Lousa <tig2468.a@gmail.com>
Date: Sun, 12 Jun 2022 12:27:59 +0200
Subject: [PATCH 25/97] fin correction orthographe

---
 src/main/java/fr/sae/terraria/Terraria.java          |  2 +-
 .../java/fr/sae/terraria/modele/Environment.java     | 10 +++++-----
 .../java/fr/sae/terraria/modele/GenerateEntity.java  |  8 ++++----
 .../fr/sae/terraria/modele/entities/items/Vodka.java |  2 +-
 .../sae/terraria/modele/entities/player/Player.java  |  2 +-
 .../modele/entities/player/inventory/Inventory.java  |  2 +-
 .../modele/entities/player/inventory/Stack.java      |  2 +-
 .../fr/sae/terraria/modele/entities/tools/Tool.java  |  2 +-
 src/main/java/fr/sae/terraria/vue/TileMapsView.java  | 12 ++++++------
 src/main/java/fr/sae/terraria/vue/View.java          |  4 ++--
 src/main/java/fr/sae/terraria/vue/hud/ClockView.java |  2 +-
 .../fr/sae/terraria/vue/hud/MouseCursorView.java     |  2 +-
 12 files changed, 25 insertions(+), 25 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/Terraria.java b/src/main/java/fr/sae/terraria/Terraria.java
index 2547bdf..c0599a9 100644
--- a/src/main/java/fr/sae/terraria/Terraria.java
+++ b/src/main/java/fr/sae/terraria/Terraria.java
@@ -77,7 +77,7 @@ public void start(Stage stage) throws IOException
         stage.addEventFilter(KeyEvent.KEY_RELEASED, key -> timePressedKey[0] = 1);
         stage.sizeToScene();
 
-        // Sync les changements du joueur entre les contrôleurs.
+        // Synchronise les changements du joueur entre les contrôleurs.
         stage.sceneProperty().addListener(((obs, oldScene, newScene) -> {
             if (switchScene.get()) {
                 if (!Objects.isNull(menuController.player)) {
diff --git a/src/main/java/fr/sae/terraria/modele/Environment.java b/src/main/java/fr/sae/terraria/modele/Environment.java
index 9706e59..e3b33f3 100644
--- a/src/main/java/fr/sae/terraria/modele/Environment.java
+++ b/src/main/java/fr/sae/terraria/modele/Environment.java
@@ -36,12 +36,12 @@ public class Environment
 {
     private final ObservableList<Tree> trees;
     private final ObservableList<Block> blocks;
-    // Permet update toutes les entités en une seule boucle.
+    // Permet d'update toutes les entités avec une seule boucle.
     private final ObservableList<Entity> entities;
-    // Range des entities en plus pour permettre facilement de savoir combien son t-il sur la carte pour limiter leur apparition
+    // Range des entitiés en plus pour avoir le nombre d'entités sur la carte et limiter leurs apparitions
     private final ObservableList<Rabbit> rabbits;
     private final ObservableList<Slime> slimes;
-    // Permet update facilement les lumières des torches sur le filtre
+    // Permet d'update facilement les lumières des torches sur le filtre
     private final ObservableList<Torch> torches;
 
     private final TileMaps tileMaps;
@@ -87,7 +87,7 @@ public Environment(double scaleMultiplicatorWidth, double scaleMultiplicatorHeig
         this.player.setPv(4);
         this.player.spawn(5*widthTile, 3*heightTile);
 
-        // Détecte si le joueur n'est pas dans un bloc lorsque qu'il met un block au sol
+        // Détecte si le joueur n'est pas dans un bloc lorsqu'il met un block au sol
         this.entities.addListener((ListChangeListener<? super Entity>) c -> {
             while (c.next()) if (c.wasAdded()) {
                 Entity entity = c.getList().get(0);
@@ -150,7 +150,7 @@ private void gameLoop()
             if (dayTime) {  // Génère certaines entités uniquement pendant le jour
                 GenerateEntity.rabbitRandomly(this);
                 GenerateEntity.tallGrassRandomly(this);
-            } else if (nightTime)    // Génère certaines entités uniquement pendant le soir
+            } else if (nightTime)    // Génère certaines entités uniquement pendant le soir et la nuit
                 GenerateEntity.slimeRandomly(this);
 
             // Updates toutes les entités
diff --git a/src/main/java/fr/sae/terraria/modele/GenerateEntity.java b/src/main/java/fr/sae/terraria/modele/GenerateEntity.java
index 3c61068..84b67bb 100644
--- a/src/main/java/fr/sae/terraria/modele/GenerateEntity.java
+++ b/src/main/java/fr/sae/terraria/modele/GenerateEntity.java
@@ -22,7 +22,7 @@
 
 /**
  * <h1>Generate Entity</h1>
- * <h2>Une classe qui permet de génère aléatoirement des entités</h2>
+ * <h2>Une classe qui permet de générer aléatoirement des entités</h2>
  */
 public class GenerateEntity
 {
@@ -34,11 +34,11 @@ public class GenerateEntity
     public GenerateEntity() { super(); }
 
     /**
-     * Génère une entité selon de quand il spawn et du pourcent de change qu'il spawn réellement.
+     * Génère une entité selon le momnt ou il est sensé apparaitre et son pourcentage de chances d'apparaitre.
      *
      * @param e L'entité concernée
      * @param whenSpawn Le nombre qui determine quand il doit spawn sur la carte
-     * @param spawnRate Le pourcentage de chance qu'il spawn réellement à l'endroit qu'on souhaite le placer
+     * @param spawnRate Le pourcentage de chance qu'il spawn réellement à l'endroit où l'on souhaite le placer
      */
     private static void generateAnEntity(Environment environment, SpawnableObjectType e, int whenSpawn, double spawnRate)
     {
@@ -101,7 +101,7 @@ public static void rabbitRandomly(Environment environment)
             generateAnEntity(environment, new Rabbit(environment), WHEN_SPAWN_A_RABBIT, RABBIT_SPAWN_RATE);
     }
 
-    /** À un certain moment, grace au tick et à l'horloge du jeu, il va générer des lapins sur un sol  */
+    /** À un certain moment, grace au tick et à l'horloge du jeu, il va générer des slimes sur un sol  */
     public static void slimeRandomly(Environment environment)
     {
         if (environment.getSlimes().size() < MAX_SPAWN_SLIME)
diff --git a/src/main/java/fr/sae/terraria/modele/entities/items/Vodka.java b/src/main/java/fr/sae/terraria/modele/entities/items/Vodka.java
index 10ec453..3e83262 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/items/Vodka.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/items/Vodka.java
@@ -9,7 +9,7 @@
 /**
  * <h1>EasterEgg</h1>
  * <h2><u>Description:</u></h2>
- * <p>Ce drop lorsque le joueur casse des hautes herbes et une fois bu, l'écran sera troublé</p>
+ * <p>Se drop lorsque le joueur casse des hautes herbes et une fois bu, l'écran sera troublé</p>
  */
 public class Vodka extends Item implements ConsumableObjectType
 {
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
index 5491a0e..05a0374 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
@@ -138,7 +138,7 @@ public void placeBlock(int xBlock, int yBlock)
         }
     }
 
-    /** Lie les inputs au clavier à une ou des actions. */
+    /** Lie les inputs du clavier à une ou des actions. */
     public void eventInput()
     {
         this.inventory.eventInput();
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
index ac39b04..49886e1 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
@@ -36,7 +36,7 @@ public Inventory(final Player player)
 
         this.posCursor = new SimpleIntegerProperty(0);
 
-        // Change l'item de la main du joueur
+        // Change l'item qui se trouve dans la main du joueur
         this.posCursorProperty().addListener((obs, oldV, newV) -> {
             boolean isntOutOfInventoryBar = newV.intValue() >= 0 && newV.intValue() < nbElementOnOneLineOfInventory;
 
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
index 7a312a1..4dac440 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
@@ -19,7 +19,7 @@
  * <h1>Stack</h1>
  * <h2>Objet de données lié à l'objet <code>Inventaire</code>.</h2>
  * <h3><u>Description:</u></h3>
- * Cette dataclass est la pour avoir l'information sur combien il y a t-il d'objet du même type sur une case de l'inventaire
+ * Cette dataclass est présente pour savoir combien d'objets du même type se trouvent sur une case d'inventaire
  */
 public class Stack
 {
diff --git a/src/main/java/fr/sae/terraria/modele/entities/tools/Tool.java b/src/main/java/fr/sae/terraria/modele/entities/tools/Tool.java
index 996945b..fecc8a1 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/tools/Tool.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/tools/Tool.java
@@ -23,7 +23,7 @@ protected Tool(final int durability)
         this.durability = new SimpleIntegerProperty(durability);
     }
 
-    /** Use l'outil */
+    /** Utilise l'outil */
     public abstract void use();
 
     public static void DEFAULT_WEAR(final Tool tool)
diff --git a/src/main/java/fr/sae/terraria/vue/TileMapsView.java b/src/main/java/fr/sae/terraria/vue/TileMapsView.java
index b83e9aa..b8f94ba 100644
--- a/src/main/java/fr/sae/terraria/vue/TileMapsView.java
+++ b/src/main/java/fr/sae/terraria/vue/TileMapsView.java
@@ -57,7 +57,7 @@ public class TileMapsView
     /**
      * @param environment Avoir des infos relatives à son environment
      * @param displayTileMap Affiche la carte tuilée
-     * @param displayHostileBeings Affiche les êtres hostile (Animal, Joueur, ...)
+     * @param displayHostileBeings Affiche les entités mouvantes (Animal, Joueur, ...)
      */
     public TileMapsView(Environment environment,
                         Pane displayTileMap,
@@ -88,11 +88,11 @@ public TileMapsView(Environment environment,
         this.treeImg = View.loadAnImage("sprites/tree-sheet.png", scaleMultiplicatorWidth, scaleMultiplicatorHeight);
         this.tallGrassImg = View.loadAnImage("tiles/tall-grass.png",tileWidth,tileHeight);
 
-        // Ajoute et supprime les elements de l'écran qui concerne les blocks
+        // Ajoute et supprime les elements de l'écran qui concernent les blocks
         this.environment.getBlocks().addListener((ListChangeListener<? super Block>) this::updatesBlocksView);
-        // Ajoute et supprime les elements de l'écran qui concerne les lapins
+        // Ajoute et supprime les elements de l'écran qui concernent les lapins
         this.environment.getRabbits().addListener((ListChangeListener<? super Rabbit>) this::updatesRabbitView);
-        // Ajoute et supprime les elements de l'écran qui concerne les slimes
+        // Ajoute et supprime les elements de l'écran qui concernent les slimes
         this.environment.getSlimes().addListener((ListChangeListener<? super Slime>) this::updatesSlimeView);
         // Ajoute et supprime un groupe d'élèments de l'écran qui concerne les arbres
         this.environment.getTrees().addListener((ListChangeListener<? super Tree>) this::updatesTreeView);
@@ -277,10 +277,10 @@ private void updatesTreeView(ListChangeListener.Change<? extends Tree> c)
 
     }
 
-    /** Affiche une erreur au cas où si un developer a fait une erreur lors de la saisie d'un tile sur le fichier .json */
+    /** Affiche une erreur si un developer a fait une erreur lors de la saisie d'un tile dans le fichier .json */
     private void errorTile(final int tile) { if (tile != TileMaps.SKY) System.out.println("Le tile '" + tile + "' n'est pas reconnu."); }
 
-    /** Decompose la carte pour afficher un à un les tiles à l'écran */
+    /** Decompose la carte pour afficher une à une les tiles à l'écran */
     public void displayMaps(TileMaps tiles)
     {
         for (int y = 0; y < tiles.getHeight() ; y++)
diff --git a/src/main/java/fr/sae/terraria/vue/View.java b/src/main/java/fr/sae/terraria/vue/View.java
index 1d6780c..640fe79 100644
--- a/src/main/java/fr/sae/terraria/vue/View.java
+++ b/src/main/java/fr/sae/terraria/vue/View.java
@@ -24,7 +24,7 @@ public class View
 
     /**
      * Cette classe lors de l'initialisation, crée et génére toutes les views du jeux
-     *  Contient des fonctions essentiels au chargement des images et des creations de vue
+     *  Contient des fonctions essentielles au chargement des images et des creations de vue
      */
     public View(final GameController gameController)
     {
@@ -55,7 +55,7 @@ public View(final GameController gameController)
         new MouseCursorView(displayHUD, displayCursorMouse, scaleMultiplicatorWidth, scaleMultiplicatorHeight);
     }
 
-    /** Essaye de trouver et de charger l'image sinon renvoie null */
+    /** Essaye de trouver et de charger l'image, si elle n'est pas trouvée, retourne null */
     private static Image foundImage(final String path)
     {
         Image img = null;
diff --git a/src/main/java/fr/sae/terraria/vue/hud/ClockView.java b/src/main/java/fr/sae/terraria/vue/hud/ClockView.java
index e1ccbce..ca74105 100644
--- a/src/main/java/fr/sae/terraria/vue/hud/ClockView.java
+++ b/src/main/java/fr/sae/terraria/vue/hud/ClockView.java
@@ -29,7 +29,7 @@ public ClockView(Clock gameTime, Pane display, double scaleMultiplicatorWidth, d
         this.clockCursorImg = View.loadAnImage("clock-cursor.png",scaleMultiplicatorWidth,scaleMultiplicatorHeight);
     }
 
-    /** Affiche une horloge à aiguille visuelle à l'écran. */
+    /** Affiche une horloge à aiguille à l'écran. */
     private void displayClock(Image inventoryBarImg, double inventoryBarX, double inventoryBarY)
     {
         ImageView clockCursorView = new ImageView(clockCursorImg);
diff --git a/src/main/java/fr/sae/terraria/vue/hud/MouseCursorView.java b/src/main/java/fr/sae/terraria/vue/hud/MouseCursorView.java
index 1a9edf8..8ef2348 100644
--- a/src/main/java/fr/sae/terraria/vue/hud/MouseCursorView.java
+++ b/src/main/java/fr/sae/terraria/vue/hud/MouseCursorView.java
@@ -20,7 +20,7 @@ public class MouseCursorView
 
     /**
      * Un rectangle rouge qui suit la souris
-     *   Permet de savoir où nous cliquons sur l'écran plus précisément sur quel tile
+     *   Permet de savoir où le joueur clique sur l'écran plus précisément sur quel tile
      *
      * @param display L'afficheur qui se gère du HUD
      * @param scaleMultiplicatorWidth Scaling en largeur

From 7cb6375a247950b5c160f4bc86a3ea00e22677a0 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Sun, 12 Jun 2022 12:57:10 +0200
Subject: [PATCH 26/97] Player.java Move tested

---
 build.gradle                                  |  6 +--
 .../terraria/modele/entities/items/Meat.java  |  6 +--
 .../modele/entities/player/Player.java        | 13 ++++--
 .../entities/player/inventory/Inventory.java  |  7 ++-
 .../entities/player/inventory/Stack.java      |  2 +-
 src/main/java/fr/sae/terraria/vue/View.java   | 17 ++++---
 src/main/java/module-info.java                |  4 --
 .../modele/entities/player/PlayerTest.java    | 46 +++++++++++++++++++
 8 files changed, 75 insertions(+), 26 deletions(-)
 create mode 100644 src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java

diff --git a/build.gradle b/build.gradle
index f6e9452..3bb5a0b 100644
--- a/build.gradle
+++ b/build.gradle
@@ -34,11 +34,11 @@ javafx {
 }
 
 dependencies {
-    implementation 'junit:junit:4.13.1'
+    implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.7'
+    implementation 'junit:junit:4.13.2'
+
     testImplementation("org.junit.jupiter:junit-jupiter-api:${junitVersion}")
     testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:${junitVersion}")
-
-    implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.7'
 }
 
 test {
diff --git a/src/main/java/fr/sae/terraria/modele/entities/items/Meat.java b/src/main/java/fr/sae/terraria/modele/entities/items/Meat.java
index ac87769..2a748ea 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/items/Meat.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/items/Meat.java
@@ -21,11 +21,7 @@ public Meat(final Environment environment)
     {
         Player player = environment.getPlayer();
 
-        if (player.getPv() < player.getPvMax()) {
-            Inventory inventory = player.getInventory();
-
+        if (player.getPv() < player.getPvMax())
             player.setPv(player.getPv() + 1);
-            inventory.get().get(inventory.getPosCursor()).remove();
-        }
     }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
index 05a0374..e191aef 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
@@ -85,16 +85,21 @@ public Player(final Environment environment)
         }
     }
 
-    @Override public void hit() { }
+    @Override public void hit()
+    {
+        this.setPv(this.getPv() - 1);
+    }
 
     @Override public void spawn(int x, int y)
     {
         this.setX(x);
         this.setY(y);
 
-        Image image = View.loadAnImage("sprites/player/player_idle.png", environment.scaleMultiplicatorWidth, environment.scaleMultiplicatorHeight);
-        this.setRect((int) image.getWidth(), (int) image.getHeight());
-        image.cancel();
+        Image img = View.loadAnImage("sprites/player/player_idle.png", environment.scaleMultiplicatorWidth, environment.scaleMultiplicatorHeight);
+        if (!Objects.isNull(img)) {
+            this.setRect((int) img.getWidth(), (int) img.getHeight());
+            img.cancel();
+        } else this.setRect(10, 10);
 
         this.getGravity().setXInit(x);
         this.getGravity().setYInit(y);
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
index 49886e1..e3be515 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
@@ -63,13 +63,17 @@ public void put(StowableObjectType item)
             if (nbStacksInventory == 0) {
                 Stack stack = new Stack();
                 stack.nbItemsProperty().addListener((observable, oldValue, newValue) -> {
+                    if (newValue.intValue() < oldValue.intValue()) {
+                        Inventory inventory = player.getInventory();
+                        inventory.get().get(inventory.getPosCursor()).remove();
+                    }
+
                     if (newValue.intValue() <= 0) {
                         this.value.remove(stack);
                         this.player.setStackSelected(null);
                     }
                 });
                 stack.setItem(item);
-                stack.add();
                 this.value.add(stack);
                 this.player.setStackSelected(stack);
             } else {
@@ -93,7 +97,6 @@ public void put(StowableObjectType item)
                     }
                 });
                 stack.setItem(item);
-                stack.add();
                 this.value.add(stack);
                 this.player.setStackSelected(stack);
             }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
index 4dac440..f597d22 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
@@ -33,7 +33,7 @@ public Stack()
     {
         super();
 
-        this.nbItems = new SimpleIntegerProperty(0);
+        this.nbItems = new SimpleIntegerProperty(1);
     }
 
     public boolean isSameItem(StowableObjectType object)
diff --git a/src/main/java/fr/sae/terraria/vue/View.java b/src/main/java/fr/sae/terraria/vue/View.java
index 640fe79..9294968 100644
--- a/src/main/java/fr/sae/terraria/vue/View.java
+++ b/src/main/java/fr/sae/terraria/vue/View.java
@@ -76,13 +76,16 @@ private static Image foundImage(final String path)
     public static Image loadAnImage(final String path, double scaleMultiplicatorWidth, double scaleMultiplicatorHeight)
     {
         Image img = View.foundImage(path);
-        double width = img.getWidth();
-        double height = img.getHeight();
-        img.cancel();
-
-        double widthScaled = width*scaleMultiplicatorWidth;
-        double heightScaled = height*scaleMultiplicatorHeight;
-        return new Image(img.getUrl(), widthScaled, heightScaled, false, false, false);
+        if (!Objects.isNull(img)) {
+            double width = img.getWidth();
+            double height = img.getHeight();
+            img.cancel();
+
+            double widthScaled = width*scaleMultiplicatorWidth;
+            double heightScaled = height*scaleMultiplicatorHeight;
+            return new Image(img.getUrl(), widthScaled, heightScaled, false, false, false);
+        }
+        return null;
     }
 
     public static ImageView createImageView(final Entity entity, final Image img)
diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java
index 0b865f5..fefed6a 100644
--- a/src/main/java/module-info.java
+++ b/src/main/java/module-info.java
@@ -4,10 +4,6 @@
     requires com.google.gson;
     requires java.desktop;
 
-
-    opens fr.sae.terraria to javafx.fxml;
-    exports fr.sae.terraria;
-    exports fr.sae.terraria.controller;
     opens fr.sae.terraria.controller to javafx.fxml;
     exports fr.sae.terraria.modele;
     opens fr.sae.terraria.modele to javafx.fxml;
diff --git a/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java b/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
new file mode 100644
index 0000000..a6b52d6
--- /dev/null
+++ b/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
@@ -0,0 +1,46 @@
+package fr.sae.terraria.modele.entities.player;
+
+import fr.sae.terraria.modele.Environment;
+import fr.sae.terraria.modele.entities.items.Coal;
+import fr.sae.terraria.modele.entities.items.Meat;
+import fr.sae.terraria.modele.entities.items.Vodka;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.BeforeAll;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+
+public class PlayerTest
+{
+    private static Environment environment;
+
+
+    public PlayerTest() { super(); }
+
+    @BeforeAll public static void init()
+    {
+        environment = new Environment(1., 1.);
+    }
+
+    @Test public final void moveTest()
+    {
+        double previousPosX;
+
+        Player player = environment.getPlayer();
+        previousPosX = player.getX();
+        player.moveRight();
+        player.move();
+
+        assertEquals(previousPosX + player.getVelocity(), player.getX(),
+                "Test: déplacement vers la droite.");
+        player.idleOnX();
+
+
+        previousPosX = player.getX();
+        player.moveLeft();
+        player.move();
+
+        assertEquals(previousPosX - player.getVelocity(), player.getX(),
+                "Test: déplacement vers la gauche");
+    }
+}

From e2e7582898dc91214050ceae283d0385111f3e2c Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Sun, 12 Jun 2022 12:57:50 +0200
Subject: [PATCH 27/97] Player.java Hit tested

---
 .../modele/entities/player/PlayerTest.java       | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java b/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
index a6b52d6..dc74d41 100644
--- a/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
+++ b/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
@@ -43,4 +43,20 @@ public class PlayerTest
         assertEquals(previousPosX - player.getVelocity(), player.getX(),
                 "Test: déplacement vers la gauche");
     }
+
+
+    @Test public final void collideTest()
+    {
+
+    }
+
+    @Test public final void hitTest()
+    {
+        Player player = environment.getPlayer();
+        double previousPv = player.getPv();
+        player.hit();
+
+        assertEquals(previousPv - 1, player.getPv(),
+                "Vérifie s'il y a bien subit un dégât");
+    }
 }

From 5c849396715b4261a3dd5ab78f6acb1e094d8daa Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Sun, 12 Jun 2022 12:58:38 +0200
Subject: [PATCH 28/97] Player.java Spawn tested

---
 .../modele/entities/player/PlayerTest.java     | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java b/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
index dc74d41..6c6e4bf 100644
--- a/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
+++ b/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
@@ -59,4 +59,22 @@ public class PlayerTest
         assertEquals(previousPv - 1, player.getPv(),
                 "Vérifie s'il y a bien subit un dégât");
     }
+
+    @Test public final void spawnTest()
+    {
+        Player player = environment.getPlayer();
+        int spawnLocX = 100;
+        int spawnLocY = 100;
+
+        player.spawn(spawnLocX, spawnLocY);
+
+        assertEquals(player.getX(), spawnLocX,
+                "Regarde si la localisation en X est correcte");
+        assertEquals(player.getY(), spawnLocY,
+                "Regarde si la localisation en X est correcte");
+        assertEquals(player.getGravity().xInit, spawnLocX,
+                "Regarde si la localisation au niveau de la gestion de la gravité, en X est correcte");
+        assertEquals(player.getGravity().yInit, spawnLocY,
+                "Regarde si la localisation au niveau de la gestion de la gravité, en X est correcte");
+    }
 }

From 84f7ff5cd9c66c5d4c58562a4b4e91cccb2c8336 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Sun, 12 Jun 2022 12:59:08 +0200
Subject: [PATCH 29/97] Player.java Drunk tested

---
 .../modele/entities/player/PlayerTest.java    | 25 +++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java b/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
index 6c6e4bf..1e2ab26 100644
--- a/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
+++ b/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
@@ -77,4 +77,29 @@ public class PlayerTest
         assertEquals(player.getGravity().yInit, spawnLocY,
                 "Regarde si la localisation au niveau de la gestion de la gravité, en X est correcte");
     }
+
+    @Test public final void worldLimitTest()
+    {
+
+    }
+
+    @Test public final void interactWithBlockTest()
+    {
+
+    }
+
+    @Test public final void placeBlockTest()
+    {
+
+    }
+
+    @Test public final void drunkTest()
+    {
+        Player player = environment.getPlayer();
+        player.pickup(new Vodka(environment));
+
+        assertFalse(player.drunkProperty().get());
+        ((Vodka) player.getStackSelected().getItem()).consumes();
+        assertTrue(player.drunkProperty().get());
+    }
 }

From c2d078d5d7a82a42ff17b93d3679189f7747ec9b Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Sun, 12 Jun 2022 12:59:33 +0200
Subject: [PATCH 30/97] Player.java Pickup tested

---
 .../modele/entities/player/PlayerTest.java    | 29 +++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java b/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
index 1e2ab26..8c0085e 100644
--- a/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
+++ b/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
@@ -102,4 +102,33 @@ public class PlayerTest
         ((Vodka) player.getStackSelected().getItem()).consumes();
         assertTrue(player.drunkProperty().get());
     }
+
+    @Test public final void pickupTest()
+    {
+        Player player = environment.getPlayer();
+        player.getInventory().posCursorProperty().set(0);
+
+
+        // Test avec de la viande
+        player.pickup(new Meat(environment));
+        assertTrue(player.getStackSelected().getItem() instanceof Meat,
+                "Verifie si le stack est bien de la viande");
+        assertEquals(player.getStackSelected().getNbItems(), 1,
+                "Verifie s'il y a bien 1 objet dans le stack");
+        ((Meat) player.getStackSelected().getItem()).consumes();
+        player.getStackSelected().remove();
+
+        assertNull(player.getStackSelected());
+
+
+        // Test avec du charbon
+        player.pickup(new Coal());
+        assertTrue(player.getStackSelected().getItem() instanceof Coal,
+                "Verifie si le stack est bien du charbon");
+        assertEquals(player.getStackSelected().getNbItems(), 1,
+                "Verifie s'il y a bien 1 objet dans le stack");
+        player.getStackSelected().remove();
+
+        assertNull(player.getStackSelected());
+    }
 }

From c91640dba11cbd97a6b9d82b45afe8d3ef6c3973 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Sun, 12 Jun 2022 13:08:09 +0200
Subject: [PATCH 31/97] Player.java placeBlock tested

---
 .../modele/entities/player/PlayerTest.java       | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java b/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
index 8c0085e..3d63765 100644
--- a/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
+++ b/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
@@ -1,6 +1,8 @@
 package fr.sae.terraria.modele.entities.player;
 
 import fr.sae.terraria.modele.Environment;
+import fr.sae.terraria.modele.TileMaps;
+import fr.sae.terraria.modele.entities.blocks.Dirt;
 import fr.sae.terraria.modele.entities.items.Coal;
 import fr.sae.terraria.modele.entities.items.Meat;
 import fr.sae.terraria.modele.entities.items.Vodka;
@@ -90,7 +92,15 @@ public class PlayerTest
 
     @Test public final void placeBlockTest()
     {
+        Player player = environment.getPlayer();
+        TileMaps tileMaps = environment.getTileMaps();
+        player.pickup(new Dirt(environment, 1, 1));
+
+        assertEquals(tileMaps.getTile(0, 0), TileMaps.SKY);
+        player.placeBlock(0, 0);
+        assertEquals(tileMaps.getTile(0, 0), TileMaps.DIRT);
 
+        assertNull(player.getStackSelected());
     }
 
     @Test public final void drunkTest()
@@ -98,9 +108,11 @@ public class PlayerTest
         Player player = environment.getPlayer();
         player.pickup(new Vodka(environment));
 
-        assertFalse(player.drunkProperty().get());
+        assertFalse(player.drunkProperty().get(),
+                "Vérifie si il n'est pas bourré");
         ((Vodka) player.getStackSelected().getItem()).consumes();
-        assertTrue(player.drunkProperty().get());
+        assertTrue(player.drunkProperty().get(),
+                "Verife si il est bourré");
     }
 
     @Test public final void pickupTest()

From 71cf4f6f0b73561f11b1312ca83581545d20cebe Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Sun, 12 Jun 2022 13:19:32 +0200
Subject: [PATCH 32/97] Player.java interactWithBlock tested

---
 .../modele/entities/player/PlayerTest.java    | 28 ++++++++++++++++++-
 1 file changed, 27 insertions(+), 1 deletion(-)

diff --git a/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java b/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
index 3d63765..5333138 100644
--- a/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
+++ b/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
@@ -2,13 +2,17 @@
 
 import fr.sae.terraria.modele.Environment;
 import fr.sae.terraria.modele.TileMaps;
+import fr.sae.terraria.modele.entities.Rabbit;
 import fr.sae.terraria.modele.entities.blocks.Dirt;
 import fr.sae.terraria.modele.entities.items.Coal;
 import fr.sae.terraria.modele.entities.items.Meat;
 import fr.sae.terraria.modele.entities.items.Vodka;
+import javafx.geometry.Rectangle2D;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.BeforeAll;
 
+import java.awt.*;
+
 import static org.junit.jupiter.api.Assertions.*;
 
 
@@ -85,9 +89,31 @@ public class PlayerTest
 
     }
 
-    @Test public final void interactWithBlockTest()
+    @Test public final void interactWithBlockTest()     // TODO: Le nom est probablement mal choisie
     {
+        Rectangle2D blockSelected;
+        double beforePv;
+        Player player = environment.getPlayer();
+
+        Dirt dirt = new Dirt(environment, 1, 1);
+        dirt.setRect(1, 1);
+        environment.getEntities().add(dirt);
+        blockSelected = new Rectangle2D(1, 1, 1, 1);
+
+        beforePv = dirt.getPv();
+        player.interactWithBlock(blockSelected);
+        assertEquals(beforePv - 1, dirt.getPv());
+        environment.getEntities().remove(dirt);
+
+
+        Rabbit rabbit = new Rabbit(environment, 10, 10);
+        rabbit.setRect(1, 1);
+        environment.getEntities().add(rabbit);
+        blockSelected = new Rectangle2D(10, 10, 1, 1);
 
+        beforePv = rabbit.getPv();
+        player.interactWithBlock(blockSelected);
+        assertEquals(beforePv - 1, rabbit.getPv());
     }
 
     @Test public final void placeBlockTest()

From ad8f87a0649ef934eff9c2bce7c86a542c222e1e Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Sun, 12 Jun 2022 13:28:02 +0200
Subject: [PATCH 33/97] Player.java worldLimit Tested

---
 .../modele/entities/player/PlayerTest.java    | 27 +++++++++++++------
 1 file changed, 19 insertions(+), 8 deletions(-)

diff --git a/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java b/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
index 5333138..7a80abc 100644
--- a/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
+++ b/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
@@ -19,6 +19,7 @@
 public class PlayerTest
 {
     private static Environment environment;
+    private static Player player;
 
 
     public PlayerTest() { super(); }
@@ -26,13 +27,13 @@ public class PlayerTest
     @BeforeAll public static void init()
     {
         environment = new Environment(1., 1.);
+        player = environment.getPlayer();
     }
 
     @Test public final void moveTest()
     {
         double previousPosX;
 
-        Player player = environment.getPlayer();
         previousPosX = player.getX();
         player.moveRight();
         player.move();
@@ -58,7 +59,6 @@ public class PlayerTest
 
     @Test public final void hitTest()
     {
-        Player player = environment.getPlayer();
         double previousPv = player.getPv();
         player.hit();
 
@@ -68,7 +68,6 @@ public class PlayerTest
 
     @Test public final void spawnTest()
     {
-        Player player = environment.getPlayer();
         int spawnLocX = 100;
         int spawnLocY = 100;
 
@@ -86,14 +85,29 @@ public class PlayerTest
 
     @Test public final void worldLimitTest()
     {
+        player.setX(2*TileMaps.TILE_DEFAULT_SIZE);
+        player.moveLeft();
+        player.worldLimit();
+
+        assertTrue(player.isMovingLeft());
+
+        player.setX(-TileMaps.TILE_DEFAULT_SIZE);
+        player.moveLeft();
+        player.worldLimit();
+
+        assertTrue(player.isIDLEonX());
+
+        player.setX(environment.getTileMaps().getWidth()*TileMaps.TILE_DEFAULT_SIZE + TileMaps.TILE_DEFAULT_SIZE);
+        player.moveRight();
+        player.worldLimit();
 
+        assertTrue(player.isIDLEonX());
     }
 
-    @Test public final void interactWithBlockTest()     // TODO: Le nom est probablement mal choisie
+    @Test public final void interactWithBlockTest()     // TODO: Le nom est probablement mal choisie dans player
     {
         Rectangle2D blockSelected;
         double beforePv;
-        Player player = environment.getPlayer();
 
         Dirt dirt = new Dirt(environment, 1, 1);
         dirt.setRect(1, 1);
@@ -118,7 +132,6 @@ public class PlayerTest
 
     @Test public final void placeBlockTest()
     {
-        Player player = environment.getPlayer();
         TileMaps tileMaps = environment.getTileMaps();
         player.pickup(new Dirt(environment, 1, 1));
 
@@ -131,7 +144,6 @@ public class PlayerTest
 
     @Test public final void drunkTest()
     {
-        Player player = environment.getPlayer();
         player.pickup(new Vodka(environment));
 
         assertFalse(player.drunkProperty().get(),
@@ -143,7 +155,6 @@ public class PlayerTest
 
     @Test public final void pickupTest()
     {
-        Player player = environment.getPlayer();
         player.getInventory().posCursorProperty().set(0);
 
 

From 11788df7fc211179fbab9f7a6c0c3348daff1992 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Sun, 12 Jun 2022 13:38:47 +0200
Subject: [PATCH 34/97] Tentative test collision

---
 .../modele/entities/player/PlayerTest.java    | 29 +++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java b/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
index 7a80abc..fefc3a1 100644
--- a/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
+++ b/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
@@ -54,7 +54,36 @@ public class PlayerTest
 
     @Test public final void collideTest()
     {
+        /*
+        // Le TOP et le BOTTOM est un pet complex à tester dans un JUnit
+        Dirt dirtLeft = new Dirt(environment, 1, 1);
+        dirtLeft.setRect(1, 1);
+        environment.getEntities().add(dirtLeft);
+        Dirt dirtRight = new Dirt(environment, 5, 1);
+        dirtRight.setRect(1, 1);
+        environment.getEntities().add(dirtRight);
+        player.setRect(1, 1);
+        player.setVelocity(0);
+        player.setY(1);
+
+        player.setX(3);
+        player.moveLeft();
+        player.collide();
+
+        assertTrue(player.isMovingLeft());
+
+        player.setX(1);
+        player.moveLeft();
+        player.collide();
 
+        assertTrue(player.isIDLEonX());
+
+        player.setX(5);
+        player.moveRight();
+        player.collide();
+
+        assertTrue(player.isIDLEonX());
+         */
     }
 
     @Test public final void hitTest()

From 4d6c1a8d0c66036bddcadf16de3154d5322bf2db Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Sun, 12 Jun 2022 14:11:35 +0200
Subject: [PATCH 35/97] Clean

---
 .../sae/terraria/modele/entities/items/Meat.java   |  1 -
 .../entities/player/inventory/Inventory.java       |  2 +-
 src/main/resources/fr/sae/terraria/vue/game.fxml   |  3 +--
 src/main/resources/fr/sae/terraria/vue/menu.fxml   | 14 ++++----------
 4 files changed, 6 insertions(+), 14 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/modele/entities/items/Meat.java b/src/main/java/fr/sae/terraria/modele/entities/items/Meat.java
index 2a748ea..dfafc11 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/items/Meat.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/items/Meat.java
@@ -3,7 +3,6 @@
 import fr.sae.terraria.modele.Environment;
 import fr.sae.terraria.modele.entities.entity.ConsumableObjectType;
 import fr.sae.terraria.modele.entities.player.Player;
-import fr.sae.terraria.modele.entities.player.inventory.Inventory;
 
 
 public class Meat extends Item implements ConsumableObjectType
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
index e3be515..00f47cf 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
@@ -49,7 +49,7 @@ public Inventory(final Player player)
         });
     }
 
-    private int nbStacksIntoInventory() { return this.value.size(); }
+    public int nbStacksIntoInventory() { return this.value.size(); }
 
     /**
      * Place des objets de type rangeable dans l'inventaire.
diff --git a/src/main/resources/fr/sae/terraria/vue/game.fxml b/src/main/resources/fr/sae/terraria/vue/game.fxml
index 7c4c3df..41b20eb 100644
--- a/src/main/resources/fr/sae/terraria/vue/game.fxml
+++ b/src/main/resources/fr/sae/terraria/vue/game.fxml
@@ -1,10 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
+
 <?import javafx.scene.layout.*?>
 <?import javafx.scene.text.Text?>
 <?import java.net.URL?>
-
-
 <BorderPane fx:id="root"
             maxHeight="-Infinity" maxWidth="-Infinity"
             minHeight="-Infinity" minWidth="-Infinity"
diff --git a/src/main/resources/fr/sae/terraria/vue/menu.fxml b/src/main/resources/fr/sae/terraria/vue/menu.fxml
index 0ed6d7f..44444d0 100644
--- a/src/main/resources/fr/sae/terraria/vue/menu.fxml
+++ b/src/main/resources/fr/sae/terraria/vue/menu.fxml
@@ -1,16 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
-<?import javafx.scene.control.ScrollPane?>
-<?import javafx.scene.control.Separator?>
-<?import javafx.scene.control.SplitPane?>
-<?import javafx.scene.layout.BorderPane?>
-<?import javafx.scene.layout.HBox?>
-<?import javafx.scene.layout.Pane?>
-<?import javafx.scene.text.Font?>
-<?import javafx.scene.text.Text?>
-<?import java.net.URL?>
-
 
+<?import javafx.scene.control.*?>
+<?import javafx.scene.layout.*?>
+<?import javafx.scene.text.*?>
+<?import java.net.URL?>
 <BorderPane fx:id="root"
             maxHeight="-Infinity" maxWidth="-Infinity"
             minHeight="-Infinity" minWidth="-Infinity"

From 365bb46ea9ed1ad9dfed159fb32ff218c4aab3d6 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Sun, 12 Jun 2022 14:12:51 +0200
Subject: [PATCH 36/97] Inventory.java nbStacksIntoInventory tested

---
 .../modele/entities/player/PlayerTest.java    |  4 +--
 .../player/inventory/InventoryTest.java       | 35 +++++++++++++++++++
 2 files changed, 36 insertions(+), 3 deletions(-)
 create mode 100644 src/test/java/fr/sae/terraria/modele/entities/player/inventory/InventoryTest.java

diff --git a/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java b/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
index fefc3a1..7b0c190 100644
--- a/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
+++ b/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
@@ -8,10 +8,8 @@
 import fr.sae.terraria.modele.entities.items.Meat;
 import fr.sae.terraria.modele.entities.items.Vodka;
 import javafx.geometry.Rectangle2D;
-import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.BeforeAll;
-
-import java.awt.*;
+import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.*;
 
diff --git a/src/test/java/fr/sae/terraria/modele/entities/player/inventory/InventoryTest.java b/src/test/java/fr/sae/terraria/modele/entities/player/inventory/InventoryTest.java
new file mode 100644
index 0000000..a09fcf4
--- /dev/null
+++ b/src/test/java/fr/sae/terraria/modele/entities/player/inventory/InventoryTest.java
@@ -0,0 +1,35 @@
+package fr.sae.terraria.modele.entities.player.inventory;
+
+import fr.sae.terraria.modele.Environment;
+import fr.sae.terraria.modele.entities.blocks.Dirt;
+import fr.sae.terraria.modele.entities.player.Player;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+
+public class InventoryTest
+{
+    private static Environment environment;
+    private static Player player;
+    private static Inventory inventory;
+
+
+    @BeforeAll public static void init()
+    {
+        environment = new Environment(1., 1.);
+        player = environment.getPlayer();
+        inventory = player.getInventory();
+    }
+
+    @Test public final void nbStacksIntoInventoryTest()
+    {
+        for (int i = 0; i < 16; i++)
+            inventory.put(new Dirt(environment, 1, 1));
+        assertEquals(inventory.nbStacksIntoInventory(), 1);
+
+        inventory.put(new Dirt(environment, 1, 1));
+        assertEquals(inventory.nbStacksIntoInventory(), 2);
+    }
+}

From 6ed872257b3561d80a235686b0a41fe5161ccb6a Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Sun, 12 Jun 2022 14:32:40 +0200
Subject: [PATCH 37/97] Inventory.java Stack.nbItems tested

---
 .../entities/player/inventory/Inventory.java  |  6 ++++++
 .../player/inventory/InventoryTest.java       | 20 +++++++++++++------
 2 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
index 00f47cf..9abe93c 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
@@ -91,6 +91,11 @@ public void put(StowableObjectType item)
                 // Si tous les stacks present sont pleins ou aucune ne correspond à l'objet qui à étais pris, il crée un nouveau stack
                 Stack stack = new Stack();
                 stack.nbItemsProperty().addListener((observable, oldValue, newValue) -> {
+                    if (newValue.intValue() < oldValue.intValue()) {
+                        Inventory inventory = player.getInventory();
+                        inventory.get().get(inventory.getPosCursor()).remove();
+                    }
+
                     if (newValue.intValue() <= 0) {
                         this.value.remove(stack);
                         this.player.setStackSelected(null);
@@ -149,6 +154,7 @@ else if (key.equals(KeyCode.DIGIT9))
     public IntegerProperty posCursorProperty() { return this.posCursor; }
 
 
+    public Stack getStack() { return this.value.get(this.getPosCursor()); }
     public int getPosCursor() { return this.posCursor.get(); }
     public ObservableList<Stack> get() { return this.value; }
     public Map<KeyCode, Boolean> getKeysInput() { return this.keysInput; }
diff --git a/src/test/java/fr/sae/terraria/modele/entities/player/inventory/InventoryTest.java b/src/test/java/fr/sae/terraria/modele/entities/player/inventory/InventoryTest.java
index a09fcf4..d2ecfb9 100644
--- a/src/test/java/fr/sae/terraria/modele/entities/player/inventory/InventoryTest.java
+++ b/src/test/java/fr/sae/terraria/modele/entities/player/inventory/InventoryTest.java
@@ -12,24 +12,32 @@
 public class InventoryTest
 {
     private static Environment environment;
-    private static Player player;
     private static Inventory inventory;
 
 
     @BeforeAll public static void init()
     {
         environment = new Environment(1., 1.);
-        player = environment.getPlayer();
+        Player player = environment.getPlayer();
         inventory = player.getInventory();
     }
 
     @Test public final void nbStacksIntoInventoryTest()
     {
-        for (int i = 0; i < 16; i++)
+        for (int i = 0; i < Stack.MAX; i++)
             inventory.put(new Dirt(environment, 1, 1));
-        assertEquals(inventory.nbStacksIntoInventory(), 1);
+        assertEquals(2, inventory.nbStacksIntoInventory());
 
-        inventory.put(new Dirt(environment, 1, 1));
-        assertEquals(inventory.nbStacksIntoInventory(), 2);
+        for (int i = 0; i < Stack.MAX; i++)
+            inventory.put(new Dirt(environment, 1, 1));
+        assertEquals(3, inventory.nbStacksIntoInventory());
+    }
+
+    @Test public final void nbItemsIntoStackTest()
+    {
+        inventory.posCursorProperty().set(0);
+        for (int i = 0; i < Stack.MAX; i++)
+            inventory.put(new Dirt(environment, 1, 1));
+        assertEquals(Stack.MAX, inventory.getStack().getNbItems());
     }
 }

From 5c05bdc3425846b998229e87e67547c53c43dce9 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Sun, 12 Jun 2022 14:41:27 +0200
Subject: [PATCH 38/97] Duplication de code enlever dans Inventory.java

---
 .../entities/player/inventory/Inventory.java  | 52 ++++++++-----------
 1 file changed, 21 insertions(+), 31 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
index 9abe93c..476dc74 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
@@ -49,6 +49,25 @@ public Inventory(final Player player)
         });
     }
 
+    private void createStack(StowableObjectType item)
+    {
+        Stack stack = new Stack();
+        stack.nbItemsProperty().addListener((observable, oldValue, newValue) -> {
+            if (newValue.intValue() < oldValue.intValue()) {
+                Inventory inventory = player.getInventory();
+                inventory.get().get(inventory.getPosCursor()).remove();
+            }
+
+            if (newValue.intValue() <= 0) {
+                this.value.remove(stack);
+                this.player.setStackSelected(null);
+            }
+        });
+        stack.setItem(item);
+        this.value.add(stack);
+        this.player.setStackSelected(stack);
+    }
+
     public int nbStacksIntoInventory() { return this.value.size(); }
 
     /**
@@ -61,21 +80,7 @@ public void put(StowableObjectType item)
 
         if (nbStacksInventory < NB_BOXES_MAX) {
             if (nbStacksInventory == 0) {
-                Stack stack = new Stack();
-                stack.nbItemsProperty().addListener((observable, oldValue, newValue) -> {
-                    if (newValue.intValue() < oldValue.intValue()) {
-                        Inventory inventory = player.getInventory();
-                        inventory.get().get(inventory.getPosCursor()).remove();
-                    }
-
-                    if (newValue.intValue() <= 0) {
-                        this.value.remove(stack);
-                        this.player.setStackSelected(null);
-                    }
-                });
-                stack.setItem(item);
-                this.value.add(stack);
-                this.player.setStackSelected(stack);
+                this.createStack(item);
             } else {
                 for (Stack stack : this.value) {
                     int beforeSize = stack.getNbItems();
@@ -87,23 +92,8 @@ public void put(StowableObjectType item)
                     if (beforeSize != afterSize)
                         return;
                 }
-
                 // Si tous les stacks present sont pleins ou aucune ne correspond à l'objet qui à étais pris, il crée un nouveau stack
-                Stack stack = new Stack();
-                stack.nbItemsProperty().addListener((observable, oldValue, newValue) -> {
-                    if (newValue.intValue() < oldValue.intValue()) {
-                        Inventory inventory = player.getInventory();
-                        inventory.get().get(inventory.getPosCursor()).remove();
-                    }
-
-                    if (newValue.intValue() <= 0) {
-                        this.value.remove(stack);
-                        this.player.setStackSelected(null);
-                    }
-                });
-                stack.setItem(item);
-                this.value.add(stack);
-                this.player.setStackSelected(stack);
+                this.createStack(item);
             }
         }
     }

From b36d92d020fd25a6941254b18c75bdad0622eac1 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Sun, 12 Jun 2022 15:03:06 +0200
Subject: [PATCH 39/97] fix import fxml failed

---
 src/main/java/module-info.java                   |  6 +++++-
 src/main/resources/fr/sae/terraria/vue/menu.fxml | 14 ++++++++++----
 2 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java
index fefed6a..e7b3690 100644
--- a/src/main/java/module-info.java
+++ b/src/main/java/module-info.java
@@ -1,9 +1,13 @@
-module fr.sae.terraria {
+module fr.sae.terraria
+{
+    requires javafx.graphics;
     requires javafx.controls;
     requires javafx.fxml;
     requires com.google.gson;
     requires java.desktop;
 
+    opens fr.sae.terraria to javafx.graphics;
+    exports fr.sae.terraria;
     opens fr.sae.terraria.controller to javafx.fxml;
     exports fr.sae.terraria.modele;
     opens fr.sae.terraria.modele to javafx.fxml;
diff --git a/src/main/resources/fr/sae/terraria/vue/menu.fxml b/src/main/resources/fr/sae/terraria/vue/menu.fxml
index 44444d0..0ed6d7f 100644
--- a/src/main/resources/fr/sae/terraria/vue/menu.fxml
+++ b/src/main/resources/fr/sae/terraria/vue/menu.fxml
@@ -1,10 +1,16 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
-
-<?import javafx.scene.control.*?>
-<?import javafx.scene.layout.*?>
-<?import javafx.scene.text.*?>
+<?import javafx.scene.control.ScrollPane?>
+<?import javafx.scene.control.Separator?>
+<?import javafx.scene.control.SplitPane?>
+<?import javafx.scene.layout.BorderPane?>
+<?import javafx.scene.layout.HBox?>
+<?import javafx.scene.layout.Pane?>
+<?import javafx.scene.text.Font?>
+<?import javafx.scene.text.Text?>
 <?import java.net.URL?>
+
+
 <BorderPane fx:id="root"
             maxHeight="-Infinity" maxWidth="-Infinity"
             minHeight="-Infinity" minWidth="-Infinity"

From dbf88f544e24d1df14907ff606034b866799ddf2 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Sun, 12 Jun 2022 15:06:45 +0200
Subject: [PATCH 40/97] Fix transparence sword.png

---
 .../resources/fr/sae/terraria/tools/sword.png  | Bin 349 -> 5190 bytes
 1 file changed, 0 insertions(+), 0 deletions(-)

diff --git a/src/main/resources/fr/sae/terraria/tools/sword.png b/src/main/resources/fr/sae/terraria/tools/sword.png
index 599eeeaf239dc7bcd5133479068b2777bc934fe7..1b1bcaf40f5a9d8bb8364f9a7a3e0aeaca5a6855 100644
GIT binary patch
literal 5190
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
K{9?~_oBs<wj@_aF

delta 323
zcmV-J0lfakDBS{(BYyw^b5ch_0Itp)=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi
z!~g&e!~vBn4jTXf0P;yhK~y+TWBd;U3?zc2q+%$Gfq@B16AeI`<Klc7baYg}e3A@+
zX+C%EI*=U*F$ClVVnAYI(f|GX_y6zho%a9z`{!U91c)*Kmw#puAZP$S%^-l+079BU
z0H*=OXa)hW0fEs8|5dg0zycsZtY#1Z8vxR5Vq*`cNzn`f@RX>gt<RuiXatUL8zVDt
zJkOiAo}s8H6D)=cpd@9GA^bvu46^cy3<7LIKm&TAGPnUeCBj_r@!fkc|H#QbV44tM
z1o<1p0BOE*{yZGRt*aN|E&&+^;^PBg7l0JQG=l($25E+c2|fUK0SFMX4HGah003K)
V&T8shK%)Qv002ovPDHLkV1imQdszSg


From 0e7935ccd568b29c1029379f7e0af97e35a12b2d Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Sun, 12 Jun 2022 15:15:08 +0200
Subject: [PATCH 41/97] Fix animation qui clignote

---
 .../terraria/modele/entities/entity/Animation.java    |  1 +
 .../java/fr/sae/terraria/vue/entities/EntityView.java |  6 +++++-
 src/main/resources/fr/sae/terraria/vue/menu.fxml      | 11 +++--------
 3 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/modele/entities/entity/Animation.java b/src/main/java/fr/sae/terraria/modele/entities/entity/Animation.java
index 3b31bad..11364ec 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/entity/Animation.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/entity/Animation.java
@@ -40,6 +40,7 @@ public void loop()
 
 
     public double getFrame() { return this.frame.get(); }
+    public double getEndFrame() { return this.endFrame; }
     public DoubleProperty getFrameProperty() { return this.frame; }
 
     /** Spécifie à quelle frame l'animation sur le Sprite Sheet doit s'arrêter */
diff --git a/src/main/java/fr/sae/terraria/vue/entities/EntityView.java b/src/main/java/fr/sae/terraria/vue/entities/EntityView.java
index 61578f5..9a49898 100644
--- a/src/main/java/fr/sae/terraria/vue/entities/EntityView.java
+++ b/src/main/java/fr/sae/terraria/vue/entities/EntityView.java
@@ -51,7 +51,11 @@ private void startAnimation()
             this.entity.getAnimation().setEndFrame(newEndFrame);
         });
 
-        this.entity.getAnimation().getFrameProperty().addListener((obs, oldFrame, newFrame) -> this.animation(newFrame.intValue()));
+        this.entity.getAnimation().getFrameProperty().addListener((obs, oldFrame, newFrame) -> {
+            if(newFrame.intValue() >= this.entity.getAnimation().getEndFrame())
+                this.animation(oldFrame.intValue());
+            else this.animation(newFrame.intValue());
+        });
     }
 
     /** Affiche l'entité à l'écran et démarre l'animation */
diff --git a/src/main/resources/fr/sae/terraria/vue/menu.fxml b/src/main/resources/fr/sae/terraria/vue/menu.fxml
index 0ed6d7f..04ff0b3 100644
--- a/src/main/resources/fr/sae/terraria/vue/menu.fxml
+++ b/src/main/resources/fr/sae/terraria/vue/menu.fxml
@@ -1,13 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
-<?import javafx.scene.control.ScrollPane?>
-<?import javafx.scene.control.Separator?>
-<?import javafx.scene.control.SplitPane?>
-<?import javafx.scene.layout.BorderPane?>
-<?import javafx.scene.layout.HBox?>
-<?import javafx.scene.layout.Pane?>
-<?import javafx.scene.text.Font?>
-<?import javafx.scene.text.Text?>
+<?import javafx.scene.control.*?>
+<?import javafx.scene.layout.*?>
+<?import javafx.scene.text.*?>
 <?import java.net.URL?>
 
 

From f9cfef897078a867527135cb9f28841a61171a9f Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Sun, 12 Jun 2022 16:10:21 +0200
Subject: [PATCH 42/97] =?UTF-8?q?Craft=20Roche=20cr=C3=A9e?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/main/java/fr/sae/terraria/Terraria.java   |  1 +
 .../terraria/controller/MenuController.java   | 28 ++++++++++++++++++-
 .../entities/blocks/{Stone.java => Rock.java} | 14 ++++++----
 .../entities/entity/BreakableObjectType.java  |  4 ++-
 .../entities/entity/PlaceableObjectType.java  |  6 ++--
 .../items/{Pierre.java => Stone.java}         |  2 +-
 .../entities/player/inventory/Stack.java      |  6 ++--
 .../fr/sae/terraria/vue/TileMapsView.java     | 10 +++----
 .../sae/terraria/vue/hud/InventoryView.java   |  6 ++--
 .../terraria/vue/hud/ItemSelectedView.java    |  6 ++--
 .../resources/fr/sae/terraria/vue/menu.fxml   |  9 ++++++
 11 files changed, 68 insertions(+), 24 deletions(-)
 rename src/main/java/fr/sae/terraria/modele/entities/blocks/{Stone.java => Rock.java} (86%)
 rename src/main/java/fr/sae/terraria/modele/entities/items/{Pierre.java => Stone.java} (56%)

diff --git a/src/main/java/fr/sae/terraria/Terraria.java b/src/main/java/fr/sae/terraria/Terraria.java
index c0599a9..1185b3a 100644
--- a/src/main/java/fr/sae/terraria/Terraria.java
+++ b/src/main/java/fr/sae/terraria/Terraria.java
@@ -88,6 +88,7 @@ public void start(Stage stage) throws IOException
             } else {
                 if (!Objects.isNull(gameController.player)) {
                     menuController.player = gameController.player;
+                    menuController.environment = gameController.environment;
                     menuController.loop.play();
                     gameController.environment.getLoop().stop();
                 }
diff --git a/src/main/java/fr/sae/terraria/controller/MenuController.java b/src/main/java/fr/sae/terraria/controller/MenuController.java
index e8c3855..d33479b 100644
--- a/src/main/java/fr/sae/terraria/controller/MenuController.java
+++ b/src/main/java/fr/sae/terraria/controller/MenuController.java
@@ -1,10 +1,15 @@
 package fr.sae.terraria.controller;
 
 import fr.sae.terraria.Terraria;
+import fr.sae.terraria.modele.Environment;
+import fr.sae.terraria.modele.entities.blocks.Rock;
+import fr.sae.terraria.modele.entities.items.Stone;
 import fr.sae.terraria.modele.entities.player.Player;
+import fr.sae.terraria.modele.entities.player.inventory.Stack;
 import javafx.animation.Animation;
 import javafx.animation.KeyFrame;
 import javafx.animation.Timeline;
+import javafx.event.Event;
 import javafx.fxml.FXML;
 import javafx.fxml.Initializable;
 import javafx.scene.layout.HBox;
@@ -23,9 +28,11 @@ public class MenuController implements Initializable
     @FXML public Pane displayInventory;
     @FXML public Pane displayLexique;
     @FXML public HBox HBoxText;
+    @FXML public HBox lexique4;
 
     public Timeline loop;
     private Stage stage;
+    public Environment environment = null;
     public Player player = null;
     public double scaleMultiplicatorWidth;
     public double scaleMultiplicatorHeight;
@@ -47,11 +54,30 @@ public MenuController(final Stage stage)
 
         KeyFrame keyFrame = new KeyFrame(Duration.seconds(Terraria.TARGET_FPS), (ev -> {
             if (!Objects.isNull(this.player)) {
-                System.out.println(this.player.getInventory());
+                // System.out.println(this.player.getInventory());
             }
         }));
 
         this.loop.getKeyFrames().add(keyFrame);
         this.loop.play();
+
+        // Craft de la roche à partir de 3 pierres
+        this.lexique4.addEventFilter(Event.ANY, ev -> {
+            if (ev.getEventType().getName().equalsIgnoreCase("MOUSE_PRESSED")) {
+                System.out.println("click");
+
+                int i = this.player.getInventory().get().size()-1;
+                while (i > 0 && !(this.player.getInventory().get().get(i).getItem() instanceof Stone) && this.player.getInventory().get().get(i).getNbItems() > 2)
+                    i--;
+
+                Stack stack = this.player.getInventory().get().get(i);
+                System.out.println(stack.getItem());
+                if (stack.getItem() instanceof Stone) {
+                    for (int j = 0; j < 3; j++)
+                        stack.remove();
+                    this.player.pickup(new Rock(this.environment));
+                }
+            }
+        });
     }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/Stone.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/Rock.java
similarity index 86%
rename from src/main/java/fr/sae/terraria/modele/entities/blocks/Stone.java
rename to src/main/java/fr/sae/terraria/modele/entities/blocks/Rock.java
index a991360..336740a 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/Stone.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/Rock.java
@@ -6,6 +6,7 @@
 import fr.sae.terraria.modele.entities.entity.Entity;
 import fr.sae.terraria.modele.entities.entity.PlaceableObjectType;
 import fr.sae.terraria.modele.entities.entity.StowableObjectType;
+import fr.sae.terraria.modele.entities.items.Stone;
 import fr.sae.terraria.modele.entities.player.Player;
 import fr.sae.terraria.modele.entities.player.inventory.Inventory;
 import fr.sae.terraria.modele.entities.player.inventory.Stack;
@@ -15,7 +16,7 @@
 import java.util.Objects;
 
 
-public class Stone extends Block implements StowableObjectType, CollideObjectType, PlaceableObjectType
+public class Rock extends Block implements StowableObjectType, CollideObjectType, PlaceableObjectType
 {
     public static final int BREAK_RESISTANCE = 5;
 
@@ -25,7 +26,7 @@ public class Stone extends Block implements StowableObjectType, CollideObjectTyp
     private final double yOrigin;
 
 
-    public Stone(Environment environment, int x, int y)
+    public Rock(Environment environment, int x, int y)
     {
         super(x, y);
         this.environment = environment;
@@ -33,9 +34,11 @@ public Stone(Environment environment, int x, int y)
         this.xOrigin = x;
         this.yOrigin = y;
 
-        this.pv.set(Stone.BREAK_RESISTANCE);
+        this.pv.set(Rock.BREAK_RESISTANCE);
     }
 
+    public Rock(Environment environment) { this(environment, 0, 0); }
+
     @Override public void updates() { /* TODO document why this method is empty */ }
 
     @Override public void collide() { /* NE RIEN REMPLIR */ }
@@ -48,7 +51,8 @@ public Stone(Environment environment, int x, int y)
         // Une fois le bloc cassé, de la pierre est ramassée et le bloc se supprime du Pane
         Player player = this.environment.getPlayer();
         if (this.getPv() <= 0) {
-            player.pickup(this);
+            for (int i = 0; i < 3; i++)
+                player.pickup(new Stone());
 
             int yIndexTile = (int) (getY()/this.environment.heightTile);
             int xIndexTile = (int) (getX()/this.environment.widthTile);
@@ -73,7 +77,7 @@ public Stone(Environment environment, int x, int y)
         int widthTile = this.environment.widthTile;
         int heightTile = this.environment.heightTile;
 
-        Entity entity = new Stone(this.environment, x*widthTile, y*heightTile);
+        Entity entity = new Rock(this.environment, x*widthTile, y*heightTile);
         entity.setRect(widthTile, heightTile);
 
         Player player = this.environment.getPlayer();
diff --git a/src/main/java/fr/sae/terraria/modele/entities/entity/BreakableObjectType.java b/src/main/java/fr/sae/terraria/modele/entities/entity/BreakableObjectType.java
index 07b891a..e076a99 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/entity/BreakableObjectType.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/entity/BreakableObjectType.java
@@ -1,6 +1,8 @@
 package fr.sae.terraria.modele.entities.entity;
 
 
+import fr.sae.terraria.modele.entities.blocks.Rock;
+
 /**
  * <h1>Breakable Object Type</h1>
  * <h2>Interface utile à un objet qui hérite d'Entity</h2>
@@ -20,7 +22,7 @@ public interface BreakableObjectType
      *
      * @see fr.sae.terraria.modele.entities.blocks.Dirt
      * @see fr.sae.terraria.modele.entities.blocks.TallGrass
-     * @see fr.sae.terraria.modele.entities.blocks.Stone
+     * @see Rock
      */
     void breaks();
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/entity/PlaceableObjectType.java b/src/main/java/fr/sae/terraria/modele/entities/entity/PlaceableObjectType.java
index 3c2669b..2720b5f 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/entity/PlaceableObjectType.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/entity/PlaceableObjectType.java
@@ -1,13 +1,15 @@
 package fr.sae.terraria.modele.entities.entity;
 
 
+import fr.sae.terraria.modele.entities.blocks.Rock;
+
 /**
  * <h1>Placeable Object Type</h1>
  * <h2>Interface utile sur les objets qui héritent de block</h2>
  * <h3><u>Description:</u></h3>
  * <p>Permet de savoir si un block sera posable sur un sol ou non</p>
  *
- * @see fr.sae.terraria.modele.entities.blocks.Stone
+ * @see Rock
  * @author CHRZASZCZ Naulan
  */
 public interface PlaceableObjectType
@@ -19,7 +21,7 @@ public interface PlaceableObjectType
      *
      * @param x Les coordonnées du block en x lorsqu'il va êtres poser au sol
      * @param y Les coordonnées du block en y lorsqu'il va êtres poser au sol
-     * @see fr.sae.terraria.modele.entities.blocks.Stone
+     * @see Rock
      */
     void place(final int x, final int y);
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/items/Pierre.java b/src/main/java/fr/sae/terraria/modele/entities/items/Stone.java
similarity index 56%
rename from src/main/java/fr/sae/terraria/modele/entities/items/Pierre.java
rename to src/main/java/fr/sae/terraria/modele/entities/items/Stone.java
index c481a70..c7eed84 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/items/Pierre.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/items/Stone.java
@@ -1,4 +1,4 @@
 package fr.sae.terraria.modele.entities.items;
 
 
-public class Pierre extends Item { }
+public class Stone extends Item { }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
index f597d22..9a62beb 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
@@ -2,7 +2,7 @@
 
 import fr.sae.terraria.modele.entities.Arrow;
 import fr.sae.terraria.modele.entities.blocks.Dirt;
-import fr.sae.terraria.modele.entities.blocks.Stone;
+import fr.sae.terraria.modele.entities.blocks.Rock;
 import fr.sae.terraria.modele.entities.blocks.TallGrass;
 import fr.sae.terraria.modele.entities.blocks.Torch;
 import fr.sae.terraria.modele.entities.entity.StowableObjectType;
@@ -40,7 +40,7 @@ public boolean isSameItem(StowableObjectType object)
     {
         if (object instanceof Dirt && this.item instanceof Dirt)
             return true;
-        else if (object instanceof Stone && this.item instanceof Stone)
+        else if (object instanceof Rock && this.item instanceof Rock)
             return true;
         else if (object instanceof TallGrass && this.item instanceof TallGrass)
             return true;
@@ -54,7 +54,7 @@ else if (object instanceof Iron && this.item instanceof Iron)
             return true;
         else if (object instanceof Meat && this.item instanceof Meat)
             return true;
-        else if (object instanceof Pierre && this.item instanceof Pierre)
+        else if (object instanceof Stone && this.item instanceof Stone)
             return true;
         else if (object instanceof Silex && this.item instanceof Silex)
             return true;
diff --git a/src/main/java/fr/sae/terraria/vue/TileMapsView.java b/src/main/java/fr/sae/terraria/vue/TileMapsView.java
index b8f94ba..9086a30 100644
--- a/src/main/java/fr/sae/terraria/vue/TileMapsView.java
+++ b/src/main/java/fr/sae/terraria/vue/TileMapsView.java
@@ -124,7 +124,7 @@ else if (((Dirt) block).getTypeOfFloor() == TileMaps.DIRT)
                         blockView.setImage(this.dirtImg);
                     else if (((Dirt) block).getTypeOfFloor() == 0)
                         blockView.setImage(this.floorTopImg);
-                } else if (block instanceof Stone) {
+                } else if (block instanceof Rock) {
                     blockView.setImage(this.stoneImg);
                 } else if (block instanceof TallGrass) {
                     blockView.setImage(this.tallGrassImg);
@@ -287,11 +287,11 @@ public void displayMaps(TileMaps tiles)
             for (int x = 0 ; x < tiles.getWidth() ; x++)
                 switch (tiles.getTile(x, y)) {
                     case TileMaps.STONE:
-                        Stone stoneEntity = new Stone(this.environment, x*this.tileWidth, y*this.tileHeight);
-                        stoneEntity.setRect(this.tileWidth, this.tileHeight);
+                        Rock rockEntity = new Rock(this.environment, x*this.tileWidth, y*this.tileHeight);
+                        rockEntity.setRect(this.tileWidth, this.tileHeight);
 
-                        this.environment.getEntities().add(stoneEntity);
-                        this.environment.getBlocks().add(stoneEntity);
+                        this.environment.getEntities().add(rockEntity);
+                        this.environment.getBlocks().add(rockEntity);
                         break;
                     case TileMaps.DIRT:
                         Dirt dirtSprite = new Dirt(this.environment, x*this.tileWidth, y*this.tileHeight);
diff --git a/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java b/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java
index 8d9e0a5..fc13085 100644
--- a/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java
+++ b/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java
@@ -4,7 +4,7 @@
 import fr.sae.terraria.modele.TileMaps;
 import fr.sae.terraria.modele.entities.Arrow;
 import fr.sae.terraria.modele.entities.blocks.Dirt;
-import fr.sae.terraria.modele.entities.blocks.Stone;
+import fr.sae.terraria.modele.entities.blocks.Rock;
 import fr.sae.terraria.modele.entities.blocks.TallGrass;
 import fr.sae.terraria.modele.entities.blocks.Torch;
 import fr.sae.terraria.modele.entities.entity.StowableObjectType;
@@ -104,7 +104,7 @@ private void displayItemIntoInventoryBar()
 
                     if (item instanceof Dirt)
                         view.setImage(View.loadAnImage("tiles/floor-top.png", itemInventoryWidth, itemInventoryHeight));
-                    else if (item instanceof Stone)
+                    else if (item instanceof Rock)
                         view.setImage(View.loadAnImage("tiles/rock-fill.png", itemInventoryWidth, itemInventoryHeight));
                     else if (item instanceof TallGrass)
                         view.setImage(View.loadAnImage("tiles/tall-grass.png.png", itemInventoryWidth, itemInventoryHeight));
@@ -118,7 +118,7 @@ else if (item instanceof Iron)
                         view.setImage(View.loadAnImage("loots/iron.png", itemInventoryWidth, itemInventoryHeight));
                     else if (item instanceof Meat)
                         view.setImage(View.loadAnImage("loots/meat.png", itemInventoryWidth, itemInventoryHeight));
-                    else if (item instanceof Pierre)
+                    else if (item instanceof Stone)
                         view.setImage(View.loadAnImage("loots/pierre.png", itemInventoryWidth, itemInventoryHeight));
                     else if (item instanceof Silex)
                         view.setImage(View.loadAnImage("loots/silex.png", itemInventoryWidth, itemInventoryHeight));
diff --git a/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java b/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java
index ef689a3..7807ce2 100644
--- a/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java
+++ b/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java
@@ -3,7 +3,7 @@
 import fr.sae.terraria.modele.TileMaps;
 import fr.sae.terraria.modele.entities.Arrow;
 import fr.sae.terraria.modele.entities.blocks.Dirt;
-import fr.sae.terraria.modele.entities.blocks.Stone;
+import fr.sae.terraria.modele.entities.blocks.Rock;
 import fr.sae.terraria.modele.entities.blocks.TallGrass;
 import fr.sae.terraria.modele.entities.blocks.Torch;
 import fr.sae.terraria.modele.entities.entity.StowableObjectType;
@@ -84,7 +84,7 @@ public ItemSelectedView(Pane display, Player player, double scaleMultiplicatorWi
 
                 if (item instanceof Dirt)
                     this.itemSelectedImgView.setImage(this.dirtItemImg);
-                else if (item instanceof Stone)
+                else if (item instanceof Rock)
                     this.itemSelectedImgView.setImage(this.stoneItemImg);
                 else if (item instanceof TallGrass)
                     this.itemSelectedImgView.setImage(null);
@@ -100,7 +100,7 @@ else if (item instanceof Meat)
                     this.itemSelectedImgView.setImage(this.meatItemImg);
                 else if (item instanceof Vodka)
                     this.itemSelectedImgView.setImage(this.vodkaItemImg);
-                else if (item instanceof Pierre)
+                else if (item instanceof Stone)
                     this.itemSelectedImgView.setImage(this.pierreItemImg);
                 else if (item instanceof Silex)
                     this.itemSelectedImgView.setImage(this.silexItemImg);
diff --git a/src/main/resources/fr/sae/terraria/vue/menu.fxml b/src/main/resources/fr/sae/terraria/vue/menu.fxml
index 04ff0b3..c9a37a1 100644
--- a/src/main/resources/fr/sae/terraria/vue/menu.fxml
+++ b/src/main/resources/fr/sae/terraria/vue/menu.fxml
@@ -85,6 +85,15 @@
                                 <Text text="1 Bâton | 2 Minerais de fer"/>
                             </HBox>
                             <Separator layoutY="158.0" prefHeight="5.0" prefWidth="625.0"/>
+                            <HBox id="notAvailable"
+                                  fx:id="lexique4"
+                                  layoutY="163.0"
+                                  prefHeight="50.0"
+                                  prefWidth="625.0">
+                                <Text text="1 Roche" textAlignment="CENTER"/>
+                                <Text text="3 pierres"/>
+                            </HBox>
+                            <Separator layoutY="213.0" prefHeight="5.0" prefWidth="625.0"/>
                         </Pane>
                     </ScrollPane>
                 </center>

From 0bdb6747637d33fe0264c7ad3f0d5a6974241f05 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Sun, 12 Jun 2022 16:18:08 +0200
Subject: [PATCH 43/97] =?UTF-8?q?Craft=20Roche=20cr=C3=A9e=20(clean)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/fr/sae/terraria/controller/MenuController.java    | 7 ++-----
 .../java/fr/sae/terraria/modele/entities/blocks/Rock.java  | 1 +
 2 files changed, 3 insertions(+), 5 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/controller/MenuController.java b/src/main/java/fr/sae/terraria/controller/MenuController.java
index d33479b..f567540 100644
--- a/src/main/java/fr/sae/terraria/controller/MenuController.java
+++ b/src/main/java/fr/sae/terraria/controller/MenuController.java
@@ -64,16 +64,13 @@ public MenuController(final Stage stage)
         // Craft de la roche à partir de 3 pierres
         this.lexique4.addEventFilter(Event.ANY, ev -> {
             if (ev.getEventType().getName().equalsIgnoreCase("MOUSE_PRESSED")) {
-                System.out.println("click");
-
                 int i = this.player.getInventory().get().size()-1;
-                while (i > 0 && !(this.player.getInventory().get().get(i).getItem() instanceof Stone) && this.player.getInventory().get().get(i).getNbItems() > 2)
+                while (i > 0 && !(this.player.getInventory().get().get(i).getItem() instanceof Stone) && this.player.getInventory().get().get(i).getNbItems() >= Rock.STONE_LOOTS)
                     i--;
 
                 Stack stack = this.player.getInventory().get().get(i);
-                System.out.println(stack.getItem());
                 if (stack.getItem() instanceof Stone) {
-                    for (int j = 0; j < 3; j++)
+                    for (int j = 0; j < Rock.STONE_LOOTS; j++)
                         stack.remove();
                     this.player.pickup(new Rock(this.environment));
                 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/Rock.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/Rock.java
index 336740a..ddb3741 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/Rock.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/Rock.java
@@ -19,6 +19,7 @@
 public class Rock extends Block implements StowableObjectType, CollideObjectType, PlaceableObjectType
 {
     public static final int BREAK_RESISTANCE = 5;
+    public static final int STONE_LOOTS = 3;
 
     private final Environment environment;
 

From b60784cf3a89f7c69595b9147f2c6f87393b7483 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Sun, 12 Jun 2022 19:43:20 +0200
Subject: [PATCH 44/97] Refonte complete du code

---
 .../terraria/controller/MenuController.java   |  6 +-
 .../sae/terraria/modele/GenerateEntity.java   | 17 ++---
 .../java/fr/sae/terraria/modele/TileMaps.java | 14 ++--
 .../java/fr/sae/terraria/modele/TileSet.java  | 20 ++++++
 .../sae/terraria/modele/entities/Rabbit.java  |  3 +-
 .../modele/entities/blocks/Block.java         |  2 +
 .../terraria/modele/entities/blocks/Dirt.java | 12 ++--
 .../terraria/modele/entities/blocks/Rock.java | 14 ++--
 .../modele/entities/blocks/TallGrass.java     | 13 ++--
 .../terraria/modele/entities/blocks/Tree.java |  4 +-
 .../modele/entities/entity/EntityMovable.java | 36 ++++++-----
 .../terraria/modele/entities/items/Coal.java  |  4 --
 .../terraria/modele/entities/items/Fiber.java |  4 --
 .../terraria/modele/entities/items/Iron.java  |  4 --
 .../terraria/modele/entities/items/Item.java  | 18 +++++-
 .../terraria/modele/entities/items/Meat.java  |  3 +-
 .../terraria/modele/entities/items/Silex.java |  4 --
 .../terraria/modele/entities/items/Stone.java |  4 --
 .../terraria/modele/entities/items/Vodka.java |  3 +-
 .../terraria/modele/entities/items/Wood.java  |  3 -
 .../modele/entities/player/Player.java        |  5 +-
 .../entities/player/inventory/Stack.java      | 54 ++++++++--------
 .../java/fr/sae/terraria/vue/LightView.java   |  3 +-
 .../fr/sae/terraria/vue/TileMapsView.java     | 64 ++++++++-----------
 .../sae/terraria/vue/hud/InventoryView.java   | 33 +++++-----
 .../terraria/vue/hud/ItemSelectedView.java    | 34 +++++-----
 src/main/java/module-info.java                |  2 +-
 .../modele/entities/player/PlayerTest.java    |  6 +-
 28 files changed, 200 insertions(+), 189 deletions(-)
 create mode 100644 src/main/java/fr/sae/terraria/modele/TileSet.java
 delete mode 100644 src/main/java/fr/sae/terraria/modele/entities/items/Coal.java
 delete mode 100644 src/main/java/fr/sae/terraria/modele/entities/items/Fiber.java
 delete mode 100644 src/main/java/fr/sae/terraria/modele/entities/items/Iron.java
 delete mode 100644 src/main/java/fr/sae/terraria/modele/entities/items/Silex.java
 delete mode 100644 src/main/java/fr/sae/terraria/modele/entities/items/Stone.java
 delete mode 100644 src/main/java/fr/sae/terraria/modele/entities/items/Wood.java

diff --git a/src/main/java/fr/sae/terraria/controller/MenuController.java b/src/main/java/fr/sae/terraria/controller/MenuController.java
index f567540..d8334c7 100644
--- a/src/main/java/fr/sae/terraria/controller/MenuController.java
+++ b/src/main/java/fr/sae/terraria/controller/MenuController.java
@@ -3,7 +3,7 @@
 import fr.sae.terraria.Terraria;
 import fr.sae.terraria.modele.Environment;
 import fr.sae.terraria.modele.entities.blocks.Rock;
-import fr.sae.terraria.modele.entities.items.Stone;
+import fr.sae.terraria.modele.entities.items.Item;
 import fr.sae.terraria.modele.entities.player.Player;
 import fr.sae.terraria.modele.entities.player.inventory.Stack;
 import javafx.animation.Animation;
@@ -65,11 +65,11 @@ public MenuController(final Stage stage)
         this.lexique4.addEventFilter(Event.ANY, ev -> {
             if (ev.getEventType().getName().equalsIgnoreCase("MOUSE_PRESSED")) {
                 int i = this.player.getInventory().get().size()-1;
-                while (i > 0 && !(this.player.getInventory().get().get(i).getItem() instanceof Stone) && this.player.getInventory().get().get(i).getNbItems() >= Rock.STONE_LOOTS)
+                while (i > 0 && !(this.player.getInventory().get().get(i).getItem().equals(Item.STONE)) && this.player.getInventory().get().get(i).getNbItems() >= Rock.STONE_LOOTS)
                     i--;
 
                 Stack stack = this.player.getInventory().get().get(i);
-                if (stack.getItem() instanceof Stone) {
+                if (stack.getItem() instanceof Item && stack.getItem().equals(Item.STONE)) {
                     for (int j = 0; j < Rock.STONE_LOOTS; j++)
                         stack.remove();
                     this.player.pickup(new Rock(this.environment));
diff --git a/src/main/java/fr/sae/terraria/modele/GenerateEntity.java b/src/main/java/fr/sae/terraria/modele/GenerateEntity.java
index 84b67bb..50301a0 100644
--- a/src/main/java/fr/sae/terraria/modele/GenerateEntity.java
+++ b/src/main/java/fr/sae/terraria/modele/GenerateEntity.java
@@ -43,17 +43,17 @@ public class GenerateEntity
     private static void generateAnEntity(Environment environment, SpawnableObjectType e, int whenSpawn, double spawnRate)
     {
         List<Entity> entities = environment.getEntities();
-        TileMaps maps = environment.getTileMaps();
+        TileMaps tileMaps = environment.getTileMaps();
         int widthTile = environment.widthTile;
         int heightTile = environment.heightTile;
         int ticks = environment.getTicks();
 
         // Fréquence d'apparition
         if (ticks%whenSpawn == 0)
-            for (int y = 0; y < maps.getHeight(); y++)
+            for (int y = 0; y < tileMaps.getHeight(); y++)
                 // Est-ce que l'arbre doit spawn sur ce 'y'
                 if (Math.random() < spawnRate) {
-                    List<Integer> locFloorsOnAxisX = findFloors(maps, y);
+                    List<Integer> locFloorsOnAxisX = findFloors(tileMaps, y);
                     // Si il y a du sol sur la ligne
                     if (!locFloorsOnAxisX.isEmpty()) {
                         int onWhichFloor = random.nextInt(locFloorsOnAxisX.size());
@@ -61,7 +61,7 @@ private static void generateAnEntity(Environment environment, SpawnableObjectTyp
                         int xEntity = targetFloor * widthTile;
                         int yEntity = ((y == 0) ? y : (y - 1)) * heightTile;
                         // Verifies au cas où si le tile au-dessus de lui est bien une casse vide (Du ciel)
-                        if (maps.getTile(targetFloor, y - 1) == TileMaps.SKY) {
+                        if (tileMaps.isSkyTile(targetFloor, y-1)) {
                             for (Entity entity : entities)
                                 // Une entité est déjà present ? Il ne le génère pas et arrête complétement la fonction
                                 if (xEntity == entity.getX() && yEntity == entity.getY())
@@ -76,15 +76,12 @@ private static void generateAnEntity(Environment environment, SpawnableObjectTyp
     }
 
     /** Range les positions du sol sur la ligne 'y' */
-    private static List<Integer> findFloors(TileMaps maps, int y)
+    private static List<Integer> findFloors(TileMaps tileMaps, int y)
     {
         List<Integer> localisation = new ArrayList<>();
-        for (int x = 0; x < maps.getWidth(); x++) {
-            int targetTile = maps.getTile(x, y);
-
-            if (targetTile == TileMaps.FLOOR_TOP || targetTile == TileMaps.FLOOR_RIGHT || targetTile == TileMaps.FLOOR_LEFT)
+        for (int x = 0; x < tileMaps.getWidth(); x++)
+            if (tileMaps.isFloorTopTile(x, y) || tileMaps.isFloorRightTile(x, y) || tileMaps.isFloorLeftTile(x, y))
                 localisation.add(x);
-        }
 
         return localisation;
     }
diff --git a/src/main/java/fr/sae/terraria/modele/TileMaps.java b/src/main/java/fr/sae/terraria/modele/TileMaps.java
index 4009aad..0479e4c 100644
--- a/src/main/java/fr/sae/terraria/modele/TileMaps.java
+++ b/src/main/java/fr/sae/terraria/modele/TileMaps.java
@@ -16,14 +16,7 @@
  */
 public class TileMaps
 {
-    // Constantes
     public static final int TILE_DEFAULT_SIZE = 16;
-    public static final int SKY = 0;
-    public static final int STONE = 1;
-    public static final int DIRT = 2;
-    public static final int FLOOR_TOP = 3;
-    public static final int FLOOR_LEFT = 4;
-    public static final int FLOOR_RIGHT = 5;
 
     // Qui concerne la carte
     private int[][] maps;
@@ -93,6 +86,13 @@ public void load(final String path)
         } catch (Exception e) { e.printStackTrace(); }
     }
 
+    public boolean isDirtTile(double x, double y) { return this.getTile((int) x, (int) y) == TileSet.DIRT.ordinal(); }
+    public boolean isSkyTile(double x, double y) { return this.getTile((int) x, (int) y) == TileSet.SKY.ordinal(); }
+    public boolean isRockTile(double x, double y) { return this.getTile((int) x, (int) y) == TileSet.ROCK.ordinal(); }
+    public boolean isFloorTopTile(double x, double y) { return this.getTile((int) x, (int) y) == TileSet.FLOOR_TOP.ordinal(); }
+    public boolean isFloorRightTile(double x, double y) { return this.getTile((int) x, (int) y) == TileSet.FLOOR_RIGHT.ordinal(); }
+    public boolean isFloorLeftTile(double x, double y) { return this.getTile((int) x, (int) y) == TileSet.FLOOR_LEFT.ordinal(); }
+
 
     public int getHeight() { return this.maps.length; }
     public int getWidth() { return this.maps[0].length; }
diff --git a/src/main/java/fr/sae/terraria/modele/TileSet.java b/src/main/java/fr/sae/terraria/modele/TileSet.java
new file mode 100644
index 0000000..8457896
--- /dev/null
+++ b/src/main/java/fr/sae/terraria/modele/TileSet.java
@@ -0,0 +1,20 @@
+package fr.sae.terraria.modele;
+
+
+public enum TileSet
+{
+    SKY,
+    ROCK,
+    DIRT,
+    FLOOR_TOP,
+    FLOOR_LEFT,
+    FLOOR_RIGHT;
+
+
+    public static boolean isSkyTile(TileSet item) { return item == TileSet.SKY; }
+    public static boolean isRockTile(TileSet item) { return item == TileSet.ROCK; }
+    public static boolean isDirtTile(TileSet item) { return item == TileSet.DIRT; }
+    public static boolean isFloorTopTile(TileSet item) { return item == TileSet.FLOOR_TOP; }
+    public static boolean isFloorRightTile(TileSet item) { return item == TileSet.FLOOR_RIGHT; }
+    public static boolean isFloorLeftTile(TileSet item) { return item == TileSet.FLOOR_LEFT; }
+}
diff --git a/src/main/java/fr/sae/terraria/modele/entities/Rabbit.java b/src/main/java/fr/sae/terraria/modele/entities/Rabbit.java
index c05e15b..e0bc584 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/Rabbit.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/Rabbit.java
@@ -59,6 +59,7 @@ public Rabbit(final Environment environment, int x, int y)
 
     @Override public void move()
     {
+        TileMaps tileMaps = this.environment.getTileMaps();
         this.setX(this.x.get() + this.getOffsetMoveX() * this.velocity);
 
         if (this.isIDLEonY() && this.isMoving()) {
@@ -66,7 +67,7 @@ public Rabbit(final Environment environment, int x, int y)
             int yProbablyVoid = (int) (getY() / environment.heightTile);
 
             // Si du vide risque d'y avoir lors de son déplacement
-            if (environment.getTileMaps().getTile(xProbablyVoid, yProbablyVoid + 2) == TileMaps.SKY) {
+            if (tileMaps.isSkyTile(xProbablyVoid, yProbablyVoid+2)) {
                 this.offset[0] = (-1) * this.getOffsetMoveX();
             } else {
                 boolean mustJump = this.environment.getTicks() % Rabbit.JUMP_FREQUENCY == 0;
diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
index 74c9251..4939e52 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
@@ -41,4 +41,6 @@ protected void breakAnimation(final Environment environment, final Block block,
     }
 
     @Override public abstract void updates();
+
+    public static boolean isDirt(Object obj) { return obj instanceof Dirt; }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/Dirt.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/Dirt.java
index cb22393..266e52a 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/Dirt.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/Dirt.java
@@ -2,10 +2,12 @@
 
 import fr.sae.terraria.modele.Environment;
 import fr.sae.terraria.modele.TileMaps;
+import fr.sae.terraria.modele.TileSet;
 import fr.sae.terraria.modele.entities.entity.CollideObjectType;
 import fr.sae.terraria.modele.entities.entity.Entity;
 import fr.sae.terraria.modele.entities.entity.PlaceableObjectType;
 import fr.sae.terraria.modele.entities.entity.StowableObjectType;
+import fr.sae.terraria.modele.entities.items.Item;
 import fr.sae.terraria.modele.entities.player.Player;
 import fr.sae.terraria.modele.entities.player.inventory.Inventory;
 
@@ -20,7 +22,7 @@ public class Dirt extends Block implements StowableObjectType, CollideObjectType
 
     private final double xOrigin;
     private final double yOrigin;
-    private int typeOfFloor;
+    private TileSet typeOfFloor;
 
 
     public Dirt(Environment environment, int x, int y)
@@ -48,7 +50,7 @@ public Dirt(Environment environment, int x, int y)
 
             int yIndexTile = (int) (getY()/environment.heightTile);
             int xIndexTile = (int) (getX()/environment.widthTile);
-            this.environment.getTileMaps().setTile(TileMaps.SKY, yIndexTile, xIndexTile);
+            this.environment.getTileMaps().setTile(TileSet.SKY.ordinal(), yIndexTile, xIndexTile);
             this.environment.getEntities().remove(this);
             this.environment.getBlocks().remove(this);
         }
@@ -69,13 +71,13 @@ public Dirt(Environment environment, int x, int y)
         if (!Objects.isNull(player.getStackSelected()))
             inventory.get().get(inventory.getPosCursor()).remove();
 
-        this.environment.getTileMaps().setTile(TileMaps.DIRT, y, x);
+        this.environment.getTileMaps().setTile(TileSet.DIRT.ordinal(), y, x);
         this.environment.getEntities().add(entity);
         this.environment.getBlocks().add((Dirt) entity);
     }
 
 
-    public int getTypeOfFloor() { return this.typeOfFloor; }
+    public TileSet getTypeOfFloor() { return this.typeOfFloor; }
 
-    public void setTypeOfFloor(int type) { this.typeOfFloor = type; }
+    public void setTypeOfFloor(TileSet type) { this.typeOfFloor = type; }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/Rock.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/Rock.java
index ddb3741..53c5aed 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/Rock.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/Rock.java
@@ -2,11 +2,11 @@
 
 import fr.sae.terraria.modele.Environment;
 import fr.sae.terraria.modele.TileMaps;
+import fr.sae.terraria.modele.TileSet;
 import fr.sae.terraria.modele.entities.entity.CollideObjectType;
-import fr.sae.terraria.modele.entities.entity.Entity;
 import fr.sae.terraria.modele.entities.entity.PlaceableObjectType;
 import fr.sae.terraria.modele.entities.entity.StowableObjectType;
-import fr.sae.terraria.modele.entities.items.Stone;
+import fr.sae.terraria.modele.entities.items.Item;
 import fr.sae.terraria.modele.entities.player.Player;
 import fr.sae.terraria.modele.entities.player.inventory.Inventory;
 import fr.sae.terraria.modele.entities.player.inventory.Stack;
@@ -53,11 +53,11 @@ public Rock(Environment environment, int x, int y)
         Player player = this.environment.getPlayer();
         if (this.getPv() <= 0) {
             for (int i = 0; i < 3; i++)
-                player.pickup(new Stone());
+                player.pickup(Item.STONE);
 
             int yIndexTile = (int) (getY()/this.environment.heightTile);
             int xIndexTile = (int) (getX()/this.environment.widthTile);
-            this.environment.getTileMaps().setTile(TileMaps.SKY, yIndexTile, xIndexTile);
+            this.environment.getTileMaps().setTile(TileSet.SKY.ordinal(), yIndexTile, xIndexTile);
             this.environment.getEntities().remove(this);
             this.environment.getBlocks().remove(this);
         }
@@ -78,7 +78,7 @@ public Rock(Environment environment, int x, int y)
         int widthTile = this.environment.widthTile;
         int heightTile = this.environment.heightTile;
 
-        Entity entity = new Rock(this.environment, x*widthTile, y*heightTile);
+        Block entity = new Rock(this.environment, x*widthTile, y*heightTile);
         entity.setRect(widthTile, heightTile);
 
         Player player = this.environment.getPlayer();
@@ -86,8 +86,8 @@ public Rock(Environment environment, int x, int y)
         if (!Objects.isNull(player.getStackSelected()))
             inventory.get().get(inventory.getPosCursor()).remove();
 
-        this.environment.getTileMaps().setTile(TileMaps.STONE, y, x);
+        this.environment.getTileMaps().setTile(TileSet.ROCK.ordinal(), y, x);
         this.environment.getEntities().add(entity);
-        this.environment.getBlocks().add((Block) entity);
+        this.environment.getBlocks().add(entity);
     }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/TallGrass.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/TallGrass.java
index 034f1e3..da4db4f 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/TallGrass.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/TallGrass.java
@@ -5,7 +5,7 @@
 import fr.sae.terraria.modele.entities.entity.Entity;
 import fr.sae.terraria.modele.entities.entity.ReproductiveObjectType;
 import fr.sae.terraria.modele.entities.entity.SpawnableObjectType;
-import fr.sae.terraria.modele.entities.items.Fiber;
+import fr.sae.terraria.modele.entities.items.Item;
 import fr.sae.terraria.modele.entities.items.Vodka;
 import javafx.beans.property.DoubleProperty;
 import javafx.beans.property.SimpleDoubleProperty;
@@ -51,7 +51,7 @@ public TallGrass(Environment environment, int x, int y)
         Environment.playSound("sound/cut.wav", false);
 
         for (int loot = (int) (Math.random()*3)+1; loot < LOOTS_FIBRE_MAX; loot++)
-            this.environment.getPlayer().pickup(new Fiber());
+            this.environment.getPlayer().pickup(Item.FIBER);
 
         boolean mustDropVodka = Math.random() < Vodka.DROP_RATE;
         if (mustDropVodka)
@@ -68,11 +68,12 @@ public TallGrass(Environment environment, int x, int y)
 
         boolean tallGrassMustReproduce = environment.getTicks()%TallGrass.REPRODUCTION_RATE == 0;
         if (tallGrassMustReproduce) {
+            final TileMaps tileMaps = environment.getTileMaps();
             List<Entity> entities = environment.getEntities();
             int heightTile = environment.heightTile;
             int widthTile = environment.widthTile;
-            int widthMaps = environment.getTileMaps().getWidth();
-            int heightMaps = environment.getTileMaps().getHeight();
+            int widthMaps = tileMaps.getWidth();
+            int heightMaps = tileMaps.getHeight();
 
             int x = -1;
             int y = (int) (getY()/heightTile)+1;
@@ -98,13 +99,13 @@ else if (rightIsAvailable)
             // La place sur la carte
             boolean isntOutTheMap = (x >= 0 && x < widthMaps) && (y >= 0 && y < heightMaps);
             if (isntOutTheMap) {
-                boolean dontHaveTile = environment.getTileMaps().getTile(x, y) != TileMaps.SKY;
+                boolean dontHaveTile = !tileMaps.isSkyTile(x, y);
 
                 if (dontHaveTile) {
                     int xTallGrassChildren = (int) ((left == 0) ? (getX() - widthTile) : (getX() + widthTile));
                     int yTallGrassChildren = (int) getY();
 
-                    TallGrass tallGrassChildren = new TallGrass(this.environment, xTallGrassChildren, yTallGrassChildren);
+                    TallGrass tallGrassChildren = new TallGrass(environment, xTallGrassChildren, yTallGrassChildren);
                     tallGrassChildren.setRect(widthTile, heightTile);
                     children.add(tallGrassChildren);
                 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/Tree.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/Tree.java
index f2180f8..42d9193 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/Tree.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/Tree.java
@@ -2,7 +2,7 @@
 
 import fr.sae.terraria.modele.Environment;
 import fr.sae.terraria.modele.entities.entity.SpawnableObjectType;
-import fr.sae.terraria.modele.entities.items.Wood;
+import fr.sae.terraria.modele.entities.items.Item;
 
 
 public class Tree extends Block implements SpawnableObjectType
@@ -26,7 +26,7 @@ public Tree(Environment environment, int x, int y)
     @Override public void breaks()
     {
         // Environment.playSound("sound/grassyStep.wav", false);
-        this.environment.getPlayer().pickup(new Wood());
+        this.environment.getPlayer().pickup(Item.WOOD);
         this.environment.getEntities().remove(this);
         this.environment.getTrees().remove(this);
     }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/entity/EntityMovable.java b/src/main/java/fr/sae/terraria/modele/entities/entity/EntityMovable.java
index 9936d74..1f58418 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/entity/EntityMovable.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/entity/EntityMovable.java
@@ -2,6 +2,7 @@
 
 import fr.sae.terraria.modele.Environment;
 import fr.sae.terraria.modele.TileMaps;
+import fr.sae.terraria.modele.TileSet;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -52,18 +53,18 @@ public Map<String, Boolean> collide(final Environment environment)
         int yBottom = (int)  (this.getY()+getRect().getHeight()-CollideObjectType.COLLISION_TOLERANCE)/heightTile;
         int posX = (int) ((this.getX()+((this.offset[0] < 0) ? CollideObjectType.COLLISION_TOLERANCE : -CollideObjectType.COLLISION_TOLERANCE)) + ((this.offset[0] > 0) ? getRect().getWidth() : 0))/widthTile;
 
-        boolean footInTheVoid = tileMaps.getTile(posX, yBottom) == TileMaps.SKY;
+        boolean footInTheVoid = tileMaps.getTile(posX, yBottom) == TileSet.SKY.ordinal();
         if (footInTheVoid)
             this.air = true;
 
         // Detection collision gauche droite
         if (this.isMoving()) {
             int yTop = (int) (getY()+CollideObjectType.COLLISION_TOLERANCE)/heightTile;
-            int futurePositionXLeft = (int) ((getX()+CollideObjectType.COLLISION_TOLERANCE)+(velocity*offset[0]))/widthTile;
-            int futurePositionXRight = (int) ((getX()+(-CollideObjectType.COLLISION_TOLERANCE)+(velocity*offset[0])) + (getRect().getWidth()))/widthTile;
+            int futurPosXLeft = (int) ((getX()+CollideObjectType.COLLISION_TOLERANCE)+(velocity*offset[0]))/widthTile;
+            int futurPosXRight = (int) ((getX()+(-CollideObjectType.COLLISION_TOLERANCE)+(velocity*offset[0])) + (getRect().getWidth()))/widthTile;
 
-            whereCollide.put("right", tileMaps.getTile(futurePositionXRight, yTop) != TileMaps.SKY || tileMaps.getTile(futurePositionXRight, yBottom) != TileMaps.SKY);
-            whereCollide.put("left", tileMaps.getTile(futurePositionXLeft, yTop) != TileMaps.SKY || tileMaps.getTile(futurePositionXLeft, yBottom) != TileMaps.SKY);
+            whereCollide.put("right", !tileMaps.isSkyTile(futurPosXRight, yTop) || !tileMaps.isSkyTile(futurPosXRight, yBottom));
+            whereCollide.put("left", !tileMaps.isSkyTile(futurPosXLeft, yTop) || !tileMaps.isSkyTile(futurPosXLeft, yBottom));
         }
 
         // Detection collision bas et haut
@@ -74,28 +75,29 @@ public Map<String, Boolean> collide(final Environment environment)
             // Tombe
             if (this.isFalling()) {
                 this.gravity.degInit = 0;
-                double futurePositionY = gravity.formulaOfTrajectory() ;
-                boolean isCollideBottom = tileMaps.getTile(xLeft, (int) (futurePositionY + this.rect.getHeight())/heightTile) != TileMaps.SKY || tileMaps.getTile(xRight, (int) (futurePositionY + CollideObjectType.COLLISION_TOLERANCE +this.rect.getHeight())/heightTile) != TileMaps.SKY;
+                double futurPosY = gravity.formulaOfTrajectory() ;
+
+                boolean isCollideBottom = !tileMaps.isSkyTile(xLeft, (futurPosY + this.rect.getHeight())/heightTile) || !tileMaps.isSkyTile(xRight, (futurPosY + CollideObjectType.COLLISION_TOLERANCE +this.rect.getHeight())/heightTile);
                 if (isCollideBottom) {
                     this.gravity.setJumpPosInit(this);
                     this.gravity.timer = 0;
                     this.idleOnY();
-                } else setY(futurePositionY);
+                } else setY(futurPosY);
                 // Saute
             } else if (this.isJumping()) {
-                double futurePositionY = gravity.formulaOfTrajectory();
+                double futurPosY = gravity.formulaOfTrajectory();
 
-                boolean isCollideTop = tileMaps.getTile(xLeft, (int) (futurePositionY + CollideObjectType.COLLISION_TOLERANCE)/heightTile) != TileMaps.SKY || tileMaps.getTile(xRight, (int) (futurePositionY + CollideObjectType.COLLISION_TOLERANCE)/heightTile) != TileMaps.SKY;
+                boolean isCollideTop = !tileMaps.isSkyTile(xLeft, (futurPosY + CollideObjectType.COLLISION_TOLERANCE)/heightTile) || !tileMaps.isSkyTile(xRight, (futurPosY + CollideObjectType.COLLISION_TOLERANCE)/heightTile);
                 // Quand le joueur monte
-                if (this.gravity.flightTime >= this.gravity.timer ) {
+                if (this.gravity.flightTime >= this.gravity.timer) {
                     if (isCollideTop) {
                         this.fall();
                         this.gravity.timer = 0;
                         this.gravity.setJumpPosInit(this);
-                    } else this.setY(futurePositionY);
+                    } else this.setY(futurPosY);
                     // Quand le joueur descends
                 } else {
-                    boolean isCollideBottom = tileMaps.getTile(xLeft, (int) ((futurePositionY + this.rect.getHeight()) - CollideObjectType.COLLISION_TOLERANCE)/heightTile) != TileMaps.SKY || tileMaps.getTile(xRight,(int) ((futurePositionY + this.rect.getHeight()) - CollideObjectType.COLLISION_TOLERANCE)/heightTile) != TileMaps.SKY;
+                    boolean isCollideBottom = !tileMaps.isSkyTile(xLeft, ((futurPosY + this.rect.getHeight()) - CollideObjectType.COLLISION_TOLERANCE)/heightTile) || !tileMaps.isSkyTile(xRight, ((futurPosY + this.rect.getHeight()) - CollideObjectType.COLLISION_TOLERANCE)/heightTile);
 
                     if (isCollideTop) {
                         this.fall();
@@ -104,21 +106,21 @@ public Map<String, Boolean> collide(final Environment environment)
                         this.gravity.timer = 0;
                         this.idleOnY();
                         this.air = false;
-                    } else this.setY(futurePositionY);
+                    } else this.setY(futurPosY);
                 }
             }
         } else if (this.air) {
             this.gravity.degInit = 0;
             int xLeft = (int) (getX()+CollideObjectType.COLLISION_TOLERANCE)/widthTile;
             int xRight = (int) (getX()-CollideObjectType.COLLISION_TOLERANCE+getRect().getWidth())/widthTile;
-            double futurePositionY = this.gravity.formulaOfTrajectory() + this.rect.getHeight();
+            double futurPosY = this.gravity.formulaOfTrajectory() + this.rect.getHeight();
 
-            boolean isCollideBottom = tileMaps.getTile(xLeft, (int) (futurePositionY - CollideObjectType.COLLISION_TOLERANCE)/heightTile) != TileMaps.SKY || tileMaps.getTile(xRight, (int) (futurePositionY - CollideObjectType.COLLISION_TOLERANCE)/heightTile) != TileMaps.SKY;
+            boolean isCollideBottom = !tileMaps.isSkyTile(xLeft, (futurPosY - CollideObjectType.COLLISION_TOLERANCE)/heightTile) || !tileMaps.isSkyTile(xRight, (futurPosY - CollideObjectType.COLLISION_TOLERANCE)/heightTile);
             if (isCollideBottom) {
                 this.idleOnY();
                 this.air = false;
                 this.gravity.setJumpPosInit(this);
-            } else setY(futurePositionY - this.rect.getHeight());
+            } else setY(futurPosY - this.rect.getHeight());
         }
 
         return whereCollide;
diff --git a/src/main/java/fr/sae/terraria/modele/entities/items/Coal.java b/src/main/java/fr/sae/terraria/modele/entities/items/Coal.java
deleted file mode 100644
index 217ff53..0000000
--- a/src/main/java/fr/sae/terraria/modele/entities/items/Coal.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package fr.sae.terraria.modele.entities.items;
-
-
-public class Coal extends Item { }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/items/Fiber.java b/src/main/java/fr/sae/terraria/modele/entities/items/Fiber.java
deleted file mode 100644
index e817b90..0000000
--- a/src/main/java/fr/sae/terraria/modele/entities/items/Fiber.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package fr.sae.terraria.modele.entities.items;
-
-
-public class Fiber extends Item { }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/items/Iron.java b/src/main/java/fr/sae/terraria/modele/entities/items/Iron.java
deleted file mode 100644
index 4d6796e..0000000
--- a/src/main/java/fr/sae/terraria/modele/entities/items/Iron.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package fr.sae.terraria.modele.entities.items;
-
-
-public class Iron extends Item { }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/items/Item.java b/src/main/java/fr/sae/terraria/modele/entities/items/Item.java
index 31c59cf..d458bf8 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/items/Item.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/items/Item.java
@@ -3,4 +3,20 @@
 import fr.sae.terraria.modele.entities.entity.StowableObjectType;
 
 
-public class Item implements StowableObjectType { }
+public enum Item implements StowableObjectType
+{
+    COAL,
+    FIBER,
+    IRON,
+    SILEX,
+    STONE,
+    WOOD;
+
+
+    public static boolean isCoal(StowableObjectType obj) { return obj == Item.COAL; }
+    public static boolean isFiber(StowableObjectType obj) { return obj == Item.FIBER; }
+    public static boolean isIron(StowableObjectType obj) { return obj == Item.IRON; }
+    public static boolean isStone(StowableObjectType obj) { return obj == Item.STONE; }
+    public static boolean isSilex(StowableObjectType obj) { return obj == Item.SILEX; }
+    public static boolean isWood(StowableObjectType obj) { return obj == Item.WOOD; }
+}
diff --git a/src/main/java/fr/sae/terraria/modele/entities/items/Meat.java b/src/main/java/fr/sae/terraria/modele/entities/items/Meat.java
index dfafc11..831aeb4 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/items/Meat.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/items/Meat.java
@@ -2,10 +2,11 @@
 
 import fr.sae.terraria.modele.Environment;
 import fr.sae.terraria.modele.entities.entity.ConsumableObjectType;
+import fr.sae.terraria.modele.entities.entity.StowableObjectType;
 import fr.sae.terraria.modele.entities.player.Player;
 
 
-public class Meat extends Item implements ConsumableObjectType
+public class Meat implements ConsumableObjectType, StowableObjectType
 {
     private final Environment environment;
 
diff --git a/src/main/java/fr/sae/terraria/modele/entities/items/Silex.java b/src/main/java/fr/sae/terraria/modele/entities/items/Silex.java
deleted file mode 100644
index 0efd689..0000000
--- a/src/main/java/fr/sae/terraria/modele/entities/items/Silex.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package fr.sae.terraria.modele.entities.items;
-
-
-public class Silex extends Item { }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/items/Stone.java b/src/main/java/fr/sae/terraria/modele/entities/items/Stone.java
deleted file mode 100644
index c7eed84..0000000
--- a/src/main/java/fr/sae/terraria/modele/entities/items/Stone.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package fr.sae.terraria.modele.entities.items;
-
-
-public class Stone extends Item { }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/items/Vodka.java b/src/main/java/fr/sae/terraria/modele/entities/items/Vodka.java
index 3e83262..de241fa 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/items/Vodka.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/items/Vodka.java
@@ -2,6 +2,7 @@
 
 import fr.sae.terraria.modele.Environment;
 import fr.sae.terraria.modele.entities.entity.ConsumableObjectType;
+import fr.sae.terraria.modele.entities.entity.StowableObjectType;
 import fr.sae.terraria.modele.entities.player.Player;
 import fr.sae.terraria.modele.entities.player.inventory.Inventory;
 
@@ -11,7 +12,7 @@
  * <h2><u>Description:</u></h2>
  * <p>Se drop lorsque le joueur casse des hautes herbes et une fois bu, l'écran sera troublé</p>
  */
-public class Vodka extends Item implements ConsumableObjectType
+public class Vodka implements ConsumableObjectType, StowableObjectType
 {
     public static final int DRUNK_EFFECT_TIME = 600;
     public static final double DROP_RATE = .1;
diff --git a/src/main/java/fr/sae/terraria/modele/entities/items/Wood.java b/src/main/java/fr/sae/terraria/modele/entities/items/Wood.java
deleted file mode 100644
index 1a43066..0000000
--- a/src/main/java/fr/sae/terraria/modele/entities/items/Wood.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package fr.sae.terraria.modele.entities.items;
-
-public class Wood extends Item { }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
index e191aef..691a029 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
@@ -131,11 +131,12 @@ public void interactWithBlock(final Rectangle2D rectangle)
 
     public void placeBlock(int xBlock, int yBlock)
     {
+        TileMaps tileMaps = this.environment.getTileMaps();
         boolean haveAnItemOnHand = !Objects.isNull(this.getStackSelected());
-        boolean goodPlace = this.environment.getTileMaps().getTile(xBlock, yBlock) == TileMaps.SKY;
+        boolean goodPlace = tileMaps.isSkyTile(xBlock, yBlock);
 
         if (haveAnItemOnHand && goodPlace) {
-            if (!(this.getStackSelected().getItem() instanceof PlaceableObjectType) && !(this.getStackSelected() instanceof ConsumableObjectType))
+            if (!(this.getStackSelected().getItem() instanceof PlaceableObjectType) && !(this.getStackSelected().getItem() instanceof ConsumableObjectType))
                 return;
 
             if (this.getStackSelected().getItem() instanceof PlaceableObjectType)
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
index 9a62beb..2d50628 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
@@ -36,45 +36,45 @@ public Stack()
         this.nbItems = new SimpleIntegerProperty(1);
     }
 
-    public boolean isSameItem(StowableObjectType object)
+    public boolean isSameItem(StowableObjectType obj)
     {
-        if (object instanceof Dirt && this.item instanceof Dirt)
+        if (obj instanceof Dirt && this.item instanceof Dirt)
             return true;
-        else if (object instanceof Rock && this.item instanceof Rock)
+        else if (obj instanceof Rock && this.item instanceof Rock)
             return true;
-        else if (object instanceof TallGrass && this.item instanceof TallGrass)
+        else if (obj instanceof TallGrass && this.item instanceof TallGrass)
             return true;
-        else if (object instanceof Torch && this.item instanceof Torch)
+        else if (obj instanceof Torch && this.item instanceof Torch)
             return true;
-        else if (object instanceof Coal && this.item instanceof Coal)
+        else if (obj instanceof Meat && this.item instanceof Meat)
             return true;
-        else if (object instanceof Fiber && this.item instanceof Fiber)
+        else if (obj instanceof Axe && this.item instanceof Axe)
             return true;
-        else if (object instanceof Iron && this.item instanceof Iron)
+        else if (obj instanceof Vodka && this.item instanceof Vodka)
             return true;
-        else if (object instanceof Meat && this.item instanceof Meat)
+        else if (obj instanceof Bow && this.item instanceof Bow)
             return true;
-        else if (object instanceof Stone && this.item instanceof Stone)
+        else if (obj instanceof Pickaxe && this.item instanceof Pickaxe)
             return true;
-        else if (object instanceof Silex && this.item instanceof Silex)
+        else if (obj instanceof Sword && this.item instanceof Sword)
             return true;
-        else if (object instanceof Wood && this.item instanceof Wood)
+        else if (obj instanceof Arrow && this.item instanceof Arrow)
             return true;
-        else if (object instanceof Axe && this.item instanceof Axe)
-            return true;
-        else if (object instanceof Vodka && this.item instanceof Vodka)
-            return true;
-        else if (object instanceof Bow && this.item instanceof Bow)
-            return true;
-        else if (object instanceof Pickaxe && this.item instanceof Pickaxe)
-            return true;
-        else if (object instanceof Sword && this.item instanceof Sword)
-            return true;
-        else if (object instanceof Arrow && this.item instanceof Arrow)
-            return true;
-        else if (object instanceof Sword && this.item instanceof Sword)
-            return true;
-        else return false;
+        else if (obj instanceof Item) {
+            if (Item.isCoal(obj) && Item.isCoal(this.item))
+                return true;
+            else if (Item.isFiber(obj) && Item.isFiber(this.item))
+                return true;
+            else if (Item.isIron(obj) && Item.isIron(this.item))
+                return true;
+            else if (Item.isStone(obj) && Item.isStone(this.item))
+                return true;
+            else if (Item.isSilex(obj) && Item.isSilex(this.item))
+                return true;
+            else if (Item.isWood(obj) && Item.isWood(this.item))
+                return true;
+            else return false;
+        } else return false;
     }
 
     public IntegerProperty nbItemsProperty() { return this.nbItems; }
diff --git a/src/main/java/fr/sae/terraria/vue/LightView.java b/src/main/java/fr/sae/terraria/vue/LightView.java
index 52e3e02..0055693 100644
--- a/src/main/java/fr/sae/terraria/vue/LightView.java
+++ b/src/main/java/fr/sae/terraria/vue/LightView.java
@@ -3,6 +3,7 @@
 import fr.sae.terraria.modele.Clock;
 import fr.sae.terraria.modele.Environment;
 import fr.sae.terraria.modele.TileMaps;
+import fr.sae.terraria.modele.TileSet;
 import fr.sae.terraria.modele.entities.blocks.Torch;
 import javafx.collections.ListChangeListener;
 import javafx.collections.ObservableList;
@@ -103,7 +104,7 @@ private int fullStoneArea()
             column = 0;
 
             while (column < this.tileMaps.getWidth() && !found && !wrongLine) {
-                if (this.tileMaps.getTile(column, line) != TileMaps.STONE)
+                if (this.tileMaps.isRockTile(column, line))
                     wrongLine = true;
                 else if (column == this.tileMaps.getWidth() - 1)
                     found = true;
diff --git a/src/main/java/fr/sae/terraria/vue/TileMapsView.java b/src/main/java/fr/sae/terraria/vue/TileMapsView.java
index 9086a30..fdf25ae 100644
--- a/src/main/java/fr/sae/terraria/vue/TileMapsView.java
+++ b/src/main/java/fr/sae/terraria/vue/TileMapsView.java
@@ -2,6 +2,7 @@
 
 import fr.sae.terraria.modele.Environment;
 import fr.sae.terraria.modele.TileMaps;
+import fr.sae.terraria.modele.TileSet;
 import fr.sae.terraria.modele.entities.Rabbit;
 import fr.sae.terraria.modele.entities.Slime;
 import fr.sae.terraria.modele.entities.blocks.*;
@@ -114,16 +115,15 @@ private void updatesBlocksView(ListChangeListener.Change<? extends Block> c)
 
                 blockView.setImage(null);
                 if (block instanceof Dirt) {
-                    if (((Dirt) block).getTypeOfFloor() == TileMaps.FLOOR_TOP)
+                    Dirt dirt = (Dirt) block;
+                    if (TileSet.isFloorTopTile(dirt.getTypeOfFloor()))
                         blockView.setImage(this.floorTopImg);
-                    else if (((Dirt) block).getTypeOfFloor() == TileMaps.FLOOR_LEFT)
+                    else if (TileSet.isFloorLeftTile(dirt.getTypeOfFloor()))
                         blockView.setImage(this.floorLeftImg);
-                    else if (((Dirt) block).getTypeOfFloor() == TileMaps.FLOOR_RIGHT)
+                    else if (TileSet.isFloorRightTile(dirt.getTypeOfFloor()))
                         blockView.setImage(this.floorRightImg);
-                    else if (((Dirt) block).getTypeOfFloor() == TileMaps.DIRT)
+                    else if (TileSet.isDirtTile(dirt.getTypeOfFloor()))
                         blockView.setImage(this.dirtImg);
-                    else if (((Dirt) block).getTypeOfFloor() == 0)
-                        blockView.setImage(this.floorTopImg);
                 } else if (block instanceof Rock) {
                     blockView.setImage(this.stoneImg);
                 } else if (block instanceof TallGrass) {
@@ -277,43 +277,31 @@ private void updatesTreeView(ListChangeListener.Change<? extends Tree> c)
 
     }
 
-    /** Affiche une erreur si un developer a fait une erreur lors de la saisie d'un tile dans le fichier .json */
-    private void errorTile(final int tile) { if (tile != TileMaps.SKY) System.out.println("Le tile '" + tile + "' n'est pas reconnu."); }
-
     /** Decompose la carte pour afficher une à une les tiles à l'écran */
     public void displayMaps(TileMaps tiles)
     {
         for (int y = 0; y < tiles.getHeight() ; y++)
             for (int x = 0 ; x < tiles.getWidth() ; x++)
-                switch (tiles.getTile(x, y)) {
-                    case TileMaps.STONE:
-                        Rock rockEntity = new Rock(this.environment, x*this.tileWidth, y*this.tileHeight);
-                        rockEntity.setRect(this.tileWidth, this.tileHeight);
-
-                        this.environment.getEntities().add(rockEntity);
-                        this.environment.getBlocks().add(rockEntity);
-                        break;
-                    case TileMaps.DIRT:
-                        Dirt dirtSprite = new Dirt(this.environment, x*this.tileWidth, y*this.tileHeight);
-                        dirtSprite.setTypeOfFloor(TileMaps.DIRT);
-                        dirtSprite.setRect(this.tileWidth, this.tileHeight);
-
-                        this.environment.getEntities().add(dirtSprite);
-                        this.environment.getBlocks().add(dirtSprite);
-                        break;
-                    case TileMaps.FLOOR_TOP:
-                    case TileMaps.FLOOR_LEFT:
-                    case TileMaps.FLOOR_RIGHT:
-                        Dirt floorEntity = new Dirt(this.environment, x*this.tileWidth, y*this.tileHeight);
-                        floorEntity.setTypeOfFloor(tiles.getTile(x, y));
-                        floorEntity.setRect(this.tileWidth, this.tileHeight);
-
-                        this.environment.getEntities().add(floorEntity);
-                        this.environment.getBlocks().add(floorEntity);
-                        break;
-                    default:
-                        this.errorTile(tiles.getTile(x, y));
-                        break;
+                if (tiles.isRockTile(x, y)) {
+                    Rock rockEntity = new Rock(this.environment, x*this.tileWidth, y*this.tileHeight);
+                    rockEntity.setRect(this.tileWidth, this.tileHeight);
+
+                    this.environment.getEntities().add(rockEntity);
+                    this.environment.getBlocks().add(rockEntity);
+                } else if (tiles.isDirtTile(x, y)) {
+                    Dirt dirtSprite = new Dirt(this.environment, x*this.tileWidth, y*this.tileHeight);
+                    dirtSprite.setTypeOfFloor(TileSet.DIRT);
+                    dirtSprite.setRect(this.tileWidth, this.tileHeight);
+
+                    this.environment.getEntities().add(dirtSprite);
+                    this.environment.getBlocks().add(dirtSprite);
+                } else if (tiles.isFloorTopTile(x, y) || tiles.isFloorLeftTile(x, y) || tiles.isFloorRightTile(x, y)) {
+                    Dirt floorEntity = new Dirt(this.environment, x*this.tileWidth, y*this.tileHeight);
+                    floorEntity.setTypeOfFloor((tiles.isFloorTopTile(x, y)) ? TileSet.FLOOR_TOP : (tiles.isFloorRightTile(x, y)) ? TileSet.FLOOR_RIGHT : TileSet.FLOOR_LEFT);
+                    floorEntity.setRect(this.tileWidth, this.tileHeight);
+
+                    this.environment.getEntities().add(floorEntity);
+                    this.environment.getBlocks().add(floorEntity);
                 }
     }
 }
diff --git a/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java b/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java
index fc13085..bba30c6 100644
--- a/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java
+++ b/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java
@@ -3,10 +3,7 @@
 import fr.sae.terraria.Terraria;
 import fr.sae.terraria.modele.TileMaps;
 import fr.sae.terraria.modele.entities.Arrow;
-import fr.sae.terraria.modele.entities.blocks.Dirt;
-import fr.sae.terraria.modele.entities.blocks.Rock;
-import fr.sae.terraria.modele.entities.blocks.TallGrass;
-import fr.sae.terraria.modele.entities.blocks.Torch;
+import fr.sae.terraria.modele.entities.blocks.*;
 import fr.sae.terraria.modele.entities.entity.StowableObjectType;
 import fr.sae.terraria.modele.entities.items.*;
 import fr.sae.terraria.modele.entities.player.inventory.Inventory;
@@ -102,7 +99,7 @@ private void displayItemIntoInventoryBar()
                     Stack stack = c.getAddedSubList().get(0);
                     StowableObjectType item = stack.getItem();
 
-                    if (item instanceof Dirt)
+                    if (Block.isDirt(item))
                         view.setImage(View.loadAnImage("tiles/floor-top.png", itemInventoryWidth, itemInventoryHeight));
                     else if (item instanceof Rock)
                         view.setImage(View.loadAnImage("tiles/rock-fill.png", itemInventoryWidth, itemInventoryHeight));
@@ -110,20 +107,8 @@ else if (item instanceof TallGrass)
                         view.setImage(View.loadAnImage("tiles/tall-grass.png.png", itemInventoryWidth, itemInventoryHeight));
                     else if (item instanceof Torch)
                         view.setImage(View.loadAnImage("tiles/torch.png", itemInventoryWidth, itemInventoryHeight));
-                    else if (item instanceof Coal)
-                        view.setImage(View.loadAnImage("loots/coal.png", itemInventoryWidth, itemInventoryHeight));
-                    else if (item instanceof Fiber)
-                        view.setImage(View.loadAnImage("loots/fiber.png", itemInventoryWidth, itemInventoryHeight));
-                    else if (item instanceof Iron)
-                        view.setImage(View.loadAnImage("loots/iron.png", itemInventoryWidth, itemInventoryHeight));
                     else if (item instanceof Meat)
                         view.setImage(View.loadAnImage("loots/meat.png", itemInventoryWidth, itemInventoryHeight));
-                    else if (item instanceof Stone)
-                        view.setImage(View.loadAnImage("loots/pierre.png", itemInventoryWidth, itemInventoryHeight));
-                    else if (item instanceof Silex)
-                        view.setImage(View.loadAnImage("loots/silex.png", itemInventoryWidth, itemInventoryHeight));
-                    else if (item instanceof Wood)
-                        view.setImage(View.loadAnImage("loots/wood.png", itemInventoryWidth, itemInventoryHeight));
                     else if (item instanceof Axe)
                         view.setImage(null);    // TODO
                     else if (item instanceof Bow)
@@ -136,6 +121,20 @@ else if (item instanceof Arrow)
                         view.setImage(null);    // TODO
                     else if (item instanceof Vodka)
                         view.setImage(View.loadAnImage("loots/vodka.png", itemInventoryWidth,itemInventoryHeight));
+                    else if (item instanceof Item) {
+                        if (Item.isCoal(item))
+                            view.setImage(View.loadAnImage("loots/coal.png", itemInventoryWidth, itemInventoryHeight));
+                        else if (Item.isFiber(item))
+                            view.setImage(View.loadAnImage("loots/fiber.png", itemInventoryWidth, itemInventoryHeight));
+                        else if (Item.isIron(item))
+                            view.setImage(View.loadAnImage("loots/iron.png", itemInventoryWidth, itemInventoryHeight));
+                        else if (Item.isStone(item))
+                            view.setImage(View.loadAnImage("loots/pierre.png", itemInventoryWidth, itemInventoryHeight));
+                        else if (Item.isSilex(item))
+                            view.setImage(View.loadAnImage("loots/silex.png", itemInventoryWidth, itemInventoryHeight));
+                        else if (Item.isWood(item))
+                            view.setImage(View.loadAnImage("loots/wood.png", itemInventoryWidth, itemInventoryHeight));
+                    }
 
                     // Actualise le nombre d'item à l'écran
                     this.texts.get(c.getTo()-1).setText(String.valueOf(stack.getNbItems()));
diff --git a/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java b/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java
index 7807ce2..b96aeb2 100644
--- a/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java
+++ b/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java
@@ -33,7 +33,7 @@ public class ItemSelectedView
     private final Image coalItemImg;
     private final Image fibreItemImg;
     private final Image ironItemImg;
-    private final Image pierreItemImg;
+    private final Image rockItemImg;
     private final Image silexItemImg;
     private final Image meatItemImg;
     private final Image woodItemImg;
@@ -57,12 +57,12 @@ public ItemSelectedView(Pane display, Player player, double scaleMultiplicatorWi
         this.itemSelectedImgView = new ImageView();
         this.vodkaItemImg = View.loadAnImage("loots/vodka.png",widthItem,heightItem);
         this.dirtItemImg = View.loadAnImage("tiles/floor-top.png", widthItem, heightItem);
-        this.stoneItemImg = View.loadAnImage("tiles/rock-fill.png", widthItem, heightItem);
+        this.rockItemImg = View.loadAnImage("tiles/rock-fill.png", widthItem, heightItem);
         this.torchItemImg = View.loadAnImage("tiles/torch.png", widthItem, heightItem);
         this.coalItemImg = View.loadAnImage("loots/coal.png", widthItem, heightItem);
         this.fibreItemImg = View.loadAnImage("loots/fiber.png", widthItem, heightItem);
         this.ironItemImg = View.loadAnImage("loots/iron.png", widthItem, heightItem);
-        this.pierreItemImg = View.loadAnImage("loots/pierre.png", widthItem, heightItem);
+        this.stoneItemImg = View.loadAnImage("loots/pierre.png", widthItem, heightItem);
         this.silexItemImg = View.loadAnImage("loots/silex.png", widthItem, heightItem);
         this.meatItemImg = View.loadAnImage("loots/meat.png", widthItem, heightItem);
         this.woodItemImg = View.loadAnImage("loots/wood.png", widthItem, heightItem);
@@ -85,27 +85,15 @@ public ItemSelectedView(Pane display, Player player, double scaleMultiplicatorWi
                 if (item instanceof Dirt)
                     this.itemSelectedImgView.setImage(this.dirtItemImg);
                 else if (item instanceof Rock)
-                    this.itemSelectedImgView.setImage(this.stoneItemImg);
+                    this.itemSelectedImgView.setImage(this.rockItemImg);
                 else if (item instanceof TallGrass)
                     this.itemSelectedImgView.setImage(null);
                 else if (item instanceof Torch)
                     this.itemSelectedImgView.setImage(this.torchItemImg);
-                else if (item instanceof Coal)
-                    this.itemSelectedImgView.setImage(this.coalItemImg);
-                else if (item instanceof Fiber)
-                    this.itemSelectedImgView.setImage(this.fibreItemImg);
-                else if (item instanceof Iron)
-                    this.itemSelectedImgView.setImage(this.ironItemImg);
                 else if (item instanceof Meat)
                     this.itemSelectedImgView.setImage(this.meatItemImg);
                 else if (item instanceof Vodka)
                     this.itemSelectedImgView.setImage(this.vodkaItemImg);
-                else if (item instanceof Stone)
-                    this.itemSelectedImgView.setImage(this.pierreItemImg);
-                else if (item instanceof Silex)
-                    this.itemSelectedImgView.setImage(this.silexItemImg);
-                else if (item instanceof Wood)
-                    this.itemSelectedImgView.setImage(this.woodItemImg);
                 else if (item instanceof Axe)
                     this.itemSelectedImgView.setImage(null);
                 else if (item instanceof Bow)
@@ -116,6 +104,20 @@ else if (item instanceof Sword)
                     this.itemSelectedImgView.setImage(this.swordItemImg);
                 else if (item instanceof Arrow)
                     this.itemSelectedImgView.setImage(null);
+                else if (item instanceof Item) {
+                    if (Item.isCoal(item))
+                        this.itemSelectedImgView.setImage(this.coalItemImg);
+                    else if (Item.isFiber(item))
+                        this.itemSelectedImgView.setImage(this.fibreItemImg);
+                    else if (Item.isIron(item))
+                        this.itemSelectedImgView.setImage(this.ironItemImg);
+                    else if (Item.isStone(item))
+                        this.itemSelectedImgView.setImage(this.stoneItemImg);
+                    else if (Item.isSilex(item))
+                        this.itemSelectedImgView.setImage(this.silexItemImg);
+                    else if (Item.isWood(item))
+                        this.itemSelectedImgView.setImage(this.woodItemImg);
+                }
             }
         });
 
diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java
index e7b3690..c9a249e 100644
--- a/src/main/java/module-info.java
+++ b/src/main/java/module-info.java
@@ -10,7 +10,6 @@
     exports fr.sae.terraria;
     opens fr.sae.terraria.controller to javafx.fxml;
     exports fr.sae.terraria.modele;
-    opens fr.sae.terraria.modele to javafx.fxml;
     exports fr.sae.terraria.modele.entities;
     opens fr.sae.terraria.modele.entities to javafx.fxml;
     exports fr.sae.terraria.modele.entities.entity;
@@ -19,4 +18,5 @@
     opens fr.sae.terraria.modele.entities.player to javafx.fxml;
     exports fr.sae.terraria.modele.entities.player.inventory;
     opens fr.sae.terraria.modele.entities.player.inventory to javafx.fxml;
+    opens fr.sae.terraria.modele to javafx.fxml, javafx.graphics;
 }
\ No newline at end of file
diff --git a/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java b/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
index 7b0c190..092fba5 100644
--- a/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
+++ b/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
@@ -2,9 +2,9 @@
 
 import fr.sae.terraria.modele.Environment;
 import fr.sae.terraria.modele.TileMaps;
+import fr.sae.terraria.modele.TileSet;
 import fr.sae.terraria.modele.entities.Rabbit;
 import fr.sae.terraria.modele.entities.blocks.Dirt;
-import fr.sae.terraria.modele.entities.items.Coal;
 import fr.sae.terraria.modele.entities.items.Meat;
 import fr.sae.terraria.modele.entities.items.Vodka;
 import javafx.geometry.Rectangle2D;
@@ -162,9 +162,9 @@ public class PlayerTest
         TileMaps tileMaps = environment.getTileMaps();
         player.pickup(new Dirt(environment, 1, 1));
 
-        assertEquals(tileMaps.getTile(0, 0), TileMaps.SKY);
+        assertEquals(tileMaps.getTile(0, 0), TileSet.SKY.ordinal());
         player.placeBlock(0, 0);
-        assertEquals(tileMaps.getTile(0, 0), TileMaps.DIRT);
+        assertEquals(tileMaps.getTile(0, 0), TileSet.DIRT.ordinal());
 
         assertNull(player.getStackSelected());
     }

From 671bf1f2bbc5d003e00778e37bd3b2edec4c677a Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Sun, 12 Jun 2022 19:48:53 +0200
Subject: [PATCH 45/97] Fix pierre qui ne se stack pas

---
 .../java/fr/sae/terraria/modele/entities/player/Player.java | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
index 691a029..ce091a0 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
@@ -26,7 +26,6 @@ public class Player extends EntityMovable implements CollideObjectType, Collapsi
     private final EnumMap<KeyCode, Boolean> keysInput;
     private final EnumMap<MouseButton, Boolean> mouseInput;
 
-    private final ObjectProperty objectWasPickup;
     private final SimpleBooleanProperty drunk;
 
     private final Inventory inventory;
@@ -43,9 +42,6 @@ public Player(final Environment environment)
         this.animation = new Animation();
         this.keysInput = new EnumMap<>(KeyCode.class);
         this.mouseInput = new EnumMap<>(MouseButton.class);
-
-        this.objectWasPickup = new SimpleObjectProperty(null);
-        this.objectWasPickup.addListener((obs, oldObject, newObject) -> this.inventory.put((StowableObjectType) newObject));
     }
 
     @Override public void updates()
@@ -162,7 +158,7 @@ else if (key == KeyCode.Q)
         });
     }
 
-    public void pickup(StowableObjectType pickupObject) { this.objectWasPickup.set(pickupObject); }
+    public void pickup(StowableObjectType pickupObject) { this.inventory.put(pickupObject); }
 
     public SimpleBooleanProperty drunkProperty() { return drunk; }
 

From 00271e09f37edc64c9d9d8db8bbfb45d0f222cb7 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Sun, 12 Jun 2022 19:53:17 +0200
Subject: [PATCH 46/97] Fix filter

---
 .../fr/sae/terraria/modele/entities/blocks/Dirt.java     | 2 --
 .../fr/sae/terraria/modele/entities/blocks/Rock.java     | 1 -
 .../fr/sae/terraria/modele/entities/player/Player.java   | 2 --
 .../terraria/modele/entities/player/inventory/Stack.java | 4 +++-
 src/main/java/fr/sae/terraria/vue/LightView.java         | 8 ++++----
 src/main/java/fr/sae/terraria/vue/hud/InventoryView.java | 9 +++++++--
 .../java/fr/sae/terraria/vue/hud/ItemSelectedView.java   | 4 +++-
 7 files changed, 17 insertions(+), 13 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/Dirt.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/Dirt.java
index 266e52a..8593925 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/Dirt.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/Dirt.java
@@ -1,13 +1,11 @@
 package fr.sae.terraria.modele.entities.blocks;
 
 import fr.sae.terraria.modele.Environment;
-import fr.sae.terraria.modele.TileMaps;
 import fr.sae.terraria.modele.TileSet;
 import fr.sae.terraria.modele.entities.entity.CollideObjectType;
 import fr.sae.terraria.modele.entities.entity.Entity;
 import fr.sae.terraria.modele.entities.entity.PlaceableObjectType;
 import fr.sae.terraria.modele.entities.entity.StowableObjectType;
-import fr.sae.terraria.modele.entities.items.Item;
 import fr.sae.terraria.modele.entities.player.Player;
 import fr.sae.terraria.modele.entities.player.inventory.Inventory;
 
diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/Rock.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/Rock.java
index 53c5aed..8b8636c 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/Rock.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/Rock.java
@@ -1,7 +1,6 @@
 package fr.sae.terraria.modele.entities.blocks;
 
 import fr.sae.terraria.modele.Environment;
-import fr.sae.terraria.modele.TileMaps;
 import fr.sae.terraria.modele.TileSet;
 import fr.sae.terraria.modele.entities.entity.CollideObjectType;
 import fr.sae.terraria.modele.entities.entity.PlaceableObjectType;
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
index ce091a0..2bdab01 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
@@ -6,9 +6,7 @@
 import fr.sae.terraria.modele.entities.player.inventory.Inventory;
 import fr.sae.terraria.modele.entities.player.inventory.Stack;
 import fr.sae.terraria.vue.View;
-import javafx.beans.property.ObjectProperty;
 import javafx.beans.property.SimpleBooleanProperty;
-import javafx.beans.property.SimpleObjectProperty;
 import javafx.geometry.Rectangle2D;
 import javafx.scene.image.Image;
 import javafx.scene.input.KeyCode;
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
index 2d50628..3434557 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
@@ -6,7 +6,9 @@
 import fr.sae.terraria.modele.entities.blocks.TallGrass;
 import fr.sae.terraria.modele.entities.blocks.Torch;
 import fr.sae.terraria.modele.entities.entity.StowableObjectType;
-import fr.sae.terraria.modele.entities.items.*;
+import fr.sae.terraria.modele.entities.items.Item;
+import fr.sae.terraria.modele.entities.items.Meat;
+import fr.sae.terraria.modele.entities.items.Vodka;
 import fr.sae.terraria.modele.entities.tools.Axe;
 import fr.sae.terraria.modele.entities.tools.Bow;
 import fr.sae.terraria.modele.entities.tools.Pickaxe;
diff --git a/src/main/java/fr/sae/terraria/vue/LightView.java b/src/main/java/fr/sae/terraria/vue/LightView.java
index 0055693..49e149d 100644
--- a/src/main/java/fr/sae/terraria/vue/LightView.java
+++ b/src/main/java/fr/sae/terraria/vue/LightView.java
@@ -3,7 +3,6 @@
 import fr.sae.terraria.modele.Clock;
 import fr.sae.terraria.modele.Environment;
 import fr.sae.terraria.modele.TileMaps;
-import fr.sae.terraria.modele.TileSet;
 import fr.sae.terraria.modele.entities.blocks.Torch;
 import javafx.collections.ListChangeListener;
 import javafx.collections.ObservableList;
@@ -13,6 +12,7 @@
 import javafx.scene.shape.Rectangle;
 import javafx.scene.shape.Shape;
 
+
 public class LightView {
     private static final int CIRCLE_RAY = 3;
     private static final Color NIGHT_COLOR = Color.web("#0d0d38");
@@ -104,7 +104,7 @@ private int fullStoneArea()
             column = 0;
 
             while (column < this.tileMaps.getWidth() && !found && !wrongLine) {
-                if (this.tileMaps.isRockTile(column, line))
+                if (!this.tileMaps.isRockTile(column, line))
                     wrongLine = true;
                 else if (column == this.tileMaps.getWidth() - 1)
                     found = true;
@@ -133,8 +133,8 @@ private void addEffects()
         this.actualTunnel.setFill(NIGHT_COLOR);
 
         this.actualAir.opacityProperty().bind(this.clock.opacityNightFilterProperty());
-        this.actualFade.setOpacity(0.8);
-        this.actualTunnel.setOpacity(0.8);
+        this.actualFade.setOpacity(.8);
+        this.actualTunnel.setOpacity(.8);
     }
 
     private void addTochLights()
diff --git a/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java b/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java
index bba30c6..a622e8b 100644
--- a/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java
+++ b/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java
@@ -3,9 +3,14 @@
 import fr.sae.terraria.Terraria;
 import fr.sae.terraria.modele.TileMaps;
 import fr.sae.terraria.modele.entities.Arrow;
-import fr.sae.terraria.modele.entities.blocks.*;
+import fr.sae.terraria.modele.entities.blocks.Block;
+import fr.sae.terraria.modele.entities.blocks.Rock;
+import fr.sae.terraria.modele.entities.blocks.TallGrass;
+import fr.sae.terraria.modele.entities.blocks.Torch;
 import fr.sae.terraria.modele.entities.entity.StowableObjectType;
-import fr.sae.terraria.modele.entities.items.*;
+import fr.sae.terraria.modele.entities.items.Item;
+import fr.sae.terraria.modele.entities.items.Meat;
+import fr.sae.terraria.modele.entities.items.Vodka;
 import fr.sae.terraria.modele.entities.player.inventory.Inventory;
 import fr.sae.terraria.modele.entities.player.inventory.Stack;
 import fr.sae.terraria.modele.entities.tools.Axe;
diff --git a/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java b/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java
index b96aeb2..1d7a33e 100644
--- a/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java
+++ b/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java
@@ -7,7 +7,9 @@
 import fr.sae.terraria.modele.entities.blocks.TallGrass;
 import fr.sae.terraria.modele.entities.blocks.Torch;
 import fr.sae.terraria.modele.entities.entity.StowableObjectType;
-import fr.sae.terraria.modele.entities.items.*;
+import fr.sae.terraria.modele.entities.items.Item;
+import fr.sae.terraria.modele.entities.items.Meat;
+import fr.sae.terraria.modele.entities.items.Vodka;
 import fr.sae.terraria.modele.entities.player.Player;
 import fr.sae.terraria.modele.entities.player.inventory.Stack;
 import fr.sae.terraria.modele.entities.tools.Axe;

From 3f8fed0023171f3a9aae1f135c589d82069c8a7d Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Sun, 12 Jun 2022 20:43:47 +0200
Subject: [PATCH 47/97] =?UTF-8?q?Simplification=20du=20code=20des=20=C3=A9?=
 =?UTF-8?q?quipements?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../fr/sae/terraria/modele/Environment.java   |  8 +--
 .../sae/terraria/modele/entities/Slime.java   |  8 +--
 .../terraria/modele/entities/blocks/Rock.java |  8 +--
 .../entities/player/inventory/Stack.java      | 56 ++++++++++---------
 .../terraria/modele/entities/tools/Axe.java   | 11 ----
 .../terraria/modele/entities/tools/Bow.java   | 14 -----
 .../modele/entities/tools/MaterialSet.java    |  8 +++
 .../modele/entities/tools/Pickaxe.java        | 14 -----
 .../terraria/modele/entities/tools/Sword.java | 17 ------
 .../terraria/modele/entities/tools/Tool.java  | 45 +++++++++++----
 .../modele/entities/tools/ToolSet.java        | 11 ++++
 .../sae/terraria/vue/hud/InventoryView.java   | 24 ++++----
 .../terraria/vue/hud/ItemSelectedView.java    | 24 ++++----
 13 files changed, 116 insertions(+), 132 deletions(-)
 delete mode 100644 src/main/java/fr/sae/terraria/modele/entities/tools/Axe.java
 delete mode 100644 src/main/java/fr/sae/terraria/modele/entities/tools/Bow.java
 create mode 100644 src/main/java/fr/sae/terraria/modele/entities/tools/MaterialSet.java
 delete mode 100644 src/main/java/fr/sae/terraria/modele/entities/tools/Pickaxe.java
 delete mode 100644 src/main/java/fr/sae/terraria/modele/entities/tools/Sword.java
 create mode 100644 src/main/java/fr/sae/terraria/modele/entities/tools/ToolSet.java

diff --git a/src/main/java/fr/sae/terraria/modele/Environment.java b/src/main/java/fr/sae/terraria/modele/Environment.java
index e3b33f3..0071a43 100644
--- a/src/main/java/fr/sae/terraria/modele/Environment.java
+++ b/src/main/java/fr/sae/terraria/modele/Environment.java
@@ -12,9 +12,9 @@
 import fr.sae.terraria.modele.entities.items.Meat;
 import fr.sae.terraria.modele.entities.items.Vodka;
 import fr.sae.terraria.modele.entities.player.Player;
-import fr.sae.terraria.modele.entities.tools.Pickaxe;
-import fr.sae.terraria.modele.entities.tools.Sword;
+import fr.sae.terraria.modele.entities.tools.MaterialSet;
 import fr.sae.terraria.modele.entities.tools.Tool;
+import fr.sae.terraria.modele.entities.tools.ToolSet;
 import javafx.animation.Animation;
 import javafx.animation.KeyFrame;
 import javafx.animation.Timeline;
@@ -125,9 +125,9 @@ private void gameLoop()
             if (!caught[0]) {
                 this.player.pickup(new Torch(this));
                 this.player.pickup(new Meat(this));
-                this.player.pickup(new Pickaxe());
+                this.player.pickup(new Tool(ToolSet.PICKAXE, MaterialSet.IRON));
                 this.player.pickup(new Vodka(this));
-                this.player.pickup(new Sword(Tool.CRAFTED_WITH_WOOD));
+                this.player.pickup(new Tool(ToolSet.SWORD, MaterialSet.IRON));
 
                 caught[0] = true;
             }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/Slime.java b/src/main/java/fr/sae/terraria/modele/entities/Slime.java
index d9ac18c..dde2840 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/Slime.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/Slime.java
@@ -3,7 +3,7 @@
 import fr.sae.terraria.modele.Environment;
 import fr.sae.terraria.modele.entities.entity.*;
 import fr.sae.terraria.modele.entities.player.inventory.Stack;
-import fr.sae.terraria.modele.entities.tools.Sword;
+import fr.sae.terraria.modele.entities.tools.Tool;
 
 import java.util.Map;
 import java.util.Objects;
@@ -84,9 +84,9 @@ else if (environment.getPlayer().getX() < this.x.getValue())
 
         Stack stack = this.environment.getPlayer().getStackSelected();
         if (!Objects.isNull(stack)) {
-            if (stack.getItem() instanceof Sword) {
-                Sword sword = (Sword) stack.getItem();
-                this.setPv(this.getPv() - (Sword.DEFAULT_DAMAGE*sword.getMaterial()));
+            if (Tool.isSword(((Tool) stack.getItem()).getTypeOfTool())) {
+                Tool tool = (Tool) stack.getItem();
+                this.setPv(this.getPv() - tool.damage());
             }
         } else this.setPv(this.getPv() - .5);
     }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/Rock.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/Rock.java
index 8b8636c..e648461 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/Rock.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/Rock.java
@@ -9,7 +9,6 @@
 import fr.sae.terraria.modele.entities.player.Player;
 import fr.sae.terraria.modele.entities.player.inventory.Inventory;
 import fr.sae.terraria.modele.entities.player.inventory.Stack;
-import fr.sae.terraria.modele.entities.tools.Pickaxe;
 import fr.sae.terraria.modele.entities.tools.Tool;
 
 import java.util.Objects;
@@ -63,11 +62,10 @@ public Rock(Environment environment, int x, int y)
 
         // Peu importe l'outil qu'utilise le joueur, si c'est un outil, il perdra de la durabilité, mais le bloc ne peut que se casser avec une pioche
         Stack stack = player.getStackSelected();
-        if (!Objects.isNull(stack)) {
-            if (stack.getItem() instanceof Pickaxe)
+        if (!Objects.isNull(stack) && stack.getItem() instanceof Tool) {
+            if (Tool.isPickaxe(((Tool) stack.getItem()).getTypeOfTool()))
                 this.setPv(this.getPv() - 1);
-            if (stack.getItem() instanceof Tool)
-                ((Tool) stack.getItem()).use();
+            ((Tool) stack.getItem()).use();
         }
     }
 
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
index 3434557..0c1edea 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
@@ -9,10 +9,7 @@
 import fr.sae.terraria.modele.entities.items.Item;
 import fr.sae.terraria.modele.entities.items.Meat;
 import fr.sae.terraria.modele.entities.items.Vodka;
-import fr.sae.terraria.modele.entities.tools.Axe;
-import fr.sae.terraria.modele.entities.tools.Bow;
-import fr.sae.terraria.modele.entities.tools.Pickaxe;
-import fr.sae.terraria.modele.entities.tools.Sword;
+import fr.sae.terraria.modele.entities.tools.Tool;
 import javafx.beans.property.IntegerProperty;
 import javafx.beans.property.SimpleIntegerProperty;
 
@@ -42,41 +39,46 @@ public boolean isSameItem(StowableObjectType obj)
     {
         if (obj instanceof Dirt && this.item instanceof Dirt)
             return true;
-        else if (obj instanceof Rock && this.item instanceof Rock)
+        if (obj instanceof Rock && this.item instanceof Rock)
             return true;
-        else if (obj instanceof TallGrass && this.item instanceof TallGrass)
+        if (obj instanceof TallGrass && this.item instanceof TallGrass)
             return true;
-        else if (obj instanceof Torch && this.item instanceof Torch)
+        if (obj instanceof Torch && this.item instanceof Torch)
             return true;
-        else if (obj instanceof Meat && this.item instanceof Meat)
+        if (obj instanceof Meat && this.item instanceof Meat)
             return true;
-        else if (obj instanceof Axe && this.item instanceof Axe)
+        if (obj instanceof Vodka && this.item instanceof Vodka)
             return true;
-        else if (obj instanceof Vodka && this.item instanceof Vodka)
-            return true;
-        else if (obj instanceof Bow && this.item instanceof Bow)
-            return true;
-        else if (obj instanceof Pickaxe && this.item instanceof Pickaxe)
-            return true;
-        else if (obj instanceof Sword && this.item instanceof Sword)
-            return true;
-        else if (obj instanceof Arrow && this.item instanceof Arrow)
-            return true;
-        else if (obj instanceof Item) {
+
+        if (obj instanceof Tool && this.item instanceof Tool) {
+            if (Tool.isAxe(((Tool) obj).getTypeOfTool()) && Tool.isAxe(((Tool) this.item).getTypeOfTool()))
+                return true;
+            if (Tool.isBow(((Tool) obj).getTypeOfTool()) && Tool.isBow(((Tool) this.item).getTypeOfTool()))
+                return true;
+            if (Tool.isPickaxe(((Tool) obj).getTypeOfTool()) && Tool.isPickaxe(((Tool) this.item).getTypeOfTool()))
+                return true;
+            if (Tool.isSword(((Tool) obj).getTypeOfTool()) && Tool.isSword(((Tool) this.item).getTypeOfTool()))
+                return true;
+            if (Tool.isArrow(((Tool) obj).getTypeOfTool()) && Tool.isArrow(((Tool) this.item).getTypeOfTool()))
+                return true;
+        }
+
+        if (obj instanceof Item && this.item instanceof Item) {
             if (Item.isCoal(obj) && Item.isCoal(this.item))
                 return true;
-            else if (Item.isFiber(obj) && Item.isFiber(this.item))
+            if (Item.isFiber(obj) && Item.isFiber(this.item))
                 return true;
-            else if (Item.isIron(obj) && Item.isIron(this.item))
+            if (Item.isIron(obj) && Item.isIron(this.item))
                 return true;
-            else if (Item.isStone(obj) && Item.isStone(this.item))
+            if (Item.isStone(obj) && Item.isStone(this.item))
                 return true;
-            else if (Item.isSilex(obj) && Item.isSilex(this.item))
+            if (Item.isSilex(obj) && Item.isSilex(this.item))
                 return true;
-            else if (Item.isWood(obj) && Item.isWood(this.item))
+            if (Item.isWood(obj) && Item.isWood(this.item))
                 return true;
-            else return false;
-        } else return false;
+        }
+
+        return false;
     }
 
     public IntegerProperty nbItemsProperty() { return this.nbItems; }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/tools/Axe.java b/src/main/java/fr/sae/terraria/modele/entities/tools/Axe.java
deleted file mode 100644
index 3e38b7b..0000000
--- a/src/main/java/fr/sae/terraria/modele/entities/tools/Axe.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package fr.sae.terraria.modele.entities.tools;
-
-
-public class Axe extends Tool
-{
-
-
-    public Axe() { super(Tool.DEFAULT_DURABILITY); }
-
-    @Override public void use() { Tool.DEFAULT_WEAR(this); }
-}
diff --git a/src/main/java/fr/sae/terraria/modele/entities/tools/Bow.java b/src/main/java/fr/sae/terraria/modele/entities/tools/Bow.java
deleted file mode 100644
index 4ab6433..0000000
--- a/src/main/java/fr/sae/terraria/modele/entities/tools/Bow.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package fr.sae.terraria.modele.entities.tools;
-
-
-public class Bow extends Tool
-{
-
-
-    protected Bow(int durability) { super(durability); }
-
-    @Override public void use()
-    {
-
-    }
-}
diff --git a/src/main/java/fr/sae/terraria/modele/entities/tools/MaterialSet.java b/src/main/java/fr/sae/terraria/modele/entities/tools/MaterialSet.java
new file mode 100644
index 0000000..6def89c
--- /dev/null
+++ b/src/main/java/fr/sae/terraria/modele/entities/tools/MaterialSet.java
@@ -0,0 +1,8 @@
+package fr.sae.terraria.modele.entities.tools;
+
+
+public enum MaterialSet
+{
+    WOOD,
+    IRON;
+}
diff --git a/src/main/java/fr/sae/terraria/modele/entities/tools/Pickaxe.java b/src/main/java/fr/sae/terraria/modele/entities/tools/Pickaxe.java
deleted file mode 100644
index 2d8dfe2..0000000
--- a/src/main/java/fr/sae/terraria/modele/entities/tools/Pickaxe.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package fr.sae.terraria.modele.entities.tools;
-
-
-public class Pickaxe extends Tool
-{
-
-
-    public Pickaxe()
-    {
-        super(Tool.DEFAULT_DURABILITY);
-    }
-
-    @Override public void use() { Tool.DEFAULT_WEAR(this); }
-}
diff --git a/src/main/java/fr/sae/terraria/modele/entities/tools/Sword.java b/src/main/java/fr/sae/terraria/modele/entities/tools/Sword.java
deleted file mode 100644
index ec37ab8..0000000
--- a/src/main/java/fr/sae/terraria/modele/entities/tools/Sword.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package fr.sae.terraria.modele.entities.tools;
-
-
-public class Sword extends Tool
-{
-    public static final int DEFAULT_DAMAGE = 2;
-
-
-    public Sword(double material)
-    {
-        super(Tool.DEFAULT_DURABILITY);
-
-        this.material = material;
-    }
-
-    @Override public void use() { Tool.DEFAULT_WEAR(this); }
-}
diff --git a/src/main/java/fr/sae/terraria/modele/entities/tools/Tool.java b/src/main/java/fr/sae/terraria/modele/entities/tools/Tool.java
index fecc8a1..e817f88 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/tools/Tool.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/tools/Tool.java
@@ -5,33 +5,58 @@
 import javafx.beans.property.SimpleIntegerProperty;
 
 
-public abstract class Tool implements StowableObjectType
+public class Tool implements StowableObjectType
 {
     public static final double CRAFTED_WITH_WOOD = 1.;
     public static final double CRAFTED_WITH_IRON = 1.5;
 
     public static final int DEFAULT_DURABILITY = 100;
+    public static final int DEFAULT_DAMAGE = 1;
 
-    protected final IntegerProperty durability;
+    private final IntegerProperty durability;
 
-    protected double material;
+    private final MaterialSet material;
+    private final ToolSet tool;
 
 
-    protected Tool(final int durability)
+    public Tool(final ToolSet tool, final MaterialSet material)
     {
         super();
-        this.durability = new SimpleIntegerProperty(durability);
+        this.tool = tool;
+        this.material = material;
+        this.durability = new SimpleIntegerProperty(Tool.DEFAULT_DURABILITY);
     }
 
     /** Utilise l'outil */
-    public abstract void use();
+    public void use()
+    {
+        if (this.durability.get() > 0)
+            this.durability.set(this.durability.get() - 1);
+    }
 
-    public static void DEFAULT_WEAR(final Tool tool)
+    public double damage()
     {
-        if (tool.durability.get() > 0)
-            tool.durability.set(tool.durability.get() - 1);
+        if (this.tool == ToolSet.SWORD) {
+            if (this.material == MaterialSet.WOOD)
+                return Tool.DEFAULT_DAMAGE * Tool.CRAFTED_WITH_WOOD;
+            else if (this.material == MaterialSet.IRON)
+                return Tool.DEFAULT_DAMAGE * Tool.CRAFTED_WITH_IRON;
+        } else {
+            if (this.material == MaterialSet.WOOD)
+                return Tool.DEFAULT_DAMAGE * (Tool.CRAFTED_WITH_WOOD/2);
+            else if (this.material == MaterialSet.IRON)
+                return Tool.DEFAULT_DAMAGE * (Tool.CRAFTED_WITH_IRON/2);
+        }
+        return Tool.DEFAULT_DAMAGE;
     }
 
+    public static boolean isAxe(ToolSet tool) { return tool == ToolSet.AXE; }
+    public static boolean isBow(ToolSet tool) { return tool == ToolSet.BOW; }
+    public static boolean isPickaxe(ToolSet tool) { return tool == ToolSet.PICKAXE; }
+    public static boolean isSword(ToolSet tool) { return tool == ToolSet.SWORD; }
+    public static boolean isArrow(ToolSet tool) { return tool == ToolSet.ARROW; }
+
 
-    public double getMaterial() { return this.material; }
+    public ToolSet getTypeOfTool() { return this.tool; }
+    public MaterialSet getMaterial() { return this.material; }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/tools/ToolSet.java b/src/main/java/fr/sae/terraria/modele/entities/tools/ToolSet.java
new file mode 100644
index 0000000..4557712
--- /dev/null
+++ b/src/main/java/fr/sae/terraria/modele/entities/tools/ToolSet.java
@@ -0,0 +1,11 @@
+package fr.sae.terraria.modele.entities.tools;
+
+
+public enum ToolSet
+{
+    AXE,
+    BOW,
+    PICKAXE,
+    SWORD,
+    ARROW
+}
diff --git a/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java b/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java
index a622e8b..b4c2885 100644
--- a/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java
+++ b/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java
@@ -13,10 +13,7 @@
 import fr.sae.terraria.modele.entities.items.Vodka;
 import fr.sae.terraria.modele.entities.player.inventory.Inventory;
 import fr.sae.terraria.modele.entities.player.inventory.Stack;
-import fr.sae.terraria.modele.entities.tools.Axe;
-import fr.sae.terraria.modele.entities.tools.Bow;
-import fr.sae.terraria.modele.entities.tools.Pickaxe;
-import fr.sae.terraria.modele.entities.tools.Sword;
+import fr.sae.terraria.modele.entities.tools.Tool;
 import fr.sae.terraria.vue.View;
 import javafx.collections.ListChangeListener;
 import javafx.scene.image.Image;
@@ -114,19 +111,20 @@ else if (item instanceof Torch)
                         view.setImage(View.loadAnImage("tiles/torch.png", itemInventoryWidth, itemInventoryHeight));
                     else if (item instanceof Meat)
                         view.setImage(View.loadAnImage("loots/meat.png", itemInventoryWidth, itemInventoryHeight));
-                    else if (item instanceof Axe)
-                        view.setImage(null);    // TODO
-                    else if (item instanceof Bow)
-                        view.setImage(null);    // TODO
-                    else if (item instanceof Pickaxe)
-                        view.setImage(View.loadAnImage("tools/pickaxe.png", itemInventoryWidth, itemInventoryHeight));
-                    else if (item instanceof Sword)
-                        view.setImage(View.loadAnImage("tools/sword.png", itemInventoryWidth, itemInventoryHeight));
                     else if (item instanceof Arrow)
                         view.setImage(null);    // TODO
                     else if (item instanceof Vodka)
                         view.setImage(View.loadAnImage("loots/vodka.png", itemInventoryWidth,itemInventoryHeight));
-                    else if (item instanceof Item) {
+                    else if (item instanceof Tool) {
+                        if (Tool.isAxe(((Tool) item).getTypeOfTool()))
+                            view.setImage(null);    // TODO
+                        else if (Tool.isBow(((Tool) item).getTypeOfTool()))
+                            view.setImage(null);    // TODO
+                        else if (Tool.isPickaxe(((Tool) item).getTypeOfTool()))
+                            view.setImage(View.loadAnImage("tools/pickaxe.png", itemInventoryWidth, itemInventoryHeight));
+                        else if (Tool.isSword(((Tool) item).getTypeOfTool()))
+                            view.setImage(View.loadAnImage("tools/sword.png", itemInventoryWidth, itemInventoryHeight));
+                    } else if (item instanceof Item) {
                         if (Item.isCoal(item))
                             view.setImage(View.loadAnImage("loots/coal.png", itemInventoryWidth, itemInventoryHeight));
                         else if (Item.isFiber(item))
diff --git a/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java b/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java
index 1d7a33e..8b8e07e 100644
--- a/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java
+++ b/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java
@@ -12,10 +12,7 @@
 import fr.sae.terraria.modele.entities.items.Vodka;
 import fr.sae.terraria.modele.entities.player.Player;
 import fr.sae.terraria.modele.entities.player.inventory.Stack;
-import fr.sae.terraria.modele.entities.tools.Axe;
-import fr.sae.terraria.modele.entities.tools.Bow;
-import fr.sae.terraria.modele.entities.tools.Pickaxe;
-import fr.sae.terraria.modele.entities.tools.Sword;
+import fr.sae.terraria.modele.entities.tools.Tool;
 import fr.sae.terraria.vue.View;
 import javafx.collections.ListChangeListener;
 import javafx.scene.image.Image;
@@ -96,17 +93,18 @@ else if (item instanceof Meat)
                     this.itemSelectedImgView.setImage(this.meatItemImg);
                 else if (item instanceof Vodka)
                     this.itemSelectedImgView.setImage(this.vodkaItemImg);
-                else if (item instanceof Axe)
-                    this.itemSelectedImgView.setImage(null);
-                else if (item instanceof Bow)
-                    this.itemSelectedImgView.setImage(null);
-                else if (item instanceof Pickaxe)
-                    this.itemSelectedImgView.setImage(this.pickaxeItemImg);
-                else if (item instanceof Sword)
-                    this.itemSelectedImgView.setImage(this.swordItemImg);
                 else if (item instanceof Arrow)
                     this.itemSelectedImgView.setImage(null);
-                else if (item instanceof Item) {
+                else if (item instanceof Tool) {
+                    if (Tool.isAxe(((Tool) item).getTypeOfTool()))
+                        this.itemSelectedImgView.setImage(null);
+                    else if (Tool.isBow(((Tool) item).getTypeOfTool()))
+                        this.itemSelectedImgView.setImage(null);
+                    else if (Tool.isPickaxe(((Tool) item).getTypeOfTool()))
+                        this.itemSelectedImgView.setImage(this.pickaxeItemImg);
+                    else if (Tool.isSword(((Tool) item).getTypeOfTool()))
+                        this.itemSelectedImgView.setImage(this.swordItemImg);
+                } else if (item instanceof Item) {
                     if (Item.isCoal(item))
                         this.itemSelectedImgView.setImage(this.coalItemImg);
                     else if (Item.isFiber(item))

From 656a15f89564537866ff584adc56567db5f4cea9 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Sun, 12 Jun 2022 23:11:13 +0200
Subject: [PATCH 48/97] Simplification du code des blocks

---
 .../terraria/controller/MenuController.java   |   9 +-
 .../fr/sae/terraria/modele/Environment.java   |  10 +-
 .../sae/terraria/modele/GenerateEntity.java   |   4 +-
 .../java/fr/sae/terraria/modele/TileSet.java  |  25 +++-
 .../modele/entities/blocks/Block.java         | 128 ++++++++++++++++--
 .../modele/entities/blocks/BlockSet.java      |  14 ++
 .../terraria/modele/entities/blocks/Dirt.java |  81 -----------
 .../modele/entities/blocks/Grass.java         |  17 ---
 .../terraria/modele/entities/blocks/Rock.java |  90 ------------
 .../modele/entities/blocks/TallGrass.java     |  22 +--
 .../modele/entities/blocks/Torch.java         |  60 --------
 .../terraria/modele/entities/blocks/Tree.java |   6 +-
 .../entities/entity/BreakableObjectType.java  |   6 -
 .../entities/entity/PlaceableObjectType.java  |   2 -
 .../entities/player/inventory/Stack.java      |  24 ++--
 .../java/fr/sae/terraria/vue/LightView.java   |   6 +-
 .../fr/sae/terraria/vue/TileMapsView.java     |  52 ++++---
 .../sae/terraria/vue/hud/InventoryView.java   |  23 ++--
 .../terraria/vue/hud/ItemSelectedView.java    |  34 +++--
 .../modele/entities/player/PlayerTest.java    |   1 -
 .../player/inventory/InventoryTest.java       |   1 -
 21 files changed, 251 insertions(+), 364 deletions(-)
 create mode 100644 src/main/java/fr/sae/terraria/modele/entities/blocks/BlockSet.java
 delete mode 100644 src/main/java/fr/sae/terraria/modele/entities/blocks/Dirt.java
 delete mode 100644 src/main/java/fr/sae/terraria/modele/entities/blocks/Grass.java
 delete mode 100644 src/main/java/fr/sae/terraria/modele/entities/blocks/Rock.java
 delete mode 100644 src/main/java/fr/sae/terraria/modele/entities/blocks/Torch.java

diff --git a/src/main/java/fr/sae/terraria/controller/MenuController.java b/src/main/java/fr/sae/terraria/controller/MenuController.java
index d8334c7..372bc30 100644
--- a/src/main/java/fr/sae/terraria/controller/MenuController.java
+++ b/src/main/java/fr/sae/terraria/controller/MenuController.java
@@ -2,7 +2,8 @@
 
 import fr.sae.terraria.Terraria;
 import fr.sae.terraria.modele.Environment;
-import fr.sae.terraria.modele.entities.blocks.Rock;
+import fr.sae.terraria.modele.entities.blocks.Block;
+import fr.sae.terraria.modele.entities.blocks.BlockSet;
 import fr.sae.terraria.modele.entities.items.Item;
 import fr.sae.terraria.modele.entities.player.Player;
 import fr.sae.terraria.modele.entities.player.inventory.Stack;
@@ -65,14 +66,14 @@ public MenuController(final Stage stage)
         this.lexique4.addEventFilter(Event.ANY, ev -> {
             if (ev.getEventType().getName().equalsIgnoreCase("MOUSE_PRESSED")) {
                 int i = this.player.getInventory().get().size()-1;
-                while (i > 0 && !(this.player.getInventory().get().get(i).getItem().equals(Item.STONE)) && this.player.getInventory().get().get(i).getNbItems() >= Rock.STONE_LOOTS)
+                while (i > 0 && !(this.player.getInventory().get().get(i).getItem().equals(Item.STONE)) && this.player.getInventory().get().get(i).getNbItems() >= Block.ROCK_NB_LOOTS)
                     i--;
 
                 Stack stack = this.player.getInventory().get().get(i);
                 if (stack.getItem() instanceof Item && stack.getItem().equals(Item.STONE)) {
-                    for (int j = 0; j < Rock.STONE_LOOTS; j++)
+                    for (int j = 0; j < Block.ROCK_NB_LOOTS; j++)
                         stack.remove();
-                    this.player.pickup(new Rock(this.environment));
+                    this.player.pickup(new Block(BlockSet.ROCK, this.environment));
                 }
             }
         });
diff --git a/src/main/java/fr/sae/terraria/modele/Environment.java b/src/main/java/fr/sae/terraria/modele/Environment.java
index 0071a43..92bd859 100644
--- a/src/main/java/fr/sae/terraria/modele/Environment.java
+++ b/src/main/java/fr/sae/terraria/modele/Environment.java
@@ -4,7 +4,7 @@
 import fr.sae.terraria.modele.entities.Rabbit;
 import fr.sae.terraria.modele.entities.Slime;
 import fr.sae.terraria.modele.entities.blocks.Block;
-import fr.sae.terraria.modele.entities.blocks.Torch;
+import fr.sae.terraria.modele.entities.blocks.BlockSet;
 import fr.sae.terraria.modele.entities.blocks.Tree;
 import fr.sae.terraria.modele.entities.entity.CollideObjectType;
 import fr.sae.terraria.modele.entities.entity.Entity;
@@ -42,7 +42,7 @@ public class Environment
     private final ObservableList<Rabbit> rabbits;
     private final ObservableList<Slime> slimes;
     // Permet d'update facilement les lumières des torches sur le filtre
-    private final ObservableList<Torch> torches;
+    private final ObservableList<Block> torches;
 
     private final TileMaps tileMaps;
     private final Player player;
@@ -123,7 +123,7 @@ private void gameLoop()
         KeyFrame keyFrame = new KeyFrame(Duration.seconds(Terraria.TARGET_FPS), (ev -> {
             // TODO TEST
             if (!caught[0]) {
-                this.player.pickup(new Torch(this));
+                this.player.pickup(new Block(BlockSet.TORCH, this));
                 this.player.pickup(new Meat(this));
                 this.player.pickup(new Tool(ToolSet.PICKAXE, MaterialSet.IRON));
                 this.player.pickup(new Vodka(this));
@@ -145,7 +145,7 @@ private void gameLoop()
             boolean nightTime = this.clock.getMinutes() > (Clock.MINUTES_IN_A_DAY)/2;
             boolean weHaveChangedDay = this.previousDays != this.clock.getDays();
             if (weHaveChangedDay)
-                for (int i = 0; i < Tree.TREE_CLUSTER; i++) // Génère par jour, 3 arbres
+                for (int i = 0; i < 10; i++) // Génère par jour, 3 arbres
                     GenerateEntity.treeRandomly(this);
             if (dayTime) {  // Génère certaines entités uniquement pendant le jour
                 GenerateEntity.rabbitRandomly(this);
@@ -193,7 +193,7 @@ public static Clip playSound(String path, boolean loop)
     public ObservableList<Tree> getTrees() { return this.trees; }
     public ObservableList<Entity> getEntities() { return this.entities; }
     public ObservableList<Rabbit> getRabbits() { return this.rabbits; }
-    public ObservableList<Torch> getTorches() { return this.torches; }
+    public ObservableList<Block> getTorches() { return this.torches; }
     public ObservableList<Slime> getSlimes() { return this.slimes; }
     public TileMaps getTileMaps() { return this.tileMaps; }
     public Player getPlayer() { return this.player; }
diff --git a/src/main/java/fr/sae/terraria/modele/GenerateEntity.java b/src/main/java/fr/sae/terraria/modele/GenerateEntity.java
index 50301a0..3824ed5 100644
--- a/src/main/java/fr/sae/terraria/modele/GenerateEntity.java
+++ b/src/main/java/fr/sae/terraria/modele/GenerateEntity.java
@@ -2,6 +2,8 @@
 
 import fr.sae.terraria.modele.entities.Rabbit;
 import fr.sae.terraria.modele.entities.Slime;
+import fr.sae.terraria.modele.entities.blocks.Block;
+import fr.sae.terraria.modele.entities.blocks.BlockSet;
 import fr.sae.terraria.modele.entities.blocks.TallGrass;
 import fr.sae.terraria.modele.entities.blocks.Tree;
 import fr.sae.terraria.modele.entities.entity.Entity;
@@ -17,7 +19,6 @@
 import static fr.sae.terraria.modele.entities.Slime.WHEN_SPAWN_A_SLIME;
 import static fr.sae.terraria.modele.entities.blocks.TallGrass.TALL_GRASS_SPAWN_RATE;
 import static fr.sae.terraria.modele.entities.blocks.TallGrass.WHEN_SPAWN_A_TALL_GRASS;
-import static fr.sae.terraria.modele.entities.blocks.Tree.TREE_SPAWN_RATE;
 
 
 /**
@@ -26,6 +27,7 @@
  */
 public class GenerateEntity
 {
+    private static final int TREE_SPAWN_RATE = 2500;
     public static final int MAX_SPAWN_RABBIT = 100;
     public static final int MAX_SPAWN_SLIME = 100;
     private static final Random random = new Random();
diff --git a/src/main/java/fr/sae/terraria/modele/TileSet.java b/src/main/java/fr/sae/terraria/modele/TileSet.java
index 8457896..2a0a3f6 100644
--- a/src/main/java/fr/sae/terraria/modele/TileSet.java
+++ b/src/main/java/fr/sae/terraria/modele/TileSet.java
@@ -1,5 +1,7 @@
 package fr.sae.terraria.modele;
 
+import fr.sae.terraria.modele.entities.blocks.BlockSet;
+
 
 public enum TileSet
 {
@@ -8,7 +10,9 @@ public enum TileSet
     DIRT,
     FLOOR_TOP,
     FLOOR_LEFT,
-    FLOOR_RIGHT;
+    FLOOR_RIGHT,
+    TALL_GRASS,
+    TREE;
 
 
     public static boolean isSkyTile(TileSet item) { return item == TileSet.SKY; }
@@ -17,4 +21,23 @@ public enum TileSet
     public static boolean isFloorTopTile(TileSet item) { return item == TileSet.FLOOR_TOP; }
     public static boolean isFloorRightTile(TileSet item) { return item == TileSet.FLOOR_RIGHT; }
     public static boolean isFloorLeftTile(TileSet item) { return item == TileSet.FLOOR_LEFT; }
+
+    public static TileSet getTileSet(BlockSet blockSet)
+    {
+        if (blockSet == BlockSet.DIRT)
+            return TileSet.DIRT;
+        if (blockSet == BlockSet.ROCK)
+            return TileSet.ROCK;
+        if (blockSet == BlockSet.FLOOR_LEFT)
+            return TileSet.FLOOR_LEFT;
+        if (blockSet == BlockSet.FLOOR_RIGHT)
+            return TileSet.FLOOR_RIGHT;
+        if (blockSet == BlockSet.FLOOR_TOP)
+            return TileSet.FLOOR_TOP;
+        if (blockSet == BlockSet.TALL_GRASS)
+            return TileSet.TALL_GRASS;
+        if (blockSet == BlockSet.TREE)
+            return TileSet.TREE;
+        return null;
+    }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
index 4939e52..109d1fc 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
@@ -2,23 +2,49 @@
 
 import fr.sae.terraria.Terraria;
 import fr.sae.terraria.modele.Environment;
+import fr.sae.terraria.modele.TileSet;
 import fr.sae.terraria.modele.entities.entity.BreakableObjectType;
 import fr.sae.terraria.modele.entities.entity.Entity;
+import fr.sae.terraria.modele.entities.entity.PlaceableObjectType;
+import fr.sae.terraria.modele.entities.entity.StowableObjectType;
+import fr.sae.terraria.modele.entities.items.Item;
+import fr.sae.terraria.modele.entities.items.Vodka;
+import fr.sae.terraria.modele.entities.player.Player;
+import fr.sae.terraria.modele.entities.player.inventory.Inventory;
 import javafx.animation.KeyFrame;
 import javafx.animation.Timeline;
 import javafx.util.Duration;
 
+import java.util.Objects;
 
-public abstract class Block extends Entity implements BreakableObjectType
+
+public class Block extends Entity implements BreakableObjectType, PlaceableObjectType, StowableObjectType
 {
+    public static final int ROCK_NB_LOOTS = 3;
+    public static final int DEFAULT_RESISTANCE = 2;
+
+    private final Environment environment;
+    private final BlockSet typeOfBlock;
 
+    private final double xOrigin;
+    private final double yOrigin;
 
-    protected Block(int x, int y)
+
+    public Block(final BlockSet typeOfBlock, final Environment environment, int x, int y)
     {
         super(x, y);
+        this.typeOfBlock = typeOfBlock;
+        this.environment = environment;
+
+        this.xOrigin = x;
+        this.yOrigin = y;
+
+        this.pv.set(Block.DEFAULT_RESISTANCE);
     }
 
-    protected void breakAnimation(final Environment environment, final Block block, double xOrigin, double yOrigin)
+    public Block(final BlockSet typeOfBlock, final Environment environment) { this(typeOfBlock, environment, 0, 0); }
+
+    private void breakAnimation()
     {
         Timeline timeline = new Timeline();
         int animationCycleCount = 5;
@@ -26,21 +52,105 @@ protected void breakAnimation(final Environment environment, final Block block,
         // Animation de cassure du bloc
         timeline.setCycleCount(animationCycleCount);
         KeyFrame keyFrame = new KeyFrame(Duration.seconds(Terraria.TARGET_FPS), (ev -> {
-            block.setX(xOrigin + (Math.cos(time[0])*environment.scaleMultiplicatorWidth));
-            block.setY(yOrigin + (-Math.sin(time[0]*environment.scaleMultiplicatorHeight)));
+            this.setX(xOrigin + (Math.cos(time[0])*environment.scaleMultiplicatorWidth));
+            this.setY(yOrigin + (-Math.sin(time[0]*environment.scaleMultiplicatorHeight)));
 
             time[0]++;
         }));
         timeline.getKeyFrames().add(keyFrame);
         // Faire revenir le bloc à sa position initiale lorsque l'animation est terminée
         timeline.statusProperty().addListener(c -> {
-            block.setX(xOrigin);
-            block.setY(yOrigin);
+            this.setX(xOrigin);
+            this.setY(yOrigin);
         });
         timeline.play();
     }
 
-    @Override public abstract void updates();
+    private void loots()
+    {
+        Player player = this.environment.getPlayer();
+
+        if (this.typeOfBlock == BlockSet.FLOOR_TOP || this.typeOfBlock == BlockSet.FLOOR_LEFT || this.typeOfBlock == BlockSet.FLOOR_RIGHT) {
+            player.pickup(new Block(BlockSet.FLOOR_TOP, this.environment));
+        } else if (this.typeOfBlock == BlockSet.DIRT) {
+            player.pickup(new Block(BlockSet.DIRT, this.environment, 0, 0));
+        } else if (this.typeOfBlock == BlockSet.ROCK) {
+            for (int loot = 0; loot < Block.ROCK_NB_LOOTS; loot++)
+                player.pickup(Item.STONE);
+        } else if (this.typeOfBlock == BlockSet.TALL_GRASS) {
+            for (int loot = (int) (Math.random()*3)+1; loot < TallGrass.LOOTS_FIBRE_MAX; loot++)
+                player.pickup(Item.FIBER);
+
+            boolean mustDropVodka = Math.random() < Vodka.DROP_RATE;
+            if (mustDropVodka)
+                player.pickup(new Vodka(this.environment));
+        } else if (this.typeOfBlock == BlockSet.TORCH) {
+            player.pickup(new Block(BlockSet.TORCH, this.environment));
+        } else if (this.typeOfBlock == BlockSet.TREE) {
+            player.pickup(new Block(BlockSet.TREE, this.environment));
+        }
+    }
+
+    @Override public void updates() { }
+
+    @Override public void breaks()
+    {
+        if (this.typeOfBlock == BlockSet.ROCK)
+            Environment.playSound("sound/brick" + ((int) (Math.random()*2)+1) + ".wav", false);
+        else if (this.typeOfBlock == BlockSet.TALL_GRASS)
+            Environment.playSound("sound/cut.wav", false);
+        else Environment.playSound("sound/grassyStep.wav", false);
+        this.breakAnimation();
+
+        if (this.getPv() <= 0) {
+            this.loots();
+
+            int yIndexTile = (int) (getY()/environment.heightTile);
+            int xIndexTile = (int) (getX()/environment.widthTile);
+            this.environment.getTileMaps().setTile(TileSet.SKY.ordinal(), yIndexTile, xIndexTile);
+            this.environment.getEntities().remove(this);
+            this.environment.getBlocks().remove(this);
+        }
+
+        this.setPv(this.getPv() - 1);
+    }
+
+    @Override public void place(final int x, final int y)
+    {
+        Environment.playSound("sound/axchop.wav", false);
+        int widthTile = this.environment.widthTile;
+        int heightTile = this.environment.heightTile;
+
+        Block block = new Block(this.typeOfBlock, this.environment, x*widthTile, y*heightTile);
+        block.setRect(widthTile, heightTile);
+
+        Player player = this.environment.getPlayer();
+        Inventory inventory = player.getInventory();
+        if (!Objects.isNull(player.getStackSelected()))
+            inventory.get().get(inventory.getPosCursor()).remove();
+
+        TileSet tile = TileSet.getTileSet(this.typeOfBlock);
+        if (!Objects.isNull(tile))
+            this.environment.getTileMaps().setTile(tile.ordinal(), y, x);
+        this.environment.getEntities().add(block);
+        this.environment.getBlocks().add(block);
+
+        if (this.typeOfBlock == BlockSet.TREE)
+            this.environment.getTrees().add((Tree) block);
+        if (this.typeOfBlock == BlockSet.TORCH)
+            this.environment.getTorches().add(block);
+
+    }
+
+    public static boolean isFloorTop(final Block block) { return block.getTypeOfBlock() == BlockSet.FLOOR_TOP; }
+    public static boolean isFloorLeft(final Block block) { return block.getTypeOfBlock() == BlockSet.FLOOR_LEFT; }
+    public static boolean isFloorRight(final Block block) { return block.getTypeOfBlock() == BlockSet.FLOOR_RIGHT; }
+    public static boolean isDirt(final Block block) { return block.getTypeOfBlock() == BlockSet.DIRT; }
+    public static boolean isRock(final Block block) { return block.getTypeOfBlock() == BlockSet.ROCK; }
+    public static boolean isTallGrass(final Block block) { return block.getTypeOfBlock() == BlockSet.TALL_GRASS; }
+    public static boolean isTorch(final Block block) { return block.getTypeOfBlock() == BlockSet.TORCH; }
+
+
 
-    public static boolean isDirt(Object obj) { return obj instanceof Dirt; }
+    public BlockSet getTypeOfBlock() { return this.typeOfBlock; }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/BlockSet.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/BlockSet.java
new file mode 100644
index 0000000..2de0c16
--- /dev/null
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/BlockSet.java
@@ -0,0 +1,14 @@
+package fr.sae.terraria.modele.entities.blocks;
+
+
+public enum BlockSet
+{
+    FLOOR_TOP,
+    FLOOR_RIGHT,
+    FLOOR_LEFT,
+    DIRT,
+    ROCK,
+    TALL_GRASS,
+    TORCH,
+    TREE
+}
diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/Dirt.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/Dirt.java
deleted file mode 100644
index 8593925..0000000
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/Dirt.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package fr.sae.terraria.modele.entities.blocks;
-
-import fr.sae.terraria.modele.Environment;
-import fr.sae.terraria.modele.TileSet;
-import fr.sae.terraria.modele.entities.entity.CollideObjectType;
-import fr.sae.terraria.modele.entities.entity.Entity;
-import fr.sae.terraria.modele.entities.entity.PlaceableObjectType;
-import fr.sae.terraria.modele.entities.entity.StowableObjectType;
-import fr.sae.terraria.modele.entities.player.Player;
-import fr.sae.terraria.modele.entities.player.inventory.Inventory;
-
-import java.util.Objects;
-
-
-public class Dirt extends Block implements StowableObjectType, CollideObjectType, PlaceableObjectType
-{
-    public static final int BREAK_RESISTANCE = 2;
-
-    private final Environment environment;
-
-    private final double xOrigin;
-    private final double yOrigin;
-    private TileSet typeOfFloor;
-
-
-    public Dirt(Environment environment, int x, int y)
-    {
-        super(x, y);
-        this.environment = environment;
-
-        this.xOrigin = x;
-        this.yOrigin = y;
-
-        this.pv.set(Dirt.BREAK_RESISTANCE);
-    }
-
-    @Override public void updates() { /* TODO document why this method is empty */ }
-
-    @Override public void collide() { /* NE RIEN REMPLIR */ }
-
-    @Override public void breaks()
-    {
-        Environment.playSound("sound/grassyStep.wav", false);
-        this.breakAnimation(environment, this, xOrigin, yOrigin);
-
-        if (this.getPv() <= 0) {
-            this.environment.getPlayer().pickup(this);
-
-            int yIndexTile = (int) (getY()/environment.heightTile);
-            int xIndexTile = (int) (getX()/environment.widthTile);
-            this.environment.getTileMaps().setTile(TileSet.SKY.ordinal(), yIndexTile, xIndexTile);
-            this.environment.getEntities().remove(this);
-            this.environment.getBlocks().remove(this);
-        }
-        this.setPv(this.getPv() - 1);
-    }
-
-    @Override public void place(final int x, final int y)
-    {
-        Environment.playSound("sound/axchop.wav", false);
-        int widthTile = this.environment.widthTile;
-        int heightTile = this.environment.heightTile;
-
-        Entity entity = new Dirt(this.environment, x*widthTile, y*heightTile);
-        entity.setRect(widthTile, heightTile);
-
-        Player player = this.environment.getPlayer();
-        Inventory inventory = player.getInventory();
-        if (!Objects.isNull(player.getStackSelected()))
-            inventory.get().get(inventory.getPosCursor()).remove();
-
-        this.environment.getTileMaps().setTile(TileSet.DIRT.ordinal(), y, x);
-        this.environment.getEntities().add(entity);
-        this.environment.getBlocks().add((Dirt) entity);
-    }
-
-
-    public TileSet getTypeOfFloor() { return this.typeOfFloor; }
-
-    public void setTypeOfFloor(TileSet type) { this.typeOfFloor = type; }
-}
diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/Grass.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/Grass.java
deleted file mode 100644
index 7e07df6..0000000
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/Grass.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package fr.sae.terraria.modele.entities.blocks;
-
-import fr.sae.terraria.modele.Environment;
-
-public class Grass extends Block
-{
-
-
-    public Grass(int x, int y) { super(x, y); }
-
-    @Override public void updates() { /* TODO document why this method is empty */ }
-
-    @Override public void breaks()
-    {
-        Environment.playSound("sound/grassyStep.wav", false);
-    }
-}
diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/Rock.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/Rock.java
deleted file mode 100644
index e648461..0000000
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/Rock.java
+++ /dev/null
@@ -1,90 +0,0 @@
-package fr.sae.terraria.modele.entities.blocks;
-
-import fr.sae.terraria.modele.Environment;
-import fr.sae.terraria.modele.TileSet;
-import fr.sae.terraria.modele.entities.entity.CollideObjectType;
-import fr.sae.terraria.modele.entities.entity.PlaceableObjectType;
-import fr.sae.terraria.modele.entities.entity.StowableObjectType;
-import fr.sae.terraria.modele.entities.items.Item;
-import fr.sae.terraria.modele.entities.player.Player;
-import fr.sae.terraria.modele.entities.player.inventory.Inventory;
-import fr.sae.terraria.modele.entities.player.inventory.Stack;
-import fr.sae.terraria.modele.entities.tools.Tool;
-
-import java.util.Objects;
-
-
-public class Rock extends Block implements StowableObjectType, CollideObjectType, PlaceableObjectType
-{
-    public static final int BREAK_RESISTANCE = 5;
-    public static final int STONE_LOOTS = 3;
-
-    private final Environment environment;
-
-    private final double xOrigin;
-    private final double yOrigin;
-
-
-    public Rock(Environment environment, int x, int y)
-    {
-        super(x, y);
-        this.environment = environment;
-
-        this.xOrigin = x;
-        this.yOrigin = y;
-
-        this.pv.set(Rock.BREAK_RESISTANCE);
-    }
-
-    public Rock(Environment environment) { this(environment, 0, 0); }
-
-    @Override public void updates() { /* TODO document why this method is empty */ }
-
-    @Override public void collide() { /* NE RIEN REMPLIR */ }
-
-    @Override public void breaks()
-    {
-        Environment.playSound("sound/brick" + ((int) (Math.random()*2)+1) + ".wav", false);
-        this.breakAnimation(this.environment, this, this.xOrigin, this.yOrigin);
-
-        // Une fois le bloc cassé, de la pierre est ramassée et le bloc se supprime du Pane
-        Player player = this.environment.getPlayer();
-        if (this.getPv() <= 0) {
-            for (int i = 0; i < 3; i++)
-                player.pickup(Item.STONE);
-
-            int yIndexTile = (int) (getY()/this.environment.heightTile);
-            int xIndexTile = (int) (getX()/this.environment.widthTile);
-            this.environment.getTileMaps().setTile(TileSet.SKY.ordinal(), yIndexTile, xIndexTile);
-            this.environment.getEntities().remove(this);
-            this.environment.getBlocks().remove(this);
-        }
-
-        // Peu importe l'outil qu'utilise le joueur, si c'est un outil, il perdra de la durabilité, mais le bloc ne peut que se casser avec une pioche
-        Stack stack = player.getStackSelected();
-        if (!Objects.isNull(stack) && stack.getItem() instanceof Tool) {
-            if (Tool.isPickaxe(((Tool) stack.getItem()).getTypeOfTool()))
-                this.setPv(this.getPv() - 1);
-            ((Tool) stack.getItem()).use();
-        }
-    }
-
-    @Override public void place(int x, int y)
-    {
-        Environment.playSound("sound/axchop.wav", false);
-        int widthTile = this.environment.widthTile;
-        int heightTile = this.environment.heightTile;
-
-        Block entity = new Rock(this.environment, x*widthTile, y*heightTile);
-        entity.setRect(widthTile, heightTile);
-
-        Player player = this.environment.getPlayer();
-        Inventory inventory = player.getInventory();
-        if (!Objects.isNull(player.getStackSelected()))
-            inventory.get().get(inventory.getPosCursor()).remove();
-
-        this.environment.getTileMaps().setTile(TileSet.ROCK.ordinal(), y, x);
-        this.environment.getEntities().add(entity);
-        this.environment.getBlocks().add(entity);
-    }
-}
diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/TallGrass.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/TallGrass.java
index da4db4f..2311f99 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/TallGrass.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/TallGrass.java
@@ -5,8 +5,6 @@
 import fr.sae.terraria.modele.entities.entity.Entity;
 import fr.sae.terraria.modele.entities.entity.ReproductiveObjectType;
 import fr.sae.terraria.modele.entities.entity.SpawnableObjectType;
-import fr.sae.terraria.modele.entities.items.Item;
-import fr.sae.terraria.modele.entities.items.Vodka;
 import javafx.beans.property.DoubleProperty;
 import javafx.beans.property.SimpleDoubleProperty;
 
@@ -28,9 +26,9 @@ public class TallGrass extends Block implements ReproductiveObjectType, Spawnabl
     private final Environment environment;
 
 
-    public TallGrass(Environment environment, int x, int y)
+    public TallGrass(final Environment environment, int x, int y)
     {
-        super(x, y);
+        super(BlockSet.TALL_GRASS, environment, x, y);
         this.environment = environment;
 
         this.tallGrassGrowth = new SimpleDoubleProperty(0);
@@ -45,22 +43,6 @@ public TallGrass(Environment environment, int x, int y)
             tallGrassGrowth.set(tallGrassGrowth.get() + TallGrass.GROWTH_SPEED);
     }
 
-    /** Joue un son et donne au joueur entre 1 et 3 fibres */
-    @Override public void breaks()
-    {
-        Environment.playSound("sound/cut.wav", false);
-
-        for (int loot = (int) (Math.random()*3)+1; loot < LOOTS_FIBRE_MAX; loot++)
-            this.environment.getPlayer().pickup(Item.FIBER);
-
-        boolean mustDropVodka = Math.random() < Vodka.DROP_RATE;
-        if (mustDropVodka)
-            this.environment.getPlayer().pickup(new Vodka(environment));
-
-        this.environment.getEntities().remove(this);
-        this.environment.getBlocks().remove(this);
-    }
-
     /** Reproduit des hautes herbes à gauche et à droite de celle parente */
     @Override public List<Entity> reproduction(Environment environment)
     {
diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/Torch.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/Torch.java
deleted file mode 100644
index 35bdb53..0000000
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/Torch.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package fr.sae.terraria.modele.entities.blocks;
-
-import fr.sae.terraria.modele.Environment;
-import fr.sae.terraria.modele.entities.entity.PlaceableObjectType;
-import fr.sae.terraria.modele.entities.entity.StowableObjectType;
-import fr.sae.terraria.modele.entities.player.Player;
-import fr.sae.terraria.modele.entities.player.inventory.Inventory;
-
-import java.util.Objects;
-
-
-public class Torch extends Block implements StowableObjectType, PlaceableObjectType
-{
-    private final Environment environment;
-
-    private double xOrigin;
-    private double yOrigin;
-
-
-    public Torch(final Environment environment, int x, int y)
-    {
-        super(x, y);
-        this.environment = environment;
-
-        this.xOrigin = x;
-        this.yOrigin = y;
-    }
-
-    public Torch(final Environment environment) { this(environment, 0, 0); }
-
-    @Override public void updates() { /* TODO document why this method is empty */ }
-
-    @Override public void breaks()
-    {
-        this.breakAnimation(environment, this, xOrigin, yOrigin);
-
-        this.environment.getPlayer().pickup(this);
-
-        this.environment.getEntities().remove(this);
-        this.environment.getTorches().remove(this);
-        this.environment.getBlocks().remove(this);
-    }
-
-    @Override public void place(int x, int y)
-    {
-        Environment.playSound("sound/axchop.wav", false);
-
-        Torch entity = new Torch(this.environment, x*environment.widthTile, y*environment.heightTile);
-        entity.setRect(environment.widthTile, environment.heightTile);
-
-        Player player = this.environment.getPlayer();
-        Inventory inventory = player.getInventory();
-        if (!Objects.isNull(player.getStackSelected()))
-            inventory.get().get(inventory.getPosCursor()).remove();
-
-        environment.getEntities().add(entity);
-        environment.getTorches().add(0, entity);
-        environment.getBlocks().add(entity);
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/Tree.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/Tree.java
index 42d9193..5271002 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/Tree.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/Tree.java
@@ -13,13 +13,13 @@ public class Tree extends Block implements SpawnableObjectType
     private final Environment environment;
 
 
-    public Tree(Environment environment, int x, int y)
+    public Tree(final Environment environment, int x, int y)
     {
-        super(x, y);
+        super(BlockSet.TREE, environment, x, y);
         this.environment = environment;
     }
 
-    public Tree(Environment environment) { this(environment, 0, 0); }
+    public Tree(final Environment environment) { this(environment, 0, 0); }
 
     @Override public void updates() { /* TODO document why this method is empty */ }
 
diff --git a/src/main/java/fr/sae/terraria/modele/entities/entity/BreakableObjectType.java b/src/main/java/fr/sae/terraria/modele/entities/entity/BreakableObjectType.java
index e076a99..ea05aa6 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/entity/BreakableObjectType.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/entity/BreakableObjectType.java
@@ -1,8 +1,6 @@
 package fr.sae.terraria.modele.entities.entity;
 
 
-import fr.sae.terraria.modele.entities.blocks.Rock;
-
 /**
  * <h1>Breakable Object Type</h1>
  * <h2>Interface utile à un objet qui hérite d'Entity</h2>
@@ -19,10 +17,6 @@ public interface BreakableObjectType
     /**
      * Fonction appelée lorsqu'une entité tente de casser une autre entité
      *  Permet de faire des actions personnalisées.
-     *
-     * @see fr.sae.terraria.modele.entities.blocks.Dirt
-     * @see fr.sae.terraria.modele.entities.blocks.TallGrass
-     * @see Rock
      */
     void breaks();
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/entity/PlaceableObjectType.java b/src/main/java/fr/sae/terraria/modele/entities/entity/PlaceableObjectType.java
index 2720b5f..8c66ebf 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/entity/PlaceableObjectType.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/entity/PlaceableObjectType.java
@@ -1,8 +1,6 @@
 package fr.sae.terraria.modele.entities.entity;
 
 
-import fr.sae.terraria.modele.entities.blocks.Rock;
-
 /**
  * <h1>Placeable Object Type</h1>
  * <h2>Interface utile sur les objets qui héritent de block</h2>
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
index 0c1edea..b93dc9d 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
@@ -1,10 +1,7 @@
 package fr.sae.terraria.modele.entities.player.inventory;
 
-import fr.sae.terraria.modele.entities.Arrow;
-import fr.sae.terraria.modele.entities.blocks.Dirt;
-import fr.sae.terraria.modele.entities.blocks.Rock;
+import fr.sae.terraria.modele.entities.blocks.Block;
 import fr.sae.terraria.modele.entities.blocks.TallGrass;
-import fr.sae.terraria.modele.entities.blocks.Torch;
 import fr.sae.terraria.modele.entities.entity.StowableObjectType;
 import fr.sae.terraria.modele.entities.items.Item;
 import fr.sae.terraria.modele.entities.items.Meat;
@@ -37,19 +34,22 @@ public Stack()
 
     public boolean isSameItem(StowableObjectType obj)
     {
-        if (obj instanceof Dirt && this.item instanceof Dirt)
-            return true;
-        if (obj instanceof Rock && this.item instanceof Rock)
-            return true;
-        if (obj instanceof TallGrass && this.item instanceof TallGrass)
-            return true;
-        if (obj instanceof Torch && this.item instanceof Torch)
-            return true;
         if (obj instanceof Meat && this.item instanceof Meat)
             return true;
         if (obj instanceof Vodka && this.item instanceof Vodka)
             return true;
 
+        if (obj instanceof Block && this.item instanceof Block) {
+            if (Block.isDirt((Block) obj) && Block.isDirt((Block) this.item))
+                return true;
+            if (Block.isRock((Block) obj) && Block.isRock((Block) this.item))
+                return true;
+            if (Block.isTallGrass((Block) obj) && Block.isTallGrass((Block) this.item))
+                return true;
+            if (Block.isTorch((Block) obj) && Block.isTorch((Block) this.item))
+                return true;
+        }
+
         if (obj instanceof Tool && this.item instanceof Tool) {
             if (Tool.isAxe(((Tool) obj).getTypeOfTool()) && Tool.isAxe(((Tool) this.item).getTypeOfTool()))
                 return true;
diff --git a/src/main/java/fr/sae/terraria/vue/LightView.java b/src/main/java/fr/sae/terraria/vue/LightView.java
index 49e149d..ca5c2ec 100644
--- a/src/main/java/fr/sae/terraria/vue/LightView.java
+++ b/src/main/java/fr/sae/terraria/vue/LightView.java
@@ -3,7 +3,7 @@
 import fr.sae.terraria.modele.Clock;
 import fr.sae.terraria.modele.Environment;
 import fr.sae.terraria.modele.TileMaps;
-import fr.sae.terraria.modele.entities.blocks.Torch;
+import fr.sae.terraria.modele.entities.blocks.Block;
 import javafx.collections.ListChangeListener;
 import javafx.collections.ObservableList;
 import javafx.scene.layout.Pane;
@@ -57,8 +57,8 @@ public LightView(Clock clock, Pane filterPane, Environment env) {
         this.initTorchListener(env.getTorches());
     }
 
-    private void initTorchListener(ObservableList<Torch> torches) {
-        torches.addListener((ListChangeListener<? super Torch>) c -> {
+    private void initTorchListener(ObservableList<Block> torches) {
+        torches.addListener((ListChangeListener<? super Block>) c -> {
             while(c.next()){
                 this.filterPane.getChildren().clear();
                 addTochLights();
diff --git a/src/main/java/fr/sae/terraria/vue/TileMapsView.java b/src/main/java/fr/sae/terraria/vue/TileMapsView.java
index fdf25ae..235c4b5 100644
--- a/src/main/java/fr/sae/terraria/vue/TileMapsView.java
+++ b/src/main/java/fr/sae/terraria/vue/TileMapsView.java
@@ -5,7 +5,10 @@
 import fr.sae.terraria.modele.TileSet;
 import fr.sae.terraria.modele.entities.Rabbit;
 import fr.sae.terraria.modele.entities.Slime;
-import fr.sae.terraria.modele.entities.blocks.*;
+import fr.sae.terraria.modele.entities.blocks.Block;
+import fr.sae.terraria.modele.entities.blocks.BlockSet;
+import fr.sae.terraria.modele.entities.blocks.TallGrass;
+import fr.sae.terraria.modele.entities.blocks.Tree;
 import fr.sae.terraria.vue.entities.RabbitView;
 import fr.sae.terraria.vue.entities.SlimeView;
 import javafx.collections.ListChangeListener;
@@ -114,22 +117,20 @@ private void updatesBlocksView(ListChangeListener.Change<? extends Block> c)
                 Block block = c.getAddedSubList().get(0);
 
                 blockView.setImage(null);
-                if (block instanceof Dirt) {
-                    Dirt dirt = (Dirt) block;
-                    if (TileSet.isFloorTopTile(dirt.getTypeOfFloor()))
-                        blockView.setImage(this.floorTopImg);
-                    else if (TileSet.isFloorLeftTile(dirt.getTypeOfFloor()))
-                        blockView.setImage(this.floorLeftImg);
-                    else if (TileSet.isFloorRightTile(dirt.getTypeOfFloor()))
-                        blockView.setImage(this.floorRightImg);
-                    else if (TileSet.isDirtTile(dirt.getTypeOfFloor()))
-                        blockView.setImage(this.dirtImg);
-                } else if (block instanceof Rock) {
+                if (Block.isDirt(block)) {
+                    blockView.setImage(this.dirtImg);
+                } else if (Block.isFloorTop(block)) {
+                    blockView.setImage(this.floorTopImg);
+                } else if (Block.isFloorLeft(block)) {
+                    blockView.setImage(this.floorLeftImg);
+                } else if (Block.isFloorRight(block)) {
+                    blockView.setImage(this.floorRightImg);
+                } else if (Block.isRock(block)) {
                     blockView.setImage(this.stoneImg);
-                } else if (block instanceof TallGrass) {
+                } else if (Block.isTallGrass(block)) {
                     blockView.setImage(this.tallGrassImg);
                     ((TallGrass) block).getTallGrassGrowthProperty().addListener((observable, oldValue, newValue) -> blockView.setViewport(new Rectangle2D(0, ((int) ((this.tallGrassImg.getHeight() / (TallGrass.GROWTH_TALL_GRASS_STEP) * newValue.intValue()) - tallGrassImg.getHeight())), this.tallGrassImg.getWidth(), this.tallGrassImg.getHeight())));
-                } else if (block instanceof Torch) {
+                } else if (Block.isTorch(block)) {
                     blockView.setImage(this.torchImg);
                 }
 
@@ -203,7 +204,7 @@ private void updatesSlimeView(ListChangeListener.Change<? extends Slime> c)
      *  @param c Cet argument est present car on passe cette fonction en tant que reference (this::updatesRabbitsView),
      *          l'argument est là pour obtenir les informations concernant les modifications dans liste <code>List<Block> rabbits;</code>
      */
-    private void updatesTreeView(ListChangeListener.Change<? extends Tree> c)
+    private void updatesTreeView(ListChangeListener.Change<? extends Block> c)
     {
         while (c.next()) {
             if (c.wasAdded()) {
@@ -255,7 +256,7 @@ private void updatesTreeView(ListChangeListener.Change<? extends Tree> c)
                 trunkFootView.setViewport(viewportTrunkFoot);
                 group.getChildren().add(trunkFootView);
 
-                Tree tree = c.getAddedSubList().get(0);
+                Tree tree = (Tree) c.getAddedSubList().get(0);
                 for (int i = 0; i < group.getChildren().size(); i++) {
                     ImageView treeView = (ImageView) group.getChildren().get(i);
 
@@ -281,27 +282,34 @@ private void updatesTreeView(ListChangeListener.Change<? extends Tree> c)
     public void displayMaps(TileMaps tiles)
     {
         for (int y = 0; y < tiles.getHeight() ; y++)
-            for (int x = 0 ; x < tiles.getWidth() ; x++)
+            for (int x = 0 ; x < tiles.getWidth() ; x++) {
+                int xBlock = x * this.tileWidth;
+                int yBlock = y * this.tileHeight;
+
                 if (tiles.isRockTile(x, y)) {
-                    Rock rockEntity = new Rock(this.environment, x*this.tileWidth, y*this.tileHeight);
+                    Block rockEntity = new Block(BlockSet.ROCK, this.environment, xBlock, yBlock);
                     rockEntity.setRect(this.tileWidth, this.tileHeight);
 
                     this.environment.getEntities().add(rockEntity);
                     this.environment.getBlocks().add(rockEntity);
                 } else if (tiles.isDirtTile(x, y)) {
-                    Dirt dirtSprite = new Dirt(this.environment, x*this.tileWidth, y*this.tileHeight);
-                    dirtSprite.setTypeOfFloor(TileSet.DIRT);
+                    Block dirtSprite = new Block(BlockSet.DIRT, this.environment, xBlock, yBlock);
                     dirtSprite.setRect(this.tileWidth, this.tileHeight);
 
                     this.environment.getEntities().add(dirtSprite);
                     this.environment.getBlocks().add(dirtSprite);
                 } else if (tiles.isFloorTopTile(x, y) || tiles.isFloorLeftTile(x, y) || tiles.isFloorRightTile(x, y)) {
-                    Dirt floorEntity = new Dirt(this.environment, x*this.tileWidth, y*this.tileHeight);
-                    floorEntity.setTypeOfFloor((tiles.isFloorTopTile(x, y)) ? TileSet.FLOOR_TOP : (tiles.isFloorRightTile(x, y)) ? TileSet.FLOOR_RIGHT : TileSet.FLOOR_LEFT);
+                    Block floorEntity = null;
+                    if (tiles.isFloorTopTile(x, y))
+                        floorEntity = new Block(BlockSet.FLOOR_TOP, this.environment, xBlock, yBlock);
+                    else if (tiles.isFloorLeftTile(x, y))
+                        floorEntity = new Block(BlockSet.FLOOR_LEFT, this.environment, xBlock, yBlock);
+                    else floorEntity = new Block(BlockSet.FLOOR_RIGHT, this.environment, xBlock, yBlock);
                     floorEntity.setRect(this.tileWidth, this.tileHeight);
 
                     this.environment.getEntities().add(floorEntity);
                     this.environment.getBlocks().add(floorEntity);
                 }
+            }
     }
 }
diff --git a/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java b/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java
index b4c2885..1c7efe5 100644
--- a/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java
+++ b/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java
@@ -4,9 +4,7 @@
 import fr.sae.terraria.modele.TileMaps;
 import fr.sae.terraria.modele.entities.Arrow;
 import fr.sae.terraria.modele.entities.blocks.Block;
-import fr.sae.terraria.modele.entities.blocks.Rock;
 import fr.sae.terraria.modele.entities.blocks.TallGrass;
-import fr.sae.terraria.modele.entities.blocks.Torch;
 import fr.sae.terraria.modele.entities.entity.StowableObjectType;
 import fr.sae.terraria.modele.entities.items.Item;
 import fr.sae.terraria.modele.entities.items.Meat;
@@ -101,21 +99,22 @@ private void displayItemIntoInventoryBar()
                     Stack stack = c.getAddedSubList().get(0);
                     StowableObjectType item = stack.getItem();
 
-                    if (Block.isDirt(item))
-                        view.setImage(View.loadAnImage("tiles/floor-top.png", itemInventoryWidth, itemInventoryHeight));
-                    else if (item instanceof Rock)
-                        view.setImage(View.loadAnImage("tiles/rock-fill.png", itemInventoryWidth, itemInventoryHeight));
-                    else if (item instanceof TallGrass)
-                        view.setImage(View.loadAnImage("tiles/tall-grass.png.png", itemInventoryWidth, itemInventoryHeight));
-                    else if (item instanceof Torch)
-                        view.setImage(View.loadAnImage("tiles/torch.png", itemInventoryWidth, itemInventoryHeight));
-                    else if (item instanceof Meat)
+                    if (item instanceof Meat)
                         view.setImage(View.loadAnImage("loots/meat.png", itemInventoryWidth, itemInventoryHeight));
                     else if (item instanceof Arrow)
                         view.setImage(null);    // TODO
                     else if (item instanceof Vodka)
                         view.setImage(View.loadAnImage("loots/vodka.png", itemInventoryWidth,itemInventoryHeight));
-                    else if (item instanceof Tool) {
+                    else if (item instanceof Block) {
+                        if (Block.isDirt((Block) item))
+                            view.setImage(View.loadAnImage("tiles/floor-top.png", itemInventoryWidth, itemInventoryHeight));
+                        else if (Block.isRock((Block) item))
+                            view.setImage(View.loadAnImage("tiles/rock-fill.png", itemInventoryWidth, itemInventoryHeight));
+                        else if (Block.isTallGrass((Block) item))
+                            view.setImage(View.loadAnImage("tiles/tall-grass.png.png", itemInventoryWidth, itemInventoryHeight));
+                        else if (Block.isTorch((Block) item))
+                            view.setImage(View.loadAnImage("tiles/torch.png", itemInventoryWidth, itemInventoryHeight));
+                    } else if (item instanceof Tool) {
                         if (Tool.isAxe(((Tool) item).getTypeOfTool()))
                             view.setImage(null);    // TODO
                         else if (Tool.isBow(((Tool) item).getTypeOfTool()))
diff --git a/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java b/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java
index 8b8e07e..6a90f61 100644
--- a/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java
+++ b/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java
@@ -2,10 +2,9 @@
 
 import fr.sae.terraria.modele.TileMaps;
 import fr.sae.terraria.modele.entities.Arrow;
-import fr.sae.terraria.modele.entities.blocks.Dirt;
-import fr.sae.terraria.modele.entities.blocks.Rock;
+import fr.sae.terraria.modele.entities.blocks.Block;
+import fr.sae.terraria.modele.entities.blocks.BlockSet;
 import fr.sae.terraria.modele.entities.blocks.TallGrass;
-import fr.sae.terraria.modele.entities.blocks.Torch;
 import fr.sae.terraria.modele.entities.entity.StowableObjectType;
 import fr.sae.terraria.modele.entities.items.Item;
 import fr.sae.terraria.modele.entities.items.Meat;
@@ -81,21 +80,26 @@ public ItemSelectedView(Pane display, Player player, double scaleMultiplicatorWi
             if (!Objects.isNull(player.getStackSelected())) {
                 StowableObjectType item = player.getStackSelected().getItem();
 
-                if (item instanceof Dirt)
-                    this.itemSelectedImgView.setImage(this.dirtItemImg);
-                else if (item instanceof Rock)
-                    this.itemSelectedImgView.setImage(this.rockItemImg);
-                else if (item instanceof TallGrass)
-                    this.itemSelectedImgView.setImage(null);
-                else if (item instanceof Torch)
-                    this.itemSelectedImgView.setImage(this.torchItemImg);
-                else if (item instanceof Meat)
+                if (item instanceof Meat)
                     this.itemSelectedImgView.setImage(this.meatItemImg);
                 else if (item instanceof Vodka)
                     this.itemSelectedImgView.setImage(this.vodkaItemImg);
                 else if (item instanceof Arrow)
                     this.itemSelectedImgView.setImage(null);
-                else if (item instanceof Tool) {
+
+                if (item instanceof Block)
+                {
+                    if (Block.isDirt((Block) item))
+                        this.itemSelectedImgView.setImage(this.dirtItemImg);
+                    else if (Block.isRock((Block) item))
+                        this.itemSelectedImgView.setImage(this.rockItemImg);
+                    else if (Block.isTallGrass((Block) item))
+                        this.itemSelectedImgView.setImage(null);
+                    else if (Block.isTorch((Block) item))
+                        this.itemSelectedImgView.setImage(this.torchItemImg);
+                }
+
+                if (item instanceof Tool) {
                     if (Tool.isAxe(((Tool) item).getTypeOfTool()))
                         this.itemSelectedImgView.setImage(null);
                     else if (Tool.isBow(((Tool) item).getTypeOfTool()))
@@ -104,7 +108,9 @@ else if (Tool.isPickaxe(((Tool) item).getTypeOfTool()))
                         this.itemSelectedImgView.setImage(this.pickaxeItemImg);
                     else if (Tool.isSword(((Tool) item).getTypeOfTool()))
                         this.itemSelectedImgView.setImage(this.swordItemImg);
-                } else if (item instanceof Item) {
+                }
+
+                if (item instanceof Item) {
                     if (Item.isCoal(item))
                         this.itemSelectedImgView.setImage(this.coalItemImg);
                     else if (Item.isFiber(item))
diff --git a/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java b/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
index 092fba5..39343c5 100644
--- a/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
+++ b/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
@@ -4,7 +4,6 @@
 import fr.sae.terraria.modele.TileMaps;
 import fr.sae.terraria.modele.TileSet;
 import fr.sae.terraria.modele.entities.Rabbit;
-import fr.sae.terraria.modele.entities.blocks.Dirt;
 import fr.sae.terraria.modele.entities.items.Meat;
 import fr.sae.terraria.modele.entities.items.Vodka;
 import javafx.geometry.Rectangle2D;
diff --git a/src/test/java/fr/sae/terraria/modele/entities/player/inventory/InventoryTest.java b/src/test/java/fr/sae/terraria/modele/entities/player/inventory/InventoryTest.java
index d2ecfb9..48d09ac 100644
--- a/src/test/java/fr/sae/terraria/modele/entities/player/inventory/InventoryTest.java
+++ b/src/test/java/fr/sae/terraria/modele/entities/player/inventory/InventoryTest.java
@@ -1,7 +1,6 @@
 package fr.sae.terraria.modele.entities.player.inventory;
 
 import fr.sae.terraria.modele.Environment;
-import fr.sae.terraria.modele.entities.blocks.Dirt;
 import fr.sae.terraria.modele.entities.player.Player;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;

From 11c7ee0b3bd6d553db8482b2da75507b83b9b149 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Sun, 12 Jun 2022 23:34:22 +0200
Subject: [PATCH 49/97] Fix rock

---
 .../fr/sae/terraria/modele/GenerateEntity.java     |  8 +++-----
 .../fr/sae/terraria/modele/entities/Slime.java     |  2 +-
 .../sae/terraria/modele/entities/blocks/Block.java | 14 ++++++++++++--
 .../modele/entities/player/inventory/Stack.java    | 11 +++++------
 .../sae/terraria/modele/entities/tools/Tool.java   | 10 +++++-----
 .../java/fr/sae/terraria/vue/TileMapsView.java     |  1 -
 .../fr/sae/terraria/vue/hud/InventoryView.java     |  9 ++++-----
 .../fr/sae/terraria/vue/hud/ItemSelectedView.java  | 10 ++++------
 8 files changed, 34 insertions(+), 31 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/modele/GenerateEntity.java b/src/main/java/fr/sae/terraria/modele/GenerateEntity.java
index 3824ed5..b97c487 100644
--- a/src/main/java/fr/sae/terraria/modele/GenerateEntity.java
+++ b/src/main/java/fr/sae/terraria/modele/GenerateEntity.java
@@ -2,8 +2,6 @@
 
 import fr.sae.terraria.modele.entities.Rabbit;
 import fr.sae.terraria.modele.entities.Slime;
-import fr.sae.terraria.modele.entities.blocks.Block;
-import fr.sae.terraria.modele.entities.blocks.BlockSet;
 import fr.sae.terraria.modele.entities.blocks.TallGrass;
 import fr.sae.terraria.modele.entities.blocks.Tree;
 import fr.sae.terraria.modele.entities.entity.Entity;
@@ -80,12 +78,12 @@ private static void generateAnEntity(Environment environment, SpawnableObjectTyp
     /** Range les positions du sol sur la ligne 'y' */
     private static List<Integer> findFloors(TileMaps tileMaps, int y)
     {
-        List<Integer> localisation = new ArrayList<>();
+        List<Integer> loc = new ArrayList<>();
         for (int x = 0; x < tileMaps.getWidth(); x++)
             if (tileMaps.isFloorTopTile(x, y) || tileMaps.isFloorRightTile(x, y) || tileMaps.isFloorLeftTile(x, y))
-                localisation.add(x);
+                loc.add(x);
 
-        return localisation;
+        return loc;
     }
 
     /** À un certain moment, grace au tick, il va générer des arbres +/- grand uniquement sur un sol */
diff --git a/src/main/java/fr/sae/terraria/modele/entities/Slime.java b/src/main/java/fr/sae/terraria/modele/entities/Slime.java
index dde2840..f798ecd 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/Slime.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/Slime.java
@@ -84,7 +84,7 @@ else if (environment.getPlayer().getX() < this.x.getValue())
 
         Stack stack = this.environment.getPlayer().getStackSelected();
         if (!Objects.isNull(stack)) {
-            if (Tool.isSword(((Tool) stack.getItem()).getTypeOfTool())) {
+            if (Tool.isSword((Tool) stack.getItem())) {
                 Tool tool = (Tool) stack.getItem();
                 this.setPv(this.getPv() - tool.damage());
             }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
index 109d1fc..1c0efb7 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
@@ -11,6 +11,9 @@
 import fr.sae.terraria.modele.entities.items.Vodka;
 import fr.sae.terraria.modele.entities.player.Player;
 import fr.sae.terraria.modele.entities.player.inventory.Inventory;
+import fr.sae.terraria.modele.entities.player.inventory.Stack;
+import fr.sae.terraria.modele.entities.tools.Tool;
+import fr.sae.terraria.modele.entities.tools.ToolSet;
 import javafx.animation.KeyFrame;
 import javafx.animation.Timeline;
 import javafx.util.Duration;
@@ -112,7 +115,15 @@ else if (this.typeOfBlock == BlockSet.TALL_GRASS)
             this.environment.getBlocks().remove(this);
         }
 
-        this.setPv(this.getPv() - 1);
+        if (isRock(this)) {
+            Stack item = this.environment.getPlayer().getStackSelected();
+            if (!Objects.isNull(item) && item.getItem() instanceof Tool) {
+                Tool tool = (Tool) item.getItem();
+                if (Tool.isPickaxe(tool))
+                    this.setPv(this.getPv() - 1);
+                tool.use();
+            }
+        } else this.setPv(this.getPv() - 1);
     }
 
     @Override public void place(final int x, final int y)
@@ -151,6 +162,5 @@ else if (this.typeOfBlock == BlockSet.TALL_GRASS)
     public static boolean isTorch(final Block block) { return block.getTypeOfBlock() == BlockSet.TORCH; }
 
 
-
     public BlockSet getTypeOfBlock() { return this.typeOfBlock; }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
index b93dc9d..6018d08 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
@@ -1,7 +1,6 @@
 package fr.sae.terraria.modele.entities.player.inventory;
 
 import fr.sae.terraria.modele.entities.blocks.Block;
-import fr.sae.terraria.modele.entities.blocks.TallGrass;
 import fr.sae.terraria.modele.entities.entity.StowableObjectType;
 import fr.sae.terraria.modele.entities.items.Item;
 import fr.sae.terraria.modele.entities.items.Meat;
@@ -51,15 +50,15 @@ public boolean isSameItem(StowableObjectType obj)
         }
 
         if (obj instanceof Tool && this.item instanceof Tool) {
-            if (Tool.isAxe(((Tool) obj).getTypeOfTool()) && Tool.isAxe(((Tool) this.item).getTypeOfTool()))
+            if (Tool.isAxe((Tool) obj) && Tool.isAxe((Tool) this.item))
                 return true;
-            if (Tool.isBow(((Tool) obj).getTypeOfTool()) && Tool.isBow(((Tool) this.item).getTypeOfTool()))
+            if (Tool.isBow((Tool) obj) && Tool.isBow((Tool) this.item))
                 return true;
-            if (Tool.isPickaxe(((Tool) obj).getTypeOfTool()) && Tool.isPickaxe(((Tool) this.item).getTypeOfTool()))
+            if (Tool.isPickaxe((Tool) obj) && Tool.isPickaxe((Tool) this.item))
                 return true;
-            if (Tool.isSword(((Tool) obj).getTypeOfTool()) && Tool.isSword(((Tool) this.item).getTypeOfTool()))
+            if (Tool.isSword((Tool) obj) && Tool.isSword((Tool) this.item))
                 return true;
-            if (Tool.isArrow(((Tool) obj).getTypeOfTool()) && Tool.isArrow(((Tool) this.item).getTypeOfTool()))
+            if (Tool.isArrow((Tool) obj) && Tool.isArrow((Tool) this.item))
                 return true;
         }
 
diff --git a/src/main/java/fr/sae/terraria/modele/entities/tools/Tool.java b/src/main/java/fr/sae/terraria/modele/entities/tools/Tool.java
index e817f88..f36e22b 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/tools/Tool.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/tools/Tool.java
@@ -50,11 +50,11 @@ else if (this.material == MaterialSet.IRON)
         return Tool.DEFAULT_DAMAGE;
     }
 
-    public static boolean isAxe(ToolSet tool) { return tool == ToolSet.AXE; }
-    public static boolean isBow(ToolSet tool) { return tool == ToolSet.BOW; }
-    public static boolean isPickaxe(ToolSet tool) { return tool == ToolSet.PICKAXE; }
-    public static boolean isSword(ToolSet tool) { return tool == ToolSet.SWORD; }
-    public static boolean isArrow(ToolSet tool) { return tool == ToolSet.ARROW; }
+    public static boolean isAxe(Tool tool) { return tool.getTypeOfTool() == ToolSet.AXE; }
+    public static boolean isBow(Tool tool) { return tool.getTypeOfTool() == ToolSet.BOW; }
+    public static boolean isPickaxe(Tool tool) { return tool.getTypeOfTool() == ToolSet.PICKAXE; }
+    public static boolean isSword(Tool tool) { return tool.getTypeOfTool() == ToolSet.SWORD; }
+    public static boolean isArrow(Tool tool) { return tool.getTypeOfTool() == ToolSet.ARROW; }
 
 
     public ToolSet getTypeOfTool() { return this.tool; }
diff --git a/src/main/java/fr/sae/terraria/vue/TileMapsView.java b/src/main/java/fr/sae/terraria/vue/TileMapsView.java
index 235c4b5..811dc87 100644
--- a/src/main/java/fr/sae/terraria/vue/TileMapsView.java
+++ b/src/main/java/fr/sae/terraria/vue/TileMapsView.java
@@ -2,7 +2,6 @@
 
 import fr.sae.terraria.modele.Environment;
 import fr.sae.terraria.modele.TileMaps;
-import fr.sae.terraria.modele.TileSet;
 import fr.sae.terraria.modele.entities.Rabbit;
 import fr.sae.terraria.modele.entities.Slime;
 import fr.sae.terraria.modele.entities.blocks.Block;
diff --git a/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java b/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java
index 1c7efe5..7314d9b 100644
--- a/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java
+++ b/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java
@@ -4,7 +4,6 @@
 import fr.sae.terraria.modele.TileMaps;
 import fr.sae.terraria.modele.entities.Arrow;
 import fr.sae.terraria.modele.entities.blocks.Block;
-import fr.sae.terraria.modele.entities.blocks.TallGrass;
 import fr.sae.terraria.modele.entities.entity.StowableObjectType;
 import fr.sae.terraria.modele.entities.items.Item;
 import fr.sae.terraria.modele.entities.items.Meat;
@@ -115,13 +114,13 @@ else if (Block.isTallGrass((Block) item))
                         else if (Block.isTorch((Block) item))
                             view.setImage(View.loadAnImage("tiles/torch.png", itemInventoryWidth, itemInventoryHeight));
                     } else if (item instanceof Tool) {
-                        if (Tool.isAxe(((Tool) item).getTypeOfTool()))
+                        if (Tool.isAxe((Tool) item))
                             view.setImage(null);    // TODO
-                        else if (Tool.isBow(((Tool) item).getTypeOfTool()))
+                        else if (Tool.isBow((Tool) item))
                             view.setImage(null);    // TODO
-                        else if (Tool.isPickaxe(((Tool) item).getTypeOfTool()))
+                        else if (Tool.isPickaxe((Tool) item))
                             view.setImage(View.loadAnImage("tools/pickaxe.png", itemInventoryWidth, itemInventoryHeight));
-                        else if (Tool.isSword(((Tool) item).getTypeOfTool()))
+                        else if (Tool.isSword((Tool) item))
                             view.setImage(View.loadAnImage("tools/sword.png", itemInventoryWidth, itemInventoryHeight));
                     } else if (item instanceof Item) {
                         if (Item.isCoal(item))
diff --git a/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java b/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java
index 6a90f61..ce0832a 100644
--- a/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java
+++ b/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java
@@ -3,8 +3,6 @@
 import fr.sae.terraria.modele.TileMaps;
 import fr.sae.terraria.modele.entities.Arrow;
 import fr.sae.terraria.modele.entities.blocks.Block;
-import fr.sae.terraria.modele.entities.blocks.BlockSet;
-import fr.sae.terraria.modele.entities.blocks.TallGrass;
 import fr.sae.terraria.modele.entities.entity.StowableObjectType;
 import fr.sae.terraria.modele.entities.items.Item;
 import fr.sae.terraria.modele.entities.items.Meat;
@@ -100,13 +98,13 @@ else if (Block.isTorch((Block) item))
                 }
 
                 if (item instanceof Tool) {
-                    if (Tool.isAxe(((Tool) item).getTypeOfTool()))
+                    if (Tool.isAxe((Tool) item))
                         this.itemSelectedImgView.setImage(null);
-                    else if (Tool.isBow(((Tool) item).getTypeOfTool()))
+                    else if (Tool.isBow((Tool) item))
                         this.itemSelectedImgView.setImage(null);
-                    else if (Tool.isPickaxe(((Tool) item).getTypeOfTool()))
+                    else if (Tool.isPickaxe((Tool) item))
                         this.itemSelectedImgView.setImage(this.pickaxeItemImg);
-                    else if (Tool.isSword(((Tool) item).getTypeOfTool()))
+                    else if (Tool.isSword((Tool) item))
                         this.itemSelectedImgView.setImage(this.swordItemImg);
                 }
 

From 7fe8d458543fd6654ee5b745f1f92311dff656b2 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Sun, 12 Jun 2022 23:36:30 +0200
Subject: [PATCH 50/97] Fix tree

---
 src/main/java/fr/sae/terraria/modele/Environment.java    | 2 +-
 src/main/java/fr/sae/terraria/modele/GenerateEntity.java | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/modele/Environment.java b/src/main/java/fr/sae/terraria/modele/Environment.java
index 92bd859..c565965 100644
--- a/src/main/java/fr/sae/terraria/modele/Environment.java
+++ b/src/main/java/fr/sae/terraria/modele/Environment.java
@@ -145,7 +145,7 @@ private void gameLoop()
             boolean nightTime = this.clock.getMinutes() > (Clock.MINUTES_IN_A_DAY)/2;
             boolean weHaveChangedDay = this.previousDays != this.clock.getDays();
             if (weHaveChangedDay)
-                for (int i = 0; i < 10; i++) // Génère par jour, 3 arbres
+                for (int i = 0; i < 15; i++) // Génère par jour, 3 arbres
                     GenerateEntity.treeRandomly(this);
             if (dayTime) {  // Génère certaines entités uniquement pendant le jour
                 GenerateEntity.rabbitRandomly(this);
diff --git a/src/main/java/fr/sae/terraria/modele/GenerateEntity.java b/src/main/java/fr/sae/terraria/modele/GenerateEntity.java
index b97c487..f2494ac 100644
--- a/src/main/java/fr/sae/terraria/modele/GenerateEntity.java
+++ b/src/main/java/fr/sae/terraria/modele/GenerateEntity.java
@@ -25,7 +25,7 @@
  */
 public class GenerateEntity
 {
-    private static final int TREE_SPAWN_RATE = 2500;
+    private static final double TREE_SPAWN_RATE = .1;
     public static final int MAX_SPAWN_RABBIT = 100;
     public static final int MAX_SPAWN_SLIME = 100;
     private static final Random random = new Random();

From 677f34d037e6f6df4d299f10e3ae799da4d9328e Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Mon, 13 Jun 2022 13:20:15 +0200
Subject: [PATCH 51/97] Fix classes not found

---
 .../modele/entities/blocks/Block.java         |  1 -
 .../resources/fr/sae/terraria/vue/menu.fxml   |  3 +--
 .../modele/entities/player/PlayerTest.java    | 21 +++++++++++--------
 .../player/inventory/InventoryTest.java       |  8 ++++---
 4 files changed, 18 insertions(+), 15 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
index 1c0efb7..4dd741d 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
@@ -13,7 +13,6 @@
 import fr.sae.terraria.modele.entities.player.inventory.Inventory;
 import fr.sae.terraria.modele.entities.player.inventory.Stack;
 import fr.sae.terraria.modele.entities.tools.Tool;
-import fr.sae.terraria.modele.entities.tools.ToolSet;
 import javafx.animation.KeyFrame;
 import javafx.animation.Timeline;
 import javafx.util.Duration;
diff --git a/src/main/resources/fr/sae/terraria/vue/menu.fxml b/src/main/resources/fr/sae/terraria/vue/menu.fxml
index c9a37a1..5206fcf 100644
--- a/src/main/resources/fr/sae/terraria/vue/menu.fxml
+++ b/src/main/resources/fr/sae/terraria/vue/menu.fxml
@@ -1,11 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
+
 <?import javafx.scene.control.*?>
 <?import javafx.scene.layout.*?>
 <?import javafx.scene.text.*?>
 <?import java.net.URL?>
-
-
 <BorderPane fx:id="root"
             maxHeight="-Infinity" maxWidth="-Infinity"
             minHeight="-Infinity" minWidth="-Infinity"
diff --git a/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java b/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
index 39343c5..88feb0a 100644
--- a/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
+++ b/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
@@ -4,6 +4,9 @@
 import fr.sae.terraria.modele.TileMaps;
 import fr.sae.terraria.modele.TileSet;
 import fr.sae.terraria.modele.entities.Rabbit;
+import fr.sae.terraria.modele.entities.blocks.Block;
+import fr.sae.terraria.modele.entities.blocks.BlockSet;
+import fr.sae.terraria.modele.entities.items.Item;
 import fr.sae.terraria.modele.entities.items.Meat;
 import fr.sae.terraria.modele.entities.items.Vodka;
 import javafx.geometry.Rectangle2D;
@@ -135,15 +138,15 @@ public class PlayerTest
         Rectangle2D blockSelected;
         double beforePv;
 
-        Dirt dirt = new Dirt(environment, 1, 1);
-        dirt.setRect(1, 1);
-        environment.getEntities().add(dirt);
+        Block block = new Block(BlockSet.DIRT, environment, 1, 1);
+        block.setRect(1, 1);
+        environment.getEntities().add(block);
         blockSelected = new Rectangle2D(1, 1, 1, 1);
 
-        beforePv = dirt.getPv();
+        beforePv = block.getPv();
         player.interactWithBlock(blockSelected);
-        assertEquals(beforePv - 1, dirt.getPv());
-        environment.getEntities().remove(dirt);
+        assertEquals(beforePv - 1, block.getPv());
+        environment.getEntities().remove(block);
 
 
         Rabbit rabbit = new Rabbit(environment, 10, 10);
@@ -159,7 +162,7 @@ public class PlayerTest
     @Test public final void placeBlockTest()
     {
         TileMaps tileMaps = environment.getTileMaps();
-        player.pickup(new Dirt(environment, 1, 1));
+        player.pickup(new Block(BlockSet.DIRT, environment));
 
         assertEquals(tileMaps.getTile(0, 0), TileSet.SKY.ordinal());
         player.placeBlock(0, 0);
@@ -197,8 +200,8 @@ public class PlayerTest
 
 
         // Test avec du charbon
-        player.pickup(new Coal());
-        assertTrue(player.getStackSelected().getItem() instanceof Coal,
+        player.pickup(Item.COAL);
+        assertTrue(Item.isCoal(player.getStackSelected().getItem()),
                 "Verifie si le stack est bien du charbon");
         assertEquals(player.getStackSelected().getNbItems(), 1,
                 "Verifie s'il y a bien 1 objet dans le stack");
diff --git a/src/test/java/fr/sae/terraria/modele/entities/player/inventory/InventoryTest.java b/src/test/java/fr/sae/terraria/modele/entities/player/inventory/InventoryTest.java
index 48d09ac..086c9c7 100644
--- a/src/test/java/fr/sae/terraria/modele/entities/player/inventory/InventoryTest.java
+++ b/src/test/java/fr/sae/terraria/modele/entities/player/inventory/InventoryTest.java
@@ -1,6 +1,8 @@
 package fr.sae.terraria.modele.entities.player.inventory;
 
 import fr.sae.terraria.modele.Environment;
+import fr.sae.terraria.modele.entities.blocks.Block;
+import fr.sae.terraria.modele.entities.blocks.BlockSet;
 import fr.sae.terraria.modele.entities.player.Player;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
@@ -24,11 +26,11 @@ public class InventoryTest
     @Test public final void nbStacksIntoInventoryTest()
     {
         for (int i = 0; i < Stack.MAX; i++)
-            inventory.put(new Dirt(environment, 1, 1));
+            inventory.put(new Block(BlockSet.DIRT, environment));
         assertEquals(2, inventory.nbStacksIntoInventory());
 
         for (int i = 0; i < Stack.MAX; i++)
-            inventory.put(new Dirt(environment, 1, 1));
+            inventory.put(new Block(BlockSet.DIRT, environment));
         assertEquals(3, inventory.nbStacksIntoInventory());
     }
 
@@ -36,7 +38,7 @@ public class InventoryTest
     {
         inventory.posCursorProperty().set(0);
         for (int i = 0; i < Stack.MAX; i++)
-            inventory.put(new Dirt(environment, 1, 1));
+            inventory.put(new Block(BlockSet.DIRT, environment));
         assertEquals(Stack.MAX, inventory.getStack().getNbItems());
     }
 }

From eb4046a92289c53aec17e8d55d4ef6cdc2068dc8 Mon Sep 17 00:00:00 2001
From: "Naulan.CHRZ" <67024770+NaulaN@users.noreply.github.com>
Date: Thu, 9 Jun 2022 16:20:16 +0200
Subject: [PATCH 52/97] Update README.md

---
 README.md | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/README.md b/README.md
index 5bad094..56a810e 100644
--- a/README.md
+++ b/README.md
@@ -12,9 +12,9 @@ IUT de Montreuil Paris8 | BUT Informatique en 1er année.
 
 ### Progression:
 [Les sprints](https://github.com/NaulaN/SAE-Terraria-Like/releases)
-- [X] Sprint n°1
-- [X] Sprint n°2
-- [ ] Sprint n°3
+- [X] [Sprint n°1](https://github.com/NaulaN/SAE-Terraria-Like/pull/2)
+- [X] [Sprint n°2](https://github.com/NaulaN/SAE-Terraria-Like/pull/8)
+- [ ] [Sprint n°3](https://github.com/NaulaN/SAE-Terraria-Like/pull/14)
 - [ ] Sprint n°4
 
 ### Qu'est-ce que c'est ce projet ?

From 74f1da156a974ecb2c0b9f769d549ed81b6733af Mon Sep 17 00:00:00 2001
From: "Naulan.CHRZ" <67024770+NaulaN@users.noreply.github.com>
Date: Thu, 9 Jun 2022 16:20:30 +0200
Subject: [PATCH 53/97] Update README.md

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 56a810e..bbbef7e 100644
--- a/README.md
+++ b/README.md
@@ -14,7 +14,7 @@ IUT de Montreuil Paris8 | BUT Informatique en 1er année.
 [Les sprints](https://github.com/NaulaN/SAE-Terraria-Like/releases)
 - [X] [Sprint n°1](https://github.com/NaulaN/SAE-Terraria-Like/pull/2)
 - [X] [Sprint n°2](https://github.com/NaulaN/SAE-Terraria-Like/pull/8)
-- [ ] [Sprint n°3](https://github.com/NaulaN/SAE-Terraria-Like/pull/14)
+- [X] [Sprint n°3](https://github.com/NaulaN/SAE-Terraria-Like/pull/14)
 - [ ] Sprint n°4
 
 ### Qu'est-ce que c'est ce projet ?

From 6999321adf705f093a80a4a48b60dfacdb0f70a0 Mon Sep 17 00:00:00 2001
From: Tiago Lousa <tig2468.a@gmail.com>
Date: Mon, 13 Jun 2022 14:52:49 +0200
Subject: [PATCH 54/97] fix label inverntaire

---
 .../sae/terraria/modele/entities/player/Player.java  |  2 ++
 .../modele/entities/player/inventory/Inventory.java  | 12 ++++++++----
 .../java/fr/sae/terraria/vue/hud/InventoryView.java  | 11 +++++++++--
 3 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
index 2bdab01..b390917 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
@@ -2,9 +2,11 @@
 
 import fr.sae.terraria.modele.Environment;
 import fr.sae.terraria.modele.TileMaps;
+import fr.sae.terraria.modele.entities.blocks.Tree;
 import fr.sae.terraria.modele.entities.entity.*;
 import fr.sae.terraria.modele.entities.player.inventory.Inventory;
 import fr.sae.terraria.modele.entities.player.inventory.Stack;
+import fr.sae.terraria.modele.entities.tools.Tool;
 import fr.sae.terraria.vue.View;
 import javafx.beans.property.SimpleBooleanProperty;
 import javafx.geometry.Rectangle2D;
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
index 476dc74..b50654f 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
@@ -41,10 +41,7 @@ public Inventory(final Player player)
             boolean isntOutOfInventoryBar = newV.intValue() >= 0 && newV.intValue() < nbElementOnOneLineOfInventory;
 
             if (isntOutOfInventoryBar) {
-                Stack stack = null;
-                if (this.getPosCursor() < this.get().size())
-                    stack = this.get().get(this.getPosCursor());
-                this.player.setStackSelected(stack);
+                refreshStack();
             }
         });
     }
@@ -141,6 +138,13 @@ else if (key.equals(KeyCode.DIGIT9))
         this.scroll = 0;
     }
 
+    private void refreshStack() {
+        Stack stack = null;
+        if (this.getPosCursor() < this.get().size())
+            stack = this.get().get(this.getPosCursor());
+        this.player.setStackSelected(stack);
+    }
+
     public IntegerProperty posCursorProperty() { return this.posCursor; }
 
 
diff --git a/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java b/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java
index 7314d9b..c8bcd7f 100644
--- a/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java
+++ b/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java
@@ -138,8 +138,7 @@ else if (Item.isWood(item))
                     }
 
                     // Actualise le nombre d'item à l'écran
-                    this.texts.get(c.getTo()-1).setText(String.valueOf(stack.getNbItems()));
-                    stack.nbItemsProperty().addListener((obs, oldV, newV) -> this.texts.get(c.getTo()-1).setText(String.valueOf(newV.intValue())));
+                    this.texts.get(c.getTo()-1).textProperty().bind(c.getAddedSubList().get(0).nbItemsProperty().asString());
 
                     if (!Objects.isNull(view.getImage())) {
                         view.setX((this.inventoryBarImgView.getX() + ((c.getTo()-1) * boxeInventoryWidth)) + ((boxeInventoryWidth/2) - (itemInventoryWidth/2)));
@@ -156,6 +155,14 @@ else if (Item.isWood(item))
 
                     for (int i = c.getTo(); i < itemsView.size(); i++)
                         this.itemsView.get(i).setX(this.itemsView.get(i).getX() - boxeInventoryWidth);
+
+                    for (int i = 0; i < inventory.get().size(); i ++){
+                        this.texts.get(inventory.get().size()).textProperty().unbind();
+                        this.texts.get(i).textProperty().bind(inventory.get().get(i).nbItemsProperty().asString());
+                    }
+                    this.texts.get(inventory.get().size()).textProperty().unbind();
+                    this.texts.get(inventory.get().size()).setText("0");
+
                 }
             }
         });

From 95794a5aca0df39090df03d5dae3d05629430c15 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Mon, 13 Jun 2022 21:32:19 +0200
Subject: [PATCH 55/97] Fix image floor top dans l'inventaire

---
 .../modele/entities/blocks/Block.java         | 11 ++++-------
 .../entities/player/inventory/Inventory.java  | 19 +++++++++----------
 .../entities/player/inventory/Stack.java      |  6 ++++++
 .../sae/terraria/vue/hud/InventoryView.java   |  2 +-
 4 files changed, 20 insertions(+), 18 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
index 4dd741d..a67a8d0 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
@@ -26,7 +26,7 @@ public class Block extends Entity implements BreakableObjectType, PlaceableObjec
     public static final int DEFAULT_RESISTANCE = 2;
 
     private final Environment environment;
-    private final BlockSet typeOfBlock;
+    private BlockSet typeOfBlock;
 
     private final double xOrigin;
     private final double yOrigin;
@@ -72,10 +72,8 @@ private void loots()
     {
         Player player = this.environment.getPlayer();
 
-        if (this.typeOfBlock == BlockSet.FLOOR_TOP || this.typeOfBlock == BlockSet.FLOOR_LEFT || this.typeOfBlock == BlockSet.FLOOR_RIGHT) {
+        if (this.typeOfBlock == BlockSet.FLOOR_TOP || this.typeOfBlock == BlockSet.FLOOR_LEFT || this.typeOfBlock == BlockSet.FLOOR_RIGHT || this.typeOfBlock == BlockSet.DIRT) {
             player.pickup(new Block(BlockSet.FLOOR_TOP, this.environment));
-        } else if (this.typeOfBlock == BlockSet.DIRT) {
-            player.pickup(new Block(BlockSet.DIRT, this.environment, 0, 0));
         } else if (this.typeOfBlock == BlockSet.ROCK) {
             for (int loot = 0; loot < Block.ROCK_NB_LOOTS; loot++)
                 player.pickup(Item.STONE);
@@ -131,13 +129,12 @@ else if (this.typeOfBlock == BlockSet.TALL_GRASS)
         int widthTile = this.environment.widthTile;
         int heightTile = this.environment.heightTile;
 
-        Block block = new Block(this.typeOfBlock, this.environment, x*widthTile, y*heightTile);
-        block.setRect(widthTile, heightTile);
-
         Player player = this.environment.getPlayer();
         Inventory inventory = player.getInventory();
         if (!Objects.isNull(player.getStackSelected()))
             inventory.get().get(inventory.getPosCursor()).remove();
+        Block block = new Block(BlockSet.FLOOR_TOP, this.environment, x*widthTile, y*heightTile);
+        block.setRect(widthTile, heightTile);
 
         TileSet tile = TileSet.getTileSet(this.typeOfBlock);
         if (!Objects.isNull(tile))
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
index b50654f..a61e7f4 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
@@ -40,12 +40,19 @@ public Inventory(final Player player)
         this.posCursorProperty().addListener((obs, oldV, newV) -> {
             boolean isntOutOfInventoryBar = newV.intValue() >= 0 && newV.intValue() < nbElementOnOneLineOfInventory;
 
-            if (isntOutOfInventoryBar) {
+            if (isntOutOfInventoryBar)
                 refreshStack();
-            }
         });
     }
 
+    private void refreshStack()
+    {
+        Stack stack = null;
+        if (this.getPosCursor() < this.get().size())
+            stack = this.get().get(this.getPosCursor());
+        this.player.setStackSelected(stack);
+    }
+
     private void createStack(StowableObjectType item)
     {
         Stack stack = new Stack();
@@ -137,14 +144,6 @@ else if (key.equals(KeyCode.DIGIT9))
 
         this.scroll = 0;
     }
-
-    private void refreshStack() {
-        Stack stack = null;
-        if (this.getPosCursor() < this.get().size())
-            stack = this.get().get(this.getPosCursor());
-        this.player.setStackSelected(stack);
-    }
-
     public IntegerProperty posCursorProperty() { return this.posCursor; }
 
 
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
index 6018d08..80f9366 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
@@ -41,6 +41,12 @@ public boolean isSameItem(StowableObjectType obj)
         if (obj instanceof Block && this.item instanceof Block) {
             if (Block.isDirt((Block) obj) && Block.isDirt((Block) this.item))
                 return true;
+            if (Block.isFloorTop((Block) obj) && Block.isFloorTop((Block) this.item))
+                return true;
+            if (Block.isFloorLeft((Block) obj) && Block.isFloorLeft((Block) this.item))
+                return true;
+            if (Block.isFloorRight((Block) obj) && Block.isFloorRight((Block) this.item))
+                return true;
             if (Block.isRock((Block) obj) && Block.isRock((Block) this.item))
                 return true;
             if (Block.isTallGrass((Block) obj) && Block.isTallGrass((Block) this.item))
diff --git a/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java b/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java
index c8bcd7f..a21fcf3 100644
--- a/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java
+++ b/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java
@@ -105,7 +105,7 @@ else if (item instanceof Arrow)
                     else if (item instanceof Vodka)
                         view.setImage(View.loadAnImage("loots/vodka.png", itemInventoryWidth,itemInventoryHeight));
                     else if (item instanceof Block) {
-                        if (Block.isDirt((Block) item))
+                        if (Block.isFloorTop((Block) item))
                             view.setImage(View.loadAnImage("tiles/floor-top.png", itemInventoryWidth, itemInventoryHeight));
                         else if (Block.isRock((Block) item))
                             view.setImage(View.loadAnImage("tiles/rock-fill.png", itemInventoryWidth, itemInventoryHeight));

From a92017ba8aba753ebfb8e3aa59397a437d217bd2 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Tue, 14 Jun 2022 09:53:14 +0200
Subject: [PATCH 56/97] Fix block stone

---
 .../fr/sae/terraria/modele/entities/blocks/Block.java |  6 +++++-
 .../sae/terraria/modele/entities/player/Player.java   |  2 --
 .../modele/entities/player/inventory/Inventory.java   |  5 -----
 .../java/fr/sae/terraria/vue/hud/InventoryView.java   | 11 ++++++++---
 4 files changed, 13 insertions(+), 11 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
index a67a8d0..27e297e 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
@@ -133,7 +133,11 @@ else if (this.typeOfBlock == BlockSet.TALL_GRASS)
         Inventory inventory = player.getInventory();
         if (!Objects.isNull(player.getStackSelected()))
             inventory.get().get(inventory.getPosCursor()).remove();
-        Block block = new Block(BlockSet.FLOOR_TOP, this.environment, x*widthTile, y*heightTile);
+
+        Block block;
+        if (Block.isDirt(this) || Block.isFloorTop(this) || Block.isFloorLeft(this) || Block.isFloorRight(this))
+            block = new Block(BlockSet.FLOOR_TOP, this.environment, x*widthTile, y*heightTile);
+        else block = new Block(this.typeOfBlock, this.environment, x*widthTile, y*heightTile);
         block.setRect(widthTile, heightTile);
 
         TileSet tile = TileSet.getTileSet(this.typeOfBlock);
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
index b390917..2bdab01 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
@@ -2,11 +2,9 @@
 
 import fr.sae.terraria.modele.Environment;
 import fr.sae.terraria.modele.TileMaps;
-import fr.sae.terraria.modele.entities.blocks.Tree;
 import fr.sae.terraria.modele.entities.entity.*;
 import fr.sae.terraria.modele.entities.player.inventory.Inventory;
 import fr.sae.terraria.modele.entities.player.inventory.Stack;
-import fr.sae.terraria.modele.entities.tools.Tool;
 import fr.sae.terraria.vue.View;
 import javafx.beans.property.SimpleBooleanProperty;
 import javafx.geometry.Rectangle2D;
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
index a61e7f4..b90bd1e 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
@@ -57,11 +57,6 @@ private void createStack(StowableObjectType item)
     {
         Stack stack = new Stack();
         stack.nbItemsProperty().addListener((observable, oldValue, newValue) -> {
-            if (newValue.intValue() < oldValue.intValue()) {
-                Inventory inventory = player.getInventory();
-                inventory.get().get(inventory.getPosCursor()).remove();
-            }
-
             if (newValue.intValue() <= 0) {
                 this.value.remove(stack);
                 this.player.setStackSelected(null);
diff --git a/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java b/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java
index a21fcf3..81b2edd 100644
--- a/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java
+++ b/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java
@@ -104,7 +104,8 @@ else if (item instanceof Arrow)
                         view.setImage(null);    // TODO
                     else if (item instanceof Vodka)
                         view.setImage(View.loadAnImage("loots/vodka.png", itemInventoryWidth,itemInventoryHeight));
-                    else if (item instanceof Block) {
+
+                    if (item instanceof Block) {
                         if (Block.isFloorTop((Block) item))
                             view.setImage(View.loadAnImage("tiles/floor-top.png", itemInventoryWidth, itemInventoryHeight));
                         else if (Block.isRock((Block) item))
@@ -113,7 +114,9 @@ else if (Block.isTallGrass((Block) item))
                             view.setImage(View.loadAnImage("tiles/tall-grass.png.png", itemInventoryWidth, itemInventoryHeight));
                         else if (Block.isTorch((Block) item))
                             view.setImage(View.loadAnImage("tiles/torch.png", itemInventoryWidth, itemInventoryHeight));
-                    } else if (item instanceof Tool) {
+                    }
+
+                    if (item instanceof Tool) {
                         if (Tool.isAxe((Tool) item))
                             view.setImage(null);    // TODO
                         else if (Tool.isBow((Tool) item))
@@ -122,7 +125,9 @@ else if (Tool.isPickaxe((Tool) item))
                             view.setImage(View.loadAnImage("tools/pickaxe.png", itemInventoryWidth, itemInventoryHeight));
                         else if (Tool.isSword((Tool) item))
                             view.setImage(View.loadAnImage("tools/sword.png", itemInventoryWidth, itemInventoryHeight));
-                    } else if (item instanceof Item) {
+                    }
+
+                    if (item instanceof Item) {
                         if (Item.isCoal(item))
                             view.setImage(View.loadAnImage("loots/coal.png", itemInventoryWidth, itemInventoryHeight));
                         else if (Item.isFiber(item))

From 0d87356295a54c3f4fbb3e49e336d4761cf7a35c Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Tue, 14 Jun 2022 09:58:39 +0200
Subject: [PATCH 57/97] Correction nom fonction

---
 src/main/java/fr/sae/terraria/vue/LightView.java | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/vue/LightView.java b/src/main/java/fr/sae/terraria/vue/LightView.java
index ca5c2ec..5ee3eb9 100644
--- a/src/main/java/fr/sae/terraria/vue/LightView.java
+++ b/src/main/java/fr/sae/terraria/vue/LightView.java
@@ -61,7 +61,7 @@ private void initTorchListener(ObservableList<Block> torches) {
         torches.addListener((ListChangeListener<? super Block>) c -> {
             while(c.next()){
                 this.filterPane.getChildren().clear();
-                addTochLights();
+                addTorchLights();
                 if (c.wasRemoved()){
                     resetShapes();
 
@@ -137,7 +137,7 @@ private void addEffects()
         this.actualTunnel.setOpacity(.8);
     }
 
-    private void addTochLights()
+    private void addTorchLights()
     {
         for (int i = 0; i < this.environment.getTorches().size() ; i ++){
             Circle torchLight = new Circle(tileSize*CIRCLE_RAY);

From fbdd88e9cce325b39ffa4060b5f983b9c7407511 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Tue, 14 Jun 2022 10:01:12 +0200
Subject: [PATCH 58/97] Fix torches

---
 src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java | 2 ++
 src/main/java/fr/sae/terraria/vue/LightView.java                | 1 -
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
index 27e297e..e9b24e6 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
@@ -110,6 +110,8 @@ else if (this.typeOfBlock == BlockSet.TALL_GRASS)
             this.environment.getTileMaps().setTile(TileSet.SKY.ordinal(), yIndexTile, xIndexTile);
             this.environment.getEntities().remove(this);
             this.environment.getBlocks().remove(this);
+            if (Block.isTorch(this))
+                this.environment.getTorches().remove(this);
         }
 
         if (isRock(this)) {
diff --git a/src/main/java/fr/sae/terraria/vue/LightView.java b/src/main/java/fr/sae/terraria/vue/LightView.java
index 5ee3eb9..c3bd47a 100644
--- a/src/main/java/fr/sae/terraria/vue/LightView.java
+++ b/src/main/java/fr/sae/terraria/vue/LightView.java
@@ -25,7 +25,6 @@ public class LightView {
     private static int widthMap;
     private static int tileSize;
 
-
     private final Environment environment;
     private final TileMaps tileMaps;
     private final Circle torchLight;

From f9905c850388d3ad5f0916ed330c96b07e8a882d Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Tue, 14 Jun 2022 10:03:18 +0200
Subject: [PATCH 59/97] Fix tree

---
 .../java/fr/sae/terraria/modele/entities/blocks/Block.java    | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
index e9b24e6..f5141d1 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
@@ -109,9 +109,12 @@ else if (this.typeOfBlock == BlockSet.TALL_GRASS)
             int xIndexTile = (int) (getX()/environment.widthTile);
             this.environment.getTileMaps().setTile(TileSet.SKY.ordinal(), yIndexTile, xIndexTile);
             this.environment.getEntities().remove(this);
+
             this.environment.getBlocks().remove(this);
             if (Block.isTorch(this))
                 this.environment.getTorches().remove(this);
+            if (Block.isTree(this))
+                this.environment.getTrees().remove(this);
         }
 
         if (isRock(this)) {
@@ -162,6 +165,7 @@ else if (this.typeOfBlock == BlockSet.TALL_GRASS)
     public static boolean isRock(final Block block) { return block.getTypeOfBlock() == BlockSet.ROCK; }
     public static boolean isTallGrass(final Block block) { return block.getTypeOfBlock() == BlockSet.TALL_GRASS; }
     public static boolean isTorch(final Block block) { return block.getTypeOfBlock() == BlockSet.TORCH; }
+    public static boolean isTree(final Block block) { return block.getTypeOfBlock() == BlockSet.TREE; }
 
 
     public BlockSet getTypeOfBlock() { return this.typeOfBlock; }

From 96dbf8dbfa3b4eeddfc434b70c12a153b4b7d562 Mon Sep 17 00:00:00 2001
From: Tiago Lousa <tig2468.a@gmail.com>
Date: Tue, 14 Jun 2022 10:28:13 +0200
Subject: [PATCH 60/97] fix casser bloc

---
 .../java/fr/sae/terraria/modele/entities/player/Player.java  | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
index 2bdab01..d968872 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
@@ -110,12 +110,13 @@ public void interactWithBlock(final Rectangle2D rectangle)
         int i = 0;
 
         Entity entity = this.environment.getEntities().get(i);
-        while (i < this.environment.getEntities().size() && !entity.getRect().collideRect(rectangle)) {
+        while (!entity.getRect().collideRect(rectangle) && i < this.environment.getEntities().size() ) {
             entity = this.environment.getEntities().get(i);
             i++;
         }
+        System.out.println(i);
 
-        if (i < this.environment.getEntities().size()) {
+        if (i <= this.environment.getEntities().size()) {
             if (entity instanceof BreakableObjectType)
                 ((BreakableObjectType) entity).breaks();
             if (entity instanceof CollapsibleObjectType)

From 5c6c9fd47b4015786d27ebcd40384ff10b7de4cb Mon Sep 17 00:00:00 2001
From: Tiago Lousa <tig2468.a@gmail.com>
Date: Tue, 14 Jun 2022 10:29:55 +0200
Subject: [PATCH 61/97] clean

---
 src/main/java/fr/sae/terraria/modele/entities/player/Player.java | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
index d968872..4da68b2 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
@@ -114,7 +114,6 @@ public void interactWithBlock(final Rectangle2D rectangle)
             entity = this.environment.getEntities().get(i);
             i++;
         }
-        System.out.println(i);
 
         if (i <= this.environment.getEntities().size()) {
             if (entity instanceof BreakableObjectType)

From 2481b1738fa289fdb7360aa8c2655b725b73eed5 Mon Sep 17 00:00:00 2001
From: Tiago Lousa <tig2468.a@gmail.com>
Date: Tue, 14 Jun 2022 10:36:13 +0200
Subject: [PATCH 62/97] fix bloc casse

---
 .../java/fr/sae/terraria/modele/entities/player/Player.java    | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
index 4da68b2..47b9761 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
@@ -115,7 +115,7 @@ public void interactWithBlock(final Rectangle2D rectangle)
             i++;
         }
 
-        if (i <= this.environment.getEntities().size()) {
+        if (i <= this.environment.getEntities().size() && entity.getRect().collideRect(rectangle)) {
             if (entity instanceof BreakableObjectType)
                 ((BreakableObjectType) entity).breaks();
             if (entity instanceof CollapsibleObjectType)
@@ -128,6 +128,7 @@ public void placeBlock(int xBlock, int yBlock)
         TileMaps tileMaps = this.environment.getTileMaps();
         boolean haveAnItemOnHand = !Objects.isNull(this.getStackSelected());
         boolean goodPlace = tileMaps.isSkyTile(xBlock, yBlock);
+        System.out.println(getStackSelected().getItem());
 
         if (haveAnItemOnHand && goodPlace) {
             if (!(this.getStackSelected().getItem() instanceof PlaceableObjectType) && !(this.getStackSelected().getItem() instanceof ConsumableObjectType))

From 11f148a144c484c65f9baa341bf3594abc7f320c Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Tue, 14 Jun 2022 10:54:41 +0200
Subject: [PATCH 63/97] =?UTF-8?q?Modification=20systeme=20de=20durabilit?=
 =?UTF-8?q?=C3=A9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../modele/entities/blocks/Block.java         | 29 +++++++++----------
 .../modele/entities/blocks/BlockSet.java      | 26 ++++++++++++-----
 2 files changed, 32 insertions(+), 23 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
index f5141d1..83f769c 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
@@ -23,10 +23,9 @@
 public class Block extends Entity implements BreakableObjectType, PlaceableObjectType, StowableObjectType
 {
     public static final int ROCK_NB_LOOTS = 3;
-    public static final int DEFAULT_RESISTANCE = 2;
 
     private final Environment environment;
-    private BlockSet typeOfBlock;
+    private final BlockSet typeOfBlock;
 
     private final double xOrigin;
     private final double yOrigin;
@@ -41,7 +40,7 @@ public Block(final BlockSet typeOfBlock, final Environment environment, int x, i
         this.xOrigin = x;
         this.yOrigin = y;
 
-        this.pv.set(Block.DEFAULT_RESISTANCE);
+        this.pv.set(typeOfBlock.getDurability());
     }
 
     public Block(final BlockSet typeOfBlock, final Environment environment) { this(typeOfBlock, environment, 0, 0); }
@@ -72,21 +71,21 @@ private void loots()
     {
         Player player = this.environment.getPlayer();
 
-        if (this.typeOfBlock == BlockSet.FLOOR_TOP || this.typeOfBlock == BlockSet.FLOOR_LEFT || this.typeOfBlock == BlockSet.FLOOR_RIGHT || this.typeOfBlock == BlockSet.DIRT) {
+        if (Block.isFloorTop(this) || Block.isFloorLeft(this) || Block.isFloorRight(this) || Block.isDirt(this)) {
             player.pickup(new Block(BlockSet.FLOOR_TOP, this.environment));
-        } else if (this.typeOfBlock == BlockSet.ROCK) {
+        } else if (Block.isRock(this)) {
             for (int loot = 0; loot < Block.ROCK_NB_LOOTS; loot++)
                 player.pickup(Item.STONE);
-        } else if (this.typeOfBlock == BlockSet.TALL_GRASS) {
+        } else if (Block.isTallGrass(this)) {
             for (int loot = (int) (Math.random()*3)+1; loot < TallGrass.LOOTS_FIBRE_MAX; loot++)
                 player.pickup(Item.FIBER);
 
             boolean mustDropVodka = Math.random() < Vodka.DROP_RATE;
             if (mustDropVodka)
                 player.pickup(new Vodka(this.environment));
-        } else if (this.typeOfBlock == BlockSet.TORCH) {
+        } else if (Block.isTorch(this)) {
             player.pickup(new Block(BlockSet.TORCH, this.environment));
-        } else if (this.typeOfBlock == BlockSet.TREE) {
+        } else if (Block.isTree(this)) {
             player.pickup(new Block(BlockSet.TREE, this.environment));
         }
     }
@@ -95,9 +94,9 @@ private void loots()
 
     @Override public void breaks()
     {
-        if (this.typeOfBlock == BlockSet.ROCK)
+        if (Block.isRock(this))
             Environment.playSound("sound/brick" + ((int) (Math.random()*2)+1) + ".wav", false);
-        else if (this.typeOfBlock == BlockSet.TALL_GRASS)
+        else if (Block.isTallGrass(this))
             Environment.playSound("sound/cut.wav", false);
         else Environment.playSound("sound/grassyStep.wav", false);
         this.breakAnimation();
@@ -108,8 +107,8 @@ else if (this.typeOfBlock == BlockSet.TALL_GRASS)
             int yIndexTile = (int) (getY()/environment.heightTile);
             int xIndexTile = (int) (getX()/environment.widthTile);
             this.environment.getTileMaps().setTile(TileSet.SKY.ordinal(), yIndexTile, xIndexTile);
-            this.environment.getEntities().remove(this);
 
+            this.environment.getEntities().remove(this);
             this.environment.getBlocks().remove(this);
             if (Block.isTorch(this))
                 this.environment.getTorches().remove(this);
@@ -117,7 +116,7 @@ else if (this.typeOfBlock == BlockSet.TALL_GRASS)
                 this.environment.getTrees().remove(this);
         }
 
-        if (isRock(this)) {
+        if (Block.isRock(this)) {
             Stack item = this.environment.getPlayer().getStackSelected();
             if (!Objects.isNull(item) && item.getItem() instanceof Tool) {
                 Tool tool = (Tool) item.getItem();
@@ -148,12 +147,12 @@ else if (this.typeOfBlock == BlockSet.TALL_GRASS)
         TileSet tile = TileSet.getTileSet(this.typeOfBlock);
         if (!Objects.isNull(tile))
             this.environment.getTileMaps().setTile(tile.ordinal(), y, x);
+
         this.environment.getEntities().add(block);
         this.environment.getBlocks().add(block);
-
-        if (this.typeOfBlock == BlockSet.TREE)
+        if (Block.isTree(this))
             this.environment.getTrees().add((Tree) block);
-        if (this.typeOfBlock == BlockSet.TORCH)
+        if (Block.isTorch(this))
             this.environment.getTorches().add(block);
 
     }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/BlockSet.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/BlockSet.java
index 2de0c16..10be91e 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/BlockSet.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/BlockSet.java
@@ -3,12 +3,22 @@
 
 public enum BlockSet
 {
-    FLOOR_TOP,
-    FLOOR_RIGHT,
-    FLOOR_LEFT,
-    DIRT,
-    ROCK,
-    TALL_GRASS,
-    TORCH,
-    TREE
+    FLOOR_TOP(3),
+    FLOOR_RIGHT(3),
+    FLOOR_LEFT(3),
+    DIRT(3),
+    ROCK(5),
+    TALL_GRASS(2),
+    TORCH(1),
+    TREE(4);
+
+    private final int durability;
+
+
+    BlockSet(final int durability)
+    {
+        this.durability = durability;
+    }
+
+    public int getDurability() { return this.durability; }
 }

From 84f80d19d22bfcfb3cbe222415809df4d7723c28 Mon Sep 17 00:00:00 2001
From: Tiago Lousa <tig2468.a@gmail.com>
Date: Tue, 14 Jun 2022 10:41:44 +0200
Subject: [PATCH 64/97] fix bloc casse

---
 .../java/fr/sae/terraria/modele/entities/player/Player.java     | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
index 47b9761..5b212fc 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
@@ -115,7 +115,7 @@ public void interactWithBlock(final Rectangle2D rectangle)
             i++;
         }
 
-        if (i <= this.environment.getEntities().size() && entity.getRect().collideRect(rectangle)) {
+        if (entity.getRect().collideRect(rectangle)) {
             if (entity instanceof BreakableObjectType)
                 ((BreakableObjectType) entity).breaks();
             if (entity instanceof CollapsibleObjectType)

From 153a071b6c515c0800b684f6f09674874d13519e Mon Sep 17 00:00:00 2001
From: Tiago Lousa <tig2468.a@gmail.com>
Date: Tue, 14 Jun 2022 11:24:48 +0200
Subject: [PATCH 65/97] fix duplication

---
 .../java/fr/sae/terraria/modele/entities/player/Player.java | 2 +-
 .../modele/entities/player/inventory/Inventory.java         | 2 +-
 .../terraria/modele/entities/player/inventory/Stack.java    | 6 ++++++
 3 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
index 5b212fc..04f033b 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
@@ -128,9 +128,9 @@ public void placeBlock(int xBlock, int yBlock)
         TileMaps tileMaps = this.environment.getTileMaps();
         boolean haveAnItemOnHand = !Objects.isNull(this.getStackSelected());
         boolean goodPlace = tileMaps.isSkyTile(xBlock, yBlock);
-        System.out.println(getStackSelected().getItem());
 
         if (haveAnItemOnHand && goodPlace) {
+            this.inventory.refreshStack();
             if (!(this.getStackSelected().getItem() instanceof PlaceableObjectType) && !(this.getStackSelected().getItem() instanceof ConsumableObjectType))
                 return;
 
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
index b90bd1e..9f33f90 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
@@ -45,7 +45,7 @@ public Inventory(final Player player)
         });
     }
 
-    private void refreshStack()
+    public void refreshStack()
     {
         Stack stack = null;
         if (this.getPosCursor() < this.get().size())
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
index 80f9366..7c54957 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
@@ -92,6 +92,12 @@ public boolean isSameItem(StowableObjectType obj)
     public void add() { if (this.getNbItems() < Stack.MAX) this.nbItems.set(this.getNbItems() + 1); }
     public void remove() { if (this.getNbItems() > 0) this.nbItems.set(this.getNbItems() - 1); }
 
+    @Override public String toString(){
+        if (item instanceof Block)
+            return String.valueOf(((Block) item).getTypeOfBlock());
+        return item.toString();
+    }
+
 
     public int getNbItems() { return this.nbItems.get(); }
     public StowableObjectType getItem() { return this.item; }

From 14aa424e0357ce18ea23371fb0279531ad3fc34a Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Tue, 14 Jun 2022 11:27:53 +0200
Subject: [PATCH 66/97] little edit

---
 .../java/fr/sae/terraria/modele/entities/blocks/Block.java   | 1 -
 .../terraria/modele/entities/player/inventory/Inventory.java | 5 +++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
index 83f769c..bde3826 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
@@ -154,7 +154,6 @@ else if (Block.isTallGrass(this))
             this.environment.getTrees().add((Tree) block);
         if (Block.isTorch(this))
             this.environment.getTorches().add(block);
-
     }
 
     public static boolean isFloorTop(final Block block) { return block.getTypeOfBlock() == BlockSet.FLOOR_TOP; }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
index 9f33f90..d8c9789 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
@@ -5,6 +5,7 @@
 import javafx.beans.property.IntegerProperty;
 import javafx.beans.property.SimpleIntegerProperty;
 import javafx.collections.FXCollections;
+import javafx.collections.ListChangeListener;
 import javafx.collections.ObservableList;
 import javafx.scene.input.KeyCode;
 
@@ -37,8 +38,8 @@ public Inventory(final Player player)
         this.posCursor = new SimpleIntegerProperty(0);
 
         // Change l'item qui se trouve dans la main du joueur
-        this.posCursorProperty().addListener((obs, oldV, newV) -> {
-            boolean isntOutOfInventoryBar = newV.intValue() >= 0 && newV.intValue() < nbElementOnOneLineOfInventory;
+        this.posCursorProperty().addListener((obs, oldPos, newPos) -> {
+            boolean isntOutOfInventoryBar = newPos.intValue() >= 0 && newPos.intValue() < nbElementOnOneLineOfInventory;
 
             if (isntOutOfInventoryBar)
                 refreshStack();

From 7e0d30923f055f307bcc19b0bc73f3905d1914c4 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Tue, 14 Jun 2022 11:29:36 +0200
Subject: [PATCH 67/97] Fix cursor img selected floor top

---
 src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java b/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java
index ce0832a..a5418ff 100644
--- a/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java
+++ b/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java
@@ -87,7 +87,7 @@ else if (item instanceof Arrow)
 
                 if (item instanceof Block)
                 {
-                    if (Block.isDirt((Block) item))
+                    if (Block.isFloorTop((Block) item))
                         this.itemSelectedImgView.setImage(this.dirtItemImg);
                     else if (Block.isRock((Block) item))
                         this.itemSelectedImgView.setImage(this.rockItemImg);

From b3b17e9be4b88482554c1e69afc457a82cb7b38d Mon Sep 17 00:00:00 2001
From: Tiago Lousa <tig2468.a@gmail.com>
Date: Tue, 14 Jun 2022 11:42:20 +0200
Subject: [PATCH 68/97] fix ItemSelectedView

---
 .../terraria/vue/hud/ItemSelectedView.java    | 99 ++++++++++---------
 1 file changed, 55 insertions(+), 44 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java b/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java
index a5418ff..672b7ac 100644
--- a/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java
+++ b/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java
@@ -8,10 +8,13 @@
 import fr.sae.terraria.modele.entities.items.Meat;
 import fr.sae.terraria.modele.entities.items.Vodka;
 import fr.sae.terraria.modele.entities.player.Player;
+import fr.sae.terraria.modele.entities.player.inventory.Inventory;
 import fr.sae.terraria.modele.entities.player.inventory.Stack;
 import fr.sae.terraria.modele.entities.tools.Tool;
 import fr.sae.terraria.vue.View;
 import javafx.collections.ListChangeListener;
+import javafx.collections.ObservableArray;
+import javafx.collections.ObservableList;
 import javafx.scene.image.Image;
 import javafx.scene.image.ImageView;
 import javafx.scene.input.MouseEvent;
@@ -40,9 +43,12 @@ public class ItemSelectedView
 
     private final Pane display;
 
+    private final Player player;
+
 
     public ItemSelectedView(Pane display, Player player, double scaleMultiplicatorWidth, double scaleMultiplicatorHeight)
     {
+        this.player = player;
         this.display = display;
 
         int widthTile = (int) (scaleMultiplicatorWidth * TileMaps.TILE_DEFAULT_SIZE);
@@ -67,23 +73,34 @@ public ItemSelectedView(Pane display, Player player, double scaleMultiplicatorWi
 
         // Reset
         player.getInventory().get().addListener((ListChangeListener<? super Stack>) c -> {
-            while (c.next()) {
-                if (c.wasRemoved())
-                    this.itemSelectedImgView.setImage(null);
-            }
+            while (c.next())
+                refreshView();
         });
 
         player.getInventory().posCursorProperty().addListener((obs, oldItemSelected, newItemSelected) -> {
-            this.itemSelectedImgView.setImage(null);
-            if (!Objects.isNull(player.getStackSelected())) {
-                StowableObjectType item = player.getStackSelected().getItem();
-
-                if (item instanceof Meat)
-                    this.itemSelectedImgView.setImage(this.meatItemImg);
-                else if (item instanceof Vodka)
-                    this.itemSelectedImgView.setImage(this.vodkaItemImg);
-                else if (item instanceof Arrow)
-                    this.itemSelectedImgView.setImage(null);
+            refreshView();
+        });
+
+        display.addEventFilter(MouseEvent.MOUSE_MOVED, mouse -> {
+            itemSelectedImgView.setX(mouse.getX());
+            itemSelectedImgView.setY(mouse.getY());
+        });
+    }
+
+    private void refreshView(){
+        ObservableList<Stack> inventory = this.player.getInventory().get();
+        int posCursor = this.player.getInventory().getPosCursor();
+
+        this.itemSelectedImgView.setImage(null);
+        if (posCursor < inventory.size() && posCursor >= 0) {
+            StowableObjectType item = inventory.get(posCursor).getItem();
+
+            if (item instanceof Meat)
+                this.itemSelectedImgView.setImage(this.meatItemImg);
+            else if (item instanceof Vodka)
+                this.itemSelectedImgView.setImage(this.vodkaItemImg);
+            else if (item instanceof Arrow)
+                this.itemSelectedImgView.setImage(null);
 
                 if (item instanceof Block)
                 {
@@ -97,38 +114,32 @@ else if (Block.isTorch((Block) item))
                         this.itemSelectedImgView.setImage(this.torchItemImg);
                 }
 
-                if (item instanceof Tool) {
-                    if (Tool.isAxe((Tool) item))
-                        this.itemSelectedImgView.setImage(null);
-                    else if (Tool.isBow((Tool) item))
-                        this.itemSelectedImgView.setImage(null);
-                    else if (Tool.isPickaxe((Tool) item))
-                        this.itemSelectedImgView.setImage(this.pickaxeItemImg);
-                    else if (Tool.isSword((Tool) item))
-                        this.itemSelectedImgView.setImage(this.swordItemImg);
-                }
-
-                if (item instanceof Item) {
-                    if (Item.isCoal(item))
-                        this.itemSelectedImgView.setImage(this.coalItemImg);
-                    else if (Item.isFiber(item))
-                        this.itemSelectedImgView.setImage(this.fibreItemImg);
-                    else if (Item.isIron(item))
-                        this.itemSelectedImgView.setImage(this.ironItemImg);
-                    else if (Item.isStone(item))
-                        this.itemSelectedImgView.setImage(this.stoneItemImg);
-                    else if (Item.isSilex(item))
-                        this.itemSelectedImgView.setImage(this.silexItemImg);
-                    else if (Item.isWood(item))
-                        this.itemSelectedImgView.setImage(this.woodItemImg);
-                }
+            if (item instanceof Tool) {
+                if (Tool.isAxe((Tool) item))
+                    this.itemSelectedImgView.setImage(null);
+                else if (Tool.isBow((Tool) item))
+                    this.itemSelectedImgView.setImage(null);
+                else if (Tool.isPickaxe((Tool) item))
+                    this.itemSelectedImgView.setImage(this.pickaxeItemImg);
+                else if (Tool.isSword((Tool) item))
+                    this.itemSelectedImgView.setImage(this.swordItemImg);
             }
-        });
 
-        display.addEventFilter(MouseEvent.MOUSE_MOVED, mouse -> {
-            itemSelectedImgView.setX(mouse.getX());
-            itemSelectedImgView.setY(mouse.getY());
-        });
+            if (item instanceof Item) {
+                if (Item.isCoal(item))
+                    this.itemSelectedImgView.setImage(this.coalItemImg);
+                else if (Item.isFiber(item))
+                    this.itemSelectedImgView.setImage(this.fibreItemImg);
+                else if (Item.isIron(item))
+                    this.itemSelectedImgView.setImage(this.ironItemImg);
+                else if (Item.isStone(item))
+                    this.itemSelectedImgView.setImage(this.stoneItemImg);
+                else if (Item.isSilex(item))
+                    this.itemSelectedImgView.setImage(this.silexItemImg);
+                else if (Item.isWood(item))
+                    this.itemSelectedImgView.setImage(this.woodItemImg);
+            }
+        }
     }
 
     public void display() { display.getChildren().add(itemSelectedImgView); }

From 6396cdaa8b10259966ae6c2930698739a702c1f6 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Tue, 14 Jun 2022 11:54:06 +0200
Subject: [PATCH 69/97] =?UTF-8?q?Fix=20d=C3=A9passement=20limite=20inventa?=
 =?UTF-8?q?ire?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../terraria/modele/entities/player/inventory/Inventory.java   | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
index d8c9789..97eab23 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
@@ -93,7 +93,8 @@ public void put(StowableObjectType item)
                         return;
                 }
                 // Si tous les stacks present sont pleins ou aucune ne correspond à l'objet qui à étais pris, il crée un nouveau stack
-                this.createStack(item);
+                if (this.value.size() < 9)
+                    this.createStack(item);
             }
         }
     }

From 2699c6998d228bed8d88a2d070e23869bd781aed Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Tue, 14 Jun 2022 11:54:43 +0200
Subject: [PATCH 70/97] =?UTF-8?q?Fix=20d=C3=A9passement=20limite=20inventa?=
 =?UTF-8?q?ire?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../terraria/modele/entities/player/inventory/Inventory.java    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
index 97eab23..8197938 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
@@ -93,7 +93,7 @@ public void put(StowableObjectType item)
                         return;
                 }
                 // Si tous les stacks present sont pleins ou aucune ne correspond à l'objet qui à étais pris, il crée un nouveau stack
-                if (this.value.size() < 9)
+                if (this.value.size() < (Inventory.NB_BOXES_MAX / Inventory.NB_LINES))
                     this.createStack(item);
             }
         }

From 9ed122ab7bd85f328fea2637fc2f4c1762ba6f60 Mon Sep 17 00:00:00 2001
From: Tiago Lousa <tig2468.a@gmail.com>
Date: Tue, 14 Jun 2022 11:50:44 +0200
Subject: [PATCH 71/97] fix loot tall grass

---
 src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
index bde3826..2cdedf1 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
@@ -77,7 +77,7 @@ private void loots()
             for (int loot = 0; loot < Block.ROCK_NB_LOOTS; loot++)
                 player.pickup(Item.STONE);
         } else if (Block.isTallGrass(this)) {
-            for (int loot = (int) (Math.random()*3)+1; loot < TallGrass.LOOTS_FIBRE_MAX; loot++)
+            for (int loot = (int) (Math.random()*3)+1; loot <= TallGrass.LOOTS_FIBRE_MAX; loot++)
                 player.pickup(Item.FIBER);
 
             boolean mustDropVodka = Math.random() < Vodka.DROP_RATE;

From 0279cbb15dff566f0df7a36bdd1096cb94d0aff6 Mon Sep 17 00:00:00 2001
From: Tiago Lousa <tig2468.a@gmail.com>
Date: Tue, 14 Jun 2022 12:05:57 +0200
Subject: [PATCH 72/97] fix pioche qui ne cassais plus la pierre

---
 .../sae/terraria/modele/entities/player/inventory/Inventory.java | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
index 8197938..f36812f 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
@@ -65,7 +65,6 @@ private void createStack(StowableObjectType item)
         });
         stack.setItem(item);
         this.value.add(stack);
-        this.player.setStackSelected(stack);
     }
 
     public int nbStacksIntoInventory() { return this.value.size(); }

From 4c65755dabb92efda1b3f91ecaae02df006d7eac Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Tue, 14 Jun 2022 12:18:27 +0200
Subject: [PATCH 73/97] Fix cast error on Slime.java

---
 src/main/java/fr/sae/terraria/modele/entities/Slime.java    | 2 +-
 .../modele/entities/player/inventory/Inventory.java         | 5 ++---
 src/main/java/fr/sae/terraria/vue/hud/InventoryView.java    | 2 +-
 src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java | 6 +-----
 .../fr/sae/terraria/modele/entities/player/PlayerTest.java  | 2 +-
 .../modele/entities/player/inventory/InventoryTest.java     | 2 +-
 6 files changed, 7 insertions(+), 12 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/modele/entities/Slime.java b/src/main/java/fr/sae/terraria/modele/entities/Slime.java
index f798ecd..21d6674 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/Slime.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/Slime.java
@@ -84,7 +84,7 @@ else if (environment.getPlayer().getX() < this.x.getValue())
 
         Stack stack = this.environment.getPlayer().getStackSelected();
         if (!Objects.isNull(stack)) {
-            if (Tool.isSword((Tool) stack.getItem())) {
+            if (stack.getItem() instanceof Tool && Tool.isSword((Tool) stack.getItem())) {
                 Tool tool = (Tool) stack.getItem();
                 this.setPv(this.getPv() - tool.damage());
             }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
index 8197938..066e24c 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
@@ -5,7 +5,6 @@
 import javafx.beans.property.IntegerProperty;
 import javafx.beans.property.SimpleIntegerProperty;
 import javafx.collections.FXCollections;
-import javafx.collections.ListChangeListener;
 import javafx.collections.ObservableList;
 import javafx.scene.input.KeyCode;
 
@@ -38,7 +37,7 @@ public Inventory(final Player player)
         this.posCursor = new SimpleIntegerProperty(0);
 
         // Change l'item qui se trouve dans la main du joueur
-        this.posCursorProperty().addListener((obs, oldPos, newPos) -> {
+        this.cursorProperty().addListener((obs, oldPos, newPos) -> {
             boolean isntOutOfInventoryBar = newPos.intValue() >= 0 && newPos.intValue() < nbElementOnOneLineOfInventory;
 
             if (isntOutOfInventoryBar)
@@ -141,7 +140,7 @@ else if (key.equals(KeyCode.DIGIT9))
 
         this.scroll = 0;
     }
-    public IntegerProperty posCursorProperty() { return this.posCursor; }
+    public IntegerProperty cursorProperty() { return this.posCursor; }
 
 
     public Stack getStack() { return this.value.get(this.getPosCursor()); }
diff --git a/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java b/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java
index 81b2edd..8fbd19f 100644
--- a/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java
+++ b/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java
@@ -192,7 +192,7 @@ private void displayCursorInventoryBar()
     {
         this.cursorImgView.setX(((windowWidth - inventoryBarImg.getWidth()) / 2 - scaleMultiplicatorWidth));
         this.cursorImgView.setY(((windowHeight - inventoryBarImg.getHeight()) - tileHeight) - scaleMultiplicatorHeight);
-        this.inventory.posCursorProperty().addListener((obs, oldV, newV) -> this.cursorImgView.setX(((windowWidth - inventoryBarImg.getWidth()) / 2 + ((inventoryBarImg.getWidth() / 9) * newV.intValue() - scaleMultiplicatorWidth))));
+        this.inventory.cursorProperty().addListener((obs, oldV, newV) -> this.cursorImgView.setX(((windowWidth - inventoryBarImg.getWidth()) / 2 + ((inventoryBarImg.getWidth() / 9) * newV.intValue() - scaleMultiplicatorWidth))));
 
         this.display.getChildren().add(cursorImgView);
     }
diff --git a/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java b/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java
index 672b7ac..94487e5 100644
--- a/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java
+++ b/src/main/java/fr/sae/terraria/vue/hud/ItemSelectedView.java
@@ -8,20 +8,16 @@
 import fr.sae.terraria.modele.entities.items.Meat;
 import fr.sae.terraria.modele.entities.items.Vodka;
 import fr.sae.terraria.modele.entities.player.Player;
-import fr.sae.terraria.modele.entities.player.inventory.Inventory;
 import fr.sae.terraria.modele.entities.player.inventory.Stack;
 import fr.sae.terraria.modele.entities.tools.Tool;
 import fr.sae.terraria.vue.View;
 import javafx.collections.ListChangeListener;
-import javafx.collections.ObservableArray;
 import javafx.collections.ObservableList;
 import javafx.scene.image.Image;
 import javafx.scene.image.ImageView;
 import javafx.scene.input.MouseEvent;
 import javafx.scene.layout.Pane;
 
-import java.util.Objects;
-
 
 public class ItemSelectedView
 {
@@ -77,7 +73,7 @@ public ItemSelectedView(Pane display, Player player, double scaleMultiplicatorWi
                 refreshView();
         });
 
-        player.getInventory().posCursorProperty().addListener((obs, oldItemSelected, newItemSelected) -> {
+        player.getInventory().cursorProperty().addListener((obs, oldItemSelected, newItemSelected) -> {
             refreshView();
         });
 
diff --git a/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java b/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
index 88feb0a..f1b3e85 100644
--- a/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
+++ b/src/test/java/fr/sae/terraria/modele/entities/player/PlayerTest.java
@@ -184,7 +184,7 @@ public class PlayerTest
 
     @Test public final void pickupTest()
     {
-        player.getInventory().posCursorProperty().set(0);
+        player.getInventory().cursorProperty().set(0);
 
 
         // Test avec de la viande
diff --git a/src/test/java/fr/sae/terraria/modele/entities/player/inventory/InventoryTest.java b/src/test/java/fr/sae/terraria/modele/entities/player/inventory/InventoryTest.java
index 086c9c7..0e46f39 100644
--- a/src/test/java/fr/sae/terraria/modele/entities/player/inventory/InventoryTest.java
+++ b/src/test/java/fr/sae/terraria/modele/entities/player/inventory/InventoryTest.java
@@ -36,7 +36,7 @@ public class InventoryTest
 
     @Test public final void nbItemsIntoStackTest()
     {
-        inventory.posCursorProperty().set(0);
+        inventory.cursorProperty().set(0);
         for (int i = 0; i < Stack.MAX; i++)
             inventory.put(new Block(BlockSet.DIRT, environment));
         assertEquals(Stack.MAX, inventory.getStack().getNbItems());

From 16b081aec19cef8eed4c9a4c4d99d265205d8dc2 Mon Sep 17 00:00:00 2001
From: theblackreaper <abouche0603@gmail.com>
Date: Tue, 14 Jun 2022 12:20:39 +0200
Subject: [PATCH 74/97] creation du craft

---
 .../terraria/controller/MenuController.java   |  26 ++--
 .../modele/entities/player/Player.java        |   4 +
 .../entities/player/inventory/Craft.java      | 134 ++++++++++++++++++
 .../entities/player/inventory/Inventory.java  |   1 +
 .../entities/player/inventory/Stack.java      |   1 +
 .../resources/fr/sae/terraria/vue/menu.fxml   |  78 ++++++++--
 6 files changed, 226 insertions(+), 18 deletions(-)
 create mode 100644 src/main/java/fr/sae/terraria/modele/entities/player/inventory/Craft.java

diff --git a/src/main/java/fr/sae/terraria/controller/MenuController.java b/src/main/java/fr/sae/terraria/controller/MenuController.java
index 372bc30..605993c 100644
--- a/src/main/java/fr/sae/terraria/controller/MenuController.java
+++ b/src/main/java/fr/sae/terraria/controller/MenuController.java
@@ -21,6 +21,7 @@
 import java.net.URL;
 import java.util.Objects;
 import java.util.ResourceBundle;
+import java.util.concurrent.locks.ReentrantLock;
 
 
 public class MenuController implements Initializable
@@ -29,7 +30,18 @@ public class MenuController implements Initializable
     @FXML public Pane displayInventory;
     @FXML public Pane displayLexique;
     @FXML public HBox HBoxText;
-    @FXML public HBox lexique4;
+    @FXML public HBox lexiconStone;
+    @FXML public HBox lexiconPickaxe1;
+    @FXML public HBox lexiconPickaxe2;
+    @FXML public HBox lexiconPickaxe3;
+    @FXML public HBox lexiconAxe1;
+    @FXML public HBox lexiconAxe2;
+    @FXML public HBox lexiconAxe3;
+    @FXML public HBox lexiconSword1;
+    @FXML public HBox lexiconSword2;
+    @FXML public HBox lexiconSword3;
+
+
 
     public Timeline loop;
     private Stage stage;
@@ -63,17 +75,11 @@ public MenuController(final Stage stage)
         this.loop.play();
 
         // Craft de la roche à partir de 3 pierres
-        this.lexique4.addEventFilter(Event.ANY, ev -> {
+        this.lexiconStone.addEventFilter(Event.ANY, ev -> {
             if (ev.getEventType().getName().equalsIgnoreCase("MOUSE_PRESSED")) {
                 int i = this.player.getInventory().get().size()-1;
-                while (i > 0 && !(this.player.getInventory().get().get(i).getItem().equals(Item.STONE)) && this.player.getInventory().get().get(i).getNbItems() >= Block.ROCK_NB_LOOTS)
-                    i--;
-
-                Stack stack = this.player.getInventory().get().get(i);
-                if (stack.getItem() instanceof Item && stack.getItem().equals(Item.STONE)) {
-                    for (int j = 0; j < Block.ROCK_NB_LOOTS; j++)
-                        stack.remove();
-                    this.player.pickup(new Block(BlockSet.ROCK, this.environment));
+                if (player.getCraft().possibleToCreateTool(10)) {
+                    player.getCraft().createTool(10);
                 }
             }
         });
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
index 04f033b..474b30c 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
@@ -3,6 +3,7 @@
 import fr.sae.terraria.modele.Environment;
 import fr.sae.terraria.modele.TileMaps;
 import fr.sae.terraria.modele.entities.entity.*;
+import fr.sae.terraria.modele.entities.player.inventory.Craft;
 import fr.sae.terraria.modele.entities.player.inventory.Inventory;
 import fr.sae.terraria.modele.entities.player.inventory.Stack;
 import fr.sae.terraria.vue.View;
@@ -28,6 +29,7 @@ public class Player extends EntityMovable implements CollideObjectType, Collapsi
 
     private final Inventory inventory;
     private Stack stackSelected;
+    private Craft craft;
 
 
     public Player(final Environment environment)
@@ -36,6 +38,7 @@ public Player(final Environment environment)
 
         this.drunk = new SimpleBooleanProperty(false);
         this.inventory = new Inventory(this);
+        this.craft = new Craft(this.inventory, environment);
 
         this.animation = new Animation();
         this.keysInput = new EnumMap<>(KeyCode.class);
@@ -166,6 +169,7 @@ else if (key == KeyCode.Q)
     public Map<KeyCode, Boolean> getKeysInput() { return this.keysInput; }
     public Stack getStackSelected() { return this.stackSelected; }
     public Inventory getInventory() { return this.inventory; }
+    public Craft getCraft() { return craft; }
 
     public void setStackSelected(Stack stackSelected) { this.stackSelected = stackSelected; }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Craft.java b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Craft.java
new file mode 100644
index 0000000..882e19a
--- /dev/null
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Craft.java
@@ -0,0 +1,134 @@
+package fr.sae.terraria.modele.entities.player.inventory;
+
+import fr.sae.terraria.modele.Environment;
+import fr.sae.terraria.modele.entities.blocks.Block;
+import fr.sae.terraria.modele.entities.blocks.BlockSet;
+import fr.sae.terraria.modele.entities.entity.StowableObjectType;
+import fr.sae.terraria.modele.entities.items.Item;
+
+import fr.sae.terraria.modele.entities.player.Player;
+import fr.sae.terraria.modele.entities.tools.*;
+
+import java.util.Objects;
+
+public class Craft {
+    private Inventory inventory;
+    private Environment environment;
+    public Craft(Inventory inventory, Environment environment) {
+        this.inventory = inventory;
+    }
+
+    public boolean possibleToCreateTool(int id) {
+        boolean firstGood = false;
+        boolean secundGood = false;
+        int quantityNeeded = 0;
+        for (int i = 0; i < this.inventory.NB_BOXES_MAX; i++) {
+            if (id <= 9) {
+                if (id <= 6) {
+                    quantityNeeded = 2;
+                    //TODO a changé le bois en stick
+                    if (Item.isWood(this.inventory.get().get(i).getItem()) && this.inventory.get().get(i).getNbItems() >= quantityNeeded) {
+                        firstGood = true;
+                        quantityNeeded = 3;
+                    }
+
+                } else {
+                    quantityNeeded = 1;
+                    //TODO a changé le bois en stick
+                    if (Item.isWood(this.inventory.get().get(i).getItem()) && this.inventory.get().get(i).getNbItems() >= quantityNeeded) {
+                        firstGood = true;
+                        quantityNeeded = 2;
+                    }
+                }
+                if (id % 3 == 1) {
+                    if (Item.isWood(this.inventory.get().get(i).getItem()) && this.inventory.get().get(i).getNbItems() >= quantityNeeded) {
+                        secundGood = true;
+                    }
+                }
+                if (id % 3 == 2) {
+                    if (Item.isStone(this.inventory.get().get(i).getItem()) && this.inventory.get().get(i).getNbItems() >= quantityNeeded) {
+                        secundGood = true;
+                    }
+                }
+                if (id % 3 == 0) {
+                    if (Item.isIron(this.inventory.get().get(i).getItem()) && this.inventory.get().get(i).getNbItems() >= quantityNeeded) {
+                        secundGood = true;
+                    }
+                }
+            }
+            else if (id == 10) {
+                quantityNeeded = 3;
+                if (Item.isStone(this.inventory.get().get(i).getItem()) && this.inventory.get().get(i).getNbItems() >= quantityNeeded) {
+                    firstGood = true;
+                    secundGood = true;
+                }
+            } else if (id == 11) {
+                quantityNeeded = 3;
+                //TODO a changé le bois en stick
+                if (Item.isWood(this.inventory.get().get(i).getItem()) && this.inventory.get().get(i).getNbItems() >= quantityNeeded) {
+                    firstGood = true;
+                }
+                if (Item.isFiber(this.inventory.get().get(i).getItem()) && this.inventory.get().get(i).getNbItems() >= quantityNeeded)
+                    secundGood = true;
+            }
+            if (firstGood && secundGood)
+                return true;
+        }
+        return false;
+    }
+
+    public void createTool(int id) {
+        int quantityNeeded = 0;
+        if (id == 10)
+            inventory.getPlayer().pickup(new Block(BlockSet.ROCK, this.environment));
+
+        for (int i = 0; i < this.inventory.nbStacksIntoInventory(); i++) {
+            if (id <= 9) {
+                if (id <= 6) {
+                    quantityNeeded = 2;
+                    //TODO a changé le bois en stick
+                    if (Item.isWood(this.inventory.get().get(i).getItem())) {
+                        this.inventory.get().get(i).removeQuantity(quantityNeeded);
+                        quantityNeeded = 3;
+                    }
+
+                } else {
+                    quantityNeeded = 1;
+                    if (Item.isWood(this.inventory.get().get(i).getItem()) && this.inventory.get().get(i).getNbItems() >= quantityNeeded) {
+                        this.inventory.get().get(i).removeQuantity(quantityNeeded);
+                        quantityNeeded = 2;
+                    }
+                }
+                if (id % 3 == 1) {
+                    if (Item.isWood(this.inventory.get().get(i).getItem())) {
+                        this.inventory.get().get(i).removeQuantity(quantityNeeded);
+                    }
+                }
+                if (id % 3 == 2) {
+                    if (Item.isStone(this.inventory.get().get(i).getItem())) {
+                        this.inventory.get().get(i).removeQuantity(quantityNeeded);
+                    }
+                }
+                if (id % 3 == 0) {
+                    if (Item.isIron(this.inventory.get().get(i).getItem())) {
+                        this.inventory.get().get(i).removeQuantity(quantityNeeded);
+                    }
+                }
+            } else if (id == 10) {
+                quantityNeeded = 3;
+                if (Item.isStone(this.inventory.get().get(i).getItem())) {
+                    this.inventory.get().get(i).removeQuantity(quantityNeeded);
+                }
+            } else if (id == 11) {
+                quantityNeeded = 3;
+                if (Item.isWood(this.inventory.get().get(i).getItem())) {
+                    this.inventory.get().get(i).removeQuantity(quantityNeeded);
+                    quantityNeeded = 3;
+                }
+                if (Item.isFiber(this.inventory.get().get(i).getItem()))
+                    this.inventory.get().get(i).removeQuantity(quantityNeeded);
+            }
+
+        }
+    }
+}
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
index 8197938..1aa820b 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
@@ -148,6 +148,7 @@ else if (key.equals(KeyCode.DIGIT9))
     public int getPosCursor() { return this.posCursor.get(); }
     public ObservableList<Stack> get() { return this.value; }
     public Map<KeyCode, Boolean> getKeysInput() { return this.keysInput; }
+    public Player getPlayer() { return player; }
 
     public void setScroll(int newScroll) { this.scroll = newScroll; }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
index 7c54957..ec3cacd 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
@@ -91,6 +91,7 @@ public boolean isSameItem(StowableObjectType obj)
     public boolean isFull() { return this.getNbItems() >= Stack.MAX; }
     public void add() { if (this.getNbItems() < Stack.MAX) this.nbItems.set(this.getNbItems() + 1); }
     public void remove() { if (this.getNbItems() > 0) this.nbItems.set(this.getNbItems() - 1); }
+    public void removeQuantity(int quantity) { if (this.getNbItems() >= quantity) this.nbItems.set(this.getNbItems() - quantity);}
 
     @Override public String toString(){
         if (item instanceof Block)
diff --git a/src/main/resources/fr/sae/terraria/vue/menu.fxml b/src/main/resources/fr/sae/terraria/vue/menu.fxml
index 5206fcf..2f4d6ec 100644
--- a/src/main/resources/fr/sae/terraria/vue/menu.fxml
+++ b/src/main/resources/fr/sae/terraria/vue/menu.fxml
@@ -59,40 +59,102 @@
                               prefHeight="900.0"
                               prefWidth="640.0">
                             <HBox id="notAvailable"
-                                  fx:id="lexique1"
+                                  fx:id="lexiconPickaxe1"
                                   prefHeight="50.0"
                                   prefWidth="625.0">
                                 <Text text="Pioche en fer" textAlignment="CENTER"/>
                                 <Text text="2 Bâtons | 3 Minerais de fer" textAlignment="CENTER"/>
                             </HBox>
-                            <Separator layoutY="50.0" prefHeight="5.0" prefWidth="625.0"/>
+                            <Separator layoutY="75.0" prefHeight="5.0" prefWidth="625.0"/>
                             <HBox id="notAvailable"
-                                  fx:id="lexique2"
+                                  fx:id="lexiconPickaxe2"
+                                  prefHeight="50.0"
+                                  prefWidth="625.0">
+                                <Text text="Pioche en pierre" textAlignment="CENTER"/>
+                                <Text text="2 Bâtons | 3 pierre" textAlignment="CENTER"/>
+                            </HBox>
+                            <Separator layoutY="150.0" prefHeight="5.0" prefWidth="625.0"/>
+                            <HBox id="notAvailable"
+                                  fx:id="lexiconPickaxe3"
+                                  prefHeight="50.0"
+                                  prefWidth="625.0">
+                                <Text text="Pioche en bois" textAlignment="CENTER"/>
+                                <Text text="2 Bâtons | 3 bois" textAlignment="CENTER"/>
+                            </HBox>
+                            <Separator layoutY="225.0" prefHeight="5.0" prefWidth="625.0"/>
+                            <HBox id="notAvailable"
+                                  fx:id="lexiconAxe1"
                                   layoutY="55.0"
                                   prefHeight="50.0"
                                   prefWidth="625.0">
                                 <Text text="Hache en fer" textAlignment="CENTER"/>
                                 <Text text="2 Bâtons | 3 Minerais de fer" textAlignment="CENTER"/>
                             </HBox>
-                            <Separator layoutY="103.0" prefHeight="5.0" prefWidth="625.0"/>
+                            <Separator layoutY="300.0" prefHeight="5.0" prefWidth="625.0"/>
+                            <HBox id="notAvailable"
+                                  fx:id="lexiconAxe2"
+                                  layoutY="55.0"
+                                  prefHeight="50.0"
+                                  prefWidth="625.0">
+                                <Text text="Hache en pierre" textAlignment="CENTER"/>
+                                <Text text="2 Bâtons | 3 pierre" textAlignment="CENTER"/>
+                            </HBox>
+                            <Separator layoutY="375.0" prefHeight="5.0" prefWidth="625.0"/>
+                            <HBox id="notAvailable"
+                                  fx:id="lexiconAxe3"
+                                  layoutY="55.0"
+                                  prefHeight="50.0"
+                                  prefWidth="625.0">
+                                <Text text="Hache en bois" textAlignment="CENTER"/>
+                                <Text text="2 Bâtons | 3 bois" textAlignment="CENTER"/>
+                            </HBox>
+                            <Separator layoutY="450.0" prefHeight="5.0" prefWidth="625.0"/>
                             <HBox id="notAvailable"
-                                  fx:id="lexique3"
+                                  fx:id="lexiconSword1"
                                   layoutY="108.0"
                                   prefHeight="50.0"
                                   prefWidth="625.0">
                                 <Text text="Epée en fer" textAlignment="CENTER"/>
                                 <Text text="1 Bâton | 2 Minerais de fer"/>
                             </HBox>
-                            <Separator layoutY="158.0" prefHeight="5.0" prefWidth="625.0"/>
+                            <Separator layoutY="525.0" prefHeight="5.0" prefWidth="625.0"/>
+                            <HBox id="notAvailable"
+                                  fx:id="lexiconSword2"
+                                  layoutY="108.0"
+                                  prefHeight="50.0"
+                                  prefWidth="625.0">
+                                <Text text="Epée en pierre" textAlignment="CENTER"/>
+                                <Text text="1 Bâton | 2 pierre"/>
+                            </HBox>
+                            <Separator layoutY="600.0" prefHeight="5.0" prefWidth="625.0"/>
+                            <HBox id="notAvailable"
+                                  fx:id="lexiconSword3"
+                                  layoutY="108.0"
+                                  prefHeight="50.0"
+                                  prefWidth="625.0">
+                                <Text text="Epée en bois" textAlignment="CENTER"/>
+                                <Text text="1 Bâton | 2 bois"/>
+                            </HBox>
+                            <Separator layoutY="675.0" prefHeight="5.0" prefWidth="625.0"/>
                             <HBox id="notAvailable"
-                                  fx:id="lexique4"
+                                  fx:id="lexiconStone"
                                   layoutY="163.0"
                                   prefHeight="50.0"
                                   prefWidth="625.0">
                                 <Text text="1 Roche" textAlignment="CENTER"/>
                                 <Text text="3 pierres"/>
                             </HBox>
-                            <Separator layoutY="213.0" prefHeight="5.0" prefWidth="625.0"/>
+                            <Separator layoutY="750.0" prefHeight="5.0" prefWidth="625.0"/>
+                            <!--<HBox id="notAvailable"
+                                  fx:id="lexiconBow"
+                                  layoutY="163.0"
+                                  prefHeight="50.0"
+                                  prefWidth="625.0">
+                                <Text text="arc" textAlignment="CENTER"/>
+                                <Text text="3 Bâton | 3 fibres"/>
+                            </HBox>
+                            <Separator layoutY="825.0" prefHeight="5.0" prefWidth="625.0"/>
+                            -->
                         </Pane>
                     </ScrollPane>
                 </center>

From d42a0865a406e1fa027b4f92623448f3fc03d617 Mon Sep 17 00:00:00 2001
From: Tiago Lousa <tig2468.a@gmail.com>
Date: Tue, 14 Jun 2022 12:26:11 +0200
Subject: [PATCH 75/97] =?UTF-8?q?oubli=20refreshStack=20quand=20un=20item?=
 =?UTF-8?q?=20est=20r=C3=A9cup=C3=A9r=C3=A9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/main/java/fr/sae/terraria/modele/entities/player/Player.java | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
index 474b30c..990b098 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
@@ -123,6 +123,7 @@ public void interactWithBlock(final Rectangle2D rectangle)
                 ((BreakableObjectType) entity).breaks();
             if (entity instanceof CollapsibleObjectType)
                 ((CollapsibleObjectType) entity).hit();
+            this.inventory.refreshStack();
         }
     }
 

From 59e8db10402cc72b2f6cfca009f7ad3ccb1acfc5 Mon Sep 17 00:00:00 2001
From: theblackreaper <abouche0603@gmail.com>
Date: Tue, 14 Jun 2022 13:55:34 +0200
Subject: [PATCH 76/97] fix craft

---
 .../modele/entities/player/inventory/Craft.java | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Craft.java b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Craft.java
index 882e19a..c633f7b 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Craft.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Craft.java
@@ -16,6 +16,7 @@ public class Craft {
     private Environment environment;
     public Craft(Inventory inventory, Environment environment) {
         this.inventory = inventory;
+        this.environment = environment;
     }
 
     public boolean possibleToCreateTool(int id) {
@@ -79,6 +80,18 @@ else if (id == 10) {
 
     public void createTool(int id) {
         int quantityNeeded = 0;
+        if (id == 1)
+            inventory.getPlayer().pickup(new Tool(ToolSet.PICKAXE, MaterialSet.IRON));
+        else if (id == 3)
+            inventory.getPlayer().pickup(new Tool(ToolSet.PICKAXE, MaterialSet.WOOD));
+        else if (id == 4)
+            inventory.getPlayer().pickup(new Tool(ToolSet.AXE, MaterialSet.IRON));
+        else if (id == 6)
+            inventory.getPlayer().pickup(new Tool(ToolSet.AXE, MaterialSet.WOOD));
+        else if (id == 7)
+            inventory.getPlayer().pickup(new Tool(ToolSet.SWORD, MaterialSet.IRON));
+        else if(id == 9)
+            inventory.getPlayer().pickup(new Tool(ToolSet.SWORD, MaterialSet.WOOD));
         if (id == 10)
             inventory.getPlayer().pickup(new Block(BlockSet.ROCK, this.environment));
 
@@ -99,7 +112,7 @@ public void createTool(int id) {
                         quantityNeeded = 2;
                     }
                 }
-                if (id % 3 == 1) {
+                if (id % 3 == 0) {
                     if (Item.isWood(this.inventory.get().get(i).getItem())) {
                         this.inventory.get().get(i).removeQuantity(quantityNeeded);
                     }
@@ -109,7 +122,7 @@ public void createTool(int id) {
                         this.inventory.get().get(i).removeQuantity(quantityNeeded);
                     }
                 }
-                if (id % 3 == 0) {
+                if (id % 3 == 1) {
                     if (Item.isIron(this.inventory.get().get(i).getItem())) {
                         this.inventory.get().get(i).removeQuantity(quantityNeeded);
                     }

From ab8131870f769bc2eb04d0fe09547ccbd6e40219 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Wed, 15 Jun 2022 13:15:24 +0200
Subject: [PATCH 77/97] Prototype structure craft

---
 .../terraria/controller/MenuController.java   | 21 ++++-----
 .../sae/terraria/modele/entities/Slime.java   |  6 ++-
 .../terraria/modele/entities/items/Item.java  |  4 +-
 .../modele/entities/player/Player.java        |  7 +--
 .../player/{inventory => craft}/Craft.java    | 46 +++++++++++++------
 .../player/craft/recipes/PickaxeRecipe.java   | 45 ++++++++++++++++++
 .../player/craft/recipes/RockRecipe.java      |  7 +++
 .../entities/player/inventory/Stack.java      | 11 ++++-
 .../modele/entities/tools/MaterialSet.java    |  3 ++
 src/main/java/module-info.java                |  2 +
 .../resources/fr/sae/terraria/vue/menu.fxml   | 26 +++++------
 11 files changed, 131 insertions(+), 47 deletions(-)
 rename src/main/java/fr/sae/terraria/modele/entities/player/{inventory => craft}/Craft.java (84%)
 create mode 100644 src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/PickaxeRecipe.java
 create mode 100644 src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/RockRecipe.java

diff --git a/src/main/java/fr/sae/terraria/controller/MenuController.java b/src/main/java/fr/sae/terraria/controller/MenuController.java
index 605993c..27901c2 100644
--- a/src/main/java/fr/sae/terraria/controller/MenuController.java
+++ b/src/main/java/fr/sae/terraria/controller/MenuController.java
@@ -6,6 +6,7 @@
 import fr.sae.terraria.modele.entities.blocks.BlockSet;
 import fr.sae.terraria.modele.entities.items.Item;
 import fr.sae.terraria.modele.entities.player.Player;
+import fr.sae.terraria.modele.entities.player.craft.Craft;
 import fr.sae.terraria.modele.entities.player.inventory.Stack;
 import javafx.animation.Animation;
 import javafx.animation.KeyFrame;
@@ -30,12 +31,12 @@ public class MenuController implements Initializable
     @FXML public Pane displayInventory;
     @FXML public Pane displayLexique;
     @FXML public HBox HBoxText;
-    @FXML public HBox lexiconStone;
-    @FXML public HBox lexiconPickaxe1;
-    @FXML public HBox lexiconPickaxe2;
-    @FXML public HBox lexiconPickaxe3;
+    @FXML public HBox recipeRock;
+    @FXML public HBox recipeWoodPickaxe;
+    @FXML public HBox recipeStonePickaxe;
+    @FXML public HBox recipeIronPickaxe;
     @FXML public HBox lexiconAxe1;
-    @FXML public HBox lexiconAxe2;
+    @FXML public HBox recipeStoneAxe;
     @FXML public HBox lexiconAxe3;
     @FXML public HBox lexiconSword1;
     @FXML public HBox lexiconSword2;
@@ -75,13 +76,9 @@ public MenuController(final Stage stage)
         this.loop.play();
 
         // Craft de la roche à partir de 3 pierres
-        this.lexiconStone.addEventFilter(Event.ANY, ev -> {
-            if (ev.getEventType().getName().equalsIgnoreCase("MOUSE_PRESSED")) {
-                int i = this.player.getInventory().get().size()-1;
-                if (player.getCraft().possibleToCreateTool(10)) {
-                    player.getCraft().createTool(10);
-                }
-            }
+        this.recipeRock.addEventFilter(Event.ANY, ev -> {
+            if (ev.getEventType().getName().equalsIgnoreCase("MOUSE_PRESSED"))
+                player.pickup(Craft.rock(this.environment));
         });
     }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/Slime.java b/src/main/java/fr/sae/terraria/modele/entities/Slime.java
index 21d6674..241fa32 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/Slime.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/Slime.java
@@ -29,7 +29,8 @@ public Slime(Environment environment, int x, int y)
 
     public Slime(Environment environment) { this(environment, 0, 0); }
 
-    @Override public void updates() {
+    @Override public void updates()
+    {
         if (this.isIDLEonY() && !this.air) {
             this.gravity.xInit = this.x.get();
             this.gravity.yInit = this.y.get();
@@ -55,7 +56,8 @@ else if (environment.getPlayer().getX() < this.x.getValue())
         this.animation.loop();
     }
 
-    @Override public void collide() {
+    @Override public void collide()
+    {
         Map<String, Boolean> whereCollide = super.collide(this.environment);
 
         if (!whereCollide.isEmpty())
diff --git a/src/main/java/fr/sae/terraria/modele/entities/items/Item.java b/src/main/java/fr/sae/terraria/modele/entities/items/Item.java
index d458bf8..f4d9e69 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/items/Item.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/items/Item.java
@@ -10,7 +10,8 @@ public enum Item implements StowableObjectType
     IRON,
     SILEX,
     STONE,
-    WOOD;
+    WOOD,
+    STICKS;
 
 
     public static boolean isCoal(StowableObjectType obj) { return obj == Item.COAL; }
@@ -19,4 +20,5 @@ public enum Item implements StowableObjectType
     public static boolean isStone(StowableObjectType obj) { return obj == Item.STONE; }
     public static boolean isSilex(StowableObjectType obj) { return obj == Item.SILEX; }
     public static boolean isWood(StowableObjectType obj) { return obj == Item.WOOD; }
+    public static boolean isStick(StowableObjectType obj) { return obj == Item.STICKS; }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
index 990b098..3ff8a53 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
@@ -3,7 +3,7 @@
 import fr.sae.terraria.modele.Environment;
 import fr.sae.terraria.modele.TileMaps;
 import fr.sae.terraria.modele.entities.entity.*;
-import fr.sae.terraria.modele.entities.player.inventory.Craft;
+import fr.sae.terraria.modele.entities.player.craft.Craft;
 import fr.sae.terraria.modele.entities.player.inventory.Inventory;
 import fr.sae.terraria.modele.entities.player.inventory.Stack;
 import fr.sae.terraria.vue.View;
@@ -29,7 +29,6 @@ public class Player extends EntityMovable implements CollideObjectType, Collapsi
 
     private final Inventory inventory;
     private Stack stackSelected;
-    private Craft craft;
 
 
     public Player(final Environment environment)
@@ -38,7 +37,6 @@ public Player(final Environment environment)
 
         this.drunk = new SimpleBooleanProperty(false);
         this.inventory = new Inventory(this);
-        this.craft = new Craft(this.inventory, environment);
 
         this.animation = new Animation();
         this.keysInput = new EnumMap<>(KeyCode.class);
@@ -161,7 +159,7 @@ else if (key == KeyCode.Q)
         });
     }
 
-    public void pickup(StowableObjectType pickupObject) { this.inventory.put(pickupObject); }
+    public void pickup(StowableObjectType pickupObj) { if (!Objects.isNull(pickupObj)) this.inventory.put(pickupObj); }
 
     public SimpleBooleanProperty drunkProperty() { return drunk; }
 
@@ -170,7 +168,6 @@ else if (key == KeyCode.Q)
     public Map<KeyCode, Boolean> getKeysInput() { return this.keysInput; }
     public Stack getStackSelected() { return this.stackSelected; }
     public Inventory getInventory() { return this.inventory; }
-    public Craft getCraft() { return craft; }
 
     public void setStackSelected(Stack stackSelected) { this.stackSelected = stackSelected; }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Craft.java b/src/main/java/fr/sae/terraria/modele/entities/player/craft/Craft.java
similarity index 84%
rename from src/main/java/fr/sae/terraria/modele/entities/player/inventory/Craft.java
rename to src/main/java/fr/sae/terraria/modele/entities/player/craft/Craft.java
index c633f7b..4df0243 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Craft.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/craft/Craft.java
@@ -1,29 +1,24 @@
-package fr.sae.terraria.modele.entities.player.inventory;
+package fr.sae.terraria.modele.entities.player.craft;
 
 import fr.sae.terraria.modele.Environment;
 import fr.sae.terraria.modele.entities.blocks.Block;
 import fr.sae.terraria.modele.entities.blocks.BlockSet;
-import fr.sae.terraria.modele.entities.entity.StowableObjectType;
 import fr.sae.terraria.modele.entities.items.Item;
 
-import fr.sae.terraria.modele.entities.player.Player;
+import fr.sae.terraria.modele.entities.player.craft.recipes.RockRecipe;
+import fr.sae.terraria.modele.entities.player.inventory.Inventory;
+import fr.sae.terraria.modele.entities.player.inventory.Stack;
 import fr.sae.terraria.modele.entities.tools.*;
 
-import java.util.Objects;
 
-public class Craft {
-    private Inventory inventory;
-    private Environment environment;
-    public Craft(Inventory inventory, Environment environment) {
-        this.inventory = inventory;
-        this.environment = environment;
-    }
+public class Craft
+{
 
     public boolean possibleToCreateTool(int id) {
         boolean firstGood = false;
         boolean secundGood = false;
         int quantityNeeded = 0;
-        for (int i = 0; i < this.inventory.NB_BOXES_MAX; i++) {
+        for (int i = 0; i < Inventory.NB_BOXES_MAX; i++) {
             if (id <= 9) {
                 if (id <= 6) {
                     quantityNeeded = 2;
@@ -93,7 +88,7 @@ else if (id == 7)
         else if(id == 9)
             inventory.getPlayer().pickup(new Tool(ToolSet.SWORD, MaterialSet.WOOD));
         if (id == 10)
-            inventory.getPlayer().pickup(new Block(BlockSet.ROCK, this.environment));
+            inventory.getPlayer().pickup(new Block(BlockSet.ROCK, null));
 
         for (int i = 0; i < this.inventory.nbStacksIntoInventory(); i++) {
             if (id <= 9) {
@@ -144,4 +139,29 @@ else if(id == 9)
 
         }
     }
+
+
+    public static Block rock(final Environment environment)
+    {
+        Inventory inventory = environment.getPlayer().getInventory();
+
+        for (int i = 0; i < inventory.get().size(); i++) {
+            Stack stack = inventory.get().get(i);
+            if (Item.isStone(stack.getItem()) && stack.removeQuantity(RockRecipe.NB_STONES))
+                return new Block(BlockSet.ROCK, environment);
+        }
+        return null;
+    }
+
+    public static Block pickaxe(final Environment environment, final MaterialSet material)
+    {
+        Inventory inventory = environment.getPlayer().getInventory();
+
+        for (int i = 0; i < inventory.get().size(); i++) {
+            Stack stack = inventory.get().get(i);
+
+
+        }
+        return null;
+    }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/PickaxeRecipe.java b/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/PickaxeRecipe.java
new file mode 100644
index 0000000..ba9128c
--- /dev/null
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/PickaxeRecipe.java
@@ -0,0 +1,45 @@
+package fr.sae.terraria.modele.entities.player.craft.recipes;
+
+import fr.sae.terraria.modele.entities.items.Item;
+import fr.sae.terraria.modele.entities.player.inventory.Inventory;
+import fr.sae.terraria.modele.entities.player.inventory.Stack;
+import fr.sae.terraria.modele.entities.tools.MaterialSet;
+
+
+public class PickaxeRecipe
+{
+    public static final class WOOD_RECIPE
+    {
+        public static final int NB_WOODS = 3;
+        public static final int NB_STICKS = 2;
+
+        public static boolean apply(final Inventory inventory)
+        {
+            boolean haveEnoughForPickaxeHead = false;
+            boolean haveEnoughForPickaxeHandler = false;
+
+            for (int i = 0; i < inventory.get().size(); i++) {
+                Stack stack = inventory.get().get(i);
+                if (Item.isWood(stack.getItem()) && stack.haveEnoughQuantity(NB_WOODS))
+                    haveEnoughForPickaxeHead = true;
+                if (Item.isStick(stack.getItem()) && stack.haveEnoughQuantity(NB_STICKS))
+                    haveEnoughForPickaxeHandler = true;
+            }
+        }
+    }
+
+    public static final class STONE
+    {
+        public static final int NB_STONE = 3;
+        public static final int NB_STICK = 2;
+    }
+
+    public static final class IRON
+    {
+        public static final int NB_IRONS = 3;
+        public static final int NB_STICKS = 2;
+    }
+
+
+
+}
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/RockRecipe.java b/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/RockRecipe.java
new file mode 100644
index 0000000..d880339
--- /dev/null
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/RockRecipe.java
@@ -0,0 +1,7 @@
+package fr.sae.terraria.modele.entities.player.craft.recipes;
+
+
+public class RockRecipe
+{
+    public static final int NB_STONES = 4;
+}
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
index ec3cacd..5819999 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
@@ -89,9 +89,18 @@ public boolean isSameItem(StowableObjectType obj)
     public IntegerProperty nbItemsProperty() { return this.nbItems; }
 
     public boolean isFull() { return this.getNbItems() >= Stack.MAX; }
+    public boolean haveEnoughQuantity(int quantity) { return this.getNbItems() >= quantity; }
     public void add() { if (this.getNbItems() < Stack.MAX) this.nbItems.set(this.getNbItems() + 1); }
     public void remove() { if (this.getNbItems() > 0) this.nbItems.set(this.getNbItems() - 1); }
-    public void removeQuantity(int quantity) { if (this.getNbItems() >= quantity) this.nbItems.set(this.getNbItems() - quantity);}
+
+    public boolean removeQuantity(int quantity)
+    {
+        if (this.getNbItems() >= quantity) {
+            this.nbItems.set(this.getNbItems() - quantity);
+            return true;
+        }
+        return false;
+    }
 
     @Override public String toString(){
         if (item instanceof Block)
diff --git a/src/main/java/fr/sae/terraria/modele/entities/tools/MaterialSet.java b/src/main/java/fr/sae/terraria/modele/entities/tools/MaterialSet.java
index 6def89c..93c4992 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/tools/MaterialSet.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/tools/MaterialSet.java
@@ -5,4 +5,7 @@ public enum MaterialSet
 {
     WOOD,
     IRON;
+
+
+    public static boolean isWood(MaterialSet material) { return material == MaterialSet.IRON; }
 }
diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java
index c9a249e..1676252 100644
--- a/src/main/java/module-info.java
+++ b/src/main/java/module-info.java
@@ -19,4 +19,6 @@
     exports fr.sae.terraria.modele.entities.player.inventory;
     opens fr.sae.terraria.modele.entities.player.inventory to javafx.fxml;
     opens fr.sae.terraria.modele to javafx.fxml, javafx.graphics;
+    exports fr.sae.terraria.modele.entities.player.craft;
+    opens fr.sae.terraria.modele.entities.player.craft to javafx.fxml;
 }
\ No newline at end of file
diff --git a/src/main/resources/fr/sae/terraria/vue/menu.fxml b/src/main/resources/fr/sae/terraria/vue/menu.fxml
index 2f4d6ec..4e59eb9 100644
--- a/src/main/resources/fr/sae/terraria/vue/menu.fxml
+++ b/src/main/resources/fr/sae/terraria/vue/menu.fxml
@@ -59,27 +59,27 @@
                               prefHeight="900.0"
                               prefWidth="640.0">
                             <HBox id="notAvailable"
-                                  fx:id="lexiconPickaxe1"
+                                  fx:id="recipeWoodPickaxe"
                                   prefHeight="50.0"
                                   prefWidth="625.0">
-                                <Text text="Pioche en fer" textAlignment="CENTER"/>
-                                <Text text="2 Bâtons | 3 Minerais de fer" textAlignment="CENTER"/>
+                                <Text text="Pioche en bois" textAlignment="CENTER"/>
+                                <Text text="2 Bâtons | 3 bois" textAlignment="CENTER"/>
                             </HBox>
-                            <Separator layoutY="75.0" prefHeight="5.0" prefWidth="625.0"/>
+                            <Separator layoutY="150.0" prefHeight="5.0" prefWidth="625.0"/>
                             <HBox id="notAvailable"
-                                  fx:id="lexiconPickaxe2"
+                                  fx:id="recipeStonePickaxe"
                                   prefHeight="50.0"
                                   prefWidth="625.0">
                                 <Text text="Pioche en pierre" textAlignment="CENTER"/>
                                 <Text text="2 Bâtons | 3 pierre" textAlignment="CENTER"/>
                             </HBox>
-                            <Separator layoutY="150.0" prefHeight="5.0" prefWidth="625.0"/>
+                            <Separator layoutY="75.0" prefHeight="5.0" prefWidth="625.0"/>
                             <HBox id="notAvailable"
-                                  fx:id="lexiconPickaxe3"
+                                  fx:id="recipeIronPickaxe"
                                   prefHeight="50.0"
                                   prefWidth="625.0">
-                                <Text text="Pioche en bois" textAlignment="CENTER"/>
-                                <Text text="2 Bâtons | 3 bois" textAlignment="CENTER"/>
+                                <Text text="Pioche en fer" textAlignment="CENTER"/>
+                                <Text text="2 Bâtons | 3 Minerais de fer" textAlignment="CENTER"/>
                             </HBox>
                             <Separator layoutY="225.0" prefHeight="5.0" prefWidth="625.0"/>
                             <HBox id="notAvailable"
@@ -92,8 +92,8 @@
                             </HBox>
                             <Separator layoutY="300.0" prefHeight="5.0" prefWidth="625.0"/>
                             <HBox id="notAvailable"
-                                  fx:id="lexiconAxe2"
-                                  layoutY="55.0"
+                                  fx:id="recipeStoneAxe"
+                                  layoutY="110.0"
                                   prefHeight="50.0"
                                   prefWidth="625.0">
                                 <Text text="Hache en pierre" textAlignment="CENTER"/>
@@ -102,7 +102,7 @@
                             <Separator layoutY="375.0" prefHeight="5.0" prefWidth="625.0"/>
                             <HBox id="notAvailable"
                                   fx:id="lexiconAxe3"
-                                  layoutY="55.0"
+                                  layoutY="165.0"
                                   prefHeight="50.0"
                                   prefWidth="625.0">
                                 <Text text="Hache en bois" textAlignment="CENTER"/>
@@ -137,7 +137,7 @@
                             </HBox>
                             <Separator layoutY="675.0" prefHeight="5.0" prefWidth="625.0"/>
                             <HBox id="notAvailable"
-                                  fx:id="lexiconStone"
+                                  fx:id="recipeRock"
                                   layoutY="163.0"
                                   prefHeight="50.0"
                                   prefWidth="625.0">

From e2e3b2f3f92b0de379b3b774ae1efa5af9a5acdc Mon Sep 17 00:00:00 2001
From: Tiago Lousa <tig2468.a@gmail.com>
Date: Wed, 15 Jun 2022 14:48:18 +0200
Subject: [PATCH 78/97] craft pickaxe

---
 .../modele/entities/player/craft/Craft.java   | 142 ++----------------
 .../player/craft/recipes/Ingredient.java      |  14 ++
 .../player/craft/recipes/PickaxeRecipe.java   |  21 ++-
 3 files changed, 39 insertions(+), 138 deletions(-)
 create mode 100644 src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/Ingredient.java

diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/craft/Craft.java b/src/main/java/fr/sae/terraria/modele/entities/player/craft/Craft.java
index 4df0243..49bebd8 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/craft/Craft.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/craft/Craft.java
@@ -5,141 +5,19 @@
 import fr.sae.terraria.modele.entities.blocks.BlockSet;
 import fr.sae.terraria.modele.entities.items.Item;
 
+import fr.sae.terraria.modele.entities.player.craft.recipes.Ingredient;
+import fr.sae.terraria.modele.entities.player.craft.recipes.PickaxeRecipe;
 import fr.sae.terraria.modele.entities.player.craft.recipes.RockRecipe;
 import fr.sae.terraria.modele.entities.player.inventory.Inventory;
 import fr.sae.terraria.modele.entities.player.inventory.Stack;
 import fr.sae.terraria.modele.entities.tools.*;
 
+import java.util.Objects;
+
 
 public class Craft
 {
 
-    public boolean possibleToCreateTool(int id) {
-        boolean firstGood = false;
-        boolean secundGood = false;
-        int quantityNeeded = 0;
-        for (int i = 0; i < Inventory.NB_BOXES_MAX; i++) {
-            if (id <= 9) {
-                if (id <= 6) {
-                    quantityNeeded = 2;
-                    //TODO a changé le bois en stick
-                    if (Item.isWood(this.inventory.get().get(i).getItem()) && this.inventory.get().get(i).getNbItems() >= quantityNeeded) {
-                        firstGood = true;
-                        quantityNeeded = 3;
-                    }
-
-                } else {
-                    quantityNeeded = 1;
-                    //TODO a changé le bois en stick
-                    if (Item.isWood(this.inventory.get().get(i).getItem()) && this.inventory.get().get(i).getNbItems() >= quantityNeeded) {
-                        firstGood = true;
-                        quantityNeeded = 2;
-                    }
-                }
-                if (id % 3 == 1) {
-                    if (Item.isWood(this.inventory.get().get(i).getItem()) && this.inventory.get().get(i).getNbItems() >= quantityNeeded) {
-                        secundGood = true;
-                    }
-                }
-                if (id % 3 == 2) {
-                    if (Item.isStone(this.inventory.get().get(i).getItem()) && this.inventory.get().get(i).getNbItems() >= quantityNeeded) {
-                        secundGood = true;
-                    }
-                }
-                if (id % 3 == 0) {
-                    if (Item.isIron(this.inventory.get().get(i).getItem()) && this.inventory.get().get(i).getNbItems() >= quantityNeeded) {
-                        secundGood = true;
-                    }
-                }
-            }
-            else if (id == 10) {
-                quantityNeeded = 3;
-                if (Item.isStone(this.inventory.get().get(i).getItem()) && this.inventory.get().get(i).getNbItems() >= quantityNeeded) {
-                    firstGood = true;
-                    secundGood = true;
-                }
-            } else if (id == 11) {
-                quantityNeeded = 3;
-                //TODO a changé le bois en stick
-                if (Item.isWood(this.inventory.get().get(i).getItem()) && this.inventory.get().get(i).getNbItems() >= quantityNeeded) {
-                    firstGood = true;
-                }
-                if (Item.isFiber(this.inventory.get().get(i).getItem()) && this.inventory.get().get(i).getNbItems() >= quantityNeeded)
-                    secundGood = true;
-            }
-            if (firstGood && secundGood)
-                return true;
-        }
-        return false;
-    }
-
-    public void createTool(int id) {
-        int quantityNeeded = 0;
-        if (id == 1)
-            inventory.getPlayer().pickup(new Tool(ToolSet.PICKAXE, MaterialSet.IRON));
-        else if (id == 3)
-            inventory.getPlayer().pickup(new Tool(ToolSet.PICKAXE, MaterialSet.WOOD));
-        else if (id == 4)
-            inventory.getPlayer().pickup(new Tool(ToolSet.AXE, MaterialSet.IRON));
-        else if (id == 6)
-            inventory.getPlayer().pickup(new Tool(ToolSet.AXE, MaterialSet.WOOD));
-        else if (id == 7)
-            inventory.getPlayer().pickup(new Tool(ToolSet.SWORD, MaterialSet.IRON));
-        else if(id == 9)
-            inventory.getPlayer().pickup(new Tool(ToolSet.SWORD, MaterialSet.WOOD));
-        if (id == 10)
-            inventory.getPlayer().pickup(new Block(BlockSet.ROCK, null));
-
-        for (int i = 0; i < this.inventory.nbStacksIntoInventory(); i++) {
-            if (id <= 9) {
-                if (id <= 6) {
-                    quantityNeeded = 2;
-                    //TODO a changé le bois en stick
-                    if (Item.isWood(this.inventory.get().get(i).getItem())) {
-                        this.inventory.get().get(i).removeQuantity(quantityNeeded);
-                        quantityNeeded = 3;
-                    }
-
-                } else {
-                    quantityNeeded = 1;
-                    if (Item.isWood(this.inventory.get().get(i).getItem()) && this.inventory.get().get(i).getNbItems() >= quantityNeeded) {
-                        this.inventory.get().get(i).removeQuantity(quantityNeeded);
-                        quantityNeeded = 2;
-                    }
-                }
-                if (id % 3 == 0) {
-                    if (Item.isWood(this.inventory.get().get(i).getItem())) {
-                        this.inventory.get().get(i).removeQuantity(quantityNeeded);
-                    }
-                }
-                if (id % 3 == 2) {
-                    if (Item.isStone(this.inventory.get().get(i).getItem())) {
-                        this.inventory.get().get(i).removeQuantity(quantityNeeded);
-                    }
-                }
-                if (id % 3 == 1) {
-                    if (Item.isIron(this.inventory.get().get(i).getItem())) {
-                        this.inventory.get().get(i).removeQuantity(quantityNeeded);
-                    }
-                }
-            } else if (id == 10) {
-                quantityNeeded = 3;
-                if (Item.isStone(this.inventory.get().get(i).getItem())) {
-                    this.inventory.get().get(i).removeQuantity(quantityNeeded);
-                }
-            } else if (id == 11) {
-                quantityNeeded = 3;
-                if (Item.isWood(this.inventory.get().get(i).getItem())) {
-                    this.inventory.get().get(i).removeQuantity(quantityNeeded);
-                    quantityNeeded = 3;
-                }
-                if (Item.isFiber(this.inventory.get().get(i).getItem()))
-                    this.inventory.get().get(i).removeQuantity(quantityNeeded);
-            }
-
-        }
-    }
-
 
     public static Block rock(final Environment environment)
     {
@@ -153,14 +31,14 @@ public static Block rock(final Environment environment)
         return null;
     }
 
-    public static Block pickaxe(final Environment environment, final MaterialSet material)
+    public static Tool pickaxe(final Environment environment, final MaterialSet material)
     {
         Inventory inventory = environment.getPlayer().getInventory();
-
-        for (int i = 0; i < inventory.get().size(); i++) {
-            Stack stack = inventory.get().get(i);
-
-
+        Ingredient pickaxeIngredients = PickaxeRecipe.WOOD_RECIPE.apply(inventory);
+        if (!Objects.isNull(pickaxeIngredients)){
+            ((Stack)pickaxeIngredients.get()[0].getItem()).removeQuantity(PickaxeRecipe.WOOD_RECIPE.NB_WOODS);
+            ((Stack)pickaxeIngredients.get()[1].getItem()).removeQuantity(PickaxeRecipe.WOOD_RECIPE.NB_STICKS);
+            return new Tool(ToolSet.PICKAXE, MaterialSet.IRON);
         }
         return null;
     }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/Ingredient.java b/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/Ingredient.java
new file mode 100644
index 0000000..e0bc76c
--- /dev/null
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/Ingredient.java
@@ -0,0 +1,14 @@
+package fr.sae.terraria.modele.entities.player.craft.recipes;
+
+import fr.sae.terraria.modele.entities.player.inventory.Stack;
+
+
+public class Ingredient
+{
+    private final Stack[] ingredients;
+
+
+    public Ingredient(int nbIngredient) { this.ingredients = new Stack[nbIngredient]; }
+
+    public Stack[] get() { return this.ingredients; }
+}
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/PickaxeRecipe.java b/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/PickaxeRecipe.java
index ba9128c..e93796d 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/PickaxeRecipe.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/PickaxeRecipe.java
@@ -3,7 +3,6 @@
 import fr.sae.terraria.modele.entities.items.Item;
 import fr.sae.terraria.modele.entities.player.inventory.Inventory;
 import fr.sae.terraria.modele.entities.player.inventory.Stack;
-import fr.sae.terraria.modele.entities.tools.MaterialSet;
 
 
 public class PickaxeRecipe
@@ -12,19 +11,29 @@ public static final class WOOD_RECIPE
     {
         public static final int NB_WOODS = 3;
         public static final int NB_STICKS = 2;
+        private static final int NB_INGREDIENTS = 2;
 
-        public static boolean apply(final Inventory inventory)
+
+        public static Ingredient apply(final Inventory inventory)
         {
+            int i = 0;
+            Ingredient ingredient =  new Ingredient(NB_INGREDIENTS);
             boolean haveEnoughForPickaxeHead = false;
             boolean haveEnoughForPickaxeHandler = false;
 
-            for (int i = 0; i < inventory.get().size(); i++) {
-                Stack stack = inventory.get().get(i);
-                if (Item.isWood(stack.getItem()) && stack.haveEnoughQuantity(NB_WOODS))
+           for(Stack stack : inventory.get()){
+                if (Item.isWood(stack.getItem()) && stack.haveEnoughQuantity(NB_WOODS) && !haveEnoughForPickaxeHead) {
                     haveEnoughForPickaxeHead = true;
-                if (Item.isStick(stack.getItem()) && stack.haveEnoughQuantity(NB_STICKS))
+                    ingredient.get()[0] = stack;
+                    i++;
+                }
+                if (Item.isStick(stack.getItem()) && stack.haveEnoughQuantity(NB_STICKS) && !haveEnoughForPickaxeHandler) {
                     haveEnoughForPickaxeHandler = true;
+                    ingredient.get()[1] = stack;
+                    i++;
+                }
             }
+            return (i == ingredient.get().length) ? ingredient : null;
         }
     }
 

From eceef3671fc61e0223005848fea3dc999d82b0c6 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Wed, 15 Jun 2022 19:32:43 +0200
Subject: [PATCH 79/97] Pickaxe iron, stone, wood recipe implemented, Rock
 recipe get an updated

---
 .../terraria/controller/MenuController.java   | 16 ++++
 .../modele/entities/player/craft/Craft.java   | 40 ++++++---
 .../player/craft/recipes/Ingredient.java      | 17 +++-
 .../player/craft/recipes/IngredientSet.java   | 50 +++++++++++
 .../player/craft/recipes/PickaxeRecipe.java   | 88 ++++++++++++++-----
 .../player/craft/recipes/RockRecipe.java      | 21 +++++
 .../modele/entities/tools/MaterialSet.java    |  3 +
 7 files changed, 199 insertions(+), 36 deletions(-)
 create mode 100644 src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/IngredientSet.java

diff --git a/src/main/java/fr/sae/terraria/controller/MenuController.java b/src/main/java/fr/sae/terraria/controller/MenuController.java
index 27901c2..691f40e 100644
--- a/src/main/java/fr/sae/terraria/controller/MenuController.java
+++ b/src/main/java/fr/sae/terraria/controller/MenuController.java
@@ -8,6 +8,7 @@
 import fr.sae.terraria.modele.entities.player.Player;
 import fr.sae.terraria.modele.entities.player.craft.Craft;
 import fr.sae.terraria.modele.entities.player.inventory.Stack;
+import fr.sae.terraria.modele.entities.tools.MaterialSet;
 import javafx.animation.Animation;
 import javafx.animation.KeyFrame;
 import javafx.animation.Timeline;
@@ -80,5 +81,20 @@ public MenuController(final Stage stage)
             if (ev.getEventType().getName().equalsIgnoreCase("MOUSE_PRESSED"))
                 player.pickup(Craft.rock(this.environment));
         });
+
+        this.recipeWoodPickaxe.addEventFilter(Event.ANY, ev -> {
+            if (ev.getEventType().getName().equalsIgnoreCase("MOUSE_PRESSED"))
+                player.pickup(Craft.pickaxe(this.environment, MaterialSet.WOOD));
+        });
+
+        this.recipeStonePickaxe.addEventFilter(Event.ANY, ev -> {
+            if (ev.getEventType().getName().equalsIgnoreCase("MOUSE_PRESSED"))
+                player.pickup(Craft.pickaxe(this.environment, MaterialSet.STONE));
+        });
+
+        this.recipeIronPickaxe.addEventFilter(Event.ANY, ev -> {
+            if (ev.getEventType().getName().equalsIgnoreCase("MOUSE_PRESSED"))
+                player.pickup(Craft.pickaxe(this.environment, MaterialSet.IRON));
+        });
     }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/craft/Craft.java b/src/main/java/fr/sae/terraria/modele/entities/player/craft/Craft.java
index 49bebd8..70ac7b9 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/craft/Craft.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/craft/Craft.java
@@ -23,23 +23,41 @@ public static Block rock(final Environment environment)
     {
         Inventory inventory = environment.getPlayer().getInventory();
 
-        for (int i = 0; i < inventory.get().size(); i++) {
-            Stack stack = inventory.get().get(i);
-            if (Item.isStone(stack.getItem()) && stack.removeQuantity(RockRecipe.NB_STONES))
-                return new Block(BlockSet.ROCK, environment);
+        Ingredient rockIngredients = RockRecipe.apply(inventory);
+        if (!Objects.isNull(rockIngredients)) {
+            Stack stack = rockIngredients.get()[0];
+            stack.removeQuantity(RockRecipe.NB_STONES);
         }
-        return null;
+
+        return (!Objects.isNull(rockIngredients)) ? new Block(BlockSet.ROCK, environment) : null;
     }
 
     public static Tool pickaxe(final Environment environment, final MaterialSet material)
     {
         Inventory inventory = environment.getPlayer().getInventory();
-        Ingredient pickaxeIngredients = PickaxeRecipe.WOOD_RECIPE.apply(inventory);
-        if (!Objects.isNull(pickaxeIngredients)){
-            ((Stack)pickaxeIngredients.get()[0].getItem()).removeQuantity(PickaxeRecipe.WOOD_RECIPE.NB_WOODS);
-            ((Stack)pickaxeIngredients.get()[1].getItem()).removeQuantity(PickaxeRecipe.WOOD_RECIPE.NB_STICKS);
-            return new Tool(ToolSet.PICKAXE, MaterialSet.IRON);
+
+        Ingredient pickaxeIngredients = null;
+        if (MaterialSet.isWood(material))
+            pickaxeIngredients = PickaxeRecipe.WOOD_RECIPE.apply(inventory);
+        else if (MaterialSet.isStone(material))
+            pickaxeIngredients = PickaxeRecipe.STONE_RECIPE.apply(inventory);
+        else if (MaterialSet.isIron(material))
+            pickaxeIngredients = PickaxeRecipe.IRON_RECIPE.apply(inventory);
+
+        if (!Objects.isNull(pickaxeIngredients)) for (int i = 0; i < pickaxeIngredients.get().length; i++) {
+            Stack stack = (Stack) pickaxeIngredients.get()[i].getItem();
+
+            if (Item.isStick(stack.getItem()))
+                stack.removeQuantity(PickaxeRecipe.NB_STICKS);
+
+            if (MaterialSet.isWood(material) && Item.isWood(stack.getItem()))
+                stack.removeQuantity(PickaxeRecipe.WOOD_RECIPE.NB_WOODS);
+            else if (MaterialSet.isStone(material) && Item.isStone(stack.getItem()))
+                stack.removeQuantity(PickaxeRecipe.STONE_RECIPE.NB_STONES);
+            else if (MaterialSet.isIron(material) && Item.isIron(stack.getItem()))
+                stack.removeQuantity(PickaxeRecipe.IRON_RECIPE.NB_IRONS);
         }
-        return null;
+
+        return (!Objects.isNull(pickaxeIngredients)) ? new Tool(ToolSet.PICKAXE, material) : null;
     }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/Ingredient.java b/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/Ingredient.java
index e0bc76c..6cbe7f3 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/Ingredient.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/Ingredient.java
@@ -2,13 +2,28 @@
 
 import fr.sae.terraria.modele.entities.player.inventory.Stack;
 
+import java.util.Objects;
+
 
 public class Ingredient
 {
     private final Stack[] ingredients;
 
 
-    public Ingredient(int nbIngredient) { this.ingredients = new Stack[nbIngredient]; }
+    public Ingredient(final int nbIngredient) { this.ingredients = new Stack[nbIngredient]; }
+
+    public int nbStacks()
+    {
+        Stack stack;
+        int i = 0;
+        do {
+            stack = ingredients[i];
+            i++;
+        } while (i < ingredients.length && !Objects.isNull(stack));
+
+        return i;
+    }
+
 
     public Stack[] get() { return this.ingredients; }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/IngredientSet.java b/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/IngredientSet.java
new file mode 100644
index 0000000..f2852ab
--- /dev/null
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/IngredientSet.java
@@ -0,0 +1,50 @@
+package fr.sae.terraria.modele.entities.player.craft.recipes;
+
+import fr.sae.terraria.modele.entities.items.Item;
+import fr.sae.terraria.modele.entities.player.inventory.Stack;
+
+
+public class IngredientSet
+{
+
+
+
+    public static boolean sticks(final Ingredient ingredient, final Stack stack, final int nbSticks)
+    {
+        if (Item.isStick(stack.getItem()) && stack.haveEnoughQuantity(nbSticks)) {
+            ingredient.get()[ingredient.nbStacks()] = stack;
+            return true;
+        }
+        return false;
+    }
+
+    public static boolean woods(final Ingredient ingredient, final Stack stack, final int nbWood)
+    {
+        if (Item.isWood(stack.getItem()) && stack.haveEnoughQuantity(nbWood)) {
+            ingredient.get()[ingredient.nbStacks()] = stack;
+            return true;
+        }
+        return false;
+    }
+
+    public static boolean stones(final Ingredient ingredient, final Stack stack, final int nbStones)
+    {
+        if (Item.isStone(stack.getItem()) && stack.haveEnoughQuantity(nbStones)) {
+            if (ingredient.get().length == 1)
+                ingredient.get()[0] = stack;
+            else ingredient.get()[ingredient.nbStacks()] = stack;
+
+            return true;
+        }
+        return false;
+    }
+
+    public static boolean irons(final Ingredient ingredient, final Stack stack, final int nbStones)
+    {
+        if (Item.isIron(stack.getItem()) && stack.haveEnoughQuantity(nbStones)) {
+            ingredient.get()[ingredient.nbStacks()] = stack;
+            return true;
+        }
+        return false;
+    }
+}
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/PickaxeRecipe.java b/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/PickaxeRecipe.java
index e93796d..4c78808 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/PickaxeRecipe.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/PickaxeRecipe.java
@@ -1,54 +1,94 @@
 package fr.sae.terraria.modele.entities.player.craft.recipes;
 
-import fr.sae.terraria.modele.entities.items.Item;
 import fr.sae.terraria.modele.entities.player.inventory.Inventory;
 import fr.sae.terraria.modele.entities.player.inventory.Stack;
 
 
 public class PickaxeRecipe
 {
+    private static final int NB_INGREDIENTS = 2;
+
+    public static final int NB_STICKS = 2;
+
+
     public static final class WOOD_RECIPE
     {
         public static final int NB_WOODS = 3;
-        public static final int NB_STICKS = 2;
-        private static final int NB_INGREDIENTS = 2;
 
 
         public static Ingredient apply(final Inventory inventory)
         {
-            int i = 0;
-            Ingredient ingredient =  new Ingredient(NB_INGREDIENTS);
-            boolean haveEnoughForPickaxeHead = false;
+            Ingredient ingredient = new Ingredient(PickaxeRecipe.NB_INGREDIENTS);
             boolean haveEnoughForPickaxeHandler = false;
+            boolean haveEnoughForPickaxeHead = false;
+
+            int i = 0;
+            do {
+                Stack stack = inventory.get().get(i);
+
+                if (!haveEnoughForPickaxeHead)
+                    haveEnoughForPickaxeHead = IngredientSet.woods(ingredient, stack, NB_WOODS);
+                if (!haveEnoughForPickaxeHandler)
+                    haveEnoughForPickaxeHandler = IngredientSet.sticks(ingredient, stack, NB_STICKS);
+
+                i++;
+            } while (i < inventory.get().size() && (!haveEnoughForPickaxeHead || !haveEnoughForPickaxeHandler));
 
-           for(Stack stack : inventory.get()){
-                if (Item.isWood(stack.getItem()) && stack.haveEnoughQuantity(NB_WOODS) && !haveEnoughForPickaxeHead) {
-                    haveEnoughForPickaxeHead = true;
-                    ingredient.get()[0] = stack;
-                    i++;
-                }
-                if (Item.isStick(stack.getItem()) && stack.haveEnoughQuantity(NB_STICKS) && !haveEnoughForPickaxeHandler) {
-                    haveEnoughForPickaxeHandler = true;
-                    ingredient.get()[1] = stack;
-                    i++;
-                }
-            }
             return (i == ingredient.get().length) ? ingredient : null;
         }
     }
 
-    public static final class STONE
+    public static final class STONE_RECIPE
     {
-        public static final int NB_STONE = 3;
-        public static final int NB_STICK = 2;
+        public static final int NB_STONES = 3;
+
+
+        public static Ingredient apply(final Inventory inventory)
+        {
+            Ingredient ingredient = new Ingredient(PickaxeRecipe.NB_INGREDIENTS);
+            boolean haveEnoughForPickaxeHandler = false;
+            boolean haveEnoughForPickaxeHead = false;
+
+            int i = 0;
+            do {
+                Stack stack = inventory.get().get(i);
+
+                if (!haveEnoughForPickaxeHead)
+                    haveEnoughForPickaxeHead = IngredientSet.stones(ingredient, stack, NB_STONES);
+                if (!haveEnoughForPickaxeHandler)
+                    haveEnoughForPickaxeHandler = IngredientSet.sticks(ingredient, stack, NB_STICKS);
+
+                i++;
+            } while (i < inventory.get().size() && (!haveEnoughForPickaxeHead || !haveEnoughForPickaxeHandler));
+
+            return (i == ingredient.get().length) ? ingredient : null;
+        }
     }
 
-    public static final class IRON
+    public static final class IRON_RECIPE
     {
         public static final int NB_IRONS = 3;
-        public static final int NB_STICKS = 2;
-    }
 
 
+        public static Ingredient apply(final Inventory inventory)
+        {
+            Ingredient ingredient = new Ingredient(PickaxeRecipe.NB_INGREDIENTS);
+            boolean haveEnoughForPickaxeHandler = false;
+            boolean haveEnoughForPickaxeHead = false;
+
+            int i = 0;
+            do {
+                Stack stack = inventory.get().get(i);
+
+                if (!haveEnoughForPickaxeHead)
+                    haveEnoughForPickaxeHead = IngredientSet.irons(ingredient, stack, NB_IRONS);
+                if (!haveEnoughForPickaxeHandler)
+                    haveEnoughForPickaxeHandler = IngredientSet.sticks(ingredient, stack, NB_STICKS);
 
+                i++;
+            } while (i < inventory.get().size() && (!haveEnoughForPickaxeHead || !haveEnoughForPickaxeHandler));
+
+            return (i == ingredient.get().length) ? ingredient : null;
+        }
+    }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/RockRecipe.java b/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/RockRecipe.java
index d880339..0bc2ba9 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/RockRecipe.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/RockRecipe.java
@@ -1,7 +1,28 @@
 package fr.sae.terraria.modele.entities.player.craft.recipes;
 
+import fr.sae.terraria.modele.entities.player.inventory.Inventory;
+import fr.sae.terraria.modele.entities.player.inventory.Stack;
+
 
 public class RockRecipe
 {
+    private static final int NB_INGREDIENTS = 1;
     public static final int NB_STONES = 4;
+
+
+    public static Ingredient apply(final Inventory inventory)
+    {
+        Ingredient ingredient = new Ingredient(RockRecipe.NB_INGREDIENTS);
+        boolean haveEnoughStone ;
+
+        int i = 0;
+        do {
+            Stack stack = inventory.get().get(i);
+            haveEnoughStone = IngredientSet.stones(ingredient, stack, NB_STONES);
+
+            i++;
+        } while (i < inventory.get().size() && !haveEnoughStone);
+
+        return haveEnoughStone ? ingredient : null;
+    }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/tools/MaterialSet.java b/src/main/java/fr/sae/terraria/modele/entities/tools/MaterialSet.java
index 93c4992..8a155f3 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/tools/MaterialSet.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/tools/MaterialSet.java
@@ -4,8 +4,11 @@
 public enum MaterialSet
 {
     WOOD,
+    STONE,
     IRON;
 
 
     public static boolean isWood(MaterialSet material) { return material == MaterialSet.IRON; }
+    public static boolean isStone(MaterialSet material) { return material == MaterialSet.STONE; }
+    public static boolean isIron(MaterialSet material) { return material == MaterialSet.IRON; }
 }

From 4ce19ff555c6d5dee72482f1b6c7d2c506c58840 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Wed, 15 Jun 2022 19:52:14 +0200
Subject: [PATCH 80/97] Correction erreurs code dans les crafts

---
 .../modele/entities/player/craft/Craft.java         | 12 ++++++------
 .../player/craft/recipes/PickaxeRecipe.java         | 13 ++++++-------
 2 files changed, 12 insertions(+), 13 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/craft/Craft.java b/src/main/java/fr/sae/terraria/modele/entities/player/craft/Craft.java
index 70ac7b9..20995e3 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/craft/Craft.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/craft/Craft.java
@@ -38,11 +38,11 @@ public static Tool pickaxe(final Environment environment, final MaterialSet mate
 
         Ingredient pickaxeIngredients = null;
         if (MaterialSet.isWood(material))
-            pickaxeIngredients = PickaxeRecipe.WOOD_RECIPE.apply(inventory);
+            pickaxeIngredients = PickaxeRecipe.WoodRecipe.apply(inventory);
         else if (MaterialSet.isStone(material))
-            pickaxeIngredients = PickaxeRecipe.STONE_RECIPE.apply(inventory);
+            pickaxeIngredients = PickaxeRecipe.StoneRecipe.apply(inventory);
         else if (MaterialSet.isIron(material))
-            pickaxeIngredients = PickaxeRecipe.IRON_RECIPE.apply(inventory);
+            pickaxeIngredients = PickaxeRecipe.IronRecipe.apply(inventory);
 
         if (!Objects.isNull(pickaxeIngredients)) for (int i = 0; i < pickaxeIngredients.get().length; i++) {
             Stack stack = (Stack) pickaxeIngredients.get()[i].getItem();
@@ -51,11 +51,11 @@ else if (MaterialSet.isIron(material))
                 stack.removeQuantity(PickaxeRecipe.NB_STICKS);
 
             if (MaterialSet.isWood(material) && Item.isWood(stack.getItem()))
-                stack.removeQuantity(PickaxeRecipe.WOOD_RECIPE.NB_WOODS);
+                stack.removeQuantity(PickaxeRecipe.WoodRecipe.NB_WOODS);
             else if (MaterialSet.isStone(material) && Item.isStone(stack.getItem()))
-                stack.removeQuantity(PickaxeRecipe.STONE_RECIPE.NB_STONES);
+                stack.removeQuantity(PickaxeRecipe.StoneRecipe.NB_STONES);
             else if (MaterialSet.isIron(material) && Item.isIron(stack.getItem()))
-                stack.removeQuantity(PickaxeRecipe.IRON_RECIPE.NB_IRONS);
+                stack.removeQuantity(PickaxeRecipe.IronRecipe.NB_IRONS);
         }
 
         return (!Objects.isNull(pickaxeIngredients)) ? new Tool(ToolSet.PICKAXE, material) : null;
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/PickaxeRecipe.java b/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/PickaxeRecipe.java
index 4c78808..06eb144 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/PickaxeRecipe.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/PickaxeRecipe.java
@@ -7,11 +7,10 @@
 public class PickaxeRecipe
 {
     private static final int NB_INGREDIENTS = 2;
-
     public static final int NB_STICKS = 2;
 
 
-    public static final class WOOD_RECIPE
+    public static final class WoodRecipe
     {
         public static final int NB_WOODS = 3;
 
@@ -34,11 +33,11 @@ public static Ingredient apply(final Inventory inventory)
                 i++;
             } while (i < inventory.get().size() && (!haveEnoughForPickaxeHead || !haveEnoughForPickaxeHandler));
 
-            return (i == ingredient.get().length) ? ingredient : null;
+            return (haveEnoughForPickaxeHead && haveEnoughForPickaxeHandler) ? ingredient : null;
         }
     }
 
-    public static final class STONE_RECIPE
+    public static final class StoneRecipe
     {
         public static final int NB_STONES = 3;
 
@@ -61,11 +60,11 @@ public static Ingredient apply(final Inventory inventory)
                 i++;
             } while (i < inventory.get().size() && (!haveEnoughForPickaxeHead || !haveEnoughForPickaxeHandler));
 
-            return (i == ingredient.get().length) ? ingredient : null;
+            return (haveEnoughForPickaxeHead && haveEnoughForPickaxeHandler) ? ingredient : null;
         }
     }
 
-    public static final class IRON_RECIPE
+    public static final class IronRecipe
     {
         public static final int NB_IRONS = 3;
 
@@ -88,7 +87,7 @@ public static Ingredient apply(final Inventory inventory)
                 i++;
             } while (i < inventory.get().size() && (!haveEnoughForPickaxeHead || !haveEnoughForPickaxeHandler));
 
-            return (i == ingredient.get().length) ? ingredient : null;
+            return (haveEnoughForPickaxeHead && haveEnoughForPickaxeHandler) ? ingredient : null;
         }
     }
 }

From 84ae506d19b57c05804e6a215cfb1e3c9e1a40e6 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Wed, 15 Jun 2022 20:04:40 +0200
Subject: [PATCH 81/97] Opptimisation IngredientSet

---
 .../player/craft/recipes/IngredientSet.java   | 39 ++++++++-----------
 .../player/craft/recipes/RockRecipe.java      |  2 +-
 2 files changed, 17 insertions(+), 24 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/IngredientSet.java b/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/IngredientSet.java
index f2852ab..14d565a 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/IngredientSet.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/IngredientSet.java
@@ -8,43 +8,36 @@ public class IngredientSet
 {
 
 
+    private static boolean putStackIntoIngredientsList(final Ingredient ingredient, final Stack stack)
+    {
+        if (ingredient.get().length == 1)
+            ingredient.get()[0] = stack;
+        else ingredient.get()[ingredient.nbStacks()] = stack;
+
+        return true;
+    }
 
     public static boolean sticks(final Ingredient ingredient, final Stack stack, final int nbSticks)
     {
-        if (Item.isStick(stack.getItem()) && stack.haveEnoughQuantity(nbSticks)) {
-            ingredient.get()[ingredient.nbStacks()] = stack;
-            return true;
-        }
-        return false;
+        boolean haveEnoughSticks = Item.isStick(stack.getItem()) && stack.haveEnoughQuantity(nbSticks);
+        return haveEnoughSticks && IngredientSet.putStackIntoIngredientsList(ingredient, stack);
     }
 
     public static boolean woods(final Ingredient ingredient, final Stack stack, final int nbWood)
     {
-        if (Item.isWood(stack.getItem()) && stack.haveEnoughQuantity(nbWood)) {
-            ingredient.get()[ingredient.nbStacks()] = stack;
-            return true;
-        }
-        return false;
+        boolean haveEnoughWoods = Item.isWood(stack.getItem()) && stack.haveEnoughQuantity(nbWood);
+        return haveEnoughWoods && IngredientSet.putStackIntoIngredientsList(ingredient, stack);
     }
 
     public static boolean stones(final Ingredient ingredient, final Stack stack, final int nbStones)
     {
-        if (Item.isStone(stack.getItem()) && stack.haveEnoughQuantity(nbStones)) {
-            if (ingredient.get().length == 1)
-                ingredient.get()[0] = stack;
-            else ingredient.get()[ingredient.nbStacks()] = stack;
-
-            return true;
-        }
-        return false;
+        boolean haveEnoughStones = Item.isStone(stack.getItem()) && stack.haveEnoughQuantity(nbStones);
+        return haveEnoughStones && IngredientSet.putStackIntoIngredientsList(ingredient, stack);
     }
 
     public static boolean irons(final Ingredient ingredient, final Stack stack, final int nbStones)
     {
-        if (Item.isIron(stack.getItem()) && stack.haveEnoughQuantity(nbStones)) {
-            ingredient.get()[ingredient.nbStacks()] = stack;
-            return true;
-        }
-        return false;
+        boolean haveEnoughIrons = Item.isIron(stack.getItem()) && stack.haveEnoughQuantity(nbStones);
+        return haveEnoughIrons && IngredientSet.putStackIntoIngredientsList(ingredient, stack);
     }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/RockRecipe.java b/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/RockRecipe.java
index 0bc2ba9..27178a3 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/RockRecipe.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/RockRecipe.java
@@ -18,7 +18,7 @@ public static Ingredient apply(final Inventory inventory)
         int i = 0;
         do {
             Stack stack = inventory.get().get(i);
-            haveEnoughStone = IngredientSet.stones(ingredient, stack, NB_STONES);
+            haveEnoughStone = IngredientSet.stones(ingredient, stack, RockRecipe.NB_STONES);
 
             i++;
         } while (i < inventory.get().size() && !haveEnoughStone);

From 04615a29ab7ac2c893845a4e15b59641c5e09597 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Wed, 15 Jun 2022 20:41:46 +0200
Subject: [PATCH 82/97] Tree can drop stick, change hit sound for tree, add
 stick

---
 .../terraria/modele/entities/blocks/Block.java |  17 +++++++++++++----
 .../terraria/modele/entities/blocks/Tree.java  |  12 +-----------
 .../terraria/modele/entities/items/Item.java   |   4 ++--
 .../entities/player/inventory/Stack.java       |   2 ++
 .../fr/sae/terraria/vue/hud/InventoryView.java |   5 ++++-
 .../resources/fr/sae/terraria/loots/stick.png  | Bin 0 -> 6110 bytes
 6 files changed, 22 insertions(+), 18 deletions(-)
 create mode 100644 src/main/resources/fr/sae/terraria/loots/stick.png

diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
index 2cdedf1..1f74001 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
@@ -86,19 +86,28 @@ private void loots()
         } else if (Block.isTorch(this)) {
             player.pickup(new Block(BlockSet.TORCH, this.environment));
         } else if (Block.isTree(this)) {
-            player.pickup(new Block(BlockSet.TREE, this.environment));
+            player.pickup(Item.WOOD);
+            for (int i = 0; i < Tree.STICKS_DROP; i++)
+                player.pickup(Item.STICK);
         }
     }
 
-    @Override public void updates() { }
-
-    @Override public void breaks()
+    private void playSound()
     {
         if (Block.isRock(this))
             Environment.playSound("sound/brick" + ((int) (Math.random()*2)+1) + ".wav", false);
         else if (Block.isTallGrass(this))
             Environment.playSound("sound/cut.wav", false);
+        else if (Block.isTree(this))
+            Environment.playSound("sound/treeHit.wav", false);
         else Environment.playSound("sound/grassyStep.wav", false);
+    }
+
+    @Override public void updates() { }
+
+    @Override public void breaks()
+    {
+        this.playSound();
         this.breakAnimation();
 
         if (this.getPv() <= 0) {
diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/Tree.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/Tree.java
index 5271002..f48365b 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/Tree.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/Tree.java
@@ -2,13 +2,13 @@
 
 import fr.sae.terraria.modele.Environment;
 import fr.sae.terraria.modele.entities.entity.SpawnableObjectType;
-import fr.sae.terraria.modele.entities.items.Item;
 
 
 public class Tree extends Block implements SpawnableObjectType
 {
     public static final double TREE_SPAWN_RATE = .2;
     public static final double TREE_CLUSTER = 10;
+    public static final int STICKS_DROP = 3;
 
     private final Environment environment;
 
@@ -21,16 +21,6 @@ public Tree(final Environment environment, int x, int y)
 
     public Tree(final Environment environment) { this(environment, 0, 0); }
 
-    @Override public void updates() { /* TODO document why this method is empty */ }
-
-    @Override public void breaks()
-    {
-        // Environment.playSound("sound/grassyStep.wav", false);
-        this.environment.getPlayer().pickup(Item.WOOD);
-        this.environment.getEntities().remove(this);
-        this.environment.getTrees().remove(this);
-    }
-
     @Override public void spawn(int x, int y)
     {
         this.setX(x);
diff --git a/src/main/java/fr/sae/terraria/modele/entities/items/Item.java b/src/main/java/fr/sae/terraria/modele/entities/items/Item.java
index f4d9e69..3ef05a0 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/items/Item.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/items/Item.java
@@ -11,7 +11,7 @@ public enum Item implements StowableObjectType
     SILEX,
     STONE,
     WOOD,
-    STICKS;
+    STICK;
 
 
     public static boolean isCoal(StowableObjectType obj) { return obj == Item.COAL; }
@@ -20,5 +20,5 @@ public enum Item implements StowableObjectType
     public static boolean isStone(StowableObjectType obj) { return obj == Item.STONE; }
     public static boolean isSilex(StowableObjectType obj) { return obj == Item.SILEX; }
     public static boolean isWood(StowableObjectType obj) { return obj == Item.WOOD; }
-    public static boolean isStick(StowableObjectType obj) { return obj == Item.STICKS; }
+    public static boolean isStick(StowableObjectType obj) { return obj == Item.STICK; }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
index 5819999..00b5916 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
@@ -81,6 +81,8 @@ public boolean isSameItem(StowableObjectType obj)
                 return true;
             if (Item.isWood(obj) && Item.isWood(this.item))
                 return true;
+            if (Item.isStick(obj) && Item.isStick(this.item))
+                return true;
         }
 
         return false;
diff --git a/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java b/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java
index 8fbd19f..8145875 100644
--- a/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java
+++ b/src/main/java/fr/sae/terraria/vue/hud/InventoryView.java
@@ -73,7 +73,8 @@ public InventoryView(Inventory inventory, Pane display, double scaleMultiplicato
     /**
      * Applique une bordure de couleur noire autour de la barre d'inventaire
      */
-    private Rectangle setFrameInventoryBar() {
+    private Rectangle setFrameInventoryBar()
+    {
         frameInventoryBar.setWidth(inventoryBarImg.getWidth() + (2 * scaleMultiplicatorWidth));
         frameInventoryBar.setHeight(inventoryBarImg.getHeight() + (2 * scaleMultiplicatorHeight));
         frameInventoryBar.setX(inventoryBarImgView.getX() - scaleMultiplicatorWidth);
@@ -140,6 +141,8 @@ else if (Item.isSilex(item))
                             view.setImage(View.loadAnImage("loots/silex.png", itemInventoryWidth, itemInventoryHeight));
                         else if (Item.isWood(item))
                             view.setImage(View.loadAnImage("loots/wood.png", itemInventoryWidth, itemInventoryHeight));
+                        else if (Item.isStick(item))
+                            view.setImage(View.loadAnImage("loots/stick.png", itemInventoryWidth, itemInventoryHeight));
                     }
 
                     // Actualise le nombre d'item à l'écran
diff --git a/src/main/resources/fr/sae/terraria/loots/stick.png b/src/main/resources/fr/sae/terraria/loots/stick.png
new file mode 100644
index 0000000000000000000000000000000000000000..926af2b5f43c5e5541aaef4035a4f92fd719e7e0
GIT binary patch
literal 6110
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
H+#~)2eA=mZ

literal 0
HcmV?d00001


From c25a2232107fc99ff1abf67131d55b09ec764a6a Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Wed, 15 Jun 2022 20:46:41 +0200
Subject: [PATCH 83/97]  change hit sound for tree

---
 .../resources/fr/sae/terraria/sound/treeHit.wav | Bin 0 -> 99618 bytes
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 src/main/resources/fr/sae/terraria/sound/treeHit.wav

diff --git a/src/main/resources/fr/sae/terraria/sound/treeHit.wav b/src/main/resources/fr/sae/terraria/sound/treeHit.wav
new file mode 100644
index 0000000000000000000000000000000000000000..1836611bafed6064be3ea9390016eb363a6d2962
GIT binary patch
literal 99618
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

literal 0
HcmV?d00001


From 7cc5489422813e05275bd9d113a9a01ef4bdc970 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Wed, 15 Jun 2022 21:06:38 +0200
Subject: [PATCH 84/97] fix display lexique

---
 .../terraria/controller/MenuController.java   |   5 -
 .../fr/sae/terraria/emojies/confus.png        | Bin 0 -> 193 bytes
 .../resources/fr/sae/terraria/vue/menu.fxml   | 141 ++++++------------
 3 files changed, 45 insertions(+), 101 deletions(-)
 create mode 100644 src/main/resources/fr/sae/terraria/emojies/confus.png

diff --git a/src/main/java/fr/sae/terraria/controller/MenuController.java b/src/main/java/fr/sae/terraria/controller/MenuController.java
index 691f40e..7278dfa 100644
--- a/src/main/java/fr/sae/terraria/controller/MenuController.java
+++ b/src/main/java/fr/sae/terraria/controller/MenuController.java
@@ -2,12 +2,8 @@
 
 import fr.sae.terraria.Terraria;
 import fr.sae.terraria.modele.Environment;
-import fr.sae.terraria.modele.entities.blocks.Block;
-import fr.sae.terraria.modele.entities.blocks.BlockSet;
-import fr.sae.terraria.modele.entities.items.Item;
 import fr.sae.terraria.modele.entities.player.Player;
 import fr.sae.terraria.modele.entities.player.craft.Craft;
-import fr.sae.terraria.modele.entities.player.inventory.Stack;
 import fr.sae.terraria.modele.entities.tools.MaterialSet;
 import javafx.animation.Animation;
 import javafx.animation.KeyFrame;
@@ -23,7 +19,6 @@
 import java.net.URL;
 import java.util.Objects;
 import java.util.ResourceBundle;
-import java.util.concurrent.locks.ReentrantLock;
 
 
 public class MenuController implements Initializable
diff --git a/src/main/resources/fr/sae/terraria/emojies/confus.png b/src/main/resources/fr/sae/terraria/emojies/confus.png
new file mode 100644
index 0000000000000000000000000000000000000000..9eb95a33bdc74b421ccec3b5f753d02d0736845d
GIT binary patch
literal 193
zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VjKx9jP7LeL$-D$|SkfJR9T^xl
z_H+M9WCf`#@Q5sCVBk9f!i-b3`J{n@VV*9IAsWHSfB0E=92C@#ur3NXu(<sG0h0(p
zkAsU_%Mut<6vXQ})=c1xWb_b_Y&hch$tS>$%OSjH5y$MQ3Jl>amw1gCV-2~d9DAiV
iLn3gWveFz035L#oW3!*z*#m$!FnGH9xvX<aXaWF3YBZGq

literal 0
HcmV?d00001

diff --git a/src/main/resources/fr/sae/terraria/vue/menu.fxml b/src/main/resources/fr/sae/terraria/vue/menu.fxml
index 4e59eb9..38fd511 100644
--- a/src/main/resources/fr/sae/terraria/vue/menu.fxml
+++ b/src/main/resources/fr/sae/terraria/vue/menu.fxml
@@ -1,150 +1,108 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
-
-<?import javafx.scene.control.*?>
-<?import javafx.scene.layout.*?>
-<?import javafx.scene.text.*?>
 <?import java.net.URL?>
-<BorderPane fx:id="root"
-            maxHeight="-Infinity" maxWidth="-Infinity"
+<?import javafx.scene.control.ScrollPane?>
+<?import javafx.scene.control.Separator?>
+<?import javafx.scene.control.SplitPane?>
+<?import javafx.scene.layout.BorderPane?>
+<?import javafx.scene.layout.HBox?>
+<?import javafx.scene.layout.Pane?>
+<?import javafx.scene.text.Font?>
+<?import javafx.scene.text.Text?>
+
+<BorderPane fx:id="root" maxHeight="-Infinity" maxWidth="-Infinity"
             minHeight="-Infinity" minWidth="-Infinity"
             prefHeight="720" prefWidth="1280"
             xmlns="http://javafx.com/javafx/11"
             xmlns:fx="http://javafx.com/fxml/1">
     <stylesheets>
-        <URL value="@./menu.css" />
+        <URL value="@./menu.css"/>
     </stylesheets>
 
 
     <top>
-        <HBox id="textArea"
-              fx:id="HBoxText"
-              prefHeight="25.0" prefWidth="1280"
-              BorderPane.alignment="CENTER">
-            <Text id="text"
-                  text="Groupe: BOUCHE Antoine, CHRZASZCZ Naulan, NARCISO Tiago"/>
+        <HBox id="textArea" fx:id="HBoxText" prefHeight="25.0" prefWidth="1280" BorderPane.alignment="CENTER">
+            <Text id="text" text="Groupe: BOUCHE Antoine, CHRZASZCZ Naulan, NARCISO Tiago"/>
         </HBox>
     </top>
 
     <center>
-        <SplitPane dividerPositions="0.5"
-                   prefHeight="160.0"
-                   prefWidth="200.0"
-                   BorderPane.alignment="CENTER">
-            <BorderPane prefHeight="200.0"
-                        prefWidth="640.0">
+        <SplitPane dividerPositions="0.5" prefHeight="160.0" prefWidth="200.0" BorderPane.alignment="CENTER">
+            <BorderPane prefHeight="200.0" prefWidth="640.0">
                 <top>
-                    <HBox fx:id="HBoxTitle"
-                          prefHeight="25.0"
-                          prefWidth="640.0"
-                          BorderPane.alignment="CENTER">
-                        <Text fx:id="TextHBoxTitle"
-                              strokeType="OUTSIDE"
-                              strokeWidth="0.0"
-                              text="Lexique"
-                              textAlignment="CENTER"
+                    <HBox fx:id="HBoxTitle" prefHeight="25.0" prefWidth="640.0" BorderPane.alignment="CENTER">
+                        <Text fx:id="TextHBoxTitle" stroke="WHITE" strokeType="OUTSIDE" strokeWidth="0.0"
+                              text="Lexique des constructions" textAlignment="CENTER" underline="true"
                               wrappingWidth="632.470703125">
                             <font>
-                                <Font size="16.0"/>
+                                <Font size="20.0"/>
                             </font>
                         </Text>
                     </HBox>
                 </top>
 
                 <center>
-                    <ScrollPane prefHeight="200.0"
-                                prefWidth="640.0"
-                                BorderPane.alignment="CENTER">
-                        <Pane fx:id="displayLexique"
-                              prefHeight="900.0"
-                              prefWidth="640.0">
-                            <HBox id="notAvailable"
-                                  fx:id="recipeWoodPickaxe"
-                                  prefHeight="50.0"
+                    <ScrollPane prefHeight="200.0" prefWidth="640.0" BorderPane.alignment="CENTER">
+                        <Pane fx:id="displayLexique" prefHeight="900.0" prefWidth="640.0">
+                            <HBox id="notAvailable" fx:id="recipeWoodPickaxe" layoutY="240.0" prefHeight="50.0"
                                   prefWidth="625.0">
                                 <Text text="Pioche en bois" textAlignment="CENTER"/>
                                 <Text text="2 Bâtons | 3 bois" textAlignment="CENTER"/>
                             </HBox>
                             <Separator layoutY="150.0" prefHeight="5.0" prefWidth="625.0"/>
-                            <HBox id="notAvailable"
-                                  fx:id="recipeStonePickaxe"
-                                  prefHeight="50.0"
+                            <HBox id="notAvailable" fx:id="recipeStonePickaxe" layoutY="314.0" prefHeight="50.0"
                                   prefWidth="625.0">
                                 <Text text="Pioche en pierre" textAlignment="CENTER"/>
                                 <Text text="2 Bâtons | 3 pierre" textAlignment="CENTER"/>
                             </HBox>
                             <Separator layoutY="75.0" prefHeight="5.0" prefWidth="625.0"/>
-                            <HBox id="notAvailable"
-                                  fx:id="recipeIronPickaxe"
-                                  prefHeight="50.0"
+                            <HBox id="notAvailable" fx:id="recipeIronPickaxe" layoutY="387.0" prefHeight="50.0"
                                   prefWidth="625.0">
                                 <Text text="Pioche en fer" textAlignment="CENTER"/>
                                 <Text text="2 Bâtons | 3 Minerais de fer" textAlignment="CENTER"/>
                             </HBox>
                             <Separator layoutY="225.0" prefHeight="5.0" prefWidth="625.0"/>
-                            <HBox id="notAvailable"
-                                  fx:id="lexiconAxe1"
-                                  layoutY="55.0"
-                                  prefHeight="50.0"
+                            <HBox id="notAvailable" fx:id="recipeWoodAxe" layoutY="14.0" prefHeight="50.0"
                                   prefWidth="625.0">
-                                <Text text="Hache en fer" textAlignment="CENTER"/>
-                                <Text text="2 Bâtons | 3 Minerais de fer" textAlignment="CENTER"/>
+                                <Text text="Hache en bois" textAlignment="CENTER"/>
+                                <Text text="2 Bâtons | 3 bois" textAlignment="CENTER"/>
                             </HBox>
                             <Separator layoutY="300.0" prefHeight="5.0" prefWidth="625.0"/>
-                            <HBox id="notAvailable"
-                                  fx:id="recipeStoneAxe"
-                                  layoutY="110.0"
-                                  prefHeight="50.0"
+                            <HBox id="notAvailable" fx:id="recipeStoneAxe" layoutY="90.0" prefHeight="50.0"
                                   prefWidth="625.0">
                                 <Text text="Hache en pierre" textAlignment="CENTER"/>
                                 <Text text="2 Bâtons | 3 pierre" textAlignment="CENTER"/>
                             </HBox>
                             <Separator layoutY="375.0" prefHeight="5.0" prefWidth="625.0"/>
-                            <HBox id="notAvailable"
-                                  fx:id="lexiconAxe3"
-                                  layoutY="165.0"
-                                  prefHeight="50.0"
+                            <HBox id="notAvailable" fx:id="recipeIronAxe" layoutY="167.0" prefHeight="50.0"
                                   prefWidth="625.0">
-                                <Text text="Hache en bois" textAlignment="CENTER"/>
-                                <Text text="2 Bâtons | 3 bois" textAlignment="CENTER"/>
+                                <Text text="Hache en fer" textAlignment="CENTER"/>
+                                <Text text="2 Bâtons | 3 Minerais de fer" textAlignment="CENTER"/>
                             </HBox>
                             <Separator layoutY="450.0" prefHeight="5.0" prefWidth="625.0"/>
-                            <HBox id="notAvailable"
-                                  fx:id="lexiconSword1"
-                                  layoutY="108.0"
-                                  prefHeight="50.0"
-                                  prefWidth="625.0">
-                                <Text text="Epée en fer" textAlignment="CENTER"/>
-                                <Text text="1 Bâton | 2 Minerais de fer"/>
-                            </HBox>
                             <Separator layoutY="525.0" prefHeight="5.0" prefWidth="625.0"/>
-                            <HBox id="notAvailable"
-                                  fx:id="lexiconSword2"
-                                  layoutY="108.0"
-                                  prefHeight="50.0"
+                            <HBox id="notAvailable" fx:id="lexiconSword2" layoutY="537.0" prefHeight="50.0"
                                   prefWidth="625.0">
                                 <Text text="Epée en pierre" textAlignment="CENTER"/>
                                 <Text text="1 Bâton | 2 pierre"/>
                             </HBox>
                             <Separator layoutY="600.0" prefHeight="5.0" prefWidth="625.0"/>
-                            <HBox id="notAvailable"
-                                  fx:id="lexiconSword3"
-                                  layoutY="108.0"
-                                  prefHeight="50.0"
+                            <HBox id="notAvailable" fx:id="lexiconSword3" layoutY="465.0" prefHeight="50.0"
                                   prefWidth="625.0">
                                 <Text text="Epée en bois" textAlignment="CENTER"/>
                                 <Text text="1 Bâton | 2 bois"/>
                             </HBox>
                             <Separator layoutY="675.0" prefHeight="5.0" prefWidth="625.0"/>
-                            <HBox id="notAvailable"
-                                  fx:id="recipeRock"
-                                  layoutY="163.0"
-                                  prefHeight="50.0"
+                            <HBox id="notAvailable" fx:id="lexiconSword1" layoutY="613.0" prefHeight="50.0"
+                                  prefWidth="625.0">
+                                <Text text="Epée en fer" textAlignment="CENTER"/>
+                                <Text text="1 Bâton | 2 Minerais de fer"/>
+                            </HBox>
+                            <HBox id="notAvailable" fx:id="recipeRock" layoutY="678.0" prefHeight="50.0"
                                   prefWidth="625.0">
-                                <Text text="1 Roche" textAlignment="CENTER"/>
-                                <Text text="3 pierres"/>
+                                <Text text="Roche" textAlignment="CENTER"/>
+                                <Text text="3 Pierres"/>
                             </HBox>
-                            <Separator layoutY="750.0" prefHeight="5.0" prefWidth="625.0"/>
                             <!--<HBox id="notAvailable"
                                   fx:id="lexiconBow"
                                   layoutY="163.0"
@@ -160,16 +118,10 @@
                 </center>
             </BorderPane>
 
-            <BorderPane prefHeight="200.0"
-                        prefWidth="640.0">
+            <BorderPane prefHeight="200.0" prefWidth="640.0">
                 <top>
-                    <HBox prefHeight="25.0"
-                          prefWidth="640.0"
-                          BorderPane.alignment="CENTER">
-                        <Text strokeType="OUTSIDE"
-                              strokeWidth="0.0"
-                              text="Inventaire"
-                              textAlignment="CENTER"
+                    <HBox prefHeight="25.0" prefWidth="640.0" BorderPane.alignment="CENTER">
+                        <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Inventaire du joueur" textAlignment="CENTER"
                               wrappingWidth="640">
                             <font>
                                 <Font size="16.0"/>
@@ -179,10 +131,7 @@
                 </top>
 
                 <center>
-                    <Pane fx:id="displayInventory"
-                          prefHeight="200.0"
-                          prefWidth="640.0"
-                          BorderPane.alignment="CENTER"/>
+                    <Pane fx:id="displayInventory" prefHeight="200.0" prefWidth="640.0" BorderPane.alignment="CENTER"/>
                 </center>
             </BorderPane>
         </SplitPane>

From a7a683a573d4f81eace146527062876355604d65 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Wed, 15 Jun 2022 21:08:49 +0200
Subject: [PATCH 85/97] Clear menu controller

---
 src/main/java/fr/sae/terraria/Terraria.java   |  2 +-
 .../terraria/controller/MenuController.java   | 41 ++-----------------
 2 files changed, 5 insertions(+), 38 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/Terraria.java b/src/main/java/fr/sae/terraria/Terraria.java
index 1185b3a..72fc71c 100644
--- a/src/main/java/fr/sae/terraria/Terraria.java
+++ b/src/main/java/fr/sae/terraria/Terraria.java
@@ -47,7 +47,7 @@ private FXMLLoader loadFXML(String path)
     public void start(Stage stage) throws IOException
     {
         GameController gameController = new GameController(stage);
-        MenuController menuController = new MenuController(stage);
+        MenuController menuController = new MenuController();
 
         FXMLLoader fxmlLoader = this.loadFXML("vue/game.fxml");
         fxmlLoader.setController(gameController);
diff --git a/src/main/java/fr/sae/terraria/controller/MenuController.java b/src/main/java/fr/sae/terraria/controller/MenuController.java
index 7278dfa..1edf0cf 100644
--- a/src/main/java/fr/sae/terraria/controller/MenuController.java
+++ b/src/main/java/fr/sae/terraria/controller/MenuController.java
@@ -31,65 +31,32 @@ public class MenuController implements Initializable
     @FXML public HBox recipeWoodPickaxe;
     @FXML public HBox recipeStonePickaxe;
     @FXML public HBox recipeIronPickaxe;
-    @FXML public HBox lexiconAxe1;
-    @FXML public HBox recipeStoneAxe;
-    @FXML public HBox lexiconAxe3;
-    @FXML public HBox lexiconSword1;
-    @FXML public HBox lexiconSword2;
-    @FXML public HBox lexiconSword3;
 
-
-
-    public Timeline loop;
-    private Stage stage;
     public Environment environment = null;
     public Player player = null;
-    public double scaleMultiplicatorWidth;
-    public double scaleMultiplicatorHeight;
-
 
-    public MenuController(final Stage stage)
-    {
-        super();
-        this.stage = stage;
-    }
 
     @Override public void initialize(URL location, ResourceBundle resources)
     {
-        this.scaleMultiplicatorWidth = (this.root.getPrefWidth() / Terraria.DISPLAY_RENDERING_WIDTH);
-        this.scaleMultiplicatorHeight = ((this.root.getPrefHeight()-this.HBoxText.getPrefHeight()) / Terraria.DISPLAY_RENDERING_HEIGHT);
-
-        this.loop = new Timeline();
-        this.loop.setCycleCount(Animation.INDEFINITE);
-
-        KeyFrame keyFrame = new KeyFrame(Duration.seconds(Terraria.TARGET_FPS), (ev -> {
-            if (!Objects.isNull(this.player)) {
-                // System.out.println(this.player.getInventory());
-            }
-        }));
-
-        this.loop.getKeyFrames().add(keyFrame);
-        this.loop.play();
-
         // Craft de la roche à partir de 3 pierres
         this.recipeRock.addEventFilter(Event.ANY, ev -> {
             if (ev.getEventType().getName().equalsIgnoreCase("MOUSE_PRESSED"))
-                player.pickup(Craft.rock(this.environment));
+                this.player.pickup(Craft.rock(this.environment));
         });
 
         this.recipeWoodPickaxe.addEventFilter(Event.ANY, ev -> {
             if (ev.getEventType().getName().equalsIgnoreCase("MOUSE_PRESSED"))
-                player.pickup(Craft.pickaxe(this.environment, MaterialSet.WOOD));
+                this.player.pickup(Craft.pickaxe(this.environment, MaterialSet.WOOD));
         });
 
         this.recipeStonePickaxe.addEventFilter(Event.ANY, ev -> {
             if (ev.getEventType().getName().equalsIgnoreCase("MOUSE_PRESSED"))
-                player.pickup(Craft.pickaxe(this.environment, MaterialSet.STONE));
+                this.player.pickup(Craft.pickaxe(this.environment, MaterialSet.STONE));
         });
 
         this.recipeIronPickaxe.addEventFilter(Event.ANY, ev -> {
             if (ev.getEventType().getName().equalsIgnoreCase("MOUSE_PRESSED"))
-                player.pickup(Craft.pickaxe(this.environment, MaterialSet.IRON));
+                this.player.pickup(Craft.pickaxe(this.environment, MaterialSet.IRON));
         });
     }
 }

From 9c80c261a6ef53c618790d4c4e437e5bdda033ee Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Wed, 15 Jun 2022 21:09:21 +0200
Subject: [PATCH 86/97] Fix error in Main file

---
 src/main/java/fr/sae/terraria/Terraria.java | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/Terraria.java b/src/main/java/fr/sae/terraria/Terraria.java
index 72fc71c..d94ea92 100644
--- a/src/main/java/fr/sae/terraria/Terraria.java
+++ b/src/main/java/fr/sae/terraria/Terraria.java
@@ -82,25 +82,21 @@ public void start(Stage stage) throws IOException
             if (switchScene.get()) {
                 if (!Objects.isNull(menuController.player)) {
                     gameController.player = menuController.player;
-                    menuController.loop.stop();
                     gameController.environment.getLoop().play();
                 }
             } else {
                 if (!Objects.isNull(gameController.player)) {
                     menuController.player = gameController.player;
                     menuController.environment = gameController.environment;
-                    menuController.loop.play();
                     gameController.environment.getLoop().stop();
                 }
             }
         }));
         stage.widthProperty().addListener((obs, oldV, newV) -> {
             gameController.scaleMultiplicatorWidth = (newV.intValue() / Terraria.DISPLAY_RENDERING_WIDTH);
-            menuController.scaleMultiplicatorWidth = (newV.intValue() / Terraria.DISPLAY_RENDERING_WIDTH);
         });
         stage.heightProperty().addListener((obs, oldV, newV) -> {
             gameController.scaleMultiplicatorHeight = ((newV.intValue()-gameController.title.getPrefHeight()) / Terraria.DISPLAY_RENDERING_HEIGHT);
-            menuController.scaleMultiplicatorHeight = ((newV.intValue()-gameController.title.getPrefHeight()) / Terraria.DISPLAY_RENDERING_HEIGHT);
         });
 
         stage.show();

From 63d9e26ab78c697031d2a18b83b36ceb46177565 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Wed, 15 Jun 2022 21:20:01 +0200
Subject: [PATCH 87/97] Fix joueur dans le bloc

---
 .../sae/terraria/controller/MenuController.java   | 12 ------------
 .../java/fr/sae/terraria/modele/Environment.java  | 15 +++++++--------
 .../terraria/modele/entities/player/Player.java   |  1 -
 .../modele/entities/player/craft/Craft.java       |  5 +++--
 4 files changed, 10 insertions(+), 23 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/controller/MenuController.java b/src/main/java/fr/sae/terraria/controller/MenuController.java
index 1edf0cf..e0cb83e 100644
--- a/src/main/java/fr/sae/terraria/controller/MenuController.java
+++ b/src/main/java/fr/sae/terraria/controller/MenuController.java
@@ -1,32 +1,20 @@
 package fr.sae.terraria.controller;
 
-import fr.sae.terraria.Terraria;
 import fr.sae.terraria.modele.Environment;
 import fr.sae.terraria.modele.entities.player.Player;
 import fr.sae.terraria.modele.entities.player.craft.Craft;
 import fr.sae.terraria.modele.entities.tools.MaterialSet;
-import javafx.animation.Animation;
-import javafx.animation.KeyFrame;
-import javafx.animation.Timeline;
 import javafx.event.Event;
 import javafx.fxml.FXML;
 import javafx.fxml.Initializable;
 import javafx.scene.layout.HBox;
-import javafx.scene.layout.Pane;
-import javafx.stage.Stage;
-import javafx.util.Duration;
 
 import java.net.URL;
-import java.util.Objects;
 import java.util.ResourceBundle;
 
 
 public class MenuController implements Initializable
 {
-    @FXML public Pane root;
-    @FXML public Pane displayInventory;
-    @FXML public Pane displayLexique;
-    @FXML public HBox HBoxText;
     @FXML public HBox recipeRock;
     @FXML public HBox recipeWoodPickaxe;
     @FXML public HBox recipeStonePickaxe;
diff --git a/src/main/java/fr/sae/terraria/modele/Environment.java b/src/main/java/fr/sae/terraria/modele/Environment.java
index c565965..672b5aa 100644
--- a/src/main/java/fr/sae/terraria/modele/Environment.java
+++ b/src/main/java/fr/sae/terraria/modele/Environment.java
@@ -88,17 +88,16 @@ public Environment(double scaleMultiplicatorWidth, double scaleMultiplicatorHeig
         this.player.spawn(5*widthTile, 3*heightTile);
 
         // Détecte si le joueur n'est pas dans un bloc lorsqu'il met un block au sol
-        this.entities.addListener((ListChangeListener<? super Entity>) c -> {
+        this.blocks.addListener((ListChangeListener<? super Block>) c -> {
             while (c.next()) if (c.wasAdded()) {
-                Entity entity = c.getList().get(0);
-
-                if (!Objects.isNull(entity.getRect())) {
+                Block block = c.getAddedSubList().get(0);
+                if (!Objects.isNull(block.getRect())) {
                     // Si on le pose sur le joueur
-                    boolean isIntoABlock = player.getRect().collideRect(entity.getRect());
-
-                    if (entity instanceof CollideObjectType && isIntoABlock) {
+                    boolean isIntoABlock = player.getRect().collideRect(block.getRect());
+                    boolean isCollideBlock = Block.isDirt(block) || Block.isRock(block) || Block.isFloorLeft(block) || Block.isFloorRight(block) || Block.isFloorTop(block);
+                    if (isCollideBlock && isIntoABlock) {
                         // Place le joueur au-dessus du block posé.
-                        player.setY(entity.getY() - player.getRect().getHeight());
+                        player.setY(block.getY() - player.getRect().getHeight());
                         player.getGravity().yInit = player.getY();
                         player.getGravity().xInit = player.getX();
                     }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
index 3ff8a53..8343386 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
@@ -3,7 +3,6 @@
 import fr.sae.terraria.modele.Environment;
 import fr.sae.terraria.modele.TileMaps;
 import fr.sae.terraria.modele.entities.entity.*;
-import fr.sae.terraria.modele.entities.player.craft.Craft;
 import fr.sae.terraria.modele.entities.player.inventory.Inventory;
 import fr.sae.terraria.modele.entities.player.inventory.Stack;
 import fr.sae.terraria.vue.View;
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/craft/Craft.java b/src/main/java/fr/sae/terraria/modele/entities/player/craft/Craft.java
index 20995e3..741696c 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/craft/Craft.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/craft/Craft.java
@@ -4,13 +4,14 @@
 import fr.sae.terraria.modele.entities.blocks.Block;
 import fr.sae.terraria.modele.entities.blocks.BlockSet;
 import fr.sae.terraria.modele.entities.items.Item;
-
 import fr.sae.terraria.modele.entities.player.craft.recipes.Ingredient;
 import fr.sae.terraria.modele.entities.player.craft.recipes.PickaxeRecipe;
 import fr.sae.terraria.modele.entities.player.craft.recipes.RockRecipe;
 import fr.sae.terraria.modele.entities.player.inventory.Inventory;
 import fr.sae.terraria.modele.entities.player.inventory.Stack;
-import fr.sae.terraria.modele.entities.tools.*;
+import fr.sae.terraria.modele.entities.tools.MaterialSet;
+import fr.sae.terraria.modele.entities.tools.Tool;
+import fr.sae.terraria.modele.entities.tools.ToolSet;
 
 import java.util.Objects;
 

From 23ee1139b94118f5f3052bc3dffd5dcc1c014f28 Mon Sep 17 00:00:00 2001
From: Tiago Lousa <tig2468.a@gmail.com>
Date: Wed, 15 Jun 2022 22:18:13 +0200
Subject: [PATCH 88/97] fix craft

---
 src/main/java/fr/sae/terraria/controller/MenuController.java  | 4 ++++
 .../fr/sae/terraria/modele/entities/player/craft/Craft.java   | 2 +-
 .../modele/entities/player/craft/recipes/IngredientSet.java   | 2 +-
 .../modele/entities/player/craft/recipes/PickaxeRecipe.java   | 2 --
 .../fr/sae/terraria/modele/entities/tools/MaterialSet.java    | 2 +-
 5 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/controller/MenuController.java b/src/main/java/fr/sae/terraria/controller/MenuController.java
index e0cb83e..f3ddf98 100644
--- a/src/main/java/fr/sae/terraria/controller/MenuController.java
+++ b/src/main/java/fr/sae/terraria/controller/MenuController.java
@@ -46,5 +46,9 @@ public class MenuController implements Initializable
             if (ev.getEventType().getName().equalsIgnoreCase("MOUSE_PRESSED"))
                 this.player.pickup(Craft.pickaxe(this.environment, MaterialSet.IRON));
         });
+        this.recipeWoodPickaxe.addEventFilter(Event.ANY, ev -> {
+            if (ev.getEventType().getName().equalsIgnoreCase("MOUSE_PRESSED"))
+                this.player.pickup(Craft.pickaxe(this.environment, MaterialSet.WOOD));
+        });
     }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/craft/Craft.java b/src/main/java/fr/sae/terraria/modele/entities/player/craft/Craft.java
index 741696c..2d5b093 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/craft/Craft.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/craft/Craft.java
@@ -46,7 +46,7 @@ else if (MaterialSet.isIron(material))
             pickaxeIngredients = PickaxeRecipe.IronRecipe.apply(inventory);
 
         if (!Objects.isNull(pickaxeIngredients)) for (int i = 0; i < pickaxeIngredients.get().length; i++) {
-            Stack stack = (Stack) pickaxeIngredients.get()[i].getItem();
+            Stack stack = pickaxeIngredients.get()[i];
 
             if (Item.isStick(stack.getItem()))
                 stack.removeQuantity(PickaxeRecipe.NB_STICKS);
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/IngredientSet.java b/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/IngredientSet.java
index 14d565a..6a608fe 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/IngredientSet.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/IngredientSet.java
@@ -12,7 +12,7 @@ private static boolean putStackIntoIngredientsList(final Ingredient ingredient,
     {
         if (ingredient.get().length == 1)
             ingredient.get()[0] = stack;
-        else ingredient.get()[ingredient.nbStacks()] = stack;
+        else ingredient.get()[ingredient.nbStacks()-1] = stack;
 
         return true;
     }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/PickaxeRecipe.java b/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/PickaxeRecipe.java
index 06eb144..94802a1 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/PickaxeRecipe.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/PickaxeRecipe.java
@@ -32,7 +32,6 @@ public static Ingredient apply(final Inventory inventory)
 
                 i++;
             } while (i < inventory.get().size() && (!haveEnoughForPickaxeHead || !haveEnoughForPickaxeHandler));
-
             return (haveEnoughForPickaxeHead && haveEnoughForPickaxeHandler) ? ingredient : null;
         }
     }
@@ -59,7 +58,6 @@ public static Ingredient apply(final Inventory inventory)
 
                 i++;
             } while (i < inventory.get().size() && (!haveEnoughForPickaxeHead || !haveEnoughForPickaxeHandler));
-
             return (haveEnoughForPickaxeHead && haveEnoughForPickaxeHandler) ? ingredient : null;
         }
     }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/tools/MaterialSet.java b/src/main/java/fr/sae/terraria/modele/entities/tools/MaterialSet.java
index 8a155f3..4c03141 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/tools/MaterialSet.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/tools/MaterialSet.java
@@ -8,7 +8,7 @@ public enum MaterialSet
     IRON;
 
 
-    public static boolean isWood(MaterialSet material) { return material == MaterialSet.IRON; }
+    public static boolean isWood(MaterialSet material) { return material == MaterialSet.WOOD; }
     public static boolean isStone(MaterialSet material) { return material == MaterialSet.STONE; }
     public static boolean isIron(MaterialSet material) { return material == MaterialSet.IRON; }
 }

From 832fa5d11734e3d63d3531bfc52f97e6fd405ca3 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Thu, 16 Jun 2022 16:15:52 +0200
Subject: [PATCH 89/97] Jeux de test pour les constructions

---
 .../entities/player/inventory/Stack.java      |   3 +-
 .../entities/player/craft/CraftTest.java      | 110 ++++++++++++++++++
 2 files changed, 112 insertions(+), 1 deletion(-)
 create mode 100644 src/test/java/fr/sae/terraria/modele/entities/player/craft/CraftTest.java

diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
index 00b5916..0eaff13 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Stack.java
@@ -104,7 +104,8 @@ public boolean removeQuantity(int quantity)
         return false;
     }
 
-    @Override public String toString(){
+    @Override public String toString()
+    {
         if (item instanceof Block)
             return String.valueOf(((Block) item).getTypeOfBlock());
         return item.toString();
diff --git a/src/test/java/fr/sae/terraria/modele/entities/player/craft/CraftTest.java b/src/test/java/fr/sae/terraria/modele/entities/player/craft/CraftTest.java
new file mode 100644
index 0000000..1d8e340
--- /dev/null
+++ b/src/test/java/fr/sae/terraria/modele/entities/player/craft/CraftTest.java
@@ -0,0 +1,110 @@
+package fr.sae.terraria.modele.entities.player.craft;
+
+import fr.sae.terraria.modele.Environment;
+import fr.sae.terraria.modele.entities.blocks.Block;
+import fr.sae.terraria.modele.entities.items.Item;
+import fr.sae.terraria.modele.entities.player.Player;
+import fr.sae.terraria.modele.entities.player.craft.recipes.IngredientSet;
+import fr.sae.terraria.modele.entities.player.craft.recipes.PickaxeRecipe;
+import fr.sae.terraria.modele.entities.player.craft.recipes.RockRecipe;
+import fr.sae.terraria.modele.entities.player.inventory.Stack;
+import fr.sae.terraria.modele.entities.tools.MaterialSet;
+import fr.sae.terraria.modele.entities.tools.Tool;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+import java.util.Objects;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+
+public class CraftTest
+{
+    private static Environment environment;
+    private static Player player;
+
+
+    public CraftTest() { super(); }
+
+    @BeforeAll public static void init()
+    {
+        environment = new Environment(1., 1.);
+        player = environment.getPlayer();
+    }
+
+    @Test public final void stockTest()
+    {
+        player.pickup(Item.STONE);
+        player.pickup(Item.STONE);
+        player.pickup(Item.STONE);
+        player.pickup(Item.STONE);
+
+        boolean haveEnoughStones = false;
+        for (Stack stack : player.getInventory().get())
+            if (Item.isStone(stack.getItem()) && stack.haveEnoughQuantity(RockRecipe.NB_STONES))
+                haveEnoughStones = true;
+        assertTrue(haveEnoughStones);
+
+        Block block = Craft.rock(environment);
+        player.pickup(block);
+
+        boolean haveRock = false;
+        for (Stack stack : player.getInventory().get())
+            if (stack.getItem() instanceof Block && Block.isRock((Block) stack.getItem()))
+                haveRock = true;
+        assertTrue(haveRock);
+
+        boolean dontHaveStones = true;
+        for (Stack stack : player.getInventory().get())
+            if (Item.isStone(stack.getItem())) {
+                dontHaveStones = false;
+                break;
+            }
+        assertTrue(dontHaveStones);
+    }
+
+    @Test public final void pickaxeTest()
+    {
+        player.pickup(Item.WOOD);
+        player.pickup(Item.WOOD);
+        player.pickup(Item.WOOD);
+        player.pickup(Item.STICK);
+        player.pickup(Item.STICK);
+
+        boolean haveEnoughWoods = false;
+        boolean haveEnoughSticks = false;
+        for (Stack stack : player.getInventory().get()) {
+            if (Item.isWood(stack.getItem()) && stack.haveEnoughQuantity(PickaxeRecipe.WoodRecipe.NB_WOODS))
+                haveEnoughWoods = true;
+            if (Item.isStick(stack.getItem()) && stack.haveEnoughQuantity(PickaxeRecipe.NB_STICKS))
+                haveEnoughSticks = true;
+        }
+
+        assertTrue(haveEnoughWoods);
+        assertTrue(haveEnoughSticks);
+        Tool woodPickaxe = Craft.pickaxe(environment, MaterialSet.WOOD);
+        assertTrue(!Objects.isNull(woodPickaxe) && Tool.isPickaxe(woodPickaxe) && MaterialSet.isWood(woodPickaxe.getMaterial()));
+        player.pickup(woodPickaxe);
+
+        boolean havePickaxe = false;
+        for (Stack stack : player.getInventory().get())
+            if (Tool.isPickaxe((Tool) stack.getItem()))
+                havePickaxe = true;
+        assertTrue(havePickaxe);
+
+
+        boolean dontHaveWoods = true;
+        boolean dontHaveSticks = true;
+        for (Stack stack : player.getInventory().get()) {
+            System.out.println(stack.getItem());
+            if (!Item.isWood(stack.getItem()) && stack.haveEnoughQuantity(PickaxeRecipe.WoodRecipe.NB_WOODS)) {
+                dontHaveWoods = false;
+                break;
+            } else if (!Item.isStick(stack.getItem()) && stack.haveEnoughQuantity(PickaxeRecipe.NB_STICKS)) {
+                dontHaveSticks = false;
+                break;
+            }
+        }
+        assertTrue(dontHaveSticks && dontHaveWoods);
+    }
+}

From 9574eee23a3fbeeddfd63774e4caeaad21dd9afa Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Thu, 16 Jun 2022 21:20:51 +0200
Subject: [PATCH 90/97] Ajustement Lexique, ajout du craft de la torche

---
 .../terraria/controller/MenuController.java   |  63 +++++++--
 .../fr/sae/terraria/modele/Environment.java   |   1 -
 .../modele/entities/player/craft/Craft.java   |  18 +++
 .../player/craft/recipes/IngredientSet.java   |   6 +
 .../player/craft/recipes/RockRecipe.java      |   2 +-
 .../player/craft/recipes/TorchRecipe.java     |  32 +++++
 .../resources/fr/sae/terraria/vue/menu.fxml   | 122 ++++++++----------
 7 files changed, 160 insertions(+), 84 deletions(-)
 create mode 100644 src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/TorchRecipe.java

diff --git a/src/main/java/fr/sae/terraria/controller/MenuController.java b/src/main/java/fr/sae/terraria/controller/MenuController.java
index f3ddf98..5d523b4 100644
--- a/src/main/java/fr/sae/terraria/controller/MenuController.java
+++ b/src/main/java/fr/sae/terraria/controller/MenuController.java
@@ -16,10 +16,20 @@
 public class MenuController implements Initializable
 {
     @FXML public HBox recipeRock;
+    @FXML public HBox recipeTorch;
+
     @FXML public HBox recipeWoodPickaxe;
     @FXML public HBox recipeStonePickaxe;
     @FXML public HBox recipeIronPickaxe;
 
+    @FXML public HBox recipeWoodAxe;
+    @FXML public HBox recipeStoneAxe;
+    @FXML public HBox recipeIronAxe;
+
+    @FXML public HBox recipeWoodSword;
+    @FXML public HBox recipeStoneSword;
+    @FXML public HBox recipeIronSword;
+
     public Environment environment = null;
     public Player player = null;
 
@@ -27,28 +37,59 @@ public class MenuController implements Initializable
     @Override public void initialize(URL location, ResourceBundle resources)
     {
         // Craft de la roche à partir de 3 pierres
-        this.recipeRock.addEventFilter(Event.ANY, ev -> {
-            if (ev.getEventType().getName().equalsIgnoreCase("MOUSE_PRESSED"))
+        this.recipeRock.addEventFilter(Event.ANY, event -> {
+            if (event.getEventType().getName().equalsIgnoreCase("MOUSE_PRESSED"))
                 this.player.pickup(Craft.rock(this.environment));
         });
 
-        this.recipeWoodPickaxe.addEventFilter(Event.ANY, ev -> {
-            if (ev.getEventType().getName().equalsIgnoreCase("MOUSE_PRESSED"))
+        this.recipeTorch.addEventFilter(Event.ANY, event -> {
+            if (event.getEventType().getName().equalsIgnoreCase("MOUSE_PRESSED"))
+                this.player.pickup(Craft.torch(this.environment));
+        });
+
+
+        // LES PIOCHES
+        this.recipeWoodPickaxe.addEventFilter(Event.ANY, event -> {
+            if (event.getEventType().getName().equalsIgnoreCase("MOUSE_PRESSED"))
                 this.player.pickup(Craft.pickaxe(this.environment, MaterialSet.WOOD));
         });
 
-        this.recipeStonePickaxe.addEventFilter(Event.ANY, ev -> {
-            if (ev.getEventType().getName().equalsIgnoreCase("MOUSE_PRESSED"))
+        this.recipeStonePickaxe.addEventFilter(Event.ANY, event -> {
+            if (event.getEventType().getName().equalsIgnoreCase("MOUSE_PRESSED"))
                 this.player.pickup(Craft.pickaxe(this.environment, MaterialSet.STONE));
         });
 
-        this.recipeIronPickaxe.addEventFilter(Event.ANY, ev -> {
-            if (ev.getEventType().getName().equalsIgnoreCase("MOUSE_PRESSED"))
+        this.recipeIronPickaxe.addEventFilter(Event.ANY, event -> {
+            if (event.getEventType().getName().equalsIgnoreCase("MOUSE_PRESSED"))
                 this.player.pickup(Craft.pickaxe(this.environment, MaterialSet.IRON));
         });
-        this.recipeWoodPickaxe.addEventFilter(Event.ANY, ev -> {
-            if (ev.getEventType().getName().equalsIgnoreCase("MOUSE_PRESSED"))
-                this.player.pickup(Craft.pickaxe(this.environment, MaterialSet.WOOD));
+
+
+        // LES HACHES
+        this.recipeWoodAxe.addEventFilter(Event.ANY, event -> {
+
+        });
+
+        this.recipeStoneAxe.addEventFilter(Event.ANY, event -> {
+
+        });
+
+        this.recipeIronAxe.addEventFilter(Event.ANY, event -> {
+
+        });
+
+
+        // LES EPEES
+        this.recipeWoodSword.addEventFilter(Event.ANY, event -> {
+
+        });
+
+        this.recipeStoneSword.addEventFilter(Event.ANY, event -> {
+
+        });
+
+        this.recipeIronSword.addEventFilter(Event.ANY, event -> {
+
         });
     }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/Environment.java b/src/main/java/fr/sae/terraria/modele/Environment.java
index 672b5aa..011e8fb 100644
--- a/src/main/java/fr/sae/terraria/modele/Environment.java
+++ b/src/main/java/fr/sae/terraria/modele/Environment.java
@@ -6,7 +6,6 @@
 import fr.sae.terraria.modele.entities.blocks.Block;
 import fr.sae.terraria.modele.entities.blocks.BlockSet;
 import fr.sae.terraria.modele.entities.blocks.Tree;
-import fr.sae.terraria.modele.entities.entity.CollideObjectType;
 import fr.sae.terraria.modele.entities.entity.Entity;
 import fr.sae.terraria.modele.entities.entity.ReproductiveObjectType;
 import fr.sae.terraria.modele.entities.items.Meat;
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/craft/Craft.java b/src/main/java/fr/sae/terraria/modele/entities/player/craft/Craft.java
index 2d5b093..906c1df 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/craft/Craft.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/craft/Craft.java
@@ -7,6 +7,7 @@
 import fr.sae.terraria.modele.entities.player.craft.recipes.Ingredient;
 import fr.sae.terraria.modele.entities.player.craft.recipes.PickaxeRecipe;
 import fr.sae.terraria.modele.entities.player.craft.recipes.RockRecipe;
+import fr.sae.terraria.modele.entities.player.craft.recipes.TorchRecipe;
 import fr.sae.terraria.modele.entities.player.inventory.Inventory;
 import fr.sae.terraria.modele.entities.player.inventory.Stack;
 import fr.sae.terraria.modele.entities.tools.MaterialSet;
@@ -33,6 +34,23 @@ public static Block rock(final Environment environment)
         return (!Objects.isNull(rockIngredients)) ? new Block(BlockSet.ROCK, environment) : null;
     }
 
+    public static Block torch(final Environment environment)
+    {
+        Inventory inventory = environment.getPlayer().getInventory();
+
+        Ingredient torchIngredients = TorchRecipe.apply(inventory);
+        if (!Objects.isNull(torchIngredients)) for (int i = 0; i < torchIngredients.get().length; i++) {
+            Stack stack = torchIngredients.get()[i];
+
+            if (Item.isStick(stack.getItem()))
+                stack.removeQuantity(TorchRecipe.NB_STICKS);
+            if (Item.isCoal(stack.getItem()))
+                stack.removeQuantity(TorchRecipe.NB_COALS);
+        }
+
+        return (!Objects.isNull(torchIngredients)) ? new Block(BlockSet.TORCH, environment) : null;
+    }
+
     public static Tool pickaxe(final Environment environment, final MaterialSet material)
     {
         Inventory inventory = environment.getPlayer().getInventory();
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/IngredientSet.java b/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/IngredientSet.java
index 6a608fe..a307d78 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/IngredientSet.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/IngredientSet.java
@@ -40,4 +40,10 @@ public static boolean irons(final Ingredient ingredient, final Stack stack, fina
         boolean haveEnoughIrons = Item.isIron(stack.getItem()) && stack.haveEnoughQuantity(nbStones);
         return haveEnoughIrons && IngredientSet.putStackIntoIngredientsList(ingredient, stack);
     }
+
+    public static boolean coals(final Ingredient ingredient, final Stack stack, final int nbCoals)
+    {
+        boolean haveEnoughCoals = Item.isCoal(stack.getItem()) && stack.haveEnoughQuantity(nbCoals);
+        return haveEnoughCoals && IngredientSet.putStackIntoIngredientsList(ingredient, stack);
+    }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/RockRecipe.java b/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/RockRecipe.java
index 27178a3..ac1e260 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/RockRecipe.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/RockRecipe.java
@@ -13,7 +13,7 @@ public class RockRecipe
     public static Ingredient apply(final Inventory inventory)
     {
         Ingredient ingredient = new Ingredient(RockRecipe.NB_INGREDIENTS);
-        boolean haveEnoughStone ;
+        boolean haveEnoughStone;
 
         int i = 0;
         do {
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/TorchRecipe.java b/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/TorchRecipe.java
new file mode 100644
index 0000000..6090c03
--- /dev/null
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/TorchRecipe.java
@@ -0,0 +1,32 @@
+package fr.sae.terraria.modele.entities.player.craft.recipes;
+
+import fr.sae.terraria.modele.entities.player.inventory.Inventory;
+import fr.sae.terraria.modele.entities.player.inventory.Stack;
+
+
+public class TorchRecipe
+{
+    private static final int NB_INGREDIENTS = 2;
+    public static final int NB_COALS = 1;
+    public static final int NB_STICKS = 1;
+
+
+    public static Ingredient apply(final Inventory inventory)
+    {
+        Ingredient ingredient = new Ingredient(TorchRecipe.NB_INGREDIENTS);
+        boolean haveEnoughCoal = false;
+        boolean haveEnoughSticks = false;
+
+        int i = 0;
+        do {
+            Stack stack = inventory.get().get(i);
+
+            if (!haveEnoughCoal)
+                haveEnoughCoal = IngredientSet.coals(ingredient, stack, TorchRecipe.NB_COALS);
+            if (!haveEnoughSticks)
+                haveEnoughSticks = IngredientSet.sticks(ingredient, stack, TorchRecipe.NB_COALS);
+        } while (i < inventory.get().size() && (!haveEnoughCoal || !haveEnoughSticks));
+
+        return (haveEnoughCoal && haveEnoughSticks) ? ingredient : null;
+    }
+}
diff --git a/src/main/resources/fr/sae/terraria/vue/menu.fxml b/src/main/resources/fr/sae/terraria/vue/menu.fxml
index 38fd511..ab8eee4 100644
--- a/src/main/resources/fr/sae/terraria/vue/menu.fxml
+++ b/src/main/resources/fr/sae/terraria/vue/menu.fxml
@@ -13,16 +13,15 @@
 <BorderPane fx:id="root" maxHeight="-Infinity" maxWidth="-Infinity"
             minHeight="-Infinity" minWidth="-Infinity"
             prefHeight="720" prefWidth="1280"
-            xmlns="http://javafx.com/javafx/11"
-            xmlns:fx="http://javafx.com/fxml/1">
+            xmlns="http://javafx.com/javafx/11" xmlns:fx="http://javafx.com/fxml/1">
     <stylesheets>
-        <URL value="@./menu.css"/>
+        <URL value="@./menu.css" />
     </stylesheets>
 
 
     <top>
         <HBox id="textArea" fx:id="HBoxText" prefHeight="25.0" prefWidth="1280" BorderPane.alignment="CENTER">
-            <Text id="text" text="Groupe: BOUCHE Antoine, CHRZASZCZ Naulan, NARCISO Tiago"/>
+            <Text id="text" text="Groupe: BOUCHE Antoine, CHRZASZCZ Naulan, NARCISO Tiago" />
         </HBox>
     </top>
 
@@ -31,11 +30,9 @@
             <BorderPane prefHeight="200.0" prefWidth="640.0">
                 <top>
                     <HBox fx:id="HBoxTitle" prefHeight="25.0" prefWidth="640.0" BorderPane.alignment="CENTER">
-                        <Text fx:id="TextHBoxTitle" stroke="WHITE" strokeType="OUTSIDE" strokeWidth="0.0"
-                              text="Lexique des constructions" textAlignment="CENTER" underline="true"
-                              wrappingWidth="632.470703125">
+                        <Text fx:id="TextHBoxTitle" stroke="WHITE" strokeType="OUTSIDE" strokeWidth="0.0" text="Lexique des constructions" textAlignment="CENTER" underline="true" wrappingWidth="632.470703125">
                             <font>
-                                <Font size="20.0"/>
+                                <Font size="20.0" />
                             </font>
                         </Text>
                     </HBox>
@@ -44,75 +41,59 @@
                 <center>
                     <ScrollPane prefHeight="200.0" prefWidth="640.0" BorderPane.alignment="CENTER">
                         <Pane fx:id="displayLexique" prefHeight="900.0" prefWidth="640.0">
-                            <HBox id="notAvailable" fx:id="recipeWoodPickaxe" layoutY="240.0" prefHeight="50.0"
-                                  prefWidth="625.0">
-                                <Text text="Pioche en bois" textAlignment="CENTER"/>
-                                <Text text="2 Bâtons | 3 bois" textAlignment="CENTER"/>
+                            <HBox id="notAvailable" fx:id="recipeWoodPickaxe" layoutY="179.0" prefHeight="50.0" prefWidth="625.0">
+                                <Text text="PIOCHE EN BOIS " textAlignment="CENTER" underline="true" />
+                                <Text text="-- 2 Bâtons | 3 bois" textAlignment="CENTER" />
                             </HBox>
-                            <Separator layoutY="150.0" prefHeight="5.0" prefWidth="625.0"/>
-                            <HBox id="notAvailable" fx:id="recipeStonePickaxe" layoutY="314.0" prefHeight="50.0"
-                                  prefWidth="625.0">
-                                <Text text="Pioche en pierre" textAlignment="CENTER"/>
-                                <Text text="2 Bâtons | 3 pierre" textAlignment="CENTER"/>
+                            <Separator layoutY="119.0" prefHeight="5.0" prefWidth="625.0" />
+                            <HBox id="notAvailable" fx:id="recipeStonePickaxe" layoutY="234.0" prefHeight="50.0" prefWidth="625.0">
+                                <Text text="PIOCHE EN PIERRE " textAlignment="CENTER" underline="true" />
+                                <Text text="-- 2 Bâtons | 3 pierres" textAlignment="CENTER" />
                             </HBox>
-                            <Separator layoutY="75.0" prefHeight="5.0" prefWidth="625.0"/>
-                            <HBox id="notAvailable" fx:id="recipeIronPickaxe" layoutY="387.0" prefHeight="50.0"
-                                  prefWidth="625.0">
-                                <Text text="Pioche en fer" textAlignment="CENTER"/>
-                                <Text text="2 Bâtons | 3 Minerais de fer" textAlignment="CENTER"/>
+                            <Separator layoutY="64.0" prefHeight="5.0" prefWidth="625.0" />
+                            <HBox id="notAvailable" fx:id="recipeIronPickaxe" layoutY="289.0" prefHeight="50.0" prefWidth="625.0">
+                                <Text text="PIOCHE EN FER " textAlignment="CENTER" underline="true" />
+                                <Text text="-- 2 Bâtons | 3 Minerais de fer" textAlignment="CENTER" />
                             </HBox>
-                            <Separator layoutY="225.0" prefHeight="5.0" prefWidth="625.0"/>
-                            <HBox id="notAvailable" fx:id="recipeWoodAxe" layoutY="14.0" prefHeight="50.0"
-                                  prefWidth="625.0">
-                                <Text text="Hache en bois" textAlignment="CENTER"/>
-                                <Text text="2 Bâtons | 3 bois" textAlignment="CENTER"/>
+                            <Separator layoutY="174.0" prefHeight="5.0" prefWidth="625.0" />
+                            <HBox id="notAvailable" fx:id="recipeWoodAxe" layoutY="14.0" prefHeight="50.0" prefWidth="625.0">
+                                <Text text="HACHE EN BOIS " textAlignment="CENTER" underline="true" />
+                                <Text text="-- 2 Bâtons | 3 bois" textAlignment="CENTER" />
                             </HBox>
-                            <Separator layoutY="300.0" prefHeight="5.0" prefWidth="625.0"/>
-                            <HBox id="notAvailable" fx:id="recipeStoneAxe" layoutY="90.0" prefHeight="50.0"
-                                  prefWidth="625.0">
-                                <Text text="Hache en pierre" textAlignment="CENTER"/>
-                                <Text text="2 Bâtons | 3 pierre" textAlignment="CENTER"/>
+                            <Separator layoutY="229.0" prefHeight="5.0" prefWidth="625.0" />
+                            <HBox id="notAvailable" fx:id="recipeStoneAxe" layoutY="69.0" prefHeight="50.0" prefWidth="625.0">
+                                <Text text="HACHE EN PIERRE " textAlignment="CENTER" underline="true" />
+                                <Text text="-- 2 Bâtons | 3 pierres" textAlignment="CENTER" />
                             </HBox>
-                            <Separator layoutY="375.0" prefHeight="5.0" prefWidth="625.0"/>
-                            <HBox id="notAvailable" fx:id="recipeIronAxe" layoutY="167.0" prefHeight="50.0"
-                                  prefWidth="625.0">
-                                <Text text="Hache en fer" textAlignment="CENTER"/>
-                                <Text text="2 Bâtons | 3 Minerais de fer" textAlignment="CENTER"/>
+                            <Separator layoutY="284.0" prefHeight="5.0" prefWidth="625.0" />
+                            <HBox id="notAvailable" fx:id="recipeIronAxe" layoutY="124.0" prefHeight="50.0" prefWidth="625.0">
+                                <Text text="HACHE EN FER " textAlignment="CENTER" underline="true" />
+                                <Text text=" -- 2 Bâtons | 3 Minerais de fer" textAlignment="CENTER" />
                             </HBox>
-                            <Separator layoutY="450.0" prefHeight="5.0" prefWidth="625.0"/>
-                            <Separator layoutY="525.0" prefHeight="5.0" prefWidth="625.0"/>
-                            <HBox id="notAvailable" fx:id="lexiconSword2" layoutY="537.0" prefHeight="50.0"
-                                  prefWidth="625.0">
-                                <Text text="Epée en pierre" textAlignment="CENTER"/>
-                                <Text text="1 Bâton | 2 pierre"/>
+                            <Separator layoutY="339.0" prefHeight="5.0" prefWidth="625.0" />
+                            <HBox id="notAvailable" fx:id="recipeStoneSword" layoutY="399.0" prefHeight="50.0" prefWidth="625.0">
+                                <Text text="EPEE EN PIERRE " textAlignment="CENTER" underline="true" />
+                                <Text text="-- 1 Bâton | 2 pierres" />
                             </HBox>
-                            <Separator layoutY="600.0" prefHeight="5.0" prefWidth="625.0"/>
-                            <HBox id="notAvailable" fx:id="lexiconSword3" layoutY="465.0" prefHeight="50.0"
-                                  prefWidth="625.0">
-                                <Text text="Epée en bois" textAlignment="CENTER"/>
-                                <Text text="1 Bâton | 2 bois"/>
+                            <Separator layoutY="450.0" prefHeight="5.0" prefWidth="625.0" />
+                            <HBox id="notAvailable" fx:id="recipeWoodSword" layoutY="344.0" prefHeight="50.0" prefWidth="625.0">
+                                <Text text="EPEE EN BOIS" textAlignment="CENTER" underline="true" />
+                                <Text text=" -- 1 Bâton | 2 bois" />
                             </HBox>
-                            <Separator layoutY="675.0" prefHeight="5.0" prefWidth="625.0"/>
-                            <HBox id="notAvailable" fx:id="lexiconSword1" layoutY="613.0" prefHeight="50.0"
-                                  prefWidth="625.0">
-                                <Text text="Epée en fer" textAlignment="CENTER"/>
-                                <Text text="1 Bâton | 2 Minerais de fer"/>
+                            <Separator layoutY="675.0" prefHeight="5.0" prefWidth="625.0" />
+                            <HBox id="notAvailable" fx:id="recipeIronSword" layoutY="455.0" prefHeight="50.0" prefWidth="625.0">
+                                <Text text="EPEE EN FER " textAlignment="CENTER" underline="true" />
+                                <Text text="-- 1 Bâton | 2 Minerais de fer" />
                             </HBox>
-                            <HBox id="notAvailable" fx:id="recipeRock" layoutY="678.0" prefHeight="50.0"
-                                  prefWidth="625.0">
-                                <Text text="Roche" textAlignment="CENTER"/>
-                                <Text text="3 Pierres"/>
+                            <Separator layoutY="394.0" prefHeight="5.0" prefWidth="625.0" />
+                            <HBox id="notAvailable" fx:id="recipeRock" layoutY="511.0" prefHeight="50.0" prefWidth="625.0">
+                                <Text text="ROCHE " textAlignment="CENTER" underline="true" />
+                                <Text text="-- 3 Pierres" />
                             </HBox>
-                            <!--<HBox id="notAvailable"
-                                  fx:id="lexiconBow"
-                                  layoutY="163.0"
-                                  prefHeight="50.0"
-                                  prefWidth="625.0">
-                                <Text text="arc" textAlignment="CENTER"/>
-                                <Text text="3 Bâton | 3 fibres"/>
-                            </HBox>
-                            <Separator layoutY="825.0" prefHeight="5.0" prefWidth="625.0"/>
-                            -->
+                             <HBox id="notAvailable" fx:id="recipeTorch" layoutY="569.0" prefHeight="50.0" prefWidth="625.0">
+                               <Text text="TORCHE " underline="true" />
+                               <Text text="-- 1 Bâton | 1 Charbon" />
+                             </HBox>
                         </Pane>
                     </ScrollPane>
                 </center>
@@ -121,17 +102,16 @@
             <BorderPane prefHeight="200.0" prefWidth="640.0">
                 <top>
                     <HBox prefHeight="25.0" prefWidth="640.0" BorderPane.alignment="CENTER">
-                        <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Inventaire du joueur" textAlignment="CENTER"
-                              wrappingWidth="640">
+                        <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Inventaire du joueur" textAlignment="CENTER" underline="true" wrappingWidth="640">
                             <font>
-                                <Font size="16.0"/>
+                                <Font size="20.0" />
                             </font>
                         </Text>
                     </HBox>
                 </top>
 
                 <center>
-                    <Pane fx:id="displayInventory" prefHeight="200.0" prefWidth="640.0" BorderPane.alignment="CENTER"/>
+                    <Pane fx:id="displayInventory" prefHeight="200.0" prefWidth="640.0" BorderPane.alignment="CENTER" />
                 </center>
             </BorderPane>
         </SplitPane>

From ee6bc3b1ee083136baad6b264a9b8ea80d4268b6 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Thu, 16 Jun 2022 21:24:49 +0200
Subject: [PATCH 91/97] =?UTF-8?q?Ajout=20des=20loots=20suppl=C3=A9mentaire?=
 =?UTF-8?q?=20des=20blocks=20de=20type=20Roche?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/fr/sae/terraria/modele/entities/blocks/Block.java   | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java b/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
index 1f74001..e50455e 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/blocks/Block.java
@@ -76,6 +76,11 @@ private void loots()
         } else if (Block.isRock(this)) {
             for (int loot = 0; loot < Block.ROCK_NB_LOOTS; loot++)
                 player.pickup(Item.STONE);
+
+            if (Math.random() > .5)
+                player.pickup(Item.COAL);
+            if (Math.random() < .05)
+                player.pickup(Item.IRON);
         } else if (Block.isTallGrass(this)) {
             for (int loot = (int) (Math.random()*3)+1; loot <= TallGrass.LOOTS_FIBRE_MAX; loot++)
                 player.pickup(Item.FIBER);

From 8187ef48b00cc5f8acab99f48937a0b228b676f7 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Thu, 16 Jun 2022 21:32:36 +0200
Subject: [PATCH 92/97] Fix pprobleme torche

---
 src/main/java/fr/sae/terraria/modele/Environment.java           | 2 --
 .../modele/entities/player/craft/recipes/TorchRecipe.java       | 1 +
 2 files changed, 1 insertion(+), 2 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/modele/Environment.java b/src/main/java/fr/sae/terraria/modele/Environment.java
index 011e8fb..b6cc2d6 100644
--- a/src/main/java/fr/sae/terraria/modele/Environment.java
+++ b/src/main/java/fr/sae/terraria/modele/Environment.java
@@ -121,8 +121,6 @@ private void gameLoop()
         KeyFrame keyFrame = new KeyFrame(Duration.seconds(Terraria.TARGET_FPS), (ev -> {
             // TODO TEST
             if (!caught[0]) {
-                this.player.pickup(new Block(BlockSet.TORCH, this));
-                this.player.pickup(new Meat(this));
                 this.player.pickup(new Tool(ToolSet.PICKAXE, MaterialSet.IRON));
                 this.player.pickup(new Vodka(this));
                 this.player.pickup(new Tool(ToolSet.SWORD, MaterialSet.IRON));
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/TorchRecipe.java b/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/TorchRecipe.java
index 6090c03..b66ec31 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/TorchRecipe.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/craft/recipes/TorchRecipe.java
@@ -25,6 +25,7 @@ public static Ingredient apply(final Inventory inventory)
                 haveEnoughCoal = IngredientSet.coals(ingredient, stack, TorchRecipe.NB_COALS);
             if (!haveEnoughSticks)
                 haveEnoughSticks = IngredientSet.sticks(ingredient, stack, TorchRecipe.NB_COALS);
+            i++;
         } while (i < inventory.get().size() && (!haveEnoughCoal || !haveEnoughSticks));
 
         return (haveEnoughCoal && haveEnoughSticks) ? ingredient : null;

From a4af44d25b567b3b2a7a9bb085ddd16c72778777 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Fri, 17 Jun 2022 10:58:55 +0200
Subject: [PATCH 93/97] eat sound

---
 .../fr/sae/terraria/modele/Environment.java     |   4 +---
 .../terraria/modele/entities/items/Meat.java    |   3 ++-
 .../terraria/modele/entities/items/Vodka.java   |   2 ++
 .../terraria/modele/entities/player/Player.java |   1 +
 .../entities/player/inventory/Inventory.java    |   2 ++
 .../resources/fr/sae/terraria/sound/hit.wav     | Bin 0 -> 82240 bytes
 6 files changed, 8 insertions(+), 4 deletions(-)
 create mode 100644 src/main/resources/fr/sae/terraria/sound/hit.wav

diff --git a/src/main/java/fr/sae/terraria/modele/Environment.java b/src/main/java/fr/sae/terraria/modele/Environment.java
index b6cc2d6..f9a1282 100644
--- a/src/main/java/fr/sae/terraria/modele/Environment.java
+++ b/src/main/java/fr/sae/terraria/modele/Environment.java
@@ -4,11 +4,9 @@
 import fr.sae.terraria.modele.entities.Rabbit;
 import fr.sae.terraria.modele.entities.Slime;
 import fr.sae.terraria.modele.entities.blocks.Block;
-import fr.sae.terraria.modele.entities.blocks.BlockSet;
 import fr.sae.terraria.modele.entities.blocks.Tree;
 import fr.sae.terraria.modele.entities.entity.Entity;
 import fr.sae.terraria.modele.entities.entity.ReproductiveObjectType;
-import fr.sae.terraria.modele.entities.items.Meat;
 import fr.sae.terraria.modele.entities.items.Vodka;
 import fr.sae.terraria.modele.entities.player.Player;
 import fr.sae.terraria.modele.entities.tools.MaterialSet;
@@ -177,7 +175,7 @@ public static Clip playSound(String path, boolean loop)
         } catch (Exception e) { e.printStackTrace(); }
 
         if (!Objects.isNull(clip)) {
-            clip.loop((loop) ? Clip.LOOP_CONTINUOUSLY : 0);
+            clip.loop(loop ? Clip.LOOP_CONTINUOUSLY : 0);
             clip.start();
         }
 
diff --git a/src/main/java/fr/sae/terraria/modele/entities/items/Meat.java b/src/main/java/fr/sae/terraria/modele/entities/items/Meat.java
index 831aeb4..37d8772 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/items/Meat.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/items/Meat.java
@@ -19,8 +19,9 @@ public Meat(final Environment environment)
 
     @Override public void consumes()
     {
-        Player player = environment.getPlayer();
+        Environment.playSound("sound/eat.wav", false);
 
+        Player player = environment.getPlayer();
         if (player.getPv() < player.getPvMax())
             player.setPv(player.getPv() + 1);
     }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/items/Vodka.java b/src/main/java/fr/sae/terraria/modele/entities/items/Vodka.java
index de241fa..bb4871c 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/items/Vodka.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/items/Vodka.java
@@ -28,6 +28,8 @@ public Vodka(final Environment environment)
 
     @Override public void consumes()
     {
+        Environment.playSound("sound/eat.wav", false);
+
         Player player = environment.getPlayer();
         Inventory inventory = player.getInventory();
         inventory.get().get(inventory.getPosCursor()).remove();
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
index 8343386..12fe97a 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
@@ -3,6 +3,7 @@
 import fr.sae.terraria.modele.Environment;
 import fr.sae.terraria.modele.TileMaps;
 import fr.sae.terraria.modele.entities.entity.*;
+import fr.sae.terraria.modele.entities.items.Item;
 import fr.sae.terraria.modele.entities.player.inventory.Inventory;
 import fr.sae.terraria.modele.entities.player.inventory.Stack;
 import fr.sae.terraria.vue.View;
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
index 76f4575..74714cb 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
@@ -1,10 +1,12 @@
 package fr.sae.terraria.modele.entities.player.inventory;
 
 import fr.sae.terraria.modele.entities.entity.StowableObjectType;
+import fr.sae.terraria.modele.entities.items.Item;
 import fr.sae.terraria.modele.entities.player.Player;
 import javafx.beans.property.IntegerProperty;
 import javafx.beans.property.SimpleIntegerProperty;
 import javafx.collections.FXCollections;
+import javafx.collections.ListChangeListener;
 import javafx.collections.ObservableList;
 import javafx.scene.input.KeyCode;
 
diff --git a/src/main/resources/fr/sae/terraria/sound/hit.wav b/src/main/resources/fr/sae/terraria/sound/hit.wav
new file mode 100644
index 0000000000000000000000000000000000000000..8b0a14f6689afe0a34a95fc329cccd6b7fefd6b0
GIT binary patch
literal 82240
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
I(PFXx1+KZ4GXMYp

literal 0
HcmV?d00001


From c9ddd6d5c29aee37f2955bbfad54871be1f6af4c Mon Sep 17 00:00:00 2001
From: theblackreaper <abouche0603@gmail.com>
Date: Fri, 17 Jun 2022 10:59:58 +0200
Subject: [PATCH 94/97] =?UTF-8?q?les=20slimes=20infligent=20des=20d=C3=A9g?=
 =?UTF-8?q?ats=20au=20joueur?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/main/java/fr/sae/terraria/Terraria.java              | 3 +++
 src/main/java/fr/sae/terraria/modele/entities/Slime.java | 9 +++++++++
 .../fr/sae/terraria/modele/entities/player/Player.java   | 9 ++++++++-
 .../fr/sae/terraria/modele/entities/tools/ToolSet.java   | 2 +-
 4 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/Terraria.java b/src/main/java/fr/sae/terraria/Terraria.java
index d94ea92..e7bd61d 100644
--- a/src/main/java/fr/sae/terraria/Terraria.java
+++ b/src/main/java/fr/sae/terraria/Terraria.java
@@ -98,6 +98,9 @@ public void start(Stage stage) throws IOException
         stage.heightProperty().addListener((obs, oldV, newV) -> {
             gameController.scaleMultiplicatorHeight = ((newV.intValue()-gameController.title.getPrefHeight()) / Terraria.DISPLAY_RENDERING_HEIGHT);
         });
+        gameController.environment.getPlayer().pvProperty().addListener((obs, oldV, newV) ->{
+
+        });
 
         stage.show();
     }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/Slime.java b/src/main/java/fr/sae/terraria/modele/entities/Slime.java
index 241fa32..f3f046c 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/Slime.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/Slime.java
@@ -13,6 +13,7 @@ public class Slime extends EntityMovable implements CollideObjectType, Collapsib
 {
     public static final int WHEN_SPAWN_A_SLIME = 2_500;
     public static final double SLIME_SPAWN_RATE = .2;
+    public static final int TIME_BEFORE_HITTING_AGAIN_THE_PLAYER = 100;
 
 
     public Slime(Environment environment, int x, int y)
@@ -63,6 +64,14 @@ else if (environment.getPlayer().getX() < this.x.getValue())
         if (!whereCollide.isEmpty())
             if (whereCollide.get("left").equals(Boolean.TRUE) || whereCollide.get("right").equals(Boolean.TRUE))
                 this.idleOnX();
+            if (environment.getPlayer().getRect().collideRect(this.getRect()) && !environment.getPlayer().getHit()){
+                environment.getPlayer().setHit(true);
+                environment.getPlayer().setPv(environment.getPlayer().getPv() -1 );
+                environment.getPlayer().setInvicibilityFrame(this.environment.getTicks());
+            }
+            if (environment.getPlayer().getHit() &&  this.environment.getTicks() - environment.getPlayer().getInvicibilityFrame() == TIME_BEFORE_HITTING_AGAIN_THE_PLAYER){
+                environment.getPlayer().setHit(false);
+            }
     }
 
     @Override public void move()
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
index 8343386..0701a27 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
@@ -23,6 +23,8 @@ public class Player extends EntityMovable implements CollideObjectType, Collapsi
 
     private final EnumMap<KeyCode, Boolean> keysInput;
     private final EnumMap<MouseButton, Boolean> mouseInput;
+    private Boolean hit;
+    private int invicibilityFrame;
 
     private final SimpleBooleanProperty drunk;
 
@@ -33,7 +35,8 @@ public class Player extends EntityMovable implements CollideObjectType, Collapsi
     public Player(final Environment environment)
     {
         super(environment, 0, 0);
-
+        this.invicibilityFrame = 0;
+        this.hit = false;
         this.drunk = new SimpleBooleanProperty(false);
         this.inventory = new Inventory(this);
 
@@ -167,6 +170,10 @@ else if (key == KeyCode.Q)
     public Map<KeyCode, Boolean> getKeysInput() { return this.keysInput; }
     public Stack getStackSelected() { return this.stackSelected; }
     public Inventory getInventory() { return this.inventory; }
+    public Boolean getHit() { return hit; }
+    public void setHit(Boolean hit) { this.hit = hit; }
+    public int getInvicibilityFrame() { return invicibilityFrame; }
+    public void setInvicibilityFrame(int ticks2) { this.invicibilityFrame = ticks2; }
 
     public void setStackSelected(Stack stackSelected) { this.stackSelected = stackSelected; }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/tools/ToolSet.java b/src/main/java/fr/sae/terraria/modele/entities/tools/ToolSet.java
index 4557712..93a14b9 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/tools/ToolSet.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/tools/ToolSet.java
@@ -8,4 +8,4 @@ public enum ToolSet
     PICKAXE,
     SWORD,
     ARROW
-}
+}
\ No newline at end of file

From 395e471171490f0086db0cbdc54fce35f6ae9ef5 Mon Sep 17 00:00:00 2001
From: theblackreaper <abouche0603@gmail.com>
Date: Fri, 17 Jun 2022 11:38:33 +0200
Subject: [PATCH 95/97] fix health bar

---
 src/main/java/fr/sae/terraria/Terraria.java            |  4 +++-
 .../java/fr/sae/terraria/modele/entities/Slime.java    |  8 ++++----
 .../fr/sae/terraria/modele/entities/entity/Entity.java |  2 +-
 .../fr/sae/terraria/modele/entities/player/Player.java |  9 +++++----
 .../java/fr/sae/terraria/vue/hud/HealthBarView.java    | 10 ++++++++--
 5 files changed, 21 insertions(+), 12 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/Terraria.java b/src/main/java/fr/sae/terraria/Terraria.java
index e7bd61d..7457810 100644
--- a/src/main/java/fr/sae/terraria/Terraria.java
+++ b/src/main/java/fr/sae/terraria/Terraria.java
@@ -99,7 +99,9 @@ public void start(Stage stage) throws IOException
             gameController.scaleMultiplicatorHeight = ((newV.intValue()-gameController.title.getPrefHeight()) / Terraria.DISPLAY_RENDERING_HEIGHT);
         });
         gameController.environment.getPlayer().pvProperty().addListener((obs, oldV, newV) ->{
-
+            if (newV.longValue() == 0){
+                stage.close();
+            }
         });
 
         stage.show();
diff --git a/src/main/java/fr/sae/terraria/modele/entities/Slime.java b/src/main/java/fr/sae/terraria/modele/entities/Slime.java
index f3f046c..4864112 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/Slime.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/Slime.java
@@ -64,14 +64,14 @@ else if (environment.getPlayer().getX() < this.x.getValue())
         if (!whereCollide.isEmpty())
             if (whereCollide.get("left").equals(Boolean.TRUE) || whereCollide.get("right").equals(Boolean.TRUE))
                 this.idleOnX();
+
             if (environment.getPlayer().getRect().collideRect(this.getRect()) && !environment.getPlayer().getHit()){
-                environment.getPlayer().setHit(true);
-                environment.getPlayer().setPv(environment.getPlayer().getPv() -1 );
+                environment.getPlayer().hit();
                 environment.getPlayer().setInvicibilityFrame(this.environment.getTicks());
             }
-            if (environment.getPlayer().getHit() &&  this.environment.getTicks() - environment.getPlayer().getInvicibilityFrame() == TIME_BEFORE_HITTING_AGAIN_THE_PLAYER){
+
+            if (environment.getPlayer().getHit() &&  this.environment.getTicks() - environment.getPlayer().getInvicibilityFrame() == TIME_BEFORE_HITTING_AGAIN_THE_PLAYER)
                 environment.getPlayer().setHit(false);
-            }
     }
 
     @Override public void move()
diff --git a/src/main/java/fr/sae/terraria/modele/entities/entity/Entity.java b/src/main/java/fr/sae/terraria/modele/entities/entity/Entity.java
index 77633cf..272702a 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/entity/Entity.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/entity/Entity.java
@@ -68,7 +68,7 @@ protected Entity(int x, int y)
 
     public Animation getAnimation() { return this.animation; }
     public Rect getRect() { return this.rect; }
-    public double getPvMax() { return this.pv.get(); }
+    public double getPvMax() { return this.pvMax; }
     public double getPv() { return this.pv.get(); }
     public double getX() { return this.x.get(); }
     public double getY() { return this.y.get(); }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
index 6a9dcf1..c476ec3 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
@@ -85,7 +85,8 @@ public Player(final Environment environment)
 
     @Override public void hit()
     {
-        this.setPv(this.getPv() - 1);
+        this.pv.set(this.getPv() - 1);
+        this.hit = true;
     }
 
     @Override public void spawn(int x, int y)
@@ -171,10 +172,10 @@ else if (key == KeyCode.Q)
     public Map<KeyCode, Boolean> getKeysInput() { return this.keysInput; }
     public Stack getStackSelected() { return this.stackSelected; }
     public Inventory getInventory() { return this.inventory; }
-    public Boolean getHit() { return hit; }
-    public void setHit(Boolean hit) { this.hit = hit; }
+    public boolean getHit() { return this.hit; }
     public int getInvicibilityFrame() { return invicibilityFrame; }
-    public void setInvicibilityFrame(int ticks2) { this.invicibilityFrame = ticks2; }
 
     public void setStackSelected(Stack stackSelected) { this.stackSelected = stackSelected; }
+    public void setHit(boolean b) { this.hit = b; }
+    public void setInvicibilityFrame(int ticks2) { this.invicibilityFrame = ticks2; }
 }
diff --git a/src/main/java/fr/sae/terraria/vue/hud/HealthBarView.java b/src/main/java/fr/sae/terraria/vue/hud/HealthBarView.java
index 4d41b99..287d219 100644
--- a/src/main/java/fr/sae/terraria/vue/hud/HealthBarView.java
+++ b/src/main/java/fr/sae/terraria/vue/hud/HealthBarView.java
@@ -45,9 +45,15 @@ private void displayHealthBar(double inventoryBarX, double inventoryBarY)
 
         // Modifie le cœur selon la vie du joueur
         player.pvProperty().addListener((obs, oldPv, newPv) -> {
-            if (oldPv.intValue() >= 0) {
-                ImageView healthView = healths[oldPv.intValue()-1];
+            ImageView healthView;
+            if (newPv.intValue() > oldPv.intValue()) {
+                healthView = healths[newPv.intValue()-1];
+                Rectangle2D viewPort = new Rectangle2D((healthView.getImage().getWidth()/3)*2, 0, (healthView.getImage().getWidth()/3), healthView.getImage().getHeight());
+                healthView.setViewport(viewPort);
+            }
 
+            if (newPv.intValue() < oldPv.intValue()) {
+                healthView = healths[oldPv.intValue()-1];
                 Rectangle2D viewPort = new Rectangle2D((healthView.getImage().getWidth()/3)*0, 0, (healthView.getImage().getWidth()/3), healthView.getImage().getHeight());
                 healthView.setViewport(viewPort);
             }

From 1c5cc1b0000654d12025de30440511dfbd42ee71 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Fri, 17 Jun 2022 11:50:09 +0200
Subject: [PATCH 96/97] Fix meat ne veux pas se supprimer

---
 .../java/fr/sae/terraria/modele/entities/items/Item.java   | 4 +++-
 .../java/fr/sae/terraria/modele/entities/items/Meat.java   | 7 ++++++-
 2 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/modele/entities/items/Item.java b/src/main/java/fr/sae/terraria/modele/entities/items/Item.java
index 3ef05a0..8ca86e9 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/items/Item.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/items/Item.java
@@ -11,7 +11,8 @@ public enum Item implements StowableObjectType
     SILEX,
     STONE,
     WOOD,
-    STICK;
+    STICK,
+    MEAT;
 
 
     public static boolean isCoal(StowableObjectType obj) { return obj == Item.COAL; }
@@ -21,4 +22,5 @@ public enum Item implements StowableObjectType
     public static boolean isSilex(StowableObjectType obj) { return obj == Item.SILEX; }
     public static boolean isWood(StowableObjectType obj) { return obj == Item.WOOD; }
     public static boolean isStick(StowableObjectType obj) { return obj == Item.STICK; }
+    public static boolean isMeat(StowableObjectType obj) { return obj == Item.MEAT; }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/items/Meat.java b/src/main/java/fr/sae/terraria/modele/entities/items/Meat.java
index 37d8772..e632d8d 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/items/Meat.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/items/Meat.java
@@ -4,6 +4,8 @@
 import fr.sae.terraria.modele.entities.entity.ConsumableObjectType;
 import fr.sae.terraria.modele.entities.entity.StowableObjectType;
 import fr.sae.terraria.modele.entities.player.Player;
+import fr.sae.terraria.modele.entities.player.inventory.Inventory;
+import fr.sae.terraria.modele.entities.player.inventory.Stack;
 
 
 public class Meat implements ConsumableObjectType, StowableObjectType
@@ -21,8 +23,11 @@ public Meat(final Environment environment)
     {
         Environment.playSound("sound/eat.wav", false);
 
-        Player player = environment.getPlayer();
+        Player player = this.environment.getPlayer();
         if (player.getPv() < player.getPvMax())
             player.setPv(player.getPv() + 1);
+
+        Inventory inventory = player.getInventory();
+        inventory.get().get(inventory.getPosCursor()).remove();
     }
 }

From 089f86527de2d32fd4e6c7128db00969168b5d50 Mon Sep 17 00:00:00 2001
From: NaulaN <nonochrzaszcz@gmail.com>
Date: Fri, 17 Jun 2022 12:07:25 +0200
Subject: [PATCH 97/97] =?UTF-8?q?Ajout=20de=20l'animation=20d'invincibilit?=
 =?UTF-8?q?=C3=A9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../sae/terraria/modele/entities/Slime.java   |  6 ++---
 .../terraria/modele/entities/items/Meat.java  |  1 -
 .../modele/entities/player/Player.java        | 27 ++++++++++---------
 .../entities/player/inventory/Inventory.java  |  2 --
 .../sae/terraria/vue/entities/PlayerView.java | 20 ++++++++++++++
 5 files changed, 38 insertions(+), 18 deletions(-)

diff --git a/src/main/java/fr/sae/terraria/modele/entities/Slime.java b/src/main/java/fr/sae/terraria/modele/entities/Slime.java
index 4864112..c2318be 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/Slime.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/Slime.java
@@ -2,6 +2,7 @@
 
 import fr.sae.terraria.modele.Environment;
 import fr.sae.terraria.modele.entities.entity.*;
+import fr.sae.terraria.modele.entities.player.Player;
 import fr.sae.terraria.modele.entities.player.inventory.Stack;
 import fr.sae.terraria.modele.entities.tools.Tool;
 
@@ -13,7 +14,6 @@ public class Slime extends EntityMovable implements CollideObjectType, Collapsib
 {
     public static final int WHEN_SPAWN_A_SLIME = 2_500;
     public static final double SLIME_SPAWN_RATE = .2;
-    public static final int TIME_BEFORE_HITTING_AGAIN_THE_PLAYER = 100;
 
 
     public Slime(Environment environment, int x, int y)
@@ -67,10 +67,10 @@ else if (environment.getPlayer().getX() < this.x.getValue())
 
             if (environment.getPlayer().getRect().collideRect(this.getRect()) && !environment.getPlayer().getHit()){
                 environment.getPlayer().hit();
-                environment.getPlayer().setInvicibilityFrame(this.environment.getTicks());
+                environment.getPlayer().setInvisibilityFrame(this.environment.getTicks());
             }
 
-            if (environment.getPlayer().getHit() &&  this.environment.getTicks() - environment.getPlayer().getInvicibilityFrame() == TIME_BEFORE_HITTING_AGAIN_THE_PLAYER)
+            if (environment.getPlayer().getHit() &&  this.environment.getTicks() - environment.getPlayer().getInvisibilityFrame() == Player.TIME_BEFORE_HITTING_AGAIN_THE_PLAYER)
                 environment.getPlayer().setHit(false);
     }
 
diff --git a/src/main/java/fr/sae/terraria/modele/entities/items/Meat.java b/src/main/java/fr/sae/terraria/modele/entities/items/Meat.java
index e632d8d..d5e8e8f 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/items/Meat.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/items/Meat.java
@@ -5,7 +5,6 @@
 import fr.sae.terraria.modele.entities.entity.StowableObjectType;
 import fr.sae.terraria.modele.entities.player.Player;
 import fr.sae.terraria.modele.entities.player.inventory.Inventory;
-import fr.sae.terraria.modele.entities.player.inventory.Stack;
 
 
 public class Meat implements ConsumableObjectType, StowableObjectType
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
index c476ec3..4006313 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/Player.java
@@ -3,10 +3,10 @@
 import fr.sae.terraria.modele.Environment;
 import fr.sae.terraria.modele.TileMaps;
 import fr.sae.terraria.modele.entities.entity.*;
-import fr.sae.terraria.modele.entities.items.Item;
 import fr.sae.terraria.modele.entities.player.inventory.Inventory;
 import fr.sae.terraria.modele.entities.player.inventory.Stack;
 import fr.sae.terraria.vue.View;
+import javafx.beans.property.BooleanProperty;
 import javafx.beans.property.SimpleBooleanProperty;
 import javafx.geometry.Rectangle2D;
 import javafx.scene.image.Image;
@@ -20,24 +20,26 @@
 
 public class Player extends EntityMovable implements CollideObjectType, CollapsibleObjectType, SpawnableObjectType
 {
+    public static final int TIME_BEFORE_HITTING_AGAIN_THE_PLAYER = 100;
     public static final int BREAK_BLOCK_DISTANCE = 1;
 
     private final EnumMap<KeyCode, Boolean> keysInput;
     private final EnumMap<MouseButton, Boolean> mouseInput;
-    private Boolean hit;
-    private int invicibilityFrame;
 
-    private final SimpleBooleanProperty drunk;
+    private final BooleanProperty drunk;
+    private final BooleanProperty hit;
 
     private final Inventory inventory;
     private Stack stackSelected;
 
+    private int invisibilityFrame;
+
 
     public Player(final Environment environment)
     {
         super(environment, 0, 0);
-        this.invicibilityFrame = 0;
-        this.hit = false;
+        this.invisibilityFrame = 0;
+        this.hit = new SimpleBooleanProperty(false);
         this.drunk = new SimpleBooleanProperty(false);
         this.inventory = new Inventory(this);
 
@@ -86,7 +88,7 @@ public Player(final Environment environment)
     @Override public void hit()
     {
         this.pv.set(this.getPv() - 1);
-        this.hit = true;
+        this.hit.set(true);
     }
 
     @Override public void spawn(int x, int y)
@@ -165,17 +167,18 @@ else if (key == KeyCode.Q)
 
     public void pickup(StowableObjectType pickupObj) { if (!Objects.isNull(pickupObj)) this.inventory.put(pickupObj); }
 
-    public SimpleBooleanProperty drunkProperty() { return drunk; }
+    public BooleanProperty drunkProperty() { return this.drunk; }
+    public BooleanProperty hitProperty() { return this.hit; }
 
 
     public Map<MouseButton, Boolean> getMouseInput() { return this.mouseInput; }
     public Map<KeyCode, Boolean> getKeysInput() { return this.keysInput; }
     public Stack getStackSelected() { return this.stackSelected; }
     public Inventory getInventory() { return this.inventory; }
-    public boolean getHit() { return this.hit; }
-    public int getInvicibilityFrame() { return invicibilityFrame; }
+    public boolean getHit() { return this.hit.get(); }
+    public int getInvisibilityFrame() { return invisibilityFrame; }
 
     public void setStackSelected(Stack stackSelected) { this.stackSelected = stackSelected; }
-    public void setHit(boolean b) { this.hit = b; }
-    public void setInvicibilityFrame(int ticks2) { this.invicibilityFrame = ticks2; }
+    public void setHit(boolean b) { this.hit.set(b); }
+    public void setInvisibilityFrame(int ticks2) { this.invisibilityFrame = ticks2; }
 }
diff --git a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
index 74714cb..76f4575 100644
--- a/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
+++ b/src/main/java/fr/sae/terraria/modele/entities/player/inventory/Inventory.java
@@ -1,12 +1,10 @@
 package fr.sae.terraria.modele.entities.player.inventory;
 
 import fr.sae.terraria.modele.entities.entity.StowableObjectType;
-import fr.sae.terraria.modele.entities.items.Item;
 import fr.sae.terraria.modele.entities.player.Player;
 import javafx.beans.property.IntegerProperty;
 import javafx.beans.property.SimpleIntegerProperty;
 import javafx.collections.FXCollections;
-import javafx.collections.ListChangeListener;
 import javafx.collections.ObservableList;
 import javafx.scene.input.KeyCode;
 
diff --git a/src/main/java/fr/sae/terraria/vue/entities/PlayerView.java b/src/main/java/fr/sae/terraria/vue/entities/PlayerView.java
index 8b2692a..82187d1 100644
--- a/src/main/java/fr/sae/terraria/vue/entities/PlayerView.java
+++ b/src/main/java/fr/sae/terraria/vue/entities/PlayerView.java
@@ -1,9 +1,13 @@
 package fr.sae.terraria.vue.entities;
 
+import fr.sae.terraria.Terraria;
 import fr.sae.terraria.modele.entities.player.Player;
 import fr.sae.terraria.vue.View;
+import javafx.animation.KeyFrame;
+import javafx.animation.Timeline;
 import javafx.geometry.Rectangle2D;
 import javafx.scene.image.Image;
+import javafx.util.Duration;
 
 
 public class PlayerView extends EntityView
@@ -27,6 +31,22 @@ public PlayerView(final Player player, double scaleMultiplicatorWidth, double sc
 
         this.widthPlayer = (int) this.playerIdleImg.getWidth();
         this.heightPlayer = (int) this.playerIdleImg.getHeight();
+
+        boolean[] visible = new boolean[] {true};
+        player.hitProperty().addListener((obs, oldBool, newBool) -> {
+            if (newBool.booleanValue()) {
+                Timeline timeLine = new Timeline();
+                timeLine.setCycleCount(8);
+
+                KeyFrame key = new KeyFrame(Duration.seconds((Player.TIME_BEFORE_HITTING_AGAIN_THE_PLAYER * Terraria.TARGET_FPS)/8), b -> {
+                    visible[0] = !visible[0];
+                    this.imgView.setVisible(visible[0]);
+                });
+
+                timeLine.getKeyFrames().add(key);
+                timeLine.play();
+            }
+        });
     }
 
     @Override protected void animation(int frame)