Last changes for quicksave
parent
aebfb7e38b
commit
59233efcca
|
@ -7,6 +7,7 @@ import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import javax.swing.BorderFactory;
|
import javax.swing.BorderFactory;
|
||||||
|
import javax.swing.JOptionPane;
|
||||||
|
|
||||||
import com.github.bhlangonijr.chesslib.game.Game;
|
import com.github.bhlangonijr.chesslib.game.Game;
|
||||||
|
|
||||||
|
@ -26,6 +27,7 @@ public class GameController {
|
||||||
private boolean gameOver = false;
|
private boolean gameOver = false;
|
||||||
private int selectedRow = -1, selectedCol = -1;
|
private int selectedRow = -1, selectedCol = -1;
|
||||||
private List<int[]> highlightedFields = new ArrayList<>();
|
private List<int[]> highlightedFields = new ArrayList<>();
|
||||||
|
private boolean gameWasResignedOrDrawn = false;
|
||||||
private GameMode gameMode;
|
private GameMode gameMode;
|
||||||
|
|
||||||
public GameController(GameGui gui, ChessEngine engine, GameEndCallback callback, GameMode gameMode) {
|
public GameController(GameGui gui, ChessEngine engine, GameEndCallback callback, GameMode gameMode) {
|
||||||
|
@ -33,7 +35,7 @@ public class GameController {
|
||||||
this.gameMode = gameMode;
|
this.gameMode = gameMode;
|
||||||
if (gameMode != null) {
|
if (gameMode != null) {
|
||||||
engine.initTimers(gameMode.minutes, gameMode.incrementSeconds);
|
engine.initTimers(gameMode.minutes, gameMode.incrementSeconds);
|
||||||
time();
|
setupAndStartTimers();
|
||||||
}
|
}
|
||||||
addWindowCloseListener();
|
addWindowCloseListener();
|
||||||
}
|
}
|
||||||
|
@ -49,13 +51,31 @@ public class GameController {
|
||||||
initListeners();
|
initListeners();
|
||||||
updateGuiBoard();
|
updateGuiBoard();
|
||||||
}
|
}
|
||||||
private void time() {
|
|
||||||
engine.getWhiteTimer().setOnTick(secs -> gui.updateWhiteTimerLabel(secs));
|
private void setupAndStartTimers() {
|
||||||
engine.getBlackTimer().setOnTick(secs -> gui.updateBlackTimerLabel(secs));
|
if (engine.getWhiteTimer() != null) {
|
||||||
engine.getWhiteTimer().setOnTimeout(() -> onTimeout("WHITE"));
|
engine.getWhiteTimer().setOnTick(secs -> gui.updateWhiteTimerLabel(secs));
|
||||||
engine.getBlackTimer().setOnTimeout(() -> onTimeout("BLACK"));
|
engine.getWhiteTimer().setOnTimeout(() -> onTimeout("WHITE"));
|
||||||
engine.getWhiteTimer().start();
|
engine.getWhiteTimer().stop(); // <-- WICHTIG!
|
||||||
|
}
|
||||||
|
if (engine.getBlackTimer() != null) {
|
||||||
|
engine.getBlackTimer().setOnTick(secs -> gui.updateBlackTimerLabel(secs));
|
||||||
|
engine.getBlackTimer().setOnTimeout(() -> onTimeout("BLACK"));
|
||||||
|
engine.getBlackTimer().stop(); // <-- WICHTIG!
|
||||||
|
}
|
||||||
|
// Timer-Labels initial setzen
|
||||||
|
if (engine.getWhiteTimer() != null) gui.updateWhiteTimerLabel(engine.getWhiteTimer().getSecondsLeft());
|
||||||
|
if (engine.getBlackTimer() != null) gui.updateBlackTimerLabel(engine.getBlackTimer().getSecondsLeft());
|
||||||
|
|
||||||
|
// Aktuellen Spieler-Timer starten:
|
||||||
|
if (engine.getCurrentPlayer().equals("WHITE")) {
|
||||||
|
engine.getWhiteTimer().start();
|
||||||
|
} else {
|
||||||
|
engine.getBlackTimer().start();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private int flipRow(int row) {
|
private int flipRow(int row) {
|
||||||
return gui.isFlipped() ? 7 - row : row;
|
return gui.isFlipped() ? 7 - row : row;
|
||||||
}
|
}
|
||||||
|
@ -153,16 +173,16 @@ public class GameController {
|
||||||
|
|
||||||
// --- AUFGEBEN-BUTTON ---
|
// --- AUFGEBEN-BUTTON ---
|
||||||
gui.getResignButton().addActionListener(e -> {
|
gui.getResignButton().addActionListener(e -> {
|
||||||
engine.clearQuicksave();
|
|
||||||
if (gameOver) return;
|
if (gameOver) return;
|
||||||
int answer = javax.swing.JOptionPane.showConfirmDialog(
|
int answer = JOptionPane.showConfirmDialog(
|
||||||
null,
|
null,
|
||||||
"Willst du wirklich aufgeben?",
|
"Willst du wirklich aufgeben?",
|
||||||
"Aufgeben",
|
"Aufgeben",
|
||||||
javax.swing.JOptionPane.YES_NO_OPTION
|
JOptionPane.YES_NO_OPTION
|
||||||
);
|
);
|
||||||
if (answer == javax.swing.JOptionPane.YES_OPTION) {
|
if (answer == JOptionPane.YES_OPTION) {
|
||||||
gameOver = true;
|
gameOver = true;
|
||||||
|
gameWasResignedOrDrawn = true; // <<<<<<
|
||||||
String winner = engine.getCurrentPlayer().equals("WHITE") ? "SCHWARZ" : "WEIß";
|
String winner = engine.getCurrentPlayer().equals("WHITE") ? "SCHWARZ" : "WEIß";
|
||||||
gui.displayMessage(winner + " gewinnt durch Aufgabe!");
|
gui.displayMessage(winner + " gewinnt durch Aufgabe!");
|
||||||
if (engine.getWhiteTimer() != null) engine.getWhiteTimer().stop();
|
if (engine.getWhiteTimer() != null) engine.getWhiteTimer().stop();
|
||||||
|
@ -172,22 +192,23 @@ public class GameController {
|
||||||
});
|
});
|
||||||
|
|
||||||
gui.getDrawButton().addActionListener(e -> {
|
gui.getDrawButton().addActionListener(e -> {
|
||||||
engine.clearQuicksave();
|
|
||||||
if (gameOver) return;
|
if (gameOver) return;
|
||||||
int answer = javax.swing.JOptionPane.showConfirmDialog(
|
int answer = JOptionPane.showConfirmDialog(
|
||||||
null,
|
null,
|
||||||
"Remis anbieten? (Das Spiel endet sofort unentschieden)",
|
"Remis anbieten? (Das Spiel endet sofort unentschieden)",
|
||||||
"Remis",
|
"Remis",
|
||||||
javax.swing.JOptionPane.YES_NO_OPTION
|
JOptionPane.YES_NO_OPTION
|
||||||
);
|
);
|
||||||
if (answer == javax.swing.JOptionPane.YES_OPTION) {
|
if (answer == JOptionPane.YES_OPTION) {
|
||||||
gameOver = true;
|
gameOver = true;
|
||||||
|
gameWasResignedOrDrawn = true; // <<<<<<
|
||||||
gui.displayMessage("Remis! (durch Einigung)");
|
gui.displayMessage("Remis! (durch Einigung)");
|
||||||
if (engine.getWhiteTimer() != null) engine.getWhiteTimer().stop();
|
if (engine.getWhiteTimer() != null) engine.getWhiteTimer().stop();
|
||||||
if (engine.getBlackTimer() != null) engine.getBlackTimer().stop();
|
if (engine.getBlackTimer() != null) engine.getBlackTimer().stop();
|
||||||
askForRestart();
|
askForRestart();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
gui.getUndoButton().addActionListener(e -> {
|
gui.getUndoButton().addActionListener(e -> {
|
||||||
// Wer ist am Zug? (Das ist der, der gefragt wird)
|
// Wer ist am Zug? (Das ist der, der gefragt wird)
|
||||||
|
@ -377,22 +398,29 @@ public class GameController {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void askForRestart() {
|
private void askForRestart() {
|
||||||
int answer = javax.swing.JOptionPane.showConfirmDialog(
|
int answer = JOptionPane.showConfirmDialog(
|
||||||
null,
|
null,
|
||||||
"Neue Partie starten?",
|
"Neue Partie starten?",
|
||||||
"Spiel beendet",
|
"Spiel beendet",
|
||||||
javax.swing.JOptionPane.YES_NO_OPTION
|
JOptionPane.YES_NO_OPTION
|
||||||
);
|
);
|
||||||
javax.swing.SwingUtilities.getWindowAncestor(gui.getField(0, 0)).dispose();
|
javax.swing.SwingUtilities.getWindowAncestor(gui.getField(0, 0)).dispose();
|
||||||
if (answer == javax.swing.JOptionPane.YES_OPTION) {
|
if (answer == JOptionPane.YES_OPTION) {
|
||||||
engine.clearQuicksave(); // Quicksave löschen!
|
engine.clearQuicksave();
|
||||||
MainController.engineRAM = null;
|
MainController.engineRAM = null;
|
||||||
callback.onNewGameRequested();
|
callback.onNewGameRequested();
|
||||||
} else {
|
} else {
|
||||||
engine.quicksave(); // Im RAM speichern!
|
// HIER: QuickSave **NUR** falls das Spiel NICHT durch Aufgabe/Remis/Patt beendet wurde!
|
||||||
MainController.engineRAM = engine; // Referenz für das nächste Mal
|
if (!gameWasResignedOrDrawn) {
|
||||||
|
engine.quicksave();
|
||||||
|
MainController.engineRAM = engine;
|
||||||
|
} else {
|
||||||
|
engine.clearQuicksave();
|
||||||
|
MainController.engineRAM = null;
|
||||||
|
}
|
||||||
callback.onReturnToMenu();
|
callback.onReturnToMenu();
|
||||||
}
|
}
|
||||||
|
gameWasResignedOrDrawn = false; // Reset für nächstes Spiel
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -32,27 +32,36 @@ public class MainController {
|
||||||
|
|
||||||
private void startNormalMode() {
|
private void startNormalMode() {
|
||||||
// Prüfe, ob es im RAM ein Quicksave gibt:
|
// Prüfe, ob es im RAM ein Quicksave gibt:
|
||||||
if (engineRAM != null && engineRAM.quickload()) {
|
if (engineRAM != null && engineRAM.quickload()) {
|
||||||
int choice = JOptionPane.showConfirmDialog(
|
int choice = JOptionPane.showConfirmDialog(
|
||||||
null,
|
null,
|
||||||
"Letzte Partie fortsetzen?",
|
"Letzte Partie fortsetzen?",
|
||||||
"Quicksave gefunden",
|
"Quicksave gefunden",
|
||||||
JOptionPane.YES_NO_OPTION
|
JOptionPane.YES_NO_OPTION
|
||||||
);
|
);
|
||||||
if (choice == JOptionPane.YES_OPTION) {
|
if (choice == JOptionPane.YES_OPTION) {
|
||||||
GameGui gameGui = new GameGui();
|
GameGui gameGui = new GameGui();
|
||||||
GameEndCallback callback = new GameEndCallback() {
|
GameEndCallback callback = new GameEndCallback() {
|
||||||
public void onNewGameRequested() { startNormalMode(); }
|
public void onNewGameRequested() { startNormalMode(); }
|
||||||
public void onReturnToMenu() { new MainController(); }
|
public void onReturnToMenu() { new MainController(); }
|
||||||
};
|
};
|
||||||
new GameController(gameGui, engineRAM, callback);
|
new GameController(gameGui, engineRAM, callback); // KEIN initTimers, KEIN neuer Engine!
|
||||||
mainGui.close();
|
// --- Timerlabels aktualisieren
|
||||||
return; // Fertig!
|
gameGui.updateWhiteTimerLabel(engineRAM.getWhiteTimer().getSecondsLeft());
|
||||||
} else {
|
gameGui.updateBlackTimerLabel(engineRAM.getBlackTimer().getSecondsLeft());
|
||||||
engineRAM.clearQuicksave();
|
// --- Timer des aktuellen Spielers starten
|
||||||
engineRAM = null;
|
if (engineRAM.getCurrentPlayer().equals("WHITE")) {
|
||||||
}
|
engineRAM.getWhiteTimer().start();
|
||||||
}
|
} else {
|
||||||
|
engineRAM.getBlackTimer().start();
|
||||||
|
}
|
||||||
|
mainGui.close();
|
||||||
|
return; // Fertig!
|
||||||
|
} else {
|
||||||
|
engineRAM.clearQuicksave();
|
||||||
|
engineRAM = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Neues Spiel normal starten:
|
// Neues Spiel normal starten:
|
||||||
GameMode mode = GameModeSelector.selectGameMode();
|
GameMode mode = GameModeSelector.selectGameMode();
|
||||||
|
|
|
@ -323,8 +323,23 @@ public class ChessEngine {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void initTimers(int min, int sec) {
|
public void initTimers(int min, int sec) {
|
||||||
whiteTimer = new Timer(min, sec);
|
if (whiteTimer == null) {
|
||||||
blackTimer = new Timer(min, sec);
|
whiteTimer = new Timer(min, sec);
|
||||||
|
} else if (quicksaveWhiteTimeLeft != -1) {
|
||||||
|
whiteTimer = new Timer(min, sec);
|
||||||
|
whiteTimer.setSecondsLeft(quicksaveWhiteTimeLeft);
|
||||||
|
} else {
|
||||||
|
whiteTimer = new Timer(min, sec);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (blackTimer == null) {
|
||||||
|
blackTimer = new Timer(min, sec);
|
||||||
|
} else if (quicksaveBlackTimeLeft != -1) {
|
||||||
|
blackTimer = new Timer(min, sec);
|
||||||
|
blackTimer.setSecondsLeft(quicksaveBlackTimeLeft);
|
||||||
|
} else {
|
||||||
|
blackTimer = new Timer(min, sec);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void saveAsPgn(Game game, String path, String dateiname) {
|
public void saveAsPgn(Game game, String path, String dateiname) {
|
||||||
|
|
Loading…
Reference in New Issue