Tuesday, April 30, 2013

Character Levels and Campaign Styles

So thinking about both my own take on a D&D-clone and the campaign that would go with it got me thinking about player character levels and what the overall aims of a campaign at a given level-range could be. I grew up on BECMI, so the first breakdown I think of is what that version of D&D did:

  • Levels 1-3: Local dungeon crawls, plots of "disappearing cattle" style
  • Levels 4-14: Kingdom-level wilderness crawls, dungeon-esque side-treks, plots of "evil cult" style
  • Levels 15+: Domain creation, continent-spanning conflicts, plots of "evil arch-lich commanding an army" style

I am intentionally leaving everything else out since I don't see why I would play at level 26+ at all. But anyway, looking at just that list, I realize that I cannot recall a campaign I ran or played in that actually had player characters achieve anything beyond 7th level. Not ever. The only truly "high-level" campaign I can recall had us create high-level characters to run through the old "Bloodstone" modules with Orcus waiting at the bottom.

Also other D&D-variants seem to imply "domain creation" slightly earlier. In fact even BECMI actually says that characters get their strongholds at name level, but the way the rules are split across boxed sets that didn't mean the same thing as what I imply with "domain creation" above.

In my recollection AD&D 1e didn't really talk much about domain-level play at all, but I might be wrong about that. It certainly never came up even as a remote possibility when we were playing AD&D. The level progression in AD&D 1e seemed to top out at around 20 I think, and from what I've seen of OD&D it originally stopped at 10 or 16 for the magic-user while the Greyhawk supplement pushed things a little further close to AD&D 1e range.

So what is a viable range of levels, something that can actually be achieved realistically in a campaign that runs for a few, say three, years? As far as I can tell a group of four players will need to grab about  one million XP to get them all to about 9th level, give or take a few hundred thousand. If you play once a week (a fairly ambitious schedule!) you have about 120 sessions when you compensate for holidays, so you need to hand out about 8500 xp per session. Doesn't seem too bad actually, except that you'd spread it out appropriately of course.

But now you've played in the same setting with the same (set of) referees for three years. Do you really want to keep going for another three or would you rather try a different setting, a different character, a different group of players? I think it's a fair bet that most people will opt for retiring the high-level character or for playing that character only every now and then.

From all of this it seems to me that levels 1-10 or thereabouts are really the only thing that matters, at least for most groups. The rules and the setting should probably allow for slightly more advanced characters, but realistically those options will only be tested on occasion, certainly not nearly as much as the lower levels. With that in mind, I think the level-breakdown I'll shoot for will be more like this:

  • Levels 1-3: Local dungeon crawls with intermittent wilderness components, local plots interacting with few mid-level NPCs
  • Levels 4-6: Increased wilderness-focus with intermittent dungeon components, regional plots interacting with several mid-level and a few high-level NPCs
  • Levels 7-9: Wilderness exploration/clearing as the primary focus, plots spanning several nations/territories and interacting with several high-level NPCs
  • Levels 10-12: Domain creation (if desired anyway) and "retiring" to a less active role in the campaign, serve as high-level NPCs for a new generation of PCs

With this in mind, most of the rules and most of the campaign really only need to work flawlessly up to about 12th level. This means, for example, that adding a character's level to a d20 roll is alright as a mechanic. It also means that spells really only need to be detailed up to spell level 6 or so (although they could also be rescaled to give access to traditionally 9th-level spells earlier I guess, not something I am too fond of trying). Finally it means that one can stick to an exponential level progression and hand out hit-dice instead of having to switch to a linear progression with additional hit-points instead. All simply wonderful consequences in my book.

And at this point, dear reader, you are probably no more enlightened than you were before. But I needed to record this brief rant so I can stop worrying about making things work well for higher levels where I'll presumably never even play.

Saturday, April 6, 2013

Holmes-ian Surprises

Yay, I finally got my copy of John Eric Holmes' Dungeons & Dragons Basic Set from 1979. Actually the book says "Second Edition, November 1978" but who cares. The box is pretty beat up, but the booklet itself and the copy of B1: In Search of the Unknown are very good.

