Online Dungeon Master

October 21, 2011

Descent Into Darkness: Free heroic tier D&D4e adventure

Filed under: 4e D&D, Adventures, Macros, Maps — Tags: , , — OnlineDM @ 7:30 AM

At last, my adventure trilogy is complete. The first two adventures, The Stolen Staff and Tallinn’s Tower, were released here on the blog over the past few months. The third adventure, as I mentioned here, is now available.

Descent Into Darkness is an adventure for 4-6 heroic tier characters. The adventure is presented at level 2, 4, 6, 8 and 10. I personally recommend it at level 6, 8, or 10, but it can work at lower-level (though the PCs might be surprised and scared by the final boss).

Synopsis

The powerful wizardess Tallinn seeks adventurers to be teleported into the Underdark bearing a powerful magical artifact, the Staff of Suha. The mission: Find three other artifacts that have been stolen by unknown creatures, likely in an effort to recreate a teleportation device once used by a long-dead drow sorcerer to bring his foul armies to the overworld in conquest. The other three artifacts (Orb of Oradia, Chalice of Chale and Shield of Shalimar) must be recovered or destroyed, and the forces behind their theft must be stopped.

The adventurers discover that the powerful beholder Ergoptis has enslaved drow, diggers (new insectoid monsters), halfling thieves and mindless duergar as soldiers and hunters of artifacts. The party must fight their way through treacherous traps and puzzles to ultimately face Ergoptis and its underlings in a room dominated by a ziggurat, with a magma river crossed by bridges and floating platforms. Can they recover the final artifact and escape or destroy Ergoptis before the one-hour time limit on their teleportation ritual runs out? Or will the beholder simply add the adventurers to its army of enslaved warriors and continue its plans for domination?

Descent Into Darkness includes four new artifacts, an all-new monster (the digger), a find-the-path puzzle with custom runes and an exciting final encounter with an evil beholder.

Files

Download the full heroic tier adventure PDF (level 2/4/6/8/10)

Download the MapTool campaign file (compatible with version 1.3.b86 of MapTool)

Maps (scaled to 50 pixels per square)

Mine map - Gridded

Mine map - no grid

Thieves cavern map - gridded

Thieves cavern map - no grid

Mushroom cavern map - gridded

Mushroom cavern map - no grid

Magma cavern map - gridded

Magma cavern map - no grid

Afterword

If you decide to run this adventure or have the opportunity to play in it, I’d love to hear about it! And if you have any feedback based on your own read-throughs, I’m always trying to improve the adventures themselves. Feel free to chime in via the comments, email, or Twitter.

-Michael, the OnlineDM

[email protected]

OnlineDM1 on Twitter

October 17, 2011

WATE 2-4: Factotum the Bard is back on stage!

Filed under: 4e D&D, Adventures, Characters — Tags: , — OnlineDM @ 7:30 AM

This past Thursday evening, I had the rare opportunity to play D&D as a player rather than a DM. My wife has been feeling unwell for a while, so I try to mostly stay home with her in the evenings, but on this particular night she was getting together with another friend. A new-to-me Living Forgotten Realms module was being run at the friendly local game store, Enchanted Grounds, so I headed on down for a game.

Spoilers ahead for WATE 2-4 Stage Misdirection

The particular adventure we were playing was set in Waterdeep, the hometown of my beloved bard Factotum. This was the first time I had gotten to play an adventure with Factotum in Waterdeep, and I was excited.

I learned that the adventure begins with the PCs having various jobs in an opera house. “Star of the show” wasn’t an option, so Factotum settled for a spot in the orchestra pit with his horn, while the rest of the party either served as bouncers or sat in the audience. I asked the DM if Factotum could be an understudy, and he was fine with it. Excellent!

Imagine my delight, then, when the opening scene of the adventure involved an opera where a man was about to duel his sweetheart’s father, and the man fell to the stage – apparently dead after drinking poisoned wine. The poisoned wine was not part of the show, and it was soon accompanied by an angry crowd being riled up by some thugs. While the rest of the party sprang into action fighting the thugs, Factotum did the natural thing for him:

He jumped on stage, picked up the fallen actor’s sword, and continued the faux sword fight with the actor playing the love interest’s father.

He feinted and twirled, finding the time to shout words of majesty to his ailing compatriots and to sing powerfully to push interlopers off the stage (Majestic Word and Staggering Note), but largely focused on entertaining the crowd.

Yes, this adventure was tailor-made for Factotum.

The rest of the evening was a fun investigative romp, ultimately culminating in a fight with other actors. Factotum attacked one man who hadn’t directly menaced anyone yet, simply because the man was a terrible actor – an unforgivable offense.

