What’s the OnlineDM up to in May 2012?

Here are a few notes on what I’ve been up to lately.

Podcasting

I’ve now appeared on quite a few episodes of The Tome Show, including the recent review of Lords of Waterdeep and, before that, the review of Heroes of the Elemental Chaos. I’m currently reading Into the Unknown: The Dungeon Survival Handbook in preparation for recording a new episode with Jeff Greiner and Tracy Hurley next week.

Kickstarter

I backed the recently completed Roll20 Kickstarter, and I’m a backer for the currently active Prismatic Art Collection and Sentinels of the Multiverse. Check them out – they’re OnlineDM approved!

      

I also just received my Dice Candies in the mail from last year’s Kickstarter, and I plan to ask my friendly local game store to carry them. And hey, they’re made in Boulder, not too far from my home in the southern suburbs of Denver!

I’m also excited about my participation in the recent Admiral of the High Seas Kickstarter, in which I subscribed at a level that allows me to have a person or place named after me in an upcoming ZEITGEIST adventure. Look for the cursed island of Odiem (ODM – Online Dungeon Master) in a future adventure.

D&D Encounters

I’m happy to share that I’m once again DMing for D&D Encounters. I don’t have my usual Wednesday night bowling league in the summer time, so I get to run some D&D. This week is the character creation session, and the adventure begins in earnest next week. Woo hoo!

May of the Dead

I’m participating in the May of the Dead blog carnival, with my post coming out on May 29. I’ll be sharing an adventure that I had originally created a year and a half ago to help hook my brother in law and his wife on D&D: Spooks Under Silverymoon. Ooooh!

Other fun stuff

I’ve been playing in a recreational volleyball league on Thursday nights, which has conflicted with Living Forgotten Realms games lately, but I’ve enjoyed the exercise (even though I’m lousy at volleyball). I’m also starting a regular tennis game.  Yes, OnlineDM is getting in shape.

I’ve done a lot of work on my MapTool framework for D&D 4th Edition, setting up pretty character sheets. The problem I have right now is that it’s slow to update for PCs with lots of powers (as is the case for the 20th-level party in my Friday night game). I think I know how to speed things up, but it’s going to take some time to program, which I don’t have at the moment. Someday, though, I shall have awesomeness to share.

– Michael the OnlineDM

OnlineDM1 on Twitter

New maps from Tobold – Iron Keep from Reavers of Harkenwold

A few months ago, Tobold from Tobold’s Blog reached out to me for maps from Reavers of Harkenwold. I ran the adventure last year (review here) and had put up my own recreated maps for the adventure on my blog. (I later discovered that the official maps were available from the Wizards of the Coast web site for D&D Insider subscribers.)

Tobold made use of some of my maps, but he also took the time to create his own versions of the Iron Keep main tower maps using Campaign Cartographer. He was gracious enough to allow me to share his versions here as well. These maps, along with all of my other maps, can be found on my Map Library page. As you can see, his versions are a significant upgrade over what I had originally made!

Grand Tower 1st floor by Tobold

Grand Tower First Floor - My version

Grand Tower 2nd floor by Tobold

Grand Tower Second Floor - my version

Grand Tower 3rd floor by Tobold

Grand Tower Third Floor - my version

Thank you to Tobold for sharing these maps! And if anyone else wants me to share their maps on my site, please reach out to me at onlinedungeonmaster@gmail.com.

Cruise ship D&D

There were no new blog posts for me last week because I was on vacation, taking a Caribbean cruise. My wife and I went with some friends of ours and had a lovely time, getting to spend time in Puerto Rico, Saint Maarten and Saint Thomas.

We also had several days at sea, so I naturally brought along some games to play. During one of the sea days on the way out to the islands I managed to persuade one of our friends to play San Juan with us, the card game version of the Puerto Rico board game. It was definitely in-theme for the cruise, and we had a nice time with the game.

On the way back from the islands, I mentioned D&D at lunch and was pleased when the woman in the couple we were traveling with asked about the game. She really knew nothing about it, but she knew that I really liked it and that my wife played, too, so I started describing D&D to her.

D&D is ultimately a cooperative storytelling game. Each player has a character that they get to play, and they have a sheet of paper with information about that character, explaining what the character can do. The dungeon master describes a situation that the players’ characters find themselves in, and then it’s up to the players to tell the DM what their characters do. If it’s something straightforward, like “I walk over that way,” then the DM just narrates the result. If it’s something that the character might or might not succeed in doing, like “I scramble up that tree,” then the DM might ask the player to roll some dice and determine the result of the action based on the result of the die roll.

D&D is a fantasy game, like the Lord of the Rings, and the players get to play the heroes. This means that they’ll probably find themselves in combat with bad guys from time to time, and the game has rules for taking turns in combat, attacking enemies, getting hit by enemies, and yes, even death.

Given that description, my friends were interested in learning to play. Fortunately, I had come prepared!

Usually I run D&D games using my laptop and a projector. While I did have my laptop with me on the cruise, there was no way I was bringing my projector rig. Instead, I had grabbed the Dungeon Master’s Book from the Essentials Red Box set, along with the poster map and the sheet of tokens that came inside the Red Box. I also brought the pre-generated characters from D&D Encounters, which I had from last summer, and a container of dice.

The Red Box adventure, The Twisting Halls, assumes that the players start off by going through the solo adventure in the player’s book, creating their characters that way. I wanted to get the new players into the action as fast as possible, so I just gave them pre-gens and a little back story.

The adventure began with the party having been hired by a merchant to go to some goblin caves to recover a box that had been stolen from the merchant. The merchant also mentioned that he had seen a scary dark rider and thought that the rider might be involved. That was it for story; off we went into the first combat with two goblins and a wolf (scaled down from two wolves since we only had three PCs).

D&D in the ship's cafeteria. Note the ice cream bowls full of dice. Awesomeness.

Our first combat went smoothly enough, with the new players getting a feel for what their characters could do. They won the fight without much trouble and then sent their drow ranger down into a passageway to scout ahead. She was very stealthy and saw a couple of goblins standing in a room, not noticing her.

She asked, “Can I shoot this one?” Well sure! Surprise round, go for it. And thus began the second combat, with the rest of the party still at the top of the tunnel.

This combat was intentionally harder. I ran the full combat for four PCs, but I did it in waves. In the first few rounds, the players noticed someone peeking out from behind a door that was ajar, and the door later closed. Then, as combat with the goblins and their guard drake was almost over, a goblin spellcaster came out from behind a closed door and started blasting the party with magic.

My wife’s character, the cleric, spent some time making death saving throws, one of which fortunately ended up on a 20. From there, the party was able to handle the fight with no problem.

At this point the party discovered a little treasure, and I decided to call it a day. I could tell that our friends were starting to get a little tired, and I didn’t want to overwhelm them.

I was a little disappointed that I had picked an adventure without much real exploration or role playing at the beginning; we basically just had two fights and that was it. I’d like to give new players more of a sense of adventure, so that was a mistake on my part. But still, I was glad that my friends were intrigued enough to give them game a shot. We’ll be visiting these friends in Minnesota in a few weeks, and I’ll bring my D&D stuff along, just in case!

-Michael the OnlineDM

Maps! Lots of maps! And all in one place, too!

I’ve just returned from a very relaxing vacation, during which I did some extremely cool stuff with nice-looking PC character sheets in MapTool (a preview image is below).

However, since it’s going to take me a long time to write posts about the ridiculous quantity of work I did to put that together, I thought I’d get back into the blogging groove by pointing out that I have updated my Maps page.

Did you know that I had a Maps page? It’s under the Downloads section of my blog. I originally set it up in the earliest days of the blog, back when I was using OpenRPG and Gametable. I sort of abandoned the page, even though I kept creating maps.

I shared most of the maps I created on various places on the blog, but I thought it was high time to put them all on one page so that people who are looking for a variety of maps can find them all at once.

