From ffb82fd569fdbe05e46d6d96aad3364bdea28101 Mon Sep 17 00:00:00 2001 From: MasterPyo <olivier.pillods@gmail.com> Date: Thu, 27 Apr 2023 14:01:12 +0200 Subject: [PATCH] pawn fixed, king and rock both can detect casteling --- MavenChess/.idea/misc.xml | 2 +- .../src/main/java/controller/Main.java | 24 +--- .../src/main/java/model/Bishop.java | 57 ++++---- .../MavenChess/src/main/java/model/Board.java | 79 ++++++----- .../MavenChess/src/main/java/model/King.java | 62 ++++++--- .../src/main/java/model/Knight.java | 34 +++-- .../MavenChess/src/main/java/model/Pawn.java | 60 +++----- .../MavenChess/src/main/java/model/Piece.java | 7 + .../src/main/java/model/Position.java | 9 +- .../MavenChess/src/main/java/model/Queen.java | 72 +++++----- .../MavenChess/src/main/java/model/Rook.java | 56 ++++---- .../src/main/java/view/BoardView.java | 128 ++++++++---------- .../src/main/java/view/Custom3dModel.java | 24 ++-- .../src/main/java/view/CustomCamera.java | 10 +- .../src/main/java/view/CustomLight.java | 6 +- .../src/main/java/view/CustomMaterial.java | 28 ++-- .../src/main/java/view/CustomScene.java | 2 +- .../MavenChess/src/main/java/view/Desk.java | 4 +- .../src/main/java/view/TileView.java | 4 +- .../target/classes/controller/Main.class | Bin 4704 -> 4707 bytes .../target/classes/model/Bishop.class | Bin 1688 -> 1483 bytes .../target/classes/model/Board.class | Bin 3248 -> 3363 bytes .../target/classes/model/King.class | Bin 1571 -> 1807 bytes .../target/classes/model/Knight.class | Bin 2110 -> 1389 bytes .../target/classes/model/Pawn.class | Bin 1628 -> 1341 bytes .../target/classes/model/Piece.class | Bin 972 -> 1094 bytes .../target/classes/model/Position.class | Bin 1476 -> 1390 bytes .../target/classes/model/Queen.class | Bin 2115 -> 1518 bytes .../target/classes/model/Rook.class | Bin 1769 -> 1633 bytes .../target/classes/view/BoardView.class | Bin 7879 -> 7567 bytes .../target/classes/view/Custom3dModel.class | Bin 4229 -> 4276 bytes .../target/classes/view/CustomCamera.class | Bin 4141 -> 4044 bytes .../target/classes/view/CustomLight.class | Bin 1485 -> 1343 bytes .../target/classes/view/CustomMaterial.class | Bin 1705 -> 1725 bytes .../target/classes/view/CustomScene.class | Bin 1009 -> 1009 bytes .../MavenChess/target/classes/view/Desk.class | Bin 1157 -> 1157 bytes .../target/classes/view/TileView.class | Bin 1022 -> 1022 bytes 37 files changed, 339 insertions(+), 329 deletions(-) diff --git a/MavenChess/.idea/misc.xml b/MavenChess/.idea/misc.xml index 0a5c358..abcc7fd 100644 --- a/MavenChess/.idea/misc.xml +++ b/MavenChess/.idea/misc.xml @@ -8,7 +8,7 @@ </list> </option> </component> - <component name="ProjectRootManager" version="2" languageLevel="JDK_X" default="true" project-jdk-name="openjdk-20" project-jdk-type="JavaSDK"> + <component name="ProjectRootManager" version="2" languageLevel="JDK_20" default="true" project-jdk-name="openjdk-20" project-jdk-type="JavaSDK"> <output url="file://$PROJECT_DIR$/out" /> </component> </project> \ No newline at end of file diff --git a/MavenChess/MavenChess/src/main/java/controller/Main.java b/MavenChess/MavenChess/src/main/java/controller/Main.java index 5ac2f19..0637b74 100644 --- a/MavenChess/MavenChess/src/main/java/controller/Main.java +++ b/MavenChess/MavenChess/src/main/java/controller/Main.java @@ -2,16 +2,12 @@ package controller; import javafx.application.Application; import javafx.scene.*; -import javafx.scene.input.KeyEvent; import javafx.scene.input.MouseEvent; import javafx.scene.input.ScrollEvent; import javafx.stage.Stage; import model.Board; -import model.Position; import view.*; -import java.util.ArrayList; - public class Main extends Application { @Override public void start(Stage stage) { @@ -43,39 +39,33 @@ public class Main extends Application { Desk desk = new Desk(material); desk.addAllToScene(group); // adds the desk to scene - // init - creates a (visual) chessboard of 8x8, and all (visual) 3d pieces - BoardView boardView = new BoardView(model, material); - boardView.addAllToScene(group); // adds the board and the pieces to scene - // init - creates a (model) list of all pieces Board board = new Board(); + // init - creates a (visual) chessboard of 8x8, and all (visual) 3d pieces + BoardView boardView = new BoardView(model, material, board); + boardView.addAllToScene(group); // adds the board and the pieces to scene + // event -------------------------------------------------------------- // event - camera rotation (mouse dragging) camera.initMouseControl(scene.get()); // allow user to move camera with mouse, with some constraints // event - camera zoom (mouse scroll) - stage.addEventHandler(ScrollEvent.SCROLL, event -> { - camera.scrollCamera(event.getDeltaY()); - }); + stage.addEventHandler(ScrollEvent.SCROLL, event -> camera.scrollCamera(event.getDeltaY())); // event - click on (visual) pieces to show (visually) available movements. (asked from model rules) for(int n = 0 ; n < 64 ; n++) { PieceView piece = boardView.getPiece(n); if(piece != null) { - piece.getObj().addEventHandler(MouseEvent.MOUSE_CLICKED, event -> { - boardView.clickPiece(material, piece, board); - }); + piece.getObj().addEventHandler(MouseEvent.MOUSE_CLICKED, event -> boardView.clickPiece(material, piece, board)); } } // event - click on (visual) "colored tiles" to move the selected piece there for(int n = 0 ; n < 64 ; n++) { TileView tile = boardView.getTile(n); - tile.getObj().addEventHandler(MouseEvent.MOUSE_CLICKED, event -> { - boardView.clickTile(material, tile, board); - }); + tile.getObj().addEventHandler(MouseEvent.MOUSE_CLICKED, event -> boardView.clickTile(material, tile, board)); } // start -------------------------------------------------------------- diff --git a/MavenChess/MavenChess/src/main/java/model/Bishop.java b/MavenChess/MavenChess/src/main/java/model/Bishop.java index 2f52dea..cd2e356 100644 --- a/MavenChess/MavenChess/src/main/java/model/Bishop.java +++ b/MavenChess/MavenChess/src/main/java/model/Bishop.java @@ -8,81 +8,84 @@ public class Bishop extends Piece { super(p, color); } - public ArrayList<Position> getAvailableMoves(Board b) { // creates a dynamic list of available moves - ArrayList<Position> moves = new ArrayList<Position>(); - + ArrayList<Position> moves = new ArrayList<>(); Position arrival; - Position Cursor = new Position(p.getX(), p.getY()); + // list of the 4 bishop directions + int[] all_x = {1, 1, -1, -1}; + int[] all_y = {1, -1, -1, 1}; + + for(int n = 0 ; n < all_x.length ; n++) { // for each direction + int x = all_x[n]; + int y = all_y[n]; + boolean blocked = false; + int i = 1; + while (i < 8 && !blocked) { // continues "as a ray" in that direction until blocked + arrival = new Position(p.getX() + (x * i), p.getY() + (y * i)); + if (b.isEnemy(arrival, p) || b.isFree(arrival)) { + moves.add(arrival); + } + if (!b.isFree(arrival)) { + blocked = true; + } + i++; + } + } + // Full wrote version : -------------------------------------------- + /* + Position Cursor = new Position(p.getX(), p.getY()); int i = 1; boolean leftTop = false; boolean rightTop = false; boolean leftDown = false; boolean rightDown = false; - while (i < 8) { - //left diagonal - arrival = new Position(p.getX() + i, p.getY() + i); - if (!leftTop) { - if (b.isEnnemy(arrival, p) || b.isFree(arrival)) { + if (b.isEnemy(arrival, p) || b.isFree(arrival)) { moves.add(arrival); } } - if (!b.isFree(arrival)) { leftTop = true; } - - - - - //right diagonal arrival = new Position(p.getX() - i, p.getY() + i); if (!rightTop) { - if (b.isEnnemy(arrival, p) || b.isFree(arrival)) { + if (b.isEnemy(arrival, p) || b.isFree(arrival)) { moves.add(arrival); } } if (!b.isFree(arrival)) { rightTop = true; } - - - arrival = new Position(p.getX() + i, p.getY() - i); if (!leftDown) { - if (b.isEnnemy(arrival, p) || b.isFree(arrival)) { + if (b.isEnemy(arrival, p) || b.isFree(arrival)) { moves.add(arrival); } } if (!b.isFree(arrival)) { leftDown = true; } - - - arrival = new Position(p.getX() - i, p.getY() - i); if (!rightDown) { - if (b.isEnnemy(arrival, p) || b.isFree(arrival)) { + if (b.isEnemy(arrival, p) || b.isFree(arrival)) { moves.add(arrival); } } if (!b.isFree(arrival)) { rightDown = true; } - - i++; } - + */ + // ----------------------------------------------------------- return moves; } diff --git a/MavenChess/MavenChess/src/main/java/model/Board.java b/MavenChess/MavenChess/src/main/java/model/Board.java index d458d60..7a0e838 100644 --- a/MavenChess/MavenChess/src/main/java/model/Board.java +++ b/MavenChess/MavenChess/src/main/java/model/Board.java @@ -3,36 +3,37 @@ package model; public class Board { public static final int PAWN = 0, ROOK = 1, KNIGHT = 2, BISHOP = 3, QUEEN = 4, KING = 5; + public static final int A = 1, B = 2, C = 3, D = 4, E = 5, F = 6, G = 7, H = 8; - private Piece[] pieces; + private final Piece[] pieces; private Position selected; public Board() { selected = null; - pieces = new Piece[64]; // initialisation of the list of pieces + pieces = new Piece[64]; for(int i = 0 ; i < 64 ; i++) { pieces[i] = null; } - int y = 0; + int y; for(int color = Piece.WHITE ; color == Piece.WHITE || color == Piece.BLACK ; color++) { // placement of pawns if(color == Piece.WHITE) { y = 2; } else { y = 7; } - for(int x = Position.a ; x <= Position.h ; x++) { + for(int x = A ; x <= H ; x++) { createPiece(x, y, color, PAWN); // fills line 2 and line 7 with pawns } // placement of rook, knight, bishop, queen, king - line 1 and line 8 if(color == Piece.WHITE) { y = 1; } else { y = 8; } - createPiece(Position.a, y, color, ROOK); - createPiece(Position.b, y, color, KNIGHT); - createPiece(Position.c, y, color, BISHOP); - createPiece(Position.d, y, color, QUEEN); - createPiece(Position.e, y, color, KING); - createPiece(Position.f, y, color, BISHOP); - createPiece(Position.g, y, color, KNIGHT); - createPiece(Position.h, y, color, ROOK); + createPiece(A, y, color, ROOK); + createPiece(B, y, color, KNIGHT); + createPiece(C, y, color, BISHOP); + createPiece(D, y, color, QUEEN); + createPiece(E, y, color, KING); + createPiece(F, y, color, BISHOP); + createPiece(G, y, color, KNIGHT); + createPiece(H, y, color, ROOK); } } @@ -43,23 +44,25 @@ public class Board { public Piece getPiece(Position position) { return pieces[position.getID()]; } + + public Piece getPiece(int id) { + return pieces[id]; + } public void createPiece(int x, int y, int color, int type) { + Position p = new Position(x, y); switch(type) { - case ROOK -> setPiece(new Rook(new Position(x, y), color)); - case KNIGHT -> setPiece(new Knight(new Position(x, y), color)); - case BISHOP -> setPiece(new Bishop(new Position(x, y), color)); - case QUEEN -> setPiece(new Queen(new Position(x, y), color)); - case KING -> setPiece(new King(new Position(x, y), color)); - default -> setPiece(new Pawn(new Position(x, y), color)); + case ROOK -> setPiece(new Rook(p, color)); + case KNIGHT -> setPiece(new Knight(p, color)); + case BISHOP -> setPiece(new Bishop(p, color)); + case QUEEN -> setPiece(new Queen(p, color)); + case KING -> setPiece(new King(p, color)); + default -> setPiece(new Pawn(p, color)); } } public Position getSelected() { return selected; } - public Piece getSelectedPiece() { - return getPiece(selected); - } public void setSelected(Position p) { selected = p; @@ -68,29 +71,35 @@ public class Board { public void movePiece(Position origin, Position arrival) { Piece piece = getPiece(origin); piece.setPosition(arrival); // changes position to arrival - setPiece(piece); // copies the piece from origin ID to arrival ID - pieces[origin.getID()] = null; // removes the origin ID piece + setPiece(piece); // copies the piece (from origin ID) to arrival ID on the pieces list + pieces[origin.getID()] = null; // removes the origin ID piece on the pieces list } public boolean isFree(Position p) { - return (Position.isCorrect(p) && pieces[p.getID()] == null); - } - public boolean isBlack(Position p) { - return (!isFree(p) && pieces[p.getID()].getColor() == Piece.BLACK); - } - - public boolean isWhite(Position p) { - return (!isFree(p) && pieces[p.getID()].getColor() == Piece.WHITE); + return (p.isCorrect() + && getPiece(p) == null); } - public boolean isEnnemy(Position p, Position origin) { - return (Position.isCorrect(p) && !isFree(p) && pieces[p.getID()].getColor() != pieces[origin.getID()].getColor() ); + public boolean isEnemy(Position arrival, Position origin) { + return (arrival.isCorrect() + && !isFree(arrival) + && getPiece(arrival).getColor() != getPiece(origin).getColor() ); } public boolean isKing(Position p) { - return (!isFree(p) && pieces[p.getID()].getClass() == King.class); + return (p.isCorrect() + && !isFree(p) + && getPiece(p).getClass() == King.class); + } + + public boolean isRook(Position p) { + return (p.isCorrect() + && !isFree(p) + && getPiece(p).getClass() == Rook.class); } public boolean isPawn(Position p) { - return (!isFree(p) && pieces[p.getID()].getClass() == Pawn.class); + return (p.isCorrect() + && !isFree(p) + && getPiece(p).getClass() == Pawn.class); } } diff --git a/MavenChess/MavenChess/src/main/java/model/King.java b/MavenChess/MavenChess/src/main/java/model/King.java index e1ec772..6bb57ca 100644 --- a/MavenChess/MavenChess/src/main/java/model/King.java +++ b/MavenChess/MavenChess/src/main/java/model/King.java @@ -5,58 +5,84 @@ import java.util.ArrayList; public class King extends Piece { - private boolean Casteling = true; - private final Position original; - public King(Position p, int color) { super(p, color); - this.original = p; } - public ArrayList<Position> getAvailableMoves(Board b) { // creates a dynamic list of available moves - ArrayList<Position> moves = new ArrayList<Position>(); - + ArrayList<Position> moves = new ArrayList<>(); Position arrival; + // list of the 8 king movements + int[] all_x = {0, 1, 1, 1, 0, -1, -1, -1}; + int[] all_y = {1, 1, 0, -1, -1, -1, 0, 1}; + + for(int n = 0 ; n < all_x.length ; n++) { // for each direction + int x = all_x[n]; + int y = all_y[n]; + arrival = new Position(p.getX() + x, p.getY() + y); + if (b.isEnemy(arrival, p) || b.isFree(arrival)) { + moves.add(arrival); + } + } + + // Castling + if(!hasBeenMoved) { + Position rookWest = new Position(1, p.getY()); + if( b.isRook(rookWest) && !b.getPiece(rookWest).hasBeenMoved() + && b.isFree(new Position(2, p.getY())) + && b.isFree(new Position(3, p.getY())) + && b.isFree(new Position(4, p.getY())) ) { + moves.add(rookWest); + } + Position rookEast = new Position(8, p.getY()); + if( b.isRook(rookEast) && !b.getPiece(rookEast).hasBeenMoved() + && b.isFree(new Position(7, p.getY())) + && b.isFree(new Position(6, p.getY())) ) { + moves.add(rookEast); + } + } + + // Full wrote version : -------------------------------------------- + /* // up arrival = new Position(p.getX(), p.getY() + 1); - if(b.isEnnemy(arrival,p) || b.isFree(arrival)) { moves.add(arrival); } + if(b.isEnemy(arrival,p) || b.isFree(arrival)) { moves.add(arrival); } //down arrival = new Position(p.getX(), p.getY() - 1); - if(b.isEnnemy(arrival,p) || b.isFree(arrival)) { moves.add(arrival); } + if(b.isEnemy(arrival,p) || b.isFree(arrival)) { moves.add(arrival); } //left arrival = new Position(p.getX()+1, p.getY()); - if(b.isEnnemy(arrival,p) || b.isFree(arrival)) { moves.add(arrival); } + if(b.isEnemy(arrival,p) || b.isFree(arrival)) { moves.add(arrival); } //right arrival = new Position(p.getX()-1, p.getY()); - if(b.isEnnemy(arrival,p) || b.isFree(arrival)) { moves.add(arrival); } + if(b.isEnemy(arrival,p) || b.isFree(arrival)) { moves.add(arrival); } //up left arrival = new Position(p.getX()-1, p.getY() + 1); - if(b.isEnnemy(arrival,p) || b.isFree(arrival)) { moves.add(arrival); } + if(b.isEnemy(arrival,p) || b.isFree(arrival)) { moves.add(arrival); } //up right arrival = new Position(p.getX()+1, p.getY() + 1); - if(b.isEnnemy(arrival,p) || b.isFree(arrival)) { moves.add(arrival); } + if(b.isEnemy(arrival,p) || b.isFree(arrival)) { moves.add(arrival); } //down left arrival = new Position(p.getX()-1, p.getY() -1); - if(b.isEnnemy(arrival,p) || b.isFree(arrival)) { moves.add(arrival); } + if(b.isEnemy(arrival,p) || b.isFree(arrival)) { moves.add(arrival); } //down right arrival = new Position(p.getX()+1, p.getY() - 1); - if(b.isEnnemy(arrival,p) || b.isFree(arrival)) { moves.add(arrival); } + if(b.isEnemy(arrival,p) || b.isFree(arrival)) { moves.add(arrival); } arrival = new Position(p.getX(), p.getY() + 1); - if(b.isEnnemy(arrival,p) || b.isFree(arrival)) { moves.add(arrival); } - - + if(b.isEnemy(arrival,p) || b.isFree(arrival)) { moves.add(arrival); } + */ + // --------------------------------------------------------------- return moves; } diff --git a/MavenChess/MavenChess/src/main/java/model/Knight.java b/MavenChess/MavenChess/src/main/java/model/Knight.java index 7a731d0..b65fb00 100644 --- a/MavenChess/MavenChess/src/main/java/model/Knight.java +++ b/MavenChess/MavenChess/src/main/java/model/Knight.java @@ -13,47 +13,60 @@ public class Knight extends Piece { public ArrayList<Position> getAvailableMoves(Board b) { // creates a dynamic list of available moves - ArrayList<Position> moves = new ArrayList<Position>(); - + ArrayList<Position> moves = new ArrayList<>(); Position arrival; + // list of the 8 knight specific movements + int[] all_x = {1, 2, 2, 1, -1, -2, -2, -1}; + int[] all_y = {2, 1, -1, -2, -2, -1, 1, 2}; + + for(int n = 0 ; n < all_x.length ; n++) { // for each direction + int x = all_x[n]; + int y = all_y[n]; + arrival = new Position(p.getX() + x, p.getY() + y); + if (b.isEnemy(arrival, p) || b.isFree(arrival)) { + moves.add(arrival); + } + } + // Full wrote version : -------------------------- + /* arrival = new Position(p.getX() - 1, p.getY() + 2); - if (b.isEnnemy(arrival, p) || b.isFree(arrival)) { + if (b.isEnemy(arrival, p) || b.isFree(arrival)) { moves.add(arrival); } // up right arrival = new Position(p.getX() + 1, p.getY() + 2); - if (b.isEnnemy(arrival, p) || b.isFree(arrival)) { + if (b.isEnemy(arrival, p) || b.isFree(arrival)) { moves.add(arrival); } // down left arrival = new Position(p.getX() - 1, p.getY() - 2); - if (b.isEnnemy(arrival, p) || b.isFree(arrival)) { + if (b.isEnemy(arrival, p) || b.isFree(arrival)) { moves.add(arrival); } //down right arrival = new Position(p.getX() + 1, p.getY() - 2); - if (b.isEnnemy(arrival, p) || b.isFree(arrival)) { + if (b.isEnemy(arrival, p) || b.isFree(arrival)) { moves.add(arrival); } arrival = new Position(p.getX() - 2, p.getY() + 1); - if (b.isEnnemy(arrival, p) || b.isFree(arrival)) { + if (b.isEnemy(arrival, p) || b.isFree(arrival)) { moves.add(arrival); } // up right arrival = new Position(p.getX() + 2, p.getY() + 1); - if (b.isEnnemy(arrival, p) || b.isFree(arrival)) { + if (b.isEnemy(arrival, p) || b.isFree(arrival)) { moves.add(arrival); } // down left arrival = new Position(p.getX() - 2, p.getY() - 1); - if (b.isEnnemy(arrival, p) || b.isFree(arrival)) { + if (b.isEnemy(arrival, p) || b.isFree(arrival)) { moves.add(arrival); } @@ -61,7 +74,8 @@ public class Knight extends Piece { arrival = new Position(p.getX() + 2, p.getY() - 1); if (b.isEnnemy(arrival, p) || b.isFree(arrival)) { moves.add(arrival); - } + }*/ + // ----------------------------------------------- return moves; } diff --git a/MavenChess/MavenChess/src/main/java/model/Pawn.java b/MavenChess/MavenChess/src/main/java/model/Pawn.java index 0861484..226e685 100644 --- a/MavenChess/MavenChess/src/main/java/model/Pawn.java +++ b/MavenChess/MavenChess/src/main/java/model/Pawn.java @@ -3,62 +3,40 @@ package model; import java.util.ArrayList; public class Pawn extends Piece { - private final Position original; public Pawn(Position p, int color) { super(p, color); - this.original = p; } - public ArrayList<Position> getAvailableMoves(Board b) { // creates a dynamic list of available moves - ArrayList<Position> moves = new ArrayList<Position>(); - + ArrayList<Position> moves = new ArrayList<>(); Position arrival; - if(color == Piece.WHITE) { // black and white have an opposite direction behavior - - if(this.p.getID() == this.original.getID()){ - // up, free movement first time - arrival = new Position(p.getX(), p.getY() + 2); - if(Position.isCorrect(arrival) && b.isFree(arrival)) { moves.add(arrival); } - - } - - // up, free movement - arrival = new Position(p.getX(), p.getY() + 1); - if(Position.isCorrect(arrival) && b.isFree(arrival)) { moves.add(arrival); } - - // up right, attack movement - arrival = new Position(p.getX() + 1, p.getY() + 1); - if(Position.isCorrect(arrival) && b.isBlack(arrival)) { moves.add(arrival); } - - // up left, attack movement - arrival = new Position(p.getX() - 1, p.getY() + 1); - if(Position.isCorrect(arrival) && b.isBlack(arrival)) { moves.add(arrival); } + int y = -1; + if(color == Piece.WHITE) { // black and white have an opposite direction behavior + y = 1; } - else { - if(this.p.getID() == this.original.getID()){ - // up, free movement first time - arrival = new Position(p.getX(), p.getY() - 2); - if(Position.isCorrect(arrival) && b.isFree(arrival)) { moves.add(arrival); } + // forward + arrival = new Position(p.getX(), p.getY() + y); + if(b.isFree(arrival)) { + moves.add(arrival); + // forward twice, only if it's first move + if(!hasBeenMoved){ + arrival = new Position(p.getX(), p.getY() + y + y); + if(b.isFree(arrival)) { moves.add(arrival); } } + } - // down, free movement - arrival = new Position(p.getX(), p.getY() - 1); - if(Position.isCorrect(arrival) && b.isFree(arrival)) { moves.add(arrival); } - - // down right, attack movement - arrival = new Position(p.getX() + 1, p.getY() - 1); - if(Position.isCorrect(arrival) && b.isWhite(arrival)) { moves.add(arrival); } + // forward + east, attack-only movement + arrival = new Position(p.getX() + 1, p.getY() + y); + if(b.isEnemy(arrival, p)) { moves.add(arrival); } - // down left, attack movement - arrival = new Position(p.getX() - 1, p.getY() - 1); - if(Position.isCorrect(arrival) && b.isWhite(arrival)) { moves.add(arrival); } + // forward + west, attack-only movement + arrival = new Position(p.getX() - 1, p.getY() + y); + if(b.isEnemy(arrival, p)) { moves.add(arrival); } - } return moves; } } diff --git a/MavenChess/MavenChess/src/main/java/model/Piece.java b/MavenChess/MavenChess/src/main/java/model/Piece.java index 72d2d8d..d26f9f4 100644 --- a/MavenChess/MavenChess/src/main/java/model/Piece.java +++ b/MavenChess/MavenChess/src/main/java/model/Piece.java @@ -7,12 +7,14 @@ import java.util.ArrayList; public abstract class Piece { protected Position p; protected int color; + protected boolean hasBeenMoved; public static final int WHITE = 1, BLACK = 2; protected Piece(Position p, int color) { this.p = p; this.color = color; + hasBeenMoved = false; } public ArrayList<Position> getAvailableMoves(Board b) { @@ -27,7 +29,12 @@ public abstract class Piece { return p; } + public boolean hasBeenMoved() { + return hasBeenMoved; + } + public void setPosition(Position p) { this.p = p; + hasBeenMoved = true; } } diff --git a/MavenChess/MavenChess/src/main/java/model/Position.java b/MavenChess/MavenChess/src/main/java/model/Position.java index 7a29479..b1562dc 100644 --- a/MavenChess/MavenChess/src/main/java/model/Position.java +++ b/MavenChess/MavenChess/src/main/java/model/Position.java @@ -3,7 +3,6 @@ package model; public class Position { private int x; // x horizontal -> use static Position.a to Position.h private int y; // y vertical -> use 1 to 8 - public static final int a = 1, b = 2, c = 3, d = 4, e = 5, f = 6, g = 7, h = 8; // PS : graveyards are specified as negative 'x', and we use 'y' to pile dead pieces from 1 to n public static final int WHITE_GRAVEYARD = -1, BLACK_GRAVEYARD = -2; @@ -40,7 +39,11 @@ public class Position { this.y = y; } - public static boolean isCorrect(Position arrival) { - return (arrival.getX() >= 1 && arrival.getX() <= 8 && arrival.getY() >= 1 && arrival.getY() <= 8); + public boolean isCorrect() { + return (x >= 1 && x <= 8 && y >= 1 && y <= 8); + } + + public boolean equals(Position p) { + return (x == p.getX() && y == p.getY()); } } diff --git a/MavenChess/MavenChess/src/main/java/model/Queen.java b/MavenChess/MavenChess/src/main/java/model/Queen.java index 0d740f1..08f4ae3 100644 --- a/MavenChess/MavenChess/src/main/java/model/Queen.java +++ b/MavenChess/MavenChess/src/main/java/model/Queen.java @@ -11,11 +11,32 @@ public class Queen extends Piece{ public ArrayList<Position> getAvailableMoves(Board b) { // creates a dynamic list of available moves - ArrayList<Position> moves = new ArrayList<Position>(); - + ArrayList<Position> moves = new ArrayList<>(); Position arrival; + // list of the 8 queen directions + int[] all_x = {0, 1, 1, 1, 0, -1, -1, -1}; + int[] all_y = {1, 1, 0, -1, -1, -1, 0, 1}; + + for(int n = 0 ; n < all_x.length ; n++) { // for each direction + int x = all_x[n]; + int y = all_y[n]; + boolean blocked = false; + int i = 1; + while (i < 8 && !blocked) { // continues "as a ray" in that direction until blocked + arrival = new Position(p.getX() + (x * i), p.getY() + (y * i)); + if (b.isEnemy(arrival, p) || b.isFree(arrival)) { + moves.add(arrival); + } + if (!b.isFree(arrival)) { + blocked = true; + } + i++; + } + } + // Full wrote version : -------------------------------------------- + /* int i = 1; boolean left = false; boolean right = false; @@ -29,111 +50,84 @@ public class Queen extends Piece{ while (i < 8) { // Bishop moves arrival = new Position(p.getX() + i, p.getY() + i); - if (!leftTop) { - if (b.isEnnemy(arrival, p) || b.isFree(arrival)) { + if (b.isEnemy(arrival, p) || b.isFree(arrival)) { moves.add(arrival); } } - if (!b.isFree(arrival)) { leftTop = true; } - - - - - //right diagonal arrival = new Position(p.getX() - i, p.getY() + i); if (!rightTop) { - if (b.isEnnemy(arrival, p) || b.isFree(arrival)) { + if (b.isEnemy(arrival, p) || b.isFree(arrival)) { moves.add(arrival); } } if (!b.isFree(arrival)) { rightTop = true; } - - - arrival = new Position(p.getX() + i, p.getY() - i); if (!leftDown) { - if (b.isEnnemy(arrival, p) || b.isFree(arrival)) { + if (b.isEnemy(arrival, p) || b.isFree(arrival)) { moves.add(arrival); } } if (!b.isFree(arrival)) { leftDown = true; } - - - arrival = new Position(p.getX() - i, p.getY() - i); if (!rightDown) { - if (b.isEnnemy(arrival, p) || b.isFree(arrival)) { + if (b.isEnemy(arrival, p) || b.isFree(arrival)) { moves.add(arrival); } } if (!b.isFree(arrival)) { rightDown = true; } - - // RooK moves - arrival = new Position(p.getX() +i, p.getY()); - if (!left) { - if (b.isEnnemy(arrival, p) || b.isFree(arrival)) { + if (b.isEnemy(arrival, p) || b.isFree(arrival)) { moves.add(arrival); } } - if (!b.isFree(arrival)) { left = true; } - - - //right diagonal arrival = new Position(p.getX()- i , p.getY() ); if (!right) { - if (b.isEnnemy(arrival, p) || b.isFree(arrival)) { + if (b.isEnemy(arrival, p) || b.isFree(arrival)) { moves.add(arrival); } } if (!b.isFree(arrival)) { right = true; } - - - arrival = new Position(p.getX(), p.getY() + i); if (!top) { - if (b.isEnnemy(arrival, p) || b.isFree(arrival)) { + if (b.isEnemy(arrival, p) || b.isFree(arrival)) { moves.add(arrival); } } if (!b.isFree(arrival)) { top = true; } - - - arrival = new Position(p.getX(), p.getY() - i); if (!down) { - if (b.isEnnemy(arrival, p) || b.isFree(arrival)) { + if (b.isEnemy(arrival, p) || b.isFree(arrival)) { moves.add(arrival); } } if (!b.isFree(arrival)) { down = true; } - - i++; } + */ + // ------------------------------------------------------------ return moves; } diff --git a/MavenChess/MavenChess/src/main/java/model/Rook.java b/MavenChess/MavenChess/src/main/java/model/Rook.java index 859120d..a04763e 100644 --- a/MavenChess/MavenChess/src/main/java/model/Rook.java +++ b/MavenChess/MavenChess/src/main/java/model/Rook.java @@ -4,43 +4,59 @@ import java.util.ArrayList; public class Rook extends Piece { - - private final Position original; - public Rook(Position p, int color) { super(p, color); - this.original = p; } - public ArrayList<Position> getAvailableMoves(Board b) { // creates a dynamic list of available moves - ArrayList<Position> moves = new ArrayList<Position>(); - + ArrayList<Position> moves = new ArrayList<>(); Position arrival; + // list of the 4 rook directions + int[] all_x = {0, 1, 0, -1}; + int[] all_y = {1, 0, -1, 0}; + + for(int n = 0 ; n < all_x.length ; n++) { // for each direction + int x = all_x[n]; + int y = all_y[n]; + boolean blocked = false; + int i = 1; + while (i < 8 && !blocked) { // continues "as a ray" in that direction until blocked + arrival = new Position(p.getX() + (x * i), p.getY() + (y * i)); + if (b.isEnemy(arrival, p) || b.isFree(arrival)) { + moves.add(arrival); + } + if(b.isKing(arrival) && !b.getPiece(arrival).hasBeenMoved() && !hasBeenMoved) { // Castling + moves.add(arrival); + } + if (!b.isFree(arrival)) { + blocked = true; + } + i++; + } + } + + // Full explicit directions version : ---------------------------- + /* int i = 1; boolean left = false; boolean right = false; boolean top = false; boolean down = false; - while (i < 8) { //left - arrival = new Position(p.getX() + i, p.getY()); if (Position.isCorrect(arrival)) { if (!left) { - if (b.isEnnemy(arrival, p) || b.isFree(arrival)) { + if (b.isEnemy(arrival, p) || b.isFree(arrival)) { moves.add(arrival); } - if (b.isKing(arrival)) { moves.add(arrival); - } } if (!b.isFree(arrival)) { @@ -52,51 +68,45 @@ public class Rook extends Piece { arrival = new Position(p.getX() - i, p.getY()); if (Position.isCorrect(arrival)) { if (!right) { - if (b.isEnnemy(arrival, p) || b.isFree(arrival)) { + if (b.isEnemy(arrival, p) || b.isFree(arrival)) { moves.add(arrival); } if (b.isKing(arrival)) { moves.add(arrival); } } - if (!b.isFree(arrival)) { - right = true; } } - arrival = new Position(p.getX(), p.getY() + i); if (Position.isCorrect(arrival)) { if (!top) { - if (b.isEnnemy(arrival, p)|| b.isFree(arrival)) { + if (b.isEnemy(arrival, p)|| b.isFree(arrival)) { moves.add(arrival); } } - if (!b.isFree(arrival)) { - top = true; } } - arrival = new Position(p.getX(), p.getY() - i); if(Position.isCorrect(arrival)||b.isFree(arrival)) { if (!down) { - if (b.isEnnemy(arrival, p)) { + if (b.isEnemy(arrival, p)) { moves.add(arrival); } } if (!b.isFree(arrival)) { - down = true; } } - i++; } + */ + // ------------------------------------------------------------ return moves; } diff --git a/MavenChess/MavenChess/src/main/java/view/BoardView.java b/MavenChess/MavenChess/src/main/java/view/BoardView.java index 2f5def4..a0579b8 100644 --- a/MavenChess/MavenChess/src/main/java/view/BoardView.java +++ b/MavenChess/MavenChess/src/main/java/view/BoardView.java @@ -3,7 +3,11 @@ package view; import javafx.scene.Group; import javafx.scene.shape.*; import model.Board; -import model.Pawn; +import model.Rook; +import model.Knight; +import model.Bishop; +import model.Queen; +import model.King; import model.Piece; import model.Position; @@ -11,58 +15,43 @@ import java.util.ArrayList; public class BoardView { - public static final int BOARD_SIZE = 16, CENTERED_ORIGIN = -BOARD_SIZE*7/2; + public static final int BOARD_SIZE = 16, CENTERED_ORIGIN = -BOARD_SIZE*7/2, BOARD_HEIGHT = -5, GRAVEYARD_HEIGHT = -1; - private TileView[] tiles; // contains all the squares/tiles of the board (visual) - private PieceView[] pieces; // contains all the 3d pieces (visual) + 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 - public BoardView(Custom3dModel model, CustomMaterial material) { + + public BoardView(Custom3dModel model, CustomMaterial material, Board board) { // creates the board squares, and position them properly tiles = new TileView[64]; for(int j = 1 ; j <= 8 ; j++) { - for (int i = 1 ; i <= 8; i++) { - createTile(i, j); + for(int i = 1 ; i <= 8 ; i++){ + createTile(new Position(i, j)); } } resetColor(material); // init/reset the board squares with black and white - // creates the 3d pieces + // creates the 3d pieces (from the board list) pieces = new PieceView[64]; for(int n = 0 ; n < 64 ; n++) { pieces[n] = null; - } - int y; - for(int color = Piece.WHITE; color == Piece.WHITE || color == Piece.BLACK ; color++) { - // placement of pawns - if(color == Piece.WHITE) { y = 2; } else { y = 7; } - for(int x = Position.a ; x <= Position.h ; x++) { - createPiece(x, y, model.get(Custom3dModel.PAWN), color, material); + Piece piece = board.getPiece(n); + if(piece != null) { + int type = Custom3dModel.PAWN; // we can't do switch statement on ".getClass()" + if (piece.getClass() == Rook.class) { type = Custom3dModel.ROOK; } + if (piece.getClass() == Knight.class) { type = Custom3dModel.KNIGHT; } + if (piece.getClass() == Bishop.class) { type = Custom3dModel.BISHOP; } + if (piece.getClass() == Queen.class) { type = Custom3dModel.QUEEN; } + if (piece.getClass() == King.class) { type = Custom3dModel.KING; } + createPiece(piece.getPosition(), piece.getColor(), type, material, model); } - // placement of rook, knight, bishop, queen, king - if(color == Piece.WHITE) { y = 1; } else { y = 8; } - createPiece(Position.a, y, model.get(Custom3dModel.ROOK), color, material); - createPiece(Position.b, y, model.get(Custom3dModel.KNIGHT), color, material); - createPiece(Position.c, y, model.get(Custom3dModel.BISHOP), color, material); - createPiece(Position.d, y, model.get(Custom3dModel.QUEEN), color, material); - createPiece(Position.e, y, model.get(Custom3dModel.KING), color, material); - createPiece(Position.f, y, model.get(Custom3dModel.BISHOP), color, material); - createPiece(Position.g, y, model.get(Custom3dModel.KNIGHT), color, material); - createPiece(Position.h, y, model.get(Custom3dModel.ROOK), color, material); } - // init graveyard empty + // init graveyards as empty black_death_count = 0; white_death_count = 0; } - public void updateAllPieces() { // updates all the pieces, visually, to the right position - for(int j = 1 ; j <= 8 ; j++) { - for (int i = 1; i <= 8; i++) { - updatePiece(new Position(i, j)); - } - } - } - public void updatePiece(Position position) { // updates the piece(i, j), visually, to the right position int id = position.getID(); if(getPiece(id) != null) { @@ -81,21 +70,21 @@ public class BoardView { piece.getObj().setTranslateX(9 * BOARD_SIZE + CENTERED_ORIGIN); piece.getObj().setTranslateZ(-y * BOARD_SIZE*0.65f + BOARD_SIZE*4); } - piece.getObj().setTranslateY(-1); // place at right height (Y axis) on table + piece.getObj().setTranslateY(GRAVEYARD_HEIGHT); // place at right height (Y axis) on table } - public void createTile(int x, int y) { - // creates a tile and inits the right size and position - Box box = new Box(BOARD_SIZE, BOARD_SIZE / 2, BOARD_SIZE); - box.setTranslateX((x-1) * BOARD_SIZE + CENTERED_ORIGIN); - box.setTranslateZ((y-1) * BOARD_SIZE + CENTERED_ORIGIN); + public void createTile(Position position) { + // creates a tile and with the right size and position + Box box = new Box(BOARD_SIZE, (double) BOARD_SIZE / 2, BOARD_SIZE); + box.setTranslateX((position.getX()-1) * BOARD_SIZE + CENTERED_ORIGIN); + box.setTranslateZ((position.getY()-1) * BOARD_SIZE + CENTERED_ORIGIN); // sets the tile on the list - setTile(new TileView(box, new Position(x, y))); + setTile(new TileView(box, position)); } - private void createPiece(int x, int y, TriangleMesh mesh, int color, CustomMaterial material) { - // creates a piece, and inits materials, drawmode, scale, and the right height (Y axis) - MeshView obj = new MeshView(mesh); + private void createPiece(Position position, int color, int type, CustomMaterial material, Custom3dModel model) { + // creates a piece, 3d-model, materials, draw-mode, scale, and the right height (Y-axis) + MeshView obj = new MeshView(model.get(type)); obj.setDrawMode(DrawMode.FILL); if(color == Piece.WHITE) obj.setMaterial(material.get(CustomMaterial.WHITE)); @@ -103,25 +92,20 @@ public class BoardView { obj.setMaterial(material.get(CustomMaterial.BLACK)); int scale = 16; // scales the 3d models to a wanted size, to fit a board tile obj.setScaleX(scale); - obj.setScaleY(-scale); // Y axis is down (not up) in javaFX, so we need to reverse object - obj.setScaleZ(-scale); // we reverse Z axis too, "to keep the orientation of the 3-axis vectors", (reversing Y and Z is equivalent of 180° rotation of X axis) - obj.setTranslateY(-5); // place at right height (Y axis) on board + obj.setScaleY(-scale); // Y-axis is down (not up) in javaFX, so we need to reverse object + obj.setScaleZ(-scale); // we reverse Z-axis too, "to keep the orientation of the 3-axis vectors", (reversing Y and Z is equivalent of 180° rotation of X-axis) + obj.setTranslateY(BOARD_HEIGHT); // place at right 3d height (Y-axis) on board // if color is black we rotate if(color == Piece.BLACK) { obj.setScaleX(-obj.getScaleX()); obj.setScaleZ(-obj.getScaleZ()); } // sets the piece on the list - Position position = new Position(x, y); setPiece(new PieceView(obj, position, color)); - // updates the right board-tile position x, y (corresponding to X axis and Z axis placements) + // updates piece on the right visual position (corresponding to X-axis and Z-axis placements in 3d) updatePiece(position); } - public TileView[] getTiles() { - return tiles; - } - public TileView getTile(int id) { return tiles[id]; } @@ -134,10 +118,6 @@ public class BoardView { tiles[tile.getPosition().getID()] = tile; } - public PieceView[] getPieces() { - return pieces; - } - public PieceView getPiece(int id) { return pieces[id]; } @@ -155,24 +135,26 @@ public class BoardView { for (int i = 1; i <= 8; i++, n++) { // resets board with black and white - bottom left (first case) is black, then alternates if((i + j) % 2 == 0) { - getTileObj(n).setMaterial(material.get(CustomMaterial.BOARDBLACK)); - getTile(n).setState(TileView.NORMAL); + getTileObj(n).setMaterial(material.get(CustomMaterial.BLACK_TILE)); // (visually) } else { - getTileObj(n).setMaterial(material.get(CustomMaterial.BOARDWHITE)); - getTile(n).setState(TileView.NORMAL); + getTileObj(n).setMaterial(material.get(CustomMaterial.WHITE_TILE)); // (visually) } + getTile(n).setState(TileView.NORMAL); // (on 'state' attribute) } } } public void setColor(CustomMaterial material, Position position, int type) { - getTileObj(position.getID()).setMaterial(material.get(type)); + int id = position.getID(); + // set the new color-type (visually) + getTileObj(id).setMaterial(material.get(type)); + // save color-type in the "state" attribute of that tile switch(type) { - case CustomMaterial.SELECTED -> getTile(position.getID()).setState(TileView.SELECTED); - case CustomMaterial.MOVABLE -> getTile(position.getID()).setState(TileView.MOVABLE); - case CustomMaterial.ATTACK -> getTile(position.getID()).setState(TileView.ATTACK); - case CustomMaterial.SPECIAL -> getTile(position.getID()).setState(TileView.SPECIAL); - default -> getTile(position.getID()).setState(TileView.NORMAL); + case CustomMaterial.SELECTED_TILE -> getTile(id).setState(TileView.SELECTED); + case CustomMaterial.MOVABLE_TILE -> getTile(id).setState(TileView.MOVABLE); + case CustomMaterial.ATTACK_TILE -> getTile(id).setState(TileView.ATTACK); + case CustomMaterial.SPECIAL_TILE -> getTile(id).setState(TileView.SPECIAL); + default -> getTile(id).setState(TileView.NORMAL); } } @@ -180,19 +162,19 @@ public class BoardView { Position position = clickedPiece.getPosition(); board.setSelected(position); resetColor(material); - setColor(material, position, CustomMaterial.SELECTED); + setColor(material, position, CustomMaterial.SELECTED_TILE); ArrayList<Position> moves = board.getPiece(position).getAvailableMoves(board); for (Position move : moves) { if(board.isFree(move)) { - setColor(material, move, CustomMaterial.MOVABLE); - } else if(board.isEnnemy(move, position)) { - setColor(material, move, CustomMaterial.ATTACK); + setColor(material, move, CustomMaterial.MOVABLE_TILE); + } else if(board.isEnemy(move, position)) { + setColor(material, move, CustomMaterial.ATTACK_TILE); } else { - setColor(material, move, CustomMaterial.SPECIAL); + setColor(material, move, CustomMaterial.SPECIAL_TILE); } // promotion if(board.isPawn(position) && (move.getY() == 8 || move.getY() == 1)) { - setColor(material, move, CustomMaterial.SPECIAL); + setColor(material, move, CustomMaterial.SPECIAL_TILE); } } } diff --git a/MavenChess/MavenChess/src/main/java/view/Custom3dModel.java b/MavenChess/MavenChess/src/main/java/view/Custom3dModel.java index 7ec0d34..d27fa5a 100644 --- a/MavenChess/MavenChess/src/main/java/view/Custom3dModel.java +++ b/MavenChess/MavenChess/src/main/java/view/Custom3dModel.java @@ -10,7 +10,7 @@ import java.util.Scanner; public class Custom3dModel { - private TriangleMesh[] model; + private final TriangleMesh[] model; public static final int PAWN = 0, ROOK = 1, KNIGHT = 2, BISHOP = 3, QUEEN = 4, KING = 5; @@ -37,8 +37,8 @@ public class Custom3dModel { TriangleMesh mesh = new TriangleMesh(); mesh.getTexCoords().addAll(0,0,0,0); // setup empty texture UV , we import without texture mesh.getPoints().addAll(0,0,0); // adds a vertex 0 (because files .obj start from vertex 1) - float min = 0, max = 0, y; - ArrayList<Float> vdata = new ArrayList<Float>(); + float max = 0, y; + ArrayList<Float> vertexData = new ArrayList<>(); try { URL url = this.getClass().getResource(filename); File myObj = new File(url.getPath().replaceAll("%20", " ")); @@ -51,9 +51,9 @@ public class Custom3dModel { if(y > max) { max = y; } - vdata.add(Float.parseFloat(data[1]+"f")); - vdata.add(y); - vdata.add(Float.parseFloat(data[3]+"f")); + vertexData.add(Float.parseFloat(data[1]+"f")); + vertexData.add(y); + vertexData.add(Float.parseFloat(data[3]+"f")); } else if(data[0].equals("f")) { mesh.getFaces().addAll( Integer.parseInt(data[1].split("/")[0]), 0, @@ -63,17 +63,19 @@ public class Custom3dModel { } } myReader.close(); - } catch (FileNotFoundException e) { + } catch (FileNotFoundException | NullPointerException 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; - for(float v : vdata) { - if(n == 1) { - mesh.getPoints().addAll(v+max); + for(float vertex : vertexData) { + if(n == 1) { // only for Y (in 'X Y Z', as '0 1 2') + mesh.getPoints().addAll(vertex + max); } else { - mesh.getPoints().addAll(v); + mesh.getPoints().addAll(vertex); } n = (n + 1) % 3; } diff --git a/MavenChess/MavenChess/src/main/java/view/CustomCamera.java b/MavenChess/MavenChess/src/main/java/view/CustomCamera.java index f4eba9f..6aef910 100644 --- a/MavenChess/MavenChess/src/main/java/view/CustomCamera.java +++ b/MavenChess/MavenChess/src/main/java/view/CustomCamera.java @@ -10,12 +10,12 @@ import javafx.scene.transform.Translate; public class CustomCamera { - private PerspectiveCamera camera; - private Group group; // used to rotate camera from 0,0,0 and not from camera x,y,z + private final PerspectiveCamera camera; + private final Group group; // used to rotate camera from 0,0,0 and not from camera x,y,z private double anchorX, anchorY, anchorAngleX, anchorAngleY; private final static double SCROLL_SPEED = 10; - private DoubleProperty angleX, angleY; + private final DoubleProperty angleX, angleY; public CustomCamera(int nearClip, int farClip, int fov) { camera = new PerspectiveCamera(true); camera.setFieldOfView(fov); @@ -29,10 +29,6 @@ public class CustomCamera { angleY = new SimpleDoubleProperty(8); } - public Group getGroup() { - return group; - } - public PerspectiveCamera getCamera() { return camera; } diff --git a/MavenChess/MavenChess/src/main/java/view/CustomLight.java b/MavenChess/MavenChess/src/main/java/view/CustomLight.java index ab79cb2..dddfbf4 100644 --- a/MavenChess/MavenChess/src/main/java/view/CustomLight.java +++ b/MavenChess/MavenChess/src/main/java/view/CustomLight.java @@ -3,14 +3,12 @@ package view; import javafx.scene.AmbientLight; import javafx.scene.Group; import javafx.scene.PointLight; -import javafx.scene.SpotLight; import javafx.scene.paint.Color; import javafx.scene.transform.Translate; public class CustomLight { AmbientLight ambient; PointLight[] light; - SpotLight spot; public CustomLight() { ambient = new AmbientLight(Color.rgb(35, 35, 35)); light = new PointLight[3]; @@ -20,12 +18,10 @@ public class CustomLight { light[0].getTransforms().add(new Translate(-100, -50, 100)); light[1].getTransforms().add(new Translate(0, -60, -100)); light[2].getTransforms().add(new Translate(100, -50, 100)); - spot = new SpotLight(Color.rgb(255,0,0)); - spot.getTransforms().add(new Translate(0, -50, 0)); } public void addAllToScene(Group group) { - // PS : javaFX have max HARDCAP of 3 pointlight/spotlights, and 1 ambient + // PS : javaFX have max HARD cap of 3 point-light/spot-light, and 1 ambient group.getChildren().addAll(light[0], light[1], light[2], ambient); } } diff --git a/MavenChess/MavenChess/src/main/java/view/CustomMaterial.java b/MavenChess/MavenChess/src/main/java/view/CustomMaterial.java index 8acfa80..0302968 100644 --- a/MavenChess/MavenChess/src/main/java/view/CustomMaterial.java +++ b/MavenChess/MavenChess/src/main/java/view/CustomMaterial.java @@ -8,8 +8,8 @@ public class CustomMaterial { private static PhongMaterial[] material; public static final int - BLACK = 0, WHITE = 1, SELECTED = 2, MOVABLE = 3, - ATTACK = 4, SPECIAL = 5, BOARDBLACK = 6, BOARDWHITE = 7, WOOD = 8; + BLACK = 0, WHITE = 1, SELECTED_TILE = 2, MOVABLE_TILE = 3, + ATTACK_TILE = 4, SPECIAL_TILE = 5, BLACK_TILE = 6, WHITE_TILE = 7, WOOD = 8; private static final int MATERIAL_LENGTH = 9; public CustomMaterial() { @@ -18,18 +18,18 @@ public class CustomMaterial { material[BLACK].setDiffuseColor(Color.BLACK); material[WHITE] = new PhongMaterial(); material[WHITE].setDiffuseColor(Color.WHITE); - material[SELECTED] = new PhongMaterial(); - material[SELECTED].setDiffuseColor(Color.rgb(50,200,100)); - material[MOVABLE] = new PhongMaterial(); - material[MOVABLE].setDiffuseColor(Color.rgb(50,240,0)); - material[ATTACK] = new PhongMaterial(); - material[ATTACK].setDiffuseColor(Color.rgb(200,50,50)); - material[SPECIAL] = new PhongMaterial(); - material[SPECIAL].setDiffuseColor(Color.rgb(120,20,255)); - material[BOARDBLACK] = new PhongMaterial(); - material[BOARDBLACK].setDiffuseColor(Color.grayRgb(64)); - material[BOARDWHITE] = new PhongMaterial(); - material[BOARDWHITE].setDiffuseColor(Color.grayRgb(200)); + material[SELECTED_TILE] = new PhongMaterial(); + material[SELECTED_TILE].setDiffuseColor(Color.rgb(50,200,100)); + material[MOVABLE_TILE] = new PhongMaterial(); + material[MOVABLE_TILE].setDiffuseColor(Color.rgb(50,240,0)); + material[ATTACK_TILE] = new PhongMaterial(); + material[ATTACK_TILE].setDiffuseColor(Color.rgb(200,50,50)); + material[SPECIAL_TILE] = new PhongMaterial(); + material[SPECIAL_TILE].setDiffuseColor(Color.rgb(120,20,255)); + material[BLACK_TILE] = new PhongMaterial(); + material[BLACK_TILE].setDiffuseColor(Color.grayRgb(64)); + material[WHITE_TILE] = new PhongMaterial(); + material[WHITE_TILE].setDiffuseColor(Color.grayRgb(200)); material[WOOD] = new PhongMaterial(); material[WOOD].setDiffuseMap(new Image("/wood.jpg")); diff --git a/MavenChess/MavenChess/src/main/java/view/CustomScene.java b/MavenChess/MavenChess/src/main/java/view/CustomScene.java index 974c03e..30def40 100644 --- a/MavenChess/MavenChess/src/main/java/view/CustomScene.java +++ b/MavenChess/MavenChess/src/main/java/view/CustomScene.java @@ -7,7 +7,7 @@ import javafx.scene.SceneAntialiasing; import javafx.scene.paint.Color; public class CustomScene { - private Scene scene; + private final Scene scene; public CustomScene(Group group, PerspectiveCamera camera, SceneAntialiasing antialiasing) { scene = new Scene(group, 800, 500, true, antialiasing); // create scene scene.setFill(Color.rgb(50, 50, 50)); // background default color diff --git a/MavenChess/MavenChess/src/main/java/view/Desk.java b/MavenChess/MavenChess/src/main/java/view/Desk.java index 78565b7..06def99 100644 --- a/MavenChess/MavenChess/src/main/java/view/Desk.java +++ b/MavenChess/MavenChess/src/main/java/view/Desk.java @@ -4,11 +4,11 @@ import javafx.scene.Group; import javafx.scene.shape.Box; public class Desk { - private Box desk; + private final Box desk; public Desk(CustomMaterial material) { int table_size = BoardView.BOARD_SIZE*12; desk = new Box(table_size*2, BoardView.BOARD_SIZE, table_size); - desk.translateYProperty().set(BoardView.BOARD_SIZE/2); + desk.translateYProperty().set((double) BoardView.BOARD_SIZE /2); desk.setMaterial(material.get(CustomMaterial.WOOD)); } diff --git a/MavenChess/MavenChess/src/main/java/view/TileView.java b/MavenChess/MavenChess/src/main/java/view/TileView.java index 31a1646..d92276e 100644 --- a/MavenChess/MavenChess/src/main/java/view/TileView.java +++ b/MavenChess/MavenChess/src/main/java/view/TileView.java @@ -5,8 +5,8 @@ import model.Position; public class TileView { - private Box obj; - private Position position; + private final Box obj; + private final Position position; private int state; public static final int NORMAL = 0, SELECTED = 1, MOVABLE = 2, ATTACK = 3, SPECIAL = 4; diff --git a/MavenChess/MavenChess/target/classes/controller/Main.class b/MavenChess/MavenChess/target/classes/controller/Main.class index 7e602f090202b3207e258b6d0ef9a9e73c90bf9e..1021ecf5800bb5235d0702489ee5928b761d82ea 100644 GIT binary patch delta 786 zcmZXRO-NKx6vuyeX5P%a5696`e2SPdQ0bItqBN5<jkYn#pb&~FDl`f+DX2Dq5blDY z-X;*rgfcVpV`?n5T4~uLDp~|BN?NpO(V|Ulrt@YtV(-Dd=UmSJ<DBy?@;x&B*VAbB z5A^h&txpb|xX@$JiZ{R>Md;F*-pl#NZix&Mv{`7hD|R}i-r9|wYhdxM-EKic`lz={ zsYH6xmvpaRTAy4_D$ps(c%aHtqMdYA6a{P1&XQh}&gxO0GM#9sO7Fu@0jL7!Q0R2| z9J^!s0*S+Rz}9Sij%3WRjcpnBI-f$-`;8JaLn>z3)-n~gmErg-r))z?EnA<b4>Ft^ zGSyi2y|>vcF~f;bYV92Ayo<_kaSgy}E36wVmNqwFQi?5qHRUu?Nt{izOV&YzgKXv) zTj-&VeztRkdalyMHCnhuj8UncU>DOe&Nq_3BgtplSQUmp5@+d9LG~$&PDVg5g;HP1 zJ?>)-GRzLfcpw&5DPx?6SbPwf{F@AhyCNZ<L=!whiOt_k@)(a8{K=FEd&Tq@W|+k% zW<HYUiMu^kcq$X|OAGVN@r-~pGR1Srg3`(e3zRLQOGh_&!AlHYiB2<GmSJZoTqElo z3&*uC!5wgZgsU2k2)`yJ!P>g0Eam!)#2)U*=@(y!;)tA0`5Kqfi5FE2F0d#L1;rA} z_`(LSWl)OS^0tog=6c4~^^AgXncNOt#b9oXo?P_5&I)f){+v*&^R=ivkhj_5_=;2i E0Jn6a3;+NC delta 761 zcmZ9JO-NK>6o#KWGuP|AbDbFjYi>3T6Bgx6*&k8bkj{*onhLT6LnK2Z`#}uKrEMdK z=mSX?{Xzd}>eRK=YL&GRY8A9Ha2K>`Q4mO-JGPKn-0z(4eD68$`<}Z{^Q~s=k8e%r zQcrh(U8cA5LRYI~7HJx7bec3$D&?<@ZEE#u+YE9V!SlUc-RG9j7Fqm-GycPxmM%;M zGG18J&q`1|MqVzi5%;MdX1q#2=}p(D$S-Rzm{wgt3#&b$xY<J)6`%!GXXtd)F&ur8 zef6eeZg$B`lWm)%x!zI>p+wBA3c9q{+m1a;wPU-SnBbISI=W*!mP&-3Xc5upAzUsl ze>@US4y+Vss|d0hhZqUgvR%#wYRIvk{cNO#BpsyaqK-bc($5Yqvzse|8l;gsH1U`W zqhfzn?sL-hg#*l!=eOjG9M#G=rdhNK7H$$2e2n`%z#d>o#y#YbNSG%o4^Oc9#Fqax zSpj#sCv9H#lxJun^d}=i=M$mddCnMq5&e~MCJ2bA&lGqewsL&nC9bTpg;z|<XNZvz zUNc3xSQ%!T=nST~xyl>fV)0IRcA@`eNU6v=Evwu}gWe{6$JMV$e4s<->jEjSO{U~e zTpO3%$89++iEvPmhl(b5F5!e>M(Wa0)T9+N&!dMfFOvF;*?U=CAYzH)kK*u_)JnK+ x2$#BEX;d#U<%FrZlu3<NR{O<>nyYj+G|5&x7PB_#GUzf~Dt503NGoGS`#)umnb`mU diff --git a/MavenChess/MavenChess/target/classes/model/Bishop.class b/MavenChess/MavenChess/target/classes/model/Bishop.class index 398d50bd457f077c36e29485a75dfac67ee15440..832b9497d29b38de2956a0abe0267ae57755b1ad 100644 GIT binary patch delta 632 zcmY+BO-~b16o#Lf&dlvhE220`tpr1G;|CZLN3EY#K#@o>#>Jop6>20_@gp%37j?nH zt(lmpJBW!%R|JhDV)y~N;aBK?aAAF0O~uLFd(U~#d!Ku5?(0q8GJC%M`n(35WHi7g zWpJ{%covy^v(x2D|M*OKs{FF|hht_Q4}EC2LM#8&!kV)%w<@z!cgxetCNyR=?k7EV z)ZyN&R3>GzuZ~zWler|ZFN<AFzT4|nACHXATwcY*EBF`9mmp3#rP$GM?NaR7rGnEE zB{W5+RB%&~7kW8oZILHAC-nLvlXDwOIu-d&6of&0dXX!k|CaGpvhm)Jw0&Y*Xu{ym zjXz0e=%*Xm3i+{Q!Rf8~^MUogUYqwczu3Q|z8nr{9%hT?HqvaRiw*_|Il*=Y*}*8C zjFICKJGoAtD!WMJdP6r0?B*Rk)Z|}cf<93m=)P6<aY&q$2)BvEGvZ8EIjk@(+%=AH z6kpJog0w*PXB<=H39(E+2eme$<7&jxo|>NRlwPfiSDdD(#s_%L8AUE<<;=ERgK`Z? zd5EbCYYdwW-9{}uG7RgtpstH#{uTb}mcB-<xS?jq{#SK_x=!2xZ83jJKc{nT&a0P^ HW^~~<{d8fT delta 743 zcmZvaO;1xn6o#L3d%s$1A;Bt!n1({70r}ACMS=R!f+7Z#)Q`YMO$u6rEh!pITy(8F z(}l*ka^sdn1BoOgZgru5Kuz5E4_q1QDYe!bCpR-^<~;Mh=g!QBUC(xRzu$hl1)O9u zfPv4!3}RsmfxCt5!qVWSo2&UJvG10fTbaneZk4c<(?(*{PTw!C6pDi61ZQbs@!sXa zvd-oOx0t(iyEb*JiSfc}Uhwa%R^##`BUAore7gQojRGK7HgV=Q@K0|Noa=o<Xq`Q^ zp?!mn5!3W6pJ)3#$LF~|&mXp0-Ivn&7aX>3{N^>%Ei+;JIS0zaW_Q$X!m|HhP91Za zu!dT8N6oEcZWGo}t6}~ccCcj0tL-m`*7R6S`n7*dRQncO+K3R=*<NDoBThSg>}P-u zj%j9=POfV94qYtM!viHAGQ?93^MWI+kzgH<Erxl=7@tY<O|R|;r}#-qOw!^oS&}Z! zOPnbg<AS7^ktr_9G#SZoP0e6Y&wW-5HEqLJy#WT*Mw>>Sit8mRf1DHgBqHK5qMS)o z5{zmY7BLx8`y@7T>DL01IP^)cmXXw-EDcBxr#19*Mm2+f<Wee^)|Gie6|E!S(Bcqr obhATHstqb?(MafeBV`4S*1t;i>HKdy;}BAt2{k>dRtD#O0m@c;M*si- diff --git a/MavenChess/MavenChess/target/classes/model/Board.class b/MavenChess/MavenChess/target/classes/model/Board.class index 50215dddae1418b33ede47485b465cdb3d5f4022..1407815545854fd1dd5a89e16d2f19e127a9ecb9 100644 GIT binary patch literal 3363 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 NwQ%Uq*@*zI{Rgt`F600J literal 3248 zcma)7Yfn^H6kTWDGY&8Uf-nOpYGno$6dzT`7l<+i0UgCxwO;WSE)FwvX7JJ4M_Su2 zO}{p&X`*S9+B8kAq+(Oker?h}(|$H>?b>JVTm~!&BzNxF`|h*X-fORO_~YMSegkk2 z?}y-m+Ye6|UicIuQ^pOWD`R9Qx<;-}nd3zTU((82#e)j&j`&y*0R;UBg|P}@g;mqJ zYi6daH)rIpDFg~;hFeT7BSWPxqq%}rv~t<~epEZ*qn0^tN~TB{t5Hjc8SxYpsxOxJ ziG!Q!>06vB#C;86G-56Djpt3HXzF|l{*Dy?;$tCHp*f5wVvLwDi{%;=YCGcP{N=hr zs6%TQZCIz^WpL`KZZzdbyF#c0eJYo`E^!-$q)m(?kie|RX7O|=)ORe+s{;Z^gwcsD znwp|rX2glrJ;ulU*rpIJK@DcDiOFIJTd~=X?T)+GDoo~PLg*IvPKU^ov!<C1p+~%X zoN@=P>_iB=#ktRMjv6-^xfh#-zXM^8{t&AYcBBf0Hm9mGGY(a{Od<717`^BtdZCik zx|es7n>zG|aSX>5f>xm~m(Oc0{ZH%#DJT`jYZB|T3di!MDPTikoRFbNjeWUHE-y+Q z31bu|ZD+<PP%?F#>4Iqc#JOL=GkWCgu!2e{RQ2Vug`$xyjv1L*(@oif-%pK<49Z#& zbZ|IzeBiWLE?T{*^uWldSZ<E`<eC2dVKF@1G?*GbE^9B>eN?_e&5)Hfhi9j+n)%bl z)eJqgL%DGyGiKy1v2CZaSj#P@8<$SFyEtjF_9|O7`uwnJb(_9)(HOse!kDqQdiB{@ zh}H9AY+%M7lw`X-LuAo<df^0CSoVx-7UZvITAJj-7B$0ZP3LZu57dU2Cc9MS@i7vX z%UcsxmgmpN=dBw?hAXSkn_(Avb#~G!vbum(=+9=&X|}k6yce_<M9F#~>ZO#^x!L@< zdCU@?Lz=X0GI}1w0L20RHsKV~obPE`E}Wq~R$-r|eXhbjPy0fJeUbL-74{|Cmn-Zy zn3ETl&dvLe?`mT4;^glYYUxw1J@h_GJcUZAC-5gChkr%Y6V$kq(a7Pi5J~)mny5<O zRqEl3zuZaBftcq$0x|Cc+=+P}AmB|tgfHSxdJeWk0$*cwq9q!0&tuJ9H#hvLLp(Yp zkW6@@F%Lf_ywR9f-o9weCvSf==9hOM8VkrfQvML(7abYlC)s+}#jGDZX31_C{C$%R z10goC3PCnl%LbcKLxQWZnXSj^*@b!>!Wv!$4Lr1sB)oy7HsdO9ToW-&qXn~Q#k;&z zKgK$I#@(Nz9rv*T-*W#C*u+?1C&{YkJu$8cKFakquH3vYKVqJ=9_S-hG{M+7KEb4p zvuJI^suv7*`4LdSbJYIBqpE^I*WWzO&ruh2J;wk?!kf1=7+yqfov&Kx@0>@|JX$)_ z(zi?ZEq4ph!D}b3YilS)+vqapDO_hRCHJPC^B`knSIExUvg1c5p9lg(mp)6mLQbv_ zGGtbA@qbt;m+FF_Yyfj>Jm2w!dwe8=_}cmG<8zA76rT?h&#?adGt`}r#-3tB%Tv5E zkN88}qJQfmf0y=Op}%{Pe~0!D(BHGjzf1eO>EFG`|El({rGM`t|9<)xwA0Sx2Xt{d z-AH0PkKhh=+Jn2C^p{l4W9)I}&Q2XZ=Jed9+c`aB;dD+bK(5+3>M2b<%G`tSZ)}vm zdXkf+)byz%q>xFnI0*mJ8SK-T!nd$lQj<asGxp{l&QQJu6S8|A$)yPnR3r#G3Eo1V zouDiOU!s%eeW|355VW^K20o{4AM&;g3MksS3Y4kbAJGIgnjGG`WgdqUTgh@+VyZ&3 z4O$)jynK%Fv>r!<nr}u*gC$C79Iz-)WQl_)ZgAz|t~FZIZbI{4uU)`7ThmRQKjY{Z zs4L^{_#J-FLwMZZv%1n%QIhyjMQ=?GT$A0K49yEy<6#-lO$X(YjnXP@4%|bd12d07 z?}KHaMk=6M9jMmDP%#a4Yh_TL<)G3lhq{foZSHQ97*T9@iMxc|Tzh46vgS}*cmfCS zFVp8)4Zg0F%jvV*?vwfTEM59Uklby$<9D2nFWcm{+4yTK@P})6f3pngg^HHj9MrbO Y?6zpEJ1fN6yByZ#m1Dh2LS1<8KV1ti&j0`b diff --git a/MavenChess/MavenChess/target/classes/model/King.class b/MavenChess/MavenChess/target/classes/model/King.class index 2b7365022be2e1d12fc9d6144b60ef72220043f0..d65b114ff0c54a6ee0ff7a82f114683e338e82a4 100644 GIT binary patch literal 1807 zcma)6O-~zF6g|%#&$G=CoPd+Kp#=&_Y|K|b;-;9;LISNDgA+(FCQ_ThjL49|L&pY% zRaL3m{(!J+H(6C`qzI&>%C4I(y6z9?pJ-H-o;S9MFsW3`yt(h(`_BD*^V>hqUjmrK zaufjsB{Tye=mKq<?waL{-m<N-C7@5(6}vVm(3Q+L6mHe7*={A9OD#!+1v)p(9dmTM zW;>%(o@egn?P@IwiKrrM69^`iVY|So;{*|OASQ9zz!`K3MC;m{c4b{aYzf3#9Y$dw zZs07=325t9ZQ19}DL7%^ttMPjK(})Kwm>MEW1La+pjV>Lz`N)_N^#mXy)^-8S7$2L z=B_~hi5y!)NUbQUiv}*?GK*tZXFZEm>O65!8A_xK3?j`i%{4lTC-Z)(9J8`MT3Fq% z%C&52MU`RLzz9YKj0a|Q+OjHh?vBL+!uR%`f%hBU7F_qC3gANnSCA11vkHwy^_&c$ z8NBLbR(1KRa`UlYwH21|IvXv}k+&<>{PyOm<=rt?9U^D)ZrOB}OwU&P2B_5@*i}Z@ zAXRP3vb<&2aXm(w6FALarglu*QKwV}G#_Y2<<~l!su$q+tdK@L;==|=)AQ^d)8Ved z>^!Dhw5qj+IAbbNtO~R@qNuYnjLo{c_<!(+Ovm|(J_7d`r@x`Iv&Yli-D;+K`AsYn z&1yEsf0A*xFV@WR!#Q)yFOtN(KxENgub8!MkA=+qkL=&b8(nm_y|OiHt9C?Gtw+@4 zppUZ>;H?E$CIX%7ICnV&`2*x&y88g)sc(?ws=5wDXc)x=rQW(3uJPilKdJ5>NtE;n zKJ{s*FwHk<1Aov(1Q6f8fGiy#G8YT~5-kOTg_5QfN+CWvAIW_<P$<Q8wa7qWT&vqr z=i5=QRMa%=2*jjT7!L(AdR$LvFMq^bLW}Do8JP&FSNH{t(%>_k+DBJh-mgpN<Kg=U zxG<j{uJ7O3LtA=y9|MmO8R9!x{7x574xdsxw1?jnh1NL9W8-={q3>htF_wMdgMECo zhkRO@g<hNabQvGjThLw~l`Uv=NYN&XiYFF+tsIx>g!KL0@P)d+t3F4pm87o@w|XQu zDU!vZpV=S{s-a)v9M=wn*|srsVVR%9GO-Pu$Ja>UdwvIhzy&-Z{uA5%j5G5qzj}Y7 zAFnVVVz?-}aY^(eDXt(T?qX0l{6sy%koX2ge@M2_M!svf&Vi6*&EN*5Fu8j%L%%`X z!vbcB>EwQn&xq+{`vRX+l4@X@14b!FoEKQ^;wJJOtTAyLbC_p7%OZsWr4Vj0C*#QK zHmw$jl%OBdm6Yg^=#gZWSmZy)^^k!?j&KR1p%K*mh0vk88%OHKG2m}()ASWN?~p!# LyL7qaOT~WyZ*zWb delta 602 zcmZvayGjFL5QV?l?7A_82pUBpMg;}U#ap8Bekm+0Y$6JF3N}KpNWjLzMl2QFRz&dy z6f_Y7K7d$=_!Pc_;_%1FiZZZscFvsnchCGMk*jd%>GR<cm}BuWBu;Rrw6yC*WdGDU z_8zQE(A_E)clNdlr-4;(Jy1GGY40)t4R905SOvLJXpz=uNHYX!ppijE-L*D`7}hrx z&`b+r&<La2Eo8`Q*0I(Z4mQYJ6?daT<4TqAM&g!8nP@Gw+uohs75%5a?Un7gpRhN- zC4Y!*AJOU?W!DLF$S<Zo%P?*KYRm`xqJBh%YVoQ3KXZ_}Ry%BCU!JJqCN(gs*0nN4 zJ9#=N5aW<e&b3;mhZlNzr%!D9CC-3Mkdi!UDKIQYjK~EUxhE^HOqew!YPQzbAa9H@ zuGR<TnYElYS#--Sle(LL9tz=aGRL%XGg^t!{6W^mbqPC36KSUwNrzeOu=ENE^9C(^ E0hNkt^Z)<= diff --git a/MavenChess/MavenChess/target/classes/model/Knight.class b/MavenChess/MavenChess/target/classes/model/Knight.class index 09ed6279d228976b0614f6977c88b26d6efd00ac..a2fb5a72f9b96f88fa01675125be2b18fe9d8c6b 100644 GIT binary patch literal 1389 zcma)5U2hvj6g^|_?)YQVxJ}&FG|=zX&X*xTfH<V2r70Fp9W_;pOQd$=tlTM^-Dtgz z$RiSeppWo~gm~bEsHl-B^at>dcxgDZ>sU%!BxKL*+<VVG_ujL!f4}<UC4dEdkwXe; z3B!g7OCY})Y`9)^MY(NPz?xUSiWUS$%Z+{@=&DEseyv`)Cy@~tdE#t4)n25$>S7o= zI}O#1a*)Vr!n{Dbtbs!U#|{%@F^q!5aT_NvB48)cFMZW{90`amfx^*}IoK%LIEhmN zM#qi5irMShU9$1kfxD$0W4ip?0%p0+PIEYma}wumT)@S_kk<nz+z^ned((F}cLXlJ zHs#S4Di1W(WgAy;mGY?WQs`2rk=GJ6P@-aE920EQ*<hh!xe<%yIew?wTz}%Wqgv$w zXSqSm1%?~ScW?JL*WK{0v+mJzq7k$m@17GXZTFo<^jLK%XTP;Xu^K0B2VM|Ty1Kw| zs<XK5C{O1t2iq<aE*<n3k6o)Iy&QgVq!Hh8Q48sWq1tvlT0Ymhz)-(plFx#h332g1 zm`um>9+EBfH9Lw8(w;m#($3bwSXbY~GJjP61$H>J8aeH6mYuCw5D8w-?5gVcPSgu2 z+U)<B^NqZ@)u0!)-6f@^&nLQ0>lcReysIgGF5u2lU~!+MRY#gXK#ot0?Lq9ufGO_! zqXM!7<}l6ExdetP-lfF^ed$S}Pw!zSrhOkD@JU+n7fWOrd-ejdwTJ9-A@gUhl{T6! z!)&%pE{kWGYPK?kSIt(zig(&`MuH^5Ai^Xfj!6y3&?@M}f;5|RW_s2tS|#J<PgpJ) zMQeIimQ4M~ynx*r{~gDkW3(tAC8yKH%%eS=xjiwJ*zf#^{KV9AT>1goNj}T>zqiCM z`@56Bv26odf@$Qr7m&dy2P|R@r_jM^_$Z;rkM$|e;Af2CSNeCc63ev4v3-1s51Ao} zn&oeX3{NTGM-(iLhq!}}>9e#v1391J6U<T04B2X!r;IcBjywzOWexXnjVBYIF~=UD z7Kyq}&kBrv(n^V8iL;V*C2sJ~m$Q$X$PWAxc0VE*`v>N}z6pbHKaGr^bETLnuoRze F{R?vYBZU9} literal 2110 zcmcgt&2JM|5dY2Y+8aBY5J<vjfY7AHb`l&Qd^#i~fdmUD4GK+3)B`W}HaysPqxB|; z1HDvSI3V>_IKe4MTv`c8)ksK4oamvKp1E=BA5c|o)p_1^K7dL%hiav_@6FC{<~K8M zW?%pF^9uld7>PrJZo;q-L6i`ma|^bU9v3%@glMlUO23cLl*om0w<LY(7Bku8q=_0r z<8`qp(hI(H(gU6+ZslajkHbV<*{db!iR5Gqb*MM7#X<wN60E?~#iE?O<`W`$*Ks`p zWlb~^YC}iT&f6xM3H2L2D`Pt>?8GjH%o7^kWfn&h_E>1aUV<@e`&Y^&vP!()LTg1l zr39ZSmTk--k>!At<Wmcu;UFO<OGB>b*?DHz_+IqM={S-|ndq?4snkQ(gRbxj1XGp< z9g)AGlnz-)D~+fu4STk&a&y?i5gcV&qQJ_{iCj5{jwsHiKcBhIE;Gq#=03!gAZ*FW zqCK`SH)DI3#f-y}Z8<kDoJrwHbq<Awe@&J+Sz$JU<Yow4IRgWWLOM!!)Lpb$sl5_U znQkT-_}^GVhML0j<f3pm&ohL&&~kv`l+6Xkn*Rg6eIv_T^A)BCKLqG~w~BpCpl-tF zB#w&tFvi$~oGl7}!Q&(x|A-hqXf!_IE_iu+SgKUk26;N93V;KAvovlB@XGNa%4-jw zve5Yf%v49qGU&&$!ZBV|>i{uUjN>@(S_3tlz)3zaK;2R{qIP`q%VtmEG{4!b@t9p0 zfPQBM=F~D`qp7E`jED4M1x-`D-~JrCjY6>57rDBO17lr3q5VE~b#y&P;sI*ayX!t; zo&4_pay{(o=3uMd3Y+s*6)aNmW>ghhq!L?|uvKr>kzDn*2BY6L7Jyy_1z4h$^);wC zjI1F)rgWQxRe1g{7iFz<RmHYhSS7Y9D_#Yx^9OEH1FEU-p^euD)S!{q9Y}E#k6;f3 z|53idetgeu{)}~gMLT}y!5&3|+R#B~&`HxslaFrtj;H$*^w2LjO>fbwY3SEla8^5o zA#DQZw0VqZcX2^m!bR;RMzuE>*Z#mIy&0GFG``StxT1fJDg9e~RURxoJStN32pJwH zJc;x>2uBR>dU1wFOpSh<f9Czr=q)`A_0Dn}*6Ozb9y^09IgHl7F<`<p(G=-k|NM!X VztH`jID#RDX*kEG&X;$?{{o8V;CKK4 diff --git a/MavenChess/MavenChess/target/classes/model/Pawn.class b/MavenChess/MavenChess/target/classes/model/Pawn.class index a9d05b2520252001c47ac6dc5354e655d8b2eb69..f60f87c4bf81c0cdab3eaea62436f853ed6b9dc8 100644 GIT binary patch literal 1341 zcma)5+fEZv6kP{~4lPseMHEz^AT1Q?1wkoR0YRG-B*B32#G#$QV3{G)0mCPl_yg#R zpP-3>L=sJWGJF)ePA|j)Ml;E|?6dY|tv&nX^y@bONjwjr3e`F^12ymo)NMOiGZ$a5 z%#11Eo3L!lOA53`(xnF{Z+VtuCsNTR9kl{2TXIjvcRec?pLAWhpSJQ|06GFHV4Xm9 zB)a5B5cN753^bxiAW#Y=-`D~*87Jqs0wSfOMWDVijq(f`Xu}mEb_5#Fmk~fSt{S+8 z4gqb$^j;M*rj+@*fg5G>iZXPmlDe5Pl4A7%gwd;`&%iD8pAnyOq?;viD?jU+RG{So z@#w0e7d0?|K_-(~!b6dCL57^PH{vhWx6F)}h_0&QhYSoOE?{iR{FG_hbIzVg2f-j= z+%a$$_XKn+KVzHQ`vTz$>CO|5u9E09n<UVXwrq2LcYED*U&{3yEzM~sBXdjAwbZ?2 z)VxhA&kD+sD0@PniDFIeNh_z2swzTy%h?MmB%(!9mA$2_SQiMEq7{+Ubh{WL^cNpp zx~{b+bMz+7w#qv9cgnT)U*<khuDty3C0Rsp(UY0ib8@G|(!XeJ*wWi|DZ}W0@VGQ+ zVA0uiGv=(N#PlyvsbSSubhDFHoELB<SNOP&@RmX~KR_QC>^y?_TmanXs-}u&0&6kK zQ&$m&F+AW+z3`W25Ov~A6v95lICq8>@0g;7ZzsplSB~JHs~Xh?zQE8v!l#XD$7o*R zwe=9~#jP`>tsUX!{NT_bdJZri;~rV&TkJiCE=5;5_=^sIAhosgk&E}+2e<^B{TDd) ziEK0|Ws+#%8l*0bs3Y?h4rUv_IQ1AqJ05YCpP~b6=!8w--=YT}(1$~g=}$xoYK|1u zIaBil2~1GUTKu4Yk}AgO^OzB<nd3X2Fpq{w<~7bxQ$$VE(gp1lZ94lPeqk9kI)XaF Vyz6LYe_}CKquM@0&)LH1*>5MjBC!Af literal 1628 zcmb7EO>Yxd6g|(GFt#(!2Z@0O3Mmc2i4&V7G!z_Cl0b-C$DpPPgjHVbA-pj0MB}j$ z;!m*Yf>qg6NL{s3OHh$mu|h~)bq7D8e*mGX=Xu7eLP8W|>AgGmoqOK>IM1*C{qqHY zDHP*~pv8n?p%n)N+BV#>?PRYjyJQO-m{b+zPYLv-3gLlURlag7x%}W#3{k{P#4WVJ z5{QQgd9NZ6bv?DFD$)_?{4mr+yFmB4tjlc8S59`?^W^=4s`_yx(5VyY5@<;U7j#?b zK~kW#<T|b=AoBX!!xoO{JH=)ky*O&(n1#=AT%dh>nv7es{ru$yUtVMTEPSDX2K_g+ z<4X(uO~<l!4Co9_GcuKDk=iq8VF+n~n5xdYo@bYQ=D(vOgSX-sLB>SZ!Wj(@dpYAu zugqSm>YQiWy2ddJ<2cKlWSIxaRH4xeM^@Id*H+g_p9{DqES%FsrmD_3vUFGTpSN%! z^xe3ld=AN&<;Vm&3aVlkYa6S!_k&z@=s8$$OVU}Ap3>i;)9~-8s({rT3a6D5=wdgf z>ry!yx!~4qLi(E(HVViM23c;O7(-3zd8)1lEmj2*A#V`FCT;{|$&W-I+MeV6&1Rmb zcMF(oX5Ccb6cb1+`s~eu+zcy>EvmJO^lKhlFtLvsb|sB3x;3w4&nex=*mZU(qlZN8 zMEPI<!Ii3~6`{?i!!^gR@6o~^U=5{@Z9xpB|A6^h12xIDy>S*LI>zWYF4ET*;Q1E6 z;TI#dvdN|`D!;*h3DexkA9={T3|{}_ITFiT=vWx~9S4oa_>23Yr}&JU$?Y-DJV)<x z;5-p*CtFvxaH=@+45>%xN{>9n@FT>AxsTr12{!fxHdaFJ9q_Mq<2K5>z~Aar2>&}s z<q2K~puKA;e@ZR;0{>sjhw!iWuI1zK;a@pM1A6pJ93{|6`E+wlQb>n!o}(`Ef9p1m z;{iQC;v{~-DZIo0-XM*CFd|x!5xp1_V;C1#F(D+*i8?NbhscSaDH<)Id6?u%Vuq4w zAzMAL7~AwwFinBcn#E-bEGmA&70e+*?phdom26sk!Pz`Tm#60_qVG{Ok$8_`6TO*t U7`+&p8GK7X1m7{J(6AQ%12k7=K>z>% diff --git a/MavenChess/MavenChess/target/classes/model/Piece.class b/MavenChess/MavenChess/target/classes/model/Piece.class index be225fd85e4b2c272930d7561313f34ff749d8fc..c70cfe3367e1cb27e247905ca4d730e0342c589f 100644 GIT binary patch delta 591 zcmZutyG{Z@6g{&K9=i*=fUB#Zpn|Zdbe0x2R3_GR8cD3QFu`);Cm4UjLJ~J77M2#q z#6L2gnc46P&D_V_bMCq4C;OFizW+Wx0i2@u<UG{!$f4w+jEaDFb9sL@9NwPajfU3( zVlaNZ5SH2Q44!{QKel1Pg-5J~6|AaA9Ak(z)&c=@1M93eX6g_bB5Z7OVv7@3oG}?I z(K|%cO^}VM2?~*!z#l7yD&K$zps04`$ySWvQ)US@w(FVz+t^`6DkV&)OiDAjs*VPu zTzJCDU^K+5d?D#G?18c+TcCd@YzB6*$Nzmb-DK9n0b;Gb$5KM==naJzH8JH26`!XE zQa*t;I_yX#v*7HanA%cs8IcCZb7+5Ybz>>Ii^FtvpGQg)T<y3uXLeEf*`(zyIJ|Z0 QiaT+|cT<xEj?~%5|E7K_ng9R* delta 468 zcmZvYyD|h}5QV>g%!RSD!@8`s%Z@uEkg1YvCYO2=;XH$qdjf%}vZYEO6ey1)R?go$ zmO|3k)2C1O%j{c{zJ5GC10%}o^s2tSa5wMnyb1}Kr=><n&Vqc8MR`X@aln%D<sbP9 zk&qFqLUe_=6lO*~FCTH`@tC9>jLB*nUX$$z4w-D5Ijv}mtfxw0V^z*NeWhYB9nK=J zB+!Nd8}fe7sj@&maQEKgsbkeJg-DNer)&Y64An0Ty`^ZI9a+zHBJU@o@}VNTGsHJv z*W|S(h=$Lx%iiB<lHX$b{|@hS&<u|x(+iF5RW)Z{x1?4c>a&GWOzw%N_r%S29EYa& F=o3<M9p?Z5 diff --git a/MavenChess/MavenChess/target/classes/model/Position.class b/MavenChess/MavenChess/target/classes/model/Position.class index f1a4edbd041caca66d157e1c11b2ed2df615a826..bf4b97164c8118351d4b88aa50f9425eaff273f9 100644 GIT binary patch literal 1390 zcmZ`(+fEZv6kVsC-Y=9^D$ptv6{bb0K4XYbQ5)+GNVOUxLpy=N(qcO`@;4YCeDTFZ zH1WX?@T1VRr(>xENSJfZK6|gV_gW|Yef;wmfF;}t!vk*sS`<F`6%xC~d!yJiTHD1Z zTf1i6R`B1pT9&<};MMch5P}E=5RM{(s6u?N-7uTQr|qs~TkV#D`oRCPWW}QxkrZ_h z=4mvFBvK06wrRg`pvn>+iz59mTvHf%{-C_E`sV)Ha&@(~ymnV1R%*Apw$ZYyMzd#n z|L~7#E0yKa!;>@#A1nCuayefmM~O`_t75gx$GyERv$J7rH5o}(+I6E@H9D4@-JoXg zSX~ZY`G1r};<48<dkAz*d*wiOn(h#ItOiG5lo5V8k1XszWOYmJPREgrYQ1Ft>$XvU z`^eaL+5G0ap3x*<N<U2~>1tmgyx#70>gGL5T8{mbc0r6mj+%LBoW?H=;Lal|bDh9N zt_tH$Y=Y;>p>qad-uaN__YyN|;yTxn!VjoI<_Lj8_6V`BPVr@alcWHPG}43!6h{nG zj7;~-xaN2wfYXL@cG8H41T#pvG>gs|7%hB5Olu^9JKO{|wZ<0~cpyZ6rUD5ET>57+ z`r!0y0953S-1(&bba85^*f%KVyJCq9J6s$)U7S9%_zJGN#VrmjiWdr*L~vh(%195K zrAfgGHSV=d33C^d-H?cBDh~P(L<VEjev0knIkgCx?xVWx5+BzbzZ7N%E<Iz8xD+|d zp}2E3O^O_SnsGq;?nDNlk%2oA=b4B*bA!>A2rr}g9rzRP<tG8m^0B3pR{aB1zl*A% zpN%ynK_6?5So%3w@@mA~JSFJ+^_u*O9q1yo_7OQ*6Twdy=O)HLLRJX`w9nAIVySoN zG0i(n{l}!cUC%Se2hZ#sp}LM6F4Zenf~-)?e@EgFNdf2f!r?ja#i2p615vVApb-i# N(WFCEB&!EE{{nFWtw#U= literal 1476 zcmZ`(*-{fh6g@qeEM$SOg8|tDlM#vg2BK_gO5A{oVwELB5@9eTR5DQVIhGH;_+pi4 zl@ES^ABCRV32~q>sdS%nr|;?RbMNH$;m=<Hrg1L}1HK^4DEtU0#JB7{J6*I(8|i23 zTZNpf5SVgGjytX3OQy0-2%#y6a1;?l6`Hrp`9d-Myj*o$r(9A{ANb42s^%zKWQp1j zleI?ChIR#Wqu{>MQW*(%M$vT?UgcU_AvRYoRb9K}X6@o`!N*f7K3ErE5aa~-2=W3< z0=>ph@J=GUgW3=fB-j)XQfPVkD6_Kg_Tkb@c42j9Y2NpTABJZaXXYLs4<9P{lbK8^ z%d^h$a$L3OlnPIGx7Q1m6??tNNZVpLXBV?}#SvZ)n(n4krGbmbEt#Yq@0^)e2v!U3 z?7ko~sW&j3Jgs1q5svglCi>9iROiZ-inhN!c~UX;np$?H;_TT)`nBxZx%W@(o%%V# z%jMlluJFK-lg5rJGa+@w5G^-oNt7e&M`TEmIQOEPvqF!K^^%|Q@C13Ehxe18_3#1m zK@T4yANKGO@^c<ON<QY{=gE^Eo+7tA`~sSIHb2HWUgQZ^rD-|0SU;ew!~ud<-vMG@ z_2DNtw!!2W;TUCV49)ze85yjl;Sw&BQ9#?EG!i2WZg2(d^=&3K2U@Lfh?)6#Xp<ng zX6C;z!GLTO;8HHo;^Lp+nmF5}A(ZA5dFGe=lgS;PWPc->uLV=&vfkv_$>i=+lds}h zJ-NgSOT{fK5fAN%Q3*K%?^2{;)+({NCSjtOAdiV%bR0;qXZp~IehjeYDUM=fS538H zq=oCcUJ5rFReHfSQl-dg6>8RxhPcHr!Whw_wdzC~qLD^*BDzhbIyW0vo2I;6EuiK9 z)n5M5fKe)sd5#)rs0Qk)3b#(z@>o#QN>VHJA1&z`zOcBBJ9W$7aDORw()y0L`4K}h w$3vgcL(suMTxJOb&Cf7>Qc|C%na1@_wPs3UQg`YU*Z5(K-IqSPOJZR9F9xQsA^-pY diff --git a/MavenChess/MavenChess/target/classes/model/Queen.class b/MavenChess/MavenChess/target/classes/model/Queen.class index ce7f8807817995cd62883140b43a974c44646d23..10479f12d5926eab2359e138d32913df50571a05 100644 GIT binary patch delta 633 zcmY+A&1(};6vcn@`6iQ4N88cHC{=OgM_U9(jh|6lZ9yZ5(6K_TRk0e>s;I?91ha6T zoy$T{Ton|HRCM7&a3Nhu{tDOPCZ43F*2lYd?mg$sdH21q(XZ@$)^g4C!=ZPP)ngT& zT3E9d=33?6)SVmG)m>IhEAG~}+ex=KS*c7&WRH(nbeh?E!@lSkO7-9NkE%U@PZnq{ zV$uaN=c3?Km^w~5b=`96DSU-dAK2wI^4rPS<)XW+6W7s+Z&PAcbOIvdmW!T~__3dN zKhN<v@5X+AV)9=56F5o69ZbSFjDk5X#hF)JSR|M3dQaB}dSVlYx2`TXy>ZZP7ATyr zPr5s+nObPQZoRGf$}jiKYkHTx%EPQz?jm3VgLE@S%oH2B%_e5(<q>(Fu$dPWXt0Hk zY~>4md}ABm*};<ZKdI3#m-~8^2D{lWA4d*1N!W*x&qS32Dg)VF;UI^|$TX!WEM%N# z99HGaqRD{9Xs;$mIEtlzmN>?7Y~gP>K}my;@tl*YJWffOTUDKwYDmZorX^crSZC-n x8sULqSlfb@E|UF6tl*Ybn=7s147vYUFKp?=HKwbce}tdWxi)7t%Sfjh{R>D6V?+P| delta 1014 zcmZvbO-L0{6vuz(&Wtnf&C8UYX^N;>RFaihV;@tdrfH9Ck$qTHF8t{AX(a_wJ+LB( zHsP*Ciy~UI5sF+ys|Z@PaMP+qn>InvCMXI!@4ZHQ;+@Oo&pAKNJ^#a<Z~ohoNnac< zeYx}ei^Y<Zi8j;RD`~+#J2X5d$Wg($lpZ;y+8Vnss)@l1SI-M>Hs6;Gc)4_5W`nzP z`B*NR)f0Ekfr(G%!$CWZ!y+(;UgP#p5!+`6wiP&5P-F$J6?j$<vx2x4_*Rf8vrD|k zrtvk2{)U$nzam*?59C#aswt{^%VH0yo;Yf+tSg`f=TY%IwPJa^0Glf|m@DQ-m|uX+ zRm)?Ee^^bT0E?>SN;whZ6fjY#98(lAMgKALI(H++U5Lr|<NaeY-fdf+{h3}n3D`91 z`GXyL7UQu5pQNfXN?EF^T)zq`Sw^*<wNz2Bs(~81s3XO4PHJR`Rh(lrqio<lO*~*D zPif{k0WWCb6(Q4l$47SZHA5@kY3C;${H9wf=#gsnN)st*p;ubjFYO$ZV;q(Nj>s7O za*g9M&I!50pgdwoo-iy^jK~{K%RA1<dq(9m7v&3=<QJC>TrnP3jn8$nf*WQHH_Z+* zrh{>lNpZ{ca@X{6k9F$%wm!8kQ_N;{Z)G1H>(z%YRe^S|4_EmuY{lT46x-CDO|j`_ zyZUk{HJ$1$q==+xSBD`k<)&3_hC0zo6S7NHjB2x$Ho^>XYE7UM2zA)?rdj6@l3=&q zn3%n+Q!ne%NSewSo$w-;#V$3jmX>J2jCL@WaY;le0VlpG+D%S;cF)kDzt)1)*pu~4 LxAxGJQ+xjcAK0)= diff --git a/MavenChess/MavenChess/target/classes/model/Rook.class b/MavenChess/MavenChess/target/classes/model/Rook.class index ee62dd3c32855be4fe2f5261aed520c175275f3d..936be027e604e017fbd32ca0ca0b34308ae8b7a1 100644 GIT binary patch literal 1633 zcma)6T~8cU7=F&~?3~@%;iJ%@ML=4imhV;6)v}0%T6AS$OR2PrF*>_UV9KyVW)~uf zNpBi2yfraly=i*mtwsx}HBC&s>Xqrw@j`sgevncyadyv~bKZ~Vec$IjXP*7@+fx8j zxMLuMu!LqJ0$m`!>90Co;)d%K907gOExP3?fwKddy23BHW!EpJ(u2zqQGxcm_Kuy{ zF1uc0Itc9Dj9V%jkT4WrTp&E444VX+j|0Tef>wz$Cfd+0VAQlXeSbqhYzef!9MFIX z%R~px3219h`A!u(t;C%sUTKJPO3<x>_XtD=(#+F9FD^)2H1Qhxj!K;I?O;_vx~1zy zXLDDe??jC+r!csppe~ts9hXUtTbd0VvebUUQ5i}Mni#?`)3jF^$QsC0sq*aNS|Xdj z>lDhV8sMmju{z+KTU=8y-Z1ed#s#7*wBC!}lTjM^sb-~ABi}ah4w3@qx?P%aoZ`H{ z<1jRPu%h^WPpPkv-xX4Ljg1y)$+$&lVS6+01h?$GM@d`8FWBC)9k^;=7i#5ow?y1} zMAfDg=`Hx49}q7saE6&q@7S)Vyi{D8_cv0ma-ABi5pevh5JuWT;O^KSfxhBkD`ejD z3mYnR;c^r?@&Zlu=ruHk->ikP{sT8+d)^mB41LD@svAOg94~Kot5M?R(@-WG6gQ6j z6!UFbD%*vPd3&o$j>LjMY{^|K+U4zl1SbDS)u-YbOa69HaAsZAhM3}bOr029Wa~n_ zt>Bx5K<9gcyEMZ50di=#`vBtSszHixbrgUo4P%((>O##7@AJZ|N2)tV5ViUMSF5no znBh#=&^Z0#)IEO!nL9viUjA<6!r^RA)3Uh;XFZgi(5gZTGzuai3d7lnNI0omdZ+gE zA-?a_EPX5~J0og}hLbTZX;?;U^dYvbSOr^8VCIH?Me{z+TGBGszpQP}TT!(+K-a?X zXifBL1@Yn0ee~}kHo|$}w%U#Cp-at)eY{mcD^1_6yr}Q5K-ZG7`-b@O@Z0-3-|Hhk zu__IUp#|0tG?Sw?^l&{6i|lmZL!84L&QsrsMSfI1M;Gp)8{g4tkN5Hya`~8_kw4If zKXD1q==T@=D$84B?H;|a5id-nZ#b@!;W<jLa}_1(*O<i>c4ZN}_=qxt7xD*u%$2Sf zKkCqPHun>DD9Q+P$gnd#c!YT(Xw3BivRp-QgFfbw)grBKQW79~NLVS+BGD_Efy5I3 s?DrwdiJy=QK1w(Jf=<G$d)2g&UgMAvPXqm%@>`4>!l%q-xw^XjFPAV<TL1t6 literal 1769 zcmbVNTT@$A6#f=D$w|Tq<rbh<+XCehAl6G-4boB!nl?}@3Z;XWljH~+LJo5haCrCK zH)o1(KG;VuV@szUeeq3a{2RXMgYU&}=Y%2`9miyH&f06Q^{vad_Ri1Gp8N=43^P$Q zAYj6<5JX7OxaJm}QgTK)1xFAXRb^Ej6SVi|>KkrFRh3	wmY2qR)5YM~L9AnIG( zaotrx*!9$sD%&MN^I=yLO@g)+d(%#CR8=WC?s@iBPF1Q=#L%o0X%Pha2j)z)37QTD z)<NSII&?%?kD?V_7Ea=nz*usscWaJWtv+Mn?4Ei-D_+pZ=LNz3ER)xoix#@kBZ#QV zgzI@up~}3DR61}kic9D-(Qjb@gU@?(!?nF4D^-<Dx$LZM3A&H?9xmO-8nQ5~<Azja z(sLYLcGAL&xXkSBA~ECrxmtTlc6ljzJHNur(!T4<7G9~l-cscyRy{$&1SfK;>`ZU0 z<sI)`J71!vHRl%W(wyxny{;>b>awZ`ta@IWt28@Oa7(Voer5$N?Be*QtxDQ!%H4Em z-m_O%t>pB8pWH$22xHowr#3a^k{874F?=5eS@Xf-|KKf(#gv?n$${LXIp=4Ya-iz2 zbED{fQWkU^tZ8d~udcr1Kt~UEe~d}SW~+8#b;@3^cO){amdbW@!(+=*|Dn!fL8G(o zhF5SVm2P}QcXdSbhYK9m2A(srq0b1V2Fg5We7?%n9R&CVtii;Y9mrtfA<S=URw+K4 zYI}{e)+a26E7YC$?Qs>aaYavk5{Ray*O9K_kKzr!iQn)CV?`K#<tbtdJ2)|Aq>Ml+ z7)XTzDKn4?$BpLjmooJftqX(Sqx}&&<Hkq6bb1HpriUNn!hNLU!EGcG!~RC^HX0Md zkC3>J$PnKn^Lq8tfmLD~AtMz$fLlBUH}t=7Lx01qgEH;?e23%aHqQQgzJ7-0aY)5I zr2RsB<Kb<@pCcYqYxq+`9z6SQ=o>O&K(qH1FAJcJ6VOTay2$29wBQulahjTQ{9YuZ z-MoW)Fo9mo^OAX=J`M)4iV;+h#3m2>XJqnoB7Q;ZugUvE^85pt{t4Ic3&!y)Ch;5I z!tZz+e<CX;Zb}T(632{m;XS#GIk}E`$>6TMg9Vw#qI`%CB#*o-Gn$^NMNY{TT8?pw zIFGWjH(!*l;X3ClO#5-%;9ND*dxG%|-r|dR6Pen5y}&FooYZ!iV=ft(=#*Jzlwti@ zM$j|rW85UhEox@byvs)L4<u~jlF9iN{Q-6va$jqrwXP4wqE~CbXkSNkS5Nj4SL6uX MfGGx>u1UB50>b8Opa1{> diff --git a/MavenChess/MavenChess/target/classes/view/BoardView.class b/MavenChess/MavenChess/target/classes/view/BoardView.class index 07076728f78342beebbbcf75905400bb31d83718..658950bedb33ff474e89419b3e918501d22fd96f 100644 GIT binary patch literal 7567 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 QsH)V3yt<V`d1~PQ0126(O8@`> literal 7879 zcma)B3w%@8dH)~jN>`RISoi@5V{9-FTgEXVV5n`3!4Gg^42h`|Lj#d*84HBv$ui(< z%es!HThqsyrF0P5&}0iMeI;2iC5$F(*DOh&Te~G)yEbjNrc0JK>1zuku>W`N)wOJt zZ16+(Jihat@B5$cbq>#6dE$!znpLL>kHYLj@z~+I&B<tLu$QeM4ERj=Etm)>g!V@d zMe7pLk$rXB`}fBN(hB~j_((k6tl+Jx?lloqn59|lj3;8kArA_cg;|)b;7fCGjBIvy zO`~ZHk|<<h4hj{51F2Xv9h3E3QPtU5-7C|@7D_Oe)2Y~4EZv$+BvT6Wt87NC<74UM z!EIcYiboTTBFOxVE<56}0aua*7D};@Qjf|gMVaG>;!-u5Sfr4DFgX}Y)ag+Z73Ad% zB*)_Ecyh$V5`{voguV9-gWF_95R0+Y!ZIu;Ap2s(XK7Vub(g?4bfj)<AT|=K8yk*} z#_D!b(vf|M*tXc%u-3oILNy}X+SXrht<XdO{?Fx|Z-IhfztTc2uA`#;iRi$Ay@SMd zc<(@Re1x*8PN7(3;d)JRcsQPpWm5!EjvM6Y3*`jXTByf53OGJGNTeMBi>kV&Lqqgs z-8(Eapphp?6gu0qd2|Yw4HlZQQ6a!_mjxlxSn2_>8jZ*%3!Bl(4Kt*)IfaV1091f< zmX@R4LWk^baOrJ9Yz3|RMhiEgOQAH!X=E1DdTCudQ_+#J1a-WP9ID!Eg}N<l&#>$h zmN#3tMfgoyu`7sq*lFRN=ye2lEQaP%RXr0bA->H*A9m3sDXLbmoOEv^Vx#}5UOFuQ z7#o)l4H=u?4ftD}A^(%F=_!bSgBD`f2-s(0pTgW68*EM<@wcq9m-|~PGJJ+`P)uNi z5>~afX)uPsqa4D`LF6GNlXRq-s$4>oXX8wzZGRrOa0rJLOu<|GdZFXYnaH6HX)7jV zgF6)#=G;KLPjzn|eh<HI;w}q+fOqFU;<i-uu=psCw4<|&=T??W;0zTFa4X(p;g4{X z=SUed6JmgGyHJA9-3mon!66fvf_N|fSfaz9C@j0ij7OvKk#yaT;pE7^%mOXNJr+KI z586^>Ca#sjUY(hDu=}uuKNSneqXInx(L_x9!o3#$Y}%+c=Z{)AHf?m5|Ec1P5p2Z? z3-{wBS<y^wR@$fA1gB3}cwpL`_JU8!!9A#OeNMbG9(Rp-IPv~3Ec_)NW}KktZk(7I zCB&5S@K@qNpHf(m+i}DOg>0vUpU+tMEI!9HLN&zDw8xcRa~5`twpR|}9$ERQg~#yM zG+1Y)ICLg%xh5<7oV75CbGGC?X+{wVB3i5Sc*4X53xA`-s2w(Ss<jWdCzfDJjSb3f zU$pQfp0b%Z$*wwgvYY8%&Q4#FIQwOV@@wOBW`(3cB2$L1Sa=$L&m2M3HXVw_6VZMq zrsN?>kV`Y`wV;i5XsR1e#}jp%QmN=fS9~l@CePwI6JNFPHGG}6FVSTN4OL-wNk!9= zx92)1Wz%#z<Bj?FCcb6jA1wSMzD<0m*kniu|8R7yJ9dQGiv`CnS@BO6{u$2`<Pkkw zoZ+2Srcl81_^yS2!S@)(;$t1D7*8cf>Z0ME$G=+m0e&a~kF}4C#12j<RAx}v;e_*R z%(hxD{gH(qJA3Si9v%^M_%{pxE_p)|o;C;B;w1||%Vdb`V}IGgD`NF|2jYo@HhZCd z)xyv53yvP-nK;hy|By)6O|MFh`K5(lX`2&gax{?f-&pu<MmB9_VtW5=;SG_Y*v|7? zQqe=P3D$#-IRAsoCf>Ag1y`LTax0rHspR;mo%ULX<B7pkj9FvZlvfTU6Jp`4pT<}} zj>S@k#L%<_nM%?Are&pW2J3v~Rfeg2mhvl8VX;H-){J<((ZRt@iG�ZXKwz>($0; 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 S`?^tCrf(W*3x_;v>;D33F13*W diff --git a/MavenChess/MavenChess/target/classes/view/Custom3dModel.class b/MavenChess/MavenChess/target/classes/view/Custom3dModel.class index b9724d85e6009c24f25759fa7841c0791ab818b8..b56a7c62690b04a4b2304ab7ef8ce2400c8a2049 100644 GIT binary patch delta 1452 zcmZvcX>3$g6vuyemUrh3&q9W!yl60JTNH|gQlSiOV@oN5q(dzMM?UCC22yNVn3kp{ z#Q6drObjYdkfKr)Wk3|!oVFAZ5K$`b`@V~c;`YI4#Cl!_VIY2(d(ZzY|8w5C=gjKS z`$h-*{@H&JsNnbA!7;`}%{_`yOJi-ZqQ+R$lA_ubjg51g8=6|<i5cyS;>%hanww1S zW39%qxSw@Sg)vDz;3SMZvxAMA2Q40QI*q*YO>}BDTReiH7<!)Z9F1b|vV<_#x5gIT zJ}(hl6b~|<Ef$aQxO37dFjH*PY`1vA8KJKXq<GTeDRw%Q`U+#0#cuZOZO~2X^5Jv- zhkTmCXp1LW<L%BLfru4rR|GS-+Nn2Js1wd{voz=1ASd}w^S#9qesBf{kB<CN;Zchf z)~u$ccw%~EtfeL1qWRf56&&mPReIx`4vuoB3>uaUaS1unI-9-hL-CBr9@2ulvT(QH zo-DjyaBmhqAo$rVd{FRnS@;lM;r3(5c~~-R#wQZYclrh`R7acwYuu&J3$`*^j`D&a z#W7xVBb-KSWcd-%xbbiquI~t`6ZBbMS9)n6qlcjkbECk!K_Y@ew97ecRU~^EAMK(j z>>rzE!niagVWXFD)Hc$Tg{nf;X==Kd6V|;%qPFg$E*!7}Y36ls%)M`NJr;&d+w>NP zZb=jCpx!q9#rugvHw~q}TwngWO&Gbp8ryH1zH^ptn$xr-7ufz>Uq%+uHjRrM7Nl4> zK;AY$9w|)IKEyZ>jCx(N&`QbfE$-&dNYv+zM1{bAfzlAAc3HDM1Kvmvt30IoOOx(L z+?65}Hui9DXnmRu?x#QOoov|tG>?Y0t$Wz2=wP-h?NA(IX_}`?1H%p9W^AcvtnYvk z_2vfhZ>#GePiPsIrOoKX`Br1uWFytTr*M}%(o9vUs=1qFMpz?n@4n@F^5x7YKmmD- zp^U3!fv;vJ<EW#M#j;1sxrRF^Vl@+FT_@7XB(_q*b|!O>DIBMiFPO?tggL`B6{1Xy zp<I;^R#Ul7l~JiGnIY+`R85lUs+MY1&-H3Pvs4?i)k<zqYpGRRn5%YBr*?AVz;LaS zwdkZu67)&At7WiW<^-k`_6x7@s*KfQKH@cAm$6$e=Nr69K-EapTf8m*6>VJ0I}#gk zhwto&CSCDe-jmr3sBOH@2hyAhmEc2h^h%o=gz{tjQryjaA}I|%l@7T(k+FRy8}zwo z)-b4FvYMKpW~N4aq>AyHa!pthfqrR?nEtbRGS+0qtfgZYdt4Ad;P4j<JpH0J&eOO~ vD9xsvGnjIx{-(q;<WE^JFJDSo9=_shxdT%0H}X3r&w^MLr=@GZq3nMFrgul@ delta 1386 zcmY+EX>3$g6vuz}&CI(qZ>EJ*V0>x<XbalKVhg1VOIVAP%1EffWIo6MjTywY!6|7X zVd4i9Ob99ukh&mJq=H%~)YsBhTtG$KabI!8T@$`()OsET9g>;%&i~y1S?;<2`?|;8 zJ=Qw;Pv22s2ETV%<ITJf_i~@+{s>!eoE2uJ+U9IG3qudEL(>-FLFbrRSh$IYBRqns z7}mTt-I!UDNv*uCer;-HgGCvSM%cw;PN5zbYG;q;@d$gJCHkshJ5NN|$9`vnzS4Xu z!qapf-m4qcn9+5sQ|nUY>8A3U^qPi6O_`demc~`{T30qSXVOiLQ=Q6CJTKj-@ZFwj zRRq?payExr)CtFLRp)<g@eSW<zKd`xXPjE=xcb2v79QpQSyAL1u%gb)@No63vp75{ zYmi62Y}e)h2T^p1ZE#5N;T+s8_?aB+3hv3ly@HSA;6B0qId}k{<PKoU^I55|3%^)! zvlECU)lnxEDak%3I5Onrd0r5tc#&i0Bc@7MhWK=GH=)Zb4vJ~uos*XmuD}Z)HAFcd zE@Y0MYr^0XMhqqL?U9JE<aYbfi5^DZQ0g*95139kuRI&B_V-gJ?(&#f>@uOmWnxVC z6HD0IWm>`Pg1Ig=J=Dd5{lpV?u!qI5kR5WVZ{vjbUgj~9G0V1m6$Q7rq}sU2wgMG> zG(a!u>OeFQ^>5pWjs~jzwrN}b|JHg-XmYt@scl9By%$W|GXEzGIXg(&mUB99WQhb9 zte1Meie5Iv6MkPj5%8+zI!$qE;g8P0G+X7hcuxlfF@1>51zTOVdmDSmSEX&!WoImC z2am8@(Z)j0>QFMv)h<s~hem4uE-sT{75fLwgfAM3`d2JILZLwiBXZnBK4C96o2zuk zU{|Rpt6Ei~7LeT}=k6Wac8cU#M38Y5GM;H%%`C2=mJ;eIB`udG!?moZoQ+IiE7!4` zO7=66PO3x|lX;VB&M<|u#FW8Q6=j+#WxARocm^}oEM}=1=1JMvY9Vvf66R*rGHO(k z`RY!tS9h^M?VwKWW0C42uDZGLoQgKfh1ktpUgBku>_%K(;RKd6c9vH;DXL2IIj`}$ zw4dP=Z%8X4DUrupyp5LJRV<g-kf*W>S`_OYvZrJeLDk8-yeCqfp;~!gh(77Gg%8B? z%b?cqAs@+?BuSEwMZTI(WLDnI7+U*O1pJwJwh$ha`j+;7^EKKqgj=SWu8C>lFeuXr z=PVo9+;uIR5X$6>C>Lco$M}<_#-O-$P9l$m(rn8ATXwE#|BFe+@IPcmKE9CF3{LZ< Xyo1v8SMvX!9|c*$<tKjOH|&1_D2gT- diff --git a/MavenChess/MavenChess/target/classes/view/CustomCamera.class b/MavenChess/MavenChess/target/classes/view/CustomCamera.class index 03a2e0653bb42d437418ddfec3bee1441df92cfe..26d3a8efec8aa8c0024ccc05fe267bc80ab29f96 100644 GIT binary patch delta 600 zcmX|;$#YCm6vlt=_3)CHm!3ilsiGHJtB$E-NNL0nQ-~_`f~stg>IG2=y6l813mbNK zV_~gOEL0N_#1Lad#5|_T*55!W-+NNMx#zp*obP<!x%YZ{Y_2={cW4-BWAcW(	bs z#;w>3mzRt>yz&_1b>(1f*b2X~m|^mfY37t0&A)Z2=bgu6MiPv~BYgA|pFD<nVBvN2 z_Lh#fA30Dim&y)bEi&e(JI9^Z+1J-|;;6%SGwH6VO_3le>6B@zYfYxu%ohK~jvz)W z-E}i9Gw3DFc`t2#d1p#lmeDMy3+Z4nMOLzxR=QZlA+~Zk*dnU)Fju&$=%WfZvBYTO z76aJKW*4`GLgF?s$Th;65a*6iM4dxsqP}a-c4}lJMkkHzBqPouc1x!isHDY)LRF=} zUCxPHLkstWLflu~!Tv)g)R3_KS26vui>C`rXEiz2$o5*+%hWd3Y3K&_vr$X5bBs-# z)c*c5Ia!1Ls!V@i(h73EaXUZ{c{C*$#r{okf%Nn(vU5rG9@YH5Y_53#b0OZ+y+k&b z>gDq^$?klX2U?B)yQ*4Q{JECcPsFx)$}>g3>$!5{Oz?gReGvMrnyc<FeB%eR{sGwx BcdY;b delta 622 zcmX|;%TH5L5XOJ!w&j-Vr7Z!A_&}nmP|y^mirQFI0*Dx2_#k0JL#_s5ic&Q$bm7vN zn3%Km4^X2EQ=h2##0R3{Tk#eD3KtsVoZ7fK^WB;GzWHYE<ot`Z&cvV5F(A$NOHQx7 zAh_2%*f}zMXul#_AKx^TIh@&ZB#|5NvR<N)Pv!gVDHWP<c*dm7bC(yq%%@BJ%Ku7H zrI!XOld1TwaDX=sWxREH$asWtNqjJgk1lt)r*ONnS#P9mUnZCHayFm!DW}2zRZ*i) zJ2iURsVudKP%hRi{nKeFw`ixse9>KqcD{ASETxjV*KN|>?!4+4XQk|-<PC6+^AZ(# zF6-m&39pf660&6zT`Z%A)$ArkA8QyCLBmW_BJWU<Y0wp}io#;4T;sY7p3PQn2=WQH zf>AEu7lkl41qGz@mL4wa+rF6~TL?*Slx@V=!4h_|N;qapt+0{l|NI$ro0Gx~imNd} zKJG}}#`;anR}rzyvGm-~nRuF+w9>#@T39FVdN$A|i?q`(_ZXy;1Clw)M*SmH)o3i4 zLmVsEv<m1x4~p_7Sik707j^kJdSSR@pjiwg<=)Gg!wMF$vS2nUOGDj%vvn8^B`S|3 fZ}FHX5>3}r$xZQ^cSZDG&?l)m(ml-=zES-bUR8hV diff --git a/MavenChess/MavenChess/target/classes/view/CustomLight.class b/MavenChess/MavenChess/target/classes/view/CustomLight.class index 99527e13383b6d4d8d92231c1c7c93ac223491c5..5dca188028fe0f1b9563d42a38f325d9a1293066 100644 GIT binary patch delta 268 zcmYL@%SwV#6h_xMc)|1kYBw*1frB8@Nlh&8mr5-K!AVchAbk_3=OG+BaUfJPg`ijP zNhI7I1t*KMIp1F2{`J0%`T1LX0X6zFGti#lo`*0+pOT&HYgMspoetG}>NM;|uWz)3 zlca=@;Zmqk1PKY7pb|vn1uN?XmhUt7-xB69LZ1Lp(!|ITr^pdQju~^pgj1%Ru_VEx zOF9crJj<kL)7drfAzlAh+~wyK!k?7wD0o$`YTgcQ#wE_V<-*yLyN$g~cIomWKE<n; GG`%f9%pr#W delta 411 zcmZvX%Sr-q6vlruV~NvX*~Kg}gaSb!vqfc=cE4Iy2H~QGl$8Y)DABHcw3~+r+6mpI z+PMgNfFOE^+E=HsP0;2$|I2qfkNR_s{`7hG0K`}+>PdCYPM?B%Cv%wDJPPI4vwPW4 z>R`W+$Zc&Gbb6_C(7=E}ltBesUcMAOiU0Z0AAwIN&aj;kgHdxs^(*7%sp_eoG?-%A zJXhbsn#8+l7KApu))af0DhgFp3(kNtgF{a6VHUOWaiBzR+QpZq-Qc*U|B^`Hg2)v^ zB|6g1M*Pleg12<3tQIY=S-~C*K_@n9@lb~k7ZK`NmaTSa<b)>9q)l1+ya?l+7Uo1@ zRFX+BFE@pSR+5!k<fNb~kKy1IG5bAZ=BuqUKJh13w-{c!X}9d$6~(WeXjx=Q{1hqj Hvv%qm3+YCB diff --git a/MavenChess/MavenChess/target/classes/view/CustomMaterial.class b/MavenChess/MavenChess/target/classes/view/CustomMaterial.class index 7a14a2eb28337bdc65f227b580d3a20f0ec86851..716c4af3b9b45177c2e298edd4a74ae7fb2c8078 100644 GIT binary patch delta 140 zcmZ3<yO(!EJyShzu&a-&bBL=;e2AxyD>DNF0}~?ykFS52qmz#-T#T8Kf!i@8#L?Ls zF2n*<798N}?CIzO7h`2);BxXoR>cMs3HR^}K^Vo($iNcr@9zS#ii2_UE2jO-03&%D Ah5!Hn delta 101 zcmdnXyOMW9JyQfnu&a-&bBL=8GXnzy6C(q=uYZ`MlaDKi%go5Y<`@#<=<E&Ru>d85 l16-Xw9eqGtRz?OcCx6Ev7bhR60ydaPxQA!R=GRP@m;uFV6G#96 diff --git a/MavenChess/MavenChess/target/classes/view/CustomScene.class b/MavenChess/MavenChess/target/classes/view/CustomScene.class index 81e4bbefc75c5d8e4dc1702512caeb6ef69af5e9..6f961b88f066934065f9339e26e71c1f847402e7 100644 GIT binary patch delta 13 Ucmey!{*iqH7c-;KWNzkX03nS8NB{r; delta 13 Ucmey!{*iqH7c(Q%WNzkX03kgDH~;_u diff --git a/MavenChess/MavenChess/target/classes/view/Desk.class b/MavenChess/MavenChess/target/classes/view/Desk.class index cb8dfbd1f233a6a57ad1d06b7451d7c9f08f0671..55a49cd16fcf1060e1a916541af1fe10e381ae50 100644 GIT binary patch delta 13 UcmZqWY~|e0#>^-*xt;kR038Jcga7~l delta 13 UcmZqWY~|e0#>~hxxt;kR035XhbN~PV diff --git a/MavenChess/MavenChess/target/classes/view/TileView.class b/MavenChess/MavenChess/target/classes/view/TileView.class index d0c63dff6102454b28998207b6a2a891f84e26eb..df2fc8f7e944a9eb86325a43fab5c5685fb402d6 100644 GIT binary patch delta 22 dcmeyz{*Qfw1QVwa12+Q?0|SH5W<{pEi~vEQ1kC^d delta 22 dcmeyz{*Qfw1QRC{12+Q?0|NuoW<{pEi~vAk1g!u7 -- GitLab