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);
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);
playerStanding=new ArrayList<>(playersList);
playerStanding.remove(winner);
playersList.sort((x,y)->x.getPrestigeValue()==y.getPrestigeValue()?Integer.compare(x.getFoodValue(),y.getFoodValue()):Integer.compare(x.getPrestigeValue(),y.getPrestigeValue()));
playersList.addLast(winner);
playerStanding.sort((y,x)->x.getPrestigeValue()==y.getPrestigeValue()?Integer.compare(x.getFoodValue(),y.getFoodValue()):Integer.compare(x.getPrestigeValue(),y.getPrestigeValue()));
playerStanding.addFirst(winner);
}
@@ -53,14 +53,15 @@ public class ClientCallbackImpl extends UnicastRemoteObject implements IClientCa
*/
@Override
public void onAction(NetworkEvent event) throws RemoteException {
synchronized (clientController)
{
if(event.getIsError()) {
clientController.view.showError(event.toString());
} else {
if(event.getIsError()) {
clientController.view.showError(event.toString());
} else {
synchronized (clientController)
{
event.apply(clientController.miniModel);
clientController.view.render();
}
clientController.view.render();
}
}
}
@@ -165,6 +165,7 @@ public class TCPClient implements IClient {
event.apply(controller.miniModel);
}
controller.view.render();
}
} else if (read instanceof MiniModel model) {
@@ -120,33 +120,17 @@ public class ServerLauncher {
Game game=gameController.getModel();
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()));
}
else {
if(event.getEventType().equals(EventType.DISCONNECTED_PLAYER)&& game.getCurrentState().getGameStage().equals(GameStages.WAITING))
{
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());
}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(!this.deleteSave()){
System.out.println("\n!!! Couldn't delete save !!!\n");
@@ -162,6 +146,19 @@ public class ServerLauncher {
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 (disconnectionTimer != null && !disconnectionTimer.isDone()) {
disconnectionTimer.cancel(false);
@@ -246,7 +243,8 @@ public class ServerLauncher {
launcher.run();
} catch (Exception e)
{
System.out.println("Generic exception occurred"+e.getMessage());
System.out.println("Generic exception occurred");
e.printStackTrace();
}
}).start();
@@ -82,15 +82,19 @@ public class GUI extends Application implements IView {
public void render() {
if(controller.miniModel.currentState.getGameStage()==TOTEM_CHOICE) {
Platform.runLater(() -> {
controllerTotem.render();
primaryStage.setScene(totemScene);
primaryStage.setFullScreen(true);
synchronized (this) {
controllerTotem.render();
primaryStage.setScene(totemScene);
primaryStage.setFullScreen(true);
}
});
} else {
Platform.runLater(() -> {
controllerMain.render();
primaryStage.setScene(mainScene);
primaryStage.setFullScreen(true);
synchronized (this) {
controllerMain.render();
primaryStage.setScene(mainScene);
primaryStage.setFullScreen(true);
}
});
}
}
@@ -86,40 +86,36 @@ public class MainFXMLController {
public void render() {
synchronized (controller)
{
if (old_state_stage==null) {
renderBackground();
renderUpper();
renderBoard();
renderLower();
public synchronized void render() {
if (old_state_stage==null) {
renderBackground();
renderUpper();
renderBoard();
renderLower();
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();
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();
old_state_username=controller.miniModel.currentState.getCurrentPlayer().getUserName();
// 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();
old_state_username=controller.miniModel.currentState.getCurrentPlayer().getUserName();
// 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.getChildren().clear();
int i = 0;
for (TribeCard card : controller.miniModel.board.upperListTribe) {
final int index = i;
StackPane img = createCard(card, true, true);
img.setOnMouseClicked(e -> controller.drawUpperTribeCard(controller.myUsername, index));
upperList.getChildren().add(img);
i++;
}
i = 0;
for (BuildingCard card : controller.miniModel.board.upperListBuilding) {
final int index = i;
StackPane img = createCard(card, true, true);
img.setOnMouseClicked(e -> controller.drawUpperBuildingCard(controller.myUsername, index));
upperList.getChildren().add(img);
i++;
synchronized (controller)
{
int i = 0;
for (TribeCard card : controller.miniModel.board.upperListTribe) {
final int index = i;
StackPane img = createCard(card, true, true);
img.setOnMouseClicked(e -> controller.drawUpperTribeCard(controller.myUsername, index));
upperList.getChildren().add(img);
i++;
}
i = 0;
for (BuildingCard card : controller.miniModel.board.upperListBuilding) {
final int index = i;
StackPane img = createCard(card, true, true);
img.setOnMouseClicked(e -> controller.drawUpperBuildingCard(controller.myUsername, index));
upperList.getChildren().add(img);
i++;
}
}
}
private void renderLower() {
@@ -294,21 +293,24 @@ public class MainFXMLController {
lowerList.setAlignment(Pos.CENTER);
lowerList.getChildren().clear();
int i = 0;
for (TribeCard card : controller.miniModel.board.lowerListTribe) {
final int index = i;
StackPane img = createCard(card, true, true);
img.setOnMouseClicked(e -> controller.drawLowerTribeCard(controller.myUsername, index));
lowerList.getChildren().add(img);
i++;
}
i = 0;
for (BuildingCard card : controller.miniModel.board.lowerListBuilding) {
final int index = i;
StackPane img = createCard(card, true, true);
img.setOnMouseClicked(e -> controller.drawLowerBuildingCard(controller.myUsername, index));
lowerList.getChildren().add(img);
i++;
synchronized (controller)
{
int i = 0;
for (TribeCard card : controller.miniModel.board.lowerListTribe) {
final int index = i;
StackPane img = createCard(card, true, true);
img.setOnMouseClicked(e -> controller.drawLowerTribeCard(controller.myUsername, index));
lowerList.getChildren().add(img);
i++;
}
i = 0;
for (BuildingCard card : controller.miniModel.board.lowerListBuilding) {
final int index = i;
StackPane img = createCard(card, true, true);
img.setOnMouseClicked(e -> controller.drawLowerBuildingCard(controller.myUsername, index));
lowerList.getChildren().add(img);
i++;
}
}
}
private void renderDeck() {
@@ -89,7 +89,7 @@ public class TUI implements IView {
* Delegates to {@link #renderBoard()}.
*/
@Override
public void render() {
public synchronized void render() {
if(model != null)
{
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))
{
renderStanding();
return;
}
else
{
@@ -109,25 +110,27 @@ public class TUI implements IView {
}
private void renderStanding() {
StringBuilder stringBuilder=new StringBuilder();
ArrayList<Player> playersList=new ArrayList<>(model.players.values());
for(int i = 0; i< model.players.size()/2; i++)
if(model.standingPlayers!=null)
{
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.append("\n");
if(playersList.size()%2!=0)
{
stringBuilder.append(playersList.get(playersList.size()-1).toString());
StringBuilder stringBuilder=new StringBuilder();
for(int i = 0; i< model.standingPlayers.size()/2; i++)
{
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("\n");
}
System.out.println(stringBuilder);
if(playersList.get(0).getUserName().equals(username))
{
System.out.println("!!!YOU WON!!!");
}
else {
System.out.println("!!!YOU LOST!!!");
if(model.standingPlayers.size()%2!=0)
{
stringBuilder.append(model.standingPlayers.get(model.standingPlayers.size()-1).toString());
stringBuilder.append("\n");
}
System.out.println(stringBuilder);
if(model.standingPlayers.get(0).getUserName().equals(username))
{
System.out.println("GAME ENDED: !!!YOU WON!!!");
}
else {
System.out.println("GAME ENDED: !!!YOU LOST!!!");
}
}
}