I haven’t done much in the way of organizing the page yet, though maps from the same adventure are grouped together (Reavers of Harkenwold, D&D Encounters Dark Legacy of Evard, etc.). These are all created in MapTool, and I wouldn’t call them super-fancy, but they work great for games in MapTool or Fantasy Grounds or similar programs. I’ve scaled them all to a 50-pixel grid, and I’ve provided versions both with and without the grid for nearly all of the maps.

As of this writing there are between 40 and 50 maps on the page, and I plan to keep adding maps to the page as I create them and post about them.

Enjoy!

-Michael the OnlineDM

ZEITGEIST Session Three: Recap and Review

Previous sessions: Session one, Session two

Our group gathered in mid February for our third session in the Zeitgeist campaign from EN World. This session took us to the climactic finish of Adventure One: The Island at the Axis of the World.

Beware the cannonballs!

Since my group had ended session two by going a little bit off the rails, I had to create a new encounter to kick off session three. The group was racing along a sea wall surrounding a fortress, trying to follow the trail of some fiery, smoky being that had destroyed a ship in the harbor before leaping onto the wall and into the fort. Unfortunately for our heroes, the wall was being viciously fought over by the defenders upon it and the attackers bombarding it from ships in the harbor.

Sea Wall Battle - showing enemy positions

The battle is fairly simple. The party is approaching along the wall from the left side of the map. Four Rebel Musketeers (custom enemies) are on the north side of the wall, shooting at ships in the harbor, and four more are on the south side of the wall, doing the same thing. Half of each set of musketeers have their muskets loaded and ready at any given time. Two Rebel Soldiers (from the published adventure) are between the rows of musketeers, giving orders.

At the end of each round, a cannonball comes flying across a random row of the wall around the tower, attacking creatures in that row and on either side of that row. This can cause characters (both PCs and enemies) to be pushed off the wall and into the water.

Once the PCs get within ten squares or attack the enemies, the rebels notice them and turn their focus from the ships to the PCs.

The full encounter is available here (Beware the Cannonballs), and battle maps scaled to a 50 pixel per square grid are below.

Sea Wall map - with grid

Sea Wall map - No grid

Where did he go?

Once the party had conquered the sea wall tower, they moved along the inner wall until they met up with allied soldiers who had succeeded in breaching the wall. The fiery creature they were pursuing was nowhere to be seen, but the commanding officers requested the party’s assistance in dealing with some Danoran prisoners in a brig.

Negotiations with the prisoners went well and led to some intelligence about an entrance to the central tower of the keep through the sewers. The Danorans also gave the party a key that would open a door on the roof of the tower in case they ended up there. These discussions were ultimately interrupted by screams and the sound of running feet across the roof of the brig – the fiery creature was back!

Our heroes rushed into the streets to see the fiery creature, revealed as an eladrin, using a strange orb that caused the inner fortress wall to disappear, replaced by wilderness for a few moments. The fiery eladrin ran across the tops of the hedge maze within the inner fortress wall and then started scaling the central tower. The PCs decided to rush after him.

Vesper, the scout in the party, had found the token back in the mines that gave him tremendous jumping power, so he decided to use that power to go bounding after the eladrin. He hopped along the tops of the hedges in the maze and found himself at the base of the tower, staring up as the eladrin finished ripping out bricks, tearing what looked like a gold wire in the wall (gold circles prevent teleportation in this world) and then disappearing – presumably inside the tower. Vesper climbed to the roof, used the key on the roof door, and started sneaking downstairs.

Meanwhile, the rest of the party found themselves dealing with an irate fey creature named Ghillie Dhu who was blaming them for lighting his hedges on fire (when in fact it was the eladrin who had done so with his fiery aura). Some quick negotiations followed, including a bit of a seduction by the female eladrin in the party, Andraste, and Ghillie Dhu was satisfied that the party was chasing the eladrin who burned the maze, not allied with him. Ghillie Dhu led them through the maze to the base of the tower, where they found a rope had been lowered by Vesper.

Level 1 PCs fighting a level 20 monster

Inside the tower, Vesper had gotten himself into a good eavesdropping position. He was able to see the eladrin, badly bloodied after fighting a bunch of guards in the tower, having a heated exchange with Duchess Evelyn of Shale (the Risuri noblewoman who had invaded the island) and a tiefling named Nathan Jierre. The eladrin, referred to by the duchess as Asrabey, had clearly beaten the duchess and the tiefling, and the duchess was trying to reason with him. Vesper bided his time, readying an attack in case Asrabey tried to hurt the duchess or the teifling any more.

The rest of the party was working on climbing the rope. Some of the PCs made their Athletics checks quickly, but our poor docker bard, Corduroy, struggled and struggled. As the party made it onto the roof, they saw the open door and peaked in, communicating through hand gestures with Vesper below.

Once Corduroy finally made it to the roof, he danced a jig of happiness…

Which made some noise, attracting the attention of Asrabey, who finally looked up and saw Vesper above him. His rage set off Vesper’s readied action, and we were in combat!

This was a beautiful moment in the adventure, where the writer, Ryan Nock, provides the DM with two ways to run the encounter. The default approach is to run Asrabey as an injured level 20 creature with only 27 hit points. This makes him practically impossible to hit, unless a PC rolls a natural 20, uses a power that deals damage without an attack roll (like Magic Missile) or uses a power that still has an effect on a miss (like most daily powers). At the same time, his attacks always hit the PCs unless he rolls a 1.

Alternatively, the battle can be run with Asrabey as a level 2 solo creature. I went hard core – he was level 20.

Combat was quick and deadly. Asrabey set his shield to work chewing on Vesper as the rest of the party rushed inside. The eladrin set up a zone that would soon erupt into flames. Andraste the witch used a power that would deal damage to Asrabey every time he hurt one of Andraste’s allies.

The party started to worry that they had bitten off more than they could chew, but they were doing their best to make use of daily powers and creative effects. Asrabey took a few hits and was clearly teetering, but Vesper was unconscious and laying in the area that would soon erupt into flames.

Asrabey began his turn, the flames rose, and Vesper was burned to death…

At which point Andraste’s effect caused Asrabey to take a few points of damage, killing the eladrin.

My players, including Vesper’s player, literally jumped to their feet, cheering and high fiving one another. It was one of the best moments I’ve had as a DM. Even though a PC died, it was a huge victory that was hard-won. They earned it, 100%.

In the aftermath of the battle, the party managed to steal Asrabey’s sword and cloak – high-level items that they really shouldn’t have and that are quite illegal for them to have taken in-game. But that’s okay… I don’t mind there being consequences later!

Thus ends adventure one of ZEITGEIST. It’s a very cool campaign so far, and I’m hoping to start adventure two as soon as we can get everyone’s schedules to line up. I’ve just learned that two of my six players are moving away in August, and there’s a chance that two more might be going eventually as well, so I hope to make some progress on the campaign while we still can.

-Michael the OnlineDM

Lords of Waterdeep, and a break to build MapTool macros

I don’t usually go multiple weeks without a post here on Online Dungeon Master, so I thought I’d give my loyal fans an update.

I’ve been traveling for work a lot in the past  couple of weeks, which certainly interferes with blogging time. However, I HAVE been using the time for D&D stuff – specifically MapTool work. You may recall that I had built and shared some macros for quickly creating monster powers a few weeks ago. Well, I’ve been working on the same thing for PC powers in D&D 4e. It’s been tremendously time consuming to build the macros, but actually using them has been fast! (Aside from bug killing, that is.)

Three of the players in my long-running Friday night War of the Burning Sky campaign created new characters for last week’s game (one new player, two existing players switching to new characters), so I had the chance to put my new PC power creation macros through their paces. I’m pleased to say that they worked like a charm! No problems at all so far, and the ability to recharge a power with a button click has been awesome.

