Posts for year 2009 (old posts, page 8)

To be or not to be a cutlery, that is the question!

A few weeks ago I reviewed Corner Lot with Tom Lehmann. Tom asked abot the $2 raises. One of the reasons, asides from accelerating the cashflow management challenge, is that $2 raises greatly increases the rate of subsequent $1-off events1, or if you wish, Power Grid moments2. Tom ever so gently suggested that the $2 raises were an unjustified complexity as such $1-off moments were in fact something of a false decision 3.

After some thought I’ve concluded that he’s quite right, and yet not. The core notion is of the $1-off decision is that at the time of (fund) allocation a player is able to reasonably predict that spending $1 more or less now will control whether or not they’ll be $1-off for a later item. Tom is right, that’s a tall order and in the case of Corner Lot or Power Grid, or any sufficiently dynamic system, this is bogus. In Corner Lot such an estimation requires predicting not only the cards in the future markers, but the exact results of player bids – certainly not a reasonable question at the $1 precision level. The players simply have no way to predict that accurately. Instead the $1-off moments are effectively random events which simply happen to the players, randomly specifying that a given player does or does not have enough money for something. At this level the $1-off events, and their creation, are clearly uninteresting and the decision at the point the $1-off event was incepted (when the money was allocated) doesn’t really exist.

But that is not the whole story. When a $1-off event occurs, the subject player must decide how to respond and, if necessary, to recover. There are frequently real decisions at this point: The player can’t afford what they need or want, so how to marshal their capital to still support their victory? There’s usually a real decision there and that’s where the decision is. The decision isn’t at the time the $1-off event is created, not at its inception, but rather the decision is post-facto in the recovery from the random event. Additionally, this clearly identifies the real design question: Is the additional rules complexity of requiring a minimum $2 raise justified by the additional interesting decisions created by recovering from the higher rate of $1-off events? I’m tempted to say it is, but I’m clearly also biased. Hey play-testers, what do you think?

One of the other results of the conversation with Tom is that I’m going to be forking Corner Lot. I’m pleased with the current game and enjoy playing it, but auctions are out of fashion with the German publishers and the required componentry (chips, markers etc) make the more attractive lower price points difficult to realise. As a result I’m going to fork the design and create a different game, one still based on the same reservation bidding concept, but with considerable less arithmetic and with no explicit auctions (ie no round-robin auctions to resolve multi-bid cards). I’ve no idea on the game yet, or much idea about the theme (Ariel Seoane has suggested musical group bookings for a concert), but I’m working on it. Currently the numbers are just not working out…


  1. Occasions when players are $1 short of being able to afford a desired item). 

  2. Power Grid seems to be famous for $1-off events. 

  3. Assuming I interpreted his comments correctly. 

Twitter Week: 2009-07-11

  • @ChrisTheCat Is Ducati back up? It was down for what seemed the longest time. #bzflag in reply to ChrisTheCat #
  • 18TN appears better as a 3P than 4P. Odd little game. Neat, clever, small. I may just be a fan of Mark Derrick designs. #18xx #
  • RT @raphkoster:Brilliant infoviz graph porn on the economic recovery! RT: @tobiasbuckell http://tr.im/r8Dz #
  • 18TN. 120 minutes start to finish. Scores: 6485 (me), 6374 (Daniel), 5745 (Aliza). http://twitpic.com/9nuyg http://twitpic.com/9nv0z #18xx #
  • Actually that should be 180 minutes for 18TN, but who’s counting? #18xx #
  • Paxos, bakery, other concurrent algorithms - my scratchpad is ink-sodden just thinking them through. #
  • 18TN, 3 players, 3 hours, $6486 (Jacob) $5894 (me) $5424 (Aaron) - stupid 5 train! #18xx #

Twitter Week: 2009-07-04

Early Experience: Baltimore & Ohio

Eddie Robbin’s Baltimore & Ohio is the latest member of the Historic Railroads System and is part of the Winsome Games’ 2009 Essen Collection. It is a particularly trenchant perfect and certain information game all about timing, timing, and well, timing. In broader character, Baltimore & Ohio is Rimsky Korsakov‘s Flight of the Bumble Bee: full of little surges and races, layers upon layers of them, never relenting, always rushing, all of the races critical and requiring full attention and an endless delicate dedication to the dance.

