PTQ Berlin in Berlin I (FUNtainment)

Last Saturday (August 2nd) was the first of two locale PTQs for the Pro Tour in this very city. It was held at the FUNtainment Game Store. Going into the event I expected 70 X players. 70 is about the normal number for Block Constructed PTQs (which are never very strong), and X was going to be an unknown number to account for the fact that this was going to be for a local Pro Tour. It turned out that X was -12. A turnout of 58 players was very disappointing, but this was in line with the turnout at other PTQs. Dortmund also had 58 players and PTQs in the US and UK also reported a low turnout. We had the normal amount of players from outside Berlin (mainly from Hamburg, Magdeburg, and Poland), so this means that the Berlin players were underrepresented. We can only speculate about the reasons for the low turnout: Maybe it was because of the format or the fact that we have summer holidays in Germany. Maybe it’s also a combination of multiple facts.

The judge staff consisted of Kersten, who was going to be scorekeeping trainee, Christopher, Wolfram (my current trainee judge), and myself as head judge. The low turnout allowed me to coach both Kersten and Wolfram a bit, although things got a little bit hectic when we started a side event Grand Prix Trial (for Grand Prix Copenhagen) after the 4th round. This had exactly eight players, so it went straight to top 8.

During round 1 I’m checking deck lists, when I notice a Russian Reflecting Pool among the pile of lists. As I go hunting for the deck that this card belongs to, I come across a player (let’s call him Adrian) who uses the same sleeves. When I ask him whether it’s his card, he denies it and tells me that he counted 60 cards in his deck when he shuffled. I confirmed this by counting his cards again. He then asks his friend Bertram whether he was lent this card and Bertram claims that it was indeed one of the cards lent to Adrian. But since Adrian has a legal deck, I let them play on and went back to the judges station. When I count Adrian’s deck list, I notice that he marked down 61 cards on the list! Just as I am about to go back to the table, Adrian comes up to me and tells me that he remembers that he actually plays 61 cards. Well, I give the Game Loss for Deck/Decklist Mismatch. Since Adrian has just lost game 1, this means he lost the match. Had he remembered earlier, the Game Loss would have been applied to the game in progress …

During one of the later rounds we have scorekeeping problems. When Kersten went to fetch food there was some confusion that resulted in players being dropped from the tournament that wanted to play on and other drop being missed. I had the chance to show Kersten how to manually repair situations like this. Since it affected players in the upper third of the standings, I couldn’t just award byes to fix the situation. Also, players were already seated, so repairing the whole tournament would cause too much trouble. In the end I had to manually pair three tables and the tournament went on.

A player that was in contention for top 8 was deck checked. I noticed that his sleeves were in a really bad state. Most sleeves were just dirty, wrinkled, and generally unacceptable. But I noticed a total of four sleeves in a better condition. Two of those cards were Profane Commands, the others were lands. After taken a short look at the sleeves, I was able to identify both Profane Commands without more than glancing at the cards. I issued a penalty for Marked Cards – Pattern, although this was a borderline case that could also be ruled as Marked Cards – No Pattern. Of course the player had to resleeve. What I don’t get: The player had new sleeves with him. Why didn’t he use them in the first place? I know that the player had played a few PTQs before.

Be careful how you counter!

During swiss rounds Charles tries to counter Daniel’s Demigod of Revenge. Since he doesn’t announce that he waits for Demigod’s trigger to resolve before he counters, I rule that Demigod returns to play. This is the standard ruling for this situation. Daniel made it to top 8 and there a similar situation arises. He plays Demigod and his opponent, Evan, puts a Cryptic Command into play, without announcing modes or tapping mana, yet. Daniel claims/asks “[Demigod] trigger on the stack”. This time the ruling is not that clear, since Evan didn’t finish playing the Cryptic Command. Nevertheless I ruled the same way as before, since it was clear to me that Evan wanted to counter the Demigod and did not announce that he wanted to wait until the Demigod trigger resolves. Evan argued that both he and Daniel were experienced players, and knew how to correctly counter a Demigod. While I believe that that is true, I require some kind of visual or verbal clue that the player intends to wait for the trigger to resolve. Just knowing how to play it correctly is not enough. I made Evan announce the Cryptic Command correctly and have the Demigod return to play. I educated both players about clear communication, saying what you intend to do, and letting the opponent finish playing his spells before interrupting.