The next step is to add a character sheet frame, similar to what I’ve done for Marvel Heroic RPG. I’d love for my D&D players to be able to scroll through their powers in a custom frame rather than the buttons in the Selection window. I could include the rules text of the powers in a small font, links to recharge powers individually, some nice-looking tables for organization purposes, and so on. But for now I still have a little tweaking to do on the PC power creation, though I hope to start sharing pieces of it soon. It’s a complicated family of macros, and I have not yet figured out how to break it into blog-post-sized chunks.

I haven’t run Madness at Gardmore Abbey in the past few weeks, which is a bit of a bummer. I finally have that whole campaign prepped in MapTool, so I’m ready to go at a moment’s notice! But the timing hasn’t worked out with my players.

I was going to try to revive my ZEITGEIST campaign for today’s gaming session, but two players had to bow out at the last moment. The day wasn’t a total loss, though, since the rest of us used the time to play three games of Lords of Waterdeep!

I’ve played a total of five games of Lords of Waterdeep now, and I absolutely love it even though I haven’t won yet. LoW feels like a streamlined fantasy setting of Agricola, another game that I absolutely love. We haven’t discovered a “dominant strategy” yet, which is a good thing. I love the design of the box itself – there’s a great insert to organize all of the pieces. The rulebook is excellent, too – very clear, with a handy summary of the rules on the back cover. It’s tons of fun, and everyone who has played it so far has loved it. I highly recommend Lords of Waterdeep.

I’m going to be out of town on vacation starting next weekend, so I hope to get another post or two up before I go. But if not, don’t expect to see anything from me until late April.

-Michael the OnlineDM

Madness at Gardmore Abbey – MapTool campaign file

At long last, I have finished putting together my complete MapTool campaign file for the Madness at Gardmore Abbey adventure. Huzzah! You can download it right here.

I’m pretty sure this is the largest MapTool campaign file I’ve built to date (around 33 MB), and I’m quite happy with it. It has all of the maps, all of the monsters, all of the Deck of Many Things tokens, all of the traps. I’ve got a template token for PCs and a template token for monsters.

The campaign file consists of eight maps with encounters from the adventure, plus a ninth map that’s a holding pen for NPCs, the Deck tokens and some background stuff for the campaign (library token, templates). The maps are labeled according to the encounter numbers that are included on the map. For instance, the map named 01-04 Village has the encounter maps that take place in the outer part of Gardmore Village (Encounter 1: Main Gate; Encounter 3: Double Talk; Encounter 4: Ruined Garrison; plus the overland map of the abbey and the map of Winterhaven).

Because of the number of maps that are in this adventure, I’ve included Wolph42’s Bag of Tricks macros – specifically the Teleport Pads. To use these, you’ll need to click the “Back of Tricks Macros” button in the Campaign pane and then the Initialize Pads button. Once you’ve done that, you can drag tokens around the various maps by dragging them to the teleport pad corresponding to the map where you want them to go. The 01-04 Village map has the portals to every other map.

I hope that folks find this campaign file to be useful. I know that I’ve had a lot of fun with Madness at Gardmore Abbey so far, and I’m looking forward to running the rest of the adventure!

– Michael the OnlineDM

Madness at Gardmore Abbey: Session Five

Past sessions: Session OneSession TwoSession Three, Session Four

After a six-week break, I was finally able to gather again via MapTool with my wife, her brother, and his wife for our continuing adventure in Gardmore Abbey. At this point I pretty much have the entire adventure prepared in MapTool (still a few wrinkles to work on before it’s done, though), so I’m ready for unexpected twists.

As always, SPOILERS AHEAD.

The party’s current quest is to help Sir Oakley, paladin of Bahamut and scion of Gardmore Abbey, to recover three relics he needs in order to purify the main Temple of Bahamut in the abbey. Sora the dragonbornn swordmage, Homer the elf hunter and Stasi the half-elf warpriest are currently with Sir Oakley in the catacombs beneath the abbey.

At the end of the last session, they had finished a difficult battle against undead monstrosities and had found a magic fountain of Bahamut that granted some necrotic resistance. Some of them were talking about an extended rest, but they really weren’t ready for that yet (not enough adventuring). As they stood by the Font of Divine Health discussing their plans, they heard some footsteps from the stairs leading up to the Temple.

Homer crept over to the nearby door and tried to peer through the keyhole (sure, let’s say there’s a keyhole). His perception roll was terrible, though, so he could only tell that there were some humanoid-shaped creatures (more than two), that they were talking (but he couldn’t make out the language, let alone what they were saying) and that they were carrying a light source (but he couldn’t tell what it was). He decided to head around to the Memorial Chamber to spy from there, but he wasn’t very stealthy about it. As he got into the Memorial Chamber, he heard footsteps hurrying back up the stairs and saw the light around the corner getting dimmer.

The rest of the party came over to join Homer and they decided not to pursue the other people.

Though I didn’t tell them this, they had just had their first encounter with the rival adventuring party. I was supposed to have made it so that the Altar of Glory had already been cleared out by the other party when our heroes arrived, but I forgot. So instead I decided to have them come down, find the Altar of Glory already cleared by our heroes, and then skedaddle when the heroes detected them. It worked out really well.

After this, the group pressed on to a large chamber in which they could hear something heavy dragging along the floor in the darkness.

Encounter 27: Great Hall

Vadin Cartwright

Since they weren’t particularly stealthy in entering this chamber, Vadin Cartwright called out in a cold voice, “Ah, we have visitors. Get them, friends!” This was the first Villain encounter, where a bad guy was drawing cards from the Deck of Many Things. Vadin drew the Knight, which gave him a flanking buddy. I ruled that he could use a move action to move the Knight, who would otherwise have been useless since Vadin was so far from the action.

The basilisk was the first problem. Sir Oakley, Sora and Stasi were clustered together, ripe for the basislisk’s venomous gaze. Some vampire minions soon closed to melee and started grabbing PCs left and right. Homer did his traditional chicken impression, staying out of the room and shooting from the hallway. Vadin Cartwright himself waited until the end of the second round to make his move, coming in with a terrifying howl that stunned the three melee characters.

Since stunned can be such an un-fun condition, I house rule it a little differently at my table:

OnlineDM’s house rule for stunned: A character who is stunned is dazed and cannot attack.

I’ve experimented in the past with saying that a stunned character can’t take standard actions, but if someone wants to make a heal check or take second wind or total defense as their entire turn, I’m fine with that.

In this case, Stasi used her one action to grant Sir Oakley a saving throw and then made her own saving throw at the end of her turn, so the team was back in the game quickly. Vadin was a tough opponent to hit; I ended up lowering his AC from 26 to 24 (de-soldierifying him) just because I saw that this encounter could get grindy otherwise. I also left the Snaketongue Vampire out of the fight since we had only three PCs plus Oakley (who is a full participant in combat).

Vadin drew the Donjon card when he was down to two-thirds of his starting hit points. The villain effect on this card gives adjacent enemies a -2 penalty to attack rolls, which is exactly the kind of ability I hate. Anything that results in missed attacks slows the game down. So, I changed it to an aura that gave enemies vulnerable 2 to all damage. When the Sun card was drawn later, I had the same problem; as written, it gives the villain concealment, which would be another -2 to hit. I switched this to a fiery halo that dealt 5 fire damage to the first PC to hit Vadin in melee (which, combined with the vulnerability, was painful and fun).

During the battle, Homer eventually dashed over to the niche in the wall where Vadin was keeping a vial of a strange red liquid. This vial was glowing, and Homer couldn’t resist picking it up and taunting Vadin with it. This definitely got Vadin’s attention, which was a good thing since Oakley was unconscious and on two failed death saves and Stasi the healer had just joined him on the ground. My brother in law asked if Homer could still shoot his bow while holding the stopperless vial, and I said sure. He carefully lined up his shot and critically hit Vadin! But some of the goop in the vial crept out and onto his bow hand; that’s some bad news right there.

