diff --git a/MavenChess/.idea/artifacts/MavenChess_jar.xml b/MavenChess/.idea/artifacts/MavenChess_jar.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ce7827de277a9126da9578219abff93ea342729e
--- /dev/null
+++ b/MavenChess/.idea/artifacts/MavenChess_jar.xml
@@ -0,0 +1,16 @@
+<component name="ArtifactManager">
+  <artifact type="jar" build-on-make="true" name="MavenChess:jar">
+    <output-path>$PROJECT_DIR$/out/artifacts/MavenChess_jar</output-path>
+    <root id="archive" name="MavenChess.jar">
+      <element id="module-output" name="MavenChess" />
+      <element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/openjfx/javafx-graphics/18.0.2/javafx-graphics-18.0.2-win.jar" path-in-jar="/" />
+      <element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/openjfx/javafx-graphics/18.0.2/javafx-graphics-18.0.2.jar" path-in-jar="/" />
+      <element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/openjfx/javafx-base/18.0.2/javafx-base-18.0.2-win.jar" path-in-jar="/" />
+      <element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/openjfx/javafx-controls/18.0.2/javafx-controls-18.0.2-win.jar" path-in-jar="/" />
+      <element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/openjfx/javafx-controls/18.0.2/javafx-controls-18.0.2.jar" path-in-jar="/" />
+      <element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/openjfx/javafx-fxml/18.0.2/javafx-fxml-18.0.2.jar" path-in-jar="/" />
+      <element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/openjfx/javafx-base/18.0.2/javafx-base-18.0.2.jar" path-in-jar="/" />
+      <element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/openjfx/javafx-fxml/18.0.2/javafx-fxml-18.0.2-win.jar" path-in-jar="/" />
+    </root>
+  </artifact>
+</component>
\ No newline at end of file
diff --git a/MavenChess/MavenChess/pom.xml b/MavenChess/MavenChess/pom.xml
index b71d464b6da0f270d46ba9157f31c686480f95bd..bbc59d135b7873223aa3565ce84e7c4c6eee67e3 100644
--- a/MavenChess/MavenChess/pom.xml
+++ b/MavenChess/MavenChess/pom.xml
@@ -51,6 +51,18 @@
                     <target>18</target>
                 </configuration>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <version>3.3.0</version>
+                <configuration>
+                    <archive>
+                        <manifest>
+                            <mainClass>controller.Main</mainClass>
+                        </manifest>
+                    </archive>
+                </configuration>
+            </plugin>
             <plugin>
                 <groupId>org.openjfx</groupId>
                 <artifactId>javafx-maven-plugin</artifactId>
diff --git a/MavenChess/MavenChess/src/main/java/controller/Game.java b/MavenChess/MavenChess/src/main/java/controller/Game.java
index 93f916bbd0790f6df1b0a8c7618fdfd93097d5d5..e1c8ff888e505a438e85bbe7b87bc7d5a716f6d8 100644
--- a/MavenChess/MavenChess/src/main/java/controller/Game.java
+++ b/MavenChess/MavenChess/src/main/java/controller/Game.java
@@ -1,5 +1,6 @@
 package controller;
 
+import javafx.scene.layout.AnchorPane;
 import model.*;
 import view.*;
 
@@ -42,8 +43,9 @@ public class Game {
             setStatus(WHITE_TURN);
     }
 