The tournament ran quite slowly. Especially during extra turns we should have watched the time more closely. Slow Play penalties are difficult to give. But one judge reminded players three times during a match to play more quickly, and didn’t hand out a penalty. This is clearly wrong. One reminder should be enough. But there were more delays: We waited for a few late players at the start of the tournament. Unfortunately a few trains arrive at a time that makes it impossible to arrive on time at the tournament site. So waiting for late players is common. I wonder whether we should just move the start time of tournaments where we expect players from outside Berlin and Brandenburg a quarter of an hour back. Then there were the scorekeeping issues. And finally seating the players alphabetically at the start of the tournament costs time. (But allows judges to be more efficient by collecting deck lists in a sorted manner. It also allows the head judge to make announcements without players being disturbed by shuffling or talking to their opponents.)

There were a few interesting rules questions:

  • I have taken control of a creature via Sower of Temptation and Sower becomes another creature, thanks to Mirrorweave. Do I keep the creature? You keep the creature. Sower’s ability just cares that you keep control of the object that used to be Sower. What happens if the former Sower dies? Your opponent gets his creature back. Same reasoning.
  • I control a Figure of Destiny that is currently a 4/4 Kithkin Spirit Warrior. Now my opponent play Mirrorweave, targeting an Eager Cadet. What happens to my Figure of Destiny? It’s now a 4/4 white Eager Cadet with creature types Kithkin Spirit Warrior and without abilities. Mirrorweave’s copy effect applies in layer 1 and changes the Figure of Destiny to an Eager Cadet. The enhance effect of Figure of Destiny applies in layer 4 (type changing effects) and 6b (other power/thoughness changing effects) and overrides the value set by the Mirrorweave.
  • I attack with an animated Mutavault. My opponent player Pollen Lullaby with Kicker and wins the clash. Does Mutavault untap during my next untap step? It does. Pollen Lullaby changes the rules of the game and doesn’t remember the objects that attacked.

This Sunday there is another PTQ at the Der Andere Spieleladen. I’m really looking forward to it, although I’m worried that the turnout will be low again.

PTQs for Valencia

It was a hard weekend. I was head-judging two Pro Tour Qualifiers for Valencia. The first on Saturday in the Der Andere Spieleladen here in Berlin, the second on Sunday in the Heldenwelt in Magdeburg.

Saturday we had 66 players. I had two floor judges (Robert Zemke and Christopher Eucken, both level 1) as well as two staff employees helping out. This turned out to be just the right number of staff for this event. The event went rather smooth, without any major headaches. The most problematic situation arised during top 8 when one player started with extensive trash talking and disregarding judge’s instructions to stop. Only after I made it very clear to him that I would issue the appropriate Unsporting Conduct penalty if he continued (a Match Loss at Competitive REL), did he stop.

Like at most PTQs here in Berlin we had a few Polish players. In general this is not a problem, since they speak English very well and I do all announcements in German and English. But it is always a problem if they with each other in Polish while another player is still playing. When players or spectators speak in English or German I am able to automatically filter out “harmless” chatter, e.g. a spectator telling a player that they will fetch food for themselves now or two spectators speaking about their last match. This is not possible when people speak a language I don’t understand. Therefore I ask them to stop communication more often than I ask players I can understand. This is not an ideal situation, but one that is hard to resolve, unfortunately.

In one semi-final match two of the Polish players were paired against each other. Both had card-identical decks, so the match was played in a rather light mood. The finals again were rather quiet. The event ended at about 23:30.

Unfortunately I did not get much sleep that night, so I was rather tired when I met my co-judge Kersten Rückert (L1) at Berlin Central Station at seven in the morning. Magdeburg’s judge situation is even worse than Berlin’s (it seems they don’t have any active judges), so they had to import judges from outside. This meant Kersten and me. One other judge unfortunately had cancelled his participation. At Magdeburg main station we were greeted by Peter from the Heldenwelt, who supported us as scorekeeper. With a total of 57 players (a good turnout, considering the location, and time during holidays) we were unstaffed by about one judge.