Once Vadin had turned his attention to Homer, Sora was able to perform first aid on Sir Oakley, letting him spend his second wind, and he then healed Stasi. With all four characters back in action, they were able to take Vadin down. Oakley had no surges left; Sora had two, I believe. It was an exhausting series of fights for the party, but they had acquired three more cards from the Deck of Many Things from Vadin. They also found a magic sword and some money in a compartment in the room. The sword is called Moonbane and is an ancestral item from the Markelhay family that currently rules Fallcrest. I decided to make it a +3 sword since it would otherwise be pretty unexciting (as written, it’s +2). Sora was happy to wield it. This also switches her from a broadsword to a longsword, so she should hit more often now.

The group then spent the rest of their day holed up in the secret chamber in the catacombs, with Stasi tending to Homer. The red liquid had left Homer infected with unpleasant boils up his left arm, and he lost a healing surge. Stasi’s healing skill wasn’t very useful for Homer, but at least he didn’t get any worse. After an extended rest in the chamber, Homer woke up feeling better (a good endurance check), and the disease was cured – although he carries the scars still.

Red goop diaries

Next question: What to do about the red liquid? Vadin had raved about Tharizdun, the Chained God, and the substance definitely seemed evil. Homer and Stasi decided to pour some holy water from the Font of Divine Health in the next room into the vial to see what would happen. What happened was that the water started bubbling over, and Homer threw the vial against the far wall. The red goo seemed to have emerged mostly unscathed, and it started creeping up the wall. Sora scooped it up in a bottle that previously held a healing potion, and stoppered the thing shut.

After some discussion, the group decided to tie the bottle to a rock, unstopper it and drop it in the fountain. The font started frothing over and turning a bit pinkish for a minute or two before calming down. The magical energy from the fountain has dissipated, but the overwhelming evil of the red stuff doesn’t feel strong any more.

From here, the adventurers explored the easternmost chamber of this floor They opened a door to reveal – a curtain of dragon scales obscuring the next room! But beyond that lay more sarcophagi – and undead monsters.

Encounter 26: Dragonslayers’ Tomb

A couple of ghasts emerged from the darkness, followed by a wraith surrounded by swirling winds (a vortex wraith). The curtain of dragon scales blocked Homer’s shot into the room, so Sora yanked it to the ground. The vortex wraith started off being dazed thanks to Homer’s disruptive shot, so I ruled that its aura wasn’t working at first. Once it started up, though, its automatic damage and pulling of PCs toward the wraith had a major effect on the battle. Fortunately Stasi and Sir Oakley were doing their best to keep dealing radiant damage, and Sora’s Moonbane sword was ignoring the wraith’s insubstantiality.

Meanwhile, a regular non-vortex wraith had phased through a wall to come after Homer in the hallway. He pulled out the Sun card and managed to activate it to give himself some concealment, but the wraith’s invisibility every time it got hit made it a tough fight.

Things only got worse when a second vortex wraith joined the battle in the third round. Sir Oakley finished off the first one, which promptly exploded, sending the party flying all over the place. The one remaining vortex wraith focused on Sora, bringing the dragonborn to the ground briefly before she was rescued by Stasi and the wraith was at last destroyed.

Once all of the monsters were dealt with, the explorers discovered one of the relics Sir Oakley had been seeking – the Bowl of Io’s Blood. Huzzah! A great victory was shared by all.

I’m still having a ton of fun with this adventure. Ad-libbing the reaction of the red goo to the holy water was lots of fun, and I plan to have Homer’s scars from the disease come into play in the future. The mystery of the other people investigating the catacombs has worked out beautifully. And with five cards in their possession, the group is much more interested in and aware of the Deck of Many Things and its power. Now that I have almost everything prepped in MapTool, I’m ready for whatever they want to do next.

– Michael the OnlineDM

MapTool – Creating monster power macros with a macro

Strap in, macro lovers – you’re in for quite a ride!

As I mentioned in my last post, I’ve wanted for a while to create monster power macros using another macro. I’d like to be able to click an “Add Power” button, specify the details of the attack, and see a new button for that attack get created. And now, at long last, I’ve done exactly that.

It’s not a simple macro, to be sure. But I think it’s quite slick. Read on, if you dare! And note that you can download the macro here. My current D&D 4e campaign framework is available here.

First, some new properties

As I was going through this process, I realized that I would need to update my monster properties to better handle the tracking of encounter and recharge powers. I previously handled this with properties E1 through E7, which begin with a value of 1 and then get set to 0 once the encounter power is used, after which it can’t be used again. I did similarly with R1 through R5 for recharge powers.

Since my new macro is going to be creating encounter powers, it needs to know which encounter power slots are already taken. The cleanest way to do this was with pairs of JSON arrays as properties.

EncounterPowersCharged:'[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]’
EncounterPowersDeclared:'[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]’
RechargePowersCharged:'[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]’
RechargePowersDeclared:'[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]’

These are ten-item arrays, allowing for ten separate encounter powers and ten separate recharge powers. When I assign a new encounter power to one of the slots, I change the appropriate slot in the EncounterPowersDeclared array to 1. When that power is used up, it changes the appropriate slot in the EncounterPowersCharged array to 0, preventing it from being used again. And so on for recharge powers.

More on this later.

Macro structure

This macro has three main sections.

– There’s the first input box, where I ask for the name of the power, what range it targets, whether it’s standard or minor or whatever, what order I want the power to appear in, the usage (at-will, encounter, recharge), how many targets it has, whether it requires an attack roll and/or damage roll, and whether there are various other lines of text in the power (a Requirement line, a miss effect, etc.).

– There’s a second input box, where I ask about extra bonuses to the attack roll, what level of damage is being dealt, and what should appear in the various lines of text of the power.

– There’s the actual construction of the macro command text, which gets rather complicated.

First input box

I’ll present the code as a big dump, then explain it.

[h: listActionTypes = “2. Traits, 3. Standard Actions, 4. Move Actions, 5. Minor Actions, 6. Triggered Actions”]
[h: listDamageLevel = “Minion, Very Low, Low, Normal, High, Very High, Extreme”]
[h: listUsage = “At-Will, Recharge, Encounter, Not Applicable”]
[h: x = input(
“MacroName | NewPower| Power Name || WIDTH=20”,
“TargetRange | (M1) | Targets-Aura-Etc || WIDTH=10”,
“ActionType | ” + listActionTypes + ” | Action Type | LIST | VALUE=STRING SELECT=1″,
“SortOrder | 1 | Sort order || WIDTH=2”,
“Usage | ” + listUsage + ” | Usage | LIST | VALUE=STRING SELECT=0″,
“NumberOfTargets | Single-Target, Multi-Target, No Targets | Number of Targets | LIST | VALUE=STRING SELECT=0”,
“AttackRollRequired | 1 | Attack roll? | CHECK | “,
“DamageRollRequired | 1 | Damage roll? | CHECK | “,
“RequirementIncluded | 0 | Requirement line? | CHECK | “,
“PreAttackEffectIncluded | 0 | Pre-attack effect? | CHECK | “,
“MissEffectIncluded | 0 | Miss effect? | CHECK | “,
“AftereffectIncluded | 0 | After-save effect? | CHECK | “,
“PostAttackEffectIncluded | 0 | Post-attack effect? | CHECK | “,
“SpecialEffectIncluded | 0 | Special effect? | CHECK | ”
)]
[h: abort(x)]

The first three lines just set up some string lists that the user will be able to choose from for action type, damage level and usage. Then I have a big input box where I ask the user to make some choices. It’s probably easiest to just look at it in action:

