2019-07-10 18:54:53 +02:00
|
|
|
package dev.kske.chess.board;
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.List;
|
|
|
|
|
2019-07-24 07:32:59 +02:00
|
|
|
import dev.kske.chess.board.Piece.Color;
|
|
|
|
|
2019-07-10 18:54:53 +02:00
|
|
|
/**
|
|
|
|
* Project: <strong>Chess</strong><br>
|
|
|
|
* File: <strong>Log.java</strong><br>
|
|
|
|
* Created: <strong>09.07.2019</strong><br>
|
|
|
|
* Author: <strong>Kai S. K. Engelbart</strong>
|
|
|
|
*/
|
|
|
|
public class Log implements Cloneable {
|
|
|
|
|
2019-07-24 07:32:59 +02:00
|
|
|
private List<LoggedMove> moves;
|
|
|
|
private Color activeColor;
|
2019-07-10 18:54:53 +02:00
|
|
|
|
|
|
|
public Log() {
|
2019-07-24 07:32:59 +02:00
|
|
|
moves = new ArrayList<>();
|
|
|
|
activeColor = Color.WHITE;
|
2019-07-10 18:54:53 +02:00
|
|
|
}
|
|
|
|
|
2019-07-24 07:32:59 +02:00
|
|
|
public void add(Move move, Piece capturedPiece, boolean pawnMove) {
|
|
|
|
int fullmoveCounter, halfmoveClock;
|
|
|
|
if (moves.isEmpty()) {
|
|
|
|
fullmoveCounter = 1;
|
|
|
|
halfmoveClock = 0;
|
|
|
|
} else {
|
|
|
|
fullmoveCounter = getLast().fullmoveCounter;
|
|
|
|
if (activeColor == Color.BLACK) ++fullmoveCounter;
|
|
|
|
halfmoveClock = capturedPiece != null || pawnMove ? 0 : getLast().halfmoveClock + 1;
|
|
|
|
}
|
|
|
|
activeColor = activeColor.opposite();
|
|
|
|
moves.add(new LoggedMove(move, capturedPiece, fullmoveCounter, halfmoveClock));
|
2019-07-10 18:54:53 +02:00
|
|
|
}
|
|
|
|
|
2019-07-24 15:58:23 +02:00
|
|
|
public LoggedMove getLast() { return moves.isEmpty() ? null : moves.get(moves.size() - 1); }
|
2019-07-24 07:32:59 +02:00
|
|
|
|
2019-07-10 18:54:53 +02:00
|
|
|
public void removeLast() {
|
2019-07-24 07:32:59 +02:00
|
|
|
if (!moves.isEmpty()) {
|
|
|
|
activeColor = activeColor.opposite();
|
|
|
|
moves.remove(moves.size() - 1);
|
|
|
|
}
|
2019-07-10 18:54:53 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Object clone() {
|
|
|
|
Log log = null;
|
|
|
|
try {
|
|
|
|
log = (Log) super.clone();
|
|
|
|
} catch (CloneNotSupportedException e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
|
|
|
log.moves = new ArrayList<>();
|
|
|
|
log.moves.addAll(this.moves);
|
|
|
|
return log;
|
|
|
|
}
|
|
|
|
|
2019-07-24 07:32:59 +02:00
|
|
|
public Color getActiveColor() { return activeColor; }
|
|
|
|
|
2019-07-10 18:54:53 +02:00
|
|
|
public static class LoggedMove {
|
|
|
|
|
2019-07-24 07:32:59 +02:00
|
|
|
public final Move move;
|
2019-07-10 18:54:53 +02:00
|
|
|
public final Piece capturedPiece;
|
2019-07-24 07:32:59 +02:00
|
|
|
public final int fullmoveCounter, halfmoveClock;
|
2019-07-10 18:54:53 +02:00
|
|
|
|
2019-07-24 07:32:59 +02:00
|
|
|
public LoggedMove(Move move, Piece capturedPiece, int fullmoveCounter, int halfmoveClock) {
|
|
|
|
this.move = move;
|
|
|
|
this.capturedPiece = capturedPiece;
|
|
|
|
this.fullmoveCounter = fullmoveCounter;
|
|
|
|
this.halfmoveClock = halfmoveClock;
|
2019-07-10 18:54:53 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|