diff --git a/src/main/java/it/polimi/ingsw/gc14/Model/MiniModel.java b/src/main/java/it/polimi/ingsw/gc14/Model/MiniModel.java index 6ef4e2a..857fd51 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Model/MiniModel.java +++ b/src/main/java/it/polimi/ingsw/gc14/Model/MiniModel.java @@ -4,6 +4,8 @@ import it.polimi.ingsw.gc14.Model.Cards.BuildingCard; import it.polimi.ingsw.gc14.Model.Cards.TribeCard; import it.polimi.ingsw.gc14.Model.GamePackage.Board; import it.polimi.ingsw.gc14.Model.GamePackage.CurrentState; +import it.polimi.ingsw.gc14.Network.EventType; +import it.polimi.ingsw.gc14.Network.NetworkEvent; import java.io.Serializable; import java.util.*; @@ -22,6 +24,7 @@ public class MiniModel implements Serializable { public ArrayList upperListBuildingCards; public ArrayList lowerListBuildingCards; public ArrayList disconnectedPlayers; + public NetworkEvent lastEvent; /** * Map associating each occupied slot with the corresponding player. @@ -98,6 +101,11 @@ public class MiniModel implements Serializable { setPlayers(players); } + //TODO + public void setLastEvent(NetworkEvent lastEvent) { + this.lastEvent = lastEvent; + } + /** * Sets the list of totems still available for selection. diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/AddPlayer.java b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/AddPlayer.java index f3ca7b4..10aa56f 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/AddPlayer.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/AddPlayer.java @@ -58,6 +58,7 @@ public class AddPlayer extends NetworkEvent implements Serializable { miniModel.setOrderLogicCard(orderLogicCard); miniModel.setCurrentState(currentState); miniModel.setSlotPlayerMap(slotPlayerMap); + miniModel.setLastEvent(this); return true; } } diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/ApplyNextRound.java b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/ApplyNextRound.java index e4bf4c7..472881e 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/ApplyNextRound.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/ApplyNextRound.java @@ -69,6 +69,7 @@ public class ApplyNextRound extends NetworkEvent implements Serializable{ miniModel.lowerListTribeCards = lowerListTribeCards; miniModel.upperListBuildingCards = upperListBuildingCards; miniModel.lowerListBuildingCards = lowerListBuildingCards; + miniModel.setLastEvent(this); return true; } } diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DisconnectedPlayer.java b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DisconnectedPlayer.java index f0acee5..cbf5118 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DisconnectedPlayer.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DisconnectedPlayer.java @@ -51,6 +51,7 @@ public class DisconnectedPlayer extends NetworkEvent implements Serializable{ miniModel.setCurrentState(currentState); miniModel.setSlotPlayerMap(slotPlayerMap); miniModel.setDisconnectedPlayers(disconnectedPlayers); + miniModel.setLastEvent(this); } return true; } diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DrawLowerBuildingCard.java b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DrawLowerBuildingCard.java index 33a796f..cd54cf5 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DrawLowerBuildingCard.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DrawLowerBuildingCard.java @@ -49,6 +49,7 @@ public class DrawLowerBuildingCard extends NetworkEvent implements Serializable miniModel.setOrderLogicCard(orderLogicCard); miniModel.setCurrentState(currentState); miniModel.setSlotPlayerMap(slotPlayerMap); + miniModel.setLastEvent(this); return true; } } diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DrawLowerTribeCard.java b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DrawLowerTribeCard.java index f6c29bf..820ecf4 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DrawLowerTribeCard.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DrawLowerTribeCard.java @@ -48,6 +48,7 @@ public class DrawLowerTribeCard extends NetworkEvent implements Serializable{ miniModel.setOrderLogicCard(orderLogicCard); miniModel.setCurrentState(currentState); miniModel.setSlotPlayerMap(slotPlayerMap); + miniModel.setLastEvent(this); return true; } } diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DrawUpperBuildingCard.java b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DrawUpperBuildingCard.java index 63ab87f..69f68b3 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DrawUpperBuildingCard.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DrawUpperBuildingCard.java @@ -49,6 +49,7 @@ public class DrawUpperBuildingCard extends NetworkEvent implements Serializable miniModel.setOrderLogicCard(orderLogicCard); miniModel.setCurrentState(currentState); miniModel.setSlotPlayerMap(slotPlayerMap); + miniModel.setLastEvent(this); return true; } } diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DrawUpperTribeCard.java b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DrawUpperTribeCard.java index 016dbf5..1324cb0 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DrawUpperTribeCard.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/DrawUpperTribeCard.java @@ -47,6 +47,7 @@ public class DrawUpperTribeCard extends NetworkEvent implements Serializable{ miniModel.setOrderLogicCard(orderLogicCard); miniModel.setCurrentState(currentState); miniModel.setSlotPlayerMap(slotPlayerMap); + miniModel.setLastEvent(this); return true; } } diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/EndedGame.java b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/EndedGame.java index 5605fb6..9a2a935 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/EndedGame.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/EndedGame.java @@ -55,6 +55,7 @@ public class EndedGame extends NetworkEvent implements Serializable{ miniModel.setCurrentState(currentState); miniModel.setPlayers(players); miniModel.setStandingPlayers(players); + miniModel.setLastEvent(this); return true; } } diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/ReconnectPlayer.java b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/ReconnectPlayer.java index c4448d3..e51a282 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/ReconnectPlayer.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/ReconnectPlayer.java @@ -61,6 +61,7 @@ public class ReconnectPlayer extends NetworkEvent implements Serializable { miniModel.setCurrentState(currentState); miniModel.setSlotPlayerMap(slotPlayerMap); miniModel.setDisconnectedPlayers(disconnectedPlayers); + miniModel.setLastEvent(this); } return true; diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/SkipTurn.java b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/SkipTurn.java index 82fec74..71711b9 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/SkipTurn.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/SkipTurn.java @@ -41,6 +41,7 @@ public class SkipTurn extends NetworkEvent implements Serializable{ miniModel.setOrderLogicCard(orderLogicCard); miniModel.setCurrentState(currentState); miniModel.setSlotPlayerMap(slotPlayerMap); + miniModel.setLastEvent(this); return true; } } diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/SlotChoice.java b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/SlotChoice.java index 642205c..e2a7f7e 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/SlotChoice.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/SlotChoice.java @@ -47,6 +47,7 @@ public class SlotChoice extends NetworkEvent implements Serializable { miniModel.setOrderLogicCard(orderLogicCard); miniModel.setCurrentState(currentState); miniModel.setSlotPlayerMap(slotPlayerMap); + miniModel.setLastEvent(this); return true; } } diff --git a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/TotemChoice.java b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/TotemChoice.java index a25d75f..aa1022f 100644 --- a/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/TotemChoice.java +++ b/src/main/java/it/polimi/ingsw/gc14/Network/NetworkEvents/TotemChoice.java @@ -79,6 +79,7 @@ public class TotemChoice extends NetworkEvent implements Serializable { miniModel.setCurrentState(currentState); miniModel.setSlotPlayerMap(slotPlayerMap); miniModel.setAvailableTotems(availableTotems); + miniModel.setLastEvent(this); return true; } } diff --git a/src/main/java/it/polimi/ingsw/gc14/View/GUI/MainFXMLController.java b/src/main/java/it/polimi/ingsw/gc14/View/GUI/MainFXMLController.java index bb3e131..4c3e308 100644 --- a/src/main/java/it/polimi/ingsw/gc14/View/GUI/MainFXMLController.java +++ b/src/main/java/it/polimi/ingsw/gc14/View/GUI/MainFXMLController.java @@ -52,6 +52,10 @@ public class MainFXMLController { @FXML private Button skipBtn; @FXML private Button detailsBtn; @FXML private Label infoText; + private final Map foodLabels = new HashMap<>(); + private final Map prestigeLabels = new HashMap<>(); + private final Map playerCards = new HashMap<>(); + private final Map> iconViews = new HashMap<>(); private Popup popup; private HBox popupCards; @@ -107,15 +111,36 @@ public class MainFXMLController { // ==== RENDER ==== public void render() { - - if(!isError) { + if(foodLabels.isEmpty()) + buildSidePanel(); + if(isError) + { + updateSidePanel(); + isError=false; + return; + } + if(controller.miniModel.lastEvent==null ||controller.miniModel.lastEvent.getEventType().equals(EventType.TOTEM_CHOICE) || controller.miniModel.lastEvent.getEventType().equals(EventType.NEXT_ROUND)) { + renderMyHand(); renderUpper(); renderBoard(); renderLower(); + updateSidePanel(); + return; + } + if(controller.miniModel.lastEvent.getEventType().equals(EventType.DRAW_UPPER_TRIBE) || controller.miniModel.lastEvent.getEventType().equals(EventType.DRAW_UPPER_BUILD)) + { + renderUpper(); + } + if(controller.miniModel.lastEvent.getEventType().equals(EventType.DRAW_LOWER_TRIBE) || controller.miniModel.lastEvent.getEventType().equals(EventType.DRAW_LOWER_BUILD)) + { + renderLower(); + } + if(controller.miniModel.lastEvent.getUsername().equals(controller.myUsername)) + { renderMyHand(); } - renderSidePanel(); - isError=false; + renderBoard(); + updateSidePanel(); } @@ -163,6 +188,113 @@ public class MainFXMLController { // ==== ELEMENTS ==== + + private VBox buildPlayerCard(Player player) { + VBox card = new VBox(3); + VBox.setMargin(card, new Insets(15, 15, 0, 15)); + card.getStyleClass().add("player-card"); + card.setPadding(new Insets(4)); + + // Riga 1: totem + nome + HBox headerRow = new HBox(8); + headerRow.setAlignment(Pos.CENTER); + ImageView totem = new ImageView(loadImage("/GUIImages/Totems/totem_" + + player.totem.toString().toLowerCase(Locale.ROOT) + ".png")); + totem.setFitHeight(20); + totem.setPreserveRatio(true); + Label usernameLabel = new Label(player.getUserName()); + usernameLabel.getStyleClass().add("label-medium"); + usernameLabel.setStyle("-fx-text-fill: #711423;"); + if (player.getUserName().equals(controller.myUsername)) { + usernameLabel.setText(usernameLabel.getText() + " (you)"); + } + if (controller.miniModel.disconnectedPlayers.contains(player.getUserName())) { + card.getStyleClass().add("player-card-crashed"); + } + headerRow.getChildren().addAll(totem, usernameLabel); + + // Riga 2: cibo + prestigio + building + HBox statsRow = new HBox(10); + statsRow.setAlignment(Pos.CENTER); + + HBox foodBox = new HBox(4); + foodBox.setAlignment(Pos.CENTER); + ImageView foodIcon = new ImageView(loadImage("/GUIImages/Icons/Food.png")); + foodIcon.setFitHeight(20); + foodIcon.setPreserveRatio(true); + Label foodLabel = new Label(String.valueOf(player.getFoodValue())); + foodLabel.getStyleClass().add("label-small"); + foodLabels.put(player.getUserName(), foodLabel); + foodBox.getChildren().addAll(foodIcon, foodLabel); + + HBox prestigeBox = new HBox(1); + prestigeBox.setAlignment(Pos.CENTER); + ImageView PPIcon = new ImageView(loadImage("/GUIImages/Icons/PrestigePoint.png")); + PPIcon.setFitHeight(35); + PPIcon.setPreserveRatio(true); + Label prestigeLabel = new Label(String.valueOf(player.getPrestigeValue())); + prestigeLabel.getStyleClass().add("label-small"); + prestigeLabels.put(player.getUserName(), prestigeLabel); + prestigeBox.getChildren().addAll(PPIcon, prestigeLabel); + + ImageView buildingIcon = new ImageView(loadImage("/GUIImages/Icons/Building.png")); + buildingIcon.setFitWidth(28); + buildingIcon.setFitHeight(28); + buildingIcon.setPreserveRatio(true); + buildingIcon.setOnMouseClicked(e -> { + ArrayList cards = getPlayerCards(player.getUserName(), "building"); + if (!cards.isEmpty()) openPopup(cards); + }); + addHoverZoom(buildingIcon); + + statsRow.getChildren().addAll(foodBox, prestigeBox, buildingIcon); + + // Righe 3-4: icone carte + HBox iconsRow1 = new HBox(6); + iconsRow1.setSpacing(20); + iconsRow1.setAlignment(Pos.CENTER); + HBox iconsRow2 = new HBox(6); + iconsRow2.setAlignment(Pos.CENTER); + iconsRow2.setSpacing(20); + + String[][] iconTypes = { + {"Artist", "artists"}, + {"Gatherer", "gatherers"}, + {"Inventor", "inventors"}, + {"Builder", "builders"}, + {"Shaman", "shamans"}, + {"Hunter", "hunters"} + }; + + List icons = new ArrayList<>(); + // aggiungo anche building come prima icona della lista per updateSidePanel + icons.add(buildingIcon); + + for (int i = 0; i < iconTypes.length; i++) { + String iconName = iconTypes[i][0]; + String fieldName = iconTypes[i][1]; + + ImageView icon = new ImageView(loadImage("/GUIImages/Icons/" + iconName + ".png")); + icon.setFitWidth(28); + icon.setFitHeight(28); + icon.setPreserveRatio(true); + icon.setOnMouseClicked(e -> { + ArrayList cards = getPlayerCards(player.getUserName(), fieldName); + if (!cards.isEmpty()) openPopup(cards); + }); + addHoverZoom(icon); + icons.add(icon); + + if (i < 3) iconsRow1.getChildren().add(icon); + else iconsRow2.getChildren().add(icon); + } + + iconViews.put(player.getUserName(), icons); + + card.getChildren().addAll(headerRow, statsRow, iconsRow1, iconsRow2); + return card; + } + private StackPane createOrder(String num) { ImageView img = new ImageView(loadImage("/GUIImages/Orders/order-" + num + ".png")); img.fitHeightProperty().bind(board.sceneProperty().get().heightProperty().subtract(56).divide(4).multiply(0.94)); @@ -217,36 +349,73 @@ public class MainFXMLController { // ==== GROUPS ==== - private void renderUpper() { - upperList.setSpacing(14); - upperList.setAlignment(Pos.CENTER); - upperList.getChildren().clear(); - - int i = 0; - for (TribeCard card : controller.miniModel.upperListTribeCards) { - final int index = i; - StackPane img = createCard(card, true, true, upperList); - img.setOnMouseClicked(e -> controller.drawUpperTribeCard(index)); - upperList.getChildren().add(img); - i++; + private void buildSidePanel() { + infoText.setText("Round: "+Integer.toString(controller.miniModel.currentState.getRound()) + " • " + controller.miniModel.currentState.getGameStage().toString()); + VBox playerList = new VBox(); + playerList.setFillWidth(true); + for (Player p : controller.miniModel.players.values()) { + VBox card = buildPlayerCard(p); + playerCards.put(p.getUserName(), card); + playerList.getChildren().add(card); } - drawUpperBuilding(); + playerSide.setContent(playerList); } - private void renderLower() { - lowerList.setSpacing(14); - lowerList.setAlignment(Pos.CENTER); - lowerList.getChildren().clear(); + private void updateSidePanel() { + infoText.setText("Round: "+Integer.toString(controller.miniModel.currentState.getRound()) + " • " + controller.miniModel.currentState.getGameStage().toString()); + String current = controller.miniModel.currentState.getCurrentPlayer().getUserName(); + // ordine: building, artists, gatherers, inventors, builders, shamans, hunters + String[] fields = {"building", "artists", "gatherers", "inventors", "builders", "shamans", "hunters"}; - int i = 0; - for (TribeCard card : controller.miniModel.lowerListTribeCards) { - final int index = i; - StackPane img = createCard(card, true, true, lowerList); - img.setOnMouseClicked(e -> controller.drawLowerTribeCard(index)); - lowerList.getChildren().add(img); - i++; + for (Player p : controller.miniModel.players.values()) { + String u = p.getUserName(); + + foodLabels.get(u).setText(String.valueOf(p.getFoodValue())); + prestigeLabels.get(u).setText(String.valueOf(p.getPrestigeValue())); + + List icons = iconViews.get(u); + for (int i = 0; i < icons.size(); i++) { + boolean empty = getPlayerCards(u, fields[i]).isEmpty(); + icons.get(i).setOpacity(empty ? 0.3 : 1.0); + icons.get(i).setEffect(empty ? new ColorAdjust() : null); + } + + // aggiorna current player highlight + VBox card = playerCards.get(u); + if(controller.miniModel.disconnectedPlayers.contains(u)) + { + card.getStyleClass().clear(); + card.getStyleClass().add("player-card-crashed"); + } + else { + card.getStyleClass().clear(); + card.getStyleClass().add("player-card"); + } + + if (u.equals(current)) { + card.setStyle("-fx-effect: dropshadow(gaussian, #fff8dc, 15, 0.10, 0, 0)"); + ScaleTransition st = new ScaleTransition(Duration.millis(150), card); + st.setToX(1.1); + st.setToY(1.1); + st.play(); + } else { + ScaleTransition st = new ScaleTransition(Duration.millis(150), card); + st.setToX(1.0); + st.setToY(1.0); + st.play(); + card.setStyle(""); + } + + // animazione shake su errore + if (isError && u.equals(controller.myUsername)) { + TranslateTransition tt = new TranslateTransition(Duration.millis(56), card); + tt.setFromX(0); + tt.setByX(10); + tt.setCycleCount(6); + tt.setAutoReverse(true); + tt.play(); + } } - drawLowerBuilding(); } private void drawUpperBuilding() { @@ -299,137 +468,6 @@ public class MainFXMLController { } } - private void renderPlayer(Player player,VBox target) { - VBox card = new VBox(3); - VBox.setMargin(card, new Insets(15,15,0,15)); - card.getStyleClass().add("player-card"); - card.setPadding(new Insets(4)); - - if(player.getUserName().equals(controller.miniModel.currentState.getCurrentPlayer().getUserName())) { - ScaleTransition scaleUp = new ScaleTransition(Duration.millis(150), card); - scaleUp.setToX(1.1); - scaleUp.setToY(1.1); - scaleUp.play(); - - card.setStyle("-fx-effect: dropshadow(gaussian, #fff8dc, 15, 0.10, 0, 0)"); - } - - - - // Riga 1: totem + nome - HBox headerRow = new HBox(8); - headerRow.setAlignment(Pos.CENTER); - ImageView totem = new ImageView(loadImage("/GUIImages/Totems/totem_" + player.totem.toString().toLowerCase(Locale.ROOT) + ".png")); - totem.setFitHeight(20); - totem.setPreserveRatio(true); - Label usernameLabel = new Label(player.getUserName()); - usernameLabel.getStyleClass().add("label-medium"); - usernameLabel.setStyle("-fx-text-fill: #711423;"); - if (player.getUserName().equals(controller.myUsername)) { - usernameLabel.setText(usernameLabel.getText() + " (you)"); - - if(isError) { - TranslateTransition tt = new TranslateTransition(Duration.millis(56), card); - tt.setFromX(0); - tt.setByX(10); - tt.setCycleCount(6); - tt.setAutoReverse(true); - tt.play(); - } - } - if (controller.miniModel.disconnectedPlayers.contains(player.getUserName())) { - card.getStyleClass().add("player-card-crashed"); - } - headerRow.getChildren().addAll(totem, usernameLabel); - - // Riga 2: cibo + prestigio + building - HBox statsRow = new HBox(10); - statsRow.setAlignment(Pos.CENTER); - - HBox foodBox = new HBox(4); - foodBox.setAlignment(Pos.CENTER); - ImageView foodIcon = new ImageView(loadImage("/GUIImages/Icons/Food.png")); - foodIcon.setFitHeight(20); - foodIcon.setPreserveRatio(true); - Label foodLabel = new Label(String.valueOf(player.getFoodValue())); - foodLabel.getStyleClass().add("label-small"); - foodBox.getChildren().addAll(foodIcon, foodLabel); - - HBox prestigeBox = new HBox(1); - prestigeBox.setAlignment(Pos.CENTER); - ImageView PPIcon = new ImageView(loadImage("/GUIImages/Icons/PrestigePoint.png")); - PPIcon.setFitHeight(35); - PPIcon.setPreserveRatio(true); - Label prestigeLabel = new Label(String.valueOf(player.getPrestigeValue())); - prestigeLabel.getStyleClass().add("label-small"); - prestigeBox.getChildren().addAll(PPIcon, prestigeLabel); - - ImageView icon = new ImageView(); - icon.setFitWidth(28); - icon.setFitHeight(28); - icon.setPreserveRatio(true); - icon.setImage(loadImage("/GUIImages/Icons/Building.png")); - - ArrayList cards = getPlayerCards(player.getUserName(), "building"); - if (cards.isEmpty()) { - ColorAdjust grayscale = new ColorAdjust(); - icon.setEffect(grayscale); - icon.setOpacity(0.3); - } else { - icon.setOnMouseClicked(e -> openPopup(new ArrayList<>(cards))); - addHoverZoom(icon); - } - - statsRow.getChildren().addAll(foodBox, prestigeBox,icon); - - // Righe 3-4: icone carte - HBox iconsRow1 = new HBox(6); - iconsRow1.setSpacing(20); - iconsRow1.setAlignment(Pos.CENTER); - HBox iconsRow2 = new HBox(6); - iconsRow2.setAlignment(Pos.CENTER); - iconsRow2.setSpacing(20); - renderIcons(iconsRow1, iconsRow2, player); - - card.getChildren().addAll(headerRow, statsRow, iconsRow1, iconsRow2); - target.getChildren().add(card); - } - - private void renderIcons(HBox iconsRow1, HBox iconsRow2, Player player) { - String[][] iconTypes = { - {"Artist", "artists"}, - {"Gatherer", "gatherers"}, - {"Inventor", "inventors"}, - {"Builder", "builders"}, - {"Shaman", "shamans"}, - {"Hunter", "hunters"} - }; - - for (int i = 0; i < iconTypes.length; i++) { - String iconName = iconTypes[i][0]; - String fieldName = iconTypes[i][1]; - - ImageView icon = new ImageView(); - icon.setFitWidth(28); - icon.setFitHeight(28); - icon.setPreserveRatio(true); - icon.setImage(loadImage("/GUIImages/Icons/" + iconName + ".png")); - - ArrayList cards = getPlayerCards(player.getUserName(), fieldName); - if (cards.isEmpty()) { - ColorAdjust grayscale = new ColorAdjust(); - icon.setEffect(grayscale); - icon.setOpacity(0.3); - } else { - icon.setOnMouseClicked(e -> openPopup(new ArrayList<>(cards))); - addHoverZoom(icon); - } - - if (i < 3) iconsRow1.getChildren().add(icon); - else iconsRow2.getChildren().add(icon); - } - } - private ArrayList getPlayerCards(String username, String type) { Player p = controller.miniModel.players.get(username); return switch (type) { @@ -446,6 +484,38 @@ public class MainFXMLController { // ==== ABSOLUTES ==== + private void renderUpper() { + upperList.setSpacing(14); + upperList.setAlignment(Pos.CENTER); + upperList.getChildren().clear(); + + int i = 0; + for (TribeCard card : controller.miniModel.upperListTribeCards) { + final int index = i; + StackPane img = createCard(card, true, true, upperList); + img.setOnMouseClicked(e -> controller.drawUpperTribeCard(index)); + upperList.getChildren().add(img); + i++; + } + drawUpperBuilding(); + } + + private void renderLower() { + lowerList.setSpacing(14); + lowerList.setAlignment(Pos.CENTER); + lowerList.getChildren().clear(); + + int i = 0; + for (TribeCard card : controller.miniModel.lowerListTribeCards) { + final int index = i; + StackPane img = createCard(card, true, true, lowerList); + img.setOnMouseClicked(e -> controller.drawLowerTribeCard(index)); + lowerList.getChildren().add(img); + i++; + } + drawLowerBuilding(); + } + private void renderBackground() { BackgroundSize size = new BackgroundSize( BackgroundSize.AUTO, BackgroundSize.AUTO, @@ -569,19 +639,9 @@ public class MainFXMLController { drawMyHandList(me.buildingCards); } - private void renderSidePanel() { - infoText.setText("Round: "+Integer.toString(controller.miniModel.currentState.getRound()) + " • " + controller.miniModel.currentState.getGameStage().toString()); - - VBox playerList = new VBox(); - playerList.setFillWidth(true); - for (Player p : controller.miniModel.players.values()) { - renderPlayer(p, playerList); - } - playerSide.setContent(playerList); - } // ==== POPUP ==== - public void initPopup() { + private void initPopup() { popupCards = new HBox(10); popupCards.setAlignment(Pos.CENTER); popupCards.setPadding(new Insets(10)); @@ -610,7 +670,6 @@ public class MainFXMLController { popup.setY(window.getY() + (window.getHeight() - popup.getHeight()) / 2); } - // Popup sola visualizzazione (mano, icone sidepanel) private void openPopup(ArrayList cardList) { popupCards.getChildren().clear(); for (PlayableCard card : cardList) { @@ -619,7 +678,6 @@ public class MainFXMLController { showPopup(); } - // Popup edifici upper: click sulla carta → pesca e chiude private void openPopupUpperBuilding(ArrayList cardList) { popupCards.getChildren().clear(); for (int i = 0; i < cardList.size(); i++) { @@ -634,7 +692,6 @@ public class MainFXMLController { showPopup(); } - // Popup edifici lower: click sulla carta → pesca e chiude private void openPopupLowerBuilding(ArrayList cardList) { popupCards.getChildren().clear(); for (int i = 0; i < cardList.size(); i++) { @@ -660,6 +717,7 @@ public class MainFXMLController { popupCards.getChildren().add(wrapper); showPopup(); } + private StackPane createCardPopup(PlayableCard card, boolean withZoom, boolean withShadow) { ImageView img = new ImageView(loadImage("/GUIImages/Fronts/card-" + card.getIdIMG() + ".png")); img.setFitHeight(200); diff --git a/src/main/java/it/polimi/ingsw/gc14/View/TUI/TUI.java b/src/main/java/it/polimi/ingsw/gc14/View/TUI/TUI.java index 64be5d2..1b49090 100644 --- a/src/main/java/it/polimi/ingsw/gc14/View/TUI/TUI.java +++ b/src/main/java/it/polimi/ingsw/gc14/View/TUI/TUI.java @@ -238,6 +238,13 @@ public class TUI implements IView { public void showError(ErrorType error,String message) { clearTerminal(); render(); + if(error.equals(ErrorType.WRONG_ACTION)) + { + if(!model.currentState.getCurrentPlayer().getUserName().equals(username)){ + System.out.println("It's not your turn"); + return; + } + } System.out.println(message); if(error==ErrorType.SERVER_CRASHED) System.out.println("Press any key to continue"); @@ -361,8 +368,8 @@ public class TUI implements IView { BuildTableLower.addRow(i+"-"+model.lowerListBuildingCards.get(i).toString()); } } - stringUpperListTribe.forEach(x->TribeTableUpper.addRow(x)); - stringLowerListTribe.forEach(x->TribeTableLower.addRow(x)); + stringUpperListTribe.forEach(TribeTableUpper::addRow); + stringLowerListTribe.forEach(TribeTableLower::addRow); offerTrack.addRow(stringUpOffer); offerTrack.addRow(stringDownOffer); return "CURRENT STATE\n"+model.currentState+"\n"+model.orderLogicCard.toString()+"\n"+ AsciiTable.sideBySide(Arrays.stream((TribeTableUpper.build().split("\n"))).toList(), Arrays.stream(BuildTableUpper.build().split("\n")).toList(),2)+"\n"+offerTrack.build()+"\n"+AsciiTable.sideBySide(List.of(TribeTableLower.build().split("\n")), Arrays.stream(BuildTableLower.build().split("\n")).toList(),2);