The user is invited to type in the name of the power and any information about its range (such as M1 for melee 1 or AB1 in 10 for area burst 1 within 10 squares). A drop-down lets you pick whether it’s standard, minor, etc. The sort order only matters if you have multiple powers of the same action type – which standard action do you want first, then second, etc. The targets are either Single-Target, Multi-Target or No Targets. Then we have a series of check boxes that ask whether different possible parts of a power are present in this power. Note that the default options assume an attack roll and a damage roll and nothing else, but that’s all easy to edit with a click.

Second input box

[h: DefenseTargeted=’AC’]
[h: Enhancement=0]
[h: DamageLevel=”Normal”]
[h: DefaultDamageLevel=3]

Here I set up a few default values. These are useful in case I’ve said in the first input box that the power has no attack roll, in which case I won’t be picking a defense to target or a possible enhancement for critical rolls. That can be a problem later in the macro, so I need some defaults.

The DefaultDamageLevel is a variable that determines where the starting position in the damage drop-down will be. Position 3 is “Normal”. But in certain cases I want to default to things other than “Normal”:

[h, if(getProperty(“Role”)==”Brute”): DefaultDamageLevel=DefaultDamageLevel+1]
[h, if(Usage==”Recharge”): DefaultDamageLevel=DefaultDamageLevel+1]
[h, if(Usage==”Encounter”): DefaultDamageLevel=DefaultDamageLevel+2]
[h, if(NumberOfTargets==”Multi-Target”): DefaultDamageLevel=DefaultDamageLevel-1]
[h, if(getProperty(“SubType”)==”Minion”): DefaultDamageLevel=0]

Brutes deal more damage than other creatures. Recharge powers should do a bit more damage than normal, other things being equal. Encounter powers should do more still. Now, if the attack hits multiple targets, that should bring the damage down a bit. And of course if we’re building a power for a minion, we should use fixed minion damage.

Okay, now things start getting complicated.

[h: RechargeTargetInputString=if(Usage==”Recharge”,encode(“RechargeTarget | 2, 3, 4, 5, 6 | Recharge Target | LIST | VALUE=STRING SELECT=3″),””)]

What’s going on here? Well, I’m getting ready to build another input box. I want to be slick with this one, so it’s only going to ask the user for information that’s relevant. This means that if I’m building a recharge power, I want to ask for a recharge target number, but if I’m building an at-will or encounter power I don’t want to bother asking for a recharge number.

So, I create a string that will show up in the next input() command for the recharge target line. If I am building a recharge power, the string will be encoded to ask for a variable called RechargeTarget, which could range from 2 to 6. It will ask the user for a Recharge Target value in a drop-down list and save the choice as a string. The default selected in the drop-down will be at index 3 of the list which, because MapTool starts counting at 0, is actually the fourth item – which is the number 5, the most common recharge target.

However, if I’m NOT building a recharge power (Usage is anything other than Recharge) then instead of encoding this big string, I just set RechargeTargetInputString equal to “” – a blank string.

I then do similar things for lots of other possible inputs.

[h: DamageRollInputString=if(DamageRollRequired==1,encode(“DamageLevel | ” + listDamageLevel + ” | Damage Level | LIST | VALUE=STRING SELECT=” + DefaultDamageLevel),””)]
[h: EnhancementInputString=if(DamageRollRequired==1,encode(“Enhancement | 0 | Extra damage on crit? | CHECK | “),””)]
[h: ExtraAttackBonusInputString=if(AttackRollRequired==1,encode(“ExtraAttackBonus | 0 | Extra attack bonus | | WIDTH=2″),””)]
[h: JustEffectInputString=if(AttackRollRequired==0,encode(“JustEffect | . | Effect line | | WIDTH=50″),””)]
[h: DefenseInputString=if(AttackRollRequired==1,encode(“DefenseTargeted | AC, Fortitude, Reflex, Will | Defense targeted | LIST | VALUE=STRING SELECT=0″),””)]
[h: HitStringInputString=if(AttackRollRequired==1&&DamageRollRequired==1,encode(“HitStringWithDamage | damage | Hit line after damage roll | | WIDTH=50”),if(AttackRollRequired==1&&DamageRollRequired==0,encode(“HitStringNoDamage | . | Hit line | | WIDTH=50”),if(AttackRollRequired==0&&DamageRollRequired==1,encode(“EffectStringNoAttack | damage | Effect line after damage roll | | WIDTH=50″),””)))]
[h: RequirementInputString=if(RequirementIncluded==1,encode(“Requirement | . | Requirement | | WIDTH=50″),””)]
[h: TriggerInputString=if(ActionType==”6. Triggered Actions”,encode(“Trigger | . | Trigger | | WIDTH=50″),””)]
[h: PreAttackEffectInputString=if(PreAttackEffectIncluded==1,encode(“PreAttackEffect | . | Pre-Attack Effect | | WIDTH=50″),””)]
[h: MissEffectInputString=if(MissEffectIncluded==1,encode(“MissEffect | . | Miss Effect | | WIDTH=50″),””)]
[h: AftereffectInputString=if(AftereffectIncluded==1,encode(“Aftereffect | . | Aftereffect | | WIDTH=50″),””)]
[h: PostAttackEffectInputString=if(PostAttackEffectIncluded==1,encode(“PostAttackEffect | . | Post-attack effect | | WIDTH=50″),””)]
[h: SpecialEffectInputString=if(SpecialEffectIncluded==1,encode(“SpecialEffect | . | Special Effect | | WIDTH=50″),””)]

All of these things could be suppressed if the power in question doesn’t need them. I’ve tried to present them as intuitively as possible. I only ask for the damage level if there’s a damage roll (and the default selection was set up above). I ask if this power should have a little extra on the attack roll (like for a ranged artillery attack). If this power is just an effect (no attack, no damage – like a trait), then I ask for that. And so on.

Now it’s time to actually generate the input box that will ask for this stuff:

[h: x = input(
decode(RechargeTargetInputString),
decode(RequirementInputString),
decode(TriggerInputString),
decode(PreAttackEffectInputString),
decode(ExtraAttackBonusInputString),
decode(DefenseInputString),
decode(DamageRollInputString),
decode(EnhancementInputString),
decode(HitStringInputString),
decode(MissEffectInputString),
decode(AftereffectInputString),
decode(PostAttackEffectInputString),
decode(SpecialEffectInputString),
decode(JustEffectInputString)
)]
[h: abort(x)]

Yep – it’s all just a bunch of decoding of the stuff above. If the conditions are right, there will be an item in the input box. If not, the item will be skipped. For instance:

This is what I get if I pick a triggered recharge power with all of the check boxes checked. Conversely:

This is what I get if I choose the default options (single target at-will power with an attack and damage roll). And for the extreme simplicity case:

This is what I get if I pick a power with no targets, no attack roll, no damage roll and no boxes checked. It’s a pure text power – just an effect. Most move actions and traits will be this way, for instance.

Building the macro command

At this point, we have a lot of input from the user saved as variables. Now it’s time to use those variables and turn it all into command text for our new macro.