WATE 2-4 is an adventure that definitely benefits from having a bard in the party. I’m sure it could have been fun without one, but I was really glad I’d brought Factotum to the table. It’s an opportunity for his fame to grow!

October 11, 2011

MapTool: Star Wars d6 campaign framework with NewbieDM

Filed under: Advice/Tools, Macros, OpenD6 — Tags: , , — OnlineDM @ 7:30 AM

I mentioned last week that I had gotten together with Enrique of NewbieDM.com and Mark Meredith of Dice Monkey on Wednesday night to help them out with some MapTool questions regarding the Star Wars d6 system (a game I know absolutely nothing about). I built a macro that rolled dice in the way I understood the Star Wars d6 system to work based on Mark’s description.

I later learned that the odd rule of the wild die not only exploding on a 6 but also penalizing the player on a 1 is an optional rule; the default rule is that the wild die just explodes. There’s also another optional rule that states that a 1 on the wild die will give you a 5/6 chance of the penalty I originally built (the die counts as zero, and you drop the highest non-wild die, too) and a 1/6 chance of having a plot-related complication instead. In the comments of that original post, I built the alternative macro with the possible complication.

I also learned that players often have “pips” which count as static bonuses to their rolls. NewbieDM stepped in on the comments to modify the macro to ask for the pip bonus. Nice work, Enrique!

NewbieDM then took the next step and created a full-on campaign framework file for Star Wars d6. He found some excellent artwork for the backgrounds (I especially love the star field). He and I collaborated on setting up campaign properties. I extended his work a little further to create a sample token with some macros on it for skills (Dexterity, Knowledge, etc.); one set for the default rules and one set for the rules that include a penalty for a 1 on the wild die. I didn’t include a set for the optional 1/6 chance of getting a “complication” if you get a 1 on the wild die, but the code is on the blog if you need it.

My version of the campaign framework file (built on NewbieDM’s) is available here.

It’s been fun learning a little bit about a new game and being able to help create something useful for people who play the game. I hope I get the chance to try it out myself sometime!

October 10, 2011

New OnlineDM avatar, courtesy of James Stowe

Filed under: Background, Characters — Tags: — OnlineDM @ 10:33 AM

If you see me posting in the comments here on the blog or over on Twitter, or on EN World or the like, you may notice a new avatar.

Since shortly after I started the blog, I had been using this image as my avatar:

You may recognize it as the Rune of Terror from the room full of zombies on the first floor of the Keep on the Shadowfell. I used it because it was the first thing I had drawn myself that looked at all respectable (even though it was my attempt at recreating something that another artist had drawn). Ironically, I never got to use that image in-game, as the group that I was running through the Keep ended up not being able to play any more.

I’ve felt for a long time that I’d like something better. I’ve asked a couple of friends of mine who are artists if they would be interested in a commission from me, and none of them really were. Then I saw James Stowe’s offer to do commission work. I really enjoyed the character sheets he had created for his kids, and I like the cartoon aesthetic, so I commissioned him to do a couple of pieces for me.

The first is a portrait of my beloved bard, Factotum. I think James nailed this one.

The second is an avatar of me, Michael the OnlineDM. I sent James the link to this picture of me and asked if he had any inspiration about how to get the “online” part of my name across. I think he came at it in a brilliant way:

So, don’t be confused if you see a little cartoon guy in a computer screen box instead of a rune of terror – it’s still me!

And if you’re an artist who might be interested in commission work for a banner for my blog, I’m offering to pay! Send me an email at [email protected] if you’re looking for work and think you might be able to come up with something good.

October 7, 2011

MapTool macro: Star Wars d6 / OpenD6 dice

Filed under: Advice/Tools, Macros, OpenD6 — Tags: , , — OnlineDM @ 7:35 AM

I’m beginning to like Twitter.

Wednesday evening, I happened to check Twitter just before heading to bed. I was just in time to see an exchange between @NewbieDM (aka Enrique of NewbieDM.com) and @MarkMeredith (aka Dice Monkey). They had just finished trying to play some Star Wars d6 via Google+ hangouts, and it hadn’t worked all that well. Enrique was about to show Mark some MapTool stuff. I chimed in, and they invited me to join them on Skype.

Even though he hasn’t been using MapTool very long, Enrique has already built some extensive stuff for his Neverwinter campaign (using my MapTool framework as a base, I’m humbly proud to say). He started showing Mark the ropes, and it soon became clear that Star Wars d6 was a little bit different in terms of the way die rolling works. I knew nothing about the game, so Mark explained it.