I spent two days reading the thing and overall I am quite happy to finally understand why some people prefer Holmes over later revisions of the "basic" D&D game. However, I also was a little disappointed: I guess I expected the editing to be of higher quality given Holmes' academic background. Short sentences in which the same word repeats with just three words in between seem? A little clunky. But again, who cares. :-)

Here are the notes I jotted down while reading through the rules, mostly about stuff that surprised me. I edited this only a wee bit before hitting "publish" so please forgive me if I still have the odd typo or misunderstanding left. Feel free to correct me in the comments!
  • Ability Modifiers: Unlike in Moldvay/Cook, the modifiers for high/low ability scores are super-unorganized, similar to what they are in AD&D and (presumably) OD&D.
  • Adjusting Abilities: The rules for improving prime requisite abilities are similarly random-ish, Moldvay/Cook just says "lower by 2 to improve prime requisite by 1" I think.
  • Encumbrance: Holmes actually emphasizes where things are, not just how much they weigh or how bulky they are; what's not to like?
  • Organization: There really is none, we go from making characters to wandering monsters, to experience points tables; luckily there is a table of contents.
  • Spells and Scrolls: Magic-Users get spells at random by checking "chance to know" based on Intelligence; scribing scrolls (relatively cheap and apparently doable at any level) is explicitly mentioned as a way to offset having only a few spells per day memorized.
  • Thieves: They have d4 hit dice which indicates being worse at fighting than clerics, but then they have access to all fighter weapons (no restrictions whatsoever) and the Strength spells works better on thieves than on clerics.
  • Weird Combat: "When the party of adventurers is attacked by several monsters, all may be involved in melee, but the hand-to-hand battles must be fought one at a time and then the result imagined as if all were going on simultaneously." (page 18) What the hell? So four adventurers (A, B, C, D) meet four orcs (1, 2, 3, 4). We first resolve A-1 by going back and forth between them for however long it takes to finish the battle. Then we resolve B-2, C-3, D-4. And regardless of how long each took, we imagine them to occur simultaneously? That's the weirdest thing I've ever heard, and it certainly doesn't work at all with movement in the mix. Like the fighter who is done after 2 rounds will just light a pipe now watching the other three guys take much longer to tear down their orcs? (And I don't think I am misreading this, there's an example right above the text I quote where combat goes back and forth between two individual opponents and not between groups.) Actually page 20 then goes on to say that after melee those not engaged may move to assist.
  • Missile Fire: Mentions the need for high ceilings (good) but rules out slings indoors (what the...)? Firing into melee is not allowed (page 20, left column) but then allowed (page 20, right column) with a mention of friendly fire but then disallowed again (page 21, end of second example)?
  • That second example also then contradicts the earlier "resolve each combat seperately" routine by having multiple PCs engage a single monster.
  • Funny Monsters: "The minotaur is a bull-headed man (and all of us who have debated game rules are well acquainted with such)."
  • Inconsistent Monsters: Zombies are described as "slow" and get to attack only every other round, but their movement is 120, same as an elf or a blink dog.
  • Light Coins: "All coins are roughly equal in size and weight, being approximately the circumference and thickness of a quarter and weighing about twice as much as a quarter." It's roughly 6 grams for a quarter, so roughly 12 grams for a coin, so roughly 38 coins per lbs. Moldvay/Cook/AD&D 1e use 10 coins per lbs. Later AD&D editions use 50 coins per lbs. Seems Holmes was on to something there.

Sunday, February 24, 2013

Cool talks to play in class

Last semester I decided (for the first time) to give up an entire lecture to playing a talk I thought was just too good to ignore. Since then I've realized that there are several "cool talks" out there that fit a variety of courses I teach, and so I plan to collect them. Maybe others will find them just as cool?