[h, switch(DamageLevel), code:
case “Minion”: {
[h: NumDice=0]
[h: DieSize=”MinionDamage”]
[h: DamageBonus=”MinionDamage”]
[h: Enh=1]
[h: CritDamageDie=”MinionDamage”]
};
case “Very Low”: {
[h: NumDice=”NumDice50″]
[h: DieSize=”DamageDie50″]
[h: DamageBonus=”DamageBonus50″]
[h: Enh=Enhancement]
[h: CritDamageDie=”DamageDie50″]
};
case “Low”: {
[h: NumDice=”NumDice75″]
[h: DieSize=”DamageDie75″]
[h: DamageBonus=”DamageBonus75″]
[h: Enh=Enhancement]
[h: CritDamageDie=”DamageDie75″]
};
case “Normal”: {
[h: NumDice=”NumDice100″]
[h: DieSize=”DamageDie100″]
[h: DamageBonus=”DamageBonus100″]
[h: Enh=Enhancement]
[h: CritDamageDie=”DamageDie100″]
};
case “High”: {
[h: NumDice=”NumDice125″]
[h: DieSize=”DamageDie125″]
[h: DamageBonus=”DamageBonus125″]
[h: Enh=Enhancement]
[h: CritDamageDie=”DamageDie125″]
};
case “Very High”: {
[h: NumDice=”NumDice150″]
[h: DieSize=”DamageDie150″]
[h: DamageBonus=”DamageBonus150″]
[h: Enh=Enhancement*2]
[h: CritDamageDie=”DamageDie150″]
};
case “Extreme”: {
[h: NumDice=”NumDice175″]
[h: DieSize=”DamageDie175″]
[h: DamageBonus=”DamageBonus175″]
[h: Enh=Enhancement*2]
[h: CritDamageDie=”DamageDie175″]
}
]

This rather inelegant piece of code does something simple in the end. It takes the indication of the damage level (from Minion to Very Low all the way up to Extreme) and sets some text variables that will show up in the final macro. I have properties in my campaign for number of dice, damage die size and damage bonus that are derived from a monster’s level. I also have tweaks from the 100% “normal” damage expressions to have 50% versions, 75%, 125%, 150% and 175%. That’s all I’m doing here – getting ready to tell the final macro what damage level to pull from the monster’s properties.

[h: AttackBonus=if(DefenseTargeted==’AC’,’DefaultAttackBonusVsAC’,’DefaultAttackBonusVsNAD’)]

This is a simple one. I have two monster properties for attack bonuses: One versus AC and one versus non-AC defenses (which is two points lower). I’m just telling the macro which one to use.

[h: MyCommand=””]
[h: MyCommand=MyCommand+encode(“<b>” + MacroName + “</b> ” + TargetRange + “<br>\\n”)]

As you saw in my last post, this is the way I build the “command” property that I’m setting for the new macro. I’m just adding the name and range at this point. The \\n at the end enters a new line (carriage return) in the macro itself, not in the output.

[h, if(RequirementIncluded==1): MyCommand=MyCommand+encode(“<i>Requirement:</i> “+Requirement+”<br>\\n”)]
[h, if(ActionType==”6. Triggered Actions”): MyCommand=MyCommand+encode(“<i>Trigger:</i> “+Trigger+”<br>\\n”)]
[h, if(PreAttackEffectIncluded==1): MyCommand=MyCommand+encode(“<i>Effect:</i> “+PreAttackEffect+”<br>\\n”)]

Here I add lines for Requirement, Trigger and Effect before the attack in the case that those exist for this power.