The basic dice mechanic is this (as I understand it, this is the mechanic for all OpenD6 games):

  • You roll a certain number of six-sided dice, depending on your skill at the task at hand. For this example, we’ll say you have a skill of 3, so you’re rolling 3d6.
  • One of the dice is the wild die; the other dice are rolled normally.
  • If you roll a 6 on the wild die, it “explodes”. That is, you roll it again and add both rolls together. If you roll another 6, you keep on going.
  • However, if you roll a 1 on the wild die, it counts as a zero, and it also cancels out the highest non-wild die that you rolled. So, if you roll a 2 and a 3 on your normal dice and a 1 on the wild die, your total is just 2 (because the 1 on the wild die cancels out the 3 from your best normal die).

I knew that MapTool had a built-in roll option to handling exploding dice, but I don’t know of any roll options to have a certain die cancel another die roll. So, I wrote a macro:

[h: x=input("NumDice|0|How many dice are you rolling?")]
[h: abort(x)]

This brings up a prompt for the user to tell the program how many dice to roll. If they hit Cancel, the macro stops.

[h: RegTotal=0]
[h: RegMax=0]

I establish starting values of zero for the total of the regular (non-wild) dice and the maximum of any regular die.

Regular dice:
[for(i, 0, NumDice-1), CODE:
 {

I display the words “Regular dice: ” in the chat window, then start a loop. Note that loops begin with 0 rather than 1 in MapTool by default, so I go with that. I want to loop through all of the dice except the wild die, so I stop at NumDice-1. I then open a CODE block with a curly bracket; everything in this block will be executed a number of times equal to the number of dice minus one.

  [NewRoll=d6]

First, I roll a d6 and store the value as NewRoll. Note that I didn’t use the h: roll option here as I do in most lines of code. This is because I don’t want the value of NewRoll to be hidden (the h:). Since this is a FOR loop, MapTool will put a comma between the iterations. So, if this was the only thing in the CODE block, MapTool would display “Regular dice: 2, 4” if it rolled a 2 and then a 4 on the two iterations.

  [h: RegTotal=RegTotal+NewRoll]
  [h: RegMax=if(NewRoll>RegMax,NewRoll,RegMax)]
 }
]

I add this new die roll to the running total of the regular dice (which started at zero). I then check to see if this new roll is higher than any of the previous regular die rolls. If it is, I set the value of RegMax to equal the new die roll; otherwise, I leave RegMax where it was. I then close the FOR loop.

[h: WildResult=d6e]
<br>Wild die=[WildResult]

Now I roll the wild die and store the result as WildResult. I use an “e” on the end of the die roll expression to represent “exploding” which MapTool already has built in. Nice! I then put in a line break (the <br>) in the chat window and then display the words “Wild die=” followed by the result of the exploding die roll.

[h: FinalTally=if(WildResult==1, RegTotal-RegMax, RegTotal+WildResult)]
<br>Total=<b>[FinalTally]</b><br>

I now figure out and display the final result of the whole roll. If the wild die was a 1, the total for the roll is whatever I rolled on the regular dice, minus the highest regular die (the 1 from the wild die is not added). Otherwise, the total for the roll is the total of the regular dice plus the result of the wild die (including any explosions). I pop in another line break and display the final result in bold (the <b> and </b> surrounding the value of FinalTally).

The result will look something like this:

Regular dice: 2 , 3
Wild die=2
Total=7

There you have it – the basic Star Wars d6 dice macro! Now I just need to learn to play the game.

-Michael, the OnlineDM (@OnlineDM1 on Twitter)

 

Complete macro:

[h: x=input("NumDice|0|How many dice are you rolling?")]
[h: abort(x)]

[h: RegTotal=0]
[h: RegMax=0]

Regular dice: 
[for(i, 0, NumDice-1), CODE:
 {
  [NewRoll=d6]
  [h: RegTotal=RegTotal+NewRoll]
  [h: RegMax=if(NewRoll>RegMax,NewRoll,RegMax)]
 }
]

[h: WildResult=d6e]

<br>Wild die=[WildResult]
[h: FinalTally=if(WildResult==1, RegTotal-RegMax, RegTotal+WildResult)]
<br>Total=<b>[FinalTally]</b><br>

October 6, 2011

MapTool: Using the latest version

Filed under: 4e D&D, Advice/Tools, DM Lessons, Macros — Tags: , — OnlineDM @ 7:33 AM

I first discovered MapTool in May 2010. At the time, the most up-to-date version of the program was good ol’ 1.3.b66. That’s what I downloaded, and that’s what I kept using for about a year and a half.

Why? Well, first of all, it worked. Second, I had heard that certain things that worked in older versions (macros, etc.) would not necessarily work if you tried them out in a newer version. Third, new builds kept coming out regularly, and I didn’t want my players to have to constantly download new programs just to connect to my game.

Recently, I was browsing the MapTool wiki and forums and found some discussion about the program’s performance. Specifically, I saw a note that moving a whole bunch of tokens at once was faster in newer builds.