The tournament took place in a basement that consisted of two long halls with fairly high, vaulted ceilings. This gave the event a nice, medieval touch. One hall contained the playing tables, while the other had the scorekeeper and judge’s tables and the feature match area. The halls were connected at the end by two small doorways. Actually the layout was rather good, because the separate scorekeeper and judge tables meant quiet, relatively disturbance-free working. And you could use this hall to get quickly from one end of the playing area to the other one.

Teardrop was doing coverage of the event (in German). I like coverage for these smaller events. I think many people who can’t make it to the tournament can still follow it and see how their friends are doing. It helps the community in a local context the same way coverage of Pro Tours and Grand Prixs help the community at large.

Unfortunately the coverage was ill-fated. During round 5 one player of the match that was originally going to be covered was disqualified. (The other player of that match followed a bit later.) The next (and last) round of the tournament, the feature match was between two players who would make top 8 if they won the match. A spectator noticed marked sleeves though. When I checked the sleeves, I pulled out two cards that had especially bad, but different, marks, without looking at them. It turned out I had singled out two of the three Psionic Blasts in the deck. After a short glance at the sleeve of the third Blast I was able to consistently identify all three Blasts. After a short investigation I came to the conclusion that the player did not know about the marks and they occured because of wear during play. Nevertheless I had to issue a Game Loss for Marked Cards — Pattern. This is always a hard penalty to give in a situation like this (it effectively decided who got to top 8), but there was no way around it.

In the top 8 (which were played back in the store) Kersten had to give another Game Loss for Drawing Extra Cards, but apart from that the matches rent quiet and well. I was especially grateful that the final match between Jim Herold and Frieder Michel Drenger went rather quickly, since I and Kersten had to fetch the last train back to Berlin. We ended the day like we had started it: Sitting in the train, eating tasty and healthy food from McDonalds. Congratulations to Jim, who had already made top 8 the day before in Berlin and now has Pro Player level 3 status if he attends Pro Tour Valencia.

Blog Statistics

Yesterday I had a look at the webalizer statistics for this web page. Still, by far the most hits got my review of GTA: San Andreas, followed by several pages that are automatically fetched. It is also by far the entry page #1, with nearly five times as many hits as the root page. The referers to the GTA review are also interesting: Lots of people get there from Google’s image search, and some warez forums also seem to link there. (I wonder why, unfortunately these forums are all non-public.)

Also notable is page #2: /blog/submitcomment.cgi got more than 2000 hits this month alone. This is the script used to submit comments to blog entries. It shows how much comment SPAM I get per month, although only about one or two SPAM comments are not filtered out automatically. It seems that my list of filtered words is rather comprehensive.

setuptools breaks PYTHONPATH

setuptools and egg files are a great way to distribute Python packages and programs. But today I stumbled over a really braindead design decision: setuptools overrides Python’s standard module search path algorithm in a very inconvenient way. Normally, when Python looks for a module or package, it first looks in the current directory, then in any path specified in the PYTHONPATH environment variable, and finally in the default search path. setuptools changes the lookup order to the following:

  1. the current directory
  2. egg files specified in PYTHONPATH
  3. egg files in the default search path
  4. regular modules in PYTHONPATH
  5. regular modules in the default search path

This means that an egg file in the default search path overrides a non-egg module in PYTHONPATH. I wonder what the rationale for that decision is (and it seems to be a deliberate decision). PYTHONPATH is a means to override the default search path and is perfectly suited for testing, developing, and forcing to use a particular (e.g. a bundled) version of a package. Not anymore! Now, the only way to override an egg is to create your own egg. And this is non-trivial and often means an extra step during development.

Here is where it bites me: I have created a library of custom classes, that I use in several projects. I break API frequently, since it is developed in a just-in-time fashion: whenever I need some functionality, I implement it. Therefore I bundle the library (or parts of it) with most projects. This works well for projects that go into a separate directory, like web projects. Nevertheless I use the library for some other projects that are installed system-globally. Otherwise I would need some way to namespace it for the different projects. Not my idea of fun. Normally, this is not a problem, since I can just set PYTHONPATH for all projects that have a local copy, at least when developing. Due to the strange path handling of setuptools, this method breaks and I have to work around it. Great …

gnome-keyring with Python

The documentation on gnome-keyring I discovered helped me to access it successfully with Python. I’ve written a small module that fetches and stores a username and a password for some server.

