Wednesday, December 14, 2011

Misc Travel Notes

One of the better perks of academic life is the occasional opportunity to travel to various conferences, which gave me an excuse to go to Bali to attend CACS 2011 in November. The downside of pulling this trick is of course that your opportunity to sight-see is rather limited by this annoying "conference" thing.

Still, I managed to see a bit of the country, and generally had an enjoyable trip.

Various notes:
  • Sex tourism is clearly big in Bali, as evidenced by being offered Viagra by a very insistent street merchant and a "very nice girl" by the hotel's security guard on my first day there.
  • Walking around with a couple of million rupiah (about R2000) was rather fun
  • Having to scrounge up internet access at internet cafes felt very archaic
  • I seriously underestimated the carrying capacity of the average scooter
  • The rules of the road for scooters in Bali are from a very different book to anything else
  • The Balinese clearly have lots of practice at fleecing tourists
  • Dealing with the above while slightly jetlagged is not recommended
  • Not unrelated to this, the infamous Civet coffee is actually really good, but far too expensive
  • The runway right on the beach is very impressive
  • As is Mt Agung
  • As are the sunsets

The conference itself was pretty good, although it dropped down to minimal attendance fairly quickly, which was probably due to the competition with the local attractions.

More photos can be see at my gallery.

Sunday, September 18, 2011

Pyweek 13: Mutable Mamba

First, play our latest pyweek entry:

The game went a lot smoother than pyweek 12's Nine Tales. I think we hit on a much better scale for this effort, given the time available, and, as a puzzle game, we were able to get the basic mechanics reasonably set early enough that we were never under pressure to have a game to submit, and so could do a fair amount of polishing. This also meant we actually spent a lot of time actually playing the game, so we could work off a few rough edges, which was good for the game.

We also spread things out a bit better than in pyweek 12. We avoided the major stumbling block of lots of central state people had to touch which we had in Nine Tales (the infamous game.json), which meant we had fewer merge issues than previously, and, by not using yet another version control system, benefited from the lessons learnt about mercurial last pyweek.

Unlike pyweek 11, where I ended up accidentally writing a level building tool, I more deliberately decided to write a level editor this time. While it's not perfect, and only learnt a few important tricks on the Saturday, the effort was, I think, well spent, as it allowed us to rope in spare people for extra level design effort, and made the addition of uploadable network levels a lot more feasible.

There are several issues. Most notable, our within a week widget stack, although inspired and influenced by past experience, is kludgy and lacks proper support for several important features. We should probably have a good look at the our last couple of pyweek entries and cut out a basic widget library from them, which can save us time in the future.

While not the best of our pyweek entries, I think we ended up with a fairly solid game, and it can fairly easily be extended by adding new levels, and, if we polish up the multiple tileset support, it would be quite easy to reskin levels.

Tuesday, June 28, 2011

June 2011 Tournament (Final)

The shape of the final was changed fairly dramatically when Yancke pulled out, and Simon stepped in, which bumped me up to seating 4th.