Baltimore & Ohio has been described as the Historic Railroads System meets the 18xx, and there’s some truth to the claim. Functionally it is clearly a member of the Historic railroads System with a hex-map, track abstracted to putting a cube in a hex on the map, companies with shares, company dividends a function of company cubes in cities, etc. Architecturally Baltimore & Ohio is a child of 1825 Unit 1 (and 1825 Unit 2 and 1825 Unit 3) with a glaring focus on (1825-style) portfolio management and timing (owning the right shares at the right times) rather than 1830-style market manipulation. Spiritually, and yes the parentage is this complex, Baltimore & Ohio is the direct descendant of Lokomotive Werks1 with all of that game’s extra-ordinary attention to exacting cashflow, turn order, and timing – just carried forward into a larger and less relenting game2. Of the three, Lokomotive Werks has the dominant genes, shortly followed by 1825.

The game itself consists of stock rounds alternating with a pair of operating rounds. Initially 6 companies are available (B&O, B&M, C&O, NYC, NYNH&H & PRR). Later in the game 4 more companies become available (Erie, IC, Nickel Plate & Wabash). During stock rounds players acquire shares and manipulate the stock market. During operating rounds companies operate and may generate dividends for their shareholders. The game ends at the end of a set of operating rounds in which the highest level train is purchased (common), or when a share price reaches $375 (unlikely). The winner is the player with the largest net worth (portfolio value plus cash). There are few surprises here.

The rest of the model model is mostly familiar but does have surprises:

  1. As has been long-suggested for many 18xx (perhaps most frequently by Robert Jasiek) player turn order is ordered by ascending player cash at the start of stock rounds
  2. The stock market is linear with par value ranges an increasing function of the largest train purchased by any company - Sold shares reduce share-value by one slot, no matter how many were sold - Share values increase only if the company pays a dividend that is larger than its dividend from the last operating round - Share values go down if the company has shares in the open market, or its dividend (paid or withheld) is less than it was in the last operating round - In all other cases, whether dividends paid or withheld, share values remain unchanged
  3. On their turn a player may sell any number of shares from any number of companies, and then buy any number of shares (of one company) - Companies are incrementally capitalised as shares are bought - Each company has a different number of track cubes, limiting its potential reach and growth with some like the B&M and NYNH&H being very small (but adjacent to great cities) and others like the C&O having a great many track cubes
  4. When determining a company’s dividend run, all the trains the company owns are summed (eg two 2-trains, a 3-train3, and two 4-trains gives a total of 15) and then that many cities connected by the company’s track are selected to generate the dividend (without regard for sequencing or locality). Thus there is no route tracing, just a simple connectivity check - The actual dividend a company pays is equal to the sum of values of the cities hit by the company trains, minus a maintenance fee for each train the company owns, divided across the 10 shares in the company. The fee per train is equal to $10 multiplied by the size of the largest train purchased by any company, making smaller trains increasingly uneconomic over time

The board is rife with layers of short and long (timing) races. The number of companies allowed to connect to a given city is equal to the size of the largest train purchased by any company, thus there are races to get to more desirable cities first, locking other companies out. As city-capacity increases immediately when a new level of train is bought (and track is built after train purchasing), there are also races to be in position to buy the next size train and then immediately fill the newly accessible more-valuable cities. There are also races for special locations on the board with dividend-increasing coal tokens. As companies operate in descending order of stock value, stock rounds easily become positional dances attempting to force advantageous relative operating orders for specific companies so as to get them the good cities, good trains, good coal tokens etc4 before some other company does5.

Similarly, as there is such an advantage to being marginally lower in cash at the start of a stock round (to get first dibs on the best shares), there is often a muscular struggle in the operating rounds to run companies to pay as much as possible while having the controlling player end up with $1 less than the other players so as to secure the better turn order in the upcoming stock round.

