Extending Vocola (More Commands)

One of the tricks to making the most out of voice dictation (and Vocola in particular, I think) is that you must be willing to continually improve upon the way you do things. The command you wrote three months ago and that has served you well since can likely be improved upon in response to a changing play style. This post explains three techniques I have recently introduced into my gameplay: using dynamically declared variables to heal your off-tank, issuing multiple commands at a time, and dragging and dropping.

Dynamic Variables

I have previously demonstrated how one can pre-define an array of values as an available variable for use in a macro, allowing you to write just one macro to handle all spells of a particular type (targeted, helpful; targeted, harmful; untargeted). This can be expanded further, however, by using the Variable Vocola extension:

This simple extension allows you to remember things between commands during the same session. For example, you could remember the current contents of the clipboard (obtained via Clipboard.Get()) for inserting later via a different command. By session, it is meant that all these variables are forgotten each time you exit Vocola or use the “load extensions” command.

For help installing Vocola extensions, click here.

As a Restoration Druid, one of the boons we bring to a raid is the ability to roll multiple heals over time on multiple tanks. The in-game UI includes a tanks-only UI frame which works great with mouseover healing, and it works well to set your focus to one of your raid’s tanks in conjunction with a focus-first heal macro like this one:

<targeted_help> := Bloom = Lifebloom | Rejuve = Rejuvenation | Jenn = Rejuvenation | Heal = "Healing Touch" | Grow = Regrowth;
<targeted_help> = "/use [@mouseover,help][@target,help][@focus,help][@player] $1"{Enter};

The above macro will preferentially heal your mouse over target, but — assuming one is not available (or that you are mousing over an enemy) — will automatically heal your target instead. If your target cannot be healed, it will then preferentially cast upon your focus. This allows you to easily run around while maintaining your instant-cast HoTs on at least one target since it frees your mouse (or head tracker, as the case may be) to be used to steer your character.

Of course, this doesn’t allow you to easily maintain heals on more than one individual (although you could certainly use a pre-defined array of raid members and refresh heals on the off-tank by referring to her by name). But by using the Variable extension previously mentioned, it’s possible to write a dynamic macro that will allow you to declare an off-tank variable at the start of any raid and use the declared alias to refer to her. With the Variable Vocola extension installed, you can use the following set of commands to store a character name (one already declared in your friends variable) as another aliased parameter (in this case, T2):

<friend> := Phae = Phaelia | Alex = Alexandriann | Nesbit | Rabidus;
<targeted_help> := Bloom = Lifebloom | Rejuve = Rejuvenation | Jenn = Rejuvenation | Heal = "Healing Touch" | Grow = Regrowth;
Set <friend> as Tank 2 = Variable.Set("Tank2", $1);
<targeted_help> T2 = "/use [@"Variable.Get("Tank2", "Phaelia")"] $1"{Enter};

In the above set of commands, I have defined a <friend> variable as a list of possible groupmates, aliasing those with longer names to save time. Likewise, I have defined an array of possible targeted heals. The set variable command expects a friend’s name to be supplied and stores that name with an in-memory alias of “Tank2.” (Note: this is not what I will use to refer to the variable when speaking.) Finally, I have written a macro which will first cast upon the individual whose name has been stored in memory, and assuming that variable has not yet been set this play session, will instead cast upon myself.

I feel like I have only scratched the surface in terms of what this technique might be used to accomplish, and I would welcome any suggestions from readers for what else this functionality might afford.

Issuing Multiple Commands

One feature of Vocola that I have not previously discussed is the ability to adjust the rate at which commands can be issued and subsequently interpreted. Out-of-the-box, Dragon NaturallySpeaking will only accept a single command at a time. This restriction makes voice dictation feel more restrictive than it otherwise would. However, Vocola allows you to adjust this threshold, at least for all commands stored together in a single file. In other words, you cannot chain commands together between your globally written commands (those defined for use throughout all applications) and the commands you have written specifically for, as an example, World of Warcraft. This is a minor limitation, however, one I have only rarely run into myself.

