Revision: 338
Author: todd.chambery
Date: Sat Sep 26 05:45:25 2009
Log: jedit scripts for munging PHB data
http://code.google.com/p/charactermanager/source/detail?r=338
Added:
/trunk/charmgrjs/resources/D&D_Fixup.bsh
/trunk/charmgrjs/resources/Embolden.bsh
/trunk/charmgrjs/resources/Italicize.bsh
/trunk/charmgrjs/resources/Remove_newline_in_selection.bsh
/trunk/charmgrjs/resources/Table cell-ify.bsh
Modified:
/trunk/charmgrjs/edit.js
/trunk/charmgrjs/spells.js
=======================================
--- /dev/null
+++ /trunk/charmgrjs/resources/D&D_Fixup.bsh Sat Sep 26 05:45:25 2009
@@ -0,0 +1,67 @@
+// This is a recorded macro. First, check over the
+// commands to make sure this is what you intended. Then,
+// save this buffer, and the macro should appear in the
+// Macros menu.
+SearchAndReplace.setSearchString("[�|�|�]");
+SearchAndReplace.setReplaceString("\'");
+SearchAndReplace.setBeanShellReplace(false);
+SearchAndReplace.setIgnoreCase(false);
+SearchAndReplace.setRegexp(true);
+SearchAndReplace.setSearchFileSet(new CurrentBufferSet());
+SearchAndReplace.replaceAll(view);
+SearchAndReplace.setSearchString("�");
+SearchAndReplace.setReplaceString("-");
+SearchAndReplace.setBeanShellReplace(false);
+SearchAndReplace.setIgnoreCase(false);
+SearchAndReplace.setRegexp(true);
+SearchAndReplace.setSearchFileSet(new CurrentBufferSet());
+SearchAndReplace.replaceAll(view);
+SearchAndReplace.setSearchString("^(.*?):");
+SearchAndReplace.setReplaceString("<i>$1</i>:");
+SearchAndReplace.setBeanShellReplace(false);
+SearchAndReplace.setIgnoreCase(false);
+SearchAndReplace.setRegexp(true);
+SearchAndReplace.setSearchFileSet(new CurrentBufferSet());
+SearchAndReplace.replaceAll(view);
+SearchAndReplace.setSearchString("^");
+SearchAndReplace.setReplaceString("<p class=sub>");
+SearchAndReplace.setBeanShellReplace(false);
+SearchAndReplace.setIgnoreCase(false);
+SearchAndReplace.setRegexp(true);
+SearchAndReplace.setSearchFileSet(new CurrentBufferSet());
+SearchAndReplace.replaceAll(view);
+SearchAndReplace.setSearchString("\'");
+SearchAndReplace.setReplaceString("'");
+SearchAndReplace.setBeanShellReplace(false);
+SearchAndReplace.setIgnoreCase(false);
+SearchAndReplace.setRegexp(true);
+SearchAndReplace.setSearchFileSet(new CurrentBufferSet());
+SearchAndReplace.replaceAll(view);
+SearchAndReplace.setSearchString("\'");
+SearchAndReplace.setReplaceString("'");
+SearchAndReplace.setBeanShellReplace(false);
+SearchAndReplace.setIgnoreCase(false);
+SearchAndReplace.setRegexp(true);
+SearchAndReplace.setSearchFileSet(new CurrentBufferSet());
+SearchAndReplace.replaceAll(view);
+SearchAndReplace.setSearchString("�");
+SearchAndReplace.setReplaceString("x");
+SearchAndReplace.setBeanShellReplace(false);
+SearchAndReplace.setIgnoreCase(false);
+SearchAndReplace.setRegexp(true);
+SearchAndReplace.setSearchFileSet(new CurrentBufferSet());
+SearchAndReplace.replaceAll(view);
+SearchAndReplace.setSearchString("\\n");
+SearchAndReplace.setReplaceString("");
+SearchAndReplace.setBeanShellReplace(false);
+SearchAndReplace.setIgnoreCase(false);
+SearchAndReplace.setRegexp(true);
+SearchAndReplace.setSearchFileSet(new CurrentBufferSet());
+SearchAndReplace.replaceAll(view);
+SearchAndReplace.setSearchString(" ");
+SearchAndReplace.setReplaceString(" ");
+SearchAndReplace.setBeanShellReplace(false);
+SearchAndReplace.setIgnoreCase(false);
+SearchAndReplace.setRegexp(false);
+SearchAndReplace.setSearchFileSet(new CurrentBufferSet());
+SearchAndReplace.replaceAll(view);
=======================================
--- /dev/null
+++ /trunk/charmgrjs/resources/Embolden.bsh Sat Sep 26 05:45:25 2009
@@ -0,0 +1,60 @@
+/*
+ * Insert_Tag.bsh - a BeanShell macro script for the
+ * jEdit text editor - inserts opening and closing tags
+ * around selected text
+ * Copyright (C) 2001 John Gellene
+ *
jgel...@nyc.rr.com
+ *
http://community.jedit.org
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the jEdit program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
USA.
+ *
+ * $Id: Insert_Tag.bsh 4988 2004-03-08 04:29:12Z spestov $
+ */
+
+
+void italicize()
+{
+ caret = textArea.getCaretPosition();
+ text = textArea.getSelectedText();
+ if(text == null) text = "";
+ sb = new StringBuffer();
+ sb.append("<b>");
+ sb.append(text);
+ sb.append("</b>");
+ textArea.setSelectedText(sb.toString());
+ //if no selected text, put the caret between the tags
+ if(text.length() == 0)
+ textArea.setCaretPosition(caret + tag.length() + 2);
+}
+
+if(buffer.isReadOnly())
+ Macros.error(view, "Buffer is read-only.");
+else
+ italicize();
+
+/*
+ Macro index data (in DocBook format)
+
+<listitem>
+ <para><filename>Insert_Tag.bsh</filename></para>
+ <abstract><para>
+ Inserts a balanced pair of markup tags as supplied in a i
+ nput dialog.
+ </para></abstract>
+</listitem>
+
+*/
+
+// end Insert_Tag.bsh
=======================================
--- /dev/null
+++ /trunk/charmgrjs/resources/Italicize.bsh Sat Sep 26 05:45:25 2009
@@ -0,0 +1,60 @@
+/*
+ * Insert_Tag.bsh - a BeanShell macro script for the
+ * jEdit text editor - inserts opening and closing tags
+ * around selected text
+ * Copyright (C) 2001 John Gellene
+ *
jgel...@nyc.rr.com
+ *
http://community.jedit.org
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the jEdit program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
USA.
+ *
+ * $Id: Insert_Tag.bsh 4988 2004-03-08 04:29:12Z spestov $
+ */
+
+
+void italicize()
+{
+ caret = textArea.getCaretPosition();
+ text = textArea.getSelectedText();
+ if(text == null) text = "";
+ sb = new StringBuffer();
+ sb.append("<i>");
+ sb.append(text);
+ sb.append("</i>");
+ textArea.setSelectedText(sb.toString());
+ //if no selected text, put the caret between the tags
+ if(text.length() == 0)
+ textArea.setCaretPosition(caret + tag.length() + 2);
+}
+
+if(buffer.isReadOnly())
+ Macros.error(view, "Buffer is read-only.");
+else
+ italicize();
+
+/*
+ Macro index data (in DocBook format)
+
+<listitem>
+ <para><filename>Insert_Tag.bsh</filename></para>
+ <abstract><para>
+ Inserts a balanced pair of markup tags as supplied in a i
+ nput dialog.
+ </para></abstract>
+</listitem>
+
+*/
+
+// end Insert_Tag.bsh
=======================================
--- /dev/null
+++ /trunk/charmgrjs/resources/Remove_newline_in_selection.bsh Sat Sep 26
05:45:25 2009
@@ -0,0 +1,10 @@
+// This is a recorded macro. First, check over the
+// commands to make sure this is what you intended. Then,
+// save this buffer, and the macro should appear in the
+// Macros menu.
+SearchAndReplace.setSearchString("\\n");
+SearchAndReplace.setReplaceString("");
+SearchAndReplace.setBeanShellReplace(false);
+SearchAndReplace.setIgnoreCase(false);
+SearchAndReplace.setRegexp(true);
+SearchAndReplace.replace(view);
=======================================
--- /dev/null
+++ /trunk/charmgrjs/resources/Table cell-ify.bsh Sat Sep 26 05:45:25 2009
@@ -0,0 +1,60 @@
+/*
+ * Insert_Tag.bsh - a BeanShell macro script for the
+ * jEdit text editor - inserts opening and closing tags
+ * around selected text
+ * Copyright (C) 2001 John Gellene
+ *
jgel...@nyc.rr.com
+ *
http://community.jedit.org
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the jEdit program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
USA.
+ *
+ * $Id: Insert_Tag.bsh 4988 2004-03-08 04:29:12Z spestov $
+ */
+
+
+void italicize()
+{
+ caret = textArea.getCaretPosition();
+ text = textArea.getSelectedText();
+ if(text == null) text = "";
+ sb = new StringBuffer();
+ sb.append("<td>");
+ sb.append(text);
+ sb.append("</td>");
+ textArea.setSelectedText(sb.toString());
+ //if no selected text, put the caret between the tags
+ if(text.length() == 0)
+ textArea.setCaretPosition(caret + tag.length() + 2);
+}
+
+if(buffer.isReadOnly())
+ Macros.error(view, "Buffer is read-only.");
+else
+ italicize();
+
+/*
+ Macro index data (in DocBook format)
+
+<listitem>
+ <para><filename>Insert_Tag.bsh</filename></para>
+ <abstract><para>
+ Inserts a balanced pair of markup tags as supplied in a i
+ nput dialog.
+ </para></abstract>
+</listitem>
+
+*/
+
+// end Insert_Tag.bsh
=======================================
--- /trunk/charmgrjs/edit.js Thu Sep 24 13:53:33 2009
+++ /trunk/charmgrjs/edit.js Sat Sep 26 05:45:25 2009
@@ -441,9 +441,9 @@
var title = "Update Experience Log";
var content = "<table style='width: 100%'>";
for (var row in chardata.xp_log) {
- content += "<tr><td>" + chardata.xp_log[row].xp + "</td><td>" +
chardata.xp_log[row].date + "</td><td>" + chardata.xp_log[row].note
+ "</td></tr>";
- }
- content += "<tr><td>" + chardata.xp + "</td><td>" + (new
Date()).toDateString() + "</td><td><input id='xp_log_note' type='text'
style='width: 100%' onkeypress='save_log(event,
chardata)'/></td></tr></table>";
+ content += "<tr><td>" + chardata.xp_log[row].xp + "</td><td>" +
chardata.xp_log[row].date + "</td><td>[" + chardata.xp_log[row].hp
+ "]</td><td>" + chardata.xp_log[row].note + "</td></tr>";
+ }
+ content += "<tr><td>" + (chardata.xp == null ? 0 : chardata.xp)
+ "</td><td>[" + (chardata.hp == null ? 0 : chardata.hp) + "]</td><td>" +
(new Date()).toDateString() + "</td><td><input id='xp_log_note' type='text'
style='width: 100%' onkeypress='save_log(event,
chardata)'/></td></tr></table>";
show_dialog(title, content);
return false;
}
@@ -454,7 +454,7 @@
if(chardata.xp_log == null) {
chardata.xp_log = [];
}
- chardata.xp_log.push({xp: chardata.xp, date: (new
Date()).toDateString(), note: $('#xp_log_note').val()});
+ chardata.xp_log.push({xp: chardata.xp, hp: chardata.hp, date: (new
Date()).toDateString(), note: $('#xp_log_note').val()});
sav(chardata);
}
}
=======================================
--- /trunk/charmgrjs/spells.js Fri Sep 25 13:44:22 2009
+++ /trunk/charmgrjs/spells.js Sat Sep 26 05:45:25 2009
@@ -3077,7 +3077,7 @@
save: "Ref half",
sr: "Yes",
phb: 231,
- detail: ""
+ detail: "A <i>fireball</i> spell is an explosion of flame that
detonates with a low roar and deals 1d6 points of fire damage per caster
level (maximum 10d6) to every creature within the area. Unattended objects
also take this damage. The explosion creates almost no pressure. <p
class=sub>You point your finger and determine the range (distance and
height) at which the fireball is to burst. A glowing, pea-sized bead
streaks from the pointing digit and, unless it impacts upon a material body
or solid barrier prior to attaining the prescribed range, blossoms into the
fireball at that point. (An early impact results in an early detonation.)
If you attempt to send the bead through a narrow passage, such as through
an arrow slit, you must “hit” the opening with a ranged touch attack, or
else the bead strikes the barrier and detonates prematurely. <p
class=sub>The <i>fireball</i> sets fire to combustibles and damages objects
in the area. It can melt metals with low melting points, such as lead,
gold, copper, silver, and bronze. If the damage caused to an interposing
barrier shatters or breaks through it, the <i>fireball</i> may continue
beyond the barrier if the area permits; otherwise it stops at the barrier
just as any other spell effect does. <p class=sub><i>Material
Component</i>: A tiny ball of bat guano and sulfur."
}, {
id: 203,
name: "Flame Arrow",
@@ -3092,7 +3092,7 @@
save: "-",
sr: "-",
phb: 231,
- detail: ""
+ detail: "You turn ammunition (such as arrows, bolts, shuriken, and
stones) into fiery projectiles. Each piece of ammunition deals an extra 1d6
points of fire damage to any target it hits. A flaming projectile can
easily ignite a flammable object or structure, but it won’t ignite a
creature it strikes. <p class=sub><i>Material Component</>: A drop of oil
and a small piece of flint."
}, {
id: 204,
name: "Flame Blade",
@@ -3107,7 +3107,7 @@
save: "-",
sr: "Yes",
phb: 231,
- detail: ""
+ detail: "A 3-foot-long, blazing beam of red-hot fire springs forth
from your hand. You wield this bladelike beam as if it were a scimitar.
Attacks with the <i>flame blade</i> are melee touch attacks. The blade
deals 1d8 points of fire damage +1 point per two caster levels (maximum
+10). Since the blade is immaterial, your Strength modifier does not apply
to the damage. A <i>flame blade</i> can ignite combustible materials such
as parchment, straw, dry sticks, and cloth. <p class=sub>The spell does not
function underwater."
}, {
id: 205,
name: "Flame Strike",
@@ -3122,7 +3122,7 @@
save: "Ref half",
sr: "Yes",
phb: 231,
- detail: ""
+ detail: "A <i>flame strike</i> produces a vertical column of <p
class=sub>divine fire roaring downward. The spell <p class=sub>deals 1d6
points of damage per caster level <p class=sub>(maximum 15d6). Half the
damage is fire <p class=sub>damage, but the other half results directly <p
class=sub>from divine power and is therefore not <p class=sub>subject to
being reduced by resistance to <p class=sub>fire-based attacks, such as
that granted by <p class=sub><i>protection from energy (fire), fire shield
(chill <p class=sub>shield)</i>, and similar magic."
}, {
id: 206,
name: "Flaming Sphere",
@@ -3137,7 +3137,7 @@
save: "Ref negs",
sr: "Yes",
phb: 232,
- detail: ""
+ detail: "A burning globe of fire rolls in whichever direction you
point and burns those it strikes. It moves 30 feet per round. As part of
this movement, it can ascend or jump up to 30 feet to strike a target. If
it enters a space with a creature, it stops moving for the round and deals
2d6 points of fire damage to that creature, though a successful Reflex save
negates that damage. A flaming sphere rolls over barriers less than 4 feet
tall, such as furniture and low walls. It ignites flammable substances it
touches and illuminates the same area as a torch would. <p class=sub>The
sphere moves as long as you actively direct it (a move action for you);
otherwise, it merely stays at rest and burns. It can be extinguished by any
means that would put out a normal fire of its size. The surface of the
sphere has a spongy, yielding consistency and so does not cause damage
except by its flame. It cannot push aside unwilling creatures or batter
down large obstacles. A <i>flaming sphere</i> winks out if it exceeds the
spell’s range. <p class=sub><b>Arcane Material Component</b>: A bit of
tallow, a pinch of brimstone, and a dusting of powdered iron."
}, {
id: 207,
name: "Flare",
@@ -3167,7 +3167,7 @@
save: "Fort negs",
sr: "Yes",
phb: 232,
- detail: ""
+ detail: "The subject, along with all its carried gear, turns into a
mindless, inert statue. If the statue resulting from this spell is broken
or damaged, the subject (if ever returned to its original state) has
similar damage or deformities. The creature is not dead, but it does not
seem to be alive either when viewed with spells such as <i>deathwatch</i>.
Only creatures made of flesh are affected by this spell. <p
class=sub><i>Material Component</i>: Lime, water, and earth."
}, {
id: 209,
name: "Fly",
@@ -3182,7 +3182,7 @@
save: "Will negs",
sr: "Yes",
phb: 232,
- detail: ""
+ detail: "The subject can fly at a speed of 60 feet (or 40 feet if it
wears medium or heavy armor, or if it carries a medium or heavy load). It
can ascend at half speed and descend at double speed, and its
maneuverability is good. Using a <i>fly</i> spell requires only as much
concentration as walking, so the subject can attack or cast spells
normally. The subject of a <i>fly</i> spell can charge but not run, and it
cannot carry aloft more weight than its maximum load, plus any armor it
wears. <p class=sub>Should the spell duration expire while the subject is
still aloft, the magic fails slowly. The subject floats downward 60 feet
per round for 1d6 rounds. If it reaches the ground in that amount of time,
it lands safely. If not, it falls the rest of the distance, taking 1d6
points of damage per 10 feet of fall. Since dispelling a spell effectively
ends it, the subject also descends in this way if the <i>fly</i> spell is
dispelled, but not if it is negated by an <i>antimagic field</i>. <p
class=sub><i>Arcane Focus</i>: A wing feather from any bird."
}, {
id: 210,
name: "Fog Cloud",
@@ -3197,7 +3197,7 @@
save: "-",
sr: "-",
phb: 232,
- detail: ""
+ detail: "A bank of fog billows out from the point you designate. The
fog obscures all sight, including darkvision, beyond 5 feet. A creature
within 5 feet has concealment (attacks have a 20% miss chance). Creatures
farther away have total concealment (50% miss chance, and the attacker
can’t use sight to locate the target). <p class=sub>A moderate wind (11+
mph) disperses the fog in 4 rounds; a strong wind (21+ mph) disperses the
fog in 1 round. <p class=sub>The spell does not function underwater."
}, {
id: 211,
name: "Forbiddance",
@@ -3212,7 +3212,7 @@
save: "Special",
sr: "Yes",
phb: 232,
- detail: ""
+ detail: "<i>Forbiddance</i> seals an area against all planar travel
into or within it. This includes all teleportation spells (such as
<i>dimension door</i> and <i>teleport</i>), <i>plane shifting</i>, astral
travel, ethereal travel, and all summoning spells. Such effects simply fail
automatically. <p class=sub>In addition, it damages entering creatures
whose alignments are different from yours. The effect on those attempting
to enter the warded area is based on their alignment relative to yours (see
below). A creature inside the area when the spell is cast takes no damage
unless it exits the area and attempts to reenter, at which time it is
affected as normal. <p class=sub><i>Alignments identical</i>: No effect.
The creature may enter the area freely (although not by planar travel). <p
class=sub><i>Alignments different with respect to either law/chaos or
good/evil</i>: The creature takes 6d6 points of damage. A successful Will
save halves the damage, and spell resistance applies. <p
class=sub><i>Alignments different with respect to both law/chaos and
good/evil</i>: The creature takes 12d6 points of damage. A successful Will
save halves the damage, and spell resistance applies. <p class=sub>At your
option, the abjuration can include a password, in which case creatures of
alignments different from yours can avoid the damage by speaking the
password as they enter the area. You must select this option (and the
password) at the time of casting. <p class=sub><i>Dispel magic</i> does not
dispel a <i>forbiddance</i> effect unless the dispeller’s level is at least
as high as your caster level. <p class=sub>You can’t have multiple
overlapping <i>forbiddance</i> effects. In such a case, the more recent
effect stops at the boundary of the older effect. <p class=sub><i>Material
Component</i>: A sprinkling of holy water and rare incenses worth at least
1,500 gp, plus 1,500 gp per 60-foot cube. If a password is desired, this
requires the burning of additional rare incenses worth at least 1,000 gp,
plus 1,000 gp per 60-foot cube."
}, {
id: 212,
name: "Forcecage",
@@ -3227,7 +3227,7 @@
save: "-",
sr: "-",
phb: 233,
- detail: ""
+ detail: "This powerful spell brings into being an immobile, invisible
cubical prison composed of either bars of force or solid walls of force
(your choice). <p class=sub>Creatures within the area are caught and
contained unless they are too big to fit inside, in which case the spell
automatically fails. Teleportation and other forms of astral travel provide
a means of escape, but the force walls or bars extend into the Ethereal
Plane, blocking ethereal travel. <p class=sub>Like a <i>wall of force</i>
spell, a <i>forcecage</i> resists <i>dispel magic</i>, but it is vulnerable
to a <i>disintegrate</i> spell, and it can be destroyed by a <i>sphere of
annihilation</i> or a <i>rod of cancellation</i>. <p class=sub><i>Barred
Cage</i>: This version of the spell produces a 20-foot cube made of bands
of force (similar to a <i>wall of force</i> spell) for bars. The bands are
a half-inch wide, with half-inch gaps between them. Any creature capable of
passing through such a small space can escape; others are confined. You
can’t attack a creature in a barred cage with a weapon unless the weapon
can fit between the gaps. Even against such weapons (including arrows and
similar ranged attacks), a creature in the barred cage has cover. All
spells and breath weapons can pass through the gaps in the bars. <p
class=sub><i>Windowless Cell</i>: This version of the spell produces a
10-foot cube with no way in and no way out. Solid walls of force form its
six sides. <p class=sub><i>Material Component</i>: Ruby dust worth 1,500
gp, which is tossed into the air and disappears when you cast the spell."
}, {
id: 213,
name: "Foresight",
@@ -3242,7 +3242,7 @@
save: "Will negs",
sr: "Yes",
phb: 233,
- detail: ""
+ detail: "This spell grants you a powerful sixth sense in relation to
yourself or another. Once <i>foresight</i> is cast, you receive
instantaneous warnings of impending danger or harm to the subject of the
spell. Thus, if you are the subject of the spell, you would be warned in
advance if a rogue were about to attempt a sneak attack on you, or if a
creature were about to leap out from a hiding place, or if an attacker were
specifically targeting you with a spell or ranged weapon. You are never
surprised or flat-footed. In addition, the spell gives you a general idea
of what action you might take to best protect yourself—duck, jump right,
close your eyes, and so on—and gives you a +2 insight bonus to AC and
Reflex saves. This insight bonus is lost whenever you would lose a
Dexterity bonus to AC. <p class=sub>When another creature is the subject of
the spell, you receive warnings about that creature. You must communicate
what you learn to the other creature for the warning to be useful, and the
creature can be caught unprepared in the absence of such a warning.
Shouting a warning, yanking a person back, and even telepathically
communicating (via an appropriate spell) can all be accomplished before
some danger befalls the subject, provided you act on the warning without
delay. The subject, however, does not gain the insight bonus to AC and
Reflex saves. <p class=sub><i>Arcane Material Component</i>: A
hummingbird’s feather."
}, {
id: 214,
name: "Fox's Cunning",