This latter turn-order positioning is made more complex by the difficulty of increasing company stock values. There is a strong incentive to run companies for less than their maximum dividends so as to ensure stock-price increases by reserving future dividend increases by counting not-as-good cities for a dividend and then swapping in better cities in future dividends6. Getting the dividend sub-reporting for continued stock-value increases combined with maximising personal cash while also securing good turn order positioning can be difficult.

Those are not the only timing layers. There are yet more at different layers and levels, all open to inspection and manipulation. One trick is to hide cash in increased share value which would otherwise affect the player’s turn order. As companies are incrementally capitalised as their shares are bought, and all shares sell for the current stock value, there is not only a race for good operating order, but for various combinations of good turn order positions, operating order positions, good board positions/access, etc. For instance, the right new company floated at the right time, with the right par and thus the right capitalisation, and thus the right operating order (even after player-market assault), can pay great dividends while preserving the player’s turn order position, and be ripe to be dumped immediately in the next stock round, capitalising either buying all the best shares or floating a new company with the right par and the…etc.

As another example, there are also timing games that can be played with trains. In one of our games the NYNH&H, a very small company that can only reach 5 cities, already owned two 3-trains and had enough money in its treasury to buy an additional 5-train. Of course that gave it a total train capacity of 11 when it only connected 5 cities, but no matter. It then withheld its dividends and in the next operating round sold its 5-train to the bank7 and used that money along with its remaining treasury to buy the last 5-train, thus selling a 5-train to buy a 5-train and accelerating the end of the game while also leaving an opponent’s company unable to afford the larger train it needed and thus forcing it to withhold dividends yet again. Similar little timing games around the trains exist through-out the game.

All the little races and plethora of timing games, with every detail counting, sum to a larger fight to control the pace of the game and thus the length of the game. However rather than game-length being the defining centre of the game as it is in Wabash Cannonball, it is more an emergent and less directly-controlled property formed by the amalgam of all the little races. Due to capital concentration, ability to control the game’s development speed and thus length with lower player counts is greatly reduced. For the same reasons, the importance of game-length control, and the ability to affect it, also tends to increase as player-count increases.

Baltimore & Ohio scales across player counts similarly to the 18xx. As player-count decreases, control increases and the timing games may be played with ever-increasing finesse. As player count increases, capital is diluted across players, and control not only decreases but shared-incentives becomes more important and a whole new layer of emergently collusive timing games become possible. At the higher player counts the patterns start to stylistically resemble 6-player 1830’s, and at the lower player-counts, to likewise resemble 3-player 1830, complete with not only the different pacings, but the different values of different companies at the different player counts. The result is that 3 players plays very differently from 4 players, which in turn plays very differently from 5 players (I’ve not tried 6 players yet).

Expect your first session of Baltimore & Ohio to take between 4 and 5 hours, possibly a little more. With experience that play-time can be shortened down to around 150 minutes, but it will require both skill and discipline as with that increased skill comes greater ability to predict, control and thus play with the many many layers of timing in the game, pushing the game back up toward 4-5 hours. Perhaps surprisingly it is easier to push play-time down with increased player-counts, as with more players timing-control also decreases, making a great many of the more subtle and time-consuming timing games unviable.


  1. Early experience: Lokomotive Werks 

  2. I’d never expected to describe Lokomotive Werks as more relenting

  3. As in most of the 18xx, 3-trains are the best trains in the game. 

  4. Most of our games have spent more time in stock rounds than operating rounds. 

  5. Destroying stock values all the while! 

  6. This is considerably easier with some companies than others. 

  7. Companies may sell their trains to the bank (and out of the game) for a marginal value. 

