Community Wiki

April 17, 2014

Alex Schroeder

Crazy Campaign

Recently I was responding to a Google+ post by Gavin. He was putting together a list of potential goals for the wizards in his campaign because he felt that players tend to shy away from doing cool stuff.

I started thinking about the cool things that have happened in my campaign, and the cool things I wanted to happen in my campaign but which didn’t.

First, the failures. These were goals I had hoped players would set themselves but they did not.

In my games, I’ve been trying to let players find books on particular topics. I never went all out and maintained a page on the campaign wiki with the actual books they own. My idea was that the books would allow them to research spells related to these topics (one of my house rules says you can only learn spells from other casters, so this sort of research would be the only alternative). I’d say that “building a library” didn’t happen.

Another thing I had hoped for was that players would actively seek out wizards with particular spells but as it turns out, I have not been placing a lot of rumors about particular spells. All the casters they befriended they befriended because of an adventure they were having and they happened to meet and connect on some level. I’d say that “meeting and befriending other casters” went well, but “actively seeking out other casters and befriending them” didn’t happen.

There have been successes as well, though.

One character is sponsoring four sages (and plans to hire more, each costing about 2000 gold pieces per month; usually one week passes in-game for every session). For one, money spent generates XP (one of my house rules). At the same time, every sage writes a little something about the setting. It’s great for me to provide rumors and adventure hooks. It also allows me to add new spells to the campaign. I’d say “hiring sages” has been a success. I think this worked because one of my players is interested in learning new things about the setting, and because of the rules that requires players to think of ways to spend their goal.

The need to spend money has resulted in a lot of public buildings in the domain of my players. We use An Echo Resounding for the domain game, so the gold spent doesn’t actually grant mechanical benefits. But it generates a bit of setting: temples are built (and I can have pirates rob them and kidnap the priests), an ivory tower has been built for the sages, a hospital was built (and taken over by demon worshippers), a bath house has been built (and more are being planned as the backbone of a spy network), a unicorn station has been sponsored, a tavern has been built… “building infrastructure” and contributing to the setting has been a success powered by the rule requiring the expenditure of gold, a price list with various buildings on it, me listing the buildings on the campaign wiki for all to see (seeing the changes to the environment and “leaving your mark”), and events sometimes referring back to things built by players add to a sense of ownership.

Another thing I had was a “master of anatomy” who could graft extra stuff on to characters. One of my players got a replacement arm and a replacement leg (he had lost limbs due to the Death and Dismemberment table I have been using), but the new limbs were gray and shriveled. I just don’t feel like punishing players for missing limbs. If pirates can have a wooden leg, if captain Hook can have a missing arm, why can’t player characters? If you’re missing both legs or both arms, it’s time to quit. I guess “body modification” has been a success.

The same player also got two dragon wings, which required an auxiliary brain to control them (so now he’s a cone head) and the extra brain can act independently in an emergency (although I never remember to roll for it). The Frankenstein look sometimes provokes an explanation for negative results on the reaction rolls, but there is no Charisma penalty. I guess this worked because it was perceived as useful, it was cool and it felt special even if it didn’t provide any real benefit (except for flight, which hasn’t been an issue). I think I’ve managed to balance benefits and drawbacks on this issue. Great!

Another thing that happened was that the players befriended a devil worshiper who proceeded to invite them to a succubus party (a ritual, not a spell). I think this happened organically. I rolled up a random encounter with some hobgoblins carrying 5000 gold pieces. I decided that this was tax. The players defeated the hobgoblins and took the gold. They arrived at a castle and gifted the gold to the wizard, saying that they want to throw a huge party, not knowing that he is a devil worshipper. Excited, he agrees… This was unplanned, but “have fun with devil worshippers” definitely worked. I think the key was to have some lame idea and not being afraid to turn it up to eleventy one.

The key to pushing my campaign to eleven is to use every idea as soon as possible. Do not save good ideas for later! Use them now. You will have more good ideas in the future.

Another thing is that you need to take something the players are doing and amplify it. They want to throw a party? Think of something crazy and let it happen. They want to build something? Think of something crazy to happen to the building, a crazy person to visit the building, something, anything. Let there be cool consequences.

Being generous with cool stuff works even if you fear for game balance. Avoid mechanical consequences for characters, if you want to. That doesn’t mean it cannot be crazy, something for your players to talk about in the future, something the non-players characters talk about in-game!

Always keep adding new plot lines. Minor things. Provide your players with three to five options at the end of the session and ask them what they want to do next. Prepare that. Having players choose allows them to influence where the story is going. My campaign is still about reviving a dead god because a long time ago, one of the players decided that his character was interested in all things elven. When I let it be known that they had a dead god, the player wanted to learn more. This is great. I keep adding stuff where ever the players start looking. To them, the campaign is infinitely deep. It keeps growing where they are most interested because it grows where ever their characters actually do something. Sure, they don’t always follow the main plot and that’s OK.

Some of the best moments happen when the older players are trying to explain past events to new players. They sound like kids. It’s convoluted and confusing and oral history at its best.

I’m not sure these notes will make it easy for you to turn your campaign to eleven. If I had to list things to avoid, I’d say this: Don’t be too cautious. You will be able to fix things later. Don’t prepare too much, don’t have too much seting detail or you’ll be afraid to change it. You’ll be afraid of rulers getting killed, shops getting burnt, characters having to leave towns, the campaign taking surprising directions.

Tags: RSS RSS

April 17, 2014 10:09 PM

April 07, 2014

Alex Schroeder

One Page Dungeon Contest

I’ve been trying to think of an entry for One Page Dungeon Contest and I keep coming up empty. I think I need to simply prep an upcoming adventure for my ongoing campaign and put it all on one page. How do you come up with your submission?

1PDC

Tags: RSS RSS

April 07, 2014 11:05 AM

Homebrew Problems

I’ve been using Homebrew on our Mac for a while now. I like it very much. I’ve recently run into an issue, though. Sending emails from Emacs stopped working. I was getting was this:

Opening STARTTLS connection to `fencepost.gnu.org:25'...failed
network-stream-get-response: Wrong type argument: processp, nil

The important setting to remember to learn more is this:

(setq smtpmail-debug-info t)

Resent the mail and switch to a buffer called *trace of SMTP session to fencepost.gnu.org*.

There:

220 fencepost.gnu.org ESMTP Exim 4.71 Mon, 07 Apr 2014 01:00:52 -0400
250-fencepost.gnu.org Hello 178-83-163-103.dynamic.hispeed.ch [178.83.163.103]
250-SIZE 52428800
250-PIPELINING
250-AUTH CRAM-MD5
250-STARTTLS
250 HELP

Process smtpmail deleted
dyld: Library not loaded: /usr/local/lib/libnettle.4.7.dylib
  Referenced from: /usr/local/bin/gnutls-cli
  Reason: image not found

Process smtpmail trace/BPT trap: 5

Oops, it seems that I uninstalled something that gnutls required!

Time to check things:

alex@Megabombus:/usr/local/bin (master)$ brew update
...
alex@Megabombus:/usr/local/bin (master)$ brew upgrade nettle
Error: nettle-2.7.1 already installed
alex@Megabombus:/usr/local/bin (master)$ brew upgrade gnutls
Error: gnutls-3.2.12.1 already installed
alex@Megabombus:/usr/local/bin (master)$ ls /usr/local/lib/libnettle.*
/usr/local/lib/libnettle.4.5.dylib /usr/local/lib/libnettle.a
/usr/local/lib/libnettle.4.dylib   /usr/local/lib/libnettle.dylib
alex@Megabombus:/usr/local/bin (master)$ brew reinstall gnutls
==> Reinstalling gnutls
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/gnutls-3.2.
Already downloaded: /Library/Caches/Homebrew/gnutls-3.2.12.1.mavericks.bottle.tar.gz
==> Pouring gnutls-3.2.12.1.mavericks.bottle.tar.gz
🍺  /usr/local/Cellar/gnutls/3.2.12.1: 931 files, 8,4M
alex@Megabombus:/usr/local/bin (master)$ brew reinstall nettle
==> Reinstalling nettle
Warning: nettle-2.7.1 already installed, it's just not linked
alex@Megabombus:/usr/local/bin (master)$ brew link  nettle
Linking /usr/local/Cellar/nettle/2.7.1... 16 symlinks created
alex@Megabombus:/usr/local/bin (master)$ gnutls-cli --version
gnutls-cli 3.2.12
Copyright (C) 2000-2014 Free Software Foundation, and others, all rights reserved.
This is free software. It is licensed for use, modification and
redistribution under the terms of the GNU General Public License,
version 3 or later <http://gnu.org/licenses/gpl.html>


Please send bug reports to:  <bugs@gnutls.org>

That seems to have fixed it!

I wonder how this happened in the first place.

Tags: RSS RSS

April 07, 2014 05:40 AM

April 03, 2014

Alex Schroeder

Eich and Mozilla

I use Firefox on my desktop both at work and at home. I don’t want Safari, Chrome or Internet Exploder. These days, the Mozilla foundation hired a dude called Eich who donated “$1,000 to the Proposition 8 effort to ban gay marriage in California.” See Exclusive: Mozilla CEO Eich says gay-marriage firestorm could hurt Firefox (Q&A) for details.

I had a conversation ranting monologue on IRC which revolved around two questions: How homophobic is Eich? Does “boycotting” a free product hurts him or the product?

My point was that I would like to tell Mozilla that having a homophobic boss is despicable. Writing a private email to let them know is not enough! Thus we enter the realm of politics where the actual boycott is not as important as news outlets writing about it. Let the scandal get some publicity.

In the interview, “Eich refuses to discuss his own beliefs explicitly or say whether they’ve changed…” I’m assuming they did not change much.

The article also says “Eich is the inventor of JavaScript…” A lesser sort of evil, I’d say! ;)

I think his argument is full of #fail. “If Mozilla cannot continue to operate according to its principles of inclusiveness…” and mentioning anti-gay marriage coders in Indonesia. How is that an argument? Does Mozilla also work with Hitler? (Just to cut that line of argument short.)

Karl Popper argued that you cannot be tolerant towards the intolerant. Actually, according to WikiQuote he said: “If we extend unlimited tolerance even to those who are intolerant, if we are not prepared to defend a tolerant society against the onslaught of the intolerant, then the tolerant will be destroyed, and tolerance with them.”

I think that’s why it’s not important for me to hurt Eich personally. After all, he’s free to say what he wants and to sponsor what he wants. I have limited tolerance. It’s important for me to tell Mozilla that it’s not OK to hire such a person!. I don’t have unlimited tolerance.

Anyway, here’s to not boycotting Firefox and still helping the scandal get some publicity.

Update: Mozilla CEO Brendan Eich Resigns After Protests from Gay Marriage Supporters.

Tags: RSS RSS RSS

April 03, 2014 09:41 AM

April 02, 2014

Alex Schroeder

Spielabend bei mir

Ich wollte schon länger mal über meine old school Kampagne reden. Letzten Dienstag haben wir gerade einen längeren Geschichtsbogen beendet. Eine gute Gelegenheit.

Ich habe meistens so um die sechs Spieler am Tisch, jeder mit einem Hauptcharakter und bis zu zwei Nebencharakteren. Das Charisma der Hauptfigur bestimmt, wieviele Gefolgsleute ein Spieler insgesamt haben kann. Weil wir allerdings fast immer sechs Spieler sind, haben wir die Anzahl auf zwei Gefolgsleute pro Spielabend limitiert. Die restlichen Gefolgsleute steuern Schiffe, verwalten Ländereien und so weiter.

Die Hauptcharaktere meiner Spieler haben eine Stufen zwischen 1 und 7. Wer neu anfängt, kriegt einen Erststüfler. Klar spielt man dann noch nicht sofort eine so wichtige Rolle wie der Topshot mit Charakteren der Stufen 5, 6 und 7. Immer wieder gibt es allerdings Abende, wo nur geredet wird. Gerade letztes Mal gab es eine Szene, wo der erststufige Charakter, der zufälligerweise Charisma 18 hat, eine herausragende Rolle gespielt hat.

Wir verwenden An Echo Resounding für das Domänenspiel. Alle vier Spielabende haben die Spieler zwei Domänenzüge für ihr Reich. Da gibt es Einheiten zu je ungefähr hundert Leuten, Kriegsschiffe, Befestigungen, Tempel, Schulen, Märkte und vieles mehr. Weil man nur alle vier Spielabende zwei Spielzüge machen muss, und weil man das leicht ignorieren kann, wenn man sich nicht dafür interessiert, ist das ideal für uns.

Gleichzeitig erlaubt es uns auch, einen Handlungsbogen mit einer grossen Schlacht zu beenden. Es ging um eine elfische Hexe auf dem Weg zur Unsterblichkeit, in einer Stadt, umringt von Wällen, die Umgebung durch fünf Beobachtungsposten geschützt, je mit etwa zehn Elfen und einem roten Drachen; die Wälle der Stadt durch eine Zitadelle geschützt, die Wälle von drei Einheiten elfischer Kriegermönche bewacht, die Stadt selber von vier Einheiten schwerer Miliz bewacht; der Palast der Hexe beschützt von zwei Schattendrachen; und die Hexe selber, ein Lich der 21. Stufe.

Und das geht! Am letzten Spielabend wurden die schwere Miliz durch eine Intrige ausgeschalten. Das vorletzte Mal bekämpfte man Piraten, um eine Einladung an einen Ball zu erhalten, am Ball wurden die wichtigsten Elfen am Hof angesprochen, ausgeforscht, umgarnt; dann wurde mit den Priestern des Pazuzu Tempels ein Pakt beschlossen, so dass diese den Feuerelementar durch einen Höllenschlund in ihrem Tempel entführten – und zwar den Elementar, der dem Herren der schweren Miliz sein bester Freund ist. Wutentbrannt sammelt dieser seine Leute um sich und führt sie durch den Höllenschlund ins Reich Pazuzus. Und am Spielabend darauf greifen die Spieler an.

Alle Einheiten um sich gesammelt, überlisten die Spieler die Drachen, greifen mit ihren etwa 1200 Leuten an, überrollen die Zitadelle, vernichten die Kriegermönche, die Drachen, und am Ende folgen ein paar Hauptcharaktere der Hexe in einen dunkeln Gang, jagen sie, denn wer nicht mindestens die fünfte Stufe hat, wird von der Angst übermannt.

Die Zauberin dreht sich um, spricht das Todeswort, der Charakter schafft den Rettungswurf nicht, fleht seinen Gott ein letztes Mal an – und hier muss man verstehen, dass sich die ganze Szene auf der Astralebene abspielt, die Hexe hat ihre Stadt auf dem versteinerten Leichnam eines (fast) toten Gottes erbaut, und eben diesen Gott betet der Charakter an. Nun gibt es bei mir immer eine kleine Prozentchance, dass die Götter die Stimmen derjenigen erhören, die ihnen (positiv oder negativ) aufgefallen sind. Der Spieler würfelt und hat Erfolg! Eine Astraldeva erscheint und schützt den Charakter vor dem Todeswort, der Spieler fällt vor Glück fast vom Stuhl, und dann geben die paar Charaktere ihr bestest und greifen an. Und sie haben erfolg! Ein Lich der 21. Stufe hat nur 9W6+22 LE. Die Hexe stirbt, die Stadt wird der Domäne einverleibt, Pläne werden geschmiedet, die Wiedererweckung des Gottes braucht noch ein paar Dinge…

So geht das, ab Stufe fünf. rocks

Eine Karte aus Traveller, die Ebenen von Planescape, die fliegenden Schiffe von Spelljammer, die Inspiration von Planet Algol. Hell Yeah!

Tags: RSS

April 02, 2014 09:22 PM

March 30, 2014

Alex Schroeder

Switzerlad D&D

Recently I found this blog post about Localism which ended in the question what a campaign would look like if it were located in the area you live in.

For the north of Switzerland:

Forested hills. Dark and forbidding forests full of bandits. Trails connecting villages across along the ridges. Difficult terrain. Deer. Bears. Mostly bears.

Rivers. A large network of rivers flowing towards a distant sea. These rivers are hard to ford. They present major obstacles for the armies on either side. Where the rivers can be forded or bridged, they are. Toll towers control these choke points, small villages support these local lords.

Lakes. This is where people do their fishing and trading. The large cities are all built by a lake, usually by the river exit. Boats, rafting. Stilt house settlements. Small lakes up in the hills may be the homes of water witches, cursed, sunken castles, devils.

Castles and towers. Rocks and cliffs protecting fortifications high up overlooking the valleys, far away from disease. Petty power struggles. A distant emperor.

Swamps. The wider valleys are full of infested, treacherous swamps. Eels, trolls, will’o the wisps. Pots of gold buried to appease the water spirits. The drowned witches, bound and restless, struggling underground.

Cairns. Hidden up in the hills, ancient stones marking the ley lines of the land. Grave markers of the rich.

Mountains. On a fair day, you can see the wall of world. Up there, fell spirits guarding the passes. Devils. Giants. Blood pacts and cannibals. Dwarves and pots of gold, again. Caves. Waterfalls. Water spirits. Cows, sell cheese, buy salt.

Winter. The winter is cold. Snow covers everything, isolates people. The wolves cross the frozen rivers. When spring comes, we need to wear masks, burn effigies, ring cow bells and scare the winter spirits away. The living triumph, for an additional year.

Stilt houses

Tags: RSS

March 30, 2014 12:54 PM

March 24, 2014

Alex Schroeder

Torchbearer

Today we played two and a half hours of Torchbearer. We had three players and started out with me playing the warrior, Johannes playing the halfling and Harald playing the dwarf. Pascal was running the game for us. It involved a kid disappearing into a tomb. We crawled into the tomb, got up, advanced down the corridor and met four skeletons. We went for a kill conflict and started with a disposition of 10 vs. 5 but by the second volley we were down to four and we just barely managed to avoid a total party kill. My warrior escaped, badly wounded, got lost in a swamp, was led astray by green flames dancing in the distance and nearly drowned.

We wound two replacement characters (the cleric and the magic user) and then we went there again. We realized that going for a kill was dangerous and tried a trick conflict. Again, we started with a disposition of 9 vs. a lot less, and within a few volleys we had lost. We were driven off by the skeletons never to return…

And that was that. We liked some ideas in theory. We liked the grind. We liked the light rules. We liked how enumbrance worked. But as soon as the conflict started, we got disconnected from the fiction. Attack, Defend, Feint and Maneuver—it was dry, hard to picture, very abstract, and we lost. And then we started noticing that the other systems didn’t seem to make a difference or didn’t result in a play experience more entertaining compared to using classic D&D.

We’ll be playing something different next indie night.

Tags: RSS RSS

March 24, 2014 10:33 PM

March 19, 2014

Alex Schroeder

Leiningen

A while ago I wrote a little demo application using Clojure for the company’s blog in 2010 (in German). This is a Lisp that compiles to Java Byte Code and therefore it runs on the Java Virtual Machine. It also allow you to call all the Java libraries you want, using Lisp syntax. As I work with Java for money and Emacs Lisp for love, I thought this was perfect for me. Recently I had the idea of porting this little app to the web, possibly for use on my iPad. But how to do it? I thought of ClojureScript. It compiles to JavaScript! Maybe using ClojureScript and some SVG library… maybe C2, subtitled “Clojure(Script) data visualization”? But where to get started?

The ClojureScript One Guide assumes that you have Leiningen installed. OK, time to look at the Leiningen tutorial. And what better way to start than moving my old application to a Leiningen setup?

So that’s what I did. On my Mac, using Homebrew, I can run Gridmapper as follows:

brew install leiningen
git clone git@github.com:kensanata/gridmapper.git
cd gridmapper
lein run

And I can produce an executable Jar file and run it as follows:

lein uberjar
open target/gridmapper-0.9.9-standalone.jar

In 2010, I was mostly interested in figuring out whether Clojure would in fact allow me to use Java libraries. In terms of architecture, the application is lousy. A Model View Controle architecture should be used! And instead of bitmaps, I’d like to use SVG graphics both for the tiles and for the resulting output. Save as SVG! Also, a nicer window with a legend and some explanations would be nice.

Anyway, back to C2.

Tags: RSS

March 19, 2014 03:30 PM

March 18, 2014

Alex Schroeder

Why You So Quiet

As I recently said on Google+: Everything has been said. We’re relaxing for a bit before starting all over again. You know, ascending AC, saving throws, edition wars, OGL, sandbox, entourage, megadungeon, no elves, kickstarters, alignment, comeliness, strength limits, ability modifiers, the umpteenth variant of barbarian, witch, bard and necromancer, how to draw maps, utility vs. good looking, and how really they’re the same, or not, also typography, porn, sexism, fun, and how it’s meaningless to talk about it, doing it anyway, and it’ll be 2006 all over again, and nobody will have learned a thing, except for those that have moved on, and somebody will have a fit and leave the blogosphere, and hate on Facebook, and post inappropriate political messages, and drop off the net, and delete their blog, and we will feel young again and everything will be fresh and in love and exciting.

Tags: RSS

March 18, 2014 01:30 PM

March 15, 2014

Alex Schroeder

Old School Elite Monsters

Recently I found a comment by andrew ferris on a Google+ post by Urizen Shaitan I’d like to share.

What works best for fun is not really realistic and sometimes when attempting to implement something “realistic”, you get something even less realistic than if you hadn’t tried.

Okay, first to deal with armor and hit points. Now if one wants monsters to scale up the same way PCs scale up, you are going to have an issue. PCs gain 1 hit dice per a level and generally speaking armor and damage increase. With some classes the armor and damage increases considerably less than with others, but generally speaking it increases. The thing is that… well… there isn’t a good formula for what level of monster ought to be able to handle 4-5 PCs by themselves.

For instance, generally speaking if you have a level 5 PC fight 5 level 1 PCs, the level 5 PC has 5× the hit points as well as having better damage potential and being harder to hit. They will generally mop the floor with the 5 level 1s.

However, a level 25 PC would almost undoubtedly be demolished by 5 level 5s, particularly if those 5 level 5s have among them a thief, cleric, and particularly magic-user. This is particularly true given how in old D&D where PCs cap out at level 9.

Now, if something is going to be a challenge for 5 PCs it can only do one of the following

  1. Have 5× the health it normally does or have some method to avoid ⅘ of the attacks (such as a high AC). This can either be all in one go or it can be be recovered over the battle (regen or healing magic) and the average health of the creature would be 5× by the end of the average length of a battle.
  2. Deal out 5× the damage a PC could. It could have 5× the attacks, hit 5× as often or deal 5× the damage a normal enemy of that level would do.

If you do both, it will be 25× as strong as a normal enemy. It is also worthwhile considering the difference between a solo and a group. After all, if you are fighting a group of enemies and you can manage to deal ⅕ of the total hit points in damage to one of the enemies in the group then the group’s damage output is going to decrease by 20%. But if you deal ⅕ of the hit points to an enemy with 5× the health, then its damage output isn’t going to decrease unless there is a system for it to do so.

In addition, PCs generally fight in groups. This means that if the attacks simply do 5× the damage or there are 5× as many attacks that can (and narratively should) be aimed at a single target, then you deal with another issue. Generally speaking a single enemy attack against a PC ought to sap around ⅓–¼ of their life. But if the attack does 5× damage or there are 5× the amount of attacks, this will wipe out a PC with each successful hit. This will cause the group’s effectiveness to drop by 20%.

Because of this, it is probably best to increase both the hit points and the damage output by about double. You can improve the AC or the monster’s chances to hit, but I would do it by a point or two at the most. Increased hit points and an increased number of attacks is what I would advise in order to have an exciting encounter that is less likely to result in a TPK.

As for the narrative attacks…. one of the things I feel the OSR has been painfully lazy about is when it comes to monster attacks. Particularly the old set up “2 claws, 1 bite” no animal in the world fights like that. Ever. It is utterly unimaginable that within a 6 second span of time a beast is ever going to swing its paws at two separate targets and then bite a third. It just doesn’t work that way. Nor is an animal going to make one swipe with each claws and then pull them back before biting. Rather than ever having such a sequence, it would have been far more realistic to simply describe this whole attack as a single unarmed attack sequence which will either be successful or not as a whole and the number rolled on the damage dice would be evocative of how many of its natural weapons it hit with.

Instead of giving a solo monster multiple attacks, the far better thing to do would be to give the monster area-effecting attacks. For instance, it can charge in a straight line which means it can run over a PC, knock another aside and then slam into a third target which would be a great way to get those mages into melee combat. Or it can make a sweep with a giant claw or weapon that has a chance of dealing damage to all enemies engaged in melee. Or it could release a cloud of toxic gas which could affect everyone in a given area or it could even be capable of picking up or knocking a PC off their feet (i.e. a successful melee attack), hurling them at another turning one PC’s body into a weapon against another (making a ranged attack).

With those sorts of attacks, suddenly it becomes very clear why it is foolish to attack the monster with a regiment of very weak soldiers and why a group of elite adventurers are needed to handle the monster.

So basically, my advice is when designing solo monsters… Double its normal hit points. Give it some sort of area attack (or several options!) that would allow it to hit 1–3 enemies a turn and particularly to be able to get at those more vulnerable ranged combatants. Increase AC, attack bonus and damage of the monster minimally—only 1–2 points.

And then you just have to accept that if this monster is, for instance, an Ogre or a Troll, that its numbers are not evocative of simply adding levels to the monster.

– andrew ferris

What can I say. These days my players kill red dragons in the surprise round and survive cloud kill… but area effects are clearly the way to go!

Tags: RSS RSS

March 15, 2014 07:16 AM

March 12, 2014

Alex Schroeder

SQL Statements at Work

I was thinking of SQL Statements I wrote back in 2005 and was reminded of something I helped write in 2013, I think. It was a report to show you the Top 10 clients by turnover, with various search criteria. It was huge. The framework used is Eclipse Scout. The Database is Oracle. Some stuff edited…

  /**
   * Helper function for the Top 10 Companies Report.
   */
  private SearchFilter getCompanyTopReportHavingFilter(CompanyTopReportSearchFormData formData, String turnover) {
    SearchFilter havingFilter = new SearchFilter();
    // turnover values
    if (formData.getTurnoverFrom().getValue() != null
        || formData.getTurnoverTo().getValue() != null) {
      havingFilter.addWhere(" AND ( " + turnover + " ) ");
      if (formData.getTurnoverFrom().getValue() != null
          && formData.getTurnoverTo().getValue() != null) {
        havingFilter.addWhere("BETWEEN :turnoverFrom AND :turnoverTo ",
            new NVPair("turnoverFrom", formData.getTurnoverFrom()),
            new NVPair("turnoverTo", formData.getTurnoverTo()));
      } else if (formData.getTurnoverFrom().getValue() != null) {
        havingFilter.addWhere(" >= :turnoverFrom ",
            new NVPair("turnoverFrom", formData.getTurnoverFrom()));
      } else if (formData.getTurnoverTo().getValue() != null) {
        havingFilter.addWhere(" <= :turnoverTo ",
            new NVPair("turnoverTo", formData.getTurnoverTo()));
      }
    }
    return havingFilter;
  }

  private String currentProjectsActualTurnover (int presentationType, Long partitionUid, SearchFilter whereActualTurnoverFilter) {

    String table = null;

    // top company report
    if (presentationType == 1) {
      table = " ACTUAL_TURNOVER_VIEW ";
    }
    else if (presentationType == 2) {
      table = " ACTUAL_TURNOVER_VIEW_HOLDG ";
    }

    String sql = " (" +
    "SELECT NVL(SUM(AT.ACTUAL_TURNOVER), 0) " +
    "FROM " + table + " AT " +
    "WHERE AT.COMPANY_NR = C.COMPANY_NR " +
    whereActualTurnoverFilter.getWhere();
    if (partitionUid != null)
      sql += " AND AT.PARTITION_UID = " + partitionUid;
    sql += ") ";
    return sql;
  }
  private String contact (Long partitionUid, SearchFilter whereContactFilter) {
      String sql = " (" +
      "SELECT COUNT(1) FROM VISIT V, USER VU " +
      "WHERE C.COMPANY_NR = V.COMPANY_NR " +
      "AND V.STATUS_UID = " + ContactStatusCodeType.TakenPlaceCode.ID + " " +
      "AND V.REG_USER_NR = VU.USER_NR " +
      whereContactFilter.getWhere();
      if (partitionUid != null)
        sql += " AND VU.PARTITION_UID = " + partitionUid;
      sql += ") ";
      return sql;
  }
  private String organizations () {
    return
    " (SELECT 1 " +
    "  FROM COMPANY_TYPE CT " +
    "  WHERE CT.COMPANY_NR = C.COMPANY_NR " +
    "  AND CT.TYPE_UID = " + ProjectCompanyRelationCodeType.OrganizationCode.ID + ") ";
  }
  private String contactPersonOne (Long partitionUid) {
    return
    " (SELECT CP_ONE_P.LAST_NAME || DECODE(CP_ONE_P.FIRST_NAME, '', '', ', ' || CP_ONE_P.FIRST_NAME) " +
    "  FROM COMPANY_PERSON CP_ONE, PERSON CP_ONE_P " +
    "  WHERE CP_ONE.COMPANY_NR = C.COMPANY_NR " +
    "  AND   CP_ONE.TYPE_UID = " + CompanyPersonRelationCodeType.ContactPersonOneCode.ID + " " +
    "  AND   CP_ONE.PARTITION_UID = " + partitionUid + " " +
    "  AND   CP_ONE.JOIN_TYPE_UID = " + PersonOrTeamCodeType.PersonCode.ID + " " +
    "  AND   CP_ONE_P.PERSON_NR = CP_ONE.JOIN_NR) ";
  }
  private String prioSalesCouncil (SearchFilter filter) {
    if (filter.getWhere().length() == 0) {
      return " NVL(C.PRIO_SALES_COUNCIL_UID, 0) ";
    } else {
      return
      " (SELECT NVL(X.FK2_NR, 0) " +
      "  FROM CHANGE_HISTORY X" +
      "  WHERE X.JOIN_NR = C.COMPANY_NR" +
      "  AND X.JOIN_TYPE_ID = " + CRMFunctionCodeType.CompanyCode.ID +
      "  AND X.PARTITION_UID = 0" +
      "  AND X.EVT_CHANGE IN (" +
      "    SELECT MAX(CH.EVT_CHANGE)" +
      "    FROM CHANGE_HISTORY CH" +
      "    WHERE CH.JOIN_NR = C.COMPANY_NR" +
      "    AND CH.JOIN_TYPE_ID = " + CRMFunctionCodeType.CompanyCode.ID +
      "    AND CH.PARTITION_UID = 0" +
      filter.getWhere() + ")" +
      "  AND ROWNUM = 1) ";
    }
  }
  private String companyClassification (SearchFilter filter, Long partitionUid) {
    if (filter.getWhere().length() == 0) {
      return
      " (SELECT PHASE_UID " +
      "  FROM COMPANY_CLASSIFICATION X" +
      "  WHERE X.COMPANY_NR = C.COMPANY_NR" +
      "  AND X.PARTITION_UID = " + partitionUid + ") ";
    } else {
      return
      " (SELECT FK_NR " +
      "  FROM CHANGE_HISTORY X " +
      "  WHERE X.JOIN_NR = C.COMPANY_NR" +
      "  AND X.JOIN_TYPE_ID = " + CRMFunctionCodeType.CompanyCode.ID +
      "  AND X.PARTITION_UID = " + partitionUid +
      "  AND X.EVT_CHANGE IN (" +
      "    SELECT MAX(CH.EVT_CHANGE)" +
      "    FROM CHANGE_HISTORY CH" +
      "    WHERE CH.JOIN_NR = C.COMPANY_NR" +
      "    AND CH.JOIN_TYPE_ID = " + CRMFunctionCodeType.CompanyCode.ID +
      "    AND CH.PARTITION_UID = " + partitionUid + " " +
      filter.getWhere() + ")" +
      "  AND ROWNUM = 1) ";
    }
  }
  private SearchFilter setFilterNewCustomer(CompanyTopReportSearchFormData formData, SearchFilter filter) {
    if (formData.getNewCustomerFrom().getValue() != null
        || formData.getNewCustomerTo().getValue() != null) {
      filter.addWhere(" AND C.COMPANY_NR IN (SELECT COMPANY_NR FROM (SELECT COMPANY_NR, MIN(PI.EVT_APPROVAL) AS EVT_APPROVAL FROM PROJECT PI WHERE ACTIVE = 1 GROUP BY COMPANY_NR) PINNER WHERE 1=1");
      if (formData.getNewCustomerFrom().getValue() != null) {
        filter.addWhere(" AND PINNER.EVT_APPROVAL >= TRUNC(:newCustomerFrom) ",
            new NVPair("newCustomerFrom", formData.getNewCustomerFrom()));
      }
      if (formData.getNewCustomerTo().getValue() != null) {
        filter.addWhere(" AND PINNER.EVT_APPROVAL < TRUNC(:newCustomerTo) + 1 ",
            new NVPair("newCustomerTo", formData.getNewCustomerTo()));
      }
      filter.addWhere(" ) ");
    }
    return filter;
  }
  private SearchFilter setFilterZ1Contact(CompanyTopReportSearchFormData formData, SearchFilter filter) {
    if (formData.getTurnoverDateFrom().getValue() != null) {
      filter.addWhere(" AND V.EVT_START >= TRUNC(:contactsZ1From) ",
          new NVPair("contactsZ1From", formData.getTurnoverDateFrom()));
    }
    if (formData.getTurnoverDateTo().getValue() != null) {
      filter.addWhere(" AND V.EVT_START < TRUNC(:contactsZ1To+1) ",
          new NVPair("contactsZ1To", formData.getTurnoverDateTo()));
    }
    return filter;
  }
  private SearchFilter setFilterZ2Contact(CompanyTopReportSearchFormData formData, SearchFilter filter) {
    if (formData.getDataFrom().getValue() != null) {
      filter.addWhere(" AND V.EVT_START >= TRUNC(:contactsZ2From) ",
          new NVPair("contactsZ2From", formData.getDataFrom()));
    }
    if (formData.getDataTo().getValue() != null) {
      filter.addWhere(" AND V.EVT_START < TRUNC(:contactsZ2To+1) ",
          new NVPair("contactsZ2To", formData.getDataTo()));
    }
    return filter;
  }
  private SearchFilter setFilterCompany(CompanyTopReportSearchFormData formData, SearchFilter filter) {
    if (formData.getCompanyShortName().getValue() != null) {
      filter.addWhere(" AND UPPER(C.CODE_NAME) LIKE UPPER(:companyShortName || '%') ",
          new NVPair("companyShortName", formData.getCompanyShortName()));
    }
    if (formData.getCompanyName().getValue() != null) {
      filter.addWhere(" AND UPPER(C.NAME) LIKE UPPER(:companyName || '%') ",
          new NVPair("companyName", formData.getCompanyName()));
    }
    if (formData.getCompanyNo().getValue() != null) {
      filter.addWhere(" AND UPPER(C.COMPANY_NO) LIKE UPPER(:companyNo || '%') ",
          new NVPair("companyNo", formData.getCompanyNo()));
    }
    if (formData.getContactPersonOne().getValue() != null) {
      filter.addWhere(" AND C.COMPANY_NR IN (SELECT COMPANY_NR FROM COMPANY_PERSON WHERE JOIN_NR = :contactPersonOne"
          + " AND TYPE_UID = " + CompanyPersonRelationCodeType.ContactPersonOneCode.ID
          + " AND  1=DECODE(::level(ReadPersonPermission), ::level(BasicCrmPermission.LEVEL_ALL), 1, ::level(BasicCrmPermission.LEVEL_NONE), 0, MY_UTIL.PERSON_PRIV(::level(ReadPersonPermission), JOIN_NR, :userNr, :organisationUid))) ",
          new NVPair("contactPersonOne", formData.getContactPersonOne()));
    }
    if (formData.getContactPersonTwo().getValue() != null) {
      filter.addWhere(" AND C.COMPANY_NR IN (SELECT COMPANY_NR FROM COMPANY_PERSON WHERE JOIN_NR = :contactPersonTwo"
          + " AND TYPE_UID = " + CompanyPersonRelationCodeType.ContactPersonTwoCode.ID
          + " AND  1=DECODE(::level(ReadPersonPermission), ::level(BasicCrmPermission.LEVEL_ALL), 1, ::level(BasicCrmPermission.LEVEL_NONE), 0, MY_UTIL.PERSON_PRIV(::level(ReadPersonPermission), JOIN_NR, :userNr, :organisationUid))) ",
          new NVPair("contactPersonTwo", formData.getContactPersonTwo()));
    }
    if (formData.getBusinessArea().getValue() != null) {
      filter.addWhere(" AND C.COMPANY_NR IN (SELECT COMPANY_NR FROM COMPANY_CLASSIFICATION WHERE PARTITION_UID = :customerofBUs) ",
          new NVPair("customerofBUs", formData.getBusinessArea()));
    }
    if (formData.getCompanySector().getValue() != null) {
      filter.addWhere(" AND C.SECTOR_UID = :companySector ",
          new NVPair("companySector", formData.getCompanySector()));
    }
    if (formData.getLegalForm().getValue() != null) {
      filter.addWhere(" AND C.LEGAL_FORM_UID = :legalForm ",
          new NVPair("legalForm", formData.getLegalForm()));
    }
    if (formData.getLanguage().getValue() != null) {
      filter.addWhere(" AND C.LANGUAGE_UID = :language ",
          new NVPair("language", formData.getLanguage()));
    }
    if (formData.getRankFrom().getValue() != null) {
      filter.addWhere(" AND C.RANK >= :rankFrom ",
          new NVPair("rankFrom", formData.getRankFrom()));
    }
    if (formData.getRankTo().getValue() != null) {
      filter.addWhere(" AND C.RANK <= :rankTo ",
          new NVPair("rankTo", formData.getRankTo()));
    }
    if (formData.getSource().getValue() != null) {
      filter.addWhere(" AND UPPER(C.SOURCE) LIKE UPPER(:source || '%') ",
          new NVPair("source", formData.getSource()));
    }
    if (formData.getCompanyState().getValue() != null) {
      if (formData.getCompanyState().getValue() == 0) {
        filter.addWhereToken(" C.ACTIVE = 0 ");
      }
      else if (formData.getCompanyState().getValue() == 1) {
        filter.addWhereToken(" C.ACTIVE = 1 ");
      }
    }
    return filter;
  }
  private SearchFilter setFilterZ1PhasePrioSalesCouncil(CompanyTopReportSearchFormData formData, SearchFilter filter, SearchFilter changeHistoryFilter) {
    if (formData.getTurnoverDateTo().getValue() == null) {
      if (formData.getPartition().getValue() != null) {
        filter.addWhere(" AND EXISTS (" +
            " SELECT 1" +
            " FROM COMPANY_CLASSIFICATION CC" +
            " WHERE CC.COMPANY_NR = C.COMPANY_NR" +
            " AND CC.PARTITION_UID = :partition",
            new NVPair("partition", formData.getPartition()));
        // phase requires a partition
        if (formData.getPhase().getValue() != null) {
          filter.addWhere(" AND CC.PHASE_UID  = :phase",
              new NVPair("phase", formData.getPhase()));
        }
        filter.addWhere(") ");
      }
      if (formData.getPrioSalesCouncil().getValue() != null) {
        filter.addWhere(" AND C.PRIO_SALES_COUNCIL_UID = :prio ",
            new NVPair("prio", formData.getPrioSalesCouncil()));
      }
    } else {
      if (formData.getPartition().getValue() != null) {
        filter.addWhere(" AND EXISTS (" +
            " SELECT 1" +
            "  FROM CHANGE_HISTORY X" +
            "  WHERE X.JOIN_NR = C.COMPANY_NR" +
            "  AND X.JOIN_TYPE_ID = " + CRMFunctionCodeType.CompanyCode.ID +
            "  AND X.PARTITION_UID = :partition" +
            "  AND X.EVT_CHANGE IN (" +
            "    SELECT MAX(CH.EVT_CHANGE)" +
            "    FROM CHANGE_HISTORY CH" +
            "    WHERE CH.JOIN_NR = C.COMPANY_NR" +
            "    AND CH.JOIN_TYPE_ID = " + CRMFunctionCodeType.CompanyCode.ID +
            "    AND CH.PARTITION_UID = :partition " +
            changeHistoryFilter.getWhere() + ")",
            new NVPair("partition", formData.getPartition()));
        // since whereCompanyFilter now contains references to bind variables in wherechangeHistoryFilter:
        filter.getBindMap().putAll(changeHistoryFilter.getBindMap());
        // phase requires a partition
        if (formData.getPhase().getValue() != null) {
          filter.addWhere(" AND X.FK_NR  = :phase",
              new NVPair("phase", formData.getPhase()));
        }
        filter.addWhere(") ");
      }
      // prio sales council also uses the change history, but goes for rows with partition_uid = 0!
      if (formData.getPrioSalesCouncil().getValue() != null) {
        filter.addWhere(" AND EXISTS (" +
            " SELECT 1" +
            "  FROM CHANGE_HISTORY X" +
            "  WHERE X.JOIN_NR = C.COMPANY_NR" +
            "  AND X.JOIN_TYPE_ID = " + CRMFunctionCodeType.CompanyCode.ID +
            "  AND X.PARTITION_UID = 0" +
            "  AND X.FK2_NR = :prio" +
            "  AND X.EVT_CHANGE IN (" +
            "    SELECT MAX(CH.EVT_CHANGE)" +
            "    FROM CHANGE_HISTORY CH" +
            "    WHERE CH.JOIN_NR = C.COMPANY_NR" +
            "    AND CH.JOIN_TYPE_ID = " + CRMFunctionCodeType.CompanyCode.ID +
            "    AND CH.PARTITION_UID = 0 " +
            changeHistoryFilter.getWhere() + "))",
            new NVPair("prio", formData.getPrioSalesCouncil()));
        // since whereCompanyFilter now contains references to bind variables in wherechangeHistoryFilter:
        filter.getBindMap().putAll(changeHistoryFilter.getBindMap());
      }
    }
    return filter;
  }
  private SearchFilter setFilterZ2Phase(CompanyTopReportSearchFormData formData, SearchFilter filter, SearchFilter changeHistoryFilter) {
    if (formData.getDataTo().getValue() == null) {
      if (formData.getPartitionZ2().getValue() != null) {
        filter.addWhere(" AND EXISTS (" +
            " SELECT 1" +
            " FROM COMPANY_CLASSIFICATION CC" +
            " WHERE CC.COMPANY_NR = C.COMPANY_NR" +
            " AND CC.PARTITION_UID = :partitionZ2",
            new NVPair("partitionZ2", formData.getPartitionZ2()));
        // phase requires a partition
        if (formData.getPhase().getValue() != null) {
          filter.addWhere(" AND CC.PHASE_UID  = :phaseZ2",
              new NVPair("phaseZ2", formData.getPhaseZ2()));
        }
        filter.addWhere(") ");
      }
    } else {
      if (formData.getPartitionZ2().getValue() != null) {
        filter.addWhere(" AND EXISTS (" +
            " SELECT 1" +
            "  FROM CHANGE_HISTORY X" +
            "  WHERE X.JOIN_NR = C.COMPANY_NR" +
            "  AND X.JOIN_TYPE_ID = " + CRMFunctionCodeType.CompanyCode.ID +
            "  AND X.PARTITION_UID = :partitionZ2" +
            "  AND X.EVT_CHANGE IN (" +
            "    SELECT MAX(CH.EVT_CHANGE)" +
            "    FROM CHANGE_HISTORY CH" +
            "    WHERE CH.JOIN_NR = C.COMPANY_NR" +
            "    AND CH.JOIN_TYPE_ID = " + CRMFunctionCodeType.CompanyCode.ID +
            "    AND CH.PARTITION_UID = :partitionZ2 " +
            changeHistoryFilter.getWhere() + ")",
            new NVPair("partitionZ2", formData.getPartitionZ2()));
        // since whereCompanyFilter now contains references to bind variables in wherechangeHistoryFilter:
        filter.getBindMap().putAll(changeHistoryFilter.getBindMap());
        // phase requires a partition
        if (formData.getPhaseZ2().getValue() != null) {
          filter.addWhere(" AND X.FK_NR  = :phaseZ2",
              new NVPair("phaseZ2", formData.getPhaseZ2()));
        }
        filter.addWhere(") ");
      }
    }
    return filter;
  }
  private SearchFilter setFilterPlannedTurnoverDates(CompanyTopReportSearchFormData formData, SearchFilter filter) {
    if (formData.getTurnoverDateFrom().getValue() != null) {
      filter.addWhere(
          " AND TRUNC(:turnoverFromDate) <= P1.EVT_REQUEST (+) ",
          new NVPair("turnoverFromDate", formData.getTurnoverDateFrom()));
    }
    if (formData.getTurnoverDateTo().getValue() != null) {
      filter.addWhere(
          " AND ADD_MONTHS(TRUNC(:turnoverToDate, 'MONTH'), 1) > P1.EVT_REQUEST (+) ",
          new NVPair("turnoverToDate", formData.getTurnoverDateTo()));
    }
    return filter;
  }
  private SearchFilter setFilterZ1ActualTurnover(CompanyTopReportSearchFormData formData, SearchFilter filter) {
    if (formData.getTurnoverDateFrom().getValue() != null) {
      filter.addWhere(
          " AND TRUNC(:turnoverFromDate, 'MONTH') <= AT.MONTH ",
          new NVPair("turnoverFromDate", formData.getTurnoverDateFrom()));
    }
    if (formData.getTurnoverDateTo().getValue() != null) {
      filter.addWhere(
          " AND ADD_MONTHS(TRUNC(:turnoverToDate, 'MONTH'), 1) > AT.MONTH ",
          new NVPair("turnoverToDate", formData.getTurnoverDateTo()));
    }
    return filter;
  }
  private SearchFilter setFilterZ2ActualTurnover(CompanyTopReportSearchFormData formData, SearchFilter filter) {
    if (formData.getDataFrom().getValue() != null) {
      filter.addWhere(
          " AND TRUNC(:dataFromDate, 'MONTH') <= AT.MONTH ",
          new NVPair("dataFromDate", formData.getDataFrom()));
    }
    if (formData.getDataTo().getValue() != null) {
      filter.addWhere(
          " AND ADD_MONTHS(TRUNC(:dataToDate, 'MONTH'), 1) > AT.MONTH ",
          new NVPair("dataToDate", formData.getDataTo()));
    }
    return filter;
  }
  private SearchFilter setFilterZ1Z2(CompanyTopReportSearchFormData formData, SearchFilter filter) {
    // Timeframe Z1
    filter.addWhere(
        (formData.getTurnoverDateFrom().getValue() != null ?
            " AND (TRUNC(:turnoverFromDate) <= P.EVT_REQUEST (+) " :
            " AND (1=1 "),
        new NVPair("turnoverFromDate", formData.getTurnoverDateFrom()));
    if (formData.getTurnoverDateTo().getValue() != null) {
      filter.addWhere(" AND TRUNC(:turnoverToDate + 1) > P.EVT_REQUEST (+) ",
          new NVPair("turnoverToDate", formData.getTurnoverDateTo()));
    }

    // Timeframe Z2
    filter.addWhere(
        (formData.getDataFrom().getValue() != null ?
            " OR TRUNC(:dataFromDate) <= P.EVT_REQUEST (+) " :
            " OR 1=1"),
        new NVPair("dataFromDate", formData.getDataFrom()));
    if (formData.getDataTo().getValue() != null) {
      filter.addWhere(" AND TRUNC(:dataToDate + 1) > P.EVT_REQUEST (+) ",
          new NVPair("dataToDate", formData.getDataTo()));
    }
    filter.addWhere(") ");

    return filter;
  }
  private SearchFilter setFilterZ2(CompanyTopReportSearchFormData formData, SearchFilter filter) {
    if (formData.getDataFrom().getValue() != null) {
      filter.addWhere(" AND TRUNC(:dataFromDate) <= P2.EVT_REQUEST (+) ",
          new NVPair("dataFromDate", formData.getDataFrom()));
    }
    if (formData.getDataTo().getValue() != null) {
      filter.addWhere(" AND TRUNC(:dataToDate + 1) > P2.EVT_REQUEST (+) ",
          new NVPair("dataToDate", formData.getDataTo()));
    }
    return filter;
  }
  private SearchFilter setFilterZ1ChangeHistory(CompanyTopReportSearchFormData formData, SearchFilter filter) {
    // note that this filter does not take a FROM part!
    if (formData.getTurnoverDateTo().getValue() != null) {
      filter.addWhere(" AND TRUNC(:changeToDate) + 1 > CH.EVT_CHANGE ",
          new NVPair("changeToDate", formData.getTurnoverDateTo()));
    }
    return filter;
  }
  private SearchFilter setFilterZ2ChangeHistory(CompanyTopReportSearchFormData formData, SearchFilter filter) {
    // note that this filter does not take a FROM part!
    if (formData.getDataTo().getValue() != null) {
      filter.addWhere(" AND TRUNC(:dataToDate) + 1 > CH.EVT_CHANGE ",
          new NVPair("dataToDate", formData.getDataTo()));
    }
    return filter;
  }
  private Double calculateTopNPlannedTurnover(SearchFilter whereCompanyFilter, SearchFilter wherePlannedTurnoverFilter, Integer plannedTopN) throws ProcessingException {

    // Selecting the company_nr for debugging purposes.

    String sql=
      "SELECT COMPANY_NR, PLANNED_TURNOVER " +
      "FROM (" +
      "  SELECT  C.COMPANY_NR, " +
      "          SUM(P1.TURNOVER_PER_YEAR) AS PLANNED_TURNOVER " +
      "  FROM COMPANY C, " +
      "       PROJECT P1 " +
      "  WHERE NOT EXISTS " + organizations() +
      "  AND C.COMPANY_NR != 0 " +
      "  AND C.COMPANY_NR = P1.COMPANY_NR " +
      "  AND (P1.PHASE_UID IN ( " +
      ProjectPhaseCodeType.SuspectCode.ID + ", " + ProjectPhaseCodeType.ProspectCode.ID + ") " +
      "       OR P1.PHASE_UID IN (SELECT UC_UID FROM UC WHERE PARENT_UID IN ( " +
      ProjectPhaseCodeType.SuspectCode.ID + ", " + ProjectPhaseCodeType.ProspectCode.ID + "))) " +
      "  AND P1.ACTIVE = 1 " +
      "  AND 1 = DECODE(::level(ReadCompanyPermission), ::level(BasicCrmPermission.LEVEL_ALL), 1, ::level(BasicCrmPermission.LEVEL_NONE), 0, MY_UTIL.COMPANY_PRIV(::level(ReadCompanyPermission), C.COMPANY_NR, :userNr, :organisationUid)) " +
      "  AND 1 = DECODE(::level(ReadProjectPermission), ::level(BasicCrmPermission.LEVEL_ALL), 1, ::level(BasicCrmPermission.LEVEL_NONE), 0, MY_UTIL.PROJECT_PRIV(::level(ReadProjectPermission), P1.PROJECT_NR, :userNr, :organisationUid)) " +
      whereCompanyFilter.getWhere() +
      wherePlannedTurnoverFilter.getWhere() +
      "GROUP BY C.COMPANY_NR " +
      "ORDER BY 2 DESC )" +
      "WHERE ROWNUM <= :n";

    Object[][] data = SQL.selectLimited(sql, plannedTopN,
        whereCompanyFilter.getBindMap(),
        wherePlannedTurnoverFilter.getBindMap(),
        new NVPair("n", plannedTopN));

    // If we get a result, add to the HAVING clause

    Double result = 0.1;
    if (data.length > 0){
      result = NumberUtility.toDouble((Number) data[data.length - 1][1]);
      if (result == null || result == 0) {
        result = 0.1;
      }
    }
    return result;
  }
  private Double calculateTopNActualTurnover(int presentationType, SearchFilter whereCompanyFilter, SearchFilter whereActualTurnoverFilter, Integer topN) throws ProcessingException {

    String table = null;

    if (presentationType == 1) {
      table = " ACTUAL_TURNOVER_VIEW ";
    }
    else if (presentationType == 2) {
      table = " ACTUAL_TURNOVER_VIEW_HOLDG ";
    }

    // Don't look at planned turnover (and therefore do not use the
    // whereProjectFilter nor visits (VISIT V, USER VU).

    // Selecting the company_nr for debugging purposes.

    String sql=
      "SELECT COMPANY_NR, ACTUAL_TURNOVER " +
      "FROM (" +
      "  SELECT  C.COMPANY_NR, SUM(AT.ACTUAL_TURNOVER) AS ACTUAL_TURNOVER " +
      "  FROM COMPANY C, " +
      table + " AT " +
      "  WHERE C.COMPANY_NR = AT.COMPANY_NR " +
      "  AND NOT EXISTS " + organizations() +
      "  AND C.COMPANY_NR != 0 " +
      "  AND AT.ACTUAL_TURNOVER IS NOT NULL " +
      "  AND 1 = DECODE(::level(ReadCompanyPermission), ::level(BasicCrmPermission.LEVEL_ALL), 1, ::level(BasicCrmPermission.LEVEL_NONE), 0, MY_UTIL.COMPANY_PRIV(::level(ReadCompanyPermission), C.COMPANY_NR, :userNr, :organisationUid)) " +
      whereCompanyFilter.getWhere() +
      whereActualTurnoverFilter.getWhere() +
      "  GROUP BY C.COMPANY_NR " +
      "  ORDER BY 2 DESC )" +
      "WHERE ROWNUM <= :n";

    Object[][] data = SQL.selectLimited(sql, topN,
        whereCompanyFilter.getBindMap(),
        whereActualTurnoverFilter.getBindMap(),
        new NVPair("n", topN));

    // If we get a result, recompute the HAVING clause. If you made any modifications to the HAVING
    // clause in the code above, these will be lost now. Don't do it.

    Double result = 0.1;
    if (data.length > 0){
      result = NumberUtility.toDouble((Number) data[data.length - 1][1]);
      if (result == null || result == 0) {
        result = 0.1;
      }
    }
    return result;
  }

  /**
   * Top 10 Companies Report.
   * The SELECT statement for this report is big. Very big.
   *
   * When changing the column order in the SQL statement,
   * please do not forget to adapt the column numbers in the methods
   * getCompanyTopReportExcel().
   */
  public Object[][] getCompanyTopReportTableData(int presentationType, CompanyTopReportSearchFormData formData, SearchFilter extendedSearchFilter) throws ProcessingException {

    // top company report
    if (presentationType == 1) {
      if (ACCESS.getLevel(new ReadCompanyTopReportPermission()) <= BasicCrmPermission.LEVEL_NONE) {
        throw new VetoException("NotAllowedToSeeThisData");
      }
    }
    // top holding report
    else if (presentationType == 2) {
      if (ACCESS.getLevel(new ReadHoldingTopReportPermission()) <= BasicCrmPermission.LEVEL_NONE) {
        throw new VetoException("NotAllowedToSeeThisData");
      }
    }

    String headsOnlyClause = "";

    if (presentationType == 2) {
      headsOnlyClause = "" +
        " AND NOT EXISTS (SELECT 1 " +
        "                 FROM   COMPANY_COMPANY CC " +
        "                 WHERE  CC.TYPE_UID = " + CompanyCompanyRelationCodeType.HoldingCode.ID + " " +
        "                 AND CC.COMPANY_NR = C.COMPANY_NR)";

    }

    SearchFilter whereCompanyFilter = new SearchFilter(); // C
    SearchFilter whereZ1ActualTurnover = new SearchFilter(); // AT
    SearchFilter whereZ2ActualTurnover = new SearchFilter(); // AT
    SearchFilter wherePlannedTurnoverFilter = new SearchFilter(); // P
    SearchFilter whereZ1ChangeHistoryFilter = new SearchFilter(); // CH
    SearchFilter whereZ2ChangeHistoryFilter = new SearchFilter(); // CH
    SearchFilter whereZ1ContactFilter = new SearchFilter(); // V
    SearchFilter whereZ2ContactFilter = new SearchFilter(); // V
    SearchFilter whereZ2 = new SearchFilter();
    SearchFilter whereZ1Z2 = new SearchFilter();

    whereCompanyFilter = setFilterNewCustomer(formData, whereCompanyFilter);
    whereZ1ContactFilter = setFilterZ1Contact(formData, whereZ1ContactFilter);
    whereZ2ContactFilter = setFilterZ2Contact(formData, whereZ2ContactFilter);
    whereCompanyFilter = setFilterCompany(formData, whereCompanyFilter);
    wherePlannedTurnoverFilter = setFilterPlannedTurnoverDates(formData, wherePlannedTurnoverFilter);
    whereZ1ActualTurnover = setFilterZ1ActualTurnover(formData, whereZ1ActualTurnover);
    whereZ2ActualTurnover = setFilterZ2ActualTurnover(formData, whereZ2ActualTurnover);
    whereZ1Z2 = setFilterZ1Z2(formData, whereZ1Z2);
    whereZ2 = setFilterZ2(formData, whereZ2);
    whereZ1ChangeHistoryFilter = setFilterZ1ChangeHistory(formData, whereZ1ChangeHistoryFilter);
    whereZ2ChangeHistoryFilter = setFilterZ2ChangeHistory(formData, whereZ2ChangeHistoryFilter);
    whereCompanyFilter = setFilterZ1PhasePrioSalesCouncil(formData, whereCompanyFilter, whereZ1ChangeHistoryFilter);
    whereCompanyFilter = setFilterZ2Phase(formData, whereCompanyFilter, whereZ2ChangeHistoryFilter);

    // initialize having filter if only getTurnoverFrom or getTurnoverTo has been provided
    SearchFilter havingFilter = getCompanyTopReportHavingFilter(
        formData, currentProjectsActualTurnover(presentationType, null, whereZ1ActualTurnover));

    Integer topN = formData.getHighestTurnoverCompanies().getValue();
    if (topN != null) {
      // We need to compute the turnovers for all companies before continuing...
      // This is why we need to set all the filters before coming here.
      // This is an excellent opportunity for caching the results in the DB!

      Double result = calculateTopNActualTurnover(presentationType, whereCompanyFilter, whereZ1ActualTurnover, topN);
      if (formData.getTurnoverFrom().getValue() == null
              || formData.getTurnoverFrom().getValue() < result) {
        formData.getTurnoverFrom().setValue(result);
        havingFilter = getCompanyTopReportHavingFilter(
            formData, currentProjectsActualTurnover(presentationType, null, whereZ1ActualTurnover));
      }
    }

    String sql =
      "WITH PROJECT_PHASE AS " +
      "    (SELECT UC_UID " +
      "     FROM   UC " +
      "     WHERE (UC_UID IN (" + ProjectPhaseCodeType.IntegrationCode.ID + ", " + ProjectPhaseCodeType.SignedCustomerCode.ID + ") OR PARENT_UID IN (" + ProjectPhaseCodeType.IntegrationCode.ID + ", " + ProjectPhaseCodeType.SignedCustomerCode.ID + ")) " +
      "     AND    CODE_TYPE = " + ProjectPhaseCodeType.ID + ") " +
      "SELECT  /*+  INDEX(A ADDRESSXPK) INDEX(C COMPANYXPK) INDEX(CA COMPANY_ADDRESSXIF36) INDEX(CA COMPANY_ADDRESSXPK) */ " +
      "        C.COMPANY_NR, " +
      "        C.CODE_NAME  \"Firmenkurzname\", " +
      "        C.NAME \"Firmenname\", " +
      "        C.SECTOR_UID \"Branche\", " +
      "        C.COMPANY_NO \"CRM Firma Nr\", " +
      "        C.RANK \"Rank\", " +
      prioSalesCouncil(whereZ1ChangeHistoryFilter) + " \"Prio Sales Council Z1\", " +
      prioSalesCouncil(whereZ2ChangeHistoryFilter) + " \"Prio Sales Council Z2\", " +

      currentProjectsActualTurnover(presentationType, null, whereZ1ActualTurnover) + " \"Laufende Projekte Z1 [Umsatz]\", " +
      currentProjectsActualTurnover(presentationType, null, whereZ2ActualTurnover) + " \"Laufende Projekte Z2 [Umsatz]\", " +

      companyClassification(whereZ1ChangeHistoryFilter, DepartmentCodeType.CodeA.ID) + " \"A Firmenphase Z1\", " +
      currentProjectsActualTurnover(presentationType, DepartmentCodeType.CodeA.ID, whereZ1ActualTurnover) + " \"A Laufende Z1 [Umsatz]\", " +
      companyClassification(whereZ2ChangeHistoryFilter, DepartmentCodeType.CodeA.ID) + " \"A Firmenphase Z2\", " +
      currentProjectsActualTurnover(presentationType, DepartmentCodeType.CodeA.ID, whereZ2ActualTurnover) + " \"A Laufende Z2 [Umsatz]\", " +
      contactPersonOne(DepartmentCodeType.CodeA.ID) + " \"Ansprechpartner 1 A\", " +

      companyClassification(whereZ1ChangeHistoryFilter, DepartmentCodeType.CodeB.ID) + " \"B Firmenphase Z1\", " +
      currentProjectsActualTurnover(presentationType, DepartmentCodeType.CodeB.ID, whereZ1ActualTurnover) + " \"B Laufende Z1 [Umsatz]\", " +
      companyClassification(whereZ2ChangeHistoryFilter, DepartmentCodeType.CodeB.ID) + " \"B Firmenphase Z2\", " +
      currentProjectsActualTurnover(presentationType, DepartmentCodeType.CodeB.ID, whereZ2ActualTurnover) + " \"B Laufende Z2 [Umsatz]\", " +
      contactPersonOne(DepartmentCodeType.CodeB.ID) + " \"Ansprechpartner 1 B\", " +

      companyClassification(whereZ1ChangeHistoryFilter, DepartmentCodeType.CodeC.ID) + " \"C Firmenphase Z1\", " +
      currentProjectsActualTurnover(presentationType, DepartmentCodeType.CodeC.ID, whereZ1ActualTurnover) + " \"C Laufende Z1 [Umsatz]\", " +
      companyClassification(whereZ2ChangeHistoryFilter, DepartmentCodeType.CodeC.ID) + " \"C Firmenphase Z2\", " +
      currentProjectsActualTurnover(presentationType, DepartmentCodeType.CodeC.ID, whereZ2ActualTurnover) + " \"C Laufende Z2 [Umsatz]\", " +
      contactPersonOne(DepartmentCodeType.CodeC.ID) + " \"Ansprechpartner 1 C\", " +

      companyClassification(whereZ1ChangeHistoryFilter, DepartmentCodeType.CodeD.ID) + " \"D Firmenphase Z1\", " +
      currentProjectsActualTurnover(presentationType, DepartmentCodeType.CodeD.ID, whereZ1ActualTurnover) + " \"D Laufende Z1 [Umsatz]\", " +
      companyClassification(whereZ2ChangeHistoryFilter, DepartmentCodeType.CodeD.ID) + " \"D Firmenphase Z2\", " +
      currentProjectsActualTurnover(presentationType, DepartmentCodeType.CodeD.ID, whereZ2ActualTurnover) + " \"D Laufende Z2 [Umsatz]\", " +
      contactPersonOne(DepartmentCodeType.CodeD.ID) + " \"Ansprechpartner 1 D\", " +

      companyClassification(whereZ1ChangeHistoryFilter, DepartmentCodeType.CodeE.ID) + " \"E Firmenphase Z1\", " +
      currentProjectsActualTurnover(presentationType, DepartmentCodeType.CodeE.ID, whereZ1ActualTurnover) + " \"E Laufende Z1 [Umsatz]\", " +
      companyClassification(whereZ2ChangeHistoryFilter, DepartmentCodeType.CodeE.ID) + " \"E Firmenphase Z2\", " +
      currentProjectsActualTurnover(presentationType, DepartmentCodeType.CodeE.ID, whereZ2ActualTurnover) + " \"E Laufende Z2 [Umsatz]\", " +
      contactPersonOne(DepartmentCodeType.CodeE.ID) + " \"Ansprechpartner 1 E\", " +

      companyClassification(whereZ1ChangeHistoryFilter, DepartmentCodeType.CodeF.ID) + " \"F Firmenphase Z1\", " +
      currentProjectsActualTurnover(presentationType, DepartmentCodeType.CodeF.ID, whereZ1ActualTurnover) + " \"F Laufende Z1 [Umsatz]\", " +
      companyClassification(whereZ2ChangeHistoryFilter, DepartmentCodeType.CodeF.ID) + " \"F Firmenphase Z2\", " +
      currentProjectsActualTurnover(presentationType, DepartmentCodeType.CodeF.ID, whereZ2ActualTurnover) + " \"F Laufende Z2 [Umsatz]\", " +
      contactPersonOne(DepartmentCodeType.CodeF.ID) + " \"Ansprechpartner 1 F\", " +

      companyClassification(whereZ1ChangeHistoryFilter, DepartmentCodeType.CodeG.ID) + " \"G Firmenphase Z1\", " +
      currentProjectsActualTurnover(presentationType, DepartmentCodeType.CodeG.ID, whereZ1ActualTurnover) + " \"G Laufende Z1 [Umsatz]\", " +
      companyClassification(whereZ2ChangeHistoryFilter, DepartmentCodeType.CodeG.ID) + " \"G Firmenphase Z2\", " +
      currentProjectsActualTurnover(presentationType, DepartmentCodeType.CodeG.ID, whereZ2ActualTurnover) + " \"G Laufende Z2 [Umsatz]\", " +
      contactPersonOne(DepartmentCodeType.CodeG.ID) + " \"Ansprechpartner 1 G\", " +

      companyClassification(whereZ1ChangeHistoryFilter, DepartmentCodeType.CodeH.ID) + " \"H Firmenphase Z1\", " +
      currentProjectsActualTurnover(presentationType, DepartmentCodeType.CodeH.ID, whereZ1ActualTurnover) + " \"H Laufende Z1 [Umsatz]\", " +
      companyClassification(whereZ2ChangeHistoryFilter, DepartmentCodeType.CodeH.ID) + " \"H Firmenphase Z2\", " +
      currentProjectsActualTurnover(presentationType, DepartmentCodeType.CodeH.ID, whereZ2ActualTurnover) + " \"H Laufende Z2 [Umsatz]\", " +
      contactPersonOne(DepartmentCodeType.CodeH.ID) + " \"Ansprechpartner 1 H\", " +

      companyClassification(whereZ1ChangeHistoryFilter, DepartmentCodeType.CodeI.ID) + " \"I Firmenphase Z1\", " +
      currentProjectsActualTurnover(presentationType, DepartmentCodeType.CodeI.ID, whereZ1ActualTurnover) + " \"I Laufende Z1 [Umsatz]\", " +
      companyClassification(whereZ2ChangeHistoryFilter, DepartmentCodeType.CodeI.ID) + " \"I Firmenphase Z2\", " +
      currentProjectsActualTurnover(presentationType, DepartmentCodeType.CodeI.ID, whereZ2ActualTurnover) + " \"I Laufende Z2 [Umsatz]\", " +
      contactPersonOne(DepartmentCodeType.CodeI.ID) + " \"Ansprechpartner 1 I\", " +

      "        C.LANGUAGE_UID \"Sprache\", " +
      "        CA.PHONE \"Telefon\", " +
      "        CA.FAX \"Fax\", " +
      "        CA.WWW \"www\", " +
      "        CA.ADD_NAME \"Zusatzname\", " +
      "        CA.STREET || ' ' || CA.HOUSE_NO \"Strasse + Hausnummer\", " +
      "        CA.PO_BOX \"Postfach\", " +
      "        A.ZIP_CODE \"PLZ\", " +
      "        A.CITY \"Ort\", " +
      "        A.COUNTRY_UID \"Land\", " +
      "        C.NOTES \"Bemerkungen\", " +
      "        UTIL.GET_USER_CODE(C.ACTIVE + 10, NVL(:languageUid,246), :partitionUid) \"Aktiv\" " +
      "FROM " +
      "    COMPANY C, " +
      "    COMPANY_ADDRESS CA, " +
      "    ADDRESS A, "+
      "    PROJECT P, " +
      "    PROJECT P1, " +
      "    PROJECT P2, " +
      "    PROJECT_PHASE P1_PP, " +
      "    PROJECT_PHASE P2_PP " +
      "WHERE   1=1 " +
      headsOnlyClause +
      "AND NOT EXISTS " +
      "    (SELECT 1 " +
      "        FROM   COMPANY_TYPE CT " +
      "        WHERE  C.COMPANY_NR = CT.COMPANY_NR AND CT.TYPE_UID = " + ProjectCompanyRelationCodeType.OrganizationCode.ID + ") " +
      "AND C.COMPANY_NR != 0 " +
      "AND C.COMPANY_NR = CA.COMPANY_NR (+) " +
      "AND CA.TYPE_UID (+) = " + CompanyAddressTypeCodeType.PrimaryAddressCode.ID + " " +
      "AND CA.ADDRESS_NR = A.ADDRESS_NR(+) " +
      "AND C.COMPANY_NR = P.COMPANY_NR (+) " +
      "AND P.PROJECT_NR = P1.PROJECT_NR (+) " +
      "AND P.PROJECT_NR = P2.PROJECT_NR (+) " +
      "AND P1.PHASE_UID = P1_PP.UC_UID (+) " +
      "AND P2.PHASE_UID = P2_PP.UC_UID (+) " +
      "AND 1 = P.ACTIVE (+) " +
      "AND 1 = DECODE(::level(ReadCompanyPermission), ::level(BasicCrmPermission.LEVEL_ALL), 1, ::level(BasicCrmPermission.LEVEL_NONE), 0, MY_UTIL.COMPANY_PRIV(::level(ReadCompanyPermission), C.COMPANY_NR, :userNr, :organisationUid)) " +
      whereCompanyFilter.getWhere() +
      wherePlannedTurnoverFilter.getWhere() +
      whereZ2.getWhere() +
      extendedSearchFilter.getWhere() +
      " GROUP BY C.CODE_NAME, " +
      "         C.NAME, " +
      "         C.SECTOR_UID, " +
      "         C.COMPANY_NR, " +
      "         C.COMPANY_NO, " +
      "         C.RANK, " +
      "         C.PRIO_SALES_COUNCIL_UID, " +
      "         C.SECTOR_UID, " +
      "         C.LANGUAGE_UID, " +
      "         CA.PHONE, " +
      "         CA.FAX, " +
      "         CA.WWW, " +
      "         CA.ADD_NAME, " +
      "         CA.STREET, CA.HOUSE_NO, " +
      "         CA.PO_BOX, " +
      "         A.ZIP_CODE, " +
      "         A.CITY, " +
      "         A.COUNTRY_UID, " +
      "         C.NOTES, " +
      "         C.ACTIVE " +
      "HAVING 1=1 " +
      havingFilter.getWhere() +
      "ORDER BY 2, 3, 4 ";

     return SQL.select(sql,
        whereCompanyFilter.getBindMap(),
        whereZ1ActualTurnover.getBindMap(),
        whereZ2.getBindMap(),
        wherePlannedTurnoverFilter.getBindMap(),
        whereZ1ContactFilter.getBindMap(),
        whereZ2ContactFilter.getBindMap(),
        whereZ1ChangeHistoryFilter.getBindMap(),
        whereZ2ChangeHistoryFilter.getBindMap(),
        havingFilter.getBindMap(),
        extendedSearchFilter.getBindMap());
  }

Tags: RSS

March 12, 2014 10:03 AM

March 10, 2014

Alex Schroeder

Twenty Two Years

Twenty two years ago, Claudia and I started dating. It has been the most wonderful thing to happen to me in all my life. I’ve become a better person, a happier person, a more responsible person, a more caring person, … the changes are innumerable. In fact, it’s probably impossible to say which of these positive changes have come about due to our relationship and which of these changes would have happened anyway, simply because of growing older and hopefully somewhat wiser. And yet, the great joy is having shared it all, having grown up together, adapting to each other, learning from each other, and now this stranger has become part of my life, and more. We are to each others like extensions of our body. Two hearts, as one.

http://farm8.staticflickr.com/7442/13033896495_97c3511e5b_z.jpg

Tags: RSS RSS

March 10, 2014 08:59 PM

March 03, 2014

Alex Schroeder

Herausforderung Spielleiter

Manchmal treffe ich Leute, die würden gerne eine Kampagne leiten. Manchmal hoffen sie, dass die Gruppe einfach beisammen bleibt, sich weiterhin am gleichen Ort spielt, sich zur gleichen Zeit trifft. Wenn man unter Freunden, für eine bestehende Runde einen Spielleiter sucht, dann ist da nichts dagegen einzuwenden. Aber manchmal reicht das einfach nicht…

  • Spielleiter müssen die nötigen Spieler finden. Auf Facebook, Google+, Nearby Gamers, Tanelorn, Spielerzentrale, im Freundeskreis, Partner, Verwandte, Arbeitskollegen, und so weiter.
  • Spielleiter müssen die Termine koordinieren. Einer muss klar ankündigen, wann gespielt wird. Wenn Termine ständig verschoben werden, gibt es Leute wie mich, die nicht sehr spontan sind, die damit nicht gut umgehen können. An spontane Spielabende kann ich oft nicht kommen, an abgesagten Spielabenden hätte ich lieber etwas anderes gemacht, und nach und nach sinkt die Priorität der Runde. Schon bald mache ich lieber etwas anderes ab, weil ich mir dann wenigstens sicher bin, dass es stattfindet.
  • Spielleiter müssen muss Konflikte lösen. Spieler schimpfen über Schwule, Nutten, Ausländer? Jeder kann Einsprache erheben, aber wenn ich mich als Gast sehe, habe ich vielleicht das Gefühl, dass ich mich besser mit einem freundlichen Email verabschiede, als mit solchen Leuten zusammen zu spielen. Der Spielleiter ist eben nicht nur für die Rekrutierung der Spieler sondern auch für die Spielkultur verantwortlich.
  • Spielleiter müssen das System wählen oder bieten die Systeme zur Auswahl, welche ihnen liegen.
  • Spielleiter müssen die Regeln durchsetzen, klären, Hausregeln aufstellen, die Spieler an die Regeln erinnern – man kann zwar einen der Spieler zum Regelverantwortlichen machen, in der Regel funktioniert das aber nicht so unglaublich gut.
  • Spielleiter bestimmen das Rampenlicht und müssen korrigierend eingreifen. Manche Spieler sind lauter, haben mehr Ideen, überreden ständig ihre Mitspieler. In einem gewissen Mass ist diese Verteilung von Introvertierten und Extrovertierten normal und entspricht auch den Wünschen der Betroffenen. Durch Befolgen einer klaren Reihenfolge, durch Übertragen von einzelnen Entscheidungen an ruhigere Spieler und so weiter kann hier aber fördernd eingegriffen werden.
  • Spielleiter müssen oft Gastgeber sein. Oft wird bei Spielleitern daheim gespielt. Sie haben die Bücher, die Ordner, das Material – extra Würfel, Stifte, Radiergummis, Unterlagen, Wasserkrüge, Gläser, Schalen für Chips, Pistazien, Erdnüsse, Mandarinen und Schalen für den Abfall.
  • Spielleiter müssen Zeit zum Vorbereiten haben. Als Spieler kann man es sich eher leisten, nur am Spielabend dabei zu sein. Als Spielleiter gehört das alleine sein, das Nachdenken, Aufschreiben und Träumen auch zur Aufgabe.
  • Spielleiter müssen oft Abenteuerberichte schreiben, weil Spieler oft nur am Spielabend beim Spiel sind. Das Durchdenken des letzten Abends ist nicht so ihr Ding. Das Ausschmücken auch nicht. Ich mache mir als Spieler auch nur ein paar Notizen am Rand des Charakterblattes und schreibe selten einen Bericht.
  • Spielleiter müssen eine Welt erschaffen. Diese kann sehr klein sein, von einem Verlies, einem Dorf, der Wildnis, zu einer Stadt, mehreren Städten, der ganzen Oberwelt, die vernetzte Unterwelt, das Jenseits, die Ebenen, nach und nach will alles bedacht sein, bekannte Bücher zum Setting wollen berücksichtigt sein.
  • Spielleiter müssen Abenteuer vorbereiten. Wie man sieht, ist das nur ein kleiner Teil des Ganzen!
  • Spielleiter sind für den zeitlichen Ablauf zuständig. Wann fangen wir an, wann hören wir auf, beginnen wir in media res, enden wir mit einem cliffhanger, haben wir noch eine halbe Stunde oder sollten wir langsam auf das Ende zusteuern? Spielleiter haben irgendwo im Blickfeld eine Uhr.
  • Spielleiter sind auch für das Tempo zuständig. Ist einem Spieler langweilig und machen wir weiter oder verweilen wir noch ein wenig bei dieser Szene? Spielleiter reagieren, wenn die Spieler zum Handy greifen, gähnen, zu malen beginnen oder ihre Würfel sortieren und stapeln.

Ich will mit dieser Liste niemandem Angst machen. Das Spielleitertum ist ein super Hobby. Ich will nur vermeiden, dass jemand denkt, es hat sich schon mit dem Vorbereiten eines Abenteuers. Es bleibt viel an uns hängen.

Tags: RSS

March 03, 2014 10:49 PM

March 02, 2014

Alex Schroeder

Wunschliste für schweizer Rollenspiel Treffen

Ich komme gerade von der IsliCon, einer kleinen Convention in der Nähe, wo ich eine Runde gespielt und eine Runde geleitet habe. Wie schon an der OerliCon beschlich mich ein seltsames Gefühl. Dieses mal war es noch stärker. Irgend etwas stimmt hier nicht. Es gibt mehrere Tische mit Spielen – hier in der Schweiz sind das oft nicht mehr als fünf oder sechs Tische – das ist aber schon zu viel für eine spontane Selbstorganisation. Wenn die eigene Runde zu lange dauert, schielt man neidisch zum anderen Tisch, wo eine neue Runde geboten wird. Wenn man dann mit einer Runde fertig ist, muss man etwas netzwerkeln, um eine neue Runde zu finden. Wenn man sich für ein System interessiert, welches andere Leute spielen, kann man nur für ein paar Sekunden zuschauen. Fragen stellen ist schwierig. Man trifft auf einsame Leute, die auf Spieler oder Spielleiter warten. Oft regelt sich alles spontan, aber eigentlich bin ich nicht zufrieden.

Ich wünsche mir feste Blöcke à drei oder vier Stunden, mit festen Pausen dazwischen, damit alle Leute gleichzeitig Spiele beginnen und beenden. Nur so können wir die langen Wartezeiten vermeiden. Wenn ein Spielleiter viele Stunden braucht, soll er sein Spiel halt für zwei Blöcke anbieten. Dann wissen die Spieler auch, worauf sie sich einlassen. Feste, gemeinsame Pausen erlauben es mir auch, mit dem Spieleiter von Star Wars: Edge of Empire zu quatschen. Ansonsten sind die Chancen gering, dass wir gerade gleichzeitig Pause machen.

Ich wünsche mir einen Aushang mit den geleiteten Spielen, mit Startzeiten und Namenslisten, so dass man sich organisieren kann. Noch besser, wenn das alles elektronisch geht. Das funktioniert bei der OerliCon eigentlich schon ganz gut.

Ich wünsche mir, dass Spielleiter an einer Convention ein straffes Spiel leiten. Dazu gehört, vorgenerierte Charaktere mit bringen, die Einführung abzukürzen, schnell auf den Punkt kommen, und den Spielern ein offensichtliches Ende aufzeigen, so dass sie selber das Tempo mitbestimmen können. Durch meine Spiele unter der Woche, wo wir in 2–3h Abends in ziemlicher Zeitnot spielen, hat mir schon extrem viel diesbezüglich beigebracht. Anfangen, abbrechen, abkürzen, antreiben, überspringen, … Manchmal habe ich das Gefühl, ich müsste mal ein Seminar machen. Teilnehmer leiten für zehn Minuten ihr Spiel, dann gibt es eine Runde Kritik. Ein Spiel an einer Convention kann nicht, darf nicht, gleich wie ein Spiel an einem Samstagnachmittag daheim ablaufen. Als ich nach zweidrittel von meiner Runde Pause machte und einen Kollegen fragte, wie es geht, meinte er nur, sie hätten jetzt endlich den Dungeon erreicht. Oje.

An der IsliCon fand ich super, wie es Früchte und Snacks, Soft Getränke, Wasser, Tee und Kaffee in einem Selbstbedienungskiosk gab. Ausgezeichnete Idee. Ich hoffe, es ist auch finanziell aufgegangen.

Was mir auch sehr gut gefällt ist die angebotene Systemvielfalt. Stars Wars, Barbaren, Pathfinder – es gab neben meinen eigenen Games on Demand eine grosse Auswahl. Für mich ist das Ausprobieren neuer Systeme eine grosse Motivation an einer Convention.

Tags: RSS

March 02, 2014 12:57 AM

February 27, 2014

Alex Schroeder

Games on Demand für IsliCon

Letztes Jahr hatte ich ein paar Indie Games für die OerliCon dabei. Ich liess mich dabei von der Games on Demand Bewegung inspirieren. Kommenden Samstag will ich das gleiche für die IsliCon machen. Vor dem Wochenende muss ich meine Notizen nochmal durchlesen und mir überlegen, was ich alles mitnehmen will. Und was ich alles ausdrucken muss. :)

Was ich leiten will:

Was ich zeigen kann:

Update: Das nächste Mal muss ich unbedingt Pokerchips oder sonstige farbige Tokens dabei haben, mit den die Spieler sich gegenseitig das Vertrauen aussprechen können. Die drei Spalten mit “your trust in them”, “their trust in you” und “points” ist jedes Mal verdammt verwirrend.

Tags: RSS RSS

February 27, 2014 08:32 AM

February 19, 2014

Alex Schroeder

Huge Parties

Yesterday I ran a game for eight players (I usually cap at six). We had already established that this was going to be a raid on a pirate fortress. I knew that it was going to have 80 elves ready to fight, 80 elves sleeping (all 1st level), a 9th and a 7th level elf, and a red dragon. The party allied itself with some commando elves and so the attacking force consisted of eight player characters and their eight henchmen with levels between 1 and 7 as well as the command elves, six 6th level elves and eighteen ordinary 1st level elves; forty characters in all. I handed out little index cards with the stats of the elven commando leaders and their henchmen. Three hours later it was all over, most of the pirates slain, the dragon dead, the enemy leader killed, her second in command take prisoner, the dragon hoard secured and the fortress being towed to the players’ domain. (This is a big mashup campaign using Spelljammer ships and fortresses, and An Echo Resounding for domain level play.)

It was a very unusual adventure, but I like the change in pace!

The fortress was structured as a series of encounters with a mini map I kept behind the screen, usually with ten elves, sometimes with a leader of level 1d6+1; sometimes with more elves about to arrive. Good use was made of hold portal to prevent elves from joining up and good use was made of silence and sleep to surprise enemies and incapacitate a dozen foes in the surprise round, haste was used to quickly position archers and casters, sneaky thieves were used to scout ahead and best prepare for assaults, and to avoid tricky hallways with enemy archers hiding, several lightning bolts were used to kill the dragon before it could join the elven sorceress, they survived her cloudkill with minimal losses and managed to dispel it the next round…

It was a bloodbath.

For ease of reference and consistent spell selection of both the allied commando elves and the defending elf pirates, I used a technique I described previously: my spell book notation lists the spell-book of the top elf or magic-user with spell level and spell name, and a third column with the character level at which this spell is usually picked. This helps me run a lot of spell casters. This list would begin as follows, for example:

Spell Level Character Level Spell Name Notes
11sleep2d8 HD
12shieldAC 4, AC 2 vs. missiles
17detect magic
23invisibility
24detect invisibility5 rd./level
28knock
35haste30 min.
36dispel magic
39fireball9d6
47polymorphAC 0 1d6+1/1d6+1/3d10 MV 240
48dimension door360 ft. or 120 m
410?
59cloud kill⌀ 30 ft., MV 6
510?

The most important skill of all is a sort of military “go! go! go!” efficiency at the table, however. No questions about who rolls initiative. Roll all the dice – have d20s and damage dice of matching colors and have all the colors assigned to your dudes and roll them all at once. All enemy elves, regardless of level, had AC 4. When your turn comes up, just tell me “I hit three times, damage is 4, 5, 2.” That’s the plan, anyway. :) Also, pick a leader who tells me where the party goes. Which stairs do you pick? Quietly or quickly? When the fight is on, just keep pushing. When the fight is over, let players talk, laugh, investigate, debate.

That’s it.

http://farm8.staticflickr.com/7432/12630528884_98d7640b16.jpg

The picture shows the kind of notes I had prepared ahead of time. As you can see these are crude sketches of the area and enemy positions. Most enemies were all elves with a single magic missile memorized. If the party won initiative, it was usually over in a few seconds.

As you can see on the little fold-out flow-chart on the left, the encounters weren’t all arranged linearly. My main idea was this:

  1. Failure to scout ahead would result in players fighting elves on catapult platforms, essentially wasting resources. As it turns out, players did scout ahead but decided to fight all the elves anyway, thinking that they wanted to any surprises behind their backs.
  2. Following the main entrances would put the focus on fighting, following the steamy passages left and down would allow more sneaking and would allow players to fight the dragon before it joined up with the leaders. Players chose to go for the sneakier variant.
  3. I had the vague idea of figuring out whether players were wasting time or being too loud and springing extra ambushes on them if they did. In the press of the moment and considering how lame rolling for “move quietly” would be in this context, I just used the flow-chart as is.
  4. When I gave the players the commando elves to run, I told them that the elves would evaluate their leadership and if they felt that the party had been betraying them (using them as cannon fodder), then surely they would turn on them – just as the party would have turned on them. The players accepted this.

It worked for me!

In the final analysis, it was a lot easier than I expected. Was it because the commando elves were too strong? Was it because the party had four extra players I had not expected? (Two of them are new players from my Sunday campaign and another two players are not regular players so I wasn’t counting on them.) Oh well, I think it’s only fair to not adjust difficulty levels on the fly.

Tags: RSS RSS

February 19, 2014 11:15 AM

February 17, 2014

Alex Schroeder

Pendragon vs. D&D alter Schule

Meine Pendragon Kampagne hat sich diesen Sonntag ersatzlos aufgelöst. Wie ich schon auf Englisch geschrieben habe, gibt es hierfür eine Vielzahl von Gründen. Für mich war an der Diskussion vor allem interessant, dass zwei meiner Spieler die Pendragon Kampagne mit meiner D&D Kampagne verglichen.

Hier mal ein tabellarischer Vergleich einzelner Aspekte meiner Kampagnen.

Pendragon “klassisches” D&D
Generationen von Spielercharaktere mit klarer Erbreihenfolge. Spielt man ein Jahr pro Spielabend dauert mindestens 20 Spielabende, bis man einen Sohn spielen kann, falls überhaupt einer die ersten 15 Jahre überlebt.Eine Menge von Gefolgsleuten, welche kommen und gehen, parallel zu den Hauptcharakteren Stufe steigen, mächtiger werden. Es gibt keine Blutsbande aber eine gemeinsame Geschichte dank gemeinsam überstandener Abenteuer.
Die Suche nach einer Frau ist wichtig. Sobald man allerdings geheiratet hat, ist die Frau egal. Nebulös entstehen Kinder, von der Dame selber kennt man kaum den Namen. Man könnte sich ein kompliziertes Charakterblatt erstellen, doch der Papierkram bringt sowieso nichts.Sexuelle und romantische Aspekte spielen kaum eine Rolle. Es gibt keine Winterphase, kein Werben, keine Kinder, keine Liebschaften. Gegenüber den vielen Gefolgsleuten gibt es ab und zu eine gewisse Loyalität und Treue, manche von ihnen sind erhalten einen eigene Persönlichkeit.
Das Geld und die Einnahmen sind praktisch egal. Wer reich lebt, kann die Mortalität der Kinder reduzieren und erhält ein wenig mehr Erfahrungspunkte. Man kann Befestigungen bauen und Armeen anheuern, in den Regeln sind Belagerungen aber nur knapp und unklar beschrieben. In der Kampagne heisst es manchmal, dass die Ländereien geplündert werden, doch welchen Einfluss Befestigungen hierauf haben, wird nicht beschrieben.Das Geld und die Einnahmen sind eigentlich egal. Weil Geld aber auch Erfahrungspunkte sind, gibt es einen ständigen Druck, dem Geld nach zu rennen. Für das Domänenspiel verwenden wir An Echo Resounding – zusätzliche Regeln, die einfach und klar formuliert sind. Die Domäne hat Einnahmen, Befestigungen, Einheiten. Das ganze ist wie ein kleines Kriegsspiel, welches jeden vierten Spielabend zur Sprache kommt.
Die Kampagne läuft auf klaren Schienen. Wir wollen die Arthus Sage miterleben. Für die meisten Schlachten ist der Ausgang also schon klar. Keine List, kein Glück kann dieses Schicksal ändern.Das Domänenspiel findet in einer offenen Sandbox statt. Es ist möglich, mit Abenteuern das Domänenspiel zu beeinflussen.
Die Kampagne verführt mich als Spielleiter dazu (wie damals die Paizo Adventure Path Serie), die Spieler auf den Schienen zu lassen.Die offene Sandbox erlaubt mir, dort anzubauen, wo die Spieler sich engagieren. Wo geforscht wird, gibt es auch mehr zu entdecken.
Die Kampagne ist chronologisch strukturiert. Das macht mich bezüglich Nicht-Spieler-Charakteren (NSC) sehr unflexibel. Spielt diese Figur in der Zukunft eine Rolle? Wie finde ich diese Information in einem Buch?Die Kampagne ist räumlich strukturiert. Die Basis ist eine praktisch zeitlose Karte. Wenn wir irgendwo hin kommen, ist klar, was es dort zu finden gibt. Die offene Struktur erlaubt mir Improvisation bezüglich der Zukunft.
Die Kampagne ist voller Abenteuer Ideen. Um ehrlich zu sein sind viele dieser Ideen aber nicht so unglaublich interessant. Ein Teil des Interesses entsteht aus den realen Legenden, welche dazu geführt haben, dass sie Teil der Kampagne wurden.Die Kampagne erlaubt mir, Ideen aus der gesamten Old School Renaissance (OSR) auf zu nehmen. Das macht mir mehr Spass und verlangt von meinen Spielern auch kein Wissen über das Quellmaterial. Meine Kampagne ist allerdings bedeutend eklektischer und konfuser.
Die Regeln scheinen im ersten Anlauf klar und einfach zu sein. Im Einzelfall ist es aber immer wieder schwierig. Darf man jederzeit entwaffnen? Muss man im ersten Ansturm die Lanze verwenden? Wie genau vermeidet man es, ohnmächtig zu werden, wenn man eine grosse Wunde erhält? Wie vermeidet man es, keinen Schaden zu nehmen, wenn man im Sattel ohnmächtig wird? Irgendwo steht die Antwort, aber es ist mühsam und bringt kaum etwas.Die Regeln sind kurz und seit Jahren immer gleich. Ich kann den ganzen Abend leiten und muss kaum eine Regel nachschauen. Einzig Monsterfähigkeiten und Zaubersprüche müssen manchmal nachgeschaut werden. In diesen Fällen ist es aber einfach, die entsprechenden Passagen zu finden. Es braucht praktisch keinen Index, weil Sprüche und Monster alphabetisch sortiert sind.
Egal wie gut man ist, es ist immer möglich in einer Schlacht einen Berseker der Sachsen zu finden, der einem, wenn man Pech hat, mit 12W6 ins Gesicht schlägt, was oft zum sofortigen Tod führt.Am Anfang des Spieles ist es tödlich, doch mit einer Hausregel zum Thema hat sich die Thematik entschärft. Zudem gibt es später Zaubersprüche, mit denen die Toten wieder ins Leben geholt werden können.

Tags: RSS RSS

February 17, 2014 12:08 PM

No More Pendragon

We stopped play midway through year 510 of The Great Pendragon Campaign after a devastating battle in May and ended the campaign. Too much railroading, too many sudden death moments, too many fiddly rules that slow us down but don’t further our enjoyment, too much leafing back and forth in the book… I’m both sad and relieved, in  a way.

The discussion was kicked off by one player who felt like quitting the campaign and explaining all the things he didn’t like. I agreed with a lot of it. I had written about it myself. Another player said he’d like to play on weekdays instead of weekends. Another player was missing. My wife wanted to continue playing but was suffering because of a recent string of character deaths. The last player was new and said he had been unable “to get into it” in the three sessions he had played with us.

An astonishing thing happened during the discussion. My wife and the player who had started the discussion are both players in my mashup game—the old school sandbox game using Labyrinth Lord, the Wilderlands of High Fantasy, Spelljammer, Planescape, and An Echo Resounding. They started comparing the Pendragon campaign to this other game. The other game is crazy (“I’d describe the atmosphere as killer clowns”) but it has more player agency. Pendragon is more about how you deal with the events around you. My mashup game is about the things you do. I rarely need to pick up a rulebook and search for a rule. The NPCs are all strange and memorable. No king Leodegrance, Sir Cador, Centurion King and other faceless dudes that you haven’t interacted with. Pendragon not only suffers from an inflation of NPC names that players haven’t interacted with, it also encourages me to add names, exacerbating the problem. What are the names of the sons of Duke Ulfius? Who cares? I still feel compelled to look it up instead of making it up.

In a way, the big campaign provides a railroad that affects me as well. I am inspired by the campaign, I steer the players towards the rails, I entice them to stay on the rails, they are always present. Like those pesky Paizo Adventure Paths, they shackle my imagination and stiffle my improvisation.

So, where as I am sad to see it go, I am also happy to see how my players love the classic D&D sandbox and validate the choices I made for that mashup game.

Tags: RSS RSS RSS RSS

February 17, 2014 07:35 AM

February 15, 2014

Alex Schroeder

Über die Geworfenheit

Gemäss meinem Philosophie Lexikon verstehen Heidegger und Sartre mit Faktizität die Tatsache, dass wir Menschen zwar “als verstehendes und handelndes Individuum” faktisch existieren, doch nicht “Herr dieser Existenz” sind. Geworfenheit ist dieser Zustand. Ins Leben geworfen.

Ich kann mich daran erinnern, wie mich das Tabu kalt berührte, als ich meinen Eltern entgegen spuckte: “Dieses Leben habe ich nicht gewollt! Ihr habt mich ins Leben gesetzt!” Das ist lange her und ich weiss schon gar nicht mehr worum es ging, aber dieser Moment, dieses Gefühl, ist mir in Erinnerung geblieben.

Es überfällt mich immer, wenn ich etwas zum Thema Pränataldiagnostik lese. Heute, zum Beispiel, lese ich in der WOZ über das schweizerische Präimplantationsdiagnostikverbot, welches demnächst gelockert werden soll. Die Zitate im Artikel zeigen mir den unterschiedlichen Umgang mit der Geworfenheit.

“Kinder sind heute Projekte. Alles muss planbar, projektierbar und perfekt sein. Ich finde das eine beunruhigende Entwicklung.” (Brigitte Häberli-Koller, CVP-Ständerätin, TG)

“Man sagt von vornherein, ich nehme das Kind nur, wenn es keine Anomalie hat. Das ist eine gefährliche Haltung und eine irrige Vorstellung: Es gibt keine Garantie für ein gesundes Kind.” (Christa Schönbächler, Insieme)

“Die eigentliche Herausforderung wäre, mit Kinderlosigkeit oder mit Behinderung zu leben und gute Lösungen zu finden.” (Gertrud Bernoulli, Pfarrerin, Rüschlikon)

Dieses Bild des Lebens als eine Zufälligkeit, mit der wir uns arrangieren müssen, dieses Bild, dass der Sinn des Lebens, die Freude des Lebens, die Prüfung der Umgang mit diesen Zufällen ausserhalb unserer Macht sein könnte, dieses Bild ist eine Seite, die ich gut verstehe. Gleichzeitig gehört aber die Intention, unseren Kinder ein besseres Leben zu ermöglichen, ihnen einen Vorsprung zu schenken, ihnen Möglichkeiten zu bieten, zu uns. Es durchzieht alles: kein Rauchen, kein Trinken, Stillen, Förderung, Kindergarten, Schule – alles ist darauf ausgerichtet, das Kind im Sinne unserer Werte weiter zu bringen. Klar, hier bin ich auch ein Kind meiner Klasse: als Burgois kann ich nicht anders. Ich nutze alle Mittel, jede Kulturtechnik, jedes Wissen, welches unser Gesellschaft bietet, aber auch jede technische Lösung. Impfungen, Sportgeräte, Skilifte, alles sinnige und unsinnige im Dienste dieser einen Intention.

Geworfenheit betrifft unser eigenes Leben. Was unsere Kinder allerdings anbelangt, geht es ums Werfen. Einmal abgeschossen, werden wir den Pfeil nicht mehr beeinflussen können. Und so zielen wir. Sorgfältig. Je komplexer die Welt ist, je mehr wir selber Entscheiden können, um so sorgfältiger. Wir schieben den Moment mit Verhütungsmitteln hinaus. Wir ziehen zum richtigen Zeitpunkt in die richtige Gegend.

In diesem Sinne denke ich, dass die Präimplantationsdiagnostik und die Pränataldiagnostik ganz allgemein unserem Bedürfnis entspricht. Alle angesprochenen Probleme, die Begründung von Ausgaben für Jugendliche, die sich “nicht lohnen”, der Umgang mit Schicksalsschlägen, der Umgang mit dem Fremden, all diese ethischen und existenziellen Fragen werden sich weiterhin stellen. Es macht aber keinen Sinn, die aktuelle Situation zu verteidigen, nur damit sich diese ethischen und existenziellen Fragen unverändert weiterhin stellen.

Für die Diagnostik.

Tags: RSS

February 15, 2014 09:40 AM

Finding Duplicate Files

I have a ton of files I downloaded to my tablet and I have a ton of files on my external harddisk. How can I ever clean it all up? With Emacs, I have dired, but no easy way to figure out which files have changed – specially if the files are not all in the same directory structure. Based on EmacsWiki:JoeBloggsdired-dups.el I wrote a new version that did what I wanted it to do.

Find dired-duplicates.el on GitHub.

Now that I think about it, I guess my code does the exact opposite: it find differences, not duplicates. I should change those names…

(As it turns out, there are still bugs in the code. Ouch.)

Tags: RSS

February 15, 2014 12:04 AM

February 12, 2014

Alex Schroeder

Red Cliff

I enjoyed Red Cliff (2008) even though it contained far more battle than I cared for. I liked Tony Leung. I kept thinking about the Three Kingdoms Book I started to read and the episodes of the Chinese History Podcast on the end of the Han, the Three Kingdoms Period, Daoism, the huge ships and formidable weapons the Chinese had.

star star star – I’d recommend it to anybody who likes the genre

Tags: RSS

February 12, 2014 06:27 AM

January 31, 2014

Alex Schroeder

Virtual Photography

I just stumbled over EVE Travel, with pictures and stories from the EVE Online world. What a wall of text. But the pictures! Never having played EVE, I keep getting reminded of my days as a kid playing Wing Commander 1 & 2 on a computer that would be unfit to be my phone’s audio processor, I guess. I’ve seen blogs with photographs of virtual worlds before, and it just keeps amazing me. How far we have come!

Some black and white images from Sykrim, for example. Or hipster Instagram pictures from Mirror's Edge.

Tags: RSS

January 31, 2014 09:39 AM

January 30, 2014

Alex Schroeder

Fourty Years of Dungeons and Dragons

Did you do something special? I gave an interview to one of these newfangled, local, online news sites, in German. Wenn Erwachsene mit Stift und Papier in die Schlacht ziehen, or When adults do battle with pen and paper.

Tags: RSS

January 30, 2014 07:44 AM

January 27, 2014

Alex Schroeder

Nethack Mapping

Today, as we were exploring a ruin of Ianna, I decided I wanted to start mapping on my iPad. But how? Enter ASCII art.

▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓░▓┌─┐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓░░=·│▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓v▓└─┘▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓v▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓░▓▓┌────┐▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓=▓▓│····│▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓░░░=····=░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓░░▓▓│····│▓^▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓░▓▓▓└────┘▓^▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓░▓▓▓▓▓▓▓▓▓▓^▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓^▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓^▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓^▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓^▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓^▓▓▓▒▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓┌·┐▓▓░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓│≈·░<░░░▓▓▓▒▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓└─┘▓▓░░░▓▓▓░▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░▓▓▓░▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░▓▓▓░▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓░░░▓▓▓░░░▓▓▓░▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░▓▓░░░▓▓░░░░▒▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░▓░░░▓░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓▓▓▓
▓▓▓▓▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓

It’s ugly. It doesn’t do slanted passages. It’s slow. But it worked… dead

Perhaps I should just have stuck to the old style:

                                   ---------                --------------
                                 ##.<......|                |............|
                                 # |.......|               #-............|
                              ### #........|             ###---------.----
                               #   |.......-#            #           #
                             Y@#   |.......|#          ###         ###
                             #     |.......|#          #           #
                          ..       ---------### -------#         ###
                         --                   # |......#         #
                                              ##......|  ##########
                                                |>....|       --+-.------
                                                |.....|       |.........|
                                                -------       |.........|
                                                              |.........|
                                                              |.........|
                                                              |.........|
                                                              -----------

Perhaps what I need is a program that takes a text description of the dungeon and turns it into ASCII art.

Then again, once we do that, perhaps we might as well do node-based dungeon mapping. I might have to read that series of blog posts by Keith Davies again.

Then again, I’ve just skimmed Random Dungeon Generators Reviewed on Inkwell Ideas. Generating good random maps is hard. I still wonder, however. How hard would it be if you provided some input?

Tags: RSS

January 27, 2014 09:46 PM

January 24, 2014

Alex Schroeder

Game Music

I sometimes try to pick an album for a campaign or a particular kind of environment. I often play Lustmord’s Heresy when players enter the Underworld or when facing temples of demon lords. I pick game soundtracks (Elder Scrolls, Vagrant Story) for most of my old school D&D games; I usually play medieval music when running Pendragon (La Capella Reial de Catalunya, for example). I used to play Conan stuff for Barbarians of Lemuria and Crypts n’ Things. I played a lot of 16 Horsepower and Woven Hand (dystopian Country?) for Western games or towns with a Western vibe in my old school D&D game. I guess I’d play Godspeed You! Black Emperor non-stop for a post-apocalyptic game. I sort of try to avoid the Star Wars sound tracks for Science Fiction or the Lord of the Rings / The Hobbit soundtracks for Fantasy, but sometimes it’s just so damn convenient.

I don’t have the time to pick songs for particular scenes when I’m running the game. The only thing I barely manage to do is skip the current track if it is widely inappropriate. I also can’t have songs with lyrics that distract me, nor can I have music that has me bobbing my head or tapping my feet…

Tags: RSS

January 24, 2014 08:46 AM

January 23, 2014

Alex Schroeder

Verschlüsselung

Auf Google+ lese ich immer gerne die Beiträge von Kristian Köhntopp. Heute einen geteilten Artikel von Stefan Münz, in dem dieser schrieb:

NSA, Millionen Mail-Zugangsdaten in Botnets … nein, das ist nicht das Ende des Internet. Es ist nur das Ende überholter bürgerlicher Vorstellungen von Privatsphäre, die in Zukunft so nicht mehr haltbar sein werden (und auch übrigens vor hundert oder zweihundert Jahren in dieser Form auch nicht existierten). Kurzum: es geht um jenen Abschied von gepflegter Heimlichkeit, den die Spackeria schon vor ein paar Jahren propagiert hat. […] Das Netz ist ein Forum, eine Fußgängerzone. We are public. – Stefan Münz

Darauf haben einige Leute in Kristian Köhntopps Kommentaren die Möglichkeiten und Grenzen der Kryptographie diskutiert. Ich selber meinte dazu allerdings:

Es ist nichts dagegen einzuwenden, die “gepflegte Heimlichkeit” zu wollen, egal ob die “Spackeria” das auch will oder sie “vor hundert oder zweihundert Jahren in dieser Form auch nicht existierten”. Der Ist-Zustand ist nicht unveränderlich.

Manchmal wirft man der Justiz vor, mit veralteten Gesetzen neue Tatsachen beurteilen zu wollen. In diesem Fall will ich aber genau mit meiner (veralteten Spackeria-?) Moralvorstellung die alten Gesetze (oder Wunschvorstellungen) beibehalten. Die Privatsphäre, den Schutz der Kommunikation, den Schutz derjenigen, die Missstände aufdecken, den Schutz der Journalisten, den Schutz ihrer Quellen, und so weiter. Und ich will hierfür die moderne Technik verwenden können.

Wenn das Netz eine “Fußgängerzone” ist, dann heisst das ja noch lange nicht, dass keine Regeln gilt, dass wir keine Erwartungen an unsere Mitbürger haben. Deswegen muss man halt an vielen Strängen gleichzeitig ziehen. Nur auf der Machbarkeit der Verschlüsselung herum zu reiten ist nicht zielführend.

Eine andere Welt ist möglich. Die Gegenwart als unveränderlich zu beschreiben ist konservativ.

Meinen öffentlichen Schlüssel gibt es über die üblichen Schlüsselserver.

pub   1024D/353AEFEF 2002-07-10 [expires: 2014-11-01]
      Key fingerprint = 92F1 9F7D D289 D4D8 CEAE  0427 7573 68E7 353A EFEF

Tags: RSS RSS

January 23, 2014 08:24 AM

Fight On

Fight On! #14 has been released on Lulu! The bestest old school fanzine is back, like a revenant it haunts the living even if we know that it is already dead. Calithena has said that #15 will be the last issue and that saddens me. Issue #14 also came without my Caverns of Slime. This doesn’t make me as sad as I thought it would because we get a fantastic troll fortress instead. Gatehouse, temple, main complex, it has everything and nice, emphatic maps. Thick, black lines, high contrast edges, and yet clearly labelled. Citadel of the Dark Trolls. Lee Barber. Well done!

One of the comments in the announcement thread says “I used the code GETIT25 and got 25% off my order.” Good luck!

Tags: RSS RSS

January 23, 2014 06:44 AM

January 18, 2014

Alex Schroeder

Pendragon and the Great Pendragon Campaign

I wrote about Pendragon last year. Tomorrow I’ll be running the year 509. As the Great Pendragon Campaign starts in 485 and we usually play once a month, one game year per session we must have played for 25 sessions and about two years of real time.

I’ve written about the cool stuff before. I don’t really like skills in my games, but Pendragon skills still works. It has a weird but satisfying criticial hits system: roll under your skill on a d20 and you succeed, roll your skill exactly and it’s a critical success, if your skill is higher than twenty, you can’t ever fail—add whatever you have above twenty to your roll, making critical successes even more likely. I also like the traits pairs of traits that will sometimes govern how characters reacts, even if players don’t want them to. You can invoke them for a small bonus but if you fail, there’s also a small penalty. Then there are passions which are similar, except they don’t come in opposing pairs. If you manage your passion roll, you get a big bonus. If you fail, you get a big penalty. And if you fumble, you run into the woods, a raving madman. You’re taken out.

I want to talk a bit about the things that do not work as far as I am concerned. We’ve played the King Uther period and we’re finishing the Anarchy period. I don’t think these problems will disappear, however.

One of the first things we noticed while playing the Great Pendragon Campaign was that the Family Events in the Winter Phase are not very exciting. Having seen some great random event tables in the Old School Renaissance for D&D, I was not impressed by the table in the book. We’ve tried to write better stuff (in German), but so far we haven’t managed to strike the right balance between family development, adventure hooks and color. Ideally, these events would help my players discover their family tree, add nephews and nieces, cousins and more. For a while we used the Dramarama tables, but that led to several family members having affairs with tax collectors and the like. It didn’t work for us. The original table also had many women disappearing, but I wasn’t sure what to do with it. We had an adventure involving a saxon witch, but I’d like the table to provide me with more. I’d also like the table to provide players with a small opportunity to showcase their characters. Let us know about their traits, their families, their relationships. Alas, it isn’t working.

I also noticed that the book places a lot of importance on wives and marrying, but other than the first four candidates in the book, no stats are provided. We soon needed to know about their Stewardship and Chirurgery skills and only one of us was brave enough to create complete character sheets for their character’s wives. I would also have liked to know more about the glory prospective wives are worth, the number of manors they provide, what characters they have. I would have liked a table to generate appropriate wives, for example. That would have been a good solution. Quick to use at the table, too.

After a few sessions, players will start earning money with their manors. That, too, isn’t explained too well. We do opposed rolls of Bad Weather vs. Stewardship and figure out the resulting economic level of the knight’s lives, eg. “rich”. Now what? Does the character get £9? £8+1d4? Does the character get no money all but produce that can be spent but not saved? Can this money be used to build fortifications?

This brings me to another problem: Later in the game, people can learn the Siege skill. What happens with people in fortifications when the attacker has no Siege skill: Can they never take these fortifications? There are sadly very few example castles in the book. Do the saxons ever attack fortified manor houses? I guess they don’t. The fortifications also don’t protect against raiding saxons, right? So it just keeps your family safe?

The Winter Phase is too much book keeping.

As for the Campaign itself: Sometimes it feels very much like a railroad. Sometimes it’s hard to figure out what to do. Sometimes the adventure ideas are great. I’m still undecided. I sort of like it, I just wish more years were as cool as some of them.

In short, I think there is a great game in Pendragon. The campaign is good but could be better; the rules are good but could be better. I have already decided that I won’t be buying any more books. I need less rules, not more. I feel like I’d have to write a little houserules document and use it to run my next campaign. I sometimes find it hard to believe that other people haven’t run into these things and that these issues haven’t been fixed. I hardly read the forums, however.

I’ll keep running it. I just wish somebody would write the house rules I think I need. If you had the same issues, let me know how you handled them.

Update: Excellent comments by Doyle Tavener on Google+.

Tags: RSS RSS RSS

January 18, 2014 11:12 PM

January 17, 2014

Alex Schroeder

Monitoring

I followed the tutorial Server Monitoring With munin And monit On Debian Wheezy by Falko Timme and I think it worked! I made some small additions in order to monitor Exim4 and Dovecot based on the Monit configuration examples on their wiki and some notes on self-signed certificates from the Debian wiki.

For my future self trying to figure out what the hell is going on:

Nice! ok

Tags: RSS

January 17, 2014 02:34 PM

January 15, 2014

Alex Schroeder

Crypto-Gram

I recommend you all subscribe to Bruce Schneier’s Crypto-Gram newsletter if you aren’t subscribed to his blog. Today’s Crypto-Gram, for example, has this excellent passage:

Not only is ubiquitous surveillance ineffective, it is extraordinarily costly. I don’t mean just the budgets, which will continue to skyrocket. Or the diplomatic costs, as country after country learns of our surveillance programs against their citizens. I’m also talking about the cost to our society. It breaks so much of what our society has built. It breaks our political systems, as Congress is unable to provide any meaningful oversight and citizens are kept in the dark about what government does. It breaks our legal systems, as laws are ignored or reinterpreted, and people are unable to challenge government actions in court. It breaks our commercial systems, as US computer products and services are no longer trusted worldwide. It breaks our technical systems, as the very protocols of the Internet become untrusted. And it breaks our social systems; the loss of privacy, freedom, and liberty is much more damaging to our society than the occasional act of random violence.
– Bruce Schneier, How the NSA Threatens National Security

Tags: RSS RSS RSS

January 15, 2014 09:48 AM

January 14, 2014

Alex Schroeder

January 12, 2014

Alex Schroeder

Good Night, Pyrobombus

http://farm8.staticflickr.com/7423/11910008984_661465ff92.jpg

I’ve used this Mac Mini since the summer of 2006 on a crappy 1024x768 monitor and loved it. But now Claudia has a PowerBook and Apple doesn’t allow me to run Mac OS 10.9 on this Mini and there seem to be no more security patches. It’s too old. It has become a security risk. This is the machine that made me switch from PCs to Macs. I called it Pyrobombus. Bye bye, Pyrobombus. Perhaps I shall one day install Debian. But right now we just don’t have a need for another computer in the house. Also, the keyboard sucked.

Tags: RSS RSS RSS

January 12, 2014 05:43 PM

Chase Rule

This post is a translation of the rule presented in German a few weeks ago: 2013-12-23 Verfolgungsjagd. Matt Wagner was wondering about chase rules on Google+.

This rule is part of my German house rules document, Halberds & Helmets. I just can’t remember the weird rule from the Basic D&D and Labyrinth Lord books. Inspired by skills in Apocalypse World I decided to use 2d6 and ideas by Erin Smale he left in a comment on a Google+ post of mine.

Chase: If you’re being chased, roll 2d6. On a 2, you’re surprised. On a 3–6, it’s a fight. On a 7–9, choose two points from the list. On a 10–11 choose one point. One a 12, you made it, no problem.

  • you were separated
  • it takes a long time
  • you got lost
  • you had to drop shields and backpacks

Optional modifiers. +1 for each of the following: if there are twice as many chasing you, if you have a faster movement rate, if there’s a thief in your party, if it rains, if it’s dark. -1 for each of the following: if there’s an elf or a ranger tracking you, if there are wounded party members with you, if there’s snow on the ground.

Only use the modifiers if you remember. :)

Tags: RSS RSS

January 12, 2014 01:52 PM

January 11, 2014

Alex Schroeder

mkhexgrid

My Old School Hex Map Tutorial tells people to use mkhexgrid, if they can. It’s what I’ve been doing for years, now.

On my wife’s laptop we now run Mac 10.9 (“Maverick”) and it no longer builds. As I’ve switched to using Homebrew, I recided to write my own Formula.

If you want to try it, save it as /usr/local/Library/Formula/mkhexgrid.rb and run brew install mkhexgrid. The only tricky thing is that it requires the GD library to be built with FreeType, apparently. If you don’t have GD installed, great. This Formula will do the right thing. If not, you might have to brew uninstall gd before proceeding.

require 'formula'

class Mkhexgrid < Formula
  homepage 'http://www.nomic.net/~uckelman/mkhexgrid/'
  url 'http://www.nomic.net/~uckelman/mkhexgrid/releases/mkhexgrid-0.1.1.src.tar.bz2'
  sha1 '3b8e0be3636f90a3217a5e3556bdaf7bb0c49116'

  depends_on 'gd' => %w{with-freetype}

  def install
    inreplace 'Makefile' do |s|
      s.change_make_var! "DESTDIR", prefix
      s.change_make_var! "CC", ENV.cc
      s.gsub! /install (.*) -o 0 -g 0/, 'install \1'
    end
    inreplace 'mkhexgrid.cpp' do |s|
      s.sub! 'catch (exception &e)', 'catch (std::exception &e)'
    end
    system "make" # needs to be separate
    system "make", "install"
  end

  test do
    # test the example from the man page (but without inches)
    system "mkhexgrid", "--output=ps", "--image-width=2448",
    "--image-height=1584", "--hex-side=36", "--coord-bearing=0",
    "--coord-dist=22", "--coord-size=8", "--grid-thickness=1",
    "--coord-font=Helvetica", "--grid-grain=h", "--grid-start=o",
    "--coord-tilt=-90", "--centered", "-o", "test.ps"
  end
end

Tags: RSS RSS RSS

January 11, 2014 07:24 PM

January 05, 2014

Alex Schroeder

OSX Maverick and Apache

A bookmark for myself regarding Apache. The important part is this:

OS X comes with Apache already installed, so it’s as simple as starting up the server. Previously, you could start this using the System Preferences > Sharing panel, but it has been removed from there in 10.9. – OS X Mavericks and Apache

It tells you how to start Apache from the command line. The important part was how to make sure that it gets started when the machine is booted, though:

sudo launchctl load -w /System/Library/LaunchDaemons/org.apache.httpd.plist

Tags: RSS RSS

January 05, 2014 01:16 PM

January 04, 2014

Alex Schroeder

The Walrus and the Warwolf

These days I read a lot less books than I used to. I read too much blogs on the topic of role-playing games, too much time spent on Google+, also on the topic of role-playing games, I skim this role-playing book and that PDF, and since I’m mostly interested in the Old School Renaissance of role-playing games—namely D&D from the nineteen eighties—I also feel like I ought to like the books recommended by one of the founding fathers of D&D, Gary Gygax in his Appendix N of the AD&D Dungeon Master’s Guide. If you’re interested, you should check out the articles in Martin Ralya’s blog tagged Reading Appendix N.

These books are weird. Compared with the The Lord of the Rings, The Wheel of Time, A Song of Ice and Fire or Malazan Book of the Fallen, these older books are short. There are sometimes short stories, collection of short stories, novellas, or little paperback books. All of Robert E. Howard’s Conan the Barbarian fit into two books of typical size for these fantasy series.

A while back, I remembered how eagerly I read all those Darkover books by Marion Zimmer Bradley and I decided to find them all second hand, in German, on Amazon, and buy them for Claudia. Every now and the she reads one of them, interspersed with some Steven Erickson and George R. R. Martin. We start talking and comparing. There are two aspects I like about these books:

  1. each book stands on its own
  2. each book only has a single plot line

Tolkien may have started this dreadful fashion of telling multiple stories at once. But in his case, at least each segment was long, very long. When I read George R. R. Martin, I feel like the author is suffering from Attention Deficit Disorder. Is every little segment ending on a cliff hanger? When I start noticing the literary devices, when I start to see the man behind the curtain, it doesn’t really work anymore. It starts to bore me. I start noticing that—like in Zeno’s paradox about Achilles being unable to overtake the turtle—as the number of segments increase, the time slot available decreases. As more stories are told in parallel, less actually happens. Plot is reduced to flashes and still images.

I am exaggerating, of course. In comparison with older books, however, I start to appreciate a tight plot, a unified vision, a drive forward. All the Conan stories stand on their own. They can be arranged in some sort of chronological order, but that’s not the important part. Similarly, the Darkover books can be read in any order. You get the occasional reward for regular readers. Older stories are referred to, but understanding this is strictly optional.

I was once again reminded of this when I read The Walrus and the Warwolf. It was published in Paizo’s Planet Stories line (now discontinued). I liked it very much. The book itself wasn’t short, but the chapters were short. The characterizations were short. Things happened. I felt that it incorporated not the best of literature, of language, of fancy words and synonyms and antonyms but it incorporated what is best in story telling. Keeping things short. Just enough words to let the reader’s imagination embellish it all without ever taking too long to read.

I’m hoping that I’ll like the other volumes in Hugh Cook’s Chronicles of an Age of Darkness series. I’ve ordered many of the volumes second hand, via Amazon. I also ordered the four books that got translated into German. Perhaps Claudia will enjoy them as well.

Tags: RSS RSS RSS RSS

January 04, 2014 11:06 PM

January 02, 2014

Alex Schroeder

Bryce Likes My Adventure

About two months ago, I submitted an adventure to Bryce Lynch’s Adventure Design Contest. And the results are in!

Bryce has nothing but kind words for my submission as far as I can tell:

This one page adventure packs the full punch that one would expect from Alex. Great NPC’s, great little encounters, all delivered in the “expanded crib notes” format that a one-page dungeon provides for. Good outline of a good adventure.
– Bryce Lynch, Contest Winners! Bryce’s 2013 Adventure Design Contest is OVER!

http://farm8.staticflickr.com/7403/11431580976_e68168577f.jpg

I’m particularly proud of the way I tried to make every word count. I wanted to keep things short and I think I succeeded when Bryce writes “Alex has a knack for coming up with exactly the right words to use to bring a maximum amount of flavor in a minimal number of words”. Yay!

Bryce also points out the major weakness of my submission: it’s very linear. I stripped some items from my original notes: two more NPCs from Uncaged: Faces of Sigil, a false lead to Hopeless, the Gatetown to the Grey Waste, … but even if I had made it a two page adventure, it wouldn’t have changed a thing because this adventure is “essentially, just the notes that many DM’s will write up before an adventure. A rough outline.”

If you ever use it, let me know. I’d love to hear about it!

Unfortunately the contest dropped off the radar pretty quickly. There weren’t too many entries, as far as I can tell. I had the same problem with the One Page Dungeon Contest in recent years. I don’t know what to do about it. When I keep blowing that trumpet, it feels like spam.

See how I subtly provided myself with the opportunity to repeat something that has been on my mind, lately? I’m not planning on running the One Page Dungeon Contest 2014. I’m looking for somebody to take over. Interested? Let me know!

I should ask Bryce to just run the 1PDC and skip the sponsors and prizes.

Update: Random Wizard has offered to run the One Page Dungeon Contest 2014!

Tags: RSS RSS

January 02, 2014 11:06 PM

January 01, 2014

Alex Schroeder

Not Planning Ahead

I’ve been enjoying a few days off and I’m having the hardest time not planning ahead like crazy. Plans change, the players decide where they will go next… and I prefer reading a book to preparing stuff that will never get used. Sometimes it’s hard to adhere to my own advice. The next adventure is good enough! :)

Tags: RSS RSS

January 01, 2014 01:46 PM

December 31, 2013

Alex Schroeder

Scanner Again

We decided to switch from the Apple Mac Mini running Mac OS 10.6.8 (since it’s such an old machine it cannot be upgraded) to Claudia’s 13” Powerbook running the latest Mac OS 10.9.1.

And, as always, the old CanoScan LiDE 25 doesn’t work. The latest drivers are for Mac OS 10.6 – yay. I found fixed : use unsupported scanner in OSX 10.9 Mavericks] which had me install some promising libs. But it didn’t work. The Printer & Scanner preference pane never found the old scanner, and on the command line I didn’t get the scanner listed.

I decided to give Homebrew a try and installed sane-backends. This required a painful and slow uninstalling of libusb and the sane-backends installed by the promising libs I had just installed.

Using the sane-backends installed by Homebrew, I can now scan from the command line. Oh well, better than nothing.

alex@Megabombus:~$ scanimage -L
device `plustek:libusb:004:002' is a Canon CanoScan LiDE25 flatbed scanner
Trace/BPT trap: 5
alex@Megabombus:~$ scanimage --device=plustek:libusb:004:002 --format=tiff --mode=color --resolution=300 -l 0 -t 0 -x 215 -y 297 > Desktop/scan.tiff
Killed: 9
alex@Megabombus:~$ open Desktop/scan.tiff 

It works. ok

Since the scanner is not supported by Image Capture, I can’t use it to scan from Gimp. sucks

The TWAIN-SANE-Interface and the SANE-Preference-Pane I installed appear to be useless. Oh well. sucks

And now that I have scanned the picture I just need to reinstall Tex Live 2013 since the migration appears to have failed. sucks

Tags: RSS RSS

December 31, 2013 01:44 PM

December 28, 2013

Alex Schroeder

Looking Back

The end of the year is always a good opportunity to look over the year’s posts—RPG posts, to be exact. The year itself started on a sad note: Fight On! is going down. The writing was already on the wall in 2012 and the adventure I had submitted for the last issue is available as a free PDF, Caverns of Slime.

But on to positive things! I tried to list the Old School Fanzines I knew, hoping to find a magazine “for me”. It’s weird. What about Fight On! Magazine made me want to contribute? What I remember best are the early levels of The Dismal Depths and the Fomalhaut material by Gabor Lux.

I still use my classic D&D character generator, for non-player characters and for character sheets on my Campaign Wiki. Some examples: Waran and Rinathil using ACKS, Stefan and Garo (this one belongs to my wife) using B/X D&D, Sir Guy (this one by a former player) and Sir Sewolt (another one belonging to my wife) using Pendragon.

Next session we will be assaulting the Barrowmaze using a party generated by drawing from a pile of random first level characters generated by this character generator. Electronic vat men!

I was looking for an alternative to creating a hex map using Inkscape (something I have been doing for my Sea of the Five Winds campaign) and so I wrote Text Mapper. I wrote a post comparing the two methods.

To be honest, however, I haven’t been using it. My Sea of the Five Winds campaigns already has a map, my Pendragon game uses the maps from the book, DM Florian uses Hexographer, DM Harald uses the maps from the book.

It felt weird to return to Red Hand of Doom. I was running it for the kids and using Labyrinth Lord instead of D&D 3.5. I enjoyed it very much. We skipped two chapters, though: no fighting the druid lich and no confronting of Tiamat’s avatar at the end. We used the mass combat rules from JB’s B/X Companion.

I wrote two one page adventures in 2013 that are based on my actual prep notes, To Rob A Witch and Sepulchre of the Clone.

That reminds me. Last spring I ran the One Page Dungeon Contest 2013 and all the posts are tagged 1PDC. I’m currently not planning to run the contest in 2014. Do you know anybody who would like to do it? I wrote How To Run A Contest to help you get started.

I also discontinued the Old School RPG Planet. If you’re willing to do the actual leg work of asking people to submit their sites, talking to bloggers, answering questions, I could set it up again. I am willing to handle the technical aspects of it. I just don’t want to deal with angry dudes on the Internet.

But on to more positive things again!

I still use my Spell Book Notation. That’s because I use a strict reading of the magic system such that elves and magic-users have a repertoire equivalent to their spells per day (to use the Adventure Conqueror King System terminology) and neither elves nor magic-users can copy spells from scrolls and spell books.

In my campaign this means that all the elves of a particular elf settlement will have a subset of the spells available to the elf lord. What I do is this: I write down the elf lord’s spell book using the notation above and whenever we meet a minion of a particular level, it’s easy to figure out which spells they have available by looking at the second column.

In a similar vein, I wrote about using 1d20 instead of 2d6 for dungeon stocking. As it turns out, however, I do this so rarely that I keep forgetting about it. I just don’t run enough dungeon adventures.

Still in the same vein, I was also comparing old school dungeon stocking to other methods of adventure location creation and found the traditional way of doing things to be very quick and the result just as good as the new ways. I’m a gaming traditionalist at heart, I guess.

I thought about using skills inspired by Apocalypse World in my games but ended up not doing it. DM Harald does it in his campaign, but I remain sceptical.

I wrote a bit about running the game. There was a post on my session preparation process for old school games, how to run Fate, how to run settlements in sandbox campaigns, how to let players introduce facts into your traditional campaign, how to use treasure, group initiative and when to roll.

In addition to that, I quoted a Google+ comment by Ian Borchardt on wilderness encounters and a comment by Kevin Crawford on urban campaigns.

And with that, here’s to the blogs, conversations with strangers on the Internet, and freedom, justice and peace for us all.

Tags: RSS RSS

December 28, 2013 03:57 PM

December 23, 2013

Alex Schroeder

Verfolgungsjagd

Gerade machte ich mir wieder Gedanken über Verfolgungsjagden für meine Helme & Hellebarden Regeln. Die komische Tabelle bei Labyrinth Lord und Basic D&D kann ich mir nicht merken. Da erinnerte ich mich an Skills bei Apocalypse World und machte mich an eine 2W6 Tabelle, die von Erin Smales Kommentar auf meinen Google+ Artikel inspiriert ist.

Verfolgungsjagd: Wer verfolgt wird, muss 2W6 würfeln. Bei 2 haben die Häscher euch überrascht. Bei 3–6 kommt es zum Kampf. Bei 7–9 wähle zwei Punkte, bei 10+ wähle drei Punkte aus der nachfolgenden Liste.

  • ihr konntet zusammen bleiben
  • es ging schnell
  • ihr wisst, wo ihr seid
  • ihr habt Schilde und Rucksäcke noch

Optionale Modifikatoren: Je +1 für die Gejagten, falls es doppelt so viele Verfolger gibt, für eine höhere Bewegungsrate, für Schilde fallen lassen, für Rücksäcke fallen lassen, wenn ein Dieb dabei ist, bei Regen, bei Dunkelheit. Je -1 für die Gejagten, falls ein Elf oder ein Jäger bei den Häschern ist, mit Verwundeten, bei Schnee.

Vincent Baker verwendet in Apocalypse World selber ja keine Modifikatoren für die Moves. Ich vermute, das wird bei mir ähnlich sein. Vielleicht sollte ich noch hinzufügen, dass man bei 12+ einfach entkommt.

Tags: RSS

December 23, 2013 10:43 PM

December 22, 2013

Alex Schroeder

Sepulchre of the Clone

Notes for a session:

http://farm6.staticflickr.com/5490/11496306215_551ae29c81.jpg

As you can see, the magic user was not yet a high-level Vivimancer when I ran the adventure. I had to push him up to 15 if I wanted the clone to be based on the actual spell-casting ability of the dude. At the time I justified the clone with rituals and machinery… You might also notice the notes on snow apes, rocket men and shark men. Indeed, I ran this as the tower in the middle of the lake of The Forgotten Depths.

At the time the baboons were “blood monkeys” and the player characters forced one of them to cross the blue room and mash buttons. They didn’t realize that this would revive the clone and once they monkey came back, they killed it. Cruel!

They stole the clone’s spell book and still befriended the clone (who didn’t know that it was they that had stolen the book). Once befriended, they decided to “help” him retrieve his spell book and “hunt” for the blood monkeys that must have done it. And strangely enough they soon found it “in the forest”. All is well that ends well, I guess.

In my game, the clone wasn’t a Vivimancer but a Polymorpher. The spell selection for Vivimancers is cooler, though. It explains the dense plant life, the mushrooms, the degenerate humans, the intelligent monkeys, the minotaurs, and so on.

Resulting second draft:

Sepulchre of the Clone.pdf

It still needs some proof reading. The idea is to submit this for Gavin Norman’s upcoming Vivimancer Supplement. Today I learned that a one page adventure for A5 paper is harder than it looks. :)

The strange “polymorph other into human for a limited time span” is magic item I wanted to keep. I felt that perhaps a player would be able to take advantage of it, or maybe they’d feel like dismantling it and taking it on to their own ship. They never did, however.

Tags: RSS RSS

December 22, 2013 02:35 PM

December 19, 2013

Alex Schroeder

Über die Bildung

A note to English readers: If this post showed up in your feed, you should probably switch to a different feed. Some suggestions: RPG only, just English.

In der WOZ las ich gerade Wer profitiert von der Uni im Netz? Was als gratis Bildung im Netz für alle begann, wird nun zum Werkzeug für Einsparungen an den Universitäten und damit für die Verschlechterung der nicht kommerzialisierbaren Eigenschaften des Studentenlebens: interessante Komillitonen, Politisierung, Engagement…

Auch für die Entwicklungshilfe hat man sich Unis am Netz gewünscht. Bezeichnend fand ich diese Passage:

Wie eine Studie der Universität Pennsylvania kürzlich nachwies, gehören achtzig Prozent der KursteilnehmerInnen auf der Plattform Coursera aus Ländern wie China, Indien oder Brasilien zu den Reichsten und am besten Ausgebildeten ihres Landes.

Die Zahlen zeigen ausserdem: Regelmässig schliessen weniger als zehn Prozent aller ursprünglich Eingeschriebenen einen MOOC ab – und nur rund die Hälfte davon erfüllt dabei auch die notwendigen Anforderungen für ein Zertifikat

Ich bin mir nicht sicher, wie das zu verstehen ist. Auch hier in der Schweiz gehen Kinder von Akademikern tendenziell eher studieren. Auch hier beenden sehr viele ihr Studium frühzeitig, fallen durch, wechseln… Jeder, der schon einmal online etwas organisiert hat, weiss, dass die Hemmschwellen für das nichts tun und das zu spät kommen weg fallen.

Grundsätzlich kann man vielleicht nur sagen, dass die Zahlen auf alle Fälle zeigen, dass Unis am Netz für viele Probleme keine Lösung sein können. Es ist schwieriger. Dies muss man wissen, auch wenn die Technologiegläubigkeit und der Optimismus unter den Verantwortlichen nicht erstaunen.

Wer sich noch nie mit online Kursen beschäftigt hat, kann sich ja mal die Khan Academy anschauen. “Learn for free about math, art, computer programming, economics, physics, chemistry, biology, medicine, finance, history, and more.” Tönt gut!

Hierzu habe ich zufälligerweise gerade auf Google den Artikel Comcast, Khan Academy Aim Multimillion-Dollar Partnership At Low-Income Families gesehen. Dort spricht Kahn das selbe Problem an. Die Mittleklasse nutzt die Angebote, die sie der ganzen Welt anbieten will, auch selber, und so bleiben die alten Strukturen erhalten.

Vermutlich ist es schwierig, den Armen zu helfen, sich selber zu helfen, ohne ihnen etwas zu geben. Umverteilung, Mindestlöhne, eine Reduktion der Wohlstandsschere scheinen mir langfristig bessere Massnahmen.

Was natürlich nichts daran ändert, dass ich Khan Academy ähnlich gut finde wie Wikipedia. Mehr Wissen, mehr Bildung! Dies allerdings als Entwicklungshilfe zu verkaufen, ist – wie gesagt – Technologiegläubigkeit und überzogener Optimismus.

Tags: RSS

December 19, 2013 07:36 AM

December 17, 2013

Alex Schroeder

PDF Button

I’m experimenting with a PDF button for this website. In the past, I suggested Print Friendly & PDF. Yesterday I learned about wkhtmltopdf, which does the same thing without depending on a remote service and their ad revenue. On a typical Debian host, you need to apt-get install wkhtmltopdf. This installs a binary and all the required libraries. The problem is that this version needs an X11 server in order to work, which you don’t have when using it on your website. In addition to a regular installation, you need to install a statically compiled binary which has been compiled with a patched version of Qt and no longer requires an X11 server.

In your Oddmuse config file:

$Action{pdf} = \&DoPdf;
push(@KnownLocks, 'pdf');

sub DoPdf {
  my $id = shift;
  RequestLockDir('pdf');
  local $StyleSheet = 'http://alexschroeder.ch/alex-2012.css';
  my $html = PageHtml($id);
  my $source = "$TempDir/document.html";
  my $status = '500 INTERNAL SERVER ERROR';
  open(HTML, '>:utf8', $source)
    or ReportError("Cannot write $source: $!", $status);
  # see GetHeader
  print HTML GetHtmlHeader(NormalToFree($id), $id);
  print HTML $q->start_div({-class=>'header'});
  print HTML $q->h1({-style=>'font-size: x-large'}, GetPageLink($id));
  print HTML $q->end_div(); # header
  print HTML $q->start_div({-class=>'wrapper'});
  # get rid of letter-spacing
  my $sperrung = '<em style="font-style: normal; letter-spacing: 0.125em; padding-left: 0.125em;">';
  $html =~ s/$sperrung/<em>/g;
  my $newthought = '<em style="font-style: normal; font-variant:small-caps; letter-spacing: 0.125em;">';
  $html =~ s/$newthought/<em style="font-style: normal; font-variant:small-caps">/g;
  print HTML $html;
  # see PrintFooter
  print HTML $q->end_div(); # wrapper
  print HTML $q->start_div({-style=>'font-size: smaller; '});
  print HTML $q->hr();
  print HTML $FooterNote;
  # see DoContrib
  SetParam('rcidonly', $id);
  SetParam('all', 1);
  my %contrib = ();
  for my $line (GetRcLines(1)) {
    my ($ts, $pagename, $minor, $summary, $host, $username) = @$line;
    $contrib{$username}++ if $username;
  }
  print HTML $q->p(Ts('Authors: %s',
                      join(', ', map { GetPageLink($_) }
                           sort(keys %contrib))));
  print HTML $q->end_div(); # footer
  print HTML $q->end_html;
  print HTML "\n";
  close(HTML);
  my $target = "$TempDir/document.pdf";
  my $error = `/home/alex/bin/wkhtmltopdf --print-media-type --quiet '$source' '$target'`;
  ReportError("The conversion of HTML to PDF failed", $status) if $error;
  open(PDF, '<:raw', $target) or ReportError("Cannot read $target: $!", $status);
  local $/ = undef;
  my $pdf = <PDF>;
  close(PDF);
  ReportError("$target is empty", $status) unless $pdf;
  binmode(STDOUT, ':raw');
  print GetHttpHeader('application/pdf');
  print $pdf;
  ReleaseLockDir('pdf');
}

sub PrintMyContent {
  my $id = UrlEncode(shift);
  if ($id and $IndexHash{$id}) {
print qq{
<form action="$FullUrl"><p>
<input type="hidden" name="action" value="pdf" />
<input type="hidden" name="id" value="$id" />
<input type="submit" value="PDF" />
</p></form>
}
  }
};

Let me know if it works for you while I try to figure out whether I need this at all. The position of the PDF button at the very bottom of the page is probably less than ideal.

As you can tell, the markup using increased Wikipedia:letter-spacing is messing it all up, which is why I had to fix it.

Tags: RSS

December 17, 2013 11:45 AM

December 13, 2013

Alex Schroeder

Session Preparation Process

Over on The Rusty Battle Axe the author says “Megadungeons were all the rage in the tabletop RPG blogsphere back in 2008-2009. There are plenty of posts on megadungeon dating back to the period.”

I still haven’t run a Megadungeon, even though I have bought several: Stonehell, Rappan Athuk (twice), Castle Whiterock, Tomb of Abysthor, … I feel like I would like big dungeons. When I prep for my games, however, that’s not how it works.

If you look at my Swiss Referee Style Manual you’ll note that it is practically without advice for dungeon adventures. That’s because my dungeons are small. Usually they are one page dungeons. How come? When I prepare a game, I usually start from the answers I got at the end of the last session. I almost always end by asking: “So, what are we going to do next time?”

I write down the relevant non-player characters: people to meet, people to oppose, people with jobs to hand out, with quests that need resolving. I usually end up with one to four characters.

The bad guys are usually in a defensible position so I prepare spells, minions, rooms, a map… a one page dungeon, a ship deck plan or a village with a few important buildings (in which case I won’t prepare floor plans for the buildings). I usually end up with four or five buildings or ten to twenty rooms, a sketch of a map.

I think of complications. This is usually something that works in layers. Every two or three days I have a lame idea that I mentally add to the adventure. After two weeks, however, five lame ideas make a cool complication. I usually don’t think of a solution. The gargoyles want the player characters to leave, consider themselves to be /Übermenschen/… The elves are petriefied by a gorgon bull and the players have neither the saves nor the spells to survive a direct encounter. As it turns out they managed to get the gargoyles to accept their commands and the gargoyles brought all the petrified elves to the survace.

I think of rewards. I usually start by rolling on the appropriate treasure tables and embellish the magic items, if any. A armor +1 and shield +1 turn into the golden halfling armor of Priamus Bullfighter who disappeared 21 years ago from Elfenburg. The sword +1 turns into the blade of the herring knight, smells of fish allows the wearer to feel how far away the next air bubble is… I make a mental note to add the remaining equipment of said knight to the dungeon or future adventures… If my players decide to follow up I will place his city or temple on the map, and add the protector saint of all fish, and his paladins, and their special abilities, and there will be rescue missions, and favors to be granted…

Working iteratively is important for my process. I try to pull in non-player characters from very old sessions. Wespenherz, the new hireling, is an elf that they had rescued from bad guys in a previous campaign up in the north. This ring they just found was forged by Qwaar the Axiomatic and didn’t Muschelglanz write a book about the rings of Qwaar? Yes he did and as far as he know he had decided to investigate the Barrowmaze and never returned… It gives depth to the campaign, some players remember and start digging through the campaign wiki, older players explain newer players what happened back then, … I love it!

This sort of thing doesn’t come easy. As I said, every two or three days I have a lame idea, but after two weeks I’ve had enough lame ideas that together they make the game better. Much better.

The process also shows why it’s hard to integrate megadungeons. When I look at them, I want to skim them for interesting non-player characters my players would want to contact, for prison cells my players would want to rescue interesting non-player characters from, for interesting rewards my players might want to be looking for. And that’s so damn hard.

I still remember placing the Barrowmaze in my campaign and having an important non-player character flee towards it. I was using Nualia, an evil fighter with an evil sword from a Pathfinder adventure and decided that her dad was a priest of Nergal who lived in the Barrowmaze and was involved in the power struggle. Then I had an evil authority person from Kerealia fleeing towards the Barrowmaze because the players had ousted him. The dungeon itself was ok, not overwhelming. We rescued a dwarf from a pit and he’s still with us.

Once the players fell into a bottomless pit and dropped into the astral sea, they never had the urge to return, hower. Having Muschelglanz disappear in the Barrowmaze is my new attempt at letting the Barrowmaze play a role in my campaign. It hasn’t managed to make itself important. I was unable to find or emphasize anything in the megadungeon itself that would motivate my players to return again and again.

The reason I thought of using the Barrowmaze again was that one player decided to offer a reward for the return of Muschelglanz. I proposed to my players to play a random party of first level dudes trying to claim this reward by going into the Barrowmaze and finding Muschelglanz. They liked the idea so that’s what we’re going to do.

When I started preparing for the next session, I did what I usually do. I looked for cells to put him in. I looked for the headquarter of a faction that held him prisoner. I tried to find the important non-player characters and I tried to find a thing that Muschelglanz might have been looking for. I know that there is supposed to be a tablet somewhere. But everyhing else has been tricky. I really need to skim it again. Gaaah.

Now you know what I would appreciate in a megadungeon. Just in case you’re writing a megadungeon. :)

Tags: RSS RSS RSS

December 13, 2013 09:59 AM

December 12, 2013

Alex Schroeder

Treasure for an Elven Sorceress

My players finally returned to the Elfenburg, the halfling village at the most beautiful waterfall of the Wilderlands of High Fantasy. I had previously established that the village was built around a green glass tower which was later found to have been built by elves, and down in the dungeon there was a room with 86 petrified elves and a gorgon bull (the kind with petrifying breath). The story was this: The elven sorceress used earth magic to erect the glass tower. Something poisoned the earth blood and caused the building to turn evil. The sorceress decides that she needs to boost her spell casting power and leaves, looking for a power-up.

Since elves cannot reach the level necessary to cast stone to flesh I decided that all this stone magic had to be based on long and elaborate rituals. The sorceress decided that the Aakom of Qelong would do and disappears. Before leaving, however, she decides to use the gorgon bull to petrify her people “for storage” and to keep them safe against the ravages of time. I occasionally force myself to make elves strange and alien. Before she does that, one of the elves decides to leave a note basically explaining the situation and asking for help “just in case the sorceress doesn’t return”.

The party does eventually find the sorceress and she—having partaken of way too much Aakom and on the way to immortality—has more or less forgotten about her people. She gives the party 50 scrolls of stone to flesh and a magic ring with which to claim her glass tower as their own because she couldn’t care less. Another attempt of mine to make elves and immortals alien and basically indifferent to human concerns.

The party returns, depetrifies half the elves, they are grateful, some setting background is revealed, the elves join the party’s domain (since we’re using An Echo Resounding), and so on.

I was left with the question of treasure. What to do? I had already decided that the sorceress’ many books had been carried off by a floating, round monster…

This is cool, because now I have more plot hooks for future adventures:

  1. the earth blood is still poisoned and it would seem that looking for the Tomb of Abysthor would make a nice follow-up adventure
  2. the other half of the elven tribe is still petrified so if we feel like doing an all-elven road-trip adventure on the side, we can always sail for Tula and its School of Chromatic Magic and find a high-level human magic-user to get some scrolls
  3. if we want to challenge the high level player characters we can always go and hunt for the notes on the various rituals used to build the living glass tower
  4. the elves told the party what it would take to revive the dead elven god Arden… one my the player characters is very interested in this particular plot line…

I decided that the only treasure to be found beyond ownership of the tower and the service of the elves was the wardrobe of the sorceress.

  1. an anti-gravity shawl made of the finest silk, floating freely in the air
  2. a spectacular white and cyan dress of air and sky, constantly trailing clouds and having occasional blinding spots of sunlight
  3. a dark sea green dress of the deep, a magic train of illusionary ocean following the wearer
  4. a brown dress of stone and metal, of crystals growing from your back and spikes growing from your shoulders, a golem dress of enchanted earth

The room being a giant loft under a fortified glass dome in art nouveau style, guarded by ten nearly invisible glass tentacles to prevent unauthorized landing (as long as the earth blood is poisoned these tentacles are evil and attack everybody), a random distribution of little mirrors such that there is one exact spot near the wardrobe where all the mirrors align giving you a perfect view or yourself…

My wife loved it. :)

But is it treasure? I’m not sure. I don’t plan on granting simple mechanical benefits. I do plan on it impressing and awing the common folks, if my players ever want to use it like that. Or of granting boons with other elf lords if given away as a present. I also didn’t plan on giving it monetary value and therefore not granting any XP. My players seemed happy enough. If I wanted to award some XP I’d probably say that the four items I listed could be sold for 10,000 gold pieces each for a grand total of 40,000 XP. Except that my players got to the end of a different story arc last session and ended up with 171,000 gold pieces (this included the sale of a Neogi spelljammer ship and the treasure of its captain) and the part about the elven sorceress and her tower was essentially dénouement. That’s why it didn’t grant any gold or XP.

Tags: RSS

December 12, 2013 10:37 AM

December 10, 2013

Alex Schroeder

Writing Your Own RPG Rules

I started thinking about it when Johnn Four said on Google+ that he was interested in designing his “own little OSR game”. Like Joseph Bloch, I wondered. It doesn’t sound like Johnn really wants to run and play an OSR game. He’s just interested in designing the rules? There are already so many of them out there! All these Fantasy Heartbreakers…

What is a Fantasy Heartbreaker? I learned about the term from Ron Edward’s essay. They are “truly impressive in terms of the drive, commitment, and personal joy that’s evident in both their existence and in their details” and “but a single creative step from their source: old-style D&D.” Since I like classic D&D, that’s not a problem for me.

Here’s how Ron ends his essay:

They designed their games through enjoyment of actual play, and they published them through hopes of reaching like-minded practitioners. […] Sure, I expect tons of groan-moments as some permutation of an imitative system, or some overwhelming and unnecessary assumption, interferes with play. But those nuggets of innovation, on the other hand, might penetrate our minds, via play, in a way that prompts further insight.

Let’s play them. My personal picks are Dawnfire and Forge: Out of Chaos, but yours might be different. I say, grab a Heartbreaker and play it, and write about it. Find the nuggets, practice some comparative criticism, think historically.

Get your heart broken with me.

This essay, I think, mentions all the important parts:

  • actual play is the basis for your game
  • publish it in the hopes of reaching like-minded gamers
  • make sure to strip all the material that you aren’t using yourself
  • focus on the innovations

I also like to read the design decisions somewhere, on a blog for the game, perhaps. Why add skills? Why drop Vancian magic? Why drop descending armor class? Why use fewer saving throws? Why add bennies? Why rework encumbrance?

As for myself, I’m basically using Labyrinth Lord. I’ve been thinking about skills, magic, spells, armor class, saving throws, bennies, and writing about these issues on this blog. And as I’ve said on Johnn’s post: “I just kept running my game and started putting my house rules on a wiki. Then I copied the missing elements from the book. Then I put it all into a LaTeX document. And I keep running my game and I keep making changes to the rules. And that’s it.”

For a while I had an English and a German copy of these rules on a wiki. After a while I abandoned the wiki and the English rules and moved the German text to LaTeX.

I think the important part was thinking about the rules, writing about the rules, changing the rules, reassembling the rules, having something to show others, a place to collect the house rules… and with all that achieved, there’s just nothing to do but make the occasional update. I’m not trying to convince anybody else to use the rules. But if you’re looking for something a bit different, perhaps you can find “those nuggets of innovation” in my rules, too. :)

• 💔 •

What are those those nuggets of innovation you ask? I think the only thing that’s truly new is how I write the document making full use of a sidebar to comment the main text. And I keep track of my player’s reputation with the various gods of the setting. Everything else I have seen somewhere else: Death & Dismemberment, using 1d6 for thief skills, using a d30 once a night, using 1d6 for weapon damage, limiting the repertoire of arcane casters… Nothing new under the sun. But I’d be happy to pontificate talk about all these points.

Tags: RSS RSS

December 10, 2013 02:07 PM

December 08, 2013

Phil Jones (Smart Disorganized)

Leaving Blogger

Part #232 of the ongoing evolution of my online life. I am migrating Smart Disorganized from Blogger to a WP blog on one of my own domains. In this case the new URL is going to be : http://sdi.thoughtstorms.info/. That's Smart Disorganized Individuals at ThoughtStorms. Makes sense because ThoughtStorms is the domain name for my wiki, the Project ThoughtStorms activity around the SFW. And now for OWL, the Outliner with Wiki Linking.
It's all part of a greater, if very slowly executed, plan.

by noreply@blogger.com (phil jones) at December 08, 2013 08:38 PM

Alex Schroeder

Old School RPG Planet Going Down

Recently John Payne talked about distributing RSS feeds in eBook form on Google+. Interesting idea, and the resulting discussion of copyright and feed aggregation soon touched upon the Old School RPG Planet. Ian Borchardt correctly said “Just because the authors post their work to the web doesn’t mean they forfeit their copyright. If you collect this work into another form, you are violating their copyright.” Andy Standfield replied “This has all already been covered by many courts and legal experts. This is all considered fair use.”

I started to wonder. Many courts? I decided to google for some more information and found What’s the law around aggregating news online? A Harvard Law report on the risks and the best practices. This 2010 article said that all the parties settled before a finding was made. In the US, that would mean we don’t really know. The article also has a longer section about the Fair Use test and how to apply it. In addition to that, the situation would be different outside the US – possibly more restrictive here in Switzerland, for example.

Drinking my coffee I thought about it some more and finally decided to take the Old School RPG Planet offline. I wasn’t really using it anymore and I really dislike the idea of further discussions with annoyed blog authors. I also didn’t feel like contacting a hundred bloggers, most of whom don’t have their email address on the front page of their blog. The site should now redirect to the Legacy D&D section of the RPG Bloggers Network. It supposedly does more or less the same thing, except that the authors have to register their own sites. Too bad the RPG Blog Alliance doesn’t have categories.

Tags: RSS RSS

December 08, 2013 10:05 AM

December 06, 2013

Alex Schroeder

Organizing PDFs

I recently visited RPG Now and decided to visit the list of updated PDFs. Unspeakable rites of the ancients—that many!? I think the reason I have so many PDFs is that I bought two bundles for a fistful of dollars destined to help charities years ago. I went through the list and only downloaded the products I felt I was interested in. I skipped Pathfinder products. I skipped paper miniatures. I skipped floor plans. So many things that I’d love to have, but there is just not enough time! I clicked on Traveller stuff, Fate stuff, OSR stuff like Sine Nomine, Labyrinth Lord, Dungeon Crawl Classics (DCC), and since I can never download more than ten files, and since I cannot automatically deselect all the files I selected for download I manually deselected the ten entries I just downloaded, selected another ten entries, downloaded, downloaded—I downloaded 77 updated files.

Wow. We are definitely living in plentiful times.

So now I had eight zip files in my download folder and I realized another problem: There’s a folder on my external disk for RPG PDFs and its directory hierarchy is multiple levels deep. Dungeons & Dragons or Pendragon? TSR or Frog God Games? Basic D&D accessory or module? Sorting all the PDFs into the folders is driving me nuts.

And what’s worse: my iPad has a PDF reader (Good Reader) with it’s own, separate copy of a subset of these files. And in my idiocy I used a different directory structure on the iPad.

So now I need to figure out what to do, and how to keep the two in sync without my Repeated Strain Injury flaring up.

Tags: RSS

December 06, 2013 07:49 AM

December 02, 2013

Alex Schroeder

New Creative Commons Licenses

Creative Commons Licenses Version 4.0 November 25, 2013. Creative Commons released 4.0 versions of their licenses. Yeah! More info on their blog.

Cory Doctorow says the following on BoingBoing, which is where I learned about the new versions:

The new licenses represent a significant improvement over earlier versions. They work in over 60 jurisdictions out of the box, without having to choose different versions depending on which country you’re in; they’re more clearly worded; they eliminate confusion over jurisdiction-specific rights like the European database right and moral rights. They clarify how license users are meant to attribute the works they use; provide for anonymity in license use; and give license users a 30 day window to correct violations, making enforcement simpler. Amazingly, they’re also shorter than the previous licenses, and easier to read, to boot.

I must say, I was always a bit annoyed when I saw the local versions of Creative Commons licenses. What does it mean for me, when I live in Switzerland, host stuff in the US, and said stuff is based on the Canadian port of the license? The FAQ now says: “Unless you have a specific reason to use a ported license, we suggest you consider using one of the international licenses.” ok

I also often wondered about additional rights we have here in Europe. For example, I might allow you to make copies of my face, but I can still control the use of said copies here in Switzerland using my “personality” rights. The blog post announcing the 4.0 versions of the licenses now says: “Where the licensor has publicity, personality, or privacy rights that may affect your ability to use the material as the license intends, the licensor agrees to waive or not assert those rights.” ok

Tags: RSS

December 02, 2013 11:04 AM

December 01, 2013

Alex Schroeder

Anonymizing the Oddmuse log files

I’ve just implemented a new non-optional Oddmuse feature. I’m removing all hostnames and IP numbers of older log entries. The log entries older than 90 days are stored in a different log file in order to speed up the generation of RecentChanges. During maintenance, these log entries are copied from one file to the other and I’m now taking advantage of this copying to remove the hostname or IP number.

Basically I find that as a person, I dislike invasions of privacy and I feel that in some small form, software engineers are inviting it because often it’s easier to do. We often model things to never forget, e.g. version control.

One of the important pages on Meatball was ForgiveAndForget. Forgetting is human.

At the same time, with Snowden and the NSA, I feel that as a hoster I’m more comfortable if I cannot provide the logs an agency is looking for.

Furthermore, I’ve had a very small number of emails from users asking me to remove their hostnames from the log files because they had accidentally edited the wiki from work. Pages containing their hostname will eventually be deleted but log entries were not. Now they’re anonymized and people can feel safer knowing that the traces will eventually disappear again.

The idea is that you would only need hostnames or IP numbers to fight spam and vandalism: Add regular expressions matching either hostname or IP number of spammers or vandals to your list of banned hosts and prevent the attack from continuing. After a few days, however, this information is no longer required. In this day and age of privacy invasion, I think software should take a pro-active stance. The log entries must be anonymized.

The existing log file for the older entries is not changed. If you want to do the right thing, there’s a script called anonymize.pl in the contrib directory to do just that.

Just call it in your data directory. Example:

alex@psithyrus:~/oddmuse$ perl ~/src/oddmuse/contrib/anonymize.pl 
Wrote anonymized 'oldrc.log'.
Saved a backup as 'oldrc.log~'

See Oddmuse:Upgrading Issues for a more technical explanation of what’s going on.

Tags: RSS RSS RSS

December 01, 2013 12:14 AM

November 26, 2013

Alex Schroeder

Wilderness Encounters

Ian Borchardt recently wrote a lengthy comment in reply to Andy Standfield’s Google+ post about determining CR/EL for monsters. He allowed me to repost it and all he asked for was me mentioning “that it was a G+ comment and therefore not a literary masterpiece – more a stream of thought.” Slightly edited.

When creating a wilderness encounter table for a sandbox game don’t bother with the details. Work out the likelihood of an encounter with creatures that feels right to you and use common sense in the application of the results. Encounters shouldn’t be in “balance” with the party.

Remember that in a sandbox game, an encounter does not actually mean that the characters have an immediate direct combat encounter with the creature. For example, a party of 1st level characters are travelling through the wilderness and you roll up an ancient blue dragon. Instant party death. right?

No. Have them encounter the dragon on the wing, hunting food. The party won’t have enough meat, magic or gold to be worth the dragon’s bother so it will probably keep on the wing. Meanwhile the characters have definitely encountered a blue dragon and can relish the magnificence of the fantasy encounter (or more likely the terror as they huddle under a tree hoping the dragon hasn’t seen them [“Ha!”] and won’t eat them).

But what’s the benefit of this encounter that wasn’t, you may ask? I’m glad you did! The party now know that there might be a lair of ancient blue dragon somewhere in the vicinity (and by that I mean easy flight range) if you are in the wilderness. They might remember this for later, once they are powerful enough to feel they have a good chance of adding dragon slayer to their resume. But in the meantime the presence of the dragon is going to colour the region through which they are travelling. For example any herds in settlements are going to be small to avoid being a tempting target. Towns might even have an arrangement with the dragon were suitable “princesses” are offered up for sacrifice – and they might actually prefer visitors to one of their own daughters. The dragon might even need a set of human hands and be looking for a set of adventurers to do a task for them. Whilst a threat works everyone knows adventurers are mercenaries and will do anything (even kill) for filthy coin.

Ed Simbalist (one of the authors of Chivalry & Sorcery) wrote an excellent essay back in the day (1978): Monsters are people too which really is recommended reading [C&S Companion – hard to get though now]. Monsters aren’t there as adventurer bait, but usually doing their own thing. Role-playing should be important for the monsters as well. For example, the party is at camp roasting a deer they shot earlier in the day, when they “encounter” a goblin patrol. Certainly this could devolve into a fight but what if the reaction roll is friendly? Perhaps the goblin patrol is actually lost and their leader doesn’t want to admit it (but pretty soon his troops, tired and hungry, are going to revolt). And that roasting leg of deer smells sooooo good. Perhaps they can bluff a tax for travelling through “their” lands. Except the people around the fire seem to be rather hard-bitten warriors rather than peasants and are not likely to be particularly surprised or overawed by a mosquito-bitten goblin troop? You now have a role-playing opportunity – never underestimate the benefit of intelligence (in the scouting rather than goblin’s lack of sense) and making friends. Even with goblins.

That’s all up to how you apply the encounters you generate. But there is still the important part of the players reaction to encounters. And that is to use reason. The sandbox game, unlike the heroic story-path game, isn’t there in the world for them. It’s a living breathing world without them, and the encounter table should realise that. At times they are going to encounter stuff that is too tough for them to beat, in which case running away is an important alternative that often seems to be forgotten by a lot of modern players that think the world must be all about them.

Special small regional encounter tables are a good thing too, although they often develop in play – for example one region I kept on rolling dwarves, which lead to the fact that there was a big mining boom going on here, so the regional chart got created with a lot of dwarvish and mining aspects. Including an encounter of gold nuggets in a creek bed. As our different encounter tables for civilised, frontier, and wilderness areas. And don’t forget all the non-monster encounters. For example, encountering an army off to war leads to “you have been recruited” or even “your horses have been recruited – here’s a chit for them (accompanied by the soldiers laughter as they lead your food and horses away)”. And affect the surrounding game. Good sets of encounter tables drive a sandbox game by presenting stuff. Also a good idea is to have a set of unique encounters on file cards. This could be stuff like villages, big monsters in lairs, and the like. When a “unique” encounter is rolled, shuffle and pull a card. That encounter is now there. Replace and top up these file cards occasionally, and remember to keep track of where the used ones were used.

Good stuff.

My own take on wilderness encounters can be found in my Swiss Referee Style Manual.

Tags: RSS RSS RSS

November 26, 2013 06:53 AM

Downtime

My websites are hosted on a virtual machine called psithyrus. It was down for many hours and it just came up again. I don’t know what happened. One moment I’m reading mail and nearly two days later it’s rebooting.

Nov 24 04:50:05 psithyrus dovecot: imap(alex): Disconnected: Logged out in=34 out=674
Nov 26 01:27:16 psithyrus kernel: imklog 5.8.11, log source = /proc/kmsg started.

Most of the sites are not terribly important—such as this wiki blog of mine—but I feel bad for the Campaign Wiki users. :(

Tags: RSS

November 26, 2013 06:35 AM

November 25, 2013

Phil Jones (Smart Disorganized)

How GitHub (no longer) Works

Very interesting talk from GitHub's Zach Holman on how the company's decentralized culture is evolving as it grows.

by noreply@blogger.com (phil jones) at November 25, 2013 09:33 PM

November 23, 2013

Alex Schroeder

Über den Konsum

A note to English readers: If this post showed up in your feed, you should probably switch to a different feed. Some suggestions: RPG only, just English.

Wir sind umringt von Werbung. Verlockende Angebote überall: neue Telefone, neue Spiele, neue Kleider, neue Filme, neue Möbel, neue Musik, Sonderangebote, Sparen beim Kaufen. Der Konsum stützt die Wirtschaft, die Wirtschaft bietet Arbeit, die Arbeit bietet Geld, das Geld ermöglicht den Konsum. So verheizen wir die Umwelt. Deswegen arbeiten wir in den reichsten Ländern der Welt nicht fünfzehn Stunden die Woche sondern vierzig, fünfzig, oder sechzig Stunden die Woche.

Warum sollten wir ausbrechen wollen? Und wenn man ausbrechen wollte, wo hin? Wo bleibt die viele Freizeit, welche uns der Produktivitätgewinn eigentlich ermöglichen sollte? Das Problem ist, dass wir nicht auf dem Niveau unserer Grosseltern leben wollen. Ich will auch nicht in einem kommunistischen Land leben, dass mich zur Armut zwingt. Ich will mir meinen Konsum nicht verbieten lassen.

Der stete Kampf gegen die Verlockungen des Konsums ist die Herausforderung unserer Zeit. Jeder für sich kann die Konsumgesellschaft etwas kleiner und die Freizeitgesellschaft etwas grösser machen. Es geht darum, selektiv zu konsumieren statt mehr zu arbeiten. Ich mache schöne Ferien und kaufe mir ein iPad, verzichte aber auf das Haus im Grünen und ein Auto. Ich gehe gerne auswärts Essen, kaufe mir aber keinen neuen Fernseher, keine neue Spielkonsole, keine neue Sportausrüstung.

Ich will die Werbung nicht sehen. Ich will im Laden nicht am Regal mit all den leckeren Keksen und der guten Schokolade vorbeilaufen, weil ich in meinem Alter anfange anzusetzen. Als wir jünger waren, haben wir jede Woche eine Schachtel Eis gekauft. Damit ist jetzt leider Schluss. Genau so wenig will ich Berichte über die neusten Spiele lesen, über die neuste wetterfeste Wanderausrüstung, über die neusten Fahrräder, über die exklusiven Ferien, die schönen Stoffe für neue Bettwäsche, die Teetassen und Pfannen, die Computer und Kameras. Ich will wegschauen. Ich muss wegschauen. Meine Antwort auf die ständige Werbung ist Konsumverweigerung.

Als ich im Geschäft einmal gefragt wurde, warum ich nur 60% arbeiten wolle, gab ich zur Antwort, ich tue dies für mein Liebesleben. Meine grösste Angst war schon immer, viel zu Arbeiten, eine Karriere zu machen und dann früh zu sterben, ohne die Früchte meiner Arbeit je genossen zu haben. Ich wollte auf alle Fälle nicht einer von denen sein, der seine Beziehung auf dem Altar der Arbeit opfert. Wenn eine Karriere sich nur für einen hohen Preis erringen lässt, dann lasse ich es lieber sein, trete kürzer, bleibe in der kleinen Wohnung und träume vom schönen Regal aus Massivholz, das ich mir nicht leisten will.

Als ich nach weiterführenden Links gegoogelt habe, fand ich diesen Artikel von Beat Döbeli, der sich vor zwei Wochen zum ebenfalls Gedanken machte: Was machen wir mit den Automatisierungsgewinnen?

Kristian Köhntopp empfiehlt Land of Desire von William R. Leach (2012).

Unheimlicherweise gibt es ein Foto von mir und Beat Döbeli von Eugene. Ich bin verblüfft.

Tags: RSS

November 23, 2013 12:52 PM

November 21, 2013

Alex Schroeder

Über das Denken

A note to English readers: If this post showed up in your feed, you should probably switch to a different feed. Some suggestions: RPG only, just English.

Wenn ich beim Frühstück den Monde Diplomatique oder die WOZ lese, habe ich ab und zu das Gefühl, ich hätte etwas begriffen. Ein Satz, zwei Sätze, nur wenig vielleicht, und wie einer, der nach Worten sucht und dem es jetzt auf der Zunge liegt, versuche ich es auszusprechen, mir selber vorzusagen, doch dann kommt noch ein Biss, und noch ein Satz, ein Absatz gar, noch ein Artikel bevor ich mich ins Geschäft aufmache… Und irgendwo war doch noch etwas.

Über den Konsum, die Revolte des Einzelnen, über die Arbeitszeitreduktion, den Produktionsgewinn, die unausweichliche Verteuerung der nicht rationalisierbaren Dienstleistungen und dessen soziologischen Folgen (William Baumol, “The Cost Disease. Why Computers Get Cheapter and Health Care Doesn’t”, zitiert in Wie produktiv ist ein Streichquartett?), über die Muße, über die Klimaerwärmung und unsere Unfähigkeit, Entscheidungen zu treffen.

Das Problem ist nicht nur die Aufmerksamkeit der Informationskonsumenten sondern auch die Konzentrationsfähigkeit der Informationsproduzenten. Alles buhlt um meine Aufmerksamkeit, so dass ich kaum noch weiss, was ich selber denke. Was ich selber denken will.

Mal schauen, ob der Blog hilft, mich zu konzentrieren.

Tags: RSS

November 21, 2013 07:39 AM

November 16, 2013

Alex Schroeder

How To Run A Contest

I’ve recently received an email by somebody who wondered whether I’d be willing to spread the word of his contest and whether I knew anybody willing to sponsor prizes. When I started running the One Page Dungeon Contest I decided that I’d document my “process” and make this information public so that anybody who is willing to put in the hours can kickstart their own process.

The page Comments on One Page Dungeon Contest 2012 is a good place to start. It has a checklist with all the things you need to think of. It has copies of all the announcements I wrote (click Edit this page at the bottom to get the bbCode format which you can then easily adapt and paste into you own announcements on most forums); it has copies of the postings themselves (effectively listing all the forums I posted to); it also has links to the Twitter account, Facebook page and Google+ page I used to spread the word; it also has copies of the emails I wrote to past and new sponsors. If you want to build a list of sponsors, I think your best bet is to just write to as many publishers as you can think of and post an open call for sponsors in your announcement. It takes time, but the lists of past sponsors gives you a head start.

All of the sponsors I contacted were super nice. The worst that ever happened was that a person I contacted did not reply. No harm done! One prospective sponsor also wanted me to sign a contract I found unacceptable, but the people I was in touch with were all extremely friendly. So, my conclusion is that it never hurts to ask nicely.

I even kept my todo list online. I guess there is not much interesting to learn from that. It was mostly stuff I wanted to write down in the months preceding the official announcement in order to not forget anything. Sponsors that contacted me ahead of time. Judges who volunteered ahead of time.

There are similar pages for 2010, 2011 and 2013. You also need to figure out how to distribute prizes. Back in 2011 I wrote bout the tricky balance of privacy and transparency. You will also need to think about licensing issues. People will discuss it online. No matter how obvious you think it is, there will always be people who don’t understand how it works and who feel entitled to be as rude as they want. You’ll need to be able to handle this, too.

Anyway. Take a look at the notes I wrote in 2012. Anybody can do it. The question is… Do you want to run the One Page Dungeon Contest 2014?

For now, take a look at these two upcoming contests:

ok :)

Case in point, today Stuart’s announcement says “All entries will be collected into one PDF released under the creative commons license.” Given my past interactions with angry dudes on the Internet makes me wonder: Which CC license? And will participants understand that depending on the exact license anybody can take the PDF and release a print product, and ask money for it? I recommend being as precise as possible. ;)

Read Choose a License on the Creative Comons web site.

Allow modifications of your work?

  • Yes
  • No
  • Yes, as long as others share alike

Allow commercial uses of your work?

  • Yes
  • No

To answer the last question, you might want to read Defining Noncommercial on the Creative Commons website. Consider this sentence in the executive summary, for example: “Both creators and users generally consider uses that earn users money or involve online advertising to be commercial”. Remember how many websites that might offer the PDF for download also involve online advertising.

And then there’s Other criticism of the non-commercial license on Wikipedia to consider…

I also recommend reading Free Culture. :)

Tags: RSS RSS

November 16, 2013 09:29 PM

November 13, 2013

Alex Schroeder

RPG Geek

I recently learned about Bryce Lynch’s adventure design contest which he is holding on RPG Geek. He said he wanted the contributions to be added to the database, and so I added mine. And I realized once again, what a wonderful resource this. Apparently every single adventure, every little house rule collection, every fantasy heartbreaker, they can all be entered into the database. I think I’m going to do this. A kind soul already added the Fight On! issues to RPG Geek. And so I think I’m going to start adding stuff I was involved in. A kind soul already added Stonehell Dungeon, where I acted as an editor.

I just submitted the following:

I like it.

Sometimes I get the feeling that people online are asking for a comprehensive RPG database of artists, editors, and so on. Well, as far as I can tell, RPG Geek serves the purpose.

Tags: RSS

November 13, 2013 01:41 PM

November 08, 2013

Alex Schroeder

Adventure Design Contest

Bryce Lynch is running an adventure design contest.

Bryce is a harsh critic of RPG modules. He doesn’t mince words. I happen to agree with his taste, however, which is why I generally enjoy reading his reviews.

I'm thinking of making a nice, English variant of these notes I used a while ago. I made a one-page adventure based on these notes for a session back in May.

http://farm6.staticflickr.com/5527/10744308566_0b70e7a373_z.jpg

Update: Done!

Can you spot any typos and layout or font problems? Download problems? License misapplied?

Tags: RSS

November 08, 2013 05:18 PM

November 05, 2013

Alex Schroeder

D&D ist Verhandlungssache

Via Brendan und Google+ bin ich auf diese Diskussion von Eero Tuovinens D&D Kampagne gestossen. Die Diskussion empfehle ich allen, die Interesse an D&D der alten Schule haben.

Ich denke, dass ich meine Fünf Winde Kampagne ähnlich führe. Vor einer Weile habe ich beschlossen, meine Hausregeln in einem separaten Dokument unter dem Namen Hellebarden & Helme zu führen. Genau dies macht Eero allerdings nicht. Wie es scheint, behandelt er die Regeln wie eine orale Tradition. Der Spielleiter erinnert sich an verwendeten Regel, wendet diese an, stellt Regeln zur Diskussion, lässt Regeln fallen, die man ständig vergisst, die doof sind. Klar, der Spielleiter ist verantwortlich für die Monster hinter den Türen, alle sind aber gemeinsam für die verwendeten Regeln verwantwortlich. Ich füge auf alle Fälle auch immer wieder das eine oder andere Thema hinzu und streiche auch ab und zu Regeln, die nie zur Anwendung gekommen sind.

Hier sagt Eero auch, dass “rulings, not rules” in die richtige Richtung geht, dabei aber oft das naive Bild der Aufgabenteilung von Spielleiter und Spieler gepflegt wird. Er selber verwendet allerdings einen eher “legislativen” Prozess, wie oben beschrieben. Der Spielleiter ist verantwortlich für die Beachtung der Regeln, die Anwendung der Regeln, und führt durch den Prozess der Regeländerungen.

Darüberhinaus sieht Eero in einer typischen Kampagne neben dem grossen Einfluss der Regeln auch einen grossen Einfluss des gemeinsamen sich Einlassen auf das Spiel. Das Spiel der Entwicklung von Herausforderungen, dem sich den Herausforderungen stellen, das kooperative Spiel, das Fällen von strategischen Entscheidungen. Man einigt sich implizit, dass dies der Sinn des Spieles ist, manövriert sich in entsprechende Situationen und wendet dann die Regeln an, um die Situationen aufzulösen.

Witzig auch Eeros Hinweis, dass all die D&D Schreiberlinge immer das Endresultat statt den Prozess beschrieben haben. Klar, in Gygax’ Kampagne gab es diese Klasse und jene Klasse mit diesen und mit jenen Spezialfertigkeiten, aber das Einführen neuer Klassen ist Aufgabe des Spielleiters und die Diskussion, die Erinnerung, die Verwendung, das machen alle gemeinsam. Dort steht nichts davon, wie die Gruppe zu diesen Regeln, diesen Annahmen, diesen Abenteuern gekommen ist. Nur das Endprodukt wird beschrieben, und es wird ihm ein Hauch von Genialität, eine Richtigkeit zugeschrieben, die es in dieser Art gar nicht gibt.

Entsprechend leitet Eero sein Spiel, ohne sich auf eine bestimmte Version der Regeln zu beziehen…

Hierfür braucht es natürlich Spieler, die an dieser Sorte von Kampagne interessiert sind. Man will die Fiktion gemeinsam erforschen. Deswegen gibt es kein Jammern über Balance und Regelfuchserei. Muss ich mir später nochmal in Ruhe zu Gemüte führen.

Interessant finde ich auch seine Beobachtung, dass die Stufen der Charaktere sich auseinander ziehen und am Schluss oft nur ein einziger hochstufiger Charakter die Expedition anführt, die anderen dagegen eher kleinere Kaliber zu Felde führen.

Tags: RSS

November 05, 2013 06:20 PM

November 04, 2013

Phil Jones (Smart Disorganized)

Aaaargh!

I have to write a fucking custom Tuple class in my Java program just to have a function that returns a pair of values?

by noreply@blogger.com (phil jones) at November 04, 2013 09:37 PM

November 01, 2013

Phil Jones (Smart Disorganized)

Programming Language Features for Large Scale Software

My Quora Answer to the question : What characteristics of a programming language makes it capable of building very large-scale software?
The de facto thinking on this is that the language should make it easy to compartmentalize programming into well segregated components (modules / frameworks) and offers some kind of "contract" idea which can be checked at compile-time.

That's the thinking behind, not only Java, but Modula 2, Ada, Eiffel etc.

Personally, I suspect that, in the long run, we may move away from this thinking. The largest-scale software almost certainly runs on multiple computers. Won't be written in a single language, or written or compiled at one time. Won't even be owned or executed by a single organization.

Instead, the largest software will be like, say, Facebook. Written, deployed on clouds and clusters, upgraded while running, with supplementary services being continually added.

The web is the largest software environment of all. And at the heart of the web is HTML. HTML is a great language for large-scale computing. It scales to billions of pages running in hundreds of millions of browsers. Its secret is NOT rigour. Or contracts. It's fault-tolerance. You can write really bad HTML and browsers will still make a valiant effort to render it. Increasingly, web-pages collaborate (one page will embed services from multiple servers via AJAX etc.) And even these can fail without bringing down the page as a whole.

Much of the architecture of the modern web is built of queues and caches. Almost certainly we'll see very high-level cloud-automation / configuration / scripting / data-flow languages to orchestrate these queues and caches. And HADOOP-like map-reduce. I believe we'll see the same kind of fault-tolerance that we expect in HTML appearing in those languages.

Erlang is a language designed for orchestrating many independent processes in a critical environment. It has a standard pattern for handling many kinds of faults. The process that encounters a problem just kills itself. And sooner or later a supervisor process restarts it and it picks up from there. (Other processes start to pass messages to it.)

I'm pretty sure we'll see more of this pattern. Nodes or entire virtual machines that are quick to kill themselves at the first sign of trouble, and supervisors that bring them back. Or dynamically re-orchestrate the dataflow around trouble-spots.

Many languages are experimenting with Functional Reactive Programming : a higher-level abstraction that makes it easy to set up implicit data-flows and event-driven processing. We'll see more languages that approach complex processing by allowing the declaration of data-flow networks, and which simplify exception / error handling in those flows with things like Haskell's "Maybe Monad".

Update : Another thing I'm reminded of. Jaron Lanier used to have this idea of "Phenotropic Programming" (WHY GORDIAN SOFTWARE HAS CONVINCED ME TO BELIEVE IN THE REALITY OF CATS AND APPLES) Which is a bit far out, but I think it's plausible that fault-tolerant web APIs and the rest of the things I'm describing here, may move us closer.

by noreply@blogger.com (phil jones) at November 01, 2013 02:50 PM

October 31, 2013

Alex Schroeder

New Google Plus Usage

Google+ Communities When I started using Google+, I added a few shared circles full of gamers. I ended up with more than a thousand people in my circles. It felt weird, however. Many of them never posted. Others posted stuff that wasn’t related to role-playing games, politics, or other issues I cared about. Others posted way too much.

At first, I thought all these problems could be solved via Circles. But in practice, that has been harder than I thought. Problems I found:

  1. People don’t automatically know in which circle to put you. You need to have some public posts indicating your interest, or your need to write about them on your profile, and you need to trust other people to take this information into account. There used to be a lot of posts saying “put me in these circles, if you have them”.
  2. If you realized that a person posted about topics you cared about and topics you didn’t care about, it was socially awkward to ask them to remove you from one of their circles. Some people also posted everything public and felt that this was what they were like, as a person, as a whole, and if you didn’t like it then perhaps you were better off uncircling them entirely.
  3. A lot of people never seemed to write a word. Are they even real? Are they snoops, monitoring everything I write? Is my writing different when I believe to write for a private “circle” compared to writing in public? What if these circles have more than a hundred people in them and are essentially a public?
  4. As the circles of sender and recipient are not coordinated, you might put a person writing about topics A and B into the appropriate circles A and B on your side, and if you write about A or B, the right people will get to see the post, but if they write about A or B, their posts will end up in both your A and B circles. Reading circles to sort incoming posts by topic don’t work for people in your circles that post about multiple topics.
  5. When I started uncircling agressively, I realized that it would take forever to get rid of the estimated 950 people in my circles.
  6. Communities seemed to solve many of these problems: Posts are generally on topic. I can read by topic. If I really like a lot of what a person posts, I can still circle them. I expect to do that for a very small number. Communities have their own problems, unfortunately. The thing I find most obnoxious is that some people post things I don’t care for to communities. Do I need to block them in order to curate my community stream? Right now this is just a very minor annoyance.

I needed to figure out whether the effort spent on circle maintenance exceeded the effort needed to curate my communities. Right now, I think that communities work better than big circles. So I did the obvious thing: I ditched my almost all of my circles. No more RPG, Emacs, Copyright & Patents and Typography circles. I’ve uncircled practically everybody. There are but 12 people in my circles right now.

I’m giving communities a try.

If you want to make sure I see a post or comment of yours, you’ll need to plus-mention me. I guess you had to do this when I had a thousand people in my circles, too. :)

I still read the blogs.

Tags: RSS

October 31, 2013 09:10 AM

October 30, 2013

Phil Jones (Smart Disorganized)

OWL Broken

Doh! Actually OWL is very broken. Will be posting fix shortly. Will keep you informed.

by noreply@blogger.com (phil jones) at October 30, 2013 01:16 PM

Monads in Python (Again)

Dustin Getz provides one of the best "Monads for idiot Python programmers" explanations I've seen.

Excellent! I think I almost do understand this one.


by noreply@blogger.com (phil jones) at October 30, 2013 01:15 PM

October 29, 2013

Alex Schroeder

How To Run Fate

Recently, Andy McQuoid asked on Google+ for suggestions running a Diaspora campaign with a colossal derelict ship to explore—and that ship is actively trying to kill the characters. He also said, “ I am also unsure if I present the whole ship as one big Social Combat scene, or to break it down into the component areas, i.e., bridge, engineering, medical etc. and run scenes in there. If this was a Traveller game I would draw up the plans of the ship and have the characters proceed room by room. However, I think Diaspora offers a better, story based way of doing this that would be much more satisfying to do, and I want to showcase some of the great things in the minigame toolkit that Diaspora offers.”

I was reminded of my Solar System game and my post on how to prep for it. I wrote the following in response.

I would treat it as an old-school megadungeon and therefore structure game along missions. The session begins and log files show a certain percentage of extra heat radiation. There must be an unknown energy source in the ship. Outer hull sensors report increased infrared around the 1.7km line…

Prepare a sheet of paper with ideas. List NPCs (machines, programs, robots), rooms and the challenges they pose (stuff to reconnect, overcome, evade), tidbits you want to reveal, decisions that need to be made, consequences you’d like to see, and so on.

Make special note of mini-games you want to run. I’d suggest none on the first or two session but then one or two for every three hour session you play. This can be a social conflict, a platoon combat, a larger combat with a lot of zones, etc. Prepare those little maps and rules before-hand in order to make it a smooth experience.

The game itself is the structured along the challenges, players looking at their skills and deciding how to go about it, resolving the skill checks, invoking aspects, enforcing consequences, revealing interesting parts of the background and leads to new missions for future sessions.

I also recommend following the Designing an Adventure section of The Shadow of Yesterday.

Every now and then, I’d make sure to add adventures outside the ship. Visiting a system. Contacting other ships, etc. But it all follows the general outline above.

Tags: RSS RSS RSS

October 29, 2013 11:04 AM

October 23, 2013

Alex Schroeder

Settlements in Sandboxes

Recently, Gregor Vuga talked about the West Marches campaign model on Google+. He summarized the model as “one safe home base + lots of very dangerous wilderness” and wondered about adding cities that are “interesting places where there might be a lot to do”.

Here’s what I wrote, slightly edited.

I run a similar campaign. There are some small differences in how the thing is organized, but in terms of using many cities and other safe havens, I have had no problems. I treat settlements either as safe places and thus as not very interesting with the exception of one, two or three important non-player characters. Or settlements are treated as a simple adventure locale with a handful of “rooms” (one, two or three buildings) with a particular enemy and their minions need to be fought (were rats, cultists, evil tax collectors). The key is that once the adventure is over, the settlement returns to safe place status. There’s never an invitation to spend more time in a settlement. Most adventure and all the treasure is found outside.

I think this is still compatible with the West Marches campaign model because it depends on what you want from it. I want to encourage players to choose a goal or a destination, and go there, and do something. The original West Marches did this by saying the starting village was boring and safe. If the city is teeming with intrigue, then adventure comes to the players. They did not “choose” this adventure. So that’s what I want to avoid. If I treat other cities either like the starting village (boring, safe) or like a dungeon (remote, dangerous), then I am still achieving my goal. Whether you still want to call this “West Marches style” I don’t know.

If I wanted to add cities as interesting places to my campaign, I’d make sure that cities are generally boring and safe but they contain adventuring locales. In my game, for example, the players visited Sigil. It’s a big city, it has factions, it has adventuring locales, and so on. Not a problem, as far as I am concerned. Sigil wasn’t their home base. Players came to Sigil in order to achieve something. They did that, navigated the dangers, visited interesting locales, got involved in intrigue, and left again. Had the players decided to stay in Sigil, perhaps that would have made things more problematic. Will the faction war catch up with them? Will they still get to choose their adventures, session after session? I tried to mitigate this by declaring their guest house to be safe and boring, for example.

I guess what happens is that I just redefine the sandbox. It’s like a fractal. Once you get to Sigil, the thing is self similar: a safe place, adventuring locales, more dangerous when farther away, and so on. Basically “one safe home base + lots of very dangerous wilderness”.

Tags: RSS RSS RSS

October 23, 2013 10:42 AM

Old School Fanzines

In 2012 I wrote about old school fanzines, and this being a wiki, I sometimes updated the information when I found some more information. Time to start a new page with the real updates, however.

Which magazines released an issue in 2013? Did I miss any? Should I change the description? Leave a comment. In no particular order…

Also note this thread linking many more!

Tags: RSS RSS

October 23, 2013 06:18 AM

October 22, 2013

Alex Schroeder

Random Names on IRC

Sometimes I wonder whether nicks on IRC give too much away. Sex, cultural background, … So here’s an experiment. Do you treat the people the same if you can’t see their nick names?

The following setup uses colored nicks and random names for Emacs:rcirc.

rcirc: Random Names

Tags: RSS

October 22, 2013 02:17 PM

Phil Jones (Smart Disorganized)

Pissed With Ubuntu

Seriously, it was just a simple upgrade. How hard should that have been?

Instead it crashed in the middle. When I rebooted it told me my disk was broken. I found some instructions to fix the problem online. It ran these for a while, fixing some packages before telling me my package manager was too broken so it was aborting.

End result. A Ubuntu that boots into low-res mode without wifi :-(

Bleah!


by noreply@blogger.com (phil jones) at October 22, 2013 12:24 AM

October 21, 2013

Alex Schroeder

1PDC in print

1PDC 2013 After announcing it on Facebook and on Google+ and on Twitter I guess I should announce it here as well: The One Page Dungeon Contest 2013 is available in print!

Woohoo, Brett Bernstein has done it again. Thanks!

The CC Share Alike license makes it possible. This is great. Somewhere in the store you can also get the 2012 book, if you’d like that.

The yearly PDFs with all the entries remains freely available. I’m assuming you know what you’re buying if you’re ordering the book. :)

The main reason I feel the need to post it here, however, is this angry rant.

Here’s a FAQ compiled by -C of Hack & Slash, the result of a discussion on Google+:

Isn’t the content of this book available for free? Yes. The contest is available here.

Are the authors receiving any of the money from the PDF? No, but that is due to the terms under which they released their work, the Creative Commons Share-Alike License.

Is this legal? Yes. It is allowed under the terms of the license. You have the same option to do this as anyone else.

Do the contest managers know? Yes, this work was done with their knowledge and by request.

Can’t I do this at Lulu? Yes, the cost for a 116 page full color softcover book will run you 28.96$. Other complexities due to the nature of the contest make printing this book not easy, due to possible font embedding, transparency, and file size issues.

Is there any new art or content? No, it is the entries from 2013 along with the winners from 2010 and 2011.

Is this printed using lightning source or a local printer? The publisher has no comment on internal logistics.

Are the authors aware of this project? Some of them, those that have been contacted [by Brett] were supportive.

Will this be available in stores? Yes, retailers can order it through Ingram. Hobby stores that don’t use Ingram will also be able to order through Indie Press Revolution in the next few weeks.

Why doesn’t Amazon mention any of this? They take text from various lookups, which don’t always contain the latest information. Changes can be suggested, but that doesn’t mean they will be made.

Brett also said: “I make enough per book at amazon just to cover printing costs. I did this as a service for the RPG hobby, so people who do not have access to printing services could get this at a reasonable price.” (in the comments of the same Google+ thread)

As for me personally, the CC license is fundamental. I absolutely want people to copy and distribute the resulting dungeons. I want people to be able to host them on their websites even if they (or Google) are making money off of it. I want people to be able to print them even if they (or Lulu) are making money off of it. As far as I am concerned, creating One Page Dungeons for everybody to use and spread as they see fit and without having to ask for a permission is the entire point of the contest. Not everybody needs to share this point of view, of course, but that’s why I run this contest in particular.

If you’re an author, and you still feel disappointed or hoodwinked… I don’t know what to say. I honestly felt that it was obvious enough. Here’s how the instructions to the One Page Dungeon Contest 2013 start:

Submissions: Here’s how to submit your entry.

  1. Create a One Page Dungeon.
  2. Submitting a dungeon to the contest releases it under the Creative Common Attribution-Share Alike 3.0 Unported license with credit to the contest participant.
  3. The submission must have a name, an author, and a link to the license (http://creativecommons.org/licenses/by-sa/3.0/).

On the One Page Dungeon there is another section that doesn’t mince words:

License: The PDF doesn’t need an actual clickable link to the Creative Common Attribution-Share Alike 3.0 Unported license. The URL just has to be readable when printed so that people can look it up if they need to. The license basically says that anybody can copy, change, and distribute your submission, as long as other people can take the new copy and do the same, and as long as they list all the contributing authors. As the author you can distribute copies using a different license, but you cannot revoke the Creative Commons license. Thus you cannot sell “exclusive rights” to somebody else at a later date. See the license itself for more information. :)

“The license basically says that anybody can copy, change, and distribute your submission, as long as other people can take the new copy and do the same, and as long as they list all the contributing authors.” It seems pretty straight forward to me. If you have a suggestion regarding the wording, feel free to leave a comment or contact me directly.

I remember reading Justin Alexander’s One-Page Rip-Off post in 2010 where he said anybody could upload the free PDF to Lulu and buy their own copy. Please do it! You are free to do it. That’s what’s so great about it. There is no need to ask. Unfortunately, nobody stepped forward in 2010 and 2011 to actually do it. Or perhaps they did it and never offered it to anybody else. In 2012, Brett stepped forward and actually made it happen: The 1PDC in print, for those of us who’d like to have it without feeling like doing it ourselves. And he did it again in 2013. Thanks! :)

Tags: RSS RSS

October 21, 2013 06:27 AM

October 17, 2013

Phil Jones (Smart Disorganized)

OWL Fix

There's a big fix for OWL today. There were some mysterious times when pages that I thought I was changing were getting reverted. I thought originally that this was a glitch from me btsync-ing between my laptop and tablet. Or maybe my attempts at doing background synchronization between the browser localStorage and the server were failing.

Nothing seemed to completely eliminate this intermittent problem. But today I realized it was much simpler. I was basically using web.py's "static" file serving to pull the OPML files off the server into Concord. But "static" is meant for static files (doh!). The browser was caching them. (Maybe because of some header web.py was putting out.) Anyway, I just changed the server to reading the files into memory and spitting their contents out, just like any other dynamic web-page, and the problem looks like it's gone away.

I'll keep an eye out, but I think that was it.


by noreply@blogger.com (phil jones) at October 17, 2013 12:38 PM

October 16, 2013

Alex Schroeder

Knowledge Skill and Narration Rights

Recently I happened upon a discussion on Google+ regarding the introduction of facts by players. The example given involved an Indiana Jones character spontaneously identifying snakes. Does the referee determine the kind of snakes or does the player determine the kind of snakes?

Wilhelm Person suggested a skill check to get narration rights:

When you roll for knowledge skills. If you succeed you get to decide what the truth is.

If you fail the GM tells you what the truth is. Sometimes the GM lies.

Here’s what I wrote:

If you manage to foster the right atmosphere at the gaming table, it can be just a matter of using an ellipsis, a pause, a knowing look—and players will interject cool ideas by themselves. That’s how I try to have it work at my table. The obvious benefit to me is that we don’t need a skill. Another benefit is that it limits itself to situations where players actually have cool ideas. Otherwise—particularly if you’re not playing a story game—you might get a helpless shrug or an empty stare in response to a success on the knowledge skill check. Players are not always ready to spew forth the Apocalypse.

What seems to work best, in my game, is to combine it with a 1 in 6 chance. Most players will immediately suggest something very positive for them. I might make a doubtful face and say “OK, 1 in 6 chance that these cannibals fall for your ridiculous explanation. But what if it doesn’t work?” Usually the table is in brainstorming mode at that point and we all determine the rest before rolling the die. I find that accepting all suggestions at the table and have the dice decide works better than discussing it, looking for consensus—long talk disrupts flow, as far as I am concerned.

Tags: RSS RSS

October 16, 2013 08:19 AM

October 10, 2013

Alex Schroeder

More Troll Questions

Random Wizard has done it again. Questions to troll the bloggers, to ring the echo chamber, to offer us all the possibility to pontificate… And I can’t resist! :)

  1. Should energy drain take away one level of experience points from the character? Yes. Take away their XP and have them reroll their hit-points. Keep the new total if lower than their current hit-points. Conversely, when people gain a level, they reroll their hit-points and keep it if higher than their current hit-points.
  2. Should the oil used in lanterns do significant damage (more than 1 hp in damage) if thrown on an opponent and set on fire? Yes. I’m using 1d8 this round and 1d8 next round. It also takes two actions: throwing the oil and throwing the torch. Both need to succeed at a ranged attack vs. AC 9 (no armor). Thus, the damage is similar to the use of a weapon, except it’s easier to hit. I think this appropriate considering the weight and price of every pint of oil.
  3. Should poison give a save or die roll, with a fail rolled indicating instant death? Yes. At higher levels, the game is no longer about hit-points but about save-or-die traps and spells and the appropriate counter-measures.
  4. Do characters die when they reach 0 hit points? No. When they reach 0 hit-points and every time they are hit thereafter, they roll on the Death and Dismemberment table. This reinforces the idea that hit-points is just the will to live and getting hit with 0 hit-points is when the injuries happen.
  5. Does the primary spell mechanic for a magic user consist of a “memorize and forget system” (aka Vancian)? Yes. It’s simpler that way. When I tried a free form magic system, my player kept casting the same spell. That’s great, but not much different from Vancian magic. Therefore it stays.
  6. Should all weapons do 1d6 damage or should different weapons have varying dice (1d4, 1d8, etc…) for damage? 1d6 to rule them all. It works. I use varying dice for monsters.
  7. Should a character that has a high ability score in their prime requisite receive an experience point bonus? No. Distributing experience points is already a chore. Don’t make it more complicated. The bonus stems from a time when the ability gave no other benefit. It’s no longer necessary.
  8. Should a character with 18 constitution get a +3 bonus to hit points, or a +2 bonus to hit points, or a +1 bonus to hit points or no bonus to hit points? +3. Moldvay knows best. Beyond Strengh and Dexterity: Wisdom provides a bonus to saves against Spells. Intelligence provides bonus languages and Charisma provides a reaction roll bonus and an upper limit on henchmen, and it determines their morale.
  9. Should a character have 1 unified saving throw number, or 3 saving throw types based on ability scores (reflex, fortitude, will), or 5 types based on potential game effects (magic wand, poison attacks)? 5 types works for me. When I write down monsters, however, I will often just use 19-HD plus or minus two or four depending on resilience. Who cares about the fiddly details when fighting monsters? Not I!
  10. Should a cleric get (A) 1 spell at 1st level (B) no spells at 1st level (C) more than 1 spell at 1st level? None. In my game, they are supposed to get none for their first adventure only. Then, hopefully having gained some grace, they get the one spell the rules accord them.

My house rules are based on Labyrinth Lord: Halberds and Helmets.

Tags: RSS

October 10, 2013 03:31 PM

October 09, 2013

Phil Jones (Smart Disorganized)

Blame the Tools for Thought

Giles Bowkett :
This is, in my opinion, the strongest argument for seeing Unix and basic coding skills as fundamental required literacy today. As prostheses for memory and identity, computers are too useful not to use, but if you don't know how to craft your own code which gives you a UX which matches the way you think, you're doomed to matching the way you think to the available tools, and even the best available tools basically suck. Interaction design is not only incredibly hard to do well, it's also incredibly idiosyncratic.

by noreply@blogger.com (phil jones) at October 09, 2013 11:10 PM

October 02, 2013

Alex Schroeder

Qelong in Play

A while ago, I talked about Quelong and loved it. Yesterday, I got to run it.

As is typical for my Planescape-Spelljammer-Traveller mashup, I started off by summarizing how the party got back to the Astral Sea and used the red pill to return to Sigil. There, they contacted Lissandra, a dealer in planar gates they knew from a previous expedition. They described their goal and I decided for myself that Zadara was going to sponsor a mission to Qelong on the condition that the party provide at least one hands-on experience with a god weapon. The party agreed and so Lissandra’s “anonymous client” coughed up the diamond dust worth 5000 gold pieces I deemed necessary to transition from Sigil’s Slag to Qelong…

At the end of a three hour session we ended with the party standing in front of the cylinder, having just thrown a naga-kin against it’s shell and watching the naga-kin burn to death.

How did it go? It was straight forward. The party had two goals:

  1. find the elven sorceress Barlakana who had disappeared in Qelong decades ago in the search of aakom (and nobody they talked to knew where to find her)
  2. they quickly learned that the aakom was being leaked from a god weapon and decided to investigate

Here’s what happened, and where I got the information from. You decide for yourself whether that’s the kind of 3h session you’d like to play in.

The party arrives in Qelong and the character that can fly investigates the area; he decides to land near a peasant hut along the canal. He sees Varangians harvesting the former inhabitant’s livers and everybody at the table is disgusted even though the dudes seem nice enough and offer the flyer a job as a scout. Report to Diamond Geary about 25 miles up north, they say. This was from the random river encounter table.

They also visit a lotus temple and learn about the importance of the canals and stupas in keeping the Naga Qelong asleep. They hire a 3rd level monk named Xue Sijhanouk to serve as a guide. This was improvised based on the Gold Lotus description and the henchmen rules. The monk brought the player map aboard. It’s “from an old religions text” and only vaguely up to date. Players like hand-outs and maps. They also like the lotus as a power for law and civilization, resisting the aakom.

Learning about the aakom poison in the water, they spend 400 gold pieces to buy rations and water for 400 days. This is a party with 10 characters ranging from levels 1 to 6, plus one wolf, so that leaves them 36 days to adventure. They also own a chalice that casts cure disease 5×/day, and they have two high level clerics with them. We look at the numbers and ponder ignoring the aakom poisoning rules. In the end I decide that since the weakest character in the party has 1 hit-point and the cure disease only masks the effect without getting rid of the poison, we’ll keep track of the 1 point/day aakom poison accumulation. That’s easy to track, toghether with the rations.

They buy a sampan (a small boat) for 5000 gold pieces and sail and row up the river. This was from the description of Qampong.

Three giant pythons drop on deck and one of the giant ape characters in the party breaks a foot. I later noticed that the pythons in the book have 2 HD stats but I used the ones from the Labyrinth Lord book which have 5 HD. No problem. This was from the random river encounter table.

They come to a village full of refugees and learn about the Varangian blockade and their confiscation of all goods. Hundreds of villagers beg for food and water. I offer to scratch 100 rations to feed the crowd and the party agrees. They spend the night. This was from the random condition of village table. I didn’t roll on the village encounter table.

Along the way, the party also meets a guesthouse. The inhabitants are extremely helpful and generous. The party is immediately suspicious and discovers that the inhabitants are in fact all evil cannibals. The guesthouse is set on fire and the party leaves. This was another entry from the random river encounter table.

They reach Jamqar Long and see the squalor, the refugees, the Varangians (the refugees called them “evil dwarves”). They talk to the Varangians and learn that Diamond Geary is on the other arm of the river. They spend the night. This was from the description of Jamqar Long.

They reach Sajra Amvoel and Fort Hawk (players chuckled at the latin name) and talk to Geary and Hagen. Geary is interested in hiring them, Hagen would love for them to find the cylinder but doesn’t want to risk his own men. It’s easier to harvest aakom from the refugees. They also see Hagen feed liver to the large hawk in his lab. Should the party locate the cylinder, however, Hagen offers to bypass its protection and as a reward, the players would get an ordinary Varangian share of the profits. The players decline and want to split profits 50:50 with the Varangians. This Hagen declines. They part on uneasy terms. Before leaving, the party also talks to the four clerics in the shrine. The monk henchman notices the non-traditional lotus ponds and disapproves of laymen using the lotus power. The clerics explain how they need to cooperate with the Varangians—including offering up terminal cases for “harvesting”—because the Varangians are all that keep the refugee situation from breaking down completely. The clerics also explain about Xam and Thip Qelay. There is some sympathy, there. This was from the description of Sajra Amvoel and the Varangian NPCs.

The party moves up the river. The clerics decides to use detect magic to attempt to find the arm of the river that would lead them to the cylinder and I agree that this would work. As they move up the river, they are attacked by 13 naga-kin. Two are taken prisoner and there is some talk regarding the Naga Qelong (a four headed serpent demigod) and Set (a seven headed serpent god). The naga-kin have never heard of Set but agree that he sounds very powerful and vaguely related. The naga-kin also agree that the aakom poisoning must end but for now it serves their purpose in weaking the canals and stupas. The situation remains unresolved, for now. The party spends the night.

On the forth day, they reach the cylinder. After much talking, one naga-kin is thrown against the cylinder and expires in the flash of fire as the other naga-kin watches in horror. That resolves the relationship towards the naga, I guess. The flying character managers to make a drawing of the inscription and the party now feels that they have earned their “pay” from Lissandra’s client. They haven’t found the elven sorceress, however.

Looking back, I think I should have played a non-stop thunderstorm track instead of Two Steps From Hell.

What do you think? Not enough atmosphere? Just enough atmosphere? Quicker than you thought? Does this session summary make you want to tweak the encounters in the Qelong book?

Tags: RSS RSS RSS

October 02, 2013 07:58 AM

September 30, 2013

Alex Schroeder

Games on Demand für OerliCon

Ich war am Wochenende auf der OerliCon und habe einen Games on Demand Tisch angeboten.

Die Liste der Kandidaten für mein “Tagesmenü” war lang…

Eher unwahrscheinlich:

  • Montségur 1244 – religiöse Fundamentalisten sind dem Tode geweiht
  • My Life With Master – arme Knechte schuften für den Bösewicht, bis zur Rebellion
  • Fiasco – kaputte Typen auf dem Ritt in den Abgrund

Vorbereitungen

Tipps von Jeremy Friesen auf G+:

I would recommend bringing a few games that you want to run. Provide a durable physical document that has a description of those games. This allows people to see what is happening. I would also make sure to note your schedule. If you can, recruit another GM or two (depending on how many players there might be).

Then be as visible as possible during the lead up and the day of. Use social media, especially the conventions Facebook page (if they have one). You will need to drum up that demand.

Make sure you have an elevator pitch handy for each game. People want to be sold on what thy’ll play.

Also, make sure that you have EVERYTHING that you need to get the game started immediately. Pre-made characters are best, 10 minutes or less for character creation is second best. Also dice, pencils, and paper.

I would also recommend being a very assertive GM regarding the rules. If you are playing Rules as Written, let the players know. But also work to build trust so you can make rulings during the game; Keep things moving at a good pace.

Ich werde mich also auf weniger Spiele beschränken und noch ein Blatt mit einer Kurzinformation zusammenstellen. Für die drei bis vier Spiele, die ich wirklich vorstelle, werde ich Beispielcharaktere bauen und mitnehmen.

Ich glaube meine Favoriten sind:

  • Lady Blackbird
  • Mountain Witch
  • In A Wicked Age
  • Western City

Bericht

Erster Abend. Die A4 Zusammenfassung der vier Spiele hat keiner gefunden. Vielleicht war einfach zu viel Zeug auf dem Tisch. Wir haben eine lange Runde Lady Blackbird gespielt und es hat allen grossen Spass gemacht.

Zweiter Abend. Die Zusammenfassung wurde mehrmals gelesen und ich habe noch einmal eine lange Session Lady Blackbird und einmal The Mountain Witch geleitet. Ich habe viele, sehr nette Spieler kennengelernt. Lily, Evelyn, Fabienne, Fidel, Samuel, Oliver und alle jene, deren Name ich vergessen habe: Vielen Dank!

Ganz besonders cool fand ich, als Lilly und Evelyn mir ihr System der Heimkampagne vorstellten: M20 Purest Essence! Ich ihnen ganz stolz eine Kopie der deutschen M20 Übersetzung von Dirk Remmecke geschenkt, die er im Namen von Anime Virtual S. A. für die Role Play Convention (RPC) 2008 in Münster gemacht hatte.

Via Google+ wurde ich daran erinnert, dass es eine deutsche Übersetzung von Lady Blackbird gibt. Wenn ich das nur vor dem Con schon gewusst hätte. Noch peinlicher: als ich die deutsche Version abspeichern wollte, musste ich erkennen, dass ich diese schon hatte. Oje. Ich hoffe, meine geplagten Spieler können es mir verzeihen. :)

Was nicht so gut funktioniert hat, aber anscheinend niemanden gestört hat: Das Einschreiben hat nicht wirklich funktioniert, weil die Spielzeiten auf der OerliCon nicht koordiniert werden. Deswegen haben Pascal, der sich vor Ort eingeschrieben hat, oder Carlo, der immer wieder mal vorbeigeschaut hat, beide doch nie einen Platz gefunden. Meine zweite Lady Blackbird Runde habe ich deswegen gnadenlos überzogen, statt wie sonst üblich auf ein Ende innert drei Stunden hinzuarbeiten.

Was für mich gut funktioniert hat: Am Freitag gegen Mitternacht heimgehen, im eigenen Bett schlafen, und am Samstag erst gegen elf wieder dort sein: viele, die dort geblieben sind, haben bis um sechs in der Früh gespielt. Von früh aufstehen konnte keine Rede sein.

Ebenfalls gut funktioniert haben die Visitenkarten, welche ich immer mit auslege. Vielleicht werden nur zwei oder drei mitgenommen, aber als einer der Spieler sagte, er suche eine neue Gruppe, habe ich sofort eine Visitenkarte zücken können. Irgendwie Schade: Selber habe ich weder Fotos gemacht noch Facebook, Twitter oder Google+ Freunde gewonnen, noch Email Adressen ausgetauscht. Daran muss ich das nächste Mal einfach denken.

Ebenfalls gut: einen grossen Beutel mit Bleistiften, Radiergummis und Würfeln für alle am Tisch und Papier zur freien Verwendung. Ich habe allerdings viel zu viel Papier mit geschleppt.

Fazit

Das nächste Mal sollte ich weniger Dinge mit nehmen. Wenn die Leute etwas in die Hand genommen haben, dann waren es die gut aussehenden Produkte. Vor allem Mouse Guard war ein Blickfang, weil viele die Comics kannten.

Für das nächste Mal also:

  • wie dieses mal eine deutsche Zusammenfassung der vorgestellten Bilder
  • einen grossen Beutel mit Bleistiften, Radiergummis und Würfeln, Notizpapier
  • klare vier Stunden Blöcke ankündigen, separate Anmeldung und immer ein Auge auf die Uhr
  • eine deutsche Übersetzung von Lady Blackbird mit nehmen
  • The Mountain Witch wieder mit nehmen (cool wären deutsche Charakterblätter mit den chinesischen Tierkreiszeichen)
  • Mouse Guard wieder mitnehmen und ein kleines Abenteuer mitnehmen (mit deutschen Charaketerblättern wäre gut)

Tags: RSS RSS

September 30, 2013 08:05 AM

September 26, 2013

Alex Schroeder

Free Stuff

Recently, Skeeter Green talked about the race to the bottom regarding the pricing of PDF products in the RPG hobby on Google+. He basically said that digital products require an effort to be made and are thus not “free”. He also said that buying music on iTunes illustrates the point: we’re not getting a tangible product and yet we pay the money because of the content. Thus, why the unwillingness to pay for PDFs?

One could argue that capitalism is inherently unfair. The idea that the price of a product should relate to the effort spent in producing it sounds Marxist to me. These days, it’s supply and demand that determine the price. Here’s what I said in reply to Skeeter Green’s post.

I think there are many factors that come into play. On one level, if many offerings are available for free, then that sets expectations. You can only ask for money if the thing you are publishing is significantly better than what is available for free. If it is only marginally better, then customers are only willing to pay very little. From my point of view, for example, very small dungeons, simple hex maps, old school character classes, price lists and spell lists all have very little monetary value because so many of them are available for free, and I love it.

Another factor is that Free Software has slowly prepared us to accept that a product which can be copied effortlessly is only worth a donation. The thing that really costs money is customization—it’s the service that I’m paying for. Thus, I’m prepared to pay for the act of customizing something for me, joining a Kickstarter, paying an artist to draw a character portrait, and so on. I’m less willing to pay for something that is already there and only needs to be copied. I think that’s also one of the reasons why Kickstarter-as-prepayment “works” for customers. Once the thing is made, I’m more reluctant to spend my money on it.

As for iTunes, I can tell you what I’d prefer: I’d prefer to pay $5 to artists directly via a button on their web page because I don’t feel like supporting the infrastructure and middle-men. The reason I’m willing to pay a few dollars on iTunes is that piracy also comes with a cost: the quality of the download, the quality of the tags, the wait, the smut. Avoiding this is worth a bit of money to me.

As for the value of physical media: Once you start ordering from Lulu you realize that the media, the shipping, the last mile of home delivery is in fact quite expensive. I’m willing to pay $10 to $40 for shipping and handling of something such as the Tome of Horrors or Slumbering Tsar because I know it would cost me a similar amount if I ordered it from Lulu using my PDF.

In this climate, a traditional business model with an intangible product is simply hard to pull off.

Tags: RSS

September 26, 2013 02:12 PM

Campaign Wiki

Campaign Wiki

Ich betreibe für meine eigenen Kampagnen eine “Wiki Farm” namens Campaign Wiki– ein Website, mit dem ich mir für jede Kampagne eine eigene Wiki anlegen kann. Das darf man gerne ausprobieren und funktioniert ganz gut, solange man ähnliche Ansprüche hat wie ich. Wem die Wiki Funktionalität nicht ausreicht, muss dann auf Angebote wie Epic Words und Obsidian Portal ausweichen.

Netterweise wurden alle drei Wiki Alternativen vom Teilzeithelden Blog besprochen:

Kleiner Hinweis zur Campaign Wiki Besprechung: Die Liste aller Seiten einer Wiki erhält man, wenn man unten auf Administration klickt und dann Index aller Seiten wählt.

Tags: RSS

September 26, 2013 11:31 AM

September 25, 2013

Phil Jones (Smart Disorganized)

OWL Server

OWL now has a simple Python server that saves OPML files to your local machine.

More here.

by noreply@blogger.com (phil jones) at September 25, 2013 10:50 PM

September 23, 2013

Alex Schroeder

Furkapass

https://farm3.staticflickr.com/2852/9880510263_469050d01d_c.jpg
Furkapass by kensanata, on Flickr

On the Furka road towards the Canton of Uri, looking back towards the evening sun. The Vallais starts here with Obergoms and the Rhone. The road to the right is the Grimsel (map)

I like the new camera, an Olympus E-P5 with the 17mm f/1.8 M.Zuiko lens.

Tags: RSS RSS

September 23, 2013 10:45 AM

September 21, 2013

Phil Jones (Smart Disorganized)

Why Don't Browsers Let Web-Apps Write To The Local File System?

My Quora question :

I mean, I know why. It's a security thing.

But why couldn't a browser have an API for scripts to read / write the file system and a security feature where the web-app has to ask and be given permission by the user before it runs? (Just as Android apps. have to tell you what permissions they need before you install them.) Couldn't the browsers successfully police this?

Surely if the browser manufacturers were to offer this capability, they'd more or less kill native Windows / Macintosh application development overnight and become the default platform for desktop computers. (So maybe Microsoft don't have the incentive, but Google and Firefox do.)

by noreply@blogger.com (phil jones) at September 21, 2013 05:17 AM

Introducing OWL

I love outlining. I love wiki. What do you get when you create a mutant cross-breed of the two?

A fucking power tool, that's what!

It's just a rough draft, at the moment, a rough mashup of Concord and ideas from SdiDesk. But I think you can see it's compelling ...

by noreply@blogger.com (phil jones) at September 21, 2013 12:59 AM

September 18, 2013

Alex Schroeder

Broken Ribs

I use a Death & Dismemberment table in my game. One entry is for broken limbs. You roll again and may break your sword arm, your shield arm, a leg, or your ribs, with appropriate effects. No sword arm, can’t attack. No shield arm, can’t wield one. No leg, need a wooden leg (but no further effect once you do). But what about broken ribs? I read somewhere that you can’t strain yourself because the broken ribs might puncture your lung. So that’s what I use: can’t fight or you’ll die.

It’s a long setup, I know. Last session, my players met a dwarf pirate named Sawty with a saw mounted on his helmet. Uluf has a tengu horn which is way too powerful, summoned the flying swordsmen, killed half of Sawty’s crew and took over. A reaction roll showed that Sawty really liked Uluf. I decided that Sawty wanted to get rid of the guy who runs the show, Black Dagger. Uluf and his horn seemed like the perfect tools. Uluf wanted to get the treasure of the Bastille of Terror. Sawty convinces the reluctant Uluf to follow him and use the tengu horn in Black Dagger’s hall, kill him, and split the treasure fifty-fifty. Reluctantly, the players agree. Uluf leads the way. Sawty does his part, Uluf blows the horn, Black Dagger is killed by the tengus and the player characters cheer. Sawty is cackling triumphantly and leads Uluf to Black Dagger’s treasure hoard. The other player characters trail after them.

Sawty is a true pirate. He shows no regard for his fellow pirates, kicking their corpses out of the way, laughing. All he thinks about is gold and ruling this place. Uluf feels bad. Sawty quickly finds the treasure and disarms the trap. As half the treasure is spilled before Uluf’s feet by the pirate dwarf, Uluf snaps and decides to kill Sawty. A player backstabbing the honest pirate! A pirate who was as ruthless as they were. It was tense. Uluf’s player felt perhaps like a lot of murder was being committed in his character’s name. Uluf and Sawty fight.

When the other player characters offer help and healing, Uluf says no. This is a duel. Initiative is rolled again and again. By strange luck of the dice, both Sawty and Uluf end up in with two or three hit points each. Sawty scores a critical. Broken ribs!

Silence.

Uluf’s player: “I don’t care. Sawty has to die!” And he rolls and he hits and he runs Sawty through, just as the broken ribs pierce his lungs and the pink foam starts showing. They both die amidst the spilled coins of the pirates’ hoard.

I loved it.

Tags: RSS RSS RSS

September 18, 2013 09:14 PM

September 17, 2013

Phil Jones (Smart Disorganized)

September 06, 2013

Alex Schroeder

Crypto

Concerned by all the Snowden stuff? I am. I’ve had some friends use encrypted mail. Thanks!

I use GPG and you can download my public keys from a public keyserver. I’d be happy to keep our communications encrypted.

I’m also thinking of using the Raspberry Pi I got as a mail server. It would be always on. I think I’d like that. I recently found some instructions on how to do that in a German magazine (behind a paywall). Some alternative articles I’ll be reading later:

I really like what Bruce Schneier has to say. This, for example:

The NSA has turned the fabric of the internet into a vast surveillance platform, but they are not magical. They’re limited by the same economic realities as the rest of us, and our best defense is to make surveillance of us as expensive as possible.

Trust the math. Encryption is your friend. Use it well, and do your best to ensure that nothing can compromise it. That’s how you can remain secure even in the face of the NSA.

– Bruce Schneier, How to remain secure against NSA surveillance

By subverting the internet at every level to make it a vast, multi-layered and robust surveillance platform, the NSA has undermined a fundamental social contract. The companies that build and manage our internet infrastructure, the companies that create and sell us our hardware and software, or the companies that host our data: we can no longer trust them to be ethical internet stewards.

This is not the internet the world needs, or the internet its creators envisioned. We need to take it back.

And by we, I mean the engineering community.

– Bruce Schneier, The US government has betrayed the internet. We need to take it back

I remember when Richard Stallman started saying people should pay with cash, not credit and debit cards. I thought it was paranoid but cool. There was no need for me to follow suit.

I’ve been reducing my use of credit and debit cards in recent weeks.

Tags: RSS RSS RSS

September 06, 2013 12:51 PM

September 05, 2013

Alex Schroeder

Treasure

Courtney recently talked about treasure design on his blog. I use treasure for advancement and I agree with his assessment: random generation is makes players come back for more.

Random treasure is also an opportunity to develop your world. How do you explain a dozen hobgoblins carrying 5000 gold pieces? When I rolled it up, I decided that a bunch of hobgoblins were on their way to pay taxes to their overlord. The party then stole the treasure, inadvertedly visited the hobgoblin overlord (an evil wizard) and gifted him the gold by throwing a huge party (in order to gain XP), saw the same hobgoblins arrive at court (!) and had to think about a way of preventing the hoboblins from telling their master what had happened. Luckily, they had a cursed potion of conflict and quickly poured it into the wine used to welcome the hobgoblins. They started squabbling immediately and the party made a getaway. I loved it.

Courtney also says that one should “avoid blurring the line between treasure and junk lying around”. I agree completely! It’s boring. That’s why I don’t allow selling used armor and weapons for half price. It’s junk. Get me some new treasure if you want XP.

In a sandbox, there’s some tension between player goals that involve treasure and player goals that involve plot advancement. What happened to the elves? If there are no dangerous monsters with a lot of treasure, discovering the truth about the elves can be boring. My solution is to make sure that wherever there is plot, there is also danger and treasure. Thus, if the missing elves are all petriefied in a hall (as in my Wilderlands game), there must be gorgons, medusas or basilisks nearby with appropriate treasure. If there are armies of hobgoblins on the march (as in my Red Hand of Doom game), then the dragons accompanying them will have their usual treasure along on the march, carried by the footmen or by slaves.

It’s weird, I know. My sandbox has monsters and treasures wherever the interesting plot elements are. That’s simply how D&D World is. Every peaceful mission goes into dangerous territory, every army carries loot, every museum houses monsters. If there are no monsters and no treasure, I'll try and handle it in two sentences. “You sail down the coast to Tlan and talk to the sage. Two weeks later, you’re standing at the harbor. <insert what the party learns>. Now what do you do?”

If you find that you have a lot of players with a lot of hirelings—on a typical session of mine there will be between ten and twenty characters in the party even though we have only four or five actual players at the table—you’ll find that they can easily defeat “level appropriate monsters” in a dungeon and yet they are easily defeated themselves by higher level monsters such as gorgons, medusas, basilisks and dragons. I find that using a lot of weak enemies works best for me. When they recently investigated a forest hut, I rolled up a random encounter with 6d10 goblins. These attacked in waves of around 15 each, spaced a few rounds appart. It worked very well and there was a decent chance for treasure. It ended up being 11000 copper pieces… Oh well!

Tags: RSS RSS RSS

September 05, 2013 02:13 PM

September 04, 2013

Alex Schroeder

Thinking about a new camera

I recently read a review of the Olympus E-P5 PEN and reconsidered my old cameras: In late 2006 I bought a Pentax K100D. These days, I feel it is large and unwieldy, specially with 18mm-55mm Lens Kit. The charger for the four AA batteries I have is large and unwieldy. In 2010, I had enough and bought a compact camera: the Sony DSC-HX5V (that’s the one that comes with a built-in GPS). Unfortunately, a lot of pictures are very bright, the colors weak. I almost always have to fiddle with the images afterwards. If I want to use the GPS, I need to take into a ccount how long it takes locate itself. If I don’t wait, the pictures are tagged with the last known position.

When I asked a photographer friend, she asked me about my budget and said that usually people use just Canons or Nikons in order to protect their investment in lenses. I don’t own any lenses, so this doesn’t seem to matter that much to me.

I’d probably buy the Olympus E-P5 with the 17mm f/1.8 M.Zuiko lens. Opinions? Other cameras or older models I ought to consider, specially similar quality but lower price range?

This German reviewer is not convinced:

Angesicht dieser marginalen Fortschritte kann man die E-P5 zum Preis von derzeit 1000 Euro nicht empfehlen. Wer auf größere Modelle mit enormer Ausstattung und vielen manuellen Einstellmöglichkeiten Wert legt, erhält derzeit zum selben Preis die Olympus OM-D (derselbe Sensor, aber wetterfestes Gehäuse und Digitalsucher) oder die Fujifilm X-E1 (größerer Sensor, Digitalsucher, lichtstärkeres Kit-Objektiv).

Wer häufig mit Automatik- und Halbautomatik fotografiert, kann sparen. Die kleinere Schwester E-PL5 kostet im Handel derzeit 600 Euro und liefert ähnliche Bildqualität, wenn auch ohne das schicke Retro-Design der E-P5.

– Konrad Lischka, Olympus Pen E-P5: Kamerabrocken glänzt mit Retro-Charme

Tags: RSS RSS

September 04, 2013 09:15 AM

August 30, 2013

Alex Schroeder

Nergal Tempel

(Meine Spieler müssen weg schauen! ;))

Dungeon für die 3. Stufe, falls viele Gefolgsleute mitgenommen werden. Fairerweise sollte die Gruppe versilberte oder magische Waffen dabei haben. Vorbereitung des Spielleiters: Im Raum 22 gibt es Aufzeichnungen über geplante Brunnenvergiftungen in unschuldigen Dörfern aus der Umgebung.

Bei der Karte handelt es sich um den unteren Teil der Dungeon Karte 80 welche man auf Seite 4 der Dungeon Map gallery von Paratime Design Cartography finden kann. Diese Karte ist von Tim Hartin mit Anpassungen von mir, Alex Schröder, und untersteht der CC-BY-NC-SA 2.5 Canada License. Die Monster stammen aus Labyrinth Lord und dem Advanced Edition Companion, entsprechend gilt für die Monster die OGL. Die Monster gelten als “Open Content”. Was weder Karte noch Monster ist, habe ich geschrieben und darf ohne Einschränkungen weiter verwendet werden.

http://farm4.staticflickr.com/3689/9625659989_15dc1c93c3_b.jpg

Abkürzungen
TW: Trefferwürfel, alternativ dazu direkt LE: Lebensenergie, RK: Rüstungsklasse, NM: Normaler Mensch (Krieger Stufe 0), ML: Moral, BW: Bewegungsrate in 10 Fuss/Runde, EP: Erfahrungspunkte, RW: Rettungswurf

Monster: Jedes Verlassen eines Raumes, jede längere Aktion (Suchen, Lauschen), jede laute Aktion (Türen aufbrechen, Fallen auslösen, Kampf) hat eine ⅙ Chance, Monster herbei zu rufen.

  1. 2W4 Seuchenopfer TW 2 RK 8 1W6 F1 ML 8 BW 12 EP 29 – wie Zombies
  2. 5W10 Riesenratten LE 1 RK 9 1W6 NM ML 5 MV 6 EP 6 – ein Angriff pro 10 Ratten, 5% für eine Krankheit, die in 1W6 Tagen tödlich endet, Opfer: RW gegen Tod oder hinfallen und diese Runde nicht kämpfen
  3. 1W8 Werratten TW 3 RK 7 1W6 F3 ML 8 BW 12 EP 95 – ⁴⁄₆ Chance ihre Gegner zu überraschen; verliert man 50% der Lebensenergie, wird man mit Lykanthropie angesteckt; wer kein Mensch ist, stirbt daran in 2W6 Tagen; heilbar durch Kleriker der 11. Stufe
  4. 1 Ocker Schleim TW 5 RK 8 2W6 F3 ML 12 BW 3 EP 500 – Säure zersetzt Lederrüstung; Blitzschlag oder Waffenschaden teilen den Schleim in 1W4+1 kleine Schleime: TW 2 RK 8 1W6 F2
  5. 3W6 Gläubige TW 1 RK 9 1W6 NM ML 5 BW 12 EP 10 – normale Menschen
  6. 3W6 Rattenmenschen TW 1-1 RK 7 1W6 H1 ML 7 BW 9 EP 5 – wie Halblinge
  7. 1 Grauer Wurm TW 6 RK 6 1W8 F3 ML 9 BW 6 EP 570 – verschluckt Gegner bei 19–20: 1W8 autom. Schaden und es kann nur mit -4 und Dolch gekämpft werden
  8. falls der Boden nass ist: 1 Riesenegel TW 6 RK 7 1W6 F3 ML 10 BW 12 EP 570 – beisst sich fest und trifft ab dann jede Runde automatisch
    ansonsten: 1 Insektenschwarm TW 4 RK 7 NM ML 11 BW 3 EP 135 – verursacht jede Runde autom. 2 Schaden

In der Raumbeschreibung steht der Pfeil → für “weitere Untersuchungen zeigen…”

  1. Grosse Halle der Mutterratte → grosse Statue mit leuchtenden Augen → Kerzen hinter farbigem Glas. Zwei Wächterstatuen beim Eingang, sehen aus wie Rattenkrieger. Seitengänge → vorne rechts angeschrieben mit “Abufalia”, vorne links mit “Spenden” und Guckloch, hinten rechts siebenköpfiger Schlange → ein Zeichen für Set, hinten links mit acht Ratten → ein Zeichen für Nergal
  2. Tür ist angeschrieben mit “Schatzkammer” → Türangeln voller Schleim und Pilzen: diese Türe ist schon sehr lange nicht geöffnet worden → stechender Geruch am Türrahmen. Aufbrechen der Türe lässt giftiges Gas ausströmen: RW gegen Gift oder man wird ohnmächtig für 10 min. Türe aufbrechen und Falle auslösen: zwei Chancen für Monster! Ohnmächtige werden von der Hexe gefangen genommen und in #3 aufbewahrt
  3. viele leer stehende Käfige, viele davon hängen an Ketten → Bärenfallen am Boden sind mit Käfigen gekoppelt. Wer hineintappt: 1W6 Schaden und RW gegen Drachenodem oder man wird vom einem herabfallenden Käfig erwischt: weitere 1W6 Schaden
  4. Malereien schwarzer Tannenwälder und bedrohlicher Silhouetten an den Wänden → gegen #6 hin sieht man dunkle Schlitze links und rechts → darin stecken mehrere versilberte Sensen, welche mit Bodenplatten gekoppelt sind: je 1W6 Schaden für bis zu sechs Opfer; die Sensen entsprechen 1000 Silbermünzen, Mechanismus für die Sensen hat hochwertige Bestandteile: Zahnräder für 10 Gold, Stahlfedern für 50 Gold
  5. Studienzimmer der Hexe Abufalia TW 8 RK 9 2W6 F8 ML 8 BW 9 EP 1560 – nach Belieben: Schlaf, schwarzes Geschoss 2W8, Verwandlung in einen Troll: 1W6/1W6/1W10, Schädel, Tisch, Kräuter
  6. Altar der Hekate, Malereien von Trollen, dunklen Nadelwäldern, grauer Nebel
  7. vier menschliche Sklaven der Hexe graben eine Grube beim Eingang; hier entsteht ein Erweiterung ihrer Räumlichkeiten
  8. Türe von #1 angeschrieben mit “Spenden”. Guckloch → dahinter mit ⁴⁄₆ Chance nichts zu sehen → 8 Werratten TW 3 RK 7 1W6 F3 ML 8 BW 12 EP 95 – ⁴⁄₆ Chance ihre Gegner zu überraschen (Lykanthropie siehe oben); Regal mit versiegelten Tontöpfen → darin die gesammelten Spenden: 10000 Kupfer → die Hinterwand des Regals ist verputzt → dahinter eine uralte Steinmauer, welche man durchbrechen kann
  9. hinter der uralten Steinmauer eine Gruft mit 4 Sarkophagen → darin 4 Mumien TW 5+1 RK 3 1W12 F5 ML 12 BW 6 EP 860 – beim Anblick RW gegen Lähmung oder gelähmt, bis die Mumie entweder angreift oder geht; Grabbeigaben: goldene Zepter und goldene Kugeln im Gesamtwert von 6000 Gold, die Schriftrolle “Auflehnung des Imix” → Schutz vor Elementargeistern
  10. Tür von #8 angeschrieben mit “Abfall”; der Raum dahinter ist aber leer, die Tür zu #14 verriegelt
  11. Tür angeschrieben mit “Kein Feuer” → der Boden vor der Türe mit Spuren von Russ; der Raum gefüllt mit Gas: Kontakt mit Fackeln oder Laternen führt zu einer Explosion mit 6W6 für alle im Gang, RW gegen Drachenodem für halben Schaden → Erdspalt, aus dem langsam Gas austritt
  12. Gang und Raum mit knöcheltiefem Wasser, Kisten, Schlamm → stochern führt zu Knochen → darunter 1200 Silber und 200 Gold lose im Schlamm, Bergung dauert halbe Stunde: drei Chancen für Monster!
  13. Boden voller Schlamm, fauler Geruch
  14. Boden ein einziger Tümpel → ölige Flecken darauf, Schlamm → darin 1 Ocker Schleim TW 5 RK 8 2W6 F3 ML 12 BW 3 EP 500 – Säure zersetzt Lederrüstung; Blitzschlag oder Waffenschaden teilen den Schleim in 1W4+1 kleine Schleime: TW 2 RK 8 1W6 F2; Türe zu #15 mit Loch im unteren Viertel → erlaubt Durchkriechen ohne sie aufzubrechen
  15. wer durch das Loch in der Türe kriecht, wird automatisch überrascht: 1 Tentakelfresser an der Wand TW 3+1 RK 7 F2 ML 9 BW 12 – 8 Angriffe (!): RW gegen Lähmung oder für 20-40 Minuten gelähmt und später in Ruhe verspeist; ein toter Priester mit silbernen Waffen für 4000 Silber und einer Schriftrolle für Kleriker: “Psalm der Seeligen” → Schutz vor Bösem 10 Fuss Radius
  16. Schlamm → darunter rostige Krähenfüsse: 1 Schaden und RW gegen Gift oder Blut vergiftet (keine Heilung für eine Woche) → unter dem Schlamm eine Bodenplatte mit Grabstein von “Anselm der Rattenfänger” → im Grab 1200 Silber 200 Gold, Silberdiadem mit Saphiren 700 Gold, zwei Silberarmreife mit Saphiren je 1000 Gold, silberne Oboe 1300 Gold
  17. enger Gang → hohe Felswände → links und rechts neben der Türe hat es grosse Löcher an der Decke → Wurmspuren; im Raum 1 grauer Wurm (10m lang!) TW 6 RK 6 1d8 F3 ML 9 MV 6 – verschluckt Opfer bei 19–20: jede Runde autom. 1W8 Schaden, nur noch mit Dolch kämpfen, Angriff -4, Knochen und Abfälle → 10000 Kupfer, 4000 Silber, drei grosse Perlen je 75 Gold, Saphir 500 Gold, Smaragd 750 Gold, Silberring 40 Gold, schwarze Perlenkette 500 Gold
  18. viele Skelette um einen Brunnen, nähert man sich dem Brunnen, erhebt sich 1 Banshee TW 7 RK 0 1d8 F7 ML 10 EP 1490 – ihr Anblick löst Furcht aus: RW gegen Zauberei oder Flucht für 7 Runden; wer bleibt: RW gegen Tod oder ihr Heulen führt zum Herzstillstand
  19. erhöhter Boden und deswegen trocken
  20. Wasser knöcheltief, grosser Raum mit acht Statuen → acht Ratten der Apokalypse → Armut, Schwäche, Hunger, Durst, Seuche, Fäule, Gift und Tod. Nergals Racheflüche flüstern hier. Wer ihm Treue schwört und permanent einen Konstitutionspunkt opfert, wird Geweihter des Nergals (als Anfänger darf man eine Fähigkeit wählen: Wasser finden, Nahrung finden, Fäule, Herbeirufen von 1W10 Ratten)
  21. Grosses Nergal Heiligtum: Statue, Schalen, Töpfe → 1100 Silber
  22. 3 Werratten TW 3 RK 7 1W6 F3 ML 8 BW 12 EP 95 – ⁴⁄₆ Chance ihre Gegner zu überraschen (Lykanthropie siehe oben); Schreibtisch mit den aktuellen Plänen: Brunnen der Dörfer in der Nähe vergiften; unter dem einen Tisch Zugang zu einem kleinen, drehbaren Stein zu #23. Türe zu #25 verriegelt.
  23. Regale mit den Archiven der Nergal Priester → Namenslisten der Mitglieder in den diversen Dörfern der Umgebung, bezahlte Bestechungsgelder (meist in kleinen Rubinen)
  24. Geheimtüre von #30 ist von innen leicht zu sehen, Eimer und Seil, Wassertrog → daneben, ganz eng und kaum zu sehen: drehbarer Stein mit Geheimtüre zu #22
  25. Tür von #26 klemmt, wer sie aufbricht, ²⁄₆ Chance, 3m in die Tiefe auf ein paar Speere zu stürzen: 2W6 Schaden. Türe nach #22 von aussen verriegelt. Auf den Speeren eine Leiche mit versilbertem Helm: 1000 Silber
  26. leer, Türe nach #25 → unbenutzt und aufgequollen (Falle siehe #25)
  27. grosser Wassertempel mit Brücken über Kanäle, Schlangenstatuen → unter Wasser lauert 1 Wassernaga TW 7 RK 5 1W4 F7 ML 8 BW 9 EP 1140 – Zauber: Blitz 7W6, Illusion, Gedankenlesen, magisches Geschoss 1W6+1, Türen verschliessen, Schlaf 2W8 TW; die Echsendiener von #29 helfen ihr wenn möglich; Gaben: 10000 Kupfer, 8000 Gold, Silberring 50 Gold, Bernstein 250 Gold.
  28. Brutstätte der Echsendiener: Eier, Nester, warmes Wasser → darin Stolpergruben mit Speeren: 1W6 (²⁄₆ Chance hinein zu stolpern)
  29. Lager der 13 Echsenmenschen TW 2+1 RK 5 1W6+1 F2 ML 12 BW 6 EP 47; bewachen Brutstätte in #28 und Naga in #27; Anführer hat Trank des Gedankenlesens falls Bewaffnete Durchlass begehren
  30. grosser Brunnen ohne Eimer oder Seil → Wasser ist geniessbar → Baustil: Goblins; Steinwand zu #23 lässt sich hineindrücken und beiseite schieben
  31. Grabkammer mit 1 Gruftbewohner TW 3 RK 5 F3 ML 12 BW 9 – Treffer saugt eine Stufe! Kann nur durch Zauber oder durch silberne oder magische Waffen getroffen werden; sucht verzweifelt Zugang zur falschen Gruft im Osten und greift nur an, wenn er gestört wird
  32. verschlossene und ausgetrockneter Raum, in der Mitte ist eine silberne Glyphe gezeichnet → am Boden liegen tote Insekten; wer den Raum betritt: RW gegen Gift oder man wird Ohnmächtig und erstickt in den nächsten 10 min wegen fehlendem Sauerstoff; die Silberstücke, aus denen die Glyphe besteht: 1000 Silber. Wird die Glyphe zerstört, verbessert sich die Luft in einer halben Stunde: : drei Chancen für Monster! Insbesondere der Gruftbewohner aus #31 fühlt sich schnell gestört.

Tags: RSS

August 30, 2013 01:58 PM

August 25, 2013

Alex Schroeder

Safe Browsing

Today I installed HttpFox, an extension for Firefox which tells me which resources have been requested, what the responses where and so on. I noticed that I got a request for safebrowsing.clients.google.com. Hm. I checked Google Safe Browsing and wondered. I decided to deactivate it. Visit about:config and search for safebrowsing*enabled and set them all to false.

What do you think—overreaction? I didn’t find it on the EFF site. I wonder why.

Tags: RSS

August 25, 2013 08:35 PM

August 22, 2013

Alex Schroeder

Qelong vs. Points of Light

When I heard people say online that Quelong by Kenneth Hite was a great module, I was interested. 48 pages of A5 is my kind of size.

Until now I kept saying that Rob Conley’s Points of Light (4 settings, 42 letter-sized pages, reviewed on Dragonsfoot) and Points of Light 2 (4 settings, 59 letter-sized pages, also reviewed on Dragonsfoot) were the perfect hexcrawl products. The size was right. That’s about 25 A5 pages per setting. Thus, Qelong is about twice the size of a Rob Conley setting. If you want to get a feel for the Rob Conley settings, take a look at the Southland PDF. It’s available for free.

How does Qelong compare to the top hexcrawl? Here’s what I think.

Both provide a handful of pages of background, history, the major factions, how to integrate it into your campaign. The usual stuff, but short. I like short. I also like to know what the author intended to convey with the setting so that I can read the rest with the right mind set. I like to know whether it’s “hellish southeast Asia” (Qelong) or “embattled forces struggling to establish a home” (The Golden Shore, in Points of Light 2).

One thing I noticed was that the Qelong introduction referred to more faction details: “Myrmidons deranged and misdirected chew through the land, laying eggs in the river dwellers to hatch out more warriors. (See p.28 or [sic] details on the myrmidons.)” The effect was that while I was reading the introduction, I already eagerly leafed through the book, looking up details. It introduced me to the factions and made curious for more. Well done.

The Qelong introduction also has a table of 50 rumors and lets each character start with a random rumor; spending a handful of coins will let players roll again. I like it.

The Qelong introduction also features elaborate disease and magic poisoning rules that require purify food and drink, cure disease and remove curse spells. I think it’s very atmospheric but I’m not sure how well these poisoning rules work in play. We don’t keep track of rations, how will we keep track of poison levels?

Both Points of Light and Qelong describe geographic features. These are entire areas instead of single hexes with a specific description. In Points of Light most of these areas have one paragraph each, which is short. Qelong has more. It starts with a bold paragraph that could be read aloud or just provide the “in game” view. This is followed by another paragraph of background information that you don’t need at the table but which helps the referee understand what’s going on. And then there’s what I love: each geographic feature comes with a bullet list of suggested encounters.

Last year I posted an example from my Caverns of Slime module (free PDF) which used the same format. Here are some examples of varying size from Qelong:

  • A sampan with its bottom staved in. A Tinkering roll could repair it.
  • A carnivorous fish lives underneath the lotus field. Armor 13, 2 Hit Dice, bite 1d6. Or a school (2d8) of them.
  • The characters’ boat approaches a sunken tree. Anyone actively searching for dangers in the  water will notice it in time to take evasive action; otherwise it tears out the bottom of the characters’ boat, doing 1d10 shp [sic]. If the Referee wants to be a jerk, there is an ambush party of 1d6 naga-kin at the bottom of the river under the tree, waiting  for their dinner.

In addition to that, Qelong has a different random encounter table for each hex type. This is excellent.

Qelong also comes with its own monster section to describe the various new creatures. This is also excellent.

Qelong comes with a table of names (family names, female and male first names). Very useful if you’re providing us with a new culture.

Quelong also comes with a small list of new ships and including required crew, sailing miles/day, rowing miles/day, cargo (tons) and ship hit points—these must be the shp mentioned in the encounter with the sunken tree in the list above. I like it.

Is there anything Qelong doesn’t come with?

Both Points of Light and Qelong come with a list of locations. In Points of Light, these are sorted by hex coordinates: “1604 Unicorn Pool”. There are a fair number of them. Southland, for example, comes with 38 hex descriptions. Each one consists of one to five paragraphs, many settlements come with a little overview map (to be copied and handed out to your players, perhaps?). Characters only have class and level indicated: “Lord Mayor Thomes White (Ftr3)”, monsters just have their hit dice noted: “Clak and Frull, hill giant (9HD) brothers”, and in Points of Light 2 they have some D&D 4E descriptors as well: “rust monsters (level 5 controller)”.

In Qelong, which is about twice the size of a single Points of Light setting, there are only ten encounter areas. Each has two to five paragraphs, some come with extra information about important non-player characters or unique monsters. If characters or monsters are described in more detail, any treasure they have is also listed. I like the detailed Qelong encounter areas and even if there are only ten of them, I think it works out because Qelong, unlike the Points of Light settings, has an optional end to it.

Wow! I really must recommend Qelong. I agree with Zak’s review: “So yeah, Qelong is fucking good and stuff.”

The only thing I would have liked is no watermark on each page. Points of Light also has it, but it’s lighter. The Qelong watermark is dense in the bottom quarter of the page and slows me down when reading it. That’s the sum total of all non-badass points I have. ok

star star star star star

I have yet to add it to my running campaigns and I have no idea of how to do it. It would seem like a major break from current events.

Addendum: A review by Save vs. Total Party Kill.

Tags: RSS RSS RSS

August 22, 2013 09:28 AM

August 21, 2013

Alex Schroeder

One Roll Dungeon Stocking

When I stocked my dungeon yesterday, I used the Moldvay Dungeon Stocking procedure. To be honest, my wife used it. The two tables are somewhat confusing.

Moldvay:

CONTENTS TREASURE
d6Result d6Monster Trap Empty
1–2Monster 1Yes Yes Yes
3Trap 2Yes Yes No
4Special 3Yes No No
5–6Empty 4–6No No No

I couldn’t find a blog post translating Moldvay’s dungeon stocking table into a single table. I’m sure I saw it somewhere. That would have helped us. (Edit: I guess I was remembering this discussion of the OD&D restocking procedure by Sham.)

Let’s do it ourselves, then. Writing out all the results:

     1   2   3   4   5   6
 1   M$  M$  M$  M   M   M
 2   M$  M$  M$  M   M   M
 3   T$  T$  T   T   T   T
 4   S   S   S   S   S   S
 5   E$  E   E   E   E   E
 6   E$  E   E   E   E   E

Counting occurences:

#Contents and Treasure
6Monster and treasure
6Monster
2Trap and unguarded treasure
4Trap
6Special
2Unguarded Treasure
10Empty

Transforming this into a d36 table:

d36Contents and Treasure
1–6Monster and treasure
7–12Monster
13–14Trap and unguarded treasure
15–18Trap
19–24Special
25–26Unguarded Treasure
27–36Empty

Or divide it by two to get a d18 table:

d18Contents and Treasure
1–3Monster and treasure
4–6Monster
7Trap and unguarded treasure
8–9Trap
10–12Special
13Unguarded Treasure
14–18Empty

Too bad there is no such d18. We should change that to a d20 table. Let’s see if we can do it using Labyrinth Lord.

d100ContentsTreasure
01–30Empty 15%
31–60Monster 50%
61–75Trap 30%
76–00Unique var.
 We just multiply the percentages from the table:
ContentsWith TreasureNo Treasure
Empty 4.5%25.5%
Monster 15%15%
Trap 4.5%10.5%
Unique25%

We could simplify the above by rounding to increments of 5% and translating this to a d20, reusing the order from the d18 table:

d20Contents and Treasure
1–3Monster and treasure
4–6Monster
7Trap and unguarded treasure
8–9Trap
10–14Special
15Unguarded Treasure
16–20Empty

It’s very close to Moldvay, I’d say. And it’s probably less confusing. I can’t count the times I got confused by the Moldvay tables. :)

Reordering it for excitement, I guess:

d20Contents and Treasure
1–5Empty
6Unguarded treasure
7Trap and unguarded treasure
8–9Trap
10–12Monster
13–15Monster and treasure
16–20Special

I need to stick this into my campaign book.

Tags: RSS RSS

August 21, 2013 12:36 PM

Moldvay Dungeon Stocking vs. Seclusium

I had recently commented on The Seclusium of Orphone of the Three Visions, noting:

It’s a workbook, not a generator to be used at the table. It helps if you are slow and methodical like I am but would like to be pushed like I’d like to be pushed.

Some days have passed and here’s what happened. I knew an elven ruin was to contain a seclusium and and started working on one, using The Seclusium of Orphone of the Three Visions as my workbook, naming my seclusium the same, but not using the most fleshed out seclusium in the book of the same name. I was starting from scratch. I wrote a lot of stuff. Then I started sketching a map. Or was it? It’s more of a doodle, I guess. And I wrote notes, I read the book, I rolled some dice, walked away, came back, did it again, did it again. It was slow.

http://farm4.staticflickr.com/3689/9560177325_0edbc75ec3_c.jpg

Finally I decided that drawing a detailed map was going to be a major pain and started writing about the non-player characters still present. I ended up with interesting characters, but I was starting to grow suspicious. It had taken me an awful lot of time. And I started to feel that these dense scribbles would require a rewrite in order to be usable at the table. Too much of this text wasn’t going to be useful or was going to obscure the important bits.

http://farm3.staticflickr.com/2834/9560177751_a8999cf3ee_c.jpg

I guess some people might say that writing about these characters can be seen as “familiarizing myself” with the characters, getting to know them better, being able to play them better.

I decided that it was taking too long and switched to one of the semi-prepared seclusiums. I wondered: would I be saving time? I knew that some of the things were going to need rearrangement on the page, some things needed to be highlighted, so I tried keeping my notes more organized.

http://farm6.staticflickr.com/5486/9562968872_a981cc12fd_c.jpg

Soon, however, I started wondering about a map. Should I just draw a flow chart? Or simply have a list of locations and allowing player to move at will between the various sections—much like I use my hex maps. Move at will between locations, distance is proportional to the number of potential random encounters. I decided I was going for a few details on some larger index cards. I was tempted to draw more details, doing it the old school way. I tried to counter this by drawing sloppily. And no take backs, no pencil. Use the pen.

http://farm8.staticflickr.com/7292/9563077772_925640596d_c.jpg

I wasn’t happy. I left it lying around for another day or two. Game day was coming up. And I had nothing.

In the two hours before the upcoming session, between preparing dinner, talking to my wife and munching, I decided to just pull out one of the maps by Paratime Design Cartography. I don’t always like the maps, some are too simple, some are awesome and intimidatingly complex for an hour of stocking, but I finally settled on half of Dungeon Map 80 which you should find on page 4 of the Dungeon Map gallery.

I started with a list of random encounters. This was supposed to be a temple to the god of the dead and the diseased, Nergal, lord of the Underworld. The temple itself was being run by wererats keen on poisoning wells and spreading lycanthropy. I used my pen to add more steps, add mud and pools. It was fun doing this.

Then I pulled out Moldvay Basic Dungeon Stocking table (Michael Curtis at one point discussed its genius) and had my wife roll like crazy. As she called out “Empty! No treasure. Monster! Treasure!” I scribbled like crazy.

http://farm4.staticflickr.com/3753/9562968592_d59ecc0024_c.jpg

As you can see, I still had two specials, three monsters and three traps to provide, but I felt ready to rock and roll!

This works.

The irony of preparing for a session is that players don’t do what you expect them to do. They don’t even do what we agreed upon doing by email a few days ago.

  1. they skip the dungeon I had frantically stocked in the two hours leading up to the session
  2. they visit the elven ruin where I had planned The Seclusium of Orphone of the Three Visions.

I was going to find out whether my premonitions were correct. And they were! The wall of scribbled text was impossible to read—I basically limited myself to the map doodle and whatever I had written on it. The non-player characters came up but I could have characterized them with four words each and it would have worked just as well.

I end up agreeing with the quick review written by Zak S. Going forward, I will “raid it more than use it.” Maybe it makes good material for the special rooms indicated by the Moldvay dungeon stocking procedure.

(Damn, scanning and cropping all these images took way too long!)

Tags: RSS RSS

August 21, 2013 11:51 AM

August 20, 2013

Alex Schroeder

Public Key Fiasco

I got my first encrypted email in years. I use GnuPG.

  1. I didn’t have the necessary secret key available. I found it in an old backup I still had available.
  2. I didn’t know the passphrase required to use the secret key I just found. I tried guessing for a while, to no avail.
  3. I wanted to revoke the secret key or change it’s expiry. That requires the unknown passphrase.

This is stupid. #fail

Sad story from the distant past: In 2005 my old keys appeared not to work when I tried sending email to a friend. When we don’t use these tools every now and then, we won’t be able to use them when it’s required of us.

As I considered my setup, I decided I might want to upgrade my GnuPG 1.4.9 installation. Building it myself… it requires libassuan, libksba, the GNU Portable Threads Library, iconv, and libgpg-error. Starting all the jobs and realizing that iconv doesn’t install. Fuuuuuu!

I think I will do a Backup of the system and install Homebrew. And then, at last, after many hours, no doubt, I’ll brew gpg.

As the backup is being made, I discover an old revocation certificate for the damn key without a passphrase. And it works!

On the key servers:

gpg: suche nach "kensanata" auf hkp-Server keys.gnupg.net
(1)	Alex Schroeder <alex@gnu.org>
	Alex Schroeder <alex@emacswiki.org>
	Alex Schroeder <kensanata@gmail.org>
	Alex Schroeder <alex.schroeder@openlaw.ch>
	  1024 bit DSA key 89D0FBCC, erzeugt: 2006-06-26 (widerrufen)
(2)	Alex Schroeder <alex@gnu.org>
	Alex Schroeder <alex@emacswiki.org>
	Alex Schroeder <kensanata@gmail.com>
	  1024 bit DSA key 353AEFEF, erzeugt: 2002-07-10
(3)	Alex Schroeder (Kensanata) <alex@gnu.org>
	  1024 bit DSA key 23AAC850, erzeugt: 2001-04-12

Key status:

pub   1024D/353AEFEF 2002-07-10 [verfällt: 2015-08-20]
uid                  Alex Schroeder <kensanata@gmail.com>
uid                  Alex Schroeder <alex@emacswiki.org>
uid                  Alex Schroeder <alex@gnu.org>
uid                  [jpeg image of size 5665]
sub   4096R/363A61EE 2013-08-20 [verfällt: 2015-08-20]

pub   1024D/89D0FBCC 2006-06-26 [widerrufen: 2006-06-26]
uid                  Alex Schroeder <alex@emacswiki.org>
uid                  Alex Schroeder <alex@gnu.org>
uid                  Alex Schroeder <kensanata@gmail.org>
uid                  Alex Schroeder <alex.schroeder@openlaw.ch>

pub   1024D/23AAC850 2001-04-12 [verfallen: 2002-04-12]
uid                  Alex Schroeder (Kensanata) <alex@gnu.org>

353AEFEF and 363A61EE are the ones to use. :) ok

Tags: RSS

August 20, 2013 09:34 AM

August 19, 2013

Alex Schroeder

Skills Inspired By Apocalypse World

Recently I was writing about The Seclusium of Orphone of the Three Visions and forgot to mention the house rules appendix at the very end. On those two pages, Vincent Baker introduces his favorite form of perception test—essentially a skill system.

Example:

When you size a situation up, roll 2d6 and add your Wisdom modifier. On a 10+, ask me three questions. On a 7–9, ask two. On a 3–6, ask one:

  • Who’s in control here?
  • What’s my best approach?
  • What’s my best exit?
  • How could I assert my own dominance?
  • How could I disarm the situation?
  • If the situation proceeds unaltered, what will happen?

On a 2 or less, you stand gawping.

You can ask more, or questions of your own devising, if you’re willing and able to stand musing while the situation unfolds. If you have a positive Wisdom modifier, you can also ask one question without rolling, and roll only if you decide to ask further.

This write-up follows the famous Apocalypse World approach that has been used for a gazillion indie games. They all offer a number of “basic moves” (skills) which anybody may use and a number of moves from “your playbook” (your class-specific skill list). You roll 2d6 and add a modifier. 10+ is a success, 7–9 is a lesser success, everything else is a failure. The ones I am concerned with come with a list of possible results and players pick one or more from the list depending on their degree of success.

Here’s an example basic move from Apocalypse World. As you can see, the list of possible results only comes into effect on a lesser success. It’s a way to suggest possible partial successes—a list of possible compromises, if you will:

When you go aggro on someone, roll+hard. On a 10+, they have to choose: force your hand and suck it up, or cave and do what you want. On a 7–9, they can instead choose 1:

  • get the hell out of your way
  • barricade themselves securely in
  • give you something they think you want
  • back off calmly, hands where you can see
  • tell you what you want to know (or what you want to hear)

I like it very much! I like how we can agree on a list of possible results and depending on how successful we are, one or more of these results can be picked by the player. It takes automatically forces people to compromise and if the moves are well written, they will often involve difficult choices.

Unfortunately I still don’t like skill systems.

  • sometimes they encourage players to stare at their character sheet when faced with a problem
  • sometimes they change our default assumptions (the famous example of knights falling off their horses as soon as a Ride skill is introduced)
  • sometimes I prefer to handle social situations by talking or as simple puzzles

However, there still is a decent amount of rolling the six sided die in my game in order to find traps and secret doors or to attempt funky things I personally find implausible. Perhaps it would be cool to have a number of these lists of possible results and giving players the option to choose?

If you want to disarm a known trap, roll 2d6+Dex bonus. Pick three results on a 10+, pick one result on a 7–9. Unless you choose to avoid it, the trap will be triggered and the referee will check for wandering monsters.

  • you are quick and avoid the wandering monster (if any)
  • you disarm it (allowing anybody to bypass the trap)
  • you arm it (useful after having disarmed and bypassed the trap)
  • you extract the poison needle or gas-filled glass bottle (if available)
  • you know who built this (kobolds, dwarves, elves, humans)
  • you know how old this is (when it was built, when it was armed)

Perhaps I’m reinventing Dungeon World? Apparently that’s a D&D variant built using the Apocalypse World “engine”. In fact, the InDesign source files are on GitHub and look like readable HTML. For those that already own Apocalypse World, check out the Dungeon World Hack.

The trap disabling equivalent in Dungeon World is this:

When you pick locks or pockets or disable traps, roll+DEX. • On a 10+, you do it, no problem. • On a 7–9, you still do it, but the GM will offer you two options between suspicion, danger, or cost.

The above example seems less specific than what I would like. Perhaps I just started out with the wrong example?

The skill system introduced in the house rule appendix from The Seclusium of Orphone of the Three Visions is the most interesting skill system I have found because of the compromises it suggests for lesser successes. I’m not sure that’s enough to make me add it to my own game. It’s enough to make me consider playing a game of Apocalypse World or one of its variants (“hacks”).

Tags: RSS RSS

August 19, 2013 12:50 PM

August 18, 2013

Phil Jones (Smart Disorganized)

August 15, 2013

Alex Schroeder

Webhosting in Switzerland

I’m considering the move of my web space to Switzerland. Any recommendations?

I’ve had the following recommendations:

  • Geekserver by Cyon at 39.–/month (25 GB disk, 1 GB RAM, 1 TB traffic, Debian)
  • Virtual Private Server by hostfactory at 24.10/month (20 GB disk, 512 MB RAM, unknown traffic, Debian), increase to 31.70/month (25 GB disk, 1 GB RAM, unknown traffic, Debian)
  • VRS Micro by EDIS at 1.45€/month (2 GB disk, 256 RAM, 0.5 TB traffic , Debian), increase to 8.00€/month for Basic (24 GB disk, 1 GB RAM, 4 TB traffic, Debian)

Currently 1.00 CHF is about 1.07 USD, apparently.

Tags: RSS

August 15, 2013 11:29 AM

August 14, 2013

Alex Schroeder

Comments on this Wiki Blog

I’ve done a few changes. Let’s see whether it works out.

  1. when viewing ordinary pages, previous comments and the comment form are shown ← this is what I wanted to add
  2. people who follow the RSS feeds will therefore easily find the obvious comment form when following the link ← this is what I hope to achieve
  3. when leaving a comment, you end up on the comment page, which might be confusing
  4. when looking at RecentChanges, which has some extra magic associated with its name, the comments are not shown
  5. when looking at older revisions, the page history, and many other variants, the comments are not shown
  6. when looking at a journal page such as Diary, the comments are not shown
  7. when looking at a journal page such as Diary, you can still see links to inline the comment page
  8. inlined comment pages don’t come with an automatic comment form—you need to click on the “Add comment” link at the end
  9. comment pages are still excluded from the usual feeds (I wonder whether I should change this)

I think the Wiki + Blog combo still works. I’m just trying to make it less weird. :)

Source code for your config file, if you’re an Oddmuse user. The source code below also includes my Google +1 setup (Oddmuse:Google Plus One Module) because my code needs to avoid the situation where a page shows two +1 buttons. As for comments within journals, I use Oddmuse:Dynamic Comments Extension.

# Google +1 list

push(@MyAdminCode, sub {
       my ($id, $menuref, $restref) = @_;
       push(@$menuref, ScriptLink('action=plusone',
				  T('Google +1 Buttons'),
				  'plusone'));
     });

$Action{plusone} = \&DoPlusOne;

sub DoPlusOne {
  print GetHeader('', T('All Pages +1'), ''),
    $q->start_div({-class=>'content plusone'});
  print $q->p(T("This page lists the twenty last diary entries and their +1 buttons."));
  my @pages;
  foreach my $id (AllPagesList()) {
    push(@pages, $id) if $id =~ /^\d\d\d\d-\d\d-\d\d/;
  }
  splice(@pages, 0, $#pages - 19); # last 20 items
  print "<ul>";
  foreach my $id (@pages) {
    my $url = ScriptUrl(UrlEncode($id));
    print $q->li(GetPageLink($id),
		qq{ <g:plusone href="$url"></g:plusone>});
  }
  print "</ul>";
  print $q->end_div();
  PrintFooter();
}

# two step Google +1 button to protect your privacy
# http://my.opera.com/QuHno/blog/adding-the-google-1-button-to-a-webpage-without-violating-the-users-privacy

*MyOldGetCommentForm=*GetCommentForm;
*GetCommentForm=*MyNewGetCommentForm;

sub MyNewGetCommentForm {
  return MyOldGetCommentForm(@_) . q{
<script type="text/javascript">
function loadScript(jssource,thelink) {
   var jsnode = document.createElement('script');
   jsnode.setAttribute('type','text/javascript');
   jsnode.setAttribute('src',jssource);
   document.getElementsByTagName('head')[0].appendChild(jsnode);
   document.getElementById(thelink).innerHTML = "";
 }
 var plus1source = "https://apis.google.com/js/plusone.js";
</script>
<p id="plus1">
  <a href="javascript:loadScript(plus1source,'plus1')">
    <img src="/pics/plusone-h24.png" alt="Show Google +1" />
  </a>
</p>
<!-- <g:plusone></g:plusone> -->
<div class="g-plusone" id="my_plusone"></div>
<script type="text/javascript">
  document.getElementById("my_plusone").setAttribute("data-size", "medium");
  document.getElementById("my_plusone").setAttribute("data-href", document.location.href);
</script>
};
}

# make sure journal pages set a global variable which we then use to
# hide the comment form

*MyOldPrintJournal = *PrintJournal;
*PrintJournal = *MyNewPrintJournal;

my $MyPagePrintedJournal;

push(@MyInitVariables, sub {
       $MyPagePrintedJournal = 0;
     });

sub MyNewPrintJournal {
  $MyPagePrintedJournal = 1;
  return MyOldPrintJournal(@_);
}

# list comments and comment form at the bottom of every normal page

*MyOldPrintFooter = *PrintFooter;
*PrintFooter = *MyNewPrintFooter;

sub MyNewPrintFooter {
  my ($id, $rev, $comment) = @_;
  if (!$MyPagePrintedJournal
      and GetParam('action', 'browse') eq 'browse'
      and $id and $CommentsPrefix
      and $id ne $RCName
      and $id !~ /^$CommentsPrefix(.*)/o) {
    my $target = $CommentsPrefix . $id;
    my $page = '';
    $page = PageHtml($target) if $IndexHash{$target};
    print $q->div({-class=>'comment'},
		  $q->h2(T('Comments')),
		  $page);
    # don't include Google +1 button twice
    print MyOldGetCommentForm("$CommentsPrefix$id", $rev, $comment);
  }
  MyOldPrintFooter(@_);
}

Tags: RSS RSS RSS

August 14, 2013 03:13 PM

August 11, 2013

Alex Schroeder

Chilling Effects

Yesterday I wanted to google for a cartoon in order to show it to my wife. I joked that the keywords would probably get me on a watch list. My wife said I was a fool to use those search terms. Did I need to “prove” myself by googing those terms? When I said that if I stopped looking for information using those terms, I was already accepting that the police state is real. She said, thanks for making it harder for me, should I want to visit the United States again.

Needless to say, the argument was a bit longer and a perfect Saturday was ruined with a late night discussion about the current state of the world surveillance society.

Recommended reading: Restoring Trust in Government and the Internet by Bruce Schneier.

Tags: RSS RSS

August 11, 2013 09:02 PM

August 08, 2013

Alex Schroeder

Looking for New Games

For a while we had a biweekly game of one-shots going where we usually played some indie games that Lior brought. (Campaign:MontagInZürich.) Then I grew tired of it and felt like perhaps we needed a long-term campaign. Harald started running his Campaign:Karameikos for us. Weeks have passed and slowly I’m recovering from my indie burnout. I'm looking for new games!

I basically stopped caring after Apocalypse World and Fiasco came out. I remember a session of How We Came To Live Here and Monster Hearts. People had started talking about Dungeon World. I remember hearing about the Napoleonic role-playing games Duty & Honor and Beat To Quarters.

Things I’m currently interested in:

What else should I be looking at?

I don’t think that I need more dungeon explaration games on my list since I’m happy with classic D&D as it is. Thus, no Dungeon World variants, no Torchbearer.

Tags: RSS

August 08, 2013 06:26 AM

August 07, 2013

Alex Schroeder

Magic Swords

Jeff Rients was looking for magic swords named after rock ‘n’ roll songs, “preferably metal.”

Looking at my most played titles on last.fm, I don’t see any heavy metal songs. We’ll see what we can do anyway.

High Lonesome
Sword +1/+3 fighting alone; if you do fight alone, a dirge starts playing softly as soon as you draw the blade.
The 59 Sound
Glowing sword +1; once the sword is drawn, every damage roll of 5 or 9 increases the energy level of the sword; once the energy level reaches 10, a huge flash of light erupts from the blade and thunder rolls across the landscape; everybody within 60 ft. including the wielder needs to save vs. paralysis or drop unconscious for one turn. The energy level drops back to zero when sheathed or when not used in combat for one turn.
Meet Me By The River's Edge
Sword +1/+3 vs. former loved ones; allows wielder of unsheathed sword to walk on water while fighting; allows wielder to draw a line or a circle in the water causing a wall of water to rise: save vs. dragon breath or take 1d6 damage and be stunned for one round (the line extends for 100ft if a line is drawn).

The energy level of 10 needs some play testing, I think. Should the energy level drop after a flash or should those that don’t fail their save be able to pick up the glowing sword and continue blasting? What about the envious sword “vs. formed loved ones” – I’m sure that doesn’t happen too often in a game.

Tags: RSS RSS

August 07, 2013 11:24 AM

Phil Jones (Smart Disorganized)

Xiki

This looks very interesting :



I laughed when I first saw it, said "it's like Emacs". Seems Emacs is involved somehow. Also reminds me of Enso.

by noreply@blogger.com (phil jones) at August 07, 2013 03:46 AM

August 06, 2013

Alex Schroeder

The Seclusium of Orphone of the Three Visions

http://farm4.staticflickr.com/3820/9402917638_614db6546c.jpg

I wrote this on Google+ and it grew and grew and now I think I should put it on my blog as well.

I’ve been using Vincent Baker’s The Seclusium of Orphone of the Three Visions to work on an upcoming adventure (which I haven’t finished, yet). Before buying it, I had heard that it was “organized into fairly poorly designed tables and lists and multiple choice locations that make the creation of these dungeons harder and slower than they need to be while not gaining a lot from being presented in that format” [1], the layout was “atrocious” and that almost all tables ended with “or another of your own creation” which was said to be “irritating”. [2] (A full quote is on the comment page.) Others just said “all I hoped it would be and more” and “super fucking cool” without exactly saying why. [3] [4] [5] Here’s why I think you might want to buy it.

James Raggi said that the layout worked very well in the physical book, i.e. a two page layout. I tried reading the PDF on my tablet using the “two pages, with cover page” setting and it worked very well. The columns flowing across pages didn’t bother me. The tables also had enough options such that “or another option of your own devising” didn’t bother me.

Unfortunately working through the Seclusium doesn’t provide you with material on the level of an old school dungeon crawl. There are no maps, no stats for monsters, no ready spell books to find. If those are concerns for you, I think you’ll be happy to find lots of maps to start with at Paratime Design Cartography. Thank you, Tim Hartin. As for monsters, I’m sure you’ll be able to use any monster manual or creature generator such as James Raggi’s The Random Esoteric Creature Generator. Personally, I stick to the monster manuals. Finally, spellbooks. If you need some non-standard spells, I’ll suggest Theorems & Thaumaturgy by Gavin Norman. Having all the scrolls be from a dedicated strange and new school of magic works for me. I don’t think I’ll require magic users to switch class to use them. After all, I use the restrictive interpretation of the B/X spellbook rule: Magic users and elves may only know or master as many spells as their spells/day.

That leaves the question of prep efficiency with The Seclusium of Orphone of the Three Visions.

I agree, reading the tables and rolling or picking entries, writing down the results, then rolling on further tables takes a long time. I entered my endeavor with some notion of what I wanted, so perhaps that helped. You only roll for the parts you’re missing. Even then, it’s slow. You’ll discover that there is a keeper of the pantry and buttery still around. Later, there’s table for mundane people in the seclusium, ouside of the seclusium, magical entities, and so on. It takes a lot of rolling and leafing around if you want to do it by the book. How much better would a huge “all in one” table be with type, job, attributes as columns notes – roll once and use the entire row or roll multiple times and combine. That would have been faster to use. Is that how Vornheim does it?

The Seclusium of Orphone of the Three Visions doesn’t work like that. It’s more of a workbook, helping you think it through, methodically. Do you care about the looks of the wizard? The eyes? Did you consider the outhouses? The people who worked there? The guests? Prisoners? What about magical entities? How about geographical features? Portals? Artifacts? Did you consider any drawbacks they might have? Does your seclusium contain an inner sanctum reserved for the wizard? How is it protected? And so on. It’s slow reading because it works like a checklist. Did you think of this? And this? How about this? And if your inner voice says “hm, didn’t think of that, but this could be cool…” then the book goes on to provide you with a table of 12 or 20 things to use.

Yes, not all of the things might seem immediately useful. I don’t really care about the eyes of the wizard nor the quality of their vestments, nor for their hairdo. Then again, perhaps I should. Perhaps it will change the way it all plays out. It pushes me to places I haven’t been before.

I don’t know about you, but here’s something I’ve hardly ever mentioned. There is a moment of shyness in my imagining. A fear of being an idiot. Of repeating myself. Of mundane and boring encounters, of cheap shots. This fear is fed by improvisation at the table. Sometimes I need something quick and I don’t mind and I spew forth NPC names and corridors and magic effects and I love it. Later, I’ll wonder whether these things are not all pale shadows of the same ol’ Alex game that I’ve been running ever since I learned about roleplaying games. Am I repeating myself? This is why I like to use material by other people. It pushes me to places I wouldn’t have thought of. Even if the ideas presented by other people are mundane and boring, they’re different from my own mundane and boring.

Here’s another thing: I prep “just in time” and therefore it’s always possible that the players venture into territory I didn’t prepare. There will be no random encounter tables for this region, no lairs, … and I improvise quickly. But perhaps I’ll improvise something level appropriate? Something everybody expected. Something boring. Again, using other people’s products provides a sort of external reality to my fantasy world. If The Seclusium of Orphone of the Three Visions says that most of the wizards have access to other worlds, then I feel good about it. On my own, my suppressed id can’t express itself. It’s all tempered by years of “traditional” fantasy. I’ll read up on the gate spell and on permanency and I’ll bog myself down. I’ll forget about the free form rituals and pacts that take are unconstrained by the rules. This is where a book only slightly constrained by the rules (Lamentations of the Flame Princess) shines. It pushes me and tells me “it’s OK.”

Anyway, The Seclusium of Orphone of the Three Visions works for me. It’s a workbook, not a generator to be used at the table. It helps if you are slow and methodical like I am but would like to be pushed like I’d like to be pushed.

Addendum: 2013-08-19 Skills Inspired By Apocalypse World, where I talk about the house rules presented in the appendix. 2013-08-21 Moldvay Dungeon Stocking vs. Seclusium, where I talk about the procedure being extremely slow, unfortunately.

Tags: RSS RSS

August 06, 2013 09:40 AM

August 05, 2013

Alex Schroeder

Character

Recently, Jason Morningstar was wondering on Google+ about characters having independent lives from their players. I guess I didn’t really understand what he wanted to get at. It did remind me of two things I’ve been doing in recent years, however.

When playing a Pendragon character, a high trait score (16 or more) will force players to roll in appropriate situations. And once they roll, the roll determines the character’s reaction. Sir Aliduke, for example, is so proud that in any given situation where pride or modesty are relevant, 80% of the time he’ll pick proud. My players come from a D&D background and they all adapted to this way of playing without complaining. Most felt it was a refreshing change of pace.

In addition to that, I enjoy the moment where I, as a player, realize that this particular character would never or always do something particular. I like the realization that the character is not just the player. As a player, I like a certain randomness at first. As things happen and my character reacts in insignificant ways, I take note. As play continues, I treat these fragments as prescriptions (not just descriptions). I’ll note “ORDER AND PROGRESS!”, for example, once my character shouted a vapid phrase in response to a crisis. And suddenly the character was discovered in play to be a buffoon that repeats vapid phrases and likes to shout them in critical situations. The important parts, I think, are not designing or building a character this way, and to write down early random moments as prescriptions.

I few years ago I wrote about this process thinking about “front-loading” character creation: Character Backgrounds.

Tags: RSS

August 05, 2013 12:22 PM

Phil Jones (Smart Disorganized)

QuoraGrabber is Dead!

Long live RSS Backup!
Really, a separate script / project just to back-up Quora is overkill. Now I have a more general script for backing up from any RSS feed. (Which I'll be able to use to ensure I have copies of what I write here and on Composing.)
I also made it a bit saner at keeping the useful HTML markup (ie. links etc.)
It's on GitHub.

by noreply@blogger.com (phil jones) at August 05, 2013 02:28 AM

August 03, 2013

Phil Jones (Smart Disorganized)

Modularity At Fine Granularity

Ian Bicking has a fascinating question. I'm just going to quote the whole thing because it's so good and important : 
The prevailing wisdom says that you should keep your functions small and concise, refactoring and extracting functions as necessary. But this hurts the locality of expectations that I have been thinking about. Consider:


function updateUserStatus(user) {
if (user.status == "active") {
$("<li />").appendTo($("#userlist")
.text(user.name)
.attr("id", "user-" + user.id);
} else {
$("#user-" + user.id).remove();
}
}

Code like this is generally considered to be terrible – there’s logic for users and their status, mixed in with a bunch of very specific UI-related code. (Which is all tied to a DOM state that is defined somewhere else entirely — but I digress.) So a typical refactoring would be:


function updateUserStatus() {
if (user.status == "active") {
displayUserInList(user);
} else {
removeUserFromList(user);
}
}

With the obvious definition of displayUserInList() and removeUserFromList(). But the first approach had certain invariants that the second does not. Assuming you don’t mess with the UI/DOM directly, and assuming that updateUserStatus() is called when it needs to be called, the user will be in the list or not based strictly on the value of user.status. After refactoring there are functions that could be called in other contexts (e.g., displayUserInList()). You can look at the code and see that particular things happen when updateUserStatus() is called, but it’s not as easy to determine what is going to happen when inspect the code from the bottom up. For instance, you want to understand why things end up in
    — you search for #userlist but you now get two functions instead of one, and to understand the logic you have to trace that back to the calling function, and you have to wonder if now or in the future anyone else will call those functions. The advantage of the first function is that blocks of code are strict. You execute from the top to the bottom, with clear control structures. When GOTO existed you couldn’t reason so well, but we’ve gotten rid of that! (Of course there are still other exceptions.) It’s not entirely clear what intention drives the refactoring (besides adherence to conventional standards of code beauty), but it’s probably more about code organization than about making the control flow more flexible. Extracting those functions means that you now have the power to make the UI inconsistent with the model, and that hardly seems like a feature. And I have to wonder: are some of these basic patterns of “good” code there because we have poor tools for code organization? We express too many things with functions and methods and classes (and perhaps modules) because that’s all we have. But those are full of unintended semantic meaning. Anyone have examples of languages that have found novel ways of keeping code organized?
    So, it's a great question on modularity where we tend not to have much explicit thinking : down at the smaller granularity (compared to all the patterns for classes etc.) My immediate comment is that if Ian refactored his code like this :


    function updateUserStatus() {
    var id = "user-"+user.id;
    if (user.status == "active") {
    addToList("#userlist",user.name,id);
    } else {
    removeFromList("#userlist",id);
    }
    }

    it would solve most of the problems. In this version we aren't fussily creating extra functions for tiny fragments of functionality which are only relevant to narrow situations (ie. users, userlists). Now the new functions are more generic and widely applicable. They're doing enough that it's worth the overhead of creating them. They're still usefully hiding the bit of complexity we DON'T want to think about here - the actual jQuery / HTML details of how lists are constructed - but they're leaving the important details - WHICH list we're updating and what parts of a user we show - in this locality rather than allowing it to become diffuse across the program. Of course, we can't prevent another bit of code updating the list itself somewhere. (That's more a quirk of the HTML environment where the DOM is global. In many analogous cases we could prevent most of the code having unauthorized access to a list simply by making it private within a class.)

    by noreply@blogger.com (phil jones) at August 03, 2013 09:47 PM

    August 02, 2013

    Alex Schroeder

    Fetchmail and Gmail

    I’m using fetchmail to keep a copy of all my Gmail stuff.

    defaults mda "/usr/bin/procmail -d alex"
      fetchsizelimit 0
      limit 0
    poll pop.gmail.com protocol
      pop3
      username "kensanata@gmail.com"
      password "..."
      keep
      ssl 

    The reason for the mda lines up there is that I don’t have a working mail installation on this machine, I think. I haven’t touched this file in a long time.

    Anyway, I’ve noticed this output:

    fetchmail: Server certificate verification error: unable to get local issuer certificate
    fetchmail: Server certificate verification error: certificate not trusted
    577 messages (451 seen) for kensanata@gmail.com at pop.gmail.com (59586522 octets).
    skipping message kensanata@gmail.com@gmail-pop.l.google.com:1 not flushed
    skipping message kensanata@gmail.com@gmail-pop.l.google.com:2 not flushed
    skipping message kensanata@gmail.com@gmail-pop.l.google.com:3 not flushed
    ...
    skipping message kensanata@gmail.com@gmail-pop.l.google.com:449 not flushed
    skipping message kensanata@gmail.com@gmail-pop.l.google.com:450 not flushed
    skipping message kensanata@gmail.com@gmail-pop.l.google.com:451 not flushed
    reading message kensanata@gmail.com@gmail-pop.l.google.com:452 of 577 (15255 octets) not flushed
    reading message kensanata@gmail.com@gmail-pop.l.google.com:453 of 577 (3280 octets) not flushed
    reading message kensanata@gmail.com@gmail-pop.l.google.com:454 of 577 (29028 octets) not flushed
    ...
    reading message kensanata@gmail.com@gmail-pop.l.google.com:575 of 577 (4631 octets) not flushed
    reading message kensanata@gmail.com@gmail-pop.l.google.com:576 of 577 (2284 octets) not flushed
    reading message kensanata@gmail.com@gmail-pop.l.google.com:577 of 577 (47301 octets) not flushed

    What are these 451 “seen” messages doing? Can I get rid of them? Have I downloaded these before? Rerunning fetchmail keeps telling me about the 451 seen messages and downloading a new set of mails. It’s weird.

    Tags: RSS RSS RSS

    August 02, 2013 07:27 PM

    August 01, 2013

    Phil Jones (Smart Disorganized)

    Alan Kay

    This is a great presentation by Alan Kay; the spirit lurking behind Bret Victor.

    by noreply@blogger.com (phil jones) at August 01, 2013 07:29 PM

    The Future Of Programming

    Bret Victor has another classic talk up :

    Bret Victor - The Future of Programming from Bret Victor on Vimeo.



    Watch it. The conceit is entertaining, from his clothes to the overheads.


    However, despite the brilliance of the presentation, I think he might be wrong. And the fact that it's taken 40 years for these promising ideas NOT to take off, may suggest there are some flaws in the ideas themselves.

    Coding > Direct Manipulation

    Like most visually-oriented people Bret gives great importance to pictures. If I remember correctly, something like 33% of the human brain is visual cortex and specialized in handling our particular 2D + depth way of seeing. So it's hardly surprising that we imagine that this kind of data is important or that we continually look for ways of pressing that part of the brain into service for more abstract data-processing work.

    However, most data we want to handle isn't of this convenient 2D or 2.5D form. You can tell this because our text-books are full of different kinds of data-structure, from arrays, lists and queues, to matrices of 2, 3 and higher dimensions, to trees, graphs and relational databases. If most data was 2D, then tables and 2D matrices would be the only data-structures programmers would ever use, and we'd have long swapped our programming languages for spreadsheets.

    Higher dimensional and complex data-structures can only be visualized in 2, 2.5 or even 3 dimensions by some kind of projection function. And, Bret, to his credit has invented some ingenious new projections for getting more exotic topologies and dynamics down to 2D. But even so, only a tiny proportion of our actual data-storage requirements are ever likely to be projectable into a visual space.

    Once you accept that, then the call for a shift from coding to direct manipulation of data-structures starts to look a lot shakier. Right now, people are using spreadsheets ... in situations which lend themselves to it. Most of the cases where they're still writing programs are cases where such a projection either doesn't exist or hasn't been discovered (in more than 30 years since the invention of the spreadsheet).

    Procedures > Goals / Constraints

    It seems like it must be so much easier to simply tell the computer what you want rather than how to do it. But how true is that?

    It's certainly shorter. But we have a couple of reasons for thinking that it might not be easier.

    1) We've had the languages for 40 years. And anyone who's tried to write Prolog knows that it's bloody difficult to formulate your algorithms in such a form. Now that might be because we just don't train and practice enough. But it might be genuinely difficult.

    The theoretical / mathematical end of computer science is always trying to sell higher-level abstractions which tend in the direction of declarative / constraint oriented programming, and relatively few people really get it. So I'm not sure how much this is an oversight by the programmer community vs. a genuine difficulty in the necessary thinking.

    2) One thing that is certain : programming is very much about breaking complex tasks down into smaller and simpler tasks. The problem with declarative programming is that it doesn't decompose so easily. It's much harder to find part solutions and compose them when declaring a bunch of constraints.

    And if we're faced with a trade-off between the virtue of terseness and the virtue of decomposability, it's quite possible that decomposibility trumps terseness.

    There may be an interesting line of research here : can we find tools / representations that help in making declarative programs easier to partially specify? Notations that help us "build-up" declarations incrementally?

    3) I have a long-standing scepticism from my days working with genetic algorithms that might well generalize to this theme too. With a GA you hope to get a "free lunch". Instead of specifying the design of the solution you want (say in n-bits), you hope you can specify a much shorter fitness function (m-bits) and have the computer find the solution for you.

    The problem is that there are many other solutions that the computer can find, that fit the m-bit fitness function but aren't actually (you realize, retrospectively) the n-bit solution that you really want. Slowly you start building up your fitness function, adding more and more constraints to ensure the GA solves it the right rather than wrong way. Soon you find the complexity of your fitness function is approaching the complexity of a hand-rolled solution.

    Might the same principle hold here? Declarative programming assumes we can abstract away from how the computer does what it does, but quite often we actually DO need to control that. Either for performance, for fine-tuning the user's experience, for robustness etc.

    Anyone with any relational database experience will tell you that writing SQL queries is a tiny fraction of the skills needed for professional database development. Everything else is scaling, sharding, data-mining, Big Data, protecting against failure etc. etc. We used to think that such fine grained control was a temporary embarrassment. OK for systems programmers squeezing the most out of limited memory and processor resources. But once the computers became fast enough we could forget about memory management (give it to the garbage collector) or loop speed (look at that wonderful parallelism). Now we're in the future we discover that caring about the material resources of computation is always the crucial art. One resource constraint becomes cheap or fast enough to ignore, but your applications almost immediately grow to the size that you hit a different limit and need to start worrying again.

    Professional software developers NEVER really manage to ignore the materiality of their computation, and so will never really be able to give up fine-grained control to a purely declarative language.

    (SQL is really a great example of this. It's the most successful "tell the computer what you want not how you want it done" language in computing history. And yet there's still a lot of tuning of the materiality required, either by db-admins or more recently witnessed by the NoSQL movement, returning to more controllable hierarchical databases, mainly to improve their control.)

    Text Dump > Spatial Relations

    I already pointed out the problems of assuming everything conveniently maps onto human vision.

    I'm as fascinated by visual and gestural ideas for programming as the next geek. But I'm pretty convinced that symbols and language are way, way, way more flexible and powerful representation schemes than diagrams will ever be. Symbols are not limited to two and a half dimensions. Symbols can describe infinite series and trees of infinite depth and breadth. Yadda yadda yadda.

    Of course we can do better than the tools we have now. (Our programs could be outlines, wiki-like hypertexts, sometime spreadsheets, network diagrams etc. Or mixes of all of these, as and when appropriate.) But to abandon the underlying infrastructure of symbols, I think is highly unlikely.

    Sequential > Parallel

    This one's fascinating in that it's the one that seems most plausible. So it's also disturbing to think that it has a history as old as the other (failed) ideas here. If anything, Victor makes me pessimistic about a parallel future by putting it in the company of these other three ideas.

    Of course, I'll reserve full judgement on this. I have my Parallella "supercomputer" on order (courtesy of KickStarter). I've dabbled a bit in Erlang. I'm intrigued by Occam-π. And I may even have a go at Go.

    And, you know what? In the spirit of humility, and not knowing what I'm doing, I'm going to forget everything I just wrote. I'll keep watching Bret's astounding videos; and trying to get my head around Elm-lang's implementation of FRP. And dreaming of ways that programming will be better in the future.

    And seeking to get to that better future as quickly as possible.




    by noreply@blogger.com (phil jones) at August 01, 2013 03:49 AM

    July 30, 2013

    Phil Jones (Smart Disorganized)

    Cthulhu

    My software is more or less like Cthulhu. Normally dead and at the bottom of the sea, but occasionally stirring and throwing out a languid tentacle to drive men's minds insane. (Or at least perturb a couple of more recklessly adventurous users.)

    However there's been a bit more bubbling agitation down in R'lyeh recently. The latest weird dream returning to trouble the world is GeekWeaver, the outline based templating language I wrote several years ago.



    GeekWeaver was basically driven by two things : my interest in the OPML Editor outliner, and a need I had to create flat HTML file documentation. While the idea was strong, after the basic draft was released, it languished. 

    Partly because I shifted from Windows to Linux where the OPML Editor just wasn't such a pleasurable experience. Partly because GW's strength is really in having a templating language when you don't have a web server; but I moved on to doing a lot of web-server based projects where that wasn't an issue. And partly, it got led astray - spiralling way out of control - by my desire to recreate the more sophisticated aspects of Lisp, with all kinds of closures, macros, recursion etc.

    I ended up assuming that the whole enterprise had got horribly crufty and complicated and was an evolutionary dead end.

    But suddenly it's 2013, I went to have quick look at GeekWeaver, and I really think it's worth taking seriously again.

    Here are the three reasons why GeekWeaver is very much back in 2013 :

    Fargo

    Most obviously, Dave Winer has also been doing a refresh of his whole outlining vision with the excellent browser-based Fargo editor. Fargo is an up-to-date, no-comprise, easy to use online OPML Editor. But particularly important, it uses Dropbox to sync. outlines with your local file-system. That makes it practical to install GeekWeaver on your machine and compile outlines that you work on in Fargo.

    I typically create a working directory on my machine with a symbolic link to the OPML file which is in the Fargo subdirectory in Dropbox and the fact that the editor is remote is hardly noticable (maybe a couple of seconds lag between finishing an edit and being able to compile it).

    GitHub

    What did we do before GitHub? Faffed, that's what. I tried to put GeekWeaver into a Python Egg or something, but it was complicated and full of confusing layers of directory.  And you need a certain understanding of Python arcana to handle it right. In contrast, everyone uses Git and GitHub these days. Installing and playing on your machine is easier. Updates are more visible.

    GeekWeaver is now on GitHub
    . And as you can see from the quickstart guide on that page, you can be up and running by copying and pasting 4 instructions to your Linux terminal. (Should work on Mac too.) Getting into editing outlines with Fargo (or the OPML Editor still works fine) is a bit more complicated, but not that hard. (See above.)

    Markdown


    Originally GeekWeaver was conceived as using the same UseMod derived wiki-markup that I used in SdiDesk (and now Project ThoughtStorms for Smallest Federated Wiki). Then part of the Lisp purism got to me and I decided that such things should be implementable in the language, not hardwired, and so started removing them. 

    The result was, while GeekWeaver was always better than hand-crafting HTML, it was still, basically hand-crafting HTML, and maybe a lot less convenient that using your favourite editor with built-in snippets or auto-complete.

    In 2013 I accepted the inevitable. Markdown is one of the dominant wiki-like markup languages. There's a handy Python library for it which is a single, install away. And Winer's Fargo / Trex ecosystem already uses it. 


    So in the last couple of days I managed to incorporate a &&markdown mode into GeekWeaver pretty easily. There are a couple of issues to resolve, mainly because of collisions between Markdown and other bits of GeekWeaver markup, but I'm now willing to change GeekWeaver to make Markdown work. It's obvious that even in its half-working state, Markdown is a big win that makes it a lot easier to write a bigger chunks of text in GeekWeaver. And, given that generating static documentation was GeekWeaver's original and most-common use-case, that's crucial.

    Where Next?


    Simplification. I'm cleaning out the cruft, throwing out the convoluted and buggy attempts to make higer-order blocks and lexical closures. (For the meantime.) 
      
    Throwing out some of my own idiosyncratic markup to simplify HTML forms, PHP and javascript. Instead GW is going to refocus on being a great tool for adding user-defined re-usable abstractions to a) Markdown and b) any other text file.

    In recent years I've done other libraries for code-generation. For example, Gates of Dawn is Python for generating synthesizers as PureData files. (BTW : I cleaned up that code-base a bit, recently, too.)

    Could you generate synths from GeekWeaver? Sure you could. It doesn't really help though, but I've learned some interesting patterns from Gates of Dawn, that may find their way into GW.

    Code Generation has an ambiguous reputation. It can be useful and can be more trouble than it's worth. But if you're inclined to think using outlining AND you believe in code-gen then GeekWeaver is aiming to become the perfect tool for you.

    by noreply@blogger.com (phil jones) at July 30, 2013 08:01 PM

    Alex Schroeder

    Politics

    Looking back at how things have gone in the last year I’d say that all my RPG conversation has moved to Google+ and this wiki-blog has turned into a repository of things I don’t want to loose when Google+ is shut down. All my political thoughts are on Twitter: @kensanata and I’m almost exclusively expressing myself via retweets. I’m also more than happy to talk about it on Twitter.

    I post my pictures on Flickr at kensanata for myself and cross-post them to Facebook and a protected Twitter channel for the various family members out there.

    Tags: RSS RSS RSS RSS RSS

    July 30, 2013 09:19 AM

    July 29, 2013

    Alex Schroeder

    Urban Campaigns

    http://farm8.staticflickr.com/7330/9319467907_267633aae8_n.jpg

    The awesome Kevin Crawford of Sine Nomine Publishing left a great comment on Google+ when Reese Laundry asked about urban campaigns:

    Urban campaigns don’t have the easy execution of traditional dungeon crawls but they’re not an ineffable mystery, either. If I were in your shoes, here’s what I would do.

    Pick a city. For optimum simplicity I’d pick an old, rambling, not-entirely-coherent city from fantasy fiction that you’re already familiar with. Lankhmar is a perfect example. Then change the name and just keep the feel and flavor; you don’t want to burden yourself with the difficulty of matching the details to the fiction. You just want something that can give you an idea of what the city feels like and provide you with tropes you can use when you need fast flavor.

    Pick a neighborhood in the city. A shabby slum with leavening of crime bosses, corrupt officials, dubious priests, and suspicious foreigners is a good choice. Explain to the players that for the first few sessions you’re just going to be concentrating on activities in that neighborhood so you can keep your NPC roster and local activities manageable. The PCs aren’t trapped in there, but they shouldn’t expect local events to spill over into the wider city until you’ve had more time to get comfortable with the campaign.

    Do a quick cut at a couple of opposing power structures: “Criminal Gangs” and “Local Officials”, for example. You can create more of these power structures as they become relevant in play. You put one person at the top of the structure- the biggest local gang boss or the local watch captain, for example. Beneath them you put two lesser figures, like smaller gang bosses or patrol lieutenants. And beneath them, you put four street-level NPCs that the PCs might ordinarily interact with, like typical gang members or local watchmen. At this stage you just give each of them a name, a distinguishing characteristic, and a rivalry/feud/friendship/debt for somebody else, either in the same structure or a different one. These relationships are important because they’re cheap and easy plot fuel when you need to explain why one guy is trying to get another guy killed, or why NPC X is willing to get help for NPC Y.

    Now go to the one-page dungeon repository and start pulling maps that you could plausibly reskin into: Fortified Estates, Slum Warrens, Infested Sewers, Long-Buried City Ruins, Haunted Shrines, and other suitable urban areas. When you reskin these maps, just turn the humanoids into local citizens or denizens and drop any of the animals or magical beasts that wouldn’t be appropriate for the area- or turn them into human guards or the like if that’s appropriate. What you need from these one-page dungeons are just references- you can turn subterranean passageways into cramped alleyways and cavern rooms into tenement apartments.

    Once you have these ingredients- power structures with NPCs and maps that you can reskin into interesting places- you just pick a conflict between NPCs and make that the evening’s adventure. Somebody wants something stolen, somebody killed, somebody protected, somebody rescued, something sabotaged…. Put it or them into a map, let the PCs negotiate with the locals on their way through, and then let their actions and success/failure shape the local conflicts and NPC attitudes toward them.

    As a side note, don’t worry about mapping the actual city or neighborhood. Grab something online if it looks nice, but in actual play most PCs are only ever going to care about their immediate surroundings, which you can fake with a one-page dungeon map that you treat as roads/courtyards/buildings.

    – Kevin Crawford

    The question was asked multiple times and he got somewhat more comments here and here. I’m currently running The Wererats of Relfren by Grant Boucher and William Kurt Wenz, from Dungeon #14, p. 48–62. I’ve removed the silly and replaced the important people and locations with things from the starting village of my own campaign. It has been working very well until now!

    Tags: RSS

    July 29, 2013 08:22 AM

    July 27, 2013

    Phil Jones (Smart Disorganized)

    Alex Schroeder

    Treasure

    Recently, Courtney asked on Google+ about treasure generation. I left the following comment.

    Like Jeff, I let players roll on the official tables (Labyrinth Lord) if they went somewhere I didn’t prepare and defeated or outwitted a significant foe (in my last game, it was a black dragon).

    When I prepare treasure, I simply roll on the tables. The mechanized aspect of this task encourages me to believe in the independent existence of the fantasy world. I use surprising results to think of new twists: dragons without treasure got robbed, a bunch of hobgoblins with immense treasure are on their way to pay taxes to their overlord, things that enrich the world.

    I never embellish monetary treasure. That includes gems and most jewelry. It’s simply there to be brought back to safety and to be converted to xp when spent in some way. I might embellish jewelry if it is expensive (500gp or more) and say that it’s a diadem, a crown, a bracelet, a holy symbol of a named person, an aristocratic helmet of a dead people.

    When it comes to magic items, I still roll on the tables, but I try to embellish every single one of them. Potions have colors and taste according to a big table I keep adding to as the game progresses. Scrolls are spells from a named wizard, are psalms in praise of a particular god. +1 swords are elven swords; better weapons will pour cold, green mist when drawn, will have runes identifying their former owner (and if possible I’ll then add the same runes to magic armor to be found nearby). Again, things that enrich the world.

    I find there’s also a problem of delivery. How interested are your players in actual detail if it isn’t actionable? If it is: How many pieces of actionable treasure cann they take before being overwhelmed? Three? Five? Seven? How interesting will they deem the follow-up quests in comparison to delving deeper or exploring further or pursuing their existing goals? That’s why I prefer bland monetary treasure, personally.

    Tags: RSS RSS

    July 27, 2013 02:43 PM

    July 26, 2013

    Alex Schroeder

    Google Reader Archives

    I’ve been looking through the old blog posts I starred on Google Reader. There are so many of them! Looking at the 42 links for July 2009, I’d suggest the following are still relevant today. I’m not listing the links to “Why B/X is my favorite” because I already did that in my 2012 post Ode to Ode to Black Dougal.

    Perhaps I should add some of these links to the Links to Wisdom wiki.

    Tags: RSS

    July 26, 2013 02:18 PM

    Extracting Starred URLs from Google Reader Takeout Data

    Google Reader was shut down. Luckily Google Takeout allowed you to download all of your data before the shut it down. I did that. I wanted to extract all the URLs to the articles I starred in order to post them on this blog… maybe.

    Here’s how I did it. First, take a look at the file starred.json.

        (setq starred-items (with-current-buffer "starred.json (Google Reader-takeout.zip)"
    			  (goto-char (point-min))
    			  (json-read)))
        (mapcar (lambda (item) (car item)) starred-items)
        ⇒ (items direction updated author title id)

    I’m interested in items, which happens to be an array. Let’s see what each item contains.

        (mapcar (lambda (item) (car item))
                (aref (cdr (assoc-string "items" starred-items)) 0))
        ⇒ (origin annotations comments author content replies alternate updated published title categories id timestampUsec crawlTimeMsec)

    As it happens, the URL I’m interested in is part of alternate. Let’s make sure there’s always exactly one entry:

        (mapc (lambda (item)
    	    (when (not (= 1 (length (cdr (assoc-string "alternate" item)))))
    	      (error "%S" item)))
    	  (cdr (assoc-string "items" starred-items)))

    Phew! Let’s produce a first list of URLs and the respective titles:

        (mapc (lambda (item)
    	    (let ((href (cdr (assoc-string "href"
    					   (aref (cdr (assoc-string "alternate" item)) 0))))
    		  (title (cdr (assoc-string "title" item))))
    	      (insert (format "* [%s %s]\n" href title))))
    	  (cdr (assoc-string "items" starred-items)))

    I hate feedproxy URLs and so I absolutely wanted to get rid of all the URLs starting with http://feedproxy.google.com/. This required a bit more code since neither url-retrieve-synchronously nor url-retrieve do exactly what I want.

        (defun redirection-target (url)
          (save-match-data
    	(let ((url-request-method "HEAD")
    	      (retrieval-done nil)
    	      (spinner "-\|/")
    	      (n 0))
    	  (url-retrieve url
    			(lambda (status &rest ignore)
    			  (setq retrieval-done t
    				url (plist-get status :redirect)
    				url (replace-regexp-in-string "blogspot\\.ch" "blogspot.com" url)
    				url (replace-regexp-in-string "\\?utm.*" "" url))))
    	  (while (not retrieval-done)
    	    (sit-for 1)
    	    (message "Waiting... %c" (aref spinner (setq n (mod (1+ n) (length spinner))))))
    	  url)))

    Now I can run the following search an replace operation in the buffer where I generated my list:

        (while (re-search-forward "http://feedproxy\\.google\\.com/\\S-+" nil t)
          (replace-match (redirection-target (match-string 0))))

    Phew, thank you, Emacs!

    Tags: RSS

    July 26, 2013 01:06 PM

    July 24, 2013

    Phil Jones (Smart Disorganized)

    Google's New Email Tabs

    There's a lot of discussion going on around them. Eg. on Quora.

    I started writing a comment on a comment where Tim Bushell asks :
    why shouldn't they be "red", "green", "blue"?
    ie. user-defined or neutral.

    But then felt it would be better here :

    Probably because Google have a database of thousands of email addresses and patterns that they've classified into these categories of "social", "promotion" etc., and with this move they're basically giving you, the customer, the benefit of that classification scheme.

    They assume that if you just want to program your own categories and sort accordingly you're already doing it via filters.

    What probably didn't occur to Google was that the world is full of people who WANT to be able to define their own categories and filters but never realized that GMail (like every email client in the 20+ years) already HAS this feature.

    What's happening is that just by showing people tabbed email, they've suddenly woken everyone up to the fact that your email client can be programmed to filter emails. (Who knew?)
    What happens now is going to be interesting.

    If Google know how to listen, they'll take advantage of it, add the ability to define your own tabs, integrate it seemlessly with the existing filter architecture of GMail (maybe improve the UI of that a bit, eg. drag / dropping between tabs) and get to bask in the adoration of having "reinvented email".

    If not, they'll keep the two systems separate (ie. filter-definition hidden away where most people can't find or understand it) and not only will the opportunity be squandered, but many people will continue to hate the tabs.

    by noreply@blogger.com (phil jones) at July 24, 2013 06:48 PM

    Alex Schroeder

    Drellin’s Fall

    Today I will be running Red Hand of Doom using Labyrinth Lord rules for a friend of his and his kids again. Some notes for myself regarding the fall of Drelling:

    “Goblins on the western shore!” Join Captain Soranna and her militia as they cross over?

    • 3 goblins, HD 1-1, AC 6, 1d6, NM, MV 6, ML 7
    • 3 dire wolves (“worgs”), HD 4+1, AC 6, 2d4, F2, MV 15, ML 8
    • 1 hell hound, HD 3, AC 4, 1d6 or 30% for breath attack (3d6), F3, MV 12, ML 9

    Five rounds later:

    • 1 war sorcerer, HD 5, AC 9, 1d6, MV 12, ML 8 with lightning bolt (5d6), detect thoughts, blindness, charm person, shield (AC 4, AC 2 vs missiles)
    • 5 hobgoblins, HD 1+1, AC 6, 1d8, F1, MV 9, ML 8

    Warnings of “road blockades, hobgoblins and ogres up in the north” by Teyani Sura, a Lion of Brindol. (Maybe one of the players will eventually want to join them?)

    When the attack on Drellin starts, the fight is hopeless. The stats will be useful for future encounters, however. The stats are Open Gaming Content based on the Labyrinth Lord OGL.

    Massacre at Drellin’s Ferry, first wave:

    • 3 manticores, HD 6+1, AC 4, 1d4/1d4/2d4 or up to 4×/day 6×1d6 thrown spikes, F6, MV 12 (18), ML 9
    • 3 hobgoblin bladebearers, HD 4+1, AC 6, 1d8, F4, MV 9, ML 10

    Second wave:

    • 2 Hieracosphinxes, HD 9, AC 1, 2d4/2d4/1d10, F9, MV 9 (36), ML 10
    • 2 Wyverns, HD 7, AC 3, 2d8/2d8 (poison), F4, MV 9 (24), ML 9
    • 2 hobgoblin war sorcerers, HD 5, AC 9, 1d6, M5, MV 12, ML 8 with lightning bolt (5d6), detect thoughts, blindness, charm person, shield (AC 4, AC 2 vs missiles)

    Third wave:

    • Abrithiax, red dragon, HD 10, AC -1, 1d6/1d6/3d8 or 50% for breath attack 3×/day (damage = current hp), F10, MV 9 (24), ML 10
    • 3 manticores, HD 6+1, AC 4, 1d4/1d4/2d4 or up to 4×/day 6×1d6 thrown spikes, F6, MV 12 (18), ML 9
    • 2 hobgoblin war monks (like thieves), HD 4, AC 9, 1d6 (double in surprise rounds), T4, MV 12, ML 10
    • 2 hobgoblin war sorcerers, HD 5, AC 9, 1d6, MV 12, ML 8 with lightning bolt (5d6), detect thoughts, blindness, charm person, shield (AC 4, AC 2 vs missiles)

    Fourth wave:

    • 3 bugbear berserkers, HD 5+1, AC 5, 1d8+1, F5, MV 9, ML 12, surprise opponents ³⁄₆ if approaching alone
    • 1 hobgoblin war sorcerer, HD 5, AC 9, 1d6, MV 12, ML 8 with lightning bolt (5d6), detect thoughts, blindness, charm person, shield (AC 4, AC 2 vs missiles)
    • 2 hobgoblin clerics, HD 4+1, AC 6, 1D8, C4, MV 9, ML 10 with invisibility, cure light wounds, hold person, a scroll of summon hell hound and 2× potion of healing

    If summoned:

    • 1 hell hound, HD 3, AC 4, 1d6 or 30% for breath attack (3d6), F3, MV 12, ML 9

    In the aftermath, looters:

    • 4 thieves, HD 1, AC 7, 1d6 (double in surprise rounds), T1, MV 9, ML 6

    Happening upon a battlefield, where ettins just killed some dwarves with mercenary pay to a nearby hold. (Will the party deliver the 6000 gold to the dwarves?)

    • 2 ettins, HD 10, AC 3, 2d8/3d6, F10, MV 12, ML 9 (only surprised ⅙)
    • 4 goblins, HD 1-1, AC 6, 1d6, NM, MV 6, ML 7

    When helping some wounded refugees, one female “travelling sorcerer” with a bandaged arm is very curious and asks a lot of questions. In fact, she’s a spider woman spy.

    • 1 spider sorceress, HD 3, AC 8, 1d6 (poison), M3, MV 12 (3), ML 7 with 6× web, sleep, shield (AC 4, AC 2 vs missiles)

    Tracked by barghests (goblin werwolves) near an abandoned farmhouse.

    • 3 barghests, HD 4, AC 5, 2d4, F4, MV 18, ML 8 with howl causing fear to split the party up and kill them one by one and dimension door to get away if necessary
    • 6 hobgoblins, HD 1+1, AC 6, 1d8, F1, MV 9, ML 8

    Assassins on their trail!

    • 4 black lizard assassins, HD 5+1, AC 6, 2d6 or 25% acid breath for 4d4, F3, MV 12, ML 8 with 1 potion of invisibility each which they use as quickly as possible
    • 2 greater barghests, HD 6+1, AC 5, 2d4, F6, MV 18, ML 8 with charm person to turn one against the other, howl causing fear to split the party up and kill them one by one and dimension door to get away if necessary
    • 1 ogre, HD 4+1, AC 5, 1d10, F4, MV 9, ML 10
    • 5 hobgoblins, HD 1+1, AC 6, 1d8, F1, MV 9, ML 8

    Tags: RSS RSS

    July 24, 2013 09:43 AM

    July 23, 2013

    Alex Schroeder

    Gems and Jewelry

    For my D&D B/X and Labyrinth Lord games, I roll on the treasure tables by hand—or I have my players do it right then and there because they love doing it. The only thing I hate is rolling for 5d8 gems or jewels… So I wrote to super simple scripts to do it for me.

    Tags: RSS RSS

    July 23, 2013 05:24 PM

    Phil Jones (Smart Disorganized)

    Modules In Time : Synthesizing GitHub and Skyrim


    Thanks to Bill Seitz I picked up on a Giles Bowkett post I'd missed a couple of months ago which compares the loosely coupled asynchronous style of development that companies like GitHub both promote and live, with the intensely coupled synchronous raids that occur in online game-worlds.

    Bowkett seems confused by the apparent contradictions between the two. And yet obviously impressed by the success of both. He wants to know what the correct synthesis is.

    That really shouldn't be so hard to imagine. The intense coupling is what happens in pair-programming, for example. Or the hackday or sprint. Its focus is on creating a single minimum product or adding a single feature / story to it.

    The right synthesis, to my way of thinking, is intense / tight / adrenalin fuelled / synchronous coupling over short periods, where certain combinations of talents (or even just two-pairs of eyes) are necessary. And loose / asynchronous coupling everywhere else. Without trying to squash everyone's work into some kind of larger structure which looks neat but doesn't actually serve a purpose.

    The future of work is highly bursty!

    It shouldn't surprise us, because modularity is one of the oldest ideas in software : tight-cohesion within modules of closely related activities. Loose and flexible coupling between modules. It's just that with these work-patterns we're talking about modules in time. But the principle is the same. The sprint is the module focused on a single story. The wider web of loosely asynchronous forks and merges is the coupling between modules.

    by noreply@blogger.com (phil jones) at July 23, 2013 12:36 AM

    July 22, 2013

    Phil Jones (Smart Disorganized)

    GrabQuora on GitHub

    A couple of tweaks to the Quora grabbing script. Makes it worth upgrading to a full GitHub project.

    by noreply@blogger.com (phil jones) at July 22, 2013 10:39 PM

    Quora Scraper

    I love Quora. It's a great site and community. But I started getting a bit concerned how much writing I was doing there which was (potentially) disappearing inside their garden and not part of the body of thinking I'm building up on ThoughtStorms (or even my blogs).

    Fortunately, I discovered Quora has an RSS feed of my answers, so I can save them to my local machine. (At some point I'll think about how to integrate them into ThoughtStorms; should I just make a page for each one?)

    Anyway here's the script (powered by a lot of Python batteries.)




    And this turns the files back into a handy HTML page.

    by noreply@blogger.com (phil jones) at July 22, 2013 04:21 AM

    July 21, 2013

    Alex Schroeder

    Troll Questions

    Trolly Troll's Top Ten Troll Questions for Your Game.

    1. Race (Elf, Dwarf, Halfling) as a class? Yes. We can always add more classes.
    2. Do demi-humans have souls? What is a soul? They can all be resurrected.
    3. Ascending or descending armor class? Descending. I can use the books I like as they are.
    4. Demi-human level limits? Yes. They are strange. (Brendan points to Jeff’s article, Everyone has Level Limits exactly backwards except Timrod and me)
    5. Should thieves be a class? No. Anybody can steal. Yes. It’s what some of my players want.
    6. Do characters get non-weapon skills? No. If you want to so something that requires training, explain why your character has that training and add this fact about your character’s past to your character sheet.
    7. Are magic-users more powerful than fighters (and, if yes, what level do they take the lead)? I don’t know. My campaign has not reached that level, yet. With appropriate preparation and the right spells a magic user seems invincible. Without the right preparation, a magic user seems very fragile.
    8. Do you use alignment languages? No. A surprising number of creatures speak the common tongue, however.
    9. XP for gold, or XP for objectives (thieves disarming traps, etc…)? XP for gold spent. I have price lists for buildings and encourage characters to hire servants and guards and specialists to populate them.
    10. Which is the best edition; ODD, Holmes, Moldvay, Mentzer, Rules Cyclopedia, 1E ADD, 2E ADD, 3E ADD, 4E ADD, Next? Moldvay. Easy to get started. I’m assuming I’ll eventually switch to the Rules Cyclopedia for the high levels.

    What about you?

    Tags: RSS RSS

    July 21, 2013 05:42 PM

    July 19, 2013

    Alex Schroeder

    Pacific Rim

    I felt about 25 years too old for Pacific Rim. It was a tiny bit better than Transformers. No quiet moments and insights like in Blade Runner. No mystic undercurrents like in Neon Genesis Evangelion. No character interplay like in Mass Effect. No singing and romance in Robotech. No strangeness like in Akira. I did like the visuals of Hong Kong, the huge halls à la Star Wars. I find that good movies have me thinking back, recalling scenes, mulling the justifications and consequences of actions. This movie won’t be requiring much thinking back. It has giant robots and kaiju monsters. They fight. The solution to the problem is—as is often the case—a nuke. I expected as much but went anyway, willing to let myself be convinced. Oh well.

    Tags: RSS

    July 19, 2013 11:07 PM

    July 18, 2013

    CommunityWiki

    StructureOfWikis

    There are many ways to structure content globally. All of GlobalContentStructuringMethods can be relevant in wikis.

    There are only few ways to structure content locally, in a WikiPage?.

    Learn more...

    July 18, 2013 06:35 PM

    Alex Schroeder

    Who Is Boss

    Every now and then I think of something related to artificial intelligence but forget to write it down. And then I forget it. Today I dreamt of something related to artificial intelligence and wrote it down in my dream so I would not forget. And I did not. Here it is.

    I saw two robots, and one of them was deciding what the other one should do. I wondered: why is the second robot following orders? If it’s stupid, it will be inefficient in handling its task. How would I implement this? I figured that every AI needs a property that we would call lazy. A slight resistance to do what is necessary. A slow understanding of orders given. If you’re lazy, you’ll make the others do the job. Create each AI with a random value of this property, and you’ll establish a hierarchy implicity.

    What to do with this idea, now? I don’t have any AI projects. I don’t even have a need for intelligent agents in a simulated game world.

    Tags: RSS

    July 18, 2013 06:15 AM

    July 17, 2013

    Alex Schroeder

    Inkscape Mapping and mkhexgrid

    Today I needed to add the island of Tirnanog to my campaign map using Inkscape. In order to do that, I needed to add more hexes in the background—I needed to “grow the ocean”. I looked at my Old School Hex Map Tutorial and figured I must have used the Inkscape Boardgames Extension. When I checked, however, I was unable to find the menu. Perhaps Inkscape has changed and it needs to be reinstalled? I decided to give mkhexgrid another try. Fiddling with the spec file for a bit, I determined that these were the correct settings:

    output=svg
    outfile=hex-layer.svg
    hex-side=45pt
    rows=17
    columns=14
    grid-color=7a7a7a
    coord-color=008080
    coord-size=10pt
    coord-distance=28pt
    # start with an odd number!
    coord-column-start=37
    coord-row-start=01

    By now the map is so big, redoing it for Hexographer or Text Mapper seems like a lot of work. When I see the efforts required to update this map in a sluggish Inkscape on a 1024×768 monitor, however, it seems like a lot of work as well.

    Update: I actually wanted to see how much time it took to get a decent result using Text Mapper and compare it with my old style, based on the Old School Hex Map Tutorial I wrote.

    I don’t know. I like the colors of the Gnomeyland icons. Check out Map Symbols: Trees & Forests on Old Russian Maps by John Krygier for some source material. But really – is it much better? Is it much faster? I don’t think so.

    Original, from the Wilderlands of High Fantasy box:

    http://farm8.staticflickr.com/7352/9305033183_33b8bc2c37_z.jpg

    My “old school hex map” style:

    http://farm4.staticflickr.com/3728/9305013905_c5ca700aa5_z.jpg

    Text Mapper, using the Gnomeyland icons by Gregory B. MacKenzie (CC BY SA):

    http://farm6.staticflickr.com/5479/9307639706_3a47425285_z.jpg

    For the curious, here is the source for Text Mapper:

    3901 water
    3902 water
    3903 water
    3904 water
    3905 water island
    3906 water
    3907 water
    3908 water
    4001 water
    4002 water
    4003 water
    4004 water
    4005 water
    4006 water
    4007 water island
    4008 water
    4101 water
    4102 water
    4103 water
    4104 water
    4105 water
    4106 water
    4107 water island "Andaman Isles"
    4108 water
    4201 water
    4202 water
    4203 water
    4204 soil tower "Marechal"
    4205 dark-green forest
    4206 water islands
    4207 water islands
    4208 water
    4301 water
    4302 water
    4303 water
    4304 light-grey hill
    4305 light-grey mountain
    4306 light-grey
    4307 water
    4308 water
    4401 water
    4402 water
    4403 light-grey hill
    4404 grey mountain "Needles Peak"
    4405 light-grey hill
    4406 water
    4407 water
    4408 water
    4501 water
    4502 dark-green forest
    4503 light-grey hill
    4504 green forest-hill
    4505 soil tower "Lanka"
    4506 water
    4507 water
    4508 water
    4601 water
    4602 soil tower "Calfat"
    4603 soil lake keep "Kailasa"
    4604 light-grey hill
    4605 water
    4606 water
    4607 water
    4608 water
    4701 water
    4702 light-grey
    4703 light-grey hill
    4704 soil tower "Heratus"
    4705 dark-green forest
    4706 water
    4707 water
    4708 water
    4801 water "Windward Peninsula"
    4802 soil keep "Dalmaric"
    4803 soil keep "Talimanor"
    4804 dark-green forest "Pardolock Jungle"
    4805 water
    4806 water
    4807 water
    4808 water
    4901 water
    4902 water island
    4903 water
    4904 water
    4905 water island
    4906 water
    4907 water
    4908 water
    5001 water
    5002 water
    5003 water
    5004 water
    5005 water
    5006 water
    5007 water
    5008 water
    lake xml <circle cx="0" cy="0" r="50" fill="#6ebae7" stroke="black" stroke-width="3"/>
    island xml <circle cx="10" cy="10" r="25" fill="#dcddbe" stroke="black" stroke-width="3"/>
    islands xml <circle cx="-20" cy="20" r="20" fill="#dcddbe" stroke="black" stroke-width="3"/><circle cx="20" cy="-20" r="15" fill="#dcddbe" stroke="black" stroke-width="3"/>
    include http://alexschroeder.ch/contrib/gnomeyland.txt
    
    4603-4903 fjord
    4602-4902 fjord
    fjord path attributes stroke="#6ebae7" stroke-width="20" fill-opacity="0" stroke-linecap="round"
    
    other <text stroke="white" stroke-width="10px" font-size="50pt" x="6300" y="550" transform="rotate(330 6300,550)">Tirnanog Isle</text><text font-size="50pt" x="6300" y="550" transform="rotate(330 6300,550)">Tirnanog Isle</text>

    Tags: RSS RSS RSS

    July 17, 2013 11:33 AM

    July 16, 2013

    Phil Jones (Smart Disorganized)

    GeekWeaver

    OK ... not shouting much yet, but what with the relaunch of OPML and Fargo, there's a bit of a GeekWeaver refresh going on.

    I put the code on GitHub and starting to clean it up, making it suitable for use ...

    Watch this space ...

    by noreply@blogger.com (phil jones) at July 16, 2013 09:18 PM

    July 15, 2013

    Alex Schroeder

    Nighttrain to Lisbon

    I watched Nighttrain to Lisbon (mostly because I learned that my stepbrother was involved in one of the songs via Trio Fado) which had some nice pictures of Lisbon and some interesting aspects of living under the fascist regime of Salazar and his secret police. A terrible thing. The aspects I did not like about the movie:

    The Swiss and the Portuguese speak English—and just recently having seen La grande vadrouille where you need to understand French, German and English in order to get all the jokes, this pained me. I felt the Portuguese names were getting butchered. Why did they not use local actors and provide subtitles?

    I felt the movie failed the Bechdel test: The women seemed to be either objects in the possession of men—to be fought over—or listening to the men in rapt attention with an appropriately bent neck.

    I also haven’t read the book.

    In short, if you want to see some pictures of Lisbon and get an idea of the fascist regime in Portugal at the time, I recommend the movie.

    Tags: RSS

    July 15, 2013 07:14 AM

    July 13, 2013

    Alex Schroeder

    The Grandmaster

    The Grandmaster: Beautiful costumes and sets, beautiful choreographers without slapstick humor, a message in favor of martial arts and against style chauvinism. The romance plot wasn’t as thick as it sometimes is in Wong Karen Wai movies and cinematography was not done by Christopher Doyle but I still liked it very much.

    I agree with the critics, however: the script wasn’t too good. Or perhaps too much was cut from the original four hours. I think I’d like to see a director’s cut.

    Tags: RSS

    July 13, 2013 10:15 AM

    July 11, 2013

    Alex Schroeder

    Der Geist Mesopotamiens, überarbeitet

    Encyclopaedia Biblica map of Syria, Mesopotamia, Babylonia, and Assyria Vor zwei Jahren hatte ich mal meine Fate Variante Der Geist Mesopotamiens vorgestellt. In der Zwischenzeit ist Fate Core erschienen, und ich habe mir die Sache mal angeschaut. Ein paar Dinge sind mir sofort positiv aufgefallen:

    • Fertigkeitenpyramide endet bei +4
    • Anzahl Aspekte auf fünf reduziert
    • Anzahl Schicksalspunkte auf drei reduziert

    Ein paar interessante Vereinfachungen im Detail – mir gefällt’s! Wenn das Teil nur nicht über dreihundert Seiten lang wäre. Aber das kennen wir ja schon. Deswegen habe ich mein PDF einfach überarbeitet. Meine Fate Variante ist immer noch nur 4½ Seiten lang.

    Und ich habe die Dokumente auf GitHub gestellt.

    Was mir noch fehlt ist eine Proberunde. :)

    Tags: RSS RSS RSS

    July 11, 2013 10:36 PM

    July 08, 2013

    Alex Schroeder

    FLAC to MP3

    Note to self: Assume you have a set of subdirectories named CD01, CD02, and so on, each containing a single FLAC file and a single CUE file, here’s how to convert them to MP3:

    for d in CD*; do
        cd $d
        for f in *.cue; do
    	n=`basename "$f" .cue`
    	echo xld -c "$n.cue" "$n.flac"
    	xld -c "$n.cue" "$n.flac" -f mp3
        done
        cd ..
    done

    This uses XLD, also known as “X Lossless Decoder: Lossless audio decoder for Mac OS X”. Yay! :)

    Tags: RSS

    July 08, 2013 09:49 PM

    July 06, 2013

    Phil Jones (Smart Disorganized)

    Restraining Bolts

    Today I'm being driven crazy trying to print out FiloFax pages on an HP printer.

    Although I've created a PDF file of the right size, I have the right size piece of paper, and I've set up the paper-size in the print-driver, the printer is refusing to print because it detects a "paper size mismatch".

    A quick look through HP's site reveals a world of pain created by this size-checking-sensor which can't be over-ridden. People are justifiably pissed off.

    What's striking is that this is a problem that didn't exist previously. There are many accounts in this forum of people who, on their older printers, happily used incorrect page-size settings in the driver, with odd-sized paper, and just got their job done.

    HP by trying to add "smartness" to their product have made it less usable. This is such a common anti-pattern, engineers should be taught it in school : the more smart-constraints you add to a product, the more likely you are going to disempower and piss-off the edge-cases and non-standard users.

    Recently I wrote a Quora answer which I brought to ThoughtStorms : MachineGatekeepers . I worried for people who didn't know how to navigate technological problems in a world where we're encaged by technology.

    But I have an even greater worry. The road to hell is paved with "helpful constraints" added by idiots. And we're all suffering as technologies which, with a pinch of know-how or intuition we could bend to our will, become iron cages. It's no good knowing how to google the FAQ or engage with tech. support when HP support is effectively non-existent.

    The most disturbing thought here is that BigTech knows this, and increasingly takes away our freedom with one hand and sells it back to us on the other. If enough people complain that their HP won't print on FiloFax pages what's the most likely result? That HP release a fix to disable the page-size-sensor? Or that they'll just release a new printer model which also handles FiloFax paper but is otherwise equally restricted?

    by noreply@blogger.com (phil jones) at July 06, 2013 04:14 PM

    July 05, 2013

    Phil Jones (Smart Disorganized)

    Fargo For LinkBlogging

    I'm a couple of days into LinkBlogging using Fargo, (at Yelling At Strangers From The Sky) and I have to say, I'm getting into the swing and it's great.

    If you keep the outline open in a tab, it's about as fast and convenient to post to Fargo as posting a link to Plus or Twitter. (Which is where traditional blogs like WordPress / Blogger often fall short). In fact, G+ is now getting bloated that it can take 10 seconds just to open the "paste a new message" box. It's a lot faster than that.

    It would be nice if it could automatically include a picture or chunk of text from the original page the way FB / G+ do, that's turned out to be a compelling experience for me, but it's a nice not must-have.

    A question, is there any kind of API for the outline inside the page which a bookmarklet could engage with? (Is that even possible given the browser security model?)


    by noreply@blogger.com (phil jones) at July 05, 2013 02:06 PM

    July 04, 2013

    Phil Jones (Smart Disorganized)

    Fargo and Google

    Couple of quick notes :

    1) I'm too dependent on Google. Unlike the case of Facebook, I can't just cancel my account. Google is too deeply entwined with my life. But I am taking steps to disengage if not 100% at least a significant chunk.

    2) I'm playing around a bit more with Dave Winer's Fargo outliner. And it is shaping up to be excellent, both as an outliner and expression of Winer's philosophy. (No surprises.)

    So, to combine the two, I'm documenting my Google-leaving thoughts in a public outline. Check it out.

    Update : I've also been wondering about having a linkblog, somewhere I can quickly throw links rather than G+ (which is inside the Google Walled River). Maybe Fargo will help there too.

    by noreply@blogger.com (phil jones) at July 04, 2013 06:48 AM

    July 02, 2013

    Alex Schroeder

    Initiative

    http://farm9.staticflickr.com/8398/8669566134_700f9d3f80.jpg

    Rolling for initiative… What is it for?

    Let’s start with simple group initiative: each side rolls a d6 and the higher one goes first. It’s what I use, and I think it provides almost all the benefits the other systems provide. The basic rule is: everybody gets to act once per round. It seems to me that the worst case that can happen is that you get attacked twice in a row. But even that cannot happen again unless you get to attack twice in a row in turn. AB/BA/AB/BA, after all. Getting attacked twice in a row is an interesting feature that adds uncertainty to the fight.

    Individual initiative without modifiers: each character rolls a d6 and the higher one goes first. Essentially this boils down to “Roll roll once for the enemies. Announce the number. Any player character who beats this number can go, in any order. Then the enemies go. Then the remaining player characters go, in any order.” Whether “in any order” is in fact faster than “in initiative order” depends on whether you allow delaying (which slows down “in initiative order”) and whether your players are often unsure of what to do, which I find is best handled by delaying. With slow players, “in any order” is best.

    From the point of view of an individual character, however, the situation is just as it was with group initiative. You can get attacked twice in a row, but only once. AB/BA/AB/BA, remember? Thus, it seems to me that individual initiative without modifiers makes things more complicated at the table by adding randomness but without changing much.

    What’s the effect of a higher initiative bonus? Let’s compare A with 1d6+1 vs. B with 1d6: how much more likely is A to win initiative? Reroll ties. All we need to do is count:

        1  2  3  4  5  6
     2  A  -  B  B  B  B
     3  A  A  -  B  B  B
     4  A  A  A  -  B  B
     5  A  A  A  A  -  B
     6  A  A  A  A  A  -
     7  A  A  A  A  A  A

    A 21 : B 10 or roughly 68% of the time. What does this mean? Here’s how I think about it: It makes no difference whatsoever until one of them is going to suffer consequences. In D&D, that would be the last round.

    • If either A or B can die, A has a 68% of going first, and thus has a higher chance of winning.
    • If only one of the two can die, then there’s simply a 68% chance of landing or avoiding the last blow.

    In short: player characters benefit from a bonus to initiative in the very last round only. That seems to be a very minor benefit when compared with the increased complexity at the table.

    In mid-level D&D 3.5, a high initiative for casters was often essential because they had the power to turn the first round into the last round of combat. In classic low level D&D, this isn’t as important. In my games, there seem to be less casters of offensive spells, and casters have less spells per day, and there are more fights per day. It all makes individual initiative modifiers less useful.

    But what about fun? Isn’t rolling individual initiative more exciting? I don’t know. Certainly everybody is more busy rolling their die and remembering their result. When group initiative is rolled, all the players are watching one single die and there is groaning or cheering at the table. I don’t think one of the methods can be said to be “more fun” in general. Personally, I enjoy the collective groaning and cheering of group initiative.

    If you’re DM Florian, don’t worry: I don’t mind playing with individual initiative. Other DMs provide inspiration for blog posts! :)

    Tags: RSS RSS

    July 02, 2013 08:20 AM

    June 29, 2013

    Alex Schroeder

    Chain

    I recently switched to the Moldvay Basic D&D price list. You can find a copy at the end of this blog post. The most obvious change is the price reduction for plate mail (also mentioned by Telecanter): leather is 20gp, chain is 40gp, plate is 60gp. The effect on my game? I think the main result is that player characters don’t wear chain unless they cannot afford it for the first session. I think that later, when people will equip armies, chain may make a come back. That’s why I think that chain remains the armor of choice for guards because there are so many of them.

    What do you think?

    Comment here or on Google+.

    Tags: RSS RSS

    June 29, 2013 09:40 AM

    June 28, 2013

    Alex Schroeder

    Red Hand of Doom Treasure

    http://farm8.staticflickr.com/7292/9158170382_07ef65f97d_n.jpg

    Last time I talked about the way I use The Red Hand of Doom in my game. Basically, I use it for interesting encounters and as plot inspiration. The last time I also worried about treasure a lot and decided to hand out treasure “as written” and changed some magic items as appropriate. This time I went the other route. As treasure is important for experience points in classic D&D, and since there is a dragon to fight at the end of every chapter, I decided to simply go with what the Labyrinth Lord manual says when it comes to treasure. I also decided not to fiddle with the dragon stats themselves. I think this worked very well.

    The big encounter I had prepared was the battle at Skull Gorge Bridge:

    • Ozyrrandias, green dragon, HD 8, AC 1, 1d6/1d6/3d8 or 50% for breath attack 3×/day (damage = current hp), F8, MV 24/9, ML 9
    • 2 hell hounds, HD 3, AC 4, 1d6 or 30% for breath attack (3d6), F3, MV 12, ML 9
    • 1 hobgoblin sergeant, HD 3+1, AC 6, 1d8, F3, MV 9, ML 9
    • 8 hobgoblins, HD 1+1, AC 6, 1d8, F1, MV 9, ML 8

    When the party saw the dragon flying overhead, they decided to avoid the bridge and check out the Cinder Hills. Oh no, my precious encounter! :'(

    Ozyrrandias’ hoard remains untouched:

    • 51 gems
    • 70 jewelry
    • a dwarven war hammer +1
    • a treasure map to a chest of gold (20000 gp)
    • the elven princeling sword +1 named Alkurbatan with a bound jinn that will grant two wishes (a wish blade)
    • the elven princess sword +1 named Algabrea which also grants a +1 to all saves and also comes with a bound jinn that will grant two wishes (a luck blade)

    Those where some damn lucky rolls!

    Anyway, the party discovered the big camp and decided to ambush a patrol in the forest in order to gather some intelligence.

    Based on some of the encounters in the book I decided that there where three “standard” encounters—all of them without treasure—and I asked the players which sort of patrol they wanted to ambush.

    Scouts:

    • 3 goblins, HD 1-1, AC 6, 1d6, NM, MV 6, ML 7
    • 3 dire wolves (“worgs”), HD 4+1, AC 6, 2d4, F2, MV 15, ML 8
    • 1 hell hound, HD 3, AC 4, 1d6 or 30% for breath attack (3d6), F3, MV 12, ML 9

    Light patrol:

    • 1 hobgoblin bladebearer, HD 4+4, AC 6, 1D8, F4, MV 9, ML 10
    • 8 hobgoblins, HD 1+1, AC 6, 1d8, F1, MV 9, ML 8
    • 1 hell hound, HD 3, AC 4, 1d6 or 30% for breath attack (3d6), F3, MV 12, ML 9

    Heavy patrol with vanguard:

    • vanguard: 6 hobgoblins, HD 1+1, AC 6, 1d8, F1, MV 9, ML 8
    • 1 hobgoblin cleric, HD 4+4, AC 6, 1D8, F4, MV 9, ML 10 with invisibility, cure light wounds, hold person, a scroll of summon hell hound and 2× potion of healing
    • 1 hobgoblin bladebearer, HD 4+4, AC 6, 1D8, F4, MV 9, ML 10
    • 6 hobgoblins, HD 1+1, AC 6, 1d8, F1, MV 9, ML 8
    • 2 hell hounds, HD 3, AC 4, 1d6 or 30% for breath attack (3d6), F3, MV 12, ML 9

    You’ll note that I decided to move away from monsters wielding weapons all doing 1d6 damage. Hobgoblins deal 1d8 damage because they’re monsters. Different rules apply.

    The party decides to attack the heavy patrol and manages to finish the main body before the vanguard returns and thus smashes them easily, taking a prisoner who then tells them all about the map they found in Koth’s keep.

    The party then decides to follow Saarvith into the city of Rhest. One of the players wants to convince the black dragon Regiax to join their cause. (Me thinking: “WTF!?”)

    Since I haven’t prepared anything for the city of Rhest, I will need to think fast. So… A green razorfiend? A sort of doped lizard superman? Hm… Also, they want to talk to the guy and the reaction roll comes up “uncertain”. Ok, they know the names of Saarvith and Regiax, they know about the Red Hand, so the green dude decides to take them to Saarvith. I also need to come up with a suitable name… Uh… Garslix!

    Saarvith is a goblin ranger… A fighter, I guess? Using the D&D 3.5 challenge rating as am indicator for the hit dice to use… It turns out that doing these on-the-fly adaptations is easy to do!

    • Garslix, green razorfiend, HD 6, AC 4, 1d4/1d4/1d6, F6, MV 12, ML 8
    • Saarvith, goblin ranger, HD 7, AC 5, 1d6, F7, MV 6, ML 9
    • Regiax, black dragon, HD 7, AC 2, 1d4+1/1d4+1/2d10, F7, MV 24/9, ML 8

    Anyway, one player wants to trick Regiax and presents him with the dragon skull they found at the keep. Saarvith wants to trick the player and tells him to cross over in a small boat and present it in person. The player hesitates and the others tell him: “it’s a trap!” Saarvith promptly looses his patience and orders the attack. The players win initiative and shoot Saarvith. He dies before being able to do anything. The dragon dives into the water. The razorfiend does not loose morale. Fight!

    The party wins and takes Garslix prisoner. I really like the maneuver house rule: you can always propose a maneuver when you hit somebody. Opponents can either accept the consequences of the maneuver or elect to take the damage. That means that once you reduce people to near zero hit-points, they’ll gladly accept whatever you want to do to them.

    What about the treasure? It’s in Saarvith’s cabin, surrounded by water, with six ogers and an ettin inside.

    • 6 ogers, HD 4+1, AC 5, 1d10, F4, MV 9, ML 10
    • 1 ettin, HD 10, AC 3, 2d8/3d6, F10, MV 12, ML 9

    A players once again decide to parlay. His character’s charisma bonus is +2. The dice come up with two sixes. That’s super awesome helpful. They basically agree to hand over the dragon hoard, accept the players as their new boss, accept 3000 gold to go and hire a total of 30 ogres in the Giantshield Mountains and meet the party at Witchcross in 16 days to fight the Red Hand of Doom. I like reaction rolls.

    The black dragon hoard is rolled up at the table, by the players. They love doing this. Unfortunately, that also means I didn’t write it down. They did. They really love rolling up treasure.

    • total gold value of the electrum pieces and the 70 gems: 43’100 gp
    • a ring of invisibility
    • an elven sword +1
    • a treasure map to a wand of trap detecting that doesn’t interest them much

    What a find!

    I based the goblin treasure on the D&D 3.5 write-up but kept it stingy:

    • a goblin bow +1
    • 10 arrows of elf bane

    I hadn’t figured out what those elf bane arrows would do, but it didn’t matter: the party elected to destroy them all. Works for me!

    The ogres and the ettin get to keep their treasure, of course. There was no need to roll it up.

    Tags: RSS RSS RSS

    June 28, 2013 09:13 AM

    June 27, 2013

    Alex Schroeder

    Text Mapper for Traveller

    A few years ago I was working on Traveller Subsector Mapper. As I was thinking about the new Text Mapper, I wondered how feasible it would be to generate a Traveller subsector using Text Mapper. I know, it’s a stupid waste of time because I already have the Traveller Subsector Mapper. But I couldn’t resist the lure of showing off how flexible Text Mapper could be. And it works!

    Subsector created using Traveller Subsector Mapper:

    http://farm8.staticflickr.com/7424/9153223058_dae54b6bc5_c.jpg

    Subsector created using Text Mapper:

    http://farm8.staticflickr.com/7437/9153222700_fc92f88abf_c.jpg

    In order to reproduce it, use the following input:

    include http://alexschroeder.ch/contrib/traveller-example.txt

    The example file traveller-example.txt uses the library traveller.txt defining everything it requires.

    Tags: RSS RSS RSS RSS

    June 27, 2013 04:09 PM

    June 24, 2013

    Alex Schroeder

    Sardinien

    Wir sind aus den Ferien zurück. Bericht: Sardinien 2013.

    Tags: RSS

    June 24, 2013 07:44 AM

    June 14, 2013

    Phil Jones (Smart Disorganized)

    Smart Users

    Dave Winer :
    it would depend on my users being dumb, and as I said earlier, my users are anything but. They're the smartest people on the planet and I want to keep it that way. And I think anyone who makes software for dumb people in the end gets what they deserve. :-)

    by noreply@blogger.com (phil jones) at June 14, 2013 03:26 PM

    June 07, 2013

    Alex Schroeder

    Ultima und Pendragon

    Wir sind nicht zufrieden mit der family events Tabelle im King Arthur Pendragon Rollenspiel. Ständig laufen irgend welche Frauen weg und trotzdem sind unsere Sommer so gedrängt voll mit Ereignissen, dass kaum etwas passiert. Als wir dann auf Telecanters Dramarama Tabelle gewechselt haben, ist zu viel seltsames Zeug passiert: “Die Nichte heiratet den Bäcker und die Lösung ist, du schreibst darüber?” So ein Mist. Klar, man kann sich inspirieren lassen, aber all zu oft habe ich den Kopf geschüttelt und mir gedacht, wir sollten einfach nochmal würfeln. Nur die grosse Anzahl homosexueller Beziehungen fand ich gut. Vielleicht bin ich da natürlich auch von David Larkins Solo Great Pendragon Campaign mit seiner Frau geprägt…

    Am Ende des letzten Spielnachmittags beschlossen wir also, eine eigene Tabelle zu schreiben. Jeder trägt ein paar Einträge bei. Wie sich schon am Tisch etabliert hatte, sollte die Szene Verwandte oder andere Bekannte einführen und die Spieler ermutigen, ihr soziales Netz auszubauen, und die Szene sollte uns einen Einblick in den Charakter geben. (Ein Einblick in den Charakter des Charakters?) Dann hat man ein trait oder ein skill ausgewählt, um die Situation zu lösen oder um zu entscheiden, wie der Charakter darauf reagiert. Am letzten Sonntag habe ich dann auch grosszügig Checks gewährt, also ohne einen kritischen Wurf (normalerweise eine 5% Chance) die Möglichkeit zu gegeben, den Wert zu steigern.

    Wegen den Persönlichkeitszügen musste ich dann an die Charaktererschaffung in Ultima IV denken. Fragen, welche die acht Tugenden gegeneinander abwägen, um herauszufinden, mit welcher Charakterklasse und in welcher Stadt man das Spiel beginnt. Das Resultat in meinem Fall, beispielsweise:

    Thou hast shown that Compassion is the Virtue thou art most familiar with. Thou art a Bard, and thou shalt begin the Quest of the Avatar in Britain, the city of Compassion.
    Ultima character creation

    Immer noch!

    Kommen wir aber zum eigentlichen Thema des Artikels. Was habe ich denn vorgeschlagen?

    1Eine Cousine ist mit ihrem Vater oder Bruder zu Besuch. Es wird viel getrunken und gelacht. Am Ende lädt sie dich ein, sie auf dein Zimmer mit zu nehmen. Chaste oder Lustful? Falls du mit ihr schläfst, wie verhinderst du, dass alles auffliegt? Deceitful oder Cruel? Falls nicht, womit lenkst du sie ab, Dancing oder Singing?
    2Du machst einen Ausflug mit der Familie an einen See in der Nähe. Womit vertreibst du dir die Zeit? Boating, Falconry oder Gaming? Am Abend taucht ein Nachbar auf und will mit dir üben. Lazy oder Energetic?
    3Eine alte Frau will dein jüngstes Kind segnen. Suspicious oder Trusting? Lässt du sie in die Nähe des Kindes? Faery Lore. Falls nicht, warum weist du sie ab: Pious oder Arbitrary?
    4Ein Priester oder Druide in der Nähe brauchen deine Hilfe, doch du willst auf die Jagd und sagst ab. Warum? Lazy oder Selfish? Stattdessen schickst du einen Sohn oder Neffen. Dieser schlichtet den Streit auf ungeschickte Weise. Sagst du es ihm? Honest oder Deceitful.
    5Ein Ritter aus der Nachbarschaft ist zu Besuch und rühmt deine Taten in einer Schlacht, als Earl Roderick noch lebte. Erzählst du etwas? Modest oder Proud. Wenn du viel erzählst, oder dich lange dagegen wehrst, Oratory. Wenn du dich stattdessen kurz fasst, damit du die Gäste besser beobachten kannst, Awareness.
    6Deine Frau oder dein Stewart bitten dich um Rat, weil das Gemüse nicht gedeien will. Wie probierst du zu helfen? Selber machen, Stewardship; Bauern fragen, Folklore; Milch vor die Türe stellen, Faery Lore, in der Bibel lesen, Religion; nach Oxford gehen und einen Text von Hesiod lesen, Read. Nach ein paar Wochen wird ein Bauer gebracht, der die Felder offensichtlich nicht richtig gepflegt hat. Wie wirst du ihn bestrafen? Just, weil er die Aufgabe nicht erfüllt hat; Cruel, damit die anderen Bauern sich nicht ebenfalls gehen lassen; Merciful, weil die Religion dies gebietet; oder Arbitrary, weil du keine Zeit für so Schmarren hast?

    Die Idee wäre, dass jeder Spieler eine handvoll Einträge liefert und wir alle Einträge ersetzen, sobald sie erwürfelt wurden.

    Tags: RSS RSS

    June 07, 2013 10:37 AM

    June 05, 2013

    Alex Schroeder

    Gnomeyland and Text Mapper

    When I wrote my Old School Hex Map Tutorial, I noticed the Gnomeyland Map Icons and the Making Hex Maps With Inkscape tutorial by Gregory B. MacKenzie.

    After a futile attempt to write a tool that would extract those icons automatically and make them usable for Text Mapper, I did the work by hand. Look at the example below… Beautiful! And since this is SVG, you can quickly generate your first map and later you can keep working on it using Inkscape.

    http://farm8.staticflickr.com/7311/8958141006_7000b5627c_o.png

    To regenerate the map above, visit Text Mapper and use the following “map”:

    include http://alexschroeder.ch/contrib/gnomeyland-example.txt

    This loads the Gnomeyland example map which uses the Gnomeyland library.

    The Gnomeyland example map uses the tiles from the library. Here’s what you would need to generate just the lower part of the map:

    include http://alexschroeder.ch/contrib/gnomeyland.txt
    0005-0806 trail
    0105 dark-green fir-forest "to the caves"
    0106 dark-green fir-forest
    0205 green fir-forest
    0206 green fir-forest
    0305 green firs
    0306 soil keep "The Keep"
    0405 light-soil
    0406 light-soil
    0505 light-grey mountains
    0506 light-green forest-hill
    0605 grey grass
    0606 grey marsh
    0706 dark-grey swamp
    0806 dark-grey castle "Dolorous Garde"

    Just paste it into Text Mapper. :)

    Tags: RSS RSS RSS RSS

    June 05, 2013 10:25 AM

    June 03, 2013

    Alex Schroeder

    Identifying Magic Items

    http://farm4.staticflickr.com/3782/8935113955_fb90592986.jpg

    Youseph Tanha asked on Google+ how people identified magic items.

    I said:

    In my games, I don’t think unknowns add to the enjoyment of the game. After all, nobody knows about them. That’s why I only keep information from my players if one of the following is true:

    • it’s random and they don’t know the table I’m rolling on
    • I made a mistake and don’t want them to have easy access to the magic item just now
    • the magic item is part of foreshadowing and therefore I’m going to dole out info bit by bit
    • the magic item will serve as one or more plot hooks as information needs to be gained via quests

    In all cases, the How of the identification doesn’t matter and therefore I will just allow any character to discover it by examination in thematically appropriate ways (swinging it, aiming it, studying it, handling it, …).

    Example magic item of the “random effect” variety: the wand of the chimera consists of a number of intertwined branches with detailed animal heads at the end: a wolf, a goat, a dragon.

    1. hell hound, HD 1–6, AC 4, breathe fire with 1d6 per HD, bite 1d6, MV 12, SV 17-HD (16–11)
    2. giant bat, HD 2, AC 7, bite 1d4, MV 3/18 (fly), SV 15, echolocation sees invisible and in the dark
    3. lion, HD 5, AC 6, 2 claws 1d4, bite 1d8, MV 12, SV 12
    4. giant eagle, HD 4, AC 7, 2 claws 1d4, bite 1d8, MV 3/24 (fly), can carry a human
    5. giant goat, HD 3, AC 7, horns (2d6), MV 18, SV 14, +4 to damage when charging
    6. dragon, breath damage = current hit points, MV 9/24 (fly)
    1d6Color HD AC 2 claws bite breath SV
    1black 721d42d10acid 8
    2blue 901d63d10lightning 6
    3gold 11-22d46d6fire 4
    4green 811d63d8chlorine 7
    5red 10-11d84d8fire 5
    6white 631d42d8ice 9

    The hit points of the wand user remain unchanged! The HD are only used to determine the attack of the new form.

    This is based on Labyrinth Lord; licensed under the OGL.

    Section 15
    Chimera Wand, Copyright 2012, Alex Schroeder

    Tags: RSS RSS

    June 03, 2013 09:07 AM

    May 30, 2013

    Alex Schroeder

    Podcast Update

    http://upload.wikimedia.org/wikipedia/commons/thumb/f/fe/Trajan%27s_Column_Panorama.jpeg/151px-Trajan%27s_Column_Panorama.jpeg
    Trajan’s Column by Juan
    Francisco Adame Lorite
    (CC-BY 3.0)

    I have occasionally linked the podcasts I listen to both as an effort to remember and as an attempt at recommendation. It has been more than a year since my last update.

    I listen to podcasts while walking. I find walking to be ideally suited to listening because it is neither too strenuous to require much attention nor is it too light to let the mind wander.

    Looking at iCatcher! on my phone, I see the following podcasts:

    • Fear the Boot. The last RPG podcast I still listen to; it’s what I go to when I need some light entertainment; Dan is long-winded, I also don’t think there’s anything really new to say on the topic. I still laugh along with their jokes.
    • History of Philosphy “without any gaps”. I’ve listened to all the episodes up to Aristotle and I think I’ll continue listening! star
    • In Our Time with Melvyn Bragg. This continues to be the most awesome mix of science, philosophy and history. star
    • Musik der Welt. World music on the Swiss radio.
    • Sounds!. Independent music on the Swiss radio.
    • Thinking Allowed. Social science. star
    • This American Life. People stories. star

    Any podcasts you are listening to you’d like to recommend?

    Once you have listened to this overview, perhaps you’ll be ready for The History of the Decline and Fall of the Roman Empire— there’s an old recording on archive.org, or various readers on librivox.org.

    Update: If you’re a podcaster, check out this EFF effort: Help Save Podcasting!

    Tags: RSS

    May 30, 2013 08:09 AM

    May 29, 2013

    Alex Schroeder

    Decency

    A few days ago Jeff Rients wrote How many commandments have you broken? which lists TSR’s Code of Ethics. At the time I said The TSR code is definitely not cool. When asked to elaborate, I said (edited):

    Things that are not cool are:

    • language like “peak entertainment value”
    • “All product shall focus on the struggle of good versus injustice and evil” eliminates interesting moral dilemmas and gray areas
    • “shall not present explicit details and methods of crime, weapon construction, drug use, magic, science, or technologies that could be reasonably duplicated” eliminates an aspect of adult entertainment. What is a garrote and how does it work? How does a guillotine work? No smoking of weed, no injection of drugs? Personally, I feel that much of this is relevant to people growing up and learning how to make their own decisions
    • “Agents of law enforcement” cannot be corrupt, cannot be part of a tyranny? How to explore the Nazi terror and fascism? They cannot all be “an exception and the culprit should ultimately be brought to justice.”

    And so on. Every single point in that ethical code makes the world a bit safer, cushions us from the choices we need to make in real life. Yes, some of this may not be appropriate for all ages. It may have made sense for TSR to have such a policy. Nevertheless, I personally think that this will result in products that I think are not and will never be cool. Cool as in rebellious, exciting, risqué, exploring what it means to be human.

    Zak writes about it as well: Thanks For The List, TSR

    Tags: RSS

    May 29, 2013 11:30 AM

    May 26, 2013

    Alex Schroeder

    Popularity

    For a while now, I’ve been using Google’s +1 button at the bottom of the page. They’re special because they require two clicks: the first click loads the button code from Google, which you then have to click. If you don’t click anything, no code is being loaded from Google and hopefully you’re not being tracked. I also no longer use Google Analytics to track my stats so in theory Google shouldn’t be seeing any of your reading on this site.

    Usually my +1 counts are really low—mostly zero, in fact. Recently I noticed a few blog posts with more than ten +1. And now that I’ve announced the winners of a little contest I’m running every year, I see how far up the number could go… if only I blogged stuff that was more relevant to other people. Look at the last entry…

    http://farm4.staticflickr.com/3795/8841475140_31d134c183_o.png
    → 62 people clicked +1

    Oh well. As I’m noticing how much time I’m spending just reading the blogs and Google+ itself, I hesitate before posting on my own blog. Am I really adding much? In a way I felt better when I didn’t think of the audience and felt free to write a two sentence blog post about a movie I saw. These days I often wonder what the readers that come here for RPG posts will think.

    Since I don’t know how to make my writing more relevant to my readers, perhaps I should try to make my writing more natural again. We’ll see.

    Tags: RSS

    May 26, 2013 02:05 PM

    May 25, 2013

    Alex Schroeder

    One Page Dungeon Contest Winners

    We have the winners of the One Page Dungeon Contest 2013. Download the PDF!

    Author Dungeon Name Category
    Andrew and Heleen Durston Only Acrobats Need Apply Best Swashbuckling
    bygrinstow Arena of Blood Most Macabre
    Caelum Roberts Iron Cloud Best Sci-Fi
    Daniel O’Donnell Down Among the Dead Men Best Undead
    Gus L.The Brittlestone Parapets Best Wizard Duel
    Jens Thuresson The Giant’s Dollhouse Best Fairy-Tale
    Jobe Bittman Into The Demon Idol Best Homage
    Josh Burnett The Burial Mound of Gilliard Wolfclan Best One Shot
    Kaylee Thumann Girly Girl Dungeon Most Original
    LSF A Stolen Spring Best Fantasy Mystery
    Matthew W. Schmeer Wizard in the Woods Best Non-Traditional Map
    Misha Favorov Court of the King of No Men Best Beastmen
    Ramsey Hong Something Happened At The Temple Near Glourm Best Map
    Rob S Citadel of the Severed Hand Best Myconids
    Roger SG Sorolla Devil’s Acre Best Single Location
    S. J. Harris The Baleful Spring Best Tower
    Simon Forster Church of Consumption Best Religion

    Tags: RSS RSS

    May 25, 2013 04:11 PM

    May 23, 2013

    Alex Schroeder

    One Page Dungeon Contest Status Update

    http://farm4.staticflickr.com/3749/8798868810_8a186e3ffb_m.jpg
    Google Spreadsheet is my friend…

    We’ve been tallying the nominations, looking at our favorites and comparing notes for the One Page Dungeon Contest 2013. It looks like we’re going to have 17 winners this year. This looks about right, compared to previous years. In 2009 there were a lot of honorable mentions and runner-ups but only three winners. I personally like to spread prizes around and celebrate the sheer variety of submissions we get every year. It’s a win for everyone.

    Year Entries Winners
    20137217
    201210724
    20117115
    20106418
    20091123/6/12

    I hope we’ll be able to finalize the list soon enough!

    What will happen next:

    1. assemble a PDF with the winners
    2. publish the list of winners and link to the PDF
    3. celebrate!
    4. notify winners by email and ask them to create a wish-list based on the prizes donated by our sponsors
    5. try and maximize happiness using another spreadsheet
    6. notify sponsors and winners and have sponsors send their prizes directly to the winners (except for the cash prize; I’ll handle that one since the sponsor wants to remain anonymous)
    7. celebrate again! :)

    Hopefully my work is done before June 8, because that’s when I’ll leave for a two week vacation to Sardinia. Yay!

    Tags: RSS RSS

    May 23, 2013 07:55 AM

    May 17, 2013

    Alex Schroeder

    Pendragon RPG

    http://farm9.staticflickr.com/8413/8746075723_1d6720b08a_o.jpg

    Recently Joshua Petronis-Akins asked in the Pendragon RPG Google+ community: Could anyone sell me on Pendragon? What makes it cool?

    Coming from a D&D background, this is what made us want to play Pendragon RPG and The Great Pendragon Campaign:

    • a multi-generation campaign—play your knights, their sons, and their grandsons
    • the annual cycle—every session is about the adventures during the summer and the “levelling up” in winter
    • personality traits—knights have multiple traits that come in opposing pairs such as just vs. arbitrary and usually whenever you increase one, the other decreases; these traits sometimes get used to determine what the character does in spite of what the player might wish

    I really like the combat system: your skill is a number; roll below this number to succeed, roll the exact number to succeed critically. In a round, there is no need to roll for initiative. It’s all opposed checks. If you want to fight multiple opponents, you must split your skill between all your opponents and roll for each one. This is devastating. If you hit, roll damage. The opponent checks whether this value is higher than their knockback stat. If so, succeed at a horsemanship test or fall off the horse. Armor reduces damage. You can further reduce damage using a shield, but only if you had a “partial success”—only if you succeeded in your check but lost against an opponent who succeeded with a higher roll.

    Critical hits count as 20. If your skill rises above 20, just add that much to your roll. If your skill is 23, you roll 1d20+3. Thus, your crit range in effect is 17–20.

    It’s interesting, it’s different, and it still works.

    Our campaign is still in the Anarchy period.

    There’s a German campaign wiki, if you want to take a look: Ritter von Salisbury.

    Things we’re not that much into:

    • the resources game—gaining manors, building fortifications, hiring men, the minutiae of earning your taxes, paying for upkeep
    • the family events—we switched from the table in the rulebook to Telecanter’s Dramarama (with a few changes once we discovered that too many of our relatives kept eloping with butchers and tax men)

    I bought the books in 2011 from RPG Now, and they’re still doing fine:

    http://farm9.staticflickr.com/8231/8539404868_eaab402d46_n.jpg http://farm9.staticflickr.com/8244/8539409258_dd5be18586_n.jpg http://farm9.staticflickr.com/8101/8538296923_732dc0d2d7_n.jpg

    May 17, 2013 07:25 AM

    May 15, 2013

    Alex Schroeder

    Treasure Hunting In Niflheim

    http://farm8.staticflickr.com/7282/8739860841_54fe5d2a6a.jpg

    The party had just finished The Eternal Boundary and had found a treasure map that would lead them into The Gray Waste. I prepared a very linear adventure that you can see on the on the right. I decided that the map represented an incomplete list of dangers to be overcome:

    • near the roots of Yggrasil sleeps the dragon Níðhöggr…
    • in the woods the “children” of Hekate roam freely, the trolls of Niflheim (I’m claiming that Hel and Hekate are the same)
    • there are big, flightless birds in the swamps with big hands instead of wings and they are called Diakka…
    • there is a plain where nightmares ride, the mighty horses of black riders…
    • the larval petitioners live in the sea of fog…
    • the island of the black trees is the realm of a ghoul-witch

    I also had a number of NPCs in mind:

    • Njal, a priest and a drinker and a melancholy man who would act as a guide, if they wanted to pursue their connections with priestess Anja of the Freya temple
    • Raud, another priest and a gloomy, apathetic victim of Hades, who can provide them with information about Hades and who’ll offer to lead them to Hopelessness and through its gate to Hades (but this is a false lead since this gate will lead to the upper layer called Oinos where the Blood War rages)
    • Lissandra “gate-seeker” will contact them if they brag about the portal they know; she is described in Uncaged: Faces of Sigil; she can lead them to Alluvias Ruskin (in the same book) who will sell them “the holy axe with the wooden root-grip of wisdom” which will be required to travel to Niflheim via Yggdrasil

    This was the first challenge: figure out whom to trust and discover through questions that Raud would lead them to the wrong layer on Hades since Oinos ≠ Niflheim. This was also the opportunity for them to learn about the apathy of Hades. One player expertly decided to spend 100gp on books with jokes, fart machines and other ludicrous things to drive away apathy and despair.

    They don’t contact Njal but they do talk to Raud and end up going with Lissandra. They made such a good impression on her, in fact, that she decides to tell them about a merchant called Kherion Mallibrun (described in the section about Death of Innocence in the Planes of Conflic box). In return, he wants them to protect him from Hekate’s trolls.

    This was the second challenge: take along a guide and avoid fighting rock pythons and giant squirrels on the branches of Yggdrasil.

    The dragon is easy: the third challenge is simply to be quiet. The cleric is prepared and casts silence. No problem.

    The woods and trolls present the fourth challenge: unbeknownst to the players, I had decided that the forest houses both wolves and trolls. Even though the party was silenced, the wolves had picked up their scent and the trolls were following the wolves. One player who plays a character that can fly decided to take a listen and fly overhead. He soon discovers the wolves and using the fillings of a little rocket full of itching powder they disable the wolves’ scent ability and the flying character distracts and enrages the trolls until they break off the chase.

    In the village, they see that the merchant is selling colorful textiles and the fifth challenge is finding a guide to the island. They discover that there is a hunter of nightmares who will lead them in exchange for the funny articles one of the characters had bought. This part was all improvised but it worked well.

    He warns them of the giant, flightless birds. Luckily they are slow. The party buys horses for the three characters in plate armor and can thus outrun the the sixth challenge, the Diakka birds.

    I had thought that the nightmares would be the next challenge but at the table I suddenly felt strange using the nightmares as predators. As I had seen one of the players get really excited about the prospect of catching and taming a nightmare, I decided that the seventh challenge would be the temptation of catching a nightmare. The party would have to start a fight. And they didn’t…

    The eight challenge had not been listed on the “treasure map”: flying yeth hounds. The party moved away from their baying (it’s effect only works within 100 ft.) and decided to avoid the dogs. It worked.

    At the edge of the sea of fog, they left their guide who, when asked, said that all they had to do was ignore the larva. And they did. No talking, no eye contact, no listening. Again, the party used silence to bypass the ninth challenge. It worked.

    Finally, they reached the witch, the tenth challenge. I decided to use witches from the Shark Den section of the Caverns of Slime, Vialashta and Kurmatesha, the four lesser witches, the tengu horn, and my own treasure I had rolled up. As you can see, I had prepared a different night hag in my notes (including a 65% magic resistance)… Oh well. There was a lot of talking, bluffing and haggling involved, a short discussion on the merits of both Odin and Hekate, but in the end, the orc witch has charmed the talking character and disappeared into the tent and the fight was on.

    The party consisted of a cleric 5, a fighter 4, an elf 2, and some henchmen: two giant apes, a cleric 4, a fighter 2, and a magic-user 1.

    The enemies:

    • Vialashta, the one-eyed crow priestess of the orcs (HD 9; AC 8; Atk 1 orcish hammer (1d6); MV 9; curse at will, roll d6: 1. slowed, 2. blind, 3. stupid like an ox, 4. weak as a baby, 5. contract the plague, 6. crippling pain; save vs. spells to avoid)
    • her four witches (HD 5; AC 8; Atk 1 cudgel (1d6); MV 9; curse 3×/day as above)
    • Kurmatesha, the orc witch (HD 9; AC 9; Atk 1 staff (1d6); MV 9; spells as per her spellbook below); she has the horn of the mountain cedar which summons twelve tengu once per day: crow-headed, flying swordsmen (HD 5; AC 7; Atk 1 two handed glass swords (2d6); MV 9 fly); if attacked she will polymorph into a shadow wolf (HD 9; AC 7; Atk 1 bite (2d6); MV 12; howl of pain (anybody touching the ground within 60 ft. must save vs. petrification or be stunned for a round and save vs. death or suffer 1d6 damage from bleeding ears)
    • the hanging tree (HD 15; AC 3; Atk 8 branches and roots (1d6 each); MV 0); the branches of the hanging tree are loaded with twitching corpses: twelve armless ghouls are hanging up there, unable to free themselves (HD 2; AC 9; Atk 1 bite (1d6); MV 12)

    Kurmatesha is reduced to less than 10 hit-points in two rounds. She, in turn, blows the horn and summons the tengus, then polymorphs into a shadow wolf. The party then kills her and have a quick chat with the tengu. They want the horn (and their freedom), but one character is close enough to the horn to blow it again, at which point I decide that the tengu are all dispelled.

    The second half of the battle is a running battle as the witches are standing under the hanging tree, cursing all that approach. With a desperate rush, a character delivers the arrow that has silence cast on it to the witches. The witches start releasing ghouls but they are being turned as fast as they are being released. Finally, when the crow witch Vialashta is finally held using magic, the remaining lesser witches flee into the sea of fog.

    The witch tells them that the hanging tree is guarding the treasure and since they stocked up on oil and hadn’t used any of it, I decided that burning a 15 HD tree required 15 flasks of oil—and having bought 20 flasks of oil without having to use them against the trolls, that was no problem at all…

    • 20’000 gold pieces
    • 10 gems worth 1980 gold pieces (1000, 10, 50, 10, 10, 500, 100, 100, 50, 100)
    • two pieces of jewelry (“the crown and sceptre of the Ulfides”)
    • a halfling chain +1 and a small shield +1 (“the magic armor of a halfling hero with the heraldry of the Oxwrestler clan”)
    • the horn of the mountain cedar (I already fear that this item might be too powerful!)

    Tags: RSS RSS RSS

    May 15, 2013 09:29 AM

    May 14, 2013

    Alex Schroeder

    When To Roll

    Recently I left a comment on Philip Watson's thread on Google+ where he wondered whether players should know when their thief failed to hide. I said:

    I let them roll in the open but will delay the roll until immediate consequences are at hand. Player says their character is hiding, no roll required. Orcs are coming. Now you roll—and if you fail, they spot you.

    Consequences happen right after the result of the die roll is known. As a referee, I have have no “information advantage” and thus the question of unfairness doesn’t come up.

    I was reminded of Courtney Campbell’s blog post On Skill Deconstruction: Why Roll for Resolution? He lists five reasons for rolling dice.

    1. time constraints
    2. in conflict with another entity
    3. a serious consequence for failure
    4. impossible to model at the table
    5. (partial results can make the procedure more exciting)

    I’m trying to have thieves succeed automatically whenever possible. I’m going to opt for dice rolling when the conditions listed above are true. If the dungeon has wandering monsters, each failed roll to open a door or unlock a chest means one check for wandering monsters. If there are no monsters, we don’t need to know how long the thief takes to unlock the chest. It will succeed eventually.

    Tags: RSS

    May 14, 2013 01:25 PM

    May 13, 2013

    Alex Schroeder

    Other Favorite Entries

    http://farm8.staticflickr.com/7294/8733961353_32f503d211_n.jpg

    I just posted my nominations for the One Page Dungeon Contest 2013. I also liked the following entries.

    I saw Roger the GS’ recommendations the other day. What about your favorites?

    Tags: RSS RSS

    May 13, 2013 10:07 AM

    My One Page Dungeon Contest Nominations

    http://farm8.staticflickr.com/7318/8735009164_dbb6eb8e7c_n.jpg

    I’ve finished reading the submissions to the One Page Dungeon Contest 2013. As always, an interesting mix of styles. Less tombs than in previous years. The ever popular “get into the dungeon and trigger a trap” is there. Bandits, undead, but no pirates! This year’s popular rare monster must have been the gibbernig mouther. It showed up in three submissions. :)

    Gibbering Mouthers:

    I wanted to comment on my nominations for the contest winners. I’ve done this before (2010, 2011, 2012). Writing it all down helps me think it through.

    • Daniel O'Donnell, Down Among the Dead Men: beautiful map; lovely visuals such as a well surmounted by the jaws of a giant shark or acolytes on stilts “tending” the undead in the water. It’s gruesome. It stands on its own and can be placed in my campaign.
    • Gus L., The Brittlestone Parapets: a lovely amalgam of trench warfare, undead soldiers, Beowulf, D&D as an implied post-apocalyptic setting; and it comes with an inspiring map, an interesting list of random encounters, the witch comes with the list of spells prepared, one faction can be hired for a few weeks. It’s fascinating. It stands on its own and can be placed in my campaign.
    • Jobe Bittman, Into The Demon Idol: an iconic image, a beautiful map, the giant grab pincer. Best of all: the option of reanimating it! A potential long-term change for your campaign. It’s tempting. It stands on its own and can be placed in my campaign.
    • Misha Favorov, Court of the King of No Men: a map that allows multiple approaches; the most important notes are on the map itself. That’s what I love! The two simple magic items are interesting without being overengineered: a sword dealing wounds that heal within 24h, a hammer that can be thrown once a day, a rod that allows you to control the movement of an opponent (but nothing else). It’s sylvan. It stands on its own and can be placed in my campaign.
    • Paul Gorman, Faery Ring to Alpha Ari: not the only adventure using myconids and various fungus effects, but what I liked in particular was the strange mix of fantasy and present day space exploration; the observatory and the tiny island on the one hand and a map that looks appropriate for a Mars colony. I also like how enemies come in all sizes from pixies to giant. I’m not sure it would simply fit into my campaign.
    • Ramsey Hong, Something Happened At The Temple Near Glourm: a beautiful map with village and five dungeon levels; multiple stairs and entrances; notes on the map itself. This dungeon is beautiful. It’s terrifying. It stands on its own and can be placed in my campaign.
    • Rob S, Citadel of the Severed Hand: another beautiful map with notes on the map itself; it also features myconids and “shroom effects”. The part I like is the tragic figure of the orc boss with his staghelm who hates the torturer demon because she has his son in her power. The entire setup with the two slaves is genious. It’s evil. It stands on its own and can be placed in my campaign.
    • Roger SG Sorolla, Devil's Acre: when I first read about it on the author’s blog I thought that it was an interesting take on the complex of sin, vigil, prayer, temptation, saint and devils, and all of that in a D&D context. My campaign hasn’t featured these topics, however, so I’m not sure how well it would work for me.
    • S. J. Harris, The Baleful Spring: a small tower always comes in handy. This one has a tower with an evil master and a ship with a neutral captain. I like the framing story: two diplomats trying to secure a peace accord have gone missing. It’s nothing fancy with a functional map. It’s useful. It stands on its own and can be placed in my campaign.
    • Simon Forster, Church of Consumption: a beatiful map; another cult trying to raise a demon. Unfortunately it’s very linear. Strangely enough it appears to be open on both ends with major treasure sitting right next to one of the two entrances. But… it’s so beautiful. And I love the imagery of the cultists eating their dead god, the meat grinder, the ghouls dreaming about eating the same dead god, one day… It’s gruesome. It stands on its own and can be placed in my campaign.

    The One Page Dungeon Contest is just so damn useful it amazes me every year.

    Tags: RSS RSS

    May 13, 2013 09:18 AM

    May 08, 2013

    Alex Schroeder

    Distributing XP With Emacs

    This topic ties together two topics that probably don’t see too much overlap.

    1. I play role-playing games of the D&D old school variety.
    2. I use Emacs to help me do simple stuff on a daily basis.

    The problem: the party of characters my players run is huge. Even if there are usually only around ten characters that are part of a single session, there are more than thirty primary and secondary characters on the status page. Given the wiki table for the status page, how can I quickly add up the correct XP and gold values? Any XP gained is shared equally amongst the characters that took part in the session but any gold gained is distributed according to each characters share. Primary characters get a full share, secondary characters get a third of a share.

    I used Emacs widget mode to create a page like this:

    XP total:   805          
    Gold total: 7191         
    [X] Schalk
    [ ] Uluf
    [ ] Witschik
    [X] Schachtmann
    [ ] Sirius
    [X] Logard
    [X] Arnd
    [X] Tinaya
    [ ] Pyrula
    [ ] Pijo
    [ ] Garo
    [X] Zeta
    [ ] Pipo
    [X] Fusstritt
    [ ] Thor
    [ ] Jack
    [ ] Gloria
    [ ] Hermann
    [ ] Urs
    [ ] Alpha
    [ ] Beta
    [ ] Gamma
    [ ] Boden
    [ ] Basel
    [ ] Bern
    [X] Nuschka
    [ ] Moranor
    [ ] Axirios Hectaxius
    
    [Go!]

    And here’s the code to do it:

    (defconst fünf-winde-regexp "^\\(|\\[\\[\\(.*?\\)\\]\\][ \t]*|[ \t]*\\(1\\|1/3\\)[ \t]*\\)|\\([ \t]*[0-9]+[ \t]*\\)|\\([ \t]*[0-9]+[ \t]*\\)"
      "Regular expression to parse the Status page.
    \(let ((str (match-string 1))
          (name (match-string 2))
          (share (match-string 3))
          (xp (match-string 4))
          (gold (match-string 5)))
        ...\)")
    
    (defvar fünf-winde-buf nil
      "Source buffer.")
    
    (defvar fünf-winde-xp nil
      "XP share.")
    
    (defvar fünf-winde-gold nil
      "Gold share.")
    
    (defvar fünf-winde-party nil
      "Charakters in the party.")
    
    (defun fünf-winde-xp-and-gold ()
      "Hand out Gold and XP."
      (interactive)
      (let ((buf (current-buffer))
    	(names))
        (save-excursion
          (goto-char (point-min))
          (while (re-search-forward fünf-winde-regexp nil t)
    	(setq names (cons (match-string 2) names))))
        (switch-to-buffer "*Fünf Winde*")
        (kill-all-local-variables)
        (set (make-local-variable 'fünf-winde-buf) buf)
        (make-local-variable 'fünf-winde-xp)
        (make-local-variable 'fünf-winde-gold)
        (make-local-variable 'fünf-winde-party)
        (let ((inhibit-read-only t))
          (erase-buffer))
        (remove-overlays)
        (setq fünf-winde-xp
    	  (widget-create 'integer
    			 :size 13
    			 :format "XP total:   %v\n"
    			 0))
        (setq fünf-winde-gold
    	  (widget-create 'integer
    			 :size 13
    			 :format "Gold total: %v\n"
    			 0))
        (setq fünf-winde-party
    	  (apply 'widget-create 'checklist
    		 (mapcar (lambda (name)
    			   `(item ,name))
    			 (nreverse names))))
        (widget-insert "\n")
        (widget-create 'push-button
    		   :notify (lambda (&rest ignore)
    			     (fünf-winde-process
    			      fünf-winde-buf
    			      (widget-value fünf-winde-xp)
    			      (widget-value fünf-winde-gold)
    			      (widget-value fünf-winde-party)))
    		   "Go!")
        (widget-insert "\n")
        (use-local-map widget-keymap)
        (local-set-key (kbd "q") 'bury-buffer)
        (local-set-key (kbd "SPC") 'widget-button-press)
        (local-set-key (kbd "<left>") 'widget-backward)
        (local-set-key (kbd "<up>") 'widget-backward)
        (local-set-key (kbd "<right>") 'widget-forward)
        (local-set-key (kbd "<down>") 'widget-forward)
        (widget-setup)
        (goto-char (point-min))
        (widget-forward 1)))
    
    (defun fünf-winde-process (buf total-xp total-gold party)
      (message "(fünf-winde-process (get-buffer \"%s\") %d %d '%S)"
    	   buf total-xp total-gold party)
      (switch-to-buffer buf)
      (save-excursion
        (let ((xp-shares 0)
    	  (xp-share nil)
    	  (gold-shares 0)
    	  (gold-share nil))
          (goto-char (point-min))
          (while (re-search-forward fünf-winde-regexp nil t)
    	(let ((name (match-string 2))
    	      (share (match-string 3)))
    	  (when (member name party)
    	    (setq gold-shares (+ gold-shares
    				 (cond ((string= share "1/2") 0.5)
    				       ((string= share "1/3") (/ 1.0 3))
    				       (t (string-to-number share))))
    		  xp-shares (1+ xp-shares)))))
          (setq gold-share (/ total-gold gold-shares)
    	    xp-share (/ total-xp xp-shares))
          (goto-char (point-min))
          (while (re-search-forward fünf-winde-regexp nil t)
    	(let ((str (match-string 1))
    	      (name (match-string 2))
    	      (share (match-string 3))
    	      (xp (match-string 4))
    	      (gold (match-string 5)))
    	  (when (member name party)
    	    (setq gold (format (concat "%9d")
    			       (+  (string-to-number gold)
    				   (* gold-share (cond ((string= share "1/2") 0.5)
    						       ((string= share "1/3") (/ 1.0 3))
    						       (t (string-to-number share))))))
    		  xp (format (concat "%9d")
    			     (+  (string-to-number xp)
    				 xp-share)))
    	    (replace-match (concat str
    				   "|" xp
    				   "|" gold))))))))

    I’m not sure I’m spending my time wisely, but there you go. I used to have a simpler piece of code that helped me distribute XP and gold separately. The drawback was that it would ask me for every person in the table “was this character in the party? (y/n)” and that’s a lot of yes and no replies if you go through the list twice.

    It’s also a stark reminder that simpler old rules doesn’t automatically mean less work for the referee. With D&D 3.5, I had a spreadsheet to compute the XP gained based on challenge rating and character level. It wasn’t something to do quickly without a book in front of me. Now the complexity of the task has been reduced, but the number of characters has exploded to compensate!

    Tags: RSS RSS RSS

    May 08, 2013 01:17 PM

    May 07, 2013

    Alex Schroeder

    iPhone Sync and Not Enough Disk Space

    Once again, I’m syncing my wife’s iPhone using iTunes and half way through the process it claims that it can’t do it because the computer is out of disk space. With more than 9 GB on the main hard disk and much more on the external hard disk (and a link from ~/Library/Application Support/MobilySync to the external hard disk), this is simply impossible. Strangely enough, synchronization continues anyway.

    Luckily I remembered what to do: open preferences, find the backup for my wife’s device and delete it. Done. Now I can sync without any messages interrupting it. Strange.

    Tags: RSS RSS

    May 07, 2013 07:19 PM

    WMA to MP3

    This is based on How to Convert Unprotected WMA Files Into MP3 Files. I’m leaving the instructions here for my future self. :)

    for file in *.wma; do
      mplayer -vo null -vc dummy -af resample=44100 \
        -ao pcm:file="${file%%.[Ww][Mm][Aa]}.wav" "$file"
      lame --preset standard "${file%%.[Ww][Mm][Aa]}.wav" \
        "${file%%.[Ww][Mm][Aa]}.mp3"
    done 

    Use locate lame|grep 'lame$' and locate mplayer|grep 'mplayer$' to find the location of your executables. On a Mac, they’re probably not on your PATH… I installed MPlayer OSX and iTunes-LAME to get the executables. You’ll need to do something similar.

    This is the result I just used for some files with upper case file extension:

    for file in *.WMA; do
      "/Applications/MPlayer OSX.app/Contents/Resources/External_Binaries/mplayer_intel.app/Contents/MacOS/mplayer" \
        -vo null -vc dummy -af resample=44100 \
        -ao pcm:file="${file%%.[Ww][Mm][Aa]}.wav" "$file"
      "/Applications/iTunes-LAME.app/Contents/Resources/lame" \
        --preset standard "${file%%.[Ww][Mm][Aa]}.wav" \
        "${file%%.[Ww][Mm][Aa]}.mp3"
    done 

    Tags: RSS RSS RSS

    May 07, 2013 06:11 PM

    Phil Jones (Smart Disorganized)

    Gates of Dawn

    A very, very short library I wrote to let me programmatically create Pure Data patches in Python.

    Full story on my other blog.

    On GitHub.

    by noreply@blogger.com (phil jones) at May 07, 2013 05:14 PM

    Alex Schroeder

    Raspberry Pi WiFi

    Reading Raspberry Pi: WLAN einrichten… I bought the Nano-WLAN-USB-Stick 150 Mbps by hama.

    pi@raspberrypi ~ $ lsusb
    Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp. 
    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. 
    Bus 001 Device 004: ID 0bda:8176 Realtek Semiconductor Corp. RTL8188CUS 802.11n WLAN Adapter
    pi@raspberrypi ~ $ sudo apt-get install firmware-realtek
    Paketlisten werden gelesen... Fertig
    Abhängigkeitsbaum wird aufgebaut.       
    Statusinformationen werden eingelesen.... Fertig
    firmware-realtek ist schon die neueste Version.
    0 aktualisiert, 0 neu installiert, 0 zu entfernen und 0 nicht aktualisiert.

    Apparently I installed it already. iwlist wlan0 scan results in a lot of output. Including the network I’m looking for:

    pi@raspberrypi ~ $ iwlist wlan0 scan | grep Schroeder
                        ESSID:"Schroeder"

    Set your network and password using sudo nano /etc/wpa.conf. This is what you want:

    network={
     ssid="YOUR-SSID"
     proto=RSN
     key_mgmt=WPA-PSK
     pairwise=CCMP TKIP
     group=CCMP TKIP
     psk="WPA-PASSWORD"
    }

    Edit the list of interfaces using sudo vi /etc/network/interfaces and append the following:

    auto wlan0
    iface wlan0 inet dhcp
    wpa-conf /etc/wpa.conf

    I was astonished to find some stuff relating to wlan0 in the file already. Anyway, I followed the instructions…

    Restart and check:

    pi@raspberrypi ~ $ ifconfig
    eth0      Link encap:Ethernet  Hardware Adresse b8:27:eb:81:a6:af  
              inet Adresse:192.168.2.3  Bcast:192.168.2.255  Maske:255.255.255.0
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metrik:1
              RX packets:114 errors:0 dropped:0 overruns:0 frame:0
              TX packets:94 errors:0 dropped:0 overruns:0 carrier:0
              Kollisionen:0 Sendewarteschlangenlänge:1000 
              RX bytes:17450 (17.0 KiB)  TX bytes:14232 (13.8 KiB)
    
    lo        Link encap:Lokale Schleife  
              inet Adresse:127.0.0.1  Maske:255.0.0.0
              UP LOOPBACK RUNNING  MTU:16436  Metrik:1
              RX packets:8 errors:0 dropped:0 overruns:0 frame:0
              TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
              Kollisionen:0 Sendewarteschlangenlänge:0 
              RX bytes:1104 (1.0 KiB)  TX bytes:1104 (1.0 KiB)
    
    wlan0     Link encap:Ethernet  Hardware Adresse 80:1f:02:8f:91:26  
              UP BROADCAST MULTICAST  MTU:1500  Metrik:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0
              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
              Kollisionen:0 Sendewarteschlangenlänge:1000 
              RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

    The last entry is shows that we didn’t get an IP number. Oops! It turns out that there is some other stuff in the /etc/network/interfaces file that might interfere. Commenting them out, I have:

    auto lo
    
    iface lo inet loopback
    iface eth0 inet dhcp
    
    # allow-hotplug wlan0
    # iface wlan0 inet manual
    # wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
    # iface default inet dhcp
    
    auto wlan0
    iface wlan0 inet dhcp
    wpa-conf /etc/wpa.conf

    Still doesn’t work, however. I tried a few variants for the config files. Nothing seemed to work. This makes me so tired. I’m not sure I’m learning much. This is “fiddling with GNU/Linux” and frustrating. :(

    Then I read How to install Wifi on a Raspberry Pi which tells you to install wicd-curses.

    That seemed to work! Suddenly ifconfig provided me with an IP number for wlan0. I removed the ethernet cable, rebootet, and was unable to connect. Did the IP number change? Is DHCP taking too long? Why is bonjour not working? Patience! It just takes forever to boot. After a minute—long enough to write this paragraph--it suddenly worked:

    alex@Pyrobombus ~$ ssh pi@raspberrypi.local
    pi@raspberrypi.local's password: 
    Linux raspberrypi 3.6.11+ #371 PREEMPT Thu Feb 7 16:31:35 GMT 2013 armv6l

    Yay!

    Tags: RSS

    May 07, 2013 12:26 PM

    May 02, 2013

    Phil Jones (Smart Disorganized)

    Tags in RSS?

    A quick question. What's the right way to add "tag" information to an RSS feed? (So that a story can have a number of tags associated with it? Eg. my last story here was tagged "wiki", "bill seitz" etc.)

    Looking at the spec there's a "category" sub-element. Is it this? Does each category need to have a different "category-domain" value? Or can I have multiple categories for an item with the same domain? (This is what Blogger itself seems to do.)


    by noreply@blogger.com (phil jones) at May 02, 2013 03:30 PM

    Bill Seitz : Wiki Graph

    Over on my main blog you may have seen that I'm musing about my online presence again. Increasingly fed up with Facebook I've now taken the plunge to remove myself entirely. (I haven't, as of writing, deleted my account only because I need to extract some more writings before I do.)

    I'm also increasingly concerned about my dependence on Google for so much of my online life.

    One man who has few such qualms is Bill Seitz, who has consistently stuck to his home-brewed WikiLog concept over the last 10+ years. I've criticised the idea of WikiLog before - with one of my high-falutin conceptual arguments - but actually I've had to admit that Seitz is right and I'm wrong. The virtues of combining wiki and weblog functionality in your own software (which means very easy, high-density linking between both types of entry, and consistency of managing the address, full ownership etc.) outweigh any qualms about the difference of addressing philosophies.

    Now Seitz has gone back to adding functionality to his wiki : the WikiGraphBrowser adds dynamic visualisation that shows the links between pages, creating an instant "TouchGraph" style mind-map. I'm excited, partly because of the software he's producing, but partly because here's another smart person investing in wiki's future.

    by noreply@blogger.com (phil jones) at May 02, 2013 03:20 PM

    May 01, 2013

    Alex Schroeder

    One Page Dungeon Contest Submissions

    1PDC The One Page Dungeon Contest 2013 is now officially closed. No more late submissions. This year I found two submissions in my spam folder. If you can’t find your submission on the contest page, let me know. This year I also got four late submissions, which is about average, I’d say. I asked the other judges and we decided to accept the ones I received. I have to draw the line somewhere, though… So this is it. Closed. :)

    Here’s how to get all the files:

    72 Submissions! :D ok star

    20092010201120122013
    Number of submissions112647110772

    Tags: RSS RSS

    May 01, 2013 03:10 PM

    April 30, 2013

    Alex Schroeder

    The Fall

    Recently reports have started resurfacing… (I’ve been following Jürgen Hubert on Google+.)

    At one point I left the following comment:

    The fall of the US from a spiritual leader of freedom and democracy when I was young – in the seventies and eighties I knew nothing of Vietnam and I grew up with American pop music – to a war mongering nation, to a nation that systematically tortures prisoners, a nation that refuses due process to prisoners, to a nation that imprisons so many of their own population, to a nation that uses cruel and unusual punishment in the form of Three Strikes and its variations – there are no words for this moral catastrophe. No words.

    I’m still torn: was my decision do abandon my ranting online and turn into a gamer (HomoLudens) the right thing to do? After all, if we all retreat into our little shells, if we all tend to our little gardens, then nothing ever changes, right?

    Tags: RSS

    April 30, 2013 12:56 PM

    April 26, 2013

    Alex Schroeder

    Emacs Wiki Redesign

    I finally installed the new theme for Emacs Wiki. Feel free to leave comments on the Talk page. Bootstrap allows me to make all the changes at run-time, ie. add a few scripts including a script that changes the wiki’s HTML (emacs-bootstrap.js) and a new CSS file (bootstrap.css).

    Since no changes to the script are necessary I can continue to provide the old theme for those that don’t feel like switching.

    Tags: RSS

    April 26, 2013 12:42 PM

    April 24, 2013

    Alex Schroeder

    Cosmology of Love and Strive

     Maximilián Pirner, Empedokles As I was listening to the episode on Empedocles on the History of Philosophy “without any gaps” podcast, my thoughts turned to cosmology and D&D. Basically, there is a big cycle between the rule of Love, where all the elements mingle and everything is a single perfect sphere, and Strife, where all the elements separate, fire over here, water over there, and so on.

    Implementing this in fantasy role-playing games we need to change some of the Great Wheel cosmology of Planescape. The inner planes are now the outer planes: The four elements are the chaotic forces pulling us in different directions. All elemental creatures must be very chaotic and enemies of life. At the center, where all elements meet, there is but a humongous sphere of gray goo. I guess all the slimes, puddings and oozes must be creatures of law Love. They bring all the elements together and none better than the gray ooze. Given all that, the world we know must necessarily be between the elements and the spherical goo, ie. on the spherical surface.

    What about dungeons? What about the “mythic underworld”? I think we have various options:

    1. The concept of Love that pulls the elements together is just as inimical to life as Strife: the civilizations that have gone before us have all been pulled underground, closer and closer to each other, until war and attrition destroyed them all; perhaps a few gaunt dessicated members of the old Atlanteans still live down there in the deepest depths, close to the gray goo, guarding their nuclear weapons and their nanotech weapons.
    2. The concept of Love offers some form of transcendence over the material world; it attracts good and evil alike; it tests us, breeds us, selects the finest amongst us, and like zygotes we penetrate the deepest secrets to eventually reverse the great cycle, to break the stalemate.

    In either case, monsters are drawn down to the center of things just as we are. The traps can be set by our competitors down there, or by the gray goo defending itself against unworthy plunderers.

    I think we need one final idea to make it all work: How to explain the heavens and the moon and the stars if “up above” we expect to see the four elements?

    1. Our known world exists where earth and air have started separating; the oceans is where the water is. If you sail far enough, there will be no more land and eventually, no more air. You’ve reached the plane of Water. If you climb the highest mountains, eventually you will realize that you have reached the wall of walls. Air ends and the plane of Earth begins. Up where the sun is, fire reigns. It has already left most of the known world. Whenever we light a fire, the flames leap up, up towards the sky, towards the sun, towards the great fire in the sky that burns far beyond the sky.
    2. Alternatively, the known world is just like present day earth. The air protects us from space. Space is in effect the Void separating the four elements under the dominion of Strife and the gray goo under the dominion of Love (and its tiny crust of weirdness that is life).

    Food for thought, in any case.

    I like how the podcast provides two interesting links:

    The second link uses “font-family:comic sans ms, verdana, arial, sans-serif”. Comic Sans. You have been warned. :)

    Tags: RSS

    April 24, 2013 12:44 PM

    April 22, 2013

    Alex Schroeder

    Raspberry Pi

    http://farm9.staticflickr.com/8264/8668963053_8315a1de94_n.jpg

    I got a Raspberry Pi from my employer. Nice! Installed Raspbian. Used HDMI to connect to the TV. That worked.

    Note: I have a 2Gb and a 4Gb card and I want to give PiMAME a try (play arcade games using MAME), so I will need the 4Gb card for PiMAME. At the same time, I want to use Raspbian to play videos. That goes on the 2Gb card.

    Connected Apple keyboard and mouse via USB. That caused repeating keys and all that. I read that the problem is a lack of power on the USB port. I could buy a USB hub as suggested.

    One cable to rule them all. The cable modem is too far from the TV. Even if I did that, it would take my wireless network down. On my Mac Mini, I enabled sharing of my wireless connection with the ethernet (System Preferences → Sharing → Internet Sharing) and connected the Raspberry Pi to my Mac using an ordinary ethernet cable I had lying around. I was able to connect using ssh pi@192.168.2.3. You might have to guess the last digit?

    Via ssh, I run sudo raspi-config and set it up: expand_rootfs, configure_keyboard, change_locale (choose de_CH.UTF8, pick en_GB.UTF8 as the default), set_timezone (Europe / Zurich), memory_split (64)… Maybe the memory split is already the default? I might have to switch on overclocking in the future in order to play games.

    Following suggestions online, I wanted to get my Apple bluetooth keyboard working. First, I updated and upgraded my packages before doing anything: sudo apt-get update, sudo apt-get upgrade and sudo apt-get autoremove.

    Note: Do all this while connected to the Raspberry Pi via ssh. You keyboard needs to be paired and all that before it will work stand-alone.

    Next, bluetooth: sudo apt-get install bluetooth bluez-utils blueman. This installs a lot of stuff I probably won’t need. Oh well, I spent some time trying to sort through it and figured it wasn’t worth it. If you’re installing on a 2Gi card, you’re going to be running out of space real soon now:

    pi@raspberrypi ~ $ df 
    Filesystem     1K-blocks    Used Available Use% Mounted on
    rootfs           1838936 1751248         0 100% /

    Try sudo apt-get clean to make some space:

    pi@raspberrypi ~ $ df 
    Filesystem     1K-blocks    Used Available Use% Mounted on
    rootfs           1838936 1567016    178880  90% /

    In the end, this is how it should work:

    pi@raspberrypi ~ $ lsusb
    Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp. 
    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. 
    Bus 001 Device 004: ID 0a5c:200a Broadcom Corp. BCM2035 Bluetooth dongle

    I guess the Bluetooth dongle has been recognized!

    pi@raspberrypi ~ $ hcitool scan
    Scanning ...
    	E8:06:88:38:C6:2F	Apple Wireless Keyboard
    	00:02:72:D4:E9:EA	DOC-PC

    This was a bit more complicated:

    pi@raspberrypi ~ $ sudo bluez-simple-agent hci0 E8:06:88:38:C6:2F
    RequestPinCode (/org/bluez/5802/hci0/dev_E8_06_88_38_C6_2F)
    Enter PIN Code: 0000
    Release
    New device (/org/bluez/5802/hci0/dev_E8_06_88_38_C6_2F)

    Type 0000 RET on the Mac. Type 0000 RET on the keyboard. Not sure whether the “sudo” was required or not.

    On we go:

    pi@raspberrypi ~ $ sudo bluez-test-device trusted E8:06:88:38:C6:2F yes

    Make sure the keyboard is “on” when you run the next step:

    pi@raspberrypi ~ $ sudo bluez-test-input connect E8:06:88:38:C6:2F

    Ok, time to give it a try… Remember that you’re probably using a British keyboard layout. The y key might be where your z is. This is important because the default password is raspberry ← note the y. Switch your keyboard layout: sudo dpkg-reconfigure keyboard-configuration has no effect? Try sudo vi /etc/defaults/keyboard:

    XKBMODEL="apple"
    XKBLAYOUT="ch"
    XBKVARIANT=""
    XKBOPTIONS="lv3:ralt_switch"
    BACKSPACE="guess"

    Unfortunately the option key still doesn’t work for simple things like []|{}. Sucks to be me!

    For my Sony Bravia, I had to use the following in sudo vi /boot/config.txt:

    disable_overscan=1
    overscan_left=53
    overscan_right=50
    overscan_top=28
    overscan_bottom=22

    Don’t ask me why overscan is both disabled and its various parameters are set.

    Copied various videos on to a USB Stick. Create a mountpoint using sudo mkdir /mnt/BIG_STICK and mount the drive using sudo mount -o uid=pi,gid=pi /dev/sda1 /mnt/BIG_STICK.

    Play it using omxplayer /mnt/BIG_STICK/some_file.mp4 → it worked! :) ok

    In order to avoid typing this every time, use ls -laF /dev/disk/by-uuid and note the uuid of the mounted stick. Then sudo vi /etc/fstab and start typing:

    UUID=8805-CE39 /media/Cruzer8Gb vfat auto,users,rw,flush,utf8=1,uid=pi,gid=pi,dmask=002,fmask=113 0 0

    But there was no sound! Well, there’s sound on the headphones out of the Raspberry Pi but no sound on the TV. I tried both HDMI inputs. I uncommented hdmi_drive=2 in the /boot/config.txt file. To no avail. When I tried aplay /usr/share/sounds/alsa/Front_Center.wav, however, it worked. Something about the .avi file, or about omxplayer isn’t working. Checking omxplayer --help I found the solution: omxplayer -o hdmi /media/Cruzer8Gb/some_file.mp4 → it worked! :) ok

    A day later…

    I wanted to sudo apt-get install libnss-mdns and install bonjour so that I can connect to it via raspberry.local instead of 192.168.2.3: sudo apt-get install libnss-mdns—but apparently it’s already installed!

    alex@Pyrobombus ~$ ssh pi@raspberrypi.local
    The authenticity of host 'raspberrypi.local (192.168.2.3)' can't be established.
    RSA key fingerprint is 4e:e2:82:e5:e9:e5:5f:a9:b6:ac:53:f0:e2:3b:ac:c1.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added 'raspberrypi.local' (RSA) to the list of known hosts.
    pi@raspberrypi.local's password: 
    Linux raspberrypi 3.6.11+ #371 PREEMPT Thu Feb 7 16:31:35 GMT 2013 armv6l
    
    The programs included with the Debian GNU/Linux system are free software;
    the exact distribution terms for each program are described in the
    individual files in /usr/share/doc/*/copyright.
    
    Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
    permitted by applicable law.
    Last login: Mon Apr 22 10:56:12 2013 from pyrobombus.local
    pi@raspberrypi ~ $ 

    Yay!

    If you’re not using a Mac, you’ll need to install bonjour on your host system as well, I think.

    Next I wanted to play a game using my Xbox USB controller (not necessarily the wireless variant). sudo apt-get install xboxdrv. Simply running sudo xboxdrv gave me gave me a lot of output. The driver must be working. ok The driver has a man page.

    Tags: RSS

    April 22, 2013 12:02 PM

    April 19, 2013

    Alex Schroeder

    Hellebarden und Helme praktisch fertig

    Hellebarden & Helme ist mein Hausregelndokument für meine Labyrinth Lord Runde und dient als Spielerhandbuch bis zur 5. Stufe. Die aktuelle Version hat – auf Wunsch von Claudia – nun auch wieder Diebe drinnen und sie hat auch einen einseitigen, dreispaltigen Index. Keine Ahnung, ob das wirklich nötig war für ca. 20 Regeln.

    Tags: RSS RSS

    April 19, 2013 03:30 PM

    April 18, 2013

    Alex Schroeder

    Old School RPG Planet Updates

    With Tenkar’s Swords & Wizardry Appreciation Day came a plethora of blogs I had never heard of. I’ve been adding new blogs furiously to the Old School RPG Planet. (A planet is a feed aggregator—it shows an extract of all the various blogs I added, like a public blog roll. This particular planet is controlled by a wiki page, so anybody can submit new blogs.)

    If you’re looking for new blogs to add, take a look. Perhaps you’ll find a new blog you like? I know that some people from the “early days” said that they felt the Old School Renaissance was shrinking. My thinking at the time was that this is now what’s happening. What is happening is that some people drop out, stop blogging. If you don’t add the newcomers, those who start blogging, your impression will necessarily be that the OSR is shrinking. Not so! Look at the number of blogs that participated.

    If you already follow the Old School RPG Planet, please let me know if I added some blogs by mistake. I think I checked each and every new feed I added. If a feed seemed mostly about video games, or anime, or miniatures, I didn’t add it. Most of the blogs that were listed on the Swords & Wizardry Appreciation Day post seemed to be very appropriate! Still, one never knows.

    Let me know if you spot anything else that’s fishy. :)

    And I'm only half way through! Phew!

    Tags: RSS RSS

    April 18, 2013 09:33 PM

    April 17, 2013

    Alex Schroeder

    Swords & Wizardry

    Swords & Wizardry Creative Guild In 2006, Greywulf was a user of Oddmuse, a piece of software I was maintaining. It’s still used to run this blog/wiki. Greywulf kept talking about D&D and eventually I started reading EN World. There, I discovered Greywulf had a huge thread going. He proposed a minimal variant to D&D 3.5 and called it M20 (original files). I loved it and ended up starting a campaign using it. (It later converted to D&D 3.5.)

    In 2008, I came across M74 and discovered the “old school renaissance”. I learned about OD&D and its use of a d6 for hit-dice and weapon damage. I was intrigued and wrote M20 Hard Core. I also wrote a little random character creator for my rules variant.

    Some blog posts from back then:

    (You can get the source files from the Swords & Wizardry download page.)

    I was very impressed by Ruins & Ronin. If you check out the Sword+1 blog, you’ll find lots of R&R character classes for download in the sidebar. It really was an eye opener for me. Anything can be turned into a class! This is Do It Yourself D&D!

    These days, I still play Labyrinth Lord. It was my first retro-clone. It didn’t have weird elves. I ended up liking race-as-class. As you can see from the list above, however, OD&D and Swords & Wizardry have been an important part of the journey. And I absolutely loved the Peter Mullen covers!

    Today is Swords & Wizardry Appreciation Day Blogfest! Follow the link and find a list of more than 100 other blogs writing about S&W.

    Tags: RSS RSS

    April 17, 2013 08:21 AM

    April 13, 2013

    Alex Schroeder

    Garamond

    I like the Garamond font. This website uses it. Here’s how:

    @font-face {
          font-family: 'Garamond';
          font-style: normal;
          font-weight: 400;
          src: local('Garamond'), local('GaramondNo8'), local('EB Garamond'), local('EBGaramond'), url(https://themes.googleusercontent.com/static/fonts/ebgaramond/v4/kYZt1bJ8UsGAPRGnkXPeFdIh4imgI8P11RFo6YPCPC0.woff) format('woff');
    }
    
    body, rss {
        font-family: Garamond, serif;
        font-size: 16pt;
        line-height: 20pt;
        margin:1em 3em;
        padding:0;
    }

    As you can see, if you have a font called Garamond, Garamond No. 8 or EB Garamond installed, then the web page will use it. Garamond No. 8 is what I use on my GNU/Linux system. If you don’t have any of them, it will download the EB Garamond files from Google Web Fonts.

    I hope it works. Thoughts?

    Tags: RSS

    April 13, 2013 10:28 PM

    April 12, 2013

    Alex Schroeder

    The 1PDC Process

    1PDC On the mailing list for the One Page Dungeon Contest 2013, one of the judges asked me to go through the process again. I’ve used my reply to write this blog post.

    The first thing to remember is that people can revise their submission until the very end. That’s why I personally don’t read them until the end of April.

    The output of the process is a list of nominations from each of the judges. They can nominate as many or as few as they like. In the past, judges have nominated somewhere between 10 and 20 entries. Every judge determines their own criteria. There is no agreed upon checklist.

    My own list of criteria will look very similar to what I wrote on 2010-02-05 Quality Dungeons. I find that having the checklist helps me score the dungeons.

    I will compile all the nominations into a big spreadsheet and produce a list of winners. I’ll try to have at least three nominations from every judge on the list (ie. we are six judges and thus I expect there to be around 18 winners). I’ll also try to invent a category for each of the winners. It would be very cool if your list of nominations contained a suggested category. That is optional, however.

    Last year, I wrote about the entries I nominated and the made-up categories I nominated them for, if you’d like to see an example of how I personally went about this.

    Sometimes judges will then comment on the final list and propose to add a particular entry because of some very specific qualities they want to highlight and thus we might end up more winners.

    Once we have announced the winners, they are invited to send me three picks from the prize list. Again, the data goes into a spreadsheet and I try to figure out a way to give every winner at least one thing that they are wishing for. Against all intuition, this seems to have worked so far! When in doubt, I’ll go back to the big spreadsheet with all the nominations on it and give precedence to those winners that received the most nominations.

    This last element of the process is not entirely transparent. I wrote a blog post trying to defend the lack of transparency two years ago. I hope that it’s not a big problem. ;)

    Tags: RSS RSS

    April 12, 2013 10:29 PM

    April 09, 2013

    Phil Jones (Smart Disorganized)

    Java Hater

    Someone on Quora asked me to answer a question on my personal history of using Java. It became a kind of autobiographical confession. 
    I've never had a good relationship with Java.

    My first OO experience was with Smalltalk. And that spoiled me for the whole C++ / Java family of strongly typed, compiled OO languages. 
    Because I'd learned Smalltalk and this new fangled OO thing when it was still relatively new (in the sense of the late 80s!) I thought I had it sussed. But actually I had very little clue. I enthusiastically grabbed the first C++ compiler I could get my hands on and proceeded to spend 10 years writing dreadful programs in C++ and then Java. I had assumed that the OOness of both these languages made them as flexible as I remembered Smalltalk to be. I thought that OO was the reason for Smalltalk's elegance and that C++ and Java automatically had the same magic. 
    Instead I created bloated frameworks of dozens of classes (down to ones handling tiny data fragments that would have been much better as structs or arrays). I wrote hugely brittle inheritance hierarchies. And then would spend 3 months having to rewrite half my classes, just to be able to pass another argument through a chain of proxies, or because somewhere in the depths of objects nested inside objects inside objects I found I needed a new argument to a constructor. The problem was, I was programming for scientific research and in industry but I hadn't really been taught how to do this stuff in C++ or Java. I had no knowledge of the emerging Pattern movement. Terms like "dependency injection" probably hadn't even been invented. 
    I was very frustrated. And the funny thing I started to notice was that when I had to write in other languages : Perl, Javascript, Visual Basic (Classic), even C, I made progress much faster. Without trying to model everything in class hierarchies I found I just got on and got the job done. Everything flowed much faster and more smoothly.

    Perl's objects looked like the ugliest kludge, and yet I used them happily on occasion. In small simulations C structs did most of what I wanted objects to do for me (and I did finally get my head around malloc, though I never really wrote big C programs). And I had no idea what the hell was going on with Javascript arrays, but I wrote some interesting, very dynamic, cross browser games in js (this is 1999) using a bunch of ideas I'd seen in Smalltalk years before (MVC, a scheduler, observer patterns etc.) and it just came out beautifully. 
    It wasn't until the 2000s that I started to find and read a lot of discussions online about programming languages, their features, strength and weaknesses. And so I began my real education as a programmer. Before this, a lot of the concepts like static and dynamic typing were vague to me. I mean, I knew that some languages you had to declare variables with a type and in some you didn't. But it never really occurred to me that this actually made a big difference to what it was like to USE a language. I just thought that it was a quirk of dialect and that good programmers took these things in their stride. I assumed that OO was a kind of step-change up from mere procedural languages, but the important point was the ability to define classes and make multiple instances of them. Polymorphism was a very hazy term. I had no real intuitions about how it related to types or how to use it to keep a design flexible.

    Then, in 2002 I had a play with Python. And that turned my world upside-down.
    For the first time, I fell in love with a programming language. (Or maybe the first time since Smalltalk, which was more of a crush).

    Python made everything explicit. Suddenly it was clear what things like static vs. dynamic typing meant. That they were deep, crucial differences. With consequences. That the paraphernalia of OO were less important than all the other stuff. That the fussy bureaucracy of Java, the one class per file, the qualified names, the boilerplate, was not an inevitable price you had to pay to write serious code, but a horribly unnecessary burden.
    Most of all, Python revealed to me the contingency of Java. In the small startup where I'd been working, I had argued vehemently against rewriting our working TCL code-base in Java just because Java was OO and TCL wasn't. I thought this was a waste of our time and unnecessary extra work. I'd lost the argument, the rewrite had taken place, and I hated now having to do web-stuff with Java. Nevertheless, I still accepted the principle that Java was the official, "grown up" way to do this stuff. Of course you needed proper OO architecture to scale to larger services, to "the enterprise". Ultimately the flexibility and convenience of mere "scripting" languages would have to be sacrificed in favour of discipline. (I just didn't think we or our clients needed that kind of scaling yet.) 
    What Python showed me was we weren't obliged to choose. That you could have "proper" OO, elegant, easy to read code, classes, namespaces, etc. which let you manage larger frameworks in a disciplined manner and yet have it in a language that was light-weight enough that you could write a three line program if that's what you needed. Where you didn't need an explicit compile phase. Or static typing. Or verbosity. Or qualified names. Or checked exceptions. What I realised was that Java was not the inevitable way to do things, but full of design decisions that were about disciplining rather than empowering the programmer. 
    And I couldn't stomach it further. Within a few months of discovering Python I had quit my job. Every time I opened my machine and tried to look at a page of Java I felt literally nauseous. I couldn't stand the difference between the power and excitement I felt writing my personal Python projects, and the frustration and stupidity I felt trying to make progress in Java. My tolerance for all Java's irritations fell to zero. Failing to concentrate I would make hundreds of stupid errors : incompatible types, missing declarations or imports, forgetting the right arguments to send to library methods. Every time I had to recompile I would get bored and start surfing the web. My ability to move forward ground to a halt.
    I was so fucking happy the day I finally stopped being a Java programmer.

    Postscript : 
    1) Something I realized a while after my bad experience was how important the tools are. My period in Java hell was trying to write with Emacs on a small-screen laptop without any special Java tools (except basic Java syntax colouring). I realize this is far from the ideal condition to write Java and that those who are used to Eclipse or IntelliJ have a totally different experience and understanding of the language. 
    2) A few years later, I taught the OO course in the local university computer science department. All in Java. By that time, I'd read a couple of Pattern books. Read Kent Beck's eXtreme Programming. Picked up some UML. And I had a much better idea what Polymorphism really means, how to use Interfaces to keep designs flexible, and why composition is better than inheritance. I tried to get the students to do a fair amount of thinking about and practising refactoring code, doing test driven development etc. It all seemed quite civilized, but I'm still happy I'm not writing Java every day. 
    3) A couple of years ago I did do quite a lot of Processing. I was very impressed how the people behind it managed to take a lot of the pain of Java away from novice programmers. I wonder how far their approach could be taken for other domains.

    by noreply@blogger.com (phil jones) at April 09, 2013 06:53 AM

    April 08, 2013

    Alex Schroeder

    Hellebarden und Helme ist ziemlich lang geworden

    https://farm9.staticflickr.com/8406/8621195607_ddbc396a69_m.jpg

    Ich hatte schon mal von Hellebarden und Helme geschrieben. Das Dokument ist nun vollständig. Alle Zaubersprüche bis und mit der dritten Stufe sind drinnen. Ich wollte natürlich “Zirkel” sagen, um die leidige Diskussion um Charakterstufe und Spruchstufe zu vermeiden. Aber egal. Ich habe noch eine Weile mit Claudia diskutiert, ob es sich lohnt, die weibliche Form für die Regeln zu verwenden. Sie war dagegen und meinte, das würde ihr ja nicht helfen, gleich viel zu verdienen wie ein Mann. War wohl nichts mit den tief hängenden Früchten. Für mein eigenes Wohlbefinden habe ich mich entschieden, über weite Teile “du” zu verwenden. Das tönt dann ähnlich informell wie dieser Blog. Was hältst du davon? :)

    Mit über zwanzig Seiten ist das Dokument doch überraschend lang geworden. Schade, eigentlich!

    Auf Seite 19 hat es unten viel leeren Platz. Ich weiss nicht so recht, was ich da machen soll. Ich hätte gerne ein paar gute, freie Bilder von Hellebarden! Leider gibt es im Handbuch der Waffenkunde: Das Waffenwesen in seiner historischen Entwicklung vom Beginn des Mittelalters bis zum Ende des 18. Jahrhunderts von Wendelin Boeheim (1890) nicht so viele gute Hellebardenbilder wie Helme. Kennst du eine Quelle von guten Hellebardenbildern?

    Ansonsten bleiben mir noch die selber gemalten Bilder, welche am Rande etwas mit Zauberei zu tun haben… Vom Stil her passen sie leider überhaupt nicht zu den Helmen.

    https://farm4.staticflickr.com/3261/3198902637_b172003c71_m.jpg https://farm4.staticflickr.com/3469/3275717737_e9131816f5_m.jpg https://farm4.staticflickr.com/3411/3279480659_716c6db0e9_m.jpg https://farm4.staticflickr.com/3529/3923437634_7d9636786b_m.jpg https://farm3.staticflickr.com/2605/3922651157_cf2a315b7a_m.jpg https://farm5.staticflickr.com/4139/4900445467_c34b4d0ac7_m.jpg https://farm5.staticflickr.com/4099/4970804690_90559b970d_m.jpg https://farm6.staticflickr.com/5014/5641851376_e47b1f3a6f_m.jpg https://farm7.staticflickr.com/6040/6348317241_94ac33dcfc_m.jpg

    Meine Aufgabe für die nächsten Tage: Korrekturlesen und Leerräume in der Randspalte finden, wo ich noch den einen oder anderen Helm aus dem Handbuch der Waffenkunde unterbringen kann. :)

    Oder Illustrationen aus den alten Fechtbüchern?

    https://upload.wikimedia.org/wikipedia/commons/thumb/4/47/De_Fechtbuch_Talhoffer_102.jpg/320px-De_Fechtbuch_Talhoffer_102.jpg

    Tags: RSS RSS

    April 08, 2013 09:45 AM

    April 07, 2013

    Alex Schroeder

    Textures and Creative Commons

    Recently I got a submission for the One Page Dungeon Contest 2013. It was made using the Dungeon Tiles Set by ProBono on RpgMapShare. The tiles use textures from CGTextures.com.

    I stopped when I saw a passage saying “One or more textures in this pack have been created with images from CGTextures.com. These images may not be redistributed by default, please visit www.cgtextures.com for more information.”

    Then I found the following passage in their FAQ:

    May I use these textures in my Open Source (Creative Commons, GPL, etc) project?
    No. These textures may not be used in Open-Source projects. The licenses are not compatible. Almost all Open-Source licenses allow redistribution of the materials, and redistribution is not allowed for these textures.

    Unfortunately, the One Page Dungeon Contest uses a Creative Commons license.

    Tags: RSS RSS

    April 07, 2013 11:47 AM

    April 03, 2013

    Phil Jones (Smart Disorganized)

    What's Like RSS?

    Dave Winer asked a great question back in December. What standards are like (his ideal for) RSS?

    That is, basically fixed forever by convention, large userbase and multiple suppliers?

    My suggestions :
    In practice, a few Unix classics : SSH, the diff / patch formats, rsync, finger. All used on a grand scale by many parties. Multiple implementations. Multiple pieces of software committed to them. No one really trying to change them.

    Email protocols are pretty widely supported and fixed.
    Git. It's notionally owned by Linus Torvalds, but he doesn't seem to have any commercial interest in extending or breaking it. GitHub showed you can build a great commercial site around it without trying to make proprietary extensions. And I can use the same clients to push and pull from my server running the default Git daemon, from Github, or from rival offerings (I'm pretty sure BitBucket / SourceForge / Google Code now offer Git as an option)

    Possibly Jabber / XMPP


    by noreply@blogger.com (phil jones) at April 03, 2013 03:21 PM

    March 31, 2013

    Alex Schroeder

    Never Ending Story

    Stop the Hollyweb! No DRM in HTML5

    Tags: RSS RSS

    March 31, 2013 04:40 PM

    March 27, 2013

    Alex Schroeder

    One Page Dungeon Contest

    Yes, the Spring Equinox has come and gone and now it’s time the run the 1PDC again! :D vee <33">3"> 8-D star star star

    One Page Dungeon Contest 2013!

    Dates: Submission deadline is April 30, 0:00 GMT (Tuesday evening). If you live West of Greenwich, you will have to send in your submission a few hours before the end of the month! Winners will be announced June 1.

    Help spread the word!

    Prizes & Sponsors: Do you have prizes to donate? Let me know → kensanata@gmail.com!

    Submissions: Here’s how to submit your entry.

    • Create a One Page Dungeon.
    • Submitting a dungeon to the contest releases it under the Creative Common Attribution-Share Alike 3.0 Unported license with credit to the contest participant.
    • The submission must have a name, an author, and a link to the license (http://creativecommons.org/licenses/by-sa/3.0/).
    • The judges and readers play a variety of systems. Don’t waste valuable space with a lot of system-specific stats.
    • A link to extra material on your blog such as wandering monsters, random events, adventure background, introduction, descriptions of tricks or traps are welcome for readers but will not be considered part of your submission.
    • One entry per participant. Participants may revise/replace their entries up until the end of contest, with the last revision counting as their official entry.
    • If your font size is too small to read, you will most probably not win.
    • Many people will print your submission as a black and white document. Adding colors is no problem as long as the black and white printed copy is still good enough.
    • Help us keep file size in check. A single page should not take more than an image with 3000x2000 pixels (1-2MB is cool, 5MB still works, 10MB is too much).
    • Submission must be mailed in PDF format to Alex Schroeder → kensanata@gmail.com. Usually we can help you convert your Open Office and Microsoft Word documents to PDF.
    • If you have a blog article talking about your submission, send us the link. We’d love to link to it from the One Page Dungeon Contest page.

    Process: Here’s how we’ll determine the winners.

    • Every judge nominates their favorite entries and proposes a category for each.
    • We try to make sure that every judge has at least three of their nominations in the final list. The idea is to not only reflect popular opinion but to also capture some of the more eclectic entries out there. We’ll make sure that every judge is well represented with three entries each.
    • Based on the categories proposed in the first step, we try to assign a category to each entry on the list.
    • Judges gets to check whether their favorites are still on the list.
    • We fix omissions and rename categories until we’re happy.
    • We publish our list of winners!
    • We will ask each winner for three items they’d prefer to win and any items they prefer not to win. Then we try to do a best match, giving precedence to those winners that got more nominations in the first step.
    • All the entries and a special PDF with all the winners will be available for download at no cost.

    Tags: RSS RSS

    March 27, 2013 08:55 PM

    Phil Jones (Smart Disorganized)

    Winer's Back!

    This is really good news.

    Dave Winer finally comes out with a decent outliner in the browser.

    I've been looking for one for a long time. (Thought of trying to write it too, but it's not my speciality. Now you get one from the world's biggest Outlining evangelist.)

    This is also great news for Winer himself, I think. As always, he has a lot of crucial ideas for where the web should be going. But for a while it's seemed like the main thing holding him back has been a code-base that's a Windows desktop application. (Which is NOT where either users or developers want to party these days.) The few times I've thought I'd like to look into the open-sourced Frontier / OPML Editor I've been put off by that.

    A new browser-based UI (and Javascript-based server?) hopefully means that he'll be able to get more people involved in his code, interacting with his services, and start to have an impact via technology as well as evangelism.

    And me, I'm holding on for the OPML export / import ... ahem ... cough ...  GeekWeaver ... cough. ;-)

    by noreply@blogger.com (phil jones) at March 27, 2013 03:55 PM

    March 26, 2013

    Alex Schroeder

    Quick Sketch

    Doodling during a meeting…

    https://farm9.staticflickr.com/8092/8591737443_884be7c1c2.jpg https://farm9.staticflickr.com/8238/8591772567_727a14e3f9.jpg

    Tags: RSS RSS

    March 26, 2013 03:12 PM

    March 24, 2013

    Alex Schroeder

    Hellebarden und Helme

    https://farm8.staticflickr.com/7061/6968081959_2ff9dd13d1_n.jpg

    Bin immer noch am Schrauben an meinen Hausregeln. Ich wollte ein einfaches Dokument für neue Spieler, die bei meiner Kampagne anfangen wollen. Deswegen wollte ich eine kurze Labyrinth Lord Variante für die ersten fünf Stufen. Angefangen hatte alles auf dem Campaign:Hellebarden und Helme Wiki. Als ich aber den ersten Spieler gesehen habe, der sich alles ausgedruckt hatte, war mir das nicht recht. Das sah ja furchtbar aus! Weil ich zudem vor wenigen Monaten meine FATE Variante Der Geist Mesopotamiens mit LaTeX gesetzt hatte, wollte ich das gleiche für Hellebarden und Helme.

    Da ich schon einen Charaktergenerator für Hellebarden und Helme habe, entschied ich, das Regelwerk mit LaTeX zu setzen und das gleiche github Projekt zu verwenden.

    Aktuelle Version (PDF)…

    Tags: RSS RSS

    March 24, 2013 09:22 PM

    March 20, 2013

    Phil Jones (Smart Disorganized)

    Bret Victor Showreel

    Bret Victor is one of the few programmers for whom it makes sense to release a showreel.


    by noreply@blogger.com (phil jones) at March 20, 2013 07:07 PM

    Elm Lang

    I must confess, I'm very intrigued by Elm-Lang.

    For me there are four virtues :

    1) FRP. All the attempts I've seen to graft FRP onto existing languages have looked clunky to me - ahem ... Trellis? - Requiring the explicit definition of special types of fields. This is the kind of thing that I think needs a new language feature, not a new library.

    Elm-lang's "lift" looks a much cleaner way of going about it.

    2) It's in the browser. That's where code has to run.

    3) I like the way that it reunifies the document / graphics structure back into the same file. The problem is not so much that style and content shouldn't be separated. It's that there are more serious divisions of modularity to respect and forcing HTML and JS into different trees of the filing system has typically pushed highly interdependent data-structure and logic too far apart. I like the ability to bring them back together for small programs.

    4) Perhaps it's a way to get familiar with and more into Haskell. Obviously it's not full Haskell. But it seems like a way to get more into that mind-set while doing some practical work.

    Of course, the proof of the pudding is in the eating. I'd better go and try something ...  :-)

    by noreply@blogger.com (phil jones) at March 20, 2013 06:55 PM

    March 14, 2013

    Alex Schroeder

    Google Reader Alternative

    Google Reader is being axed. I used it every day.

    Evan Prodromou says on Google+
    Why, it’s almost as if it would be in your best interest to run network services under your own control instead of using quote-unquote free ones run by someone whose priorities are not aligned with yours.

    I might consider it. Years ago, I used rss2email by Aaron Swartz. The irony is that I’ll be reading my blog posts—in Gmail! X(

    There are other alternatives. Here’s a crowdsourced list. I see that The Old Reader, for example. “It’s just like the old Google reader, only better.” Here’s a warning sign, however: “We’re in beta right now […]” Will it cost money eventually? How much? I’m not opposed to paying a little money. After all, I want the service to have a future.

    Me on Twitter
    I read a rant once saying: “Please, services on the Internet, take my money! I want you to have a decent business plan!”

    So, run a network service under my own control, or pay somebody else…

    As for running something under my own control, I must confess that I’m still averse to running PHP and MySQL on a server of mine. Somehow I keep thinking of the combination as insecure. I downloaded Tiny Tiny RSS and looked at it (also on GitHub).

    There is also something about RSS that makes me cringe: If every blog reader installs a feed aggregator that checks its feeds every ten minutes, this won’t scale. A few central aggregators that poll feeds and serve their user interface when requested by users seems like a better solution from a technical point of view.

    On my portable devices I’m using the Reeder app. Like many others, it depends on Google Reader. We’ll see what its creator will switch to.

    Tags: RSS

    March 14, 2013 10:06 AM

    March 11, 2013

    Alex Schroeder

    Regelwälzer

    Auf Google+ hat Stefan Ohrmann vor kurzem eine Diskussion über den zunehmenden Umfang der Regelbücher angerissen. Passt irgendwie auch zum Thema Aufbau von Regelwerken.

    Ich selber meinte hierzu, dass ich schon verschiedentlich bei Freunden Bücher und PDF Dateien angeboten bekommen habe, die so dick waren, dass ich schon von Anfang an weiss, dass ich diese Werke nie lesen werde.

    Geht So Geht Nicht
    Diaspora (270 Seiten)Starblazer (632 Seiten)
    Labyrinth Lord (136 Seiten)Dungeon Crawl Classic (470 Seiten)

    Ich vermute folgende Ursachen für den steigenden Umfang der Bücher:

    • Selbstpublikation haben oft ein Lektorat, welches nicht auf Kürze besteht.
    • In den meisten Rezensionen wird beanstandet, wenn ein kurzes Produkt trotzdem viel kostet. Die Kürze wird nicht als Produkt einer Leistung geschätzt. Leider muss ich zugeben, dass ich auf einer emotionalen Ebene davon sicherlich auch betroffen bin. Es “fühlt” sich einfach nicht an, wie wenn es den Preis wert wäre.
    • Auftragsautoren werden nach Worten bezahlt. So besteht kein Interesse daran, sich kürzer zu fassen. Ich vermute, dieser Effekt ist nicht besonders stark, denn oft wird so ein Auftrag die gewünschte Anzahl Worte nennen. Aber wer weiss, vielleicht entsteht entlang einer Wertschöpfungskette, welche mit der Länge der Texte Geld verdient, bei jedem kleinen Schritt ein kleiner Druck hin zu längeren Texten.

    Was mich übrigens überhaupt nicht stört:

    • Mehr Bildmaterial.
    • Mehr typografischer Weissraum.
    • Grössere Schrift.

    Es geht mir wirklich mehr um den Leseaufwand, den ich nicht mehr zu leisten gewillt bin. Wenn ich viel lesen will, lese ich lieber ein Buch. Regelbuch, Hintergrundmaterial, Abenteuer – das mag für viele so gut wie Unterhaltungsliteratur sein. Nicht für mich.

    Ausgezeichnete Diskussion auf dem Forum.

    Tags: RSS

    March 11, 2013 08:39 AM

    March 08, 2013

    Alex Schroeder

    Talaric

    http://farm9.staticflickr.com/8380/8539306660_60da922bba_n.jpg

    From time to time I want to write about player characters that I remember well. Recently DM Harald ran a few sessions using Moldvay’s Basic D&D and the Karameikos setting that came with it. We all rolled up characters and Jörg rolled up an elf with Charisma 3. He likes to play elves and that in itself is a recurring joke in our group. This time, however, it was payback time! This was an asshole. Arrogant. Disinterested. Unwilling to fight. Unwilling to come along. Jörg managed to stay on the thin red line separating character aggravation from player aggravation.

    When we decided to go vampire hunting in Krakatos, the elf joined us against his own recommendation. We were, after all, just first level characters. After the first session, the elf had been charmed by the vampire and had joined his master as living blood snack.

    The next session we managed to free him. Two or three sessions later, however, we were exploring Koriszegi Keep and had good reason to believe another vampire was present. Again, the arrogant elf tried to dissuade us. Again, we ignored him. As we were fighting ghouls climbing out of a hole in the ground, the battle turned against us. My cleric had been paralysed in the first round because he had once again used his cursed holy symbol instead of his real holy symbol. The arrogant elf received a mortal wound. (We’re using the Death and Dismemberment table.) He decides to grapple the ghould standing over my cleric’s body and fling himself and the ghoul down into the hole! Thank you, asshole.

    We win the fight, descend into the hole, can’t find the elf’s body, continue into the next room, and see the body lying there, vampire mist covering the floor of the foul cave. Another character, a small lady thief, gets to work and saws off the elf’s head in order to prevent him from rising as a vampire minion at midnight. My cleric, no longer paralysed, is contacted by the vampire. L E A V E . H I M . T O . M E ! the disembodied voice says. I say to the small woman, “leave him be!” But she insists on cutting off the head. And she does. But now the vampire materializes, drains her into oblivion. We scream. The vampire crushes my gnome henchman’s skull. We cry. The vampire turns around. We run.

    And all of that because of an elf that we didn’t like.

    Tags: RSS RSS

    March 08, 2013 09:22 AM

    March 04, 2013

    Alex Schroeder

    Text Mapper With Lines

    SVG Mapper now knows how to draw lines. These lines try to flow from hex to hex…

    Example input:

    2114 hill
    2115 hill
    2213 forest
    2214 forest "Delan"
    2215 hill
    2314 forest
    2315 forest
    2414 hill "Forest Bight Fortress"
    2415 forest
    2515 forest "Boghra Little"
    
    2214-2615 river
    river path attributes fill-opacity="0" stroke="black" stroke-width="5"
    
    include http://alexschroeder.ch/contrib/default.txt

    Result:

    Dangerous Forest

    I think that I’m not quite understanding how the viewBox is supposed to work. But anyway: these lines can be used for roads, rivers, borders, cliffs, and the like. If they’re very straight, they don’t look too good. There’s no random waviness. One feature I definitely have to add is providing more intermediary points such that the user can guide rivers around the hills or to allow rivers to merge.

    Tags: RSS RSS RSS

    March 04, 2013 12:06 AM

    March 02, 2013

    Phil Jones (Smart Disorganized)

    SocialCalc and Javascript

    Dan Bricklin gives an update on WikiCalc / SocialCalc (the browser-based spreadsheet he wrote). It seems to be having a new lease of life as a web-app embedded in native Android / iOS apps.

    Nice!

    Also some interesting news about javascript.

    by noreply@blogger.com (phil jones) at March 02, 2013 06:55 AM

    March 01, 2013

    Alex Schroeder

    Text Mapper Progress

    I’m a big fan of the Forgotten Depths. I wanted to use its map as the goal for my Text Mapper. As the mapper now allows the inclusion of other files, I’ve saved my library of colors and icons as default.txt and I’ve saved the map as forgotten-depths.txt. That’s why all you need to do now is include the map:

    Forgotten Depths SVG

    If you see white hexes, then I haven’t added any definitions for them, yet.

    Tags: RSS RSS RSS RSS

    March 01, 2013 10:28 AM

    February 28, 2013

    Phil Jones (Smart Disorganized)

    Mind Traffic Control

    If you haven't looked at Mind Traffic Control recently (and I know YOU haven't, because I see the logs), then you may be surprised.

    Just saying ... :-)

    by noreply@blogger.com (phil jones) at February 28, 2013 12:37 AM

    February 27, 2013

    Alex Schroeder

    SVG Filters

    I need help with SVG filters. This question is also on StackOverflow.

    This is what I want to achieve:

    https://farm9.staticflickr.com/8507/8511938807_5a793d726a.jpg

    Previously, I’d duplicate the text element, make the background white, and blur it:

      <defs>
        <filter id="label-glow">
          <feGaussianBlur stdDeviation="1" />
        </filter>
      </defs>
      <text stroke="white" stroke-width="5" filter="url(#label-glow)">Harald's Repose</text>
      <text>Harald's Repose</text>

    I’m trying not to duplicate the text element. Here’s how to do it using filters:

      <defs>
        <filter id="label-glow">
          <feFlood flood-color="white"/>
          <feComposite in2="SourceGraphic" operator="in"/>
          <feGaussianBlur stdDeviation="2"/>
          <feComposite operator="over"/>
          <feComposite operator="over"/>
          <feComposite operator="over"/>
          <feComposite operator="over"/>
          <feComposite in="SourceGraphic"/>
        </filter>
      </defs>
      <text filter="url(#label-glow)">Harald's Repose</text>

    Unfortunately the output of the Gaussian blur is very weak which is why I need to overlay it multiple times. What am I missing?

    Update: As I’ve been experimenting with it, I’ve decided to drop filters altogether. When using Firefox and printing the map to PDF, the filters all result in bitmap elements that don’t scale well.

    Tags: RSS RSS

    February 27, 2013 10:29 PM

    New Text Mapper Shapes

    How to create new shapes for Text Mapper?

    First, start with an empty SVG file:

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <svg xmlns="http://www.w3.org/2000/svg"
         height="200px"
         width="200px">
    </svg>

    I like to draw stuff using the calligraphy tool (c). I usually simplify the nodes a lot (Ctrl+L), unify the shapes (Ctrl++), edit the nodes by hand (n) until you’re happy with the fewest number of nodes you can manage.

    Now move the entire shape such that it is centered on the top left corner. This is (0,0) as far as SVG is concerned. Save it.

    https://farm9.staticflickr.com/8240/8512911746_4f1c405dba_o.png

    Look at the SVG file and notice something like this:

        <path
           style="fill:#000000;fill-opacity:1;stroke:none"
           d="m 7.647323,-20.341905 c -5.784973,-11.791839
           -36.204242,-5.139394 -43.951039,7.112364 8.922877,-5.977096
           34.793258,-11.641806 37.046343,-5.498373 -17.505656,0.485788
           -29.019956,5.940662 -33.027811,23.8472764 C
           -21.859546,-12.603312 -7.5022983,-14.191144 2.47485,-12.984161
           -8.2112223,6.06712 -19.987316,13.477858 -15.788864,50.225619 c
           3.988368,3.362713 8.6116517,-5.097214 4.510279,-7.531518
           -0.559084,-6.64895 -0.875559,-13.360661 -0.08632,-20.004922 C
           -9.6892813,9.718021 1.072969,-6.510207 8.835372,-12.256094
           26.823805,-7.758432 35.550312,0.1756144 34.450001,15.351883
           44.387089,3.7916614 29.882349,-11.701263 14.406587,-15.219388
           28.287217,-15.939127 40.549839,-6.589098 45.412784,1.4541824
           47.026796,-8.361333 28.866764,-19.205208 16.79733,-20.277164 c
           10.765708,-6.95198 25.316253,-3.074379 29.792108,3.226712
           -4.893545,-14.115874 -36.158133,-10.60357 -38.942114,-3.291453
           z"
           id="path3007"
           inkscape:connector-curvature="0"
           sodipodi:nodetypes="ccccccccccccccc" />

    You can already extract this path and use it! Usually it takes several attempts to get the placement right. Once I’m happy, I turn all these floating point numbers into integers in order to save space. Personally, I use Emacs to do it (EmacsWiki:RoundFloatingPoints).

    This is what I want:

    m 8,-20 c -6,-12 -36,-5 -44,7 9,-6 35,-12 37,-5 -18,0 -29,6 -33,24 C -22,-13
    -8,-14 2,-13 -8,6 -20,13 -16,50 c 4,3 9,-5 5,-8 -1,-7 -1,-13 0,-20 C -10,10 1,-7
    9,-12 27,-8 36,0 34,15 44,4 30,-12 14,-15 28,-16 41,-7 45,1 47,-8 29,-19 17,-20
    c 11,-7 25,-3 30,3 -5,-14 -36,-11 -39,-3 z

    Example input:

    0202 jungle
    jungle attributes fill="white" stroke="#b3b3ff" stroke-width="3"
    jungle path m 8,-20 c -6,-12 -36,-5 -44,7 9,-6 35,-12 37,-5 -18,0 -29,6 -33,24 C -22,-13 -8,-14 2,-13 -8,6 -20,13 -16,50 c 4,3 9,-5 5,-8 -1,-7 -1,-13 0,-20 C -10,10 1,-7 9,-12 27,-8 36,0 34,15 44,4 30,-12 14,-15 28,-16 41,-7 45,1 47,-8 29,-19 17,-20 c 11,-7 25,-3 30,3 -5,-14 -36,-11 -39,-3 z

    Output:

    Jungle Hex

    Example input:

    0101 jungle
    jungle attributes fill="#9acd32" stroke="black" stroke-width="3"
    jungle path attributes fill="#228b22"
    jungle path m 8,-20 c -6,-12 -36,-5 -44,7 9,-6 35,-12 37,-5 -18,0 -29,6 -33,24 C -22,-13 -8,-14 2,-13 -8,6 -20,13 -16,50 c 4,3 9,-5 5,-8 -1,-7 -1,-13 0,-20 C -10,10 1,-7 9,-12 27,-8 36,0 34,15 44,4 30,-12 14,-15 28,-16 41,-7 45,1 47,-8 29,-19 17,-20 c 11,-7 25,-3 30,3 -5,-14 -36,-11 -39,-3 z
    text font-size="20pt" dy="15px"

    Output:

    Green Jungle Hex

    Tags: RSS RSS RSS RSS

    February 27, 2013 10:33 AM

    February 26, 2013

    Alex Schroeder

    Text Mapper

    Recently I wanted to create a little hex map and I wanted to do it on an iPad, I wanted to eventually integrate it into my campaign wiki, I wanted it to be SVG based, and so on. All that meant, Hexographer wasn’t the appropriate tool. I needed to cook something up myself. Based on code I wrote nearly five years ago—the Old School Hex Mapper—I wrote up a little something.

    I’m calling it the Text Mapper because it takes text input. No interactive fiddling with the map.

    There are various sections of the input.

    Map

    This is simple. Coordinates, terrain.

    # map definition
    0101 mountain
    0102 mountain
    0103 hill
    0104 forest
    0201 mountain
    0202 hill
    0203 coast
    0204 empty
    0301 mountain
    0302 mountain
    0303 plain
    0304 sea
    0401 hill
    0402 sand
    0403 forest

    The rest of the input determines how things look: what colors to use, what icons to display. When you start the Text Mapper, the input area already contains an example. Start with that before doing anything else.

    Terrain attributes

    Now it gets tricky. For every terrain we used, the script will generate a hex. We need to provide some SVG attributes! Need documentation? Check out the polygon in the SVG specification and click on show next to presentation attributes. That’s what you should be looking at.

    # attributes
    empty attributes fill="#ffffff" stroke="black" stroke-width="3"
    plain attributes fill="#7cfc00" stroke="black" stroke-width="3"
    forest attributes fill="#228b22" stroke="black" stroke-width="3"
    hill attributes fill="#daa520" stroke="black" stroke-width="3"
    mountain attributes fill="#708090" stroke="black" stroke-width="3"
    sand attributes fill="#eedd82" stroke="black" stroke-width="3"
    coast attributes fill="#7fffd4" stroke="black" stroke-width="3"
    sea attributes fill="#4169e1" stroke="black" stroke-width="3"

    Icons

    In order to add little icons, you can specify a path per terrain.

    hill path M -42,11 C -38,5 -34,0 -28,-3 C -20,-6 -11,-5 -5,-0 C -2,2 1,6 3,9 C 4,12 2,13 0,14 C -3,9 -7,5 -13,2 C -21,-1 -30,0 -36,6 C -38,9 -40,11 -43,14 C -43,15 -44,14 -44,13 C -43,12 -43,12 -42,11 z M -5,-0 C 0,-6 7,-12 15,-16 C 21,-18 28,-17 33,-14 C 39,-11 41,-5 43,-0 C 42,2 41,5 39,2 C 37,-2 33,-8 27,-10 C 20,-13 12,-12 6,-7 C 2,-4 -1,-1 -4,1 C -7,4 -6,0 -5,-0 z

    plain path M -18,-13 C -13,-6 -13,4 -8,12 C -11,14 -15,21 -18,26 C -20,17 -22,4 -28,0 C -26,-4 -21,-9 -18,-13 z M 5,-31 C 4,-19 3,-6 6,5 C 1,10 -0,14 -3,19 C -2,6 -3,-4 -4,-16 C -4,-21 2,-26 5,-31 z M 26,-1 C 16,6 19,5 9,18 C 12,3 21,-8 34,-17 C 32,-12 29,-6 27,-1 z

    If you don’t want this path to be black, you need to specify attributes for the path element.

    plain path attributes fill="#76ee00"
    hill path attributes fill="#b8860b"

    And finally, the coordinates are simple text elements.

    text font-size="20pt" dy="15px"

    If you wanted a black and white map, for example, you could use different strokes…

    empty attributes fill="white" stroke="#b3b3ff" stroke-width="3"
    mountain attributes fill="white" stroke="#b3b3ff" stroke-width="3"
    hill attributes fill="white" stroke="#b3b3ff" stroke-width="3"
    forest attributes fill="white" stroke="#b3b3ff" stroke-width="3"

    If you want to create new path elements yourself in Inkscape, you should draw them in a rectangle from (-100,-100) to (100,100) and extract the the path info from the SVG. Yeah, adding new icons isn’t easy.

    I need to add more icons. I’d also like to add multiple icons for the same terrain such that the code will pick one at random.

    I wonder how easy it’s be to add text labels, roads, rivers and borders. :)

    The result of the above:

    Example map

    (Also on GitHub.)

    Tags: RSS RSS RSS RSS RSS

    February 26, 2013 07:54 AM

    February 21, 2013

    Alex Schroeder

    Character Generator and Price Differences

    http://farm9.staticflickr.com/8048/8128736368_e0d82793bd_m.jpg

    Last year, I worked on an old school random character generator. With my new found interest in B/X D&D and the Moldvay equipment list in particular, I found it necessary to differentiate between Basic D&D prices and Labyrinth Lord prices. The most important price difference is the price of plate armor. No first level character can afford it when using Labyrinth Lord rules: starting gold is 240 at most and plate armor costs 450.

    Here’s how to generate those characters (note that Moldvay is the default):

    1. a random character
    2. 50 compact characters
    3. statistics on the characters generated

    And here’s the same thing using Labyrinth Lord prices:

    1. a random character
    2. 50 compact characters
    3. statistics on the characters generated

    Don’t forget, the source code for the random character generator is available as well (Perl 5).

    Tags: RSS RSS RSS

    February 21, 2013 12:41 AM

    February 20, 2013

    Alex Schroeder

    Moldvay Preisliste

    Für meine Labyrinth Lord Kampagne will ich eigentlich vermehrt auf die Preisliste des Basic D&D Sets von Moldvay (1981) zugreifen. Diese Liste ist deutlich kürzer als die Standardliste von Labyrinth Lord und beschränkt sich meiner Meinung nach auf die Dinge, welche für normale Abenteuer relevant sind. Wichtigster Unterschied ist sicher, dass die Plattenrüstung deutlich billiger als bei Labyrinth Lord ist. Ich habe für die Waffen auch versucht, einen kleinen Kommentar zu verfassen, der beschreibt, warum man diese oder jene Waffe verwenden sollte, obwohl sie alle 1W6 Schaden machen. Wer hier stutzt: Der variable Waffenschaden ist im B/X D&D und in Labyrinth Lord eine optionale Regel. Was ich hinzugefügt habe: gratis Holzpflöcke und Knoblauch (dieser ist in den Labyrinth Lord Regeln deutlich teurer), Bemerkungen.

    Alle Waffen machen 1W6 Schaden.

    Alternative Regel für den Verbrauch von Munition: Wird beim Angriff eine 1 gewürfelt, ist die Munition verbraucht.

    Waffe Gold Bemerkung
    Kriegsaxt7zweihändig, Türen einschlagen
    Handaxt 4kann geworfen werden
    Armbrust 30kann mit wenig Training verwendet werden (Stufe 0), kann liegend verwendet werden
    ↳ 30 Bolzen 10
    Langbogen 40grosse Reichweite, kann in dichter Formation verwendet werden
    Kurzbogen 25kann vom Pferd verwendet werden
    ↳ 20 Pfeile 5
    Dolch 3kann geworfen werden, kann versteckt werden
    Silberdolch 30kann gegen Lykantrophen in Tierform verwendet werden
    Kurzschwert 7kann in dichter Formation verwendet werden
    Langschwert 10kann vom Boden gegen Berittene und umgekehrt verwendet werden
    Zweihänder 15kann gegen mehrere Gegner gleichzeitig verwendet werden, benötigt viel Platz
    Keule 3stumpf
    Kriegshammer 5stumpf
    Streitkolben 5stumpf
    Stangenwaffe 7zweihändig, kann aus der zweiten Reihe und in dichter Formation verwendet werden
    Schleuder 2benötigt viel Platz
    ↳ 30 Steine stumpf
    Speer 3kann geworfen werden

    Bessere Rüstung macht langsam.

    Rüstung Klasse Gold Bemerkung
    Leder 720
    Kette 540kein Schleichen, einfaches Ertrinken
    Platte 360kein Schleichen, einfaches Ertrinken
    Schild -110kann zerstört werden um einem Angriff zu entgehen
    Helm 10hilft auf der Tabelle für Verletzung und Tod

    http://farm7.staticflickr.com/6044/7037062693_c58853ecba_m.jpg

    Gegenstand Gold Bemerkung
    Diebeswerkzeug 25wird von Dieben für das Öffnen von Schlössern benötigt
    6 Fackeln 1brennt eine Stunde; kann Tiere ängstigen
    Hammer (klein)2für Holzpflöcke und Keile
    Heiliges Symbol 25wird von Klerikern für das Vertreiben von Untoten benötigt
    Heiliges Wasser 25schadet Untoten wie brennendes Öl
    Holzpflock um Vampire zu pfählen
    Holzstab 1billiger als eine Stangenwaffe um Dinge zu stupsen
    12 Keile 1hält Türen offen oder geschlossen
    Knoblauch 1eine Halskette, um Vampire fern zu halten
    Laterne 10braucht eine Ölflasche für vier Stunden
    Ölflasche 2brennt für zwei Runden für je 1W8 Schaden, wenn es mit einer Fackel in Brand gesetzt wird; eine brennende Öllache ängstigt Tiere
    Rucksack 5um weitere Gegenstände zu tragen
    Sack (gross)2um Schätze zu schleppen
    Seil (50’)1schweres Seil, welches nicht weiter als ein paar Schritte geworfen werden kann
    Spiegel 5für den Nachweis von Vampiren und um Medusen zu bekämpfen
    Wegration (1 Woche)15kann Monster ablenken
    Wolfsbann 10hält Werwölfe fern

    Kommentare gerne hier oder im Forum.

    Tags: RSS RSS

    February 20, 2013 10:23 AM

    February 19, 2013

    Alex Schroeder

    DungeonFu und Kampagnen Online

    Für Harald’s Karameikos Kampagne wollte ich mal schnell eine Karte zeichnen. Für die oberirdische Karte habe ich Inkscape verwendet. Das ist etwas komplizierter als nötig aber immer noch besser als Pixel malen. Die resultierende SVG Karte konnte ich dann hochladen und das sah etwa so aus:

    Als Schrift habe ich Blackadder ITC verwendet. An vielen Orten online hiess es, diese Schrift sei “free” – aber Microsoft verlinkt auf fonts.com, wo die Schrift $29 kostet. Hm.

    Online und mit deutlich weniger Funktionsumfang bietet sich die Verwendung von Google Docs mit der DungeonFu Vorlage an. Auf der Webseite von Jez Gordon findet man noch Verweise auf DungeonFu aber die neue Version will nicht so richtig funktionieren. Meine Empfehlung: Verwendet einfach die DungeonFu 1.0 Vorlage.

    Man macht sich eine Kopie der Vorlage, kopiert und rotiert herum bis man zufrieden ist, und wählt dann File → Publish to the web... und klickt sich durch. Am Schluss erhält man eine URL, welche man als Bild anderweitig verwenden kann. Das sieht dann so aus:

    Die Höhle ist ganz einfach gemacht: Man malt sich ein rechteckiges Zimmer und wählt dann in der Liste unter dem Linienwerkzeug Polyline aus, malt einen “Rand” rund um das ganze und färbt es schwarz ein.

    Mit Strg+G kann man Objekte gruppieren. Das lohnt sich, wenn mal ein Raum steht, weil dieser sich dann leichter verschieben und duplizieren lässt.

    Wenn man übrigens mit zwei Browserfenstern arbeitet, im einen hat man die Vorlage offen und im anderen die eigene Karte, dann kann man Objekte nicht einfach kopieren und einfügen. Man muss jedesmal Edit → Web clipboard → Copy shape to web clipboard wählen und im anderen Fenster dann entsprechend Edit → Web clipboard → Shape und die richtigen Objekte auswählen. Irgendwie mächtiger, aber irgendwie auch mühsamer.

    Kommentare hier oder auf dem Forum.

    Tags: RSS

    February 19, 2013 11:01 AM

    February 18, 2013

    Alex Schroeder

    Red Heart Fortress

    The Red Heart Fortress was an example on adventure prep that got published in Fight On #8. At the time, Calithena had mentioned on the forum that he might be interested in half-finished notes etc. I submitted the following:

    https://farm9.staticflickr.com/8097/8485400098_107b9467a4_c.jpg
    Red Heart Fortress (redrawn)

    The essay that went along with it wasn’t published but it’s available on this blog together with the colored original I used for my own game.

    Tags: RSS RSS RSS

    February 18, 2013 09:16 AM

    Notes To Remember

    Recently Harald Wagner wondered on Google+ “Is anyone but me writing short vignettes (three to five paragraphs) of background stories for important locations / items in their games even though they’re never meant for publication and most probably no one will ever be able to figure out all the details in game?”

    In the old days, I used to write longer notes to myself:

    https://farm4.staticflickr.com/3240/2931885614_7b2fd06a47_z.jpg
    Notes on an enemy camp where the red dragon ruled

    These days, if there is any background at all, I try to make it part of the adventure. I find that whenever there are written things to be found, my players want to read what they say. Often modules will have nice hand-outs for plot-relevant stuff, but no list of titles and short blurbs for libraries, correspondence, stone tablets, and so on. I always have to improvise. Whenever I forget to prepare such a list of things to read, I feel a facepalm coming up as we reach that point during the session. The players ask: “What do the books say?”

    In this case, I did not forget to prepare ahead of time. There were stone tablets to find and information about the dungeon, the setting and its history to be found.

    https://farm3.staticflickr.com/2273/3532593543_04a879e091_z.jpg
    Stone Table Notes

    Here are the beginning of my Caverns of Slime. Some coherent notes to help me get an overview of what the adventure is all about.

    https://farm4.staticflickr.com/3354/3571723898_486e5505e0_z.jpg
    Ooze Lord Ideas

    Again, a dwarven stronghold, with a few coherent sentences. “The dwarves are a suspicious, isolationist lot. […]”

    https://farm3.staticflickr.com/2184/4195476858_d76961a1f5_z.jpg
    Red Heart Fortress

    I wrote more about this particular example back in 2010. When I rewrote this for inclusion in Fight On! #8 I also cleaned up the notes a bit. You can better see what I’m aiming for, but since it’s “cleaned up” it doesn’t reflect actual notes from my gaming table.

    I think these examples also illustrate that I want my notes on my maps!

    Tags: RSS RSS RSS

    February 18, 2013 08:59 AM