Compare commits

..

No commits in common. "f6137b8b689ac882eb66aa2a6b71f7ff4d656e42" and "a70295f1ffe3fb68b8c947112bd4121b4aa166fb" have entirely different histories.

11 changed files with 194 additions and 176 deletions

View File

@ -9,11 +9,6 @@ import com.simsilica.lemur.style.ElementId;
import pp.dialog.Dialog; import pp.dialog.Dialog;
import pp.monopoly.client.MonopolyApp; import pp.monopoly.client.MonopolyApp;
import pp.monopoly.client.gui.SettingsMenu; 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; import pp.monopoly.notification.Sound;
/** /**
@ -23,13 +18,11 @@ public class ConfirmTrade extends Dialog {
private final MonopolyApp app; private final MonopolyApp app;
private final Container confirmTradeContainer; private final Container confirmTradeContainer;
private final Container backgroundContainer; private final Container backgroundContainer;
private TradeHandler tradeHandler;
public ConfirmTrade(MonopolyApp app) { public ConfirmTrade(MonopolyApp app) {
super(app.getDialogManager()); super(app.getDialogManager());
this.app = app; this.app = app;
tradeHandler = app.getGameLogic().getTradeHandler();
// Create the background container // Create the background container
backgroundContainer = new Container(); backgroundContainer = new Container();
@ -47,32 +40,20 @@ public class ConfirmTrade extends Dialog {
title.setFontSize(48); title.setFontSize(48);
title.setColor(ColorRGBA.Black); 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 // Text, der auf der Karte steht
// Die Werte werden dem Handel entnommen (Iwas auch immer da dann ist) // Die Werte werden dem Handel entnommen (Iwas auch immer da dann ist)
Container propertyValuesContainer = confirmTradeContainer.addChild(new Container()); Container propertyValuesContainer = confirmTradeContainer.addChild(new Container());
propertyValuesContainer.addChild(new Label("„Spieler " + tradeHandler.getSender().getName() + " möchte:", new ElementId("label-Text"))); propertyValuesContainer.addChild(new Label("„Spieler XXX möchte:", new ElementId("label-Text"))); //TODO hier überall die entsprechenden Variablen einfügen
propertyValuesContainer.addChild(new Label("", new ElementId("label-Text")));// Leerzeile propertyValuesContainer.addChild(new Label("", new ElementId("label-Text")));// Leerzeile
propertyValuesContainer.addChild(new Label("- " + offeredProperties, new ElementId("label-Text"))); propertyValuesContainer.addChild(new Label("- XXX Gebäude", new ElementId("label-Text")));
propertyValuesContainer.addChild(new Label("- " + tradeHandler.getOfferedAmount() + " EUR", new ElementId("label-Text"))); propertyValuesContainer.addChild(new Label("- XXX EUR", new ElementId("label-Text")));
propertyValuesContainer.addChild(new Label("- " + tradeHandler.getOfferedJailCards() +" Sonderkaten", new ElementId("label-Text"))); propertyValuesContainer.addChild(new Label("- XXX Sonderkaten", new ElementId("label-Text")));
propertyValuesContainer.addChild(new Label("", new ElementId("label-Text")));// Leerzeile propertyValuesContainer.addChild(new Label("", new ElementId("label-Text")));// Leerzeile
propertyValuesContainer.addChild(new Label("gegen:", 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("", new ElementId("label-Text")));// Leerzeile
propertyValuesContainer.addChild(new Label("- "+ requestedProperties, new ElementId("label-Text"))); propertyValuesContainer.addChild(new Label("- XXX Gebäude", new ElementId("label-Text")));
propertyValuesContainer.addChild(new Label("- "+ tradeHandler.getRequestedAmount() +" EUR", new ElementId("label-Text"))); propertyValuesContainer.addChild(new Label("- XXX EUR", new ElementId("label-Text")));
propertyValuesContainer.addChild(new Label("- "+ tradeHandler.getRequestedJailCards() +" Sonderkaten", new ElementId("label-Text"))); propertyValuesContainer.addChild(new Label("- XXX Sonderkaten", new ElementId("label-Text")));
propertyValuesContainer.addChild(new Label("", new ElementId("label-Text")));// Leerzeile propertyValuesContainer.addChild(new Label("", new ElementId("label-Text")));// Leerzeile
propertyValuesContainer.addChild(new Label("tauschen, willst du das Angebot annehmen?", 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))); propertyValuesContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));
@ -82,24 +63,19 @@ public class ConfirmTrade extends Dialog {
declineButton.setFontSize(32); declineButton.setFontSize(32);
declineButton.addClickCommands(s -> ifTopDialog(() -> { //TODO Buttonfunktion prüfen declineButton.addClickCommands(s -> ifTopDialog(() -> { //TODO Buttonfunktion prüfen
app.getGameLogic().playSound(Sound.BUTTON); app.getGameLogic().playSound(Sound.BUTTON);
app.getGameLogic().send(new TradeResponse(false, tradeHandler));
close(); close();
})); }));
// Verhandeln-Button // Verhandeln-Button
Button negotiateButton = confirmTradeContainer.addChild(new Button("Verhandeln", new ElementId("button"))); Button negotiateButton = confirmTradeContainer.addChild(new Button("Verhandeln", new ElementId("button")));
negotiateButton.setFontSize(32); negotiateButton.setFontSize(32);
negotiateButton.addClickCommands(s -> ifTopDialog( () -> { negotiateButton.addClickCommands(s -> ifTopDialog( () -> { //TODO Buttonfunktion prüfen
app.getGameLogic().playSound(Sound.BUTTON); app.getGameLogic().playSound(Sound.BUTTON);
close();
new TradeMenu(app, new TradeHandler(app.getGameLogic().getPlayerHandler().getPlayerById(app.getId()))).open();
})); }));
// Confirm-Button // Confirm-Button
Button confirmButton = confirmTradeContainer.addChild(new Button("Bestätigen", new ElementId("button"))); Button confirmButton = confirmTradeContainer.addChild(new Button("Bestätigen", new ElementId("button")));
confirmButton.setFontSize(32); confirmButton.setFontSize(32);
confirmButton.addClickCommands(s -> ifTopDialog( () -> { confirmButton.addClickCommands(s -> ifTopDialog( () -> { //TODO Buttonfunktion prüfen
app.getGameLogic().playSound(Sound.BUTTON); app.getGameLogic().playSound(Sound.BUTTON);
app.getGameLogic().send(new TradeResponse(true, tradeHandler));
close();
})); }));
// Zentriere das Menü // Zentriere das Menü

View File

@ -14,7 +14,6 @@ import com.simsilica.lemur.component.QuadBackgroundComponent;
import com.simsilica.lemur.style.ElementId; import com.simsilica.lemur.style.ElementId;
import pp.dialog.Dialog; import pp.dialog.Dialog;
import pp.monopoly.client.MonopolyApp; import pp.monopoly.client.MonopolyApp;
import pp.monopoly.notification.Sound;
public class LooserPopUp extends Dialog { public class LooserPopUp extends Dialog {
private final MonopolyApp app; private final MonopolyApp app;
@ -68,13 +67,10 @@ public class LooserPopUp extends Dialog {
imageLabel.setIcon(icon); imageLabel.setIcon(icon);
imageContainer.addChild(imageLabel); // Add the image label to the container imageContainer.addChild(imageLabel); // Add the image label to the container
//Beenden Button // Beenden-Button
Button quitButton = LooserContainer.addChild(new Button("Spiel Beenden", new ElementId("button"))); Button quitButton = LooserContainer.addChild(new Button("Spiel beenden", new ElementId("button")));
quitButton.setFontSize(32); quitButton.setFontSize(32);
quitButton.addClickCommands(s -> ifTopDialog(() -> { quitButton.addClickCommands(source -> close());
app.getGameLogic().playSound(Sound.BUTTON);
app.closeApp();
}));
// Zentriere das Popup // Zentriere das Popup

View File

@ -25,7 +25,7 @@ public class Rent extends Dialog {
private final Container backgroundContainer; private final Container backgroundContainer;
private int index = 21; // TODO fixed for testing private int index = 37; // TODO fixed for testing

View File

@ -14,7 +14,6 @@ import com.simsilica.lemur.component.QuadBackgroundComponent;
import com.simsilica.lemur.style.ElementId; import com.simsilica.lemur.style.ElementId;
import pp.dialog.Dialog; import pp.dialog.Dialog;
import pp.monopoly.client.MonopolyApp; import pp.monopoly.client.MonopolyApp;
import pp.monopoly.notification.Sound;
public class WinnerPopUp extends Dialog { public class WinnerPopUp extends Dialog {
private final MonopolyApp app; private final MonopolyApp app;
@ -68,13 +67,11 @@ public class WinnerPopUp extends Dialog {
imageLabel.setIcon(icon); imageLabel.setIcon(icon);
imageContainer.addChild(imageLabel); // Add the image label to the container imageContainer.addChild(imageLabel); // Add the image label to the container
// Beenden-Button
Button quitButton = WinnerContainer.addChild(new Button("Spiel Beenden", new ElementId("button"))); Button quitButton = WinnerContainer.addChild(new Button("Spiel beenden", new ElementId("button")));
quitButton.setFontSize(32); quitButton.setFontSize(32);
quitButton.addClickCommands(s -> ifTopDialog(() -> { quitButton.addClickCommands(source -> close());
app.getGameLogic().playSound(Sound.BUTTON);
app.closeApp();
}));
// Zentriere das Popup // Zentriere das Popup
WinnerContainer.setLocalTranslation( WinnerContainer.setLocalTranslation(

View File

@ -22,7 +22,6 @@ import pp.monopoly.message.server.TradeRequest;
import pp.monopoly.message.server.ViewAssetsResponse; import pp.monopoly.message.server.ViewAssetsResponse;
import pp.monopoly.model.Board; import pp.monopoly.model.Board;
import pp.monopoly.model.IntPoint; import pp.monopoly.model.IntPoint;
import pp.monopoly.model.TradeHandler;
import pp.monopoly.model.fields.BoardManager; import pp.monopoly.model.fields.BoardManager;
import pp.monopoly.notification.ClientStateEvent; import pp.monopoly.notification.ClientStateEvent;
import pp.monopoly.notification.DiceRollEvent; import pp.monopoly.notification.DiceRollEvent;
@ -62,8 +61,6 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker {
private BoardManager boardManager = new BoardManager(); private BoardManager boardManager = new BoardManager();
private TradeHandler tradeHandler;
/** /**
* Constructs a ClientGameLogic with the specified sender object. * Constructs a ClientGameLogic with the specified sender object.
@ -116,10 +113,6 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker {
return board; return board;
} }
public TradeHandler getTradeHandler() {
return tradeHandler;
}
/** /**
* Moves the preview figure to the specified position. * Moves the preview figure to the specified position.
* *
@ -307,11 +300,13 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker {
*/ */
@Override @Override
public void received(TradeReply msg) { public void received(TradeReply msg) {
if (msg.isAccepted()) { // if (msg.getTradeHandler().getStatus()) {
playSound(Sound.TRADE_ACCEPTED);
} else { // playSound(Sound.TRADE_ACCEPTED);
playSound(Sound.TRADE_REJECTED); // } else {
}
// playSound(Sound.TRADE_REJECTED);
// }
} }
/** /**
@ -321,7 +316,7 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker {
*/ */
@Override @Override
public void received(TradeRequest msg) { public void received(TradeRequest msg) {
tradeHandler = msg.getTradeHandler(); System.out.println("Angebot angekommen");
notifyListeners(new PopUpEvent("tradeRequest")); notifyListeners(new PopUpEvent("tradeRequest"));
} }