Twitter Week: 2009-06-27

  • The hummingbird chicks by my door are growing apace: http://twitpic.com/86zp9 Fed on the spiders from the junipers, they’ll be flying soon! #
  • @ingredientx This is the Valley. No way in hell Twitter will run out of money. VCs beg to give them money. The ecosystem has really started. in reply to ingredientx #
  • @ingredientx They’ve a long way to run before monetisation is an issue. They have the eyeballs: that’s all that’s required for some years. in reply to ingredientx #
  • @ingredientx I went through the bubble at VA Research, Nuron, Critical Path, Protego Networks etc. I grok. I think they’ll make it. in reply to ingredientx #
  • Looking into #Django. There’s a fair bit to like here for a rapid development platform, esp if your code is also high velocity. #
  • @ingredientx Hehn. Yet more echoes of Lokomoticve Werks? The local complaint has been the hidden/uncertain demand. (I’ve not played yet) in reply to ingredientx #
  • @rholzgrafe Congrats! in reply to rholzgrafe #
  • Thinking of learning/using #Django to parse the #18xx differences list into a RDBMS so that game-specific views may be extracted. #
  • @brettspiel Dude, I told you to see Coraline 3D at the tme! It was exemplary. Yet to see UP 3D, but may this week. in reply to brettspiel #

Age of Steam: production probabilities

The following python script calculates the probabilities of a given cube on a row being produced by the end of a given round in a game of Age of Steam:

#! /usr/bin/env python
# Author: J C Lawrence <claw+blog@kanga.nu>
# Date: 25 June 2009
# Purpose: Calculate AoS cube production probabilities by row and round
def fact (x):
    if x < 1:
        return 1
    return reduce (lambda x, y: x * y, xrange (1, x + 1))
def xCy (x, y):
    return fact (x) / (fact (x - y) * fact (y))
def point_p (d, n):
    c = float (xCy (d, n))
    p = (((1.0 / 6) ** n) * ((5.0 / 6) ** (d - n)))
    return c * p
def sum_p (d, n):
    rc = 0.0
    for i in range (n, d + 1):
      rc = rc + point_p (d, i)
    return rc
def main ():
    for p in range (3, 7):
        print "Players: %d" % p     
        for r in range (1, [10, 8, 7, 6][p - 3]):
            print "\tRound %d:  Row 1 - %f\tRow 2 - %f\tRow 3 - %f" \
                        % (r, sum_p (r * p, 1), sum_p (r * p, 2), sum_p (r * p, 3))
if __name__ == "__main__":
    main ()

The results:

    Players: 3
        Round 1:  Row 1 - 0.421296  Row 2 - 0.074074    Row 3 - 0.004630
        Round 2:  Row 1 - 0.665102  Row 2 - 0.263224    Row 3 - 0.062286
        Round 3:  Row 1 - 0.806193  Row 2 - 0.457341    Row 3 - 0.178260
        Round 4:  Row 1 - 0.887843  Row 2 - 0.618667    Row 3 - 0.322574
        Round 5:  Row 1 - 0.935095  Row 2 - 0.740378    Row 3 - 0.467775
        Round 6:  Row 1 - 0.962439  Row 2 - 0.827219    Row 3 - 0.597346
        Round 7:  Row 1 - 0.978263  Row 2 - 0.886969    Row 3 - 0.704381
        Round 8:  Row 1 - 0.987421  Row 2 - 0.927041    Row 3 - 0.788168
        Round 9:  Row 1 - 0.992720  Row 2 - 0.953411    Row 3 - 0.851205
    Players: 4
        Round 1:  Row 1 - 0.517747  Row 2 - 0.131944    Row 3 - 0.016204
        Round 2:  Row 1 - 0.767432  Row 2 - 0.395323    Row 3 - 0.134847
        Round 3:  Row 1 - 0.887843  Row 2 - 0.618667    Row 3 - 0.322574
        Round 4:  Row 1 - 0.945912  Row 2 - 0.772831    Row 3 - 0.513209
        Round 5:  Row 1 - 0.973916  Row 2 - 0.869580    Row 3 - 0.671341
        Round 6:  Row 1 - 0.987421  Row 2 - 0.927041    Row 3 - 0.788168
        Round 7:  Row 1 - 0.993934  Row 2 - 0.959962    Row 3 - 0.868240
    Players: 5
        Round 1:  Row 1 - 0.598122  Row 2 - 0.196245    Row 3 - 0.035494
        Round 2:  Row 1 - 0.838494  Row 2 - 0.515483    Row 3 - 0.224773
        Round 3:  Row 1 - 0.935095  Row 2 - 0.740378    Row 3 - 0.467775
        Round 4:  Row 1 - 0.973916  Row 2 - 0.869580    Row 3 - 0.671341
        Round 5:  Row 1 - 0.989517  Row 2 - 0.937104    Row 3 - 0.811313
        Round 6:  Row 1 - 0.995787  Row 2 - 0.970511    Row 3 - 0.897210
    Players: 6
        Round 1:  Row 1 - 0.665102  Row 2 - 0.263224    Row 3 - 0.062286
        Round 2:  Row 1 - 0.887843  Row 2 - 0.618667    Row 3 - 0.322574
        Round 3:  Row 1 - 0.962439  Row 2 - 0.827219    Row 3 - 0.597346
        Round 4:  Row 1 - 0.987421  Row 2 - 0.927041    Row 3 - 0.788168
        Round 5:  Row 1 - 0.995787  Row 2 - 0.970511    Row 3 - 0.897210
 

No accommodations have been made for maps with different numbers of rounds per player count, or the insta-production rules used on most of my maps. Enjoy.

Twitter Week: 2009-06-20

Twitter Week: 2009-06-13

  • Yep, #twitter is a performance art more than a participatory or discourse system: http://tr.im/nEMD #
  • Common wisdom and the symmetry of popularity: http://tr.im/nEZh (via @andrew_chen, @jhong) #
  • @neilhimself So would that be the blessed schizophrenic duality of the beast or merely a squared beast, perhaps framed in fearful symmetry? in reply to neilhimself #
  • Piracy becoming the centre: http://tr.im/nJdZ If you outlaw piracy, only everyone will be a pirate. Ergo, you become what you resist. #
  • Blind search engine result testing: http://blindsearch.fejus.com/ Surprised? #
  • No, this is the onset of active data. RT @hnshah: RT @timyoung The web “page” will soon be dead. It’s days are numbered. #
  • @seo1970 And are the cows winning? Told Michael last night to not make a decision on the render, but to paste-up a real box. Light dawned? in reply to seo1970 #
  • @seo1970 Send me an URL? in reply to seo1970 #
  • http://twitpic.com/6zs9s It seems the hummingbird eggs by my door have hatched. http://twitpic.com/6zseh #
  • Google Wave’s success rests on its LCD OSS foundation? MS’s Mesh tied too hard to proprietary product stack? http://tr.im/nXIe #gwave #
  • Fiddled with Jeremiah Lee’s #Kindle during Tahuantinsuyu. Great human factors. The data-trap (Amazon dies, so does your Kindle) scares me. #
  • Do you know where you are? Really? Seen the Milky Way lately? Context is everything for a sense of life’s relative scales. http://tr.im/nZPb #
  • Here Cthulhu, here boy! Come on boy! That’s my little Cthulhu! Want a Care Bear for din-dins? http://tr.im/o69z (via @neilhimself) #
  • I’m off to meet the Wizard, the wonderful wizard of, umm, 18TN? B&O? Gimme my damn poker chips back, and no, you can’t have that many! #18xx #
  • Neighborhood pot boiler. RT @newscientist:Supervolcano under Mount St Helens may be cranking up for a biggun http://bit.ly/2HMDH #
  • The ranting on Rubicon’s offices is BS. They’re not an engineering/tech company, they’re market-driven media and they’re optimised for that. #

Time's sweet paradox

To some degree games may be classified as reactive and predictive. it all depends on where the players act in relation to the progression of time in the game. In reactive games events occur in the game and the players respond. They may have prepared for such an event in advance, but their response is purely reactive when it occurs. In predictive games player act ahead of the game time, they make choices so that when/if certain matters should come true they are ready and (ideally) don’t even need to react. This is perhaps not a stunning insight, but it got me to thinking, What about a game in which the players are never in present time, a game in which the players exclusively operate in the future, both short and long term? What if players can only operate within the bounds of an increasingly uncertain future?

Imagine a planning game, perhaps a logistics game of some sort. Possible actions are arranged in a stack, perhaps represented by cards or tiles. The bottom action is NOW (ie present time) in the game sense. The bottom action card will be performed on this game turn, either by a player or by the game itself in some autonomous fashion or interpretation. When an action is performed it is discarded or perhaps recycled.