Now, I don’t have many complaints about MapTool, but it’s definitely been a major annoyance to want to move the entire party from one section of the map to another and having to wait 30 seconds for MapTool to make this happen. So, I downloaded the current version of MapTool, 1.3.b86 (as of this writing), which has been the most recent version for months (and thus pretty stable).

Woo hoo – I can now move mobs of tokens across the map instantly! I can also run a macro on a whole bunch of tokens at once – such as when I have a bunch of enemies that are invisible to the players and I want to run my “Toggle Visibility” macro on all of them. Previously, the tokens would blink into existence one by one (which was a kind of neat effect, I suppose, but not really what I wanted). Now – poof, they all appear! Awesome!

Best of all, I haven’t found any macros that have broken yet. I try to keep my macros pretty straightforward, of course, and I’m guessing that helps. But every adventure I’ve opened so far in 1.3.b86, even though it was created in 1.3.b66, has had no problems.

The real test will come on Friday, when my regular players will have downloaded the new software and will try playing with it together. Honestly, I’m expecting it to be a non-issue, but we shall see.

So, the moral of the story for me is: Use the latest version of MapTool, as long as it’s been out for, say, a month with no updates. I don’t want to update constantly, but in this case the update is definitely worth the trouble.

October 5, 2011

MapTool macro: Attack and defense modifier states

Filed under: 4e D&D, Advice/Tools, Macros, Online games, RPG Projector — Tags: , , — OnlineDM @ 7:57 AM

More MapTool macro fun! Yes, I’m a nerd and proud of it.

In a game like Dungeons and Dragons 4th Edition, it’s pretty common to get temporary bonuses to attack rolls or defenses. When you’re playing with pen and paper, you have to keep track of these yourself. When you’re using MapTool, the program can help.

Now, I’m sure that some of the snazzier MapTool frameworks out there will handle temporary modifiers in super-fancy ways that actually change the calculation of attacks based on these modifiers and so on. I’m not looking for any of that. I’m simply looking for a visible reminder on a token that it has a temporary bonus or penalty.

I started creating +2 attack and-5 attack and +2 defense states in a piecemeal manner months ago. As PCs and monsters in my games started getting powers that could apply these bonuses or penalties, I created states that would remind me of them. I would then turn these states on and off very manually – right click on the token, find the right state, click on it. Repeat to turn it off.

Well, I’m sick of that, so I decided to automate the process.

First, I created a set of 20 token states: +1 to +5 attack, -1 to -5 attack, +1 to +5 defense and -1 to -5 defense. They look something like this:

      

Depending on whether I’m using MapTool online or with my projector setup, I either display these states as 3×3 grid images (online) or 2×2 grid images (projector – the larger images show up better). The red boxes are for attack (or damage) and the blue boxes are for defenses. I use 80% opacity, so you can still make out a little of the token art behind the states.

A monster with +5 to attack, one with -3 to defense, and one with +2 to attack and defense

For a while, I was creating individual toggle buttons for my states. Click a token, then click the “+2 Attack” button, and the +2 Attack state will toggle on or off. Now that I have 20 of these states, I decided to streamline. Rather than 20 buttons, I have two: One to set attack modifiers and one to set defense modifiers.

Attack bonus macro (download the macro)

[h: x=input("NewMod|0|What is the token's new attack modifier?")]
[h: abort(x)]

I start by asking for the new attack modifier in a pop-up; if the user clicks the Cancel button, the macro ends. Note that the user can specify a +2 bonus as either “2” or “+2”; the macro works either way.

[h: SelectedTokens=getSelected()]
[FOREACH(TokenID, SelectedTokens, " "), CODE:

I create a list of token IDs called SelectedTokens for however many tokens are currently selected, and then I loop through each of these tokens to perform the same code on them. This lets me apply (or remove) a bonus or penalty to a bunch of tokens at once.

 {[if(NewMod>5 || NewMod<-5), CODE: {[assert(1==0,add("<b>Error</b>: Attack modifier must be between -5 and +5"),0)]}; {}]

I throw off an error message if the user tries to enter a number over 5 or under -5, since that’s the range of states I’ve created.

  [h: OldMod=getProperty("AttackState",TokenID)]
  [h: OldState=if(OldMod>=0, add("+", OldMod, " Attack"), add(OldMod, " Attack"))]
  [h: NewState=if(NewMod>=0, add("+", NewMod, " Attack"), add(NewMod, " Attack"))]

I figure out what the current value of the token’s AttackState property is (a number from -5 to 5), and then convert this to a string like “+2 Attack” or “-3 Attack”. This corresponds to the names of the states in my campaign file. I do the same for the new attack modifier, getting the appropriate state name.

  [h, if(OldMod==0), CODE:{}; {[h: setState(OldState,0,TokenID)]}  ]
  [h, if(NewMod==0), CODE:{}; {[h: setState(NewState,1,TokenID)]}  ]

If the new or old modifier is zero, I don’t try to change it (since no state is displayed on the token for a zero bonus). Otherwise, I turn off the old state (setting it to false, or 0) and turn on the new state (setting it to true, or 1).

  [h: setProperty("AttackState", NewMod, TokenID)]
    }
   ]

