Mid commit for problem solving

This commit is contained in:
2026-06-14 21:07:49 +02:00
parent bac4a6b7f5
commit 4b3a5a5ea3
14 changed files with 23 additions and 22 deletions
@@ -303,7 +303,7 @@ public class ClientLauncherTUI {
/** /**
* Handles the {@code draw} command, dispatching to the appropriate controller draw method. * Handles the {@code draw} command, dispatching to the appropriate controller draw method.
* *
* @param parts the tokenised command: {@code [draw, upper|lower, tribe|building, pos]}. * @param parts the tokenized command: {@code [draw, upper|lower, tribe|building, pos]}.
* @param controller the client controller to invoke. * @param controller the client controller to invoke.
*/ */
private void handleDraw(String[] parts, ClientController controller) { private void handleDraw(String[] parts, ClientController controller) {
@@ -331,7 +331,7 @@ public class ClientLauncherTUI {
/** /**
* Parses an integer position argument at {@code idx} in {@code parts}. * Parses an integer position argument at {@code idx} in {@code parts}.
* *
* @param parts the tokenised command array. * @param parts the tokenized command array.
* @param idx index of the position argument. * @param idx index of the position argument.
* @return the parsed integer, or {@code -1} if missing or malformed. * @return the parsed integer, or {@code -1} if missing or malformed.
*/ */
@@ -21,7 +21,7 @@ import java.util.stream.Collectors;
* <p>The three top-level states that determine routing are: * <p>The three top-level states that determine routing are:
* <ul> * <ul>
* <li><b>Inactive</b> no game model is present, or the game has ended. * <li><b>Inactive</b> no game model is present, or the game has ended.
* Only disconnection clean-up is performed.</li> * Only disconnection cleanup is performed.</li>
* <li><b>Suspended</b> a forfeit timer is running because exactly one * <li><b>Suspended</b> a forfeit timer is running because exactly one
* player remains online. Only reconnection events are accepted.</li> * player remains online. Only reconnection events are accepted.</li>
* <li><b>Active</b> normal gameplay; every event is applied, saved, * <li><b>Active</b> normal gameplay; every event is applied, saved,
@@ -120,7 +120,7 @@ public class GameEventProcessor {
/** /**
* Handles events that arrive when no active game exists (not yet started, * Handles events that arrive when no active game exists (not yet started,
* or already ended). Only disconnection clean-up is relevant here. * or already ended). Only disconnection cleanup is relevant here.
* *
* @param event the incoming event. * @param event the incoming event.
*/ */
@@ -255,7 +255,7 @@ public class GameEventProcessor {
* Schedules the 60-second forfeit timer if a disconnection has left * Schedules the 60-second forfeit timer if a disconnection has left
* exactly one player online. * exactly one player online.
* *
* <p>If a previous timer is still pending it is cancelled first to avoid * <p>If a previous timer is still pending it is canceled first to avoid
* duplicate timers. * duplicate timers.
* *
* @param event the event that was just applied. * @param event the event that was just applied.
@@ -221,7 +221,7 @@ public class Board implements Serializable {
* Take the selected card from the upper tribe list of the board. * Take the selected card from the upper tribe list of the board.
* *
* @param tribeCard is the card to remove. * @param tribeCard is the card to remove.
* @return true if the card is succesfully removed. * @return true if the card is successfully removed.
*/ */
public boolean removeUpperTribeCard(TribeCard tribeCard) { public boolean removeUpperTribeCard(TribeCard tribeCard) {
return upperListTribe.remove(tribeCard); return upperListTribe.remove(tribeCard);
@@ -181,7 +181,7 @@ public class CurrentState implements Serializable {
/** /**
* Updates the current player, slot, and available draws. * Updates the current player, slot, and available draws.
* If {@code slot} is {@code null}, both {@link #nUpper} and {@link #nLower} are reset to 0. * If {@code slot} is {@code null}, both {@link #nUpper} and {@link #nLower} are reset to 0.
* Otherwise they are set from the slot's values. * Otherwise, they are set from the slot's values.
* *
* @param player the new current player. * @param player the new current player.
* @param slot the new current slot, or {@code null} when no slot is active. * @param slot the new current slot, or {@code null} when no slot is active.
@@ -42,7 +42,7 @@ public abstract class OrderLogicCard implements Serializable {
* *
* <p>The input list is shuffled in place to establish a random initial turn order. * <p>The input list is shuffled in place to establish a random initial turn order.
* This is intentional: the caller's list (typically {@code Game.playersList}) is * This is intentional: the caller's list (typically {@code Game.playersList}) is
* reordered so that the game's canonical player sequence reflects the randomised order. * reordered so that the game's canonical player sequence reflects the randomized order.
* *
* @param players the list of players associated with this order logic card. * @param players the list of players associated with this order logic card.
* <strong>The list is mutated (shuffled) by this constructor.</strong> * <strong>The list is mutated (shuffled) by this constructor.</strong>
@@ -11,7 +11,7 @@ public class InterfaceResolver {
* Returns the local IPv4 address that can reach the given server IP. * Returns the local IPv4 address that can reach the given server IP.
* *
* <p>If the server is localhost, returns {@code "127.0.0.1"}. * <p>If the server is localhost, returns {@code "127.0.0.1"}.
* Otherwise iterates active non-loopback interfaces to find one on the same subnet; * Otherwise, iterates active non-loopback interfaces to find one on the same subnet;
* falls back to a UDP connect trick if no matching subnet is found. * falls back to a UDP connect trick if no matching subnet is found.
* *
* @param serverIp the server IP address or hostname. * @param serverIp the server IP address or hostname.
@@ -84,7 +84,7 @@ public class RMIClient implements IClient {
* <p>Mirrors the {@code ScheduledExecutorService} in * <p>Mirrors the {@code ScheduledExecutorService} in
* {@code TCPClient.heartbeatLoop()} that writes {@code PING} every 3 s. * {@code TCPClient.heartbeatLoop()} that writes {@code PING} every 3 s.
* On {@link RemoteException} the server is considered gone and * On {@link RemoteException} the server is considered gone and
* {@link #disconnect()} is called mirrors the behaviour on * {@link #disconnect()} is called mirrors the behavior on
* {@code SocketTimeoutException} / {@code IOException} in the TCP version. * {@code SocketTimeoutException} / {@code IOException} in the TCP version.
*/ */
private void startHeartbeat() { private void startHeartbeat() {
@@ -57,7 +57,7 @@ public class ServerLauncher {
// Entry point // Entry point
/** /**
* Initialises all server components, wires them together, restores a saved * Initializes all server components, wires them together, restores a saved
* game if available, and starts the event-processing loop and both network * game if available, and starts the event-processing loop and both network
* servers. * servers.
* *
@@ -145,7 +145,7 @@ public class ServerLauncher {
* *
* <p>The save is discarded if all but at most one player was offline at the * <p>The save is discarded if all but at most one player was offline at the
* time of the crash, since there would be nobody to resume the game with. * time of the crash, since there would be nobody to resume the game with.
* Otherwise the model is restored, the player-list limit is set, and each * Otherwise, the model is restored, the player-list limit is set, and each
* player who was offline at crash time is pre-populated as offline so the * player who was offline at crash time is pre-populated as offline so the
* reconnection flow can handle them correctly. * reconnection flow can handle them correctly.
* *
@@ -14,7 +14,7 @@ import java.util.Random;
/** /**
* Ambient fire-particle effect rendered on a transparent overlay pane. * Ambient fire-particle effect rendered on a transparent overlay pane.
* *
* <p>Three particle types float from the screen corners toward the centre: * <p>Three particle types float from the screen corners toward the center:
* <ul> * <ul>
* <li><b>embers</b> (type 0) slow, glowing orange circles with a soft halo.</li> * <li><b>embers</b> (type 0) slow, glowing orange circles with a soft halo.</li>
* <li><b>sparks</b> (type 1) fast, short-lived bright particles.</li> * <li><b>sparks</b> (type 1) fast, short-lived bright particles.</li>
@@ -40,7 +40,7 @@ public class FireParticleSystem {
private final Scene scene; private final Scene scene;
/** Currently live particles. */ /** Currently live particles. */
private final List<Particle> particles = new ArrayList<>(); private final List<Particle> particles = new ArrayList<>();
/** Shared random source for particle initialisation and physics noise. */ /** Shared random source for particle initialization and physics noise. */
private final Random rnd = new Random(); private final Random rnd = new Random();
/** Timestamp (ns) of the last particle spawn batch. */ /** Timestamp (ns) of the last particle spawn batch. */
private long lastSpawn = 0; private long lastSpawn = 0;
@@ -187,8 +187,8 @@ public class FireParticleSystem {
final Circle glow; final Circle glow;
/** /**
* Initialises the particle at position ({@code x}, {@code y}) with velocity * Initializes the particle at position ({@code x}, {@code y}) with velocity
* aimed roughly from the given {@code corner} toward the scene centre. * aimed roughly from the given {@code corner} toward the scene center.
* *
* @param x spawn X coordinate. * @param x spawn X coordinate.
* @param y spawn Y coordinate. * @param y spawn Y coordinate.
@@ -73,7 +73,7 @@ public class GUI extends Application implements IView {
/** /**
* JavaFX entry point: loads all FXML scenes, wires up controllers, * JavaFX entry point: loads all FXML scenes, wires up controllers,
* configures fullscreen behaviour, and shows the login scene. * configures fullscreen behavior, and shows the login scene.
* *
* @param stage the primary stage provided by the JavaFX runtime. * @param stage the primary stage provided by the JavaFX runtime.
* @throws Exception if any FXML resource cannot be loaded. * @throws Exception if any FXML resource cannot be loaded.
@@ -267,7 +267,7 @@ public class GUI extends Application implements IView {
* Displays an error on the JavaFX application thread. * Displays an error on the JavaFX application thread.
* *
* <p>If the server crashed, returns to the login scene and re-enables the login button. * <p>If the server crashed, returns to the login scene and re-enables the login button.
* Otherwise delegates to the active scene's error display. * Otherwise, delegates to the active scene's error display.
* *
* @param error the error type. * @param error the error type.
* @param message a human-readable description of the error. * @param message a human-readable description of the error.
@@ -212,7 +212,7 @@ public class TotemFXMLController {
"-fx-text-fill: " + (selected ? "#FFD700" : "#ffffff") + ";"; "-fx-text-fill: " + (selected ? "#FFD700" : "#ffffff") + ";";
} }
/** Returns the totem name with only the first letter capitalised. */ /** Returns the totem name with only the first letter capitalized. */
private String capitalize(Totems t) { private String capitalize(Totems t) {
String s = t.name().toLowerCase(Locale.ROOT); String s = t.name().toLowerCase(Locale.ROOT);
return Character.toUpperCase(s.charAt(0)) + s.substring(1); return Character.toUpperCase(s.charAt(0)) + s.substring(1);
@@ -97,7 +97,7 @@ public class AsciiTable {
return sb.toString(); return sb.toString();
} }
/** /**
* Builds a single horizontal border line across all columns. * Builds a single horizontal borderline across all columns.
* *
* @param l left-end character. * @param l left-end character.
* @param m middle junction character (between columns). * @param m middle junction character (between columns).
@@ -105,6 +105,7 @@ public class AsciiTable {
* @param maxWidth width in display columns of each cell (including padding). * @param maxWidth width in display columns of each cell (including padding).
* @return the rendered horizontal line string. * @return the rendered horizontal line string.
*/ */
@SuppressWarnings("GrazieInspection")
private String hline(String l, String m, String r, int maxWidth) { private String hline(String l, String m, String r, int maxWidth) {
var sb = new StringBuilder(l); var sb = new StringBuilder(l);
for (int i = 0; i < cols; i++) { for (int i = 0; i < cols; i++) {
@@ -86,7 +86,7 @@ class HuntTest {
} }
@Test @Test
@DisplayName("p2 doesnt have building 7") @DisplayName("p2 doesn't have building 7")
void activateEvent4() { void activateEvent4() {
Player p1 = new Player("Giacomo"); Player p1 = new Player("Giacomo");
Player p2 = new Player("xiaomi"); Player p2 = new Player("xiaomi");
@@ -20,7 +20,7 @@ class SustenanceTest {
void testConstructor() { void testConstructor() {
int era = 1; int era = 1;
int prestigeDebt = 5; int prestigeDebt = 5;
// Gli attributi di Sustenance era e EventType vengono testati in EventCardTest. // Gli attributi di Sustenance era ed EventType vengono testati in EventCardTest.
Sustenance s = new Sustenance(era, prestigeDebt); Sustenance s = new Sustenance(era, prestigeDebt);
assertEquals(prestigeDebt, s.getPrestigeDebt()); assertEquals(prestigeDebt, s.getPrestigeDebt());