The benefit of this technique, in addition to an increased feeling of responsiveness, is that you don’t have to wait for your first command to be recognized before issuing a second. So you might issue the command, “Heal Mr. Phae”, subsequently remember that he forgot to wash the dishes, and immediately issue a “jump” command to interrupt your cast.

To adjust your command threshold, use the following command in your global commands file:

$set MaximumCommands 3;

You can instead set a command threshold by application by using the above command in an application-specific file.

Setting a higher threshold does introduce the possibility of Vocola misinterpreting, for example, two individual commands as a single command, assuming that both parts are themselves legitimately recognized commands. For example, I previously allowed the numbers 0-9 to be spoken aloud to press their corresponding buttons in game. However, I also previously healed in groups using the numbers 0-4. And a third command allows me to cast a heal without any additional parameters (thus defaulting to my mouseover target, my target, and my focus respectively). This caused a conflict when I increased my maximum command threshold beyond one, because Vocola could not be sure that when I said “heal 3” if I meant to cast my heal on [party3] or whether I wanted to cast the spell defined as “heal” using its default targeting order and then press the 3 button. For this reason, you may have to tweak existing commands so that those frequently used beside one another cannot be misunderstood or accidentally chained. In my case, I have switched to using letters for targeting in groups. This actually works well, since I display my groupmates’ health bars horizontally, in columns that correspond to the lettered columns I use for raid healing.

<friend> := A = Phaelia | Phae = Phaelia | Alex = Alexandriann | Nesbit | Rabidus;
<group_letter> := B = 1 | C = 2 | D = 3 | E = 4;
<targeted_help> <friend> = "/use [@$2] $1"{Enter};
<targeted_help> [<group_letter>] = When($2, "/use [@party$2,help] $1", "/use [@mouseover,help][@target,help][@focus,help][@player] $1"){Enter};
<targeted_help> <column_index> <row_index> = "/use [@raid"Eval(Eval(5*$2) + $3)"] $1"{Enter};

To avoid causing conflict between my group heal (“heal B”), my raid heal (“heal B4”), and my numerical command, I ended up scrapping the numerical command altogether. I only very rarely referred to abilities from my action bars by their numerical value anymore, since it’s much easier to refer to them by name or at least some variation thereof. The numbers 0-9 are too often used in macros to be used by themselves as a separate command.

Note that this will not allow you to exploit by “queuing” multiple commands. You are still subject to the same restrictions as other players since spells and abilities cannot fire simultaneously.

Dragging and Dropping

Out-of-the-box, Dragon NaturallySpeaking does not allow you to drag and drop (at least not easily — I suspect it’s possible using a mixture of awkward commands). Arhqirah of Drak’Thul (US) wrote in to ask how he might replicate this functionality:

I am also suffering for RSI, just ordered the SmartNav4: EG, I am happy that you let me know of this tool through your YouTube video. I want to start playing WoW again soon, so I have been practicing using Dragon, Vocola, Unimacro and Dragonfly.

How do you drag and drop with the SmartNav and voice commands? 🙂

Dragging and dropping is one of those features that I struggled to replicate, at least until I found the Vocola Keys extension. With it installed, I was able to write the following macro:

(start = hold | stop = release) drag = Keys.SendInput({LeftButton_$1});

In this case, you would say “Start Drag” and “Stop Drag.” Outside of WoW, it might be useful to further adopt these commands for easily copying and pasting, like so:

start copy = Keys.SendInput({LeftButton_hold});
stop copy = Keys.SendInput({LeftButton_release}){Ctrl+c};

4 thoughts on “Extending Vocola (More Commands)

    1. It *is* really hard to maneuver around pools of “death” in raids and the like. It has been a major hindrance in Mythic +7 and beyond. Nonetheless, I have been able to successfully complete most of Nighthold on Heroic, which admittedly may be more a testament to the astuteness to the healing cadre of my raid group than to my own ability!

  1. Oh gosh yes, I can imagine. I seem to recall you also wrote about those, was it boulders in, is it Black Rook Hold? Must be a pain to maneuver around.
    I know! I love visiting Memory Lane 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *