Other Wise

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 #

Oooo my pretty precious!

As those who follow my Twitter feed know, Corner Lot did rather well at the Kublacon design competition, coming in the top 3 and quite likely being second. Julie, the organiser of the competition said that if it had player aids it would have won.

Several changes:

  • Player aids! Yep, there are now neat little player aids which contain the most frequently requested information (the 4 bonus categories and the 3 actions)
  • Spiffy new art without conflicting colour pairs (all credit goes to Ariel Seoane here)
  • An advanced variant which simply ups some costs and cash drains and thus significantly changes the timing and pacing of the Empty Lot cards1

New rules. Playtesters will find that the file at the same magic URL has the new card images and rules.

Footnotes
  1. The increased cost of the Empty Lot cards is not cast in stone, the other two values likely are