mirror of
				https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02.git
				synced 2025-11-04 11:56:18 +01:00 
			
		
		
		
	Compare commits
	
		
			4 Commits
		
	
	
		
			a70295f1ff
			...
			f6137b8b68
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					f6137b8b68 | ||
| 
						 | 
					87309235bd | ||
| 
						 | 
					d37017bfa0 | ||
| 
						 | 
					5d6440bd50 | 
@@ -9,6 +9,11 @@ import com.simsilica.lemur.style.ElementId;
 | 
			
		||||
import pp.dialog.Dialog;
 | 
			
		||||
import pp.monopoly.client.MonopolyApp;
 | 
			
		||||
import pp.monopoly.client.gui.SettingsMenu;
 | 
			
		||||
import pp.monopoly.client.gui.TradeMenu;
 | 
			
		||||
import pp.monopoly.message.client.TradeResponse;
 | 
			
		||||
import pp.monopoly.message.server.TradeReply;
 | 
			
		||||
import pp.monopoly.model.TradeHandler;
 | 
			
		||||
import pp.monopoly.model.fields.PropertyField;
 | 
			
		||||
import pp.monopoly.notification.Sound;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -18,11 +23,13 @@ public class ConfirmTrade extends Dialog {
 | 
			
		||||
    private final MonopolyApp app;
 | 
			
		||||
    private final Container confirmTradeContainer;
 | 
			
		||||
    private final Container backgroundContainer;
 | 
			
		||||
    private TradeHandler tradeHandler;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    public ConfirmTrade(MonopolyApp app) {
 | 
			
		||||
        super(app.getDialogManager());
 | 
			
		||||
        this.app = app;
 | 
			
		||||
        tradeHandler = app.getGameLogic().getTradeHandler();
 | 
			
		||||
 | 
			
		||||
        // Create the background container
 | 
			
		||||
        backgroundContainer = new Container();
 | 
			
		||||
@@ -40,20 +47,32 @@ public class ConfirmTrade extends Dialog {
 | 
			
		||||
        title.setFontSize(48);
 | 
			
		||||
        title.setColor(ColorRGBA.Black);
 | 
			
		||||
 | 
			
		||||
        StringBuilder offeredProperties = new StringBuilder();
 | 
			
		||||
        for (PropertyField field : tradeHandler.getOfferedProperties()) {
 | 
			
		||||
            offeredProperties.append(field.getName());
 | 
			
		||||
            offeredProperties.append(", ");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        StringBuilder requestedProperties = new StringBuilder();
 | 
			
		||||
        for (PropertyField field : tradeHandler.getRequestedProperties()) {
 | 
			
		||||
            requestedProperties.append(field.getName());
 | 
			
		||||
            requestedProperties.append(", ");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Text, der auf der Karte steht
 | 
			
		||||
        // Die Werte werden dem Handel entnommen (Iwas auch immer da dann ist)
 | 
			
		||||
        Container propertyValuesContainer = confirmTradeContainer.addChild(new Container());
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("„Spieler XXX möchte:", new ElementId("label-Text"))); //TODO hier überall die entsprechenden Variablen einfügen
 | 
			
		||||
        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("- XXX Gebäude", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("- XXX EUR", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("- XXX Sonderkaten", 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() +" Sonderkaten", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("", new ElementId("label-Text")));// Leerzeile
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("gegen:", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("", new ElementId("label-Text")));// Leerzeile
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("- XXX Gebäude", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("- XXX EUR", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("- XXX Sonderkaten", 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() +" Sonderkaten", new ElementId("label-Text")));
 | 
			
		||||
        propertyValuesContainer.addChild(new Label("", new ElementId("label-Text")));// Leerzeile
 | 
			
		||||
        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)));
 | 
			
		||||
@@ -63,19 +82,24 @@ public class ConfirmTrade extends Dialog {
 | 
			
		||||
        declineButton.setFontSize(32);
 | 
			
		||||
        declineButton.addClickCommands(s -> ifTopDialog(() -> { //TODO Buttonfunktion prüfen
 | 
			
		||||
            app.getGameLogic().playSound(Sound.BUTTON);
 | 
			
		||||
            app.getGameLogic().send(new TradeResponse(false, tradeHandler));
 | 
			
		||||
            close();
 | 
			
		||||
        }));
 | 
			
		||||
        // Verhandeln-Button
 | 
			
		||||
        Button negotiateButton = confirmTradeContainer.addChild(new Button("Verhandeln", new ElementId("button")));
 | 
			
		||||
        negotiateButton.setFontSize(32);
 | 
			
		||||
        negotiateButton.addClickCommands(s -> ifTopDialog( () -> { //TODO Buttonfunktion prüfen
 | 
			
		||||
        negotiateButton.addClickCommands(s -> ifTopDialog( () -> {
 | 
			
		||||
            app.getGameLogic().playSound(Sound.BUTTON);
 | 
			
		||||
            close();
 | 
			
		||||
            new TradeMenu(app, new TradeHandler(app.getGameLogic().getPlayerHandler().getPlayerById(app.getId()))).open();
 | 
			
		||||
        }));
 | 
			
		||||
        // Confirm-Button
 | 
			
		||||
        Button confirmButton = confirmTradeContainer.addChild(new Button("Bestätigen", new ElementId("button")));
 | 
			
		||||
        confirmButton.setFontSize(32);
 | 
			
		||||
        confirmButton.addClickCommands(s -> ifTopDialog( () -> { //TODO Buttonfunktion prüfen
 | 
			
		||||
        confirmButton.addClickCommands(s -> ifTopDialog( () -> {
 | 
			
		||||
            app.getGameLogic().playSound(Sound.BUTTON);
 | 
			
		||||
            app.getGameLogic().send(new TradeResponse(true, tradeHandler));
 | 
			
		||||
            close();
 | 
			
		||||
        }));
 | 
			
		||||
 | 
			
		||||
        // Zentriere das Menü
 | 
			
		||||
 
 | 
			
		||||
@@ -14,6 +14,7 @@ import com.simsilica.lemur.component.QuadBackgroundComponent;
 | 
			
		||||
import com.simsilica.lemur.style.ElementId;
 | 
			
		||||
import pp.dialog.Dialog;
 | 
			
		||||
import pp.monopoly.client.MonopolyApp;
 | 
			
		||||
import pp.monopoly.notification.Sound;
 | 
			
		||||
 | 
			
		||||
public class LooserPopUp extends Dialog {
 | 
			
		||||
    private final MonopolyApp app;
 | 
			
		||||
@@ -67,10 +68,13 @@ public class LooserPopUp extends Dialog {
 | 
			
		||||
        imageLabel.setIcon(icon);
 | 
			
		||||
        imageContainer.addChild(imageLabel); // Add the image label to the container
 | 
			
		||||
 | 
			
		||||
        // Beenden-Button
 | 
			
		||||
        Button quitButton = LooserContainer.addChild(new Button("Spiel beenden", new ElementId("button")));
 | 
			
		||||
        //Beenden Button
 | 
			
		||||
        Button quitButton = LooserContainer.addChild(new Button("Spiel Beenden", new ElementId("button")));
 | 
			
		||||
        quitButton.setFontSize(32);
 | 
			
		||||
        quitButton.addClickCommands(source -> close());
 | 
			
		||||
        quitButton.addClickCommands(s -> ifTopDialog(() -> {
 | 
			
		||||
            app.getGameLogic().playSound(Sound.BUTTON);
 | 
			
		||||
            app.closeApp();
 | 
			
		||||
        }));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        // Zentriere das Popup
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,7 @@ public class Rent extends Dialog {
 | 
			
		||||
    private final Container backgroundContainer;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    private int index = 37; // TODO fixed for testing
 | 
			
		||||
    private int index = 21; // TODO fixed for testing
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -14,6 +14,7 @@ import com.simsilica.lemur.component.QuadBackgroundComponent;
 | 
			
		||||
import com.simsilica.lemur.style.ElementId;
 | 
			
		||||
import pp.dialog.Dialog;
 | 
			
		||||
import pp.monopoly.client.MonopolyApp;
 | 
			
		||||
import pp.monopoly.notification.Sound;
 | 
			
		||||
 | 
			
		||||
public class WinnerPopUp extends Dialog {
 | 
			
		||||
    private final MonopolyApp app;
 | 
			
		||||
@@ -67,11 +68,13 @@ public class WinnerPopUp extends Dialog {
 | 
			
		||||
        imageLabel.setIcon(icon);
 | 
			
		||||
        imageContainer.addChild(imageLabel); // Add the image label to the container
 | 
			
		||||
 | 
			
		||||
        // Beenden-Button
 | 
			
		||||
        Button quitButton = WinnerContainer.addChild(new Button("Spiel beenden", new ElementId("button")));
 | 
			
		||||
        quitButton.setFontSize(32);
 | 
			
		||||
        quitButton.addClickCommands(source -> close());
 | 
			
		||||
 | 
			
		||||
        Button quitButton = WinnerContainer.addChild(new Button("Spiel Beenden", new ElementId("button")));
 | 
			
		||||
        quitButton.setFontSize(32);
 | 
			
		||||
        quitButton.addClickCommands(s -> ifTopDialog(() -> {
 | 
			
		||||
            app.getGameLogic().playSound(Sound.BUTTON);
 | 
			
		||||
            app.closeApp();
 | 
			
		||||
        }));
 | 
			
		||||
 | 
			
		||||
        // Zentriere das Popup
 | 
			
		||||
        WinnerContainer.setLocalTranslation(
 | 
			
		||||
 
 | 
			
		||||
@@ -22,6 +22,7 @@ import pp.monopoly.message.server.TradeRequest;
 | 
			
		||||
import pp.monopoly.message.server.ViewAssetsResponse;
 | 
			
		||||
import pp.monopoly.model.Board;
 | 
			
		||||
import pp.monopoly.model.IntPoint;
 | 
			
		||||
import pp.monopoly.model.TradeHandler;
 | 
			
		||||
import pp.monopoly.model.fields.BoardManager;
 | 
			
		||||
import pp.monopoly.notification.ClientStateEvent;
 | 
			
		||||
import pp.monopoly.notification.DiceRollEvent;
 | 
			
		||||
@@ -61,6 +62,8 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker {
 | 
			
		||||
 | 
			
		||||
    private BoardManager boardManager = new BoardManager();
 | 
			
		||||
 | 
			
		||||
    private TradeHandler tradeHandler;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructs a ClientGameLogic with the specified sender object.
 | 
			
		||||
@@ -113,6 +116,10 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker {
 | 
			
		||||
        return board;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public TradeHandler getTradeHandler() {
 | 
			
		||||
        return tradeHandler;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Moves the preview figure to the specified position.
 | 
			
		||||
     *
 | 
			
		||||
@@ -300,13 +307,11 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker {
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void received(TradeReply msg) {
 | 
			
		||||
        // if (msg.getTradeHandler().getStatus()) {
 | 
			
		||||
        
 | 
			
		||||
        //     playSound(Sound.TRADE_ACCEPTED);
 | 
			
		||||
        // } else {
 | 
			
		||||
        
 | 
			
		||||
        //     playSound(Sound.TRADE_REJECTED);
 | 
			
		||||
        // }
 | 
			
		||||
        if (msg.isAccepted()) {
 | 
			
		||||
            playSound(Sound.TRADE_ACCEPTED);
 | 
			
		||||
        } else {
 | 
			
		||||
            playSound(Sound.TRADE_REJECTED);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -316,7 +321,7 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker {
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void received(TradeRequest msg) {
 | 
			
		||||
        System.out.println("Angebot angekommen");
 | 
			
		||||
        tradeHandler = msg.getTradeHandler();
 | 
			
		||||
        notifyListeners(new PopUpEvent("tradeRequest"));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -8,10 +8,10 @@
 | 
			
		||||
package pp.monopoly.game.server;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Random;
 | 
			
		||||
 | 
			
		||||
import javax.swing.JInternalFrame;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
import com.jme3.network.serializing.Serializable;
 | 
			
		||||
 | 
			
		||||
@@ -43,7 +43,7 @@ public class Player implements FieldVisitor<Void>{
 | 
			
		||||
    private String name;
 | 
			
		||||
    private int accountBalance = 15000;
 | 
			
		||||
    private Figure figure;
 | 
			
		||||
    private List<Integer> properties = new ArrayList<>();
 | 
			
		||||
    private Set<Integer> properties = new HashSet<>();
 | 
			
		||||
    private int getOutOfJailCard;
 | 
			
		||||
    private int fieldID;
 | 
			
		||||
    private DiceResult rollResult;
 | 
			
		||||
@@ -189,7 +189,7 @@ public class Player implements FieldVisitor<Void>{
 | 
			
		||||
     * @return List of all properties owned by this player
 | 
			
		||||
     */
 | 
			
		||||
    public List<Integer> getProperties() {
 | 
			
		||||
        return properties;
 | 
			
		||||
        return new ArrayList<>(properties);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -578,8 +578,17 @@ DiceResult rollDice() {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toString() {
 | 
			
		||||
        return "Player{name=" + name + ", figure=" + figure + "}";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void addProperty(Integer id) {
 | 
			
		||||
        properties.add(id);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void removeProperty(Integer id) {
 | 
			
		||||
        properties.remove(id);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,6 +2,10 @@ package pp.monopoly.game.server;
 | 
			
		||||
 | 
			
		||||
import java.lang.System.Logger;
 | 
			
		||||
import java.lang.System.Logger.Level;
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Properties;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
import pp.monopoly.MonopolyConfig;
 | 
			
		||||
import pp.monopoly.message.client.BuyPropertyResponse;
 | 
			
		||||
@@ -21,6 +25,7 @@ import pp.monopoly.message.server.TradeRequest;
 | 
			
		||||
import pp.monopoly.message.server.ViewAssetsResponse;
 | 
			
		||||
import pp.monopoly.model.Figure;
 | 
			
		||||
import pp.monopoly.model.Rotation;
 | 
			
		||||
import pp.monopoly.model.TradeHandler;
 | 
			
		||||
import pp.monopoly.model.card.DeckHelper;
 | 
			
		||||
import pp.monopoly.model.fields.BoardManager;
 | 
			
		||||
import pp.monopoly.model.fields.PropertyField;
 | 
			
		||||
@@ -248,15 +253,76 @@ public class ServerGameLogic implements ClientInterpreter {
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void received(TradeResponse msg, int from) {
 | 
			
		||||
        Player responder = playerHandler.getPlayerById(from);
 | 
			
		||||
        Player initiator = playerHandler.getPlayerById(msg.getInitiatorId());
 | 
			
		||||
 | 
			
		||||
        TradeHandler tradeHandler = msg.getTradeHandler();
 | 
			
		||||
 | 
			
		||||
        Player receiver = playerHandler.getPlayerById(tradeHandler.getReceiver().getId());
 | 
			
		||||
        Player sender = playerHandler.getPlayerById(tradeHandler.getSender().getId());
 | 
			
		||||
 | 
			
		||||
        Set<PropertyField> offered = new HashSet<>();
 | 
			
		||||
 | 
			
		||||
        for (PropertyField propertyField : tradeHandler.getOfferedProperties()) {
 | 
			
		||||
            offered.add( (PropertyField) boardManager.getFieldAtIndex(propertyField.getId()));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Set<PropertyField> requested = new HashSet<>();
 | 
			
		||||
 | 
			
		||||
        for (PropertyField propertyField : tradeHandler.getRequestedProperties()) {
 | 
			
		||||
            requested.add( (PropertyField) boardManager.getFieldAtIndex(propertyField.getId()));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        executeTrade(sender, receiver, offered, requested);
 | 
			
		||||
 | 
			
		||||
        sender.earnMoney(tradeHandler.getRequestedAmount());
 | 
			
		||||
        sender.pay(tradeHandler.getOfferedAmount());
 | 
			
		||||
        receiver.earnMoney(tradeHandler.getOfferedAmount());
 | 
			
		||||
        receiver.pay(tradeHandler.getRequestedAmount());
 | 
			
		||||
 | 
			
		||||
        for (int i = 0; i < tradeHandler.getOfferedJailCards(); i++) {
 | 
			
		||||
            sender.removeJailCard();
 | 
			
		||||
            receiver.addJailCard();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        for (int i = 0; i < tradeHandler.getRequestedAmount(); i++) {
 | 
			
		||||
            sender.addJailCard();
 | 
			
		||||
            receiver.removeJailCard();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        updateAllPlayers();
 | 
			
		||||
        
 | 
			
		||||
        if (responder != null && initiator != null) {
 | 
			
		||||
            LOGGER.log(Level.INFO, "Player {0} responded to trade with player {1}", responder.getName(), initiator.getName());
 | 
			
		||||
            send(initiator, new TradeReply(msg.getInitiatorId(), msg.getTradeHandler()));
 | 
			
		||||
        if (receiver != null && sender != null) {
 | 
			
		||||
            LOGGER.log(Level.INFO, "Player {0} responded to trade with player {1}", receiver.getName(), sender.getName());
 | 
			
		||||
            send(sender, new TradeReply(msg.isAccepted(), msg.getTradeHandler()));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Executes the trade by transferring requested properties from the receiver
 | 
			
		||||
     * to the sender and offered properties from the sender to the receiver.
 | 
			
		||||
     */
 | 
			
		||||
    public void executeTrade(Player sender, Player receiver, Set<PropertyField> requestedProperties, Set<PropertyField> offeredProperties) {
 | 
			
		||||
        // Transfer requested properties from receiver to sender
 | 
			
		||||
        for (PropertyField field : requestedProperties) {
 | 
			
		||||
                receiver.removeProperty(field.getId());
 | 
			
		||||
                sender.addProperty(field.getId());
 | 
			
		||||
                field.setOwner(sender); // Update ownership
 | 
			
		||||
                System.out.printf("Property %s transferred from %s to %s.\n", 
 | 
			
		||||
                                field.getName(), receiver.getName(), sender.getName());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Transfer offered properties from sender to receiver
 | 
			
		||||
        for (PropertyField field : offeredProperties) {
 | 
			
		||||
                sender.removeProperty(field.getId());
 | 
			
		||||
                receiver.addProperty(field.getId());
 | 
			
		||||
                field.setOwner(receiver); // Update ownership
 | 
			
		||||
                System.out.printf("Property %s transferred from %s to %s.\n", 
 | 
			
		||||
                                field.getName(), sender.getName(), receiver.getName());
 | 
			
		||||
            }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Handles a ViewAssetsRequest message, sending the player a response containing their assets.
 | 
			
		||||
     *
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@ import pp.monopoly.model.TradeHandler;
 | 
			
		||||
 */
 | 
			
		||||
@Serializable
 | 
			
		||||
public class TradeResponse extends ClientMessage{
 | 
			
		||||
    private int initiatorId;
 | 
			
		||||
    private boolean status;
 | 
			
		||||
    private TradeHandler tradeHandler;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -20,15 +20,15 @@ public class TradeResponse extends ClientMessage{
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructs a TradeResponse with the specified response details.
 | 
			
		||||
     *
 | 
			
		||||
     * @param initiatorId the ID of the player who initiated the trade
 | 
			
		||||
     * @param status the ID of the player who initiated the trade
 | 
			
		||||
     * @param accepted true if the offer is accepted, false if declined
 | 
			
		||||
     */
 | 
			
		||||
    public TradeResponse(int initiatorId, TradeHandler tradeHandler) {
 | 
			
		||||
        this.initiatorId = initiatorId;
 | 
			
		||||
    public TradeResponse(boolean status, TradeHandler tradeHandler) {
 | 
			
		||||
        this.status = status;
 | 
			
		||||
        this.tradeHandler = tradeHandler;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getInitiatorId() { return initiatorId; }
 | 
			
		||||
    public boolean isAccepted() { return status; }
 | 
			
		||||
    public TradeHandler getTradeHandler() {
 | 
			
		||||
        return tradeHandler;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@ import pp.monopoly.model.TradeHandler;
 | 
			
		||||
 */
 | 
			
		||||
@Serializable
 | 
			
		||||
public class TradeReply extends ServerMessage{
 | 
			
		||||
    private int initiatorId;
 | 
			
		||||
    private boolean status;
 | 
			
		||||
    private TradeHandler tradeHandler;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -20,15 +20,15 @@ public class TradeReply extends ServerMessage{
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructs a TradeResponse with the specified response details.
 | 
			
		||||
     *
 | 
			
		||||
     * @param initiatorId the ID of the player who initiated the trade
 | 
			
		||||
     * @param status the ID of the player who initiated the trade
 | 
			
		||||
     * @param accepted true if the offer is accepted, false if declined
 | 
			
		||||
     */
 | 
			
		||||
    public TradeReply(int initiatorId, TradeHandler tradeHandler) {
 | 
			
		||||
        this.initiatorId = initiatorId;
 | 
			
		||||
    public TradeReply(boolean status, TradeHandler tradeHandler) {
 | 
			
		||||
        this.status = status;
 | 
			
		||||
        this.tradeHandler = tradeHandler;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getInitiatorId() { return initiatorId; }
 | 
			
		||||
    public boolean isAccepted() { return status; }
 | 
			
		||||
    public TradeHandler getTradeHandler() {
 | 
			
		||||
        return tradeHandler;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -100,135 +100,6 @@ public class TradeHandler {
 | 
			
		||||
        return sender;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Initiates the trade and validates its terms.
 | 
			
		||||
     *
 | 
			
		||||
     * @return true if the trade is valid and can proceed, false otherwise
 | 
			
		||||
     */
 | 
			
		||||
    public boolean initiateTrade() {
 | 
			
		||||
        if (!validateTrade()) {
 | 
			
		||||
        
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
    
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Completes the trade by transferring money, properties, and jail cards.
 | 
			
		||||
     */
 | 
			
		||||
    public void acceptTrade() {
 | 
			
		||||
        // Transfer money
 | 
			
		||||
        sender.earnMoney(-offeredAmount);
 | 
			
		||||
        receiver.earnMoney(offeredAmount);
 | 
			
		||||
 | 
			
		||||
        receiver.earnMoney(-requestedAmount);
 | 
			
		||||
        sender.earnMoney(requestedAmount);
 | 
			
		||||
 | 
			
		||||
        // Transfer properties
 | 
			
		||||
        if (offeredProperties != null) {
 | 
			
		||||
            for (PropertyField property : offeredProperties) {
 | 
			
		||||
                transferProperty(sender, receiver, property);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if (requestedProperties != null) {
 | 
			
		||||
            for (PropertyField property : requestedProperties) {
 | 
			
		||||
                transferProperty(receiver, sender, property);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Transfer jail cards
 | 
			
		||||
        transferJailCards(sender, receiver, offeredJailCards);
 | 
			
		||||
        transferJailCards(receiver, sender, requestedJailCards);
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Rejects the trade.
 | 
			
		||||
     */
 | 
			
		||||
    public void rejectTrade() {
 | 
			
		||||
    
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Validates the trade offer by checking ownership, balances, and jail cards.
 | 
			
		||||
     *
 | 
			
		||||
     * @return true if the trade is valid, false otherwise
 | 
			
		||||
     */
 | 
			
		||||
    private boolean validateTrade() {
 | 
			
		||||
        // Validate sender's ability to offer money
 | 
			
		||||
        if (sender.getAccountBalance() < offeredAmount) {
 | 
			
		||||
        
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Validate receiver's ability to fulfill the requested amount
 | 
			
		||||
        if (receiver.getAccountBalance() < requestedAmount) {
 | 
			
		||||
        
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Validate property ownership
 | 
			
		||||
        if (offeredProperties != null) {
 | 
			
		||||
            for (PropertyField property : offeredProperties) {
 | 
			
		||||
                if (!sender.getProperties().contains(property)) {
 | 
			
		||||
                
 | 
			
		||||
                    return false;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if (requestedProperties != null) {
 | 
			
		||||
            for (PropertyField property : requestedProperties) {
 | 
			
		||||
                if (!receiver.getProperties().contains(property)) {
 | 
			
		||||
                
 | 
			
		||||
                    return false;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Validate jail cards
 | 
			
		||||
        if (sender.getNumJailCard() < offeredJailCards) {
 | 
			
		||||
        
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        if (receiver.getNumJailCard() < requestedJailCards) {
 | 
			
		||||
        
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Transfers a property between players.
 | 
			
		||||
     *
 | 
			
		||||
     * @param from the Player transferring the property
 | 
			
		||||
     * @param to   the Player receiving the property
 | 
			
		||||
     * @param property the PropertyField being transferred
 | 
			
		||||
     */
 | 
			
		||||
    private void transferProperty(Player from, Player to, PropertyField property) {
 | 
			
		||||
        from.sellProperty(property);
 | 
			
		||||
        to.buyProperty(property);
 | 
			
		||||
        property.setOwner(to);
 | 
			
		||||
    
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Transfers jail cards between players.
 | 
			
		||||
     *
 | 
			
		||||
     * @param from the Player transferring jail cards
 | 
			
		||||
     * @param to   the Player receiving jail cards
 | 
			
		||||
     * @param numCards the number of jail cards to transfer
 | 
			
		||||
     */
 | 
			
		||||
    private void transferJailCards(Player from, Player to, int numCards) {
 | 
			
		||||
        for (int i = 0; i < numCards; i++) {
 | 
			
		||||
            from.removeJailCard();
 | 
			
		||||
            to.addJailCard();
 | 
			
		||||
        }
 | 
			
		||||
    
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setOfferedAmount(int offeredAmount) {
 | 
			
		||||
        this.offeredAmount = offeredAmount;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -16,38 +16,38 @@ public class DeckHelper{
 | 
			
		||||
 | 
			
		||||
    public DeckHelper() {
 | 
			
		||||
        cards = new LinkedList<Card>();
 | 
			
		||||
        cards.add(new Card("Du wurdest mit einem Dienst KFZ geblitzt. Zahle: 800 EUR", "dienst-kfz-blitzer"));
 | 
			
		||||
        cards.add(new Card("Du wurdest mit einem Dienst KFZ geblitzt. Zahle 800 EUR", "dienst-kfz-blitzer"));
 | 
			
		||||
        cards.add(new Card("Die erste Spoparty steht bevor. Ziehe vor zum 23er.", "spoparty"));
 | 
			
		||||
        cards.add(new Card("Du kommst aus dem Gulak frei.", "gulak-frei-1"));
 | 
			
		||||
        cards.add(new Card("Du kommst aus dem Gulak frei.", "gulak-frei-2"));
 | 
			
		||||
        cards.add(new Card("Du kommst aus dem Gulak frei!", "gulak-frei-1"));
 | 
			
		||||
        cards.add(new Card("Du kommst aus dem Gulak frei!", "gulak-frei-2"));
 | 
			
		||||
        cards.add(new Card("Du hast den Dienstführerschein bestanden. Ziehe vor bis Teststrecke.", "dienstfuehrerschein"));
 | 
			
		||||
        cards.add(new Card("Malkmus läd zum Pubquiz ein. Rücke vor bis zum 20er.", "pubquiz"));
 | 
			
		||||
        cards.add(new Card("Du warst ohne Namensschild in der Truppenküche. Rücke vor zum 10er. Gehe nicht über Monatsgehalt. Ziehe keine 2000x EUR ein.", "namensschild-truppenkueche"));
 | 
			
		||||
        cards.add(new Card("Du hast heute die Spendierhosen an und gibst eine Runde in der Unibar. Zahle jedem Spieler: 400 EUR", "spendierhosen-unibar"));
 | 
			
		||||
        cards.add(new Card("Du warst ohne Namensschild in der Truppenküche. Rücke vor zum 10er. Gehe nicht über Monatsgehalt. Ziehe keine 2000 EUR ein.", "namensschild-truppenkueche"));
 | 
			
		||||
        cards.add(new Card("Du hast heute die Spendierhosen an und gibst eine Runde in der Unibar. Zahle jedem Spieler 400 EUR", "spendierhosen-unibar"));
 | 
			
		||||
        cards.add(new Card("Du warst in der Prüfungsphase krank. Gehe 3 Felder zurück.", "pruefungsphase-krank"));
 | 
			
		||||
        cards.add(new Card("Ziehe vor bis zum nächsten Monatsgehalt.", "naechstes-monatsgehalt"));
 | 
			
		||||
        cards.add(new Card("Du hast ein Antreten verschlafen. Zahle: 500 EUR", "antreten-verschlafen-1"));
 | 
			
		||||
        cards.add(new Card("Du hast den Maibock organisiert. Du erhältst: 3000 EUR", "maibock-organisiert"));
 | 
			
		||||
        cards.add(new Card("Der Spieß macht eine unangekündigte Inventur. Zahle für jedes Haus: 400 EUR und jedes Hotel: 2800 EUR", "inventur-haeuser-hotels"));
 | 
			
		||||
        cards.add(new Card("Es gab keine Mozzarella Bällchen mehr für Thoma. Alle Spieler ziehen vor auf Gym.", "dienstsport-gym"));
 | 
			
		||||
        cards.add(new Card("Auf deiner Stube wurde Schimmel gefunden. Gehe ins Gulak. Begib Dich direkt dorthin. Gehe nicht über Monatsgehalt. Ziehe nicht ein.", "schimmel-gulak"));
 | 
			
		||||
        cards.add(new Card("Deine Stube ist nach einer Partynacht nicht mehr bewohnbar. Du ziehst ins Gulak. Begib Dich direkt dorthin. Gehe nicht über Monatsgehalt. Ziehe nicht ein.", "partynacht-gulak"));
 | 
			
		||||
        cards.add(new Card("Du hast ein Antreten verschlafen. Zahle 500 EUR", "antreten-verschlafen-1"));
 | 
			
		||||
        cards.add(new Card("Du hast den Maibock organisiert. Du erhältst 3000 EUR", "maibock-organisiert"));
 | 
			
		||||
        cards.add(new Card("Der Spieß macht eine unangekündigte Inventur. Zahle für jedes Haus 400 EUR und für jedes Hotel 2800 EUR", "inventur-haeuser-hotels"));
 | 
			
		||||
        cards.add(new Card("Es gab keine Mozzarella-Bällchen mehr für Thoma. Alle Spieler rücken vor bis aufs Gym.", "dienstsport-gym"));
 | 
			
		||||
        cards.add(new Card("Auf deiner Stube wurde Schimmel gefunden. Gehe ins Gulak. Begib dich direkt dorthin. Gehe nicht über Monatsgehalt. Ziehe nicht 2000 EUR ein.", "schimmel-gulak"));
 | 
			
		||||
        cards.add(new Card("Deine Stube ist nach einer Partynacht nicht mehr bewohnbar. Du ziehst ins Gulak. Begib dich direkt dorthin. Gehe nicht über Monatsgehalt. Ziehe nicht 2000 EUR ein.", "partynacht-gulak"));
 | 
			
		||||
        cards.add(new Card("Das Jahresabschlussantreten steht an. Ziehe vor bis Schwimmhalle.", "jahresabschlussantreten"));
 | 
			
		||||
        cards.add(new Card("Du wurdest beim Verkaufen von Versicherungen erwischt. Zahle: 4000 EUR", "verkaufen-versicherungen"));
 | 
			
		||||
        cards.add(new Card("Du wurdest beim Verkaufen von Versicherungen erwischt. Zahle 4000 EUR", "verkaufen-versicherungen"));
 | 
			
		||||
        cards.add(new Card("Du musstest einen Rückstuferantrag stellen. Setze eine Runde aus.", "rueckstuferantrag"));
 | 
			
		||||
        cards.add(new Card("Auf einer Hausfeier bist du betrunken auf der Treppe gestürzt und dabei auf einen Kameraden gefallen. Zahle: 800 EUR und gehe zurück zu SanZ.", "hausfeier-sturz"));
 | 
			
		||||
        cards.add(new Card("Beförderung. Beim nächsten Monatsgehalt ziehst du ein: 3000 EUR", "befoerderung"));
 | 
			
		||||
        cards.add(new Card("Du entscheidest dich für eine Dienstreise nach Lourd. Zahle: 1000 EUR und setze eine Runde aus.", "dienstreise-lourd"));
 | 
			
		||||
        cards.add(new Card("Auf einer Hausfeier bist du betrunken auf der Treppe gestürzt und dabei auf einen Kameraden gefallen. Zahle 800 EUR und gehe zurück zum SanZ.", "hausfeier-sturz"));
 | 
			
		||||
        cards.add(new Card("Beförderung. Beim nächsten Monatsgehalt ziehst du 3000 EUR ein", "befoerderung"));
 | 
			
		||||
        cards.add(new Card("Du entscheidest dich für eine Dienstreise nach Lourd. Zahle 1000 EUR und setze eine Runde aus.", "dienstreise-lourd"));
 | 
			
		||||
        cards.add(new Card("Du warst fleißig Blutspenden und erhältst einen Tag Sonderurlaub. Du bist nochmal an der Reihe.", "blutspenden-sonderurlaub"));
 | 
			
		||||
        cards.add(new Card("Dir wurde auf dem Oktoberfest dein Geldbeutel geklaut. Gebe 10% deines Vermögens ab.", "geldbeutel-oktoberfest"));
 | 
			
		||||
        cards.add(new Card("Du wirst von deinem Chef für vorbildliches Verhalten gelobt. Du erhältst: 4000 EUR", "lob-chef"));
 | 
			
		||||
        cards.add(new Card("Deine Bekanntschaft von letzter Nacht war eine Spo. Lasse dich testen und zahle: 200 EUR", "spo-testen"));
 | 
			
		||||
        cards.add(new Card("Du wurdest von Kranz geexmattet. Gehe zurück zu Prüfungsamt.", "kranz-exmatrikulation"));
 | 
			
		||||
        cards.add(new Card("Du wirst von deinem Chef für vorbildliches Verhalten gelobt. Du erhältst 4000 EUR", "lob-chef"));
 | 
			
		||||
        cards.add(new Card("Deine Bekanntschaft von letzter Nacht war eine Spo. Lasse dich testen und zahle 200 EUR", "spo-testen"));
 | 
			
		||||
        cards.add(new Card("Du wurdest von Kranz geexmattet. Gehe zurück zum Prüfungsamt.", "kranz-exmatrikulation"));
 | 
			
		||||
        cards.add(new Card("Die letzte Party ist ein wenig eskaliert. Setze eine Runde aus.", "party-eskaliert"));
 | 
			
		||||
        cards.add(new Card("Du wurdest zur VP gewählt und schmeißt eine Einstandsparty. Zahle: 800 EUR", "vp-einstandsparty"));
 | 
			
		||||
        cards.add(new Card("Du hast eine Party veranstaltet und dick Gewinn gemacht. Ziehe ein: 1500 EUR", "party-gewinn"));
 | 
			
		||||
        cards.add(new Card("Du wurdest zur VP gewählt und schmeißt eine Einstandsparty. Zahle 800 EUR", "vp-einstandsparty"));
 | 
			
		||||
        cards.add(new Card("Du hast eine Party veranstaltet und dick Gewinn gemacht. Ziehe 1500 EUR ein", "party-gewinn"));
 | 
			
		||||
        cards.add(new Card("Zur falschen Zeit am falschen Ort. Du musst einen Bergmarsch planen und setzt eine Runde aus.", "bergmarsch"));
 | 
			
		||||
        cards.add(new Card("Dein Jodel eines Eispenis mit Unterhodenbeleuchtung geht viral. Ziehe ein: 1000 EUR", "jodel-eispenis"));
 | 
			
		||||
        cards.add(new Card("Dein Jodel eines Eispenis mit Unterhodenbeleuchtung geht viral. Ziehe 1000 EUR ein", "jodel-eispenis"));
 | 
			
		||||
 | 
			
		||||
        shuffle();
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user