The final seating was me (OBF/pre swarm) starting, bleeding Simon (5/6 Baali with the Horder) bleeding Richard (Gargoyle wall with Smiling Jack) bleeding Marc (Lasombra Anarchs) bleeding Brendan (Ahrimane wall'ish bleed and top seed).

I didn't have an ideal crypt draw, but my opening hand had two Effective Managements, so that wasn't actually an issue, and I was soon up and running with both Renenet and Herbert Westin in play, and was able to steadily bleed Simon. Simon was able to put a fair amount of pressure on Richard, while Marc, without the stealth to get through Brendan, gradually brought out more minions without much pressure. Brendan was bleeding me for the odd one or two, but wasn't setup enough to bother me in the early game.

The table ended up sitting up quite nicely for me, and my deck flowed really nicely in the early part of the game - with the aid of the Baali's infernal cost, I was able to oust Simon quite quickly, and then, thanks to some fortuitous stealth top-decking, and the increased hand size from The Bitter & Sweet Story, I was able to stealth over Richard often enough to oust him (Most memorably requiring 5 stealth cards to land one bleed, thanks to two cards being canceled). Marc didn't have the intercept to trouble me, although he did bounce a few bleeds, and I duly ousted him for my 3rd VP. At this point, though, I had burnt through a lot of my deck, and didn't have enough stealth left to get through Brendan, eventually decking myself, and, as he was soon setup with extra bleed options, I duly fell to the Ahrimanes. Still, I'll happily take a 3 VP final GW.

The events module for the deck doesn't flow as I hoped - I eventually did get The Rising down, but only after I had gone through most of my deck, and thus it didn't impact on the game at all. The PRE/OBF bleed module worked wonderfully well, though, and the lack of rush on the table made my life a lot easier.

After the final, we played a quick social game - I tried the Baali vote deck again. Although I did land one Reckless Agitation, I didn't get the combat cards I needed to survive against the rush from James' Assamites, who were my prey, and was not able to keep enough minions up to get votes passed with the other titles on the table, and so was ousted fairly quickly. The deck probably needs a bit more of a defensive bloat module so it can build up it's position a bit, and then lunge rather than it's current build, which tends to start a bit fast and attract table hate it can't really deal with.

Sunday, June 26, 2011

June 2011 VTES tournament (prelim rounds)

We ended up at 8 players for the tournament (which was a significant improvement on the 4 for the last Tokai tournament), so we opted to go with a multi-deck format. As 3 of us (myself, Simon and Marc) had built variations on the new Baali vote deck, the multi-deck format allowed us to all try the deck at various points without contesting.

The first round of the tournament saw Marc (Baali vote) bleeding Antony (!Malk) bleeding Matthew (Giovanni bruise and bleed with Fortitude) bleeding me (Weenie OBF/pre with the Rising). Marc got out Arishat and a Horde early, Matthew brought out Ignazio and started to govern out a couple of support minions, I brought out Renenet and a obf weenie and Anthony brought out Harold Zettler. I landed a couple of early bleeds, but Marc got the fastest start, with 2 early Reckless Agitations, a Kine and a couple of bleeds seeing him oust Anthony on the 4th or 5th turn (Anthony helped by spending 3 pool on Masters fairly soon after the 1st reckless and bringing out a second minion without finding the farm he needed). I ate a couple of heavy bleeds from the Giovanni, but a couple of Social Charms and the low cost of my minions helped me build up to 4 minions out, and, with Marc looking the table threat, some fast talk saw Matthew wasting a few actions rushing Arishat, which both slowed Marc down and took pressure off me. I was down to 1 pool before I ousted Marc, who had worked Matthew down to only 3 or 4 pool, although he was whittled down to only a single Hord able to act. Thanks to the increased hand size from the Bitter and Sweet story, I was able to survive a rush from Matthew and oust him the next turn. The OF/pre deck didn't quite come up as planned and I need to work on the events package so I can get the Rising into play, but did OK for it's first outing.

Since we were done and dusted in about 45 minutes, and the other table was still going strong, we ran a small social game.

Marc (Assamite BH) bleeding Anthony (!Malk) bleeding Matthew (Small Liabon POT) bleeding me (weenie vote). I had a somewhat weird draw, and didn't see a single Praxis Siezure in the game. However, I was able to hit Marc with 3 or 4 Kines before another title hit the table, and, with some careful negotiation, was able to pass enough votes after the to oust Marc. Matthew spent most of his time rushing backwards, but wasn't able to fend off the Malks (the lack of pressure from Marc helping Anthony here). I did lose a couple of minions to Marc's Hand Contracts, but the swarm ran over him. Anthony did land a couple of heavy bleeds on me, but to deny me the votes, he brough out a second titled vampire, and I was able to simply swarm bleed him out for the win. This was another short game - we finished this game before the second table had seen it's first oust. The weenie deck isn't perfect yet, and needs a couple more tricks for dealing with other votes on the table, but is currently not bad.

In the second tournament round, Simon (Baali vote) was bleeding me (!Brujah bruise & vote) was bleeding Anthony (!Malks) who was bleeding Yancke (DOM/THA power bleed). Given Hektor's downside against the Baali, I opted to play with the B team. Simon got a fairly fast start, and was able to land a couple of annoying bleeds. I also bled myself with a couple of expensive masters. The titles on the table made passing votes for both Simon and myself difficult, which created some interesting dynamics. Yancke was sitting pretty, being able to bounce Anthony's bleeds and not having boucne to worry about from Simon. There was an interesting turn where Simon Reckless Agitation'ed Yancke backwards to try and weaken him, and then I Consag Boon'ed the Baali to try help hold off the DOM swarm for a turn, but it didn't help, as a bounced bleed ousted Simon, and then, although I blocked and torporised one of Yancke's bleeds, a Seduction saw him oust me in the same turn. Anthony didn't have enough pool or bleed to survive the head's up against Yancke, and fell soon afterwards.

While we decided to have the final only on Monday, we had another social - this time 5 players with Matthew added to the game. The table saw Yancke (Osebo) starting, bleeding Simon (CEL/THA trophy deck) bleeding we (new Baali vote) bleeding Anthony (!Malk) bleeding Matthew (Giovanni).

I had the prefect opening crypt, with all 3 of Arishat, Annazir and Xepher and a Horde, and an early Dreams to help accelerate my crypt. I brough out Xepher first, while Simon brought out Lucas, and Anthony brought out a small Malk and Rudolfo, and Matthew brought out a couple of giovanni (without Ignazio), and Yancke brought out Massasi and a random Catiff. There were a couple of odd turns - I landed a Reckless Agitation on Anthony, who then bled backward with Kindred Spirits with Rudolfo for 4, before having being rushed by Matthew. Simon then rushed, torporised and Amaranth'ed Xepher, but didn't quite have the vote lock, so some frantic table talk saw Lucas burnt in the blood hunt. This slowed Simon down enough that I was able to bring out both Annazir and Arishat, although it did leave me very low on pool. Yancke wasn't really able to capitalise on Simon's weakened position, so Simon was able to influence out Lernean and a 4 cap. There was an amusing exchange when Yancke blocked a bleed from Matthew with Massasi and Immortal Grappled, only to be hit by a inferior Burning Wrath. However, a couple more blocks and CEL/POT fun saw all Matthew's minions in torpor, which allowed Anthony to oust him. I was running a bit low on pool, but a second Dreams allowed me to get some card flow going, and I was able to get a couple of votes and Voter Capitivations played to take me out of immediate danger and weaken Anthony. I was able to pull off the Kine, My Kin to untap, bleed, bleed combo to oust Anthony, and, with a hand full of stealth, was able to dispense with Yancke in short order, at which point we called the game. The Baali deck showed promise, although the master card flow was a bit weird, and, had Simon's deck drawn the Red list actions rather than the votes, I would have had a much tougher run.

Sunday, April 10, 2011

Pyweek 12: Nine Times

So a bunch of us took part in pyweek 12. While we had a lot of fun, and the ended up with something that looked very good, we didn't quite manage to get the game completely playable inside the 1 week time limit.

Failures are generally more educational than successes, so some thoughts on what went wrong.

a) We were arguably over ambitious, although I'm not sure where we needed to scale down. This is probably the most important factor as it meant we took too long to get enough of the game playable that we could start getting stuff hooked up, and it also meant that we didn't have as much overlap on knowledge of the code base as we had on Suspended Sentence, which slowed us down at critical points, and made fixing various bugs quite hard.