Each player has a number of markers, perhaps two or three which they can place on action cards (one marker per card) in the future. In fact this is the only decision afforded to a player: committing to a future action. If and as when such a card with a player marker becomes the bottom card, that player does that action, and they move their action marker to another action card (unoccupied by another player’s marker) in the future.

But things are not quie that simple. Actions have durations. As quick example a future action might be building a factory. However the action card reaching the bottom of the stack merely means that construction has started. Factory construction lasts 5 turns (ie 5 action cards off the bottom of the stack). If the factory construction card was 3 turns in the future when the player put their marker on it, then the player waited 3 turns before starting to build the factory, and then another 5 turns of actually building the factory (assume some cost for this) before the factory is finally built and the action marker may be used to reserve yet another action in the future. Game state could have changed considerably in that time. Perhaps the player carefully built a Q-Factory as Q-items were in high demand and commanded a price premium, but by the time their factory came online, not only had the Q-item market collapsed, but Q-items were obsolete and couldn’t even be used for any purpose! Then again, they might have started shipping T-items by slow boat over the ocean, a trip that takes 7 game turns, only to find that T-items are commanding a huge price premium when they arrive.

In short the player is constantly committing themselves to events which will only occur in the relatively distant future (in game terms). They have absolutely no ability to react to current events, only to setup changes that will be realised after an appreciable game delay. In short they are stuck in the future.

Some abstractions may be added. Players could be allowed to sell each other the actions they’d reserved in the future, or possibly the actions that have occurred but are still maturing (eg construction on the factory has started but not yet finished). In this way something of a futures market could be supported in which players not only speculatively commit to actions they think will be profitable for themselves, but also to actions they may be able to sell to other players. Of a sudden players are trading in what they imagine the game’s future will be.

Twitter Week: 2009-06-06

  • The short definition of Google Wave: Conversation as a first class noun/object. The rest is just network & RPC model. #gwave #googlewave. #
  • @timoreilly @vanessafox Search spiders replicating human/client views isn't l/t viable. Predict custom views for spiders - & trust issues. in reply to timoreilly #
  • Google Wave may rewrite the blogosphere. Blogs become wave collections. Goodbye RSS! If waves can nest, blogs become just another #gwave. #
  • @ysrthgrathe Aye, getting the auth model right for Google Wave will be interesting. #gwave in reply to ysrthgrathe #
  • #tweetdeck limited to 11 columns, #nambu 20 searches. Must run multiple clients to get perspective? Need 75+ w/ priority sorting. #twitter #
  • Twitter, Facebook , blogs etc allow users to find discussions. Google Wave doesn't. Participating is one thing, finding is another. #gwave. #
  • Good discussion of systemic trade-offs in both problem resolution and process: http://bit.ly/On0Rl #
  • @davemcclure Microsoft, Google and Yahoo! have re-invented their platforms at least once every 5 years. #twtrcon in reply to davemcclure #
  • Any guesses on number of RPCs/second/user for Google Wave? What are the operational boundaries? #gwave #
  • Greedy algorithm is strong in 4 player Mexica. With 3 players is viable but not dominant (tough proof). http://tr.im/n8n7 http://tr.im/n8na #
  • Game design thought for the night: What if you're herding cats (or dogs), but all you can do is to point their tails in the right direction? #
  • @doctorow On source `dpkg --get-selectiions | fgrep -v deinstall | cut -f1` > pkg.list then `xargs apt-get install < pkg.list` on target in reply to doctorow #
  • Max-diff surveying what customers really want with clear differentiation and ranking: http://tr.im/nsFK (via @seanellis, @brantcooper) #
  • @raphkoster While twitter can support conversation, it is more of a performance art upon a stage. in reply to raphkoster #
  • A little sentimental, but well worth the time, the thought and the resulting discussion. Home: http://www.youtube.com/homeproject #
  • Ray Ozzie has a point: Google Wave “is anti-Web” http://bit.ly/12VwcD #gwave #