From 12e859edd54c4f900a3251d5f2968bbea34c3ec2 Mon Sep 17 00:00:00 2001 From: Yvonne Schmidt Date: Thu, 28 Nov 2024 21:55:44 +0100 Subject: [PATCH] finished PropertyOverviewMenu --- .../client/gui/BuildingAdminMenu.java | 1 + .../client/gui/PropertyOverviewMenu.java | 165 +++++++++++++++--- .../java/pp/monopoly/client/gui/Toolbar.java | 2 +- 3 files changed, 147 insertions(+), 21 deletions(-) diff --git a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/BuildingAdminMenu.java b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/BuildingAdminMenu.java index 497e711..6ff0998 100644 --- a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/BuildingAdminMenu.java +++ b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/BuildingAdminMenu.java @@ -81,6 +81,7 @@ public class BuildingAdminMenu extends Dialog { overviewButton.setPreferredSize(new Vector3f(200, 50, 0)); overviewButton.addClickCommands(s -> ifTopDialog(() -> { app.getGameLogic().playSound(Sound.BUTTON); + new PropertyOverviewMenu(app).open(); })); overviewColumn.addChild(overviewButton); diff --git a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/PropertyOverviewMenu.java b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/PropertyOverviewMenu.java index e1c9c4c..9e9eb05 100644 --- a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/PropertyOverviewMenu.java +++ b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/PropertyOverviewMenu.java @@ -12,8 +12,16 @@ import com.simsilica.lemur.style.ElementId; import pp.dialog.Dialog; import pp.monopoly.client.MonopolyApp; +import pp.monopoly.game.server.Player; +import pp.monopoly.model.fields.BoardManager; +import pp.monopoly.model.fields.BuildingProperty; +import pp.monopoly.model.fields.Field; +import pp.monopoly.model.fields.FoodField; +import pp.monopoly.model.fields.GateField; +import pp.monopoly.model.fields.PropertyField; import java.util.ArrayList; +import java.util.Collections; import java.util.List; /** @@ -35,6 +43,10 @@ public class PropertyOverviewMenu extends Dialog { super(app.getDialogManager()); this.app = app; + // Assign 10 random buildings to the player + //TODO Aufruf für Demo löschen + assignRandomPropertiesToPlayer(); + // Make the menu fullscreen Vector3f screenSize = new Vector3f(app.getCamera().getWidth(), app.getCamera().getHeight(), 0); @@ -50,15 +62,13 @@ public class PropertyOverviewMenu extends Dialog { // Central display container (to hold the "Gebäude" cards) displayContainer = mainContainer.addChild(new Container(new SpringGridLayout(Axis.X, Axis.Y, FillMode.Even, FillMode.None))); // Horizontal layout displayContainer.setPreferredSize(new Vector3f(screenSize.x - 300, 550, 0)); // Take up the remaining width - displayContainer.setBackground(new QuadBackgroundComponent(ColorRGBA.Gray)); + displayContainer.setBackground(new QuadBackgroundComponent(ColorRGBA.White)); displayContainer.setLocalTranslation(0, 0, 11); // Add some placeholder "Gebäude" cards to the display container cards = new ArrayList<>(); - for (int i = 0; i < 10; i++) { - Container card = createGebäudeCard("Gebäude " + (i + 1), 320, 28); - cards.add(card); // Keep track of cards for scrolling - } + populatePlayerProperties(); + // Initially add only visible cards to the displayContainer refreshVisibleCards(0); @@ -85,23 +95,114 @@ public class PropertyOverviewMenu extends Dialog { /** - * Creates a "Gebäude" card container with the given information. - * - * @param title The title of the card (e.g., "Gebäude 1"). - * @param propertyValue The property value. - * @param rent The rent amount. - * @return A styled container representing a "Gebäude" card. + * Fetches the player's properties and populates them into the cards list. */ - private Container createGebäudeCard(String title, int propertyValue, int rent) { - Container card = new Container(); - card.setPreferredSize(new Vector3f(150, 200, 2)); // Increase width and height for better visibility - card.setBackground(new QuadBackgroundComponent(ColorRGBA.Gray)); + private void populatePlayerProperties() { + // Fetch the current player + Player currentPlayer = app.getGameLogic().getPlayerHandler().getPlayers().get(0); - card.addChild(new Label(title, new ElementId("card-label"))).setFontSize(14); - card.addChild(new Label("Grundstückswert: €" + propertyValue, new ElementId("card-label"))).setFontSize(12); - card.addChild(new Label("Miete allein: €" + rent, new ElementId("card-label"))).setFontSize(12); - card.addChild(new Label("1 Haus: €50", new ElementId("card-label"))).setFontSize(12); - card.addChild(new Label("Hypothekenwert: €160", new ElementId("card-label"))).setFontSize(12); + // Iterate through the player's properties + for (PropertyField property : currentPlayer.getProperties()) { + if (property instanceof BuildingProperty) { + BuildingProperty building = (BuildingProperty) property; + cards.add(createBuildingCard(building)); + } else if (property instanceof FoodField) { + FoodField foodField = (FoodField) property; + cards.add(createFoodFieldCard(foodField)); + } else if (property instanceof GateField) { + GateField gateField = (GateField) property; + cards.add(createGateFieldCard(gateField)); + } + } + } + + /** + * Creates a card for BuildingProperty with detailed rent and cost information. + */ + private Container createBuildingCard(BuildingProperty field) { + Container card = new Container(); + card.setPreferredSize(new Vector3f(200, 300, 2)); // Match the size of the BuildingPropertyCard + card.setBackground(new QuadBackgroundComponent(field.getColor().getColor())); + card.setInsets(new Insets3f(5, 5, 5, 5)); // Add 5-pixel inset + + card.addChild(new Label(field.getName(), new ElementId("label-Bold"))).setFontSize(25); + + // Add property details + Container propertyValuesContainer = card.addChild(new Container()); + propertyValuesContainer.addChild(new Label("Grundstückswert: €" + field.getPrice(), new ElementId("label-Text"))).setFontSize(14); + propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))); // Leerzeile + propertyValuesContainer.addChild(new Label("Miete allein: €" + field.getAllRent().get(0), new ElementId("label-Text"))).setFontSize(14); + propertyValuesContainer.addChild(new Label("- mit 1 Haus: €" + field.getAllRent().get(1), new ElementId("label-Text"))).setFontSize(14); + propertyValuesContainer.addChild(new Label("- mit 2 Häuser: €" + field.getAllRent().get(2), new ElementId("label-Text"))).setFontSize(14); + propertyValuesContainer.addChild(new Label("- mit 3 Häuser: €" + field.getAllRent().get(3), new ElementId("label-Text"))).setFontSize(14); + propertyValuesContainer.addChild(new Label("- mit 4 Häuser: €" + field.getAllRent().get(4), new ElementId("label-Text"))).setFontSize(14); + propertyValuesContainer.addChild(new Label("- mit 1 Hotel: €" + field.getAllRent().get(5), new ElementId("label-Text"))).setFontSize(14); + propertyValuesContainer.addChild(new Label("- 1 Haus kostet: €" + field.getHousePrice(), new ElementId("label-Text"))).setFontSize(14); + propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))); // Leerzeile + propertyValuesContainer.addChild(new Label("Hypothek: €" + field.getHypo(), new ElementId("label-Text"))).setFontSize(14); + propertyValuesContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); + + return card; + } + + /** + * Creates a card for FoodField with dynamic pricing and rent details. + */ + private Container createFoodFieldCard(FoodField field) { + Container card = new Container(); + card.setPreferredSize(new Vector3f(200, 300, 2)); // Adjust card size + card.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.1f, 0.1f, 0.1f, 0.9f))); // Dark background for card + card.setInsets(new Insets3f(5, 5, 5, 5)); // Add 5-pixel inset + + // Title Section + Label title = card.addChild(new Label(field.getName(), new ElementId("label-Bold"))); + title.setFontSize(30); + title.setColor(ColorRGBA.White); // Ensure readability on dark background + + // Property Values Section + Container propertyValuesContainer = card.addChild(new Container()); + propertyValuesContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); // Grey background + propertyValuesContainer.addChild(new Label("Preis: €" + field.getPrice(), new ElementId("label-Text"))).setFontSize(14); + propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))); // Leerzeile + propertyValuesContainer.addChild(new Label("Wenn man Besitzer des", new ElementId("label-Text"))).setFontSize(14); + propertyValuesContainer.addChild(new Label(field.getName() + " ist,", new ElementId("label-Text"))).setFontSize(14); + propertyValuesContainer.addChild(new Label("so ist die Miete", new ElementId("label-Text"))).setFontSize(14); + propertyValuesContainer.addChild(new Label("40x Würfelwert.", new ElementId("label-Text"))).setFontSize(14); + propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))); // Leerzeile + propertyValuesContainer.addChild(new Label("Besitzer beider", new ElementId("label-Text"))).setFontSize(14); + propertyValuesContainer.addChild(new Label("Restaurants zahlt", new ElementId("label-Text"))).setFontSize(14); + propertyValuesContainer.addChild(new Label("100x Würfelwert.", new ElementId("label-Text"))).setFontSize(14); + propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))); // Leerzeile + propertyValuesContainer.addChild(new Label("Hypothek: €" + field.getHypo(), new ElementId("label-Text"))).setFontSize(14); + + return card; + } + + /** + * Creates a card for GateField with rent details for owning multiple gates. + */ + private Container createGateFieldCard(GateField field) { + Container card = new Container(); + card.setPreferredSize(new Vector3f(200, 300, 2)); // Adjust card size + card.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Light grey background + card.setInsets(new Insets3f(5, 5, 5, 5)); // Add 5-pixel inset + + // Title Section + Label title = card.addChild(new Label(field.getName(), new ElementId("label-Bold"))); + title.setFontSize(30); + title.setColor(ColorRGBA.Black); + + // Property Values Section + Container propertyValuesContainer = card.addChild(new Container()); + propertyValuesContainer.addChild(new Label("Preis: €" + field.getPrice(), new ElementId("label-Text"))).setFontSize(14); + propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))); // Leerzeile + propertyValuesContainer.addChild(new Label("1 Bahnhof: €250", new ElementId("label-Text"))).setFontSize(14); + propertyValuesContainer.addChild(new Label("2 Bahnhöfe: €500", new ElementId("label-Text"))).setFontSize(14); + propertyValuesContainer.addChild(new Label("3 Bahnhöfe: €1000", new ElementId("label-Text"))).setFontSize(14); + propertyValuesContainer.addChild(new Label("4 Bahnhöfe: €2000", new ElementId("label-Text"))).setFontSize(14); + propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))); // Leerzeile + propertyValuesContainer.addChild(new Label("Hypothek: €" + field.getHypo(), new ElementId("label-Text"))).setFontSize(14); + propertyValuesContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); // Dark grey background return card; } @@ -119,6 +220,7 @@ public class PropertyOverviewMenu extends Dialog { } } + /** * Custom listener for slider value changes. */ @@ -145,4 +247,27 @@ public class PropertyOverviewMenu extends Dialog { app.getGuiNode().detachChild(mainContainer); super.close(); } + //TODO Demo Funktion nach implementierung löschen + private void assignRandomPropertiesToPlayer() { + // Get the board from the BoardManager + BoardManager boardManager = app.getGameLogic().getBoardManager(); + List fields = boardManager.getBoard(); + + // Filter for BuildingProperty, FoodField, and GateField + List propertyFields = new ArrayList<>(); + for (Field field : fields) { + if (field instanceof PropertyField) { + propertyFields.add((PropertyField) field); + } + } + + // Shuffle and select up to 10 properties (mix of BuildingProperty, FoodField, GateField) + Collections.shuffle(propertyFields); + List randomProperties = propertyFields.subList(0, Math.min(10, propertyFields.size())); + + // Assign the properties to the current player + Player currentPlayer = app.getGameLogic().getPlayerHandler().getPlayers().get(0); + currentPlayer.getProperties().clear(); + currentPlayer.getProperties().addAll(randomProperties); + } } \ No newline at end of file diff --git a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/Toolbar.java b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/Toolbar.java index 7d5fe4c..d3e82fc 100644 --- a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/Toolbar.java +++ b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/Toolbar.java @@ -132,7 +132,7 @@ public class Toolbar extends Dialog implements GameEventListener { propertyMenuButton.setFontSize(30); propertyMenuButton.addClickCommands(s -> ifTopDialog(() -> { app.getGameLogic().playSound(Sound.BUTTON); - new PropertyOverviewMenu(app).open(); + new BuildingAdminMenu(app).open(); })); return propertyMenuButton; }