Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- var iFileName = "EPICLists.js";//this doesn't change anything until after level 20
- RequiredSheetVersion(13);
- ExperiencePointsList = ["", 300, 900, 2700, 6500, 14000, 23000, 34000, 48000, 64000, 85000, 100000, 120000, 140000, 165000, 195000, 225000, 265000, 305000, 355000, 415000, 475000, 545000, 625000, 715000, 815000, 925000, 1045000, 1175000, 1315000, 1465000, 1625000, 1795000, 1975000, 2165000, 2365000, 2575000, 2795000, 3025000, 3265000, 1000000000];
- levels = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40];
- ProficiencyBonusList = [2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11];
- cantripDie = [1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7];
- defaultSpellTable = [
- [0, 0, 0, 0, 0, 0, 0, 0, 0],
- [2, 0, 0, 0, 0, 0, 0, 0, 0],
- [3, 0, 0, 0, 0, 0, 0, 0, 0],
- [4, 2, 0, 0, 0, 0, 0, 0, 0],
- [4, 3, 0, 0, 0, 0, 0, 0, 0],
- [4, 3, 2, 0, 0, 0, 0, 0, 0],
- [4, 3, 3, 0, 0, 0, 0, 0, 0],
- [4, 3, 3, 1, 0, 0, 0, 0, 0],
- [4, 3, 3, 2, 0, 0, 0, 0, 0],
- [4, 3, 3, 3, 1, 0, 0, 0, 0],
- [4, 3, 3, 3, 2, 0, 0, 0, 0],
- [4, 3, 3, 3, 2, 1, 0, 0, 0],
- [4, 3, 3, 3, 2, 1, 0, 0, 0],
- [4, 3, 3, 3, 2, 1, 1, 0, 0],
- [4, 3, 3, 3, 2, 1, 1, 0, 0],
- [4, 3, 3, 3, 2, 1, 1, 1, 0],
- [4, 3, 3, 3, 2, 1, 1, 1, 0],
- [4, 3, 3, 3, 2, 1, 1, 1, 1],
- [4, 3, 3, 3, 3, 1, 1, 1, 1],
- [4, 3, 3, 3, 3, 2, 1, 1, 1],
- [4, 3, 3, 3, 3, 2, 2, 1, 1],
- [4, 3, 3, 3, 3, 2, 2, 2, 1],
- [4, 3, 3, 3, 3, 2, 2, 2, 2],
- [4, 4, 3, 3, 3, 2, 2, 2, 2],
- [4, 4, 4, 3, 3, 2, 2, 2, 2],
- [4, 4, 4, 4, 3, 2, 2, 2, 2],
- [4, 4, 4, 4, 3, 3, 2, 2, 2],
- [4, 4, 4, 4, 4, 3, 2, 2, 2],
- [4, 4, 4, 4, 4, 3, 3, 2, 2],
- [4, 4, 4, 4, 4, 3, 3, 3, 2],
- [4, 4, 4, 4, 4, 3, 3, 3, 3],
- [4, 4, 4, 4, 4, 4, 3, 3, 3],
- [4, 4, 4, 4, 4, 4, 4, 3, 3],
- [4, 4, 4, 4, 4, 4, 4, 4, 3],
- [4, 4, 4, 4, 4, 4, 4, 4, 4],
- [5, 5, 4, 4, 4, 4, 4, 4, 4],
- [5, 5, 5, 5, 4, 4, 4, 4, 4],
- [5, 5, 5, 5, 5, 5, 4, 4, 4],
- [5, 5, 5, 5, 5, 5, 5, 4, 4],
- [5, 5, 5, 5, 5, 5, 5, 5, 4],
- [5, 5, 5, 5, 5, 5, 5, 5, 5]
- ];
- warlockSpellTable = [
- [0, 0, 0, 0, 0, 0, 0, 0, 0],
- [1, 0, 0, 0, 0, 0, 0, 0, 0],
- [2, 0, 0, 0, 0, 0, 0, 0, 0],
- [0, 2, 0, 0, 0, 0, 0, 0, 0],
- [0, 2, 0, 0, 0, 0, 0, 0, 0],
- [0, 0, 2, 0, 0, 0, 0, 0, 0],
- [0, 0, 2, 0, 0, 0, 0, 0, 0],
- [0, 0, 0, 2, 0, 0, 0, 0, 0],
- [0, 0, 0, 2, 0, 0, 0, 0, 0],
- [0, 0, 0, 0, 2, 0, 0, 0, 0],
- [0, 0, 0, 0, 2, 0, 0, 0, 0],
- [0, 0, 0, 0, 3, 0, 0, 0, 0],
- [0, 0, 0, 0, 3, 0, 0, 0, 0],
- [0, 0, 0, 0, 3, 0, 0, 0, 0],
- [0, 0, 0, 0, 3, 0, 0, 0, 0],
- [0, 0, 0, 0, 3, 0, 0, 0, 0],
- [0, 0, 0, 0, 3, 0, 0, 0, 0],
- [0, 0, 0, 0, 4, 0, 0, 0, 0],
- [0, 0, 0, 0, 4, 0, 0, 0, 0],
- [0, 0, 0, 0, 4, 0, 0, 0, 0],
- [0, 0, 0, 0, 4, 0, 0, 0, 0],
- [0, 0, 0, 0, 0, 4, 0, 0, 0],
- [0, 0, 0, 0, 0, 4, 0, 0, 0],
- [0, 0, 0, 0, 0, 5, 0, 0, 0],
- [0, 0, 0, 0, 0, 5, 0, 0, 0],
- [0, 0, 0, 0, 0, 5, 0, 0, 0],
- [0, 0, 0, 0, 0, 0, 5, 0, 0],
- [0, 0, 0, 0, 0, 0, 5, 0, 0],
- [0, 0, 0, 0, 0, 0, 5, 0, 0],
- [0, 0, 0, 0, 0, 0, 6, 0, 0],
- [0, 0, 0, 0, 0, 0, 6, 0, 0],
- [0, 0, 0, 0, 0, 0, 0, 6, 0],
- [0, 0, 0, 0, 0, 0, 0, 6, 0],
- [0, 0, 0, 0, 0, 0, 0, 6, 0],
- [0, 0, 0, 0, 0, 0, 0, 6, 0],
- [0, 0, 0, 0, 0, 0, 0, 7, 0],
- [0, 0, 0, 0, 0, 0, 0, 0, 7],
- [0, 0, 0, 0, 0, 0, 0, 0, 7],
- [0, 0, 0, 0, 0, 0, 0, 0, 7],
- [0, 0, 0, 0, 0, 0, 0, 0, 7],
- [0, 0, 0, 0, 0, 0, 0, 0, 7]
- ];
- SpellPointsTable = [0, 4, 6, 14, 17, 27, 32, 38, 44, 57, 64, 73, 73, 83, 83, 94 ,94, 107, 114, 123, 133, 144, 157, 160, 165, 171, 180, 187, 197, 208, 221, 230, 240, 251, 264, 269, 280, 296, 306, 317, 330];
- var iFileName = "Epic Level - SourceList.js";
- RequiredSheetVersion(13);
- SourceList["ELC"] = {
- name : "Epic Level Characters level 21-40",
- abbreviation : "ELC",
- group : "Dungeon Masters Guild",
- url : "https://www.dmsguild.com/product/235460/Epic-Level-Characters-level-2140",
- };
- var iFileName = "EPICListsClasses.js";
- RequiredSheetVersion(13);
- FightingStyles = {// improved fighting styles, couldn't find guide to adding fighting styles
- archery : {
- name : "Archery Fighting Style",
- description : "\n " + "+2 bonus to attack rolls I make with ranged weapons",
- calcChanges : {
- atkCalc : [
- function (fields, v, output) {
- if (v.isRangedWeapon) output.extraHit += 2;
- },
- "My ranged weapons get a +2 bonus on the To Hit."
- ]
- }
- },
- defense : {
- name : "Defense Fighting Style",
- description : "\n " + "+1 bonus to AC when I'm wearing armor",
- extraAC : {
- mod : 1,
- text : "I gain a +1 bonus to AC while wearing armor.",
- stopeval : function (v) { return !v.wearingArmor; }
- }
- },
- dueling : {
- name : "Dueling Fighting Style",
- description : "\n " + "+2 to damage rolls when wielding a melee weapon in one hand and no other weapons",
- calcChanges : {
- atkCalc : [
- function (fields, v, output) {
- for (var i = 1; i <= FieldNumbers.actions; i++) {
- if ((/off.hand.attack/i).test(What('Bonus Action ' + i))) return;
- };
- if (v.isMeleeWeapon && !v.isNaturalWeapon && !(/\b(2|two).?hand(ed)?s?\b/i).test(v.theWea.description)) output.extraDmg += 2;
- },
- "When I'm wielding a melee weapon in one hand and no weapon in my other hand, I do +2 damage with that melee weapon. This condition will always be false if the bonus action 'Off-hand Attack' exists."
- ]
- }
- },
- great_weapon : {
- name : "Great Weapon Fighting Style",
- description : "\n " + "Reroll 1 or 2 on damage if wielding two-handed/versatile melee weapon in both hands",
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.isMeleeWeapon && (/\b(versatile|(2|two).?hand(ed)?s?)\b/i).test(v.theWea.description)) {
- fields.Description += (fields.Description ? '; ' : '') + 'Re-roll 1 or 2 on damage die' + ((/versatile/i).test(fields.Description) ? ' when two-handed' : '');
- }
- },
- "While wielding a two-handed or versatile melee weapon in two hands, I can re-roll a 1 or 2 on any damage die once."
- ]
- }
- },
- protection : {
- name : "Protection Fighting Style",
- description : "\n " + "As a reaction, I can give disadv. on an attack made vs. someone within 5 ft of me" + "\n " + "I need to be wielding a shield and be able to see the attacker to do this",
- action : ["reaction", ""]
- },
- two_weapon : {
- name : "Two-Weapon Fighting Style",
- description : "\n " + "I can add my ability modifier to the damage of my off-hand attacks",
- calcChanges : {
- atkCalc : [
- function (fields, v, output) {
- if (v.isOffHand) output.modToDmg = true;
- },
- "When engaging in two-weapon fighting, I can add my ability modifier to the damage of my off-hand attacks. If a melee weapon includes 'off-hand' or 'secondary' in its name or description, it is considered an off-hand attack."
- ]
- }
- },
- archery2 : {
- name : "Improved Archery Fighting Style",
- description : "\n " + "+3 bonus to attack rolls I make with ranged weapons; stacks with the +2 bonus from Archery Fighting Style",
- calcChanges : {
- atkCalc : [
- function (fields, v, output) {
- if (v.isRangedWeapon) output.extraHit += 3;
- },
- "My ranged weapons get a +3 bonus on the To Hit."
- ]
- }
- },
- defense2 : {
- name : "Improved Defense Fighting Style",
- description : "\n " + "+3 bonus to AC when I'm wearing armor; stacks with the +1 from Defense Fighting Style",
- extraAC : {
- mod : 3,
- text : "I gain a +3 bonus to AC while wearing armor.",
- stopeval : function (v) { return !v.wearingArmor; }
- }
- },
- dueling2 : {
- name : "Improved Dueling Fighting Style",
- description : "\n " + "+3 to damage rolls when wielding a melee weapon in one hand and no other weapons; stacks with the +2 from Dueling Fighting Style",
- calcChanges : {
- atkCalc : [
- function (fields, v, output) {
- for (var i = 1; i <= FieldNumbers.actions; i++) {
- if ((/off.hand.attack/i).test(What('Bonus Action ' + i))) return;
- };
- if (v.isMeleeWeapon && !v.isNaturalWeapon && !(/\b(2|two).?hand(ed)?s?\b/i).test(v.theWea.description)) output.extraDmg += 3;
- },
- "When I'm wielding a melee weapon in one hand and no weapon in my other hand, I do +3 damage with that melee weapon. This condition will always be false if the bonus action 'Off-hand Attack' exists."
- ]
- }
- },
- great_weapon2 : {
- name : "Improved Great Weapon Fighting Style",
- description : "\n " + "Double mod damage if wielding two-handed/versatile melee weapon in both hands",
- calcChanges : {
- atkCalc : [
- function (fields, v, output) {
- if (v.isMeleeWeapon && (/\b(versatile|(2|two).?hand(ed)?s?)\b/i).test(v.theWea.description)) output.extraDmg += output.mod;
- },
- "While wielding a two-handed or versatile melee weapon in two hands, I can add my ability score twice to damage"
- ]
- }
- },
- protection2 : {
- name : "Improved Protection Fighting Style",
- description : "\n " + "As a reaction, I can give disadv. on an attack made vs. someone within 10 ft of me" + "\n " + "I need to be wielding a shield and be able to see the attacker to do this",
- action : ["reaction", ""]
- },
- two_weapon2 : {
- name : "Improved Two-Weapon Fighting Style",
- description : "\n " + "I can make 2 attacks with my off hand",
- }
- };
- //Complete Base Classes - Most of the code is from MPMB beta13.22-put notes on all changes to better update it.
- //Artificer
- ClassList.artificer.improvements = [0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 10, 10];
- ClassList.artificer.attacks = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
- ClassList.artificer.spellcastingKnown = {
- cantrips : [2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6],
- spells : "list",
- prepared : true
- };
- ClassList.artificer.features["magical tinkering"] = {
- name : "Magical Tinkering",
- source : [["E:RLW", 55]],
- minlevel : 1,
- description : desc([
- "As an action, I use artisan's tools to give max 1 property to a nonmagical tiny object:",
- " \u2022 Emit light (5-ft radius bright light, equal dim), an odor, or a nonverbal sound",
- " \u2022 Static visual effect on one surface, or emit a 6-second recorded message when tapped",
- "If I instill a property in more objects than I can have active, the oldest loses its property"
- ]),
- additional : "Intelligence modifier of active objects",
- action : [["action", " (add/remove)"]],
- extraname : "Artificer 2",
- "infuse item" : {
- name : "Infuse Item",
- source : [["E:RLW", 57]],
- description : desc([
- "When I finish a long rest, I can turn nonmagical objects into magic items using my infusions",
- "I can attune to it immediately; If I infuse too many items, the oldest loses its magic",
- "The infusion lasts until my death + my Int mod in days, but ends if I unlearn the infusion",
- "Each infusion can only be used in one item at a time and only in appropriate items",
- "Whenever I gain an artificer level, I can replace an infusion I know with another",
- "I can use an infused item as a spellcasting focus"
- ]),
- additional : levels.map(function (n) {
- return n < 2 ? "" : (n < 6 ? 4 : n < 10 ? 6 : n < 14 ? 8 : n < 18 ? 10 : n < 22 ? 12 : n < 26 ? 14 : n < 30 ? 16 : n < 34 ? 18 : n < 38 ? 20 : 22) + " infusions known; max " + (n < 6 ? 2 : n < 10 ? 3 : n < 14 ? 4 : n < 18 ? 5 : n < 22 ? 6 : n < 26 ? 7 : n < 30 ? 8 : n < 34 ? 9 : n < 38 ? 10 : 11) + " infused items";
- })
- },
- autoSelectExtrachoices : [{
- extrachoice : "infuse item",
- minlevel : 2
- }]
- },
- ClassList.artificer.features["infuse item"] = {
- name : "Infuse Item",
- source : [["E:RLW", 57]],
- minlevel : 2,
- description : '\n Use the "Choose Feature" button above to add Artificer Infusions to the third page',
- additional : levels.map(function (n) {
- return n < 2 ? "" : (n < 6 ? 4 : n < 10 ? 6 : n < 14 ? 8 : n < 18 ? 10 : n < 22 ? 12 : n < 26 ? 14 : n < 30 ? 16 : n < 34 ? 18 : n < 38 ? 20 : 22) + " infusions known; max " + (n < 6 ? 2 : n < 10 ? 3 : n < 14 ? 4 : n < 18 ? 5 : n < 22 ? 6 : n < 26 ? 7 : n < 30 ? 8 : n < 34 ? 9 : n < 38 ? 10 : 11) + " infused items";
- }),
- extraname : "Artificer Infusion",
- extrachoices : ["Boots of the Winding Path (prereq: level 6 artificer)", "Enhanced Arcane Focus", "Enhanced Defense", "Enhanced Weapon", "Homunculus Servant (prereq: level 6 artificer)", "Radiant Weapon (prereq: level 6 artificer)", "Repeating Shot", "Repulsion Shield (prereq: level 6 artificer)", "Resistant Armor (prereq: level 6 artificer)", "Returning Weapon"],
- extraTimes : levels.map(function (n) {
- return n < 2 ? 0 : n < 6 ? 4 : n < 10 ? 6 : n < 14 ? 8 : n < 18 ? 10 : n < 22 ? 12 : n < 26 ? 14 : n < 30 ? 16 : n < 34 ? 18 : n < 38 ? 20 : 22;
- }),
- "boots of the winding path (prereq: level 6 artificer)" : {
- name : "Boots of the Winding Path",
- source : [["E:RLW", 62]],
- description : desc([
- "The wearer can use a bonus action to teleport up to 15 ft to an unoccupied space it can see",
- "It must be a space that the wearer had occupied some time during the current turn"
- ]),
- additional : "pair of boots; requires attunement",
- prereqeval : function(v) { return classes.known.artificer.level >= 6; },
- eval : function (lvl, chc) { AddMagicItem("Boots of the Winding Path"); },
- removeeval : function (lvl, chc) {
- var loc = CurrentMagicItems.known.indexOf("boots of the winding path");
- if (loc == -1) return;
- MagicItemClear(loc + 1, true);
- }
- },
- "enhanced arcane focus" : {
- name : "Enhanced Arcane Focus",
- source : [["E:RLW", 62]],
- description : "\n Can also be a rod or a staff (e.g. Rod of the War Mage +1); Requires attunement",
- additional : levels.map(function (n) {
- return "Wand of the War Mage +" + (n < 10 ? 1 : 2);
- }),
- eval : function (lvl, chc) {
- AddMagicItem("Arcane Focus of the War Mage +" + (classes.known.artificer.level < 10 ? 1 : 2));
- },
- removeeval : function (lvl, chc) {
- var loc = CurrentMagicItems.known.indexOf("wand of the war mage, +1, +2, or +3");
- if (loc == -1) return;
- MagicItemClear(loc + 1, true);
- }
- },
- "enhanced defense" : {
- name : "Enhanced Defense",
- source : [["E:RLW", 62]],
- description : "",
- additional : levels.map(function (n) {
- return "armor/shield; +" + (n < 10 ? 1 : 2) + " magical";
- }),
- eval : function (lvl, chc) {
- AddMagicItem("Armor +" + (classes.known.artificer.level < 10 ? 1 : 2));
- },
- removeeval : function (lvl, chc) {
- var loc = CurrentMagicItems.known.indexOf("armor, +1, +2, or +3");
- if (loc == -1) return;
- MagicItemClear(loc + 1, true);
- }
- },
- "enhanced weapon" : {
- name : "Enhanced Weapon",
- source : [["E:RLW", 62]],
- description : "",
- additional : levels.map(function (n) {
- return "simple/martial weapon; +" + (n < 10 ? 1 : 2) + " magical";
- }),
- eval : function (lvl, chc) {
- AddMagicItem("Weapon +" + (classes.known.artificer.level < 10 ? 1 : 2));
- },
- removeeval : function (lvl, chc) {
- var loc = CurrentMagicItems.known.indexOf("weapon, +1, +2, or +3");
- if (loc == -1) return;
- MagicItemClear(loc + 1, true);
- }
- },
- "homunculus servant (prereq: level 6 artificer)" : {
- name : "Homunculus Servant",
- source : [["E:RLW", 62]],
- description : desc([
- "The item I infuse becomes the heart of a homunculus that immediately forms around it",
- "I determine its appearance; It is friendly to me and my allies and obeys my commands",
- 'Select "Homunculus Servant" on a companion page to see its game statistics'
- ]),
- additional : "gem of 100+ gp or a dragonshard",
- prereqeval : function(v) { return classes.known.artificer.level >= 6; },
- eval : function (lvl, chc) {
- ClassList.artificer.artificerCompFunc.add("Homunculus Servant");
- },
- removeeval : function (lvl, chc) {
- ClassList.artificer.artificerCompFunc.remove("homunculus servant");
- if (CreatureList["homunculus servant"]) CreatureList["homunculus servant"].removeeval();
- }
- },
- "radiant weapon (prereq: level 6 artificer)" : {
- name : "Radiant Weapon",
- source : [["E:RLW", 62]],
- description : desc([
- "The weapon has a +1 bonus to attack and damage rolls made with it and it sheds light",
- "As a bonus action, its wielder can start/stop the light, 30-ft radius bright + 30 ft dim light",
- "The weapon has 4 charges, regaining 1d4 expended charges daily at dawn",
- "As a reaction when hit by an attack, the wielder can expend 1 charge to blind its attacker",
- "The attack must succeed on a Con save (spell save DC) or be blinded until its next turn ends"
- ]),
- additional : "simple/martial weapon; requires attunement",
- prereqeval : function(v) { return classes.known.artificer.level >= 6; },
- eval : function (lvl, chc) { AddMagicItem("Radiant Weapon"); },
- removeeval : function (lvl, chc) {
- var loc = CurrentMagicItems.known.indexOf("radiant weapon") != -1 ? CurrentMagicItems.known.indexOf("radiant weapon") : CurrentMagicItems.known.indexOf("radiant weapon-ua");
- if (loc == -1) return;
- MagicItemClear(loc + 1, true);
- }
- },
- "repeating shot" : {
- name : "Repeating Shot",
- source : [["E:RLW", 62]],
- description : desc([
- "The weapon requiring ammunition has a +1 bonus to attack and damage rolls made with it",
- "It magically produces one piece of ammunition whenever it is used to make a ranged attack",
- "Thus, it doesn't require ammunition and ignores the loading property if it has it"
- ]),
- additional : "weapon with ammo; requires attunement",
- eval : function (lvl, chc) { AddMagicItem("Repeating Shot"); },
- removeeval : function (lvl, chc) {
- var loc = CurrentMagicItems.known.indexOf("repeating shot");
- if (loc == -1) return;
- MagicItemClear(loc + 1, true);
- }
- },
- "repulsion shield (prereq: level 6 artificer)" : {
- name : "Repulsion Shield",
- source : [["E:RLW", 63]],
- description : desc([
- "The shield gives its wearer an extra +1 bonus to AC; It has 4 charges, regaining 1d4 daily",
- "As a reaction when hit in melee, the wearer can use 1 charge to push the attacker 15 ft"
- ]),
- additional : "shield; requires attunement",
- prereqeval : function(v) { return classes.known.artificer.level >= 6; },
- eval : function (lvl, chc) { AddMagicItem("Repulsion Shield"); },
- removeeval : function (lvl, chc) {
- var loc = CurrentMagicItems.known.indexOf("repulsion shield") != -1 ? CurrentMagicItems.known.indexOf("repulsion shield") : CurrentMagicItems.known.indexOf("repulsion shield-ua");
- if (loc == -1) return;
- MagicItemClear(loc + 1, true);
- }
- },
- "resistant armor (prereq: level 6 artificer)" : {
- name : "Resistant Armor",
- source : [["E:RLW", 63]],
- description : desc([
- "The armor gives its wearer resistance to one type of damage, chosen at the time of infusion",
- "Choose from: acid, cold, fire, force, lightning, necrotic, poison, psychic, radiant, or thunder"
- ]),
- additional : "suit of armor; requires attunement",
- prereqeval : function(v) { return classes.known.artificer.level >= 6; },
- eval : function (lvl, chc) { AddMagicItem("Armor of Resistance"); },
- removeeval : function (lvl, chc) {
- var loc = CurrentMagicItems.known.indexOf("armor of resistance");
- if (loc == -1) return;
- MagicItemClear(loc + 1, true);
- }
- },
- "returning weapon" : {
- name : "Returning Weapon",
- source : [["E:RLW", 63]],
- description : "After being used for a ranged attack, the weapon returns immediately; +1 magical bonus",
- additional : "weapon with the thrown property",
- eval : function (lvl, chc) { AddMagicItem("Returning Weapon"); },
- removeeval : function (lvl, chc) {
- var loc = CurrentMagicItems.known.indexOf("returning weapon");
- if (loc == -1) return;
- MagicItemClear(loc + 1, true);
- }
- }
- },
- ClassList.artificer.features["spellcasting"] = {
- name : "Spellcasting",
- source : [["E:RLW", 55], ["ELC", 47]],
- minlevel : 1,
- description : desc([
- "I can cast prepared artificer cantrips/spells, using Intelligence as my spellcasting ability",
- "To cast, I must use thieves' or artisan's tools I'm proficient with as a spellcasting focus",
- "I can cast my prepared artificer spells as rituals if they have the ritual tag",
- "Whenever I gain an artificer level, I can swap one artificer cantrip I know for another"
- ]),
- additional : levels.map(function (n, idx) {
- return [2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6][idx] + " cantrips known";
- }),
- calcChanges : {
- spellAdd : [
- function (spellKey, spellObj, spName) {
- if (!spellObj.psionic && spName == "artificer" && spellObj.compMaterial === SpellsList[spellKey].compMaterial) {
- spellObj.compMaterial = (spellObj.compMaterial ? spellObj.compMaterial + ".\n\nAlso a" : "A") + "lways requires my artificer spellcasting focus: thieves' tools, any set of artisan's tools I'm proficient with, " + (classes.known.artificer.subclass.indexOf("artillerist") !== -1 && classes.known.artificer.level > 4 ? "my arcane firearm, " : "") + "or an item infused by me.";
- if (GetFeatureChoice("classes", "artificer", "spellcasting", true).indexOf("don't change component column on spell sheet") != -1) {
- // do nothing if set to do so
- } else if (!spellObj.components) {
- spellObj.components = "M\u0192";
- } else if (spellObj.components.indexOf("M") == -1) {
- spellObj.components += ",M\u0192";
- } else if ((/M([^\u0192\u2020]|$)/).test(spellObj.components)) {
- spellObj.components = spellObj.components.replace("M", "M\u0192");
- }
- return true;
- }
- return false;
- },
- "My artificer spells always require me to use a spellcasting focus: thieves' tools, artisan's tools I'm proficient with, or an item infused by me."
- ]
- },
- extrachoices : ["Don't change component column on spell sheet"],
- extraname : "Artificer Spellcasting",
- "don't change component column on spell sheet" : {
- name : "[Meta] Don't alter spell sheets",
- source : [["E:RLW", 55]],
- description : "\n The automation will not add M\u0192 to each artificer spell on the generated spell sheets"
- }
- };
- ClassList.artificer.features["attunment other"] = {
- name : "Attunment Other",
- source : ["ELC", 47],
- minlevel : 21,
- description : desc([
- "I can increase the number of maximum attunement slots of another creature with a 1 hr ritual",
- "If the creature dies or I do another 1 hr ritual the creature loses the extra attunement slot"
- ]),
- additional : levels.map(function (n, idx) {
- return [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5][idx] + " attunement charges";
- })
- };
- ClassList.artificer.features["improved spell-storing item"] = {
- name : "Improved Spell-Storing Item",
- source : ["ELC", 47],
- minlevel : 23,
- description : desc([
- "I can now infuse a 1st- to 4th-level artificer spell into an item I touch",
- "At, level 34 this improves to a 1st to 6th-level artificer spell"
- ])
- };
- ClassList.artificer.features["magic item adept"] = {
- name : "Magic Item Adept",
- source : [["E:RLW", 57], ["ELC", 47]],
- minlevel : 10,
- description : "\n It takes me half the normal time and gold to craft common and uncommon magic items",
- additional : levels.map(function (n) {
- return n < 10 ? "" : "attune to " + (n < 14 ? 4 : n < 18 ? 5 : n < 26 ? 6 : n < 30 ? 7 : n < 35 ? 8 : 9) + " magic items";
- })
- },
- ClassList.artificer.features["improved magic item master"] = {
- name : "Improved Magic Item Master",
- source : [["E:RLW", 57], ["ELC", 47]],
- minlevel : 10,
- description : "\n I can infuse an item twice, each time counting as a different infused item and stacking requires attunement slots for properties.",
- };
- ClassList.artificer.features["grand soul of artifice"] = {
- name : "Grand Soul of Artifice",
- source : ["ELC", 48],
- minlevel : 40,
- description : " [+1 AC per attuned magic item]\n I can replenish a total number of spell slots equal to my number of attuned items per short rest.",
- savetxt : {
- text : ["+1 AC per attuned magic item"]
- },
- usages : 1,
- recovery : "short rest"
- };
- ClassList.artificer.features["continued spellcasting"] = {
- name : "Continued Spellcasting",
- source : ["ELC", 49],
- minlevel : 21,
- description : "\n " + "I can learn higher level spells.",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "artificer" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["blade barrier", "chain lightning", "antipathy/sympathy", "contingency", "heroes feast", "programmed illusion", "illusory dragon", "power word stun", "tsunami", "etherealness", "force cage", "foresight", "plane shift", "regenerate", "teleport", "imprisonment", "shapechange"]);
- },
- "This alternative class feature enhancement expands the spells list of the artificer spell class feature."
- ]
- }
- };
- //Barbarian
- ClassList.barbarian.improvements = [0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 10, 10];
- ClassList.barbarian.attacks = [1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3];
- ClassList.barbarian.features["rage"] = {//added array til level 40
- name : "Rage",
- source : [["SRD", 8], ["P", 48], ["ELC", 4]],
- minlevel : 1,
- description : "\n " + "Start/end as bonus action; add damage to melee weapons that use Str; lasts 1 min" + "\n " + "Adv. on Strength checks/saves (not attacks); resistance to bludgeoning/piercing/slashing" + "\n " + "Stops if I end turn without attacking or taking damage since last turn, or unconscious",
- additional : levels.map(function (n) {
- return "+" + (n < 9 ? 2 : n < 16 ? 3 : 4) + " melee damage";
- }),
- usages : [2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, "\u221E\u00D7 per ", "\u221E\u00D7 per ", "\u221E\u00D7 per ", "\u221E\u00D7 per ", "\u221E\u00D7 per ", "\u221E\u00D7 per ", "\u221E\u00D7 per ", "\u221E\u00D7 per ", "\u221E\u00D7 per ", "\u221E\u00D7 per ", "\u221E\u00D7 per ", "\u221E\u00D7 per ", "\u221E\u00D7 per ", "\u221E\u00D7 per ", "\u221E\u00D7 per ", "\u221E\u00D7 per ", "\u221E\u00D7 per ", "\u221E\u00D7 per ", "\u221E\u00D7 per ", "\u221E\u00D7 per ", "\u221E\u00D7 per "],
- recovery : "long rest",
- action : ["bonus action", " (start/end)"],
- dmgres : [["Bludgeoning", "Bludgeon. (in rage)"], ["Piercing", "Piercing (in rage)"], ["Slashing", "Slashing (in rage)"]],
- savetxt : { text : ["Adv. on Str saves in rage"] },
- calcChanges : {
- atkCalc : [
- function (fields, v, output) {
- if (v.isMeleeWeapon && classes.known.barbarian && classes.known.barbarian.level && (/\brage\b/i).test(v.WeaponText)) {
- output.extraDmg += classes.known.barbarian.level < 9 ? 2 : classes.known.barbarian.level < 16 ? 3 : 4;
- }
- },
- "If I include the word 'Rage' in a melee weapon's name or description, the calculation will add my Rage's bonus damage to it."
- ]
- }
- };
- ClassList.barbarian.features["fast movement"] = {// added faster movement epic feature
- name : "Fast Movement",
- source : [["SRD", 9], ["P", 49], ["ELC", 4]],
- minlevel : 5,
- description : "\n " + "I move faster when I'm not wearing heavy armor",
- additional : levels.map(function (n) {
- if (n < 5) return "";
- var spd = "+" + (n < 23 ? 10 : n < 35 ? 20 : 30) + " ft";
- return spd;
- }),
- changeeval : function (v) {
- var barbSpd = '+' + (v[1] < 5 ? 0 : v[1] < 23 ? 10 : v[1] < 35 ? 20 : 30);
- SetProf('speed', barbSpd !== '+0', {allModes : barbSpd}, "Barbarian: Fast Movement");
- }
- };
- ClassList.barbarian.features["brutal critical"] = {// added dice into function for epic
- name : "Brutal Critical",
- source : [["SRD", 9], ["P", 49], ["ELC", 4]],
- minlevel : 9,
- description : "\n " + "I can roll additional dice for the extra damage on a critical hit with a melee attack",
- additional : levels.map(function (n) {
- return n < 9 ? "" : (n < 13 ? 1 : n < 17 ? 2 : n < 21 ? 3 : n < 25 ? 5 : n < 29 ? 7 : n < 33 ? 9 : n < 37 ? 11 : 13) + " additional di" + (n < 13 ? "" : "c") + "e"
- }),
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.isMeleeWeapon && classes.known.barbarian && classes.known.barbarian.level > 8 && (/d\d+/).test(fields.Damage_Die)) {
- var pExtraCritM = classes.known.barbarian.level < 13 ? 1 : classes.known.barbarian.level < 17 ? 2 : classes.known.barbarian.level < 21 ? 3 : classes.known.barbarian.level < 25 ? 5 : classes.known.barbarian.level < 29 ? 7 : classes.known.barbarian.level < 33 ? 9 : classes.known.barbarian.level < 37 ? 11 : 13;
- if (v.extraCritM) {
- v.extraCritM += pExtraCritM;
- var extraCritRegex = /\d+(d\d+ extra on a crit(ical)?( hit)? in melee)/i;
- fields.Description = fields.Description.replace(extraCritRegex, v.extraCritM + '$1');
- } else {
- v.extraCritM = pExtraCritM;
- fields.Description += (fields.Description ? '; ' : '') + v.extraCritM + fields.Damage_Die.replace(/.*(d\d+).*/, '$1') + ' extra on a crit in melee';
- }
- }
- },
- "My melee attacks roll additional dice on a critical hit."
- ]
- }
- };
- ClassList.barbarian.features["greater reckless attack"] = {// epic feature
- name : "Greater Reckless Attack",
- source : ["ELC", 4],
- minlevel : 26,
- description : "\n " + "I can reroll one of the dice on your advantage roll when I use reckless attack"
- };
- ClassList.barbarian.features["hit dice increase"] = {//just added 4 hp per level, if you how to change hitdice let me know
- name : "Hit Dice Increase",
- source : ["ELC", 4],
- minlevel : 29,
- description : "\n " + "My hitdie is now 16(9)",
- calcChanges : {
- hp : function (totalHD) {
- if (classes.known.barbarian) {
- return [classes.known.barbarian.level * 4
- ];
- }
- }
- },
- };
- ClassList.barbarian.features["greater rage"] = {// epic feature
- name : "Greater Rage",
- source : ["ELC", 4],
- minlevel : 34,
- description : "\n " + "While in rage, my attacks have a +1 when calculating for critical hits when using strength; rage now lasts 1 hr",
- };
- ClassList.barbarian.features["primal juggernaught"] = {// epic feature
- name : "Primal Juggernaught",
- source : [["SRD", 9], ["P", 49], ["ELC", 4]],
- minlevel : 40,
- description : "\n " + "I add +8 to both my Strength and Constitution, and their maximums increase to 38",
- scores : [4,0,4,0,0,0],
- scoresMaximum : [38,30,38,30,30,30]
- };
- //Bard
- ClassList.bard.improvements = [0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 10, 10];
- ClassList.bard.attacks = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
- ClassList.bard.spellcastingKnown = {//array to level 40
- cantrips : [2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4],//array to level 40
- spells : [4, 5, 6, 7, 8, 9, 10, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16]//array to level 40
- };
- ClassList.bard.features["spellcasting"] = {//array to level 40
- name : "Spellcasting",
- source : [["SRD", 11], ["P", 52], ["ELC", 7]],
- minlevel : 1,
- description : "\n " + "I can cast bard cantrips/spells that I know, using Charisma as my spellcasting ability" + "\n " + "I can use a musical instrument as a spellcasting focus for my bard spells" + "\n " + "I can cast my known bard spells as rituals if they have the ritual tag",
- additional : levels.map(function (n, idx) {
- var cantr = [2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4][idx];//array to level 40
- var splls = [4, 5, 6, 7, 8, 9, 10, 11, 12, 12, 15, 15, 16, 16, 19, 19, 20, 20, 22, 22, 22, 22, 24, 24, 24, 26, 26, 26, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28, 28][idx];//array to level 40
- return cantr + " cantrips \u0026 " + splls + " spells known";
- })
- };
- ClassList.bard.features["bardic inspiration"] = {//array to level 40
- name : "Bardic Inspiration",
- source : [["SRD", 12], ["P", 53], ["ELC", 7]],
- minlevel : 1,
- description : desc([
- "As a bonus action, I give a creature in 60 ft that can hear me an inspiration die (max 1)",
- "For 10 min, the recipient can add it to one ability check, attack roll, or saving throw",
- "This addition can be done after seeing the d20 roll, but before knowing the outcome"
- ]),
- additional : ["d6", "d6", "d6", "d6", "d8", "d8", "d8", "d8", "d8", "d10", "d10", "d10", "d10", "d10", "d12", "d12", "d12", "d12", "d12", "d12", "d12", "d12", "d12", "d12", "2d8", "2d8", "2d8", "2d8", "2d8", "d20", "d20", "d20", "d20", "d20", "4d6", "4d6", "4d6", "4d6", "4d6", "4d6"],
- usages : "Charisma modifier per ",
- usagescalc : "event.value = Math.max(1, What('Cha Mod'));",
- recovery : levels.map(function (n) {
- return n < 5 ? "long rest" : "short rest";
- }),
- action : ["bonus action", ""]
- };
- ClassList.bard.features["song of rest"] = {//array to level 40
- name : "Song of Rest",
- source : [["SRD", 12], ["P", 54], ["ELC", 7]],
- minlevel : 2,
- description : "\n " + "Those that use HD and can hear my performance during a short rest get extra healing",
- additional : ["", "d6", "d6", "d6", "d6", "d6", "d6", "d6", "d8", "d8", "d8", "d8", "d10", "d10", "d10", "d10", "d12", "d12", "d12", "d12", "2d8", "2d8", "2d8", "2d8", "d20", "d20", "d20", "d20", "3d10", "3d10", "3d10", "3d10", "2d20", "2d20", "2d20", "2d20", "6d10", "6d10", "6d10", "6d10"]
- };
- ClassList.bard.features["magical secrets"] = {//added more magical secrets
- name : "Magical Secrets",
- source : [["SRD", 13], ["P", 54], ["ELC", 7]],
- minlevel : 10,
- description : "\n " + "I can add two spells/cantrips from any class to my spells known; +2 at level 14 \u0026 18",
- additional : levels.map(function (n) {//added more magical secrets
- return n < 10 ? "" : (n < 14 ? 2 : n < 18 ? 4 : n < 23 ? 6 : n < 26 ? 8 : n < 33 ? 10 : 12) + " spells/cantrips";
- }),
- spellcastingBonus : {
- name : "Magical Secret",
- "class" : "any",
- times : levels.map(function (n) {//added more magical secrets
- return n < 10 ? 0 : n < 14 ? 2 : n < 18 ? 4 : n < 23 ? 6 : n < 26 ? 8 : n < 33 ? 10 : 12;
- })
- }
- };
- ClassList.bard.features["musical expertise"] = {//epic feature
- name : "Musical Expertise",
- source : ["ELC", 7],
- minlevel : 21,
- description : "\n " + "I gain expertise in 3 musical instruments you have proficiency in.",
- };
- ClassList.bard.features["improved bardic inspiration"] = {//epic feature
- name : "Improved Bardic Inspiration",
- source : ["ELC", 7],
- minlevel : 30,
- description : "\n " + "My bardic inspiration now lasts all day",
- };
- ClassList.bard.features["epic inspiration"] = {//epic feature
- name : "Epic Inspiration",
- source : ["ELC", 7],
- minlevel : 40,
- description : "\n " + "I have \u221E\u00D7 bardic inspiration",
- };
- //Cleric
- ClassList.cleric.improvements = [0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 10, 10];
- ClassList.cleric.attacks = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
- ClassList.cleric.spellcastingKnown = {//level 40 array
- cantrips : [3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5],//level 40 array
- spells : "list",
- prepared : true
- };
- ClassList.cleric.features["spellcasting"] = {//level 40 array
- name : "Spellcasting",
- source : [["SRD", 15], ["P", 58], ["ELC", 9]],
- minlevel : 1,
- description : "\n " + "I can cast prepared cleric cantrips/spells, using Wisdom as my spellcasting ability" + "\n " + "I can use a holy symbol as a spellcasting focus for my cleric spells" + "\n " + "I can cast my prepared cleric spells as rituals if they have the ritual tag",
- additional : levels.map(function (n, idx) {//level 40 array
- return [3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5][idx] + " cantrips known";
- })
- };
- ClassList.cleric.features["channel divinity"] = {// added 4th and 5th channel divinity
- name : "Channel Divinity",
- source : [["SRD", 16], ["P", 58], ["ELC", 9]],
- minlevel : 2,
- description : "\n " + "I can channel divine energy to cause an effect; the save for this is my cleric spell DC",
- usages : [0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5],//level 40 array
- recovery : "short rest"
- };
- ClassList.cleric.features["destroy undead"] = {//level 40 array
- name : "Destroy Undead",
- source : [["SRD", 17], ["P", 59], ["ELC", 10]],
- minlevel : 5,
- additional : ["", "", "", "", "CR \u00BD or lower", "CR \u00BD or lower", "CR \u00BD or lower", "CR 1 or lower", "CR 1 or lower", "CR 1 or lower", "CR 2 or lower", "CR 2 or lower", "CR 2 or lower", "CR 3 or lower", "CR 3 or lower", "CR 3 or lower", "CR 4 or lower", "CR 4 or lower", "CR 4 or lower", "CR 4 or lower", "CR 4 or lower", "CR 4 or lower", "CR 5 or lower", "CR 5 or lower", "CR 5 or lower", "CR 6 or lower", "CR 6 or lower", "CR 6 or lower", "CR 7 or lower", "CR 7 or lower", "CR 7 or lower", "CR 8 or lower", "CR 8 or lower", "CR 8 or lower", "CR 9 or lower", "CR 9 or lower", "CR 9 or lower", "CR 10 or lower", "CR 10 or lower", "CR 10 or lower"],//level 40 array
- description : "\n " + "An undead up to the CR above that fails its save when I use Turn Undead is destroyed"
- };
- ClassList.cleric.features["divine intervention"] = {
- name : "Divine Intervention",
- source : [["SRD", 17], ["P", 59], ["ELC", 9]],
- minlevel : 10,
- additional : ["", "", "", "", "", "", "", "", "", "10% chance", "11% chance", "12% chance", "13% chance", "14% chance", "15% chance", "16% chance", "17% chance", "18% chance", "19% chance", "100% chance", "100% chance", "100% chance", "100% chance", "100% chance", "100% chance", "100% chance", "100% chance", "100% chance", "100% chance", "100% chance", "100% chance", "100% chance", "100% chance", "100% chance", "100% chance", "100% chance", "100% chance", "100% chance", "100% chance", "100% chance"],
- usages : 1,
- recovery : "long rest",
- description : "\n " + "As an action, I can implore my deity for help; the DM determines the form of help" + "\n " + "Without intervention, I can retry after a long rest; otherwise, I have to wait a week",
- action : ["action", ""]
- };
- ClassList.cleric.features["epic divine intervention"] = {//epic feature
- name : "Epic Divine Intervention",
- source : ["ELC", 9],
- minlevel : 30,
- additional : ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "30% chance", "31% chance", "32% chance", "33% chance", "34% chance", "35% chance", "36% chance", "37% chance", "38% chance", "39% chance", "100% chance"],
- usages : 1,
- recovery : "long rest",
- description : "\n " + "As an action, I can implore my deity for help equal to that of an epic spell; the DM determines the form of help" + "\n " + "Without intervention, I can retry after a long rest; otherwise, I have to wait a week",
- action : ["action", ""]
- };
- ClassList.cleric.features["channel divinity improvement"] = {//epic feature
- name : "Channel Divinity Improvement",
- source : ["ELC", 9],
- minlevel : 34,
- description : "\n " + "as an additional effect, I can recover up to a 7th level spell slot or regain HP up to my cleric level",
- };
- //Druid good as it's gonna get for now
- ClassList.druid.improvements = [0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 10, 10, 10, 11, 11];
- ClassList.druid.attacks = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
- ClassList.druid.spellcastingKnown = {
- cantrips : [2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4],
- spells : "list",
- prepared : true
- };
- ClassList.druid.features["spellcasting"] = {
- name : "Spellcasting",
- source : [["SRD", 19], ["P", 66], ["ELC", 13]],
- minlevel : 1,
- description : "\n " + "I can cast prepared druid cantrips/spells, using Wisdom as my spellcasting ability" + "\n " + "I can use a druidic focus as a spellcasting focus for my druid spells" + "\n " + "I can cast my prepared druid spells as rituals if they have the ritual tag",
- additional : levels.map(function (n, idx) {
- return [2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4][idx] + " cantrips known";
- })
- };
- ClassList.druid.features["subclassfeature2.wild shape"] = {//lvl40 array, added wild shape continuation
- name : "Wild Shape",
- source : [["SRD", 20], ["P", 66], ["ELC", 13]],
- minlevel : 2,
- description : "\n " + "As an action, I assume the shape of a beast I have seen before with the following rules:" + "\n - " + "I gain all its game statistics except Intelligence, Wisdom, or Charisma" + "\n - " + "I get its skill/saving throw prof. while keeping my own, using whichever is higher" + "\n - " + "I assume the beast's HP and HD; I get mine back when I revert back" + "\n - " + "I can't cast spells in beast form, but transforming doesn't break concentration" + "\n - " + "I retain features from class, race, etc., but I don't retain special senses" + "\n - " + "I can choose whether equipment falls to the ground, merges, or stays worn" + "\n - " + "I revert if out of time or unconscious; if KOd by damage, excess damage carries over",
- usages : [0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, "\u221E\u00D7 per ", "\u221E\u00D7 per ", "\u221E\u00D7 per ", "\u221E\u00D7 per ", "\u221E\u00D7 per ", "\u221E\u00D7 per ", "\u221E\u00D7 per ", "\u221E\u00D7 per ", "\u221E\u00D7 per ", "\u221E\u00D7 per ", "\u221E\u00D7 per ", "\u221E\u00D7 per ", "\u221E\u00D7 per ", "\u221E\u00D7 per ", "\u221E\u00D7 per ", "\u221E\u00D7 per ", "\u221E\u00D7 per ", "\u221E\u00D7 per ", "\u221E\u00D7 per ", "\u221E\u00D7 per ", "\u221E\u00D7 per ",],
- recovery : "short rest",
- additional : levels.map(function (n) {
- if (n < 2) return "";
- var cr = n < 4 ? "1/4" : n < 8 ? "1/2" : n < 23 ? 1 : Math.floor(n/8) ;
- var hr = Math.floor(n/2);
- var restr = n < 4 ? ", no fly/swim" : n < 8 ? ", no fly" : "";
- return "CR " + cr + restr + "; " + hr + (restr.length ? " h" : " hours");
- }),
- action : [["action", " (start)"], ["bonus action", " (end)"]]
- };
- ClassList.druid.features["improved wild shape"] = {//sorry no clue how to do this yet
- name : "Improved Wild Shape",
- source : ["ELC", 13],
- minlevel : 25,
- description : "\n " + "My wild shape now has +50hp and +10 damage"
- };
- ClassList.druid.features["wild shape attack"] = {//sorry no clue how to do this yet
- name : "Wild Shape Attack",
- source : ["ELC", 13],
- minlevel : 30,
- description : "\n " + "all wild shape get an extra attack"
- };
- ClassList.druid.features["epic arch druid"] = {//sorry no clue how to do this yet
- name : "Epic Arch Druid",
- source : ["ELC", 13],
- minlevel : 40,
- description : "\n " + "I can wild shape into an ancient dragon of CR 30 or lower once per short rest"
- };
- //Fighter
- ClassList.fighter.improvements = [0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12];
- ClassList.fighter.attacks = [1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 7];
- ClassList.fighter.features["fighting style"] = {//changed
- name : "Fighting Style",
- source : [["SRD", 24], ["P", 72], ["ELC", 16]],
- minlevel : 1,
- description : "\n " + "Choose a Fighting Style for the fighter using the \"Choose Feature\" button above",
- choices : ["Archery", "Defense", "Dueling", "Great Weapon Fighting", "Protection", "Two-Weapon Fighting"],
- "archery" : FightingStyles.archery,
- "defense" : FightingStyles.defense,
- "dueling" : FightingStyles.dueling,
- "great weapon fighting" : FightingStyles.great_weapon,
- "protection" : FightingStyles.protection,
- "two-weapon fighting" : FightingStyles.two_weapon,
- choiceDependencies : [{
- feature : "improved fighting style"
- }]
- };
- ClassList.fighter.features["second wind"] = {//improvement
- name : "Second Wind",
- source : [["SRD", 24], ["P", 72], ["ELC", 16]],
- minlevel : 1,
- description : "\n " + "As a bonus action, I regain HP; I can use this once per short rest",//changed text
- additional : levels.map(function (n) {
- return n < 25 ? "1d10+" + n : n + "d10";//changed this function to include n+d10
- }),
- usages : [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2],
- recovery : "short rest",
- action : ["bonus action", ""]
- };
- ClassList.fighter.features["action surge"] = {//added to arrays
- name : "Action Surge",
- source : [["SRD", 25], ["P", 72], ["ELC", 16]],
- minlevel : 2,
- description : "\n " + "I can take one additional action on my turn on top of my normally allowed actions",
- usages : [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4],//lvl40 array,
- recovery : "short rest"
- };
- ClassList.fighter.features["indomitable"] = {//added to arrays
- name : "Indomitable",
- source : [["SRD", 25], ["P", 72], ["ELC", 16]],
- minlevel : 9,
- description : "\n " + "I can reroll a failed saving throw, but must keep the new result",
- usages : [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7],//lvl40 array
- recovery : "long rest"
- };
- ClassList.fighter.features["improved fighting style"] = {//epic feature
- name : "Improved Fighting Style",
- source : ["ELC", 16],
- minlevel : 21,
- description : "\n " + "my fighting style has improved",
- choices : ["Archery", "Defense", "Dueling", "Great Weapon Fighting", "Protection", "Two-Weapon Fighting"],
- choicesNotInMenu : true,
- "archery" : FightingStyles.archery2,
- "defense" : FightingStyles.defense2,
- "dueling" : FightingStyles.dueling2,
- "great weapon fighting" : FightingStyles.great_weapon2,
- "protection" : FightingStyles.protection2,
- "two-weapon fighting" : FightingStyles.two_weapon2
- };
- //Monk
- ClassList.monk.improvements = [0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 10, 10, 10, 11, 11];
- ClassList.monk.attacks = [1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3];
- ClassList.monk.features["martial arts"] = {//changed
- name : "Martial Arts",
- source : [["SRD", 26], ["P", 78], ["ELC", 20]],
- minlevel : 1,
- description : desc([
- "Monk weapons: any simple melee (not two-handed/heavy), unarmed strike, shortsword",
- "With monk weapons, I can use Dex instead of Str and use the Martial Arts damage die",
- "When taking an Attack action with these, I get one unarmed strike as a bonus action"
- ]),
- additional : levels.map(function (n) {
- return "1d" + (n < 5 ? 4 : n < 11 ? 6 : n < 17 ? 8 : n < 23 ? 10 : n < 29 ? 12 : n < 35 ? 16 : 20);
- }),
- action : ["bonus action", " (with Attack action)"],
- eval : function() {
- AddString('Extra.Notes', 'Monk features:\n\u25C6 Lose Unarmored Defense, Martial Arts, and Unarmored Movement with armor/shields', true);
- show3rdPageNotes();
- },
- removeeval : function() {
- RemoveString('Extra.Notes', 'Monk features:\n\u25C6 Lose Unarmored Defense, Martial Arts, and Unarmored Movement with armor/shields', true);
- },
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (classes.known.monk && classes.known.monk.level && (v.theWea.monkweapon || v.baseWeaponName == "unarmed strike" || v.baseWeaponName == "shortsword" || (v.isMeleeWeapon && (/simple/i).test(v.theWea.type) && !(/heavy|(2|two).?hand(ed)?s?/i).test(v.theWea.description)))) {
- var aMonkDie = function (n) { return n < 5 ? 4 : n < 11 ? 6 : n < 17 ? 8 : n < 23 ? 10 : n < 29 ? 12 : n < 35 ? 16 : 20; }(classes.known.monk.level);
- try {
- var curDie = eval(fields.Damage_Die.replace('d', '*'));
- } catch (e) {
- var curDie = 'x';
- };
- if (isNaN(curDie) || curDie < aMonkDie) {
- fields.Damage_Die = '1d' + aMonkDie;
- };
- if (fields.Mod == 1 || fields.Mod == 2 || What(AbilityScores.abbreviations[fields.Mod - 1] + " Mod") < What(AbilityScores.abbreviations[v.StrDex - 1] + " Mod")) {
- fields.Mod = v.StrDex;
- }
- };
- },
- "I can use either Strength or Dexterity and my Martial Arts damage die in place of the normal damage die for any 'Monk Weapons', which include unarmed strike, shortsword, and any simple melee weapon that is not two-handed or heavy."
- ]
- }
- };
- ClassList.monk.features["ki"] = {//changed
- name : "Ki",
- source : [["SRD", 27], ["P", 78], ["ELC", 20]],
- minlevel : 2,
- description : "\n " + "I can spend ki to fuel special actions (see third page)" + "\n " + "I need to meditate for at least 30 min of a short rest for that short rest to restore ki",
- usages : ["", 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40],//change
- recovery : "short rest",
- "flurry of blows" : {
- name : "Flurry of Blows",
- source : [["SRD", 27], ["P", 78]],
- description : " [1 ki point]" + "\n " + "After taking the Attack action, I can make 2 unarmed attacks as a bonus action",
- action : ["bonus action", " (after Attack action)"]
- },
- "patient defense" : {
- name : "Patient Defense",
- source : [["SRD", 27], ["P", 78]],
- description : " [1 ki point]" + "\n " + "As a bonus action, I can take the Dodge action",
- action : ["bonus action", ""]
- },
- "step of the wind" : {
- name : "Step of the Wind",
- source : [["SRD", 27], ["P", 78]],
- description : " [1 ki point]" + "\n " + "As a bonus action, I can either Dash or Disengage; My jump distance doubles when I do so",
- action : ["bonus action", ""]
- },
- "stunning strike" : {
- name : "Stunning Strike",
- source : [["SRD", 27], ["P", 79]],
- description : " [1 ki point]" + "\n " + "After I hit a creature with a melee weapon attack, I can spend a ki point to try to stun it" + "\n " + "It has to succeed on a Con save or be stunned until the end of my next turn"
- },
- autoSelectExtrachoices : [{
- extrachoice : "flurry of blows",
- extraname : "Ki Feature"
- }, {
- extrachoice : "patient defense",
- extraname : "Ki Feature"
- }, {
- extrachoice : "step of the wind",
- extraname : "Ki Feature"
- }, {
- extrachoice : "stunning strike",
- extraname : "Monk 5",
- minlevel : 5
- }]
- };
- ClassList.monk.features["unarmored movement"] = {//changed
- name : "Unarmored Movement",
- source : [["SRD", 27], ["P", 78], ["ELC", 20]],
- minlevel : 2,
- description : "\n " + "Speed increases and eventually lets me traverse some surfaces without falling as I move",
- additional : levels.map(function (n) {
- if (n < 2) return "";
- var spd = "+" + (n < 6 ? 10 : n < 10 ? 15 : n < 14 ? 20 : n < 18 ? 25 : n < 22 ? 30 : n < 26 ? 35 : n < 30 ? 40 : n < 34 ? 45 : n < 38 ? 50 : 55) + " ft";
- var xtr = n < 9 ? "" : "; Vertical surfaces and liquids";
- return spd + xtr;
- }),
- changeeval : function (v) {
- var monkSpd = '+' + (v[1] < 2 ? 0 : v[1] < 6 ? 10 : v[1] < 10 ? 15 : v[1] < 14 ? 20 : v[1] < 18 ? 25 : v[1] < 22 ? 30 : v[1] < 26 ? 35 : v[1] < 30 ? 40 : v[1] < 34 ? 45 : v[1] < 38 ? 50 : 55);
- SetProf('speed', monkSpd !== '+0', {allModes : monkSpd}, "Monk: Unarmored Movement");
- }
- };
- ClassList.monk.features["perfect self"] = {// improved perfect self
- name : "Perfect Self",
- source : [["SRD", 28], ["P", 79], ["ELC", 20]],
- minlevel : 20,
- description : "\n " + "I regain ki points if I have no more remaining when I roll initiative",
- additional : levels.map(function (n) {
- if (n < 20) return "";
- return "+" + (n < 35 ? 4 : 12) + "ki points";
- }),
- };
- ClassList.monk.features["purity of sight"] = {//epic feature
- name : "Purity of Sight",
- source : [["ELC", 20]],
- minlevel : 21,
- description : "\n " + "I gain 120 ft truesight",
- vision : [["Truesight", 120]]
- };
- ClassList.monk.features["unerring strikes"] = {//epic feature
- name : "Unerring Strikes",
- source : [["ELC", 20]],
- minlevel : 23,
- description : "\n " + "My unarmed strikes add my wis mod To Hit",
- calcChanges : {
- atkCalc : [
- function (fields, v, output) {
- if (classes.known.monk && classes.known.monk.level && (v.theWea.monkweapon || v.baseWeaponName == "unarmed strike" || v.baseWeaponName == "shortsword" || (v.isMeleeWeapon && (/simple/i).test(v.theWea.type) && !(/heavy|(2|two).?hand(ed)?s?/i).test(v.theWea.description)))) output.extraHit += What('Wis Mod');
- },
- "My unarmed strikes add my wis mod To Hit."
- ]}
- };
- ClassList.monk.features["ki infused strikes"] = {//epic feature
- name : "Ki Infused Strikes",
- source : [["ELC", 20]],
- minlevel : 25,
- description : "\n " + "My unarmed strikes add my wis mod to dmg",
- calcChanges : {
- atkCalc : [
- function (fields, v, output) {
- if (classes.known.monk && classes.known.monk.level && (v.theWea.monkweapon || v.baseWeaponName == "unarmed strike" || v.baseWeaponName == "shortsword" || (v.isMeleeWeapon && (/simple/i).test(v.theWea.type) && !(/heavy|(2|two).?hand(ed)?s?/i).test(v.theWea.description)))) output.extraDmg += What('Wis Mod');
- },
- "My unarmed strikes add my wis mod To dmg."
- ]}
- };
- ClassList.monk.features["resilient body"] = {//epic feature
- name : "Resilient Body",
- source : [["ELC", 20]],
- minlevel : 26,
- description : "\n " + "I am immune to being stunned, petrified, and paralyzed",
- savetxt : {
- immune : ["stunned", "petrified", "paralyzed"],
- },
- };
- ClassList.monk.features["magic resistance"] = {//epic feature
- name : "Magic Resistance",
- source : [["ELC", 20]],
- minlevel : 29,
- description : "\n " + "I have adv. vs spells and res. against spell dmg.",
- savetxt : {
- adv_vs : ["spells"]
- },
- dmgres : ["Spells"],
- };
- ClassList.monk.features["tempered body"] = {//epic feature
- name : "Tempered Body",
- source : [["ELC", 20]],
- minlevel : 33,
- description : "\n " + "I no longer suffer exhaustion from extreme climate; I have res. vs. cold, fire, lightning, thunder, \u0026 acid",
- dmgres : ["cold", "fire", "lightning", "thunder", "acid"],
- };
- ClassList.monk.features["enduring soul"] = {//epic feature
- name : "Enduring Soul",
- source : [["ELC", 20]],
- minlevel : 37,
- description : "\n " + "I an immune to exhaustion",
- savetxt : {
- immune : ["exhaustion"],
- },
- };
- ClassList.monk.features["pristine soul"] = {//epic feature
- name : "Pristine Soul",
- source : [["ELC", 20]],
- minlevel : 40,
- description : "\n " + "I get double proficieny bonus to all saving throws",
- addMod : { type : "save", field : "All", mod : "Prof", text : "I can add my Prof to all save rolls." },
- };
- //Paladin
- ClassList.paladin.improvements = [0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 10, 10];
- ClassList.paladin.attacks = [1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3];
- ClassList.paladin.features["lay on hands"] = {
- name : "Lay on Hands",
- source : [["SRD", 31], ["P", 84], ["ELC", 23]],
- minlevel : 1,
- description : "\n " + "As an action, I can use points in my pool to heal a touched, living creature's hit points" + "\n " + "I can neutralize poisons/diseases instead at a cost of 5 points per affliction",
- usages : [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100, 105, 110, 115, 120, 125, 130, 135, 140, 145, 150, 155, 160, 165, 170, 175, 180, 185, 190, 195, 200],
- recovery : "long rest",
- action : ["action", ""]
- };
- ClassList.paladin.features["fighting style"] = {//changed
- name : "Fighting Style",
- source : [["SRD", 31], ["P", 84], ["ELC", 23]],
- minlevel : 2,
- description : "\n " + "Choose a Fighting Style for the paladin using the \"Choose Feature\" button above",
- choices : ["Defense", "Dueling", "Great Weapon Fighting", "Protection"],
- "defense" : FightingStyles.defense,
- "dueling" : FightingStyles.dueling,
- "great weapon fighting" : FightingStyles.great_weapon,
- "protection" : FightingStyles.protection,
- choiceDependencies : [{
- feature : "improved fighting style"
- }]
- };
- ClassList.paladin.features["divine smite"] = {//changed for improved smite
- name : "Divine Smite",
- source : [["SRD", 31], ["P", 85], ["ELC", 23]],
- minlevel : 2,
- description : desc([
- "When I hit a melee weapon attack, I can expend a spell slot to do radiant damage;",
- "This increases by +1 die for each spell slot level above 1st and +1 die against undead/fiends"
- ]),
- additional : levels.map(function (n) {
- if (n < 2) return "";
- var smt = "+" + (n < 38 ? 2 : 3);
- var die = n < 25 ? "d8" : "d12";
- return smt + die;
- })
- };
- ClassList.paladin.features["subclassfeature3.0-channel divinity"] = {// made uses into 40lvlv array
- name : "Channel Divinity",
- source : [["SRD", 32], ["P", 85]],
- minlevel : 3,
- description : "",
- usages : [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 6, 6, 6, 6],
- recovery : "short rest"
- };
- ClassList.paladin.features["aura of protection"] = {//added aura improvement
- name : "Aura of Protection",
- source : [["SRD", 32], ["P", 85]],
- minlevel : 6,
- description : "\n " + "While I'm conscious, allies within range and I can add my Cha mod (min 1) to saves",
- additional : ["", "", "", "", "", "10-foot aura", "10-foot aura", "10-foot aura", "10-foot aura", "10-foot aura", "10-foot aura", "10-foot aura", "10-foot aura", "10-foot aura", "10-foot aura", "10-foot aura", "10-foot aura", "30-foot aura", "30-foot aura", "30-foot aura", "30-foot aura", "30-foot aura", "30-foot aura", "30-foot aura", "90-foot aura", "90-foot aura", "90-foot aura", "90-foot aura", "90-foot aura", "90-foot aura", "90-foot aura", "90-foot aura", "90-foot aura", "90-foot aura", "90-foot aura", "90-foot aura", "90-foot aura", "90-foot aura", "90-foot aura", "90-foot aura"],
- addMod : { type : "save", field : "all", mod : "Cha", text : "While I'm conscious I can add my Charisma modifier (min 1) to all my saving throws." }
- };
- ClassList.paladin.features["aura of courage"] = {//added aura improvement
- name : "Aura of Courage",
- source : [["SRD", 32], ["P", 85]],
- minlevel : 10,
- description : "\n " + "While I'm conscious, allies within range and I can't be frightened",
- additional : ["", "", "", "", "", "", "", "", "", "10-foot aura", "10-foot aura", "10-foot aura", "10-foot aura", "10-foot aura", "10-foot aura", "10-foot aura", "10-foot aura", "30-foot aura", "30-foot aura", "30-foot aura", "30-foot aura", "30-foot aura", "30-foot aura", "30-foot aura", "90-foot aura", "90-foot aura", "90-foot aura", "90-foot aura", "90-foot aura", "90-foot aura", "90-foot aura", "90-foot aura", "90-foot aura", "90-foot aura", "90-foot aura", "90-foot aura", "90-foot aura", "90-foot aura", "90-foot aura", "90-foot aura"],
- savetxt : { immune : ["frightened"] }
- };
- ClassList.paladin.features["improved divine smite"] = {//changed for improved smite
- name : "Improved Divine Smite",
- source : [["SRD", 32], ["P", 85], ["ELC", 23]],
- minlevel : 11,
- description : "\n " + "Whenever I hit a creature with a melee weapon, I do extra radiant damage",
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.isMeleeWeapon) {
- v.smiteDmg = classes.known.paladin.level < 38 ? 1 : 2;
- v.smiteDie = classes.known.paladin.level < 25 ? 'd8' : 'd12';
- fields.Description += (fields.Description ? '; ' : '') + '+' + v.smiteDmg + v.smiteDie + ' Radiant damage';
- };
- },
- "With my melee weapon attacks I deal extra radiant damage"
- ]
- }
- };
- ClassList.paladin.features["improved fighting style"] = {//epic feature
- name : "Improved Fighting Style",
- source : ["ELC", 23],
- minlevel : 21,
- description : "\n " + "my fighting style has improved",
- choices : ["Defense", "Dueling", "Great Weapon Fighting", "Protection"],
- choicesNotInMenu : true,
- "defense" : FightingStyles.defense2,
- "dueling" : FightingStyles.dueling2,
- "great weapon fighting" : FightingStyles.great_weapon2,
- "protection" : FightingStyles.protection2,
- };
- ClassList.paladin.features["continued spellcasting"] = {
- name : "Continued Spellcasting",
- source : ["ELC", 24],
- minlevel : 21,
- description : "\n " + "I know cleric spells for 6+ level spells",
- };
- ClassList.paladin.features["divine enforcement"] = {
- name : "Divine Enforcement",
- source : ["ELC", 24],
- minlevel : 34,
- description : "\n " + "I gain +20 to a saving throw score of my choice",
- choices : ["STR", "DEX", "CON", "INT", "WIS", "CHA"],
- "str" : {
- name : "STR",
- description : "\n " + "I gain +20 to my STR saving throw score",
- addMod : { type : "save", field : "str", mod : 20, text : "I gain +20 to my STR saving throw score." }
- },
- "dex" : {
- name : "DEX",
- description : "\n " + "I gain +20 to my DEX saving throw score",
- addMod : { type : "save", field : "dex", mod : 20, text : "I gain +20 to my DEX saving throw score." }
- },
- "con" : {
- name : "CON",
- description : "\n " + "I gain +20 to my CON saving throw score",
- addMod : { type : "save", field : "con", mod : 20, text : "I gain +20 to my CON saving throw score." }
- },
- "int" : {
- name : "INT",
- description : "\n " + "I gain +20 to my INT saving throw score",
- addMod : { type : "save", field : "int", mod : 20, text : "I gain +20 to my INT saving throw score." }
- },
- "wis" : {
- name : "WIS",
- description : "\n " + "I gain +20 to my WIS saving throw score",
- addMod : { type : "save", field : "wis", mod : 20, text : "I gain +20 to my WIS saving throw score." }
- },
- "cha" : {
- name : "CHA",
- description : "\n " + "I gain +20 to my CHA saving throw score",
- addMod : { type : "save", field : "cha", mod : 20, text : "I gain +20 to my CHA saving throw score." }
- },
- };
- ClassList.paladin.features["epic divine smite"] = {
- name : "Epic Divine Smite",
- source : ["ELC", 24],
- minlevel : 38,
- description : "\n " + "Damage spells deal +1d12 radient damage",
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.isSpell) {
- fields.Description += (fields.Description ? '; ' : '') + '+1d12 Radiant damage';
- };
- },
- "Damage spells deal +1d12 radient damage"
- ]
- }
- };
- ClassList.paladin.features["continued spellcasting"] = {
- name : "Continued Spellcasting",
- source : ["ELC", 29],
- minlevel : 21,
- description : "\n " + "Paladin use the cleric spell list for spells SL6+.",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "paladin" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["blade barrier", "create undead", "find the path", "forbiddance", "harm", "heal", "heroes' feast", "planar ally", "true seeing", "word of recall", "conjure celestial", "divine word", "etherealness", "fire storm", "plane shift", "regenerate", "resurrection", "symbol", "temple of the gods", "antimagic field", "control weather", "earthquake", "holy aura", "astral projection", "gate", "mass heal", "true resurrection"]);
- },
- "This class feature adds SL6+ cleric spells to the paladin."
- ]
- }
- };
- //Ranger
- ClassList.ranger.improvements = [0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 10, 10];
- ClassList.ranger.attacks = [1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3];
- ClassList.ranger.spellcastingKnown = {
- spells : [0, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21]//changed
- };
- ClassList.ranger.features["favored enemy"] = {//added favored enemies at 29 and 35
- name : "Favored Enemy",
- source : [["SRD", 35], ["P", 91], ["ELC", 27]],
- minlevel : 1,
- description : "\n " + "Use the \"Choose Feature\" button above to add a favored enemy to the third page" + "\n " + "When selecting a favored enemy, I also learn one of the languages it speaks" + "\n " + "I have adv. on Wis (Survival) checks to track and Int checks to recall info about them",
- additional : levels.map(function (n) {
- return n < 6 ? "1 favored enemy" : (n < 14 ? 2 : n < 29 ? 3 : n < 35 ? 4 : 5) + " favored enemies";
- }),
- extraname : "Favored Enemy",
- extrachoices : ["Aberrations", "Beasts", "Celestials", "Constructs", "Dragons", "Elementals", "Fey", "Fiends", "Giants", "Monstrosities", "Oozes", "Plants", "Undead", "Two Races of Humanoids"],
- extraTimes : levels.map(function (n) { return n < 6 ? 1 : n < 14 ? 2 : n < 29 ? 3 : n < 35 ? 4 : 5; }),
- "aberrations" : {
- name : "Aberrations",
- description : "",
- source : [["SRD", 35], ["P", 91]],
- languageProfs : [1]
- },
- "beasts" : {
- name : "Beasts",
- description : "",
- source : [["SRD", 35], ["P", 91]],
- languageProfs : [1]
- },
- "celestials" : {
- name : "Celestials",
- description : "",
- source : [["SRD", 35], ["P", 91]],
- languageProfs : [1]
- },
- "constructs" : {
- name : "Constructs",
- description : "",
- source : [["SRD", 35], ["P", 91]],
- languageProfs : [1]
- },
- "dragons" : {
- name : "Dragons",
- description : "",
- source : [["SRD", 35], ["P", 91]],
- languageProfs : [1]
- },
- "elementals" : {
- name : "Elementals",
- description : "",
- source : [["SRD", 35], ["P", 91]],
- languageProfs : [1]
- },
- "fey" : {
- name : "Fey",
- description : "",
- source : [["SRD", 35], ["P", 91]],
- languageProfs : [1]
- },
- "fiends" : {
- name : "Fiends",
- description : "",
- source : [["SRD", 35], ["P", 91]],
- languageProfs : [1]
- },
- "giants" : {
- name : "Giants",
- description : "",
- source : [["SRD", 35], ["P", 91]],
- languageProfs : [1]
- },
- "monstrosities" : {
- name : "Monstrosities",
- description : "",
- source : [["SRD", 35], ["P", 91]],
- languageProfs : [1]
- },
- "oozes" : {
- name : "Oozes",
- description : "",
- source : [["SRD", 35], ["P", 91]],
- languageProfs : [1]
- },
- "plants" : {
- name : "Plants",
- description : "",
- source : [["SRD", 35], ["P", 91]],
- languageProfs : [1]
- },
- "undead" : {
- name : "Undead",
- description : "",
- source : [["SRD", 35], ["P", 91]],
- languageProfs : [1]
- },
- "two races of humanoids" : {
- name : "Two Races of Humanoids",
- description : "",
- source : [["SRD", 35], ["P", 91]],
- languageProfs : [1]
- }
- };
- ClassList.ranger.features["fighting style"] = {
- name : "Fighting Style",
- source : [["SRD", 36], ["P", 91], ["ELC", 27]],
- minlevel : 2,
- description : "\n " + "Choose a Fighting Style for the ranger using the \"Choose Feature\" button above",
- choices : ["Archery", "Defense", "Dueling", "Two-Weapon Fighting"],
- "archery" : FightingStyles.archery,
- "defense" : FightingStyles.defense,
- "dueling" : FightingStyles.dueling,
- "two-weapon fighting" : FightingStyles.two_weapon,
- choiceDependencies : [{
- feature : "improved fighting style"
- }]
- };
- ClassList.ranger.features["spellcasting"] = {//added array, changed text
- name : "Spellcasting",
- source : [["SRD", 36], ["P", 91], ["ELC", 27]],
- minlevel : 2,
- description : "\n " + "I can cast ranger spells that I know, using Wisdom as my spellcasting ability; I can know 6+ level druid spells",
- additional : levels.map(function (n, idx) {
- return n < 2 ? "" : [0, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21][idx] + " spells known";//changed
- })
- };
- ClassList.ranger.features["improved fighting style"] = {//epic feature
- name : "Improved Fighting Style",
- source : ["ELC", 27],
- minlevel : 21,
- description : "\n " + "my fighting style has improved",
- choices : ["Archery", "Defense", "Dueling", "Two-Weapon Fighting"],
- choicesNotInMenu : true,
- "archery" : FightingStyles.archery2,
- "defense" : FightingStyles.defense2,
- "dueling" : FightingStyles.dueling2,
- "two-weapon fighting" : FightingStyles.two_weapon2
- };
- ClassList.ranger.features["improved land's stride"] = {
- name : "Improved Land's Stride",
- source : ["ELC", 27],
- minlevel : 23,
- description : "\n " + "I can use Land's Stride on up 12 creatures within 60 ft. of me."
- };
- ClassList.ranger.features["favored enemy bonus"] = {
- name : "Favored Enemy Bonus",
- source : ["ELC", 27],
- minlevel : 25,
- description : "\n " + "I deal extra damage and have better saving throw vs. favored enemies.",
- additional : levels.map(function (n, idx) {
- var dmg = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 10, 10, 10, 10, 15, 15, 20, 20, 25, 25, 25, 25][idx];
- var sav = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 4, 4, 5, 5, 5, 5][idx];
- return "+" + dmg + " to dmg \u0026 +" + sav + " to saving throws";
- })
- };
- ClassList.ranger.features["improved vanish"] = {
- name : "Improved Vanish",
- source : ["ELC", 27],
- minlevel : 26,
- description : "\n " + "I can use Vanish on up 12 creatures within 60 ft. of me."
- };
- ClassList.ranger.features["second sense"] = {
- name : "Second Sense",
- source : ["ELC", 28],
- minlevel : 34,
- description : "\n " + "I can expand a spell slot to subtract 10 to a creature's attack roll vs me."
- };
- ClassList.ranger.features["improved foe slayer"] = {
- name : "improved foe slayer",
- source : ["ELC", 28],
- minlevel : 40,
- description : "\n " + "Foe slayer now works on all attack and damage rolls; This bonus doubles vs favored enemies."
- };
- ClassList.ranger.features["continued spellcasting"] = {
- name : "Continued Spellcasting",
- source : ["ELC", 29],
- minlevel : 21,
- description : "\n " + "Ranger use the druid spell list for spells SL6+.",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "ranger" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["bones of the earth", "conjure fey", "druid grove", "find the path", "heal", "heroes' feast", "investiture of flame", "investiture of ice", "investiture of stone", "investiture of wind", "move earth", "primordial ward", "sunbeam", "transport via plants", "wall of thorns", "wind walk", "fire storm", "mirage arcane", "plane shift", "regenerate", "reverse gravity", "whirlwind", "animal shapes", "antipathy/sympathy", "control weather", "earthquake", "feeblemind", "sunburst", "tsunami", "foresight", "shapechange", "storm of vengeance", "true resurrection"]);
- },
- "This class feature adds SL6+ druid spells to the ranger."
- ]
- }
- };
- //Rogue
- ClassList.rogue.improvements = [0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 10, 10];
- ClassList.rogue.attacks = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
- ClassList.rogue.features["sneak attack"] = {// added improved and powerful sneak attack
- name : "Sneak Attack",
- source : [["SRD", 39], ["P", 96], ["ELC", 30]],
- minlevel : 1,
- description : "\n " + "Once per turn, I can add damage to finesse/ranged attack if I have adv." + "\n " + "I don't need adv. if a conscious ally is within 5 ft of the target and I don't have disadv.;",
- additional : levels.map(function (n) {
- var snk = Math.ceil(n / 2) + (n < 25 ? "" : n < 35 ? 5 : 10);
- var die = n < 34 ? "d6" : "d8";
- return snk + die;
- }),
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (classes.known.rogue && classes.known.rogue.level && !v.isSpell && !v.isDC && (v.isRangedWeapon || (/\bfinesse\b/i).test(fields.Description))) {
- v.sneakAtk = Math.ceil(classes.known.rogue.level / 2) + (classes.known.rogue.level < 25 ? "" : classes.known.rogue.level < 35 ? 5 : 10);
- v.sneakDie = classes.known.rogue.level < 34 ? "d6" : "d8";
- fields.Description += (fields.Description ? '; ' : '') + 'Sneak attack ' + v.sneakAtk + v.sneakDie;
- };
- },
- "Once per turn, when I attack with a ranged or finesse weapon while I have advantage or an conscious ally is within 5 ft of the target, I can add my sneak attack damage to the attack."
- ]
- }
- };
- ClassList.rogue.features["improved expertise"] = {
- name : "Improved Expertise",
- source : ["ELC", 30],
- minlevel : 21,
- description : "\n " + "I add prof to two skills/thieves' tools I have expertise in; two more at 26th level",
- skillstxt : "I add prof to two skills/thieves' tools I have expertise in; two more at 26th level",
- additional : levels.map(function (n) {
- return "with " + (n < 26 ? 2 : 4) + " skills";
- }),
- extraname : "Improved Expertise",
- extrachoices : ["Acrobatics", "Animal Handling", "Arcana", "Athletics", "Deception", "History", "Insight", "Intimidation", "Investigation", "Medicine", "Nature", "Perception", "Performance", "Persuasion", "Religion", "Sleight of Hand", "Stealth", "Survival", "Thieves' Tools"],
- extraTimes : levels.map(function (n) { return n < 26 ? 2 : 4; }),
- "acrobatics" : {
- name : "Acrobatics Double Expertise", description : "",
- source : ["ELC", 30],
- prereqeval : function(v) { return v.skillProfs.indexOf("Acrobatics") !== -1; },
- addMod : { type : "skill", field : "Acrobatics", mod : "prof", text : "I can stack my Prof mod again" }
- },
- "animal handling" : {
- name : "Animal Handling Double Expertise", description : "",
- source : ["ELC", 30],
- prereqeval : function(v) { return v.skillProfs.indexOf("Animal Handling") !== -1; },
- addMod : { type : "skill", field : "Animal Handling", mod : "prof", text : "I can stack my Prof mod again" }
- },
- "arcana" : {
- name : "Arcana Double Expertise", description : "",
- source : ["ELC", 30],
- prereqeval : function(v) { return v.skillProfs.indexOf("Arcana") !== -1; },
- addMod : { type : "skill", field : "Arcana", mod : "prof", text : "I can stack my Prof mod again" }
- },
- "athletics" : {
- name : "Athletics Double Expertise", description : "",
- source : ["ELC", 30],
- prereqeval : function(v) { return v.skillProfs.indexOf("Athletics") !== -1; },
- addMod : { type : "skill", field : "Athletics", mod : "prof", text : "I can stack my Prof mod again" }
- },
- "deception" : {
- name : "Deception Double Expertise", description : "",
- source : ["ELC", 30],
- prereqeval : function(v) { return v.skillProfs.indexOf("Deception") !== -1; },
- addMod : { type : "skill", field : "Deception", mod : "prof", text : "I can stack my Prof mod again" }
- },
- "history" : {
- name : "History Double Expertise", description : "",
- source : ["ELC", 30],
- prereqeval : function(v) { return v.skillProfs.indexOf("History") !== -1; },
- addMod : { type : "skill", field : "History", mod : "prof", text : "I can stack my Prof mod again" }
- },
- "insight" : {
- name : "Insight Double Expertise", description : "",
- source : ["ELC", 30],
- prereqeval : function(v) { return v.skillProfs.indexOf("Insight") !== -1; },
- addMod : { type : "skill", field : "Insight", mod : "prof", text : "I can stack my Prof mod again" }
- },
- "intimidation" : {
- name : "Intimidation Double Expertise", description : "",
- source : ["ELC", 30],
- prereqeval : function(v) { return v.skillProfs.indexOf("Intimidation") !== -1; },
- addMod : { type : "skill", field : "Intimidation", mod : "prof", text : "I can stack my Prof mod again" }
- },
- "investigation" : {
- name : "Investigation Double Expertise", description : "",
- source : ["ELC", 30],
- prereqeval : function(v) { return v.skillProfs.indexOf("Investigation") !== -1; },
- addMod : { type : "skill", field : "Investigation", mod : "prof", text : "I can stack my Prof mod again" }
- },
- "medicine" : {
- name : "Medicine Double Expertise", description : "",
- source : ["ELC", 30],
- prereqeval : function(v) { return v.skillProfs.indexOf("Medicine") !== -1; },
- addMod : { type : "skill", field : "Medicine", mod : "prof", text : "I can stack my Prof mod again" }
- },
- "nature" : {
- name : "Nature Double Expertise", description : "",
- source : ["ELC", 30],
- prereqeval : function(v) { return v.skillProfs.indexOf("Nature") !== -1; },
- addMod : { type : "skill", field : "Nature", mod : "prof", text : "I can stack my Prof mod again" }
- },
- "perception" : {
- name : "Perception Double Expertise", description : "",
- source : ["ELC", 30],
- prereqeval : function(v) { return v.skillProfs.indexOf("Perception") !== -1; },
- addMod : { type : "skill", field : "Perception", mod : "prof", text : "I can stack my Prof mod again" }
- },
- "performance" : {
- name : "Performance Double Expertise", description : "",
- source : ["ELC", 30],
- prereqeval : function(v) { return v.skillProfs.indexOf("Performance") !== -1; },
- addMod : { type : "skill", field : "Performance", mod : "prof", text : "I can stack my Prof mod again" }
- },
- "persuasion" : {
- name : "Persuasion Double Expertise", description : "",
- source : ["ELC", 30],
- prereqeval : function(v) { return v.skillProfs.indexOf("Persuasion") !== -1; },
- addMod : { type : "skill", field : "Persuasion", mod : "prof", text : "I can stack my Prof mod again" }
- },
- "religion" : {
- name : "Religion Double Expertise", description : "",
- source : ["ELC", 30],
- prereqeval : function(v) { return v.skillProfs.indexOf("Religion") !== -1; },
- addMod : { type : "skill", field : "Religion", mod : "prof", text : "I can stack my Prof mod again" }
- },
- "sleight of hand" : {
- name : "Sleight of Hand Double Expertise", description : "",
- source : ["ELC", 30],
- prereqeval : function(v) { return v.skillProfs.indexOf("Sleight of Hand") !== -1; },
- addMod : { type : "skill", field : "Sleight of Hand", mod : "prof", text : "I can stack my Prof mod again" }
- },
- "stealth" : {
- name : "Stealth Double Expertise", description : "",
- source : ["ELC", 30],
- prereqeval : function(v) { return v.skillProfs.indexOf("Stealth") !== -1; },
- addMod : { type : "skill", field : "Stealth", mod : "prof", text : "I can stack my Prof mod again" }
- },
- "survival" : {
- name : "Survival Double Expertise", description : "",
- source : ["ELC", 30],
- prereqeval : function(v) { return v.skillProfs.indexOf("Survival") !== -1; },
- addMod : { type : "skill", field : "Persuasion", mod : "prof", text : "I can stack my Prof mod again" }
- },
- "thieves' tools" : {//No clue, sorry
- name : "Thieves' Tools Double Expertise", description : "",
- source : ["ELC", 30],
- prereqeval : function(v) {
- return CurrentProfs.tool["thieves' tools"] || (/thieve.?s.{1,3}tools/i).test(v.toolProfs.toString());
- },
- eval : function () {
- if ((/thieve.?s.*tools/i).test(What('Too Text'))) {
- Checkbox('Too Exp', true);
- };
- },
- removeeval : function () {
- if ((/thieve.?s.*tools/i).test(What('Too Text'))) {
- Checkbox('Too Exp', false);
- };
- }
- }
- };
- ClassList.rogue.features["improved uncanny dodge"] = {
- name : "Improved Uncanny Dodge",
- source : ["ELC", 30],
- minlevel : 23,
- description : "\n " + "I can use uncanny dodge as a free action a limited number of times",
- usages : levels.map(function (n) { return n < 23 ? "" : n < 29 ? 30 : n < 37 ? 60 : 90; }),
- recovery : "long rest",
- };
- ClassList.rogue.features["improved cunning action"] = {
- name : "Improved Cunning Action",
- source : ["ELC", 30],
- minlevel : 30,
- description : "\n " + "I can use a free action to take the Dash, Disengage, or Hide action ontop of cunning action",
- };
- ClassList.rogue.features["improved blindsense"] = {
- name : "Improved Blindsense",
- source : ["ELC", 30],
- minlevel : 33,
- description : "\n " + "My blindsense improved to 30ft",
- vision : [["Blindsense", +30]]
- };
- ClassList.rogue.features["epic talent"] = {
- name : "Epic Talent",
- source : [["SRD", 40], ["P", 96]],
- minlevel : 40,
- description : "\n " + "If I make an ability check where I add my proficiency bonus, rolls of 18 or lower are 19; I also add my Int mod to all my skill and tool rolls",
- addMod : { type : "skill", field : "All", mod : "Int", text : "I can add my Intelligence modifier to all skill and tool rolls." }
- };
- //Sorcerer - extra meta-magics
- ClassList.sorcerer.improvements = [0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 10, 10];
- ClassList.sorcerer.attacks = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
- ClassList.sorcerer.spellcastingKnown = {//lv40 array
- cantrips : [4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6],
- spells : [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 12, 13, 13, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 19]
- };
- ClassList.sorcerer.features["spellcasting"] = {//lvl40 array
- name : "Spellcasting",
- source : [["SRD", 43], ["P", 101], ["ELC", 33]],
- minlevel : 1,
- description : "\n " + "I can cast sorcerer cantrips/spells that I know, using Charisma as my spellcasting ability" + "\n " + "I can use an arcane focus as a spellcasting focus for my sorcerer spells",
- additional : levels.map(function (n, idx) {
- var cantr = [4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6][idx];
- var splls = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 12, 13, 13, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 19][idx];
- return cantr + " cantrips \u0026 " + splls + " spells known";
- })
- };
- ClassList.sorcerer.features["font of magic"] = {//lvl 40 array
- name : "Font of Magic",
- source : [["SRD", 43], ["P", 101], ["ELC", 33]],
- minlevel : 2,
- description : desc([
- "As a bonus action, I can use sorcery points to create spell slots and vice versa",
- "I can convert spell slots to sorcery points at a rate of 1 point per spell slot level",
- "I can convert sorcery points to spell slots, which last until I finish a long rest, as follows:",
- "Level 1 for 2 sorcery points; level 2 for 3 sorcery points; level 3 for 5 sorcery points",
- "Level 4 for 6 sorcery points; level 5 for 7 sorcery points"
- ]),
- usages : [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40],
- recovery : "long rest",
- action : ["bonus action", "Font of Magic"],
- additional : "Sorcery Points",
- limfeaname : "Sorcery Points"
- };
- ClassList.sorcerer.features["metamagic"] = {//added improved metamagic, but not the choices as of yet
- name : "Metamagic",
- source : [["SRD", 44], ["P", 101], ["ELC", 33]],
- minlevel : 3,
- description : "\n " + "Use the \"Choose Feature\" button above to add a Metamagic option to the third page" + "\n " + "I can use only 1 Metamagic option on a spell unless otherwise written",
- additional : levels.map(function (n) {
- return n < 3 ? "" : (n < 10 ? 2 : n < 17 ? 3 : n < 23 ? 4 : n < 26 ? 5 : n < 33 ? 6 : n < 35 ? 7 : 8) + " known";
- }),
- extraname : "Metamagic Option",
- extrachoices : ["Careful Spell", "Distant Spell", "Empowered Spell", "Extended Spell", "Heightened Spell", "Quickened Spell", "Subtle Spell", "Twinned Spell"],
- extraTimes : levels.map(function (n) {
- return n < 3 ? 0 : n < 10 ? 2 : n < 17 ? 3 : n < 23 ? 4 : n < 26 ? 5 : n < 33 ? 6 : n < 35 ? 7 : 8;
- }),
- "careful spell" : {
- name : "Careful Spell",
- source : [["SRD", 44], ["P", 102]],
- description : " [1 sorcery point]" + "\n " + "If the spell allows a saving throw, I can protect Cha modifier number of creatures" + "\n " + "The selected creatures automatically succeed on their saving throws vs. the spell"
- },
- "distant spell" : {
- name : "Distant Spell",
- source : [["SRD", 44], ["P", 102]],
- description : " [1 sorcery point]" + "\n " + "I double the range of the spell or make the range 30 ft if the range was touch"
- },
- "empowered spell" : {
- name : "Empowered Spell",
- source : [["SRD", 44], ["P", 102]],
- description : " [1 sorcery point]" + "\n " + "If the spell uses damage dice, I can reroll my Charisma modifier number of damage dice" + "\n " + "I can Empower a spell even if I use another Metamagic option on it"
- },
- "extended spell" : {
- name : "Extended Spell",
- source : [["SRD", 44], ["P", 102]],
- description : " [1 sorcery point]" + "\n " + "If the spell has a duration of at least 1 min, I can double it, up to 24 hours"
- },
- "heightened spell" : {
- name : "Heightened Spell",
- source : [["SRD", 44], ["P", 102]],
- description : " [3 sorcery points]" + "\n " + "If the spell allows a saving throw, I can have one target get disadv. on their first save"
- },
- "quickened spell" : {
- name : "Quickened Spell",
- source : [["SRD", 44], ["P", 102]],
- description : " [2 sorcery points]" + "\n " + "If the spell has a casting time of 1 action, I can cast it as a bonus action",
- action : ["bonus action", ""]
- },
- "subtle spell" : {
- name : "Subtle Spell",
- source : [["SRD", 44], ["P", 102]],
- description : " [1 sorcery point]" + "\n " + "I can cast the spell without the need to use somatic or verbal components"
- },
- "twinned spell" : {
- name : "Twinned Spell",
- source : [["SRD", 44], ["P", 102]],
- description : " [1 sorcery point per spell level, minimum 1]" + "\n " + "If spell/cantrip has a target of one and not self, I can aim it at second target within range"
- }
- };
- ClassList.sorcerer.features["improved metamagic capacity"] = {//epic feature
- name : "Improved Metamagic Capacity",
- source : ["ELC", 33],
- minlevel : 30,
- description : "\n " + "I can now use two metamagic options on one spell or one can be applied to an epic spell"
- };
- ClassList.sorcerer.features["improved sorcerous restoration"] = {//epic feature
- name : "Improved Sorcerous Restoration",
- source : ["ELC", 33],
- minlevel : 40,
- description : "\n " + "I regain all expended sorcery points whenever I finish a short rest"
- };
- //Warlock - missing improved pact boon and extra invocations
- ClassList.warlock.improvements = [0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 11, 11];
- ClassList.warlock.attacks = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
- ClassList.warlock.spellcastingKnown = {
- cantrips : [2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 10],//epic feature
- spells : [2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25],//epic feature
- };
- ClassList.warlock.spellcastingList = {
- "class" : "warlock",// removed limit
- };
- ClassList.warlock.features["pact magic"] = {//updated for epic
- name : "Pact Magic",
- source : [["SRD", 46], ["P", 107], ["ELC", 36]],
- minlevel : 1,
- description : "\n " + "I can cast warlock cantrips/spells that I know, using Charisma as my spellcasting ability" + "\n " + "I can use an arcane focus as a spellcasting focus for my warlock spells" + "\n " + "I regain these spell slots on a short rest",
- additional : levels.map(function (n, idx) {
- var cantr = [2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11][idx];
- var splls = [2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25][idx];
- var slots = n < 2 ? 1 : n < 11 ? 2 : n < 17 ? 3 : n < 23 ? 4 : n < 29 ? 5 : n < 35 ? 6 : 7;
- var sllvl = n < 3 ? 1 : n < 5 ? 2 : n < 7 ? 3 : n < 9 ? 4 : n < 21 ? 5 : n < 26 ? 6 : n < 31 ? 7 : n < 36 ? 8 : 9;
- return cantr + " cantrips \u0026 " + splls + " spells known; " + slots + "\u00D7 " + Base_spellLevelList[sllvl] + " spell slot";
- })
- };
- ClassList.warlock.features["eldritch invocations"] = {//updated for epic
- name : "Eldritch Invocations",
- source : [["SRD", 47], ["P", 107], ["ELC", 36]],
- minlevel : 2,
- description : "\n " + "Use the \"Choose Feature\" button above to add Eldritch Invocations to the third page" + "\n " + "Whenever I gain a warlock level, I can replace an invocation I know with another",
- additional : levels.map(function (n) {
- return n < 2 ? "" : (n < 5 ? 2 : n < 7 ? 3 : n < 9 ? 4 : n < 12 ? 5 : n < 15 ? 6 : n < 18 ? 7 : n < 21 ? 8 : n < 24 ? 9 : n < 27 ? 10 : n < 30 ? 11 : n < 33 ? 12 : n < 36 ? 13 : n < 39 ? 14 : 15) + " invocations known";
- }),
- extraname : "Eldritch Invocation",
- extrachoices : ["Agonizing Blast (prereq: Eldritch Blast cantrip)", "Armor of Shadows", "Ascendant Step (prereq: level 9 warlock)", "Beast Speech", "Beguiling Influence", "Bewitching Whispers (prereq: level 7 warlock)", "Book of Ancient Secrets (prereq: Pact of the Tome)", "Chains of Carceri (prereq: level 15 warlock, Pact of the Chain)", "Devil's Sight", "Dreadful Word (prereq: level 7 warlock)", "Eldritch Sight", "Eldritch Spear (prereq: Eldritch Blast cantrip)", "Eyes of the Rune Keeper", "Fiendish Vigor", "Gaze of Two Minds", "Lifedrinker (prereq: level 12 warlock, Pact of the Blade)", "Mask of Many Faces", "Master of Myriad Forms (prereq: level 15 warlock)", "Minions of Chaos (prereq: level 9 warlock)", "Mire the Mind (prereq: level 5 warlock)", "Misty Visions", "One with Shadows (prereq: level 5 warlock)", "Otherworldly Leap (prereq: level 9 warlock)", "Repelling Blast (prereq: Eldritch Blast cantrip)", "Sculptor of Flesh (prereq: level 7 warlock)", "Sign of Ill Omen (prereq: level 5 warlock)", "Thief of Five Fates", "Thirsting Blade (prereq: level 5 warlock, Pact of the Blade)", "Visions of Distant Realms (prereq: level 15 warlock)", "Voice of the Chain Master (prereq: Pact of the Chain)", "Whispers of the Grave (prereq: level 9 warlock)", "Witch Sight (prereq: level 15 warlock)"],
- extraTimes : levels.map(function (n) {
- return n < 2 ? 0 : n < 5 ? 2 : n < 7 ? 3 : n < 9 ? 4 : n < 12 ? 5 : n < 15 ? 6 : n < 18 ? 7 : n < 21 ? 8 : n < 24 ? 9 : n < 27 ? 10 : n < 30 ? 11 : n < 33 ? 12 : n < 36 ? 13 : n < 39 ? 14 : 15;
- }),
- "agonizing blast (prereq: eldritch blast cantrip)" : {
- name : "Agonizing Blast",
- description : "\n " + "I can add my Charisma modifier to every hit with my Eldritch Blast cantrip",
- source : [["SRD", 48], ["P", 110]],
- prereqeval : function(v) { return v.hasEldritchBlast; },
- calcChanges : {
- atkCalc : [
- function (fields, v, output) {
- if (v.baseWeaponName == 'eldritch blast') output.extraDmg += What('Cha Mod');
- },
- "I add my Charisma modifier to the damage of every beam of my Eldritch Blast cantrip."
- ],
- spellAdd : [
- function (spellKey, spellObj, spName) {
- if (spellKey == "eldritch blast") {
- spellObj.description = spellObj.description.replace("1d10 Force damage", "1d10+" + What("Cha Mod") + " Force dmg");
- return true;
- };
- },
- "I add my Charisma modifier to the damage of every beam of my Eldritch Blast cantrip."
- ]
- }
- },
- "armor of shadows" : {
- name : "Armor of Shadows",
- description : "\n " + "I can cast Mage Armor on myself at will, without using a spell slot or material components",
- source : [["SRD", 48], ["P", 110]],
- spellcastingBonus : {
- name : "Armor of Shadows",
- spells : ["mage armor"],
- selection : ["mage armor"],
- firstCol : "atwill"
- },
- spellChanges : {
- "mage armor" : {
- range : "Self",
- components : "V,S",
- compMaterial : "",
- description : "If I'm not wearing armor, I gain AC 13 + Dex modifier for the duration; spell ends if I don armor",
- changes : "With the Armor of Shadows invocation I can cast Mage Armor without a material component, but only on myself."
- }
- }
- },
- "ascendant step (prereq: level 9 warlock)" : {
- name : "Ascendant Step",
- description : "\n " + "I can cast Levitate on myself at will, without using a spell slot or material components",
- source : [["SRD", 48], ["P", 110]],
- spellcastingBonus : {
- name : "Ascendant Step",
- spells : ["levitate"],
- selection : ["levitate"],
- firstCol : "atwill"
- },
- prereqeval : function(v) { return classes.known.warlock.level >= 9; },
- spellChanges : {
- "levitate" : {
- range : "Self",
- components : "V,S",
- compMaterial : "",
- description : "I rise vertically, up to 20 ft; during my move, I can move up/down up to 20 ft",
- changes : "With the Ascendant Step invocation I can cast Levitate without a material component, but only on myself."
- }
- }
- },
- "beast speech" : {
- name : "Beast Speech",
- description : "\n " + "I can cast Speak with Animals at will, without using a spell slots",
- source : [["SRD", 48], ["P", 110]],
- spellcastingBonus : {
- name : "Beast Speech",
- spells : ["speak with animals"],
- selection : ["speak with animals"],
- firstCol : "atwill"
- }
- },
- "beguiling influence" : {
- name : "Beguiling Influence",
- description : "\n " + "I gain proficiencies with the Deception and Persuasion skills",
- source : [["SRD", 48], ["P", 110]],
- skills : ["Deception", "Persuasion"]
- },
- "bewitching whispers (prereq: level 7 warlock)" : {
- name : "Bewitching Whispers",
- description : "\n " + "Once per long rest, I can cast Compulsion using a warlock spell slot",
- source : [["SRD", 48], ["P", 110]],
- usages : 1,
- recovery : "long rest",
- spellcastingBonus : {
- name : "Bewitching Whispers",
- spells : ["compulsion"],
- selection : ["compulsion"],
- firstCol : "oncelr"
- },
- prereqeval : function(v) { return classes.known.warlock.level >= 7; }
- },
- "book of ancient secrets (prereq: pact of the tome)" : {
- name : "Book of Ancient Secrets",
- description : desc([
- "I can add any two 1st-level spells that have the ritual tag to my Book of Shadows",
- "If I come across spells with the ritual tag, I can transcribe them into my book, as well",
- "I can cast any of these spells in my Book of Shadows as rituals, but not as normal spells",
- "I can cast my known warlock spells as rituals if they have the ritual tag"
- ]),
- source : [["SRD", 48], ["P", 110]],
- eval : function() {
- CurrentSpells['warlock-book of ancient secrets'] = {
- name : 'Book of Ancient Secrets',
- ability : 6,
- list : {class : 'any', ritual : true},
- known : {spells : 'book'},
- refType : "feat"
- };
- if (CurrentSpells['book of ancient secrets'] && CurrentSpells['book of ancient secrets'].selectSp) {
- // v12.999 style is present, so transfer chosen spells over and remove it
- CurrentSpells['warlock-book of ancient secrets'].offsetBo = CurrentSpells['book of ancient secrets'].offsetBo;
- CurrentSpells['warlock-book of ancient secrets'].selectBo = CurrentSpells['book of ancient secrets'].selectBo;
- CurrentSpells['warlock-book of ancient secrets'].selectSp = CurrentSpells['book of ancient secrets'].selectSp;
- delete CurrentSpells['book of ancient secrets'];
- }
- SetStringifieds('spells'); CurrentUpdates.types.push('spells');
- },
- removeeval : function() {
- delete CurrentSpells['warlock-book of ancient secrets'];
- SetStringifieds('spells'); CurrentUpdates.types.push('spells');
- },
- prereqeval : function(v) { return classes.known.warlock.level >= 3 && GetFeatureChoice('class', 'warlock', 'pact boon') == 'pact of the tome'; },
- calcChanges : {
- spellAdd : [
- function (spellKey, spellObj, spName) {
- if (spName == "book of ancient secrets") {
- spellObj.firstCol = "(R)";
- if (!(/.*(\d+ ?h\b|special|see b).*/i).test(spellObj.time)) {
- var numMinutes = Number(spellObj.time.replace(/(\d+) ?min.*/, "$1"));
- if (isNaN(numMinutes)) numMinutes = 0;
- spellObj.time = (numMinutes + 10) + " min";
- }
- return true;
- };
- },
- "By the Book of Ancient Secrets invocation, I can cast ritual spells from my Book of Shadows. Ritual spell always have a casting time of 10 minutes or more."
- ]
- }
- },
- "chains of carceri (prereq: level 15 warlock, pact of the chain)" : {
- name : "Chains of Carceri",
- description : "\n " + "I can cast Hold Monster at will if the target is a celestial, fiend, or elemental" + "\n " + "This uses no spell slots/material comp.; I can only target an individual once per long rest",
- source : [["SRD", 49], ["P", 110]],
- spellcastingBonus : {
- name : "Chains of Carceri",
- spells : ["hold monster"],
- selection : ["hold monster"],
- firstCol : "atwill"
- },
- prereqeval : function(v) { return classes.known.warlock.level >= 15 && GetFeatureChoice('class', 'warlock', 'pact boon') == 'pact of the chain'; },
- spellChanges : {
- "speak with animals" : {
- components : "V,S",
- compMaterial : "",
- description : "1 celestial, fiend, or elemental, save or paralyzed; extra save at end of each turn",
- changes : "With the Chains of Carceri invocation I can cast Hold Monster without a material component, but only on a celestial, fiend, or elemental."
- }
- }
- },
- "devil's sight" : {
- name : "Devil's Sight",
- description : "\n " + "I can see in magical and nonmagical darkness out to 120 ft",
- source : [["SRD", 49], ["P", 110]],
- vision : [["Devil's sight", 120]]
- },
- "dreadful word (prereq: level 7 warlock)" : {
- name : "Dreadful Word",
- description : "\n " + "Once per long rest, I can cast Confusion using a warlock spell slot",
- source : [["SRD", 49], ["P", 110]],
- usages : 1,
- recovery : "long rest",
- spellcastingBonus : {
- name : "Dreadful Word",
- spells : ["confusion"],
- selection : ["confusion"],
- firstCol : "oncelr"
- },
- prereqeval : function(v) { return classes.known.warlock.level >= 7; }
- },
- "eldritch sight" : {
- name : "Eldritch Sight",
- description : "\n " + "I can cast Detect Magic at will, without using a spell slot",
- source : [["SRD", 49], ["P", 110]],
- spellcastingBonus : {
- name : "Eldritch Sight",
- spells : ["detect magic"],
- selection : ["detect magic"],
- firstCol : "atwill"
- }
- },
- "eldritch spear (prereq: eldritch blast cantrip)" : {
- name : "Eldritch Spear",
- description : "\n " + "My Eldritch Blast cantrip has a range of 300 ft",
- source : [["SRD", 49], ["P", 111]],
- prereqeval : function(v) { return v.hasEldritchBlast; },
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.baseWeaponName == 'eldritch blast') fields.Range = 300 * (v.rangeM ? v.rangeM : 1) + ' ft';
- },
- "My Eldritch Blast cantrip has a range of 300 ft."
- ]
- },
- spellChanges : {
- "eldritch blast" : {
- range : "300 ft",
- changes : "My Eldritch Blast cantrip has a range of 300 ft."
- }
- }
- },
- "eyes of the rune keeper" : {
- name : "Eyes of the Rune Keeper",
- description : "\n " + "I can read all writing",
- source : [["SRD", 49], ["P", 111]]
- },
- "fiendish vigor" : {
- name : "Fiendish Vigor",
- description : "\n " + "I can cast False Life on myself at will, without using a spell slot or material components",
- source : [["SRD", 49], ["P", 111]],
- spellcastingBonus : {
- name : "Fiendish Vigor",
- spells : ["false life"],
- selection : ["false life"],
- firstCol : "atwill"
- },
- spellChanges : {
- "false life" : {
- components : "V,S",
- compMaterial : "",
- description : "I gain 1d4+4 temporary hit points for the duration",
- changes : "With the Fiendish Vigor invocation I can cast False Life without a material component."
- }
- }
- },
- "gaze of two minds" : {
- name : "Gaze of Two Minds",
- description : "\n " + "As an action, I can touch a willing creature and perceive through its senses (not my own)" + "\n " + "This lasts until the end of my next turn, but I can use an action to extend the duration",
- source : [["SRD", 49], ["P", 111]]
- },
- "lifedrinker (prereq: level 12 warlock, pact of the blade)" : {
- name : "Lifedrinker",
- description : "\n " + "My pact weapon does extra necrotic damage equal to my Charisma modifier",
- source : [["SRD", 49], ["P", 111]],
- calcChanges : {
- atkCalc : [
- function (fields, v, output) {
- if (v.pactWeapon || ((v.isMeleeWeapon || v.theWea.isMagicWeapon || v.thisWeapon[1]) && (/\bpact\b/i).test(v.WeaponText))) output.extraDmg += What('Cha Mod');
- },
- "If I include the word 'Pact' in a melee or magic weapon's name or description, the calculation will add my Charisma modifier to its damage. However, it won't say that this added damage is of the necrotic type, as it can only display a single damage type."
- ]
- },
- prereqeval : function(v) { return classes.known.warlock.level >= 12 && GetFeatureChoice('class', 'warlock', 'pact boon') == 'pact of the blade'; }
- },
- "mask of many faces" : {
- name : "Mask of Many Faces",
- description : "\n " + "I can cast Disguise Self on myself at will, without using a spell slot",
- source : [["SRD", 49], ["P", 111]],
- spellcastingBonus : {
- name : "Mask of Many Faces",
- spells : ["disguise self"],
- selection : ["disguise self"],
- firstCol : "atwill"
- }
- },
- "master of myriad forms (prereq: level 15 warlock)" : {
- name : "Master of Myriad Forms",
- description : "\n " + "I can cast Alter Self at will, without using a spell slot",
- source : [["SRD", 49], ["P", 111]],
- spellcastingBonus : {
- name : "Mask of Myriad Forms",
- spells : ["alter self"],
- selection : ["alter self"],
- firstCol : "atwill"
- },
- prereqeval : function(v) { return classes.known.warlock.level >= 15; }
- },
- "minions of chaos (prereq: level 9 warlock)" : {
- name : "Minions of Chaos",
- description : "\n " + "Once per long rest, I can cast Conjure Elemental using a warlock spell slot",
- source : [["SRD", 49], ["P", 111]],
- usages : 1,
- recovery : "long rest",
- spellcastingBonus : {
- name : "Minions of Chaos",
- spells : ["conjure elemental"],
- selection : ["conjure elemental"],
- firstCol : "oncelr"
- },
- prereqeval : function(v) { return classes.known.warlock.level >= 9; }
- },
- "mire the mind (prereq: level 5 warlock)" : {
- name : "Mire the Mind",
- description : "\n " + "Once per long rest, I can cast Slow using a warlock spell slot",
- source : [["SRD", 49], ["P", 111]],
- usages : 1,
- recovery : "long rest",
- spellcastingBonus : {
- name : "Mire the Mind",
- spells : ["slow"],
- selection : ["slow"],
- firstCol : "oncelr"
- },
- prereqeval : function(v) { return classes.known.warlock.level >= 5; }
- },
- "misty visions" : {
- name : "Misty Visions",
- description : "\n " + "I can cast Silent Image at will, without using a spell slot or material components",
- source : [["SRD", 49], ["P", 111]],
- spellcastingBonus : {
- name : "Misty Visions",
- spells : ["silent image"],
- selection : ["silent image"],
- firstCol : "atwill"
- },
- spellChanges : {
- "silent image" : {
- components : "V,S",
- compMaterial : "",
- changes : "With the Misty Visions invocation I can cast Silent Image without a material component."
- }
- }
- },
- "one with shadows (prereq: level 5 warlock)" : {
- name : "One with Shadows",
- description : "\n " + "As an action, when I'm in an area of dim light or darkness, I can become invisible" + "\n " + "I become visible again when I move or take an action or reaction",
- source : [["SRD", 49], ["P", 111]],
- action : ["action", ""],
- prereqeval : function(v) { return classes.known.warlock.level >= 5; }
- },
- "otherworldly leap (prereq: level 9 warlock)" : {
- name : "Otherworldly Leap",
- description : "\n " + "I can cast Jump on myself at will, without using a spell slot or material components",
- source : [["SRD", 49], ["P", 111]],
- spellcastingBonus : {
- name : "Otherworldly Leap",
- spells : ["jump"],
- selection : ["jump"],
- firstCol : "atwill"
- },
- prereqeval : function(v) { return classes.known.warlock.level >= 9; },
- spellChanges : {
- "jump" : {
- range : "Self",
- components : "V,S",
- compMaterial : "",
- description : "My jump distance is tripled for the duration",
- changes : "With the Otherworldly Leap invocation I can cast Jump without a material component, but only on myself."
- }
- }
- },
- "repelling blast (prereq: eldritch blast cantrip)" : {
- name : "Repelling Blast",
- description : "\n " + "I can have creatures hit by my Eldritch Blast cantrip be pushed 10 ft away from me",
- source : [["SRD", 49], ["P", 111]],
- prereqeval : function(v) { return v.hasEldritchBlast; },
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.baseWeaponName == 'eldritch blast') fields.Description += '; Target pushed back 10 ft';
- },
- "When I hit a creature with my Eldritch Blast cantrip, it is pushed 10 ft away from me."
- ]
- },
- spellChanges : {
- "eldritch blast" : {
- description : "Spell attack beam 1d10 Force damage \u0026 push 10 ft; beams can be combined; +1 beam at CL5,11,17",
- changes : "When I hit a creature with my Eldritch Blast cantrip, it is pushed 10 ft away from me."
- }
- }
- },
- "sculptor of flesh (prereq: level 7 warlock)" : {
- name : "Sculptor of Flesh",
- description : "\n " + "Once per long rest, I can cast Polymorph using a warlock spell slot",
- source : [["SRD", 50], ["P", 111]],
- usages : 1,
- recovery : "long rest",
- spellcastingBonus : {
- name : "Sculptor of Flesh",
- spells : ["polymorph"],
- selection : ["polymorph"],
- firstCol : "oncelr"
- },
- prereqeval : function(v) { return classes.known.warlock.level >= 7; }
- },
- "sign of ill omen (prereq: level 5 warlock)" : {
- name : "Sign of Ill Omen",
- description : "\n " + "Once per long rest, I can cast Bestow Curse using a warlock spell slot",
- source : [["SRD", 50], ["P", 111]],
- usages : 1,
- recovery : "long rest",
- spellcastingBonus : {
- name : "Sign of Ill Omen",
- spells : ["bestow curse"],
- selection : ["bestow curse"],
- firstCol : "oncelr"
- },
- prereqeval : function(v) { return classes.known.warlock.level >= 5; }
- },
- "thief of five fates" : {
- name : "Thief of Five Fates",
- description : "\n " + "Once per long rest, I can cast Bane using a warlock spell slot",
- source : [["SRD", 50], ["P", 111]],
- usages : 1,
- recovery : "long rest",
- spellcastingBonus : {
- name : "Thief of Five Fates",
- spells : ["bane"],
- selection : ["bane"],
- firstCol : "oncelr"
- }
- },
- "thirsting blade (prereq: level 5 warlock, pact of the blade)" : {
- name : "Thirsting Blade",
- description : "\n " + "When taking the attack action, I can attack twice with my pact weapon",
- source : [["SRD", 50], ["P", 111]],
- action : ['action', 'Pact Weapon (2 attacks per action)'],
- prereqeval : function(v) { return classes.known.warlock.level >= 5 && GetFeatureChoice('class', 'warlock', 'pact boon') == 'pact of the blade'; }
- },
- "visions of distant realms (prereq: level 15 warlock)" : {
- name : "Visions of Distant Realms",
- description : "\n " + "I can cast Arcane Eye at will, without using a spell slot",
- source : [["SRD", 50], ["P", 111]],
- spellcastingBonus : {
- name : "Visions of Distant Realms",
- spells : ["arcane eye"],
- selection : ["arcane eye"],
- firstCol : "atwill"
- },
- prereqeval : function(v) { return classes.known.warlock.level >= 15; }
- },
- "voice of the chain master (prereq: pact of the chain)" : {
- name : "Voice of the Chain Master",
- description : "\n " + "While on the same plane as my familiar, I can communicate telepathically with it" + "\n " + "Also, I can perceive through its senses and have it speak with my voice while doing so",
- source : [["SRD", 50], ["P", 111]],
- prereqeval : function(v) { return classes.known.warlock.level >= 3 && GetFeatureChoice('class', 'warlock', 'pact boon') == 'pact of the chain'; }
- },
- "whispers of the grave (prereq: level 9 warlock)" : {
- name : "Whispers of the Grave",
- description : "\n " + "I can cast Speak with Dead at will, without using a spell slot",
- source : [["SRD", 50], ["P", 111]],
- spellcastingBonus : {
- name : "Whispers of the Grave",
- spells : ["speak with dead"],
- selection : ["speak with dead"],
- firstCol : "atwill"
- },
- prereqeval : function(v) { return classes.known.warlock.level >= 9; }
- },
- "witch sight (prereq: level 15 warlock)" : {
- name : "Witch Sight",
- description : "\n " + "I can see the true form of creatures (shapechangers/illusions/transmutations) within 30 ft",
- source : [["SRD", 50], ["P", 111]],
- vision : [["Witch sight", 30]],
- prereqeval : function(v) { return classes.known.warlock.level >= 15; }
- }
- };
- ClassList.warlock.features["pact boon"] = {
- name : "Pact Boon",
- source : [["SRD", 47], ["P", 107], ["ELC", 36]],
- minlevel : 3,
- description : "\n " + "Choose a Pact Boon (Blade, Chain, or Tome) using the \"Choose Feature\" button above",
- choices : ["Pact of the Blade", "Pact of the Chain", "Pact of the Tome"],
- "pact of the blade" : {
- name : "Pact of the Blade",
- description : desc([
- "As an action, I can create a pact weapon in my empty hand; I'm proficient in its use",
- "I can choose the type of melee weapon every time I create it, and it has those statistics",
- "The weapon disappears if it is more than 5 ft away from me for 1 minute",
- "The weapon counts as magical; I can transform a magic weapon into my pact weapon",
- "This occurs over an hour-long ritual that I can perform during a short rest",
- "I can use an action to re-summon it in any form and can dismiss it as no action"
- ]),
- action : ["action", ""],
- calcChanges : {
- atkCalc : [
- function (fields, v, output) {
- if (v.theWea.pactWeapon || ((v.isMeleeWeapon || v.theWea.isMagicWeapon || v.thisWeapon[1]) && (/\bpact\b/i).test(v.WeaponText))) {
- v.pactWeapon = true;
- }
- }, ""
- ],
- atkAdd : [
- function (fields, v) {
- if (v.pactWeapon || v.theWea.pactWeapon || ((v.isMeleeWeapon || v.theWea.isMagicWeapon || v.thisWeapon[1]) && (/\bpact\b/i).test(v.WeaponText))) {
- v.pactWeapon = true;
- fields.Proficiency = true;
- if (!v.theWea.isMagicWeapon && !v.thisWeapon[1] && !(/counts as( a)? magical/i).test(fields.Description)) fields.Description += (fields.Description ? '; ' : '') + 'Counts as magical';
- };
- },
- "If I include the word 'Pact' in a melee or magic weapon's name, it gets treated as my Pact Weapon."
- ]
- }
- },
- "pact of the chain" : {
- name : "Pact of the Chain",
- description : "\n " + "I can cast Find Familiar as a ritual and it can be a Pseudodragon, Imp, Quasit, or Sprite" + "\n " + "When taking the attack action, I can forgo 1 attack to have my familiar attack instead" + "\n " + "It makes this 1 attack by using its reaction",
- spellcastingBonus : {
- name : "Pact of the Chain",
- spells : ["find familiar"],
- selection : ["find familiar"],
- firstCol : "(R)"
- }
- },
- "pact of the tome" : {
- name : "Pact of the Tome",
- source : [["SRD", 48], ["P", 108]],
- description : "\n " + "I have a Book of Shadows with any three cantrips of my choosing" + "\n " + "I can cast these cantrips as long as I have the book on my person" + "\n " + "Regardless of the lists they come from, these count as warlock cantrips to me" + "\n " + "I can get a replacement book with a 1-hour ceremony during a short or long rest",
- spellcastingBonus : {
- name : "Pact of the Tome",
- "class" : "any",
- level : [0, 0],
- times : 3
- }
- },
- choiceDependencies : [{
- feature : "improved pact boon"
- }]
- };
- ClassList.warlock.features["mystic arcanum"] = {//updated for epic
- name : "Mystic Arcanum",
- source : [["SRD", 48], ["P", 108]],
- minlevel : 11,
- description : "\n " + "I can choose one spell from the warlock spell list of each level mentioned above" + "\n " + "I can cast these spells each once per long rest without needing to use a spell slot",
- additional : ["", "", "", "", "", "", "", "", "", "", "6th level", "6th level", "6th and 7th level", "6th and 7th level", "6th, 7th, and 8th level", "6th, 7th, and 8th level", "6th, 7th, 8th, and 9th level", "6th, 7th, 8th, and 9th level", "6th, 7th, 8th, and 9th level", "6th, 7th, 8th, and 9th level", "6th, 7th, 8th, and 9th level", "6th, 7th, 8th, and 9th level", "6th, 7th, 8th, and 9th level", "6th, 7th, 8th, and 9th level", "6th, 7th, 8th, and 9th level", "6th, 7th, 8th, and 9th level", "6th, 7th, 8th, and 9th level", "6th, 7th, 8th, and 9th level", "6th, 7th, 8th, and 9th level", "6th, 7th, 8th, and 9th level", "6th, 7th, 8th, and 9th level", "6th, 7th, 8th, and 9th level", "6th, 7th, 8th, and 9th level", "6th, 7th, 8th, and 9th level", "6th, 7th, 8th, and 9th level", "6th, 7th, 8th, and 9th level", "6th, 7th, 8th, and 9th level", "6th, 7th, 8th, and 9th level", "6th, 7th, 8th, and 9th level", "6th, 7th, 8th, and 9th level"],
- spellcastingBonus : [{
- name : "Mystic Arcanum (6)",
- "class" : "warlock",
- level : [6, 6],
- firstCol : "oncelr"
- }, {
- name : "Mystic Arcanum (7)",
- "class" : "warlock",
- level : [7, 7],
- firstCol : "oncelr",
- times : levels.map(function (n) { return n < 13 ? 0 : 1; })
- }, {
- name : "Mystic Arcanum (8)",
- "class" : "warlock",
- level : [8, 8],
- firstCol : "oncelr",
- times : levels.map(function (n) { return n < 15 ? 0 : 1; })
- }, {
- name : "Mystic Arcanum (9)",
- "class" : "warlock",
- level : [9, 9],
- firstCol : "oncelr",
- times : levels.map(function (n) { return n < 17 ? 0 : 1; })
- }]
- };
- ClassList.warlock.features["invocation adaptability"] = {//epic feature
- name : "Invocation Adaptability",
- source : ["ELC", 36],
- minlevel : 25,
- description : "\n " + "I can change one of my invocations to another once per long rest",
- };
- ClassList.warlock.features["improved concentration"] = {//epic feature
- name : "Improved Concentration",
- source : ["ELC", 36],
- minlevel : 25,
- description : "\n " + "I always succeed on a concentration save",
- savetxt : {
- text : ["Always succeed on concentration saves"]
- }
- };
- ClassList.warlock.features["any cantrip"] = {//epic feature
- name : "Any Cantrip",
- source : ["ELC", 36],
- minlevel : 21,
- description : "\n " + "I can learn any cantrip and swap one out once per long rest",
- spellcastingBonus : {
- name : "11th Cantrip",
- "class" : "any",
- level : [0, 0],
- times : levels.map( function(n) {
- return n < 39 ? 0 : 1 ;
- })
- },
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "warlock" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["acid splash", "control flames", "dancing lights", "druidcraft", "encode thoughts", "fire bolt", "guidance", "gust", "light", "mending", "message", "mold earth", "primal savagery", "produce flame", "ray of frost", "resistance", "sacred flame", "shape water", "shillelagh", "shocking grasp", "spare the dying", "thaumaturgy", "thorn whip", "vicious mockery", "word of radiance"]);
- },
- "This class feature adds all cantrips to the spells list of the warlock class."
- ]
- }
- };
- ClassList.warlock.features["improved eldritch master"] = {
- name : "Improved Eldritch Master",
- source : ["ELC", 36],
- minlevel : 40,
- description : "\n " + "short rests are now 1 min long for me for the purposes of using hit dice and regaining pact magic spell slots.",
- };
- ClassList.warlock.features["improved pact boon"] = {
- name : "Pact Boon",
- source : ["ELC", 36],
- minlevel : 23,
- description : "\n " + "my Pact Boon has improved",
- choices : ["Pact of the Blade", "Pact of the Chain", "Pact of the Tome"],
- choicesNotInMenu : true,
- "pact of the blade" : {
- name : "Improved Pact of the Blade",
- description : desc([
- "My pact weapon now get a +2 to weapon attack or damage",
- ]),
- calcChanges : {
- atkCalc : [
- function (fields, v, output) {
- if (v.theWea.pactWeapon || ((v.isMeleeWeapon || v.theWea.isMagicWeapon || v.thisWeapon[1]) && (/\bpact\b/i).test(v.WeaponText))) output.extraHit += 2;
- if (v.theWea.pactWeapon || ((v.isMeleeWeapon || v.theWea.isMagicWeapon || v.thisWeapon[1]) && (/\bpact\b/i).test(v.WeaponText))) output.extraDmg += 2;
- }, "My pact weapon now get a +2 to weapon attack or damage"
- ],
- }
- },
- "pact of the chain" : {
- name : "Improved Pact of the Chain",
- description : "\n " + "I can now select any creature of CR 5 or lower to be my familiar; as long as it has a int of 16 or lower",
- },
- "pact of the tome" : {
- name : "Improved Pact of the Tome",
- source : [["SRD", 48], ["P", 108]],
- description : "\n " + "When selecting spells for my pact magic; I can select up to one level higher then my spell level and treat those as one level lower for the purposes of casting them",
- },
- };
- //Wizard
- ClassList.wizard.improvements = [0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 10, 10];
- ClassList.wizard.attacks = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
- ClassList.wizard.spellcastingKnown = {
- cantrips : [3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5],//lv40
- spells : "book",
- prepared : true
- };
- ClassList.wizard.features["spellcasting"] = {//updated
- name : "Spellcasting",
- source : [["SRD", 52], ["P", 114], ["ELC", 43]],
- minlevel : 1,
- description : "\n " + "I can cast prepared wizard cantrips/spells, using Intelligence as my spellcasting ability" + "\n " + "I can use an arcane focus as a spellcasting focus for my wizard spells" + "\n " + "I can cast all wizard spells in my spellbook as rituals if they have the ritual tag",
- additional : levels.map(function (n, idx) {
- return [3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5][idx] + " cantrips known";//lv40
- })
- };
- ClassList.wizard.features["arcane recovery"] = {// added improved arcane recovery
- name : "Arcane Recovery",
- source : [["SRD", 53], ["P", 115], ["ELC", 43]],
- minlevel : 1,
- description : "\n " + "Once per day after a short rest, I can recover a number of 5th-level or lower spell slots; at level 21 I am now longer limited to upto 5th-level spells",
- additional : levels.map(function (n) {
- var lvls = Math.ceil(n / 2);
- return lvls + " level" + (lvls > 1 ? "s" : "") + " of spell slots";
- }),
- usages : 1,
- recovery : "long rest"
- };
- // ranger spells - Complete
- SpellsList["blasting arrows"] = {
- name : "Blasting Arrows",
- nameShort : "Blast Arrow",
- source : ["ELC", 67],
- classes : ["ranger"],
- level : 8,
- school : "Trans",
- time : "1 bns",
- range : "self",
- components : "V,S",
- duration : "conc, 1 min",
- description : "deal +4d8 Fire or Thunder dmg to ammunition; If you choose Thunder, spell emits a thunderous boom audible out to 300 feet.",
- descriptionFull : "While you are concentrating on this spell any ranged attacks you make have their ammunition enchanted. The enchanted ammunition does an additional 4d8 fire or thunder damage(your choice when you cast this spell). If you choose thunder damage it makes a loud booming sound that can be heard for 300 feet away from the point of impact. The ammunition during this concentration is considered magical for the purposes of overcoming damage resistance." + "\n " + "After the ammunition is fired it loses the properties of this spell. This spell only benefits ammunition that you are currently using while you are firing it so you cannot enchant the weapons of your allies to use.",
- };
- SpellsList["blessing of the cheetah"] = {
- name : "Blessing of the Cheetah",
- nameShort : "B. Cheetah",
- source : ["ELC", 67],
- classes : ["ranger"],
- level : 7,
- school : "Trans",
- time : "1 a",
- range : "self",
- components : "V,S,M",
- compMaterial : "crushed quartz thrown into the air upon casting",
- duration : "conc, 1 h",
- description : "Any within 30-ft rad +30ft move. and dash/disengage as bns.",
- descriptionFull : "For the Duration your legs and cardiovascular system get improved as does that of creatures you choose within 30 feet of you. Those creatures get a +30 to their movment speed for the duration of the spell. Creatures that are affected can use the dash action and disengage action with a bonus action.",
- };
- SpellsList["grace of the zephyr"] = {
- name : "Grace of the Zephyr",
- nameShort : "G. Zephyr",
- source : ["ELC", 68],
- classes : ["ranger"],
- level : 9,
- school : "Trans",
- time : "1 a",
- range : "self",
- components : "V,S",
- duration : "8 h",
- description : "I don't provoke opportunity atks or grapple; +50ft move w/fly; advantage on attacks or 2d8 Force dmg.",
- descriptionFull : "You move like the wind. Until the spell ends you don't provoke opportunity attacks. You get +50 to your movement speed while the spell is active. Your attacks while the spell is active have advantage on attack rolls. You may instead sacrifice advantage for a turn to deal an additional 2d8 force damage with weapon attacks. If you need to evade a grapple you succeed automatically on the roll. You can fly temporarily but need to end your turn on the ground or you will fall.",
- };
- SpellsList["greater pass without a trace"] = {
- name : "Greater Pass without a Trace",
- nameShort : "G. Pass w/o Trace",
- source : ["ELC", 68],
- classes : ["ranger"],
- level : 7,
- school : "Abjur",
- time : "1 a",
- range : "self",
- components : "V,S",
- duration : "conc, 1 h",
- description : "Any within 30-ft rad +20 Dex(Stealth) checks, leave no tracks, can't be tracked by nonmagical means",
- descriptionFull : "A veil of shadows and silence emanates from you masking you and your allies from detection. For the duration, each creature you choose within 30 feet of you(including you) has a +20 bonus to dexterity (stealth) checks and can't be tracked by nonmagical means. A creature that receives this bonus leaves behind no tracks or other traces of its passage.",
- };
- SpellsList["lightning swift strikes"] = {
- name : "Lightning Swift Strikes",
- nameShort : "L. Swift Strikes",
- source : ["ELC", 68],
- classes : ["ranger"],
- level : 9,
- school : "Trans",
- time : "1 bns",
- range : "self",
- components : "V,S",
- duration : "8 h",
- description : "I can take atk+extra atk a as bns.",
- descriptionFull : "For the duration you may take the attack action using your bonus action. This allows you to benefit from extra attack using your bonus action as well.",
- };
- SpellsList["strafe strike"] = {
- name : "Strafe Strike",
- source : ["ELC", 68],
- classes : ["ranger"],
- level : 8,
- school : "Trans",
- time : "1 a",
- range : "Varies",
- components : "V,S",
- duration : "Instantaneous",
- description : "I can atk all in range 2x in melee or 1x in ranged;unless they are in full cover.",
- descriptionFull : "When you cast this you can make 1 weapon attack on creatures within range with either a melee or ranged weapon. If you use a melee weapon then you can do 2 attacks on all creatures within melee weapon range. If you use a ranged weapon you can make 1 weapon attack again all creatures you choose within the ranged weapons optimal range as long as they don't have full cover.",
- };
- SpellsList["swift strikes"] = {
- name : "Swift Strikes",
- source : ["ELC", 68],
- classes : ["ranger"],
- level : 6,
- school : "Trans",
- time : "1 bns",
- range : "self",
- components : "V,S",
- duration : "conc, 1 min",
- description : "I can attack twice as a bns.",
- descriptionFull : "For the duration of the spell you may now make 2 attacks with your bonus action until the spell ends.",
- };
- // paladin spells - Complete
- SpellsList["fiery weapon"] = {
- name : "Fiery Weapon",
- source : ["ELC", 67],
- classes : ["paladin"],
- level : 6,
- school : "Evoc",
- time : "1 bns",
- range : "Self",
- components : "V",
- duration : "conc, 1 h",
- save : "Con",
- description : "Fire and Cold res.; +3d10 Fire dmg; Any in 10-ft rad, save or take 1d10, half on success.",
- descriptionFull : "You imbue a weapon you possess with elemental fire. Until the spell ends it emits a bright light for 30 feet and dim light for 30 feet beyond that. Attacks you do while the spell is active do an additional 3d10 fire damage. Furthermore creatures of your choice within 10 feet of you must make a constitution saving throw on their turn. If they fail they take 1d10 fire damage and if they succeed they take half. While the spell is active you have resistance to fire and cold damage.",
- };
- SpellsList["find epic steed"] = {
- name : "Find Epic Steed",
- source : ["ELC", 67],
- classes : ["paladin"],
- level : 9,
- school : "Conj",
- time : "10 min",
- range : "50 ft",
- components : "V,S",
- duration : "Instantaneous",
- description : "Gain the services of a steed; can communicate with it telepathically; can share spells with it; see book",
- descriptionFull : "You summon a spirit that assumes the form of a loyal, majestic mount. Appearing in an unoccupied space within range, the spirit takes on a form you choose: a Chimera, a Mammoth, a Tyrannosarus Rex, a young bronze dragon, a young green dragon, a young silver dragon, or a young blue dragon. The creature has the statistics provided in the Monster Manual for the chosen form, though it is a celestial, a fey, or a fiend (your choice) instead of its normal creature type. Additionally, if it has an Intelligence score of 7 or lower, its Intelligence becomes 8, and it gains the ability to understand one language of your choice that you speak." + "\n " + "You control the mount in combat. While the mount is within 1 mile of you, you can communicate with it telepathically. While mounted on it, you can make any spell you cast that targets only you also target the mount." + "\n " + "The mount disappears temporarily when it drops to 0 hit points or when you dismiss it as an action. Casting this spell again re-summons the bonded mount, with all its hit points restored and any conditions removed." + "\n " + "You can’t have more than one mount bonded by this spell, find supreme steed, find greater steed, or find steed at the same time. As an action, you can release a mount from its bond, causing it to disappear permanently." + "\n " + "Whenever the mount disappears, it leaves behind any objects it was wearing or carrying.",
- };
- SpellsList["find supreme steed"] = {
- name : "Find Supreme Steed",
- source : ["ELC", 67],
- classes : ["paladin"],
- level : 8,
- school : "Conj",
- time : "10 min",
- range : "50 ft",
- components : "V,S",
- duration : "Instantaneous",
- description : "Gain the services of a steed; can communicate with it telepathically; can share spells with it; see book",
- descriptionFull : "You summon a spirit that assumes the form of a loyal, majestic mount. Appearing in an unoccupied space within range, the spirit takes on a form you choose: a elephant, a killer whale, a giant subterranean lizard, a giant scorpion, a manticore, or a winter wolf. The creature has the statistics provided in the Monster Manual for the chosen form, though it is a celestial, a fey, or a fiend (your choice) instead of its normal creature type. Additionally, if it has an Intelligence score of 6 or lower, its Intelligence becomes 7, and it gains the ability to understand one language of your choice that you speak." + "\n " + "You control the mount in combat. While the mount is within 1 mile of you, you can communicate with it telepathically. While mounted on it, you can make any spell you cast that targets only you also target the mount." + "\n " + "The mount disappears temporarily when it drops to 0 hit points or when you dismiss it as an action. Casting this spell again re-summons the bonded mount, with all its hit points restored and any conditions removed." + "\n " + "You can’t have more than one mount bonded by this spell, find supreme steed, find greater steed, or find steed at the same time. As an action, you can release a mount from its bond, causing it to disappear permanently." + "\n " + "Whenever the mount disappears, it leaves behind any objects it was wearing or carrying.",
- };
- SpellsList["paralyzing smite"] = {
- name : "Paralyzing Smite",
- source : ["ELC", 68],
- classes : ["paladin"],
- level : 9,
- school : "Evoc",
- time : "1 bns",
- range : "Self",
- components : "V",
- duration : "conc, 1 min",
- description : "Next melee weapon hit +9d10 Radiant dmg and save or paralyzed until spell ends",
- descriptionFull : "The next time you hit with a melee attack during this spells duration, your attack deals an extra 9d10 radiant damage. Additionally, if the target is a creature it must make a constitution saving throw or be paralyzed until the spell ends. During its turn it can make another save if it has been attacked before this turn but after its previous turn.",
- };
- SpellsList["petrified smite"] = {
- name : "Petrified Smite",
- source : ["ELC", 68],
- classes : ["paladin"],
- level : 7,
- school : "Evoc",
- time : "1 bns",
- range : "Self",
- components : "V",
- duration : "conc, 1 min",
- description : "Next melee weapon hit +7d10 Bludg. dmg and save or petrified until spell ends",
- descriptionFull : "The next time you hit with a melee attack during this spells duration, your attack deals an extra 7d10 bludgeoning damage. Additionally, if the target is a creature it must make a constitution saving throw or be petrified until the spell ends. During its turn it can make another save if it has been attacked before this turn but after its previous turn.",
- };
- SpellsList["stunning smite"] = {
- name : "Stunning Smite",
- source : ["ELC", 68],
- classes : ["paladin"],
- level : 8,
- school : "Evoc",
- time : "1 bns",
- range : "Self",
- components : "V",
- duration : "conc, 1 min",
- description : "Next melee weapon hit +8d10 Radiant dmg and save or stunned until spell ends",
- descriptionFull : "The next time you hit with a melee attack during this spells duration, your attack deals an extra 8d10 radiant damage. Additionally, if the target is a creature it must make a constitution saving throw or be stunned until the spell ends. During its turn it can make another save if it has been attacked before this turn but after its previous turn.",
- };
- /* sub-classes, most of the code is from safety orange (did I give credit right?) - Incomplete
- */
- ClassSubList["bard-college of lore"].features["subclassfeature6"] = {
- name : "Additional Magical Secrets",
- source : [["SRD", 13], ["P", 55], ["ELC", 7]],
- minlevel : 6,
- description : "\n " + "I can add two spells/cantrips from any class to my Spells Known \u0026 +2 at 27",
- spellcastingBonus : {
- name : "Additional Magical Secret",
- "class" : "any",
- times : [0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
- }
- };
- ClassSubList["bard-college of swords-xgte"].attacks = [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4];
- ClassSubList["bard-college of valor"].attacks = [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4];
- ClassSubList["fighter-champion"].features["subclassfeature10"] = function () {
- var FSfea = newObj(Base_ClassList.fighter.features["fighting style"]);
- FSfea.name = "Additional Fighting Style";
- FSfea.source = [["SRD", 25], ["P", 73], ["ELC", 16]];
- FSfea.minlevel = 10;
- FSfea.description = "\n " + "Choose an Additional Fighting Style using the \"Choose Feature\" button above ";
- FSfea.choiceDependencies = [{
- feature : "subclassfeature27"
- }];
- return FSfea;
- }();
- ClassSubList["fighter-champion"].features["subclassfeature27"] = {//epic feature
- name : "Another Improved Fighting Style",
- source : ["ELC", 16],
- minlevel : 27,
- description : "\n " + "my fighting style has improved",
- choices : ["Archery", "Defense", "Dueling", "Great Weapon Fighting", "Protection", "Two-Weapon Fighting"],
- choicesNotInMenu : true,
- "archery" : FightingStyles.archery2,
- "defense" : FightingStyles.defense2,
- "dueling" : FightingStyles.dueling2,
- "great weapon fighting" : FightingStyles.great_weapon2,
- "protection" : FightingStyles.protection2,
- "two-weapon fighting" : FightingStyles.two_weapon2
- };
- ClassSubList["fighter-eldritch knight"].spellcastingList = {
- "class" : "wizard",
- school : ["Evoc", "Abjur"],
- level : [0, 7]
- };
- ClassSubList["fighter-eldritch knight"].spellcastingKnown = {
- cantrips : [0, 0, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5],
- spells : [0, 0, 2, 3, 3, 3, 4, 4, 4, 5, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16]
- };
- ClassSubList["fighter-eldritch knight"].features["action surge"] = {
- name : "Action Surge",
- source : [["P", 72], ["ELC", 18]],
- minlevel : 2,
- description : "\n " + "I can take one additional action on my turn on top of my normally allowed actions",
- usages : [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4],
- recovery : "short rest",
- additional : ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "30 ft teleport", "30 ft teleport", "30 ft teleport", "30 ft teleport", "30 ft teleport", "30 ft teleport", "30 ft teleport", "30 ft teleport", "30 ft teleport", "30 ft teleport", "30 ft teleport", "30 ft teleport", "30 ft teleport", "30 ft teleport", "30 ft teleport", "30 ft teleport", "30 ft teleport", "30 ft teleport", "30 ft teleport", "30 ft teleport", "30 ft teleport", "30 ft teleport", "30 ft teleport", "30 ft teleport", "30 ft teleport", "30 ft teleport"]
- };
- ClassSubList["fighter-eldritch knight"].features["subclassfeature3"] = {
- name : "Spellcasting",
- source : [["P", 75], ["ELC", 18]],
- minlevel : 3,
- description : "\n " + "I can cast known wizard cantrips/spells, using Intelligence as my spellcasting ability",
- additional : ["", "", "2 cantrips \u0026 3 spells known", "2 cantrips \u0026 4 spells known", "2 cantrips \u0026 4 spells known", "2 cantrips \u0026 4 spells known", "2 cantrips \u0026 5 spells known", "2 cantrips \u0026 6 spells known", "2 cantrips \u0026 6 spells known", "3 cantrips \u0026 7 spells known", "3 cantrips \u0026 8 spells known", "3 cantrips \u0026 8 spells known", "3 cantrips \u0026 9 spells known", "3 cantrips \u0026 10 spells known", "3 cantrips \u0026 10 spells known", "3 cantrips \u0026 11 spells known", "3 cantrips \u0026 11 spells known", "3 cantrips \u0026 11 spells known", "3 cantrips \u0026 12 spells known", "3 cantrips \u0026 13 spells known", "3 cantrips \u0026 13 spells known", "3 cantrips \u0026 14 spells known", "3 cantrips \u0026 14 spells known", "3 cantrips \u0026 14 spells known", "3 cantrips \u0026 15 spells known", "3 cantrips \u0026 15 spells known", "4 cantrips \u0026 15 spells known", "4 cantrips \u0026 16 spells known","4 cantrips \u0026 16 spells known", "4 cantrips \u0026 16 spells known", "4 cantrips \u0026 17 spells known", "4 cantrips \u0026 17 spells known", "4 cantrips \u0026 17 spells known", "4 cantrips \u0026 18 spells known", "4 cantrips \u0026 18 spells known", "4 cantrips \u0026 18 spells known","5 cantrips \u0026 19 spells known", "5 cantrips \u0026 19 spells known", "5 cantrips \u0026 19 spells known", "5 cantrips \u0026 20 spells known"],
- spellcastingBonus : { // the spells gained at level 3, 8, 14, 20
- name : "From any school",
- "class" : "wizard",
- times : [0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4],
- level : [1, 4]
- }
- };
- ClassSubList["monk-way of the kensei-xgte"].features["subclassfeature3"] = {//epic feature
- name : "Path of the Kensei",
- source : ["X", 34],
- minlevel : 3,
- description : desc([
- "I gain proficiency with either calligrapher's supplies or painter's supplies",
- "Some weapons, that don't have the heavy or special property, are kensei weapons for me",
- "At least one ranged and one melee weapon, more at higher levels (longbow does qualify)",
- "With these: proficient, count as a monk weapons, special bonuses depending on type held:",
- "\u2022 Melee: if I do unarmed strike during an Attack action, +2 AC until my next turn starts",
- "\u2022 Ranged: as a bonus action, ranged weapon attacks deal +1d4 damage in current turn"
- ]),
- action: ["bonus action", " (with ranged)"],
- additional : levels.map( function(n) { return n < 3 ? "" : (n < 6 ? 2 : n < 11 ? 3 : n < 17 ? 4 : 5) + " kensei weapons"; }),
- toolProfs : ["calligrapher's or painter's supplies"],
- extraname : "Kensei Weapon",
- extrachoices : [], // add these dynamically, see below
- extraTimes : levels.map( function(n) { return n < 3 ? 0 : n < 6 ? 2 : n < 11 ? 3 : n < 17 ? 4 : 5; }),
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (!classes.known.monk || classes.known.monk.level < 2 || v.isSpell) return;
- var theKenseiWeapons = GetFeatureChoice("class", "monk", "subclassfeature3", true);
- if (theKenseiWeapons.indexOf(v.baseWeaponName) != -1 || ((/kensei/i).test(v.WeaponText) && (!(/heavy|special/i).test(fields.Description) || v.baseWeaponName === 'longbow'))) {
- var aMonkDie = function (n) { return n < 5 ? 4 : n < 11 ? 6 : n < 17 ? 8 : n < 23 ? 10 : n < 29 ? 12 : n < 35 ? 16 : 20; }(classes.known.monk.level);
- try {
- var curDie = eval(fields.Damage_Die.replace('d', '*'));
- } catch (e) {
- var curDie = 'x';
- };
- if (isNaN(curDie) || curDie < aMonkDie) {
- fields.Damage_Die = '1d' + aMonkDie;
- };
- if (v.theWea.ability === 1) {
- fields.Mod = v.StrDex;
- };
- if (v.isRangedWeapon) {
- fields.Description += (fields.Description ? '; ' : '') + 'As bonus action with Attack action, +1d4 damage';
- };
- fields.Proficiency = true;
- };
- },
- "For the weapons that I select using the \"Choose Feature\" button on the second page or when I include the word 'Kensei' in the name of a weapon that doesn't have the Heavy or Special attribute, or that is a longbow, that weapon gains the same benefits as any other 'Monk Weapon'.\nIn addition, with ranged 'Kensei Weapons', I can take a bonus action to have that hit, and any other hit after that as part of the same action, do +1d4 damage."
- ]
- }
- };
- ClassSubList["rogue-arcane trickster"].spellcastingList = {
- "class" : "wizard",
- school : ["Ench", "Illus"],
- level : [0, 7]
- };
- ClassSubList["rogue-arcane trickster"].spellcastingKnown = {
- cantrips : [0, 0, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5],
- spells : [0, 0, 2, 3, 3, 3, 4, 4, 4, 5, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16]
- };
- ClassSubList["rogue-arcane trickster"].features["subclassfeature3"] = {
- name : "Spellcasting",
- source : [["P", 98], ["ELC", 31]],
- minlevel : 3,
- description : "\n " + "I can cast known wizard cantrips/spells, using Intelligence as my spellcasting ability",
- additional : ["", "", "3 cantrips \u0026 3 spells known", "3 cantrips \u0026 4 spells known", "3 cantrips \u0026 4 spells known", "3 cantrips \u0026 4 spells known", "3 cantrips \u0026 5 spells known", "3 cantrips \u0026 6 spells known", "3 cantrips \u0026 6 spells known", "4 cantrips \u0026 7 spells known", "4 cantrips \u0026 8 spells known", "4 cantrips \u0026 8 spells known", "4 cantrips \u0026 9 spells known", "4 cantrips \u0026 10 spells known", "4 cantrips \u0026 10 spells known", "4 cantrips \u0026 11 spells known", "4 cantrips \u0026 11 spells known", "4 cantrips \u0026 11 spells known", "4 cantrips \u0026 12 spells known", "4 cantrips \u0026 13 spells known", "4 cantrips \u0026 13 spells known", "4 cantrips \u0026 14 spells known","4 cantrips \u0026 14 spells known", "4 cantrips \u0026 14 spells known", "4 cantrips \u0026 15 spells known", "4 cantrips \u0026 15 spells known", "5 cantrips \u0026 15 spells known", "5 cantrips \u0026 16 spells known","5 cantrips \u0026 16 spells known", "5 cantrips \u0026 16 spells known", "5 cantrips \u0026 17 spells known", "5 cantrips \u0026 17 spells known", "5 cantrips \u0026 17 spells known", "5 cantrips \u0026 18 spells known", "5 cantrips \u0026 18 spells known", "5 cantrips \u0026 18 spells known", "6 cantrips \u0026 19 spells known", "6 cantrips \u0026 19 spells known", "6 cantrips \u0026 19 spells known", "6 cantrips \u0026 20 spells known"],
- spellcastingBonus : [{
- name : "Mage Hand cantrip", // the Mage Hand cantrip gained at level 1
- spells : ["mage hand"],
- selection : ["mage hand"]
- }, {
- name : "From any school", // the spells gained at level 3, 8, 14, 20
- "class" : "wizard",
- times : [0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4],
- level : [1, 4]
- }]
- };
- ClassSubList["wizard-bladesinging"].attacks = [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3];
- var iFileName = "EPICFeats.js";
- RequiredSheetVersion(13);
- /*
- str, dex-ranger, monk
- str, con-barbarian, fighter
- dex, int-rogue
- dex, cha-bard
- con, int-artificer
- con, cha-sorcerer
- int, wis-druid, wizard
- wis, cha-cleric, paladin, warlock
- str, dex, con, int, wis, cha - order of saving throws
- */
- FeatsList["auto epic prof"] = {
- name : "Auto Epic Prof",
- source : ["ELC", 2],
- prerequisite : "Level 21",
- prereqeval : function(v) {
- return v.characterLevel > 20;
- },
- description : "At total level 21, I gain half-prof to all non-prof ability saving throws; I don't count this against my total feats \u0026 don't take this feat if I'm are prof in all saving throws.",
- choices : ["All", "Str,Dex", "Str,Con", "Dex,Int", "Dex,Cha", "Con,Int", "Con,Cha", "Int,Wis", "Wis,Cha"],
- selfChoosing : function () {
- return classes.primary == "ranger" || classes.primary == "monk" ? "str,dex" : classes.primary == "barbarian" || classes.primary == "fighter" ? "str,con" : classes.primary == "rogue" ? "dex,int" : classes.primary == "bard" ? "dex,cha" : classes.primary == "artificer" ? "con,int" : classes.primary == "sorcerer" ? "con,cha" : classes.primary == "druid" || classes.primary == "wizard" ? "int,wis" : classes.primary == "cleric" || classes.primary == "paladin" || classes.primary == "warlock" ? "wis,cha" : "";},
- "str,dex" : {
- description : "",
- source : ["ELC", 2],
- addMod : [
- { type : "save", field : "con", mod : "Prof/2", text : "I gain half-prof to con ability saving throws." },
- { type : "save", field : "int", mod : "Prof/2", text : "I gain half-prof to int ability saving throws." },
- { type : "save", field : "wis", mod : "Prof/2", text : "I gain half-prof to wis ability saving throws." },
- { type : "save", field : "cha", mod : "Prof/2", text : "I gain half-prof to cha ability saving throws." }
- ]
- },
- "str,con" : {
- description : "",
- source : ["ELC", 2],
- addMod : [
- { type : "save", field : "dex", mod : "Prof/2", text : "I gain half-prof to dex ability saving throws." },
- { type : "save", field : "int", mod : "Prof/2", text : "I gain half-prof to int ability saving throws." },
- { type : "save", field : "wis", mod : "Prof/2", text : "I gain half-prof to wis ability saving throws." },
- { type : "save", field : "cha", mod : "Prof/2", text : "I gain half-prof to cha ability saving throws." }
- ]
- },
- "dex,int" : {
- description : "",
- source : ["ELC", 2],
- addMod : [
- { type : "save", field : "str", mod : "Prof/2", text : "I gain half-prof to str ability saving throws." },
- { type : "save", field : "con", mod : "Prof/2", text : "I gain half-prof to con ability saving throws." },
- { type : "save", field : "wis", mod : "Prof/2", text : "I gain half-prof to wis ability saving throws." },
- { type : "save", field : "cha", mod : "Prof/2", text : "I gain half-prof to cha ability saving throws." }
- ]
- },
- "dex,cha" : {
- description : "",
- source : ["ELC", 2],
- addMod : [
- { type : "save", field : "str", mod : "Prof/2", text : "I gain half-prof to str ability saving throws." },
- { type : "save", field : "con", mod : "Prof/2", text : "I gain half-prof to con ability saving throws." },
- { type : "save", field : "int", mod : "Prof/2", text : "I gain half-prof to int ability saving throws." },
- { type : "save", field : "wis", mod : "Prof/2", text : "I gain half-prof to wis ability saving throws." }
- ]
- },
- "con,int" : {
- description : "",
- source : ["ELC", 2],
- addMod : [
- { type : "save", field : "str", mod : "Prof/2", text : "I gain half-prof to str ability saving throws." },
- { type : "save", field : "dex", mod : "Prof/2", text : "I gain half-prof to dex ability saving throws." },
- { type : "save", field : "wis", mod : "Prof/2", text : "I gain half-prof to wis ability saving throws." },
- { type : "save", field : "cha", mod : "Prof/2", text : "I gain half-prof to cha ability saving throws." }
- ]
- },
- "con,cha" : {
- description : "",
- source : ["ELC", 2],
- addMod : [
- { type : "save", field : "str", mod : "Prof/2", text : "I gain half-prof to str ability saving throws." },
- { type : "save", field : "dex", mod : "Prof/2", text : "I gain half-prof to dex ability saving throws." },
- { type : "save", field : "int", mod : "Prof/2", text : "I gain half-prof to int ability saving throws." },
- { type : "save", field : "wis", mod : "Prof/2", text : "I gain half-prof to wis ability saving throws." }
- ]
- },
- "int,wis" : {
- description : "",
- source : ["ELC", 2],
- addMod : [
- { type : "save", field : "str", mod : "Prof/2", text : "I gain half-prof to str ability saving throws." },
- { type : "save", field : "dex", mod : "Prof/2", text : "I gain half-prof to dex ability saving throws." },
- { type : "save", field : "con", mod : "Prof/2", text : "I gain half-prof to con ability saving throws." },
- { type : "save", field : "cha", mod : "Prof/2", text : "I gain half-prof to cha ability saving throws." }
- ]
- },
- "wis,cha" : {
- description : "",
- source : ["ELC", 2],
- addMod : [
- { type : "save", field : "str", mod : "Prof/2", text : "I gain half-prof to str ability saving throws." },
- { type : "save", field : "dex", mod : "Prof/2", text : "I gain half-prof to dex ability saving throws." },
- { type : "save", field : "con", mod : "Prof/2", text : "I gain half-prof to con ability saving throws." },
- { type : "save", field : "int", mod : "Prof/2", text : "I gain half-prof to int ability saving throws." }
- ],
- },
- };
- FeatsList["auto epic stat bumps"] = {
- name : "Auto Epic Stat Bumps",
- source : ["ELC", 1],
- prerequisite : "Level 21",
- prereqeval : function(v) {
- return v.characterLevel > 20;
- },
- description : "At total level 21, my max ability score increase by 10; I don't count this against my total feats.",
- choices : ["not level 20 barb", "level 20 barb"],
- selfChoosing : function () {
- return !classes.known.barbarian || classes.known.barbarian.level < 20 ? "not level 20 barb" : classes.known.barbarian && classes.known.barbarian.level >= 20 ? "level 20 barb" : "";
- },
- "not level 20 barb" : {
- description : "",
- source : ["ELC", 1],
- scoresMaximum : [30,30,30,30,30,30]
- },
- "level 20 barb" : {
- description : "",
- source : ["ELC", 1],
- scoresMaximum : [34,30,34,30,30,30]
- },
- };
- FeatsList["ranged smite"] = {
- name : "Ranged Smite",
- source : ["ELC", 56],
- prerequisite : "level 1 Paladin",
- prereqeval : function(v) {
- return classes.known.paladin;
- },
- description : "I can use divine smite with ranged weapons",
- descriptionFull : "You can use divine smite with a ranged weapon as well as melee weapons.",
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.isRangedWeapon && classes.known.paladin && classes.known.paladin.level > 10) {
- v.smiteDmg = classes.known.paladin.level < 38 ? 1 : 2;
- v.smiteDie = classes.known.paladin.level < 25 ? 'd8' : 'd12';
- fields.Description += (fields.Description ? '; ' : '') + '+' + v.smiteDmg + v.smiteDie + ' Radiant damage';
- };
- },
- "With my ranged weapon attacks I deal extra radiant damage"
- ]
- }
- };
- FeatsList["monkey grip"] = {
- name : "Monkey Grip",
- source : ["ELC", 56],
- prerequisite : "Strength 20 or higher",
- prereqeval : function(v) {
- return What('Str') >= 20;
- },
- description : "I remove the versatile, two-handed, and heavy property for weapons. For the versatile weapons, I use the bigger die",
- descriptionFull : "You possess so much strength that you have learned how to use weapons typically reserved for two hands in one hand. This feat removes the two handed and heavy property for weapons that you use. Futhermore, if that weapon has the versatile property it uses the larger die from the versatile property.",
- calcChanges : {
- atkAdd : [
- function (fields, v) {// origanal ((/\b(versatile|(2|two).?hand(ed)?s?|heavy)\b/i).test(v.theWea.description))
- if (!(v.baseWeaponName == "longbow") && (/\b((2|two).?hand(ed)?s?|heavy)\b/i).test(v.theWea.description)) { fields.Description = fields.Description.replace(/(2|two).?hand(ed)?s?,?|heavy,?/ig, '');
- return true;
- };
- if (v.baseWeaponName == "longbow") {fields.Description = fields.Description.replace(/heavy,?/i, '');};
- if ((/versatile/i).test(v.theWea.description) && (/d8/i).test(v.theWea.description)) { fields.Damage_Die = '1d8';
- fields.Description = fields.Description.replace(/versatile/i, '');
- fields.Description = fields.Description.replace('(1d8)', '');
- };
- if ((/versatile/i).test(v.theWea.description) && (/d10/i).test(v.theWea.description)) { fields.Damage_Die = '1d10';
- fields.Description = fields.Description.replace(/versatile/i, '');
- fields.Description = fields.Description.replace(' (1d10)', '');
- };
- },
- "I remove the heavy, two-handed, and versatile property of weapons"
- ],
- atkCalc : [
- function (fields, v, output) {
- for (var i = 1; i <= FieldNumbers.actions; i++) {
- if ((/off.hand.attack/i).test(What('Bonus Action ' + i))) return;
- };
- if (v.isMeleeWeapon && !v.isNaturalWeapon && GetFeatureChoice('class', 'bard', 'subclassfeature3.1') == 'dueling' && (/\b(2|two).?hand(ed)?s?\b/i).test(v.theWea.description)) output.extraDmg += 2;
- if (v.isMeleeWeapon && !v.isNaturalWeapon && GetFeatureChoice('class', 'fighter', 'fighting style') == 'dueling' && (/\b(2|two).?hand(ed)?s?\b/i).test(v.theWea.description)) output.extraDmg += 2;
- if (v.isMeleeWeapon && !v.isNaturalWeapon && GetFeatureChoice('class', 'fighter', 'improved fighting style') == 'dueling' && (/\b(2|two).?hand(ed)?s?\b/i).test(v.theWea.description)) output.extraDmg += 3;
- if (v.isMeleeWeapon && !v.isNaturalWeapon && GetFeatureChoice('class', 'fighter', 'subclassfeature10') == 'dueling' && (/\b(2|two).?hand(ed)?s?\b/i).test(v.theWea.description)) output.extraDmg += 2;
- if (v.isMeleeWeapon && !v.isNaturalWeapon && GetFeatureChoice('class', 'fighter', 'subclassfeature27') == 'dueling' && (/\b(2|two).?hand(ed)?s?\b/i).test(v.theWea.description)) output.extraDmg += 3;
- if (v.isMeleeWeapon && !v.isNaturalWeapon && GetFeatureChoice('class', 'paladin', 'fighting style') == 'dueling' && (/\b(2|two).?hand(ed)?s?\b/i).test(v.theWea.description)) output.extraDmg += 2;
- if (v.isMeleeWeapon && !v.isNaturalWeapon && GetFeatureChoice('class', 'paladin', 'improved fighting style') == 'dueling' && (/\b(2|two).?hand(ed)?s?\b/i).test(v.theWea.description)) output.extraDmg += 3;
- if (v.isMeleeWeapon && !v.isNaturalWeapon && GetFeatureChoice('class', 'ranger', 'fighting style') == 'dueling' && (/\b(2|two).?hand(ed)?s?\b/i).test(v.theWea.description)) output.extraDmg += 2;
- if (v.isMeleeWeapon && !v.isNaturalWeapon && GetFeatureChoice('class', 'ranger', 'improved fighting style') == 'dueling' && (/\b(2|two).?hand(ed)?s?\b/i).test(v.theWea.description)) output.extraDmg += 3;
- },
- "If I have the dueling fighting style, my two-handed melee weapons gets a +2 damage following the conditions set forth by Dueling Fighting Style; This stacks with a +3 from Improved Dueling Fighting Style."
- ]
- }
- };
- /*FeatsList["racial paragon"] = {
- name : "Racial Paragon",
- source : ["ELC", 51],
- prerequisite : "Level 31",
- prereqeval : function(v) {
- return v.characterLevel > 30;
- },
- description : "I became a paragon of my race",
- choices : ["Dwarf", "Elf", "Halfing", "Human", "Dragonborn", "Gnome", "Half Elf", "Half Orc", "Tiefling", "Aasimar", "Firbolg", "Goliath", "Kenku", "Lizardfolk", "Tabaxi", "Triton", "Bugbear", "Goblin", "Hobgoblin", "Kobold", "Orc", "Yuan-ti pureblood", "Genasi", "Aarakocra", "Centaur", "Loxodon", "Minotaur", "Simic Hybrid", "Vedalken", "Changeling", "Kalashtar", "Shifter", "Warforged"],
- "dwarf" : {
- name : "Dwarf",
- description : "",
- source : ["ELC", 51],
- },
- };
- */
- // epic spells feature
- var iFileName = "EPICSpellLists.js";
- RequiredSheetVersion(13);
- /*
- 21-25 1
- 26-30 2
- 31-35 3
- 36-40 4
- All classes able to cast epic spells:
- bard, done
- cleric, done
- druid, done
- sorcerer, done
- wizard, done
- eldritch knight, done
- arcane trickster, ??? kinda
- warlock, done
- All Classes Able to cast healing spells (excludeing wish, vampiric touch, enervation, soul cage because they don't seem to match with RAI for the epic classes):
- Bard, done
- cleric, done
- druid, done
- celestial warlock, done
- (good(not going to bother)) divine soul sorcerers, done
- */
- //epic feature
- /*
- For epic feature
- Treat all classes like warlock book of ancient secrets and just add spells using class varients code
- make spells known as additional : on epic spells feature
- use original class as base for description:
- I.E. bards change known spells once per level up,
- clerics and druids prepare all epic spells
- wizard learn epic spells and can pick up other epic spells later.
- */
- //class epic spell uses as features
- ClassList.bard.features["el spell table"] = {
- name : "EL Spell Table",
- source : ["ELC", 7],
- minlevel : 22,
- "el1: ea. spell" : {
- name : "EL1: ea. Spell",
- source : ["ELC", 7],
- description : "",
- usages : levels.map(function (n) {
- return n < 22 ? "" : n < 26 ? 1 : n < 31 ? 2 : n < 36 ? 3 : 4;
- }),
- recovery : "long rest"
- },
- "el2: ea. spell" : {
- name : "EL2: ea. Spell",
- source : ["ELC", 7],
- description : "",
- usages : levels.map(function (n) {
- return n < 26 ? "" : n < 31 ? 1 : n < 36 ? 2 : 3 ;
- }),
- recovery : "long rest"
- },
- "el3: ea. spell" : {
- name : "EL3: ea. Spell",
- source : ["ELC", 7],
- description : "",
- usages : levels.map(function (n) {
- return n < 31 ? "" : n < 36 ? 1 : 2;
- }),
- recovery : "long rest"
- },
- "el4: ea. spell" : {
- name : "EL4: ea. Spell",
- source : ["ELC", 7],
- description : "",
- usages : 1,
- recovery : "long rest"
- },
- autoSelectExtrachoices : [{
- extrachoice : "el1: ea. spell",
- extraname : "EL Spell Table",
- }, {
- extrachoice : "el2: ea. spell",
- extraname : "EL Spell Table",
- minlevel : 26
- }, {
- extrachoice : "el3: ea. spell",
- extraname : "EL Spell Table",
- minlevel : 31
- }, {
- extrachoice : "el4: ea. spell",
- extraname : "EL Spell Table",
- minlevel : 36
- }]
- };
- ClassList.cleric.features["el spell table"] = {
- name : "EL Spell Table",
- source : ["ELC", 7],
- minlevel : 21,
- "el1: ea. spell" : {
- name : "EL1: ea. Spell",
- source : ["ELC", 7],
- description : "",
- usages : levels.map(function (n) {
- return n < 22 ? "" : n < 26 ? 1 : n < 31 ? 2 : n < 36 ? 3 : 4;
- }),
- recovery : "long rest"
- },
- "el2: ea. spell" : {
- name : "EL2: ea. Spell",
- source : ["ELC", 7],
- description : "",
- usages : levels.map(function (n) {
- return n < 26 ? "" : n < 31 ? 1 : n < 36 ? 2 : 3 ;
- }),
- recovery : "long rest"
- },
- "el3: ea. spell" : {
- name : "EL3: ea. Spell",
- source : ["ELC", 7],
- description : "",
- usages : levels.map(function (n) {
- return n < 31 ? "" : n < 36 ? 1 : 2;
- }),
- recovery : "long rest"
- },
- "el4: ea. spell" : {
- name : "EL4: ea. Spell",
- source : ["ELC", 7],
- description : "",
- usages : 1,
- recovery : "long rest"
- },
- autoSelectExtrachoices : [{
- extrachoice : "el1: ea. spell",
- extraname : "EL Spell Table",
- }, {
- extrachoice : "el2: ea. spell",
- extraname : "EL Spell Table",
- minlevel : 26
- }, {
- extrachoice : "el3: ea. spell",
- extraname : "EL Spell Table",
- minlevel : 31
- }, {
- extrachoice : "el4: ea. spell",
- extraname : "EL Spell Table",
- minlevel : 36
- }]
- };
- ClassList.druid.features["el spell table"] = {
- name : "EL Spell Table",
- source : ["ELC", 7],
- minlevel : 21,
- "el1: ea. spell" : {
- name : "EL1: ea. Spell",
- source : ["ELC", 7],
- description : "",
- usages : levels.map(function (n) {
- return n < 22 ? "" : n < 26 ? 1 : n < 31 ? 2 : n < 36 ? 3 : 4;
- }),
- recovery : "long rest"
- },
- "el2: ea. spell" : {
- name : "EL2: ea. Spell",
- source : ["ELC", 7],
- description : "",
- usages : levels.map(function (n) {
- return n < 26 ? "" : n < 31 ? 1 : n < 36 ? 2 : 3 ;
- }),
- recovery : "long rest"
- },
- "el3: ea. spell" : {
- name : "EL3: ea. Spell",
- source : ["ELC", 7],
- description : "",
- usages : levels.map(function (n) {
- return n < 31 ? "" : n < 36 ? 1 : 2;
- }),
- recovery : "long rest"
- },
- "el4: ea. spell" : {
- name : "EL4: ea. Spell",
- source : ["ELC", 7],
- description : "",
- usages : 1,
- recovery : "long rest"
- },
- autoSelectExtrachoices : [{
- extrachoice : "el1: ea. spell",
- extraname : "EL Spell Table",
- }, {
- extrachoice : "el2: ea. spell",
- extraname : "EL Spell Table",
- minlevel : 26
- }, {
- extrachoice : "el3: ea. spell",
- extraname : "EL Spell Table",
- minlevel : 31
- }, {
- extrachoice : "el4: ea. spell",
- extraname : "EL Spell Table",
- minlevel : 36
- }]
- };
- ClassList.sorcerer.features["el spell table"] = {
- name : "EL Spell Table",
- source : ["ELC", 7],
- minlevel : 21,
- "el1: ea. spell" : {
- name : "EL1: ea. Spell",
- source : ["ELC", 7],
- description : "",
- usages : levels.map(function (n) {
- return n < 22 ? "" : n < 26 ? 1 : n < 31 ? 2 : n < 36 ? 3 : 4;
- }),
- recovery : "long rest"
- },
- "el2: ea. spell" : {
- name : "EL2: ea. Spell",
- source : ["ELC", 7],
- description : "",
- usages : levels.map(function (n) {
- return n < 26 ? "" : n < 31 ? 1 : n < 36 ? 2 : 3 ;
- }),
- recovery : "long rest"
- },
- "el3: ea. spell" : {
- name : "EL3: ea. Spell",
- source : ["ELC", 7],
- description : "",
- usages : levels.map(function (n) {
- return n < 31 ? "" : n < 36 ? 1 : 2;
- }),
- recovery : "long rest"
- },
- "el4: ea. spell" : {
- name : "EL4: ea. Spell",
- source : ["ELC", 7],
- description : "",
- usages : 1,
- recovery : "long rest"
- },
- autoSelectExtrachoices : [{
- extrachoice : "el1: ea. spell",
- extraname : "EL Spell Table",
- }, {
- extrachoice : "el2: ea. spell",
- extraname : "EL Spell Table",
- minlevel : 26
- }, {
- extrachoice : "el3: ea. spell",
- extraname : "EL Spell Table",
- minlevel : 31
- }, {
- extrachoice : "el4: ea. spell",
- extraname : "EL Spell Table",
- minlevel : 36
- }]
- };
- ClassList.warlock.features["el spell table"] = {
- name : "EL Spell Table",
- source : ["ELC", 7],
- minlevel : 30,
- "el1: ea. spell" : {
- name : "EL1: ea. Spell",
- source : ["ELC", 7],
- description : "",
- usages : levels.map(function (n) {
- return n < 22 ? "" : n < 26 ? 1 : n < 31 ? 2 : n < 36 ? 3 : 4;
- }),
- recovery : "long rest"
- },
- "el2: ea. spell" : {
- name : "EL2: ea. Spell",
- source : ["ELC", 7],
- description : "",
- usages : levels.map(function (n) {
- return n < 26 ? "" : n < 31 ? 1 : n < 36 ? 2 : 3 ;
- }),
- recovery : "long rest"
- },
- "el3: ea. spell" : {
- name : "EL3: ea. Spell",
- source : ["ELC", 7],
- description : "",
- usages : levels.map(function (n) {
- return n < 31 ? "" : n < 36 ? 1 : 2;
- }),
- recovery : "long rest"
- },
- "el4: ea. spell" : {
- name : "EL4: ea. Spell",
- source : ["ELC", 7],
- description : "",
- usages : 1,
- recovery : "long rest"
- },
- autoSelectExtrachoices : [{
- extrachoice : "el1: ea. spell",
- extraname : "EL Spell Table",
- }, {
- extrachoice : "el2: ea. spell",
- extraname : "EL Spell Table",
- }, {
- extrachoice : "el3: ea. spell",
- extraname : "EL Spell Table",
- minlevel : 31
- }, {
- extrachoice : "el4: ea. spell",
- extraname : "EL Spell Table",
- minlevel : 36
- }]
- };
- ClassList.wizard.features["el spell table"] = {
- name : "EL Spell Table",
- source : ["ELC", 7],
- minlevel : 23,
- "el1: ea. spell" : {
- name : "EL1: ea. Spell",
- source : ["ELC", 7],
- description : "",
- usages : levels.map(function (n) {
- return n < 22 ? "" : n < 26 ? 1 : n < 31 ? 2 : n < 36 ? 3 : 4;
- }),
- recovery : "long rest"
- },
- "el2: ea. spell" : {
- name : "EL2: ea. Spell",
- source : ["ELC", 7],
- description : "",
- usages : levels.map(function (n) {
- return n < 26 ? "" : n < 31 ? 1 : n < 36 ? 2 : 3 ;
- }),
- recovery : "long rest"
- },
- "el3: ea. spell" : {
- name : "EL3: ea. Spell",
- source : ["ELC", 7],
- description : "",
- usages : levels.map(function (n) {
- return n < 31 ? "" : n < 36 ? 1 : 2;
- }),
- recovery : "long rest"
- },
- "el4: ea. spell" : {
- name : "EL4: ea. Spell",
- source : ["ELC", 7],
- description : "",
- usages : 1,
- recovery : "long rest"
- },
- autoSelectExtrachoices : [{
- extrachoice : "el1: ea. spell",
- extraname : "EL Spell Table",
- }, {
- extrachoice : "el2: ea. spell",
- extraname : "EL Spell Table",
- minlevel : 26
- }, {
- extrachoice : "el3: ea. spell",
- extraname : "EL Spell Table",
- minlevel : 31
- }, {
- extrachoice : "el4: ea. spell",
- extraname : "EL Spell Table",
- minlevel : 36
- }]
- };
- ClassSubList["fighter-eldritch knight"].features["el1: ea. spell"] = {
- name : "EL1: ea. Spell",
- source : ["ELC", 18],
- minlevel : 38,
- description : "",
- usages : levels.map(function (n) {
- return n < 22 ? "" : n < 26 ? 1 : n < 31 ? 2 : n < 36 ? 3 : 4;
- }),
- recovery : "long rest"
- };
- // bard epic spell feature
- ClassList.bard.features["epic bard spells"] = { //bard 22, 28, 34, 39
- name : "Epic Bard Spells",
- source : ["ELC", 7],
- minlevel : 22,
- description : "\n " + "Whenever I gain a bard level, I can replace an epic spell I know with another.",
- eval : function() {
- CurrentSpells['bard-epic spells'] = {
- name : 'Bard Epic Spells',
- ability : 6,
- list : {'class' : ['epic', 'ebard', 'eheal']},
- known : {spells : 'book'},
- refType : "feat"
- };
- if (CurrentSpells['Bard Epic Spells'] && CurrentSpells['Bard Epic Spells'].selectSp) {
- // v12.999 style is present, so transfer chosen spells over and remove it
- CurrentSpells['bard-epic spells'].offsetBo = CurrentSpells['Bard Epic Spells'].offsetBo;
- CurrentSpells['bard-epic spells'].selectBo = CurrentSpells['Bard Epic Spells'].selectBo;
- CurrentSpells['bard-epic spells'].selectSp = CurrentSpells['Bard Epic Spells'].selectSp;
- delete CurrentSpells['Bard Epic Spells'];
- }
- SetStringifieds('spells'); CurrentUpdates.types.push('spells');
- },
- removeeval : function() {
- delete CurrentSpells['bard-epic spells'];
- SetStringifieds('spells'); CurrentUpdates.types.push('spells');
- },
- additional : levels.map(function (n) {
- return n < 22 ? "" : (n < 28 ? 1 : n < 34 ? 2 : n < 39 ? 3 : 4) + " epic spells known";
- }),
- "epic bard spells 23" : {
- name : "Epic Bard Spells 23",
- source : ["ELC", 7],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "bard-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["epic arcane lock", "teleport without error"]);
- },
- "This alternative class feature enhancement expands the spells list of the bard epic spell class feature."
- ]
- }
- },
- "epic bard spells 25" : {
- name : "Epic Bard Spells 25",
- source : ["ELC", 7],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "bard-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["aegis of ages", "concentration of almgar", "epic remove curse", "epic dispel magic", "epic counterspell", "greater demiplane", "mislead divination"]);
- },
- "This alternative class feature enhancement expands the spells list of the bard epic spell class feature."
- ]
- }
- },
- "epic bard spells 27" : {
- name : "Epic Bard Spells 27",
- source : ["ELC", 7],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "bard-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["call superior undead", "immediate Rest"]);
- },
- "This alternative class feature enhancement expands the spells list of the bard epic spell class feature."
- ]
- }
- },
- "epic bard spells 30" : {
- name : "Epic Bard Spells 30",
- source : ["ELC", 7],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "bard-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["age reversal", "create lesser mythal", "control monster", "eyes of the prophet", "guarantee of fates: lucky", "universal flight"]);
- },
- "This alternative class feature enhancement expands the spells list of the bard epic spell class feature."
- ]
- }
- },
- "epic bard spells 33" : {
- name : "Epic Bard Spells 33",
- source : ["ELC", 7],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "bard-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["marvelous alacrity"]);
- },
- "This alternative class feature enhancement expands the spells list of the bard epic spell class feature."
- ]
- }
- },
- "epic bard spells 35" : {
- name : "Epic Bard Spells 35",
- source : ["ELC", 7],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "bard-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["lael's mass greater heal", "mass true resurrection"]);
- },
- "This alternative class feature enhancement expands the spells list of the bard epic spell class feature."
- ]
- }
- },
- "epic bard spells 37" : {
- name : "Epic Bard Spells 37",
- source : ["ELC", 33],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "bard-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["summon epic fiend"]);
- },
- "This alternative class feature enhancement expands the spells list of the bard epic spell class feature."
- ]
- }
- },
- "epic bard spells 39" : {
- name : "Epic Bard Spells 39",
- source : ["ELC", 7],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "bard-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["greater wish", "create greater mythal", "ellisar's mark of desolation"]);
- },
- "This alternative class feature enhancement expands the spells list of the bard epic spell class feature."
- ]
- }
- },
- autoSelectExtrachoices : [{
- extrachoice : "epic bard spells 23",
- extraname : "Epic Bard Spells",
- minlevel : 23
- }, {
- extrachoice : "epic bard spells 25",
- extraname : "Epic Bard Spells",
- minlevel : 25
- }, {
- extrachoice : "epic bard spells 27",
- extraname : "Epic Bard Spells",
- minlevel : 27
- }, {
- extrachoice : "epic bard spells 30",
- extraname : "Epic Bard Spells",
- minlevel : 30
- }, {
- extrachoice : "epic bard spells 33",
- extraname : "Epic Bard Spells",
- minlevel : 33
- }, {
- extrachoice : "epic bard spells 35",
- extraname : "Epic Bard Spells",
- minlevel : 35
- }, {
- extrachoice : "epic bard spells 37",
- extraname : "Epic Bard Spells",
- minlevel : 37
- },{
- extrachoice : "epic bard spells 39",
- extraname : "Epic Bard Spells",
- minlevel : 39
- }]
- };
- // cleric epic spell feature
- ClassList.cleric.features["epic cleric spells"] = { //cleric 21, 25, 29, 33, 37
- name : "Epic Cleric Spells",
- source : ["ELC", 9],
- minlevel : 21,
- description : "\n " + "I can prepare my epic cleric spells",
- eval : function() {
- CurrentSpells['cleric-epic spells'] = {
- name : 'Cleric Epic Spells',
- ability : 5,
- list : {'class' : ['epic', 'ecleric', 'eheal']},
- known : {spells : 'list'},
- refType : "feat"
- };
- if (CurrentSpells['Cleric Epic Spells'] && CurrentSpells['Cleric Epic Spells'].selectSp) {
- // v12.999 style is present, so transfer chosen spells over and remove it
- CurrentSpells['cleric-epic spells'].offsetBo = CurrentSpells['Cleric Epic Spells'].offsetBo;
- CurrentSpells['cleric-epic spells'].selectBo = CurrentSpells['Cleric Epic Spells'].selectBo;
- CurrentSpells['cleric-epic spells'].selectSp = CurrentSpells['Cleric Epic Spells'].selectSp;
- delete CurrentSpells['Cleric Epic Spells'];
- }
- SetStringifieds('spells'); CurrentUpdates.types.push('spells');
- },
- removeeval : function() {
- delete CurrentSpells['cleric-epic spells'];
- SetStringifieds('spells'); CurrentUpdates.types.push('spells');
- },
- additional : levels.map(function (n) {
- return n < 21 ? "" : (n < 25 ? 1 : n < 29 ? 2 : n < 33 ? 3 : n < 37 ? 4 : 5) + " epic spells prepared";
- }),
- "epic cleric spells 23" : {
- name : "Epic Cleric Spells 23",
- source : ["ELC", 9],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "cleric-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["epic arcane lock", "teleport without error"]);
- },
- "This alternative class feature enhancement expands the spells list of the cleric epic spell class feature."
- ]
- }
- },
- "epic cleric spells 25" : {
- name : "Epic Cleric Spells 25",
- source : ["ELC", 9],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "cleric-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["aegis of ages", "concentration of almgar", "epic remove curse", "epic dispel magic", "greater demiplane", "mislead divination"]);
- },
- "This alternative class feature enhancement expands the spells list of the cleric epic spell class feature."
- ]
- }
- },
- "epic cleric spells 27" : {
- name : "Epic Cleric Spells 27",
- source : ["ELC", 9],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "cleric-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["call superior undead", "immediate Rest", "reanimate person"]);
- },
- "This alternative class feature enhancement expands the spells list of the cleric epic spell class feature."
- ]
- }
- },
- "epic cleric spells 30" : {
- name : "Epic Cleric Spells 30",
- source : ["ELC", 9],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "cleric-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["age reversal", "create lesser mythal", "eyes of the prophet", "guarantee of fates: lucky", "lady claisa's aura of heavenly radiance", "universal flight"]);
- },
- "This alternative class feature enhancement expands the spells list of the cleric epic spell class feature."
- ]
- }
- },
- "epic cleric spells 33" : {
- name : "Epic Cleric Spells 33",
- source : ["ELC", 9],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "cleric-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["marvelous alacrity"]);
- },
- "This alternative class feature enhancement expands the spells list of the cleric epic spell class feature."
- ]
- }
- },
- "epic cleric spells 35" : {
- name : "Epic Cleric Spells 27",
- source : ["ELC", 9],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "cleric-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["fate seal", "lael's mass greater heal", "mass true resurrection"]);
- },
- "This alternative class feature enhancement expands the spells list of the cleric epic spell class feature."
- ]
- }
- },
- "epic cleric spells 37" : {
- name : "Epic Cleric Spells 37",
- source : ["ELC", 33],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "cleric-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["summon epic fiend"]);
- },
- "This alternative class feature enhancement expands the spells list of the cleric epic spell class feature."
- ]
- }
- },
- "epic cleric spells 39" : {
- name : "Epic Cleric Spells 39",
- source : ["ELC", 9],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "cleric-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["greater wish", "create greater mythal", "reanimate monster", "temporal travel"]);
- },
- "This alternative class feature enhancement expands the spells list of the cleric epic spell class feature."
- ]
- }
- },
- autoSelectExtrachoices : [{
- extrachoice : "epic cleric spells 23",
- extraname : "Epic Cleric Spells",
- minlevel : 23
- }, {
- extrachoice : "epic cleric spells 25",
- extraname : "Epic Cleric Spells",
- minlevel : 25
- }, {
- extrachoice : "epic cleric spells 27",
- extraname : "Epic Cleric Spells",
- minlevel : 27
- }, {
- extrachoice : "epic cleric spells 30",
- extraname : "Epic Cleric Spells",
- minlevel : 30
- }, {
- extrachoice : "epic cleric spells 33",
- extraname : "Epic Cleric Spells",
- minlevel : 33
- }, {
- extrachoice : "epic cleric spells 35",
- extraname : "Epic Cleric Spells",
- minlevel : 35
- }, {
- extrachoice : "epic cleric spells 37",
- extraname : "Epic Cleric Spells",
- minlevel : 37
- }, {
- extrachoice : "epic cleric spells 39",
- extraname : "Epic Cleric Spells",
- minlevel : 39
- }]
- };
- // druid epic spell feature
- ClassList.druid.features["epic druid spells"] = { //druid 21, 26, 29, 35, 37
- name : "Epic Druid Spells",
- source : ["ELC", 13],
- minlevel : 21,
- description : "\n " + "I can prepare my epic druid spells",
- eval : function() {
- CurrentSpells['druid-epic spells'] = {
- name : 'Druid Epic Spells',
- ability : 5,
- list : {'class' : ['epic', 'eheal', 'edruid']},
- known : {spells : 'list'},
- refType : "feat"
- };
- if (CurrentSpells['Druid Epic Spells'] && CurrentSpells['Druid Epic Spells'].selectSp) {
- // v12.999 style is present, so transfer chosen spells over and remove it
- CurrentSpells['druid-epic spells'].offsetBo = CurrentSpells['Druid Epic Spells'].offsetBo;
- CurrentSpells['druid-epic spells'].selectBo = CurrentSpells['Druid Epic Spells'].selectBo;
- CurrentSpells['druid-epic spells'].selectSp = CurrentSpells['Druid Epic Spells'].selectSp;
- delete CurrentSpells['Druid Epic Spells'];
- }
- SetStringifieds('spells'); CurrentUpdates.types.push('spells');
- },
- removeeval : function() {
- delete CurrentSpells['druid-epic spells'];
- SetStringifieds('spells'); CurrentUpdates.types.push('spells');
- },
- additional : levels.map(function (n) {
- return n < 21 ? "" : (n < 26 ? 1 : n < 29 ? 2 : n < 35 ? 3 : n < 37 ? 4 : 5) + " epic spells prepared";
- }),
- "epic druid spells 23" : {
- name : "Epic Druid Spells 23",
- source : ["ELC", 13],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "druid-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["epic arcane lock", "teleport without error"]);
- },
- "This alternative class feature enhancement expands the spells list of the druid epic spell class feature."
- ]
- }
- },
- "epic druid spells 25" : {
- name : "Epic Druid Spells 25",
- source : ["ELC", 13],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "druid-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["aegis of ages", "concentration of almgar", "epic remove curse", "epic dispel magic", "greater demiplane", "mislead divination"]);
- },
- "This alternative class feature enhancement expands the spells list of the druid epic spell class feature."
- ]
- }
- },
- "epic druid spells 26" : {
- name : "Epic Druid Spells 26",
- source : ["ELC", 13],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "druid-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["conjure greater animals"]);
- },
- "This alternative class feature enhancement expands the spells list of the druid epic spell class feature."
- ]
- }
- },
- "epic druid spells 27" : {
- name : "Epic Druid Spells 27",
- source : ["ELC", 13],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "druid-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["call superior undead", "immediate Rest"]);
- },
- "This alternative class feature enhancement expands the spells list of the druid epic spell class feature."
- ]
- }
- },
- "epic druid spells 30" : {
- name : "Epic Druid Spells 30",
- source : ["ELC", 13],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "druid-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["age reversal", "create lesser mythal", "eyes of the prophet", "guarantee of fates: lucky", "universal flight"]);
- },
- "This alternative class feature enhancement expands the spells list of the druid epic spell class feature."
- ]
- }
- },
- "epic druid spells 33" : {
- name : "Epic Druid Spells 33",
- source : ["ELC", 13],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "druid-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["marvelous alacrity"]);
- },
- "This alternative class feature enhancement expands the spells list of the druid epic spell class feature."
- ]
- }
- },
- "epic druid spells 35" : {
- name : "Epic Druid Spells 27",
- source : ["ELC", 13],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "druid-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["lael's mass greater heal", "mass true resurrection"]);
- },
- "This alternative class feature enhancement expands the spells list of the druid epic spell class feature."
- ]
- }
- },
- "epic druid spells 37" : {
- name : "Epic druid Spells 37",
- source : ["ELC", 33],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "druid-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["summon epic fiend"]);
- },
- "This alternative class feature enhancement expands the spells list of the druid epic spell class feature."
- ]
- }
- },
- "epic druid spells 39" : {
- name : "Epic Druid Spells 39",
- source : ["ELC", 13],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "druid-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["greater wish", "create greater mythal"]);
- },
- "This alternative class feature enhancement expands the spells list of the druid epic spell class feature."
- ]
- }
- },
- autoSelectExtrachoices : [{
- extrachoice : "epic druid spells 23",
- extraname : "Epic Druid Spells",
- minlevel : 23
- }, {
- extrachoice : "epic druid spells 25",
- extraname : "Epic Druid Spells",
- minlevel : 25
- }, {
- extrachoice : "epic druid spells 26",
- extraname : "Epic Druid Spells",
- minlevel : 26
- }, {
- extrachoice : "epic druid spells 27",
- extraname : "Epic Druid Spells",
- minlevel : 27
- }, {
- extrachoice : "epic druid spells 30",
- extraname : "Epic Druid Spells",
- minlevel : 30
- }, {
- extrachoice : "epic druid spells 33",
- extraname : "Epic Druid Spells",
- minlevel : 33
- }, {
- extrachoice : "epic druid spells 35",
- extraname : "Epic Druid Spells",
- minlevel : 35
- }, {
- extrachoice : "epic druid spells 37",
- extraname : "Epic Druid Spells",
- minlevel : 37
- }, {
- extrachoice : "epic druid spells 39",
- extraname : "Epic Druid Spells",
- minlevel : 39
- }]
- };
- //Eldritch Knight epic spell feature
- ClassSubList["fighter-eldritch knight"].features["arcane mastery"] = { //eldritch knight 38
- name : "Arcane Mastery",
- source : ["ELC", 18],
- minlevel : 38,
- description : "\n " + "I learn one epic spell as if I was a level 25 wizard.",
- eval : function() {
- CurrentSpells['knight-epic spells'] = {
- name : 'Arcane Mastery',
- ability : 4,
- list : {'class' : ['epic', 'ewizard', 'eknight']},
- known : {spells : 'book'},
- refType : "feat"
- };
- if (CurrentSpells['Arcane Mastery'] && CurrentSpells['Arcane Mastery'].selectSp) {
- // v12.999 style is present, so transfer chosen spells over and remove it
- CurrentSpells['knight-epic spells'].offsetBo = CurrentSpells['Arcane Mastery'].offsetBo;
- CurrentSpells['knight-epic spells'].selectBo = CurrentSpells['Arcane Mastery'].selectBo;
- CurrentSpells['knight-epic spells'].selectSp = CurrentSpells['Arcane Mastery'].selectSp;
- delete CurrentSpells['Arcane Mastery'];
- }
- SetStringifieds('spells'); CurrentUpdates.types.push('spells');
- },
- removeeval : function() {
- delete CurrentSpells['knight-epic spells'];
- SetStringifieds('spells'); CurrentUpdates.types.push('spells');
- },
- additional : "1 epic spell known",
- };
- // sorcerer epic spell feature
- ClassList.sorcerer.features["epic sorcerer spells"] = { //sorcerer 21, 25, 29, 34, 37
- name : "Epic Sorcerer Spells",
- source : ["ELC", 33],
- minlevel : 21,
- description : "\n " + "Whenever I gain a sorcerer level, I can replace an epic spell I know with another.",
- eval : function() {
- CurrentSpells['sorcerer-epic spells'] = {
- name : 'Sorcerer Epic Spells',
- ability : 6,
- list : {'class' : ['epic', 'esorcerer']},
- known : {spells : 'book'},
- refType : "feat"
- };
- if (CurrentSpells['Sorcerer Epic Spells'] && CurrentSpells['Sorcerer Epic Spells'].selectSp) {
- // v12.999 style is present, so transfer chosen spells over and remove it
- CurrentSpells['sorcerer-epic spells'].offsetBo = CurrentSpells['Sorcerer Epic Spells'].offsetBo;
- CurrentSpells['sorcerer-epic spells'].selectBo = CurrentSpells['Sorcerer Epic Spells'].selectBo;
- CurrentSpells['sorcerer-epic spells'].selectSp = CurrentSpells['Sorcerer Epic Spells'].selectSp;
- delete CurrentSpells['Sorcerer Epic Spells'];
- }
- SetStringifieds('spells'); CurrentUpdates.types.push('spells');
- },
- removeeval : function() {
- delete CurrentSpells['sorcerer-epic spells'];
- SetStringifieds('spells'); CurrentUpdates.types.push('spells');
- },
- additional : levels.map(function (n) {
- return n < 21 ? "" : (n < 25 ? 1 : n < 29 ? 2 : n < 34 ? 3 : n < 37 ? 4 : 5) + " epic spells prepared";
- }),
- "epic sorcerer spells 23" : {
- name : "Epic Sorcerer Spells 23",
- source : ["ELC", 33],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "sorcerer-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["epic arcane lock", "teleport without error"]);
- },
- "This alternative class feature enhancement expands the spells list of the sorcerer epic spell class feature."
- ]
- }
- },
- "epic sorcerer spells 25" : {
- name : "Epic Sorcerer Spells 25",
- source : ["ELC", 33],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "sorcerer-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["aegis of ages", "concentration of almgar", "epic remove curse", "epic dispel magic", "greater demiplane", "mislead divination", "epic counterspell"]);
- },
- "This alternative class feature enhancement expands the spells list of the sorcerer epic spell class feature."
- ]
- }
- },
- "epic sorcerer spells 27" : {
- name : "Epic Sorcerer Spells 27",
- source : ["ELC", 33],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "sorcerer-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["call superior undead", "immediate Rest"]);
- },
- "This alternative class feature enhancement expands the spells list of the sorcerer epic spell class feature."
- ]
- }
- },
- "epic sorcerer spells 30" : {
- name : "Epic Sorcerer Spells 30",
- source : ["ELC", 33],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "sorcerer-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["create lesser mythal", "eyes of the prophet", "guarantee of fates: lucky", "universal flight", "control monster", "dream world", "greater telekinesis"]);
- },
- "This alternative class feature enhancement expands the spells list of the sorcerer epic spell class feature."
- ]
- }
- },
- "epic sorcerer spells 33" : {
- name : "Epic Sorcerer Spells 33",
- source : ["ELC", 33],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "sorcerer-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["marvelous alacrity"]);
- },
- "This alternative class feature enhancement expands the spells list of the sorcerer epic spell class feature."
- ]
- }
- },
- "epic sorcerer spells 37" : {
- name : "Epic Sorcerer Spells 37",
- source : ["ELC", 33],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "sorcerer-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["summon epic fiend"]);
- },
- "This alternative class feature enhancement expands the spells list of the sorcerer epic spell class feature."
- ]
- }
- },
- "epic sorcerer spells 39" : {
- name : "Epic Sorcerer Spells 39",
- source : ["ELC", 33],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "sorcerer-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["greater wish", "create greater mythal", "ellisar's genocidal purging pulse", "ellisar's mark of desolation", "temporal skip", "temporal travel"]);
- },
- "This alternative class feature enhancement expands the spells list of the sorcerer epic spell class feature."
- ]
- }
- },
- autoSelectExtrachoices : [{
- extrachoice : "epic sorcerer spells 23",
- extraname : "Epic Sorcerer Spells",
- minlevel : 23
- }, {
- extrachoice : "epic sorcerer spells 25",
- extraname : "Epic Sorcerer Spells",
- minlevel : 25
- }, {
- extrachoice : "epic sorcerer spells 27",
- extraname : "Epic Sorcerer Spells",
- minlevel : 27
- }, {
- extrachoice : "epic sorcerer spells 30",
- extraname : "Epic Sorcerer Spells",
- minlevel : 30
- }, {
- extrachoice : "epic sorcerer spells 33",
- extraname : "Epic Sorcerer Spells",
- minlevel : 33
- }, {
- extrachoice : "epic sorcerer spells 37",
- extraname : "Epic Sorcerer Spells",
- minlevel : 37
- }, {
- extrachoice : "epic sorcerer spells 39",
- extraname : "Epic Sorcerer Spells",
- minlevel : 39
- }]
- };
- ClassSubList["sorcerer-divine soul-xgte"].features["epic sorcerer spells enhancement"] = {
- name : "Epic Sorcerer Spells enhancement",
- source : ["ELC", 35],
- minlevel : 21,
- description : "",
- "epic sorcerer spells enhancement 21" : {
- name : "Epic Sorcerer Spells enhancement 21",
- source : ["ELC", 35],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "sorcerer-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["greater heal"]);
- },
- "This alternative class feature enhancement expands the spells list of the sorcerer epic spell class feature."
- ]
- }
- },
- "epic sorcerer spells enhancement 30" : {
- name : "Epic Sorcerer Spells enhancement 30",
- source : ["ELC", 35],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "sorcerer-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["age reversal"]);
- },
- "This alternative class feature enhancement expands the spells list of the sorcerer epic spell class feature."
- ]
- }
- },
- "epic sorcerer spells enhancement 35" : {
- name : "Epic Sorcerer Spells enhancement 35",
- source : ["ELC", 35],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "sorcerer-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["epic resurrection", "lael's mass greater heal", "mass true resurrection"]);
- },
- "This alternative class feature enhancement expands the spells list of the sorcerer epic spell class feature."
- ]
- }
- },
- autoSelectExtrachoices : [{
- extrachoice : "epic sorcerer spells enhancement 21",
- extraname : "Epic Sorcerer Spells enhancement",
- minlevel : 21
- }, {
- extrachoice : "epic sorcerer spells enhancement 30",
- extraname : "Epic Sorcerer Spells enhancement",
- minlevel : 30
- }, {
- extrachoice : "epic sorcerer spells enhancement 35",
- extraname : "Epic Sorcerer Spells enhancement",
- minlevel : 35
- }]
- };
- //warlock epic spell feature
- ClassList.warlock.features["epic warlock spells"] = { //warlock 30, 34, 37
- name : "Epic Warlock Spells",
- source : ["ELC", 33],
- minlevel : 30,
- description : "\n " + "Whenever I gain a warlock level, I can replace an epic spell I know with another.",
- eval : function() {
- CurrentSpells['warlock-epic spells'] = {
- name : 'Warlock Epic Spells',
- ability : 6,
- list : {'class' : ['epic', 'ewarlock']},
- known : {spells : 'book'},
- refType : "feat"
- };
- if (CurrentSpells['Warlock Epic Spells'] && CurrentSpells['Warlock Epic Spells'].selectSp) {
- // v12.999 style is present, so transfer chosen spells over and remove it
- CurrentSpells['warlock-epic spells'].offsetBo = CurrentSpells['Warlock Epic Spells'].offsetBo;
- CurrentSpells['warlock-epic spells'].selectBo = CurrentSpells['Warlock Epic Spells'].selectBo;
- CurrentSpells['warlock-epic spells'].selectSp = CurrentSpells['Warlock Epic Spells'].selectSp;
- delete CurrentSpells['Warlock Epic Spells'];
- }
- SetStringifieds('spells'); CurrentUpdates.types.push('spells');
- },
- removeeval : function() {
- delete CurrentSpells['warlock-epic spells'];
- SetStringifieds('spells'); CurrentUpdates.types.push('spells');
- },
- additional : levels.map(function (n) {
- return n < 30 ? "" : (n < 34 ? 1 : n < 35 ? 2 : 3) + " epic spells prepared";
- }),
- "epic warlock spells 33" : {
- name : "Epic Warlock Spells 33",
- source : ["ELC", 33],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "warlock-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["marvelous alacrity"]);
- },
- "This alternative class feature enhancement expands the spells list of the warlock epic spell class feature."
- ]
- }
- },
- "epic warlock spells 37" : {
- name : "Epic Warlock Spells 37",
- source : ["ELC", 33],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "warlock-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["summon epic fiend"]);
- },
- "This alternative class feature enhancement expands the spells list of the warlock epic spell class feature."
- ]
- }
- },
- "epic warlock spells 39" : {
- name : "Epic Warlock Spells 39",
- source : ["ELC", 33],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "warlock-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["greater wish", "create greater mythal", "ellisar's genocidal purging pulse", "ellisar's mark of desolation", "temporal skip"]);
- },
- "This alternative class feature enhancement expands the spells list of the warlock epic spell class feature."
- ]
- }
- },
- autoSelectExtrachoices : [{
- extrachoice : "epic warlock spells 33",
- extraname : "Epic Warlock Spells",
- minlevel : 33
- }, {
- extrachoice : "epic warlock spells 37",
- extraname : "Epic Warlock Spells",
- minlevel : 37
- }, {
- extrachoice : "epic warlock spells 39",
- extraname : "Epic Warlock Spells",
- minlevel : 39
- }]
- };
- ClassSubList["warlock-the celestial-xgte"].features["epic warlock spells enhancement"] = {
- name : "Epic Sorcerer Spells enhancement",
- source : ["ELC", 35],
- minlevel : 21,
- description : "",
- "epic warlock spells enhancement 21" : {
- name : "Epic Warlock Spells enhancement 21",
- source : ["ELC", 35],
- minlevel : 21,
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "warlock-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["greater heal"]);
- },
- "This alternative class feature enhancement expands the spells list of the warlock epic spell class feature."
- ]
- }
- },
- "epic warlock spells enhancement 30" : {
- name : "Epic Warlock Spells enhancement 30",
- source : ["ELC", 35],
- minlevel : 30,
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "warlock-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["age reversal"]);
- },
- "This alternative class feature enhancement expands the spells list of the warlock epic spell class feature."
- ]
- }
- },
- "epic warlock spells enhancement 35" : {
- name : "Epic Warlock Spells enhancement 35",
- source : ["ELC", 35],
- minlevel : 35,
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "warlock-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["epic resurrection", "lael's mass greater heal", "mass true resurrection"]);
- },
- "This alternative class feature enhancement expands the spells list of the warlock epic spell class feature."
- ]
- }
- },
- autoSelectExtrachoices : [{
- extrachoice : "epic warlock spells enhancement 21",
- extraname : "Epic Warlock Spells enhancement",
- minlevel : 21
- }, {
- extrachoice : "epic warlock spells enhancement 30",
- extraname : "Epic Warlock Spells enhancement",
- minlevel : 30
- }, {
- extrachoice : "epic warlock spells enhancement 35",
- extraname : "Epic Warlock Spells enhancement",
- minlevel : 35
- }]
- };
- //wizard epic spell feature
- ClassList.wizard.features["epic wizard spells"] = { //wizard 23, 25, 29, 33, 35, 37 ,40, 40, 40
- name : "Epic Wizard Spells",
- source : ["ELC", 43],
- minlevel : 23,
- description : "\n " + "I can prepare my epic wizard spells from my epic spellbook \u0026 at level 40 I always have 3 signature epic spells of my choice prepared",
- eval : function() {
- CurrentSpells['wizard-epic spells'] = {
- name : 'Wizard Epic Spells',
- ability : 4,
- list : {'class' : ['epic', 'ewizard']},
- known : {spells : 'book'},
- refType : "feat"
- };
- if (CurrentSpells['Wizard Epic Spells'] && CurrentSpells['Wizard Epic Spells'].selectSp) {
- // v12.999 style is present, so transfer chosen spells over and remove it
- CurrentSpells['wizard-epic spells'].offsetBo = CurrentSpells['Wizard Epic Spells'].offsetBo;
- CurrentSpells['wizard-epic spells'].selectBo = CurrentSpells['Wizard Epic Spells'].selectBo;
- CurrentSpells['wizard-epic spells'].selectSp = CurrentSpells['Wizard Epic Spells'].selectSp;
- delete CurrentSpells['Wizard Epic Spells'];
- }
- SetStringifieds('spells'); CurrentUpdates.types.push('spells');
- },
- removeeval : function() {
- delete CurrentSpells['wizard-epic spells'];
- SetStringifieds('spells'); CurrentUpdates.types.push('spells');
- },
- additional : levels.map(function (n) {
- return n < 23 ? "" : (n < 25 ? 1 : n < 29 ? 2 : n < 33 ? 3 : n < 35 ? 4 : n < 37 ? 5 : n < 40 ? 6 : 9) + " epic spells prepared";
- }),
- "epic wizard spells 25" : {
- name : "Epic Wizard Spells 25",
- source : ["ELC", 43],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "wizard-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["acquire magical secrets", "aegis of ages", "concentration of almgar", "epic remove curse", "epic dispel magic", "epic counterspell", "greater demiplane", "mass telepathy", "mislead divination"]);
- },
- "This alternative class feature enhancement expands the spells list of the wizard epic spell class feature."
- ]
- }
- },
- "epic wizard spells 27" : {
- name : "Epic Wizard Spells 27",
- source : ["ELC", 43],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "wizard-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["call superior undead", "immediate Rest", "reanimate person"]);
- },
- "This alternative class feature enhancement expands the spells list of the wizard epic spell class feature."
- ]
- }
- },
- "epic wizard spells 30" : {
- name : "Epic Wizard Spells 30",
- source : ["ELC", 43],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "wizard-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["create lesser mythal", "control monster", "dream world", "guarantee of fates: lucky", "greater telekinesis", "greater contingency", "universal flight"]);
- },
- "This alternative class feature enhancement expands the spells list of the wizard epic spell class feature."
- ]
- }
- },
- "epic wizard spells 33" : {
- name : "Epic Wizard Spells 33",
- source : ["ELC", 43],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "wizard-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["marvelous alacrity"]);
- },
- "This alternative class feature enhancement expands the spells list of the wizard epic spell class feature."
- ]
- }
- },
- "epic wizard spells 37" : {
- name : "Epic Wizard Spells 37",
- source : ["ELC", 43],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "wizard-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["summon epic fiend"]);
- },
- "This alternative class feature enhancement expands the spells list of the wizard epic spell class feature."
- ]
- }
- },
- "epic wizard spells 39" : {
- name : "Epic Wizard Spells 39",
- source : ["ELC", 43],
- description : "",
- calcChanges : {
- spellList : [
- function(spList, spName, spType) {
- // Stop this is not the class' spell list or if this is for a bonus spell entry
- if (spName !== "wizard-epic spells" || spType.indexOf("bonus") !== -1) return;
- spList.extraspells = spList.extraspells.concat(["create greater mythal", "greater wish", "ellisar's genocidal purging pulse", "ellisar's mark of desolation", "reanimate monster", "temporal skip", "temporal travel"]);
- },
- "This alternative class feature enhancement expands the spells list of the wizard epic spell class feature."
- ]
- }
- },
- autoSelectExtrachoices : [{
- extrachoice : "epic wizard spells 25",
- extraname : "Epic Wizard Spells",
- minlevel : 25
- }, {
- extrachoice : "epic wizard spells 27",
- extraname : "Epic Wizard Spells",
- minlevel : 27
- }, {
- extrachoice : "epic wizard spells 30",
- extraname : "Epic Wizard Spells",
- minlevel : 30
- }, {
- extrachoice : "epic wizard spells 33",
- extraname : "Epic Wizard Spells",
- minlevel : 33
- }, {
- extrachoice : "epic wizard spells 37",
- extraname : "Epic Wizard Spells",
- minlevel : 37
- }, {
- extrachoice : "epic wizard spells 39",
- extraname : "Epic Wizard Spells",
- minlevel : 39
- }]
- };
- //Complete Epic Spell List
- SpellsList["acquire magical secrets"] = {//prerequisite: level 25 wizard
- name : "Acquire Magical Secrets",
- source : ["ELC", 60],
- classes : ["eknight"],
- level : 1,
- school : "Div",
- time : "1 h",
- range : "self",
- components : "V,S,M\u2020",
- compMaterial : "magical ink that is comperable in level to the spell being cast according to its level described in copying spells in your spellbook for the wizard which the spell consumes",
- duration : "Permanent",
- description : "Can learn a spell from any class as a wizard spell.",
- descriptionFull : "When you cast this epic spell you pick a level 1-9 spell from any spell list. The spell writes the spell into your spell book using the ink for the material component. From that point on the spell is a wizard spell for you and you can prepare and cast it normally." + "\n " + "Whenever you cast Acquire Magical Secrets there is a 5% chance that this epic spell becomes lost to you and you can't cast it again. However any spell that you learned using this spell is always known to you even if your wizard spellbook is lost. You simply need the materials to copy the spell once again."
- };
- SpellsList["aegis of ages"] = {//prerequisite: level 25
- name : "Aegis of Ages",
- source : ["ELC", 60],
- classes : ["eknight", "ewarlock"],
- level : 1,
- school : "Abjur",
- time : "1 a",
- range : "30 ft",
- components : "V,S",
- duration : "8 h",
- description : "30-ft rad 6 crea +8 AC and 50 temp. HP",
- descriptionFull : "You select up to 6 creatures within a 30 foot radius. Each of those creatures gets a +8 to AC for the duration of the spell. They also get 50 temporary hit points that stack on whatever they already had."
- };
- SpellsList["age reversal"] = {//Prerequisite: level 30 class able to cast healing spells
- name : "Age Reversal",
- nameAlt : "Sindering Colour",
- source : ["ELC", 60],
- classes : [],
- level : 2,
- school : "Trans",
- time : "1 h",
- range : "touch",
- components : "V,S,M\u2020",
- compMaterial : "various herbs, gems, and alchemical ingredients worth at least 1,000 gp that the spell consumes.",
- duration : "Instantaneous",
- description : "I can make a creature younge by 3d100 years to as young as puberty or 10 (1000gp cons.)",
- descriptionFull : "You select the creature you wish to extend the age of. You roll 3d100. The target loses up to 3d100 years of age (meaning it gets up to 3d100 years younger) . You can only reduce a creature up to when it hits puberty or to 10 years of age if it doesn't have puberty whichever is more. This spell cannot kill people in this fashion. The effect is permanent and lengthens the life span. This spell can be used in conjunction with a resurrection spell to bring back people who died of old age and giving them 3d100 years of youth."
- };
- SpellsList["create greater mythal"] = {//Prerequisite: level 39
- name : "Create Greater Mythal",
- source : ["ELC", 61],
- classes : [],
- level : 4,
- school : "Ench",
- time : "10 days",
- range : "1 mi",
- components : "V,S,M\u2020",
- compMaterial : "far ranging and varied spell components different for each mythal type that cost around 725,000 gp that the spell consumes.",
- duration : "Permanent",
- description : "create a mythal that you can connect to all your other mythals (750000gp cons.)",
- descriptionFull : "When you finish casting this spell a volume that fits within the space of the radius of this spell is under its effect. You can connect the areas of mythals if you cast the spell multiple times in different areas. The variety of effects can exceed what is described here but are around the power level of a level 4 spell or less(including cantrips). You cannot have the same effect active in an area if you wish to stack mythals. These are some possible effects of the spell which are permanent:" + "\n " + "\u2022 Any dead humanoids that are within the area automatically become zombies that are under your control." + "\n " + "\u2022 Any spell of level 4 or less from creatures of your choice are automatically countered and fail." + "\n " + "\u2022 The area under the effect is permanently under the effects of bright light." + "\n " + "\u2022 Creature of your choice within the area of effect have a flying speed of 30 feet if they wish it." + "\n " + "\u2022 While under the area of this mythal any creatures can understand the speech of any other creature in the mythal." + "\n " + "\u2022 Creatures of your choice can breathe underwater." + "\n " + "\u2022 Creatures of your choice are never hungry or thirsty while under the effect of the mythal. Once leaving the mythal they are satisfied as if they had a full meal." + "\n " + "\u2022 You control the movement of water within the area of the effect. This can create something of a plumbing system." + "\n " + "\u2022 You can create an invisible sensor anywhere within the area of effect to see what is within the range of the sensor." + "\n " + "\u2022 You and 5 creatures of your choice can teleport anywhere with the area of effect to any other area of the mythal." + "\n " + "\u2022 Any devils or demons that enter the area immediately are effected by the spell banishment. They must repeat the saving throw every minute while in the area."
- };
- SpellsList["create lesser mythal"] = {//prerequisite: level 30
- name : "Create Lesser Mythal",
- source : ["ELC", 61],
- classes : ["ewarlock"],
- level : 2,
- school : "Ench",
- time : "10 days",
- range : "1 mi",
- components : "V,S,M\u2020",
- compMaterial : "far ranging and varied spell components different for each mythal type that cost around 125,000 gp that the spell consumes.",
- duration : "Permanent",
- description : "create a mythal that you can connect to all your other mythals (125000gp cons.)",
- descriptionFull : "When you finish casting this spell a volume that fits within the space of the radius of this spell is under its effect. You can connect the areas of mythals if you cast the spell multiple times in different areas. The variety of effects can exceed what is described here but are around the power level of a level 2 spell or less(including cantrips). You cannot have the same effect active in an area if you wish to stack mythals. These are some possible effects of the spell which are permanent:" + "\n " + "\u2022 A message can be said given a trigger that will repeat whenever the trigger that is met. This can also be a tone." + "\n " + "\u2022 While in the area of effect, creatures of your choice have 10 temporary hit points which refreshes and replenishes every minute if the creature affected wishes it." + "\n " + "\u2022 While in the area of effect, creatures of your choice regain 1d4+5 hit points every six seconds." + "\n " + "\u2022 While in the area of effect, creatures of your choice have flames that erupt around them dealing 3d6 fire damage to them every round. The creature can attempt a dexterity saving throw with a DC of your spell DC to take half damage." + "\n " + "\u2022 While in the area of effect, creatures of your choice must make wisdom saving throws with a DC of your spell save DC or be charmed by you until they leave the area of the mythal. A successful save means that creature is immune to this effect for 24 hours. Any creature that enters the area that you wish to be effected must make this saving throw within 30 seconds of entering the mythal." + "\n " + "\u2022 While in the area of effect, all creatures can speak to any beasts within the area." + "\n " + "\u2022 Any dead creatures in the area cannot decay and cannot become undead." + "\n " + "\u2022 Every 6 seconds you can effect a creature of your choice and remove the condition of blinded, charmed, deafened, or poisoned from that creature." + "\n " + "\u2022 While within the area of effect dust and dirt fly off of clothes keeping them clean for the area of effect."
- };
- SpellsList["call superior undead"] = {//Prerequisite: level 27
- name : "Call superior undead",
- source : ["ELC", 62],
- classes : ["ewarlock"],
- level : 2,
- school : "Conj",
- time : "1 a",
- range : "60 ft",
- components : "V,S",
- duration : "Conc, 1 h",
- description : "You summon an undead of CR 15 or lower.",
- descriptionFull : "You summon an undead creature in an unoccupied space that you can see within range. You summon an undead of CR 15 or lower." + "\n " + "The summoned creature is friendly to you and your companions. Roll initiative for the summoned creaure. The creature obeys any verbal commands that you issue to it (no action required by you). If you don't issue any commands to it, it defends itself from hostile creatures but otherwise takes no actions." + "\n " + "The dm has the creature's statistics."
- };
- SpellsList["concentration of almgar"] = {//prerequisite: level 25
- name : "Concentration of Almgar",
- source : ["ELC", 62],
- classes : ["eknight", "ewarlock"],
- level : 1,
- school : "Abjur",
- time : "1 a",
- range : "Self",
- components : "V,S",
- duration : "1 h",
- description : "you can hold conc on a number of spell's equal to your spell casting modifier",
- descriptionFull : "For the duration you can hold concentration on multiple spells. The number of spells you can concentrate on at a time is equal to your spell casting modifier. If you are forced to make a concentration check and you fail you choose which of the spells you are concentrating on that stops and the rest maintain concentration."
- };
- SpellsList["conjure greater animals"] = {//Prerequisite: level 26 Druid
- name : "Conjure Greater Animals",
- source : ["ELC", 62],
- classes : [],
- level : 2,
- school : "Conj",
- time : "1 a",
- range : "500 ft",
- components : "V,S",
- duration : "1 h",
- description : "Summon CR 15 beast; obey my verbal commands",
- descriptionFull : "You summon fey spirits that take the form of beasts and appear in unoccupied spaces that you can see within range. Choose one of the following options for what appears." + "\n " + "\u2022 One beast of challenge rating 15 or lower" + "\n " + "\u2022 Two beasts of challenge rating 14 or lower" + "\n " + "\u2022 Four beasts of challenge rating 12 or lower" + "\n " + "\u2022 Eight beasts of challenge rating 11 or lower" + "\n " + "\u2022 twelve beasts of challenge rating 10 or lower" + "\n " + "\u2022 sixteen beasts of challenge rating 9 or lower" + "\n " + "\u2022 twenty beasts of challenge rating 8 or lower" + "\n " + "\u2022 twenty-four beasts of challenge rating 7 or lower" + "\n\n" + "Each beast is also considered fey, and it disappears when it drops to 0 hit points or when the spell ends." + "\n " + "The summoned creatures are friendly to you and your companions. Roll initiative for the summoned creatures as a group, which has its own turns. They obey any verbal commands that you issue to them (no action required by you). If you don't issue any commands to them, they defend themselves from hostile creatures, but otherwise take no actions. The DM has the creatures' statistics."
- };
- SpellsList["control monster"] = {// prerequisite: level 30, bard, sorcerer, warlock, wizard
- name : "Control Monster",
- source : ["ELC", 62],
- classes : ["ewarlock"],
- level : 2,
- school : "Ench",
- time : "1 a",
- range : "Self",
- components : "V,S",
- duration : "1 h",
- save : "Wis",
- description : "1 crea save or charmed, follows telepathic commands, 1 a for complete control",
- descriptionFull : "You attempt to beguile a creature that you can see within range. It must succeed on a Wisdom saving throw or be charmed by you for the duration." + "\n " + "While the creature is charmed, you have a telepathic link with it as long as the two of you are on the same plane of existence. You can use this telepathic link to issue commands to the creature while you are conscious (no action required), which it does its best to obey. You can specify a simple and general course of action, such as Attack that creature, Run over there, or Fetch that object. If the creature completes the order and doesn't receive further direction from you, it defends and preserves itself to the best of its ability." + "\n " + "You can use your action to take total and precise control of the target. Until the end of your next turn, the creature takes only the actions you choose, and doesn't do anything that you don't allow it to do. During this time, you can also cause the creature to use a reaction, but this requires you to use your own reaction as well." + "\n " + "Legendary Resistance cannot be used for this spell if their CR is lower than your level."
- };
- SpellsList["doubled time"] = {//Prerequisite: level 21; wizard, sorcerer, or warlock
- name : "Doubled Time",
- source : ["ELC", 63],
- classes : ["ewizard", "esorcerer", "ewarlock"],
- level : 1,
- school : "Trans",
- time : "1 min",
- range : "60 ft",
- components : "V,S",
- duration : "conc, 8 h",
- description : "A creature of my choice gets an extra action \u0026 +5 AC for the duration of the spell",
- descriptionFull : "When you cast this spell , time for a creature of your choice is doubled. That creature gets an additional action on their turn that they can use for whatever they desire for the duration of the spell. While this is active on the creature they have +5 to their AC."
- };
- SpellsList["dream world"] = {//prerequisite: level 30; wizard, sorcerer, or warlock
- name : "Dream World",
- source : ["ELC", 63],
- classes : ["ewarlock"],
- level : 2,
- school : "Ench",
- time : "1 a",
- range : "1000 ft",
- components : "V,S",
- duration : "Permanent",
- save : "Wis",
- description : "all creatures in range that you select must save or have their memories rewritten one day at a time.",
- descriptionFull : "You can select any number of creatures within range and they aren't affected. For everybody else in range they need to make a wisdom saving throw or you can rewrite 1 day of their life. They repeat this until they succeed or their whole life is rewritten. When you cast the spell you create virtual image of your brain that selects what to remove and change. So you can issue something basic like having everyone forget an event happened or to remember it differently. In this way you can't learn secrets but you can issue broad changes. The DM is encouraged to roll for people in groups or larger chunks of time to expedite the process."
- };
- SpellsList["epic hex"] = {//Prerequisite: level 30 warlock
- name : "Epic Hex",
- source :["ELC", 63],
- classes : ["ewarlock"],
- level : 2,
- school : "Ench",
- time : "1 bns",
- range : "120 ft",
- components : "V,S,M",
- compMaterial : "The snake of a medusa or the blood of a basilisk",
- duration : "Conc, 8 h",
- description : "1 crea +4d10 Necrotic dmg from my atks; dis. on all ability checks",
- descriptionFull : "You place a curse on a creature that you can see within range. Until the epic spell ends, you deal an extra 4d10 necrotic damage to the target whenever you or anyone hits it with an attack. The target has disadvantage on all ability checks. If the target drops to 0 hit points before this spell ends, you can use a bonus action on a subsequent turn of yours to curse a new creature." + "\n " + "An epic remove curse spell cast on the target ends this spell early."
- };
- SpellsList["epic resurrection"] = {//prerequisiste: level 35 class able to cast healing spells
- name : "Epic Resurrection",
- source : ["ELC", 63],
- classes : [],
- level : 3,
- school : "Necro",
- time : "1 min",
- range : "Touch",
- components : "V,S,M\u2020",
- compMaterial : "diamonds worth at least 500,000 gp which the spell consumes",
- duration : "Instantaneous",
- description : "Resurrects a creature, that has ever died, with whole body; see book (500000gp cons.)",
- descriptionFull : "You select or name a creature that has ever died. If the creature's soul is free the creature is restored to life with all of its hit points. If the creature's soul isn't free the creature's soul becomes free from the cost of the epic spell if the soul is imprisoned by a creature or effect of a lesser diety or less. If a creature's soul has been destroyed this epic spell can reform the soul again but the cost is 10 times normal." + "\n " + "The epic spell closes all wounds, neutralizes any poison, cures all diseases, lifts any curses affecting the creature, and removes all levels of exhaustion when it died in this way. The spell replaces damaged or missing organs and limbs. If the creature was undead, it is restored to its non undead form." + "\n " + "The spell can even provide a new body if the original no longer exists, in which acse you must speak the creature's name. The creature then appears in an unoccupied space you choose within 100 feet of you." + "\n " + "This spell can even reverse the age of a creature up to when that creature reached puberty. The creature retains all of the experience that it had in life."
- };
- SpellsList["evasive step"] = {//Prerequisite: level 21
- name : "Evasive Step",
- source : ["ELC", 63],
- classes : ["epic"],
- level : 1,
- school : "Conj",
- time : "1 rea",
- range : "150 ft",
- components : "",
- duration : "Instantaneous",
- description : "I can teleport out of range of an attack",
- descriptionFull : "In reaction to something would deal damage to you, you may teleport to any space within range. If this would take you out of the range or area of effect of a spell or attack then the spell or attack fails as if it never happened against you. You can use this ability even if you are in an anti magic field like all epic spells and this spell can't be countered even by an epic counterspell."
- };
- SpellsList["epic remove curse"] = {//Prerequisite: level 25
- name : "Epic remove curse",
- source : ["ELC", 63],
- classes : ["eknight", "ewarlock"],
- level : 1,
- school : "Abjur",
- time : "1 a",
- range : "30 ft",
- components : "V,S",
- duration : "Instantaneous",
- description : "A creature or object I target is immune to being cursed for 24 h; all currect curses on it are removed",
- descriptionFull : "When you cast the epic spell you can target a creature or an object. If you target a creature all curses on that creature end. Also that creature becomes immune to being affected by that curse for the next 24 hours. This epic spell works on spells and epic spells for the curses that it affects to clarify. For objects this spell actually destroys curses on objects that are of legendary rarity or lower. This means that you can remove any hostile effect toward the attuned when you cast this spell. It also affects effects that affect the wielder."
- };
- SpellsList["ellisar's genocidal purging pulse"] = {//prerequisite: level 39; wizard, sorcerer, or warlock
- name : "Ellisar's Genocidal Purging Pulse",
- nameShort : "Purging Pulse",
- source : ["ELC", 64],
- classes : [],
- level : 4,
- school : "Necro",
- time : "18 sec",
- range : "20 mi",
- components : "V,S,M\u0192",
- compMaterial : "A diamond worth 10,000 gp",
- duration : "Instantaneous",
- description : "I cause necrotic dmg equal to my level to all humanoid creatures in range; I can exclude 1 race (10000gp)",
- descriptionFull : "When you cast this epic spell every humanoid creature within the range of the epic spell takes necrotic damage equal to your level. You may choose to exclude a single race from this damage. Every other creature takes the damage as described earlier. Creatures killed from this damage cannot be resurrected with anything less than a true resurrection or higher magic spell."
- };
- SpellsList["epic dispel magic"] = {//prerequisite: level 25
- name : "Epic Dispel Magic",
- source : ["ELC", 64],
- classes : ["eknight", "ewarlock"],
- level : 1,
- school : "Abjur",
- time : "1 a",
- range : "120 ft",
- components : "V,S",
- duration : "Instantaneous",
- description : "Dispel all magical effects on crea or object; make DC 10+EL-25 spellcasting ability check if above EL 25 used",
- descriptionFull : "Choose one creature, object, or magical effect within range. Any epic spell of requirement level 25 or less ends. For an epic spell of level requirement 26 or greater, make an ability check using your spellcasting ability. The DC equals 10+the spells level requirement-25. On a successful check the spell ends. Furthermore this has a different effect on a spell level 1-9. For such spells the spell is instantly dispelled and you can choose to deal 5d10 psychic damage to the one responsible for the spell."
- };
- SpellsList["epic arcane lock"] = {//prerequisite: level 23
- name : "Epic Arcane Lock",
- source : ["ELC", 64],
- classes : ["eknight", "ewarlock", "ewizard"],
- level : 1,
- school : "Ench",
- time : "varies",
- range : "200 ft",
- components : "V,S",
- duration : "Until Dispelled",
- description : "Entryway locked; password or designated crea opens; +50 DC break/pick lock",
- descriptionFull : "You select a number of acceptable objects within range which are as follows: a closed door, window, gate, chest, other entryway, walls, floors, or the ceiling with a combined surface area of 5400 square feet. The door, window, gate, chest, and other entryways become locked. All of the acceptable surfaces you select within range get reinforced. They are nearly indestructible. You can also set a password that, when spoken within 5 feet of the object, suppresses this spell for 1 minute. Otherwise it is impassible until it is broken or the spell is dispelled by an epic spell or suppressed." + "\n " + "While affected by this epic spell, the object is more difficult to break or force open; the DC to break it or pick any locks on it increase by 50. The difficulty to break a wall or something else reinforced the DC increases by 50."
- };
- SpellsList["ellisar's desolation beam"] = {//prerequisite: level 21; wizard, sorcerer or warlock
- name : "Ellisar's Desolation Beam",
- nameShort : "Desolation Beam",
- source : ["ELC", 64],
- classes : ["ewizard", "esorcerer", "ewarlock"],
- level : 1,
- school : "Evoc",
- time : "1 a",
- range : "120 ft",
- components : "V,S",
- duration : "Instantaneous",
- save : "Con",
- description : "The desolation beam does 50d6 necrotic damage to one target. Con save for half dmg.",
- descriptionFull : "The desolation beam does 50d6 necrotic damage to one target. Constitution save for half."
- };
- SpellsList["eyes of the prophet"] = {//prerequisite: level 30; cleric, druid, bard
- name : "Eyes of the Prophet",
- source : ["ELC", 64],
- classes : [],
- level : 2,
- school : "Div",
- time : "1 bns",
- range : "Self",
- components : "V,S",
- duration : "18 sec",
- description : "I succeed in everything I do for 3 turns",
- descriptionFull : "You see into the future and in terms of battle you know what to do to achieve the best result. For the duration on 3 of your turns every attack against you misses, you succeed every saving throw, you make every skill check as long as it doesn't take longer than 18 seconds, and you land every hit though you still roll to see if it is a critical. Furthermore for the duration the DM has to tell you what they are going to do for every action that you are going to do. So if he tells you the monster will attack a character your party can use a spell or epic spell to bolter that characters defenses and the DM is inclined to do what they said. You know the hit points and ability scores of any creature you can see. The creature must make a Charisma save against your spell save DC every turn this is active. If they fail you learn all resistances, immunities, vunerabilities, and condition immunities of that creature."
- };
- SpellsList["epic counterspell"] = {//Prerequisite: level 25 bard, wizard, or sorcerer
- name : "Epic Counterspell",
- source : ["ELC", 64],
- classes : ["eknight"],
- level : 1,
- school : "Abjur",
- time : "1 rea",
- range : "120 ft",
- components : "",
- duration : "Instantaneous",
- description : "Stop a spell being cast; make DC 10+EL-30 spellcasting ability check if above epic slot lvl 30",
- descriptionFull : "You attempt to interrupt a creature in the process of casting a spell or epic spell. If the creature is casting a level 1-9 spell it is countered and the enemy caster takes 10d10 psychic damage. If it is an epic spell of level requirement 30 or less the spell is fails and has no effect. If it is level 31 or greater you need to make an ability check using your spellcasting ability. The DC equals 10+the level requirement of the spell- 30 . On a success the spell is countered"
- };
- SpellsList["ellisar's mark of desolation"] = {//Prerequisite: level 39 wizard, sorcerer, warlock, or bard
- name : "Ellisar's Mark of desolation",
- nameShort : "Mark of desolation",
- source : ["ELC", 64],
- classes : [],
- level : 4,
- school : "Evoc",
- time : "1 a",
- range : "120 ft",
- components : "",
- duration : "Instantaneous",
- save : "Con",
- description : "I deal 30d10 fire+cold+acid+lightning+thunder+radient+necrotic+psychic dmg to 1 creature within range, afterwards I get 50 force dmg for every spell I cast for the next 24 h; see book",
- descriptionFull : "The mark of desolation does 30d10 fire damage, then 30d10 cold damage, then 30d10 acid damage, then 30d10 lightning damage, then 30d10 thunder damage, then 30d10 radiant damage, then 30d10 necrotic damage, and then 30d10 psychic damage to one target creature in range. It is constitution save for half damage. The spell causes great magical strain on the caster causing them to take 50 force damage whenever they cast a spell or epic spell for the next 24 hours.",
- };
- SpellsList["fate seal"] = {//prerequisite: level 35 cleric
- name : "Fate Seal",
- source : ["ELC", 65],
- classes : [],
- level : 3,
- school : "Necro",
- time : "1 a",
- range : "500 ft",
- components : "V",
- duration : "24 h",
- description : "If a creature I select dies while being affected by this spell, they can't be revived for 10,000 years.",
- descriptionFull : "You choose a creature of your choice within range of the spell. For the duration if that creature dies their fate is sealed. That creature if their fate is sealed cannot be brought back from the dead for the next 10,000 years. The creature can be brought back after 100 years by a lesser or greater deity or by an epic spell of level requirement 35 or later.",
- };
- SpellsList["greater wish"] = {//Prerequisite: level 39
- name : "Greater Wish",
- source : ["ELC", 65],
- classes : [],
- level : 4,
- school : "Conj",
- time : "1 a",
- range : "self",
- components : "V",
- duration : "Instantaneous",
- description : "With greater wish it is apparent that the wish spell is not the mightiest spell once thought. There were some limitation with the previous wish and even though greater wish won't let you overtake the over deities it is still one of the mightiest spells or epic spells in existence that mortals can cast. After all when you are above level 40 you aren't really mortal anymore." + "\n " + "The basic use of this spell is that it can duplicate any spell and epic spell with level requirement 35 or lower. You don't need to pay material components when you cast a spell or epic spell in such a way." + "\n " + "Alternatively you can create one of the following effects of your choice, but the dm determines if you are doing something like using it against a greater deity if it would fail:" + "\n " + "\u2022 You create one object of up to 250,000 gp in value that isn't a magic item. The object can be no more than 3000 feet in any dimension, and it appears in an unoccupied space you can see on the ground." + "\n " + "\u2022 You allow up to 1000 creatures that you can see to regain all hit points, and you end all effects on them described in the greater restoration spell." + "\n " + "\u2022 You grant up to 20 creatures that you can see resistance to two types of damage permanently." + "\n " + "\u2022 You grant a creature immunity to 10 level 1-9 spell permanently." + "\n " + "\u2022 You can change fate and force a save, ability check, or attack roll to critically succeed or critically fail. This can be done after the save, ability check, or attack roll is rolled and the outcome determined. You must do this within a reasonable amount of time(for example changing a roll made at the beginning of a campaign would be asking for a lot of leeway on behalf of the dm)." + "\n " + "\u2022 You can cast a number of spells at the same time equal to 45 spell levels. For example 5 level 9 spells or 45 level 1 spells." + "\n " + "\u2022 You can create a magic item legendary rarity or less." + "\n " + "\u2022 You can get a permanent spell slot increase with a level 1-9 spell slot." + "\n " + "\u2022 You can permanently get 100 hit points." + "\n " + "\u2022 You can raise an ability score by 4 points permanently and this increases your cap for that ability." + "\n\n" + "As before you might be able to achieve something beyond the scope of the above examples. They are just a reference. State your wish to the DM as precisely as possible. The DM has great latitude in ruling what occurs in such an instance; the greater the wish, the greater the likelihood that something goes wrong. However the DM should give you more leeway than the wish spell as it is much stronger." + "\n " + "The stress of casting this epic spell to produce any effect other than duplicating another epic spell's effect weakens you. After enduring that stress, each time you cast a spell or epic spell until you finish a long rest, you take 2d10 necrotic damage per level of that spell(30d10 necrotic damage for an epic spell). This damage can't be reduced or prevented in any way. In addition, you strength drops to 3, if it isn't 3 or lower already, for 2d4 days. For each of those days you spend resting and doing nothing more than light activity, your remaining recovery time decreases by 2 days. Finally, there is a 33 percent chance that you are unable to cast greater wish ever again if you suffer this stress. As an epic spell it is lost and you don't get another epic spell to replace it.",
- };
- SpellsList["greater heal"] = {//Prerequisite: level 21 class able to cast healing spells
- name : "Greater Heal",
- source : ["ELC", 65],
- classes : ["eheal"],
- level : 1,
- school : "Evoc",
- time : "1 a",
- range : "60 ft",
- components : "V,S",
- duration : "Instantaneous",
- description : "1 living creature heals all HP and is cured of all status effects and exhaustion",
- descriptionFull : "Choose a creature that you can see within range. A surge of positive energy washes through the creature, causing it to regain all of its hit points. This spell also ends blindness, deafness, frightened, paralyzed, petrification, poisoned, stunned, diseases affecting the target, and all levels of exhaustion. This spell has no effect on undead or constructs.",
- };
- SpellsList["guarantee of fates: lucky"] = {//prerequisite: level 30
- name : "Guarantee of Fates: Lucky",
- nameShort : "Lucky",
- source : ["ELC", 65],
- classes : ["ewarlock"],
- level : 2,
- school : "Div",
- time : "1 a",
- range : "touch",
- components : "V,S",
- duration : "1 min",
- description : "for 1 creature all saves and attacks are natural 20s",
- descriptionFull : "You touch one creature and the Fates guarantee that they will be Lucky. For the next minute all attack rolls and saving throws with a d20 are considered a 20 the first time they are rolled for that creature that turn. So you could attack 5 times in a round and get 5 natural 20s but if you were to use Lucky and roll again you would roll as normal. If it is applicable these 20s are to be considered critical.",
- };
- SpellsList["greater telekinesis"] = {//prerequisite: level 30 wizard or sorcerer
- name : "Greater Telekinesis",
- source : ["ELC", 66],
- classes : [],
- level : 2,
- school : "Trans",
- time : "1 a",
- range : "500 ft",
- components : "V,S",
- duration : "conc, 1 h",
- description : "Move Gargantuan creature or 10000 lb object 60 ft as 1 a; ability check with spellcasting ability vs. Str; see B",
- descriptionFull : "You gain the ability to move or manipulate creatures or objects by thought. When you cast the epic spell, and as your action each round for the duration, you can exert your will on one creature or object that you can see within range, causing the appropriate effect below. You can affect the same target round after round, or choose a new one at any time. If you switch targets, the prior target is no longer affected by the epic spell." + "\n " + toUni("Creature") + ": You can try to move a Gargantuan or smaller creature. Make an ability check with your spellcasting ability contested by the creature's Strength check. If you win the contest, you move the creature up to 60 feet in any direction, including upward but not beyond the range of this epic spell. For the duration of the epic spell, you lose concentration on the epic spell, or the creature saves against the spell; the creature is restrained in your telekinetic grip. A creature lifted upward is suspended in mid-air." + "\n " + "A creature that is restrained by this epic spell can use their action on their turn to repeat the saving throw for this spell to break out of the restrained condition." + "\n " + toUni("Object") + ": You can try to move an object that weighs 10,000 pounds. If the object isn't being worn or carried, you can automatically move it up to 60 feet in any direction, but not beyond the range of this spell." + "\n " + "If the object is worn or carried by a creature, you must make an ability check with your spellcasting ability contested by that creature's Strength check. If you succeed, you pull the object away from that creature and can move it up to 60 feet in any direction but not beyond the range of this spell." + "\n " + "You can exert fine control on objects with your telekinetic grip, such as manipulating a simple tool, opening a door or a container, stowing or retrieving an item from an open container, or pouring the contents from a vial."
- };
- SpellsList["greater contingency"] = {//prerequisite: level 30 wizard
- name : "Greater Contingency",
- source : ["ELC", 66],
- classes : [],
- level : 2,
- school : "Evoc",
- time : "1 h",
- range : "Self",
- components : "V,S,M\u0192",
- compMaterial : "a statuette of yourself carved from ivory and decorated with gems worth at least 15,000 gp",
- duration : "Permanent",
- description : "Prepare another SL<9 spell I can cast to activate when some condition is met (15000gp)",
- descriptionFull : "Permanent until circumstance triggers the effect Choose a spell of 9th level or lower that you can cast, that has a casting time of 1 action, and that can target you. You cast that spell--called the contingent spell--as part of casting greater contingency, expending spell slots for both, but the contingent spell doesn't come into effect. Instead, it takes effect when a certain circumstance occurs. You describe that circumstance when you cast the two spells. Alternatively you can can have 2 spells that are contingent spells if they both are of 5th level or lower. If you choose 2 lower level spells they must activate on the same circumstance." + "\n " + "The contingent spell takes effect immediately after the circumstance is met for the first time, whether or not you want it to, and then contingency ends." + "\n " + "The contingent spell takes effect only on you, even if it can normally target others. You can use only one greater contingency spell at a time." + "\n " + "If you cast this spell again, the effect of another greater contingency spell on you ends. Also, greater contingency ends on you if its material component is ever not on your person."
- };
- SpellsList["greater demiplane"] = {//prerequisite: level 25
- name : "Greater Demiplane",
- source : ["ELC", 66],
- classes : ["eknight", "ewarlock"],
- level : 1,
- school : "Conj",
- time : "1 a",
- range : "60 ft",
- components : "S",
- duration : "1 h",
- description : "Create door to a demiplane of 1-mi cube; when spell ends, creatures inside remain trapped",
- descriptionFull : "You create a shadowy door on a flat solid surface that you can see within range. The door is large enough to allow up to Huge creatures to pass through unhindered. When opened, the door leads to a demiplane that appears to be an empty room 1 mile in each dimension, made of a mundane material of your choice. When the spell ends, the door disappears, and any creatures or objects inside the greater demiplane remain trapped there, as the door also disappears from the other side." + "\n " + "Each time you cast this spell, you can create a new greater demiplane, or have the shadowy door connect to a greater demiplane you created with a previous casting of this spell. Additionally, if you know the nature and contents of a greater demiplane created by a casting of this spell by another creature, you can have the shadowy door connect to its greater demiplane instead.",
- };
- SpellsList["hellball"] = {//prerequisite: level 21; wizard, bard, sorcerer or warlock
- name : "Hellball",
- source : ["ELC", 66],
- classes : ["ewizard", "ebard", "esorcerer", "ewarlock"],
- level : 1,
- school : "Evoc",
- time : "1 a",
- range : "300 ft",
- components : "V,S",
- duration : "Instantaneous",
- save : "Dex",
- description : "40-ft rad all crea 12d6 acid+fire+lightning+thunder dmg; save halves; unattended flammable objects ignite",
- descriptionFull : "Hellball deals 12d6 acid damage, 12d6 fire damage, 12d6 lightning damage, and 12d6 thunder damage to all creatures in a 40 ft radius sphere. Unattended objects also take damage. Targets in the area must make a dexterity saving throw taking half damage on a successful save.",
- };
- SpellsList["immediate Rest"] = {//Prerequisite: level 27
- name : "Immediate Rest",
- source : ["ELC", 67],
- classes : ["ewarlock"],
- level : 2,
- school : "Ench",
- time : "1 a",
- range : "60 ft",
- components : "V,S,M\u0192",
- compMaterial : "a twig branch and a gem worth at least 100 gp",
- duration : "1 min",
- description : "up to 12 willing crea unconscious for 1 min to gain benefits of short rest; Ends if dmg or 1 a to wake (100gp)",
- descriptionFull : "You select up to 12 willing creatures you can see within range, and they fall unconscious for the epic spell's duration. The spell ends on a target early if it takes damage or someone uses an action to slap it awake. If a target remains unconscious for the spells duration they get a benefit of a long rest and they can't benefit from this spell again for 48 hours.",
- };
- SpellsList["illusory wall"] = {//prerequisite: level 21
- name : "Illusory Wall",
- source : ["ELC", 67],
- classes : ["epic"],
- level : 1,
- school : "Illus",
- time : "1 a",
- range : "200 ft",
- components : "",
- duration : "1 h",
- save : "Int",
- description : "Up to 150 ft long 50 ft high 1 ft thick; all non-allies must save to pass, see book",
- descriptionFull : "You create an illusory impenetrable wall that is up to 150 feet long, 50 feet high, and 1 foot think centered on a point that you can see within range. Alternatively you can shape the wall in a sphere up to 50 feet in diameter centered on a point that you choose within range. The wall remains in place for the duration. If you position the wall so that it passes through the space occupied by a creature that creature is blinded and can pass through the wall. However once outside they treat passing through the wall as normal." + "\n " + "The wall completely blocks all visibility and even level 1-9 divination spells that attempt to peer through the wall. To move through the wall a creature must succeed on a DC 25 Intelligence check to pass through every time that it wishes too. Creatures that attempt to shoot projectiles through the wall have no idea what is on the other side so they have a -5 to their attack rolls and disadvantage to do so. When you cast the spell you can designate any number of creatures and those creatues do not need to make Intelligence checks to pass through and those creatures can even see through the wall for its duration.",
- };
- SpellsList["liar's tongue"] = {// prerequisite: level 21
- name : "Liar's Tongue",
- source : ["ELC", 67],
- classes : ["epic"],
- level : 1,
- school : "Trans",
- time : "1 a",
- range : "Self",
- components : "V",
- duration : "8 h",
- description : "I make creatures fail insight checks, magic can't tell i'm lying, \u0026 all charisma checks are 20",
- descriptionFull : "You lace your words with magic. For the duration" + "\n " + "\u2022 Creatures fail their insight checks against you." + "\n " + "\u2022 Magic cannot determine if you are lying." + "\n " + "\u2022 Every charisma check that you make for the duration replaces the roll with a 20."
- };
- SpellsList["libra"] = {// prerequisite: level 21
- name : "Libra",
- source : ["ELC", 67],
- ritual : true,
- classes : ["epic"],
- level : 1,
- school : "Div",
- time : "1 bns",
- range : "Sight",
- components : "V,S",
- duration : "8 h",
- description : "I know all stats of a creature in sight",
- descriptionFull : "While this epic spell is active you know the statistics of any creature within your perception. You can know their hit points, current spell slots (if any), saving throws, skills, condition immunities, damage resistances, damage immunities, senses, speed, alignment, attribute scores, things they can take as actions, and/or things they can do with legendary actions."
- };
- SpellsList["lael's mass greater heal"] = {//Prerequisite: level 35 class able to cast healing spells
- name : "Lael's Mass Greater Heal",
- nameShort : "Mass Greater Heal",
- source : ["ELC", 67],
- classes : [],
- level : 3,
- school : "Evoc",
- time : "1 a",
- range : "300 ft",
- components : "V,S",
- duration : "Instantaneous",
- description : "Split 7000 HP of healing over creatures in range; also cured of blindness, deafness, and all diseases",
- descriptionFull : "A flood of healing energy flows from you into injured creatures around you. You restore up to 7,000 hit points divided as you choose among any number of creatures that you can see within range. Creatures healed by this epic spell are also cured of all diseases and any effect making them blinded or deafened. This spell has no effect on undead or constructs."
- };
- SpellsList["lady claisa's aura of heavenly radiance"] = {//Prerequisite: level 30 cleric
- name : "Lady Claisa's Aura of Heavenly Radiance",
- nameShort : "Aura of Heavenly Radiance",
- source : ["ELC", 67],
- classes : [],
- level : 2,
- school : "Evoc",
- time : "1 a",
- range : "120 ft",
- components : "",
- duration : "Conc, 1 min",
- save : "Con",
- description : "All enemies in range take 15d10 radient dmg; half on save; all allies heal 10d10; +10 to conc saves for this spell",
- descriptionFull : "Each turn every enemy in range takes 15d10 radiant damage. They can make a constitution save for half. Each turn every allied creature in range heals 10d10 damage. All concentration checks made while concentrating on this spell are made with a +10.",
- };
- SpellsList["mass true resurrection"] = {// Prerequisite: level 35 class able to cast healing spells
- name : "Mass True Resurrection",
- source : ["ELC", 68],
- classes : [],
- level : 3,
- school : "Necro",
- time : "18 sec",
- range : "100 ft",
- components : "V,S,M\u2020",
- compMaterial : "diamonds worth at least 25,000 gp for every person resurrected which the spell consumes.",
- duration : "Instantaneous",
- description : "Resurrects 6 creatures, that has died in last 200 years, with new body; see book (25000gp cons.)",
- descriptionFull : "You select up to 6 creatures within 100 feet that have been dead no longer than 200 years and that died for any reason except old age. If the creature's soul is free and willing the creature is restored to life with all its hit points." + "\n " + "The epic spell closes all wounds, neutralizes any poison, cures all diseases, and lifts any curses affecting the creature when it died. The spell replaces damaged or missing organs and limbs. If the creature was undead, it is restored to its nonundead form." + "\n " + "The spell can even provide a new body if the original no longer exists, in which case you must speak the creatures name. The creature then appears in an unoccupied space you choose within 100 feet of you."
- };
- SpellsList["marvelous alacrity"] = {// prerequisite: level 33
- name : "Marvelous Alacrity",
- source : ["ELC", 68],
- classes : [],
- level : 3,
- school : "Abjur",
- time : "1 a",
- range : "Self",
- components : "V,S",
- duration : "1 min",
- description : "I can cast two non-epic spells per turn",
- descriptionFull : "While this epic spell is active when you use your action to cast a spell of level 1-9 you can cast another spell of level 1-9. While this epic spell is in effect you don't have to follow the rule of only being able to cast one spell of level 1-9 in a round.",
- };
- SpellsList["mass telepathy"] = {// prerequisite: level 25 wizard
- name : "Mass Telepathy",
- source : ["ELC", 68],
- classes : ["eknight"],
- level : 1,
- school : "Evoc",
- time : "1 a",
- range : "Unlimited",
- components : "V,S,M\u0192",
- compMaterial : "a silver ring nearly devoid of impurities worth 250 gp",
- duration : "24 h",
- description : "50 willing crea Int>0 and I telepathic link; share words, sensory information if on same plane (250gp)",
- descriptionFull : "You create a telepathic link between yourself and up to 50 willing creatures. The creatures can be anywhere on the same plane of existence as you. The spell ends for a creature if they are no longer on the same plane." + "\n " + "Until the epic spell ends, you and the creatures you selected can instantly share words, images, sounds, and other sensory messages with one another through the link, and each creature knows the creature communicating with it. The spell enables a creature with an intelligence score of at least 1 to understand the meaning of your words and take in the scope of any sensory messages you send to it.",
- };
- SpellsList["mislead divination"] = {// prerequisite: level 25
- name : "Mislead Divination",
- source : ["ELC", 68],
- classes : ["eknight", "ewarlock"],
- level : 1,
- school : "Illus",
- time : "1 a",
- range : "1000-ft rad",
- components : "V,S",
- duration : "1 yr",
- description : "1000-ft rad control all info given to divination spells of SL 1-9",
- descriptionFull : "You attempt to control the information cast gained from any divination spell cast on an area in the volume given, an object no bigger than a 1000 foot sphere, an individual or a piece of information. This works on any divination spell levels 1-9. You control what the divination spell informs them of."
- };
- SpellsList["peer into future"] = {//prerequisite: level 21
- name : "Peer into Future",
- source : ["ELC", 69],
- classes : ["epic"],
- level : 1,
- school : "Div",
- time : "1 min",
- range : "1 mi",
- components : "V,S,M",
- compMaterial : "Some energy heavy crystals that the spell consumes upon casting",
- duration : "24 h",
- description : "can see into the future up to 100 yrs",
- descriptionFull : "You create an invisible sensor in the future at a point of time that you choose no more than 100 years into the future. While the sensor is active you can use any of your senses through the sensor. The sensor is indestructible, invisible, and can move through objects. The sensor appears at a point within range in reference to spatial coordinates and cannot move past the range at a point originating from you. You can move the sensor around through space and time within the constraints of the spell. The spell lasts for the duration. You are incapacitated while the spell is in effect but otherwise can view the future for 24 hours. You can end the spell early at any point you wish.",
- };
- SpellsList["purify"] = {// prerequisite: level 21; bard, cleric, or druid
- name : "Purify",
- source : ["ELC", 69],
- classes : ["ebard", "ecleric", "edruid"],
- level : 1,
- school : "Trans",
- time : "1 a",
- range : "1 mi",
- components : "V,S",
- duration : "Instantaneous",
- description : "1/2-mi rad of food and drink is rendered free of all poison and disease",
- descriptionFull : "All food and drink within the radius of the epic spell centered on you is purified and rendered free of poison and disease. This is unless if it is diseased by magic of epic spell level or higher.",
- };
- SpellsList["reanimate person"] = {//Prerequisite: level 27; wizard or cleric
- name : "Reanimate Person",
- source : ["ELC", 69],
- classes : [],
- level : 2,
- school : "Necro",
- time : "1 min",
- range : "10 ft",
- components : "V,S,M",
- compMaterial : "The contents of a vial of reanimation fluid which you learn to make to cast this spell which the contents are consumed",
- duration : "Instantaneous",
- description : "turns a CR=<15 creature into an undead servant; see book for details; lasts for 24 h",
- descriptionFull : "This epic spell creates an undead servant. Choose a corpse of a humanoid with a CR no greater than 15 or a level no greater than 20 within range. Your spell imbues the target with a foul mimicry of life, raising it as an undead creature. The target becomes a creature that has the same statistics that it did in life but is considered undead and its intelligence drops to 3." + "\n " + "On each of your turns, you can use a bonus action to mentally command any creature you made with this spell if the creature is within 120 feet of you (you can issue commands to each of the creatures you control at once). You decide what action the creature will take and where it will move during its next turn, or you can issue a general command, such as to guard a particular chamber or corridor. If you issue no commands, the creature only defends itself against hostile creatures. Once given an order, the creature continues to follow it until its task is complete." + "\n " + "The creature is under your control for 24 hours, after which it stops obeying any command you've given it. To maintain control of the creature for another 24 hours, you must cast this spell on the creature again before the current 24-hour period ends."
- };
- SpellsList["reanimate monster"] = {// prerequisite: level 39; wizard or cleric
- name : "Reanimate Monster",
- source : ["ELC", 69],
- classes : [],
- level : 4,
- school : "Necro",
- time : "1 min",
- range : "10 ft",
- components : "V,S,M",
- compMaterial : "The contents of a vial of reanimation fluid which you learn to make to cast this spell which the contents are consumed",
- duration : "Instantaneous",
- description : "turns a CR=<30 creature into an undead servant; see book for details; lasts for 24 h",
- descriptionFull : "This epic spell creates an undead servant. Choose a corpse of a previously living creature with a CR no greater than 30 or a level no greater than 35 within range. Your spell imbues the target with a foul mimicry of life, raising it as an undead creature. The target becomes a creature that has the same statistics that it did in life but is considered undead and its intelligence drops to 3." + "\n " + "On each of your turns, you can use a bonus action to mentally command any creature you made with this spell if the creature is within 120 feet of you (you can issue commands to each of the creatures you control at once). You decide what action the creature will take and where it will move during its next turn, or you can issue a general command, such as to guard a particular chamber or corridor. If you issue no commands, the creature only defends itself against hostile creatures. Once given an order, the creature continues to follow it until its task is complete." + "\n " + "The creature is under your control for 24 hours, after which it stops obeying any command you've given it. To maintain control of the creature for another 24 hours, you must cast this spell on the creature again before the current 24-hour period ends."
- };
- SpellsList["summon epic fiend"] = {// Prerequisite: level 37
- name : "Summon Epic Fiend",
- source : ["ELC", 70],
- classes : [],
- level : 4,
- school : "Conj",
- time : "1 a",
- range : "60 ft",
- components : "V,S",
- duration : "Conc, 1 h",
- description : "Summon 21 CR of fiend; obey my verbal commands will a successful cha check vs wis",
- descriptionFull : "You summon a fiend in an unoccupied space that you can see within range. You summon one fiend of CR 21 or lower." + "\n " + "The summoned creature is neutral to you and your companions. However the creature is hostile toward your enemies and other not of your group. Roll initiatve for the summoned creature. You can issue a verbal command but it is a contested charisma ability check versus that creatures wisdom saving throw. On a success they listen to your command and on a failure they ignore it. If the fiend isn't listening to your command it does whatever it feels like doing." + "\n " + "The DM has the creature's statistics."
- };
- SpellsList["soul growth"] = {// Prerequisite: level 21
- name : "Soul Growth",
- source : ["ELC", 70],
- classes : ["epic"],
- level : 1,
- school : "Div",
- time : "1 a",
- range : "Self",
- components : "V,S",
- duration : "Permanent",
- description : "I can give myself proficiency on ability checks or other effects; see book for details",
- descriptionFull : "When you cast this epic spell you may permanently give yourself proficiency in any ability check. This bonus does not stack with expertise or if you already have proficiency in that ability check. This effect cannot be undone by anything short of a greater wish spell." + "\n " + "Alternatively you instead of a permanent increase of your hit points by 20." + "\n " + "Alternatively you can decide to learn 2 languages." + "\n " + "When you cast this epic spell there is a 10% chance that you would be unable to cast this spell again and you knowledge of an epic spell slot would be wasted. However if this happens all of the permanent effects still remain."
- };
- SpellsList["teleport without error"] = {// prerequisite: level 23
- name : "Teleport without Error",
- nameShort : "Teleport w/o Error",
- source : ["ELC", 70],
- classes : ["eknight", "ewarlock", "ewizard"],
- level : 1,
- school : "Conj",
- time : "1 a",
- range : "30 ft",
- components : "",
- duration : "Instantaneous",
- description : "I + 8 willing crea, or an object teleport to a place I know, have seen, or can describe; see book",
- descriptionFull : "This is very similar to the spell teleport. The difference though is that it is always on target. Only if you have a false destination it will take you to a similar area. There is no chance of a mishap. You do roll a d100 but only do something on a 100. If you roll a 100 you can cast this again without need to rest to get it back. Also it also affects creatures in range of 30 feet. If you target an object though it must fit in a 30 foot cube.",
- };
- SpellsList["temporal skip"] = {// prerequisite: level 39; wizard, sorcerer, or warlock
- name : "Temporal Skip",
- source : ["ELC", 70],
- classes : [],
- level : 4,
- school : "Trans",
- time : "1 a",
- range : "30 ft",
- components : "V,S",
- duration : "Instantaneous",
- save : "Cha",
- description : "All selected crea save or sent forward in time up to 1000 yrs",
- descriptionFull : "When you cast this epic spell choose any number of creatures and objects within range. A creature or object can make a charisma saving throw against your spell save DC to resist this. If you didn't select yourself then creatures that resist make the saving throw with a +5 modifier. All creatures and objects that you selected that failed their saving throw or didn't resist are moved forward in time. The creatures or objects can be moved up to 1000 years ahead in time. During this time the creature or object is removed from the current time line and up until they reappear again. Because of this they cannot be harmed or affected by anything during that duration." + "\n " + "When the time is up the creature or object randomly appears in a space that is hospitable within 10 miles of where it was.",
- };
- SpellsList["temporal travel"] = {// prerequisite: level 39; wizard, sorcerer, or cleric.
- name : "Temporal Travel",
- source : ["ELC", 70],
- classes : [],
- level : 4,
- school : "Trans",
- time : "1 h",
- range : "60 ft",
- components : "V,S,M\u2020",
- compMaterial : "a 10,000 gp sapphire which is consumed upon casting the spell",
- duration : "Instantaneous",
- description : "All willing crea can move 100 yr forward or backwards in time (10000gp cons.)",
- descriptionFull : "When you cast this spell you select any number of willing creatures and objects within range including yourself. Upon completion of the spell you are transported to any moment in time you wish from your location that is up to 100 years in the future or past. When this spell is cast you are temporarily removed from the timeline and so you and whatever you select cannot be harmed or interacted with in any way. This spell can be stopped by overdeities and other beings of such power."
- };
- SpellsList["torbellino's lazy river escape"] = {// prerequisite: level 21 sorcerer
- name : "Torbellino's Lazy River Escape",
- nameShort : "Lazy River Escape",
- source : ["ELC", 70],
- classes : ["esorcerer"],
- level : 1,
- school : "Abjur",
- time : "1 a",
- range : "Self",
- components : "V,S",
- duration : "8 h",
- description : "I am immune to all dmg, am incapacitated and move at half speed; see book for details ",
- descriptionFull : "When you cast this epic spell you are incapacitated but you can still move at half speed and can hover up to 5 feet off the ground. As you are incapacitated you cannot do any actions, bonus actions, or reactions. However for the duration you are immune to all forms of damage and nothing can take away this immunity. After the duration of the spell is complete you forget the spell and cannot cast it again but can learn another epic spell in its place as if you just learned an epic spell.",
- };
- SpellsList["universal flight"] = {// prerequisite: level 30
- name : "Universal Flight",
- source : ["ELC", 71],
- classes : ["ewarlock"],
- level : 2,
- school : "Trans",
- time : "1 a",
- range : "30 ft",
- components : "V,S,M",
- compMaterial : "A Wing feather from a bird",
- duration : "24 h",
- description : "I and 5 willing creatures gain fly 1000 ft speed",
- descriptionFull : "You and up to 5 other creatures can be affected by this epic spell if they are willing. The targets gain a flying speed of 1000 feet for the duration. When the spell ends, the target falls if it is still aloft, unless it can stop the fall.",
- };
- var iFileName = "EPICChoices.js";
- RequiredSheetVersion(13);
- //Warlock Invocations-Completed
- AddWarlockInvocation("Improved Spell Selection (prereq: level 23 warlock, Pact of the Tome)", {
- name : "Improved Spell Selection",
- description : "\n " + "I learn 3 spells from any spell list and add them to spells known.",
- source : ["ELC", 39],
- prereqeval : function(v) { return classes.known.warlock.level >= 23 && GetFeatureChoice('class', 'warlock', 'pact boon') == 'pact of the tome'; },
- spellcastingBonus : {
- name : "Improved Spell Selection",
- "class" : "any",
- level : [1, 9],
- times : 3
- }
- });
- AddWarlockInvocation("Dread Return (prereq: level 21 warlock, Pact of the Tome)", {
- name : "Dread Return",
- description : "\n " + "Once per long rest, I can cast Revivify without using material components using a warlock spell slot.",
- source : ["ELC", 39],
- usages : 1,
- recovery : "long rest",
- spellcastingBonus : {
- name : "Dread Return",
- spells : ["revivify"],
- selection : ["rivivify"],
- firstCol : "oncelr"
- },
- prereqeval : function(v) { return classes.known.warlock.level >= 21 && GetFeatureChoice('class', 'warlock', 'pact boon') == 'pact of the tome'; },
- spellChanges : {
- "revivify" : {
- range : "Touch",
- components : "V,S",
- compMaterial : "",
- description : "Restores a creature's body that has died in the last min to life with 1 HP",
- changes : "With the Dread Return invocation I can cast Revivify without a material component."
- }
- }
- });
- AddWarlockInvocation("Eldritch Doppleganger (prereq: level 37 warlock)", {
- name : "Eldritch Doppleganger",
- description : "\n " + "Once per long rest, I can cast Simulacrum without using material components or a spell slot.",
- source : ["ELC", 39],
- usages : 1,
- recovery : "long rest",
- spellcastingBonus : {
- name : "Eldritch Doppleganger",
- spells : ["simulacrum"],
- selection : ["simulacrum"],
- firstCol : "oncelr"
- },
- prereqeval : function(v) { return classes.known.warlock.level >= 37 ; },
- spellChanges : {
- "simulacrum" : {
- range : "Touch",
- components : "V,S",
- compMaterial : "",
- description : "Create snow/ice duplicate of humanoid/beast; follows my verbal commands; see B",
- changes : "With the Eldritch Doppleganger invocation I can cast Simulacrum without a material component."
- }
- }
- });
- AddWarlockInvocation("Spider Limbs (prereq: level 10 warlock)", {
- name : "Spider Limbs",
- description : "\n " + "I gain climbing speed equal to my walking speed; I can move across vertical surfaces and upside down ceilings while leaving my hands free; I can walk this way across anything besides a frictionless surface.",
- source : ["ELC", 40],
- prereqeval : function(v) { return classes.known.warlock.level >= 10 ; },
- speed : {
- climb : { spd : "walk", enc : "walk" },
- },
- });
- AddWarlockInvocation("Greater Familiar (prereq: level 35 warlock, Pact of the Chain)", {
- name : "Greater Familiar",
- description : "\n " + "My familiar can be a creature of CR10 or lower. As long as its intelligence isn't above 16.",
- source : ["ELC", 39],
- prereqeval : function(v) { return classes.known.warlock.level >= 35 && GetFeatureChoice('class', 'warlock', 'pact boon') == 'pact of the chain'; },
- });
- AddWarlockInvocation("Hoping Blast (prereq: level 30 warlock, Eldritch Blast cantrip)", {
- name : "Hoping Blast",
- description : "\n " + "When my Eldritch Blast hits a creature that is large or small, once or more, I can move it 10 ft in the air",
- source : ["ELC", 39],
- prereqeval : function(v) { return classes.known.warlock.level >= 30 && v.hasEldritchBlast; },
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.baseWeaponName == 'eldritch blast') fields.Description += '; Target moved 10 ft in the air';
- },
- "When I hit a creature that is large or smaller with my Eldritch Blast cantrip once or more times in a turn, I can push it 10 ft in the air."
- ]
- }
- });
- AddWarlockInvocation("Wings of Another (prereq: level 30 warlock, The Fiend Patron)", {
- name : "Wings of Another",
- description : "\n " + "I gain magical wings that don't force me to get new armor with a flying speed of 60 ft.",
- source : ["ELC", 39],
- prereqeval : function(v) { return classes.known.warlock.level >= 30 && (/fiend/).test(classes.known.warlock.subclass) ; },
- speed : {
- fly : { spd : "60", enc : "50" },
- },
- });
- AddWarlockInvocation("Charm of the Fey (prereq: level 30 warlock, The Archfey Patron)", {
- name : "Charm of the Fey",
- description : "\n " + "I have advantage in any social roll. I gain proficiencies in the deception, intimidation, and persuation skills",
- source : ["ELC", 39],
- prereqeval : function(v) { return classes.known.warlock.level >= 30 && (/fey/).test(classes.known.warlock.subclass) ; },
- skills : ["Deception", "Intimidation", "Persuasion"]
- });
- AddWarlockInvocation("Will of the Old Ones (prereq: level 30 warlock, The Great Old One Patron)", {
- name : "Will of the Old Ones",
- description : "\n " + "Any attack I do does an additional 1d8 psychic damage",
- source : ["ELC", 39],
- prereqeval : function(v) { return classes.known.warlock.level >= 30 && (/great/).test(classes.known.warlock.subclass) ; },
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.isWeapon || v.isMeleeWeapon || v.isNaturalWeapon || v.isSpell) {
- fields.Description += (fields.Description ? '; +1d8 Psychic damage' : '');
- };
- },
- "Any attack I do does an additional 1d8 psychic damage"
- ]
- }
- });
- AddWarlockInvocation("Everlasting Endurance (prereq: level 30 warlock, The Undying Patron)", {
- name : "Everlasting Endurance",
- description : "\n " + "If I am at 0 hit points, I can spend a spell slot and regain up to half my hit point maximum",
- source : ["ELC", 39],
- prereqeval : function(v) { return classes.known.warlock.level >= 30 && (/undying/).test(classes.known.warlock.subclass) ; },
- });
- AddWarlockInvocation("Chosen by Gods (prereq: level 30 warlock, The Celestial Patron)", {
- name : "Chosen by Gods",
- description : "\n " + "I can add my proficiency bonus to any three saving throws; including those I am already proficient in.",
- source : ["ELC", 39],
- prereqeval : function(v) { return classes.known.warlock.level >= 30 && (/celestial/).test(classes.known.warlock.subclass) ; },
- });
- AddWarlockInvocation("Built to Take a Beating (prereq: level 30 warlock, The Hexblade Patron)", {
- name : "Built to Take a Beating",
- description : "\n " + "I can do hexblade's curse a number of times per day equal to my charisma modifier \u0026 gain 50 hit points permanently",
- source : ["ELC", 39],
- prereqeval : function(v) { return classes.known.warlock.level >= 30 && (/hexblade/).test(classes.known.warlock.subclass) ; },
- calcChanges : {
- hp : function (totalHD) {
- if (classes.known.warlock) {
- return [50, "Built to Take a Beating (50)"];
- }
- }
- },
- });
- AddWarlockInvocation("Eldritch Attribute (prereq: level 21 warlock)", {
- name : "Eldritch Attribute",
- description : "\n " + "I gain a +2 to an ability score, this cannot let me go over the ability score maximum; I can take this invocation as many times as I want",
- source : ["ELC", 39],
- prereqeval : function(v) { return classes.known.warlock.level >= 21 ; },
- });
- AddWarlockInvocation("Eldritch Knowledge (prereq: level 25 warlock)", {
- name : "Eldritch Knowledge",
- description : "\n " + "I can cast Legend Lore at will; It doesn't require material components.",
- source : ["ELC", 39],
- prereqeval : function(v) { return classes.known.warlock.level >= 25 ; },
- spellcastingBonus : {
- name : "Eldritch Knowledge",
- spells : ["legend lore"],
- selection : ["legend lore"],
- firstCol : "atwill"
- },
- spellChanges : {
- "legend lore" : {
- range : "Self",
- components : "V,S",
- compMaterial : "",
- description : "Learn summary of lore of named or described person, place, or object",
- changes : "With the Eldritch Knowledge invocation I can cast Legend Lore without a material component."
- }
- }
- });
- AddWarlockInvocation("It Passes Unnoticed (prereq: level 25 warlock)", {
- name : "It Passes Unnoticed",
- description : "\n " + "I can cast Seeming at will.",
- source : ["ELC", 39],
- prereqeval : function(v) { return classes.known.warlock.level >= 25 ; },
- spellcastingBonus : {
- name : "It Passes Unnoticed",
- spells : ["seeming"],
- selection : ["seeming"],
- firstCol : "atwill"
- }
- });
- AddWarlockInvocation("Eldritch Show (prereq: level 30 warlock)", {
- name : "Eldritch Show",
- description : "\n " + "I can cast Programmed Illusion at will.",
- source : ["ELC", 39],
- prereqeval : function(v) { return classes.known.warlock.level >= 30 ; },
- spellcastingBonus : {
- name : "Eldritch Show",
- spells : ["programmed illusion"],
- selection : ["programmed illusion"],
- firstCol : "atwill"
- }
- });
- AddWarlockInvocation("Eldritch Cyclone (prereq: level 37 warlock)", {
- name : "Eldritch Cyclone",
- description : "\n " + "Once per long rest, I can cast Whirlwind using a warlock spell slot.",
- source : ["ELC", 40],
- usages : 1,
- recovery : "long rest",
- spellcastingBonus : {
- name : "Eldritch Cyclone",
- spells : ["whirlwind"],
- selection : ["whirlwind"],
- firstCol : "oncelr"
- },
- prereqeval : function(v) { return classes.known.warlock.level >= 37 ; },
- });
- AddWarlockInvocation("Gift of Gab", {
- name : "Gift of Gab",
- description : "\n " + "I speak all languages and understand all spoken languages.",
- source : ["ELC", 40],
- languageProfs : ["All Languages"],
- });
- AddWarlockInvocation("Friendster (prereq: level 30 warlock)", {
- name : "Friendster",
- description : "\n " + "Once per long rest, I can cast Create Homunculus without using material components or a spell slot.",
- source : ["ELC", 40],
- usages : 1,
- recovery : "long rest",
- spellcastingBonus : {
- name : "Friendster",
- spells : ["create homunculus"],
- selection : ["create homunculus"],
- firstCol : "oncelr"
- },
- spellChanges : {
- "create homunculus" : {
- range : "Touch",
- components : "V,S",
- compMaterial : "",
- description : "I take 2d4 piercing dmg to create a homunculus as my faithful companion; see book",
- changes : "With the Friendster invocation I can cast Create Homunculus without a material component."
- }
- },
- prereqeval : function(v) { return classes.known.warlock.level >= 30 ; },
- });
- AddWarlockInvocation("It Shreds Like a Fiend", {
- name : "It Shreds Like a Fiend",
- description : "\n " + "I learn one musical instrument and have proficiency and expertise in it; I get a magical version of this instument",
- source : ["ELC", 40],
- toolProfs : ["Musical instrument(expertise)", 1],
- });
- AddWarlockInvocation("Added Spell Slot (prereq: level 30 warlock)", {
- name : "Added Spell Slot",
- description : "\n " + "I gain one additional spell slot for my pact magic.",
- source : ["ELC", 40],
- prereqeval : function(v) { return classes.known.warlock.level >= 30 ; }
- });
- AddWarlockInvocation("Improved Thirsting Blade (prereq: level 30 warlock, Thirsting Blade Invocation)", {
- name : "Improved Thirsting Blade",
- description : "\n " + "When taking the attack action, I can attack three times with my pact weapon",
- source : ["ELC", 39],
- action : ['action', 'Pact Weapon (3 attacks per action)'],
- prereqeval : function(v) { return classes.known.warlock.level >= 30 && GetFeatureChoice('class', 'warlock', 'eldritch invocations', true) == 'thirsting blade (prereq: level 5 warlock, pact of the blade)' ; }
- });
- AddWarlockInvocation("Epic Agonizing Blast (prereq: level 30 warlock, Agonizing Blast Invocation)", {
- name : "Epic Agonizing Blast",
- description : "\n " + "I can add my Charisma modifier to every hit with my Eldritch Blast cantrip again",
- source : ["ELC", 39],
- prereqeval : function(v) { return classes.known.warlock.level >= 30 && GetFeatureChoice('class', 'warlock', 'eldritch invocations', true) == 'agonizing blast (prereq: eldritch blast cantrip)' ; },
- calcChanges : {
- atkCalc : [
- function (fields, v, output) {
- if (v.baseWeaponName == 'eldritch blast') output.extraDmg += What('Cha Mod');
- },
- "I add my Charisma modifier to the damage of every beam of my Eldritch Blast cantrip again."
- ],
- spellAdd : [
- function (spellKey, spellObj, spName) {
- if (spellKey == "eldritch blast") {
- spellObj.description = spellObj.description.replace("1d10+" + What("Cha Mod") + " Force dmg", "1d10+" + What("Cha Mod") * 2 + " Force dmg");
- return true;
- };
- },
- "I add my Charisma modifier to the damage of every beam of my Eldritch Blast cantrip again ."
- ]
- }
- });
- AddWarlockInvocation("Improved Armor of Shadows (prereq: level 21 warlock, Armor of Shadows Invocation)", {
- name : "Improved Armor of Shadows",
- description : "\n " + "Mage Armor gives me an AC of 16 + dex mod.",
- source : ["ELC", 39],
- prereqeval : function(v) { return classes.known.warlock.level >= 21 && GetFeatureChoice('class', 'warlock', 'eldritch invocations', true) == 'armor of shadows' ; },
- spellChanges : {
- "mage armor" : {
- description : "If I'm not wearing armor, I gain AC 16 + Dex modifier for the duration; spell ends if I don armor",
- changes : "With the Improved Armor of Shadows invocation, Mage Armor gives me 16+ dex AC."
- }
- },
- });
- ArmourList["mage armor, improved armor of shadows"] = {
- name : "Mage Armour, Improved Armor of Shadows",
- regExpSearch : /^(?=.*(mage|magic))(?=.*armou?r)(?=.*shadows).*$/i,
- source : ["ELC", 39],
- ac : 16,
- list : "magic"
- };
- AddWarlockInvocation("Improved Eldritch Spear (prereq: level 21 warlock, Eldritch Spear Invocation)", {
- name : "Improved Eldritch Spear",
- description : "\n " + "My Eldritch Blast cantrip has a range of 600 ft",
- source : ["ELC", 39],
- prereqeval : function(v) { return classes.known.warlock.level >= 21 && GetFeatureChoice('class', 'warlock', 'eldritch invocations', true) == 'eldritch spear (prereq: eldritch blast cantrip)' ; },
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.baseWeaponName == 'eldritch blast') fields.Range = 600 * (v.rangeM ? v.rangeM : 1) + ' ft';
- },
- "My Eldritch Blast cantrip has a range of 600 ft."
- ]
- },
- spellChanges : {
- "eldritch blast" : {
- range : "600 ft",
- changes : "My Eldritch Blast cantrip has a range of 600 ft."
- }
- }
- });
- AddWarlockInvocation("Improved Eldritch Smite (prereq: level 25 warlock, Eldritch Smite Invocation)", {
- name : "Improved Eldritch Smite",
- description : "\n " + "Eldritch smite now does an additional 2d8 force damage.",
- source : ["ELC", 40],
- prereqeval : function(v) { return classes.known.warlock.level >= 25 && GetFeatureChoice('class', 'warlock', 'eldritch invocations', true) == 'eldritch smite (prereq: level 5 warlock, pact of the blade)' ; },
- });
- AddWarlockInvocation("Boon of the Moon (prereq: level 30 warlock, Aspect of the Moon Invocation)", {
- name : "Boon of the Moon",
- description : "\n " + "I can do long rests in 1 hour.",
- source : ["ELC", 40],
- prereqeval : function(v) { return classes.known.warlock.level >= 30 && GetFeatureChoice('class', 'warlock', 'eldritch invocations', true) == 'aspect of the moon (prereq: pact of the tome)' ; },
- });
- //Cantrip Invocations - Completed
- AddWarlockInvocation("Expanded Splash (prereq: Acid Splash cantrip)", {
- name : "Expanded Splash",
- description : "\n " + "Acid Splash can now damage all creatures I choose within 5 ft of the target including the target.",
- source : ["ELC", 40],
- prereqeval : function(v) { return (/,acid splash,/i).test(CurrentWeapons.known) || isSpellUsed("acid splash", true); },
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.baseWeaponName == 'acid splash') fields.Description = fields.Description.replace('1 or 2 creatures within 5 ft of each other (PHB 211)', 'any choosen creatures within 5 ft of the target (PHB 211)');
- },
- "I can now damage all creatures I choose within 5 ft of the target including the target."
- ]
- },
- spellChanges : {
- "acid splash" : {
- description : "Any choosen creatures within 5 ft of the target save or 1d6 Acid dmg; +1d6 at CL 5, 11, and 17",
- descriptionCantripDie : "Any choosen creatures within 5 ft of the target save or `CD`d6 Acid dmg",
- changes : "With the Expanded Splash invocation, Acid Splash can now damage all creatures I choose within 5 ft of the target including the target."
- }
- }
- });
- AddWarlockInvocation("Quick Blade Ward (prereq: Blade Ward cantrip)", {
- name : "Quick Blade Ward",
- description : "\n " + "Blade Ward can now be cast with a bonus action.",
- source : ["ELC", 40],
- prereqeval : function(v) { return isSpellUsed("blade ward", true); },
- spellChanges : {
- "blade ward" : {
- time : "1 bns",
- changes : "With the Quick Blade Ward invocation I can cast Blade Ward as a bonus action."
- }
- }
- });
- AddWarlockInvocation("Powerful Booming Blade (prereq: Booming Blade cantrip)", {
- name : "Powerful Booming Blade",
- description : "\n " + "Booming Blade now deals damage in d12s.",
- source : ["ELC", 40],
- prereqeval : function(v) { return (/,booming blade,/i).test(CurrentWeapons.known) || isSpellUsed("booming blade", true); },
- spellChanges : {
- "booming blade" : {
- description : "Melee wea atk with cast; if hit, it 0d12, if it moves next rnd it 1d12 Thunder dmg; +1d12 at CL5, 11, \u0026 17",
- descriptionCantripDie : "Melee wea atk with cast; if hit, it `CD-1`d12 Thunder dmg, and if it moves next rnd it `CD`d12 Thunder dmg",
- changes : "With the Powerful Booming Blade invocation, Booming Blade deals d12s instead of d8s"
- }
- },
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.baseWeaponName == 'booming blade') fields.Damage_Die = 'Bd12/Cd12';
- },
- "My damage die is d12 for the Booming Blade cantrip."
- ],
- }
- });
- AddWarlockInvocation("Horrowing Chill Touch (prereq: Chill Touch cantrip)", {
- name : "Horrowing Chill Touch",
- description : "\n " + "Chill Touch now lowers the hit point maximum by it's damage until the creature finishes a long rest; undead and constructs are immune to this effect.",
- source : ["ELC", 40],
- prereqeval : function(v) { return (/,chill touch,/i).test(CurrentWeapons.known) || isSpellUsed("chill touch", true); },
- spellChanges : {
- "chill touch" : {
- changes : "With the Horrowing Chill Touch invocation, the hit point maximum is lowered by the damage done by the cantrip until they finish a long rest."
- }
- }
- });
- AddWarlockInvocation("Starting Flame (prereq: Control Flames cantrip)", {
- name : "Starting Flame",
- description : "\n " + "Control Flames can now choose a flame that is up to 10 5 ft cubes or start a small flame.",
- source : ["ELC", 40],
- prereqeval : function(v) { return isSpellUsed("control flames", true); },
- spellChanges : {
- "control flames" : {
- description : "Nonmagical flame up to 10 5 cu ft; instant: expand/extinguish, 1h: brighten/dim/color/create shapes",
- changes : "With the Starting Flame invocation, control flames can now choose a flame that is up to 10 5 ft cubes or start a small flame."
- }
- }
- });
- AddWarlockInvocation("Larger Bonfire (prereq: Create Bonfire cantrip)", {
- name : "Larger Bonfire",
- description : "\n " + "Create Bonfire now affects an area up to a 15 foot cube.",
- source : ["ELC", 40],
- prereqeval : function(v) { return (/,create bonfire,/i).test(CurrentWeapons.known) || isSpellUsed("create bonfire", true); },
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.baseWeaponName == 'create bonfire') fields.Description = fields.Description.replace('5-ft cube', '15-ft cube');
- },
- "Create Bonfire now affects an area up to a 15 foot cube."
- ]
- },
- spellChanges : {
- "create bonfire" : {
- description : "15-ft cube all crea at casting or entering save or 1d8 Fire dmg; ignites flammable; +1d8 at CL 5/11/17",
- changes : "With the Larger Bonfire invocation, Create Bonfire now affects an area up to a 15 foot cube."
- }
- }
- });
- AddWarlockInvocation("Independant Dancing Lights (prereq: Dancing Lights cantrip)", {
- name : "Independant Dancing Lights",
- description : "\n " + "Dancing lights no longer requires concentration.",
- source : ["ELC", 40],
- prereqeval : function(v) { return isSpellUsed("dancing lights", true); },
- spellChanges : {
- "dancing lights" : {
- duration : "1 min",
- changes : "With the Independant Dancing Lights invocation, Dancing Lights no longer require concentration."
- }
- }
- });
- AddWarlockInvocation("Empowered Fire Bolt (prereq: Fire Bolt cantrip)", {
- name : "Empowered Fire Bolt",
- description : "\n " + "I double damage die for the Fire Bolt cantrip",
- source : ["ELC", 40],
- prereqeval : function(v) { return (/,fire bolt,/i).test(CurrentWeapons.known) || isSpellUsed("fire bolt", true); },
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.baseWeaponName == 'fire bolt') fields.Damage_Die = 'C(2)d10';
- },
- "Fire Bolt now gets double the damage die."
- ]
- },
- spellChanges : {
- "fire bolt" : {
- description : "Spell attack for 2d10 Fire dmg; unattended flammable objects ignite; +2d10 at CL 5, 11, and 17",
- descriptionCantripDie : "Spell attack for `CD*2`d10 Fire dmg; unattended flammable objects ignite",
- changes : "With the Empowered Fire Bolt invocation, Fire Bolt rolls double the damage die."
- }
- }
- });
- AddWarlockInvocation("Useful Friends (prereq: Friends cantrip)", {
- name : "Useful Friends",
- description : "\n " + "Friends cantrip no longer lets a creature know you cast it on them and doesn't make them hostile to you.",
- source : ["ELC", 41],
- prereqeval : function(v) { return isSpellUsed("friends", true); },
- spellChanges : {
- "friends" : {
- description : "Adv. on Cha checks vs. 1 crea currently not hostile; when spell ends, crea doesn't knows nor becomes hostile",
- changes : "With the Useful Friends invocation, Friends cantrip no longer lets a creature know you cast it on them and doesn't make them hostile to you."
- }
- }
- });
- AddWarlockInvocation("Powerful Frostbite (prereq: Frostbite cantrip)", {
- name : "Powerful Frostbite",
- description : "\n " + "Frostbite now deals damage in d12s.",
- source : ["ELC", 41],
- prereqeval : function(v) { return (/,frostbite,/i).test(CurrentWeapons.known) || isSpellUsed("frostbite", true); },
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.baseWeaponName == 'frostbite') fields.Damage_Die = 'Cd12';
- },
- "My damage die is d12 for the Frostbite cantrip."
- ]
- },
- spellChanges : {
- "frostbite" : {
- description : "1 crea save or 1d12 Cold dmg and dis. on next weapon attack roll; +1d12 at CL 5, 11, and 17",
- descriptionCantripDie : "1 crea save or `CD`d12 Cold dmg and dis. on next weapon attack roll",
- changes : "With the Powerful Frostbite invocation, Frostbite deals d12s instead of d6s"
- }
- }
- });
- AddWarlockInvocation("Powerful Green-Flame Blade (prereq: Green-Flame Blade cantrip)", {
- name : "Powerful Green-Flame Blade",
- description : "\n " + "Green-Flame Blade now deals damage in d12s.",
- source : ["ELC", 41],
- prereqeval : function(v) { return (/,green-flame blade,/i).test(CurrentWeapons.known) || isSpellUsed("green-flame blade", true); },
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.baseWeaponName == 'green-flame blade') fields.Damage_Die = 'Bd12/Bd12';
- },
- "My damage die is d12 for the Green-Flame Blade cantrip."
- ]
- },
- spellChanges : {
- "green-flame blade" : {
- description : "Melee wea atk with cast; atk +0d12 Fire dmg, crea in 5 ft 0d8+spell mod Fire dmg; +1d12 at CL5/11/17",
- descriptionCantripDie : "Melee wea atk with cast; if hit, atk does +`CD-1`d12 Fire dmg, 1 crea in 5 ft `CD-1`d12+spellcasting ability modifier Fire dmg",
- changes : "With the Powerful Green-Flame Blade invocation, Green-Flame Blade deals d12s instead of d8s"
- }
- }
- });
- AddWarlockInvocation("Greater Guidance (prereq: Guidance cantrip)", {
- name : "Greater Guidance",
- description : "\n " + "Guidance now increases an ability check by 2d4.",
- source : ["ELC", 41],
- prereqeval : function(v) { return isSpellUsed("guidance", true); },
- spellChanges : {
- "guidance" : {
- description : "1 willing creature adds 2d4 to ability check of its choice, after rolling, once during the duration",
- changes : "With the Greater Guidance invocation, Guidance now increases an ability check by 2d4."
- }
- }
- });
- AddWarlockInvocation("Strong Gust (prereq: Gust cantrip)", {
- name : "Strong Gust",
- description : "\n " + "Gust can push medium or smaller creatures 15 ft now if they fail a strength saving throw",
- source : ["ELC", 41],
- prereqeval : function(v) { return isSpellUsed("gust", true); },
- spellChanges : {
- "gust" : {
- description : "Med. or smaller crea save or push 15 ft; or push unattended 5 lb obj 10 ft; or harmless sensory effect",
- changes : "With the Strong Gust invocation, Gust pushs 15ft instead of 5ft."
- }
- }
- });
- AddWarlockInvocation("Powerful Infestation (prereq: Infestation cantrip)", {
- name : "Powerful Infestation",
- description : "\n " + "Infestation now deals damage in d12s.",
- source : ["ELC", 41],
- prereqeval : function(v) { return (/,infestation-xgte,/i).test(CurrentWeapons.known) || isSpellUsed("infestation-xgte", true); },
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.baseWeaponName == 'infestation-xgte') fields.Damage_Die = 'Cd12';
- },
- "My damage die is d12 for the Infestation cantrip."
- ]
- },
- spellChanges : {
- "infestation-xgte" : {
- description : "1 crea save or 1d12 Poison dmg and moved 5 ft in random direction; +1d12 at CL 5, 11, and 17",
- descriptionCantripDie : "1 crea save or `CD`d12 Poison dmg and moved 5 ft in random direction",
- changes : "With the Powerful Infestation invocation,Infestation deals d12s instead of d6s"
- }
- }
- });
- AddWarlockInvocation("Ranged Controlled Light (prereq: Light cantrip)", {
- name : "Ranged Controlled Light",
- description : "\n " + "Light now has a range of 60 ft and can now shed bright light upto 40 ft; dim light shines for additional ft equal to bright light",
- source : ["ELC", 41],
- prereqeval : function(v) { return isSpellUsed("light", true); },
- spellChanges : {
- "light" : {
- range : "60 ft",
- description : "1 obj up to 10-ft cube sheds bright light upto 40-ft rad and dim light equal to bright light; cannot have multiple instances",
- changes : "With the Ranged Controlled Light invocation, Light has a range of 60 ft and can change the distance of bright light to up to 40 ft"
- }
- }
- });
- AddWarlockInvocation("Ranged Lightning Lure (prereq: Lightning Lure cantrip)", {
- name : "Ranged Lightning Lure",
- description : "\n " + "Lightning Lure has a range of 45 ft and can pull targets up to 40 ft in a straight line towards me",
- source : ["ELC", 41],
- prereqeval : function(v) { return (/,lightning lure,/i).test(CurrentWeapons.known) || isSpellUsed("lightning lure", true); },
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.baseWeaponName == 'lightning lure') fields.Range = 45 * (v.rangeM ? v.rangeM : 1) + ' ft';
- if (v.baseWeaponName == 'lightning lure') fields.Description = fields.Description.replace('pulled 10 ft closer to me', 'pulled 40 ft closer to me');
- },
- "Lightning Lure has a range of 45 ft."
- ]
- },
- spellChanges : {
- "lightning lure" : {
- range : "45 ft",
- description : "1 crea I see save or pulled 40 ft to me; if it end in 5 ft, 1d8 Lightning dmg; +1d8 at CL 5, 11, and 17",
- descriptionCantripDie : "1 crea I see save or pulled 40 ft to me; if it end in 5 ft, `CD`d8 Lightning dmg",
- changes : "With the Ranged Lightning Lure invocation, Lightning Lure has a range of 45 ft"
- }
- }
- });
- AddWarlockInvocation("Lasting Magic Stone (prereq: Magic Stone cantrip)", {
- name : "Lasting Magic Stone",
- description : "\n " + "Magic Stone has a duration of 24 hrs.",
- source : ["ELC", 41],
- prereqeval : function(v) { return (/,magic stone,/i).test(CurrentWeapons.known) || isSpellUsed("magic stone", true); },
- spellChanges : {
- "magic stone" : {
- duration : "24 h",
- changes : "With the Lasting Magic Stone invocation, Magic Stone has a duration of 24 hrs."
- }
- }
- });
- AddWarlockInvocation("Greater Mending (prereq: Mending cantrip)", {
- name : "Greater Mending",
- description : "\n " + "Mending can now fix a break or tear upto 10 ft in any dimension",
- source : ["ELC", 41],
- prereqeval : function(v) { return isSpellUsed("mending", true); },
- spellChanges : {
- "mending" : {
- description : "Repair a single broken object no larger than 10 cu ft; can't restore magic to broken magic item",
- changes : "With the Greater Mending invocation, Mending can now fix a break or tear upto 10 ft in any dimension"
- }
- }
- });
- AddWarlockInvocation("Potent Poison Spray (prereq: Poison Spray cantrip)", {
- name : "Potent Poison Spray",
- description : "\n " + "Poison Spray still gives creatures half dmg on a successful save",
- source : ["ELC", 41],
- prereqeval : function(v) { return (/,poison spray,/i).test(CurrentWeapons.known) || isSpellUsed("poison spray", true); },
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.baseWeaponName == 'poison spray') fields.Description = fields.Description.replace('success - no damage', 'success - half damage');
- },
- "Poison Spray still gives creatures half dmg on a successful save."
- ]
- },
- spellChanges : {
- "poison spray" : {
- description : "1 creature save or 1d12 Poison dmg; half dmg on successful save; +1d12 at CL 5, 11, and 17",
- descriptionCantripDie : "1 creature save or `CD`d12 Poison dmg; half dmg on successful save",
- changes : "With the Potent Poison Spray invocation, Poison Spray still gives creatures half dmg on a successful save"
- }
- }
- });
- AddWarlockInvocation("Empowered Produce Flame (prereq: Produce Flame cantrip)", {
- name : "Empowered Produce Flame",
- description : "\n " + "I double damage die for the Produce Flame cantrip",
- source : ["ELC", 41],
- prereqeval : function(v) { return (/,produce flame,/i).test(CurrentWeapons.known) || isSpellUsed("produce flame", true); },
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.baseWeaponName == 'produce flame') fields.Damage_Die = 'C(2)d8';
- },
- "Produce Flame now gets double the damage die."
- ]
- },
- spellChanges : {
- "produce flame" : {
- description : "Flame 10 ft bright light; once 30 ft ranged spell attack for 2d8 Fire dmg; +2d8 at CL 5, 11, and 17",
- descriptionCantripDie : "Flame 10 ft bright light; once 30 ft ranged spell attack for `CD*2`d8 Fire dmg",
- changes : "With the Empowered Produce Flame invocation, Produce Flame rolls double the damage die."
- }
- }
- });
- AddWarlockInvocation("Slowing Ray of Frost (prereq: Ray of Frost cantrip)", {
- name : "Slowing Ray of Frost",
- description : "\n " + "Ray of Frost reduces movement speed of a creature by 20",
- source : ["ELC", 41],
- prereqeval : function(v) { return (/,ray of frost,/i).test(CurrentWeapons.known) || isSpellUsed("ray of frost", true); },
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.baseWeaponName == 'ray of frost') fields.Description = fields.Description.replace('Target -10 ft', 'Target -20 ft');
- },
- "Ray of Frost slows a creature 20 ft"
- ]
- },
- spellChanges : {
- "ray of frost" : {
- description : "Spell attack for 1d8 Cold dmg and -20 ft speed until start of my next turn; +1d8 at CL 5, 11, and 17",
- descriptionCantripDie : "Spell attack for `CD`d8 Cold dmg and -20 ft speed until start of my next turn",
- changes : "With the Slowing Ray of Frost invocation, Ray of Frost rolls double the damage die."
- }
- }
- });
- AddWarlockInvocation("Greater Resistance (prereq: Resistance cantrip)", {
- name : "Greater Resistance",
- description : "\n " + "Resistance adds 2d4 to a saving throw",
- source : ["ELC", 42],
- prereqeval : function(v) { return isSpellUsed("resistance", true); },
- spellChanges : {
- "resistance" : {
- description : "1 willing crea can add 2d4 to one saving throw after rolling, once during the duration",
- changes : "With the Greater Resistance invocation, Resistance adds 2d4 to a saving throw instead of 1d4"
- }
- }
- });
- AddWarlockInvocation("Potent Sacred Flame (prereq: Sacred Flame cantrip)", {
- name : "Potent Sacred Flame",
- description : "\n " + "Sacred Flame still gives creatures half dmg on a successful save",
- source : ["ELC", 42],
- prereqeval : function(v) { return (/,sacred flame,/i).test(CurrentWeapons.known) || isSpellUsed("sacred flame", true); },
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.baseWeaponName == 'sacred flame') fields.Description = fields.Description.replace('success - no damage', 'success - half damage');
- },
- "Sacred Flame still gives creatures half dmg on a successful save."
- ]
- },
- spellChanges : {
- "sacred flame" : {
- description : "1 creature save or 1d8 Radiant dmg; no bonus for cover on save; half dmg on successful save; +1d8 at CL 5, 11, and 17",
- descriptionCantripDie : "1 creature save or `CD`d8 Radiant dmg; no bonus for cover on save; half dmg on successful save",
- changes : "With the Potent Sacred Flame invocation, Sacred Flame still gives creatures half dmg on a successful save"
- }
- }
- });
- AddWarlockInvocation("Greater Shillelagh (prereq: Shillelagh cantrip)", {
- name : "Greater Shillelagh",
- description : "\n " + "Shillelagh now has a d12 damage die",
- source : ["ELC", 42],
- prereqeval : function(v) { return (/,shillelagh,/i).test(CurrentWeapons.known) || isSpellUsed("shillelagh", true); },
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.baseWeaponName == 'shillelagh') fields.Damage_Die = '1d12';
- },
- "Shillelagh now has a d12 damage die"
- ]
- },
- spellChanges : {
- "shillelagh" : {
- description : "Club/quarterstaff I hold does 1d12 dmg and uses my spellcasting ability modifier instead of Str",
- changes : "With the Greater Shillelagh invocation, Shillelagh now has a d12 damage die"
- }
- }
- });
- AddWarlockInvocation("Empowered Shocking Grasp (prereq: Shocking Grasp cantrip)", {
- name : "Empowered Shocking Grasp",
- description : "\n " + "I double damage die for the Shocking Grasp cantrip",
- source : ["ELC", 42],
- prereqeval : function(v) { return (/,shocking grasp,/i).test(CurrentWeapons.known) || isSpellUsed("shocking grasp", true); },
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.baseWeaponName == 'shocking grasp') fields.Damage_Die = 'C(2)d8';
- },
- "Shocking Grasp now gets double the damage die."
- ]
- },
- spellChanges : {
- "shocking grasp" : {
- escription : "Spell attack, adv. if metal armor, 2d8 Lightning dmg, no rea 1 turn; +2d8 at CL 5, 11, and 17",
- descriptionCantripDie : "Spell attack, adv. if metal armor, `CD*2`d8 Lightning dmg, no rea 1 turn",
- changes : "With the Empowered Shocking Grasp invocation, Shocking Grasp rolls double the damage die."
- }
- }
- });
- AddWarlockInvocation("Potent Sword Burst (prereq: Sword Burst cantrip)", {
- name : "Potent Sword Burst",
- description : "\n " + "Sword Burst still gives creatures half dmg on a successful save",
- source : ["ELC", 42],
- prereqeval : function(v) { return (/,sword burst,/i).test(CurrentWeapons.known) || isSpellUsed("sword burst", true); },
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.baseWeaponName == 'sword burst') fields.Description = fields.Description.replace('success - no damage', 'success - half damage');
- },
- "Sword Burst still gives creatures half dmg on a successful save."
- ]
- },
- spellChanges : {
- "sword burst" : {
- description : "All crea in range save or 1d6 Force damage; half dmg on successful save; +1d6 at CL 5, 11, and 17",
- descriptionCantripDie : "All crea in range save or `CD`d6 Force damage; half dmg on successful save",
- changes : "With the Potent Sword Burst invocation, Sword Burst still gives creatures half dmg on a successful save"
- }
- }
- });
- AddWarlockInvocation("Ranged Thorn Whip (prereq: Thorn Whip cantrip)", {
- name : "Ranged Thorn Whip",
- description : "\n " + "Thorn Whip has a range of 45 ft and can pull targets up to 40 ft towards me",
- source : ["ELC", 42],
- prereqeval : function(v) { return (/,thorn whip,/i).test(CurrentWeapons.known) || isSpellUsed("thorn whip", true); },
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.baseWeaponName == 'thorn whip') fields.Range = 45 * (v.rangeM ? v.rangeM : 1) + ' ft';
- if (v.baseWeaponName == 'thorn whip') fields.Description = fields.Description.replace('pull target 10 ft closer to me', 'pull target 40 ft closer to me');
- },
- "Thorn Whip has a range of 45 ft."
- ]
- },
- spellChanges : {
- "thorn whip" : {
- range : "45 ft",
- description : "Melee spell attack for 1d6 Piercing dmg and pull crea 40 ft towards me; +1d6 at CL 5, 11, and 17",
- descriptionCantripDie : "Melee spell attack for `CD`d6 Piercing dmg and pull crea 40 ft towards me",
- changes : "With the Ranged Thorn Whip invocation, Thorn Whip has a range of 45 ft"
- }
- }
- });
- AddWarlockInvocation("Potent Thunderclap (prereq: Thunderclap cantrip)", {
- name : "Potent Thunderclap",
- description : "\n " + "Thunderclap still gives creatures half dmg on a successful save",
- source : ["ELC", 42],
- prereqeval : function(v) { return (/,thunderclap,/i).test(CurrentWeapons.known) || isSpellUsed("thunderclap", true); },
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.baseWeaponName == 'thunderclap') fields.Description = fields.Description.replace('success - no damage', 'success - half damage');
- },
- "Thunderclap still gives creatures half dmg on a successful save."
- ]
- },
- spellChanges : {
- "thunderclap" : {
- description : "100-ft rad audible; all crea but me in area save or 1d6 Thunder dmg; half dmg on successful save; +1d6 at CL 5, 11, and 17",
- descriptionCantripDie : "100-ft rad audible; all crea but me in area save or `CD`d6 Thunder dmg; half dmg on successful save",
- changes : "With the Potent Thunderclap invocation, Thunderclap still gives creatures half dmg on a successful save"
- }
- }
- });
- AddWarlockInvocation("Potent Toll the Dead (prereq: Toll the Dead cantrip)", {
- name : "Potent Toll of the Dead",
- description : "\n " + "Toll the Dead still gives creatures half dmg on a successful save",
- source : ["ELC", 42],
- prereqeval : function(v) { return (/,toll the dead,/i).test(CurrentWeapons.known) || isSpellUsed("toll the dead", true); },
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.baseWeaponName == 'toll the dead') fields.Description = fields.Description.replace('success - no damage', 'success - half damage');
- },
- "Toll the Dead still gives creatures half dmg on a successful save."
- ]
- },
- spellChanges : {
- "toll the dead" : {
- description : "1 crea save or 1d12 Necrotic dmg (d8 instead of d12 if at full HP); half dmg on successful save; +1d12/1d8 at CL 5, 11, \u0026 17",
- descriptionCantripDie : "1 crea save or `CD`d12 Necrotic damage (d8 instead of d12 if at full HP); half dmg on successful save",
- changes : "With the Potent Toll the Dead invocation, Toll the Dead still gives creatures half dmg on a successful save"
- }
- }
- });
- AddWarlockInvocation("Useful True Strike (prereq: True Strike cantrip)", {
- name : "Useful True Strike",
- description : "\n " + "True strike is now a bonus action, no longer requires concentration, and no longer needs a specified target; It only works on your next attack, provided it is cast within the duration of the spell.",
- source : ["ELC", 42],
- prereqeval : function(v) { return isSpellUsed("true strike", true); },
- spellChanges : {
- "true strike" : {
- time : "1 bns",
- duration : "1 rnd",
- description : "My next attack gains advantage",
- changes : "With the Useful True Strike invocation, True strike no longer requires concentration and is now a bonus action, it no longer needs a specified target"
- }
- }
- });
- AddWarlockInvocation("Cutting Vicious Mockery (prereq: Vicious Mockery cantrip)", {
- name : "Cutting Vicious Mockery",
- description : "\n " + "Creatures now have disadvantage vs. saving throw for vicious mockery and on a fail, all their attacks for their next turn has disadvantage",
- source : ["ELC", 42],
- prereqeval : function(v) { return (/,vicious mockery,/i).test(CurrentWeapons.known) || isSpellUsed("vicious mockery", true); },
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.baseWeaponName == 'vicious mockery') fields.Description = fields.Description.replace('Wis save, success - no damage, fail - also disadv. on next attack roll in next turn;', 'Wis save w/dis., success - no damage, fail - also dis. on all attack rolls in next turn;');
- },
- "Creatures now have disadvantage vs. saving throw for vicious mockery and on a fail, all their attacks for their next turn has disadvantage"
- ]
- },
- spellChanges : {
- "vicious mockery" : {
- description : "1 creature save with dis. or 1d4 Psychic dmg and dis. on all attack rolls next turn; +1d4 at CL 5, 11, and 17",
- descriptionCantripDie : "1 creature save with dis. or `CD`d4 Psychic dmg and dis. on all attack rolls next turn",
- changes : "With the Cutting Vicious Mockery invocation, Creatures now have disadvantage vs. saving throw for vicious mockery and on a fail, all their attacks for their next turn has disadvantage"
- }
- }
- });
- AddWarlockInvocation("Potent Word of Radiance (prereq: Word of Radiance cantrip)", {
- name : "Potent Word of Radiance",
- description : "\n " + "Word of Radiance still gives creatures half dmg on a successful save",
- source : ["ELC", 42],
- prereqeval : function(v) { return (/,word of radiance,/i).test(CurrentWeapons.known) || isSpellUsed("word of radiance", true); },
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.baseWeaponName == 'word of radiance') fields.Description = fields.Description.replace('success - no damage;', 'success - half damage;');
- },
- "Word of Radiance gives creatures half dmg on a successful save."
- ]
- },
- spellChanges : {
- "word of radiance" : {
- description : "Any crea within range save or 1d6 Radiant damage; half dmg on successful save; +1d6 at CL 5, 11, and 17",
- descriptionCantripDie : "Any crea within range save or `CD`d6 Radiant damage; half dmg on successful save",
- changes : "With the Potent Word of Radiance invocation, Word of Radiance still gives creatures half dmg on a successful save"
- }
- }
- });
- //cantrip invocation upgrade invocations
- AddWarlockInvocation("Virulent Splash (prereq: level 30 warlock, Extended Splash Invocation)", {
- name : "Virulent Splash",
- description : "\n " + "Acid Splash now deals damage in d12s.",
- source : ["ELC", 40],
- prereqeval : function(v) { return classes.known.warlock.level >= 30 && GetFeatureChoice('class', 'warlock', 'eldritch invocations', true) == 'expanded splash (prereq: acid splash cantrip)' ; },
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.baseWeaponName == 'acid splash') fields.Damage_Die = 'Cd12';
- },
- "My damage die is d12 for the Acid Splash cantrip."
- ]
- },
- spellChanges : {
- "acid splash" : {
- description : "Any choosen creatures within 5 ft of the target save or 1d12 Acid dmg; +1d12 at CL 5, 11, and 17",
- descriptionCantripDie : "Any choosen creatures within 5 ft of the target save or `CD`d12 Acid dmg",
- changes : "With the Virulent Splash invocation,Acid Splash deals d12s instead of d6s"
- }
- }
- });
- AddWarlockInvocation("Evasive Blade Ward (prereq: level 30 warlock, Quick Blade Ward Invocation)", {
- name : "Evasive Blade Ward",
- description : "\n " + "Blade Ward now also gives creatures disadvantage to attack me until the start of my next turn",
- source : ["ELC", 40],
- prereqeval : function(v) { return classes.known.warlock.level >= 30 && GetFeatureChoice('class', 'warlock', 'eldritch invocations', true) == 'quick blade ward (prereq: blade ward cantrip)' ; },
- spellChanges : {
- "blade ward" : {
- description : "Until the end of my next turn, Bludgeoning, Piercing, and Slashing dmg resist. vs. weapons; enemies have dis. to attack me.",
- changes : "With the Evasive Blade Ward invocation, Blade Ward now also gives creatures disadvantage to attack me until the start of my next turn."
- }
- }
- });
- AddWarlockInvocation("Rapid Booming Blade Strikes (prereq: level 30 warlock, Powerful Booming Blade Invocation)", {
- name : "Rapid Booming Blade Strikes",
- description : "\n " + "I can do all my extra attacks with Booming Blade, but only the first attack benefits from this cantrip",
- source : ["ELC", 40],
- prereqeval : function(v) { return classes.known.warlock.level >= 30 && GetFeatureChoice('class', 'warlock', 'eldritch invocations', true) == 'powerful booming blade (prereq: booming blade cantrip)' ; },
- });
- AddWarlockInvocation("Powerful Chill Touch (prereq: level 30 warlock, Harrowing Chill Touch Invocation)", {
- name : "Powerful Chill Touch",
- description : "\n " + "I double damage die for the Chill Touch cantrip",
- source : ["ELC", 40],
- prereqeval : function(v) { return classes.known.warlock.level >= 30 && GetFeatureChoice('class', 'warlock', 'eldritch invocations', true) == 'horrowing chill touch (prereq: chill touch cantrip)' ; },
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.baseWeaponName == 'chill touch') fields.Damage_Die = 'C(2)d8';
- },
- "Chill Touch now gets double the damage die."
- ]
- },
- spellChanges : {
- "chill touch" : {
- description : "Spell attack for 2d8 Necrotic dmg; can't regain HP; undead dis. atks vs. me; +2d8 at CL 5, 11, and 17",
- descriptionCantripDie : "Spell attack for `CD*2`d8 Necrotic dmg; can't regain hp; undead dis. atks vs. me",
- changes : "With the Powerful Chill Touch invocation, Chill Touch rolls double the damage die."
- }
- }
- });
- AddWarlockInvocation("Intense Bonfire (prereq: level 30 warlock, Larger Bonfire Invocation)", {
- name : "Intense Bonfire",
- description : "\n " + "I double damage die for the Create Bonfire cantrip",
- source : ["ELC", 40],
- prereqeval : function(v) { return classes.known.warlock.level >= 30 && GetFeatureChoice('class', 'warlock', 'eldritch invocations', true) == 'larger bonfire (prereq: create bonfire cantrip)' ; },
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.baseWeaponName == 'create bonfire') fields.Damage_Die = 'C(2)d8';
- },
- "Create Bonfire now gets double the damage die."
- ]
- },
- spellChanges : {
- "create bonfire" : {
- description : "15-ft cube all crea at casting or entering save or 2d8 Fire dmg; ignites flammable; +2d8 at CL 5/11/17",
- descriptionCantripDie : "15-ft cube all crea at casting or entering save or `CD*2`d8 Fire dmg; ignites flammable",
- changes : "With the Intense Bonfire invocation, Create Bonfire rolls double the damage die."
- }
- }
- });
- AddWarlockInvocation("Greater Empowered Fire Bolt (prereq: level 30 warlock, Empowered Fire Bolt Invocation)", {
- name : "Greater Empowered Fire Bolt",
- description : "\n " + "I double damage dealt when I cast Fire Bolt",
- source : ["ELC", 40],
- prereqeval : function(v) { return classes.known.warlock.level >= 30 && GetFeatureChoice('class', 'warlock', 'eldritch invocations', true) == 'empowered fire bolt (prereq: fire bolt cantrip)' ; },
- });
- AddWarlockInvocation("Potent Frostbite (prereq: level 30 warlock, Powerful Frostbite Invocation)", {
- name : "Potent eldritch blast",
- description : "\n " + "Frostbite still gives creatures still get half dmg on a successful save and I add my warlock level to dmg",
- source : ["ELC", 41],
- prereqeval : function(v) { return classes.known.warlock.level >= 30 && GetFeatureChoice('class', 'warlock', 'eldritch invocations', true) == 'powerful frostbite (prereq: frostbite cantrip)' ; },
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.baseWeaponName == 'frostbite') fields.Description = fields.Description.replace('success - no damage', 'success - half damage');
- },
- "Frostbite still gives creatures half dmg on a successful save."
- ],
- atkCalc : [
- function (fields, v, output) {
- if (v.baseWeaponName == 'frostbite') output.extraDmg += classes.known.warlock.level;
- },
- "I add my warlock level to the damage of my Frostbite cantrip."
- ],
- spellAdd : [
- function (spellKey, spellObj, spName) {
- if (spellKey == "frostbite") {
- spellObj.description = spellObj.description.replace("d12 Poison dmg", "d12+" + classes.known.warlock.level + " Poison dmg");
- return true;
- };
- },
- "I add my warlock level to the damage of my Frostbite cantrip."
- ]
- },
- spellChanges : {
- "frostbite" : {
- description : "1 creature save or 1d12 Poison dmg; half dmg on successful save; +1d12 at CL 5, 11, and 17",
- descriptionCantripDie : "1 creature save or `CD`d12 Poison dmg; half dmg on successful save",
- changes : "With the Potent Frostbite invocation, Frostbite still gives creatures half dmg on a successful save"
- }
- }
- });
- AddWarlockInvocation("Rapid Green-Flame Blade Strikes (prereq: level 30 warlock, Powerful Green-Flame Blade Invocation)", {
- name : "Rapid Green-Flame Blade Strikes",
- description : "\n " + "I can do all my extra attacks with Green-Flame Blade, but only the first attack benefits from this cantrip",
- source : ["ELC", 41],
- prereqeval : function(v) { return classes.known.warlock.level >= 30 && GetFeatureChoice('class', 'warlock', 'eldritch invocations', true) == 'powerful green-flame blade (prereq: green-flame blade cantrip)' ; },
- });
- AddWarlockInvocation("Epic Guidance (prereq: level 30 warlock, Greater Guidance Invocation)", {
- name : "Epic Guidance",
- description : "\n " + "Guidance now increases an ability check by 3d4.",
- source : ["ELC", 41],
- prereqeval : function(v) { return classes.known.warlock.level >= 30 && GetFeatureChoice('class', 'warlock', 'eldritch invocations', true) == 'greater guidance (prereq: guidance cantrip)' ; },
- spellChanges : {
- "guidance" : {
- description : "1 willing creature adds 3d4 to ability check of its choice, after rolling, once during the duration",
- changes : "With the Greater Guidance invocation, Guidance now increases an ability check by 3d4."
- }
- }
- });
- AddWarlockInvocation("Controlled Infestation (prereq: level 30 warlock, Powerful Infestation Invocation)", {
- name : "Controlled Infestation",
- description : "\n " + "Target takes half dmg on a successful save but suffer no other effects and on a failed save I can choose the direction they move because of Infestation",
- source : ["ELC", 41],
- prereqeval : function(v) { return classes.known.warlock.level >= 30 && GetFeatureChoice('class', 'warlock', 'eldritch invocations', true) == 'powerful infestation (prereq: infestation cantrip)' ; },
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.baseWeaponName == 'infestation-xgte') fields.Description = fields.Description.replace('Con save, success - no damage, fail - target also moved 5 ft in random direction (XGtE 158)', 'Con save, success - half damage, fail - target also moved 5 ft in a direction I choose (XGtE 158)');
- },
- "Target takes half dmg on a successful save but suffer no other effects and on a failed save I can choose the direction they move because of Infestation"
- ]
- },
- spellChanges : {
- "infestation-xgte" : {
- description : "1 crea save or 1d12 Poison dmg and moved 5 ft in a direction I choose; half dmg on successful save; +1d12 at CL 5, 11, and 17",
- descriptionCantripDie : "1 crea save or `CD`d12 Poison dmg and moved 5 ft in a direction I choose; half dmg on successful save",
- changes : "With the Controlled Infestation invocation, Target takes half dmg on a successful save but suffer no other effects and on a failed save I can choose the direction they move because of Infestation"
- }
- }
- });
- AddWarlockInvocation("Powerful Magic Stone (prereq: level 30 warlock, Lasting Magic Stone Invocation)", {
- name : "Powerful Magic Stone",
- description : "\n " + "Magic Stone now does 3d6+spellcasting mod bludg. damage",
- source : ["ELC", 41],
- prereqeval : function(v) { return classes.known.warlock.level >= 30 && GetFeatureChoice('class', 'warlock', 'eldritch invocations', true) == 'lasting magic stone (prereq: magic stone cantrip)' ; },
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.baseWeaponName == 'magic stone') fields.Damage_Die = '3d6';
- },
- "Magic Stone now does 3d6+spellcasting mod bludg. damage."
- ]
- },
- spellChanges : {
- "magic stone" : {
- description : "Imbue 3 pebbles for spell attacks, thrown 60 ft or with sling, do 3d6+spellcasting mod Bludg. dmg",
- changes : "With the Powerful Magic Stone invocation, Magic Stone now does 3d6+spellcasting mod bludg. damage"
- }
- }
- });
- AddWarlockInvocation("Powerful Poison Spray (prereq: level 30 warlock, Potent Poison Spray Invocation)", {
- name : "Powerful Poison Spray",
- description : "\n " + "Poison Spray now deals damage in d20s and I add my level to damage",
- source : ["ELC", 41],
- prereqeval : function(v) { return classes.known.warlock.level >= 30 && GetFeatureChoice('class', 'warlock', 'eldritch invocations', true) == 'potent poison spray (prereq: poison spray cantrip)' ; },
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.baseWeaponName == 'poison spray') fields.Damage_Die = 'Cd20';
- },
- "My damage die is d20 for the Poison Spray cantrip."
- ],
- atkCalc : [
- function (fields, v, output) {
- if (v.baseWeaponName == 'poison spray') output.extraDmg += characterLevel;
- },
- "I add my level to the damage of my Frostbite cantrip."
- ],
- spellAdd : [
- function (spellKey, spellObj, spName) {
- if (spellKey == "poison spray") {
- spellObj.description = spellObj.description.replace("d20 Poison dmg", "d20+" + characterLevel + " Poison dmg");
- return true;
- };
- },
- "I add my level to the damage of my Poison Spray cantrip."
- ]
- },
- spellChanges : {
- "poison spray" : {
- description : "1 creature save or 1d20 Poison dmg; half dmg on successful save; +1d20 at CL 5, 11, and 17",
- descriptionCantripDie : "1 creature save or `CD`d20 Poison dmg; half dmg on successful save",
- changes : "With the Powerful Poison Spray invocation, Poison Spray now deals damage in d20s"
- }
- }
- });
- AddWarlockInvocation("Greater Empowered Produce Flame (prereq: level 30 warlock, Empowered Produce Flame Invocation)", {
- name : "Greater Empowered Produce Flame",
- description : "\n " + "I double damage dealt when I cast Produce Flame",
- source : ["ELC", 41],
- prereqeval : function(v) { return classes.known.warlock.level >= 30 && GetFeatureChoice('class', 'warlock', 'eldritch invocations', true) == 'empowered produce flame (prereq: produce flame cantrip)' ; },
- });
- AddWarlockInvocation("Empowered Ray of Frost (prereq: level 30 warlock, Slowing Ray of Frost Invocation)", {
- name : "Empowered Ray of Frost",
- description : "\n " + "I double damage die for the Ray of Frost cantrip",
- source : ["ELC", 41],
- prereqeval : function(v) { return classes.known.warlock.level >= 30 && GetFeatureChoice('class', 'warlock', 'eldritch invocations', true) == 'slowing ray of frost (prereq: ray of frost cantrip)' ; },
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.baseWeaponName == 'ray of frost') fields.Damage_Die = 'C(2)d8';
- },
- "Ray of Frost now gets double the damage die."
- ]
- },
- spellChanges : {
- "ray of frost" : {
- description : "Spell attack for 2d8 Cold dmg and -20 ft speed until start of my next turn; +2d8 at CL 5, 11, and 17",
- descriptionCantripDie : "Spell attack for `CD*2`d8 Cold dmg and -20 ft speed until start of my next turn",
- changes : "With the Empowered Ray of Frost invocation, Ray of Frost slows a creature 20 ft"
- }
- }
- });
- AddWarlockInvocation("Epic Resistance (prereq: level 30 warlock, Greater Resistance Invocation)", {
- name : "Epic Resistance",
- description : "\n " + "Resistance adds 3d4 to a saving throw",
- source : ["ELC", 42],
- prereqeval : function(v) { return classes.known.warlock.level >= 30 && GetFeatureChoice('class', 'warlock', 'eldritch invocations', true) == 'greater resistance (prereq: resistance cantrip)' ; },
- spellChanges : {
- "resistance" : {
- description : "1 willing crea can add 3d4 to one saving throw after rolling, once during the duration",
- changes : "With the Greater Resistance invocation, Resistance adds 3d4 to a saving throw instead of 2d4"
- }
- }
- });
- AddWarlockInvocation("Empowered Sacred Flame (prereq: level 30 warlock, Potent Sacred Flame Invocation)", {
- name : "Empowered Sacred Flame",
- description : "\n " + "I double damage die for the Sacred Flame cantrip",
- source : ["ELC", 42],
- prereqeval : function(v) { return classes.known.warlock.level >= 30 && GetFeatureChoice('class', 'warlock', 'eldritch invocations', true) == 'potent sacred flame (prereq: sacred flame cantrip)' ; },
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.baseWeaponName == 'sacred flame') fields.Damage_Die = 'C(2)d8';
- },
- "Sacred Flame now gets double the damage die."
- ]
- },
- spellChanges : {
- "sacred flame" : {
- description : "1 creature save or 2d8 Radiant dmg; no bonus for cover on save; half dmg on successful save; +2d8 at CL 5, 11, and 17",
- descriptionCantripDie : "1 creature save or `CD*2`d8 Radiant dmg; no bonus for cover on save; half dmg on successful save",
- changes : "With the Potent Sacred Flame invocation, Sacred Flame still gives creatures half dmg on a successful save"
- }
- }
- });
- AddWarlockInvocation("Epic Shillelagh (prereq: level 30 warlock, Greater Shillelagh Invocation)", {
- name : "Epic Shillelagh",
- description : "\n " + "Shillelagh now has a d20 damage die",
- source : ["ELC", 42],
- prereqeval : function(v) { return classes.known.warlock.level >= 30 && GetFeatureChoice('class', 'warlock', 'eldritch invocations', true) == 'greater shillelagh (prereq: shillelagh cantrip)' ; },
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.baseWeaponName == 'shillelagh') fields.Damage_Die = '1d20';
- },
- "Shillelagh now has a d20 damage die"
- ]
- },
- spellChanges : {
- "shillelagh" : {
- description : "Club/quarterstaff I hold does 1d20 dmg and uses my spellcasting ability modifier instead of Str",
- changes : "With the Epic Shillelagh invocation, Shillelagh now has a d20 damage die"
- }
- }
- });
- AddWarlockInvocation("Greater Empowered Shocking Grasp (prereq: level 30 warlock, Empowered Shocking Grasp Invocation)", {
- name : "Greater Empowered Shocking Grasp",
- description : "\n " + "I double damage dealt when I cast Shocking Grasp",
- source : ["ELC", 42],
- prereqeval : function(v) { return classes.known.warlock.level >= 30 && GetFeatureChoice('class', 'warlock', 'eldritch invocations', true) == 'empowered shocking grasp (prereq: shocking grasp cantrip)' ; },
- });
- AddWarlockInvocation("Empowered Sword Burst (prereq: level 30 warlock, Potent Sword Burst Invocation)", {
- name : "Empowered Sword Burst",
- description : "\n " + "I double damage die for the Sword Burst cantrip",
- source : ["ELC", 42],
- prereqeval : function(v) { return classes.known.warlock.level >= 30 && GetFeatureChoice('class', 'warlock', 'eldritch invocations', true) == 'potent sword burst (prereq: sword burst cantrip)' ; },
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.baseWeaponName == 'sword burst') fields.Damage_Die = 'C(2)d6';
- },
- "Sword Burst now gets double the damage die."
- ]
- },
- spellChanges : {
- "sword burst" : {
- description : "All crea in range save or 2d6 Force damage; half dmg on successful save; +2d6 at CL 5, 11, and 17",
- descriptionCantripDie : "All crea in range save or `CD*2`d6 Force damage; half dmg on successful save",
- changes : "With the Empowered Sword Burst invocation, Sword Burst now gets double the damage die."
- }
- }
- });
- AddWarlockInvocation("Empowered Thunderclap (prereq: level 30 warlock, Potent Thunderclap Invocation)", {
- name : "Empowered Thunderclap",
- description : "\n " + "I double damage die for the Thunderclap cantrip",
- source : ["ELC", 42],
- prereqeval : function(v) { return classes.known.warlock.level >= 30 && GetFeatureChoice('class', 'warlock', 'eldritch invocations', true) == 'potent thunderclap (prereq: thunderclap cantrip)' ; },
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.baseWeaponName == 'thunderclap') fields.Damage_Die = 'C(2)d6';
- },
- "Thunderclap now gets double the damage die."
- ]
- },
- spellChanges : {
- "thunderclap" : {
- description : "100-ft rad audible; all crea but me in area save or 2d6 Thunder dmg; half dmg on successful save; +2d6 at CL 5, 11, and 17",
- descriptionCantripDie : "100-ft rad audible; all crea but me in area save or `CD*2`d6 Thunder dmg; half dmg on successful save",
- changes : "With the Empowered Thunderclap invocation, Thunderclap now gets double the damage die."
- }
- }
- });
- AddWarlockInvocation("Empowered Toll the Dead (prereq: level 30 warlock, Potent Toll the Dead Invocation)", {
- name : "Empowered Toll the Dead",
- description : "\n " + "I double damage dealt when I cast Toll the Dead",
- source : ["ELC", 42],
- prereqeval : function(v) { return classes.known.warlock.level >= 30 && GetFeatureChoice('class', 'warlock', 'eldritch invocations', true) == 'potent toll the dead (prereq: toll the dead cantrip)' ; },
- });
- AddWarlockInvocation("Worthy True Strike (prereq: level 30 warlock, Useful True Strike Invocation)", {
- name : "Worthy True Strike",
- description : "\n " + "True Strike now gives advantage to all attacks for the duration of the spell.",
- source : ["ELC", 42],
- prereqeval : function(v) { return classes.known.warlock.level >= 30 && GetFeatureChoice('class', 'warlock', 'eldritch invocations', true) == 'useful true strike (prereq: true strike cantrip)' ; },
- spellChanges : {
- "true strike" : {
- description : "All my attacks gain advantage until the end of my next turn",
- changes : "With the Worthy True Strike Invocation, True strike now gives advantage to all attacks for the duration of the spell."
- }
- }
- });
- AddWarlockInvocation("Empowered Word of Radiance (prereq: level 30 warlock, Potent Word of Radiance Invocation)", {
- name : "Empowered Word of Radiance",
- description : "\n " + "I double damage die for the Word of Radiance cantrip",
- source : ["ELC", 42],
- prereqeval : function(v) { return classes.known.warlock.level >= 30 && GetFeatureChoice('class', 'warlock', 'eldritch invocations', true) == 'potent word of radiance (prereq: word of radiance cantrip)' ; },
- calcChanges : {
- atkAdd : [
- function (fields, v) {
- if (v.baseWeaponName == 'word of radiance') fields.Damage_Die = 'C(2)d6';
- },
- "Word of Radiance now gets double the damage die."
- ]
- },
- spellChanges : {
- "word of radiance" : {
- description : "Any crea within range save or 2d6 Radiant damage; half dmg on successful save; +2d6 at CL 5, 11, and 17",
- descriptionCantripDie : "Any crea within range save or `CD*2`d6 Radiant damage; half dmg on successful save",
- changes : "With the Empowered Word of Radiance invocation, Word of Radiance now gets double the damage die."
- }
- }
- });
- //Sorcerer Meta-magic
- AddFeatureChoice(ClassList.sorcerer.features["metamagic"], true, "Far Distant Spell (prereq: level 23 sorcerer)", {
- name : "Far Distant Spell",
- source : ["ELC", 34],
- prereqeval : function(v) { return classes.known.sorcerer.level >= 23 ; },
- description : " [2 sorcery point]" + desc([
- "I can extend the range of a spell to one mile",
- "I can apply distant spell to this to further double the range; doing so only counts as using one metamagic"
- ])
- });
- AddFeatureChoice(ClassList.sorcerer.features["metamagic"], true, "Sure Spell (prereq: level 23 sorcerer)", {
- name : "Sure Spell",
- source : ["ELC", 34],
- prereqeval : function(v) { return classes.known.sorcerer.level >= 23 ; },
- description : " [3 sorcery point]" + desc([
- "My spell can't be countered (can't apply to epic spells).",
- "My spell works even in antimagic fields \u0026 if I can't meet the requirements for verbal or somatic components."
- ])
- });
- AddFeatureChoice(ClassList.sorcerer.features["metamagic"], true, "Bouncing Spell (prereq: level 23 sorcerer)", {
- name : "Bouncing Spell",
- source : ["ELC", 34],
- prereqeval : function(v) { return classes.known.sorcerer.level >= 23 ; },
- description : " [2 sorcery point]" + desc([
- "When I cast a spell that is save or fail \u0026 the spell fails, the spell targets another creature within 30ft of it's previous target"
- ])
- });
- AddFeatureChoice(ClassList.sorcerer.features["metamagic"], true, "Contingency Spell (prereq: level 23 sorcerer)", {
- name : "Contingency Spell",
- source : ["ELC", 34],
- prereqeval : function(v) { return classes.known.sorcerer.level >= 23 ; },
- description : " [5 sorcery point]" + desc([
- "I can set a condition to activate a spell that I can delay for up to a day; If the condition isn't met, I can set the spell to activate or dissipate when time runs out.",
- "This spell can have persistant or extend spell also cast on it to extend the duration of the delay"
- ])
- });
- AddFeatureChoice(ClassList.sorcerer.features["metamagic"], true, "Attack Spell (prereq: level 23 sorcerer)", {
- name : "Attack Spell",
- source : ["ELC", 34],
- prereqeval : function(v) { return classes.known.sorcerer.level >= 23 ; },
- description : " [1 sorcery point]" + desc([
- "I can change a saving throw spell into a spell attack"
- ])
- });
- AddFeatureChoice(ClassList.sorcerer.features["metamagic"], true, "Tricky Spell (prereq: level 23 sorcerer)", {
- name : "Tricky Spell",
- source : ["ELC", 34],
- prereqeval : function(v) { return classes.known.sorcerer.level >= 23 ; },
- description : " [8 sorcery point]" + desc([
- "I can change the saving type and saves thereafter for a spell"
- ])
- });
- AddFeatureChoice(ClassList.sorcerer.features["metamagic"], true, "Maximize Spell (prereq: level 23 sorcerer)", {
- name : "Maximize Spell",
- source : ["ELC", 34],
- prereqeval : function(v) { return classes.known.sorcerer.level >= 23 ; },
- description : " [5 sorcery point]" + desc([
- "I automatically roll the maximum number on any dice rolls for the spell (excluding spell attack roll)"
- ])
- });
- AddFeatureChoice(ClassList.sorcerer.features["metamagic"], true, "Disempower Spell (prereq: level 23 sorcerer)", {
- name : "Disempower Spell",
- source : ["ELC", 34],
- prereqeval : function(v) { return classes.known.sorcerer.level >= 23 ; },
- description : " [2 sorcery point]" + desc([
- "As a reaction to an enemy spell, I can reroll a number of dice equal to my charisma modifier (minimum of one)"
- ])
- });
- AddFeatureChoice(ClassList.sorcerer.features["metamagic"], true, "Blind Spell (prereq: level 23 sorcerer)", {
- name : "Blind Spell",
- source : ["ELC", 34],
- prereqeval : function(v) { return classes.known.sorcerer.level >= 23 ; },
- description : " [0 sorcery point]" + desc([
- "I no longer have to see the target to cast a spell on it; if it was required"
- ])
- });
- AddFeatureChoice(ClassList.sorcerer.features["metamagic"], true, "Self Spell (prereq: level 23 sorcerer)", {
- name : "Self Spell",
- source : ["ELC", 34],
- prereqeval : function(v) { return classes.known.sorcerer.level >= 23 ; },
- description : " [1 sorcery point]" + desc([
- "Spell with an area of effect can have a range of self \u0026 no longer effect me",
- "I can also choose a spell that normally effects other creatures to effect me instead"
- ])
- });
- AddFeatureChoice(ClassList.sorcerer.features["metamagic"], true, "Persistent Spell (prereq: level 23 sorcerer, Extended Spell)", {
- name : "Persistent Spell",
- source : ["ELC", 34],
- prereqeval : function(v) { return classes.known.sorcerer.level >= 23 && GetFeatureChoice("classes", "sorcerer", "metamagic", true) == "extended spell" ; },
- description : " [2 sorcery point]" + desc([
- "When I cast a spell that doesn't have a duration of instantaneous, I can extend the duration to 24 hrs.",
- "If the duration is normally longer then 24 hrs, the duration becomes 1 year."
- ])
- });
- AddFeatureChoice(ClassList.sorcerer.features["metamagic"], true, "Improved Heightened Spell (prereq: level 23 sorcerer, Heightened Spell)", {
- name : "Improved Heightened Spell",
- source : ["ELC", 34],
- prereqeval : function(v) { return classes.known.sorcerer.level >= 23 && GetFeatureChoice("classes", "sorcerer", "metamagic", true) == "heightened spell" ; },
- description : " [8 sorcery point]" + desc([
- "I give a one target a -10 to the first saving throw against the spell."
- ])
- });
- AddFeatureChoice(ClassList.sorcerer.features["metamagic"], true, "Improved Quickened Spell (prereq: level 23 sorcerer, Quickened Spell)", {
- name : "Improved Quickened Spell",
- source : ["ELC", 34],
- prereqeval : function(v) { return classes.known.sorcerer.level >= 23 && GetFeatureChoice("classes", "sorcerer", "metamagic", true) == "quickened spell" ; },
- description : " [0 sorcery point]" + desc([
- "I can cast another spell even if it isn't a cantrip; this is limited by my action and bonus actions."
- ])
- });
- AddFeatureChoice(ClassList.sorcerer.features["metamagic"], true, "Improved Careful Spell (prereq: level 23 sorcerer, Careful Spell)", {
- name : "Improved Careful Spell",
- source : ["ELC", 34],
- prereqeval : function(v) { return classes.known.sorcerer.level >= 23 && GetFeatureChoice("classes", "sorcerer", "metamagic", true) == "careful spell" ; },
- description : " [0 sorcery point]" + desc([
- "Creatures I choose with careful spell aren't affected by the spell I cast."
- ])
- });
- AddFeatureChoice(ClassList.sorcerer.features["metamagic"], true, "Thrice Spell (prereq: level 23 sorcerer, Twinned Spell)", {
- name : "Thrice Spell",
- source : ["ELC", 34],
- prereqeval : function(v) { return classes.known.sorcerer.level >= 23 && GetFeatureChoice("classes", "sorcerer", "metamagic", true) == "twinned spell" ; },
- description : " [1 sorcery point per spell level, minimum 1, 20 for epic spell]" + desc([
- "If spell/cantrip has a target of one and not self, I can aim it at two more targets within range"
- ])
- });
- AddFeatureChoice(ClassList.sorcerer.features["metamagic"], true, "Hidden Spell (prereq: level 23 sorcerer, Subtle Spell)", {
- name : "Hidden Spell",
- source : ["ELC", 34],
- prereqeval : function(v) { return classes.known.sorcerer.level >= 23 && GetFeatureChoice("classes", "sorcerer", "metamagic", true) == "subtle spell" ; },
- description : " [1 sorcery point]" + desc([
- "I can cast the spell without the need to use somatic or verbal components; the targets of the spell make a wisdom saving throw, on a failure they don't realize they are under the effects of the spell.",
- "I can change the percieved school of a spell vs. detect magic"
- ])
- });
- /* To Do List:
- 1: racial paragon(as feat choices)? - not possible, make them part of the race? Individual Feat per race? or features for races
- No Problem
- 3: fix thieves tools double expertise, if possible, change prof check to expertise check
- (how do I add(stack) prof mod to thieves tools? for the double expertise rouge class feature? as well as make the prereqeval expertise instead of proficiency)
- 4: druid- how do I add health, an extra attack, and damage to wild shapes?
- (Can I add more drop-down boxes? for epic steed, improved pact of the chain or higher CR for wild shape?)
- (Can I remove the limit to only beast type's for druids for the Improved Circle Forms moon druids get at level 22 were they can wild shape to any type except undead or construct?)
- 5: automate saving throws half-prof and stat bumps to 30 at total level 21(is this possible?)
- 6: barbarian hitdie feature
- 7: GetFeatureChoice('subclass', 'college of swords-xgte', 'subclassfeature3.1') == 'dueling' find how to get it for extrachoice and subclasses, for invocations
- 8: See about adding cantips or spells as prequiquisites (is it the same as v.hasEldritchBlast ?)
- 10: Subclasses- Last thing to do, honestly the subclasses are not that important at the moment, especially since most of the abilities are just descriptions
- 11: feats as prequiquisites
- 12: add spell slot automatically
- 13: artificer
- */
- /*
- I'm stuck on some prerequisites and conditions for feats, invocations, and calcChanges
- prereqeval : function(v) { return GetFeatureChoice('class', 'warlock', 'eldritch invocations') == 'armor of shadows'; }, This is one I made up to test, how can I get an extrachoice to work with GetFeatureChoice, this would be helpful for epic metamagics and epic invocations Edit: GetFeatureChoice("classes", "fighter", "fighting style", false) == "superior technique" on https://github.com/safety-orange/Imports-for-MPMB-s-Character-Sheet/blob/c96c600a826b5a7a746dadf84a09285625e0ba68/WotC%20material/v13/pub_20140818_PHB.js has true/false on it, will tinker with this tomorrow to see if this takes care of it.
- how do I do v.hasEldritchBlast for other cantrips? Is something like this v.hasAcidSplash okay? It's not BTW, spellKey == "acid splash" what about this, can I just stick a v. in front and call it a day? Edit: (/,eldritch blast,/i).test(CurrentWeapons.known) || isSpellUsed("eldritch blast", true) is what I found so (/,acid splash,/i).test(CurrentWeapons.known) || isSpellUsed("acid splash", true) might be it (source: https://github.com/morepurplemorebetter/MPMBs-Character-Record-Sheet/blob/21bb3113554433e9593645296a3051016e9aeaae/_functions/Functions3.js )
- GetFeatureChoice('subclass', 'college of swords-xgte', 'subclassfeature3.1') == 'dueling' How do I use GetFeatureChoice to check for subclasses, both for champion fighter and sword bard
- prereqeval : function(v) { return v.skillProfs.indexOf("Acrobatics") !== -1; }, is for prof, how can I check for expertise? Same for thieves tools, as well as adding mod on thieves tools, might be if ((/thieve.?s.*tools/i).test(What('Too Exp'))) output.??? += What('Dex Mod');? If it is what do I out after the output. part
- For calcChanges I tried if (theWea.ability === 1) to check the ability used for the "Improved Great Weapon Fighting Style" that states I can double the mod of a weapon attack, this however didn't work for for hexblade weapons https://pastebin.com/eFi6b86x where it should have checks cha and added cha mod if the weapon used cha, it just kept going back to adding str mod
- How can I made having a feat a prerequisite for another feat? Edit: I couldn't find an example of that (CurrentFeats.known.indexOf("martial adept") != -1) might be it (source: https://github.com/safety-orange/Imports-for-MPMB-s-Character-Sheet/blob/c96c600a826b5a7a746dadf84a09285625e0ba68/WotC%20material/v13/pub_20140818_PHB.js )
- I tried to do these myself with no results, please help if you can, thank you.
- Answers
- To look for the selected extrachoices with GetFeatureChoice(), the fourth variable you pass to it should be true.
- v.hasEldritchBlast is unique. I added it for Eldritch Blast because it comes up so often. For other spells, you will have to do it the long way around. You can use the code that sets the v.hasEldritchBlast variable as an example, see it on my GitHub here: (/,eldritch blast,/i).test(CurrentWeapons.known) || isSpellUsed("eldritch blast", true)
- GetFeatureChoice() doesn't have a different system for subclasses, everything is stored under the main class, just the object name of the feature changes, e.g. GetFeatureChoice('class', 'bard', 'subclassfeature3.1') == 'dueling'
- You can use the function hasSkillProf("Acrobatics") to test if proficiency and/or expertise is currently selected, see it here on my GitHub for how it is used and what it returns.
- You can't add a mod to a specific set of tools, only to the tool field and it will be added regardless of what tool is written there. If you want it to be dependent on thieves' tools being selected, you will have to use an eval : function() {}
- Note that if you want to check the v.theWea variable, you should add the 'v.', like so: if (v.theWea.ability === 1). However, this is not the right approach, as this is the ability that the weapon uses normally, not the ability currently selected. You also don't have to use an if statement, you can just get the ability score modifier from the output.mod variable. So all you have to do is if (v.isMeleeWeapon && (/\b(versatile|(2|two).?hand(ed)?s?)\b/i).test(v.theWea.description)) { output.extraDmg += output.mod; }
- CurrentFeats.known.indexOf(_feat-object-name_) != -1 is indeed how you test if a feat is selected or not.
- */
Comments
-
- I get an error" THe script 2024/09./01 - Epiclists.js is faulty. "TypeError: ClassSubList['bard-college of swords-xgte']is undefined"
- Script removed from pdf.
Add Comment
Please, Sign In to add comment