So for this first post in the series, the talk that started it all. I played this one in "Computer Systems Fundamentals" which is an introductory systems course at JHU that covers (among many other things) microprocessor design and assembly level programming. The talk covers the MOS 6502 in a variety of ways, but the real "cool-factor" comes from the reverse engineering efforts described and demonstrated toward the end. Kudos to Michael Steil!

Wednesday, February 6, 2013

Annoying Heisenbug: Wavemon breaks NetworkManager

I installed a new wireless router today, one of my Christmas presents finally put to use after sitting in the proverbial box for way too long. Being ever the diligent geek, of course I needed to measure how good the reception is around the house. I looked for a tool that would show me the signal strength of my wireless network on my netbook and found wavemon. The tool seemed to work rather well and allowed me to verify that even in the basement I still get 60% signal strength. Not to shabby for a router sitting on the second floor, is it now?

So I went back upstairs to configure more of the many confusing options dd-wrt provides only to notice that my netbook would intermittently drop its wireless connection. I'd open Chromium to look something up and things would just time out, then suddenly NetworkManager would pop up and request that I enter the admin password followed by the wireless key again, sometimes four times in a row. Then the connection would work for a few minutes before falling to pieces again, yada yada.

I was starting to get rather annoyed by this. Another laptop in the house was having similar problems with the previous wireless router, the very reason I got a new one. Of course that laptop now connected fine with no more problems, but for some reason my netbook which had always worked perfectly on the old router had "caught the bug" and would now not stay connected for more than a few minutes at a time. I kept double-checking what the router said about the connection to my netbook and what wavemon said (running in my netbook) about the connection to the router. Things were just messed up, and all kinds of theories started developing in my head about what could be wrong with Lubuntu 12.10 and NetworkManager and wpa_supplicant and the driver for my strange wireless card, etc. etc. etc.

What never occurred to me was that by desperately looking at the connections using wavemon, a tool used to measure stuff, I was actually causing all this trouble! When I shut down wavemon the network become wonderfully stable. When I started wavemon again, after a minute or two, it started misbehaving. The very definition of a Heisenbug (well, in this case an inverse Heisenbug I guess): It's there when you look for it and gone when you don't. Apparently wavemon was overloading wpa_supplicant with requests for SSID scans (the logs seem to indicate something to that effect) but I didn't verify that in detail.

Now of course there could still be something else wrong, but I've repeated the experiment several times and over and over again wavemon will mess up the connection after a few minutes. My advice: Use that tool only to measure signal strength for a few minutes, then get rid of it and never try to debug your wireless network with it. Never!

Bottom line: About 2 hours wasted. Sigh.

Edit: Some helpful hints for debugging NetworkManager stuff:  https://wiki.ubuntu.com/DebuggingNetworkManager

Friday, January 11, 2013

Quick Note on Multiple Linux Installs