b) We took too long to converge on what game we were writing. Various bits grew in different directions and got fixed in the wrong place, and there were a couple of dead ends we pursued. We also didn't have the time to refactor code to fix things as we've had previously, so the game is more than just somewhat buggy.

c) We didn't know mercurial nearly as well as we thought we did. Most of us had used it for the Genshi sprint, which was quite intense, as well as using it on other projects, so we thought we going for a safe option At the pace of pyweek development, however, we tripped over mercurial not behaving as we expected quite often, and the slow downs fixing the issues this caused all added up to quite a lot of lost time.

Still, the game has a number of promising bits, and, with some concerted work on the engine, and some work on the other bugs and the game balance, it can turn into something really quite cool. This should be a good candidate for pyggy, if we can summon the energy to tackle again.

Monday, April 4, 2011

Veiled Sight (April 2011 VTES Tournament)

So we recently held the first VTES tournament of 2011, with the first rounds on the 2nd of April and the delayed final (due to pyweek) only on the 13th.

We had a good turnout, with 12 players for the Saturday. A very important number, given the rules of the TWDA.

I decided (via die roll) to try the "Not a Lutz deck" again, which ended up being a good choice and did quite nicely for itself.

The first round saw me (starting) bleeding Hendrik (Assamite trophy deck) bleeding Dave (Kiasyd sleaze) bleeding Yancke (!Tremere DOM Mirror Walk stealth bleed). I had a fast start, with two early Zillah's Valley's which saw Lutz out on turn two, and Alicia on turn three, and an early secure haven on Lutz essentially shut down Hendrik's deck. I took a couple of turns to reach a Minion Tap, though, and, had Yancke drawn an early conditioning, I would have been the first ousted. I was able to oust Hendrik, but, due to a Covincraft from Dave, needed one more vote card to do so than I had hoped. At this point, I suffered a critical deck failure, and didn't draw the votes I needed to oust David, and, with not enough bounce, was rapidly whittled down by Yancke's DOM. Yancke critically ran out of bounce, and was ousted by David who then ousted me.