Some notes:

  • The attributes are freeform, but there a some common attributes for network hosts. These are: “user”, “domain”, “server”, “object”, “protocol”, “authtype”, and “port”. Actually there is a convenience API for network hosts.
  • libgnome-keyring requires that the application is correctly set using g_set_application_name. Unfortunately the Python module gnomekeyring does not do that for us and pygtk does not provide a function to set the application name. Therefore you need to include the module gtk to make it work. (Filed as bug 460515.)Update: g_set_application_name was added to pygtk in the 2.13 development version.
  • Python’s find_network_password_sync function does not allow None to be passed as arguments. The C API allows NULL to be passed here. This means that this function is basically unusable in Python, since you never want to provide all values. (Filed as bug 460518.)

Documentation for libgnome-keyring

I was trying to find documentation for libgnome-keyring for little project I am writing, which accesses a password-protected web service. Unfortunately there is no real documentation for it. No API documentation (well, there are a total of two functions documented), no tutorial. Finally I found this document in GNOME’s Subversion repository. Better then nothing, but why isn’t this part of the API documentation?

Filed as bug 460475.

Update: It seems that libgnome-keyring has gained documentation a few weeks ago, so far only found in Subversion. Kudos to the maintainers!

Selection in GtkTextBuffer

I’ve recently played around with GtkTextBuffer. It’s a rather nice text editing widget (or rather widget part). Unfortunately it misses one functionality, which is also missing from GtkEditable derived widgets: A signal for selection changes. There are two workarounds:

  1. You can setup a notification on the “has-selection” property like this:
    buffer.connect("notify", on_buffer_notify)
    def on_buffer_notify(buffer, prop):
        if == "has-selection":
            if buffer.get_has_selection():

    This method only works if you are interested in whether there is a selection or not, not if you are interested in any selection changes. Also, this method works only for GtkTextBuffers, not for GtkEditables.

  2. Tomboy uses a timeout to check the selection status:
    namespace Tomboy
    	public class NoteWindow : ForcedPresentWindow 
    		public NoteWindow (Note note) : 
    			base (note.Title) 
    			// Sensitize the Link toolbar button on text selection
    			mark_set_timeout = new InterruptableTimeout();
    			mark_set_timeout.Timeout  = UpdateLinkButtonSensitivity;
    		void UpdateLinkButtonSensitivity (object sender, EventArgs args)
    			link_button.Sensitive = (note.Buffer.Selection != null);

    This method works, but seems a bit complicated, when a simple signal should do the trick.

Filed as bug #448261.

German Card Translations

German card translations are a sad affair. They are riddled with clumsy translations, especially in the card names. It’s not such a great idea to translate english card names 1:1. The rules texts are translated sanely, i.e. using special German templates, although some of the template choices are a bit strange and more verbose than needed. For example, “target” is translates as “deiner Wahl” (“of your choice”), while “of your choice” is translated with “die du bestimmst” (“that you choose”).

In Planar Chaos Ovinize was translated as “Verhammelung”. First of all this sounds strange. The noun “Hammel” was turned in the verb “verhammeln”, which was turned back into the noun “Verhammelung”. But it’s also not good templating. Ovinize is an Instant, and Instants and Sorceries usually get a verb as name. Ovinize is a verb. The German translation “Verhammelung” on the other hand is a noun. This shows a lack of understanding of magic card naming on the part of the translator. “Verhammeln” or “Schafen” had been a much better name.

But what’s worse are wrong translations. For example the German version of Necrotic Sliver has the following ability: “All Slivers have ‘3, Sacrifice this creature: Sacrifice target permanent.'” (You can only sacrifice your own permanents.) Since Wizards decided not to publish Oracle texts until Monday after the prerelease, I could not confirm that the card was actually a mistranslation and had to rule it by its German text. Unfortunately the mistranslations (in the rules text) average around one per expansion.

Finally, cards that have obvious templating problems in the original are not corrected in the German version. For example the flip side of Saviours of Kamigawa’s Erayo, Soratami Ascendant reads “Counter the first spell played by each opponent each turn”, a rather obvious templating error. This was unfortunately not corrected in the German translation. In my opinion a good translator should catch errors like this.