I set the value of the AttackState property to whatever the user entered, so that the macro can reference that property the next time it’s run. I then close the CODE block and the FOREACH loop that I started at the top. Voila!

The whole macro is as follows:

[h: x=input("NewMod|0|What is the token's new attack modifier?")]
[h: abort(x)]

[h: SelectedTokens=getSelected()]
[FOREACH(TokenID, SelectedTokens, " "), CODE:
 {[if(NewMod>5 || NewMod<-5), CODE: {[assert(1==0,add("<b>Error</b>: Attack modifier must be between -5 and +5"),0)]}; {}]
  [h: OldMod=getProperty("AttackState",TokenID)]
  [h: OldState=if(OldMod>=0, add("+", OldMod, " Attack"), add(OldMod, " Attack"))]
  [h: NewState=if(NewMod>=0, add("+", NewMod, " Attack"), add(NewMod, " Attack"))]
  [h, if(OldMod==0), CODE:{}; {[h: setState(OldState,0,TokenID)]}  ]
  [h, if(NewMod==0), CODE:{}; {[h: setState(NewState,1,TokenID)]}  ]
  [h: setProperty("AttackState", NewMod, TokenID)]
    }
   ]

Defense bonus macro (download the macro)

The defense macro is exactly the same as the attack macro – just replace “Attack” with “Defense”.

[h: x=input("NewMod|0|What is the token's new defense modifier?")]
[h: abort(x)]

[h: SelectedTokens=getSelected()]
[FOREACH(TokenID, SelectedTokens, " "), CODE:
 {[if(NewMod>5 || NewMod<-5), CODE: {[assert(1==0,add("<b>Error</b>: Defense modifier must be between -5 and +5"),0)]}; {}]
  [h: OldMod=getProperty("DefenseState",TokenID)]
  [h: OldState=if(OldMod>=0, add("+", OldMod, " Defense"), add(OldMod, " Defense"))]
  [h: NewState=if(NewMod>=0, add("+", NewMod, " Defense"), add(NewMod, " Defense"))]
  [h, if(OldMod==0), CODE:{}; {[h: setState(OldState,0,TokenID)]}  ]
  [h, if(NewMod==0), CODE:{}; {[h: setState(NewState,1,TokenID)]}  ]
  [h: setProperty("DefenseState", NewMod, TokenID)]
    }
   ]

I hope this type of macro is useful for folks out there. As always, let me know if you have questions about my macros or requests for new macros. I love this kind of thing, as you can no doubt tell!

Note: All macros were generated with version 1.3.b66 of MapTool, but they work with 1.2.b86 as well.

Download the properties for online games with these states

Download the properties for projector games with these states

Download my complete campaign template for online games

Download my complete campaign template for projector games

October 4, 2011

Rejected for DDI – and I feel fine!

Filed under: 4e D&D, Adventures, Advice/Tools, DM Lessons — Tags: , — OnlineDM @ 7:25 AM

Edit: The final, polished version of the adventure can be found at this link.

I decided to submit the third adventure in my Staff of Suha trilogy to Dungeon Magazine for their consideration. The timing was right, after all; the adventure was ready to go at just about the time the submission window would be opening (October 1).

I spent a lot of time in September trying to polish the adventure itself, figuring that if I could attach the finished adventure to the “pitch” email it would help my chances. I ran the adventure four times and had a couple of friends and a couple of readers from my blog look over it and provide really useful feedback.

Since I live in the Mountain time zone, the submission window opened at 10:00 PM Friday night for me (midnight Eastern time). I was finishing my Friday night game that I run via MapTool at the time, after which I read Chris Perkins’ editorial about submitting pitches. I had already written the pitch weeks before, so I went ahead and submitted it exactly one hour after the window opened. The entirety of my email to [email protected] follows:

Descent Into Darkness – an adventure for 8th-10th level characters – 5,000 – 6,000 words

The powerful wizardess Tallinn seeks adventurers to be teleported into the Underdark bearing a powerful magical artifact, the Staff of Suha. The mission: Find three other artifacts that have been stolen by unknown creatures, likely in an effort to recreate a teleportation device once used by a long-dead drow sorcerer to bring his foul armies to the overworld in conquest. The other three artifacts (Orb of Oradia, Chalice of Chale and Shield of Shalimar) must be recovered or destroyed, and the forces behind their theft must be stopped.