-    public void clickPiece(PieceView clickedPiece, Board board, BoardView boardView, CustomMaterial material, Custom3dModel model, Log log, HUD hud) {
+    public void clickPiece(PieceView clickedPiece, Board board, BoardView boardView, CustomMaterial material, Custom3dModel model, Log log, HUD hud, AnchorPane group2d) {
 
+        hud.removeCombo(group2d);
         // graveyard pieces should not do anything
         if(clickedPiece.getPosition().getX() < 0) {
             return;
@@ -100,18 +102,28 @@ public class Game {
                 // PROMOTION (attacking or not)
                 if ((board.isPawn(position)) && (move.getY() == 8 || move.getY() == 1)) {
                     boardView.setColor(material, move, CustomMaterial.SPECIAL_TILE);
+                    hud.addCombo(group2d);
                 }
             }
 
             // Prevent available moves that let the king in check state
             ArrayList<Position> toPrevent = new ArrayList<>();
             for (Position move : moves) {
-                boolean selfCheck = applyMoveAndCheckVerification(board, boardView, getStatus(), move);
+                boolean selfCheck = applyMoveAndCheckVerification(board, boardView, move, board.getSelected());
                 if(selfCheck) {
                     toPrevent.add(move); // Prevents the move
                 }
             }
             for (Position elem : toPrevent) {
+                // clean en passant (there is two tiles on screen visually)
+                if(boardView.getTile(elem.getID()).getState() == TileView.SPECIAL) {
+                    if(board.isPawn(clickedPiece.getPosition())) {
+                        if (elem.getY() != 8 && elem.getY() != 1) {
+                            boardView.resetTileColor(material, new Position(elem.getX(), clickedPiece.getPosition().getY()));
+                        }
+                    }
+                }
+                // clean tile
                 boardView.resetTileColor(material, elem);
             }
         }
@@ -149,8 +161,22 @@ public class Game {
                             boardView.killPiece(arrival); // place piece on graveyard (visual)
                         }
                         // Promotion to Queen (by default, Queen for now)
-                        board.mutationOfSelectedPiece(Board.QUEEN); // (on model)
-                        boardView.mutationPiece(model, selected, Custom3dModel.QUEEN); // (on view)
+                        int comboID = hud.getComboID();
+                        int pieceType, modelType;
+                        switch(comboID) {
+                            case 0 -> pieceType = Board.QUEEN;
+                            case 1 -> pieceType = Board.ROOK;
+                            case 2 -> pieceType = Board.BISHOP;
+                            default -> pieceType = Board.KNIGHT;
+                        }
+                        switch(comboID) {
+                            case 0 -> modelType = Custom3dModel.QUEEN;
+                            case 1 -> modelType = Custom3dModel.ROOK;
+                            case 2 -> modelType = Custom3dModel.BISHOP;
+                            default -> modelType = Custom3dModel.KNIGHT;
+                        }
+                        board.mutationOfSelectedPiece(pieceType); // (on model)
+                        boardView.mutationPiece(model, selected, modelType); // (on view)
                         // --- MOVE (while doing promotion)  ---
                         board.movePiece(selected, arrival); // move piece (on model)
                         boardView.movePiece(selected, arrival); // move piece (on 3d view)
@@ -259,21 +285,43 @@ public class Game {
             hud.rollbackShow(); // show rollback button (if not showed already)
 
             // signals if there is a check !
-            boolean echec = checkVerification(board, getStatus()); // test the opponent check (turn just changed)
+            boolean echec = checkVerification(board); // test the opponent check (turn just changed)
             if(echec) {
                 if (isWhiteTurn()) {
-                    System.out.println("echec white");
+                    System.out.println("echec");
                 }
                 if (isBlackTurn()) {
-                    System.out.println("echec black");
+                    System.out.println("echec");
+                }
+
+                // signals if there is a checkmate !
+                boolean canPreventMate = false;
+                for (int i = 0 ; i < 64 && !canPreventMate ; i++) {
+                    Piece p = board.getPiece(i);
+                    if(p != null) {
+                        if (p.isWhite() && isWhiteTurn() || p.isBlack() && isBlackTurn()) {
+                            canPreventMate = canPreventMate(p.getPosition(), board, boardView, material);
+                        }
+                    }
+                }
+
+                // checkmate !!!
+                if(!canPreventMate) {
+                    if (isWhiteTurn()) {
+
+                    }
+                    if (isBlackTurn()) {
+
+                    }
                 }
             }
         }
     }
 
-    public boolean checkVerification(Board board, int color){
+    public boolean checkVerification(Board board){
+        int color = getStatus();
         boolean isCheck = false;
-        for (int i = 0 ; i < 64 ; i++){
+        for (int i = 0 ; i < 64 ; i++) {
             Piece p = board.getPiece(i);
             if(p != null && p.getColor() != color) {
                 // get all moves
@@ -294,18 +342,16 @@ public class Game {
         return isCheck;
     }
 
-    public boolean applyMoveAndCheckVerification(Board originalBoard, BoardView boardView, int color, Position emulatedMove) {
+    public boolean applyMoveAndCheckVerification(Board originalBoard, BoardView boardView, Position arrival, Position selected) {
 
         Board board = originalBoard.newInstanceCopy(); // create a copy, to do tests on it
-        board.setSelected(originalBoard.getSelected());
-        TileView clickedTile = boardView.getTile(emulatedMove.getID());
+        board.setSelected(selected);
+        TileView clickedTile = boardView.getTile(arrival.getID());
 
         // --- EMULATES THE MOVEMENT -----------------------------------------------
 
         // --- Analyses the clicked tile type, and executes related actions ---
         int state = clickedTile.getState();
-        Position selected = board.getSelected();
-        Position arrival = clickedTile.getPosition();
         if(state != TileView.NORMAL && state != TileView.SELECTED) {
             // --- Resets enPassant ---
             for(int j = 1 ; j <= 8 ; j++) {
@@ -396,6 +442,65 @@ public class Game {
         }
         // --- END OF EMULATION -------------------------------------------------
 
-        return checkVerification(board, color); // we test the board after emulating a move
+        return checkVerification(board); // we test the board after emulating a move
+    }
+
+    public boolean canPreventMate(Position emulatedClick, Board board, BoardView boardView, CustomMaterial material) {
+
+        boardView.resetTileColorAll(material);
+
+        // Movements
+        ArrayList<Position> moves = board.getPiece(emulatedClick).getAvailableMoves(board);
+
+        // Explosion movements added
+        if (board.isKamikaze(emulatedClick)) {
+            moves.addAll(((Kamikaze) board.getPiece(emulatedClick)).getExplosion());
+        }
+
+        // Prevent available moves that let the king in check state
+        ArrayList<Position> toPrevent = new ArrayList<>();
+        for (Position move : moves) {
+            if (board.isFree(move)) {
+                boardView.setColor(material, move, CustomMaterial.MOVABLE_TILE);
+                // test for "en passant"
+                if (board.isPawn(emulatedClick)) {
+                    Position enemy = new Position(move.getX(), emulatedClick.getY());
+                    boolean isEnPassant = false;
+                    if (board.isEnemy(enemy, emulatedClick) && board.isPawn(enemy)) {
+                        if (((Pawn) board.getPiece(enemy)).isEnPassant()) {
+                            isEnPassant = true;
+                        }
+                    }
+                    if (isEnPassant) {
+                        boardView.setColor(material, move, CustomMaterial.SPECIAL_TILE);
+                        boardView.setColor(material, enemy, CustomMaterial.SPECIAL_TILE);
+                        boardView.getPiece(enemy.getID()).setTargeted(material, CustomMaterial.ATTACK_TILE);
+                    }
+                }
+            } else if (board.isEnemy(move, emulatedClick)) {
+                boardView.setColor(material, move, CustomMaterial.ATTACK_TILE);
+                boardView.getPiece(move.getID()).setTargeted(material, CustomMaterial.ATTACK_TILE);
+            } else {
+                boardView.setColor(material, move, CustomMaterial.SPECIAL_TILE); // any special move
+                boardView.getPiece(move.getID()).setTargeted(material, CustomMaterial.SPECIAL_TILE);
+            }
+            // PROMOTION (attacking or not)
+            if ((board.isPawn(emulatedClick)) && (move.getY() == 8 || move.getY() == 1)) {
+                boardView.setColor(material, move, CustomMaterial.SPECIAL_TILE);
+            }
+            boolean selfCheck = applyMoveAndCheckVerification(board, boardView, move, emulatedClick);
+            boardView.resetTileColorAll(material);
+
+            if(selfCheck) {
+                toPrevent.add(move); // Prevents the move
+            }
+        }
+
+        boolean canPreventMate = true;
+        if(moves.size() == toPrevent.size()) {
+            canPreventMate = false;
+        }
+
+        return canPreventMate;
     }
 }
diff --git a/MavenChess/MavenChess/src/main/java/controller/Log.java b/MavenChess/MavenChess/src/main/java/controller/Log.java
index c4c240b6bc8c0f871287cc17b29e70d61b91a12b..a95f56cd9e91effc8bd527523badf53f8ed050e4 100644
--- a/MavenChess/MavenChess/src/main/java/controller/Log.java
+++ b/MavenChess/MavenChess/src/main/java/controller/Log.java
@@ -2,15 +2,16 @@ package controller;
 
 import javafx.scene.Group;
 import javafx.scene.input.MouseEvent;
+import javafx.scene.layout.AnchorPane;
 import model.*;
 import view.*;
 
 import java.util.ArrayList;
 
 public class Log {
-	// contains dynamic array of board, to be able to ctrl-Z equivalent
+    // contains dynamic array of board, to be able to ctrl-Z equivalent
     ArrayList<Piece[]> logPieces;
-    ArrayList<PieceView[]> logWhiteGraveyard, logBlackGraveyard;
+    ArrayList<Integer> logWhiteGraveyard, logBlackGraveyard; // number is enough, graveyard pieces are never moved once placed there
 
     public Log() {
         logPieces = new ArrayList<>();
@@ -30,12 +31,11 @@ public class Log {
             white[n] = boardView.getWhiteGraveyard()[n];
             black[n] = boardView.getBlackGraveyard()[n];
         }
-        logWhiteGraveyard.add(id, white);
-        logBlackGraveyard.add(id, black);
-
+        logWhiteGraveyard.add(id, boardView.getWhite_death_count());
+        logBlackGraveyard.add(id, boardView.getBlack_death_count());
     }
 
-    public void rollback(Board board, BoardView boardView, CustomMaterial material, Custom3dModel model, Group group3d, Game game, HUD hud) {
+    public void rollback(Board board, BoardView boardView, CustomMaterial material, Custom3dModel model, Group group3d, Game game, HUD hud, AnchorPane group2d) {
         int id = logPieces.size() - 1;
         if(id > 0) {
             // rollback once
@@ -58,11 +58,17 @@ public class Log {
                     // add click-event to piece (visual)
                     PieceView pieceView = boardView.getPiece(p.getID());
                     pieceView.getObj().addEventHandler(MouseEvent.MOUSE_CLICKED, event ->
-                            game.clickPiece(pieceView, board, boardView, material, model, this, hud));
+                            game.clickPiece(pieceView, board, boardView, material, model, this, hud, group2d));
                 }
             }
             boardView.addPiecesOnlyToScene(group3d); // adds all the new 3d pieces to scene (visual)
             game.nextTurn(); // previous turn (same as next turn actually)
+            if(boardView.getWhite_death_count() > logWhiteGraveyard.get(id)) {
+                boardView.whiteGraveyardRemoveOne(group3d);
+            }
+            if(boardView.getBlack_death_count() > logBlackGraveyard.get(id)) {
+                boardView.blackGraveyardRemoveOne(group3d);
+            }
         }
         if(id == 0) { // if we are on first saving, we don't need to show rollback button anymore
             hud.rollbackHide();
diff --git a/MavenChess/MavenChess/src/main/java/controller/Main.java b/MavenChess/MavenChess/src/main/java/controller/Main.java
index 5b5e304b642778573176f4ec79b8cf28b671eff8..40ef9e4aa7288c2c70db707fe9c2d7ad0b70f213 100644
--- a/MavenChess/MavenChess/src/main/java/controller/Main.java
+++ b/MavenChess/MavenChess/src/main/java/controller/Main.java
@@ -99,7 +99,7 @@ public class Main extends Application {
 		for(int n = 0 ; n < 64 ; n++) {
 			PieceView piece = boardView.getPiece(n);
 			if(piece != null) {
-				piece.getObj().addEventHandler(MouseEvent.MOUSE_CLICKED, event -> game.clickPiece(piece, board, boardView, material, model, log, hud));
+				piece.getObj().addEventHandler(MouseEvent.MOUSE_CLICKED, event -> game.clickPiece(piece, board, boardView, material, model, log, hud, group2d));
 			}
 		}
 
@@ -134,7 +134,7 @@ public class Main extends Application {
 		// event - rollback
 		hud.getRollback().addEventHandler(MouseEvent.MOUSE_CLICKED, event -> {
 			boardView.resetTileColorAll(material);
-			log.rollback(board, boardView, material, model, group3d, game, hud);
+			log.rollback(board, boardView, material, model, group3d, game, hud, group2d);
 		});
 
 		// start --------------------------------------------------------------
diff --git a/MavenChess/MavenChess/src/main/java/model/King.java b/MavenChess/MavenChess/src/main/java/model/King.java
index 09a7c02661b91e4381b20ec2764efa2c94f28229..ce6fb0b22e7114df1d71f1fda1bc8a535b0295b3 100644
--- a/MavenChess/MavenChess/src/main/java/model/King.java
+++ b/MavenChess/MavenChess/src/main/java/model/King.java
@@ -88,7 +88,9 @@ public class King extends Piece {
 	}
 
 	public Piece newInstanceCopy() {
-		return new King(p, color);
+		King king = new King(p, color);
+		king.setHasBeenMoved(hasBeenMoved);
+		return king;
 	}
 }
 
diff --git a/MavenChess/MavenChess/src/main/java/model/Nwap.java b/MavenChess/MavenChess/src/main/java/model/Nwap.java
index f952b40e86108e9bcf9d35420de3008101e86015..1dc4ca6967ef78b2c055a338791fb7b89fe8bb70 100644
--- a/MavenChess/MavenChess/src/main/java/model/Nwap.java
+++ b/MavenChess/MavenChess/src/main/java/model/Nwap.java
@@ -88,6 +88,9 @@ public class Nwap extends Pawn {
     }
 
     public Piece newInstanceCopy() {
-        return new Nwap(p, color);
+        Nwap nwap = new Nwap(p, color);
+        nwap.setEnPassant(enPassant);
+        nwap.setHasBeenMoved(hasBeenMoved);
+        return nwap;
     }
 }
diff --git a/MavenChess/MavenChess/src/main/java/model/Pawn.java b/MavenChess/MavenChess/src/main/java/model/Pawn.java
index b8c0e20fca347eb41ef42531cb58b187fa9a7b5e..2e51565d37c5e07fabac3b7a30c66dac3cbbb004 100644
--- a/MavenChess/MavenChess/src/main/java/model/Pawn.java
+++ b/MavenChess/MavenChess/src/main/java/model/Pawn.java
@@ -103,7 +103,10 @@ public class Pawn extends Piece {
 	}
 
 	public Piece newInstanceCopy() {
-		return new Pawn(p, color);
+		Pawn pawn = new Pawn(p, color);
+		pawn.setEnPassant(enPassant);
+		pawn.setHasBeenMoved(hasBeenMoved);
+		return pawn;
 	}
 
 }
diff --git a/MavenChess/MavenChess/src/main/java/model/Piece.java b/MavenChess/MavenChess/src/main/java/model/Piece.java
index 4bfd041d960d6a3747ba879a7de18d46a551b2d1..64b6d13d47f010e9cc9b1ce75757d0ba6fbc6d75 100644
--- a/MavenChess/MavenChess/src/main/java/model/Piece.java
+++ b/MavenChess/MavenChess/src/main/java/model/Piece.java
@@ -41,6 +41,10 @@ public abstract class Piece {
 		return hasBeenMoved;
 	}
 
+	protected void setHasBeenMoved(boolean hasBeenMoved) { // only for childs for "newInstanceCopy"
+		this.hasBeenMoved = hasBeenMoved;
+	}
+
 	public void setPosition(Position p) {
 		this.p = new Position(p.getX(), p.getY()); // creates a new copy, to avoid using reference
 		hasBeenMoved = true;
diff --git a/MavenChess/MavenChess/src/main/java/model/Rook.java b/MavenChess/MavenChess/src/main/java/model/Rook.java
index 00237f3f1998a883e93cb7b8059407c13f2b5233..7de04c8a4fe9b9295f42e1f13bcde1511147e93a 100644
--- a/MavenChess/MavenChess/src/main/java/model/Rook.java
+++ b/MavenChess/MavenChess/src/main/java/model/Rook.java
@@ -112,6 +112,8 @@ public class Rook extends Piece {
     }
 
     public Piece newInstanceCopy() {
-        return new Rook(p, color);
+        Rook rook = new Rook(p, color);
+        rook.setHasBeenMoved(hasBeenMoved);
+        return rook;
     }
 }
diff --git a/MavenChess/MavenChess/src/main/java/view/BoardView.java b/MavenChess/MavenChess/src/main/java/view/BoardView.java
index 92feb3de0c00229ce135e549e7b6b34dbc206d1e..1c14ed52f697ca0dfbf40bb317e943b77ba8f9b5 100644
--- a/MavenChess/MavenChess/src/main/java/view/BoardView.java
+++ b/MavenChess/MavenChess/src/main/java/view/BoardView.java
@@ -12,6 +12,7 @@ public class BoardView {
 
 	private final TileView[] tiles; // contains all the squares/tiles of the board (visual)
 	private final PieceView[] pieces; // contains all the 3d pieces (visual)
+
 	private int black_death_count, white_death_count; // graveyard counter
 	private PieceView[] blackGraveyard, whiteGraveyard;
 
@@ -90,6 +91,15 @@ public class BoardView {
 		return blackGraveyard;
 	}
 
+	public int getBlack_death_count() {
+		return black_death_count;
+	}
+
+	public int getWhite_death_count() {
+		return white_death_count;
+	}
+
+
 	public void setPiece(PieceView piece) {
 		pieces[piece.getPosition().getID()] = piece;
 	}
@@ -177,6 +187,18 @@ public class BoardView {
 		piece.getObj().setTranslateY(GRAVEYARD_HEIGHT); // place at right height (Y axis) on table
 	}
 
+	public void whiteGraveyardRemoveOne(Group group) {
+		white_death_count--;
+		group.getChildren().remove(whiteGraveyard[white_death_count].getObj());
+		whiteGraveyard[white_death_count] = null;
+	}
+
+	public void blackGraveyardRemoveOne(Group group) {
+		black_death_count--;
+		group.getChildren().remove(blackGraveyard[black_death_count].getObj());
+		blackGraveyard[black_death_count] = null;
+	}
+
 	public void resetTileColorAll(CustomMaterial material) {
 		for(int n = 0, j = 1 ; j <= 8 ; j++) {
 			for (int i = 1; i <= 8; i++, n++) {
diff --git a/MavenChess/MavenChess/src/main/java/view/Custom3dModel.java b/MavenChess/MavenChess/src/main/java/view/Custom3dModel.java
index 107b9bd440a2bb9da1ae4a27e3b231e73f13a621..9a38c047d3b84926eb39c47f66e9a7eab7eb46e9 100644
--- a/MavenChess/MavenChess/src/main/java/view/Custom3dModel.java
+++ b/MavenChess/MavenChess/src/main/java/view/Custom3dModel.java
@@ -2,11 +2,13 @@ package view;
 
 import javafx.scene.shape.TriangleMesh;
 
-import java.io.File;
-import java.io.FileNotFoundException;
+import java.io.*;
 import java.net.URL;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
+import java.util.List;
 import java.util.Scanner;
+import java.util.stream.Collectors;
 
 public class Custom3dModel {
 
@@ -16,15 +18,15 @@ public class Custom3dModel {
 
 	public Custom3dModel() {
 		model = new TriangleMesh[10];
-		model[PAWN] = objImport("/pawn.obj");
-		model[ROOK] = objImport("/rook.obj");
-		model[KNIGHT] = objImport("/knight.obj");
-		model[BISHOP] = objImport("/bishop.obj");
-		model[QUEEN] = objImport("/queen.obj");
-		model[KING] = objImport("/king.obj");
-		model[NWAP] = objImport("/nwap.obj");
-		model[MAGICIAN] = objImport("/magician.obj");
-		model[GIANT] = objImport("/giant.obj");
+		model[PAWN] = objImport("pawn.obj");
+		model[ROOK] = objImport("rook.obj");
+		model[KNIGHT] = objImport("knight.obj");
+		model[BISHOP] = objImport("bishop.obj");
+		model[QUEEN] = objImport("queen.obj");
+		model[KING] = objImport("king.obj");
+		model[NWAP] = objImport("nwap.obj");
+		model[MAGICIAN] = objImport("magician.obj");
+		model[GIANT] = objImport("giant.obj");
 	}
 
 	public TriangleMesh get(int id) {
@@ -42,12 +44,15 @@ public class Custom3dModel {
 		mesh.getPoints().addAll(0,0,0); // adds a vertex 0 (because files .obj start from vertex 1)
 		float max = 0, y;
 		ArrayList<Float> vertexData = new ArrayList<>();
-		try {
-			URL url = this.getClass().getResource(filename);
-			File myObj = new File(url.getPath().replaceAll("%20", " "));
-			Scanner myReader = new Scanner(myObj);
-			while (myReader.hasNextLine()) {
-				String[] data = myReader.nextLine().split(" ");
+
+		//URL url = this.getClass().getResource(filename);
+		//File myObj = new File(url.getPath().replaceAll("%20", " "));
+		try (InputStream resource = Custom3dModel.class.getClassLoader().getResourceAsStream(filename)) {
+			List<String> lines = new BufferedReader(new InputStreamReader(resource, StandardCharsets.UTF_8)).lines().collect(Collectors.toList());
+			for (String line : lines) {
+				//Scanner myReader = new Scanner(myObj);
+				//while (myReader.hasNextLine()) {
+				String[] data = line.split(" "); //myReader.nextLine().split(" ");
 				if(data[0].equals("v")) {
 					y = Float.parseFloat(data[2]+"f");
 					//mesh.getPoints().addAll(Float.parseFloat(data[1]+"f"), y, Float.parseFloat(data[3]+"f"));
@@ -64,12 +69,16 @@ public class Custom3dModel {
 							Integer.parseInt(data[3].split("/")[0]), 0
 					);
 				}
+				//}
+				//myReader.close();
 			}
-			myReader.close();
-		} catch (FileNotFoundException | NullPointerException e) {
+		}
+		catch (Exception e) {
 			System.out.println("Error while importing .obj file");
 			e.printStackTrace();
 		}
+
+
 		// replaces height (Y-axis) properly,
 		// it seems that javaFX tries to modify height to center models, so, we counter it for alignment purposes
 		int n = 0;
diff --git a/MavenChess/MavenChess/src/main/java/view/HUD.java b/MavenChess/MavenChess/src/main/java/view/HUD.java
index d3625717df28b2803c23b08a0392cd5b76f8e6ca..a6440811ccff656f936ad91449d218ac68f45cde 100644
--- a/MavenChess/MavenChess/src/main/java/view/HUD.java
+++ b/MavenChess/MavenChess/src/main/java/view/HUD.java
@@ -1,5 +1,9 @@
 package view;
 
+import javafx.collections.FXCollections;
+import javafx.collections.ObservableList;
+import javafx.collections.ObservableListBase;
+import javafx.scene.control.ComboBox;
 import javafx.scene.effect.Glow;
 import javafx.scene.image.Image;
 import javafx.scene.image.ImageView;
@@ -14,6 +18,9 @@ public class HUD {
     private ImageView standard_imgView, variant_imgView, rollback_imgView;
     private Rectangle darkener;
 
+    private ComboBox combo;
+    private boolean comboShowed;
+
     public HUD() {
         standard_img = new Image("/standard.jpg");
         variant_img = new Image("/variant.jpg");
@@ -28,6 +35,7 @@ public class HUD {
         darkener.setOpacity(0.5);
         Glow glow = new Glow(0.2);
         Glow none = new Glow(0);
+
         standard_imgView.addEventHandler(MouseEvent.MOUSE_ENTERED, event -> {
             standard_imgView.setEffect(glow);
             variant_imgView.setEffect(none);
@@ -41,16 +49,26 @@ public class HUD {
         variant_imgView.addEventHandler(MouseEvent.MOUSE_EXITED, event -> {
             variant_imgView.setEffect(none);
         });
+
         rollback_img = new Image("/rollback.png");
         rollback_imgView = new ImageView(rollback_img);
         rollback_imgView.setPreserveRatio(true);
         rollback_imgView.setFitWidth(64);
         rollbackHide();
+
+        String pieces[] = {"Queen", "Rook", "Bishop", "Knight"};
+        combo = new ComboBox(FXCollections.observableArrayList(pieces));
+        combo.getSelectionModel().select(0);
+        combo.setStyle("-fx-font: 58 arial;");
+        combo.setTranslateX(64);
+        combo.setTranslateY(64);
+        comboShowed = false;
     }
 
     public void resize(double width, double height) {
         int weight = 2;
         int total = weight*2 + 4;
+        int avg = (int) (width + height) / 2;
         standard_imgView.setX(width/total);
         standard_imgView.setY(height/total/2);
         standard_imgView.setFitWidth(width*weight/total);
@@ -59,8 +77,13 @@ public class HUD {
         variant_imgView.setFitWidth(width*weight/total);
         darkener.setWidth(width);
         darkener.setHeight(height);
-        rollback_imgView.setX(width - 100);
-        rollback_imgView.setY(height - 120);
+        rollback_imgView.setX(width - 36 - (avg / 12));
+        rollback_imgView.setY(height - 56 - (avg / 12));
+        rollback_imgView.setFitWidth(avg / 12);
+        //combo.setStyle("-fx-font: " + avg / 24 + " arial;");
+        //combo.setTranslateX(avg / 24);
+        //combo.setTranslateY(avg / 24);
+        //combo.resize(16 * avg / 24, 16 * avg / 24);
     }
 
     public ImageView getStandard() {
@@ -88,4 +111,30 @@ public class HUD {
     public void addAllToScene(AnchorPane group2d) {
         group2d.getChildren().addAll(darkener, standard_imgView, variant_imgView, rollback_imgView);
     }
+
+    public void addCombo(AnchorPane group2d) {
+        if(!comboShowed) {
+            group2d.getChildren().add(combo);
+            comboShowed = true;
+        }
+    }
+
+    public void removeCombo(AnchorPane group2d) {
+        if(comboShowed) {
+            group2d.getChildren().remove(combo);
+            comboShowed = false;
+        }
+    }
+
+    public int getComboID() {
+        String Valeur = (String) combo.getValue();
+        int id;
+        switch(Valeur){
+            case "Queen" -> id = 0;
+            case "Rook" -> id = 1;
+            case "Bishop" -> id = 2;
+            default -> id = 3;
+        }
+        return id;
+    }
 }
diff --git a/MavenChess/MavenChess/src/main/resources/META-INF/MANIFEST.MF b/MavenChess/MavenChess/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..f6e7232f9ab7d34bc6af85525b056b44d1b42aac
--- /dev/null
+++ b/MavenChess/MavenChess/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Main-Class: controller.Main
+
diff --git a/MavenChess/MavenChess/src/main/resources/standard.jpg b/MavenChess/MavenChess/src/main/resources/standard.jpg
index 80ab8bc158c7482c96f0e5f9d7fd649d5260d345..4ebad4ff02902282282a2d6666af9f9b8d8bcbb4 100644
Binary files a/MavenChess/MavenChess/src/main/resources/standard.jpg and b/MavenChess/MavenChess/src/main/resources/standard.jpg differ
diff --git a/MavenChess/MavenChess/src/main/resources/studio_wall.jpg b/MavenChess/MavenChess/src/main/resources/studio_wall.jpg
index 21963150e325c6a8050e5dc248a39025b92f1f93..82a697a0f4a4163128818a51a01dbc806e9aaece 100644
Binary files a/MavenChess/MavenChess/src/main/resources/studio_wall.jpg and b/MavenChess/MavenChess/src/main/resources/studio_wall.jpg differ
diff --git a/MavenChess/MavenChess/src/main/resources/variant.jpg b/MavenChess/MavenChess/src/main/resources/variant.jpg
index aa9b4c3c2aa2a908cc499df2c5f3b352d26c5d1d..30d6af35a22c62e6c53a907a3193c712373e5656 100644
Binary files a/MavenChess/MavenChess/src/main/resources/variant.jpg and b/MavenChess/MavenChess/src/main/resources/variant.jpg differ
diff --git a/MavenChess/MavenChess/src/main/resources/wood.jpg b/MavenChess/MavenChess/src/main/resources/wood.jpg
index 75dfe9846063876b1c00f3b3fd7459c5f7ff47e9..ffd32ec27d20bdc979c7aeacc13087dcc859d382 100644
Binary files a/MavenChess/MavenChess/src/main/resources/wood.jpg and b/MavenChess/MavenChess/src/main/resources/wood.jpg differ
diff --git a/MavenChess/MavenChess/target/classes/controller/Main.class b/MavenChess/MavenChess/target/classes/controller/Main.class
index db8b50f73dea42f53e94e648204e176b02d94a85..1bc0d25ec3cc5cf6c7e59f74b24bec10dc697615 100644
Binary files a/MavenChess/MavenChess/target/classes/controller/Main.class and b/MavenChess/MavenChess/target/classes/controller/Main.class differ
diff --git a/MavenChess/MavenChess/target/classes/model/Board.class b/MavenChess/MavenChess/target/classes/model/Board.class
index 0873bf14700ddbb8bc09c91d963b18f2f8449b74..55c6c85d39724d936a2698660e0efbb83e061a9e 100644
Binary files a/MavenChess/MavenChess/target/classes/model/Board.class and b/MavenChess/MavenChess/target/classes/model/Board.class differ
diff --git a/MavenChess/MavenChess/target/classes/model/Kamikaze.class b/MavenChess/MavenChess/target/classes/model/Kamikaze.class
index a553fbace5503be18c80d345cf1c68c8be58995a..ba00aad06f46096ec7c7406820af2ca7b99258e7 100644
Binary files a/MavenChess/MavenChess/target/classes/model/Kamikaze.class and b/MavenChess/MavenChess/target/classes/model/Kamikaze.class differ
diff --git a/MavenChess/MavenChess/target/classes/model/King.class b/MavenChess/MavenChess/target/classes/model/King.class
index 44e5314230738f670e764fe86e51d6b91926a73c..93479dbc67c58b02f50a02f3668031f2cb9466d0 100644
Binary files a/MavenChess/MavenChess/target/classes/model/King.class and b/MavenChess/MavenChess/target/classes/model/King.class differ
diff --git a/MavenChess/MavenChess/target/classes/model/Nwap.class b/MavenChess/MavenChess/target/classes/model/Nwap.class
index ff4b580f756aed50be7d614d201301d61f7dbb91..317727b9212913e9c7b6899aa519e631466cee8d 100644
Binary files a/MavenChess/MavenChess/target/classes/model/Nwap.class and b/MavenChess/MavenChess/target/classes/model/Nwap.class differ
diff --git a/MavenChess/MavenChess/target/classes/model/Pawn.class b/MavenChess/MavenChess/target/classes/model/Pawn.class
index 86be28f797066004817129314fe773d18fdc2d6e..1e0705d8699697f5671e70a19371232fbd33a7e1 100644
Binary files a/MavenChess/MavenChess/target/classes/model/Pawn.class and b/MavenChess/MavenChess/target/classes/model/Pawn.class differ
diff --git a/MavenChess/MavenChess/target/classes/model/Piece.class b/MavenChess/MavenChess/target/classes/model/Piece.class
index a91a7058c2e3e95d3ba4cae8dfdc98aceaa48ac3..ab5ceecffe2fa3ca0263749ae2d222ca03588673 100644
Binary files a/MavenChess/MavenChess/target/classes/model/Piece.class and b/MavenChess/MavenChess/target/classes/model/Piece.class differ
diff --git a/MavenChess/MavenChess/target/classes/model/Rook.class b/MavenChess/MavenChess/target/classes/model/Rook.class
index ccde08248a119e91baf3a4efefc0806e5f3bea4c..66519ac0cd3303899cf669ca89ff2982c0dcd6aa 100644
Binary files a/MavenChess/MavenChess/target/classes/model/Rook.class and b/MavenChess/MavenChess/target/classes/model/Rook.class differ
diff --git a/MavenChess/MavenChess/target/classes/view/BoardView.class b/MavenChess/MavenChess/target/classes/view/BoardView.class
index 1a8bd63306c2d5a552982958e19c0fdda10f8894..75b192f985c13b42a36de44c423c981f3c4aad70 100644
Binary files a/MavenChess/MavenChess/target/classes/view/BoardView.class and b/MavenChess/MavenChess/target/classes/view/BoardView.class differ
diff --git a/MavenChess/MavenChess/target/classes/view/Custom3dModel.class b/MavenChess/MavenChess/target/classes/view/Custom3dModel.class
index a40f2cfcc06e70213d65a84db14d46d18a123fcf..0b020d943b24578fa1b599c2cf3d49e9e731a627 100644
Binary files a/MavenChess/MavenChess/target/classes/view/Custom3dModel.class and b/MavenChess/MavenChess/target/classes/view/Custom3dModel.class differ
diff --git a/MavenChess/MavenChess/target/classes/wood.jpg b/MavenChess/MavenChess/target/classes/wood.jpg
index 75dfe9846063876b1c00f3b3fd7459c5f7ff47e9..ffd32ec27d20bdc979c7aeacc13087dcc859d382 100644
Binary files a/MavenChess/MavenChess/target/classes/wood.jpg and b/MavenChess/MavenChess/target/classes/wood.jpg differ
diff --git a/MavenChess/out/artifacts/MavenChess_jar/MavenChess.jar b/MavenChess/out/artifacts/MavenChess_jar/MavenChess.jar
new file mode 100644
index 0000000000000000000000000000000000000000..e3e184ea2339eec58da6e6b9dced702ec290705e
Binary files /dev/null and b/MavenChess/out/artifacts/MavenChess_jar/MavenChess.jar differ
diff --git a/README.md b/README.md
index cb9c6004eba53cfeb6dc17ec483a7168a4bd45a8..655e561d0eb277cbb2b704b21972fb6ef8dd47e1 100644
--- a/README.md
+++ b/README.md
@@ -1,92 +1,56 @@
-# Projet_JV
-
-img/logo.jpg
-
-## Getting started
-
-To make it easy for you to get started with GitLab, here's a list of recommended next steps.
-
-Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)!
-
-## Add your files
-
-- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files
-- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command:
-
-```
-cd existing_repo
-git remote add origin https://git.unistra.fr/tacikbas/projet_jv.git
-git branch -M main
-git push -uf origin main
-```
-
-## Integrate with your tools
-
-- [ ] [Set up project integrations](https://git.unistra.fr/tacikbas/projet_jv/-/settings/integrations)
-
-## Collaborate with your team
-
-- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/)
-- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html)
-- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically)
-- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/)
-- [ ] [Automatically merge when pipeline succeeds](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html)
 
-## Test and Deploy
 
-Use the built-in continuous integration in GitLab.
+# Projet_JV
 
-- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/index.html)
-- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing(SAST)](https://docs.gitlab.com/ee/user/application_security/sast/)
-- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html)
-- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/)
-- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html)
+## Description
 
-***
+Ce projet est notre projet de jeu d'échec en java avec le moteur graphique JavaFX.
 
-# Editing this README
+## Installation
 
-When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thank you to [makeareadme.com](https://www.makeareadme.com/) for this template.
+1. Télécharger le fichier .jar
+2. Installer une version supérieur de Java et JavaFX version >= 20.*
+3. Accorder les permissions d'executions
 
-## Suggestions for a good README
-Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information.
+## Usage
 
-## Name
-Choose a self-explaining name for your project.
+### Linux
+Lancer le jeu avec la commande
 
-## Description
-Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors.
+```shell
+java -jar <chemin du jar>
+```
+### Windows
 
-## Badges
-On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge.
+ouvrir PowerShell
+```shell
+& <chemin de "java.exe" du dossier de l'installation javaFX> -jar <chemin du jar>
+```
 
-## Visuals
-Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method.
 
-## Installation
-Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection.
+## Authors and acknowledgment
 
-## Usage
-Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README.
+    Oliver Pillods : étudiant l2
 
-## Support
-Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc.
+    Tuna Acikbas : étudiant L2
 
-## Roadmap
-If you have ideas for releases in the future, it is a good idea to list them in the README.
 
-## Contributing
-State if you are open to contributions and what your requirements are for accepting them.
+## License
+LICENCE PUBLIQUE RIEN À BRANLER
+Version 1, mars 2009
 
-For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self.
+Copyright (C) 2009 Sam Hocevar
+14 rue de Plaisance, 75014 Paris, France
 
-You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser.
+La copie et la distribution de copies exactes de cette licence sont
+autorisées, et toute modification est permise à condition de changer
+le nom de la licence.
 
-## Authors and acknowledgment
-Show your appreciation to those who have contributed to the project.
+CONDITIONS DE COPIE, DISTRIBUTON ET MODIFICATION
+DE LA LICENCE PUBLIQUE RIEN À BRANLER
 
-## License
-For open source projects, say how it is licensed.
+0. Faites ce que vous voulez, j’en ai RIEN À BRANLER.
 
 ## Project status
-If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers.
+
+Le projet est officiellement fini et ne sera plus poursuivi
\ No newline at end of file