From: Erik V. <ev...@us...> - 2012-05-14 16:29:42
|
data/1835/CompanyManager.xml | 2 data/1837/CompanyManager.xml | 393 data/1837/Game.xml | 220 data/1837/Map.xml | 181 data/1837/StockMarket.xml | 114 data/1837/TileSet.xml | 243 data/1837/Tiles.xml | 617 data/GamesList.xml | 10 rails/game/PublicCompany.java | 6 rails/game/PublicCompanyI.java | 1 rails/ui/swing/hexmap/GUIHex.java | 155 tiles/TileDictionary.18t | 361 tiles/TileDictionary.xml |48517 +++++++++++++++++++------------------- tiles/Tiles.xml | 8519 +++--- tiles/svg/tile-37001.svg | 2 tiles/svg/tile-37002.svg | 2 tiles/svg/tile-37003.svg | 2 tiles/svg/tile-37007.svg | 2 tiles/svg/tile-37008.svg | 2 tiles/svg/tile-37009.svg | 2 tiles/svg/tile-37010.svg | 2 tiles/svg/tile-37011.svg | 2 tiles/svg/tile-37012.svg | 2 tiles/svg/tile-37103.svg | 2 tiles/svg/tile-37109.svg | 2 tiles/svg/tile-37123.svg | 2 tiles/svg/tile-37156.svg | 2 tiles/svg/tile-37158.svg | 2 tiles/svg/tile-37206.svg | 2 tiles/svg/tile-37402.svg | 2 tiles/svg/tile-42.svg | 2 tiles/svg/tile-6000.svg | 8 tiles/svg/tile-6001.svg | 2 tiles/svg/tile-6007.svg | 2 34 files changed, 31108 insertions(+), 28277 deletions(-) New commits: commit a8784a9541b843bfdd93e93df104bb01568b46cd Author: Erik Vos <eri...@xs...> Date: Mon May 14 18:28:32 2012 +0200 Added ability to suppress home indicator on map. Applied to 1835. diff --git a/data/1835/CompanyManager.xml b/data/1835/CompanyManager.xml index baa4fd8..4e05202 100644 --- a/data/1835/CompanyManager.xml +++ b/data/1835/CompanyManager.xml @@ -204,7 +204,7 @@ </Company> <Company name="PR" longname="Preußische Eisenbahn" type="Major" startspace="I4" available="no" tokens="7" fgColour="FFFFFF" bgColour="000000" alias="Pr"> - <Home hex="E19"/> + <Home hex="E19" mapDisplay="no"/> <ShareUnit percentage="5" sharePriceUnits="2"/> <Float percentage="10"/> <Certificate type="President" shares="2"/> diff --git a/rails/game/PublicCompany.java b/rails/game/PublicCompany.java index 1b589e2..7b38879 100644 --- a/rails/game/PublicCompany.java +++ b/rails/game/PublicCompany.java @@ -67,6 +67,8 @@ public class PublicCompany extends Company implements PublicCompanyI { protected List<MapHex> homeHexes = null; protected int homeCityNumber = 1; protected boolean homeAllCitiesBlocked = false; + protected boolean homeMapDisplay = true; + /** Destination hex * */ protected String destinationHexName = null; @@ -343,6 +345,7 @@ public class PublicCompany extends Company implements PublicCompanyI { homeHexNames = homeBaseTag.getAttributeAsString("hex"); homeCityNumber = homeBaseTag.getAttributeAsInteger("city", 1); homeAllCitiesBlocked = homeBaseTag.getAttributeAsBoolean("allCitiesBlocked", false); + homeMapDisplay = homeBaseTag.getAttributeAsBoolean("mapDisplay", true); } Tag destinationTag = tag.getChild("Destination"); @@ -890,6 +893,9 @@ public class PublicCompany extends Company implements PublicCompanyI { return homeAllCitiesBlocked; } + public boolean isHomeMapDisplay() { + return homeMapDisplay; + } /** * @return Returns the destinationHex. diff --git a/rails/game/PublicCompanyI.java b/rails/game/PublicCompanyI.java index 7b28906..785417a 100644 --- a/rails/game/PublicCompanyI.java +++ b/rails/game/PublicCompanyI.java @@ -320,6 +320,7 @@ public interface PublicCompanyI extends CompanyI, CashHolder, TokenHolder { public void setHomeCityNumber(int homeCityNumber); public boolean isHomeBlockedForAllCities(); + public boolean isHomeMapDisplay(); public MapHex getDestinationHex(); public boolean hasDestination (); diff --git a/rails/ui/swing/hexmap/GUIHex.java b/rails/ui/swing/hexmap/GUIHex.java index af052cb..25412af 100644 --- a/rails/ui/swing/hexmap/GUIHex.java +++ b/rails/ui/swing/hexmap/GUIHex.java @@ -84,7 +84,7 @@ public class GUIHex implements ViewObject { // GUI variables double[] xVertex = new double[6]; double[] yVertex = new double[6]; -// double len; + // double len; GeneralPath hexagon; Rectangle rectBound; /** @@ -105,9 +105,9 @@ public class GUIHex implements ViewObject { * handle racing conditions for mouse events. */ private int highlightCounter = 0; - + protected static Logger log = - Logger.getLogger(GUIHex.class.getPackage().getName()); + Logger.getLogger(GUIHex.class.getPackage().getName()); public GUIHex(HexMap hexMap, double cx, double cy, double scale, int xCoord, int yCoord) { @@ -176,43 +176,43 @@ public class GUIHex implements ViewObject { setBounds(hexagon.getBounds()); center = - new Point((int) ((xVertex[2] + xVertex[5]) / 2), - (int) ((yVertex[0] + yVertex[3]) / 2)); + new Point((int) ((xVertex[2] + xVertex[5]) / 2), + (int) ((yVertex[0] + yVertex[3]) / 2)); Point2D.Double center2D = - new Point2D.Double((xVertex[2] + xVertex[5]) / 2.0, - (yVertex[0] + yVertex[3]) / 2.0); - + new Point2D.Double((xVertex[2] + xVertex[5]) / 2.0, + (yVertex[0] + yVertex[3]) / 2.0); + //inner hexagons are drawn outlined (not filled) - //for this draw, the stroke width is half the scale reduction + //for this draw, the stroke width is half the scale reduction //the scale factor is multiplied by the average of hex width / height in order //to get a good estimate for which for stroke width the hex borders are touched //by the stroke - double hexDrawScale = 1 - (1 - SELECTED_SCALE) / 2; + double hexDrawScale = 1 - (1 - SELECTED_SCALE) / 2; innerHexagonSelected = defineInnerHexagon(hexDrawScale, center2D); selectedStrokeWidth = (float) ( 1 - hexDrawScale ) * - ( hexagon.getBounds().width + hexagon.getBounds().height ) / 2; - hexDrawScale = 1 - (1 - SELECTABLE_SCALE) / 2; + ( hexagon.getBounds().width + hexagon.getBounds().height ) / 2; + hexDrawScale = 1 - (1 - SELECTABLE_SCALE) / 2; innerHexagonSelectable = defineInnerHexagon(hexDrawScale, center2D); selectableStrokeWidth = (float) ( 1 - hexDrawScale ) * - ( hexagon.getBounds().width + hexagon.getBounds().height ) / 2; + ( hexagon.getBounds().width + hexagon.getBounds().height ) / 2; } private GeneralPath defineInnerHexagon(double innerScale, Point2D.Double center2D) { AffineTransform at = - AffineTransform.getScaleInstance(innerScale, innerScale); + AffineTransform.getScaleInstance(innerScale, innerScale); GeneralPath innerHexagon = (GeneralPath) hexagon.createTransformedShape(at); // Translate innerHexagon to make it concentric. Rectangle2D innerBounds = innerHexagon.getBounds2D(); Point2D.Double innerCenter = - new Point2D.Double(innerBounds.getX() + innerBounds.getWidth() - / 2.0, innerBounds.getY() - + innerBounds.getHeight() / 2.0); + new Point2D.Double(innerBounds.getX() + innerBounds.getWidth() + / 2.0, innerBounds.getY() + + innerBounds.getHeight() / 2.0); at = - AffineTransform.getTranslateInstance(center2D.getX() - - innerCenter.getX(), - center2D.getY() - innerCenter.getY()); + AffineTransform.getTranslateInstance(center2D.getX() + - innerCenter.getX(), + center2D.getY() - innerCenter.getY()); innerHexagon.transform(at); return innerHexagon; @@ -244,7 +244,7 @@ public class GUIHex implements ViewObject { public Point2D getSidePoint2D(int side){ return new Point2D.Double((xVertex[side] + xVertex[(side+1)%6])/2, - (yVertex[side] + yVertex[(side+1)%6])/2); + (yVertex[side] + yVertex[(side+1)%6])/2); } public Point2D getCenterPoint2D() { @@ -279,7 +279,7 @@ public class GUIHex implements ViewObject { public Rectangle getBounds() { return rectBound; } - + public Rectangle getMarksDirtyBounds() { return marksDirtyRectBound; } @@ -291,7 +291,7 @@ public class GUIHex implements ViewObject { rectBound.y - marksDirtyMargin, rectBound.width + marksDirtyMargin * 2, rectBound.height + marksDirtyMargin * 2 - ); + ); } public boolean contains(Point2D.Double point) { @@ -355,7 +355,7 @@ public class GUIHex implements ViewObject { highlightCounter++; } - + /** * Indicate that this hex does not need to be highlighted any more (from the * caller's point of view). @@ -367,11 +367,11 @@ public class GUIHex implements ViewObject { //trigger hexmap marks repaint if hex becomes not highlighted if (highlightCounter == 0) hexMap.repaintMarks(getMarksDirtyBounds()); } - + public boolean isHighlighted() { return (highlightCounter > 0); } - + static boolean getAntialias() { return antialias; } @@ -408,10 +408,10 @@ public class GUIHex implements ViewObject { } private boolean isTilePainted() { - return provisionalGUITile != null && hexMap.isTilePainted(provisionalGUITile.getTileId()) - || currentGUITile != null && hexMap.isTilePainted(currentGUITile.getTileId()); + return provisionalGUITile != null && hexMap.isTilePainted(provisionalGUITile.getTileId()) + || currentGUITile != null && hexMap.isTilePainted(currentGUITile.getTileId()); } - + public void paintTile(Graphics g) { Graphics2D g2 = (Graphics2D) g; @@ -426,7 +426,7 @@ public class GUIHex implements ViewObject { paintOverlay(g2); } } - + /** * Marks are selected / selectable / highlighted * @param g @@ -443,24 +443,24 @@ public class GUIHex implements ViewObject { } if (isSelected()) { - Stroke oldStroke = g2.getStroke(); + Stroke oldStroke = g2.getStroke(); g2.setStroke(new BasicStroke(selectedStrokeWidth)); - g2.setColor(selectedColor); - g2.draw(innerHexagonSelected); - g2.setStroke(oldStroke); + g2.setColor(selectedColor); + g2.draw(innerHexagonSelected); + g2.setStroke(oldStroke); } else if (isSelectable()) { - Stroke oldStroke = g2.getStroke(); + Stroke oldStroke = g2.getStroke(); g2.setStroke(new BasicStroke(selectableStrokeWidth)); g2.setColor(selectableColor); - g2.draw(innerHexagonSelectable); - g2.setStroke(oldStroke); + g2.draw(innerHexagonSelectable); + g2.setStroke(oldStroke); } //highlight on top of tiles if (isHighlighted()) { g2.setColor(highlightedFillColor); g2.fill(hexagon); - Stroke oldStroke = g2.getStroke(); + Stroke oldStroke = g2.getStroke(); g2.setStroke(highlightedBorderStroke); g2.setColor(highlightedBorderColor); g2.draw(hexagon); @@ -468,7 +468,7 @@ public class GUIHex implements ViewObject { } } - + public void paintTokensAndText(Graphics g) { Graphics2D g2 = (Graphics2D) g; @@ -476,16 +476,16 @@ public class GUIHex implements ViewObject { paintOffStationTokens(g2); if (!isTilePainted()) return; - + FontMetrics fontMetrics = g2.getFontMetrics(); if (getHexModel().getTileCost() > 0 ) { g2.drawString( Bank.format(getHexModel().getTileCost()), rectBound.x - + (rectBound.width - fontMetrics.stringWidth(Integer.toString(getHexModel().getTileCost()))) - * 3 / 5, + + (rectBound.width - fontMetrics.stringWidth(Integer.toString(getHexModel().getTileCost()))) + * 3 / 5, rectBound.y - + ((fontMetrics.getHeight() + rectBound.height) * 9 / 15)); + + ((fontMetrics.getHeight() + rectBound.height) * 9 / 15)); } Map<PublicCompanyI, Stop> homes = getHexModel().getHomes(); @@ -499,6 +499,8 @@ public class GUIHex implements ViewObject { // Only draw the company name if there isn't yet a token of that company if (model.hasTokenOfCompany(company)) continue; homeCity = homes.get(company); + // Don't draw if suppressed + if (!company.isHomeMapDisplay()) continue; if (homeCity == null) { // not yet decided where the token will be // find a free slot List<Stop> stops = getHexModel().getStops(); @@ -518,22 +520,22 @@ public class GUIHex implements ViewObject { if (getHexModel().isBlockedForTileLays()) { List<PrivateCompanyI> privates = - //GameManager.getInstance().getCompanyManager().getAllPrivateCompanies(); - hexMap.getOrUIManager().getGameUIManager().getGameManager() - .getCompanyManager().getAllPrivateCompanies(); + //GameManager.getInstance().getCompanyManager().getAllPrivateCompanies(); + hexMap.getOrUIManager().getGameUIManager().getGameManager() + .getCompanyManager().getAllPrivateCompanies(); for (PrivateCompanyI p : privates) { List<MapHex> blocked = p.getBlockedHexes(); if (blocked != null) { for (MapHex hex : blocked) { if (getHexModel().equals(hex)) { - String text = "(" + p.getName() + ")"; + String text = "(" + p.getName() + ")"; g2.drawString( - text, - rectBound.x - + (rectBound.width - fontMetrics.stringWidth(text)) - * 1 / 2, - rectBound.y - + ((fontMetrics.getHeight() + rectBound.height) * 5 / 15)); + text, + rectBound.x + + (rectBound.width - fontMetrics.stringWidth(text)) + * 1 / 2, + rectBound.y + + ((fontMetrics.getHeight() + rectBound.height) * 5 / 15)); } } } @@ -541,15 +543,15 @@ public class GUIHex implements ViewObject { } if (model.isReservedForCompany() - && currentTileId == model.getPreprintedTileId() ) { - String text = "[" + model.getReservedForCompany() + "]"; + && currentTileId == model.getPreprintedTileId() ) { + String text = "[" + model.getReservedForCompany() + "]"; g2.drawString( - text, - rectBound.x - + (rectBound.width - fontMetrics.stringWidth(text)) - * 1 / 2, - rectBound.y - + ((fontMetrics.getHeight() + rectBound.height) * 5 / 25)); + text, + rectBound.x + + (rectBound.width - fontMetrics.stringWidth(text)) + * 1 / 2, + rectBound.y + + ((fontMetrics.getHeight() + rectBound.height) * 5 / 25)); } } @@ -637,8 +639,8 @@ public class GUIHex implements ViewObject { for (TokenI token : tokens) { Point origin = - new Point(center.x + offStationTokenX[i], - center.y + offStationTokenY[i]); + new Point(center.x + offStationTokenX[i], + center.y + offStationTokenY[i]); if (token instanceof BaseToken) { PublicCompanyI co = ((BaseToken) token).getCompany(); @@ -655,8 +657,8 @@ public class GUIHex implements ViewObject { private void drawBaseToken(Graphics2D g2, PublicCompanyI co, Point center, int diameter) { GUIToken token = - new GUIToken(co.getFgColour(), co.getBgColour(), co.getName(), - center.x, center.y, diameter); + new GUIToken(co.getFgColour(), co.getBgColour(), co.getName(), + center.x, center.y, diameter); token.setBounds(center.x-(int)(0.5*diameter), center.y-(int)(0.5*diameter), diameter, diameter); @@ -673,8 +675,8 @@ public class GUIHex implements ViewObject { Dimension size = new Dimension(40, 40); GUIToken token = - new GUIToken(Color.BLACK, Color.WHITE, "+" + bt.getValue(), - origin.x, origin.y, 15); + new GUIToken(Color.BLACK, Color.WHITE, "+" + bt.getValue(), + origin.x, origin.y, 15); token.setBounds(origin.x, origin.y, size.width, size.height); token.drawToken(g2); @@ -806,9 +808,9 @@ public class GUIHex implements ViewObject { } // For debugging: display x,y-coordinates //tt.append("<small> x=" + x + " y="+y+"</small>"); - + tt.append("<br><b>Tile</b>: ").append(currentTile.getId()); - + // For debugging: display rotation //tt.append("<small> rot=" + currentTileOrientation + "</small>"); @@ -828,8 +830,8 @@ public class GUIHex implements ViewObject { stopNumber = stop.getNumber(); st = stop.getRelatedStation(); tt.append("<br> ").append(st.getType()).append(" ").append(stopNumber) - .append(" (").append(model.getConnectionString(stopNumber)) - .append("): value "); + .append(" (").append(model.getConnectionString(stopNumber)) + .append("): value "); tt.append(st.getValue()); if (st.getBaseSlots() > 0) { tt.append(", ").append(st.getBaseSlots()).append(" slots"); @@ -860,7 +862,7 @@ public class GUIHex implements ViewObject { tt.append("<br><b>Upgrades</b>: ").append(upgrades); if (model.getTileCost() > 0) tt.append("<br>Upgrade cost: " - + Bank.format(model.getTileCost())); + + Bank.format(model.getTileCost())); } if (getHexModel().getDestinations() != null) { @@ -888,18 +890,18 @@ public class GUIHex implements ViewObject { } return (provisionalGUITile != null); } - + /** * Creates an upgrade tile onto this hex without dropping it on the hex. * This means that this hex won't consider the returned tile being part of it - * (even not on a temporary base). + * (even not on a temporary base). */ public GUITile createUpgradeTileIfValid (int tileId, boolean upgradeMustConnect) { GUITile t = new GUITile(tileId, this); /* Check if we can find a valid orientation of this tile */ return ( t.rotate(0, currentGUITile, upgradeMustConnect) ? t : null); } - + public boolean isTileUpgradeValid (int tileId, boolean upgradeMustConnect) { return ( createUpgradeTileIfValid(tileId, upgradeMustConnect) != null ); } @@ -988,7 +990,8 @@ public class GUIHex implements ViewObject { hexMap.repaintAll(getBounds()); } } - + + @Override public String toString () { return getName() + " (" + currentTile.getName() + ")"; } commit 35898f50e8c845a042ed19d9a4be4eedeb8d9f81 Author: Erik Vos <eri...@xs...> Date: Mon May 14 18:18:36 2012 +0200 1837 initial setup diff --git a/data/1837/CompanyManager.xml b/data/1837/CompanyManager.xml new file mode 100644 index 0000000..a644bd1 --- /dev/null +++ b/data/1837/CompanyManager.xml @@ -0,0 +1,393 @@ +<?xml version="1.0"?> +<CompanyManager> + <CompanyType name="Private" class="rails.game.PrivateCompany"> + <ClosingConditions> + <Phase>5</Phase> + </ClosingConditions> + </CompanyType> + <CompanyType name="Coal" class="rails.game.PublicCompany"> + <ShareUnit percentage="100"/> + <Certificate type="President" shares="1"/> + <StockPrice market="no"/> + <BaseTokens> + <HomeBase lay="whenFloated"/> + </BaseTokens> + <Payout split="always"/> + <Trains limit="2,2,1" mandatory="no"/> + <CanUseSpecialProperties/> + </CompanyType> + <CompanyType name="Minor1" class="rails.game.PublicCompany"> + <ShareUnit percentage="100"/> + <Certificate type="President" shares="1"/> + <StockPrice market="no"/> + <BaseTokens> + <HomeBase lay="whenFloated"/> + </BaseTokens> + <Payout split="always"/> + <Trains limit="2,2,1" mandatory="no"/> + <CanUseSpecialProperties/> + </CompanyType> + <CompanyType name="Minor2" class="rails.game.PublicCompany"> + <ShareUnit percentage="50"/> + <Certificate type="President" shares="1"/> + <Certificate shares="1" number="1"/> + <StockPrice market="no"/> + <BaseTokens> + <HomeBase lay="whenFloated"/> + </BaseTokens> + <Payout split="always"/> + <Trains limit="2,2,2" mandatory="no"/> + <CanUseSpecialProperties/> + </CompanyType> + <CompanyType name="Major" class="rails.game.PublicCompany" capitalisation="incremental"> + <PoolPaysOut/> + <Float percentage="50"/> + <StockPrice par="yes"/> + <ShareUnit percentage="10"/> + <Certificate type="President" shares="2"/> + <Certificate shares="1" number="8"/> + <BaseTokens> + <LayCost method="distance" cost="20" number="1"/> + <LayCost method="distance" cost="40" number="1"/> + <HomeBase lay="whenFloated"/> + </BaseTokens> + <Trains limit="4,3,3,2"/> + <CanUseSpecialProperties/> + </CompanyType> + + <Company name="KwB" longname="Karawankenbahn" type="Private" basePrice="170" revenue="25"> + <Blocking hex="J13"/> + <SpecialProperties> + <SpecialProperty condition="ifOwnedByPlayer" when="tileLayingStep" class="rails.game.special.SpecialTileLay"> + <SpecialTileLay location="J13" colour="yellow" extra="no" free="yes"/> + </SpecialProperty> + </SpecialProperties> + <Info key="ComesWithPresidency" parm="S2,100"/> + </Company> + <Company name="BrB" longname="Brennerbahn" type="Private" basePrice="140" revenue="15"> + <Blocking hex="J7"/> + <SpecialProperties> + <SpecialProperty condition="ifOwnedByPlayer" when="tileLayingStep" class="rails.game.special.SpecialTileLay"> + <SpecialTileLay location="J7" colour="yellow" extra="no" free="yes"/> + </SpecialProperty> + </SpecialProperties> + <Info key="ComesWithPresidency" parm="S4,100"/> + </Company> + <Company name="WB" longname="Wocheinerbahn" type="Private" basePrice="130" revenue="30"> + <Blocking hex="K12"/> + <SpecialProperties> + <SpecialProperty condition="ifOwnedByPlayer" when="tileLayingStep" class="rails.game.special.SpecialTileLay"> + <SpecialTileLay location="K12" colour="yellow" extra="no" free="yes"/> + </SpecialProperty> + </SpecialProperties> + </Company> + <Company name="AB" longname="Arlbergbahn" type="Private" basePrice="185" revenue="20"> + <Blocking hex="I6"/> + <SpecialProperties> + <SpecialProperty condition="ifOwnedByPlayer" when="tileLayingStep" class="rails.game.special.SpecialTileLay"> + <SpecialTileLay location="I6" colour="yellow" extra="no" free="yes"/> + </SpecialProperty> + </SpecialProperties> + <Info key="ComesWithPresidency" parm="S3,100"/> + </Company> + <Company name="KB" longname="Karstbahn" type="Private" basePrice="120" revenue="10"> + <Blocking hex="K14"/> + <SpecialProperties> + <SpecialProperty condition="ifOwnedByPlayer" when="tileLayingStep" class="rails.game.special.SpecialTileLay"> + <SpecialTileLay location="K14" colour="yellow" extra="no" free="yes"/> + </SpecialProperty> + </SpecialProperties> + <Info key="ComesWithPresidency" parm="S5,100"/> + </Company> + <Company name="SmB" longname="Semmeringbahn" type="Private" basePrice="150" revenue="5"> + <Blocking hex="H17"/> + <SpecialProperties> + <SpecialProperty condition="ifOwnedByPlayer" when="tileLayingStep" class="rails.game.special.SpecialTileLay"> + <SpecialTileLay location="H17" colour="yellow" extra="no" free="yes"/> + </SpecialProperty> + </SpecialProperties> + <Info key="ComesWithPresidency" parm="S1,100"/> + </Company> + <Company name="TB" longname="Tauernbahn" type="Private" basePrice="150" revenue="35"> + <Blocking hex="J11"/> + <SpecialProperties> + <SpecialProperty condition="ifOwnedByPlayer" when="tileLayingStep" class="rails.game.special.SpecialTileLay"> + <SpecialTileLay location="J11" colour="yellow" extra="no" free="yes"/> + </SpecialProperty> + </SpecialProperties> + </Company> + <Company name="EPP" longname="Eisenbahn Pilsen-Priesen" type="Coal" price="100" tokens="1"> + <Home hex="E12"/> + <SpecialProperties> + <SpecialProperty condition="phase=5" when="exchangeRound" class="rails.game.special.ExchangeForShare"> + <ExchangeForShare company="BK" share="10"/> + </SpecialProperty> + </SpecialProperties> + </Company> + <Company name="RGTE" longname="Reichenberg-Gablonz-Tannwalder-Eisenbahn" type="Coal" price="100" tokens="1"> + <Home hex="A14"/> + <SpecialProperties> + <SpecialProperty condition="phase=5" when="exchangeRound" class="rails.game.special.ExchangeForShare"> + <ExchangeForShare company="BK" share="10"/> + </SpecialProperty> + </SpecialProperties> + </Company> + <Company name="EOD" longname="Eisenbahn Oderberg-Dombran" type="Coal" price="100" tokens="1"> + <Home hex="C20"/> + <SpecialProperties> + <SpecialProperty condition="phase=5" when="exchangeRound" class="rails.game.special.ExchangeForShare"> + <ExchangeForShare company="MS" share="10"/> + </SpecialProperty> + </SpecialProperties> + </Company> + <Company name="EKT" longname="Eisenbahn Karwin-Teschen" type="Coal" price="100" tokens="1"> + <Home hex="C22"/> + <SpecialProperties> + <SpecialProperty condition="phase=5" when="exchangeRound" class="rails.game.special.ExchangeForShare"> + <ExchangeForShare company="MS" share="10"/> + </SpecialProperty> + </SpecialProperties> + </Company> + <Company name="MLB" longname="Mosty-Lemberg Bahn" type="Coal" price="100" tokens="1"> + <Home hex="B33"/> + <SpecialProperties> + <SpecialProperty condition="phase=5" when="exchangeRound" class="rails.game.special.ExchangeForShare"> + <ExchangeForShare company="CL" share="10"/> + </SpecialProperty> + </SpecialProperties> + </Company> + <Company name="ZKB" longname="Zarnesti-Kronstadt Bahn" type="Coal" price="100" tokens="1"> + <Home hex="J35"/> + <SpecialProperties> + <SpecialProperty condition="phase=5" when="exchangeRound" class="rails.game.special.ExchangeForShare"> + <ExchangeForShare company="SB" share="10"/> + </SpecialProperty> + </SpecialProperties> + </Company> + <Company name="SPB" longname="Simeria-Petroseni Bahn" type="Coal" price="100" tokens="1"> + <Home hex="K32"/> + <SpecialProperties> + <SpecialProperty condition="phase=5" when="exchangeRound" class="rails.game.special.ExchangeForShare"> + <ExchangeForShare company="SB" share="10"/> + </SpecialProperty> + </SpecialProperties> + </Company> + <Company name="LRB" longname="Lugoj-Resita Bahn" type="Coal" price="100" tokens="1"> + <Home hex="L31"/> + <SpecialProperties> + <SpecialProperty condition="phase=5" when="exchangeRound" class="rails.game.special.ExchangeForShare"> + <ExchangeForShare company="Th" share="10"/> + </SpecialProperty> + </SpecialProperties> + </Company> + <Company name="BB" longname="Bosna-Bahn" type="Coal" price="100" tokens="1"> + <Home hex="P21"/> + <SpecialProperties> + <SpecialProperty condition="phase=5" when="exchangeRound" class="rails.game.special.ExchangeForShare"> + <ExchangeForShare company="BH" share="10"/> + </SpecialProperty> + </SpecialProperties> + </Company> + <Company name="EHS" longname="Eisenbahn Hatvan-Salgotarjan" type="Coal" price="100" tokens="1"> + <Home hex="F27"/> + <SpecialProperties> + <SpecialProperty condition="phase=5" when="exchangeRound" class="rails.game.special.ExchangeForShare"> + <ExchangeForShare company="Th" share="10"/> + </SpecialProperty> + </SpecialProperties> + </Company> + <Company name="S1" longname="Wien-Gloggitzner Bahn" type="Minor1" price="90" tokens="1" fgColour="FFFFFF" bgColour="FF5400"> + <Home hex="G18" city="4"/> + <SpecialProperties> + <SpecialProperty condition="phase=4" when="exchangeRound" class="rails.game.special.ExchangeForShare"> + <ExchangeForShare company="Sd" share="10"/> + </SpecialProperty> + </SpecialProperties> + </Company> + <Company name="S2" longname="Kärntner Bahn" type="Minor1" price="90" tokens="1" fgColour="FFFFFF" bgColour="FF5400"> + <Home hex="J17"/> + <SpecialProperties> + <SpecialProperty condition="ifStarted" when="exchangeRound" class="rails.game.special.ExchangeForShare"> + <ExchangeForShare company="Sd" share="10"/> + </SpecialProperty> + </SpecialProperties> + </Company> + <Company name="S3" longname="Nordtiroler Staatsbahn" type="Minor1" price="90" tokens="1" fgColour="FFFFFF" bgColour="FF5400"> + <Home hex="I8"/> + <SpecialProperties> + <SpecialProperty condition="ifStarted" when="exchangeRound" class="rails.game.special.ExchangeForShare"> + <ExchangeForShare company="Sd" share="10"/> + </SpecialProperty> + </SpecialProperties> + </Company> + <Company name="S4" longname="Südtiroler Staatsbahn" type="Minor1" price="90" tokens="1" fgColour="FFFFFF" bgColour="FF5400"> + <Home hex="K6"/> + <SpecialProperties> + <SpecialProperty condition="ifStarted" when="exchangeRound" class="rails.game.special.ExchangeForShare"> + <ExchangeForShare company="Sd" share="10"/> + </SpecialProperty> + </SpecialProperties> + </Company> + <Company name="S5" longname="Lombardo-Venetianische Eisenbahn" type="Minor1" price="90" tokens="1" fgColour="FFFFFF" bgColour="FF5400"> + <Home hex="L9"/> <!-- Choice of L3 or L9 --> + <SpecialProperties> + <SpecialProperty condition="ifStarted" when="exchangeRound" class="rails.game.special.ExchangeForShare"> + <ExchangeForShare company="Sd" share="10"/> + </SpecialProperty> + </SpecialProperties> + </Company> + <Company name="K1" longname="Kaiser Ferdinand-Nordbahn" type="Minor1" price="90" tokens="1" fgColour="FFFFFF" bgColour="C98A5C"> + <Home hex="G18" city="1"/> + <SpecialProperties> + <SpecialProperty condition="phase=4" when="exchangeRound" class="rails.game.special.ExchangeForShare"> + <ExchangeForShare company="KK" share="10"/> + </SpecialProperty> + </SpecialProperties> + </Company> + <Company name="K2" longname="Kaiserin Elisabeth-Bahn" type="Minor1" price="140" tokens="1" fgColour="FFFFFF" bgColour="C98A5C"> + <Home hex="G18" city="3"/> + <SpecialProperties> + <SpecialProperty condition="ifStarted" when="exchangeRound" class="rails.game.special.ExchangeForShare"> + <ExchangeForShare company="KK" share="10"/> + </SpecialProperty> + </SpecialProperties> + </Company> + <Company name="K3" longname="Kaiser Franz Joseph-Bahn" type="Minor1" price="90" tokens="1" fgColour="FFFFFF" bgColour="C98A5C"> + <Home hex="G18" city="2"/> + <SpecialProperties> + <SpecialProperty condition="ifStarted" when="exchangeRound" class="rails.game.special.ExchangeForShare"> + <ExchangeForShare company="KK" share="10"/> + </SpecialProperty> + </SpecialProperties> + </Company> + <Company name="U1" longname="Eisenbahn Pest-Waitzen" type="Minor2" price="180" tokens="1" fgColour="FFFFFF" bgColour="FF55AA"> + <Home hex="H23" city="1"/> + <SpecialProperties> + <SpecialProperty condition="phase=4" when="exchangeRound" class="rails.game.special.ExchangeForShare"> + <ExchangeForShare company="Ug" share="10"/> + </SpecialProperty> + </SpecialProperties> + </Company> + <Company name="U2" longname="Mohacs-Fünfkirchner Bahn" type="Minor1" price="90" tokens="1" fgColour="FFFFFF" bgColour="FF55AA"> + <Home hex="K22"/> + <SpecialProperties> + <SpecialProperty condition="ifStarted" when="exchangeRound" class="rails.game.special.ExchangeForShare"> + <ExchangeForShare company="Ug" share="10"/> + </SpecialProperty> + </SpecialProperties> + <Trains limit="2,2,2"/> + </Company> + <Company name="U3" longname="Eisenbahn Pest-Czegléd" type="Minor2" price="180" tokens="1" fgColour="FFFFFF" bgColour="FF55AA"> + <Home hex="H23" city="2"/> + <SpecialProperties> + <SpecialProperty condition="ifStarted" when="exchangeRound" class="rails.game.special.ExchangeForShare"> + <ExchangeForShare company="Ug" share="10"/> + </SpecialProperty> + </SpecialProperties> + </Company> + <Company name="BH" longname="Bosnisch-Herzegowinische Landesbahn" type="Major" tokens="3" fgColour="000000" bgColour="FF0000"> + <Home hex="N21"/> + <Float percentage="10"/> + <Certificate type="President" shares="1"/> + <Certificate shares="1" number="8"/> + <Certificate shares="1" number="1" status="reserved"/> + </Company> + <Company name="BK" longname="Böhmische Kommerzbahn" type="Major" tokens="3" fgColour="000000" bgColour="0000FF"> + <Home hex="C12"/> + <Float percentage="10"/> + <Certificate type="President" shares="1"/> + <Certificate shares="1" number="7"/> + <Certificate shares="1" number="2" status="reserved"/> + </Company> + <Company name="CL" longname="Carl-Ludwigs-Bahn" type="Major" tokens="3" fgColour="000000" bgColour="FFFFFF"> + <Home hex="C34"/> + <Float percentage="10"/> + <Certificate type="President" shares="1"/> + <Certificate shares="1" number="8"/> + <Certificate shares="1" number="1" status="reserved"/> + </Company> + <Company name="GT" longname="Galizische Transversalbahn" type="Major" tokens="3" fgColour="FFFFFF" bgColour="00B000"> + <Home hex="D37"/> + <Float percentage="10"/> + <Certificate type="President" shares="1"/> + <Certificate shares="1" number="9"/> + </Company> + <Company name="MS" longname="Mährisch-schlesische Eisenbahn" type="Major" tokens="3" fgColour="FFFFFF" bgColour="FFFF00"> + <Home hex="E18"/> + <Float percentage="10"/> + <Certificate type="President" shares="1"/> + <Certificate shares="1" number="7"/> + <Certificate shares="1" number="2" status="reserved"/> + </Company> + <Company name="SB" longname="Siebenbürgische Bahn" type="Major" tokens="3" fgColour="FFFFFF" bgColour="88FF48"> + <Home hex="J37"/> + <Float percentage="10"/> + <Certificate type="President" shares="1"/> + <Certificate shares="1" number="7"/> + <Certificate shares="1" number="2" status="reserved"/> + </Company> + <Company name="Th" longname="TheiÃbahn" type="Major" tokens="3" fgColour="FFFFFF" bgColour="AAFFFF"> + <Home hex="F29"/> + <Float percentage="10"/> + <Certificate type="President" shares="1"/> + <Certificate shares="1" number="7"/> + <Certificate shares="1" number="2" status="reserved"/> + </Company> + <Company name="Sd" longname="Südbahn" type="Major" tokens="5" fgColour="FFFFFF" bgColour="FF5400"> + <Home hex="G18" city="4" mapDisplay="no"/> + <Float percentage="10"/> + <Certificate type="President" shares="1" status="reserved"/> + <Certificate shares="1" number="5"/> + <Certificate shares="1" number="4" status="reserved"/> + <Trains limit="4,4,4,3"/> + </Company> + <Company name="KK" longname="k.k. Staatsbahn" type="Major" tokens="5" fgColour="FFFFFF" bgColour="C98A5C"> + <Home hex="G18" city="1" mapDisplay="no"/> + <Float percentage="10"/> + <Certificate type="President" shares="1" status="reserved"/> + <Certificate shares="1" number="7"/> + <Certificate shares="1" number="2" status="reserved"/> + <Trains limit="4,4,4,3"/> + </Company> + <Company name="Ug" longname="Ungarische Staatsbahn" type="Major" tokens="5" fgColour="FFFFFF" bgColour="FF55AA"> + <Home hex="H23" city="1" mapDisplay="no"/> + <Float percentage="10"/> + <Certificate type="President" shares="1" status="reserved"/> + <Certificate shares="1" number="5"/> + <Certificate shares="1" number="4" status="reserved"/> + <Trains limit="4,4,4,3"/> + </Company> + + <!--StartPacket roundClass="rails.game.specific._1837.StartRound_1837"--> + <StartPacket roundClass="rails.game.specific._1835.StartRound_1835"> + <Item name="EKT" type="Coal" basePrice="100" column="1"/> + <Item name="EOD" type="Coal" basePrice="100" column="1"/> + <Item name="KwB" type="Private" basePrice="170" column="1"> + <SubItem name="S2" type="Minor1"/> + </Item> + <Item name="MLB" type="Coal" basePrice="100" column="1"/> + <Item name="BrB" type="Private" basePrice="140" column="1"> + <SubItem name="S4" type="Minor1"/> + </Item> + <Item name="WB" type="Private" basePrice="130" column="1"/> + + <Item name="EPP" type="Coal" basePrice="100" column="2"/> + <Item name="RGTE" type="Coal" basePrice="100" column="2"/> + <Item name="AB" type="Private" basePrice="185" column="2"> + <SubItem name="S3" type="Minor1"/> + </Item> + <Item name="EHS" type="Coal" basePrice="100" column="2"/> + <Item name="LRB" type="Coal" basePrice="100" column="2"/> + <Item name="KB" type="Private" basePrice="120" column="2"> + <SubItem name="S5" type="Minor1"/> + </Item> + + <Item name="BB" type="Coal" basePrice="100" column="3"/> + <Item name="SmB" type="Private" basePrice="150" column="3"> + <SubItem name="S1" type="Minor1"/> + </Item> + <Item name="SPB" type="Coal" basePrice="100" column="3"/> + <Item name="ZKB" type="Coal" basePrice="100" column="3"/> + <Item name="TB" type="Private" basePrice="150" column="3"/> + </StartPacket> +</CompanyManager> diff --git a/data/1837/Game.xml b/data/1837/Game.xml new file mode 100644 index 0000000..71292f7 --- /dev/null +++ b/data/1837/Game.xml @@ -0,0 +1,220 @@ +<?xml version="1.0"?> +<ComponentManager> + <Component name="GameManager" class="rails.game.GameManager"> + <!--Component name="GameManager" class="rails.game.specific._1837.GameManager_1837"--> + <Game name="1837"/> + <GameOption name="RouteAwareness" values="Highlight,Deactivate" default="Highlight"/> + <GameOption name="RevenueCalculation" values="Suggest,Deactivate" default="Highlight"/> + <GameOption name="UnlimitedTiles" values="No,Yellow Plain,Yes" default="No"/> + <GameOption name="NoMapMode" type="toggle" default="no"/> + <GameOption name="UnlimitedTopTrains" values="No,Yes" default="No"/> + <GameParameters> + <PlayerShareLimit percentage="60"/> + <BankPoolLimit percentage="50"/> + <!--StockRound class="rails.game.specific._1837.StockRound_1837" --> + <StockRound class="rails.game.StockRound" + sequence="SellBuySell"> + <NoSaleInFirstSR/> + <NoSaleIfNotOperated/> + </StockRound> + <!--OperatingRound class="rails.game.specific._1837.OperatingRound_1837"--> + <OperatingRound class="rails.game.OperatingRound"> + <EmergencyTrainBuying mustBuyCheapestTrain="no" mayAlwaysBuyNewTrain="yes" mayBuyFromCompany="yes"/> + </OperatingRound> + </GameParameters> + <!--GuiClasses> + <StatusWindow class="rails.ui.swing.gamespecific._1837.StatusWindow_1837"/> + <GameUIManager class="rails.ui.swing.gamespecific._1837.GameUIManager_1837"/> + </GuiClasses--> + <EndOfGame> + <BankBreaks limit="0" finish="currentOR"/> + <!-- "Runs out"; when "broken", -1 is the limit --> + </EndOfGame> + </Component> + <Component name="PlayerManager" class="rails.game.PlayerManager"> + <Players number="3" cash="730" certLimit="28"/> + <Players number="4" cash="555" certLimit="21"/> + <Players number="5" cash="450" certLimit="17"/> + <Players number="6" cash="380" certLimit="14"/> + <Players number="7" cash="330" certLimit="12"/> + </Component> + <Component name="Bank" class="rails.game.Bank"> + <Bank amount="14268"/> + <Money format="@K"/> + </Component> + <Component name="TileManager" class="rails.game.TileManager" + file="TileSet.xml"/> + <Component name="Map" class="rails.game.MapManager" file="Map.xml"/> + <Component name="CompanyManager" class="rails.game.CompanyManager" + file="CompanyManager.xml"/> + <Component name="StockMarket" class="rails.game.StockMarket" + file="StockMarket.xml"/> + <Component name="TrainManager" class="rails.game.TrainManager"> + <Defaults> + <Reach base="stops" countTowns="yes"/> + <Score towns="yes"/> + </Defaults> + <TrainType name="1G" majorStops="1" cost="100" quantity="10"> + <Reach countTowns="no"/> + <NewPhase phaseName="2"/> + </TrainType> + <TrainType name="2" majorStops="2" cost="90" quantity="14"/> + <TrainType name="3" majorStops="3" cost="180" quantity="5"> + <NewPhase phaseName="3"/> + </TrainType> + <TrainType name="3+1" majorStops="3" minorStops="1" cost="280" quantity="2"> + <NewPhase phaseName="3+1"/> + </TrainType> + <TrainType name="4" majorStops="4" cost="470" quantity="4"> + <NewPhase phaseName="4"/> + </TrainType> + <TrainType name="4E" majorStops="4" cost="500" quantity="1"> + <Reach countTowns="no"/> + <Score towns="no"/> + <NewPhase phaseName="4E"/> + </TrainType> + <TrainType name="4+1" majorStops="4" minorStops="1" cost="530" quantity="1"> + <NewPhase phaseName="4+1"/> + </TrainType> + <TrainType name="4+2" majorStops="4" minorStops="2" cost="560" quantity="1"/> + <TrainType name="5" majorStops="5" cost="800" quantity="2"> + <NewPhase phaseName="5"/> + </TrainType> + <TrainType name="5E" majorStops="5" cost="830" quantity="1"> + <Reach countTowns="no"/> + <Score towns="no"/> + </TrainType> + <TrainType name="5+2" majorStops="5" minorStops="2" cost="860" quantity="1"> + <NewPhase phaseName="5+2"/> + </TrainType> + <TrainType name="5+3" majorStops="5" minorStops="3" cost="900" quantity="1"/> + <TrainType name="5+4" majorStops="5" minorStops="4" cost="960" quantity="1"> + <IfOption name="UnlimitedTopTrains" value="Yes"> + <Attributes quantity="-1"/> + </IfOption> + </TrainType> + <TrainType name="2G" majorStops="2" cost="230" quantity="6"> + <Reach countTowns="no"/> + </TrainType> + <TrainType name="3G" majorStops="3" cost="590" quantity="2"> + <Reach countTowns="no"/> + <NewPhase phaseName="3G"/> + </TrainType> + <TrainType name="4G" majorStops="4" cost="1000" quantity="3"> + <Reach countTowns="no"/> + <NewPhase phaseName="4G"/> + <IfOption name="UnlimitedTopTrains" value="Yes"> + <Attributes quantity="-1"/> + </IfOption> + </TrainType> + <!-- TBD: Add support for 1837's trade-in rule, which says a + company that is at its train limit may trade in any train + to the bank pool for half face value, but only if that + company then replaces it by buying another train. + (However, companies that get "caught" when the train limit + falls must still discard one without compensation.) --> + <!-- TBD: Another rule that needs to be enforced in 1837: If + minor or coal company A merges into major company B and + causes B to exceed its train limit, any trains discarded + must be from A, even if they are better than B's own. --> + </Component> + <Component name="PhaseManager" class="rails.game.PhaseManager"> + <Phase name="2" realName="1"> + <!-- Wish list: This "phase change" ought not be needed. + It is triggered by the first purchase of a 1G-train + and makes 2-trains available. (I doubt it will be + a problem, since all ten coal companies need to buy + 1G trains on their first turn in order to run.) --> + <Tiles colour="yellow"/> + <Trains released="2"/> + <OperatingRounds number="1"/> + </Phase> + <Phase name="3" realName="2"> + <Tiles colour="yellow,green"/> + <Trains tradingAllowed="yes" limitStep="2" released="2G"/> + <!-- Wish list: The 2G trains ought not be available + until both the first 3-train and the last 1G-train + have been purchased. --> + <!-- TBD: Private companies no longer block tile-laying + in their hex by other players. --> + <!-- Open Bosnia-Herzegovina for building: --> + <LayTile hex="L17" tile="0"/> + <LayTile hex="L19" tile="-1"/> + <LayTile hex="L21" tile="0"/> + <LayTile hex="M18" tile="0" cost="70"/> + <LayTile hex="M20" tile="0" cost="70"/> + <LayTile hex="M22" tile="0" cost="70"/> + <LayTile hex="N19" tile="0" cost="70"/> + <LayTile hex="N21" tile="-10" city="Sarajevo"/> + <OperatingRounds number="2"/> + </Phase> + <Phase name="3+1" realName="2"> + <Trains limitStep="3"/> + </Phase> + <Phase name="4" realName="2"> + <!-- Wish list: The 3G trains ought not be available + until both the first 4-train and the last 2G-train + have been purchased. --> + <Trains rusted="2" released="3G"/> + <!-- Clear out Italy, make it off-limits, and place + green tile 426 on Bozen: --> + <LayTile hex="K4" tile="-37004" removeToken="yes"/> + <LayTile hex="K6" tile="426" orientation="3"/> + <LayTile hex="K8" tile="-37004" removeToken="yes"/> + <LayTile hex="K10" tile="-37004" removeToken="yes"/> + <LayTile hex="L3" tile="-37004" removeToken="yes"/> + <LayTile hex="L5" tile="-37004" removeToken="yes"/> + <LayTile hex="L7" tile="-37004" removeToken="yes"/> + <LayTile hex="L9" tile="-37004" removeToken="yes"/> + <LayTile hex="M4" tile="-37004" removeToken="yes"/> + <LayTile hex="M6" tile="-37004" removeToken="yes"/> + <LayTile hex="M8" tile="-37004" removeToken="yes"/> + <!-- TBD: S1-S5 must all convert, forming Sd. --> + <!-- TBD: K1 may convert, forming KK. If it doesn't, it + gets the option again at the start of each + round. If and when K1 converts, then K2-K3 + get the option to convert, and get it again at + the start of each round until forced to + convert upon the first 4+1 train purchase. --> + </Phase> + <Phase name="3G" realName="2"> + <Trains rusted="1G"/> + </Phase> + <Phase name="4E" realName="2"> + <!-- TBD: U1 director may convert, forming Ug. If he + doesn't, he gets the option again at the start + of each round. If and when U1 converts, then + U2-U3 directors get the option to convert, and + get it again (after KK) at the start of each + round until forced to convert upon the first + 5 train purchase. Non-director shareholders + of U1 and U3 have no choice, they convert when + the director of that minor converts. --> + </Phase> + <Phase name="4+1" realName="2"> + <!-- TBD: K1-K3 must all convert, forming KK, if they + haven't already. --> + </Phase> + <Phase name="5" realName="3"> + <Tiles colour="yellow,green,brown"/> + <!-- Wish list: The 4G trains ought not be available + until both the first 5-train and the last 3G-train + have been purchased. --> + <Trains rusted="3" limitStep="4" released="4G"/> + <!--Privates close="yes"/--> + <Info key="PhaseClosesAllPrivates"/> + <!-- TBD: U1-U3 must all convert, forming Ug, if they + haven't already. --> + <!-- TBD: All coal companies must convert even if their + major companies haven't formed. --> + <OffBoardRevenue step="2"/> + <OperatingRounds number="3"/> + </Phase> + <Phase name="4G" realName="3"> + <Trains rusted="2G"/> + </Phase> + <Phase name="5+2" realName="3"> + <Trains rusted="3+1"/> + </Phase> + </Component> +</ComponentManager> diff --git a/data/1837/Map.xml b/data/1837/Map.xml new file mode 100644 index 0000000..7ca575a --- /dev/null +++ b/data/1837/Map.xml @@ -0,0 +1,181 @@ +<Map tileOrientation="EW" letterOrientation="vertical" even="A"> + <Hex name="A12" tile="-3"/> + <Hex name="A14" tile="-37001" value="30,50" orientation="3" city="RGTE"/> + <Hex name="B9" tile="-3" orientation="5"/> + <Hex name="B11" tile="0"/> + <Hex name="B13" tile="0"/> + <Hex name="B15" tile="0"/> + <Hex name="B17" tile="0" cost="70"/> + <Hex name="B27" tile="-8" orientation="1"/> + <Hex name="B29" tile="0"/> + <Hex name="B31" tile="0"/> + <Hex name="B33" tile="-37001" value="20,50" orientation="3" city="MLB"/> + <Hex name="B35" tile="0"/> + <Hex name="C10" tile="0"/> + <Hex name="C12" tile="-37402" city="Prag"/> + <Hex name="C14" tile="0"/> + <Hex name="C16" tile="-1"/> + <Hex name="C18" tile="0" cost="70"/> + <Hex name="C20" tile="-37001" value="20,40" orientation="3" city="EOD"/> + <Hex name="C22" tile="-37001" value="25,45" orientation="2" city="EKT"/> + <Hex name="C24" tile="-37007" city="Krakau"/> + <Hex name="C26" tile="0" cost="70"/> + <Hex name="C28" tile="-1" cost="70"/> + <Hex name="C30" tile="0"/> + <Hex name="C32" tile="-2"/> + <Hex name="C34" tile="-3007" city="Lemberg"/> + <Hex name="D11" tile="-1"/> + <Hex name="D13" tile="0"/> + <Hex name="D15" tile="0"/> + <Hex name="D17" tile="0"/> + <Hex name="D19" tile="-1"/> + <Hex name="D21" tile="0"/> + <Hex name="D23" tile="-1"/> + <Hex name="D25" tile="0"/> + <Hex name="D27" tile="0"/> + <Hex name="D29" tile="0" cost="70"/> + <Hex name="D31" tile="0" cost="70"/> + <Hex name="D33" tile="0"/> + <Hex name="D35" tile="0"/> + <Hex name="D37" tile="-3007" city="Tarnopol"/> + <Hex name="D39" tile="-7" orientation="2"/> + <Hex name="E12" tile="-37001" value="30,50" orientation="5" city="EPP"... [truncated message content] |