The adventurers discover that the powerful beholder Ergoptis has enslaved drow, diggers (new insectoid monsters), halfling thieves and mindless duergar as soldiers and hunters of artifacts. The party must fight their way through treacherous traps and puzzles to ultimately face Ergoptis and its underlings in a room dominated by a ziggurat, with a magma river crossed by bridges and floating platforms. Can they recover the final artifact and escape or destroy Ergoptis before the one-hour time limit on their teleportation ritual runs out? Or will the beholder simply add the adventurers to its army of enslaved warriors and continue its plans for domination?

Descent Into Darkness includes four new artifacts, an all-new monster (the digger), a find-the-path puzzle with custom runes and an exciting final encounter with an evil beholder.

Link to a PDF of the current draft of the adventure, complete with maps, stat blocks, puzzles, etc: http://dl.dropbox.com/u/6875434/Descent%20into%20Darkness%20Submission.pdf

Michael, the OnlineDM

https://onlinedm.wordpress.com/

That was the pitch. I wondered how long it would take to get a response; they said that they’ll reply to everyone within two months of the close of the submission period, which meant that I could theoretically have to wait until the end of January.

Fortunately, I didn’t have to wait that long. Monday morning I received the following email from Chris Perkins:

Hi Michael,

Thanks for the adventure proposal. The “artifact hunt” story doesn’t really grab me, so I’m going to pass on this one. We see a lot of artifact hunts, and four artifacts seems a bit much (the write-ups for them alone would eat up thousands of words of text). Also, we already have an adventure in the works featuring a beholder villain.

Regards,

Chris Perkins
D&D Senior Producer
Wizards of the Coast LLC

I’ve got to say, I felt pretty good about that. No, they didn’t accept my adventure, but Chris took the time to explain what he didn’t like about the adventure. “Collect the artifacts” doesn’t interest him, and they have another adventure coming with a beholder villain. That’s totally fair.

I came away from this feeling pretty good. The best part was that I got the response quickly, which means that I can release the adventure here on the blog!

The version I actually submitted to Chris is at this link. It’s set up specifically for upper-heroic parties.

However, I also assembled the adventure in a way that can be run with any level in heroic tier (though I feel that the adventure runs best at level 6 or higher). That version can be downloaded here.

I’ll talk more about the adventure itself in a later post, but I wanted to share my thoughts about the process for anyone else who wants to submit an adventure to Dungeon.

First, just focus on the pitch, not the finished product. I’m sure that Chris didn’t even look at the link I sent him, and I don’t blame him for that. He has tons of submissions to go through, and he’s not going to read a sixteen-page PDF for each submission.

Second, be creative. It seems like the key is to pitch something that makes the editor say, “Wow, I’ve never seen anything quite like that before!” The key is novelty, not execution, when it comes to the pitch. I feel like I’ve put together a fun, solid adventure, but the things that make it fun and solid (cool combats, puzzles, magic items, etc.) aren’t the things that make a good pitch. It’s a fairly run-of-the-mill adventure premise, and that’s not going to get it past the initial screen.

Third, do your research. In my case, my adventure was rejected in part because there’s an upcoming adventure with a similar villain, which I couldn’t have known about. But I’m sure that if I had pitched an adventure whose villain was similar to something done in the past few issues of Dungeon, it would have also been rejected. And there’s no excuse for me not knowing that.

Anyway, I’m glad I went through the submission process, and I’m especially glad that Chris handled my rejection letter the way he did – quickly, professionally, and with some helpful feedback. If I get any truly inspired ideas for adventures, I might pitch again. But this process was a good one for me.

October 3, 2011

MapTool macros: Numbers on tokens – elevation, etc.

Filed under: 4e D&D, Advice/Tools, Macros, Online games — Tags: , , — OnlineDM @ 8:00 AM

Ah, how I love to geek out with new MapTool macros!

Some months ago, I was going to be running a Living Forgotten Realms adventure that involved underwater combat, which meant that elevation could come into play. I wanted to have a visible way of displaying a token’s elevation right on the token itself, so I settled on using some token states that would display a number from 1 to 9 on the upper right corner of the token, representing its elevation.

However, I later realized that having a generic number to stick on a token is a useful thing. For instance, a later battle with a hydra showed me that it would be nice to have an indicator for the number of heads. Furthermore, I’d like to be able to display higher numbers as well, just in case.

Three monsters - one with no elevation, one with elevation 29 and one with elevation 4

Enter the new Elevation macro. First, I should explain that this macro requires you to have a certain set of token states (downloadable as a full set of properties and states here for online use or here for projector use) that include “_0” through “_9” for the ones digit and “0_” through “9_” for the tens digit. You’ll need an Elevation property on your token. And then you’ll need a macro like this one, which you can keep on either the Campaign or Global window.