On the other tables, Brendan (Tzimisce wall with DOM) took 3 VPS, with Simon (Spiridonas bleed and vote) taking 1, and Marc (Torrance Circle BB) and Richard (Weenie Liabon Vote) getting none. James (Imbued) took 3 on his table with Kevin (Settites) getting 1VP, with Anthony (Kiasyd) and Evan (!Salubri with Q) getting 0 each.

The second round was one of the more stressful, and frankly odder, games I've ever been involved in.

The table was James (Imbued) bleeding Anthony (Kiasyd) bleeding Richard (Liabon vote) bleeding me. I didn't get as fast a start as the first game, but I did start by contesting James' first turn Dreams of the Sphinx immediately, as contesting with your prey is usually worth it. I got Lutz out on turn 3, only for James to Pentex him immediately. Richard was gradually building up, and not blocking any of Anthony's actions, and succeeded on jamming on stealth. I was extremely vulnerable for a turn while I got out Alicia, and got going again, and, had Richard had a extra bleed card, I may have been ousted before I got to act.

Once I had Alicia, I drew a Minion Tap, which gave me a buffer, and started to dent James' pool a bit. There was also a cross table rush on Richard by James that helped me, by slowing Richard up a bit. I made a misjudgement when I wasted a couple of actions trying to burn the Pentex before realising that I didn't need to. Due to another Minion Tap, I was able to bring out Aristotle, which was important, as, without his extra stealth, I was struggling to get past the intercept of the Imbued.

There was one critical vote by Richard, which would have led to my being ousted, but frantic negotiation with Anthony saw him cycle a Covincraft to save me. This however left Anthony without a wake, and he fell to the James' lunge immediately after this, and, at this point, the table looked to be falling for James. Richard, however, was worried about the threat of the Imbued and cut a deal to pass a couple of votes with me, which hurt James, and, combined by a bounced bleed (by the still Pentex'd Lutz) which forced James to tap his blockers, I was able to land a couple of votes and get him within range again. James then played Gambit accepted, and, thanks to a Minion Tap on Aristotle, I was able to buy myself enough breathing space to oust James, although, had he chosen to block rather than determine my Kine, I wouldn't have been able to make the lunge stick. In the end game against Richard, I was able to block a Founders, and, although Richard had managed to secure the vote lock, he couldn't call aggressive votes due to Lutz's special. Once I remembered that, with James ousted, Lutz was free to act again, I could bleed faster at stealth than he could, and so I was able to oust him for the sweep. I made several poor decisions, but was able to hang on enough to recover.

I didn't see what happened on the other two tables, but Yancke & Marc both swept, but my extra VP from the first round saw me enter the final as top seed. Brendan, James and Dave were all tied, and Brendan lost the roll off for a place in the final. Yacnke and Marc also rolled off to see who would choose seating first, with Marc rolling lowest (and so choosing first).

For the final, Marc (unsurprisingly) chose to sit upstream of the Kiasyd. Yancke then chose to sit between The BB and the Kiasyd, which surprised me, as I expected him to sit upstream of Marc. As I didn't want to sit downstream of the DOM decks, I chose to sit between James and Marc, hoping that the upstream pressure would keep James off my case and that I could oust Marc before he got the wall part of his deck setup. I rolled highest, so I started.

The final was one of those games where my deck, despite not quite coming as I wanted, generally ran nicely. I got a first turn Dreams, which allows me to get Lutz out on turn 3, despite starting, and despite taking an early bleed for 3 from James, an early Minion Tap saw me up to a decent pool again. I didn't draw any voter caps for much of the game, but, as I had enough stealth to go over Marc's Gestalts, and James was too occupied with the pressure from upstream, I didn't see any combat, and thus never has any real blood management issues.

