|
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] |