From c34d9989f8c3325ba97fa7dfc351e49f1cc26280 Mon Sep 17 00:00:00 2001 From: Martin Stenhagen Date: Wed, 14 Jan 2026 16:33:44 +0100 Subject: [PATCH] =?UTF-8?q?Uppdateringar=20i=20TravelGameController=20f?= =?UTF-8?q?=C3=B6r=20att=20f=C3=A5nga=20exceptions=20om=20en=20spelare=20i?= =?UTF-8?q?nte=20har=20r=C3=A5d=20att=20forts=C3=A4tta.=20Nya=20metoden=20?= =?UTF-8?q?eliminatePlayer()=20tar=20bort=20den=20spelare=20och=20=C3=B6vr?= =?UTF-8?q?iga=20kan=20spela=20klart.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/example/TravelGameController.java | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/src/main/java/org/example/TravelGameController.java b/src/main/java/org/example/TravelGameController.java index eb7c9bc4..f88d4855 100644 --- a/src/main/java/org/example/TravelGameController.java +++ b/src/main/java/org/example/TravelGameController.java @@ -231,6 +231,9 @@ public void onRoll(ActionEvent actionEvent) { } doMove(current.getId(), selectedMove); + // om spelaren blev eliminerad kan listan ha ändrats + if (players.isEmpty() || wonGame) return; + if (currentPlayerIndex >= players.size()) currentPlayerIndex = 0; awaitingMoveChoice = false; selectedMove = null; @@ -517,12 +520,35 @@ private void doMove(Long travelerId, PossibleMoves chosen) { } syncHudAndMap(); + } catch (IllegalStateException e) { + // typiskt: "traveler cannot afford this move" + if (tx.isActive()) tx.rollback(); + + String msg = e.getMessage() != null ? e.getMessage() : "okänt fel"; + if (msg.toLowerCase().contains("cannot afford")) { + eliminatePlayer(em.find(Traveler.class, travelerId), "har inte råd att resa"); + return; // viktigt så vi inte re-throwar och crashar + } + + logList.getItems().add("⚠️ kunde inte genomföra drag: " + msg); + // resetta state så man kan försöka igen utan att fastna + awaitingMoveChoice = false; + selectedMove = null; + rollButton.setText("ROLL"); + movesBox.getChildren().clear(); + shownMoves = List.of(); + moveButtons.clear(); + lastClickedDestination = null; + cycleIndex = 0; + syncHudAndMap(); + } catch (RuntimeException e) { if (tx.isActive()) tx.rollback(); throw e; } finally { rollButton.setDisable(false); } + } private void doesPlayerWin() { @@ -535,6 +561,45 @@ private void doesPlayerWin() { } } + private void eliminatePlayer(Traveler t, String reason) { + if (t == null) return; + + String name = safeName(t); + logList.getItems().add("💀 " + name + " är ute ur spelet: " + reason); + + int removedIndex = currentPlayerIndex; + + // ta bort ur listan + players.removeIf(p -> p.getId() != null && p.getId().equals(t.getId())); + + // om inga spelare kvar → stoppa + if (players.isEmpty()) { + wonGame = true; + logList.getItems().add("🏁 inga spelare kvar."); + return; + } + + // justera index så att vi landar på en giltig spelare + if (removedIndex >= players.size()) { + currentPlayerIndex = 0; + } else { + currentPlayerIndex = removedIndex % players.size(); + } + + // reset UI-state så det inte blir kvar från den spelaren + awaitingMoveChoice = false; + selectedMove = null; + rollButton.setText("ROLL"); + movesBox.getChildren().clear(); + shownMoves = List.of(); + moveButtons.clear(); + lastClickedDestination = null; + cycleIndex = 0; + + syncHudAndMap(); + } + + private List distinctLocationsById(List locations) { java.util.Map byId = new java.util.LinkedHashMap<>(); @@ -597,12 +662,25 @@ private void doContinueJourney(Long travelerId) { } syncHudAndMap(); + } catch (IllegalStateException e) { + if (tx.isActive()) tx.rollback(); + + String msg = e.getMessage() != null ? e.getMessage() : "okänt fel"; + if (msg.toLowerCase().contains("cannot afford")) { + eliminatePlayer(em.find(Traveler.class, travelerId), "har inte råd att fortsätta resan"); + return; + } + + logList.getItems().add("⚠️ kunde inte fortsätta resa: " + msg); + syncHudAndMap(); + } catch (RuntimeException e) { if (tx.isActive()) tx.rollback(); throw e; } finally { rollButton.setDisable(false); } + } private String safeName(Traveler t) {