[h, if(AttackRollRequired==1), CODE: {
[h: MyCommand=MyCommand+encode(“[h: AttackBonus=” + AttackBonus + ” + ” + ExtraAttackBonus + “]\\n”)]
[h: MyCommand=MyCommand+encode(“[h: Defense='”+DefenseTargeted+”‘]\\n”)]
[h: MyCommand=MyCommand+encode(“[h: d20roll=d20]\\n”)]
[h: MyCommand=MyCommand+encode(“[h: Enh=”+Enh+”]\\n”)]
[h: MyCommand=MyCommand+encode(“[h: CritDamageDie=”+CritDamageDie+”]\\n\\n”)]
[h: MyCommand=MyCommand+encode(“[h, if(CritDamageDie > 0), CODE:\\n { [CritBonus=roll(Enh,CritDamageDie)] }; \\n { [CritBonus=0] }\\n ]\\n\\n”)]
[h: MyCommand=MyCommand+encode(“[h: AttackRoll=d20roll+AttackBonus]\\n”)]
}
]

These lines are only added to the macro if there’s an attack roll. The macro will have the attack bonus, the defense targeted, the result of a d20 roll, etc.

[h, if(DamageRollRequired==1), CODE: {
[h: MyCommand=MyCommand+encode(“[h: DamageString='”+HitStringWithDamage+”‘]\\n”)]
[h: MyCommand=MyCommand+encode(“[h: NumDice=”+NumDice+”]\\n”)]
[h: MyCommand=MyCommand+encode(“[h: DamageDie=”+DieSize+”]\\n”)]
[h: MyCommand=MyCommand+encode(“[h: DamageBonus=”+DamageBonus+”]\\n\\n”)]
[h: MyCommand=MyCommand+encode(“[h: DamageRoll=roll(NumDice,DamageDie)]\\n”)]
[h: MyCommand=MyCommand+encode(“[h: NumDice=”+NumDice+”]\\n”)]
[h: MyCommand=MyCommand+encode(“[h: MaxDamage=NumDice*DamageDie+DamageBonus+CritBonus]\\n”)]
[h: MyCommand=MyCommand+encode(“[h: RegularDamage=DamageRoll+DamageBonus]\\n\\n”)]
}
]

These lines only show up if there’s a damage roll. Pretty standard stuff.

[h, if(NumberOfTargets==”Single-Target” && AttackRollRequired==1), CODE: {
[h: MyCommand=MyCommand+encode(“<i>Attack:</i> [d20roll] + [AttackBonus] = <b>[AttackRoll]</b> versus [Defense]<br>\\n”)]
[h, if(DamageRollRequired==1), CODE: {
[h: MyCommand=MyCommand+encode(“[if(d20roll==20), CODE:\\n”)]
[h: MyCommand=MyCommand+encode(” {<font color=red>–CRITICAL HIT–</font><br>\\n”)]
[h: MyCommand=MyCommand+encode(” <i>Hit:</i> [NumDice*DamageDie] ([NumDice]d[DamageDie]) + [DamageBonus] + [CritBonus] = <b>[MaxDamage]</b> [DamageString]<br>\\n”)]
[h: MyCommand=MyCommand+encode(” };\\n”)]
[h: MyCommand=MyCommand+encode(” {<i>Hit:</i> [DamageRoll] ([NumDice]d[DamageDie]) + [DamageBonus] = <b>[RegularDamage]</b> [DamageString]<br>}\\n”)]
[h: MyCommand=MyCommand+encode(“]\\n”)]
};
{[h: MyCommand=MyCommand+encode(“<i>Hit:</i> “+HitStringNoDamage+”\\n”)]
}
]
};{}
]

And now we have the “punch line” part of the code for the single-target attack case. This part of the code displays the result of the attack and damage rolls in the chat window.

[h, if(NumberOfTargets==”Multi-Target” && AttackRollRequired==1), CODE: {
[h: MyCommand=MyCommand+encode(“[h: x=input(‘NumberOfTargets|0|Number of targets’)]\\n”)]
[h: MyCommand=MyCommand+encode(“[h: abort(x)]\\n\\n”)]
[h: MyCommand=MyCommand+encode(“Attacking [NumberOfTargets] [if(NumberOfTargets==1,’target’,’targets’)].<br>\\n”)]
[h: MyCommand=MyCommand+encode(“[count(NumberOfTargets,'<br>’), CODE: {\\n”)]
[h: MyCommand=MyCommand+encode(” [h: d20roll=d20]\\n”)]
[h: MyCommand=MyCommand+encode(” [h: AttackRoll=d20roll+AttackBonus]\\n”)]
[h: MyCommand=MyCommand+encode(” <i>Target [r:roll.count+1]:</i> [d20roll] + [AttackBonus] = <b>[AttackRoll]</b> versus [Defense]\\n”)]
[h, if(DamageRollRequired==1), CODE: {
[h: MyCommand=MyCommand+encode(” [if(d20roll==20), CODE: {<font color=Red> –CRITICAL HIT–</font> [NumDice*DamageDie] ([NumDice]d[DamageDie]) + [DamageBonus] + [CritBonus] = <b>[MaxDamage]</b> [DamageString]};{} ]\\n”)]
[h: MyCommand=MyCommand+encode(” }\\n”)]
[h: MyCommand=MyCommand+encode(“]<br><br>\\n”)]
[h: MyCommand=MyCommand+encode(“<i>Hit:</i> [DamageRoll] ([NumDice]d[DamageDie]) + [DamageBonus] = <b>[RegularDamage]</b> [DamageString]<br>\\n”)]
};
{[h: MyCommand=MyCommand+encode(“<i>Hit:</i> “+HitStringNoDamage+”\\n”)]
}
]
}
]

Same thing, but for the multi-attack case.

[h, if(AttackRollRequired==0&&DamageRollRequired==1): MyCommand=MyCommand+encode(“<i>Hit:</i> [DamageRoll] ([NumDice]d[DamageDie]) + [DamageBonus] = <b>[RegularDamage]</b> [DamageString]<br>}\\n”)]

In the odd case where you have no attack roll but a damage roll (such as an auto-hit power that still rolls for damage), we need to display the appropriate string.

[h, if(MissEffectIncluded==1): MyCommand=MyCommand+encode(“<i>Miss:</i> “+MissEffect+”<br>\\n”)]
[h, if(AftereffectIncluded==1): MyCommand=MyCommand+encode(“<i>Aftereffect:</i> “+Aftereffect+”<br>\\n”)]
[h, if(PostAttackEffectIncluded==1): MyCommand=MyCommand+encode(“<i>Effect:</i> “+PostAttackEffect+”<br>\\n”)]
[h, if(SpecialEffectIncluded==1): MyCommand=MyCommand+encode(“<i>Special:</i> “+SpecialEffect+”<br>\\n”)]
[h, if(AttackRollRequired==0): MyCommand=MyCommand+encode(“<i>Effect:</i> “+JustEffect+”<br>\\n”)]

We now display the extra lines if they were included. Note that JustEffect is only displayed in the “no attack roll” case.

[h: FontColor=”green”]

Setting another default here; my at-will powers default to green,

[h, if(Usage==”Encounter”), CODE: {
[h: EncountersArray=getProperty(“EncounterPowersDeclared”)]
[h: FirstEmptyEncounter=-1]
[h, for(i, 9, -1, -1), CODE:
{[h: PowerCheck=json.get(EncountersArray,i)]
[h, if(PowerCheck==0): EncounterPowerNumber=i]
}
]
[h: FontColor=”red”]
[h: NewArray=json.set(EncountersArray, EncounterPowerNumber, 1)]
[h: setProperty(“EncounterPowersDeclared”, NewArray)]
[h: MyCommand=MyCommand+encode(“[h: PowerNumber=”+EncounterPowerNumber+”]\\n”)]
[h: MyCommand=MyCommand+encode(“[h: PowersCharged=getProperty(‘EncounterPowersCharged’)]\\n”)]
[h: MyCommand=MyCommand+encode(“[h: IsPowerAvailable=json.get(PowersCharged,PowerNumber)]\\n\\n”)]
[h: MyCommand=MyCommand+encode(“[h, if(IsPowerAvailable==0), CODE:\\n”)]
[h: MyCommand=MyCommand+encode(” {[assert(1==0,add(‘This power has already been expended.’),0)]};\\n”)]
[h: MyCommand=MyCommand+encode(” {[h: NewArray=json.set(PowersCharged,PowerNumber,0)]\\n”)]
[h: MyCommand=MyCommand+encode(” [h: setProperty(‘EncounterPowersCharged’, NewArray)]}]\\n”)]
[h: MyCommand=MyCommand+encode(“[h: setMacroProps(getMacroButtonIndex(), ‘color=darkgray’) ]”)]
}
]

All right, this is admittedly a complicated piece of code. I’m proud of it, but you’ll have to bear with me.

The first line sets up that we’re only doing the remaining lines for Encounter powers. We then fetch the EncounterPowersDeclared array that I described earlier. This is the one that starts off as ten zeroes.

We then start with the last element of the array (element nine, since MapTool starts counting from zero) and check to see if that last element is a zero. If so, we set EncounterPowerNumber equal to the element number (9).

We then repeat with the next-to-last element of the array (item 8) and check to see if IT is zero. If so, we overwrite EncounterPowerNumber with 8. We keep going through the first element in the array (item 0). Whatever the last non-zero element of the array is, that becomes our new EncounterPowerNumber. And you’ll note that the FOR loop goes to -1 because it doesn’t execute an iteration where the iterator equals the end point. Yeah, it’s weird.

From here, we set the font color of the macro button to red (for an encounter power) and then set the token’s EncounterPowersDeclared array to put a 1 instead of a 0 in this new macro’s spot in the array.

I finish by adding the appropriate new lines to the macro I’m creating. These check to see if the appropriate slot in the array still has the power charged. If so, it de-charges it and moves on. If not, it throws off an error message, saying that the power is already expended.

[h, if(Usage==”Recharge”), CODE: {
[h: RechargeArray=getProperty(“RechargePowersDeclared”)]
[h: FirstEmptyRecharge=-1]
[h, for(i, 9, -1, -1), CODE:
{[h: PowerCheck=json.get(RechargeArray,i)]
[h, if(PowerCheck==0): RechargePowerNumber=i]
}
]
[h: FontColor=”purple”]
[h: NewArray=json.set(RechargeArray, RechargePowerNumber, 1)]
[h: setProperty(“RechargePowersDeclared”, NewArray)]
[h: MyCommand=MyCommand+encode(“[h: RechargeTarget=”+RechargeTarget+”]\\n”)]
[h: MyCommand=MyCommand+encode(“[h: RechargeRoll=d6]\\n”)]
[h: MyCommand=MyCommand+encode(“[h: PowerNumber=”+RechargePowerNumber+”]\\n”)]
[h: MyCommand=MyCommand+encode(“[h: PowersCharged=getProperty(‘RechargePowersCharged’)]\\n”)]
[h: MyCommand=MyCommand+encode(“[h: IsPowerAvailable=json.get(PowersCharged,PowerNumber)]\\n\\n”)]
[h: MyCommand=MyCommand+encode(“[h, if(IsPowerAvailable==0 && RechargeRoll<RechargeTarget), CODE:\\n”)]
[h: MyCommand=MyCommand+encode(” {[g: assert(1==0,add(‘Recharge roll = ‘, RechargeRoll, ‘. The power fails to recharge.’),0)]};\\n”)]
[h: MyCommand=MyCommand+encode(” {[h: NewArray=json.set(PowersCharged,PowerNumber,0)]\\n”)]
[h: MyCommand=MyCommand+encode(” [h: setProperty(‘RechargePowersCharged’, NewArray)]}]\\n”)]
[h: MyCommand=MyCommand+encode(“[h: setMacroProps(getMacroButtonIndex(), ‘color=gray’) ]”)]
}
]

This is the same kind of thing, but for recharge powers. The button font is purple instead of red. And when it comes time in-macro to see if the power has been expended, there’s also a recharge roll made. If the roll succeeds, then the power proceeds.

[h, if(Usage==”Not Applicable”): FontColor=”black”]

If we’re talking about a trait rather than an at-will or encounter or recharge power, then the button text should be black.

[h: MacroProps='{“autoexecute”:1, “label”:”‘+MacroName+” “+TargetRange+'”, “group”:”‘+ActionType+'”, “sortBy”:’+SortOrder+’, “fontColor”:”‘+FontColor+'”, “command”:”‘+decode(MyCommand)+'”}’]
[h: createMacro(MacroProps)]

And at long last, we actually build the macro! We stick together the JSON object that contains all of the macro properties, including decoding the MyCommand string that we’ve been building for the past 150 lines of code, and we then create a macro with those properties!

Whew – I need a drink or something.

I’m happy to say that this thing works really, really well for me so far. I’m sure I’ll tweak it over time, but I’m excited about it.

Congratulations if you’ve made it this far!

– Michael the OnlineDM

Review of Heroes of the Elemental Chaos

I’m continuing my recent habit of D&D book reviews. I loved Heroes of the Feywild. I wasn’t all that crazy about Heroes of Shadow.

Heroes of the Elemental chaos comes in somewhere between those two for me. As I said on Twitter, “It’s… okay.”

Chapter 1: Into the Maelstrom

This is the all-fluff chapter, and I think it’s awesome for dungeon masters who want to involve adventures in the Elemental Chaos. We learn about the nature of elemental magic and how it relates to the power sources. We get a few brief write-ups of locations in the Chaos (City of Brass, Kaltenheim, etc.).

Then we get into elemental-touched races. For those players who were hoping to get more racial options in this book, this is where you get disappointed. We get some ideas for being elemental-origin dragonborn, drow, dwarves, genasi, half-orcs and orcs. Then a paragraph each on how other races might be elemental-touched. Good fluff if you’re going for that kind of character concept, but this is not a crunch section.

The meaty, most interesting part of this chapter (at least for me) is the second half that gets into stories of the primordials. I’m new to D&D as of Fourth Edition, and I haven’t read the Plane Below or Manual of the Planes. So, whenever I’ve seen references to “primordials” in other books I’ve never really known what they meant.

Now I do. I know who Yan-C-Bin and Imix and Ogremoch and friends are. I especially liked the massive table at the end of the chapter that documents all 74 “known primordials” including those from places like the Forgotten Realms and Dark Sun. Useful stuff, and great for inspiration for high-level baddies.

Chapter 2: Character Themes

I’ve only recently begun using themes in my game, specifically the setting-focused themes for my ZEITGESIT campaign. I love the potential for themes to tie characters to settings; I’m not as crazy about more generic themes like the ones we get here. Still, some of them are interesting.

We get ten themes. Four of them correspond to the basic elements (air, earth, fire, water) plus one for “elemental metal”. We get a monk-focused theme (Elemental Initiate), a demon theme (Demon Spawn), a general “from the chaos” theme (Moteborn), a Primordial Adept and a Janissary (servant of genies).

The pure elemental themes are fine if you just love the elements. I didn’t find them especially exciting, but they’re all right. The Ironwrought theme (elemental metal) just felt odd to me, but it’s a fine theme.

Demon Spawn can work if you want a character who struggles against a dark nature. Not my own cup of tea, but some people might enjoy it.

The coolest theme in my opinion is the Janissary. You’re a servant of genies, and the back story is well done. The mechanics mainly give you a bonus to charging, but the flavor has a lot of potential for character hooks.

Chapter 3: Classes

No brand-new classes here, but we get some new options and new builds.

The druid sees support for both the Sentinel Druid (a Living Zephyr companion for the Druid of the Wastes) and the pre-Essentials Druid (Primal Wrath aspect and new powers at all levels).

The monk gets two new monastic traditions: Desert Wind (flurry lets you shift a square and can give a target -2 to attack) and Eternal Tide (flurry has reach and pulls the target). We also get new powers at all levels – fire- and water-themed.

The sorcerer gets a whole new build – the Elementalist. This is what some might call the “Essentialized” sorcerer. It does not get daily powers, and its encounter powers are spelled out for it. You pick an element and get your choice of two at-wills tied to that element. This is a really good build for someone who just wants to blast things with magic. And it’s a pretty darn good striker, too!  If you go with fire, you have an at-will single target attack that deals 1d12+Cha+Con+1d6 fire damage at first level, and another at-will that deals 1d10+Cha+Con in an area burst 1 and creates a zone of fire.

The regular sorcerer also gets new utility power choices, but no attack powers.

Warlocks get a new pact option – the elemental pact. You randomly get a new elemental affinity after each rest, which affects the type of damage you deal with certain attacks. There’s also a new option for Hexblade Warlocks, an elemental pact, which comes with elemental allies to summon at random at level 9 and 25. The regular warlock does get new attack and utility powers, too.

The wizard gets a new build – the Sha’ir, which I believe is originally from the Al Qadim setting. It’s a lot like a regular wizard, except that it has a Gen Servant (basically a familiar) who goes and gets spells for it each day rather than pulling them from a spellbook. This gives the Sha’ir a lot of flexibility (the Gen can get any appropriate-level spell), and I like that the player is encouraged to think about their Gen Servant from a role playing perspective, too.

Sha’ir spells are available to other wizards, and the at-wills don’t deal any damage directly. Several of them are nods to spells from older editions, like Alter Self and Reverse Gravity. I especially like Crack the World at level 29.

Chapter 4 – Elemental Options

This is the “everything else” chapter. It starts with ten paragon paths; my favorite is the Prince of Genies, who has a Genie in a Bottle to help it out. This path also gives us Limited Wish as a utility power – and compared to what I understand of earlier editions, this is a very, very limited wish!

There are only two epic destinies – Emergent Primordial, in which a primordial is basically taking you over from within, and Lord of Chaos, which has so much potential but a REALLY disappointing level 26 and level 30 power. Jeremy Morgan of Stormin’ Da Castle and @TriskalJM on Twitter was similarly disappointed when we talked about this on the Tome Show (episode forthcoming), so he took a crack at rebuilding the Lord of Chaos epic destiny. I chimed in with some edits of my own, leading to this:

-Level 21: As written, for now, though I’d personally like something cooler than the enhanced magic weapon / armor / neck slot.

-Level 24: As written

-Level 26: Upgrade the created zones to hazardous terrain as an improved Whim of Creation:

-Level 30: An improved Master of Chaos feature:

Whenever you bloody an enemy or score a critical hit against an enemy, roll a d6.
– 1: You teleport to any location within 10 squares; if the destination square is occupied by another creature, that creature teleports to your former location.
– 2: You gain 20 temporary hit points.
– 3: The enemy immediately takes an at-will action of your choice.
– 4: You become invisible until the end of your next turn and may immediately make a Stealth check to become hidden.
– 5: One ally within 10 squares immediately takes an at-will action of your choice.
– 6: The enemy makes a saving throw. If the saving throw fails, the enemy dies. If it succeeds, the enemy is dazed until the end of your next turn.”

After the epic destinies, we get feats. Strangely, we get Tome Expertise even though the Sha’ir doesn’t use tomes. Also strangely, there are a couple of illustrations of tome-reading Sha’ir earlier in the book. Anyway, we get a Born of the Elements feat that mainly serves to open the door to a bunch of other elemental feats. The most interesting of these is the Elemental Companion, which is similar to a beast companion. As with the Gen Servant, elemental companions are encouraged to be played for role playing potential. Personally, I’d let someone take the Elemental Companion feat without first taking Born of the Elements if they wanted it.

Finally, we get some magic items. Demonskin Armor has a good marriage of flavor and mechanics (wearing the skin of a demon makes you more intimidating). We get one weapon per element. We get a few tomes, including the Demonomicon (yes, as a tome implement). There are primordial shards, which I’ll admit I still don’t really understand flavor-wise. And lastly, we get Elemental Gifts, which are similar to Divine Boons. My favorite is the Gift of Chaos, which has an interesting random effect once per day when you roll a 1 or 20 on an attack roll or saving throw; I’d personally have it happen EVERY time you roll a 1 or 20 on an attack roll or saving throw. Yay for chaos!

Closing thoughts

As I said, I fell that Heroes of the Elemental Chaos is… okay. It’s great for DMs and players who want some flavor for elemental campaigns and primordials. The class crunch is available in DDI, and the class fluff isn’t worth the price of admission by itself. I definitely enjoyed Heroes of the Feywild more; the Bard’s Tales from that book were more entertaining and flavorful to me than the Elemental Viewpoint sidebars that pepper this book, providing commentary from various elemental denizens.

It’s not a must-buy, but it’s not bad.

– Michael the OnlineDM