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