diff --git a/MavenChess/MavenChess/src/main/java/controller/Game.java b/MavenChess/MavenChess/src/main/java/controller/Game.java index f80862e912f52718317d0359daf9a7d09de74486..7d3ef8f9f455a714bcbfdedd80a5ba4e236ee478 100644 --- a/MavenChess/MavenChess/src/main/java/controller/Game.java +++ b/MavenChess/MavenChess/src/main/java/controller/Game.java @@ -35,7 +35,14 @@ public class Game { boardView.refresh(board, model); } - public void clickPiece(PieceView clickedPiece, Board board, BoardView boardView, CustomMaterial material, Custom3dModel model, Log log) { + public void nextTurn() { + if(isWhiteTurn()) + setStatus(Game.BLACK_TURN); + else if(isBlackTurn()) + setStatus(Game.WHITE_TURN); + } + + public void clickPiece(PieceView clickedPiece, Board board, BoardView boardView, CustomMaterial material, Custom3dModel model, Log log, HUD hud) { // graveyard pieces should not do anything if(clickedPiece.getPosition().getX() < 0) { @@ -44,7 +51,7 @@ public class Game { // if piece is colored (aka targeted), we consider it an action to apply (tile click) if(clickedPiece.isTargeted()) { TileView tile = boardView.getTile(clickedPiece.getPosition().getID()); - clickTile(tile, board, boardView, material, model, log); + clickTile(tile, board, boardView, material, model, log, hud); return; } if(clickedPiece.isWhite() && isWhiteTurn() || clickedPiece.isBlack() && isBlackTurn()) { @@ -106,7 +113,7 @@ public class Game { } } - public void clickTile(TileView clickedTile, Board board, BoardView boardView, CustomMaterial material, Custom3dModel model, Log log) { + public void clickTile(TileView clickedTile, Board board, BoardView boardView, CustomMaterial material, Custom3dModel model, Log log, HUD hud) { boolean moved = false; // to tell if an action/movement was used or not @@ -241,11 +248,9 @@ public class Game { boardView.resetColor(material); // updates game status if(moved) { - if(isWhiteTurn()) - setStatus(Game.BLACK_TURN); - else if(isBlackTurn()) - setStatus(Game.WHITE_TURN); - log.save(board, boardView); + nextTurn(); // change player turn + log.save(board, boardView); // saves current board + hud.rollbackShow(); // show rollback button (if not showed already) } } } diff --git a/MavenChess/MavenChess/src/main/java/controller/Log.java b/MavenChess/MavenChess/src/main/java/controller/Log.java index d0fb207488667c921142c96e92f2f010174a20d5..cf05e2a68f05e801c7b80552315cabdcba12d298 100644 --- a/MavenChess/MavenChess/src/main/java/controller/Log.java +++ b/MavenChess/MavenChess/src/main/java/controller/Log.java @@ -1,20 +1,77 @@ package controller; -import model.Board; -import model.Piece; -import view.BoardView; +import javafx.scene.Group; +import javafx.scene.input.MouseEvent; +import model.*; +import view.*; import java.util.ArrayList; public class Log { // contains dynamic array of board, to be able to ctrl-Z equivalent ArrayList<Piece[]> logPieces; + ArrayList<PieceView[]> logWhiteGraveyard, logBlackGraveyard; public Log() { logPieces = new ArrayList<>(); + logWhiteGraveyard = new ArrayList<>(); + logBlackGraveyard = new ArrayList<>(); } public void save(Board board, BoardView boardView) { - logPieces.add(board.getAllPieces()); + Board copy = new Board(); + for(int n = 0 ; n < 64 ; n++) { + // we make a NEW COPY, not just getting pointer ! + Piece piece = board.getPiece(n); + if(piece != null) { + copy.setPiece(piece.newInstanceCopy()); + } + } + int id = logPieces.size(); + logPieces.add(id, copy.getAllPieces()); + // for graveyards, we don't need a copy, because pieces aren't moving at all once inside, so there will be no issues + PieceView[] white = new PieceView[16]; + PieceView[] black = new PieceView[16]; + for(int n = 0 ; n < 16 ; n++) { + white[n] = boardView.getWhiteGraveyard()[n]; + black[n] = boardView.getBlackGraveyard()[n]; + } + logWhiteGraveyard.add(id, white); + logBlackGraveyard.add(id, black); + + } + + public void rollback(Board board, BoardView boardView, CustomMaterial material, Custom3dModel model, Group group3d, Game game, HUD hud) { + int id = logPieces.size() - 1; + if(id > 0) { + // rollback once + logPieces.remove(id); + logWhiteGraveyard.remove(id); + logBlackGraveyard.remove(id); + // modify the game, refresh completely the board and creates pieces from log + id--; + board.clean(); // clean board (model) + boardView.visualClean(group3d); // clean board (visual) + for(int n = 0 ; n < 64 ; n++) { + Piece piece = logPieces.get(id)[n]; + //System.out.println(piece); + if(piece != null) { + board.setPiece(piece.newInstanceCopy()); // set piece (model) - new copy + Position p = piece.getPosition(); + int color = piece.getColor(); + boardView.createPiece(p, color, boardView.getMeshType(piece), material, model); // set piece (visual) + boardView.updatePiece(p); // place piece at right position in 3d (visual) + // 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)); + } + } + boardView.addPiecesOnlyToScene(group3d); // adds all the new 3d pieces to scene (visual) + game.nextTurn(); // previous turn (same as next turn actually) + } + 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 a69f812c9a467d71e0b5aa8014e51193acf74f6c..692df0bfc59080f613b88ca70474bc03b7687c2d 100644 --- a/MavenChess/MavenChess/src/main/java/controller/Main.java +++ b/MavenChess/MavenChess/src/main/java/controller/Main.java @@ -3,6 +3,8 @@ package controller; import javafx.application.Application; import javafx.beans.value.ChangeListener; import javafx.scene.*; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyEvent; import javafx.scene.input.MouseEvent; import javafx.scene.input.ScrollEvent; import javafx.scene.layout.AnchorPane; @@ -71,6 +73,7 @@ public class Main extends Application { // init - creates a (model) list of all pieces board = new Board(); + board.initBoard(); // place standard pieces // init - creates a (visual) chessboard of 8x8, and all (visual) 3d pieces boardView = new BoardView(model, material, board); @@ -99,14 +102,14 @@ 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)); + piece.getObj().addEventHandler(MouseEvent.MOUSE_CLICKED, event -> game.clickPiece(piece, board, boardView, material, model, log, hud)); } } // 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 -> game.clickTile(tile, board, boardView, material, model, log)); + tile.getObj().addEventHandler(MouseEvent.MOUSE_CLICKED, event -> game.clickTile(tile, board, boardView, material, model, log, hud)); } // event - window resize @@ -122,11 +125,19 @@ public class Main extends Application { hud.getStandard().addEventHandler(MouseEvent.MOUSE_CLICKED, event -> { hud.removeMenu(group2d); camera.stopAnimation(); + log.save(board, boardView); // save once }); hud.getVariant().addEventHandler(MouseEvent.MOUSE_CLICKED, event -> { hud.removeMenu(group2d); camera.stopAnimation(); game.setVariant(true, model, board, boardView); + log.save(board, boardView); // save once + }); + + // event - rollback + hud.getRollback().addEventHandler(MouseEvent.MOUSE_CLICKED, event -> { + boardView.resetColor(material); + log.rollback(board, boardView, material, model, group3d, game, hud); }); // start -------------------------------------------------------------- diff --git a/MavenChess/MavenChess/src/main/java/model/Bishop.java b/MavenChess/MavenChess/src/main/java/model/Bishop.java index cd2e3566b0bc6eaf0cef0c38aa52cf3e1e1dcfea..95adc589ba1e815fd810ad62a2ad3c6107510193 100644 --- a/MavenChess/MavenChess/src/main/java/model/Bishop.java +++ b/MavenChess/MavenChess/src/main/java/model/Bishop.java @@ -89,4 +89,8 @@ public class Bishop extends Piece { return moves; } + + public Piece newInstanceCopy() { + return new Bishop(p, color); + } } diff --git a/MavenChess/MavenChess/src/main/java/model/Board.java b/MavenChess/MavenChess/src/main/java/model/Board.java index 93ae81231cf533207dce597fbbc16fc1165a3b2f..f8a24ae6b90b553fea8b66315953b0d8efe78293 100644 --- a/MavenChess/MavenChess/src/main/java/model/Board.java +++ b/MavenChess/MavenChess/src/main/java/model/Board.java @@ -14,9 +14,10 @@ public class Board { selected = null; // initialisation of the list of pieces pieces = new Piece[64]; - for(int i = 0 ; i < 64 ; i++) { - pieces[i] = null; - } + clean(); + } + + public void initBoard() { // inits board with standard pieces int y; for(int color = Piece.WHITE ; color == Piece.WHITE || color == Piece.BLACK ; color++) { // placement of pawns @@ -166,6 +167,12 @@ public class Board { && getPiece(p).getClass() == Bishop.class); } + public boolean isQueen(Position p) { + return (p.isCorrect() + && !isFree(p) + && getPiece(p).getClass() == Queen.class); + } + public void setVariant(boolean isVariant) { isFeyPieces = isVariant; for(int j = 1 ; j <= 8 ; j++) { @@ -196,4 +203,10 @@ public class Board { } } } + + public void clean() { // cleans board (use carefully !) + for(int i = 0 ; i < 64 ; i++) { + pieces[i] = null; + } + } } diff --git a/MavenChess/MavenChess/src/main/java/model/Giant.java b/MavenChess/MavenChess/src/main/java/model/Giant.java index d4f7d911a16e0929a32ffc0825420ac979faf50d..42e925a538178d5fc08a8057d044ec8f0d9bece5 100644 --- a/MavenChess/MavenChess/src/main/java/model/Giant.java +++ b/MavenChess/MavenChess/src/main/java/model/Giant.java @@ -23,7 +23,7 @@ public class Giant extends Piece{ int y = all_y[n]; boolean blocked = false; int i = 1; - while (i < 4 && !blocked) { // continues "as a ray" in that direction until blocked + while (i < 4 && !blocked) { // continues in that direction until blocked by map arrival = new Position(p.getX() + (x * i), p.getY() + (y * i)); if (b.isEnemy(arrival, p) || b.isFree(arrival)) { moves.add(arrival); @@ -105,4 +105,8 @@ public class Giant extends Piece{ return moves; } + + public Piece newInstanceCopy() { + return new Giant(p, color); + } } diff --git a/MavenChess/MavenChess/src/main/java/model/Kamikaze.java b/MavenChess/MavenChess/src/main/java/model/Kamikaze.java index 882a687868c44d60ebe2ebf59a4f8b42662cad07..2dfd29b7581f6387fc0a4c3c156fa62102504a24 100644 --- a/MavenChess/MavenChess/src/main/java/model/Kamikaze.java +++ b/MavenChess/MavenChess/src/main/java/model/Kamikaze.java @@ -13,23 +13,6 @@ public class Kamikaze extends Pawn { // aka Trojan knight :P ArrayList<Position> moves = new ArrayList<>(); Position arrival; - /*if(color == Piece.WHITE) { // black and white have an opposite direction behavior - if(!hasBeenMoved){ - arrival = new Position(p.getX(),p.getY()+2); - if(arrival.isCorrect() && b.isFree(arrival)) {moves.add(arrival);} - } - arrival = new Position(p.getX(),p.getY()+1); - if(arrival.isCorrect() && b.isFree(arrival)) {moves.add(arrival);} - } - else { - if(!hasBeenMoved){ - arrival = new Position(p.getX(),p.getY()-2); - if(arrival.isCorrect() && b.isFree(arrival)) {moves.add(arrival);} - } - arrival = new Position(p.getX(),p.getY()-1); - if(arrival.isCorrect() && b.isFree(arrival)) {moves.add(arrival);} - }*/ - // list of the 8 kamikaze-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}; @@ -42,7 +25,6 @@ public class Kamikaze extends Pawn { // aka Trojan knight :P moves.add(arrival); } } - return moves; } @@ -59,7 +41,10 @@ public class Kamikaze extends Pawn { // aka Trojan knight :P } } } - return moves; } + + public Piece newInstanceCopy() { + return new Kamikaze(p, color); + } } diff --git a/MavenChess/MavenChess/src/main/java/model/King.java b/MavenChess/MavenChess/src/main/java/model/King.java index 6bb57ca083c271652356e46586be4771bd88e4ce..09a7c02661b91e4381b20ec2764efa2c94f28229 100644 --- a/MavenChess/MavenChess/src/main/java/model/King.java +++ b/MavenChess/MavenChess/src/main/java/model/King.java @@ -86,5 +86,9 @@ public class King extends Piece { return moves; } + + public Piece newInstanceCopy() { + return new King(p, color); + } } diff --git a/MavenChess/MavenChess/src/main/java/model/Knight.java b/MavenChess/MavenChess/src/main/java/model/Knight.java index b65fb00a98ce31af03a06135a2a287345973494e..d777cbd91860dd51f039a4828c5bc6e18894af29 100644 --- a/MavenChess/MavenChess/src/main/java/model/Knight.java +++ b/MavenChess/MavenChess/src/main/java/model/Knight.java @@ -79,4 +79,8 @@ public class Knight extends Piece { return moves; } + + public Piece newInstanceCopy() { + return new Knight(p, color); + } } diff --git a/MavenChess/MavenChess/src/main/java/model/Magician.java b/MavenChess/MavenChess/src/main/java/model/Magician.java index 4e3bc173998e9a69bc7813df8e2b2e94c1b106a5..28f7691a13df77376cd7e16b5c31097550732614 100644 --- a/MavenChess/MavenChess/src/main/java/model/Magician.java +++ b/MavenChess/MavenChess/src/main/java/model/Magician.java @@ -5,7 +5,7 @@ import java.util.ArrayList; public class Magician extends Piece{ private Piece copiedPiece; - protected Magician(Position p, int color) { + public Magician(Position p, int color) { super(p, color); copiedPiece = new Bishop(p, color); } @@ -39,4 +39,7 @@ public class Magician extends Piece{ if (enemy.getClass() == Giant.class) { setCopiedPiece(new Giant(p, color)); } if (enemy.getClass() == Kamikaze.class) { setCopiedPiece(new Kamikaze(p, color)); } } + public Piece newInstanceCopy() { + return new Magician(p, color); + } } diff --git a/MavenChess/MavenChess/src/main/java/model/Nwap.java b/MavenChess/MavenChess/src/main/java/model/Nwap.java index 61b7f88be68160e78ab4b32ab5ac6d16838b19bc..54b22a2aa695d93160ae36d18ccd013ef6f47451 100644 --- a/MavenChess/MavenChess/src/main/java/model/Nwap.java +++ b/MavenChess/MavenChess/src/main/java/model/Nwap.java @@ -83,4 +83,8 @@ public class Nwap extends Pawn { public void setEnPassant(boolean enPassant) { this.enPassant = enPassant; } + + public Piece newInstanceCopy() { + return new Nwap(p, color); + } } diff --git a/MavenChess/MavenChess/src/main/java/model/Pawn.java b/MavenChess/MavenChess/src/main/java/model/Pawn.java index a61afdc47e30508188f76d2c6bb7c0aa2e477bd7..b8c0e20fca347eb41ef42531cb58b187fa9a7b5e 100644 --- a/MavenChess/MavenChess/src/main/java/model/Pawn.java +++ b/MavenChess/MavenChess/src/main/java/model/Pawn.java @@ -102,5 +102,9 @@ public class Pawn extends Piece { this.enPassant = enPassant; } + public Piece newInstanceCopy() { + return new Pawn(p, color); + } + } diff --git a/MavenChess/MavenChess/src/main/java/model/Piece.java b/MavenChess/MavenChess/src/main/java/model/Piece.java index 03c1f3ede165d4309248bcae4262010bfdb4e9cb..4bfd041d960d6a3747ba879a7de18d46a551b2d1 100644 --- a/MavenChess/MavenChess/src/main/java/model/Piece.java +++ b/MavenChess/MavenChess/src/main/java/model/Piece.java @@ -45,4 +45,6 @@ public abstract class Piece { this.p = new Position(p.getX(), p.getY()); // creates a new copy, to avoid using reference hasBeenMoved = true; } + + public abstract Piece newInstanceCopy(); } diff --git a/MavenChess/MavenChess/src/main/java/model/Queen.java b/MavenChess/MavenChess/src/main/java/model/Queen.java index 0bf59fd6223f09a7810b6a2892ac682886312491..62b8bc6f85f5aacb19a57ddaec4164c29a90021f 100644 --- a/MavenChess/MavenChess/src/main/java/model/Queen.java +++ b/MavenChess/MavenChess/src/main/java/model/Queen.java @@ -131,4 +131,8 @@ public class Queen extends Piece{ return moves; } + + public Piece newInstanceCopy() { + return new Queen(p, color); + } } diff --git a/MavenChess/MavenChess/src/main/java/model/Rook.java b/MavenChess/MavenChess/src/main/java/model/Rook.java index a04763e2c50b2fb6d3c7398810462e9e4a5f0d1d..00237f3f1998a883e93cb7b8059407c13f2b5233 100644 --- a/MavenChess/MavenChess/src/main/java/model/Rook.java +++ b/MavenChess/MavenChess/src/main/java/model/Rook.java @@ -110,4 +110,8 @@ public class Rook extends Piece { return moves; } + + public Piece newInstanceCopy() { + return new Rook(p, color); + } } diff --git a/MavenChess/MavenChess/src/main/java/view/BoardView.java b/MavenChess/MavenChess/src/main/java/view/BoardView.java index ba4d6a675e2a84acdac0de1d1a898904a299efcc..fcf0e986765193fed6bf68f3098d2e658fa5fe1e 100644 --- a/MavenChess/MavenChess/src/main/java/view/BoardView.java +++ b/MavenChess/MavenChess/src/main/java/view/BoardView.java @@ -6,6 +6,8 @@ import javafx.scene.shape.*; import model.*; import javafx.util.Duration; +import java.util.ArrayList; + public class BoardView { public static final int BOARD_SIZE = 16, CENTERED_ORIGIN = -BOARD_SIZE*7/2, BOARD_HEIGHT = -5, GRAVEYARD_HEIGHT = -1; @@ -13,6 +15,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; private final Box[] border; // visual border for the board @@ -30,8 +33,8 @@ public class BoardView { // creates the 3d pieces (from the board list) pieces = new PieceView[64]; + clean(); for(int n = 0 ; n < 64 ; n++) { - pieces[n] = null; Piece piece = board.getPiece(n); if(piece != null) { createPiece(piece.getPosition(), piece.getColor(), getMeshType(piece), material, model); @@ -40,6 +43,8 @@ public class BoardView { // init graveyards as empty black_death_count = 0; white_death_count = 0; + blackGraveyard = new PieceView[16]; // 16 is maximum kills + whiteGraveyard = new PieceView[16]; resetColor(material); // init/reset the board squares with black and white @@ -75,11 +80,23 @@ public class BoardView { return pieces[id].getObj(); } + public PieceView[] getAllPieces() { + return pieces; + } + + public PieceView[] getWhiteGraveyard() { + return whiteGraveyard; + } + + public PieceView[] getBlackGraveyard() { + return blackGraveyard; + } + public void setPiece(PieceView piece) { pieces[piece.getPosition().getID()] = piece; } - private int getMeshType(Piece piece) { + public int getMeshType(Piece piece) { 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; } @@ -102,7 +119,7 @@ public class BoardView { setTile(new TileView(box, position)); } - private void createPiece(Position position, int color, int type, CustomMaterial material, Custom3dModel model) { + public 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); @@ -126,7 +143,7 @@ public class BoardView { updatePiece(position); } - private void updatePiece(Position position) { // updates the piece(i, j), visually, to the right position + public void updatePiece(Position position) { // updates the piece(i, j), visually, to the right position int id = position.getID(); if(getPiece(id) != null) { getPieceObj(id).setTranslateX((position.getX()-1) * BOARD_SIZE + CENTERED_ORIGIN); @@ -203,13 +220,16 @@ public class BoardView { updatePieceWithAnimation(arrival); // updates 3d model position (visual) but animated } + // places a piece on graveyard public void killPiece(Position p) { // graveyards are specified as negative x PieceView piece = getPiece(p.getID()); if(piece.getColor() == Piece.WHITE){ + whiteGraveyard[white_death_count] = piece; white_death_count++; piece.setPosition(new Position(1, white_death_count)); piece.getPosition().setX(Position.WHITE_GRAVEYARD); } else { + blackGraveyard[black_death_count] = piece; black_death_count++; piece.setPosition(new Position(1, black_death_count)); piece.getPosition().setX(Position.BLACK_GRAVEYARD); @@ -230,16 +250,22 @@ public class BoardView { if(getTile(n) != null) { group.getChildren().add(getTileObj(n)); } - if(getPiece(n) != null) { - group.getChildren().add(getPieceObj(n)); - } } for(int n = 0 ; n < 4 ; n++) { group.getChildren().add(border[n]); } + addPiecesOnlyToScene(group); + } + + public void addPiecesOnlyToScene(Group group) { + for(int n = 0 ; n < 64 ; n++) { + if (getPiece(n) != null) { + group.getChildren().add(getPieceObj(n)); + } + } } - public void refresh(Board b, Custom3dModel model) { + public void refresh(Board b, Custom3dModel model) { // refresh the 3d objects/meshes, from piece type for(int j = 1 ; j <= 8 ; j++) { for (int i = 1; i <= 8; i++) { Position p = new Position(i, j); @@ -252,4 +278,20 @@ public class BoardView { } } } + + public void visualClean(Group group) { // cleans board visually, then data + for(int n = 0 ; n < 64 ; n++) { + PieceView piece = getPiece(n); + if (piece != null) { + group.getChildren().remove(piece.getObj()); + } + } + clean(); + } + + private void clean() { // private, don't use clean, use visualClean, otherwise meshes will stay on screen + for(int n = 0 ; n < 64 ; n++) { + pieces[n] = null; + } + } } diff --git a/MavenChess/MavenChess/src/main/java/view/HUD.java b/MavenChess/MavenChess/src/main/java/view/HUD.java index 43a024cb4bff17b5928c21c33a03ee272a431c8c..d3625717df28b2803c23b08a0392cd5b76f8e6ca 100644 --- a/MavenChess/MavenChess/src/main/java/view/HUD.java +++ b/MavenChess/MavenChess/src/main/java/view/HUD.java @@ -10,8 +10,8 @@ import javafx.scene.shape.Rectangle; public class HUD { - private Image standard_img, variant_img; - private ImageView standard_imgView, variant_imgView; + private Image standard_img, variant_img, rollback_img; + private ImageView standard_imgView, variant_imgView, rollback_imgView; private Rectangle darkener; public HUD() { @@ -41,6 +41,11 @@ 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(); } public void resize(double width, double height) { @@ -54,6 +59,8 @@ 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); } public ImageView getStandard() { @@ -64,10 +71,21 @@ public class HUD { return variant_imgView; } + public ImageView getRollback() { + return rollback_imgView; + } + + public void rollbackHide() { + rollback_imgView.setOpacity(0); + } + public void rollbackShow() { + rollback_imgView.setOpacity(1); + } + public void removeMenu(AnchorPane group2d) { group2d.getChildren().removeAll(darkener, standard_imgView, variant_imgView); } public void addAllToScene(AnchorPane group2d) { - group2d.getChildren().addAll(darkener, standard_imgView, variant_imgView); + group2d.getChildren().addAll(darkener, standard_imgView, variant_imgView, rollback_imgView); } } diff --git a/MavenChess/MavenChess/src/main/java/view/Room.java b/MavenChess/MavenChess/src/main/java/view/Room.java index 79f7c032bb598ce32b2a0ef881f3c7d59fcabdc6..0e3c64c3617196dfeff85602e951d454e3b059c1 100644 --- a/MavenChess/MavenChess/src/main/java/view/Room.java +++ b/MavenChess/MavenChess/src/main/java/view/Room.java @@ -2,48 +2,66 @@ package view; import javafx.scene.Group; import javafx.scene.shape.Box; -import javafx.scene.shape.CullFace; public class Room { - private final Box[] walls; + private final Box[] walls, ground; + private final Box ceiling; - public Room(CustomMaterial material) { + private final static int WALL_N = 0, WALL_E = 1, WALL_S = 2, WALL_W = 3, GROUND = 4, CEILING = 5; + private final static int GROUND_X = 8, GROUND_Y = 8; - /*int size = BoardView.BOARD_SIZE*64; - int height = BoardView.BOARD_SIZE*32; - walls = new Box(size, height, size); - walls.setMaterial(material.get(CustomMaterial.BLACK_TILE)); - walls.setCullFace(CullFace.BACK);*/ + public Room(CustomMaterial material) { int size = BoardView.BOARD_SIZE*60; double height = 0.5; - walls = new Box[6]; + int[] pos_x = {0, 1, 0, -1, 0, 0}; int[] pos_y = {0, 0, 0, 0, 1, -1}; int[] pos_z = {1, 0, -1, 0, 0, 0}; int[] size_x = {1, 0, 1, 0, 1, 1}; int[] size_y = {1, 1, 1, 1, 0, 0}; int[] size_z = {0, 1, 0, 1, 1, 1}; - for(int n = 0 ; n < 6 ; n++) { + + // Ground + ground = new Box[8*8]; + for(int j = 0 ; j < GROUND_Y ; j++) { + for (int i = 0; i < GROUND_X; i++) { + int n = j * 8 + i; + ground[n] = new Box(1 + size_x[GROUND] * size / GROUND_X, 1 + size_y[GROUND] * size * height, 1 + size_z[GROUND] * size / GROUND_Y); + ground[n].translateXProperty().set((double) /*pos_x[GROUND] * (size / 2) +*/ (i * size / GROUND_X) - (size / 2) + (size / GROUND_X / 2)); + ground[n].translateYProperty().set((double) /*(pos_y[GROUND] * (size / 2) - (size / 2)) * height +*/ BoardView.BOARD_SIZE * 9); // centered up, then down to table legs + ground[n].translateZProperty().set((double) /*pos_z[GROUND] * (size / 2) +*/ (j * size / GROUND_Y) - (size / 2) + (size / GROUND_Y / 2)); + ground[n].setMaterial(material.get(CustomMaterial.CARPET)); + } + } + + // Ceiling + ceiling = new Box(1 + size_x[CEILING]*size, 1 + size_y[CEILING]*size*height, 1 + size_z[CEILING]*size); + ceiling.translateXProperty().set((double) pos_x[CEILING] * (size/2)); + ceiling.translateYProperty().set((double) (pos_y[CEILING] * (size/2) - (size/2)) * height + BoardView.BOARD_SIZE*9); // centered up, then down to table legs + ceiling.translateZProperty().set((double) pos_z[CEILING] * (size/2)); + ceiling.setMaterial(material.get(CustomMaterial.WHITE)); + + // Walls + walls = new Box[4]; + for(int n = 0 ; n < 4 ; n++) { walls[n] = new Box(1 + size_x[n]*size, 1 + size_y[n]*size*height, 1 + size_z[n]*size); walls[n].translateXProperty().set((double) pos_x[n] * (size/2)); walls[n].translateYProperty().set((double) (pos_y[n] * (size/2) - (size/2)) * height + BoardView.BOARD_SIZE*9); // centered up, then down to table legs walls[n].translateZProperty().set((double) pos_z[n] * (size/2)); + walls[n].setMaterial(material.get(CustomMaterial.STUDIO_WALL)); } - // Ground - walls[4].setMaterial(material.get(CustomMaterial.CARPET)); - // Ceiling - walls[5].setMaterial(material.get(CustomMaterial.WHITE)); - // Walls - walls[0].setMaterial(material.get(CustomMaterial.STUDIO_WALL)); - walls[1].setMaterial(material.get(CustomMaterial.STUDIO_WALL)); - walls[2].setMaterial(material.get(CustomMaterial.STUDIO_WALL)); - walls[3].setMaterial(material.get(CustomMaterial.STUDIO_WALL)); } public void addAllToScene(Group group) { - //group.getChildren().add(walls); - for(int n = 0 ; n < 6 ; n++) { + // Ground + for(int n = 0 ; n < 8*8 ; n++) { + group.getChildren().add(ground[n]); + } + // Ceiling + group.getChildren().add(ceiling); + // Walls + for(int n = 0 ; n < 4 ; n++) { group.getChildren().add(walls[n]); } } diff --git a/MavenChess/MavenChess/src/main/resources/carpet.jpg b/MavenChess/MavenChess/src/main/resources/carpet.jpg index 9536e031b66400b03564da16b242121cc700ee01..10965db0b337b409977c9591581548f960ef1bd0 100644 Binary files a/MavenChess/MavenChess/src/main/resources/carpet.jpg and b/MavenChess/MavenChess/src/main/resources/carpet.jpg differ diff --git a/MavenChess/MavenChess/src/main/resources/rollback.png b/MavenChess/MavenChess/src/main/resources/rollback.png new file mode 100644 index 0000000000000000000000000000000000000000..a57dac8b6628d19f925afb0199234c641a624027 Binary files /dev/null and b/MavenChess/MavenChess/src/main/resources/rollback.png differ diff --git a/MavenChess/MavenChess/target/classes/controller/Main.class b/MavenChess/MavenChess/target/classes/controller/Main.class index 86e6c5508d2b7614d60f252634cf6e9ee5ce4704..db8b50f73dea42f53e94e648204e176b02d94a85 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/Bishop.class b/MavenChess/MavenChess/target/classes/model/Bishop.class index 832b9497d29b38de2956a0abe0267ae57755b1ad..d67cdb65aa2e0f3ab88d8f133db3ded962eeae64 100644 Binary files a/MavenChess/MavenChess/target/classes/model/Bishop.class and b/MavenChess/MavenChess/target/classes/model/Bishop.class differ diff --git a/MavenChess/MavenChess/target/classes/model/Board.class b/MavenChess/MavenChess/target/classes/model/Board.class index 8451c0881bd6e5a99e303545b9889a28167d2f60..0873bf14700ddbb8bc09c91d963b18f2f8449b74 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/Giant.class b/MavenChess/MavenChess/target/classes/model/Giant.class index 43177252b08e2c1fb809cd20ce087fe640b76db1..03045689ccd16b0b7712d91e8a0951bcddc84c15 100644 Binary files a/MavenChess/MavenChess/target/classes/model/Giant.class and b/MavenChess/MavenChess/target/classes/model/Giant.class differ diff --git a/MavenChess/MavenChess/target/classes/model/Kamikaze.class b/MavenChess/MavenChess/target/classes/model/Kamikaze.class index bc82b5d2c762f16d0c5a41e2e7af6163853c6daa..a553fbace5503be18c80d345cf1c68c8be58995a 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 d65b114ff0c54a6ee0ff7a82f114683e338e82a4..44e5314230738f670e764fe86e51d6b91926a73c 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/Knight.class b/MavenChess/MavenChess/target/classes/model/Knight.class index a2fb5a72f9b96f88fa01675125be2b18fe9d8c6b..9194f0e6d242b308fae3694395190ac4fffa20a3 100644 Binary files a/MavenChess/MavenChess/target/classes/model/Knight.class and b/MavenChess/MavenChess/target/classes/model/Knight.class differ diff --git a/MavenChess/MavenChess/target/classes/model/Magician.class b/MavenChess/MavenChess/target/classes/model/Magician.class index f801dce876007630df38376e796dfd993725c0f2..74d8dbc95eaa68146b3165f6af0e790b1e546eba 100644 Binary files a/MavenChess/MavenChess/target/classes/model/Magician.class and b/MavenChess/MavenChess/target/classes/model/Magician.class differ diff --git a/MavenChess/MavenChess/target/classes/model/Nwap.class b/MavenChess/MavenChess/target/classes/model/Nwap.class index c273033df9b7465fdafc8be19375d84470913a55..ff4b580f756aed50be7d614d201301d61f7dbb91 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 6dae773e174ac427e7b93206b7439cdf8da34f98..86be28f797066004817129314fe773d18fdc2d6e 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 ff3381d6210cc158f50aa92f3eddded279ec977d..a91a7058c2e3e95d3ba4cae8dfdc98aceaa48ac3 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/Queen.class b/MavenChess/MavenChess/target/classes/model/Queen.class index 99db5da17bccc0d501fdc65cf89700ac9c579f60..cd0f9082c0fbd3ebc9224d680928b7ffa8023c86 100644 Binary files a/MavenChess/MavenChess/target/classes/model/Queen.class and b/MavenChess/MavenChess/target/classes/model/Queen.class differ diff --git a/MavenChess/MavenChess/target/classes/model/Rook.class b/MavenChess/MavenChess/target/classes/model/Rook.class index 936be027e604e017fbd32ca0ca0b34308ae8b7a1..ccde08248a119e91baf3a4efefc0806e5f3bea4c 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 a69cf882baf2ec66c24bb8dcb8fa7b8a97327849..1a8bd63306c2d5a552982958e19c0fdda10f8894 100644 Binary files a/MavenChess/MavenChess/target/classes/view/BoardView.class and b/MavenChess/MavenChess/target/classes/view/BoardView.class differ