View File

@ -8,10 +8,10 @@
package pp.monopoly.game.server; package pp.monopoly.game.server;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
import java.util.Set;
import javax.swing.JInternalFrame;
import com.jme3.network.serializing.Serializable; import com.jme3.network.serializing.Serializable;
@ -43,7 +43,7 @@ public class Player implements FieldVisitor<Void>{
private String name; private String name;
private int accountBalance = 15000; private int accountBalance = 15000;
private Figure figure; private Figure figure;
private Set<Integer> properties = new HashSet<>(); private List<Integer> properties = new ArrayList<>();
private int getOutOfJailCard; private int getOutOfJailCard;
private int fieldID; private int fieldID;
private DiceResult rollResult; private DiceResult rollResult;
@ -189,7 +189,7 @@ public class Player implements FieldVisitor<Void>{
* @return List of all properties owned by this player * @return List of all properties owned by this player
*/ */
public List<Integer> getProperties() { public List<Integer> getProperties() {
return new ArrayList<>(properties); return properties;
} }
/** /**
@ -578,17 +578,8 @@ DiceResult rollDice() {
} }
} }
@Override @Override
public String toString() { public String toString() {
return "Player{name=" + name + ", figure=" + figure + "}"; return "Player{name=" + name + ", figure=" + figure + "}";
} }
public void addProperty(Integer id) {
properties.add(id);
}
public void removeProperty(Integer id) {
properties.remove(id);
}
} }

View File

@ -2,10 +2,6 @@ package pp.monopoly.game.server;
import java.lang.System.Logger; import java.lang.System.Logger;
import java.lang.System.Logger.Level; 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.MonopolyConfig;
import pp.monopoly.message.client.BuyPropertyResponse; import pp.monopoly.message.client.BuyPropertyResponse;
@ -25,7 +21,6 @@ import pp.monopoly.message.server.TradeRequest;
import pp.monopoly.message.server.ViewAssetsResponse; import pp.monopoly.message.server.ViewAssetsResponse;
import pp.monopoly.model.Figure; import pp.monopoly.model.Figure;
import pp.monopoly.model.Rotation; import pp.monopoly.model.Rotation;
import pp.monopoly.model.TradeHandler;
import pp.monopoly.model.card.DeckHelper; import pp.monopoly.model.card.DeckHelper;
import pp.monopoly.model.fields.BoardManager; import pp.monopoly.model.fields.BoardManager;
import pp.monopoly.model.fields.PropertyField; import pp.monopoly.model.fields.PropertyField;
@ -253,76 +248,15 @@ public class ServerGameLogic implements ClientInterpreter {
*/ */
@Override @Override
public void received(TradeResponse msg, int from) { public void received(TradeResponse msg, int from) {
Player responder = playerHandler.getPlayerById(from);
Player initiator = playerHandler.getPlayerById(msg.getInitiatorId());
TradeHandler tradeHandler = msg.getTradeHandler(); if (responder != null && initiator != null) {
LOGGER.log(Level.INFO, "Player {0} responded to trade with player {1}", responder.getName(), initiator.getName());
Player receiver = playerHandler.getPlayerById(tradeHandler.getReceiver().getId()); send(initiator, new TradeReply(msg.getInitiatorId(), msg.getTradeHandler()));
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 (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. * Handles a ViewAssetsRequest message, sending the player a response containing their assets.
* *

View File

@ -9,7 +9,7 @@ import pp.monopoly.model.TradeHandler;
*/ */
@Serializable @Serializable
public class TradeResponse extends ClientMessage{ public class TradeResponse extends ClientMessage{
private boolean status; private int initiatorId;
private TradeHandler tradeHandler; private TradeHandler tradeHandler;
/** /**
@ -20,15 +20,15 @@ public class TradeResponse extends ClientMessage{
/** /**
* Constructs a TradeResponse with the specified response details. * Constructs a TradeResponse with the specified response details.
* *
* @param status the ID of the player who initiated the trade * @param initiatorId the ID of the player who initiated the trade
* @param accepted true if the offer is accepted, false if declined * @param accepted true if the offer is accepted, false if declined
*/ */
public TradeResponse(boolean status, TradeHandler tradeHandler) { public TradeResponse(int initiatorId, TradeHandler tradeHandler) {
this.status = status; this.initiatorId = initiatorId;
this.tradeHandler = tradeHandler; this.tradeHandler = tradeHandler;
} }
public boolean isAccepted() { return status; } public int getInitiatorId() { return initiatorId; }
public TradeHandler getTradeHandler() { public TradeHandler getTradeHandler() {
return tradeHandler; return tradeHandler;
} }

View File

@ -9,7 +9,7 @@ import pp.monopoly.model.TradeHandler;
*/ */
@Serializable @Serializable
public class TradeReply extends ServerMessage{ public class TradeReply extends ServerMessage{
private boolean status; private int initiatorId;
private TradeHandler tradeHandler; private TradeHandler tradeHandler;
/** /**
@ -20,15 +20,15 @@ public class TradeReply extends ServerMessage{
/** /**
* Constructs a TradeResponse with the specified response details. * Constructs a TradeResponse with the specified response details.
* *
* @param status the ID of the player who initiated the trade * @param initiatorId the ID of the player who initiated the trade
* @param accepted true if the offer is accepted, false if declined * @param accepted true if the offer is accepted, false if declined
*/ */
public TradeReply(boolean status, TradeHandler tradeHandler) { public TradeReply(int initiatorId, TradeHandler tradeHandler) {
this.status = status; this.initiatorId = initiatorId;
this.tradeHandler = tradeHandler; this.tradeHandler = tradeHandler;
} }
public boolean isAccepted() { return status; } public int getInitiatorId() { return initiatorId; }
public TradeHandler getTradeHandler() { public TradeHandler getTradeHandler() {
return tradeHandler; return tradeHandler;
} }

View File

@ -100,6 +100,135 @@ public class TradeHandler {
return sender; 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) { public void setOfferedAmount(int offeredAmount) {
this.offeredAmount = offeredAmount; this.offeredAmount = offeredAmount;
} }

View File

@ -16,38 +16,38 @@ public class DeckHelper{
public DeckHelper() { public DeckHelper() {
cards = new LinkedList<Card>(); 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("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-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-2"));
cards.add(new Card("Du hast den Dienstführerschein bestanden. Ziehe vor bis Teststrecke.", "dienstfuehrerschein")); 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("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 2000 EUR ein.", "namensschild-truppenkueche")); 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 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("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("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 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("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("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 rücken vor bis aufs Gym.", "dienstsport-gym")); 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 2000 EUR ein.", "schimmel-gulak")); 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 2000 EUR ein.", "partynacht-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("Das Jahresabschlussantreten steht an. Ziehe vor bis Schwimmhalle.", "jahresabschlussantreten")); 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("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 zum SanZ.", "hausfeier-sturz")); 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 3000 EUR ein", "befoerderung")); 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("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("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("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("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("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("Du wurdest von Kranz geexmattet. Gehe zurück zu 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("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 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("Du hast eine Party veranstaltet und dick Gewinn gemacht. Ziehe ein: 1500 EUR", "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("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 1000 EUR ein", "jodel-eispenis")); cards.add(new Card("Dein Jodel eines Eispenis mit Unterhodenbeleuchtung geht viral. Ziehe ein: 1000 EUR", "jodel-eispenis"));
shuffle(); shuffle();
} }