[h: x=input("NewElevation|0|What is the token's new elevation?")]
[h: abort(x)]

The code above brings up an input window that asks for the new elevation and ends the macro if the user chooses the Cancel option.

[h: SelectedTokens=getSelected()]
[FOREACH(TokenID, SelectedTokens, " "), CODE:

This creates a list of token IDs called SelectedTokens, then starts a loop through each of the tokens, performing the following code on them. Thus, you could set the elevation for a group of three monsters all to the same level at once if you wished.

 {[h: OldElevation=getProperty("Elevation",TokenID)]

Figure out the token’s current Elevation property; assign it to the OldElevation variable.

   [if(NewElevation>99), CODE: {[assert(1==0,add("<b>Error</b>: Elevation cannot be higher than 99"),0)]}; {}]
   [if(NewElevation<0), CODE: {[assert(1==0,add("<b>Error</b>: Elevation cannot be lower than 0"),0)]}; {}]

Give an error message if the user tries to enter a new elevation that’s over 99 or less than zero.

   [h: OldTensDigit=FLOOR(OldElevation/10)]
   [h: OldOnesDigit=OldElevation-10*OldTensDigit]

   [h: NewTensDigit=FLOOR(NewElevation/10)]
   [h: NewOnesDigit=NewElevation-10*NewTensDigit]

Figure out the tens digit and ones digit of both the old and new elevations. I don’t know if MapTool has a modulus function, so I went with an alternative way of getting the ones digit (pretty elegant in the end, I think).

   [h: OldOnesState=add("_", OldOnesDigit)]
   [h: OldTensState=add(OldTensDigit, "_")]

   [h: NewOnesState=add("_", NewOnesDigit)]
   [h: NewTensState=add(NewTensDigit, "_")]

Since the states are called “_1” and “_2” and so on for the ones, and “1_” and “2_” and so on for the tens, I need to concatenate some strings to set up the names of the old and new states (in preparation for removing the old states and adding the new).

   [h: setState(OldOnesState,0,TokenID)]
   [h: setState(OldTensState,0,TokenID)]

   [h: setState(NewOnesState,1,TokenID)]
   [h: setState(NewTensState,1,TokenID)]

And here I actually set those states. The old states get set to zero (turned off) while the new states get set to one (turned on). Thus, if the token is changing from an elevation of 13 to an elevation of 20, I’m turning off “1_” and “_3” and turning on “2_” and “_0”.

   [h: setProperty("Elevation", NewElevation, TokenID)]

Since I’m changing the elevation states, I need to make sure I also change the elevation value on the token itself so that the macro will work again the next time I run it (the new elevation after this go-through will become the old elevation for the next time I run the macro).

   [if(NewElevation<10),CODE:{[h: setState(NewTensState,0,TokenID)]};{}]

This is just for prettiness’ sake; if the new elevation is between 1 and 9, I want to drop the zero from the tens place so the elevation will show up as “7” instead of “07” for instance.

   [if(NewElevation==0),CODE:{
     [h: setState(NewOnesState,0,TokenID)]
     [h: setState(NewTensState,0,TokenID)]};{}]

Further prettiness; If the new elevation is zero, I want no elevation states to be displayed at all, so I now remove the new states that I just added.

    }
   ]

And here I close the FOREACH loop and the Code brackets that I started way up at the top.

This macro is useful any time you want to stick a visible number on a token for whatever reason. Now that I’ve got it working, I’ll be interested to see how often it will come up. My suspicion is that I’ll end up using it a lot.

As always, please let me know what macro questions you have or any requests for new macros. I love this stuff!

Note: All macros were generated with version 1.3.b66 of MapTool.

Campaign template for online use, including this and all of my other macros

Campaign template, formatted for projector use

Campaign properties for online use

Campaign properties for projector use

Download the elevation macro alone

The full elevation macro code:

[h: x=input("NewElevation|0|What is the token's new elevation?")]
[h: abort(x)]

