diff --git a/.classpath b/.classpath
deleted file mode 100644
index 002ad570e..000000000
--- a/.classpath
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/main/java/net/sf/rails/algorithms/NetworkVertex.java b/src/main/java/net/sf/rails/algorithms/NetworkVertex.java
index 84f70cafa..c16cb96c5 100644
--- a/src/main/java/net/sf/rails/algorithms/NetworkVertex.java
+++ b/src/main/java/net/sf/rails/algorithms/NetworkVertex.java
@@ -135,6 +135,10 @@ public boolean isMajor(){
public boolean isMinor(){
return (stationType != null && stationType == StationType.MINOR);
}
+
+ public boolean isMine( ) {
+ return (stationType != null && stationType == StationType.COALMINE);
+ }
public boolean isMine( ) {
return (stationType != null && stationType == StationType.COALMINE);
diff --git a/src/main/java/net/sf/rails/game/OperatingRound.java b/src/main/java/net/sf/rails/game/OperatingRound.java
index df6c54319..9032541e8 100644
--- a/src/main/java/net/sf/rails/game/OperatingRound.java
+++ b/src/main/java/net/sf/rails/game/OperatingRound.java
@@ -294,6 +294,12 @@ public boolean process(PossibleAction action) {
&& ((UseSpecialProperty) selectedAction).getSpecialProperty() instanceof SpecialRight) {
result = buyRight((UseSpecialProperty) selectedAction);
+
+ } else if (selectedAction instanceof UseSpecialProperty
+ && ((UseSpecialProperty) selectedAction).getSpecialProperty() instanceof ExchangeForShare) {
+
+ useSpecialProperty((UseSpecialProperty)selectedAction);
+
} else if (selectedAction instanceof UseSpecialProperty
&& ((UseSpecialProperty) selectedAction).getSpecialProperty() instanceof ExchangeForShare) {
@@ -332,6 +338,82 @@ public boolean process(PossibleAction action) {
return result;
}
+
+ public boolean useSpecialProperty(UseSpecialProperty action) {
+
+ SpecialProperty sp = action.getSpecialProperty();
+
+ if (sp instanceof ExchangeForShare) {
+
+ return executeExchangeForShare(action, (ExchangeForShare) sp);
+
+ } else {
+ return false;
+ }
+ }
+
+ public boolean executeExchangeForShare (UseSpecialProperty action, ExchangeForShare sp) {
+
+ PublicCompany publicCompany =
+ companyManager.getPublicCompany(sp.getPublicCompanyName());
+ PrivateCompany privateCompany = (PrivateCompany)sp.getOriginalCompany();
+ Owner owner= privateCompany.getOwner();
+ Player player = null;
+ String errMsg = null;
+ boolean ipoHasShare = ipo.getShare(publicCompany) >= sp.getShare();
+ boolean poolHasShare = pool.getShare(publicCompany) >= sp.getShare();
+
+ while (true) {
+
+ /* Check if the private is owned by a player */
+ if (!(owner instanceof Player)) {
+ errMsg =
+ LocalText.getText("PrivateIsNotOwnedByAPlayer",
+ privateCompany.getId());
+ break;
+ }
+
+ player = (Player) owner;
+
+ /* Check if a share is available */
+ if (!ipoHasShare && !poolHasShare) {
+ errMsg =
+ LocalText.getText("NoSharesAvailable",
+ publicCompany.getId());
+ break;
+ }
+
+ break;
+ }
+ if (errMsg != null) {
+ DisplayBuffer.add(this, LocalText.getText(
+ "CannotSwapPrivateForCertificate",
+ player.getId(),
+ privateCompany.getId(),
+ sp.getShare(),
+ publicCompany.getId(),
+ errMsg ));
+ return false;
+ }
+
+
+
+ Certificate cert =
+ ipoHasShare ? ipo.findCertificate(publicCompany,
+ false) : pool.findCertificate(publicCompany,
+ false);
+ cert.moveTo(player);
+ ReportBuffer.add(this, LocalText.getText("SwapsPrivateForCertificate",
+ player.getId(),
+ privateCompany.getId(),
+ sp.getShare(),
+ publicCompany.getId()));
+ sp.setExercised();
+ privateCompany.setClosed();
+
+ return true;
+ }
+
public boolean useSpecialProperty(UseSpecialProperty action) {
@@ -2533,7 +2615,7 @@ public void payout(int amount) {
recipient.getId(), partText, shares,
operatingCompany.value().getShareUnit()));
}
-
+
// Move the token
operatingCompany.value().payout(amount);
diff --git a/src/main/java/net/sf/rails/game/financial/NationalFormationRound.java b/src/main/java/net/sf/rails/game/financial/NationalFormationRound.java
index 2ffe2ee68..26b05974b 100644
--- a/src/main/java/net/sf/rails/game/financial/NationalFormationRound.java
+++ b/src/main/java/net/sf/rails/game/financial/NationalFormationRound.java
@@ -37,7 +37,6 @@ public class NationalFormationRound extends StockRound {
public NationalFormationRound(GameManager parent, String id) {
super(parent, id);
- // TODO Auto-generated constructor stub
}
@@ -488,7 +487,7 @@ protected void finishRound() {
@Override
public String toString() {
- return "1837 KuKFormationRound";
+ return "1837 NationalFormationRound";
}
}
diff --git a/src/main/java/net/sf/rails/game/financial/PlayerShareUtils.java b/src/main/java/net/sf/rails/game/financial/PlayerShareUtils.java
index da7f83c60..4e6237032 100644
--- a/src/main/java/net/sf/rails/game/financial/PlayerShareUtils.java
+++ b/src/main/java/net/sf/rails/game/financial/PlayerShareUtils.java
@@ -93,11 +93,11 @@ private static SortedSet presidentSellMultiple(PublicCompany company, P
int potentialShareNumber = potential.getPortfolioModel().getShare(company);
int shareNumberDumpDifference = presidentShareNumber - potentialShareNumber;
boolean presidentShareOnly = false;
-
+
if (presidentCert.getShare() == presidentShareNumber) { // Only President Share to be sold...
presidentShareOnly = true;
}
-
+
// ... if this is less than what the pool allows => goes back to non-president selling
int poolAllows = poolAllowsShareNumbers(company);
if ((shareNumberDumpDifference <= poolAllows) && (!presidentShareOnly)) {
diff --git a/src/main/java/net/sf/rails/game/financial/StockRound.java b/src/main/java/net/sf/rails/game/financial/StockRound.java
index 7053177d6..449e4908e 100644
--- a/src/main/java/net/sf/rails/game/financial/StockRound.java
+++ b/src/main/java/net/sf/rails/game/financial/StockRound.java
@@ -552,6 +552,7 @@ public void setSellableShares() {
continue;
}
+ //For a president certificate only the number is 2.. but it may also be 2 if the player has more than just the president certificate..
for (int i = 1; i <= number; i++) {
if (checkIfSplitSaleOfPresidentAllowed()) {
// check if selling would dump the company
diff --git a/src/main/java/net/sf/rails/game/model/CertificatesModel.java b/src/main/java/net/sf/rails/game/model/CertificatesModel.java
index 1128cb8c2..84b3f6928 100644
--- a/src/main/java/net/sf/rails/game/model/CertificatesModel.java
+++ b/src/main/java/net/sf/rails/game/model/CertificatesModel.java
@@ -99,7 +99,7 @@ ImmutableMultimap getCertificatesByType(PublicCompany
SortedMultiset getCertificateTypeCounts(PublicCompany company) {
ImmutableSortedMultiset.Builder certCount = ImmutableSortedMultiset.naturalOrder();
for (PublicCertificate cert : getCertificates(company)) {
- if (!cert.isPresidentShare()) {
+ if (!cert.isPresidentShare()) {
certCount.add(cert.getShares());
}
}
diff --git a/src/main/java/net/sf/rails/game/specific/_1835/StockRound_1835.java b/src/main/java/net/sf/rails/game/specific/_1835/StockRound_1835.java
index b749118e0..52cbe872b 100644
--- a/src/main/java/net/sf/rails/game/specific/_1835/StockRound_1835.java
+++ b/src/main/java/net/sf/rails/game/specific/_1835/StockRound_1835.java
@@ -124,7 +124,7 @@ protected int getBuyPrice (BuyCertificate action, StockSpace currentSpace) {
}
// The sell-in-same-turn-at-decreasing-price option does not apply here
-
+
// change: check exactly how it differs here
// requires: do a parameterization
@Override
@@ -246,11 +246,11 @@ public boolean done(NullAction action, String playerName,
/* (non-Javadoc)
* @see net.sf.rails.game.StockRound#mayPlayerSellShareOfCompany(net.sf.rails.game.PublicCompany)
- */
+ */
@Override
public boolean mayPlayerSellShareOfCompany(PublicCompany company) {
- if (!super.mayPlayerSellShareOfCompany(company) )
- {
+ if (!super.mayPlayerSellShareOfCompany(company) )
+ {
return false;
}
else {
@@ -259,13 +259,13 @@ public boolean mayPlayerSellShareOfCompany(PublicCompany company) {
* But if he has sold a share in this round he is allowed to sell dump the presidency...
*
* */
- if (company.getPresident() == currentPlayer) {
+ if (company.getPresident() == currentPlayer) {
if (PlayerShareUtils.poolAllowsShareNumbers(company) >1) return true;
}
}
return true;
}
-
+
@Override
protected boolean checkIfSplitSaleOfPresidentAllowed() {
// in 1835 its not allowed to Split the President Certificate on sale
@@ -278,5 +278,5 @@ protected void setPriority(String string) {
super.setPriority(string);
}
}
-
+
}
diff --git a/src/main/java/net/sf/rails/game/specific/_1837/GameManager_1837.java b/src/main/java/net/sf/rails/game/specific/_1837/GameManager_1837.java
index e04394b78..39ce6807e 100644
--- a/src/main/java/net/sf/rails/game/specific/_1837/GameManager_1837.java
+++ b/src/main/java/net/sf/rails/game/specific/_1837/GameManager_1837.java
@@ -8,17 +8,19 @@
import net.sf.rails.common.GuiDef;
import net.sf.rails.game.GameManager;
+import net.sf.rails.game.NationalFormationRound;
+import net.sf.rails.game.OperatingRound;
import net.sf.rails.game.Phase;
import net.sf.rails.game.Player;
import net.sf.rails.game.RailsRoot;
import net.sf.rails.game.Round;
import net.sf.rails.game.StartPacket;
import net.sf.rails.game.StartRound;
-import net.sf.rails.game.OperatingRound;
-import net.sf.rails.game.financial.NationalFormationRound;
+import net.sf.rails.game.specific._1837.OperatingRound_1837;
+import net.sf.rails.game.specific._18EU.FinalMinorExchangeRound;
+import net.sf.rails.game.state.BooleanState;
import net.sf.rails.game.state.GenericState;
import net.sf.rails.game.state.IntegerState;
-import net.sf.rails.game.state.BooleanState;
diff --git a/src/main/java/net/sf/rails/game/specific/_1837/OperatingRound_1837.java b/src/main/java/net/sf/rails/game/specific/_1837/OperatingRound_1837.java
index e9d8d7cdc..4b10d8189 100644
--- a/src/main/java/net/sf/rails/game/specific/_1837/OperatingRound_1837.java
+++ b/src/main/java/net/sf/rails/game/specific/_1837/OperatingRound_1837.java
@@ -12,6 +12,7 @@
import org.slf4j.LoggerFactory;
import net.sf.rails.common.DisplayBuffer;
+import net.sf.rails.common.GameOption;
import net.sf.rails.common.LocalText;
import net.sf.rails.common.ReportBuffer;
import net.sf.rails.game.GameDef;
@@ -27,6 +28,7 @@
import net.sf.rails.game.financial.NationalFormationRound;
import net.sf.rails.game.special.ExchangeForShare;
import net.sf.rails.game.special.SpecialProperty;
+import net.sf.rails.game.specific._18EU.GameManager_18EU;
import net.sf.rails.game.state.BooleanState;
import net.sf.rails.game.state.Currency;
import net.sf.rails.game.state.MoneyOwner;
diff --git a/src/main/java/net/sf/rails/game/specific/_1837/PublicCompany_1837.java b/src/main/java/net/sf/rails/game/specific/_1837/PublicCompany_1837.java
index 240cae110..6ac8a17fa 100644
--- a/src/main/java/net/sf/rails/game/specific/_1837/PublicCompany_1837.java
+++ b/src/main/java/net/sf/rails/game/specific/_1837/PublicCompany_1837.java
@@ -14,7 +14,7 @@
import net.sf.rails.game.state.Owner;
public class PublicCompany_1837 extends PublicCompany {
-
+
public PublicCompany_1837(RailsItem parent, String id) {
super(parent, id);
}
@@ -68,6 +68,6 @@ public boolean isSoldOut() {
/**
* @param coalMineTreasuryBonus the coalMineTreasuryBonus to set
*/
-
-
+
+
}
diff --git a/src/main/java/net/sf/rails/game/specific/_1837/StartRound_1837_2ndEd.java b/src/main/java/net/sf/rails/game/specific/_1837/StartRound_1837_2ndEd.java
index 8ad6ecb37..f87143081 100644
--- a/src/main/java/net/sf/rails/game/specific/_1837/StartRound_1837_2ndEd.java
+++ b/src/main/java/net/sf/rails/game/specific/_1837/StartRound_1837_2ndEd.java
@@ -333,4 +333,9 @@ private void setNextSelectingPlayer() {
playerManager.setCurrentToNextPlayerAfter(selectingPlayer.value());
}
+ @Override
+ public String getHelp() {
+ return "1837 Start Round help text";
+ }
+
}
diff --git a/src/main/java/net/sf/rails/ui/swing/GameStatus.java b/src/main/java/net/sf/rails/ui/swing/GameStatus.java
index c3e7bcaef..1db584817 100644
--- a/src/main/java/net/sf/rails/ui/swing/GameStatus.java
+++ b/src/main/java/net/sf/rails/ui/swing/GameStatus.java
@@ -564,7 +564,6 @@ protected void initFields() {
wideGapPosition, true);
}
-
addField(new Caption(LocalText.getText("WORTH")), 0,
playerWorthYOffset, 1, 1, 0, true);
for (int i = 0; i < np; i++) {
diff --git a/src/main/java/net/sf/rails/ui/swing/GameUIManager.java b/src/main/java/net/sf/rails/ui/swing/GameUIManager.java
index 8a18f9ee8..37b05827a 100644
--- a/src/main/java/net/sf/rails/ui/swing/GameUIManager.java
+++ b/src/main/java/net/sf/rails/ui/swing/GameUIManager.java
@@ -568,7 +568,6 @@ public void updateUI() {
log.debug("Correction overrides active window: status window active");
}
-
// Active window settings are handled last.
// Side effects: the active window is made visible and put on top.
if (uiHints.getActivePanel() == GuiDef.Panel.START_ROUND) {
diff --git a/src/main/java/net/sf/rails/ui/swing/gamespecific/_1837/ORUIManager_1837.java b/src/main/java/net/sf/rails/ui/swing/gamespecific/_1837/ORUIManager_1837.java
index e9f4b3a96..5bd56b53a 100644
--- a/src/main/java/net/sf/rails/ui/swing/gamespecific/_1837/ORUIManager_1837.java
+++ b/src/main/java/net/sf/rails/ui/swing/gamespecific/_1837/ORUIManager_1837.java
@@ -9,6 +9,7 @@
import net.sf.rails.sound.SoundManager;
import net.sf.rails.ui.swing.ORPanel;
import net.sf.rails.ui.swing.ORUIManager;
+import net.sf.rails.ui.swing.ORWindow;
import net.sf.rails.ui.swing.gamespecific._1880.StartRoundWindow_1880;
import rails.game.action.SetDividend;
diff --git a/src/main/java/net/sf/rails/ui/swing/hexmap/TileHexUpgrade.java b/src/main/java/net/sf/rails/ui/swing/hexmap/TileHexUpgrade.java
index 5fa138331..22699419f 100644
--- a/src/main/java/net/sf/rails/ui/swing/hexmap/TileHexUpgrade.java
+++ b/src/main/java/net/sf/rails/ui/swing/hexmap/TileHexUpgrade.java
@@ -134,10 +134,10 @@ private void findValidRotations(HexSidesSet connectedSides, Collection
private boolean validate(Phase phase) {
invalids.clear();
-
+
/*MBR 25.11.2018
Check if the action causes this Validation is a Special Tile Lay
- If that is the case the current support special action modifications need to be
+ If that is the case the current support special action modifications need to be
excluded from the validation:
As of the time of this writing, the following actions are supported.
A private blocking hex might be unblocked by laying a tile
@@ -145,7 +145,7 @@ private boolean validate(Phase phase) {
Future Powers consist of Tile lays in a different Colour than the current Phase (1822)
*/
if (action.getType()== action.SPECIAL_PROPERTY) {
-
+
SpecialTileLay sp = (SpecialTileLay)action.getSpecialProperty();
if (!sp.isFree()) {
if (notEnoughCash(0)) {
@@ -158,7 +158,7 @@ Future Powers consist of Tile lays in a different Colour than the current Phase
}
if (hexIsReserved()) {
invalids.add(Invalids.HEX_RESERVED);
- }
+ }
}
} else {
if (hexIsBlocked()) {
@@ -193,7 +193,7 @@ Future Powers consist of Tile lays in a different Colour than the current Phase
} else if (noValidRotation()) {
invalids.add(Invalids.NO_VALID_ORIENTATION);
}
-
+
return invalids.isEmpty();
}
@@ -213,7 +213,7 @@ public boolean hexIsReserved() {
}
}
return false;
-
+
}
public boolean noTileAvailable() {
@@ -251,15 +251,15 @@ public boolean notEnoughCash() {
}
return action.getCompany().getCash() < this.getCost();
}
-
+
public boolean notEnoughCash(int discount) {
- // correction action does not require cash
+ // correction action does not require cash
if (action.getType() == LayTile.CORRECTION) {
return false;
}
- return action.getCompany().getCash() < (this.getCost()-discount);
+ return action.getCompany().getCash() < (this.getCost()-discount);
}
-
+
public boolean requiresConnection() {
// Yellow Tile on Company Home
if (upgrade.getTargetTile().getColourText().equalsIgnoreCase(TileColour.YELLOW.name())
diff --git a/src/test/resources/data/real/1856_CGR-10Shares-Test.report b/src/test/resources/data/real/1856_CGR-10Shares-Test.report
index 17263a3b4..e4eb75c25 100644
--- a/src/test/resources/data/real/1856_CGR-10Shares-Test.report
+++ b/src/test/resources/data/real/1856_CGR-10Shares-Test.report
@@ -281,7 +281,7 @@ BuysTrain,GT,3,IPO,225
CompanyOperates,WR,Tyler
LaysTileAt,WR,15,O16,SE
-LAYS_TOKEN_ON,WR,O18,40 Hex O18 (Fort Erie)
+LAYS_TOKEN_ON,WR,O18,40
CompanyRevenue,WR,160
CompanyMustPayLoanInterest,WR,20
InterestPaidFromTreasury,WR,20
@@ -344,7 +344,7 @@ PRICE_MOVES_LOG,GT,70,F6,75,G6
CompanyOperates,CA,Lonny
LaysTileAt,CA,8,D15,S
CompanyTakesLoan,CA,100,100
-LAYS_TOKEN_ON,CA,C14,40 Hex C14 (Maudaumin)
+LAYS_TOKEN_ON,CA,C14,40
CompanyRevenue,CA,140
CompanyMustPayLoanInterest,CA,20
InterestPaidFromTreasury,CA,20
@@ -368,7 +368,7 @@ BuysPrivateFromFor,WR,TCC,Tyler,100
CompanyOperates,LPS,Lonny
LaysTileAt,LPS,15,D17,SW
CompanyTakesLoan,LPS,100,100
-LAYS_TOKEN_ON,LPS,D17,40 Hex D17 (Glencoe)
+LAYS_TOKEN_ON,LPS,D17,40
CompanyRevenue,LPS,180
CompanyMustPayLoanInterest,LPS,40
InterestPaidFromTreasury,LPS,40
@@ -573,7 +573,7 @@ PRICE_MOVES_LOG,TGB,90,D1,80,C1
CompanyOperates,CV,Ron
LaysTileAt,CV,57,L13,SW
-LAYS_TOKEN_ON,CV,L13,40 Hex L13 (Burlington)
+LAYS_TOKEN_ON,CV,L13,40
CompanyRevenue,CV,80
CompanyPaysOutFull,CV,80
Payout,Ron,32,4,10
@@ -978,7 +978,7 @@ PRICE_MOVES_LOG,CV,100,G3,110,H3
CompanyOperates,GW,Lonny
LaysTileAt,GW,14,H15,SW
-LAYS_TOKEN_ON,GW,H15,40 Hex H15 (Woodstock)
+LAYS_TOKEN_ON,GW,H15,40
CompanyDoesNotPayDividend,GW
PRICE_MOVES_LOG,GW,100,E1,90,D1
BuysTrain,GW,5,IPO,550
@@ -1284,7 +1284,7 @@ PRICE_MOVES_LOG,GW,100,E1,110,F1
CompanyOperates,WGB,Tyler
LaysTileAt,WGB,5,J11,NW
-LAYS_TOKEN_ON,WGB,J15,40 Hex J15 (Brantford)
+LAYS_TOKEN_ON,WGB,J15,40
CompanyDoesNotPayDividend,WGB
PRICE_MOVES_LOG,WGB,100,E1,90,D1
BuysTrain,WGB,6,IPO,700
diff --git a/src/test/resources/data/test/1837_StartroundCompleted.rails b/src/test/resources/data/test/1837_StartroundCompleted.rails
new file mode 100644
index 000000000..eba8c6a9e
Binary files /dev/null and b/src/test/resources/data/test/1837_StartroundCompleted.rails differ
diff --git a/src/test/resources/data/test/1837_StartroundCompleted.report b/src/test/resources/data/test/1837_StartroundCompleted.report
new file mode 100644
index 000000000..6c3be045a
--- /dev/null
+++ b/src/test/resources/data/test/1837_StartroundCompleted.report
@@ -0,0 +1,611 @@
+GameIs,1837
+PlayerIs,1,Ocki
+PlayerIs,2,Marcus
+PlayerIs,3,Jupp
+PlayerIs,4,Volker
+PlayerIs,5,Martin
+PlayerCash,450
+BankHas,12018
+StartOfPhase,2
+BankSizeIs,12018
+StartOfStartRound,Initial Minor StartRound (Coal and Privates including Suedbahn)
+HasPriority,Ocki
+PASSES,Ocki
+PASSES,Marcus
+PASSES,Jupp
+PASSES,Volker
+PASSES,Martin
+ALL_PASSED
+ITEM_PRICE_REDUCED,EKT,90
+ITEM_PRICE_REDUCED,EPP,90
+ITEM_PRICE_REDUCED,BB,90
+PASSES,Ocki
+PASSES,Marcus
+PASSES,Jupp
+PASSES,Volker
+PASSES,Martin
+ALL_PASSED
+ITEM_PRICE_REDUCED,EKT,80
+ITEM_PRICE_REDUCED,EPP,80
+ITEM_PRICE_REDUCED,BB,80
+PASSES,Ocki
+PASSES,Marcus
+PASSES,Jupp
+PASSES,Volker
+PASSES,Martin
+ALL_PASSED
+ITEM_PRICE_REDUCED,EKT,70
+ITEM_PRICE_REDUCED,EPP,70
+ITEM_PRICE_REDUCED,BB,70
+PASSES,Ocki
+BuysItemFor,Marcus,EKT,70
+FloatsWithCash,EKT,100
+PASSES,Jupp
+PASSES,Volker
+PASSES,Martin
+PASSES,Ocki
+PASSES,Marcus
+ALL_PASSED
+ITEM_PRICE_REDUCED,EPP,90
+ITEM_PRICE_REDUCED,BB,90
+ITEM_PRICE_REDUCED,EOD,90
+PASSES,Jupp
+PASSES,Volker
+PASSES,Martin
+PASSES,Ocki
+PASSES,Marcus
+ALL_PASSED
+ITEM_PRICE_REDUCED,EPP,80
+ITEM_PRICE_REDUCED,BB,80
+ITEM_PRICE_REDUCED,EOD,80
+PASSES,Jupp
+PASSES,Volker
+PASSES,Martin
+PASSES,Ocki
+PASSES,Marcus
+ALL_PASSED
+ITEM_PRICE_REDUCED,EPP,70
+ITEM_PRICE_REDUCED,BB,70
+ITEM_PRICE_REDUCED,EOD,70
+BuysItemFor,Jupp,EPP,70
+FloatsWithCash,EPP,100
+PASSES,Volker
+PASSES,Martin
+PASSES,Ocki
+PASSES,Marcus
+PASSES,Jupp
+ALL_PASSED
+ITEM_PRICE_REDUCED,BB,90
+ITEM_PRICE_REDUCED,EOD,90
+ITEM_PRICE_REDUCED,RGTE,90
+PASSES,Volker
+PASSES,Martin
+PASSES,Ocki
+PASSES,Marcus
+PASSES,Jupp
+ALL_PASSED
+ITEM_PRICE_REDUCED,BB,80
+ITEM_PRICE_REDUCED,EOD,80
+ITEM_PRICE_REDUCED,RGTE,80
+PASSES,Volker
+PASSES,Martin
+PASSES,Ocki
+PASSES,Marcus
+PASSES,Jupp
+ALL_PASSED
+ITEM_PRICE_REDUCED,BB,70
+ITEM_PRICE_REDUCED,EOD,70
+ITEM_PRICE_REDUCED,RGTE,70
+BuysItemFor,Volker,RGTE,70
+FloatsWithCash,RGTE,100
+PASSES,Martin
+PASSES,Ocki
+PASSES,Marcus
+PASSES,Jupp
+PASSES,Volker
+ALL_PASSED
+ITEM_PRICE_REDUCED,BB,90
+ITEM_PRICE_REDUCED,EOD,90
+ITEM_PRICE_REDUCED,AB,175
+PASSES,Martin
+PASSES,Ocki
+PASSES,Marcus
+PASSES,Jupp
+PASSES,Volker
+ALL_PASSED
+ITEM_PRICE_REDUCED,BB,80
+ITEM_PRICE_REDUCED,EOD,80
+ITEM_PRICE_REDUCED,AB,165
+PASSES,Martin
+PASSES,Ocki
+PASSES,Marcus
+PASSES,Jupp
+PASSES,Volker
+ALL_PASSED
+ITEM_PRICE_REDUCED,BB,70
+ITEM_PRICE_REDUCED,EOD,70
+ITEM_PRICE_REDUCED,AB,155
+BuysItemFor,Martin,AB,155
+ALSO_GETS,Martin,S3
+FloatsWithCash,S3,90
+PASSES,Ocki
+PASSES,Marcus
+PASSES,Jupp
+PASSES,Volker
+PASSES,Martin
+ALL_PASSED
+ITEM_PRICE_REDUCED,BB,90
+ITEM_PRICE_REDUCED,EOD,90
+ITEM_PRICE_REDUCED,EHS,90
+PASSES,Ocki
+PASSES,Marcus
+PASSES,Jupp
+PASSES,Volker
+PASSES,Martin
+ALL_PASSED
+ITEM_PRICE_REDUCED,BB,80
+ITEM_PRICE_REDUCED,EOD,80
+ITEM_PRICE_REDUCED,EHS,80
+PASSES,Ocki
+PASSES,Marcus
+PASSES,Jupp
+PASSES,Volker
+PASSES,Martin
+ALL_PASSED
+ITEM_PRICE_REDUCED,BB,70
+ITEM_PRICE_REDUCED,EOD,70
+ITEM_PRICE_REDUCED,EHS,70
+PASSES,Ocki
+PASSES,Marcus
+PASSES,Jupp
+BuysItemFor,Volker,EOD,70
+FloatsWithCash,EOD,100
+PASSES,Martin
+PASSES,Ocki
+PASSES,Marcus
+PASSES,Jupp
+PASSES,Volker
+ALL_PASSED
+ITEM_PRICE_REDUCED,BB,90
+ITEM_PRICE_REDUCED,KwB,160
+ITEM_PRICE_REDUCED,EHS,90
+PASSES,Martin
+PASSES,Ocki
+PASSES,Marcus
+PASSES,Jupp
+PASSES,Volker
+ALL_PASSED
+ITEM_PRICE_REDUCED,BB,80
+ITEM_PRICE_REDUCED,KwB,150
+ITEM_PRICE_REDUCED,EHS,80
+PASSES,Martin
+PASSES,Ocki
+PASSES,Marcus
+PASSES,Jupp
+PASSES,Volker
+ALL_PASSED
+ITEM_PRICE_REDUCED,BB,70
+ITEM_PRICE_REDUCED,KwB,140
+ITEM_PRICE_REDUCED,EHS,70
+BuysItemFor,Martin,KwB,140
+ALSO_GETS,Martin,S2
+FloatsWithCash,S2,90
+PASSES,Ocki
+PASSES,Marcus
+PASSES,Jupp
+PASSES,Volker
+PASSES,Martin
+ALL_PASSED
+ITEM_PRICE_REDUCED,BB,90
+ITEM_PRICE_REDUCED,MLB,90
+ITEM_PRICE_REDUCED,EHS,90
+PASSES,Ocki
+PASSES,Marcus
+PASSES,Jupp
+PASSES,Volker
+PASSES,Martin
+ALL_PASSED
+ITEM_PRICE_REDUCED,BB,80
+ITEM_PRICE_REDUCED,MLB,80
+ITEM_PRICE_REDUCED,EHS,80
+PASSES,Ocki
+PASSES,Marcus
+PASSES,Jupp
+PASSES,Volker
+PASSES,Martin
+ALL_PASSED
+ITEM_PRICE_REDUCED,BB,70
+ITEM_PRICE_REDUCED,MLB,70
+ITEM_PRICE_REDUCED,EHS,70
+PASSES,Ocki
+BuysItemFor,Marcus,MLB,70
+FloatsWithCash,MLB,100
+PASSES,Jupp
+PASSES,Volker
+PASSES,Martin
+PASSES,Ocki
+PASSES,Marcus
+ALL_PASSED
+ITEM_PRICE_REDUCED,BB,90
+ITEM_PRICE_REDUCED,EHS,90
+ITEM_PRICE_REDUCED,BrB,130
+PASSES,Jupp
+PASSES,Volker
+PASSES,Martin
+PASSES,Ocki
+PASSES,Marcus
+ALL_PASSED
+ITEM_PRICE_REDUCED,BB,80
+ITEM_PRICE_REDUCED,EHS,80
+ITEM_PRICE_REDUCED,BrB,120
+PASSES,Jupp
+PASSES,Volker
+PASSES,Martin
+BuysItemFor,Ocki,BrB,120
+ALSO_GETS,Ocki,S4
+FloatsWithCash,S4,90
+PASSES,Marcus
+PASSES,Jupp
+PASSES,Volker
+PASSES,Martin
+PASSES,Ocki
+ALL_PASSED
+ITEM_PRICE_REDUCED,BB,90
+ITEM_PRICE_REDUCED,EHS,90
+ITEM_PRICE_REDUCED,WB,120
+PASSES,Marcus
+PASSES,Jupp
+PASSES,Volker
+PASSES,Martin
+PASSES,Ocki
+ALL_PASSED
+ITEM_PRICE_REDUCED,BB,80
+ITEM_PRICE_REDUCED,EHS,80
+ITEM_PRICE_REDUCED,WB,110
+PASSES,Marcus
+PASSES,Jupp
+PASSES,Volker
+PASSES,Martin
+PASSES,Ocki
+ALL_PASSED
+ITEM_PRICE_REDUCED,BB,70
+ITEM_PRICE_REDUCED,EHS,70
+ITEM_PRICE_REDUCED,WB,100
+PASSES,Marcus
+BuysItemFor,Jupp,BB,70
+FloatsWithCash,BB,100
+PASSES,Volker
+PASSES,Martin
+PASSES,Ocki
+PASSES,Marcus
+PASSES,Jupp
+ALL_PASSED
+ITEM_PRICE_REDUCED,SmB,140
+ITEM_PRICE_REDUCED,EHS,90
+ITEM_PRICE_REDUCED,WB,120
+PASSES,Volker
+PASSES,Martin
+PASSES,Ocki
+PASSES,Marcus
+PASSES,Jupp
+ALL_PASSED
+ITEM_PRICE_REDUCED,SmB,130
+ITEM_PRICE_REDUCED,EHS,80
+ITEM_PRICE_REDUCED,WB,110
+PASSES,Volker
+PASSES,Martin
+PASSES,Ocki
+PASSES,Marcus
+BuysItemFor,Jupp,SmB,130
+ALSO_GETS,Jupp,S1
+FloatsWithCash,S1,90
+PASSES,Volker
+PASSES,Martin
+PASSES,Ocki
+PASSES,Marcus
+PASSES,Jupp
+ALL_PASSED
+ITEM_PRICE_REDUCED,SPB,90
+ITEM_PRICE_REDUCED,EHS,90
+ITEM_PRICE_REDUCED,WB,120
+PASSES,Volker
+PASSES,Martin
+PASSES,Ocki
+PASSES,Marcus
+PASSES,Jupp
+ALL_PASSED
+ITEM_PRICE_REDUCED,SPB,80
+ITEM_PRICE_REDUCED,EHS,80
+ITEM_PRICE_REDUCED,WB,110
+PASSES,Volker
+PASSES,Martin
+PASSES,Ocki
+PASSES,Marcus
+PASSES,Jupp
+ALL_PASSED
+ITEM_PRICE_REDUCED,SPB,70
+ITEM_PRICE_REDUCED,EHS,70
+ITEM_PRICE_REDUCED,WB,100
+BuysItemFor,Volker,EHS,70
+FloatsWithCash,EHS,100
+PASSES,Martin
+PASSES,Ocki
+PASSES,Marcus
+PASSES,Jupp
+PASSES,Volker
+ALL_PASSED
+ITEM_PRICE_REDUCED,SPB,90
+ITEM_PRICE_REDUCED,LRB,90
+ITEM_PRICE_REDUCED,WB,120
+PASSES,Martin
+PASSES,Ocki
+PASSES,Marcus
+PASSES,Jupp
+PASSES,Volker
+ALL_PASSED
+ITEM_PRICE_REDUCED,SPB,80
+ITEM_PRICE_REDUCED,LRB,80
+ITEM_PRICE_REDUCED,WB,110
+PASSES,Martin
+PASSES,Ocki
+PASSES,Marcus
+PASSES,Jupp
+PASSES,Volker
+ALL_PASSED
+ITEM_PRICE_REDUCED,SPB,70
+ITEM_PRICE_REDUCED,LRB,70
+ITEM_PRICE_REDUCED,WB,100
+BuysItemFor,Martin,SPB,70
+FloatsWithCash,SPB,100
+PASSES,Ocki
+PASSES,Marcus
+PASSES,Jupp
+PASSES,Volker
+PASSES,Martin
+ALL_PASSED
+ITEM_PRICE_REDUCED,ZKB,90
+ITEM_PRICE_REDUCED,LRB,90
+ITEM_PRICE_REDUCED,WB,120
+PASSES,Ocki
+PASSES,Marcus
+PASSES,Jupp
+PASSES,Volker
+PASSES,Martin
+ALL_PASSED
+ITEM_PRICE_REDUCED,ZKB,80
+ITEM_PRICE_REDUCED,LRB,80
+ITEM_PRICE_REDUCED,WB,110
+PASSES,Ocki
+PASSES,Marcus
+PASSES,Jupp
+PASSES,Volker
+BuysItemFor,Martin,LRB,80
+FloatsWithCash,LRB,100
+PASSES,Ocki
+PASSES,Marcus
+PASSES,Jupp
+PASSES,Volker
+PASSES,Martin
+ALL_PASSED
+ITEM_PRICE_REDUCED,ZKB,90
+ITEM_PRICE_REDUCED,WB,120
+ITEM_PRICE_REDUCED,KB,110
+PASSES,Ocki
+PASSES,Marcus
+PASSES,Jupp
+PASSES,Volker
+PASSES,Martin
+ALL_PASSED
+ITEM_PRICE_REDUCED,ZKB,80
+ITEM_PRICE_REDUCED,WB,110
+ITEM_PRICE_REDUCED,KB,100
+PASSES,Ocki
+PASSES,Marcus
+PASSES,Jupp
+PASSES,Volker
+PASSES,Martin
+ALL_PASSED
+ITEM_PRICE_REDUCED,ZKB,70
+ITEM_PRICE_REDUCED,WB,100
+ITEM_PRICE_REDUCED,KB,90
+PASSES,Ocki
+BuysItemFor,Marcus,ZKB,70
+FloatsWithCash,ZKB,100
+PASSES,Jupp
+PASSES,Volker
+PASSES,Martin
+PASSES,Ocki
+PASSES,Marcus
+ALL_PASSED
+ITEM_PRICE_REDUCED,TB,140
+ITEM_PRICE_REDUCED,WB,120
+ITEM_PRICE_REDUCED,KB,110
+PASSES,Jupp
+PASSES,Volker
+PASSES,Martin
+PASSES,Ocki
+PASSES,Marcus
+ALL_PASSED
+ITEM_PRICE_REDUCED,TB,130
+ITEM_PRICE_REDUCED,WB,110
+ITEM_PRICE_REDUCED,KB,100
+PASSES,Jupp
+PASSES,Volker
+PASSES,Martin
+PASSES,Ocki
+PASSES,Marcus
+ALL_PASSED
+ITEM_PRICE_REDUCED,TB,120
+ITEM_PRICE_REDUCED,WB,100
+ITEM_PRICE_REDUCED,KB,90
+PASSES,Jupp
+PASSES,Volker
+PASSES,Martin
+PASSES,Ocki
+PASSES,Marcus
+ALL_PASSED
+ITEM_PRICE_REDUCED,TB,110
+ITEM_PRICE_REDUCED,WB,90
+ITEM_PRICE_REDUCED,KB,80
+PASSES,Jupp
+PASSES,Volker
+PASSES,Martin
+PASSES,Ocki
+PASSES,Marcus
+ALL_PASSED
+ITEM_PRICE_REDUCED,TB,100
+ITEM_PRICE_REDUCED,WB,80
+ITEM_PRICE_REDUCED,KB,70
+PASSES,Jupp
+PASSES,Volker
+PASSES,Martin
+PASSES,Ocki
+BuysItemFor,Marcus,WB,80
+PASSES,Jupp
+PASSES,Volker
+PASSES,Martin
+BuysItemFor,Ocki,KB,120
+ALSO_GETS,Ocki,S5
+SetsHomeHexS5,S5,L2
+FloatsWithCash,S5,90
+PASSES,Ocki
+PASSES,Marcus
+PASSES,Jupp
+PASSES,Volker
+PASSES,Martin
+ALL_PASSED
+ITEM_PRICE_REDUCED,TB,140
+PASSES,Ocki
+PASSES,Marcus
+PASSES,Jupp
+PASSES,Volker
+PASSES,Martin
+ALL_PASSED
+ITEM_PRICE_REDUCED,TB,130
+PASSES,Ocki
+PASSES,Marcus
+PASSES,Jupp
+PASSES,Volker
+PASSES,Martin
+ALL_PASSED
+ITEM_PRICE_REDUCED,TB,120
+PASSES,Ocki
+PASSES,Marcus
+PASSES,Jupp
+PASSES,Volker
+PASSES,Martin
+ALL_PASSED
+ITEM_PRICE_REDUCED,TB,110
+PASSES,Ocki
+PASSES,Marcus
+PASSES,Jupp
+PASSES,Volker
+PASSES,Martin
+ALL_PASSED
+ITEM_PRICE_REDUCED,TB,100
+PASSES,Ocki
+BuysItemFor,Marcus,TB,100
+Has,EPP,100
+Has,RGTE,100
+Has,EOD,100
+Has,EKT,100
+Has,MLB,100
+Has,ZKB,100
+Has,SPB,100
+Has,LRB,100
+Has,BB,100
+Has,EHS,100
+Has,S1,90
+Has,S2,90
+Has,S3,90
+Has,S4,90
+Has,S5,90
+Has,Ocki,210
+Has,Marcus,60
+Has,Jupp,180
+Has,Volker,240
+Has,Martin,5
+StartOfStartRound,Minor KuK StartRound
+HasPriority,Jupp
+BuysItemFor,Jupp,K1,90
+FloatsWithCash,K1,90
+BuysItemFor,Volker,K3,90
+FloatsWithCash,K3,90
+PASSES,Martin
+BuysItemFor,Ocki,K2,120
+FloatsWithCash,K2,120
+Has,EPP,100
+Has,RGTE,100
+Has,EOD,100
+Has,EKT,100
+Has,MLB,100
+Has,ZKB,100
+Has,SPB,100
+Has,LRB,100
+Has,BB,100
+Has,EHS,100
+Has,S1,90
+Has,S2,90
+Has,S3,90
+Has,S4,90
+Has,S5,90
+Has,K1,90
+Has,K2,120
+Has,K3,90
+Has,Ocki,90
+Has,Marcus,60
+Has,Jupp,90
+Has,Volker,150
+Has,Martin,5
+StartOfStartRound,Minor Hungary StartRound
+HasPriority,Marcus
+PASSES,Marcus
+BuysItemFor,Jupp,U2,90
+FloatsWithCash,U2,90
+BuysItemFor,Volker,PRES_CERT_NAME,U1,50,90
+FloatsWithCash,U1,180
+PASSES,Martin
+BuysItemFor,Ocki,PRES_CERT_NAME,U3,50,90
+FloatsWithCash,U3,180
+PASSES,Marcus
+PASSES,Jupp
+PASSES,Volker
+PASSES,Martin
+PASSES,Ocki
+ALL_PASSED
+Has,EPP,100
+Has,RGTE,100
+Has,EOD,100
+Has,EKT,100
+Has,MLB,100
+Has,ZKB,100
+Has,SPB,100
+Has,LRB,100
+Has,BB,100
+Has,EHS,100
+Has,S1,90
+Has,S2,90
+Has,S3,90
+Has,S4,90
+Has,S5,90
+Has,K1,90
+Has,K2,120
+Has,K3,90
+Has,U1,180
+Has,U2,90
+Has,U3,180
+Has,Ocki,0
+Has,Marcus,60
+Has,Jupp,0
+Has,Volker,60
+Has,Martin,5
+START_OR,0.0
+ReceivesFor,Martin,25,KwB
+ReceivesFor,Ocki,15,BrB
+ReceivesFor,Marcus,30,WB
+ReceivesFor,Martin,20,AB
+ReceivesFor,Ocki,10,KB
+ReceivesFor,Jupp,5,SmB
+ReceivesFor,Marcus,35,TB
+
+CompanyOperates,EPP,Jupp