Never mind the details, but I had reason to look into how to put a bunch of different Linux distributions on a single machine without virtualization. In my case I wanted Lubuntu, Arch, and Gentoo on my netbook, with room for more if needed. The things I learned:

  1. Do not share /boot across distributions, each distro you install should have it's own /boot for improved sanity.
  2. Do not share /home across distributions, each distro you install should have it's own /home for improved sanity.
  3. Pick one distro as the "safe and sound" one and install it first; you'll let this distro install GRUB2 and you'll use it to manage GRUB2 as you add more distros. So whatever you pick, make sure you know how to update GRUB2 correctly using that distro's configuration files and commands.
  4. Have a partition for shared data. Think of this as what you were trying to accomplish when you thought sharing /home was a good idea. When each distro boots, have the shared disk mounted at a fixed place like /share or maybe /home/user/share or something (this assumes that you're the only user, very true on my netbook).
  5. If you can avoid RAID, do so. If you can avoid LVM, do so. In fact, if you can avoid anything, avoid it. Try to keep things as simple as possible, but not simpler.
  6. Make sure that in each distro you know how to create a user account with the very same user and group id (this once again assumes that you're the only user).

If you were expecting detailed instructions on how to proceed: sorry! But it's really not too hard to figure out. I just wish someone had this list of high-level hints posted somewhere before I started trying to make this work. Now you don't have that excuse anymore. :-) The one thing I will share though is my decidedly non-GPT partitioning scheme. It's not perfect, but it's what works for me so far:

  • /dev/sda1 is the / for the "safe and sound" distro, Lubuntu in my case
  • /dev/sda2 is the swap partition that all installed distros will share
  • /dev/sda3 is the shared data partition that gets mounted under /home/user/share
  • /dev/sda5 is the / for Arch
  • /dev/sda6 is the / for Gentoo
  • ...

LVM would allow you to grow/shrink things later, but I didn't want to bother with the trouble. I have a 160GB disk in my netbook and it was easy to decide that 32GB for each distro would be okay, which leaves 64GB. Take away another 2GB of swap and 16GB of shared data and I have 40+GB left to grow. Not much, but not likely that I'll really need it either.

EDIT: In retrospect I think it would be a good idea to use a rolling release distro for the "safe and sound" one, so I'll probably switch to Arch for that eventually.

Thursday, December 20, 2012

Why Geeks Don't Like You: A Hint for United Way of Central Maryland

Like many others around here, I am fairly used to getting spammed about this that or the other United Way campaign at my JHU work email. I've made my peace with it, after all configuring a spam filter isn't all that complicated. Of course a more appropriate solution would be for the spam to stop, but I decided a while ago that it's not worth picking a fight over.

In any case, every now and then something from United Way gets through. Tonight I received an email from

Nicole Lipinski <nicole.lipinski@uwcm.org>
 
asking me to please donate money like I had in previous years. Now I have actually never donated to United Way, ever. It's not like I don't believe in charities, I just prefer to donate to other charities, maybe even some that don't spam me. 
 
But what the heck, I thought I'd take the time to point out to someone at United Way how I feel about the spam I get: I hit reply and explained briefly and politely that I am not donating and that it would probably help them with the geekier population around JHU if they stopped spamming us. I was a little surprised when I got back the following:

550 No Such User Here

Huh? You can probably guess what happened next. In a slightly less friendly tone I contacted

postmaster@uwcm.org
abuse@uwcm.org

to complain about them sending me email from a completely fictional email address, one of the hallmarks of any self-respecting spammer. Then what happened?

550 No Such User Here
550 No Such User Here

You better believe it. Never mind that RFC 2142 clearly states that both of these addresses have to exist if you run SMTP on your host. So the next thing I do is check their whois record where I find two more email addresses:

webmaster@uwcm.org
dataprise@uwcm.org

Of course I had little hope by now that they would follow RFC 1834 any better than they had followed RFC 2142, and predictably I got back two more of these:

550 No Such User Here
550 No Such User Here

I don't know what the IT people over there are thinking. Maybe something like "Those rules only apply to old-fashioned business organizations, but we're a lean-and-mean donation-gathering-machine so we don't have to follow those weird RFCs!" Whatever it is, I can pretty much guarantee that this kind of ignorance in setting up their email infrastructure does not reflect very kindly on them. At least not from where I sit: deep geekland. Now excuse me while I tighten up that spam filter a bit more.

Sunday, September 16, 2012

Those Curious Python Operators

Alright, so Python still surprises me every now and then. Here's a fun one that I stumbled across by accident today:
>>> 0 == 0 == 0
True
>>> 0 == 0 == 1
False
>>> 0 == 1 == 0
False
>>> 0 == 1 == 1
False
>>> 1 == 0 == 0
False
>>> 1 == 0 == 1
False
>>> 1 == 1 == 0
False
>>> 1 == 1 == 1
True
Did you expect that? I sure didn't. But I guess Python is famous for "special casing" its operators to avoid confusing beginners in several places. So they end up confusing people who know lots of other languages instead. Here's what I would have expected to happen (but Python only does this with explicit parenthesis):
>>> (0 == 0) == 1
True
Good times! :-D BTW, in case you were wondering, another place where Python does the "right thing" despite what you may expect coming from C and similar languages: 14 < i < 99 actually does the proper range check, and not by accident either.