[h: SelectedTokens=getSelected()]
[FOREACH(TokenID, SelectedTokens, " "), CODE:
 {[h: OldElevation=getProperty("Elevation",TokenID)]
   [if(NewElevation>99), CODE: {[assert(1==0,add("<b>Error</b>: Elevation cannot be higher than 99"),0)]}; {}]
   [if(NewElevation<0), CODE: {[assert(1==0,add("<b>Error</b>: Elevation cannot be lower than 0"),0)]}; {}]

   [h: OldTensDigit=FLOOR(OldElevation/10)]
   [h: OldOnesDigit=OldElevation-10*OldTensDigit]

   [h: NewTensDigit=FLOOR(NewElevation/10)]
   [h: NewOnesDigit=NewElevation-10*NewTensDigit]

   [h: OldOnesState=add("_", OldOnesDigit)]
   [h: OldTensState=add(OldTensDigit, "_")]

   [h: NewOnesState=add("_", NewOnesDigit)]
   [h: NewTensState=add(NewTensDigit, "_")]

   [h: setState(OldOnesState,0,TokenID)]
   [h: setState(OldTensState,0,TokenID)]

   [h: setState(NewOnesState,1,TokenID)]
   [h: setState(NewTensState,1,TokenID)]

   [h: setProperty("Elevation", NewElevation, TokenID)]

   [if(NewElevation<10),CODE:{[h: setState(NewTensState,0,TokenID)]};{}]

   [if(NewElevation==0),CODE:{
     [h: setState(NewOnesState,0,TokenID)]
     [h: setState(NewTensState,0,TokenID)]};{}]
    }
   ]

September 30, 2011

D&D Encounters – Lost Crown of Neverwinter – Week 8

Filed under: 4e D&D, DM Lessons, Maps, Reviews & Culture — Tags: , , , — OnlineDM @ 1:30 PM

Edit 10/1/2011: Apparently WotC is NOT changing their policy of requiring that D&D Encounters be run on Wednesday nights, as I had originally mentioned in this post. My mistake.

I ran D&D Encounters at my friendly local game store, Enchanted Grounds, all summer long, and I loved it. I love the mini-sessions for prep purposes, I enjoyed the story, and most of all I enjoyed helping new players learn the game. One of the people I met via encounters is now good friends with my wife and I, along with his wife.

Thus, I was sad to have to give up DMing Encounters this fall when my Wednesday night bowling league started up. I agreed to serve as a backup DM in case any of the regular folks were out of town, though, and this week I got the call. Put me in, coach – I’m running a game!

My party consisted of four PCs – two warpriests, a bladesinger and a thief. They began the session by taking a short rest in a boat house in a swamp, where they had come in search of the Dead Rats gang. The boat house held only a table and a rug, and a sharp-eyed PC noticed the rug sagging in the middle. Pulling it aside revealed a stone pipe with metal rungs forming a ladder down into darkness.

The adventurers successfully negotiated crumbling ceilings, narrow ledges, tough climbs and tricky tracking with no problem and eventually emerged into the sewers proper. They noticed some movement in the water – two pairs of eyes staring at them from just above the water’s surface. As the dwarf warpriest pushed forward, the eyes revealed themselves to be attached to a pair of crocodiles, and a swarm of hundreds of rats poured out of some pipes in the walls to join the fun. The PCs could also hear noises inside a larger pipe, as if something else was making its way toward them.

The party thief decided to try to jump across the sewer channel but failed, landing in the water next to the large pipe – which was revealed to contain a dire rat. The rat bit the thief (one exposure to Dire Rat Filth Fever) and was soon joined on the other side by a crocodile who clamped its jaws around the poor thief’s leg. Ouch!

The rest of the party was dealing with the swarm and the other crocodile, but the drow warpriest did wade into the muck and drop a cloud of darkness to help the thief get away. No luck, though – the crocodile’s next turn of grinding its jaws down on the delicious thief left the sneaky bugger unconscious (and getting more exposure to disease from the dirty water).

Eventually the thief was healed and got himself out of harm’s way and the rest of the party started taking care of the bad guys one by one – first the dire rat, then the swarm, then finally the crocodiles. And there was much rejoicing!

At the end of the encounter, since the thief had been exposed three times to Dire Rat Filth Fever (twice from rat bites and once from bleeding in the dirty water) I invoked my house rule: He only had to make one saving throw to avoid infection, but because of the two extra exposures, the saving throw was at a -2 penalty. It was a moot point, as he rolled a 7 on the die and found himself infected.

In prepping for the game, I realized that it would be a pain in the butt for a typical Encounters player to have to deal with a disease. “Wait, what do I have to roll to get better? And what happens if I get worse?” So, I used the awesome Power2ool to create disease cards to hand out to any players who get infected:

While it was only a one-week return to the Encounters DM table, I had a lot of fun. It was also nice to have more people compliment me on my projector setup + MapTool for my in-person games. The encounter itself wrapped up within an hour, so I was even able to make it to bowling on time.

Best of all, the coordinator at the store is thinking about moving Encounters to Tuesday nights in the future, since WotC has given store owners more flexibility about when they run the program. That would be awesome, since I’d be able to get involved again!

Edit: However, it looks like this is not a new WotC policy after all, and Encounters is still required to be run on Wednesday. Well, poop.

« Newer PostsOlder Posts »

Create a free website or blog at WordPress.com.

Design a site like this with WordPress.com
Get started