YDave got up to 3 minions fairly quickly via some govern trickery, and Yancke got up to t2o, with Carna appearing in the mid-game. With Yancke bleeding heavily, and David drawing a truly astonishing number of bounce cards, James was left trying to block 5-6 bleeds a turn, which took all the pressure off me. A key early play saw James try to Pentex Dave's the Arcadian, only for Dave to Sudden it, which ensured that James never got to go forward at all. I had votes come up nicely, and was able to whittle down Marc in good order. Thanks to a Forgotten labyrinth, I was able to stealth over Marc and oust him despite his intercept, and, with the aid of a Zillah's Valley, able to get Aristotle out and into play as well. James eventually ran out of blockers (although there was one 4 bleed that was bounced to Yancke who then bounced it to me, which itched a bit), and was ousted. I had been able to Minion Tap Alicia, but at that point wasn't out of lunge range. I was able to call a couple of votes to whittle Yancke down, also including the first Voter Cap I'd drawn .

At this point, Yancke was looking quite vulnerable, and, as I had a Rumors of Gehenna in play I could vote away at will, I was fairly certain I had him next, but I was worried about the heads up against Dave, who had shown considerable bleed potential, no shortage of bounce and was looking pretty on 14 pool. Yancke bled forward, though, and it turned out that Dave was out of wake and bounce, and he was whittled down to only 4 pool. He was also short on bleed, so I started my next turn sitting quite pretty, espeically as I was then able to Minion Tap Arisotle to ensure I was safe. A Kine and a Conservative Agitation saw me oust Yancke, and the incidental damage reducde Dave to 1 pool, and then voting away the Rumors saw me oust Dave, so I ousted Dave and Yancke in a single turn for the game win.

The table did sit up very nicely for me. The shortage of other votes on the table meant that, although I only drew a couple of vote push cards and 1 Voter Cap, I never had a problem passing the votes. Choosing to be Marc's predator was the correct choice, as, once he was ousted, no-one else ever threatened to block me. The Masters came up very nicely - I had an early dreams, which got Lutz out one turn earlier, and drew Minion Taps when I needed them. The low combat environment meant I actually jammed a bit on S:CE cards, which is most unusual for Cape Town, but I always had a vote in hand when I needed one, so I never lost momentum.

So, a successful tournament win, and what should be an entry in the TWDA, which is a nice little milestone to tick off.

An Observation

It's regrettably common for car drivers to try and muscle out motorcycles, and, given that the motorcyclist is the squishier of the parties involved, it's usually better for the motorcyclist to choose discretion over arguing too hard about right of way.

As an enthusiastic motorcyclist, I've this happen to me numerous times. It is, however, hard not to feel particularly ticked off when the car in question sports a prominent "Think Bike" sticker.

Friday, April 1, 2011

Failing to learn from history again

Learning from history is often hard - without the perfect vision of hindsight, it's easy to overlook the similarities of your current situation with past experience. This isn't at all comforting when one recognised the similarities and dismissed them with "This time, it will be different".

I often write "throw away" code - usually to isolate some specific code path or test some specific case that's currently interesting from the larger system. As the code's initial life expentancy is quite short, I often don't bother with niceties like proper argument parsing or decent error handling. In theory, the technical debt from this never be a problem, just write a little wrapper program, learn what you need, and throw it away.

The scare quotes and "initial life expectancy" phrasing should immediately identify my problem, though. If I didn't but the code in the VCS, the theory might work, but, once the code is there, it's never going to be thrown away, and, since it exists, in a day or a week or a month or something, I'll need something similar, and it's easy enough to just quickly add an option and make the throw script do a little more, and, since it's still just a throw away script, there's still no need to do proper error handling or argument parsing. And, of course, the moment a couple of the command line options become enshrined in a test script or two, the effort required to actually fix things never seems worthwhile, despite the increasingly convoluted "simple quick code" handling things.

Given that I've trodden this path several times before, this week's effort of going from 100 lines of C requiring a single filename to two 250-line interlocked programs, each with complex combinations of options and error handling from the oblivious school (the actual important code of each program is still less than 100 lines each), via a steady stream of "I'll quickly add this", is one of my more impressive examples of failing to heed lessons from the past. Next week, I'll probably spend some time fixing things, although there's still that ever so seductive "it's just one last option and then you can throw it away" voice to deal with.