- New, improved Haunted Castle!—Wednesday, August 13th, 2014
I’ve just uploaded the new, easier to read and use version of my favorite adventure, Illustrious Castle. This also means that the PDF is improved: besides being in 9x7 format for easier reading on a computer screen, the PDF contains a table of contents and some links back and forth between content.
Further, I’ve integrated the maps into the text; note also that the maps are now in Inkscape format for easy modification. You can download all of them as part of the zip resources file for the adventure.
Unlike all of the rest of the Gods & Monsters adventures except The Vale of the Azure Sun, this adventure is from the elder times: it is an early adventure I originally wrote for AD&D, and have enjoyed it so much I have continually used it since them. Back then, it was Castle Oberon; later I added the library town and turned it into Illustrious Castle, noted that the castle was haunted and added the Haunted appellation.
When we restarted our gaming nigh on ten years ago, and I needed a second adventure for the group, this is the one I pulled out of my bag of tricks. We had as much fun with the town as we did with the castle!
- Chaos and Order in IT—Thursday, July 24th, 2014
“Few people notice this, but for IT groups respect is the currency of the realm. IT pros do not squander this currency. Those whom they do not believe are worthy of their respect might instead be treated to professional courtesy, a friendly demeanor or the acceptance of authority. Gaining respect is not a matter of being the boss and has nothing to do with being likeable or sociable; whether you talk, eat or smell right; or any measure that isn't directly related to the work. The amount of respect an IT pro pays someone is a measure of how tolerable that person is when it comes to getting things done, including the elegance and practicality of his solutions and suggestions. IT pros always and without fail, quietly self-organize around those who make the work easier, while shunning those who make the work harder, independent of the organizational chart.”
That’s as succinct a description of the chaotic moral code as you’ll find in real life. Self-ordering hierarchy based on the needs of the current problem outside of the needs of any imposed hierarchy.
“Cynthia Breazeal, the famed roboticist at MIT’s Media Lab and a pioneer of social robotics, is unveiling her latest creation today. Unlike her previous robots, created for research and used in settings like classrooms and hospitals, her newest robotic device is designed for people to use at home. Breazeal hopes users will find the robot, called Jibo, so fun and friendly that it will become ‘part of the family.’… Another application is as a storyteller, Breazeal says. Jibo will be able to tell stories using sound effects, graphics, and movement, ‘bringing content to life and engaging kids in a playful way.’”
Can Jibo run a roleplaying game session?
- A History of D&D In 12 Treasures—Monday, July 7th, 2014
“Role-playing game historian Jon Peterson reviews twelve rare artifacts that grant us unique insight to the initial development of Dungeons & Dragons. They include original documents from Braunstein, an early letter from Gary Gygax on the medieval setting, Dave Arneson’s notes for his own early medieval game, fanzines and maps associated with the Castle & Crusade Society, and various pre-publication D&D rules.”
In honor of the upcoming rewrite of the Dungeons and Dragons game, here’s a little history leading up to the publication of the very first Dungeons and Dragons.
- Lulu price drop—Monday, April 21st, 2014
Lulu.com has recently dropped their printing costs. In response to this, I have dropped the price of the Gods & Monsters rulebook from $12 to $8.50, and the price of the introductory adventure Lost Castle of the Astronomers from $10 to $7.50. If you haven’t bought the print copy yet (and, let’s face it, you haven’t) head over to the Gods & Monsters storefront!
This is an amazing price drop. I’m very impressed. And I need to pick up the newly-repriced Fight On! too!
I’m currently working on converting Illustrious Castle to the new format—9 by 7, with Inkscape maps. When I have that done (don’t hold your breath), that will go on Lulu as well.
- Automatically roll subtables—Saturday, April 5th, 2014
Now that the “random” script handles percentage tables for wandering encounters, it’s very close to being able to handle the hierarchical encounter charts I use in Gods & Monsters. All that remains is for it to detect that an entry on the table is itself another table.
In order to do this, we need to be able to detect whether an entry matches a table file. We already have a function, tableFactory, that returns a table based on the filename; currently, however, it fails if the filename does not exist as a file. What we can do is make it return “no file” if the file doesn’t exist. In Python terms, we want it to return None instead of returning a Table object.
Before the “open” line in “def tableFactory(name):”, check to see that the filepath exists:
- #load the table into the appropriate class
- filename = name + '.txt'
- filepath = filename
- localepath = os.path.join(options.locale, filename)
- filepath = localepath
if not os.path.exists(filepath):
- return None
- items = open(filepath).read()
if "\t" in items:
- table = PercentTable(items)
- table = SimpleTable(items)
- return table
If the path represented by the filepath variable does not exist, the function returns None. This means we can use it for checking to see if a table file exists. Currently, if there is no “number appearing”, the system assumes “1”. Let’s change it to assume nothing. Change “appearing = '1'” to:
- #generate the number appearing
- appearing = ''
Now, we can detect this on making our random choice:
- T is for Tower… of the Elementalist—Wednesday, April 2nd, 2014
T is for Tower. Of the Elementalist. Of plaster, green and swirled, round, and four stories high.
That’s from James Pacek’s The Wilderness Alphabet. From Archway to Ziggurat, it’s a collection of tables of things to find in the wilderness when randomness is useful.
Next, add a stout round altar with a trapezoidal base, and written on it… and epitaph.
LeBlanc is into the d30, and while he just started his A-to-Z series he has several other d30 tables already done, including a dinosaur table! Need a random dinosaur? How about number 17, the ornithomimus! “Very intelligent: surprises on 1-2 (on 1d6)”.
The d30 tables and DungeonWords are free; The Wilderness Alphabet is available on Lulu.com in a nice 6x9 paperback with illustrations. For his cover, he uses the very appropriate Knight at the Crossroads by Russian folklorist painter Victor Vasnetsov.
All of these tables will, of course, work very handily with the random item Python script described in Programming for Gamers: Choosing a random item and included with the The World of Highland Guidebook resources archive. The wilderness letter choice is a percentile-based breakout table, and almost everything else is a simple list.
These tables are the kinds of things I might use on or just before game day when I need a new adventure and don’t even have the nut ready. A random roll, and sure enough, a tower is a good place to start, and an elementalist a good way to theme it. And then at the center of the tower, an altar? I can run with that pretty quickly. And the altar contains an epitaph? Oh, my, who died, and why is their epitaph on the altar at the center of this green tower? Oh yes, that’s making me want to stop writing this blog post and start writing that adventure!
- Random table rolls—Saturday, March 29th, 2014
Our random table script is doing a lot for us now. We can roll any arbitrary number of times on any text file. But often, we aren’t rolling a known number of times: our number of rolls on the random table is itself random. So it would be nice to, in addition to ./random 3 gems we could also do ./random d4 gems.
Now that we have the dice library installed, we can do this. The main issue is that the script currently knows whether to roll more than once by looking to see if the first item on the command line is all digits:
- count = int(firstArgument)
If we are going to accept die rolls, then we need to accept another character as well as digits: the letter ‘d’. There does, however, have to be at least one number. Basically, we need our script to recognize a die roll.
When we need to recognize text patterns, the most common tool is a regular expression. In Python, we use regular expressions by importing the re library. Add this to the top of the script with the rest of the imports:
- import re
Replace the if/count lines above with:
if re.match(r'[0-9]*d?[1-9][0-9]*$', firstArgument):
- count = firstArgument
That looks complicated—and regular expressions can certainly become complicated—but in this case it isn’t.
- re.match matches text patterns from the beginning of the text.
- The last character is a dollar sign, which requires that the pattern match the entire piece of text instead of just the beginning.
- The first set of characters are in square brackets: [0-9]. Items in square brackets mean, match any character in that range. For example, [a-m] would mean any character from lower-case ‘a’ through lower-case ‘m’. In this case, it’s any number.
- The next character immediately following the first set is an asterisk. The asterisk means any number of the preceding character. The preceding character is any digit. So, “[0-9]*” means any number of digits. Any number includes zero, so this means zero or more digits at the start of the text.
- The next portion is the letter ‘d’ followed by a question mark. The letter ‘d’ is needed to show that this is a die roll, and the question mark means that we need zero or one of the previous characters. If this is not a die roll, there will be no ‘d’. If this is a die roll, there will be only one ‘d’. The question mark handles this for us.
- The next portion is “[1-9]”. There must be at least one digit from 1 to 9 in either a die roll or an arbitrary number.
- And the final portion is “[0-9]*”. We have already seen this; it means from zero to any amount of digits.
- if firstArgument.isdigit():