Some fixes (Concurrent List GUI)

This commit is contained in:
rubenpirreram
2026-05-15 19:16:43 +02:00
parent 987420c4a4
commit ff94a9fca8
7 changed files with 126 additions and 117 deletions
@@ -956,7 +956,7 @@ public class Game implements Serializable {
); );
currentState.GameStageUpdate(GameStages.ENDED); currentState.GameStageUpdate(GameStages.ENDED);
playerStanding=new ArrayList<>(playersList); playerStanding=new ArrayList<>(playersList);
playersList.sort((x,y)->x.getPrestigeValue()==y.getPrestigeValue()?Integer.compare(x.getFoodValue(),y.getFoodValue()):Integer.compare(x.getPrestigeValue(),y.getPrestigeValue())); playerStanding.sort((y,x)->x.getPrestigeValue()==y.getPrestigeValue()?Integer.compare(x.getFoodValue(),y.getFoodValue()):Integer.compare(x.getPrestigeValue(),y.getPrestigeValue()));
} }
@@ -996,8 +996,8 @@ public class Game implements Serializable {
currentState.GameStageUpdate(GameStages.ENDED); currentState.GameStageUpdate(GameStages.ENDED);
playerStanding=new ArrayList<>(playersList); playerStanding=new ArrayList<>(playersList);
playerStanding.remove(winner); playerStanding.remove(winner);
playersList.sort((x,y)->x.getPrestigeValue()==y.getPrestigeValue()?Integer.compare(x.getFoodValue(),y.getFoodValue()):Integer.compare(x.getPrestigeValue(),y.getPrestigeValue())); playerStanding.sort((y,x)->x.getPrestigeValue()==y.getPrestigeValue()?Integer.compare(x.getFoodValue(),y.getFoodValue()):Integer.compare(x.getPrestigeValue(),y.getPrestigeValue()));
playersList.addLast(winner); playerStanding.addFirst(winner);
} }
@@ -53,14 +53,15 @@ public class ClientCallbackImpl extends UnicastRemoteObject implements IClientCa
*/ */
@Override @Override
public void onAction(NetworkEvent event) throws RemoteException { public void onAction(NetworkEvent event) throws RemoteException {
synchronized (clientController) if(event.getIsError()) {
{ clientController.view.showError(event.toString());
if(event.getIsError()) { } else {
clientController.view.showError(event.toString()); synchronized (clientController)
} else { {
event.apply(clientController.miniModel); event.apply(clientController.miniModel);
clientController.view.render();
} }
clientController.view.render();
} }
} }
} }
@@ -165,6 +165,7 @@ public class TCPClient implements IClient {
event.apply(controller.miniModel); event.apply(controller.miniModel);
} }
controller.view.render(); controller.view.render();
} }
} else if (read instanceof MiniModel model) { } else if (read instanceof MiniModel model) {
@@ -120,33 +120,17 @@ public class ServerLauncher {
Game game=gameController.getModel(); Game game=gameController.getModel();
if(!event.getIsError()) if(!event.getIsError())
{ {
if(game.getCurrentState().getGameStage().equals(GameStages.ENDED)) if(event.getEventType().equals(EventType.DISCONNECTED_PLAYER)&& game.getCurrentState().getGameStage().equals(GameStages.WAITING))
{ {
actionQueue.offer(new EndedGame(game.getSlotMap(), game.orderLogicCard, game.getCurrentState(),game.getPlayerStanding())); playerList.remove(event.getUsername());
} }else {
else { event.setData(game.getSlotMap(), game.orderLogicCard, game.getCurrentState(), game.getPlayerByUsername(event.getUsername()));
if(event.getEventType().equals(EventType.DISCONNECTED_PLAYER)&& game.getCurrentState().getGameStage().equals(GameStages.WAITING)) if (event.getEventType().equals(EventType.TOTEM_CHOICE)) {
{ ((TotemChoice) event).setAvailableTotems(gameController.getModel().getAvailableTotems());
} else if (event.getEventType().equals(EventType.DISCONNECTED_PLAYER) && game.getCurrentState().equals(GameStages.WAITING)) {
playerList.remove(event.getUsername()); playerList.remove(event.getUsername());
}else {
event.setData(game.getSlotMap(), game.orderLogicCard, game.getCurrentState(), game.getPlayerByUsername(event.getUsername()));
if (event.getEventType().equals(EventType.TOTEM_CHOICE)) {
((TotemChoice) event).setAvailableTotems(gameController.getModel().getAvailableTotems());
} else if (event.getEventType().equals(EventType.DISCONNECTED_PLAYER) && game.getCurrentState().equals(GameStages.WAITING)) {
playerList.remove(event.getUsername());
}
} }
} }
}
serverRMI.notifyAll(event);
serverTCP.notifyAll(event);
if(game.getCurrentState().getRound()!=roundPrev)
{
ApplyNextRound nextRound=new ApplyNextRound(game.getSlotMap(), game.orderLogicCard, game.getCurrentState(),game.getPlayers());
serverRMI.notifyAll(nextRound);
serverTCP.notifyAll(nextRound);
}
if(!event.getIsError()){
if(game.getCurrentState().getGameStage() == GameStages.ENDED){ if(game.getCurrentState().getGameStage() == GameStages.ENDED){
if(!this.deleteSave()){ if(!this.deleteSave()){
System.out.println("\n!!! Couldn't delete save !!!\n"); System.out.println("\n!!! Couldn't delete save !!!\n");
@@ -162,6 +146,19 @@ public class ServerLauncher {
System.out.println("\n!!! Save failed !!!\n"); System.out.println("\n!!! Save failed !!!\n");
} }
} }
serverRMI.notifyAll(event);
serverTCP.notifyAll(event);
if(game.getCurrentState().getRound()!=roundPrev)
{
ApplyNextRound nextRound=new ApplyNextRound(game.getSlotMap(), game.orderLogicCard, game.getCurrentState(),game.getPlayers());
serverRMI.notifyAll(nextRound);
serverTCP.notifyAll(nextRound);
}
else if(game.getCurrentState().getGameStage().equals(GameStages.ENDED))
{
serverRMI.notifyAll(new EndedGame(game.getSlotMap(), game.orderLogicCard, game.getCurrentState(),game.getPlayerStanding()));
serverTCP.notifyAll(new EndedGame(game.getSlotMap(), game.orderLogicCard, game.getCurrentState(),game.getPlayerStanding()));
}
if (event.getEventType().equals(EventType.DISCONNECTED_PLAYER) && playerList.values().stream().filter(x -> x).count() == 1&& game.getCurrentState().getGameStage() != GameStages.ENDED) { if (event.getEventType().equals(EventType.DISCONNECTED_PLAYER) && playerList.values().stream().filter(x -> x).count() == 1&& game.getCurrentState().getGameStage() != GameStages.ENDED) {
if (disconnectionTimer != null && !disconnectionTimer.isDone()) { if (disconnectionTimer != null && !disconnectionTimer.isDone()) {
disconnectionTimer.cancel(false); disconnectionTimer.cancel(false);
@@ -246,7 +243,8 @@ public class ServerLauncher {
launcher.run(); launcher.run();
} catch (Exception e) } catch (Exception e)
{ {
System.out.println("Generic exception occurred"+e.getMessage()); System.out.println("Generic exception occurred");
e.printStackTrace();
} }
}).start(); }).start();
@@ -82,15 +82,19 @@ public class GUI extends Application implements IView {
public void render() { public void render() {
if(controller.miniModel.currentState.getGameStage()==TOTEM_CHOICE) { if(controller.miniModel.currentState.getGameStage()==TOTEM_CHOICE) {
Platform.runLater(() -> { Platform.runLater(() -> {
controllerTotem.render(); synchronized (this) {
primaryStage.setScene(totemScene); controllerTotem.render();
primaryStage.setFullScreen(true); primaryStage.setScene(totemScene);
primaryStage.setFullScreen(true);
}
}); });
} else { } else {
Platform.runLater(() -> { Platform.runLater(() -> {
controllerMain.render(); synchronized (this) {
primaryStage.setScene(mainScene); controllerMain.render();
primaryStage.setFullScreen(true); primaryStage.setScene(mainScene);
primaryStage.setFullScreen(true);
}
}); });
} }
} }
@@ -86,40 +86,36 @@ public class MainFXMLController {
public void render() { public synchronized void render() {
if (old_state_stage==null) {
synchronized (controller) renderBackground();
{ renderUpper();
if (old_state_stage==null) { renderBoard();
renderBackground(); renderLower();
renderUpper(); renderMyHand();
renderBoard(); renderSidePanel();
renderLower(); } else if (old_state_stage==SLOT_CHOICE ) {
System.out.println("OLD: "+old_state_stage+", NEW: "+controller.miniModel.currentState.getGameStage());
System.out.println("RIDISEGNO BOARD\n");
renderBoard();
} else if (old_state_stage==RES_ACTIONS) {
System.out.println("OLD: "+old_state_stage+", NEW: "+controller.miniModel.currentState.getGameStage());
System.out.println("RIDISEGNO TUTTO. USERNAME: "+old_state_username);
renderUpper();
renderBoard();
renderLower();
renderSidePanel();
if (Objects.equals(old_state_username, controller.myUsername)) {
renderMyHand(); renderMyHand();
renderSidePanel();
} else if (old_state_stage==SLOT_CHOICE ) {
System.out.println("OLD: "+old_state_stage+", NEW: "+controller.miniModel.currentState.getGameStage());
System.out.println("RIDISEGNO BOARD\n");
renderBoard();
} else if (old_state_stage==RES_ACTIONS) {
System.out.println("OLD: "+old_state_stage+", NEW: "+controller.miniModel.currentState.getGameStage());
System.out.println("RIDISEGNO TUTTO. USERNAME: "+old_state_username);
renderUpper();
renderBoard();
renderLower();
renderSidePanel();
if (Objects.equals(old_state_username, controller.myUsername)) {
renderMyHand();
}
// TODO: se sono io a pescare renderizzo myHand, altrimenti no (non è scontato)
} else {
System.out.println("NON GESTITO!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
} }
old_state_stage=controller.miniModel.currentState.getGameStage(); // TODO: se sono io a pescare renderizzo myHand, altrimenti no (non è scontato)
old_state_username=controller.miniModel.currentState.getCurrentPlayer().getUserName(); } else {
System.out.println("NON GESTITO!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
} }
old_state_stage=controller.miniModel.currentState.getGameStage();
old_state_username=controller.miniModel.currentState.getCurrentPlayer().getUserName();
// TODO: le info in sidepanel non vengono aggiornate sempre aggiornate, bisogna prima capire dove metterle // TODO: le info in sidepanel non vengono aggiornate sempre aggiornate, bisogna prima capire dove metterle
} }
@@ -272,21 +268,24 @@ public class MainFXMLController {
upperList.setAlignment(Pos.CENTER); upperList.setAlignment(Pos.CENTER);
upperList.getChildren().clear(); upperList.getChildren().clear();
int i = 0; synchronized (controller)
for (TribeCard card : controller.miniModel.board.upperListTribe) { {
final int index = i; int i = 0;
StackPane img = createCard(card, true, true); for (TribeCard card : controller.miniModel.board.upperListTribe) {
img.setOnMouseClicked(e -> controller.drawUpperTribeCard(controller.myUsername, index)); final int index = i;
upperList.getChildren().add(img); StackPane img = createCard(card, true, true);
i++; img.setOnMouseClicked(e -> controller.drawUpperTribeCard(controller.myUsername, index));
} upperList.getChildren().add(img);
i = 0; i++;
for (BuildingCard card : controller.miniModel.board.upperListBuilding) { }
final int index = i; i = 0;
StackPane img = createCard(card, true, true); for (BuildingCard card : controller.miniModel.board.upperListBuilding) {
img.setOnMouseClicked(e -> controller.drawUpperBuildingCard(controller.myUsername, index)); final int index = i;
upperList.getChildren().add(img); StackPane img = createCard(card, true, true);
i++; img.setOnMouseClicked(e -> controller.drawUpperBuildingCard(controller.myUsername, index));
upperList.getChildren().add(img);
i++;
}
} }
} }
private void renderLower() { private void renderLower() {
@@ -294,21 +293,24 @@ public class MainFXMLController {
lowerList.setAlignment(Pos.CENTER); lowerList.setAlignment(Pos.CENTER);
lowerList.getChildren().clear(); lowerList.getChildren().clear();
int i = 0; synchronized (controller)
for (TribeCard card : controller.miniModel.board.lowerListTribe) { {
final int index = i; int i = 0;
StackPane img = createCard(card, true, true); for (TribeCard card : controller.miniModel.board.lowerListTribe) {
img.setOnMouseClicked(e -> controller.drawLowerTribeCard(controller.myUsername, index)); final int index = i;
lowerList.getChildren().add(img); StackPane img = createCard(card, true, true);
i++; img.setOnMouseClicked(e -> controller.drawLowerTribeCard(controller.myUsername, index));
} lowerList.getChildren().add(img);
i = 0; i++;
for (BuildingCard card : controller.miniModel.board.lowerListBuilding) { }
final int index = i; i = 0;
StackPane img = createCard(card, true, true); for (BuildingCard card : controller.miniModel.board.lowerListBuilding) {
img.setOnMouseClicked(e -> controller.drawLowerBuildingCard(controller.myUsername, index)); final int index = i;
lowerList.getChildren().add(img); StackPane img = createCard(card, true, true);
i++; img.setOnMouseClicked(e -> controller.drawLowerBuildingCard(controller.myUsername, index));
lowerList.getChildren().add(img);
i++;
}
} }
} }
private void renderDeck() { private void renderDeck() {
@@ -89,7 +89,7 @@ public class TUI implements IView {
* Delegates to {@link #renderBoard()}. * Delegates to {@link #renderBoard()}.
*/ */
@Override @Override
public void render() { public synchronized void render() {
if(model != null) if(model != null)
{ {
if(model.currentState.getGameStage().equals(GameStages.TOTEM_CHOICE)) if(model.currentState.getGameStage().equals(GameStages.TOTEM_CHOICE))
@@ -99,6 +99,7 @@ public class TUI implements IView {
else if(model.currentState.getGameStage().equals(GameStages.ENDED)) else if(model.currentState.getGameStage().equals(GameStages.ENDED))
{ {
renderStanding(); renderStanding();
return;
} }
else else
{ {
@@ -109,25 +110,27 @@ public class TUI implements IView {
} }
private void renderStanding() { private void renderStanding() {
StringBuilder stringBuilder=new StringBuilder(); if(model.standingPlayers!=null)
ArrayList<Player> playersList=new ArrayList<>(model.players.values());
for(int i = 0; i< model.players.size()/2; i++)
{ {
stringBuilder.append(AsciiTable.sideBySide(List.of(playersList.get((i*2)).toString().split("\n")),List.of(playersList.get((i*2+1)).toString().split("\n")),2)); StringBuilder stringBuilder=new StringBuilder();
} for(int i = 0; i< model.standingPlayers.size()/2; i++)
stringBuilder.append("\n"); {
if(playersList.size()%2!=0) stringBuilder.append(AsciiTable.sideBySide(List.of(model.standingPlayers.get((i*2)).toString().split("\n")),List.of(model.standingPlayers.get((i*2+1)).toString().split("\n")),2));
{ }
stringBuilder.append(playersList.get(playersList.size()-1).toString());
stringBuilder.append("\n"); stringBuilder.append("\n");
} if(model.standingPlayers.size()%2!=0)
System.out.println(stringBuilder); {
if(playersList.get(0).getUserName().equals(username)) stringBuilder.append(model.standingPlayers.get(model.standingPlayers.size()-1).toString());
{ stringBuilder.append("\n");
System.out.println("!!!YOU WON!!!"); }
} System.out.println(stringBuilder);
else { if(model.standingPlayers.get(0).getUserName().equals(username))
System.out.println("!!!YOU LOST!!!"); {
System.out.println("GAME ENDED: !!!YOU WON!!!");
}
else {
System.out.println("GAME ENDED: !!!YOU LOST!!!");
}
} }
} }