mirror of
				https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02.git
				synced 2025-11-04 04:46:03 +01:00 
			
		
		
		
	Compare commits
	
		
			3 Commits
		
	
	
		
			8de7499c21
			...
			b4c664927b
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					b4c664927b | ||
| 
						 | 
					ed27e0aaf1 | ||
| 
						 | 
					98f453d7f8 | 
@@ -19,6 +19,8 @@ import java.util.Deque;
 | 
			
		||||
 | 
			
		||||
import static java.lang.Math.max;
 | 
			
		||||
 | 
			
		||||
import java.lang.System.Logger;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Manages dialog boxes within the application, handling their display, positioning, and focus.
 | 
			
		||||
 */
 | 
			
		||||
@@ -28,11 +30,15 @@ public class DialogManager {
 | 
			
		||||
     */
 | 
			
		||||
    private final SimpleApplication app;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    private final static Logger LOGGER = System.getLogger(DialogManager.class.getName());
 | 
			
		||||
    /**
 | 
			
		||||
     * A stack to keep track of the dialogs.
 | 
			
		||||
     */
 | 
			
		||||
    private final Deque<Dialog> dialogStack = new ArrayDeque<>();
 | 
			
		||||
 | 
			
		||||
    private final Deque<PopupDialog> popUpStack = new ArrayDeque<>();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructs a DialogManager for the specified application.
 | 
			
		||||
     *
 | 
			
		||||
@@ -112,11 +118,45 @@ public class DialogManager {
 | 
			
		||||
     * @param dialog the dialog to open
 | 
			
		||||
     */
 | 
			
		||||
    public void open(Dialog dialog) {
 | 
			
		||||
 | 
			
		||||
        if(dialog instanceof PopupDialog) {
 | 
			
		||||
            popUpStack.push((PopupDialog) dialog);
 | 
			
		||||
            processPopUps();
 | 
			
		||||
        } else {
 | 
			
		||||
            showDialog(dialog);
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    private void showDialog(Dialog dialog) {
 | 
			
		||||
        dialogStack.push(dialog);
 | 
			
		||||
        if(dialog instanceof PopupDialog) {
 | 
			
		||||
            ((PopupDialog)dialog).show();
 | 
			
		||||
        }
 | 
			
		||||
        dialog.update();
 | 
			
		||||
        app.getGuiNode().attachChild(dialog);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void processPopUps() {
 | 
			
		||||
        if (popUpStack.isEmpty()) {
 | 
			
		||||
            return; // Nothing to process
 | 
			
		||||
        }
 | 
			
		||||
    
 | 
			
		||||
        // Check if a popup dialog is already on top
 | 
			
		||||
        if (dialogStack.peek() instanceof PopupDialog) {
 | 
			
		||||
            LOGGER.log(Logger.Level.DEBUG, "Popup dialog already on top");
 | 
			
		||||
            return; // Already a popup dialog on top
 | 
			
		||||
        } else {
 | 
			
		||||
            
 | 
			
		||||
            // Pop the next popup from the stack and validate before showing
 | 
			
		||||
            PopupDialog popUp = popUpStack.pop();
 | 
			
		||||
                
 | 
			
		||||
            showDialog( (Dialog) popUp);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Checks if the specified dialog is the topmost dialog in the dialog stack.
 | 
			
		||||
     *
 | 
			
		||||
@@ -140,6 +180,8 @@ public class DialogManager {
 | 
			
		||||
        if (!dialogStack.isEmpty())
 | 
			
		||||
            dialogStack.peek().update();
 | 
			
		||||
        app.getGuiNode().detachChild(dialog);
 | 
			
		||||
 | 
			
		||||
        processPopUps();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,5 @@
 | 
			
		||||
package pp.dialog;
 | 
			
		||||
 | 
			
		||||
public interface PopupDialog {
 | 
			
		||||
    void show();
 | 
			
		||||
}
 | 
			
		||||
@@ -29,6 +29,8 @@ import pp.monopoly.client.gui.BobTheBuilder;
 | 
			
		||||
import pp.monopoly.client.gui.Toolbar;
 | 
			
		||||
import pp.monopoly.model.Board;
 | 
			
		||||
import pp.monopoly.client.gui.FigureControl;
 | 
			
		||||
 | 
			
		||||
import static java.lang.Math.divideExact;
 | 
			
		||||
import static pp.util.FloatMath.TWO_PI;
 | 
			
		||||
import static pp.util.FloatMath.cos;
 | 
			
		||||
import static pp.util.FloatMath.sin;
 | 
			
		||||
@@ -97,6 +99,8 @@ public class BoardAppState extends MonopolyAppState {
 | 
			
		||||
        getApp().getRootNode().detachAllChildren();
 | 
			
		||||
        getApp().getGuiNode().detachAllChildren();
 | 
			
		||||
 | 
			
		||||
        getApp().getDialogManager().close(getApp().getDialogManager().getDialogStack().peek());
 | 
			
		||||
 | 
			
		||||
        new Toolbar(getApp()).open();
 | 
			
		||||
        sceneNode.detachAllChildren();
 | 
			
		||||
        setupScene();
 | 
			
		||||
 
 | 
			
		||||
@@ -56,7 +56,7 @@ public class PopUpManager implements GameEventListener {
 | 
			
		||||
                        }
 | 
			
		||||
                    });
 | 
			
		||||
                }
 | 
			
		||||
            }, 2500);
 | 
			
		||||
            }, 6000);
 | 
			
		||||
        } else if (event.msg().equals("Winner")) {
 | 
			
		||||
            new WinnerPopUp(app).open();
 | 
			
		||||
        } else if (event.msg().equals("Looser")) {
 | 
			
		||||
 
 | 
			
		||||
@@ -14,15 +14,15 @@ import pp.monopoly.model.Figure;
 | 
			
		||||
import pp.monopoly.notification.GameEventListener;
 | 
			
		||||
import pp.monopoly.notification.UpdatePlayerView;
 | 
			
		||||
 | 
			
		||||
import java.lang.System.Logger;
 | 
			
		||||
import java.lang.System.Logger.Level;
 | 
			
		||||
// import java.lang.System.Logger;
 | 
			
		||||
// import java.lang.System.Logger.Level;
 | 
			
		||||
import java.util.LinkedList;
 | 
			
		||||
import java.util.Queue;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
public class FigureControl extends AbstractControl implements GameEventListener {
 | 
			
		||||
 | 
			
		||||
    private static final Logger LOGGER = System.getLogger(FigureControl.class.getName());
 | 
			
		||||
    // // // private static final Logger LOGGER = System.getLogger(FigureControl.class.getName());
 | 
			
		||||
    private final Figure figure;
 | 
			
		||||
    private final Node spatial;
 | 
			
		||||
    private final MonopolyApp app;
 | 
			
		||||
@@ -51,7 +51,7 @@ public class FigureControl extends AbstractControl implements GameEventListener
 | 
			
		||||
                return; // Warte, bis die Verzögerung abgeschlossen ist
 | 
			
		||||
            }
 | 
			
		||||
            delayTime = 0; // Verzögerung abgeschlossen
 | 
			
		||||
            System.out.println("Delay completed. Starting animation...");
 | 
			
		||||
            
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (currentTarget == null && !path.isEmpty()) {
 | 
			
		||||
@@ -74,7 +74,7 @@ public class FigureControl extends AbstractControl implements GameEventListener
 | 
			
		||||
                
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            System.out.println("Next target: " + currentTarget);
 | 
			
		||||
            
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (currentTarget != null) {
 | 
			
		||||
@@ -96,8 +96,6 @@ public class FigureControl extends AbstractControl implements GameEventListener
 | 
			
		||||
                spatial.setLocalTranslation(currentTarget);
 | 
			
		||||
                figure.moveTo(currentTarget); // Synchronisiere die interne Position
 | 
			
		||||
                currentTarget = null; // Setze Ziel zurück
 | 
			
		||||
 | 
			
		||||
                System.out.println("Target reached.");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -116,34 +114,34 @@ public class FigureControl extends AbstractControl implements GameEventListener
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setPath(int startField, int endField) {
 | 
			
		||||
        LOGGER.log(Level.TRACE, "setPath called with startField: {0} to endField {1}", startField, endField);
 | 
			
		||||
        // LOGGER.log(Level.TRACE, "setPath called with startField: {0} to endField {1}", startField, endField);
 | 
			
		||||
        path.clear();
 | 
			
		||||
        for (int fieldId = startField; fieldId != endField; fieldId = (fieldId + 1) % 40) {
 | 
			
		||||
            Vector3f position = figure.calculateFieldPosition(fieldId);
 | 
			
		||||
            LOGGER.log(Level.DEBUG, "Adding postition to path: {0}", position);
 | 
			
		||||
            // LOGGER.log(Level.DEBUG, "Adding postition to path: {0}", position);
 | 
			
		||||
            path.add(position);
 | 
			
		||||
        }
 | 
			
		||||
        Vector3f finalPosition = figure.calculateFieldPosition(endField);
 | 
			
		||||
        path.add(finalPosition);
 | 
			
		||||
        LOGGER.log(Level.DEBUG, "Final position added to path: {0}", finalPosition);
 | 
			
		||||
        // LOGGER.log(Level.DEBUG, "Final position added to path: {0}", finalPosition);
 | 
			
		||||
        
 | 
			
		||||
        
 | 
			
		||||
        LOGGER.log(Level.TRACE, "Path size: {0}", path.size());
 | 
			
		||||
        // LOGGER.log(Level.TRACE, "Path size: {0}", path.size());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void receivedEvent(UpdatePlayerView event) {
 | 
			
		||||
        LOGGER.log(Level.TRACE, "receivedEvent called with event: {0}", event);
 | 
			
		||||
        // LOGGER.log(Level.TRACE, "receivedEvent called with event: {0}", event);
 | 
			
		||||
        
 | 
			
		||||
        int newPos = app.getGameLogic().getPlayerHandler().getPlayerById(figure.getId()).getFieldID();
 | 
			
		||||
        int currentField = figure.getCurrentFieldID();
 | 
			
		||||
 | 
			
		||||
        if (currentField == newPos) {
 | 
			
		||||
            LOGGER.log(Level.DEBUG, "No movement required. Current field: {0}, New field: {1}", currentField, newPos);
 | 
			
		||||
            // LOGGER.log(Level.DEBUG, "No movement required. Current field: {0}, New field: {1}", currentField, newPos);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        LOGGER.log(Level.DEBUG, "Movement required. Current field: {0}, New field: {1}", currentField, newPos);
 | 
			
		||||
        // LOGGER.log(Level.DEBUG, "Movement required. Current field: {0}, New field: {1}", currentField, newPos);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        setPath(currentField, newPos);
 | 
			
		||||
 
 | 
			
		||||
@@ -136,6 +136,11 @@ public class Toolbar extends Dialog implements GameEventListener {
 | 
			
		||||
        app.getGuiNode().attachChild(border);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Adds a spacer to the specified container.
 | 
			
		||||
     *
 | 
			
		||||
     * @param container the container to which the spacer is added
 | 
			
		||||
     */
 | 
			
		||||
    private void setupSpacer(Container container) {
 | 
			
		||||
        Container spacer = container.addChild(new Container());
 | 
			
		||||
        spacer.setPreferredSize(new Vector3f(20, 10, 0));
 | 
			
		||||
@@ -341,8 +346,7 @@ public class Toolbar extends Dialog implements GameEventListener {
 | 
			
		||||
        endTurnButton.setIcon(icon);
 | 
			
		||||
 | 
			
		||||
        endTurnButton.addClickCommands(s -> ifTopDialog(() -> {
 | 
			
		||||
            app.getGameLogic().send(new EndTurn());
 | 
			
		||||
            receivedEvent(new ButtonStatusEvent(false));
 | 
			
		||||
            handleEndTurn();
 | 
			
		||||
        }));
 | 
			
		||||
 | 
			
		||||
        return endTurnButton;
 | 
			
		||||
 
 | 
			
		||||
@@ -12,33 +12,31 @@ import com.simsilica.lemur.Label;
 | 
			
		||||
import com.simsilica.lemur.component.QuadBackgroundComponent;
 | 
			
		||||
import com.simsilica.lemur.style.ElementId;
 | 
			
		||||
import pp.dialog.Dialog;
 | 
			
		||||
import pp.dialog.PopupDialog;
 | 
			
		||||
import pp.monopoly.client.MonopolyApp;
 | 
			
		||||
import pp.monopoly.client.gui.SettingsMenu;
 | 
			
		||||
import pp.monopoly.message.server.TradeReply;
 | 
			
		||||
import pp.monopoly.notification.Sound;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Represents a confirmation dialog that appears when a trade is accepted .
 | 
			
		||||
 * <p>
 | 
			
		||||
 * Displays a message to the user informing them that the trade they proposed has been accepted,
 | 
			
		||||
 * along with a confirmation button to close the dialog.
 | 
			
		||||
 * </p>
 | 
			
		||||
 * Represents a confirmation dialog that appears when a trade is accepted.
 | 
			
		||||
 * Displays a message to the user informing them that the trade was accepted.
 | 
			
		||||
 */
 | 
			
		||||
public class AcceptTrade extends Dialog {
 | 
			
		||||
public class AcceptTrade extends Dialog implements PopupDialog {
 | 
			
		||||
    /** Reference to the Monopoly application instance. */
 | 
			
		||||
    private final MonopolyApp app;
 | 
			
		||||
 | 
			
		||||
    /** Semi-transparent overlay background for the dialog. */
 | 
			
		||||
    private final Geometry overlayBackground;
 | 
			
		||||
    private Geometry overlayBackground;
 | 
			
		||||
 | 
			
		||||
    /** Container for the warning message content. */
 | 
			
		||||
    private final Container noMoneyWarningContainer;
 | 
			
		||||
    private Container noMoneyWarningContainer;
 | 
			
		||||
 | 
			
		||||
    /** Background container providing a border for the dialog. */
 | 
			
		||||
    private final Container backgroundContainer;
 | 
			
		||||
 | 
			
		||||
    private Container backgroundContainer;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructs the accept trade dialog.
 | 
			
		||||
     * Constructs the AcceptTrade dialog.
 | 
			
		||||
     *
 | 
			
		||||
     * @param app the Monopoly application instance
 | 
			
		||||
     * @param msg the trade reply message containing details about the trade
 | 
			
		||||
@@ -47,80 +45,99 @@ public class AcceptTrade extends Dialog {
 | 
			
		||||
        super(app.getDialogManager());
 | 
			
		||||
        this.app = app;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        // Halbtransparentes Overlay hinzufügen
 | 
			
		||||
        overlayBackground = createOverlayBackground();
 | 
			
		||||
        app.getGuiNode().attachChild(overlayBackground);
 | 
			
		||||
 | 
			
		||||
        // Create the background container
 | 
			
		||||
        backgroundContainer = new Container();
 | 
			
		||||
        backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Darker background
 | 
			
		||||
        app.getGuiNode().attachChild(backgroundContainer);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        // Hauptcontainer für die Warnung
 | 
			
		||||
        noMoneyWarningContainer = new Container();
 | 
			
		||||
        noMoneyWarningContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f)));
 | 
			
		||||
        noMoneyWarningContainer.setPreferredSize(new Vector3f(550,250,10));
 | 
			
		||||
 | 
			
		||||
        float padding = 10; // Passt den backgroundContainer an die Größe des bankruptContainers an
 | 
			
		||||
        backgroundContainer.setPreferredSize(noMoneyWarningContainer.getPreferredSize().addLocal(padding, padding, 0));
 | 
			
		||||
 | 
			
		||||
        // Titel
 | 
			
		||||
        Label gateFieldTitle = noMoneyWarningContainer.addChild(new Label("Handel angenommen!", new ElementId("warning-title")));
 | 
			
		||||
        gateFieldTitle.setFontSize(48);
 | 
			
		||||
        gateFieldTitle.setColor(ColorRGBA.Black);
 | 
			
		||||
 | 
			
		||||
        // Text, der im Popup steht
 | 
			
		||||
        Container textContainer = noMoneyWarningContainer.addChild(new Container());
 | 
			
		||||
        textContainer.addChild(new Label("Du hast Spieler"+ " " + msg.getTradeHandler().getReceiver().getName() + " " + "einen Handel vorgeschlagen", new ElementId("label-Text")));
 | 
			
		||||
        textContainer.addChild(new Label("", new ElementId("label-Text")));
 | 
			
		||||
        textContainer.addChild(new Label("Der Handel wurde angenommen", new ElementId("label-Text")));
 | 
			
		||||
        textContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));
 | 
			
		||||
 | 
			
		||||
        // Passt den textContainer an die Größe des bankruptContainers an
 | 
			
		||||
        textContainer.setPreferredSize(noMoneyWarningContainer.getPreferredSize().addLocal(-250,-200,0));
 | 
			
		||||
 | 
			
		||||
        // Beenden-Button
 | 
			
		||||
        Button quitButton = noMoneyWarningContainer.addChild(new Button("Bestätigen", new ElementId("button")));
 | 
			
		||||
        quitButton.setFontSize(32);
 | 
			
		||||
        quitButton.addClickCommands(source -> ifTopDialog(() -> {
 | 
			
		||||
            app.getGameLogic().playSound(Sound.BUTTON);
 | 
			
		||||
            close();
 | 
			
		||||
        }));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        // Zentriere das Popup
 | 
			
		||||
        noMoneyWarningContainer.setLocalTranslation(
 | 
			
		||||
            (app.getCamera().getWidth() - noMoneyWarningContainer.getPreferredSize().x) / 2,
 | 
			
		||||
            (app.getCamera().getHeight() + noMoneyWarningContainer.getPreferredSize().y) / 2,
 | 
			
		||||
            8
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        // Zentriere das Popup
 | 
			
		||||
        backgroundContainer.setLocalTranslation(
 | 
			
		||||
                (app.getCamera().getWidth() - noMoneyWarningContainer.getPreferredSize().x - padding) / 2,
 | 
			
		||||
                (app.getCamera().getHeight() + noMoneyWarningContainer.getPreferredSize().y+ padding) / 2,
 | 
			
		||||
                7
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        app.getGuiNode().attachChild(noMoneyWarningContainer);
 | 
			
		||||
        // Initialize GUI elements
 | 
			
		||||
        createOverlayBackground();
 | 
			
		||||
        createBackgroundContainer();
 | 
			
		||||
        createWarningContainer(msg);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a semi-transparent background overlay for the dialog.
 | 
			
		||||
     *
 | 
			
		||||
     * @return the geometry of the overlay
 | 
			
		||||
     */
 | 
			
		||||
    private Geometry createOverlayBackground() {
 | 
			
		||||
    private void createOverlayBackground() {
 | 
			
		||||
        Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight());
 | 
			
		||||
        Geometry overlay = new Geometry("Overlay", quad);
 | 
			
		||||
        overlayBackground = new Geometry("Overlay", quad);
 | 
			
		||||
        Material material = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
 | 
			
		||||
        material.setColor("Color", new ColorRGBA(0, 0, 0, 0.5f)); // Halbtransparent
 | 
			
		||||
        material.setColor("Color", new ColorRGBA(0, 0, 0, 0.5f)); // Semi-transparent
 | 
			
		||||
        material.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
 | 
			
		||||
        overlay.setMaterial(material);
 | 
			
		||||
        overlay.setLocalTranslation(0, 0, 0);
 | 
			
		||||
        return overlay;
 | 
			
		||||
        overlayBackground.setMaterial(material);
 | 
			
		||||
        overlayBackground.setLocalTranslation(0, 0, 0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates the background container for the dialog.
 | 
			
		||||
     */
 | 
			
		||||
    private void createBackgroundContainer() {
 | 
			
		||||
        backgroundContainer = new Container();
 | 
			
		||||
        backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Light gray background
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates the main warning container for the dialog.
 | 
			
		||||
     *
 | 
			
		||||
     * @param msg the trade reply message
 | 
			
		||||
     */
 | 
			
		||||
    private void createWarningContainer(TradeReply msg) {
 | 
			
		||||
        noMoneyWarningContainer = new Container();
 | 
			
		||||
        noMoneyWarningContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f)));
 | 
			
		||||
        noMoneyWarningContainer.setPreferredSize(new Vector3f(550, 250, 10));
 | 
			
		||||
 | 
			
		||||
        float padding = 10;
 | 
			
		||||
        backgroundContainer.setPreferredSize(noMoneyWarningContainer.getPreferredSize().addLocal(padding, padding, 0));
 | 
			
		||||
 | 
			
		||||
        // Title
 | 
			
		||||
        Label title = noMoneyWarningContainer.addChild(new Label("Handel angenommen!", new ElementId("warning-title")));
 | 
			
		||||
        title.setFontSize(48);
 | 
			
		||||
        title.setColor(ColorRGBA.Black);
 | 
			
		||||
 | 
			
		||||
        // Message
 | 
			
		||||
        Container textContainer = noMoneyWarningContainer.addChild(new Container());
 | 
			
		||||
        textContainer.addChild(new Label("Du hast Spieler " + msg.getTradeHandler().getReceiver().getName() + " einen Handel vorgeschlagen.", new ElementId("label-Text")));
 | 
			
		||||
        textContainer.addChild(new Label("", new ElementId("label-Text")));
 | 
			
		||||
        textContainer.addChild(new Label("Der Handel wurde angenommen.", new ElementId("label-Text")));
 | 
			
		||||
        textContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));
 | 
			
		||||
        textContainer.setPreferredSize(noMoneyWarningContainer.getPreferredSize().addLocal(-250, -200, 0));
 | 
			
		||||
 | 
			
		||||
        // Confirmation button
 | 
			
		||||
        Button confirmButton = noMoneyWarningContainer.addChild(new Button("Bestätigen", new ElementId("button")));
 | 
			
		||||
        confirmButton.setFontSize(32);
 | 
			
		||||
        confirmButton.addClickCommands(source -> ifTopDialog(() -> {
 | 
			
		||||
            app.getGameLogic().playSound(Sound.BUTTON);
 | 
			
		||||
            close();
 | 
			
		||||
        }));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Centers the warning and background containers on the screen.
 | 
			
		||||
     */
 | 
			
		||||
    private void centerContainers() {
 | 
			
		||||
        float padding = 10;
 | 
			
		||||
 | 
			
		||||
        // Center main container
 | 
			
		||||
        noMoneyWarningContainer.setLocalTranslation(
 | 
			
		||||
                (app.getCamera().getWidth() - noMoneyWarningContainer.getPreferredSize().x) / 2,
 | 
			
		||||
                (app.getCamera().getHeight() + noMoneyWarningContainer.getPreferredSize().y) / 2,
 | 
			
		||||
                8
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        // Center background container with padding
 | 
			
		||||
        backgroundContainer.setPreferredSize(noMoneyWarningContainer.getPreferredSize().addLocal(padding, padding, 0));
 | 
			
		||||
        backgroundContainer.setLocalTranslation(
 | 
			
		||||
                (app.getCamera().getWidth() - backgroundContainer.getPreferredSize().x) / 2,
 | 
			
		||||
                (app.getCamera().getHeight() + backgroundContainer.getPreferredSize().y) / 2,
 | 
			
		||||
                7
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Displays the dialog by attaching it to the GUI through the DialogManager.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void show() {
 | 
			
		||||
        app.getGuiNode().attachChild(overlayBackground);
 | 
			
		||||
        app.getGuiNode().attachChild(backgroundContainer);
 | 
			
		||||
        app.getGuiNode().attachChild(noMoneyWarningContainer);
 | 
			
		||||
        centerContainers();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -128,9 +145,9 @@ public class AcceptTrade extends Dialog {
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void close() {
 | 
			
		||||
        app.getGuiNode().detachChild(noMoneyWarningContainer);  // Entferne das Menü
 | 
			
		||||
        app.getGuiNode().detachChild(backgroundContainer); //Entfernt Rand
 | 
			
		||||
        app.getGuiNode().detachChild(overlayBackground);  // Entferne das Overlay
 | 
			
		||||
        app.getGuiNode().detachChild(overlayBackground);
 | 
			
		||||
        app.getGuiNode().detachChild(backgroundContainer);
 | 
			
		||||
        app.getGuiNode().detachChild(noMoneyWarningContainer);
 | 
			
		||||
        super.close();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -139,6 +156,6 @@ public class AcceptTrade extends Dialog {
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void escape() {
 | 
			
		||||
        close();
 | 
			
		||||
        new SettingsMenu(app).open();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -12,24 +12,24 @@ import com.simsilica.lemur.Label;
 | 
			
		||||
import com.simsilica.lemur.component.QuadBackgroundComponent;
 | 
			
		||||
import com.simsilica.lemur.style.ElementId;
 | 
			
		||||
import pp.dialog.Dialog;
 | 
			
		||||
import pp.dialog.PopupDialog;
 | 
			
		||||
import pp.monopoly.client.MonopolyApp;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Bankrupt is a Warning-Popup which appears when the balance is negative at the end of a player´s turn
 | 
			
		||||
 * Bankrupt is a Warning-Popup which appears when the balance is negative at the end of a player´s turn.
 | 
			
		||||
 */
 | 
			
		||||
public class Bankrupt extends Dialog {
 | 
			
		||||
public class Bankrupt extends Dialog implements PopupDialog {
 | 
			
		||||
    /** Reference to the Monopoly application instance. */
 | 
			
		||||
    private final MonopolyApp app;
 | 
			
		||||
 | 
			
		||||
    /** Semi-transparent overlay background for the popup. */
 | 
			
		||||
    private final Geometry overlayBackground;
 | 
			
		||||
    private Geometry overlayBackground;
 | 
			
		||||
 | 
			
		||||
    /** Main container for the bankruptcy warning content. */
 | 
			
		||||
    private final Container bankruptContainer;
 | 
			
		||||
    private Container bankruptContainer;
 | 
			
		||||
 | 
			
		||||
    /** Background container providing a border for the popup. */
 | 
			
		||||
    private final Container backgroundContainer;
 | 
			
		||||
 | 
			
		||||
    private Container backgroundContainer;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructs the bankruptcy warning popup.
 | 
			
		||||
@@ -40,86 +40,102 @@ public class Bankrupt extends Dialog {
 | 
			
		||||
        super(app.getDialogManager());
 | 
			
		||||
        this.app = app;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        // Halbtransparentes Overlay hinzufügen
 | 
			
		||||
        overlayBackground = createOverlayBackground();
 | 
			
		||||
        app.getGuiNode().attachChild(overlayBackground);
 | 
			
		||||
 | 
			
		||||
        // Create the background container
 | 
			
		||||
        backgroundContainer = new Container();
 | 
			
		||||
        backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Darker background
 | 
			
		||||
        app.getGuiNode().attachChild(backgroundContainer);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        // Hauptcontainer für die Warnung
 | 
			
		||||
        bankruptContainer = new Container();
 | 
			
		||||
        bankruptContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f)));
 | 
			
		||||
        bankruptContainer.setPreferredSize(new Vector3f(550,250,10));
 | 
			
		||||
 | 
			
		||||
        float padding = 10; // Passt den backgroundContainer an die Größe des bankruptContainers an
 | 
			
		||||
        backgroundContainer.setPreferredSize(bankruptContainer.getPreferredSize().addLocal(padding, padding, 0));
 | 
			
		||||
 | 
			
		||||
        // Titel
 | 
			
		||||
        Label gateFieldTitle = bankruptContainer.addChild(new Label("Vorsicht !", new ElementId("warning-title")));
 | 
			
		||||
        gateFieldTitle.setFontSize(48);
 | 
			
		||||
        gateFieldTitle.setColor(ColorRGBA.Black);
 | 
			
		||||
 | 
			
		||||
        // Text, der im Popup steht
 | 
			
		||||
        Container textContainer = bankruptContainer.addChild(new Container());
 | 
			
		||||
        textContainer.addChild(new Label("Du hast noch einen negativen Kontostand. Wenn du jetzt deinen Zug beendest, gehst du Bankrott und verlierst das Spiel!\n"+
 | 
			
		||||
        "Dieses PopUp wird nicht erneut angezeigt!", new ElementId("label-Text")));
 | 
			
		||||
        textContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));
 | 
			
		||||
 | 
			
		||||
        // Passt den textContainer an die Größe des bankruptContainers an
 | 
			
		||||
        textContainer.setPreferredSize(bankruptContainer.getPreferredSize().addLocal(-250,-200,0));
 | 
			
		||||
 | 
			
		||||
        // Beenden-Button
 | 
			
		||||
        Button quitButton = bankruptContainer.addChild(new Button("Bestätigen", new ElementId("button")));
 | 
			
		||||
        quitButton.setFontSize(32);
 | 
			
		||||
        quitButton.addClickCommands(source -> ifTopDialog(this::close));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        // Zentriere das Popup
 | 
			
		||||
        bankruptContainer.setLocalTranslation(
 | 
			
		||||
            (app.getCamera().getWidth() - bankruptContainer.getPreferredSize().x) / 2,
 | 
			
		||||
            (app.getCamera().getHeight() + bankruptContainer.getPreferredSize().y) / 2,
 | 
			
		||||
            8
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        // Zentriere das Popup
 | 
			
		||||
        backgroundContainer.setLocalTranslation(
 | 
			
		||||
                (app.getCamera().getWidth() - bankruptContainer.getPreferredSize().x - padding) / 2,
 | 
			
		||||
                (app.getCamera().getHeight() + bankruptContainer.getPreferredSize().y+ padding) / 2,
 | 
			
		||||
                7
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        app.getGuiNode().attachChild(bankruptContainer);
 | 
			
		||||
        // Initialize the components
 | 
			
		||||
        createOverlayBackground();
 | 
			
		||||
        createBackgroundContainer();
 | 
			
		||||
        createBankruptContainer();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a semi-transparent background overlay for the popup.
 | 
			
		||||
     *
 | 
			
		||||
     * @return the geometry of the overlay
 | 
			
		||||
     */
 | 
			
		||||
    private Geometry createOverlayBackground() {
 | 
			
		||||
    private void createOverlayBackground() {
 | 
			
		||||
        Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight());
 | 
			
		||||
        Geometry overlay = new Geometry("Overlay", quad);
 | 
			
		||||
        overlayBackground = new Geometry("Overlay", quad);
 | 
			
		||||
        Material material = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
 | 
			
		||||
        material.setColor("Color", new ColorRGBA(0, 0, 0, 0.5f)); // Halbtransparent
 | 
			
		||||
        material.setColor("Color", new ColorRGBA(0, 0, 0, 0.5f)); // Semi-transparent
 | 
			
		||||
        material.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
 | 
			
		||||
        overlay.setMaterial(material);
 | 
			
		||||
        overlay.setLocalTranslation(0, 0, 0);
 | 
			
		||||
        return overlay;
 | 
			
		||||
        overlayBackground.setMaterial(material);
 | 
			
		||||
        overlayBackground.setLocalTranslation(0, 0, 0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Closes the menu and removes the GUI elements.
 | 
			
		||||
     * Creates the background container for the popup.
 | 
			
		||||
     */
 | 
			
		||||
    private void createBackgroundContainer() {
 | 
			
		||||
        backgroundContainer = new Container();
 | 
			
		||||
        backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Light gray background
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates the main container for the bankruptcy warning content.
 | 
			
		||||
     */
 | 
			
		||||
    private void createBankruptContainer() {
 | 
			
		||||
        bankruptContainer = new Container();
 | 
			
		||||
        bankruptContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f)));
 | 
			
		||||
        bankruptContainer.setPreferredSize(new Vector3f(550, 250, 10));
 | 
			
		||||
 | 
			
		||||
        // Title
 | 
			
		||||
        Label title = bankruptContainer.addChild(new Label("Vorsicht!", new ElementId("warning-title")));
 | 
			
		||||
        title.setFontSize(48);
 | 
			
		||||
        title.setColor(ColorRGBA.Black);
 | 
			
		||||
 | 
			
		||||
        // Text content
 | 
			
		||||
        Container textContainer = bankruptContainer.addChild(new Container());
 | 
			
		||||
        textContainer.addChild(new Label(
 | 
			
		||||
                "Du hast einen negativen Kontostand. Wenn du jetzt deinen Zug beendest, gehst du bankrott und verlierst das Spiel!\n"
 | 
			
		||||
                + "Dieses Pop-Up wird nicht erneut angezeigt!", 
 | 
			
		||||
                new ElementId("label-Text")));
 | 
			
		||||
        textContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));
 | 
			
		||||
        textContainer.setPreferredSize(bankruptContainer.getPreferredSize().addLocal(-250, -200, 0));
 | 
			
		||||
 | 
			
		||||
        // Confirmation button
 | 
			
		||||
        Button confirmButton = bankruptContainer.addChild(new Button("Bestätigen", new ElementId("button")));
 | 
			
		||||
        confirmButton.setFontSize(32);
 | 
			
		||||
        confirmButton.addClickCommands(source -> ifTopDialog(this::close));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Centers the popup containers on the screen.
 | 
			
		||||
     */
 | 
			
		||||
    private void centerContainers() {
 | 
			
		||||
        float padding = 10;
 | 
			
		||||
 | 
			
		||||
        // Center bankrupt container
 | 
			
		||||
        bankruptContainer.setLocalTranslation(
 | 
			
		||||
                (app.getCamera().getWidth() - bankruptContainer.getPreferredSize().x) / 2,
 | 
			
		||||
                (app.getCamera().getHeight() + bankruptContainer.getPreferredSize().y) / 2,
 | 
			
		||||
                8
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        // Center background container with padding
 | 
			
		||||
        backgroundContainer.setPreferredSize(bankruptContainer.getPreferredSize().addLocal(padding, padding, 0));
 | 
			
		||||
        backgroundContainer.setLocalTranslation(
 | 
			
		||||
                (app.getCamera().getWidth() - backgroundContainer.getPreferredSize().x) / 2,
 | 
			
		||||
                (app.getCamera().getHeight() + backgroundContainer.getPreferredSize().y) / 2,
 | 
			
		||||
                7
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Displays the popup by attaching it to the GUI.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void show() {
 | 
			
		||||
        app.getGuiNode().attachChild(overlayBackground);
 | 
			
		||||
        app.getGuiNode().attachChild(backgroundContainer);
 | 
			
		||||
        app.getGuiNode().attachChild(bankruptContainer);
 | 
			
		||||
        centerContainers();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Closes the popup and removes the associated GUI elements.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void close() {
 | 
			
		||||
        app.getGuiNode().detachChild(bankruptContainer);  // Entferne das Menü
 | 
			
		||||
        app.getGuiNode().detachChild(backgroundContainer); //Entfernt Rand
 | 
			
		||||
        app.getGuiNode().detachChild(overlayBackground);  // Entferne das Overlay
 | 
			
		||||
        app.getGuiNode().detachChild(overlayBackground);
 | 
			
		||||
        app.getGuiNode().detachChild(backgroundContainer);
 | 
			
		||||
        app.getGuiNode().detachChild(bankruptContainer);
 | 
			
		||||
        super.close();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -130,4 +146,4 @@ public class Bankrupt extends Dialog {
 | 
			
		||||
    public void escape() {
 | 
			
		||||
        close();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -8,6 +8,7 @@ import com.simsilica.lemur.component.QuadBackgroundComponent;
 | 
			
		||||
import com.simsilica.lemur.style.ElementId;
 | 
			
		||||
 | 
			
		||||
import pp.dialog.Dialog;
 | 
			
		||||
import pp.dialog.PopupDialog;
 | 
			
		||||
import pp.monopoly.client.MonopolyApp;
 | 
			
		||||
import pp.monopoly.client.gui.SettingsMenu;
 | 
			
		||||
import pp.monopoly.message.client.BuyPropertyResponse;
 | 
			
		||||
@@ -16,16 +17,12 @@ import pp.monopoly.model.fields.BuildingProperty;
 | 
			
		||||
import pp.monopoly.notification.Sound;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * BuildingPropertyCard creates the popup for field information
 | 
			
		||||
 * BuildingPropertyCard creates a popup for displaying field information.
 | 
			
		||||
 */
 | 
			
		||||
public class BuildingPropertyCard extends Dialog {
 | 
			
		||||
    /** Reference to the Monopoly application instance. */
 | 
			
		||||
public class BuildingPropertyCard extends Dialog implements PopupDialog {
 | 
			
		||||
 | 
			
		||||
    private final MonopolyApp app;
 | 
			
		||||
 | 
			
		||||
    /** Main container for the building property information. */
 | 
			
		||||
    private final Container buildingPropertyContainer;
 | 
			
		||||
 | 
			
		||||
    /** Background container providing a border for the property card. */
 | 
			
		||||
    private final Container backgroundContainer;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -37,83 +34,116 @@ public class BuildingPropertyCard extends Dialog {
 | 
			
		||||
        super(app.getDialogManager());
 | 
			
		||||
        this.app = app;
 | 
			
		||||
 | 
			
		||||
        //Generate the corresponding field
 | 
			
		||||
        int index = app.getGameLogic().getPlayerHandler().getPlayerById(app.getId()).getFieldID();
 | 
			
		||||
        BuildingProperty field = (BuildingProperty) new BoardManager().getFieldAtIndex(index);
 | 
			
		||||
 | 
			
		||||
        // Create the background container
 | 
			
		||||
        backgroundContainer = new Container();
 | 
			
		||||
        backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Darker background
 | 
			
		||||
        attachChild(backgroundContainer);
 | 
			
		||||
 | 
			
		||||
        // Hauptcontainer für die Gebäudekarte
 | 
			
		||||
        // Create the main container for the popup
 | 
			
		||||
        buildingPropertyContainer = new Container();
 | 
			
		||||
        buildingPropertyContainer.setBackground(new QuadBackgroundComponent(field.getColor().getColor()));
 | 
			
		||||
        addContentToContainer(buildingPropertyContainer, field);
 | 
			
		||||
 | 
			
		||||
        float padding = 10; // Passt den backgroundContainer an die Größe des buildingPropertyContainer an
 | 
			
		||||
        // Create the background container
 | 
			
		||||
        backgroundContainer = new Container();
 | 
			
		||||
        backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Light gray
 | 
			
		||||
 | 
			
		||||
        // Add padding to the background
 | 
			
		||||
        float padding = 10f;
 | 
			
		||||
        backgroundContainer.setPreferredSize(buildingPropertyContainer.getPreferredSize().addLocal(padding, padding, 0));
 | 
			
		||||
 | 
			
		||||
        //Titel
 | 
			
		||||
        Label settingsTitle = buildingPropertyContainer.addChild(new Label( field.getName(), new ElementId("label-Bold")));
 | 
			
		||||
        settingsTitle.setBackground(new QuadBackgroundComponent(field.getColor().getColor()));
 | 
			
		||||
        settingsTitle.setFontSize(48);
 | 
			
		||||
        // Position the containers
 | 
			
		||||
        centerContainers(padding);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        // Text, der auf der Karte steht
 | 
			
		||||
        // Die Preise werden dynamisch dem BoardManager entnommen
 | 
			
		||||
        Container propertyValuesContainer = buildingPropertyContainer.addChild(new Container());
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("„Grundstückswert: " + field.getPrice() + " EUR", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("", new ElementId("label-Text")));// Leerzeile
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("„Miete allein: " + field.getAllRent().get(0)+ " EUR", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("„-mit 1 Haus: " + field.getAllRent().get(1) + " EUR", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("„-mit 2 Häuser: " + field.getAllRent().get(2) + " EUR", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("„-mit 3 Häuser: " + field.getAllRent().get(3) + " EUR", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("„-mit 4 Häuser: " + field.getAllRent().get(4) + " EUR", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("„-mit 1 Hotel: " + field.getAllRent().get(5) + " EUR", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("„-1 Haus kostet: " + field.getHousePrice()+ " EUR", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("", new ElementId("label-Text")));// Leerzeile
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("„Hypothek: " + field.getHypo() + " EUR", new ElementId("label-Text")));
 | 
			
		||||
    /**
 | 
			
		||||
     * Adds the property details and buttons to the container.
 | 
			
		||||
     *
 | 
			
		||||
     * @param container the main container for the property card
 | 
			
		||||
     * @param field     the building property to display
 | 
			
		||||
     */
 | 
			
		||||
    private void addContentToContainer(Container container, BuildingProperty field) {
 | 
			
		||||
        // Title
 | 
			
		||||
        Label title = container.addChild(new Label(field.getName(), new ElementId("label-Bold")));
 | 
			
		||||
        title.setBackground(new QuadBackgroundComponent(field.getColor().getColor()));
 | 
			
		||||
        title.setFontSize(48);
 | 
			
		||||
 | 
			
		||||
        // Property details
 | 
			
		||||
        Container propertyValuesContainer = container.addChild(new Container());
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("Grundstückswert: " + field.getPrice() + " EUR", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("Miete allein: " + field.getAllRent().get(0) + " EUR", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("- mit 1 Haus: " + field.getAllRent().get(1) + " EUR", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("- mit 2 Häusern: " + field.getAllRent().get(2) + " EUR", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("- mit 3 Häusern: " + field.getAllRent().get(3) + " EUR", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("- mit 4 Häusern: " + field.getAllRent().get(4) + " EUR", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("- mit 1 Hotel: " + field.getAllRent().get(5) + " EUR", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("1 Haus kostet: " + field.getHousePrice() + " EUR", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("Hypothek: " + field.getHypo() + " EUR", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));
 | 
			
		||||
 | 
			
		||||
        // Beenden-Button
 | 
			
		||||
        Button quitButton = buildingPropertyContainer.addChild(new Button("Beenden", new ElementId("button")));
 | 
			
		||||
        // Add buttons
 | 
			
		||||
        addButtons(container);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Adds the buttons for closing or buying the property.
 | 
			
		||||
     *
 | 
			
		||||
     * @param container the main container
 | 
			
		||||
     */
 | 
			
		||||
    private void addButtons(Container container) {
 | 
			
		||||
        // Quit button
 | 
			
		||||
        Button quitButton = container.addChild(new Button("Beenden", new ElementId("button")));
 | 
			
		||||
        quitButton.setFontSize(32);
 | 
			
		||||
        quitButton.addClickCommands(s -> ifTopDialog( () -> {
 | 
			
		||||
        quitButton.addClickCommands(s -> ifTopDialog(() -> {
 | 
			
		||||
            app.getGameLogic().playSound(Sound.BUTTON);
 | 
			
		||||
            close();
 | 
			
		||||
        }));
 | 
			
		||||
        // Kaufen-Button
 | 
			
		||||
        Button buyButton = buildingPropertyContainer.addChild(new Button("Kaufen", new ElementId("button")));
 | 
			
		||||
 | 
			
		||||
        // Buy button
 | 
			
		||||
        Button buyButton = container.addChild(new Button("Kaufen", new ElementId("button")));
 | 
			
		||||
        buyButton.setFontSize(32);
 | 
			
		||||
        buyButton.addClickCommands(s -> ifTopDialog( () -> {
 | 
			
		||||
        buyButton.addClickCommands(s -> ifTopDialog(() -> {
 | 
			
		||||
            app.getGameLogic().playSound(Sound.BUTTON);
 | 
			
		||||
            close();
 | 
			
		||||
            app.getGameLogic().send(new BuyPropertyResponse());
 | 
			
		||||
        }));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        // Zentriere das Popup
 | 
			
		||||
    /**
 | 
			
		||||
     * Centers the containers on the screen.
 | 
			
		||||
     *
 | 
			
		||||
     * @param padding the padding size
 | 
			
		||||
     */
 | 
			
		||||
    private void centerContainers(float padding) {
 | 
			
		||||
        // Center main container
 | 
			
		||||
        buildingPropertyContainer.setLocalTranslation(
 | 
			
		||||
            (app.getCamera().getWidth() - buildingPropertyContainer.getPreferredSize().x) / 2,
 | 
			
		||||
            (app.getCamera().getHeight() + buildingPropertyContainer.getPreferredSize().y) / 2,
 | 
			
		||||
            8
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        // Zentriere das Popup
 | 
			
		||||
        // Center background container with padding
 | 
			
		||||
        backgroundContainer.setLocalTranslation(
 | 
			
		||||
                (app.getCamera().getWidth() - buildingPropertyContainer.getPreferredSize().x - padding) / 2,
 | 
			
		||||
                (app.getCamera().getHeight() + buildingPropertyContainer.getPreferredSize().y+ padding) / 2,
 | 
			
		||||
                7
 | 
			
		||||
            (app.getCamera().getWidth() - buildingPropertyContainer.getPreferredSize().x - padding) / 2,
 | 
			
		||||
            (app.getCamera().getHeight() + buildingPropertyContainer.getPreferredSize().y + padding) / 2,
 | 
			
		||||
            7
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Attaches the popup to the GUI through the DialogManager.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void show() {
 | 
			
		||||
        app.getGuiNode().attachChild(backgroundContainer);
 | 
			
		||||
        app.getGuiNode().attachChild(buildingPropertyContainer);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Closes the popup and removes the associated GUI elements.
 | 
			
		||||
     * Closes the popup and removes associated GUI elements.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void close() {
 | 
			
		||||
        app.getGuiNode().detachChild(buildingPropertyContainer);  // Entferne das Menü
 | 
			
		||||
        app.getGuiNode().detachChild(backgroundContainer); //Entfernt Rand
 | 
			
		||||
        app.getGuiNode().detachChild(buildingPropertyContainer);
 | 
			
		||||
        app.getGuiNode().detachChild(backgroundContainer);
 | 
			
		||||
        super.close();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -124,4 +154,4 @@ public class BuildingPropertyCard extends Dialog {
 | 
			
		||||
    public void escape() {
 | 
			
		||||
        new SettingsMenu(app).open();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,7 @@ import com.simsilica.lemur.Label;
 | 
			
		||||
import com.simsilica.lemur.component.QuadBackgroundComponent;
 | 
			
		||||
import com.simsilica.lemur.style.ElementId;
 | 
			
		||||
import pp.dialog.Dialog;
 | 
			
		||||
import pp.dialog.PopupDialog;
 | 
			
		||||
import pp.monopoly.client.MonopolyApp;
 | 
			
		||||
import pp.monopoly.client.gui.SettingsMenu;
 | 
			
		||||
import pp.monopoly.client.gui.TradeMenu;
 | 
			
		||||
@@ -18,18 +19,18 @@ import pp.monopoly.notification.Sound;
 | 
			
		||||
/**
 | 
			
		||||
 * ConfirmTrade is a popup which appears when a trade is proposed to this certain player.
 | 
			
		||||
 */
 | 
			
		||||
public class ConfirmTrade extends Dialog {
 | 
			
		||||
public class ConfirmTrade extends Dialog implements PopupDialog {
 | 
			
		||||
    /** Reference to the Monopoly application instance. */
 | 
			
		||||
    private final MonopolyApp app;
 | 
			
		||||
 | 
			
		||||
    /** Main container for the "Confirm Trade" popup UI. */
 | 
			
		||||
    private final Container confirmTradeContainer;
 | 
			
		||||
    private Container confirmTradeContainer;
 | 
			
		||||
 | 
			
		||||
    /** Background container providing a border for the popup. */
 | 
			
		||||
    private final Container backgroundContainer;
 | 
			
		||||
    private Container backgroundContainer;
 | 
			
		||||
 | 
			
		||||
    /** The trade handler managing the details of the trade proposal. */
 | 
			
		||||
    private TradeHandler tradeHandler;
 | 
			
		||||
    private final TradeHandler tradeHandler;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructs the "Confirm Trade" popup.
 | 
			
		||||
@@ -39,53 +40,61 @@ public class ConfirmTrade extends Dialog {
 | 
			
		||||
    public ConfirmTrade(MonopolyApp app) {
 | 
			
		||||
        super(app.getDialogManager());
 | 
			
		||||
        this.app = app;
 | 
			
		||||
        tradeHandler = app.getGameLogic().getTradeHandler();
 | 
			
		||||
        this.tradeHandler = app.getGameLogic().getTradeHandler();
 | 
			
		||||
 | 
			
		||||
        // Create the background container
 | 
			
		||||
        // Initialize components
 | 
			
		||||
        createBackgroundContainer();
 | 
			
		||||
        createConfirmTradeContainer();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Initializes the background container.
 | 
			
		||||
     */
 | 
			
		||||
    private void createBackgroundContainer() {
 | 
			
		||||
        backgroundContainer = new Container();
 | 
			
		||||
        backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f)));
 | 
			
		||||
        attachChild(backgroundContainer);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Initializes the main confirm trade container and its UI components.
 | 
			
		||||
     */
 | 
			
		||||
    private void createConfirmTradeContainer() {
 | 
			
		||||
        confirmTradeContainer = new Container();
 | 
			
		||||
 | 
			
		||||
        float padding = 10;
 | 
			
		||||
        backgroundContainer.setPreferredSize(confirmTradeContainer.getPreferredSize().addLocal(padding, padding, 0));
 | 
			
		||||
        
 | 
			
		||||
        // Titel
 | 
			
		||||
        Label title = confirmTradeContainer.addChild(new Label( "Handel", new ElementId("warning-title")));
 | 
			
		||||
        // Title
 | 
			
		||||
        Label title = confirmTradeContainer.addChild(new Label("Handel", new ElementId("warning-title")));
 | 
			
		||||
        title.setFontSize(48);
 | 
			
		||||
        title.setColor(ColorRGBA.Black);
 | 
			
		||||
 | 
			
		||||
        // Build trade information strings
 | 
			
		||||
        StringBuilder offeredProperties = new StringBuilder();
 | 
			
		||||
        for (PropertyField field : tradeHandler.getOfferedProperties()) {
 | 
			
		||||
            offeredProperties.append(field.getName());
 | 
			
		||||
            offeredProperties.append(", ");
 | 
			
		||||
            offeredProperties.append(field.getName()).append(", ");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        StringBuilder requestedProperties = new StringBuilder();
 | 
			
		||||
        for (PropertyField field : tradeHandler.getRequestedProperties()) {
 | 
			
		||||
            requestedProperties.append(field.getName());
 | 
			
		||||
            requestedProperties.append(", ");
 | 
			
		||||
            requestedProperties.append(field.getName()).append(", ");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Text, der auf der Karte steht
 | 
			
		||||
        // Trade details
 | 
			
		||||
        Container propertyValuesContainer = confirmTradeContainer.addChild(new Container());
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("„Spieler " + " " + tradeHandler.getSender().getName() + " " +" möchte:", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("", new ElementId("label-Text")));// Leerzeile
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("„Spieler " + tradeHandler.getSender().getName() + " möchte:", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("- " + offeredProperties, new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("- " + tradeHandler.getOfferedAmount() + " EUR", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("- " + tradeHandler.getOfferedJailCards() +" Sonderkarten", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("", new ElementId("label-Text")));// Leerzeile
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("- " + tradeHandler.getOfferedJailCards() + " Sonderkarten", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("gegen:", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("", new ElementId("label-Text")));// Leerzeile
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("- "+ requestedProperties, new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("- "+ tradeHandler.getRequestedAmount() +" EUR", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("- "+ tradeHandler.getRequestedJailCards() +" Sonderkarten", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("", new ElementId("label-Text")));// Leerzeile
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("- " + requestedProperties, new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("- " + tradeHandler.getRequestedAmount() + " EUR", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("- " + tradeHandler.getRequestedJailCards() + " Sonderkarten", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("tauschen, willst du das Angebot annehmen?", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));
 | 
			
		||||
 | 
			
		||||
        // Ablehnen-Button
 | 
			
		||||
        // Decline button
 | 
			
		||||
        Button declineButton = confirmTradeContainer.addChild(new Button("Ablehnen", new ElementId("button")));
 | 
			
		||||
        declineButton.setFontSize(32);
 | 
			
		||||
        declineButton.addClickCommands(s -> ifTopDialog(() -> {
 | 
			
		||||
@@ -93,39 +102,50 @@ public class ConfirmTrade extends Dialog {
 | 
			
		||||
            app.getGameLogic().send(new TradeResponse(false, tradeHandler));
 | 
			
		||||
            close();
 | 
			
		||||
        }));
 | 
			
		||||
        // Verhandeln-Button
 | 
			
		||||
 | 
			
		||||
        // Negotiate button
 | 
			
		||||
        Button negotiateButton = confirmTradeContainer.addChild(new Button("Verhandeln", new ElementId("button")));
 | 
			
		||||
        negotiateButton.setFontSize(32);
 | 
			
		||||
        negotiateButton.addClickCommands(s -> ifTopDialog( () -> {
 | 
			
		||||
        negotiateButton.addClickCommands(s -> ifTopDialog(() -> {
 | 
			
		||||
            app.getGameLogic().playSound(Sound.BUTTON);
 | 
			
		||||
            close();
 | 
			
		||||
            TradeHandler t = new TradeHandler(app.getGameLogic().getPlayerHandler().getPlayerById(tradeHandler.getSender().getId()));
 | 
			
		||||
            t.setReceiver(app.getGameLogic().getPlayerHandler().getPlayerById(tradeHandler.getReceiver().getId()));
 | 
			
		||||
            new TradeMenu(app, t).open();
 | 
			
		||||
        }));
 | 
			
		||||
        // Confirm-Button
 | 
			
		||||
 | 
			
		||||
        // Confirm button
 | 
			
		||||
        Button confirmButton = confirmTradeContainer.addChild(new Button("Bestätigen", new ElementId("button")));
 | 
			
		||||
        confirmButton.setFontSize(32);
 | 
			
		||||
        confirmButton.addClickCommands(s -> ifTopDialog( () -> {
 | 
			
		||||
        confirmButton.addClickCommands(s -> ifTopDialog(() -> {
 | 
			
		||||
            app.getGameLogic().playSound(Sound.BUTTON);
 | 
			
		||||
            app.getGameLogic().send(new TradeResponse(true, tradeHandler));
 | 
			
		||||
            close();
 | 
			
		||||
        }));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        // Zentriere das Menü
 | 
			
		||||
    /**
 | 
			
		||||
     * Displays the popup by attaching it to the GUI.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void show() {
 | 
			
		||||
        float padding = 10;
 | 
			
		||||
 | 
			
		||||
        // Center and adjust sizes
 | 
			
		||||
        backgroundContainer.setPreferredSize(confirmTradeContainer.getPreferredSize().addLocal(padding, padding, 0));
 | 
			
		||||
        confirmTradeContainer.setLocalTranslation(
 | 
			
		||||
            (app.getCamera().getWidth() - confirmTradeContainer.getPreferredSize().x) / 2,
 | 
			
		||||
            (app.getCamera().getHeight() + confirmTradeContainer.getPreferredSize().y) / 2,
 | 
			
		||||
            8
 | 
			
		||||
                (app.getCamera().getWidth() - confirmTradeContainer.getPreferredSize().x) / 2,
 | 
			
		||||
                (app.getCamera().getHeight() + confirmTradeContainer.getPreferredSize().y) / 2,
 | 
			
		||||
                8
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        // Zentriere das Menü
 | 
			
		||||
        backgroundContainer.setLocalTranslation(
 | 
			
		||||
                (app.getCamera().getWidth() - confirmTradeContainer.getPreferredSize().x - padding) / 2,
 | 
			
		||||
                (app.getCamera().getHeight() + confirmTradeContainer.getPreferredSize().y+ padding) / 2,
 | 
			
		||||
                (app.getCamera().getHeight() + confirmTradeContainer.getPreferredSize().y + padding) / 2,
 | 
			
		||||
                7
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        // Attach to GUI node
 | 
			
		||||
        app.getGuiNode().attachChild(backgroundContainer);
 | 
			
		||||
        app.getGuiNode().attachChild(confirmTradeContainer);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -12,25 +12,25 @@ import com.simsilica.lemur.Label;
 | 
			
		||||
import com.simsilica.lemur.component.QuadBackgroundComponent;
 | 
			
		||||
import com.simsilica.lemur.style.ElementId;
 | 
			
		||||
import pp.dialog.Dialog;
 | 
			
		||||
import pp.dialog.PopupDialog;
 | 
			
		||||
import pp.monopoly.client.MonopolyApp;
 | 
			
		||||
import pp.monopoly.notification.Sound;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * EventCardPopup is a popup which appears when a certain EventCard is triggered by entering a EventCardField
 | 
			
		||||
 * EventCardPopup is a popup which appears when a certain EventCard is triggered by entering an EventCardField.
 | 
			
		||||
 */
 | 
			
		||||
public class EventCardPopup extends Dialog {
 | 
			
		||||
public class EventCardPopup extends Dialog implements PopupDialog {
 | 
			
		||||
    /** Reference to the Monopoly application instance. */
 | 
			
		||||
    private final MonopolyApp app;
 | 
			
		||||
 | 
			
		||||
    /** Semi-transparent overlay background for the popup. */
 | 
			
		||||
    private final Geometry overlayBackground;
 | 
			
		||||
    private Geometry overlayBackground;
 | 
			
		||||
 | 
			
		||||
    /** Main container for the event card information. */
 | 
			
		||||
    private final Container eventCardContainer;
 | 
			
		||||
    private Container eventCardContainer;
 | 
			
		||||
 | 
			
		||||
    /** Background container providing a border for the popup. */
 | 
			
		||||
    private final Container backgroundContainer;
 | 
			
		||||
 | 
			
		||||
    private Container backgroundContainer;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructs the EventCardPopup to display the details of a triggered event card.
 | 
			
		||||
@@ -42,74 +42,87 @@ public class EventCardPopup extends Dialog {
 | 
			
		||||
        super(app.getDialogManager());
 | 
			
		||||
        this.app = app;
 | 
			
		||||
 | 
			
		||||
        // Halbtransparentes Overlay hinzufügen
 | 
			
		||||
        overlayBackground = createOverlayBackground();
 | 
			
		||||
        app.getGuiNode().attachChild(overlayBackground);
 | 
			
		||||
 | 
			
		||||
        // Create the background container
 | 
			
		||||
        backgroundContainer = new Container();
 | 
			
		||||
        backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Darker background
 | 
			
		||||
        app.getGuiNode().attachChild(backgroundContainer);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        eventCardContainer = new Container();
 | 
			
		||||
        eventCardContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f)));
 | 
			
		||||
        eventCardContainer.setPreferredSize(new Vector3f(550,400,10));
 | 
			
		||||
 | 
			
		||||
        float padding = 10;
 | 
			
		||||
        backgroundContainer.setPreferredSize(eventCardContainer.getPreferredSize().addLocal(padding, padding, 0));
 | 
			
		||||
 | 
			
		||||
        // Titel
 | 
			
		||||
        Label gateFieldTitle = eventCardContainer.addChild(new Label("Ereigniskarte", new ElementId("settings-title")));
 | 
			
		||||
        gateFieldTitle.setFontSize(48);
 | 
			
		||||
        gateFieldTitle.setColor(ColorRGBA.Black);
 | 
			
		||||
 | 
			
		||||
        // Text, der auf der Karte steht
 | 
			
		||||
        // Die Erklärungsfelder werden automatisch den descriptions der Message entnommen
 | 
			
		||||
        Container propertyValuesContainer = eventCardContainer.addChild(new Container());
 | 
			
		||||
        propertyValuesContainer.addChild(new Label(description, new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));
 | 
			
		||||
        propertyValuesContainer.setPreferredSize(new Vector3f(300,200,0));
 | 
			
		||||
 | 
			
		||||
        // Beenden-Button
 | 
			
		||||
        Button quitButton = eventCardContainer.addChild(new Button("Jawohl", new ElementId("button")));
 | 
			
		||||
        quitButton.setFontSize(32);
 | 
			
		||||
        quitButton.addClickCommands(source -> ifTopDialog( () -> {
 | 
			
		||||
            app.getGameLogic().playSound(Sound.BUTTON);
 | 
			
		||||
            close();
 | 
			
		||||
        }));
 | 
			
		||||
 | 
			
		||||
        // Zentriere das Popup
 | 
			
		||||
        eventCardContainer.setLocalTranslation(
 | 
			
		||||
            (app.getCamera().getWidth() - eventCardContainer.getPreferredSize().x) / 2,
 | 
			
		||||
            (app.getCamera().getHeight() + eventCardContainer.getPreferredSize().y) / 2,
 | 
			
		||||
            8
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        // Zentriere das Popup
 | 
			
		||||
        backgroundContainer.setLocalTranslation(
 | 
			
		||||
                (app.getCamera().getWidth() - eventCardContainer.getPreferredSize().x - padding) / 2,
 | 
			
		||||
                (app.getCamera().getHeight() + eventCardContainer.getPreferredSize().y+ padding) / 2,
 | 
			
		||||
                7
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        app.getGuiNode().attachChild(eventCardContainer);
 | 
			
		||||
        // Initialize the UI components
 | 
			
		||||
        createOverlayBackground();
 | 
			
		||||
        createBackgroundContainer();
 | 
			
		||||
        createEventCardContainer(description);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a semi-transparent background overlay for the popup.
 | 
			
		||||
     *
 | 
			
		||||
     * @return the geometry of the overlay
 | 
			
		||||
     * Initializes the semi-transparent background overlay.
 | 
			
		||||
     */
 | 
			
		||||
    private Geometry createOverlayBackground() {
 | 
			
		||||
    private void createOverlayBackground() {
 | 
			
		||||
        Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight());
 | 
			
		||||
        Geometry overlay = new Geometry("Overlay", quad);
 | 
			
		||||
        overlayBackground = new Geometry("Overlay", quad);
 | 
			
		||||
        Material material = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
 | 
			
		||||
        material.setColor("Color", new ColorRGBA(0, 0, 0, 0.5f));
 | 
			
		||||
        material.setColor("Color", new ColorRGBA(0, 0, 0, 0.5f)); // Semi-transparent black
 | 
			
		||||
        material.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
 | 
			
		||||
        overlay.setMaterial(material);
 | 
			
		||||
        overlay.setLocalTranslation(0, 0, 0);
 | 
			
		||||
        return overlay;
 | 
			
		||||
        overlayBackground.setMaterial(material);
 | 
			
		||||
        overlayBackground.setLocalTranslation(0, 0, 0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Initializes the background container.
 | 
			
		||||
     */
 | 
			
		||||
    private void createBackgroundContainer() {
 | 
			
		||||
        backgroundContainer = new Container();
 | 
			
		||||
        backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Light gray background
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Initializes the main event card container and its UI components.
 | 
			
		||||
     *
 | 
			
		||||
     * @param description the description of the triggered event card
 | 
			
		||||
     */
 | 
			
		||||
    private void createEventCardContainer(String description) {
 | 
			
		||||
        eventCardContainer = new Container();
 | 
			
		||||
        eventCardContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f)));
 | 
			
		||||
        eventCardContainer.setPreferredSize(new Vector3f(550, 400, 10));
 | 
			
		||||
 | 
			
		||||
        // Title
 | 
			
		||||
        Label title = eventCardContainer.addChild(new Label("Ereigniskarte", new ElementId("settings-title")));
 | 
			
		||||
        title.setFontSize(48);
 | 
			
		||||
        title.setColor(ColorRGBA.Black);
 | 
			
		||||
 | 
			
		||||
        // Event description
 | 
			
		||||
        Container textContainer = eventCardContainer.addChild(new Container());
 | 
			
		||||
        textContainer.addChild(new Label(description, new ElementId("label-Text")));
 | 
			
		||||
        textContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));
 | 
			
		||||
        textContainer.setPreferredSize(new Vector3f(300, 200, 0));
 | 
			
		||||
 | 
			
		||||
        // Confirm button
 | 
			
		||||
        Button confirmButton = eventCardContainer.addChild(new Button("Jawohl", new ElementId("button")));
 | 
			
		||||
        confirmButton.setFontSize(32);
 | 
			
		||||
        confirmButton.addClickCommands(source -> ifTopDialog(() -> {
 | 
			
		||||
            app.getGameLogic().playSound(Sound.BUTTON);
 | 
			
		||||
            close();
 | 
			
		||||
        }));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Displays the popup by attaching it to the GUI.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void show() {
 | 
			
		||||
        float padding = 10;
 | 
			
		||||
 | 
			
		||||
        // Adjust sizes and center elements
 | 
			
		||||
        backgroundContainer.setPreferredSize(eventCardContainer.getPreferredSize().addLocal(padding, padding, 0));
 | 
			
		||||
        eventCardContainer.setLocalTranslation(
 | 
			
		||||
                (app.getCamera().getWidth() - eventCardContainer.getPreferredSize().x) / 2,
 | 
			
		||||
                (app.getCamera().getHeight() + eventCardContainer.getPreferredSize().y) / 2,
 | 
			
		||||
                8
 | 
			
		||||
        );
 | 
			
		||||
        backgroundContainer.setLocalTranslation(
 | 
			
		||||
                (app.getCamera().getWidth() - eventCardContainer.getPreferredSize().x - padding) / 2,
 | 
			
		||||
                (app.getCamera().getHeight() + eventCardContainer.getPreferredSize().y + padding) / 2,
 | 
			
		||||
                7
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        // Attach components to the GUI
 | 
			
		||||
        app.getGuiNode().attachChild(overlayBackground);
 | 
			
		||||
        app.getGuiNode().attachChild(backgroundContainer);
 | 
			
		||||
        app.getGuiNode().attachChild(eventCardContainer);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -117,9 +130,9 @@ public class EventCardPopup extends Dialog {
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void close() {
 | 
			
		||||
        app.getGuiNode().detachChild(overlayBackground);
 | 
			
		||||
        app.getGuiNode().detachChild(eventCardContainer);
 | 
			
		||||
        app.getGuiNode().detachChild(backgroundContainer);
 | 
			
		||||
        app.getGuiNode().detachChild(overlayBackground);
 | 
			
		||||
        super.close();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -130,4 +143,4 @@ public class EventCardPopup extends Dialog {
 | 
			
		||||
    public void escape() {
 | 
			
		||||
        close();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -12,27 +12,27 @@ import com.simsilica.lemur.component.QuadBackgroundComponent;
 | 
			
		||||
import com.simsilica.lemur.style.ElementId;
 | 
			
		||||
 | 
			
		||||
import pp.dialog.Dialog;
 | 
			
		||||
import pp.dialog.PopupDialog;
 | 
			
		||||
import pp.monopoly.client.MonopolyApp;
 | 
			
		||||
import pp.monopoly.client.gui.SettingsMenu;
 | 
			
		||||
import pp.monopoly.message.client.BuyPropertyResponse;
 | 
			
		||||
import pp.monopoly.model.fields.FoodField;
 | 
			
		||||
import pp.monopoly.notification.Sound;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * FoodFieldCard creates the popup for field information
 | 
			
		||||
 * FoodFieldCard creates the popup for field information.
 | 
			
		||||
 */
 | 
			
		||||
public class FoodFieldCard extends Dialog {
 | 
			
		||||
public class FoodFieldCard extends Dialog implements PopupDialog {
 | 
			
		||||
    /** Reference to the Monopoly application instance. */
 | 
			
		||||
    private final MonopolyApp app;
 | 
			
		||||
 | 
			
		||||
    /** Semi-transparent overlay background for the popup. */
 | 
			
		||||
    private final Geometry overlayBackground;
 | 
			
		||||
    private Geometry overlayBackground;
 | 
			
		||||
 | 
			
		||||
    /** Main container for the food field information. */
 | 
			
		||||
    private final Container foodFieldContainer;
 | 
			
		||||
    private Container foodFieldContainer;
 | 
			
		||||
 | 
			
		||||
    /** Background container providing a border for the popup. */
 | 
			
		||||
    private final Container backgroundContainer;
 | 
			
		||||
    private Container backgroundContainer;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructs a FoodFieldCard popup displaying details about a food field.
 | 
			
		||||
@@ -43,89 +43,103 @@ public class FoodFieldCard extends Dialog {
 | 
			
		||||
        super(app.getDialogManager());
 | 
			
		||||
        this.app = app;
 | 
			
		||||
 | 
			
		||||
        // Retrieve field information
 | 
			
		||||
        int index = app.getGameLogic().getPlayerHandler().getPlayerById(app.getId()).getFieldID();
 | 
			
		||||
        FoodField field = (FoodField) app.getGameLogic().getBoardManager().getFieldAtIndex(index);
 | 
			
		||||
 | 
			
		||||
        overlayBackground = createOverlayBackground();
 | 
			
		||||
        app.getGuiNode().attachChild(overlayBackground);
 | 
			
		||||
        // Create UI elements
 | 
			
		||||
        createOverlayBackground();
 | 
			
		||||
        createBackgroundContainer();
 | 
			
		||||
        createFoodFieldContainer(field);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Initializes the semi-transparent background overlay.
 | 
			
		||||
     */
 | 
			
		||||
    private void createOverlayBackground() {
 | 
			
		||||
        Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight());
 | 
			
		||||
        overlayBackground = new Geometry("Overlay", quad);
 | 
			
		||||
        Material material = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
 | 
			
		||||
        material.setColor("Color", new ColorRGBA(0, 0, 0, 0.5f)); // Semi-transparent
 | 
			
		||||
        material.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
 | 
			
		||||
        overlayBackground.setMaterial(material);
 | 
			
		||||
        overlayBackground.setLocalTranslation(0, 0, 0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Initializes the background container.
 | 
			
		||||
     */
 | 
			
		||||
    private void createBackgroundContainer() {
 | 
			
		||||
        backgroundContainer = new Container();
 | 
			
		||||
        backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Darker background
 | 
			
		||||
        attachChild(backgroundContainer);
 | 
			
		||||
        backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Light gray background
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Initializes the main food field container and its UI components.
 | 
			
		||||
     *
 | 
			
		||||
     * @param field the food field information to display
 | 
			
		||||
     */
 | 
			
		||||
    private void createFoodFieldContainer(FoodField field) {
 | 
			
		||||
        foodFieldContainer = new Container();
 | 
			
		||||
        foodFieldContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.1f, 0.1f, 0.1f, 0.9f)));
 | 
			
		||||
 | 
			
		||||
        float padding = 10;
 | 
			
		||||
        backgroundContainer.setPreferredSize(foodFieldContainer.getPreferredSize().addLocal(padding, padding, 0));
 | 
			
		||||
 | 
			
		||||
        Label settingsTitle = foodFieldContainer.addChild(new Label(field.getName(), new ElementId("label-Bold")));
 | 
			
		||||
        settingsTitle.setFontSize(48);
 | 
			
		||||
        settingsTitle.setColor(ColorRGBA.White);
 | 
			
		||||
        // Title
 | 
			
		||||
        Label title = foodFieldContainer.addChild(new Label(field.getName(), new ElementId("label-Bold")));
 | 
			
		||||
        title.setFontSize(48);
 | 
			
		||||
        title.setColor(ColorRGBA.White);
 | 
			
		||||
 | 
			
		||||
        // Field details
 | 
			
		||||
        Container propertyValuesContainer = foodFieldContainer.addChild(new Container());
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("„Preis: " + field.getPrice() + " EUR", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))); // Leerzeile
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("„Wenn man Besitzer des", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label(field.getName()+" ist, so ist die", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("Miete 40-mal so hoch, wie", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("Augen auf den zwei Würfeln sind.", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))); // Leerzeile
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("„Wenn man Besitzer beider", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("Restaurants ist, so ist die", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("Miete 100-mal so hoch, wie", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("Augen auf den zwei Würfeln sind.", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))); // Leerzeile
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))); // Empty line
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("„Miete: 40x Würfel-Augen, wenn Besitzer eines Restaurants.", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("„Miete: 100x Würfel-Augen, wenn Besitzer beider Restaurants.", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))); // Empty line
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("„Hypothek: " + field.getHypo() + " EUR", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));
 | 
			
		||||
 | 
			
		||||
        // Beenden-Button
 | 
			
		||||
        // Quit button
 | 
			
		||||
        Button quitButton = foodFieldContainer.addChild(new Button("Beenden", new ElementId("button")));
 | 
			
		||||
        quitButton.setFontSize(32);
 | 
			
		||||
        quitButton.addClickCommands(s -> ifTopDialog( () -> {
 | 
			
		||||
        quitButton.addClickCommands(s -> ifTopDialog(() -> {
 | 
			
		||||
            app.getGameLogic().playSound(Sound.BUTTON);
 | 
			
		||||
            close();
 | 
			
		||||
        }));
 | 
			
		||||
        // Kaufen-Button
 | 
			
		||||
 | 
			
		||||
        // Buy button
 | 
			
		||||
        Button buyButton = foodFieldContainer.addChild(new Button("Kaufen", new ElementId("button")));
 | 
			
		||||
        buyButton.setFontSize(32);
 | 
			
		||||
        buyButton.addClickCommands(s -> ifTopDialog( () -> {
 | 
			
		||||
        buyButton.addClickCommands(s -> ifTopDialog(() -> {
 | 
			
		||||
            app.getGameLogic().playSound(Sound.BUTTON);
 | 
			
		||||
            app.getGameLogic().send(new BuyPropertyResponse());
 | 
			
		||||
            close();
 | 
			
		||||
        }));
 | 
			
		||||
 | 
			
		||||
        // Zentriere das Popup
 | 
			
		||||
        foodFieldContainer.setLocalTranslation(
 | 
			
		||||
            (app.getCamera().getWidth() - foodFieldContainer.getPreferredSize().x) / 2,
 | 
			
		||||
            (app.getCamera().getHeight() + foodFieldContainer.getPreferredSize().y) / 2,
 | 
			
		||||
            8
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        // Zentriere das Popup
 | 
			
		||||
        backgroundContainer.setLocalTranslation(
 | 
			
		||||
                (app.getCamera().getWidth() - foodFieldContainer.getPreferredSize().x - padding) / 2,
 | 
			
		||||
                (app.getCamera().getHeight() + foodFieldContainer.getPreferredSize().y+ padding) / 2,
 | 
			
		||||
                7
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        app.getGuiNode().attachChild(foodFieldContainer);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a semi-transparent background overlay for the popup.
 | 
			
		||||
     *
 | 
			
		||||
     * @return the geometry of the overlay
 | 
			
		||||
     * Displays the popup by attaching its elements to the GUI.
 | 
			
		||||
     */
 | 
			
		||||
    private Geometry createOverlayBackground() {
 | 
			
		||||
        Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight());
 | 
			
		||||
        Geometry overlay = new Geometry("Overlay", quad);
 | 
			
		||||
        Material material = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
 | 
			
		||||
        material.setColor("Color", new ColorRGBA(0, 0, 0, 0.5f)); // Halbtransparent
 | 
			
		||||
        material.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
 | 
			
		||||
        overlay.setMaterial(material);
 | 
			
		||||
        overlay.setLocalTranslation(0, 0, 0);
 | 
			
		||||
        return overlay;
 | 
			
		||||
    @Override
 | 
			
		||||
    public void show() {
 | 
			
		||||
        float padding = 10;
 | 
			
		||||
 | 
			
		||||
        // Adjust sizes and center elements
 | 
			
		||||
        backgroundContainer.setPreferredSize(foodFieldContainer.getPreferredSize().addLocal(padding, padding, 0));
 | 
			
		||||
        foodFieldContainer.setLocalTranslation(
 | 
			
		||||
                (app.getCamera().getWidth() - foodFieldContainer.getPreferredSize().x) / 2,
 | 
			
		||||
                (app.getCamera().getHeight() + foodFieldContainer.getPreferredSize().y) / 2,
 | 
			
		||||
                8
 | 
			
		||||
        );
 | 
			
		||||
        backgroundContainer.setLocalTranslation(
 | 
			
		||||
                (app.getCamera().getWidth() - foodFieldContainer.getPreferredSize().x - padding) / 2,
 | 
			
		||||
                (app.getCamera().getHeight() + foodFieldContainer.getPreferredSize().y + padding) / 2,
 | 
			
		||||
                7
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        // Attach components to the GUI
 | 
			
		||||
        app.getGuiNode().attachChild(overlayBackground);
 | 
			
		||||
        app.getGuiNode().attachChild(backgroundContainer);
 | 
			
		||||
        app.getGuiNode().attachChild(foodFieldContainer);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -133,18 +147,17 @@ public class FoodFieldCard extends Dialog {
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void close() {
 | 
			
		||||
        app.getGuiNode().detachChild(foodFieldContainer);  // Entferne das Menü
 | 
			
		||||
        app.getGuiNode().detachChild(backgroundContainer); //Entfernt Rand
 | 
			
		||||
        app.getGuiNode().detachChild(overlayBackground);  // Entferne das Overlay
 | 
			
		||||
        app.getGuiNode().detachChild(overlayBackground);
 | 
			
		||||
        app.getGuiNode().detachChild(foodFieldContainer);
 | 
			
		||||
        app.getGuiNode().detachChild(backgroundContainer);
 | 
			
		||||
        super.close();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Opens the settings menu when the escape key is pressed.
 | 
			
		||||
     * Handles the escape key action by closing the popup.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void escape() {
 | 
			
		||||
        new SettingsMenu(app).open();
 | 
			
		||||
        close();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,9 @@ import com.simsilica.lemur.Container;
 | 
			
		||||
import com.simsilica.lemur.Label;
 | 
			
		||||
import com.simsilica.lemur.component.QuadBackgroundComponent;
 | 
			
		||||
import com.simsilica.lemur.style.ElementId;
 | 
			
		||||
 | 
			
		||||
import pp.dialog.Dialog;
 | 
			
		||||
import pp.dialog.PopupDialog;
 | 
			
		||||
import pp.monopoly.client.MonopolyApp;
 | 
			
		||||
import pp.monopoly.client.gui.SettingsMenu;
 | 
			
		||||
import pp.monopoly.message.client.BuyPropertyResponse;
 | 
			
		||||
@@ -14,17 +16,17 @@ import pp.monopoly.model.fields.GateField;
 | 
			
		||||
import pp.monopoly.notification.Sound;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * GateFieldCard creates the popup for field information
 | 
			
		||||
 * GateFieldCard creates the popup for field information.
 | 
			
		||||
 */
 | 
			
		||||
public class GateFieldCard extends Dialog {
 | 
			
		||||
public class GateFieldCard extends Dialog implements PopupDialog {
 | 
			
		||||
    /** Reference to the Monopoly application instance. */
 | 
			
		||||
    private final MonopolyApp app;
 | 
			
		||||
 | 
			
		||||
    /** Main container for the gate field information. */
 | 
			
		||||
    private final Container gateFieldContainer;
 | 
			
		||||
    private Container gateFieldContainer;
 | 
			
		||||
 | 
			
		||||
    /** Background container providing a border for the popup. */
 | 
			
		||||
    private final Container backgroundContainer;
 | 
			
		||||
    private Container backgroundContainer;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructs a GateFieldCard popup displaying details about a gate field.
 | 
			
		||||
@@ -35,73 +37,89 @@ public class GateFieldCard extends Dialog {
 | 
			
		||||
        super(app.getDialogManager());
 | 
			
		||||
        this.app = app;
 | 
			
		||||
 | 
			
		||||
        //Generate the corresponfing field
 | 
			
		||||
        // Generate the corresponding field
 | 
			
		||||
        int index = app.getGameLogic().getPlayerHandler().getPlayerById(app.getId()).getFieldID();
 | 
			
		||||
        GateField field = (GateField) app.getGameLogic().getBoardManager().getFieldAtIndex(index);
 | 
			
		||||
 | 
			
		||||
        // Create the background container
 | 
			
		||||
        backgroundContainer = new Container();
 | 
			
		||||
        backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Darker background
 | 
			
		||||
        attachChild(backgroundContainer);
 | 
			
		||||
        // Initialize UI elements
 | 
			
		||||
        createBackgroundContainer();
 | 
			
		||||
        createGateFieldContainer(field);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        // Hauptcontainer für die Gebäudekarte
 | 
			
		||||
    /**
 | 
			
		||||
     * Initializes the background container.
 | 
			
		||||
     */
 | 
			
		||||
    private void createBackgroundContainer() {
 | 
			
		||||
        backgroundContainer = new Container();
 | 
			
		||||
        backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Light gray background
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Initializes the main gate field container and its UI components.
 | 
			
		||||
     *
 | 
			
		||||
     * @param field the gate field information to display
 | 
			
		||||
     */
 | 
			
		||||
    private void createGateFieldContainer(GateField field) {
 | 
			
		||||
        gateFieldContainer = new Container();
 | 
			
		||||
        gateFieldContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f)));
 | 
			
		||||
 | 
			
		||||
        float padding = 10; // Passt den backgroundContainer an die Größe des gateFieldContainers an
 | 
			
		||||
        backgroundContainer.setPreferredSize(gateFieldContainer.getPreferredSize().addLocal(padding, padding, 0));
 | 
			
		||||
 | 
			
		||||
        // Titel, bestehend aus dynamischen Namen anhand der ID und der Schriftfarbe/größe
 | 
			
		||||
        // Title
 | 
			
		||||
        Label gateFieldTitle = gateFieldContainer.addChild(new Label(field.getName(), new ElementId("label-Bold")));
 | 
			
		||||
        gateFieldTitle.setFontSize(48);
 | 
			
		||||
        gateFieldTitle.setColor(ColorRGBA.Black);
 | 
			
		||||
 | 
			
		||||
        // Text, der auf der Karte steht
 | 
			
		||||
        // Die Preise werden dynamisch dem BoardManager entnommen
 | 
			
		||||
        // Field details
 | 
			
		||||
        Container propertyValuesContainer = gateFieldContainer.addChild(new Container());
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("„Preis: " + field.getPrice() + " EUR", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))); // Empty line
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("Miete: 250 EUR", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("Wenn man", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("2 Bahnhof besitzt: 500 EUR", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("Wenn man", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("3 Bahnhof besitzt: 1000 EUR", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("Wenn man", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("4 Bahnhof besitzt: 2000 EUR", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("Wenn man 2 Bahnhöfe besitzt: 500 EUR", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("Wenn man 3 Bahnhöfe besitzt: 1000 EUR", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("Wenn man 4 Bahnhöfe besitzt: 2000 EUR", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))); // Empty line
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("„Hypothek: " + field.getHypo() + " EUR", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));
 | 
			
		||||
 | 
			
		||||
        // Beenden-Button
 | 
			
		||||
        // Quit button
 | 
			
		||||
        Button quitButton = gateFieldContainer.addChild(new Button("Beenden", new ElementId("button")));
 | 
			
		||||
        quitButton.setFontSize(32);
 | 
			
		||||
        quitButton.addClickCommands(s -> ifTopDialog( () -> {
 | 
			
		||||
        quitButton.addClickCommands(s -> ifTopDialog(() -> {
 | 
			
		||||
            app.getGameLogic().playSound(Sound.BUTTON);
 | 
			
		||||
            close();
 | 
			
		||||
        }));
 | 
			
		||||
        // Kaufen-Button
 | 
			
		||||
 | 
			
		||||
        // Buy button
 | 
			
		||||
        Button buyButton = gateFieldContainer.addChild(new Button("Kaufen", new ElementId("button")));
 | 
			
		||||
        buyButton.setFontSize(32);
 | 
			
		||||
        buyButton.addClickCommands(s -> ifTopDialog( () -> {
 | 
			
		||||
        buyButton.addClickCommands(s -> ifTopDialog(() -> {
 | 
			
		||||
            app.getGameLogic().playSound(Sound.BUTTON);
 | 
			
		||||
            app.getGameLogic().send(new BuyPropertyResponse());
 | 
			
		||||
            close();
 | 
			
		||||
        }));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        // Zentriere das Popup
 | 
			
		||||
    /**
 | 
			
		||||
     * Displays the popup by attaching its elements to the GUI.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void show() {
 | 
			
		||||
        float padding = 10;
 | 
			
		||||
 | 
			
		||||
        // Adjust sizes and center elements
 | 
			
		||||
        backgroundContainer.setPreferredSize(gateFieldContainer.getPreferredSize().addLocal(padding, padding, 0));
 | 
			
		||||
        gateFieldContainer.setLocalTranslation(
 | 
			
		||||
                (app.getCamera().getWidth() - gateFieldContainer.getPreferredSize().x) / 2,
 | 
			
		||||
                (app.getCamera().getHeight() + gateFieldContainer.getPreferredSize().y) / 2,
 | 
			
		||||
                8
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        // Zentriere das Popup
 | 
			
		||||
        backgroundContainer.setLocalTranslation(
 | 
			
		||||
                (app.getCamera().getWidth() - gateFieldContainer.getPreferredSize().x - padding) / 2,
 | 
			
		||||
                (app.getCamera().getHeight() + gateFieldContainer.getPreferredSize().y+ padding) / 2,
 | 
			
		||||
                (app.getCamera().getHeight() + gateFieldContainer.getPreferredSize().y + padding) / 2,
 | 
			
		||||
                7
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        // Attach components to the GUI
 | 
			
		||||
        app.getGuiNode().attachChild(backgroundContainer);
 | 
			
		||||
        app.getGuiNode().attachChild(gateFieldContainer);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -110,8 +128,8 @@ public class GateFieldCard extends Dialog {
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void close() {
 | 
			
		||||
        app.getGuiNode().detachChild(gateFieldContainer);  // Entferne das Menü
 | 
			
		||||
        app.getGuiNode().detachChild(backgroundContainer); //Entfernt Rand
 | 
			
		||||
        app.getGuiNode().detachChild(gateFieldContainer); // Remove main container
 | 
			
		||||
        app.getGuiNode().detachChild(backgroundContainer); // Remove background container
 | 
			
		||||
        super.close();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -11,7 +11,9 @@ import com.simsilica.lemur.Container;
 | 
			
		||||
import com.simsilica.lemur.Label;
 | 
			
		||||
import com.simsilica.lemur.component.QuadBackgroundComponent;
 | 
			
		||||
import com.simsilica.lemur.style.ElementId;
 | 
			
		||||
 | 
			
		||||
import pp.dialog.Dialog;
 | 
			
		||||
import pp.dialog.PopupDialog;
 | 
			
		||||
import pp.monopoly.client.MonopolyApp;
 | 
			
		||||
import pp.monopoly.notification.Sound;
 | 
			
		||||
 | 
			
		||||
@@ -21,21 +23,21 @@ import pp.monopoly.notification.Sound;
 | 
			
		||||
 * This popup informs the player that they are being sent to the Gulag and includes a confirmation button.
 | 
			
		||||
 * </p>
 | 
			
		||||
 */
 | 
			
		||||
public class Gulag extends Dialog {
 | 
			
		||||
public class Gulag extends Dialog implements PopupDialog {
 | 
			
		||||
    /** Reference to the Monopoly application instance. */
 | 
			
		||||
    private final MonopolyApp app;
 | 
			
		||||
 | 
			
		||||
    /** Semi-transparent overlay background for the popup. */
 | 
			
		||||
    private final Geometry overlayBackground;
 | 
			
		||||
    private Geometry overlayBackground;
 | 
			
		||||
 | 
			
		||||
    /** Main container for the Gulag warning message. */
 | 
			
		||||
    private final Container gulagContainer;
 | 
			
		||||
    private Container gulagContainer;
 | 
			
		||||
 | 
			
		||||
    /** Background container providing a border for the popup. */
 | 
			
		||||
    private final Container backgroundContainer;
 | 
			
		||||
    private Container backgroundContainer;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructs the Gulag popup, displaying a warning when a player lands on the "Wache" field.
 | 
			
		||||
     * Constructs the Gulag popup.
 | 
			
		||||
     *
 | 
			
		||||
     * @param app the Monopoly application instance
 | 
			
		||||
     */
 | 
			
		||||
@@ -43,90 +45,97 @@ public class Gulag extends Dialog {
 | 
			
		||||
        super(app.getDialogManager());
 | 
			
		||||
        this.app = app;
 | 
			
		||||
 | 
			
		||||
        // Initialize UI elements
 | 
			
		||||
        createOverlayBackground();
 | 
			
		||||
        createBackgroundContainer();
 | 
			
		||||
        createGulagContainer();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        // Halbtransparentes Overlay hinzufügen
 | 
			
		||||
        overlayBackground = createOverlayBackground();
 | 
			
		||||
        app.getGuiNode().attachChild(overlayBackground);
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates the semi-transparent overlay background for the popup.
 | 
			
		||||
     */
 | 
			
		||||
    private void createOverlayBackground() {
 | 
			
		||||
        Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight());
 | 
			
		||||
        overlayBackground = new Geometry("Overlay", quad);
 | 
			
		||||
        Material material = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
 | 
			
		||||
        material.setColor("Color", new ColorRGBA(0, 0, 0, 0.5f)); // Semi-transparent black
 | 
			
		||||
        material.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
 | 
			
		||||
        overlayBackground.setMaterial(material);
 | 
			
		||||
        overlayBackground.setLocalTranslation(0, 0, 0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        // Create the background container
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates the background container providing a border for the popup.
 | 
			
		||||
     */
 | 
			
		||||
    private void createBackgroundContainer() {
 | 
			
		||||
        backgroundContainer = new Container();
 | 
			
		||||
        backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Darker background
 | 
			
		||||
        app.getGuiNode().attachChild(backgroundContainer);
 | 
			
		||||
        backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Light gray background
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        // Hauptcontainer für die Warnung
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates the main container for the Gulag warning message.
 | 
			
		||||
     */
 | 
			
		||||
    private void createGulagContainer() {
 | 
			
		||||
        gulagContainer = new Container();
 | 
			
		||||
        gulagContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f)));
 | 
			
		||||
        gulagContainer.setPreferredSize(new Vector3f(550,250,10));
 | 
			
		||||
        gulagContainer.setPreferredSize(new Vector3f(550, 250, 10));
 | 
			
		||||
 | 
			
		||||
        float padding = 10; // Passt den backgroundContainer an die Größe des bankruptContainers an
 | 
			
		||||
        backgroundContainer.setPreferredSize(gulagContainer.getPreferredSize().addLocal(padding, padding, 0));
 | 
			
		||||
        // Title
 | 
			
		||||
        Label title = gulagContainer.addChild(new Label("Du kommst ins Gulag!", new ElementId("warning-title")));
 | 
			
		||||
        title.setFontSize(48);
 | 
			
		||||
        title.setColor(ColorRGBA.Black);
 | 
			
		||||
 | 
			
		||||
        // Titel
 | 
			
		||||
        Label gateFieldTitle = gulagContainer.addChild(new Label("Du kommst ins Gulag!", new ElementId("warning-title")));
 | 
			
		||||
        gateFieldTitle.setFontSize(48);
 | 
			
		||||
        gateFieldTitle.setColor(ColorRGBA.Black);
 | 
			
		||||
 | 
			
		||||
        // Beenden-Button
 | 
			
		||||
        Button quitButton = gulagContainer.addChild(new Button("Jawohl Gulag", new ElementId("button")));
 | 
			
		||||
        quitButton.setFontSize(32);
 | 
			
		||||
        quitButton.addClickCommands(source -> ifTopDialog(() -> {
 | 
			
		||||
        // Confirmation Button
 | 
			
		||||
        Button confirmButton = gulagContainer.addChild(new Button("Jawohl Gulag", new ElementId("button")));
 | 
			
		||||
        confirmButton.setFontSize(32);
 | 
			
		||||
        confirmButton.addClickCommands(source -> ifTopDialog(() -> {
 | 
			
		||||
            app.getGameLogic().playSound(Sound.BUTTON);
 | 
			
		||||
            close();
 | 
			
		||||
        }));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Displays the popup by attaching its elements to the GUI.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void show() {
 | 
			
		||||
        float padding = 10;
 | 
			
		||||
 | 
			
		||||
        // Zentriere das Popup
 | 
			
		||||
        // Adjust and position the containers
 | 
			
		||||
        backgroundContainer.setPreferredSize(gulagContainer.getPreferredSize().addLocal(padding, padding, 0));
 | 
			
		||||
        gulagContainer.setLocalTranslation(
 | 
			
		||||
            (app.getCamera().getWidth() - gulagContainer.getPreferredSize().x) / 2,
 | 
			
		||||
            (app.getCamera().getHeight() + gulagContainer.getPreferredSize().y) / 2,
 | 
			
		||||
            8
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        // Zentriere das Popup
 | 
			
		||||
        backgroundContainer.setLocalTranslation(
 | 
			
		||||
                (app.getCamera().getWidth() - gulagContainer.getPreferredSize().x - padding) / 2,
 | 
			
		||||
                (app.getCamera().getHeight() + gulagContainer.getPreferredSize().y+ padding) / 2,
 | 
			
		||||
                7
 | 
			
		||||
            (app.getCamera().getWidth() - gulagContainer.getPreferredSize().x - padding) / 2,
 | 
			
		||||
            (app.getCamera().getHeight() + gulagContainer.getPreferredSize().y + padding) / 2,
 | 
			
		||||
            7
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        // Attach components to the GUI
 | 
			
		||||
        app.getGuiNode().attachChild(overlayBackground);
 | 
			
		||||
        app.getGuiNode().attachChild(backgroundContainer);
 | 
			
		||||
        app.getGuiNode().attachChild(gulagContainer);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a semi-transparent overlay background for the popup.
 | 
			
		||||
     *
 | 
			
		||||
     * @return the geometry of the overlay
 | 
			
		||||
     */
 | 
			
		||||
    private Geometry createOverlayBackground() {
 | 
			
		||||
        Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight());
 | 
			
		||||
        Geometry overlay = new Geometry("Overlay", quad);
 | 
			
		||||
        Material material = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
 | 
			
		||||
        material.setColor("Color", new ColorRGBA(0, 0, 0, 0.5f)); // Halbtransparent
 | 
			
		||||
        material.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
 | 
			
		||||
        overlay.setMaterial(material);
 | 
			
		||||
        overlay.setLocalTranslation(0, 0, 0);
 | 
			
		||||
        return overlay;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Closes the popup and removes its associated GUI elements.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void close() {
 | 
			
		||||
        app.getGuiNode().detachChild(gulagContainer);  // Entferne das Menü
 | 
			
		||||
        app.getGuiNode().detachChild(backgroundContainer); //Entfernt Rand
 | 
			
		||||
        app.getGuiNode().detachChild(overlayBackground);  // Entferne das Overlay
 | 
			
		||||
        app.getGuiNode().detachChild(overlayBackground);
 | 
			
		||||
        app.getGuiNode().detachChild(gulagContainer);
 | 
			
		||||
        app.getGuiNode().detachChild(backgroundContainer);
 | 
			
		||||
        super.close();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Handles the escape action to close the popup.
 | 
			
		||||
     * Handles the escape action by closing the popup.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void escape() {
 | 
			
		||||
        close();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -7,112 +7,138 @@ import com.simsilica.lemur.Label;
 | 
			
		||||
import com.simsilica.lemur.component.QuadBackgroundComponent;
 | 
			
		||||
import com.simsilica.lemur.style.ElementId;
 | 
			
		||||
import pp.dialog.Dialog;
 | 
			
		||||
import pp.dialog.PopupDialog;
 | 
			
		||||
import pp.monopoly.client.MonopolyApp;
 | 
			
		||||
import pp.monopoly.client.gui.SettingsMenu;
 | 
			
		||||
import pp.monopoly.message.client.NotificationAnswer;
 | 
			
		||||
import pp.monopoly.notification.Sound;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * GulagInfo is a popup that provides options for a player who is stuck in the "Gulag" (jail) field.
 | 
			
		||||
 * <p>
 | 
			
		||||
 * This dialog offers multiple actions, including paying a bribe, using a "Get Out of Jail" card, or waiting.
 | 
			
		||||
 * </p>
 | 
			
		||||
 */
 | 
			
		||||
public class GulagInfo extends Dialog {
 | 
			
		||||
public class GulagInfo extends Dialog implements PopupDialog {
 | 
			
		||||
    /** Reference to the Monopoly application instance. */
 | 
			
		||||
    private final MonopolyApp app;
 | 
			
		||||
 | 
			
		||||
    /** Main container for the Gulag information dialog. */
 | 
			
		||||
    private final Container gulagInfoContainer;
 | 
			
		||||
    private Container gulagInfoContainer;
 | 
			
		||||
 | 
			
		||||
    /** Background container providing a styled border around the dialog. */
 | 
			
		||||
    private final Container backgroundContainer;
 | 
			
		||||
    private Container backgroundContainer;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructs a GulagInfo popup that provides the player with options for getting out of the "Gulag" field.
 | 
			
		||||
     *
 | 
			
		||||
     * @param app the Monopoly application instance
 | 
			
		||||
     * @param app  the Monopoly application instance
 | 
			
		||||
     * @param trys the number of failed attempts to roll doubles for release
 | 
			
		||||
     */
 | 
			
		||||
    public GulagInfo(MonopolyApp app, int trys) {
 | 
			
		||||
        super(app.getDialogManager());
 | 
			
		||||
        this.app = app;
 | 
			
		||||
 | 
			
		||||
        // Create the background container
 | 
			
		||||
        // Initialize UI components
 | 
			
		||||
        createBackgroundContainer();
 | 
			
		||||
        createGulagInfoContainer(trys);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates the background container providing a border for the dialog.
 | 
			
		||||
     */
 | 
			
		||||
    private void createBackgroundContainer() {
 | 
			
		||||
        backgroundContainer = new Container();
 | 
			
		||||
        backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Darker background
 | 
			
		||||
        attachChild(backgroundContainer);
 | 
			
		||||
        backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Light gray background
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        // Hauptcontainer für das Bestätigungspopup
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates the main container for the Gulag information dialog.
 | 
			
		||||
     *
 | 
			
		||||
     * @param trys the number of failed attempts to roll doubles for release
 | 
			
		||||
     */
 | 
			
		||||
    private void createGulagInfoContainer(int trys) {
 | 
			
		||||
        gulagInfoContainer = new Container();
 | 
			
		||||
        gulagInfoContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f)));
 | 
			
		||||
 | 
			
		||||
        float padding = 10; // Passt den backgroundContainer an die Größe des confirmTradeContainer an
 | 
			
		||||
        backgroundContainer.setPreferredSize(gulagInfoContainer.getPreferredSize().addLocal(padding, padding, 0));
 | 
			
		||||
        
 | 
			
		||||
        // Titel
 | 
			
		||||
        Label title = gulagInfoContainer.addChild(new Label( "Gulag", new ElementId("warning-title")));
 | 
			
		||||
        // Title
 | 
			
		||||
        Label title = gulagInfoContainer.addChild(new Label("Gulag", new ElementId("warning-title")));
 | 
			
		||||
        title.setFontSize(48);
 | 
			
		||||
        title.setColor(ColorRGBA.Black);
 | 
			
		||||
 | 
			
		||||
        // Text, der auf der Karte steht
 | 
			
		||||
        // Die Werte werden dem Handel entnommen (Iwas auch immer da dann ist)
 | 
			
		||||
        Container propertyValuesContainer = gulagInfoContainer.addChild(new Container());
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("„Du sitzt im Gefänginis und kommst nicht raus ...", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("Es sei denn, du ...", new ElementId("label-Text")));// Leerzeile
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("- bestichst die Wache mit 500 EUR", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("- löst eine Gulag-Frei-Karte ein", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("- wartest 3 Runden und bezahlst dann", new ElementId("label-Text")));// Leerzeile
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("- oder du würfelst einen Pasch", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));
 | 
			
		||||
        // Text Description
 | 
			
		||||
        Container textContainer = gulagInfoContainer.addChild(new Container());
 | 
			
		||||
        textContainer.addChild(new Label("„Du sitzt im Gefängnis und kommst nicht raus ...", new ElementId("label-Text")));
 | 
			
		||||
        textContainer.addChild(new Label("Es sei denn, du ...", new ElementId("label-Text")));
 | 
			
		||||
        textContainer.addChild(new Label("- bestichst die Wache mit 500 EUR", new ElementId("label-Text")));
 | 
			
		||||
        textContainer.addChild(new Label("- löst eine Gulag-Frei-Karte ein", new ElementId("label-Text")));
 | 
			
		||||
        textContainer.addChild(new Label("- wartest 3 Runden und bezahlst dann", new ElementId("label-Text")));
 | 
			
		||||
        textContainer.addChild(new Label("- oder du würfelst einen Pasch", new ElementId("label-Text")));
 | 
			
		||||
        textContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));
 | 
			
		||||
 | 
			
		||||
        // Action Buttons
 | 
			
		||||
        addActionButtons(trys);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        // Bezahlen-Button
 | 
			
		||||
    /**
 | 
			
		||||
     * Adds action buttons to the dialog.
 | 
			
		||||
     *
 | 
			
		||||
     * @param trys the number of failed attempts to roll doubles for release
 | 
			
		||||
     */
 | 
			
		||||
    private void addActionButtons(int trys) {
 | 
			
		||||
        // Bribe Button
 | 
			
		||||
        Button payButton = gulagInfoContainer.addChild(new Button("Bestechungsgeld bezahlen", new ElementId("button")));
 | 
			
		||||
        payButton.setFontSize(32);
 | 
			
		||||
        payButton.addClickCommands(s -> ifTopDialog( () -> {
 | 
			
		||||
        payButton.addClickCommands(s -> ifTopDialog(() -> {
 | 
			
		||||
            app.getGameLogic().playSound(Sound.BUTTON);
 | 
			
		||||
            app.getGameLogic().send(new NotificationAnswer("PayJail"));
 | 
			
		||||
            close();
 | 
			
		||||
        }));
 | 
			
		||||
        // Ereigniskarte-Button
 | 
			
		||||
 | 
			
		||||
        // Use Jail-Free Card Button
 | 
			
		||||
        Button eventCardButton = gulagInfoContainer.addChild(new Button("Ereigniskarte nutzen", new ElementId("button")));
 | 
			
		||||
        eventCardButton.setFontSize(32);
 | 
			
		||||
        eventCardButton.addClickCommands(s -> ifTopDialog( () -> {
 | 
			
		||||
        eventCardButton.addClickCommands(s -> ifTopDialog(() -> {
 | 
			
		||||
            app.getGameLogic().playSound(Sound.BUTTON);
 | 
			
		||||
            app.getGameLogic().send(new NotificationAnswer("UseJailCard"));
 | 
			
		||||
            close();
 | 
			
		||||
        }));
 | 
			
		||||
        // Schließen-Button
 | 
			
		||||
 | 
			
		||||
        // Close Button
 | 
			
		||||
        Button closeButton = gulagInfoContainer.addChild(new Button("Schließen", new ElementId("button")));
 | 
			
		||||
        closeButton.setFontSize(32);
 | 
			
		||||
        closeButton.addClickCommands(s -> ifTopDialog(() -> {
 | 
			
		||||
            app.getGameLogic().playSound(Sound.BUTTON);
 | 
			
		||||
            close();
 | 
			
		||||
        }));
 | 
			
		||||
        closeButton.addClickCommands(s -> ifTopDialog(this::close));
 | 
			
		||||
 | 
			
		||||
        // Zentriere das Menü
 | 
			
		||||
        // Disable options based on conditions
 | 
			
		||||
        if (app.getGameLogic().getPlayerHandler().getPlayerById(app.getId()).getNumJailCard() == 0) {
 | 
			
		||||
            eventCardButton.setEnabled(false);
 | 
			
		||||
        }
 | 
			
		||||
        if (trys == 3) {
 | 
			
		||||
            closeButton.setEnabled(false);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Displays the popup by attaching its elements to the GUI.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void show() {
 | 
			
		||||
        float padding = 10;
 | 
			
		||||
 | 
			
		||||
        // Adjust the background size
 | 
			
		||||
        backgroundContainer.setPreferredSize(gulagInfoContainer.getPreferredSize().addLocal(padding, padding, 0));
 | 
			
		||||
 | 
			
		||||
        // Center the dialog and background
 | 
			
		||||
        gulagInfoContainer.setLocalTranslation(
 | 
			
		||||
            (app.getCamera().getWidth() - gulagInfoContainer.getPreferredSize().x) / 2,
 | 
			
		||||
            (app.getCamera().getHeight() + gulagInfoContainer.getPreferredSize().y) / 2,
 | 
			
		||||
            8
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        // Zentriere das Menü
 | 
			
		||||
        backgroundContainer.setLocalTranslation(
 | 
			
		||||
                (app.getCamera().getWidth() - gulagInfoContainer.getPreferredSize().x - padding) / 2,
 | 
			
		||||
                (app.getCamera().getHeight() + gulagInfoContainer.getPreferredSize().y+ padding) / 2,
 | 
			
		||||
                7
 | 
			
		||||
            (app.getCamera().getWidth() - gulagInfoContainer.getPreferredSize().x - padding) / 2,
 | 
			
		||||
            (app.getCamera().getHeight() + gulagInfoContainer.getPreferredSize().y + padding) / 2,
 | 
			
		||||
            7
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        if(app.getGameLogic().getPlayerHandler().getPlayerById(app.getId()).getNumJailCard() == 0) {
 | 
			
		||||
            eventCardButton.setEnabled(false);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if(trys == 3) {
 | 
			
		||||
            closeButton.setEnabled(false);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Attach containers to the GUI
 | 
			
		||||
        app.getGuiNode().attachChild(backgroundContainer);
 | 
			
		||||
        app.getGuiNode().attachChild(gulagInfoContainer);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -121,16 +147,8 @@ public class GulagInfo extends Dialog {
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void close() {
 | 
			
		||||
        app.getGuiNode().detachChild(gulagInfoContainer);  // Entferne das Menü
 | 
			
		||||
        app.getGuiNode().detachChild(backgroundContainer); //Entfernt Rand
 | 
			
		||||
        app.getGuiNode().detachChild(gulagInfoContainer); // Remove dialog
 | 
			
		||||
        app.getGuiNode().detachChild(backgroundContainer); // Remove background
 | 
			
		||||
        super.close();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Handles the escape action to close the GulagInfo dialog.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void escape() {
 | 
			
		||||
        new SettingsMenu(app).open();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -12,19 +12,14 @@ import com.simsilica.lemur.Label;
 | 
			
		||||
import com.simsilica.lemur.component.QuadBackgroundComponent;
 | 
			
		||||
import com.simsilica.lemur.style.ElementId;
 | 
			
		||||
import pp.dialog.Dialog;
 | 
			
		||||
import pp.dialog.PopupDialog;
 | 
			
		||||
import pp.monopoly.client.MonopolyApp;
 | 
			
		||||
import pp.monopoly.notification.Sound;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * NoMoneyWarning is a warning popup that appears when a player tries to perform
 | 
			
		||||
 * an action they cannot afford due to insufficient funds, such as attempting
 | 
			
		||||
 * to purchase a property or building.
 | 
			
		||||
 * <p>
 | 
			
		||||
 * This dialog notifies the player of their lack of funds and provides a single
 | 
			
		||||
 * confirmation button to close the dialog.
 | 
			
		||||
 * </p>
 | 
			
		||||
 * NoMoneyWarning is a warning popup that informs the player they lack sufficient funds to proceed with an action.
 | 
			
		||||
 */
 | 
			
		||||
public class NoMoneyWarning extends Dialog {
 | 
			
		||||
public class NoMoneyWarning extends Dialog implements PopupDialog {
 | 
			
		||||
    /** Reference to the Monopoly application instance. */
 | 
			
		||||
    private final MonopolyApp app;
 | 
			
		||||
 | 
			
		||||
@@ -46,66 +41,15 @@ public class NoMoneyWarning extends Dialog {
 | 
			
		||||
        super(app.getDialogManager());
 | 
			
		||||
        this.app = app;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        // Halbtransparentes Overlay hinzufügen
 | 
			
		||||
        overlayBackground = createOverlayBackground();
 | 
			
		||||
        app.getGuiNode().attachChild(overlayBackground);
 | 
			
		||||
        backgroundContainer = createBackgroundContainer();
 | 
			
		||||
        noMoneyWarningContainer = createNoMoneyWarningContainer();
 | 
			
		||||
 | 
			
		||||
        // Create the background container
 | 
			
		||||
        backgroundContainer = new Container();
 | 
			
		||||
        backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Darker background
 | 
			
		||||
        app.getGuiNode().attachChild(backgroundContainer);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        // Hauptcontainer für die Warnung
 | 
			
		||||
        noMoneyWarningContainer = new Container();
 | 
			
		||||
        noMoneyWarningContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f)));
 | 
			
		||||
        noMoneyWarningContainer.setPreferredSize(new Vector3f(550,250,10));
 | 
			
		||||
 | 
			
		||||
        float padding = 10; // Passt den backgroundContainer an die Größe des bankruptContainers an
 | 
			
		||||
        backgroundContainer.setPreferredSize(noMoneyWarningContainer.getPreferredSize().addLocal(padding, padding, 0));
 | 
			
		||||
 | 
			
		||||
        // Titel
 | 
			
		||||
        Label gateFieldTitle = noMoneyWarningContainer.addChild(new Label("Na, schon wieder Pleite?", new ElementId("warning-title")));
 | 
			
		||||
        gateFieldTitle.setFontSize(38);
 | 
			
		||||
        gateFieldTitle.setColor(ColorRGBA.Black);
 | 
			
		||||
 | 
			
		||||
        // Text, der im Popup steht
 | 
			
		||||
        Container textContainer = noMoneyWarningContainer.addChild(new Container());
 | 
			
		||||
        textContainer.addChild(new Label("Du hast nicht genug Geld, um dieses Gebäude zu kaufen", new ElementId("label-Text")));
 | 
			
		||||
        textContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));
 | 
			
		||||
 | 
			
		||||
        // Passt den textContainer an die Größe des bankruptContainers an
 | 
			
		||||
        textContainer.setPreferredSize(noMoneyWarningContainer.getPreferredSize().addLocal(-250,-200,0));
 | 
			
		||||
 | 
			
		||||
        // Bestätigen-Button
 | 
			
		||||
        Button quitButton = noMoneyWarningContainer.addChild(new Button("Bestätigen", new ElementId("button")));
 | 
			
		||||
        quitButton.setFontSize(32);
 | 
			
		||||
        quitButton.addClickCommands(source -> ifTopDialog(() -> {
 | 
			
		||||
            app.getGameLogic().playSound(Sound.BUTTON);
 | 
			
		||||
            close();
 | 
			
		||||
        }));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        // Zentriere das Popup
 | 
			
		||||
        noMoneyWarningContainer.setLocalTranslation(
 | 
			
		||||
            (app.getCamera().getWidth() - noMoneyWarningContainer.getPreferredSize().x) / 2,
 | 
			
		||||
            (app.getCamera().getHeight() + noMoneyWarningContainer.getPreferredSize().y) / 2,
 | 
			
		||||
            8
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        // Zentriere das Popup
 | 
			
		||||
        backgroundContainer.setLocalTranslation(
 | 
			
		||||
                (app.getCamera().getWidth() - noMoneyWarningContainer.getPreferredSize().x - padding) / 2,
 | 
			
		||||
                (app.getCamera().getHeight() + noMoneyWarningContainer.getPreferredSize().y+ padding) / 2,
 | 
			
		||||
                7
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        app.getGuiNode().attachChild(noMoneyWarningContainer);
 | 
			
		||||
        adjustPaddingAndCenter();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a semi-transparent overlay background for the dialog.
 | 
			
		||||
     * Creates the semi-transparent overlay background.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The geometry representing the overlay background.
 | 
			
		||||
     */
 | 
			
		||||
@@ -113,7 +57,7 @@ public class NoMoneyWarning extends Dialog {
 | 
			
		||||
        Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight());
 | 
			
		||||
        Geometry overlay = new Geometry("Overlay", quad);
 | 
			
		||||
        Material material = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
 | 
			
		||||
        material.setColor("Color", new ColorRGBA(0, 0, 0, 0.5f)); // Halbtransparent
 | 
			
		||||
        material.setColor("Color", new ColorRGBA(0, 0, 0, 0.5f)); // Semi-transparent black
 | 
			
		||||
        material.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
 | 
			
		||||
        overlay.setMaterial(material);
 | 
			
		||||
        overlay.setLocalTranslation(0, 0, 0);
 | 
			
		||||
@@ -121,13 +65,86 @@ public class NoMoneyWarning extends Dialog {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Closes the menu and removes the GUI elements.
 | 
			
		||||
     * Creates the background container for the dialog.
 | 
			
		||||
     *
 | 
			
		||||
     * @return A styled container for the dialog background.
 | 
			
		||||
     */
 | 
			
		||||
    private Container createBackgroundContainer() {
 | 
			
		||||
        Container container = new Container();
 | 
			
		||||
        container.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Light gray
 | 
			
		||||
        return container;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates the main container for the NoMoneyWarning dialog UI.
 | 
			
		||||
     *
 | 
			
		||||
     * @return The container for the dialog content.
 | 
			
		||||
     */
 | 
			
		||||
    private Container createNoMoneyWarningContainer() {
 | 
			
		||||
        Container container = new Container();
 | 
			
		||||
        container.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f)));
 | 
			
		||||
        container.setPreferredSize(new Vector3f(550, 250, 10));
 | 
			
		||||
 | 
			
		||||
        // Title
 | 
			
		||||
        Label title = container.addChild(new Label("Na, schon wieder Pleite?", new ElementId("warning-title")));
 | 
			
		||||
        title.setFontSize(38);
 | 
			
		||||
        title.setColor(ColorRGBA.Black);
 | 
			
		||||
 | 
			
		||||
        // Warning message
 | 
			
		||||
        Container textContainer = container.addChild(new Container());
 | 
			
		||||
        textContainer.addChild(new Label("Du hast nicht genug Geld, um dieses Gebäude zu kaufen", new ElementId("label-Text")));
 | 
			
		||||
        textContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));
 | 
			
		||||
        textContainer.setPreferredSize(container.getPreferredSize().addLocal(-250, -200, 0));
 | 
			
		||||
 | 
			
		||||
        // Confirmation button
 | 
			
		||||
        Button confirmButton = container.addChild(new Button("Bestätigen", new ElementId("button")));
 | 
			
		||||
        confirmButton.setFontSize(32);
 | 
			
		||||
        confirmButton.addClickCommands(source -> ifTopDialog(() -> {
 | 
			
		||||
            app.getGameLogic().playSound(Sound.BUTTON);
 | 
			
		||||
            close();
 | 
			
		||||
        }));
 | 
			
		||||
 | 
			
		||||
        return container;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Adjusts the padding and centers the dialog on the screen.
 | 
			
		||||
     */
 | 
			
		||||
    private void adjustPaddingAndCenter() {
 | 
			
		||||
        float padding = 10;
 | 
			
		||||
        backgroundContainer.setPreferredSize(noMoneyWarningContainer.getPreferredSize().addLocal(padding, padding, 0));
 | 
			
		||||
 | 
			
		||||
        noMoneyWarningContainer.setLocalTranslation(
 | 
			
		||||
            (app.getCamera().getWidth() - noMoneyWarningContainer.getPreferredSize().x) / 2,
 | 
			
		||||
            (app.getCamera().getHeight() + noMoneyWarningContainer.getPreferredSize().y) / 2,
 | 
			
		||||
            8
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        backgroundContainer.setLocalTranslation(
 | 
			
		||||
            (app.getCamera().getWidth() - backgroundContainer.getPreferredSize().x) / 2,
 | 
			
		||||
            (app.getCamera().getHeight() + backgroundContainer.getPreferredSize().y) / 2,
 | 
			
		||||
            7
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Displays the dialog by attaching its components to the GUI node.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void show() {
 | 
			
		||||
        app.getGuiNode().attachChild(overlayBackground);
 | 
			
		||||
        app.getGuiNode().attachChild(backgroundContainer);
 | 
			
		||||
        app.getGuiNode().attachChild(noMoneyWarningContainer);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Closes the dialog and removes its components from the GUI node.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void close() {
 | 
			
		||||
        app.getGuiNode().detachChild(noMoneyWarningContainer);  // Entferne das Menü
 | 
			
		||||
        app.getGuiNode().detachChild(backgroundContainer); //Entfernt Rand
 | 
			
		||||
        app.getGuiNode().detachChild(overlayBackground);  // Entferne das Overlay
 | 
			
		||||
        app.getGuiNode().detachChild(overlayBackground);
 | 
			
		||||
        app.getGuiNode().detachChild(backgroundContainer);
 | 
			
		||||
        app.getGuiNode().detachChild(noMoneyWarningContainer);
 | 
			
		||||
        super.close();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -138,4 +155,4 @@ public class NoMoneyWarning extends Dialog {
 | 
			
		||||
    public void escape() {
 | 
			
		||||
        close();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -12,115 +12,95 @@ import com.simsilica.lemur.Label;
 | 
			
		||||
import com.simsilica.lemur.component.QuadBackgroundComponent;
 | 
			
		||||
import com.simsilica.lemur.style.ElementId;
 | 
			
		||||
import pp.dialog.Dialog;
 | 
			
		||||
import pp.dialog.PopupDialog;
 | 
			
		||||
import pp.monopoly.client.MonopolyApp;
 | 
			
		||||
import pp.monopoly.notification.Sound;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Rent is a popup that is triggered when a player lands on a property owned by another player
 | 
			
		||||
 * and needs to pay rent in the Monopoly application.
 | 
			
		||||
 * <p>
 | 
			
		||||
 * Displays the rent amount and the recipient player's name, with an option to confirm the payment.
 | 
			
		||||
 * </p>
 | 
			
		||||
 * ReceivedRent is a popup that informs a player about rent they have received.
 | 
			
		||||
 */
 | 
			
		||||
public class ReceivedRent extends Dialog {
 | 
			
		||||
public class ReceivedRent extends Dialog implements PopupDialog {
 | 
			
		||||
 | 
			
		||||
    /** Reference to the Monopoly application instance. */
 | 
			
		||||
    private final MonopolyApp app;
 | 
			
		||||
 | 
			
		||||
    /** Semi-transparent overlay background for the popup. */
 | 
			
		||||
    private final Geometry overlayBackground;
 | 
			
		||||
    private Geometry overlayBackground;
 | 
			
		||||
 | 
			
		||||
    /** Main container for the rent information and action. */
 | 
			
		||||
    private final Container rentContainer;
 | 
			
		||||
    private Container rentContainer;
 | 
			
		||||
 | 
			
		||||
    /** Background container providing a border for the rent popup. */
 | 
			
		||||
    private final Container backgroundContainer;
 | 
			
		||||
    private Container backgroundContainer;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructs the Rent popup displaying the rent amount and recipient player.
 | 
			
		||||
     * Constructs the ReceivedRent popup displaying the rent amount and payer.
 | 
			
		||||
     *
 | 
			
		||||
     * @param app        the Monopoly application instance
 | 
			
		||||
     * @param playerName the name of the player to whom the rent is owed
 | 
			
		||||
     * @param amount     the amount of rent to be paid
 | 
			
		||||
     * @param playerName the name of the player who paid the rent
 | 
			
		||||
     * @param amount     the amount of rent received
 | 
			
		||||
     */
 | 
			
		||||
    public ReceivedRent(MonopolyApp app, String playerName, int amount) {
 | 
			
		||||
        super(app.getDialogManager());
 | 
			
		||||
        this.app = app;
 | 
			
		||||
 | 
			
		||||
        // Create the overlay
 | 
			
		||||
        overlayBackground = createOverlayBackground();
 | 
			
		||||
        app.getGuiNode().attachChild(overlayBackground);
 | 
			
		||||
 | 
			
		||||
        // Create and position the background container
 | 
			
		||||
        backgroundContainer = createBackgroundContainer();
 | 
			
		||||
        app.getGuiNode().attachChild(backgroundContainer);
 | 
			
		||||
 | 
			
		||||
        // Create and position the rent container
 | 
			
		||||
        rentContainer = createRentContainer(playerName, amount);
 | 
			
		||||
        app.getGuiNode().attachChild(rentContainer);
 | 
			
		||||
 | 
			
		||||
        centerContainers();
 | 
			
		||||
        // Initialize GUI elements
 | 
			
		||||
        createOverlayBackground();
 | 
			
		||||
        createBackgroundContainer();
 | 
			
		||||
        createRentContainer(playerName, amount);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a semi-transparent overlay background.
 | 
			
		||||
     *
 | 
			
		||||
     * @return the overlay geometry
 | 
			
		||||
     */
 | 
			
		||||
    private Geometry createOverlayBackground() {
 | 
			
		||||
    private void createOverlayBackground() {
 | 
			
		||||
        Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight());
 | 
			
		||||
        Geometry overlay = new Geometry("Overlay", quad);
 | 
			
		||||
        overlayBackground = new Geometry("Overlay", quad);
 | 
			
		||||
        Material material = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
 | 
			
		||||
        material.setColor("Color", new ColorRGBA(0, 0, 0, 0.5f)); // Semi-transparent black
 | 
			
		||||
        material.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
 | 
			
		||||
        overlay.setMaterial(material);
 | 
			
		||||
        overlay.setLocalTranslation(0, 0, 0);
 | 
			
		||||
        return overlay;
 | 
			
		||||
        overlayBackground.setMaterial(material);
 | 
			
		||||
        overlayBackground.setLocalTranslation(0, 0, 0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates the background container with styling.
 | 
			
		||||
     *
 | 
			
		||||
     * @return the styled background container
 | 
			
		||||
     */
 | 
			
		||||
    private Container createBackgroundContainer() {
 | 
			
		||||
        Container container = new Container();
 | 
			
		||||
        container.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Light gray background
 | 
			
		||||
        return container;
 | 
			
		||||
    private void createBackgroundContainer() {
 | 
			
		||||
        backgroundContainer = new Container();
 | 
			
		||||
        backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Light gray background
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates the main rent container with title, text, and button.
 | 
			
		||||
     *
 | 
			
		||||
     * @param playerName the name of the player to whom the rent is owed
 | 
			
		||||
     * @param playerName the name of the player who paid the rent
 | 
			
		||||
     * @param amount     the rent amount
 | 
			
		||||
     * @return the rent container
 | 
			
		||||
     */
 | 
			
		||||
    private Container createRentContainer(String playerName, int amount) {
 | 
			
		||||
        Container container = new Container();
 | 
			
		||||
        container.setBackground(new QuadBackgroundComponent(ColorRGBA.Gray));
 | 
			
		||||
        container.setPreferredSize(new Vector3f(550, 250, 10));
 | 
			
		||||
    private void createRentContainer(String playerName, int amount) {
 | 
			
		||||
        rentContainer = new Container();
 | 
			
		||||
        rentContainer.setBackground(new QuadBackgroundComponent(ColorRGBA.Gray));
 | 
			
		||||
        rentContainer.setPreferredSize(new Vector3f(550, 250, 10));
 | 
			
		||||
 | 
			
		||||
        // Title
 | 
			
		||||
        Label title = container.addChild(new Label("Miete!", new ElementId("warning-title")));
 | 
			
		||||
        Label title = rentContainer.addChild(new Label("Miete!", new ElementId("warning-title")));
 | 
			
		||||
        title.setFontSize(48);
 | 
			
		||||
        title.setColor(ColorRGBA.Black);
 | 
			
		||||
 | 
			
		||||
        // Rent message
 | 
			
		||||
        Container textContainer = container.addChild(new Container());
 | 
			
		||||
        textContainer.addChild(new Label(playerName+ " zahlt dir " + amount + " EUR Miete",
 | 
			
		||||
        Container textContainer = rentContainer.addChild(new Container());
 | 
			
		||||
        textContainer.addChild(new Label(playerName + " zahlt dir " + amount + " EUR Miete",
 | 
			
		||||
                new ElementId("label-Text")));
 | 
			
		||||
        textContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));
 | 
			
		||||
        textContainer.setPreferredSize(container.getPreferredSize().addLocal(-250, -200, 0));
 | 
			
		||||
        textContainer.setPreferredSize(rentContainer.getPreferredSize().addLocal(-250, -200, 0));
 | 
			
		||||
 | 
			
		||||
        // Payment button
 | 
			
		||||
        Button payButton = container.addChild(new Button("Bestätigen", new ElementId("button")));
 | 
			
		||||
        payButton.setFontSize(32);
 | 
			
		||||
        payButton.addClickCommands(s -> ifTopDialog( () -> {
 | 
			
		||||
                app.getGameLogic().playSound(Sound.BUTTON);
 | 
			
		||||
                close();
 | 
			
		||||
        // Confirmation button
 | 
			
		||||
        Button confirmButton = rentContainer.addChild(new Button("Bestätigen", new ElementId("button")));
 | 
			
		||||
        confirmButton.setFontSize(32);
 | 
			
		||||
        confirmButton.addClickCommands(s -> ifTopDialog(() -> {
 | 
			
		||||
            app.getGameLogic().playSound(Sound.BUTTON);
 | 
			
		||||
            close();
 | 
			
		||||
        }));
 | 
			
		||||
 | 
			
		||||
        return container;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -145,14 +125,25 @@ public class ReceivedRent extends Dialog {
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Displays the popup by attaching it to the GUI through the DialogManager.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void show() {
 | 
			
		||||
        app.getGuiNode().attachChild(overlayBackground);
 | 
			
		||||
        app.getGuiNode().attachChild(backgroundContainer);
 | 
			
		||||
        app.getGuiNode().attachChild(rentContainer);
 | 
			
		||||
        centerContainers();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Closes the popup and removes GUI elements.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void close() {
 | 
			
		||||
        app.getGuiNode().detachChild(rentContainer);
 | 
			
		||||
        app.getGuiNode().detachChild(backgroundContainer);
 | 
			
		||||
        app.getGuiNode().detachChild(overlayBackground);
 | 
			
		||||
        app.getGuiNode().detachChild(backgroundContainer);
 | 
			
		||||
        app.getGuiNode().detachChild(rentContainer);
 | 
			
		||||
        super.close();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -12,19 +12,16 @@ import com.simsilica.lemur.Label;
 | 
			
		||||
import com.simsilica.lemur.component.QuadBackgroundComponent;
 | 
			
		||||
import com.simsilica.lemur.style.ElementId;
 | 
			
		||||
import pp.dialog.Dialog;
 | 
			
		||||
import pp.dialog.PopupDialog;
 | 
			
		||||
import pp.monopoly.client.MonopolyApp;
 | 
			
		||||
import pp.monopoly.message.server.TradeReply;
 | 
			
		||||
import pp.monopoly.notification.Sound;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * RejectTrade is a popup that appears when a trade proposal is rejected by another player
 | 
			
		||||
 * in the Monopoly application.
 | 
			
		||||
 * <p>
 | 
			
		||||
 * Displays a message indicating that the proposed trade has been declined, along with
 | 
			
		||||
 * details of the involved players and provides an option to close the popup.
 | 
			
		||||
 * </p>
 | 
			
		||||
 * RejectTrade is a popup that appears when a trade proposal is rejected by another player.
 | 
			
		||||
 * Displays a message indicating the rejection and provides an option to close the popup.
 | 
			
		||||
 */
 | 
			
		||||
public class RejectTrade extends Dialog {
 | 
			
		||||
public class RejectTrade extends Dialog implements PopupDialog {
 | 
			
		||||
    /** Reference to the Monopoly application instance. */
 | 
			
		||||
    private final MonopolyApp app;
 | 
			
		||||
 | 
			
		||||
@@ -32,12 +29,11 @@ public class RejectTrade extends Dialog {
 | 
			
		||||
    private final Geometry overlayBackground;
 | 
			
		||||
 | 
			
		||||
    /** Main container for the rejection message content. */
 | 
			
		||||
    private final Container noMoneyWarningContainer;
 | 
			
		||||
    private final Container rejectTradeContainer;
 | 
			
		||||
 | 
			
		||||
    /** Background container providing a border for the popup. */
 | 
			
		||||
    private final Container backgroundContainer;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructs the RejectTrade popup displaying the rejection of a trade proposal.
 | 
			
		||||
     *
 | 
			
		||||
@@ -48,68 +44,15 @@ public class RejectTrade extends Dialog {
 | 
			
		||||
        super(app.getDialogManager());
 | 
			
		||||
        this.app = app;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        // Halbtransparentes Overlay hinzufügen
 | 
			
		||||
        overlayBackground = createOverlayBackground();
 | 
			
		||||
        app.getGuiNode().attachChild(overlayBackground);
 | 
			
		||||
        backgroundContainer = createBackgroundContainer();
 | 
			
		||||
        rejectTradeContainer = createRejectTradeContainer(msg);
 | 
			
		||||
 | 
			
		||||
        // Create the background container
 | 
			
		||||
        backgroundContainer = new Container();
 | 
			
		||||
        backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Darker background
 | 
			
		||||
        app.getGuiNode().attachChild(backgroundContainer);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        // Hauptcontainer für die Warnung
 | 
			
		||||
        noMoneyWarningContainer = new Container();
 | 
			
		||||
        noMoneyWarningContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f)));
 | 
			
		||||
        noMoneyWarningContainer.setPreferredSize(new Vector3f(550,250,10));
 | 
			
		||||
 | 
			
		||||
        float padding = 10; // Passt den backgroundContainer an die Größe des bankruptContainers an
 | 
			
		||||
        backgroundContainer.setPreferredSize(noMoneyWarningContainer.getPreferredSize().addLocal(padding, padding, 0));
 | 
			
		||||
 | 
			
		||||
        // Titel
 | 
			
		||||
        Label gateFieldTitle = noMoneyWarningContainer.addChild(new Label("Handel abgelehnt!", new ElementId("warning-title")));
 | 
			
		||||
        gateFieldTitle.setFontSize(48);
 | 
			
		||||
        gateFieldTitle.setColor(ColorRGBA.Black);
 | 
			
		||||
 | 
			
		||||
        // Text, der im Popup steht
 | 
			
		||||
        Container textContainer = noMoneyWarningContainer.addChild(new Container());
 | 
			
		||||
        textContainer.addChild(new Label("Du hast Spieler"+ " " + msg.getTradeHandler().getReceiver().getName() + " " + "einen Handel vorgeschlagen", new ElementId("label-Text")));
 | 
			
		||||
        textContainer.addChild(new Label("", new ElementId("label-Text")));
 | 
			
		||||
        textContainer.addChild(new Label("Der Handel wurde abgelehnt", new ElementId("label-Text")));
 | 
			
		||||
        textContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));
 | 
			
		||||
 | 
			
		||||
        // Passt den textContainer an die Größe des bankruptContainers an
 | 
			
		||||
        textContainer.setPreferredSize(noMoneyWarningContainer.getPreferredSize().addLocal(-250,-200,0));
 | 
			
		||||
 | 
			
		||||
        // Beenden-Button
 | 
			
		||||
        Button quitButton = noMoneyWarningContainer.addChild(new Button("Bestätigen", new ElementId("button")));
 | 
			
		||||
        quitButton.setFontSize(32);
 | 
			
		||||
        quitButton.addClickCommands(source -> ifTopDialog(() -> {
 | 
			
		||||
            app.getGameLogic().playSound(Sound.BUTTON);
 | 
			
		||||
            close();
 | 
			
		||||
        }));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        // Zentriere das Popup
 | 
			
		||||
        noMoneyWarningContainer.setLocalTranslation(
 | 
			
		||||
            (app.getCamera().getWidth() - noMoneyWarningContainer.getPreferredSize().x) / 2,
 | 
			
		||||
            (app.getCamera().getHeight() + noMoneyWarningContainer.getPreferredSize().y) / 2,
 | 
			
		||||
            8
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        // Zentriere das Popup
 | 
			
		||||
        backgroundContainer.setLocalTranslation(
 | 
			
		||||
                (app.getCamera().getWidth() - noMoneyWarningContainer.getPreferredSize().x - padding) / 2,
 | 
			
		||||
                (app.getCamera().getHeight() + noMoneyWarningContainer.getPreferredSize().y+ padding) / 2,
 | 
			
		||||
                7
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        app.getGuiNode().attachChild(noMoneyWarningContainer);
 | 
			
		||||
        adjustPaddingAndCenter();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a semi-transparent background overlay for the popup.
 | 
			
		||||
     * Creates the semi-transparent background overlay for the popup.
 | 
			
		||||
     *
 | 
			
		||||
     * @return the geometry of the overlay
 | 
			
		||||
     */
 | 
			
		||||
@@ -117,21 +60,98 @@ public class RejectTrade extends Dialog {
 | 
			
		||||
        Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight());
 | 
			
		||||
        Geometry overlay = new Geometry("Overlay", quad);
 | 
			
		||||
        Material material = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
 | 
			
		||||
        material.setColor("Color", new ColorRGBA(0, 0, 0, 0.5f)); // Halbtransparent
 | 
			
		||||
        material.setColor("Color", new ColorRGBA(0, 0, 0, 0.5f)); // Semi-transparent black
 | 
			
		||||
        material.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
 | 
			
		||||
        overlay.setMaterial(material);
 | 
			
		||||
        overlay.setLocalTranslation(0, 0, 0);
 | 
			
		||||
        return overlay;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates the background container for the dialog.
 | 
			
		||||
     *
 | 
			
		||||
     * @return A styled container for the dialog background.
 | 
			
		||||
     */
 | 
			
		||||
    private Container createBackgroundContainer() {
 | 
			
		||||
        Container container = new Container();
 | 
			
		||||
        container.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Light gray background
 | 
			
		||||
        return container;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates the main container for the RejectTrade dialog UI.
 | 
			
		||||
     *
 | 
			
		||||
     * @param msg the trade reply message containing details about the rejected trade
 | 
			
		||||
     * @return The container for the rejection message and action button
 | 
			
		||||
     */
 | 
			
		||||
    private Container createRejectTradeContainer(TradeReply msg) {
 | 
			
		||||
        Container container = new Container();
 | 
			
		||||
        container.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f)));
 | 
			
		||||
        container.setPreferredSize(new Vector3f(550, 250, 10));
 | 
			
		||||
 | 
			
		||||
        // Title
 | 
			
		||||
        Label title = container.addChild(new Label("Handel abgelehnt!", new ElementId("warning-title")));
 | 
			
		||||
        title.setFontSize(48);
 | 
			
		||||
        title.setColor(ColorRGBA.Black);
 | 
			
		||||
 | 
			
		||||
        // Rejection message
 | 
			
		||||
        Container textContainer = container.addChild(new Container());
 | 
			
		||||
        textContainer.addChild(new Label("Du hast Spieler " + msg.getTradeHandler().getReceiver().getName()
 | 
			
		||||
                + " einen Handel vorgeschlagen.", new ElementId("label-Text")));
 | 
			
		||||
        textContainer.addChild(new Label("", new ElementId("label-Text")));
 | 
			
		||||
        textContainer.addChild(new Label("Der Handel wurde abgelehnt.", new ElementId("label-Text")));
 | 
			
		||||
        textContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));
 | 
			
		||||
        textContainer.setPreferredSize(container.getPreferredSize().addLocal(-250, -200, 0));
 | 
			
		||||
 | 
			
		||||
        // Confirmation button
 | 
			
		||||
        Button confirmButton = container.addChild(new Button("Bestätigen", new ElementId("button")));
 | 
			
		||||
        confirmButton.setFontSize(32);
 | 
			
		||||
        confirmButton.addClickCommands(source -> ifTopDialog(() -> {
 | 
			
		||||
            app.getGameLogic().playSound(Sound.BUTTON);
 | 
			
		||||
            close();
 | 
			
		||||
        }));
 | 
			
		||||
 | 
			
		||||
        return container;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Adjusts the padding and centers the dialog on the screen.
 | 
			
		||||
     */
 | 
			
		||||
    private void adjustPaddingAndCenter() {
 | 
			
		||||
        float padding = 10;
 | 
			
		||||
        backgroundContainer.setPreferredSize(rejectTradeContainer.getPreferredSize().addLocal(padding, padding, 0));
 | 
			
		||||
 | 
			
		||||
        rejectTradeContainer.setLocalTranslation(
 | 
			
		||||
            (app.getCamera().getWidth() - rejectTradeContainer.getPreferredSize().x) / 2,
 | 
			
		||||
            (app.getCamera().getHeight() + rejectTradeContainer.getPreferredSize().y) / 2,
 | 
			
		||||
            8
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        backgroundContainer.setLocalTranslation(
 | 
			
		||||
            (app.getCamera().getWidth() - backgroundContainer.getPreferredSize().x) / 2,
 | 
			
		||||
            (app.getCamera().getHeight() + backgroundContainer.getPreferredSize().y) / 2,
 | 
			
		||||
            7
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Displays the popup by attaching its elements to the GUI node.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void show() {
 | 
			
		||||
        app.getGuiNode().attachChild(overlayBackground);
 | 
			
		||||
        app.getGuiNode().attachChild(backgroundContainer);
 | 
			
		||||
        app.getGuiNode().attachChild(rejectTradeContainer);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Closes the menu and removes the GUI elements.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void close() {
 | 
			
		||||
        app.getGuiNode().detachChild(noMoneyWarningContainer);  // Entferne das Menü
 | 
			
		||||
        app.getGuiNode().detachChild(backgroundContainer); //Entfernt Rand
 | 
			
		||||
        app.getGuiNode().detachChild(overlayBackground);  // Entferne das Overlay
 | 
			
		||||
        app.getGuiNode().detachChild(overlayBackground);
 | 
			
		||||
        app.getGuiNode().detachChild(backgroundContainer);
 | 
			
		||||
        app.getGuiNode().detachChild(rejectTradeContainer);
 | 
			
		||||
        super.close();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -142,4 +162,4 @@ public class RejectTrade extends Dialog {
 | 
			
		||||
    public void escape() {
 | 
			
		||||
        close();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -12,6 +12,7 @@ import com.simsilica.lemur.Label;
 | 
			
		||||
import com.simsilica.lemur.component.QuadBackgroundComponent;
 | 
			
		||||
import com.simsilica.lemur.style.ElementId;
 | 
			
		||||
import pp.dialog.Dialog;
 | 
			
		||||
import pp.dialog.PopupDialog;
 | 
			
		||||
import pp.monopoly.client.MonopolyApp;
 | 
			
		||||
import pp.monopoly.notification.Sound;
 | 
			
		||||
 | 
			
		||||
@@ -22,122 +23,77 @@ import pp.monopoly.notification.Sound;
 | 
			
		||||
 * Displays the rent amount and the recipient player's name, with an option to confirm the payment.
 | 
			
		||||
 * </p>
 | 
			
		||||
 */
 | 
			
		||||
public class Rent extends Dialog {
 | 
			
		||||
    /** Reference to the Monopoly application instance. */
 | 
			
		||||
public class Rent extends Dialog implements PopupDialog {
 | 
			
		||||
    private final MonopolyApp app;
 | 
			
		||||
 | 
			
		||||
    /** Semi-transparent overlay background for the popup. */
 | 
			
		||||
    private final Geometry overlayBackground;
 | 
			
		||||
 | 
			
		||||
    /** Main container for the rent information and action. */
 | 
			
		||||
    private final Container rentContainer;
 | 
			
		||||
 | 
			
		||||
    /** Background container providing a border for the rent popup. */
 | 
			
		||||
    private final Container backgroundContainer;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructs the Rent popup displaying the rent amount and recipient player.
 | 
			
		||||
     *
 | 
			
		||||
     * @param app        the Monopoly application instance
 | 
			
		||||
     * @param playerName the name of the player to whom the rent is owed
 | 
			
		||||
     * @param amount     the amount of rent to be paid
 | 
			
		||||
     */
 | 
			
		||||
    public Rent(MonopolyApp app, String playerName, int amount) {
 | 
			
		||||
        super(app.getDialogManager());
 | 
			
		||||
        this.app = app;
 | 
			
		||||
 | 
			
		||||
        // Create the overlay
 | 
			
		||||
        // Create the overlay and containers
 | 
			
		||||
        overlayBackground = createOverlayBackground();
 | 
			
		||||
        app.getGuiNode().attachChild(overlayBackground);
 | 
			
		||||
 | 
			
		||||
        // Create and position the background container
 | 
			
		||||
        backgroundContainer = createBackgroundContainer();
 | 
			
		||||
        app.getGuiNode().attachChild(backgroundContainer);
 | 
			
		||||
 | 
			
		||||
        // Create and position the rent container
 | 
			
		||||
        rentContainer = createRentContainer(playerName, amount);
 | 
			
		||||
        app.getGuiNode().attachChild(rentContainer);
 | 
			
		||||
 | 
			
		||||
        // Center containers (positioning logic only, no GUI attachment)
 | 
			
		||||
        centerContainers();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a semi-transparent overlay background.
 | 
			
		||||
     *
 | 
			
		||||
     * @return the overlay geometry
 | 
			
		||||
     */
 | 
			
		||||
    private Geometry createOverlayBackground() {
 | 
			
		||||
        Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight());
 | 
			
		||||
        Geometry overlay = new Geometry("Overlay", quad);
 | 
			
		||||
        Material material = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
 | 
			
		||||
        material.setColor("Color", new ColorRGBA(0, 0, 0, 0.5f)); // Semi-transparent black
 | 
			
		||||
        material.setColor("Color", new ColorRGBA(0, 0, 0, 0.5f));
 | 
			
		||||
        material.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
 | 
			
		||||
        overlay.setMaterial(material);
 | 
			
		||||
        overlay.setLocalTranslation(0, 0, 0);
 | 
			
		||||
        return overlay;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates the background container with styling.
 | 
			
		||||
     *
 | 
			
		||||
     * @return the styled background container
 | 
			
		||||
     */
 | 
			
		||||
    private Container createBackgroundContainer() {
 | 
			
		||||
        Container container = new Container();
 | 
			
		||||
        container.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Light gray background
 | 
			
		||||
        container.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f)));
 | 
			
		||||
        return container;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates the main rent container with title, text, and button.
 | 
			
		||||
     *
 | 
			
		||||
     * @param playerName the name of the player to whom the rent is owed
 | 
			
		||||
     * @param amount     the rent amount
 | 
			
		||||
     * @return the rent container
 | 
			
		||||
     */
 | 
			
		||||
    private Container createRentContainer(String playerName, int amount) {
 | 
			
		||||
        Container container = new Container();
 | 
			
		||||
        container.setBackground(new QuadBackgroundComponent(ColorRGBA.Gray));
 | 
			
		||||
        container.setPreferredSize(new Vector3f(550, 250, 10));
 | 
			
		||||
 | 
			
		||||
        // Title
 | 
			
		||||
        Label title = container.addChild(new Label("Miete!", new ElementId("warning-title")));
 | 
			
		||||
        title.setFontSize(48);
 | 
			
		||||
        title.setColor(ColorRGBA.Black);
 | 
			
		||||
 | 
			
		||||
        // Rent message
 | 
			
		||||
        Container textContainer = container.addChild(new Container());
 | 
			
		||||
        textContainer.addChild(new Label("Du musst " + amount  + " EUR Miete an " + playerName + " zahlen",
 | 
			
		||||
        textContainer.addChild(new Label("Du musst " + amount + " EUR Miete an " + playerName + " zahlen",
 | 
			
		||||
                new ElementId("label-Text")));
 | 
			
		||||
        textContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));
 | 
			
		||||
        textContainer.setPreferredSize(container.getPreferredSize().addLocal(-250, -200, 0));
 | 
			
		||||
 | 
			
		||||
        // Payment button
 | 
			
		||||
        Button payButton = container.addChild(new Button("Überweisen", new ElementId("button")));
 | 
			
		||||
        payButton.setFontSize(32);
 | 
			
		||||
        payButton.addClickCommands(s -> ifTopDialog( () -> {
 | 
			
		||||
                app.getGameLogic().playSound(Sound.BUTTON);
 | 
			
		||||
                close();
 | 
			
		||||
 | 
			
		||||
        payButton.addClickCommands(s -> ifTopDialog(() -> {
 | 
			
		||||
            app.getGameLogic().playSound(Sound.BUTTON);
 | 
			
		||||
            close();
 | 
			
		||||
        }));
 | 
			
		||||
 | 
			
		||||
        return container;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Centers the rent and background containers on the screen.
 | 
			
		||||
     */
 | 
			
		||||
    private void centerContainers() {
 | 
			
		||||
        float padding = 10;
 | 
			
		||||
 | 
			
		||||
        // Center rent container
 | 
			
		||||
        rentContainer.setLocalTranslation(
 | 
			
		||||
                (app.getCamera().getWidth() - rentContainer.getPreferredSize().x) / 2,
 | 
			
		||||
                (app.getCamera().getHeight() + rentContainer.getPreferredSize().y) / 2,
 | 
			
		||||
                8
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        // Center background container with padding
 | 
			
		||||
        backgroundContainer.setPreferredSize(rentContainer.getPreferredSize().addLocal(padding, padding, 0));
 | 
			
		||||
        backgroundContainer.setLocalTranslation(
 | 
			
		||||
                (app.getCamera().getWidth() - backgroundContainer.getPreferredSize().x) / 2,
 | 
			
		||||
@@ -146,22 +102,25 @@ public class Rent extends Dialog {
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Closes the popup and removes GUI elements.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void show() {
 | 
			
		||||
        // Attach components to GUI only when the dialog is displayed via DialogManager
 | 
			
		||||
        app.getGuiNode().attachChild(overlayBackground);
 | 
			
		||||
        app.getGuiNode().attachChild(backgroundContainer);
 | 
			
		||||
        app.getGuiNode().attachChild(rentContainer);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void close() {
 | 
			
		||||
        app.getGuiNode().detachChild(rentContainer);
 | 
			
		||||
        app.getGuiNode().detachChild(backgroundContainer);
 | 
			
		||||
        app.getGuiNode().detachChild(overlayBackground);
 | 
			
		||||
        app.getGuiNode().detachChild(backgroundContainer);
 | 
			
		||||
        app.getGuiNode().detachChild(rentContainer);
 | 
			
		||||
        super.close();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Handles the escape action to close the dialog.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void escape() {
 | 
			
		||||
        close();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -54,7 +54,7 @@ public class BoardManager {
 | 
			
		||||
        fields.add(new EventField("Üvas", 22));
 | 
			
		||||
        fields.add(new BuildingProperty("StudFBer B", 23, 2200, 180, 1500, FieldColor.RED));
 | 
			
		||||
        fields.add(new BuildingProperty("StudFBer A", 24, 2400, 200, 1500, FieldColor.RED));
 | 
			
		||||
        fields.add(new GateField("Nordtor", 25));
 | 
			
		||||
        fields.add(new GateField("Spießtor", 25));
 | 
			
		||||
        fields.add(new BuildingProperty("Cascada", 26, 2600, 220, 1500, FieldColor.YELLOW));
 | 
			
		||||
        fields.add(new BuildingProperty("Fakultätsgebäude", 27, 2600, 220, 1500, FieldColor.YELLOW));
 | 
			
		||||
        fields.add(new FoodField("Truppenküche", 28));
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user