In Part I of the Vocola series, I demonstrated several syntax features useful for creating flexible macros: alternative words, optional words, and variables. In a couple of examples, we looked at spellcasting macros that, while effective, would be difficult to maintain. In this post, I’m going to show you my latest iteration of how I am able to manage my many different abilities with minimal effort.
The key to the system I recently settled upon is recognizing that you have 3 distinct types of abilities:
- Helpful, targeted spells such as Lifebloom or Rebirth
- Harmful, targeted spells such as Moonfire or Lunar Strike
- Non-targeted spells, either helpful or harmful, such as Tranquility or Starsurge
Helpful, Targeted Spells
Obviously, as a Restoration Druid, my very first priority was to ensure that I could heal. Most of these spells fall under the “helpful, targeted” category above, and my array of these abilities looks like this:
<targeted_help> := Bloom = Lifebloom | Rejuve = Rejuvenation | Heal = "Healing Touch" | Grow = Regrowth | Mend = Swiftmend | Wild Growth | Shield = Ironbark | Cure = "Nature's Cure" | [Star] Surge = "Star Surge" | Rebirth | Resurrect | Enervate = Innervate;
And the two commands that reference this array are written as:
<number> := 1..99; <targeted_help> <friend> = "/use [@$2] $1"{Enter}; <targeted_help> [<number>] = When($2, "/use [@party$2,help] $1", "/use [@mouseover,help][@target,help][@player] $1"){Enter};
The first command allows me to heal any “friend” whose name I declared within the <friend>
variable. The second command uses the When()
function to do one of two things:
- If a number is specified — ex. Bloom 2 — it will output the in-game macro “/use [party2] Lifebloom”.
- If no number is specified — ex. Bloom — it will output the in-game macro “/use [@mouseover,help][@target,help][@player] Lifebloom”.
This combination of commands and variables gives me a lot of flexibility, allowing me to mix name-based healing, healing based upon the numerical index of my party members (where the first party number is “1”, the second is “2”, and my character is not assigned an index), and standard mouseover => target => self healing. (I always, always, always use name-based healing when I have to heal Mr. Phae’s characters, in an effort to shame him into pulling less aggro.)
Harmful, Targeted Spells
For targeted, harmful spells, we need two variable arrays and one command:
<harm_target> := focus | "focus target" = focustarget | "mouse over" = mouseover | target | "assist target" = assisttarget; <targeted_harm> := [Star] Surge = Starsurge | [Lunar] Strike = "Lunar Strike" | Moonfire | Sunfire | Root = "Entangling Roots" | [Solar] Wrath = "Solar Wrath" | New Moon | Solar Beam | Vortex = "Ursol's Vortex" | Mass Root = "Mass Entanglement"; <targeted_harm> [<harm_target>] = When($2, "/use [@$2] $1", "/use [@target,harm,nodead][@focustarget,harm,nodead][@targettarget,harm,nodead][@target] $1"){Enter};
This command uses the When()
function to do one of two things:
- If a target is specified — ex. Moonfire focus target — it will output the in-game macro “/use [focustarget] Moonfire”.
- If no target is specified — ex. Moonfire — it will output the in-game macro “/use [@target,harm,nodead][@focustarget,harm,nodead][@targettarget,harm,nodead][@target] Moonfire”.
Non-Targeted Spells
Finally, for non-targeted spells — harmful or helpful — we need a single variable array and one command:
<nontargeted_spell> := Praise Elune = "Celestial Alignment" | Flourish | Tranquility | Star Fall = Starfall | Vortex = "Ursol's Vortex" | Bark Skin = Barkskin | Essence = Efflorescence | Shadow Meld = Shadowmeld | Dash | (Blink | Bamf) = "Displacer Beast" | Prowl | Revitalize | Flap; <nontargeted_spell> = "/use $1;"{Enter};
Include Statements and Multiple Characters
Most players play more than one character. And the needs of one character — in terms of spells, abilities, and items — are different and, in some cases, conflict with one another. I myself spent a good 20 minutes trying to figure out why saying “Wrath” was not casting Solar Wrath but instead Lifebloom. I had inadvertently created two different macros, one for my Warlock ([Shadow] Wrath) and one for my Druid ([Solar] Wrath) and it was triggering the Warlock keybind which, at the time, corresponded to my Druid’s Lifebloom keybind. Fortunately, Vocola lets us deal with this issue by using something called Include Statements.
Includes Statements allow us to embed the contents of one file within another file, like so:
# Character Declaration include phaelia.vch;
This has the effect of making all the commands and variable definitions I define in phaelia.vch (note the different file extension) available to wow-64.vcl. I have created separate include files for each of my characters. Each of these files contain a character-specific definition for <targeted_help>, <targeted_harm>, and <nontargeted_spell> variable arrays (the actual commands that use these variables are defined in my wow-64.vcl so I can manage them in one place). Since I only load one include file at a time, I don’t have to worry about one conflicting with another. I do, however, have to worry about forgetting to swap my include file when I change characters. To help with this, each character-specific include file also includes a voice command at the top for Who am I?. The output for each vary, but Phaelia’s is written as follows:
who am I = "/em throws her shoulders back and poses dramatically, declaring in a sonorous voice: Who am *I*, you ask? I am Arch Druid Phaelia, Guardian of Cenarius, Fey Dragon Rider, Singer of the Sacred Blessings of Elune, Lead Scribe of TheDreamgrove(.com)."{Enter};
And, of course, something more thematically appropriate for my Warlock, Morgause:
who am I = "/say Do you not know to whom you speak? You are in the presence of the Witch Queen Morgause, Betrayer of Gul'dan, Dark Rider of Shaitan, the Most Unclean, Slavemistress of Jubjub."{Enter};
This looks a little odd when the wrong character is loaded; you could instead direct a simple debugging type message to a channel shared by all of your characters, but that’s significantly less fun.
In a future post, I will be writing about how you can handle targeting in raids. (But first, I have to actually go to a raid, so I can test a few of my ideas.)
This is pretty cool. I have to admit, my eyes glaze over a little bit when looking at code and visions of fairies and dragons begin to trespass into my thinking.
I know what you mean. 🙂 Mr. Phae keeps joking that I need to create an alternate set of commands that are Harry-Potter-styled, i.e., something that sounds like this: http://www.pojo.com/harrypotter/spelist.shtml
Which, after a long adjustment period, would undoubtedly be amazingly immersive but wouldn’t be especially practical in a fast-paced group or raid environment!