diff --git a/src/main/java/client/DeckGridAppFX.java b/src/main/java/client/DeckGridAppFX.java index d7e8085..0b7bb60 100644 --- a/src/main/java/client/DeckGridAppFX.java +++ b/src/main/java/client/DeckGridAppFX.java @@ -40,6 +40,7 @@ import server.cards.CharacterType; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.InputStream; +import java.net.URL; import java.util.*; import java.util.stream.Collectors; @@ -75,26 +76,15 @@ public class DeckGridAppFX extends Application { players.add(new Player("Blue", TotemColor.BLUE)); players.add(new Player("Red", TotemColor.RED)); - //players.add(new Player("Purple", TotemColor.PURPLE)); - //players.add(new Player("Green", TotemColor.GREEN)); + players.add(new Player("Purple", TotemColor.PURPLE)); + players.add(new Player("Green", TotemColor.GREEN)); Game game = new Game(players); - InputStream frontStream = getClass().getResourceAsStream("/files/Cards_total_front_PROMO.pdf"); - InputStream backStream = getClass().getResourceAsStream("/files/Cards_total_back_PROMO.pdf"); + //InputStream frontStream = getClass().getResourceAsStream("/files/Cards_total_front_PROMO.pdf"); + //InputStream backStream = getClass().getResourceAsStream("/files/Cards_total_back_PROMO.pdf"); InputStream csvStream = getClass().getResourceAsStream("/files/cards.csv"); - try { - documentFront = PDDocument.load(frontStream); - pdfRendererFront = new PDFRenderer(documentFront); - - documentBack = PDDocument.load(backStream); - pdfRendererBack = new PDFRenderer(documentBack); - - } catch ( IOException e) { - throw new RuntimeException(e); - } - // using false for Testing purpose game.newGame(csvStream, false); @@ -115,7 +105,7 @@ public class DeckGridAppFX extends Application { }); - primaryStage.setTitle("Tavolo da Gioco - Board & Players"); + primaryStage.setTitle("Mesos - Board & Players"); btnTop = new Button("Pick Top"); btnBottom = new Button("Pick Bottom"); @@ -182,8 +172,7 @@ public class DeckGridAppFX extends Application { private void drawGameState(Game game) { - if (documentFront == null) return; - + //if (documentFront == null) return; topMenu.getChildren().clear(); topRow.getChildren().clear(); @@ -205,7 +194,7 @@ public class DeckGridAppFX extends Application { private void drawBottomRow(HBox row, Game game) { for (Card c : game.getGameBoard().getBottomRow()) { - ImageView cardImage = createCardImageFromPdf(c.getCardId(), IMG_HEIGHT, true); + ImageView cardImage = createCardImageFromPdf(game.getGameBoard().getCardDeck().getImageCardsMap().get(c.getCardId()), IMG_HEIGHT); if (cardImage != null) { @@ -261,7 +250,7 @@ public class DeckGridAppFX extends Application { private void drawTopRow(HBox row, Game game) { for (Card c : game.getGameBoard().getTopRow()) { - ImageView cardImage = createCardImageFromPdf(c.getCardId(), IMG_HEIGHT, true); + ImageView cardImage = createCardImageFromPdf(game.getGameBoard().getCardDeck().getImageCardsMap().get(c.getCardId()), IMG_HEIGHT); if (cardImage != null) { @@ -366,10 +355,18 @@ public class DeckGridAppFX extends Application { turnLabel.setFont(Font.font("System", FontWeight.BOLD, 16)); turnLabel.setTextFill(Color.DARKBLUE); + String coverpath=""; Card first = game.getGameBoard().getCardDeck().getFirstCardForCover(); if (first!=null){ - ImageView imgCover = createCardImageFromPdf(first.getCardId(), 120, false); - turnBox.getChildren().addAll(turnLabel, imgCover); + if (first.getEra().equals(Era.I))coverpath ="/files/allcards/era1.png"; + else if (first.getEra().equals(Era.II)) coverpath ="/files/allcards/era2.png"; + else if (first.getEra().equals(Era.III)) coverpath ="/files/allcards/era3.png"; + else coverpath ="/files/allcards/final.png"; + //ImageView createCardImage(InputStream imagePath, int height) + ImageView cover = createCardImage(getClass().getResourceAsStream( coverpath), 90); + //TODO load image cover + //ImageView imgCover = createCardImageFromPdf(first.getCardId(), 120, false); + turnBox.getChildren().addAll(turnLabel, cover); } else turnBox.getChildren().addAll(turnLabel); // Add FIRST @@ -484,7 +481,9 @@ public class DeckGridAppFX extends Application { HBox cardImagesRow = new HBox(5); for (Card c : cardsOfType) { // Carte più piccole (90px) per l'area giocatore - ImageView img = createCardImageFromPdf(c.getCardId(), 90, true); + //ImageView img = createCardImageFromPdf(c.getCardId(), 90, true); + ImageView img = createCardImageFromPdf(game.getGameBoard().getCardDeck().getImageCardsMap().get(c.getCardId()), 90); + if (img != null) cardImagesRow.getChildren().add(img); } @@ -501,7 +500,9 @@ public class DeckGridAppFX extends Application { HBox cardImagesRow = new HBox(5); for (Card c : cardsOfType) { // Carte più piccole (90px) per l'area giocatore - ImageView img = createCardImageFromPdf(c.getCardId(), 90, true); + //ImageView img = createCardImageFromPdf(c.getCardId(), 90, true); + ImageView img = createCardImageFromPdf(game.getGameBoard().getCardDeck().getImageCardsMap().get(c.getCardId()), 90); + if (img != null) cardImagesRow.getChildren().add(img); } @@ -512,7 +513,23 @@ public class DeckGridAppFX extends Application { } } - private ImageView createCardImageFromPdf(int pageIndex, int height, boolean front) { + + private ImageView createCardImageFromPdf( Image image,int height) { + ImageView imageView=null; + if (image != null) { + imageView = new ImageView(image); + imageView.setFitHeight(height); + imageView.setPreserveRatio(true); + imageView.setStyle("-fx-effect: dropshadow(three-pass-box, rgba(0,0,0,0.4), 4, 0, 0, 0);"); + + // 👉 Add popup on click + imageView.setOnMouseClicked(e -> showCardPopup(image, e)); + } + return imageView; + + } + + private ImageView createCardImageFromPdf333(int pageIndex, int height, boolean front) { try { BufferedImage bim; if (front) @@ -536,6 +553,7 @@ public class DeckGridAppFX extends Application { return null; } } + private void showCardPopup(Image image, MouseEvent event) { Stage popup = new Stage(); popup.initModality(Modality.NONE); diff --git a/src/main/java/server/cards/CardDeck.java b/src/main/java/server/cards/CardDeck.java index b2285bb..bad925a 100644 --- a/src/main/java/server/cards/CardDeck.java +++ b/src/main/java/server/cards/CardDeck.java @@ -1,5 +1,6 @@ package server.cards; +import javafx.scene.image.Image; import server.Era; import server.utils.LoadingCardsException; import org.apache.logging.log4j.LogManager; @@ -9,6 +10,7 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.net.URL; import java.nio.file.Files; import java.nio.file.Path; import java.util.*; @@ -18,6 +20,11 @@ public class CardDeck { private List tribeDeck; private Map> buildingDeck; private static final Logger logger = LogManager.getLogger(CardDeck.class); + private Map imageCardsMap = new HashMap<>(); + + public Map getImageCardsMap() { + return imageCardsMap; + } public List getTribeDeck() { return tribeDeck; @@ -43,6 +50,7 @@ public class CardDeck { String cleanRow = row.trim(); String[] fields = cleanRow.split(";"); logger.info((p++) + " ROW " +row); + switch (fields[0]) { case "C": tribe.add(CharacterCard.parsRow(row)); @@ -109,6 +117,8 @@ public class CardDeck { logger.error(e); throw new LoadingCardsException("file not found"); } + loadCardImage(tribe); + loadCardImage(building); if (shuffle) building = CardDeck.shuffle(building); @@ -120,6 +130,67 @@ public class CardDeck { this.buildingDeck = building.stream().collect(Collectors.groupingBy(Card::getEra)); } + private void loadCardImage(List cards){ + for (Card c : cards) { + String path = "/files/allcards/" + c.getCardId() + ".png"; + URL resource = getClass().getResource(path); + if (resource != null) { + Image image = new Image(resource.toExternalForm()); + imageCardsMap.put(c.getCardId(), image); + } else { + logger.error("Immagine non trovata per cardId: " + c.getCardId()); + } + } + } + + + public List loadForNPlayerTest(InputStream csvStream, int n, boolean shuffle) throws LoadingCardsException { + List tribe = new ArrayList<>(); + List building = new ArrayList<>(); + List allCards = new ArrayList<>(); + + try (BufferedReader reader = new BufferedReader(new InputStreamReader(csvStream))) { + String row; + int p = 0; + while ((row = reader.readLine()) != null) { + String cleanRow = row.trim(); + String[] fields = cleanRow.split(";"); + + logger.info((p++) + " ROW " + row); + + switch (fields[0]) { + case "C": + tribe.add(CharacterCard.parsRow(row)); + allCards.add(CharacterCard.parsRow(row)); + break; + case "E": + tribe.add(EventCard.parsRow(row)); + allCards.add(EventCard.parsRow(row)); + break; + case "B": + building.add(BuildingCard.parsRow(row)); + allCards.add(BuildingCard.parsRow(row)); + break; + default: + throw new LoadingCardsException("Content not supported"); + } + } + + } catch (IOException e) { + logger.error(e); + throw new LoadingCardsException("file not found"); + } + + if (shuffle) building = CardDeck.shuffle(building); + + this.tribeDeck = tribe.stream() + .filter(card -> card.getForMinPlayer() <= n) + .collect(Collectors.toCollection(ArrayList::new)); + + if (shuffle) this.tribeDeck = CardDeck.shuffle(this.tribeDeck); + this.buildingDeck = building.stream().collect(Collectors.groupingBy(Card::getEra)); + return allCards; + } public List drawTribe(int n) { diff --git a/src/main/resources/files/allcards/era1.png b/src/main/resources/files/allcards/era1.png new file mode 100644 index 0000000..e30ba31 Binary files /dev/null and b/src/main/resources/files/allcards/era1.png differ diff --git a/src/main/resources/files/allcards/era2.png b/src/main/resources/files/allcards/era2.png new file mode 100644 index 0000000..7e8c332 Binary files /dev/null and b/src/main/resources/files/allcards/era2.png differ diff --git a/src/main/resources/files/allcards/era3.png b/src/main/resources/files/allcards/era3.png new file mode 100644 index 0000000..055f557 Binary files /dev/null and b/src/main/resources/files/allcards/era3.png differ diff --git a/src/main/resources/files/allcards/final.png b/src/main/resources/files/allcards/final.png new file mode 100644 index 0000000..e409043 Binary files /dev/null and b/src/main/resources/files/allcards/final.png differ